diff --git a/deps/chakrashim/core/Build/Chakra.Build.props b/deps/chakrashim/core/Build/Chakra.Build.props index 8c3424e8ae9..a046be9f23b 100644 --- a/deps/chakrashim/core/Build/Chakra.Build.props +++ b/deps/chakrashim/core/Build/Chakra.Build.props @@ -30,6 +30,14 @@ %(PreprocessorDefinitions); DISABLE_JIT=1 + + %(PreprocessorDefinitions); + BUILD_WITHOUT_SCRIPT_DEBUG=1 + + + %(PreprocessorDefinitions); + CHAKRACORE_LITE + %(PreprocessorDefinitions); INTL_ICU=1 @@ -39,11 +47,12 @@ GLOBAL_ENABLE_WRITE_BARRIER=1 %(PreprocessorDefinitions);NTDDI_VERSION=$(NTDDIVersion) - + %(DisableSpecificWarnings); 4458; 4312; + 4800; MultiThreadedDebugDLL diff --git a/deps/chakrashim/core/Build/Chakra.Core.sln b/deps/chakrashim/core/Build/Chakra.Core.sln index 96acd4a049f..90d117baae8 100644 --- a/deps/chakrashim/core/Build/Chakra.Core.sln +++ b/deps/chakrashim/core/Build/Chakra.Core.sln @@ -2,7 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26228.4 -MinimumVisualStudioVersion = 10.0.40219.1 +MinimumVisualStudioVersion = 14.0.00000.0 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraCore", "..\bin\ChakraCore\ChakraCore.vcxproj", "{EA882C8D-81FC-42FE-ABD5-2666DB933FDB}" ProjectSection(ProjectDependencies) = postProject {1876E800-AD77-48C4-A2F7-E5265F24AC38} = {1876E800-AD77-48C4-A2F7-E5265F24AC38} @@ -11,6 +11,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraCore", "..\bin\Chakra {2F6A1847-BFAF-4B8A-9463-AC39FB46B96A} = {2F6A1847-BFAF-4B8A-9463-AC39FB46B96A} {6979EC58-7A28-465C-A694-F3323A1F5401} = {6979EC58-7A28-465C-A694-F3323A1F5401} {F6FAD160-5A4B-476A-93AC-33E0B3A18C0C} = {F6FAD160-5A4B-476A-93AC-33E0B3A18C0C} + {F48B3491-81DF-4F49-B35F-3308CBE6A379} = {F48B3491-81DF-4F49-B35F-3308CBE6A379} {18CF279F-188D-4655-B03D-74F65388E7D1} = {18CF279F-188D-4655-B03D-74F65388E7D1} {ABC904AD-9415-46F8-AA23-E33193F81F7C} = {ABC904AD-9415-46F8-AA23-E33193F81F7C} {8C61E4E7-F0D6-420D-A352-3E6E50D406DD} = {8C61E4E7-F0D6-420D-A352-3E6E50D406DD} @@ -755,4 +756,7 @@ Global {02D4FD92-AD34-40CA-85DF-4D6C7E3A1F22} = {546172B2-F084-4363-BE35-06010663D319} {F48B3491-81DF-4F49-B35F-3308CBE6A379} = {D8216B93-BD6E-4293-8D98-79CEF7CF66BC} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1F6CA1BC-6C01-4C82-8505-6A7690EBD556} + EndGlobalSection EndGlobal diff --git a/deps/chakrashim/core/Build/Common.Build.Default.props b/deps/chakrashim/core/Build/Common.Build.Default.props index 4f192e30777..da159f3f525 100644 --- a/deps/chakrashim/core/Build/Common.Build.Default.props +++ b/deps/chakrashim/core/Build/Common.Build.Default.props @@ -28,6 +28,11 @@ + + + false + false + @@ -62,7 +67,9 @@ $(OutBaseDir)\$(SolutionName) $(SolutionDir)VcBuild $(OutBaseDir).$(Clang) - $(OutBaseDir).NoJIT + $(OutBaseDir).Lite + $(OutBaseDir).NoJIT + $(OutBaseDir).NoScriptDebug $(OutBaseDir).SWB $(OutBaseDir) diff --git a/deps/chakrashim/core/Build/Common.Build.ProjectConfiguration.props b/deps/chakrashim/core/Build/Common.Build.ProjectConfiguration.props index 64860f5fadc..27939d2b153 100644 --- a/deps/chakrashim/core/Build/Common.Build.ProjectConfiguration.props +++ b/deps/chakrashim/core/Build/Common.Build.ProjectConfiguration.props @@ -42,6 +42,20 @@ ARM + + + Debug + ARM64 + + + Test + ARM64 + + + Release + ARM64 + + Debug diff --git a/deps/chakrashim/core/Build/Common.Build.props b/deps/chakrashim/core/Build/Common.Build.props index cc965c845bf..7f3334e65ac 100644 --- a/deps/chakrashim/core/Build/Common.Build.props +++ b/deps/chakrashim/core/Build/Common.Build.props @@ -81,7 +81,7 @@ $(IntDir)$(TargetName).pdb $(IntDir) - + %(PreprocessorDefinitions); BYTECODE_TESTING=1 @@ -113,7 +113,7 @@ %(AdditionalOptions) /release %(AdditionalOptions) /ignore:4221 - + %(AdditionalOptions) /DEBUGTYPE:CV,FIXUP diff --git a/deps/chakrashim/core/Build/NuGet/.pack-version b/deps/chakrashim/core/Build/NuGet/.pack-version index de28578affc..f8e233b2733 100644 --- a/deps/chakrashim/core/Build/NuGet/.pack-version +++ b/deps/chakrashim/core/Build/NuGet/.pack-version @@ -1 +1 @@ -1.7.6 +1.9.0 diff --git a/deps/chakrashim/core/Build/scripts/finalize_build.ps1 b/deps/chakrashim/core/Build/scripts/finalize_build.ps1 index 6ca425bd39d..cfa0c7ccbd0 100644 --- a/deps/chakrashim/core/Build/scripts/finalize_build.ps1 +++ b/deps/chakrashim/core/Build/scripts/finalize_build.ps1 @@ -10,7 +10,7 @@ param ( [Parameter(Mandatory=$True)] - [ValidateSet("x86", "x64", "arm")] + [ValidateSet("x86", "x64", "arm", "arm64")] [string]$arch, [Parameter(Mandatory=$True)] diff --git a/deps/chakrashim/core/Build/scripts/init_build.ps1 b/deps/chakrashim/core/Build/scripts/init_build.ps1 index ad2214c5953..c6904c2ee1d 100644 --- a/deps/chakrashim/core/Build/scripts/init_build.ps1 +++ b/deps/chakrashim/core/Build/scripts/init_build.ps1 @@ -12,7 +12,7 @@ # before running the Pre-Build script. param ( - [ValidateSet("x86", "x64", "arm", "")] + [ValidateSet("x86", "x64", "arm", "arm64", "")] [string]$arch = "", [ValidateSet("debug", "release", "test", "codecoverage", "")] [string]$flavor = "", @@ -178,6 +178,7 @@ New-Item -ItemType Directory -Force -Path (Join-Path $SourcesDirectory "test\log New-Item -ItemType Directory -Force -Path (Join-Path $BinariesDirectory "buildlogs") New-Item -ItemType Directory -Force -Path (Join-Path $BinariesDirectory "logs") +New-Item -ItemType Directory -Force -Path (Join-Path $DropPath "bin") $FlavorBuildIncompleteFile = Join-Path $DropPath "${BuildType}.incomplete" if (-not (Test-Path $FlavorBuildIncompleteFile)) { diff --git a/deps/chakrashim/core/Build/scripts/post_build.ps1 b/deps/chakrashim/core/Build/scripts/post_build.ps1 index d04317e3b70..cb82cdbdbb5 100644 --- a/deps/chakrashim/core/Build/scripts/post_build.ps1 +++ b/deps/chakrashim/core/Build/scripts/post_build.ps1 @@ -13,7 +13,7 @@ # Finalize Build Script, which should be invoked at the very end of the build. param ( - [ValidateSet("x86", "x64", "arm", "*")] + [ValidateSet("x86", "x64", "arm", "arm64", "*")] [string]$arch = "*", [ValidateSet("debug", "release", "test", "codecoverage", "*")] @@ -59,7 +59,7 @@ $global:exitcode = 0 if ($arch -eq "*") { - foreach ($arch in ("x86", "x64", "arm")) { + foreach ($arch in ("x86", "x64", "arm", "arm64")) { ExecuteCommand "$PSScriptRoot\post_build.ps1 -arch $arch -flavor $flavor -srcpath ""$srcpath"" -buildRoot ""$buildRoot"" -objpath ""$objpath"" -srcsrvcmdpath ""$srcsrvcmdpath"" -bvtcmdpath ""$bvtcmdpath"" -repo ""$repo""" -logFile ""$logFile"" } diff --git a/deps/chakrashim/core/Build/scripts/pre_build.ps1 b/deps/chakrashim/core/Build/scripts/pre_build.ps1 index 4b3402e5852..4e847732c77 100644 --- a/deps/chakrashim/core/Build/scripts/pre_build.ps1 +++ b/deps/chakrashim/core/Build/scripts/pre_build.ps1 @@ -27,7 +27,7 @@ param ( [Parameter(Mandatory=$True)] - [ValidateSet("x86", "x64", "arm")] + [ValidateSet("x86", "x64", "arm", "arm64")] [string]$arch, [Parameter(Mandatory=$True)] [ValidateSet("debug", "release", "test", "codecoverage")] diff --git a/deps/chakrashim/core/Build/scripts/run_build.ps1 b/deps/chakrashim/core/Build/scripts/run_build.ps1 index d7d8b5e09fd..a0442f275c9 100644 --- a/deps/chakrashim/core/Build/scripts/run_build.ps1 +++ b/deps/chakrashim/core/Build/scripts/run_build.ps1 @@ -6,10 +6,10 @@ # Use this script to run a build for the given BuildType (arch, flavor, subtype) param ( - [ValidateSet("x86", "x64", "arm")] + [ValidateSet("x86", "x64", "arm", "arm64")] [Parameter(Mandatory=$True)] [string]$arch, - # We do not use ValidateSet here because this $flavor param is used to name the BuildConfuration + # We do not use ValidateSet here because this $flavor param is used to name the BuildConfiguration # from the solution file. MsBuild will determine whether it is valid. [Parameter(Mandatory=$True)] [string]$flavor, diff --git a/deps/chakrashim/core/CMakeLists.txt b/deps/chakrashim/core/CMakeLists.txt index 28f45f79667..a400fe5cc32 100644 --- a/deps/chakrashim/core/CMakeLists.txt +++ b/deps/chakrashim/core/CMakeLists.txt @@ -126,17 +126,17 @@ function(clr_unknown_arch) message(FATAL_ERROR "Only AMD64, ARM and I386 are supported") endfunction() -if(INTL_ICU_SH) - unset(INTL_ICU_SH CACHE) # don't cache - add_definitions(-DINTL_ICU=1) - set(ICU_INTL_ENABLED 1) +if(NOINTL_ICU_SH) + unset(NOINTL_ICU_SH CACHE) # don't cache + set(ICU_INTL_DISABLED 1) endif() if(ICU_INCLUDE_PATH) add_definitions(-DHAS_REAL_ICU=1) set(ICU_CC_PATH "${ICU_INCLUDE_PATH}/../lib/") find_library(ICUUC icuuc PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH) - if(ICU_INTL_ENABLED) + if(NOT ICU_INTL_DISABLED) + add_definitions(-DINTL_ICU=1) find_library(ICU18 icui18n PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH) # icu header files are either located under the same folder or i18n is under a relative path # TODO (unlikely): shall we add `--icu-intl` to build.sh ? @@ -150,22 +150,17 @@ if(ICU_INCLUDE_PATH) if (NOT ICUDATA) set(ICUDATA "") endif() - find_library(ICUTOOLS icutools PATHS ${ICU_CC_PATH} NO_DEFAULT_PATH) - if (NOT ICUTOOLS) - set(ICUTOOLS "") - endif() set(ICULIB ${ICUUC} ${ICU18} ${ICUDATA} - ${ICUTOOLS} ) endif() endif() set(CLR_CMAKE_PLATFORM_XPLAT 1) if(CC_TARGETS_AMD64) - add_definitions(-D_M_X64_OR_ARM64) + add_definitions(-DTARGET_64) add_compile_options(-msse4.2) if(NOT CMAKE_BUILD_TYPE STREQUAL Release) @@ -173,7 +168,7 @@ if(CC_TARGETS_AMD64) endif() elseif(CC_TARGETS_X86) add_definitions(-D__i686__) - add_definitions(-D_M_IX86_OR_ARM32) + add_definitions(-DTARGET_32) add_compile_options(-arch i386) add_compile_options(-msse3) @@ -182,7 +177,7 @@ elseif(CC_TARGETS_X86) ) elseif(CC_TARGETS_ARM) add_definitions(-D__arm__) - add_definitions(-D_M_IX86_OR_ARM32) + add_definitions(-DTARGET_32) add_definitions(-D_M_ARM32_OR_ARM64) if(CC_TARGET_OS_OSX) add_compile_options(-arch arm) @@ -203,7 +198,8 @@ if(CC_TARGET_OS_LINUX OR CC_TARGET_OS_ANDROID) if(NOT NO_ICU_PATH_GIVEN) if(NOT CC_EMBED_ICU) set(ICULIB "icuuc") - if(ICU_INTL_ENABLED) + if(NOT ICU_INTL_DISABLED) + add_definitions(-DINTL_ICU=1) set(ICULIB "${ICULIB}" "icui18n") @@ -346,9 +342,18 @@ if(CLR_CMAKE_PLATFORM_XPLAT) add_compile_options( -fasm-blocks -fms-extensions - -fwrapv # Treat signed integer overflow as two's complement + -fwrapv # Treat signed integer overflow as two's complement ) + # Only disable RTTI in release builds so that TrackAlloc works for debug and test builds + # Also disable RTTI when building a shared library + # TODO: why does the shared library break with rtti disabled? + if(CMAKE_BUILD_TYPE STREQUAL Release) + if(STATIC_LIBRARY OR ICU_INTL_DISABLED) + add_compile_options(-fno-rtti) + endif() + endif() + # Clang -fsanitize. if (CLANG_SANITIZE_SH) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${CLANG_SANITIZE_SH}") @@ -486,5 +491,21 @@ add_definitions( -DNO_PAL_MINMAX -DPAL_STDCPP_COMPAT ) + +if (ENABLE_JS_LTTNG_SH) + unset(ENABLE_JS_LTTNG_SH CACHE) + include_directories ( + ${CMAKE_CURRENT_SOURCE_DIR}/out/lttng + ) + add_subdirectory ($ENV{TARGET_PATH}/lttng ${CMAKE_CURRENT_BINARY_DIR}/lttng) + + add_definitions( + -DENABLE_JS_ETW + -DENABLE_JS_LTTNG + ) + set(USE_LTTNG "1") +endif() + add_subdirectory (lib) + add_subdirectory (bin) diff --git a/deps/chakrashim/core/CONTRIBUTING.md b/deps/chakrashim/core/CONTRIBUTING.md index e08dc86f1ca..a12f80b8f7f 100644 --- a/deps/chakrashim/core/CONTRIBUTING.md +++ b/deps/chakrashim/core/CONTRIBUTING.md @@ -58,8 +58,8 @@ Changes that make it into our ChakraCore GitHub master branch have a short journ ## Issue Labels - - [`Accepting PRs`](https://github.com/Microsoft/ChakraCore/labels/Accepting%20PRs): these issues are specifically well suited for outside contributors. - - [`Your first PR`](https://github.com/Microsoft/ChakraCore/labels/Your%20first%20PR): these issues are small and appropriate for people who wish to familiarize themselves with GitHub pull requests and/or ChakraCore's contributor guidelines, build process, and running tests. We're here to help you get started in open source. + - [`help wanted`](https://github.com/Microsoft/ChakraCore/labels/help%20wanted): these issues are specifically well suited for outside contributors. + - [`good first issue`](https://github.com/Microsoft/ChakraCore/labels/good%20first%20issue): these issues are small and appropriate for people who wish to familiarize themselves with GitHub pull requests and/or ChakraCore's contributor guidelines, build process, and running tests. We're here to help you get started in open source. You are welcome to work on issues that are not tagged with these labels. However, issues without these labels are often deeply involved with the requirements of the various components of ChakraCore. Therefore, please be sure to touch base with a maintainer via comments on the issue before attempting to solve it. diff --git a/deps/chakrashim/core/LICENSE.txt b/deps/chakrashim/core/LICENSE.txt index a6d7082e364..d5ced9877c2 100644 --- a/deps/chakrashim/core/LICENSE.txt +++ b/deps/chakrashim/core/LICENSE.txt @@ -1,4 +1,3 @@ -ChakraCore The MIT License (MIT) Copyright (c) Microsoft Corporation diff --git a/deps/chakrashim/core/README.md b/deps/chakrashim/core/README.md index 5fa8ffcbc01..4bd2a370869 100644 --- a/deps/chakrashim/core/README.md +++ b/deps/chakrashim/core/README.md @@ -94,7 +94,7 @@ If you believe you have found a security issue in ChakraCore, please share it wi ## [Building ChakraCore](https://github.com/Microsoft/ChakraCore/wiki/Building-ChakraCore) -You can build ChakraCore on Windows 7 SP1 or above, and Windows Server 2008 R2 or above, with either Visual Studio 2013 or 2015 with C++ support installed. Once you have Visual Studio installed: +You can build ChakraCore on Windows 7 SP1 or above, and Windows Server 2008 R2 or above, with either Visual Studio 2015 or 2017 with C++ support installed. Once you have Visual Studio installed: * Clone ChakraCore through ```git clone https://github.com/Microsoft/ChakraCore.git``` * Open `Build\Chakra.Core.sln` in Visual Studio diff --git a/deps/chakrashim/core/RegenAllByteCode.cmd b/deps/chakrashim/core/RegenAllByteCode.cmd index 1e7854be3db..11257f22361 100644 --- a/deps/chakrashim/core/RegenAllByteCode.cmd +++ b/deps/chakrashim/core/RegenAllByteCode.cmd @@ -38,6 +38,14 @@ if %errorlevel% neq 0 ( ) popd +pushd lib\Runtime\Library\JsBuiltIn +call GenByteCode.cmd +if %errorlevel% neq 0 ( + echo There was an error when regenerating bytecode header. + exit /b 1 +) +popd + :: ch.exe x64_debug (NoJIT) :: ch.exe x86_debug (NoJIT) call jenkins\buildone.cmd x64 debug "/p:BuildJIT=false" @@ -61,6 +69,15 @@ if %errorlevel% neq 0 ( ) popd +:: Generate BuiltIn NoJIT Bytecodes using ch.exe (NoJIT) +pushd lib\Runtime\Library\JsBuiltIn +call GenByteCode.cmd -nojit +if %errorlevel% neq 0 ( + echo There was an error when regenerating bytecode header for NoJIT. + exit /b 1 +) +popd + popd endlocal diff --git a/deps/chakrashim/core/bin/ChakraCore/ChakraCore.def b/deps/chakrashim/core/bin/ChakraCore/ChakraCore.def index 1602aa1de4c..ca2a01dd616 100644 --- a/deps/chakrashim/core/bin/ChakraCore/ChakraCore.def +++ b/deps/chakrashim/core/bin/ChakraCore/ChakraCore.def @@ -55,3 +55,8 @@ JsInitializeJITServer JsCreateSharedArrayBufferWithSharedContent JsGetSharedArrayBufferContent JsReleaseSharedArrayBufferContentHandle + +JsLessThan +JsLessThanOrEqual + +JsCreateEnhancedFunction diff --git a/deps/chakrashim/core/bin/ChakraCore/ChakraCore.vcxproj b/deps/chakrashim/core/bin/ChakraCore/ChakraCore.vcxproj index 0b6b5add204..07504c0d7ec 100644 --- a/deps/chakrashim/core/bin/ChakraCore/ChakraCore.vcxproj +++ b/deps/chakrashim/core/bin/ChakraCore/ChakraCore.vcxproj @@ -155,7 +155,7 @@ {706083f7-6aa4-4558-a153-6352ef9110f5} - + {8C61E4E7-F0D6-420D-A352-3E6E50D406DD} diff --git a/deps/chakrashim/core/bin/GCStress/GCStress.cpp b/deps/chakrashim/core/bin/GCStress/GCStress.cpp index bf6219dbe71..99228c4437b 100644 --- a/deps/chakrashim/core/bin/GCStress/GCStress.cpp +++ b/deps/chakrashim/core/bin/GCStress/GCStress.cpp @@ -214,16 +214,24 @@ void BuildObjectCreationTable() objectCreationTable.AddWeightedEntry(&ScannedObject<1, 50>::New, 10000); objectCreationTable.AddWeightedEntry(&BarrierObject<1, 50>::New, 2000); objectCreationTable.AddWeightedEntry(&TrackedObject<1, 50>::New, 2000); +#ifdef RECYCLER_VISITED_HOST + objectCreationTable.AddWeightedEntry(&RecyclerVisitedObject<1, 50>::New, 2000); +#endif objectCreationTable.AddWeightedEntry(&LeafObject<51, 1000>::New, 10); objectCreationTable.AddWeightedEntry(&ScannedObject<51, 1000>::New, 100); objectCreationTable.AddWeightedEntry(&BarrierObject<51, 1000>::New, 20); objectCreationTable.AddWeightedEntry(&TrackedObject<51, 1000>::New, 20); +#ifdef RECYCLER_VISITED_HOST + objectCreationTable.AddWeightedEntry(&RecyclerVisitedObject<51, 1000>::New, 40); +#endif objectCreationTable.AddWeightedEntry(&LeafObject<1001, 50000>::New, 1); objectCreationTable.AddWeightedEntry(&ScannedObject<1001, 50000>::New, 10); objectCreationTable.AddWeightedEntry(&BarrierObject<1001, 50000>::New, 2); + objectCreationTable.AddWeightedEntry(&FinalizedObject<1001, 50000>::New, 2); // objectCreationTable.AddWeightedEntry(&TrackedObject<1001, 50000>::New, 2); // Large tracked objects are not supported +// objectCreationTable.AddWeightedEntry(&RecyclerVisitedObject<1001, 50000>::New, 2); // Large recycler visited objects are not supported } void BuildOperationTable() diff --git a/deps/chakrashim/core/bin/GCStress/GCStress.vcxproj b/deps/chakrashim/core/bin/GCStress/GCStress.vcxproj index 9bd30b8688d..ab12e487c29 100644 --- a/deps/chakrashim/core/bin/GCStress/GCStress.vcxproj +++ b/deps/chakrashim/core/bin/GCStress/GCStress.vcxproj @@ -33,7 +33,7 @@ $(ChakraCommonLinkDependencies); Advapi32.lib; %(AdditionalDependencies) - $(OutDir);%(AdditionalLibraryDirectories) + $(OutDir);%(AdditionalLibraryDirectories);$(SdkLibPath) Console diff --git a/deps/chakrashim/core/bin/GCStress/RecyclerTestObject.cpp b/deps/chakrashim/core/bin/GCStress/RecyclerTestObject.cpp index fbf9f442bb7..1e7564c6335 100644 --- a/deps/chakrashim/core/bin/GCStress/RecyclerTestObject.cpp +++ b/deps/chakrashim/core/bin/GCStress/RecyclerTestObject.cpp @@ -10,6 +10,8 @@ size_t RecyclerTestObject::walkObjectCount = 0; size_t RecyclerTestObject::walkScannedByteCount = 0; size_t RecyclerTestObject::walkBarrierByteCount = 0; size_t RecyclerTestObject::walkTrackedByteCount = 0; +size_t RecyclerTestObject::walkFinalizedByteCount = 0; +size_t RecyclerTestObject::walkRecyclerVisitedByteCount = 0; size_t RecyclerTestObject::walkLeafByteCount = 0; size_t RecyclerTestObject::currentWalkDepth = 0; size_t RecyclerTestObject::maxWalkDepth = 0; diff --git a/deps/chakrashim/core/bin/GCStress/RecyclerTestObject.h b/deps/chakrashim/core/bin/GCStress/RecyclerTestObject.h index 1f0004ad2c1..496eba58474 100644 --- a/deps/chakrashim/core/bin/GCStress/RecyclerTestObject.h +++ b/deps/chakrashim/core/bin/GCStress/RecyclerTestObject.h @@ -4,7 +4,9 @@ //------------------------------------------------------------------------------------------------------- #include "stdafx.h" -class RecyclerTestObject : public FinalizableObject +#include "Core/RecyclerHeapMarkingContext.h" + +class RecyclerTestObject : public IRecyclerVisitedObject { protected: RecyclerTestObject() @@ -13,10 +15,16 @@ class RecyclerTestObject : public FinalizableObject } public: - // FinalizableObject implementation + // IRecyclerVisitedObject implementation. We don't use FinalizableObject here as + // RecyclerVisitedObjects need to have Trace called on them, which is not allowed for + // FinalizableObject. virtual void Finalize(bool isShutdown) override { VerifyCondition(false); }; virtual void Dispose(bool isShutdown) override { VerifyCondition(false); }; - virtual void Mark(Recycler * recycler) override { VerifyCondition(false); }; + virtual void OnMark() override {} + virtual void Mark(RecyclerHeapHandle recycler) override { Mark(static_cast(recycler)); }; + virtual void Trace(IRecyclerHeapMarkingContext* markContext) override { VerifyCondition(false); }; + + virtual void Mark(Recycler * recycler) { VerifyCondition(false); }; public: static void BeginWalk() @@ -27,13 +35,15 @@ class RecyclerTestObject : public FinalizableObject walkScannedByteCount = 0; walkBarrierByteCount = 0; walkTrackedByteCount = 0; + walkFinalizedByteCount = 0; + walkRecyclerVisitedByteCount = 0; walkLeafByteCount = 0; maxWalkDepth = 0; currentWalkDepth = 0; wprintf(_u("-------------------------------------------\n")); - wprintf(_u("Full heap walk starting\n")); + wprintf(_u("Full heap walk starting. Current generation: %12llu\n"), (unsigned long long) currentGeneration); } static void WalkReference(RecyclerTestObject * object) @@ -66,13 +76,15 @@ class RecyclerTestObject : public FinalizableObject VerifyCondition(currentWalkDepth == 0); wprintf(_u("Full heap walk finished\n")); - wprintf(_u("Object Count: %12llu\n"), (unsigned long long) walkObjectCount); - wprintf(_u("Scanned Bytes: %12llu\n"), (unsigned long long) walkScannedByteCount); - wprintf(_u("Barrier Bytes: %12llu\n"), (unsigned long long) walkBarrierByteCount); - wprintf(_u("Tracked Bytes: %12llu\n"), (unsigned long long) walkTrackedByteCount); - wprintf(_u("Leaf Bytes: %12llu\n"), (unsigned long long) walkLeafByteCount); - wprintf(_u("Total Bytes: %12llu\n"), (unsigned long long) (walkScannedByteCount + walkBarrierByteCount + walkTrackedByteCount + walkLeafByteCount)); - wprintf(_u("Max Depth: %12llu\n"), (unsigned long long) maxWalkDepth); + wprintf(_u("Object Count: %12llu\n"), (unsigned long long) walkObjectCount); + wprintf(_u("Scanned Bytes: %12llu\n"), (unsigned long long) walkScannedByteCount); + wprintf(_u("Barrier Bytes: %12llu\n"), (unsigned long long) walkBarrierByteCount); + wprintf(_u("Tracked Bytes: %12llu\n"), (unsigned long long) walkTrackedByteCount); + wprintf(_u("Finalized Bytes: %12llu\n"), (unsigned long long) walkFinalizedByteCount); + wprintf(_u("RecyclerVisited Bytes: %12llu\n"), (unsigned long long) walkRecyclerVisitedByteCount); + wprintf(_u("Leaf Bytes: %12llu\n"), (unsigned long long) walkLeafByteCount); + wprintf(_u("Total Bytes: %12llu\n"), (unsigned long long) (walkScannedByteCount + walkBarrierByteCount + walkTrackedByteCount + walkFinalizedByteCount + walkLeafByteCount + walkRecyclerVisitedByteCount)); + wprintf(_u("Max Depth: %12llu\n"), (unsigned long long) maxWalkDepth); } // Virtual methods @@ -100,6 +112,8 @@ class RecyclerTestObject : public FinalizableObject static size_t walkLeafByteCount; static size_t walkBarrierByteCount; static size_t walkTrackedByteCount; + static size_t walkFinalizedByteCount; + static size_t walkRecyclerVisitedByteCount; static size_t currentWalkDepth; static size_t maxWalkDepth; @@ -232,8 +246,13 @@ class BarrierObject : public RecyclerTestObject FieldNoBarrier(RecyclerTestObject *) references[0]; // SWB-TODO: is this correct? }; +// TrackedObject must be a FinalizableObject (in order to be 'new'ed with RecyclerNewTrackedLeafPlusZ) +// but it also must be a RecyclerTestObject to participate in GCStress. It must inherit from RecyclerTestObject +// first so that the algined pointer is returned from New. +// Fortunately, the v-tables for RecyclerTestObject and FinalizableObject line up, so the +// IRecyclerVisitedObject/FinalizableObject calls end up in the right place. template -class TrackedObject : public RecyclerTestObject +class TrackedObject : public RecyclerTestObject, public FinalizableObject { private: TrackedObject(unsigned int count) : @@ -295,4 +314,178 @@ class TrackedObject : public RecyclerTestObject FieldNoBarrier(RecyclerTestObject *) references[0]; // SWB-TODO: is this correct? }; +// A type of object that is finalizable, but not traced/tracked so that it can be used to test finalization +// for LargeHeapBlock (which currently supports the FinalizeBit, but not TrackBit) +template +class FinalizedObject : public RecyclerTestObject, public FinalizableObject +{ +private: + FinalizedObject(unsigned int count) : + count(count) + { + for (unsigned int i = 0; i < count; i++) + { + references[i] = nullptr; + } + } + +public: + static RecyclerTestObject * New() + { + unsigned int count = minCount + GetRandomInteger(maxCount - minCount + 1); + + return RecyclerNewFinalizedPlus(recyclerInstance, sizeof(RecyclerTestObject *) * count, FinalizedObject, count); + } + + virtual bool TryGetRandomLocation(Location * location) override + { + // Get a random slot and construct a Location for it + *location = Location::Scanned(&references[GetRandomInteger(count)]); + + return true; + } + + virtual void Mark(Recycler * recycler) override { VerifyCondition(false); }; + + // Finalize implementation. + virtual void Finalize(bool isShutdown) override { } + virtual void Dispose(bool isShutdown) override { } + + +protected: + virtual void DoWalkObject() override + { + walkFinalizedByteCount += sizeof(FinalizedObject) + count * sizeof(RecyclerTestObject *); + + for (unsigned int i = 0; i < count; i++) + { + RecyclerTestObject::WalkReference(references[i]); + } + } + +private: + Field(unsigned int) count; + FieldNoBarrier(RecyclerTestObject *) references[0]; // SWB-TODO: is this correct? +}; + +#ifdef RECYCLER_VISITED_HOST + +template +class RecyclerVisitedObject : public RecyclerTestObject +{ +public: + static RecyclerTestObject * New() + { + // Determine a random amount of RecyclerTestObject* references to influence the size of this object. + const unsigned int count = minCount + GetRandomInteger(maxCount - minCount + 1); + + void* mem = nullptr; + const size_t size = sizeof(RecyclerVisitedObject) + (sizeof(RecyclerTestObject*) * count); + + // Randomly select the type of object to create + AllocationType allocType = static_cast(GetRandomInteger(static_cast(AllocationType::Count))); + switch (allocType) + { + case AllocationType::TraceAndFinalized: + mem = RecyclerAllocVisitedHostTracedAndFinalizedZero(recyclerInstance, size); + break; + case AllocationType::TraceOnly: + mem = RecyclerAllocVisitedHostTracedZero(recyclerInstance, size); + break; + case AllocationType::FinalizeLeaf: + mem = RecyclerAllocVisitedHostFinalizedZero(recyclerInstance, size); + break; + default: + Assert(allocType == AllocationType::Leaf); + mem = RecyclerAllocLeafZero(recyclerInstance, size); + } + + // Construct the v-table, allocType, and count information for the new object. + RecyclerVisitedObject* obj = new (mem) RecyclerVisitedObject(allocType, count); + return obj; + } + + virtual bool TryGetRandomLocation(Location * location) override + { + // Leaf types should not return a location + if (type == AllocationType::Leaf || type == AllocationType::FinalizeLeaf) + { + return false; + } + + // Get a random slot and construct a Location for it + // Make this a Tagged location so that we won't inadvertently keep objects alive + // in the case where this object gets put on the wrong mark stack. + *location = Location::Tagged(&references[GetRandomInteger(count)]); + + return true; + } + + virtual void Trace(IRecyclerHeapMarkingContext* markContext) override + { + VerifyCondition(type == AllocationType::TraceAndFinalized || type == AllocationType::TraceOnly); + // Note that the pointers in the references arrary are technically tagged. However, this is ok + // as the Mark that we're performing is an interior mark, which gets us to the right object(s). + markContext->MarkObjects(reinterpret_cast(&references[0]), count, this); + } + + virtual void Finalize(bool isShutdown) override + { + // Only types that request finalization should have Finalize called + VerifyCondition(IsFinalizable()); + } + virtual void Dispose(bool isShutdown) override + { + // Only types that request finalization should have Finalize called + VerifyCondition(IsFinalizable()); + VerifyCondition(unmanagedResource != nullptr); + BOOL success = ::HeapFree(GetProcessHeap(), 0, unmanagedResource); + VerifyCondition(success != FALSE); + unmanagedResource = nullptr; + } + +protected: + virtual void DoWalkObject() override + { + walkRecyclerVisitedByteCount += sizeof(RecyclerVisitedObject) + count * sizeof(RecyclerTestObject *); + + for (unsigned int i = 0; i < count; i++) + { + RecyclerTestObject::WalkReference(Location::Untag(references[i])); + } + } + +private: + enum class AllocationType : unsigned int + { + TraceAndFinalized = 0, + TraceOnly, + FinalizeLeaf, + Leaf, + Count, + }; + + bool IsFinalizable() const { return type == AllocationType::TraceAndFinalized || type == AllocationType::FinalizeLeaf; } + RecyclerVisitedObject(AllocationType allocType, unsigned int count) : + count(count), + type(allocType) + { + for (unsigned int i = 0; i < count; i++) + { + references[i] = nullptr; + } + if (IsFinalizable()) + { + unmanagedResource = ::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, GetRandomInteger(1024)); + VerifyCondition(unmanagedResource != nullptr); + } + } + + + Field(AllocationType) type; + Field(void*) unmanagedResource; + Field(unsigned int) count; + FieldNoBarrier(RecyclerTestObject *) references[0]; // SWB-TODO: is this correct? (copied from TrackedObject) +}; +#endif diff --git a/deps/chakrashim/core/bin/GCStress/StubExternalApi.cpp b/deps/chakrashim/core/bin/GCStress/StubExternalApi.cpp index 78669cae0c1..cac9b97c7af 100644 --- a/deps/chakrashim/core/bin/GCStress/StubExternalApi.cpp +++ b/deps/chakrashim/core/bin/GCStress/StubExternalApi.cpp @@ -21,7 +21,7 @@ void ConfigParserAPI::DisplayInitialOutput(__in LPWSTR moduleName) Output::Print(_u("INIT: DLL Path : %s\n"), moduleName); } -#ifdef ENABLE_JS_ETW +#if defined(ENABLE_JS_ETW) && !defined(ENABLE_JS_LTTNG) void EtwCallbackApi::OnSessionChange(ULONG /* controlCode */, PVOID /* callbackContext */) { // Does nothing diff --git a/deps/chakrashim/core/bin/NativeTests/CodexTests.cpp b/deps/chakrashim/core/bin/NativeTests/CodexTests.cpp index c521bfde5e1..3c6ad6fc718 100644 --- a/deps/chakrashim/core/bin/NativeTests/CodexTests.cpp +++ b/deps/chakrashim/core/bin/NativeTests/CodexTests.cpp @@ -84,7 +84,7 @@ namespace CodexTest { // Each of these test cases verifies the encoding // of a single surrogate pair into a 6 byte CESU string - // Each surrogate-pair unit is encoded seperately into utf8 + // Each surrogate-pair unit is encoded separately into utf8 struct TestCase { char16 surrogatePair[2]; diff --git a/deps/chakrashim/core/bin/NativeTests/FunctionExecutionTest.cpp b/deps/chakrashim/core/bin/NativeTests/FunctionExecutionTest.cpp new file mode 100644 index 00000000000..5eadeba79b3 --- /dev/null +++ b/deps/chakrashim/core/bin/NativeTests/FunctionExecutionTest.cpp @@ -0,0 +1,345 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "stdafx.h" +#include "catch.hpp" +#include "FunctionExecutionTest.h" + +// Definition of tests that exercise FunctionExecutionStateMachine +namespace FunctionExecutionTest +{ + // Simple test case to validate that the state machine was created. + TEST_CASE("FuncExe_BasicTest") + { + Js::FunctionExecutionStateMachine f; + Js::FunctionBody body(false, false, false); + f.InitializeExecutionModeAndLimits(&body); + CHECK(f.GetExecutionMode() == ExecutionMode::Interpreter); + } + + // Mimics script that repeatedly calls a function (not in a loop, but multiple times). This pattern hits all execution modes: + //ExecutionMode - function : testfn((#1.1), #2), mode : AutoProfilingInterpreter, size : 36, limits : 12.4.89.21.0 = 126, event : IsSpeculativeJitCandidate(before) + //ExecutionMode - function : testfn((#1.1), #2), mode : AutoProfilingInterpreter, size : 36, limits : 0.4.101.21.0 = 126, event : IsSpeculativeJitCandidate + //ExecutionMode - function : testfn((#1.1), #2), mode : ProfilingInterpreter, size : 36, limits : 0.4.101.21.0 = 126 + //ExecutionMode - function : testfn((#1.1), #2), mode : AutoProfilingInterpreter, size : 36, limits : 0.0.101.21.0 = 122 + //ExecutionMode - function : testfn((#1.1), #2), mode : SimpleJit, size : 36, limits : 0.0.0.21.0 = 21 + //ExecutionMode - function : testfn((#1.1), #2), mode : SimpleJit, size : 36, limits : 0.0.0.21.0 = 21 + //ExecutionMode - function : testfn((#1.1), #2), mode : FullJit, size : 36, limits : 0.0.0.0.0 = 0 + template + void NormalExecution() + { + bool prevValue = FullJitPhaseOffFlag; + FullJitPhaseOffFlag = TFullJitPhase; + + // Setup the function environment + int calls = 0; + Js::Configuration::Global.flags.SetDefaults(); + Js::FunctionExecutionStateMachine f; + Js::FunctionBody body(true, true, true); + + // Transition from Interpreter to AutoProfilingInterpreter + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::InitializeExecutionModeAndLimits + //02 chakra!Js::FunctionBody::MarkScript + //03 chakra!Js::ByteCodeWriter::End + //04 chakra!ByteCodeGenerator::EmitOneFunction + //05 chakra!ByteCodeGenerator::EmitScopeList + //06 chakra!ByteCodeGenerator::EmitScopeList + //07 chakra!ByteCodeGenerator::EmitScopeList + //08 chakra!ByteCodeGenerator::EmitProgram + //09 chakra!ByteCodeGenerator::Generate + //0a chakra!GenerateByteCode + //0b chakra!ScriptEngine::CompileUTF8Core + //0c chakra!ScriptEngine::CompileUTF8 + //0d chakra!ScriptEngine::DefaultCompile + //0e chakra!ScriptEngine::CreateScriptBody + //0f chakra!ScriptEngine::ParseScriptTextCore + //10 chakra!ScriptEngine::ParseScriptText + f.InitializeExecutionModeAndLimits(&body); + CHECK(f.GetExecutionMode() == ExecutionMode::AutoProfilingInterpreter); + CHECK(f.GetInterpretedCount() == 0); + f.PrintLimits(); + + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextInterpreterExecutionMode + //03 chakra!Js::FunctionExecutionStateMachine::SetIsSpeculativeJitCandidate + //04 chakra!Js::FunctionBody::SetIsSpeculativeJitCandidate + //05 chakra!CodeGenWorkItem::ShouldSpeculativelyJitBasedOnProfile + //06 chakra!CodeGenWorkItem::ShouldSpeculativelyJit + //07 chakra!NativeCodeGenerator::GetJobToProcessProactively + //08 chakra!JsUtil::ForegroundJobProcessor::PrioritizeManagerAndWait + //09 chakra!JsUtil::JobProcessor::PrioritizeManagerAndWait + //0a chakra!NativeCodeGenerator::EnterScriptStart + //0b chakra!NativeCodeGenEnterScriptStart + //0c chakra!Js::ScriptContext::OnScriptStart + //0d chakra!Js::JavascriptFunction::CallRootFunctionInternal + //0e chakra!Js::JavascriptFunction::CallRootFunction + //0f chakra!ScriptSite::CallRootFunction + //10 chakra!ScriptSite::Execute + //11 chakra!ScriptEngine::ExecutePendingScripts + //12 chakra!ScriptEngine::ParseScriptTextCore + //13 chakra!ScriptEngine::ParseScriptText + f.SetIsSpeculativeJitCandidate(); + CHECK(f.GetExecutionMode() == ExecutionMode::ProfilingInterpreter); + CHECK(f.GetInterpretedCount() == 0); + + // "Run" the function in the interpreter + for (; calls < 4; calls++) + { + f.IncreaseInterpretedCount(); + } + CHECK(f.GetExecutionMode() == ExecutionMode::ProfilingInterpreter); + CHECK(f.GetInterpretedCount() == 4); + + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionExecutionStateMachine::TryTransitionToJitExecutionMode + //03 chakra!Js::FunctionBody::TryTransitionToJitExecutionMode + //04 chakra!NativeCodeGenerator::Prioritize + //05 chakra!JsUtil::ForegroundJobProcessor::PrioritizeJob + //06 chakra!JsUtil::JobProcessor::PrioritizeJob + //07 chakra!NativeCodeGenerator::CheckCodeGen + //08 chakra!NativeCodeGenerator::CheckCodeGenThunk + //09 chakra!amd64_CallFunction + //0a chakra!Js::JavascriptFunction::CallFunction<1> + //0b chakra!Js::InterpreterStackFrame::OP_CallCommon > > > + //0c chakra!Js::InterpreterStackFrame::OP_CallI > > > + //0d chakra!Js::InterpreterStackFrame::ProcessUnprofiled + //0e chakra!Js::InterpreterStackFrame::Process + //0f chakra!Js::InterpreterStackFrame::InterpreterHelper + //10 chakra!Js::InterpreterStackFrame::InterpreterThunk + //11 0x0 + //12 chakra!amd64_CallFunction + //13 chakra!Js::JavascriptFunction::CallFunction<1> + //14 chakra!Js::JavascriptFunction::CallRootFunctionInternal + //15 chakra!Js::JavascriptFunction::CallRootFunction + //16 chakra!ScriptSite::CallRootFunction + //17 chakra!ScriptSite::Execute + //18 chakra!ScriptEngine::ExecutePendingScripts + //19 chakra!ScriptEngine::ParseScriptTextCore + //1a chakra!ScriptEngine::ParseScriptText + f.TryTransitionToJitExecutionMode(); + CHECK(f.GetExecutionMode() == ExecutionMode::AutoProfilingInterpreter); + CHECK(f.GetInterpretedCount() == 0); + + // "Run" the function in the interpreter + for (; calls < 105; calls++) + { + f.IncreaseInterpretedCount(); + } + CHECK(f.GetExecutionMode() == ExecutionMode::AutoProfilingInterpreter); + CHECK(f.GetInterpretedCount() == 0x65); + + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionExecutionStateMachine::TryTransitionToJitExecutionMode + //03 chakra!Js::FunctionBody::TryTransitionToJitExecutionMode + //04 chakra!NativeCodeGenerator::Prioritize + //05 chakra!JsUtil::ForegroundJobProcessor::PrioritizeJob + //06 chakra!JsUtil::JobProcessor::PrioritizeJob + //07 chakra!NativeCodeGenerator::CheckCodeGen + //08 chakra!NativeCodeGenerator::CheckCodeGenThunk + //09 chakra!amd64_CallFunction + //0a chakra!Js::JavascriptFunction::CallFunction<1> + //0b chakra!Js::InterpreterStackFrame::OP_CallCommon > > > + //0c chakra!Js::InterpreterStackFrame::OP_CallI > > > + //0d chakra!Js::InterpreterStackFrame::ProcessUnprofiled + //0e chakra!Js::InterpreterStackFrame::Process + //0f chakra!Js::InterpreterStackFrame::InterpreterHelper + //10 chakra!Js::InterpreterStackFrame::InterpreterThunk + //11 0x0 + //12 chakra!amd64_CallFunction + //13 chakra!Js::JavascriptFunction::CallFunction<1> + //14 chakra!Js::JavascriptFunction::CallRootFunctionInternal + //15 chakra!Js::JavascriptFunction::CallRootFunction + //16 chakra!ScriptSite::CallRootFunction + //17 chakra!ScriptSite::Execute + //18 chakra!ScriptEngine::ExecutePendingScripts + //19 chakra!ScriptEngine::ParseScriptTextCore + //1a chakra!ScriptEngine::ParseScriptText + f.TryTransitionToJitExecutionMode(); + CHECK(f.GetExecutionMode() == ExecutionMode::SimpleJit); + CHECK(f.GetInterpretedCount() == 0); + + // Simple JIT EntryPoint Info keeps a count from the limit and decrements per call. + // Since the stub entry point is initialized to 0, proceed with transition. + + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionBody::TryTransitionToNextExecutionMode + //03 chakra!NativeCodeGenerator::TransitionFromSimpleJit + //04 chakra!NativeCodeGenerator::Jit_TransitionFromSimpleJit + //05 0x0 + //06 chakra!amd64_CallFunction + //07 chakra!Js::JavascriptFunction::CallFunction<1> + //08 chakra!Js::InterpreterStackFrame::OP_CallCommon > > > + //09 chakra!Js::InterpreterStackFrame::OP_CallI > > > + //0a chakra!Js::InterpreterStackFrame::ProcessUnprofiled + //0b chakra!Js::InterpreterStackFrame::Process + //0c chakra!Js::InterpreterStackFrame::InterpreterHelper + //0d chakra!Js::InterpreterStackFrame::InterpreterThunk + //0e 0x0 + //0f chakra!amd64_CallFunction + //10 chakra!Js::JavascriptFunction::CallFunction<1> + //11 chakra!Js::JavascriptFunction::CallRootFunctionInternal + //12 chakra!Js::JavascriptFunction::CallRootFunction + //13 chakra!ScriptSite::CallRootFunction + //14 chakra!ScriptSite::Execute + //15 chakra!ScriptEngine::ExecutePendingScripts + //16 chakra!ScriptEngine::ParseScriptTextCore + //17 chakra!ScriptEngine::ParseScriptText + f.TryTransitionToNextExecutionMode(); + CHECK(f.GetExecutionMode() == TFinalMode); + CHECK(f.GetInterpretedCount() == 0); + + FullJitPhaseOffFlag = prevValue; + } + + TEST_CASE("FuncExe_NormalExecution") + { + NormalExecution(); + } + + TEST_CASE("FuncExe_NormalExecutionNoFullJit") + { + NormalExecution(); + } + + // test what happens when we jit a Loop Body + TEST_CASE("FuncExe_NormalExecutionOfLoop") + { + + } + + // Emulate/test what happens when we have the cmd args similar to JS unittests as Interpreted: + // -bvt -BaselineMode -DumpOnCrash -maxInterpretCount:1 -maxSimpleJitRunCount:1 -bgjit- + TEST_CASE("FuncExe_JSUnitTestInterpreted") + { + Js::Configuration::Global.flags.SetInterpretedValues(); + Js::FunctionExecutionStateMachine f; + Js::FunctionBody body(true, true, true); + + // to AutoProf + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::InitializeExecutionModeAndLimits + //02 chakra!Js::FunctionBody::MarkScript + //03 chakra!Js::ByteCodeWriter::End + // ...and then to Prof + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextInterpreterExecutionMode + //03 chakra!Js::FunctionExecutionStateMachine::InitializeExecutionModeAndLimits + //04 chakra!Js::FunctionBody::MarkScript + //05 chakra!Js::ByteCodeWriter::End + f.InitializeExecutionModeAndLimits(&body); + CHECK(f.GetExecutionMode() == ExecutionMode::ProfilingInterpreter); + CHECK(f.GetInterpretedCount() == 0); + + // Run the function once under the Interpreter + f.IncreaseInterpretedCount(); + + // to Simple + //# Call Site + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionExecutionStateMachine::TryTransitionToJitExecutionMode + //03 chakra!Js::FunctionBody::TryTransitionToJitExecutionMode + //04 chakra!NativeCodeGenerator::CheckCodeGen + //05 chakra!NativeCodeGenerator::CheckCodeGenThunk + //06 chakra!amd64_CallFunction + f.TryTransitionToJitExecutionMode(); + CHECK(f.GetExecutionMode() == ExecutionMode::SimpleJit); + CHECK(f.GetInterpretedCount() == 0); + + // Simple JIT EntryPoint Info keeps a count from the limit and decrements per call. + // Since the stub entry point is initialized to 0, proceed with transition. + + // to full + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionBody::TryTransitionToNextExecutionMode + //03 chakra!NativeCodeGenerator::TransitionFromSimpleJit + //04 chakra!NativeCodeGenerator::Jit_TransitionFromSimpleJit + f.TryTransitionToNextExecutionMode(); + CHECK(f.GetExecutionMode() == ExecutionMode::FullJit); + CHECK(f.GetInterpretedCount() == 0); + } + + // Emulate/test what happens when we have the cmd args similar to JS unittests as DynaPogo: + // -bvt -BaselineMode -DumpOnCrash -forceNative -off:simpleJit -bgJitDelay:0 + template + void JSUnitTestDynapogo() + { + bool prevValue = FullJitPhaseOffFlag; + FullJitPhaseOffFlag = TFullJitPhase; + + Js::Configuration::Global.flags.SetDynaPogoValues(); + Js::FunctionExecutionStateMachine f; + Js::FunctionBody body(true, true, false); + // to AutoProf + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::InitializeExecutionModeAndLimits + //02 chakra!Js::FunctionBody::MarkScript + //03 chakra!Js::ByteCodeWriter::End + // ...then FullJit + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextInterpreterExecutionMode + //03 chakra!Js::FunctionExecutionStateMachine::InitializeExecutionModeAndLimits + //04 chakra!Js::FunctionBody::MarkScript + //05 chakra!Js::ByteCodeWriter::End + // ..then profiling + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextInterpreterExecutionMode + //02 chakra!Js::FunctionExecutionStateMachine::InitializeExecutionModeAndLimits + //03 chakra!Js::FunctionBody::MarkScript + //04 chakra!Js::ByteCodeWriter::End + f.InitializeExecutionModeAndLimits(&body); + CHECK(f.GetExecutionMode() == TInitialMode); + CHECK(f.GetInterpretedCount() == 0); + + // to full + //00 chakra!Js::FunctionExecutionStateMachine::SetExecutionMode + //01 chakra!Js::FunctionExecutionStateMachine::TryTransitionToNextExecutionMode + //02 chakra!Js::FunctionExecutionStateMachine::TryTransitionToJitExecutionMode + //03 chakra!Js::FunctionBody::TryTransitionToJitExecutionMode + //04 chakra!NativeCodeGenerator::CheckCodeGen + //05 chakra!NativeCodeGenerator::CheckCodeGenThunk + f.TryTransitionToJitExecutionMode(); + CHECK(f.GetExecutionMode() == TFinalMode); + CHECK(f.GetInterpretedCount() == 0); + + FullJitPhaseOffFlag = prevValue; + } + + TEST_CASE("FuncExe_JSUnitTestDynapogo") + { + JSUnitTestDynapogo(); + } + + TEST_CASE("FuncExe_JSUnitTestDynapogoNoFullJit") + { + JSUnitTestDynapogo(); + } + + // test what hits TransitionToSimpleJitExecutionMode + // NativeCodeGenerator::GenerateFunction with the following args + // -bgjit- -trace:executionmode -prejit -force:simplejit + TEST_CASE("FuncExe_TransitionToSimpleJit") + { + + } + + // test what hits TransitionToFullJitExecutionMode + // Note: also called from + // - BailOutRecord::ScheduleFunctionCodeGen, when we rejit after bailout + // - NativeCodeGenerator::GetJobToProcessProactively, looks like it's for speculative jit + // - NativeCodeGenerator::GenerateFunction, when prejitting with the following args + // -bgjit- -trace:executionmode -prejit + TEST_CASE("FuncExe_TransitionToFullJit") + { + + } +} diff --git a/deps/chakrashim/core/bin/NativeTests/FunctionExecutionTest.h b/deps/chakrashim/core/bin/NativeTests/FunctionExecutionTest.h new file mode 100644 index 00000000000..b3df9e59225 --- /dev/null +++ b/deps/chakrashim/core/bin/NativeTests/FunctionExecutionTest.h @@ -0,0 +1,139 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +// This file contains stubs needed to make FunctionExecutionTest successfully compile and link as well +// as a means to emulate behavior of objects that interact with FunctionExecutionStateMachine + +#include "..\..\lib\Common\Core\CommonMinMax.h" + +#define ENUM_CLASS_HELPERS(x, y) +#include "..\..\lib\Runtime\Language\ExecutionMode.h" + +#define FieldWithBarrier(type) type + +#define CONFIG_FLAG(flag) 10 +#define PHASE_OFF(foo, bar) FunctionExecutionTest::PhaseOff(foo, bar) +#define PHASE_FORCE(foo, bar) false +#define NewSimpleJit 1 +#define FullJitPhase 2 +#define DEFAULT_CONFIG_MinSimpleJitIterations 0 + +namespace FunctionExecutionTest +{ + static bool FullJitPhaseOffFlag = false; + bool PhaseOff(int phase, void*) + { + if (phase == FullJitPhase) + { + return FullJitPhaseOffFlag; + } + else + { + Assert(!"Unknown Phase"); + return false; + } + } +} + +namespace Js +{ + class ConfigFlagsTable + { + public: + uint16 AutoProfilingInterpreter0Limit; + uint16 AutoProfilingInterpreter1Limit; + uint16 ProfilingInterpreter0Limit; + uint16 ProfilingInterpreter1Limit; + uint16 SimpleJitLimit; + bool EnforceExecutionModeLimits; + + void SetDefaults() + { + AutoProfilingInterpreter0Limit = 0xc; + ProfilingInterpreter0Limit = 0x4; + AutoProfilingInterpreter1Limit = 0x44; + ProfilingInterpreter1Limit = 0; + SimpleJitLimit = 0x15; + EnforceExecutionModeLimits = false; + } + + void SetInterpretedValues() + { + AutoProfilingInterpreter0Limit = 0; + AutoProfilingInterpreter1Limit = 0; + ProfilingInterpreter0Limit = 1; + ProfilingInterpreter1Limit = 0; + SimpleJitLimit = 1; + EnforceExecutionModeLimits = true; + } + + void SetDynaPogoValues() + { + AutoProfilingInterpreter0Limit = 0; + AutoProfilingInterpreter1Limit = 0; + ProfilingInterpreter0Limit = 0; + ProfilingInterpreter1Limit = 0; + SimpleJitLimit = 0; + EnforceExecutionModeLimits = true; + } + }; + + enum Phase + { + SimpleJitPhase + }; + + class Configuration + { + public: + Configuration() {} + ConfigFlagsTable flags; + static Configuration Global; + }; + Configuration Configuration::Global; + + class FunctionEntryPointInfo + { + public: + FunctionEntryPointInfo() : callsCount(0) {} + int callsCount; + }; + + class Output + { + public: + static size_t Print(const char16 *form, ...) { UNREFERENCED_PARAMETER(form); return 0; } + }; + + class FunctionBody + { + public: + bool DoInterpreterProfile() const { return doInterpreterProfile; } + bool DoInterpreterAutoProfile() const { return doInterpreterAutoProfile; } + bool DoSimpleJit() const { return doSimpleJit; } + uint GetByteCodeCount() const { return 0; } + uint GetByteCodeInLoopCount() const { return 0; } + uint GetByteCodeWithoutLDACount() const { return 0; } + FunctionEntryPointInfo* GetDefaultFunctionEntryPointInfo() { return &defaultInfo; } + FunctionEntryPointInfo *GetSimpleJitEntryPointInfo() { return &simpleInfo; } + void TraceExecutionMode(const char *const eventDescription = nullptr) const { UNREFERENCED_PARAMETER(eventDescription); } + + FunctionBody(bool interpreterProfile, bool interpreterAutoProfile, bool simpleJit): + doInterpreterProfile(interpreterProfile), + doInterpreterAutoProfile(interpreterAutoProfile), + doSimpleJit(simpleJit) + {} + + private: + bool doInterpreterProfile; + bool doInterpreterAutoProfile; + bool doSimpleJit; + FunctionEntryPointInfo defaultInfo; + FunctionEntryPointInfo simpleInfo; + }; +} + +#include "..\..\lib\Runtime\Base\FunctionExecutionStateMachine.h" +#include "..\..\lib\Runtime\Base\FunctionExecutionStateMachine.cpp" diff --git a/deps/chakrashim/core/bin/NativeTests/JsRTApiTest.cpp b/deps/chakrashim/core/bin/NativeTests/JsRTApiTest.cpp index e022f7908c4..d3f7b83ba50 100644 --- a/deps/chakrashim/core/bin/NativeTests/JsRTApiTest.cpp +++ b/deps/chakrashim/core/bin/NativeTests/JsRTApiTest.cpp @@ -660,6 +660,217 @@ namespace JsRTApiTest JsRTApiTest::RunWithAttributes(JsRTApiTest::ExternalFunctionTest); } + JsValueRef CALLBACK ExternalEnhancedFunctionTestCallback(JsValueRef callee, JsValueRef *arguments, unsigned short argumentCount, JsNativeFunctionInfo *info, void *callbackData) + { + REQUIRE(callbackData != nullptr); + REQUIRE(*static_cast(callbackData) == 123); + REQUIRE(argumentCount == 2); + + bool success = false; + JsValueRef _true; + REQUIRE(JsGetTrueValue(&_true) == JsNoError); + JsValueRef _false; + REQUIRE(JsGetFalseValue(&_false) == JsNoError); + + + REQUIRE(JsStrictEquals(_true, arguments[0], &success) == JsNoError); + REQUIRE(success); + REQUIRE(JsStrictEquals(_false, arguments[1], &success) == JsNoError); + REQUIRE(success); + + REQUIRE(!info->isConstructCall); + REQUIRE(info->thisArg == arguments[0]); + + JsValueRef undefined; + REQUIRE(JsGetUndefinedValue(&undefined) == JsNoError); + REQUIRE(JsStrictEquals(undefined, info->newTargetArg, &success) == JsNoError); + REQUIRE(success); + + JsValueRef _null; + REQUIRE(JsGetNullValue(&_null) == JsNoError); + return _null; + } + + JsValueRef CALLBACK ExternalEnhancedConstructorFunctionTestCallback(JsValueRef callee, JsValueRef *arguments, unsigned short argumentCount, JsNativeFunctionInfo *info, void *callbackData) + { + REQUIRE(callbackData != nullptr); + REQUIRE(*static_cast(callbackData) == 456); + REQUIRE(argumentCount == 3); + + bool success = false; + JsValueRef _true; + REQUIRE(JsGetTrueValue(&_true) == JsNoError); + JsValueRef _false; + REQUIRE(JsGetFalseValue(&_false) == JsNoError); + JsValueRef _null; + REQUIRE(JsGetNullValue(&_null) == JsNoError); + + REQUIRE(info->thisArg == arguments[0]); + REQUIRE(JsStrictEquals(_true, arguments[1], &success) == JsNoError); + REQUIRE(success); + REQUIRE(JsStrictEquals(_false, arguments[2], &success) == JsNoError); + REQUIRE(success); + + REQUIRE(info->isConstructCall); + + JsValueType t; + REQUIRE(JsGetValueType(info->newTargetArg, &t) == JsNoError); + REQUIRE(t == JsFunction); + REQUIRE(JsGetValueType(info->thisArg, &t) == JsNoError); + REQUIRE(t == JsObject); + + return info->thisArg; + } + + void ExternalEnhancedFunctionTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) + { + int sentinel = 123; + JsValueRef function = JS_INVALID_REFERENCE; + REQUIRE(JsCreateEnhancedFunction(ExternalEnhancedFunctionTestCallback, nullptr, &sentinel, &function) == JsNoError); + JsValueRef _true; + REQUIRE(JsGetTrueValue(&_true) == JsNoError); + JsValueRef _false; + REQUIRE(JsGetFalseValue(&_false) == JsNoError); + JsValueRef args[2] = { _true, _false }; + JsValueRef _null; + REQUIRE(JsGetNullValue(&_null) == JsNoError); + JsValueRef result; + REQUIRE(JsCallFunction(function, args, 2, &result) == JsNoError); + bool success; + REQUIRE(JsStrictEquals(_null, result, &success) == JsNoError); + REQUIRE(success); + + sentinel = 456; + function = JS_INVALID_REFERENCE; + REQUIRE(JsCreateEnhancedFunction(ExternalEnhancedConstructorFunctionTestCallback, nullptr, &sentinel, &function) == JsNoError); + JsValueRef ctorArgs[3] = { _null, _true, _false }; + REQUIRE(JsConstructObject(function, ctorArgs, 3, &result) == JsNoError); + JsValueType t; + REQUIRE(JsGetValueType(result, &t) == JsNoError); + REQUIRE(t == JsObject); + } + + TEST_CASE("ApiTest_ExternalEnhancedFunctionTest", "[ApiTest]") + { + JsRTApiTest::RunWithAttributes(JsRTApiTest::ExternalEnhancedFunctionTest); + } + + struct ExternalEnhancedBaseClassFunctionTestInfo + { + JsValueRef derived; + JsValueRef base; + }; + + JsValueRef CALLBACK ExternalEnhancedBaseClassFunctionTestCallback(JsValueRef callee, JsValueRef *arguments, unsigned short argumentCount, JsNativeFunctionInfo *info, void *callbackData) + { + REQUIRE(callbackData != nullptr); + + ExternalEnhancedBaseClassFunctionTestInfo* testinfo = (ExternalEnhancedBaseClassFunctionTestInfo*)callbackData; + JsValueType t; + REQUIRE(JsGetValueType(testinfo->derived, &t) == JsNoError); + REQUIRE(t == JsFunction); + REQUIRE(JsGetValueType(testinfo->base, &t) == JsNoError); + REQUIRE(t == JsFunction); + REQUIRE(argumentCount == 2); + + JsPropertyIdRef propId; + bool success = false; + JsValueRef _true; + REQUIRE(JsGetTrueValue(&_true) == JsNoError); + JsValueRef _false; + REQUIRE(JsGetFalseValue(&_false) == JsNoError); + + REQUIRE(info->thisArg == arguments[0]); + REQUIRE(JsStrictEquals(_true, arguments[1], &success) == JsNoError); + REQUIRE(success); + + REQUIRE(info->isConstructCall); + REQUIRE(JsGetValueType(info->newTargetArg, &t) == JsNoError); + REQUIRE(t == JsFunction); + REQUIRE(JsGetValueType(info->thisArg, &t) == JsNoError); + REQUIRE(t == JsObject); + + // new.target === Derived + REQUIRE(JsStrictEquals(info->newTargetArg, testinfo->derived, &success) == JsNoError); + REQUIRE(success); + + // this.constructor === Derived + REQUIRE(JsGetPropertyIdFromName(_u("constructor"), &propId) == JsNoError); + JsValueRef thisCtor = JS_INVALID_REFERENCE; + REQUIRE(JsGetProperty(info->thisArg, propId, &thisCtor) == JsNoError); + REQUIRE(JsStrictEquals(thisCtor, testinfo->derived, &success) == JsNoError); + REQUIRE(success); + + // this.__proto__ === Derived.prototype + JsValueRef thisProto = JS_INVALID_REFERENCE; + REQUIRE(JsGetPrototype(info->thisArg, &thisProto) == JsNoError); + JsValueRef derivedPrototype = JS_INVALID_REFERENCE; + REQUIRE(JsGetPropertyIdFromName(_u("prototype"), &propId) == JsNoError); + REQUIRE(JsGetProperty(testinfo->derived, propId, &derivedPrototype) == JsNoError); + REQUIRE(JsStrictEquals(thisProto, derivedPrototype, &success) == JsNoError); + REQUIRE(success); + + return info->thisArg; + } + + void ExternalEnhancedBaseClassFunctionTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) + { + ExternalEnhancedBaseClassFunctionTestInfo info = { nullptr, nullptr }; + JsValueRef name = JS_INVALID_REFERENCE; + REQUIRE(JsCreateString("BaseClass", 10, &name) == JsNoError); + JsValueRef base = JS_INVALID_REFERENCE; + REQUIRE(JsCreateEnhancedFunction(ExternalEnhancedBaseClassFunctionTestCallback, name, &info, &base) == JsNoError); + info.base = base; + + JsValueRef global = JS_INVALID_REFERENCE; + REQUIRE(JsGetGlobalObject(&global) == JsNoError); + JsPropertyIdRef propId; + REQUIRE(JsGetPropertyIdFromName(_u("BaseClass"), &propId) == JsNoError); + REQUIRE(JsSetProperty(global, propId, base, false) == JsNoError); + + bool success = false; + JsValueType t; + JsValueRef derived = JS_INVALID_REFERENCE; + REQUIRE(JsRunScript( + _u("class Derived extends BaseClass {") \ + _u(" constructor() {") \ + _u(" super(true);") \ + _u(" }") \ + _u("};"), JS_SOURCE_CONTEXT_NONE, _u(""), &derived) == JsNoError); + + info.derived = derived; + REQUIRE(JsGetValueType(derived, &t) == JsNoError); + REQUIRE(t == JsFunction); + + JsValueRef instance = JS_INVALID_REFERENCE; + REQUIRE(JsRunScript( + _u("new Derived();"), JS_SOURCE_CONTEXT_NONE, _u(""), &instance) == JsNoError); + + REQUIRE(JsGetValueType(instance, &t) == JsNoError); + REQUIRE(t == JsObject); + + // instance.constructor === Derived + REQUIRE(JsGetPropertyIdFromName(_u("constructor"), &propId) == JsNoError); + JsValueRef instanceCtor = JS_INVALID_REFERENCE; + REQUIRE(JsGetProperty(instance, propId, &instanceCtor) == JsNoError); + REQUIRE(JsStrictEquals(instanceCtor, derived, &success) == JsNoError); + REQUIRE(success); + + // instance.__proto__ === Derived.prototype + JsValueRef instanceProto = JS_INVALID_REFERENCE; + REQUIRE(JsGetPrototype(instance, &instanceProto) == JsNoError); + JsValueRef derivedPrototype = JS_INVALID_REFERENCE; + REQUIRE(JsGetPropertyIdFromName(_u("prototype"), &propId) == JsNoError); + REQUIRE(JsGetProperty(derived, propId, &derivedPrototype) == JsNoError); + REQUIRE(JsStrictEquals(instanceProto, derivedPrototype, &success) == JsNoError); + REQUIRE(success); + } + + TEST_CASE("ApiTest_ExternalEnhancedBaseClassFunctionTest", "[ApiTest]") + { + JsRTApiTest::RunWithAttributes(JsRTApiTest::ExternalEnhancedBaseClassFunctionTest); + } + void ExternalFunctionNameTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) { auto testConstructorName = [=](JsValueRef function, PCWCHAR expectedName, size_t expectedNameLength) @@ -2063,6 +2274,7 @@ namespace JsRTApiTest JsRTApiTest::WithSetup(JsRuntimeAttributeEnableExperimentalFeatures, ReentrantParseModuleTest); } + ModuleResponseData reentrantNoErrorParseData; static JsErrorCode CALLBACK reentrantNoErrorParse_FIMC(_In_ JsModuleRecord referencingModule, _In_ JsValueRef specifier, _Outptr_result_maybenull_ JsModuleRecord* dependentModuleRecord) { @@ -2131,6 +2343,50 @@ namespace JsRTApiTest JsRTApiTest::WithSetup(JsRuntimeAttributeEnableExperimentalFeatures, ReentrantNoErrorParseModuleTest); } + static JsErrorCode CALLBACK FIMC1(_In_ JsModuleRecord referencingModule, _In_ JsValueRef specifier, _Outptr_result_maybenull_ JsModuleRecord* dependentModuleRecord) + { + JsModuleRecord moduleRecord = JS_INVALID_REFERENCE; + LPCWSTR specifierStr; + size_t length; + JsErrorCode errorCode = JsStringToPointer(specifier, &specifierStr, &length); + REQUIRE(errorCode == JsNoError); + + if (wcscmp(specifierStr, _u("foo.js")) == 0) + { + errorCode = JsInitializeModuleRecord(referencingModule, specifier, &moduleRecord); + REQUIRE(errorCode == JsNoError); + } + + *dependentModuleRecord = moduleRecord; + return JsNoError; + } + + static JsErrorCode CALLBACK NMRC1(_In_opt_ JsModuleRecord referencingModule, _In_opt_ JsValueRef exceptionVar) + { + // NotifyModuleReadyCallback handling. + + return JsNoError; + } + + void SomebugTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) + { + JsModuleRecord rec; + JsInitializeModuleRecord(nullptr, nullptr, &rec); + JsSetModuleHostInfo(rec, JsModuleHostInfo_FetchImportedModuleCallback, FIMC1); + JsSetModuleHostInfo(rec, JsModuleHostInfo_FetchImportedModuleFromScriptCallback, FIMC1); + JsSetModuleHostInfo(rec, JsModuleHostInfo_NotifyModuleReadyCallback, NMRC1); + + JsValueRef F = JS_INVALID_REFERENCE; + JsErrorCode err = JsRunScript(_u("var j = import('foo.js').then(mod => { mod.bar(); })"), 0, _u(""), &F); + + CHECK(err == JsNoError); + } + + TEST_CASE("ApiTest_SomebugTest", "[ApiTest]") + { + JsRTApiTest::WithSetup(JsRuntimeAttributeEnableExperimentalFeatures, SomebugTest); + + } void ObjectHasOwnPropertyMethodTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) { JsValueRef proto = JS_INVALID_REFERENCE; @@ -2196,4 +2452,84 @@ namespace JsRTApiTest JsRTApiTest::RunWithAttributes(JsRTApiTest::JsCopyStringOneByteMethodTest); } + void JsLessThanTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) + { + // Create some values + JsValueRef number1 = JS_INVALID_REFERENCE; // number1 = 1 + REQUIRE(JsDoubleToNumber(1, &number1) == JsNoError); + JsValueRef number2 = JS_INVALID_REFERENCE; // number2 = 2 + REQUIRE(JsDoubleToNumber(2, &number2) == JsNoError); + JsValueRef stringa = JS_INVALID_REFERENCE; // stringa = "1" + REQUIRE(JsPointerToString(_u("1"), wcslen(_u("1")), &stringa) == JsNoError); + JsValueRef undefined = GetUndefined(); + JsValueRef nullValue = JS_INVALID_REFERENCE; + REQUIRE(JsGetNullValue(&nullValue) == JsNoError); + JsValueRef trueValue = JS_INVALID_REFERENCE; + REQUIRE(JsGetTrueValue(&trueValue) == JsNoError); + JsValueRef falseValue = JS_INVALID_REFERENCE; + REQUIRE(JsGetFalseValue(&falseValue) == JsNoError); + + bool result; + REQUIRE(JsLessThan(number1, number2, &result) == JsNoError); + CHECK(result == true); + REQUIRE(JsLessThan(number1, stringa, &result) == JsNoError); + CHECK(result == false); + REQUIRE(JsLessThan(number1, undefined, &result) == JsNoError); + CHECK(result == false); + REQUIRE(JsLessThan(falseValue, trueValue, &result) == JsNoError); + CHECK(result == true); + REQUIRE(JsLessThan(undefined, undefined, &result) == JsNoError); + CHECK(result == false); + REQUIRE(JsLessThan(nullValue, undefined, &result) == JsNoError); + CHECK(result == false); + + REQUIRE(JsLessThanOrEqual(number1, number2, &result) == JsNoError); + CHECK(result == true); + REQUIRE(JsLessThanOrEqual(number1, number1, &result) == JsNoError); + CHECK(result == true); + REQUIRE(JsLessThanOrEqual(number1, stringa, &result) == JsNoError); + CHECK(result == true); + REQUIRE(JsLessThanOrEqual(trueValue, trueValue, &result) == JsNoError); + CHECK(result == true); + REQUIRE(JsLessThanOrEqual(falseValue, nullValue, &result) == JsNoError); + CHECK(result == true); + REQUIRE(JsLessThanOrEqual(falseValue, undefined, &result) == JsNoError); + CHECK(result == false); + REQUIRE(JsLessThanOrEqual(undefined, undefined, &result) == JsNoError); + CHECK(result == false); + REQUIRE(JsLessThanOrEqual(nullValue, undefined, &result) == JsNoError); + CHECK(result == false); + } + + TEST_CASE("ApiTest_JsLessThanTest", "[ApiTest]") + { + JsRTApiTest::RunWithAttributes(JsRTApiTest::JsLessThanTest); + } + + void JsCreateStringTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) + { + // Passing in invalid utf8 sequences should result in the unicode replacement character + const char invalidUtf8[] = { -127 /* 0x80 */, '\0' }; + JsValueRef result; + REQUIRE(JsCreateString(invalidUtf8, 1, &result) == JsNoError); + uint16_t utf16Result[2]; + size_t written; + REQUIRE(JsCopyStringUtf16(result, 0, 1, utf16Result, &written) == JsNoError); + CHECK(written == 1); + CHECK(utf16Result[0] == 0xFFFD); + + // Creating a utf8 string and then copying it back out should give an identical string + // Specifying -1 as the length should result in using strlen as the length + const char validUtf8Input[] = {'T', 'e', 's', 't', ' ', -30 /* 0xe2 */, -104 /* 0x98 */, -125 /* 0x83 */, 0}; + REQUIRE(JsCreateString(validUtf8Input, static_cast(-1), &result) == JsNoError); + char utf8Result[10]; + REQUIRE(JsCopyString(result,utf8Result, 10, &written) == JsNoError); + CHECK(written == strlen(validUtf8Input)); + CHECK(memcmp(utf8Result, validUtf8Input, written) == 0); + } + + TEST_CASE("ApiTest_JsCreateStringTest", "[ApiTest]") + { + JsRTApiTest::RunWithAttributes(JsRTApiTest::JsCreateStringTest); + } } diff --git a/deps/chakrashim/core/bin/NativeTests/NativeTests.vcxproj b/deps/chakrashim/core/bin/NativeTests/NativeTests.vcxproj index d020992c672..6464afadf24 100644 --- a/deps/chakrashim/core/bin/NativeTests/NativeTests.vcxproj +++ b/deps/chakrashim/core/bin/NativeTests/NativeTests.vcxproj @@ -21,12 +21,13 @@ - $(ChakraCoreRootDirectory)Lib\Jsrt; - $(MSBuildThisFileDirectory); - $(ChakraCoreRootDirectory)Lib\Common; - $(ChakraCoreRootDirectory)bin\External; - %(AdditionalIncludeDirectories) + $(ChakraCoreRootDirectory)Lib\Jsrt; + $(MSBuildThisFileDirectory); + $(ChakraCoreRootDirectory)Lib\Common; + $(ChakraCoreRootDirectory)bin\External; + %(AdditionalIncludeDirectories) + true false false @@ -42,9 +43,10 @@ + - + diff --git a/deps/chakrashim/core/bin/NativeTests/Runtime.h b/deps/chakrashim/core/bin/NativeTests/Runtime.h new file mode 100644 index 00000000000..ac4d2893da4 --- /dev/null +++ b/deps/chakrashim/core/bin/NativeTests/Runtime.h @@ -0,0 +1,7 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +// stub file for RuntimeBasePch.h diff --git a/deps/chakrashim/core/bin/NativeTests/WasmReader.h b/deps/chakrashim/core/bin/NativeTests/WasmReader.h new file mode 100644 index 00000000000..ac4d2893da4 --- /dev/null +++ b/deps/chakrashim/core/bin/NativeTests/WasmReader.h @@ -0,0 +1,7 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +// stub file for RuntimeBasePch.h diff --git a/deps/chakrashim/core/bin/NativeTests/stdafx.h b/deps/chakrashim/core/bin/NativeTests/stdafx.h index c9f5f1ce062..6f52ee986e2 100644 --- a/deps/chakrashim/core/bin/NativeTests/stdafx.h +++ b/deps/chakrashim/core/bin/NativeTests/stdafx.h @@ -23,6 +23,8 @@ #if defined(DBG) +#define DebugOnly(x) x + #define AssertMsg(exp, comment) \ do { \ if (!(exp)) \ @@ -41,4 +43,4 @@ if (!(exp)) \ #include "chakracore.h" #include "Core/CommonTypedefs.h" -#include +#include \ No newline at end of file diff --git a/deps/chakrashim/core/bin/ch/CMakeLists.txt b/deps/chakrashim/core/bin/ch/CMakeLists.txt index e15fcc1fb68..210ee6d4ed7 100644 --- a/deps/chakrashim/core/bin/ch/CMakeLists.txt +++ b/deps/chakrashim/core/bin/ch/CMakeLists.txt @@ -63,9 +63,9 @@ if(STATIC_LIBRARY) -Wl,-undefined,error ${LINKER_START_GROUP} ChakraCoreStatic + ${ICULIB} ${LINKER_END_GROUP} dl - ${ICULIB} ) if(CC_TARGET_OS_OSX) diff --git a/deps/chakrashim/core/bin/ch/ChakraRtInterface.cpp b/deps/chakrashim/core/bin/ch/ChakraRtInterface.cpp index 5102cd487da..191fa1c499f 100644 --- a/deps/chakrashim/core/bin/ch/ChakraRtInterface.cpp +++ b/deps/chakrashim/core/bin/ch/ChakraRtInterface.cpp @@ -6,6 +6,7 @@ #ifdef _WIN32 LPCSTR chakraDllName = "chakracore.dll"; +LPCWSTR chakraDllNameW = _u("chakracore.dll"); #else #include #ifdef __APPLE__ @@ -23,10 +24,12 @@ ChakraRTInterface::ArgInfo* ChakraRTInterface::m_argInfo = nullptr; TestHooks ChakraRTInterface::m_testHooks = { 0 }; JsAPIHooks ChakraRTInterface::m_jsApiHooks = { 0 }; -LPCSTR GetChakraDllName() +#ifdef _WIN32 +LPCWSTR GetChakraDllNameW() { - return chakraDllName; + return chakraDllNameW; } +#endif // Wrapper functions to abstract out loading ChakraCore // and resolving its symbols diff --git a/deps/chakrashim/core/bin/ch/ChakraRtInterface.h b/deps/chakrashim/core/bin/ch/ChakraRtInterface.h index e224cee5185..6dbc3f77bd2 100644 --- a/deps/chakrashim/core/bin/ch/ChakraRtInterface.h +++ b/deps/chakrashim/core/bin/ch/ChakraRtInterface.h @@ -8,7 +8,7 @@ struct JsAPIHooks { typedef JsErrorCode (WINAPI *JsrtCreateRuntimePtr)(JsRuntimeAttributes attributes, JsThreadServiceCallback threadService, JsRuntimeHandle *runtime); typedef JsErrorCode (WINAPI *JsrtCreateContextPtr)(JsRuntimeHandle runtime, JsContextRef *newContext); - typedef JsErrorCode(WINAPI *JsrtSetObjectBeforeCollectCallbackPtr)(JsRef ref, void* callbackState, JsObjectBeforeCollectCallback objectBeforeCollectCallback); + typedef JsErrorCode (WINAPI *JsrtSetObjectBeforeCollectCallbackPtr)(JsRef ref, void* callbackState, JsObjectBeforeCollectCallback objectBeforeCollectCallback); typedef JsErrorCode (WINAPI *JsrtSetRuntimeMemoryLimitPtr)(JsRuntimeHandle runtime, size_t memoryLimit); typedef JsErrorCode (WINAPI *JsrtSetCurrentContextPtr)(JsContextRef context); typedef JsErrorCode (WINAPI *JsrtGetCurrentContextPtr)(JsContextRef* context); @@ -16,6 +16,7 @@ struct JsAPIHooks typedef JsErrorCode (WINAPI *JsrtCreateObjectPtr)(JsValueRef *object); typedef JsErrorCode (WINAPI *JsrtCreateExternalObjectPtr)(void* data, JsFinalizeCallback callback, JsValueRef *object); typedef JsErrorCode (WINAPI *JsrtCreateFunctionPtr)(JsNativeFunction nativeFunction, void *callbackState, JsValueRef *function); + typedef JsErrorCode (WINAPI *JsrtCreateEnhancedFunctionPtr)(JsEnhancedNativeFunction nativeFunction, JsValueRef metadata, void *callbackState, JsValueRef *function); typedef JsErrorCode (WINAPI *JsCreateNamedFunctionPtr)(JsValueRef name, JsNativeFunction nativeFunction, void *callbackState, JsValueRef *function); typedef JsErrorCode (WINAPI *JsrtSetPropertyPtr)(JsValueRef object, JsPropertyIdRef property, JsValueRef value, bool useStrictRules); typedef JsErrorCode (WINAPI *JsrtGetGlobalObjectPtr)(JsValueRef *globalObject); @@ -110,6 +111,7 @@ struct JsAPIHooks JsrtCreateObjectPtr pfJsrtCreateObject; JsrtCreateExternalObjectPtr pfJsrtCreateExternalObject; JsrtCreateFunctionPtr pfJsrtCreateFunction; + JsrtCreateEnhancedFunctionPtr pfJsrtCreateEnhancedFunction; JsCreateNamedFunctionPtr pfJsrtCreateNamedFunction; JsrtSetPropertyPtr pfJsrtSetProperty; JsrtGetGlobalObjectPtr pfJsrtGetGlobalObject; @@ -196,7 +198,9 @@ struct JsAPIHooks JsrtTTDReplayExecutionPtr pfJsrtTTDReplayExecution; }; -LPCSTR GetChakraDllName(); +#ifdef _WIN32 +LPCWSTR GetChakraDllNameW(); +#endif class ChakraRTInterface { @@ -316,6 +320,7 @@ class ChakraRTInterface static JsErrorCode WINAPI JsCreateObject(JsValueRef *object) { return HOOK_JS_API(CreateObject(object)); } static JsErrorCode WINAPI JsCreateExternalObject(void *data, JsFinalizeCallback callback, JsValueRef *object) { return HOOK_JS_API(CreateExternalObject(data, callback, object)); } static JsErrorCode WINAPI JsCreateFunction(JsNativeFunction nativeFunction, void *callbackState, JsValueRef *function) { return HOOK_JS_API(CreateFunction(nativeFunction, callbackState, function)); } + static JsErrorCode WINAPI JsCreateEnhancedFunction(JsEnhancedNativeFunction nativeFunction, JsValueRef metadata, void *callbackState, JsValueRef *function) { return HOOK_JS_API(CreateEnhancedFunction(nativeFunction, metadata, callbackState, function)); } static JsErrorCode WINAPI JsCreateNamedFunction(JsValueRef name, JsNativeFunction nativeFunction, void *callbackState, JsValueRef *function) { return HOOK_JS_API(CreateNamedFunction(name, nativeFunction, callbackState, function)); } static JsErrorCode WINAPI JsSetProperty(JsValueRef object, JsPropertyIdRef property, JsValueRef value, bool useStrictRules) { return HOOK_JS_API(SetProperty(object, property, value, useStrictRules)); } static JsErrorCode WINAPI JsGetGlobalObject(JsValueRef *globalObject) { return HOOK_JS_API(GetGlobalObject(globalObject)); } diff --git a/deps/chakrashim/core/bin/ch/DbgController.js b/deps/chakrashim/core/bin/ch/DbgController.js index cdad6e435d4..55c55d68a52 100644 --- a/deps/chakrashim/core/bin/ch/DbgController.js +++ b/deps/chakrashim/core/bin/ch/DbgController.js @@ -781,6 +781,44 @@ var controllerObj = (function () { 'sources': sources }); }, + dumpFunctionProperties: function (frameIdOrArrayOfIds = [0], expandLevel = 0) { + if (typeof frameIdOrArrayOfIds != "number" && !(frameIdOrArrayOfIds instanceof Array)) { + frameIdOrArrayOfIds = [0]; + } + if (typeof expandLevel != "number" || expandLevel < 0) { + expandLevel = 0; + } + let stackTrace = callHostFunction(hostDebugObject.JsDiagGetStackTrace); + let functionHandles = []; + let requestedFrameIndexes = []; + if (typeof frameIdOrArrayOfIds === "number") { + requestedFrameIndexes.push(frameIdOrArrayOfIds); + } else if (frameIdOrArrayOfIds instanceof Array) { + frameIdOrArrayOfIds.forEach((s) => { + if (typeof s === "number") { + requestedFrameIndexes.push(s); + } + }); + } + if (requestedFrameIndexes.length == 0) { + requestedFrameIndexes.push(0); + } + + stackTrace.forEach((stackFrame) => { + let stackFrameIndex = stackFrame.index; + if (requestedFrameIndexes.includes(stackFrameIndex) && !functionHandles.includes(stackFrame.functionHandle)) { + functionHandles.push(stackFrame.functionHandle); + } + }); + + let functionProperties = []; + functionHandles.forEach((handle) => { + functionProperties.push(GetChild({ handle: handle }, expandLevel)); + }); + recordEvent({ + 'functionProperties': functionProperties + }); + }, trace: function (traceFlag) { _trace |= traceFlag; } @@ -925,6 +963,9 @@ function dumpBreak() { function dumpSourceList() { controllerObj.pushCommand(controllerObj.debuggerCommands.dumpSourceList, arguments); } +function dumpFunctionProperties() { + controllerObj.pushCommand(controllerObj.debuggerCommands.dumpFunctionProperties, arguments); +} // Start internal tracing. E.g.: /**bp:trace(TRACE_COMMANDS)**/ function trace() { diff --git a/deps/chakrashim/core/bin/ch/Helpers.cpp b/deps/chakrashim/core/bin/ch/Helpers.cpp index 1b5108a3a07..a09790a50e3 100644 --- a/deps/chakrashim/core/bin/ch/Helpers.cpp +++ b/deps/chakrashim/core/bin/ch/Helpers.cpp @@ -3,34 +3,45 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "stdafx.h" - #include +#define MAX_URI_LENGTH 512 + //TODO: x-plat definitions #ifdef _WIN32 -#define MAX_URI_LENGTH 512 +#define TTD_MAX_FILE_LENGTH MAX_PATH #define TTD_HOST_PATH_SEP "\\" +#else +#define TTD_MAX_FILE_LENGTH MAX_URI_LENGTH +#define TTD_HOST_PATH_SEP "/" +#endif void TTDHostBuildCurrentExeDirectory(char* path, size_t* pathLength, size_t bufferLength) { - wchar exePath[MAX_PATH]; - GetModuleFileName(NULL, exePath, MAX_PATH); + char exePath[TTD_MAX_FILE_LENGTH]; + PlatformAgnostic::SystemInfo::GetBinaryLocation(exePath, TTD_MAX_FILE_LENGTH); - size_t i = wcslen(exePath) - 1; - while(exePath[i] != _u('\\')) + size_t i = strlen(exePath) - 1; + while (exePath[i] != TTD_HOST_PATH_SEP[0] && i != 0) { --i; } - - if(i * 3 > bufferLength) + if (i == 0) { - printf("Don't overflow path buffer during conversion"); + fwprintf(stderr, _u("Can't get current exe directory")); exit(1); } - *pathLength = utf8::EncodeInto((LPUTF8)path, exePath, (charcount_t)(i + 1)); + if (i + 2 > bufferLength) + { + fwprintf(stderr, _u("Don't overflow path buffer during copy")); + exit(1); + } + memcpy_s(path, bufferLength, exePath, i + 1); + *pathLength = i + 1; path[*pathLength] = '\0'; } +#ifdef _WIN32 int TTDHostMKDir(const char* path, size_t pathLength) { char16 cpath[MAX_PATH]; @@ -38,7 +49,7 @@ int TTDHostMKDir(const char* path, size_t pathLength) if(MAX_PATH <= pathLength) //<= to account for null terminator { - printf("Don't overflow path buffer during conversion"); + wprintf(_u("Don't overflow path buffer during conversion")); exit(1); } utf8::DecodeUnitsIntoAndNullTerminate(cpath, pathbase, pathbase + pathLength); @@ -53,7 +64,7 @@ JsTTDStreamHandle TTDHostOpen(size_t pathLength, const char* path, bool isWrite) if(MAX_PATH <= pathLength) //<= to account for null terminator { - printf("Don't overflow path buffer during conversion"); + wprintf(_u("Don't overflow path buffer during conversion")); exit(1); } utf8::DecodeUnitsIntoAndNullTerminate(wpath, pathbase, pathbase + pathLength); @@ -67,64 +78,128 @@ JsTTDStreamHandle TTDHostOpen(size_t pathLength, const char* path, bool isWrite) #define TTDHostRead(buff, size, handle) fread_s(buff, size, 1, size, (FILE*)handle); #define TTDHostWrite(buff, size, handle) fwrite(buff, 1, size, (FILE*)handle) #else +int TTDHostMKDir(const char* path, size_t pathLength) +{ + return mkdir(path, 0700); +} -#ifdef __APPLE__ -#include -#else -#include +JsTTDStreamHandle TTDHostOpen(size_t pathLength, const char* path, bool isWrite) +{ + return (JsTTDStreamHandle)fopen(path, isWrite ? "w+b" : "r+b"); +} + +#define TTDHostRead(buff, size, handle) fread(buff, 1, size, (FILE*)handle) +#define TTDHostWrite(buff, size, handle) fwrite(buff, 1, size, (FILE*)handle) #endif -#define MAX_URI_LENGTH 512 -#define TTD_HOST_PATH_SEP "/" -void TTDHostBuildCurrentExeDirectory(char* path, size_t* pathLength, size_t bufferLength) +int GetPathNameLocation(LPCSTR filename) { - char exePath[MAX_URI_LENGTH]; - //TODO: xplattodo move this logic to PAL - #ifdef __APPLE__ - uint32_t tmpPathSize = sizeof(exePath); - _NSGetExecutablePath(exePath, &tmpPathSize); - size_t i = strlen(exePath) - 1; - #else - size_t i = readlink("/proc/self/exe", exePath, MAX_URI_LENGTH) - 1; - #endif + int filenameLength = (int) strlen(filename); + int pos; - while(exePath[i] != '/') + if (filenameLength <= 0) { - --i; + return -1; } - *pathLength = i + 1; - if(*pathLength > bufferLength) + for (pos = filenameLength - 1; pos >= 0; pos--) { - printf("Don't overflow path buffer during copy."); - exit(1); + char ch = filename[pos]; + if (ch == '/' || ch == '\\') break; } - memcpy_s(path, bufferLength, exePath, *pathLength); + return pos; } -int TTDHostMKDir(const char* path, size_t pathLength) +inline void pathcpy(char * target, LPCSTR src, uint length) { - return mkdir(path, 0700); +#ifndef _WIN32 + for (int i = 0; i < length; i++) + { + if (src[i] == '\\') + { + target[i] = '/'; + } + else + { + target[i] = src[i]; + } + } +#else + memcpy(target, src, length); +#endif } -JsTTDStreamHandle TTDHostOpen(size_t pathLength, const char* path, bool isWrite) +uint ConcatPath(LPCSTR filenameLeft, uint posPathSep, LPCSTR filenameRight, char* buffer, uint bufferLength) { - return (JsTTDStreamHandle)fopen(path, isWrite ? "w+b" : "r+b"); -} + int filenameRightLength = (int) strlen(filenameRight); -#define TTDHostRead(buff, size, handle) fread(buff, 1, size, (FILE*)handle) -#define TTDHostWrite(buff, size, handle) fwrite(buff, 1, size, (FILE*)handle) -#endif + // [ path[/] ] + [filename] + /0 + uint totalLength = posPathSep + filenameRightLength + 1; + if (buffer == nullptr) + { + return totalLength; + } + + if (bufferLength < totalLength) + { + fprintf(stderr, "Error: file path is too long.\n"); + return (uint)-1; + } -HRESULT Helpers::LoadScriptFromFile(LPCSTR filename, LPCSTR& contents, UINT* lengthBytesOut /*= nullptr*/) + pathcpy(buffer, filenameLeft, posPathSep); + buffer += posPathSep; + pathcpy(buffer, filenameRight, filenameRightLength); + buffer += filenameRightLength; + buffer[0] = char(0); + return totalLength; +} + +HRESULT Helpers::LoadScriptFromFile(LPCSTR filenameToLoad, LPCSTR& contents, UINT* lengthBytesOut /*= nullptr*/) { + static char sHostApplicationPathBuffer[MAX_URI_LENGTH]; + static uint sHostApplicationPathBufferLength = (uint) -1; + char combinedPathBuffer[MAX_URI_LENGTH]; + HRESULT hr = S_OK; BYTE * pRawBytes = nullptr; UINT lengthBytes = 0; contents = nullptr; FILE * file = NULL; + LPCSTR filename = filenameToLoad; + if (sHostApplicationPathBufferLength == (uint)-1) + { + // consider incoming filename as the host app and base its' path for others + sHostApplicationPathBufferLength = GetPathNameLocation(filename); + if (sHostApplicationPathBufferLength == -1) + { + // host app has no path info. (it must be located on current folder!) + sHostApplicationPathBufferLength = 0; + } + else + { + sHostApplicationPathBufferLength += 1; + Assert(sHostApplicationPathBufferLength < MAX_URI_LENGTH); + // save host app's path and fix the path separator for platform + pathcpy(sHostApplicationPathBuffer, filename, sHostApplicationPathBufferLength); + } + sHostApplicationPathBuffer[sHostApplicationPathBufferLength] = char(0); + } + else if (filename[0] != '/' && filename[0] != '\\') // make sure it's not a full path + { + // concat host path and filename + uint len = ConcatPath(sHostApplicationPathBuffer, sHostApplicationPathBufferLength, + filename, combinedPathBuffer, MAX_URI_LENGTH); + + if (len == (uint)-1) + { + hr = E_FAIL; + goto Error; + } + filename = combinedPathBuffer; + } + // // Open the file as a binary file to prevent CRT from handling encoding, line-break conversions, // etc. @@ -135,7 +210,7 @@ HRESULT Helpers::LoadScriptFromFile(LPCSTR filename, LPCSTR& contents, UINT* len { #ifdef _WIN32 DWORD lastError = GetLastError(); - char16 wszBuff[512]; + char16 wszBuff[MAX_URI_LENGTH]; fprintf(stderr, "Error in opening file '%s' ", filename); wszBuff[0] = 0; if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, @@ -191,6 +266,9 @@ HRESULT Helpers::LoadScriptFromFile(LPCSTR filename, LPCSTR& contents, UINT* len // wrongly classified as ANSI // { +#pragma warning(push) +// suppressing prefast warning that "readable size is bufferLength bytes but 2 may be read" as bufferLength is clearly > 2 in the code that follows +#pragma warning(disable:6385) C_ASSERT(sizeof(WCHAR) == 2); if (bufferLength > 2) { @@ -211,6 +289,7 @@ HRESULT Helpers::LoadScriptFromFile(LPCSTR filename, LPCSTR& contents, UINT* len #pragma prefast(pop) } } +#pragma warning(pop) } contents = reinterpret_cast(pRawBytes); @@ -336,7 +415,7 @@ HRESULT Helpers::LoadBinaryFile(LPCSTR filename, LPCSTR& contents, UINT& lengthB fprintf(stderr, "Error in opening file '%s' ", filename); #ifdef _WIN32 DWORD lastError = GetLastError(); - char16 wszBuff[512]; + char16 wszBuff[MAX_URI_LENGTH]; wszBuff[0] = 0; if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, @@ -351,7 +430,7 @@ HRESULT Helpers::LoadBinaryFile(LPCSTR filename, LPCSTR& contents, UINT& lengthB #endif fprintf(stderr, "\n"); } - return E_FAIL; + return E_FAIL; } // file will not be nullptr if _wfopen_s succeeds __analysis_assume(file != nullptr); @@ -415,8 +494,8 @@ void Helpers::CreateTTDDirectoryAsNeeded(size_t* uriLength, char* uri, const cha { if(*uriLength + strlen(asciiDir1) + wcslen(asciiDir2) + 2 > MAX_URI_LENGTH || strlen(asciiDir1) >= MAX_TTD_ASCII_PATH_EXT_LENGTH || wcslen(asciiDir2) >= MAX_TTD_ASCII_PATH_EXT_LENGTH) { - printf("We assume bounded MAX_URI_LENGTH for simplicity.\n"); - printf("%s, %s, %ls\n", uri, asciiDir1, asciiDir2); + wprintf(_u("We assume bounded MAX_URI_LENGTH for simplicity.\n")); + wprintf(_u("%S, %S, %ls\n"), uri, asciiDir1, asciiDir2); exit(1); } @@ -426,8 +505,8 @@ void Helpers::CreateTTDDirectoryAsNeeded(size_t* uriLength, char* uri, const cha extLength = sprintf_s(uri + *uriLength, MAX_TTD_ASCII_PATH_EXT_LENGTH, "%s%s", asciiDir1, TTD_HOST_PATH_SEP); if(extLength == -1 || MAX_URI_LENGTH < (*uriLength) + extLength) { - printf("Failed directory extension 1.\n"); - printf("%s, %s, %ls\n", uri, asciiDir1, asciiDir2); + wprintf(_u("Failed directory extension 1.\n")); + wprintf(_u("%S, %S, %ls\n"), uri, asciiDir1, asciiDir2); exit(1); } *uriLength += extLength; @@ -445,7 +524,7 @@ void Helpers::CreateTTDDirectoryAsNeeded(size_t* uriLength, char* uri, const cha { if(asciiDir2[i] > CHAR_MAX) { - printf("Test directory names can only include ascii chars.\n"); + wprintf(_u("Test directory names can only include ascii chars.\n")); exit(1); } realAsciiDir2[i] = (char)asciiDir2[i]; @@ -454,8 +533,8 @@ void Helpers::CreateTTDDirectoryAsNeeded(size_t* uriLength, char* uri, const cha extLength = sprintf_s(uri + *uriLength, MAX_TTD_ASCII_PATH_EXT_LENGTH, "%s%s", realAsciiDir2, TTD_HOST_PATH_SEP); if(extLength == -1 || MAX_URI_LENGTH < *uriLength + extLength) { - printf("Failed directory create 2.\n"); - printf("%s, %s, %ls\n", uri, asciiDir1, asciiDir2); + wprintf(_u("Failed directory create 2.\n")); + wprintf(_u("%S, %S, %ls\n"), uri, asciiDir1, asciiDir2); exit(1); } *uriLength += extLength; @@ -481,7 +560,7 @@ JsTTDStreamHandle CALLBACK Helpers::TTCreateStreamCallback(size_t uriLength, con if(uriLength + asciiNameLength + 1 > MAX_URI_LENGTH) { - printf("We assume bounded MAX_URI_LENGTH for simplicity."); + wprintf(_u("We assume bounded MAX_URI_LENGTH for simplicity.")); exit(1); } diff --git a/deps/chakrashim/core/bin/ch/JITProcessManager.cpp b/deps/chakrashim/core/bin/ch/JITProcessManager.cpp index dbe03f3a94c..e03e9eaa07b 100644 --- a/deps/chakrashim/core/bin/ch/JITProcessManager.cpp +++ b/deps/chakrashim/core/bin/ch/JITProcessManager.cpp @@ -68,9 +68,9 @@ HRESULT JITProcessManager::CreateServerProcess(int argc, __in_ecount(argc) LPWST #pragma warning(suppress: 6386) // buffer overrun #ifdef ENABLE_DEBUG_CONFIG_OPTIONS - hr = StringCchCopyW(cmdLine, cmdLineSize, L"ch.exe -OOPCFGRegistration- -CheckOpHelpers -jitserver:"); + hr = StringCchCopyW(cmdLine, cmdLineSize, _u("ch.exe -OOPCFGRegistration- -CheckOpHelpers -jitserver:")); #else - hr = StringCchCopyW(cmdLine, cmdLineSize, L"ch.exe -jitserver:"); + hr = StringCchCopyW(cmdLine, cmdLineSize, _u("ch.exe -jitserver:")); #endif if (FAILED(hr)) { @@ -91,7 +91,7 @@ HRESULT JITProcessManager::CreateServerProcess(int argc, __in_ecount(argc) LPWST for (int i = 1; i < argc; ++i) { - hr = StringCchCatW(cmdLine, cmdLineSize, L" "); + hr = StringCchCatW(cmdLine, cmdLineSize, _u(" ")); if (FAILED(hr)) { return hr; diff --git a/deps/chakrashim/core/bin/ch/MessageQueue.h b/deps/chakrashim/core/bin/ch/MessageQueue.h index b75ca48f0f9..bc350806ec8 100644 --- a/deps/chakrashim/core/bin/ch/MessageQueue.h +++ b/deps/chakrashim/core/bin/ch/MessageQueue.h @@ -102,6 +102,16 @@ class SortedList } } + template + void RemoveAll(PredicateFn fn) + { + while (head != nullptr) + { + fn(head->data); + Remove(head); + } + } + bool IsEmpty() { return head == nullptr; @@ -229,10 +239,9 @@ class MessageQueue void RemoveAll() { - m_queue.Remove([](const ListEntry& entry) { + m_queue.RemoveAll([](const ListEntry& entry) { MessageBase* msg = entry.message; delete msg; - return true; }); } diff --git a/deps/chakrashim/core/bin/ch/WScriptJsrt.cpp b/deps/chakrashim/core/bin/ch/WScriptJsrt.cpp index 1af1b2a36d1..c34f1090658 100644 --- a/deps/chakrashim/core/bin/ch/WScriptJsrt.cpp +++ b/deps/chakrashim/core/bin/ch/WScriptJsrt.cpp @@ -70,8 +70,7 @@ DWORD_PTR WScriptJsrt::GetNextSourceContext() void WScriptJsrt::RegisterScriptDir(DWORD_PTR sourceContext, LPCSTR fullDirNarrow) { - char dir[_MAX_PATH]; - scriptDirMap[sourceContext] = std::string(GetDir(fullDirNarrow, dir)); + GetDir(fullDirNarrow, &scriptDirMap[sourceContext]); } bool WScriptJsrt::CreateArgumentsObject(JsValueRef *argsObject) @@ -206,7 +205,7 @@ JsValueRef WScriptJsrt::LoadScriptFileHelper(JsValueRef callee, JsValueRef *argu } else { - returnValue = LoadScript(callee, *fileName, fileContent, *scriptInjectType ? *scriptInjectType : "self", isSourceModule, WScriptJsrt::FinalizeFree); + returnValue = LoadScript(callee, *fileName, fileContent, *scriptInjectType ? *scriptInjectType : "self", isSourceModule, WScriptJsrt::FinalizeFree, true); } } } @@ -259,6 +258,7 @@ JsValueRef WScriptJsrt::LoadScriptHelper(JsValueRef callee, bool isConstructCall AutoString fileName; AutoString scriptInjectType; char fileNameBuffer[MAX_PATH]; + bool isFile = true; IfJsrtErrorSetGo(fileContent.Initialize(arguments[1])); // ExternalArrayBuffer Finalize will clean this up @@ -276,17 +276,21 @@ JsValueRef WScriptJsrt::LoadScriptHelper(JsValueRef callee, bool isConstructCall } } - if (!fileNameNarrow && isSourceModule) + if (!fileNameNarrow) { - sprintf_s(fileNameBuffer, MAX_PATH, "moduleScript%i.js", (int)sourceContext); - fileNameNarrow = fileNameBuffer; + isFile = false; + if (isSourceModule) + { + sprintf_s(fileNameBuffer, MAX_PATH, "moduleScript%i.js", (int)sourceContext); + fileNameNarrow = fileNameBuffer; + } } if (*fileContent) { // TODO: This is CESU-8. How to tell the engine? // TODO: How to handle this source (script) life time? - returnValue = LoadScript(callee, fileNameNarrow, *fileContent, *scriptInjectType ? *scriptInjectType : "self", isSourceModule, WScriptJsrt::FinalizeFree); + returnValue = LoadScript(callee, fileNameNarrow, *fileContent, *scriptInjectType ? *scriptInjectType : "self", isSourceModule, WScriptJsrt::FinalizeFree, isFile); } } @@ -333,15 +337,22 @@ JsErrorCode WScriptJsrt::InitializeModuleInfo(JsValueRef specifier, JsModuleReco return JsNoError; } -char* WScriptJsrt::GetDir(LPCSTR fullPathNarrow, __out_ecount(260) char* const fullDirNarrow) +void WScriptJsrt::GetDir(LPCSTR fullPathNarrow, std::string *fullDirNarrow) { - char dir[_MAX_DIR]; - _splitpath_s(fullPathNarrow, fullDirNarrow, _MAX_DRIVE, dir, _MAX_DIR, nullptr, 0, nullptr, 0); - strcat_s(fullDirNarrow, _MAX_PATH, dir); - return fullDirNarrow; + char fileDrive[_MAX_DRIVE]; + char fileDir[_MAX_DIR]; + + std::string result; + if (_splitpath_s(fullPathNarrow, fileDrive, _countof(fileDrive), fileDir, _countof(fileDir), nullptr, 0, nullptr, 0) == 0) + { + result += fileDrive; + result += fileDir; + } + + *fullDirNarrow = result; } -JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileContent, LPCSTR fullName) +JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileContent, LPCSTR fullName, bool isFile) { DWORD_PTR dwSourceCookie = WScriptJsrt::GetNextSourceContext(); JsModuleRecord requestModule = JS_INVALID_REFERENCE; @@ -369,8 +380,7 @@ JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileConten { if (fullName) { - char dir[_MAX_PATH]; - moduleDirMap[requestModule] = std::string(GetDir(fullName, dir)); + GetDir(fullName, &moduleDirMap[requestModule]); } moduleRecordMap[std::string(moduleRecordKey)] = requestModule; @@ -385,6 +395,15 @@ JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileConten // ParseModuleSource is sync, while additional fetch & evaluation are async. unsigned int fileContentLength = (fileContent == nullptr) ? 0 : (unsigned int)strlen(fileContent); + + if (isFile && fullName) + { + JsValueRef moduleUrl; + ChakraRTInterface::JsCreateString(fullName, strlen(fullName), &moduleUrl); + errorCode = ChakraRTInterface::JsSetModuleHostInfo(requestModule, JsModuleHostInfo_Url, moduleUrl); + IfJsrtErrorFail(errorCode, errorCode); + } + errorCode = ChakraRTInterface::JsParseModuleSource(requestModule, dwSourceCookie, (LPBYTE)fileContent, fileContentLength, JsParseModuleSourceFlags_DataIsUTF8, &errorObject); if ((errorCode != JsNoError) && errorObject != JS_INVALID_REFERENCE && fileContent != nullptr && !HostConfigFlags::flags.IgnoreScriptErrorCode) @@ -397,7 +416,7 @@ JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileConten JsValueRef WScriptJsrt::LoadScript(JsValueRef callee, LPCSTR fileName, - LPCSTR fileContent, LPCSTR scriptInjectType, bool isSourceModule, JsFinalizeCallback finalizeCallback) + LPCSTR fileContent, LPCSTR scriptInjectType, bool isSourceModule, JsFinalizeCallback finalizeCallback, bool isFile) { HRESULT hr = E_FAIL; JsErrorCode errorCode = JsNoError; @@ -414,7 +433,7 @@ JsValueRef WScriptJsrt::LoadScript(JsValueRef callee, LPCSTR fileName, IfJsrtErrorSetGo(ChakraRTInterface::JsGetRuntime(currentContext, &runtime)); if (fileName == nullptr) - { + { fileName = "script.js"; } @@ -427,7 +446,7 @@ JsValueRef WScriptJsrt::LoadScript(JsValueRef callee, LPCSTR fileName, // treated as a module source text instead of opening a new file. if (isSourceModule || (strcmp(scriptInjectType, "module") == 0)) { - errorCode = LoadModuleFromString(fileName, fileContent, fullPath); + errorCode = LoadModuleFromString(fileName, fileContent, fullPath, isFile); } else if (strcmp(scriptInjectType, "self") == 0) { @@ -802,7 +821,10 @@ bool WScriptJsrt::InstallObjectsOnObject(JsValueRef object, const char* name, JsValueRef propertyValueRef; JsPropertyIdRef propertyId; IfJsrtErrorFail(CreatePropertyIdFromString(name, &propertyId), false); - CreateNamedFunction(name, nativeFunction, &propertyValueRef); + if (!CreateNamedFunction(name, nativeFunction, &propertyValueRef)) + { + return false; + } IfJsrtErrorFail(ChakraRTInterface::JsSetProperty(object, propertyId, propertyValueRef, true), false); return true; @@ -981,7 +1003,7 @@ JsErrorCode WScriptJsrt::InitializeModuleCallbacks() bool WScriptJsrt::Uninitialize() { - // moduleRecordMap is a global std::map, its destructor may access overrided + // moduleRecordMap is a global std::map, its destructor may access overridden // "operator delete" / global HeapAllocator::Instance. Clear it manually here // to avoid worrying about global destructor order. moduleRecordMap.clear(); @@ -1343,7 +1365,7 @@ bool WScriptJsrt::PrintException(LPCSTR fileName, JsErrorCode jsErrorCode) int line; int column; - + IfJsrtErrorFail(CreatePropertyIdFromString("line", &linePropertyId), false); IfJsrtErrorFail(ChakraRTInterface::JsGetProperty(exception, linePropertyId, &lineProperty), false); IfJsrtErrorFail(ChakraRTInterface::JsNumberToInt(lineProperty, &line), false); @@ -1522,27 +1544,10 @@ HRESULT WScriptJsrt::ModuleMessage::Call(LPCSTR fileName) { LPCSTR fileContent = nullptr; AutoString specifierStr(specifier); - char fullPath[_MAX_PATH]; errorCode = specifierStr.GetError(); if (errorCode == JsNoError) { - std::string specifierFullPath; - if (this->moduleRecord) - { - auto moduleDirEntry = moduleDirMap.find(this->moduleRecord); - if (moduleDirEntry != moduleDirMap.end()) - { - specifierFullPath = moduleDirEntry->second; - } - } - - specifierFullPath += *specifierStr; - if (_fullpath(fullPath, specifierFullPath.c_str(), _MAX_PATH) == nullptr) - { - return JsErrorInvalidArgument; - } - - hr = Helpers::LoadScriptFromFile(fullPath, fileContent); + hr = Helpers::LoadScriptFromFile(*specifierStr, fileContent); if (FAILED(hr)) { @@ -1551,11 +1556,11 @@ HRESULT WScriptJsrt::ModuleMessage::Call(LPCSTR fileName) fprintf(stderr, "Couldn't load file.\n"); } - LoadScript(nullptr, fullPath, nullptr, "module", true, WScriptJsrt::FinalizeFree); + LoadScript(nullptr, *specifierStr, nullptr, "module", true, WScriptJsrt::FinalizeFree, false); } else { - LoadScript(nullptr, fullPath, fileContent, "module", true, WScriptJsrt::FinalizeFree); + LoadScript(nullptr, *specifierStr, fileContent, "module", true, WScriptJsrt::FinalizeFree, true); } } } @@ -1592,8 +1597,7 @@ JsErrorCode WScriptJsrt::FetchImportedModuleHelper(JsModuleRecord referencingMod JsErrorCode errorCode = ChakraRTInterface::JsInitializeModuleRecord(referencingModule, specifier, &moduleRecord); if (errorCode == JsNoError) { - char dir[_MAX_PATH]; - moduleDirMap[moduleRecord] = std::string(GetDir(fullPath, dir)); + GetDir(fullPath, &moduleDirMap[moduleRecord]); InitializeModuleInfo(specifier, moduleRecord); moduleRecordMap[std::string(fullPath)] = moduleRecord; ModuleMessage* moduleMessage = @@ -1659,10 +1663,13 @@ JsErrorCode WScriptJsrt::NotifyModuleReadyCallback(_In_opt_ JsModuleRecord refer if (HostConfigFlags::flags.TraceHostCallbackIsEnabled) { - printf("NotifyModuleReadyCallback(exception) %s\n", fileName.GetString()); + wprintf(_u("NotifyModuleReadyCallback(exception) %S\n"), fileName.GetString()); } - PrintException(*fileName, JsErrorScriptException); + // No need to print - just consume the exception + JsValueRef exception; + ChakraRTInterface::JsGetAndClearException(&exception); + exception; // unused } else { diff --git a/deps/chakrashim/core/bin/ch/WScriptJsrt.h b/deps/chakrashim/core/bin/ch/WScriptJsrt.h index 7eadfb55111..49a4d18bf7b 100644 --- a/deps/chakrashim/core/bin/ch/WScriptJsrt.h +++ b/deps/chakrashim/core/bin/ch/WScriptJsrt.h @@ -90,7 +90,7 @@ class WScriptJsrt #endif static bool PrintException(LPCSTR fileName, JsErrorCode jsErrorCode); - static JsValueRef LoadScript(JsValueRef callee, LPCSTR fileName, LPCSTR fileContent, LPCSTR scriptInjectType, bool isSourceModule, JsFinalizeCallback finalizeCallback); + static JsValueRef LoadScript(JsValueRef callee, LPCSTR fileName, LPCSTR fileContent, LPCSTR scriptInjectType, bool isSourceModule, JsFinalizeCallback finalizeCallback, bool isFile); static DWORD_PTR GetNextSourceContext(); static JsValueRef LoadScriptFileHelper(JsValueRef callee, JsValueRef *arguments, unsigned short argumentCount, bool isSourceModule); static JsValueRef LoadScriptHelper(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState, bool isSourceModule); @@ -100,7 +100,7 @@ class WScriptJsrt private: static bool CreateArgumentsObject(JsValueRef *argsObject); static bool CreateNamedFunction(const char*, JsNativeFunction callback, JsValueRef* functionVar); - static char* GetDir(LPCSTR fullPathNarrow, __out_ecount(260) char* const fullDirNarrow); + static void GetDir(LPCSTR fullPathNarrow, std::string *fullDirNarrow); static JsValueRef CALLBACK EchoCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState); static JsValueRef CALLBACK QuitCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState); static JsValueRef CALLBACK LoadScriptFileCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState); @@ -114,7 +114,7 @@ class WScriptJsrt static JsValueRef CALLBACK RequestAsyncBreakCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState); static JsValueRef CALLBACK EmptyCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState); - static JsErrorCode CALLBACK LoadModuleFromString(LPCSTR fileName, LPCSTR fileContent, LPCSTR fullName = nullptr); + static JsErrorCode CALLBACK LoadModuleFromString(LPCSTR fileName, LPCSTR fileContent, LPCSTR fullName = nullptr, bool isFile = false); static JsErrorCode CALLBACK InitializeModuleInfo(JsValueRef specifier, JsModuleRecord moduleRecord); static JsValueRef CALLBACK LoadBinaryFileCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState); diff --git a/deps/chakrashim/core/bin/ch/ch.cpp b/deps/chakrashim/core/bin/ch/ch.cpp index ad1743b0bae..808fda59083 100644 --- a/deps/chakrashim/core/bin/ch/ch.cpp +++ b/deps/chakrashim/core/bin/ch/ch.cpp @@ -4,10 +4,18 @@ //------------------------------------------------------------------------------------------------------- #include "stdafx.h" #include "Core/AtomLockGuids.h" -#include #ifdef _WIN32 #include #include +#include +#else +#include +#endif + +#ifdef __linux__ +#include +#elif defined(__APPLE__) +#include #endif unsigned int MessageBase::s_messageCount = 0; @@ -105,27 +113,30 @@ void __stdcall PrintChVersion() #ifdef _WIN32 void __stdcall PrintChakraCoreVersion() { - char filename[_MAX_PATH]; - char drive[_MAX_DRIVE]; - char dir[_MAX_DIR]; + char16 filename[_MAX_PATH]; + char16 drive[_MAX_DRIVE]; + char16 dir[_MAX_DIR]; - LPCSTR chakraDllName = GetChakraDllName(); + LPCWSTR chakraDllName = GetChakraDllNameW(); + char16 modulename[_MAX_PATH]; + if (!PlatformAgnostic::SystemInfo::GetBinaryLocation(modulename, _MAX_PATH)) + { + return; + } - char modulename[_MAX_PATH]; - GetModuleFileNameA(NULL, modulename, _MAX_PATH); - _splitpath_s(modulename, drive, _MAX_DRIVE, dir, _MAX_DIR, nullptr, 0, nullptr, 0); - _makepath_s(filename, drive, dir, chakraDllName, nullptr); + _wsplitpath_s(modulename, drive, _MAX_DRIVE, dir, _MAX_DIR, nullptr, 0, nullptr, 0); + _wmakepath_s(filename, drive, dir, chakraDllName, nullptr); UINT size = 0; LPBYTE lpBuffer = NULL; - DWORD verSize = GetFileVersionInfoSizeA(filename, NULL); + DWORD verSize = GetFileVersionInfoSizeW(filename, NULL); if (verSize != NULL) { LPSTR verData = new char[verSize]; - if (GetFileVersionInfoA(filename, NULL, verSize, verData) && - VerQueryValue(verData, _u("\\"), (VOID FAR * FAR *)&lpBuffer, &size) && + if (GetFileVersionInfoW(filename, NULL, verSize, verData) && + VerQueryValueW(verData, _u("\\"), (VOID FAR * FAR *)&lpBuffer, &size) && (size != 0)) { VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)lpBuffer; @@ -134,7 +145,7 @@ void __stdcall PrintChakraCoreVersion() // Doesn't matter if you are on 32 bit or 64 bit, // DWORD is always 32 bits, so first two revision numbers // come from dwFileVersionMS, last two come from dwFileVersionLS - printf("%s version %d.%d.%d.%d\n", + wprintf(_u("%s version %d.%d.%d.%d\n"), chakraDllName, (verInfo->dwFileVersionMS >> 16) & 0xffff, (verInfo->dwFileVersionMS >> 0) & 0xffff, @@ -305,7 +316,7 @@ static bool CHAKRA_CALLBACK DummyJsSerializedScriptLoadUtf8Source( return true; } -HRESULT RunScript(const char* fileName, LPCSTR fileContents, JsFinalizeCallback fileContentsFinalizeCallback, JsValueRef bufferValue, char *fullPath) +HRESULT RunScript(const char* fileName, LPCSTR fileContents, size_t fileLength, JsFinalizeCallback fileContentsFinalizeCallback, JsValueRef bufferValue, char *fullPath) { HRESULT hr = S_OK; MessageQueue * messageQueue = new MessageQueue(); @@ -430,7 +441,7 @@ HRESULT RunScript(const char* fileName, LPCSTR fileContents, JsFinalizeCallback { JsValueRef scriptSource; IfJsErrorFailLog(ChakraRTInterface::JsCreateExternalArrayBuffer((void*)fileContents, - (unsigned int)strlen(fileContents), + (unsigned int)fileLength, fileContentsFinalizeCallback, (void*)fileContents, &scriptSource)); #if ENABLE_TTD if(doTTRecord) @@ -522,26 +533,58 @@ HRESULT RunScript(const char* fileName, LPCSTR fileContents, JsFinalizeCallback static HRESULT CreateRuntime(JsRuntimeHandle *runtime) { HRESULT hr = E_FAIL; - IfJsErrorFailLog(ChakraRTInterface::JsCreateRuntime(jsrtAttributes, nullptr, runtime)); #ifndef _WIN32 - // On Posix, malloc may not return NULL even if there is no - // memory left. However, kernel will send SIGKILL to process - // in case we use that `not actually available` memory address. - // (See posix man malloc and OOM) - + // On Posix, malloc optimistically returns a non-null address without + // checking if it's actually able to back that allocation in memory + // Upon use of that address however, if the address space for that allocation + // can't be committed, the process is killed + // See the man page for malloc + // + // In order to avoid having to deal with this, we set the memory limit for the + // runtime to the size of the physical memory on the system + // TODO: + // We could move the following into its own platform agnostic API + // but in this case, this is a one-time call thats not applicable + // on Windows so decided to leave as is + // Additionally, we can probably do better than just limit to the physical memory + // size + +#if defined(__APPLE__) || defined(__linux__) size_t memoryLimit; - if (PlatformAgnostic::SystemInfo::GetTotalRam(&memoryLimit)) +#ifdef __APPLE__ + int totalRamHW[] = { CTL_HW, HW_MEMSIZE }; + size_t length = sizeof(memoryLimit); + if (sysctl(totalRamHW, 2, &memoryLimit, &length, NULL, 0) == -1) { - IfJsErrorFailLog(ChakraRTInterface::JsSetRuntimeMemoryLimit(*runtime, memoryLimit)); + memoryLimit = 0; } +#else + struct sysinfo sysInfo; + if (sysinfo(&sysInfo) == -1) + { + memoryLimit = 0; + } + else + { + memoryLimit = sysInfo.totalram; + } +#endif // __APPLE__ +#endif // __APPLE__ || __linux +#endif // !_WIN32 + + IfJsErrorFailLog(ChakraRTInterface::JsCreateRuntime(jsrtAttributes, nullptr, runtime)); + +#ifndef _WIN32 + IfJsErrorFailLog(ChakraRTInterface::JsSetRuntimeMemoryLimit(*runtime, memoryLimit)); #endif + hr = S_OK; Error: return hr; } -HRESULT CreateAndRunSerializedScript(const char* fileName, LPCSTR fileContents, JsFinalizeCallback fileContentsFinalizeCallback, char *fullPath) +HRESULT CreateAndRunSerializedScript(const char* fileName, LPCSTR fileContents, size_t fileLength, JsFinalizeCallback fileContentsFinalizeCallback, char *fullPath) { HRESULT hr = S_OK; JsRuntimeHandle runtime = JS_INVALID_RUNTIME_HANDLE; @@ -567,7 +610,7 @@ HRESULT CreateAndRunSerializedScript(const char* fileName, LPCSTR fileContents, } // This is our last call to use fileContents, so pass in the finalizeCallback - IfFailGo(RunScript(fileName, fileContents, fileContentsFinalizeCallback, bufferVal, fullPath)); + IfFailGo(RunScript(fileName, fileContents, fileLength, fileContentsFinalizeCallback, bufferVal, fullPath)); if(false) { @@ -619,7 +662,7 @@ HRESULT ExecuteTest(const char* fileName) IfJsErrorFailLog(ChakraRTInterface::JsTTDCreateContext(runtime, true, &context)); IfJsErrorFailLog(ChakraRTInterface::JsSetCurrentContext(context)); - IfFailGo(RunScript(fileName, fileContents, WScriptJsrt::FinalizeFree, nullptr, nullptr)); + IfFailGo(RunScript(fileName, fileContents, lengthBytes, WScriptJsrt::FinalizeFree, nullptr, nullptr)); unsigned int rcount = 0; IfJsErrorFailLog(ChakraRTInterface::JsSetCurrentContext(nullptr)); @@ -733,11 +776,11 @@ HRESULT ExecuteTest(const char* fileName) } else if (HostConfigFlags::flags.SerializedIsEnabled) { - CreateAndRunSerializedScript(fileName, fileContents, WScriptJsrt::FinalizeFree, fullPath); + CreateAndRunSerializedScript(fileName, fileContents, lengthBytes, WScriptJsrt::FinalizeFree, fullPath); } else { - IfFailGo(RunScript(fileName, fileContents, WScriptJsrt::FinalizeFree, nullptr, fullPath)); + IfFailGo(RunScript(fileName, fileContents, lengthBytes, WScriptJsrt::FinalizeFree, nullptr, fullPath)); } } Error: @@ -801,8 +844,8 @@ HRESULT ExecuteTestWithMemoryCheck(char* fileName) #ifdef _WIN32 bool HandleJITServerFlag(int& argc, _Inout_updates_to_(argc, argc) LPWSTR argv[]) { - LPCWSTR flag = L"-jitserver:"; - LPCWSTR flagWithoutColon = L"-jitserver"; + LPCWSTR flag = _u("-jitserver:"); + LPCWSTR flagWithoutColon = _u("-jitserver"); size_t flagLen = wcslen(flag); int i = 0; @@ -810,7 +853,7 @@ bool HandleJITServerFlag(int& argc, _Inout_updates_to_(argc, argc) LPWSTR argv[] { if (!_wcsicmp(argv[i], flagWithoutColon)) { - connectionUuidString = L""; + connectionUuidString = _u(""); break; } else if (!_wcsnicmp(argv[i], flag, flagLen)) @@ -818,7 +861,7 @@ bool HandleJITServerFlag(int& argc, _Inout_updates_to_(argc, argc) LPWSTR argv[] connectionUuidString = argv[i] + flagLen; if (wcslen(connectionUuidString) == 0) { - fwprintf(stdout, L"[FAILED]: must pass a UUID to -jitserver:\n"); + fwprintf(stdout, _u("[FAILED]: must pass a UUID to -jitserver:\n")); return false; } else @@ -851,7 +894,7 @@ int _cdecl RunJITServer(int argc, __in_ecount(argc) LPWSTR argv[]) if (!success) { - wprintf(L"\nDll load failed\n"); + wprintf(_u("\nDll load failed\n")); return ERROR_DLL_INIT_FAILED; } @@ -866,7 +909,7 @@ int _cdecl RunJITServer(int argc, __in_ecount(argc) LPWSTR argv[]) status = initRpcServer(&connectionUuid, nullptr, nullptr); if (FAILED(status)) { - wprintf(L"InitializeJITServer failed by 0x%x\n", status); + wprintf(_u("InitializeJITServer failed by 0x%x\n"), status); goto cleanup; } status = 0; @@ -907,6 +950,17 @@ int _cdecl wmain(int argc, __in_ecount(argc) LPWSTR argv[]) #endif #ifdef _WIN32 + // Set the output mode of stdout so we can display non-ASCII characters on the console and redirect to file as UTF-8 + { + int result = _setmode(_fileno(stdout), _O_U8TEXT); // set stdout to UTF-8 mode + if (result == -1) + { + // Failed to set mode. Undefined behavior may result, so exit now. + wprintf(_u("Failed to set output stream mode. Exiting...\n")); + return EXIT_FAILURE; + } + } + bool runJITServer = HandleJITServerFlag(argc, argv); #endif int retval = -1; @@ -1102,6 +1156,12 @@ int _cdecl wmain(int argc, __in_ecount(argc) LPWSTR argv[]) } delete[] argv; argv = nullptr; +#ifdef NO_SANITIZE_ADDRESS_CHECK + pthread_exit(&retval); +#else + return retval; #endif +#else return retval; +#endif } diff --git a/deps/chakrashim/core/bin/ch/stdafx.h b/deps/chakrashim/core/bin/ch/stdafx.h index 91aa021c13d..0339a5ad300 100644 --- a/deps/chakrashim/core/bin/ch/stdafx.h +++ b/deps/chakrashim/core/bin/ch/stdafx.h @@ -24,17 +24,11 @@ #define IfFalseGo(expr) do { if(!(expr)) { hr = E_FAIL; goto Error; } } while(0) #define IfFalseGoLabel(expr, label) do { if(!(expr)) { hr = E_FAIL; goto label; } } while(0) -#define WIN32_LEAN_AND_MEAN 1 - #include "CommonDefines.h" #include #include -#ifdef _WIN32 -#include -#else #include -#endif // _WIN32 #include #ifdef _MSC_VER @@ -224,6 +218,7 @@ class AutoString if (errorCode == JsNoError) { *(data + length) = char(0); + this->length = length; } return errorCode; } diff --git a/deps/chakrashim/core/bin/rl/rl.cpp b/deps/chakrashim/core/bin/rl/rl.cpp index 0e4ebdf0138..c01f57c890e 100644 --- a/deps/chakrashim/core/bin/rl/rl.cpp +++ b/deps/chakrashim/core/bin/rl/rl.cpp @@ -369,6 +369,8 @@ unsigned NumberOfThreads = 0; TestList DirList, ExcludeDirList; BOOL FUserSpecifiedFiles = FALSE; BOOL FUserSpecifiedDirs = TRUE; +BOOL FNoProgramOutput = FALSE; +BOOL FOnlyAssertOutput = FALSE; BOOL FExcludeDirs = FALSE; BOOL FGenLst = FALSE; char *ResumeDir, *MatchDir; @@ -379,6 +381,7 @@ static const char *ProgramName; static const char *LogName; static const char *FullLogName; static const char *ResultsLogName; +static const char *TestTimeout; // Stores timeout in seconds for all tests // NOTE: this might be unused now static char TempPath[MAX_PATH] = ""; // Path for temporary files @@ -2966,6 +2969,21 @@ ParseArg( break; } + if (!_stricmp(&arg[1], "noprogramoutput")) { + FNoProgramOutput = TRUE; + break; + } + + if (!_stricmp(&arg[1], "onlyassertoutput")) { + FOnlyAssertOutput = TRUE; + break; + } + + if (!_stricmp(&arg[1], "timeout")) { + TestTimeout = ComplainIfNoArg(arg, s); + break; + } + #ifndef NODEBUG if (!_stricmp(&arg[1], "debug")) { FDebug = FVerbose = TRUE; @@ -3568,11 +3586,15 @@ GetTestInfoFromNode childNode->Dump(); return FALSE; } - } - + } } } + if (i == TIK_TIMEOUT && TestTimeout != NULL) + { + // Overriding the timeout value with the command line value + testInfo->data[i] = TestTimeout; + } } return TRUE; @@ -5048,7 +5070,11 @@ main(int argc, char *argv[]) sprintf_s(fullCfg, "%s\\%s", pDir->fullPath, CFGfile); status = ProcessConfig(&TestList, fullCfg, Mode); - if (status != PCS_ERROR) + if (status == PCS_ERROR) + { + exit(1); + } + else { #ifndef NODEBUG diff --git a/deps/chakrashim/core/bin/rl/rl.h b/deps/chakrashim/core/bin/rl/rl.h index c85e462ec74..4c609168760 100644 --- a/deps/chakrashim/core/bin/rl/rl.h +++ b/deps/chakrashim/core/bin/rl/rl.h @@ -871,6 +871,8 @@ extern BOOL FSyncEnumDirs; extern BOOL FNogpfnt; extern BOOL FTest; extern BOOL FAppendTestNameToExtraCCFlags; +extern BOOL FNoProgramOutput; +extern BOOL FOnlyAssertOutput; #define MAXOPTIONS 60 extern const char *OptFlags[MAXOPTIONS + 1], *PogoOptFlags[MAXOPTIONS + 1]; diff --git a/deps/chakrashim/core/bin/rl/rl.vcxproj b/deps/chakrashim/core/bin/rl/rl.vcxproj index 0c02d7cd9d2..9e1a16f414c 100644 --- a/deps/chakrashim/core/bin/rl/rl.vcxproj +++ b/deps/chakrashim/core/bin/rl/rl.vcxproj @@ -27,6 +27,7 @@ xmllite.lib; $(NoThrowNewLib) + %(AdditionalLibraryDirectories);$(SdkLibPath) diff --git a/deps/chakrashim/core/bin/rl/rlrun.cpp b/deps/chakrashim/core/bin/rl/rlrun.cpp index b0b1d8ff6f8..857d06bc9d9 100644 --- a/deps/chakrashim/core/bin/rl/rlrun.cpp +++ b/deps/chakrashim/core/bin/rl/rlrun.cpp @@ -141,7 +141,7 @@ void else { int fd = _fileno(fp); struct _stat64 fileStats; - if(fd != -1 && _fstat64(fd, &fileStats) != -1) + if (fd != -1 && _fstat64(fd, &fileStats) != -1) { char creationTime[256]; char accessTime[256]; @@ -151,7 +151,7 @@ void _ctime64_s(creationTime, &fileStats.st_ctime); _ctime64_s(accessTime, &fileStats.st_atime); auto stripNewline = [](char *buf) { - if(char *ptr = strchr(buf, '\n')) + if (char *ptr = strchr(buf, '\n')) *ptr = '\0'; }; stripNewline(creationTime); @@ -160,17 +160,35 @@ void LogOut("ERROR: name of output file: %s; size: %I64d; creation: %s, last access: %s, now: %s", path, fileStats.st_size, creationTime, accessTime, currTime); } - LogOut("ERROR: bad output file follows ============"); - while (fgets(buf, BUFFER_SIZE, fp) != NULL) { - // Strip the newline, since LogOut adds one - p = strchr(buf, '\n'); - if (p != NULL) { - *p = '\0'; + if (!FNoProgramOutput) + { + bool printlines = !FOnlyAssertOutput; + if (printlines) + { + LogOut("ERROR: bad output file follows ============"); + } + while (fgets(buf, BUFFER_SIZE, fp) != NULL) { + // Strip the newline, since LogOut adds one + p = strchr(buf, '\n'); + if (p != NULL) { + *p = '\0'; + } + if (!printlines && strlen(buf) > 8 && buf[0] == 'A' && buf[1] == 'S' && buf[2] == 'S' && buf[3] == 'E' && buf[4] == 'R' && buf[5] == 'T') + { + printlines = true; + LogOut("ERROR: bad output file follows ============"); + } + if (printlines) + { + LogOut("%s", buf); + } + } + if (printlines) + { + LogOut("ERROR: end of bad output file ============"); } - LogOut("%s", buf); } fclose(fp); - LogOut("ERROR: end of bad output file ============"); } } diff --git a/deps/chakrashim/core/build.sh b/deps/chakrashim/core/build.sh index deba4bce592..d1b54aca731 100644 --- a/deps/chakrashim/core/build.sh +++ b/deps/chakrashim/core/build.sh @@ -47,11 +47,12 @@ PRINT_USAGE() { echo " --icu=PATH Path to ICU include folder (see example below)" echo " -j[=N], --jobs[=N] Multicore build, allow N jobs at once." echo " -n, --ninja Build with ninja instead of make." - echo " --no-icu Compile without unicode/icu support." + echo " --no-icu Compile without unicode/icu/intl support." echo " --no-jit Disable JIT" echo " --libs-only Do not build CH and GCStress" echo " --lto Enables LLVM Full LTO" echo " --lto-thin Enables LLVM Thin LTO - xcode 8+ or clang 3.9+" + echo " --lttng Enables LTTng support for ETW events" echo " --static Build as static library. Default: shared library" echo " --sanitize=CHECKS Build with clang -fsanitize checks," echo " e.g. undefined,signed-integer-overflow." @@ -60,7 +61,7 @@ PRINT_USAGE() { echo " --target-path[=S] Output path for compiled binaries. Default: out/" echo " --trace Enables experimental built-in trace." echo " --xcode Generate XCode project." - echo " --with-intl Include the Intl object (requires ICU)." + echo " --without-intl --icu arg also enables Intl by default. Disable it." echo " --without=FEATURE,FEATURE,..." echo " Disable FEATUREs from JSRT experimental features." echo " --valgrind Enable Valgrind support" @@ -104,6 +105,7 @@ OS_LINUX=0 OS_APT_GET=0 OS_UNIX=0 LTO="" +LTTNG="" TARGET_OS="" ENABLE_CC_XPLAT_TRACE="" WB_CHECK= @@ -117,14 +119,14 @@ LIBS_ONLY_BUILD= SHOULD_EMBED_ICU=0 ALWAYS_YES=0 -if [ -f "/proc/version" ]; then +UNAME_S=`uname -s` +if [[ $UNAME_S =~ 'Linux' ]]; then OS_LINUX=1 - PROC_INFO=$(cat /proc/version) - if [[ $PROC_INFO =~ 'Ubuntu' || $PROC_INFO =~ 'Debian' - || $PROC_INFO =~ 'Linaro' ]]; then + PROC_INFO=$(which apt-get) + if [[ ${#PROC_INFO} > 0 && -f "$PROC_INFO" ]]; then OS_APT_GET=1 fi -elif [[ $(uname -s) =~ "Darwin" ]]; then +elif [[ $UNAME_S =~ "Darwin" ]]; then OS_UNIX=1 else echo -e "Warning: Installation script couldn't detect host OS..\n" # exit ? @@ -230,6 +232,11 @@ while [[ $# -gt 0 ]]; do HAS_LTO=1 ;; + --lttng) + LTTNG="-DENABLE_JS_LTTNG_SH=1" + HAS_LTTNG=1 + ;; + -n | --ninja) CMAKE_GEN="-G Ninja" MAKE=ninja @@ -243,8 +250,8 @@ while [[ $# -gt 0 ]]; do NO_JIT="-DNO_JIT_SH=1" ;; - --with-intl) - INTL_ICU="-DINTL_ICU_SH=1" + --without-intl) + INTL_ICU="-DNOINTL_ICU_SH=1" ;; --xcode) @@ -272,18 +279,23 @@ while [[ $# -gt 0 ]]; do _TARGET_OS=$1 _TARGET_OS="${_TARGET_OS:9}" if [[ $_TARGET_OS =~ "android" ]]; then - OLD_PATH=$PATH - export TOOLCHAIN=$PWD/android-toolchain-arm + if [[ -z "$TOOLCHAIN" ]]; then + OLD_PATH=$PATH + export TOOLCHAIN=$PWD/android-toolchain-arm + export PATH=$TOOLCHAIN/bin:$OLD_PATH + export AR=arm-linux-androideabi-ar + export CC=arm-linux-androideabi-clang + export CXX=arm-linux-androideabi-clang++ + export LINK=arm-linux-androideabi-clang++ + export STRIP=arm-linux-androideabi-strip + # override CXX and CC + _CXX="${TOOLCHAIN}/bin/${CXX}" + _CC="${TOOLCHAIN}/bin/${CC}" + fi TARGET_OS="-DCC_TARGET_OS_ANDROID_SH=1 -DANDROID_TOOLCHAIN_DIR=${TOOLCHAIN}/arm-linux-androideabi" - export PATH=$TOOLCHAIN/bin:$OLD_PATH - export AR=arm-linux-androideabi-ar - export CC=arm-linux-androideabi-clang - export CXX=arm-linux-androideabi-clang++ - export LINK=arm-linux-androideabi-clang++ - export STRIP=arm-linux-androideabi-strip - # override CXX and CC - _CXX="${TOOLCHAIN}/bin/${CXX}" - _CC="${TOOLCHAIN}/bin/${CC}" + # inherit CXX and CC + _CXX="${CXX}" + _CC="${CC}" fi ;; @@ -511,6 +523,15 @@ else exit 1 fi fi +export TARGET_PATH + +if [[ $HAS_LTTNG == 1 ]]; then + CHAKRACORE_ROOT=`dirname $0` + python $CHAKRACORE_ROOT/tools/lttng.py --man $CHAKRACORE_ROOT/manifests/Microsoft-Scripting-Chakra-Instrumentation.man --intermediate $TARGET_PATH/intermediate + mkdir -p $TARGET_PATH/lttng + (diff -q $TARGET_PATH/intermediate/lttng/jscriptEtw.h $TARGET_PATH/lttng/jscriptEtw.h && echo "jscriptEtw.h up to date; skipping") || cp $TARGET_PATH/intermediate/lttng/* $TARGET_PATH/lttng/ +fi + BUILD_DIRECTORY="${TARGET_PATH}/${BUILD_TYPE:0}" echo "Build path: ${BUILD_DIRECTORY}" @@ -592,12 +613,13 @@ elif [[ $ARCH =~ "amd64" ]]; then ARCH="-DCC_TARGETS_AMD64_SH=1" echo "Compile Target : amd64" else + ARCH="-DCC_USES_SYSTEM_ARCH_SH=1" echo "Compile Target : System Default" fi echo Generating $BUILD_TYPE makefiles echo $EXTRA_DEFINES -cmake $CMAKE_GEN $CC_PREFIX $ICU_PATH $LTO $STATIC_LIBRARY $ARCH $TARGET_OS \ +cmake $CMAKE_GEN $CC_PREFIX $ICU_PATH $LTO $LTTNG $STATIC_LIBRARY $ARCH $TARGET_OS \ $ENABLE_CC_XPLAT_TRACE $EXTRA_DEFINES -DCMAKE_BUILD_TYPE=$BUILD_TYPE $SANITIZE $NO_JIT $INTL_ICU \ $WITHOUT_FEATURES $WB_FLAG $WB_ARGS $CMAKE_EXPORT_COMPILE_COMMANDS $LIBS_ONLY_BUILD\ $VALGRIND $BUILD_RELATIVE_DIRECTORY diff --git a/deps/chakrashim/core/jenkins/check_tabs.sh b/deps/chakrashim/core/jenkins/check_tabs.sh index 8ffeee2a843..152cee2efeb 100644 --- a/deps/chakrashim/core/jenkins/check_tabs.sh +++ b/deps/chakrashim/core/jenkins/check_tabs.sh @@ -21,6 +21,7 @@ git diff --name-only `git merge-base origin/master HEAD` HEAD | xargs grep -P -l "\t" | grep -v -E '^pal/' | grep -v -E '\Makefile$' | + grep -v -E '\Makefile.sample$' | grep -v -E '\.sln$' | grep -v -E '\.js$' | grep -v -E '\.baseline$' | diff --git a/deps/chakrashim/core/lib/Backend/Backend.h b/deps/chakrashim/core/lib/Backend/Backend.h index dcf3d58c41a..0a0073ce5e3 100644 --- a/deps/chakrashim/core/lib/Backend/Backend.h +++ b/deps/chakrashim/core/lib/Backend/Backend.h @@ -118,6 +118,7 @@ enum IRDumpFlags #include "JITTimeConstructorCache.h" #include "JITTypeHandler.h" #include "JITType.h" +#include "EquivalentTypeSet.h" #include "ObjTypeSpecFldInfo.h" #include "FunctionCodeGenJitTimeData.h" #include "ServerScriptContext.h" diff --git a/deps/chakrashim/core/lib/Backend/BackendApi.cpp b/deps/chakrashim/core/lib/Backend/BackendApi.cpp index 857ee1960fb..541a93d9fc2 100644 --- a/deps/chakrashim/core/lib/Backend/BackendApi.cpp +++ b/deps/chakrashim/core/lib/Backend/BackendApi.cpp @@ -75,6 +75,12 @@ RejitIRViewerFunction(NativeCodeGenerator *nativeCodeGen, Js::FunctionBody *fn, return nativeCodeGen->RejitIRViewerFunction(fn, scriptContext); } #endif +#ifdef ALLOW_JIT_REPRO +HRESULT JitFromEncodedWorkItem(NativeCodeGenerator *nativeCodeGen, _In_reads_(bufSize) const byte* buffer, _In_ uint bufferSize) +{ + return nativeCodeGen->JitFromEncodedWorkItem(buffer, bufferSize); +} +#endif void GenerateLoopBody(NativeCodeGenerator *nativeCodeGen, Js::FunctionBody *fn, Js::LoopHeader * loopHeader, Js::EntryPointInfo* info, uint localCount, Js::Var localSlots[]) @@ -137,8 +143,13 @@ void CheckIsExecutable(Js::RecyclableObject * function, Js::JavascriptMethod ent Js::ScriptContext * scriptContext = function->GetScriptContext(); // it's easy to call the default entry point from RecyclableObject. AssertMsg((Js::JavascriptFunction::Is(function) && Js::JavascriptFunction::FromVar(function)->IsExternalFunction()) - || Js::CrossSite::IsThunk(entrypoint) || !scriptContext->IsActuallyClosed() || - (scriptContext->GetThreadContext()->IsScriptActive() && !Js::JavascriptConversion::IsCallable(function)), + || Js::CrossSite::IsThunk(entrypoint) + // External object with entrypoint + || (!Js::JavascriptFunction::Is(function) + && function->IsExternal() + && Js::JavascriptConversion::IsCallable(function)) + || !scriptContext->IsActuallyClosed() + || (scriptContext->GetThreadContext()->IsScriptActive() && !Js::JavascriptConversion::IsCallable(function)), "Can't call function when the script context is closed"); if (scriptContext->GetThreadContext()->IsScriptActive()) diff --git a/deps/chakrashim/core/lib/Backend/BackendOpCodeAttrAsmJs.cpp b/deps/chakrashim/core/lib/Backend/BackendOpCodeAttrAsmJs.cpp index 5231ff3b87a..b647a421376 100644 --- a/deps/chakrashim/core/lib/Backend/BackendOpCodeAttrAsmJs.cpp +++ b/deps/chakrashim/core/lib/Backend/BackendOpCodeAttrAsmJs.cpp @@ -7,20 +7,13 @@ #ifdef ASMJS_PLAT namespace OpCodeAttrAsmJs { - // OpSideEffect: - // Opcode has side effect not just to the dst/src on the instruction. - // The opcode cannot be deadstored. (e.g. StFld, LdFld from DOM, call valueOf/toString/getter/setter) - // Doesn't include all "exit" script (e.g. LdThis doesn't have side effect for HostDispatch for exiting script to getting the name space parent) - // OpHasImplicitCall: - // Include all possible exit scripts, call valueOf/toString/getter/setter - // OpSerialized: - // Op is a serialized (indirected) variant of another op code enum OpCodeAttrEnum { None = 0, OpNoFallThrough = 1 << 0, // Opcode doesn't fallthrough in flow and its always jump to the return from this opcode. OpHasMultiSizeLayout = 1 << 1, - + OpHasProfiled = 1 << 2, + OpProfiled = 1 << 3 }; static const int OpcodeAttributesAsmJs[] = @@ -65,6 +58,14 @@ namespace OpCodeAttrAsmJs return CheckHasFlag( OpHasMultiSizeLayout ); } + bool HasProfiledOp(Js::OpCodeAsmJs opcode) + { + return ((GetOpCodeAttributes(opcode) & OpHasProfiled) != 0); + } + bool IsProfiledOp(Js::OpCodeAsmJs opcode) + { + return ((GetOpCodeAttributes(opcode) & OpProfiled) != 0); + } }; // OpCodeAttrAsmJs #endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/BackendOpCodeAttrAsmJs.h b/deps/chakrashim/core/lib/Backend/BackendOpCodeAttrAsmJs.h index ec1ef80f264..d267d7516f6 100644 --- a/deps/chakrashim/core/lib/Backend/BackendOpCodeAttrAsmJs.h +++ b/deps/chakrashim/core/lib/Backend/BackendOpCodeAttrAsmJs.h @@ -9,5 +9,7 @@ namespace OpCodeAttrAsmJs bool HasFallThrough(Js::OpCodeAsmJs opcode); // True if the opcode has a small/large layout bool HasMultiSizeLayout(Js::OpCodeAsmJs opcode); + bool HasProfiledOp(Js::OpCodeAsmJs opcode); + bool IsProfiledOp(Js::OpCodeAsmJs opcode); }; #endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/BackwardPass.cpp b/deps/chakrashim/core/lib/Backend/BackwardPass.cpp index 4193f4a19d3..ae70460d9f5 100644 --- a/deps/chakrashim/core/lib/Backend/BackwardPass.cpp +++ b/deps/chakrashim/core/lib/Backend/BackwardPass.cpp @@ -1609,9 +1609,9 @@ BackwardPass::ProcessBailOutArgObj(BailOutInfo * bailOutInfo, BVSparsetag != Js::BackwardPhase); - if (this->globOpt->TrackArgumentsObject() && bailOutInfo->capturedValues.argObjSyms) + if (this->globOpt->TrackArgumentsObject() && bailOutInfo->capturedValues->argObjSyms) { - FOREACH_BITSET_IN_SPARSEBV(symId, bailOutInfo->capturedValues.argObjSyms) + FOREACH_BITSET_IN_SPARSEBV(symId, bailOutInfo->capturedValues->argObjSyms) { if (byteCodeUpwardExposedUsed->TestAndClear(symId)) { @@ -1646,7 +1646,7 @@ BackwardPass::ProcessBailOutConstants(BailOutInfo * bailOutInfo, BVSparsecapturedValues.constantValues, iter) + FOREACH_SLISTBASE_ENTRY_EDITING(ConstantStackSymValue, value, &bailOutInfo->capturedValues->constantValues, iter) { if (byteCodeUpwardExposedUsed->TestAndClear(value.Key()->m_id) || bailoutReferencedArgSymsBv->TestAndClear(value.Key()->m_id)) { @@ -1682,7 +1682,7 @@ BackwardPass::ProcessBailOutCopyProps(BailOutInfo * bailOutInfo, BVSparse * upwardExposedUses = block->upwardExposedUses; // Find other copy prop that we need to restore - FOREACH_SLISTBASE_ENTRY_EDITING(CopyPropSyms, copyPropSyms, &bailOutInfo->capturedValues.copyPropSyms, iter) + FOREACH_SLISTBASE_ENTRY_EDITING(CopyPropSyms, copyPropSyms, &bailOutInfo->capturedValues->copyPropSyms, iter) { // Copy prop syms should be vars Assert(!copyPropSyms.Key()->IsTypeSpec()); @@ -1747,7 +1747,7 @@ BackwardPass::ProcessBailOutCopyProps(BailOutInfo * bailOutInfo, BVSparseliveFloat64Syms->Test(symId)) + else if(bailOutInfo->liveFloat64Syms->Test(symId)) { // Var/int32 version of the sym is not live, use the float64 version float64StackSym = stackSym->GetFloat64EquivSym(nullptr); @@ -5578,7 +5578,7 @@ BackwardPass::TrackIntUsage(IR::Instr *const instr) case Js::OpCode::Conv_Prim: Assert(dstSym); Assert(instr->GetSrc1()); - Assert(!instr->GetSrc2()); + Assert(!instr->GetSrc2() || instr->GetDst()->GetType() == instr->GetSrc1()->GetType()); if(instr->GetDst()->IsInt32()) { @@ -6554,8 +6554,6 @@ BackwardPass::ProcessDef(IR::Opnd * opnd) if (propertySym->m_fieldKind == PropertyKindLocalSlots || propertySym->m_fieldKind == PropertyKindSlots) { BOOLEAN isPropertySymUsed = !block->slotDeadStoreCandidates->TestAndSet(propertySym->m_id); - // we should not do any dead slots in asmjs loop body - Assert(!(this->func->GetJITFunctionBody()->IsAsmJsMode() && this->func->IsLoopBody() && !isPropertySymUsed)); Assert(isPropertySymUsed || !block->upwardExposedUses->Test(propertySym->m_id)); isUsed = isPropertySymUsed || block->upwardExposedUses->Test(propertySym->m_stackSym->m_id); @@ -7076,6 +7074,10 @@ BackwardPass::ProcessBailOnNoProfile(IR::Instr *instr, BasicBlock *block) { return false; } + if (this->currentRegion && (this->currentRegion->GetType() == RegionTypeCatch || this->currentRegion->GetType() == RegionTypeFinally)) + { + return false; + } IR::Instr *curInstr = instr->m_prev; @@ -7171,6 +7173,11 @@ BackwardPass::ProcessBailOnNoProfile(IR::Instr *instr, BasicBlock *block) continue; } + if (pred->GetFirstInstr()->AsLabelInstr()->GetRegion() != this->currentRegion) + { + break; + } + // If all successors of this predecessor start with a BailOnNoProfile, we should be // okay to hoist this bail to the predecessor. FOREACH_SUCCESSOR_BLOCK(predSucc, pred) @@ -7191,6 +7198,7 @@ BackwardPass::ProcessBailOnNoProfile(IR::Instr *instr, BasicBlock *block) IR::Instr *predInstr = pred->GetLastInstr(); IR::Instr *instrCopy = instr->Copy(); + if (predInstr->EndsBasicBlock()) { if (predInstr->m_prev->m_opcode == Js::OpCode::BailOnNoProfile) diff --git a/deps/chakrashim/core/lib/Backend/BailOut.cpp b/deps/chakrashim/core/lib/Backend/BailOut.cpp index a784a37008a..50c28e157a1 100644 --- a/deps/chakrashim/core/lib/Backend/BailOut.cpp +++ b/deps/chakrashim/core/lib/Backend/BailOut.cpp @@ -4,9 +4,11 @@ //------------------------------------------------------------------------------------------------------- #include "Backend.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DebuggingFlags.h" #include "Debug/DiagProbe.h" #include "Debug/DebugManager.h" +#endif #include "Language/JavascriptFunctionArgIndex.h" extern const IRType RegTypes[RegNumCount]; @@ -16,8 +18,12 @@ BailOutInfo::Clear(JitArenaAllocator * allocator) { // Currently, we don't have a case where we delete bailout info after we allocated the bailout record Assert(!bailOutRecord); - this->capturedValues.constantValues.Clear(allocator); - this->capturedValues.copyPropSyms.Clear(allocator); + if (this->capturedValues && this->capturedValues->DecrementRefCount() == 0) + { + this->capturedValues->constantValues.Clear(allocator); + this->capturedValues->copyPropSyms.Clear(allocator); + JitAdelete(allocator, this->capturedValues); + } this->usedCapturedValues.constantValues.Clear(allocator); this->usedCapturedValues.copyPropSyms.Clear(allocator); if (byteCodeUpwardExposedUsed) @@ -81,7 +87,7 @@ BailOutInfo::NeedsStartCallAdjust(uint i, const IR::Instr * bailOutInstr) const } void -BailOutInfo::RecordStartCallInfo(uint i, uint argRestoreAdjustCount, IR::Instr *instr) +BailOutInfo::RecordStartCallInfo(uint i, IR::Instr *instr) { Assert(i < this->startCallCount); Assert(this->startCallInfo); @@ -90,7 +96,8 @@ BailOutInfo::RecordStartCallInfo(uint i, uint argRestoreAdjustCount, IR::Instr * this->startCallInfo[i].instr = instr; this->startCallInfo[i].argCount = instr->GetArgOutCount(/*getInterpreterArgOutCount*/ true); - this->startCallInfo[i].argRestoreAdjustCount = argRestoreAdjustCount; + this->startCallInfo[i].argRestoreAdjustCount = 0; + this->startCallInfo[i].isOrphanedCall = false; } void @@ -122,7 +129,7 @@ BailOutInfo::GetStartCallOutParamCount(uint i) const } void -BailOutInfo::RecordStartCallInfo(uint i, uint argRestoreAdjust, IR::Instr *instr) +BailOutInfo::RecordStartCallInfo(uint i, IR::Instr *instr) { Assert(i < this->startCallCount); Assert(this->startCallInfo); @@ -1026,6 +1033,7 @@ BailOutRecord::RestoreValues(IR::BailOutKind bailOutKind, Js::JavascriptCallStac bool fromLoopBody, Js::Var * registerSaves, Js::InterpreterStackFrame * newInstance, Js::Var* pArgumentsObject, void * argoutRestoreAddress) const { bool isLocal = offsets == nullptr; + if (isLocal == true) { globalBailOutRecordTable->IterateGlobalBailOutRecordTableRows(m_bailOutRecordId, [=](GlobalBailOutRecordDataRow *row) { @@ -1069,7 +1077,15 @@ BailOutRecord::RestoreValues(IR::BailOutKind bailOutKind, Js::JavascriptCallStac this->IsOffsetNativeIntOrFloat(i, argOutSlotStart, &isFloat64, &isInt32, &isSimd128F4, &isSimd128I4, &isSimd128I8, &isSimd128I16, &isSimd128U4, &isSimd128U8, &isSimd128U16, &isSimd128B4, &isSimd128B8, &isSimd128B16); - +#ifdef _M_IX86 + if (this->argOutOffsetInfo->isOrphanedArgSlot->Test(argOutSlotStart + i)) + { + RestoreValue(bailOutKind, layout, values, scriptContext, fromLoopBody, registerSaves, newInstance, pArgumentsObject, + nullptr, i, offset, /* isLocal */ true, isFloat64, isInt32, isSimd128F4, isSimd128I4, isSimd128I8, + isSimd128I16, isSimd128U4, isSimd128U8, isSimd128U16, isSimd128B4, isSimd128B8, isSimd128B16); + continue; + } +#endif RestoreValue(bailOutKind, layout, values, scriptContext, fromLoopBody, registerSaves, newInstance, pArgumentsObject, argoutRestoreAddress, i, offset, false, isFloat64, isInt32, isSimd128F4, isSimd128I4, isSimd128I8, isSimd128I16, isSimd128U4, isSimd128U8, isSimd128U16, isSimd128B4, isSimd128B8, isSimd128B16); @@ -1284,7 +1300,13 @@ BailOutRecord::BailOutInlinedHelper(Js::JavascriptCallStackLayout * layout, Bail InlinedFrameLayout *inlinedFrame = (InlinedFrameLayout *)(((char *)layout) + currentBailOutRecord->globalBailOutRecordTable->firstActualStackOffset); Js::InlineeCallInfo inlineeCallInfo = inlinedFrame->callInfo; Assert((Js::ArgSlot)inlineeCallInfo.Count == currentBailOutRecord->actualCount); - Js::CallInfo callInfo(Js::CallFlags_Value, (Js::ArgSlot)inlineeCallInfo.Count); + + Js::CallFlags callFlags = Js::CallFlags_Value; + if (currentBailOutRecord->globalBailOutRecordTable->isInlinedConstructor) + { + callFlags |= Js::CallFlags_New; + } + Js::CallInfo callInfo(callFlags, (Js::ArgSlot)inlineeCallInfo.Count); Js::ScriptFunction ** functionRef = (Js::ScriptFunction **)&(inlinedFrame->function); AnalysisAssert(*functionRef); @@ -1395,6 +1417,7 @@ BailOutRecord::BailOutHelper(Js::JavascriptCallStackLayout * layout, Js::ScriptF // Clear the disable implicit call bit in case we bail from that region functionScriptContext->GetThreadContext()->ClearDisableImplicitFlags(); +#ifdef ENABLE_SCRIPT_DEBUGGING bool isInDebugMode = executeFunction->IsInDebugMode(); AssertMsg(!isInDebugMode || Js::Configuration::Global.EnableJitInDebugMode(), "In diag mode we can get here (function has to be JIT'ed) only when EnableJitInDiagMode is true!"); @@ -1465,6 +1488,8 @@ BailOutRecord::BailOutHelper(Js::JavascriptCallStackLayout * layout, Js::ScriptF } } } +#endif + #if defined(DBG_DUMP) || defined(ENABLE_DEBUG_CONFIG_OPTIONS) char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE]; #endif @@ -1528,7 +1553,7 @@ BailOutRecord::BailOutHelper(Js::JavascriptCallStackLayout * layout, Js::ScriptF size_t varAllocCount = setup.GetAllocationVarCount(); size_t varSizeInBytes = varAllocCount * sizeof(Js::Var); DWORD_PTR stackAddr = reinterpret_cast(&generator); // as mentioned above, use any stack address from this frame to ensure correct debugging functionality - Js::Var loopHeaderArray = executeFunction->GetHasAllocatedLoopHeaders() ? executeFunction->GetLoopHeaderArrayPtr() : nullptr; + Js::LoopHeader* loopHeaderArray = executeFunction->GetHasAllocatedLoopHeaders() ? executeFunction->GetLoopHeaderArrayPtr() : nullptr; allocation = RecyclerNewPlus(functionScriptContext->GetRecycler(), varSizeInBytes, Js::Var); @@ -1567,7 +1592,7 @@ BailOutRecord::BailOutHelper(Js::JavascriptCallStackLayout * layout, Js::ScriptF allocation = (Js::Var*)_alloca(varSizeInBytes); } - Js::Var loopHeaderArray = nullptr; + Js::LoopHeader* loopHeaderArray = nullptr; if (executeFunction->GetHasAllocatedLoopHeaders()) { @@ -1607,6 +1632,10 @@ BailOutRecord::BailOutHelper(Js::JavascriptCallStackLayout * layout, Js::ScriptF { newInstance->OrFlags(Js::InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall); } + if (isInlinee) + { + newInstance->OrFlags(Js::InterpreterStackFrameFlags_FromBailOutInInlinee); + } ThreadContext *threadContext = newInstance->GetScriptContext()->GetThreadContext(); @@ -1754,7 +1783,11 @@ BailOutRecord::BailOutHelper(Js::JavascriptCallStackLayout * layout, Js::ScriptF { // Following _AddressOfReturnAddress <= real address of "returnAddress". Suffices for RemoteStackWalker to test partially initialized interpreter frame. Js::InterpreterStackFrame::PushPopFrameHelper pushPopFrameHelper(newInstance, returnAddress, _AddressOfReturnAddress()); +#ifdef ENABLE_SCRIPT_DEBUGGING aReturn = isInDebugMode ? newInstance->DebugProcess() : newInstance->Process(); +#else + aReturn = newInstance->Process(); +#endif // Note: in debug mode we always have to bailout to debug thunk, // as normal interpreter thunk expects byte code compiled w/o debugging. } @@ -2755,7 +2788,9 @@ Js::Var BailOutRecord::BailOutForElidedYield(void * framePointer) Js::ScriptFunction ** functionRef = (Js::ScriptFunction **)&layout->functionObject; Js::ScriptFunction * function = *functionRef; Js::FunctionBody * executeFunction = function->GetFunctionBody(); +#ifdef ENABLE_SCRIPT_DEBUGGING bool isInDebugMode = executeFunction->IsInDebugMode(); +#endif Js::JavascriptGenerator* generator = static_cast(layout->args[0]); Js::InterpreterStackFrame* frame = generator->GetFrame(); @@ -2775,7 +2810,11 @@ Js::Var BailOutRecord::BailOutForElidedYield(void * framePointer) { // Following _AddressOfReturnAddress <= real address of "returnAddress". Suffices for RemoteStackWalker to test partially initialized interpreter frame. Js::InterpreterStackFrame::PushPopFrameHelper pushPopFrameHelper(frame, _ReturnAddress(), _AddressOfReturnAddress()); +#ifdef ENABLE_SCRIPT_DEBUGGING aReturn = isInDebugMode ? frame->DebugProcess() : frame->Process(); +#else + aReturn = frame->Process(); +#endif // Note: in debug mode we always have to bailout to debug thunk, // as normal interpreter thunk expects byte code compiled w/o debugging. } diff --git a/deps/chakrashim/core/lib/Backend/BailOut.h b/deps/chakrashim/core/lib/Backend/BailOut.h index 540d678812f..7f34c3f55d6 100644 --- a/deps/chakrashim/core/lib/Backend/BailOut.h +++ b/deps/chakrashim/core/lib/Backend/BailOut.h @@ -18,6 +18,7 @@ class BailOutInfo IR::Instr * instr; uint argCount; uint argRestoreAdjustCount; + bool isOrphanedCall; } StartCallInfo; #else typedef uint StartCallInfo; @@ -45,7 +46,8 @@ class BailOutInfo #if DBG wasCopied = false; #endif - this->capturedValues.argObjSyms = nullptr; + this->capturedValues = JitAnew(bailOutFunc->m_alloc, CapturedValues); + this->capturedValues->refCount = 1; this->usedCapturedValues.argObjSyms = nullptr; } void Clear(JitArenaAllocator * allocator); @@ -55,7 +57,7 @@ class BailOutInfo void FinalizeOffsets(__in_ecount(count) int * offsets, uint count, Func *func, BVSparse *bvInlinedArgSlot); #endif - void RecordStartCallInfo(uint i, uint argRestoreAdjustCount, IR::Instr *instr); + void RecordStartCallInfo(uint i, IR::Instr *instr); uint GetStartCallOutParamCount(uint i) const; #ifdef _M_IX86 bool NeedsStartCallAdjust(uint i, const IR::Instr * instr) const; @@ -81,7 +83,7 @@ class BailOutInfo #endif uint32 bailOutOffset; BailOutRecord * bailOutRecord; - CapturedValues capturedValues; // Values we know about after forward pass + CapturedValues* capturedValues; // Values we know about after forward pass CapturedValues usedCapturedValues; // Values that need to be restored in the bail out BVSparse * byteCodeUpwardExposedUsed; // Non-constant stack syms that needs to be restored in the bail out uint polymorphicCacheIndex; @@ -288,6 +290,9 @@ class BailOutRecord { BVFixed * argOutFloat64Syms; // Used for float-type-specialized ArgOut symbols. Index = [0 .. BailOutInfo::totalOutParamCount]. BVFixed * argOutLosslessInt32Syms; // Used for int-type-specialized ArgOut symbols (which are native int and for bailout we need tagged ints). +#ifdef _M_IX86 + BVFixed * isOrphanedArgSlot; +#endif #ifdef ENABLE_SIMDJS // SIMD_JS BVFixed * argOutSimd128F4Syms; @@ -310,6 +315,9 @@ class BailOutRecord { FixupNativeDataPointer(argOutFloat64Syms, chunkList); FixupNativeDataPointer(argOutLosslessInt32Syms, chunkList); +#ifdef _M_IX86 + FixupNativeDataPointer(isOrphanedArgSlot, chunkList); +#endif #ifdef ENABLE_SIMDJS FixupNativeDataPointer(argOutSimd128F4Syms, chunkList); FixupNativeDataPointer(argOutSimd128I4Syms, chunkList); diff --git a/deps/chakrashim/core/lib/Backend/BailOutKind.h b/deps/chakrashim/core/lib/Backend/BailOutKind.h index 00fb33dcd81..c072fe5565a 100644 --- a/deps/chakrashim/core/lib/Backend/BailOutKind.h +++ b/deps/chakrashim/core/lib/Backend/BailOutKind.h @@ -80,6 +80,7 @@ BAIL_OUT_KIND_VALUE(BailOutOnMulOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_ BAIL_OUT_KIND_VALUE(BailOutOnNegativeZero, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 2)) BAIL_OUT_KIND_VALUE(BailOutOnPowIntIntOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 3)) BAIL_OUT_KIND_VALUE(BailOutOnResultConditions, BailOutOnOverflow | BailOutOnMulOverflow | BailOutOnNegativeZero | BailOutOnPowIntIntOverflow) + // ================ // Array bits // ================ @@ -91,17 +92,8 @@ BAIL_OUT_KIND_VALUE(BailOutOnArrayAccessHelperCall, 1 << (BAIL_OUT_KIND_ARRAY_BI BAIL_OUT_KIND_VALUE(BailOutOnInvalidatedArrayHeadSegment, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 4)) BAIL_OUT_KIND_VALUE(BailOutOnInvalidatedArrayLength, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 5)) BAIL_OUT_KIND_VALUE(BailOnStackArgsOutOfActualsRange, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 6)) -BAIL_OUT_KIND_VALUE( - BailOutForArrayBits, - ( - BailOutOnMissingValue | - BailOutConventionalNativeArrayAccessOnly | - BailOutConvertedNativeArray | - BailOutOnArrayAccessHelperCall | - BailOutOnInvalidatedArrayHeadSegment | - BailOutOnInvalidatedArrayLength | - BailOnStackArgsOutOfActualsRange - )) +BAIL_OUT_KIND_VALUE( BailOutForArrayBits, ( BailOutOnMissingValue | BailOutConventionalNativeArrayAccessOnly | BailOutConvertedNativeArray | BailOutOnArrayAccessHelperCall | BailOutOnInvalidatedArrayHeadSegment | BailOutOnInvalidatedArrayLength | BailOnStackArgsOutOfActualsRange )) + // ================ // Debug bits // ================ @@ -123,8 +115,7 @@ BAIL_OUT_KIND_VALUE(BailOutExplicit, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 4)) BAIL_OUT_KIND_VALUE(BailOutStep, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 5)) BAIL_OUT_KIND_VALUE(BailOutIgnoreException, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 6)) -BAIL_OUT_KIND_VALUE(BailOutForDebuggerBits, BailOutForceByFlag | BailOutBreakPointInFunction | BailOutStackFrameBase | - BailOutLocalValueChanged | BailOutExplicit | BailOutStep | BailOutIgnoreException) +BAIL_OUT_KIND_VALUE(BailOutForDebuggerBits, BailOutForceByFlag | BailOutBreakPointInFunction | BailOutStackFrameBase | BailOutLocalValueChanged | BailOutExplicit | BailOutStep | BailOutIgnoreException) // ====================== // Div Src Condition Bits diff --git a/deps/chakrashim/core/lib/Backend/CMakeLists.txt b/deps/chakrashim/core/lib/Backend/CMakeLists.txt index aa8460865a5..66387cee575 100644 --- a/deps/chakrashim/core/lib/Backend/CMakeLists.txt +++ b/deps/chakrashim/core/lib/Backend/CMakeLists.txt @@ -15,6 +15,7 @@ add_library (Chakra.Backend OBJECT EhFrame.cpp EmitBuffer.cpp Encoder.cpp + EquivalentTypeSet.cpp FixedFieldInfo.cpp FlowGraph.cpp Func.cpp @@ -41,6 +42,7 @@ add_library (Chakra.Backend OBJECT IntBounds.cpp IntConstMath.cpp InterpreterThunkEmitter.cpp + JavascriptNativeOperators.cpp JITThunkEmitter.cpp JITOutput.cpp JITTimeConstructorCache.cpp diff --git a/deps/chakrashim/core/lib/Backend/Chakra.Backend.vcxproj b/deps/chakrashim/core/lib/Backend/Chakra.Backend.vcxproj index 2cec191daca..8b00a84524c 100644 --- a/deps/chakrashim/core/lib/Backend/Chakra.Backend.vcxproj +++ b/deps/chakrashim/core/lib/Backend/Chakra.Backend.vcxproj @@ -121,6 +121,11 @@ $(IntDir)\arm + + true + + $(IntDir)\arm64 + true @@ -128,19 +133,46 @@ true + + $(IntDir)\arm true + + $(IntDir)\arm - + true - - $(IntDir)\Arm64 + $(IntDir)\arm64 + + + true + $(IntDir)\arm64 true - $(IntDir)\Arm64 + $(IntDir)\arm64 + + + true + + $(IntDir)\arm64 + + + true + + $(IntDir)\arm64 + + + true + + $(IntDir)\arm64 + + + true + + $(IntDir)\arm64 @@ -150,6 +182,7 @@ + @@ -176,6 +209,7 @@ + @@ -222,7 +256,16 @@ - + + true + + + true + + + true + + true @@ -256,6 +299,7 @@ true + @@ -335,6 +379,9 @@ true + + true + true @@ -393,6 +440,7 @@ + @@ -422,6 +470,7 @@ + @@ -446,6 +495,10 @@ true $(IntDir)\x64 + + true + $(IntDir)\arm64 + true $(IntDir)\arm64 @@ -484,4 +537,4 @@ - + \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/Chakra.Backend.vcxproj.filters b/deps/chakrashim/core/lib/Backend/Chakra.Backend.vcxproj.filters index c59b619bd96..d1d16d795c0 100644 --- a/deps/chakrashim/core/lib/Backend/Chakra.Backend.vcxproj.filters +++ b/deps/chakrashim/core/lib/Backend/Chakra.Backend.vcxproj.filters @@ -57,6 +57,9 @@ arm + + arm64 + i386 @@ -66,9 +69,15 @@ arm + + arm64 + arm + + arm64 + amd64 @@ -84,12 +93,12 @@ amd64 - - arm64 - arm + + arm64 + amd64 @@ -99,15 +108,21 @@ arm + + arm64 + + + arm64 + arm + + arm64 + - - arm64 - @@ -131,6 +146,11 @@ + + + + arm64 + @@ -194,8 +214,14 @@ arm - - arm + + arm64 + + + arm64 + + + arm64 arm @@ -215,6 +241,9 @@ arm + + arm64 + amd64 @@ -224,6 +253,9 @@ arm + + arm64 + i386 @@ -236,6 +268,9 @@ arm + + arm64 + amd64 @@ -245,24 +280,18 @@ arm - - arm64 - amd64 - - arm64 - arm + + arm64 + amd64 - - arm64 - i386 @@ -290,14 +319,11 @@ arm - - amd64 - arm64 - - arm64 + + amd64 amd64 @@ -305,21 +331,21 @@ arm - - arm64 - - + arm64 arm - + arm64 arm + + arm64 + @@ -347,6 +373,15 @@ + + + + + arm64 + + + arm64 + @@ -385,11 +420,14 @@ arm + + arm + arm64 - - arm + + arm64 \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/CodeGenAllocators.cpp b/deps/chakrashim/core/lib/Backend/CodeGenAllocators.cpp index a8fdd7509a5..2b9ea54012b 100644 --- a/deps/chakrashim/core/lib/Backend/CodeGenAllocators.cpp +++ b/deps/chakrashim/core/lib/Backend/CodeGenAllocators.cpp @@ -9,7 +9,7 @@ CodeGenAllocators::CodeGenAllocators(AllocationPolicy : pageAllocator(policyManager, Js::Configuration::Global.flags, PageAllocatorType_BGJIT, 0) , allocator(_u("NativeCode"), &pageAllocator, Js::Throw::OutOfMemory) , emitBufferManager(&allocator, codePageAllocators, scriptContext, threadContext, _u("JIT code buffer"), processHandle) -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD , canCreatePreReservedSegment(false) #endif { diff --git a/deps/chakrashim/core/lib/Backend/CodeGenAllocators.h b/deps/chakrashim/core/lib/Backend/CodeGenAllocators.h index 1e19594e1c1..238543a334f 100644 --- a/deps/chakrashim/core/lib/Backend/CodeGenAllocators.h +++ b/deps/chakrashim/core/lib/Backend/CodeGenAllocators.h @@ -13,7 +13,7 @@ class CodeGenAllocators NoRecoverMemoryArenaAllocator allocator; public: EmitBufferManager emitBufferManager; -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD bool canCreatePreReservedSegment; #endif diff --git a/deps/chakrashim/core/lib/Backend/CodeGenWorkItem.cpp b/deps/chakrashim/core/lib/Backend/CodeGenWorkItem.cpp index ac5092e26ee..968537f82dc 100644 --- a/deps/chakrashim/core/lib/Backend/CodeGenWorkItem.cpp +++ b/deps/chakrashim/core/lib/Backend/CodeGenWorkItem.cpp @@ -205,7 +205,7 @@ void CodeGenWorkItem::OnWorkItemProcessFail(NativeCodeGenerator* codeGen) #if DBG this->allocation->allocation->isNotExecutableBecauseOOM = true; #endif - codeGen->FreeNativeCodeGenAllocation(this->allocation->allocation->address); + codeGen->FreeNativeCodeGenAllocation(this->allocation->allocation->address, nullptr); } } diff --git a/deps/chakrashim/core/lib/Backend/DbCheckPostLower.cpp b/deps/chakrashim/core/lib/Backend/DbCheckPostLower.cpp index 65c852c346e..59f10a4d9af 100644 --- a/deps/chakrashim/core/lib/Backend/DbCheckPostLower.cpp +++ b/deps/chakrashim/core/lib/Backend/DbCheckPostLower.cpp @@ -221,6 +221,10 @@ void DbCheckPostLower::Check(IR::Opnd *opnd) this->Check(opnd->AsIndirOpnd()->GetBaseOpnd()); this->Check(opnd->AsIndirOpnd()->GetIndexOpnd()); } + else if (opnd->IsListOpnd()) + { + opnd->AsListOpnd()->Map([&](int i, IR::Opnd* opnd) { this->Check(opnd); }); + } else if (opnd->IsSymOpnd() && opnd->AsSymOpnd()->m_sym->IsStackSym()) { if (this->func->isPostRegAlloc) @@ -262,6 +266,21 @@ void DbCheckPostLower::Check(IR::RegOpnd *regOpnd) #endif } } + + if (regOpnd->GetSym()) + { + StackSym *sym = regOpnd->GetSym()->AsStackSym(); + IRType tySym = sym->GetType(); + IRType tyReg = regOpnd->GetType(); + + if (!IRType_IsSimd(tySym)) + { + Assert((IRType_IsNativeIntOrVar(tySym) && IRType_IsNativeIntOrVar(tyReg)) + || (IRType_IsFloat(tySym) && IRType_IsFloat(tyReg))); + + Assert(TySize[tySym] >= TySize[tyReg] || this->func->isPostRegAlloc); + } + } } #endif // DBG diff --git a/deps/chakrashim/core/lib/Backend/EmitBuffer.cpp b/deps/chakrashim/core/lib/Backend/EmitBuffer.cpp index 203c09e5654..2bba1fb1657 100644 --- a/deps/chakrashim/core/lib/Backend/EmitBuffer.cpp +++ b/deps/chakrashim/core/lib/Backend/EmitBuffer.cpp @@ -191,7 +191,7 @@ EmitBufferManager::NewAllocation(size_t b template bool -EmitBufferManager::FreeAllocation(void* address) +EmitBufferManager::FreeAllocation(void* address, void** functionTable) { AutoRealOrFakeCriticalSection autoCs(&this->criticalSection); #if _M_ARM @@ -217,7 +217,7 @@ EmitBufferManager::FreeAllocation(void* a this->scriptContext->GetThreadContext()->SubCodeSize(allocation->bytesCommitted); } -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) if (allocation->allocation->thunkAddress) { if (JITManager::GetJITManager()->IsJITServer()) @@ -234,11 +234,23 @@ EmitBufferManager::FreeAllocation(void* a { if (!JITManager::GetJITManager()->IsJITServer() || CONFIG_FLAG(OOPCFGRegistration)) { - threadContext->SetValidCallTargetForCFG(address, false); + void* callTarget = address; +#if _M_ARM + callTarget = (void*)((uintptr_t)callTarget | 0x1); // add the thumb bit back, so we CFG-unregister the actual call target +#endif + threadContext->SetValidCallTargetForCFG(callTarget, false); } } VerboseHeapTrace(_u("Freeing 0x%p, allocation: 0x%p\n"), address, allocation->allocation->address); +#if PDATA_ENABLED && defined(_WIN32) + if (functionTable && *functionTable) + { + NtdllLibrary::Instance->DeleteGrowableFunctionTable(*functionTable); + *functionTable = nullptr; + } +#endif + this->allocationHeap.Free(allocation->allocation); this->allocator->Free(allocation, sizeof(TEmitBufferAllocation)); @@ -252,7 +264,7 @@ EmitBufferManager::FreeAllocation(void* a //---------------------------------------------------------------------------- // EmitBufferManager::FinalizeAllocation -// Fill the rest of the page with debugger breakpoint. +// Fill the rest of the buffer (length given by allocation->BytesFree()) with debugger breakpoints. //---------------------------------------------------------------------------- template bool EmitBufferManager::FinalizeAllocation(TEmitBufferAllocation *allocation, BYTE * dstBuffer) @@ -264,7 +276,7 @@ bool EmitBufferManager::FinalizeAllocatio { BYTE* buffer = nullptr; this->GetBuffer(allocation, bytes, &buffer); - if (!this->CommitBuffer(allocation, dstBuffer, 0, /*sourceBuffer=*/ nullptr, /*alignPad=*/ bytes)) + if (!this->CommitBuffer(allocation, allocation->bytesCommitted, dstBuffer, 0, /*sourceBuffer=*/ nullptr, /*alignPad=*/ bytes)) { return false; } @@ -319,7 +331,7 @@ EmitBufferManager::AllocateBuffer(__in si #if DBG MEMORY_BASIC_INFORMATION memBasicInfo; size_t resultBytes = VirtualQueryEx(this->processHandle, allocation->allocation->address, &memBasicInfo, sizeof(memBasicInfo)); - Assert(resultBytes == 0 || memBasicInfo.Protect == PAGE_EXECUTE); + Assert(resultBytes == 0 || memBasicInfo.Protect == PAGE_EXECUTE_READ); #endif return allocation; @@ -357,7 +369,7 @@ bool EmitBufferManager::IsBufferExecuteRe AutoRealOrFakeCriticalSection autoCs(&this->criticalSection); MEMORY_BASIC_INFORMATION memBasicInfo; size_t resultBytes = VirtualQuery(allocation->allocation->address, &memBasicInfo, sizeof(memBasicInfo)); - return resultBytes != 0 && memBasicInfo.Protect == PAGE_EXECUTE; + return resultBytes != 0 && memBasicInfo.Protect == PAGE_EXECUTE_READ; } #endif @@ -407,16 +419,26 @@ bool EmitBufferManager::CommitBufferForIn // Copies contents of source buffer to the destination buffer - at max of one page at a time. // This ensures that only 1 page is writable at any point of time. // Commit a buffer from the last AllocateBuffer call that is filled. +// +// Skips over the initial allocation->GetBytesUsed() bytes of destBuffer. Then, fills in `alignPad` bytes with debug breakpoint instructions, +// copies `bytes` bytes from sourceBuffer, and finally fills in the rest of destBuffer with debug breakpoint instructions. //---------------------------------------------------------------------------- template bool -EmitBufferManager::CommitBuffer(TEmitBufferAllocation* allocation, __out_bcount(bytes) BYTE* destBuffer, __in size_t bytes, __in_bcount(bytes) const BYTE* sourceBuffer, __in DWORD alignPad) +EmitBufferManager::CommitBuffer(TEmitBufferAllocation* allocation, __in const size_t destBufferBytes, __out_bcount(destBufferBytes) BYTE* destBuffer, __in size_t bytes, __in_bcount(bytes) const BYTE* sourceBuffer, __in DWORD alignPad) { AutoRealOrFakeCriticalSection autoCs(&this->criticalSection); Assert(destBuffer != nullptr); Assert(allocation != nullptr); + // The size of destBuffer is actually given by allocation->bytesCommitted, but due to a bug in some versions of PREFast, we can't refer to allocation->bytesCommitted in the + // SAL annotation on destBuffer above. We've informed the PREFast maintainers, but we'll have to use destBufferBytes as a workaround until their fix makes it to Jenkins. + Assert(destBufferBytes == allocation->bytesCommitted); + + // Must have at least enough room in destBuffer for the initial skipped bytes plus the bytes we're going to write. + AnalysisAssert(allocation->bytesUsed + bytes + alignPad <= destBufferBytes); + BYTE *currentDestBuffer = destBuffer + allocation->GetBytesUsed(); char *bufferToFlush = allocation->allocation->address + allocation->GetBytesUsed(); Assert(allocation->BytesFree() >= bytes + alignPad); @@ -427,6 +449,10 @@ EmitBufferManager::CommitBuffer(TEmitBuff // Copy the contents and set the alignment pad while(bytesLeft != 0) { + // currentDestBuffer must still point to somewhere in the interior of destBuffer. + AnalysisAssert(destBuffer <= currentDestBuffer); + AnalysisAssert(currentDestBuffer < destBuffer + destBufferBytes); + DWORD spaceInCurrentPage = AutoSystemInfo::PageSize - ((size_t)currentDestBuffer & (AutoSystemInfo::PageSize - 1)); size_t bytesToChange = bytesLeft > spaceInCurrentPage ? spaceInCurrentPage : bytesLeft; @@ -446,6 +472,7 @@ EmitBufferManager::CommitBuffer(TEmitBuff return false; } + // Pad with debug-breakpoint instructions up to alignBytes or the end of the current page, whichever is less. if (alignPad != 0) { DWORD alignBytes = alignPad < spaceInCurrentPage ? alignPad : spaceInCurrentPage; @@ -462,12 +489,16 @@ EmitBufferManager::CommitBuffer(TEmitBuff #endif } - // If there are bytes still left to be copied then we should do the copy. + // If there are bytes still left to be copied then we should do the copy, but only through the end of the current page. if(bytesToChange > 0) { AssertMsg(alignPad == 0, "If we are copying right now - we should be done with setting alignment."); - memcpy_s(currentDestBuffer, allocation->BytesFree(), sourceBuffer, bytesToChange); + const DWORD bufferBytesFree(allocation->BytesFree()); + // Use <= here instead of < to allow this memcopy to fill up the rest of destBuffer. If we do, then FinalizeAllocation, + // called below, determines that no additional padding is necessary based on the values in `allocation'. + AnalysisAssert(currentDestBuffer + bufferBytesFree <= destBuffer + destBufferBytes); + memcpy_s(currentDestBuffer, bufferBytesFree, sourceBuffer, bytesToChange); currentDestBuffer += bytesToChange; sourceBuffer += bytesToChange; @@ -488,7 +519,7 @@ EmitBufferManager::CommitBuffer(TEmitBuff this->totalBytesCode += bytes; #endif - //Finish the current EmitBufferAllocation + //Finish the current EmitBufferAllocation by filling out the rest of destBuffer with debug breakpoint instructions. return FinalizeAllocation(allocation, destBuffer); } diff --git a/deps/chakrashim/core/lib/Backend/EmitBuffer.h b/deps/chakrashim/core/lib/Backend/EmitBuffer.h index ac6548186a3..14e454054ba 100644 --- a/deps/chakrashim/core/lib/Backend/EmitBuffer.h +++ b/deps/chakrashim/core/lib/Backend/EmitBuffer.h @@ -42,11 +42,11 @@ class EmitBufferManager void Clear(); TEmitBufferAllocation* AllocateBuffer(DECLSPEC_GUARD_OVERFLOW __in size_t bytes, __deref_bcount(bytes) BYTE** ppBuffer, ushort pdataCount = 0, ushort xdataSize = 0, bool canAllocInPreReservedHeapPageSegment = false, bool isAnyJittedCode = false); - bool CommitBuffer(TEmitBufferAllocation* allocation, __out_bcount(bytes) BYTE* destBuffer, __in size_t bytes, __in_bcount(bytes) const BYTE* sourceBuffer, __in DWORD alignPad = 0); + bool CommitBuffer(TEmitBufferAllocation* allocation, __in const size_t destBufferBytes, __out_bcount(destBufferBytes) BYTE* destBuffer, __in size_t bytes, __in_bcount(bytes) const BYTE* sourceBuffer, __in DWORD alignPad = 0); bool ProtectBufferWithExecuteReadWriteForInterpreter(TEmitBufferAllocation* allocation); bool CommitBufferForInterpreter(TEmitBufferAllocation* allocation, _In_reads_bytes_(bufferSize) BYTE* pBuffer, _In_ size_t bufferSize); void CompletePreviousAllocation(TEmitBufferAllocation* allocation); - bool FreeAllocation(void* address); + bool FreeAllocation(void* address, void** functionTable); //Ends here bool IsInHeap(void* address); diff --git a/deps/chakrashim/core/lib/Backend/Encoder.cpp b/deps/chakrashim/core/lib/Backend/Encoder.cpp index 42143b059f7..503d14b0ba7 100644 --- a/deps/chakrashim/core/lib/Backend/Encoder.cpp +++ b/deps/chakrashim/core/lib/Backend/Encoder.cpp @@ -329,8 +329,14 @@ Encoder::Encode() #ifdef _M_X64 pdataCount = 1; xdataSize = (ushort)m_func->m_prologEncoder.SizeOfUnwindInfo(); -#elif _M_ARM +#elif defined(_M_ARM64) + pdataCount = 1; + xdataSize = XDATA_SIZE; +#elif defined(_M_ARM) +#pragma warning(push) +#pragma warning(disable:4244) // warning C4244: 'argument': conversion from 'ptrdiff_t' to 'DWORD', possible loss of data pdataCount = (ushort)m_func->m_unwindInfo.GetPDataCount(codeSize); +#pragma warning(pop) xdataSize = (UnwindInfoManager::MaxXdataBytes + 3) * pdataCount; #else xdataSize = 0; @@ -390,9 +396,14 @@ Encoder::Encode() } #endif +#ifdef TARGET_64 #ifdef _M_X64 - m_func->m_prologEncoder.FinalizeUnwindInfo( - (BYTE*)m_func->GetJITOutput()->GetCodeAddress(), (DWORD)codeSize); + PrologEncoder &unwindInfo = m_func->m_prologEncoder; + unwindInfo.FinalizeUnwindInfo((BYTE*)m_func->GetJITOutput()->GetCodeAddress(), (DWORD)codeSize); +#else + UnwindInfoManager &unwindInfo = m_func->m_unwindInfo; + unwindInfo.FinalizeUnwindInfo((BYTE*)localAddress, (DWORD)codeSize); +#endif char * localXdataAddr = nullptr; #if ENABLE_OOP_NATIVE_CODEGEN @@ -411,8 +422,8 @@ Encoder::Encode() localXdataAddr = (char*)allocation->xdata.address; } m_func->GetJITOutput()->RecordUnwindInfo( - m_func->m_prologEncoder.GetUnwindInfo(), - m_func->m_prologEncoder.SizeOfUnwindInfo(), + unwindInfo.GetUnwindInfo(), + unwindInfo.SizeOfUnwindInfo(), allocation->xdata.address, (BYTE*)localXdataAddr); #elif _M_ARM @@ -426,10 +437,9 @@ Encoder::Encode() } else { - XDataAllocator::Register(&allocation->xdata, m_func->GetJITOutput()->GetCodeAddress(), m_func->GetJITOutput()->GetCodeSize()); + XDataAllocator::Register(&allocation->xdata, m_func->GetJITOutput()->GetCodeAddress(), (DWORD)m_func->GetJITOutput()->GetCodeSize()); m_func->GetInProcJITEntryPointInfo()->SetXDataInfo(&allocation->xdata); } - m_func->GetJITOutput()->SetCodeAddress(m_func->GetJITOutput()->GetCodeAddress() | 0x1); // Set thumb mode #endif diff --git a/deps/chakrashim/core/lib/Backend/EquivalentTypeSet.cpp b/deps/chakrashim/core/lib/Backend/EquivalentTypeSet.cpp new file mode 100644 index 00000000000..1f6fcfaeb78 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/EquivalentTypeSet.cpp @@ -0,0 +1,159 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "Backend.h" + +#if ENABLE_NATIVE_CODEGEN +namespace Js +{ + +EquivalentTypeSet::EquivalentTypeSet(RecyclerJITTypeHolder * types, uint16 count) + : types(types), count(count), sortedAndDuplicatesRemoved(false) +{ +} + +JITTypeHolder EquivalentTypeSet::GetType(uint16 index) const +{ + Assert(this->types != nullptr && this->count > 0 && index < this->count); + return this->types[index]; +} + +JITTypeHolder EquivalentTypeSet::GetFirstType() const +{ + return GetType(0); +} + +bool EquivalentTypeSet::Contains(const JITTypeHolder type, uint16* pIndex) +{ + if (!this->GetSortedAndDuplicatesRemoved()) + { + this->SortAndRemoveDuplicates(); + } + for (uint16 ti = 0; ti < this->count; ti++) + { + if (this->GetType(ti) == type) + { + if (pIndex) + { + *pIndex = ti; + } + return true; + } + } + return false; +} + +bool EquivalentTypeSet::AreIdentical(EquivalentTypeSet * left, EquivalentTypeSet * right) +{ + if (!left->GetSortedAndDuplicatesRemoved()) + { + left->SortAndRemoveDuplicates(); + } + if (!right->GetSortedAndDuplicatesRemoved()) + { + right->SortAndRemoveDuplicates(); + } + + Assert(left->GetSortedAndDuplicatesRemoved() && right->GetSortedAndDuplicatesRemoved()); + + if (left->count != right->count) + { + return false; + } + + // TODO: OOP JIT, optimize this (previously we had memcmp) + for (uint i = 0; i < left->count; ++i) + { + if (left->types[i] != right->types[i]) + { + return false; + } + } + return true; +} + +bool EquivalentTypeSet::IsSubsetOf(EquivalentTypeSet * left, EquivalentTypeSet * right) +{ + if (!left->GetSortedAndDuplicatesRemoved()) + { + left->SortAndRemoveDuplicates(); + } + if (!right->GetSortedAndDuplicatesRemoved()) + { + right->SortAndRemoveDuplicates(); + } + + if (left->count > right->count) + { + return false; + } + + // Try to find each left type in the right set. + int j = 0; + for (int i = 0; i < left->count; i++) + { + bool found = false; + for (; j < right->count; j++) + { + if (left->types[i] < right->types[j]) + { + // Didn't find the left type. Fail. + return false; + } + if (left->types[i] == right->types[j]) + { + // Found the left type. Continue to the next left/right pair. + found = true; + j++; + break; + } + } + Assert(j <= right->count); + if (j == right->count && !found) + { + // Exhausted the right set without finding the current left type. + return false; + } + } + return true; +} + +void EquivalentTypeSet::SortAndRemoveDuplicates() +{ + uint16 oldCount = this->count; + uint16 i; + + // sorting + for (i = 1; i < oldCount; i++) + { + uint16 j = i; + while (j > 0 && (this->types[j - 1] > this->types[j])) + { + JITTypeHolder tmp = this->types[j]; + this->types[j] = this->types[j - 1]; + this->types[j - 1] = tmp; + j--; + } + } + + // removing duplicate types from the sorted set + i = 0; + for (uint16 j = 1; j < oldCount; j++) + { + if (this->types[i] != this->types[j]) + { + this->types[++i] = this->types[j]; + } + } + this->count = ++i; + for (i; i < oldCount; i++) + { + this->types[i] = JITTypeHolder(nullptr); + } + + this->sortedAndDuplicatesRemoved = true; +} +} +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/EquivalentTypeSet.h b/deps/chakrashim/core/lib/Backend/EquivalentTypeSet.h new file mode 100644 index 00000000000..84f26be2be4 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/EquivalentTypeSet.h @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once +namespace Js +{ + class EquivalentTypeSet + { + private: + Field(bool) sortedAndDuplicatesRemoved; + Field(uint16) count; + Field(RecyclerJITTypeHolder *) types; + + public: + EquivalentTypeSet(RecyclerJITTypeHolder * types, uint16 count); + + uint16 GetCount() const + { + return this->count; + } + + JITTypeHolder GetFirstType() const; + + JITTypeHolder GetType(uint16 index) const; + + bool GetSortedAndDuplicatesRemoved() const + { + return this->sortedAndDuplicatesRemoved; + } + bool Contains(const JITTypeHolder type, uint16 * pIndex = nullptr); + + static bool AreIdentical(EquivalentTypeSet * left, EquivalentTypeSet * right); + static bool IsSubsetOf(EquivalentTypeSet * left, EquivalentTypeSet * right); + void SortAndRemoveDuplicates(); + }; +}; diff --git a/deps/chakrashim/core/lib/Backend/FlowGraph.cpp b/deps/chakrashim/core/lib/Backend/FlowGraph.cpp index 2d3c7c3b722..4a77e2435d4 100644 --- a/deps/chakrashim/core/lib/Backend/FlowGraph.cpp +++ b/deps/chakrashim/core/lib/Backend/FlowGraph.cpp @@ -325,10 +325,9 @@ FlowGraph::Build(void) instr->m_func->SetHasCallsOnSelfAndParents(); } - // For ARM & X64 because of their register calling convention + // For ARM, ARM64 & X64 (non x86) because of their register calling convention // the ArgOuts need to be moved next to the call. -#if defined(_M_ARM) || defined(_M_X64) - +#if !defined(_M_IX86) IR::Instr* argInsertInstr = instr; instr->IterateArgInstrs([&](IR::Instr* argInstr) { @@ -1643,9 +1642,8 @@ FlowGraph::Destroy(void) } } - // We don't run the globopt with try/catch, don't need to remove branch to next for fall through blocks IR::Instr * lastInstr = block->GetLastInstr(); - if (!fHasTry && lastInstr->IsBranchInstr()) + if (lastInstr->IsBranchInstr()) { IR::BranchInstr * branchInstr = lastInstr->AsBranchInstr(); if (!branchInstr->IsConditional() && branchInstr->GetTarget() == branchInstr->m_next) @@ -1773,7 +1771,7 @@ FlowGraph::Destroy(void) } } NEXT_BLOCK; - FOREACH_BLOCK_DEAD_OR_ALIVE(block, this) + FOREACH_BLOCK_ALL(block, this) { if (block->GetFirstInstr()->IsLabelInstr()) { @@ -1785,7 +1783,7 @@ FlowGraph::Destroy(void) labelInstr->Remove(); } } - } NEXT_BLOCK_DEAD_OR_ALIVE; + } NEXT_BLOCK; } #endif @@ -2912,6 +2910,10 @@ FlowGraph::PeepCm(IR::Instr *instr) StackSym *dstSym = instr->GetDst()->AsRegOpnd()->m_sym; instrBr->AsBranchInstr()->SetByteCodeReg(dstSym->GetByteCodeRegSlot()); } + + brSrc = brSrc->Copy(this->func); + // We need brSrc later, but instr->Remove() might delete it... + IR::AutoReuseOpnd brSrcAutoCopy(brSrc, this->func, true); instr->Remove(); // @@ -2991,7 +2993,7 @@ FlowGraph::PeepCm(IR::Instr *instr) if (instrLd3->GetByteCodeOffset() > instrBr->GetByteCodeOffset()) { StackSym *symLd3 = instrLd3->GetDst()->AsRegOpnd()->m_sym; - if (IR::Instr::FindRegUseInRange(symLd3, instrBr->m_next, instrLd3)) + if (IR::Instr::HasSymUseInRange(symLd3, instrBr->m_next, instrLd3)) { return nullptr; } @@ -3345,6 +3347,7 @@ FlowGraph::RemoveBlock(BasicBlock *block, GlobOpt * globOpt, bool tailDuping) { Assert(instr->IsLabelInstr()); instr->AsLabelInstr()->m_isLoopTop = false; + instr->AsLabelInstr()->m_hasNonBranchRef = false; } else { @@ -4190,6 +4193,7 @@ BasicBlock::CleanUpValueMaps() this->globOptData.liveInt32Syms->Clear(sym->m_id); this->globOptData.liveLossyInt32Syms->Clear(sym->m_id); this->globOptData.liveFloat64Syms->Clear(sym->m_id); + this->globOptData.SetChangedSym(sym); } } else @@ -4288,6 +4292,8 @@ BasicBlock::CleanUpValueMaps() FOREACH_BITSET_IN_SPARSEBV(dead_id, &deadSymsBv) { thisTable->Clear(dead_id); + Sym* sym = this->func->m_symTable->Find(dead_id); + this->globOptData.SetChangedSym(sym); } NEXT_BITSET_IN_SPARSEBV; diff --git a/deps/chakrashim/core/lib/Backend/FlowGraph.h b/deps/chakrashim/core/lib/Backend/FlowGraph.h index 0288b8db362..3756a446aaa 100644 --- a/deps/chakrashim/core/lib/Backend/FlowGraph.h +++ b/deps/chakrashim/core/lib/Backend/FlowGraph.h @@ -140,7 +140,9 @@ class FlowGraph loopList(nullptr), catchLabelStack(nullptr), finallyLabelStack(nullptr), + leaveNullLabelStack(nullptr), regToFinallyEndMap(nullptr), + leaveNullLabelToFinallyLabelMap(nullptr), hasBackwardPassInfo(false), hasLoop(false), implicitCallFlags(Js::ImplicitCall_HasNoInfo) diff --git a/deps/chakrashim/core/lib/Backend/Func.cpp b/deps/chakrashim/core/lib/Backend/Func.cpp index d96eaaea2c3..b439097ff1e 100644 --- a/deps/chakrashim/core/lib/Backend/Func.cpp +++ b/deps/chakrashim/core/lib/Backend/Func.cpp @@ -62,12 +62,12 @@ Func::Func(JitArenaAllocator *alloc, JITTimeWorkItem * workItem, m_fg(nullptr), m_labelCount(0), m_argSlotsForFunctionsCalled(0), - m_isLeaf(false), m_hasCalls(false), m_hasInlineArgsOpt(false), m_canDoInlineArgsOpt(true), m_doFastPaths(false), hasBailout(false), + firstIRTemp(0), hasBailoutInEHRegion(false), hasInstrNumber(false), maintainByteCodeOffset(true), @@ -78,7 +78,7 @@ Func::Func(JitArenaAllocator *alloc, JITTimeWorkItem * workItem, hasAnyStackNestedFunc(false), hasMarkTempObjects(false), postCallByteCodeOffset(postCallByteCodeOffset), - maxInlineeArgOutCount(0), + maxInlineeArgOutSize(0), returnValueRegSlot(returnValueRegSlot), firstActualStackOffset(-1), m_localVarSlotsOffset(Js::Constants::InvalidOffset), @@ -744,19 +744,27 @@ void Func::SetFirstArgOffset(IR::Instr* inlineeStart) int32 lastOffset; IR::Instr* arg = inlineeStart->GetNextArg(); - const auto lastArgOutStackSym = arg->GetDst()->AsSymOpnd()->m_sym->AsStackSym(); - lastOffset = lastArgOutStackSym->m_offset; - Assert(lastArgOutStackSym->m_isSingleDef); - const auto secondLastArgOutOpnd = lastArgOutStackSym->m_instrDef->GetSrc2(); - if (secondLastArgOutOpnd->IsSymOpnd()) - { - const auto secondLastOffset = secondLastArgOutOpnd->AsSymOpnd()->m_sym->AsStackSym()->m_offset; - if (secondLastOffset > lastOffset) + if (arg) + { + const auto lastArgOutStackSym = arg->GetDst()->AsSymOpnd()->m_sym->AsStackSym(); + lastOffset = lastArgOutStackSym->m_offset; + Assert(lastArgOutStackSym->m_isSingleDef); + const auto secondLastArgOutOpnd = lastArgOutStackSym->m_instrDef->GetSrc2(); + if (secondLastArgOutOpnd->IsSymOpnd()) { - lastOffset = secondLastOffset; + const auto secondLastOffset = secondLastArgOutOpnd->AsSymOpnd()->m_sym->AsStackSym()->m_offset; + if (secondLastOffset > lastOffset) + { + lastOffset = secondLastOffset; + } } + lastOffset += MachPtr; + } + else + { + Assert(this->GetTopFunc()->GetJITFunctionBody()->IsAsmJsMode()); + lastOffset = MachPtr; } - lastOffset += MachPtr; int32 firstActualStackOffset = lastOffset - ((this->actualCount + Js::Constants::InlineeMetaArgCount) * MachPtr); Assert((this->firstActualStackOffset == -1) || (this->firstActualStackOffset == firstActualStackOffset)); this->firstActualStackOffset = firstActualStackOffset; @@ -871,7 +879,11 @@ Func::SetDoFastPaths() #if LOWER_SPLIT_INT64 Int64RegPair Func::FindOrCreateInt64Pair(IR::Opnd* opnd) { - AssertMsg(this->GetTopFunc()->currentPhases.Top() == Js::LowererPhase, "New Int64 sym map is only allowed during lower"); + if (!this->IsTopFunc()) + { + return GetTopFunc()->FindOrCreateInt64Pair(opnd); + } + AssertMsg(currentPhases.Top() == Js::LowererPhase, "New Int64 sym map is only allowed during lower"); Int64RegPair pair; IRType pairType = opnd->GetType(); if (opnd->IsInt64()) @@ -918,7 +930,7 @@ Int64RegPair Func::FindOrCreateInt64Pair(IR::Opnd* opnd) { Js::ArgSlot slotNumber = stackSym->GetArgSlotNum(); symPair.low = StackSym::NewArgSlotSym(slotNumber, this, pairType); - symPair.high = StackSym::NewArgSlotSym(slotNumber + 1, this, pairType); + symPair.high = StackSym::NewArgSlotSym(slotNumber, this, pairType); } else { @@ -954,6 +966,11 @@ Int64RegPair Func::FindOrCreateInt64Pair(IR::Opnd* opnd) void Func::Int64SplitExtendLoopLifetime(Loop* loop) { + if (!this->IsTopFunc()) + { + GetTopFunc()->Int64SplitExtendLoopLifetime(loop); + return; + } if (m_int64SymPairMap) { BVSparse *liveOnBackEdgeSyms = loop->regAlloc.liveOnBackEdgeSyms; @@ -972,7 +989,7 @@ void Func::Int64SplitExtendLoopLifetime(Loop* loop) } #endif -#ifdef _M_ARM +#if defined(_M_ARM32_OR_ARM64) RegNum Func::GetLocalsPointer() const @@ -1140,7 +1157,7 @@ bool Func::CanAllocInPreReservedHeapPageSegment () && GetInProcCodeGenAllocators()->canCreatePreReservedSegment #endif ); -#elif _M_X64 +#elif TARGET_64 && true); #else && false); //Not yet implemented for architectures other than x86 and amd64. @@ -1363,11 +1380,11 @@ Func::EnsureLoopParamSym() } void -Func::UpdateMaxInlineeArgOutCount(uint inlineeArgOutCount) +Func::UpdateMaxInlineeArgOutSize(uint inlineeArgOutSize) { - if (maxInlineeArgOutCount < inlineeArgOutCount) + if (this->maxInlineeArgOutSize < inlineeArgOutSize) { - maxInlineeArgOutCount = inlineeArgOutCount; + this->maxInlineeArgOutSize = inlineeArgOutSize; } } @@ -1680,6 +1697,7 @@ Func::EnsureFuncStartLabel() if(m_funcStartLabel == nullptr) { m_funcStartLabel = IR::LabelInstr::New( Js::OpCode::Label, this ); + m_funcStartLabel->m_isDataLabel = true; } return m_funcStartLabel; } @@ -1696,6 +1714,7 @@ Func::EnsureFuncEndLabel() if(m_funcEndLabel == nullptr) { m_funcEndLabel = IR::LabelInstr::New( Js::OpCode::Label, this ); + m_funcEndLabel->m_isDataLabel = true; } return m_funcEndLabel; } diff --git a/deps/chakrashim/core/lib/Backend/Func.h b/deps/chakrashim/core/lib/Backend/Func.h index dea737b8869..82a8f91309f 100644 --- a/deps/chakrashim/core/lib/Backend/Func.h +++ b/deps/chakrashim/core/lib/Backend/Func.h @@ -28,7 +28,8 @@ struct Cloner lowerer(lowerer), instrFirst(nullptr), instrLast(nullptr), - fRetargetClonedBranch(FALSE) + fRetargetClonedBranch(FALSE), + clonedInstrGetOrigArgSlotSym(false) { } @@ -48,13 +49,13 @@ struct Cloner void Finish(); void RetargetClonedBranches(); + JitArenaAllocator *alloc; HashTable *symMap; HashTable *labelMap; Lowerer * lowerer; IR::Instr * instrFirst; IR::Instr * instrLast; BOOL fRetargetClonedBranch; - JitArenaAllocator *alloc; bool clonedInstrGetOrigArgSlotSym; }; @@ -208,7 +209,11 @@ class Func bool DoInline() const { +#ifdef _M_IX86 return DoGlobOpt() && !GetTopFunc()->HasTry(); +#else + return DoGlobOpt(); +#endif } bool DoOptimizeTry() const @@ -340,9 +345,9 @@ class Func static const uint32 c_debugFillPattern4 = 0xcececece; static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece; -#if defined(_M_IX86) || defined (_M_ARM) +#if defined(TARGET_32) static const uint32 c_debugFillPattern = c_debugFillPattern4; -#elif defined(_M_X64) || defined(_M_ARM64) +#elif defined(TARGET_64) static const unsigned __int64 c_debugFillPattern = c_debugFillPattern8; #else #error unsupported platform @@ -687,6 +692,7 @@ static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece; uint32 inlineDepth; uint32 postCallByteCodeOffset; Js::RegSlot returnValueRegSlot; + Js::RegSlot firstIRTemp; Js::ArgSlot actualCount; int32 firstActualStackOffset; uint32 tryCatchNestingLevel; @@ -714,7 +720,6 @@ static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece; StackSym * tempSymBool; uint32 loopCount; Js::ProfileId callSiteIdInParentFunc; - bool m_isLeaf: 1; // This is set in the IRBuilder and might be inaccurate after inlining bool m_hasCalls: 1; // This is more accurate compared to m_isLeaf bool m_hasInlineArgsOpt : 1; bool m_doFastPaths : 1; @@ -760,19 +765,18 @@ static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece; bool DoMaintainByteCodeOffset() const { return this->HasByteCodeOffset() && this->GetTopFunc()->maintainByteCodeOffset; } void StopMaintainByteCodeOffset() { this->GetTopFunc()->maintainByteCodeOffset = false; } Func * GetParentFunc() const { return parentFunc; } - uint GetMaxInlineeArgOutCount() const { return maxInlineeArgOutCount; } - void UpdateMaxInlineeArgOutCount(uint inlineeArgOutCount); + uint GetMaxInlineeArgOutSize() const { return this->maxInlineeArgOutSize; } + void UpdateMaxInlineeArgOutSize(uint inlineeArgOutSize); #if DBG_DUMP ptrdiff_t m_codeSize; #endif bool GetHasCalls() const { return this->m_hasCalls; } - void SetHasCalls() { this->m_hasCalls = true; } void SetHasCallsOnSelfAndParents() { Func *curFunc = this; while (curFunc) { - curFunc->SetHasCalls(); + curFunc->m_hasCalls = true; curFunc = curFunc->GetParentFunc(); } } @@ -871,6 +875,19 @@ static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece; top->DoGlobOpt() && !PHASE_OFF(Js::LoopFastPathPhase, top); } + static Js::OpCode GetLoadOpForType(IRType type) + { + if (type == TyVar || IRType_IsFloat(type)) + { + return Js::OpCode::Ld_A; + } + else + { + Assert(IRType_IsNativeInt(type)); + return Js::OpCode::Ld_I4; + } + } + static Js::BuiltinFunction GetBuiltInIndex(IR::Opnd* opnd) { Assert(opnd); @@ -983,10 +1000,10 @@ static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece; #if defined(_M_ARM32_OR_ARM64) int32 GetInlineeArgumentStackSize() { - int32 count = this->GetMaxInlineeArgOutCount(); - if (count) + int32 size = this->GetMaxInlineeArgOutSize(); + if (size) { - return ((count + 1) * MachPtr); // +1 for the dedicated zero out argc slot + return size + MachPtr; // +1 for the dedicated zero out argc slot } return 0; } @@ -1014,7 +1031,7 @@ static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece; #endif Func * const parentFunc; StackSym * m_inlineeFrameStartSym; - uint maxInlineeArgOutCount; + uint maxInlineeArgOutSize; const bool m_isBackgroundJIT; bool hasInstrNumber; bool maintainByteCodeOffset; diff --git a/deps/chakrashim/core/lib/Backend/FunctionJITTimeInfo.cpp b/deps/chakrashim/core/lib/Backend/FunctionJITTimeInfo.cpp index 5e7df02aa98..7e25e794d29 100644 --- a/deps/chakrashim/core/lib/Backend/FunctionJITTimeInfo.cpp +++ b/deps/chakrashim/core/lib/Backend/FunctionJITTimeInfo.cpp @@ -174,6 +174,11 @@ FunctionJITTimeInfo::HasSharedPropertyGuard(Js::PropertyId id) const return false; } +bool FunctionJITTimeInfo::IsJsBuiltInForceInline() const +{ + return this->GetBody()->GetSourceContextId() == Js::Constants::JsBuiltInSourceContextId; +} + intptr_t FunctionJITTimeInfo::GetFunctionInfoAddr() const { diff --git a/deps/chakrashim/core/lib/Backend/FunctionJITTimeInfo.h b/deps/chakrashim/core/lib/Backend/FunctionJITTimeInfo.h index ebb9195255c..73c2e3ae96c 100644 --- a/deps/chakrashim/core/lib/Backend/FunctionJITTimeInfo.h +++ b/deps/chakrashim/core/lib/Backend/FunctionJITTimeInfo.h @@ -44,6 +44,7 @@ class FunctionJITTimeInfo bool ForceJITLoopBody() const; bool HasSharedPropertyGuards() const; bool HasSharedPropertyGuard(Js::PropertyId id) const; + bool IsJsBuiltInForceInline() const; char16* GetDisplayName() const; char16* GetDebugNumberSet(wchar(&bufferToWriteTo)[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE]) const; diff --git a/deps/chakrashim/core/lib/Backend/GlobOpt.cpp b/deps/chakrashim/core/lib/Backend/GlobOpt.cpp index 835d81e6f1c..8aa33affd2d 100644 --- a/deps/chakrashim/core/lib/Backend/GlobOpt.cpp +++ b/deps/chakrashim/core/lib/Backend/GlobOpt.cpp @@ -1577,6 +1577,7 @@ GlobOpt::OptArguments(IR::Instr *instr) if (instr->HasAnyLoadHeapArgsOpCode()) { +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS if (instr->m_func->IsStackArgsEnabled()) { if (instr->GetSrc1()->IsRegOpnd() && instr->m_func->GetJITFunctionBody()->GetInParamsCount() > 1) @@ -1593,6 +1594,7 @@ GlobOpt::OptArguments(IR::Instr *instr) } } } +#endif if (instr->m_func->GetJITFunctionBody()->GetInParamsCount() != 1 && !instr->m_func->IsStackArgsEnabled()) { @@ -2336,7 +2338,7 @@ GlobOpt::CollectMemOpInfo(IR::Instr *instrBegin, IR::Instr *instr, Value *src1Va Loop::MemCopyCandidate* memcopyCandidate = prevCandidate->AsMemCopy(); if (memcopyCandidate->base == Js::Constants::InvalidSymID) { - if (chkInstr->FindRegUse(memcopyCandidate->transferSym)) + if (chkInstr->HasSymUse(memcopyCandidate->transferSym)) { loop->doMemOp = false; TRACE_MEMOP_PHASE_VERBOSE(MemCopy, loop, chkInstr, _u("Found illegal use of LdElemI value(s%d)"), GetVarSymID(memcopyCandidate->transferSym)); @@ -2632,11 +2634,8 @@ GlobOpt::OptInstr(IR::Instr *&instr, bool* isInstrRemoved) } // Track calls after any pre-op bailouts have been inserted before the call, because they will need to restore out params. - // We don't inline in asmjs and hence we don't need to track calls in asmjs too, skipping this step for asmjs. - if (!GetIsAsmJSFunc()) - { - this->TrackCalls(instr); - } + + this->TrackCalls(instr); if (instr->GetSrc1()) { @@ -2762,31 +2761,9 @@ GlobOpt::OptInstr(IR::Instr *&instr, bool* isInstrRemoved) } } - if (instr->HasBailOutInfo() && !this->IsLoopPrePass()) + if (CurrentBlockData()->capturedValuesCandidate && !this->IsLoopPrePass()) { - GlobOptBlockData * globOptData = CurrentBlockData(); - globOptData->changedSyms->ClearAll(); - - if (!this->changedSymsAfterIncBailoutCandidate->IsEmpty()) - { - // - // some symbols are changed after the values for current bailout have been - // captured (GlobOpt::CapturedValues), need to restore such symbols as changed - // for following incremental bailout construction, or we will miss capturing - // values for later bailout - // - - // swap changedSyms and changedSymsAfterIncBailoutCandidate - // because both are from this->alloc - BVSparse * tempBvSwap = globOptData->changedSyms; - globOptData->changedSyms = this->changedSymsAfterIncBailoutCandidate; - this->changedSymsAfterIncBailoutCandidate = tempBvSwap; - } - - globOptData->capturedValues = globOptData->capturedValuesCandidate; - - // null out capturedValuesCandicate to stop tracking symbols change for it - globOptData->capturedValuesCandidate = nullptr; + this->CommitCapturedValuesCandidate(); } return instrNext; @@ -2918,7 +2895,7 @@ GlobOpt::TypeSpecializeBailoutExpectedInteger(IR::Instr* instr, Value* src1Val, { if (!src1Val || !src1Val->GetValueInfo()->IsLikelyInt() || instr->GetSrc1()->AsRegOpnd()->m_sym->m_isNotInt) { - Assert(IsSwitchOptEnabled()); + Assert(IsSwitchOptEnabledForIntTypeSpec()); throw Js::RejitException(RejitReason::DisableSwitchOptExpectingInteger); } @@ -3326,6 +3303,13 @@ GlobOpt::OptSrc(IR::Opnd *opnd, IR::Instr * *pInstr, Value **indirIndexValRef, I } originalPropertySym = sym->AsPropertySym(); + // Dont give a vale to 'arguments' property sym to prevent field copy prop of 'arguments' + if (originalPropertySym->AsPropertySym()->m_propertyId == Js::PropertyIds::arguments && + originalPropertySym->AsPropertySym()->m_fieldKind == PropertyKindData) + { + return nullptr; + } + Value *const objectValue = CurrentBlockData()->FindValue(originalPropertySym->m_stackSym); opnd->AsSymOpnd()->SetPropertyOwnerValueType( objectValue ? objectValue->GetValueInfo()->Type() : ValueType::Uninitialized); @@ -3533,7 +3517,7 @@ GlobOpt::OptSrc(IR::Opnd *opnd, IR::Instr * *pInstr, Value **indirIndexValRef, I ValueType valueType(val->GetValueInfo()->Type()); // This block uses local profiling data to optimize the case of a native array being passed to a function that fills it with other types. When the function is inlined - // into different call paths which use different types this can cause a perf hit by performing unnecessary array conversions, so only perform this optimization when + // into different call paths which use different types this can cause a perf hit by performing unnecessary array conversions, so only perform this optimization when // the function is not inlined. if (valueType.IsLikelyNativeArray() && !valueType.IsObject() && instr->IsProfiledInstr() && !instr->m_func->IsInlined()) { @@ -3574,6 +3558,7 @@ GlobOpt::OptSrc(IR::Opnd *opnd, IR::Instr * *pInstr, Value **indirIndexValRef, I ChangeValueType(this->currentBlock, CurrentBlockData()->FindValue(opnd->AsRegOpnd()->m_sym), valueType, false); } } + opnd->SetValueType(valueType); if(!IsLoopPrePass() && opnd->IsSymOpnd() && valueType.IsDefinite()) @@ -3677,6 +3662,18 @@ GlobOpt::CopyProp(IR::Opnd *opnd, IR::Instr *instr, Value *val, IR::IndirOpnd *p ValueInfo *valueInfo = val->GetValueInfo(); + + if (this->func->HasFinally()) + { + // s0 = undefined was added on functions with early exit in try-finally functions, that can get copy-proped and case incorrect results + if (instr->m_opcode == Js::OpCode::ArgOut_A_Inline && valueInfo->GetSymStore() && + valueInfo->GetSymStore()->m_id == 0) + { + // We don't want to copy-prop s0 (return symbol) into inlinee code + return opnd; + } + } + // Constant prop? int32 intConstantValue; int64 int64ConstantValue; @@ -4573,11 +4570,7 @@ void GlobOpt::SetSymStoreDirect(ValueInfo * valueInfo, Sym * sym) { Sym * prevSymStore = valueInfo->GetSymStore(); - if (prevSymStore && prevSymStore->IsStackSym() && - prevSymStore->AsStackSym()->HasByteCodeRegSlot()) - { - CurrentBlockData()->SetChangedSym(prevSymStore->m_id); - } + CurrentBlockData()->SetChangedSym(prevSymStore); valueInfo->SetSymStore(sym); } @@ -5427,7 +5420,7 @@ GlobOpt::ValueNumberLdElemDst(IR::Instr **pInstr, Value *srcVal) case ObjectType::Float64MixedArray: Float64Array: Assert(dst->IsRegOpnd()); - + // If float type spec is disabled, don't load float64 values if (!this->DoFloatTypeSpec()) { @@ -6568,6 +6561,13 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val src2Var = this->GetConstantVar(instr->GetSrc2(), src2Val); } + auto AreSourcesEqual = [&](Value * val1, Value * val2) -> bool + { + // NaN !== NaN, and objects can have valueOf/toString + return val1->IsEqualTo(val2) && + val1->GetValueInfo()->IsPrimitive() && val1->GetValueInfo()->IsNotFloat(); + }; + // Make sure GetConstantVar only returns primitives. // TODO: OOP JIT, enabled these asserts //Assert(!src1Var || !Js::JavascriptOperators::IsObject(src1Var)); @@ -6584,6 +6584,10 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val { \ result = (TYPE)left64 CMP (TYPE)right64; \ } \ + else if (AreSourcesEqual(src1Val, src2Val)) \ + { \ + result = 0 CMP 0; \ + } \ else \ { \ return false; \ @@ -6606,7 +6610,11 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val { if (BoolAndIntStaticAndTypeMismatch(src1Val, src2Val, src1Var, src2Var)) { - result = false; + result = false; + } + else if (AreSourcesEqual(src1Val, src2Val)) + { + result = true; } else { @@ -6631,6 +6639,10 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val { result = true; } + else if (AreSourcesEqual(src1Val, src2Val)) + { + result = false; + } else { return false; @@ -6668,6 +6680,10 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val { result = false; } + else if (AreSourcesEqual(src1Val, src2Val)) + { + result = true; + } else { return false; @@ -6706,6 +6722,10 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val { result = true; } + else if (AreSourcesEqual(src1Val, src2Val)) + { + result = false; + } else { return false; @@ -6758,17 +6778,13 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val // this path would probably work outside of asm.js, but we should verify that if we ever hit this scenario Assert(GetIsAsmJSFunc()); constVal = 0; - if (src1Val->GetValueInfo()->TryGetIntConstantValue(&constVal) && constVal != 0) + if (!src1Val->GetValueInfo()->TryGetIntConstantValue(&constVal)) { - instr->FreeSrc1(); - if (instr->GetSrc2()) - { - instr->FreeSrc2(); - } - instr->m_opcode = Js::OpCode::Nop; - return true; + return false; } - return false; + + result = constVal == 0; + break; default: return false; @@ -7456,7 +7472,7 @@ GlobOpt::TypeSpecializeInlineBuiltInBinary(IR::Instr **pInstr, Value *src1Val, V case Js::OpCode::InlineMathPow: { -#ifndef _M_ARM +#ifndef _M_ARM32_OR_ARM64 if (src2Val->GetValueInfo()->IsLikelyInt()) { bool lossy = false; @@ -7489,7 +7505,7 @@ GlobOpt::TypeSpecializeInlineBuiltInBinary(IR::Instr **pInstr, Value *src1Val, V { #endif this->TypeSpecializeFloatBinary(instr, src1Val, src2Val, pDstVal); -#ifndef _M_ARM +#ifndef _M_ARM32_OR_ARM64 } #endif break; @@ -7513,7 +7529,11 @@ GlobOpt::TypeSpecializeInlineBuiltInBinary(IR::Instr **pInstr, Value *src1Val, V if(src1Val->GetValueInfo()->IsLikelyInt() && src2Val->GetValueInfo()->IsLikelyInt()) { // Compute resulting range info - int32 min1, max1, min2, max2, newMin, newMax; + int32 min1 = INT32_MIN; + int32 max1 = INT32_MAX; + int32 min2 = INT32_MIN; + int32 max2 = INT32_MAX; + int32 newMin, newMax; Assert(this->DoAggressiveIntTypeSpec()); src1Val->GetValueInfo()->GetIntValMinMax(&min1, &max1, this->DoAggressiveIntTypeSpec()); @@ -11319,7 +11339,7 @@ GlobOpt::ToTypeSpecUse(IR::Instr *instr, IR::Opnd *opnd, BasicBlock *block, Valu // restarted with aggressive int type specialization disabled. if(bailOutKind == IR::BailOutExpectingInteger) { - Assert(IsSwitchOptEnabled()); + Assert(IsSwitchOptEnabledForIntTypeSpec()); throw Js::RejitException(RejitReason::DisableSwitchOptExpectingInteger); } else @@ -11663,7 +11683,7 @@ GlobOpt::ToTypeSpecUse(IR::Instr *instr, IR::Opnd *opnd, BasicBlock *block, Valu // need to bail out. if (bailOutKind == IR::BailOutExpectingInteger) { - Assert(IsSwitchOptEnabled()); + Assert(IsSwitchOptEnabledForIntTypeSpec()); } else { @@ -12233,7 +12253,7 @@ static void SetIsConstFlag(StackSym* dstSym, int value) dstSym->SetIsIntConst(value); } -static IR::Opnd* CreateIntConstOpnd(IR::Instr* instr, int64 value) +static IR::Opnd* CreateIntConstOpnd(IR::Instr* instr, int64 value) { return (IR::Opnd*)IR::Int64ConstOpnd::New(value, instr->GetDst()->GetType(), instr->m_func); } @@ -12291,7 +12311,7 @@ bool GlobOpt::OptConstFoldBinaryWasm( } T src1IntConstantValue, src2IntConstantValue; - if (!src1 || !src1->GetValueInfo()->TryGetIntConstantValue(&src1IntConstantValue, false) || //a bit sketchy: false for int32 means likelyInt = false + if (!src1 || !src1->GetValueInfo()->TryGetIntConstantValue(&src1IntConstantValue, false) || //a bit sketchy: false for int32 means likelyInt = false !src2 || !src2->GetValueInfo()->TryGetIntConstantValue(&src2IntConstantValue, false) //and unsigned = false for int64 ) { @@ -13763,19 +13783,18 @@ GlobOpt::OptArraySrc(IR::Instr * *const instrRef) // array type during a prepass. // - StElems in the loop can kill the no-missing-values info. // - The native array type may be made more conservative based on profile data by an instruction in the loop. - Assert( - baseValueInLoopLandingPad->GetValueInfo()->CanMergeToSpecificObjectType() || - baseValueInLoopLandingPad->GetValueInfo()->Type().SetCanBeTaggedValue(false) == - baseValueType.SetCanBeTaggedValue(false) || - baseValueInLoopLandingPad->GetValueInfo()->Type().SetHasNoMissingValues(false).SetCanBeTaggedValue(false) == - baseValueType.SetHasNoMissingValues(false).SetCanBeTaggedValue(false) || - baseValueInLoopLandingPad->GetValueInfo()->Type().SetHasNoMissingValues(false).ToLikely().SetCanBeTaggedValue(false) == - baseValueType.SetHasNoMissingValues(false).SetCanBeTaggedValue(false) || - ( - baseValueInLoopLandingPad->GetValueInfo()->Type().IsLikelyNativeArray() && - baseValueInLoopLandingPad->GetValueInfo()->Type().Merge(baseValueType).SetHasNoMissingValues(false).SetCanBeTaggedValue(false) == - baseValueType.SetHasNoMissingValues(false).SetCanBeTaggedValue(false) - )); +#if DBG + if (!baseValueInLoopLandingPad->GetValueInfo()->CanMergeToSpecificObjectType()) + { + ValueType landingPadValueType = baseValueInLoopLandingPad->GetValueInfo()->Type(); + Assert(landingPadValueType.IsSimilar(baseValueType) || + ( + landingPadValueType.IsLikelyNativeArray() && + landingPadValueType.Merge(baseValueType).IsSimilar(baseValueType) + ) + ); + } +#endif if(doArrayChecks) { @@ -15393,6 +15412,37 @@ GlobOptBlockData * GlobOpt::CurrentBlockData() return &this->currentBlock->globOptData; } +void GlobOpt::CommitCapturedValuesCandidate() +{ + GlobOptBlockData * globOptData = CurrentBlockData(); + globOptData->changedSyms->ClearAll(); + + if (!this->changedSymsAfterIncBailoutCandidate->IsEmpty()) + { + // + // some symbols are changed after the values for current bailout have been + // captured (GlobOpt::CapturedValues), need to restore such symbols as changed + // for following incremental bailout construction, or we will miss capturing + // values for later bailout + // + + // swap changedSyms and changedSymsAfterIncBailoutCandidate + // because both are from this->alloc + BVSparse * tempBvSwap = globOptData->changedSyms; + globOptData->changedSyms = this->changedSymsAfterIncBailoutCandidate; + this->changedSymsAfterIncBailoutCandidate = tempBvSwap; + } + + if (globOptData->capturedValues) + { + globOptData->capturedValues->DecrementRefCount(); + } + globOptData->capturedValues = globOptData->capturedValuesCandidate; + + // null out capturedValuesCandidate to stop tracking symbols change for it + globOptData->capturedValuesCandidate = nullptr; +} + bool GlobOpt::IsOperationThatLikelyKillsJsArraysWithNoMissingValues(IR::Instr *const instr) { @@ -16168,8 +16218,23 @@ GlobOpt::OptIsInvariant(Sym *sym, BasicBlock *block, Loop *loop, Value *srcVal, return false; } - // Can't hoist non-primitives, unless we have safeguards against valueof/tostring. - if (!allowNonPrimitives && !srcVal->GetValueInfo()->IsPrimitive() && !loop->landingPad->globOptData.IsTypeSpecialized(sym)) + // A symbol is invariant if its current value is the same as it was upon entering the loop. + loopHeadVal = loop->landingPad->globOptData.FindValue(sym); + if (loopHeadVal == NULL || loopHeadVal->GetValueNumber() != srcVal->GetValueNumber()) + { + return false; + } + + // Can't hoist non-primitives, unless we have safeguards against valueof/tostring. Additionally, we need to consider + // the value annotations on the source *before* the loop: if we hoist this instruction outside the loop, we can't + // necessarily rely on type annotations added (and enforced) earlier in the loop's body. + // + // It might look as though !loopHeadVal->GetValueInfo()->IsPrimitive() implies + // !loop->landingPad->globOptData.IsTypeSpecialized(sym), but it turns out that this is not always the case. We + // encountered a test case in which we had previously hoisted a FromVar (to float 64) instruction, but its bailout code was + // BailoutPrimitiveButString, rather than BailoutNumberOnly, which would have allowed us to conclude that the dest was + // definitely a float64. Instead, it was only *likely* a float64, causing IsPrimitive to return false. + if (!allowNonPrimitives && !loopHeadVal->GetValueInfo()->IsPrimitive() && !loop->landingPad->globOptData.IsTypeSpecialized(sym)) { return false; } @@ -16206,14 +16271,6 @@ GlobOpt::OptIsInvariant(Sym *sym, BasicBlock *block, Loop *loop, Value *srcVal, return false; } - // A symbol is invariant if it's current value is the same as it was upon entering the loop. - loopHeadVal = loop->landingPad->globOptData.FindValue(sym); - - if (loopHeadVal == NULL || loopHeadVal->GetValueNumber() != srcVal->GetValueNumber()) - { - return false; - } - // For values with an int range, require additionally that the range is the same as in the landing pad, as the range may // have been changed on this path based on branches, and int specialization and invariant hoisting may rely on the range // being the same. For type spec conversions, only require that if the value is an int constant in the current block, that @@ -16230,6 +16287,11 @@ GlobOpt::OptIsInvariant(Sym *sym, BasicBlock *block, Loop *loop, Value *srcVal, return false; } + // If the loopHeadVal is primitive, the current value should be as well. This really should be + // srcVal->GetValueInfo()->IsPrimitive() instead of IsLikelyPrimitive, but this stronger assertion + // doesn't hold in some cases when this method is called out of the array code. + Assert((!loopHeadVal->GetValueInfo()->IsPrimitive()) || srcVal->GetValueInfo()->IsLikelyPrimitive()); + return true; } @@ -16693,12 +16755,7 @@ GlobOpt::OptHoistInvariant( EnsureBailTarget(loop); // Copy bailout info of loop top. - if (instr->ReplaceBailOutInfo(loop->bailOutInfo)) - { - // if the old bailout is deleted, reset capturedvalues cached in block - block->globOptData.capturedValues = nullptr; - block->globOptData.capturedValuesCandidate = nullptr; - } + instr->ReplaceBailOutInfo(loop->bailOutInfo); } if(!dst) @@ -17141,8 +17198,13 @@ bool GlobOpt::IsSwitchOptEnabled(Func const * func) { Assert(func->IsTopFunc()); - return !PHASE_OFF(Js::SwitchOptPhase, func) && !func->IsSwitchOptDisabled() && !IsTypeSpecPhaseOff(func) - && DoAggressiveIntTypeSpec(func) && func->DoGlobOpt() && !func->HasTry(); + return !PHASE_OFF(Js::SwitchOptPhase, func) && !func->IsSwitchOptDisabled() && func->DoGlobOpt(); +} + +bool +GlobOpt::IsSwitchOptEnabledForIntTypeSpec(Func const * func) +{ + return IsSwitchOptEnabled(func) && !IsTypeSpecPhaseOff(func) && DoAggressiveIntTypeSpec(func); } bool @@ -17664,7 +17726,8 @@ GlobOpt::ProcessExceptionHandlingEdges(IR::Instr* instr) void GlobOpt::InsertToVarAtDefInTryRegion(IR::Instr * instr, IR::Opnd * dstOpnd) { - if (this->currentRegion->GetType() == RegionTypeTry && dstOpnd->IsRegOpnd() && dstOpnd->AsRegOpnd()->m_sym->HasByteCodeRegSlot()) + if ((this->currentRegion->GetType() == RegionTypeTry || this->currentRegion->GetType() == RegionTypeFinally) && + dstOpnd->IsRegOpnd() && dstOpnd->AsRegOpnd()->m_sym->HasByteCodeRegSlot()) { StackSym * sym = dstOpnd->AsRegOpnd()->m_sym; if (sym->IsVar()) @@ -17673,7 +17736,8 @@ GlobOpt::InsertToVarAtDefInTryRegion(IR::Instr * instr, IR::Opnd * dstOpnd) } StackSym * varSym = sym->GetVarEquivSym(nullptr); - if (this->currentRegion->writeThroughSymbolsSet->Test(varSym->m_id)) + if ((this->currentRegion->GetType() == RegionTypeTry && this->currentRegion->writeThroughSymbolsSet->Test(varSym->m_id)) || + ((this->currentRegion->GetType() == RegionTypeFinally && this->currentRegion->GetMatchingTryRegion()->writeThroughSymbolsSet->Test(varSym->m_id)))) { IR::RegOpnd * regOpnd = IR::RegOpnd::New(varSym, IRType::TyVar, instr->m_func); this->ToVar(instr->m_next, regOpnd, this->currentBlock, NULL, false); @@ -17986,7 +18050,7 @@ GlobOpt::DumpSymVal(int index) } void -GlobOpt::Trace(BasicBlock * block, bool before) const +GlobOpt::Trace(BasicBlock * block, bool before) const { bool globOptTrace = Js::Configuration::Global.flags.Trace.IsEnabled(Js::GlobOptPhase, this->func->GetSourceContextId(), this->func->GetLocalFunctionId()); bool typeSpecTrace = Js::Configuration::Global.flags.Trace.IsEnabled(Js::TypeSpecPhase, this->func->GetSourceContextId(), this->func->GetLocalFunctionId()); diff --git a/deps/chakrashim/core/lib/Backend/GlobOpt.h b/deps/chakrashim/core/lib/Backend/GlobOpt.h index 01df8013108..74fc6568a47 100644 --- a/deps/chakrashim/core/lib/Backend/GlobOpt.h +++ b/deps/chakrashim/core/lib/Backend/GlobOpt.h @@ -169,7 +169,7 @@ class PathDependentInfo public: PathDependentInfo(const PathDependentRelationship relationship, Value *const leftValue, Value *const rightValue) - : relationship(relationship), leftValue(leftValue), rightValue(rightValue) + : leftValue(leftValue), rightValue(rightValue), rightConstantValue(0), relationship(relationship) { Assert(leftValue); Assert(rightValue); @@ -180,7 +180,7 @@ class PathDependentInfo Value *const leftValue, Value *const rightValue, const int32 rightConstantValue) - : relationship(relationship), leftValue(leftValue), rightValue(rightValue), rightConstantValue(rightConstantValue) + : leftValue(leftValue), rightValue(rightValue), rightConstantValue(rightConstantValue), relationship(relationship) { Assert(leftValue); } @@ -585,7 +585,7 @@ class GlobOpt IR::Instr * GetExtendedArg(IR::Instr *instr); int GetBoundCheckOffsetForSimd(ValueType arrValueType, const IR::Instr *instr, const int oldOffset = -1); - IR::Instr * OptNewScObject(IR::Instr** instrPtr, Value* srcVal); + void OptNewScObject(IR::Instr** instrPtr, Value* srcVal); template bool OptConstFoldBinaryWasm(IR::Instr * *pInstr, const Value* src1, const Value* src2, Value **pDstVal); template @@ -701,6 +701,7 @@ class GlobOpt GlobOptBlockData const * CurrentBlockData() const; GlobOptBlockData * CurrentBlockData(); + void CommitCapturedValuesCandidate(); private: bool IsOperationThatLikelyKillsJsArraysWithNoMissingValues(IR::Instr *const instr); @@ -764,6 +765,7 @@ class GlobOpt static bool DoTypedArrayTypeSpec(Func const * func); static bool DoNativeArrayTypeSpec(Func const * func); static bool IsSwitchOptEnabled(Func const * func); + static bool IsSwitchOptEnabledForIntTypeSpec(Func const * func); static bool DoInlineArgsOpt(Func const * func); static bool IsPREInstrCandidateLoad(Js::OpCode opcode); static bool IsPREInstrCandidateStore(Js::OpCode opcode); @@ -790,6 +792,7 @@ class GlobOpt bool DoNativeArrayTypeSpec() const { return GlobOpt::DoNativeArrayTypeSpec(this->func); } bool DoLdLenIntSpec(IR::Instr * const instr, const ValueType baseValueType); bool IsSwitchOptEnabled() const { return GlobOpt::IsSwitchOptEnabled(this->func); } + bool IsSwitchOptEnabledForIntTypeSpec() const { return GlobOpt::IsSwitchOptEnabledForIntTypeSpec(this->func); } bool DoPathDependentValues() const; bool DoTrackRelativeIntBounds() const; bool DoBoundCheckElimination() const; diff --git a/deps/chakrashim/core/lib/Backend/GlobOptBailOut.cpp b/deps/chakrashim/core/lib/Backend/GlobOptBailOut.cpp index cd32939e296..1f367cba233 100644 --- a/deps/chakrashim/core/lib/Backend/GlobOptBailOut.cpp +++ b/deps/chakrashim/core/lib/Backend/GlobOptBailOut.cpp @@ -92,119 +92,135 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block, FOREACH_BITSET_IN_SPARSEBV(symId, block->globOptData.changedSyms) { - Sym * sym = hasConstValue ? iterConst.Data().Key() : nullptr; Value * val = nullptr; - HashBucket * symIdBucket = nullptr; - // copy unchanged sym to new capturedValues - while (sym && sym->m_id < symId) + // First process all unchanged syms with m_id < symId. Then, recapture the current changed sym. + + // copy unchanged const sym to new capturedValues + Sym * constSym = hasConstValue ? iterConst.Data().Key() : nullptr; + while (constSym && constSym->m_id < symId) { - Assert(sym->IsStackSym()); - if (!sym->AsStackSym()->HasArgSlotNum()) + Assert(constSym->IsStackSym()); + if (!constSym->AsStackSym()->HasArgSlotNum()) { - bailOutConstValuesIter.InsertNodeBefore(this->func->m_alloc, sym->AsStackSym(), iterConst.Data().Value()); + bailOutConstValuesIter.InsertNodeBefore(this->func->m_alloc, constSym->AsStackSym(), iterConst.Data().Value()); } hasConstValue = iterConst.Next(); - sym = hasConstValue ? iterConst.Data().Key() : nullptr; + constSym = hasConstValue ? iterConst.Data().Key() : nullptr; } - if (sym && sym->m_id == symId) + if (constSym && constSym->m_id == symId) { hasConstValue = iterConst.Next(); } - if (symId != Js::Constants::InvalidSymID) - { - // recapture changed constant sym - - symIdBucket = block->globOptData.symToValueMap->GetBucket(symId); - if (symIdBucket == nullptr) - { - continue; - } - - Sym * symIdSym = symIdBucket->value; - Assert(symIdSym->IsStackSym() && (symIdSym->AsStackSym()->HasByteCodeRegSlot() || symIdSym->AsStackSym()->HasArgSlotNum())); - - val = symIdBucket->element; - ValueInfo* valueInfo = val->GetValueInfo(); - if (valueInfo->GetSymStore() != nullptr) - { - int32 intConstValue; - BailoutConstantValue constValue; - - if (valueInfo->TryGetIntConstantValue(&intConstValue)) - { - constValue.InitIntConstValue(intConstValue); - bailOutConstValuesIter.InsertNodeBefore(this->func->m_alloc, symIdSym->AsStackSym(), constValue); - - continue; - } - else if(valueInfo->IsVarConstant()) - { - constValue.InitVarConstValue(valueInfo->AsVarConstant()->VarValue()); - bailOutConstValuesIter.InsertNodeBefore(this->func->m_alloc, symIdSym->AsStackSym(), constValue); - - continue; - } - } - else if (!valueInfo->HasIntConstantValue()) - { - continue; - } - } - - sym = hasCopyPropSym ? iterCopyPropSym.Data().Key() : nullptr; - - // process unchanged sym, but copy sym might have changed - while (sym && sym->m_id < symId) + // process unchanged sym; copy-prop sym might have changed + Sym * capturedSym = hasCopyPropSym ? iterCopyPropSym.Data().Key() : nullptr; + while (capturedSym && capturedSym->m_id < symId) { - StackSym * copyPropSym = iterCopyPropSym.Data().Value(); + StackSym * capturedCopyPropSym = iterCopyPropSym.Data().Value(); - Assert(sym->IsStackSym()); + Assert(capturedSym->IsStackSym()); - if (!block->globOptData.changedSyms->Test(copyPropSym->m_id)) + if (!block->globOptData.changedSyms->Test(capturedCopyPropSym->m_id)) { - if (!sym->AsStackSym()->HasArgSlotNum()) + if (!capturedSym->AsStackSym()->HasArgSlotNum()) { - bailOutCopySymsIter.InsertNodeBefore(this->func->m_alloc, sym->AsStackSym(), copyPropSym); + bailOutCopySymsIter.InsertNodeBefore(this->func->m_alloc, capturedSym->AsStackSym(), capturedCopyPropSym); } } else { - if (!sym->AsStackSym()->HasArgSlotNum()) + if (!capturedSym->AsStackSym()->HasArgSlotNum()) { - val = this->currentBlock->globOptData.FindValue(sym); + val = this->currentBlock->globOptData.FindValue(capturedSym); if (val != nullptr) { - CaptureCopyPropValue(block, sym, val, bailOutCopySymsIter); + CaptureCopyPropValue(block, capturedSym, val, bailOutCopySymsIter); } } } hasCopyPropSym = iterCopyPropSym.Next(); - sym = hasCopyPropSym ? iterCopyPropSym.Data().Key() : nullptr; + capturedSym = hasCopyPropSym ? iterCopyPropSym.Data().Key() : nullptr; } - if (sym && sym->m_id == symId) + if (capturedSym && capturedSym->m_id == symId) { hasCopyPropSym = iterCopyPropSym.Next(); } + + // recapture changed sym + HashBucket * symIdBucket = nullptr; if (symId != Js::Constants::InvalidSymID) { - // recapture changed copy prop sym symIdBucket = block->globOptData.symToValueMap->GetBucket(symId); if (symIdBucket != nullptr) { Sym * symIdSym = symIdBucket->value; - val = this->currentBlock->globOptData.FindValue(symIdSym); - if (val != nullptr) + Assert(symIdSym->IsStackSym() && (symIdSym->AsStackSym()->HasByteCodeRegSlot() || symIdSym->AsStackSym()->HasArgSlotNum())); + + val = symIdBucket->element; + Assert(val); + ValueInfo* valueInfo = val->GetValueInfo(); + + if (valueInfo->GetSymStore() != nullptr) { - CaptureCopyPropValue(block, symIdSym, val, bailOutCopySymsIter); + int32 intConstValue; + BailoutConstantValue constValue; + + if (valueInfo->TryGetIntConstantValue(&intConstValue)) + { + constValue.InitIntConstValue(intConstValue); + bailOutConstValuesIter.InsertNodeBefore(this->func->m_alloc, symIdSym->AsStackSym(), constValue); + } + else if (valueInfo->IsVarConstant()) + { + constValue.InitVarConstValue(valueInfo->AsVarConstant()->VarValue()); + bailOutConstValuesIter.InsertNodeBefore(this->func->m_alloc, symIdSym->AsStackSym(), constValue); + } + else + { + CaptureCopyPropValue(block, symIdSym, val, bailOutCopySymsIter); + } } } } } NEXT_BITSET_IN_SPARSEBV + + // If, after going over the set of changed syms since the last time we captured values, + // there are remaining unprocessed entries in the current captured values set, + // they can simply be copied over to the new bailout info. + while (hasConstValue) + { + Sym * constSym = iterConst.Data().Key(); + Assert(constSym->IsStackSym()); + Assert(!block->globOptData.changedSyms->Test(constSym->m_id)); + + if (!constSym->AsStackSym()->HasArgSlotNum()) + { + bailOutConstValuesIter.InsertNodeBefore(this->func->m_alloc, constSym->AsStackSym(), iterConst.Data().Value()); + } + + hasConstValue = iterConst.Next(); + } + + while (hasCopyPropSym) + { + Sym * capturedSym = iterCopyPropSym.Data().Key(); + StackSym * capturedCopyPropSym = iterCopyPropSym.Data().Value(); + + Assert(capturedSym->IsStackSym()); + Assert(!block->globOptData.changedSyms->Test(capturedSym->m_id) && + !block->globOptData.changedSyms->Test(capturedCopyPropSym->m_id)); + + if (!capturedSym->AsStackSym()->HasArgSlotNum()) + { + bailOutCopySymsIter.InsertNodeBefore(this->func->m_alloc, capturedSym->AsStackSym(), capturedCopyPropSym); + } + + hasCopyPropSym = iterCopyPropSym.Next(); + } } @@ -237,18 +253,25 @@ GlobOpt::CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo) // attach capturedValues to bailOutInfo - bailOutInfo->capturedValues.constantValues.Clear(this->func->m_alloc); - bailOutConstValuesIter.SetNext(&bailOutInfo->capturedValues.constantValues); - bailOutInfo->capturedValues.constantValues = capturedValues.constantValues; + bailOutInfo->capturedValues->constantValues.Clear(this->func->m_alloc); + bailOutConstValuesIter.SetNext(&bailOutInfo->capturedValues->constantValues); + bailOutInfo->capturedValues->constantValues = capturedValues.constantValues; - bailOutInfo->capturedValues.copyPropSyms.Clear(this->func->m_alloc); - bailOutCopySymsIter.SetNext(&bailOutInfo->capturedValues.copyPropSyms); - bailOutInfo->capturedValues.copyPropSyms = capturedValues.copyPropSyms; + bailOutInfo->capturedValues->copyPropSyms.Clear(this->func->m_alloc); + bailOutCopySymsIter.SetNext(&bailOutInfo->capturedValues->copyPropSyms); + bailOutInfo->capturedValues->copyPropSyms = capturedValues.copyPropSyms; - if (!PHASE_OFF(Js::IncrementalBailoutPhase, func)) + // In pre-pass only bailout info created should be for the loop header, and that doesn't take into account the back edge. + // Don't use the captured values on that bailout for incremental capturing of values. + if (!PHASE_OFF(Js::IncrementalBailoutPhase, func) && !this->IsLoopPrePass()) { // cache the pointer of current bailout as potential baseline for later bailout in this block - block->globOptData.capturedValuesCandidate = &bailOutInfo->capturedValues; + if (block->globOptData.capturedValuesCandidate) + { + block->globOptData.capturedValuesCandidate->DecrementRefCount(); + } + block->globOptData.capturedValuesCandidate = bailOutInfo->capturedValues; + block->globOptData.capturedValuesCandidate->IncrementRefCount(); // reset changed syms to track symbols change after the above captured values candidate this->changedSymsAfterIncBailoutCandidate->ClearAll(); @@ -267,12 +290,12 @@ GlobOpt::CaptureArguments(BasicBlock *block, BailOutInfo * bailOutInfo, JitArena continue; } - if (!bailOutInfo->capturedValues.argObjSyms) + if (!bailOutInfo->capturedValues->argObjSyms) { - bailOutInfo->capturedValues.argObjSyms = JitAnew(allocator, BVSparse, allocator); + bailOutInfo->capturedValues->argObjSyms = JitAnew(allocator, BVSparse, allocator); } - bailOutInfo->capturedValues.argObjSyms->Set(id); + bailOutInfo->capturedValues->argObjSyms->Set(id); // Add to BailOutInfo } NEXT_BITSET_IN_SPARSEBV @@ -281,6 +304,10 @@ GlobOpt::CaptureArguments(BasicBlock *block, BailOutInfo * bailOutInfo, JitArena void GlobOpt::TrackByteCodeSymUsed(IR::Instr * instr, BVSparse * instrByteCodeStackSymUsed, PropertySym **pPropertySym) { + if(instr->m_func->GetJITFunctionBody()->IsAsmJsMode()) + { + return; + } IR::Opnd * src = instr->GetSrc1(); if (src) { @@ -427,7 +454,7 @@ GlobOpt::MarkNonByteCodeUsed(IR::Opnd * opnd) void GlobOpt::CaptureByteCodeSymUses(IR::Instr * instr) { - if (this->byteCodeUses) + if (this->byteCodeUses || this->func->GetJITFunctionBody()->IsAsmJsMode()) { // We already captured it before. return; @@ -493,7 +520,8 @@ GlobOpt::TrackCalls(IR::Instr * instr) Assert(stackSym->IsArgSlotSym()); if (stackSym->m_isInlinedArgSlot) { - this->currentBlock->globOptData.inlinedArgOutCount++; + uint size = TySize[instr->GetDst()->GetType()]; + this->currentBlock->globOptData.inlinedArgOutSize += size < MachPtr ? MachPtr : size; // We want to update the offsets only once: don't do in prepass. if (!this->IsLoopPrePass() && stackSym->m_offset >= 0) { @@ -523,7 +551,7 @@ GlobOpt::TrackCalls(IR::Instr * instr) this->currentBlock->globOptData.curFunc = instr->m_func; this->currentBlock->globOptData.curFunc = instr->m_func; - this->func->UpdateMaxInlineeArgOutCount(this->currentBlock->globOptData.inlinedArgOutCount); + this->func->UpdateMaxInlineeArgOutSize(this->currentBlock->globOptData.inlinedArgOutSize); this->EndTrackCall(instr); if (DoInlineArgsOpt(instr->m_func)) @@ -560,8 +588,8 @@ GlobOpt::TrackCalls(IR::Instr * instr) } EndTrackingOfArgObjSymsForInlinee(); - Assert(this->currentBlock->globOptData.inlinedArgOutCount >= instr->GetArgOutCount(/*getInterpreterArgOutCount*/ false)); - this->currentBlock->globOptData.inlinedArgOutCount -= instr->GetArgOutCount(/*getInterpreterArgOutCount*/ false); + Assert(this->currentBlock->globOptData.inlinedArgOutSize >= instr->GetArgOutSize(/*getInterpreterArgOutCount*/ false)); + this->currentBlock->globOptData.inlinedArgOutSize -= instr->GetArgOutSize(/*getInterpreterArgOutCount*/ false); break; case Js::OpCode::InlineeMetaArg: @@ -578,7 +606,7 @@ GlobOpt::TrackCalls(IR::Instr * instr) Func * currentFunc = instr->m_func->GetParentFunc(); stackSym->FixupStackOffset(currentFunc); } - this->currentBlock->globOptData.inlinedArgOutCount++; + this->currentBlock->globOptData.inlinedArgOutSize += MachPtr; break; } @@ -651,8 +679,8 @@ GlobOpt::TrackCalls(IR::Instr * instr) this->EndTrackCall(instr); } - Assert(this->currentBlock->globOptData.inlinedArgOutCount >= instr->GetArgOutCount(/*getInterpreterArgOutCount*/ false)); - this->currentBlock->globOptData.inlinedArgOutCount -= instr->GetArgOutCount(/*getInterpreterArgOutCount*/ false); + Assert(this->currentBlock->globOptData.inlinedArgOutSize >= instr->GetArgOutSize(/*getInterpreterArgOutCount*/ false)); + this->currentBlock->globOptData.inlinedArgOutSize -= instr->GetArgOutSize(/*getInterpreterArgOutCount*/ false); this->inInlinedBuiltIn = false; break; @@ -725,7 +753,7 @@ void GlobOpt::RecordInlineeFrameInfo(IR::Instr* inlineeEnd) frameInfo->function = InlineFrameInfoValue(functionObject->m_sym); } } - else + else if(!GetIsAsmJSFunc()) // don't care about saving arg syms for wasm/asm.js { Js::ArgSlot argSlot = argInstr->GetDst()->AsSymOpnd()->m_sym->AsStackSym()->GetArgSlotNum(); IR::Opnd* argOpnd = argInstr->GetSrc1(); @@ -735,20 +763,23 @@ void GlobOpt::RecordInlineeFrameInfo(IR::Instr* inlineeEnd) { frameInfoValue = InlineFrameInfoValue(argOpnd->GetConstValue()); } - else if (argSym->IsConst()) + else if (argSym->IsConst() && !argSym->IsInt64Const()) { + // InlineFrameInfo doesn't currently support Int64Const frameInfoValue = InlineFrameInfoValue(argSym->GetConstValueForBailout()); } else { - if (PHASE_ON(Js::CopyPropPhase, func)) + if (!PHASE_OFF(Js::CopyPropPhase, func)) { Value* value = this->currentBlock->globOptData.FindValue(argSym); - - StackSym * copyPropSym = this->currentBlock->globOptData.GetCopyPropSym(argSym, value); - if (copyPropSym) + if (value) { - argSym = copyPropSym; + StackSym * copyPropSym = this->currentBlock->globOptData.GetCopyPropSym(argSym, value); + if (copyPropSym) + { + argSym = copyPropSym; + } } } @@ -782,7 +813,7 @@ void GlobOpt::RecordInlineeFrameInfo(IR::Instr* inlineeEnd) Assert(globOptData.liveVarSyms->Test(argSym->m_id)); } - if (argSym->IsConst()) + if (argSym->IsConst() && !argSym->IsInt64Const()) { frameInfoValue = InlineFrameInfoValue(argSym->GetConstValueForBailout()); } @@ -944,7 +975,6 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo) bailOutInfo->totalOutParamCount = totalOutParamCount; bailOutInfo->argOutSyms = JitAnewArrayZ(this->func->m_alloc, StackSym *, totalOutParamCount); - uint argRestoreAdjustCount = 0; FOREACH_SLISTBASE_ENTRY(IR::Opnd *, opnd, block->globOptData.callSequence) { if(opnd->GetStackSym()->HasArgSlotNum()) @@ -991,25 +1021,6 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo) bailOutInfo->startCallFunc[startCallNumber] = sym->m_instrDef->m_func; #ifdef _M_IX86 - if (this->currentRegion && (this->currentRegion->GetType() == RegionTypeTry || this->currentRegion->GetType() == RegionTypeFinally)) - { - // For a bailout in argument evaluation from an EH region, the esp is offset by the TryCatch helper's frame. So, the argouts are not actually pushed at the - // offsets stored in the bailout record, which are relative to ebp. Need to restore the argouts from the actual value of esp before calling the Bailout helper. - // For nested calls, argouts for the outer call need to be restored from an offset of stack-adjustment-done-by-the-inner-call from esp. - if (startCallNumber + 1 == bailOutInfo->startCallCount) - { - argRestoreAdjustCount = 0; - } - else - { - argRestoreAdjustCount = bailOutInfo->startCallInfo[startCallNumber + 1].argRestoreAdjustCount + bailOutInfo->startCallInfo[startCallNumber + 1].argCount; - if ((Math::Align(bailOutInfo->startCallInfo[startCallNumber + 1].argCount * MachPtr, MachStackAlignment) - (bailOutInfo->startCallInfo[startCallNumber + 1].argCount * MachPtr)) != 0) - { - argRestoreAdjustCount++; - } - } - } - if (sym->m_isInlinedArgSlot) { bailOutInfo->inlinedStartCall->Set(startCallNumber); @@ -1019,10 +1030,9 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo) Assert(totalOutParamCount >= argOutCount); Assert(argOutCount >= currentArgOutCount); - bailOutInfo->RecordStartCallInfo(startCallNumber, argRestoreAdjustCount, sym->m_instrDef); + bailOutInfo->RecordStartCallInfo(startCallNumber, sym->m_instrDef); totalOutParamCount -= argOutCount; currentArgOutCount = 0; - } } NEXT_SLISTBASE_ENTRY; @@ -1041,7 +1051,11 @@ IR::ByteCodeUsesInstr * GlobOpt::InsertByteCodeUses(IR::Instr * instr, bool includeDef) { IR::ByteCodeUsesInstr * byteCodeUsesInstr = nullptr; - Assert(this->byteCodeUses); + if (!this->byteCodeUses) + { + Assert(this->isAsmJSFunc); + return nullptr; + } IR::RegOpnd * dstOpnd = nullptr; if (includeDef) { diff --git a/deps/chakrashim/core/lib/Backend/GlobOptBlockData.cpp b/deps/chakrashim/core/lib/Backend/GlobOptBlockData.cpp index 0fa3b2413d1..e570337c1cb 100644 --- a/deps/chakrashim/core/lib/Backend/GlobOptBlockData.cpp +++ b/deps/chakrashim/core/lib/Backend/GlobOptBlockData.cpp @@ -34,12 +34,16 @@ GlobOptBlockData::NullOutBlockData(GlobOpt* globOpt, Func* func) this->startCallCount = 0; this->argOutCount = 0; this->totalOutParamCount = 0; - this->inlinedArgOutCount = 0; + this->inlinedArgOutSize = 0; this->hasCSECandidates = false; this->curFunc = func; this->stackLiteralInitFldDataMap = nullptr; + if (this->capturedValues) + { + this->capturedValues->DecrementRefCount(); + } this->capturedValues = nullptr; this->changedSyms = nullptr; @@ -84,7 +88,7 @@ GlobOptBlockData::InitBlockData(GlobOpt* globOpt, Func* func) this->startCallCount = 0; this->argOutCount = 0; this->totalOutParamCount = 0; - this->inlinedArgOutCount = 0; + this->inlinedArgOutSize = 0; this->hasCSECandidates = false; this->curFunc = func; @@ -137,13 +141,17 @@ GlobOptBlockData::ReuseBlockData(GlobOptBlockData *fromData) this->startCallCount = fromData->startCallCount; this->argOutCount = fromData->argOutCount; this->totalOutParamCount = fromData->totalOutParamCount; - this->inlinedArgOutCount = fromData->inlinedArgOutCount; + this->inlinedArgOutSize = fromData->inlinedArgOutSize; this->hasCSECandidates = fromData->hasCSECandidates; this->stackLiteralInitFldDataMap = fromData->stackLiteralInitFldDataMap; this->changedSyms = fromData->changedSyms; - this->changedSyms->ClearAll(); + this->capturedValues = fromData->capturedValues; + if (this->capturedValues) + { + this->capturedValues->IncrementRefCount(); + } this->OnDataReused(fromData); } @@ -180,10 +188,11 @@ GlobOptBlockData::CopyBlockData(GlobOptBlockData *fromData) this->startCallCount = fromData->startCallCount; this->argOutCount = fromData->argOutCount; this->totalOutParamCount = fromData->totalOutParamCount; - this->inlinedArgOutCount = fromData->inlinedArgOutCount; + this->inlinedArgOutSize = fromData->inlinedArgOutSize; this->hasCSECandidates = fromData->hasCSECandidates; this->changedSyms = fromData->changedSyms; + this->capturedValues = fromData->capturedValues; this->stackLiteralInitFldDataMap = fromData->stackLiteralInitFldDataMap; this->OnDataReused(fromData); @@ -253,6 +262,11 @@ GlobOptBlockData::DeleteBlockData() JitAdelete(alloc, this->changedSyms); this->changedSyms = nullptr; + if (this->capturedValues && this->capturedValues->DecrementRefCount() == 0) + { + JitAdelete(this->curFunc->m_alloc, this->capturedValues); + this->capturedValues = nullptr; + } this->OnDataDeleted(); } @@ -348,7 +362,7 @@ void GlobOptBlockData::CloneBlockData(BasicBlock *const toBlockContext, BasicBlo this->startCallCount = fromData->startCallCount; this->argOutCount = fromData->argOutCount; this->totalOutParamCount = fromData->totalOutParamCount; - this->inlinedArgOutCount = fromData->inlinedArgOutCount; + this->inlinedArgOutSize = fromData->inlinedArgOutSize; this->hasCSECandidates = fromData->hasCSECandidates; // Although we don't need the data on loop pre pass, we need to do it for the loop header @@ -365,6 +379,11 @@ void GlobOptBlockData::CloneBlockData(BasicBlock *const toBlockContext, BasicBlo this->changedSyms = JitAnew(alloc, BVSparse, alloc); this->changedSyms->Copy(fromData->changedSyms); + this->capturedValues = fromData->capturedValues; + if (this->capturedValues) + { + this->capturedValues->IncrementRefCount(); + } Assert(fromData->HasData()); this->OnDataInitialized(alloc); @@ -476,10 +495,14 @@ GlobOptBlockData::MergeBlockData( this->isTempSrc->And(fromData->isTempSrc); this->hasCSECandidates &= fromData->hasCSECandidates; + this->changedSyms->Or(fromData->changedSyms); if (this->capturedValues == nullptr) { this->capturedValues = fromData->capturedValues; - this->changedSyms->Or(fromData->changedSyms); + if (this->capturedValues) + { + this->capturedValues->IncrementRefCount(); + } } else { @@ -488,6 +511,7 @@ GlobOptBlockData::MergeBlockData( fromData->capturedValues == nullptr ? nullptr : &fromData->capturedValues->constantValues, [&](ConstantStackSymValue * symValueFrom, ConstantStackSymValue * symValueTo) { + Assert(symValueFrom->Key()->m_id == symValueTo->Key()->m_id); return symValueFrom->Value().IsEqual(symValueTo->Value()); }); @@ -496,12 +520,12 @@ GlobOptBlockData::MergeBlockData( fromData->capturedValues == nullptr ? nullptr : &fromData->capturedValues->copyPropSyms, [&](CopyPropSyms * copyPropSymFrom, CopyPropSyms * copyPropSymTo) { + Assert(copyPropSymFrom->Key()->m_id == copyPropSymTo->Key()->m_id); if (copyPropSymFrom->Value()->m_id == copyPropSymTo->Value()->m_id) { - Value * val = fromData->FindValue(copyPropSymFrom->Key()); - Value * copyVal = fromData->FindValue(copyPropSymTo->Key()); - return (val != nullptr && copyVal != nullptr && - val->GetValueNumber() == copyVal->GetValueNumber()); + Value * fromVal = fromData->FindValue(copyPropSymFrom->Key()); + Value * toVal = this->FindValue(copyPropSymFrom->Key()); + return fromVal && toVal && fromVal->IsEqualTo(toVal); } return false; }); @@ -835,7 +859,7 @@ GlobOptBlockData::MergeBlockData( Assert(this->startCallCount == fromData->startCallCount); Assert(this->argOutCount == fromData->argOutCount); Assert(this->totalOutParamCount == fromData->totalOutParamCount); - Assert(this->inlinedArgOutCount == fromData->inlinedArgOutCount); + Assert(this->inlinedArgOutSize == fromData->inlinedArgOutSize); // stackLiteralInitFldDataMap is a union of the stack literal from two path. // Although we don't need the data on loop prepass, we need to do it for the loop header @@ -1651,6 +1675,15 @@ GlobOptBlockData::SetChangedSym(SymID symId) // else could be hit only in MergeValues and it is handled by MergeCapturedValues } +void +GlobOptBlockData::SetChangedSym(Sym* sym) +{ + if (sym && sym->IsStackSym() && sym->AsStackSym()->HasByteCodeRegSlot()) + { + SetChangedSym(sym->m_id); + } +} + void GlobOptBlockData::SetValue(Value *val, Sym * sym) { @@ -1668,10 +1701,7 @@ GlobOptBlockData::SetValue(Value *val, Sym * sym) else { this->SetValueToHashTable(this->symToValueMap, val, sym); - if (isStackSym && sym->AsStackSym()->HasByteCodeRegSlot()) - { - this->SetChangedSym(sym->m_id); - } + this->SetChangedSym(sym); } } @@ -1786,7 +1816,7 @@ GlobOptBlockData::IsTypeSpecialized(Sym const * sym) const bool GlobOptBlockData::IsSwitchInt32TypeSpecialized(IR::Instr const * instr) const { - return GlobOpt::IsSwitchOptEnabled(instr->m_func->GetTopFunc()) + return GlobOpt::IsSwitchOptEnabledForIntTypeSpec(instr->m_func->GetTopFunc()) && instr->GetSrc1()->IsRegOpnd() && this->IsInt32TypeSpecialized(instr->GetSrc1()->AsRegOpnd()->m_sym); } diff --git a/deps/chakrashim/core/lib/Backend/GlobOptBlockData.h b/deps/chakrashim/core/lib/Backend/GlobOptBlockData.h index b0070740e7b..dffdf0a7208 100644 --- a/deps/chakrashim/core/lib/Backend/GlobOptBlockData.h +++ b/deps/chakrashim/core/lib/Backend/GlobOptBlockData.h @@ -194,7 +194,7 @@ class GlobOptBlockData CapturedValues * capturedValues; BVSparse * changedSyms; - uint inlinedArgOutCount; + uint inlinedArgOutSize; bool hasCSECandidates; @@ -344,6 +344,7 @@ class GlobOptBlockData // Changed Symbol Tracking public: void SetChangedSym(SymID symId); + void SetChangedSym(Sym* sym); private: // Other diff --git a/deps/chakrashim/core/lib/Backend/GlobOptFields.cpp b/deps/chakrashim/core/lib/Backend/GlobOptFields.cpp index 5ebc0007a9e..a86f1f64d19 100644 --- a/deps/chakrashim/core/lib/Backend/GlobOptFields.cpp +++ b/deps/chakrashim/core/lib/Backend/GlobOptFields.cpp @@ -2040,8 +2040,8 @@ GlobOpt::AssertCanCopyPropOrCSEFieldLoad(IR::Instr * instr) || instr->m_opcode == Js::OpCode::CheckFixedFld || instr->m_opcode == Js::OpCode::CheckPropertyGuardAndLoadType); - Assert(instr->m_opcode == Js::OpCode::CheckFixedFld || instr->GetDst()->GetType() == TyVar); - Assert(instr->GetSrc1()->GetType() == TyVar); + Assert(instr->m_opcode == Js::OpCode::CheckFixedFld || instr->GetDst()->GetType() == TyVar || instr->m_func->GetJITFunctionBody()->IsAsmJsMode()); + Assert(instr->GetSrc1()->GetType() == TyVar || instr->m_func->GetJITFunctionBody()->IsAsmJsMode()); Assert(instr->GetSrc1()->AsSymOpnd()->m_sym->IsPropertySym()); Assert(instr->GetSrc2() == nullptr); } @@ -2755,24 +2755,14 @@ GlobOpt::ProcessPropOpInTypeCheckSeq(IR::Instr* instr, IR::PropertySymOpnd *opnd return isSpecialized; } -IR::Instr* +void GlobOpt::OptNewScObject(IR::Instr** instrPtr, Value* srcVal) { IR::Instr *&instr = *instrPtr; - if (IsLoopPrePass()) + if (!instr->IsNewScObjectInstr() || IsLoopPrePass() || !this->DoFieldRefOpts() || PHASE_OFF(Js::ObjTypeSpecNewObjPhase, this->func)) { - return instr; - } - - if (PHASE_OFF(Js::ObjTypeSpecNewObjPhase, this->func) || !this->DoFieldRefOpts()) - { - return instr; - } - - if (!instr->IsNewScObjectInstr()) - { - return nullptr; + return; } bool isCtorInlined = instr->m_opcode == Js::OpCode::NewScObjectNoCtor; @@ -2787,8 +2777,6 @@ GlobOpt::OptNewScObject(IR::Instr** instrPtr, Value* srcVal) { GenerateBailAtOperation(instrPtr, IR::BailOutFailedCtorGuardCheck); } - - return instr; } void diff --git a/deps/chakrashim/core/lib/Backend/IR.cpp b/deps/chakrashim/core/lib/Backend/IR.cpp index 7a2dcfc7be6..2927680fa61 100644 --- a/deps/chakrashim/core/lib/Backend/IR.cpp +++ b/deps/chakrashim/core/lib/Backend/IR.cpp @@ -359,7 +359,6 @@ Instr::Free() return; } Assert(this->m_func->GetTopFunc()->allowRemoveBailOutArgInstr || !stackSym->m_isBailOutReferenced); - stackSym->m_instrDef = nullptr; } else { @@ -373,6 +372,18 @@ Instr::Free() || (stackSym->m_isEncodedConstant && stackSym->constantValue != 0)); } } + this->FreeDst(); + } + if (this->GetSrc1()) + { + this->FreeSrc1(); + } + if (this->GetSrc2()) + { + // This pattern isn't so unusual: + // src = instr->UnlinkSrc1(); + // instr->Remove(); + this->FreeSrc2(); } ClearBailOutInfo(); @@ -1142,11 +1153,10 @@ Instr::UnlinkBailOutInfo() return bailOutInfo; } -bool +void Instr::ReplaceBailOutInfo(BailOutInfo *newBailOutInfo) { BailOutInfo *oldBailOutInfo = nullptr; - bool deleteOld = false; #if DBG newBailOutInfo->wasCopied = true; @@ -1178,10 +1188,9 @@ Instr::ReplaceBailOutInfo(BailOutInfo *newBailOutInfo) JitArenaAllocator * alloc = this->m_func->m_alloc; oldBailOutInfo->Clear(alloc); JitAdelete(alloc, oldBailOutInfo); - deleteOld = true; } - return deleteOld; + return; } IR::Instr *Instr::ShareBailOut() @@ -2155,17 +2164,23 @@ Instr::UnlinkDst() } } + if (stackSym && stackSym->m_isSingleDef) + { + if (stackSym->m_instrDef == this) + { + stackSym->m_instrDef = nullptr; + } + else + { + Assert(oldDst->isFakeDst); + } + } #if DBG if (oldDst->isFakeDst) { oldDst->isFakeDst = false; } #endif - if (stackSym && stackSym->m_isSingleDef) - { - AssertMsg(stackSym->m_instrDef == this, "m_instrDef incorrectly set"); - stackSym->m_instrDef = nullptr; - } oldDst->UnUse(); this->m_dst = nullptr; @@ -2217,7 +2232,7 @@ Instr::ReplaceDst(Opnd * newDst) Instr * Instr::SinkDst(Js::OpCode assignOpcode, RegNum regNum, IR::Instr *insertAfterInstr) { - return SinkDst(assignOpcode, StackSym::New(TyVar, m_func), regNum, insertAfterInstr); + return SinkDst(assignOpcode, StackSym::New(this->GetDst()->GetType(), m_func), regNum, insertAfterInstr); } Instr * @@ -2514,7 +2529,7 @@ Instr::HoistIndirOffset(IR::IndirOpnd *indirOpnd, RegNum regNum) indirOpnd->SetOffset(0); indirOpnd->SetIndexOpnd(indexOpnd); - Instr *instrAssign = LowererMD::CreateAssign(indexOpnd, offsetOpnd, this); + Instr *instrAssign = Lowerer::InsertMove(indexOpnd, offsetOpnd, this); indexOpnd->m_sym->SetIsIntConst(offset); return instrAssign; } @@ -2612,7 +2627,7 @@ Instr::HoistIndirIndexOpndAsAdd(IR::IndirOpnd *orgOpnd, IR::Opnd *baseOpnd, IR:: { IR::RegOpnd *newBaseOpnd = IR::RegOpnd::New(StackSym::New(TyMachPtr, this->m_func), regNum, TyMachPtr, this->m_func); - IR::Instr * instrAdd = IR::Instr::New(Js::OpCode::ADD, newBaseOpnd, baseOpnd, indexOpnd, this->m_func); + IR::Instr * instrAdd = IR::Instr::New(Js::OpCode::ADD, newBaseOpnd, baseOpnd, indexOpnd->UseWithNewType(TyMachPtr, this->m_func), this->m_func); this->InsertBefore(instrAdd); @@ -2841,109 +2856,148 @@ Instr::GetOrCreateContinueLabel(const bool isHelper) return label; } -///---------------------------------------------------------------------------- -/// -/// Instr::FindRegUse -/// -/// Search a reg use of the given sym. Return the RegOpnd that uses it. -/// -///---------------------------------------------------------------------------- - -IR::RegOpnd * -Instr::FindRegUse(StackSym *sym) +bool +Instr::HasSymUseSrc(StackSym *sym, IR::Opnd* src) { - IR::Opnd *src1 = this->GetSrc1(); + if (!src) + { + return false; + } + if (src->IsRegOpnd()) + { + RegOpnd *regOpnd = src->AsRegOpnd(); - // Check src1 - if (src1) + if (regOpnd->m_sym == sym) + { + return true; + } + } + else if (src->IsIndirOpnd()) { - if (src1->IsRegOpnd()) + IR::IndirOpnd *indirOpnd = src->AsIndirOpnd(); + RegOpnd * baseOpnd = indirOpnd->GetBaseOpnd(); + if (baseOpnd != nullptr && baseOpnd->m_sym == sym) { - RegOpnd *regOpnd = src1->AsRegOpnd(); - - if (regOpnd->m_sym == sym) - { - return regOpnd; - } + return true; } - else if (src1->IsIndirOpnd()) + else if (indirOpnd->GetIndexOpnd() && indirOpnd->GetIndexOpnd()->m_sym == sym) { - IndirOpnd * indirOpnd = src1->AsIndirOpnd(); - RegOpnd * baseOpnd = indirOpnd->GetBaseOpnd(); - if (baseOpnd != nullptr && baseOpnd->m_sym == sym) - { - return baseOpnd; - } - else if (indirOpnd->GetIndexOpnd() && indirOpnd->GetIndexOpnd()->m_sym == sym) - { - return indirOpnd->GetIndexOpnd(); - } + return true; } - IR::Opnd *src2 = this->GetSrc2(); - - // Check src2 - if (src2) + } + else if (src->IsListOpnd()) + { + IR::ListOpnd* list = src->AsListOpnd(); + for (int i = 0; i < list->Count(); ++i) { - if (src2->IsRegOpnd()) + if (HasSymUseSrc(sym, list->Item(i))) { - RegOpnd *regOpnd = src2->AsRegOpnd(); - - if (regOpnd->m_sym == sym) - { - return regOpnd; - } + return true; } - else if (src2->IsIndirOpnd()) + } + } + else if (src->IsSymOpnd()) + { + SymOpnd* symOpnd = src->AsSymOpnd(); + if (symOpnd->GetSym() == sym) + { + return true; + } + if (symOpnd->IsPropertySymOpnd()) + { + PropertySymOpnd* propertySymOpnd = symOpnd->AsPropertySymOpnd(); + if (propertySymOpnd->GetObjectSym() == sym) { - IR::IndirOpnd *indirOpnd = src2->AsIndirOpnd(); - RegOpnd * baseOpnd = indirOpnd->GetBaseOpnd(); - if (baseOpnd != nullptr && baseOpnd->m_sym == sym) - { - return baseOpnd; - } - else if (indirOpnd->GetIndexOpnd() && indirOpnd->GetIndexOpnd()->m_sym == sym) - { - return indirOpnd->GetIndexOpnd(); - } + return true; } } } + return false; +} - // Check uses in dst - IR::Opnd *dst = this->GetDst(); - if (dst != nullptr && dst->IsIndirOpnd()) +bool +Instr::HasSymUseDst(StackSym *sym, IR::Opnd* dst) +{ + if (!dst) + { + return false; + } + if (dst->IsIndirOpnd()) { IR::IndirOpnd *indirOpnd = dst->AsIndirOpnd(); RegOpnd * baseOpnd = indirOpnd->GetBaseOpnd(); if (baseOpnd != nullptr && baseOpnd->m_sym == sym) { - return baseOpnd; + return true; } else if (indirOpnd->GetIndexOpnd() && indirOpnd->GetIndexOpnd()->m_sym == sym) { - return indirOpnd->GetIndexOpnd(); + return true; + } + } + else if (dst->IsListOpnd()) + { + IR::ListOpnd* list = dst->AsListOpnd(); + for (int i = 0; i < list->Count(); ++i) + { + if (HasSymUseDst(sym, list->Item(i))) + { + return true; + } + } + } + else if (dst->IsSymOpnd()) + { + SymOpnd* symOpnd = dst->AsSymOpnd(); + if (symOpnd->GetSym() == sym) + { + return true; + } + if (symOpnd->IsPropertySymOpnd()) + { + PropertySymOpnd* propertySymOpnd = symOpnd->AsPropertySymOpnd(); + if (propertySymOpnd->GetObjectSym() == sym) + { + return true; + } } } + return false; +} - return nullptr; +bool +Instr::HasSymUse(StackSym *sym) +{ + if (HasSymUseSrc(sym, this->GetSrc1())) + { + return true; + } + if (HasSymUseSrc(sym, this->GetSrc2())) + { + return true; + } + if (HasSymUseDst(sym, this->GetDst())) + { + return true; + } + return false; } -IR::RegOpnd * -Instr::FindRegUseInRange(StackSym *sym, IR::Instr *instrBegin, IR::Instr *instrEnd) +bool +Instr::HasSymUseInRange(StackSym *sym, IR::Instr *instrBegin, IR::Instr *instrEnd) { FOREACH_INSTR_IN_RANGE(instr, instrBegin, instrEnd) { Assert(instr); - IR::RegOpnd *opnd = instr->FindRegUse(sym); - if (opnd) + if (instr->HasSymUse(sym)) { - return opnd; + return true; } } NEXT_INSTR_IN_RANGE; - return nullptr; + return false; } ///---------------------------------------------------------------------------- @@ -3340,6 +3394,16 @@ IR::Instr* Instr::GetArgOutSnapshot() return instr; } +bool Instr::OpndHasAnyImplicitCalls(IR::Opnd* opnd, bool isSrc) +{ + return opnd && ( + (opnd->IsSymOpnd() && opnd->AsSymOpnd()->m_sym->IsPropertySym()) || + opnd->IsIndirOpnd() || + (isSrc && !opnd->GetValueType().IsPrimitive()) || + (opnd->IsListOpnd() && opnd->AsListOpnd()->Any([isSrc](IR::Opnd* lOpnd) { return OpndHasAnyImplicitCalls(lOpnd, isSrc); })) + ); +} + bool Instr::HasAnyImplicitCalls() const { // there can be no implicit calls in asm.js @@ -3353,40 +3417,11 @@ bool Instr::HasAnyImplicitCalls() const } if (OpCodeAttr::OpndHasImplicitCall(this->m_opcode)) { - if (this->m_dst && - ((this->m_dst->IsSymOpnd() && this->m_dst->AsSymOpnd()->m_sym->IsPropertySym()) || - this->m_dst->IsIndirOpnd())) - { - return true; - } - - IR::Opnd *src1 = this->GetSrc1(); - if (src1) - { - if ((src1->IsSymOpnd() && src1->AsSymOpnd()->m_sym->IsPropertySym()) || src1->IsIndirOpnd()) - { - return true; - } - - if (!src1->GetValueType().IsPrimitive()) - { - return true; - } - - IR::Opnd *src2 = this->GetSrc2(); - if (src2) - { - if ((src2->IsSymOpnd() && src2->AsSymOpnd()->m_sym->IsPropertySym()) || src2->IsIndirOpnd()) - { - return true; - } - - if (!src2->GetValueType().IsPrimitive()) - { - return true; - } - } - } + return ( + OpndHasAnyImplicitCalls(this->GetDst(), false) || + OpndHasAnyImplicitCalls(this->GetSrc1(), true) || + OpndHasAnyImplicitCalls(this->GetSrc2(), true) + ); } return false; @@ -3462,15 +3497,54 @@ uint Instr::GetArgOutCount(bool getInterpreterArgOutCount) Assert(opcode == Js::OpCode::StartCall || opcode == Js::OpCode::InlineeEnd || opcode == Js::OpCode::InlineBuiltInEnd|| opcode == Js::OpCode::InlineNonTrackingBuiltInEnd || opcode == Js::OpCode::EndCallForPolymorphicInlinee || opcode == Js::OpCode::LoweredStartCall); - if (!getInterpreterArgOutCount) + + Assert(!getInterpreterArgOutCount || opcode == Js::OpCode::StartCall); + uint argOutCount = !this->GetSrc2() || !getInterpreterArgOutCount || m_func->GetJITFunctionBody()->IsAsmJsMode() + ? this->GetSrc1()->AsIntConstOpnd()->AsUint32() + : this->GetSrc2()->AsIntConstOpnd()->AsUint32(); + + return (uint)argOutCount; +} + +uint Instr::GetAsmJsArgOutSize() +{ + switch (m_opcode) + { + case Js::OpCode::StartCall: + case Js::OpCode::LoweredStartCall: + return GetSrc2()->AsIntConstOpnd()->AsUint32(); + + case Js::OpCode::InlineeEnd: { - return this->GetSrc1()->AsIntConstOpnd()->AsUint32(); + // StartCall instr has the size, so walk back to it + IR::Instr *argInstr = this; + while(argInstr->m_opcode != Js::OpCode::StartCall && argInstr->m_opcode != Js::OpCode::LoweredStartCall) + { + argInstr = argInstr->GetSrc2()->GetStackSym()->GetInstrDef(); + } + // add StartCall arg size with inlinee meta args for full size + uint size = UInt32Math::Add(argInstr->GetSrc2()->AsIntConstOpnd()->AsUint32(), Js::Constants::InlineeMetaArgCount * MachPtr); + return size; + } + default: + Assert(UNREACHED); + return 0; } +} - Assert(opcode == Js::OpCode::StartCall); - IntConstType argOutCount = !this->GetSrc2() ? this->GetSrc1()->AsIntConstOpnd()->GetValue() : this->GetSrc2()->AsIntConstOpnd()->GetValue(); - Assert(argOutCount >= 0 && argOutCount < UINT32_MAX); - return (uint)argOutCount; +uint Instr::GetArgOutSize(bool getInterpreterArgOutCount) +{ + Js::OpCode opcode = this->m_opcode; + Assert(opcode == Js::OpCode::StartCall || + opcode == Js::OpCode::InlineeEnd || opcode == Js::OpCode::InlineBuiltInEnd || opcode == Js::OpCode::InlineNonTrackingBuiltInEnd || + opcode == Js::OpCode::EndCallForPolymorphicInlinee || opcode == Js::OpCode::LoweredStartCall); + + Assert(!getInterpreterArgOutCount || opcode == Js::OpCode::StartCall); + if (m_func->GetJITFunctionBody()->IsAsmJsMode()) + { + return GetAsmJsArgOutSize(); + } + return UInt32Math::Mul(GetArgOutCount(getInterpreterArgOutCount)); } PropertySymOpnd *Instr::GetPropertySymOpnd() const @@ -4554,7 +4628,7 @@ PragmaInstr::Dump(IRDumpFlags flags) { functionBody = ((Js::FunctionBody*)m_func->GetJITFunctionBody()->GetAddr()); } - if (functionBody) + if (functionBody && !functionBody->GetUtf8SourceInfo()->GetIsLibraryCode()) { functionBody->PrintStatementSourceLine(this->m_statementIndex); } diff --git a/deps/chakrashim/core/lib/Backend/IR.h b/deps/chakrashim/core/lib/Backend/IR.h index 502f669bed9..ec7b1fa9cb0 100644 --- a/deps/chakrashim/core/lib/Backend/IR.h +++ b/deps/chakrashim/core/lib/Backend/IR.h @@ -4,7 +4,7 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#include "Language/JavascriptNativeOperators.h" +#include "JavascriptNativeOperators.h" class Func; class BasicBlock; @@ -26,13 +26,29 @@ struct CapturedValues SListBase constantValues; // Captured constant values during glob opt SListBase copyPropSyms; // Captured copy prop values during glob opt BVSparse * argObjSyms; // Captured arg object symbols during glob opt + uint refCount; + CapturedValues() : argObjSyms(nullptr), refCount(0) {} ~CapturedValues() { // Reset SListBase to be exception safe. Captured values are from GlobOpt->func->alloc // in normal case the 2 SListBase are empty so no Clear needed, also no need to Clear in exception case constantValues.Reset(); copyPropSyms.Reset(); + argObjSyms = nullptr; + Assert(refCount == 0); + } + + uint DecrementRefCount() + { + Assert(refCount != 0); + return --refCount; + } + + void IncrementRefCount() + { + Assert(refCount > 0); + refCount++; } }; @@ -42,7 +58,7 @@ class BranchJumpTableWrapper { public: - BranchJumpTableWrapper(uint tableSize) : defaultTarget(nullptr), labelInstr(nullptr), tableSize(tableSize) + BranchJumpTableWrapper(uint tableSize) : jmpTable(nullptr), defaultTarget(nullptr), labelInstr(nullptr), tableSize(tableSize) { } @@ -212,6 +228,7 @@ class Instr bool ShouldCheckForIntOverflow() const; bool ShouldCheckFor32BitOverflow() const; bool ShouldCheckForNon32BitOverflow() const; + static bool OpndHasAnyImplicitCalls(IR::Opnd* opnd, bool isSrc); bool HasAnyImplicitCalls() const; bool HasAnySideEffects() const; bool AreAllOpndInt64() const; @@ -271,8 +288,10 @@ class Instr IR::Instr * GetPrevRealInstrOrLabel() const; IR::Instr * GetInsertBeforeByteCodeUsesInstr(); IR::LabelInstr *GetOrCreateContinueLabel(const bool isHelper = false); - RegOpnd * FindRegUse(StackSym *sym); - static RegOpnd *FindRegUseInRange(StackSym *sym, Instr *instrBegin, Instr *instrEnd); + static bool HasSymUseSrc(StackSym *sym, IR::Opnd*); + static bool HasSymUseDst(StackSym *sym, IR::Opnd*); + bool HasSymUse(StackSym *sym); + static bool HasSymUseInRange(StackSym *sym, Instr *instrBegin, Instr *instrEnd); RegOpnd * FindRegDef(StackSym *sym); static Instr* FindSingleDefInstr(Js::OpCode opCode, Opnd* src); @@ -312,7 +331,7 @@ class Instr BailOutInfo * GetBailOutInfo() const; BailOutInfo * UnlinkBailOutInfo(); - bool ReplaceBailOutInfo(BailOutInfo *newBailOutInfo); + void ReplaceBailOutInfo(BailOutInfo *newBailOutInfo); IR::Instr * ShareBailOut(); BailOutKind GetBailOutKind() const; BailOutKind GetBailOutKindNoBits() const; @@ -435,6 +454,8 @@ class Instr IR::Instr* GetArgOutSnapshot(); FixedFieldInfo* GetFixedFunction() const; uint GetArgOutCount(bool getInterpreterArgOutCount); + uint GetArgOutSize(bool getInterpreterArgOutCount); + uint GetAsmJsArgOutSize(); IR::PropertySymOpnd *GetPropertySymOpnd() const; bool CallsAccessor(IR::PropertySymOpnd * methodOpnd = nullptr); bool CallsGetter(); @@ -457,9 +478,6 @@ class Instr void SetBailOutKind_NoAssert(const IR::BailOutKind bailOutKind); public: - // used only for SIMD Ld/St from typed arrays. - // we keep these here to avoid increase in number of opcodes and to not use ExtendedArgs - uint8 dataWidth; #ifdef BAILOUT_INJECTION uint bailOutByteCodeLocation; @@ -474,6 +492,11 @@ class Instr Js::OpCode m_opcode; uint8 ignoreOverflowBitCount; // Number of bits after which ovf matters. Currently used for MULs. + // used only for SIMD Ld/St from typed arrays. + // we keep these here to avoid increase in number of opcodes and to not use ExtendedArgs + uint8 dataWidth; + + bool isFsBased : 1; // TEMP : just for BS testing bool dstIsTempNumber : 1; bool dstIsTempNumberTransferred : 1; @@ -673,7 +696,7 @@ class LabelInstr : public Instr union labelLocation { BYTE * pc; // Used by encoder and is the real pc offset - uint32 offset; // Used by preEncoder and is an estimation pc offset, not accurate + uintptr_t offset; // Used by preEncoder and is an estimation pc offset, not accurate } m_pc; BasicBlock * m_block; @@ -683,9 +706,9 @@ class LabelInstr : public Instr inline void SetPC(BYTE * pc); inline BYTE * GetPC(void) const; - inline void SetOffset(uint32 offset); - inline void ResetOffset(uint32 offset); - inline uint32 GetOffset(void) const; + inline void SetOffset(uintptr_t offset); + inline void ResetOffset(uintptr_t offset); + inline uintptr_t GetOffset(void) const; inline void SetBasicBlock(BasicBlock * block); inline BasicBlock * GetBasicBlock(void) const; inline void SetLoop(Loop *loop); @@ -825,7 +848,10 @@ class MultiBranchInstr : public BranchInstr IntConstType m_lastCaseValue; MultiBranchInstr() : - m_branchTargets(nullptr) + m_branchTargets(nullptr), + m_kind(IntJumpTable), + m_baseCaseValue(0), + m_lastCaseValue(0) { #if DBG m_isMultiBranch = true; diff --git a/deps/chakrashim/core/lib/Backend/IR.inl b/deps/chakrashim/core/lib/Backend/IR.inl index d75cb203ede..68f682ca45d 100644 --- a/deps/chakrashim/core/lib/Backend/IR.inl +++ b/deps/chakrashim/core/lib/Backend/IR.inl @@ -637,7 +637,7 @@ LabelInstr::GetPC(void) const ///---------------------------------------------------------------------------- inline void -LabelInstr::ResetOffset(uint32 offset) +LabelInstr::ResetOffset(uintptr_t offset) { AssertMsg(this->isInlineeEntryInstr, "As of now only InlineeEntryInstr overwrites the offset at encoder stage"); this->m_pc.offset = offset; @@ -650,7 +650,7 @@ LabelInstr::ResetOffset(uint32 offset) ///---------------------------------------------------------------------------- inline void -LabelInstr::SetOffset(uint32 offset) +LabelInstr::SetOffset(uintptr_t offset) { AssertMsg(this->m_pc.offset == 0, "Overwriting existing byte offset"); this->m_pc.offset = offset; @@ -662,7 +662,7 @@ LabelInstr::SetOffset(uint32 offset) /// ///---------------------------------------------------------------------------- -inline uint32 +inline uintptr_t LabelInstr::GetOffset(void) const { diff --git a/deps/chakrashim/core/lib/Backend/IRBuilder.cpp b/deps/chakrashim/core/lib/Backend/IRBuilder.cpp index a7fe5517a2c..099999b6d11 100644 --- a/deps/chakrashim/core/lib/Backend/IRBuilder.cpp +++ b/deps/chakrashim/core/lib/Backend/IRBuilder.cpp @@ -99,7 +99,7 @@ IRBuilder::DoBailOnNoProfile() return false; } - if (!m_func->DoGlobOpt() || m_func->GetTopFunc()->HasTry()) + if (!m_func->DoGlobOpt()) { return false; } @@ -413,7 +413,6 @@ IRBuilder::Build() m_func->m_exitInstr = IR::ExitInstr::New(Js::OpCode::FunctionExit, m_func); m_func->m_tailInstr = m_func->m_exitInstr; m_func->m_headInstr->InsertAfter(m_func->m_tailInstr); - m_func->m_isLeaf = true; // until proven otherwise if (m_func->GetJITFunctionBody()->IsParamAndBodyScopeMerged()) { @@ -442,7 +441,7 @@ IRBuilder::Build() // those as if they are local for the value of the with statement this->m_ldSlots = BVFixed::New(m_func->GetJITFunctionBody()->GetLocalsCount(), m_tempAlloc); this->m_stSlots = BVFixed::New(m_func->GetJITFunctionBody()->GetFirstTmpReg(), m_tempAlloc); - this->m_loopBodyRetIPSym = StackSym::New(TyInt32, this->m_func); + this->m_loopBodyRetIPSym = StackSym::New(TyMachReg, this->m_func); #if DBG if (m_func->GetJITFunctionBody()->GetTempCount() != 0) { @@ -1804,6 +1803,15 @@ IRBuilder::BuildReg1(Js::OpCode newOpcode, uint32 offset, Js::RegSlot R0) } dstIsCatchObject = true; break; + + case Js::OpCode::LdChakraLib: + { + const auto addrOpnd = IR::AddrOpnd::New(m_func->GetScriptContextInfo()->GetChakraLibAddr(), IR::AddrOpndKindDynamicVar, m_func, true); + addrOpnd->SetValueType(ValueType::PrimitiveOrObject); + srcOpnd = addrOpnd; + newOpcode = Js::OpCode::Ld_A; + break; + } } IR::RegOpnd * dstOpnd = this->BuildDstOpnd(dstRegSlot, TyVar, dstIsCatchObject); @@ -1993,36 +2001,6 @@ IRBuilder::BuildReg2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot R0, Js::Re this->AddInstr(instr, offset); } -template -void -IRBuilder::BuildReg2WithICIndex(Js::OpCode newOpcode, uint32 offset) -{ - AssertMsg(false, "NYI"); -} - -template -void -IRBuilder::BuildProfiledReg2WithICIndex(Js::OpCode newOpcode, uint32 offset) -{ - Assert(OpCodeAttr::IsProfiledOpWithICIndex(newOpcode)); - Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); - auto layout = m_jnReader.GetLayout>>(); - - if (!PHASE_OFF(Js::ClosureRegCheckPhase, m_func)) - { - this->DoClosureRegCheck(layout->R0); - this->DoClosureRegCheck(layout->R1); - } - - BuildProfiledReg2WithICIndex(newOpcode, offset, layout->R0, layout->R1, layout->profileId, layout->inlineCacheIndex); -} - -void -IRBuilder::BuildProfiledReg2WithICIndex(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex) -{ - BuildProfiledReg2(newOpcode, offset, dstRegSlot, srcRegSlot, profileId, inlineCacheIndex); -} - ///---------------------------------------------------------------------------- /// /// IRBuilder::BuildProfiledReg2 @@ -2048,7 +2026,7 @@ IRBuilder::BuildProfiledReg2(Js::OpCode newOpcode, uint32 offset) } void -IRBuilder::BuildProfiledReg2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex) +IRBuilder::BuildProfiledReg2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, Js::ProfileId profileId) { bool switchFound = false; @@ -2117,7 +2095,6 @@ IRBuilder::BuildProfiledReg2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot ds IR::JitProfilingInstr *profiledInstr = IR::JitProfilingInstr::New(newOpcode, dstOpnd, src1Opnd, m_func); profiledInstr->profileId = profileId; profiledInstr->isBeginSwitch = newOpcode == Js::OpCode::Ld_A; - profiledInstr->inlineCacheIndex = inlineCacheIndex; instr = profiledInstr; } else if(isProfiled) @@ -2837,30 +2814,6 @@ IRBuilder::BuildUnsigned1(Js::OpCode newOpcode, uint32 offset, uint32 num) } } -void -IRBuilder::BuildReg1Int2(Js::OpCode newOpcode, uint32 offset) -{ - Assert(!OpCodeAttr::HasMultiSizeLayout(newOpcode)); - - const unaligned Js::OpLayoutReg1Int2 *regLayout = m_jnReader.Reg1Int2(); - Js::RegSlot R0 = regLayout->R0; - int32 C1 = regLayout->C1; - int32 C2 = regLayout->C2; - - if (!PHASE_OFF(Js::ClosureRegCheckPhase, m_func)) - { - this->DoClosureRegCheck(R0); - } - - IR::RegOpnd* dstOpnd = this->BuildDstOpnd(R0); - - IR::IntConstOpnd * srcOpnd = IR::IntConstOpnd::New(C1, TyInt32, m_func); - IR::IntConstOpnd * src2Opnd = IR::IntConstOpnd::New(C2, TyInt32, m_func); - IR::Instr* instr = IR::Instr::New(newOpcode, dstOpnd, srcOpnd, src2Opnd, m_func); - - this->AddInstr(instr, offset); -} - template void IRBuilder::BuildProfiledReg1Unsigned1(Js::OpCode newOpcode, uint32 offset) @@ -5829,7 +5782,6 @@ template void IRBuilder::BuildCallI(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(Js::OpCodeUtil::IsCallOp(newOpcode) || newOpcode == Js::OpCode::NewScObject || newOpcode == Js::OpCode::NewScObjArray); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>(); @@ -5847,7 +5799,6 @@ template void IRBuilder::BuildCallIFlags(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(Js::OpCodeUtil::IsCallOp(newOpcode) || newOpcode == Js::OpCode::NewScObject || newOpcode == Js::OpCode::NewScObjArray); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>(); @@ -5858,12 +5809,11 @@ IRBuilder::BuildCallIFlags(Js::OpCode newOpcode, uint32 offset) this->DoClosureRegCheck(layout->Function); } - IR::Instr* instr = BuildCallI_Helper(newOpcode, offset, layout->Return, layout->Function, layout->ArgCount, Js::Constants::NoProfileId); + IR::Instr* instr = BuildCallI_Helper(newOpcode, offset, layout->Return, layout->Function, layout->ArgCount, Js::Constants::NoProfileId, layout->callFlags); Assert(instr->m_opcode == Js::OpCode::CallIFlags); if (instr->m_opcode == Js::OpCode::CallIFlags) { instr->m_opcode = - layout->callFlags == Js::CallFlags::CallFlags_NewTarget ? Js::OpCode::CallIPut : layout->callFlags == (Js::CallFlags::CallFlags_NewTarget | Js::CallFlags::CallFlags_New | Js::CallFlags::CallFlags_ExtraArg) ? Js::OpCode::CallINewTargetNew : layout->callFlags == Js::CallFlags::CallFlags_New ? Js::OpCode::CallINew : instr->m_opcode; @@ -5889,7 +5839,6 @@ template void IRBuilder::BuildCallIExtended(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>(); @@ -5904,13 +5853,13 @@ IRBuilder::BuildCallIExtended(Js::OpCode newOpcode, uint32 offset) IR::Instr* IRBuilder::BuildCallIExtended(Js::OpCode newOpcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, - Js::ArgSlot argCount, Js::CallIExtendedOptions options, uint32 spreadAuxOffset) + Js::ArgSlot argCount, Js::CallIExtendedOptions options, uint32 spreadAuxOffset, Js::CallFlags flags) { if (options & Js::CallIExtended_SpreadArgs) { BuildLdSpreadIndices(offset, spreadAuxOffset); } - return BuildCallI_Helper(newOpcode, offset, returnValue, function, argCount, Js::Constants::NoProfileId); + return BuildCallI_Helper(newOpcode, offset, returnValue, function, argCount, Js::Constants::NoProfileId, flags); } template @@ -5931,7 +5880,6 @@ template void IRBuilder::BuildCallIExtendedFlags(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>(); @@ -5941,7 +5889,7 @@ IRBuilder::BuildCallIExtendedFlags(Js::OpCode newOpcode, uint32 offset) this->DoClosureRegCheck(layout->Function); } - IR::Instr* instr = BuildCallIExtended(newOpcode, offset, layout->Return, layout->Function, layout->ArgCount, layout->Options, layout->SpreadAuxOffset); + IR::Instr* instr = BuildCallIExtended(newOpcode, offset, layout->Return, layout->Function, layout->ArgCount, layout->Options, layout->SpreadAuxOffset, layout->callFlags); Assert(instr->m_opcode == Js::OpCode::CallIExtendedFlags); if (instr->m_opcode == Js::OpCode::CallIExtendedFlags) @@ -5972,7 +5920,6 @@ template void IRBuilder::BuildProfiledCallIFlagsWithICIndex(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOpWithICIndex(newOpcode) || Js::OpCodeUtil::IsProfiledCallOpWithICIndex(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>>(); @@ -5988,7 +5935,6 @@ IRBuilder::BuildProfiledCallIFlagsWithICIndex(Js::OpCode newOpcode, uint32 offse if (instr->m_opcode == Js::OpCode::CallIFlags) { instr->m_opcode = - layout->callFlags == Js::CallFlags::CallFlags_NewTarget ? Js::OpCode::CallIPut : layout->callFlags == (Js::CallFlags::CallFlags_NewTarget | Js::CallFlags::CallFlags_New | Js::CallFlags::CallFlags_ExtraArg) ? Js::OpCode::CallINewTargetNew : layout->callFlags == Js::CallFlags::CallFlags_New ? Js::OpCode::CallINew : instr->m_opcode; @@ -5999,7 +5945,6 @@ template void IRBuilder::BuildProfiledCallIWithICIndex(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOpWithICIndex(newOpcode) || Js::OpCodeUtil::IsProfiledCallOpWithICIndex(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>>(); @@ -6017,14 +5962,13 @@ IR::Instr* IRBuilder::BuildProfiledCallIWithICIndex(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, Js::ArgSlot argCount, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex) { - return BuildProfiledCallI(opcode, offset, returnValue, function, argCount, profileId, inlineCacheIndex); + return BuildProfiledCallI(opcode, offset, returnValue, function, argCount, profileId, Js::CallFlags_None, inlineCacheIndex); } template void IRBuilder::BuildProfiledCallIExtendedFlags(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOp(newOpcode) || Js::OpCodeUtil::IsProfiledCallOp(newOpcode) || Js::OpCodeUtil::IsProfiledReturnTypeCallOp(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); @@ -6036,7 +5980,7 @@ IRBuilder::BuildProfiledCallIExtendedFlags(Js::OpCode newOpcode, uint32 offset) this->DoClosureRegCheck(layout->Function); } - IR::Instr* instr = BuildProfiledCallIExtended(newOpcode, offset, layout->Return, layout->Function, layout->ArgCount, layout->profileId, layout->Options, layout->SpreadAuxOffset); + IR::Instr* instr = BuildProfiledCallIExtended(newOpcode, offset, layout->Return, layout->Function, layout->ArgCount, layout->profileId, layout->Options, layout->SpreadAuxOffset, layout->callFlags); Assert(instr->m_opcode == Js::OpCode::CallIExtendedFlags); if (instr->m_opcode == Js::OpCode::CallIExtendedFlags) { @@ -6052,7 +5996,6 @@ template void IRBuilder::BuildProfiledCallIExtendedWithICIndex(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOpWithICIndex(newOpcode) || Js::OpCodeUtil::IsProfiledCallOpWithICIndex(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>>(); @@ -6077,7 +6020,6 @@ template void IRBuilder::BuildProfiledCallIExtendedFlagsWithICIndex(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOpWithICIndex(newOpcode) || Js::OpCodeUtil::IsProfiledCallOpWithICIndex(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>>(); @@ -6104,7 +6046,6 @@ template void IRBuilder::BuildProfiledCallI(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOp(newOpcode) || Js::OpCodeUtil::IsProfiledCallOp(newOpcode) || Js::OpCodeUtil::IsProfiledReturnTypeCallOp(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); @@ -6123,7 +6064,6 @@ template void IRBuilder::BuildProfiledCallIFlags(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOp(newOpcode) || Js::OpCodeUtil::IsProfiledCallOp(newOpcode) || Js::OpCodeUtil::IsProfiledReturnTypeCallOp(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); @@ -6135,14 +6075,11 @@ IRBuilder::BuildProfiledCallIFlags(Js::OpCode newOpcode, uint32 offset) this->DoClosureRegCheck(layout->Function); } - IR::Instr* instr = BuildProfiledCallI(newOpcode, offset, layout->Return, layout->Function, layout->ArgCount, layout->profileId); + IR::Instr* instr = BuildProfiledCallI(newOpcode, offset, layout->Return, layout->Function, layout->ArgCount, layout->profileId, layout->callFlags); Assert(instr->m_opcode == Js::OpCode::CallIFlags); if (instr->m_opcode == Js::OpCode::CallIFlags) { - instr->m_opcode = Js::OpCode::CallIPut; - instr->m_opcode = - layout->callFlags == Js::CallFlags::CallFlags_NewTarget ? Js::OpCode::CallIPut : layout->callFlags == (Js::CallFlags::CallFlags_NewTarget | Js::CallFlags::CallFlags_New | Js::CallFlags::CallFlags_ExtraArg) ? Js::OpCode::CallINewTargetNew : layout->callFlags == Js::CallFlags::CallFlags_New ? Js::OpCode::CallINew : instr->m_opcode; @@ -6151,7 +6088,7 @@ IRBuilder::BuildProfiledCallIFlags(Js::OpCode newOpcode, uint32 offset) IR::Instr * IRBuilder::BuildProfiledCallI(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, - Js::ArgSlot argCount, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex) + Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallFlags flags, Js::InlineCacheIndex inlineCacheIndex) { Js::OpCode newOpcode; ValueType returnType; @@ -6216,7 +6153,7 @@ IRBuilder::BuildProfiledCallI(Js::OpCode opcode, uint32 offset, Js::RegSlot retu newOpcode = opcode; } } - IR::Instr * callInstr = BuildCallI_Helper(newOpcode, offset, returnValue, function, argCount, profileId, inlineCacheIndex); + IR::Instr * callInstr = BuildCallI_Helper(newOpcode, offset, returnValue, function, argCount, profileId, flags, inlineCacheIndex); callInstr->isCallInstrProtectedByNoProfileBailout = isProtectedByNoProfileBailout; if (callInstr->GetDst() && (callInstr->GetDst()->GetValueType().IsUninitialized() || callInstr->GetDst()->GetValueType() == ValueType::UninitializedObject)) @@ -6230,7 +6167,6 @@ template void IRBuilder::BuildProfiledCallIExtended(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOp(newOpcode) || Js::OpCodeUtil::IsProfiledCallOp(newOpcode) || Js::OpCodeUtil::IsProfiledReturnTypeCallOp(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); @@ -6248,20 +6184,19 @@ IRBuilder::BuildProfiledCallIExtended(Js::OpCode newOpcode, uint32 offset) IR::Instr * IRBuilder::BuildProfiledCallIExtended(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, - uint32 spreadAuxOffset) + uint32 spreadAuxOffset, Js::CallFlags flags) { if (options & Js::CallIExtended_SpreadArgs) { BuildLdSpreadIndices(offset, spreadAuxOffset); } - return BuildProfiledCallI(opcode, offset, returnValue, function, argCount, profileId); + return BuildProfiledCallI(opcode, offset, returnValue, function, argCount, profileId, flags); } template void IRBuilder::BuildProfiled2CallI(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOp(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>>(); @@ -6337,7 +6272,6 @@ template void IRBuilder::BuildProfiled2CallIExtended(Js::OpCode newOpcode, uint32 offset) { - this->m_func->m_isLeaf = false; Assert(OpCodeAttr::IsProfiledOp(newOpcode)); Assert(OpCodeAttr::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>>(); @@ -6364,7 +6298,7 @@ IRBuilder::BuildProfiled2CallIExtended(Js::OpCode opcode, uint32 offset, Js::Reg } IR::Instr * -IRBuilder::BuildCallI_Helper(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot Src1RegSlot, Js::ArgSlot ArgCount, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex) +IRBuilder::BuildCallI_Helper(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot Src1RegSlot, Js::ArgSlot ArgCount, Js::ProfileId profileId, Js::CallFlags flags, Js::InlineCacheIndex inlineCacheIndex) { IR::Instr * instr; IR::RegOpnd * dstOpnd; @@ -6447,13 +6381,13 @@ IRBuilder::BuildCallI_Helper(Js::OpCode newOpcode, uint32 offset, Js::RegSlot ds this->AddInstr(instr, offset); - this->BuildCallCommon(instr, symDst, ArgCount); + this->BuildCallCommon(instr, symDst, ArgCount, flags); return instr; } void -IRBuilder::BuildCallCommon(IR::Instr * instr, StackSym * symDst, Js::ArgSlot argCount) +IRBuilder::BuildCallCommon(IR::Instr * instr, StackSym * symDst, Js::ArgSlot argCount, Js::CallFlags flags) { Js::OpCode newOpcode = instr->m_opcode; @@ -6490,6 +6424,8 @@ IRBuilder::BuildCallCommon(IR::Instr * instr, StackSym * symDst, Js::ArgSlot arg m_argsOnStack++; } + argCount = Js::CallInfo::GetArgCountWithExtraArgs(flags, argCount); + if (argInstr) { prevInstr->SetSrc2(argInstr->GetDst()); diff --git a/deps/chakrashim/core/lib/Backend/IRBuilder.h b/deps/chakrashim/core/lib/Backend/IRBuilder.h index 72638d7a623..394427fff46 100644 --- a/deps/chakrashim/core/lib/Backend/IRBuilder.h +++ b/deps/chakrashim/core/lib/Backend/IRBuilder.h @@ -134,8 +134,7 @@ class IRBuilder void BuildReg1(Js::OpCode newOpcode, uint32 offset, Js::RegSlot R0); void BuildReg2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot R0, Js::RegSlot R1, uint32 nextOffset); - void BuildProfiledReg2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex = Js::Constants::NoInlineCacheIndex); - void BuildProfiledReg2WithICIndex(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex); + void BuildProfiledReg2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, Js::ProfileId profileId); void BuildReg3(Js::OpCode newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, Js::ProfileId profileId); void BuildReg3C(Js::OpCode newOpCode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, @@ -176,27 +175,27 @@ class IRBuilder Js::RegSlot regSlot, Js::ProfileId profileId); void BuildElementUnsigned1(Js::OpCode newOpcode, uint32 offset, Js::RegSlot baseRegSlot, uint32 index, Js::RegSlot regSlot); IR::Instr * BuildCallI_Helper(Js::OpCode newOpcode, uint32 offset, Js::RegSlot Return, Js::RegSlot Function, Js::ArgSlot ArgCount, - Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex = Js::Constants::NoInlineCacheIndex); + Js::ProfileId profileId, Js::CallFlags flags = Js::CallFlags_None, Js::InlineCacheIndex inlineCacheIndex = Js::Constants::NoInlineCacheIndex); IR::Instr * BuildProfiledCallI(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, - Js::ArgSlot argCount, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex = Js::Constants::NoInlineCacheIndex); + Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallFlags flags = Js::CallFlags_None, Js::InlineCacheIndex inlineCacheIndex = Js::Constants::NoInlineCacheIndex); IR::Instr * BuildProfiledCallIExtended(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, - Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); + Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, uint32 spreadAuxOffset, Js::CallFlags flags = Js::CallFlags_None); IR::Instr * BuildProfiledCallIWithICIndex(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, Js::ArgSlot argCount, Js::ProfileId profileId, Js::InlineCacheIndex inlineCacheIndex); void BuildProfiledCallIExtendedFlags(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, - Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); + Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); void BuildProfiledCallIExtendedWithICIndex(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, - Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); + Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); void BuildProfiledCallIExtendedFlagsWithICIndex(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, - Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); + Js::ArgSlot argCount, Js::ProfileId profileId, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); void BuildProfiled2CallI(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, Js::ArgSlot argCount, Js::ProfileId profileId, Js::ProfileId profileId2); void BuildProfiled2CallIExtended(Js::OpCode opcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, Js::ArgSlot argCount, Js::ProfileId profileId, Js::ProfileId profileId2, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); void BuildLdSpreadIndices(uint32 offset, uint32 spreadAuxOffset); IR::Instr * BuildCallIExtended(Js::OpCode newOpcode, uint32 offset, Js::RegSlot returnValue, Js::RegSlot function, - Js::ArgSlot argCount, Js::CallIExtendedOptions options, uint32 spreadAuxOffset); - void BuildCallCommon(IR::Instr *instr, StackSym *symDst, Js::ArgSlot argCount); + Js::ArgSlot argCount, Js::CallIExtendedOptions options, uint32 spreadAuxOffset, Js::CallFlags flags = Js::CallFlags_None); + void BuildCallCommon(IR::Instr *instr, StackSym *symDst, Js::ArgSlot argCount, Js::CallFlags flags = Js::CallFlags_None); void BuildRegexFromPattern(Js::RegSlot dstRegSlot, uint32 patternIndex, uint32 offset); void BuildClass(Js::OpCode newOpcode, uint32 offset, Js::RegSlot constructor, Js::RegSlot extends); void BuildBrReg1(Js::OpCode newOpcode, uint32 offset, uint targetOffset, Js::RegSlot srcRegSlot); diff --git a/deps/chakrashim/core/lib/Backend/IRBuilderAsmJs.cpp b/deps/chakrashim/core/lib/Backend/IRBuilderAsmJs.cpp index fe1973adef0..db3daf1ef3f 100644 --- a/deps/chakrashim/core/lib/Backend/IRBuilderAsmJs.cpp +++ b/deps/chakrashim/core/lib/Backend/IRBuilderAsmJs.cpp @@ -6,6 +6,7 @@ #include "Backend.h" #ifdef ASMJS_PLAT #include "ByteCode/OpCodeUtilAsmJs.h" +#include "../../WasmReader/WasmParseTree.h" void IRBuilderAsmJs::Build() @@ -16,9 +17,9 @@ IRBuilderAsmJs::Build() m_tempAlloc = &localAlloc; uint32 offset; - uint32 statementIndex = m_statementReader.GetStatementIndex(); + uint32 statementIndex = m_statementReader ? m_statementReader->GetStatementIndex() : Js::Constants::NoStatementIndex; - m_argStack = JitAnew(m_tempAlloc, SList, m_tempAlloc); + m_argStack = JitAnew(m_tempAlloc, SListCounted, m_tempAlloc); m_tempList = JitAnew(m_tempAlloc, SList, m_tempAlloc); m_argOffsetStack = JitAnew(m_tempAlloc, SList, m_tempAlloc); @@ -44,7 +45,7 @@ IRBuilderAsmJs::Build() m_firstsType[i] += m_firstsType[i - 1]; } - m_firstIRTemp = m_firstsType[m_firstsTypeCount - 1]; + m_func->firstIRTemp = m_firstsType[m_firstsTypeCount - 1]; m_simdOpcodesMap = JitAnewArrayZ(m_tempAlloc, Js::OpCode, Js::Simd128AsmJsOpcodeCount()); { @@ -64,7 +65,7 @@ IRBuilderAsmJs::Build() } // we will be using lower space for type specialized syms, so bump up where new temp syms can be created - m_func->m_symTable->IncreaseStartingID(m_firstIRTemp - m_func->m_symTable->GetMaxSymID()); + m_func->m_symTable->IncreaseStartingID(m_func->firstIRTemp); if (m_tempCount > 0) { @@ -81,12 +82,11 @@ IRBuilderAsmJs::Build() m_func->m_exitInstr = IR::ExitInstr::New(Js::OpCode::FunctionExit, m_func); m_func->m_tailInstr = m_func->m_exitInstr; m_func->m_headInstr->InsertAfter(m_func->m_tailInstr); - m_func->m_isLeaf = true; // until proven otherwise m_functionStartOffset = m_jnReader.GetCurrentOffset(); m_lastInstr = m_func->m_headInstr; - AssertMsg(sizeof(SymID) >= sizeof(Js::RegSlot), "sizeof(SymID) != sizeof(Js::RegSlot)!!"); + CompileAssert(sizeof(SymID) == sizeof(Js::RegSlot)); offset = m_functionStartOffset; @@ -97,17 +97,15 @@ IRBuilderAsmJs::Build() uint32 offsetToInstructionCount = lastOffset; if (this->IsLoopBody()) { - // LdSlot needs to cover all the register, including the temps, because we might treat - // those as if they are local for the value of the with statement - this->m_ldSlots = BVFixed::New(GetLastTmp(WAsmJs::LastType), m_tempAlloc); - this->m_stSlots = BVFixed::New(GetFirstTmp(WAsmJs::FirstType), m_tempAlloc); - this->m_loopBodyRetIPSym = StackSym::New(TyInt32, this->m_func); + // LdSlot & StSlot needs to cover all the register, including the temps, because we might treat + // those as if they are local for yielding + m_jitLoopBodyData = JitAnew(m_tempAlloc, JitLoopBodyData, + BVFixed::New(GetLastTmp(WAsmJs::LastType), m_tempAlloc), + BVFixed::New(GetLastTmp(WAsmJs::LastType), m_tempAlloc), + StackSym::New(TyInt32, this->m_func) + ); #if DBG - uint32 tmpCount = GetLastTmp(WAsmJs::LastType) - GetFirstTmp(WAsmJs::FirstType); - if (tmpCount != 0) - { - this->m_usedAsTemp = BVFixed::New(tmpCount, m_tempAlloc); - } + GetJitLoopBodyData().m_usedAsTemp = BVFixed::New(GetLastTmp(WAsmJs::LastType), m_tempAlloc); #endif lastOffset = m_func->GetWorkItem()->GetLoopHeader()->endOffset; // Ret is created at lastOffset + 1, so we need lastOffset + 2 entries @@ -127,7 +125,7 @@ IRBuilderAsmJs::Build() BuildImplicitArgIns(); } - if (m_statementReader.AtStatementBoundary(&m_jnReader)) + if (m_statementReader && m_statementReader->AtStatementBoundary(&m_jnReader)) { statementIndex = AddStatementBoundary(statementIndex, offset); } @@ -167,14 +165,14 @@ IRBuilderAsmJs::Build() } offset = m_jnReader.GetCurrentOffset(); - if (m_statementReader.AtStatementBoundary(&m_jnReader)) + if (m_statementReader && m_statementReader->AtStatementBoundary(&m_jnReader)) { statementIndex = AddStatementBoundary(statementIndex, offset); } } - if (Js::Constants::NoStatementIndex != statementIndex) + if (m_statementReader && Js::Constants::NoStatementIndex != statementIndex) { statementIndex = AddStatementBoundary(statementIndex, Js::Constants::NoByteCodeOffset); } @@ -207,8 +205,7 @@ IRBuilderAsmJs::Build() void IRBuilderAsmJs::LoadNativeCodeData() { - Assert(m_func->IsTopFunc()); - if (m_func->IsOOPJIT()) + if (m_func->IsOOPJIT() && m_func->IsTopFunc()) { IR::RegOpnd * nativeDataOpnd = IR::RegOpnd::New(TyVar, m_func); IR::Instr * instr = IR::Instr::New(Js::OpCode::LdNativeCodeData, nativeDataOpnd, m_func); @@ -260,8 +257,13 @@ IRBuilderAsmJs::AddInstr(IR::Instr * instr, uint32 offset) IR::RegOpnd * IRBuilderAsmJs::BuildDstOpnd(Js::RegSlot dstRegSlot, IRType type) { - SymID symID; - if (RegIsTemp(dstRegSlot)) + SymID symID = static_cast(dstRegSlot); + if (IsLoopBody() && (RegIsVar(dstRegSlot) || RegIsJitLoopYield(dstRegSlot))) + { + // Use default symID for yield and var registers + EnsureLoopBodyAsmJsStoreSlot(dstRegSlot, type); + } + else if (RegIsTemp(dstRegSlot)) { #if DBG if (this->IsLoopBody()) @@ -270,8 +272,8 @@ IRBuilderAsmJs::BuildDstOpnd(Js::RegSlot dstRegSlot, IRType type) // That means that we have detected that the slot is live coming in to the loop. // This would only happen for the value of a "with" statement, so there shouldn't // be any def for those - Assert(!this->m_ldSlots->Test(dstRegSlot)); - this->m_usedAsTemp->Set(dstRegSlot - GetFirstTmp(WAsmJs::FirstType)); + Assert(!GetJitLoopBodyData().GetLdSlots()->Test(dstRegSlot)); + GetJitLoopBodyData().m_usedAsTemp->Set(dstRegSlot); } #endif // This is a def of a temp. Create a new sym ID for it if it's been used since its last def. @@ -305,26 +307,15 @@ IRBuilderAsmJs::BuildDstOpnd(Js::RegSlot dstRegSlot, IRType type) } } } + else if (RegIsConstant(dstRegSlot)) + { + // Don't need to track constant registers for bailout. Don't set the byte code register for constant. + dstRegSlot = Js::Constants::NoRegister; + } else { - symID = static_cast(dstRegSlot); - if (RegIsConstant(dstRegSlot)) - { - // Don't need to track constant registers for bailout. Don't set the byte code register for constant. - dstRegSlot = Js::Constants::NoRegister; - } - else if (IsLoopBody() && RegIsVar(dstRegSlot)) - { - // Loop body and not constants - this->m_stSlots->Set(symID); - // We need to make sure that the symbols is loaded as well - // so that the sym will be defined on all path. - this->EnsureLoopBodyAsmJsLoadSlot(symID, type); - } - else - { - Assert(!IsLoopBody() || dstRegSlot == 0); // if loop body then one of the above two conditions should hold true - } + // if loop body then one of the above conditions should hold true + Assert(!IsLoopBody() || dstRegSlot == 0); } //Simd return values of different IR types share the same reg slot. @@ -361,7 +352,7 @@ IRBuilderAsmJs::BuildIntConstOpnd(Js::RegSlot regSlot) Assert(info.constSrcByteOffset != Js::Constants::InvalidOffset); AssertOrFailFast(info.constSrcByteOffset < UInt32Math::Mul(m_func->GetJITFunctionBody()->GetConstCount())); int* intConstTable = reinterpret_cast(((byte*)constTable) + info.constSrcByteOffset); - Js::RegSlot srcReg = GetTypedRegFromRegSlot(regSlot, WAsmJs::INT32); + uint32 srcReg = GetTypedRegFromRegSlot(regSlot, WAsmJs::INT32); AssertOrFailFast(srcReg >= Js::FunctionBody::FirstRegSlot && srcReg < info.constCount); const int32 value = intConstTable[srcReg]; IR::IntConstOpnd *opnd = IR::IntConstOpnd::New(value, TyInt32, m_func); @@ -372,9 +363,13 @@ IRBuilderAsmJs::BuildIntConstOpnd(Js::RegSlot regSlot) SymID IRBuilderAsmJs::BuildSrcStackSymID(Js::RegSlot regSlot, IRType type /*= IRType::TyVar*/) { - SymID symID; + SymID symID = static_cast(regSlot); - if (this->RegIsTemp(regSlot)) + if (IsLoopBody() && (RegIsVar(regSlot) || RegIsJitLoopYield(regSlot))) + { + this->EnsureLoopBodyAsmJsLoadSlot(regSlot, type); + } + else if (this->RegIsTemp(regSlot)) { // This is a use of a temp. Map the reg slot to its sym ID. // !!!NOTE: always process an instruction's temp uses before its temp defs!!! @@ -384,26 +379,17 @@ IRBuilderAsmJs::BuildSrcStackSymID(Js::RegSlot regSlot, IRType type /*= IRType:: // We might have temps that are live through the loop body via "with" statement // We need to treat those as if they are locals and don't remap them Assert(this->IsLoopBody()); - Assert(!this->m_usedAsTemp->Test(regSlot - GetFirstTmp(WAsmJs::FirstType))); + Assert(!GetJitLoopBodyData().m_usedAsTemp->Test(regSlot)); symID = static_cast(regSlot); this->SetMappedTemp(regSlot, symID); - this->EnsureLoopBodyAsmJsLoadSlot(symID, type); + this->EnsureLoopBodyAsmJsLoadSlot(regSlot, type); } this->SetTempUsed(regSlot, TRUE); } else { - symID = static_cast(regSlot); - if (IsLoopBody() && RegIsVar(regSlot)) - { - this->EnsureLoopBodyAsmJsLoadSlot(symID, type); - - } - else - { - Assert(!IsLoopBody() || this->RegIsConstant(regSlot) || regSlot == 0); - } + Assert(!IsLoopBody() || this->RegIsConstant(regSlot) || regSlot == 0); } return symID; @@ -437,17 +423,14 @@ IRBuilderAsmJs::BuildFieldSym(Js::RegSlot reg, Js::PropertyId propertyId, Proper uint IRBuilderAsmJs::AddStatementBoundary(uint statementIndex, uint offset) { - if (m_func->GetJITFunctionBody()->IsWasmFunction()) - { - return 0; - } + AssertOrFailFast(m_statementReader); IR::PragmaInstr* pragmaInstr = IR::PragmaInstr::New(Js::OpCode::StatementBoundary, statementIndex, m_func); this->AddInstr(pragmaInstr, offset); - return m_statementReader.MoveNextStatementBoundary(); + return m_statementReader->MoveNextStatementBoundary(); } -Js::RegSlot IRBuilderAsmJs::GetTypedRegFromRegSlot(Js::RegSlot reg, WAsmJs::Types type) +uint32 IRBuilderAsmJs::GetTypedRegFromRegSlot(Js::RegSlot reg, WAsmJs::Types type) { const auto typedInfo = m_asmFuncInfo->GetTypedSlotInfo(type); Js::RegSlot srcReg = reg; @@ -553,7 +536,7 @@ IRBuilderAsmJs::SetMappedTemp(Js::RegSlot reg, SymID tempId) m_tempMap[tempIndex] = tempId; } -BOOL +bool IRBuilderAsmJs::GetTempUsed(Js::RegSlot reg) { AssertMsg(RegIsTemp(reg), "Processing non-temp reg as a temp?"); @@ -561,11 +544,11 @@ IRBuilderAsmJs::GetTempUsed(Js::RegSlot reg) Js::RegSlot tempIndex = reg - GetFirstTmp(WAsmJs::FirstType); AssertOrFailFast(tempIndex < m_tempCount); - return m_fbvTempUsed->Test(tempIndex); + return !!m_fbvTempUsed->Test(tempIndex); } void -IRBuilderAsmJs::SetTempUsed(Js::RegSlot reg, BOOL used) +IRBuilderAsmJs::SetTempUsed(Js::RegSlot reg, bool used) { AssertMsg(RegIsTemp(reg), "Processing non-temp reg as a temp?"); AssertMsg(m_fbvTempUsed, "Processing non-temp reg without a used BV?"); @@ -582,13 +565,13 @@ IRBuilderAsmJs::SetTempUsed(Js::RegSlot reg, BOOL used) } } -BOOL +bool IRBuilderAsmJs::RegIsTemp(Js::RegSlot reg) { return reg >= GetFirstTmp(WAsmJs::FirstType); } -BOOL +bool IRBuilderAsmJs::RegIsVar(Js::RegSlot reg) { for (int i = 0; i < WAsmJs::LIMIT; ++i) @@ -601,19 +584,84 @@ IRBuilderAsmJs::RegIsVar(Js::RegSlot reg) return false; } -BOOL +bool IRBuilderAsmJs::RegIsTypedVar(Js::RegSlot reg, WAsmJs::Types type) { return reg >= GetFirstVar(type) && reg < GetLastVar(type); } +bool +IRBuilderAsmJs::RegIsTypedConst(Js::RegSlot reg, WAsmJs::Types type) +{ + return reg >= GetFirstConst(type) && reg < GetLastConst(type); +} + +bool +IRBuilderAsmJs::RegIsTypedTmp(Js::RegSlot reg, WAsmJs::Types type) +{ + return reg >= GetFirstTmp(type) && reg < GetLastTmp(type); +} + +bool +IRBuilderAsmJs::RegIs(Js::RegSlot reg, WAsmJs::Types type) +{ + return ( + RegIsTypedVar(reg, type) || + RegIsTypedConst(reg, type) || + RegIsTypedTmp(reg, type) + ); +} + +bool +IRBuilderAsmJs::RegIsJitLoopYield(Js::RegSlot reg) +{ + return IsLoopBody() && GetJitLoopBodyData().IsYieldReg(reg); +} + +void +IRBuilderAsmJs::CheckJitLoopReturn(Js::RegSlot reg, IRType type) +{ + if (IsLoopBody()) + { +#ifdef ENABLE_WASM + if (GetJitLoopBodyData().IsLoopCurRegsInitialized()) + { + Assert(m_func->GetJITFunctionBody()->IsWasmFunction()); + // In Wasm we use the Return opcode for Yields + // Check if that yield is outside of the loop (this also covers return) + if (!RegIsJitLoopYield(reg)) + { + WAsmJs::Types wasmType = WAsmJs::FromIRType(type); + Assert(wasmType < WAsmJs::LIMIT); + uint32 typedReg = GetTypedRegFromRegSlot(reg, wasmType); + if (GetJitLoopBodyData().IsRegOutsideOfLoop(typedReg, wasmType)) + { + // The reg should be either a constant (return register) + // Or a temp, in which case, make sure we haven't mapped that temp to something else + Assert(RegIsConstant(reg) || (RegIsTemp(reg) && (GetMappedTemp(reg) == (SymID)reg || GetMappedTemp(reg) == 0))); + GetJitLoopBodyData().SetRegIsYield(reg); + EnsureLoopBodyAsmJsStoreSlot(reg, type); + } + } + } + else +#endif + { + // In Asm.js there is no Yields outside of the loop, if we're here + // It means we are returning a value from the loop + Assert(RegIsConstant(reg)); + EnsureLoopBodyAsmJsStoreSlot(reg, type); + } + } +} + bool IRBuilderAsmJs::RegIsSimd128ReturnVar(Js::RegSlot reg) { return (reg == GetFirstConst(WAsmJs::SIMD) && Js::AsmJsRetType(m_asmFuncInfo->GetRetType()).toVarType().isSIMD()); } -BOOL +bool IRBuilderAsmJs::RegIsConstant(Js::RegSlot reg) { return (reg > 0 && reg < GetLastConst(WAsmJs::LastType)); @@ -732,12 +780,10 @@ void IRBuilderAsmJs::BuildConstantLoads() { Js::Var * constTable = (Js::Var *)m_func->GetJITFunctionBody()->GetConstTable(); - // Load FrameDisplay IR::RegOpnd * asmJsEnvDstOpnd = BuildDstOpnd(AsmJsRegSlots::ModuleMemReg, TyVar); IR::Instr * ldAsmJsEnvInstr = IR::Instr::New(Js::OpCode::LdAsmJsEnv, asmJsEnvDstOpnd, m_func); AddInstr(ldAsmJsEnvInstr, Js::Constants::NoByteCodeOffset); - // Load heap buffer if (m_asmFuncInfo->UsesHeapBuffer()) { @@ -781,6 +827,20 @@ IRBuilderAsmJs::BuildConstantLoads() } ); break; +#if TARGET_64 + case WAsmJs::INT64: + CreateLoadConstInstrForType( + table, + regAllocated, + info.constCount, + info.constSrcByteOffset, + TyInt64, + ValueType::GetInt(false), + Js::OpCode::Ld_I4, + [&](IR::Instr* instr, int64 val) {} + ); + break; +#endif case WAsmJs::FLOAT32: CreateLoadConstInstrForType( table, @@ -1067,8 +1127,6 @@ IRBuilderAsmJs::BuildEmpty(Js::OpCodeAsmJs newOpcode, uint32 offset) break; case Js::AsmJsRetType::Which::Void: - retSlot = GetRegSlotFromVarReg(0); - regOpnd = BuildDstOpnd(retSlot, TyVar); break; default: @@ -1082,7 +1140,10 @@ IRBuilderAsmJs::BuildEmpty(Js::OpCodeAsmJs newOpcode, uint32 offset) } } - instr->SetSrc1(regOpnd); + if (regOpnd) + { + instr->SetSrc1(regOpnd); + } AddInstr(instr, offset); break; @@ -1107,11 +1168,26 @@ IRBuilderAsmJs::BuildElementSlot(Js::OpCodeAsmJs newOpcode, uint32 offset) template void -IRBuilderAsmJs::BuildAsmUnsigned1(Js::OpCodeAsmJs newOpcode, uint value) +IRBuilderAsmJs::BuildAsmUnsigned1(Js::OpCodeAsmJs newOpcode, uint offset) { + Assert(!m_func->GetJITFunctionBody()->IsWasmFunction()); // we do not support counter in loop body ,just read the layout here m_jnReader.GetLayout>(); } + +template +void +IRBuilderAsmJs::BuildWasmLoopStart(Js::OpCodeAsmJs newOpcode, uint offset) +{ + Assert(m_func->GetJITFunctionBody()->IsWasmFunction()); + auto loopStart = m_jnReader.GetLayout>(); + if (IsLoopBody() && !this->GetJitLoopBodyData().IsLoopCurRegsInitialized()) + { + // There can be nested loop, only initialize with the first loop found + this->GetJitLoopBodyData().InitLoopCurRegs(loopStart->curRegs, BVFixed::New(GetLastTmp(WAsmJs::LastType), m_tempAlloc)); + } +} + void IRBuilderAsmJs::BuildElementSlot(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 slotIndex, Js::RegSlot value, Js::RegSlot instance) { @@ -1132,40 +1208,40 @@ IRBuilderAsmJs::BuildElementSlot(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 switch (newOpcode) { case Js::OpCodeAsmJs::LdSlot: - valueRegSlot = GetRegSlotFromVarReg(value); + valueRegSlot = GetRegSlotFromPtrReg(value); slotOpnd = BuildFieldOpnd(AsmJsRegSlots::ModuleMemReg, slotIndex, PropertyKindSlotArray, TyVar); - regOpnd = BuildDstOpnd(valueRegSlot, TyVar); + regOpnd = BuildDstOpnd(valueRegSlot, TyMachReg); instr = IR::Instr::New(Js::OpCode::LdSlot, regOpnd, slotOpnd, m_func); break; case Js::OpCodeAsmJs::LdSlotArr: - valueRegSlot = GetRegSlotFromVarReg(value); + valueRegSlot = GetRegSlotFromPtrReg(value); slotOpnd = BuildFieldOpnd(AsmJsRegSlots::ModuleMemReg, slotIndex, PropertyKindSlots, TyVar); - regOpnd = BuildDstOpnd(valueRegSlot, TyVar); + regOpnd = BuildDstOpnd(valueRegSlot, TyMachReg); instr = IR::Instr::New(Js::OpCode::LdSlot, regOpnd, slotOpnd, m_func); break; case Js::OpCodeAsmJs::LdArr_Func: { - IR::RegOpnd * baseOpnd = BuildSrcOpnd(GetRegSlotFromVarReg(instance), TyVar); + IR::RegOpnd * baseOpnd = BuildSrcOpnd(GetRegSlotFromPtrReg(instance), TyMachReg); IR::RegOpnd * indexOpnd = BuildSrcOpnd(GetRegSlotFromIntReg(slotIndex), TyUint32); - IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(baseOpnd, indexOpnd, TyVar, m_func); + IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(baseOpnd, indexOpnd, TyMachReg, m_func); - regOpnd = BuildDstOpnd(GetRegSlotFromVarReg(value), TyVar); + regOpnd = BuildDstOpnd(GetRegSlotFromPtrReg(value), TyMachReg); instr = IR::Instr::New(Js::OpCode::LdAsmJsFunc, regOpnd, indirOpnd, m_func); break; } case Js::OpCodeAsmJs::LdArr_WasmFunc: { - IR::RegOpnd * baseOpnd = BuildSrcOpnd(GetRegSlotFromVarReg(instance), TyVar); + IR::RegOpnd * baseOpnd = BuildSrcOpnd(GetRegSlotFromPtrReg(instance), TyMachReg); IR::RegOpnd * indexOpnd = BuildSrcOpnd(GetRegSlotFromIntReg(slotIndex), TyUint32); - regOpnd = BuildDstOpnd(GetRegSlotFromVarReg(value), TyVar); + regOpnd = BuildDstOpnd(GetRegSlotFromPtrReg(value), TyMachReg); instr = IR::Instr::New(Js::OpCode::LdWasmFunc, regOpnd, baseOpnd, indexOpnd, m_func); break; } @@ -1292,17 +1368,20 @@ IRBuilderAsmJs::BuildStartCall(Js::OpCodeAsmJs newOpcode, uint32 offset) Assert(!OpCodeAttrAsmJs::HasMultiSizeLayout(newOpcode)); const unaligned Js::OpLayoutStartCall * layout = m_jnReader.StartCall(); - IR::RegOpnd * dstOpnd = IR::RegOpnd::New(TyVar, m_func); - IR::IntConstOpnd * srcOpnd = IR::IntConstOpnd::New(layout->ArgCount, TyInt32, m_func); + IR::RegOpnd * dstOpnd = IR::RegOpnd::New(TyMachReg, m_func); IR::Instr * instr = nullptr; StackSym * symDst = nullptr; IR::SymOpnd * argDst = nullptr; IR::AddrOpnd * addrOpnd = nullptr; + IR::IntConstOpnd * srcOpnd = nullptr; switch (newOpcode) { case Js::OpCodeAsmJs::I_StartCall: - instr = IR::Instr::New(Js::OpCode::StartCall, dstOpnd, srcOpnd, m_func); + srcOpnd = IR::IntConstOpnd::New(layout->ArgCount - MachPtr, TyUint16, m_func); + instr = IR::Instr::New(Js::OpCode::StartCall, dstOpnd, m_func); + // this is the arg size, we will set src1 to be the actual arg count + instr->SetSrc2(srcOpnd); AddInstr(instr, offset); @@ -1312,8 +1391,10 @@ IRBuilderAsmJs::BuildStartCall(Js::OpCodeAsmJs newOpcode, uint32 offset) break; case Js::OpCodeAsmJs::StartCall: - instr = IR::Instr::New(Js::OpCode::StartCall, dstOpnd, srcOpnd, m_func); - + srcOpnd = IR::IntConstOpnd::New(layout->ArgCount, TyUint16, m_func); + instr = IR::Instr::New(Js::OpCode::StartCall, dstOpnd, m_func); + // we will set src1 to be the actual arg count + instr->SetSrc2(srcOpnd); AddInstr(instr, offset); m_argStack->Push(instr); @@ -1324,7 +1405,7 @@ IRBuilderAsmJs::BuildStartCall(Js::OpCodeAsmJs newOpcode, uint32 offset) symDst = m_func->m_symTable->GetArgSlotSym(1); - argDst = IR::SymOpnd::New(symDst, TyVar, m_func); + argDst = IR::SymOpnd::New(symDst, TyMachReg, m_func); instr = IR::Instr::New(Js::OpCode::ArgOut_A, argDst, addrOpnd, m_func); @@ -1582,21 +1663,28 @@ IRBuilderAsmJs::BuildAsmTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, uint3 AddInstr(instr, offset); } +template +void +IRBuilderAsmJs::BuildProfiledAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset) +{ + Assert(OpCodeAttrAsmJs::HasMultiSizeLayout(newOpcode)); + auto layout = m_jnReader.GetLayout>>(); + BuildAsmCall(newOpcode, offset, layout->ArgCount, layout->Return, layout->Function, layout->ReturnType, layout->profileId); +} + template void IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset) { Assert(OpCodeAttrAsmJs::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>(); - BuildAsmCall(newOpcode, offset, layout->ArgCount, layout->Return, layout->Function, layout->ReturnType); + BuildAsmCall(newOpcode, offset, layout->ArgCount, layout->Return, layout->Function, layout->ReturnType, Js::Constants::NoProfileId); } void -IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSlot argCount, Js::RegSlot ret, Js::RegSlot function, int8 returnType) +IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSlot argCount, Js::RegSlot ret, Js::RegSlot function, int8 returnType, Js::ProfileId profileId) { -#if DBG - int count = 0; -#endif + Js::ArgSlot count = 0; IR::Instr * instr = nullptr; IR::RegOpnd * dstOpnd = nullptr; @@ -1607,8 +1695,9 @@ IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSl switch (newOpcode) { case Js::OpCodeAsmJs::I_Call: - srcRegSlot = GetRegSlotFromVarReg(function); - srcOpnd = BuildSrcOpnd(srcRegSlot, TyVar); + case Js::OpCodeAsmJs::ProfiledI_Call: + srcRegSlot = GetRegSlotFromPtrReg(function); + srcOpnd = BuildSrcOpnd(srcRegSlot, TyMachReg); switch ((Js::AsmJsRetType::Which)returnType) { @@ -1683,15 +1772,22 @@ IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSl dstRegSlot = GetRegSlotFromSimd128Reg(ret); dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128U16); break; - default: + default: Assume(UNREACHED); } - instr = IR::Instr::New(Js::OpCode::AsmJsCallI, m_func); - instr->SetSrc1(srcOpnd); - if (dstOpnd) { - instr->SetDst(dstOpnd); + if (profileId == Js::Constants::NoProfileId) + { + instr = IR::Instr::New(Js::OpCode::AsmJsCallI, dstOpnd, srcOpnd, m_func); + } + else + { + Assert(newOpcode == Js::OpCodeAsmJs::ProfiledI_Call); + instr = IR::ProfiledInstr::New(Js::OpCode::AsmJsCallI, dstOpnd, srcOpnd, m_func); + AssertOrFailFast(profileId < m_func->GetJITFunctionBody()->GetProfiledCallSiteCount()); + instr->AsProfiledInstr()->u.profileId = profileId; + } } argOffset = m_argOffsetStack->Pop(); @@ -1699,11 +1795,11 @@ IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSl break; case Js::OpCodeAsmJs::Call: - srcRegSlot = GetRegSlotFromVarReg(function); - srcOpnd = BuildSrcOpnd(srcRegSlot, TyVar); + srcRegSlot = GetRegSlotFromPtrReg(function); + srcOpnd = BuildSrcOpnd(srcRegSlot, TyMachReg); - dstRegSlot = GetRegSlotFromVarReg(ret); - dstOpnd = BuildDstOpnd(dstRegSlot, TyVar); + dstRegSlot = GetRegSlotFromPtrReg(ret); + dstOpnd = BuildDstOpnd(dstRegSlot, TyMachReg); instr = IR::Instr::New(Js::OpCode::AsmJsCallE, dstOpnd, srcOpnd, m_func); break; @@ -1715,9 +1811,9 @@ IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSl IR::Instr * argInstr = nullptr; IR::Instr * prevInstr = instr; - for (argInstr = m_argStack->Pop(); argInstr && argInstr->m_opcode != Js::OpCode::StartCall; argInstr = m_argStack->Pop()) + for (argInstr = m_argStack->Pop(); argInstr->m_opcode != Js::OpCode::StartCall; argInstr = m_argStack->Pop()) { - if (newOpcode == Js::OpCodeAsmJs::I_Call) + if (newOpcode == Js::OpCodeAsmJs::I_Call || newOpcode == Js::OpCodeAsmJs::ProfiledI_Call) { #if _M_IX86 argOffset -= argInstr->GetDst()->GetSize(); @@ -1742,12 +1838,13 @@ IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSl #endif #endif -#if DBG count++; -#endif } + + Assert(argInstr->m_opcode == Js::OpCode::StartCall); + argInstr->SetSrc1(IR::IntConstOpnd::New(count, TyUint16, m_func)); + Assert(argOffset == 0); - AnalysisAssert(argInstr); prevInstr->SetSrc2(argInstr->GetDst()); #ifdef ENABLE_SIMDJS @@ -1761,7 +1858,7 @@ IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSl IR::Instr * instrArg = m_tempList->Pop(); // record argument position and make room for implicit args instrArg->GetDst()->GetStackSym()->m_argPosition = i; - if (newOpcode == Js::OpCodeAsmJs::I_Call) + if (newOpcode == Js::OpCodeAsmJs::I_Call || newOpcode == Js::OpCodeAsmJs::ProfiledI_Call) { // implicit func obj arg instrArg->GetDst()->GetStackSym()->m_argPosition += 1; @@ -1783,9 +1880,9 @@ IRBuilderAsmJs::BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSl #ifdef ENABLE_WASM // heap buffer can change for wasm if (m_asmFuncInfo->UsesHeapBuffer() && m_func->GetJITFunctionBody()->IsWasmFunction()) - { - BuildHeapBufferReload(offset); - } + { + BuildHeapBufferReload(offset); + } #endif } @@ -1819,39 +1916,17 @@ IRBuilderAsmJs::BuildAsmReg1(Js::OpCodeAsmJs newOpcode, uint32 offset) void IRBuilderAsmJs::BuildAsmReg1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstReg) { + Assert(newOpcode == Js::OpCodeAsmJs::CurrentMemory_Int); + Js::RegSlot dstRegSlot = GetRegSlotFromIntReg(dstReg); + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TyInt32); + IR::IntConstOpnd* constZero = IR::IntConstOpnd::New(0, TyInt32, m_func); + IR::IntConstOpnd* constSixteen = IR::IntConstOpnd::New(16, TyUint8, m_func); - if (newOpcode == Js::OpCodeAsmJs::LdUndef) - { - - Js::RegSlot dstRegSlot = GetRegSlotFromVarReg(dstReg); - IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TyVar); - - if (dstOpnd->m_sym->m_isSingleDef) - { - dstOpnd->m_sym->m_isConst = true; - dstOpnd->m_sym->m_isNotInt = true; - } - - IR::AddrOpnd * addrOpnd = IR::AddrOpnd::New(m_func->GetScriptContextInfo()->GetUndefinedAddr(), IR::AddrOpndKindDynamicVar, m_func, true); - addrOpnd->SetValueType(ValueType::Undefined); - - IR::Instr * instr = IR::Instr::New(Js::OpCode::Ld_A, dstOpnd, addrOpnd, m_func); - AddInstr(instr, offset); - } - else - { - Assert(newOpcode == Js::OpCodeAsmJs::CurrentMemory_Int); - Js::RegSlot dstRegSlot = GetRegSlotFromIntReg(dstReg); - IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TyInt32); - IR::IntConstOpnd* constZero = IR::IntConstOpnd::New(0, TyInt32, m_func); - IR::IntConstOpnd* constSixteen = IR::IntConstOpnd::New(16, TyUint8, m_func); - - IR::Instr * instr = m_asmFuncInfo->UsesHeapBuffer() ? - IR::Instr::New(Js::OpCode::ShrU_I4, dstOpnd, BuildSrcOpnd(AsmJsRegSlots::LengthReg, TyUint32), constSixteen, m_func) : - IR::Instr::New(Js::OpCode::Ld_I4, dstOpnd, constZero, m_func); + IR::Instr * instr = m_asmFuncInfo->UsesHeapBuffer() ? + IR::Instr::New(Js::OpCode::ShrU_I4, dstOpnd, BuildSrcOpnd(AsmJsRegSlots::LengthReg, TyUint32), constSixteen, m_func) : + IR::Instr::New(Js::OpCode::Ld_I4, dstOpnd, constZero, m_func); - AddInstr(instr, offset); - } + AddInstr(instr, offset); } @@ -1868,6 +1943,7 @@ IRBuilderAsmJs::BuildAsmReg1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSl #define LongProc(v) GetRegSlotFromInt64Reg(v) #define FloatProc(v) GetRegSlotFromFloatReg(v) #define DoubleProc(v) GetRegSlotFromDoubleReg(v) +#define PtrProc(v) GetRegSlotFromPtrReg(v) #define IntConstProc(v) v #define LongConstProc(v) v #define FloatConstProc(v) v @@ -1876,6 +1952,7 @@ IRBuilderAsmJs::BuildAsmReg1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSl #define Bool32x4Proc(v) GetRegSlotFromSimd128Reg(v) #define Int32x4Proc(v) GetRegSlotFromSimd128Reg(v) #define Float64x2Proc(v) GetRegSlotFromSimd128Reg(v) +#define Int64x2Proc(v) GetRegSlotFromSimd128Reg(v) #define Int16x8Proc(v) GetRegSlotFromSimd128Reg(v) #define Bool16x8Proc(v) GetRegSlotFromSimd128Reg(v) #define Int8x16Proc(v) GetRegSlotFromSimd128Reg(v) @@ -1905,6 +1982,7 @@ IRBuilderAsmJs::BuildAsmReg1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSl #undef _PREFIX_HELPER #undef _M #undef RegProc +#undef PtrProc #undef IntProc #undef LongProc #undef FloatProc @@ -1945,7 +2023,12 @@ void IRBuilderAsmJs::BuildArgOut(IR::Opnd* srcOpnd, uint32 dstRegSlot, uint32 of } else { - symDst = StackSym::NewArgSlotSym(dstArgSlot, m_func, type); + // Some arg types may use multiple slots, so can't rely on count from bytecode + Assert(dstArgSlot >= m_argStack->Count()); + uint slotIndex = m_argStack->Count(); + AssertOrFailFast(slotIndex < UINT16_MAX); + + symDst = StackSym::NewArgSlotSym((Js::ArgSlot)slotIndex, m_func, type); symDst->m_allocated = true; } @@ -1963,7 +2046,7 @@ void IRBuilderAsmJs::BuildArgOut(IR::Opnd* srcOpnd, uint32 dstRegSlot, uint32 of void IRBuilderAsmJs::BuildFromVar(uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, IRType irType, ValueType valueType) { - IR::RegOpnd * srcOpnd = BuildSrcOpnd(GetRegSlotFromVarReg(srcRegSlot), TyVar); + IR::RegOpnd * srcOpnd = BuildSrcOpnd(GetRegSlotFromPtrReg(srcRegSlot), TyVar); IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, irType); dstOpnd->SetValueType(valueType); @@ -2166,6 +2249,17 @@ IRBuilderAsmJs::BuildReg1Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegS } } +void +IRBuilderAsmJs::BuildFloat32x4_IntConst4(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, int C1, int C2, int C3, int C4) +{ + Assert(newOpcode == Js::OpCodeAsmJs::Simd128_LdC); + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128F4); + dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); + SIMDValue simdConst{ C1, C2, C3, C4 }; + IR::Instr * instr = IR::Instr::New(Js::OpCode::Simd128_LdC, dstOpnd, IR::Simd128ConstOpnd::New(simdConst, TySimd128F4, m_func), m_func); + AddInstr(instr, offset); +} + void IRBuilderAsmJs::BuildInt1Const1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, int constInt) { @@ -2189,7 +2283,7 @@ IRBuilderAsmJs::BuildReg1IntConst1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js: { Assert(newOpcode == Js::OpCodeAsmJs::CheckSignature); - IR::RegOpnd * funcReg = BuildSrcOpnd(reg1, TyMachPtr); + IR::RegOpnd * funcReg = BuildSrcOpnd(GetRegSlotFromPtrReg(reg1), TyMachReg); IR::IntConstOpnd * sigIndex = IR::IntConstOpnd::New(constInt, TyInt32, m_func); @@ -2364,22 +2458,13 @@ IRBuilderAsmJs::BuildInt2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot instr = IR::Instr::New(Js::OpCode::Ctz, dstOpnd, srcOpnd, m_func); break; - case Js::OpCodeAsmJs::I_Conv_VTI: - instr = IR::Instr::New(Js::OpCode::Ld_I4, dstOpnd, srcOpnd, m_func); - break; - case Js::OpCodeAsmJs::PopCnt_Int: instr = IR::Instr::New(Js::OpCode::PopCnt, dstOpnd, srcOpnd, m_func); break; case Js::OpCodeAsmJs::Return_Int: instr = IR::Instr::New(Js::OpCode::Ld_I4, dstOpnd, srcOpnd, m_func); - if (m_func->IsLoopBody()) - { - IR::Instr* slotInstr = GenerateStSlotForReturn(srcOpnd, IRType::TyInt32); - AddInstr(slotInstr, offset); - } - + CheckJitLoopReturn(dstRegSlot, TyInt32); break; case Js::OpCodeAsmJs::Eqz_Int: @@ -2389,6 +2474,13 @@ IRBuilderAsmJs::BuildInt2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot case Js::OpCodeAsmJs::GrowMemory: instr = IR::Instr::New(Js::OpCode::GrowWasmMemory, dstOpnd, BuildSrcOpnd(AsmJsRegSlots::WasmMemoryReg, TyVar), srcOpnd, m_func); break; + + case Js::OpCodeAsmJs::I32Extend8_s: + instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt8); + break; + case Js::OpCodeAsmJs::I32Extend16_s: + instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt16); + break; default: Assume(UNREACHED); } @@ -2417,6 +2509,15 @@ IR::RegOpnd* IRBuilderAsmJs::BuildTrapIfMinIntOverNegOne(IR::RegOpnd* src1Opnd, return newSrc; } +IR::Instr* IRBuilderAsmJs::CreateSignExtendInstr(IR::Opnd* dst, IR::Opnd* src, IRType fromType) +{ + // Since CSE ignores the type of the type, the int const value carries that information to prevent + // cse of sign extension of different types. + IR::Opnd* fromTypeOpnd = IR::IntConstOpnd::New(fromType, fromType, m_func); + // Src2 is a dummy source, used only to carry the type to cast from + return IR::Instr::New(Js::OpCode::Conv_Prim, dst, src, fromTypeOpnd, m_func); +} + void IRBuilderAsmJs::BuildInt3(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot) { @@ -2624,14 +2725,7 @@ IRBuilderAsmJs::BuildDouble2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSl break; case Js::OpCodeAsmJs::Return_Db: instr = IR::Instr::New(Js::OpCode::Ld_A, dstOpnd, srcOpnd, m_func); - if (m_func->IsLoopBody()) - { - IR::Instr* slotInstr = GenerateStSlotForReturn(srcOpnd, IRType::TyFloat64); - AddInstr(slotInstr, offset); - } - break; - case Js::OpCodeAsmJs::I_Conv_VTD: - instr = IR::Instr::New(Js::OpCode::Ld_A, dstOpnd, srcOpnd, m_func); + CheckJitLoopReturn(dstRegSlot, TyFloat64); break; case Js::OpCodeAsmJs::Trunc_Db: instr = IR::Instr::New(Js::OpCode::Trunc_A, dstOpnd, srcOpnd, m_func); @@ -2680,14 +2774,7 @@ IRBuilderAsmJs::BuildFloat2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlo break; case Js::OpCodeAsmJs::Return_Flt: instr = IR::Instr::New(Js::OpCode::Ld_A, dstOpnd, srcOpnd, m_func); - if (m_func->IsLoopBody()) - { - IR::Instr* slotInstr = GenerateStSlotForReturn(srcOpnd, IRType::TyFloat32); - AddInstr(slotInstr, offset); - } - break; - case Js::OpCodeAsmJs::I_Conv_VTF: - instr = IR::Instr::New(Js::OpCode::Ld_A, dstOpnd, srcOpnd, m_func); + CheckJitLoopReturn(dstRegSlot, TyFloat32); break; case Js::OpCodeAsmJs::Trunc_Flt: instr = IR::Instr::New(Js::OpCode::Trunc_A, dstOpnd, srcOpnd, m_func); @@ -3035,11 +3122,16 @@ IRBuilderAsmJs::BuildLong2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot case Js::OpCodeAsmJs::Return_Long: instr = IR::Instr::New(Js::OpCode::Ld_I4, dstOpnd, srcOpnd, m_func); - if (m_func->IsLoopBody()) - { - IR::Instr* slotInstr = GenerateStSlotForReturn(srcOpnd, IRType::TyInt64); - AddInstr(slotInstr, offset); - } + CheckJitLoopReturn(dstRegSlot, TyInt64); + break; + case Js::OpCodeAsmJs::I64Extend8_s: + instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt8); + break; + case Js::OpCodeAsmJs::I64Extend16_s: + instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt16); + break; + case Js::OpCodeAsmJs::I64Extend32_s: + instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt32); break; default: Assume(UNREACHED); @@ -3381,7 +3473,7 @@ bool IRBuilderAsmJs::IsLoopBodyReturnIPInstr(IR::Instr * instr) const { IR::Opnd * dst = instr->GetDst(); - return (dst && dst->IsRegOpnd() && dst->AsRegOpnd()->m_sym == m_loopBodyRetIPSym); + return (dst && dst->IsRegOpnd() && dst->AsRegOpnd()->m_sym == GetJitLoopBodyData().GetLoopBodyRetIPSym()); } bool @@ -3402,32 +3494,27 @@ IRBuilderAsmJs::GetLoopBodyExitInstrOffset() const return m_func->GetWorkItem()->GetLoopHeader()->endOffset + 1; } -IR::Instr * -IRBuilderAsmJs::CreateLoopBodyReturnIPInstr(uint targetOffset, uint offset) -{ - IR::RegOpnd * retOpnd = IR::RegOpnd::New(m_loopBodyRetIPSym, TyInt32, m_func); - IR::IntConstOpnd * exitOffsetOpnd = IR::IntConstOpnd::New(targetOffset, TyInt32, m_func); - return IR::Instr::New(Js::OpCode::Ld_I4, retOpnd, exitOffsetOpnd, m_func); -} - IR::Opnd * IRBuilderAsmJs::InsertLoopBodyReturnIPInstr(uint targetOffset, uint offset) { - IR::Instr * setRetValueInstr = CreateLoopBodyReturnIPInstr(targetOffset, offset); + IR::RegOpnd * retOpnd = IR::RegOpnd::New(GetJitLoopBodyData().GetLoopBodyRetIPSym(), TyInt32, m_func); + IR::IntConstOpnd * exitOffsetOpnd = IR::IntConstOpnd::New(targetOffset, TyInt32, m_func); + IR::Instr * setRetValueInstr = IR::Instr::New(Js::OpCode::Ld_I4, retOpnd, exitOffsetOpnd, m_func); this->AddInstr(setRetValueInstr, offset); return setRetValueInstr->GetDst(); } IR::SymOpnd * -IRBuilderAsmJs::BuildAsmJsLoopBodySlotOpnd(SymID symId, IRType opndType) +IRBuilderAsmJs::BuildAsmJsLoopBodySlotOpnd(Js::RegSlot regSlot, IRType opndType) { + Assert(IsLoopBody()); // There is no unsigned locals, make sure we create only signed locals opndType = IRType_EnsureSigned(opndType); // Get the interpreter frame instance that was passed in. StackSym *loopParamSym = m_func->EnsureLoopParamSym(); // property ID is the offset - Js::PropertyId propOffSet = CalculatePropertyOffset(symId, opndType); + Js::PropertyId propOffSet = CalculatePropertyOffset(regSlot, opndType); // Get the bytecodeRegSlot and Get the offset from m_localSlots PropertySym * fieldSym = PropertySym::FindOrCreate(loopParamSym->m_id, propOffSet, (uint32)-1, (uint)-1, PropertyKindLocalSlots, m_func); @@ -3435,16 +3522,16 @@ IRBuilderAsmJs::BuildAsmJsLoopBodySlotOpnd(SymID symId, IRType opndType) } void -IRBuilderAsmJs::EnsureLoopBodyAsmJsLoadSlot(SymID symId, IRType type) +IRBuilderAsmJs::EnsureLoopBodyAsmJsLoadSlot(Js::RegSlot regSlot, IRType type) { - if (this->m_ldSlots->TestAndSet(symId)) + if (GetJitLoopBodyData().GetLdSlots()->TestAndSet(regSlot)) { return; } - IR::SymOpnd * fieldSymOpnd = this->BuildAsmJsLoopBodySlotOpnd(symId, type); + IR::SymOpnd * fieldSymOpnd = this->BuildAsmJsLoopBodySlotOpnd(regSlot, type); - StackSym * symDst = StackSym::FindOrCreate(symId, (Js::RegSlot)symId, m_func, fieldSymOpnd->GetType()); + StackSym * symDst = StackSym::FindOrCreate(static_cast(regSlot), regSlot, m_func, fieldSymOpnd->GetType()); IR::RegOpnd * dstOpnd = IR::RegOpnd::New(symDst, symDst->GetType(), m_func); IR::Instr * ldSlotInstr = IR::Instr::New(Js::OpCode::LdSlot, dstOpnd, fieldSymOpnd, m_func); @@ -3455,6 +3542,14 @@ IRBuilderAsmJs::EnsureLoopBodyAsmJsLoadSlot(SymID symId, IRType type) } } +void +IRBuilderAsmJs::EnsureLoopBodyAsmJsStoreSlot(Js::RegSlot regSlot, IRType type) +{ + Assert(!RegIsTemp(regSlot) || RegIsJitLoopYield(regSlot)); + GetJitLoopBodyData().GetStSlots()->Set(regSlot); + EnsureLoopBodyAsmJsLoadSlot(regSlot, type); +} + void IRBuilderAsmJs::GenerateLoopBodySlotAccesses(uint offset) { @@ -3468,51 +3563,46 @@ IRBuilderAsmJs::GenerateLoopBodySlotAccesses(uint offset) symSrc->m_offset = (argument + LowererMD::GetFormalParamOffset()) * MachPtr; symSrc->m_allocated = true; m_func->SetHasImplicitParamLoad(); - IR::SymOpnd *srcOpnd = IR::SymOpnd::New(symSrc, TyMachPtr, m_func); + IR::SymOpnd *srcOpnd = IR::SymOpnd::New(symSrc, TyMachReg, m_func); StackSym *loopParamSym = m_func->EnsureLoopParamSym(); - IR::RegOpnd *loopParamOpnd = IR::RegOpnd::New(loopParamSym, TyMachPtr, m_func); + IR::RegOpnd *loopParamOpnd = IR::RegOpnd::New(loopParamSym, TyMachReg, m_func); IR::Instr *instrArgIn = IR::Instr::New(Js::OpCode::ArgIn_A, loopParamOpnd, srcOpnd, m_func); m_func->m_headInstr->InsertAfter(instrArgIn); - GenerateLoopBodyStSlots(loopParamSym->m_id, offset); -} - -void -IRBuilderAsmJs::GenerateLoopBodyStSlots(SymID loopParamSymId, uint offset) -{ - if (this->m_stSlots->Count() == 0) + if (GetJitLoopBodyData().GetLdSlots()->Count() == 0) { return; } + SymID loopParamSymId = loopParamSym->m_id; - FOREACH_BITSET_IN_FIXEDBV(regSlot, this->m_stSlots) + FOREACH_BITSET_IN_FIXEDBV(index, GetJitLoopBodyData().GetLdSlots()) { - Assert(!this->RegIsConstant((Js::RegSlot)regSlot)); + Js::RegSlot regSlot = (Js::RegSlot)index; IRType type = IRType::TyInt32; ValueType valueType = ValueType::GetInt(false); - if (RegIsIntVar(regSlot)) + if (RegIs(regSlot, WAsmJs::INT32)) { type = IRType::TyInt32; valueType = ValueType::GetInt(false); } - else if (RegIsFloatVar(regSlot)) + else if (RegIs(regSlot, WAsmJs::FLOAT32)) { type = IRType::TyFloat32; valueType = ValueType::Float; } - else if (RegIsDoubleVar(regSlot)) + else if (RegIs(regSlot, WAsmJs::FLOAT64)) { type = IRType::TyFloat64; valueType = ValueType::Float; } - else if (RegIsInt64Var(regSlot)) + else if (RegIs(regSlot, WAsmJs::INT64)) { type = IRType::TyInt64; valueType = ValueType::GetInt(false); } - else if (RegIsSimd128Var(regSlot)) + else if (RegIs(regSlot, WAsmJs::SIMD)) { type = IRType::TySimd128F4; // SIMD regs are non-typed. There is no way to know the incoming SIMD type to a StSlot after a loop body, so we pick any type. @@ -3522,10 +3612,11 @@ IRBuilderAsmJs::GenerateLoopBodyStSlots(SymID loopParamSymId, uint offset) else { AnalysisAssert(UNREACHED); + continue; } Js::PropertyId propOffSet = CalculatePropertyOffset(regSlot, type); - IR::RegOpnd* regOpnd = this->BuildSrcOpnd((Js::RegSlot)regSlot, type); + IR::RegOpnd* regOpnd = this->BuildSrcOpnd(regSlot, type); regOpnd->SetValueType(valueType); // Get the bytecodeRegSlot and Get the offset from m_localSlots @@ -3539,44 +3630,15 @@ IRBuilderAsmJs::GenerateLoopBodyStSlots(SymID loopParamSymId, uint offset) NEXT_BITSET_IN_FIXEDBV; } -Js::PropertyId IRBuilderAsmJs::CalculatePropertyOffset(SymID id, IRType type, bool isVar) +Js::PropertyId IRBuilderAsmJs::CalculatePropertyOffset(Js::RegSlot regSlot, IRType type) { // Compute the offset to the start of the interpreter frame's locals array as a Var index. - size_t localsOffset = 0; - if (!m_IsTJLoopBody) - { - localsOffset = Js::InterpreterStackFrame::GetOffsetOfLocals(); - } + size_t localsOffset = Js::InterpreterStackFrame::GetOffsetOfLocals(); Assert(localsOffset % sizeof(AsmJsSIMDValue) == 0); WAsmJs::Types asmType = WAsmJs::FromIRType(type); const auto typedInfo = m_asmFuncInfo->GetTypedSlotInfo(asmType); - uint32 regSlot = 0; - if (isVar) - { - // Get the bytecodeRegSlot - regSlot = id - GetFirstVar(asmType) + typedInfo.constCount; - } - - return (Js::PropertyId)(regSlot * TySize[type] + typedInfo.byteOffset + localsOffset); -} - -IR::Instr* IRBuilderAsmJs::GenerateStSlotForReturn(IR::RegOpnd* srcOpnd, IRType retType) -{ - // Compute the offset to the start of the interpreter frame's locals array as a Var index. - size_t localsOffset = 0; - if (!m_IsTJLoopBody) - { - localsOffset = Js::InterpreterStackFrame::GetOffsetOfLocals(); - } - Assert(localsOffset % sizeof(AsmJsSIMDValue) == 0); - StackSym *loopParamSym = m_func->EnsureLoopParamSym(); - Js::PropertyId propOffSet = CalculatePropertyOffset(0, retType, false); - // Get the bytecodeRegSlot and Get the offset from m_localSlots - PropertySym * fieldSym = PropertySym::FindOrCreate(loopParamSym->m_id, propOffSet, (uint32)-1, (uint)-1, PropertyKindLocalSlots, m_func); - IR::SymOpnd * fieldSymOpnd = IR::SymOpnd::New(fieldSym, srcOpnd->GetType(), m_func); - Js::OpCode opcode = Js::OpCode::StSlot; - IR::Instr * stSlotInstr = IR::Instr::New(opcode, fieldSymOpnd, srcOpnd, m_func); - return stSlotInstr; + uint32 bytecodeRegSlot = GetTypedRegFromRegSlot(regSlot, asmType); + return (Js::PropertyId)(bytecodeRegSlot * TySize[type] + typedInfo.byteOffset + localsOffset); } Js::OpCode IRBuilderAsmJs::GetSimdOpcode(Js::OpCodeAsmJs asmjsOpcode) @@ -3955,6 +4017,37 @@ IRBuilderAsmJs::BuildInt32x4_3(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_S BuildSimd_3(newOpcode, offset, dstRegSlot, src1RegSlot, src2RegSlot, TySimd128I4); } +void +IRBuilderAsmJs::BuildInt32x4_4(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG4) +{ + ValueType valueType = GetSimdValueTypeFromIRType(TySimd128I4); + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128I4); + src1Opnd->SetValueType(valueType); + + IR::RegOpnd * src2Opnd = BuildSrcOpnd(src2RegSlot, TySimd128I4); + src2Opnd->SetValueType(valueType); + + IR::RegOpnd * mask = BuildSrcOpnd(src3RegSlot, TySimd128I4); + src2Opnd->SetValueType(valueType); + + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128I4); + dstOpnd->SetValueType(GetSimdValueTypeFromIRType(TySimd128I4)); + + Js::OpCode opcode; + + opcode = GetSimdOpcode(newOpcode); + + AssertMsg((uint32)opcode, "Invalid backend SIMD opcode"); + + IR::Instr* instr = nullptr; + + instr = AddExtendedArg(src1Opnd, nullptr, offset); + instr = AddExtendedArg(src2Opnd, instr->GetDst()->AsRegOpnd(), offset); + instr = AddExtendedArg(mask, instr->GetDst()->AsRegOpnd(), offset); + + AddInstr(IR::Instr::New(opcode, dstOpnd, instr->GetDst(), m_func), offset); +} + void IRBuilderAsmJs::BuildBool32x4_1Int32x4_2(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG3) { @@ -4513,37 +4606,144 @@ void IRBuilderAsmJs::BuildReg1Int8x16_1(Js::OpCodeAsmJs newOpcode, uint32 offset } } +/* Int64x2 */ +void +IRBuilderAsmJs::BuildInt64x2_1Long1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG2) +{ + Assert(newOpcode == Js::OpCodeAsmJs::Simd128_Splat_I2); + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TyInt64); + src1Opnd->SetValueType(ValueType::GetInt(false)); + + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128I2); + dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Int64x2)); + + Js::OpCode opcode = GetSimdOpcode(newOpcode); + AssertMsg((uint32)opcode, "Invalid backend SIMD opcode"); + + IR::Instr * instr = IR::Instr::New(opcode, dstOpnd, src1Opnd, m_func); + AddInstr(instr, offset); +} + +void +IRBuilderAsmJs::BuildInt1Bool64x2_1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG2) +{ + Assert(newOpcode == Js::OpCodeAsmJs::Simd128_AnyTrue_B2 || newOpcode == Js::OpCodeAsmJs::Simd128_AllTrue_B2); + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128I2); + src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Int64x2)); + + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TyInt32); + dstOpnd->SetValueType(ValueType::GetInt(false)); + + Js::OpCode opcode = GetSimdOpcode(newOpcode); + AssertMsg((uint32)opcode, "Invalid backend SIMD opcode"); + + IR::Instr * instr = IR::Instr::New(opcode, dstOpnd, src1Opnd, m_func); + AddInstr(instr, offset); +} + +void +IRBuilderAsmJs::BuildLong1Int64x2_1Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG3) +{ + Assert(newOpcode == Js::OpCodeAsmJs::Simd128_ExtractLane_I2); + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128I2); + src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Int64x2)); + + IR::RegOpnd * src2Opnd = BuildSrcOpnd(src2RegSlot, TyInt32); + src2Opnd->SetValueType(ValueType::GetInt(false)); + + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TyInt64); + dstOpnd->SetValueType(ValueType::GetInt(false)); + + Js::OpCode opcode = GetSimdOpcode(newOpcode); + AssertMsg((uint32)opcode, "Invalid backend SIMD opcode"); + + IR::Instr * instr = IR::Instr::New(opcode, dstOpnd, src1Opnd, src2Opnd, m_func); + AddInstr(instr, offset); +} + +void +IRBuilderAsmJs::BuildInt64x2_2_Int1_Long1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG4) +{ + Assert(newOpcode == Js::OpCodeAsmJs::Simd128_ReplaceLane_I2); + BuildSimd_2Int2(newOpcode, offset, dstRegSlot, src1RegSlot, src2RegSlot, src3RegSlot, TySimd128I2, TyInt64); +} + +void +IRBuilderAsmJs::BuildInt64x2_2Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG3) +{ + Assert(newOpcode == Js::OpCodeAsmJs::Simd128_ShLtByScalar_I2 || + newOpcode == Js::OpCodeAsmJs::Simd128_ShRtByScalar_I2 || + newOpcode == Js::OpCodeAsmJs::Simd128_ShRtByScalar_U2 + ); + BuildSimd_2Int1(newOpcode, offset, dstRegSlot, src1RegSlot, src2RegSlot, TySimd128I2); +} + +void +IRBuilderAsmJs::BuildInt64x2_3(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG3) +{ + Assert(newOpcode == Js::OpCodeAsmJs::Simd128_Add_I2 || newOpcode == Js::OpCodeAsmJs::Simd128_Sub_I2); + BuildSimd_3(newOpcode, offset, dstRegSlot, src1RegSlot, src2RegSlot, TySimd128F4); +} + +void +IRBuilderAsmJs::BuildInt64x2_2(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG2) +{ + Assert(newOpcode == Js::OpCodeAsmJs::Simd128_Neg_I2 || + newOpcode == Js::OpCodeAsmJs::Simd128_FromUint64x2_D2 || + newOpcode == Js::OpCodeAsmJs::Simd128_FromInt64x2_D2 || + newOpcode == Js::OpCodeAsmJs::Simd128_FromFloat64x2_I2 || + newOpcode == Js::OpCodeAsmJs::Simd128_FromFloat64x2_U2); + BuildSimd_2(newOpcode, offset, dstRegSlot, src1RegSlot, TySimd128I2); +} + /* Float64x2 */ -// Disabled for now -#if 0 +void +IRBuilderAsmJs::BuildDouble1Float64x2_1Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG3) +{ + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128F4); + src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); + + IR::RegOpnd * src2Opnd = BuildSrcOpnd(src2RegSlot, TyInt32); + src2Opnd->SetValueType(ValueType::GetInt(false)); + + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TyFloat64); + dstOpnd->SetValueType(ValueType::Float); + + Js::OpCode opcode = GetSimdOpcode(newOpcode); + + AssertMsg((opcode == Js::OpCode::Simd128_ExtractLane_D2), "Unexpected opcode for this format."); + + IR::Instr * instr = IR::Instr::New(opcode, dstOpnd, src1Opnd, src2Opnd, m_func); + AddInstr(instr, offset); +} + +void IRBuilderAsmJs::BuildFloat64x2_1Double1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG2) +{ + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TyFloat64); + src1Opnd->SetValueType(ValueType::Float); + + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128F4); + dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); + + Js::OpCode opcode = GetSimdOpcode(newOpcode); + + AssertMsg(opcode == Js::OpCode::Simd128_Splat_D2, "Invalid backend SIMD opcode"); + IR::Instr * instr = IR::Instr::New(opcode, dstOpnd, src1Opnd, m_func); + AddInstr(instr, offset); +} + void IRBuilderAsmJs::BuildFloat64x2_2(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG2) { - IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128D2); - src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float64x2)); + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128F4); + src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); - IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128D2); - dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float64x2)); + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128F4); + dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); Js::OpCode opcode; - switch (newOpcode) - { - case Js::OpCodeAsmJs::Simd128_Return_D2: - if (m_func->IsLoopBody()) - { - IR::Instr* slotInstr = GenerateStSlotForReturn(src1Opnd, IRType::TySimd128D2); - AddInstr(slotInstr, offset); - } - opcode = Js::OpCode::Ld_A; - break; - case Js::OpCodeAsmJs::Simd128_I_Conv_VTD2: - case Js::OpCodeAsmJs::Simd128_Ld_D2: - opcode = Js::OpCode::Ld_A; - break; - default: - opcode = GetSimdOpcode(newOpcode); - } + opcode = GetSimdOpcode(newOpcode); AssertMsg((uint32)opcode, "Invalid backend SIMD opcode"); @@ -4554,14 +4754,14 @@ IRBuilderAsmJs::BuildFloat64x2_2(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD void IRBuilderAsmJs::BuildFloat64x2_3(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG3) { - IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128D2); - src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float64x2)); + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128F4); + src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); - IR::RegOpnd * src2Opnd = BuildSrcOpnd(src2RegSlot, TySimd128D2); - src2Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float64x2)); + IR::RegOpnd * src2Opnd = BuildSrcOpnd(src2RegSlot, TySimd128F4); + src2Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); - IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128D2); - dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float64x2)); + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128F4); + dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); Js::OpCode opcode; @@ -4573,6 +4773,40 @@ IRBuilderAsmJs::BuildFloat64x2_3(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD AddInstr(instr, offset); } +void +IRBuilderAsmJs::BuildFloat64x2_2Int1Double1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG4) +{ + IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TySimd128F4); + src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); + + IR::RegOpnd * src2Opnd = BuildSrcOpnd(src2RegSlot, TyInt32); + src2Opnd->SetValueType(ValueType::GetInt(false)); + + IR::RegOpnd * src3Opnd = BuildSrcOpnd(src3RegSlot, TyFloat64); + src3Opnd->SetValueType(ValueType::Float); + + IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128F4); + dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); + + // Given bytecode: dst = op s1, s2, s3 + // Generate: + // t1 = ExtendedArg_A s1 + // t2 = ExtendedArg_A s2, t1 + // t3 = ExtendedArg_A s3, t2 + // dst = op t3 + + IR::Instr* instr = nullptr; + + instr = AddExtendedArg(src1Opnd, nullptr, offset); + instr = AddExtendedArg(src2Opnd, instr->GetDst()->AsRegOpnd(), offset); + instr = AddExtendedArg(src3Opnd, instr->GetDst()->AsRegOpnd(), offset); + + Js::OpCode opcode = GetSimdOpcode(newOpcode); + AssertMsg((opcode == Js::OpCode::Simd128_ReplaceLane_D2), "Unexpected opcode for this format."); + AddInstr(IR::Instr::New(opcode, dstOpnd, instr->GetDst(), m_func), offset); +} +// Disabled for now +#if 0 void IRBuilderAsmJs::BuildFloat64x2_4(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG4) { @@ -4623,20 +4857,7 @@ void IRBuilderAsmJs::BuildFloat64x2_1Double2(Js::OpCodeAsmJs newOpcode, uint32 o AddInstr(instr, offset); } -void IRBuilderAsmJs::BuildFloat64x2_1Double1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG2) -{ - IR::RegOpnd * src1Opnd = BuildSrcOpnd(src1RegSlot, TyFloat64); - src1Opnd->SetValueType(ValueType::Float); - - IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128D2); - dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float64x2)); - - Js::OpCode opcode = GetSimdOpcode(newOpcode); - AssertMsg(opcode == Js::OpCode::Simd128_Splat_D2, "Invalid backend SIMD opcode"); - IR::Instr * instr = IR::Instr::New(opcode, dstOpnd, src1Opnd, m_func); - AddInstr(instr, offset); -} void IRBuilderAsmJs::BuildFloat64x2_2Double1(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG3) @@ -5683,6 +5904,33 @@ void IRBuilderAsmJs::BuildUint8x16_2Int16(Js::OpCodeAsmJs newOpcode, uint32 offs AddInstr(IR::Instr::New(opcode, dstOpnd, instr->GetDst(), m_func), offset); } + +template +void +IRBuilderAsmJs::BuildAsmShuffle(Js::OpCodeAsmJs newOpcode, uint32 offset) +{ + Assert(OpCodeAttrAsmJs::HasMultiSizeLayout(newOpcode) && newOpcode == Js::OpCodeAsmJs::Simd128_Shuffle_V8X16); + auto layout = m_jnReader.GetLayout>(); + + IR::RegOpnd * dstOpnd = BuildDstOpnd(GetRegSlotFromSimd128Reg(layout->R0), TySimd128U16); + IR::RegOpnd * src1Opnd = BuildSrcOpnd(GetRegSlotFromSimd128Reg(layout->R1), TySimd128U16); + IR::RegOpnd * src2Opnd = BuildSrcOpnd(GetRegSlotFromSimd128Reg(layout->R2), TySimd128U16); + dstOpnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Uint8x16)); + src1Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Uint8x16)); + src2Opnd->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Uint8x16)); + + IR::Instr * instr = nullptr; + instr = AddExtendedArg(src1Opnd, nullptr, offset); + instr = AddExtendedArg(src2Opnd, instr->GetDst()->AsRegOpnd(), offset); + + for (uint i = 0; i < Wasm::Simd::MAX_LANES; i++) + { + IR::RegOpnd* shuffleOpnd = (IR::RegOpnd*)IR::IntConstOpnd::New(layout->INDICES[i], TyInt32, this->m_func); + instr = AddExtendedArg(shuffleOpnd, instr->GetDst()->AsRegOpnd(), offset); + } + AddInstr(IR::Instr::New(Js::OpCode::Simd128_Shuffle_U16, dstOpnd, instr->GetDst(), m_func), offset); +} + void IRBuilderAsmJs::BuildUint8x16_3Int16(Js::OpCodeAsmJs newOpcode, uint32 offset, BUILD_SIMD_ARGS_REG19) { IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, TySimd128U16); @@ -6191,7 +6439,7 @@ void IRBuilderAsmJs::BuildSimd_1Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, J AddInstr(instr, offset); } -void IRBuilderAsmJs::BuildSimd_2Int2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, Js::RegSlot src3RegSlot, IRType simdType) +void IRBuilderAsmJs::BuildSimd_2Int2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, Js::RegSlot src3RegSlot, IRType simdType, IRType valType) { ValueType valueType = GetSimdValueTypeFromIRType(simdType); @@ -6201,7 +6449,7 @@ void IRBuilderAsmJs::BuildSimd_2Int2(Js::OpCodeAsmJs newOpcode, uint32 offset, J IR::RegOpnd * src2Opnd = BuildSrcOpnd(src2RegSlot, TyInt32); src2Opnd->SetValueType(ValueType::GetInt(false)); - IR::RegOpnd * src3Opnd = BuildSrcOpnd(src3RegSlot, TyInt32); + IR::RegOpnd * src3Opnd = BuildSrcOpnd(src3RegSlot, valType); src3Opnd->SetValueType(ValueType::GetInt(false)); IR::RegOpnd * dstOpnd = BuildDstOpnd(dstRegSlot, simdType); @@ -6247,23 +6495,7 @@ void IRBuilderAsmJs::BuildSimd_2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::R case Js::OpCodeAsmJs::Simd128_Return_B4: case Js::OpCodeAsmJs::Simd128_Return_B8: case Js::OpCodeAsmJs::Simd128_Return_B16: - if (m_func->IsLoopBody()) - { - IR::Instr* slotInstr = GenerateStSlotForReturn(src1Opnd, simdType); - AddInstr(slotInstr, offset); - } - opcode = Js::OpCode::Ld_A; - break; - case Js::OpCodeAsmJs::Simd128_I_Conv_VTF4: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTI4: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTI8: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTI16: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTU4: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTU8: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTU16: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTB4: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTB8: - case Js::OpCodeAsmJs::Simd128_I_Conv_VTB16: + CheckJitLoopReturn(dstRegSlot, simdType); case Js::OpCodeAsmJs::Simd128_Ld_F4: case Js::OpCodeAsmJs::Simd128_Ld_I4: case Js::OpCodeAsmJs::Simd128_Ld_I8: @@ -6282,8 +6514,24 @@ void IRBuilderAsmJs::BuildSimd_2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::R AssertMsg((uint32)opcode, "Invalid backend SIMD opcode"); - IR::Instr * instr = IR::Instr::New(opcode, dstOpnd, src1Opnd, m_func); - AddInstr(instr, offset); + if (newOpcode == Js::OpCodeAsmJs::Simd128_Neg_I2) + { + SIMDValue zeroVec{ 0 }; + IR::Opnd* zeroConst = IR::Simd128ConstOpnd::New(zeroVec, TySimd128F4, m_func); + IR::RegOpnd* tmpReg = IR::RegOpnd::New(TyMachSimd128F4, m_func); + tmpReg->SetValueType(ValueType::GetSimd128(ObjectType::Simd128Float32x4)); + IR::Instr * instr = IR::Instr::New(Js::OpCode::Simd128_LdC, tmpReg, zeroConst, m_func); + AddInstr(instr, offset); + instr = IR::Instr::New(Js::OpCode::Simd128_Sub_I2, dstOpnd, tmpReg, src1Opnd, m_func); + AddInstr(instr, offset); + + } + else + { + IR::Instr * instr = IR::Instr::New(opcode, dstOpnd, src1Opnd, m_func); + AddInstr(instr, offset); + } + } void IRBuilderAsmJs::BuildSimd_2Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, IRType simdType) @@ -6379,6 +6627,8 @@ ValueType IRBuilderAsmJs::GetSimdValueTypeFromIRType(IRType type) return ValueType::GetSimd128(ObjectType::Simd128Float32x4); case TySimd128D2: return ValueType::GetSimd128(ObjectType::Simd128Float64x2); + case TySimd128I2: + return ValueType::GetSimd128(ObjectType::Simd128Int64x2); case TySimd128I4: return ValueType::GetSimd128(ObjectType::Simd128Int32x4); case TySimd128I8: @@ -6438,11 +6688,11 @@ void IRBuilderAsmJs::BuildAsmSimdTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offs { Assert(OpCodeAttrAsmJs::HasMultiSizeLayout(newOpcode)); auto layout = m_jnReader.GetLayout>(); - BuildAsmSimdTypedArr(newOpcode, offset, layout->SlotIndex, layout->Value, layout->ViewType, layout->DataWidth); + BuildAsmSimdTypedArr(newOpcode, offset, layout->SlotIndex, layout->Value, layout->ViewType, layout->DataWidth, layout->Offset); } void -IRBuilderAsmJs::BuildAsmSimdTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, Js::ArrayBufferView::ViewType viewType, uint8 dataWidth) +IRBuilderAsmJs::BuildAsmSimdTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, Js::ArrayBufferView::ViewType viewType, uint8 dataWidth, uint32 simdOffset) { IRType type = TySimd128F4; Js::RegSlot valueRegSlot = GetRegSlotFromSimd128Reg(value); @@ -6770,6 +7020,7 @@ IRBuilderAsmJs::BuildAsmSimdTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, u // REVIEW: Store dataWidth in the instruction itself instead of an argument to avoid using ExtendedArgs or excessive opcodes. Assert(dataWidth >= 4 && dataWidth <= 16); instr->dataWidth = dataWidth; + indirOpnd->SetOffset(simdOffset); if (maskInstr) { AddInstr(maskInstr, offset); diff --git a/deps/chakrashim/core/lib/Backend/IRBuilderAsmJs.h b/deps/chakrashim/core/lib/Backend/IRBuilderAsmJs.h index 1776f14bbc3..5ffadf2fa8f 100644 --- a/deps/chakrashim/core/lib/Backend/IRBuilderAsmJs.h +++ b/deps/chakrashim/core/lib/Backend/IRBuilderAsmJs.h @@ -20,6 +20,57 @@ namespace AsmJsRegSlots }; }; +struct JitLoopBodyData +{ +private: + BVFixed* m_ldSlots = nullptr; + BVFixed* m_stSlots = nullptr; + StackSym* m_loopBodyRetIPSym = nullptr; + BVFixed* m_yieldRegs = nullptr; + uint32 m_loopCurRegs[WAsmJs::LIMIT]; + +public: + JitLoopBodyData(BVFixed* ldSlots, BVFixed* stSlots, StackSym* loopBodyRetIPSym) + { + Assert(ldSlots && stSlots && loopBodyRetIPSym); + m_ldSlots = ldSlots; + m_stSlots = stSlots; + m_loopBodyRetIPSym = loopBodyRetIPSym; + } + // Use m_yieldRegs initialization to determine if m_loopCurRegs is initialized + bool IsLoopCurRegsInitialized() const { return !!m_yieldRegs; } + template void InitLoopCurRegs(__in_ecount(WAsmJs::LIMIT) T* curRegs, BVFixed* yieldRegs) + { + Assert(yieldRegs && curRegs); + m_yieldRegs = yieldRegs; + for (WAsmJs::Types type = WAsmJs::Types(0); type != WAsmJs::LIMIT; type = WAsmJs::Types(type + 1)) + { + m_loopCurRegs[type] = curRegs[type]; + } + } + bool IsRegOutsideOfLoop(uint32 typeReg, WAsmJs::Types type) const + { + Assert(IsLoopCurRegsInitialized()); + return typeReg < m_loopCurRegs[type]; + } + bool IsYieldReg(Js::RegSlot reg) const + { + return m_yieldRegs && m_yieldRegs->Test(reg); + } + void SetRegIsYield(Js::RegSlot reg) + { + Assert(m_yieldRegs); + m_yieldRegs->Set(reg); + } + BVFixed* GetStSlots() const { return m_stSlots; } + BVFixed* GetLdSlots() const { return m_ldSlots; } + StackSym* GetLoopBodyRetIPSym() const { return m_loopBodyRetIPSym; } + +#if DBG + BVFixed* m_usedAsTemp; +#endif +}; + class IRBuilderAsmJs { friend struct IRBuilderAsmJsSwitchAdapter; @@ -27,11 +78,14 @@ class IRBuilderAsmJs public: IRBuilderAsmJs(Func * func) : m_func(func) - , m_IsTJLoopBody(false) , m_switchAdapter(this) , m_switchBuilder(&m_switchAdapter) { - func->m_workItem->InitializeReader(&m_jnReader, &m_statementReader, func->m_alloc); + if (!m_func->GetJITFunctionBody()->IsWasmFunction()) + { + m_statementReader = Anew(func->m_alloc, Js::StatementReader); + } + func->m_workItem->InitializeReader(&m_jnReader, m_statementReader, func->m_alloc); m_asmFuncInfo = m_func->GetJITFunctionBody()->GetAsmJsInfo(); #if 0 // templatized JIT loop body @@ -61,14 +115,12 @@ class IRBuilderAsmJs void AddInstr(IR::Instr * instr, uint32 offset); bool IsLoopBody()const; uint GetLoopBodyExitInstrOffset() const; - IR::SymOpnd * BuildLoopBodySlotOpnd(SymID symId); - IR::SymOpnd * BuildAsmJsLoopBodySlotOpnd(SymID symId, IRType opndType); - void EnsureLoopBodyLoadSlot(SymID symId); - void EnsureLoopBodyAsmJsLoadSlot(SymID symId, IRType type); + IR::SymOpnd * BuildAsmJsLoopBodySlotOpnd(Js::RegSlot regSlot, IRType opndType); + void EnsureLoopBodyAsmJsLoadSlot(Js::RegSlot regSlot, IRType type); + void EnsureLoopBodyAsmJsStoreSlot(Js::RegSlot regSlot, IRType type); bool IsLoopBodyOuterOffset(uint offset) const; bool IsLoopBodyReturnIPInstr(IR::Instr * instr) const; IR::Opnd * InsertLoopBodyReturnIPInstr(uint targetOffset, uint offset); - IR::Instr * CreateLoopBodyReturnIPInstr(uint targetOffset, uint offset); IR::RegOpnd * BuildDstOpnd(Js::RegSlot dstRegSlot, IRType type); IR::RegOpnd * BuildSrcOpnd(Js::RegSlot srcRegSlot, IRType type); IR::RegOpnd * BuildIntConstOpnd(Js::RegSlot regSlot); @@ -80,17 +132,23 @@ class IRBuilderAsmJs BranchReloc * AddBranchInstr(IR::BranchInstr *instr, uint32 offset, uint32 targetOffset); BranchReloc * CreateRelocRecord(IR::BranchInstr * branchInstr, uint32 offset, uint32 targetOffset); void BuildHeapBufferReload(uint32 offset); - template + template void CreateLoadConstInstrForType(byte* table, Js::RegSlot& regAllocated, uint32 constCount, uint32 offset, IRType irType, ValueType valueType, Js::OpCode opcode, F extraProcess); void BuildConstantLoads(); void BuildImplicitArgIns(); void InsertLabels(); IR::LabelInstr * CreateLabel(IR::BranchInstr * branchInstr, uint& offset); -#if DBG - BVFixed * m_usedAsTemp; -#endif - Js::RegSlot GetTypedRegFromRegSlot(Js::RegSlot reg, WAsmJs::Types type); + uint32 GetTypedRegFromRegSlot(Js::RegSlot reg, WAsmJs::Types type); Js::RegSlot GetRegSlotFromTypedReg(Js::RegSlot srcReg, WAsmJs::Types type); + Js::RegSlot GetRegSlotFromPtrReg(Js::RegSlot srcReg) + { +#if TARGET_32 + return GetRegSlotFromIntReg(srcReg); +#elif TARGET_64 + return GetRegSlotFromInt64Reg(srcReg); +#endif + } + Js::RegSlot GetRegSlotFromIntReg(Js::RegSlot srcIntReg) {return GetRegSlotFromTypedReg(srcIntReg, WAsmJs::INT32);} Js::RegSlot GetRegSlotFromInt64Reg(Js::RegSlot srcIntReg) {return GetRegSlotFromTypedReg(srcIntReg, WAsmJs::INT64);} Js::RegSlot GetRegSlotFromFloatReg(Js::RegSlot srcFloatReg) {return GetRegSlotFromTypedReg(srcFloatReg, WAsmJs::FLOAT32);} @@ -104,17 +162,17 @@ class IRBuilderAsmJs bool RegIsSimd128ReturnVar(Js::RegSlot reg); SymID GetMappedTemp(Js::RegSlot reg); void SetMappedTemp(Js::RegSlot reg, SymID tempId); - BOOL GetTempUsed(Js::RegSlot reg); - void SetTempUsed(Js::RegSlot reg, BOOL used); - BOOL RegIsTemp(Js::RegSlot reg); - BOOL RegIsConstant(Js::RegSlot reg); - BOOL RegIsVar(Js::RegSlot reg); - BOOL RegIsTypedVar(Js::RegSlot reg, WAsmJs::Types type); - BOOL RegIsIntVar(Js::RegSlot reg) {return RegIsTypedVar(reg, WAsmJs::INT32);} - BOOL RegIsInt64Var(Js::RegSlot reg) {return RegIsTypedVar(reg, WAsmJs::INT64);} - BOOL RegIsFloatVar(Js::RegSlot reg) {return RegIsTypedVar(reg, WAsmJs::FLOAT32);} - BOOL RegIsDoubleVar(Js::RegSlot reg) {return RegIsTypedVar(reg, WAsmJs::FLOAT64);} - BOOL RegIsSimd128Var(Js::RegSlot reg) {return RegIsTypedVar(reg, WAsmJs::SIMD);} + bool GetTempUsed(Js::RegSlot reg); + void SetTempUsed(Js::RegSlot reg, bool used); + bool RegIsTemp(Js::RegSlot reg); + bool RegIsConstant(Js::RegSlot reg); + bool RegIsVar(Js::RegSlot reg); + bool RegIsTypedVar(Js::RegSlot reg, WAsmJs::Types type); + bool RegIsTypedConst(Js::RegSlot reg, WAsmJs::Types type); + bool RegIsTypedTmp(Js::RegSlot reg, WAsmJs::Types type); + bool RegIs(Js::RegSlot reg, WAsmJs::Types type); + bool RegIsJitLoopYield(Js::RegSlot reg); + void CheckJitLoopReturn(Js::RegSlot reg, IRType type); void BuildArgOut(IR::Opnd* srcOpnd, uint32 dstRegSlot, uint32 offset, IRType type, ValueType valueType = ValueType::Uninitialized); void BuildFromVar(uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, IRType irType, ValueType valueType); @@ -126,7 +184,7 @@ class IRBuilderAsmJs #include "ByteCode/LayoutTypesAsmJs.h" void BuildSimd_1Ints(Js::OpCodeAsmJs newOpcode, uint32 offset, IRType dstSimdType, Js::RegSlot* srcRegSlots, Js::RegSlot dstRegSlot, uint LANES); void BuildSimd_1Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, IRType simdType); - void BuildSimd_2Int2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, Js::RegSlot src3RegSlot, IRType simdType); + void BuildSimd_2Int2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, Js::RegSlot src3RegSlot, IRType simdType, IRType valType = TyInt32); void BuildSimd_2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, IRType simdType); void BuildSimd_2Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, IRType simdType); void BuildSimd_3(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, IRType simdType); @@ -135,35 +193,36 @@ class IRBuilderAsmJs ValueType GetSimdValueTypeFromIRType(IRType type); void BuildElementSlot(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 slotIndex, Js::RegSlot value, Js::RegSlot instance); - void BuildAsmUnsigned1(Js::OpCodeAsmJs newOpcode, uint value); + void BuildAsmUnsigned1(Js::OpCodeAsmJs newOpcode, uint offset); + void BuildWasmLoopStart(Js::OpCodeAsmJs newOpcode, uint offset); void BuildWasmMemAccess(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, uint32 constOffset, Js::ArrayBufferView::ViewType viewType); void BuildAsmTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, Js::ArrayBufferView::ViewType viewType); - void BuildAsmSimdTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, Js::ArrayBufferView::ViewType viewType, uint8 DataWidth); - void BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSlot argCount, Js::RegSlot ret, Js::RegSlot function, int8 returnType); + void BuildAsmSimdTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, Js::ArrayBufferView::ViewType viewType, uint8 DataWidth, uint32 simdOffset); + void BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSlot argCount, Js::RegSlot ret, Js::RegSlot function, int8 returnType, Js::ProfileId profileId); void BuildAsmReg1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstReg); void BuildBrInt1(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 relativeOffset, Js::RegSlot src); void BuildBrInt2(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 relativeOffset, Js::RegSlot src1, Js::RegSlot src2); void BuildBrInt1Const1(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 relativeOffset, Js::RegSlot src1, int32 src2); void BuildBrCmp(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 relativeOffset, IR::RegOpnd* src1Opnd, IR::Opnd* src2Opnd); void GenerateLoopBodySlotAccesses(uint offset); - void GenerateLoopBodyStSlots(SymID loopParamSymId, uint offset); static void InitializeMemAccessTypeInfo(Js::ArrayBufferView::ViewType viewType, _Out_ MemAccessTypeInfo * typeInfo); - Js::PropertyId CalculatePropertyOffset(SymID id, IRType type, bool isVar = true); + Js::PropertyId CalculatePropertyOffset(Js::RegSlot regSlot, IRType type); - IR::Instr* GenerateStSlotForReturn(IR::RegOpnd* srcOpnd, IRType type); IR::RegOpnd* BuildTrapIfZero(IR::RegOpnd* srcOpnd, uint32 offset); IR::RegOpnd* BuildTrapIfMinIntOverNegOne(IR::RegOpnd* src1Opnd, IR::RegOpnd* src2Opnd, uint32 offset); - + + IR::Instr* CreateSignExtendInstr(IR::Opnd* dst, IR::Opnd* src, IRType fromType); + JitArenaAllocator * m_tempAlloc; JitArenaAllocator * m_funcAlloc; Func * m_func; IR::Instr * m_lastInstr; IR::Instr ** m_offsetToInstruction; Js::ByteCodeReader m_jnReader; - Js::StatementReader m_statementReader; - SList * m_argStack; + Js::StatementReader* m_statementReader = nullptr; + SListCounted *m_argStack; SList * m_tempList; SList * m_argOffsetStack; SList * m_branchRelocList; @@ -171,7 +230,6 @@ class IRBuilderAsmJs static const uint32 m_firstsTypeCount = WAsmJs::LIMIT * 3 + 1; Js::RegSlot m_firstsType[m_firstsTypeCount]; Js::RegSlot m_firstVarConst; - Js::RegSlot m_firstIRTemp; Js::RegSlot m_tempCount; Js::OpCode * m_simdOpcodesMap; @@ -184,17 +242,16 @@ class IRBuilderAsmJs Js::RegSlot GetLastVar(WAsmJs::Types type) { return m_firstsType[type + WAsmJs::LIMIT + 1]; } Js::RegSlot GetLastTmp(WAsmJs::Types type) { return m_firstsType[type + WAsmJs::LIMIT * 2 + 1]; } + JitLoopBodyData& GetJitLoopBodyData() { Assert(IsLoopBody()); return *m_jitLoopBodyData; } + const JitLoopBodyData& GetJitLoopBodyData() const { Assert(IsLoopBody()); return *m_jitLoopBodyData; } + SymID * m_tempMap; BVFixed * m_fbvTempUsed; uint32 m_functionStartOffset; const AsmJsJITInfo * m_asmFuncInfo; - StackSym * m_loopBodyRetIPSym; - BVFixed * m_ldSlots; - BVFixed * m_stSlots; - BOOL m_IsTJLoopBody; + JitLoopBodyData* m_jitLoopBodyData = nullptr; IRBuilderAsmJsSwitchAdapter m_switchAdapter; SwitchIRBuilder m_switchBuilder; - IR::RegOpnd * m_funcOpnd; #if DBG uint32 m_offsetToInstructionCount; #endif @@ -213,6 +270,7 @@ class IRBuilderAsmJs #define Bool32x4_Type Js::RegSlot #define Int32x4_Type Js::RegSlot #define Float64x2_Type Js::RegSlot +#define Int64x2_Type Js::RegSlot #define Int16x8_Type Js::RegSlot #define Bool16x8_Type Js::RegSlot #define Int8x16_Type Js::RegSlot diff --git a/deps/chakrashim/core/lib/Backend/IRType.cpp b/deps/chakrashim/core/lib/Backend/IRType.cpp index 548146c0709..6ee5b2de03e 100644 --- a/deps/chakrashim/core/lib/Backend/IRType.cpp +++ b/deps/chakrashim/core/lib/Backend/IRType.cpp @@ -47,6 +47,11 @@ bool IRType_IsNativeInt(IRType type) } bool IRType_IsInt64(IRType type) { return type == TyInt64 || type == TyUint64; } +bool IRType_IsNativeIntOrVar(IRType type) +{ + return IRType_IsNativeInt(type) || type == TyVar; +} + bool IRType_IsSimd(IRType type) { return TyBaseType[type] == IRBaseType_Simd; diff --git a/deps/chakrashim/core/lib/Backend/IRType.h b/deps/chakrashim/core/lib/Backend/IRType.h index d92d98a51a8..f6cb7d6591b 100644 --- a/deps/chakrashim/core/lib/Backend/IRType.h +++ b/deps/chakrashim/core/lib/Backend/IRType.h @@ -4,8 +4,6 @@ //------------------------------------------------------------------------------------------------------- #pragma once -extern const int MachPtr; - enum IRType : BYTE { #define IRTYPE(Name, BaseType, Bytes, Bits, EnRegOk, DumpName) Ty ## Name, @@ -29,6 +27,7 @@ extern bool IRType_IsUnsignedInt(IRType type); extern bool IRType_IsFloat(IRType type); extern bool IRType_IsNative(IRType type); extern bool IRType_IsNativeInt(IRType type); +extern bool IRType_IsNativeIntOrVar(IRType type); extern bool IRType_IsInt64(IRType type); extern bool IRType_IsSimd(IRType type); extern bool IRType_IsSimd128(IRType type); @@ -38,3 +37,14 @@ extern IRType IRType_EnsureUnsigned(IRType type); #if DBG_DUMP || defined(ENABLE_IR_VIEWER) extern void IRType_Dump(IRType type); #endif + +#ifdef _M_AMD64 + #include "amd64/machvalues.h" +#elif defined(_M_IX86) + #include "i386/machvalues.h" +#elif defined(_M_ARM) + #include "arm/machvalues.h" +#elif defined(_M_ARM64) + #include "arm64/machvalues.h" +#endif + diff --git a/deps/chakrashim/core/lib/Backend/IRTypeList.h b/deps/chakrashim/core/lib/Backend/IRTypeList.h index 7d0bf1d9aee..1627ff7ec40 100644 --- a/deps/chakrashim/core/lib/Backend/IRTypeList.h +++ b/deps/chakrashim/core/lib/Backend/IRTypeList.h @@ -32,6 +32,7 @@ IRTYPE(Simd128U16, Simd, 16, b(16), 1, simd128) IRTYPE(Simd128B4, Simd, 16, b(16), 1, simd128) IRTYPE(Simd128B8, Simd, 16, b(16), 1, simd128) IRTYPE(Simd128B16, Simd, 16, b(16), 1, simd128) +IRTYPE(Simd128I2, Simd, 16, b(16), 1, simd128) IRTYPE(Simd128D2, Simd, 16, b(16), 1, simd128) // SIMD end diff --git a/deps/chakrashim/core/lib/Backend/Inline.cpp b/deps/chakrashim/core/lib/Backend/Inline.cpp index 03489fc760d..ffeaa33660b 100644 --- a/deps/chakrashim/core/lib/Backend/Inline.cpp +++ b/deps/chakrashim/core/lib/Backend/Inline.cpp @@ -13,7 +13,7 @@ Inline::Optimize() void Inline::Optimize(Func *func, __in_ecount_opt(callerArgOutCount) IR::Instr *callerArgOuts[], Js::ArgSlot callerArgOutCount, uint recursiveInlineDepth) { - if (!func->DoInline() || !topFunc->DoInline() || func->GetJITFunctionBody()->IsAsmJsMode()) // disable inlining for asm + if (!func->DoInline() || !topFunc->DoInline()) { return; } @@ -379,7 +379,81 @@ Inline::Optimize(Func *func, __in_ecount_opt(callerArgOutCount) IR::Instr *calle } break; } + case Js::OpCode::AsmJsCallI: + { + if (this->inlineesProcessed == inlinerData->GetInlineeCount() || !instr->IsProfiledInstr()) + { + break; + } + + const auto profileId = static_cast(instr->AsProfiledInstr()->u.profileId); + if (profileId >= func->GetJITFunctionBody()->GetProfiledCallSiteCount()) + { + break; + } + + const auto inlineeData = inlinerData->GetInlinee(profileId); + if (!inlineeData) + { + break; + } + if (PHASE_OFF(Js::InlineCandidatePhase, inlineeData)) + { + break; + } + + // Don't try to inline a function if it doesn't have profile data + if (!inlineeData->GetBody()->HasProfileInfo()) + { + break; + } + + uint16 constantArguments = 0; + if (!PHASE_OFF(Js::InlineRecursivePhase, func)) + { + instr->IterateArgInstrs([&](IR::Instr* argInstr) { + IR::Opnd *src1 = argInstr->GetSrc1(); + if (!src1->IsRegOpnd()) + { + return false; + } + StackSym *sym = src1->AsRegOpnd()->m_sym; + if (sym->IsIntConst()) + { + if (argInstr->GetSrc2() && argInstr->GetSrc2()->IsSymOpnd()) + { + StackSym *dstSym = argInstr->GetDst()->AsSymOpnd()->m_sym->AsStackSym(); + Assert(dstSym->IsSingleDef()); + Assert(dstSym->IsArgSlotSym()); + Js::ArgSlot argCount = dstSym->GetArgSlotNum() - 1; + + if (argCount == Js::Constants::MaximumArgumentCountForConstantArgumentInlining) + { + return true; + } + constantArguments |= (1 << argCount); + } + } + return false; + }); + } + if (!inliningHeuristics.BackendInlineIntoInliner( + inlineeData, func, this->topFunc, profileId, isCtor, true /*isFixedMethodCall*/, + this->IsInliningOutSideLoops(), this->isInLoop != 0, recursiveInlineDepth, constantArguments)) + { + break; + } + + instrNext = this->InlineScriptFunction(instr, inlineeData, symThis, profileId, &isInlined, recursiveInlineDepth); + + if (++this->inlineesProcessed == inlinerData->GetInlineeCount()) + { + return; + } + + break; + } case Js::OpCode::CallIExtended: { if (this->inlineesProcessed == inlinerData->GetInlineeCount()) @@ -1291,8 +1365,18 @@ Inline::BuildIRForInlinee(Func *inlinee, JITTimeFunctionBody *funcBody, IR::Inst BEGIN_CODEGEN_PHASE(this->topFunc, Js::IRBuilderPhase); - IRBuilder irBuilder(inlinee); - irBuilder.Build(); +#ifdef ASMJS_PLAT + if (this->topFunc->GetJITFunctionBody()->IsAsmJsMode()) + { + IRBuilderAsmJs irBuilder(inlinee); + irBuilder.Build(); + } + else +#endif + { + IRBuilder irBuilder(inlinee); + irBuilder.Build(); + } END_CODEGEN_PHASE_NO_DUMP(this->topFunc, Js::IRBuilderPhase); @@ -1315,8 +1399,6 @@ bool Inline::TryOptimizeCallInstrWithFixedMethod(IR::Instr *callInstr, const FunctionJITTimeInfo * inlineeInfo, bool isPolymorphic, bool isBuiltIn, bool isCtor, bool isInlined, bool &safeThis, bool dontOptimizeJustCheck, uint i /*i-th inlinee at a polymorphic call site*/) { - Assert(!callInstr->m_func->GetJITFunctionBody()->HasTry()); - if (PHASE_OFF(Js::FixedMethodsPhase, callInstr->m_func)) { return false; @@ -2071,7 +2153,7 @@ Inline::InlineBuiltInFunction(IR::Instr *callInstr, const FunctionJITTimeInfo * if(tmpDst) { - IR::Instr * ldInstr = IR::Instr::New(Js::OpCode::Ld_A, callInstrDst, tmpDst, callInstr->m_func); + IR::Instr * ldInstr = IR::Instr::New(Func::GetLoadOpForType(callInstrDst->GetType()), callInstrDst, tmpDst, callInstr->m_func); inlineBuiltInEndInstr->InsertBefore(ldInstr); } @@ -2286,6 +2368,11 @@ IR::Instr* Inline::InlineApply(IR::Instr *callInstr, const FunctionJITTimeInfo * // We may still decide not to inline. *pIsInlined = false; + if (argsCount == 0) + { + return callInstr; + } + Js::BuiltinFunction builtInId = Js::JavascriptLibrary::GetBuiltInForFuncInfo(applyData->GetFunctionInfoAddr(), this->topFunc->GetThreadContextInfo()); const FunctionJITTimeInfo * inlineeData = nullptr; @@ -2380,6 +2467,10 @@ IR::Instr * Inline::InlineApplyWithArgumentsObject(IR::Instr * callInstr, IR::In IR::Instr * argumentsObjArgOut = nullptr; uint argOutCount = 0; this->GetArgInstrsForCallAndApply(callInstr, &implicitThisArgOut, &explicitThisArgOut, &argumentsObjArgOut, argOutCount); + + Assert(implicitThisArgOut); + Assert(explicitThisArgOut); + Assert(argumentsObjArgOut); // BailOnNotEqual s4.var ---------------New additional BAILOUT if not stack args or actuals exceed 16 at runtime. // Bailout: #004e (BailOutOnInlineFunction) @@ -2471,6 +2562,9 @@ IR::Instr * Inline::InlineApplyBuiltInTargetWithArray(IR::Instr * callInstr, con uint argOutCount = 0; this->GetArgInstrsForCallAndApply(callInstr, &implicitThisArgOut, &explicitThisArgOut, &arrayArgOut, argOutCount); + Assert(implicitThisArgOut); + Assert(explicitThisArgOut); + Assert(arrayArgOut); Js::OpCode originalCallOpcode = callInstr->m_opcode; IR::Opnd * originalCallSrc1 = callInstr->GetSrc1()->Copy(this->topFunc); IR::AutoReuseOpnd autoReuseOriginalCallSrc1(originalCallSrc1, this->topFunc); @@ -2481,7 +2575,6 @@ IR::Instr * Inline::InlineApplyBuiltInTargetWithArray(IR::Instr * callInstr, con { return callInstr; } - AnalysisAssert(applyTargetLdInstr != nullptr); // Fixed function/function object checks for target built-in callInstr->ReplaceSrc1(applyTargetLdInstr->GetDst()); EmitFixedMethodOrFunctionObjectChecksForBuiltIns(callInstr, callInstr, builtInInfo, false /*isPolymorphic*/, true /*isBuiltIn*/, false /*isCtor*/, true /*isInlined*/); @@ -2548,6 +2641,9 @@ IR::Instr * Inline::InlineApplyWithoutArrayArgument(IR::Instr *callInstr, const uint argOutCount = 0; this->GetArgInstrsForCallAndApply(callInstr, &implicitThisArgOut, &explicitThisArgOut, &dummyInstr, argOutCount); + Assert(implicitThisArgOut); + Assert(explicitThisArgOut); + EmitFixedMethodOrFunctionObjectChecksForBuiltIns(callInstr, callInstr, applyInfo, false /*isPolymorphic*/, true /*isBuiltIn*/, false /*isCtor*/, true /*isInlined*/); InsertInlineeBuiltInStartEndTags(callInstr, 2); // 2 args (implicit this + explicit this) @@ -2621,7 +2717,8 @@ void Inline::GetArgInstrsForCallAndApply(IR::Instr* callInstr, IR::Instr** impli linkOpnd->AsRegOpnd()->m_sym->m_isInlinedArgSlot = true; } -bool Inline::TryGetApplyAndTargetLdInstrs(IR::Instr * callInstr, _Outptr_result_maybenull_ IR::Instr ** applyLdInstr, _Outptr_result_maybenull_ IR::Instr ** applyTargetLdInstr) +_Success_(return != false) +bool Inline::TryGetApplyAndTargetLdInstrs(IR::Instr * callInstr, _Outptr_result_nullonfailure_ IR::Instr ** applyLdInstr, _Outptr_result_nullonfailure_ IR::Instr ** applyTargetLdInstr) { IR::Opnd* applyOpnd = callInstr->GetSrc1(); Assert(applyOpnd->IsRegOpnd()); @@ -2664,7 +2761,6 @@ bool Inline::InlineApplyScriptTarget(IR::Instr *callInstr, const FunctionJITTime { return false; } - AnalysisAssert(applyTargetLdInstr != nullptr); if(applyTargetLdInstr->m_opcode != Js::OpCode::LdFldForCallApplyTarget || ((applyTargetLdInstr->AsProfiledInstr()->u.FldInfo().flags & Js::FldInfo_FromAccessor) != 0)) @@ -2925,6 +3021,8 @@ Inline::InlineCall(IR::Instr *callInstr, const FunctionJITTimeInfo *funcInfo, co IR::Instr * dummyInstr2 = nullptr; this->GetArgInstrsForCallAndApply(callInstr, &argImplicitInstr, &dummyInstr1, &dummyInstr2, actualCount); + Assert(argImplicitInstr); + IR::SymOpnd* orgLinkOpnd = callInstr->GetSrc2()->AsSymOpnd(); EmitFixedMethodOrFunctionObjectChecksForBuiltIns(callInstr, callInstr, funcInfo, false /*isPolymorphic*/, true /*isBuiltIn*/, false /*isCtor*/, true /*isInlined*/); @@ -2956,7 +3054,7 @@ Inline::InlineCall(IR::Instr *callInstr, const FunctionJITTimeInfo *funcInfo, co // Change ArgOut to use temp as src1. StackSym * stackSym = StackSym::New(orgSrc1->GetStackSym()->GetType(), argImplicitInstr->m_func); IR::Opnd* tempDst = IR::RegOpnd::New(stackSym, orgSrc1->GetType(), argImplicitInstr->m_func); - IR::Instr *assignInstr = IR::Instr::New(Js::OpCode::Ld_A, tempDst, orgSrc1, argImplicitInstr->m_func); + IR::Instr *assignInstr = IR::Instr::New(Func::GetLoadOpForType(orgSrc1->GetType()), tempDst, orgSrc1, argImplicitInstr->m_func); assignInstr->SetByteCodeOffset(orgArgout); tempDst->SetIsJITOptimizedReg(true); orgArgout->InsertBefore(assignInstr); @@ -3640,16 +3738,21 @@ Inline::InlineFunctionCommon(IR::Instr *callInstr, bool originalCallTargetOpndIs { BuildIRForInlinee(inlinee, funcInfo->GetBody(), callInstr, isApplyTarget, recursiveInlineDepth); - Js::ArgSlot formalCount = funcInfo->GetBody()->GetInParamsCount(); + Js::ArgSlot formalCount = +#ifdef ASMJS_PLAT + funcInfo->GetBody()->IsAsmJsMode() ? funcInfo->GetBody()->GetAsmJsInfo()->GetArgCount() : +#endif + funcInfo->GetBody()->GetInParamsCount(); + IR::Instr *argOuts[Js::InlineeCallInfo::MaxInlineeArgoutCount]; #if DBG - memset(argOuts, 0xFE, sizeof(argOuts)); + memset(argOuts, 0, sizeof(argOuts)); #endif if (callInstr->m_opcode == Js::OpCode::CallIFixed) { Assert(callInstr->GetFixedFunction()->GetFuncInfoAddr() == funcInfo->GetFunctionInfoAddr()); } - else + else if(!this->topFunc->GetJITFunctionBody()->IsAsmJsMode()) { PrepareInsertionPoint(callInstr, funcInfo, inlineBailoutChecksBeforeInstr); } @@ -3665,7 +3768,7 @@ Inline::InlineFunctionCommon(IR::Instr *callInstr, bool originalCallTargetOpndIs bool stackArgsArgOutExpanded = false; Js::ArgSlot actualCount = MapActuals(callInstr, argOuts, formalCount, inlinee, (Js::ProfileId)callInstr->AsProfiledInstr()->u.profileId, &stackArgsArgOutExpanded, argOutsExtra); inlinee->actualCount = actualCount; - Assert(actualCount > 0); + Assert(actualCount > 0 || funcInfo->GetBody()->IsAsmJsMode()); #if DBG if(safeThis) @@ -3693,7 +3796,7 @@ Inline::InlineFunctionCommon(IR::Instr *callInstr, bool originalCallTargetOpndIs // Set it to belong to the inlinee, so that we can use the actual count when lowering InlineeStart callInstr->m_func = inlinee; - callInstr->SetDst(IR::RegOpnd::New(TyVar, inlinee)); + callInstr->SetDst(IR::RegOpnd::New(returnValueOpnd ? returnValueOpnd->GetType() : TyVar, inlinee)); // Put the meta arguments that the stack walker expects to find on the stack. SetupInlineeFrame(inlinee, callInstr, actualCount, callInstr->GetSrc1()); @@ -3778,7 +3881,7 @@ void Inline::InlineDOMGetterSetterFunction(IR::Instr *ldFldInstr, const Function // type-specific optimizations. Otherwise, this optimization to reduce calls into the host will also // result in relatively more expensive calls in the runtime. tmpDst->SetValueType(ldFldInstr->GetDst()->GetValueType()); - + IR::Opnd * callInstrDst = ldFldInstr->UnlinkDst(); ldFldInstr->SetDst(tmpDst); @@ -4299,6 +4402,10 @@ bool Inline::InlConstFoldArg(IR::Instr *instr, __in_ecount_opt(callerArgOutCount { return false; } + if (instr->m_func->GetJITFunctionBody()->HasTry()) + { + return false; + } IR::Opnd *src1 = instr->GetSrc1(); IntConstType value; @@ -4560,8 +4667,11 @@ Inline::MapActuals(IR::Instr *callInstr, __out_ecount(maxParamCount) IR::Instr * // This allows us to markTemp the argOut source. argInstr->m_opcode = Js::OpCode::ArgOut_A_Inline; } + if (!inlinee->GetJITFunctionBody()->IsAsmJsMode()) + { + argInstr->GenerateBytecodeArgOutCapture(); + } } - argInstr->GenerateBytecodeArgOutCapture(); } // Expand @@ -4798,48 +4908,57 @@ Inline::MapFormals(Func *inlinee, if (argOuts[argIndex]) { IR::Instr *argOut = argOuts[argIndex]; - IR::Instr* instrDef; - if (argOut->HasByteCodeArgOutCapture()) + + if (instr->m_func->GetJITFunctionBody()->IsAsmJsMode()) { - instrDef = argOut->GetBytecodeArgOutCapture(); + instr->SetSrc1(argOut->GetSrc1()); + instr->m_opcode = Func::GetLoadOpForType(argOut->GetSrc1()->GetType()); } else { - Assert(argOut->m_opcode == Js::OpCode::ArgOut_A_FixupForStackArgs); - instrDef = argOut->GetArgOutSnapshot(); - } + IR::Instr* instrDef; + if (argOut->HasByteCodeArgOutCapture()) + { + instrDef = argOut->GetBytecodeArgOutCapture(); + } + else + { + Assert(argOut->m_opcode == Js::OpCode::ArgOut_A_FixupForStackArgs); + instrDef = argOut->GetArgOutSnapshot(); + } - instr->SetSrc1(instrDef->GetDst()); - instr->m_opcode = Js::OpCode::Ld_A; - IR::Opnd* dst = instr->GetDst(); - IR::Opnd* src = instrDef->GetSrc1(); + instr->SetSrc1(instrDef->GetDst()); + instr->m_opcode = Js::OpCode::Ld_A; + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src = instrDef->GetSrc1(); - if (argIndex == 0) - { - // Look at the "this" argument source. - // If it's known to be a normal object (the caller has already guaranteed that, or - // it was defined by an instruction that produces normal objects), we'll omit CheckThis. - // If it's a constant value, we'll do the mapping at jit time and copy the final value. - if (src->IsRegOpnd()) + if (argIndex == 0) { - symThis = dst->AsRegOpnd()->m_sym; - - StackSym *symSrc = src->AsRegOpnd()->m_sym; - if (symSrc == symCallerThis || - symSrc->m_isSafeThis || - inlinee->IsInlinedConstructor()) - { - fUsesSafeThis = true; - } - else if (symSrc->m_isSingleDef && symSrc->IsConst() && !symSrc->IsIntConst() && !symSrc->IsFloatConst()) - { - thisConstSym = symSrc; - fUsesConstThis = true; - } - else if(fixedFunctionSafeThis) + // Look at the "this" argument source. + // If it's known to be a normal object (the caller has already guaranteed that, or + // it was defined by an instruction that produces normal objects), we'll omit CheckThis. + // If it's a constant value, we'll do the mapping at jit time and copy the final value. + if (src->IsRegOpnd()) { - // Note this need to come after we determined that this pointer is not const (undefined/null) - fUsesSafeThis = true; + symThis = dst->AsRegOpnd()->m_sym; + + StackSym *symSrc = src->AsRegOpnd()->m_sym; + if (symSrc == symCallerThis || + symSrc->m_isSafeThis || + inlinee->IsInlinedConstructor()) + { + fUsesSafeThis = true; + } + else if (symSrc->m_isSingleDef && symSrc->IsConst() && !symSrc->IsIntConst() && !symSrc->IsFloatConst()) + { + thisConstSym = symSrc; + fUsesConstThis = true; + } + else if (fixedFunctionSafeThis) + { + // Note this need to come after we determined that this pointer is not const (undefined/null) + fUsesSafeThis = true; + } } } } @@ -4949,7 +5068,16 @@ Inline::MapFormals(Func *inlinee, } break; } - + case Js::OpCode::LdAsmJsEnv: + if (instr->m_func == inlinee) + { + instr->SetSrc1(funcObjOpnd); + } + else + { + Assert(instr->GetSrc1() != nullptr); + } + break; case Js::OpCode::LdEnv: if (instr->m_func == inlinee) { @@ -5109,7 +5237,8 @@ Inline::MapFormals(Func *inlinee, } else { - instr->m_opcode = Js::OpCode::Ld_A; + Assert(instr->GetSrc1() != nullptr); + instr->m_opcode = Func::GetLoadOpForType(instr->GetSrc1()->GetType()); instr->SetDst(retOpnd); } break; diff --git a/deps/chakrashim/core/lib/Backend/Inline.h b/deps/chakrashim/core/lib/Backend/Inline.h index e7e1ed58f91..5181894059d 100644 --- a/deps/chakrashim/core/lib/Backend/Inline.h +++ b/deps/chakrashim/core/lib/Backend/Inline.h @@ -53,7 +53,7 @@ class Inline bool InlineApplyScriptTarget(IR::Instr *callInstr, const FunctionJITTimeInfo* inlinerData, const FunctionJITTimeInfo** pInlineeData, const FunctionJITTimeInfo * applyFuncInfo, const StackSym *symThis, IR::Instr ** returnInstr, uint recursiveInlineDepth, bool isArrayOpndArgumentsObject, uint argsCount); void GetArgInstrsForCallAndApply(IR::Instr* callInstr, IR::Instr** implicitThisArgOut, IR::Instr** explicitThisArgOut, IR::Instr** argumentsOrArrayArgOut, uint &argOutCount); - bool TryGetApplyAndTargetLdInstrs(IR::Instr * callInstr, _Outptr_result_maybenull_ IR::Instr ** applyLdInstr, _Outptr_result_maybenull_ IR::Instr ** applyTargetLdInstr); + _Success_(return != false) bool TryGetApplyAndTargetLdInstrs(IR::Instr * callInstr, _Outptr_result_nullonfailure_ IR::Instr ** applyLdInstr, _Outptr_result_nullonfailure_ IR::Instr ** applyTargetLdInstr); IR::Instr * InlineCall(IR::Instr *callInstr, const FunctionJITTimeInfo * inlineeData, const FunctionJITTimeInfo * inlinerData, const StackSym *symThis, bool* pIsInlined, uint callSiteId, uint recursiveInlineDepth); bool InlineCallTarget(IR::Instr *callInstr, const FunctionJITTimeInfo* inlinerData, const FunctionJITTimeInfo** pInlineeData, const FunctionJITTimeInfo *callFuncInfo, const StackSym *symThis, IR::Instr ** returnInstr, uint recursiveInlineDepth); diff --git a/deps/chakrashim/core/lib/Backend/InliningDecider.cpp b/deps/chakrashim/core/lib/Backend/InliningDecider.cpp index e33fcfbbf1f..e70eb92b50f 100644 --- a/deps/chakrashim/core/lib/Backend/InliningDecider.cpp +++ b/deps/chakrashim/core/lib/Backend/InliningDecider.cpp @@ -5,7 +5,7 @@ #include "Backend.h" InliningDecider::InliningDecider(Js::FunctionBody *const topFunc, bool isLoopBody, bool isInDebugMode, const ExecutionMode jitMode) - : topFunc(topFunc), isLoopBody(isLoopBody), isInDebugMode(isInDebugMode), jitMode(jitMode), bytecodeInlinedCount(0), numberOfInlineesWithLoop (0), threshold(topFunc->GetByteCodeWithoutLDACount(), isLoopBody) + : topFunc(topFunc), isLoopBody(isLoopBody), isInDebugMode(isInDebugMode), jitMode(jitMode), bytecodeInlinedCount(0), numberOfInlineesWithLoop (0), threshold(topFunc->GetByteCodeWithoutLDACount(), isLoopBody, topFunc->GetIsAsmjsMode()) { Assert(topFunc); } @@ -23,17 +23,18 @@ bool InliningDecider::InlineIntoTopFunc() const { return false; } - +#ifdef _M_IX86 if (this->topFunc->GetHasTry()) { #if defined(DBG_DUMP) || defined(ENABLE_DEBUG_CONFIG_OPTIONS) char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE]; #endif INLINE_TESTTRACE(_u("INLINING: Skip Inline: Has try\tCaller: %s (%s)\n"), this->topFunc->GetDisplayName(), - this->topFunc->GetDebugNumberSet(debugStringBuffer)); + this->topFunc->GetDebugNumberSet(debugStringBuffer)); // Glob opt doesn't run on function with try, so we can't generate bailout for it return false; } +#endif return InlineIntoInliner(topFunc); } @@ -218,13 +219,15 @@ Js::FunctionInfo *InliningDecider::Inline(Js::FunctionBody *const inliner, Js::F return nullptr; } +#ifdef _M_IX86 if (inlinee->GetHasTry()) { INLINE_TESTTRACE(_u("INLINING: Skip Inline: Has try\tInlinee: %s (%s)\tCaller: %s (%s)\n"), - inlinee->GetDisplayName(), inlinee->GetDebugNumberSet(debugStringBuffer), inliner->GetDisplayName(), - inliner->GetDebugNumberSet(debugStringBuffer2)); + inlinee->GetDisplayName(), inlinee->GetDebugNumberSet(debugStringBuffer), inliner->GetDisplayName(), + inliner->GetDebugNumberSet(debugStringBuffer2)); return nullptr; } +#endif // This is a hard limit as the argOuts array is statically sized. if (inlinee->GetInParamsCount() > Js::InlineeCallInfo::MaxInlineeArgoutCount) @@ -235,7 +238,8 @@ Js::FunctionInfo *InliningDecider::Inline(Js::FunctionBody *const inliner, Js::F return nullptr; } - if (inlinee->GetInParamsCount() == 0) + // Wasm functions can have no params + if (inlinee->GetInParamsCount() == 0 && !inlinee->GetIsAsmjsMode()) { // Inline candidate has no params, not even a this pointer. This can only be the global function, // which we shouldn't inline. @@ -670,12 +674,16 @@ bool InliningDecider::DeciderInlineIntoInliner(Js::FunctionBody * inlinee, Js::F return false; } - if (inlinee->GetIsAsmjsMode() || inliner->GetIsAsmjsMode()) + if (inliner->GetIsAsmjsMode() != inlinee->GetIsAsmjsMode()) { return false; } - - if (PHASE_FORCE(Js::InlinePhase, this->topFunc) || +// Force inline all Js Builtins functions +// The existing JsBuiltInForceInline flag can work only when we explictly create scriptFunction +// We can also have methods that we define on the prototype like next of ArrayIterator for which we don't explictly create a script function +// TODO (megupta) : use forceInline for methods defined on the prototype using ObjectDefineProperty + if (inlinee->GetSourceContextId() == Js::Constants::JsBuiltInSourceContextId || + PHASE_FORCE(Js::InlinePhase, this->topFunc) || PHASE_FORCE(Js::InlinePhase, inliner) || PHASE_FORCE(Js::InlinePhase, inlinee)) { diff --git a/deps/chakrashim/core/lib/Backend/InliningHeuristics.cpp b/deps/chakrashim/core/lib/Backend/InliningHeuristics.cpp index bc31868be2a..225a122c4fd 100644 --- a/deps/chakrashim/core/lib/Backend/InliningHeuristics.cpp +++ b/deps/chakrashim/core/lib/Backend/InliningHeuristics.cpp @@ -4,18 +4,14 @@ //------------------------------------------------------------------------------------------------------- #include "Backend.h" -InliningThreshold::InliningThreshold(uint nonLoadByteCodeCount, bool forLoopBody, bool aggressive) : nonLoadByteCodeCount(nonLoadByteCodeCount) +InliningThreshold::InliningThreshold(uint nonLoadByteCodeCount, bool forLoopBody, bool asmjs) : + nonLoadByteCodeCount(nonLoadByteCodeCount), + forLoopBody(forLoopBody), + asmjs(asmjs) { - this->forLoopBody = forLoopBody; - if (aggressive) - { - SetAggressiveHeuristics(); - } - else - { - SetHeuristics(); - } + SetHeuristics(); } + void InliningThreshold::SetAggressiveHeuristics() { Assert(!this->forLoopBody); @@ -54,6 +50,10 @@ void InliningThreshold::SetHeuristics() { inlineThreshold += CONFIG_FLAG(InlineThresholdAdjustCountInSmallFunction); } + if (this->asmjs) + { + inlineThreshold += CONFIG_FLAG(AsmJsInlineAdjust); + } constructorInlineThreshold = CONFIG_FLAG(ConstructorInlineThreshold); outsideLoopInlineThreshold = CONFIG_FLAG(OutsideLoopInlineThreshold); @@ -114,7 +114,8 @@ bool InliningHeuristics::BackendInlineIntoInliner(const FunctionJITTimeInfo * in return false; } - if(PHASE_FORCE(Js::InlinePhase, this->topFunc) || + if(inlinee->IsJsBuiltInForceInline() || + PHASE_FORCE(Js::InlinePhase, this->topFunc) || PHASE_FORCE(Js::InlinePhase, inliner) || PHASE_FORCE(Js::InlinePhase, inlinee)) { diff --git a/deps/chakrashim/core/lib/Backend/InliningHeuristics.h b/deps/chakrashim/core/lib/Backend/InliningHeuristics.h index 6e133ec0a17..633a0a4391a 100644 --- a/deps/chakrashim/core/lib/Backend/InliningHeuristics.h +++ b/deps/chakrashim/core/lib/Backend/InliningHeuristics.h @@ -10,6 +10,7 @@ struct InliningThreshold { uint nonLoadByteCodeCount; bool forLoopBody; + bool asmjs; int inlineThreshold; int constructorInlineThreshold; int outsideLoopInlineThreshold; @@ -20,7 +21,7 @@ struct InliningThreshold int maxNumberOfInlineesWithLoop; int constantArgumentInlineThreshold; - InliningThreshold(uint nonLoadByteCodeCount, bool forLoopBody, bool aggressive = false); + InliningThreshold(uint nonLoadByteCodeCount, bool forLoopBody, bool asmjs); void SetHeuristics(); void SetAggressiveHeuristics(); void Reset(); @@ -36,7 +37,7 @@ class InliningHeuristics public: public: - InliningHeuristics(const FunctionJITTimeInfo * topFunc, bool forLoopBody) :topFunc(topFunc), threshold(topFunc->GetBody()->GetNonLoadByteCodeCount(), forLoopBody) {}; + InliningHeuristics(const FunctionJITTimeInfo * topFunc, bool forLoopBody) :topFunc(topFunc), threshold(topFunc->GetBody()->GetNonLoadByteCodeCount(), forLoopBody, topFunc->GetBody()->IsAsmJsMode()) {}; bool BackendInlineIntoInliner(const FunctionJITTimeInfo * inlinee, Func * inliner, Func *topFunc, diff --git a/deps/chakrashim/core/lib/Backend/IntBounds.cpp b/deps/chakrashim/core/lib/Backend/IntBounds.cpp index c0c471e302d..2311879ec96 100644 --- a/deps/chakrashim/core/lib/Backend/IntBounds.cpp +++ b/deps/chakrashim/core/lib/Backend/IntBounds.cpp @@ -178,7 +178,7 @@ void IntBounds::SetBound( // Aggressively merge the constant lower or upper bound of the base value, adjusted by the offset ValueInfo const * const baseValueInfo = baseValue->GetValueInfo(); - int constantBoundBase; + int constantBoundBase = 0xCCCCCCCC; const bool success = Lower ? baseValueInfo->TryGetIntConstantLowerBound(&constantBoundBase, true) @@ -342,7 +342,7 @@ bool IntBounds::IsGreaterThanOrEqualTo(const Value *const value, const int offse Assert(value); ValueInfo const * const valueInfo = value->GetValueInfo(); - int constantBoundBase; + int constantBoundBase = INT32_MAX; const bool success = valueInfo->TryGetIntConstantUpperBound(&constantBoundBase, true); Assert(success); if(IsGreaterThanOrEqualTo(constantBoundBase, offset)) @@ -360,7 +360,7 @@ bool IntBounds::IsLessThanOrEqualTo(const Value *const value, const int offset) Assert(value); ValueInfo const * const valueInfo = value->GetValueInfo(); - int constantBoundBase; + int constantBoundBase = INT32_MIN; const bool success = valueInfo->TryGetIntConstantLowerBound(&constantBoundBase, true); Assert(success); if(IsLessThanOrEqualTo(constantBoundBase, offset)) diff --git a/deps/chakrashim/core/lib/Backend/InterpreterThunkEmitter.cpp b/deps/chakrashim/core/lib/Backend/InterpreterThunkEmitter.cpp index 991dc8e9ad5..66debff69d1 100644 --- a/deps/chakrashim/core/lib/Backend/InterpreterThunkEmitter.cpp +++ b/deps/chakrashim/core/lib/Backend/InterpreterThunkEmitter.cpp @@ -4,19 +4,28 @@ //------------------------------------------------------------------------------------------------------- #include "Backend.h" -#ifdef ENABLE_NATIVE_CODEGEN +#if ENABLE_NATIVE_CODEGEN + +namespace { + +// The definitions in this anonymous namespace must be constexpr to allow OACR to conclude that certain operations +// in InterpreterThunkEmitter::EncodeInterpreterThunk are safe. Because constexpr requires that the declaration +// and the definition appear at the same place (i.e., no forward declarations), this means that we either have +// to move all 5 definitions of InterpreterThunk into the header file, or we have to make InterpreterThunkSize +// public. The latter option seems the less objectionable, so that's what I've done here. + #ifdef _M_X64 #ifdef _WIN32 -const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 23; -const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 27; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 31; -const BYTE InterpreterThunkEmitter::CallBlockStartAddrOffset = 41; -const BYTE InterpreterThunkEmitter::ThunkSizeOffset = 55; -const BYTE InterpreterThunkEmitter::ErrorOffset = 64; -const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 81; +constexpr BYTE FunctionInfoOffset = 23; +constexpr BYTE FunctionProxyOffset = 27; +constexpr BYTE DynamicThunkAddressOffset = 31; +constexpr BYTE CallBlockStartAddrOffset = 41; +constexpr BYTE ThunkSizeOffset = 55; +constexpr BYTE ErrorOffset = 64; +constexpr BYTE ThunkAddressOffset = 81; -const BYTE InterpreterThunkEmitter::PrologSize = 80; -const BYTE InterpreterThunkEmitter::StackAllocSize = 0x28; +constexpr BYTE PrologSize = 80; +constexpr BYTE StackAllocSize = 0x28; // // Home the arguments onto the stack and pass a pointer to the base of the stack location to the inner thunk @@ -25,7 +34,7 @@ const BYTE InterpreterThunkEmitter::StackAllocSize = 0x28; // Hence, we allocate 0x28 bytes of stack space for the callee to use. The callee uses 8 bytes to push the first // argument and the rest 0x20 ensures alignment is correct. // -const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { +constexpr BYTE InterpreterThunk[InterpreterThunkEmitter::InterpreterThunkSize] = { 0x48, 0x89, 0x54, 0x24, 0x10, // mov qword ptr [rsp+10h],rdx 0x48, 0x89, 0x4C, 0x24, 0x08, // mov qword ptr [rsp+8],rcx 0x4C, 0x89, 0x44, 0x24, 0x18, // mov qword ptr [rsp+18h],r8 @@ -51,25 +60,25 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC // int 3 ;for alignment to size of 8 we are adding this }; -const BYTE InterpreterThunkEmitter::Epilog[] = { +constexpr BYTE Epilog[] = { 0x48, 0x83, 0xC4, StackAllocSize, // add rsp,28h 0xC3 // ret }; - #else // Sys V AMD64 -const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 7; -const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 11; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 15; -const BYTE InterpreterThunkEmitter::CallBlockStartAddrOffset = 25; -const BYTE InterpreterThunkEmitter::ThunkSizeOffset = 39; -const BYTE InterpreterThunkEmitter::ErrorOffset = 48; -const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 61; - -const BYTE InterpreterThunkEmitter::PrologSize = 60; -const BYTE InterpreterThunkEmitter::StackAllocSize = 0x0; - -const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { + +constexpr BYTE FunctionInfoOffset = 7; +constexpr BYTE FunctionProxyOffset = 11; +constexpr BYTE DynamicThunkAddressOffset = 15; +constexpr BYTE CallBlockStartAddrOffset = 25; +constexpr BYTE ThunkSizeOffset = 39; +constexpr BYTE ErrorOffset = 48; +constexpr BYTE ThunkAddressOffset = 61; + +constexpr BYTE PrologSize = 60; +constexpr BYTE StackAllocSize = 0x0; + +constexpr BYTE InterpreterThunk[InterpreterThunkEmitter::InterpreterThunkSize] = { 0x55, // push rbp // Prolog - setup the stack frame 0x48, 0x89, 0xe5, // mov rbp, rsp 0x48, 0x8b, 0x47, 0x00, // mov rax, qword ptr [rdi + FunctionInfoOffset] @@ -92,21 +101,22 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { 0xcc // int 3 // for alignment to size of 8 }; -const BYTE InterpreterThunkEmitter::Epilog[] = { +constexpr BYTE Epilog[] = { 0x5d, // pop rbp 0xc3 // ret }; #endif #elif defined(_M_ARM) -const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 8; -const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 18; -const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 22; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 26; -const BYTE InterpreterThunkEmitter::CallBlockStartAddressInstrOffset = 42; -const BYTE InterpreterThunkEmitter::CallThunkSizeInstrOffset = 54; -const BYTE InterpreterThunkEmitter::ErrorOffset = 64; - -const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { + +constexpr BYTE ThunkAddressOffset = 8; +constexpr BYTE FunctionInfoOffset = 18; +constexpr BYTE FunctionProxyOffset = 22; +constexpr BYTE DynamicThunkAddressOffset = 26; +constexpr BYTE CallBlockStartAddressInstrOffset = 42; +constexpr BYTE CallThunkSizeInstrOffset = 54; +constexpr BYTE ErrorOffset = 64; + +constexpr BYTE InterpreterThunk[InterpreterThunkEmitter::InterpreterThunkSize] = { 0x0F, 0xB4, // push {r0-r3} 0x2D, 0xE9, 0x00, 0x48, // push {r11,lr} 0xEB, 0x46, // mov r11,sp @@ -133,26 +143,27 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { 0x18, 0x47 // bx r3 }; -const BYTE InterpreterThunkEmitter::JmpOffset = 2; +constexpr BYTE JmpOffset = 2; -const BYTE InterpreterThunkEmitter::Call[] = { +constexpr BYTE Call[] = { 0x88, 0x47, // blx r1 0x00, 0x00, 0x00, 0x00, // b.w epilog 0xFE, 0xDE, // int 3 ;Required for alignment }; -const BYTE InterpreterThunkEmitter::Epilog[] = { +constexpr BYTE Epilog[] = { 0x5D, 0xF8, 0x04, 0xBB, // pop {r11} 0x5D, 0xF8, 0x14, 0xFB // ldr pc,[sp],#0x14 }; #elif defined(_M_ARM64) -const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 24; -const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 28; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 32; -const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 36; + +constexpr BYTE FunctionInfoOffset = 24; +constexpr BYTE FunctionProxyOffset = 28; +constexpr BYTE DynamicThunkAddressOffset = 32; +constexpr BYTE ThunkAddressOffset = 36; //TODO: saravind :Implement Range Check for ARM64 -const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { +constexpr BYTE InterpreterThunk[InterpreterThunkEmitter::InterpreterThunkSize] = { 0xFD, 0x7B, 0xBB, 0xA9, //stp fp, lr, [sp, #-80]! ;Prologue 0xFD, 0x03, 0x00, 0x91, //mov fp, sp ;update frame pointer to the stack pointer 0xE0, 0x07, 0x01, 0xA9, //stp x0, x1, [sp, #16] ;Prologue again; save all registers @@ -168,30 +179,32 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { 0x00, 0x00, 0x00, 0x00, //movk x1, #0x00, lsl #32 ;This is overwritten with the actual thunk address(48 - 32 bits) move 0x00, 0x00, 0x00, 0x00, //movk x1, #0x00, lsl #48 ;This is overwritten with the actual thunk address(64 - 48 bits) move 0xE0, 0x43, 0x00, 0x91, //add x0, sp, #16 - 0x60, 0x00, 0x1F, 0xD6 //br x3 + 0x60, 0x00, 0x1F, 0xD6, //br x3 + 0xCC, 0xCC, 0xCC, 0xCC //int 3 for 8byte alignment }; -const BYTE InterpreterThunkEmitter::JmpOffset = 4; +constexpr BYTE JmpOffset = 4; -const BYTE InterpreterThunkEmitter::Call[] = { +constexpr BYTE Call[] = { 0x20, 0x00, 0x3f, 0xd6, // blr x1 0x00, 0x00, 0x00, 0x00 // b epilog }; -const BYTE InterpreterThunkEmitter::Epilog[] = { +constexpr BYTE Epilog[] = { 0xfd, 0x7b, 0xc5, 0xa8, // ldp fp, lr, [sp], #80 0xc0, 0x03, 0x5f, 0xd6 // ret }; -#else -const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 8; -const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 11; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 14; -const BYTE InterpreterThunkEmitter::CallBlockStartAddrOffset = 21; -const BYTE InterpreterThunkEmitter::ThunkSizeOffset = 26; -const BYTE InterpreterThunkEmitter::ErrorOffset = 33; -const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 44; - -const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { +#else // x86 + +constexpr BYTE FunctionInfoOffset = 8; +constexpr BYTE FunctionProxyOffset = 11; +constexpr BYTE DynamicThunkAddressOffset = 14; +constexpr BYTE CallBlockStartAddrOffset = 21; +constexpr BYTE ThunkSizeOffset = 26; +constexpr BYTE ErrorOffset = 33; +constexpr BYTE ThunkAddressOffset = 44; + +constexpr BYTE InterpreterThunk[InterpreterThunkEmitter::InterpreterThunkSize] = { 0x55, // push ebp ;Prolog - setup the stack frame 0x8B, 0xEC, // mov ebp,esp 0x8B, 0x45, 0x08, // mov eax, dword ptr [ebp+8] @@ -215,16 +228,16 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[INTERPRETER_THUNK_SIZE] = { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC // int 3 for 8byte alignment }; -const BYTE InterpreterThunkEmitter::Epilog[] = { +constexpr BYTE Epilog[] = { 0x5D, // pop ebp 0xC3 // ret }; #endif #if defined(_M_X64) || defined(_M_IX86) -const BYTE InterpreterThunkEmitter::JmpOffset = 3; +constexpr BYTE JmpOffset = 3; -const BYTE InterpreterThunkEmitter::Call[] = { +constexpr BYTE Call[] = { 0xFF, 0xD0, // call rax 0xE9, 0x00, 0x00, 0x00, 0x00, // jmp [offset] 0xCC, // int 3 ;for alignment to size of 8 we are adding this @@ -232,14 +245,11 @@ const BYTE InterpreterThunkEmitter::Call[] = { #endif -const BYTE InterpreterThunkEmitter::_HeaderSize = sizeof(InterpreterThunk); -const BYTE InterpreterThunkEmitter::ThunkSize = sizeof(Call); +constexpr BYTE HeaderSize = sizeof(InterpreterThunk); -const BYTE InterpreterThunkEmitter::HeaderSize() -{ +} // anonymous namespace - return _HeaderSize; -} +const BYTE InterpreterThunkEmitter::ThunkSize = sizeof(Call); InterpreterThunkEmitter::InterpreterThunkEmitter(Js::ScriptContext* context, ArenaAllocator* allocator, CustomHeap::InProcCodePageAllocators * codePageAllocators, bool isAsmInterpreterThunk) : emitBufferManager(allocator, codePageAllocators, /*scriptContext*/ nullptr, nullptr, _u("Interpreter thunk buffer"), GetCurrentProcess()), @@ -287,7 +297,7 @@ BYTE* InterpreterThunkEmitter::GetNextThunk(PVOID* ppDynamicInterpreterThunk) #if _M_ARM thunk = (BYTE*)((DWORD)thunk | 0x01); #endif - *ppDynamicInterpreterThunk = thunk + HeaderSize() + ((--thunkCount) * ThunkSize); + *ppDynamicInterpreterThunk = thunk + HeaderSize + ((--thunkCount) * ThunkSize); #if _M_ARM AssertMsg(((uintptr_t)(*ppDynamicInterpreterThunk) & 0x6) == 0, "Not 8 byte aligned?"); #else @@ -313,6 +323,10 @@ void* InterpreterThunkEmitter::ConvertToEntryPoint(PVOID dynamicInterpreterThunk bool InterpreterThunkEmitter::NewThunkBlock() { + // flush the function tables before allocating any new code + // to prevent old function table is referring to new code address + DelayDeletingFunctionTable::Clear(); + #ifdef ENABLE_OOP_NATIVE_CODEGEN if (CONFIG_FLAG(ForceStaticInterpreterThunk)) { @@ -363,7 +377,12 @@ bool InterpreterThunkEmitter::NewThunkBlock() } // Call to set VALID flag for CFG check - ThreadContext::GetContextForCurrentThread()->SetValidCallTargetForCFG(buffer); + BYTE* callTarget = buffer; +#ifdef _M_ARM + // We want to allow the actual callable value, so thumb-tag the address + callTarget = (BYTE*)((uintptr_t)buffer | 0x1); +#endif + ThreadContext::GetContextForCurrentThread()->SetValidCallTargetForCFG(callTarget); // Update object state only at the end when everything has succeeded - and no exceptions can be thrown. auto block = this->thunkBlocks.PrependNode(allocator, buffer, count); @@ -382,6 +401,10 @@ bool InterpreterThunkEmitter::NewThunkBlock() #ifdef ENABLE_OOP_NATIVE_CODEGEN bool InterpreterThunkEmitter::NewOOPJITThunkBlock() { + // flush the function tables before allocating any new code + // to prevent old function table is referring to new code address + DelayDeletingFunctionTable::Clear(); + PSCRIPTCONTEXT_HANDLE remoteScriptContext = this->scriptContext->GetRemoteScriptAddr(); if (!JITManager::GetJITManager()->IsConnected()) { @@ -401,7 +424,12 @@ bool InterpreterThunkEmitter::NewOOPJITThunkBlock() if (!CONFIG_FLAG(OOPCFGRegistration)) { - this->scriptContext->GetThreadContext()->SetValidCallTargetForCFG(buffer); + BYTE* callTarget = buffer; +#ifdef _M_ARM + // Need to register the thumb-tagged call target for CFG + callTarget = (BYTE*)((uintptr_t)callTarget | 0x1); +#endif + this->scriptContext->GetThreadContext()->SetValidCallTargetForCFG(callTarget); } // Update object state only at the end when everything has succeeded - and no exceptions can be thrown. @@ -475,10 +503,10 @@ void InterpreterThunkEmitter::FillBuffer( intptr_t finalEpilogStart = finalPdataStart - Math::Align(epilogSize, EMIT_BUFFER_ALIGNMENT); // Copy the thunk buffer and modify it. - js_memcpy_s(currentBuffer, bytesRemaining, header, HeaderSize()); - EncodeInterpreterThunk(currentBuffer, finalAddr, HeaderSize(), finalEpilogStart, epilogSize, interpreterThunk); - currentBuffer += HeaderSize(); - bytesRemaining -= HeaderSize(); + js_memcpy_s(currentBuffer, bytesRemaining, header, HeaderSize); + EncodeInterpreterThunk(currentBuffer, finalAddr, finalEpilogStart, epilogSize, interpreterThunk); + currentBuffer += HeaderSize; + bytesRemaining -= HeaderSize; // Copy call buffer DWORD callSize = sizeof(Call); @@ -540,14 +568,12 @@ void InterpreterThunkEmitter::FillBuffer( #if _M_ARM void InterpreterThunkEmitter::EncodeInterpreterThunk( - __in_bcount(thunkSize) BYTE* thunkBuffer, + __in_bcount(InterpreterThunkSize) BYTE* thunkBuffer, __in const intptr_t thunkBufferStartAddress, - __in const DWORD thunkSize, __in const intptr_t epilogStart, __in const DWORD epilogSize, __in const intptr_t interpreterThunk) { - _Analysis_assume_(thunkSize == INTERPRETER_THUNK_SIZE); // Encode MOVW DWORD lowerThunkBits = (uint32)interpreterThunk & 0x0000FFFF; DWORD movW = EncodeMove(/*Opcode*/ 0x0000F240, /*register*/1, lowerThunkBits); @@ -566,7 +592,7 @@ void InterpreterThunkEmitter::EncodeInterpreterThunk( thunkBuffer[DynamicThunkAddressOffset] = Js::FunctionBody::GetOffsetOfDynamicInterpreterThunk(); // Encode MOVW R12, CallBlockStartAddress - uintptr_t callBlockStartAddress = (uintptr_t)thunkBufferStartAddress + HeaderSize(); + uintptr_t callBlockStartAddress = (uintptr_t)thunkBufferStartAddress + HeaderSize; uint totalThunkSize = (uint)(epilogStart - callBlockStartAddress); DWORD lowerCallBlockStartAddress = callBlockStartAddress & 0x0000FFFF; @@ -588,9 +614,14 @@ void InterpreterThunkEmitter::EncodeInterpreterThunk( DWORD InterpreterThunkEmitter::EncodeMove(DWORD opCode, int reg, DWORD imm16) { DWORD encodedMove = reg << 24; +#if _M_ARM DWORD encodedImm = 0; EncoderMD::EncodeImmediate16(imm16, &encodedImm); encodedMove |= encodedImm; +#elif _M_ARM64 + // ToDo (SaAgarwa) - From Aaron change. Validate for ARM64 + encodedMove |= (imm16 & 0xFFFF) << 5; +#endif AssertMsg((encodedMove & opCode) == 0, "Any bits getting overwritten?"); encodedMove |= opCode; return encodedMove; @@ -612,45 +643,39 @@ void InterpreterThunkEmitter::GeneratePdata(_In_ const BYTE* entryPoint, _In_ co #elif _M_ARM64 void InterpreterThunkEmitter::EncodeInterpreterThunk( - __in_bcount(thunkSize) BYTE* thunkBuffer, + __in_bcount(InterpreterThunkSize) BYTE* thunkBuffer, __in const intptr_t thunkBufferStartAddress, - __in const DWORD thunkSize, __in const intptr_t epilogStart, __in const DWORD epilogSize, __in const intptr_t interpreterThunk) { int addrOffset = ThunkAddressOffset; - _Analysis_assume_(thunkSize == INTERPRETER_THUNK_SIZE); - AssertMsg(thunkSize == HeaderSize(), "Mismatch in the size of the InterpreterHeaderThunk and the thunkSize used in this API (EncodeInterpreterThunk)"); - // Following 4 MOV Instrs are to move the 64-bit address of the InterpreterThunk address into register x1. // Encode MOVZ (movz x1, #) DWORD lowerThunkBits = (uint64)interpreterThunk & 0x0000FFFF; DWORD movZ = EncodeMove(/*Opcode*/ 0xD2800000, /*register x1*/1, lowerThunkBits); // no shift; hw = 00 Emit(thunkBuffer,addrOffset, movZ); - AssertMsg(sizeof(movZ) == 4, "movZ has to be 32-bit encoded"); + static_assert(sizeof(movZ) == 4, "movZ has to be 32-bit encoded"); addrOffset+= sizeof(movZ); // Encode MOVK (movk x1, #, lsl #16) DWORD higherThunkBits = ((uint64)interpreterThunk & 0xFFFF0000) >> 16; DWORD movK = EncodeMove(/*Opcode*/ 0xF2A00000, /*register x1*/1, higherThunkBits); // left shift 16 bits; hw = 01 Emit(thunkBuffer, addrOffset, movK); - AssertMsg(sizeof(movK) == 4, "movK has to be 32-bit encoded"); + static_assert(sizeof(movK) == 4, "movK has to be 32-bit encoded"); addrOffset+= sizeof(movK); // Encode MOVK (movk x1, #, lsl #16) higherThunkBits = ((uint64)interpreterThunk & 0xFFFF00000000) >> 32; movK = EncodeMove(/*Opcode*/ 0xF2C00000, /*register x1*/1, higherThunkBits); // left shift 32 bits; hw = 02 Emit(thunkBuffer, addrOffset, movK); - AssertMsg(sizeof(movK) == 4, "movK has to be 32-bit encoded"); addrOffset += sizeof(movK); // Encode MOVK (movk x1, #, lsl #16) higherThunkBits = ((uint64)interpreterThunk & 0xFFFF000000000000) >> 48; movK = EncodeMove(/*Opcode*/ 0xF2E00000, /*register x1*/1, higherThunkBits); // left shift 48 bits; hw = 03 - AssertMsg(sizeof(movK) == 4, "movK has to be 32-bit encoded"); Emit(thunkBuffer, addrOffset, movK); // Encode LDR - Load of function Body @@ -674,9 +699,14 @@ void InterpreterThunkEmitter::EncodeInterpreterThunk( DWORD InterpreterThunkEmitter::EncodeMove(DWORD opCode, int reg, DWORD imm16) { DWORD encodedMove = reg << 0; +#if _M_ARM DWORD encodedImm = 0; EncoderMD::EncodeImmediate16(imm16, &encodedImm); encodedMove |= encodedImm; +#elif _M_ARM64 + // ToDo (SaAgarwa) - From Aaron change. Validate for ARM64 + encodedMove |= (imm16 & 0xFFFF) << 5; +#endif AssertMsg((encodedMove & opCode) == 0, "Any bits getting overwritten?"); encodedMove |= opCode; return encodedMove; @@ -697,22 +727,18 @@ void InterpreterThunkEmitter::GeneratePdata(_In_ const BYTE* entryPoint, _In_ co } #else void InterpreterThunkEmitter::EncodeInterpreterThunk( - __in_bcount(thunkSize) BYTE* thunkBuffer, + __in_bcount(InterpreterThunkSize) BYTE* thunkBuffer, __in const intptr_t thunkBufferStartAddress, - __in const DWORD thunkSize, __in const intptr_t epilogStart, __in const DWORD epilogSize, __in const intptr_t interpreterThunk) { - _Analysis_assume_(thunkSize == HeaderSize()); - - Emit(thunkBuffer, ThunkAddressOffset, (uintptr_t)interpreterThunk); thunkBuffer[DynamicThunkAddressOffset] = Js::FunctionBody::GetOffsetOfDynamicInterpreterThunk(); thunkBuffer[FunctionInfoOffset] = Js::JavascriptFunction::GetOffsetOfFunctionInfo(); thunkBuffer[FunctionProxyOffset] = Js::FunctionInfo::GetOffsetOfFunctionProxy(); - Emit(thunkBuffer, CallBlockStartAddrOffset, (uintptr_t) thunkBufferStartAddress + HeaderSize()); - uint totalThunkSize = (uint)(epilogStart - (thunkBufferStartAddress + HeaderSize())); + Emit(thunkBuffer, CallBlockStartAddrOffset, (uintptr_t) thunkBufferStartAddress + HeaderSize); + uint totalThunkSize = (uint)(epilogStart - (thunkBufferStartAddress + HeaderSize)); Emit(thunkBuffer, ThunkSizeOffset, totalThunkSize); Emit(thunkBuffer, ErrorOffset, (BYTE) FAST_FAIL_INVALID_ARG); } @@ -889,7 +915,7 @@ BYTE* ThunkBlock::AllocateFromFreeList() BVIndex ThunkBlock::FromThunkAddress(BYTE* address) { - uint index = ((uint)(address - start) - InterpreterThunkEmitter::HeaderSize()) / InterpreterThunkEmitter::ThunkSize; + uint index = ((uint)(address - start) - HeaderSize) / InterpreterThunkEmitter::ThunkSize; Assert(index < this->thunkCount); return index; } @@ -897,7 +923,7 @@ BVIndex ThunkBlock::FromThunkAddress(BYTE* address) BYTE* ThunkBlock::ToThunkAddress(BVIndex index) { Assert(index < this->thunkCount); - BYTE* address = start + InterpreterThunkEmitter::HeaderSize() + InterpreterThunkEmitter::ThunkSize * index; + BYTE* address = start + HeaderSize + InterpreterThunkEmitter::ThunkSize * index; return address; } @@ -916,4 +942,4 @@ bool ThunkBlock::IsFreeListEmpty() const return this->freeList->IsAllClear(); } -#endif +#endif // ENABLE_NATIVE_CODEGEN diff --git a/deps/chakrashim/core/lib/Backend/InterpreterThunkEmitter.h b/deps/chakrashim/core/lib/Backend/InterpreterThunkEmitter.h index 5eeb872e6fa..2420ca7a5b3 100644 --- a/deps/chakrashim/core/lib/Backend/InterpreterThunkEmitter.h +++ b/deps/chakrashim/core/lib/Backend/InterpreterThunkEmitter.h @@ -4,7 +4,7 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#ifdef ENABLE_NATIVE_CODEGEN +#if ENABLE_NATIVE_CODEGEN class ThunkBlock { private: @@ -57,6 +57,22 @@ class ThunkBlock // class InterpreterThunkEmitter { +public: + // InterpreterThunkSize must be public to be accessible to all code in InterpreterThunkEmitter.cpp. +#ifdef _M_X64 +#ifdef _WIN32 + static constexpr size_t InterpreterThunkSize = 96; +#else // Sys V AMD64 + static constexpr size_t InterpreterThunkSize = 72; +#endif +#elif defined(_M_ARM) + static constexpr size_t InterpreterThunkSize = 72; +#elif defined(_M_ARM64) + static constexpr size_t InterpreterThunkSize = 64; +#else + static constexpr size_t InterpreterThunkSize = 56; +#endif + private: /* ------- instance methods --------*/ InProcEmitBufferManager emitBufferManager; @@ -68,46 +84,7 @@ class InterpreterThunkEmitter Js::ScriptContext * scriptContext; DWORD thunkCount; // Count of thunks available in the current thunk block - /* -------static constants ----------*/ - // Interpreter thunk buffer includes function prolog, setting up of arguments, jumping to the appropriate calling point. - static const BYTE ThunkAddressOffset; - static const BYTE FunctionInfoOffset; - static const BYTE FunctionProxyOffset; - static const BYTE DynamicThunkAddressOffset; - static const BYTE CallBlockStartAddrOffset; - static const BYTE ThunkSizeOffset; - static const BYTE ErrorOffset; -#if defined(_M_ARM) - static const BYTE CallBlockStartAddressInstrOffset; - static const BYTE CallThunkSizeInstrOffset; -#endif -#ifdef _M_X64 -#ifdef _WIN32 -#define INTERPRETER_THUNK_SIZE 96 -#else // Sys V AMD64 -#define INTERPRETER_THUNK_SIZE 72 -#endif -#elif defined(_M_ARM) -#define INTERPRETER_THUNK_SIZE 72 -#elif defined(_M_ARM64) -#define INTERPRETER_THUNK_SIZE 60 -#else -#define INTERPRETER_THUNK_SIZE 56 -#endif - static const BYTE InterpreterThunk[INTERPRETER_THUNK_SIZE]; - - // Call buffer includes a call to the inner interpreter thunk and eventual jump to the epilog - static const BYTE JmpOffset; - static const BYTE Call[]; - - static const BYTE Epilog[]; - - - static const BYTE PageCount = 1; -#if defined(_M_X64) - static const BYTE PrologSize; - static const BYTE StackAllocSize; -#endif + static constexpr BYTE PageCount = 1; /* ------private helpers -----------*/ bool NewThunkBlock(); @@ -117,9 +94,8 @@ class InterpreterThunkEmitter #endif static void EncodeInterpreterThunk( - __in_bcount(thunkSize) BYTE* thunkBuffer, + __in_bcount(InterpreterThunkSize) BYTE* thunkBuffer, __in const intptr_t thunkBufferStartAddress, - __in const DWORD thunkSize, __in const intptr_t epilogStart, __in const DWORD epilogSize, __in const intptr_t interpreterThunk); @@ -139,11 +115,9 @@ class InterpreterThunkEmitter }; BYTE* AllocateFromFreeList(PVOID* ppDynamicInterpreterThunk); - static const BYTE _HeaderSize; public: - static const BYTE HeaderSize(); static const BYTE ThunkSize; - static const uint BlockSize= AutoSystemInfo::PageSize * PageCount; + static constexpr uint BlockSize = AutoSystemInfo::PageSize * PageCount; static void* ConvertToEntryPoint(PVOID dynamicInterpreterThunk); InterpreterThunkEmitter(Js::ScriptContext * context, ArenaAllocator* allocator, CustomHeap::InProcCodePageAllocators * codePageAllocators, bool isAsmInterpreterThunk = false); diff --git a/deps/chakrashim/core/lib/Backend/JITOutput.cpp b/deps/chakrashim/core/lib/Backend/JITOutput.cpp index b1b7c414874..9517d39902a 100644 --- a/deps/chakrashim/core/lib/Backend/JITOutput.cpp +++ b/deps/chakrashim/core/lib/Backend/JITOutput.cpp @@ -198,7 +198,7 @@ void JITOutput::RecordNativeCode(const BYTE* sourceBuffer, BYTE* localCodeAddress, TEmitBufferAllocation allocation, TCodeGenAllocators codeGenAllocators) { Assert(m_outputData->codeAddress == (intptr_t)allocation->allocation->address); - if (!codeGenAllocators->emitBufferManager.CommitBuffer(allocation, localCodeAddress, m_outputData->codeSize, sourceBuffer)) + if (!codeGenAllocators->emitBufferManager.CommitBuffer(allocation, allocation->bytesCommitted, localCodeAddress, m_outputData->codeSize, sourceBuffer)) { Js::Throw::OutOfMemory(); } @@ -218,7 +218,7 @@ JITOutput::RecordInlineeFrameOffsetsInfo(unsigned int offsetsArrayOffset, unsign m_outputData->inlineeFrameOffsetArrayCount = offsetsArrayCount; } -#if _M_X64 +#if TARGET_64 void JITOutput::RecordUnwindInfo(BYTE *unwindInfo, size_t size, BYTE * xdataAddr, BYTE* localXdataAddr) { @@ -229,12 +229,12 @@ JITOutput::RecordUnwindInfo(BYTE *unwindInfo, size_t size, BYTE * xdataAddr, BYT #elif _M_ARM size_t -JITOutput::RecordUnwindInfo(size_t offset, BYTE *unwindInfo, size_t size, BYTE * xdataAddr) +JITOutput::RecordUnwindInfo(size_t offset, const BYTE *unwindInfo, size_t size, BYTE * xdataAddr) { BYTE *xdataFinal = xdataAddr + offset; Assert(xdataFinal); - Assert(((DWORD)xdataFinal & 0x3) == 0); // 4 byte aligned + Assert(((ULONG_PTR)xdataFinal & 0x3) == 0); // 4 byte aligned memcpy_s(xdataFinal, size, unwindInfo, size); return (size_t)xdataFinal; @@ -255,13 +255,12 @@ JITOutput::FinalizeNativeCode() if (JITManager::GetJITManager()->IsJITServer()) { m_func->GetOOPCodeGenAllocators()->emitBufferManager.CompletePreviousAllocation(m_oopAlloc); -#if defined(_CONTROL_FLOW_GUARD) -#if _M_IX86 || _M_X64 + +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) if (!m_func->IsLoopBody() && CONFIG_FLAG(UseJITTrampoline)) { allocation->thunkAddress = m_func->GetOOPThreadContext()->GetJITThunkEmitter()->CreateThunk(m_outputData->codeAddress); } -#endif #endif } else @@ -275,19 +274,21 @@ JITOutput::FinalizeNativeCode() m_func->GetInProcJITEntryPointInfo()->SetNumberChunks(numberChunks); #endif -#if defined(_CONTROL_FLOW_GUARD) -#if _M_IX86 || _M_X64 +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) if (!m_func->IsLoopBody() && CONFIG_FLAG(UseJITTrampoline)) { allocation->thunkAddress = m_func->GetInProcThreadContext()->GetJITThunkEmitter()->CreateThunk(m_outputData->codeAddress); } -#endif #endif } m_outputData->thunkAddress = allocation->thunkAddress; if (!allocation->thunkAddress && CONFIG_FLAG(OOPCFGRegistration)) { - m_func->GetThreadContextInfo()->SetValidCallTargetForCFG((PVOID)m_outputData->codeAddress); + PVOID callTarget = (PVOID)m_outputData->codeAddress; +#ifdef _M_ARM + callTarget = (PVOID)((uintptr_t)callTarget | 0x1); +#endif + m_func->GetThreadContextInfo()->SetValidCallTargetForCFG(callTarget); } } diff --git a/deps/chakrashim/core/lib/Backend/JITOutput.h b/deps/chakrashim/core/lib/Backend/JITOutput.h index d61804d144c..85e9b3c1fa2 100644 --- a/deps/chakrashim/core/lib/Backend/JITOutput.h +++ b/deps/chakrashim/core/lib/Backend/JITOutput.h @@ -42,10 +42,10 @@ class JITOutput void RecordNativeCode(const BYTE* sourceBuffer, BYTE* localCodeAddress); void RecordInlineeFrameOffsetsInfo(unsigned int offsetsArrayOffset, unsigned int offsetsArrayCount); -#if _M_X64 +#if TARGET_64 void RecordUnwindInfo(BYTE *unwindInfo, size_t size, BYTE * xdataAddr, BYTE* localXdataAddr); #elif _M_ARM - size_t RecordUnwindInfo(size_t offset, BYTE *unwindInfo, size_t size, BYTE * xdataAddr); + size_t RecordUnwindInfo(size_t offset, const BYTE *unwindInfo, size_t size, BYTE * xdataAddr); #endif void FinalizeNativeCode(); diff --git a/deps/chakrashim/core/lib/Backend/JITRecyclableObject.h b/deps/chakrashim/core/lib/Backend/JITRecyclableObject.h index 0d450383023..6b1c9a82fd4 100644 --- a/deps/chakrashim/core/lib/Backend/JITRecyclableObject.h +++ b/deps/chakrashim/core/lib/Backend/JITRecyclableObject.h @@ -54,6 +54,15 @@ class JITJavascriptString : JITRecyclableObject } static JITJavascriptString * FromVar(Js::Var var) + { + Assert(offsetof(JITJavascriptString, m_pszValue) == Js::JavascriptString::GetOffsetOfpszValue()); + Assert(offsetof(JITJavascriptString, m_charLength) == Js::JavascriptString::GetOffsetOfcharLength()); + AssertOrFailFast(Is(var)); + + return reinterpret_cast(var); + } + + static JITJavascriptString * UnsafeFromVar(Js::Var var) { Assert(offsetof(JITJavascriptString, m_pszValue) == Js::JavascriptString::GetOffsetOfpszValue()); Assert(offsetof(JITJavascriptString, m_charLength) == Js::JavascriptString::GetOffsetOfcharLength()); diff --git a/deps/chakrashim/core/lib/Backend/JITThunkEmitter.cpp b/deps/chakrashim/core/lib/Backend/JITThunkEmitter.cpp index bdb1a5c8c71..6ba6542fc0f 100644 --- a/deps/chakrashim/core/lib/Backend/JITThunkEmitter.cpp +++ b/deps/chakrashim/core/lib/Backend/JITThunkEmitter.cpp @@ -5,7 +5,7 @@ #include "Backend.h" -#if defined(ENABLE_NATIVE_CODEGEN) && defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(ENABLE_NATIVE_CODEGEN) && defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) template class JITThunkEmitter; @@ -13,6 +13,7 @@ template class JITThunkEmitter; template class JITThunkEmitter; #endif +#if _M_IX86 || _M_X64 template const BYTE JITThunkEmitter::DirectJmp[] = { 0xE9, 0x00, 0x00, 0x00, 0x00, // JMP .32 @@ -20,6 +21,7 @@ const BYTE JITThunkEmitter::DirectJmp[] = { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }; +#endif #if _M_X64 template @@ -30,6 +32,21 @@ const BYTE JITThunkEmitter::IndirectJmp[] = { }; #endif +#if _M_ARM64 +template +const DWORD JITThunkEmitter::DirectB[] = { + 0x14000000 // B .26 +}; + +template +const DWORD JITThunkEmitter::IndirectBR[] = { + 0xd2800000 | IndirectBRTempReg, // MOVZ x17, + 0xf2a00000 | IndirectBRTempReg, // MOVK x17, , LSL #16 + 0xf2c00000 | IndirectBRTempReg, // MOVK x17, , LSL #32 + 0xd61f0000 | (IndirectBRTempReg<<5) // BR x17 +}; +#endif + template JITThunkEmitter::JITThunkEmitter(ThreadContextInfo * threadContext, TAlloc * codeAllocator, HANDLE processHandle) : processHandle(processHandle), @@ -77,7 +94,7 @@ JITThunkEmitter::CreateThunk(uintptr_t entryPoint) if (IsThunkPageEmpty(pageStartAddress)) { - if (this->codeAllocator->AllocPages((PVOID)pageStartAddress, 1, MEM_COMMIT, PAGE_EXECUTE, true) == nullptr) + if (this->codeAllocator->AllocPages((PVOID)pageStartAddress, 1, MEM_COMMIT, PAGE_EXECUTE_READ, true) == nullptr) { this->codeAllocator->FreeLocal(localPageAddress); return NULL; @@ -165,7 +182,7 @@ JITThunkEmitter::EnsureInitialized() // check again because we did the first one outside of lock if (this->baseAddress == NULL) { - this->baseAddress = (uintptr_t)this->codeAllocator->AllocPages(nullptr, PageCount, MEM_RESERVE, PAGE_EXECUTE, true); + this->baseAddress = (uintptr_t)this->codeAllocator->AllocPages(nullptr, PageCount, MEM_RESERVE, PAGE_EXECUTE_READ, true); } } return this->baseAddress; @@ -194,6 +211,7 @@ void JITThunkEmitter::EncodeJmp(char * localPageAddress, uintptr_t thunkAddress, uintptr_t targetAddress) { char * localAddress = localPageAddress + thunkAddress % AutoSystemInfo::PageSize; +#if _M_IX86 || _M_X64 ptrdiff_t relativeAddress = targetAddress - thunkAddress - DirectJmpIPAdjustment; #if _M_X64 if (relativeAddress > INT_MAX || relativeAddress < INT_MIN) @@ -209,6 +227,22 @@ JITThunkEmitter::EncodeJmp(char * localPageAddress, uintptr_t thunkAddre uintptr_t * jmpTarget = (uintptr_t*)(localAddress + DirectJmpTargetOffset); *jmpTarget = relativeAddress; } +#elif _M_ARM64 + ptrdiff_t relativeAddress = (targetAddress - thunkAddress) / 4; + if (relativeAddress >= (1 << 25) || relativeAddress < -(1 << 25)) + { + Assert(targetAddress == (targetAddress & 0xffffffffffffull)); + memcpy_s(localAddress, ThunkSize, IndirectBR, ThunkSize); + ((DWORD *)localAddress)[IndirectBRLo16Offset] |= ((targetAddress >> 0) & 0xffff) << 5; + ((DWORD *)localAddress)[IndirectBRMid16Offset] |= ((targetAddress >> 16) & 0xffff) << 5; + ((DWORD *)localAddress)[IndirectBRHi16Offset] |= ((targetAddress >> 32) & 0xffff) << 5; + } + else + { + memcpy_s(localAddress, ThunkSize, DirectB, ThunkSize); + ((DWORD *)localAddress)[0] |= relativeAddress & 0x3ffffff; + } +#endif } template inline @@ -230,7 +264,7 @@ JITThunkEmitter::ProtectPage(void * address) AutoEnableDynamicCodeGen enableCodeGen(true); #endif DWORD oldProtect; - BOOL result = VirtualProtectEx(this->processHandle, address, ThunkSize, PAGE_EXECUTE, &oldProtect); + BOOL result = VirtualProtectEx(this->processHandle, address, ThunkSize, PAGE_EXECUTE_READ, &oldProtect); AssertOrFailFast(result && oldProtect == PAGE_EXECUTE_READWRITE); } @@ -243,7 +277,7 @@ JITThunkEmitter::UnprotectPage(void * address) #endif DWORD oldProtect; BOOL result = VirtualProtectEx(this->processHandle, address, ThunkSize, PAGE_EXECUTE_READWRITE, &oldProtect); - AssertOrFailFast(result && oldProtect == PAGE_EXECUTE); + AssertOrFailFast(result && oldProtect == PAGE_EXECUTE_READ); } #if ENABLE_OOP_NATIVE_CODEGEN diff --git a/deps/chakrashim/core/lib/Backend/JITThunkEmitter.h b/deps/chakrashim/core/lib/Backend/JITThunkEmitter.h index be4248d21c7..9b42ac8e6dd 100644 --- a/deps/chakrashim/core/lib/Backend/JITThunkEmitter.h +++ b/deps/chakrashim/core/lib/Backend/JITThunkEmitter.h @@ -4,17 +4,27 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#if defined(ENABLE_NATIVE_CODEGEN) && defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(ENABLE_NATIVE_CODEGEN) && defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) template class JITThunkEmitter { private: +#if _M_IX86 || _M_AMD64 static const BYTE DirectJmp[]; static const uint DirectJmpTargetOffset = 1; static const uint DirectJmpIPAdjustment = 5; +#endif #if _M_AMD64 static const BYTE IndirectJmp[]; static const uint IndirectJmpTargetOffset = 2; +#endif +#if _M_ARM64 + static const DWORD DirectB[]; + static const DWORD IndirectBR[]; + static const uint IndirectBRTempReg = 17; + static const uint IndirectBRLo16Offset = 0; + static const uint IndirectBRMid16Offset = 1; + static const uint IndirectBRHi16Offset = 2; #endif static const uint PageCount = 100; static const size_t ThunkSize = 16; diff --git a/deps/chakrashim/core/lib/Backend/JITTimeFunctionBody.cpp b/deps/chakrashim/core/lib/Backend/JITTimeFunctionBody.cpp index 9e5989e8d42..2763d7fe440 100644 --- a/deps/chakrashim/core/lib/Backend/JITTimeFunctionBody.cpp +++ b/deps/chakrashim/core/lib/Backend/JITTimeFunctionBody.cpp @@ -21,17 +21,18 @@ JITTimeFunctionBody::InitializeJITFunctionData( Assert(functionBody != nullptr); // const table - jitBody->constCount = functionBody->GetConstantCount(); - if (functionBody->GetConstantCount() > 0) + const Js::RegSlot numConstants = functionBody->GetConstantCount(); + jitBody->constCount = numConstants; + if (numConstants > 0) { jitBody->constTable = (intptr_t *)PointerValue(functionBody->GetConstTable()); if (!functionBody->GetIsAsmJsFunction()) { jitBody->constTableContent = AnewStructZ(arena, ConstTableContentIDL); - jitBody->constTableContent->count = functionBody->GetConstantCount(); - jitBody->constTableContent->content = AnewArrayZ(arena, RecyclableObjectIDL*, functionBody->GetConstantCount()); + jitBody->constTableContent->count = numConstants; + jitBody->constTableContent->content = AnewArrayZ(arena, RecyclableObjectIDL*, numConstants); - for (Js::RegSlot reg = Js::FunctionBody::FirstRegSlot; reg < functionBody->GetConstantCount(); ++reg) + for (Js::RegSlot reg = Js::FunctionBody::FirstRegSlot; reg < numConstants; ++reg) { Js::Var varConst = functionBody->GetConstantVar(reg); Assert(varConst != nullptr); @@ -957,17 +958,6 @@ JITTimeFunctionBody::GetConstTable() const return m_bodyData.constTable; } -bool -JITTimeFunctionBody::IsConstRegPropertyString(Js::RegSlot reg, ScriptContextInfo * context) const -{ - RecyclableObjectIDL * content = m_bodyData.constTableContent->content[reg - Js::FunctionBody::FirstRegSlot]; - if (content != nullptr && content->vtbl == context->GetVTableAddress(VtablePropertyString)) - { - return true; - } - return false; -} - intptr_t JITTimeFunctionBody::GetRootObject() const { diff --git a/deps/chakrashim/core/lib/Backend/JITTimeFunctionBody.h b/deps/chakrashim/core/lib/Backend/JITTimeFunctionBody.h index 2e57f87be50..958ebed608f 100644 --- a/deps/chakrashim/core/lib/Backend/JITTimeFunctionBody.h +++ b/deps/chakrashim/core/lib/Backend/JITTimeFunctionBody.h @@ -153,7 +153,6 @@ class JITTimeFunctionBody intptr_t GetIsInstInlineCache(uint index) const; Js::TypeId GetConstantType(Js::RegSlot location) const; void * GetConstTable() const; - bool IsConstRegPropertyString(Js::RegSlot reg, ScriptContextInfo * context) const; intptr_t GetRootObject() const; intptr_t GetLoopHeaderAddr(uint loopNum) const; diff --git a/deps/chakrashim/core/lib/Backend/JITTimePolymorphicInlineCacheInfo.cpp b/deps/chakrashim/core/lib/Backend/JITTimePolymorphicInlineCacheInfo.cpp index e50edc2f099..7939df0b750 100644 --- a/deps/chakrashim/core/lib/Backend/JITTimePolymorphicInlineCacheInfo.cpp +++ b/deps/chakrashim/core/lib/Backend/JITTimePolymorphicInlineCacheInfo.cpp @@ -30,17 +30,18 @@ JITTimePolymorphicInlineCacheInfo::InitializeEntryPointPolymorphicInlineCacheInf if (!inlineeList->Empty()) { - inlineeInfoIDL = RecyclerNewArray(recycler, PolymorphicInlineCacheInfoIDL, inlineeList->Count()); + const uint inlineeCount = inlineeList->Count(); + inlineeInfoIDL = RecyclerNewArray(recycler, PolymorphicInlineCacheInfoIDL, inlineeCount); SListCounted::Iterator iter(inlineeList); uint i = 0; while (iter.Next()) { Js::PolymorphicInlineCacheInfo * inlineeInfo = iter.Data(); - __analysis_assume(i < inlineeList->Count()); + __analysis_assume(i < inlineeCount); JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(recycler, inlineeInfo, &inlineeInfoIDL[i]); ++i; } - Assert(i == inlineeList->Count()); + Assert(i == inlineeCount); } jitInfo->inlineeInfoCount = inlineeList->Count(); jitInfo->selfInfo = selfInfoIDL; diff --git a/deps/chakrashim/core/lib/Backend/JITTimeWorkItem.cpp b/deps/chakrashim/core/lib/Backend/JITTimeWorkItem.cpp index 590c6e7c060..040d92a0366 100644 --- a/deps/chakrashim/core/lib/Backend/JITTimeWorkItem.cpp +++ b/deps/chakrashim/core/lib/Backend/JITTimeWorkItem.cpp @@ -114,7 +114,10 @@ JITTimeWorkItem::InitializeReader( #endif bool hasSpanSequenceMap = m_jitBody.InitializeStatementMap(&m_statementMap, alloc); Js::SmallSpanSequence * spanSeq = hasSpanSequenceMap ? &m_statementMap : nullptr; - statementReader->Create(m_jitBody.GetByteCodeBuffer(), startOffset, spanSeq, m_fullStatementList); + if (statementReader) + { + statementReader->Create(m_jitBody.GetByteCodeBuffer(), startOffset, spanSeq, m_fullStatementList); + } } JITTimeFunctionBody * diff --git a/deps/chakrashim/core/lib/Backend/JITType.cpp b/deps/chakrashim/core/lib/Backend/JITType.cpp index bb269811f09..a207dc5ffcf 100644 --- a/deps/chakrashim/core/lib/Backend/JITType.cpp +++ b/deps/chakrashim/core/lib/Backend/JITType.cpp @@ -27,7 +27,7 @@ JITType::BuildFromJsType(__in Js::Type * jsType, __out JITType * jitType) data->protoAddr = jsType->GetPrototype(); data->entrypointAddr = (intptr_t)jsType->GetEntryPoint(); data->propertyCacheAddr = jsType->GetPropertyCache(); - if (Js::DynamicType::Is(jsType->GetTypeId())) + if (Js::DynamicType::Is(jsType)) { Js::DynamicType * dynamicType = static_cast(jsType); diff --git a/deps/chakrashim/core/lib/Backend/JavascriptNativeOperators.cpp b/deps/chakrashim/core/lib/Backend/JavascriptNativeOperators.cpp new file mode 100644 index 00000000000..1acc8476126 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/JavascriptNativeOperators.cpp @@ -0,0 +1,382 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "Backend.h" + +namespace Js +{ +#if ENABLE_NATIVE_CODEGEN + void * JavascriptNativeOperators::Op_SwitchStringLookUp(JavascriptString* str, Js::BranchDictionaryWrapper* branchTargets, uintptr_t funcStart, uintptr_t funcEnd) + { + void* defaultTarget = branchTargets->defaultTarget; + Js::BranchDictionaryWrapper::BranchDictionary& stringDictionary = branchTargets->dictionary; + void* target = stringDictionary.Lookup(str, defaultTarget); + uintptr_t utarget = (uintptr_t)target; + + if ((utarget - funcStart) > (funcEnd - funcStart)) + { + AssertMsg(false, "Switch string dictionary jump target outside of function"); + Throw::FatalInternalError(); + } + return target; + } + +#if ENABLE_DEBUG_CONFIG_OPTIONS + void JavascriptNativeOperators::TracePropertyEquivalenceCheck(const JitEquivalentTypeGuard* guard, const Type* type, const Type* refType, bool isEquivalent, uint failedPropertyIndex) + { + if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) + { + uint propertyCount = guard->GetCache()->record.propertyCount; + + Output::Print(_u("EquivObjTypeSpec: checking %u properties on operation %u, (type = 0x%p, ref type = 0x%p):\n"), + propertyCount, guard->GetObjTypeSpecFldId(), type, refType); + + const Js::TypeEquivalenceRecord& record = guard->GetCache()->record; + ScriptContext* scriptContext = type->GetScriptContext(); + if (isEquivalent) + { + if (Js::Configuration::Global.flags.Verbose) + { + Output::Print(_u(" , ")); + for (uint pi = 0; pi < propertyCount; pi++) + { + const EquivalentPropertyEntry* refInfo = &record.properties[pi]; + const PropertyRecord* propertyRecord = scriptContext->GetPropertyName(refInfo->propertyId); + Output::Print(_u("%s(#%d)@%ua%dw%d, "), propertyRecord->GetBuffer(), propertyRecord->GetPropertyId(), refInfo->slotIndex, refInfo->isAuxSlot, refInfo->mustBeWritable); + } + Output::Print(_u("\n")); + } + } + else + { + const EquivalentPropertyEntry* refInfo = &record.properties[failedPropertyIndex]; + Js::PropertyEquivalenceInfo info(Constants::NoSlot, false, false); + const PropertyRecord* propertyRecord = scriptContext->GetPropertyName(refInfo->propertyId); + if (DynamicType::Is(type)) + { + Js::DynamicTypeHandler* typeHandler = (static_cast(type))->GetTypeHandler(); + typeHandler->GetPropertyEquivalenceInfo(propertyRecord, info); + } + + Output::Print(_u("EquivObjTypeSpec: check failed for %s (#%d) on operation %u:\n"), + propertyRecord->GetBuffer(), propertyRecord->GetPropertyId(), guard->GetObjTypeSpecFldId()); + Output::Print(_u(" type = 0x%p, ref type = 0x%p, slot = 0x%u (%d), ref slot = 0x%u (%d), is writable = %d, required writable = %d\n"), + type, refType, info.slotIndex, refInfo->slotIndex, info.isAuxSlot, refInfo->isAuxSlot, info.isWritable, refInfo->mustBeWritable); + } + + Output::Flush(); + } + } +#endif + + bool JavascriptNativeOperators::IsStaticTypeObjTypeSpecEquivalent(const TypeEquivalenceRecord& equivalenceRecord, uint& failedIndex) + { + uint propertyCount = equivalenceRecord.propertyCount; + Js::EquivalentPropertyEntry* properties = equivalenceRecord.properties; + for (uint pi = 0; pi < propertyCount; pi++) + { + const EquivalentPropertyEntry* refInfo = &properties[pi]; + if (!IsStaticTypeObjTypeSpecEquivalent(refInfo)) + { + failedIndex = pi; + return false; + } + } + return true; + } + + bool JavascriptNativeOperators::IsStaticTypeObjTypeSpecEquivalent(const EquivalentPropertyEntry *entry) + { + // Objects of static types have no local properties, but they may load fields from their prototypes. + return entry->slotIndex == Constants::NoSlot && !entry->mustBeWritable; + } + + bool JavascriptNativeOperators::CheckIfTypeIsEquivalentForFixedField(Type* type, JitEquivalentTypeGuard* guard) + { + if (guard->GetValue() == PropertyGuard::GuardValue::Invalidated_DuringSweep) + { + return false; + } + return CheckIfTypeIsEquivalent(type, guard); + } + + bool JavascriptNativeOperators::CheckIfTypeIsEquivalent(Type* type, JitEquivalentTypeGuard* guard) + { + if (guard->GetValue() == PropertyGuard::GuardValue::Invalidated) + { + return false; + } + + AssertMsg(type && type->GetScriptContext(), "type and it's ScriptContext should be valid."); + + if (!guard->IsInvalidatedDuringSweep() && ((Js::Type*)guard->GetTypeAddr())->GetScriptContext() != type->GetScriptContext()) + { + // For valid guard value, can't cache cross-context objects + return false; + } + + // CONSIDER : Add stats on how often the cache hits, and simply force bailout if + // the efficacy is too low. + + EquivalentTypeCache* cache = guard->GetCache(); + // CONSIDER : Consider emitting o.type == equivTypes[hash(o.type)] in machine code before calling + // this helper, particularly if we want to handle polymorphism with frequently changing types. + Assert(EQUIVALENT_TYPE_CACHE_SIZE == 8); + Type** equivTypes = cache->types; + + Type* refType = equivTypes[0]; + if (refType == nullptr || refType->GetScriptContext() != type->GetScriptContext()) + { + // We could have guard that was invalidated while sweeping and now we have type coming from + // different scriptContext. Make sure that it matches the scriptContext in cachedTypes. + // If not, return false because as mentioned above, we don't cache cross-context objects. +#if DBG + if (refType == nullptr) + { + for (int i = 1; i < EQUIVALENT_TYPE_CACHE_SIZE; i++) + { + AssertMsg(equivTypes[i] == nullptr, "In equiv typed caches, if first element is nullptr, all others should be nullptr"); + } + } +#endif + return false; + } + + int emptySlotIndex = -1; + for (int i = 0; i < EQUIVALENT_TYPE_CACHE_SIZE; i++) + { + if (equivTypes[i] == type) + { +#if DBG + if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) + { + if (guard->WasReincarnated()) + { + Output::Print(_u("EquivObjTypeSpec: Guard 0x%p was reincarnated and working now \n"), guard); + Output::Flush(); + } + } +#endif + guard->SetTypeAddr((intptr_t)type); + return true; + } + + if (equivTypes[i] == nullptr) + { + emptySlotIndex = i; + break; + } + } + + // If we didn't find the type in the cache, let's check if it's equivalent the slow way, by comparing + // each of its relevant property slots to its equivalent in one of the cached types. + // We are making a few assumption that simplify the process: + // 1. If two types have the same prototype, any properties loaded from a prototype must come from the same slot. + // If any of the prototypes in the chain was altered such that this is no longer true, the corresponding + // property guard would have been invalidated and we would bail out at the guard check (either on this + // type check or downstream, but before the property load is attempted). + // 2. For polymorphic field loads fixed fields are only supported on prototypes. Hence, if two types have the + // same prototype, any of the equivalent fixed properties will match. If any has been overwritten, the + // corresponding guard would have been invalidated and we would bail out (as above). + + if (cache->IsLoadedFromProto() && type->GetPrototype() != refType->GetPrototype()) + { + if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) + { + Output::Print(_u("EquivObjTypeSpec: failed check on operation %u (type = 0x%x, ref type = 0x%x, proto = 0x%x, ref proto = 0x%x) \n"), + guard->GetObjTypeSpecFldId(), type, refType, type->GetPrototype(), refType->GetPrototype()); + Output::Flush(); + } + + return false; + } + +#pragma prefast(suppress:6011) // If type is nullptr, we would AV at the beginning of this method + if (type->GetTypeId() != refType->GetTypeId()) + { + if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) + { + Output::Print(_u("EquivObjTypeSpec: failed check on operation %u (type = 0x%x, ref type = 0x%x, proto = 0x%x, ref proto = 0x%x) \n"), + guard->GetObjTypeSpecFldId(), type, refType, type->GetPrototype(), refType->GetPrototype()); + Output::Flush(); + } + + return false; + } + + // Review : This is quite slow. We could make it somewhat faster, by keeping slot indexes instead + // of property IDs, but that would mean we would need to look up property IDs from slot indexes when installing + // property guards, or maintain a whole separate list of equivalent slot indexes. + Assert(cache->record.propertyCount > 0); + + // Before checking for equivalence, track existing cached non-shared types + DynamicType * dynamicType = (type && DynamicType::Is(type)) ? static_cast(type) : nullptr; + bool isEquivTypesCacheFull = emptySlotIndex == -1; + int nonSharedTypeSlotIndex = -1; + if (isEquivTypesCacheFull && dynamicType != nullptr) + { + for (int i = 0; i < EQUIVALENT_TYPE_CACHE_SIZE; i++) + { + // Track presence of cached non-shared type if cache is full + if (DynamicType::Is(equivTypes[i]) && + !(static_cast(equivTypes[i]))->GetIsShared()) + { + nonSharedTypeSlotIndex = i; + break; + } + } + + // If cache is full, then this is definitely a sharedType, so evict non-shared type. + // Else evict next empty slot (only applicable for DynamicTypes) + emptySlotIndex = nonSharedTypeSlotIndex; + } + + // If we get non-shared type while cache is full and we don't have any non-shared type to evict + // consider this type as non-equivalent + if (dynamicType != nullptr && + isEquivTypesCacheFull && + !dynamicType->GetIsShared() && + nonSharedTypeSlotIndex == -1) + { + return false; + } + + // CONSIDER (EquivObjTypeSpec): Impose a limit on the number of properties guarded by an equivalent type check. + // The trick is where in the glob opt to make the cut off. Perhaps in the forward pass we could track the number of + // field operations protected by a type check (keep a counter on the type's value info), and if that counter exceeds + // some threshold, simply stop optimizing any further instructions. + + bool isEquivalent; + uint failedPropertyIndex; + if (dynamicType != nullptr) + { + Js::DynamicTypeHandler* typeHandler = dynamicType->GetTypeHandler(); + isEquivalent = typeHandler->IsObjTypeSpecEquivalent(type, cache->record, failedPropertyIndex); + } + else + { + Assert(StaticType::Is(type->GetTypeId())); + isEquivalent = IsStaticTypeObjTypeSpecEquivalent(cache->record, failedPropertyIndex); + } + +#if ENABLE_DEBUG_CONFIG_OPTIONS + TracePropertyEquivalenceCheck(guard, type, refType, isEquivalent, failedPropertyIndex); +#endif + + if (!isEquivalent) + { + return false; + } + + AssertMsg(!isEquivTypesCacheFull || !dynamicType || dynamicType->GetIsShared() || nonSharedTypeSlotIndex > -1, "If equiv cache is full, then this should be sharedType or we will evict non-shared type."); + + // We have some empty slots, let us use those first + if (emptySlotIndex != -1) + { + if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) + { + Output::Print(_u("EquivObjTypeSpec: Saving type in unused slot of equiv types cache. \n")); + Output::Flush(); + } + equivTypes[emptySlotIndex] = type; + } + else + { + // CONSIDER (EquivObjTypeSpec): Invent some form of least recently used eviction scheme. + uintptr_t index = (reinterpret_cast(type) >> 4) & (EQUIVALENT_TYPE_CACHE_SIZE - 1); + + if (cache->nextEvictionVictim == EQUIVALENT_TYPE_CACHE_SIZE) + { + __analysis_assume(index < EQUIVALENT_TYPE_CACHE_SIZE); + // If nextEvictionVictim was never set, set it to next element after index + cache->nextEvictionVictim = (index + 1) & (EQUIVALENT_TYPE_CACHE_SIZE - 1); + } + else + { + Assert(cache->nextEvictionVictim < EQUIVALENT_TYPE_CACHE_SIZE); + __analysis_assume(cache->nextEvictionVictim < EQUIVALENT_TYPE_CACHE_SIZE); + equivTypes[cache->nextEvictionVictim] = equivTypes[index]; + // Else, set it to next element after current nextEvictionVictim index + cache->nextEvictionVictim = (cache->nextEvictionVictim + 1) & (EQUIVALENT_TYPE_CACHE_SIZE - 1); + } + + if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) + { + Output::Print(_u("EquivObjTypeSpec: Saving type in used slot of equiv types cache at index = %d. NextEvictionVictim = %d. \n"), index, cache->nextEvictionVictim); + Output::Flush(); + } + Assert(index < EQUIVALENT_TYPE_CACHE_SIZE); + __analysis_assume(index < EQUIVALENT_TYPE_CACHE_SIZE); + equivTypes[index] = type; + } + + // Fixed field checks allow us to assume a specific type ID, but the assumption is only + // valid if we lock the type. Otherwise, the type ID may change out from under us without + // evolving the type. + // We also need to lock the type in case of, for instance, adding a property to a dictionary type handler. + if (dynamicType != nullptr) + { + if (!dynamicType->GetIsLocked()) + { + // We only need to lock the type to prevent against the type evolving after it has been cached. If the type becomes shared + // in the future, any further changes to the type will result in creating a new type handler. + dynamicType->LockTypeOnly(); + } + } + + type->SetHasBeenCached(); + guard->SetTypeAddr((intptr_t)type); + return true; + } +#endif + + Var JavascriptNativeOperators::OP_GetElementI_JIT_ExpectingNativeFloatArray(Var instance, Var index, ScriptContext *scriptContext) + { + Assert(Js::JavascriptStackWalker::ValidateTopJitFrame(scriptContext)); + + JavascriptOperators::UpdateNativeArrayProfileInfoToCreateVarArray(instance, true, false); + return JavascriptOperators::OP_GetElementI_JIT(instance, index, scriptContext); + } + + Var JavascriptNativeOperators::OP_GetElementI_JIT_ExpectingVarArray(Var instance, Var index, ScriptContext *scriptContext) + { + Assert(Js::JavascriptStackWalker::ValidateTopJitFrame(scriptContext)); + + JavascriptOperators::UpdateNativeArrayProfileInfoToCreateVarArray(instance, false, true); + return JavascriptOperators::OP_GetElementI_JIT(instance, index, scriptContext); + } + + Var JavascriptNativeOperators::OP_GetElementI_UInt32_ExpectingNativeFloatArray(Var instance, uint32 index, ScriptContext* scriptContext) + { +#if ENABLE_PROFILE_INFO + JavascriptOperators::UpdateNativeArrayProfileInfoToCreateVarArray(instance, true, false); +#endif + return JavascriptOperators::OP_GetElementI_UInt32(instance, index, scriptContext); + } + + Var JavascriptNativeOperators::OP_GetElementI_UInt32_ExpectingVarArray(Var instance, uint32 index, ScriptContext* scriptContext) + { +#if ENABLE_PROFILE_INFO + JavascriptOperators::UpdateNativeArrayProfileInfoToCreateVarArray(instance, false, true); +#endif + return JavascriptOperators::OP_GetElementI_UInt32(instance, index, scriptContext); + } + + Var JavascriptNativeOperators::OP_GetElementI_Int32_ExpectingNativeFloatArray(Var instance, int32 index, ScriptContext* scriptContext) + { +#if ENABLE_PROFILE_INFO + JavascriptOperators::UpdateNativeArrayProfileInfoToCreateVarArray(instance, true, false); +#endif + return JavascriptOperators::OP_GetElementI_Int32(instance, index, scriptContext); + } + + Var JavascriptNativeOperators::OP_GetElementI_Int32_ExpectingVarArray(Var instance, int32 index, ScriptContext* scriptContext) + { +#if ENABLE_PROFILE_INFO + JavascriptOperators::UpdateNativeArrayProfileInfoToCreateVarArray(instance, false, true); +#endif + return JavascriptOperators::OP_GetElementI_Int32(instance, index, scriptContext); + } + +}; diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptNativeOperators.h b/deps/chakrashim/core/lib/Backend/JavascriptNativeOperators.h similarity index 78% rename from deps/chakrashim/core/lib/Runtime/Language/JavascriptNativeOperators.h rename to deps/chakrashim/core/lib/Backend/JavascriptNativeOperators.h index 2d68615013f..7cce27f1e9e 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptNativeOperators.h +++ b/deps/chakrashim/core/lib/Backend/JavascriptNativeOperators.h @@ -2,6 +2,8 @@ // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- +#pragma once + namespace Js { #if ENABLE_NATIVE_CODEGEN @@ -125,6 +127,24 @@ namespace Js { public: static void * Op_SwitchStringLookUp(JavascriptString* str, Js::BranchDictionaryWrapper* stringDictionary, uintptr_t funcStart, uintptr_t funcEnd); + +#if ENABLE_DEBUG_CONFIG_OPTIONS + static void TracePropertyEquivalenceCheck(const JitEquivalentTypeGuard* guard, const Type* type, const Type* refType, bool isEquivalent, uint failedPropertyIndex); +#endif + static bool CheckIfTypeIsEquivalent(Type* type, JitEquivalentTypeGuard* guard); + static bool CheckIfTypeIsEquivalentForFixedField(Type* type, JitEquivalentTypeGuard* guard); + + static Var OP_GetElementI_JIT_ExpectingNativeFloatArray(Var instance, Var index, ScriptContext *scriptContext); + static Var OP_GetElementI_JIT_ExpectingVarArray(Var instance, Var index, ScriptContext *scriptContext); + + static Var OP_GetElementI_UInt32_ExpectingNativeFloatArray(Var instance, uint32 aElementIndex, ScriptContext* scriptContext); + static Var OP_GetElementI_UInt32_ExpectingVarArray(Var instance, uint32 aElementIndex, ScriptContext* scriptContext); + + static Var OP_GetElementI_Int32_ExpectingNativeFloatArray(Var instance, int32 aElementIndex, ScriptContext* scriptContext); + static Var OP_GetElementI_Int32_ExpectingVarArray(Var instance, int32 aElementIndex, ScriptContext* scriptContext); + private: + static bool IsStaticTypeObjTypeSpecEquivalent(const TypeEquivalenceRecord& equivalenceRecord, uint& failedIndex); + static bool IsStaticTypeObjTypeSpecEquivalent(const EquivalentPropertyEntry *entry); }; #endif }; diff --git a/deps/chakrashim/core/lib/Backend/JnHelperMethod.cpp b/deps/chakrashim/core/lib/Backend/JnHelperMethod.cpp index 5630ea04024..23ceefc0a39 100644 --- a/deps/chakrashim/core/lib/Backend/JnHelperMethod.cpp +++ b/deps/chakrashim/core/lib/Backend/JnHelperMethod.cpp @@ -9,7 +9,9 @@ #include "Library/RegexHelper.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DiagHelperMethodWrapper.h" +#endif #include "Math/CrtSSE2Math.h" #include "Library/JavascriptGeneratorFunction.h" #include "RuntimeMathPch.h" @@ -65,6 +67,7 @@ void CheckJnHelperTable(intptr_t const* table) } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING static intptr_t const helperMethodWrappers[] = { reinterpret_cast(&Js::HelperMethodWrapper0), reinterpret_cast(&Js::HelperMethodWrapper1), @@ -84,6 +87,7 @@ static intptr_t const helperMethodWrappers[] = { reinterpret_cast(&Js::HelperMethodWrapper15), reinterpret_cast(&Js::HelperMethodWrapper16), }; +#endif ///---------------------------------------------------------------------------- /// @@ -97,7 +101,7 @@ intptr_t GetMethodAddress(ThreadContextInfo * context, IR::HelperCallOpnd* opnd) { Assert(opnd); - +#ifdef ENABLE_SCRIPT_DEBUGGING #if defined(_M_ARM32_OR_ARM64) #define LowererMDFinal LowererMD #else @@ -120,7 +124,7 @@ GetMethodAddress(ThreadContextInfo * context, IR::HelperCallOpnd* opnd) AssertMsg(FALSE, "Unsupported arg count (need to implement)."); } } - +#endif return GetMethodOriginalAddress(context, opnd->m_fnHelper); } @@ -190,10 +194,10 @@ DECLSPEC_GUARDIGNORE _NOINLINE intptr_t GetNonTableMethodAddress(ThreadContextI return ShiftAddr(context, (void*(*)(void *, void const*, size_t))memcpy); case HelperDirectMath_FloorFlt: - return ShiftAddr(context, (float(*)(float))floor); + return ShiftAddr(context, (float(*)(float))floorf); case HelperDirectMath_CeilFlt: - return ShiftAddr(context, (float(*)(float))ceil); + return ShiftAddr(context, (float(*)(float))ceilf); #if defined(_M_X64) case HelperDirectMath_Acos: diff --git a/deps/chakrashim/core/lib/Backend/JnHelperMethodList.h b/deps/chakrashim/core/lib/Backend/JnHelperMethodList.h index c18826c90f4..af7aa740b69 100644 --- a/deps/chakrashim/core/lib/Backend/JnHelperMethodList.h +++ b/deps/chakrashim/core/lib/Backend/JnHelperMethodList.h @@ -35,7 +35,7 @@ HELPERCALL(ScrObj_LdStrictInnerFrameDisplayNoParent, Js::JavascriptOperators::OP HELPERCALL(ScrObj_OP_IsInst, Js::JavascriptOperators::OP_IsInst, AttrCanThrow) HELPERCALL(Op_IsIn, Js::JavascriptOperators::IsIn, AttrCanThrow) -HELPERCALL(Op_IsObject, Js::JavascriptOperators::IsObject, AttrCanThrow) +HELPERCALL(Op_IsObject, (BOOL (*) (Js::Var))Js::JavascriptOperators::IsObject, AttrCanThrow) HELPERCALL(Op_IsClassConstructor, Js::JavascriptOperators::IsClassConstructor, AttrCanThrow) HELPERCALL(Op_IsBaseConstructorKind, Js::JavascriptOperators::IsBaseConstructorKind, AttrCanThrow) HELPERCALL(Op_LoadHeapArguments, Js::JavascriptOperators::LoadHeapArguments, 0) @@ -172,14 +172,14 @@ HELPERCALL(Op_DeleteProperty, Js::JavascriptOperators::OP_DeleteProperty, AttrCa HELPERCALL(Op_DeleteRootProperty, Js::JavascriptOperators::OP_DeleteRootProperty, AttrCanThrow) HELPERCALL(Op_DeletePropertyScoped, Js::JavascriptOperators::OP_DeletePropertyScoped, AttrCanThrow) HELPERCALL(Op_GetElementI, Js::JavascriptOperators::OP_GetElementI_JIT, AttrCanThrow) -HELPERCALL(Op_GetElementI_ExpectingNativeFloatArray, Js::JavascriptOperators::OP_GetElementI_JIT_ExpectingNativeFloatArray, AttrCanThrow) -HELPERCALL(Op_GetElementI_ExpectingVarArray, Js::JavascriptOperators::OP_GetElementI_JIT_ExpectingVarArray, AttrCanThrow) +HELPERCALL(Op_GetElementI_ExpectingNativeFloatArray, Js::JavascriptNativeOperators::OP_GetElementI_JIT_ExpectingNativeFloatArray, AttrCanThrow) +HELPERCALL(Op_GetElementI_ExpectingVarArray, Js::JavascriptNativeOperators::OP_GetElementI_JIT_ExpectingVarArray, AttrCanThrow) HELPERCALL(Op_GetElementI_UInt32, Js::JavascriptOperators::OP_GetElementI_UInt32, AttrCanThrow) -HELPERCALL(Op_GetElementI_UInt32_ExpectingNativeFloatArray, Js::JavascriptOperators::OP_GetElementI_UInt32_ExpectingNativeFloatArray, AttrCanThrow) -HELPERCALL(Op_GetElementI_UInt32_ExpectingVarArray, Js::JavascriptOperators::OP_GetElementI_UInt32_ExpectingVarArray, AttrCanThrow) +HELPERCALL(Op_GetElementI_UInt32_ExpectingNativeFloatArray, Js::JavascriptNativeOperators::OP_GetElementI_UInt32_ExpectingNativeFloatArray, AttrCanThrow) +HELPERCALL(Op_GetElementI_UInt32_ExpectingVarArray, Js::JavascriptNativeOperators::OP_GetElementI_UInt32_ExpectingVarArray, AttrCanThrow) HELPERCALL(Op_GetElementI_Int32, Js::JavascriptOperators::OP_GetElementI_Int32, AttrCanThrow) -HELPERCALL(Op_GetElementI_Int32_ExpectingNativeFloatArray, Js::JavascriptOperators::OP_GetElementI_Int32_ExpectingNativeFloatArray, AttrCanThrow) -HELPERCALL(Op_GetElementI_Int32_ExpectingVarArray, Js::JavascriptOperators::OP_GetElementI_Int32_ExpectingVarArray, AttrCanThrow) +HELPERCALL(Op_GetElementI_Int32_ExpectingNativeFloatArray, Js::JavascriptNativeOperators::OP_GetElementI_Int32_ExpectingNativeFloatArray, AttrCanThrow) +HELPERCALL(Op_GetElementI_Int32_ExpectingVarArray, Js::JavascriptNativeOperators::OP_GetElementI_Int32_ExpectingVarArray, AttrCanThrow) HELPERCALL(Op_GetNativeIntElementI, Js::JavascriptOperators::OP_GetNativeIntElementI, AttrCanThrow) HELPERCALL(Op_GetNativeFloatElementI, Js::JavascriptOperators::OP_GetNativeFloatElementI, AttrCanThrow) HELPERCALL(Op_GetNativeIntElementI_Int32, Js::JavascriptOperators::OP_GetNativeIntElementI_Int32, AttrCanThrow) @@ -250,8 +250,8 @@ HELPERCALL(Op_PatchGetRootMethodPolymorphic, ((Js::Var (*)(Js::FunctionBody *con HELPERCALL(Op_ScopedGetMethod, ((Js::Var (*)(Js::FunctionBody *const, Js::InlineCache *const, const Js::InlineCacheIndex, Js::Var, Js::PropertyId, bool))Js::JavascriptOperators::PatchScopedGetMethod), AttrCanThrow) HELPERCALL(Op_ScopedGetMethodPolymorphic, ((Js::Var (*)(Js::FunctionBody *const, Js::PolymorphicInlineCache *const, const Js::InlineCacheIndex, Js::Var, Js::PropertyId, bool))Js::JavascriptOperators::PatchScopedGetMethod), AttrCanThrow) -HELPERCALL(CheckIfTypeIsEquivalent, Js::JavascriptOperators::CheckIfTypeIsEquivalent, 0) -HELPERCALL(CheckIfTypeIsEquivalentForFixedField, Js::JavascriptOperators::CheckIfTypeIsEquivalentForFixedField, 0) +HELPERCALL(CheckIfTypeIsEquivalent, Js::JavascriptNativeOperators::CheckIfTypeIsEquivalent, 0) +HELPERCALL(CheckIfTypeIsEquivalentForFixedField, Js::JavascriptNativeOperators::CheckIfTypeIsEquivalentForFixedField, 0) HELPERCALL(Op_Delete, Js::JavascriptOperators::Delete, AttrCanThrow) HELPERCALL(OP_InitSetter, Js::JavascriptOperators::OP_InitSetter, AttrCanThrow) @@ -347,6 +347,18 @@ HELPERCALL(AllocUninitializedNumber, Js::JavascriptOperators::AllocUninitialized // SIMD_JS HELPERCALL(AllocUninitializedSimdF4, Js::JavascriptSIMDFloat32x4::AllocUninitialized, 0) HELPERCALL(AllocUninitializedSimdI4, Js::JavascriptSIMDInt32x4::AllocUninitialized, 0) + +#endif + +#ifdef ENABLE_WASM_SIMD +HELPERCALL(Simd128ShRtByScalarU2, Js::SIMDInt64x2Operation::OpShiftRightByScalarU, 0) +HELPERCALL(Simd128ShRtByScalarI2, Js::SIMDInt64x2Operation::OpShiftRightByScalar, 0) +HELPERCALL(Simd128ShLtByScalarI2, Js::SIMDInt64x2Operation::OpShiftLeftByScalar, 0) +HELPERCALL(Simd128ReplaceLaneI2, Js::SIMDInt64x2Operation::OpReplaceLane, 0) +HELPERCALL(Simd128TruncateI2, (void(*)(SIMDValue*, SIMDValue*))&Js::SIMDInt64x2Operation::OpTrunc, AttrCanThrow) +HELPERCALL(Simd128TruncateU2, (void(*)(SIMDValue*, SIMDValue*))&Js::SIMDInt64x2Operation::OpTrunc, AttrCanThrow) +HELPERCALL(Simd128ConvertSD2, (void(*)(SIMDValue*, SIMDValue*))&Js::SIMDFloat64x2Operation::OpConv, 0) +HELPERCALL(Simd128ConvertUD2, (void(*)(SIMDValue*, SIMDValue*))&Js::SIMDFloat64x2Operation::OpConv, 0) #endif HELPERCALL(Op_TryCatch, nullptr, 0) @@ -363,7 +375,6 @@ HELPERCALL(Op_WebAssemblyRuntimeError, Js::JavascriptExceptionOperators::OP_WebA HELPERCALL(Op_OutOfMemoryError, Js::Throw::OutOfMemory, AttrCanThrow) HELPERCALL(Op_FatalInternalError, Js::Throw::FatalInternalError, AttrCanThrow) -HELPERCALL(Op_InvokePut, Js::JavascriptOperators::OP_InvokePut, 0) #if ENABLE_REGEX_CONFIG_OPTIONS HELPERCALL(ScrRegEx_OP_NewRegEx, Js::JavascriptRegExp::OP_NewRegEx, 0) #endif diff --git a/deps/chakrashim/core/lib/Backend/Lifetime.h b/deps/chakrashim/core/lib/Backend/Lifetime.h index 65da230114b..da397111323 100644 --- a/deps/chakrashim/core/lib/Backend/Lifetime.h +++ b/deps/chakrashim/core/lib/Backend/Lifetime.h @@ -9,16 +9,43 @@ class Lifetime { public: - Lifetime(JitArenaAllocator * alloc, StackSym *sym, RegNum reg, uint32 start, uint32 end, Func *func) - : sym(sym), reg(reg), start(start), end(end), previousDefBlockNumber(0), defList(alloc), - useList(alloc), lastUseLabel(NULL), region(NULL), isSpilled(false), useCount(0), useCountAdjust(0), allDefsCost(0), isLiveAcrossCalls(false), - isLiveAcrossUserCalls(false), isDeadStore(true), isOpHelperSpilled(false), cantOpHelperSpill(false), isOpHelperSpillAsArg(false), - isFloat(0), cantSpill(false), dontAllocate(false), isSecondChanceAllocated(false), isCheapSpill(false), spillStackSlot(NULL), - totalOpHelperLengthByEnd(0), needsStoreCompensation(false), alloc(alloc), regionUseCount(NULL), regionUseCountAdjust(NULL), - cantStackPack(false) + Lifetime(JitArenaAllocator * alloc, StackSym *sym, RegNum reg, uint32 start, uint32 end) + : + sym(sym), + regionUseCount(nullptr), + regionUseCountAdjust(nullptr), + defList(alloc), + useList(alloc), + lastUseLabel(nullptr), + region(nullptr), + spillStackSlot(nullptr), + alloc(alloc), + intUsageBv(0), + regPreference(0), + start(start), + end(end), + previousDefBlockNumber(0), + useCount(0), + useCountAdjust(0), + allDefsCost(0), + lastAllocationStart(0), + reg(reg), + totalOpHelperLengthByEnd(0), + isSpilled(false), + isLiveAcrossCalls(false), + isLiveAcrossUserCalls(false), + isDeadStore(true), + isOpHelperSpilled(false), + isOpHelperSpillAsArg(false), + cantOpHelperSpill(false), + cantSpill(false), + dontAllocate(false), + isSecondChanceAllocated(false), + isCheapSpill(false), + needsStoreCompensation(false), + cantStackPack(false), + isFloat(false) { - intUsageBv.ClearAll(); - regPreference.ClearAll(); } public: diff --git a/deps/chakrashim/core/lib/Backend/LinearScan.cpp b/deps/chakrashim/core/lib/Backend/LinearScan.cpp index 593c236b8eb..0ea5b575901 100644 --- a/deps/chakrashim/core/lib/Backend/LinearScan.cpp +++ b/deps/chakrashim/core/lib/Backend/LinearScan.cpp @@ -43,6 +43,11 @@ LoweredBasicBlock* LoweredBasicBlock::New(JitArenaAllocator* allocator) return JitAnew(allocator, LoweredBasicBlock, allocator); } +void LoweredBasicBlock::Delete(JitArenaAllocator* allocator) +{ + JitAdelete(allocator, this); +} + void LoweredBasicBlock::Copy(LoweredBasicBlock* block) { this->inlineeFrameLifetimes.Copy(&block->inlineeFrameLifetimes); @@ -160,25 +165,32 @@ LinearScan::RegAlloc() #endif // DBG this->currentInstr = instr; - if(instr->StartsBasicBlock() || endOfBasicBlock) + if (instr->StartsBasicBlock() || endOfBasicBlock) { endOfBasicBlock = false; ++currentBlockNumber; } + bool isLoopBackEdge = false; if (instr->IsLabelInstr()) { this->lastLabel = instr->AsLabelInstr(); if (this->lastLabel->m_loweredBasicBlock) { + IR::Instr *const prevInstr = instr->GetPrevRealInstrOrLabel(); + Assert(prevInstr); + if (prevInstr->HasFallThrough()) + { + this->currentBlock->Delete(&tempAlloc); + } this->currentBlock = this->lastLabel->m_loweredBasicBlock; } - else if(currentBlock->HasData()) + else if (currentBlock->HasData()) { // Check if the previous block has fall-through. If so, retain the block info. If not, create empty info. IR::Instr *const prevInstr = instr->GetPrevRealInstrOrLabel(); Assert(prevInstr); - if(!prevInstr->HasFallThrough()) + if (!prevInstr->HasFallThrough()) { currentBlock = LoweredBasicBlock::New(&tempAlloc); } @@ -191,10 +203,9 @@ LinearScan::RegAlloc() { this->ProcessEHRegionBoundary(instr); } - this->ProcessSecondChanceBoundary(instr->AsBranchInstr()); - } - this->CheckIfInLoop(instr); + isLoopBackEdge = this->IsInLoop() && instr->GetNumber() >= this->curLoop->regAlloc.loopEnd; + } if (this->RemoveDeadStores(instr)) { @@ -222,7 +233,17 @@ LinearScan::RegAlloc() } this->SetSrcRegs(instr); - this->EndDeadLifetimes(instr); + this->EndDeadLifetimes(instr, isLoopBackEdge); + + if (instr->IsBranchInstr()) + { + this->ProcessSecondChanceBoundary(instr->AsBranchInstr()); + } + this->CheckIfInLoop(instr); + if (isLoopBackEdge) + { + this->EndDeadLifetimes(instr, false); + } this->CheckOpHelper(instr); @@ -466,6 +487,10 @@ LinearScan::CheckIfInLoop(IR::Instr *instr) while (this->IsInLoop() && instr->GetNumber() >= this->curLoop->regAlloc.loopEnd) { this->loopNest--; + this->curLoop->regAlloc.defdInLoopBv->ClearAll(); + this->curLoop->regAlloc.symRegUseBv->ClearAll(); + this->curLoop->regAlloc.liveOnBackEdgeSyms->ClearAll(); + this->curLoop->regAlloc.exitRegContentList->Clear(); this->curLoop->isProcessed = true; this->curLoop = this->curLoop->parent; if (this->loopNest == 0) @@ -1101,6 +1126,16 @@ LinearScan::SetUses(IR::Instr *instr, IR::Opnd *opnd) } } break; + + case IR::OpndKindList: + { + opnd->AsListOpnd()->Map([&](int i, IR::Opnd* opnd) + { + this->SetUses(instr, opnd); + }); + } + break; + case IR::OpndKindIntConst: case IR::OpndKindAddr: this->linearScanMD.LegalizeConstantUse(instr, opnd); @@ -1396,6 +1431,14 @@ LinearScan::FillBailOutRecord(IR::Instr * instr) // To indicate this is a subsequent bailout from an inlinee bailOutRecord->bailOutOpcode = Js::OpCode::InlineeEnd; #endif + if (this->func->HasTry()) + { + RegionType currentRegionType = this->currentRegion->GetType(); + if (currentRegionType == RegionTypeTry || currentRegionType == RegionTypeCatch || currentRegionType == RegionTypeFinally) + { + bailOutRecord->ehBailoutData = this->currentRegion->ehBailoutData; + } + } funcBailOutData[funcIndex].bailOutRecord->parent = bailOutRecord; funcIndex--; funcBailOutData[funcIndex].bailOutRecord = bailOutRecord; @@ -1697,6 +1740,9 @@ LinearScan::FillBailOutRecord(IR::Instr * instr) NativeCodeData::AllocatorNoFixup* allocatorT = (NativeCodeData::AllocatorNoFixup*)allocator; BVFixed * argOutFloat64Syms = BVFixed::New(bailOutInfo->totalOutParamCount, allocatorT); BVFixed * argOutLosslessInt32Syms = BVFixed::New(bailOutInfo->totalOutParamCount, allocatorT); +#ifdef _M_IX86 + BVFixed * isOrphanedArgSlot = BVFixed::New(bailOutInfo->totalOutParamCount, allocatorT); +#endif // SIMD_JS BVFixed * argOutSimd128F4Syms = BVFixed::New(bailOutInfo->totalOutParamCount, allocatorT); BVFixed * argOutSimd128I4Syms = BVFixed::New(bailOutInfo->totalOutParamCount, allocatorT); @@ -1729,7 +1775,12 @@ LinearScan::FillBailOutRecord(IR::Instr * instr) uint outParamCount = bailOutInfo->GetStartCallOutParamCount(i); startCallOutParamCounts[i] = outParamCount; #ifdef _M_IX86 - startCallArgRestoreAdjustCounts[i] = bailOutInfo->startCallInfo[i].argRestoreAdjustCount; + if (bailOutInfo->startCallInfo[i].instr->m_opcode == Js::OpCode::StartCall) + { + // Deadcode might have eliminated the argouts and the call instruction due to a BailOnNoProfile after StartCall + // In such cases, StartCall opcode is not changed to LoweredStartCall, mark the StartCall instruction accordingly + bailOutInfo->startCallInfo[i].isOrphanedCall = true; + } // Only x86 has a progression of pushes of out args, with stack alignment. bool fDoStackAdjust = false; if (!bailOutInfo->inlinedStartCall->Test(i)) @@ -1790,6 +1841,7 @@ LinearScan::FillBailOutRecord(IR::Instr * instr) currentBailOutRecord->argOutOffsetInfo->startCallIndex = i; currentBailOutRecord->argOutOffsetInfo->startCallOutParamCounts = &startCallOutParamCounts[i]; #ifdef _M_IX86 + currentBailOutRecord->argOutOffsetInfo->isOrphanedArgSlot = isOrphanedArgSlot; currentBailOutRecord->startCallArgRestoreAdjustCounts = &startCallArgRestoreAdjustCounts[i]; #endif currentBailOutRecord->argOutOffsetInfo->outParamOffsets = &outParamOffsets[outParamStart]; @@ -1799,13 +1851,13 @@ LinearScan::FillBailOutRecord(IR::Instr * instr) #ifdef ENABLE_SIMDJS // SIMD_JS - currentBailOutRecord->argOutOffsetInfo->argOutSimd128F4Syms = argOutSimd128F4Syms; - currentBailOutRecord->argOutOffsetInfo->argOutSimd128I4Syms = argOutSimd128I4Syms ; - currentBailOutRecord->argOutOffsetInfo->argOutSimd128I8Syms = argOutSimd128I8Syms ; - currentBailOutRecord->argOutOffsetInfo->argOutSimd128I16Syms = argOutSimd128I16Syms ; - currentBailOutRecord->argOutOffsetInfo->argOutSimd128U4Syms = argOutSimd128U4Syms ; - currentBailOutRecord->argOutOffsetInfo->argOutSimd128U8Syms = argOutSimd128U8Syms ; - currentBailOutRecord->argOutOffsetInfo->argOutSimd128U16Syms = argOutSimd128U16Syms ; + currentBailOutRecord->argOutOffsetInfo->argOutSimd128F4Syms = argOutSimd128F4Syms; + currentBailOutRecord->argOutOffsetInfo->argOutSimd128I4Syms = argOutSimd128I4Syms; + currentBailOutRecord->argOutOffsetInfo->argOutSimd128I8Syms = argOutSimd128I8Syms; + currentBailOutRecord->argOutOffsetInfo->argOutSimd128I16Syms = argOutSimd128I16Syms; + currentBailOutRecord->argOutOffsetInfo->argOutSimd128U4Syms = argOutSimd128U4Syms; + currentBailOutRecord->argOutOffsetInfo->argOutSimd128U8Syms = argOutSimd128U8Syms; + currentBailOutRecord->argOutOffsetInfo->argOutSimd128U16Syms = argOutSimd128U16Syms; currentBailOutRecord->argOutOffsetInfo->argOutSimd128B4Syms = argOutSimd128U4Syms; currentBailOutRecord->argOutOffsetInfo->argOutSimd128B8Syms = argOutSimd128U8Syms; currentBailOutRecord->argOutOffsetInfo->argOutSimd128B16Syms = argOutSimd128U16Syms; @@ -1971,6 +2023,10 @@ LinearScan::FillBailOutRecord(IR::Instr * instr) #else // Stack offset are negative, includes the PUSH EBP and return address outParamOffsets[outParamOffsetIndex] = sym->m_offset - (2 * MachPtr); +#endif +#ifdef _M_IX86 + isOrphanedArgSlot->Set(outParamOffsetIndex); + Assert(bailOutInfo->startCallInfo[i].isOrphanedCall == true); #endif } #ifdef _M_IX86 @@ -2093,6 +2149,34 @@ LinearScan::FillBailOutRecord(IR::Instr * instr) } } } + + for (int i = startCallCount - 1; i >= 0; i--) + { +#ifdef _M_IX86 + uint argRestoreAdjustCount = 0; + if (this->currentRegion && (this->currentRegion->GetType() == RegionTypeTry || this->currentRegion->GetType() == RegionTypeFinally)) + { + // For a bailout in argument evaluation from an EH region, the esp is offset by the TryCatch helper's frame. So, the argouts are not actually pushed at the + // offsets stored in the bailout record, which are relative to ebp. Need to restore the argouts from the actual value of esp before calling the Bailout helper. + // For nested calls, argouts for the outer call need to be restored from an offset of stack-adjustment-done-by-the-inner-call from esp. + if ((unsigned)(i + 1) == bailOutInfo->startCallCount) + { + argRestoreAdjustCount = 0; + } + else + { + uint argCount = bailOutInfo->startCallInfo[i + 1].isOrphanedCall ? 0 : bailOutInfo->startCallInfo[i + 1].argCount; + argRestoreAdjustCount = bailOutInfo->startCallInfo[i + 1].argRestoreAdjustCount + argCount; + if ((Math::Align(argCount * MachPtr, MachStackAlignment) - (argCount * MachPtr)) != 0) + { + argRestoreAdjustCount++; + } + } + bailOutInfo->startCallInfo[i].argRestoreAdjustCount = argRestoreAdjustCount; + } + startCallArgRestoreAdjustCounts[i] = bailOutInfo->startCallInfo[i].argRestoreAdjustCount; +#endif + } } else { @@ -2499,23 +2583,28 @@ LinearScan::SkipNumberedInstr(IR::Instr *instr) // LinearScan::EndDeadLifetimes // Look for lifetimes that are ending here, and retire them. void -LinearScan::EndDeadLifetimes(IR::Instr *instr) +LinearScan::EndDeadLifetimes(IR::Instr *instr, bool isLoopBackEdge) { - Lifetime * deadLifetime; - if (this->SkipNumberedInstr(instr)) { return; } // Retire all active lifetime ending at this instruction - while (!this->activeLiveranges->Empty() && this->activeLiveranges->Head()->end <= instr->GetNumber()) + FOREACH_SLIST_ENTRY_EDITING(Lifetime *, deadLifetime, this->activeLiveranges, iter) { - deadLifetime = this->activeLiveranges->Head(); + if (deadLifetime->end > instr->GetNumber()) + { + break; + } + + if (isLoopBackEdge && this->curLoop->regAlloc.liveOnBackEdgeSyms->Test(deadLifetime->sym->m_id)) + { + continue; + } deadLifetime->defList.Clear(); deadLifetime->useList.Clear(); - this->activeLiveranges->RemoveHead(); RegNum reg = deadLifetime->reg; this->activeRegs.Clear(reg); this->regContent[reg] = nullptr; @@ -2529,24 +2618,35 @@ LinearScan::EndDeadLifetimes(IR::Instr *instr) Assert(RegTypes[reg] == TyFloat64); this->floatRegUsedCount--; } - } + iter.RemoveCurrent(); + + } NEXT_SLIST_ENTRY_EDITING; // Look for spilled lifetimes which end here such that we can make their stack slot // available for stack-packing. - while (!this->stackPackInUseLiveRanges->Empty() && this->stackPackInUseLiveRanges->Head()->end <= instr->GetNumber()) + FOREACH_SLIST_ENTRY_EDITING(Lifetime *, deadStackPack, this->stackPackInUseLiveRanges, stackPackIter) { - deadLifetime = this->stackPackInUseLiveRanges->Head(); - deadLifetime->defList.Clear(); - deadLifetime->useList.Clear(); + if (deadStackPack->end > instr->GetNumber()) + { + break; + } - this->stackPackInUseLiveRanges->RemoveHead(); - if (!deadLifetime->cantStackPack) + if (isLoopBackEdge && this->curLoop->regAlloc.liveOnBackEdgeSyms->Test(deadStackPack->sym->m_id)) { - Assert(deadLifetime->spillStackSlot); - deadLifetime->spillStackSlot->lastUse = deadLifetime->end; - this->stackSlotsFreeList->Push(deadLifetime->spillStackSlot); + continue; } - } + deadStackPack->defList.Clear(); + deadStackPack->useList.Clear(); + + if (!deadStackPack->cantStackPack) + { + Assert(deadStackPack->spillStackSlot); + deadStackPack->spillStackSlot->lastUse = deadStackPack->end; + this->stackSlotsFreeList->Push(deadStackPack->spillStackSlot); + } + stackPackIter.RemoveCurrent(); + } NEXT_SLIST_ENTRY_EDITING; + } void @@ -2772,18 +2872,30 @@ LinearScan::FindReg(Lifetime *newLifetime, IR::RegOpnd *regOpnd, bool force) regsBv = this->linearScanMD.FilterRegIntSizeConstraints(regsBv, regSizeBv); } + BitVector regsBvNoTemps = regsBv; + if (!this->tempRegs.IsEmpty()) { - // avoid the temp reg that we have loaded in this basic block - BitVector regsBvTemp = regsBv; - regsBvTemp.Minus(this->tempRegs); - regIndex = regsBvTemp.GetPrevBit(); + // Avoid the temp reg that we have loaded in this basic block + regsBvNoTemps.Minus(this->tempRegs); + } + + BitVector regsBvNoTempsNoCallee = regsBvNoTemps; + // Try to find a non-callee saved reg so that we don't have to save it in prolog + regsBvNoTempsNoCallee.Minus(this->calleeSavedRegs); + + // Allocate a non-callee saved reg from the other end of the bit vector so that it can keep live for longer + regIndex = regsBvNoTempsNoCallee.GetPrevBit(); + + if (regIndex == BVInvalidIndex) + { + // If we don't have any non-callee saved reg then get the first available callee saved reg so that prolog can store adjacent registers + regIndex = regsBvNoTemps.GetNextBit(); } if (regIndex == BVInvalidIndex) { - // allocate a temp reg from the other end of the bit vector so that it can - // keep live for longer. + // Everything is used, get the temp from other end regIndex = regsBv.GetPrevBit(); } } @@ -3352,11 +3464,11 @@ LinearScan::InsertLoad(IR::Instr *instr, StackSym *sym, RegNum reg) else { StackSym * oldSym = sym; - sym = StackSym::New(TyVar, this->func); + sym = StackSym::New(sym->GetType(), this->func); sym->m_isConst = true; sym->m_isIntConst = oldSym->m_isIntConst; sym->m_isInt64Const = oldSym->m_isInt64Const; - sym->m_isTaggableIntConst = sym->m_isTaggableIntConst; + sym->m_isTaggableIntConst = oldSym->m_isTaggableIntConst; } } else @@ -3723,7 +3835,7 @@ LinearScan::RemoveDeadStores(IR::Instr *instr) DebugOnly(this->func->allowRemoveBailOutArgInstr = true); // We are removing this instruction, end dead life time now - this->EndDeadLifetimes(instr); + this->EndDeadLifetimes(instr, false); instr->Remove(); DebugOnly(this->func->allowRemoveBailOutArgInstr = false); @@ -3886,9 +3998,18 @@ LinearScan::ProcessSecondChanceBoundaryHelper(IR::BranchInstr *branchInstr, IR:: nextInstr->m_opcode != Js::OpCode::BailOutStackRestore && this->currentBlock->HasData()) { - // Clone with shallow copy - branchLabel->m_loweredBasicBlock = this->currentBlock; - + IR::Instr* branchNextInstr = branchInstr->GetNextRealInstrOrLabel(); + if (branchNextInstr->IsLabelInstr()) + { + // Clone with shallow copy + branchLabel->m_loweredBasicBlock = this->currentBlock; + } + else + { + // Dead code after the unconditional branch causes the currentBlock data to be freed later on... + // Deep copy in this case. + branchLabel->m_loweredBasicBlock = this->currentBlock->Clone(this->tempAlloc); + } } } } @@ -3928,7 +4049,18 @@ LinearScan::ProcessSecondChanceBoundary(IR::LabelInstr *labelInstr) if (branchInstr->GetNumber() < labelInstr->GetNumber()) { // Normal branch - this->InsertSecondChanceCompensation(branchInstr->m_regContent, this->regContent, branchInstr, labelInstr); + Lifetime ** branchRegContent = branchInstr->m_regContent; + bool isMultiBranch = true; + if (!branchInstr->IsMultiBranch()) + { + branchInstr->m_regContent = nullptr; + isMultiBranch = false; + } + this->InsertSecondChanceCompensation(branchRegContent, this->regContent, branchInstr, labelInstr); + if (!isMultiBranch) + { + JitAdeleteArray(this->tempAlloc, RegNumCount, branchRegContent); + } } else { @@ -4181,7 +4313,7 @@ LinearScan::ReconcileRegContent(Lifetime ** branchRegContent, Lifetime **labelRe } else { - Assert(type == TyFloat64 || IRType_IsSimd128(type)); + Assert(type == TyFloat64 || IRType_IsSimd(type)); FOREACH_FLOAT_REG(regIter) { @@ -4610,7 +4742,7 @@ LinearScan::SaveRegContent(IR::Instr *instr) bool LinearScan::RegsAvailable(IRType type) { - if (IRType_IsFloat(type) || IRType_IsSimd128(type)) + if (IRType_IsFloat(type) || IRType_IsSimd(type)) { return (this->floatRegUsedCount < FLOAT_REG_COUNT); } diff --git a/deps/chakrashim/core/lib/Backend/LinearScan.h b/deps/chakrashim/core/lib/Backend/LinearScan.h index e6b369e834d..4634d41f0d6 100644 --- a/deps/chakrashim/core/lib/Backend/LinearScan.h +++ b/deps/chakrashim/core/lib/Backend/LinearScan.h @@ -40,6 +40,7 @@ class LoweredBasicBlock } static LoweredBasicBlock* New(JitArenaAllocator * allocator); + void Delete(JitArenaAllocator* allocator); void Copy(LoweredBasicBlock* block); LoweredBasicBlock* Clone(JitArenaAllocator * allocator); bool HasData(); @@ -119,7 +120,7 @@ class LinearScan private: void Init(); bool SkipNumberedInstr(IR::Instr *instr); - void EndDeadLifetimes(IR::Instr *instr); + void EndDeadLifetimes(IR::Instr *instr, bool isLoopBackEdge); void EndDeadOpHelperLifetimes(IR::Instr *instr); void AllocateNewLifetimes(IR::Instr *instr); RegNum Spill(Lifetime *newLifetime, IR::RegOpnd *regOpnd, bool dontSpillCurrent, bool force); diff --git a/deps/chakrashim/core/lib/Backend/Lower.cpp b/deps/chakrashim/core/lib/Backend/Lower.cpp index afa6413aade..c1a2a2ee9d3 100644 --- a/deps/chakrashim/core/lib/Backend/Lower.cpp +++ b/deps/chakrashim/core/lib/Backend/Lower.cpp @@ -3,9 +3,11 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "Backend.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DebuggingFlags.h" #include "Debug/DiagProbe.h" #include "Debug/DebugManager.h" +#endif // Parser includes #include "RegexCommon.h" @@ -67,7 +69,7 @@ Lowerer::Lower() sym->m_allocated = true; IR::Opnd* opnd1 = IR::SymOpnd::New(sym, TyInt8, m_func); IR::Opnd* opnd2 = IR::IntConstOpnd::New(0, TyInt8, m_func); - LowererMD::CreateAssign(opnd1, opnd2, m_func->GetFunctionEntryInsertionPoint()); + Lowerer::InsertMove(opnd1, opnd2, m_func->GetFunctionEntryInsertionPoint()); #ifdef DBG // Pre-fill all local slots with a pattern. This will help identify non-initialized/garbage var values. @@ -79,7 +81,7 @@ Lowerer::Lower() IRType opnd1Type; -#if defined(_M_IX86) || defined (_M_ARM) +#if defined(TARGET_32) opnd1Type = TyInt32; opnd2 = IR::IntConstOpnd::New(Func::c_debugFillPattern4, opnd1Type, m_func); #else @@ -91,7 +93,7 @@ Lowerer::Lower() sym->m_offset = offset; sym->m_allocated = true; opnd1 = IR::SymOpnd::New(sym, opnd1Type, m_func); - LowererMD::CreateAssign(opnd1, opnd2, m_func->GetFunctionEntryInsertionPoint()); + Lowerer::InsertMove(opnd1, opnd2, m_func->GetFunctionEntryInsertionPoint()); } #endif } @@ -365,7 +367,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; case Js::OpCode::GetCachedFunc: - m_lowererMD.LowerGetCachedFunc(instr); + this->LowerGetCachedFunc(instr); break; case Js::OpCode::BrFncCachedScopeEq: @@ -374,7 +376,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; case Js::OpCode::CommitScope: - m_lowererMD.LowerCommitScope(instr); + this->LowerCommitScope(instr); break; case Js::OpCode::LdFldForTypeOf: @@ -848,11 +850,11 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; } case Js::OpCode::AsmJsCallI: - m_lowererMD.LowerAsmJsCallI(instr); + instrPrev = m_lowererMD.LowerAsmJsCallI(instr); break; case Js::OpCode::AsmJsCallE: - m_lowererMD.LowerAsmJsCallE(instr); + instrPrev = m_lowererMD.LowerAsmJsCallE(instr); break; case Js::OpCode::CallIEval: @@ -876,10 +878,6 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; } - case Js::OpCode::CallIPut: - m_lowererMD.LowerCallPut(instr); - break; - case Js::OpCode::CallHelper: instrPrev = m_lowererMD.LowerCallHelper(instr); break; @@ -896,10 +894,9 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa exitPrev = IR::LabelInstr::New(Js::OpCode::Label, m_func); m_func->m_exitInstr->InsertBefore(exitPrev); } - IR::BranchInstr *exitBr = IR::BranchInstr::New(Js::OpCode::Br, + IR::BranchInstr *exitBr = IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, exitPrev->AsLabelInstr(), m_func); instr->InsertAfter(exitBr); - m_lowererMD.LowerUncondBranch(exitBr); } m_lowererMD.LowerRet(instr); @@ -1126,8 +1123,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa LowerTrapIfMinIntOverNegOne(instr); break; case Js::OpCode::TrapIfTruncOverflow: - instr->m_opcode = Js::OpCode::Ld_I4; - LowerLdI4(instr); + LowererMD::ChangeToAssign(instr); break; case Js::OpCode::TrapIfZero: LowerTrapIfZero(instr); @@ -1184,7 +1180,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa case Js::OpCode::LdThis: { - if (noFieldFastPath || !m_lowererMD.GenerateLdThisCheck(instr)) + if (noFieldFastPath || !GenerateLdThisCheck(instr)) { IR::JnHelperMethod meth; if (instr->IsJitProfilingInstr()) @@ -1230,19 +1226,19 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa } else { - m_lowererMD.GenerateLdThisStrict(instr); + this->GenerateLdThisStrict(instr); instr->Remove(); } break; case Js::OpCode::CheckThis: - m_lowererMD.GenerateLdThisCheck(instr); + GenerateLdThisCheck(instr); instr->FreeSrc1(); this->GenerateBailOut(instr); break; case Js::OpCode::StrictCheckThis: - m_lowererMD.GenerateLdThisStrict(instr); + this->GenerateLdThisStrict(instr); instr->FreeSrc1(); this->GenerateBailOut(instr); break; @@ -1533,7 +1529,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; case Js::OpCode::IsInst: - m_lowererMD.GenerateFastIsInst(instr); + this->GenerateFastIsInst(instr); instrPrev = this->LowerIsInst(instr, IR::HelperScrObj_OP_IsInst); break; @@ -1741,7 +1737,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; #endif case Js::OpCode::Ld_I4: - LowerLdI4(instr); + LowererMD::ChangeToAssign(instr); break; case Js::OpCode::LdAsmJsFunc: if (instr->GetSrc1()->IsIndirOpnd()) @@ -1828,7 +1824,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa { GenerateRuntimeError(instr, WASMERR_InvalidTypeConversion); instr->ReplaceSrc1(IR::Int64ConstOpnd::New(0, TyInt64, m_func)); - m_lowererMD.LowerInt64Assign(instr); + LowererMD::ChangeToAssign(instr); } #ifdef ENABLE_SIMDJS // Support on IA only @@ -1955,6 +1951,10 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa { m_lowererMD.EmitUIntToLong(instr->GetDst(), instr->GetSrc1(), instr); } + else if (instr->GetSrc1()->IsInt64() && instr->GetSrc2()) + { + m_lowererMD.EmitSignExtend(instr); + } else { Assert(0); @@ -1967,6 +1967,10 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa { m_lowererMD.EmitLongToInt(instr->GetDst(), instr->GetSrc1(), instr); } + else if ((instr->GetSrc1()->IsInt32() || instr->GetSrc1()->IsUInt32()) && instr->GetSrc2()) + { + m_lowererMD.EmitSignExtend(instr); + } else { Assert(instr->GetSrc1()->IsFloat()); @@ -2014,7 +2018,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; case Js::OpCode::Br: - m_lowererMD.LowerUncondBranch(instr); + instr->m_opcode = LowererMD::MDUncondBranchOpcode; break; case Js::OpCode::BrFncEqApply: @@ -2376,7 +2380,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa // Update the jittedLoopIterations field on the entryPointInfo IR::MemRefOpnd *iterationsAddressOpnd = IR::MemRefOpnd::New(this->m_func->GetJittedLoopIterationsSinceLastBailoutAddress(), TyUint32, this->m_func); - m_lowererMD.CreateAssign(iterationsAddressOpnd, instr->GetDst(), instr); + InsertMove(iterationsAddressOpnd, instr->GetDst(), instr); break; } @@ -2549,7 +2553,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa break; case Js::OpCode::Catch: - instrPrev = m_lowererMD.LowerCatch(instr); + instrPrev = this->LowerCatch(instr); break; case Js::OpCode::Finally: @@ -2573,7 +2577,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa // Required in Register Allocator to mark region boundaries break; } - instrPrev = m_lowererMD.LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), false /*fromFinalLower*/, instr->AsBranchInstr()->m_isOrphanedLeave); + instrPrev = this->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), false /*fromFinalLower*/, instr->AsBranchInstr()->m_isOrphanedLeave); break; case Js::OpCode::BailOnException: @@ -2656,9 +2660,11 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa LowerBailOnNegative(instr); break; +#ifdef ENABLE_SCRIPT_DEBUGGING case Js::OpCode::BailForDebugger: instrPrev = this->LowerBailForDebugger(instr); break; +#endif case Js::OpCode::BailOnNotObject: instrPrev = this->LowerBailOnNotObject(instr); @@ -2892,7 +2898,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa IR::SymOpnd * resumeYieldDataOpnd = IR::SymOpnd::New(resumeYieldDataSym, TyMachPtr, m_func); AssertMsg(instr->m_next->IsLabelInstr(), "Expect the resume label to immediately follow Yield instruction"); - m_lowererMD.CreateAssign(dstOpnd, resumeYieldDataOpnd, instr->m_next->m_next); + InsertMove(dstOpnd, resumeYieldDataOpnd, instr->m_next->m_next); GenerateBailOut(instr); @@ -3012,7 +3018,7 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa #endif //ENABLE_WASM default: -#ifdef ENABLE_SIMDJS +#if defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) #if defined(_M_IX86) || defined(_M_X64) if (IsSimd128Opcode(instr->m_opcode)) { @@ -3317,7 +3323,7 @@ Lowerer::GenerateFastBrConst(IR::BranchInstr *branchInstr, IR::Opnd * constOpnd, if (!opnd->IsRegOpnd()) { IR::RegOpnd *lhsReg = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(lhsReg, opnd, branchInstr); + Lowerer::InsertMove(lhsReg, opnd, branchInstr); opnd = lhsReg; } @@ -3459,7 +3465,7 @@ Lowerer::GenerateDynamicObjectAlloc(IR::Instr * newObjInstr, uint inlineSlotCoun GenerateMemInit(newObjDst, Js::DynamicObject::GetOffsetOfAuxSlots(), auxSlots, newObjInstr, isZeroed); IR::IndirOpnd* newObjAuxSlots = IR::IndirOpnd::New(newObjDst, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachPtr, m_func); - this->m_lowererMD.CreateAssign(newObjAuxSlots, auxSlots, newObjInstr); + this->InsertMove(newObjAuxSlots, auxSlots, newObjInstr); } else { @@ -3874,7 +3880,7 @@ Lowerer::GenerateArrayAllocHelper(IR::Instr *instr, uint32 * psize, Js::ArrayCal if (leaHeadInstr != nullptr) { instr->InsertBefore(leaHeadInstr); - LowererMD::ChangeToLea(leaHeadInstr); + ChangeToLea(leaHeadInstr); } GenerateMemInit(dstOpnd, ArrayType::GetOffsetOfHead(), headOpnd, instr, isZeroed); @@ -3976,7 +3982,7 @@ Lowerer::GenerateArrayAlloc(IR::Instr *instr, IR::Opnd * arrayLenOpnd, Js::Array if (leaHeadInstr != nullptr) { instr->InsertBefore(leaHeadInstr); - LowererMD::ChangeToLea(leaHeadInstr); + ChangeToLea(leaHeadInstr); } GenerateMemInit(dstOpnd, ArrayType::GetOffsetOfHead(), headOpnd, instr, true); @@ -4624,12 +4630,12 @@ Lowerer::LowerNewScObject(IR::Instr *newObjInstr, bool callCtor, bool hasArgs, b if (returnNewScObj) { // MOV newObjDst, createObjDst - this->m_lowererMD.CreateAssign(newObjDst, createObjDst, insertAfterCtorInstr); + this->InsertMove(newObjDst, createObjDst, insertAfterCtorInstr); } else { LowerGetNewScObjectCommon(ctorResultObjOpnd, ctorResultObjOpnd, createObjDst, insertAfterCtorInstr); - this->m_lowererMD.CreateAssign(newObjDst, ctorResultObjOpnd, insertAfterCtorInstr); + this->InsertMove(newObjDst, ctorResultObjOpnd, insertAfterCtorInstr); } } @@ -4684,7 +4690,7 @@ Lowerer::LowerNewScObject(IR::Instr *newObjInstr, bool callCtor, bool hasArgs, b // MOV newObjDst, createObjDst if (!skipNewScObj && createObjDst != newObjDst) { - this->m_lowererMD.CreateAssign(newObjDst, createObjDst, newObjInstr); + this->InsertMove(newObjDst, createObjDst, newObjInstr); } newObjInstr->Remove(); } @@ -4862,7 +4868,7 @@ bool Lowerer::TryLowerNewScObjectWithFixedCtorCache(IR::Instr* newObjInstr, IR:: skipNewScObj = true; IR::AddrOpnd* zeroOpnd = IR::AddrOpnd::NewNull(this->m_func); - this->m_lowererMD.CreateAssign(newObjDst, zeroOpnd, newObjInstr); + this->InsertMove(newObjDst, zeroOpnd, newObjInstr); return true; } @@ -4914,7 +4920,7 @@ bool Lowerer::TryLowerNewScObjectWithFixedCtorCache(IR::Instr* newObjInstr, IR:: if (ctor->IsClassCtor()) { // MOV newObjDst, function - this->m_lowererMD.CreateAssign(newObjDst, newObjInstr->GetSrc1(), newObjInstr); + this->InsertMove(newObjDst, newObjInstr->GetSrc1(), newObjInstr); } else { @@ -4938,9 +4944,8 @@ bool Lowerer::TryLowerNewScObjectWithFixedCtorCache(IR::Instr* newObjInstr, IR:: } // JMP $callCtor - IR::BranchInstr *callCtorBranch = IR::BranchInstr::New(Js::OpCode::Br, callCtorLabel, m_func); + IR::BranchInstr *callCtorBranch = IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, callCtorLabel, m_func); newObjInstr->InsertBefore(callCtorBranch); - this->m_lowererMD.LowerUncondBranch(callCtorBranch); return true; } @@ -5043,10 +5048,9 @@ Lowerer::LowerGetNewScObjectCommon( // Value returned by constructor is an object (use constructorReturnOpnd) if(!resultObjOpnd->IsEqual(constructorReturnOpnd)) { - this->m_lowererMD.CreateAssign(resultObjOpnd, constructorReturnOpnd, insertBeforeInstr); + this->InsertMove(resultObjOpnd, constructorReturnOpnd, insertBeforeInstr); } - insertBeforeInstr->InsertBefore( - m_lowererMD.LowerUncondBranch(IR::BranchInstr::New(Js::OpCode::Br, doneLabel, m_func))); + insertBeforeInstr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, doneLabel, m_func)); // Value returned by constructor is not an object (use newObjOpnd) insertBeforeInstr->InsertBefore(notObjectLabel); @@ -5054,7 +5058,7 @@ Lowerer::LowerGetNewScObjectCommon( if(!resultObjOpnd->IsEqual(newObjOpnd)) { - this->m_lowererMD.CreateAssign(resultObjOpnd, newObjOpnd, insertBeforeInstr); + this->InsertMove(resultObjOpnd, newObjOpnd, insertBeforeInstr); } // fall through to insertBeforeInstr or doneLabel @@ -5085,7 +5089,7 @@ Lowerer::LowerUpdateNewScObjectCache(IR::Instr * insertInstr, IR::Opnd *dst, IR: if (!src1->IsRegOpnd()) { IR::RegOpnd *srcRegOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - LowererMD::CreateAssign(srcRegOpnd, src1, insertInstr); + Lowerer::InsertMove(srcRegOpnd, src1, insertInstr); src1 = srcRegOpnd; } @@ -5095,7 +5099,7 @@ Lowerer::LowerUpdateNewScObjectCache(IR::Instr * insertInstr, IR::Opnd *dst, IR: // MOV r1, [src1 + offset(type)] -- check base TypeIds_Function IR::RegOpnd *r1 = IR::RegOpnd::New(TyMachReg, this->m_func); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(src1->AsRegOpnd(), Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); - LowererMD::CreateAssign(r1, indirOpnd, insertInstr); + Lowerer::InsertMove(r1, indirOpnd, insertInstr); // CMP [r1 + offset(typeId)], TypeIds_Function // JNE $fallThru @@ -5108,12 +5112,12 @@ Lowerer::LowerUpdateNewScObjectCache(IR::Instr * insertInstr, IR::Opnd *dst, IR: // r2 = MOV JavascriptFunction->constructorCache IR::RegOpnd *r2 = IR::RegOpnd::New(TyVar, this->m_func); IR::IndirOpnd *opndIndir = IR::IndirOpnd::New(src1->AsRegOpnd(), Js::JavascriptFunction::GetOffsetOfConstructorCache(), TyMachReg, this->m_func); - IR::Instr *instr = LowererMD::CreateAssign(r2, opndIndir, insertInstr); + IR::Instr *instr = Lowerer::InsertMove(r2, opndIndir, insertInstr); // r3 = constructorCache->updateAfterCtor IR::RegOpnd *r3 = IR::RegOpnd::New(TyInt8, this->m_func); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(r2, Js::ConstructorCache::GetOffsetOfUpdateAfterCtor(), TyUint8, this->m_func); - instr = LowererMD::CreateAssign(r3, indirOpnd, insertInstr); + instr = Lowerer::InsertMove(r3, indirOpnd, insertInstr); // TEST r3, r3 -- check if updateAfterCtor is 0 // JEQ $fallThru @@ -5225,8 +5229,8 @@ Lowerer::LowerNewScObjArray(IR::Instr *newObjInstr) const uint16 upperBoundValue = 8; // Generate fast path only if it meets all the conditions: // 1. It is the only parameter - // 2a. If 1st paramter is a variable, emit fast path with checks - // 2b. If 1st paramter is a constant, it is in range 0 and upperBoundValue (inclusive) + // 2a. If 1st parameter is a variable, emit fast path with checks + // 2b. If 1st parameter is a constant, it is in range 0 and upperBoundValue (inclusive) if (opndOfArrayCtor->IsAddrOpnd() || opndOfArrayCtor->IsRegOpnd()) // #1 { @@ -5236,7 +5240,7 @@ Lowerer::LowerNewScObjArray(IR::Instr *newObjInstr) linkOpnd = argInstr->GetSrc2(); bool emittedFastPath = true; - // 2a. If 1st paramter is a variable, emit fast path with checks + // 2a. If 1st parameter is a variable, emit fast path with checks if (opndOfArrayCtor->IsRegOpnd()) { // 3. GenerateFastPath @@ -5257,7 +5261,7 @@ Lowerer::LowerNewScObjArray(IR::Instr *newObjInstr) GenerateProfiledNewScObjArrayFastPath(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, helperLabel, labelDone, opndOfArrayCtor, 0, 0); } } - // 2b. If 1st paramter is a constant, it is in range 0 and upperBoundValue (inclusive) + // 2b. If 1st parameter is a constant, it is in range 0 and upperBoundValue (inclusive) else { int32 length = linkSym->GetIntConstValue(); @@ -5303,11 +5307,11 @@ Lowerer::LowerNewScObjArray(IR::Instr *newObjInstr) labelDone, insertInstr); // We know we have a native array, so store the weak ref and call site index. - m_lowererMD.CreateAssign( + InsertMove( IR::IndirOpnd::New(resultObjOpnd, Js::JavascriptNativeArray::GetOffsetOfArrayCallSiteIndex(), TyUint16, func), IR::Opnd::CreateProfileIdOpnd(profileId, func), insertInstr); - m_lowererMD.CreateAssign( + InsertMove( IR::IndirOpnd::New(resultObjOpnd, Js::JavascriptNativeArray::GetOffsetOfWeakFuncRef(), TyMachReg, func), IR::AddrOpnd::New(weakFuncRef, IR::AddrOpndKindDynamicFunctionBodyWeakRef, func), insertInstr); @@ -5431,7 +5435,7 @@ Lowerer::LowerPrologEpilogAsmJs() instr = m_func->m_headInstr; AssertMsg(instr->IsEntryInstr(), "First instr isn't an EntryInstr..."); - m_lowererMD.LowerEntryInstrAsmJs(instr->AsEntryInstr()); + m_lowererMD.LowerEntryInstr(instr->AsEntryInstr()); instr = m_func->m_exitInstr; AssertMsg(instr->IsExitInstr(), "Last instr isn't an ExitInstr..."); @@ -6236,7 +6240,7 @@ Lowerer::LowerAdjustObjType(IR::Instr * instrAdjustObjType) this->m_func->PinTypeRef((JITType*)finalTypeOpnd->m_metadata); IR::Opnd *opnd = IR::IndirOpnd::New(baseOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, instrAdjustObjType->m_func); - this->m_lowererMD.CreateAssign(opnd, finalTypeOpnd, instrAdjustObjType); + this->InsertMove(opnd, finalTypeOpnd, instrAdjustObjType); initialTypeOpnd->Free(instrAdjustObjType->m_func); instrAdjustObjType->Remove(); @@ -6612,8 +6616,7 @@ Lowerer::LowerScopedLdInst(IR::Instr *instr, IR::JnHelperMethod helperMethod) // __out Var*. The StackSym is allocated in irbuilder, and here we need to insert a lea StackSym* dstSym = src->GetStackSym(); - IR::Instr *load = m_lowererMD.LoadStackAddress(dstSym); - instr->InsertBefore(load); + IR::Instr *load = InsertLoadStackAddress(dstSym, instr); IR::Opnd* tempOpnd = load->GetDst(); m_lowererMD.LoadHelperArgument(instr, tempOpnd); @@ -6633,7 +6636,7 @@ Lowerer::LowerScopedLdInst(IR::Instr *instr, IR::JnHelperMethod helperMethod) IR::RegOpnd* regOpnd = IR::RegOpnd::New(dstSym, TyVar, m_func); IR::SymOpnd*symOpnd = IR::SymOpnd::New(dstSym, TyVar, m_func); - this->m_lowererMD.CreateAssign(regOpnd, symOpnd, instrPrev); + this->InsertMove(regOpnd, symOpnd, instrPrev); return instrPrev; } @@ -6903,7 +6906,7 @@ Lowerer::GenerateDirectFieldStore(IR::Instr* instrStFld, IR::PropertySymOpnd* pr opnd = IR::MemRefOpnd::New((char*)opndSlotArray->AsMemRefOpnd()->GetMemLoc() + (index * sizeof(Js::Var)), TyMachReg, func); } - this->m_lowererMD.CreateAssign(opnd, instrStFld->GetSrc1(), instrStFld); + this->InsertMove(opnd, instrStFld->GetSrc1(), instrStFld); #endif } @@ -7178,7 +7181,7 @@ Lowerer::GenerateCachedTypeCheck(IR::Instr *instrChk, IR::PropertySymOpnd *prope { sourceType = IR::IndirOpnd::New(regOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, func); } - m_lowererMD.CreateAssign(typeOpnd, sourceType, instrChk); + InsertMove(typeOpnd, sourceType, instrChk); if (doEquivTypeCheck) { @@ -7289,7 +7292,7 @@ Lowerer::GenerateCachedTypeWithoutPropertyCheck(IR::Instr *instrInsert, IR::Prop } IR::Opnd *opnd = IR::IndirOpnd::New(baseOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); typeOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - m_lowererMD.CreateAssign(typeOpnd, opnd, instrInsert); + InsertMove(typeOpnd, opnd, instrInsert); } Js::JitTypePropertyGuard* typePropertyGuard = CreateTypePropertyGuardForGuardedProperties(typeWithoutProperty, propertySymOpnd); @@ -7430,6 +7433,21 @@ Lowerer::CreateEquivalentTypeGuardAndLinkToGuardedProperties(JITTypeHolder type, cache->types[ti] = (Js::Type*)typeSet->GetType(ti)->GetAddr(); } +#ifdef DEBUG + bool there_was_a_null_type = false; + for (uint16 ti = 0; ti < cachedTypeCount; ti++) + { + if (cache->types[ti] == nullptr) + { + there_was_a_null_type = true; + } + else if (there_was_a_null_type) + { + AssertMsg(false, "there_was_a_null_type ? something is wrong here."); + } + } +#endif + // Populate property ID and slot index arrays on the guard's cache. We iterate over the // bit vector of property operations protected by this guard, but some property operations // may be referring to the same property ID (but not share the same cache). We skip @@ -7634,7 +7652,7 @@ Lowerer::GeneratePropertyGuardCheckBailoutAndLoadType(IR::Instr *insertInstr) insertInstr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelContinue, this->m_func)); insertInstr->InsertBefore(loadNumberTypeLabel); - this->m_lowererMD.CreateAssign(insertInstr->GetDst(), numberTypeOpnd, insertInstr); + this->InsertMove(insertInstr->GetDst(), numberTypeOpnd, insertInstr); insertInstr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelContinue, this->m_func)); insertInstr->InsertBefore(labelBailout); @@ -7666,7 +7684,7 @@ Lowerer::GenerateNonWritablePropertyCheck(IR::Instr *instrInsert, IR::PropertySy IR::RegOpnd *typeOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); opnd = IR::MemRefOpnd::New((char*)protoAddr + Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func, IR::AddrOpndKindDynamicObjectTypeRef); - m_lowererMD.CreateAssign(typeOpnd, opnd, instrInsert); + InsertMove(typeOpnd, opnd, instrInsert); // TEST [s1->areThisAndPrototypesEnsuredToHaveOnlyWritableDataProperties].u8, 1 // JNE $continue @@ -7764,7 +7782,7 @@ Lowerer::GenerateFieldStoreWithTypeChange(IR::Instr * instrStFld, IR::PropertySy // Set the new type. IR::RegOpnd *baseOpnd = propertySymOpnd->CreatePropertyOwnerOpnd(instrStFld->m_func); IR::Opnd *opnd = IR::IndirOpnd::New(baseOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, instrStFld->m_func); - this->m_lowererMD.CreateAssign(opnd, finalTypeOpnd, instrStFld); + this->InsertMove(opnd, finalTypeOpnd, instrStFld); // Now do the store. GenerateDirectFieldStore(instrStFld, propertySymOpnd); @@ -7896,8 +7914,7 @@ Lowerer::LoadHelperTemp(IR::Instr * instr, IR::Instr * instrInsert) Assert(dst->IsRegOpnd()); StackSym * tempNumberSym = this->GetTempNumberSym(dst, instr->dstIsTempNumberTransferred); - IR::Instr *load = this->m_lowererMD.LoadStackAddress(tempNumberSym); - instrInsert->InsertBefore(load); + IR::Instr *load = InsertLoadStackAddress(tempNumberSym, instrInsert); tempOpnd = load->GetDst(); m_lowererMD.LoadHelperArgument(instrInsert, tempOpnd); return load; @@ -7943,7 +7960,7 @@ Lowerer::LoadStackArgPtr(IR::Instr *const instr) const auto firstRealArgStackSym = instr->m_func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); this->m_func->SetArgOffset(firstRealArgStackSym, firstRealArgStackSym->m_offset + MachPtr); instr->SetSrc1(IR::SymOpnd::New(firstRealArgStackSym, TyMachPtr, instr->m_func)); - LowererMD::ChangeToLea(instr); + ChangeToLea(instr); } else { @@ -7951,6 +7968,14 @@ Lowerer::LoadStackArgPtr(IR::Instr *const instr) } } +IR::Instr * +Lowerer::InsertLoadStackAddress(StackSym *sym, IR::Instr * instrInsert, IR::RegOpnd *optionalDstOpnd /* = nullptr */) +{ + IR::RegOpnd * regDst = optionalDstOpnd != nullptr ? optionalDstOpnd : IR::RegOpnd::New(TyMachReg, this->m_func); + IR::SymOpnd * symSrc = IR::SymOpnd::New(sym, TyMachPtr, this->m_func); + return InsertLea(regDst, symSrc, instrInsert); +} + void Lowerer::LoadArgumentsFromFrame(IR::Instr *const instr) { @@ -7983,7 +8008,7 @@ Lowerer::LowerCheckWasmSignature(IR::Instr * instr) IR::Instr *instrPrev = instr->m_prev; - IR::IndirOpnd * actualSig = IR::IndirOpnd::New(instr->UnlinkSrc1()->AsRegOpnd(), Js::AsmJsScriptFunction::GetOffsetOfSignature(), TyMachReg, m_func); + IR::IndirOpnd * actualSig = IR::IndirOpnd::New(instr->UnlinkSrc1()->AsRegOpnd(), Js::WasmScriptFunction::GetOffsetOfSignature(), TyMachReg, m_func); Wasm::WasmSignature * expectedSig = m_func->GetJITFunctionBody()->GetAsmJsInfo()->GetWasmSignature(sigId); if (expectedSig->GetShortSig() == Js::Constants::InvalidSignature) @@ -8118,7 +8143,7 @@ Lowerer::LowerUnaryHelperMemWithFuncBody(IR::Instr *instr, IR::JnHelperMethod he IR::Instr * Lowerer::LowerBinaryHelperMemWithFuncBody(IR::Instr *instr, IR::JnHelperMethod helperMethod) { - AssertMsg(Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg1Int2, "Expected a binary instruction..."); + AssertMsg(Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg3, "Expected a binary instruction..."); m_lowererMD.LoadHelperArgument(instr, this->LoadFunctionBodyOpnd(instr)); return this->LowerBinaryHelperMem(instr, helperMethod); @@ -8205,7 +8230,6 @@ Lowerer::LowerBinaryHelper(IR::Instr *instr, IR::JnHelperMethod helperMethod) AssertMsg((Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg1Unsigned1 && !instr->GetDst()) || Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg3 || Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg2Int1 || - Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg1Int2 || Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::ElementU || instr->m_opcode == Js::OpCode::InvalCachedScope, "Expected a binary instruction..."); @@ -8229,7 +8253,6 @@ Lowerer::LowerBinaryHelperMem(IR::Instr *instr, IR::JnHelperMethod helperMethod) AssertMsg(Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg3 || Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg2Int1 || - Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg1Int2 || Js::OpCodeUtil::GetOpCodeLayout(instr->m_opcode) == Js::OpLayoutType::Reg1Unsigned1, "Expected a binary instruction..."); instrPrev = LoadScriptContext(instr); @@ -8369,12 +8392,12 @@ Lowerer::LowerAddLeftDeadForString(IR::Instr *instr) Js::OpCode::BrNeq_A, labelHelper, insertBeforeInstr); // if lastBlockInfo.charLength < lastBlockInfo.charCapacity - IR::IndirOpnd *indirCharLength = IR::IndirOpnd::New(opndLeft->AsRegOpnd(), (int32)Js::CompoundString::GetOffsetOfLastBlockInfo()+ (int32)Js::CompoundString::GetOffsetOfLastBlockInfoCharLength(), TyMachPtr, m_func); + IR::IndirOpnd *indirCharLength = IR::IndirOpnd::New(opndLeft->AsRegOpnd(), (int32)Js::CompoundString::GetOffsetOfLastBlockInfo() + (int32)Js::CompoundString::GetOffsetOfLastBlockInfoCharLength(), TyUint32, m_func); IR::RegOpnd *charLengthOpnd = IR::RegOpnd::New(TyUint32, this->m_func); InsertMove(charLengthOpnd, indirCharLength, insertBeforeInstr); - InsertCompareBranch(charLengthOpnd, IR::IndirOpnd::New(opndLeft->AsRegOpnd(), (int32)Js::CompoundString::GetOffsetOfLastBlockInfo() + (int32)Js::CompoundString::GetOffsetOfLastBlockInfoCharCapacity(), TyMachPtr, m_func), Js::OpCode::BrGe_A, labelHelper, insertBeforeInstr); + InsertCompareBranch(charLengthOpnd, IR::IndirOpnd::New(opndLeft->AsRegOpnd(), (int32)Js::CompoundString::GetOffsetOfLastBlockInfo() + (int32)Js::CompoundString::GetOffsetOfLastBlockInfoCharCapacity(), TyUint32, m_func), Js::OpCode::BrGe_A, labelHelper, insertBeforeInstr); - // load c= right->m_pszValue[0] + // load c = right->m_pszValue[0] IR::RegOpnd *pszValue0Opnd = IR::RegOpnd::New(TyMachPtr, this->m_func); IR::IndirOpnd *indirRightPszOpnd = IR::IndirOpnd::New(opndRight->AsRegOpnd(), offsetof(Js::JavascriptString, m_pszValue), TyMachPtr, this->m_func); InsertMove(pszValue0Opnd, indirRightPszOpnd, insertBeforeInstr); @@ -8909,16 +8932,7 @@ Lowerer::LowerLdArrViewElem(IR::Instr * instr) } done = instr; } - if (dst->IsInt64()) - { - IR::Instr* movInt64 = IR::Instr::New(Js::OpCode::Ld_I4, dst, src1, m_func); - done->InsertBefore(movInt64); - m_lowererMD.LowerInt64Assign(movInt64); - } - else - { - InsertMove(dst, src1, done); - } + InsertMove(dst, src1, done); instr->Remove(); return instrPrev; @@ -8966,22 +8980,14 @@ Lowerer::LowerLdArrViewElemWasm(IR::Instr * instr) Assert(!dst->IsFloat64() || src1->IsFloat64()); IR::Instr * done = LowerWasmMemOp(instr, src1); - IR::Instr* newMove = nullptr; - if (dst->IsInt64()) - { - IR::Instr* movInt64 = IR::Instr::New(Js::OpCode::Ld_I4, dst, src1, m_func); - done->InsertBefore(movInt64); - newMove = m_lowererMD.LowerInt64Assign(movInt64); - } - else - { - newMove = InsertMove(dst, src1, done); - } + IR::Instr* newMove = InsertMove(dst, src1, done); #if ENABLE_FAST_ARRAYBUFFER // We need to have an AV when accessing out of bounds memory even if the dst is not used // Make sure LinearScan doesn't dead store this instruction newMove->hasSideEffects = true; +#else + Unused(newMove); #endif instr->Remove(); return instrPrev; @@ -9200,16 +9206,8 @@ Lowerer::LowerStArrViewElem(IR::Instr * instr) instr->FreeSrc2(); } } - if (src1->IsInt64()) - { - IR::Instr* movInt64 = IR::Instr::New(Js::OpCode::Ld_I4, dst, src1, m_func); - done->InsertBefore(movInt64); - m_lowererMD.LowerInt64Assign(movInt64); - } - else - { - InsertMove(dst, src1, done); - } + InsertMove(dst, src1, done); + instr->Remove(); return instrPrev; #else @@ -9528,7 +9526,7 @@ IR::Instr* Lowerer::LowerMultiBr(IR::Instr * instr, IR::JnHelperMethod helperMet instrCall = m_lowererMD.LowerCall(instrCall, 0); instr->SetSrc1(instrCall->GetDst()); - m_lowererMD.LowerMultiBranch(instr); + instr->m_opcode = LowererMD::MDMultiBranchOpcode; return instrPrev; } @@ -9543,7 +9541,7 @@ Lowerer::LowerJumpTableMultiBranch(IR::MultiBranchInstr * multiBrInstr, IR::RegO nativeJumpTableLabel->m_isDataLabel = true; IR::LabelOpnd * nativeJumpTable = IR::LabelOpnd::New(nativeJumpTableLabel, m_func); IR::RegOpnd * nativeJumpTableReg = IR::RegOpnd::New(TyMachPtr, func); - m_lowererMD.CreateAssign(nativeJumpTableReg, nativeJumpTable, multiBrInstr); + InsertMove(nativeJumpTableReg, nativeJumpTable, multiBrInstr); BranchJumpTableWrapper * branchJumpTable = multiBrInstr->GetBranchJumpTable(); AssertMsg(branchJumpTable->labelInstr == nullptr, "Should not be already assigned"); @@ -9554,13 +9552,13 @@ Lowerer::LowerJumpTableMultiBranch(IR::MultiBranchInstr * multiBrInstr, IR::RegO BYTE indirScale = this->m_lowererMD.GetDefaultIndirScale(); IR::Opnd * opndSrc = IR::IndirOpnd::New(nativeJumpTableReg, indexOpnd, indirScale, TyMachReg, this->m_func); - IR::Instr * indirInstr = m_lowererMD.CreateAssign(opndDst, opndSrc, multiBrInstr); + IR::Instr * indirInstr = InsertMove(opndDst, opndSrc, multiBrInstr); //MultiBr eax multiBrInstr->SetSrc1(indirInstr->GetDst()); //Jump to the address at the target location in the jump table - m_lowererMD.LowerMultiBranch(multiBrInstr); + multiBrInstr->m_opcode = LowererMD::MDMultiBranchOpcode; } ///---------------------------------------------------------------------------- @@ -10132,14 +10130,7 @@ Lowerer::LowerStSlot(IR::Instr *instr) dstOpnd->Free(this->m_func); instr->SetDst(dstNew); - if (instr->GetDst() && instr->GetDst()->IsInt64()) - { - m_lowererMD.LowerInt64Assign(instr); - } - else - { - instr = m_lowererMD.ChangeToWriteBarrierAssign(instr, this->m_func); - } + instr = m_lowererMD.ChangeToWriteBarrierAssign(instr, this->m_func); return instr; } @@ -10187,14 +10178,7 @@ Lowerer::LowerLdSlot(IR::Instr *instr) srcOpnd->Free(this->m_func); instr->SetSrc1(srcNew); - if (instr->GetDst() && instr->GetDst()->IsInt64()) - { - m_lowererMD.LowerInt64Assign(instr); - } - else - { - m_lowererMD.ChangeToAssign(instr); - } + m_lowererMD.ChangeToAssign(instr); } IR::Instr * @@ -10653,9 +10637,8 @@ Lowerer::LowerArgIn(IR::Instr *instrArgIn) labelNormal = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); labelInit = labelNormal; - instrBranch = IR::BranchInstr::New(Js::OpCode::Br, labelNormal, this->m_func); + instrBranch = IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelNormal, this->m_func); instrInsert->InsertBefore(instrBranch); - this->m_lowererMD.LowerUncondBranch(instrBranch); // Insert the labels @@ -10676,7 +10659,7 @@ Lowerer::LowerArgIn(IR::Instr *instrArgIn) // MOV undefReg, undefAddress IR::Opnd* opndUndefAddress = this->LoadLibraryValueOpnd(labelNormal, LibraryValue::ValueUndefined); opndUndef = IR::RegOpnd::New(TyMachPtr, this->m_func); - LowererMD::CreateAssign(opndUndef, opndUndefAddress, labelNormal); + Lowerer::InsertMove(opndUndef, opndUndefAddress, labelNormal); BVSparse *formalsBv = JitAnew(this->m_alloc, BVSparse, this->m_alloc); @@ -10691,7 +10674,7 @@ Lowerer::LowerArgIn(IR::Instr *instrArgIn) // sn = assign undef - LowererMD::CreateAssign(dstOpnd, opndUndef, labelNormal); + Lowerer::InsertMove(dstOpnd, opndUndef, labelNormal); // INC excessOpnd // BrEq_A $Ln-1 @@ -10760,7 +10743,7 @@ Lowerer::LowerArgIn(IR::Instr *instrArgIn) Assert(dstOpnd->IsRegOpnd()); isDuplicate = formalsBv->TestAndSet(dstOpnd->AsRegOpnd()->m_sym->AsStackSym()->m_id); - LowererMD::CreateAssign(dstOpnd, opndUndef, labelNormal); + Lowerer::InsertMove(dstOpnd, opndUndef, labelNormal); if (hasRest) { @@ -10770,9 +10753,8 @@ Lowerer::LowerArgIn(IR::Instr *instrArgIn) // Br $done labelDone = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); - instrBranch = IR::BranchInstr::New(Js::OpCode::Br, labelDone, this->m_func); + instrBranch = IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelDone, this->m_func); labelNormal->InsertBefore(instrBranch); - this->m_lowererMD.LowerUncondBranch(instrBranch); // s2 = assign param2 // $done: @@ -10829,7 +10811,7 @@ Lowerer::LoadGeneratorArgsPtr(IR::Instr *instrInsert) IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(generatorRegOpnd, Js::JavascriptGenerator::GetArgsPtrOffset(), TyMachPtr, instrInsert->m_func); IR::RegOpnd * argsPtrOpnd = IR::RegOpnd::New(TyMachReg, instrInsert->m_func); - LowererMD::CreateAssign(argsPtrOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(argsPtrOpnd, indirOpnd, instrInsert); return argsPtrOpnd; } @@ -10841,7 +10823,7 @@ Lowerer::LoadGeneratorObject(IR::Instr * instrInsert) IR::SymOpnd * generatorSymOpnd = IR::SymOpnd::New(generatorSym, TyMachPtr, instrInsert->m_func); IR::RegOpnd * generatorRegOpnd = IR::RegOpnd::New(TyMachPtr, instrInsert->m_func); instrInsert->m_func->SetHasImplicitParamLoad(); - return LowererMD::CreateAssign(generatorRegOpnd, generatorSymOpnd, instrInsert); + return Lowerer::InsertMove(generatorRegOpnd, generatorSymOpnd, instrInsert); } IR::Instr * @@ -10851,16 +10833,7 @@ Lowerer::LowerArgInAsmJs(IR::Instr * instr) Assert(instr && instr->m_opcode == Js::OpCode::ArgIn_A); IR::Instr* instrPrev = instr->m_prev; -#ifdef _M_IX86 - if (instr->GetDst()->IsInt64()) - { - m_lowererMD.LowerInt64Assign(instr); - } - else -#endif - { - m_lowererMD.ChangeToAssign(instr); - } + m_lowererMD.ChangeToAssign(instr); return instrPrev; } @@ -11235,22 +11208,22 @@ Lowerer::GenerateFastInlineBuiltInMathRandom(IR::Instr* instr) // s0 = scriptContext->GetLibrary()->GetRandSeed1(); // s1 = scriptContext->GetLibrary()->GetRandSeed0(); // =========================================================== - this->m_lowererMD.CreateAssign(r0, + this->InsertMove(r0, IR::MemRefOpnd::New((BYTE*)m_func->GetScriptContextInfo()->GetLibraryAddr() + Js::JavascriptLibrary::GetRandSeed1Offset(), TyUint64, instr->m_func), instr); - this->m_lowererMD.CreateAssign(r1, + this->InsertMove(r1, IR::MemRefOpnd::New((BYTE*)m_func->GetScriptContextInfo()->GetLibraryAddr() + Js::JavascriptLibrary::GetRandSeed0Offset(), TyUint64, instr->m_func), instr); // =========================================================== // s1 ^= s1 << 23; // =========================================================== - this->m_lowererMD.CreateAssign(r3, r1, instr); + this->InsertMove(r3, r1, instr); this->InsertShift(Js::OpCode::Shl_A, false, r3, r3, IR::IntConstOpnd::New(23, TyInt8, m_func), instr); this->InsertXor(r1, r1, r3, instr); // =========================================================== // s1 ^= s1 >> 17; // =========================================================== - this->m_lowererMD.CreateAssign(r3, r1, instr); + this->InsertMove(r3, r1, instr); this->InsertShift(Js::OpCode::ShrU_A, false, r3, r3, IR::IntConstOpnd::New(17, TyInt8, m_func), instr); this->InsertXor(r1, r1, r3, instr); @@ -11262,7 +11235,7 @@ Lowerer::GenerateFastInlineBuiltInMathRandom(IR::Instr* instr) // =========================================================== // s1 ^= s0 >> 26; // =========================================================== - this->m_lowererMD.CreateAssign(r3, r0, instr); + this->InsertMove(r3, r0, instr); this->InsertShift(Js::OpCode::ShrU_A, false, r3, r3, IR::IntConstOpnd::New(26, TyInt8, m_func), instr); this->InsertXor(r1, r1, r3, instr); @@ -11270,25 +11243,25 @@ Lowerer::GenerateFastInlineBuiltInMathRandom(IR::Instr* instr) // scriptContext->GetLibrary()->SetRandSeed0(s0); // scriptContext->GetLibrary()->SetRandSeed1(s1); // =========================================================== - this->m_lowererMD.CreateAssign( + this->InsertMove( IR::MemRefOpnd::New((BYTE*)m_func->GetScriptContextInfo()->GetLibraryAddr() + Js::JavascriptLibrary::GetRandSeed0Offset(), TyUint64, m_func), r0, instr); - this->m_lowererMD.CreateAssign( + this->InsertMove( IR::MemRefOpnd::New((BYTE*)m_func->GetScriptContextInfo()->GetLibraryAddr() + Js::JavascriptLibrary::GetRandSeed1Offset(), TyUint64, m_func), r1, instr); // =========================================================== // dst = bit_cast(((s0 + s1) & mMant) | mExp); // =========================================================== this->InsertAdd(false, r1, r1, r0, instr); - this->m_lowererMD.CreateAssign(r3, IR::IntConstOpnd::New(mMant, TyInt64, m_func, true), instr); + this->InsertMove(r3, IR::IntConstOpnd::New(mMant, TyInt64, m_func, true), instr); this->InsertAnd(r1, r1, r3, instr); - this->m_lowererMD.CreateAssign(r3, IR::IntConstOpnd::New(mExp, TyInt64, m_func, true), instr); + this->InsertMove(r3, IR::IntConstOpnd::New(mExp, TyInt64, m_func, true), instr); this->InsertOr(r1, r1, r3, instr); this->InsertMoveBitCast(dst, r1, instr); // =================================================================== // dst -= 1.0; // =================================================================== - this->m_lowererMD.CreateAssign(r4, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetDoubleOnePointZeroAddr(), TyFloat64, m_func, IR::AddrOpndKindDynamicDoubleRef), instr); + this->InsertMove(r4, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetDoubleOnePointZeroAddr(), TyFloat64, m_func, IR::AddrOpndKindDynamicDoubleRef), instr); this->InsertSub(false, dst, dst, r4, instr); } else @@ -11445,6 +11418,7 @@ Lowerer::LowerCondBranchCheckBailOut(IR::BranchInstr * branchInstr, IR::Instr * Assert(branchInstr->m_opcode == Js::OpCode::BrTrue_A || branchInstr->m_opcode == Js::OpCode::BrFalse_A); if (branchInstr->HasBailOutInfo()) { +#ifdef ENABLE_SCRIPT_DEBUGGING IR::BailOutKind debuggerBailOutKind = IR::BailOutInvalid; if (branchInstr->HasAuxBailOut()) { @@ -11455,10 +11429,12 @@ Lowerer::LowerCondBranchCheckBailOut(IR::BranchInstr * branchInstr, IR::Instr * debuggerBailOutKind = branchInstr->GetAuxBailOutKind() & IR::BailOutForDebuggerBits; AssertMsg((debuggerBailOutKind & ~(IR::BailOutIgnoreException | IR::BailOutForceByFlag)) == 0, "Only IR::BailOutIgnoreException|ForceByFlag supported here."); } +#endif IR::Instr * bailOutInstr = this->SplitBailOnImplicitCall(branchInstr, helperCall, branchInstr); IR::Instr* prevInstr = this->LowerBailOnEqualOrNotEqual(bailOutInstr, branchInstr, nullptr, nullptr, isHelper); +#ifdef ENABLE_SCRIPT_DEBUGGING if (debuggerBailOutKind != IR::BailOutInvalid) { // Note that by this time implicit calls bailout is already lowered. @@ -11485,6 +11461,9 @@ Lowerer::LowerCondBranchCheckBailOut(IR::BranchInstr * branchInstr, IR::Instr * this->LowerBailForDebugger(debuggerBailoutInstr, isHelper); // After lowering this we will have a check which on bailout condition will JMP to $L11. } +#else + (prevInstr); +#endif } return m_lowererMD.LowerCondBranch(branchInstr); @@ -11504,11 +11483,11 @@ Lowerer::LoadCallInfo(IR::Instr * instrInsert) IR::RegOpnd * generatorRegOpnd = genLoadInstr->GetDst()->AsRegOpnd(); IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(generatorRegOpnd, Js::JavascriptGenerator::GetCallInfoOffset(), TyMachPtr, func); - IR::Instr * instr = LowererMD::CreateAssign(IR::RegOpnd::New(TyMachPtr, func), indirOpnd, instrInsert); + IR::Instr * instr = Lowerer::InsertMove(IR::RegOpnd::New(TyMachPtr, func), indirOpnd, instrInsert); StackSym * callInfoSym = StackSym::New(TyMachReg, func); IR::SymOpnd * callInfoSymOpnd = IR::SymOpnd::New(callInfoSym, TyMachReg, func); - LowererMD::CreateAssign(callInfoSymOpnd, instr->GetDst(), instrInsert); + Lowerer::InsertMove(callInfoSymOpnd, instr->GetDst(), instrInsert); srcOpnd = IR::SymOpnd::New(callInfoSym, TyMachReg, func); } @@ -11560,6 +11539,7 @@ Lowerer::LowerBailOnNotStackArgs(IR::Instr * instr) { //BailOut if the number of actuals (except "this" argument) is greater than or equal to 15. IR::RegOpnd* ldLenDstOpnd = IR::RegOpnd::New(TyUint32, instr->m_func); + const IR::AutoReuseOpnd autoReuseldLenDstOpnd(ldLenDstOpnd, instr->m_func); IR::Instr* ldLen = IR::Instr::New(Js::OpCode::LdLen_A, ldLenDstOpnd, instr->m_func); ldLenDstOpnd->SetValueType(ValueType::GetTaggedInt()); //LdLen_A works only on stack arguments instr->InsertBefore(ldLen); @@ -11589,7 +11569,7 @@ Lowerer::LowerBailOnNotSpreadable(IR::Instr *instr) if (!arraySrcOpnd->IsRegOpnd()) { arrayOpnd = IR::RegOpnd::New(TyMachPtr, func); - LowererMD::CreateAssign(arrayOpnd, arraySrcOpnd, instr); + Lowerer::InsertMove(arrayOpnd, arraySrcOpnd, instr); } else { @@ -11836,6 +11816,7 @@ Lowerer::LowerBailOnNotBuiltIn(IR::Instr *instr, return prevInstr; } +#ifdef ENABLE_SCRIPT_DEBUGGING IR::Instr * Lowerer::LowerBailForDebugger(IR::Instr* instr, bool isInsideHelper /* = false */) { @@ -12013,6 +11994,7 @@ Lowerer::LowerBailForDebugger(IR::Instr* instr, bool isInsideHelper /* = false * return prevInstr; } +#endif IR::Instr* Lowerer::LowerBailOnException(IR::Instr * instr) @@ -12626,7 +12608,7 @@ Lowerer::GetFuncObjectOpnd(IR::Instr* insertBeforeInstr) } else { -#if defined(_M_ARM) +#if defined(_M_ARM32_OR_ARM64) StackSym * paramSym = this->m_lowererMD.GetImplicitParamSlotSym(0); #else StackSym *paramSym = StackSym::New(TyMachReg, this->m_func); @@ -12643,7 +12625,7 @@ Lowerer::GetFuncObjectOpnd(IR::Instr* insertBeforeInstr) // assigning to the dst Assert(!func->IsInlinee()); IR::RegOpnd *tmpOpnd = IR::RegOpnd::New(TyMachReg, func); - LowererMD::CreateAssign(tmpOpnd, paramOpnd, insertBeforeInstr); + Lowerer::InsertMove(tmpOpnd, paramOpnd, insertBeforeInstr); paramOpnd = IR::IndirOpnd::New(tmpOpnd, Js::GeneratorVirtualScriptFunction::GetRealFunctionOffset(), TyMachPtr, func); } @@ -12836,7 +12818,7 @@ Lowerer::SplitBailOnImplicitCall(IR::Instr *& instr) const IR::AutoReuseOpnd autoReuseNoImplicitCall(noImplicitCall, instr->m_func); // Reset the implicit call flag on every helper call - LowererMD::CreateAssign(implicitCallFlags, noImplicitCall, instr); + Lowerer::InsertMove(implicitCallFlags, noImplicitCall, instr); IR::Instr *disableImplicitCallsInstr = nullptr, *enableImplicitCallsInstr = nullptr; if(bailOutKind == IR::BailOutOnImplicitCallsPreOp) @@ -12899,7 +12881,7 @@ Lowerer::SplitBailOnImplicitCall(IR::Instr * instr, IR::Instr * helperCall, IR:: const IR::AutoReuseOpnd autoReuseNoImplicitCall(noImplicitCall, instr->m_func); // Reset the implicit call flag on every helper call - LowererMD::CreateAssign(implicitCallFlags, noImplicitCall, helperCall->m_prev); + Lowerer::InsertMove(implicitCallFlags, noImplicitCall, helperCall->m_prev); BailOutInfo * bailOutInfo = instr->GetBailOutInfo(); if (bailOutInfo->bailOutInstr == instr) @@ -13132,7 +13114,7 @@ Lowerer::GenerateObjectTestAndTypeLoad(IR::Instr *instrLdSt, IR::RegOpnd *opndBa } opndIndir = IR::IndirOpnd::New(opndBase, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); - m_lowererMD.CreateAssign(opndType, opndIndir, instrLdSt); + InsertMove(opndType, opndIndir, instrLdSt); } IR::LabelInstr * @@ -13185,7 +13167,7 @@ Lowerer::GenerateBailOut(IR::Instr * instr, IR::BranchInstr * branchInstr, IR::L IR::MemRefOpnd::New((BYTE*)bailOutInfo->bailOutRecord + BailOutRecord::GetOffsetOfBailOutKind(), TyUint32, this->m_func, IR::AddrOpndKindDynamicBailOutKindRef); } - m_lowererMD.CreateAssign( + InsertMove( indexOpndForBailOutKind, IR::IntConstOpnd::New(instr->GetBailOutKind(), indexOpndForBailOutKind->GetType(), this->m_func), instr, false); // No point in doing this for BailOutFailedEquivalentTypeCheck or BailOutFailedEquivalentFixedFieldTypeCheck, @@ -13207,7 +13189,7 @@ Lowerer::GenerateBailOut(IR::Instr * instr, IR::BranchInstr * branchInstr, IR::L indexOpnd = IR::MemRefOpnd::New((BYTE*)bailOutInfo->bailOutRecord + BailOutRecord::GetOffsetOfPolymorphicCacheIndex(), TyUint32, this->m_func); } - m_lowererMD.CreateAssign( + InsertMove( indexOpnd, IR::IntConstOpnd::New(bailOutInfo->polymorphicCacheIndex, TyUint32, this->m_func), instr, false); } @@ -13222,7 +13204,7 @@ Lowerer::GenerateBailOut(IR::Instr * instr, IR::BranchInstr * branchInstr, IR::L { functionBodyOpnd = IR::MemRefOpnd::New((BYTE*)bailOutInfo->bailOutRecord + SharedBailOutRecord::GetOffsetOfFunctionBody(), TyMachPtr, this->m_func); } - m_lowererMD.CreateAssign( + InsertMove( functionBodyOpnd, CreateFunctionBodyOpnd(instr->m_func), instr, false); } @@ -13530,14 +13512,14 @@ Lowerer::GenerateFastCondBranch(IR::BranchInstr * instrBranch, bool *pIsHelper) return true; } -void +IR::Instr * Lowerer::LowerInlineeStart(IR::Instr * inlineeStartInstr) { IR::Opnd *linkOpnd = inlineeStartInstr->GetSrc2(); if (!linkOpnd) { Assert(inlineeStartInstr->m_func->m_hasInlineArgsOpt); - return; + return inlineeStartInstr->m_prev; } AssertMsg(inlineeStartInstr->m_func->firstActualStackOffset != -1, "This should have been already done in backward pass"); @@ -13567,7 +13549,7 @@ Lowerer::LowerInlineeStart(IR::Instr * inlineeStartInstr) { if(i == 0) { - LowererMD::CreateAssign(metaArg->m_func->GetNextInlineeFrameArgCountSlotOpnd(), + Lowerer::InsertMove(metaArg->m_func->GetNextInlineeFrameArgCountSlotOpnd(), IR::AddrOpnd::NewNull(metaArg->m_func), argInsertInstr); } @@ -13595,6 +13577,9 @@ Lowerer::LowerInlineeStart(IR::Instr * inlineeStartInstr) i++; return false; }); + + IR::Instr* prev = inlineeStartInstr->m_prev; + if (inlineeStartInstr->m_func->m_hasInlineArgsOpt) { inlineeStartInstr->FreeSrc1(); @@ -13605,6 +13590,7 @@ Lowerer::LowerInlineeStart(IR::Instr * inlineeStartInstr) { inlineeStartInstr->Remove(); } + return prev; } void @@ -13616,7 +13602,7 @@ Lowerer::LowerInlineeEnd(IR::Instr *instr) // No need to emit code if the function wasn't marked as having implicit calls or bailout. Dead-Store should have removed inline overhead. if (instr->m_func->GetHasImplicitCalls() || PHASE_OFF(Js::DeadStorePhase, this->m_func)) { - LowererMD::CreateAssign(instr->m_func->GetInlineeArgCountSlotOpnd(), + Lowerer::InsertMove(instr->m_func->GetInlineeArgCountSlotOpnd(), IR::IntConstOpnd::New(0, TyMachReg, instr->m_func), instr); } @@ -13768,7 +13754,7 @@ Lowerer::GenerateFastBrOnObject(IR::Instr *instr) if (!object) { object = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(object, instr->GetSrc1(), instr); + Lowerer::InsertMove(object, instr->GetSrc1(), instr); } // TEST object, 1 @@ -13806,7 +13792,7 @@ void Lowerer::GenerateObjectHeaderInliningTest(IR::RegOpnd *baseOpnd, IR::LabelI // mov type, [base + offsetOf(type)] IR::RegOpnd *const opnd = IR::RegOpnd::New(TyMachPtr, func); - m_lowererMD.CreateAssign( + InsertMove( opnd, IR::IndirOpnd::New( baseOpnd, @@ -13816,7 +13802,7 @@ void Lowerer::GenerateObjectHeaderInliningTest(IR::RegOpnd *baseOpnd, IR::LabelI insertBeforeInstr); // mov typeHandler, [type + offsetOf(typeHandler)] - m_lowererMD.CreateAssign( + InsertMove( opnd, IR::IndirOpnd::New( opnd, @@ -14202,7 +14188,7 @@ IR::RegOpnd *Lowerer::LoadObjectArray(IR::RegOpnd *const baseOpnd, IR::Instr *co arrayOpnd->m_sym = StackSym::New(TyVar, func); arrayOpnd->SetValueType(arrayOpnd->GetValueType().ToArray()); const IR::AutoReuseOpnd autoReuseArrayOpnd(arrayOpnd, func, false /* autoDelete */); - m_lowererMD.CreateAssign( + InsertMove( arrayOpnd, IR::IndirOpnd::New( baseOpnd, @@ -14459,7 +14445,18 @@ IR::Instr *Lowerer::InsertMove(IR::Opnd *dst, IR::Opnd *src, IR::Instr *const in if(TySize[dst->GetType()] < TySize[src->GetType()]) { - src = src->UseWithNewType(dst->GetType(), func); +#if _M_IX86 + if (IRType_IsInt64(src->GetType())) + { + // On x86, if we are trying to move an int64 to a smaller type + // Insert a move of the low bits into dst + return InsertMove(dst, func->FindOrCreateInt64Pair(src).low, insertBeforeInstr, generateWriteBarrier); + } + else +#endif + { + src = src->UseWithNewType(dst->GetType(), func); + } } IR::Instr * instr = IR::Instr::New(Js::OpCode::Ld_A, dst, src, func); @@ -14817,10 +14814,25 @@ IR::Instr *Lowerer::InsertLea(IR::RegOpnd *const dst, IR::Opnd *const src, IR::I Func *const func = insertBeforeInstr->m_func; - IR::Instr *const instr = IR::Instr::New(Js::OpCode::LEA, dst, src, func); + IR::Instr *const instr = IR::Instr::New(LowererMD::MDLea, dst, src, func); insertBeforeInstr->InsertBefore(instr); - return LowererMD::ChangeToLea(instr, postRegAlloc); + return ChangeToLea(instr, postRegAlloc); +} + +IR::Instr * +Lowerer::ChangeToLea(IR::Instr * instr, bool postRegAlloc) +{ + Assert(instr); + Assert(instr->GetDst()); + Assert(instr->GetDst()->IsRegOpnd()); + Assert(instr->GetSrc1()); + Assert(instr->GetSrc1()->IsIndirOpnd() || instr->GetSrc1()->IsSymOpnd()); + Assert(!instr->GetSrc2()); + + instr->m_opcode = LowererMD::MDLea; + LowererMD::Legalize(instr, postRegAlloc); + return instr; } #if _M_X64 @@ -15091,7 +15103,7 @@ void Lowerer::InsertFloatCheckForZeroOrNanBranch( // When NaN is ignored, BEQ branches when equal and not unordered, and BNE branches when not equal or unordered. So, // when comparing src with zero, an unordered check needs to be added before the BEQ/BNE. branchOnEqualOrNotEqual; // satisfy the compiler -#ifdef _M_ARM +#ifdef _M_ARM32_OR_ARM64 InsertBranch( Js::OpCode::BVS, branchOnZeroOrNan @@ -15269,7 +15281,7 @@ Lowerer::GenerateFastElemIStringIndexCommon(IR::Instr * instrInsert, bool isStor IR::LabelInstr * notInlineSlotsLabel = IR::LabelInstr::New(Js::OpCode::Label, m_func); IR::LabelInstr * slotArrayLoadedLabel = IR::LabelInstr::New(Js::OpCode::Label, m_func); - m_lowererMD.GenerateLocalInlineCacheCheck(instrInsert, objectTypeOpnd, inlineCacheOpnd, notInlineSlotsLabel); + GenerateLocalInlineCacheCheck(instrInsert, objectTypeOpnd, inlineCacheOpnd, notInlineSlotsLabel); IR::RegOpnd * opndSlotArray = IR::RegOpnd::New(TyMachReg, instrInsert->m_func); InsertMove(opndSlotArray, baseOpnd, instrInsert); @@ -15278,7 +15290,7 @@ Lowerer::GenerateFastElemIStringIndexCommon(IR::Instr * instrInsert, bool isStor instrInsert->InsertBefore(notInlineSlotsLabel); IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); m_lowererMD.GenerateLoadTaggedType(instrInsert, objectTypeOpnd, opndTaggedType); - m_lowererMD.GenerateLocalInlineCacheCheck(instrInsert, opndTaggedType, inlineCacheOpnd, labelHelper); + GenerateLocalInlineCacheCheck(instrInsert, opndTaggedType, inlineCacheOpnd, labelHelper); IR::IndirOpnd * opndIndir = IR::IndirOpnd::New(baseOpnd, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrInsert->m_func); InsertMove(opndSlotArray, opndIndir, instrInsert); @@ -15964,9 +15976,7 @@ Lowerer::GenerateFastElemIIntIndexCommon( if (BailOutInfo::IsBailOutOnImplicitCalls(bailOutKind)) { // Bail out if this conversion triggers implicit calls. - toNumberInstr = toNumberInstr->ConvertToBailOutInstr(instr->GetBailOutInfo(), bailOutKind); - IR::Instr * instrShare = instr->ShareBailOut(); - LowerBailTarget(instrShare); + toNumberInstr = this->AddBailoutToHelperCallInstr(toNumberInstr, instr->GetBailOutInfo(), bailOutKind, instr); } LowerUnaryHelperMem(toNumberInstr, IR::HelperOp_ConvNumber_Full); @@ -16513,6 +16523,8 @@ Lowerer::GenerateFastLdElemI(IR::Instr *& ldElem, bool *instrIsInHelperBlockRef) #if FLOATVAR // For NaNs, go to the helper to guarantee we don't have an illegal NaN + // TODO(magardn): move this to MD code. +#if _M_X64 // UCOMISD reg, reg { IR::Instr *const instr = IR::Instr::New(Js::OpCode::UCOMISD, this->m_func); @@ -16526,6 +16538,21 @@ Lowerer::GenerateFastLdElemI(IR::Instr *& ldElem, bool *instrIsInHelperBlockRef) IR::Instr *const instr = IR::BranchInstr::New(Js::OpCode::JP, labelHelper, this->m_func); ldElem->InsertBefore(instr); } +#elif _M_ARM64 + // FCMP reg, reg + { + IR::Instr *const instr = IR::Instr::New(Js::OpCode::FCMP, this->m_func); + instr->SetSrc1(reg); + instr->SetSrc2(reg); + ldElem->InsertBefore(instr); + } + + // BVS $helper + { + IR::Instr *const instr = IR::BranchInstr::New(Js::OpCode::BVS, labelHelper, this->m_func); + ldElem->InsertBefore(instr); + } +#endif #endif if(dstType == TyFloat64) @@ -17223,12 +17250,7 @@ Lowerer::GenerateFastStElemI(IR::Instr *& stElem, bool *instrIsInHelperBlockRef) if (stElem->HasBailOutInfo() && BailOutInfo::IsBailOutOnImplicitCalls(stElem->GetBailOutKind())) { // Bail out if this helper triggers implicit calls. - instr = instr->ConvertToBailOutInstr(stElem->GetBailOutInfo(), stElem->GetBailOutKind()); - if (stElem->GetBailOutInfo()->bailOutInstr == stElem) - { - IR::Instr * instrShare = stElem->ShareBailOut(); - LowerBailTarget(instrShare); - } + instr = this->AddBailoutToHelperCallInstr(instr, stElem->GetBailOutInfo(), stElem->GetBailOutKind(), stElem); } m_lowererMD.LoadHelperArgument(instr, regSrc); @@ -17350,12 +17372,7 @@ Lowerer::GenerateFastStElemI(IR::Instr *& stElem, bool *instrIsInHelperBlockRef) IR::BailOutKind bailOutKind = stElem->HasBailOutInfo() ? stElem->GetBailOutKind() : IR::BailOutInvalid; if (BailOutInfo::IsBailOutOnImplicitCalls(bailOutKind)) { - instr = instr->ConvertToBailOutInstr(stElem->GetBailOutInfo(), bailOutKind); - if (stElem->GetBailOutInfo()->bailOutInstr == stElem) - { - IR::Instr * instrShare = stElem->ShareBailOut(); - LowerBailTarget(instrShare); - } + instr = this->AddBailoutToHelperCallInstr(instr, stElem->GetBailOutInfo(), bailOutKind, stElem); } bool bailOutOnHelperCall = !!(bailOutKind & IR::BailOutOnArrayAccessHelperCall); @@ -18043,7 +18060,7 @@ Lowerer::GenerateFastInlineGlobalObjectParseInt(IR::Instr *instr) } if (instr->GetDst()) { - this->m_lowererMD.CreateAssign(instr->GetDst(), parseIntArgOpnd, instr); + this->InsertMove(instr->GetDst(), parseIntArgOpnd, instr); } InsertBranch(Js::OpCode::Br, doneLabel, instr); instr->InsertBefore(labelHelper); @@ -18285,7 +18302,7 @@ Lowerer::GenerateFastInlineHasOwnProperty(IR::Instr * instr) GenerateDynamicLoadPolymorphicInlineCacheSlot(insertInstr, inlineCacheOpnd, objectTypeOpnd); IR::LabelInstr * notInlineSlotsLabel = IR::LabelInstr::New(Js::OpCode::Label, m_func); - m_lowererMD.GenerateLocalInlineCacheCheck(insertInstr, objectTypeOpnd, inlineCacheOpnd, notInlineSlotsLabel); + GenerateLocalInlineCacheCheck(insertInstr, objectTypeOpnd, inlineCacheOpnd, notInlineSlotsLabel); InsertMove(instr->GetDst(), LoadLibraryValueOpnd(instr, LibraryValue::ValueTrue), insertInstr); InsertBranch(Js::OpCode::Br, doneLabel, insertInstr); @@ -18293,7 +18310,7 @@ Lowerer::GenerateFastInlineHasOwnProperty(IR::Instr * instr) insertInstr->InsertBefore(notInlineSlotsLabel); IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, m_func); m_lowererMD.GenerateLoadTaggedType(insertInstr, objectTypeOpnd, opndTaggedType); - m_lowererMD.GenerateLocalInlineCacheCheck(insertInstr, opndTaggedType, inlineCacheOpnd, cacheMissLabel); + GenerateLocalInlineCacheCheck(insertInstr, opndTaggedType, inlineCacheOpnd, cacheMissLabel); InsertMove(instr->GetDst(), LoadLibraryValueOpnd(instr, LibraryValue::ValueTrue), insertInstr); InsertBranch(Js::OpCode::Br, doneLabel, insertInstr); @@ -18408,7 +18425,7 @@ Lowerer::GenerateFastReplace(IR::Opnd* strOpnd, IR::Opnd* src1, IR::Opnd* src2, if(!strOpnd->IsRegOpnd()) { IR::RegOpnd *strOpndReg = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(strOpndReg, strOpnd, insertInstr); + Lowerer::InsertMove(strOpndReg, strOpnd, insertInstr); strOpnd = strOpndReg; } @@ -18427,7 +18444,7 @@ Lowerer::GenerateFastReplace(IR::Opnd* strOpnd, IR::Opnd* src1, IR::Opnd* src2, if(!src1->IsRegOpnd()) { IR::RegOpnd *src1Reg = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(src1Reg, src1, insertInstr); + Lowerer::InsertMove(src1Reg, src1, insertInstr); src1 = src1Reg; } InsertCompareBranch( @@ -18442,7 +18459,7 @@ Lowerer::GenerateFastReplace(IR::Opnd* strOpnd, IR::Opnd* src1, IR::Opnd* src2, if(!src2->IsRegOpnd()) { IR::RegOpnd *src2Reg = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(src2Reg, src2, insertInstr); + Lowerer::InsertMove(src2Reg, src2, insertInstr); src2 = src2Reg; } this->GenerateStringTest(src2->AsRegOpnd(), insertInstr, labelHelper); @@ -18469,7 +18486,7 @@ Lowerer::GenerateFastReplace(IR::Opnd* strOpnd, IR::Opnd* src1, IR::Opnd* src2, // script context LoadScriptContext(helperCallInstr); - + if(callDst) { m_lowererMD.ChangeToHelperCall(helperCallInstr, IR::JnHelperMethod::HelperRegExp_ReplaceStringResultUsed); @@ -18521,7 +18538,7 @@ Lowerer::GenerateFastInlineStringSplitMatch(IR::Instr * instr) if(!argsOpnd[0]->IsRegOpnd()) { IR::RegOpnd *opndReg = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(opndReg, argsOpnd[0], instr); + Lowerer::InsertMove(opndReg, argsOpnd[0], instr); argsOpnd[0] = opndReg; } this->GenerateStringTest(argsOpnd[0]->AsRegOpnd(), instr, labelHelper); @@ -18539,7 +18556,7 @@ Lowerer::GenerateFastInlineStringSplitMatch(IR::Instr * instr) if(!argsOpnd[1]->IsRegOpnd()) { IR::RegOpnd *opndReg = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(opndReg, argsOpnd[1], instr); + Lowerer::InsertMove(opndReg, argsOpnd[1], instr); argsOpnd[1] = opndReg; } InsertCompareBranch( @@ -18667,7 +18684,7 @@ Lowerer::GenerateFastInlineRegExpExec(IR::Instr * instr) if(!opndString->IsRegOpnd()) { IR::RegOpnd *opndReg = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(opndReg, opndString, instr); + Lowerer::InsertMove(opndReg, opndString, instr); opndString = opndReg; } this->GenerateStringTest(opndString->AsRegOpnd(), instr, labelHelper); @@ -18686,7 +18703,7 @@ Lowerer::GenerateFastInlineRegExpExec(IR::Instr * instr) if(!opndRegex->IsRegOpnd()) { IR::RegOpnd *opndReg = IR::RegOpnd::New(TyVar, m_func); - LowererMD::CreateAssign(opndReg, opndRegex, instr); + Lowerer::InsertMove(opndReg, opndRegex, instr); opndRegex = opndReg; } InsertCompareBranch( @@ -18702,14 +18719,14 @@ Lowerer::GenerateFastInlineRegExpExec(IR::Instr * instr) { // Load pattern from regex operand IR::RegOpnd *opndPattern = IR::RegOpnd::New(TyMachPtr, m_func); - LowererMD::CreateAssign( + Lowerer::InsertMove( opndPattern, IR::IndirOpnd::New(opndRegex->AsRegOpnd(), Js::JavascriptRegExp::GetOffsetOfPattern(), TyMachPtr, m_func), instr); // Load program from pattern IR::RegOpnd *opndProgram = IR::RegOpnd::New(TyMachPtr, m_func); - LowererMD::CreateAssign( + Lowerer::InsertMove( opndProgram, IR::IndirOpnd::New(opndPattern, offsetof(UnifiedRegex::RegexPattern, rep) + offsetof(UnifiedRegex::RegexPattern::UnifiedRep, program), TyMachPtr, m_func), instr); @@ -18719,7 +18736,7 @@ Lowerer::GenerateFastInlineRegExpExec(IR::Instr * instr) // We want the program's tag to be BOILiteral2Tag InsertCompareBranch( IR::IndirOpnd::New(opndProgram, (int32)UnifiedRegex::Program::GetOffsetOfTag(), TyUint8, m_func), - IR::IntConstOpnd::New(UnifiedRegex::Program::GetBOILiteral2Tag(), TyUint8, m_func), + IR::IntConstOpnd::New((IntConstType)UnifiedRegex::Program::GetBOILiteral2Tag(), TyUint8, m_func), Js::OpCode::BrNeq_A, labelFastHelper, instr); @@ -18744,7 +18761,7 @@ Lowerer::GenerateFastInlineRegExpExec(IR::Instr * instr) // ...or the DWORD doesn't match the pattern... IR::RegOpnd *opndBuffer = IR::RegOpnd::New(TyMachReg, m_func); - LowererMD::CreateAssign( + Lowerer::InsertMove( opndBuffer, IR::IndirOpnd::New(opndString->AsRegOpnd(), offsetof(Js::JavascriptString, m_pszValue), TyMachPtr, m_func), instr); @@ -18761,7 +18778,7 @@ Lowerer::GenerateFastInlineRegExpExec(IR::Instr * instr) instr->InsertBefore(labelGotString); IR::RegOpnd *opndBufferDWORD = IR::RegOpnd::New(TyUint32, m_func); - LowererMD::CreateAssign( + Lowerer::InsertMove( opndBufferDWORD, IR::IndirOpnd::New(opndBuffer, 0, TyUint32, m_func), instr); @@ -18776,12 +18793,12 @@ Lowerer::GenerateFastInlineRegExpExec(IR::Instr * instr) // ...then set the last index to 0... instr->InsertBefore(labelNoMatch); - LowererMD::CreateAssign( + Lowerer::InsertMove( IR::IndirOpnd::New(opndRegex->AsRegOpnd(), Js::JavascriptRegExp::GetOffsetOfLastIndexVar(), TyVar, m_func), IR::AddrOpnd::NewNull(m_func), instr); - LowererMD::CreateAssign( + Lowerer::InsertMove( IR::IndirOpnd::New(opndRegex->AsRegOpnd(), Js::JavascriptRegExp::GetOffsetOfLastIndexOrFlag(), TyUint32, m_func), IR::IntConstOpnd::New(0, TyUint32, m_func), instr); @@ -18789,7 +18806,7 @@ Lowerer::GenerateFastInlineRegExpExec(IR::Instr * instr) // ...and set the dst to null... if (callDst) { - LowererMD::CreateAssign( + Lowerer::InsertMove( callDst, LoadLibraryValueOpnd(instr, LibraryValue::ValueNull), instr); @@ -19018,6 +19035,11 @@ Lowerer::GenerateFastInlineMathFround(IR::Instr* instr) Assert(dst->IsFloat()); Assert(src1->IsFloat()); + // This function is supposed to convert a float to the closest float32 representation. + // However, it is a bit loose about types, which the ARM64 encoder takes issue with. +#ifdef _M_ARM64 + LowererMD::GenerateFastInlineMathFround(instr); +#else IR::Instr* fcvt64to32 = IR::Instr::New(LowererMD::MDConvertFloat64ToFloat32Opcode, dst, src1, instr->m_func); instr->InsertBefore(fcvt64to32); @@ -19031,6 +19053,7 @@ Lowerer::GenerateFastInlineMathFround(IR::Instr* instr) } instr->Remove(); +#endif return; } @@ -19413,7 +19436,7 @@ Lowerer::LowerInlineSpreadArgOutLoopUsingRegisters(IR::Instr *callInstr, IR::Reg // X64 requires a reg opnd IR::RegOpnd *elemRegOpnd = IR::RegOpnd::New(TyMachPtr, func); - LowererMD::CreateAssign(elemRegOpnd, elemPtrOpnd, callInstr); + Lowerer::InsertMove(elemRegOpnd, elemPtrOpnd, callInstr); argout->SetSrc1(elemRegOpnd); argout->SetSrc2(indexOpnd); callInstr->InsertBefore(argout); @@ -19457,7 +19480,7 @@ Lowerer::LowerCallIDynamicSpread(IR::Instr *callInstr, ushort callFlags) if (!arraySrcOpnd->IsRegOpnd()) { arrayOpnd = IR::RegOpnd::New(TyMachPtr, func); - LowererMD::CreateAssign(arrayOpnd, arraySrcOpnd, spreadArrayInstr); + Lowerer::InsertMove(arrayOpnd, arraySrcOpnd, spreadArrayInstr); } else { @@ -19488,14 +19511,14 @@ Lowerer::LowerCallIDynamicSpread(IR::Instr *callInstr, ushort callFlags) IR::RegOpnd *argsLengthOpnd = IR::RegOpnd::New(TyUint32, func); IR::IndirOpnd *arrayLengthPtrOpnd = IR::IndirOpnd::New(arrayOpnd, Js::JavascriptArray::GetOffsetOfLength(), TyUint32, func); - LowererMD::CreateAssign(argsLengthOpnd, arrayLengthPtrOpnd, callInstr); + Lowerer::InsertMove(argsLengthOpnd, arrayLengthPtrOpnd, callInstr); // Don't bother expanding args if there are zero IR::LabelInstr *zeroArgsLabel = IR::LabelInstr::New(Js::OpCode::Label, func); InsertCompareBranch(argsLengthOpnd, IR::IntConstOpnd::New(0, TyInt8, func), Js::OpCode::BrEq_A, true, zeroArgsLabel, callInstr); IR::RegOpnd *indexOpnd = IR::RegOpnd::New(TyUint32, func); - LowererMD::CreateAssign(indexOpnd, argsLengthOpnd, callInstr); + Lowerer::InsertMove(indexOpnd, argsLengthOpnd, callInstr); // Get the array head offset and length IR::IndirOpnd *arrayHeadPtrOpnd = IR::IndirOpnd::New(arrayOpnd, Js::JavascriptArray::GetOffsetOfHead(), TyMachPtr, func); @@ -19563,19 +19586,47 @@ Lowerer::LowerCallIDynamic(IR::Instr * callInstr, ushort callFlags) IR::Opnd* Lowerer::GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stackArgsInstr) { + +// For architectures were we only pass 4 parameters in registers, the +// generated code looks something like this: // s25.var = LdLen_A s4.var // s26.var = Ld_A s25.var -// BrNeq_I4 $L3, s25.var,0 +// BrEq_I4 $L3, s25.var,0 // If we have no further arguments to pass, don't pass them // $L2: -// BrNeq_I4 $L4, s25.var,1 +// BrEq_I4 $L4, s25.var,1 // Loop through the rest of the arguments, putting them on the stack // s25.var = SUB_I4 s25.var, 0x1 // s10.var = LdElemI_A [s4.var+s25.var].var // ArgOut_A_Dynamic s10.var, s25.var // Br $L2 // $L4: -// s10.var = LdElemI_A [s4.var].var +// s25.var = LdImm 0 // set s25 to 0, since it'll be 1 on the way into this block +// s10.var = LdElemI_A [s4.var + 0 * MachReg].var // The last one has to be put into argslot 4, since this is likely a register, not a stack location. // ArgOut_A_Dynamic s10.var, 4 -// $L3 +// $L3: +// +// Generalizing this for more register-passed parameters gives us code +// something like this: +// s25.var = LdLen_A s4.var +// s26.var = Ld_A s25.var +// BrLe_I4 $L3, s25.var,0 // If we have no further arguments to pass, don't pass them +// $L2: +// BrLe_I4 $L4, s25.var,INT_REG_COUNT-3 // Loop through the rest of the arguments up to the number passed in registers, putting them on the stack +// s25.var = SUB_I4 s25.var, 0x1 +// s10.var = LdElemI_A [s4.var+s25.var].var +// ArgOut_A_Dynamic s10.var, s25.var +// Br $L2 +// $L4: +// foreach of the remaining ones, N going down from (the number we can pass in regs -1) to 1 (0 omitted as we know that it'll be at least one register argument): +// BrEq_I4 $L__N, s25.var, N +// end foreach +// foreach of the remaining ones, N going down from (the number we can pass in regs -1) to 0: +// $L__N: +// s10.var = LdElemI_A [s4.var + N * MachReg].var // The last one has to be put into argslot 4, since this is likely a register, not a stack location. +// ArgOut_A_Dynamic s10.var, N+3 +// end foreach +// $L3: + + #if defined(_M_IX86) Assert(false); #endif @@ -19593,7 +19644,8 @@ Lowerer::GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stackArgsIn IR::RegOpnd* stackArgs = stackArgsInstr->GetSrc1()->AsRegOpnd(); IR::RegOpnd* ldLenDstOpnd = IR::RegOpnd::New(TyMachReg, func); - IR::Instr* ldLen = IR::Instr::New(Js::OpCode::LdLen_A, ldLenDstOpnd ,stackArgs, func); + const IR::AutoReuseOpnd autoReuseLdLenDstOpnd(ldLenDstOpnd, func); + IR::Instr* ldLen = IR::Instr::New(Js::OpCode::LdLen_A, ldLenDstOpnd, stackArgs, func); ldLenDstOpnd->SetValueType(ValueType::GetTaggedInt()); /*LdLen_A works only on stack arguments*/ callInstr->InsertBefore(ldLen); GenerateFastRealStackArgumentsLdLen(ldLen); @@ -19611,7 +19663,7 @@ Lowerer::GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stackArgsIn Loop * loop = startLoop->GetLoop(); IR::LabelInstr* endLoop = IR::LabelInstr::New(Js::OpCode::Label, func); - IR::Instr* branchOutOfLoop = IR::BranchInstr::New(Js::OpCode::BrEq_I4, endLoop, ldLenDstOpnd, IR::IntConstOpnd::New(1, TyInt8, func),func); + IR::Instr* branchOutOfLoop = IR::BranchInstr::New(Js::OpCode::BrLe_I4, endLoop, ldLenDstOpnd, IR::IntConstOpnd::New(INT_ARG_REG_COUNT - 3, TyInt8, func),func); callInstr->InsertBefore(branchOutOfLoop); this->m_lowererMD.EmitInt4Instr(branchOutOfLoop); @@ -19621,6 +19673,7 @@ Lowerer::GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stackArgsIn IR::IndirOpnd *nthArgument = IR::IndirOpnd::New(stackArgs, ldLenDstOpnd, TyMachReg, func); IR::RegOpnd* ldElemDstOpnd = IR::RegOpnd::New(TyMachReg,func); + const IR::AutoReuseOpnd autoReuseldElemDstOpnd(ldElemDstOpnd, func); IR::Instr* ldElem = IR::Instr::New(Js::OpCode::LdElemI_A, ldElemDstOpnd, nthArgument, func); callInstr->InsertBefore(ldElem); GenerateFastStackArgumentsLdElemI(ldElem); @@ -19631,27 +19684,67 @@ Lowerer::GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stackArgsIn callInstr->InsertBefore(argout); this->m_lowererMD.LoadDynamicArgumentUsingLength(argout); - IR::BranchInstr *tailBranch = IR::BranchInstr::New(Js::OpCode::Br, startLoop, func); + IR::BranchInstr *tailBranch = IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, startLoop, func); callInstr->InsertBefore(tailBranch); + callInstr->InsertBefore(endLoop); - this->m_lowererMD.LowerUncondBranch(tailBranch); loop->regAlloc.liveOnBackEdgeSyms->Set(ldLenDstOpnd->m_sym->m_id); - subInstr = IR::Instr::New(Js::OpCode::Sub_I4, ldLenDstOpnd, ldLenDstOpnd, IR::IntConstOpnd::New(1, TyMachReg, func),func); - callInstr->InsertBefore(subInstr); - this->m_lowererMD.EmitInt4Instr(subInstr); + // Note: This loop iteratively adds instructions in two locations; in the block + // of branches that jump to the "load elements to argOuts" instructions, and in + // the the block of load elements to argOuts instructions themselves. - nthArgument = IR::IndirOpnd::New(stackArgs, ldLenDstOpnd, TyMachReg, func); - ldElemDstOpnd = IR::RegOpnd::New(TyMachReg,func); - ldElem = IR::Instr::New(Js::OpCode::LdElemI_A, ldElemDstOpnd, nthArgument, func); - callInstr->InsertBefore(ldElem); - GenerateFastStackArgumentsLdElemI(ldElem); + // 4 to denote this is 4th register after this, callinfo & function object + // INT_ARG_REG_COUNT is the number of parameters passed in int regs + uint current_reg_pass = +#if defined(_M_IX86) + // We get a compilation error on x86 due to assiging a negative to a uint + // TODO: don't even define this function on x86 - we Assert(false) anyway there. + 0; +#else + INT_ARG_REG_COUNT - 4; +#endif - argout = IR::Instr::New(Js::OpCode::ArgOut_A_Dynamic, func); - argout->SetSrc1(ldElemDstOpnd); - callInstr->InsertBefore(argout); - this->m_lowererMD.LoadDynamicArgument(argout, 4); //4 to denote this is 4th register after this, callinfo & function object + do + { + // If we're on this pass we know we have to do at least one of these, so skip + // the branch if we're on the last one. + if (current_reg_pass != INT_ARG_REG_COUNT - 4) + { + IR::LabelInstr* loadBlockLabel = IR::LabelInstr::New(Js::OpCode::Label, func); + IR::Instr* branchToBlock = IR::BranchInstr::New(Js::OpCode::BrEq_I4, loadBlockLabel, ldLenDstOpnd, IR::IntConstOpnd::New(current_reg_pass + 1, TyInt8, func), func); + endLoop->InsertAfter(branchToBlock); + callInstr->InsertBefore(loadBlockLabel); + } + + // TODO: We can further optimize this with a GenerateFastStackArgumentsLdElemI that can + // handle us passing along constant argument references and encode them into the offset + // instead of having to use an IndirOpnd; this would allow us to save a few bytes here, + // and reduce register pressure a hair + + // stemp.var = LdImm current_reg_pass + IR::RegOpnd* localTemp = IR::RegOpnd::New(TyInt32, func); + // We need to make it a tagged int because GenerateFastStackArgumentsLdElemI asserts if + // it is not. + localTemp->SetValueType(ValueType::GetTaggedInt()); + const IR::AutoReuseOpnd autoReuseldElemDstOpnd3(localTemp, func); + this->InsertMove(localTemp, IR::IntConstOpnd::New(current_reg_pass, TyInt8, func, true), callInstr); + + // sTemp = LdElem_I [s4.var + current_reg_pass (aka stemp.var) ] + nthArgument = IR::IndirOpnd::New(stackArgs, localTemp, TyMachReg, func); + ldElemDstOpnd = IR::RegOpnd::New(TyMachReg, func); + const IR::AutoReuseOpnd autoReuseldElemDstOpnd2(ldElemDstOpnd, func); + ldElem = IR::Instr::New(Js::OpCode::LdElemI_A, ldElemDstOpnd, nthArgument, func); + callInstr->InsertBefore(ldElem); + GenerateFastStackArgumentsLdElemI(ldElem); + + argout = IR::Instr::New(Js::OpCode::ArgOut_A_Dynamic, func); + argout->SetSrc1(ldElemDstOpnd); + callInstr->InsertBefore(argout); + this->m_lowererMD.LoadDynamicArgument(argout, current_reg_pass + 4); + } + while (current_reg_pass-- != 0); callInstr->InsertBefore(doneArgs); @@ -19668,7 +19761,7 @@ Lowerer::GenerateLoadStackArgumentByIndex(IR::Opnd *dst, IR::RegOpnd *indexOpnd, IR::IndirOpnd *argIndirOpnd = nullptr; // The stack looks like this: - // [new.target or FrameDisplay] <== EBP + formalParamOffset (4) + callInfo.Count - 1 + // [new.target or FrameDisplay] <== EBP + formalParamOffset (4) + callInfo.Count // arguments[n] <== EBP + formalParamOffset (4) + n // ... // arguments[1] <== EBP + formalParamOffset (4) + 2 @@ -19688,7 +19781,7 @@ Lowerer::GenerateLoadStackArgumentByIndex(IR::Opnd *dst, IR::RegOpnd *indexOpnd, argIndirOpnd = IR::IndirOpnd::New(ebpOpnd, indexOpnd, indirScale, TyMachReg, this->m_func); argIndirOpnd->SetOffset(actualOffset << indirScale); - LowererMD::CreateAssign(dst, argIndirOpnd, instr); + Lowerer::InsertMove(dst, argIndirOpnd, instr); } //This function assumes there is stackargs bailout and index is always on the range. @@ -19707,7 +19800,7 @@ Lowerer::GenerateFastStackArgumentsLdElemI(IR::Instr* ldElem) { IR::IndirOpnd *argIndirOpnd = GetArgsIndirOpndForInlinee(ldElem, indexOpnd); - LowererMD::CreateAssign(ldElem->GetDst(), argIndirOpnd, ldElem); + Lowerer::InsertMove(ldElem->GetDst(), argIndirOpnd, ldElem); } else { @@ -19845,7 +19938,7 @@ Lowerer::GenerateFastArgumentsLdElemI(IR::Instr* ldElem, IR::LabelInstr *labelFa { // Load actuals count, LoadHeapArguments will reuse the generated instructions here IR::Instr *loadInputParamCountInstr = this->m_lowererMD.LoadInputParamCount(ldElem, -1 /* don't include 'this' while counting actuals. */); - actualParamOpnd = loadInputParamCountInstr->GetDst()->AsRegOpnd(); + actualParamOpnd = loadInputParamCountInstr->GetDst()->UseWithNewType(TyInt32,this->m_func); } if (hasIntConstIndex) @@ -19895,7 +19988,7 @@ Lowerer::GenerateFastArgumentsLdElemI(IR::Instr* ldElem, IR::LabelInstr *labelFa argIndirOpnd = GetArgsIndirOpndForTopFunction(ldElem, valueOpnd); } - LowererMD::CreateAssign(ldElem->GetDst(), argIndirOpnd, ldElem); + Lowerer::InsertMove(ldElem->GetDst(), argIndirOpnd, ldElem); // JMP $done InsertBranch(Js::OpCode::Br, labelFallThru, ldElem); @@ -19918,7 +20011,7 @@ Lowerer::GenerateFastRealStackArgumentsLdLen(IR::Instr *ldLen) if(ldLen->m_func->IsInlinee()) { //Get the length of the arguments - LowererMD::CreateAssign(ldLen->GetDst(), + Lowerer::InsertMove(ldLen->GetDst(), IR::IntConstOpnd::New(ldLen->m_func->actualCount - 1, TyUint32, ldLen->m_func), ldLen); } @@ -19926,7 +20019,7 @@ Lowerer::GenerateFastRealStackArgumentsLdLen(IR::Instr *ldLen) { IR::Instr *loadInputParamCountInstr = this->m_lowererMD.LoadInputParamCount(ldLen, -1); IR::RegOpnd *actualCountOpnd = loadInputParamCountInstr->GetDst()->AsRegOpnd(); - LowererMD::CreateAssign(ldLen->GetDst(), actualCountOpnd, ldLen); + Lowerer::InsertMove(ldLen->GetDst(), actualCountOpnd, ldLen); } ldLen->Remove(); return false; @@ -19949,7 +20042,7 @@ Lowerer::GenerateFastArgumentsLdLen(IR::Instr *ldLen, IR::LabelInstr* labelFallT if(ldLen->m_func->IsInlinee()) { //Get the length of the arguments - LowererMD::CreateAssign(ldLen->GetDst(), + Lowerer::InsertMove(ldLen->GetDst(), IR::AddrOpnd::New(Js::TaggedInt::ToVarUnchecked(ldLen->m_func->actualCount - 1), IR::AddrOpndKindConstantVar, ldLen->m_func), // -1 to exclude this pointer ldLen); } @@ -19959,7 +20052,7 @@ Lowerer::GenerateFastArgumentsLdLen(IR::Instr *ldLen, IR::LabelInstr* labelFallT IR::RegOpnd *actualCountOpnd = loadInputParamCountInstr->GetDst()->AsRegOpnd(); this->m_lowererMD.GenerateInt32ToVarConversion(actualCountOpnd, ldLen); - LowererMD::CreateAssign(ldLen->GetDst(), actualCountOpnd, ldLen); + Lowerer::InsertMove(ldLen->GetDst(), actualCountOpnd, ldLen); } return true; } @@ -19982,7 +20075,7 @@ Lowerer::GenerateFunctionTypeFromFixedFunctionObject(IR::Instr *insertInstrPt, I { functionTypeOpnd = IR::IndirOpnd::New(functionObjOpnd->AsRegOpnd(), Js::RecyclableObject::GetOffsetOfType(), TyMachPtr, this->m_func); } - LowererMD::CreateAssign(functionTypeRegOpnd, functionTypeOpnd, insertInstrPt); + Lowerer::InsertMove(functionTypeRegOpnd, functionTypeOpnd, insertInstrPt); return functionTypeRegOpnd; } @@ -20060,7 +20153,13 @@ Lowerer::EHBailoutPatchUp() this->InsertReturnThunkForRegion(this->currentRegion, restoreReturnValueFromBailoutLabel); if (instr->HasBailOutInfo()) { - this->SetHasBailedOut(instr); + if (instr->GetBailOutInfo()->bailOutFunc == this->m_func) + { + // We dont set this bit for inlined code, if there was a bailout in the inlined code, + // and an exception was thrown, we want the caller's handler to handle the exception accordingly. + // TODO : Revisit when we start inlining functions with try-catch/try-finally + this->SetHasBailedOut(instr); + } tmpInstr = this->EmitEHBailoutStackRestore(instr); this->EmitSaveEHBailoutReturnValueAndJumpToRetThunk(tmpInstr); if (!restoreReturnFromBailoutEmitted) @@ -20212,11 +20311,11 @@ Lowerer::GenerateFastLdFld(IR::Instr * const instrLdFld, IR::JnHelperMethod help IR::RegOpnd * opndInlineCache = IR::RegOpnd::New(TyMachPtr, this->m_func); if (usePolymorphicInlineCache) { - LowererMD::CreateAssign(opndInlineCache, IR::AddrOpnd::New(propertySymOpnd->m_runtimePolymorphicInlineCache->GetInlineCachesAddr(), IR::AddrOpndKindDynamicInlineCache, this->m_func, true), instrLdFld); + Lowerer::InsertMove(opndInlineCache, IR::AddrOpnd::New(propertySymOpnd->m_runtimePolymorphicInlineCache->GetInlineCachesAddr(), IR::AddrOpndKindDynamicInlineCache, this->m_func, true), instrLdFld); } else { - LowererMD::CreateAssign(opndInlineCache, this->LoadRuntimeInlineCacheOpnd(instrLdFld, propertySymOpnd, isHelper), instrLdFld); + Lowerer::InsertMove(opndInlineCache, this->LoadRuntimeInlineCacheOpnd(instrLdFld, propertySymOpnd, isHelper), instrLdFld); } if (typeOpnd == nullptr) @@ -20240,8 +20339,8 @@ Lowerer::GenerateFastLdFld(IR::Instr * const instrLdFld, IR::JnHelperMethod help if (doInlineSlots) { labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - labelNextBranchToPatch = LowererMD::GenerateProtoInlineCacheCheck(instrLdFld, typeOpnd, opndInlineCache, labelNext); - LowererMD::GenerateLdFldFromProtoInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); + labelNextBranchToPatch = GenerateProtoInlineCacheCheck(instrLdFld, typeOpnd, opndInlineCache, labelNext); + GenerateLdFldFromProtoInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); instrLdFld->InsertBefore(labelNext); } if (doAuxSlots) @@ -20252,8 +20351,8 @@ Lowerer::GenerateFastLdFld(IR::Instr * const instrLdFld, IR::JnHelperMethod help LowererMD::GenerateLoadTaggedType(instrLdFld, typeOpnd, opndTaggedType); } labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - labelNextBranchToPatch = LowererMD::GenerateProtoInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, labelNext); - LowererMD::GenerateLdFldFromProtoInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); + labelNextBranchToPatch = GenerateProtoInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, labelNext); + GenerateLdFldFromProtoInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); instrLdFld->InsertBefore(labelNext); } } @@ -20262,8 +20361,8 @@ Lowerer::GenerateFastLdFld(IR::Instr * const instrLdFld, IR::JnHelperMethod help if (doInlineSlots) { labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - labelNextBranchToPatch = LowererMD::GenerateLocalInlineCacheCheck(instrLdFld, typeOpnd, opndInlineCache, labelNext); - LowererMD::GenerateLdFldFromLocalInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); + labelNextBranchToPatch = GenerateLocalInlineCacheCheck(instrLdFld, typeOpnd, opndInlineCache, labelNext); + GenerateLdFldFromLocalInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); instrLdFld->InsertBefore(labelNext); } if (doAuxSlots) @@ -20274,8 +20373,8 @@ Lowerer::GenerateFastLdFld(IR::Instr * const instrLdFld, IR::JnHelperMethod help LowererMD::GenerateLoadTaggedType(instrLdFld, typeOpnd, opndTaggedType); } labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - labelNextBranchToPatch = LowererMD::GenerateLocalInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, labelNext); - LowererMD::GenerateLdFldFromLocalInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); + labelNextBranchToPatch = GenerateLocalInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, labelNext); + GenerateLdFldFromLocalInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); instrLdFld->InsertBefore(labelNext); } } @@ -20284,8 +20383,8 @@ Lowerer::GenerateFastLdFld(IR::Instr * const instrLdFld, IR::JnHelperMethod help if (doInlineSlots) { labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - labelNextBranchToPatch = LowererMD::GenerateProtoInlineCacheCheck(instrLdFld, typeOpnd, opndInlineCache, labelNext); - LowererMD::GenerateLdFldFromProtoInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); + labelNextBranchToPatch = GenerateProtoInlineCacheCheck(instrLdFld, typeOpnd, opndInlineCache, labelNext); + GenerateLdFldFromProtoInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); instrLdFld->InsertBefore(labelNext); } if (doAuxSlots) @@ -20296,8 +20395,8 @@ Lowerer::GenerateFastLdFld(IR::Instr * const instrLdFld, IR::JnHelperMethod help LowererMD::GenerateLoadTaggedType(instrLdFld, typeOpnd, opndTaggedType); } labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - labelNextBranchToPatch = LowererMD::GenerateProtoInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, labelNext); - LowererMD::GenerateLdFldFromProtoInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); + labelNextBranchToPatch = GenerateProtoInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, labelNext); + GenerateLdFldFromProtoInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); instrLdFld->InsertBefore(labelNext); } } @@ -20326,9 +20425,16 @@ Lowerer::GenerateAuxSlotAdjustmentRequiredCheck( IR::IndirOpnd * memSlotCap = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.local.rawUInt16), TyUint16, instrToInsertBefore->m_func); InsertMove(regSlotCap, memSlotCap, instrToInsertBefore); - // SAR regSlotCap, Js::InlineCache::CacheLayoutSelectorBitCount IR::IntConstOpnd * constSelectorBitCount = IR::IntConstOpnd::New(Js::InlineCache::CacheLayoutSelectorBitCount, TyUint16, instrToInsertBefore->m_func, /* dontEncode = */ true); + +#if _M_ARM64 + IR::Instr * testBranch = InsertBranch(Js::OpCode::TBZ, labelHelper, instrToInsertBefore); + testBranch->SetSrc1(regSlotCap); + testBranch->SetSrc2(constSelectorBitCount); +#else + // SAR regSlotCap, Js::InlineCache::CacheLayoutSelectorBitCount InsertShiftBranch(Js::OpCode::Shr_A, regSlotCap, regSlotCap, constSelectorBitCount, Js::OpCode::BrNeq_A, true, labelHelper, instrToInsertBefore); +#endif } void @@ -20498,11 +20604,11 @@ Lowerer::GenerateFastStFld(IR::Instr * const instrStFld, IR::JnHelperMethod help IR::RegOpnd * opndInlineCache = IR::RegOpnd::New(TyMachPtr, this->m_func); if (usePolymorphicInlineCache) { - LowererMD::CreateAssign(opndInlineCache, IR::AddrOpnd::New(propertySymOpnd->m_runtimePolymorphicInlineCache->GetInlineCachesAddr(), IR::AddrOpndKindDynamicInlineCache, this->m_func, true), instrStFld); + Lowerer::InsertMove(opndInlineCache, IR::AddrOpnd::New(propertySymOpnd->m_runtimePolymorphicInlineCache->GetInlineCachesAddr(), IR::AddrOpndKindDynamicInlineCache, this->m_func, true), instrStFld); } else { - LowererMD::CreateAssign(opndInlineCache, this->LoadRuntimeInlineCacheOpnd(instrStFld, propertySymOpnd, isHelper), instrStFld); + Lowerer::InsertMove(opndInlineCache, this->LoadRuntimeInlineCacheOpnd(instrStFld, propertySymOpnd, isHelper), instrStFld); } if (typeOpnd == nullptr) @@ -20525,7 +20631,7 @@ Lowerer::GenerateFastStFld(IR::Instr * const instrStFld, IR::JnHelperMethod help if (doInlineSlots) { labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - lastBranchToNext = LowererMD::GenerateLocalInlineCacheCheck(instrStFld, typeOpnd, opndInlineCache, labelNext); + lastBranchToNext = GenerateLocalInlineCacheCheck(instrStFld, typeOpnd, opndInlineCache, labelNext); this->GetLowererMD()->GenerateStFldFromLocalInlineCache(instrStFld, opndBase, opndSrc, opndInlineCache, labelFallThru, true); instrStFld->InsertBefore(labelNext); } @@ -20537,7 +20643,7 @@ Lowerer::GenerateFastStFld(IR::Instr * const instrStFld, IR::JnHelperMethod help LowererMD::GenerateLoadTaggedType(instrStFld, typeOpnd, opndTaggedType); } labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - lastBranchToNext = LowererMD::GenerateLocalInlineCacheCheck(instrStFld, opndTaggedType, opndInlineCache, labelNext); + lastBranchToNext = GenerateLocalInlineCacheCheck(instrStFld, opndTaggedType, opndInlineCache, labelNext); this->GetLowererMD()->GenerateStFldFromLocalInlineCache(instrStFld, opndBase, opndSrc, opndInlineCache, labelFallThru, false); instrStFld->InsertBefore(labelNext); } @@ -20548,7 +20654,7 @@ Lowerer::GenerateFastStFld(IR::Instr * const instrStFld, IR::JnHelperMethod help if (doInlineSlots) { labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); - lastBranchToNext = LowererMD::GenerateLocalInlineCacheCheck(instrStFld, typeOpnd, opndInlineCache, labelNext, true); + lastBranchToNext = GenerateLocalInlineCacheCheck(instrStFld, typeOpnd, opndInlineCache, labelNext, true); GenerateSetObjectTypeFromInlineCache(instrStFld, opndBase, opndInlineCache, false); this->GetLowererMD()->GenerateStFldFromLocalInlineCache(instrStFld, opndBase, opndSrc, opndInlineCache, labelFallThru, true); instrStFld->InsertBefore(labelNext); @@ -20561,7 +20667,7 @@ Lowerer::GenerateFastStFld(IR::Instr * const instrStFld, IR::JnHelperMethod help LowererMD::GenerateLoadTaggedType(instrStFld, typeOpnd, opndTaggedType); } labelNext = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); - lastBranchToNext = LowererMD::GenerateLocalInlineCacheCheck(instrStFld, opndTaggedType, opndInlineCache, labelNext, true); + lastBranchToNext = GenerateLocalInlineCacheCheck(instrStFld, opndTaggedType, opndInlineCache, labelNext, true); GenerateAuxSlotAdjustmentRequiredCheck(instrStFld, opndInlineCache, labelHelper); GenerateSetObjectTypeFromInlineCache(instrStFld, opndBase, opndInlineCache, true); this->GetLowererMD()->GenerateStFldFromLocalInlineCache(instrStFld, opndBase, opndSrc, opndInlineCache, labelFallThru, false); @@ -20694,7 +20800,7 @@ Lowerer::GenerateIsBuiltinRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *inse m_lowererMD.GenerateObjectTest(regOpnd, insertInstr, labelHelper); } - m_lowererMD.GenerateIsDynamicObject(regOpnd, insertInstr, labelFallthrough, true); + GenerateIsDynamicObject(regOpnd, insertInstr, labelFallthrough, true); } IR::RegOpnd * typeRegOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); @@ -20703,11 +20809,11 @@ Lowerer::GenerateIsBuiltinRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *inse // MOV typeRegOpnd, [src1 + offset(type)] indirOpnd = IR::IndirOpnd::New(regOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); - m_lowererMD.CreateAssign(typeRegOpnd, indirOpnd, insertInstr); + InsertMove(typeRegOpnd, indirOpnd, insertInstr); // MOV typeIdRegOpnd, [typeRegOpnd + offset(typeId)] indirOpnd = IR::IndirOpnd::New(typeRegOpnd, Js::Type::GetOffsetOfTypeId(), TyInt32, this->m_func); - m_lowererMD.CreateAssign(typeIdRegOpnd, indirOpnd, insertInstr); + InsertMove(typeIdRegOpnd, indirOpnd, insertInstr); // ADD typeIdRegOpnd, ~TypeIds_LastStaticType InsertAdd(false, typeIdRegOpnd, typeIdRegOpnd, @@ -20736,99 +20842,437 @@ Lowerer::GenerateIsBuiltinRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *inse return typeRegOpnd; } -void Lowerer::GenerateBooleanNegate(IR::Instr * instr, IR::Opnd * srcBool, IR::Opnd * dst) -{ - // dst = src - // dst = dst ^ (true ^ false) (= !src) - LowererMD::CreateAssign(dst, srcBool, instr); - ScriptContextInfo* sci = instr->m_func->GetScriptContextInfo(); - IR::AddrOpnd* xorval = IR::AddrOpnd::New(sci->GetTrueAddr() ^ sci->GetFalseAddr(), IR::AddrOpndKindDynamicMisc, instr->m_func, true); - InsertXor(dst, dst, xorval, instr); -} - -bool Lowerer::GenerateFastEqBoolInt(IR::Instr * instr, bool *pNeedHelper, bool isInHelper) +void Lowerer::GenerateIsDynamicObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool fContinueLabel) { - Assert(instr); - - // There's a total of 8 modes for this function, based on these inferred flags - bool isBranchNotCompare = instr->IsBranchInstr(); - bool isStrict = false; - bool isNegOp = false; + // CMP [srcReg], Js::DynamicObject::`vtable' + InsertCompare( + IR::IndirOpnd::New(regOpnd, 0, TyMachPtr, m_func), + LoadVTableValueOpnd(insertInstr, VTableValue::VtableDynamicObject), + insertInstr); - switch (instr->m_opcode) + if (fContinueLabel) { - case Js::OpCode::BrSrEq_A: - case Js::OpCode::BrSrNotNeq_A: - case Js::OpCode::BrSrNeq_A: - case Js::OpCode::BrSrNotEq_A: - case Js::OpCode::CmSrEq_A: - case Js::OpCode::CmSrNeq_A: - isStrict = true; - break; - default: - break; + // JEQ $fallThough + Lowerer::InsertBranch(Js::OpCode::BrEq_A, labelHelper, insertInstr); } - switch (instr->m_opcode) + else { - case Js::OpCode::BrSrEq_A: - case Js::OpCode::BrSrNotNeq_A: - case Js::OpCode::CmSrEq_A: - case Js::OpCode::BrEq_A: - case Js::OpCode::BrNotNeq_A: - case Js::OpCode::CmEq_A: - isNegOp = false; - break; - case Js::OpCode::BrSrNeq_A: - case Js::OpCode::BrSrNotEq_A: - case Js::OpCode::CmSrNeq_A: - case Js::OpCode::BrNeq_A: - case Js::OpCode::BrNotEq_A: - case Js::OpCode::CmNeq_A: - isNegOp = true; - break; - default: - // This opcode is not one of the ones that should be handled here. - return false; - break; + // JNE $helper + Lowerer::InsertBranch(Js::OpCode::BrNeq_A, labelHelper, insertInstr); } +} - IR::Opnd *src1 = instr->GetSrc1(); - IR::Opnd *src2 = instr->GetSrc2(); +void Lowerer::GenerateIsRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool checkObjectAndDynamicObject) +{ + // CMP [srcReg], Js::DynamicObject::`vtable' + // JEQ $fallThough + // MOV r1, [src1 + offset(type)] -- get the type id + // MOV r1, [r1 + offset(typeId)] + // ADD r1, ~TypeIds_LastJavascriptPrimitiveType -- if (typeId > TypeIds_LastJavascriptPrimitiveType && typeId <= TypeIds_LastTrueJavascriptObjectType) + // CMP r1, (TypeIds_LastTrueJavascriptObjectType - TypeIds_LastJavascriptPrimitiveType - 1) + // JA $helper + //fallThrough: - // The instrucions given to this _should_ all be 2-arg. - Assert(src1 && src2); - if (!(src1 && src2)) + IR::LabelInstr *labelFallthrough = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + + if (checkObjectAndDynamicObject) { - return false; + if (!regOpnd->IsNotTaggedValue()) + { + m_lowererMD.GenerateObjectTest(regOpnd, insertInstr, labelHelper); + } + + this->GenerateIsDynamicObject(regOpnd, insertInstr, labelFallthrough, true); } - // If it's a branch instruction, we'll want these to be defined - //IR::BranchInstr *instrBranch = nullptr; - IR::LabelInstr *targetInstr = nullptr; - IR::LabelInstr *labelFallthrough = nullptr; + IR::RegOpnd * typeRegOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); + IR::RegOpnd * typeIdRegOpnd = IR::RegOpnd::New(TyInt32, this->m_func); - if (isBranchNotCompare) - { - IR::BranchInstr * instrBranch = instr->AsBranchInstr(); - targetInstr = instrBranch->GetTarget(); - labelFallthrough = instrBranch->GetOrCreateContinueLabel(isInHelper); - } + // MOV r1, [src1 + offset(type)] + InsertMove(typeRegOpnd, IR::IndirOpnd::New(regOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func), insertInstr); - // Assume we need the helper until we can show otherwise. - *pNeedHelper = true; - // If we don't know the final types well enough at JIT time, a helper block to set - // the inputs to the correct types will be needed. - IR::LabelInstr *labelHelper = nullptr; - // If we're doing a compare and can handle it early, then we want to skip the helper - IR::LabelInstr *labelDone = instr->GetOrCreateContinueLabel(isInHelper); + // MOV r1, [r1 + offset(typeId)] + InsertMove(typeIdRegOpnd, IR::IndirOpnd::New(typeRegOpnd, Js::Type::GetOffsetOfTypeId(), TyInt32, this->m_func), insertInstr); - // Normallize for orderings - IR::Opnd *srcBool = nullptr; - IR::Opnd *srcInt = nullptr; - if (src1->GetValueType().IsLikelyBoolean() && src2->GetValueType().IsLikelyTaggedInt()) - { - srcBool = src1; - srcInt = src2; + // ADD r1, ~TypeIds_LastJavascriptPrimitiveType + InsertAdd(false, typeIdRegOpnd, typeIdRegOpnd, IR::IntConstOpnd::New(~Js::TypeIds_LastJavascriptPrimitiveType, TyInt32, this->m_func, true), insertInstr); + + // CMP r1, (TypeIds_LastTrueJavascriptObjectType - TypeIds_LastJavascriptPrimitiveType - 1) + InsertCompare( + typeIdRegOpnd, + IR::IntConstOpnd::New(Js::TypeIds_LastTrueJavascriptObjectType - Js::TypeIds_LastJavascriptPrimitiveType - 1, TyInt32, this->m_func), + insertInstr); + + // JA $helper + InsertBranch(Js::OpCode::BrGe_A, true, labelHelper, insertInstr); + + // $fallThrough + insertInstr->InsertBefore(labelFallthrough); +} + +bool +Lowerer::GenerateLdThisCheck(IR::Instr * instr) +{ + // + // If not a recyclable object, jump to $helper + // MOV dst, src1 -- return the object itself + // JMP $fallthrough + // $helper: + // (caller generates helper call) + // $fallthrough: + // + IR::RegOpnd * src1 = instr->GetSrc1()->AsRegOpnd(); + IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); + IR::LabelInstr * fallthrough = IR::LabelInstr::New(Js::OpCode::Label, m_func); + + GenerateIsRecyclableObject(src1, instr, helper); + + // MOV dst, src1 + if (instr->GetDst() && !instr->GetDst()->IsEqual(src1)) + { + InsertMove(instr->GetDst(), src1, instr); + } + + // JMP $fallthrough + InsertBranch(Js::OpCode::Br, fallthrough, instr); + + // $helper: + // (caller generates helper call) + // $fallthrough: + instr->InsertBefore(helper); + instr->InsertAfter(fallthrough); + + return true; +} + +// +// TEST src, Js::AtomTag +// JNE $done +// MOV typeReg, objectSrc + offsetof(RecyclableObject::type) +// CMP [typeReg + offsetof(Type::typeid)], TypeIds_ActivationObject +// JEQ $helper +// $done: +// MOV dst, src +// JMP $fallthru +// helper: +// MOV dst, undefined +// $fallthru: +bool +Lowerer::GenerateLdThisStrict(IR::Instr* instr) +{ + IR::RegOpnd * src1 = instr->GetSrc1()->AsRegOpnd(); + IR::RegOpnd * typeReg = IR::RegOpnd::New(TyMachReg, this->m_func); + IR::LabelInstr * done = IR::LabelInstr::New(Js::OpCode::Label, m_func); + IR::LabelInstr * fallthru = IR::LabelInstr::New(Js::OpCode::Label, m_func); + IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, /*helper*/true); + + bool assign = instr->GetDst() && !instr->GetDst()->IsEqual(src1); + if (!src1->IsNotTaggedValue()) + { + // TEST src1, Js::AtomTag + // JNE $done + this->m_lowererMD.GenerateObjectTest(src1, instr, assign ? done : fallthru); + } + + IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(src1, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); + Lowerer::InsertMove(typeReg, indirOpnd, instr); + + IR::IndirOpnd * typeID = IR::IndirOpnd::New(typeReg, Js::Type::GetOffsetOfTypeId(), TyInt32, this->m_func); + IR::Opnd * activationObject = IR::IntConstOpnd::New(Js::TypeIds_ActivationObject, TyMachReg, this->m_func); + Lowerer::InsertCompare(typeID, activationObject, instr); + + // JEQ $helper + Lowerer::InsertBranch(Js::OpCode::BrEq_A, helper, instr); + + if (assign) + { + // $done: + instr->InsertBefore(done); + + // MOV dst, src + Lowerer::InsertMove(instr->GetDst(), src1, instr); + } + + // JMP $fallthru + Lowerer::InsertBranch(Js::OpCode::Br, fallthru, instr); + + instr->InsertBefore(helper); + if (instr->GetDst()) + { + // MOV dst, undefined + Lowerer::InsertMove(instr->GetDst(), LoadLibraryValueOpnd(instr, LibraryValue::ValueUndefined), instr); + } + // $fallthru: + instr->InsertAfter(fallthru); + + return true; +} + +// given object instanceof function, functionReg is a register with function, +// objectReg is a register with instance and inlineCache is an InstIsInlineCache. +// We want to generate: +// +// fallback on helper (will patch the inline cache) if function does not match the cache +// MOV dst, Js::false +// CMP functionReg, [&(inlineCache->function)] +// JNE helper +// +// fallback if object is a tagged int +// TEST objectReg, Js::AtomTag +// JNE done +// + +// return false if object is a primitive +// CMP [typeReg + offsetof(Type::typeid)], TypeIds_LastJavascriptPrimitiveType +// JLE done + +// fallback if object's type is not the cached type +// MOV typeReg, objectSrc + offsetof(RecyclableObject::type) +// CMP typeReg, [&(inlineCache->type] +// JNE checkPrimType + +// use the cached result and fallthrough +// MOV dst, [&(inlineCache->result)] +// JMP done + +// +// +// $helper +// $done +bool +Lowerer::GenerateFastIsInst(IR::Instr * instr) +{ + IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); + IR::LabelInstr * done = IR::LabelInstr::New(Js::OpCode::Label, m_func); + IR::RegOpnd * typeReg = IR::RegOpnd::New(TyMachReg, this->m_func); + IR::Opnd * objectSrc; + IR::RegOpnd * objectReg; + IR::Opnd * functionSrc; + IR::RegOpnd * functionReg; + intptr_t inlineCache; + IR::Instr * instrArg; + + // We are going to use the extra ArgOut_A instructions to lower the helper call later, + // so we leave them alone here and clean them up then. + inlineCache = instr->m_func->GetJITFunctionBody()->GetIsInstInlineCache(instr->GetSrc1()->AsIntConstOpnd()->AsUint32()); + Assert(instr->GetSrc2()->AsRegOpnd()->m_sym->m_isSingleDef); + instrArg = instr->GetSrc2()->AsRegOpnd()->m_sym->m_instrDef; + + objectSrc = instrArg->GetSrc1(); + Assert(instrArg->GetSrc2()->AsRegOpnd()->m_sym->m_isSingleDef); + instrArg = instrArg->GetSrc2()->AsRegOpnd()->m_sym->m_instrDef; + + functionSrc = instrArg->GetSrc1(); + Assert(instrArg->GetSrc2() == nullptr); + + // MOV dst, Js::false + InsertMove(instr->GetDst(), LoadLibraryValueOpnd(instr, LibraryValue::ValueFalse), instr); + + if (functionSrc->IsRegOpnd()) + { + functionReg = functionSrc->AsRegOpnd(); + } + else + { + functionReg = IR::RegOpnd::New(TyMachReg, this->m_func); + // MOV functionReg, functionSrc + InsertMove(functionReg, functionSrc, instr); + } + + // CMP functionReg, [&(inlineCache->function)] + { + IR::Opnd* cacheFunction = IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfFunction(), TyMachReg, m_func, IR::AddrOpndKindDynamicIsInstInlineCacheFunctionRef); + InsertCompare(functionReg, cacheFunction, instr); + } + + // JNE helper + InsertBranch(Js::OpCode::BrNeq_A, helper, instr); + + if (objectSrc->IsRegOpnd()) + { + objectReg = objectSrc->AsRegOpnd(); + } + else + { + objectReg = IR::RegOpnd::New(TyMachReg, this->m_func); + // MOV objectReg, objectSrc + InsertMove(objectReg, objectSrc, instr); + } + + // TEST objectReg, Js::AtomTag + // JNE done + m_lowererMD.GenerateObjectTest(objectReg, instr, done); + + // MOV typeReg, objectSrc + offsetof(RecyclableObject::type) + InsertMove(typeReg, IR::IndirOpnd::New(objectReg, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, m_func), instr); + + // CMP [typeReg + offsetof(Type::typeid)], TypeIds_LastJavascriptPrimitiveType + { + IR::IndirOpnd * typeId = IR::IndirOpnd::New(typeReg, Js::Type::GetOffsetOfTypeId(), TyInt32, m_func); + IR::IntConstOpnd * lastPrimitive = IR::IntConstOpnd::New(Js::TypeId::TypeIds_LastJavascriptPrimitiveType, TyInt32, m_func); + InsertCompare(typeId, lastPrimitive, instr); + } + + // JLE done + InsertBranch(Js::OpCode::BrLe_A, done, instr); + + // CMP typeReg, [&(inlineCache->type] + { + IR::Opnd * cacheType = IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfType(), TyMachReg, m_func, IR::AddrOpndKindDynamicIsInstInlineCacheTypeRef); + InsertCompare(typeReg, cacheType, instr); + } + + // JNE helper + InsertBranch(Js::OpCode::BrNeq_A, helper, instr); + + // MOV dst, [&(inlineCache->result)] + { + IR::Opnd * cacheResult = IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfResult(), TyMachReg, m_func, IR::AddrOpndKindDynamicIsInstInlineCacheResultRef); + InsertMove(instr->GetDst(), cacheResult, instr); + } + + // JMP done + InsertBranch(Js::OpCode::Br, done, instr); + + // LABEL helper + instr->InsertBefore(helper); + + instr->InsertAfter(done); + + return true; +} + +void Lowerer::GenerateBooleanNegate(IR::Instr * instr, IR::Opnd * srcBool, IR::Opnd * dst) +{ + // dst = src + // dst = dst ^ (true ^ false) (= !src) + Lowerer::InsertMove(dst, srcBool, instr); + ScriptContextInfo* sci = instr->m_func->GetScriptContextInfo(); + IR::AddrOpnd* xorval = IR::AddrOpnd::New(sci->GetTrueAddr() ^ sci->GetFalseAddr(), IR::AddrOpndKindDynamicMisc, instr->m_func, true); + InsertXor(dst, dst, xorval, instr); +} + +bool Lowerer::GenerateJSBooleanTest(IR::RegOpnd * regSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel) +{ + if (regSrc->GetValueType().IsBoolean()) + { + if (fContinueLabel) + { + // JMP $labelTarget + InsertBranch(Js::OpCode::Br, labelTarget, insertInstr); +#if DBG + if (labelTarget->isOpHelper) + { + labelTarget->m_noHelperAssert = true; + } +#endif + } + return false; + } + + IR::IndirOpnd * vtablePtrOpnd = IR::IndirOpnd::New(regSrc, 0, TyMachPtr, this->m_func); + IR::Opnd * jsBooleanVTable = LoadVTableValueOpnd(insertInstr, VTableValue::VtableJavascriptBoolean); + InsertCompare(vtablePtrOpnd, jsBooleanVTable, insertInstr); + + if (fContinueLabel) + { + // JEQ $labelTarget + InsertBranch(Js::OpCode::BrEq_A, labelTarget, insertInstr); + + // $helper + InsertLabel(true, insertInstr); + } + else + { + // JNE $labelTarget + InsertBranch(Js::OpCode::BrNeq_A, labelTarget, insertInstr); + } + return true; +} + +bool Lowerer::GenerateFastEqBoolInt(IR::Instr * instr, bool *pNeedHelper, bool isInHelper) +{ + Assert(instr); + + // There's a total of 8 modes for this function, based on these inferred flags + bool isBranchNotCompare = instr->IsBranchInstr(); + bool isStrict = false; + bool isNegOp = false; + + switch (instr->m_opcode) + { + case Js::OpCode::BrSrEq_A: + case Js::OpCode::BrSrNotNeq_A: + case Js::OpCode::BrSrNeq_A: + case Js::OpCode::BrSrNotEq_A: + case Js::OpCode::CmSrEq_A: + case Js::OpCode::CmSrNeq_A: + isStrict = true; + break; + default: + break; + } + switch (instr->m_opcode) + { + case Js::OpCode::BrSrEq_A: + case Js::OpCode::BrSrNotNeq_A: + case Js::OpCode::CmSrEq_A: + case Js::OpCode::BrEq_A: + case Js::OpCode::BrNotNeq_A: + case Js::OpCode::CmEq_A: + isNegOp = false; + break; + case Js::OpCode::BrSrNeq_A: + case Js::OpCode::BrSrNotEq_A: + case Js::OpCode::CmSrNeq_A: + case Js::OpCode::BrNeq_A: + case Js::OpCode::BrNotEq_A: + case Js::OpCode::CmNeq_A: + isNegOp = true; + break; + default: + // This opcode is not one of the ones that should be handled here. + return false; + break; + } + + IR::Opnd *src1 = instr->GetSrc1(); + IR::Opnd *src2 = instr->GetSrc2(); + + // The instrucions given to this _should_ all be 2-arg. + Assert(src1 && src2); + if (!(src1 && src2)) + { + return false; + } + + // If it's a branch instruction, we'll want these to be defined + //IR::BranchInstr *instrBranch = nullptr; + IR::LabelInstr *targetInstr = nullptr; + IR::LabelInstr *labelFallthrough = nullptr; + + if (isBranchNotCompare) + { + IR::BranchInstr * instrBranch = instr->AsBranchInstr(); + targetInstr = instrBranch->GetTarget(); + labelFallthrough = instrBranch->GetOrCreateContinueLabel(isInHelper); + } + + // Assume we need the helper until we can show otherwise. + *pNeedHelper = true; + // If we don't know the final types well enough at JIT time, a helper block to set + // the inputs to the correct types will be needed. + IR::LabelInstr *labelHelper = nullptr; + // If we're doing a compare and can handle it early, then we want to skip the helper + IR::LabelInstr *labelDone = instr->GetOrCreateContinueLabel(isInHelper); + + // Normallize for orderings + IR::Opnd *srcBool = nullptr; + IR::Opnd *srcInt = nullptr; + if (src1->GetValueType().IsLikelyBoolean() && src2->GetValueType().IsLikelyTaggedInt()) + { + srcBool = src1; + srcInt = src2; } else if (src1->GetValueType().IsLikelyTaggedInt() && src2->GetValueType().IsLikelyBoolean()) { @@ -20931,7 +21375,7 @@ bool Lowerer::GenerateFastEqBoolInt(IR::Instr * instr, bool *pNeedHelper, bool i { this->m_lowererMD.GenerateObjectTest(srcBool->AsRegOpnd(), instr, labelHelper, false); } - this->m_lowererMD.GenerateJSBooleanTest(srcBool->AsRegOpnd(), instr, labelHelper, false); + GenerateJSBooleanTest(srcBool->AsRegOpnd(), instr, labelHelper, false); } } @@ -20961,7 +21405,7 @@ bool Lowerer::GenerateFastEqBoolInt(IR::Instr * instr, bool *pNeedHelper, bool i } else { - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, inequalResultValue), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, inequalResultValue), instr); instr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelDone, this->m_func)); } } @@ -20988,7 +21432,7 @@ bool Lowerer::GenerateFastEqBoolInt(IR::Instr * instr, bool *pNeedHelper, bool i else { // For constant compares, load the constant result - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, sameVal && srcIntIsBoolable ? equalResultValue : inequalResultValue), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, sameVal && srcIntIsBoolable ? equalResultValue : inequalResultValue), instr); instr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelDone, this->m_func)); } } @@ -21058,7 +21502,7 @@ bool Lowerer::GenerateFastEqBoolInt(IR::Instr * instr, bool *pNeedHelper, bool i // the int resolves to something other than 0 or 1 (inequal to a bool) instr->InsertBefore(forceInequal); - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, inequalResultValue), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, inequalResultValue), instr); instr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelDone, this->m_func)); } } @@ -21109,7 +21553,7 @@ bool Lowerer::GenerateFastEqBoolInt(IR::Instr * instr, bool *pNeedHelper, bool i } else { - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, inequalResultValue), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, inequalResultValue), instr); instr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelDone, this->m_func)); } } @@ -21139,10 +21583,10 @@ bool Lowerer::GenerateFastEqBoolInt(IR::Instr * instr, bool *pNeedHelper, bool i InsertCompareBranch(IR::IntConstOpnd::New((((IntConstType)1) << Js::VarTag_Shift) + Js::AtomTag, IRType::TyVar, this->m_func), srcInt->AsRegOpnd(), Js::OpCode::BrNeq_A, isZero, instr, true); } instr->InsertBefore(isNonZero); - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, srcBoolConstVal ? equalResultValue : inequalResultValue), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, srcBoolConstVal ? equalResultValue : inequalResultValue), instr); instr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelDone, this->m_func)); instr->InsertBefore(isZero); - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, !srcBoolConstVal ? equalResultValue : inequalResultValue), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, !srcBoolConstVal ? equalResultValue : inequalResultValue), instr); instr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelDone, this->m_func)); } } @@ -21219,7 +21663,7 @@ bool Lowerer::GenerateFastBooleanAndObjectEqLikely(IR::Instr * instr, IR::Opnd * if (!src1->GetValueType().IsBoolean() && !src2->GetValueType().IsBoolean()) { this->m_lowererMD.GenerateObjectTest(src2->AsRegOpnd(), instr, labelHelper, false); - if (this->m_lowererMD.GenerateJSBooleanTest(src2->AsRegOpnd(), instr, labelEqualLikely, true)) + if (GenerateJSBooleanTest(src2->AsRegOpnd(), instr, labelEqualLikely, true)) { instr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelHelper, this->m_func)); } @@ -21232,9 +21676,9 @@ bool Lowerer::GenerateFastBooleanAndObjectEqLikely(IR::Instr * instr, IR::Opnd * else { this->m_lowererMD.GenerateObjectTest(src1->AsRegOpnd(), instr, labelHelper, false); - this->m_lowererMD.GenerateJSBooleanTest(src1->AsRegOpnd(), instr, labelHelper, false); + GenerateJSBooleanTest(src1->AsRegOpnd(), instr, labelHelper, false); this->m_lowererMD.GenerateObjectTest(src2->AsRegOpnd(), instr, labelHelper, false); - if (this->m_lowererMD.GenerateJSBooleanTest(src2->AsRegOpnd(), instr, labelEqualLikely, true)) + if (GenerateJSBooleanTest(src2->AsRegOpnd(), instr, labelEqualLikely, true)) { instr->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, labelHelper, this->m_func)); } @@ -21252,13 +21696,13 @@ bool Lowerer::GenerateFastBooleanAndObjectEqLikely(IR::Instr * instr, IR::Opnd * // If not strictBr, verify both sides are dynamic objects this->m_lowererMD.GenerateObjectTest(src1->AsRegOpnd(), instr, labelHelper, false); this->m_lowererMD.GenerateObjectTest(src2->AsRegOpnd(), instr, labelHelper, false); - this->m_lowererMD.GenerateIsDynamicObject(src1->AsRegOpnd(), instr, labelTypeIdCheck, false); + GenerateIsDynamicObject(src1->AsRegOpnd(), instr, labelTypeIdCheck, false); } else { this->m_lowererMD.GenerateObjectTest(src2->AsRegOpnd(), instr, labelHelper, false); } - this->m_lowererMD.GenerateIsDynamicObject(src2->AsRegOpnd(), instr, labelEqualLikely, true); + GenerateIsDynamicObject(src2->AsRegOpnd(), instr, labelEqualLikely, true); instr->InsertBefore(labelTypeIdCheck); @@ -21347,19 +21791,19 @@ bool Lowerer::GenerateFastCmEqLikely(IR::Instr * instr, bool *pNeedHelper, bool if (src1->IsEqual(src2)) { - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, successValueType), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, successValueType), instr); instr->InsertBefore(IR::BranchInstr::New(this->m_lowererMD.MDUncondBranchOpcode, labelDone, this->m_func)); } else { IR::LabelInstr *cmEqual = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isInHelper); this->InsertCompareBranch(src1, src2, isStrict ? Js::OpCode::BrSrEq_A : Js::OpCode::BrEq_A, cmEqual, instr); - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, failureValueType), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, failureValueType), instr); instr->InsertBefore(IR::BranchInstr::New(this->m_lowererMD.MDUncondBranchOpcode, labelDone, this->m_func)); instr->InsertBefore(cmEqual); - LowererMD::CreateAssign(instr->GetDst(), this->LoadLibraryValueOpnd(instr, successValueType), instr); + Lowerer::InsertMove(instr->GetDst(), this->LoadLibraryValueOpnd(instr, successValueType), instr); instr->InsertBefore(IR::BranchInstr::New(this->m_lowererMD.MDUncondBranchOpcode, labelDone, this->m_func)); } @@ -22230,17 +22674,7 @@ Lowerer::TryGenerateFastBrOrCmTypeOf(IR::Instr *instr, IR::Instr **prev, bool is *pfNoLower = true; if (instr->IsBranchInstr()) { - if (instrSrc1->IsEqual(instrSrc2)) - { - if (!isNeqOp) - { - InsertBranch(Js::OpCode::Br, instr->AsBranchInstr()->GetTarget(), instr); - } - } - else - { - InsertCompareBranch(instrSrc1, instrSrc2, isNeqOp ? Js::OpCode::BrNeq_A : Js::OpCode::BrEq_A, instr->AsBranchInstr()->GetTarget(), instr); - } + InsertCompareBranch(instrSrc1, instrSrc2, isNeqOp ? Js::OpCode::BrNeq_A : Js::OpCode::BrEq_A, instr->AsBranchInstr()->GetTarget(), instr); instr->Remove(); } else @@ -22589,6 +23023,7 @@ Lowerer::GenerateFastCmTypeOf(IR::Instr *compare, IR::RegOpnd *object, IR::IntCo else // Other primitive types don't need helper { typeOf->Remove(); + dst = compare->UnlinkDst()->AsRegOpnd(); compare->Remove(); *pfNoLower = true; } @@ -22620,9 +23055,9 @@ Lowerer::GenerateCheckForCallFlagNew(IR::Instr* instrInsert) IR::SymOpnd* callInfoOpnd = Lowerer::LoadCallInfo(instrInsert); Assert(Js::CallInfo::ksizeofCount == 24); - IR::RegOpnd* isNewFlagSetRegOpnd = IR::RegOpnd::New(TyUint32, func); + IR::RegOpnd* isNewFlagSetRegOpnd = IR::RegOpnd::New(TyMachReg, func); - InsertAnd(isNewFlagSetRegOpnd, callInfoOpnd, IR::IntConstOpnd::New((IntConstType)Js::CallFlags_New << Js::CallInfo::ksizeofCount, TyUint32, func, true), instrInsert); + InsertAnd(isNewFlagSetRegOpnd, callInfoOpnd, IR::IntConstOpnd::New((IntConstType)Js::CallFlags_New << Js::CallInfo::ksizeofCount, TyMachReg, func, true), instrInsert); InsertTestBranch(isNewFlagSetRegOpnd, isNewFlagSetRegOpnd, Js::OpCode::BrNeq_A, labelDone, instrInsert); IR::Instr *throwInstr = IR::Instr::New( @@ -22674,15 +23109,15 @@ Lowerer::GenerateJavascriptOperatorsIsConstructorGotoElse(IR::Instr *instrInsert loop->regAlloc.liveOnBackEdgeSyms->Set(instanceRegOpnd->m_sym->m_id); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(instanceRegOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachPtr, func); - LowererMD::CreateAssign(indir0RegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(indir0RegOpnd, indirOpnd, instrInsert); indirOpnd = IR::IndirOpnd::New(indir0RegOpnd, Js::Type::GetOffsetOfTypeId(), TyUint32, func); - LowererMD::CreateAssign(indir1RegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(indir1RegOpnd, indirOpnd, instrInsert); InsertCompareBranch(indir1RegOpnd, IR::IntConstOpnd::New(Js::TypeIds_Proxy, TyUint32, func, true), Js::OpCode::BrNeq_A, labelNotProxy, instrInsert); indirOpnd = IR::IndirOpnd::New(instanceRegOpnd, Js::JavascriptProxy::GetOffsetOfTarget(), TyMachPtr, func); - LowererMD::CreateAssign(instanceRegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(instanceRegOpnd, indirOpnd, instrInsert); InsertBranch(Js::OpCode::Br, labelProxyLoop, instrInsert); @@ -22691,10 +23126,10 @@ Lowerer::GenerateJavascriptOperatorsIsConstructorGotoElse(IR::Instr *instrInsert InsertCompareBranch(indir1RegOpnd, IR::IntConstOpnd::New(Js::TypeIds_Function, TyUint32, func, true), Js::OpCode::BrNeq_A, labelReturnFalse, instrInsert); indirOpnd = IR::IndirOpnd::New(instanceRegOpnd, Js::JavascriptFunction::GetOffsetOfFunctionInfo(), TyMachPtr, func); - LowererMD::CreateAssign(indir0RegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(indir0RegOpnd, indirOpnd, instrInsert); indirOpnd = IR::IndirOpnd::New(indir0RegOpnd, Js::FunctionInfo::GetAttributesOffset(), TyUint32, func); - LowererMD::CreateAssign(indir1RegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(indir1RegOpnd, indirOpnd, instrInsert); InsertTestBranch(indir1RegOpnd, IR::IntConstOpnd::New(Js::FunctionInfo::Attributes::ErrorOnNew, TyUint32, func, true), Js::OpCode::BrNeq_A, labelReturnFalse, instrInsert); @@ -22715,15 +23150,15 @@ Lowerer::GenerateRecyclableObjectGetPrototypeNullptrGoto(IR::Instr *instrInsert, IR::RegOpnd *flagsRegOpnd = IR::RegOpnd::New(TyUint32, func); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(instanceRegOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachPtr, func); - LowererMD::CreateAssign(instanceRegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(instanceRegOpnd, indirOpnd, instrInsert); indirOpnd = IR::IndirOpnd::New(instanceRegOpnd, Js::Type::GetOffsetOfFlags(), TyUint32, func); - LowererMD::CreateAssign(flagsRegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(flagsRegOpnd, indirOpnd, instrInsert); InsertTestBranch(flagsRegOpnd, IR::IntConstOpnd::New(TypeFlagMask_HasSpecialPrototype, TyUint32, func, true), Js::OpCode::BrNeq_A, labelReturnNullptr, instrInsert); indirOpnd = IR::IndirOpnd::New(instanceRegOpnd, Js::Type::GetOffsetOfPrototype(), TyMachPtr, func); - LowererMD::CreateAssign(instanceRegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(instanceRegOpnd, indirOpnd, instrInsert); } void @@ -22760,22 +23195,22 @@ Lowerer::GenerateLdHomeObj(IR::Instr* instr) IR::Opnd *dstOpnd = instr->GetDst(); Assert(dstOpnd->IsRegOpnd()); - LowererMD::CreateAssign(dstOpnd, opndUndefAddress, instr); + Lowerer::InsertMove(dstOpnd, opndUndefAddress, instr); IR::Opnd * functionObjOpnd = nullptr; m_lowererMD.LoadFunctionObjectOpnd(instr, functionObjOpnd); - LowererMD::CreateAssign(instanceRegOpnd, functionObjOpnd, instr); + Lowerer::InsertMove(instanceRegOpnd, functionObjOpnd, instr); IR::Opnd * vtableAddressOpnd = this->LoadVTableValueOpnd(instr, VTableValue::VtableStackScriptFunction); InsertCompareBranch(IR::IndirOpnd::New(instanceRegOpnd, 0, TyMachPtr, func), vtableAddressOpnd, Js::OpCode::BrEq_A, true, labelDone, instr); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(instanceRegOpnd, Js::ScriptFunction::GetOffsetOfHomeObj(), TyMachPtr, func); - LowererMD::CreateAssign(instanceRegOpnd, indirOpnd, instr); + Lowerer::InsertMove(instanceRegOpnd, indirOpnd, instr); InsertTestBranch(instanceRegOpnd, instanceRegOpnd, Js::OpCode::BrEq_A, labelDone, instr); - LowererMD::CreateAssign(dstOpnd, instanceRegOpnd, instr); + Lowerer::InsertMove(dstOpnd, instanceRegOpnd, instr); instr->InsertBefore(labelDone); instr->Remove(); @@ -22823,17 +23258,17 @@ Lowerer::GenerateLdHomeObjProto(IR::Instr* instr) IR::Opnd *dstOpnd = instr->GetDst(); Assert(dstOpnd->IsRegOpnd()); - LowererMD::CreateAssign(dstOpnd, opndUndefAddress, instr); - LowererMD::CreateAssign(instanceRegOpnd, src1Opnd, instr); + Lowerer::InsertMove(dstOpnd, opndUndefAddress, instr); + Lowerer::InsertMove(instanceRegOpnd, src1Opnd, instr); InsertTestBranch(instanceRegOpnd, instanceRegOpnd, Js::OpCode::BrEq_A, labelDone, instr); this->GenerateRecyclableObjectIsElse(instr, instanceRegOpnd, labelDone); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(instanceRegOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachPtr, func); - LowererMD::CreateAssign(typeRegOpnd, indirOpnd, instr); + Lowerer::InsertMove(typeRegOpnd, indirOpnd, instr); indirOpnd = IR::IndirOpnd::New(typeRegOpnd, Js::Type::GetOffsetOfTypeId(), TyUint32, func); - LowererMD::CreateAssign(typeIdRegOpnd, indirOpnd, instr); + Lowerer::InsertMove(typeIdRegOpnd, indirOpnd, instr); InsertCompareBranch(typeIdRegOpnd, IR::IntConstOpnd::New(Js::TypeId::TypeIds_Null, TyUint32, func, true), Js::OpCode::BrEq_A, labelErr, instr); InsertCompareBranch(typeIdRegOpnd, IR::IntConstOpnd::New(Js::TypeId::TypeIds_Undefined, TyUint32, func, true), Js::OpCode::BrNeq_A, labelNoErr, instr); @@ -22846,7 +23281,7 @@ Lowerer::GenerateLdHomeObjProto(IR::Instr* instr) this->GenerateRecyclableObjectGetPrototypeNullptrGoto(instr, instanceRegOpnd, labelDone); this->GenerateRecyclableObjectIsElse(instr, instanceRegOpnd, labelDone); - LowererMD::CreateAssign(dstOpnd, instanceRegOpnd, instr); + Lowerer::InsertMove(dstOpnd, instanceRegOpnd, instr); instr->InsertBefore(labelDone); instr->Remove(); @@ -22861,7 +23296,7 @@ Lowerer::GenerateLdFuncObj(IR::Instr* instr) IR::Opnd *functionObjOpnd = nullptr; m_lowererMD.LoadFunctionObjectOpnd(instr, functionObjOpnd); - LowererMD::CreateAssign(dstOpnd, functionObjOpnd, instr); + Lowerer::InsertMove(dstOpnd, functionObjOpnd, instr); instr->Remove(); } @@ -22894,11 +23329,11 @@ Lowerer::GenerateLdFuncObjProto(IR::Instr* instr) IR::RegOpnd *instanceRegOpnd = IR::RegOpnd::New(TyMachPtr, func); IR::Opnd *dstOpnd = instr->GetDst(); - LowererMD::CreateAssign(instanceRegOpnd, src1Opnd, instr); + Lowerer::InsertMove(instanceRegOpnd, src1Opnd, instr); this->GenerateRecyclableObjectGetPrototypeNullptrGoto(instr, instanceRegOpnd, helperLabelThrowTypeError); - LowererMD::CreateAssign(dstOpnd, instanceRegOpnd, instr); + Lowerer::InsertMove(dstOpnd, instanceRegOpnd, instr); this->GenerateJavascriptOperatorsIsConstructorGotoElse(instr, instanceRegOpnd, labelDone, helperLabelThrowTypeError); @@ -22933,7 +23368,7 @@ Lowerer::GenerateSetHomeObj(IR::Instr* instrInsert) Assert(src1Opnd != nullptr && src2Opnd != nullptr); - LowererMD::CreateAssign(funcObjRegOpnd, src1Opnd, instrInsert); + Lowerer::InsertMove(funcObjRegOpnd, src1Opnd, instrInsert); IR::Opnd * vtableAddressOpnd = this->LoadVTableValueOpnd(instrInsert, VTableValue::VtableJavascriptGeneratorFunction); InsertCompareBranch(IR::IndirOpnd::New(funcObjRegOpnd, 0, TyMachPtr, func), vtableAddressOpnd, @@ -22946,12 +23381,12 @@ Lowerer::GenerateSetHomeObj(IR::Instr* instrInsert) instrInsert->InsertBefore(labelForGeneratorScriptFunction); indirOpnd = IR::IndirOpnd::New(funcObjRegOpnd, Js::JavascriptGeneratorFunction::GetOffsetOfScriptFunction(), TyMachPtr, func); - LowererMD::CreateAssign(funcObjRegOpnd, indirOpnd, instrInsert); + Lowerer::InsertMove(funcObjRegOpnd, indirOpnd, instrInsert); instrInsert->InsertBefore(labelScriptFunction); indirOpnd = IR::IndirOpnd::New(funcObjRegOpnd, Js::ScriptFunction::GetOffsetOfHomeObj(), TyMachPtr, func); - LowererMD::CreateAssign(indirOpnd, src2Opnd, instrInsert); + Lowerer::InsertMove(indirOpnd, src2Opnd, instrInsert); instrInsert->Remove(); } @@ -22989,13 +23424,13 @@ Lowerer::GenerateLoadNewTarget(IR::Instr* instrInsert) IR::Opnd *dstOpnd = instrInsert->GetDst(); Assert(dstOpnd->IsRegOpnd()); - LowererMD::CreateAssign(dstOpnd, opndUndefAddress, instrInsert); + Lowerer::InsertMove(dstOpnd, opndUndefAddress, instrInsert); IR::SymOpnd *callInfoOpnd = Lowerer::LoadCallInfo(instrInsert); Assert(Js::CallInfo::ksizeofCount == 24); IR::RegOpnd *s1 = IR::RegOpnd::New(TyUint32, func); - LowererMD::CreateAssign(s1, callInfoOpnd, instrInsert); + Lowerer::InsertMove(s1, callInfoOpnd, instrInsert); InsertTestBranch(s1, IR::IntConstOpnd::New((IntConstType)Js::CallFlags_NewTarget << Js::CallInfo::ksizeofCount, TyUint32, func, true), Js::OpCode::BrNeq_A, labelLoadArgNewTarget, instrInsert); @@ -23012,8 +23447,8 @@ Lowerer::GenerateLoadNewTarget(IR::Instr* instrInsert) InsertAnd(s1, s1, IR::IntConstOpnd::New(0x00FFFFFF, TyUint32, func, true), instrInsert); // callInfo.Count - // [formalOffset (4) + callInfo.Count -1] points to 'new.target' - see diagram in GenerateLoadStackArgumentByIndex() - GenerateLoadStackArgumentByIndex(dstOpnd, s1, instrInsert, -1, m_func); + // [formalOffset (4) + callInfo.Count] points to 'new.target' - see diagram in GenerateLoadStackArgumentByIndex() + GenerateLoadStackArgumentByIndex(dstOpnd, s1, instrInsert, 0, m_func); instrInsert->InsertBefore(labelDone); instrInsert->Remove(); @@ -23059,7 +23494,7 @@ Lowerer::GetInlineCacheFromFuncObjectForRuntimeUse(IR::Instr * instr, IR::Proper LoadFuncExpression(funcObjInstr); IR::RegOpnd * funcObjHasInlineCachesOpnd = IR::RegOpnd::New(TyMachPtr, instr->m_func); - this->m_lowererMD.CreateAssign(funcObjHasInlineCachesOpnd, IR::IndirOpnd::New(funcObjOpnd, Js::ScriptFunction::GetOffsetOfHasInlineCaches(), TyUint8, instr->m_func), instr); + this->InsertMove(funcObjHasInlineCachesOpnd, IR::IndirOpnd::New(funcObjOpnd, Js::ScriptFunction::GetOffsetOfHasInlineCaches(), TyUint8, instr->m_func), instr); IR::LabelInstr * inlineCachesNullLabel = IR::LabelInstr::New(Js::OpCode::Label, instr->m_func, isHelper); InsertTestBranch(funcObjHasInlineCachesOpnd, funcObjHasInlineCachesOpnd, Js::OpCode::BrEq_A, inlineCachesNullLabel, instr); @@ -23083,7 +23518,7 @@ Lowerer::GetInlineCacheFromFuncObjectForRuntimeUse(IR::Instr * instr, IR::Proper IR::LabelInstr * continueLabel = IR::LabelInstr::New(Js::OpCode::Label, instr->m_func, isHelper); InsertBranch(LowererMD::MDUncondBranchOpcode, continueLabel, instr); - IR::Instr * ldCacheFromPropSymOpndInstr = this->m_lowererMD.CreateAssign(inlineCacheOpnd, IR::AddrOpnd::New(propSymOpnd->m_runtimeInlineCache, IR::AddrOpndKindDynamicInlineCache, this->m_func), instr); + IR::Instr * ldCacheFromPropSymOpndInstr = this->InsertMove(inlineCacheOpnd, IR::AddrOpnd::New(propSymOpnd->m_runtimeInlineCache, IR::AddrOpndKindDynamicInlineCache, this->m_func), instr); ldCacheFromPropSymOpndInstr->InsertBefore(inlineCachesNullLabel); ldCacheFromPropSymOpndInstr->InsertAfter(continueLabel); @@ -23709,11 +24144,11 @@ void Lowerer::GenerateNullOutGeneratorFrame(IR::Instr* insertInstr) m_func->SetArgOffset(symSrc, LowererMD::GetFormalParamOffset() * MachPtr); IR::SymOpnd *srcOpnd = IR::SymOpnd::New(symSrc, TyMachPtr, m_func); IR::RegOpnd *dstOpnd = IR::RegOpnd::New(TyMachReg, m_func); - m_lowererMD.CreateAssign(dstOpnd, srcOpnd, insertInstr); + InsertMove(dstOpnd, srcOpnd, insertInstr); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(dstOpnd, Js::JavascriptGenerator::GetFrameOffset(), TyMachPtr, m_func); IR::AddrOpnd *addrOpnd = IR::AddrOpnd::NewNull(m_func); - m_lowererMD.CreateAssign(indirOpnd, addrOpnd, insertInstr); + InsertMove(indirOpnd, addrOpnd, insertInstr); } void Lowerer::LowerFunctionExit(IR::Instr* funcExit) @@ -23833,6 +24268,257 @@ Lowerer::CreateClearImplicitCallFlagsOpnd() return IR::IntConstOpnd::New(Js::ImplicitCall_None, GetImplicitCallFlagsType(), m_func); } +void +Lowerer::GenerateFlagInlineCacheCheckForGetterSetter( + IR::Instr * insertBeforeInstr, + IR::RegOpnd * opndInlineCache, + IR::LabelInstr * labelNext) +{ + uint accessorFlagMask; + if (PHASE_OFF(Js::InlineGettersPhase, insertBeforeInstr->m_func)) + { + accessorFlagMask = Js::InlineCache::GetSetterFlagMask(); + } + else if (PHASE_OFF(Js::InlineSettersPhase, insertBeforeInstr->m_func)) + { + accessorFlagMask = Js::InlineCache::GetGetterFlagMask(); + } + else + { + accessorFlagMask = Js::InlineCache::GetGetterSetterFlagMask(); + } + + // Generate: + // + // TEST [&(inlineCache->u.accessor.flags)], Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag + // JEQ $next + + IR::Opnd * flagsOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.rawUInt16), TyInt8, insertBeforeInstr->m_func); + IR::Opnd * accessorOpnd = IR::IntConstOpnd::New(accessorFlagMask, TyInt8, this->m_func); + InsertTestBranch(flagsOpnd, accessorOpnd, Js::OpCode::BrEq_A, labelNext, insertBeforeInstr); +} + +IR::BranchInstr * +Lowerer::GenerateLocalInlineCacheCheck( + IR::Instr * instrLdSt, + IR::RegOpnd * opndType, + IR::RegOpnd * inlineCache, + IR::LabelInstr * labelNext, + bool checkTypeWithoutProperty) +{ + // Generate: + // + // CMP s1, [&(inlineCache->u.local.type/typeWithoutProperty)] + // JNE $next + + IR::Opnd* typeOpnd; + if (checkTypeWithoutProperty) + { + typeOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.local.typeWithoutProperty), TyMachReg, instrLdSt->m_func); + } + else + { + typeOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.local.type), TyMachReg, instrLdSt->m_func); + } + + InsertCompare(opndType, typeOpnd, instrLdSt); + return InsertBranch(Js::OpCode::BrNeq_A, labelNext, instrLdSt); +} + +IR::BranchInstr * +Lowerer::GenerateProtoInlineCacheCheck( + IR::Instr * instrLdSt, + IR::RegOpnd * opndType, + IR::RegOpnd * inlineCache, + IR::LabelInstr * labelNext) +{ + // Generate: + // + // CMP s1, [&(inlineCache->u.proto.type)] + // JNE $next + + IR::Opnd* typeOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.proto.type), TyMachReg, instrLdSt->m_func); + + InsertCompare(opndType, typeOpnd, instrLdSt); + return InsertBranch(Js::OpCode::BrNeq_A, labelNext, instrLdSt); +} + +IR::BranchInstr * +Lowerer::GenerateFlagInlineCacheCheck( + IR::Instr * instrLdSt, + IR::RegOpnd * opndType, + IR::RegOpnd * opndInlineCache, + IR::LabelInstr * labelNext) +{ + // Generate: + // + // CMP s1, [&(inlineCache->u.accessor.type)] + // JNE $next + + IR::Opnd* typeOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.type), TyMachReg, instrLdSt->m_func); + + InsertCompare(opndType, typeOpnd, instrLdSt); + return InsertBranch(Js::OpCode::BrNeq_A, labelNext, instrLdSt); +} + +void +Lowerer::GenerateLdFldFromLocalInlineCache( + IR::Instr * instrLdFld, + IR::RegOpnd * opndBase, + IR::Opnd * opndDst, + IR::RegOpnd * opndInlineCache, + IR::LabelInstr * labelFallThru, + bool isInlineSlot) +{ + // Generate: + // + // s1 = MOV base->slots -- load the slot array + // s2 = MOVZXw [&(inlineCache->u.local.slotIndex)] -- load the cached slot index + // dst = MOV [s1 + s2 * Scale] -- load the value directly from the slot + // JMP $fallthru + + IR::IndirOpnd * opndIndir = nullptr; + IR::RegOpnd * opndSlotArray = nullptr; + + if (!isInlineSlot) + { + opndSlotArray = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); + opndIndir = IR::IndirOpnd::New(opndBase, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrLdFld->m_func); + InsertMove(opndSlotArray, opndIndir, instrLdFld); + } + + // s2 = MOVZXw [&(inlineCache->u.local.slotIndex)] -- load the cached slot index + IR::RegOpnd * opndReg2 = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); + opndIndir = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.local.slotIndex), TyUint16, instrLdFld->m_func); + InsertMove(opndReg2, opndIndir, instrLdFld); + + if (isInlineSlot) + { + // dst = MOV [base + s2 * Scale] -- load the value directly from the slot + opndIndir = IR::IndirOpnd::New(opndBase, opndReg2, LowererMD::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); + InsertMove(opndDst, opndIndir, instrLdFld); + } + else + { + // dst = MOV [s1 + s2 * Scale] -- load the value directly from the slot + opndIndir = IR::IndirOpnd::New(opndSlotArray, opndReg2, LowererMD::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); + InsertMove(opndDst, opndIndir, instrLdFld); + } + + // JMP $fallthru + InsertBranch(Js::OpCode::Br, labelFallThru, instrLdFld); +} + +void +Lowerer::GenerateLdFldFromProtoInlineCache( + IR::Instr * instrLdFld, + IR::RegOpnd * opndBase, + IR::Opnd * opndDst, + IR::RegOpnd * inlineCache, + IR::LabelInstr * labelFallThru, + bool isInlineSlot) +{ + // Generate: + // + // s1 = MOV [&(inlineCache->u.proto.prototypeObject)] -- load the cached prototype object + // s1 = MOV [&s1->slots] -- load the slot array + // s2 = MOVZXW [&(inlineCache->u.proto.slotIndex)] -- load the cached slot index + // dst = MOV [s1 + s2*4] + // JMP $fallthru + + IR::IndirOpnd * opndIndir = nullptr; + IR::RegOpnd * opndProtoSlots = nullptr; + + // s1 = MOV [&(inlineCache->u.proto.prototypeObject)] -- load the cached prototype object + IR::RegOpnd * opndProto = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); + opndIndir = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.proto.prototypeObject), TyMachReg, instrLdFld->m_func); + InsertMove(opndProto, opndIndir, instrLdFld); + + if (!isInlineSlot) + { + // s1 = MOV [&s1->slots] -- load the slot array + opndProtoSlots = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); + opndIndir = IR::IndirOpnd::New(opndProto, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrLdFld->m_func); + InsertMove(opndProtoSlots, opndIndir, instrLdFld); + } + + // s2 = MOVZXW [&(inlineCache->u.proto.slotIndex)] -- load the cached slot index + IR::RegOpnd * opndSlotIndex = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); + opndIndir = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.proto.slotIndex), TyUint16, instrLdFld->m_func); + InsertMove(opndSlotIndex, opndIndir, instrLdFld); + + if (isInlineSlot) + { + // dst = MOV [s1 + s2*4] + opndIndir = IR::IndirOpnd::New(opndProto, opndSlotIndex, LowererMD::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); + InsertMove(opndDst, opndIndir, instrLdFld); + } + else + { + // dst = MOV [s1 + s2*4] + opndIndir = IR::IndirOpnd::New(opndProtoSlots, opndSlotIndex, LowererMD::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); + InsertMove(opndDst, opndIndir, instrLdFld); + } + + // JMP $fallthru + InsertBranch(Js::OpCode::Br, labelFallThru, instrLdFld); +} + +void +Lowerer::GenerateLdFldFromFlagInlineCache( + IR::Instr * insertBeforeInstr, + IR::RegOpnd * opndBase, + IR::Opnd * opndDst, + IR::RegOpnd * opndInlineCache, + IR::LabelInstr * labelFallThru, + bool isInlineSlot) +{ + // Generate: + // + // s1 = MOV [&(inlineCache->u.accessor.object)] -- load the cached prototype object + // s1 = MOV [&s1->slots] -- load the slot array + // s2 = MOVZXW [&(inlineCache->u.accessor.slotIndex)] -- load the cached slot index + // dst = MOV [s1 + s2 * 4] + // JMP $fallthru + + IR::IndirOpnd * opndIndir = nullptr; + IR::RegOpnd * opndObjSlots = nullptr; + + // s1 = MOV [&(inlineCache->u.accessor.object)] -- load the cached prototype object + IR::RegOpnd * opndObject = IR::RegOpnd::New(TyMachReg, this->m_func); + opndIndir = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.object), TyMachReg, this->m_func); + InsertMove(opndObject, opndIndir, insertBeforeInstr); + + if (!isInlineSlot) + { + // s1 = MOV [&s1->slots] -- load the slot array + opndObjSlots = IR::RegOpnd::New(TyMachReg, this->m_func); + opndIndir = IR::IndirOpnd::New(opndObject, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, this->m_func); + InsertMove(opndObjSlots, opndIndir, insertBeforeInstr); + } + + // s2 = MOVZXW [&(inlineCache->u.accessor.slotIndex)] -- load the cached slot index + IR::RegOpnd * opndSlotIndex = IR::RegOpnd::New(TyMachReg, this->m_func); + opndIndir = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.slotIndex), TyUint16, this->m_func); + InsertMove(opndSlotIndex, opndIndir, insertBeforeInstr); + + if (isInlineSlot) + { + // dst = MOV [s1 + s2 * 4] + opndIndir = IR::IndirOpnd::New(opndObject, opndSlotIndex, this->m_lowererMD.GetDefaultIndirScale(), TyMachReg, this->m_func); + InsertMove(opndDst, opndIndir, insertBeforeInstr); + } + else + { + // dst = MOV [s1 + s2 * 4] + opndIndir = IR::IndirOpnd::New(opndObjSlots, opndSlotIndex, this->m_lowererMD.GetDefaultIndirScale(), TyMachReg, this->m_func); + InsertMove(opndDst, opndIndir, insertBeforeInstr); + } + + // JMP $fallthru + InsertBranch(Js::OpCode::Br, labelFallThru, insertBeforeInstr); +} + void Lowerer::LowerSpreadArrayLiteral(IR::Instr *instr) { @@ -24025,8 +24711,7 @@ Lowerer::LowerTrapIfZero(IR::Instr * const instr) InsertLabel(true, doneLabel); GenerateThrow(IR::IntConstOpnd::NewFromType(SCODE_CODE(WASMERR_DivideByZero), TyInt32, m_func), doneLabel); } - instr->m_opcode = Js::OpCode::Ld_I4; - LowerLdI4(instr); + LowererMD::ChangeToAssign(instr); } void @@ -24050,7 +24735,7 @@ Lowerer::LowerTrapIfMinIntOverNegOne(IR::Instr * const instr) // Const value not min int, will not trap doneLabel->Remove(); src2->Free(m_func); - LowerLdI4(instr); + LowererMD::ChangeToAssign(instr); return; } // Is min int no need to do check @@ -24066,7 +24751,7 @@ Lowerer::LowerTrapIfMinIntOverNegOne(IR::Instr * const instr) // Const value not min int, will not trap doneLabel->Remove(); src2->Free(m_func); - LowerLdI4(instr); + LowererMD::ChangeToAssign(instr); return; } // Is -1 no need to do check @@ -24078,8 +24763,7 @@ Lowerer::LowerTrapIfMinIntOverNegOne(IR::Instr * const instr) } InsertLabel(true, doneLabel); GenerateThrow(IR::IntConstOpnd::NewFromType(SCODE_CODE(VBSERR_Overflow), TyInt32, m_func), doneLabel); - instr->m_opcode = Js::OpCode::Ld_I4; - LowerLdI4(instr); + LowererMD::ChangeToAssign(instr); } void @@ -24091,19 +24775,6 @@ Lowerer::GenerateThrow(IR::Opnd* errorCode, IR::Instr * instr) LowerUnaryHelperMem(throwInstr, isWasm ? IR::HelperOp_WebAssemblyRuntimeError : IR::HelperOp_RuntimeTypeError); } -void -Lowerer::LowerLdI4(IR::Instr * const instr) -{ - if (instr->GetDst() && instr->GetDst()->IsInt64()) - { - m_lowererMD.LowerInt64Assign(instr); - } - else - { - m_lowererMD.ChangeToAssign(instr); - } -} - void Lowerer::LowerDivI4(IR::Instr * instr) { @@ -24471,8 +25142,8 @@ void Lowerer::LowerLdFrameDisplay(IR::Instr *instr, bool doStackFrameDisplay) GenerateRecyclerAlloc(IR::HelperAllocMemForVarArray, scopeSlotAllocSize, currentFrameOpnd, insertInstr, true); insertInstr->InsertBefore(labelDone); - m_lowererMD.CreateAssign(IR::SymOpnd::New(m_func->GetLocalFrameDisplaySym(), 0, TyMachReg, m_func), dstOpnd, insertInstr); - m_lowererMD.CreateAssign(IR::SymOpnd::New(m_func->GetLocalClosureSym(), 0, TyMachReg, m_func), currentFrameOpnd, insertInstr); + InsertMove(IR::SymOpnd::New(m_func->GetLocalFrameDisplaySym(), 0, TyMachReg, m_func), dstOpnd, insertInstr); + InsertMove(IR::SymOpnd::New(m_func->GetLocalClosureSym(), 0, TyMachReg, m_func), currentFrameOpnd, insertInstr); } else { @@ -24489,16 +25160,16 @@ void Lowerer::LowerLdFrameDisplay(IR::Instr *instr, bool doStackFrameDisplay) IR::Opnd *scopeOpnd = IR::RegOpnd::New(TyMachReg, func); IR::Opnd *envLoadOpnd = IR::IndirOpnd::New(envOpnd, Js::FrameDisplay::GetOffsetOfScopes() + ((i - 1) * sizeof(Js::Var)), TyMachReg, func); - m_lowererMD.CreateAssign(scopeOpnd, envLoadOpnd, instr); + InsertMove(scopeOpnd, envLoadOpnd, instr); IR::Opnd *dstStoreOpnd = IR::IndirOpnd::New(dstOpnd, Js::FrameDisplay::GetOffsetOfScopes() + (i * sizeof(Js::Var)), TyMachReg, func); - m_lowererMD.CreateAssign(dstStoreOpnd, scopeOpnd, instr); + InsertMove(dstStoreOpnd, scopeOpnd, instr); } } // Assign current element. - m_lowererMD.CreateAssign( + InsertMove( IR::IndirOpnd::New(dstOpnd, Js::FrameDisplay::GetOffsetOfScopes(), TyMachReg, func), currentFrameOpnd, instr); @@ -24507,7 +25178,7 @@ void Lowerer::LowerLdFrameDisplay(IR::Instr *instr, bool doStackFrameDisplay) uintptr_t bits = 1 | (isStrict << (Js::FrameDisplay::GetOffsetOfStrictMode() * 8)) | (frameDispLength << (Js::FrameDisplay::GetOffsetOfLength() * 8)); - m_lowererMD.CreateAssign( + InsertMove( IR::IndirOpnd::New(dstOpnd, 0, TyMachReg, func), IR::IntConstOpnd::New(bits, TyMachReg, func, true), instr); @@ -24735,6 +25406,68 @@ void Lowerer::GenerateSwitchStringLookup(IR::Instr * instr) this->LowerMultiBr(instr, IR::HelperOp_SwitchStringLookUp); } +IR::Instr * +Lowerer::LowerGetCachedFunc(IR::Instr *instr) +{ + // src1 is an ActivationObjectEx, and we want to get the function object identified by the index (src2) + // dst = MOV (src1)->GetFuncCacheEntry(src2)->func + // + // => [src1 + (offsetof(src1, cache) + (src2 * sizeof(FuncCacheEntry)) + offsetof(FuncCacheEntry, func))] + + IR::IntConstOpnd *src2Opnd = instr->UnlinkSrc2()->AsIntConstOpnd(); + IR::RegOpnd *src1Opnd = instr->UnlinkSrc1()->AsRegOpnd(); + IR::Instr *instrPrev = instr->m_prev; + + instr->SetSrc1(IR::IndirOpnd::New(src1Opnd, int32((src2Opnd->GetValue() * sizeof(Js::FuncCacheEntry)) + Js::ActivationObjectEx::GetOffsetOfCache() + offsetof(Js::FuncCacheEntry, func)), TyVar, this->m_func)); + + this->m_lowererMD.ChangeToAssign(instr); + + src2Opnd->Free(this->m_func); + + return instrPrev; +} + +IR::Instr * +Lowerer::LowerCommitScope(IR::Instr *instrCommit) +{ + IR::Instr *instrPrev = instrCommit->m_prev; + IR::RegOpnd *baseOpnd = instrCommit->UnlinkSrc1()->AsRegOpnd(); + IR::Opnd *opnd; + IR::Instr * insertInstr = instrCommit->m_next; + + // Write undef to all the local var slots. + + opnd = IR::IndirOpnd::New(baseOpnd, Js::ActivationObjectEx::GetOffsetOfCommitFlag(), TyInt8, this->m_func); + instrCommit->SetDst(opnd); + instrCommit->SetSrc1(IR::IntConstOpnd::New(1, TyInt8, this->m_func)); + LowererMD::ChangeToAssign(instrCommit); + + const Js::PropertyIdArray *propIds = instrCommit->m_func->GetJITFunctionBody()->GetFormalsPropIdArray(); + + uint firstVarSlot = (uint)Js::ActivationObjectEx::GetFirstVarSlot(propIds); + if (firstVarSlot < propIds->count) + { + // Instead of re-using the address of "undefined" for each store, put the address in a register and re-use that. + IR::RegOpnd *undefOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); + InsertMove(undefOpnd, LoadLibraryValueOpnd(insertInstr, LibraryValue::ValueUndefined), insertInstr); + + IR::RegOpnd *slotBaseOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); + + // Load a pointer to the aux slots. We assume that all ActivationObject's have only aux slots. + + opnd = IR::IndirOpnd::New(baseOpnd, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, this->m_func); + InsertMove(slotBaseOpnd, opnd, insertInstr); + + for (uint i = firstVarSlot; i < propIds->count; i++) + { + opnd = IR::IndirOpnd::New(slotBaseOpnd, i << this->m_lowererMD.GetDefaultIndirScale(), TyMachReg, this->m_func); + InsertMove(opnd, undefOpnd, insertInstr); + } + } + + return instrPrev; +} + IR::Instr * Lowerer::LowerTry(IR::Instr* instr, bool tryCatch) { @@ -24752,6 +25485,47 @@ Lowerer::LowerTry(IR::Instr* instr, bool tryCatch) IR::HelperOp_TryFinallySimpleJit : IR::HelperOp_TryFinally); } +IR::Instr * +Lowerer::LowerCatch(IR::Instr * instr) +{ + // t1 = catch => t2 = catch + // => t1 = t2 + + IR::Opnd *catchObj = instr->UnlinkDst(); + IR::RegOpnd *catchParamReg = IR::RegOpnd::New(TyMachPtr, this->m_func); + catchParamReg->SetReg(CATCH_OBJ_REG); + + instr->SetDst(catchParamReg); + + IR::Instr * mov = IR::Instr::New(Js::OpCode::Ld_A, catchObj, catchParamReg, this->m_func); + this->m_lowererMD.ChangeToAssign(mov); + instr->InsertAfter(mov); + + return instr->m_prev; +} + +IR::Instr * +Lowerer::LowerLeave(IR::Instr * leaveInstr, IR::LabelInstr * targetInstr, bool fromFinalLower, bool isOrphanedLeave) +{ + if (isOrphanedLeave) + { + Assert(this->m_func->IsLoopBodyInTry()); + leaveInstr->m_opcode = LowererMD::MDUncondBranchOpcode; + return leaveInstr->m_prev; + } + + IR::Instr * instrPrev = leaveInstr->m_prev; + IR::LabelOpnd *labelOpnd = IR::LabelOpnd::New(targetInstr, this->m_func); + m_lowererMD.LowerEHRegionReturn(leaveInstr, labelOpnd); + + if (fromFinalLower) + { + instrPrev = leaveInstr->m_prev; + } + leaveInstr->Remove(); + return instrPrev; +} + void Lowerer::EnsureBailoutReturnValueSym() { @@ -24862,19 +25636,21 @@ Lowerer::EmitEHBailoutStackRestore(IR::Instr * bailoutInstr) #ifdef _M_IX86 BailOutInfo * bailoutInfo = bailoutInstr->GetBailOutInfo(); + uint totalLiveArgCount = 0; if (bailoutInfo->startCallCount != 0) { uint totalStackToBeRestored = 0; uint stackAlignmentAdjustment = 0; for (uint i = 0; i < bailoutInfo->startCallCount; i++) { - uint startCallOutParamCount = bailoutInfo->GetStartCallOutParamCount(i); - if ((Math::Align(startCallOutParamCount * MachPtr, MachStackAlignment) - (startCallOutParamCount * MachPtr)) != 0) + uint startCallLiveArgCount = bailoutInfo->startCallInfo[i].isOrphanedCall ? 0 : bailoutInfo->GetStartCallOutParamCount(i); + if ((Math::Align(startCallLiveArgCount * MachPtr, MachStackAlignment) - (startCallLiveArgCount * MachPtr)) != 0) { stackAlignmentAdjustment++; } + totalLiveArgCount += startCallLiveArgCount; } - totalStackToBeRestored = (bailoutInfo->totalOutParamCount + stackAlignmentAdjustment) * MachPtr; + totalStackToBeRestored = (totalLiveArgCount + stackAlignmentAdjustment) * MachPtr; IR::RegOpnd * espOpnd = IR::RegOpnd::New(NULL, LowererMD::GetRegStackPointer(), TyMachReg, this->m_func); IR::Opnd * opnd = IR::IndirOpnd::New(espOpnd, totalStackToBeRestored, TyMachReg, this->m_func); @@ -24956,7 +25732,29 @@ Lowerer::InsertBitTestBranch(IR::Opnd * bitMaskOpnd, IR::Opnd * bitIndex, bool j IR::RegOpnd * lenBitOpnd = IR::RegOpnd::New(TyUint32, func); InsertMove(lenBitOpnd, IR::IntConstOpnd::New(1, TyUint32, this->m_func), insertBeforeInstr); InsertShift(Js::OpCode::Shl_I4, false, lenBitOpnd, lenBitOpnd, bitIndex, insertBeforeInstr); - InsertTestBranch(lenBitOpnd, bitMaskOpnd, jumpIfBitOn? Js::OpCode::BrNeq_A :Js::OpCode::BrEq_A, targetLabel, insertBeforeInstr); + InsertTestBranch(lenBitOpnd, bitMaskOpnd, jumpIfBitOn ? Js::OpCode::BrNeq_A : Js::OpCode::BrEq_A, targetLabel, insertBeforeInstr); +#elif defined(_M_ARM64) + + if (bitIndex->IsImmediateOpnd()) + { + // TBZ/TBNZ bitMaskOpnd, bitIndex, targetLabel + IR::Instr* branchInstr = InsertBranch(jumpIfBitOn ? Js::OpCode::TBNZ : Js::OpCode::TBZ, targetLabel, insertBeforeInstr); + branchInstr->SetSrc1(bitMaskOpnd); + branchInstr->SetSrc2(bitIndex); + } + else + { + // TBZ/TBNZ require an immediate for the bit to test, so shift the mask to place the bit we want to test at bit zero, and then test bit zero. + Func * func = this->m_func; + IR::RegOpnd * maskOpnd = IR::RegOpnd::New(TyUint32, func); + InsertShift(Js::OpCode::Shr_I4, false, maskOpnd, bitMaskOpnd, bitIndex, insertBeforeInstr); + + IR::Instr* branchInstr = InsertBranch(jumpIfBitOn ? Js::OpCode::TBNZ : Js::OpCode::TBZ, targetLabel, insertBeforeInstr); + branchInstr->SetSrc1(maskOpnd); + branchInstr->SetSrc2(IR::IntConstOpnd::New(0, TyUint32, this->m_func)); + } + + #else AssertMsg(false, "Not implemented"); #endif @@ -25024,7 +25822,7 @@ Lowerer::LowerConvNum(IR::Instr *instrLoad, bool noMathFastPath) { // MOV dst, src1 - instr = LowererMD::CreateAssign(instrLoad->GetDst(), src1, instrLoad); + instr = Lowerer::InsertMove(instrLoad->GetDst(), src1, instrLoad); if (!isInt) { @@ -25063,7 +25861,7 @@ Lowerer::LoadSlotArrayWithCachedLocalType(IR::Instr * instrInsert, IR::PropertyS // If we use the auxiliary slot array, load it and return it IR::RegOpnd *opndSlotArray = IR::RegOpnd::New(TyMachReg, this->m_func); IR::Opnd *opndIndir = IR::IndirOpnd::New(opndBase, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, this->m_func); - LowererMD::CreateAssign(opndSlotArray, opndIndir, instrInsert); + Lowerer::InsertMove(opndSlotArray, opndIndir, instrInsert); return opndSlotArray; } @@ -25086,7 +25884,7 @@ Lowerer::LoadSlotArrayWithCachedProtoType(IR::Instr * instrInsert, IR::PropertyS // If we use the auxiliary slot array, load it from the prototype object and return it IR::RegOpnd *opndSlotArray = IR::RegOpnd::New(TyMachReg, this->m_func); IR::Opnd *opnd = IR::MemRefOpnd::New((char*)prototypeObject + Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, this->m_func, IR::AddrOpndKindDynamicAuxSlotArrayRef); - LowererMD::CreateAssign(opndSlotArray, opnd, instrInsert); + Lowerer::InsertMove(opndSlotArray, opnd, instrInsert); return opndSlotArray; } else @@ -25149,6 +25947,20 @@ Lowerer::LowerLdEnv(IR::Instr * instr) return instrPrev; } +IR::Instr * +Lowerer::LowerLdSuper(IR::Instr *instr, IR::JnHelperMethod helperOpCode) +{ + IR::Opnd * functionObjOpnd; + IR::Instr * instrPrev = m_lowererMD.LoadFunctionObjectOpnd(instr, functionObjOpnd); + + LoadScriptContext(instr); + m_lowererMD.LoadHelperArgument(instr, functionObjOpnd); + m_lowererMD.ChangeToHelperCall(instr, helperOpCode); + + return instrPrev; +} + + IR::Instr * Lowerer::LowerFrameDisplayCheck(IR::Instr * instr) { @@ -25331,7 +26143,7 @@ Lowerer::LoadIndexFromLikelyFloat( //Convert uint32 to back to float for comparison that conversion was indeed successful IR::RegOpnd *floatOpndFromUint32 = IR::RegOpnd::New(TyFloat64, func); - m_lowererMD.EmitUIntToFloat(floatOpndFromUint32, int32IndexOpnd, insertBeforeInstr); + m_lowererMD.EmitUIntToFloat(floatOpndFromUint32, int32IndexOpnd->UseWithNewType(TyUint32, this->m_func), insertBeforeInstr); // compare with float from the original indexOpnd, we need floatIndex == (float64)(uint32)floatIndex InsertCompareBranch(floatOpndFromUint32, floatIndexOpnd, Js::OpCode::BrNeq_A, notIntLabel, insertBeforeInstr, false); @@ -25416,7 +26228,7 @@ Lowerer::GenerateInitForInEnumeratorFastPath(IR::Instr * instr, Js::ForInCache * // Tagged check and object check m_lowererMD.GenerateObjectTest(objectOpnd, instr, helperLabel); - m_lowererMD.GenerateIsDynamicObject(objectOpnd, instr, helperLabel); + GenerateIsDynamicObject(objectOpnd, instr, helperLabel); // Type check with cache // diff --git a/deps/chakrashim/core/lib/Backend/Lower.h b/deps/chakrashim/core/lib/Backend/Lower.h index 74bc61a76c3..d6722a29085 100644 --- a/deps/chakrashim/core/lib/Backend/Lower.h +++ b/deps/chakrashim/core/lib/Backend/Lower.h @@ -21,7 +21,7 @@ enum RoundMode : BYTE { #if defined(_M_IX86) || defined(_M_AMD64) #include "LowerMDShared.h" -#elif defined(_M_ARM) || defined(_M_ARM64) +#elif defined(_M_ARM32_OR_ARM64) #include "LowerMD.h" #endif @@ -152,8 +152,11 @@ class Lowerer void GeneratePrototypeCacheInvalidateCheck(IR::PropertySymOpnd *propertySymOpnd, IR::Instr *instrStFld); void PinTypeRef(JITTypeHolder type, void* typeRef, IR::Instr* instr, Js::PropertyId propertyId); IR::RegOpnd * GenerateIsBuiltinRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool checkObjectAndDynamicObject = true, IR::LabelInstr *labelFastExternal = nullptr, bool isInHelper = false); - - + void GenerateIsDynamicObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool fContinueLabel = false); + void GenerateIsRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool checkObjectAndDynamicObject = true); + bool GenerateLdThisCheck(IR::Instr * instr); + bool GenerateLdThisStrict(IR::Instr * instr); + bool GenerateFastIsInst(IR::Instr * instr); void EnsureStackFunctionListStackSym(); void EnsureZeroLastStackFunctionNext(); @@ -201,6 +204,7 @@ class Lowerer IR::Instr * LowerLoadVar(IR::Instr *instr, IR::Opnd *opnd); void LoadArgumentCount(IR::Instr *const instr); void LoadStackArgPtr(IR::Instr *const instr); + IR::Instr * InsertLoadStackAddress(StackSym *sym, IR::Instr * instrInsert, IR::RegOpnd *optionalDstOpnd = nullptr); void LoadArgumentsFromFrame(IR::Instr *const instr); IR::Instr * LowerUnaryHelper(IR::Instr *instr, IR::JnHelperMethod helperMethod, IR::Opnd* opndBailoutArg = nullptr); IR::Instr * LowerUnaryHelperMem(IR::Instr *instr, IR::JnHelperMethod helperMethod, IR::Opnd* opndBailoutArg = nullptr); @@ -272,6 +276,7 @@ class Lowerer IR::BranchInstr* GenerateFastBrConst(IR::BranchInstr *branchInstr, IR::Opnd * constOpnd, bool isEqual); bool GenerateFastCondBranch(IR::BranchInstr * instrBranch, bool *pIsHelper); void GenerateBooleanNegate(IR::Instr * instr, IR::Opnd * srcBool, IR::Opnd * dst); + bool GenerateJSBooleanTest(IR::RegOpnd * regSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel = false); bool GenerateFastEqBoolInt(IR::Instr * instr, bool *pIsHelper, bool isInHelper); bool GenerateFastBrEqLikely(IR::BranchInstr * instrBranch, bool *pNeedHelper, bool isInHelper); bool GenerateFastBooleanAndObjectEqLikely(IR::Instr * instr, IR::Opnd *src1, IR::Opnd *src2, IR::LabelInstr * labelHelper, IR::LabelInstr * labelEqualLikely, bool *pNeedHelper, bool isInHelper); @@ -348,6 +353,7 @@ class Lowerer static IR::Instr * InsertAdd(const bool needFlags, IR::Opnd *const dst, IR::Opnd *src1, IR::Opnd *src2, IR::Instr *const insertBeforeInstr); static IR::Instr * InsertSub(const bool needFlags, IR::Opnd *const dst, IR::Opnd *src1, IR::Opnd *src2, IR::Instr *const insertBeforeInstr); static IR::Instr * InsertLea(IR::RegOpnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, bool postRegAlloc = false); + static IR::Instr * ChangeToLea(IR::Instr *const instr, bool postRegAlloc = false); static IR::Instr * InsertXor(IR::Opnd *const dst, IR::Opnd *const src1, IR::Opnd *const src2, IR::Instr *const insertBeforeInstr); static IR::Instr * InsertAnd(IR::Opnd *const dst, IR::Opnd *const src1, IR::Opnd *const src2, IR::Instr *const insertBeforeInstr); static IR::Instr * InsertOr(IR::Opnd *const dst, IR::Opnd *const src1, IR::Opnd *const src2, IR::Instr *const insertBeforeInstr); @@ -368,6 +374,7 @@ class Lowerer static IR::Opnd * GetMissingItemOpnd(IRType type, Func *func); static IR::Opnd * GetImplicitCallFlagsOpnd(Func * func); inline static IR::IntConstOpnd* MakeCallInfoConst(ushort flags, int32 argCount, Func* func) { + argCount = Js::CallInfo::GetArgCountWithoutExtraArgs((Js::CallFlags)flags, (uint16)argCount); #ifdef _M_X64 // This was defined differently for x64 Js::CallInfo callInfo = Js::CallInfo((Js::CallFlags)flags, (unsigned __int16)argCount); @@ -489,7 +496,6 @@ class Lowerer IR::LabelInstr *GenerateBailOut(IR::Instr * instr, IR::BranchInstr * branchInstr = nullptr, IR::LabelInstr * labelBailOut = nullptr, IR::LabelInstr * collectRuntimeStatsLabel = nullptr); void GenerateJumpToEpilogForBailOut(BailOutInfo * bailOutInfo, IR::Instr *instrAfter); void GenerateThrow(IR::Opnd* errorCode, IR::Instr * instr); - void LowerLdI4(IR::Instr * const instr); void LowerDivI4(IR::Instr * const instr); void LowerRemI4(IR::Instr * const instr); void LowerTrapIfZero(IR::Instr * const instr); @@ -498,7 +504,7 @@ class Lowerer void LowerRemR8(IR::Instr * const instr); void LowerRemR4(IR::Instr * const instr); - void LowerInlineeStart(IR::Instr * instr); + IR::Instr* LowerInlineeStart(IR::Instr * instr); void LowerInlineeEnd(IR::Instr * instr); static @@ -598,6 +604,14 @@ class Lowerer IR::Opnd* GetImplicitCallFlagsOpnd(); IR::Opnd* CreateClearImplicitCallFlagsOpnd(); + void GenerateFlagInlineCacheCheckForGetterSetter(IR::Instr * insertBeforeInstr, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); + void GenerateLdFldFromFlagInlineCache(IR::Instr * insertBeforeInstr, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); + static IR::BranchInstr * GenerateLocalInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext, bool checkTypeWithoutProperty = false); + static IR::BranchInstr * GenerateProtoInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); + static IR::BranchInstr * GenerateFlagInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); + static void GenerateLdFldFromLocalInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); + static void GenerateLdFldFromProtoInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); + IR::Instr * LoadScriptContext(IR::Instr *instr); IR::Instr * LoadFunctionBody(IR::Instr * instr); IR::Opnd * LoadFunctionBodyOpnd(IR::Instr *instr); @@ -638,6 +652,7 @@ class Lowerer IR::Opnd * LoadSlotArrayWithCachedProtoType(IR::Instr * instrInsert, IR::PropertySymOpnd *propertySymOpnd); IR::Instr * LowerLdAsmJsEnv(IR::Instr *instr); IR::Instr * LowerLdEnv(IR::Instr *instr); + IR::Instr * LowerLdSuper(IR::Instr *instr, IR::JnHelperMethod helperOpCode); IR::Instr * LowerLdNativeCodeData(IR::Instr *instr); IR::Instr * LowerFrameDisplayCheck(IR::Instr * instr); IR::Instr * LowerSlotArrayCheck(IR::Instr * instr); @@ -651,7 +666,11 @@ class Lowerer static void LegalizeVerifyRange(IR::Instr * instrStart, IR::Instr * instrLast); #endif + IR::Instr * LowerGetCachedFunc(IR::Instr *instr); + IR::Instr * LowerCommitScope(IR::Instr *instr); IR::Instr* LowerTry(IR::Instr* instr, bool tryCatch); + IR::Instr * LowerCatch(IR::Instr *instr); + IR::Instr * LowerLeave(IR::Instr *instr, IR::LabelInstr * targetInstr, bool fromFinalLower, bool isOrphanedLeave = false); void EnsureBailoutReturnValueSym(); void EnsureHasBailedOutSym(); void InsertReturnThunkForRegion(Region* region, IR::LabelInstr* restoreLabel); diff --git a/deps/chakrashim/core/lib/Backend/LowerMDShared.cpp b/deps/chakrashim/core/lib/Backend/LowerMDShared.cpp index 3412d3ef7c6..d470784029f 100644 --- a/deps/chakrashim/core/lib/Backend/LowerMDShared.cpp +++ b/deps/chakrashim/core/lib/Backend/LowerMDShared.cpp @@ -7,6 +7,7 @@ #include "Language/JavascriptFunctionArgIndex.h" const Js::OpCode LowererMD::MDUncondBranchOpcode = Js::OpCode::JMP; +const Js::OpCode LowererMD::MDMultiBranchOpcode = Js::OpCode::JMP; const Js::OpCode LowererMD::MDTestOpcode = Js::OpCode::TEST; const Js::OpCode LowererMD::MDOrOpcode = Js::OpCode::OR; const Js::OpCode LowererMD::MDXorOpcode = Js::OpCode::XOR; @@ -19,6 +20,7 @@ const Js::OpCode LowererMD::MDConvertFloat32ToFloat64Opcode = Js::OpCode::CVTSS2 const Js::OpCode LowererMD::MDConvertFloat64ToFloat32Opcode = Js::OpCode::CVTSD2SS; const Js::OpCode LowererMD::MDCallOpcode = Js::OpCode::CALL; const Js::OpCode LowererMD::MDImulOpcode = Js::OpCode::IMUL2; +const Js::OpCode LowererMD::MDLea = Js::OpCode::LEA; static const int TWO_31_FLOAT = 0x4f000000; static const int FLOAT_INT_MIN = 0xcf000000; @@ -295,25 +297,6 @@ LowererMD::LowerAsmJsStElemHelper(IR::Instr * callInstr) { return this->lowererMDArch.LowerAsmJsStElemHelper(callInstr); } -IR::Instr * -LowererMD::LowerCallPut(IR::Instr * callInstr) -{ - int32 argCount = this->lowererMDArch.LowerCallArgs(callInstr, Js::CallFlags_None, 2); - - // load native entry point from script function into eax - - IR::Opnd * functionWrapOpnd = callInstr->UnlinkSrc1(); - AssertMsg(functionWrapOpnd->IsRegOpnd() && functionWrapOpnd->AsRegOpnd()->m_sym->IsStackSym(), - "Expected call src to be stackSym"); - - this->LoadHelperArgument(callInstr, functionWrapOpnd); - this->m_lowerer->LoadScriptContext(callInstr); - - IR::HelperCallOpnd *helperCallOpnd = IR::HelperCallOpnd::New(IR::HelperOp_InvokePut, this->m_func); - callInstr->SetSrc1(helperCallOpnd); - - return this->lowererMDArch.LowerCall(callInstr, argCount); -} IR::Instr * LowererMD::LoadInt64HelperArgument(IR::Instr * instr, IR::Opnd* opnd) @@ -351,12 +334,6 @@ LowererMD::LowerExitInstr(IR::ExitInstr * exitInstr) return this->lowererMDArch.LowerExitInstr(exitInstr); } -IR::Instr * -LowererMD::LowerEntryInstrAsmJs(IR::EntryInstr * entryInstr) -{ - return this->lowererMDArch.LowerEntryInstrAsmJs(entryInstr); -} - IR::Instr * LowererMD::LowerExitInstrAsmJs(IR::ExitInstr * exitInstr) { @@ -433,30 +410,6 @@ LowererMD::LowerTry(IR::Instr *tryInstr, IR::JnHelperMethod helperMethod) return tryInstr->m_prev; } -IR::Instr * -LowererMD::LowerLeave(IR::Instr *leaveInstr, IR::LabelInstr *targetInstr, bool fromFinalLower, bool isOrphanedLeave) -{ - if (isOrphanedLeave) - { - Assert(this->m_func->IsLoopBodyInTry()); - leaveInstr->m_opcode = Js::OpCode::JMP; - return leaveInstr->m_prev; - } - - IR::Instr *instrPrev = leaveInstr->m_prev; - IR::LabelOpnd *labelOpnd = IR::LabelOpnd::New(targetInstr, this->m_func); - - lowererMDArch.LowerEHRegionReturn(leaveInstr, labelOpnd); - - if (fromFinalLower) - { - instrPrev = leaveInstr->m_prev; // Need to lower LdArgSize and LdSpillSize - } - leaveInstr->Remove(); - - return instrPrev; -} - IR::Instr * LowererMD::LowerEHRegionReturn(IR::Instr * insertBeforeInstr, IR::Opnd * targetOpnd) { @@ -529,7 +482,7 @@ LowererMD::Init(Lowerer *lowerer) { m_lowerer = lowerer; this->lowererMDArch.Init(this); -#ifdef ENABLE_SIMDJS +#if defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) Simd128InitOpcodeMap(); #endif } @@ -560,16 +513,10 @@ LowererMD::LoadInputParamCount(IR::Instr * instrInsert, int adjust, bool needFla // Mask off call flags from callinfo instr = IR::Instr::New(Js::OpCode::AND, dstOpnd, dstOpnd, - IR::IntConstOpnd::New((Js::CallFlags_ExtraArg << static_cast(Js::CallInfo::ksizeofCount)) | 0x00FFFFFF, TyMachReg, this->m_func, true), this->m_func); - instrInsert->InsertBefore(instr); - - // Shift and mask the "calling eval" bit and subtract it from the incoming count. - // ("Calling eval" means the last param is the frame display, which only the eval built-in should see.) - instr = IR::Instr::New(Js::OpCode::BTR, dstOpnd, dstOpnd, IR::IntConstOpnd::New(Math::Log2(Js::CallFlags_ExtraArg) + Js::CallInfo::ksizeofCount, TyInt8, this->m_func), this->m_func); + IR::IntConstOpnd::New(0x00FFFFFF, TyMachReg, this->m_func, true), this->m_func); instrInsert->InsertBefore(instr); - instr = IR::Instr::New(Js::OpCode::SBB, dstOpnd, dstOpnd, IR::IntConstOpnd::New(-adjust, TyMachReg, this->m_func), this->m_func); - instrInsert->InsertBefore(instr); + instr = m_lowerer->InsertSub(true, dstOpnd, dstOpnd, IR::IntConstOpnd::New(-adjust, TyMachReg, this->m_func), instrInsert); return instr; } @@ -775,48 +722,19 @@ LowererMD::ChangeToAssign(IR::Instr * instr, IRType type) { Assert(!instr->HasBailOutInfo() || instr->GetBailOutKind() == IR::BailOutExpectingString); +#if _M_IX86 + if (IRType_IsInt64(type)) + { + return LowererMDArch::ChangeToAssignInt64(instr); + } +#endif + instr->m_opcode = LowererMDArch::GetAssignOp(type); Legalize(instr); return instr; } -///---------------------------------------------------------------------------- -/// -/// LowererMD::ChangeToLea -/// -/// Change to an LEA. -/// -///---------------------------------------------------------------------------- - -IR::Instr * -LowererMD::ChangeToLea(IR::Instr * instr, bool postRegAlloc) -{ - Assert(instr); - Assert(instr->GetDst()); - Assert(instr->GetDst()->IsRegOpnd()); - Assert(instr->GetSrc1()); - Assert(instr->GetSrc1()->IsIndirOpnd() || instr->GetSrc1()->IsSymOpnd()); - Assert(!instr->GetSrc2()); - - instr->m_opcode = Js::OpCode::LEA; - return instr; -} - -///---------------------------------------------------------------------------- -/// -/// LowererMD::CreateAssign -/// -/// Create a MOV. -/// -///---------------------------------------------------------------------------- - -IR::Instr * -LowererMD::CreateAssign(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsertPt, bool generateWriteBarrier) -{ - return Lowerer::InsertMove(dst, src, instrInsertPt, generateWriteBarrier); -} - ///---------------------------------------------------------------------------- /// /// LowererMD::LowerRet @@ -830,8 +748,8 @@ LowererMD::CreateAssign(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsertPt, IR::Instr * LowererMD::LowerRet(IR::Instr * retInstr) { - IR::RegOpnd * retReg; - + IR::RegOpnd * retReg = nullptr; + bool needsRetReg = true; #ifdef ASMJS_PLAT if (m_func->GetJITFunctionBody()->IsAsmJsMode() && !m_func->IsLoopBody()) // for loop body ret is the bytecodeoffset { @@ -881,8 +799,10 @@ LowererMD::LowerRet(IR::Instr * retInstr) #endif break; } - case Js::AsmJsRetType::Signed: case Js::AsmJsRetType::Void: + needsRetReg = false; + break; + case Js::AsmJsRetType::Signed: regType = TyInt32; break; case Js::AsmJsRetType::Float32x4: @@ -894,6 +814,9 @@ LowererMD::LowerRet(IR::Instr * retInstr) case Js::AsmJsRetType::Float64x2: regType = TySimd128D2; break; + case Js::AsmJsRetType::Int64x2: + regType = TySimd128I2; + break; case Js::AsmJsRetType::Int16x8: regType = TySimd128I8; break; @@ -922,8 +845,11 @@ LowererMD::LowerRet(IR::Instr * retInstr) Assert(UNREACHED); } - retReg = IR::RegOpnd::New(regType, m_func); - retReg->SetReg(lowererMDArch.GetRegReturnAsmJs(regType)); + if (needsRetReg) + { + retReg = IR::RegOpnd::New(regType, m_func); + retReg->SetReg(lowererMDArch.GetRegReturnAsmJs(regType)); + } } else #endif @@ -931,38 +857,14 @@ LowererMD::LowerRet(IR::Instr * retInstr) retReg = IR::RegOpnd::New(TyMachReg, m_func); retReg->SetReg(lowererMDArch.GetRegReturn(TyMachReg)); } - - Lowerer::InsertMove(retReg, retInstr->UnlinkSrc1(), retInstr); - retInstr->SetSrc1(retReg); + if (needsRetReg) + { + Lowerer::InsertMove(retReg, retInstr->UnlinkSrc1(), retInstr); + retInstr->SetSrc1(retReg); + } return retInstr; } -///---------------------------------------------------------------------------- -/// -/// LowererMD::LowerUncondBranch -/// -///---------------------------------------------------------------------------- - -IR::Instr * -LowererMD::LowerUncondBranch(IR::Instr * instr) -{ - instr->m_opcode = Js::OpCode::JMP; - - return instr; -} - -///---------------------------------------------------------------------------- -/// -/// LowererMD::LowerMultiBranch -/// -///---------------------------------------------------------------------------- - -IR::Instr * -LowererMD::LowerMultiBranch(IR::Instr * instr) -{ - return LowerUncondBranch(instr); -} - ///---------------------------------------------------------------------------- /// /// LowererMD::LowerCondBranch @@ -1354,22 +1256,6 @@ LowererMD::GetFormalParamOffset() return 4; } -IR::Instr * -LowererMD::LowerCatch(IR::Instr * instr) -{ - // t1 = catch => t2(eax) = catch - // => t1 = t2(eax) - IR::Opnd *catchObj = instr->UnlinkDst(); - IR::RegOpnd *catchParamReg = IR::RegOpnd::New(TyMachPtr, this->m_func); - catchParamReg->SetReg(this->lowererMDArch.GetRegReturn(TyMachReg)); - - instr->SetDst(catchParamReg); - - instr->InsertAfter(IR::Instr::New(Js::OpCode::MOV, catchObj, catchParamReg, this->m_func)); - - return instr->m_prev; -} - ///---------------------------------------------------------------------------- /// /// LowererMD::ForceDstToReg @@ -1637,6 +1523,17 @@ LowererMD::Legalize(IR::Instr *const instr, bool fPostRegAlloc) break; } + case Js::OpCode::MOVSX: + case Js::OpCode::MOVSXW: + Assert(instr->GetDst()->GetSize() == 4 || instr->GetDst()->GetSize() == 8); + Assert(instr->m_opcode != Js::OpCode::MOVSX || instr->GetSrc1()->GetSize() == 1); + Assert(instr->m_opcode != Js::OpCode::MOVSXW || instr->GetSrc1()->GetSize() == 2); + LegalizeOpnds( + instr, + L_Reg, + L_Reg | L_Mem, + L_None); + break; case Js::OpCode::MOVUPS: case Js::OpCode::MOVAPS: @@ -1741,6 +1638,7 @@ LowererMD::Legalize(IR::Instr *const instr, bool fPostRegAlloc) case Js::OpCode::PADDB: case Js::OpCode::PADDSB: case Js::OpCode::PADDD: + case Js::OpCode::PADDQ: case Js::OpCode::PADDW: case Js::OpCode::PADDSW: case Js::OpCode::PADDUSB: @@ -1763,6 +1661,7 @@ LowererMD::Legalize(IR::Instr *const instr, bool fPostRegAlloc) case Js::OpCode::PSUBB: case Js::OpCode::PSUBSB: case Js::OpCode::PSUBD: + case Js::OpCode::PSUBQ: case Js::OpCode::PSUBW: case Js::OpCode::PSUBSW: case Js::OpCode::PSUBUSB: @@ -1853,10 +1752,12 @@ LowererMD::Legalize(IR::Instr *const instr, bool fPostRegAlloc) case Js::OpCode::PSLLDQ: case Js::OpCode::PSRLW: case Js::OpCode::PSRLD: + case Js::OpCode::PSRLQ: case Js::OpCode::PSRAW: case Js::OpCode::PSRAD: case Js::OpCode::PSLLW: case Js::OpCode::PSLLD: + case Js::OpCode::PSLLQ: Assert(AutoSystemInfo::Data.SSE2Available()); MakeDstEquSrc1(instr); @@ -2295,19 +2196,6 @@ LowererMD::LoadFunctionObjectOpnd(IR::Instr *instr, IR::Opnd *&functionObjOpnd) return instrPrev; } -IR::Instr * -LowererMD::LowerLdSuper(IR::Instr *instr, IR::JnHelperMethod helperOpCode) -{ - IR::Opnd * functionObjOpnd; - IR::Instr * instrPrev = LoadFunctionObjectOpnd(instr, functionObjOpnd); - - m_lowerer->LoadScriptContext(instr); - LoadHelperArgument(instr, functionObjOpnd); - ChangeToHelperCall(instr, helperOpCode); - - return instrPrev; -} - void LowererMD::GenerateFastDivByPow2(IR::Instr *instr) { @@ -2470,8 +2358,7 @@ LowererMD::GenerateFastDivByPow2(IR::Instr *instr) Assert(dst->IsRegOpnd()); StackSym * tempNumberSym = this->m_lowerer->GetTempNumberSym(dst, instr->dstIsTempNumberTransferred); - IR::Instr *load = this->LoadStackAddress(tempNumberSym); - instr->InsertBefore(load); + IR::Instr *load = this->m_lowerer->InsertLoadStackAddress(tempNumberSym, instr); tempOpnd = load->GetDst(); this->lowererMDArch.LoadHelperArgument(instr, tempOpnd); } @@ -2873,7 +2760,7 @@ void LowererMD::GenerateFastCmXx(IR::Instr *instr) if (!isIntDst) { opnd = this->m_lowerer->LoadLibraryValueOpnd(instr, LibraryValue::ValueFalse); - LowererMD::CreateAssign(tmp, opnd, done); + Lowerer::InsertMove(tmp, opnd, done); } Js::OpCode useCC; @@ -3928,493 +3815,120 @@ LowererMD::GenerateSmIntPairTest( } #endif -IR::BranchInstr * -LowererMD::GenerateLocalInlineCacheCheck( - IR::Instr * instrLdSt, - IR::RegOpnd * opndType, - IR::RegOpnd * inlineCache, - IR::LabelInstr * labelNext, - bool checkTypeWithoutProperty) +void +LowererMD::GenerateLoadTaggedType(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndTaggedType) { - // Generate: + // Generate // - // CMP s1, [&(inlineCache->u.local.type/typeWithoutProperty)] - // JNE $next + // MOV taggedType, type + // OR taggedType, InlineCacheAuxSlotTypeTag - IR::Instr * instr; - IR::Opnd* typeOpnd; - if (checkTypeWithoutProperty) + // MOV taggedType, type { - typeOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.local.typeWithoutProperty), TyMachReg, instrLdSt->m_func); + IR::Instr * instrMov = IR::Instr::New(Js::OpCode::MOV, opndTaggedType, opndType, instrLdSt->m_func); + instrLdSt->InsertBefore(instrMov); } - else + // OR taggedType, InlineCacheAuxSlotTypeTag { - typeOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.local.type), TyMachReg, instrLdSt->m_func); + IR::IntConstOpnd * opndAuxSlotTag = IR::IntConstOpnd::New(InlineCacheAuxSlotTypeTag, TyMachPtr, instrLdSt->m_func); + IR::Instr * instrAnd = IR::Instr::New(Js::OpCode::OR, opndTaggedType, opndTaggedType, opndAuxSlotTag, instrLdSt->m_func); + instrLdSt->InsertBefore(instrAnd); } - - // CMP type, [&(inlineCache->u.local.type/typeWithoutProperty)] - instr = IR::Instr::New(Js::OpCode::CMP, instrLdSt->m_func); - instr->SetSrc1(opndType); - instr->SetSrc2(typeOpnd); - instrLdSt->InsertBefore(instr); - - // JNE $next - IR::BranchInstr * branchInstr = IR::BranchInstr::New(Js::OpCode::JNE, labelNext, instrLdSt->m_func); - instrLdSt->InsertBefore(branchInstr); - - return branchInstr; } -IR::BranchInstr * -LowererMD::GenerateProtoInlineCacheCheck( - IR::Instr * instrLdSt, - IR::RegOpnd * opndType, - IR::RegOpnd * inlineCache, - IR::LabelInstr * labelNext) -{ - // Generate: - // - // CMP s1, [&(inlineCache->u.proto.type)] - // JNE $next - - IR::Instr * instr; - IR::Opnd* typeOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.proto.type), TyMachReg, instrLdSt->m_func); - - // CMP s1, [&(inlineCache->u.proto.type)] - instr = IR::Instr::New(Js::OpCode::CMP, instrLdSt->m_func); - instr->SetSrc1(opndType); - instr->SetSrc2(typeOpnd); - instrLdSt->InsertBefore(instr); - - // JNE $next - IR::BranchInstr * branchInstr = IR::BranchInstr::New(Js::OpCode::JNE, labelNext, instrLdSt->m_func); - instrLdSt->InsertBefore(branchInstr); - - return branchInstr; -} +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastLdMethodFromFlags +/// +/// Make use of the helper to cache the type and slot index used to do a LdFld +/// and do an inline load from the appropriate slot if the type hasn't changed +/// since the last time this LdFld was executed. +/// +///---------------------------------------------------------------------------- -IR::BranchInstr * -LowererMD::GenerateFlagInlineCacheCheck( - IR::Instr * instrLdSt, - IR::RegOpnd * opndType, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelNext) +bool +LowererMD::GenerateFastLdMethodFromFlags(IR::Instr * instrLdFld) { - // Generate: - // - // CMP s1, [&(inlineCache->u.accessor.type)] - // JNE $next + IR::LabelInstr * labelFallThru; + IR::LabelInstr * bailOutLabel; + IR::Opnd * opndSrc; + IR::Opnd * opndDst; + IR::RegOpnd * opndBase; + IR::RegOpnd * opndType; + IR::RegOpnd * opndInlineCache; - IR::Instr * instr; - IR::Opnd* typeOpnd; - typeOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.type), TyMachReg, instrLdSt->m_func); + opndSrc = instrLdFld->GetSrc1(); - // CMP s1, [&(inlineCache->u.flag.type)] - instr = IR::Instr::New(Js::OpCode::CMP, instrLdSt->m_func); - instr->SetSrc1(opndType); - instr->SetSrc2(typeOpnd); - instrLdSt->InsertBefore(instr); + AssertMsg(opndSrc->IsSymOpnd() && opndSrc->AsSymOpnd()->IsPropertySymOpnd() && opndSrc->AsSymOpnd()->m_sym->IsPropertySym(), + "Expected property sym operand as src of LdFldFlags"); - // JNE $next - IR::BranchInstr * branchInstr = IR::BranchInstr::New(Js::OpCode::JNE, labelNext, instrLdSt->m_func); - instrLdSt->InsertBefore(branchInstr); + IR::PropertySymOpnd * propertySymOpnd = opndSrc->AsPropertySymOpnd(); - return branchInstr; -} + Assert(!instrLdFld->DoStackArgsOpt(this->m_func)); -void -LowererMD::GenerateFlagInlineCacheCheckForGetterSetter( - IR::Instr * insertBeforeInstr, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelNext) -{ - uint accessorFlagMask; - if (PHASE_OFF(Js::InlineGettersPhase, insertBeforeInstr->m_func)) - { - accessorFlagMask = Js::InlineCache::GetSetterFlagMask(); - } - else if (PHASE_OFF(Js::InlineSettersPhase, insertBeforeInstr->m_func)) + if (propertySymOpnd->IsTypeCheckSeqCandidate()) { - accessorFlagMask = Js::InlineCache::GetGetterFlagMask(); + AssertMsg(propertySymOpnd->HasObjectTypeSym(), "Type optimized property sym operand without a type sym?"); + StackSym *typeSym = propertySymOpnd->GetObjectTypeSym(); + opndType = IR::RegOpnd::New(typeSym, TyMachReg, this->m_func); } else { - accessorFlagMask = Js::InlineCache::GetGetterSetterFlagMask(); + opndType = IR::RegOpnd::New(TyMachReg, this->m_func); } - // Generate: - // - // TEST [&(inlineCache->u.accessor.flags)], Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag - // JEQ $next - IR::Instr * instr; - IR::Opnd* flagsOpnd; - flagsOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.rawUInt16), TyInt8, insertBeforeInstr->m_func); - - // TEST [&(inlineCache->u.accessor.flags)], InlineCacheGetterFlag | InlineCacheSetterFlag - instr = IR::Instr::New(Js::OpCode::TEST,this->m_func); - instr->SetSrc1(flagsOpnd); - instr->SetSrc2(IR::IntConstOpnd::New(accessorFlagMask, TyInt8, this->m_func)); - insertBeforeInstr->InsertBefore(instr); - - // JEQ $next - instr = IR::BranchInstr::New(Js::OpCode::JEQ, labelNext, this->m_func); - insertBeforeInstr->InsertBefore(instr); -} + opndBase = propertySymOpnd->CreatePropertyOwnerOpnd(m_func); + opndDst = instrLdFld->GetDst(); + opndInlineCache = IR::RegOpnd::New(TyMachPtr, this->m_func); -void -LowererMD::GenerateLdFldFromLocalInlineCache( - IR::Instr * instrLdFld, - IR::RegOpnd * opndBase, - IR::Opnd * opndDst, - IR::RegOpnd * inlineCache, - IR::LabelInstr * labelFallThru, - bool isInlineSlot) -{ - // Generate: - // - // s1 = MOV base->slots -- load the slot array - // s2 = MOVZXw [&(inlineCache->u.local.slotIndex)] -- load the cached slot index - // dst = MOV [s1 + s2* Scale] -- load the value directly from the slot - // JMP $fallthru + labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + // Label to jump to (or fall through to) when bailing out + bailOutLabel = IR::LabelInstr::New(Js::OpCode::Label, instrLdFld->m_func, true /* isOpHelper */); - IR::Instr * instr; - IR::Opnd* slotIndexOpnd; - IR::IndirOpnd * opndIndir; - IR::RegOpnd * opndSlotArray = nullptr; + instrLdFld->InsertBefore(IR::Instr::New(Js::OpCode::MOV, opndInlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrLdFld, propertySymOpnd), this->m_func)); + IR::LabelInstr * labelFlagAux = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); - if (!isInlineSlot) - { - opndSlotArray = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndBase, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndSlotArray, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } + // Check the flag cache with the untagged type + this->m_lowerer->GenerateObjectTestAndTypeLoad(instrLdFld, opndBase, opndType, bailOutLabel); + // Blindly do the check for getter flag first and then do the type check + // We avoid repeated check for getter flag when the function object may be in either + // inline slots or auxiliary slots + this->m_lowerer->GenerateFlagInlineCacheCheckForGetterSetter(instrLdFld, opndInlineCache, bailOutLabel); + this->m_lowerer->GenerateFlagInlineCacheCheck(instrLdFld, opndType, opndInlineCache, labelFlagAux); + this->m_lowerer->GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); - // s2 = MOVZXw [&(inlineCache->u.local.slotIndex)] -- load the cached slot index - IR::RegOpnd * opndReg2 = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - slotIndexOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.local.slotIndex), TyUint16, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOVZXW, opndReg2, slotIndexOpnd, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); + // Check the flag cache with the tagged type + instrLdFld->InsertBefore(labelFlagAux); + IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); + GenerateLoadTaggedType(instrLdFld, opndType, opndTaggedType); + this->m_lowerer->GenerateFlagInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, bailOutLabel); + this->m_lowerer->GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); - if (isInlineSlot) - { - // dst = MOV [base + s2* Scale] -- load the value directly from the slot - opndIndir = IR::IndirOpnd::New(opndBase, opndReg2, LowererMDArch::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - else - { - // dst = MOV [s1 + s2* Scale] -- load the value directly from the slot - opndIndir = IR::IndirOpnd::New(opndSlotArray, opndReg2, LowererMDArch::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } + instrLdFld->InsertBefore(bailOutLabel); + instrLdFld->InsertAfter(labelFallThru); + // Generate the bailout helper call. 'instr' will be changed to the CALL into the bailout function, so it can't be used for + // ordering instructions anymore. + instrLdFld->UnlinkSrc1(); + this->m_lowerer->GenerateBailOut(instrLdFld); - // JMP $fallthru - instr = IR::BranchInstr::New(Js::OpCode::JMP, labelFallThru, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); + return true; } void -LowererMD::GenerateLdLocalFldFromFlagInlineCache( - IR::Instr * instrLdFld, - IR::RegOpnd * opndBase, - IR::Opnd * opndDst, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelFallThru, - bool isInlineSlot) +LowererMD::GenerateLoadPolymorphicInlineCacheSlot(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::RegOpnd * opndType, uint polymorphicInlineCacheSize) { - // Generate: + // Generate // - // s1 = MOV [&base->slots] -- load the slot array - // s2 = MOVZXW [&(inlineCache->u.accessor.slotIndex)] -- load the cached slot index - // dst = MOV [s1 + s2*4] - // JMP $fallthru + // MOV r1, type + // SHR r1, PolymorphicInlineCacheShift + // AND r1, (size - 1) + // SHL r1, log2(sizeof(Js::InlineCache)) + // LEA inlineCache, [inlineCache + r1] - IR::Instr * instr; - IR::Opnd* slotIndexOpnd; - IR::IndirOpnd * opndIndir; - IR::RegOpnd * opndSlotArray = nullptr; - - if (!isInlineSlot) - { - opndSlotArray = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndBase, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndSlotArray, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - - // s2 = MOVZXW [&(inlineCache->u.accessor.slotIndex)] -- load the cached slot index - IR::RegOpnd *opndSlotIndex = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - slotIndexOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.slotIndex), TyUint16, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOVZXW, opndSlotIndex, slotIndexOpnd, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - - if (isInlineSlot) - { - // dst = MOV [s1 + s2*4] - opndIndir = IR::IndirOpnd::New(opndBase, opndSlotIndex, LowererMDArch::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - else - { - // dst = MOV [s1 + s2*4] - opndIndir = IR::IndirOpnd::New(opndSlotArray, opndSlotIndex, LowererMDArch::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - - // JMP $fallthru - instr = IR::BranchInstr::New(Js::OpCode::JMP, labelFallThru, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); -} - -void -LowererMD::GenerateLdFldFromFlagInlineCache( - IR::Instr * insertBeforeInstr, - IR::RegOpnd * opndBase, - IR::Opnd * opndDst, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelFallThru, - bool isInlineSlot) -{ - // Generate: - // - // s1 = MOV [&(inlineCache->u.accessor.object)] -- load the cached prototype object - // s1 = MOV [&s1->slots] -- load the slot array - // s2 = MOVZXW [&(inlineCache->u.accessor.slotIndex)] -- load the cached slot index - // dst = MOV [s1 + s2*4] - // JMP $fallthru - - IR::Instr * instr; - - IR::Opnd* inlineCacheObjOpnd; - IR::IndirOpnd * opndIndir; - IR::RegOpnd * opndObjSlots = nullptr; - - inlineCacheObjOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.object), TyMachReg, this->m_func); - - // s1 = MOV [&(inlineCache->u.accessor.object)] -- load the cached prototype object - IR::RegOpnd *opndObject = IR::RegOpnd::New(TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndObject, inlineCacheObjOpnd, this->m_func); - insertBeforeInstr->InsertBefore(instr); - - if (!isInlineSlot) - { - // s1 = MOV [&s1->slots] -- load the slot array - opndObjSlots = IR::RegOpnd::New(TyMachReg, this->m_func); - opndIndir = IR::IndirOpnd::New(opndObject, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndObjSlots, opndIndir, this->m_func); - insertBeforeInstr->InsertBefore(instr); - } - - // s2 = MOVZXW [&(inlineCache->u.accessor.slotIndex)] -- load the cached slot index - IR::RegOpnd *opndSlotIndex = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::Opnd* slotIndexOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.slotIndex), TyUint16, this->m_func); - instr = IR::Instr::New(Js::OpCode::MOVZXW, opndSlotIndex, slotIndexOpnd, this->m_func); - insertBeforeInstr->InsertBefore(instr); - - if (isInlineSlot) - { - // dst = MOV [s1 + s2*4] - opndIndir = IR::IndirOpnd::New(opndObject, opndSlotIndex, this->lowererMDArch.GetDefaultIndirScale(), TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndDst, opndIndir, this->m_func); - insertBeforeInstr->InsertBefore(instr); - } - else - { - // dst = MOV [s1 + s2*4] - opndIndir = IR::IndirOpnd::New(opndObjSlots, opndSlotIndex, this->lowererMDArch.GetDefaultIndirScale(), TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndDst, opndIndir, this->m_func); - insertBeforeInstr->InsertBefore(instr); - } - - // JMP $fallthru - instr = IR::BranchInstr::New(Js::OpCode::JMP, labelFallThru, this->m_func); - insertBeforeInstr->InsertBefore(instr); -} - -void -LowererMD::GenerateLdFldFromProtoInlineCache( - IR::Instr * instrLdFld, - IR::RegOpnd * opndBase, - IR::Opnd * opndDst, - IR::RegOpnd * inlineCache, - IR::LabelInstr * labelFallThru, - bool isInlineSlot) -{ - // Generate: - // - // s1 = MOV [&(inlineCache->u.proto.prototypeObject)] -- load the cached prototype object - // s1 = MOV [&s1->slots] -- load the slot array - // s2 = MOVZXW [&(inlineCache->u.proto.slotIndex)] -- load the cached slot index - // dst = MOV [s1 + s2*4] - // JMP $fallthru - - IR::Instr * instr; - - IR::Opnd* inlineCacheProtoOpnd; - IR::IndirOpnd * opndIndir; - IR::RegOpnd * opndProtoSlots = nullptr; - - inlineCacheProtoOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.proto.prototypeObject), TyMachReg, instrLdFld->m_func); - - // s1 = MOV [&(inlineCache->u.proto.prototypeObject)] -- load the cached prototype object - IR::RegOpnd *opndProto = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndProto, inlineCacheProtoOpnd, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - - if (!isInlineSlot) - { - // s1 = MOV [&s1->slots] -- load the slot array - opndProtoSlots = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndProto, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndProtoSlots, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - - // s2 = MOVZXW [&(inlineCache->u.proto.slotIndex)] -- load the cached slot index - IR::RegOpnd *opndSlotIndex = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - IR::Opnd* slotIndexOpnd = IR::IndirOpnd::New(inlineCache, (int32)offsetof(Js::InlineCache, u.proto.slotIndex), TyUint16, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOVZXW, opndSlotIndex, slotIndexOpnd, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - - if (isInlineSlot) - { - // dst = MOV [s1 + s2*4] - opndIndir = IR::IndirOpnd::New(opndProto, opndSlotIndex, LowererMDArch::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - else - { - // dst = MOV [s1 + s2*4] - opndIndir = IR::IndirOpnd::New(opndProtoSlots, opndSlotIndex, LowererMDArch::GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::MOV, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - - // JMP $fallthru - instr = IR::BranchInstr::New(Js::OpCode::JMP, labelFallThru, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); -} - -void -LowererMD::GenerateLoadTaggedType(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndTaggedType) -{ - // Generate - // - // MOV taggedType, type - // OR taggedType, InlineCacheAuxSlotTypeTag - - // MOV taggedType, type - { - IR::Instr * instrMov = IR::Instr::New(Js::OpCode::MOV, opndTaggedType, opndType, instrLdSt->m_func); - instrLdSt->InsertBefore(instrMov); - } - // OR taggedType, InlineCacheAuxSlotTypeTag - { - IR::IntConstOpnd * opndAuxSlotTag = IR::IntConstOpnd::New(InlineCacheAuxSlotTypeTag, TyMachPtr, instrLdSt->m_func); - IR::Instr * instrAnd = IR::Instr::New(Js::OpCode::OR, opndTaggedType, opndTaggedType, opndAuxSlotTag, instrLdSt->m_func); - instrLdSt->InsertBefore(instrAnd); - } -} - -///---------------------------------------------------------------------------- -/// -/// LowererMD::GenerateFastLdMethodFromFlags -/// -/// Make use of the helper to cache the type and slot index used to do a LdFld -/// and do an inline load from the appropriate slot if the type hasn't changed -/// since the last time this LdFld was executed. -/// -///---------------------------------------------------------------------------- - -bool -LowererMD::GenerateFastLdMethodFromFlags(IR::Instr * instrLdFld) -{ - IR::LabelInstr * labelFallThru; - IR::LabelInstr * bailOutLabel; - IR::Opnd * opndSrc; - IR::Opnd * opndDst; - IR::RegOpnd * opndBase; - IR::RegOpnd * opndType; - IR::RegOpnd * opndInlineCache; - - opndSrc = instrLdFld->GetSrc1(); - - AssertMsg(opndSrc->IsSymOpnd() && opndSrc->AsSymOpnd()->IsPropertySymOpnd() && opndSrc->AsSymOpnd()->m_sym->IsPropertySym(), - "Expected property sym operand as src of LdFldFlags"); - - IR::PropertySymOpnd * propertySymOpnd = opndSrc->AsPropertySymOpnd(); - - Assert(!instrLdFld->DoStackArgsOpt(this->m_func)); - - if (propertySymOpnd->IsTypeCheckSeqCandidate()) - { - AssertMsg(propertySymOpnd->HasObjectTypeSym(), "Type optimized property sym operand without a type sym?"); - StackSym *typeSym = propertySymOpnd->GetObjectTypeSym(); - opndType = IR::RegOpnd::New(typeSym, TyMachReg, this->m_func); - } - else - { - opndType = IR::RegOpnd::New(TyMachReg, this->m_func); - } - - opndBase = propertySymOpnd->CreatePropertyOwnerOpnd(m_func); - opndDst = instrLdFld->GetDst(); - opndInlineCache = IR::RegOpnd::New(TyMachPtr, this->m_func); - - labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); - // Label to jump to (or fall through to) when bailing out - bailOutLabel = IR::LabelInstr::New(Js::OpCode::Label, instrLdFld->m_func, true /* isOpHelper */); - - instrLdFld->InsertBefore(IR::Instr::New(Js::OpCode::MOV, opndInlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrLdFld, propertySymOpnd), this->m_func)); - IR::LabelInstr * labelFlagAux = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); - - // Check the flag cache with the untagged type - this->m_lowerer->GenerateObjectTestAndTypeLoad(instrLdFld, opndBase, opndType, bailOutLabel); - // Blindly do the check for getter flag first and then do the type check - // We avoid repeated check for getter flag when the function object may be in either - // inline slots or auxiliary slots - GenerateFlagInlineCacheCheckForGetterSetter(instrLdFld, opndInlineCache, bailOutLabel); - GenerateFlagInlineCacheCheck(instrLdFld, opndType, opndInlineCache, labelFlagAux); - GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); - - // Check the flag cache with the tagged type - instrLdFld->InsertBefore(labelFlagAux); - IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); - GenerateLoadTaggedType(instrLdFld, opndType, opndTaggedType); - GenerateFlagInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, bailOutLabel); - GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); - - instrLdFld->InsertBefore(bailOutLabel); - instrLdFld->InsertAfter(labelFallThru); - // Generate the bailout helper call. 'instr' will be changed to the CALL into the bailout function, so it can't be used for - // ordering instructions anymore. - instrLdFld->UnlinkSrc1(); - this->m_lowerer->GenerateBailOut(instrLdFld); - - return true; -} - -void -LowererMD::GenerateLoadPolymorphicInlineCacheSlot(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::RegOpnd * opndType, uint polymorphicInlineCacheSize) -{ - // Generate - // - // MOV r1, type - // SHR r1, PolymorphicInlineCacheShift - // AND r1, (size - 1) - // SHL r1, log2(sizeof(Js::InlineCache)) - // LEA inlineCache, [inlineCache + r1] - - // MOV r1, type - IR::RegOpnd * opndOffset = IR::RegOpnd::New(TyMachPtr, instrLdSt->m_func); - IR::Instr * instr = IR::Instr::New(Js::OpCode::MOV, opndOffset, opndType, instrLdSt->m_func); - instrLdSt->InsertBefore(instr); + // MOV r1, type + IR::RegOpnd * opndOffset = IR::RegOpnd::New(TyMachPtr, instrLdSt->m_func); + IR::Instr * instr = IR::Instr::New(Js::OpCode::MOV, opndOffset, opndType, instrLdSt->m_func); + instrLdSt->InsertBefore(instr); IntConstType rightShiftAmount = PolymorphicInlineCacheShift; IntConstType leftShiftAmount = Math::Log2(sizeof(Js::InlineCache)); @@ -4750,8 +4264,8 @@ LowererMD::GenerateFastScopedLdFld(IR::Instr * instrLdScopedFld) IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); GenerateLoadTaggedType(instrLdScopedFld, opndType, opndTaggedType); instrLdScopedFld->InsertBefore(IR::Instr::New(Js::OpCode::MOV, inlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrLdScopedFld, propertySymOpnd), this->m_func)); - GenerateLocalInlineCacheCheck(instrLdScopedFld, opndTaggedType, inlineCache, labelHelper); - GenerateLdFldFromLocalInlineCache(instrLdScopedFld, r1, opndDst, inlineCache, labelFallThru, false); + Lowerer::GenerateLocalInlineCacheCheck(instrLdScopedFld, opndTaggedType, inlineCache, labelHelper); + Lowerer::GenerateLdFldFromLocalInlineCache(instrLdScopedFld, r1, opndDst, inlineCache, labelFallThru, false); // $helper: // dst = CALL PatchGetPropertyScoped(inlineCache, opndBase, propertyId, srcBase, scriptContext) @@ -4845,7 +4359,7 @@ LowererMD::GenerateFastScopedStFld(IR::Instr * instrStScopedFld) IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); GenerateLoadTaggedType(instrStScopedFld, opndType, opndTaggedType); instrStScopedFld->InsertBefore(IR::Instr::New(Js::OpCode::MOV, inlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrStScopedFld, propertySymOpnd), this->m_func)); - GenerateLocalInlineCacheCheck(instrStScopedFld, opndTaggedType, inlineCache, labelHelper); + Lowerer::GenerateLocalInlineCacheCheck(instrStScopedFld, opndTaggedType, inlineCache, labelHelper); GenerateStFldFromLocalInlineCache(instrStScopedFld, r1, newValue, inlineCache, labelFallThru, false); // $helper: @@ -5835,6 +5349,7 @@ LowererMD::GenerateCFGCheck(IR::Opnd * entryPointOpnd, IR::Instr * insertBeforeI //Generate CheckCFG CALL here IR::HelperCallOpnd *cfgCallOpnd = IR::HelperCallOpnd::New(IR::HelperGuardCheckCall, this->m_func); IR::Instr* cfgCallInstr = IR::Instr::New(Js::OpCode::CALL, this->m_func); + this->m_func->SetHasCallsOnSelfAndParents(); #if _M_IX86 //call[__guard_check_icall_fptr] @@ -7367,52 +6882,6 @@ bool LowererMD::GenerateObjectTest(IR::Opnd * opndSrc, IR::Instr * insertInstr, #endif -bool LowererMD::GenerateJSBooleanTest(IR::RegOpnd * regSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel) -{ - IR::Instr* instr; - if (regSrc->GetValueType().IsBoolean()) - { - if (fContinueLabel) - { - // JMP $labelTarget - instr = IR::BranchInstr::New(Js::OpCode::JMP, labelTarget, this->m_func); - insertInstr->InsertBefore(instr); -#if DBG - if (labelTarget->isOpHelper) - { - labelTarget->m_noHelperAssert = true; - } -#endif - } - return false; - } - - // CMP src1, vtable - instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); - IR::IndirOpnd *vtablePtrOpnd = IR::IndirOpnd::New(regSrc, 0, TyMachPtr, this->m_func); - instr->SetSrc1(vtablePtrOpnd); - IR::Opnd *jsBooleanVTable = m_lowerer->LoadVTableValueOpnd(insertInstr, VTableValue::VtableJavascriptBoolean); - instr->SetSrc2(jsBooleanVTable); - insertInstr->InsertBefore(instr); - Legalize(instr); - - if (fContinueLabel) - { - // JEQ $labelTarget - instr = IR::BranchInstr::New(Js::OpCode::JEQ, labelTarget, this->m_func); - insertInstr->InsertBefore(instr); - IR::LabelInstr *labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); - insertInstr->InsertBefore(labelHelper); - } - else - { - // JNE $labelTarget - instr = IR::BranchInstr::New(Js::OpCode::JNE, labelTarget, this->m_func); - insertInstr->InsertBefore(instr); - } - return true; -} - #if FLOATVAR // // If any of the top 14 bits are not set, then the var is not a float value and hence, jump to $labelHelper. @@ -7522,16 +6991,6 @@ void LowererMD::GenerateDebugBreak( IR::Instr * insertInstr ) } #endif -IR::Instr * -LowererMD::LoadStackAddress(StackSym *sym, IR::RegOpnd *optionalDstOpnd /* = nullptr */) -{ - IR::RegOpnd * regDst = optionalDstOpnd != nullptr ? optionalDstOpnd : IR::RegOpnd::New(TyMachReg, this->m_func); - IR::SymOpnd * symSrc = IR::SymOpnd::New(sym, TyMachPtr, this->m_func); - IR::Instr * lea = IR::Instr::New(Js::OpCode::LEA, regDst, symSrc, this->m_func); - - return lea; -} - template void LowererMD::MakeDstEquSrc1(IR::Instr *const instr) @@ -7648,6 +7107,58 @@ LowererMD::EmitLongToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) this->lowererMDArch.EmitLongToInt(dst, src, instrInsert); } + +void LowererMD::EmitSignExtend(IR::Instr * instr) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + Assert(dst && src1 && src2); + + // Src2 is used to determine what's the from type size + Assert(src2->GetSize() < dst->GetSize()); + IRType fromType = src2->GetType(); + Js::OpCode op = Js::OpCode::MOVSX; + switch (src2->GetSize()) + { + case 1: break; // default + case 2: op = Js::OpCode::MOVSXW; break; + case 4: +#if _M_X64 + op = Js::OpCode::MOVSXD; +#else + op = LowererMDArch::GetAssignOp(fromType); +#endif + break; + default: + Assert(UNREACHED); + } + +#if _M_IX86 + // Special handling of int64 on x86 + if (dst->IsInt64()) + { + Int64RegPair dstPair = m_func->FindOrCreateInt64Pair(dst); + Int64RegPair srcPair = m_func->FindOrCreateInt64Pair(src1); + + IR::RegOpnd * eaxReg = IR::RegOpnd::New(RegEAX, TyInt32, m_func); + IR::RegOpnd * edxReg = IR::RegOpnd::New(RegEDX, TyInt32, m_func); + + instr->InsertBefore(IR::Instr::New(op, eaxReg, srcPair.low->UseWithNewType(fromType, m_func), m_func)); + Legalize(instr->m_prev); + instr->InsertBefore(IR::Instr::New(Js::OpCode::CDQ, edxReg, m_func)); + Legalize(instr->m_prev); + m_lowerer->InsertMove(dstPair.low, eaxReg, instr); + m_lowerer->InsertMove(dstPair.high, edxReg, instr); + } + else +#endif + { + instr->InsertBefore(IR::Instr::New(op, dst, src1->UseWithNewType(fromType, m_func), m_func)); + Legalize(instr->m_prev); + } +} + void LowererMD::EmitFloat32ToFloat64(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { @@ -8029,8 +7540,7 @@ LowererMD::EmitLoadVarNoCheck(IR::RegOpnd * dst, IR::RegOpnd * src, IR::Instr *i // Use the original dst to get the temp number sym StackSym * tempNumberSym = this->m_lowerer->GetTempNumberSym(instrLoad->GetDst(), instrLoad->dstIsTempNumberTransferred); - IR::Instr *load = this->LoadStackAddress(tempNumberSym); - instrLoad->InsertBefore(load); + IR::Instr *load = this->m_lowerer->InsertLoadStackAddress(tempNumberSym, instrLoad); tempOpnd = load->GetDst(); this->LoadHelperArgument(instrLoad, tempOpnd); } @@ -8065,69 +7575,6 @@ LowererMD::EmitLoadVarNoCheck(IR::RegOpnd * dst, IR::RegOpnd * src, IR::Instr *i this->SaveDoubleToVar(dst, floatReg, instrLoad, instrLoad, isHelper); } -IR::Instr * -LowererMD::LowerGetCachedFunc(IR::Instr *instr) -{ - // src1 is an ActivationObjectEx, and we want to get the function object identified by the index (src2) - // dst = MOV (src1)->GetFuncCacheEntry(src2)->func - // - // => [src1 + (offsetof(src1, cache) + (src2 * sizeof(FuncCacheEntry)) + offsetof(FuncCacheEntry, func))] - - IR::IntConstOpnd *src2Opnd = instr->UnlinkSrc2()->AsIntConstOpnd(); - IR::RegOpnd *src1Opnd = instr->UnlinkSrc1()->AsRegOpnd(); - - instr->m_opcode = Js::OpCode::MOV; - - IntConstType offset = (src2Opnd->GetValue() * sizeof(Js::FuncCacheEntry)) + Js::ActivationObjectEx::GetOffsetOfCache() + offsetof(Js::FuncCacheEntry, func); - Assert(Math::FitsInDWord(offset)); - instr->SetSrc1(IR::IndirOpnd::New(src1Opnd, (int32)offset, TyVar, this->m_func)); - - src2Opnd->Free(this->m_func); - - return instr->m_prev; -} - -IR::Instr * -LowererMD::LowerCommitScope(IR::Instr *instrCommit) -{ - IR::Instr *instrPrev = instrCommit->m_prev; - IR::RegOpnd *baseOpnd = instrCommit->UnlinkSrc1()->AsRegOpnd(); - IR::Opnd *opnd; - IR::Instr * insertInstr = instrCommit->m_next; - - // Write undef to all the local var slots. - - opnd = IR::IndirOpnd::New(baseOpnd, Js::ActivationObjectEx::GetOffsetOfCommitFlag(), TyInt8, this->m_func); - instrCommit->SetDst(opnd); - instrCommit->SetSrc1(IR::IntConstOpnd::New(1, TyInt8, this->m_func)); - - LowererMD::ChangeToAssign(instrCommit); - - const Js::PropertyIdArray *propIds = instrCommit->m_func->GetJITFunctionBody()->GetFormalsPropIdArray(); - - uint firstVarSlot = (uint)Js::ActivationObjectEx::GetFirstVarSlot(propIds); - if (firstVarSlot < propIds->count) - { - IR::RegOpnd *undefOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - LowererMD::CreateAssign(undefOpnd, m_lowerer->LoadLibraryValueOpnd(insertInstr, LibraryValue::ValueUndefined), insertInstr); - - IR::RegOpnd *slotBaseOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - - // Load a pointer to the aux slots. We assume that all ActivationObject's have only aux slots. - - opnd = IR::IndirOpnd::New(baseOpnd, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, this->m_func); - this->CreateAssign(slotBaseOpnd, opnd, insertInstr); - - for (uint i = firstVarSlot; i < propIds->count; i++) - { - opnd = IR::IndirOpnd::New(slotBaseOpnd, i << this->GetDefaultIndirScale(), TyMachReg, this->m_func); - this->CreateAssign(opnd, undefOpnd, insertInstr); - } - } - - return instrPrev; -} - void LowererMD::ImmedSrcToReg(IR::Instr * instr, IR::Opnd * newOpnd, int srcNum) { @@ -8196,350 +7643,6 @@ bool LowererMD::GenerateFastShiftRight(IR::Instr * instrShift) return this->lowererMDArch.GenerateFastShiftRight(instrShift); } -void LowererMD::GenerateIsDynamicObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool fContinueLabel) -{ - // CMP [srcReg], Js::DynamicObject::`vtable' - { - IR::Instr *cmp = IR::Instr::New(Js::OpCode::CMP, this->m_func); - cmp->SetSrc1(IR::IndirOpnd::New(regOpnd, 0, TyMachPtr, m_func)); - cmp->SetSrc2(m_lowerer->LoadVTableValueOpnd(insertInstr, VTableValue::VtableDynamicObject)); - insertInstr->InsertBefore(cmp); - Legalize(cmp); - } - - if (fContinueLabel) - { - // JEQ $fallThough - IR::Instr * jne = IR::BranchInstr::New(Js::OpCode::JEQ, labelHelper, this->m_func); - insertInstr->InsertBefore(jne); - } - else - { - // JNE $helper - IR::Instr * jne = IR::BranchInstr::New(Js::OpCode::JNE, labelHelper, this->m_func); - insertInstr->InsertBefore(jne); - } -} - -void LowererMD::GenerateIsRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool checkObjectAndDynamicObject) -{ - // CMP [srcReg], Js::DynamicObject::`vtable' - // JEQ $fallThough - // MOV r1, [src1 + offset(type)] -- get the type id - // MOV r1, [r1 + offset(typeId)] - // ADD r1, ~TypeIds_LastJavascriptPrimitiveType -- if (typeId > TypeIds_LastJavascriptPrimitiveType && typeId <= TypeIds_LastTrueJavascriptObjectType) - // CMP r1, (TypeIds_LastTrueJavascriptObjectType - TypeIds_LastJavascriptPrimitiveType - 1) - // JA $helper - //fallThrough: - - IR::LabelInstr *labelFallthrough = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); - - if (checkObjectAndDynamicObject) - { - if (!regOpnd->IsNotTaggedValue()) - { - GenerateObjectTest(regOpnd, insertInstr, labelHelper); - } - - this->GenerateIsDynamicObject(regOpnd, insertInstr, labelFallthrough, true); - } - - IR::RegOpnd * typeRegOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::RegOpnd * typeIdRegOpnd = IR::RegOpnd::New(TyInt32, this->m_func); - - // MOV r1, [src1 + offset(type)] - { - IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(regOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); - IR::Instr * mov = IR::Instr::New(Js::OpCode::MOV, typeRegOpnd, indirOpnd, this->m_func); - insertInstr->InsertBefore(mov); - } - - // MOV r1, [r1 + offset(typeId)] - { - IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(typeRegOpnd, Js::Type::GetOffsetOfTypeId(), TyInt32, this->m_func); - IR::Instr * mov = IR::Instr::New(Js::OpCode::MOV, typeIdRegOpnd, indirOpnd, this->m_func); - insertInstr->InsertBefore(mov); - } - - // ADD r1, ~TypeIds_LastJavascriptPrimitiveType - { - IR::Instr * add = IR::Instr::New(Js::OpCode::ADD, typeIdRegOpnd, typeIdRegOpnd, IR::IntConstOpnd::New(~Js::TypeIds_LastJavascriptPrimitiveType, TyInt32, this->m_func, true), this->m_func); - insertInstr->InsertBefore(add); - } - - // CMP r1, (TypeIds_LastTrueJavascriptObjectType - TypeIds_LastJavascriptPrimitiveType - 1) - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, this->m_func); - cmp->SetSrc1(typeIdRegOpnd); - cmp->SetSrc2(IR::IntConstOpnd::New(Js::TypeIds_LastTrueJavascriptObjectType - Js::TypeIds_LastJavascriptPrimitiveType - 1, TyInt32, this->m_func)); - insertInstr->InsertBefore(cmp); - } - - // JA $helper - { - IR::Instr * jbe = IR::BranchInstr::New(Js::OpCode::JA, labelHelper, this->m_func); - insertInstr->InsertBefore(jbe); - } - - // $fallThrough - insertInstr->InsertBefore(labelFallthrough); -} - -bool -LowererMD::GenerateLdThisCheck(IR::Instr * instr) -{ - // - // If not a recyclable object, jump to $helper - // MOV dst, src1 -- return the object itself - // JMP $fallthrough - // $helper: - // (caller generates helper call) - // $fallthrough: - // - IR::RegOpnd * src1 = instr->GetSrc1()->AsRegOpnd(); - IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); - IR::LabelInstr * fallthrough = IR::LabelInstr::New(Js::OpCode::Label, m_func); - - this->GenerateIsRecyclableObject(src1, instr, helper); - - // MOV dst, src1 - if (instr->GetDst() && !instr->GetDst()->IsEqual(src1)) - { - IR::Instr * mov = IR::Instr::New(Js::OpCode::MOV, instr->GetDst(), src1, this->m_func); - instr->InsertBefore(mov); - } - - // JMP $fallthrough - { - IR::Instr * jmp = IR::BranchInstr::New(Js::OpCode::JMP, fallthrough, this->m_func); - instr->InsertBefore(jmp); - } - - // $helper: - // (caller generates helper call) - // $fallthrough: - instr->InsertBefore(helper); - instr->InsertAfter(fallthrough); - - return true; -} - -// -// TEST src, Js::AtomTag -// JNE $done -// MOV typeReg, objectSrc + offsetof(RecyclableObject::type) -// CMP [typeReg + offsetof(Type::typeid)], TypeIds_ActivationObject -// JEQ $helper -// $done: -// MOV dst, src -// JMP $fallthru -// helper: -// MOV dst, undefined -// $fallthru: -bool -LowererMD::GenerateLdThisStrict(IR::Instr* instr) -{ - IR::RegOpnd * src1 = instr->GetSrc1()->AsRegOpnd(); - IR::RegOpnd * typeReg = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::LabelInstr * done = IR::LabelInstr::New(Js::OpCode::Label, m_func); - IR::LabelInstr * fallthru = IR::LabelInstr::New(Js::OpCode::Label, m_func); - IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, /*helper*/true); - - bool assign = instr->GetDst() && !instr->GetDst()->IsEqual(src1); - // TEST src1, Js::AtomTag - // JNE $done - if(!src1->IsNotTaggedValue()) - { - GenerateObjectTest(src1, instr, assign ? done : fallthru); - } - - // MOV typeReg, objectSrc + offsetof(RecyclableObject::type) - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOV, typeReg, - IR::IndirOpnd::New(src1, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, m_func), - m_func)); - - // CMP [typeReg + offsetof(Type::typeid)], TypeIds_ActivationObject - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, m_func); - cmp->SetSrc1(IR::IndirOpnd::New(typeReg, Js::Type::GetOffsetOfTypeId(), TyInt32, m_func)); - cmp->SetSrc2(IR::IntConstOpnd::New(Js::TypeId::TypeIds_ActivationObject, TyInt32, m_func)); - instr->InsertBefore(cmp); - } - - // JEQ $helper - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JEQ, helper, m_func)); - - if (assign) - { - // $done: - // MOV dst, src - instr->InsertBefore(done); - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOV, instr->GetDst(), src1, m_func)); - } - - // JMP $fallthru - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JMP, fallthru, m_func)); - - instr->InsertBefore(helper); - if (instr->GetDst()) - { - // MOV dst, undefined - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOV, instr->GetDst(), - m_lowerer->LoadLibraryValueOpnd(instr, LibraryValue::ValueUndefined), m_func)); - } - // $fallthru: - instr->InsertAfter(fallthru); - - return true; -} - -// given object instanceof function, functionReg is a register with function, -// objectReg is a register with instance and inlineCache is an InstIsInlineCache. -// We want to generate: -// -// fallback on helper (will patch the inline cache) if function does not match the cache -// MOV dst, Js::false -// CMP functionReg, [&(inlineCache->function)] -// JNE helper -// -// fallback if object is a tagged int -// TEST objectReg, Js::AtomTag -// JNE done -// - -// fallback if object's type is not the cached type -// MOV typeReg, objectSrc + offsetof(RecyclableObject::type) -// CMP typeReg, [&(inlineCache->type] -// JNE checkPrimType - -// use the cached result and fallthrough -// MOV dst, [&(inlineCache->result)] -// JMP done - -// return false if object is a primitive -// $checkPrimType -// CMP [typeReg + offsetof(Type::typeid)], TypeIds_LastJavascriptPrimitiveType -// JLE done -// -// -// $helper -// $done -bool -LowererMD::GenerateFastIsInst(IR::Instr * instr) -{ - IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); - IR::LabelInstr * checkPrimType = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); - IR::LabelInstr * done = IR::LabelInstr::New(Js::OpCode::Label, m_func); - IR::RegOpnd * typeReg = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::Opnd * objectSrc; - IR::RegOpnd * objectReg; - IR::Opnd * functionSrc; - IR::RegOpnd * functionReg; - intptr_t inlineCache; - IR::Instr * instrArg; - - // We are going to use the extra ArgOut_A instructions to lower the helper call later, - // so we leave them alone here and clean them up then. - inlineCache = instr->m_func->GetJITFunctionBody()->GetIsInstInlineCache(instr->GetSrc1()->AsIntConstOpnd()->AsUint32()); - Assert(instr->GetSrc2()->AsRegOpnd()->m_sym->m_isSingleDef); - instrArg = instr->GetSrc2()->AsRegOpnd()->m_sym->m_instrDef; - - objectSrc = instrArg->GetSrc1(); - Assert(instrArg->GetSrc2()->AsRegOpnd()->m_sym->m_isSingleDef); - instrArg = instrArg->GetSrc2()->AsRegOpnd()->m_sym->m_instrDef; - - functionSrc = instrArg->GetSrc1(); - Assert(instrArg->GetSrc2() == nullptr); - - // MOV dst, Js::false - Lowerer::InsertMove(instr->GetDst(), m_lowerer->LoadLibraryValueOpnd(instr, LibraryValue::ValueFalse), instr); - - if (functionSrc->IsRegOpnd()) - { - functionReg = functionSrc->AsRegOpnd(); - } - else - { - functionReg = IR::RegOpnd::New(TyMachReg, this->m_func); - // MOV functionReg, functionSrc - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOV, functionReg, functionSrc, m_func)); - } - - // CMP functionReg, [&(inlineCache->function)] - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, m_func); - cmp->SetSrc1(functionReg); - cmp->SetSrc2(IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfFunction(), TyMachReg, m_func, - IR::AddrOpndKindDynamicIsInstInlineCacheFunctionRef)); - instr->InsertBefore(cmp); - Legalize(cmp); - } - - // JNE helper - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JNE, helper, m_func)); - - if (objectSrc->IsRegOpnd()) - { - objectReg = objectSrc->AsRegOpnd(); - } - else - { - objectReg = IR::RegOpnd::New(TyMachReg, this->m_func); - // MOV objectReg, objectSrc - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOV, objectReg, objectSrc, m_func)); - } - - // TEST objectReg, Js::AtomTag - // JNE done - GenerateObjectTest(objectReg, instr, done); - - // MOV typeReg, objectSrc + offsetof(RecyclableObject::type) - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOV, typeReg, - IR::IndirOpnd::New(objectReg, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, m_func), - m_func)); - - // CMP typeReg, [&(inlineCache->type] - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, m_func); - cmp->SetSrc1(typeReg); - cmp->SetSrc2(IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfType(), TyMachReg, m_func, - IR::AddrOpndKindDynamicIsInstInlineCacheTypeRef)); - instr->InsertBefore(cmp); - Legalize(cmp); - } - - // JNE checkPrimType - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JNE, checkPrimType, m_func)); - - // MOV dst, [&(inlineCache->result)] - Lowerer::InsertMove(instr->GetDst(), IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfResult(), TyMachReg, m_func, - IR::AddrOpndKindDynamicIsInstInlineCacheResultRef), instr); - - // JMP done - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JMP, done, m_func)); - - // LABEL checkPrimType - instr->InsertBefore(checkPrimType); - - // CMP [typeReg + offsetof(Type::typeid)], TypeIds_LastJavascriptPrimitiveType - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, m_func); - cmp->SetSrc1(IR::IndirOpnd::New(typeReg, Js::Type::GetOffsetOfTypeId(), TyInt32, m_func)); - cmp->SetSrc2(IR::IntConstOpnd::New(Js::TypeId::TypeIds_LastJavascriptPrimitiveType, TyInt32, m_func)); - instr->InsertBefore(cmp); - } - - // JLE done - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JLE, done, m_func)); - - // LABEL helper - instr->InsertBefore(helper); - - instr->InsertAfter(done); - - return true; -} - void LowererMD::GenerateIsJsObjectTest(IR::RegOpnd* instanceReg, IR::Instr* insertInstr, IR::LabelInstr* labelHelper) { // TEST instanceReg, (Js::AtomTag_IntPtr | Js::FloatTag_Value ) @@ -8600,7 +7703,7 @@ LowererMD::EmitReinterpretPrimitive(IR::Opnd* dst, IR::Opnd* src, IR::Instr* ins // shufps modifies the register, we shouldn't change the source here IR::RegOpnd* tmpDouble = IR::RegOpnd::New(TyFloat64, m_func); - this->CreateAssign(tmpDouble, src, insertBeforeInstr); + Lowerer::InsertMove(tmpDouble, src, insertBeforeInstr); LegalizeInsert(IR::Instr::New(Js::OpCode::MOVD, dstPair.low, tmpDouble, m_func)); LegalizeInsert(IR::Instr::New(Js::OpCode::SHUFPS, tmpDouble, tmpDouble, IR::IntConstOpnd::New(1, TyInt8, m_func, true), m_func)); LegalizeInsert(IR::Instr::New(Js::OpCode::MOVD, dstPair.high, tmpDouble, m_func)); @@ -8648,12 +7751,6 @@ void LowererMD::EmitReinterpretIntToFloat(IR::Opnd* dst, IR::Opnd* src, IR::Inst EmitReinterpretPrimitive(dst, src, insertBeforeInstr); } -IR::Instr * -LowererMD::LowerInt64Assign(IR::Instr * instr) -{ - return this->lowererMDArch.LowerInt64Assign(instr); -} - IR::Instr * LowererMD::LowerToFloat(IR::Instr *instr) { @@ -8986,7 +8083,7 @@ void LowererMD::GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMeth IR::Instr *floatCall = IR::Instr::New(Js::OpCode::CALL, floatCallDst, s1, this->m_func); instr->InsertBefore(floatCall); #endif - instr->m_func->SetHasCalls(); + instr->m_func->SetHasCallsOnSelfAndParents(); // Save the result. instr->m_opcode = Js::OpCode::MOVSD; instr->SetSrc1(floatCall->GetDst()); @@ -9438,7 +8535,7 @@ void LowererMD::GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMeth void LowererMD::GenerateFastInlineBuiltInMathAbs(IR::Instr* inlineInstr) { - IR::Opnd* src = inlineInstr->GetSrc1(); + IR::Opnd* src = inlineInstr->GetSrc1()->Copy(this->m_func); IR::Opnd* dst = inlineInstr->UnlinkDst(); Assert(src); IR::Instr* tmpInstr; diff --git a/deps/chakrashim/core/lib/Backend/LowerMDShared.h b/deps/chakrashim/core/lib/Backend/LowerMDShared.h index 31d9de0b3f7..fc6edfd0fc4 100644 --- a/deps/chakrashim/core/lib/Backend/LowerMDShared.h +++ b/deps/chakrashim/core/lib/Backend/LowerMDShared.h @@ -53,6 +53,7 @@ class LowererMD static void ChangeToIMul(IR::Instr *const instr, const bool hasOverflowCheck = false); static const uint16 GetFormalParamOffset(); static const Js::OpCode MDUncondBranchOpcode; + static const Js::OpCode MDMultiBranchOpcode; static const Js::OpCode MDExtend32Opcode; static const Js::OpCode MDTestOpcode; static const Js::OpCode MDOrOpcode; @@ -66,6 +67,7 @@ class LowererMD static const Js::OpCode MDConvertFloat64ToFloat32Opcode; static const Js::OpCode MDCallOpcode; static const Js::OpCode MDImulOpcode; + static const Js::OpCode MDLea; UINT FloatPrefThreshold; @@ -83,12 +85,10 @@ class LowererMD } #endif IR::Instr * ChangeToHelperCallMem(IR::Instr * instr, IR::JnHelperMethod helperMethod); - static IR::Instr * CreateAssign(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsertPt, bool generateWriteBarrier = true); static IR::Instr * ChangeToAssign(IR::Instr * instr); static IR::Instr * ChangeToAssignNoBarrierCheck(IR::Instr * instr); static IR::Instr * ChangeToAssign(IR::Instr * instr, IRType type); - static IR::Instr * ChangeToLea(IR::Instr *const instr, bool postRegAlloc = false); static void ImmedSrcToReg(IR::Instr * instr, IR::Opnd * newOpnd, int srcNum); IR::Instr * LoadInputParamCount(IR::Instr * instr, int adjust = 0, bool needFlags = false); @@ -99,11 +99,8 @@ class LowererMD IR::Instr * LoadHeapArguments(IR::Instr * instr); IR::Instr * LoadHeapArgsCached(IR::Instr * instr); IR::Instr * LowerRet(IR::Instr * instr); - IR::Instr * LowerUncondBranch(IR::Instr * instr); - IR::Instr * LowerMultiBranch(IR::Instr * instr); IR::Instr * LowerCondBranch(IR::Instr * instr); IR::Instr * LoadFunctionObjectOpnd(IR::Instr *instr, IR::Opnd *&functionObjOpnd); - IR::Instr * LowerLdSuper(IR::Instr *instr, IR::JnHelperMethod helperOpCode); IR::Instr * LowerNewScObject(IR::Instr *newObjInstr); IR::Instr * LowerWasmMemOp(IR::Instr *instr, IR::Opnd *addrOpnd); void ForceDstToReg(IR::Instr *instr); @@ -126,12 +123,8 @@ class LowererMD void GenerateSmIntTest(IR::Opnd *opndSrc, IR::Instr *instrInsert, IR::LabelInstr *labelHelper, IR::Instr **instrFirst = nullptr, bool fContinueLabel = false); void GenerateTaggedZeroTest( IR::Opnd * opndSrc, IR::Instr * instrInsert, IR::LabelInstr * labelHelper = nullptr); bool GenerateObjectTest(IR::Opnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr * labelInstr, bool fContinueLabel = false); - bool GenerateJSBooleanTest(IR::RegOpnd * regSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel = false); - void GenerateBooleanTest(IR::Opnd * regSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel = false); void GenerateInt32ToVarConversion( IR::Opnd * opndSrc, IR::Instr * insertInstr ); void GenerateFloatTest( IR::RegOpnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr* labelHelper, const bool checkForNullInLoopBody = false); - void GenerateIsDynamicObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool fContinueLabel = false); - void GenerateIsRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelhelper, bool checkObjectAndDynamicObject = true); #if FLOATVAR IR::RegOpnd* CheckFloatAndUntag(IR::RegOpnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr* labelHelper); #endif @@ -178,8 +171,6 @@ class LowererMD IR::RegOpnd* MaterializeConstFromBits(int intConst, IRType type, IR::Instr* instr); IR::Opnd* Subtract2To31(IR::Opnd* src1, IR::Opnd* intMinFP, IRType type, IR::Instr* instr); bool TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrPrev); - bool GenerateLdThisCheck(IR::Instr * instr); - bool GenerateLdThisStrict(IR::Instr * instr); BVSparse* GatherFltTmps(); void GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMethod helperMethod); void HelperCallForAsmMathBuiltin(IR::Instr* instr, IR::JnHelperMethod helperMethodFloat, IR::JnHelperMethod helperMethodDouble); @@ -203,7 +194,6 @@ class LowererMD static IR::Instr *LoadFloatZero(IR::Opnd * opndDst, IR::Instr * instrInsert); template static IR::Instr *LoadFloatValue(IR::Opnd * opndDst, T value, IR::Instr * instrInsert); - IR::Instr * LoadStackAddress(StackSym *sym, IR::RegOpnd *optionalDstOpnd = nullptr); void EmitInt64Instr(IR::Instr * instr); static void EmitInt4Instr(IR::Instr *instr); void EmitLoadVar(IR::Instr *instr, bool isFromUint32 = false, bool isHelper = false); @@ -217,6 +207,7 @@ class LowererMD void EmitFloatToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert, IR::Instr * instrBailOut = nullptr, IR::LabelInstr * labelBailOut = nullptr); void EmitInt64toFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); void EmitFloat32ToFloat64(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); + void EmitSignExtend(IR::Instr * instr); static IR::Instr * InsertConvertFloat64ToInt32(const RoundMode roundMode, IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr); void ConvertFloatToInt32(IR::Opnd* intOpnd, IR::Opnd* floatOpnd, IR::LabelInstr * labelHelper, IR::LabelInstr * labelDone, IR::Instr * instInsert); void EmitReinterpretPrimitive(IR::Opnd* dst, IR::Opnd* src, IR::Instr* insertBeforeInstr); @@ -233,12 +224,7 @@ class LowererMD static bool GenerateSimplifiedInt4Mul(IR::Instr *const mulInstr, const IR::BailOutKind bailOutKind = IR::BailOutInvalid, IR::LabelInstr *const bailOutLabel = nullptr); static bool GenerateSimplifiedInt4Rem(IR::Instr *const remInstr, IR::LabelInstr *const skipBailOutLabel = nullptr); - IR::Instr * LowerCatch(IR::Instr *instr); - - IR::Instr * LowerGetCachedFunc(IR::Instr *instr); - IR::Instr * LowerCommitScope(IR::Instr *instr); IR::Instr * LowerTry(IR::Instr *instr, IR::JnHelperMethod helperMethod); - IR::Instr * LowerLeave(IR::Instr *instr, IR::LabelInstr * targetInstr, bool fromFinalLower, bool isOrphanedLeave = false); IR::Instr * LowerEHRegionReturn(IR::Instr * insertBeforeInstr, IR::Opnd * targetOpnd); IR::Instr * LowerLeaveNull(IR::Instr *instr); IR::Instr * LowerCallHelper(IR::Instr *instrCall); @@ -249,7 +235,6 @@ class LowererMD Lowerer* GetLowerer() { return m_lowerer; } - bool GenerateFastIsInst(IR::Instr * instr); void GenerateIsJsObjectTest(IR::RegOpnd* instanceReg, IR::Instr* insertInstr, IR::LabelInstr* labelHelper); void LowerTypeof(IR::Instr * typeOfInstr); @@ -263,18 +248,16 @@ class LowererMD IR::Instr * LowerAsmJsStElemHelper(IR::Instr * callInstr); IR::Instr * LowerCall(IR::Instr * callInstr, Js::ArgSlot argCount); IR::Instr * LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper = false, IR::Instr * insertBeforeInstrForCFG = nullptr); - IR::Instr * LowerCallPut(IR::Instr * callInstr); IR::Instr * LoadInt64HelperArgument(IR::Instr * instr, IR::Opnd* opnd); IR::Instr * LoadHelperArgument(IR::Instr * instr, IR::Opnd * opndArg); + IR::MemRefOpnd * LoadSimdHelperArgument(IR::Instr * instr, uint8 index); IR::Instr * LoadDoubleHelperArgument(IR::Instr * instr, IR::Opnd * opndArg); IR::Instr * LoadFloatHelperArgument(IR::Instr * instr, IR::Opnd * opndArg); IR::Instr * LowerEntryInstr(IR::EntryInstr * entryInstr); IR::Instr * LowerExitInstr(IR::ExitInstr * exitInstr); - IR::Instr * LowerEntryInstrAsmJs(IR::EntryInstr * entryInstr); IR::Instr * LowerExitInstrAsmJs(IR::ExitInstr * exitInstr); IR::Instr * LoadNewScObjFirstArg(IR::Instr * instr, IR::Opnd * dst, ushort extraArgs = 0); IR::Instr * LowerToFloat(IR::Instr *instr); - IR::Instr * LowerInt64Assign(IR::Instr * instr); static IR::BranchInstr * LowerFloatCondBranch(IR::BranchInstr *instrBranch, bool ignoreNan = false); static Js::OpCode GetLoadOp(IRType type) { return LowererMDArch::GetAssignOp(type); } @@ -305,13 +288,6 @@ class LowererMD void GenerateWriteBarrierAssign(IR::MemRefOpnd * opndDst, IR::Opnd * opndSrc, IR::Instr * insertBeforeInstr); static IR::Instr * ChangeToWriteBarrierAssign(IR::Instr * assignInstr, const Func* func); - static IR::BranchInstr * GenerateLocalInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext, bool checkTypeWithoutProperty = false); - static IR::BranchInstr * GenerateProtoInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); - static IR::BranchInstr * GenerateFlagInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); - static IR::BranchInstr * GenerateFlagInlineCacheCheckForLocal(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); - static void GenerateLdFldFromLocalInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); - static void GenerateLdFldFromProtoInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); - static void GenerateLdLocalFldFromFlagInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); void GenerateStFldFromLocalInlineCache(IR::Instr * instrStFld, IR::RegOpnd * opndBase, IR::Opnd * opndSrc, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); IR::Instr * LowerDivI4AndBailOnReminder(IR::Instr * instr, IR::LabelInstr * bailOutLabel); @@ -324,24 +300,36 @@ class LowererMD static IR::Instr * InsertCmovCC(const Js::OpCode opCode, IR::Opnd * dst, IR::Opnd* src1, IR::Instr* insertBeforeInstr, bool postRegAlloc = false); #ifdef ENABLE_SIMDJS + IR::Instr* Simd128LowerConstructor_2(IR::Instr *instr); + IR::Instr* Simd128LowerConstructor_4(IR::Instr *instr); + IR::Instr* Simd128LowerConstructor_8(IR::Instr *instr); + IR::Instr* Simd128LowerConstructor_16(IR::Instr *instr); + IR::Instr* Simd128LowerRcp(IR::Instr *instr, bool removeInstr = true); + IR::Instr* Simd128LowerRcpSqrt(IR::Instr *instr); + IR::Instr* Simd128LowerRcpSqrt(IR::Instr *instr); + void GenerateCheckedSimdLoad(IR::Instr * instr); + void GenerateSimdStore(IR::Instr * instr); + IR::Instr* Simd128LowerSelect(IR::Instr *instr); +#endif + +#if defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) void Simd128InitOpcodeMap(); IR::Instr* Simd128Instruction(IR::Instr* instr); IR::Instr* Simd128LoadConst(IR::Instr* instr); + IR::Instr* LowerSimd128BitSelect(IR::Instr* instr); bool Simd128TryLowerMappedInstruction(IR::Instr *instr); IR::Instr* Simd128LowerUnMappedInstruction(IR::Instr *instr); - IR::Instr* Simd128LowerConstructor_2(IR::Instr *instr); - IR::Instr* Simd128LowerConstructor_4(IR::Instr *instr); - IR::Instr* Simd128LowerConstructor_8(IR::Instr *instr); - IR::Instr* Simd128LowerConstructor_16(IR::Instr *instr); IR::Instr* Simd128LowerLdLane(IR::Instr *instr); + IR::Instr* SIMD128LowerReplaceLane_2(IR::Instr *instr); + void EmitExtractInt64(IR::Opnd* dst, IR::Opnd* src, uint index, IR::Instr *instr); + void EmitInsertInt64(IR::Opnd* dst, uint index, IR::Instr *instr); + void EmitShiftByScalarI2(IR::Instr *instr, IR::JnHelperMethod helper); + IR::Instr* EmitSimdConversion(IR::Instr *instr, IR::JnHelperMethod helper); IR::Instr* SIMD128LowerReplaceLane_4(IR::Instr *instr); IR::Instr* SIMD128LowerReplaceLane_8(IR::Instr *instr); IR::Instr* SIMD128LowerReplaceLane_16(IR::Instr *instr); IR::Instr* Simd128LowerSplat(IR::Instr *instr); - IR::Instr* Simd128LowerRcp(IR::Instr *instr, bool removeInstr = true); IR::Instr* Simd128LowerSqrt(IR::Instr *instr); - IR::Instr* Simd128LowerRcpSqrt(IR::Instr *instr); - IR::Instr* Simd128LowerSelect(IR::Instr *instr); IR::Instr* Simd128LowerNeg(IR::Instr *instr); IR::Instr* Simd128LowerMulI4(IR::Instr *instr); IR::Instr* Simd128LowerShift(IR::Instr *instr); @@ -365,15 +353,16 @@ class LowererMD IR::Instr* Simd128LowerLessThanOrEqual(IR::Instr* instr); IR::Instr* Simd128LowerGreaterThanOrEqual(IR::Instr* instr); IR::Instr* Simd128LowerMinMax_F4(IR::Instr* instr); - IR::Instr* Simd128LowerMinMaxNum(IR::Instr* instr); IR::Instr* Simd128LowerAnyTrue(IR::Instr* instr); IR::Instr* Simd128LowerAllTrue(IR::Instr* instr); +#ifdef ENABLE_WASM_SIMD + IR::Opnd* Simd128CanonicalizeToBoolsBeforeReduction(IR::Instr* instr); +#endif BYTE Simd128GetTypedArrBytesPerElem(ValueType arrType); IR::Instr* Simd128CanonicalizeToBools(IR::Instr* instr, const Js::OpCode& cmpOpcode, IR::Opnd& dstOpnd); IR::Opnd* EnregisterIntConst(IR::Instr* instr, IR::Opnd *constOpnd, IRType type = TyInt32); + IR::Opnd* EnregisterBoolConst(IR::Instr* instr, IR::Opnd *opnd, IRType type); SList * Simd128GetExtendedArgs(IR::Instr *instr); - void GenerateCheckedSimdLoad(IR::Instr * instr); - void GenerateSimdStore(IR::Instr * instr); void CheckShuffleLanes_4(uint8 lanes[], uint8 lanesSrc[], uint *fromSrc1, uint *fromSrc2); void InsertShufps(uint8 lanes[], IR::Opnd *dst, IR::Opnd *src1, IR::Opnd *src2, IR::Instr *insertBeforeInstr); #endif @@ -382,18 +371,6 @@ class LowererMD void EmitReinterpretFloatToInt(IR::Opnd* dst, IR::Opnd* src, IR::Instr* insertBeforeInstr); void EmitReinterpretIntToFloat(IR::Opnd* dst, IR::Opnd* src, IR::Instr* insertBeforeInstr); IR::Instr * NegZeroBranching(IR::Opnd* opnd, IR::Instr* instr, IR::LabelInstr* isNeg0Label, IR::LabelInstr* isNotNeg0Label); - void GenerateFlagInlineCacheCheckForGetterSetter( - IR::Instr * insertBeforeInstr, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelNext); - - void GenerateLdFldFromFlagInlineCache( - IR::Instr * insertBeforeInstr, - IR::RegOpnd * opndBase, - IR::Opnd * opndDst, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelFallThru, - bool isInlineSlot); IR::LabelInstr* EmitLoadFloatCommon(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr, bool needLabelHelper); #ifdef RECYCLER_WRITE_BARRIER diff --git a/deps/chakrashim/core/lib/Backend/LowerMDSharedSimd128.cpp b/deps/chakrashim/core/lib/Backend/LowerMDSharedSimd128.cpp index 9603ebebf7d..dda3cc472f4 100644 --- a/deps/chakrashim/core/lib/Backend/LowerMDSharedSimd128.cpp +++ b/deps/chakrashim/core/lib/Backend/LowerMDSharedSimd128.cpp @@ -5,7 +5,450 @@ #include "Backend.h" +static IR::Instr* removeInstr(IR::Instr* instr); + #ifdef ENABLE_SIMDJS +// FromVar +void +LowererMD::GenerateCheckedSimdLoad(IR::Instr * instr) +{ + Assert(instr->m_opcode == Js::OpCode::FromVar); + Assert(instr->GetSrc1()->GetType() == TyVar); + Assert(IRType_IsSimd128(instr->GetDst()->GetType())); + + bool checkRequired = instr->HasBailOutInfo(); + IR::LabelInstr * labelHelper = nullptr, *labelDone = nullptr; + IR::Instr * insertInstr = instr, *newInstr; + IR::RegOpnd * src = instr->GetSrc1()->AsRegOpnd(), *dst = instr->GetDst()->AsRegOpnd(); + Assert(!checkRequired || instr->GetBailOutKind() == IR::BailOutSimd128F4Only || instr->GetBailOutKind() == IR::BailOutSimd128I4Only); + + if (checkRequired) + { + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + labelDone = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + instr->InsertBefore(labelHelper); + instr->InsertAfter(labelDone); + insertInstr = labelHelper; + + GenerateObjectTest(instr->GetSrc1(), insertInstr, labelHelper); + + newInstr = IR::Instr::New(Js::OpCode::CMP, instr->m_func); + newInstr->SetSrc1(IR::IndirOpnd::New(instr->GetSrc1()->AsRegOpnd(), 0, TyMachPtr, instr->m_func)); + newInstr->SetSrc2(m_lowerer->LoadVTableValueOpnd(instr, dst->GetType() == TySimd128F4 ? VTableValue::VtableSimd128F4 : VTableValue::VtableSimd128I4)); + insertInstr->InsertBefore(newInstr); + Legalize(newInstr); + insertInstr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JNE, labelHelper, this->m_func)); + instr->UnlinkSrc1(); + instr->UnlinkDst(); + this->m_lowerer->GenerateBailOut(instr); + + } + size_t valueOffset = dst->GetType() == TySimd128F4 ? Js::JavascriptSIMDFloat32x4::GetOffsetOfValue() : Js::JavascriptSIMDInt32x4::GetOffsetOfValue(); + Assert(valueOffset < INT_MAX); + newInstr = IR::Instr::New(Js::OpCode::MOVUPS, dst, IR::IndirOpnd::New(src, static_cast(valueOffset), dst->GetType(), this->m_func), this->m_func); + insertInstr->InsertBefore(newInstr); + + insertInstr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JMP, labelDone, this->m_func)); + // FromVar is converted to BailOut call. Don't remove. +} + +// ToVar +void LowererMD::GenerateSimdStore(IR::Instr * instr) +{ + IR::RegOpnd *dst, *src; + IRType type; + dst = instr->GetDst()->AsRegOpnd(); + src = instr->GetSrc1()->AsRegOpnd(); + type = src->GetType(); + + this->m_lowerer->LoadScriptContext(instr); + IR::Instr * instrCall = IR::Instr::New(Js::OpCode::CALL, instr->GetDst(), + IR::HelperCallOpnd::New(type == TySimd128F4 ? IR::HelperAllocUninitializedSimdF4 : IR::HelperAllocUninitializedSimdI4, this->m_func), this->m_func); + instr->InsertBefore(instrCall); + this->lowererMDArch.LowerCall(instrCall, 0); + + IR::Opnd * valDst; + if (type == TySimd128F4) + { + valDst = IR::IndirOpnd::New(dst, (int32)Js::JavascriptSIMDFloat32x4::GetOffsetOfValue(), TySimd128F4, this->m_func); + } + else + { + valDst = IR::IndirOpnd::New(dst, (int32)Js::JavascriptSIMDInt32x4::GetOffsetOfValue(), TySimd128I4, this->m_func); + } + + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVUPS, valDst, src, this->m_func)); + instr->Remove(); +} + +IR::Instr* LowererMD::Simd128LowerRcpSqrt(IR::Instr *instr) +{ + Js::OpCode opcode = Js::OpCode::SQRTPS; + Simd128LowerRcp(instr, false); + + opcode = Js::OpCode::SQRTPS; + +#if 0 + else + { + Assert(instr->m_opcode == Js::OpCode::Simd128_RcpSqrt_D2); + opcode = Js::OpCode::SQRTPD; + } +#endif // 0 + + instr->InsertBefore(IR::Instr::New(opcode, instr->GetDst(), instr->GetDst(), m_func)); + IR::Instr* prevInstr = instr->m_prev; + instr->Remove(); + return prevInstr; +} + +IR::Instr* LowererMD::Simd128LowerRcp(IR::Instr *instr, bool removeInstr) +{ + Js::OpCode opcode = Js::OpCode::DIVPS; + IR::Opnd *dst, *src1; + dst = instr->GetDst(); + src1 = instr->GetSrc1(); + + Assert(dst && dst->IsRegOpnd()); + Assert(src1 && src1->IsRegOpnd()); + Assert(instr->GetSrc2() == nullptr); + Assert(src1->IsSimd128F4() || src1->IsSimd128I4()); + opcode = Js::OpCode::DIVPS; + +#if 0 + { + Assert(instr->m_opcode == Js::OpCode::Simd128_Rcp_D2 || instr->m_opcode == Js::OpCode::Simd128_RcpSqrt_D2); + Assert(src1->IsSimd128D2()); + opcode = Js::OpCode::DIVPD; + x86_allones_mask = (void*)(&X86_ALL_ONES_D2); + } +#endif // 0 + + IR::RegOpnd* tmp = IR::RegOpnd::New(src1->GetType(), m_func); + IR::Instr* movInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllOnesF4Addr(), src1->GetType(), m_func), m_func); + instr->InsertBefore(movInstr); + Legalize(movInstr); + + instr->InsertBefore(IR::Instr::New(opcode, tmp, tmp, src1, m_func)); + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVAPS, dst, tmp, m_func)); + if (removeInstr) + { + IR::Instr* prevInstr = instr->m_prev; + instr->Remove(); + return prevInstr; + } + return instr; +} + +IR::Instr* LowererMD::Simd128LowerConstructor_8(IR::Instr *instr) +{ + IR::Opnd* dst = nullptr; + IR::Opnd* srcs[8]; + + //Simd128_IntsToI8/U8/B8 + Assert(instr->m_opcode == Js::OpCode::Simd128_IntsToI8 || instr->m_opcode == Js::OpCode::Simd128_IntsToU8 || instr->m_opcode == Js::OpCode::Simd128_IntsToB8); + SList *args = Simd128GetExtendedArgs(instr); + + Assert(args->Count() == 9); + dst = args->Pop(); + + uint i = 0; + while (!args->Empty() && i < 8) + { + srcs[i] = args->Pop(); + // src's might have been constant prop'd. Enregister them if so. + srcs[i] = (instr->m_opcode == Js::OpCode::Simd128_IntsToB8) ? + EnregisterBoolConst(instr, srcs[i], TyInt16) : + EnregisterIntConst(instr, srcs[i], TyInt16); + + Assert(srcs[i]->GetType() == TyInt16 && srcs[i]->IsRegOpnd()); + // PINSRW dst, srcs[i], i + instr->InsertBefore(IR::Instr::New(Js::OpCode::PINSRW, dst, srcs[i], IR::IntConstOpnd::New(i, TyInt8, m_func, true), m_func)); + i++; + } + if (instr->m_opcode == Js::OpCode::Simd128_IntsToB8) + { + instr = Simd128CanonicalizeToBools(instr, Js::OpCode::PCMPEQW, *dst); + } + IR::Instr* prevInstr; + prevInstr = instr->m_prev; + instr->Remove(); + return prevInstr; +} + +IR::Instr* LowererMD::Simd128LowerConstructor_16(IR::Instr *instr) +{ + IR::Opnd* dst = nullptr; + IR::Opnd* srcs[16]; + //Simd128_IntsToI16/U16/B16 + Assert(instr->m_opcode == Js::OpCode::Simd128_IntsToU16 || instr->m_opcode == Js::OpCode::Simd128_IntsToI16 || instr->m_opcode == Js::OpCode::Simd128_IntsToB16); + SList *args = Simd128GetExtendedArgs(instr); + intptr_t tempSIMD = m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(0); +#if DBG + // using only one SIMD temp + intptr_t endAddrSIMD = tempSIMD + sizeof(X86SIMDValue); +#endif + intptr_t address; + IR::Instr * newInstr; + + Assert(args->Count() == 17); + dst = args->Pop(); + + uint i = 0; + while (!args->Empty() && i < 16) + { + srcs[i] = args->Pop(); + // src's might have been constant prop'd. Enregister them if so. + srcs[i] = (instr->m_opcode == Js::OpCode::Simd128_IntsToB16) ? + EnregisterBoolConst(instr, srcs[i], TyInt8) : + EnregisterIntConst(instr, srcs[i], TyInt8); + Assert(srcs[i]->GetType() == TyInt8 && srcs[i]->IsRegOpnd()); + + address = tempSIMD + i; + // check for buffer overrun + Assert((intptr_t)address < endAddrSIMD); + // MOV [temp + i], src[i] (TyInt8) + newInstr = IR::Instr::New(Js::OpCode::MOV, IR::MemRefOpnd::New(tempSIMD + i, TyInt8, m_func), srcs[i], m_func); + instr->InsertBefore(newInstr); + Legalize(newInstr); + i++; + } + // MOVUPS dst, [temp] + newInstr = IR::Instr::New(Js::OpCode::MOVUPS, dst, IR::MemRefOpnd::New(tempSIMD, TySimd128U16, m_func), m_func); + instr->InsertBefore(newInstr); + Legalize(newInstr); + + if (instr->m_opcode == Js::OpCode::Simd128_IntsToB16) + { + instr = Simd128CanonicalizeToBools(instr, Js::OpCode::PCMPEQB, *dst); + } + + IR::Instr* prevInstr; + prevInstr = instr->m_prev; + instr->Remove(); + return prevInstr; +} + +IR::Instr* LowererMD::Simd128LowerConstructor_4(IR::Instr *instr) +{ + IR::Opnd* dst = nullptr; + IR::Opnd* src1 = nullptr; + IR::Opnd* src2 = nullptr; + IR::Opnd* src3 = nullptr; + IR::Opnd* src4 = nullptr; + IR::Instr* newInstr = nullptr; + + Assert(instr->m_opcode == Js::OpCode::Simd128_FloatsToF4 || + instr->m_opcode == Js::OpCode::Simd128_IntsToB4 || + instr->m_opcode == Js::OpCode::Simd128_IntsToI4 || + instr->m_opcode == Js::OpCode::Simd128_IntsToU4); + + // use MOVSS for both int32x4 and float32x4. MOVD zeroes upper bits. + Js::OpCode movOpcode = Js::OpCode::MOVSS; + Js::OpCode shiftOpcode = Js::OpCode::PSLLDQ; + SList *args = Simd128GetExtendedArgs(instr); + + // The number of src opnds should be exact. If opnds are missing, they should be filled in by globopt during type-spec. + Assert(args->Count() == 5); + + dst = args->Pop(); + src1 = args->Pop(); + src2 = args->Pop(); + src3 = args->Pop(); + src4 = args->Pop(); + + if (instr->m_opcode == Js::OpCode::Simd128_FloatsToF4) + { + // We don't have f32 type-spec, so we type-spec to f64 and convert to f32 before use. + if (src1->IsFloat64()) + { + IR::RegOpnd *regOpnd32 = IR::RegOpnd::New(TyFloat32, this->m_func); + // CVTSD2SS regOpnd32.f32, src.f64 -- Convert regOpnd from f64 to f32 + newInstr = IR::Instr::New(Js::OpCode::CVTSD2SS, regOpnd32, src1, this->m_func); + instr->InsertBefore(newInstr); + src1 = regOpnd32; + } + if (src2->IsFloat64()) + { + IR::RegOpnd *regOpnd32 = IR::RegOpnd::New(TyFloat32, this->m_func); + // CVTSD2SS regOpnd32.f32, src.f64 -- Convert regOpnd from f64 to f32 + newInstr = IR::Instr::New(Js::OpCode::CVTSD2SS, regOpnd32, src2, this->m_func); + instr->InsertBefore(newInstr); + src2 = regOpnd32; + } + if (src3->IsFloat64()) + { + IR::RegOpnd *regOpnd32 = IR::RegOpnd::New(TyFloat32, this->m_func); + // CVTSD2SS regOpnd32.f32, src.f64 -- Convert regOpnd from f64 to f32 + newInstr = IR::Instr::New(Js::OpCode::CVTSD2SS, regOpnd32, src3, this->m_func); + instr->InsertBefore(newInstr); + src3 = regOpnd32; + } + if (src4->IsFloat64()) + { + IR::RegOpnd *regOpnd32 = IR::RegOpnd::New(TyFloat32, this->m_func); + // CVTSD2SS regOpnd32.f32, src.f64 -- Convert regOpnd from f64 to f32 + newInstr = IR::Instr::New(Js::OpCode::CVTSD2SS, regOpnd32, src4, this->m_func); + instr->InsertBefore(newInstr); + src4 = regOpnd32; + } + + Assert(src1->IsRegOpnd() && src1->GetType() == TyFloat32); + Assert(src2->IsRegOpnd() && src2->GetType() == TyFloat32); + Assert(src3->IsRegOpnd() && src3->GetType() == TyFloat32); + Assert(src4->IsRegOpnd() && src4->GetType() == TyFloat32); + + // MOVSS dst, src4 + instr->InsertBefore(IR::Instr::New(movOpcode, dst, src4, m_func)); + // PSLLDQ dst, dst, 4 + instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(4, TyInt8, m_func, true), m_func)); + // MOVSS dst, src3 + instr->InsertBefore(IR::Instr::New(movOpcode, dst, src3, m_func)); + // PSLLDQ dst, 4 + instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(4, TyInt8, m_func, true), m_func)); + // MOVSS dst, src2 + instr->InsertBefore(IR::Instr::New(movOpcode, dst, src2, m_func)); + // PSLLDQ dst, 4 + instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(4, TyInt8, m_func, true), m_func)); + // MOVSS dst, src1 + instr->InsertBefore(IR::Instr::New(movOpcode, dst, src1, m_func)); + } + else + { + //Simd128_IntsToI4/U4 + IR::RegOpnd *temp = IR::RegOpnd::New(TyFloat32, m_func); + + // src's might have been constant prop'ed. Enregister them if so. + src4 = EnregisterIntConst(instr, src4); + src3 = EnregisterIntConst(instr, src3); + src2 = EnregisterIntConst(instr, src2); + src1 = EnregisterIntConst(instr, src1); + + Assert(src1->GetType() == TyInt32 && src1->IsRegOpnd()); + Assert(src2->GetType() == TyInt32 && src2->IsRegOpnd()); + Assert(src3->GetType() == TyInt32 && src3->IsRegOpnd()); + Assert(src4->GetType() == TyInt32 && src4->IsRegOpnd()); + + // MOVD t(TyFloat32), src4(TyInt32) + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVD, temp, src4, m_func)); + + // MOVSS dst, t + instr->InsertBefore(IR::Instr::New(movOpcode, dst, temp, m_func)); + // PSLLDQ dst, dst, 4 + instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(TySize[TyInt32], TyInt8, m_func, true), m_func)); + + // MOVD t(TyFloat32), sr34(TyInt32) + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVD, temp, src3, m_func)); + // MOVSS dst, t + instr->InsertBefore(IR::Instr::New(movOpcode, dst, temp, m_func)); + // PSLLDQ dst, dst, 4 + instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(TySize[TyInt32], TyInt8, m_func, true), m_func)); + + // MOVD t(TyFloat32), src2(TyInt32) + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVD, temp, src2, m_func)); + // MOVSS dst, t + instr->InsertBefore(IR::Instr::New(movOpcode, dst, temp, m_func)); + // PSLLDQ dst, dst, 4 + instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(TySize[TyInt32], TyInt8, m_func, true), m_func)); + + // MOVD t(TyFloat32), src1(TyInt32) + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVD, temp, src1, m_func)); + // MOVSS dst, t + instr->InsertBefore(IR::Instr::New(movOpcode, dst, temp, m_func)); + + if (instr->m_opcode == Js::OpCode::Simd128_IntsToB4) + { + instr = Simd128CanonicalizeToBools(instr, Js::OpCode::PCMPEQD, *dst); + } + } + + IR::Instr* prevInstr; + prevInstr = instr->m_prev; + instr->Remove(); + return prevInstr; +} +#if 0 +IR::Instr *LowererMD::Simd128LowerConstructor_2(IR::Instr *instr) +{ + IR::Opnd* dst = nullptr; + IR::Opnd* src1 = nullptr; + IR::Opnd* src2 = nullptr; + + Assert(instr->m_opcode == Js::OpCode::Simd128_DoublesToD2); + dst = instr->GetDst(); + + src1 = instr->GetSrc1(); + src2 = instr->GetSrc2(); + + Assert(src1->IsRegOpnd() && src1->GetType() == TyFloat64); + Assert(src2->IsRegOpnd() && src2->GetType() == TyFloat64); + // MOVSD dst, src2 + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVSD, dst, src2, m_func)); + // PSLLDQ dst, dst, 8 + instr->InsertBefore(IR::Instr::New(Js::OpCode::PSLLDQ, dst, dst, IR::IntConstOpnd::New(TySize[TyFloat64], TyInt8, m_func, true), m_func)); + // MOVSD dst, src1 + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVSD, dst, src1, m_func)); + Assert(dst->IsRegOpnd() && dst->IsSimd128()); + IR::Instr* prevInstr; + prevInstr = instr->m_prev; + instr->Remove(); + return prevInstr; +} +#endif + + +IR::Instr* LowererMD::Simd128LowerSelect(IR::Instr *instr) +{ + Assert(instr->m_opcode == Js::OpCode::Simd128_Select_F4 || instr->m_opcode == Js::OpCode::Simd128_Select_I4 /*|| instr->m_opcode == Js::OpCode::Simd128_Select_D2 */ || + instr->m_opcode == Js::OpCode::Simd128_Select_I8 || instr->m_opcode == Js::OpCode::Simd128_Select_I16 || instr->m_opcode == Js::OpCode::Simd128_Select_U4 || + instr->m_opcode == Js::OpCode::Simd128_Select_U8 || instr->m_opcode == Js::OpCode::Simd128_Select_U16); + + IR::Opnd* dst = nullptr; + IR::Opnd* src1 = nullptr; + IR::Opnd* src2 = nullptr; + IR::Opnd* src3 = nullptr; + SList *args = Simd128GetExtendedArgs(instr); + // The number of src opnds should be exact. Missing opnds means type-error, and we should generate an exception throw instead (or globopt does). + Assert(args->Count() == 4); + dst = args->Pop(); + src1 = args->Pop(); // mask + src2 = args->Pop(); // trueValue + src3 = args->Pop(); // falseValue + + Assert(dst->IsRegOpnd() && dst->IsSimd128()); + Assert(src1->IsRegOpnd() && src1->IsSimd128()); + Assert(src2->IsRegOpnd() && src2->IsSimd128()); + Assert(src3->IsRegOpnd() && src3->IsSimd128()); + + IR::RegOpnd *tmp = IR::RegOpnd::New(src1->GetType(), m_func); + IR::Instr *pInstr = nullptr; + // ANDPS tmp1, mask, tvalue + pInstr = IR::Instr::New(Js::OpCode::ANDPS, tmp, src1, src2, m_func); + instr->InsertBefore(pInstr); + Legalize(pInstr); + // ANDPS dst, mask, fvalue + pInstr = IR::Instr::New(Js::OpCode::ANDNPS, dst, src1, src3, m_func); + instr->InsertBefore(pInstr); + Legalize(pInstr); + // ORPS dst, dst, tmp1 + pInstr = IR::Instr::New(Js::OpCode::ORPS, dst, dst, tmp, m_func); + instr->InsertBefore(pInstr); + + pInstr = instr->m_prev; + instr->Remove(); + return pInstr; +} +#endif + +#if defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) + +static IR::Instr* removeInstr(IR::Instr* instr) +{ + IR::Instr* prevInstr; + prevInstr = instr->m_prev; + instr->Remove(); + return prevInstr; +} #define GET_SIMDOPCODE(irOpcode) m_simd128OpCodesMap[(uint32)(irOpcode - Js::OpCode::Simd128_Start)] @@ -53,24 +496,18 @@ bool LowererMD::Simd128TryLowerMappedInstruction(IR::Instr *instr) Assert(opcode == Js::OpCode::ANDPS); instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AbsMaskF4Addr(), instr->GetSrc1()->GetType(), m_func)); break; -#if 0 case Js::OpCode::Simd128_Abs_D2: Assert(opcode == Js::OpCode::ANDPD); instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AbsMaskD2Addr(), instr->GetSrc1()->GetType(), m_func)); break; -#endif // 0 - case Js::OpCode::Simd128_Neg_F4: Assert(opcode == Js::OpCode::XORPS); instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86NegMaskF4Addr(), instr->GetSrc1()->GetType(), m_func)); break; -#if 0 case Js::OpCode::Simd128_Neg_D2: Assert(opcode == Js::OpCode::XORPS); instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86NegMaskD2Addr(), instr->GetSrc1()->GetType(), m_func)); break; -#endif // 0 - case Js::OpCode::Simd128_Not_I4: case Js::OpCode::Simd128_Not_I16: case Js::OpCode::Simd128_Not_I8: @@ -84,9 +521,9 @@ bool LowererMD::Simd128TryLowerMappedInstruction(IR::Instr *instr) instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), instr->GetSrc1()->GetType(), m_func)); break; case Js::OpCode::Simd128_Gt_F4: - //case Js::OpCode::Simd128_Gt_D2: + case Js::OpCode::Simd128_Gt_D2: case Js::OpCode::Simd128_GtEq_F4: - //case Js::OpCode::Simd128_GtEq_D2: + case Js::OpCode::Simd128_GtEq_D2: case Js::OpCode::Simd128_Lt_I4: case Js::OpCode::Simd128_Lt_I8: case Js::OpCode::Simd128_Lt_I16: @@ -113,6 +550,20 @@ bool LowererMD::Simd128TryLowerMappedInstruction(IR::Instr *instr) return true; } +IR::MemRefOpnd * +LowererMD::LoadSimdHelperArgument(IR::Instr * instr, uint8 index) +{ + //the most reliable way to pass a simd value on x86/x64 win/lnx across calls + //is to pass a pointer to a SIMD value in the simd temporary area. + //otherwise we have to use __m128 and msvc intrinsics which may or may not be the same across + //MSVC and Clang + + IR::MemRefOpnd* srcMemRef = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(index), TySimd128F4, m_func); + IR::AddrOpnd* argAddress = IR::AddrOpnd::New(m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(index), IR::AddrOpndKindDynamicMisc, m_func, true /* doesn't come from a user */); + LoadHelperArgument(instr, argAddress); + return srcMemRef; +} + IR::Instr* LowererMD::Simd128LowerUnMappedInstruction(IR::Instr *instr) { switch (instr->m_opcode) @@ -120,6 +571,7 @@ IR::Instr* LowererMD::Simd128LowerUnMappedInstruction(IR::Instr *instr) case Js::OpCode::Simd128_LdC: return Simd128LoadConst(instr); +#ifdef ENABLE_SIMD case Js::OpCode::Simd128_FloatsToF4: case Js::OpCode::Simd128_IntsToI4: case Js::OpCode::Simd128_IntsToU4: @@ -134,11 +586,31 @@ IR::Instr* LowererMD::Simd128LowerUnMappedInstruction(IR::Instr *instr) case Js::OpCode::Simd128_IntsToB16: return Simd128LowerConstructor_16(instr); + case Js::OpCode::Simd128_Rcp_F4: + //case Js::OpCode::Simd128_Rcp_D2: + return Simd128LowerRcp(instr); + //SQRT + case Js::OpCode::Simd128_RcpSqrt_F4: + //case Js::OpCode::Simd128_RcpSqrt_D2: + return Simd128LowerRcpSqrt(instr); + + case Js::OpCode::Simd128_Select_F4: + case Js::OpCode::Simd128_Select_I4: + //case Js::OpCode::Simd128_Select_D2: + case Js::OpCode::Simd128_Select_I8: + case Js::OpCode::Simd128_Select_I16: + case Js::OpCode::Simd128_Select_U4: + case Js::OpCode::Simd128_Select_U8: + case Js::OpCode::Simd128_Select_U16: + return Simd128LowerSelect(instr); +#endif + #if 0 case Js::OpCode::Simd128_DoublesToD2: return Simd128LowerConstructor_2(instr); #endif // 0 + case Js::OpCode::Simd128_ExtractLane_I2: case Js::OpCode::Simd128_ExtractLane_I4: case Js::OpCode::Simd128_ExtractLane_I8: case Js::OpCode::Simd128_ExtractLane_I16: @@ -151,6 +623,9 @@ IR::Instr* LowererMD::Simd128LowerUnMappedInstruction(IR::Instr *instr) case Js::OpCode::Simd128_ExtractLane_F4: return Simd128LowerLdLane(instr); + case Js::OpCode::Simd128_ReplaceLane_I2: + case Js::OpCode::Simd128_ReplaceLane_D2: + return SIMD128LowerReplaceLane_2(instr); case Js::OpCode::Simd128_ReplaceLane_I4: case Js::OpCode::Simd128_ReplaceLane_F4: case Js::OpCode::Simd128_ReplaceLane_U4: @@ -169,38 +644,21 @@ IR::Instr* LowererMD::Simd128LowerUnMappedInstruction(IR::Instr *instr) case Js::OpCode::Simd128_Splat_F4: case Js::OpCode::Simd128_Splat_I4: - //case Js::OpCode::Simd128_Splat_D2: + case Js::OpCode::Simd128_Splat_I2: + case Js::OpCode::Simd128_Splat_D2: case Js::OpCode::Simd128_Splat_I8: case Js::OpCode::Simd128_Splat_I16: case Js::OpCode::Simd128_Splat_U4: - case Js::OpCode::Simd128_Splat_U8: - case Js::OpCode::Simd128_Splat_U16: - case Js::OpCode::Simd128_Splat_B4: - case Js::OpCode::Simd128_Splat_B8: - case Js::OpCode::Simd128_Splat_B16: - return Simd128LowerSplat(instr); - - case Js::OpCode::Simd128_Rcp_F4: - //case Js::OpCode::Simd128_Rcp_D2: - return Simd128LowerRcp(instr); - - case Js::OpCode::Simd128_Sqrt_F4: - //case Js::OpCode::Simd128_Sqrt_D2: - return Simd128LowerSqrt(instr); - - case Js::OpCode::Simd128_RcpSqrt_F4: - //case Js::OpCode::Simd128_RcpSqrt_D2: - return Simd128LowerRcpSqrt(instr); - - case Js::OpCode::Simd128_Select_F4: - case Js::OpCode::Simd128_Select_I4: - //case Js::OpCode::Simd128_Select_D2: - case Js::OpCode::Simd128_Select_I8: - case Js::OpCode::Simd128_Select_I16: - case Js::OpCode::Simd128_Select_U4: - case Js::OpCode::Simd128_Select_U8: - case Js::OpCode::Simd128_Select_U16: - return Simd128LowerSelect(instr); + case Js::OpCode::Simd128_Splat_U8: + case Js::OpCode::Simd128_Splat_U16: + case Js::OpCode::Simd128_Splat_B4: + case Js::OpCode::Simd128_Splat_B8: + case Js::OpCode::Simd128_Splat_B16: + return Simd128LowerSplat(instr); + + case Js::OpCode::Simd128_Sqrt_F4: + //case Js::OpCode::Simd128_Sqrt_D2: + return Simd128LowerSqrt(instr); case Js::OpCode::Simd128_Neg_I4: case Js::OpCode::Simd128_Neg_I8: @@ -229,6 +687,9 @@ IR::Instr* LowererMD::Simd128LowerUnMappedInstruction(IR::Instr *instr) case Js::OpCode::Simd128_ShLtByScalar_U8: case Js::OpCode::Simd128_ShRtByScalar_U16: case Js::OpCode::Simd128_ShLtByScalar_U16: + case Js::OpCode::Simd128_ShLtByScalar_I2: + case Js::OpCode::Simd128_ShRtByScalar_U2: + case Js::OpCode::Simd128_ShRtByScalar_I2: return Simd128LowerShift(instr); case Js::OpCode::Simd128_LdArr_I4: @@ -313,6 +774,14 @@ IR::Instr* LowererMD::Simd128LowerUnMappedInstruction(IR::Instr *instr) case Js::OpCode::Simd128_FromFloat32x4_U4: return Simd128LowerUint32x4FromFloat32x4(instr); + case Js::OpCode::Simd128_FromInt64x2_D2: + return EmitSimdConversion(instr, IR::HelperSimd128ConvertSD2); + case Js::OpCode::Simd128_FromUint64x2_D2: + return EmitSimdConversion(instr, IR::HelperSimd128ConvertUD2); + case Js::OpCode::Simd128_FromFloat64x2_I2: + return EmitSimdConversion(instr, IR::HelperSimd128TruncateI2); + case Js::OpCode::Simd128_FromFloat64x2_U2: + return EmitSimdConversion(instr, IR::HelperSimd128TruncateU2); case Js::OpCode::Simd128_Neq_I4: case Js::OpCode::Simd128_Neq_I8: case Js::OpCode::Simd128_Neq_I16: @@ -348,22 +817,43 @@ IR::Instr* LowererMD::Simd128LowerUnMappedInstruction(IR::Instr *instr) case Js::OpCode::Simd128_Max_F4: return Simd128LowerMinMax_F4(instr); + case Js::OpCode::Simd128_AnyTrue_B2: case Js::OpCode::Simd128_AnyTrue_B4: case Js::OpCode::Simd128_AnyTrue_B8: case Js::OpCode::Simd128_AnyTrue_B16: return Simd128LowerAnyTrue(instr); + case Js::OpCode::Simd128_AllTrue_B2: case Js::OpCode::Simd128_AllTrue_B4: case Js::OpCode::Simd128_AllTrue_B8: case Js::OpCode::Simd128_AllTrue_B16: return Simd128LowerAllTrue(instr); - + case Js::OpCode::Simd128_BitSelect_I4: + return LowerSimd128BitSelect(instr); default: AssertMsg(UNREACHED, "Unsupported Simd128 instruction"); } return nullptr; } + +IR::Instr* LowererMD::LowerSimd128BitSelect(IR::Instr* instr) +{ + SList *args = Simd128GetExtendedArgs(instr); + IR::Opnd *dst = args->Pop(); + IR::Opnd *src1 = args->Pop(); + IR::Opnd *src2 = args->Pop(); + IR::Opnd *mask = args->Pop(); + + IR::Instr* pInstr = IR::Instr::New(Js::OpCode::PXOR, dst, src1, src2, m_func); + instr->InsertBefore(pInstr); + Legalize(pInstr); + + instr->InsertBefore(IR::Instr::New(Js::OpCode::PAND, dst, dst, mask, m_func)); + instr->InsertBefore(IR::Instr::New(Js::OpCode::PXOR, dst, dst, src2, m_func)); + return removeInstr(instr); +} + IR::Instr* LowererMD::Simd128LoadConst(IR::Instr* instr) { Assert(instr->GetDst() && instr->m_opcode == Js::OpCode::Simd128_LdC); @@ -375,7 +865,7 @@ IR::Instr* LowererMD::Simd128LoadConst(IR::Instr* instr) AsmJsSIMDValue value = instr->GetSrc1()->AsSimd128ConstOpnd()->m_value; // MOVUPS dst, [const] - + void *pValue = NativeCodeDataNewNoFixup(this->m_func->GetNativeCodeDataAllocator(), SIMDType, value); IR::Opnd * simdRef; if (!m_func->IsOOPJIT()) @@ -405,7 +895,10 @@ IR::Instr* LowererMD::Simd128LoadConst(IR::Instr* instr) IR::Instr* LowererMD::Simd128CanonicalizeToBools(IR::Instr* instr, const Js::OpCode &cmpOpcode, IR::Opnd& dstOpnd) { Assert(instr->m_opcode == Js::OpCode::Simd128_IntsToB4 || instr->m_opcode == Js::OpCode::Simd128_IntsToB8 || instr->m_opcode == Js::OpCode::Simd128_IntsToB16 || - instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B4 || instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B8 || instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B16); + instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B4 || instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B8 || instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B16 || + instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B2 || instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B4 || instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B8 || instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B16 || + instr->m_opcode == Js::OpCode::Simd128_AllTrue_B2 || instr->m_opcode == Js::OpCode::Simd128_AllTrue_B4 || instr->m_opcode == Js::OpCode::Simd128_AllTrue_B8 || instr->m_opcode == Js::OpCode::Simd128_AllTrue_B16 + ); IR::Instr *pInstr; //dst = cmpOpcode dst, X86_ALL_ZEROS pInstr = IR::Instr::New(cmpOpcode, &dstOpnd, &dstOpnd, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllZerosAddr(), TySimd128I4, m_func), m_func); @@ -418,256 +911,153 @@ IR::Instr* LowererMD::Simd128CanonicalizeToBools(IR::Instr* instr, const Js::OpC return instr; } -IR::Instr* LowererMD::Simd128LowerConstructor_8(IR::Instr *instr) +IR::Instr* LowererMD::EmitSimdConversion(IR::Instr *instr, IR::JnHelperMethod helper) { - IR::Opnd* dst = nullptr; - IR::Opnd* srcs[8]; - - //Simd128_IntsToI8/U8/B8 - Assert(instr->m_opcode == Js::OpCode::Simd128_IntsToI8 || instr->m_opcode == Js::OpCode::Simd128_IntsToU8 || instr->m_opcode == Js::OpCode::Simd128_IntsToB8); - SList *args = Simd128GetExtendedArgs(instr); + IR::MemRefOpnd* srcMemRef = LoadSimdHelperArgument(instr, 0); + IR::MemRefOpnd* dstMemRef = LoadSimdHelperArgument(instr, 1); + m_lowerer->InsertMove(srcMemRef, instr->UnlinkSrc1(), instr); - Assert(args->Count() == 9); - dst = args->Pop(); + IR::Instr * helperCall = IR::Instr::New(Js::OpCode::CALL, this->m_func); + instr->InsertBefore(helperCall); + this->ChangeToHelperCall(helperCall, helper); - uint i = 0; - while (!args->Empty() && i < 8) - { - srcs[i] = args->Pop(); - // src's might have been constant prop'ed. Enregister them if so. - srcs[i] = EnregisterIntConst(instr, srcs[i], TyInt16); - Assert(srcs[i]->GetType() == TyInt16 && srcs[i]->IsRegOpnd()); - // PINSRW dst, srcs[i], i - instr->InsertBefore(IR::Instr::New(Js::OpCode::PINSRW, dst, srcs[i], IR::IntConstOpnd::New(i, TyInt8, m_func, true), m_func)); - i++; - } - if (instr->m_opcode == Js::OpCode::Simd128_IntsToB8) - { - instr = Simd128CanonicalizeToBools(instr, Js::OpCode::PCMPEQW, *dst); - } - IR::Instr* prevInstr; - prevInstr = instr->m_prev; - instr->Remove(); - return prevInstr; + m_lowerer->InsertMove(instr->UnlinkDst(), dstMemRef, instr); + return removeInstr(instr); } -IR::Instr* LowererMD::Simd128LowerConstructor_16(IR::Instr *instr) +void LowererMD::EmitShiftByScalarI2(IR::Instr *instr, IR::JnHelperMethod helper) { - IR::Opnd* dst = nullptr; - IR::Opnd* srcs[16]; - //Simd128_IntsToI16/U16/B16 - Assert(instr->m_opcode == Js::OpCode::Simd128_IntsToU16 || instr->m_opcode == Js::OpCode::Simd128_IntsToI16 || instr->m_opcode == Js::OpCode::Simd128_IntsToB16); - SList *args = Simd128GetExtendedArgs(instr); - intptr_t tempSIMD = m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(0); -#if DBG - // using only one SIMD temp - intptr_t endAddrSIMD = tempSIMD + sizeof(X86SIMDValue); -#endif - intptr_t address; - IR::Instr * newInstr; - - Assert(args->Count() == 17); - dst = args->Pop(); - - uint i = 0; - while (!args->Empty() && i < 16) - { - srcs[i] = args->Pop(); - // src's might have been constant prop'ed. Enregister them if so. - srcs[i] = EnregisterIntConst(instr, srcs[i], TyInt8); - Assert(srcs[i]->GetType() == TyInt8 && srcs[i]->IsRegOpnd()); - - address = tempSIMD + i; - // check for buffer overrun - Assert((intptr_t)address < endAddrSIMD); - // MOV [temp + i], src[i] (TyInt8) - newInstr = IR::Instr::New(Js::OpCode::MOV, IR::MemRefOpnd::New(tempSIMD + i, TyInt8, m_func), srcs[i], m_func); - instr->InsertBefore(newInstr); - Legalize(newInstr); - i++; - } - // MOVUPS dst, [temp] - newInstr = IR::Instr::New(Js::OpCode::MOVUPS, dst, IR::MemRefOpnd::New(tempSIMD, TySimd128U16, m_func), m_func); - instr->InsertBefore(newInstr); - Legalize(newInstr); - - if (instr->m_opcode == Js::OpCode::Simd128_IntsToB16) - { - instr = Simd128CanonicalizeToBools(instr, Js::OpCode::PCMPEQB, *dst); - } - - IR::Instr* prevInstr; - prevInstr = instr->m_prev; - instr->Remove(); - return prevInstr; + IR::Opnd* src2 = instr->GetSrc2(); + IR::Opnd* dst = instr->GetDst(); + LoadHelperArgument(instr, src2); + IR::MemRefOpnd* srcMemRef = LoadSimdHelperArgument(instr, 0); + m_lowerer->InsertMove(srcMemRef, instr->GetSrc1(), instr); + IR::MemRefOpnd* dstMemRef = LoadSimdHelperArgument(instr, 1); + IR::Instr * helperCall = IR::Instr::New(Js::OpCode::CALL, this->m_func); + instr->InsertBefore(helperCall); + this->ChangeToHelperCall(helperCall, helper); + m_lowerer->InsertMove(dst, dstMemRef, instr); } -IR::Instr* LowererMD::Simd128LowerConstructor_4(IR::Instr *instr) +IR::Instr * LowererMD::SIMD128LowerReplaceLane_2(IR::Instr *instr) { - IR::Opnd* dst = nullptr; - IR::Opnd* src1 = nullptr; - IR::Opnd* src2 = nullptr; - IR::Opnd* src3 = nullptr; - IR::Opnd* src4 = nullptr; - IR::Instr* newInstr = nullptr; - - Assert(instr->m_opcode == Js::OpCode::Simd128_FloatsToF4 || - instr->m_opcode == Js::OpCode::Simd128_IntsToB4 || - instr->m_opcode == Js::OpCode::Simd128_IntsToI4 || - instr->m_opcode == Js::OpCode::Simd128_IntsToU4); - - // use MOVSS for both int32x4 and float32x4. MOVD zeroes upper bits. - Js::OpCode movOpcode = Js::OpCode::MOVSS; - Js::OpCode shiftOpcode = Js::OpCode::PSLLDQ; SList *args = Simd128GetExtendedArgs(instr); + IR::Opnd *dst = args->Pop(); + IR::Opnd *src1 = args->Pop(); + IR::Opnd *src2 = args->Pop(); + IR::Opnd *src3 = args->Pop(); - // The number of src opnds should be exact. If opnds are missing, they should be filled in by globopt during type-spec. - Assert(args->Count() == 5); - - dst = args->Pop(); - src1 = args->Pop(); - src2 = args->Pop(); - src3 = args->Pop(); - src4 = args->Pop(); + int lane = src2->AsIntConstOpnd()->AsInt32(); + Assert(dst->IsSimd128() && src1->IsSimd128()); - if (instr->m_opcode == Js::OpCode::Simd128_FloatsToF4) + if (instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_D2) { - // We don't have f32 type-spec, so we type-spec to f64 and convert to f32 before use. - if (src1->IsFloat64()) + AssertMsg(AutoSystemInfo::Data.SSE2Available(), "SSE2 not supported"); + Assert(src3->IsFloat64()); + m_lowerer->InsertMove(dst, src1, instr); + if (lane) { - IR::RegOpnd *regOpnd32 = IR::RegOpnd::New(TyFloat32, this->m_func); - // CVTSD2SS regOpnd32.f32, src.f64 -- Convert regOpnd from f64 to f32 - newInstr = IR::Instr::New(Js::OpCode::CVTSD2SS, regOpnd32, src1, this->m_func); - instr->InsertBefore(newInstr); - src1 = regOpnd32; - } - if (src2->IsFloat64()) - { - IR::RegOpnd *regOpnd32 = IR::RegOpnd::New(TyFloat32, this->m_func); - // CVTSD2SS regOpnd32.f32, src.f64 -- Convert regOpnd from f64 to f32 - newInstr = IR::Instr::New(Js::OpCode::CVTSD2SS, regOpnd32, src2, this->m_func); - instr->InsertBefore(newInstr); - src2 = regOpnd32; - } - if (src3->IsFloat64()) - { - IR::RegOpnd *regOpnd32 = IR::RegOpnd::New(TyFloat32, this->m_func); - // CVTSD2SS regOpnd32.f32, src.f64 -- Convert regOpnd from f64 to f32 - newInstr = IR::Instr::New(Js::OpCode::CVTSD2SS, regOpnd32, src3, this->m_func); - instr->InsertBefore(newInstr); - src3 = regOpnd32; + instr->InsertBefore(IR::Instr::New(Js::OpCode::SHUFPD, dst, src3, IR::IntConstOpnd::New(0, TyInt8, m_func, true), m_func)); } - if (src4->IsFloat64()) + else { - IR::RegOpnd *regOpnd32 = IR::RegOpnd::New(TyFloat32, this->m_func); - // CVTSD2SS regOpnd32.f32, src.f64 -- Convert regOpnd from f64 to f32 - newInstr = IR::Instr::New(Js::OpCode::CVTSD2SS, regOpnd32, src4, this->m_func); - instr->InsertBefore(newInstr); - src4 = regOpnd32; - } + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVSD, dst, src3, m_func)); + } + return removeInstr(instr); + } - Assert(src1->IsRegOpnd() && src1->GetType() == TyFloat32); - Assert(src2->IsRegOpnd() && src2->GetType() == TyFloat32); - Assert(src3->IsRegOpnd() && src3->GetType() == TyFloat32); - Assert(src4->IsRegOpnd() && src4->GetType() == TyFloat32); + Assert(src3->IsInt64()); - // MOVSS dst, src4 - instr->InsertBefore(IR::Instr::New(movOpcode, dst, src4, m_func)); - // PSLLDQ dst, dst, 4 - instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(4, TyInt8, m_func, true), m_func)); - // MOVSS dst, src3 - instr->InsertBefore(IR::Instr::New(movOpcode, dst, src3, m_func)); - // PSLLDQ dst, 4 - instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(4, TyInt8, m_func, true), m_func)); - // MOVSS dst, src2 - instr->InsertBefore(IR::Instr::New(movOpcode, dst, src2, m_func)); - // PSLLDQ dst, 4 - instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(4, TyInt8, m_func, true), m_func)); - // MOVSS dst, src1 - instr->InsertBefore(IR::Instr::New(movOpcode, dst, src1, m_func)); + if (AutoSystemInfo::Data.SSE4_1Available()) + { + m_lowerer->InsertMove(dst, src1, instr); + instr->SetDst(dst); + EmitInsertInt64(src3, lane, instr); } else { - //Simd128_IntsToI4/U4 - IR::RegOpnd *temp = IR::RegOpnd::New(TyFloat32, m_func); - - // src's might have been constant prop'ed. Enregister them if so. - src4 = EnregisterIntConst(instr, src4); - src3 = EnregisterIntConst(instr, src3); - src2 = EnregisterIntConst(instr, src2); - src1 = EnregisterIntConst(instr, src1); - - Assert(src1->GetType() == TyInt32 && src1->IsRegOpnd()); - Assert(src2->GetType() == TyInt32 && src2->IsRegOpnd()); - Assert(src3->GetType() == TyInt32 && src3->IsRegOpnd()); - Assert(src4->GetType() == TyInt32 && src4->IsRegOpnd()); - - // MOVD t(TyFloat32), src4(TyInt32) - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVD, temp, src4, m_func)); - - // MOVSS dst, t - instr->InsertBefore(IR::Instr::New(movOpcode, dst, temp, m_func)); - // PSLLDQ dst, dst, 4 - instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(TySize[TyInt32], TyInt8, m_func, true), m_func)); - - // MOVD t(TyFloat32), sr34(TyInt32) - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVD, temp, src3, m_func)); - // MOVSS dst, t - instr->InsertBefore(IR::Instr::New(movOpcode, dst, temp, m_func)); - // PSLLDQ dst, dst, 4 - instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(TySize[TyInt32], TyInt8, m_func, true), m_func)); - - // MOVD t(TyFloat32), src2(TyInt32) - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVD, temp, src2, m_func)); - // MOVSS dst, t - instr->InsertBefore(IR::Instr::New(movOpcode, dst, temp, m_func)); - // PSLLDQ dst, dst, 4 - instr->InsertBefore(IR::Instr::New(shiftOpcode, dst, dst, IR::IntConstOpnd::New(TySize[TyInt32], TyInt8, m_func, true), m_func)); - - // MOVD t(TyFloat32), src1(TyInt32) - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVD, temp, src1, m_func)); - // MOVSS dst, t - instr->InsertBefore(IR::Instr::New(movOpcode, dst, temp, m_func)); - - if (instr->m_opcode == Js::OpCode::Simd128_IntsToB4) - { - instr = Simd128CanonicalizeToBools(instr, Js::OpCode::PCMPEQD, *dst); - } - } - - IR::Instr* prevInstr; - prevInstr = instr->m_prev; - instr->Remove(); - return prevInstr; + LoadHelperArgument(instr, src2); + LoadInt64HelperArgument(instr, src3); + IR::MemRefOpnd* srcMemRef = LoadSimdHelperArgument(instr, 0); + m_lowerer->InsertMove(srcMemRef, src1, instr); + IR::MemRefOpnd* dstMemRef = LoadSimdHelperArgument(instr, 1); + IR::Instr * helperCall = IR::Instr::New(Js::OpCode::CALL, this->m_func); + instr->InsertBefore(helperCall); + this->ChangeToHelperCall(helperCall, IR::HelperSimd128ReplaceLaneI2); + m_lowerer->InsertMove(dst, dstMemRef, instr); + } + return removeInstr(instr); } -#if 0 -IR::Instr *LowererMD::Simd128LowerConstructor_2(IR::Instr *instr) -{ - IR::Opnd* dst = nullptr; - IR::Opnd* src1 = nullptr; - IR::Opnd* src2 = nullptr; - - Assert(instr->m_opcode == Js::OpCode::Simd128_DoublesToD2); - dst = instr->GetDst(); - src1 = instr->GetSrc1(); - src2 = instr->GetSrc2(); +void LowererMD::EmitInsertInt64(IR::Opnd* src, uint index, IR::Instr *instr) +{ + IR::Opnd* dst = instr->GetDst(); + Assert(dst->IsSimd128() && src->IsInt64()); - Assert(src1->IsRegOpnd() && src1->GetType() == TyFloat64); - Assert(src2->IsRegOpnd() && src2->GetType() == TyFloat64); - // MOVSD dst, src2 - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVSD, dst, src2, m_func)); - // PSLLDQ dst, dst, 8 - instr->InsertBefore(IR::Instr::New(Js::OpCode::PSLLDQ, dst, dst, IR::IntConstOpnd::New(TySize[TyFloat64], TyInt8, m_func, true), m_func)); - // MOVSD dst, src1 - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVSD, dst, src1, m_func)); - Assert(dst->IsRegOpnd() && dst->IsSimd128()); - IR::Instr* prevInstr; - prevInstr = instr->m_prev; - instr->Remove(); - return prevInstr; + if (AutoSystemInfo::Data.SSE4_1Available()) + { +#ifdef _M_IX86 + index *= 2; + Int64RegPair srcPair = m_func->FindOrCreateInt64Pair(src); + instr->InsertBefore(IR::Instr::New(Js::OpCode::PINSRD, dst, srcPair.low, IR::IntConstOpnd::New(index, TyInt8, m_func, true), m_func)); + instr->InsertBefore(IR::Instr::New(Js::OpCode::PINSRD, dst, srcPair.high, IR::IntConstOpnd::New(index + 1, TyInt8, m_func, true), m_func)); +#else + instr->InsertBefore(IR::Instr::New(Js::OpCode::PINSRQ, dst, src, IR::IntConstOpnd::New(index, TyInt8, m_func, true), m_func)); +#endif +} + else + { + intptr_t tempSIMD = m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(0); +#ifdef _M_IX86 + Int64RegPair src1Pair = m_func->FindOrCreateInt64Pair(src); + IR::Opnd* lower = IR::MemRefOpnd::New(tempSIMD, TyMachPtr, m_func); + m_lowerer->InsertMove(lower, src1Pair.low, instr); + IR::Opnd* higher = IR::MemRefOpnd::New(tempSIMD + 4, TyMachPtr, m_func); + m_lowerer->InsertMove(higher, src1Pair.high, instr); +#else + IR::Opnd* mem = IR::MemRefOpnd::New(tempSIMD, TyMachPtr, m_func); + m_lowerer->InsertMove(mem, src, instr); +#endif + + IR::MemRefOpnd* tmp = IR::MemRefOpnd::New(tempSIMD, TyFloat64, m_func); + Js::OpCode opcode = (index) ? Js::OpCode::MOVHPD : Js::OpCode::MOVLPD; + IR::Instr* newInstr = IR::Instr::New(opcode, dst, tmp, m_func); + instr->InsertBefore(newInstr); + newInstr->HoistMemRefAddress(tmp, Js::OpCode::MOV); + Legalize(newInstr); + } } + +void LowererMD::EmitExtractInt64(IR::Opnd* dst, IR::Opnd* src, uint index, IR::Instr *instr) +{ + Assert(index == 0 || index == 1); + Assert(dst->IsInt64() && src->IsSimd128()); + if (AutoSystemInfo::Data.SSE4_1Available()) + { +#ifdef _M_IX86 + index *= 2; + Int64RegPair dstPair = m_func->FindOrCreateInt64Pair(dst); + instr->InsertBefore(IR::Instr::New(Js::OpCode::PEXTRD, dstPair.low, src, IR::IntConstOpnd::New(index, TyInt8, m_func, true), m_func)); + instr->InsertBefore(IR::Instr::New(Js::OpCode::PEXTRD, dstPair.high, src, IR::IntConstOpnd::New(index + 1, TyInt8, m_func, true), m_func)); +#else + instr->InsertBefore(IR::Instr::New(Js::OpCode::PEXTRQ, dst, src, IR::IntConstOpnd::New(index, TyInt8, m_func, true), m_func)); #endif + } + else + { + IR::Opnd* tmp = src; + if (index) + { + tmp = IR::RegOpnd::New(TySimd128F4, m_func); + instr->InsertBefore(IR::Instr::New(Js::OpCode::PSHUFD, tmp, src, IR::IntConstOpnd::New(2 | 3 << 2, TyInt8, m_func, true), m_func)); + } + //kludg-ish; we need a new instruction for LowerReinterpretPrimitive to transform + //and dummy one for a caller to remove + IR::Instr* tmpInstr = IR::Instr::New(Js::OpCode::Simd128_ExtractLane_I2, dst, tmp->UseWithNewType(TyFloat64, m_func), m_func); + instr->InsertBefore(tmpInstr); + m_lowerer->LowerReinterpretPrimitive(tmpInstr); + } +} IR::Instr* LowererMD::Simd128LowerLdLane(IR::Instr *instr) { @@ -679,14 +1069,18 @@ IR::Instr* LowererMD::Simd128LowerLdLane(IR::Instr *instr) src1 = instr->GetSrc1(); src2 = instr->GetSrc2(); - Assert(dst && dst->IsRegOpnd() && (dst->GetType() == TyFloat32 || dst->GetType() == TyInt32 || dst->GetType() == TyUint32 || dst->GetType() == TyFloat64)); + Assert(dst && dst->IsRegOpnd() && (dst->GetType() == TyFloat32 || dst->GetType() == TyInt32 || dst->GetType() == TyUint32 || dst->GetType() == TyFloat64 || dst->IsInt64())); Assert(src1 && src1->IsRegOpnd() && src1->IsSimd128()); Assert(src2 && src2->IsIntConstOpnd()); + laneIndex = (uint)src2->AsIntConstOpnd()->AsUint32(); laneWidth = 4; switch (instr->m_opcode) { + case Js::OpCode::Simd128_ExtractLane_I2: + laneWidth = 8; + break; case Js::OpCode::Simd128_ExtractLane_F4: movOpcode = Js::OpCode::MOVSS; Assert(laneIndex < 4); @@ -721,6 +1115,11 @@ IR::Instr* LowererMD::Simd128LowerLdLane(IR::Instr *instr) Assert(UNREACHED); } + if (laneWidth == 8) //Simd128_ExtractLane_I2 + { + EmitExtractInt64(dst, instr->GetSrc1(), laneIndex, instr); + } + else { IR::Opnd* tmp = src1; if (laneIndex != 0) @@ -737,7 +1136,7 @@ IR::Instr* LowererMD::Simd128LowerLdLane(IR::Instr *instr) // dst has the 4-byte lane if (instr->m_opcode == Js::OpCode::Simd128_ExtractLane_I8 || instr->m_opcode == Js::OpCode::Simd128_ExtractLane_U8 || instr->m_opcode == Js::OpCode::Simd128_ExtractLane_B8 || - instr->m_opcode == Js::OpCode::Simd128_ExtractLane_U16|| instr->m_opcode == Js::OpCode::Simd128_ExtractLane_I16|| instr->m_opcode == Js::OpCode::Simd128_ExtractLane_B16) + instr->m_opcode == Js::OpCode::Simd128_ExtractLane_U16 || instr->m_opcode == Js::OpCode::Simd128_ExtractLane_I16 || instr->m_opcode == Js::OpCode::Simd128_ExtractLane_B16) { // extract the 1/2 bytes sublane IR::Instr *newInstr = nullptr; @@ -777,13 +1176,13 @@ IR::Instr* LowererMD::Simd128LowerLdLane(IR::Instr *instr) if (instr->m_opcode == Js::OpCode::Simd128_ExtractLane_B4 || instr->m_opcode == Js::OpCode::Simd128_ExtractLane_B8 || instr->m_opcode == Js::OpCode::Simd128_ExtractLane_B16) { - IR::Instr* pInstr = nullptr; + IR::Instr* pInstr = nullptr; IR::RegOpnd* tmp = IR::RegOpnd::New(TyInt8, m_func); - // cmp dst, -1 + // cmp dst, 0 pInstr = IR::Instr::New(Js::OpCode::CMP, m_func); pInstr->SetSrc1(dst->UseWithNewType(laneType, m_func)); - pInstr->SetSrc2(IR::IntConstOpnd::New(-1, laneType, m_func, true)); + pInstr->SetSrc2(IR::IntConstOpnd::New(0, laneType, m_func, true)); instr->InsertBefore(pInstr); Legalize(pInstr); @@ -792,8 +1191,8 @@ IR::Instr* LowererMD::Simd128LowerLdLane(IR::Instr *instr) instr->InsertBefore(pInstr); Legalize(pInstr); - // sete tmp(TyInt8) - pInstr = IR::Instr::New(Js::OpCode::SETE, tmp, tmp, m_func); + // setne tmp(TyInt8) + pInstr = IR::Instr::New(Js::OpCode::SETNE, tmp, tmp, m_func); instr->InsertBefore(pInstr); Legalize(pInstr); @@ -818,7 +1217,7 @@ IR::Instr* LowererMD::Simd128LowerSplat(IR::Instr *instr) Assert(src1 && src1->IsRegOpnd() && (src1->GetType() == TyFloat32 || src1->GetType() == TyInt32 || src1->GetType() == TyFloat64 || src1->GetType() == TyInt16 || src1->GetType() == TyInt8 || src1->GetType() == TyUint16 || - src1->GetType() == TyUint8 || src1->GetType() == TyUint32)); + src1->GetType() == TyUint8 || src1->GetType() == TyUint32 || src1->IsInt64())); Assert(!instr->GetSrc2()); @@ -838,12 +1237,17 @@ IR::Instr* LowererMD::Simd128LowerSplat(IR::Instr *instr) shufOpCode = Js::OpCode::PSHUFD; movOpCode = Js::OpCode::MOVD; break; -#if 0 case Js::OpCode::Simd128_Splat_D2: shufOpCode = Js::OpCode::SHUFPD; movOpCode = Js::OpCode::MOVSD; break; -#endif // 0 + case Js::OpCode::Simd128_Splat_I2: + { + EmitInsertInt64(src1, 0, instr); + instr->InsertBefore(IR::Instr::New(Js::OpCode::PSHUFD, dst, dst, IR::IntConstOpnd::New(68, TyInt8, m_func, true), m_func)); + bSkip = true; + break; + } case Js::OpCode::Simd128_Splat_I8: case Js::OpCode::Simd128_Splat_U8: @@ -930,44 +1334,6 @@ IR::Instr* LowererMD::Simd128LowerSplat(IR::Instr *instr) return prevInstr; } -IR::Instr* LowererMD::Simd128LowerRcp(IR::Instr *instr, bool removeInstr) -{ - Js::OpCode opcode = Js::OpCode::DIVPS; - IR::Opnd *dst, *src1; - dst = instr->GetDst(); - src1 = instr->GetSrc1(); - - Assert(dst && dst->IsRegOpnd()); - Assert(src1 && src1->IsRegOpnd()); - Assert(instr->GetSrc2() == nullptr); - Assert(src1->IsSimd128F4() || src1->IsSimd128I4()); - opcode = Js::OpCode::DIVPS; - -#if 0 - { - Assert(instr->m_opcode == Js::OpCode::Simd128_Rcp_D2 || instr->m_opcode == Js::OpCode::Simd128_RcpSqrt_D2); - Assert(src1->IsSimd128D2()); - opcode = Js::OpCode::DIVPD; - x86_allones_mask = (void*)(&X86_ALL_ONES_D2); - } -#endif // 0 - - IR::RegOpnd* tmp = IR::RegOpnd::New(src1->GetType(), m_func); - IR::Instr* movInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllOnesF4Addr(), src1->GetType(), m_func), m_func); - instr->InsertBefore(movInstr); - Legalize(movInstr); - - instr->InsertBefore(IR::Instr::New(opcode, tmp, tmp, src1, m_func)); - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVAPS, dst, tmp, m_func)); - if (removeInstr) - { - IR::Instr* prevInstr = instr->m_prev; - instr->Remove(); - return prevInstr; - } - return instr; -} - IR::Instr* LowererMD::Simd128LowerSqrt(IR::Instr *instr) { Js::OpCode opcode = Js::OpCode::SQRTPS; @@ -993,69 +1359,6 @@ IR::Instr* LowererMD::Simd128LowerSqrt(IR::Instr *instr) return prevInstr; } -IR::Instr* LowererMD::Simd128LowerRcpSqrt(IR::Instr *instr) -{ - Js::OpCode opcode = Js::OpCode::SQRTPS; - Simd128LowerRcp(instr, false); - - opcode = Js::OpCode::SQRTPS; - -#if 0 - else - { - Assert(instr->m_opcode == Js::OpCode::Simd128_RcpSqrt_D2); - opcode = Js::OpCode::SQRTPD; - } -#endif // 0 - - instr->InsertBefore(IR::Instr::New(opcode, instr->GetDst(), instr->GetDst(), m_func)); - IR::Instr* prevInstr = instr->m_prev; - instr->Remove(); - return prevInstr; -} - -IR::Instr* LowererMD::Simd128LowerSelect(IR::Instr *instr) -{ - Assert(instr->m_opcode == Js::OpCode::Simd128_Select_F4 || instr->m_opcode == Js::OpCode::Simd128_Select_I4 /*|| instr->m_opcode == Js::OpCode::Simd128_Select_D2 */|| - instr->m_opcode == Js::OpCode::Simd128_Select_I8 || instr->m_opcode == Js::OpCode::Simd128_Select_I16 || instr->m_opcode == Js::OpCode::Simd128_Select_U4 || - instr->m_opcode == Js::OpCode::Simd128_Select_U8 || instr->m_opcode == Js::OpCode::Simd128_Select_U16 ); - - IR::Opnd* dst = nullptr; - IR::Opnd* src1 = nullptr; - IR::Opnd* src2 = nullptr; - IR::Opnd* src3 = nullptr; - SList *args = Simd128GetExtendedArgs(instr); - // The number of src opnds should be exact. Missing opnds means type-error, and we should generate an exception throw instead (or globopt does). - Assert(args->Count() == 4); - dst = args->Pop(); - src1 = args->Pop(); // mask - src2 = args->Pop(); // trueValue - src3 = args->Pop(); // falseValue - - Assert(dst->IsRegOpnd() && dst->IsSimd128()); - Assert(src1->IsRegOpnd() && src1->IsSimd128()); - Assert(src2->IsRegOpnd() && src2->IsSimd128()); - Assert(src3->IsRegOpnd() && src3->IsSimd128()); - - IR::RegOpnd *tmp = IR::RegOpnd::New(src1->GetType(), m_func); - IR::Instr *pInstr = nullptr; - // ANDPS tmp1, mask, tvalue - pInstr = IR::Instr::New(Js::OpCode::ANDPS, tmp, src1, src2, m_func); - instr->InsertBefore(pInstr); - Legalize(pInstr); - // ANDPS dst, mask, fvalue - pInstr = IR::Instr::New(Js::OpCode::ANDNPS, dst, src1, src3, m_func); - instr->InsertBefore(pInstr); - Legalize(pInstr); - // ORPS dst, dst, tmp1 - pInstr = IR::Instr::New(Js::OpCode::ORPS, dst, dst, tmp, m_func); - instr->InsertBefore(pInstr); - - pInstr = instr->m_prev; - instr->Remove(); - return pInstr; -} - IR::Instr* LowererMD::Simd128LowerNeg(IR::Instr *instr) { @@ -1238,6 +1541,17 @@ IR::Instr* LowererMD::Simd128LowerShift(IR::Instr *instr) switch (instr->m_opcode) { + case Js::OpCode::Simd128_ShRtByScalar_I2: + EmitShiftByScalarI2(instr, IR::HelperSimd128ShRtByScalarI2); + return removeInstr(instr); + case Js::OpCode::Simd128_ShLtByScalar_I2: + opcode = Js::OpCode::PSLLQ; + elementSizeInBytes = 8; + break; + case Js::OpCode::Simd128_ShRtByScalar_U2: + opcode = Js::OpCode::PSRLQ; + elementSizeInBytes = 8; + break; case Js::OpCode::Simd128_ShLtByScalar_I4: case Js::OpCode::Simd128_ShLtByScalar_U4: // same as int32x4.ShiftLeftScalar opcode = Js::OpCode::PSLLD; @@ -1284,7 +1598,7 @@ IR::Instr* LowererMD::Simd128LowerShift(IR::Instr *instr) //Shift amount: The shift amout is masked by [ElementSize] * 8 //The masked Shift amount is moved to xmm register //AND shamt, shmask, shamt - //MOVD tmp0, shamt + //MOVD tmp0, shamt IR::RegOpnd *shamt = IR::RegOpnd::New(src2->GetType(), m_func); // en-register @@ -1300,7 +1614,8 @@ IR::Instr* LowererMD::Simd128LowerShift(IR::Instr *instr) if (instr->m_opcode == Js::OpCode::Simd128_ShLtByScalar_I4 || instr->m_opcode == Js::OpCode::Simd128_ShRtByScalar_I4 || instr->m_opcode == Js::OpCode::Simd128_ShLtByScalar_U4 || instr->m_opcode == Js::OpCode::Simd128_ShRtByScalar_U4 || instr->m_opcode == Js::OpCode::Simd128_ShLtByScalar_I8 || instr->m_opcode == Js::OpCode::Simd128_ShRtByScalar_I8 || - instr->m_opcode == Js::OpCode::Simd128_ShLtByScalar_U8 || instr->m_opcode == Js::OpCode::Simd128_ShRtByScalar_U8) + instr->m_opcode == Js::OpCode::Simd128_ShLtByScalar_U8 || instr->m_opcode == Js::OpCode::Simd128_ShRtByScalar_U8 || + instr->m_opcode == Js::OpCode::Simd128_ShLtByScalar_I2 || instr->m_opcode == Js::OpCode::Simd128_ShRtByScalar_U2) { // shiftOpCode dst, src1, tmp0 pInstr = IR::Instr::New(opcode, dst, src1, tmp0, m_func); @@ -2221,12 +2536,12 @@ IR::Instr* LowererMD::Simd128LowerMinMax_F4(IR::Instr* instr) instr->InsertBefore(pInstr); Legalize(pInstr); } - else + else { //This sequence closely mirrors SIMDFloat32x4Operation::OpMax except for //the fact that tmp2 (tmpbValue) is reused to reduce the number of registers - //needed for this sequence. + //needed for this sequence. pInstr = IR::Instr::New(Js::OpCode::MAXPS, tmp1, src1, src2, m_func); instr->InsertBefore(pInstr); @@ -2255,16 +2570,58 @@ IR::Instr* LowererMD::Simd128LowerMinMax_F4(IR::Instr* instr) } + +#ifdef ENABLE_WASM_SIMD +IR::Opnd* LowererMD::Simd128CanonicalizeToBoolsBeforeReduction(IR::Instr* instr) +{ + IR::Opnd* src1 = instr->GetSrc1(); + if (m_func->GetJITFunctionBody()->IsWasmFunction()) + { + Js::OpCode cmpOpcode = Js::OpCode::InvalidOpCode; + switch (instr->m_opcode) + { + case Js::OpCode::Simd128_AnyTrue_B4: + case Js::OpCode::Simd128_AnyTrue_B2: + case Js::OpCode::Simd128_AllTrue_B4: + case Js::OpCode::Simd128_AllTrue_B2: + cmpOpcode = Js::OpCode::PCMPEQD; + break; + case Js::OpCode::Simd128_AnyTrue_B8: + case Js::OpCode::Simd128_AllTrue_B8: + cmpOpcode = Js::OpCode::PCMPEQW; + break; + case Js::OpCode::Simd128_AnyTrue_B16: + case Js::OpCode::Simd128_AllTrue_B16: + cmpOpcode = Js::OpCode::PCMPEQB; + break; + default: + Assert(UNREACHED); + } + + IR::RegOpnd * newSrc = IR::RegOpnd::New(src1->GetType(), m_func); + m_lowerer->InsertMove(newSrc, src1, instr); + Simd128CanonicalizeToBools(instr, cmpOpcode, *newSrc); + return newSrc; + } + return src1; +} +#endif + IR::Instr* LowererMD::Simd128LowerAnyTrue(IR::Instr* instr) { Assert(instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B4 || instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B8 || - instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B16); + instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B16 || instr->m_opcode == Js::OpCode::Simd128_AnyTrue_B2); IR::Instr *pInstr; IR::Opnd* dst = instr->GetDst(); +#ifdef ENABLE_WASM_SIMD + IR::Opnd* src1 = Simd128CanonicalizeToBoolsBeforeReduction(instr); +#else IR::Opnd* src1 = instr->GetSrc1(); +#endif Assert(dst->IsRegOpnd() && dst->IsInt32()); Assert(src1->IsRegOpnd() && src1->IsSimd128()); + // pmovmskb dst, src1 // neg dst // sbb dst, dst @@ -2299,11 +2656,15 @@ IR::Instr* LowererMD::Simd128LowerAnyTrue(IR::Instr* instr) IR::Instr* LowererMD::Simd128LowerAllTrue(IR::Instr* instr) { Assert(instr->m_opcode == Js::OpCode::Simd128_AllTrue_B4 || instr->m_opcode == Js::OpCode::Simd128_AllTrue_B8 || - instr->m_opcode == Js::OpCode::Simd128_AllTrue_B16); + instr->m_opcode == Js::OpCode::Simd128_AllTrue_B16 || instr->m_opcode == Js::OpCode::Simd128_AllTrue_B2); IR::Instr *pInstr; IR::Opnd* dst = instr->GetDst(); +#ifdef ENABLE_WASM_SIMD + IR::Opnd* src1 = Simd128CanonicalizeToBoolsBeforeReduction(instr); +#else IR::Opnd* src1 = instr->GetSrc1(); +#endif Assert(dst->IsRegOpnd() && dst->IsInt32()); Assert(src1->IsRegOpnd() && src1->IsSimd128()); @@ -2314,15 +2675,35 @@ IR::Instr* LowererMD::Simd128LowerAllTrue(IR::Instr* instr) pInstr = IR::Instr::New(Js::OpCode::PMOVMSKB, dst, src1, m_func); instr->InsertBefore(pInstr); - // cmp dst, 0FFFFh + //horizontally OR into 0th and 2nd positions + //TODO nikolayk revisit the sequence for in64x2.alltrue + IR::Opnd* newDst = dst; + uint cmpMask = 0xFFFF; + if (instr->m_opcode == Js::OpCode::Simd128_AllTrue_B2) + { + cmpMask = 0x0F0F; + IR::RegOpnd* reduceReg = IR::RegOpnd::New(TyInt32, m_func); + pInstr = IR::Instr::New(Js::OpCode::SHR, reduceReg, dst, (IR::IntConstOpnd::New(4, TyInt32, m_func, true)), m_func); + instr->InsertBefore(pInstr); + Legalize(pInstr); + pInstr = IR::Instr::New(Js::OpCode::OR, reduceReg, reduceReg, dst, m_func); + instr->InsertBefore(pInstr); + Legalize(pInstr); + pInstr = IR::Instr::New(Js::OpCode::AND, reduceReg, reduceReg, (IR::IntConstOpnd::New(0x0F0F, TyInt32, m_func, true)), m_func); + instr->InsertBefore(pInstr); + Legalize(pInstr); + newDst = reduceReg; + } + + // cmp dst, cmpMask pInstr = IR::Instr::New(Js::OpCode::CMP, m_func); - pInstr->SetSrc1(dst); - pInstr->SetSrc2(IR::IntConstOpnd::New(0x0FFFF, TyInt32, m_func, true)); + pInstr->SetSrc1(newDst); + pInstr->SetSrc2(IR::IntConstOpnd::New(cmpMask, TyInt32, m_func, true)); instr->InsertBefore(pInstr); Legalize(pInstr); // mov tmp(TyInt8), dst - pInstr = IR::Instr::New(Js::OpCode::MOV, tmp, dst, m_func); + pInstr = IR::Instr::New(Js::OpCode::MOV, tmp, newDst, m_func); instr->InsertBefore(pInstr); Legalize(pInstr); @@ -2385,8 +2766,15 @@ IR::Instr* LowererMD::Simd128LowerInt32x4FromFloat32x4(IR::Instr *instr) // CMPLTPS tmp, src, tmp2 // MOVMSKPS mask2, tmp // OR mask1, mask1, mask2 + // check for NaNs + // CMPEQPS tmp, src + // MOVMSKPS mask2, tmp + // NOT mask2 + // AND mask2, 0x00000F + // OR mask1, mask2 + // // CMP mask1, 0 - // JNE $doneLabel + // JEQ $doneLabel newInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp2, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86TwoPower31F4Addr(), TySimd128I4, m_func), m_func); insertInstr->InsertBefore(newInstr); Legalize(newInstr); @@ -2398,7 +2786,6 @@ IR::Instr* LowererMD::Simd128LowerInt32x4FromFloat32x4(IR::Instr *instr) newInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp2, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86NegTwoPower31F4Addr(), TySimd128I4, m_func), m_func); insertInstr->InsertBefore(newInstr); Legalize(newInstr); - newInstr = IR::Instr::New(Js::OpCode::CMPLTPS, tmp, src, tmp2, m_func); insertInstr->InsertBefore(newInstr); Legalize(newInstr); @@ -2406,6 +2793,22 @@ IR::Instr* LowererMD::Simd128LowerInt32x4FromFloat32x4(IR::Instr *instr) insertInstr->InsertBefore(IR::Instr::New(Js::OpCode::MOVMSKPS, mask2, tmp, m_func)); insertInstr->InsertBefore(IR::Instr::New(Js::OpCode::OR, mask1, mask1, mask2, m_func)); + +#ifdef ENABLE_WASM_SIMD + if (m_func->GetJITFunctionBody()->IsWasmFunction()) + { + newInstr = IR::Instr::New(Js::OpCode::CMPEQPS, tmp, src, src, m_func); + insertInstr->InsertBefore(newInstr); + Legalize(newInstr); + insertInstr->InsertBefore(IR::Instr::New(Js::OpCode::MOVMSKPS, mask2, tmp, m_func)); + insertInstr->InsertBefore(IR::Instr::New(Js::OpCode::NOT, mask2, mask2, m_func)); + newInstr = IR::Instr::New(Js::OpCode::AND, mask2, mask2, IR::IntConstOpnd::New(0x00000F, TyInt32, m_func), m_func); + insertInstr->InsertBefore(newInstr); + Legalize(newInstr); + insertInstr->InsertBefore(IR::Instr::New(Js::OpCode::OR, mask1, mask1, mask2, m_func)); + } +#endif + newInstr = IR::Instr::New(Js::OpCode::CMP, m_func); newInstr->SetSrc1(mask1); newInstr->SetSrc2(IR::IntConstOpnd::New(0, TyInt32, m_func)); @@ -2438,6 +2841,28 @@ IR::Instr* LowererMD::Simd128LowerUint32x4FromFloat32x4(IR::Instr *instr) two_31_i4_mask = IR::RegOpnd::New(TySimd128I4, m_func); tmp = IR::RegOpnd::New(TySimd128F4, m_func); tmp2 = IR::RegOpnd::New(TySimd128F4, m_func); + + // check for NaNs + // CMPEQPS tmp, src + // MOVMSKPS mask2, tmp + // AND mask2, 0x00000F + // JNE throw +#ifdef ENABLE_WASM_SIMD + if (m_func->GetJITFunctionBody()->IsWasmFunction()) + { + newInstr = IR::Instr::New(Js::OpCode::CMPEQPS, tmp, src, src, m_func); + instr->InsertBefore(newInstr); + Legalize(newInstr); + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVMSKPS, mask, tmp, m_func)); + newInstr = IR::Instr::New(Js::OpCode::CMP, m_func); + newInstr->SetSrc1(mask); + newInstr->SetSrc2(IR::IntConstOpnd::New(0x0000000F, TyInt32, m_func)); + instr->InsertBefore(newInstr); + Legalize(newInstr); + instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JNE, throwLabel, m_func)); + } +#endif + // any lanes <= -1.0 ? // CMPLEPS tmp, src, [X86_ALL_FLOAT32_NEG_ONES] // MOVMSKPS mask, tmp @@ -2457,6 +2882,7 @@ IR::Instr* LowererMD::Simd128LowerUint32x4FromFloat32x4(IR::Instr *instr) instr->InsertBefore(newInstr); Legalize(newInstr); + instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JNE, throwLabel, m_func)); // CVTTPS2DQ does a range check over signed range [-2^31, 2^31-1], so will fail to convert values >= 2^31. @@ -2638,7 +3064,6 @@ IR::Instr* LowererMD::Simd128AsmJsLowerLoadElem(IR::Instr *instr) // Case (1) requires static bound check. Case (2) means we are always in bound. // this can happen in cases where globopt props a constant access which was not known at bytecodegen time or when heap is non-constant - if (src2->IsIntConstOpnd() && ((uint32)src1->AsIndirOpnd()->GetOffset() + dataWidth > src2->AsIntConstOpnd()->AsUint32())) { m_lowerer->GenerateRuntimeError(instr, JSERR_ArgumentOutOfRange, IR::HelperOp_RuntimeRangeError); @@ -3017,6 +3442,34 @@ SList * LowererMD::Simd128GetExtendedArgs(IR::Instr *instr) return args; } + + +IR::Opnd* +LowererMD::EnregisterBoolConst(IR::Instr* instr, IR::Opnd *opnd, IRType type) +{ + + if (opnd->IsIntConstOpnd() || opnd->IsInt64ConstOpnd()) + { + bool isSet = opnd->GetImmediateValue(instr->m_func) != 0; + IR::RegOpnd *tempReg = IR::RegOpnd::New(type, m_func); + instr->InsertBefore(IR::Instr::New(Js::OpCode::MOV, tempReg, IR::IntConstOpnd::New(isSet ? -1 : 0, type, m_func, true), m_func)); + return tempReg; + } + + IRType origType = opnd->GetType(); + IR::RegOpnd *tempReg = IR::RegOpnd::New(origType, m_func); + IR::Instr* cmovInstr = IR::Instr::New(Js::OpCode::MOV, tempReg, IR::IntConstOpnd::New(0, origType, m_func, true), m_func); + instr->InsertBefore(cmovInstr); + Legalize(cmovInstr); + cmovInstr = IR::Instr::New(Js::OpCode::SUB, tempReg, tempReg, opnd->UseWithNewType(origType, m_func), m_func); + instr->InsertBefore(cmovInstr); + Legalize(cmovInstr); + cmovInstr = IR::Instr::New(Js::OpCode::CMOVS, tempReg, tempReg, IR::IntConstOpnd::New(-1, origType, m_func, true), m_func); + instr->InsertBefore(cmovInstr); + Legalize(cmovInstr); + return tempReg->UseWithNewType(type, m_func); +} + IR::Opnd* LowererMD::EnregisterIntConst(IR::Instr* instr, IR::Opnd *constOpnd, IRType type /* = TyInt32*/) { @@ -3133,28 +3586,27 @@ void LowererMD::Simd128InitOpcodeMap() SET_SIMDOPCODE(Simd128_Neq_F4 , CMPNEQPS); // CMPNEQPS SET_SIMDOPCODE(Simd128_Gt_F4 , CMPLTPS); // CMPLTPS (swap srcs) SET_SIMDOPCODE(Simd128_GtEq_F4 , CMPLEPS); // CMPLEPS (swap srcs) - + SET_SIMDOPCODE(Simd128_Neg_D2 , XORPS); + SET_SIMDOPCODE(Simd128_Add_D2 , ADDPD); + SET_SIMDOPCODE(Simd128_Abs_D2 , ANDPD); + SET_SIMDOPCODE(Simd128_Sub_D2 , SUBPD); + SET_SIMDOPCODE(Simd128_Mul_D2 , MULPD); + SET_SIMDOPCODE(Simd128_Div_D2 , DIVPD); + SET_SIMDOPCODE(Simd128_Min_D2 , MINPD); + SET_SIMDOPCODE(Simd128_Max_D2 , MAXPD); + SET_SIMDOPCODE(Simd128_Sqrt_D2 , SQRTPD); + SET_SIMDOPCODE(Simd128_Lt_D2 , CMPLTPD); // CMPLTPD + SET_SIMDOPCODE(Simd128_LtEq_D2 , CMPLEPD); // CMPLEPD + SET_SIMDOPCODE(Simd128_Eq_D2 , CMPEQPD); // CMPEQPD + SET_SIMDOPCODE(Simd128_Neq_D2 , CMPNEQPD); // CMPNEQPD + SET_SIMDOPCODE(Simd128_Gt_D2 , CMPLTPD); // CMPLTPD (swap srcs) + SET_SIMDOPCODE(Simd128_GtEq_D2 , CMPLEPD); // CMPLEPD (swap srcs) #if 0 SET_SIMDOPCODE(Simd128_FromFloat32x4_D2, CVTPS2PD); SET_SIMDOPCODE(Simd128_FromFloat32x4Bits_D2, MOVAPS); SET_SIMDOPCODE(Simd128_FromInt32x4_D2, CVTDQ2PD); SET_SIMDOPCODE(Simd128_FromInt32x4Bits_D2, MOVAPS); - SET_SIMDOPCODE(Simd128_Neg_D2, XORPS); - SET_SIMDOPCODE(Simd128_Add_D2, ADDPD); - SET_SIMDOPCODE(Simd128_Abs_D2, ANDPD); - SET_SIMDOPCODE(Simd128_Sub_D2, SUBPD); - SET_SIMDOPCODE(Simd128_Mul_D2, MULPD); - SET_SIMDOPCODE(Simd128_Div_D2, DIVPD); - SET_SIMDOPCODE(Simd128_Min_D2, MINPD); - SET_SIMDOPCODE(Simd128_Max_D2, MAXPD); - SET_SIMDOPCODE(Simd128_Sqrt_D2, SQRTPD); - SET_SIMDOPCODE(Simd128_Lt_D2, CMPLTPD); // CMPLTPD - SET_SIMDOPCODE(Simd128_LtEq_D2, CMPLEPD); // CMPLEPD - SET_SIMDOPCODE(Simd128_Eq_D2, CMPEQPD); // CMPEQPD - SET_SIMDOPCODE(Simd128_Neq_D2, CMPNEQPD); // CMPNEQPD - SET_SIMDOPCODE(Simd128_Gt_D2, CMPLTPD); // CMPLTPD (swap srcs) - SET_SIMDOPCODE(Simd128_GtEq_D2, CMPLEPD); // CMPLEPD (swap srcs) #endif // 0 SET_SIMDOPCODE(Simd128_And_I8 , PAND); @@ -3217,83 +3669,13 @@ void LowererMD::Simd128InitOpcodeMap() SET_SIMDOPCODE(Simd128_Or_B16 , POR); SET_SIMDOPCODE(Simd128_Xor_B16 , XORPS); SET_SIMDOPCODE(Simd128_Not_B16 , XORPS); + + SET_SIMDOPCODE(Simd128_Add_I2 , PADDQ); + SET_SIMDOPCODE(Simd128_Sub_I2 , PSUBQ); } #undef SIMD_SETOPCODE #undef SIMD_GETOPCODE -// FromVar -void -LowererMD::GenerateCheckedSimdLoad(IR::Instr * instr) -{ - Assert(instr->m_opcode == Js::OpCode::FromVar); - Assert(instr->GetSrc1()->GetType() == TyVar); - Assert(IRType_IsSimd128(instr->GetDst()->GetType())); - - bool checkRequired = instr->HasBailOutInfo(); - IR::LabelInstr * labelHelper = nullptr, * labelDone = nullptr; - IR::Instr * insertInstr = instr, * newInstr; - IR::RegOpnd * src = instr->GetSrc1()->AsRegOpnd(), * dst = instr->GetDst()->AsRegOpnd(); - Assert(!checkRequired || instr->GetBailOutKind() == IR::BailOutSimd128F4Only || instr->GetBailOutKind() == IR::BailOutSimd128I4Only); - - if (checkRequired) - { - labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); - labelDone = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); - instr->InsertBefore(labelHelper); - instr->InsertAfter(labelDone); - insertInstr = labelHelper; - - GenerateObjectTest(instr->GetSrc1(), insertInstr, labelHelper); - - newInstr = IR::Instr::New(Js::OpCode::CMP, instr->m_func); - newInstr->SetSrc1(IR::IndirOpnd::New(instr->GetSrc1()->AsRegOpnd(), 0, TyMachPtr, instr->m_func)); - newInstr->SetSrc2(m_lowerer->LoadVTableValueOpnd(instr, dst->GetType() == TySimd128F4 ? VTableValue::VtableSimd128F4 : VTableValue::VtableSimd128I4)); - insertInstr->InsertBefore(newInstr); - Legalize(newInstr); - insertInstr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JNE, labelHelper, this->m_func)); - instr->UnlinkSrc1(); - instr->UnlinkDst(); - this->m_lowerer->GenerateBailOut(instr); - - } - size_t valueOffset = dst->GetType() == TySimd128F4 ? Js::JavascriptSIMDFloat32x4::GetOffsetOfValue() : Js::JavascriptSIMDInt32x4::GetOffsetOfValue(); - Assert(valueOffset < INT_MAX); - newInstr = IR::Instr::New(Js::OpCode::MOVUPS, dst, IR::IndirOpnd::New(src, static_cast(valueOffset), dst->GetType(), this->m_func), this->m_func); - insertInstr->InsertBefore(newInstr); - - insertInstr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JMP, labelDone, this->m_func)); - // FromVar is converted to BailOut call. Don't remove. -} - -// ToVar -void LowererMD::GenerateSimdStore(IR::Instr * instr) -{ - IR::RegOpnd *dst, *src; - IRType type; - dst = instr->GetDst()->AsRegOpnd(); - src = instr->GetSrc1()->AsRegOpnd(); - type = src->GetType(); - - this->m_lowerer->LoadScriptContext(instr); - IR::Instr * instrCall = IR::Instr::New(Js::OpCode::CALL, instr->GetDst(), - IR::HelperCallOpnd::New(type == TySimd128F4 ? IR::HelperAllocUninitializedSimdF4 : IR::HelperAllocUninitializedSimdI4, this->m_func), this->m_func); - instr->InsertBefore(instrCall); - this->lowererMDArch.LowerCall(instrCall, 0); - - IR::Opnd * valDst; - if (type == TySimd128F4) - { - valDst = IR::IndirOpnd::New(dst, (int32)Js::JavascriptSIMDFloat32x4::GetOffsetOfValue(), TySimd128F4, this->m_func); - } - else - { - valDst = IR::IndirOpnd::New(dst, (int32)Js::JavascriptSIMDInt32x4::GetOffsetOfValue(), TySimd128I4, this->m_func); - } - - instr->InsertBefore(IR::Instr::New(Js::OpCode::MOVUPS, valDst, src, this->m_func)); - instr->Remove(); -} - void LowererMD::CheckShuffleLanes_4(uint8 lanes[], uint8 lanesSrc[], uint *fromSrc1, uint *fromSrc2) { Assert(lanes); diff --git a/deps/chakrashim/core/lib/Backend/NativeCodeGenerator.cpp b/deps/chakrashim/core/lib/Backend/NativeCodeGenerator.cpp index 3d939f854fc..7cfab9052ce 100644 --- a/deps/chakrashim/core/lib/Backend/NativeCodeGenerator.cpp +++ b/deps/chakrashim/core/lib/Backend/NativeCodeGenerator.cpp @@ -89,6 +89,8 @@ NativeCodeGenerator::~NativeCodeGenerator() { Assert(this->IsClosed()); + DelayDeletingFunctionTable::Clear(); + #ifdef PROFILE_EXEC if (this->foregroundCodeGenProfiler != nullptr) { @@ -331,7 +333,7 @@ void DoFunctionRelocations(BYTE *function, DWORD functionOffset, DWORD functionS } break; -#elif defined(_M_X64_OR_ARM64) +#elif defined(TARGET_64) case IMAGE_REL_BASED_DIR64: { ULONGLONG *patchAddr64 = (ULONGLONG *) (function + blockOffset + offset - functionOffset); @@ -469,6 +471,22 @@ NativeCodeGenerator::RejitIRViewerFunction(Js::FunctionBody *fn, Js::ScriptConte } #endif /* IR_VIEWER */ +#ifdef ALLOW_JIT_REPRO +HRESULT NativeCodeGenerator::JitFromEncodedWorkItem(_In_reads_(bufSize) const byte* buffer, _In_ uint bufferSize) +{ + CodeGenWorkItemIDL* workItemData = nullptr; + HRESULT hr = JITManager::DeserializeRPCData(buffer, bufferSize, &workItemData); + if (FAILED(hr)) + { + return hr; + } + AssertOrFailFast(workItemData); + JITOutputIDL jitOutput = { 0 }; + CodeGen(scriptContext->GetThreadContext()->GetPageAllocator(), workItemData, jitOutput, true); + return S_OK; +} +#endif + ///---------------------------------------------------------------------------- /// /// NativeCodeGenerator::GenerateFunction @@ -486,8 +504,6 @@ NativeCodeGenerator::GenerateFunction(Js::FunctionBody *fn, Js::ScriptFunction * Assert(fn->GetFunctionBody() == fn); Assert(!fn->IsDeferred()); -#if !defined(_M_ARM64) - if (fn->IsGeneratorAndJitIsDisabled()) { // JITing generator functions is not complete nor stable yet so it is off by default. @@ -606,9 +622,6 @@ NativeCodeGenerator::GenerateFunction(Js::FunctionBody *fn, Js::ScriptFunction * Processor()->PrioritizeJobAndWait(this, entryPointInfo, function); CheckCodeGenDone(fn, entryPointInfo, function); return true; -#else - return false; -#endif } void NativeCodeGenerator::GenerateLoopBody(Js::FunctionBody * fn, Js::LoopHeader * loopHeader, Js::EntryPointInfo* entryPoint, uint localCount, Js::Var localSlots[]) @@ -721,7 +734,7 @@ NativeCodeGenerator::IsValidVar(const Js::Var var, Recycler *const recycler) } #endif - RecyclableObject *const recyclableObject = RecyclableObject::FromVar(var); + RecyclableObject *const recyclableObject = RecyclableObject::UnsafeFromVar(var); if(!recycler->IsValidObject(recyclableObject, sizeof(*recyclableObject))) { return false; @@ -796,9 +809,95 @@ NativeCodeGenerator::IsValidVar(const Js::Var var, Recycler *const recycler) volatile UINT_PTR NativeCodeGenerator::CodegenFailureSeed = 0; #endif +void NativeCodeGenerator::CodeGen(PageAllocator* pageAllocator, CodeGenWorkItemIDL* workItemData, _Out_ JITOutputIDL& jitWriteData, const bool foreground, Js::EntryPointInfo* epInfo /*= nullptr*/) +{ + if (JITManager::GetJITManager()->IsOOPJITEnabled()) + { + PSCRIPTCONTEXT_HANDLE remoteScriptContext = this->scriptContext->GetRemoteScriptAddr(); + if (!JITManager::GetJITManager()->IsConnected()) + { + throw Js::OperationAbortedException(); + } + HRESULT hr = JITManager::GetJITManager()->RemoteCodeGenCall( + workItemData, + remoteScriptContext, + &jitWriteData); + if (hr == E_ACCESSDENIED && scriptContext->IsClosed()) + { + // script context may close after codegen call starts, consider this as aborted codegen + hr = E_ABORT; + } + JITManager::HandleServerCallResult(hr, RemoteCallType::CodeGen); + + if (!PreReservedVirtualAllocWrapper::IsInRange((void*)this->scriptContext->GetThreadContext()->GetPreReservedRegionAddr(), (void*)jitWriteData.codeAddress)) + { + this->scriptContext->GetJitFuncRangeCache()->AddFuncRange((void*)jitWriteData.codeAddress, jitWriteData.codeSize); + } + Assert(jitWriteData.codeAddress); + Assert(jitWriteData.codeSize); + } + else + { +#if DBG + size_t serializedRpcDataSize = 0; + const unsigned char* serializedRpcData = nullptr; + JITManager::SerializeRPCData(workItemData, &serializedRpcDataSize, &serializedRpcData); + struct AutoFreeArray + { + const byte* arr = nullptr; + size_t bufferSize = 0; + ~AutoFreeArray() { HeapDeleteArray(bufferSize, arr); } + } autoFreeArray; + autoFreeArray.arr = serializedRpcData; + autoFreeArray.bufferSize = serializedRpcDataSize; +#endif + + InProcCodeGenAllocators *const allocators = + foreground ? EnsureForegroundAllocators(pageAllocator) : GetBackgroundAllocator(pageAllocator); // okay to do outside lock since the respective function is called only from one thread + NoRecoverMemoryJitArenaAllocator jitArena(_u("JITArena"), pageAllocator, Js::Throw::OutOfMemory); +#if DBG + jitArena.SetNeedsDelayFreeList(); +#endif + JITTimeWorkItem * jitWorkItem = Anew(&jitArena, JITTimeWorkItem, workItemData); + +#if !FLOATVAR + CodeGenNumberAllocator* pNumberAllocator = nullptr; + + // the number allocator needs to be on the stack so that if we are doing foreground JIT + // the chunk allocated from the recycler will be stacked pinned + CodeGenNumberAllocator numberAllocator( + foreground ? nullptr : scriptContext->GetThreadContext()->GetCodeGenNumberThreadAllocator(), + scriptContext->GetRecycler()); + pNumberAllocator = &numberAllocator; +#endif + Js::ScriptContextProfiler *const codeGenProfiler = +#ifdef PROFILE_EXEC + foreground ? EnsureForegroundCodeGenProfiler() : GetBackgroundCodeGenProfiler(pageAllocator); // okay to do outside lock since the respective function is called only from one thread +#else + nullptr; +#endif + + Func::Codegen(&jitArena, jitWorkItem, scriptContext->GetThreadContext(), + scriptContext, &jitWriteData, epInfo, nullptr, jitWorkItem->GetPolymorphicInlineCacheInfo(), allocators, +#if !FLOATVAR + pNumberAllocator, +#endif + codeGenProfiler, !foreground); + + if (!this->scriptContext->GetThreadContext()->GetPreReservedVirtualAllocator()->IsInRange((void*)jitWriteData.codeAddress)) + { + this->scriptContext->GetJitFuncRangeCache()->AddFuncRange((void*)jitWriteData.codeAddress, jitWriteData.codeSize); + } + } +} + void NativeCodeGenerator::CodeGen(PageAllocator * pageAllocator, CodeGenWorkItem* workItem, const bool foreground) { + // flush the function tables before allocating any new code + // to prevent old function table is referring to new code address + DelayDeletingFunctionTable::Clear(); + if(foreground) { // Func::Codegen has a lot of things on the stack, so probe the stack here instead @@ -894,70 +993,7 @@ NativeCodeGenerator::CodeGen(PageAllocator * pageAllocator, CodeGenWorkItem* wor LARGE_INTEGER start_time = { 0 }; NativeCodeGenerator::LogCodeGenStart(workItem, &start_time); workItem->GetJITData()->startTime = (int64)start_time.QuadPart; - if (JITManager::GetJITManager()->IsOOPJITEnabled()) - { - PSCRIPTCONTEXT_HANDLE remoteScriptContext = this->scriptContext->GetRemoteScriptAddr(); - if (!JITManager::GetJITManager()->IsConnected()) - { - throw Js::OperationAbortedException(); - } - HRESULT hr = JITManager::GetJITManager()->RemoteCodeGenCall( - workItem->GetJITData(), - remoteScriptContext, - &jitWriteData); - if (hr == E_ACCESSDENIED && body->GetScriptContext()->IsClosed()) - { - // script context may close after codegen call starts, consider this as aborted codegen - hr = E_ABORT; - } - JITManager::HandleServerCallResult(hr, RemoteCallType::CodeGen); - - if (!PreReservedVirtualAllocWrapper::IsInRange((void*)this->scriptContext->GetThreadContext()->GetPreReservedRegionAddr(), (void*)jitWriteData.codeAddress)) - { - this->scriptContext->GetJitFuncRangeCache()->AddFuncRange((void*)jitWriteData.codeAddress, jitWriteData.codeSize); - } - Assert(jitWriteData.codeAddress); - Assert(jitWriteData.codeSize); - } - else - { - InProcCodeGenAllocators *const allocators = - foreground ? EnsureForegroundAllocators(pageAllocator) : GetBackgroundAllocator(pageAllocator); // okay to do outside lock since the respective function is called only from one thread - NoRecoverMemoryJitArenaAllocator jitArena(_u("JITArena"), pageAllocator, Js::Throw::OutOfMemory); -#if DBG - jitArena.SetNeedsDelayFreeList(); -#endif - JITTimeWorkItem * jitWorkItem = Anew(&jitArena, JITTimeWorkItem, workItem->GetJITData()); - -#if !FLOATVAR - CodeGenNumberAllocator* pNumberAllocator = nullptr; - - // the number allocator needs to be on the stack so that if we are doing foreground JIT - // the chunk allocated from the recycler will be stacked pinned - CodeGenNumberAllocator numberAllocator( - foreground ? nullptr : scriptContext->GetThreadContext()->GetCodeGenNumberThreadAllocator(), - scriptContext->GetRecycler()); - pNumberAllocator = &numberAllocator; -#endif - Js::ScriptContextProfiler *const codeGenProfiler = -#ifdef PROFILE_EXEC - foreground ? EnsureForegroundCodeGenProfiler() : GetBackgroundCodeGenProfiler(pageAllocator); // okay to do outside lock since the respective function is called only from one thread -#else - nullptr; -#endif - - Func::Codegen(&jitArena, jitWorkItem, scriptContext->GetThreadContext(), - scriptContext, &jitWriteData, epInfo, nullptr, jitWorkItem->GetPolymorphicInlineCacheInfo(), allocators, -#if !FLOATVAR - pNumberAllocator, -#endif - codeGenProfiler, !foreground); - - if (!this->scriptContext->GetThreadContext()->GetPreReservedVirtualAllocator()->IsInRange((void*)jitWriteData.codeAddress)) - { - this->scriptContext->GetJitFuncRangeCache()->AddFuncRange((void*)jitWriteData.codeAddress, jitWriteData.codeSize); - } - } + CodeGen(pageAllocator, workItem->GetJITData(), jitWriteData, foreground, epInfo); if (JITManager::GetJITManager()->IsOOPJITEnabled() && PHASE_VERBOSE_TRACE(Js::BackEndPhase, workItem->GetFunctionBody())) { @@ -1072,7 +1108,7 @@ NativeCodeGenerator::CodeGen(PageAllocator * pageAllocator, CodeGenWorkItem* wor workItem->GetEntryPoint()->GetJitTransferData()->SetIsReady(); } -#if defined(_M_X64) +#if defined(TARGET_64) XDataAllocation * xdataInfo = HeapNewZ(XDataAllocation); xdataInfo->address = (byte*)jitWriteData.xdataAddr; XDataAllocator::Register(xdataInfo, jitWriteData.codeAddress, jitWriteData.codeSize); @@ -1199,6 +1235,7 @@ NativeCodeGenerator::CodeGen(PageAllocator * pageAllocator, CodeGenWorkItem* wor #endif } + /* static */ void NativeCodeGenerator::LogCodeGenStart(CodeGenWorkItem * workItem, LARGE_INTEGER * start_time) { @@ -1670,7 +1707,11 @@ NativeCodeGenerator::CheckCodeGenDone( entryPointInfo->GetNativeEntrypoint()); jsMethod = entryPointInfo->jsMethod; - Assert(!functionBody->NeedEnsureDynamicProfileInfo() || jsMethod == Js::DynamicProfileInfo::EnsureDynamicProfileInfoThunk); + Assert(!functionBody->NeedEnsureDynamicProfileInfo() || jsMethod == Js::DynamicProfileInfo::EnsureDynamicProfileInfoThunk || functionBody->GetIsAsmjsMode()); + if (functionBody->GetIsAsmjsMode() && functionBody->NeedEnsureDynamicProfileInfo()) + { + functionBody->EnsureDynamicProfileInfo(); + } } Assert(!IsThunk(jsMethod)); @@ -1867,13 +1908,23 @@ NativeCodeGenerator::Prioritize(JsUtil::Job *const job, const bool forceAddJobTo if (functionBody->GetIsAsmjsMode()) { jitMode = ExecutionMode::FullJit; - functionBody->SetExecutionMode(ExecutionMode::FullJit); + functionBody->SetAsmJsExecutionMode(); } else { - if(!forceAddJobToProcessor && !functionBody->TryTransitionToJitExecutionMode()) + if (!forceAddJobToProcessor) { - return; + if (!functionBody->TryTransitionToJitExecutionMode()) + { + return; + } +#if ENABLE_OOP_NATIVE_CODEGEN + // If for some reason OOP JIT isn't connected (e.g. it crashed), don't attempt to JIT + if (JITManager::GetJITManager()->IsOOPJITEnabled() && !JITManager::GetJITManager()->IsConnected()) + { + return; + } +#endif } jitMode = functionBody->GetExecutionMode(); @@ -2750,6 +2801,7 @@ NativeCodeGenerator::GatherCodeGenData( } Js::JavascriptFunction* fixedFunctionObject = nullptr; +#if ENABLE_FIXED_FIELDS if (inlineCache && (inlineCache->IsLocal() || inlineCache->IsProto())) { inlineCache->TryGetFixedMethodFromCache(functionBody, ldFldInlineCacheIndex, &fixedFunctionObject); @@ -2759,6 +2811,7 @@ NativeCodeGenerator::GatherCodeGenData( { fixedFunctionObject = nullptr; } +#endif if (!PHASE_OFF(Js::InlineRecursivePhase, functionBody)) { @@ -3153,14 +3206,14 @@ NativeCodeGenerator::EnterScriptStart() } void -FreeNativeCodeGenAllocation(Js::ScriptContext *scriptContext, Js::JavascriptMethod codeAddress, Js::JavascriptMethod thunkAddress) +FreeNativeCodeGenAllocation(Js::ScriptContext *scriptContext, Js::JavascriptMethod codeAddress, Js::JavascriptMethod thunkAddress, void** functionTable) { if (!scriptContext->GetNativeCodeGenerator()) - { + { return; } - scriptContext->GetNativeCodeGenerator()->QueueFreeNativeCodeGenAllocation((void*)codeAddress, (void*)thunkAddress); + scriptContext->GetNativeCodeGenerator()->QueueFreeNativeCodeGenAllocation((void*)codeAddress, (void*)thunkAddress, functionTable); } bool TryReleaseNonHiPriWorkItem(Js::ScriptContext* scriptContext, CodeGenWorkItem* workItem) @@ -3191,22 +3244,30 @@ bool NativeCodeGenerator::TryReleaseNonHiPriWorkItem(CodeGenWorkItem* workItem) } void -NativeCodeGenerator::FreeNativeCodeGenAllocation(void* codeAddress) +NativeCodeGenerator::FreeNativeCodeGenAllocation(void* codeAddress, void** functionTable) { if (JITManager::GetJITManager()->IsOOPJITEnabled()) { + // function table delete in content process +#if PDATA_ENABLED && defined(_WIN32) + if (functionTable && *functionTable) + { + NtdllLibrary::Instance->DeleteGrowableFunctionTable(*functionTable); + *functionTable = nullptr; + } +#endif ThreadContext * context = this->scriptContext->GetThreadContext(); HRESULT hr = JITManager::GetJITManager()->FreeAllocation(context->GetRemoteThreadContextAddr(), (intptr_t)codeAddress); JITManager::HandleServerCallResult(hr, RemoteCallType::MemFree); } else if(this->backgroundAllocators) { - this->backgroundAllocators->emitBufferManager.FreeAllocation(codeAddress); + this->backgroundAllocators->emitBufferManager.FreeAllocation(codeAddress, functionTable); } } void -NativeCodeGenerator::QueueFreeNativeCodeGenAllocation(void* codeAddress, void * thunkAddress) +NativeCodeGenerator::QueueFreeNativeCodeGenAllocation(void* codeAddress, void * thunkAddress, void** functionTable) { ASSERT_THREAD(); @@ -3236,24 +3297,24 @@ NativeCodeGenerator::QueueFreeNativeCodeGenAllocation(void* codeAddress, void * // OOP JIT will always queue a job // The foreground allocators may have been used - if(this->foregroundAllocators && this->foregroundAllocators->emitBufferManager.FreeAllocation(codeAddress)) + if (this->foregroundAllocators && this->foregroundAllocators->emitBufferManager.FreeAllocation(codeAddress, functionTable)) { return; } // The background allocators were used. Queue a job to free the allocation from the background thread. - this->freeLoopBodyManager.QueueFreeLoopBodyJob(codeAddress, thunkAddress); + this->freeLoopBodyManager.QueueFreeLoopBodyJob(codeAddress, thunkAddress, functionTable); } -void NativeCodeGenerator::FreeLoopBodyJobManager::QueueFreeLoopBodyJob(void* codeAddress, void * thunkAddress) +void NativeCodeGenerator::FreeLoopBodyJobManager::QueueFreeLoopBodyJob(void* codeAddress, void * thunkAddress, void** functionTable) { Assert(!this->isClosed); - FreeLoopBodyJob* job = HeapNewNoThrow(FreeLoopBodyJob, this, codeAddress, thunkAddress); + FreeLoopBodyJob* job = HeapNewNoThrow(FreeLoopBodyJob, this, codeAddress, thunkAddress, *functionTable); if (job == nullptr) { - FreeLoopBodyJob stackJob(this, codeAddress, thunkAddress, false /* heapAllocated */); + FreeLoopBodyJob stackJob(this, codeAddress, thunkAddress, *functionTable, false /* heapAllocated */); { AutoOptionalCriticalSection lock(Processor()->GetCriticalSection()); @@ -3277,6 +3338,9 @@ void NativeCodeGenerator::FreeLoopBodyJobManager::QueueFreeLoopBodyJob(void* cod HeapDelete(job); } } + + // function table successfully transferred to background job + *functionTable = nullptr; } #ifdef PROFILE_EXEC @@ -3597,7 +3661,7 @@ bool NativeCodeGenerator::TryAggressiveInlining(Js::FunctionBody *const topFunct bool isConstructorCall = false; bool isPolymorphicCall = false; - if (!inliningDecider.HasCallSiteInfo(inlineeFunctionBody, profiledCallSiteId)) + if (!inlineeFunctionBody->IsJsBuiltInCode() && !inliningDecider.HasCallSiteInfo(inlineeFunctionBody, profiledCallSiteId)) { //There is no callsite information. We should hit bailonnoprofile for these callsites. Ignore. continue; diff --git a/deps/chakrashim/core/lib/Backend/NativeCodeGenerator.h b/deps/chakrashim/core/lib/Backend/NativeCodeGenerator.h index 0992e11f91e..42249c4b0f3 100644 --- a/deps/chakrashim/core/lib/Backend/NativeCodeGenerator.h +++ b/deps/chakrashim/core/lib/Backend/NativeCodeGenerator.h @@ -45,6 +45,9 @@ class NativeCodeGenerator sealed : public JsUtil::WaitableJobManager #ifdef IR_VIEWER Js::Var RejitIRViewerFunction(Js::FunctionBody *fn, Js::ScriptContext *scriptContext); #endif +#ifdef ALLOW_JIT_REPRO + HRESULT JitFromEncodedWorkItem(_In_reads_(bufSize) const byte* buf, _In_ uint bufSize); +#endif void SetProfileMode(BOOL fSet); public: static Js::Var CheckCodeGenThunk(Js::RecyclableObject* function, Js::CallInfo callInfo, ...); @@ -101,10 +104,10 @@ void SetProfileMode(BOOL fSet); void UpdateQueueForDebugMode(); bool IsBackgroundJIT() const; void EnterScriptStart(); - void FreeNativeCodeGenAllocation(void* codeAddress); + void FreeNativeCodeGenAllocation(void* codeAddress, void** functionTable); bool TryReleaseNonHiPriWorkItem(CodeGenWorkItem* workItem); - void QueueFreeNativeCodeGenAllocation(void* codeAddress, void* thunkAddress); + void QueueFreeNativeCodeGenAllocation(void* codeAddress, void* thunkAddress, void** functionTable); bool IsClosed() { return isClosed; } void AddWorkItem(CodeGenWorkItem* workItem); @@ -126,6 +129,7 @@ void SetProfileMode(BOOL fSet); private: void CodeGen(PageAllocator * pageAllocator, CodeGenWorkItem* workItem, const bool foreground); + void CodeGen(PageAllocator* pageAllocator, CodeGenWorkItemIDL* workItemData, _Out_ JITOutputIDL& jitWriteData, const bool foreground, Js::EntryPointInfo* epInfo = nullptr); InProcCodeGenAllocators *CreateAllocators(PageAllocator *const pageAllocator) { @@ -138,7 +142,7 @@ void SetProfileMode(BOOL fSet); { this->foregroundAllocators = CreateAllocators(pageAllocator); -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD if (this->scriptContext->webWorkerId != Js::Constants::NonWebWorkerContextId) { this->foregroundAllocators->canCreatePreReservedSegment = true; @@ -164,7 +168,7 @@ void SetProfileMode(BOOL fSet); if (!this->backgroundAllocators) { this->backgroundAllocators = CreateAllocators(pageAllocator); -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD this->backgroundAllocators->canCreatePreReservedSegment = true; #endif } @@ -197,10 +201,11 @@ void SetProfileMode(BOOL fSet); class FreeLoopBodyJob: public JsUtil::Job { public: - FreeLoopBodyJob(JsUtil::JobManager *const manager, void* codeAddress, void* thunkAddress, bool isHeapAllocated = true): + FreeLoopBodyJob(JsUtil::JobManager *const manager, void* codeAddress, void* thunkAddress, void* functionTable, bool isHeapAllocated = true): JsUtil::Job(manager), codeAddress(codeAddress), thunkAddress(thunkAddress), + functionTable(functionTable), heapAllocated(isHeapAllocated) { } @@ -208,6 +213,7 @@ void SetProfileMode(BOOL fSet); bool heapAllocated; void* codeAddress; void* thunkAddress; + void* functionTable; }; class FreeLoopBodyJobManager sealed: public WaitableJobManager @@ -275,8 +281,9 @@ void SetProfileMode(BOOL fSet); { FreeLoopBodyJob* freeLoopBodyJob = static_cast(job); + void* functionTable = freeLoopBodyJob->functionTable; // Free Loop Body - nativeCodeGen->FreeNativeCodeGenAllocation(freeLoopBodyJob->codeAddress); + nativeCodeGen->FreeNativeCodeGenAllocation(freeLoopBodyJob->codeAddress, &functionTable); return true; } @@ -299,7 +306,7 @@ void SetProfileMode(BOOL fSet); } } - void QueueFreeLoopBodyJob(void* codeAddress, void* thunkAddress); + void QueueFreeLoopBodyJob(void* codeAddress, void* thunkAddress, void** functionTable); private: NativeCodeGenerator* nativeCodeGen; diff --git a/deps/chakrashim/core/lib/Backend/ObjTypeSpecFldInfo.cpp b/deps/chakrashim/core/lib/Backend/ObjTypeSpecFldInfo.cpp index f57ff5b3891..93e4cba7c62 100644 --- a/deps/chakrashim/core/lib/Backend/ObjTypeSpecFldInfo.cpp +++ b/deps/chakrashim/core/lib/Backend/ObjTypeSpecFldInfo.cpp @@ -275,7 +275,9 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::InlineCache* cac bool isLocal = localCache.IsLocal(); bool isProto = localCache.IsProto(); bool isAccessor = localCache.IsAccessor(); +#if ENABLE_FIXED_FIELDS bool isGetter = localCache.IsGetterAccessor(); +#endif if (isLocal) { type = TypeWithoutAuxSlotTag(localCache.u.local.type); @@ -372,12 +374,13 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::InlineCache* cac Assert(entryPoint->GetJitTransferData() != nullptr); entryPoint->GetJitTransferData()->AddJitTimeTypeRef(type, recycler); +#if ENABLE_FIXED_FIELDS bool allFixedPhaseOFF = PHASE_OFF(Js::FixedMethodsPhase, topFunctionBody) & PHASE_OFF(Js::UseFixedDataPropsPhase, topFunctionBody); if (!allFixedPhaseOFF) { Assert(propertyOwnerType != nullptr); - if (Js::DynamicType::Is(propertyOwnerType->GetTypeId())) + if (Js::DynamicType::Is(propertyOwnerType)) { Js::DynamicTypeHandler* propertyOwnerTypeHandler = ((Js::DynamicType*)propertyOwnerType)->GetTypeHandler(); Js::PropertyRecord const * const fixedPropertyRecord = functionBody->GetScriptContext()->GetPropertyName(propertyId); @@ -534,6 +537,7 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::InlineCache* cac } } } +#endif FixedFieldInfo * fixedFieldInfoArray = RecyclerNewArrayZ(recycler, FixedFieldInfo, 1); @@ -558,7 +562,7 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::InlineCache* cac // Fixed field checks allow us to assume a specific type ID, but the assumption is only // valid if we lock the type. Otherwise, the type ID may change out from under us without // evolving the type. - if (Js::DynamicType::Is(type->GetTypeId())) + if (Js::DynamicType::Is(type)) { Js::DynamicType *dynamicType = static_cast(type); if (!dynamicType->GetIsLocked()) @@ -766,7 +770,12 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::PolymorphicInlin areEquivalent = areStressEquivalent = false; } +#if ENABLE_FIXED_FIELDS gatherDataForInlining = gatherDataForInlining && (typeCount <= 4); // Only support 4-way (max) polymorphic inlining +#else + gatherDataForInlining = false; +#endif + if (!areEquivalent && !areStressEquivalent) { IncInlineCacheCount(nonEquivPolyInlineCacheCount); @@ -796,6 +805,7 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::PolymorphicInlin // as the allocation may trigger a GC which can clear the inline caches. FixedFieldInfo localFixedFieldInfoArray[Js::DynamicProfileInfo::maxPolymorphicInliningSize] = {}; +#if ENABLE_FIXED_FIELDS // For polymorphic field loads we only support fixed functions on prototypes. This helps keep the equivalence check helper simple. // Since all types in the polymorphic cache share the same prototype, it's enough to grab the fixed function from the prototype object. Js::Var fixedProperty = nullptr; @@ -815,12 +825,11 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::PolymorphicInlin // TODO (ObjTypeSpec): Enable constructor caches on equivalent polymorphic field loads with fixed functions. } - +#endif // Let's get the types. Js::Type* localTypes[MaxPolymorphicInlineCacheSize]; uint16 typeNumber = 0; - Js::JavascriptFunction* fixedFunctionObject = nullptr; for (uint16 i = firstNonEmptyCacheIndex; i < polyCacheSize; i++) { Js::InlineCache& inlineCache = inlineCaches[i]; @@ -830,8 +839,10 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::PolymorphicInlin inlineCache.IsProto() ? TypeWithoutAuxSlotTag(inlineCache.u.proto.type) : TypeWithoutAuxSlotTag(inlineCache.u.accessor.type); +#if ENABLE_FIXED_FIELDS if (gatherDataForInlining) { + Js::JavascriptFunction* fixedFunctionObject = nullptr; inlineCache.TryGetFixedMethodFromCache(functionBody, cacheId, &fixedFunctionObject); if (!fixedFunctionObject || !fixedFunctionObject->GetFunctionInfo()->HasBody()) { @@ -855,7 +866,7 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::PolymorphicInlin fixedFunctionCount++; } - +#endif typeNumber++; } @@ -911,7 +922,7 @@ ObjTypeSpecFldInfo* ObjTypeSpecFldInfo::CreateFrom(uint id, Js::PolymorphicInlin // Fixed field checks allow us to assume a specific type ID, but the assumption is only // valid if we lock the type. Otherwise, the type ID may change out from under us without // evolving the type. - if (Js::DynamicType::Is(localTypes[i]->GetTypeId())) + if (Js::DynamicType::Is(localTypes[i])) { Js::DynamicType *dynamicType = static_cast(localTypes[i]); if (!dynamicType->GetIsLocked()) diff --git a/deps/chakrashim/core/lib/Backend/Opnd.cpp b/deps/chakrashim/core/lib/Backend/Opnd.cpp index a63127e2d82..addf00afe22 100644 --- a/deps/chakrashim/core/lib/Backend/Opnd.cpp +++ b/deps/chakrashim/core/lib/Backend/Opnd.cpp @@ -103,12 +103,6 @@ Opnd::IsWriteBarrierTriggerableValue() return false; } - // If this operand is known address, then it doesn't need a write barrier, the address is either not a GC address or is pinned - if (this->IsAddrOpnd() && static_cast(this->AsAddrOpnd()->GetKind()) == AddrOpndKindDynamicVar) - { - return false; - } - if (TySize[this->GetType()] != sizeof(void*)) { return false; @@ -121,6 +115,12 @@ Opnd::IsWriteBarrierTriggerableValue() } #endif + // If this operand is known address, then it doesn't need a write barrier, the address is either not a GC address or is pinned + if (this->IsAddrOpnd() && this->AsAddrOpnd()->GetAddrOpndKind() == AddrOpndKindDynamicVar) + { + return false; + } + // If its null/boolean/undefined, we don't need a write barrier since the javascript library will keep those guys alive return !(this->GetValueType().IsBoolean() || this->GetValueType().IsNull() || this->GetValueType().IsUndefined()); } @@ -160,6 +160,9 @@ Opnd::CloneDef(Func *func) case OpndKindIndir: return static_cast(this)->CloneDefInternal(func); + case OpndKindList: + return static_cast(this)->CloneDefInternal(func); + default: return this->Copy(func); }; @@ -191,6 +194,9 @@ Opnd::CloneUse(Func *func) case OpndKindIndir: return static_cast(this)->CloneUseInternal(func); + case OpndKindList: + return static_cast(this)->CloneUseInternal(func); + default: return this->Copy(func); }; @@ -202,6 +208,8 @@ Opnd::CloneUse(Func *func) void Opnd::Free(Func *func) { + AssertMsg(!IsInUse(), "Attempting to free in use operand."); + switch (this->m_kind) { case OpndKindIntConst: @@ -249,6 +257,10 @@ void Opnd::Free(Func *func) static_cast(this)->FreeInternal(func); break; + case OpndKindList: + static_cast(this)->FreeInternal(func); + break; + case OpndKindMemRef: static_cast(this)->FreeInternal(func); break; @@ -314,6 +326,9 @@ bool Opnd::IsEqual(Opnd *opnd) case OpndKindIndir: return static_cast(this)->IsEqualInternal(opnd); + case OpndKindList: + return static_cast(this)->IsEqualInternal(opnd); + case OpndKindMemRef: return static_cast(this)->IsEqualInternal(opnd); @@ -374,6 +389,9 @@ Opnd * Opnd::Copy(Func *func) case OpndKindIndir: return static_cast(this)->CopyInternal(func); + case OpndKindList: + return static_cast(this)->CopyInternal(func); + case OpndKindMemRef: return static_cast(this)->CopyInternal(func); @@ -440,7 +458,7 @@ Opnd::GetImmediateValue(Func* func) } } -#if TARGET_32 && !defined(_M_IX86) +#if defined(_M_ARM) int32 Opnd::GetImmediateValueAsInt32(Func * func) { @@ -1091,25 +1109,23 @@ void RegOpnd::Initialize(StackSym *sym, RegNum reg, IRType type) ///---------------------------------------------------------------------------- RegOpnd * - RegOpnd::New(IRType type, Func *func) +RegOpnd::New(IRType type, Func *func) { return RegOpnd::New(StackSym::New(type, func), RegNOREG, type, func); } +IR::RegOpnd * +RegOpnd::New(RegNum reg, IRType type, Func *func) +{ + return RegOpnd::New(StackSym::New(type, func), reg, type, func); +} + RegOpnd * RegOpnd::New(StackSym *sym, IRType type, Func *func) { return RegOpnd::New(sym, RegNOREG, type, func); } -///---------------------------------------------------------------------------- -/// -/// RegOpnd::New -/// -/// Creates a new RegOpnd. -/// -///---------------------------------------------------------------------------- - RegOpnd * RegOpnd::New(StackSym *sym, RegNum reg, IRType type, Func *func) { @@ -1614,7 +1630,7 @@ void Int64ConstOpnd::FreeInternal(Func * func) ///---------------------------------------------------------------------------- RegBVOpnd * -RegBVOpnd::New(BVUnit32 value, IRType type, Func *func) +RegBVOpnd::New(BVUnit value, IRType type, Func *func) { RegBVOpnd * regBVOpnd; @@ -2286,6 +2302,110 @@ AddrOpnd::SetAddress(Js::Var address, AddrOpndKind addrOpndKind) this->addrOpndKind = addrOpndKind; } +///---------------------------------------------------------------------------- +/// +/// ListOpnd +/// +/// ListOpnd API +/// +///---------------------------------------------------------------------------- + +ListOpnd * +ListOpnd::New(Func *func, __in_ecount(count) ListOpndType** opnds, int count) +{ + return JitAnew(func->m_alloc, ListOpnd, func, opnds, count); +} + +ListOpnd::~ListOpnd() +{ + Func* func = this->m_func; + for (int i = 0; i < Count(); ++i) + { + Item(i)->UnUse(); + Item(i)->Free(func); + } + JitAdeleteArray(func->m_alloc, count, opnds); +} + +ListOpnd::ListOpnd(Func* func, __in_ecount(_count) ListOpndType** _opnds, int _count): + Opnd(), m_func(func), count(_count) +{ + AssertOrFailFast(count > 0); + Assert(func->isPostLower || func->IsInPhase(Js::LowererPhase)); + m_kind = OpndKindList; + m_type = TyMisc; + + opnds = JitAnewArray(func->m_alloc, ListOpndType*, count); + for (int i = 0; i < count; ++i) + { + opnds[i] = _opnds[i]->Use(func)->AsRegOpnd(); + } +} + +void ListOpnd::FreeInternal(Func * func) +{ + Assert(m_kind == OpndKindList); + JitAdelete(func->m_alloc, this); +} + +bool ListOpnd::IsEqualInternal(Opnd * opnd) +{ + Assert(m_kind == OpndKindList); + if (!opnd->IsListOpnd()) + { + return false; + } + ListOpnd* l2 = opnd->AsListOpnd(); + if (l2->Count() != Count()) + { + return false; + } + for (int i = 0; i < Count(); ++i) + { + if (!Item(i)->IsEqual(l2->Item(i))) + { + return false; + } + } + return true; +} + +Opnd * ListOpnd::CloneUseInternal(Func * func) +{ + Assert(m_kind == OpndKindList); + int count = Count(); + ListOpndType** opnds = JitAnewArray(func->m_alloc, ListOpndType*, count); + for (int i = 0; i < count; ++i) + { + ListOpndType* newOpnd = Item(i)->CloneUse(func)->AsRegOpnd(); + opnds[i] = newOpnd; + } + ListOpnd* newList = ListOpnd::New(func, opnds, count); + JitAdeleteArray(func->m_alloc, count, opnds); + return newList; +} + +Opnd * ListOpnd::CloneDefInternal(Func * func) +{ + Assert(m_kind == OpndKindList); + int count = Count(); + ListOpndType** opnds = JitAnewArray(func->m_alloc, RegOpnd*, count); + for (int i = 0; i < count; ++i) + { + ListOpndType* newOpnd = Item(i)->CloneDef(func)->AsRegOpnd(); + opnds[i] = newOpnd; + } + ListOpnd* newList = ListOpnd::New(func, opnds, count); + JitAdeleteArray(func->m_alloc, count, opnds); + return newList; +} + +Opnd * ListOpnd::CopyInternal(Func * func) +{ + Assert(m_kind == OpndKindList); + return ListOpnd::New(func, opnds, Count()); +} + ///---------------------------------------------------------------------------- /// /// IndirOpnd::New @@ -2412,10 +2532,12 @@ IndirOpnd::~IndirOpnd() { if (m_baseOpnd != nullptr) { + m_baseOpnd->UnUse(); m_baseOpnd->Free(m_func); } if (m_indexOpnd != nullptr) { + m_indexOpnd->UnUse(); m_indexOpnd->Free(m_func); } } @@ -2904,7 +3026,7 @@ Opnd::DumpAddress(void *address, bool printToConsole, bool skipMaskedAddress) } else { -#ifdef _M_X64 +#ifdef TARGET_64 Output::Print(_u("0x%012I64X"), address); #else Output::Print(_u("0x%08X"), address); @@ -3325,6 +3447,22 @@ Opnd::Dump(IRDumpFlags flags, Func *func) Output::Print(_u("]")); break; } + case IR::OpndKindList: + { + IR::ListOpnd* list = this->AsListOpnd(); + Output::Print(_u("{")); + int count = list->Count(); + list->Map([flags, func, count](int i, IR::Opnd* opnd) + { + opnd->Dump(flags, func); + if (i + 1 < count) + { + Output::Print(_u(",")); + } + }); + Output::Print(_u("}")); + break; + } case OpndKindMemRef: { DumpOpndKindMemRef(AsmDumpMode, func); @@ -3436,7 +3574,7 @@ Opnd::GetAddrDescription(__out_ecount(count) char16 *const description, const si { case IR::AddrOpndKindConstantAddress: { -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 char16 const * format = _u("0x%012I64X"); #else char16 const * format = _u("0x%08X"); @@ -3447,7 +3585,7 @@ Opnd::GetAddrDescription(__out_ecount(count) char16 *const description, const si case IR::AddrOpndKindDynamicVar: if (Js::TaggedInt::Is(address)) { -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 char16 const * format = _u("0x%012I64X (value: %d)"); #else char16 const * format = _u("0x%08X (value: %d)"); @@ -3507,7 +3645,7 @@ Opnd::GetAddrDescription(__out_ecount(count) char16 *const description, const si break; case IR::AddrOpndKindConstantVar: { -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 char16 const * format = _u("0x%012I64X%s"); #else char16 const * format = _u("0x%08X%s"); diff --git a/deps/chakrashim/core/lib/Backend/Opnd.h b/deps/chakrashim/core/lib/Backend/Opnd.h index bb7a82eac3e..123040f4d43 100644 --- a/deps/chakrashim/core/lib/Backend/Opnd.h +++ b/deps/chakrashim/core/lib/Backend/Opnd.h @@ -20,6 +20,7 @@ class PropertySymOpnd; class RegOpnd; class ArrayRegOpnd; class AddrOpnd; +class ListOpnd; class IndirOpnd; class LabelOpnd; class MemRefOpnd; @@ -39,7 +40,8 @@ enum OpndKind : BYTE { OpndKindIndir, OpndKindLabel, OpndKindMemRef, - OpndKindRegBV + OpndKindRegBV, + OpndKindList }; enum AddrOpndKind : BYTE { @@ -189,6 +191,9 @@ class Opnd bool IsAddrOpnd() const; AddrOpnd * AsAddrOpnd(); const AddrOpnd * AsAddrOpnd() const; + bool IsListOpnd() const; + ListOpnd * AsListOpnd(); + const ListOpnd * AsListOpnd() const; bool IsIndirOpnd() const; IndirOpnd * AsIndirOpnd(); const IndirOpnd * AsIndirOpnd() const; @@ -223,6 +228,7 @@ class Opnd bool IsInt64() const { return IRType_IsInt64(this->m_type); } bool IsInt32() const { return this->m_type == TyInt32; } bool IsUInt32() const { return this->m_type == TyUint32; } + bool IsIntegral32() const { return IsInt32() || IsUInt32(); } bool IsFloat32() const { return this->m_type == TyFloat32; } bool IsFloat64() const { return this->m_type == TyFloat64; } bool IsFloat() const { return this->IsFloat32() || this->IsFloat64(); } @@ -238,6 +244,7 @@ class Opnd bool IsSimd128B8() const { return this->m_type == TySimd128B8; } bool IsSimd128B16() const { return this->m_type == TySimd128B16; } bool IsSimd128D2() const { return this->m_type == TySimd128D2; } + bool IsSimd128I2() const { return this->m_type == TySimd128I2; } bool IsVar() const { return this->m_type == TyVar; } bool IsTaggedInt() const; bool IsTaggedValue() const; @@ -248,7 +255,7 @@ class Opnd void SetIsDead(const bool isDead = true) { this->m_isDead = isDead; } bool GetIsDead() { return this->m_isDead; } int64 GetImmediateValue(Func * func); -#if TARGET_32 && !defined(_M_IX86) +#if defined(_M_ARM) // Helper for 32bits systems without int64 const operand support int32 GetImmediateValueAsInt32(Func * func); #endif @@ -1275,6 +1282,7 @@ class RegOpnd : public Opnd public: static RegOpnd * New(IRType type, Func *func); + static RegOpnd * New(RegNum reg, IRType type, Func *func); static RegOpnd * New(StackSym *sym, IRType type, Func *func); static RegOpnd * New(StackSym *sym, RegNum reg, IRType type, Func *func); @@ -1466,6 +1474,103 @@ class AddrOpnd sealed : public Opnd #endif }; +typedef RegOpnd ListOpndType; +class ListOpnd : public Opnd +{ + template + struct ListOpndInit + { + static constexpr int length = sizeof...(T); + ListOpndInit(T...rest) + { + insert(0, rest...); + } + ListOpndType* values[length]; + private: + template + void insert(int index, K1 arg, K... rest) + { + values[index] = arg; + insert(index + 1, rest...); + } + template + void insert(int index, K last) + { + values[index] = last; + } + }; +public: + ~ListOpnd(); + static ListOpnd* New(Func *func, __in_ecount(count) ListOpndType** opnds, DECLSPEC_GUARD_OVERFLOW int count); + template + static ListOpnd* New(Func *func, T... opnds) + { + auto a = ListOpndInit{ opnds... }; + return ListOpnd::New(func, a.values, a.length); + } + +public: + void FreeInternal(Func* func); + bool IsEqualInternal(Opnd* opnd); + Opnd* CloneUseInternal(Func* func); + Opnd* CloneDefInternal(Func* func); + Opnd* CopyInternal(Func* func); + + int Count() const { return count; } + ListOpndType* Item(int i) const { Assert(i < count); return opnds[i]; } + template bool Any(TConditionalFunction function) + { + for (int i = 0; i < count; ++i) + { + if (function(this->opnds[i])) + { + return true; + } + } + return false; + } + template bool All(TConditionalFunction function) + { + for (int i = 0; i < count; ++i) + { + if (!function(this->opnds[i])) + { + return false; + } + } + return true; + } + template void Map(TConditionalFunction function) + { + for (int i = 0; i < count; ++i) + { + function(i, this->opnds[i]); + } + } + template + Result Reduce(Selector sel, Aggregator agg, Result init) + { + Result result = init; + for (int i = 0; i < count; ++i) + { + result = agg( + i, + sel(i, this->opnds[i]), + result + ); + } + return result; + } + +private: + ListOpnd(Func* func, __in_ecount(count) ListOpndType** opnds, DECLSPEC_GUARD_OVERFLOW int count); + +private: + int count; + ListOpndType** opnds; + Func* m_func; // We need the allocator to copy/free the individual Opnd +}; + ///--------------------------------------------------------------------------- /// /// class IndirOpnd @@ -1606,16 +1711,16 @@ class LabelOpnd : public Opnd class RegBVOpnd: public Opnd { public: - static RegBVOpnd * New(BVUnit32 value, IRType type, Func *func); + static RegBVOpnd * New(BVUnit value, IRType type, Func *func); public: //Note: type: OpndKindRegBV RegBVOpnd * CopyInternal(Func *func); bool IsEqualInternal(Opnd *opnd); void FreeInternal(Func * func); - BVUnit32 GetValue() const; + BVUnit GetValue() const; public: - BVUnit32 m_value; + BVUnit m_value; }; class AutoReuseOpnd @@ -1671,14 +1776,12 @@ class AutoReuseOpnd { return; } + + opnd->UnUse(); if(autoDelete) { opnd->Free(func); } - else - { - opnd->UnUse(); - } } PREVENT_COPY(AutoReuseOpnd) diff --git a/deps/chakrashim/core/lib/Backend/Opnd.inl b/deps/chakrashim/core/lib/Backend/Opnd.inl index 5bef6723c1e..4926074fc32 100644 --- a/deps/chakrashim/core/lib/Backend/Opnd.inl +++ b/deps/chakrashim/core/lib/Backend/Opnd.inl @@ -408,6 +408,28 @@ Opnd::AsAddrOpnd() const return reinterpret_cast(this); } +inline bool +Opnd::IsListOpnd() const +{ + return GetKind() == OpndKindList; +} + +inline ListOpnd * +Opnd::AsListOpnd() +{ + AssertMsg(this->IsListOpnd(), "Bad call to AsListOpnd()"); + + return static_cast(this); +} + +inline const ListOpnd * +Opnd::AsListOpnd() const +{ + AssertMsg(this->IsListOpnd(), "Bad call to AsListOpnd() const"); + + return static_cast(this); +} + ///---------------------------------------------------------------------------- /// /// Opnd::IsIndirOpnd @@ -713,7 +735,7 @@ LabelOpnd::SetLabel(LabelInstr * labelInstr) m_label = labelInstr; } -inline BVUnit32 +inline BVUnit RegBVOpnd::GetValue() const { return m_value; diff --git a/deps/chakrashim/core/lib/Backend/PDataManager.cpp b/deps/chakrashim/core/lib/Backend/PDataManager.cpp index bfc7fe28757..4624f3644fc 100644 --- a/deps/chakrashim/core/lib/Backend/PDataManager.cpp +++ b/deps/chakrashim/core/lib/Backend/PDataManager.cpp @@ -4,7 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "Backend.h" -// Conditionally-compiled on x64 and arm +// Conditionally-compiled on x64 and arm/arm64 #if PDATA_ENABLED #ifdef _WIN32 @@ -45,6 +45,7 @@ void PDataManager::UnregisterPdata(RUNTIME_FUNCTION* pdata) { if (AutoSystemInfo::Data.IsWin8OrLater()) { + // TODO: need to move to background? NtdllLibrary::Instance->DeleteGrowableFunctionTable(pdata); } else diff --git a/deps/chakrashim/core/lib/Backend/Peeps.cpp b/deps/chakrashim/core/lib/Backend/Peeps.cpp index 0dfc62d3189..2045837182c 100644 --- a/deps/chakrashim/core/lib/Backend/Peeps.cpp +++ b/deps/chakrashim/core/lib/Backend/Peeps.cpp @@ -1049,6 +1049,7 @@ Peeps::PeepRedundant(IR::Instr *instr) // remove instruction retInstr = instr->m_next; instr->Remove(); + return retInstr; } } #if _M_IX86 diff --git a/deps/chakrashim/core/lib/Backend/PreLowerPeeps.cpp b/deps/chakrashim/core/lib/Backend/PreLowerPeeps.cpp index 1e3ed5caab1..378b91880c9 100644 --- a/deps/chakrashim/core/lib/Backend/PreLowerPeeps.cpp +++ b/deps/chakrashim/core/lib/Backend/PreLowerPeeps.cpp @@ -115,7 +115,7 @@ Lowerer::TryShiftAdd(IR::Instr *instrAdd, IR::Opnd * opndFold, IR::Opnd * opndAd { return instrAdd; } - if (instrIter->FindRegUse(foldSym)) + if (instrIter->HasSymUse(foldSym)) { return instrAdd; } @@ -250,7 +250,7 @@ IR::Instr *Lowerer::PeepShl(IR::Instr *instrShl) { return instrShl; } - if (instrIter->FindRegUse(src1->AsRegOpnd()->m_sym)) + if (instrIter->HasSymUse(src1->AsRegOpnd()->m_sym)) { return instrShl; } diff --git a/deps/chakrashim/core/lib/Backend/PropertyGuard.h b/deps/chakrashim/core/lib/Backend/PropertyGuard.h new file mode 100644 index 00000000000..1ac05b16576 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/PropertyGuard.h @@ -0,0 +1,232 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +#if ENABLE_NATIVE_CODEGEN +namespace Js +{ + +class PropertyGuard +{ + friend class PropertyGuardValidator; + +private: + Field(intptr_t) value; // value is address of Js::Type +#if DBG + Field(bool) wasReincarnated = false; +#endif +public: + static PropertyGuard* New(Recycler* recycler) { return RecyclerNewLeaf(recycler, Js::PropertyGuard); } + PropertyGuard() : value(GuardValue::Uninitialized) {} + PropertyGuard(intptr_t value) : value(value) + { + // GuardValue::Invalidated and GuardValue::Invalidated_DuringSweeping can only be set using + // Invalidate() and InvalidatedDuringSweep() methods respectively. + Assert(this->value != GuardValue::Invalidated && this->value != GuardValue::Invalidated_DuringSweep); + } + + inline static size_t const GetSizeOfValue() { return sizeof(((PropertyGuard*)0)->value); } + inline static size_t const GetOffsetOfValue() { return offsetof(PropertyGuard, value); } + + intptr_t GetValue() const { return this->value; } + bool IsValid() + { + return this->value != GuardValue::Invalidated && this->value != GuardValue::Invalidated_DuringSweep; + } + bool IsInvalidatedDuringSweep() { return this->value == GuardValue::Invalidated_DuringSweep; } + void SetValue(intptr_t value) + { + // GuardValue::Invalidated and GuardValue::Invalidated_DuringSweeping can only be set using + // Invalidate() and InvalidatedDuringSweep() methods respectively. + Assert(value != GuardValue::Invalidated && value != GuardValue::Invalidated_DuringSweep); + this->value = value; + } + intptr_t const* GetAddressOfValue() { return &this->value; } + void Invalidate() { this->value = GuardValue::Invalidated; } + void InvalidateDuringSweep() + { +#if DBG + wasReincarnated = true; +#endif + this->value = GuardValue::Invalidated_DuringSweep; + } +#if DBG + bool WasReincarnated() { return this->wasReincarnated; } +#endif + enum GuardValue : intptr_t + { + Invalidated = 0, + Uninitialized = 1, + Invalidated_DuringSweep = 2 + }; +}; + +class PropertyGuardValidator +{ + // Required by EquivalentTypeGuard::SetType. + CompileAssert(offsetof(PropertyGuard, value) == 0); + // CompileAssert(offsetof(ConstructorCache, guard.value) == offsetof(PropertyGuard, value)); +}; + +class JitIndexedPropertyGuard : public Js::PropertyGuard +{ +private: + int index; + +public: + JitIndexedPropertyGuard(intptr_t value, int index) : + Js::PropertyGuard(value), index(index) {} + + int GetIndex() const { return this->index; } +}; + +class JitTypePropertyGuard : public Js::JitIndexedPropertyGuard +{ +public: + JitTypePropertyGuard(intptr_t typeAddr, int index) : + JitIndexedPropertyGuard(typeAddr, index) {} + + intptr_t GetTypeAddr() const { return this->GetValue(); } + +}; + +struct TypeGuardTransferEntry +{ + PropertyId propertyId; + JitIndexedPropertyGuard* guards[0]; + + TypeGuardTransferEntry() : propertyId(Js::Constants::NoProperty) {} +}; + +class FakePropertyGuardWeakReference : public RecyclerWeakReference +{ +public: + static FakePropertyGuardWeakReference* New(Recycler* recycler, Js::PropertyGuard* guard) + { + Assert(guard != nullptr); + return RecyclerNewLeaf(recycler, Js::FakePropertyGuardWeakReference, guard); + } + FakePropertyGuardWeakReference(const Js::PropertyGuard* guard) + { + this->strongRef = (char*)guard; + this->strongRefHeapBlock = &CollectedRecyclerWeakRefHeapBlock::Instance; + } + + void Zero() + { + Assert(this->strongRef != nullptr); + this->strongRef = nullptr; + } +}; + +struct CtorCacheGuardTransferEntry +{ + PropertyId propertyId; + intptr_t caches[0]; + + CtorCacheGuardTransferEntry() : propertyId(Js::Constants::NoProperty) {} +}; + +struct PropertyEquivalenceInfo +{ + PropertyIndex slotIndex; + bool isAuxSlot; + bool isWritable; + + PropertyEquivalenceInfo() : + slotIndex(Constants::NoSlot), isAuxSlot(false), isWritable(false) {} + PropertyEquivalenceInfo(PropertyIndex slotIndex, bool isAuxSlot, bool isWritable) : + slotIndex(slotIndex), isAuxSlot(isAuxSlot), isWritable(isWritable) {} +}; + +struct EquivalentPropertyEntry +{ + Js::PropertyId propertyId; + Js::PropertyIndex slotIndex; + bool isAuxSlot; + bool mustBeWritable; +}; + +struct TypeEquivalenceRecord +{ + uint propertyCount; + EquivalentPropertyEntry* properties; +}; + +struct EquivalentTypeCache +{ + Js::Type* types[EQUIVALENT_TYPE_CACHE_SIZE]; + PropertyGuard *guard; + TypeEquivalenceRecord record; + uint nextEvictionVictim; + bool isLoadedFromProto; + bool hasFixedValue; + + EquivalentTypeCache() : nextEvictionVictim(EQUIVALENT_TYPE_CACHE_SIZE) {} + bool ClearUnusedTypes(Recycler *recycler); + void SetGuard(PropertyGuard *theGuard) { this->guard = theGuard; } + void SetIsLoadedFromProto() { this->isLoadedFromProto = true; } + bool IsLoadedFromProto() const { return this->isLoadedFromProto; } + void SetHasFixedValue() { this->hasFixedValue = true; } + bool HasFixedValue() const { return this->hasFixedValue; } +}; + +class JitEquivalentTypeGuard : public JitIndexedPropertyGuard +{ + // This pointer is allocated from background thread first, and then transferred to recycler, + // so as to keep the cached types alive. + EquivalentTypeCache* cache; + uint32 objTypeSpecFldId; + // TODO: OOP JIT, reenable these asserts +#if DBG && 0 + // Intentionally have as intptr_t so this guard doesn't hold scriptContext + intptr_t originalScriptContextValue = 0; +#endif + +public: + JitEquivalentTypeGuard(intptr_t typeAddr, int index, uint32 objTypeSpecFldId) : + JitIndexedPropertyGuard(typeAddr, index), cache(nullptr), objTypeSpecFldId(objTypeSpecFldId) + { +#if DBG && 0 + originalScriptContextValue = reinterpret_cast(type->GetScriptContext()); +#endif + } + + intptr_t GetTypeAddr() const { return this->GetValue(); } + + void SetTypeAddr(const intptr_t typeAddr) + { +#if DBG && 0 + if (originalScriptContextValue == 0) + { + originalScriptContextValue = reinterpret_cast(type->GetScriptContext()); + } + else + { + AssertMsg(originalScriptContextValue == reinterpret_cast(type->GetScriptContext()), "Trying to set guard type from different script context."); + } +#endif + this->SetValue(typeAddr); + } + + uint32 GetObjTypeSpecFldId() const + { + return this->objTypeSpecFldId; + } + + Js::EquivalentTypeCache* GetCache() const + { + return this->cache; + } + + void SetCache(Js::EquivalentTypeCache* cache) + { + this->cache = cache; + } +}; + + +}; +#endif // ENABLE_NATIVE_CODEGEN \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/SccLiveness.cpp b/deps/chakrashim/core/lib/Backend/SccLiveness.cpp index 5666ccee1d5..43373bb57e7 100644 --- a/deps/chakrashim/core/lib/Backend/SccLiveness.cpp +++ b/deps/chakrashim/core/lib/Backend/SccLiveness.cpp @@ -46,44 +46,6 @@ SCCLiveness::Build() IR::Opnd *dst, *src1, *src2; uint32 instrNum = instr->GetNumber(); - // End of loop? - if (this->curLoop && instrNum >= this->curLoop->regAlloc.loopEnd) - { - AssertMsg(this->loopNest > 0, "Loop nest is messed up"); - AssertMsg(instr->IsBranchInstr(), "Loop tail should be a branchInstr"); - AssertMsg(instr->AsBranchInstr()->IsLoopTail(this->func), "Loop tail not marked correctly"); - - Loop *loop = this->curLoop; - while (loop && loop->regAlloc.loopEnd == this->curLoop->regAlloc.loopEnd) - { - FOREACH_SLIST_ENTRY(Lifetime *, lifetime, loop->regAlloc.extendedLifetime) - { - if (loop->regAlloc.hasNonOpHelperCall) - { - lifetime->isLiveAcrossUserCalls = true; - } - if (loop->regAlloc.hasCall) - { - lifetime->isLiveAcrossCalls = true; - } - if (lifetime->end == loop->regAlloc.loopEnd) - { - lifetime->totalOpHelperLengthByEnd = this->totalOpHelperFullVisitedLength + CurrentOpHelperVisitedLength(instr); - } - } - NEXT_SLIST_ENTRY; - - loop->regAlloc.helperLength = this->totalOpHelperFullVisitedLength + CurrentOpHelperVisitedLength(instr); - Assert(!loop->parent || loop->parent && loop->parent->regAlloc.loopEnd >= loop->regAlloc.loopEnd); - loop = loop->parent; - } - while (this->curLoop && instrNum >= this->curLoop->regAlloc.loopEnd) - { - this->curLoop = this->curLoop->parent; - this->loopNest--; - } - } - if (instr->HasBailOutInfo()) { // At this point, the bailout should be lowered to a CALL to BailOut @@ -125,6 +87,44 @@ SCCLiveness::Build() } } + // End of loop? + if (this->curLoop && instrNum >= this->curLoop->regAlloc.loopEnd) + { + AssertMsg(this->loopNest > 0, "Loop nest is messed up"); + AssertMsg(instr->IsBranchInstr(), "Loop tail should be a branchInstr"); + AssertMsg(instr->AsBranchInstr()->IsLoopTail(this->func), "Loop tail not marked correctly"); + + Loop *loop = this->curLoop; + while (loop && loop->regAlloc.loopEnd == this->curLoop->regAlloc.loopEnd) + { + FOREACH_SLIST_ENTRY(Lifetime *, lifetime, loop->regAlloc.extendedLifetime) + { + if (loop->regAlloc.hasNonOpHelperCall) + { + lifetime->isLiveAcrossUserCalls = true; + } + if (loop->regAlloc.hasCall) + { + lifetime->isLiveAcrossCalls = true; + } + if (lifetime->end == loop->regAlloc.loopEnd) + { + lifetime->totalOpHelperLengthByEnd = this->totalOpHelperFullVisitedLength + CurrentOpHelperVisitedLength(instr); + } + } + NEXT_SLIST_ENTRY; + + loop->regAlloc.helperLength = this->totalOpHelperFullVisitedLength + CurrentOpHelperVisitedLength(instr); + Assert(!loop->parent || loop->parent && loop->parent->regAlloc.loopEnd >= loop->regAlloc.loopEnd); + loop = loop->parent; + } + while (this->curLoop && instrNum >= this->curLoop->regAlloc.loopEnd) + { + this->curLoop = this->curLoop->parent; + this->loopNest--; + } + } + // Keep track of the last call instruction number to find out whether a lifetime crosses a call // Do not count call to bailout which exits anyways if (LowererMD::IsCall(instr) && !instr->HasBailOutInfo()) @@ -383,6 +383,10 @@ SCCLiveness::ProcessSrc(IR::Opnd *src, IR::Instr *instr) } } } + else if (src->IsListOpnd()) + { + src->AsListOpnd()->Map([&](int i, IR::Opnd* opnd) { this->ProcessSrc(opnd, instr); }); + } else if (!this->lastCall && src->IsSymOpnd() && src->AsSymOpnd()->m_sym->AsStackSym()->IsParamSlotSym()) { IR::SymOpnd *symOpnd = src->AsSymOpnd(); @@ -398,6 +402,7 @@ SCCLiveness::ProcessSrc(IR::Opnd *src, IR::Instr *instr) lifetime = this->InsertLifetime(stackSym, reg, this->func->m_headInstr->m_next); lifetime->region = this->curRegion; lifetime->isFloat = symOpnd->IsFloat() || symOpnd->IsSimd128(); + } IR::RegOpnd * newRegOpnd = IR::RegOpnd::New(stackSym, reg, symOpnd->GetType(), this->func); @@ -440,6 +445,10 @@ SCCLiveness::ProcessDst(IR::Opnd *dst, IR::Instr *instr) { this->ProcessRegDef(dst->AsRegOpnd(), instr); } + else if (dst->IsListOpnd()) + { + dst->AsListOpnd()->Map([&](int i, IR::Opnd* opnd) { this->ProcessDst(opnd, instr); }); + } } void @@ -697,7 +706,12 @@ SCCLiveness::ExtendLifetime(Lifetime *lifetime, IR::Instr *instr) } NEXT_SLISTBASE_ENTRY } +#if _M_ARM64 + // The case of equality is valid on Arm64 where some branch instructions have sources. + AssertMsg(lifetime->end >= instr->GetNumber(), "Lifetime end not set correctly"); +#else AssertMsg(lifetime->end > instr->GetNumber(), "Lifetime end not set correctly"); +#endif } this->extendedLifetimesLoopList->Clear(this->tempAlloc); } @@ -709,7 +723,7 @@ Lifetime * SCCLiveness::InsertLifetime(StackSym *stackSym, RegNum reg, IR::Instr *const currentInstr) { const uint start = currentInstr->GetNumber(), end = start; - Lifetime * newLlifetime = JitAnew(tempAlloc, Lifetime, tempAlloc, stackSym, reg, start, end, this->func); + Lifetime * newLlifetime = JitAnew(tempAlloc, Lifetime, tempAlloc, stackSym, reg, start, end); newLlifetime->totalOpHelperLengthByEnd = this->totalOpHelperFullVisitedLength + CurrentOpHelperVisitedLength(currentInstr); // Find insertion point @@ -740,8 +754,8 @@ SCCLiveness::InsertLifetime(StackSym *stackSym, RegNum reg, IR::Instr *const cur bool SCCLiveness::FoldIndir(IR::Instr *instr, IR::Opnd *opnd) { -#ifdef _M_ARM - // Can't be folded on ARM +#ifdef _M_ARM32_OR_ARM64 + // Can't be folded on ARM or ARM64 return false; #else IR::IndirOpnd *indir = opnd->AsIndirOpnd(); diff --git a/deps/chakrashim/core/lib/Backend/Security.cpp b/deps/chakrashim/core/lib/Backend/Security.cpp index 0475da85b34..2fb85cd48ef 100644 --- a/deps/chakrashim/core/lib/Backend/Security.cpp +++ b/deps/chakrashim/core/lib/Backend/Security.cpp @@ -269,8 +269,12 @@ Security::InsertSmallNOP(IR::Instr * instr, DWORD nopSize) } instr->InsertBefore(nopInstr); -#else - AssertMsg(false, "Unimplemented"); +#elif defined(_M_ARM64) + + // All ARM64 instructions are 4 bytes. + IR::Instr *nopInstr = IR::Instr::New(Js::OpCode::NOP, instr->m_func); + instr->InsertBefore(nopInstr); + #endif } @@ -298,6 +302,12 @@ Security::DontEncode(IR::Opnd *opnd) IR::IndirOpnd *indirOpnd = opnd->AsIndirOpnd(); return indirOpnd->m_dontEncode || indirOpnd->GetOffset() == 0; } + case IR::OpndKindList: + { + // We should only have RegOpnd in the ListOpnd therefore, we don't need to encode anything + Assert(opnd->AsListOpnd()->All([](IR::ListOpndType* opnd) { return DontEncode(opnd); })); + return true; + } case IR::OpndKindInt64Const: return false; default: @@ -521,7 +531,7 @@ Security::EncodeValue(IR::Instr * instr, IR::Opnd *opnd, IntConstType constValue ) { IR::RegOpnd *regOpnd = IR::RegOpnd::New(StackSym::New(opnd->GetType(), instr->m_func), opnd->GetType(), instr->m_func); - IR::Instr * instrNew = LowererMD::CreateAssign(regOpnd, opnd, instr); + IR::Instr * instrNew = Lowerer::InsertMove(regOpnd, opnd, instr); IR::IntConstOpnd * cookieOpnd = BuildCookieOpnd(opnd->GetType(), instr->m_func); instrNew = IR::Instr::New(LowererMD::MDXorOpcode, regOpnd, regOpnd, cookieOpnd, instr->m_func); instr->InsertBefore(instrNew); @@ -542,7 +552,7 @@ Security::EncodeValue(IR::Instr * instr, IR::Opnd *opnd, IntConstType constValue else if (opnd->GetType() == TyUint32 || opnd->GetType() == TyUint16 || opnd->GetType() == TyUint8) { IR::RegOpnd *regOpnd = IR::RegOpnd::New(StackSym::New(opnd->GetType(), instr->m_func), opnd->GetType(), instr->m_func); - IR::Instr * instrNew = LowererMD::CreateAssign(regOpnd, opnd, instr); + IR::Instr * instrNew = Lowerer::InsertMove(regOpnd, opnd, instr); IR::IntConstOpnd * cookieOpnd = BuildCookieOpnd(opnd->GetType(), instr->m_func); @@ -582,7 +592,7 @@ Security::EncodeAddress(IR::Instr * instr, IR::Opnd *opnd, size_t value, _Out_ I IR::Instr *instrNew = nullptr; IR::RegOpnd *regOpnd = IR::RegOpnd::New(TyMachReg, instr->m_func); - instrNew = LowererMD::CreateAssign(regOpnd, opnd, instr); + instrNew = Lowerer::InsertMove(regOpnd, opnd, instr); IR::IntConstOpnd *cookieOpnd = BuildCookieOpnd(TyMachReg, instr->m_func); instrNew = IR::Instr::New(LowererMD::MDXorOpcode, regOpnd, regOpnd, cookieOpnd, instr->m_func); diff --git a/deps/chakrashim/core/lib/Backend/Security.h b/deps/chakrashim/core/lib/Backend/Security.h index 56472f79a82..1ecfd834550 100644 --- a/deps/chakrashim/core/lib/Backend/Security.h +++ b/deps/chakrashim/core/lib/Backend/Security.h @@ -23,7 +23,7 @@ class Security private: bool EncodeOpnd(IR::Instr *instr, IR::Opnd *opnd); - uint CalculateConstSize(IR::Opnd *opnd); + static uint CalculateConstSize(IR::Opnd *opnd); IntConstType EncodeValue(IR::Instr *instr, IR::Opnd *opnd, IntConstType constValue, _Out_ IR::RegOpnd ** pNewOpnd); #if TARGET_64 size_t EncodeAddress(IR::Instr *instr, IR::Opnd *opnd, size_t value, _Out_ IR::RegOpnd **pNewOpnd); diff --git a/deps/chakrashim/core/lib/Backend/ServerScriptContext.cpp b/deps/chakrashim/core/lib/Backend/ServerScriptContext.cpp index 674df524dad..c5365a26956 100644 --- a/deps/chakrashim/core/lib/Backend/ServerScriptContext.cpp +++ b/deps/chakrashim/core/lib/Backend/ServerScriptContext.cpp @@ -271,6 +271,7 @@ ServerScriptContext::IsPRNGSeeded() const return m_isPRNGSeeded; } +#ifdef ENABLE_SCRIPT_DEBUGGING intptr_t ServerScriptContext::GetDebuggingFlagsAddr() const { @@ -294,6 +295,13 @@ ServerScriptContext::GetDebugScriptIdWhenSetAddr() const { return static_cast(m_contextData.debugScriptIdWhenSetAddr); } +#endif + +intptr_t +ServerScriptContext::GetChakraLibAddr() const +{ + return m_contextData.chakraLibAddr; +} bool ServerScriptContext::IsClosed() const diff --git a/deps/chakrashim/core/lib/Backend/ServerScriptContext.h b/deps/chakrashim/core/lib/Backend/ServerScriptContext.h index 18736cfd77e..926ff9d9384 100644 --- a/deps/chakrashim/core/lib/Backend/ServerScriptContext.h +++ b/deps/chakrashim/core/lib/Backend/ServerScriptContext.h @@ -54,10 +54,14 @@ class ServerScriptContext : public ScriptContextInfo virtual bool IsClosed() const override; virtual intptr_t GetBuiltinFunctionsBaseAddr() const override; +#ifdef ENABLE_SCRIPT_DEBUGGING virtual intptr_t GetDebuggingFlagsAddr() const override; virtual intptr_t GetDebugStepTypeAddr() const override; virtual intptr_t GetDebugFrameAddressAddr() const override; virtual intptr_t GetDebugScriptIdWhenSetAddr() const override; +#endif + + virtual intptr_t GetChakraLibAddr() const override; virtual intptr_t GetAddr() const override; diff --git a/deps/chakrashim/core/lib/Backend/ServerThreadContext.cpp b/deps/chakrashim/core/lib/Backend/ServerThreadContext.cpp index cd67bf2a1da..da3e757f559 100644 --- a/deps/chakrashim/core/lib/Backend/ServerThreadContext.cpp +++ b/deps/chakrashim/core/lib/Backend/ServerThreadContext.cpp @@ -8,29 +8,28 @@ #if ENABLE_OOP_NATIVE_CODEGEN #include "JITServer/JITServer.h" -ServerThreadContext::ServerThreadContext(ThreadContextDataIDL * data, HANDLE processHandle) : - m_autoProcessHandle(processHandle), - m_processHandle(processHandle), +ServerThreadContext::ServerThreadContext(ThreadContextDataIDL* data, ProcessContext* processContext) : m_threadContextData(*data), m_refCount(0), m_numericPropertyBV(nullptr), - m_preReservedSectionAllocator(processHandle), - m_sectionAllocator(processHandle), - m_thunkPageAllocators(nullptr, /* allocXData */ false, &m_sectionAllocator, nullptr, processHandle), - m_codePageAllocators(nullptr, ALLOC_XDATA, &m_sectionAllocator, &m_preReservedSectionAllocator, processHandle), -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) - m_jitThunkEmitter(this, &m_sectionAllocator, processHandle), + m_preReservedSectionAllocator(processContext->processHandle), + m_sectionAllocator(processContext->processHandle), + m_thunkPageAllocators(nullptr, /* allocXData */ false, &m_sectionAllocator, nullptr, processContext->processHandle), + m_codePageAllocators(nullptr, ALLOC_XDATA, &m_sectionAllocator, &m_preReservedSectionAllocator, processContext->processHandle), +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) + m_jitThunkEmitter(this, &m_sectionAllocator, processContext->processHandle), #endif - m_codeGenAlloc(nullptr, nullptr, this, &m_codePageAllocators, processHandle), + m_codeGenAlloc(nullptr, nullptr, this, &m_codePageAllocators, processContext->processHandle), m_pageAlloc(nullptr, Js::Configuration::Global.flags, PageAllocatorType_BGJIT, AutoSystemInfo::Data.IsLowMemoryProcess() ? PageAllocator::DefaultLowMaxFreePageCount : PageAllocator::DefaultMaxFreePageCount - ) + ), + processContext(processContext) { - m_pid = GetProcessId(processHandle); + m_pid = GetProcessId(processContext->processHandle); -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD m_codeGenAlloc.canCreatePreReservedSegment = data->allowPrereserveAlloc != FALSE; #endif m_numericPropertyBV = HeapNew(BVSparse, &HeapAllocator::Instance); @@ -38,6 +37,7 @@ ServerThreadContext::ServerThreadContext(ThreadContextDataIDL * data, HANDLE pro ServerThreadContext::~ServerThreadContext() { + processContext->Release(); if (this->m_numericPropertyBV != nullptr) { HeapDelete(m_numericPropertyBV); @@ -82,7 +82,7 @@ ServerThreadContext::GetImplicitCallFlagsAddr() const return static_cast(m_threadContextData.implicitCallFlagsAddr); } -#if defined(ENABLE_SIMDJS) && (defined(_M_IX86) || defined(_M_X64)) +#if (defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD)) && (defined(_M_IX86) || defined(_M_X64)) intptr_t ServerThreadContext::GetSimdTempAreaAddr(uint8 tempIndex) const { @@ -112,7 +112,7 @@ ServerThreadContext::IsThreadBound() const HANDLE ServerThreadContext::GetProcessHandle() const { - return m_autoProcessHandle.GetHandle(); + return this->processContext->processHandle; } CustomHeap::OOPCodePageAllocators * @@ -139,7 +139,7 @@ ServerThreadContext::GetCodeGenAllocators() return &m_codeGenAlloc; } -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) OOPJITThunkEmitter * ServerThreadContext::GetJITThunkEmitter() { @@ -150,13 +150,13 @@ ServerThreadContext::GetJITThunkEmitter() intptr_t ServerThreadContext::GetRuntimeChakraBaseAddress() const { - return static_cast(m_threadContextData.chakraBaseAddress); + return this->processContext->chakraBaseAddress; } intptr_t ServerThreadContext::GetRuntimeCRTBaseAddress() const { - return static_cast(m_threadContextData.crtBaseAddress); + return this->processContext->crtBaseAddress; } /* static */ @@ -215,4 +215,31 @@ void ServerThreadContext::Close() ServerContextManager::RecordCloseContext(this); #endif } + +ProcessContext::ProcessContext(HANDLE processHandle, intptr_t chakraBaseAddress, intptr_t crtBaseAddress) : + processHandle(processHandle), + chakraBaseAddress(chakraBaseAddress), + crtBaseAddress(crtBaseAddress), + refCount(0) +{ +} +ProcessContext::~ProcessContext() +{ + CloseHandle(processHandle); +} + +void ProcessContext::AddRef() +{ + InterlockedExchangeAdd(&this->refCount, 1); +} +void ProcessContext::Release() +{ + InterlockedExchangeSubtract(&this->refCount, 1); +} + +bool ProcessContext::HasRef() +{ + return this->refCount != 0; +} + #endif diff --git a/deps/chakrashim/core/lib/Backend/ServerThreadContext.h b/deps/chakrashim/core/lib/Backend/ServerThreadContext.h index 520b55a6821..ffe29b914b8 100644 --- a/deps/chakrashim/core/lib/Backend/ServerThreadContext.h +++ b/deps/chakrashim/core/lib/Backend/ServerThreadContext.h @@ -5,13 +5,31 @@ #pragma once +#if ENABLE_OOP_NATIVE_CODEGEN +class ProcessContext +{ +private: + uint refCount; + +public: + HANDLE processHandle; + intptr_t chakraBaseAddress; + intptr_t crtBaseAddress; + + ProcessContext(HANDLE processHandle, intptr_t chakraBaseAddress, intptr_t crtBaseAddress); + ~ProcessContext(); + void AddRef(); + void Release(); + bool HasRef(); + +}; + class ServerThreadContext : public ThreadContextInfo { -#if ENABLE_OOP_NATIVE_CODEGEN public: typedef BVSparseNode BVSparseNode; - ServerThreadContext(ThreadContextDataIDL * data, HANDLE processHandle); + ServerThreadContext(ThreadContextDataIDL * data, ProcessContext* processContext); ~ServerThreadContext(); virtual HANDLE GetProcessHandle() const override; @@ -22,7 +40,7 @@ class ServerThreadContext : public ThreadContextInfo virtual intptr_t GetThreadStackLimitAddr() const override; -#if defined(ENABLE_SIMDJS) && (defined(_M_IX86) || defined(_M_X64)) +#if (defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD)) && (defined(_M_IX86) || defined(_M_X64)) virtual intptr_t GetSimdTempAreaAddr(uint8 tempIndex) const override; #endif @@ -38,7 +56,7 @@ class ServerThreadContext : public ThreadContextInfo virtual ptrdiff_t GetCRTBaseAddressDifference() const override; OOPCodeGenAllocators * GetCodeGenAllocators(); -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) OOPJITThunkEmitter * GetJITThunkEmitter(); #endif CustomHeap::OOPCodePageAllocators * GetThunkPageAllocators(); @@ -50,9 +68,7 @@ class ServerThreadContext : public ThreadContextInfo void Release(); void Close(); PageAllocator * GetForegroundPageAllocator(); -#ifdef STACK_BACK_TRACE DWORD GetRuntimePid() { return m_pid; } -#endif intptr_t GetRuntimeChakraBaseAddress() const; intptr_t GetRuntimeCRTBaseAddress() const; @@ -60,7 +76,7 @@ class ServerThreadContext : public ThreadContextInfo static intptr_t GetJITCRTBaseAddress(); private: - AutoCloseHandle m_autoProcessHandle; + ProcessContext* processContext; BVSparse * m_numericPropertyBV; @@ -69,17 +85,16 @@ class ServerThreadContext : public ThreadContextInfo CustomHeap::OOPCodePageAllocators m_thunkPageAllocators; CustomHeap::OOPCodePageAllocators m_codePageAllocators; OOPCodeGenAllocators m_codeGenAlloc; -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) OOPJITThunkEmitter m_jitThunkEmitter; #endif // only allocate with this from foreground calls (never from CodeGen calls) PageAllocator m_pageAlloc; - HANDLE m_processHandle; ThreadContextDataIDL m_threadContextData; DWORD m_pid; //save client process id for easier diagnose CriticalSection m_cs; uint m_refCount; -#endif }; +#endif diff --git a/deps/chakrashim/core/lib/Backend/SwitchIRBuilder.cpp b/deps/chakrashim/core/lib/Backend/SwitchIRBuilder.cpp index 98ea3b93670..bef48576587 100644 --- a/deps/chakrashim/core/lib/Backend/SwitchIRBuilder.cpp +++ b/deps/chakrashim/core/lib/Backend/SwitchIRBuilder.cpp @@ -235,15 +235,16 @@ SwitchIRBuilder::OnCase(IR::RegOpnd * src1Opnd, IR::Opnd * src2Opnd, uint32 offs const bool isIntConst = src2Opnd->IsIntConstOpnd() || (sym && sym->IsIntConst()); const bool isStrConst = !isIntConst && sym && sym->m_isStrConst; - if (GlobOpt::IsSwitchOptEnabled(m_func->GetTopFunc()) && - isIntConst && - m_intConstSwitchCases->TestAndSet(sym ? sym->GetIntConstValue() : src2Opnd->AsIntConstOpnd()->AsInt32())) + if (isIntConst + && GlobOpt::IsSwitchOptEnabledForIntTypeSpec(m_func->GetTopFunc()) + && m_intConstSwitchCases->TestAndSet(sym ? sym->GetIntConstValue() : src2Opnd->AsIntConstOpnd()->AsInt32())) { // We've already seen a case statement with the same int const value. No need to emit anything for this. return; } - if (GlobOpt::IsSwitchOptEnabled(m_func->GetTopFunc()) && isStrConst + if (isStrConst + && GlobOpt::IsSwitchOptEnabled(m_func->GetTopFunc()) && TestAndAddStringCaseConst(JITJavascriptString::FromVar(sym->GetConstAddress(true)))) { // We've already seen a case statement with the same string const value. No need to emit anything for this. @@ -253,36 +254,27 @@ SwitchIRBuilder::OnCase(IR::RegOpnd * src1Opnd, IR::Opnd * src2Opnd, uint32 offs branchInstr = IR::BranchInstr::New(m_eqOp, nullptr, src1Opnd, src2Opnd, m_func); branchInstr->m_isSwitchBr = true; - /* // Switch optimization // For Integers - Binary Search or jump table optimization technique is used // For Strings - Dictionary look up technique is used. // // For optimizing, the Load instruction corresponding to the switch instruction is profiled in the interpreter. // Based on the dynamic profile data, optimization technique is decided. - */ - - bool deferred = false; - - if (GlobOpt::IsSwitchOptEnabled(m_func->GetTopFunc())) + if (m_switchIntDynProfile && isIntConst && GlobOpt::IsSwitchOptEnabledForIntTypeSpec(m_func->GetTopFunc())) { - if (m_switchIntDynProfile && isIntConst) - { - CaseNode* caseNode = JitAnew(m_tempAlloc, CaseNode, branchInstr, offset, targetOffset, src2Opnd); - m_caseNodes->Add(caseNode); - deferred = true; - } - else if (m_switchStrDynProfile && isStrConst) - { - CaseNode* caseNode = JitAnew(m_tempAlloc, CaseNode, branchInstr, offset, targetOffset, src2Opnd); - m_caseNodes->Add(caseNode); - m_seenOnlySingleCharStrCaseNodes = m_seenOnlySingleCharStrCaseNodes && caseNode->GetUpperBoundStringConstLocal()->GetLength() == 1; - deferred = true; - } + CaseNode* caseNode = JitAnew(m_tempAlloc, CaseNode, branchInstr, offset, targetOffset, src2Opnd); + m_caseNodes->Add(caseNode); } - - if (!deferred) + else if (m_switchStrDynProfile && isStrConst && GlobOpt::IsSwitchOptEnabled(m_func->GetTopFunc())) + { + CaseNode* caseNode = JitAnew(m_tempAlloc, CaseNode, branchInstr, offset, targetOffset, src2Opnd); + m_caseNodes->Add(caseNode); + m_seenOnlySingleCharStrCaseNodes = m_seenOnlySingleCharStrCaseNodes && caseNode->GetUpperBoundStringConstLocal()->GetLength() == 1; + } + else { + // Otherwise, there are no optimizations to defer, so add the branch for + // this case instruction now FlushCases(offset); m_adapter->AddBranchInstr(branchInstr, offset, targetOffset); } diff --git a/deps/chakrashim/core/lib/Backend/SwitchIRBuilder.h b/deps/chakrashim/core/lib/Backend/SwitchIRBuilder.h index b2a99afaaac..aa64f6a11d3 100644 --- a/deps/chakrashim/core/lib/Backend/SwitchIRBuilder.h +++ b/deps/chakrashim/core/lib/Backend/SwitchIRBuilder.h @@ -60,7 +60,9 @@ struct IRBuilderAsmJsSwitchAdapter : public SwitchAdapter { #endif /** - * Handles construction of switch statements, with appropriate optimizations + * Handles construction of switch statements, with appropriate optimizations. Note that some of these + * optimizations occur during IR building (rather than GlobOpt) because the abstraction of a switch/case + * block is not maintained with the resulting IR. Thus, some optimizations must occur during this phase. */ class SwitchIRBuilder { private: diff --git a/deps/chakrashim/core/lib/Backend/Sym.cpp b/deps/chakrashim/core/lib/Backend/Sym.cpp index 99c3316a60d..e3759125b27 100644 --- a/deps/chakrashim/core/lib/Backend/Sym.cpp +++ b/deps/chakrashim/core/lib/Backend/Sym.cpp @@ -572,7 +572,7 @@ StackSym::GetIntConstValue() const { return Js::TaggedInt::ToInt32(var); } - int32 value; + int32 value = 0xCCCCCCCC; const bool isInt32 = Js::JavascriptNumber::TryGetInt32Value(Js::JavascriptNumber::GetValue(var), &value); Assert(isInt32); return value; diff --git a/deps/chakrashim/core/lib/Backend/Sym.h b/deps/chakrashim/core/lib/Backend/Sym.h index 315b8d4c781..63e6c8fade3 100644 --- a/deps/chakrashim/core/lib/Backend/Sym.h +++ b/deps/chakrashim/core/lib/Backend/Sym.h @@ -151,6 +151,7 @@ class StackSym: public Sym bool IsSimd128B8() const { return this->GetType() == TySimd128B8; } bool IsSimd128B16() const { return this->GetType() == TySimd128B16; } bool IsSimd128D2() const { return this->GetType() == TySimd128D2; } + bool IsSimd128I2() const { return this->GetType() == TySimd128I2; } StackSym * GetFloat64EquivSym(Func *func); bool IsFloat64() const { return this->GetType() == TyFloat64; } @@ -231,7 +232,7 @@ class StackSym: public Sym uint8 m_isArgCaptured: 1; // True if there is a ByteCodeArgOutCapture for this symbol uint8 m_nonEscapingArgObjAlias : 1; uint8 m_isCatchObjectSym : 1; // a catch object sym (used while jitting loop bodies) - uint m_isClosureSym : 1; + uint8 m_isClosureSym : 1; IRType m_type; Js::BuiltinFunction m_builtInIndex; diff --git a/deps/chakrashim/core/lib/Backend/SymTable.h b/deps/chakrashim/core/lib/Backend/SymTable.h index d451f445c89..d87fd630998 100644 --- a/deps/chakrashim/core/lib/Backend/SymTable.h +++ b/deps/chakrashim/core/lib/Backend/SymTable.h @@ -24,10 +24,14 @@ class SymTable PropertyEquivBvMap *m_propertyEquivBvMap; public: - SymTable() : m_currentID(0), m_func(nullptr), m_IDAdjustment(0) + SymTable() : + m_table{ nullptr }, + m_implicitParams{ nullptr }, + m_propertyMap(nullptr), + m_func(nullptr), + m_currentID(0), + m_IDAdjustment(0) { - memset(m_table, 0, sizeof(m_table)); - memset(m_implicitParams, 0, sizeof(m_implicitParams)); } diff --git a/deps/chakrashim/core/lib/Backend/TempTracker.cpp b/deps/chakrashim/core/lib/Backend/TempTracker.cpp index 09371ac18b9..9797504f27b 100644 --- a/deps/chakrashim/core/lib/Backend/TempTracker.cpp +++ b/deps/chakrashim/core/lib/Backend/TempTracker.cpp @@ -1214,6 +1214,9 @@ ObjectTemp::GetStackSym(IR::Opnd * opnd, IR::PropertySymOpnd ** pPropertySymOpnd case IR::OpndKindIndir: stackSym = opnd->AsIndirOpnd()->GetBaseOpnd()->m_sym; break; + case IR::OpndKindList: + Assert(UNREACHED); + break; }; return stackSym; } diff --git a/deps/chakrashim/core/lib/Backend/ValueInfo.cpp b/deps/chakrashim/core/lib/Backend/ValueInfo.cpp index 1fbeb4afaae..a06e949e501 100644 --- a/deps/chakrashim/core/lib/Backend/ValueInfo.cpp +++ b/deps/chakrashim/core/lib/Backend/ValueInfo.cpp @@ -787,7 +787,10 @@ ValueInfo::MergeLikelyIntValueInfo(JitArenaAllocator* alloc, Value *toDataVal, V if(newValueType.IsInt()) { - int32 min1, max1, min2, max2; + int32 min1 = INT32_MIN; + int32 max1 = INT32_MAX; + int32 min2 = INT32_MIN; + int32 max2 = INT32_MAX; toDataValueInfo->GetIntValMinMax(&min1, &max1, false); fromDataValueInfo->GetIntValMinMax(&min2, &max2, false); return ValueInfo::NewIntRangeValueInfo(alloc, min(min1, min2), max(max1, max2), wasNegativeZeroPreventedByBailout); diff --git a/deps/chakrashim/core/lib/Backend/ValueInfo.h b/deps/chakrashim/core/lib/Backend/ValueInfo.h index e8cff7ff8b2..18efaddb8eb 100644 --- a/deps/chakrashim/core/lib/Backend/ValueInfo.h +++ b/deps/chakrashim/core/lib/Backend/ValueInfo.h @@ -35,7 +35,7 @@ class ValueInfo : protected ValueType protected: ValueInfo(const ValueType type, const ValueStructureKind structureKind) - : ValueType(type), structureKind(structureKind) + : ValueType(type), structureKind(structureKind), symStore(nullptr) { // We can only prove that the representation is a tagged int on a ToVar. Currently, we cannot have more than one value // info per value number in a block, so a value info specifying tagged int representation cannot be created for a @@ -43,13 +43,13 @@ class ValueInfo : protected ValueType // representation. Currently, the tagged int representation info can only be carried on the dst opnd of ToVar, and can't // even be propagated forward. Assert(!type.IsTaggedInt()); - - SetSymStore(nullptr); } private: ValueInfo(const ValueInfo &other, const bool) - : ValueType(other), structureKind(ValueStructureKind::Generic) // uses generic structure kind, as opposed to copying the structure kind + : ValueType(other), + structureKind(ValueStructureKind::Generic), // uses generic structure kind, as opposed to copying the structure kind + symStore(nullptr) // Will be immediately overridden { SetSymStore(other.GetSymStore()); } @@ -89,6 +89,7 @@ class ValueInfo : protected ValueType using ValueType::HasBeenFloat; using ValueType::IsFloat; + using ValueType::IsNotFloat; using ValueType::IsLikelyFloat; using ValueType::HasBeenNumber; @@ -316,7 +317,7 @@ class Value void SetValueInfo(ValueInfo * newValueInfo) { Assert(newValueInfo); this->valueInfo = newValueInfo; } Value * Copy(JitArenaAllocator * allocator, ValueNumber newValueNumber) const { return Value::New(allocator, newValueNumber, this->ShareValueInfo()); } - + bool IsEqualTo(Value * other) { return this->valueNumber == other->valueNumber; } #if DBG_DUMP _NOINLINE void Dump() const { Output::Print(_u("0x%X ValueNumber: %3d, -> "), this, this->valueNumber); this->valueInfo->Dump(); } #endif diff --git a/deps/chakrashim/core/lib/Backend/amd64/EncoderMD.cpp b/deps/chakrashim/core/lib/Backend/amd64/EncoderMD.cpp index d1fbd3f7041..d0b88d16323 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/EncoderMD.cpp +++ b/deps/chakrashim/core/lib/Backend/amd64/EncoderMD.cpp @@ -980,7 +980,10 @@ EncoderMD::Encode(IR::Instr *instr, BYTE *pc, BYTE* beginCodeAddress) } break; } - + case Js::OpCode::PEXTRD: + case Js::OpCode::PEXTRQ: + this->EmitModRM(instr, opr1, this->GetRegEncode(opr2->AsRegOpnd())); + break; case Js::OpCode::BT: case Js::OpCode::BTR: case Js::OpCode::BTS: @@ -1163,6 +1166,7 @@ EncoderMD::Encode(IR::Instr *instr, BYTE *pc, BYTE* beginCodeAddress) case Js::OpCode::MOVAPS: case Js::OpCode::MOVUPS: case Js::OpCode::MOVHPD: + case Js::OpCode::MOVLPD: if (!opr1->IsRegOpnd()) { Assert(opr1->IsIndirOpnd() || opr1->IsMemRefOpnd() || opr1->IsSymOpnd()); diff --git a/deps/chakrashim/core/lib/Backend/amd64/LinearScanMD.cpp b/deps/chakrashim/core/lib/Backend/amd64/LinearScanMD.cpp index 1b4dc21f193..e61c452e180 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/LinearScanMD.cpp +++ b/deps/chakrashim/core/lib/Backend/amd64/LinearScanMD.cpp @@ -206,10 +206,10 @@ LinearScanMD::InsertOpHelperSpillsAndRestores(const OpHelperBlock& opHelperBlock func->StackAllocate(sym, MachRegInt); } IR::RegOpnd * regOpnd = IR::RegOpnd::New(nullptr, opHelperSpilledLifetime.reg, sym->GetType(), func); - LowererMD::CreateAssign(IR::SymOpnd::New(sym, sym->GetType(), func), regOpnd, opHelperBlock.opHelperLabel->m_next); + Lowerer::InsertMove(IR::SymOpnd::New(sym, sym->GetType(), func), regOpnd, opHelperBlock.opHelperLabel->m_next); if (opHelperSpilledLifetime.reload) { - LowererMD::CreateAssign(regOpnd, IR::SymOpnd::New(sym, sym->GetType(), func), opHelperBlock.opHelperEndInstr); + Lowerer::InsertMove(regOpnd, IR::SymOpnd::New(sym, sym->GetType(), func), opHelperBlock.opHelperEndInstr); } } } @@ -368,8 +368,8 @@ LinearScanMD::GenerateBailInForGeneratorYield(IR::Instr * resumeLabelInstr, Bail IR::Instr * instrInsertStackSym = instrAfter; IR::Instr * instrInsertRegSym = instrAfter; - Assert(bailOutInfo->capturedValues.constantValues.Empty()); - Assert(bailOutInfo->capturedValues.copyPropSyms.Empty()); + Assert(bailOutInfo->capturedValues->constantValues.Empty()); + Assert(bailOutInfo->capturedValues->copyPropSyms.Empty()); Assert(bailOutInfo->liveLosslessInt32Syms->IsEmpty()); Assert(bailOutInfo->liveFloat64Syms->IsEmpty()); @@ -441,9 +441,9 @@ LinearScanMD::GenerateBailInForGeneratorYield(IR::Instr * resumeLabelInstr, Bail } NEXT_BITSET_IN_SPARSEBV; - if (bailOutInfo->capturedValues.argObjSyms) + if (bailOutInfo->capturedValues->argObjSyms) { - FOREACH_BITSET_IN_SPARSEBV(symId, bailOutInfo->capturedValues.argObjSyms) + FOREACH_BITSET_IN_SPARSEBV(symId, bailOutInfo->capturedValues->argObjSyms) { StackSym* stackSym = this->func->m_symTable->FindStackSym(symId); restoreSymFn(stackSym->GetByteCodeRegSlot(), stackSym); diff --git a/deps/chakrashim/core/lib/Backend/amd64/LowererMDArch.cpp b/deps/chakrashim/core/lib/Backend/amd64/LowererMDArch.cpp index 1458e19b799..e9d453c8c6a 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/LowererMDArch.cpp +++ b/deps/chakrashim/core/lib/Backend/amd64/LowererMDArch.cpp @@ -115,6 +115,7 @@ LowererMDArch::GetAssignOp(IRType type) case TySimd128B8: case TySimd128B16: case TySimd128D2: + case TySimd128I2: return Js::OpCode::MOVUPS; default: return Js::OpCode::MOV; @@ -153,9 +154,7 @@ LowererMDArch::LoadInputParamPtr(IR::Instr *instrInsert, IR::RegOpnd *optionalDs // Stack looks like (EBP chain)+0, (return addr)+4, (function object)+8, (arg count)+12, (this)+16, actual args StackSym *paramSym = StackSym::New(TyMachReg, this->m_func); this->m_func->SetArgOffset(paramSym, 5 * MachPtr); - IR::Instr *instr = this->lowererMD->LoadStackAddress(paramSym, optionalDstOpnd); - instrInsert->InsertBefore(instr); - return instr; + return this->lowererMD->m_lowerer->InsertLoadStackAddress(paramSym, instrInsert, optionalDstOpnd); } } @@ -220,8 +219,7 @@ LowererMDArch::LoadHeapArgsCached(IR::Instr *instrArgs) // s4 = address of first actual argument (after "this"). StackSym *firstRealArgSlotSym = func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); this->m_func->SetArgOffset(firstRealArgSlotSym, firstRealArgSlotSym->m_offset + MachPtr); - IR::Instr *instr = this->lowererMD->LoadStackAddress(firstRealArgSlotSym); - instrArgs->InsertBefore(instr); + IR::Instr *instr = this->lowererMD->m_lowerer->InsertLoadStackAddress(firstRealArgSlotSym, instrArgs); this->LoadHelperArgument(instrArgs, instr->GetDst()); // s3 = formal argument count (without counting "this"). @@ -343,8 +341,7 @@ LowererMDArch::LoadHeapArguments(IR::Instr *instrArgs) // s3 = address of first actual argument (after "this"). StackSym *firstRealArgSlotSym = func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); this->m_func->SetArgOffset(firstRealArgSlotSym, firstRealArgSlotSym->m_offset + MachPtr); - IR::Instr *instr = this->lowererMD->LoadStackAddress(firstRealArgSlotSym); - instrArgs->InsertBefore(instr); + IR::Instr *instr = this->lowererMD->m_lowerer->InsertLoadStackAddress(firstRealArgSlotSym, instrArgs); this->LoadHelperArgument(instrArgs, instr->GetDst()); // s2 = actual argument count (without counting "this"). @@ -389,7 +386,7 @@ LowererMDArch::LoadHeapArguments(IR::Instr *instrArgs) // the function object for generator calls is a GeneratorVirtualScriptFunction object // and we need to pass the real JavascriptGeneratorFunction object so grab it instead IR::RegOpnd *tmpOpnd = IR::RegOpnd::New(TyMachReg, func); - LowererMD::CreateAssign(tmpOpnd, srcOpnd, instrArgs); + Lowerer::InsertMove(tmpOpnd, srcOpnd, instrArgs); srcOpnd = IR::IndirOpnd::New(tmpOpnd, Js::GeneratorVirtualScriptFunction::GetRealFunctionOffset(), TyMachPtr, func); } @@ -417,7 +414,7 @@ LowererMDArch::LoadNewScObjFirstArg(IR::Instr * instr, IR::Opnd * dst, ushort ex { // Spread moves down the argument slot by one. IR::Opnd * argOpnd = this->GetArgSlotOpnd(3 + extraArgs); - IR::Instr * argInstr = LowererMD::CreateAssign(argOpnd, dst, instr); + IR::Instr * argInstr = Lowerer::InsertMove(argOpnd, dst, instr); return argInstr; } @@ -815,16 +812,6 @@ LowererMDArch::LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper return ret; } -IR::Instr * -LowererMDArch::LowerCallPut(IR::Instr *callInstr) -{ - // Note: what we have to do here is call a helper with the Jscript calling convention, - // so we need to factor the lowering of arguments out of the CallI expansion. - - AssertMsg(FALSE, "TODO: LowerCallPut not implemented"); - return nullptr; -} - static inline IRType ExtendHelperArg(IRType type) { #ifdef __clang__ @@ -850,7 +837,7 @@ LowererMDArch::LowerCall(IR::Instr * callInstr, uint32 argCount) callInstr->m_opcode = Js::OpCode::CALL; // This is required here due to calls create during lowering - callInstr->m_func->SetHasCalls(); + callInstr->m_func->SetHasCallsOnSelfAndParents(); if (callInstr->GetDst()) { @@ -1108,6 +1095,17 @@ LowererMDArch::LowerAsmJsCallI(IR::Instr * callInstr) IR::Instr * LowererMDArch::LowerWasmMemOp(IR::Instr * instr, IR::Opnd *addrOpnd) { + IR::IndirOpnd * indirOpnd = addrOpnd->AsIndirOpnd(); + IR::RegOpnd * indexOpnd = indirOpnd->GetIndexOpnd(); + if (indexOpnd && !indexOpnd->IsIntegral32()) + { + // We don't expect the index to be anything other than an int32 or uint32 + // Having an int32 index guaranties that int64 index add doesn't overflow + // If we're wrong, just throw index out of range + Assert(UNREACHED); + lowererMD->m_lowerer->GenerateThrow(IR::IntConstOpnd::New(WASMERR_ArrayIndexOutOfRange, TyInt32, m_func), instr); + return instr; + } #if ENABLE_FAST_ARRAYBUFFER if (CONFIG_FLAG(WasmFastArray)) { @@ -1121,8 +1119,6 @@ LowererMDArch::LowerWasmMemOp(IR::Instr * instr, IR::Opnd *addrOpnd) IR::LabelInstr * doneLabel = Lowerer::InsertLabel(false, instr); // Find array buffer length - IR::IndirOpnd * indirOpnd = addrOpnd->AsIndirOpnd(); - IR::RegOpnd * indexOpnd = indirOpnd->GetIndexOpnd(); uint32 offset = indirOpnd->GetOffset(); IR::Opnd *arrayLenOpnd = instr->GetSrc2(); IR::Int64ConstOpnd * constOffsetOpnd = IR::Int64ConstOpnd::New((int64)addrOpnd->GetSize() + (int64)offset, TyInt64, m_func); @@ -1151,9 +1147,15 @@ LowererMDArch::LowerAsmJsLdElemHelper(IR::Instr * instr, bool isSimdLoad /*= fal IRType type = src1->GetType(); IR::RegOpnd * indexOpnd = src1->AsIndirOpnd()->GetIndexOpnd(); const uint8 dataWidth = instr->dataWidth; - Assert(isSimdLoad == false || dataWidth == 4 || dataWidth == 8 || dataWidth == 12 || dataWidth == 16); +#if ENABLE_FAST_ARRAYBUFFER + if (CONFIG_FLAG(WasmFastArray) && m_func->GetJITFunctionBody()->IsWasmFunction()) + { + return instr; + } +#endif + #ifdef _WIN32 // For x64, bound checks are required only for SIMD loads. if (isSimdLoad) @@ -1191,7 +1193,23 @@ LowererMDArch::LowerAsmJsLdElemHelper(IR::Instr * instr, bool isSimdLoad /*= fal } else { - lowererMD->m_lowerer->InsertCompareBranch(cmpOpnd, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); +#ifdef ENABLE_WASM_SIMD + if (m_func->GetJITFunctionBody()->IsWasmFunction() && src1->AsIndirOpnd()->GetOffset()) //WASM + { + IR::RegOpnd *tmp = IR::RegOpnd::New(cmpOpnd->GetType(), m_func); + // MOV tmp, cmpOnd + Lowerer::InsertMove(tmp, cmpOpnd, helperLabel); + // ADD tmp, offset + Lowerer::InsertAdd(true, tmp, tmp, IR::IntConstOpnd::New((uint32)src1->AsIndirOpnd()->GetOffset(), tmp->GetType(), m_func), helperLabel); + // JB helper + Lowerer::InsertBranch(Js::OpCode::JB, helperLabel, helperLabel); + lowererMD->m_lowerer->InsertCompareBranch(tmp, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); + } + else +#endif + { + lowererMD->m_lowerer->InsertCompareBranch(cmpOpnd, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); + } } Lowerer::InsertBranch(Js::OpCode::Br, loadLabel, helperLabel); @@ -1269,7 +1287,23 @@ LowererMDArch::LowerAsmJsStElemHelper(IR::Instr * instr, bool isSimdStore /*= fa } else { - lowererMD->m_lowerer->InsertCompareBranch(cmpOpnd, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); +#ifdef ENABLE_WASM_SIMD + if (m_func->GetJITFunctionBody()->IsWasmFunction() && dst->AsIndirOpnd()->GetOffset()) //WASM + { + IR::RegOpnd *tmp = IR::RegOpnd::New(cmpOpnd->GetType(), m_func); + // MOV tmp, cmpOnd + Lowerer::InsertMove(tmp, cmpOpnd, helperLabel); + // ADD tmp, offset + Lowerer::InsertAdd(true, tmp, tmp, IR::IntConstOpnd::New((uint32)dst->AsIndirOpnd()->GetOffset(), tmp->GetType(), m_func), helperLabel); + // JB helper + Lowerer::InsertBranch(Js::OpCode::JB, helperLabel, helperLabel); + lowererMD->m_lowerer->InsertCompareBranch(tmp, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); + } + else +#endif + { + lowererMD->m_lowerer->InsertCompareBranch(cmpOpnd, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); + } } Lowerer::InsertBranch(Js::OpCode::Br, storeLabel, helperLabel); @@ -1465,7 +1499,7 @@ LowererMDArch::GenerateStackAllocation(IR::Instr *instr, uint32 size) instr->InsertAfter(movHelperAddrInstr); } - LowererMD::CreateAssign(raxOpnd, stackSizeOpnd, instr->m_next); + Lowerer::InsertMove(raxOpnd, stackSizeOpnd, instr->m_next); } } @@ -1575,7 +1609,7 @@ LowererMDArch::LowerEntryInstr(IR::EntryInstr * entryInstr) // Allocate the inlined arg out stack in the locals. Allocate an additional slot so that // we can unconditionally clear the first slot past the current frame. - this->m_func->m_localStackHeight += ((this->m_func->GetMaxInlineeArgOutCount() + 1) * MachPtr); + this->m_func->m_localStackHeight += m_func->GetMaxInlineeArgOutSize() + MachPtr; uint32 stackLocalsSize = this->m_func->m_localStackHeight; if(xmmOffset != 0) @@ -1606,7 +1640,7 @@ LowererMDArch::LowerEntryInstr(IR::EntryInstr * entryInstr) throw Js::OperationAbortedException(); } - if (this->m_func->GetMaxInlineeArgOutCount()) + if (m_func->HasInlinee()) { this->m_func->GetJITOutput()->SetFrameHeight(this->m_func->m_localStackHeight); } @@ -1671,7 +1705,7 @@ LowererMDArch::LowerEntryInstr(IR::EntryInstr * entryInstr) } // Zero initialize the first inlinee frames argc. - if (this->m_func->GetMaxInlineeArgOutCount()) + if (m_func->HasInlinee()) { if(!movRax0) { @@ -1784,6 +1818,10 @@ LowererMDArch::LowerEntryInstr(IR::EntryInstr * entryInstr) this->MovArgFromReg2Stack(entryInstr, (RegNum)(RegXMM1 + i), offset, TySimd128D2); offset += 2; break; + case Js::AsmJsVarType::Int64x2: + this->MovArgFromReg2Stack(entryInstr, (RegNum)(RegXMM1 + i), offset, TySimd128I2); + offset += 2; + break; default: Assume(UNREACHED); } @@ -1870,10 +1908,10 @@ LowererMDArch::GeneratePrologueStackProbe(IR::Instr *entryInstr, IntConstType fr { intptr_t pLimit = m_func->GetThreadContextInfo()->GetThreadStackLimitAddr(); IR::RegOpnd *baseOpnd = IR::RegOpnd::New(nullptr, RegRAX, TyMachReg, this->m_func); - this->lowererMD->CreateAssign(baseOpnd, IR::AddrOpnd::New(pLimit, IR::AddrOpndKindDynamicMisc, this->m_func), insertInstr); + Lowerer::InsertMove(baseOpnd, IR::AddrOpnd::New(pLimit, IR::AddrOpndKindDynamicMisc, this->m_func), insertInstr); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(baseOpnd, 0, TyMachReg, this->m_func); - this->lowererMD->CreateAssign(stackLimitOpnd, indirOpnd, insertInstr); + Lowerer::InsertMove(stackLimitOpnd, indirOpnd, insertInstr); } instr = IR::Instr::New(Js::OpCode::ADD, stackLimitOpnd, stackLimitOpnd, @@ -1891,7 +1929,7 @@ LowererMDArch::GeneratePrologueStackProbe(IR::Instr *entryInstr, IntConstType fr { // TODO: michhol, check this math size_t scriptStackLimit = m_func->GetThreadContextInfo()->GetScriptStackLimit(); - this->lowererMD->CreateAssign(stackLimitOpnd, IR::IntConstOpnd::New((frameSize + scriptStackLimit), TyMachReg, this->m_func), insertInstr); + Lowerer::InsertMove(stackLimitOpnd, IR::IntConstOpnd::New((frameSize + scriptStackLimit), TyMachReg, this->m_func), insertInstr); } // CMP rsp, rax @@ -1928,18 +1966,18 @@ LowererMDArch::GeneratePrologueStackProbe(IR::Instr *entryInstr, IntConstType fr IR::RegOpnd *target; { // MOV RegArg1, scriptContext - this->lowererMD->CreateAssign( + Lowerer::InsertMove( IR::RegOpnd::New(nullptr, RegArg1, TyMachReg, m_func), this->lowererMD->m_lowerer->LoadScriptContextOpnd(insertInstr), insertInstr); // MOV RegArg0, frameSize - this->lowererMD->CreateAssign( + Lowerer::InsertMove( IR::RegOpnd::New(nullptr, RegArg0, TyMachReg, this->m_func), IR::IntConstOpnd::New(frameSize, TyMachReg, this->m_func), insertInstr); // MOV rax, ThreadContext::ProbeCurrentStack target = IR::RegOpnd::New(nullptr, RegRAX, TyMachReg, m_func); - this->lowererMD->CreateAssign(target, IR::HelperCallOpnd::New(IR::HelperProbeCurrentStack, m_func), insertInstr); + Lowerer::InsertMove(target, IR::HelperCallOpnd::New(IR::HelperProbeCurrentStack, m_func), insertInstr); } // JMP rax @@ -2083,11 +2121,15 @@ LowererMDArch::LowerExitInstr(IR::ExitInstr * exitInstr) case Js::AsmJsRetType::Float64x2: retReg = IR::RegOpnd::New(nullptr, this->GetRegReturnAsmJs(TySimd128D2), TySimd128D2, this->m_func); break; + case Js::AsmJsRetType::Int64x2: + retReg = IR::RegOpnd::New(nullptr, this->GetRegReturnAsmJs(TySimd128I2), TySimd128I2, this->m_func); + break; case Js::AsmJsRetType::Int64: case Js::AsmJsRetType::Signed: - case Js::AsmJsRetType::Void: retReg = IR::RegOpnd::New(nullptr, this->GetRegReturn(TyMachReg), TyMachReg, this->m_func); break; + case Js::AsmJsRetType::Void: + break; default: Assume(UNREACHED); } @@ -2101,7 +2143,10 @@ LowererMDArch::LowerExitInstr(IR::ExitInstr * exitInstr) // Generate RET IR::Instr * retInstr = IR::Instr::New(Js::OpCode::RET, this->m_func); retInstr->SetSrc1(intSrc); - retInstr->SetSrc2(retReg); + if (retReg) + { + retInstr->SetSrc2(retReg); + } exitInstr->InsertBefore(retInstr); retInstr->m_opcode = Js::OpCode::RET; @@ -2110,13 +2155,6 @@ LowererMDArch::LowerExitInstr(IR::ExitInstr * exitInstr) return exitInstr; } -IR::Instr * -LowererMDArch::LowerEntryInstrAsmJs(IR::EntryInstr * entryInstr) -{ - // prologue is almost identical on x64, except for loading args - return LowerEntryInstr(entryInstr); -} - IR::Instr * LowererMDArch::LowerExitInstrAsmJs(IR::ExitInstr * exitInstr) { @@ -2124,13 +2162,6 @@ LowererMDArch::LowerExitInstrAsmJs(IR::ExitInstr * exitInstr) return LowerExitInstr(exitInstr); } -IR::Instr * -LowererMDArch::LowerInt64Assign(IR::Instr * instr) -{ - this->lowererMD->ChangeToAssign(instr); - return instr; -} - void LowererMDArch::EmitInt4Instr(IR::Instr *instr, bool signExtend /* = false */) { @@ -2216,9 +2247,7 @@ LowererMDArch::EmitInt4Instr(IR::Instr *instr, bool signExtend /* = false */) // we need to ensure that register allocator doesn't muck about with rdx instr->HoistSrc2(Js::OpCode::MOV, RegRCX); - newInstr = IR::Instr::New(Js::OpCode::Ld_I4, regEDX, IR::IntConstOpnd::New(0, src1->GetType(), instr->m_func), instr->m_func); - instr->InsertBefore(newInstr); - LowererMD::ChangeToAssign(newInstr); + Lowerer::InsertMove(regEDX, IR::IntConstOpnd::New(0, src1->GetType(), instr->m_func), instr); // NOP ensures that the EDX = Ld_I4 0 doesn't get deadstored, will be removed in peeps instr->InsertBefore(IR::Instr::New(Js::OpCode::NOP, regEDX, regEDX, instr->m_func)); } @@ -3075,7 +3104,7 @@ LowererMDArch::FinalLower() case Js::OpCode::Leave: Assert(this->m_func->DoOptimizeTry() && !this->m_func->IsLoopBodyInTry()); - instrPrev = this->lowererMD->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/); + instrPrev = this->lowererMD->m_lowerer->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/); break; case Js::OpCode::CMOVA: diff --git a/deps/chakrashim/core/lib/Backend/amd64/LowererMDArch.h b/deps/chakrashim/core/lib/Backend/amd64/LowererMDArch.h index 10e104ec7a9..a98e1e6849a 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/LowererMDArch.h +++ b/deps/chakrashim/core/lib/Backend/amd64/LowererMDArch.h @@ -88,7 +88,6 @@ class LowererMDArch IR::Instr * LowerCall(IR::Instr * callInstr, uint32 argCount); IR::Instr * LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper = false, IR::Instr * insertBeforeInstrForCFG = nullptr); IR::Instr * LowerCallIDynamic(IR::Instr * callInstr, IR::Instr* saveThis, IR::Opnd* argsLengthOpnd, ushort callFlags, IR::Instr * insertBeforeInstrForCFG = nullptr); - IR::Instr * LowerCallPut(IR::Instr * callInstr); IR::Instr * LowerStartCall(IR::Instr * instr); IR::Instr * LowerAsmJsCallI(IR::Instr * callInstr); IR::Instr * LowerAsmJsCallE(IR::Instr * callInstr); @@ -108,9 +107,7 @@ class LowererMDArch IR::Instr * LowerEntryInstr(IR::EntryInstr * entryInstr); void GeneratePrologueStackProbe(IR::Instr *entryInstr, IntConstType frameSize); IR::Instr * LowerExitInstr(IR::ExitInstr * exitInstr); - IR::Instr * LowerEntryInstrAsmJs(IR::EntryInstr * entryInstr); IR::Instr * LowerExitInstrAsmJs(IR::ExitInstr * exitInstr); - IR::Instr * LowerInt64Assign(IR::Instr * instr); static void EmitInt4Instr(IR::Instr *instr, bool signExtend = false); void EmitLoadVar(IR::Instr *instrLoad, bool isFromUint32 = false, bool isHelper = false); void EmitIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); diff --git a/deps/chakrashim/core/lib/Backend/amd64/MdOpCodes.h b/deps/chakrashim/core/lib/Backend/amd64/MdOpCodes.h index b0e95f2f9ce..ba39ce81e7c 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/MdOpCodes.h +++ b/deps/chakrashim/core/lib/Backend/amd64/MdOpCodes.h @@ -132,6 +132,7 @@ MACRO(MOVD, Reg2, None, RNON, f(SPECIAL), o(MOVD), DDST|DNO1 MACRO(MOVHLPS, Reg2, None, RNON, f(SPECIAL), o(MOVHLPS), DDST|DNO16, OLB_0F) MACRO(MOVHPD, Reg2, None, RNON, f(SPECIAL), o(MOVHPD), DDST|DNO16|D66, OLB_0F) +MACRO(MOVLPD, Reg2, None, RNON, f(SPECIAL), o(MOVLPD), DDST|DNO16|D66, OLB_0F) MACRO(MOVLHPS, Reg2, None, RNON, f(SPECIAL), o(MOVLHPS), DDST|DNO16, OLB_0F) MACRO(MOVMSKPD, Reg2, None, RNON, f(SPECIAL), o(MOVMSKPD), DDST|DNO16|D66, OLB_0F) MACRO(MOVMSKPS, Reg2, None, RNON, f(SPECIAL), o(MOVMSKPS), DDST|DNO16, OLB_0F) @@ -168,6 +169,7 @@ MACRO(OR , Reg2, OpSideEffect, R001, f(BINOP), o(OR), DOPEQ|DSE MACRO(ORPS, Reg2, None, R001, f(MODRM), o(ORPS), DOPEQ|DOPEQ|DCOMMOP, OLB_0F) MACRO(PADDB, Reg2, None, RNON, f(MODRM), o(PADDB), DNO16|DOPEQ|D66|DCOMMOP, OLB_0F) MACRO(PADDD, Reg2, None, RNON, f(MODRM), o(PADDD), DNO16|DOPEQ|D66|DCOMMOP, OLB_0F) +MACRO(PADDQ, Reg2, None, RNON, f(MODRM), o(PADDQ), DNO16|DOPEQ|D66|DCOMMOP, OLB_0F) MACRO(PADDW, Reg2, None, RNON, f(MODRM), o(PADDW), DNO16|DOPEQ|D66|DCOMMOP, OLB_0F) MACRO(PADDSB, Reg2, None, RNON, f(MODRM), o(PADDSB), DNO16|DOPEQ|D66|DCOMMOP, OLB_0F) MACRO(PADDSW, Reg2, None, RNON, f(MODRM), o(PADDSW), DNO16|DOPEQ|D66|DCOMMOP, OLB_0F) @@ -192,18 +194,23 @@ MACRO(POR, Reg2, None, RNON, f(MODRM), o(POR), DNO16|DO MACRO(PSHUFD, Reg3, None, RNON, f(MODRM), o(PSHUFD), DDST|DNO16|D66|DSSE, OLB_0F) MACRO(PEXTRW, Reg3, None, RNON, f(MODRM), o(PEXTRW), DDST|DNO16|D66|DSSE, OLB_0F) +MACRO(PEXTRD, Reg3, None, RNON, f(SPECIAL), o(PEXTRD), DDST|DNO16|DSSE|D66, OLB_0F3A) +MACRO(PEXTRQ, Reg3, None, RNON, f(SPECIAL), o(PEXTRQ), DDST|DNO16|D66|DREXSRC|DSSE,OLB_0F3A) MACRO(PSLLDQ, Reg2, None, R111, f(SPECIAL), o(PSLLDQ), DDST|DNO16|DOPEQ|D66|DSSE, OLB_0F) MACRO(PSRLDQ, Reg2, None, R011, f(SPECIAL), o(PSRLDQ), DDST|DNO16|DOPEQ|D66|DSSE, OLB_0F) MACRO(PSLLW, Reg2, None, R110, f(SPECIAL), o(PSLLW), DNO16|DOPEQ|D66|DSSE, OLB_0F) MACRO(PSLLD, Reg2, None, R110, f(SPECIAL), o(PSLLD), DNO16|DOPEQ|D66|DSSE, OLB_0F) +MACRO(PSLLQ, Reg2, None, RNON, f(MODRM), o(PSLLQ), DNO16|DOPEQ|D66|DSSE, OLB_0F) MACRO(PSRAW, Reg2, None, R100, f(SPECIAL), o(PSRAW), DNO16|DOPEQ|D66|DSSE, OLB_0F) MACRO(PSRAD, Reg2, None, R100, f(SPECIAL), o(PSRAD), DNO16|DOPEQ|D66|DSSE, OLB_0F) MACRO(PSRLW, Reg2, None, R010, f(SPECIAL), o(PSRLW), DNO16|DOPEQ|D66|DSSE, OLB_0F) MACRO(PSRLD, Reg2, None, R010, f(SPECIAL), o(PSRLD), DNO16|DOPEQ|D66|DSSE, OLB_0F) +MACRO(PSRLQ, Reg2, None, RNON, f(MODRM), o(PSRLQ), DNO16|DOPEQ|D66|DSSE, OLB_0F) MACRO(PSUBB, Reg2, None, RNON, f(MODRM), o(PSUBB), DNO16|DOPEQ|D66, OLB_0F) MACRO(PSUBD, Reg2, None, RNON, f(MODRM), o(PSUBD), DNO16|DOPEQ|D66, OLB_0F) +MACRO(PSUBQ, Reg2, None, RNON, f(MODRM), o(PSUBQ), DNO16|DOPEQ|D66, OLB_0F) MACRO(PSUBW, Reg2, None, RNON, f(MODRM), o(PSUBW), DNO16|DOPEQ|D66, OLB_0F) MACRO(PSUBSB, Reg2, None, RNON, f(MODRM), o(PSUBSB), DNO16|DOPEQ|D66, OLB_0F) MACRO(PSUBSW, Reg2, None, RNON, f(MODRM), o(PSUBSW), DNO16|DOPEQ|D66, OLB_0F) @@ -260,6 +267,8 @@ MACRO(XCHG, Reg2, None, R000, f(XCHG), o(XCHG), DOPEQ, MACRO(XOR, Reg2, OpSideEffect, R110, f(BINOP), o(XOR), DOPEQ|DSETCC|DCOMMOP, OLB_NONE) MACRO(XORPS, Reg3, None, RNON, f(MODRM), o(XORPS), DNO16|DOPEQ|DCOMMOP, OLB_0F) MACRO(PINSRW, Reg2, None, RNON, f(MODRM), o(PINSRW), DDST|DNO16|DSSE|D66, OLB_0F) +MACRO(PINSRD, Reg3, None, RNON, f(MODRM), o(PINSRD), DDST|DNO16|DSSE|D66, OLB_0F3A) +MACRO(PINSRQ, Reg3, None, RNON, f(MODRM), o(PINSRQ), DDST|DNO16|D66|DREXSRC|DSSE,OLB_0F3A) MACRO(POPCNT, Reg2, None, RNON, f(MODRM), o(POPCNT), DF3|DSETCC|DDST, OLB_0F) #undef o diff --git a/deps/chakrashim/core/lib/Backend/amd64/PeepsMD.cpp b/deps/chakrashim/core/lib/Backend/amd64/PeepsMD.cpp index 9d3992167eb..6b339e93b6b 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/PeepsMD.cpp +++ b/deps/chakrashim/core/lib/Backend/amd64/PeepsMD.cpp @@ -29,7 +29,7 @@ PeepsMD::ProcessImplicitRegs(IR::Instr *instr) { this->peeps->ClearReg(RegRDX); } - else if (instr->m_opcode == Js::OpCode::IDIV) + else if (instr->m_opcode == Js::OpCode::IDIV || instr->m_opcode == Js::OpCode::DIV) { if (instr->GetDst()->AsRegOpnd()->GetReg() == RegRDX) { @@ -62,7 +62,7 @@ PeepsMD::PeepAssign(IR::Instr *instr) { IR::Opnd* dst = instr->GetDst(); IR::Opnd* src = instr->GetSrc1(); - if(dst->IsRegOpnd() && instr->m_opcode == Js::OpCode::MOV) + if(dst->IsRegOpnd() && instr->m_opcode == Js::OpCode::MOV && !instr->isInlineeEntryInstr) { if (src->IsImmediateOpnd() && src->GetImmediateValue(instr->m_func) == 0) { @@ -78,7 +78,7 @@ PeepsMD::PeepAssign(IR::Instr *instr) instr->ReplaceSrc1(dst); instr->SetSrc2(dst); } - else if (!instr->isInlineeEntryInstr) + else { if(src->IsIntConstOpnd() && src->GetSize() <= TySize[TyUint32]) { diff --git a/deps/chakrashim/core/lib/Backend/amd64/Reg.h b/deps/chakrashim/core/lib/Backend/amd64/Reg.h index 924c8c66f07..1e36e1aa2aa 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/Reg.h +++ b/deps/chakrashim/core/lib/Backend/amd64/Reg.h @@ -11,7 +11,7 @@ #define RA_BYTEABLE 0x8 -enum RegNum { +enum RegNum : BYTE { #define REGDAT(Name, Listing, Encode, Type, BitVec) Reg ## Name, #include "RegList.h" RegNumCount, @@ -44,6 +44,7 @@ enum _XmmArgRegs { #define FIRST_FLOAT_REG RegXMM0 #define FIRST_FLOAT_ARG_REG RegXMM0 #define XMM_REGCOUNT 16 +#define CATCH_OBJ_REG RegRAX #define FOREACH_REG(reg) \ for (RegNum reg = (RegNum)(RegNOREG+1); reg != RegNumCount; reg = (RegNum)(reg+1)) diff --git a/deps/chakrashim/core/lib/Backend/amd64/RegList.h b/deps/chakrashim/core/lib/Backend/amd64/RegList.h index 7c2cdd3fcf8..4bfccca834e 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/RegList.h +++ b/deps/chakrashim/core/lib/Backend/amd64/RegList.h @@ -111,6 +111,10 @@ REG_XMM_ARG(1, XMM1) REG_XMM_ARG(2, XMM2) REG_XMM_ARG(3, XMM3) +#ifndef INT_ARG_REG_COUNT +#define INT_ARG_REG_COUNT 4 +#endif + #else // System V x64 REG_INT_ARG(0, RDI) REG_INT_ARG(1, RSI) @@ -127,6 +131,11 @@ REG_XMM_ARG(4, XMM4) REG_XMM_ARG(5, XMM5) REG_XMM_ARG(6, XMM6) REG_XMM_ARG(7, XMM7) + +#ifndef INT_ARG_REG_COUNT +#define INT_ARG_REG_COUNT 4 +#endif + #endif // !_WIN32 #undef REGDAT diff --git a/deps/chakrashim/core/lib/Backend/amd64/X64Encode.h b/deps/chakrashim/core/lib/Backend/amd64/X64Encode.h index 0d1f84002f9..2986ad81f83 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/X64Encode.h +++ b/deps/chakrashim/core/lib/Backend/amd64/X64Encode.h @@ -233,6 +233,7 @@ enum Forms : BYTE #define OPBYTE_MOVHLPS {0x12} // modrm #define OPBYTE_MOVHPD {0x16} // special +#define OPBYTE_MOVLPD {0x12} // special #define OPBYTE_MOVLHPS {0x16} // modrm #define OPBYTE_MOVMSKPD {0x50} // modrm #define OPBYTE_MOVMSKPS {0x50} // modrm @@ -264,6 +265,7 @@ enum Forms : BYTE #define OPBYTE_ORPS {0x56} // modrm #define OPBYTE_PADDB {0xfc} // modrm #define OPBYTE_PADDD {0xfe} // modrm +#define OPBYTE_PADDQ {0xd4} // modrm #define OPBYTE_PADDW {0xfd} // modrm #define OPBYTE_PADDSB {0xec} // modrm #define OPBYTE_PADDSW {0xed} // modrm @@ -292,19 +294,26 @@ enum Forms : BYTE #define OPBYTE_POPCNT {0xB8} // modrm #define OPBYTE_PSHUFD {0x70} // special #define OPBYTE_PEXTRW {0xc5} // special +#define OPBYTE_PEXTRD {0x16} // special +#define OPBYTE_PEXTRQ {0x16} // special #define OPBYTE_PINSRW {0xc4} // special +#define OPBYTE_PINSRD {0x22} // special +#define OPBYTE_PINSRQ {0x22} // special #define OPBYTE_PSLLDQ {0x73} // mmxshift #define OPBYTE_PSRLDQ {0x73} // mmxshift #define OPBYTE_PSLLW {0x71} // mmx lane shift #define OPBYTE_PSLLD {0x72} // mmx lane shift +#define OPBYTE_PSLLQ {0xf3} // mmx lane shift #define OPBYTE_PSRAW {0x71} // mmx lane shift #define OPBYTE_PSRAD {0x72} // mmx lane shift #define OPBYTE_PSRLW {0x71} // mmx lane shift #define OPBYTE_PSRLD {0x72} // mmx lane shift +#define OPBYTE_PSRLQ {0xd3} // mmx lane shift #define OPBYTE_PSUBB {0xf8} // modrm #define OPBYTE_PSUBD {0xfa} // modrm +#define OPBYTE_PSUBQ {0xfb} // modrm #define OPBYTE_PSUBW {0xf9} // modrm #define OPBYTE_PSUBSB {0xe8} // modrm #define OPBYTE_PSUBSW {0xe9} // modrm diff --git a/deps/chakrashim/core/lib/Backend/amd64/machvalues.h b/deps/chakrashim/core/lib/Backend/amd64/machvalues.h new file mode 100644 index 00000000000..a5676a0060d --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/amd64/machvalues.h @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#pragma once + +// +// Machine dependent constants. +// + +static const int MachInt = 4; +static const int MachRegInt = 8; +static const int MachPtr = 8; +static const int MachDouble = 8; +static const int MachRegDouble = 8; +static const int MachStackAlignment = MachPtr; +static const int MachArgsSlotOffset = MachPtr; +static const int MachMaxInstrSize = 12; +static const unsigned __int64 MachSignBit = 0x8000000000000000; +static const int MachSimd128 = 16; \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/amd64/md.h b/deps/chakrashim/core/lib/Backend/amd64/md.h index 2a9267b09e3..ff865ec0b6b 100644 --- a/deps/chakrashim/core/lib/Backend/amd64/md.h +++ b/deps/chakrashim/core/lib/Backend/amd64/md.h @@ -5,20 +5,6 @@ #pragma once -// -// Machine dependent constants. -// - -const int MachInt = 4; -const int MachRegInt = 8; -__declspec(selectany) const int MachPtr = 8; -const int MachDouble = 8; -const int MachRegDouble = 8; -const int MachStackAlignment = MachPtr; -const int MachArgsSlotOffset = MachPtr; -const int MachMaxInstrSize = 12; -const unsigned __int64 MachSignBit = 0x8000000000000000; -const int MachSimd128 = 16; // //review: shouldn't we use _PAGESIZE_ from heap.h instead of hardcoded 8KB. // @@ -37,6 +23,7 @@ const IRType TyMachSimd128B4 = TySimd128B4; const IRType TyMachSimd128B8 = TySimd128B8; const IRType TyMachSimd128B16 = TySimd128B16; const IRType TyMachSimd128D2 = TySimd128D2; +const IRType TyMachSimd128I2 = TySimd128I2; const DWORD EMIT_BUFFER_ALIGNMENT = 16; const DWORD INSTR_ALIGNMENT = 1; diff --git a/deps/chakrashim/core/lib/Backend/arm/EncoderMD.cpp b/deps/chakrashim/core/lib/Backend/arm/EncoderMD.cpp index 74674d7e3c6..8b8c785a80b 100644 --- a/deps/chakrashim/core/lib/Backend/arm/EncoderMD.cpp +++ b/deps/chakrashim/core/lib/Backend/arm/EncoderMD.cpp @@ -2205,17 +2205,18 @@ EncoderMD::BaseAndOffsetFromSym(IR::SymOpnd *symOpnd, RegNum *pBaseReg, int32 *p RegNum baseReg = func->GetLocalsPointer(); int32 offset = stackSym->m_offset + symOpnd->m_offset; + if (baseReg == RegSP) { // SP points to the base of the argument area. Non-reg SP points directly to the locals. offset += (func->m_argSlotsForFunctionsCalled * MachRegInt); - if (func->GetMaxInlineeArgOutCount()) + } + + if (func->HasInlinee()) + { + if ((!stackSym->IsArgSlotSym() || stackSym->m_isOrphanedArg) && !stackSym->IsParamSlotSym()) { - Assert(func->HasInlinee()); - if ((!stackSym->IsArgSlotSym() || stackSym->m_isOrphanedArg) && !stackSym->IsParamSlotSym()) - { - offset += func->GetInlineeArgumentStackSize(); - } + offset += func->GetInlineeArgumentStackSize(); } } @@ -2237,18 +2238,19 @@ EncoderMD::BaseAndOffsetFromSym(IR::SymOpnd *symOpnd, RegNum *pBaseReg, int32 *p Assert(offset >= 0); Assert(baseReg != RegSP || (uint)offset >= (func->m_argSlotsForFunctionsCalled * MachRegInt)); - if (func->GetMaxInlineeArgOutCount()) + if (func->GetMaxInlineeArgOutSize() != 0) { - Assert(baseReg == RegSP); + Assert(func->HasInlinee()); + Assert(baseReg == (func->HasTry() ? RegR7 : RegSP)); if (stackSym->IsArgSlotSym() && !stackSym->m_isOrphanedArg) { Assert(stackSym->m_isInlinedArgSlot); - Assert((uint)offset <= ((func->m_argSlotsForFunctionsCalled + func->GetMaxInlineeArgOutCount()) * MachRegInt)); + Assert((uint)offset <= func->m_argSlotsForFunctionsCalled * MachRegInt + func->GetMaxInlineeArgOutSize()); } else { AssertMsg(stackSym->IsAllocated(), "StackSym offset should be set"); - Assert((uint)offset > ((func->m_argSlotsForFunctionsCalled + func->GetMaxInlineeArgOutCount()) * MachRegInt)); + Assert(offset > (func->HasTry() ? (int32)func->GetMaxInlineeArgOutSize() : (int32)(func->m_argSlotsForFunctionsCalled * MachRegInt + func->GetMaxInlineeArgOutSize()))); } } // TODO: restore the following assert (very useful) once we have a way to tell whether prolog/epilog diff --git a/deps/chakrashim/core/lib/Backend/arm/LegalizeMD.cpp b/deps/chakrashim/core/lib/Backend/arm/LegalizeMD.cpp index 4e689d66cab..0ef5f00c0e0 100644 --- a/deps/chakrashim/core/lib/Backend/arm/LegalizeMD.cpp +++ b/deps/chakrashim/core/lib/Backend/arm/LegalizeMD.cpp @@ -518,7 +518,7 @@ void LegalizeMD::EmitRandomNopBefore(IR::Instr *insertInstr, UINT_PTR rand, RegN // We avoid target reg to avoid pipeline stalls. // Less likely target reg will be RegR12 as we insert nops only for user defined constants and // RegR12 is mostly used for temporary data such as legalizer post regalloc. - opnd1->SetReg(RegR12); + opnd1->SetReg(SCRATCH_REG); } switch ((rand >> 5) & 3) diff --git a/deps/chakrashim/core/lib/Backend/arm/LowerMD.cpp b/deps/chakrashim/core/lib/Backend/arm/LowerMD.cpp index 5a573fd2350..d8e495136d3 100644 --- a/deps/chakrashim/core/lib/Backend/arm/LowerMD.cpp +++ b/deps/chakrashim/core/lib/Backend/arm/LowerMD.cpp @@ -7,6 +7,7 @@ #include "Language/JavascriptFunctionArgIndex.h" const Js::OpCode LowererMD::MDUncondBranchOpcode = Js::OpCode::B; +const Js::OpCode LowererMD::MDMultiBranchOpcode = Js::OpCode::BX; const Js::OpCode LowererMD::MDTestOpcode = Js::OpCode::TST; const Js::OpCode LowererMD::MDOrOpcode = Js::OpCode::ORR; const Js::OpCode LowererMD::MDXorOpcode = Js::OpCode::EOR; @@ -16,6 +17,7 @@ const Js::OpCode LowererMD::MDConvertFloat32ToFloat64Opcode = Js::OpCode::VCVTF6 const Js::OpCode LowererMD::MDConvertFloat64ToFloat32Opcode = Js::OpCode::VCVTF32F64; const Js::OpCode LowererMD::MDCallOpcode = Js::OpCode::Call; const Js::OpCode LowererMD::MDImulOpcode = Js::OpCode::MUL; +const Js::OpCode LowererMD::MDLea = Js::OpCode::LEA; template inline void Swap(T& x, T& y) @@ -170,7 +172,7 @@ LowererMD::GenerateMemRef(intptr_t addr, IRType type, IR::Instr *instr, bool don { IR::RegOpnd *baseOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); IR::AddrOpnd *addrOpnd = IR::AddrOpnd::New(addr, IR::AddrOpndKindDynamicMisc, this->m_func, dontEncode); - LowererMD::CreateAssign(baseOpnd, addrOpnd, instr); + Lowerer::InsertMove(baseOpnd, addrOpnd, instr); return IR::IndirOpnd::New(baseOpnd, 0, type, this->m_func); } @@ -240,7 +242,7 @@ LowererMD::LowerCall(IR::Instr * callInstr, Js::ArgSlot argCount) AssertMsg(targetOpnd, "Call without a target?"); // This is required here due to calls created during lowering - callInstr->m_func->SetHasCalls(); + callInstr->m_func->SetHasCallsOnSelfAndParents(); if (targetOpnd->IsRegOpnd()) { @@ -313,18 +315,18 @@ LowererMD::LowerCall(IR::Instr * callInstr, Js::ArgSlot argCount) IR::Opnd *helperArgOpnd = this->helperCallArgs[this->helperCallArgsCount - argsLeft]; IR::Opnd * opndParam = nullptr; - if (helperArgOpnd->GetType() == TyMachDouble) + if (helperArgOpnd->IsFloat()) { - opndParam = this->GetOpndForArgSlot(doubleArgsLeft - 1, true); + opndParam = this->GetOpndForArgSlot(doubleArgsLeft - 1, helperArgOpnd); AssertMsg(opndParam->IsRegOpnd(), "NYI for other kind of operands"); --doubleArgsLeft; } else { - opndParam = this->GetOpndForArgSlot(intArgsLeft - 1); + opndParam = this->GetOpndForArgSlot(intArgsLeft - 1, helperArgOpnd); --intArgsLeft; } - LowererMD::CreateAssign(opndParam, helperArgOpnd, callInstr); + Lowerer::InsertMove(opndParam, helperArgOpnd, callInstr); --argsLeft; } Assert(doubleArgsLeft == 0 && intArgsLeft == 0 && argsLeft == 0); @@ -401,14 +403,14 @@ LowererMD::LowerCallIDynamic(IR::Instr *callInstr, IR::Instr*saveThisArgOutInstr callInstr->InsertBefore(IR::Instr::New(Js::OpCode::ADD, argsLength, argsLength, IR::IntConstOpnd::New(1, TyInt8, this->m_func), this->m_func)); this->SetMaxArgSlots(Js::InlineeCallInfo::MaxInlineeArgoutCount); } - LowererMD::CreateAssign( this->GetOpndForArgSlot(1), argsLength, callInstr); + Lowerer::InsertMove( this->GetOpndForArgSlot(1), argsLength, callInstr); IR::RegOpnd *funcObjOpnd = callInstr->UnlinkSrc1()->AsRegOpnd(); GeneratePreCall(callInstr, funcObjOpnd); // functionOpnd is the first argument. IR::Opnd * opndParam = this->GetOpndForArgSlot(0); - LowererMD::CreateAssign(opndParam, funcObjOpnd, callInstr); + Lowerer::InsertMove(opndParam, funcObjOpnd, callInstr); return this->LowerCall(callInstr, 0); } @@ -477,7 +479,7 @@ LowererMD::GeneratePreCall(IR::Instr * callInstr, IR::Opnd *functionObjOpnd) IR::IndirOpnd* functionTypeIndirOpnd = IR::IndirOpnd::New(functionObjOpnd->AsRegOpnd(), Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); - LowererMD::CreateAssign(functionTypeRegOpnd, functionTypeIndirOpnd, callInstr); + Lowerer::InsertMove(functionTypeRegOpnd, functionTypeIndirOpnd, callInstr); } else { @@ -487,7 +489,7 @@ LowererMD::GeneratePreCall(IR::Instr * callInstr, IR::Opnd *functionObjOpnd) int entryPointOffset = Js::Type::GetOffsetOfEntryPoint(); IR::IndirOpnd* entryPointOpnd = IR::IndirOpnd::New(functionTypeRegOpnd, entryPointOffset, TyMachPtr, this->m_func); IR::RegOpnd * targetAddrOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::Instr * stackParamInsert = LowererMD::CreateAssign(targetAddrOpnd, entryPointOpnd, callInstr); + IR::Instr * stackParamInsert = Lowerer::InsertMove(targetAddrOpnd, entryPointOpnd, callInstr); // targetAddrOpnd is the address we'll call. callInstr->SetSrc1(targetAddrOpnd); @@ -544,7 +546,7 @@ LowererMD::LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper, IR // functionObjOpnd is the first argument. IR::Opnd * opndParam = this->GetOpndForArgSlot(0); - LowererMD::CreateAssign(opndParam, functionObjOpnd, callInstr); + Lowerer::InsertMove(opndParam, functionObjOpnd, callInstr); IR::Opnd *const finalDst = callInstr->GetDst(); @@ -654,32 +656,11 @@ LowererMD::LowerCallArgs(IR::Instr *callInstr, IR::Instr *stackParamInsert, usho *callInfoOpndRef = opndCallInfo; } opndParam = this->GetOpndForArgSlot(extraParams); - LowererMD::CreateAssign(opndParam, opndCallInfo, callInstr); + Lowerer::InsertMove(opndParam, opndCallInfo, callInstr); return argCount + 1 + extraParams; // + 1 for call flags } -IR::Instr * -LowererMD::LowerCallPut(IR::Instr * callInstr) -{ - Js::ArgSlot argCount = (Js::ArgSlot)this->LowerCallArgs(callInstr, Js::CallFlags_None, 2); - - // load native entry point from script function - IR::Opnd * functionWrapOpnd = callInstr->UnlinkSrc1(); - AssertMsg(functionWrapOpnd->IsRegOpnd() && functionWrapOpnd->AsRegOpnd()->m_sym->IsStackSym(), - "Expected call src to be stackSym"); - - // push function wrapper - - this->LoadHelperArgument(callInstr, functionWrapOpnd); - this->m_lowerer->LoadScriptContext(callInstr); - - IR::HelperCallOpnd *helperCallOpnd = IR::HelperCallOpnd::New(IR::HelperOp_InvokePut, this->m_func); - callInstr->SetSrc1(helperCallOpnd); - - return this->LowerCall(callInstr, argCount); -} - IR::Instr * LowererMD::LowerStartCall(IR::Instr * instr) { @@ -716,17 +697,18 @@ LowererMD::FinishArgLowering() } IR::Opnd * -LowererMD::GetOpndForArgSlot(Js::ArgSlot argSlot, bool isDoubleArgument) +LowererMD::GetOpndForArgSlot(Js::ArgSlot argSlot, IR::Opnd * argOpnd) { IR::Opnd * opndParam = nullptr; - if (!isDoubleArgument) + IRType type = argOpnd ? argOpnd->GetType() : TyMachReg; + if (argOpnd == nullptr || !argOpnd->IsFloat()) { if (argSlot < NUM_INT_ARG_REGS) { // Return an instance of the next arg register. IR::RegOpnd *regOpnd; - regOpnd = IR::RegOpnd::New(nullptr, (RegNum)(argSlot + FIRST_INT_ARG_REG), TyMachReg, this->m_func); + regOpnd = IR::RegOpnd::New(nullptr, (RegNum)(argSlot + FIRST_INT_ARG_REG), type, this->m_func); regOpnd->m_isCallArg = true; @@ -739,7 +721,7 @@ LowererMD::GetOpndForArgSlot(Js::ArgSlot argSlot, bool isDoubleArgument) argSlot = argSlot - NUM_INT_ARG_REGS; IntConstType offset = argSlot * MachRegInt; IR::RegOpnd * spBase = IR::RegOpnd::New(nullptr, this->GetRegStackPointer(), TyMachReg, this->m_func); - opndParam = IR::IndirOpnd::New(spBase, offset, TyMachReg, this->m_func); + opndParam = IR::IndirOpnd::New(spBase, offset, type, this->m_func); if (this->m_func->m_argSlotsForFunctionsCalled < (uint32)(argSlot + 1)) { @@ -753,7 +735,7 @@ LowererMD::GetOpndForArgSlot(Js::ArgSlot argSlot, bool isDoubleArgument) { // Return an instance of the next arg register. IR::RegOpnd *regOpnd; - regOpnd = IR::RegOpnd::New(nullptr, (RegNum)(argSlot + FIRST_DOUBLE_ARG_REG), TyMachDouble, this->m_func); + regOpnd = IR::RegOpnd::New(nullptr, (RegNum)(argSlot + FIRST_DOUBLE_ARG_REG), type, this->m_func); regOpnd->m_isCallArg = true; opndParam = regOpnd; } @@ -822,8 +804,8 @@ LowererMD::GenerateStackProbe(IR::Instr *insertInstr, bool afterProlog) // Load the current stack limit and add the current frame allocation. { intptr_t pLimit = m_func->GetThreadContextInfo()->GetThreadStackLimitAddr(); - this->CreateAssign(scratchOpnd, IR::AddrOpnd::New(pLimit, IR::AddrOpndKindDynamicMisc, this->m_func), insertInstr); - this->CreateAssign(scratchOpnd, IR::IndirOpnd::New(scratchOpnd, 0, TyMachReg, this->m_func), insertInstr); + Lowerer::InsertMove(scratchOpnd, IR::AddrOpnd::New(pLimit, IR::AddrOpndKindDynamicMisc, this->m_func), insertInstr); + Lowerer::InsertMove(scratchOpnd, IR::IndirOpnd::New(scratchOpnd, 0, TyMachReg, this->m_func), insertInstr); } if (EncoderMD::CanEncodeModConst12(frameSize)) @@ -854,7 +836,7 @@ LowererMD::GenerateStackProbe(IR::Instr *insertInstr, bool afterProlog) } IR::Opnd *scratchOpnd2 = IR::RegOpnd::New(nullptr, SP_ALLOC_SCRATCH_REG, TyMachReg, this->m_func); - this->CreateAssign(scratchOpnd2, IR::IntConstOpnd::New(frameSize, TyMachReg, this->m_func), insertInstr); + Lowerer::InsertMove(scratchOpnd2, IR::IntConstOpnd::New(frameSize, TyMachReg, this->m_func), insertInstr); instr = IR::Instr::New(Js::OpCode::ADDS, scratchOpnd, scratchOpnd, scratchOpnd2, this->m_func); insertInstr->InsertBefore(instr); @@ -878,7 +860,7 @@ LowererMD::GenerateStackProbe(IR::Instr *insertInstr, bool afterProlog) { uint32 scriptStackLimit = (uint32)m_func->GetThreadContextInfo()->GetScriptStackLimit(); IR::Opnd *stackLimitOpnd = IR::IntConstOpnd::New(frameSize + scriptStackLimit, TyMachReg, this->m_func); - this->CreateAssign(scratchOpnd, stackLimitOpnd, insertInstr); + Lowerer::InsertMove(scratchOpnd, stackLimitOpnd, insertInstr); } IR::LabelInstr *doneLabelInstr = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, false); @@ -898,19 +880,19 @@ LowererMD::GenerateStackProbe(IR::Instr *insertInstr, bool afterProlog) // Zero out the pointer to the list of stack nested funcs, since the functions won't be initialized on this path. scratchOpnd = IR::RegOpnd::New(nullptr, RegR0, TyMachReg, m_func); IR::RegOpnd *frameReg = IR::RegOpnd::New(nullptr, GetRegFramePointer(), TyMachReg, m_func); - CreateAssign(scratchOpnd, IR::IntConstOpnd::New(0, TyMachReg, m_func), insertInstr); + Lowerer::InsertMove(scratchOpnd, IR::IntConstOpnd::New(0, TyMachReg, m_func), insertInstr); IR::Opnd *indirOpnd = IR::IndirOpnd::New( frameReg, -(int32)(Js::Constants::StackNestedFuncList * sizeof(Js::Var)), TyMachReg, m_func); - CreateAssign(indirOpnd, scratchOpnd, insertInstr); + Lowerer::InsertMove(indirOpnd, scratchOpnd, insertInstr); IR::RegOpnd *r0Opnd = IR::RegOpnd::New(nullptr, RegR0, TyMachReg, this->m_func); - this->CreateAssign(r0Opnd, IR::IntConstOpnd::New(frameSize, TyMachReg, this->m_func, true), insertInstr); + Lowerer::InsertMove(r0Opnd, IR::IntConstOpnd::New(frameSize, TyMachReg, this->m_func, true), insertInstr); IR::RegOpnd *r1Opnd = IR::RegOpnd::New(nullptr, RegR1, TyMachReg, this->m_func); - this->CreateAssign(r1Opnd, this->m_lowerer->LoadScriptContextOpnd(insertInstr), insertInstr); + Lowerer::InsertMove(r1Opnd, this->m_lowerer->LoadScriptContextOpnd(insertInstr), insertInstr); IR::RegOpnd *r2Opnd = IR::RegOpnd::New(nullptr, RegR2, TyMachReg, m_func); - this->CreateAssign(r2Opnd, IR::HelperCallOpnd::New(IR::HelperProbeCurrentStack, this->m_func), insertInstr); + Lowerer::InsertMove(r2Opnd, IR::HelperCallOpnd::New(IR::HelperProbeCurrentStack, this->m_func), insertInstr); instr = IR::Instr::New(afterProlog? Js::OpCode::BLX : Js::OpCode::BX, this->m_func); instr->SetSrc1(r2Opnd); @@ -1071,7 +1053,12 @@ LowererMD::LowerEntryInstr(IR::EntryInstr * entryInstr) // } //#endif - + if (this->m_func->HasInlinee()) + { + // Allocate the inlined arg out stack in the locals. Allocate an additional slot so that + // we can unconditionally clear the first slot past the current frame. + this->m_func->m_localStackHeight += this->m_func->GetInlineeArgumentStackSize(); + } //First calculate the local stack if (hasTry) { @@ -1082,14 +1069,6 @@ LowererMD::LowerEntryInstr(IR::EntryInstr * entryInstr) this->m_func->m_localStackHeight = Math::Align(this->m_func->m_localStackHeight, MachStackAlignment); } - if (this->m_func->GetMaxInlineeArgOutCount()) - { - Assert(this->m_func->HasInlinee()); - // Allocate the inlined arg out stack in the locals. Allocate an additional slot so that - // we can unconditionally clear the first slot past the current frame. - this->m_func->m_localStackHeight += this->m_func->GetInlineeArgumentStackSize(); - } - int32 stackAdjust = this->m_func->m_localStackHeight + (this->m_func->m_argSlotsForFunctionsCalled * MachPtr); if (stackAdjust != 0) { @@ -1341,7 +1320,7 @@ LowererMD::LowerEntryInstr(IR::EntryInstr * entryInstr) } Assert(fpOffsetSize >= 0); - if (this->m_func->GetMaxInlineeArgOutCount()) + if (m_func->GetMaxInlineeArgOutSize() != 0) { // subtracting 2 for frame pointer & return address this->m_func->GetJITOutput()->SetFrameHeight(this->m_func->m_localStackHeight + this->m_func->m_ArgumentsOffset - 2 * MachRegInt); @@ -1421,7 +1400,7 @@ LowererMD::LowerEntryInstr(IR::EntryInstr * entryInstr) if (hasTry) { // Copy the value of SP before we allocate the locals area. We'll save this value on the stack below. - LowererMD::CreateAssign( + Lowerer::InsertMove( IR::RegOpnd::New(nullptr, EH_STACK_SAVE_REG, TyMachReg, this->m_func), IR::RegOpnd::New(nullptr, RegSP, TyMachReg, this->m_func), insertInstr); @@ -1449,7 +1428,7 @@ LowererMD::LowerEntryInstr(IR::EntryInstr * entryInstr) } // Set up the locals pointer. - LowererMD::CreateAssign( + Lowerer::InsertMove( IR::RegOpnd::New(nullptr, localsReg, TyMachReg, this->m_func), IR::RegOpnd::New(nullptr, RegSP, TyMachReg, this->m_func), insertInstr); @@ -1480,7 +1459,7 @@ LowererMD::LowerEntryInstr(IR::EntryInstr * entryInstr) //As we have already allocated the stack here, we can safely zero out the inlinee argout slot. // Zero initialize the first inlinee frames argc. - if (this->m_func->GetMaxInlineeArgOutCount()) + if (m_func->GetMaxInlineeArgOutSize() != 0) { // This is done post prolog. so we don't have to emit unwind data. if (r12Opnd == nullptr || isScratchRegisterThrashed) @@ -1540,7 +1519,7 @@ LowererMD::LowerExitInstr(IR::ExitInstr * exitInstr) else if (localsReg != RegSP) { // We're going to restore SP from the locals pointer and then deallocate only the locals area. - LowererMD::CreateAssign( + Lowerer::InsertMove( IR::RegOpnd::New(nullptr, RegSP, TyMachReg, this->m_func), IR::RegOpnd::New(nullptr, localsReg, TyMachReg, this->m_func), exitInstr); @@ -1614,7 +1593,7 @@ LowererMD::LowerExitInstr(IR::ExitInstr * exitInstr) this->m_func); exitInstr->InsertBefore(instrPop); - LowererMD::CreateAssign( + Lowerer::InsertMove( IR::RegOpnd::New(nullptr, RegSP, TyMachReg, this->m_func), IR::RegOpnd::New(nullptr, EH_STACK_SAVE_REG, TyMachReg, this->m_func), exitInstr); @@ -1734,7 +1713,7 @@ LowererMD::LowerTry(IR::Instr * tryInstr, IR::JnHelperMethod helperMethod) if (tryInstr->m_opcode == Js::OpCode::TryCatch || this->m_func->DoOptimizeTry()) { // Arg 6 : hasBailedOutOffset - IR::Opnd * hasBailedOutOffset = IR::IntConstOpnd::New(this->m_func->m_hasBailedOutSym->m_offset, TyInt32, this->m_func); + IR::Opnd * hasBailedOutOffset = IR::IntConstOpnd::New(this->m_func->m_hasBailedOutSym->m_offset + tryInstr->m_func->GetInlineeArgumentStackSize(), TyInt32, this->m_func); this->LoadHelperArgument(tryAddr, hasBailedOutOffset); } @@ -1774,28 +1753,6 @@ LowererMD::LowerTry(IR::Instr * tryInstr, IR::JnHelperMethod helperMethod) return tryInstr->m_prev; } -IR::Instr * -LowererMD::LowerLeave(IR::Instr * leaveInstr, IR::LabelInstr * targetInstr, bool fromFinalLower, bool isOrphanedLeave) -{ - if (isOrphanedLeave) - { - Assert(this->m_func->IsLoopBodyInTry()); - leaveInstr->m_opcode = Js::OpCode::B; - return leaveInstr->m_prev; - } - - IR::Instr * instrPrev = leaveInstr->m_prev; - IR::LabelOpnd *labelOpnd = IR::LabelOpnd::New(targetInstr, this->m_func); - this->LowerEHRegionReturn(leaveInstr, labelOpnd); - - if (fromFinalLower) - { - instrPrev = leaveInstr->m_prev; - } - leaveInstr->Remove(); - return instrPrev; -} - IR::Instr * LowererMD::LowerLeaveNull(IR::Instr * leaveInstr) { @@ -1814,7 +1771,7 @@ LowererMD::LowerEHRegionReturn(IR::Instr * insertBeforeInstr, IR::Opnd * targetO IR::RegOpnd *retReg = IR::RegOpnd::New(nullptr, RETURN_REG, TyMachReg, this->m_func); // Load the continuation address into the return register. - LowererMD::CreateAssign(retReg, targetOpnd, insertBeforeInstr); + Lowerer::InsertMove(retReg, targetOpnd, insertBeforeInstr); IR::LabelInstr *epilogLabel = this->EnsureEpilogLabel(); IR::BranchInstr *jmpInstr = IR::BranchInstr::New(Js::OpCode::B, epilogLabel, this->m_func); @@ -1824,23 +1781,6 @@ LowererMD::LowerEHRegionReturn(IR::Instr * insertBeforeInstr, IR::Opnd * targetO return jmpInstr; } -IR::Instr * -LowererMD::LowerCatch(IR::Instr * instr) -{ - // t1 = catch => t2(r1) = catch - // => t1 = t2(r1) - - IR::Opnd *catchObj = instr->UnlinkDst(); - IR::RegOpnd *catchParamReg = IR::RegOpnd::New(TyMachPtr, this->m_func); - catchParamReg->SetReg(CATCH_OBJ_REG); - - instr->SetDst(catchParamReg); - - instr->InsertAfter(IR::Instr::New(Js::OpCode::MOV, catchObj, catchParamReg, this->m_func)); - - return instr->m_prev; -} - ///---------------------------------------------------------------------------- /// /// LowererMD::Init @@ -1879,10 +1819,7 @@ LowererMD::LoadInputParamPtr(IR::Instr * instrInsert, IR::RegOpnd * optionalDstO else { StackSym * paramSym = GetImplicitParamSlotSym(3); - - IR::Instr * instr = this->LoadStackAddress(paramSym); - instrInsert->InsertBefore(instr); - return instr; + return this->m_lowerer->InsertLoadStackAddress(paramSym, instrInsert); } } @@ -1918,27 +1855,13 @@ LowererMD::LoadInputParamCount(IR::Instr * instrInsert, int adjust, bool needFla // mask the "calling eval" bit and subtract it from the incoming count. // ("Calling eval" means the last param is the frame display, which only the eval built-in should see.) - IR::RegOpnd * evalBitOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::LSR, evalBitOpnd, dstOpnd, IR::IntConstOpnd::New(Math::Log2(Js::CallFlags_ExtraArg) + Js::CallInfo::ksizeofCount, TyMachReg, this->m_func), this->m_func); - instrInsert->InsertBefore(instr); - - // Mask off other call flags from callinfo - instr = IR::Instr::New(Js::OpCode::AND, evalBitOpnd, evalBitOpnd, IR::IntConstOpnd::New(0x01, TyUint8, this->m_func), this->m_func); - instrInsert->InsertBefore(instr); - instr = IR::Instr::New(Js::OpCode::LSL, dstOpnd, dstOpnd, IR::IntConstOpnd::New(Js::CallInfo::ksizeofCallFlags, TyMachReg, this->m_func), this->m_func); instrInsert->InsertBefore(instr); instr = IR::Instr::New(Js::OpCode::LSR, dstOpnd, dstOpnd, IR::IntConstOpnd::New(Js::CallInfo::ksizeofCallFlags, TyMachReg, this->m_func), this->m_func); instrInsert->InsertBefore(instr); - if (adjust != 0) - { - Assert(adjust < 0); - Lowerer::InsertAdd(false, evalBitOpnd, evalBitOpnd, IR::IntConstOpnd::New(-adjust, TyUint32, this->m_func), instrInsert); - } - - return Lowerer::InsertSub(needFlags, dstOpnd, dstOpnd, evalBitOpnd, instrInsert); + return Lowerer::InsertSub(needFlags, dstOpnd, dstOpnd, IR::IntConstOpnd::New(-adjust, TyUint32, this->m_func), instrInsert); } IR::Instr * @@ -1957,7 +1880,7 @@ LowererMD::LoadStackArgPtr(IR::Instr * instr) size_t offset = Js::InterpreterStackFrame::GetOffsetOfInParams(); IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(baseOpnd, (int32)offset, TyMachReg, this->m_func); IR::RegOpnd *tmpOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - LowererMD::CreateAssign(tmpOpnd, indirOpnd, instr); + Lowerer::InsertMove(tmpOpnd, indirOpnd, instr); instr->SetSrc1(tmpOpnd); instr->SetSrc2(IR::IntConstOpnd::New(sizeof(Js::Var), TyMachReg, this->m_func)); @@ -2101,8 +2024,7 @@ LowererMD::LoadHeapArguments(IR::Instr * instrArgs) // s3 = address of first actual argument (after "this"). StackSym *firstRealArgSlotSym = func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); this->m_func->SetArgOffset(firstRealArgSlotSym, firstRealArgSlotSym->m_offset + MachPtr); - IR::Instr *instr = this->LoadStackAddress(firstRealArgSlotSym); - instrArgs->InsertBefore(instr); + IR::Instr *instr = this->m_lowerer->InsertLoadStackAddress(firstRealArgSlotSym, instrArgs); this->LoadHelperArgument(instrArgs, instr->GetDst()); // s2 = actual argument count (without counting "this"). @@ -2113,7 +2035,7 @@ LowererMD::LoadHeapArguments(IR::Instr * instrArgs) // Save the newly-created args object to its dedicated stack slot. IR::SymOpnd *argObjSlotOpnd = func->GetInlineeArgumentsObjectSlotOpnd(); - LowererMD::CreateAssign(argObjSlotOpnd,instrArgs->GetDst(), instrArgs->m_next); + Lowerer::InsertMove(argObjSlotOpnd,instrArgs->GetDst(), instrArgs->m_next); } else { @@ -2136,7 +2058,7 @@ LowererMD::LoadHeapArguments(IR::Instr * instrArgs) // Save the newly-created args object to its dedicated stack slot. IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(IR::RegOpnd::New(nullptr, FRAME_REG , TyMachReg, func), -MachArgsSlotOffset, TyMachPtr, m_func); - LowererMD::CreateAssign(indirOpnd, instrArgs->GetDst(), instrArgs->m_next); + Lowerer::InsertMove(indirOpnd, instrArgs->GetDst(), instrArgs->m_next); } this->ChangeToHelperCall(instrArgs, IR::HelperOp_LoadHeapArguments); } @@ -2199,8 +2121,7 @@ LowererMD::LoadHeapArgsCached(IR::Instr * instrArgs) StackSym *firstRealArgSlotSym = func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); this->m_func->SetArgOffset(firstRealArgSlotSym, firstRealArgSlotSym->m_offset + MachPtr); - IR::Instr *instr = this->LoadStackAddress(firstRealArgSlotSym); - instrArgs->InsertBefore(instr); + IR::Instr *instr = this->m_lowerer->InsertLoadStackAddress(firstRealArgSlotSym, instrArgs); this->LoadHelperArgument(instrArgs, instr->GetDst()); // s3 = formal argument count (without counting "this"). @@ -2215,7 +2136,7 @@ LowererMD::LoadHeapArgsCached(IR::Instr * instrArgs) // Save the newly-created args object to its dedicated stack slot. IR::SymOpnd *argObjSlotOpnd = func->GetInlineeArgumentsObjectSlotOpnd(); - LowererMD::CreateAssign(argObjSlotOpnd, instrArgs->GetDst(), instrArgs->m_next); + Lowerer::InsertMove(argObjSlotOpnd, instrArgs->GetDst(), instrArgs->m_next); } else { @@ -2240,7 +2161,7 @@ LowererMD::LoadHeapArgsCached(IR::Instr * instrArgs) // Save the newly-created args object to its dedicated stack slot. IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(IR::RegOpnd::New(nullptr, FRAME_REG, TyMachReg, func), -MachArgsSlotOffset, TyMachPtr, m_func); - LowererMD::CreateAssign(indirOpnd, instrArgs->GetDst(), instrArgs->m_next); + Lowerer::InsertMove(indirOpnd, instrArgs->GetDst(), instrArgs->m_next); } @@ -2380,43 +2301,6 @@ LowererMD::ChangeToWriteBarrierAssign(IR::Instr * assignInstr, const Func* func) return ChangeToAssignNoBarrierCheck(assignInstr); } -///---------------------------------------------------------------------------- -/// -/// LowererMD::ChangeToLea -/// -/// Change to a load-effective-address -/// -///---------------------------------------------------------------------------- - -IR::Instr * -LowererMD::ChangeToLea(IR::Instr * instr, bool postRegAlloc) -{ - Assert(instr); - Assert(instr->GetDst()); - Assert(instr->GetDst()->IsRegOpnd()); - Assert(instr->GetSrc1()); - Assert(instr->GetSrc1()->IsIndirOpnd() || instr->GetSrc1()->IsSymOpnd()); - Assert(!instr->GetSrc2()); - - instr->m_opcode = Js::OpCode::LEA; - Legalize(instr, postRegAlloc); - return instr; -} - -///---------------------------------------------------------------------------- -/// -/// LowererMD::CreateAssign -/// -/// Create a copy from src to dst. Let ChangeToAssign handle riscification -/// of operands. -///---------------------------------------------------------------------------- - -IR::Instr * -LowererMD::CreateAssign(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsertPt, bool generateWriteBarrier) -{ - return Lowerer::InsertMove(dst, src, instrInsertPt, generateWriteBarrier); -} - ///---------------------------------------------------------------------------- /// /// LowererMD::LowerRet @@ -2439,33 +2323,6 @@ LowererMD::LowerRet(IR::Instr * retInstr) return retInstr; } - -///---------------------------------------------------------------------------- -/// -/// LowererMD::LowerUncondBranch -/// -///---------------------------------------------------------------------------- - -IR::Instr * -LowererMD::LowerUncondBranch(IR::Instr * instr) -{ - instr->m_opcode = Js::OpCode::B; - return instr; -} - -///---------------------------------------------------------------------------- -/// -/// LowererMD::LowerMultiBranch -/// -///---------------------------------------------------------------------------- - -IR::Instr * -LowererMD::LowerMultiBranch(IR::Instr * instr) -{ - instr->m_opcode = Js::OpCode::BX; - return instr; -} - ///---------------------------------------------------------------------------- /// /// LowererMD::MDBranchOpcode @@ -2801,7 +2658,7 @@ LowererMD::LoadFunctionObjectOpnd(IR::Instr *instr, IR::Opnd *&functionObjOpnd) StackSym *paramSym = GetImplicitParamSlotSym(0); IR::SymOpnd *paramOpnd = IR::SymOpnd::New(paramSym, TyMachPtr, m_func); - instrPrev = LowererMD::CreateAssign(regOpnd, paramOpnd, instr); + instrPrev = Lowerer::InsertMove(regOpnd, paramOpnd, instr); functionObjOpnd = instrPrev->GetDst(); } else @@ -2817,19 +2674,6 @@ LowererMD::LoadFunctionObjectOpnd(IR::Instr *instr, IR::Opnd *&functionObjOpnd) return instrPrev; } -IR::Instr * -LowererMD::LowerLdSuper(IR::Instr * instr, IR::JnHelperMethod helperOpCode) -{ - IR::Opnd * functionObjOpnd; - IR::Instr * instrPrev = LoadFunctionObjectOpnd(instr, functionObjOpnd); - - m_lowerer->LoadScriptContext(instr); - LoadHelperArgument(instr, functionObjOpnd); - ChangeToHelperCall(instr, helperOpCode); - - return instrPrev; -} - void LowererMD::GenerateFastDivByPow2(IR::Instr *instrDiv) { @@ -2937,8 +2781,7 @@ LowererMD::GenerateFastDivByPow2(IR::Instr *instrDiv) // Assert(dst->IsRegOpnd()); // StackSym * tempNumberSym = this->m_lowerer->GetTempNumberSym(dst, instr->dstIsTempNumberTransferred); - // instr = this->LoadStackAddress(tempNumberSym); - // instrDiv->InsertBefore(instr); + // instr = this->m_lowerer->InsertLoadStackAddress(tempNumberSym, instrDiv); // LegalizeMD::LegalizeInstr(instr, false); // this->LoadHelperArgument(instrDiv, instr->GetDst()); @@ -3123,13 +2966,13 @@ bool LowererMD::GenerateFastCmXxTaggedInt(IR::Instr *instr, bool isInHelper /* if (dst->IsEqual(src1)) { IR::RegOpnd *newSrc1 = IR::RegOpnd::New(TyMachReg, m_func); - LowererMD::CreateAssign(newSrc1, src1, instr); + Lowerer::InsertMove(newSrc1, src1, instr); src1 = newSrc1; } if (dst->IsEqual(src2)) { IR::RegOpnd *newSrc2 = IR::RegOpnd::New(TyMachReg, m_func); - LowererMD::CreateAssign(newSrc2, src2, instr); + Lowerer::InsertMove(newSrc2, src2, instr); src2 = newSrc2; } @@ -3271,13 +3114,13 @@ LowererMD::GenerateFastAdd(IR::Instr * instrAdd) if (!opndSrc1->IsRegOpnd()) { opndSrc1 = IR::RegOpnd::New(opndSrc1->GetType(), this->m_func); - LowererMD::CreateAssign(opndSrc1, instrAdd->GetSrc1(), instrAdd); + Lowerer::InsertMove(opndSrc1, instrAdd->GetSrc1(), instrAdd); } if (!opndSrc2->IsRegOpnd()) { opndSrc2 = IR::RegOpnd::New(opndSrc2->GetType(), this->m_func); - LowererMD::CreateAssign(opndSrc2, instrAdd->GetSrc2(), instrAdd); + Lowerer::InsertMove(opndSrc2, instrAdd->GetSrc2(), instrAdd); } labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); @@ -3311,7 +3154,7 @@ LowererMD::GenerateFastAdd(IR::Instr * instrAdd) instrAdd->InsertBefore(instr); // dst = MOV tmp - LowererMD::CreateAssign(instrAdd->GetDst(), opndTmp, instrAdd); + Lowerer::InsertMove(instrAdd->GetDst(), opndTmp, instrAdd); // B $done labelDone = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); @@ -3375,13 +3218,13 @@ LowererMD::GenerateFastSub(IR::Instr * instrSub) if (!opndSrc1->IsRegOpnd()) { opndSrc1 = IR::RegOpnd::New(opndSrc1->GetType(), this->m_func); - LowererMD::CreateAssign(opndSrc1, instrSub->GetSrc1(), instrSub); + Lowerer::InsertMove(opndSrc1, instrSub->GetSrc1(), instrSub); } if (!opndSrc2->IsRegOpnd()) { opndSrc2 = IR::RegOpnd::New(opndSrc2->GetType(), this->m_func); - LowererMD::CreateAssign(opndSrc2, instrSub->GetSrc2(), instrSub); + Lowerer::InsertMove(opndSrc2, instrSub->GetSrc2(), instrSub); } labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); @@ -3486,13 +3329,13 @@ LowererMD::GenerateFastMul(IR::Instr * instrMul) if (!opndSrc1->IsRegOpnd()) { opndSrc1 = IR::RegOpnd::New(opndSrc1->GetType(), this->m_func); - LowererMD::CreateAssign(opndSrc1, instrMul->GetSrc1(), instrMul); + Lowerer::InsertMove(opndSrc1, instrMul->GetSrc1(), instrMul); } if (!opndSrc2->IsRegOpnd()) { opndSrc2 = IR::RegOpnd::New(opndSrc2->GetType(), this->m_func); - LowererMD::CreateAssign(opndSrc2, instrMul->GetSrc2(), instrMul); + Lowerer::InsertMove(opndSrc2, instrMul->GetSrc2(), instrMul); } bool isTaggedInts = opndSrc1->IsTaggedInt() && opndSrc2->IsTaggedInt(); @@ -3519,9 +3362,9 @@ LowererMD::GenerateFastMul(IR::Instr * instrMul) // (SMULL doesn't set the flags but we don't have 32bit overflow <=> r12-unsigned ? r12==0 : all 33 bits of 64bit result are 1's // CMP r12, s1, ASR #31 -- check for overflow (== means no overflow) - IR::RegOpnd* opndRegR12 = IR::RegOpnd::New(nullptr, RegR12, TyMachReg, this->m_func); + IR::RegOpnd* opndRegScratch = IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachReg, this->m_func); instr = IR::Instr::New(Js::OpCode::CMP_ASR31, this->m_func); - instr->SetSrc1(opndRegR12); + instr->SetSrc1(opndRegScratch); instr->SetSrc2(opndReg1); instrMul->InsertBefore(instr); @@ -3549,8 +3392,8 @@ LowererMD::GenerateFastMul(IR::Instr * instrMul) instrMul->InsertBefore(instr); // dst= ToVar(-0.0) -- load negative 0 - instr = LowererMD::CreateAssign(instrMul->GetDst(), m_lowerer->LoadLibraryValueOpnd(instrMul, LibraryValue::ValueNegativeZero), instrMul); - // No need to insert: CreateAssign creates legalized instr and inserts it. + instr = Lowerer::InsertMove(instrMul->GetDst(), m_lowerer->LoadLibraryValueOpnd(instrMul, LibraryValue::ValueNegativeZero), instrMul); + // No need to insert: InsertMove creates legalized instr and inserts it. // B $fallthru instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, this->m_func); @@ -3672,7 +3515,7 @@ LowererMD::GenerateFastAnd(IR::Instr * instrAnd) instrAnd->InsertBefore(instr); // dst = STR dstReg - LowererMD::CreateAssign(instrAnd->GetDst(), dst, instrAnd); + Lowerer::InsertMove(instrAnd->GetDst(), dst, instrAnd); // B $done instr = IR::BranchInstr::New(Js::OpCode::B, labelDone, this->m_func); @@ -3736,13 +3579,13 @@ LowererMD::GenerateFastOr(IR::Instr * instrOr) if (!src1->IsRegOpnd()) { src1 = IR::RegOpnd::New(src1->GetType(), this->m_func); - LowererMD::CreateAssign(src1, instrOr->GetSrc1(), instrOr); + Lowerer::InsertMove(src1, instrOr->GetSrc1(), instrOr); } if (!src2->IsRegOpnd()) { src2 = IR::RegOpnd::New(src2->GetType(), this->m_func); - LowererMD::CreateAssign(src2, instrOr->GetSrc2(), instrOr); + Lowerer::InsertMove(src2, instrOr->GetSrc2(), instrOr); } if (!isInt) @@ -3845,7 +3688,7 @@ LowererMD::GenerateFastNot(IR::Instr * instrNot) { // Load the src at the top so we don't have to load it twice. src = IR::RegOpnd::New(src->GetType(), this->m_func); - LowererMD::CreateAssign(src, instrNot->GetSrc1(), instrNot); + Lowerer::InsertMove(src, instrNot->GetSrc1(), instrNot); } if (!dst->IsRegOpnd()) @@ -3879,7 +3722,7 @@ LowererMD::GenerateFastNot(IR::Instr * instrNot) if (dst != instrNot->GetDst()) { // Now store the result. - LowererMD::CreateAssign(instrNot->GetDst(), dst, instrNot); + Lowerer::InsertMove(instrNot->GetDst(), dst, instrNot); } if (isInt) @@ -3992,7 +3835,7 @@ LowererMD::GenerateFastNeg(IR::Instr * instrNeg) if (!opndSrc1->IsRegOpnd()) { opndSrc1 = IR::RegOpnd::New(opndSrc1->GetType(), this->m_func); - LowererMD::CreateAssign(opndSrc1, instrNeg->GetSrc1(), instrNeg); + Lowerer::InsertMove(opndSrc1, instrNeg->GetSrc1(), instrNeg); } if (!isInt) @@ -4026,7 +3869,7 @@ LowererMD::GenerateFastNeg(IR::Instr * instrNeg) if (opndDst != instrNeg->GetDst()) { //Now store the result. - LowererMD::CreateAssign(instrNeg->GetDst(), opndDst, instrNeg); + Lowerer::InsertMove(instrNeg->GetDst(), opndDst, instrNeg); } // B $fallthru @@ -4303,482 +4146,100 @@ bool LowererMD::GenerateObjectTest(IR::Opnd * opndSrc, IR::Instr * insertInstr, return true; } -IR::BranchInstr * -LowererMD::GenerateLocalInlineCacheCheck( - IR::Instr * instrLdSt, - IR::RegOpnd * opndType, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelNext, - bool checkTypeWithoutProperty) +void +LowererMD::GenerateLoadTaggedType(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndTaggedType) { - // Generate: - // - // s3 = LDR inlineCache->u.local.type - // CMP type, s3 - // BNE $next - - IR::Instr * instr; - IR::IndirOpnd * typeOpnd; - - // s3 = LDR [inlineCache, offset(u.local.type)] - IR::RegOpnd * s3 = IR::RegOpnd::New(TyMachReg, instrLdSt->m_func); - if (checkTypeWithoutProperty) - { - typeOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.local.typeWithoutProperty), TyMachPtr, instrLdSt->m_func); - } - else - { - typeOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.local.type), TyMachPtr, instrLdSt->m_func); - } - - instr = IR::Instr::New(Js::OpCode::LDR, s3, typeOpnd, instrLdSt->m_func); - instrLdSt->InsertBefore(instr); - - // CMP s1, s3 - instr = IR::Instr::New(Js::OpCode::CMP, instrLdSt->m_func); - instr->SetSrc1(opndType); - instr->SetSrc2(s3); + // taggedType = OR type, InlineCacheAuxSlotTypeTag + IR::IntConstOpnd * opndAuxSlotTag = IR::IntConstOpnd::New(InlineCacheAuxSlotTypeTag, TyInt8, instrLdSt->m_func); + IR::Instr * instr = IR::Instr::New(Js::OpCode::ORR, opndTaggedType, opndType, opndAuxSlotTag, instrLdSt->m_func); instrLdSt->InsertBefore(instr); - - // BNE $next - IR::BranchInstr * branchInstr = IR::BranchInstr::New(Js::OpCode::BNE, labelNext, instrLdSt->m_func); - instrLdSt->InsertBefore(branchInstr); - - return branchInstr; } void -LowererMD::GenerateFlagInlineCacheCheckForGetterSetter( - IR::Instr * insertBeforeInstr, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelNext) +LowererMD::GenerateLoadPolymorphicInlineCacheSlot(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::RegOpnd * opndType, uint polymorphicInlineCacheSize) { - uint accessorFlagMask; - if (PHASE_OFF(Js::InlineGettersPhase, insertBeforeInstr->m_func)) - { - accessorFlagMask = Js::InlineCache::GetSetterFlagMask(); - } - else if (PHASE_OFF(Js::InlineSettersPhase, insertBeforeInstr->m_func)) - { - accessorFlagMask = Js::InlineCache::GetGetterFlagMask(); - } - else - { - accessorFlagMask = Js::InlineCache::GetGetterSetterFlagMask(); - } - - // Generate: + // Generate // - // TST [&(inlineCache->u.accessor.flags)], Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag - // BEQ $next - IR::Instr * instr; - IR::Opnd* flagsOpnd; - - flagsOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.rawUInt16), TyInt8, this->m_func); - // AND [&(inlineCache->u.accessor.flags)], InlineCacheGetterFlag | InlineCacheSetterFlag - instr = IR::Instr::New(Js::OpCode::TST,this->m_func); - instr->SetSrc1(flagsOpnd); - instr->SetSrc2(IR::IntConstOpnd::New(accessorFlagMask, TyInt8, this->m_func)); - insertBeforeInstr->InsertBefore(instr); - LegalizeMD::LegalizeInstr(instr, false); + // LDR r1, type + // LSR r1, r1, #PolymorphicInlineCacheShift + // AND r1, r1, #(size - 1) + // LSL r1, r1, #log2(sizeof(Js::InlineCache)) + // ADD inlineCache, inlineCache, r1 - // BEQ $next - instr = IR::BranchInstr::New(Js::OpCode::BEQ, labelNext, this->m_func); - insertBeforeInstr->InsertBefore(instr); -} + // MOV r1, type + IR::RegOpnd * opndOffset = IR::RegOpnd::New(TyMachPtr, instrLdSt->m_func); + IR::Instr * instr = IR::Instr::New(Js::OpCode::MOV, opndOffset, opndType, instrLdSt->m_func); + instrLdSt->InsertBefore(instr); -IR::BranchInstr * -LowererMD::GenerateFlagInlineCacheCheck( - IR::Instr * instrLdSt, - IR::RegOpnd * opndType, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelNext) -{ - // Generate: + IntConstType rightShiftAmount = PolymorphicInlineCacheShift; + IntConstType leftShiftAmount = Math::Log2(sizeof(Js::InlineCache)); + // instead of generating + // LSR r1, r1, #PolymorphicInlineCacheShift + // AND r1, r1, #(size - 1) + // LSL r1, r1, #log2(sizeof(Js::InlineCache)) // - // s3 = LDR inlineCache->u.flags.type - // CMP type, s3 - // BNE $next - - IR::Instr * instr; - - // LDR s3, [inlineCache, offset(u.flags.type)] - IR::RegOpnd *s3 = IR::RegOpnd::New(TyMachReg, instrLdSt->m_func); - IR::IndirOpnd * opndIndir = IR::IndirOpnd::New(opndInlineCache, offsetof(Js::InlineCache, u.accessor.type), TyMachPtr, instrLdSt->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, s3, opndIndir, instrLdSt->m_func); + // we can generate: + // LSR r1, r1, #(PolymorphicInlineCacheShift - log2(sizeof(Js::InlineCache)) + // AND r1, r1, #(size - 1) << log2(sizeof(Js::InlineCache)) + Assert(rightShiftAmount > leftShiftAmount); + instr = IR::Instr::New(Js::OpCode::LSR, opndOffset, opndOffset, IR::IntConstOpnd::New(rightShiftAmount - leftShiftAmount, TyUint8, instrLdSt->m_func, true), instrLdSt->m_func); instrLdSt->InsertBefore(instr); - - // CMP type, s3 - instr = IR::Instr::New(Js::OpCode::CMP, instrLdSt->m_func); - instr->SetSrc1(opndType); - instr->SetSrc2(s3); + instr = IR::Instr::New(Js::OpCode::AND, opndOffset, opndOffset, IR::IntConstOpnd::New((polymorphicInlineCacheSize - 1) << leftShiftAmount, TyMachPtr, instrLdSt->m_func, true), instrLdSt->m_func); instrLdSt->InsertBefore(instr); - // BNE $next - IR::BranchInstr * branchInstr = IR::BranchInstr::New(Js::OpCode::BNE, labelNext, instrLdSt->m_func); - instrLdSt->InsertBefore(branchInstr); - - return branchInstr; -} - -IR::BranchInstr * -LowererMD::GenerateProtoInlineCacheCheck( - IR::Instr * instrLdSt, - IR::RegOpnd * opndType, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelNext) -{ - // Generate: - // - // s3 = LDR inlineCache->u.proto.type - // CMP type, s3 - // BNE $next - - IR::Instr * instr; - - // LDR s3, [inlineCache, offset(u.proto.type)] - IR::RegOpnd *s3 = IR::RegOpnd::New(TyMachReg, instrLdSt->m_func); - IR::IndirOpnd * opndIndir = IR::IndirOpnd::New(opndInlineCache, offsetof(Js::InlineCache, u.proto.type), TyMachPtr, instrLdSt->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, s3, opndIndir, instrLdSt->m_func); + // ADD inlineCache, inlineCache, r1 + instr = IR::Instr::New(Js::OpCode::ADD, opndInlineCache, opndInlineCache, opndOffset, instrLdSt->m_func); instrLdSt->InsertBefore(instr); +} - // CMP type, s3 - instr = IR::Instr::New(Js::OpCode::CMP, instrLdSt->m_func); - instr->SetSrc1(opndType); - instr->SetSrc2(s3); - instrLdSt->InsertBefore(instr); +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastLdMethodFromFlags +/// +/// Make use of the helper to cache the type and slot index used to do a LdFld +/// and do an inline load from the appropriate slot if the type hasn't changed +/// since the last time this LdFld was executed. +/// +///---------------------------------------------------------------------------- - // BNE $next - IR::BranchInstr * branchInstr = IR::BranchInstr::New(Js::OpCode::BNE, labelNext, instrLdSt->m_func); - instrLdSt->InsertBefore(branchInstr); +bool +LowererMD::GenerateFastLdMethodFromFlags(IR::Instr * instrLdFld) +{ + IR::LabelInstr * labelFallThru; + IR::LabelInstr * bailOutLabel; + IR::Opnd * opndSrc; + IR::Opnd * opndDst; + IR::RegOpnd * opndBase; + IR::RegOpnd * opndType; + IR::RegOpnd * opndInlineCache; + intptr_t inlineCache; - return branchInstr; -} + opndSrc = instrLdFld->GetSrc1(); -void -LowererMD::GenerateLdFldFromLocalInlineCache( - IR::Instr * instrLdFld, - IR::RegOpnd * opndBase, - IR::Opnd * opndDst, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelFallThru, - bool isInlineSlot) -{ - // Generate: - // - // LDR s1, [base, offset(slots)] - // LDR s2, [inlineCache, offset(u.local.slotIndex)] -- load the cached slot index - // LDR dst, [s1, s2, LSL #2] -- load the value directly from the slot (dst = s3 + s4 * 4) - // B $fallthru + AssertMsg(opndSrc->IsSymOpnd() && opndSrc->AsSymOpnd()->IsPropertySymOpnd() && opndSrc->AsSymOpnd()->m_sym->IsPropertySym(), + "Expected property sym operand as src of LdFldFlags"); - IR::Instr * instr; - IR::IndirOpnd * opndIndir; - IR::RegOpnd * opndSlotArray = nullptr; + IR::PropertySymOpnd * propertySymOpnd = opndSrc->AsPropertySymOpnd(); - if (!isInlineSlot) - { - opndSlotArray = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndBase, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndSlotArray, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } + Assert(propertySymOpnd->m_runtimeInlineCache); - // s2 = LDR [inlineCache, offset(u.local.slotIndex)] -- load the cached slot index - IR::RegOpnd * s2 = IR::RegOpnd::New(TyUint16, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndInlineCache, offsetof(Js::InlineCache, u.local.slotIndex), TyUint16, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, s2, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); + Assert(!instrLdFld->DoStackArgsOpt(this->m_func)); - if (isInlineSlot) + // TODO: LdMethodFromFlags doesn't participate in object type specialization. We should be using a temporary + // register without a type sym here. + if (propertySymOpnd->IsTypeCheckSeqCandidate()) { - // LDR dst, [base, s2, LSL #2] -- load the value directly from the inline slot (dst = base + s2 * 4) - opndIndir = IR::IndirOpnd::New(opndBase, s2, GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); + AssertMsg(propertySymOpnd->HasObjectTypeSym(), "Type optimized property sym operand without a type sym?"); + StackSym *typeSym = propertySymOpnd->GetObjectTypeSym(); + opndType = IR::RegOpnd::New(typeSym, TyMachReg, this->m_func); } else { - // LDR dst, [s1, s2, LSL #2] -- load the value directly from the slot (dst = s1 + s2 * 4) - opndIndir = IR::IndirOpnd::New(opndSlotArray, s2, GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); + opndType = IR::RegOpnd::New(TyMachReg, this->m_func); } - // B $fallthru - instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); -} - -void -LowererMD::GenerateLdFldFromProtoInlineCache( - IR::Instr * instrLdFld, - IR::RegOpnd * opndBase, - IR::Opnd * opndDst, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelFallThru, - bool isInlineSlot) -{ - // Generate: - // - // LDR s1, [inlineCache, offset(u.proto.prototypeObject)] - // LDR s1, [s1, offset(slots)] -- load the slot array - // LDR s2, [inlineCache, offset(u.proto.slotIndex)] - // LDR dst, [s1, s2, LSL #2] - // B $fallthru - - IR::Instr * instr; - IR::RegOpnd * opndProtoSlots = nullptr; - - // LDR s1, [inlineCache, offset(u.proto.prototypeObject)] - IR::RegOpnd * opndProto = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - IR::IndirOpnd * opndIndir = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.proto.prototypeObject), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndProto, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - - if (!isInlineSlot) - { - // LDR s1, [s1, offset(slots)] -- load the slot array - opndProtoSlots = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndProto, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndProtoSlots, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - - // LDR s2, [inlineCache, offset(u.proto.slotIndex)] - IR::RegOpnd * opndSlotIndex = IR::RegOpnd::New(TyUint16, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndInlineCache, offsetof(Js::InlineCache, u.proto.slotIndex), TyUint16, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndSlotIndex, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - - if (isInlineSlot) - { - // LDR dst, [s1, s8, LSL #2] - opndIndir = IR::IndirOpnd::New(opndProto, opndSlotIndex, GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - else - { - // LDR dst, [s7, s8, LSL #2] - opndIndir = IR::IndirOpnd::New(opndProtoSlots, opndSlotIndex, GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - - // B $fallthru - instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); -} - -void -LowererMD::GenerateLdLocalFldFromFlagInlineCache( - IR::Instr * instrLdFld, - IR::RegOpnd * opndBase, - IR::Opnd * opndDst, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelFallThru, - bool isInlineSlot) -{ - // Generate: - // - // LDR s1, [base, offset(slots)] - // LDR s2, [inlineCache, offset(u.flags.slotIndex)] -- load the cached slot index - // LDR dst, [s1, s2, LSL #2] -- load the value directly from the slot (dst = s3 + s4 * 4) - // B $fallthru - - IR::Instr * instr; - IR::IndirOpnd * opndIndir; - IR::RegOpnd * opndSlotArray = nullptr; - - if (!isInlineSlot) - { - opndSlotArray = IR::RegOpnd::New(TyMachReg, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndBase, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndSlotArray, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - - // s2 = LDR [inlineCache, offset(u.local.slotIndex)] -- load the cached slot index - IR::RegOpnd * s2 = IR::RegOpnd::New(TyUint16, instrLdFld->m_func); - opndIndir = IR::IndirOpnd::New(opndInlineCache, offsetof(Js::InlineCache, u.accessor.slotIndex), TyUint16, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, s2, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - - if (isInlineSlot) - { - // LDR dst, [base, s2, LSL #2] -- load the value directly from the inline slot (dst = base + s2 * 4) - opndIndir = IR::IndirOpnd::New(opndBase, s2, GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - else - { - // LDR dst, [s1, s2, LSL #2] -- load the value directly from the slot (dst = s1 + s2 * 4) - opndIndir = IR::IndirOpnd::New(opndSlotArray, s2, GetDefaultIndirScale(), TyMachReg, instrLdFld->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndDst, opndIndir, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); - } - - // B $fallthru - instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, instrLdFld->m_func); - instrLdFld->InsertBefore(instr); -} - -void -LowererMD::GenerateLdFldFromFlagInlineCache( - IR::Instr * insertBeforeInstr, - IR::RegOpnd * opndBase, - IR::RegOpnd * opndInlineCache, - IR::Opnd * opndDst, - IR::LabelInstr * labelFallThru, - bool isInlineSlot) -{ - // Generate: - // - // LDR s1, [inlineCache, offset(u.flags.object)] - // LDR s1, [s1, offset(slots)] -- load the slot array - // LDR s2, [inlineCache, offset(u.flags.slotIndex)] - // LDR dst, [s1, s2, LSL #2] - // B $fallthru - - IR::Instr * instr; - IR::RegOpnd * opndObjSlots = nullptr; - - // LDR s1, [inlineCache, offset(u.flags.object)] - IR::RegOpnd * object = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::IndirOpnd * opndIndir = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.object), TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, object, opndIndir, this->m_func); - insertBeforeInstr->InsertBefore(instr); - - if (!isInlineSlot) - { - // LDR s1, [s1, offset(slots)] -- load the slot array - opndObjSlots = IR::RegOpnd::New(TyMachReg, this->m_func); - opndIndir = IR::IndirOpnd::New(object, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndObjSlots, opndIndir, this->m_func); - insertBeforeInstr->InsertBefore(instr); - } - - // LDR s2, [inlineCache, offset(u.flags.slotIndex)] - IR::RegOpnd * opndSlotIndex = IR::RegOpnd::New(TyUint16, this->m_func); - opndIndir = IR::IndirOpnd::New(opndInlineCache, offsetof(Js::InlineCache, u.accessor.slotIndex), TyUint16, this->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndSlotIndex, opndIndir, this->m_func); - insertBeforeInstr->InsertBefore(instr); - - if (isInlineSlot) - { - // LDR dst, [s1, s8, LSL #2] - opndIndir = IR::IndirOpnd::New(object, opndSlotIndex, this->GetDefaultIndirScale(), TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndDst, opndIndir, this->m_func); - insertBeforeInstr->InsertBefore(instr); - } - else - { - // LDR dst, [s7, s8, LSL #2] - opndIndir = IR::IndirOpnd::New(opndObjSlots, opndSlotIndex, this->GetDefaultIndirScale(), TyMachReg, this->m_func); - instr = IR::Instr::New(Js::OpCode::LDR, opndDst, opndIndir, this->m_func); - insertBeforeInstr->InsertBefore(instr); - } - - // B $fallthru - instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, this->m_func); - insertBeforeInstr->InsertBefore(instr); -} - -void -LowererMD::GenerateLoadTaggedType(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndTaggedType) -{ - // taggedType = OR type, InlineCacheAuxSlotTypeTag - IR::IntConstOpnd * opndAuxSlotTag = IR::IntConstOpnd::New(InlineCacheAuxSlotTypeTag, TyInt8, instrLdSt->m_func); - IR::Instr * instr = IR::Instr::New(Js::OpCode::ORR, opndTaggedType, opndType, opndAuxSlotTag, instrLdSt->m_func); - instrLdSt->InsertBefore(instr); -} - -void -LowererMD::GenerateLoadPolymorphicInlineCacheSlot(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::RegOpnd * opndType, uint polymorphicInlineCacheSize) -{ - // Generate - // - // LDR r1, type - // LSR r1, r1, #PolymorphicInlineCacheShift - // AND r1, r1, #(size - 1) - // LSL r1, r1, #log2(sizeof(Js::InlineCache)) - // ADD inlineCache, inlineCache, r1 - - // MOV r1, type - IR::RegOpnd * opndOffset = IR::RegOpnd::New(TyMachPtr, instrLdSt->m_func); - IR::Instr * instr = IR::Instr::New(Js::OpCode::MOV, opndOffset, opndType, instrLdSt->m_func); - instrLdSt->InsertBefore(instr); - - IntConstType rightShiftAmount = PolymorphicInlineCacheShift; - IntConstType leftShiftAmount = Math::Log2(sizeof(Js::InlineCache)); - // instead of generating - // LSR r1, r1, #PolymorphicInlineCacheShift - // AND r1, r1, #(size - 1) - // LSL r1, r1, #log2(sizeof(Js::InlineCache)) - // - // we can generate: - // LSR r1, r1, #(PolymorphicInlineCacheShift - log2(sizeof(Js::InlineCache)) - // AND r1, r1, #(size - 1) << log2(sizeof(Js::InlineCache)) - Assert(rightShiftAmount > leftShiftAmount); - instr = IR::Instr::New(Js::OpCode::LSR, opndOffset, opndOffset, IR::IntConstOpnd::New(rightShiftAmount - leftShiftAmount, TyUint8, instrLdSt->m_func, true), instrLdSt->m_func); - instrLdSt->InsertBefore(instr); - instr = IR::Instr::New(Js::OpCode::AND, opndOffset, opndOffset, IR::IntConstOpnd::New((polymorphicInlineCacheSize - 1) << leftShiftAmount, TyMachPtr, instrLdSt->m_func, true), instrLdSt->m_func); - instrLdSt->InsertBefore(instr); - - // ADD inlineCache, inlineCache, r1 - instr = IR::Instr::New(Js::OpCode::ADD, opndInlineCache, opndInlineCache, opndOffset, instrLdSt->m_func); - instrLdSt->InsertBefore(instr); -} - -///---------------------------------------------------------------------------- -/// -/// LowererMD::GenerateFastLdMethodFromFlags -/// -/// Make use of the helper to cache the type and slot index used to do a LdFld -/// and do an inline load from the appropriate slot if the type hasn't changed -/// since the last time this LdFld was executed. -/// -///---------------------------------------------------------------------------- - -bool -LowererMD::GenerateFastLdMethodFromFlags(IR::Instr * instrLdFld) -{ - IR::LabelInstr * labelFallThru; - IR::LabelInstr * bailOutLabel; - IR::Opnd * opndSrc; - IR::Opnd * opndDst; - IR::RegOpnd * opndBase; - IR::RegOpnd * opndType; - IR::RegOpnd * opndInlineCache; - intptr_t inlineCache; - - opndSrc = instrLdFld->GetSrc1(); - - AssertMsg(opndSrc->IsSymOpnd() && opndSrc->AsSymOpnd()->IsPropertySymOpnd() && opndSrc->AsSymOpnd()->m_sym->IsPropertySym(), - "Expected property sym operand as src of LdFldFlags"); - - IR::PropertySymOpnd * propertySymOpnd = opndSrc->AsPropertySymOpnd(); - - Assert(propertySymOpnd->m_runtimeInlineCache); - - Assert(!instrLdFld->DoStackArgsOpt(this->m_func)); - - // TODO: LdMethodFromFlags doesn't participate in object type specialization. We should be using a temporary - // register without a type sym here. - if (propertySymOpnd->IsTypeCheckSeqCandidate()) - { - AssertMsg(propertySymOpnd->HasObjectTypeSym(), "Type optimized property sym operand without a type sym?"); - StackSym *typeSym = propertySymOpnd->GetObjectTypeSym(); - opndType = IR::RegOpnd::New(typeSym, TyMachReg, this->m_func); - } - else - { - opndType = IR::RegOpnd::New(TyMachReg, this->m_func); - } - - opndBase = propertySymOpnd->CreatePropertyOwnerOpnd(m_func); - opndDst = instrLdFld->GetDst(); + opndBase = propertySymOpnd->CreatePropertyOwnerOpnd(m_func); + opndDst = instrLdFld->GetDst(); inlineCache = propertySymOpnd->m_runtimeInlineCache; Assert(inlineCache != 0); @@ -4789,23 +4250,23 @@ LowererMD::GenerateFastLdMethodFromFlags(IR::Instr * instrLdFld) // Label to jump to (or fall through to) when bailing out bailOutLabel = IR::LabelInstr::New(Js::OpCode::Label, instrLdFld->m_func, true /* isOpHelper */); - LowererMD::CreateAssign(opndInlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrLdFld, propertySymOpnd), instrLdFld); + Lowerer::InsertMove(opndInlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrLdFld, propertySymOpnd), instrLdFld); IR::LabelInstr * labelFlagAux = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); // Check the flag cache with the untagged type this->m_lowerer->GenerateObjectTestAndTypeLoad(instrLdFld, opndBase, opndType, bailOutLabel); //Blindly do the check for getter flag first and then do the type check //We avoid repeated check for getter flag when the function object may be in either //inline slots or auxiliary slots - GenerateFlagInlineCacheCheckForGetterSetter(instrLdFld, opndInlineCache, bailOutLabel); - GenerateFlagInlineCacheCheck(instrLdFld, opndType, opndInlineCache, labelFlagAux); - GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndInlineCache, opndDst, labelFallThru, true); + this->m_lowerer->GenerateFlagInlineCacheCheckForGetterSetter(instrLdFld, opndInlineCache, bailOutLabel); + this->m_lowerer->GenerateFlagInlineCacheCheck(instrLdFld, opndType, opndInlineCache, labelFlagAux); + this->m_lowerer->GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); // Check the flag cache with the tagged type instrLdFld->InsertBefore(labelFlagAux); IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); GenerateLoadTaggedType(instrLdFld, opndType, opndTaggedType); - GenerateFlagInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, bailOutLabel); - GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndInlineCache, opndDst, labelFallThru, false); + this->m_lowerer->GenerateFlagInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, bailOutLabel); + this->m_lowerer->GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); instrLdFld->InsertBefore(bailOutLabel); instrLdFld->InsertAfter(labelFallThru); @@ -4917,18 +4378,18 @@ LowererMD::GenerateFastScopedFld(IR::Instr * instrScopedFld, bool isLoad) IR::RegOpnd * opndType = IR::RegOpnd::New(TyMachReg, this->m_func); this->m_lowerer->GenerateObjectTestAndTypeLoad(instrScopedFld, opndReg2, opndType, labelHelper); - LowererMD::CreateAssign(opndInlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrScopedFld, propertySymOpnd), instrScopedFld); + Lowerer::InsertMove(opndInlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrScopedFld, propertySymOpnd), instrScopedFld); labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); // Check the local cache with the tagged type IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); GenerateLoadTaggedType(instrScopedFld, opndType, opndTaggedType); - GenerateLocalInlineCacheCheck(instrScopedFld, opndTaggedType, opndInlineCache, labelHelper); + Lowerer::GenerateLocalInlineCacheCheck(instrScopedFld, opndTaggedType, opndInlineCache, labelHelper); if (isLoad) { IR::Opnd *opndDst = instrScopedFld->GetDst(); - GenerateLdFldFromLocalInlineCache(instrScopedFld, opndReg2, opndDst, opndInlineCache, labelFallThru, false); + Lowerer::GenerateLdFldFromLocalInlineCache(instrScopedFld, opndReg2, opndDst, opndInlineCache, labelFallThru, false); } else { @@ -5036,7 +4497,7 @@ LowererMD::GenerateStFldFromLocalInlineCache( // s2 = MOV base->slots -- load the slot array opndSlotArray = IR::RegOpnd::New(TyMachReg, instrStFld->m_func); opndIndir = IR::IndirOpnd::New(opndBase, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrStFld->m_func); - LowererMD::CreateAssign(opndSlotArray, opndIndir, instrStFld); + Lowerer::InsertMove(opndSlotArray, opndIndir, instrStFld); } // LDR s5, [s2, offset(u.local.slotIndex)] -- load the cached slot index @@ -5208,52 +4669,6 @@ IR::RegOpnd *LowererMD::LoadNonnegativeIndex( return indexOpnd; } -bool LowererMD::GenerateJSBooleanTest(IR::RegOpnd * regSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel) -{ - IR::Instr* instr; - if (regSrc->GetValueType().IsBoolean()) - { - if (fContinueLabel) - { - // B $labelTarget - instr = IR::BranchInstr::New(Js::OpCode::B, labelTarget, this->m_func); - insertInstr->InsertBefore(instr); -#if DBG - if (labelTarget->isOpHelper) - { - labelTarget->m_noHelperAssert = true; - } -#endif - } - return false; - } - - // CMP src1, vtable - instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); - IR::IndirOpnd *vtablePtrOpnd = IR::IndirOpnd::New(regSrc, 0, TyMachPtr, this->m_func); - instr->SetSrc1(vtablePtrOpnd); - IR::Opnd *jsBooleanVTable = m_lowerer->LoadVTableValueOpnd(insertInstr, VTableValue::VtableJavascriptBoolean); - instr->SetSrc2(jsBooleanVTable); - insertInstr->InsertBefore(instr); - LegalizeMD::LegalizeInstr(instr, false); - - if (fContinueLabel) - { - // BEQ $labelTarget - instr = IR::BranchInstr::New(Js::OpCode::BEQ, labelTarget, this->m_func); - insertInstr->InsertBefore(instr); - IR::LabelInstr *labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); - insertInstr->InsertBefore(labelHelper); - } - else - { - // BNE $labelTarget - instr = IR::BranchInstr::New(Js::OpCode::BNE, labelTarget, this->m_func); - insertInstr->InsertBefore(instr); - } - return true; -} - // Inlines fast-path for int Mul/Add or int Mul/Sub. If not int, call MulAdd/MulSub helper bool LowererMD::TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrPrev) { @@ -5371,18 +4786,18 @@ bool LowererMD::TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrP IR::RegOpnd* s1 = IR::RegOpnd::New(mulSrc1->GetType(), this->m_func); IR::RegOpnd* s2 = IR::RegOpnd::New(mulSrc2->GetType(), this->m_func); IR::RegOpnd* s3 = IR::RegOpnd::New(addSrc->GetType(), this->m_func); - IR::RegOpnd* opndRegR12 = IR::RegOpnd::New(nullptr, RegR12, TyMachReg, this->m_func); + IR::RegOpnd* opndRegScratch = IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachReg, this->m_func); // (Load mulSrc1 at the top so we don't have to do it repeatedly) if (!mulSrc1->IsRegOpnd()) { - LowererMD::CreateAssign(s1, mulSrc1, instrAdd); + Lowerer::InsertMove(s1, mulSrc1, instrAdd); mulSrc1 = s1; } // Now: mulSrc1 is regOpnd (in case if it wasn't it's now s1). // Load addSrc into s3. We'll use it as source and destination of SMLAL. - LowererMD::CreateAssign(s3, addSrc, instrAdd); + Lowerer::InsertMove(s3, addSrc, instrAdd); // (If not mulSrc1 and addSrc are Int31's, jump to $helper) bool areTaggedInts = mulSrc1->IsTaggedInt() && s3->IsTaggedInt(); @@ -5409,7 +4824,7 @@ bool LowererMD::TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrP // Now: mulSrc1 in s1, mulSrc2 in s2. // r12 = ASR s3, 31 -- make r12 to be sign-extension of the addSrc. - instr = IR::Instr::New(Js::OpCode::ASR, opndRegR12, s3, IR::IntConstOpnd::New(31, TyVar, this->m_func), m_func); + instr = IR::Instr::New(Js::OpCode::ASR, opndRegScratch, s3, IR::IntConstOpnd::New(31, TyVar, this->m_func), m_func); instrAdd->InsertBefore(instr); // r12:s3 = SMLAL s1, s2 -- note: the add source comes from r12:s3, result is already tagged int = mulSrc1Val*2 * mulSrc2Val + addSrcVal * 2 + 1 @@ -5421,7 +4836,7 @@ bool LowererMD::TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrP // CMP r12, s3, ASR #31 -- check for overflow (== means no overflow) // BNE $helper -- bail if the result overflowed instr = IR::Instr::New(Js::OpCode::CMP_ASR31, this->m_func); - instr->SetSrc1(opndRegR12); + instr->SetSrc1(opndRegScratch); instr->SetSrc2(s3); instrAdd->InsertBefore(instr); instr = IR::BranchInstr::New(Js::OpCode::BNE, labelHelper, this->m_func); @@ -5429,7 +4844,7 @@ bool LowererMD::TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrP // Copy the result into dst // dst = s3 - LowererMD::CreateAssign(instrAdd->GetDst(), s3, instrAdd); + Lowerer::InsertMove(instrAdd->GetDst(), s3, instrAdd); LegalizeMD::LegalizeInstr(instr, false); // B $done @@ -6090,7 +5505,7 @@ LowererMD::GenerateFastAbs(IR::Opnd *dst, IR::Opnd *src, IR::Instr *callInstr, I if (!Js::TaggedInt::IsOverflow(absValue)) { varOpnd->SetAddress(Js::TaggedInt::ToVarUnchecked(absValue), IR::AddrOpndKindConstantVar); - LowererMD::CreateAssign(dst, varOpnd, insertInstr); + Lowerer::InsertMove(dst, varOpnd, insertInstr); } } @@ -6273,7 +5688,7 @@ bool LowererMD::GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR: else { regSrcStr = IR::RegOpnd::New(TyMachReg, this->m_func); - LowererMD::CreateAssign(regSrcStr, srcStr, insertInstr); + Lowerer::InsertMove(regSrcStr, srcStr, insertInstr); } this->m_lowerer->GenerateStringTest(regSrcStr, insertInstr, labelHelper); @@ -6281,7 +5696,7 @@ bool LowererMD::GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR: // psz = LDR [regSrc + offset(m_pszValue)] IR::RegOpnd *psz = IR::RegOpnd::New(TyMachPtr, this->m_func); indirOpnd = IR::IndirOpnd::New(regSrcStr, Js::JavascriptString::GetOffsetOfpszValue(), TyMachPtr, this->m_func); - LowererMD::CreateAssign(psz, indirOpnd, insertInstr); + Lowerer::InsertMove(psz, indirOpnd, insertInstr); // CMP psz, 0 instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); @@ -6297,7 +5712,7 @@ bool LowererMD::GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR: // length = LDR [regSrcStr + offsetof(length)] IR::RegOpnd *length = IR::RegOpnd::New(TyMachReg, this->m_func); indirOpnd = IR::IndirOpnd::New(regSrcStr, offsetof(Js::JavascriptString, m_charLength), TyUint32, this->m_func); - LowererMD::CreateAssign(length, indirOpnd, insertInstr); + Lowerer::InsertMove(length, indirOpnd, insertInstr); if (srcIndex->IsAddrOpnd()) { @@ -6350,7 +5765,7 @@ bool LowererMD::GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR: // char = LDRH [regSrc + index32, LSL #1] IR::RegOpnd *charResult = IR::RegOpnd::New(TyUint32, this->m_func); - LowererMD::CreateAssign(charResult, indirOpnd, insertInstr); + Lowerer::InsertMove(charResult, indirOpnd, insertInstr); if (index == Js::BuiltinFunction::JavascriptString_CharAt) { @@ -6386,20 +5801,6 @@ bool LowererMD::GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR: return true; } -IR::Instr * -LowererMD::LoadStackAddress(StackSym *sym, IR::RegOpnd* regDst) -{ - if (regDst == nullptr) - { - regDst = IR::RegOpnd::New(TyMachReg, this->m_func); - } - - IR::SymOpnd * symSrc = IR::SymOpnd::New(sym, TyMachPtr, this->m_func); - IR::Instr * lea = IR::Instr::New(Js::OpCode::LEA, regDst, symSrc, this->m_func); - - return lea; -} - void LowererMD::EmitInt4Instr(IR::Instr *instr) { @@ -6735,9 +6136,9 @@ LowererMD::LowerInt4MulWithBailOut( { // (SMULL doesn't set the flags but we don't have 32bit overflow <=> r12-unsigned ? r12==0 : all 33 bits of 64bit result are 1's // CMP r12, dst, ASR #31 -- check for overflow (== means no overflow) - IR::RegOpnd* opndRegR12 = IR::RegOpnd::New(nullptr, RegR12, TyMachReg, instr->m_func); + IR::RegOpnd* opndRegScratch = IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachReg, instr->m_func); insertInstr = IR::Instr::New(Js::OpCode::CMP_ASR31, instr->m_func); - insertInstr->SetSrc1(opndRegR12); + insertInstr->SetSrc1(opndRegScratch); insertInstr->SetSrc2(dst); insertBeforeInstr->InsertBefore(insertInstr); @@ -7088,68 +6489,6 @@ LowererMD::EmitLoadInt32(IR::Instr *instrLoad, bool conversionFromObjectAllowed, return false; } -IR::Instr * -LowererMD::LowerGetCachedFunc(IR::Instr *instr) -{ - // src1 is an ActivationObjectEx, and we want to get the function object identified by the index (src2) - // dst = MOV (src1)->GetFuncCacheEntry(src2)->func - // - // => [src1 + (offsetof(src1, cache) + (src2 * sizeof(FuncCacheEntry)) + offsetof(FuncCacheEntry, func))] - - IR::IntConstOpnd *src2Opnd = instr->UnlinkSrc2()->AsIntConstOpnd(); - IR::RegOpnd *src1Opnd = instr->UnlinkSrc1()->AsRegOpnd(); - IR::Instr *instrPrev = instr->m_prev; - - instr->SetSrc1(IR::IndirOpnd::New(src1Opnd, (src2Opnd->GetValue() * sizeof(Js::FuncCacheEntry)) + Js::ActivationObjectEx::GetOffsetOfCache() + offsetof(Js::FuncCacheEntry, func), TyVar, this->m_func)); - - this->ChangeToAssign(instr); - - src2Opnd->Free(this->m_func); - - return instrPrev; -} - -IR::Instr * -LowererMD::LowerCommitScope(IR::Instr *instrCommit) -{ - IR::Instr *instrPrev = instrCommit->m_prev; - IR::RegOpnd *baseOpnd = instrCommit->UnlinkSrc1()->AsRegOpnd(); - IR::Opnd *opnd; - IR::Instr * insertInstr = instrCommit->m_next; - - // Write undef to all the local var slots. - - opnd = IR::IndirOpnd::New(baseOpnd, Js::ActivationObjectEx::GetOffsetOfCommitFlag(), TyInt8, this->m_func); - instrCommit->SetDst(opnd); - instrCommit->SetSrc1(IR::IntConstOpnd::New(1, TyInt8, this->m_func)); - LowererMD::ChangeToAssign(instrCommit); - - const Js::PropertyIdArray *propIds = instrCommit->m_func->GetJITFunctionBody()->GetFormalsPropIdArray(); - - uint firstVarSlot = (uint)Js::ActivationObjectEx::GetFirstVarSlot(propIds); - if (firstVarSlot < propIds->count) - { - // On ARM, instead of re-using the address of "undefined" for each store, put the address in a register - // and re-use that. (Would that be good for x86/amd64 as well?) - IR::RegOpnd *undefOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - LowererMD::CreateAssign(undefOpnd, m_lowerer->LoadLibraryValueOpnd(insertInstr, LibraryValue::ValueUndefined), insertInstr); - - IR::RegOpnd *slotBaseOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); - - // Load a pointer to the aux slots. We assume that all ActivationObject's have only aux slots. - - opnd = IR::IndirOpnd::New(baseOpnd, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, this->m_func); - this->CreateAssign(slotBaseOpnd, opnd, insertInstr); - - for (uint i = firstVarSlot; i < propIds->count; i++) - { - opnd = IR::IndirOpnd::New(slotBaseOpnd, i << this->GetDefaultIndirScale(), TyMachReg, this->m_func); - LowererMD::CreateAssign(opnd, undefOpnd, insertInstr); - } - } - - return instrPrev; -} void LowererMD::ImmedSrcToReg(IR::Instr * instr, IR::Opnd * newOpnd, int srcNum) @@ -7175,35 +6514,12 @@ LowererMD::ImmedSrcToReg(IR::Instr * instr, IR::Opnd * newOpnd, int srcNum) } } -void -LowererMD::MarkOneFltTmpSym(StackSym *sym, BVSparse *bvTmps, bool fFltPrefOp) -{ - // Nothing to do here. It may be called when lowering a switch if fast paths are on. -} - IR::LabelInstr * LowererMD::GetBailOutStackRestoreLabel(BailOutInfo * bailOutInfo, IR::LabelInstr * exitTargetInstr) { return exitTargetInstr; } -bool -LowererMD::AnyFloatTmps() -{ - // no float preferencing for ARM yet - return false; -} - -IR::LabelInstr* -LowererMD::InsertBeforeRecoveryForFloatTemps( - IR::Instr * insertBefore, - IR::LabelInstr * labelRecover, - const bool isInHelperBlock) -{ - AssertMsg(0, "NYI"); - return nullptr; -} - StackSym * LowererMD::GetImplicitParamSlotSym(Js::ArgSlot argSlot) { @@ -7243,362 +6559,14 @@ LowererMD::EnsureEpilogLabel() return labelInstr; } -bool -LowererMD::GenerateLdThisStrict(IR::Instr* insertInstr) -{ - IR::RegOpnd * src1 = insertInstr->GetSrc1()->AsRegOpnd(); - IR::RegOpnd * typeId = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::RegOpnd * type = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::LabelInstr * done = IR::LabelInstr::New(Js::OpCode::Label, m_func); - IR::LabelInstr * fallthrough = IR::LabelInstr::New(Js::OpCode::Label, m_func); - IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, /*helper*/ true); - IR::Instr* instr; - - bool assign = insertInstr->GetDst() && !insertInstr->GetDst()->IsEqual(src1); - if (!src1->m_sym->m_isNotInt) - { - GenerateObjectTest(src1, insertInstr, assign ? done : fallthrough); - } - - // LDR r1, [src1 + offset(type)] - { - IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(src1->AsRegOpnd(), Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); - this->CreateAssign(type, indirOpnd, insertInstr); - } - - // LDR r1, [r1 + offset(typeId)] - { - IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(type, Js::Type::GetOffsetOfTypeId(), TyMachReg, this->m_func); - this->CreateAssign(typeId, indirOpnd, insertInstr); - } - - // CMP typeid, TypeIds_ActivationObject - instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); - instr->SetSrc1(typeId); - instr->SetSrc2(IR::IntConstOpnd::New(Js::TypeIds_ActivationObject, TyMachReg, this->m_func)); - insertInstr->InsertBefore(instr); - LegalizeMD::LegalizeInstr(instr, false); - - // BE $helper - instr = IR::BranchInstr::New(Js::OpCode::BEQ, helper, this->m_func); - insertInstr->InsertBefore(instr); - - if(assign) - { - //$done: - insertInstr->InsertBefore(done); - - // LDR $dest, $src - LowererMD::CreateAssign(insertInstr->GetDst(), insertInstr->GetSrc1(), insertInstr); - } - - // B $fallthrough - instr = IR::BranchInstr::New(Js::OpCode::B, fallthrough, this->m_func); - insertInstr->InsertBefore(instr); - - insertInstr->InsertBefore(helper); - if(insertInstr->GetDst()) - { - // LDR dst, undefined - LowererMD::CreateAssign(insertInstr->GetDst(), m_lowerer->LoadLibraryValueOpnd(insertInstr, LibraryValue::ValueUndefined), insertInstr); - } - - // $fallthrough: - insertInstr->InsertAfter(fallthrough); - return true; -} - -void LowererMD::GenerateIsDynamicObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool fContinueLabel) -{ - // CMP [srcReg], Js::DynamicObject::`vtable' - - IR::Instr *cmp = IR::Instr::New(Js::OpCode::CMP, this->m_func); - cmp->SetSrc1(IR::IndirOpnd::New(regOpnd, 0, TyMachPtr, m_func)); - cmp->SetSrc2(m_lowerer->LoadVTableValueOpnd(insertInstr, VTableValue::VtableDynamicObject)); - insertInstr->InsertBefore(cmp); - LegalizeMD::LegalizeInstr(cmp, false); - - if (fContinueLabel) - { - // BEQ $continue - IR::Instr * jne = IR::BranchInstr::New(Js::OpCode::BEQ, labelHelper, this->m_func); - insertInstr->InsertBefore(jne); - } - else - { - // BNE $helper - IR::Instr * jne = IR::BranchInstr::New(Js::OpCode::BNE, labelHelper, this->m_func); - insertInstr->InsertBefore(jne); - } -} - -void LowererMD::GenerateIsRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool checkObjectAndDynamicObject) -{ - // CMP [srcReg], Js::DynamicObject::`vtable' - // BEQ $fallThough - // LDR r1, [src1 + offset(type)] - // LDR r1, [r1 + offset(typeId)] - // SUB r1, -(~TypeIds_LastJavascriptPrimitiveType) -- if (typeId > TypeIds_LastJavascriptPrimitiveType && typeId <= TypeIds_LastTrueJavascriptObjectType) - // CMP r1, (TypeIds_LastTrueJavascriptObjectType - TypeIds_LastJavascriptPrimitiveType - 1) - // BHI $helper - //fallThrough: - - - IR::LabelInstr *labelFallthrough = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); - - if (checkObjectAndDynamicObject) - { - if (!regOpnd->m_sym->m_isNotInt) - { - GenerateObjectTest(regOpnd, insertInstr, labelHelper); - } - - this->GenerateIsDynamicObject(regOpnd, insertInstr, labelFallthrough, true); - } - - IR::RegOpnd * r1 = IR::RegOpnd::New(TyMachReg, this->m_func); - - // LDR r1, [src1 + offset(type)] - { - IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(regOpnd, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); - this->CreateAssign(r1, indirOpnd, insertInstr); - } - - // LDR r1, [r1 + offset(typeId)] - { - IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(r1, Js::Type::GetOffsetOfTypeId(), TyMachReg, this->m_func); - this->CreateAssign(r1, indirOpnd, insertInstr); - } - - // SUB r1, -(~TypeIds_LastJavascriptPrimitiveType) - { - IR::Instr * add = IR::Instr::New(Js::OpCode::SUB, r1, r1, IR::IntConstOpnd::New(-(~Js::TypeIds_LastJavascriptPrimitiveType), TyInt32, this->m_func, true), this->m_func); - insertInstr->InsertBefore(add); - LegalizeMD::LegalizeInstr(add, false); - } - - // CMP r1, (TypeIds_LastTrueJavascriptObjectType - TypeIds_LastJavascriptPrimitiveType - 1) - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, this->m_func); - cmp->SetSrc1(r1); - cmp->SetSrc2(IR::IntConstOpnd::New(Js::TypeIds_LastTrueJavascriptObjectType - Js::TypeIds_LastJavascriptPrimitiveType - 1, TyInt32, this->m_func)); - insertInstr->InsertBefore(cmp); - LegalizeMD::LegalizeInstr(cmp, false); - } - - // BHI $helper - { - IR::Instr * jbe = IR::BranchInstr::New(Js::OpCode::BHI, labelHelper, this->m_func); - insertInstr->InsertBefore(jbe); - } - - // $fallThrough - insertInstr->InsertBefore(labelFallthrough); -} - -bool -LowererMD::GenerateLdThisCheck(IR::Instr * instr) -{ - // - // If not an object, jump to $helper - // MOV dst, src1 -- return the object itself - // B $fallthrough - // $helper: - // (caller generates helper call) - // $fallthrough: - // - IR::RegOpnd * src1 = instr->GetSrc1()->AsRegOpnd(); - IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); - IR::LabelInstr * fallthrough = IR::LabelInstr::New(Js::OpCode::Label, m_func); - - this->GenerateIsRecyclableObject(src1, instr, helper); - - // MOV dst, src1 - if (instr->GetDst() && !instr->GetDst()->IsEqual(src1)) - { - this->CreateAssign(instr->GetDst(), src1, instr); - } - - // B $fallthrough - { - IR::Instr * jmp = IR::BranchInstr::New(Js::OpCode::B, fallthrough, this->m_func); - instr->InsertBefore(jmp); - } - - // $helper: - // (caller generates helper call) - // $fallthrough: - instr->InsertBefore(helper); - instr->InsertAfter(fallthrough); - - return true; -} - -// given object instanceof function, functionReg is a register with function, -// objectReg is a register with instance and inlineCache is an InstIsInlineCache. -// We want to generate: -// -// fallback on helper (will patch the inline cache) if function does not match the cache -// LDIMM dst, Js::false -// LDR cache, [&(inlineCache->function)] -// CMP functionReg, cache -// BNE helper -// -// fallback if object is a tagged int -// TST objectReg, Js::AtomTag -// BNE done -// -// return false if object is a primitive -// LDR typeReg, objectSrc + offsetof(RecyclableObject::type) -// LDR typeID, [typeReg + offsetof(Type::typeid)] -// CMP typeID, TypeIds_LastJavascriptPrimitiveType -// BLE done -// -// fallback if object's type is not the cached type -// CMP typeReg, [&(inlineCache->type] -// BNE helper -// -// use the cached result and fallthrough -// LDR dst, [&(inlineCache->result)] -// B done -// -// $helper -// $done -bool -LowererMD::GenerateFastIsInst(IR::Instr * instr) -{ - IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); - IR::LabelInstr * done = IR::LabelInstr::New(Js::OpCode::Label, m_func); - IR::RegOpnd * typeReg = IR::RegOpnd::New(TyMachReg, this->m_func); - IR::Opnd * objectSrc; - IR::RegOpnd * objectReg; - IR::Opnd * functionSrc; - IR::RegOpnd * functionReg; - intptr_t inlineCache; - IR::Instr * instrArg; - - // We are going to use the extra ArgOut_A instructions to lower the helper call later, - // so we leave them alone here and clean them up then. - inlineCache = instr->m_func->GetJITFunctionBody()->GetIsInstInlineCache(instr->GetSrc1()->AsIntConstOpnd()->GetValue()); - Assert(instr->GetSrc2()->AsRegOpnd()->m_sym->m_isSingleDef); - instrArg = instr->GetSrc2()->AsRegOpnd()->m_sym->m_instrDef; - - objectSrc = instrArg->GetSrc1(); - Assert(instrArg->GetSrc2()->AsRegOpnd()->m_sym->m_isSingleDef); - instrArg = instrArg->GetSrc2()->AsRegOpnd()->m_sym->m_instrDef; - - functionSrc = instrArg->GetSrc1(); - Assert(instrArg->GetSrc2() == nullptr); - - IR::Opnd* opndDst = instr->GetDst(); - if (!opndDst->IsRegOpnd()) - { - opndDst = IR::RegOpnd::New(opndDst->GetType(), this->m_func); - } - - // LDR dst, Js::false - instr->InsertBefore(IR::Instr::New(Js::OpCode::LDR, opndDst, - m_lowerer->LoadLibraryValueOpnd(instr, LibraryValue::ValueFalse), m_func)); - - if (functionSrc->IsRegOpnd()) - { - functionReg = functionSrc->AsRegOpnd(); - } - else - { - functionReg = IR::RegOpnd::New(TyMachReg, this->m_func); - LowererMD::CreateAssign(functionReg, functionSrc, instr); - } - - // CMP functionReg, [&(inlineCache->function)] - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, m_func); - cmp->SetSrc1(functionReg); - cmp->SetSrc2(IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfFunction(), TyMachReg, m_func, - IR::AddrOpndKindDynamicIsInstInlineCacheFunctionRef)); - instr->InsertBefore(cmp); - LegalizeMD::LegalizeInstr(cmp, false); - } - - // BNE helper - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::BNE, helper, m_func)); - - if (objectSrc->IsRegOpnd()) - { - objectReg = objectSrc->AsRegOpnd(); - } - else - { - objectReg = IR::RegOpnd::New(TyMachReg, this->m_func); - LowererMD::CreateAssign(objectReg, objectSrc, instr); - } - - // TST objectReg, Js::AtomTag - // BNE done - if (!objectReg->m_sym->m_isNotInt) - { - GenerateObjectTest(objectReg, instr, done); - } - - // LDR typeReg, objectSrc + offsetof(RecyclableObject::type) - instr->InsertBefore(IR::Instr::New(Js::OpCode::LDR, typeReg, - IR::IndirOpnd::New(objectReg, Js::RecyclableObject::GetOffsetOfType(), TyMachReg, m_func), - m_func)); - - // CMP [typeReg + offsetof(Type::typeid)], TypeIds_LastJavascriptPrimitiveType - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, m_func); - cmp->SetSrc1(IR::IndirOpnd::New(typeReg, Js::Type::GetOffsetOfTypeId(), TyInt32, m_func)); - cmp->SetSrc2(IR::IntConstOpnd::New(Js::TypeId::TypeIds_LastJavascriptPrimitiveType, TyInt32, m_func)); - instr->InsertBefore(cmp); - LegalizeMD::LegalizeInstr(cmp, false); - } - - // BLE done - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::BLE, done, m_func)); - - // CMP typeReg, [&(inlineCache->type] - { - IR::Instr * cmp = IR::Instr::New(Js::OpCode::CMP, m_func); - cmp->SetSrc1(typeReg); - cmp->SetSrc2(IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfType(), TyMachReg, m_func)); - instr->InsertBefore(cmp); - LegalizeMD::LegalizeInstr(cmp, false); - } - - // BNE helper - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::BNE, helper, m_func)); - - // LDR dst, [&(inlineCache->result)] - IR::Instr *result = IR::Instr::New(Js::OpCode::LDR, opndDst, - IR::MemRefOpnd::New(inlineCache + Js::IsInstInlineCache::OffsetOfResult(), TyMachReg, m_func), m_func); - instr->InsertBefore(result); - LegalizeMD::LegalizeInstr(result, false); - - if (opndDst != instr->GetDst()) - { - LowererMD::CreateAssign(instr->GetDst(), opndDst, instr); - } - - // B done - instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::B, done, m_func)); - - // LABEL helper - instr->InsertBefore(helper); - - instr->InsertAfter(done); - - return true; -} - // Helper method: inserts legalized assign for given srcOpnd into RegD0 in front of given instr in the following way: -// dstReg = CreateAssign srcOpnd +// dstReg = InsertMove srcOpnd // Used to put args of inline built-in call into RegD0 and RegD1 before we call actual CRT function. void LowererMD::GenerateAssignForBuiltinArg(RegNum dstReg, IR::Opnd* srcOpnd, IR::Instr* instr) { IR::RegOpnd* tempDst = IR::RegOpnd::New(nullptr, dstReg, TyMachDouble, this->m_func); tempDst->m_isCallArg = true; // This is to make sure that lifetime of opnd is virtually extended until next CALL instr. - this->CreateAssign(tempDst, srcOpnd, instr); + Lowerer::InsertMove(tempDst, srcOpnd, instr); } // For given InlineMathXXX instr, generate the call to actual CRT function/CPU instr. @@ -7751,10 +6719,10 @@ void LowererMD::GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMeth // Before: // dst = src1, src2 // After: - // d0 = CreateAssign src1 + // d0 = InsertMove src1 // lr = MOV helperAddr // BLX lr - // dst = CreateAssign call->dst (d0) + // dst = InsertMove call->dst (d0) // Src1 AssertMsg(instr->GetDst()->IsFloat(), "Currently accepting only float args for math helpers -- dst."); @@ -7783,7 +6751,7 @@ void LowererMD::GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMeth floatCall->InsertBefore(movInstr); // Save the result. - this->CreateAssign(instr->UnlinkDst(), floatCall->GetDst(), instr); + Lowerer::InsertMove(instr->UnlinkDst(), floatCall->GetDst(), instr); instr->Remove(); break; } @@ -7792,7 +6760,7 @@ void LowererMD::GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMeth void LowererMD::GenerateFastInlineBuiltInMathAbs(IR::Instr *inlineInstr) { - IR::Opnd* src = inlineInstr->GetSrc1(); + IR::Opnd* src = inlineInstr->GetSrc1()->Copy(this->m_func); IR::Opnd* dst = inlineInstr->UnlinkDst(); Assert(src); IR::Instr* tmpInstr; @@ -8319,7 +7287,7 @@ LowererMD::EmitUIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) IR::RegOpnd *floatReg = IR::RegOpnd::New(TyFloat64, this->m_func); Assert(dst->IsRegOpnd() && dst->IsFloat64()); - Assert(src->IsRegOpnd() && src->IsInt32()); + Assert(src->IsRegOpnd() && (src->IsInt32() || src->IsUInt32())); instr = IR::Instr::New(Js::OpCode::VMOVARMVFP, floatReg, src, this->m_func); instrInsert->InsertBefore(instr); @@ -8599,7 +7567,7 @@ void LowererMD::GenerateFloatTest(IR::RegOpnd * opndSrc, IR::Instr * insertInstr IR::RegOpnd *vt = IR::RegOpnd::New(TyMachPtr, this->m_func); IR::Opnd* opnd = IR::IndirOpnd::New(opndSrc, (int32)0, TyMachPtr, this->m_func); - LowererMD::CreateAssign(vt, opnd, insertInstr); + Lowerer::InsertMove(vt, opnd, insertInstr); // CMP [number], JavascriptNumber::vtable IR::Instr* instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); @@ -8689,7 +7657,7 @@ LowererMD::FinalLower() break; case Js::OpCode::Leave: Assert(this->m_func->DoOptimizeTry() && !this->m_func->IsLoopBodyInTry()); - instrPrev = this->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/); + instrPrev = m_lowerer->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/); break; } } @@ -8809,12 +7777,12 @@ LowererMD::FinalLowerAssign(IR::Instr * instr) IR::Opnd* src1 = instr->GetSrc1(); IR::Opnd* src2 = instr->GetSrc2(); - Assert(src1->IsRegOpnd() && src1->AsRegOpnd()->GetReg() != RegR12); - Assert(src2->IsRegOpnd() && src2->AsRegOpnd()->GetReg() != RegR12); + Assert(src1->IsRegOpnd() && src1->AsRegOpnd()->GetReg() != SCRATCH_REG); + Assert(src2->IsRegOpnd() && src2->AsRegOpnd()->GetReg() != SCRATCH_REG); //r12 = SDIV src1, src2 - IR::RegOpnd *regR12 = IR::RegOpnd::New(nullptr, RegR12, TyMachReg, instr->m_func); - IR::Instr *insertInstr = IR::Instr::New(Js::OpCode::SDIV, regR12, src1, src2, instr->m_func); + IR::RegOpnd *regScratch = IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachReg, instr->m_func); + IR::Instr *insertInstr = IR::Instr::New(Js::OpCode::SDIV, regScratch, src1, src2, instr->m_func); instr->InsertBefore(insertInstr); // dst = MLS (r12,) src2, src1 diff --git a/deps/chakrashim/core/lib/Backend/arm/LowerMD.h b/deps/chakrashim/core/lib/Backend/arm/LowerMD.h index 62fbdca91d6..ba59b12c130 100644 --- a/deps/chakrashim/core/lib/Backend/arm/LowerMD.h +++ b/deps/chakrashim/core/lib/Backend/arm/LowerMD.h @@ -50,6 +50,7 @@ class LowererMD static const uint16 GetFormalParamOffset(); static const Js::OpCode MDUncondBranchOpcode; + static const Js::OpCode MDMultiBranchOpcode; static const Js::OpCode MDTestOpcode; static const Js::OpCode MDOrOpcode; static const Js::OpCode MDXorOpcode; @@ -59,6 +60,7 @@ class LowererMD static const Js::OpCode MDConvertFloat64ToFloat32Opcode; static const Js::OpCode MDCallOpcode; static const Js::OpCode MDImulOpcode; + static const Js::OpCode MDLea; public: void Init(Lowerer *lowerer); @@ -68,11 +70,9 @@ class LowererMD IR::Instr * ChangeToHelperCall(IR::Instr * instr, IR::JnHelperMethod helperMethod, IR::LabelInstr *labelBailOut = nullptr, IR::Opnd *opndInstance = nullptr, IR::PropertySymOpnd * propSymOpnd = nullptr, bool isHelperContinuation = false); IR::Instr * ChangeToHelperCallMem(IR::Instr * instr, IR::JnHelperMethod helperMethod); - static IR::Instr * CreateAssign(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsertPt, bool generateWriteBarrier = true); static IR::Instr * ChangeToAssign(IR::Instr * instr); static IR::Instr * ChangeToAssignNoBarrierCheck(IR::Instr * instr); static IR::Instr * ChangeToAssign(IR::Instr * instr, IRType type); - static IR::Instr * ChangeToLea(IR::Instr *const instr, bool postRegAlloc = false); static IR::Instr * ForceDstToReg(IR::Instr *instr); static void ImmedSrcToReg(IR::Instr * instr, IR::Opnd * newOpnd, int srcNum); @@ -84,12 +84,8 @@ class LowererMD IR::Instr * LoadInputParamCount(IR::Instr * instr, int adjust = 0, bool needFlags = false); IR::Instr * LoadArgumentsFromFrame(IR::Instr * instr); IR::Instr * LowerRet(IR::Instr * instr); - static IR::Instr * LowerUncondBranch(IR::Instr * instr); - static IR::Instr * LowerMultiBranch(IR::Instr * instr); IR::Instr * LowerCondBranch(IR::Instr * instr); IR::Instr * LoadFunctionObjectOpnd(IR::Instr *instr, IR::Opnd *&functionObjOpnd); - IR::Instr * LowerLdEnv(IR::Instr *instr); - IR::Instr * LowerLdSuper(IR::Instr * instr, IR::JnHelperMethod helperOpCode); IR::Instr * GenerateSmIntPairTest(IR::Instr * instrInsert, IR::Opnd * opndSrc1, IR::Opnd * opndSrc2, IR::LabelInstr * labelFail); #if DBG static void GenerateDebugBreak(IR::Instr * insertInstr); @@ -129,28 +125,21 @@ class LowererMD IR::Instr * GenerateFastScopedFld(IR::Instr * instrScopedFld, bool isLoad); IR::Instr * GenerateFastScopedLdFld(IR::Instr * instrLdFld); IR::Instr * GenerateFastScopedStFld(IR::Instr * instrStFld); - bool GenerateJSBooleanTest(IR::RegOpnd * regSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel = false); void GenerateFastAbs(IR::Opnd *dst, IR::Opnd *src, IR::Instr *callInstr, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::LabelInstr *doneLabel); bool GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR::Opnd *srcStr, IR::Opnd *srcIndex, IR::Instr *callInstr, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::LabelInstr *doneLabel); bool TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrPrev); - void GenerateIsDynamicObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool fContinueLabel = false); - void GenerateIsRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool checkObjectAndDynamicObject = true); - bool GenerateLdThisCheck(IR::Instr * instr); - bool GenerateLdThisStrict(IR::Instr* instr); void GenerateFloatTest(IR::RegOpnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr* labelHelper, const bool checkForNullInLoopBody = false); static void EmitInt4Instr(IR::Instr *instr); void EmitLoadVar(IR::Instr *instr, bool isFromUint32 = false, bool isHelper = false); bool EmitLoadInt32(IR::Instr *instr, bool conversionFromObjectAllowed, bool bailOutOnHelper = false, IR::LabelInstr * labelBailOut = nullptr); - IR::Instr * LowerInt64Assign(IR::Instr * instr) { Assert(UNREACHED); return nullptr; } static void LowerInt4NegWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel); static void LowerInt4AddWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel); static void LowerInt4SubWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel); static void LowerInt4MulWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel); void LowerInt4RemWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel) const; - void MarkOneFltTmpSym(StackSym *sym, BVSparse *bvTmps, bool fFltPrefOp); void GenerateNumberAllocation(IR::RegOpnd * opndDst, IR::Instr * instrInsert, bool isHelper); void GenerateFastRecyclerAlloc(size_t allocSize, IR::RegOpnd* newObjDst, IR::Instr* insertionPointInstr, IR::LabelInstr* allocHelperLabel, IR::LabelInstr* allocDoneLabel); void SaveDoubleToVar(IR::RegOpnd * dstOpnd, IR::RegOpnd *opndFloat, IR::Instr *instrOrig, IR::Instr *instrInsert, bool isHelper = false); @@ -159,27 +148,16 @@ class LowererMD void LoadFloatValue(IR::RegOpnd * javascriptNumber, IR::RegOpnd * opndFloat, IR::LabelInstr * labelHelper, IR::Instr * instrInsert, const bool checkFornullptrInLoopBody = false); - IR::Instr * LoadStackAddress(StackSym *sym, IR::RegOpnd *regDst = nullptr); - IR::Instr * LowerCatch(IR::Instr *instr); - - IR::Instr * LowerGetCachedFunc(IR::Instr *instr); - IR::Instr * LowerCommitScope(IR::Instr *instr); - IR::Instr * LowerCallHelper(IR::Instr *instrCall); IR::LabelInstr *GetBailOutStackRestoreLabel(BailOutInfo * bailOutInfo, IR::LabelInstr * exitTargetInstr); - bool AnyFloatTmps(void); - IR::LabelInstr* InsertBeforeRecoveryForFloatTemps(IR::Instr * insertBefore, IR::LabelInstr * labelRecover, const bool isInHelperBlock = true); StackSym * GetImplicitParamSlotSym(Js::ArgSlot argSlot); static StackSym * GetImplicitParamSlotSym(Js::ArgSlot argSlot, Func * func); - bool GenerateFastIsInst(IR::Instr * instr, Js::ScriptContext * scriptContext); IR::Instr * LowerDivI4AndBailOnReminder(IR::Instr * instr, IR::LabelInstr * bailOutLabel); - bool GenerateFastIsInst(IR::Instr * instr); public: IR::Instr * LowerCall(IR::Instr * callInstr, Js::ArgSlot argCount); IR::Instr * LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper = false, IR::Instr* insertBeforeInstrForCFG = nullptr); - IR::Instr * LowerCallPut(IR::Instr * callInstr); int32 LowerCallArgs(IR::Instr * callInstr, IR::Instr * stackParamInsert, ushort callFlags, Js::ArgSlot extraParams = 1 /* for function object */, IR::IntConstOpnd **callInfoOpndRef = nullptr); int32 LowerCallArgs(IR::Instr * callInstr, ushort callFlags, Js::ArgSlot extraParams = 1 /* for function object */, IR::IntConstOpnd **callInfoOpndRef = nullptr) { return LowerCallArgs(callInstr, callInstr, callFlags, extraParams, callInfoOpndRef); } IR::Instr * LowerStartCall(IR::Instr * instr); @@ -208,6 +186,7 @@ class LowererMD void EmitIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); void EmitUIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); void EmitLongToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); + void EmitSignExtend(IR::Instr * instr) { Assert(UNREACHED); } void EmitReinterpretPrimitive(IR::Opnd* dst, IR::Opnd* src, IR::Instr* insertBeforeInstr) { Assert(UNREACHED); } void EmitLoadFloatFromNumber(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr); IR::LabelInstr* EmitLoadFloatCommon(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr, bool needHelperLabel); @@ -216,16 +195,14 @@ class LowererMD IR::Instr * LowerEntryInstr(IR::EntryInstr * entryInstr); IR::Instr * LowerExitInstr(IR::ExitInstr * exitInstr); - IR::Instr * LowerEntryInstrAsmJs(IR::EntryInstr * entryInstr) { Assert(UNREACHED); return nullptr; } IR::Instr * LowerExitInstrAsmJs(IR::ExitInstr * exitInstr) { Assert(UNREACHED); return nullptr; } IR::Instr * LoadNewScObjFirstArg(IR::Instr * instr, IR::Opnd * dst, ushort extraArgs = 0); IR::Instr * LowerTry(IR::Instr *instr, IR::JnHelperMethod helperMethod); - IR::Instr * LowerLeave(IR::Instr *instr, IR::LabelInstr * targetInstr, bool fromFinalLower, bool isOrphanedLeave = false); IR::Instr * LowerLeaveNull(IR::Instr *instr); IR::LabelInstr * EnsureEpilogLabel(); IR::Instr * LowerEHRegionReturn(IR::Instr * insertBeforeInstr, IR::Opnd * targetOpnd); void FinishArgLowering(); - IR::Opnd * GetOpndForArgSlot(Js::ArgSlot argSlot, bool isDoubleArgument = false); + IR::Opnd * GetOpndForArgSlot(Js::ArgSlot argSlot, IR::Opnd * argOpnd = nullptr); bool GenerateStackAllocation(IR::Instr *instr, uint32 allocSize, uint32 probeSize); void GenerateStackDeallocation(IR::Instr *instr, uint32 allocSize); void GenerateStackProbe(IR::Instr *instr, bool afterProlog); @@ -258,13 +235,6 @@ class LowererMD static void GenerateLoadTaggedType(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndTaggedType); static void GenerateLoadPolymorphicInlineCacheSlot(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::RegOpnd * opndType, uint polymorphicInlineCacheSize); - static IR::BranchInstr * GenerateLocalInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext, bool checkTypeWithoutProperty = false); - static IR::BranchInstr * GenerateProtoInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); - static IR::BranchInstr * GenerateFlagInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); - static IR::BranchInstr * GenerateFlagInlineCacheCheckForLocal(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext); - static void GenerateLdFldFromLocalInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); - static void GenerateLdFldFromProtoInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); - static void GenerateLdLocalFldFromFlagInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); static void GenerateStFldFromLocalInlineCache(IR::Instr * instrStFld, IR::RegOpnd * opndBase, IR::Opnd * opndSrc, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); void GenerateFunctionObjectTest(IR::Instr * callInstr, IR::RegOpnd *functionOpnd, bool isHelper, IR::LabelInstr* continueAfterExLabel = nullptr); @@ -281,18 +251,6 @@ class LowererMD static IR::Instr * InsertCmovCC(const Js::OpCode opCode, IR::Opnd * dst, IR::Opnd* src1, IR::Instr* insertBeforeInstr, bool postRegAlloc); private: IR::Opnd* IsOpndNegZero(IR::Opnd* opnd, IR::Instr* instr); - void GenerateFlagInlineCacheCheckForGetterSetter( - IR::Instr * insertBeforeInstr, - IR::RegOpnd * opndInlineCache, - IR::LabelInstr * labelNext); - - void GenerateLdFldFromFlagInlineCache( - IR::Instr * insertBeforeInstr, - IR::RegOpnd * opndBase, - IR::RegOpnd * opndInlineCache, - IR::Opnd * opndDst, - IR::LabelInstr * labelFallThru, - bool isInlineSlot); void GenerateAssignForBuiltinArg( RegNum dstReg, diff --git a/deps/chakrashim/core/lib/Backend/arm/PeepsMD.cpp b/deps/chakrashim/core/lib/Backend/arm/PeepsMD.cpp index 885074b86c9..d157641b7c8 100644 --- a/deps/chakrashim/core/lib/Backend/arm/PeepsMD.cpp +++ b/deps/chakrashim/core/lib/Backend/arm/PeepsMD.cpp @@ -21,7 +21,7 @@ PeepsMD::ProcessImplicitRegs(IR::Instr *instr) this->peeps->ClearReg(RegR1); this->peeps->ClearReg(RegR2); this->peeps->ClearReg(RegR3); - this->peeps->ClearReg(RegR12); + this->peeps->ClearReg(SCRATCH_REG); this->peeps->ClearReg(RegLR); this->peeps->ClearReg(RegD0); this->peeps->ClearReg(RegD1); @@ -37,7 +37,7 @@ PeepsMD::ProcessImplicitRegs(IR::Instr *instr) { // As we don't currently have support for 4 operand instrs, we use R12 as 4th operand, // Notify the peeps that we use r12: SMULL, dst, r12, src1, src2. - this->peeps->ClearReg(RegR12); + this->peeps->ClearReg(SCRATCH_REG); } } diff --git a/deps/chakrashim/core/lib/Backend/arm/RegList.h b/deps/chakrashim/core/lib/Backend/arm/RegList.h index 506b3a2ef98..bc92e8704d4 100644 --- a/deps/chakrashim/core/lib/Backend/arm/RegList.h +++ b/deps/chakrashim/core/lib/Backend/arm/RegList.h @@ -34,6 +34,10 @@ REGDAT(SP, sp, 13, TyInt32, RA_DONTALLOCATE) REGDAT(LR, lr, 14, TyInt32, 0) REGDAT(PC, pc, 15, TyInt32, RA_DONTALLOCATE) +#ifndef INT_ARG_REG_COUNT +#define INT_ARG_REG_COUNT 4 +#endif + // VFP Floating Point Registers REGDAT(D0, d0, 0, TyFloat64, 0) REGDAT(D1, d1, 1, TyFloat64, 0) diff --git a/deps/chakrashim/core/lib/Backend/arm/UnwindInfoManager.cpp b/deps/chakrashim/core/lib/Backend/arm/UnwindInfoManager.cpp index 966356c5f75..7e26381b6b0 100644 --- a/deps/chakrashim/core/lib/Backend/arm/UnwindInfoManager.cpp +++ b/deps/chakrashim/core/lib/Backend/arm/UnwindInfoManager.cpp @@ -728,6 +728,11 @@ void UnwindInfoManager::SetSavedReg(BYTE reg) Assert(reg <= RegEncode[RegR12]); this->savedRegMask |= 1 << reg; } +bool UnwindInfoManager::TestSavedReg(BYTE reg) const +{ + DWORD mask = 1 << reg; + return (this->savedRegMask & mask) == mask; +} void UnwindInfoManager::SetDoubleSavedRegList(DWORD doubleRegMask) { diff --git a/deps/chakrashim/core/lib/Backend/arm/UnwindInfoManager.h b/deps/chakrashim/core/lib/Backend/arm/UnwindInfoManager.h index eb442af5a7d..0471f746857 100644 --- a/deps/chakrashim/core/lib/Backend/arm/UnwindInfoManager.h +++ b/deps/chakrashim/core/lib/Backend/arm/UnwindInfoManager.h @@ -134,6 +134,7 @@ class UnwindInfoManager bool GetHasChkStk() const; DWORD GetPDataCount(DWORD length); void SetSavedReg(BYTE reg); + bool TestSavedReg(BYTE reg) const; DWORD ClearSavedReg(DWORD mask, BYTE reg) const; void SetDoubleSavedRegList(DWORD doubleRegMask); diff --git a/deps/chakrashim/core/lib/Backend/arm/machvalues.h b/deps/chakrashim/core/lib/Backend/arm/machvalues.h new file mode 100644 index 00000000000..eb770e33fc9 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm/machvalues.h @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#pragma once + +// +// Machine dependent constants. +// +static const int MachChar = 1; +static const int MachShort = 2; +static const int MachInt = 4; +static const int MachRegInt = 4; +static const int MachPtr = 4; +static const int MachDouble = 8; +static const int MachRegDouble = 8; +static const int MachArgsSlotOffset = MachPtr; +static const int MachStackAlignment = MachDouble; \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/arm/md.h b/deps/chakrashim/core/lib/Backend/arm/md.h index 11376197561..273c3860348 100644 --- a/deps/chakrashim/core/lib/Backend/arm/md.h +++ b/deps/chakrashim/core/lib/Backend/arm/md.h @@ -11,19 +11,6 @@ #undef MD_ENCODE_LG_CONSTS #define MD_ENCODE_LG_CONSTS false -// -// Machine dependent constants. -// -const int MachChar = 1; -const int MachShort = 2; -const int MachInt = 4; -const int MachRegInt = 4; -__declspec(selectany) const int MachPtr = 4; -const int MachDouble = 8; -const int MachRegDouble = 8; -const int MachArgsSlotOffset = MachPtr; -const int MachStackAlignment = MachDouble; - const int PAGESIZE = 0x1000; const IRType TyMachReg = TyInt32; diff --git a/deps/chakrashim/core/lib/Backend/arm64/ARM64Encoder.h b/deps/chakrashim/core/lib/Backend/arm64/ARM64Encoder.h new file mode 100644 index 00000000000..5ff7ce7e237 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/ARM64Encoder.h @@ -0,0 +1,4598 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +#include "ARM64LogicalImmediates.h" + + +#define IS_CONST_00001FFF(x) (((x) & ~0x00001fff) == 0) +#define IS_CONST_0003FFFF(x) (((x) & ~0x0003ffff) == 0) +#define IS_CONST_01FFFFFF(x) (((x) & ~0x01ffffff) == 0) + +#define IS_CONST_NEG_14(x) (((x) & ~0x00001fff) == ~0x00001fff) +#define IS_CONST_NEG_19(x) (((x) & ~0x0003ffff) == ~0x0003ffff) +#define IS_CONST_NEG_26(x) (((x) & ~0x01ffffff) == ~0x01ffffff) + +#define IS_CONST_INT14(x) (IS_CONST_00001FFF(x) || IS_CONST_NEG_14(x)) +#define IS_CONST_INT19(x) (IS_CONST_0003FFFF(x) || IS_CONST_NEG_19(x)) +#define IS_CONST_INT26(x) (IS_CONST_01FFFFFF(x) || IS_CONST_NEG_26(x)) + + +// +// Core types +// + +typedef UCHAR ARM64_REGISTER; + +enum +{ + // + // Base register set (0-49) + // + // PC is not represented since it's not numbered. + // + + ARMREG_R0 = 0, + ARMREG_R1 = 1, + ARMREG_R2 = 2, + ARMREG_R3 = 3, + ARMREG_R4 = 4, + ARMREG_R5 = 5, + ARMREG_R6 = 6, + ARMREG_R7 = 7, + ARMREG_R8 = 8, + ARMREG_R9 = 9, + ARMREG_R10 = 10, + ARMREG_R11 = 11, + ARMREG_R12 = 12, + ARMREG_R13 = 13, + ARMREG_R14 = 14, + ARMREG_R15 = 15, + ARMREG_R16 = 16, + ARMREG_R17 = 17, + ARMREG_R18 = 18, + ARMREG_R19 = 19, + ARMREG_R20 = 20, + ARMREG_R21 = 21, + ARMREG_R22 = 22, + ARMREG_R23 = 23, + ARMREG_R24 = 24, + ARMREG_R25 = 25, + ARMREG_R26 = 26, + ARMREG_R27 = 27, + ARMREG_R28 = 28, + ARMREG_FP = 29, + ARMREG_LR = 30, + ARMREG_SP = 31, + ARMREG_ZR = ARMREG_SP, + + ARMREG_FIRST = ARMREG_R0, + ARMREG_LAST = ARMREG_ZR, + ARMREG_COUNT = ARMREG_LAST - ARMREG_FIRST + 1, + + ARMREG_INVALID = 49, + + // + // NEON register set (50-99) + // + + NEONREG_BASE = 50, + NEONREG_Q0 = NEONREG_BASE + 0, + NEONREG_Q1 = NEONREG_BASE + 1, + NEONREG_Q2 = NEONREG_BASE + 2, + NEONREG_Q3 = NEONREG_BASE + 3, + NEONREG_Q4 = NEONREG_BASE + 4, + NEONREG_Q5 = NEONREG_BASE + 5, + NEONREG_Q6 = NEONREG_BASE + 6, + NEONREG_Q7 = NEONREG_BASE + 7, + NEONREG_Q8 = NEONREG_BASE + 8, + NEONREG_Q9 = NEONREG_BASE + 9, + NEONREG_Q10 = NEONREG_BASE + 10, + NEONREG_Q11 = NEONREG_BASE + 11, + NEONREG_Q12 = NEONREG_BASE + 12, + NEONREG_Q13 = NEONREG_BASE + 13, + NEONREG_Q14 = NEONREG_BASE + 14, + NEONREG_Q15 = NEONREG_BASE + 15, + NEONREG_Q16 = NEONREG_BASE + 16, + NEONREG_Q17 = NEONREG_BASE + 17, + NEONREG_Q18 = NEONREG_BASE + 18, + NEONREG_Q19 = NEONREG_BASE + 19, + NEONREG_Q20 = NEONREG_BASE + 20, + NEONREG_Q21 = NEONREG_BASE + 21, + NEONREG_Q22 = NEONREG_BASE + 22, + NEONREG_Q23 = NEONREG_BASE + 23, + NEONREG_Q24 = NEONREG_BASE + 24, + NEONREG_Q25 = NEONREG_BASE + 25, + NEONREG_Q26 = NEONREG_BASE + 26, + NEONREG_Q27 = NEONREG_BASE + 27, + NEONREG_Q28 = NEONREG_BASE + 28, + NEONREG_Q29 = NEONREG_BASE + 29, + NEONREG_Q30 = NEONREG_BASE + 30, + NEONREG_Q31 = NEONREG_BASE + 31, + + NEONREG_FIRST = NEONREG_Q0, + NEONREG_LAST = NEONREG_Q31, + NEONREG_COUNT = NEONREG_LAST - NEONREG_FIRST + 1, + + NEONREG_D0 = NEONREG_Q0, + NEONREG_D1 = NEONREG_Q1, + NEONREG_D2 = NEONREG_Q2, + NEONREG_D3 = NEONREG_Q3, + NEONREG_D4 = NEONREG_Q4, + NEONREG_D5 = NEONREG_Q5, + NEONREG_D6 = NEONREG_Q6, + NEONREG_D7 = NEONREG_Q7, + NEONREG_D8 = NEONREG_Q8, + NEONREG_D9 = NEONREG_Q9, + NEONREG_D10 = NEONREG_Q10, + NEONREG_D11 = NEONREG_Q11, + NEONREG_D12 = NEONREG_Q12, + NEONREG_D13 = NEONREG_Q13, + NEONREG_D14 = NEONREG_Q14, + NEONREG_D15 = NEONREG_Q15, + NEONREG_D16 = NEONREG_Q16, + NEONREG_D17 = NEONREG_Q17, + NEONREG_D18 = NEONREG_Q18, + NEONREG_D19 = NEONREG_Q19, + NEONREG_D20 = NEONREG_Q20, + NEONREG_D21 = NEONREG_Q21, + NEONREG_D22 = NEONREG_Q22, + NEONREG_D23 = NEONREG_Q23, + NEONREG_D24 = NEONREG_Q24, + NEONREG_D25 = NEONREG_Q25, + NEONREG_D26 = NEONREG_Q26, + NEONREG_D27 = NEONREG_Q27, + NEONREG_D28 = NEONREG_Q28, + NEONREG_D29 = NEONREG_Q29, + NEONREG_D30 = NEONREG_Q30, + NEONREG_D31 = NEONREG_Q31, + + NEONREG_INVALID = 99, +}; + +#define LAST_FLOAT_REG_ENCODE NEONREG_D31 + +// +// Condition code types. +// + +enum +{ + COND_EQ = 0, // Equal: Z == 1 + COND_NE = 1, // Not equal: Z == 0 + COND_CS = 2, // Carry set: C == 1 + COND_CC = 3, // Carry clear: C == 0 + COND_MI = 4, // Negative: N == 1 + COND_PL = 5, // Positive: N == 0 + COND_VS = 6, // Overflow: V == 1 + COND_VC = 7, // No overflow: V == 0 + COND_HI = 8, // Unsigned higher: C == 1 and Z == 0 + COND_LS = 9, // Unsigned lower: C == 0 or Z == 1 + COND_GE = 10, // Signed GE: N == V + COND_LT = 11, // Signed LT: N != V + COND_GT = 12, // Signed GT: Z == 0 and N == V + COND_LE = 13, // Signed LE: Z == 1 or N != V + COND_AL = 14 // Always +}; + +// +// BRK types. +// + +#define BrkOpcode(Code) (0xd4200000 | ((Code) << 5)) + +enum +{ + ARM64_BREAK_DEBUG_BASE = 0xf000, + ARM64_BREAKPOINT = ARM64_BREAK_DEBUG_BASE + 0, + ARM64_ASSERT = ARM64_BREAK_DEBUG_BASE + 1, + ARM64_DEBUG_SERVICE = ARM64_BREAK_DEBUG_BASE + 2, + ARM64_FASTFAIL = ARM64_BREAK_DEBUG_BASE + 3, + ARM64_DIVIDE_BY_0 = ARM64_BREAK_DEBUG_BASE + 4 +}; + +// +// Special opcodes. +// + +static const ULONG ARM64_OPCODE_NOP = 0xd503201f; +static const ULONG ARM64_OPCODE_DMB_ISH = 0xd5033bbf; +static const ULONG ARM64_OPCODE_DMB_ISHST = 0xd5033abf; +static const ULONG ARM64_OPCODE_DMB_ISHLD = 0xd50339bf; + +// +// Conditional compare flags for CCMP and CCMN instructions. +// + +enum +{ + CCMP_N = 0x8, + CCMP_Z = 0x4, + CCMP_C = 0x2, + CCMP_V = 0x1 +}; + +// +// Classes of branch encodings. +// + +enum BRANCH_CLASS +{ + CLASS_INVALID, + CLASS_IMM26, // B, inserted at bit 0 + CLASS_IMM19, // B.cond/CBZ/CBNZ, inserted at bit 5 + CLASS_IMM14, // TBZ/TBNZ, inserted at bit 5 +}; + +// +// Shift types used by register parameters +// + +enum SHIFT_EXTEND_TYPE +{ + SHIFT_LSL = 0, // OK for AND/BIC/EON/EOR/ORN/ORR/TST/ADD/CMN/CMP/SUB + SHIFT_LSR = 1, // OK for AND/BIC/EON/EOR/ORN/ORR/TST/ADD/CMN/CMP/SUB + SHIFT_ASR = 2, // OK for AND/BIC/EON/EOR/ORN/ORR/TST/ADD/CMN/CMP/SUB + SHIFT_ROR = 3, // OK for AND/BIC/EON/EOR/ORN/ORR/TST + SHIFT_NONE = 4, + + EXTEND_UXTB = 8, + EXTEND_UXTH = 9, + EXTEND_UXTW = 10, + EXTEND_UXTX = 11, + EXTEND_SXTB = 12, + EXTEND_SXTH = 13, + EXTEND_SXTW = 14, + EXTEND_SXTX = 15, +}; + +// +// Bit shift for scale of indir access +// + +enum INDEX_SCALE +{ + INDEX_SCALE_1 = 0, + INDEX_SCALE_2 = 1, + INDEX_SCALE_4 = 2, + INDEX_SCALE_8 = 3, +}; + +static const BYTE RegEncode[] = +{ +#define REGDAT(Name, Listing, Encoding, ...) Encoding, +#include "RegList.h" +#undef REGDAT +}; + +// +// Basic code emitter class +// + +class Arm64CodeEmitter +{ +public: + Arm64CodeEmitter( + PULONG BasePtr, + ULONG BufferSizeInBytes + ) + : m_BasePtr(BasePtr), + m_Offset(0), + m_MaxOffset(BufferSizeInBytes / 4) + { + } + + int + EmitFourBytes( + ULONG Data + ) + { + NT_ASSERT(m_Offset < m_MaxOffset); + m_BasePtr[m_Offset++] = Data; + return 4; + } + + ULONG + GetEmittedByteCount() const + { + return m_Offset * 4; + } + + PULONG + GetEmitAreaBase() const + { + return m_BasePtr; + } + +private: + PULONG m_BasePtr; + ULONG m_Offset; + ULONG m_MaxOffset; +}; + +// +// Derived emitter class that outputs to a local buffer +// + +template +class Arm64LocalCodeEmitter : public Arm64CodeEmitter +{ +public: + Arm64LocalCodeEmitter() : + Arm64CodeEmitter(&m_Buffer[0], MaxOpcodes * 4) + { + } + + DWORD + Opcode( + int Index = 0 + ) + { + return m_Buffer[Index]; + } + +private: + ULONG m_Buffer[MaxOpcodes]; +}; + +// +// Wrapper for an ARM64 register parameter, complete with shift type and amount +// + +class Arm64RegisterParam +{ + static const UCHAR REGISTER_SHIFT = 0; + static const UCHAR REGISTER_MASK = 0xff; + static const ULONG REGISTER_MASK_SHIFTED = REGISTER_MASK << REGISTER_SHIFT; + + static const UCHAR SHIFT_TYPE_SHIFT = 8; + static const UCHAR SHIFT_TYPE_MASK = 0x0f; + static const ULONG SHIFT_TYPE_MASK_SHIFTED = SHIFT_TYPE_MASK << SHIFT_TYPE_SHIFT; + static const ULONG SHIFT_NONE_SHIFTED = SHIFT_NONE << SHIFT_TYPE_SHIFT; + + static const UCHAR SHIFT_COUNT_SHIFT = 12; + static const UCHAR SHIFT_COUNT_MASK = 0x3f; + static const ULONG SHIFT_COUNT_MASK_SHIFTED = SHIFT_COUNT_MASK << SHIFT_COUNT_SHIFT; + +protected: + + // + // N.B. Derived class must initialize m_Encoded. + // + + Arm64RegisterParam() { } + +public: + Arm64RegisterParam( + ARM64_REGISTER Reg, + SHIFT_EXTEND_TYPE Type = SHIFT_NONE, + UCHAR Amount = 0 + ) + : m_Encoded(((Reg & REGISTER_MASK) << REGISTER_SHIFT) | + ((Type & SHIFT_TYPE_MASK) << SHIFT_TYPE_SHIFT) | + ((Amount & SHIFT_COUNT_MASK) << SHIFT_COUNT_SHIFT)) + { + AssertValidRegister(Reg); + AssertValidShift(Type, Amount); + } + + ARM64_REGISTER + Register() const + { + return (m_Encoded >> REGISTER_SHIFT) & REGISTER_MASK; + } + + UCHAR + RawRegister() const + { + return UCHAR(Register() - ARMREG_FIRST); + } + + SHIFT_EXTEND_TYPE + ShiftType() const + { + return SHIFT_EXTEND_TYPE((m_Encoded >> SHIFT_TYPE_SHIFT) & SHIFT_TYPE_MASK); + } + + UCHAR + ShiftCount() const + { + return (m_Encoded >> SHIFT_COUNT_SHIFT) & SHIFT_COUNT_MASK; + } + + bool + IsRegOnly() const + { + return ((m_Encoded & SHIFT_TYPE_MASK_SHIFTED) == SHIFT_NONE_SHIFTED); + } + + bool + IsExtended() const + { + return (ShiftType() >= EXTEND_UXTB); + } + + ULONG + Encode() const + { + NT_ASSERT(!IsExtended()); + return (((ShiftType() & 3) << 22) | + (RawRegister() << 16) | + (ShiftCount() << 10)); + } + + ULONG + EncodeExtended() const + { + NT_ASSERT(IsExtended()); + return (((RawRegister() << 16) | + (ShiftType() & 7) << 13) | + (ShiftCount() << 10)); + } + +protected: + static + void + AssertValidRegister( + ARM64_REGISTER Reg + ) + { + UNREFERENCED_PARAMETER(Reg); + NT_ASSERT(Reg >= ARMREG_FIRST && Reg <= ARMREG_LAST); + } + + static + void + AssertValidShift( + SHIFT_EXTEND_TYPE Type, + UCHAR Amount + ) + { + UNREFERENCED_PARAMETER(Type); + UNREFERENCED_PARAMETER(Amount); + NT_ASSERT(Type != SHIFT_NONE || Amount == 0); + NT_ASSERT(Type != SHIFT_LSL || (Amount >= 0 && Amount <= 63)); + NT_ASSERT(Type != SHIFT_LSR || (Amount >= 0 && Amount <= 63)); + NT_ASSERT(Type != SHIFT_ASR || (Amount >= 0 && Amount <= 63)); + NT_ASSERT(Type != SHIFT_ROR || (Amount >= 0 && Amount <= 63)); + NT_ASSERT(Type < EXTEND_UXTB || (Amount >= 0 && Amount <= 4)); + } + + ULONG m_Encoded; +}; + +// +// Wrapper for an ARM register parameter that can have no shift +// + +class Arm64SimpleRegisterParam : public Arm64RegisterParam +{ +public: + Arm64SimpleRegisterParam( + ARM64_REGISTER Reg + ) + : Arm64RegisterParam(Reg) + { + } + + Arm64SimpleRegisterParam( + const Arm64RegisterParam &Src + ) + : Arm64RegisterParam(Src.Register()) + { + NT_ASSERT(Src.IsRegOnly()); + } + + bool + IsRegOnly() const + { + return true; + } + +private: + ULONG + Encode() const + { + return 0; + } +}; + +// +// Branch linker helper class +// + +class ArmBranchLinker +{ + static const ULONG EMITTER_INVALID_OFFSET = 0x80000000; + +public: + ArmBranchLinker( + ULONG OffsetFromEmitterBase = EMITTER_INVALID_OFFSET + ) + : m_InstructionOffset(EMITTER_INVALID_OFFSET), + m_TargetOffset(OffsetFromEmitterBase), + m_BranchClass(CLASS_INVALID), + m_Resolved(false) + { + } + + ArmBranchLinker( + Arm64CodeEmitter &Emitter + ) + : m_InstructionOffset(EMITTER_INVALID_OFFSET), + m_TargetOffset(Emitter.GetEmittedByteCount()), + m_BranchClass(CLASS_INVALID), + m_Resolved(false) + { + } + + ~ArmBranchLinker() + { + if (HasInstruction() && HasTarget()) { + NT_ASSERT(m_Resolved); + } + } + + bool + HasInstruction() const + { + return (m_InstructionOffset != EMITTER_INVALID_OFFSET); + } + + bool + HasTarget() const + { + return (m_TargetOffset != EMITTER_INVALID_OFFSET); + } + + void + Reset() + { + m_InstructionOffset = EMITTER_INVALID_OFFSET; + m_TargetOffset = EMITTER_INVALID_OFFSET; + m_BranchClass = CLASS_INVALID; + } + + void + SetInstructionOffset( + ULONG InstructionOffset + ) + { + NT_ASSERT(InstructionOffset % 4 == 0); + m_InstructionOffset = InstructionOffset / 4; + } + + void + SetClass( + BRANCH_CLASS Class + ) + { + m_BranchClass = Class; + } + + void + SetInstructionAddressAndClass( + Arm64CodeEmitter &Emitter, + BRANCH_CLASS Class + ) + { + SetInstructionOffset(Emitter.GetEmittedByteCount()); + SetClass(Class); + } + + void + SetTarget( + INT32 OffsetFromEmitterBase + ) + { + NT_ASSERT(OffsetFromEmitterBase % 4 == 0); + m_TargetOffset = OffsetFromEmitterBase / 4; + } + + void + SetTarget( + Arm64CodeEmitter &Emitter + ) + { + SetTarget(Emitter.GetEmittedByteCount()); + Resolve(Emitter); + } + + void + SetTargetAbsolute( + Arm64CodeEmitter &Emitter, + PULONG Target + ) + { + ULONG_PTR Delta = ULONG_PTR(Target) - ULONG_PTR(Emitter.GetEmitAreaBase()); + NT_ASSERT(INT32(Delta) == Delta); + SetTarget(INT32(Delta)); + Resolve(Emitter); + } + + void + ResetTarget() + { + m_TargetOffset = EMITTER_INVALID_OFFSET; + } + + void + Resolve( + PULONG EmitterBlockBase + ) + { + if (!HasInstruction() || !HasTarget()) { + return; + } + + PULONG InstructionAddress = EmitterBlockBase + m_InstructionOffset; + *InstructionAddress = UpdateInstruction(*InstructionAddress); + m_Resolved = true; + } + + void + Resolve( + Arm64CodeEmitter &Emitter + ) + { + Resolve(Emitter.GetEmitAreaBase()); + } + + static void + LinkRaw( + PULONG ExistingInstruction, + PULONG TargetInstruction + ) + { + ULONG Instruction = *ExistingInstruction; + + // + // Determine instruction class from bits: + // + // B 000101oo.oooooooo.oooooooo.oooooooo = IMM26 + // BL 100101oo.oooooooo.oooooooo.oooooooo = IMM26 + // B.cond 01010100.oooooooo.oooooooo.ooo0cccc = IMM19 + // CBZ/NZ x011010x.oooooooo.oooooooo.ooorrrrr = IMM19 + // TBZ/NZ b011011x.bbbbbooo.oooooooo.ooorrrrr = IMM14 + // + + BRANCH_CLASS Class; + if ((Instruction & 0x7c000000) == 0x14000000) { + Class = CLASS_IMM26; + } else if ((Instruction & 0xff000010) == 0x54000000 || + (Instruction & 0x7e000000) == 0x34000000) { + Class = CLASS_IMM19; + } else if ((Instruction & 0x7e000000) == 0x36000000) { + Class = CLASS_IMM14; + } else { + NT_ASSERT(FALSE); + return; + } + + Arm64CodeEmitter Emitter(ExistingInstruction, 4); + ArmBranchLinker Linker; + Linker.SetInstructionAddressAndClass(Emitter, Class); + Linker.SetTarget(INT32(4 * (TargetInstruction - ExistingInstruction))); + Linker.Resolve(Emitter); + } + +private: + ULONG + UpdateInstruction( + ULONG Instruction + ) + { + INT32 Delta = INT32(m_TargetOffset - m_InstructionOffset); + switch (m_BranchClass) { + + case CLASS_IMM26: + NT_ASSERT(((INT32(Delta << (32-26))) >> (32-26)) == Delta); + NT_ASSERT((Instruction & 0x03ffffff) == 0); + NT_ASSERT((Instruction & 0x7c000000) == 0x14000000); + Instruction = (Instruction & 0xfc000000) | (Delta & 0x03ffffff); + break; + + case CLASS_IMM19: + NT_ASSERT(((INT32(Delta << (32-19))) >> (32-19)) == Delta); + NT_ASSERT((Instruction & 0x00ffffe0) == 0); + NT_ASSERT((Instruction & 0xff000000) == 0x54000000 || (Instruction & 0x7e000000) == 0x34000000); + Instruction = (Instruction & 0xff00001f) | ((Delta << 5) & 0x00ffffe0); + break; + + case CLASS_IMM14: + NT_ASSERT(((INT32(Delta << (32-14))) >> (32-14)) == Delta); + NT_ASSERT((Instruction & 0x0007ffe0) == 0); + NT_ASSERT((Instruction & 0x7e000000) == 0x36000000); + Instruction = (Instruction & 0xfff8001f) | ((Delta << 5) & 0x0007ffe0); + break; + } + return Instruction; + } + + ULONG m_InstructionOffset; + INT32 m_TargetOffset; + BRANCH_CLASS m_BranchClass; + bool m_Resolved; +}; + +// +// NOP +// + +inline +int +EmitNop( + Arm64CodeEmitter &Emitter + ) +{ + return Emitter.EmitFourBytes(ARM64_OPCODE_NOP); +} + +// +// DMB ISH +// + +inline +int +EmitDmb( + Arm64CodeEmitter &Emitter + ) +{ + return Emitter.EmitFourBytes(ARM64_OPCODE_DMB_ISH); +} + +// +// DMB ISHST +// + +inline +int +EmitDmbSt( + Arm64CodeEmitter &Emitter + ) + +{ + + return Emitter.EmitFourBytes(ARM64_OPCODE_DMB_ISHST); +} + +// +// DMB ISHLD +// + +inline +int +EmitDmbLd( + Arm64CodeEmitter &Emitter + ) + +{ + + return Emitter.EmitFourBytes(ARM64_OPCODE_DMB_ISHLD); +} + +// +// BRK #Code +// + +inline +int +EmitBrk( + Arm64CodeEmitter &Emitter, + USHORT Code + ) +{ + return Emitter.EmitFourBytes(BrkOpcode(Code)); +} + +inline +int +EmitDebugBreak( + Arm64CodeEmitter &Emitter + ) +{ + return EmitBrk(Emitter, ARM64_BREAKPOINT); +} + +inline +int +EmitFastFail( + Arm64CodeEmitter &Emitter + ) +{ + return EmitBrk(Emitter, ARM64_FASTFAIL); +} + +inline +int +EmitDiv0Exception( + Arm64CodeEmitter &Emitter + ) +{ + return EmitBrk(Emitter, ARM64_DIVIDE_BY_0); +} + +// +// MRS dest, systemreg +// + +#define ARM64_NZCV ARM64_SYSREG(3,3, 4, 2,0) // Flags (EL0); arm64_x.h +#define ARM64_CNTVCT ARM64_SYSREG(3,3,14, 0,2) // Generic Timer virtual count + +inline +int +EmitMrs( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG SystemReg + ) +{ + + NT_ASSERT(SystemReg < (1 << 15)); + + return Emitter.EmitFourBytes(0xd5300000 | (SystemReg << 5) | Dest.RawRegister()); +} + + +// +// MSR systemreg, source +// + +inline +int +EmitMsr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + ULONG SystemReg + ) +{ + + NT_ASSERT(SystemReg < (1 << 15)); + + return Emitter.EmitFourBytes(0xd5100000 | (SystemReg << 5) | Source.RawRegister()); +} + +// +// B target +// + +inline +ULONG +BranchOpcode( + LONG Offset + ) + +{ + + NT_ASSERT((Offset >= -(1 << 25)) && (Offset < (1 << 25))); + NT_ASSERT((Offset & 0x3) == 0); + + LONG OffsetInWords = (Offset / 4); + + return (0x14000000 | (OffsetInWords & ((1 << 26) - 1))); +} + +// +// B target +// B.cond target +// CBZ source, target +// CBNZ source, target +// TBZ source, bit, target +// TBNZ source, bit, target +// + +inline +int +EmitBranchCommon( + Arm64CodeEmitter &Emitter, + ArmBranchLinker &Linker, + BRANCH_CLASS Class, + UINT32 Opcode + ) +{ + Linker.SetInstructionAddressAndClass(Emitter, Class); + int Result = Emitter.EmitFourBytes(Opcode); + Linker.Resolve(Emitter); + return Result; +} + +inline +int +EmitBranch( + Arm64CodeEmitter &Emitter, + ArmBranchLinker &Linker, + ULONG Condition = COND_AL + ) +{ + if (Condition == COND_AL) { + return EmitBranchCommon(Emitter, Linker, CLASS_IMM26, 0x14000000); + } else { + return EmitBranchCommon(Emitter, Linker, CLASS_IMM19, 0x54000000 | (Condition & 15)); + } +} + +inline +int +EmitBl( + Arm64CodeEmitter &Emitter, + ArmBranchLinker &Linker + ) +{ + return EmitBranchCommon(Emitter, Linker, CLASS_IMM26, 0x94000000); +} + +inline +int +EmitCbz( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg, + ArmBranchLinker &Linker + ) +{ + return EmitBranchCommon(Emitter, Linker, CLASS_IMM19, 0x34000000 | Reg.RawRegister()); +} + +inline +int +EmitCbz64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg, + ArmBranchLinker &Linker + ) +{ + return EmitBranchCommon(Emitter, Linker, CLASS_IMM19, 0xb4000000 | Reg.RawRegister()); +} + +inline +int +EmitCbnz( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg, + ArmBranchLinker &Linker + ) +{ + return EmitBranchCommon(Emitter, Linker, CLASS_IMM19, 0x35000000 | Reg.RawRegister()); +} + +inline +int +EmitCbnz64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg, + ArmBranchLinker &Linker + ) +{ + return EmitBranchCommon(Emitter, Linker, CLASS_IMM19, 0xb5000000 | Reg.RawRegister()); +} + +inline +int +EmitTbz( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg, + ULONG Bit, + ArmBranchLinker &Linker + ) +{ + //NT_ASSERT(Bit >= 0 && Bit <= 63); + + return EmitBranchCommon(Emitter, Linker, CLASS_IMM14, + 0x36000000 | ((Bit >> 5) << 31) | ((Bit & 0x1f) << 19) | Reg.RawRegister()); +} + +inline +int +EmitTbnz( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg, + ULONG Bit, + ArmBranchLinker &Linker + ) +{ + //NT_ASSERT(Bit >= 0 && Bit <= 63); + + return EmitBranchCommon(Emitter, Linker, CLASS_IMM14, + 0x37000000 | ((Bit >> 5) << 31) | ((Bit & 0x1f) << 19) | Reg.RawRegister()); +} + +inline +int +EmitBr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg + ) +{ + return Emitter.EmitFourBytes(0xd61f0000 | (Reg.RawRegister() << 5)); +} + +inline +int +EmitBlr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg + ) +{ + return Emitter.EmitFourBytes(0xd63f0000 | (Reg.RawRegister() << 5)); +} + +inline +int +EmitRet( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Reg + ) +{ + return Emitter.EmitFourBytes(0xd65f0000 | (Reg.RawRegister() << 5)); +} + +// +// ADD dest, source1, source2 [with optional shift/extension] +// ADDS dest, source1, source2 [with optional shift/extension] +// SUB dest, source1, source2 [with optional shift/extension] +// SUBS dest, source1, source2 [with optional shift/extension] +// CMP source1, source2 [with optional shift/extension] +// + +inline +int +EmitAddSubRegisterCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2, + UINT32 Opcode, + UINT32 ExtendedOpcode + ) +{ + NT_ASSERT(Src2.ShiftType() != SHIFT_ROR); + + // + // ADD/SUB (shifted register) + // + + if (Src2.IsExtended()) { + NT_ASSERT(ExtendedOpcode != 0); + return Emitter.EmitFourBytes(ExtendedOpcode | Src2.EncodeExtended() | (Src1.RawRegister() << 5) | Dest.RawRegister()); + } else { + return Emitter.EmitFourBytes(Opcode | Src2.Encode() | (Src1.RawRegister() << 5) | Dest.RawRegister()); + } +} + +inline +int +EmitAddRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAddSubRegisterCommon(Emitter, Dest, Src1, Src2, 0x0b000000, 0x0b200000); +} + +inline +int +EmitAddRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAddSubRegisterCommon(Emitter, Dest, Src1, Src2, 0x8b000000, 0x8b200000); +} + +inline +int +EmitAddsRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAddSubRegisterCommon(Emitter, Dest, Src1, Src2, 0x2b000000, 0x2b200000); +} + +inline +int +EmitAddsRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAddSubRegisterCommon(Emitter, Dest, Src1, Src2, 0xab000000, 0x8b200000); +} + +inline +int +EmitSubRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAddSubRegisterCommon(Emitter, Dest, Src1, Src2, 0x4b000000, 0x4b200000); +} + +inline +int +EmitSubRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAddSubRegisterCommon(Emitter, Dest, Src1, Src2, 0xcb000000, 0xcb200000); +} + +inline +int +EmitSubsRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAddSubRegisterCommon(Emitter, Dest, Src1, Src2, 0x6b000000, 0x6b200000); +} + +inline +int +EmitSubsRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAddSubRegisterCommon(Emitter, Dest, Src1, Src2, 0xeb000000, 0xeb200000); +} + +inline +int +EmitCmpRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitSubsRegister(Emitter, ARMREG_ZR, Src1, Src2); +} + +inline +int +EmitCmpRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitSubsRegister64(Emitter, ARMREG_ZR, Src1, Src2); +} + +// +// ADC dest, source1, source2 +// ADCS dest, source1, source2 +// SBC dest, source1, source2 +// SBCS dest, source1, source2 +// + +inline +int +EmitAdcSbcRegisterCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + UINT32 Opcode + ) + +{ + return Emitter.EmitFourBytes(Opcode | (Src2.RawRegister() << 16) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitAdcRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitAdcSbcRegisterCommon(Emitter, Dest, Src1, Src2, 0x1a000000); +} + +inline +int +EmitAdcRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitAdcSbcRegisterCommon(Emitter, Dest, Src1, Src2, 0x9a000000); +} + +inline +int +EmitAdcsRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitAdcSbcRegisterCommon(Emitter, Dest, Src1, Src2, 0x3a000000); +} + +inline +int +EmitAdcsRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitAdcSbcRegisterCommon(Emitter, Dest, Src1, Src2, 0xba000000); +} + +inline +int +EmitSbcRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitAdcSbcRegisterCommon(Emitter, Dest, Src1, Src2, 0x5a000000); +} + +inline +int +EmitSbcRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitAdcSbcRegisterCommon(Emitter, Dest, Src1, Src2, 0xda000000); +} + +inline +int +EmitSbcsRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitAdcSbcRegisterCommon(Emitter, Dest, Src1, Src2, 0x7a000000); +} + +inline +int +EmitSbcsRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitAdcSbcRegisterCommon(Emitter, Dest, Src1, Src2, 0xfa000000); +} + +// +// MADD dest, source1, source2, source3 +// MSUB dest, source1, source2, source3 +// SMADDL dest, source1, source2, source3 +// UMADDL dest, source1, source2, source3 +// SMSUBL dest, source1, source2, source3 +// UMSUBL dest, source1, source2, source3 +// MUL dest, source1, source2 +// SMULL dest, source1, source2 +// UMULL dest, source1, source2 +// + +inline +int +EmitMaddMsubCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Src2.RawRegister() << 16) | (Src3.RawRegister() << 10) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitMadd( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3 + ) +{ + return EmitMaddMsubCommon(Emitter, Dest, Src1, Src2, Src3, 0x1b000000); +} + +inline +int +EmitMadd64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3 + ) +{ + return EmitMaddMsubCommon(Emitter, Dest, Src1, Src2, Src3, 0x9b000000); +} + +inline +int +EmitMsub( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3 + ) +{ + return EmitMaddMsubCommon(Emitter, Dest, Src1, Src2, Src3, 0x1b008000); +} + +inline +int +EmitMsub64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3 + ) +{ + return EmitMaddMsubCommon(Emitter, Dest, Src1, Src2, Src3, 0x9b008000); +} + +inline +int +EmitSmaddl( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3 + ) +{ + return EmitMaddMsubCommon(Emitter, Dest, Src1, Src2, Src3, 0x9b200000); +} + +inline +int +EmitUmaddl( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3 + ) +{ + return EmitMaddMsubCommon(Emitter, Dest, Src1, Src2, Src3, 0x9ba00000); +} + +inline +int +EmitSmsubl( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3 + ) +{ + return EmitMaddMsubCommon(Emitter, Dest, Src1, Src2, Src3, 0x9b208000); +} + +inline +int +EmitUmsubl( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + Arm64SimpleRegisterParam Src3 + ) +{ + return EmitMaddMsubCommon(Emitter, Dest, Src1, Src2, Src3, 0x9ba08000); +} + +inline +int +EmitMul( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitMadd(Emitter, Dest, Src1, Src2, ARMREG_ZR); +} + +inline +int +EmitMul64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitMadd64(Emitter, Dest, Src1, Src2, ARMREG_ZR); +} + +inline +int +EmitSmull( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitSmaddl(Emitter, Dest, Src1, Src2, ARMREG_ZR); +} + +inline +int +EmitUmull( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitUmaddl(Emitter, Dest, Src1, Src2, ARMREG_ZR); +} + +// +// SDIV dest, source1, source2 +// UDIV dest, source1, source2 +// + +inline +int +EmitDivideCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Src2.RawRegister() << 16) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitSdiv( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitDivideCommon(Emitter, Dest, Src1, Src2, 0x1ac00c00); +} + +inline +int +EmitSdiv64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitDivideCommon(Emitter, Dest, Src1, Src2, 0x9ac00c00); +} + +inline +int +EmitUdiv( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitDivideCommon(Emitter, Dest, Src1, Src2, 0x1ac00800); +} + +inline +int +EmitUdiv64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitDivideCommon(Emitter, Dest, Src1, Src2, 0x9ac00800); +} + +// +// AND dest, source1, source2 [with optional shift] +// ANDS dest, source1, source2 [with optional shift] +// BIC dest, source1, source2 [with optional shift] +// BICS dest, source1, source2 [with optional shift] +// EON dest, source1, source2 [with optional shift] +// EOR dest, source1, source2 [with optional shift] +// ORR dest, source1, source2 [with optional shift] +// ORN dest, source1, source2 [with optional shift] +// TST source1, source2 [with optional shift] +// MOV dest, source +// + +inline +int +EmitLogicalRegisterCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | Src2.Encode() | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitAndRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x0a000000); +} + +inline +int +EmitAndRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x8a000000); +} + +inline +int +EmitAndsRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x6a000000); +} + +inline +int +EmitAndsRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0xea000000); +} + +inline +int +EmitBicRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x0a200000); +} + +inline +int +EmitBicRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x8a200000); +} + +inline +int +EmitBicsRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x6a200000); +} + +inline +int +EmitBicsRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0xea200000); +} + +inline +int +EmitEonRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x4a200000); +} + +inline +int +EmitEonRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0xca200000); +} + +inline +int +EmitEorRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x4a000000); +} + +inline +int +EmitEorRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0xca000000); +} + +inline +int +EmitOrnRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x2a200000); +} + +inline +int +EmitOrnRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0xaa200000); +} + +inline +int +EmitOrrRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0x2a000000); +} + +inline +int +EmitOrrRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitLogicalRegisterCommon(Emitter, Dest, Src1, Src2, 0xaa000000); +} + +inline +int +EmitTestRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAndsRegister(Emitter, ARMREG_ZR, Src1, Src2); +} + +inline +int +EmitTestRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64RegisterParam Src2 + ) +{ + return EmitAndsRegister64(Emitter, ARMREG_ZR, Src1, Src2); +} + +inline +int +EmitMovRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src +) +{ + return EmitOrrRegister(Emitter, Dest, ARMREG_ZR, Src); +} + +inline +int +EmitMovRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src +) +{ + return EmitOrrRegister64(Emitter, Dest, ARMREG_ZR, Src); +} + +inline +int +EmitMvnRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src +) +{ + return EmitOrnRegister(Emitter, Dest, ARMREG_ZR, Src); +} + +inline +int +EmitMvnRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src +) +{ + return EmitOrnRegister64(Emitter, Dest, ARMREG_ZR, Src); +} + +// +// ASR dest, source1, source2 +// LSL dest, source1, source2 +// LSR dest, source1, source2 +// ROR dest, source1, source2 +// + +inline +int +EmitShiftRegisterCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + UINT32 Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Src2.RawRegister() << 16) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitAsrRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitShiftRegisterCommon(Emitter, Dest, Src1, Src2, 0x1ac02800); +} + +inline +int +EmitAsrRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitShiftRegisterCommon(Emitter, Dest, Src1, Src2, 0x9ac02800); +} + +inline +int +EmitLslRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitShiftRegisterCommon(Emitter, Dest, Src1, Src2, 0x1ac02000); +} + +inline +int +EmitLslRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitShiftRegisterCommon(Emitter, Dest, Src1, Src2, 0x9ac02000); +} + +inline +int +EmitLsrRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitShiftRegisterCommon(Emitter, Dest, Src1, Src2, 0x1ac02400); +} + +inline +int +EmitLsrRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitShiftRegisterCommon(Emitter, Dest, Src1, Src2, 0x9ac02400); +} + +inline +int +EmitRorRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitShiftRegisterCommon(Emitter, Dest, Src1, Src2, 0x1ac02c00); +} + +inline +int +EmitRorRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2 + ) +{ + return EmitShiftRegisterCommon(Emitter, Dest, Src1, Src2, 0x9ac02c00); +} + +// +// BFM dest, source, immr, imms +// UBFM dest, source, immr, imms +// SBFM dest, source, immr, imms +// SXTB dest, source +// UXTB dest, source +// SXTH dest, source +// UXTH dest, source +// BFI dest, source, lsb, count +// BFXIL dest, source, lsb, count +// UBFX dest, source, lsb, count +// SBFX dest, source, lsb, count +// + +inline +int +EmitBitfieldCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immr, + ULONG64 Imms, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (ULONG(Immr) << 16) | (ULONG(Imms) << 10) | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitBfm( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immr, + ULONG64 Imms + ) +{ + return EmitBitfieldCommon(Emitter, Dest, Src, Immr, Imms, 0x33000000); +} + +inline +int +EmitBfm64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immr, + ULONG64 Imms + ) +{ + return EmitBitfieldCommon(Emitter, Dest, Src, Immr, Imms, 0xb3400000); +} + +inline +int +EmitSbfm( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immr, + ULONG64 Imms + ) +{ + return EmitBitfieldCommon(Emitter, Dest, Src, Immr, Imms, 0x13000000); +} + +inline +int +EmitSbfm64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immr, + ULONG64 Imms + ) +{ + return EmitBitfieldCommon(Emitter, Dest, Src, Immr, Imms, 0x93400000); +} + +inline +int +EmitUbfm( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immr, + ULONG64 Imms + ) +{ + return EmitBitfieldCommon(Emitter, Dest, Src, Immr, Imms, 0x53000000); +} + +inline +int +EmitUbfm64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immr, + ULONG64 Imms + ) +{ + return EmitBitfieldCommon(Emitter, Dest, Src, Immr, Imms, 0xd3400000); +} + +// +// SXTB dest, source +// SXTH dest, source +// UXTB dest, source +// UXTH dest, source +// + +inline +int +EmitSxtb( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitSbfm(Emitter, Dest, Src, 0, 7); +} + +inline +int +EmitSxtb64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitSbfm64(Emitter, Dest, Src, 0, 7); +} + +inline +int +EmitSxth( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitSbfm(Emitter, Dest, Src, 0, 15); +} + +inline +int +EmitSxth64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitSbfm64(Emitter, Dest, Src, 0, 15); +} + +inline +int +EmitUxtb( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitUbfm(Emitter, Dest, Src, 0, 7); +} + +inline +int +EmitUxtb64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitUbfm64(Emitter, Dest, Src, 0, 7); +} + +inline +int +EmitUxth( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitUbfm(Emitter, Dest, Src, 0, 15); +} + +inline +int +EmitUxth64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitUbfm64(Emitter, Dest, Src, 0, 15); +} + +inline +int +EmitBfi( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Lsb, + ULONG Width + ) +{ + NT_ASSERT(Lsb <= 31); + NT_ASSERT(Width >= 1 && Width <= 32); + NT_ASSERT(Lsb + Width <= 32); + + return EmitBfm(Emitter, Dest, Src, (32 - Lsb) % 32, Width - 1); +} + +inline +int +EmitBfi64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Lsb, + ULONG Width + ) +{ + NT_ASSERT(Lsb <= 63); + NT_ASSERT(Width >= 1 && Width <= 64); + NT_ASSERT(Lsb + Width <= 64); + + return EmitBfm64(Emitter, Dest, Src, (64 - Lsb) % 64, Width - 1); +} + +inline +int +EmitBfxil( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Lsb, + ULONG Width + ) +{ + NT_ASSERT(Lsb <= 31); + NT_ASSERT(Width >= 1 && Width <= 32); + NT_ASSERT(Lsb + Width <= 32); + + return EmitBfm(Emitter, Dest, Src, Lsb, Lsb + Width - 1); +} + +inline +int +EmitBfxil64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Lsb, + ULONG Width + ) +{ + NT_ASSERT(Lsb <= 63); + NT_ASSERT(Width >= 1 && Width <= 64); + NT_ASSERT(Lsb + Width <= 64); + + return EmitBfm64(Emitter, Dest, Src, Lsb, Lsb + Width - 1); +} + +inline +int +EmitSbfx( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Lsb, + ULONG Width + ) +{ + NT_ASSERT(Lsb <= 31); + NT_ASSERT(Width >= 1 && Width <= 32); + NT_ASSERT(Lsb + Width <= 32); + + return EmitSbfm(Emitter, Dest, Src, Lsb, Lsb + Width - 1); +} + +inline +int +EmitSbfx64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Lsb, + ULONG Width + ) +{ + NT_ASSERT(Lsb <= 63); + NT_ASSERT(Width >= 1 && Width <= 64); + NT_ASSERT(Lsb + Width <= 64); + + return EmitSbfm64(Emitter, Dest, Src, Lsb, Lsb + Width - 1); +} + +inline +int +EmitUbfx( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Lsb, + ULONG Width + ) +{ + NT_ASSERT(Lsb <= 31); + NT_ASSERT(Width >= 1 && Width <= 32); + NT_ASSERT(Lsb + Width <= 32); + + return EmitUbfm(Emitter, Dest, Src, Lsb, Lsb + Width - 1); +} + +inline +int +EmitUbfx64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Lsb, + ULONG Width + ) +{ + NT_ASSERT(Lsb <= 63); + NT_ASSERT(Width >= 1 && Width <= 64); + NT_ASSERT(Lsb + Width <= 64); + + return EmitUbfm64(Emitter, Dest, Src, Lsb, Lsb + Width - 1); +} + +// +// ASR dest, source, immediate +// LSL dest, source, immediate +// LSR dest, source, immediate +// + +inline +int +EmitAsrImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + NT_ASSERT(Immediate < 32); + return EmitSbfm(Emitter, Dest, Src, Immediate, 31); +} + +inline +int +EmitAsrImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + NT_ASSERT(Immediate < 64); + return EmitSbfm64(Emitter, Dest, Src, Immediate, 63); +} + +inline +int +EmitLslImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + NT_ASSERT(Immediate < 32); + return EmitUbfm(Emitter, Dest, Src, 32 - Immediate, 31 - Immediate); +} + +inline +int +EmitLslImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + NT_ASSERT(Immediate < 64); + return EmitUbfm64(Emitter, Dest, Src, 64 - Immediate, 63 - Immediate); +} + +inline +int +EmitLsrImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + NT_ASSERT(Immediate < 32); + return EmitUbfm(Emitter, Dest, Src, Immediate, 31); +} + +inline +int +EmitLsrImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + NT_ASSERT(Immediate < 64); + return EmitUbfm64(Emitter, Dest, Src, Immediate, 63); +} + +// +// EXTR dest, source1, source2, shift +// ROR dest, source, immediate +// + +inline +int +EmitExtr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Shift + ) +{ + return Emitter.EmitFourBytes(0x13800000 | (Src2.RawRegister() << 16) | ((Shift & 0x3f) << 10) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitExtr64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Shift + ) +{ + return Emitter.EmitFourBytes(0x93c00000 | (Src2.RawRegister() << 16) | ((Shift & 0x3f) << 10) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitRorImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + //NT_ASSERT(Immediate >= 0 && Immediate < 32); + return EmitExtr(Emitter, Dest, Src, Src, Immediate); +} + +inline +int +EmitRorImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + //NT_ASSERT(Immediate >= 0 && Immediate < 64); + return EmitExtr64(Emitter, Dest, Src, Src, Immediate); +} + +// +// CSEL dest, src1, src2, cond +// CSINC dest, src1, src2, cond +// CSINV dest, src1, src2, cond +// CSNEG dest, src1, src2, cond +// CINC dest, src1, cond +// CSET dest, cond +// CSETM dest, cond +// CNEG dest, src1, cond +// + +inline +int +EmitConditionalCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Src2.RawRegister() << 16) | (Condition << 12) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitCsel( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition + ) +{ + return EmitConditionalCommon(Emitter, Dest, Src1, Src2, Condition, 0x1a800000); +} + +inline +int +EmitCsel64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition + ) +{ + return EmitConditionalCommon(Emitter, Dest, Src1, Src2, Condition, 0x9a800000); +} + +inline +int +EmitCsinc( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition + ) +{ + return EmitConditionalCommon(Emitter, Dest, Src1, Src2, Condition, 0x1a800400); +} + +inline +int +EmitCsinc64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition + ) +{ + return EmitConditionalCommon(Emitter, Dest, Src1, Src2, Condition, 0x9a800400); +} + +inline +int +EmitCsinv( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition + ) +{ + return EmitConditionalCommon(Emitter, Dest, Src1, Src2, Condition, 0x5a800000); +} + +inline +int +EmitCsinv64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition + ) +{ + return EmitConditionalCommon(Emitter, Dest, Src1, Src2, Condition, 0xda800000); +} + +inline +int +EmitCsneg( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition + ) +{ + return EmitConditionalCommon(Emitter, Dest, Src1, Src2, Condition, 0x5a800400); +} + +inline +int +EmitCsneg64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Condition + ) +{ + return EmitConditionalCommon(Emitter, Dest, Src1, Src2, Condition, 0xda800400); +} + +inline +int +EmitCinc( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Condition + ) +{ + return EmitCsinc(Emitter, Dest, Src, Src, Condition ^ 1); +} + +inline +int +EmitCinc64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Condition + ) +{ + return EmitCsinc64(Emitter, Dest, Src, Src, Condition ^ 1); +} + +inline +int +EmitCset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Condition + ) +{ + return EmitCsinc(Emitter, Dest, ARMREG_ZR, ARMREG_ZR, Condition ^ 1); +} + +inline +int +EmitCset64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Condition + ) +{ + return EmitCsinc64(Emitter, Dest, ARMREG_ZR, ARMREG_ZR, Condition ^ 1); +} + +inline +int +EmitCinv( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Condition + ) +{ + return EmitCsinv(Emitter, Dest, Src, Src, Condition ^ 1); +} + +inline +int +EmitCinv64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Condition + ) +{ + return EmitCsinv64(Emitter, Dest, Src, Src, Condition ^ 1); +} + +inline +int +EmitCsetm( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Condition + ) +{ + return EmitCsinv(Emitter, Dest, ARMREG_ZR, ARMREG_ZR, Condition ^ 1); +} + +inline +int +EmitCsetm64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Condition + ) +{ + return EmitCsinv64(Emitter, Dest, ARMREG_ZR, ARMREG_ZR, Condition ^ 1); +} + +inline +int +EmitCneg( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Condition + ) +{ + return EmitCsneg(Emitter, Dest, Src, Src, Condition ^ 1); +} + +inline +int +EmitCneg64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Condition + ) +{ + return EmitCsneg64(Emitter, Dest, Src, Src, Condition ^ 1); +} + +// +// CCMN src1, src2, nzcv, cond +// CCMP src1, src2, nzcv, cond +// + +inline +int +EmitConditionalCompareRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Nzcv, + ULONG Condition, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Src2.RawRegister() << 16) | (Condition << 12) | (Src1.RawRegister() << 5) | Nzcv); +} + +inline +int +EmitCcmnRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Nzcv, + ULONG Condition + ) +{ + return EmitConditionalCompareRegister(Emitter, Src1, Src2, Nzcv, Condition, 0x3A400000); +} + +inline +int +EmitCcmnRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Nzcv, + ULONG Condition + ) +{ + return EmitConditionalCompareRegister(Emitter, Src1, Src2, Nzcv, Condition, 0xBA400000); +} + +inline +int +EmitCcmpRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Nzcv, + ULONG Condition + ) +{ + return EmitConditionalCompareRegister(Emitter, Src1, Src2, Nzcv, Condition, 0x7A400000); +} + +inline +int +EmitCcmpRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src1, + Arm64SimpleRegisterParam Src2, + ULONG Nzcv, + ULONG Condition + ) +{ + return EmitConditionalCompareRegister(Emitter, Src1, Src2, Nzcv, Condition, 0xFA400000); +} + +// +// Load an immediate value in the most efficient way possible. +// + +inline +int +EmitMovImmediateCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate, + ULONG Shift, + ULONG Opcode + ) +{ + NT_ASSERT(Shift % 16 == 0); + NT_ASSERT(Shift / 16 < 4); + return Emitter.EmitFourBytes(Opcode | ((Shift / 16) << 21) | ((Immediate & 0xffff) << 5) | Dest.RawRegister()); +} + +inline +int +EmitMovk( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate, + ULONG Shift + ) +{ + return EmitMovImmediateCommon(Emitter, Dest, Immediate, Shift, 0x72800000); +} + +inline +int +EmitMovk64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate, + ULONG Shift + ) +{ + return EmitMovImmediateCommon(Emitter, Dest, Immediate, Shift, 0xf2800000); +} + +inline +int +EmitMovn( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate, + ULONG Shift + ) +{ + return EmitMovImmediateCommon(Emitter, Dest, Immediate, Shift, 0x12800000); +} + +inline +int +EmitMovn64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate, + ULONG Shift + ) +{ + return EmitMovImmediateCommon(Emitter, Dest, Immediate, Shift, 0x92800000); +} + +inline +int +EmitMovz( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate, + ULONG Shift + ) +{ + return EmitMovImmediateCommon(Emitter, Dest, Immediate, Shift, 0x52800000); +} + +inline +int +EmitMovz64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate, + ULONG Shift + ) +{ + return EmitMovImmediateCommon(Emitter, Dest, Immediate, Shift, 0xd2800000); +} + +inline +int +EmitLoadImmediate32( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate + ) +{ + + ULONG Word0 = Immediate & 0xffff; + ULONG Word1 = (Immediate >> 16) & 0xffff; + + if (Word0 != 0 && Word1 != 0) { + + // + // Try to encode as a bitfield. If possible, use ORR immediate. + // + + ULONG BitfieldResult = FindArm64LogicalImmediateEncoding(Immediate, 4); + if (BitfieldResult != ARM64_LOGICAL_IMMEDIATE_NO_ENCODING) { + return Emitter.EmitFourBytes(0x32000000 | (BitfieldResult << 10) | (31 << 5) | Dest.RawRegister()); + } + + // + // Use MOVN (+MOVK) if one of the two halves is 0xffff + // + + if (Word1 == 0xffff) { + return Emitter.EmitFourBytes(0x12800000 | (0 << 21) | ((Word0 ^ 0xffff) << 5) | Dest.RawRegister()); + } else if (Word0 == 0xffff) { + return Emitter.EmitFourBytes(0x12800000 | (1 << 21) | ((Word1 ^ 0xffff) << 5) | Dest.RawRegister()); + } + } + + // + // Otherwise use MOVZ (+MOVK). + // + + ULONG Opcode = 0x52800000; + int Result = 0; + if (Word0 != 0 || Word1 == 0) { + Result += Emitter.EmitFourBytes(Opcode | (0 << 21) | (Word0 << 5) | Dest.RawRegister()); + Opcode = 0x72800000; + } + if (Word1 != 0) { + Result += Emitter.EmitFourBytes(Opcode | (1 << 21) | (Word1 << 5) | Dest.RawRegister()); + } + return Result; +} + +inline +int +EmitLoadImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG64 Immediate + ) +{ + + // + // Use a 32-bit form if the upper 32 bits are 0. + // + + if ((Immediate >> 32) == 0) { + return EmitLoadImmediate32(Emitter, Dest, ULONG(Immediate)); + } + + // + // Try to encode as a bitfield. If possible, use ORR immediate. + // + + ULONG BitfieldResult = FindArm64LogicalImmediateEncoding(Immediate, 8); + if (BitfieldResult != ARM64_LOGICAL_IMMEDIATE_NO_ENCODING) { + return Emitter.EmitFourBytes(0xb2000000 | (BitfieldResult << 10) | (31 << 5) | Dest.RawRegister()); + } + + // + // Break into words and count the number of 0's and ffff's + // + + ULONG Word0 = Immediate & 0xffff; + ULONG Word1 = (Immediate >> 16) & 0xffff; + ULONG Word2 = (Immediate >> 32) & 0xffff; + ULONG Word3 = (Immediate >> 48) & 0xffff; + int NumZero = (Word0 == 0) + (Word1 == 0) + (Word2 == 0) + (Word3 == 0); + int NumOnes = (Word0 == 0xffff) + (Word1 == 0xffff) + (Word2 == 0xffff) + (Word3 == 0xffff); + + // + // Use MOVZ/MOVN (+MOVK) + // + + ULONG WordMask = (NumOnes > NumZero) ? 0xffff : 0x0000; + ULONG WordXor = WordMask; + ULONG Opcode = (WordMask == 0xffff) ? 0x92800000 : 0xd2800000; + int Result = 0; + if (Word0 != WordMask) { + Result += Emitter.EmitFourBytes(Opcode | (0 << 21) | ((Word0 ^ WordXor) << 5) | Dest.RawRegister()); + Opcode = 0xf2800000; + WordXor = 0; + } + if (Word1 != WordMask) { + Result += Emitter.EmitFourBytes(Opcode | (1 << 21) | ((Word1 ^ WordXor) << 5) | Dest.RawRegister()); + Opcode = 0xf2800000; + WordXor = 0; + } + if (Word2 != WordMask) { + Result += Emitter.EmitFourBytes(Opcode | (2 << 21) | ((Word2 ^ WordXor) << 5) | Dest.RawRegister()); + Opcode = 0xf2800000; + WordXor = 0; + } + if (Word3 != WordMask) { + Result += Emitter.EmitFourBytes(Opcode | (3 << 21) | ((Word3 ^ WordXor) << 5) | Dest.RawRegister()); + } + return Result; +} + +inline +int +EmitLoadImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + ULONG Immediate + ) + +{ + return EmitLoadImmediate32(Emitter, Dest, Immediate); +} + +// +// ADR dest, offset +// ADRP dest, pageoffs +// + +inline +int +EmitAdrAdrp( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + LONG Offset, + ULONG Opcode +) +{ + + Assert(Offset >= -(1 << 21) && Offset < (1 << 21)); + return Emitter.EmitFourBytes(Opcode | ((Offset & 3) << 29) | (((Offset >> 2) & 0x7ffff) << 5) | Dest.RawRegister()); +} + +inline +int +EmitAdr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + LONG Offset +) +{ + return EmitAdrAdrp(Emitter, Dest, Offset, 0x10000000); +} + +inline +int +EmitAdrp( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + LONG PageOffset +) +{ + return EmitAdrAdrp(Emitter, Dest, PageOffset, 0x90000000); +} + +// +// ADD dest, source, immediate +// ADDS dest, source, immediate +// SUB dest, source, immediate +// SUBS dest, source, immediate +// CMP dest, immediate +// + +inline +int +EmitAddSubImmediateCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + LONG Immediate, + bool SetFlags, + bool IsAdd, + ULONG OpcodeHighBit + ) +{ + // + // If the immediate is zero, use the requested ADD/SUB to compute the carry bit. + // + + if (Immediate == 0) { + + if (IsAdd) { + return Emitter.EmitFourBytes(OpcodeHighBit | (SetFlags << 29) | 0x11000000 | (0 << 22) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } else { + return Emitter.EmitFourBytes(OpcodeHighBit | (SetFlags << 29) | 0x51000000 | (0 << 22) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } + } + + // + // If fits within 12 bits, use ADD/SUB directly. + // + + if ((Immediate & 0xfff) == Immediate) { + return Emitter.EmitFourBytes(OpcodeHighBit | (SetFlags << 29) | 0x11000000 | (0 << 22) | ((Immediate & 0xfff) << 10) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } else if ((-Immediate & 0xfff) == -Immediate) { + return Emitter.EmitFourBytes(OpcodeHighBit | (SetFlags << 29) | 0x51000000 | (0 << 22) | ((-Immediate & 0xfff) << 10) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } + + // + // If fits within upper 12 bits, use ADD/SUB directly. + // + + if ((Immediate & 0xfff000) == Immediate) { + return Emitter.EmitFourBytes(OpcodeHighBit | (SetFlags << 29) | 0x11000000 | (1 << 22) | (((Immediate >> 12) & 0xfff) << 10) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } else if ((-Immediate & 0xfff000) == -Immediate) { + return Emitter.EmitFourBytes(OpcodeHighBit | (SetFlags << 29) | 0x51000000 | (1 << 22) | (((-Immediate >> 12) & 0xfff) << 10) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } + + // + // If fits within upper 24 bits, and flags not needed, do a pair. + // + + if (!SetFlags) { + + if ((Immediate & 0xffffff) == Immediate) { + int Result = Emitter.EmitFourBytes(OpcodeHighBit | 0x11000000 | (1 << 22) | (((Immediate >> 12) & 0xfff) << 10) | (Src.RawRegister() << 5) | Dest.RawRegister()); + return Result + Emitter.EmitFourBytes(OpcodeHighBit | 0x11000000 | (0 << 22) | ((Immediate & 0xfff) << 10) | (Dest.RawRegister() << 5) | Dest.RawRegister()); + } else if ((-Immediate & 0xffffff) == -Immediate) { + int Result = Emitter.EmitFourBytes(OpcodeHighBit | 0x51000000 | (1 << 22) | (((-Immediate >> 12) & 0xfff) << 10) | (Src.RawRegister() << 5) | Dest.RawRegister()); + return Result + Emitter.EmitFourBytes(OpcodeHighBit | 0x51000000 | (0 << 22) | ((-Immediate & 0xfff) << 10) | (Dest.RawRegister() << 5) | Dest.RawRegister()); + } + } + + // + // Otherwise fail. + // + AssertMsg(false, "EmitAddSubImmediateCommon failed to emit"); + return 0; +} + +inline +int +EmitAddImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitAddSubImmediateCommon(Emitter, Dest, Src, Immediate, false, true, 0); +} + +inline +int +EmitAddImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + if (LONG(Immediate) == Immediate) { + return EmitAddSubImmediateCommon(Emitter, Dest, Src, LONG(Immediate), false, true, 0x80000000); + } + + AssertMsg(false, "EmitAddImmediate64 failed to emit"); + return 0; +} + +inline +int +EmitAddsImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitAddSubImmediateCommon(Emitter, Dest, Src, Immediate, true, true, 0); +} + +inline +int +EmitAddsImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + if (LONG(Immediate) == Immediate) { + return EmitAddSubImmediateCommon(Emitter, Dest, Src, LONG(Immediate), true, true, 0x80000000); + } + + AssertMsg(false, "EmitAddsImmediate64 failed to emit"); + return 0; +} + +inline +int +EmitSubImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitAddSubImmediateCommon(Emitter, Dest, Src, -LONG(Immediate), false, false, 0); +} + +inline +int +EmitSubImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + if (-LONG(Immediate) == -LONG64(Immediate)) { + return EmitAddSubImmediateCommon(Emitter, Dest, Src, -LONG(Immediate), false, false, 0x80000000); + } + + AssertMsg(false, "EmitSubImmediate64 failed to emit"); + return 0; +} + +inline +int +EmitSubsImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitAddSubImmediateCommon(Emitter, Dest, Src, -LONG(Immediate), true, false, 0); +} + +inline +int +EmitSubsImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + if (-LONG(Immediate) == -LONG64(Immediate)) { + return EmitAddSubImmediateCommon(Emitter, Dest, Src, -LONG(Immediate), true, false, 0x80000000); + } + + AssertMsg(false, "EmitSubsImmediate64 failed to emit"); + return 0; +} + +inline +int +EmitCmpImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitSubsImmediate(Emitter, ARMREG_ZR, Src, Immediate); +} + +inline +int +EmitCmpImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + return EmitSubsImmediate64(Emitter, ARMREG_ZR, Src, Immediate); +} + + +// +// ADC/SBC immediate don't really exist. Returning 0 here forces them +// to go down the load-immediate-into-register path. +// + +inline +int EmitAdcImmediate(...) { return 0; } +inline +int EmitAdcImmediate64(...) { return 0; } +inline +int EmitAdcsImmediate(...) { return 0; } +inline +int EmitAdcsImmediate64(...) { return 0; } +inline +int EmitSbcImmediate(...) { return 0; } +inline +int EmitSbcImmediate64(...) { return 0; } +inline +int EmitSbcsImmediate(...) { return 0; } +inline +int EmitSbcsImmediate64(...) { return 0; } + +// +// AND dest, source, immediate +// ANDS dest, source, immediate +// ORR dest, source, immediate +// EOR dest, source, immediate +// TST source, immediate +// + +inline +int +EmitLogicalImmediateCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate, + ULONG Opcode, + ULONG NotRegisterOpcode, + ULONG Size + ) +{ + ULONG BitfieldResult = FindArm64LogicalImmediateEncoding(Immediate, Size); + if (BitfieldResult == ARM64_LOGICAL_IMMEDIATE_NO_ENCODING) { + + // + // Special case: -1 can't be encoded, but the NOT form of the opcode + // can use ZR to produce the same result. + // + + if (NotRegisterOpcode != 0 && + ((Size == 4 && ULONG(Immediate) == ULONG(-1)) || + (Size == 8 && ULONG64(Immediate) == ULONG64(-1)))) { + + return Emitter.EmitFourBytes(NotRegisterOpcode | (31 << 16) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } + + AssertMsg(false, "EmitLogicalImmediateCommon failed to emit"); + return 0; + } + + return Emitter.EmitFourBytes(Opcode | (BitfieldResult << 10) | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitAndImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitLogicalImmediateCommon(Emitter, Dest, Src, Immediate, 0x12000000, 0x0a200000, 4); +} + +inline +int +EmitAndImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + return EmitLogicalImmediateCommon(Emitter, Dest, Src, Immediate, 0x92000000, 0x8a200000, 8); +} + +inline +int +EmitAndsImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitLogicalImmediateCommon(Emitter, Dest, Src, Immediate, 0x72000000, 0x6a200000, 4); +} + +inline +int +EmitAndsImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + return EmitLogicalImmediateCommon(Emitter, Dest, Src, Immediate, 0xf2000000, 0xea200000, 8); +} + +inline +int +EmitOrrImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitLogicalImmediateCommon(Emitter, Dest, Src, Immediate, 0x32000000, 0x2a200000, 4); +} + +inline +int +EmitOrrImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + return EmitLogicalImmediateCommon(Emitter, Dest, Src, Immediate, 0xb2000000, 0xaa200000, 8); +} + +inline +int +EmitEorImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitLogicalImmediateCommon(Emitter, Dest, Src, Immediate, 0x52000000, 0x4a200000, 4); +} + +inline +int +EmitEorImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + return EmitLogicalImmediateCommon(Emitter, Dest, Src, Immediate, 0xd2000000, 0xca200000, 8); +} + +inline +int +EmitTestImmediate( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src, + ULONG Immediate + ) +{ + return EmitAndsImmediate(Emitter, ARMREG_ZR, Src, Immediate); +} + +inline +int +EmitTestImmediate64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Src, + ULONG64 Immediate + ) +{ + return EmitAndsImmediate64(Emitter, ARMREG_ZR, Src, Immediate); +} + +// +// CLZ dest, source +// RBIT dest, source +// REV dest, source +// REV16 dest, source +// + +inline +int +EmitReverseCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitClz( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitReverseCommon(Emitter, Dest, Src, 0x5ac01000); +} + +inline +int +EmitClz64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitReverseCommon(Emitter, Dest, Src, 0xdac01000); +} + +inline +int +EmitRbit( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitReverseCommon(Emitter, Dest, Src, 0x5ac00000); +} + +inline +int +EmitRbit64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitReverseCommon(Emitter, Dest, Src, 0xdac00000); +} + +inline +int +EmitRev( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitReverseCommon(Emitter, Dest, Src, 0x5ac00800); +} + +inline +int +EmitRev64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) + +{ + return EmitReverseCommon(Emitter, Dest, Src, 0xdac00c00); +} + +inline +int +EmitRev16( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitReverseCommon(Emitter, Dest, Src, 0x5ac00400); +} + +inline +int +EmitRev1664( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitReverseCommon(Emitter, Dest, Src, 0xdac00400); +} + +inline +int +EmitRev3264( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Src + ) +{ + return EmitReverseCommon(Emitter, Dest, Src, 0xdac00800); +} + +// +// LDRB dest, [addr, reg[, lsl #shift]] +// LDRSB dest, [addr, reg[, lsl #shift]] +// LDRH dest, [addr, reg[, lsl #shift]] +// LDRSH dest, [addr, reg[, lsl #shift]] +// LDR dest, [addr, reg[, lsl #shift]] +// STRB src, [addr, reg[, lsl #shift]] +// STRH src, [addr, reg[, lsl #shift]] +// STR src, [addr, reg[, lsl #shift]] +// + +inline +int +EmitLdrStrRegisterCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam SrcDest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index, + int AccessShift, + UINT32 Opcode + ) +{ + + NT_ASSERT(Index.IsExtended() || Index.ShiftType() == SHIFT_LSL || Index.ShiftType() == SHIFT_NONE); + + // + // Choose an extend type, mapping NONE/LSL to UXTX. + // + + int ExtendType = Index.ShiftType() & 7; + if (!Index.IsExtended()) { + ExtendType = EXTEND_UXTX & 7; + } + + // + // Determine shift amount or return 0 if it can't be encoded. + // + + ULONG Amount = 0; + if (Index.ShiftType() != SHIFT_NONE && Index.ShiftCount() == AccessShift) { + Amount = 1; + } else if (Index.ShiftCount() != 0) { + AssertMsg(false, "EmitLdrStrRegisterCommon failed to emit"); + return 0; + } + + return Emitter.EmitFourBytes(Opcode | (Index.RawRegister() << 16) | (ExtendType << 13) | (Amount << 12) | (Addr.RawRegister() << 5) | SrcDest.RawRegister()); +} + +inline +int +EmitLdrbRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_1, 0x38600800); +} + +inline +int +EmitLdrsbRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_1, 0x38e00800); +} + +inline +int +EmitLdrsbRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_1, 0x38a00800); +} + +inline +int +EmitLdrhRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_2, 0x78600800); +} + +inline +int +EmitLdrshRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_2, 0x78e00800); +} + +inline +int +EmitLdrshRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_2, 0x78a00800); +} + +inline +int +EmitLdrRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_4, 0xb8600800); +} + +inline +int +EmitLdrswRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_4, 0xb8a00800); +} + +inline +int +EmitLdrRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Dest, Addr, Index, INDEX_SCALE_8, 0xf8600800); +} + +inline +int +EmitStrbRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Source, Addr, Index, INDEX_SCALE_1, 0x38200800); +} + +inline +int +EmitStrhRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Source, Addr, Index, INDEX_SCALE_2, 0x78200800); +} + +inline +int +EmitStrRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Source, Addr, Index, INDEX_SCALE_4, 0xb8200800); +} + +inline +int +EmitStrRegister64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, Source, Addr, Index, INDEX_SCALE_8, 0xf8200800); +} + +inline +int +EmitPrfmRegister( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Addr, + Arm64RegisterParam Index + ) +{ + return EmitLdrStrRegisterCommon(Emitter, ARMREG_R0 /* PLDL1KEEP */, Addr, Index, INDEX_SCALE_4, 0xf8a00800); +} + +// +// LDRB dest, [addr, #offset] +// LDRSB dest, [addr, #offset] +// LDRH dest, [addr, #offset] +// LDRSH dest, [addr, #offset] +// LDR dest, [addr, #offset] +// STRB src, [addr, #offset] +// STRH src, [addr, #offset] +// STR src, [addr, #offset] +// + +inline +int +EmitLdrStrOffsetCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam SrcDest, + Arm64SimpleRegisterParam Addr, + LONG Offset, + ULONG AccessShift, + ULONG Opcode, + ULONG OpcodeUnscaled + ) +{ + if (Opcode != 0) { + LONG EncodeOffset = Offset >> AccessShift; + if ((EncodeOffset << AccessShift) == Offset && (EncodeOffset & 0xfff) == EncodeOffset) { + return Emitter.EmitFourBytes(Opcode | ((EncodeOffset & 0xfff) << 10) | (Addr.RawRegister() << 5) | SrcDest.RawRegister()); + } + } + + if (OpcodeUnscaled != 0 && Offset >= -0x100 && Offset <= 0xff) { + return Emitter.EmitFourBytes(OpcodeUnscaled | ((Offset & 0x1ff) << 12) | (Addr.RawRegister() << 5) | SrcDest.RawRegister()); + } + + AssertMsg(false, "EmitLdrStrOffsetCommon failed to emit"); + return 0; +} + +inline +int +EmitLdrbOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 0, 0x39400000, 0x38400000); +} + +inline +int +EmitLdrsbOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 0, 0x39c00000, 0x38c00000); +} + +inline +int +EmitLdrsbOffset64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 0, 0x39800000, 0x38800000); +} + +inline +int +EmitLdrhOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 1, 0x79400000, 0x78400000); +} + +inline +int +EmitLdrhOffsetPostIndex( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + if (Offset == 0) { + return EmitLdrhOffset(Emitter, Dest, Addr, 0); + } else { + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 1, 0, 0x78400400); + } +} + +inline +int +EmitLdrshOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 1, 0x79c00000, 0x78c00000); +} + +inline +int +EmitLdrshOffset64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 1, 0x79800000, 0x78800000); +} + +inline +int +EmitLdrOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 2, 0xb9400000, 0xb8400000); +} + +inline +int +EmitLdrOffsetPostIndex( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + if (Offset == 0) { + return EmitLdrOffset(Emitter, Dest, Addr, 0); + } else { + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 2, 0, 0xb8400400); + } +} + +inline +int +EmitLdrswOffset64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 2, 0xb9800000, 0xb8800000); +} + +inline +int +EmitLdrOffset64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 3, 0xf9400000, 0xf8400000); +} + +inline +int +EmitLdrOffsetPostIndex64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + if (Offset == 0) { + return EmitLdrOffset(Emitter, Dest, Addr, 0); + } else { + return EmitLdrStrOffsetCommon(Emitter, Dest, Addr, Offset, 3, 0, 0xf8400400); + } +} + +inline +int +EmitStrbOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Source, Addr, Offset, 0, 0x39000000, 0x38000000); +} + +inline +int +EmitStrhOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Source, Addr, Offset, 1, 0x79000000, 0x78000000); +} + +inline +int +EmitStrhOffsetPreIndex( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + if (Offset == 0) { + return EmitStrhOffset(Emitter, Source, Addr, Offset); + } else { + return EmitLdrStrOffsetCommon(Emitter, Source, Addr, Offset, 1, 0, 0x78000c00); + } +} + +inline +int +EmitStrOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Source, Addr, Offset, 2, 0xb9000000, 0xb8000000); +} + +inline +int +EmitStrOffsetPreIndex( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + if (Offset == 0) { + return EmitStrOffset(Emitter, Source, Addr, 0); + } else { + return EmitLdrStrOffsetCommon(Emitter, Source, Addr, Offset, 2, 0, 0xb8000c00); + } +} + +inline +int +EmitStrOffset64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, Source, Addr, Offset, 3, 0xf9000000, 0xf8000000); +} + +inline +int +EmitPrfmOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdrStrOffsetCommon(Emitter, ARMREG_R0 /* PLDL1KEEP */, Addr, Offset, 2, 0xf9800000, 0xf8800000); +} + +// +// LDP wDest1, wDest2, [xAddr, Offset] +// STP wDest1, wDest2, [xAddr, Offset] +// + +inline +int +EmitLdpStpOffsetCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam SrcDest1, + Arm64SimpleRegisterParam SrcDest2, + Arm64SimpleRegisterParam Addr, + LONG Offset, + LONG AccessShift, + ULONG Opcode + ) +{ + LONG EncodeOffset = Offset >> AccessShift; + if ((EncodeOffset << AccessShift) == Offset && EncodeOffset >= -0x40 && EncodeOffset <= 0x3f) { + return Emitter.EmitFourBytes(Opcode | ((EncodeOffset & 0x7f) << 15) | (SrcDest2.RawRegister() << 10) | (Addr.RawRegister() << 5) | SrcDest1.RawRegister()); + } + + AssertMsg(false, "EmitLdpStpOffsetCommon failed to emit"); + return 0; +} + +inline +int +EmitLdpOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest1, + Arm64SimpleRegisterParam Dest2, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + NT_ASSERT(Dest1.RawRegister() != Dest2.RawRegister()); + return EmitLdpStpOffsetCommon(Emitter, Dest1, Dest2, Addr, Offset, 2, 0x29400000); +} + +inline +int +EmitLdpOffset64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest1, + Arm64SimpleRegisterParam Dest2, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + NT_ASSERT(Dest1.RawRegister() != Dest2.RawRegister()); + return EmitLdpStpOffsetCommon(Emitter, Dest1, Dest2, Addr, Offset, 3, 0xa9400000); +} + +inline +int +EmitLdpOffsetPostIndex( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest1, + Arm64SimpleRegisterParam Dest2, + Arm64SimpleRegisterParam Addr, + LONG Offset +) +{ + if (Offset == 0) { + return EmitLdpOffset(Emitter, Dest1, Dest2, Addr, 0); + } else { + return EmitLdpStpOffsetCommon(Emitter, Dest1, Dest2, Addr, Offset, 2, 0x28c00000); + } +} + +inline +int +EmitLdpOffsetPostIndex64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest1, + Arm64SimpleRegisterParam Dest2, + Arm64SimpleRegisterParam Addr, + LONG Offset +) +{ + if (Offset == 0) { + return EmitLdpOffset64(Emitter, Dest1, Dest2, Addr, 0); + } else { + return EmitLdpStpOffsetCommon(Emitter, Dest1, Dest2, Addr, Offset, 3, 0xa8c00000); + } +} + +inline +int +EmitStpOffset( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source1, + Arm64SimpleRegisterParam Source2, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdpStpOffsetCommon(Emitter, Source1, Source2, Addr, Offset, 2, 0x29000000); +} + +inline +int +EmitStpOffset64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source1, + Arm64SimpleRegisterParam Source2, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitLdpStpOffsetCommon(Emitter, Source1, Source2, Addr, Offset, 3, 0xa9000000); +} + +inline +int +EmitStpOffsetPreIndex( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source1, + Arm64SimpleRegisterParam Source2, + Arm64SimpleRegisterParam Addr, + LONG Offset +) +{ + if (Offset == 0) { + return EmitStpOffset(Emitter, Source1, Source2, Addr, 0); + } else { + return EmitLdpStpOffsetCommon(Emitter, Source1, Source2, Addr, Offset, 2, 0x29800000); + } +} + +inline +int +EmitStpOffsetPreIndex64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source1, + Arm64SimpleRegisterParam Source2, + Arm64SimpleRegisterParam Addr, + LONG Offset +) +{ + if (Offset == 0) { + return EmitStpOffset64(Emitter, Source1, Source2, Addr, 0); + } else { + return EmitLdpStpOffsetCommon(Emitter, Source1, Source2, Addr, Offset, 3, 0xa9800000); + } +} + +// +// LDARB dest, [addr] +// LDARH dest, [addr] +// LDAR dest, [addr] +// +// LDXRB dest, [addr] +// LDXRH dest, [addr] +// LDXR dest, [addr] +// +// LDAXRB dest, [addr] +// LDAXRH dest, [addr] +// LDAXR dest, [addr] +// +// STLRB dest, [addr] +// STLRH dest, [addr] +// STLR dest, [addr] +// + +inline +int +EmitLdaStlCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Addr.RawRegister() << 5) | Dest.RawRegister()); +} + +#define ARM64_OPCODE_LDARB 0x08dffc00 +#define ARM64_OPCODE_LDARH 0x48dffc00 +#define ARM64_OPCODE_LDAR 0x88dffc00 +#define ARM64_OPCODE_LDAR64 0xc8dffc00 + +inline +int +EmitLdarb( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDARB); +} + +inline +int +EmitLdarh( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDARH); +} + +inline +int +EmitLdar( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDAR); +} + +inline +int +EmitLdar64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDAR64); +} + +#define ARM64_OPCODE_LDXRB 0x085f7c00 +#define ARM64_OPCODE_LDXRH 0x485f7c00 +#define ARM64_OPCODE_LDXR 0x885f7c00 +#define ARM64_OPCODE_LDXR64 0xc85f7c00 + +inline +int +EmitLdxrb( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDXRB); +} + +inline +int +EmitLdxrh( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDXRH); +} + +inline +int +EmitLdxr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDXR); +} + +inline +int +EmitLdxr64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDXR64); +} + +#define ARM64_OPCODE_LDAXRB 0x085ffc00 +#define ARM64_OPCODE_LDAXRH 0x485ffc00 +#define ARM64_OPCODE_LDAXR 0x885ffc00 +#define ARM64_OPCODE_LDAXR64 0xc85ffc00 + +inline +int +EmitLdaxrb( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDAXRB); +} + +inline +int +EmitLdaxrh( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDAXRH); +} + +inline +int +EmitLdaxr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDAXR); +} + +inline +int +EmitLdaxr64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Dest, Addr, ARM64_OPCODE_LDAXR64); +} + +#define ARM64_OPCODE_STLRB 0x089ffc00 +#define ARM64_OPCODE_STLRH 0x489ffc00 +#define ARM64_OPCODE_STLR 0x889ffc00 +#define ARM64_OPCODE_STLR64 0xc89ffc00 + +inline +int +EmitStlrb( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Source, Addr, ARM64_OPCODE_STLRB); +} + +inline +int +EmitStlrh( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Source, Addr, ARM64_OPCODE_STLRH); +} + +inline +int +EmitStlr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Source, Addr, ARM64_OPCODE_STLR); +} + +inline +int +EmitStlr64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaStlCommon(Emitter, Source, Addr, ARM64_OPCODE_STLR64); +} + +// +// STXRB status, src, [addr] +// STXRH status, src, [addr] +// STXR status, src, [addr] +// +// STLXRB status, src, [addr] +// STLXRH status, src, [addr] +// STLXR status, src, [addr] +// + +inline +int +EmitStlxrCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Status.RawRegister() << 16) | (Addr.RawRegister() << 5) | Source.RawRegister()); +} + +#define ARM64_OPCODE_STXRB 0x08007c00 +#define ARM64_OPCODE_STXRH 0x48007c00 +#define ARM64_OPCODE_STXR 0x88007c00 +#define ARM64_OPCODE_STXR64 0xc8007c00 + +inline +int +EmitStxrb( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxrCommon(Emitter, Status, Source, Addr, ARM64_OPCODE_STXRB); +} + +inline +int +EmitStxrh( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxrCommon(Emitter, Status, Source, Addr, ARM64_OPCODE_STXRH); +} + +inline +int +EmitStxr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxrCommon(Emitter, Status, Source, Addr, ARM64_OPCODE_STXR); +} + +inline +int +EmitStxr64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxrCommon(Emitter, Status, Source, Addr, ARM64_OPCODE_STXR64); +} + +#define ARM64_OPCODE_STLXRB 0x0800fc00 +#define ARM64_OPCODE_STLXRH 0x4800fc00 +#define ARM64_OPCODE_STLXR 0x8800fc00 +#define ARM64_OPCODE_STLXR64 0xc800fc00 + +inline +int +EmitStlxrb( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxrCommon(Emitter, Status, Source, Addr, ARM64_OPCODE_STLXRB); +} + +inline +int +EmitStlxrh( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxrCommon(Emitter, Status, Source, Addr, ARM64_OPCODE_STLXRH); +} + +inline +int +EmitStlxr( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxrCommon(Emitter, Status, Source, Addr, ARM64_OPCODE_STLXR); +} + +inline +int +EmitStlxr64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxrCommon(Emitter, Status, Source, Addr, ARM64_OPCODE_STLXR64); +} + +// +// LDAXP dest1, dest2, [addr] +// + +inline +int +EmitLdaxpCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest1, + Arm64SimpleRegisterParam Dest2, + Arm64SimpleRegisterParam Addr, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Dest2.RawRegister() << 10) | (Addr.RawRegister() << 5) | Dest1.RawRegister()); +} + +inline +int +EmitLdaxp( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest1, + Arm64SimpleRegisterParam Dest2, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaxpCommon(Emitter, Dest1, Dest2, Addr, 0x887f8000); +} + +inline +int +EmitLdaxp64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest1, + Arm64SimpleRegisterParam Dest2, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitLdaxpCommon(Emitter, Dest1, Dest2, Addr, 0xc87f8000); +} + +// +// STLXP status, src1, src2, [addr] +// + +inline +int +EmitStlxpCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source1, + Arm64SimpleRegisterParam Source2, + Arm64SimpleRegisterParam Addr, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | (Status.RawRegister() << 16) | (Source2.RawRegister() << 10) | (Addr.RawRegister() << 5) | Source1.RawRegister()); +} + +inline +int +EmitStlxp( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source1, + Arm64SimpleRegisterParam Source2, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxpCommon(Emitter, Status, Source1, Source2, Addr, 0x88208000); +} + +inline +int +EmitStlxp64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Status, + Arm64SimpleRegisterParam Source1, + Arm64SimpleRegisterParam Source2, + Arm64SimpleRegisterParam Addr + ) +{ + return EmitStlxpCommon(Emitter, Status, Source1, Source2, Addr, 0xc8208000); +} diff --git a/deps/chakrashim/core/lib/Backend/arm64/ARM64LogicalImmediates.cpp b/deps/chakrashim/core/lib/Backend/arm64/ARM64LogicalImmediates.cpp new file mode 100644 index 00000000000..e1387f3e213 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/ARM64LogicalImmediates.cpp @@ -0,0 +1,9 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "Backend.h" + +#define ARM64_INCLUDE_LOGICAL_IMMEDIATE_TABLE +#include "ARM64LogicalImmediates.h" diff --git a/deps/chakrashim/core/lib/Backend/arm64/ARM64LogicalImmediates.h b/deps/chakrashim/core/lib/Backend/arm64/ARM64LogicalImmediates.h new file mode 100644 index 00000000000..fc8010c07a1 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/ARM64LogicalImmediates.h @@ -0,0 +1,6284 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +/* + The table below is a hash table with integratedoverflow entries, designed + to optimize the conversion from an arbitrary 64-bit immediate value + to a valid immediate encoding. + + To use the hash table, take the 64-bit immediate and MOD it against + the ARM64_LOGICAL_IMMEDIATE_HASH_MODULO value defined below. Use that value + as an index into the table below. If the corresponding entry does not + contain a matching 64-bit value in ImmediateValue, then read the + NextWithSameHash value and use that as an index to find the next table entry + with the same hash, repeating until a match is found or until NextWithSameHash + is -1. If the value is not found in the table, then the 64-bit input + cannot be encoded as an immediate value. + + If a matching entry is found, the encoding can be found in the Encoding + array. Entry 0 is for a 32-bit encoding, and entry 1 is for a 64-bit + encoding. If the encoding value is ARM64_LOGICAL_IMMEDIATE_NO_ENCODING, then that value cannot be + encoded for that bit size. + + The hash constant was obtained by finding a value that produced very + few empty slots in the hash table (only ~20) and also resulted in a + short average and maximum search depth for each hash table entry point. + + The content of this file is automatically generated by building under + LogImmGen. To save build time, this code is not hooked to the + build and the file is checked in. + + To update this header follow these steps: + 1. check out header + 2. cd LogImmGen & bcz + 3. check in header +*/ + +#ifndef __ARM64_LOGICAL_IMMEDIATES__ +#define __ARM64_LOGICAL_IMMEDIATES__ + +const int ARM64_LOGICAL_IMMEDIATE_HASH_MODULO = 6214; +const unsigned short ARM64_LOGICAL_IMMEDIATE_NO_ENCODING = 0xFFFF; + +typedef struct { + unsigned __int64 ImmediateValue; + int NextWithSameHash; + unsigned short Encoding[2]; +} Arm64LogicalImmediateEncoding; + +inline unsigned short FindArm64LogicalImmediateEncoding(unsigned __int64 Value, int Size) { + extern const Arm64LogicalImmediateEncoding g_Arm64LogicalImmediateEncodingTable[6214]; + for (int Index = int(Value % ARM64_LOGICAL_IMMEDIATE_HASH_MODULO); Index != -1; Index = g_Arm64LogicalImmediateEncodingTable[Index].NextWithSameHash) { + const Arm64LogicalImmediateEncoding &Entry = g_Arm64LogicalImmediateEncodingTable[Index]; + if (Entry.ImmediateValue == Value) { + return Entry.Encoding[Size/8]; + } + } + return ARM64_LOGICAL_IMMEDIATE_NO_ENCODING; +} + +#endif + +#ifdef ARM64_INCLUDE_LOGICAL_IMMEDIATE_TABLE +extern const Arm64LogicalImmediateEncoding g_Arm64LogicalImmediateEncodingTable[6214] = { +{0xfffffffc7fffffff, 5,{0xffff,0x17bc}}, // 0 +{0x0000000000000001, -1,{0x0000,0x1000}}, // 1, depth=1 +{0x0000000000000002, -1,{0x07c0,0x1fc0}}, // 2, depth=1 +{0x0000000000000003, 0,{0x0001,0x1001}}, // 3, depth=3 +{0x0000000000000004, -1,{0x0780,0x1f80}}, // 4, depth=1 +{0xff87ffffff87ffff, -1,{0xffff,0x025b}}, // 5 +{0x1fff80001fff8000, 10,{0xffff,0x044d}}, // 6, depth=2 +{0x0000000000000007, 13,{0x0002,0x1002}}, // 7, depth=2 +{0x0000000000000008, -1,{0x0740,0x1f40}}, // 8, depth=1 +{0x8000001fffffffff, -1,{0xffff,0x1065}}, // 9, depth=1 +{0x0000000000000006, -1,{0x07c1,0x1fc1}}, // 10 +{0xbfffbfffbfffbfff, 20,{0xffff,0x006e}}, // 11, depth=2 +{0x3fff00003fff0000, 21,{0xffff,0x040d}}, // 12, depth=2 +{0xffff00000001ffff, -1,{0xffff,0x1420}}, // 13 +{0x000000000000000e, 26,{0x07c2,0x1fc2}}, // 14, depth=2 +{0x000000000000000f, -1,{0x0003,0x1003}}, // 15, depth=1 +{0x0000000000000010, -1,{0x0700,0x1f00}}, // 16, depth=1 +{0xffffffffffc3ffff, -1,{0xffff,0x1abb}}, // 17, depth=1 +{0x1fffc00000000000, -1,{0xffff,0x148e}}, // 18, depth=1 +{0x00000000e007e007, -1,{0x00e5,0xffff}}, // 19, depth=1 +{0xfffffffffe00007f, -1,{0xffff,0x19ed}}, // 20 +{0x000000000000000c, -1,{0x0781,0x1f81}}, // 21 +{0x0000fffe00000000, -1,{0xffff,0x17ce}}, // 22, depth=1 +{0xfff000000007ffff, -1,{0xffff,0x131e}}, // 23, depth=1 +{0x7ffe00007ffe0000, 27,{0xffff,0x03cd}}, // 24, depth=2 +{0xc000000000000fff, -1,{0xffff,0x108d}}, // 25, depth=1 +{0x07fffe0000000000, -1,{0xffff,0x15d1}}, // 26 +{0x0000000000000018, -1,{0x0741,0x1f41}}, // 27 +{0x000000000000001c, 37,{0x0782,0x1f82}}, // 28, depth=2 +{0xfffffffe0001ffff, -1,{0xffff,0x17ef}}, // 29, depth=1 +{0x000000000000001e, 40,{0x07c3,0x1fc3}}, // 30, depth=2 +{0x000000000000001f, 42,{0x0004,0x1004}}, // 31, depth=2 +{0x0000000000000020, -1,{0x06c0,0x1ec0}}, // 32, depth=1 +{0x00000000ffc000ff, -1,{0x0291,0xffff}}, // 33, depth=1 +{0x01fffffffffffc00, -1,{0xffff,0x1dae}}, // 34, depth=1 +{0xe7ffffffe7ffffff, -1,{0xffff,0x00dd}}, // 35, depth=1 +{0x3fff800000000000, -1,{0xffff,0x144e}}, // 36, depth=1 +{0x0ffffc0000000000, -1,{0xffff,0x1591}}, // 37 +{0x0000380000000000, -1,{0xffff,0x1542}}, // 38, depth=1 +{0xffffff0fffffffff, -1,{0xffff,0x163b}}, // 39, depth=1 +{0x001fffffffffe000, -1,{0xffff,0x1ce7}}, // 40 +{0xffffffe000001fff, 43,{0xffff,0x16e7}}, // 41, depth=2 +{0xffffffffff8003ff, -1,{0xffff,0x1a72}}, // 42 +{0xfffffffc003fffff, -1,{0xffff,0x17b3}}, // 43 +{0x0001fffc00000000, -1,{0xffff,0x178e}}, // 44, depth=1 +{0xffc01fffffffffff, -1,{0xffff,0x12b6}}, // 45 +{0x0000000000000030, -1,{0x0701,0x1f01}}, // 46 +{0xfc001ffffc001fff, 45,{0xffff,0x0192}}, // 47, depth=2 +{0xfffc0000fffc0000, 46,{0xffff,0x038d}}, // 48, depth=2 +{0x000000009fff9fff, -1,{0x006d,0xffff}}, // 49, depth=1 +{0x000000000fe00000, -1,{0x02c6,0x1ac6}}, // 50, depth=1 +{0x00000000ff80007f, 52,{0x024f,0xffff}}, // 51, depth=2 +{0xfffe00003fffffff, -1,{0xffff,0x13ec}}, // 52 +{0x01f0000000000000, 57,{0xffff,0x1304}}, // 53 +{0x7000000070000000, 53,{0xffff,0x0102}}, // 54, depth=3 +{0xffffffff8003ffff, -1,{0xffff,0x1872}}, // 55, depth=1 +{0x0000000000000038, 58,{0x0742,0x1f42}}, // 56, depth=2 +{0x000000003fc00000, -1,{0x0287,0x1a87}}, // 57 +{0x1ffff80000000000, -1,{0xffff,0x1551}}, // 58 +{0x003fffffffffc000, -1,{0xffff,0x1ca7}}, // 59 +{0x000000000000003c, 59,{0x0783,0x1f83}}, // 60, depth=2 +{0xe0000000ffffffff, 73,{0xffff,0x10e2}}, // 61, depth=2 +{0x000000000000003e, -1,{0x07c4,0x1fc4}}, // 62, depth=1 +{0x000000000000003f, 75,{0x0005,0x1005}}, // 63, depth=2 +{0x0000000000000040, -1,{0x0680,0x1e80}}, // 64, depth=1 +{0xfe0ffe0ffe0ffe0f, 80,{0xffff,0x01ea}}, // 65, depth=2 +{0x0003800000038000, 83,{0xffff,0x0442}}, // 66, depth=3 +{0x00000000f8001fff, -1,{0x0151,0xffff}}, // 67, depth=1 +{0x03fffffffffff800, -1,{0xffff,0x1d6e}}, // 68, depth=1 +{0x00000000ff3fffff, 85,{0x021d,0xffff}}, // 69, depth=2 +{0x0000000fffffff00, -1,{0xffff,0x1e1b}}, // 70, depth=1 +{0x00000000800000ff, -1,{0x0048,0xffff}}, // 71, depth=1 +{0x7fff000000000000, -1,{0xffff,0x140e}}, // 72, depth=1 +{0xffff800000000fff, -1,{0xffff,0x145c}}, // 73 +{0x0000001ffffe0000, -1,{0xffff,0x1bd3}}, // 74, depth=1 +{0xffffff8000003fff, -1,{0xffff,0x1666}}, // 75 +{0x0000700000000000, -1,{0xffff,0x1502}}, // 76, depth=1 +{0x00000000fffe03ff, -1,{0x03d8,0xffff}}, // 77, depth=1 +{0x0007ff800007ff80, -1,{0xffff,0x064b}}, // 78, depth=1 +{0xffffc000ffffffff, -1,{0xffff,0x14b1}}, // 79, depth=1 +{0xffe3ffffffffffff, -1,{0xffff,0x12fc}}, // 80 +{0x8181818181818181, 86,{0xffff,0x0071}}, // 81, depth=2 +{0x07f007f007f007f0, -1,{0xffff,0x0326}}, // 82, depth=1 +{0x00000f8000000000, 84,{0xffff,0x1644}}, // 83 +{0x000000000001fe00, -1,{0x05c7,0x1dc7}}, // 84 +{0xfffffff8000fffff, -1,{0xffff,0x1770}}, // 85 +{0xffff001fffffffff, -1,{0xffff,0x1434}}, // 86 +{0x00000000f3f3f3f3, 89,{0x0135,0xffff}}, // 87, depth=2 +{0x0003fff800000000, -1,{0xffff,0x174e}}, // 88, depth=1 +{0xfffffff000007fff, -1,{0xffff,0x172a}}, // 89 +{0xfffe00001fffffff, -1,{0xffff,0x13eb}}, // 90 +{0x03e0000000000000, 92,{0xffff,0x12c4}}, // 91 +{0x000000007f800000, -1,{0x0247,0x1a47}}, // 92 +{0xffffe000000001ff, -1,{0xffff,0x14db}}, // 93, depth=1 +{0x7ffffffe00000000, -1,{0xffff,0x17dd}}, // 94, depth=1 +{0xfffffffc3fffffff, -1,{0xffff,0x17bb}}, // 95, depth=1 +{0x0000000000000060, -1,{0x06c1,0x1ec1}}, // 96, depth=1 +{0x80000fff80000fff, 90,{0xffff,0x004c}}, // 97, depth=2 +{0xffffffe0000007ff, -1,{0xffff,0x16e5}}, // 98 +{0xfffc0003ffffffff, -1,{0xffff,0x13af}}, // 99, depth=1 +{0x000000001fc00000, -1,{0x0286,0x1a86}}, // 100, depth=1 +{0xf0ffffffffffffff, -1,{0xffff,0x113b}}, // 101, depth=1 +{0x3ffff00000000000, -1,{0xffff,0x1511}}, // 102 +{0xffe000000000ffff, -1,{0xffff,0x12da}}, // 103, depth=1 +{0x007fffffffff8000, -1,{0xffff,0x1c67}}, // 104 +{0xfffffe0000ffffff, -1,{0xffff,0x15ee}}, // 105 +{0x00001f0000000000, 109,{0xffff,0x1604}}, // 106 +{0xffffffff000003ff, -1,{0xffff,0x1829}}, // 107, depth=1 +{0xe0000000e0000000, 91,{0xffff,0x00c2}}, // 108, depth=3 +{0x000000000003fc00, -1,{0x0587,0x1d87}}, // 109 +{0xfffff00000000fff, 116,{0xffff,0x151f}}, // 110 +{0xff007fffff007fff, 98,{0xffff,0x0216}}, // 111, depth=2 +{0x0000000000000070, 102,{0x0702,0x1f02}}, // 112, depth=2 +{0xf800000000ffffff, -1,{0xffff,0x115c}}, // 113, depth=1 +{0xffff8000ffff8000, -1,{0xffff,0x0450}}, // 114, depth=1 +{0xfffffffffffe1fff, -1,{0xffff,0x1bfb}}, // 115, depth=1 +{0xe0000000007fffff, -1,{0xffff,0x10d9}}, // 116 +{0xfffff800ffffffff, -1,{0xffff,0x1574}}, // 117, depth=1 +{0x00000003fff00000, -1,{0xffff,0x1b0d}}, // 118, depth=1 +{0x03ffffffffffe000, -1,{0xffff,0x1cec}}, // 119 +{0x0000000000000078, 104,{0x0743,0x1f43}}, // 120, depth=2 +{0xfffe0ffffffe0fff, -1,{0xffff,0x03da}}, // 121, depth=1 +{0x000001fffffff000, -1,{0xffff,0x1d1c}}, // 122, depth=1 +{0x00000000fe7ffe7f, -1,{0x01ed,0xffff}}, // 123, depth=1 +{0x000000000000007c, -1,{0x0784,0x1f84}}, // 124, depth=1 +{0xff00000001ffffff, -1,{0xffff,0x1220}}, // 125, depth=1 +{0x000000000000007e, -1,{0x07c5,0x1fc5}}, // 126, depth=1 +{0x000000000000007f, 105,{0x0006,0x1006}}, // 127, depth=2 +{0x0000000000000080, -1,{0x0640,0x1e40}}, // 128, depth=1 +{0xfffffffc1fffffff, -1,{0xffff,0x17ba}}, // 129 +{0xfffe000000000003, 131,{0xffff,0x13d0}}, // 130 +{0xc00001ffffffffff, -1,{0xffff,0x10aa}}, // 131 +{0x0007000000070000, 106,{0xffff,0x0402}}, // 132, depth=3 +{0x0000003ffffc0000, -1,{0xffff,0x1b93}}, // 133 +{0x0c00000000000000, -1,{0xffff,0x1181}}, // 134, depth=1 +{0xfffe000000000007, -1,{0xffff,0x13d1}}, // 135 +{0x07fffffffffff000, -1,{0xffff,0x1d2e}}, // 136, depth=1 +{0x00000000f80007ff, 110,{0x014f,0xffff}}, // 137, depth=3 +{0x003ffffffc000000, 119,{0xffff,0x199b}}, // 138, depth=2 +{0xfffffffffe0000ff, -1,{0xffff,0x19ee}}, // 139, depth=1 +{0x0000001ffffffe00, -1,{0xffff,0x1ddb}}, // 140, depth=1 +{0xffffff1fffffff1f, 129,{0xffff,0x061c}}, // 141, depth=2 +{0x00007f8000000000, -1,{0xffff,0x1647}}, // 142, depth=1 +{0xfffdffffffffffff, -1,{0xffff,0x13be}}, // 143, depth=1 +{0xfffe000000000000, -1,{0xffff,0x13ce}}, // 144, depth=1 +{0xfffe000000000001, -1,{0xffff,0x13cf}}, // 145, depth=1 +{0x07f0000007f00000, -1,{0xffff,0x0306}}, // 146, depth=1 +{0x03ffffff03ffffff, 130,{0xffff,0x0019}}, // 147, depth=3 +{0x000ffffe000ffffe, 133,{0xffff,0x07d2}}, // 148, depth=2 +{0xffffe0000001ffff, -1,{0xffff,0x14e3}}, // 149 +{0xffffffffff83ffff, -1,{0xffff,0x1a7a}}, // 150 +{0xf0000ffff0000fff, 135,{0xffff,0x010f}}, // 151, depth=2 +{0x0000e00000000000, -1,{0xffff,0x14c2}}, // 152, depth=1 +{0xffc00001ffffffff, -1,{0xffff,0x12aa}}, // 153 +{0xff9fff9fff9fff9f, -1,{0xffff,0x026d}}, // 154 +{0xffffc000007fffff, -1,{0xffff,0x14a8}}, // 155, depth=1 +{0x000fff00000fff00, -1,{0xffff,0x060b}}, // 156, depth=1 +{0xffff81ffffffffff, -1,{0xffff,0x1479}}, // 157 +{0x007fffc0007fffc0, -1,{0xffff,0x0690}}, // 158, depth=1 +{0xfffe00000000000f, 149,{0xffff,0x13d2}}, // 159, depth=2 +{0xfffffffbffffffff, -1,{0xffff,0x177e}}, // 160 +{0xc7ffffffffffffff, -1,{0xffff,0x10bc}}, // 161, depth=1 +{0x0001fffffff00000, -1,{0xffff,0x1b1c}}, // 162, depth=1 +{0x00000000f1f1f1f1, 150,{0x0134,0xffff}}, // 163, depth=2 +{0x0fe00fe00fe00fe0, -1,{0xffff,0x02e6}}, // 164, depth=1 +{0xffe007ffffe007ff, -1,{0xffff,0x02d5}}, // 165, depth=1 +{0xfffffffc00000001, -1,{0xffff,0x179e}}, // 166 +{0xff800007ffffffff, -1,{0xffff,0x126b}}, // 167, depth=1 +{0xfffffffc00000003, 169,{0xffff,0x179f}}, // 168 +{0xfff8000000001fff, -1,{0xffff,0x1359}}, // 169 +{0x000000fffe000000, -1,{0xffff,0x19ce}}, // 170, depth=1 +{0xfffff800007fffff, 172,{0xffff,0x156b}}, // 171 +{0xfe00003ffe00003f, -1,{0xffff,0x01cc}}, // 172 +{0x00000000fffc7fff, -1,{0x039c,0xffff}}, // 173, depth=1 +{0x000003fffffff800, -1,{0xffff,0x1d5e}}, // 174, depth=1 +{0xfffe00000000001f, -1,{0xffff,0x13d3}}, // 175, depth=1 +{0x0007fff000000000, -1,{0xffff,0x170e}}, // 176, depth=1 +{0xff03ffffff03ffff, 153,{0xffff,0x0219}}, // 177, depth=2 +{0x3fffff8000000000, -1,{0xffff,0x1656}}, // 178, depth=1 +{0x00000000ff8000ff, 154,{0x0250,0xffff}}, // 179, depth=2 +{0xffc0ffffffffffff, -1,{0xffff,0x12b9}}, // 180 +{0xfffffffc0000000f, -1,{0xffff,0x17a1}}, // 181 +{0xfffffffff81fffff, -1,{0xffff,0x1979}}, // 182 +{0xfffffffbfffffffb, 157,{0xffff,0x075e}}, // 183, depth=2 +{0xfffffc03fffffc03, -1,{0xffff,0x0597}}, // 184 +{0xfffffffffffe07ff, -1,{0xffff,0x1bf9}}, // 185, depth=1 +{0x00000007f0000000, -1,{0xffff,0x1906}}, // 186, depth=1 +{0xfe07fe07fe07fe07, 160,{0xffff,0x01e9}}, // 187, depth=2 +{0xfffffffc00000000, -1,{0xffff,0x179d}}, // 188, depth=1 +{0x00000000e00001ff, 166,{0x00cb,0xffff}}, // 189, depth=2 +{0x07c0000000000000, -1,{0xffff,0x1284}}, // 190 +{0x00000000ffff3fff, 168,{0x041d,0xffff}}, // 191, depth=3 +{0x00000000000000c0, -1,{0x0681,0x1e81}}, // 192, depth=1 +{0x0000000007ff07ff, 171,{0x002a,0xffff}}, // 193, depth=3 +{0xfffffffc0000001f, -1,{0xffff,0x17a2}}, // 194 +{0xfffffffc00000007, -1,{0xffff,0x17a0}}, // 195, depth=1 +{0x7fffe00000000000, -1,{0xffff,0x14d1}}, // 196 +{0xffffff00000001ff, -1,{0xffff,0x1620}}, // 197 +{0x0000000fffffff80, -1,{0xffff,0x1e5c}}, // 198, depth=1 +{0xfffffdfffffffdff, 180,{0xffff,0x059e}}, // 199, depth=2 +{0x000000003f800000, -1,{0x0246,0x1a46}}, // 200, depth=1 +{0xfcffffffffffffff, -1,{0xffff,0x11bd}}, // 201 +{0x0ffffffffffff800, -1,{0xffff,0x1d70}}, // 202, depth=1 +{0xffffff8000000fff, 181,{0xffff,0x1664}}, // 203, depth=2 +{0xffffffff0003ffff, -1,{0xffff,0x1831}}, // 204 +{0x00000000fe3ffe3f, -1,{0x01ec,0xffff}}, // 205, depth=1 +{0x00ffffffffff0000, -1,{0xffff,0x1c27}}, // 206 +{0xfffe00000000003f, 182,{0xffff,0x13d4}}, // 207, depth=2 +{0x0007ffffffffff00, -1,{0xffff,0x1e2a}}, // 208 +{0xffc1ffffffc1ffff, -1,{0xffff,0x029a}}, // 209, depth=1 +{0xfffffffff00fffff, 211,{0xffff,0x1937}}, // 210 +{0xff83ffffffffffff, 212,{0xffff,0x127a}}, // 211 +{0xe3ffffffe3ffffff, 213,{0xffff,0x00dc}}, // 212 +{0x00000000e001ffff, -1,{0x00d3,0xffff}}, // 213 +{0x00000ff000000ff0, -1,{0xffff,0x0707}}, // 214, depth=1 +{0x00000000feffffff, 184,{0x01de,0xffff}}, // 215, depth=2 +{0x00000000ff000000, 190,{0x0207,0x1a07}}, // 216, depth=2 +{0x00000000ff000001, -1,{0x0208,0xffff}}, // 217, depth=1 +{0x0000000fffffffc0, 220,{0xffff,0x1e9d}}, // 218 +{0x00000000ff000003, 194,{0x0209,0xffff}}, // 219, depth=2 +{0x000001ffffffc000, -1,{0xffff,0x1c9a}}, // 220 +{0x00003e0000000000, 222,{0xffff,0x15c4}}, // 221 +{0x000000000007f800, -1,{0x0547,0x1d47}}, // 222 +{0x00000000ff000007, -1,{0x020a,0xffff}}, // 223, depth=1 +{0x00000000000000e0, 196,{0x06c2,0x1ec2}}, // 224, depth=2 +{0x8000001f8000001f, 197,{0xffff,0x0045}}, // 225, depth=2 +{0x0000060000000000, -1,{0xffff,0x15c1}}, // 226, depth=1 +{0x0003fffff0000000, -1,{0xffff,0x1915}}, // 227 +{0x07ffffffffffc000, -1,{0xffff,0x1cac}}, // 228 +{0xffe0000fffe0000f, -1,{0xffff,0x02ce}}, // 229, depth=1 +{0x00fc000000000000, -1,{0xffff,0x1385}}, // 230 +{0x00000000ff00000f, -1,{0x020b,0xffff}}, // 231, depth=1 +{0x00000000ff00003f, -1,{0x020d,0xffff}}, // 232 +{0xffffe01fffffffff, -1,{0xffff,0x14f7}}, // 233, depth=1 +{0xff8000000000ffff, -1,{0xffff,0x1258}}, // 234 +{0x00000000c00001ff, 201,{0x008a,0xffff}}, // 235, depth=2 +{0x00000007ffe00000, -1,{0xffff,0x1acd}}, // 236, depth=1 +{0x0000000fffffffe0, -1,{0xffff,0x1ede}}, // 237 +{0x00f8000000f80000, -1,{0xffff,0x0344}}, // 238, depth=1 +{0x00000000efefefef, 204,{0x00f6,0xffff}}, // 239, depth=2 +{0x00000000000000f0, 206,{0x0703,0x1f03}}, // 240, depth=2 +{0x0000007ffff80000, -1,{0xffff,0x1b53}}, // 241 +{0x0fe0000000000000, -1,{0xffff,0x12c6}}, // 242, depth=1 +{0x0380000000000000, -1,{0xffff,0x1242}}, // 243 +{0x000003ffffffe000, -1,{0xffff,0x1cdc}}, // 244, depth=1 +{0xe00000007fffffff, -1,{0xffff,0x10e1}}, // 245, depth=1 +{0x000000001f800000, 208,{0x0245,0x1a45}}, // 246, depth=2 +{0x00000000ff00001f, -1,{0x020c,0xffff}}, // 247, depth=1 +{0x00000000000000f8, -1,{0x0744,0x1f44}}, // 248, depth=1 +{0xfffe001ffffe001f, -1,{0xffff,0x03d3}}, // 249, depth=1 +{0xfffff8007fffffff, 253,{0xffff,0x1573}}, // 250 +{0xfffffffc0000003f, -1,{0xffff,0x17a3}}, // 251, depth=1 +{0x00000000000000fc, -1,{0x0785,0x1f85}}, // 252, depth=1 +{0xffffc000003fffff, -1,{0xffff,0x14a7}}, // 253 +{0x00000000000000fe, -1,{0x07c6,0x1fc6}}, // 254, depth=1 +{0x00000000000000ff, 210,{0x0007,0x1007}}, // 255, depth=5 +{0x0000000000000100, -1,{0x0600,0x1e00}}, // 256, depth=1 +{0x01ffffff01ffffff, -1,{0xffff,0x0018}}, // 257, depth=1 +{0x00001ffffe000000, -1,{0xffff,0x19d3}}, // 258 +{0xfffff1ffffffffff, -1,{0xffff,0x153c}}, // 259, depth=1 +{0xffffffffe7ffffff, -1,{0xffff,0x18fd}}, // 260 +{0xfff80000000007ff, -1,{0xffff,0x1357}}, // 261, depth=1 +{0x0000000003f003f0, 218,{0x0325,0xffff}}, // 262, depth=3 +{0xffffc0007fffffff, -1,{0xffff,0x14b0}}, // 263, depth=1 +{0x000e0000000e0000, 221,{0xffff,0x03c2}}, // 264, depth=3 +{0xfe00007fffffffff, -1,{0xffff,0x11ed}}, // 265, depth=1 +{0x0001c00000000000, -1,{0xffff,0x1482}}, // 266 +{0xf8001ffff8001fff, -1,{0xffff,0x0151}}, // 267, depth=1 +{0x1800000000000000, -1,{0xffff,0x1141}}, // 268, depth=1 +{0xfffffffffff00003, -1,{0xffff,0x1b2d}}, // 269 +{0x0000000ffffffff0, -1,{0xffff,0x1f1f}}, // 270 +{0xfffe00000000007f, -1,{0xffff,0x13d5}}, // 271, depth=1 +{0x0fffffffffffe000, -1,{0xffff,0x1cee}}, // 272, depth=1 +{0xfff0007fffffffff, -1,{0xffff,0x1332}}, // 273 +{0x0000000038003800, 227,{0x0162,0xffff}}, // 274, depth=2 +{0x0000000ffffffffc, -1,{0xffff,0x1fa1}}, // 275 +{0x007ffffff8000000, 228,{0xffff,0x195b}}, // 276, depth=2 +{0x0000000ffffffffe, -1,{0xffff,0x1fe2}}, // 277 +{0x0000080000000800, 230,{0xffff,0x0540}}, // 278, depth=2 +{0xf000001ff000001f, 232,{0xffff,0x0108}}, // 279, depth=2 +{0x0000003ffffffc00, -1,{0xffff,0x1d9b}}, // 280, depth=1 +{0x0000000fffffffff, -1,{0xffff,0x1023}}, // 281 +{0x1ffffe0000000000, -1,{0xffff,0x15d3}}, // 282, depth=1 +{0xe0000000003fffff, -1,{0xffff,0x10d8}}, // 283, depth=1 +{0x0000ff0000000000, -1,{0xffff,0x1607}}, // 284, depth=1 +{0x0000001000000000, -1,{0xffff,0x1700}}, // 285 +{0xffc0000000ffffff, -1,{0xffff,0x12a1}}, // 286 +{0x00000000fdfffdff, -1,{0x01ae,0xffff}}, // 287, depth=1 +{0x3ffe3ffe3ffe3ffe, -1,{0xffff,0x03ec}}, // 288, depth=1 +{0x00000000ffc001ff, -1,{0x0292,0xffff}}, // 289, depth=1 +{0xfe000fffffffffff, 297,{0xffff,0x11f2}}, // 290 +{0xffffff000001ffff, -1,{0xffff,0x1628}}, // 291, depth=1 +{0x0fe000000fe00000, -1,{0xffff,0x02c6}}, // 292, depth=1 +{0x00000000ffc1ffc1, 234,{0x02aa,0xffff}}, // 293, depth=2 +{0x07fffffe07fffffe, 237,{0xffff,0x07d9}}, // 294, depth=2 +{0xff0000ffffffffff, -1,{0xffff,0x122f}}, // 295, depth=1 +{0x001ffffc001ffffc, 241,{0xffff,0x0792}}, // 296, depth=2 +{0x00000000ffff0fff, -1,{0x041b,0xffff}}, // 297 +{0x3e003e003e003e00, 243,{0xffff,0x01e4}}, // 298, depth=2 +{0xfffdfffdfffdfffd, -1,{0xffff,0x03ae}}, // 299, depth=1 +{0xfffffffffff0001f, -1,{0xffff,0x1b30}}, // 300 +{0x00000000c001ffff, 250,{0x0092,0xffff}}, // 301, depth=3 +{0x07ffff0007ffff00, 258,{0xffff,0x0612}}, // 302, depth=2 +{0xfc00003ffc00003f, 260,{0xffff,0x018b}}, // 303, depth=2 +{0xfefefefefefefefe, 266,{0xffff,0x01f6}}, // 304, depth=2 +{0xffffffffffefffff, -1,{0xffff,0x1afe}}, // 305, depth=1 +{0xfffffffffff00000, -1,{0xffff,0x1b2b}}, // 306, depth=1 +{0xfffffffffff00001, -1,{0xffff,0x1b2c}}, // 307, depth=1 +{0xfffff800003fffff, -1,{0xffff,0x156a}}, // 308 +{0xfdfffdfffdfffdff, 269,{0xffff,0x01ae}}, // 309, depth=2 +{0x001fffffffff8000, 270,{0xffff,0x1c65}}, // 310, depth=2 +{0x0001f80000000000, -1,{0xffff,0x1545}}, // 311 +{0x001ffe00001ffe00, -1,{0xffff,0x05cb}}, // 312, depth=1 +{0xfffffffffff00007, -1,{0xffff,0x1b2e}}, // 313, depth=1 +{0xfffffe00ffffffff, 320,{0xffff,0x15f6}}, // 314 +{0xfffffffc0000007f, -1,{0xffff,0x17a4}}, // 315, depth=1 +{0x00ffff8000ffff80, -1,{0xffff,0x0650}}, // 316, depth=1 +{0xffc000ffffc000ff, -1,{0xffff,0x0291}}, // 317, depth=1 +{0x0000000ffffffff8, -1,{0xffff,0x1f60}}, // 318, depth=1 +{0xfc01fc01fc01fc01, 273,{0xffff,0x01a6}}, // 319, depth=2 +{0xf000000003ffffff, -1,{0xffff,0x111d}}, // 320 +{0xfffffffffff0000f, -1,{0xffff,0x1b2f}}, // 321, depth=1 +{0x000000000001ff00, 275,{0x0608,0x1e08}}, // 322, depth=2 +{0xffffffffff0003ff, -1,{0xffff,0x1a31}}, // 323, depth=1 +{0x0003ffffffe00000, 277,{0xffff,0x1adc}}, // 324, depth=2 +{0xffc00001ffc00001, 281,{0xffff,0x028a}}, // 325, depth=2 +{0x07e007e007e007e0, 285,{0xffff,0x02e5}}, // 326, depth=2 +{0x00000000800001ff, -1,{0x0049,0xffff}}, // 327, depth=1 +{0x1fc01fc01fc01fc0, -1,{0xffff,0x02a6}}, // 328, depth=1 +{0xf8000000ffffffff, 286,{0xffff,0x1164}}, // 329, depth=2 +{0xffffffffc7ffffff, -1,{0xffff,0x18bc}}, // 330 +{0x803f803f803f803f, 290,{0xffff,0x0066}}, // 331, depth=3 +{0x07fffffffc000000, -1,{0xffff,0x19a0}}, // 332 +{0xffffc0003fffffff, -1,{0xffff,0x14af}}, // 333 +{0x000000000007e000, -1,{0x04c5,0x1cc5}}, // 334, depth=1 +{0xffffff1fffffffff, -1,{0xffff,0x163c}}, // 335 +{0x00fffff800000000, -1,{0xffff,0x1754}}, // 336 +{0xe00000003fffffff, 300,{0xffff,0x10e0}}, // 337, depth=2 +{0xffffffe00007ffff, -1,{0xffff,0x16ed}}, // 338 +{0xffffe07fffffe07f, 308,{0xffff,0x04d9}}, // 339, depth=2 +{0x000001fffc000000, -1,{0xffff,0x198e}}, // 340, depth=1 +{0x00003ffffffff000, 344,{0xffff,0x1d21}}, // 341 +{0x0000001000000010, 311,{0xffff,0x0700}}, // 342, depth=2 +{0x00000000ff00007f, 314,{0x020e,0xffff}}, // 343, depth=3 +{0x000000000ffe0ffe, -1,{0x03ea,0xffff}}, // 344 +{0xfffff8003fffffff, 347,{0xffff,0x1572}}, // 345 +{0x7fe000007fe00000, -1,{0xffff,0x02c9}}, // 346, depth=1 +{0xff0001ffff0001ff, -1,{0xffff,0x0210}}, // 347 +{0x000007fffffff000, -1,{0xffff,0x1d1e}}, // 348, depth=1 +{0xfff87ffffff87fff, 330,{0xffff,0x035b}}, // 349, depth=2 +{0xffffc0001fffffff, -1,{0xffff,0x14ae}}, // 350 +{0xfe7ffffffe7fffff, -1,{0xffff,0x01dd}}, // 351, depth=1 +{0x000fffe000000000, -1,{0xffff,0x16ce}}, // 352, depth=1 +{0xfe007fffffffffff, -1,{0xffff,0x11f5}}, // 353 +{0x000000007ffc7ffc, 332,{0x03ac,0xffff}}, // 354, depth=2 +{0x00000000ffc1ffff, 333,{0x029a,0xffff}}, // 355, depth=2 +{0x7fffff0000000000, -1,{0xffff,0x1616}}, // 356, depth=1 +{0xffff87ffffffffff, -1,{0xffff,0x147b}}, // 357 +{0x0180018001800180, -1,{0xffff,0x0261}}, // 358, depth=1 +{0xfffffffffff83fff, -1,{0xffff,0x1b7a}}, // 359, depth=1 +{0x81ffffffffffffff, -1,{0xffff,0x1079}}, // 360 +{0x800fffffffffffff, -1,{0xffff,0x1074}}, // 361, depth=1 +{0x00000ffffff80000, -1,{0xffff,0x1b58}}, // 362, depth=1 +{0x03ffffffffff8000, -1,{0xffff,0x1c6a}}, // 363 +{0xfffffe00007fffff, -1,{0xffff,0x15ed}}, // 364 +{0xe1ffffffe1ffffff, 335,{0xffff,0x00db}}, // 365, depth=2 +{0x03f0000003f00000, 336,{0xffff,0x0305}}, // 366, depth=2 +{0xfffffff000001fff, -1,{0xffff,0x1728}}, // 367, depth=1 +{0x00000001fe000000, -1,{0xffff,0x19c7}}, // 368 +{0xfffffffffff0003f, -1,{0xffff,0x1b31}}, // 369, depth=1 +{0x00ff000000ff0000, -1,{0xffff,0x0407}}, // 370, depth=1 +{0xfffffc0003ffffff, -1,{0xffff,0x15af}}, // 371, depth=1 +{0x0000000fe0000000, -1,{0xffff,0x18c6}}, // 372, depth=1 +{0xc00007ffffffffff, -1,{0xffff,0x10ac}}, // 373, depth=1 +{0x0007ffffffffff80, -1,{0xffff,0x1e6b}}, // 374, depth=1 +{0x00000000ff81ff81, 338,{0x0269,0xffff}}, // 375, depth=2 +{0xfffffffffff0007f, -1,{0xffff,0x1b32}}, // 376 +{0x00000000fc0fffff, -1,{0x0199,0xffff}}, // 377, depth=1 +{0xfff803ffffffffff, 379,{0xffff,0x1376}}, // 378 +{0xff8003ffff8003ff, -1,{0xffff,0x0252}}, // 379 +{0xfffffff0000007ff, 382,{0xffff,0x1726}}, // 380 +{0x80000000000003ff, -1,{0xffff,0x104a}}, // 381, depth=1 +{0xe000000000000007, -1,{0xffff,0x10c5}}, // 382 +{0xe00000001fffffff, -1,{0xffff,0x10df}}, // 383, depth=1 +{0x0000000000000180, -1,{0x0641,0x1e41}}, // 384, depth=1 +{0xfff00fffffffffff, -1,{0xffff,0x1337}}, // 385, depth=1 +{0x0000000007fc0000, 341,{0x0388,0x1b88}}, // 386, depth=3 +{0x0007ffffffffffc0, -1,{0xffff,0x1eac}}, // 387 +{0xfffffffc000000ff, -1,{0xffff,0x17a5}}, // 388 +{0xffffffc0001fffff, -1,{0xffff,0x16ae}}, // 389 +{0xffffc00000000000, -1,{0xffff,0x1491}}, // 390 +{0xfffffc0000003fff, -1,{0xffff,0x15a3}}, // 391 +{0xffff0000000003ff, 394,{0xffff,0x1419}}, // 392 +{0x000000008001ffff, 345,{0x0051,0xffff}}, // 393, depth=3 +{0x00000000fffc1fff, -1,{0x039a,0xffff}}, // 394 +{0xfffffffffe0001ff, -1,{0xffff,0x19ef}}, // 395, depth=1 +{0x0000001fffffff00, -1,{0xffff,0x1e1c}}, // 396, depth=1 +{0xffffffffff03ffff, -1,{0xffff,0x1a39}}, // 397 +{0xfffffffffe01ffff, 402,{0xffff,0x19f7}}, // 398 +{0xfffe0000000000ff, -1,{0xffff,0x13d6}}, // 399, depth=1 +{0x000000007f000000, -1,{0x0206,0x1a06}}, // 400, depth=1 +{0x00000000f807ffff, 350,{0x0157,0xffff}}, // 401, depth=2 +{0xfff07fffffffffff, 408,{0xffff,0x133a}}, // 402 +{0xfffc000001ffffff, -1,{0xffff,0x13a6}}, // 403, depth=1 +{0x1ffffffffffff000, -1,{0xffff,0x1d30}}, // 404, depth=1 +{0xf8000000007fffff, -1,{0xffff,0x115b}}, // 405, depth=1 +{0x01ffffe000000000, -1,{0xffff,0x16d3}}, // 406, depth=1 +{0x00000000c00fc00f, 353,{0x00a5,0xffff}}, // 407, depth=2 +{0xe00000000000001f, -1,{0xffff,0x10c7}}, // 408 +{0xff000003ff000003, 357,{0xffff,0x0209}}, // 409, depth=2 +{0x07fe000007fe0000, -1,{0xffff,0x03c9}}, // 410, depth=1 +{0xc0003fffffffffff, -1,{0xffff,0x10af}}, // 411, depth=1 +{0xfffffffffcffffff, 416,{0xffff,0x19bd}}, // 412 +{0xfff01ffffff01fff, -1,{0xffff,0x0318}}, // 413, depth=1 +{0x007fe000007fe000, -1,{0xffff,0x04c9}}, // 414, depth=1 +{0xfffbfffffffbffff, 360,{0xffff,0x035e}}, // 415, depth=2 +{0xff800007ff800007, -1,{0xffff,0x024b}}, // 416 +{0xfffe000fffffffff, -1,{0xffff,0x13f2}}, // 417 +{0x0000000fc0000000, 363,{0xffff,0x1885}}, // 418, depth=2 +{0xcfcfcfcfcfcfcfcf, 364,{0xffff,0x00b5}}, // 419, depth=2 +{0x0007ffffffffffe0, -1,{0xffff,0x1eed}}, // 420 +{0xf000000000003fff, -1,{0xffff,0x1111}}, // 421, depth=1 +{0x0000000001f00000, -1,{0x0304,0x1b04}}, // 422, depth=1 +{0xff8fff8fff8fff8f, -1,{0xffff,0x026c}}, // 423, depth=1 +{0x3ffffffffff80000, -1,{0xffff,0x1b6a}}, // 424 +{0x00000000f3ffffff, -1,{0x011d,0xffff}}, // 425, depth=1 +{0x000ffffffffe0000, -1,{0xffff,0x1be2}}, // 426, depth=1 +{0xff001fffffffffff, -1,{0xffff,0x1234}}, // 427, depth=1 +{0x00001fe000001fe0, -1,{0xffff,0x06c7}}, // 428, depth=1 +{0xdfffffffffffffff, -1,{0xffff,0x10be}}, // 429, depth=1 +{0xe000000000000000, -1,{0xffff,0x10c2}}, // 430, depth=1 +{0xe000000000000001, -1,{0xffff,0x10c3}}, // 431, depth=1 +{0x0f80000000000000, 368,{0xffff,0x1244}}, // 432, depth=2 +{0xe000000000000003, 376,{0xffff,0x10c4}}, // 433, depth=2 +{0xfffffffe000003ff, -1,{0xffff,0x17e8}}, // 434 +{0x00000000ff8001ff, 378,{0x0251,0xffff}}, // 435, depth=3 +{0x01fffffffffe0000, -1,{0xffff,0x1be7}}, // 436 +{0x0000000080078007, 380,{0x0063,0xffff}}, // 437, depth=3 +{0x00007ffffff80000, 387,{0xffff,0x1b5b}}, // 438, depth=2 +{0xfffff8001fffffff, -1,{0xffff,0x1571}}, // 439, depth=1 +{0xf03fffffffffffff, -1,{0xffff,0x1139}}, // 440 +{0xffffffff87ffffff, -1,{0xffff,0x187b}}, // 441, depth=1 +{0x0007fffffffffff0, -1,{0xffff,0x1f2e}}, // 442 +{0xffe00fffffe00fff, 388,{0xffff,0x02d6}}, // 443, depth=2 +{0x000ffffffffffe00, -1,{0xffff,0x1dea}}, // 444 +{0xe00000000000000f, 389,{0xffff,0x10c6}}, // 445, depth=2 +{0xfffff80000000007, -1,{0xffff,0x1557}}, // 446 +{0xffffbfffffffffff, -1,{0xffff,0x147e}}, // 447, depth=1 +{0x00000000000001c0, 390,{0x0682,0x1e82}}, // 448, depth=2 +{0xffffc00000000001, 391,{0xffff,0x1492}}, // 449, depth=2 +{0x000000000001ff80, -1,{0x0649,0x1e49}}, // 450, depth=1 +{0xffffc00000000003, -1,{0xffff,0x1493}}, // 451, depth=1 +{0x00000c0000000000, -1,{0xffff,0x1581}}, // 452, depth=1 +{0x1f1f1f1f1f1f1f1f, 392,{0xffff,0x0034}}, // 453, depth=3 +{0x0000fffffe000000, -1,{0xffff,0x19d6}}, // 454, depth=1 +{0xffffc00000000007, 397,{0xffff,0x1494}}, // 455, depth=2 +{0xfffff8000000000f, 457,{0xffff,0x1558}}, // 456 +{0x0007ffffffffffff, -1,{0xffff,0x1032}}, // 457 +{0x0000c0000000c000, -1,{0xffff,0x0481}}, // 458, depth=1 +{0xffffffffe0007fff, -1,{0xffff,0x18f1}}, // 459, depth=1 +{0x0000000f80000000, 462,{0xffff,0x1844}}, // 460 +{0xfc7ffffffc7fffff, 398,{0xffff,0x019c}}, // 461, depth=4 +{0x00000000000001fe, -1,{0x07c7,0x1fc7}}, // 462 +{0xffffc0000000000f, -1,{0xffff,0x1495}}, // 463, depth=1 +{0xffffc0000000003f, -1,{0xffff,0x1497}}, // 464 +{0xf80000007fffffff, -1,{0xffff,0x1163}}, // 465 +{0x001ffffff8000000, -1,{0xffff,0x1959}}, // 466, depth=1 +{0x000000003fff3fff, 412,{0x002d,0xffff}}, // 467, depth=3 +{0x007fffc000000000, 478,{0xffff,0x1690}}, // 468 +{0xc0007fffc0007fff, 417,{0xffff,0x0090}}, // 469, depth=2 +{0x3fffc0003fffc000, 420,{0xffff,0x048f}}, // 470, depth=2 +{0x00000000ff0000ff, -1,{0x020f,0xffff}}, // 471, depth=1 +{0x0000000fffc00000, -1,{0xffff,0x1a8d}}, // 472, depth=1 +{0xffcfffffffcfffff, -1,{0xffff,0x029d}}, // 473, depth=1 +{0x000000fc00000000, 424,{0xffff,0x1785}}, // 474, depth=2 +{0xdfffffffdfffffff, 434,{0xffff,0x009e}}, // 475, depth=2 +{0x01f0000001f00000, -1,{0xffff,0x0304}}, // 476, depth=1 +{0xfc00000003ffffff, -1,{0xffff,0x119f}}, // 477, depth=1 +{0x03fffffe03fffffe, -1,{0xffff,0x07d8}}, // 478 +{0xffffc0000000001f, -1,{0xffff,0x1496}}, // 479, depth=1 +{0x00000000000001e0, 436,{0x06c3,0x1ec3}}, // 480, depth=2 +{0xffff7fffffff7fff, 440,{0xffff,0x041e}}, // 481, depth=2 +{0x0000000003ff0000, -1,{0x0409,0x1c09}}, // 482, depth=1 +{0x00000000fffc07ff, -1,{0x0398,0xffff}}, // 483 +{0x1fc0000000000000, -1,{0xffff,0x1286}}, // 484, depth=1 +{0xfffff7ffffffffff, -1,{0xffff,0x153e}}, // 485, depth=1 +{0xfffff80000000000, 442,{0xffff,0x1554}}, // 486, depth=2 +{0xfffff80000000001, -1,{0xffff,0x1555}}, // 487, depth=1 +{0x000007ffffffc000, -1,{0xffff,0x1c9c}}, // 488, depth=1 +{0xfffff80000000003, -1,{0xffff,0x1556}}, // 489, depth=1 +{0x0000001fffffff80, 497,{0xffff,0x1e5d}}, // 490 +{0xfffffff801ffffff, -1,{0xffff,0x1775}}, // 491, depth=1 +{0x000000003f000000, 444,{0x0205,0x1a05}}, // 492, depth=2 +{0xe00000000000003f, 446,{0xffff,0x10c8}}, // 493, depth=2 +{0x0007fffffffffff8, -1,{0xffff,0x1f6f}}, // 494, depth=1 +{0xffffffc00fffffff, -1,{0xffff,0x16b5}}, // 495, depth=1 +{0x00000000000001f0, -1,{0x0704,0x1f04}}, // 496, depth=1 +{0x000003ffffff8000, -1,{0xffff,0x1c5a}}, // 497 +{0x0007fffffffffffc, -1,{0xffff,0x1fb0}}, // 498, depth=1 +{0xfffffffffff80fff, -1,{0xffff,0x1b78}}, // 499, depth=1 +{0x0007fffffffffffe, -1,{0xffff,0x1ff1}}, // 500, depth=1 +{0x00000000ff81ffff, 456,{0x0259,0xffff}}, // 501, depth=3 +{0x0008000000000000, -1,{0xffff,0x1340}}, // 502, depth=1 +{0x00000000f0003fff, -1,{0x0111,0xffff}}, // 503, depth=1 +{0x00000000000001f8, -1,{0x0745,0x1f45}}, // 504, depth=1 +{0xffffffffc0007fff, -1,{0xffff,0x18b0}}, // 505, depth=1 +{0x00003fffffffc000, -1,{0xffff,0x1c9f}}, // 506 +{0x00000000fe7fffff, -1,{0x01dd,0xffff}}, // 507, depth=1 +{0x00000000000001fc, -1,{0x0786,0x1f86}}, // 508, depth=1 +{0x00007c0000000000, 515,{0xffff,0x1584}}, // 509 +{0x0000038000000380, 460,{0xffff,0x0642}}, // 510, depth=3 +{0x00000000000001ff, 464,{0x0008,0x1008}}, // 511, depth=2 +{0x0000000000000200, -1,{0x05c0,0x1dc0}}, // 512, depth=1 +{0x800000000003ffff, 465,{0xffff,0x1052}}, // 513, depth=2 +{0x000000000001ffc0, 468,{0x068a,0x1e8a}}, // 514, depth=3 +{0x00000000000ff000, -1,{0x0507,0x1d07}}, // 515 +{0xffc00000ffffffff, -1,{0xffff,0x12a9}}, // 516 +{0xfffff8000000001f, -1,{0xffff,0x1559}}, // 517, depth=1 +{0x0000000007fffc00, -1,{0x0590,0x1d90}}, // 518, depth=1 +{0x01fffffffffffe00, -1,{0xffff,0x1def}}, // 519 +{0x0007ffffe0000000, -1,{0xffff,0x18d5}}, // 520 +{0x0fffffffffff8000, -1,{0xffff,0x1c6c}}, // 521 +{0x03ffff0003ffff00, -1,{0xffff,0x0611}}, // 522, depth=1 +{0xf800003ff800003f, 483,{0xffff,0x014a}}, // 523, depth=2 +{0x0000000007e007e0, 490,{0x02e5,0xffff}}, // 524, depth=3 +{0xfff800000007ffff, -1,{0xffff,0x135f}}, // 525, depth=1 +{0x7ffffffffe000000, 506,{0xffff,0x19e5}}, // 526, depth=2 +{0xfffffe007fffffff, -1,{0xffff,0x15f5}}, // 527, depth=1 +{0x001c0000001c0000, 509,{0xffff,0x0382}}, // 528, depth=3 +{0xc0000000000fffff, -1,{0xffff,0x1095}}, // 529 +{0x01f8000000000000, -1,{0xffff,0x1345}}, // 530 +{0xff000001ffffffff, -1,{0xffff,0x1228}}, // 531 +{0xfffffffffff000ff, -1,{0xffff,0x1b33}}, // 532 +{0x03fffffff8000000, -1,{0xffff,0x195e}}, // 533 +{0x000000000001fffe, -1,{0x07cf,0x1fcf}}, // 534 +{0xc003ffffc003ffff, -1,{0xffff,0x0093}}, // 535, depth=1 +{0x3000000000000000, -1,{0xffff,0x1101}}, // 536, depth=1 +{0xffff00000003ffff, -1,{0xffff,0x1421}}, // 537 +{0x000000001f000000, -1,{0x0204,0x1a04}}, // 538, depth=1 +{0x00000000ff01ff01, -1,{0x0228,0xffff}}, // 539, depth=1 +{0x0000001fffffffc0, -1,{0xffff,0x1e9e}}, // 540 +{0xfffffe0ffffffe0f, -1,{0xffff,0x05da}}, // 541, depth=1 +{0xfffffc0000000fff, -1,{0xffff,0x15a1}}, // 542 +{0x00000000e7e7e7e7, -1,{0x00f5,0xffff}}, // 543, depth=1 +{0x1fffffffffffc000, -1,{0xffff,0x1cae}}, // 544, depth=1 +{0xff87ff87ff87ff87, 516,{0xffff,0x026b}}, // 545, depth=2 +{0x000000000001ffe0, 519,{0x06cb,0x1ecb}}, // 546, depth=2 +{0x000000fffff00000, -1,{0xffff,0x1b13}}, // 547 +{0x0000000070007000, 520,{0x0122,0xffff}}, // 548, depth=2 +{0xfffff8000000003f, -1,{0xffff,0x155a}}, // 549, depth=1 +{0x0007ffffc0000000, -1,{0xffff,0x1894}}, // 550 +{0xf8000000003fffff, -1,{0xffff,0x115a}}, // 551, depth=1 +{0x00fffffff0000000, 521,{0xffff,0x191b}}, // 552, depth=2 +{0x00000000ffe03fff, 529,{0x02d8,0xffff}}, // 553, depth=2 +{0x0700000000000000, -1,{0xffff,0x1202}}, // 554 +{0xfc00000000003fff, -1,{0xffff,0x1193}}, // 555, depth=1 +{0x0000100000001000, 530,{0xffff,0x0500}}, // 556, depth=2 +{0xe00000000000007f, 531,{0xffff,0x10c9}}, // 557, depth=2 +{0x00003ffffc000000, -1,{0xffff,0x1993}}, // 558 +{0xffffffffffc07fff, -1,{0xffff,0x1ab8}}, // 559, depth=1 +{0x0000007ffffff800, -1,{0xffff,0x1d5b}}, // 560, depth=1 +{0xf000000000000fff, 532,{0xffff,0x110f}}, // 561, depth=2 +{0x000000000001fff0, -1,{0x070c,0x1f0c}}, // 562, depth=1 +{0xffffe000000003ff, -1,{0xffff,0x14dc}}, // 563 +{0x3ffffc0000000000, -1,{0xffff,0x1593}}, // 564, depth=1 +{0xfffffe00003fffff, -1,{0xffff,0x15ec}}, // 565, depth=1 +{0x000007fffc000000, -1,{0xffff,0x1990}}, // 566, depth=1 +{0x0003800000000000, -1,{0xffff,0x1442}}, // 567 +{0x0001fe0000000000, -1,{0xffff,0x15c7}}, // 568, depth=1 +{0xfffffffff800ffff, -1,{0xffff,0x1974}}, // 569, depth=1 +{0x000000000001fff8, -1,{0x074d,0x1f4d}}, // 570, depth=1 +{0xffe0001fffe0001f, -1,{0xffff,0x02cf}}, // 571, depth=1 +{0xfc3fffffffffffff, -1,{0xffff,0x11bb}}, // 572 +{0xfffc00ffffffffff, -1,{0xffff,0x13b5}}, // 573, depth=1 +{0x000000000001fffc, 533,{0x078e,0x1f8e}}, // 574, depth=2 +{0xffffc0000000007f, -1,{0xffff,0x1498}}, // 575, depth=1 +{0x7ffc7ffc7ffc7ffc, 534,{0xffff,0x03ac}}, // 576, depth=2 +{0x000000000001ffff, -1,{0x0010,0x1010}}, // 577, depth=1 +{0x0000000000020000, -1,{0x03c0,0x1bc0}}, // 578, depth=1 +{0xff00ffffffffffff, -1,{0xffff,0x1237}}, // 579, depth=1 +{0x0000000000020002, -1,{0x03e0,0xffff}}, // 580, depth=1 +{0x0000000fff800000, -1,{0xffff,0x1a4c}}, // 581 +{0x0000001fffffffe0, -1,{0xffff,0x1edf}}, // 582 +{0x01fffffe01fffffe, -1,{0xffff,0x07d7}}, // 583 +{0x1fc000001fc00000, -1,{0xffff,0x0286}}, // 584, depth=1 +{0xffe0000003ffffff, 537,{0xffff,0x12e4}}, // 585, depth=2 +{0xffffffff07ffffff, -1,{0xffff,0x183a}}, // 586 +{0x0000007fffffe000, -1,{0xffff,0x1cd9}}, // 587 +{0x0ffffffc0ffffffc, 540,{0xffff,0x0799}}, // 588, depth=2 +{0xffff8000000fffff, 542,{0xffff,0x1464}}, // 589, depth=2 +{0x0007c0000007c000, -1,{0xffff,0x0484}}, // 590, depth=1 +{0x0000001ffffffff8, -1,{0xffff,0x1f61}}, // 591 +{0x003ffff8003ffff8, 547,{0xffff,0x0752}}, // 592, depth=2 +{0x0000001ffffffffc, -1,{0xffff,0x1fa2}}, // 593 +{0x001f8000001f8000, 550,{0xffff,0x0445}}, // 594, depth=2 +{0xf80000001fffffff, -1,{0xffff,0x1161}}, // 595 +{0x7c007c007c007c00, 554,{0xffff,0x01a4}}, // 596, depth=2 +{0xffffffff80007fff, -1,{0xffff,0x186f}}, // 597, depth=1 +{0x0000002000000000, -1,{0xffff,0x16c0}}, // 598 +{0x00000000fe3fffff, -1,{0x01dc,0xffff}}, // 599 +{0x003c000000000000, -1,{0xffff,0x1383}}, // 600 +{0xfffffe001fffffff, -1,{0xffff,0x15f3}}, // 601 +{0x00ffffffffe00000, -1,{0xffff,0x1ae2}}, // 602, depth=1 +{0xfff0003ffff0003f, -1,{0xffff,0x0311}}, // 603 +{0x0ffffe000ffffe00, 558,{0xffff,0x05d2}}, // 604, depth=2 +{0xf80000003fffffff, 563,{0xffff,0x1162}}, // 605, depth=2 +{0x00001ffc00000000, -1,{0xffff,0x178a}}, // 606, depth=1 +{0xfffffffe0003ffff, -1,{0xffff,0x17f0}}, // 607, depth=1 +{0x003e003e003e003e, 567,{0xffff,0x03e4}}, // 608, depth=2 +{0xfffffffff1ffffff, -1,{0xffff,0x193c}}, // 609 +{0xffffffc7ffffffff, 611,{0xffff,0x16bc}}, // 610 +{0x00000000f80ff80f, -1,{0x0168,0xffff}}, // 611 +{0x0003f00000000000, -1,{0xffff,0x1505}}, // 612 +{0xfffff8000000007f, -1,{0xffff,0x155b}}, // 613, depth=1 +{0x0000000000078000, -1,{0x0443,0x1c43}}, // 614, depth=1 +{0x00000000fcfffcff, 572,{0x01ad,0xffff}}, // 615, depth=2 +{0xfffc07fffffc07ff, -1,{0xffff,0x0398}}, // 616 +{0xfc00000000000fff, -1,{0xffff,0x1191}}, // 617 +{0x0001fffc0001fffc, 581,{0xffff,0x078e}}, // 618, depth=2 +{0xfffffe003fffffff, -1,{0xffff,0x15f4}}, // 619, depth=1 +{0x003fffffffff0000, 582,{0xffff,0x1c25}}, // 620, depth=2 +{0xffc00000007fffff, -1,{0xffff,0x12a0}}, // 621, depth=1 +{0x1ffffffffc000000, -1,{0xffff,0x19a2}}, // 622, depth=1 +{0x0000001fe0000000, -1,{0xffff,0x18c7}}, // 623 +{0x003ffc00003ffc00, 583,{0xffff,0x058b}}, // 624, depth=2 +{0xffffffc7ffffffc7, 586,{0xffff,0x069c}}, // 625, depth=2 +{0x00000ffffffff800, -1,{0xffff,0x1d60}}, // 626, depth=1 +{0xfffffffc000001ff, -1,{0xffff,0x17a6}}, // 627 +{0xfffffff00007ffff, 629,{0xffff,0x172e}}, // 628 +{0xf800000000000003, -1,{0xffff,0x1146}}, // 629 +{0x03fe000003fe0000, 587,{0xffff,0x03c8}}, // 630, depth=2 +{0xfff801fffff801ff, -1,{0xffff,0x0355}}, // 631, depth=1 +{0x01ffff0001ffff00, -1,{0xffff,0x0610}}, // 632, depth=1 +{0xffffc000000000ff, -1,{0xffff,0x1499}}, // 633 +{0x0001fe000001fe00, -1,{0xffff,0x05c7}}, // 634, depth=1 +{0xffffffffff807fff, 637,{0xffff,0x1a77}}, // 635 +{0x0000001ffffffff0, -1,{0xffff,0x1f20}}, // 636, depth=1 +{0xfffc1fffffffffff, 638,{0xffff,0x13ba}}, // 637 +{0xf800000000000007, -1,{0xffff,0x1147}}, // 638 +{0xffff8003ffffffff, -1,{0xffff,0x1472}}, // 639 +{0x0ffffffff8000000, -1,{0xffff,0x1960}}, // 640 +{0xff00000000ffffff, -1,{0xffff,0x121f}}, // 641 +{0x7ffffffc7ffffffc, -1,{0xffff,0x079c}}, // 642, depth=1 +{0x00000000f0000fff, -1,{0x010f,0xffff}}, // 643, depth=1 +{0x000000000003fe00, 591,{0x05c8,0x1dc8}}, // 644, depth=2 +{0x000007ff000007ff, -1,{0xffff,0x000a}}, // 645, depth=1 +{0x00000003fffff000, -1,{0xffff,0x1d15}}, // 646, depth=1 +{0xfff80003fff80003, -1,{0xffff,0x034e}}, // 647, depth=1 +{0x0007ffffffc00000, 593,{0xffff,0x1a9c}}, // 648, depth=2 +{0xfffffdffffffffff, -1,{0xffff,0x15be}}, // 649 +{0x0000001ffffffffe, -1,{0xffff,0x1fe3}}, // 650, depth=1 +{0x0000001fffffffff, 595,{0xffff,0x1024}}, // 651, depth=2 +{0x0fc00fc00fc00fc0, 598,{0xffff,0x02a5}}, // 652, depth=2 +{0x80001fff80001fff, 599,{0xffff,0x004d}}, // 653, depth=2 +{0xfffffe0000000001, 657,{0xffff,0x15d7}}, // 654 +{0xfffe0000000001ff, -1,{0xffff,0x13d7}}, // 655, depth=1 +{0x3f803f803f803f80, -1,{0xffff,0x0266}}, // 656, depth=1 +{0xf80000000000000f, -1,{0xffff,0x1148}}, // 657 +{0x7ffffe007ffffe00, 600,{0xffff,0x05d5}}, // 658, depth=2 +{0x9fff9fff9fff9fff, -1,{0xffff,0x006d}}, // 659, depth=1 +{0xfffffe0000000003, 664,{0xffff,0x15d8}}, // 660 +{0x8000003fffffffff, -1,{0xffff,0x1066}}, // 661, depth=1 +{0x007ffffffffc0000, -1,{0xffff,0x1ba4}}, // 662, depth=1 +{0xffe0000000003fff, -1,{0xffff,0x12d8}}, // 663, depth=1 +{0xc001ffffffffffff, -1,{0xffff,0x10b2}}, // 664 +{0xfffff000000fffff, 601,{0xffff,0x1527}}, // 665, depth=2 +{0x0000003ffffe0000, -1,{0xffff,0x1bd4}}, // 666 +{0xff7fff7fff7fff7f, -1,{0xffff,0x022e}}, // 667, depth=1 +{0x00000000000fc000, -1,{0x0485,0x1c85}}, // 668, depth=1 +{0x00000000c3ffc3ff, 603,{0x00ab,0xffff}}, // 669, depth=2 +{0x3c00000000000000, -1,{0xffff,0x1183}}, // 670, depth=1 +{0xc0000003ffffffff, -1,{0xffff,0x10a3}}, // 671, depth=1 +{0xfffffe000000000f, -1,{0xffff,0x15da}}, // 672 +{0xffc000007fffffff, -1,{0xffff,0x12a8}}, // 673 +{0x0000000000007c00, -1,{0x0584,0x1d84}}, // 674, depth=1 +{0xffffff80000fffff, -1,{0xffff,0x166c}}, // 675 +{0x01fffff000000000, -1,{0xffff,0x1714}}, // 676 +{0xfffe1ffffffe1fff, 609,{0xffff,0x03db}}, // 677, depth=2 +{0x000ffff000000000, -1,{0xffff,0x170f}}, // 678, depth=1 +{0xffffff00000003ff, -1,{0xffff,0x1621}}, // 679 +{0x000003fff8000000, -1,{0xffff,0x194e}}, // 680, depth=1 +{0xf87ffffff87fffff, 610,{0xffff,0x015b}}, // 681, depth=3 +{0xfffff800000000ff, -1,{0xffff,0x155c}}, // 682 +{0xf00001ffffffffff, -1,{0xffff,0x112c}}, // 683, depth=1 +{0x0000002000000020, 612,{0xffff,0x06c0}}, // 684, depth=2 +{0xe0000000000000ff, -1,{0xffff,0x10ca}}, // 685, depth=1 +{0x0007ffff80000000, -1,{0xffff,0x1853}}, // 686, depth=1 +{0x003ffff800000000, -1,{0xffff,0x1752}}, // 687 +{0x00000000fffe7fff, -1,{0x03dd,0xffff}}, // 688 +{0xfffffffffc7fffff, -1,{0xffff,0x19bc}}, // 689 +{0x0001fffffffff000, -1,{0xffff,0x1d24}}, // 690, depth=1 +{0xfe000000001fffff, -1,{0xffff,0x11db}}, // 691, depth=1 +{0xffc00000ffc00000, -1,{0xffff,0x0289}}, // 692, depth=1 +{0x00000000ffe00fff, 616,{0x02d6,0xffff}}, // 693, depth=2 +{0x0000000f00000000, -1,{0xffff,0x1803}}, // 694, depth=1 +{0x00000000e3e3e3e3, 617,{0x00f4,0xffff}}, // 695, depth=2 +{0x00000fffffffe000, -1,{0xffff,0x1cde}}, // 696, depth=1 +{0xf7ffffffffffffff, -1,{0xffff,0x113e}}, // 697, depth=1 +{0xf800000000000000, 623,{0xffff,0x1144}}, // 698, depth=2 +{0xf800000000000001, 627,{0xffff,0x1145}}, // 699, depth=2 +{0xfffffffc0001ffff, -1,{0xffff,0x17ae}}, // 700 +{0x00000000e00003ff, 628,{0x00cc,0xffff}}, // 701, depth=3 +{0x00007ffffffff800, -1,{0xffff,0x1d63}}, // 702, depth=1 +{0xc7c7c7c7c7c7c7c7, 633,{0xffff,0x00b4}}, // 703, depth=2 +{0x001fffc000000000, -1,{0xffff,0x168e}}, // 704, depth=1 +{0xff1fffffff1fffff, 635,{0xffff,0x021c}}, // 705, depth=4 +{0xffc00000003fffff, -1,{0xffff,0x129f}}, // 706 +{0xf0001ffff0001fff, 639,{0xffff,0x0110}}, // 707, depth=2 +{0x00000000fff8fff8, 640,{0x036c,0xffff}}, // 708, depth=2 +{0x0000000f0000000f, 641,{0xffff,0x0003}}, // 709, depth=2 +{0x00007fffffffe000, 714,{0xffff,0x1ce1}}, // 710 +{0x03ff03ff03ff03ff, 649,{0xffff,0x0029}}, // 711, depth=2 +{0xfffffe0000000000, -1,{0xffff,0x15d6}}, // 712, depth=1 +{0x000000003f3f3f3f, 654,{0x0035,0xffff}}, // 713, depth=3 +{0x000000001ffc1ffc, -1,{0x03aa,0xffff}}, // 714 +{0x00000000fff8ffff, 660,{0x035c,0xffff}}, // 715, depth=3 +{0x0300030003000300, -1,{0xffff,0x0221}}, // 716, depth=1 +{0xfffffe000000003f, -1,{0xffff,0x15dc}}, // 717 +{0xffff0003ffff0003, -1,{0xffff,0x0411}}, // 718 +{0xfffffe0000000007, -1,{0xffff,0x15d9}}, // 719, depth=1 +{0x00000003ffffc000, -1,{0xffff,0x1c93}}, // 720 +{0xfffe00000001ffff, -1,{0xffff,0x13df}}, // 721, depth=1 +{0x0000000000180000, -1,{0x0341,0x1b41}}, // 722, depth=1 +{0x007ffffffffffc00, -1,{0xffff,0x1dac}}, // 723 +{0x00001ffffff00000, -1,{0xffff,0x1b18}}, // 724, depth=1 +{0xffffff83ffffff83, -1,{0xffff,0x065a}}, // 725, depth=1 +{0x000000fc000000fc, 666,{0xffff,0x0785}}, // 726, depth=2 +{0x00000000ff0001ff, 672,{0x0210,0xffff}}, // 727, depth=2 +{0xfffe001fffffffff, -1,{0xffff,0x13f3}}, // 728 +{0xf80000000000001f, 673,{0xffff,0x1149}}, // 729, depth=2 +{0x0000001fffc00000, -1,{0xffff,0x1a8e}}, // 730 +{0x0003000300030003, 675,{0xffff,0x0021}}, // 731, depth=2 +{0x07e0000007e00000, 676,{0xffff,0x02c5}}, // 732, depth=2 +{0xffff003fffffffff, -1,{0xffff,0x1435}}, // 733, depth=1 +{0x00000000ffc003ff, -1,{0x0293,0xffff}}, // 734 +{0xffe0000000000fff, -1,{0xffff,0x12d6}}, // 735 +{0xffffffc00000ffff, -1,{0xffff,0x16a9}}, // 736 +{0xffffe0000003ffff, 679,{0xffff,0x14e4}}, // 737, depth=2 +{0x3ffffffffffff800, -1,{0xffff,0x1d72}}, // 738, depth=1 +{0xffffffffe0001fff, -1,{0xffff,0x18ef}}, // 739, depth=1 +{0x01fe000001fe0000, -1,{0xffff,0x03c7}}, // 740, depth=1 +{0xfe0000000fffffff, 682,{0xffff,0x11e2}}, // 741, depth=2 +{0x0070000000000000, -1,{0xffff,0x1302}}, // 742 +{0xfffffe000000001f, -1,{0xffff,0x15db}}, // 743, depth=1 +{0x0000001fc0000000, -1,{0xffff,0x1886}}, // 744, depth=1 +{0xfff00000001fffff, -1,{0xffff,0x1320}}, // 745, depth=1 +{0x0000000000180018, 687,{0x0361,0xffff}}, // 746, depth=2 +{0x00000000c00003ff, -1,{0x008b,0xffff}}, // 747, depth=1 +{0x000fffffffffff00, -1,{0xffff,0x1e2b}}, // 748, depth=1 +{0xfffffffffff001ff, 752,{0xffff,0x1b34}}, // 749 +{0x0003ff8000000000, -1,{0xffff,0x164a}}, // 750, depth=1 +{0xc00001ffc00001ff, 688,{0xffff,0x008a}}, // 751, depth=2 +{0xfc0001ffffffffff, -1,{0xffff,0x11ae}}, // 752 +{0xe00007ffe00007ff, -1,{0xffff,0x00cd}}, // 753, depth=1 +{0xfff8007fffffffff, -1,{0xffff,0x1373}}, // 754 +{0xe000000fffffffff, -1,{0xffff,0x10e6}}, // 755, depth=1 +{0xf80000000000007f, -1,{0xffff,0x114b}}, // 756 +{0xfffc000ffffc000f, -1,{0xffff,0x0391}}, // 757, depth=1 +{0x0000fffc00000000, -1,{0xffff,0x178d}}, // 758, depth=1 +{0xffff87ffffff87ff, 689,{0xffff,0x045b}}, // 759, depth=2 +{0x0001ffffffffc000, -1,{0xffff,0x1ca2}}, // 760 +{0xf80000000000003f, -1,{0xffff,0x114a}}, // 761, depth=1 +{0xffffffffffffefff, -1,{0xffff,0x1cfe}}, // 762 +{0xffff01ffffff01ff, -1,{0xffff,0x0418}}, // 763, depth=1 +{0xfffffffffffff000, -1,{0xffff,0x1d33}}, // 764 +{0x00000000e01fe01f, 700,{0x00e7,0xffff}}, // 765, depth=2 +{0xfffffffffffff001, -1,{0xffff,0x1d34}}, // 766 +{0xc0000003c0000003, 706,{0xffff,0x0083}}, // 767, depth=2 +{0x0000000000000300, -1,{0x0601,0x1e01}}, // 768, depth=1 +{0x07ffffffffff0000, -1,{0xffff,0x1c2a}}, // 769 +{0x00001ff000001ff0, -1,{0xffff,0x0708}}, // 770, depth=1 +{0x00000000e1e1e1e1, -1,{0x00f3,0xffff}}, // 771, depth=1 +{0x000000000ff80000, 710,{0x0348,0x1b48}}, // 772, depth=3 +{0xffffc00fffffffff, -1,{0xffff,0x14b5}}, // 773, depth=1 +{0xffffffffffc01fff, 776,{0xffff,0x1ab6}}, // 774 +{0xff80000003ffffff, 717,{0xffff,0x1262}}, // 775, depth=2 +{0xfffffe000000007f, -1,{0xffff,0x15dd}}, // 776 +{0xfffffffffffff00f, 780,{0xffff,0x1d37}}, // 777 +{0x3fe0000000000000, -1,{0xffff,0x12c8}}, // 778, depth=1 +{0x00000000fc7ffc7f, 718,{0x01ac,0xffff}}, // 779, depth=2 +{0xffffff83ffffffff, -1,{0xffff,0x167a}}, // 780 +{0xffffffff00007fff, -1,{0xffff,0x182e}}, // 781, depth=1 +{0x00000003fc000000, -1,{0xffff,0x1987}}, // 782 +{0xfffff003ffffffff, -1,{0xffff,0x1535}}, // 783, depth=1 +{0xffc000001fffffff, -1,{0xffff,0x12a6}}, // 784 +{0xffffffffc0001fff, -1,{0xffff,0x18ae}}, // 785, depth=1 +{0x7ffe000000000000, 720,{0xffff,0x13cd}}, // 786, depth=2 +{0x07fc000000000000, -1,{0xffff,0x1388}}, // 787 +{0x000fffffffffff80, -1,{0xffff,0x1e6c}}, // 788 +{0xfffffffffff1ffff, -1,{0xffff,0x1b3c}}, // 789 +{0x00ff800000000000, -1,{0xffff,0x1448}}, // 790 +{0xffffffffffc007ff, 796,{0xffff,0x1ab4}}, // 791 +{0x0000003ffffffe00, -1,{0xffff,0x1ddc}}, // 792, depth=1 +{0x00000000ff01ffff, -1,{0x0218,0xffff}}, // 793, depth=1 +{0x0007ffffff800000, 723,{0xffff,0x1a5b}}, // 794, depth=2 +{0xfff000000fffffff, 728,{0xffff,0x1327}}, // 795, depth=2 +{0xf00007ffffffffff, -1,{0xffff,0x112e}}, // 796 +{0x0000007fffff8000, -1,{0xffff,0x1c57}}, // 797 +{0x000000003fe03fe0, 730,{0x02e8,0xffff}}, // 798, depth=2 +{0x00000000fdffffff, -1,{0x019e,0xffff}}, // 799, depth=1 +{0x00000000fe000000, -1,{0x01c6,0x19c6}}, // 800, depth=1 +{0x00000000fe000001, 734,{0x01c7,0xffff}}, // 801, depth=2 +{0x01ffffffffffff00, -1,{0xffff,0x1e30}}, // 802, depth=1 +{0x00000000fe000003, 735,{0x01c8,0xffff}}, // 803, depth=2 +{0xffc0000000000003, -1,{0xffff,0x128b}}, // 804 +{0x000003c000000000, -1,{0xffff,0x1683}}, // 805 +{0xfffffff9ffffffff, 810,{0xffff,0x177d}}, // 806 +{0x00000000fe000007, 736,{0x01c9,0xffff}}, // 807, depth=2 +{0x3fffffffffffe000, -1,{0xffff,0x1cf0}}, // 808, depth=1 +{0xffffffffe00007ff, -1,{0xffff,0x18ed}}, // 809, depth=1 +{0x00000000dddddddd, -1,{0x00ba,0xffff}}, // 810 +{0xfffff80fffffffff, -1,{0xffff,0x1578}}, // 811, depth=1 +{0x03ffffc000000000, -1,{0xffff,0x1693}}, // 812, depth=1 +{0xffe001ffffffffff, -1,{0xffff,0x12f3}}, // 813 +{0x07c007c007c007c0, 742,{0xffff,0x02a4}}, // 814, depth=2 +{0x00000000fe00000f, -1,{0x01ca,0xffff}}, // 815, depth=1 +{0xfe000007ffffffff, 818,{0xffff,0x11e9}}, // 816 +{0xe000000fe000000f, 749,{0xffff,0x00c6}}, // 817, depth=3 +{0x00000000fe00007f, -1,{0x01cd,0xffff}}, // 818 +{0x801f801f801f801f, -1,{0xffff,0x0065}}, // 819, depth=1 +{0x0ffc00000ffc0000, -1,{0xffff,0x0389}}, // 820, depth=1 +{0xffc000003fffffff, 754,{0xffff,0x12a7}}, // 821, depth=2 +{0x000001ffffff0000, -1,{0xffff,0x1c18}}, // 822, depth=1 +{0xffff800fffff800f, -1,{0xffff,0x0454}}, // 823, depth=1 +{0xfffe003ffffe003f, -1,{0xffff,0x03d4}}, // 824 +{0xffffff3fffffff3f, 756,{0xffff,0x061d}}, // 825, depth=2 +{0x000000007ffe7ffe, -1,{0x03ed,0xffff}}, // 826 +{0x000fffffffffffc0, -1,{0xffff,0x1ead}}, // 827 +{0x00ffc00000ffc000, -1,{0xffff,0x0489}}, // 828, depth=1 +{0xe0000000000001ff, -1,{0xffff,0x10cb}}, // 829 +{0x7ffffffc00000000, 760,{0xffff,0x179c}}, // 830, depth=2 +{0x00000000fe00001f, -1,{0x01cb,0xffff}}, // 831, depth=1 +{0x0fffffc000000000, -1,{0xffff,0x1695}}, // 832 +{0x00000000e003ffff, 762,{0x00d4,0xffff}}, // 833, depth=2 +{0x0000180000001800, 764,{0xffff,0x0541}}, // 834, depth=2 +{0xfffc0001ffffffff, 766,{0xffff,0x13ae}}, // 835, depth=2 +{0x0000001f80000000, 769,{0xffff,0x1845}}, // 836, depth=2 +{0xfffffffffffff003, -1,{0xffff,0x1d35}}, // 837, depth=1 +{0xffffffff800007ff, 840,{0xffff,0x186b}}, // 838 +{0x00000000800003ff, 774,{0x004a,0xffff}}, // 839, depth=3 +{0xf0003fffffffffff, -1,{0xffff,0x1131}}, // 840 +{0xfffffffffffff007, -1,{0xffff,0x1d36}}, // 841, depth=1 +{0x007fffe0007fffe0, -1,{0xffff,0x06d1}}, // 842, depth=1 +{0x7ffffffffff00000, -1,{0xffff,0x1b2a}}, // 843 +{0x0000000003e00000, -1,{0x02c4,0x1ac4}}, // 844, depth=1 +{0xc3c3c3c3c3c3c3c3, -1,{0xffff,0x00b3}}, // 845, depth=1 +{0xfffffffffffcffff, -1,{0xffff,0x1bbd}}, // 846 +{0x00000000dfdfdfdf, -1,{0x00b6,0xffff}}, // 847, depth=1 +{0x03fffffffffc0000, -1,{0xffff,0x1ba7}}, // 848 +{0xffffe3ffffffe3ff, 777,{0xffff,0x04dc}}, // 849, depth=3 +{0x07fffff800000000, -1,{0xffff,0x1757}}, // 850 +{0xfff87fffffffffff, -1,{0xffff,0x137b}}, // 851 +{0x001ffffffffc0000, -1,{0xffff,0x1ba2}}, // 852, depth=1 +{0xff80000000003fff, -1,{0xffff,0x1256}}, // 853, depth=1 +{0x00000001fff00000, -1,{0xffff,0x1b0c}}, // 854, depth=1 +{0xffffffffc00007ff, -1,{0xffff,0x18ac}}, // 855, depth=1 +{0x00003fc000003fc0, -1,{0xffff,0x0687}}, // 856, depth=1 +{0xfffcffffffffffff, -1,{0xffff,0x13bd}}, // 857, depth=1 +{0xffff000007ffffff, 859,{0xffff,0x142a}}, // 858 +{0xfffc0ffffffc0fff, -1,{0xffff,0x0399}}, // 859 +{0xffffffffffffc001, -1,{0xffff,0x1cb2}}, // 860 +{0x00000000fc3ffc3f, -1,{0x01ab,0xffff}}, // 861, depth=1 +{0xffffffffffffc003, -1,{0xffff,0x1cb3}}, // 862 +{0x00000000fe00003f, -1,{0x01cc,0xffff}}, // 863, depth=1 +{0x1f00000000000000, 782,{0xffff,0x1204}}, // 864, depth=2 +{0xfffffffffffff01f, -1,{0xffff,0x1d38}}, // 865, depth=1 +{0xffffffffffffc007, -1,{0xffff,0x1cb4}}, // 866 +{0x00000000fe01fe01, 784,{0x01e7,0xffff}}, // 867, depth=2 +{0x001ffffffffffc00, -1,{0xffff,0x1daa}}, // 868 +{0xffffff000003ffff, -1,{0xffff,0x1629}}, // 869, depth=1 +{0x0007ffff00000000, -1,{0xffff,0x1812}}, // 870, depth=1 +{0xffffffffff801fff, -1,{0xffff,0x1a75}}, // 871 +{0xeeeeeeeeeeeeeeee, -1,{0xffff,0x00fa}}, // 872, depth=1 +{0x00000000ffc3ffc3, -1,{0x02ab,0xffff}}, // 873, depth=1 +{0x7ffc00007ffc0000, 787,{0xffff,0x038c}}, // 874, depth=2 +{0xfffc000000ffffff, -1,{0xffff,0x13a5}}, // 875 +{0x0000fffffff00000, 788,{0xffff,0x1b1b}}, // 876, depth=2 +{0xffffffff80001fff, -1,{0xffff,0x186d}}, // 877, depth=1 +{0xfffffffe07ffffff, -1,{0xffff,0x17f9}}, // 878 +{0x00000000c003ffff, -1,{0x0093,0xffff}}, // 879, depth=1 +{0xffffffffff007fff, -1,{0xffff,0x1a36}}, // 880 +{0xffffe007ffffe007, -1,{0xffff,0x04d5}}, // 881, depth=1 +{0x000ffffc000ffffc, -1,{0xffff,0x0791}}, // 882, depth=1 +{0xfffffe1ffffffe1f, 789,{0xffff,0x05db}}, // 883, depth=2 +{0x0000001f00000000, 888,{0xffff,0x1804}}, // 884 +{0xffffe03fffffffff, -1,{0xffff,0x14f8}}, // 885, depth=1 +{0x0fff80000fff8000, 790,{0xffff,0x044c}}, // 886, depth=2 +{0xfff80fffffffffff, -1,{0xffff,0x1378}}, // 887, depth=1 +{0x00000000000003fc, -1,{0x0787,0x1f87}}, // 888 +{0xf800000fffffffff, -1,{0xffff,0x1168}}, // 889 +{0x01ffffffffffffe0, -1,{0xffff,0x1ef3}}, // 890 +{0x00ffff8000000000, 892,{0xffff,0x1650}}, // 891 +{0x07fffffc07fffffc, -1,{0xffff,0x0798}}, // 892 +{0x00000000fffe1fff, -1,{0x03db,0xffff}}, // 893 +{0xffffffffffffc03f, 901,{0xffff,0x1cb7}}, // 894 +{0xfffff07ffffff07f, -1,{0xffff,0x051a}}, // 895, depth=1 +{0x0000000000000380, -1,{0x0642,0x1e42}}, // 896, depth=1 +{0xfffffffffffff03f, -1,{0xffff,0x1d39}}, // 897, depth=1 +{0x000ffe00000ffe00, -1,{0xffff,0x05ca}}, // 898, depth=1 +{0x8000000007ffffff, -1,{0xffff,0x105b}}, // 899, depth=1 +{0x000000000003ff00, -1,{0x0609,0x1e09}}, // 900, depth=1 +{0xfffffe0fffffffff, -1,{0xffff,0x15fa}}, // 901 +{0x0003fffffff80000, -1,{0xffff,0x1b5e}}, // 902 +{0x0000003fffffff00, 911,{0xffff,0x1e1d}}, // 903 +{0x0000180000000000, -1,{0xffff,0x1541}}, // 904, depth=1 +{0xfffffffffc3fffff, -1,{0xffff,0x19bb}}, // 905, depth=1 +{0x3e3e3e3e3e3e3e3e, -1,{0xffff,0x01f4}}, // 906, depth=1 +{0xfffffffffe0003ff, -1,{0xffff,0x19f0}}, // 907, depth=1 +{0x0001fffffc000000, -1,{0xffff,0x1996}}, // 908, depth=1 +{0x8000003f8000003f, 791,{0xffff,0x0046}}, // 909, depth=3 +{0x0000000fff000000, 797,{0xffff,0x1a0b}}, // 910, depth=2 +{0x000007ffffff0000, -1,{0xffff,0x1c1a}}, // 911 +{0x01fffffffffffff8, -1,{0xffff,0x1f75}}, // 912 +{0xffbfffffffffffff, -1,{0xffff,0x127e}}, // 913, depth=1 +{0xffc0000000000000, -1,{0xffff,0x1289}}, // 914, depth=1 +{0xffc0000000000001, -1,{0xffff,0x128a}}, // 915, depth=1 +{0x0001800000018000, -1,{0xffff,0x0441}}, // 916, depth=1 +{0xfffffff9fffffff9, 804,{0xffff,0x075d}}, // 917, depth=2 +{0x0000000001f001f0, 805,{0x0324,0xffff}}, // 918, depth=2 +{0xfffffffffbffffff, -1,{0xffff,0x197e}}, // 919 +{0x00007fffffff8000, -1,{0xffff,0x1c5f}}, // 920 +{0xffc0000000000007, -1,{0xffff,0x128c}}, // 921, depth=1 +{0xfffffffffc000001, -1,{0xffff,0x19a6}}, // 922 +{0x00000fff00000fff, 806,{0xffff,0x000b}}, // 923, depth=3 +{0xffffffffff8007ff, 926,{0xffff,0x1a73}}, // 924 +{0xff000000ffffffff, 813,{0xffff,0x1227}}, // 925, depth=2 +{0xfffffffffc000003, 928,{0xffff,0x19a7}}, // 926 +{0xfc3ffc3ffc3ffc3f, 816,{0xffff,0x01ab}}, // 927, depth=3 +{0x8000000000007fff, -1,{0xffff,0x104f}}, // 928 +{0xffc000000000000f, -1,{0xffff,0x128d}}, // 929, depth=1 +{0x01ffffffffffff80, -1,{0xffff,0x1e71}}, // 930, depth=1 +{0xe007ffffffffffff, -1,{0xffff,0x10f5}}, // 931, depth=1 +{0x003ffffff0000000, -1,{0xffff,0x1919}}, // 932, depth=1 +{0x00000000ffc3ffff, 824,{0x029b,0xffff}}, // 933, depth=2 +{0x6000000060000000, 826,{0xffff,0x00c1}}, // 934, depth=2 +{0x01fffffffffffffe, 937,{0xffff,0x1ff7}}, // 935 +{0x1ffe1ffe1ffe1ffe, -1,{0xffff,0x03eb}}, // 936, depth=1 +{0x0000f80000000000, 938,{0xffff,0x1544}}, // 937 +{0x00000000001fe000, -1,{0x04c7,0x1cc7}}, // 938 +{0xfffffffffc000007, -1,{0xffff,0x19a8}}, // 939 +{0x7fff80007fff8000, 827,{0xffff,0x044f}}, // 940, depth=2 +{0xfffffcfffffffcff, 829,{0xffff,0x059d}}, // 941, depth=2 +{0x0000000e00000000, -1,{0xffff,0x17c2}}, // 942 +{0x00000000fbfffbff, -1,{0x016e,0xffff}}, // 943, depth=1 +{0x0000001fff800000, -1,{0xffff,0x1a4d}}, // 944, depth=1 +{0xffc000000000001f, -1,{0xffff,0x128e}}, // 945, depth=1 +{0x1e001e001e001e00, 832,{0xffff,0x01e3}}, // 946, depth=2 +{0x00000000ff8003ff, 838,{0x0252,0xffff}}, // 947, depth=3 +{0x000001f800000000, 843,{0xffff,0x1745}}, // 948, depth=2 +{0xfffffc01fffffc01, -1,{0xffff,0x0596}}, // 949, depth=1 +{0x0000000001fff000, -1,{0x050c,0x1d0c}}, // 950, depth=1 +{0xfffff8000001ffff, 956,{0xffff,0x1565}}, // 951 +{0x03e0000003e00000, -1,{0xffff,0x02c4}}, // 952, depth=1 +{0xf8000000000000ff, -1,{0xffff,0x114c}}, // 953, depth=1 +{0x0000000000001c00, -1,{0x0582,0x1d82}}, // 954, depth=1 +{0x00000000ff83ff83, 846,{0x026a,0xffff}}, // 955, depth=2 +{0xc01fffffc01fffff, -1,{0xffff,0x0096}}, // 956 +{0x000003fffffc0000, -1,{0xffff,0x1b97}}, // 957 +{0x00000007fff80000, -1,{0xffff,0x1b4f}}, // 958, depth=1 +{0xffffc000000001ff, -1,{0xffff,0x149a}}, // 959, depth=1 +{0x00000000000003c0, 848,{0x0683,0x1e83}}, // 960, depth=2 +{0xfffffffffffff07f, -1,{0xffff,0x1d3a}}, // 961, depth=1 +{0x00fff00000000000, 850,{0xffff,0x150b}}, // 962, depth=2 +{0xf000003ff000003f, 851,{0xffff,0x0109}}, // 963, depth=2 +{0x0000000007fe0000, -1,{0x03c9,0x1bc9}}, // 964, depth=1 +{0xfffffffffc00000f, -1,{0xffff,0x19a9}}, // 965 +{0x0000000010001000, -1,{0x0120,0xffff}}, // 966, depth=1 +{0xfffffe00000000ff, -1,{0xffff,0x15de}}, // 967, depth=1 +{0x3f80000000000000, -1,{0xffff,0x1246}}, // 968, depth=1 +{0x0000000e0000000e, -1,{0xffff,0x07c2}}, // 969 +{0x007ff000007ff000, -1,{0xffff,0x050a}}, // 970, depth=1 +{0x000000008003ffff, 858,{0x0052,0xffff}}, // 971, depth=3 +{0x000fffffffffffe0, -1,{0xffff,0x1eee}}, // 972, depth=1 +{0xffffffffffffbfff, -1,{0xffff,0x1c7e}}, // 973, depth=1 +{0xffffffffffffc000, -1,{0xffff,0x1cb1}}, // 974, depth=1 +{0xc000000001ffffff, 860,{0xffff,0x109a}}, // 975, depth=2 +{0x00000fffffff8000, -1,{0xffff,0x1c5c}}, // 976, depth=1 +{0xffc000000000003f, 862,{0xffff,0x128f}}, // 977, depth=2 +{0x0000003000000000, -1,{0xffff,0x1701}}, // 978, depth=1 +{0xfc003fffffffffff, -1,{0xffff,0x11b3}}, // 979 +{0x00003fffffff0000, -1,{0xffff,0x1c1d}}, // 980 +{0xfff00007ffffffff, 866,{0xffff,0x132e}}, // 981, depth=2 +{0x003fffffffe00000, -1,{0xffff,0x1ae0}}, // 982, depth=1 +{0x8fff8fff8fff8fff, -1,{0xffff,0x006c}}, // 983, depth=1 +{0x000000007e000000, 868,{0x01c5,0x19c5}}, // 984, depth=2 +{0x00000000f007f007, 871,{0x0126,0xffff}}, // 985, depth=2 +{0x00000000001ff800, -1,{0x0549,0x1d49}}, // 986, depth=1 +{0xbfbfbfbfbfbfbfbf, 875,{0xffff,0x0076}}, // 987, depth=2 +{0x000ffffffffffff0, -1,{0xffff,0x1f2f}}, // 988, depth=1 +{0xffffffffffffc00f, -1,{0xffff,0x1cb5}}, // 989, depth=1 +{0xfffffffffffff0ff, -1,{0xffff,0x1d3b}}, // 990 +{0x7fffc00000000000, -1,{0xffff,0x1490}}, // 991 +{0x00000000000003e0, -1,{0x06c4,0x1ec4}}, // 992, depth=1 +{0xff80000000000fff, 878,{0xffff,0x1254}}, // 993, depth=2 +{0x01ffffffffffffc0, -1,{0xffff,0x1eb2}}, // 994, depth=1 +{0x03fffffffffffc00, -1,{0xffff,0x1daf}}, // 995 +{0x000ffffffffffff8, -1,{0xffff,0x1f70}}, // 996, depth=1 +{0xfffff800000001ff, 880,{0xffff,0x155d}}, // 997, depth=2 +{0x000fffffc0000000, 1009,{0xffff,0x1895}}, // 998 +{0xffe01fffffe01fff, -1,{0xffff,0x02d7}}, // 999, depth=1 +{0x000ffffffffffffc, -1,{0xffff,0x1fb1}}, // 1000, depth=1 +{0xff000000007fffff, -1,{0xffff,0x121e}}, // 1001, depth=1 +{0x000ffffffffffffe, -1,{0xffff,0x1ff2}}, // 1002, depth=1 +{0x000fffffffffffff, -1,{0xffff,0x1033}}, // 1003, depth=1 +{0x0010000000000000, -1,{0xffff,0x1300}}, // 1004, depth=1 +{0xffffffffffffc01f, -1,{0xffff,0x1cb6}}, // 1005, depth=1 +{0x0000000000f00000, -1,{0x0303,0x1b03}}, // 1006, depth=1 +{0xe00000000001ffff, -1,{0xffff,0x10d3}}, // 1007, depth=1 +{0x00000000000003f0, -1,{0x0705,0x1f05}}, // 1008, depth=1 +{0x001e001e001e001e, -1,{0xffff,0x03e3}}, // 1009 +{0xffffc01fffffffff, -1,{0xffff,0x14b6}}, // 1010 +{0xffff800001ffffff, -1,{0xffff,0x1469}}, // 1011, depth=1 +{0x000007fe000007fe, -1,{0xffff,0x07c9}}, // 1012, depth=1 +{0xffffffffffffc07f, -1,{0xffff,0x1cb8}}, // 1013 +{0x1fffffffffff0000, -1,{0xffff,0x1c2c}}, // 1014 +{0xfe03ffffffffffff, -1,{0xffff,0x11f8}}, // 1015, depth=1 +{0x00000000000003f8, -1,{0x0746,0x1f46}}, // 1016, depth=1 +{0xffffff3fffffffff, -1,{0xffff,0x163d}}, // 1017, depth=1 +{0x0000c00000000000, -1,{0xffff,0x1481}}, // 1018, depth=1 +{0x03f0000000000000, -1,{0xffff,0x1305}}, // 1019 +{0x0000070000000700, 884,{0xffff,0x0602}}, // 1020, depth=3 +{0x0f0f0f0f0f0f0f0f, -1,{0xffff,0x0033}}, // 1021, depth=1 +{0x00000000000003fe, -1,{0x07c8,0x1fc8}}, // 1022, depth=1 +{0x00000000000003ff, 889,{0x0009,0x1009}}, // 1023, depth=2 +{0x0000000000000400, -1,{0x0580,0x1d80}}, // 1024, depth=1 +{0xffffc0000001ffff, -1,{0xffff,0x14a2}}, // 1025, depth=1 +{0x0000003000000030, 890,{0xffff,0x0701}}, // 1026, depth=2 +{0xff01ffffff01ffff, -1,{0xffff,0x0218}}, // 1027, depth=1 +{0x000000000003ff80, 891,{0x064a,0x1e4a}}, // 1028, depth=3 +{0xfffffffffc00003f, -1,{0xffff,0x19ab}}, // 1029 +{0x0000000007fffe00, -1,{0x05d1,0x1dd1}}, // 1030, depth=1 +{0xe0000fffe0000fff, 893,{0xffff,0x00ce}}, // 1031, depth=2 +{0xffffffffc007ffff, -1,{0xffff,0x18b4}}, // 1032 +{0xffffe00007ffffff, -1,{0xffff,0x14ed}}, // 1033 +{0xfffffffff8003fff, -1,{0xffff,0x1972}}, // 1034 +{0xff01ff01ff01ff01, -1,{0xffff,0x0228}}, // 1035, depth=1 +{0x000000000ffff800, -1,{0x0550,0x1d50}}, // 1036, depth=1 +{0xffff8fffffff8fff, 894,{0xffff,0x045c}}, // 1037, depth=3 +{0x00001e0000000000, -1,{0xffff,0x15c3}}, // 1038 +{0xfffffffffe03ffff, -1,{0xffff,0x19f8}}, // 1039, depth=1 +{0x000001fff0000000, -1,{0xffff,0x190c}}, // 1040 +{0xffc000000000007f, -1,{0xffff,0x1290}}, // 1041, depth=1 +{0x01fffffffffffff0, -1,{0xffff,0x1f34}}, // 1042, depth=1 +{0xfc0007ffffffffff, -1,{0xffff,0x11b0}}, // 1043, depth=1 +{0x07fffe0007fffe00, -1,{0xffff,0x05d1}}, // 1044, depth=1 +{0xc00000ffffffffff, -1,{0xffff,0x10a9}}, // 1045 +{0x0000000088888888, 902,{0x0078,0xffff}}, // 1046, depth=2 +{0xffffffe00fffffff, -1,{0xffff,0x16f6}}, // 1047 +{0x000000000fc00fc0, 903,{0x02a5,0xffff}}, // 1048, depth=3 +{0xfe003ffffe003fff, -1,{0xffff,0x01d4}}, // 1049, depth=1 +{0x000fffffe0000000, 912,{0xffff,0x18d6}}, // 1050, depth=2 +{0x0000001f0000001f, 919,{0xffff,0x0004}}, // 1051, depth=2 +{0xfffffffffc000000, 920,{0xffff,0x19a5}}, // 1052, depth=2 +{0xfe0000000000ffff, 922,{0xffff,0x11d6}}, // 1053, depth=2 +{0x01fffffffffffffc, -1,{0xffff,0x1fb6}}, // 1054, depth=1 +{0x00000000fe0000ff, 924,{0x01ce,0xffff}}, // 1055, depth=4 +{0x0038000000380000, 935,{0xffff,0x0342}}, // 1056, depth=4 +{0x01ffffffffffffff, -1,{0xffff,0x1038}}, // 1057, depth=1 +{0x0200000000000000, -1,{0xffff,0x11c0}}, // 1058, depth=1 +{0xffbfffffffbfffff, 939,{0xffff,0x025e}}, // 1059, depth=2 +{0x07fffffff0000000, -1,{0xffff,0x191e}}, // 1060 +{0xffffffff00001fff, -1,{0xffff,0x182c}}, // 1061, depth=1 +{0x01e0000001e00000, 942,{0xffff,0x02c3}}, // 1062, depth=2 +{0x800f800f800f800f, 951,{0xffff,0x0064}}, // 1063, depth=3 +{0x000fffffffc00000, -1,{0xffff,0x1a9d}}, // 1064 +{0x000000000003fffc, -1,{0x078f,0x1f8f}}, // 1065 +{0x0000007ff8000000, 957,{0xffff,0x194b}}, // 1066, depth=2 +{0x807fffff807fffff, 965,{0xffff,0x0057}}, // 1067, depth=2 +{0xfc003ffffc003fff, -1,{0xffff,0x0193}}, // 1068 +{0xfff3ffffffffffff, -1,{0xffff,0x133d}}, // 1069, depth=1 +{0xffc00000000000ff, -1,{0xffff,0x1291}}, // 1070 +{0xffffffffffc7ffff, -1,{0xffff,0x1abc}}, // 1071 +{0x6000000000000000, -1,{0xffff,0x10c1}}, // 1072, depth=1 +{0xffffffffe007ffff, -1,{0xffff,0x18f5}}, // 1073, depth=1 +{0x0000003fffffff80, -1,{0xffff,0x1e5e}}, // 1074 +{0xfffffff800ffffff, -1,{0xffff,0x1774}}, // 1075, depth=1 +{0x000000003e000000, 969,{0x01c4,0x19c4}}, // 1076, depth=2 +{0x000001ffffe00000, -1,{0xffff,0x1ad3}}, // 1077 +{0x000fffff80000000, -1,{0xffff,0x1854}}, // 1078 +{0x00000000ff83ffff, -1,{0x025a,0xffff}}, // 1079, depth=1 +{0x0e00000000000000, -1,{0xffff,0x11c2}}, // 1080 +{0xe000001fffffffff, 979,{0xffff,0x10e7}}, // 1081, depth=2 +{0x000003fffffffc00, -1,{0xffff,0x1d9f}}, // 1082 +{0xfffffffffc00001f, -1,{0xffff,0x19aa}}, // 1083, depth=1 +{0x00007ffff8000000, -1,{0xffff,0x1953}}, // 1084 +{0xffffffff8007ffff, -1,{0xffff,0x1873}}, // 1085 +{0x0007ffffff000000, 980,{0xffff,0x1a1a}}, // 1086, depth=2 +{0xfffff00001ffffff, -1,{0xffff,0x152c}}, // 1087, depth=1 +{0x3fffffffffff8000, -1,{0xffff,0x1c6e}}, // 1088, depth=1 +{0xf0000000000fffff, 990,{0xffff,0x1117}}, // 1089, depth=2 +{0x0000000001ffc000, 991,{0x048a,0x1c8a}}, // 1090, depth=2 +{0x0007000000000000, -1,{0xffff,0x1402}}, // 1091 +{0x000000000003ffc0, 995,{0x068b,0x1e8b}}, // 1092, depth=2 +{0xffffc1ffffffc1ff, -1,{0xffff,0x049a}}, // 1093 +{0x0ffffffffffc0000, -1,{0xffff,0x1ba9}}, // 1094, depth=1 +{0x00000007fffff800, -1,{0xffff,0x1d57}}, // 1095 +{0x00000000e000e000, 998,{0x00e2,0xffff}}, // 1096, depth=3 +{0xffffffe0001fffff, -1,{0xffff,0x16ef}}, // 1097, depth=1 +{0xfffffe00000001ff, 1100,{0xffff,0x15df}}, // 1098 +{0xfffc001ffffc001f, 1010,{0xffff,0x0392}}, // 1099, depth=2 +{0xfc000000000fffff, -1,{0xffff,0x1199}}, // 1100 +{0x00000000fffe07ff, 1013,{0x03d9,0xffff}}, // 1101, depth=2 +{0xffffffffffffc0ff, -1,{0xffff,0x1cb9}}, // 1102 +{0x0000001fff000000, -1,{0xffff,0x1a0c}}, // 1103 +{0x01ffffffe0000000, 1014,{0xffff,0x18db}}, // 1104, depth=2 +{0xffffc003ffffc003, -1,{0xffff,0x0493}}, // 1105 +{0x000000000fffe000, -1,{0x04ce,0x1cce}}, // 1106, depth=1 +{0xfff000000000ffff, -1,{0xffff,0x131b}}, // 1107, depth=1 +{0xffc0000fffffffff, -1,{0xffff,0x12ad}}, // 1108 +{0xff0000007fffffff, -1,{0xffff,0x1226}}, // 1109, depth=1 +{0x0000003fffffffc0, -1,{0xffff,0x1e9f}}, // 1110 +{0x0ff0000000000000, -1,{0xffff,0x1307}}, // 1111 +{0x0000200000002000, 1019,{0xffff,0x04c0}}, // 1112, depth=2 +{0xffffffffffff8fff, -1,{0xffff,0x1c7c}}, // 1113, depth=1 +{0x000c0000000c0000, -1,{0xffff,0x0381}}, // 1114, depth=1 +{0xff8001ffffffffff, 1029,{0xffff,0x1271}}, // 1115, depth=2 +{0xfff80000001fffff, -1,{0xffff,0x1361}}, // 1116 +{0xfffffc00000fffff, -1,{0xffff,0x15a9}}, // 1117, depth=1 +{0x03fffffc03fffffc, -1,{0xffff,0x0797}}, // 1118 +{0x00000000ff03ff03, 1032,{0x0229,0xffff}}, // 1119, depth=2 +{0x000000fffffff000, -1,{0xffff,0x1d1b}}, // 1120, depth=1 +{0xf07ffffff07fffff, -1,{0xffff,0x011a}}, // 1121, depth=1 +{0x000000001e000000, -1,{0x01c3,0x19c3}}, // 1122, depth=1 +{0x00000000f81fffff, 1033,{0x0159,0xffff}}, // 1123, depth=2 +{0x000000000003ffe0, -1,{0x06cc,0x1ecc}}, // 1124, depth=1 +{0xffffff0007ffffff, -1,{0xffff,0x1632}}, // 1125 +{0x000000ffffffc000, 1133,{0xffff,0x1c99}}, // 1126 +{0xffff000000007fff, -1,{0xffff,0x141e}}, // 1127, depth=1 +{0x7ffff80000000000, -1,{0xffff,0x1553}}, // 1128, depth=1 +{0xbbbbbbbbbbbbbbbb, 1034,{0xffff,0x007a}}, // 1129, depth=2 +{0x000000000f800f80, 1038,{0x0264,0xffff}}, // 1130, depth=2 +{0xffffffff000007ff, -1,{0xffff,0x182a}}, // 1131, depth=1 +{0x00000ffff8000000, -1,{0xffff,0x1950}}, // 1132, depth=1 +{0x0ffe0ffe0ffe0ffe, -1,{0xffff,0x03ea}}, // 1133 +{0x003fff80003fff80, 1040,{0xffff,0x064e}}, // 1134, depth=2 +{0xff0000ffff0000ff, -1,{0xffff,0x020f}}, // 1135, depth=1 +{0x0003fc0000000000, -1,{0xffff,0x1587}}, // 1136, depth=1 +{0xfffff81fffffffff, -1,{0xffff,0x1579}}, // 1137, depth=1 +{0xfff9fffffff9ffff, -1,{0xffff,0x035d}}, // 1138 +{0x0000000007f807f8, -1,{0x0367,0xffff}}, // 1139 +{0x000000000003fff0, -1,{0x070d,0x1f0d}}, // 1140, depth=1 +{0xf80000000001ffff, -1,{0xffff,0x1155}}, // 1141 +{0x1ffc000000000000, -1,{0xffff,0x138a}}, // 1142, depth=1 +{0xff000001ff000001, -1,{0xffff,0x0208}}, // 1143, depth=1 +{0xffffffffff001fff, -1,{0xffff,0x1a34}}, // 1144 +{0x87ff87ff87ff87ff, 1045,{0xffff,0x006b}}, // 1145, depth=2 +{0xffffe00000007fff, -1,{0xffff,0x14e1}}, // 1146 +{0xff000000003fffff, 1047,{0xffff,0x121d}}, // 1147, depth=2 +{0x000000000003fff8, 1060,{0x074e,0x1f4e}}, // 1148, depth=2 +{0xfffffffe00007fff, -1,{0xffff,0x17ed}}, // 1149, depth=1 +{0x01ffffffc0000000, 1064,{0xffff,0x189a}}, // 1150, depth=2 +{0xffe007ffffffffff, -1,{0xffff,0x12f5}}, // 1151, depth=1 +{0xfff8fff8fff8fff8, 1065,{0xffff,0x036c}}, // 1152, depth=2 +{0xffffff8001ffffff, -1,{0xffff,0x1671}}, // 1153, depth=1 +{0x000000000003fffe, -1,{0x07d0,0x1fd0}}, // 1154, depth=1 +{0x000000000003ffff, -1,{0x0011,0x1011}}, // 1155, depth=1 +{0x0000000000040000, -1,{0x0380,0x1b80}}, // 1156, depth=1 +{0x0000003ffffffff0, -1,{0xffff,0x1f21}}, // 1157 +{0xffffffc003ffffff, 1161,{0xffff,0x16b3}}, // 1158 +{0xe000001fe000001f, 1068,{0xffff,0x00c7}}, // 1159, depth=2 +{0x0000000000040004, -1,{0x03a0,0xffff}}, // 1160, depth=1 +{0xfffffe000001ffff, -1,{0xffff,0x15e7}}, // 1161 +{0xfffffff8ffffffff, -1,{0xffff,0x177c}}, // 1162 +{0xff00000000000000, -1,{0xffff,0x1207}}, // 1163 +{0x0000003ffffffff8, -1,{0xffff,0x1f62}}, // 1164 +{0xffff801fffff801f, -1,{0xffff,0x0455}}, // 1165, depth=1 +{0x007fffe000000000, -1,{0xffff,0x16d1}}, // 1166, depth=1 +{0xfffe0000000003ff, -1,{0xffff,0x13d8}}, // 1167, depth=1 +{0x3f8000003f800000, -1,{0xffff,0x0246}}, // 1168, depth=1 +{0x0000000033333333, 1070,{0x0039,0xffff}}, // 1169, depth=2 +{0x00007ff800007ff8, -1,{0xffff,0x074b}}, // 1170, depth=1 +{0x00000000f00fffff, -1,{0x0117,0xffff}}, // 1171, depth=1 +{0xfff800000fffffff, -1,{0xffff,0x1368}}, // 1172 +{0xfffff87ffffff87f, 1071,{0xffff,0x055b}}, // 1173, depth=2 +{0x000007f800000000, -1,{0xffff,0x1747}}, // 1174, depth=1 +{0x807fffffffffffff, -1,{0xffff,0x1077}}, // 1175, depth=1 +{0x1ffffff81ffffff8, 1074,{0xffff,0x0759}}, // 1176, depth=2 +{0x00000f0000000f00, -1,{0xffff,0x0603}}, // 1177 +{0x0000004000000000, -1,{0xffff,0x1680}}, // 1178 +{0xfffffffffc00007f, -1,{0xffff,0x19ac}}, // 1179, depth=1 +{0x000f8000000f8000, -1,{0xffff,0x0444}}, // 1180, depth=1 +{0xffff80ffffffffff, -1,{0xffff,0x1478}}, // 1181, depth=1 +{0xfffffffffc0000ff, -1,{0xffff,0x19ad}}, // 1182 +{0x00000000801f801f, -1,{0x0065,0xffff}}, // 1183, depth=1 +{0x007ffff0007ffff0, 1077,{0xffff,0x0712}}, // 1184, depth=2 +{0x8007800780078007, -1,{0xffff,0x0063}}, // 1185, depth=1 +{0x0000000000007e00, -1,{0x05c5,0x1dc5}}, // 1186, depth=1 +{0xf8fff8fff8fff8ff, -1,{0xffff,0x016c}}, // 1187, depth=1 +{0x003f0000003f0000, 1078,{0xffff,0x0405}}, // 1188, depth=2 +{0xffe03fffffffffff, -1,{0xffff,0x12f8}}, // 1189, depth=1 +{0xff0000000000000f, -1,{0xffff,0x120b}}, // 1190 +{0x0078000000000000, -1,{0xffff,0x1343}}, // 1191 +{0xf800f800f800f800, 1080,{0xffff,0x0164}}, // 1192, depth=2 +{0xff0000000000001f, -1,{0xffff,0x120c}}, // 1193 +{0x3fffffc03fffffc0, -1,{0xffff,0x0697}}, // 1194 +{0x7800000000000000, -1,{0xffff,0x1143}}, // 1195 +{0xff8007ffffffffff, -1,{0xffff,0x1273}}, // 1196 +{0xf800001fffffffff, 1200,{0xffff,0x1169}}, // 1197 +{0x07ffffffffe00000, 1082,{0xffff,0x1ae5}}, // 1198, depth=2 +{0xf807ffffffffffff, -1,{0xffff,0x1177}}, // 1199, depth=1 +{0x00000000fff0007f, -1,{0x0312,0xffff}}, // 1200 +{0xff0000003fffffff, -1,{0xffff,0x1225}}, // 1201, depth=1 +{0x00007c0000007c00, -1,{0xffff,0x0584}}, // 1202, depth=1 +{0xfffc0000ffffffff, -1,{0xffff,0x13ad}}, // 1203, depth=1 +{0x01ffffffffc00000, -1,{0xffff,0x1aa2}}, // 1204, depth=1 +{0x00000000ffefffef, -1,{0x02ee,0xffff}}, // 1205, depth=1 +{0x01ffffffff800000, 1210,{0xffff,0x1a61}}, // 1206 +{0xf0000003ffffffff, -1,{0xffff,0x1125}}, // 1207, depth=1 +{0x1ffffc001ffffc00, 1084,{0xffff,0x0592}}, // 1208, depth=2 +{0xf8000000000001ff, -1,{0xffff,0x114d}}, // 1209, depth=1 +{0x0000003fe0000000, -1,{0xffff,0x18c8}}, // 1210 +{0xfffffffc000003ff, 1085,{0xffff,0x17a7}}, // 1211, depth=2 +{0x00003ff800000000, -1,{0xffff,0x174a}}, // 1212, depth=1 +{0x7ffffe0000000000, -1,{0xffff,0x15d5}}, // 1213 +{0xff0000000000003f, -1,{0xffff,0x120d}}, // 1214 +{0xfffffff8007fffff, -1,{0xffff,0x1773}}, // 1215 +{0x007c007c007c007c, 1091,{0xffff,0x03a4}}, // 1216, depth=2 +{0x0007e00000000000, -1,{0xffff,0x14c5}}, // 1217 +{0xff803fffffffffff, -1,{0xffff,0x1276}}, // 1218 +{0x00000000e7ffffff, -1,{0x00dd,0xffff}}, // 1219, depth=1 +{0xfc01ffffffffffff, -1,{0xffff,0x11b6}}, // 1220 +{0x00000000ffefffff, 1093,{0x02de,0xffff}}, // 1221, depth=2 +{0x00000000fff00000, 1095,{0x030b,0x1b0b}}, // 1222, depth=2 +{0x00000000fff00001, 1098,{0x030c,0xffff}}, // 1223, depth=3 +{0x000000000fff8000, -1,{0x044c,0x1c4c}}, // 1224 +{0x00000000fff00003, -1,{0x030d,0xffff}}, // 1225, depth=1 +{0x0ffffffffffffc00, -1,{0xffff,0x1db1}}, // 1226, depth=1 +{0x80000000000007ff, -1,{0xffff,0x104b}}, // 1227 +{0x00000000000f0000, -1,{0x0403,0x1c03}}, // 1228, depth=1 +{0x00000000fff00007, 1102,{0x030e,0xffff}}, // 1229, depth=2 +{0x1ffffff800000000, -1,{0xffff,0x1759}}, // 1230, depth=1 +{0xffff000000001fff, -1,{0xffff,0x141c}}, // 1231 +{0x000007ffffe00000, -1,{0xffff,0x1ad5}}, // 1232 +{0x00fffc0000000000, -1,{0xffff,0x158d}}, // 1233 +{0xffc7ffffffffffff, 1241,{0xffff,0x12bc}}, // 1234 +{0xfffffc03ffffffff, -1,{0xffff,0x15b7}}, // 1235, depth=1 +{0x0003fff80003fff8, 1103,{0xffff,0x074e}}, // 1236, depth=2 +{0x00000000fff0000f, 1105,{0x030f,0xffff}}, // 1237, depth=2 +{0x0007fffe00000000, -1,{0xffff,0x17d1}}, // 1238, depth=1 +{0x00000000ff0003ff, 1108,{0x0211,0xffff}}, // 1239, depth=2 +{0x007ffffffffe0000, 1110,{0xffff,0x1be5}}, // 1240, depth=2 +{0x00000000fff80fff, -1,{0x0358,0xffff}}, // 1241 +{0x01ffffff80000000, -1,{0xffff,0x1859}}, // 1242, depth=1 +{0x00000000000f000f, -1,{0x0023,0xffff}}, // 1243, depth=1 +{0x3ffffffff8000000, -1,{0xffff,0x1962}}, // 1244, depth=1 +{0x0000001e0000001e, -1,{0xffff,0x07c3}}, // 1245 +{0x0000000000f000f0, 1111,{0x0323,0xffff}}, // 1246, depth=2 +{0xff0000001fffffff, 1116,{0xffff,0x1224}}, // 1247, depth=2 +{0x007ff800007ff800, 1118,{0xffff,0x054b}}, // 1248, depth=2 +{0xff0000000000007f, -1,{0xffff,0x120e}}, // 1249 +{0xfffc0000003fffff, -1,{0xffff,0x13a3}}, // 1250 +{0xf001ffffffffffff, -1,{0xffff,0x1134}}, // 1251, depth=1 +{0x00001ffffffff000, -1,{0xffff,0x1d20}}, // 1252, depth=1 +{0x00000000fff0001f, -1,{0x0310,0xffff}}, // 1253, depth=1 +{0x01ffffff00000000, -1,{0xffff,0x1818}}, // 1254 +{0xffe0003fffe0003f, 1125,{0xffff,0x02d0}}, // 1255, depth=2 +{0xfffffffe00001fff, -1,{0xffff,0x17eb}}, // 1256 +{0xfffff0ffffffffff, -1,{0xffff,0x153b}}, // 1257, depth=1 +{0x00007fc000000000, -1,{0xffff,0x1688}}, // 1258 +{0xfffe003fffffffff, 1262,{0xffff,0x13f4}}, // 1259 +{0x07fc000007fc0000, 1126,{0xffff,0x0388}}, // 1260, depth=3 +{0xfffffffff0ffffff, -1,{0xffff,0x193b}}, // 1261, depth=1 +{0x00000000fe03fe03, -1,{0x01e8,0xffff}}, // 1262 +{0x0000007ffffc0000, -1,{0xffff,0x1b94}}, // 1263 +{0x03fffe0003fffe00, -1,{0xffff,0x05d0}}, // 1264, depth=1 +{0x00000000c7ffffff, 1138,{0x009c,0xffff}}, // 1265, depth=2 +{0x003f800000000000, -1,{0xffff,0x1446}}, // 1266, depth=1 +{0xffffffe00000ffff, -1,{0xffff,0x16ea}}, // 1267 +{0x0003fc000003fc00, -1,{0xffff,0x0587}}, // 1268, depth=1 +{0xfffffffff8000fff, -1,{0xffff,0x1970}}, // 1269, depth=1 +{0x0e000e000e000e00, 1139,{0xffff,0x01e2}}, // 1270, depth=2 +{0x03ffffe000000000, -1,{0xffff,0x16d4}}, // 1271 +{0x0000003fffffffe0, -1,{0xffff,0x1ee0}}, // 1272, depth=1 +{0x1fffffffffe00000, -1,{0xffff,0x1ae7}}, // 1273 +{0xfff0fff0fff0fff0, -1,{0xffff,0x032b}}, // 1274, depth=1 +{0x00000000fff83fff, 1141,{0x035a,0xffff}}, // 1275, depth=2 +{0xfffffff00fffffff, -1,{0xffff,0x1737}}, // 1276 +{0xc0001fffffffffff, 1144,{0xffff,0x10ae}}, // 1277, depth=2 +{0xfffffff87fffffff, -1,{0xffff,0x177b}}, // 1278 +{0xfffc0000007fffff, 1146,{0xffff,0x13a4}}, // 1279, depth=2 +{0xffff0000000007ff, -1,{0xffff,0x141a}}, // 1280 +{0xfffc00003fffffff, -1,{0xffff,0x13ab}}, // 1281 +{0x0000fe0000000000, -1,{0xffff,0x15c6}}, // 1282, depth=1 +{0x3fffffc000000000, -1,{0xffff,0x1697}}, // 1283 +{0xfffffff8fffffff8, -1,{0xffff,0x075c}}, // 1284, depth=1 +{0x00000000fff0003f, -1,{0x0311,0xffff}}, // 1285, depth=1 +{0x0000000007ffff00, -1,{0x0612,0x1e12}}, // 1286, depth=1 +{0xffffffffffffc1ff, -1,{0xffff,0x1cba}}, // 1287 +{0x000000000007fc00, 1157,{0x0588,0x1d88}}, // 1288, depth=2 +{0x00000000e7ffe7ff, 1158,{0x00ed,0xffff}}, // 1289, depth=3 +{0x00000ffe00000ffe, -1,{0xffff,0x07ca}}, // 1290, depth=1 +{0xff0fffffff0fffff, 1162,{0xffff,0x021b}}, // 1291, depth=2 +{0x00000007ffffe000, -1,{0xffff,0x1cd5}}, // 1292, depth=1 +{0xfeffffffffffffff, -1,{0xffff,0x11fe}}, // 1293, depth=1 +{0x000000000f000f00, 1163,{0x0223,0xffff}}, // 1294, depth=2 +{0xff00000000000001, -1,{0xffff,0x1208}}, // 1295, depth=1 +{0x000fffffff800000, 1164,{0xffff,0x1a5c}}, // 1296, depth=2 +{0xff00000000000003, 1172,{0xffff,0x1209}}, // 1297, depth=2 +{0x0000000000700000, 1177,{0x0302,0x1b02}}, // 1298, depth=2 +{0xfffe00000003ffff, -1,{0xffff,0x13e0}}, // 1299, depth=1 +{0x0000003ffffffffc, -1,{0xffff,0x1fa3}}, // 1300, depth=1 +{0xff00000000000007, -1,{0xffff,0x120a}}, // 1301, depth=1 +{0x0000003ffffffffe, -1,{0xffff,0x1fe4}}, // 1302, depth=1 +{0x0000003fffffffff, -1,{0xffff,0x1025}}, // 1303, depth=1 +{0x1f801f801f801f80, 1178,{0xffff,0x0265}}, // 1304, depth=2 +{0x0707070707070707, -1,{0xffff,0x0032}}, // 1305, depth=1 +{0x007ffffffffffe00, -1,{0xffff,0x1ded}}, // 1306, depth=1 +{0x7fff7fff7fff7fff, 1182,{0xffff,0x002e}}, // 1307, depth=2 +{0x007ffff000000000, -1,{0xffff,0x1712}}, // 1308 +{0xffffffe7ffffffe7, 1190,{0xffff,0x06dd}}, // 1309, depth=2 +{0x0003fffffffff800, -1,{0xffff,0x1d66}}, // 1310, depth=1 +{0x00000000fe0001ff, -1,{0x01cf,0xffff}}, // 1311, depth=1 +{0x7f007f007f007f00, -1,{0xffff,0x0226}}, // 1312, depth=1 +{0xffff9fffffffffff, -1,{0xffff,0x147d}}, // 1313, depth=1 +{0x0000ffc00000ffc0, -1,{0xffff,0x0689}}, // 1314, depth=1 +{0xffe1ffffffffffff, -1,{0xffff,0x12fb}}, // 1315 +{0xfffffc00fffffc00, 1191,{0xffff,0x0595}}, // 1316, depth=2 +{0xffff00ffffff00ff, -1,{0xffff,0x0417}}, // 1317 +{0xffffffc000000fff, -1,{0xffff,0x16a5}}, // 1318 +{0xffffffffff87ffff, -1,{0xffff,0x1a7b}}, // 1319, depth=1 +{0x0000000007ffffe0, -1,{0x06d5,0x1ed5}}, // 1320 +{0xfffffff8003fffff, 1322,{0xffff,0x1772}}, // 1321 +{0xffff0001ffff0001, -1,{0xffff,0x0410}}, // 1322 +{0x00000ffffffc0000, 1327,{0xffff,0x1b99}}, // 1323 +{0x00fffffffff80000, -1,{0xffff,0x1b64}}, // 1324, depth=1 +{0x00000000c1ffc1ff, 1193,{0x00aa,0xffff}}, // 1325, depth=2 +{0x07ff800007ff8000, 1194,{0xffff,0x044b}}, // 1326, depth=2 +{0xffe0ffe0ffe0ffe0, -1,{0xffff,0x02ea}}, // 1327 +{0xfffc00001fffffff, -1,{0xffff,0x13aa}}, // 1328 +{0xfffffffffff003ff, -1,{0xffff,0x1b35}}, // 1329, depth=1 +{0x0000000007fffff0, -1,{0x0716,0x1f16}}, // 1330 +{0xffe00000000fffff, -1,{0xffff,0x12de}}, // 1331, depth=1 +{0xffffffffffff0000, 1334,{0xffff,0x1c2f}}, // 1332 +{0xffffffe7ffffffff, -1,{0xffff,0x16fd}}, // 1333, depth=1 +{0x0000000007fffff8, -1,{0x0757,0x1f57}}, // 1334 +{0x8000000000001fff, -1,{0xffff,0x104d}}, // 1335, depth=1 +{0x00000000001f8000, -1,{0x0445,0x1c45}}, // 1336, depth=1 +{0xffc007ffffc007ff, -1,{0xffff,0x0294}}, // 1337, depth=1 +{0x000000fffc000000, -1,{0xffff,0x198d}}, // 1338, depth=1 +{0xffffffffffff0001, -1,{0xffff,0x1c30}}, // 1339 +{0x000e000e000e000e, 1195,{0xffff,0x03e2}}, // 1340, depth=2 +{0xfc000003ffffffff, 1196,{0xffff,0x11a7}}, // 1341, depth=2 +{0x003ff00000000000, -1,{0xffff,0x1509}}, // 1342, depth=1 +{0xfffffffc0003ffff, -1,{0xffff,0x17af}}, // 1343, depth=1 +{0x03fffffffffe0000, -1,{0xffff,0x1be8}}, // 1344 +{0xfffffffffffff1ff, -1,{0xffff,0x1d3c}}, // 1345, depth=1 +{0x00000003ffff0000, -1,{0xffff,0x1c11}}, // 1346, depth=1 +{0xffffffffff0007ff, -1,{0xffff,0x1a32}}, // 1347, depth=1 +{0x000000000000f800, -1,{0x0544,0x1d44}}, // 1348, depth=1 +{0xf0fff0fff0fff0ff, 1197,{0xffff,0x012b}}, // 1349, depth=3 +{0x0000000080808080, 1206,{0x0070,0xffff}}, // 1350, depth=3 +{0x0000000007fffffe, -1,{0x07d9,0x1fd9}}, // 1351 +{0x000000001ffe1ffe, -1,{0x03eb,0xffff}}, // 1352, depth=1 +{0xffffffffffff0007, -1,{0xffff,0x1c32}}, // 1353 +{0xf000f000f000f000, 1213,{0xffff,0x0123}}, // 1354, depth=2 +{0xcfffffffcfffffff, -1,{0xffff,0x009d}}, // 1355, depth=1 +{0x001fffe000000000, -1,{0xffff,0x16cf}}, // 1356, depth=1 +{0x0000000087ffffff, 1214,{0x005b,0xffff}}, // 1357, depth=2 +{0x01fffffc01fffffc, -1,{0xffff,0x0796}}, // 1358, depth=1 +{0x0000ffffffffc000, 1361,{0xffff,0x1ca1}}, // 1359 +{0x000007fff0000000, -1,{0xffff,0x190e}}, // 1360, depth=1 +{0x000000003ff83ff8, -1,{0x036a,0xffff}}, // 1361 +{0xffffffffffff000f, -1,{0xffff,0x1c33}}, // 1362 +{0xfffffe1fffffffff, -1,{0xffff,0x15fb}}, // 1363, depth=1 +{0xffffe00000001fff, -1,{0xffff,0x14df}}, // 1364 +{0x801fffffffffffff, -1,{0xffff,0x1075}}, // 1365, depth=1 +{0xffffffffffff001f, -1,{0xffff,0x1c34}}, // 1366 +{0xffffffc000003fff, 1215,{0xffff,0x16a7}}, // 1367, depth=2 +{0x0000004000000040, 1217,{0xffff,0x0680}}, // 1368, depth=2 +{0xfffffff83fffffff, -1,{0xffff,0x177a}}, // 1369 +{0x00000fc000000000, -1,{0xffff,0x1685}}, // 1370, depth=1 +{0x00000000ff03ffff, -1,{0x0219,0xffff}}, // 1371, depth=1 +{0x000fffff00000000, -1,{0xffff,0x1813}}, // 1372, depth=1 +{0xfff800fffff800ff, -1,{0xffff,0x0354}}, // 1373, depth=1 +{0x01fffe0001fffe00, -1,{0xffff,0x05cf}}, // 1374, depth=1 +{0x00000000e0007fff, -1,{0x00d1,0xffff}}, // 1375, depth=1 +{0x000003e000000000, 1378,{0xffff,0x16c4}}, // 1376 +{0x00000000fe01ffff, -1,{0x01d7,0xffff}}, // 1377, depth=1 +{0x0000000000007f80, -1,{0x0647,0x1e47}}, // 1378 +{0xf8003ffff8003fff, 1218,{0xffff,0x0152}}, // 1379, depth=2 +{0x0003ffffffffe000, -1,{0xffff,0x1ce4}}, // 1380, depth=1 +{0xfff80001fff80001, -1,{0xffff,0x034d}}, // 1381, depth=1 +{0x00000001fffff000, -1,{0xffff,0x1d14}}, // 1382, depth=1 +{0x00000000fcffffff, -1,{0x019d,0xffff}}, // 1383, depth=1 +{0x00000007ffff8000, -1,{0xffff,0x1c53}}, // 1384 +{0xc001ffffc001ffff, 1220,{0xffff,0x0092}}, // 1385, depth=2 +{0x8888888888888888, 1224,{0xffff,0x0078}}, // 1386, depth=2 +{0xfffc00007fffffff, -1,{0xffff,0x13ac}}, // 1387, depth=1 +{0x0000001e00000000, -1,{0xffff,0x17c3}}, // 1388, depth=1 +{0xfffc000000000007, -1,{0xffff,0x1390}}, // 1389 +{0x0001ffffffff0000, -1,{0xffff,0x1c20}}, // 1390, depth=1 +{0xffffff81ffffffff, -1,{0xffff,0x1679}}, // 1391 +{0x00001fffffffc000, -1,{0xffff,0x1c9e}}, // 1392, depth=1 +{0xfffc00000000000f, -1,{0xffff,0x1391}}, // 1393 +{0x00fffffffffff800, -1,{0xffff,0x1d6c}}, // 1394 +{0xffffffff0007ffff, -1,{0xffff,0x1832}}, // 1395, depth=1 +{0x0000003fc0000000, -1,{0xffff,0x1887}}, // 1396, depth=1 +{0xffff9fffffff9fff, -1,{0xffff,0x045d}}, // 1397 +{0x00003ffff0000000, -1,{0xffff,0x1911}}, // 1398, depth=1 +{0x0000003fff800000, -1,{0xffff,0x1a4e}}, // 1399 +{0xffffc0000003ffff, -1,{0xffff,0x14a3}}, // 1400 +{0xffc0000fffc0000f, -1,{0xffff,0x028d}}, // 1401, depth=1 +{0x1f0000001f000000, -1,{0xffff,0x0204}}, // 1402, depth=1 +{0xfffffff81fffffff, -1,{0xffff,0x1779}}, // 1403 +{0x0000fffffffff000, -1,{0xffff,0x1d23}}, // 1404, depth=1 +{0xfffff3fffffff3ff, 1227,{0xffff,0x051d}}, // 1405, depth=2 +{0x000000007ff00000, -1,{0x030a,0x1b0a}}, // 1406, depth=1 +{0xc0000001ffffffff, 1231,{0xffff,0x10a2}}, // 1407, depth=2 +{0x003fff8000000000, -1,{0xffff,0x164e}}, // 1408, depth=1 +{0x0000fffffc000000, -1,{0xffff,0x1995}}, // 1409 +{0x0000000000700070, 1232,{0x0322,0xffff}}, // 1410, depth=2 +{0xffffff0000007fff, -1,{0xffff,0x1626}}, // 1411, depth=1 +{0x00e0000000000000, -1,{0xffff,0x12c2}}, // 1412 +{0xfffffffffc01ffff, -1,{0xffff,0x19b6}}, // 1413 +{0x0000000007ffff80, 1233,{0x0653,0x1e53}}, // 1414, depth=2 +{0xfc1ffc1ffc1ffc1f, 1234,{0xffff,0x01aa}}, // 1415, depth=3 +{0x1ffffffff0000000, -1,{0xffff,0x1920}}, // 1416, depth=1 +{0xff800003ffffffff, -1,{0xffff,0x126a}}, // 1417 +{0x000000000000e000, 1245,{0x04c2,0x1cc2}}, // 1418, depth=2 +{0xff3fff3fff3fff3f, -1,{0xffff,0x022d}}, // 1419 +{0x00000ffffffffc00, -1,{0xffff,0x1da1}}, // 1420 +{0x00000000c0007fff, 1249,{0x0090,0xffff}}, // 1421, depth=2 +{0x07fe07fe07fe07fe, -1,{0xffff,0x03e9}}, // 1422, depth=1 +{0xfffffff0001fffff, -1,{0xffff,0x1730}}, // 1423, depth=1 +{0xffff03ffffffffff, -1,{0xffff,0x1439}}, // 1424 +{0xffc00000000001ff, 1250,{0xffff,0x1292}}, // 1425, depth=2 +{0x000000007e7e7e7e, 1254,{0x01f5,0xffff}}, // 1426, depth=2 +{0xfffffffffffc0fff, -1,{0xffff,0x1bb9}}, // 1427 +{0x00ffffffffffe000, -1,{0xffff,0x1cea}}, // 1428 +{0xc000ffffffffffff, 1256,{0xffff,0x10b1}}, // 1429, depth=2 +{0x001ffffffffe0000, -1,{0xffff,0x1be3}}, // 1430, depth=1 +{0xfffffff7ffffffff, -1,{0xffff,0x173e}}, // 1431 +{0x0600060006000600, -1,{0xffff,0x01e1}}, // 1432, depth=1 +{0xe00fffffffffffff, -1,{0xffff,0x10f6}}, // 1433, depth=1 +{0x0003ffffffff8000, -1,{0xffff,0x1c62}}, // 1434 +{0xffffffffffff007f, -1,{0xffff,0x1c36}}, // 1435 +{0xfffffff800000007, -1,{0xffff,0x175f}}, // 1436 +{0xfffff007fffff007, -1,{0xffff,0x0516}}, // 1437, depth=1 +{0x0007fffffe000000, -1,{0xffff,0x19d9}}, // 1438 +{0xfffff00000ffffff, -1,{0xffff,0x152b}}, // 1439 +{0x0ffffffffffe0000, -1,{0xffff,0x1bea}}, // 1440 +{0xfe3fffffffffffff, -1,{0xffff,0x11fc}}, // 1441 +{0x0000000000007f00, -1,{0x0606,0x1e06}}, // 1442, depth=1 +{0xffff8001ffffffff, -1,{0xffff,0x1471}}, // 1443, depth=1 +{0x0000000000300000, -1,{0x0301,0x1b01}}, // 1444, depth=1 +{0xfffffff80000000f, -1,{0xffff,0x1760}}, // 1445 +{0x0007ffc00007ffc0, 1258,{0xffff,0x068c}}, // 1446, depth=2 +{0x0303030303030303, 1259,{0xffff,0x0031}}, // 1447, depth=3 +{0x00003fffffe00000, -1,{0xffff,0x1ad8}}, // 1448, depth=1 +{0xffe00003ffffffff, -1,{0xffff,0x12ec}}, // 1449, depth=1 +{0x0000003fffc00000, -1,{0xffff,0x1a8f}}, // 1450, depth=1 +{0x000000007f807f80, -1,{0x0267,0xffff}}, // 1451 +{0x000001f8000001f8, 1263,{0xffff,0x0745}}, // 1452, depth=2 +{0xe0000000000003ff, -1,{0xffff,0x10cc}}, // 1453, depth=1 +{0x001ffff000000000, -1,{0xffff,0x1710}}, // 1454 +{0x00000000cfcfcfcf, -1,{0x00b5,0xffff}}, // 1455, depth=1 +{0xff81ffffffffffff, -1,{0xffff,0x1279}}, // 1456 +{0x007fffffffffff80, -1,{0xffff,0x1e6f}}, // 1457 +{0xfffffff80000001f, -1,{0xffff,0x1761}}, // 1458 +{0xffffff81ffffff81, 1267,{0xffff,0x0659}}, // 1459, depth=2 +{0x7ffffffffc000000, -1,{0xffff,0x19a4}}, // 1460 +{0xfffffffffff3ffff, -1,{0xffff,0x1b3d}}, // 1461, depth=1 +{0x0006000600060006, -1,{0xffff,0x03e1}}, // 1462, depth=1 +{0xfffffffff03fffff, -1,{0xffff,0x1939}}, // 1463 +{0x0fc000000fc00000, 1271,{0xffff,0x0285}}, // 1464, depth=2 +{0xf80fffffffffffff, -1,{0xffff,0x1178}}, // 1465 +{0x0000000000001e00, 1273,{0x05c3,0x1dc3}}, // 1466, depth=2 +{0x0001fffff0000000, -1,{0xffff,0x1914}}, // 1467 +{0x000f000000000000, -1,{0xffff,0x1403}}, // 1468 +{0x00000007f8000000, -1,{0xffff,0x1947}}, // 1469 +{0x00001ffffc000000, -1,{0xffff,0x1992}}, // 1470, depth=1 +{0xffffc000000003ff, -1,{0xffff,0x149b}}, // 1471, depth=1 +{0xe000003fffffffff, -1,{0xffff,0x10e8}}, // 1472 +{0x83ffffffffffffff, 1276,{0xffff,0x107a}}, // 1473, depth=2 +{0xfffffe00000003ff, -1,{0xffff,0x15e0}}, // 1474 +{0x00000000ffc07fff, 1278,{0x0298,0xffff}}, // 1475, depth=2 +{0x7ffffffffffff000, -1,{0xffff,0x1d32}}, // 1476, depth=1 +{0x00000000fff000ff, 1280,{0x0313,0xffff}}, // 1477, depth=2 +{0x0000000007ffffc0, -1,{0x0694,0x1e94}}, // 1478, depth=1 +{0x00001fff00001fff, 1281,{0xffff,0x000c}}, // 1479, depth=2 +{0x03fc000003fc0000, -1,{0xffff,0x0387}}, // 1480, depth=1 +{0x000ffffe00000000, -1,{0xffff,0x17d2}}, // 1481 +{0x07ff800000000000, 1283,{0xffff,0x144b}}, // 1482, depth=2 +{0xfff80007ffffffff, -1,{0xffff,0x136f}}, // 1483, depth=1 +{0x0ff8000000000000, -1,{0xffff,0x1348}}, // 1484 +{0x00000000f800ffff, 1287,{0x0154,0xffff}}, // 1485, depth=2 +{0x00000000ffffefff, -1,{0x04de,0xffff}}, // 1486 +{0xe1ffffffffffffff, -1,{0xffff,0x10fb}}, // 1487, depth=1 +{0x0000003f80000000, -1,{0xffff,0x1846}}, // 1488, depth=1 +{0x1fff800000000000, -1,{0xffff,0x144d}}, // 1489 +{0xffffc03fffffffff, -1,{0xffff,0x14b7}}, // 1490 +{0xffc000000001ffff, -1,{0xffff,0x129a}}, // 1491, depth=1 +{0x0000000000300030, 1308,{0x0321,0xffff}}, // 1492, depth=2 +{0xc00000ffc00000ff, 1315,{0xffff,0x0089}}, // 1493, depth=2 +{0x0000000ffe000000, -1,{0xffff,0x19ca}}, // 1494, depth=1 +{0x001fffffffffff00, -1,{0xffff,0x1e2c}}, // 1495 +{0x001ffffffffffe00, -1,{0xffff,0x1deb}}, // 1496, depth=1 +{0xffe0000001ffffff, 1503,{0xffff,0x12e3}}, // 1497 +{0x000000003ff00000, -1,{0x0309,0x1b09}}, // 1498, depth=1 +{0xfffffffe000007ff, -1,{0xffff,0x17e9}}, // 1499, depth=1 +{0x0007ff0000000000, -1,{0xffff,0x160a}}, // 1500, depth=1 +{0xc0000001c0000001, -1,{0xffff,0x0082}}, // 1501, depth=1 +{0x000000007c7c7c7c, -1,{0x01b4,0xffff}}, // 1502, depth=1 +{0xfe00000000000fff, -1,{0xffff,0x11d2}}, // 1503 +{0xf9ffffffffffffff, -1,{0xffff,0x117d}}, // 1504 +{0x0000000003ff03ff, 1317,{0x0029,0xffff}}, // 1505, depth=2 +{0x0018000000000000, -1,{0xffff,0x1341}}, // 1506, depth=1 +{0xfe00fffffe00ffff, 1318,{0xffff,0x01d6}}, // 1507, depth=2 +{0x3ffffffffffffc00, -1,{0xffff,0x1db3}}, // 1508 +{0xfffff800000003ff, -1,{0xffff,0x155e}}, // 1509, depth=1 +{0xff000000ff000000, 1320,{0xffff,0x0207}}, // 1510, depth=2 +{0xf000000001ffffff, -1,{0xffff,0x111c}}, // 1511, depth=1 +{0x00000000fffff00f, -1,{0x0517,0xffff}}, // 1512 +{0x0000000080007fff, 1321,{0x004f,0xffff}}, // 1513, depth=3 +{0x0000000080008000, -1,{0x0060,0xffff}}, // 1514, depth=1 +{0xfffffffffffc3fff, -1,{0xffff,0x1bbb}}, // 1515, depth=1 +{0x0001fff800000000, -1,{0xffff,0x174d}}, // 1516, depth=1 +{0x01ff000000000000, -1,{0xffff,0x1408}}, // 1517 +{0x7fc000007fc00000, 1323,{0xffff,0x0288}}, // 1518, depth=3 +{0xfffff001ffffffff, -1,{0xffff,0x1534}}, // 1519, depth=1 +{0x00000000fffff01f, -1,{0x0518,0xffff}}, // 1520 +{0xff800000000fffff, -1,{0xffff,0x125c}}, // 1521, depth=1 +{0x00000001ffffc000, -1,{0xffff,0x1c92}}, // 1522, depth=1 +{0x00000000fc01fc01, -1,{0x01a6,0xffff}}, // 1523, depth=1 +{0xfffffff00000ffff, -1,{0xffff,0x172b}}, // 1524 +{0xfff03ffffff03fff, 1328,{0xffff,0x0319}}, // 1525, depth=2 +{0x0080000000800000, 1330,{0xffff,0x0240}}, // 1526, depth=2 +{0xfffc1ffffffc1fff, -1,{0xffff,0x039a}}, // 1527, depth=1 +{0xffffffffffff00ff, 1529,{0xffff,0x1c37}}, // 1528 +{0xfffff83fffffffff, -1,{0xffff,0x157a}}, // 1529 +{0x03fffff000000000, -1,{0xffff,0x1715}}, // 1530 +{0x01fffffe00000000, -1,{0xffff,0x17d7}}, // 1531 +{0xffffffffe01fffff, 1543,{0xffff,0x18f7}}, // 1532 +{0xfffffffffffeffff, -1,{0xffff,0x1bfe}}, // 1533, depth=1 +{0x0000000000fff000, 1332,{0x050b,0x1d0b}}, // 1534, depth=3 +{0xfe00000003ffffff, 1339,{0xffff,0x11e0}}, // 1535, depth=2 +{0x0000000000000600, -1,{0x05c1,0x1dc1}}, // 1536, depth=1 +{0xffffffffffff0003, -1,{0xffff,0x1c31}}, // 1537, depth=1 +{0x0000000007fffffc, 1344,{0x0798,0x1f98}}, // 1538, depth=2 +{0xfffffc0001ffffff, -1,{0xffff,0x15ae}}, // 1539, depth=1 +{0x00003fe000003fe0, 1351,{0xffff,0x06c8}}, // 1540, depth=2 +{0x0000000007ffffff, 1353,{0x001a,0x101a}}, // 1541, depth=2 +{0x0000000008000000, -1,{0x0140,0x1940}}, // 1542, depth=1 +{0xff07ffffffffffff, -1,{0xffff,0x123a}}, // 1543 +{0x000000001ff00000, 1359,{0x0308,0x1b08}}, // 1544, depth=3 +{0x007ffffffffffff8, -1,{0xffff,0x1f73}}, // 1545 +{0x03ff800003ff8000, -1,{0xffff,0x044a}}, // 1546, depth=1 +{0xf0001fffffffffff, -1,{0xffff,0x1130}}, // 1547 +{0x007ffffffffffffe, -1,{0xffff,0x1ff5}}, // 1548 +{0xff000000000000ff, 1362,{0xffff,0x120f}}, // 1549, depth=2 +{0x007fffffffffffff, -1,{0xffff,0x1036}}, // 1550 +{0x000000ffffff0000, -1,{0xffff,0x1c17}}, // 1551 +{0x1ffff00000000000, 1554,{0xffff,0x1510}}, // 1552 +{0xfffffffff07fffff, -1,{0xffff,0x193a}}, // 1553, depth=1 +{0xffffff80ffffff80, -1,{0xffff,0x0658}}, // 1554 +{0x0000078000000000, -1,{0xffff,0x1643}}, // 1555 +{0x7fc0000000000000, -1,{0xffff,0x1288}}, // 1556, depth=1 +{0xffffffffc01fffff, -1,{0xffff,0x18b6}}, // 1557 +{0x07fff00000000000, -1,{0xffff,0x150e}}, // 1558, depth=1 +{0xc000000000ffffff, 1364,{0xffff,0x1099}}, // 1559, depth=2 +{0xfffffffff0000000, -1,{0xffff,0x1923}}, // 1560 +{0xfe00007ffe00007f, -1,{0xffff,0x01cd}}, // 1561, depth=1 +{0x007fffffffffff00, -1,{0xffff,0x1e2e}}, // 1562, depth=1 +{0xfffffffffc0001ff, -1,{0xffff,0x19ae}}, // 1563, depth=1 +{0xfffffffff0000003, -1,{0xffff,0x1925}}, // 1564 +{0xffc0001fffffffff, 1366,{0xffff,0x12ae}}, // 1565, depth=2 +{0x0000000003f80000, -1,{0x0346,0x1b46}}, // 1566, depth=1 +{0xfffffe3ffffffe3f, 1369,{0xffff,0x05dc}}, // 1567, depth=2 +{0xfffffffff0000007, -1,{0xffff,0x1926}}, // 1568 +{0xfffffffffe001fff, -1,{0xffff,0x19f3}}, // 1569 +{0x0000e0000000e000, 1376,{0xffff,0x04c2}}, // 1570, depth=3 +{0xfffbffffffffffff, -1,{0xffff,0x137e}}, // 1571, depth=1 +{0xfffc000000000000, 1384,{0xffff,0x138d}}, // 1572, depth=2 +{0xfffc000000000001, -1,{0xffff,0x138e}}, // 1573, depth=1 +{0x01fc01fc01fc01fc, -1,{0xffff,0x03a6}}, // 1574, depth=1 +{0xfffc000000000003, -1,{0xffff,0x138f}}, // 1575, depth=1 +{0x00000000fffcfffc, -1,{0x03ad,0xffff}}, // 1576 +{0xff0000000001ffff, -1,{0xffff,0x1218}}, // 1577 +{0xfffffffff000001f, 1580,{0xffff,0x1928}}, // 1578 +{0x800003ffffffffff, 1389,{0xffff,0x106a}}, // 1579, depth=2 +{0x00000000fffff07f, -1,{0x051a,0xffff}}, // 1580 +{0xfffffffffe007fff, -1,{0xffff,0x19f5}}, // 1581, depth=1 +{0x3fffe0003fffe000, -1,{0xffff,0x04d0}}, // 1582, depth=1 +{0x000003c0000003c0, -1,{0xffff,0x0683}}, // 1583 +{0x0000007ffffffc00, -1,{0xffff,0x1d9c}}, // 1584, depth=1 +{0xe00000000003ffff, 1391,{0xffff,0x10d4}}, // 1585, depth=2 +{0x001fffffffffff80, -1,{0xffff,0x1e6d}}, // 1586 +{0xe0001fffe0001fff, 1393,{0xffff,0x00cf}}, // 1587, depth=2 +{0x000fffffff000000, 1394,{0xffff,0x1a1b}}, // 1588, depth=2 +{0xfff0000003ffffff, -1,{0xffff,0x1325}}, // 1589, depth=1 +{0x01fc000001fc0000, -1,{0xffff,0x0386}}, // 1590, depth=1 +{0xfffff000ffffffff, -1,{0xffff,0x1533}}, // 1591 +{0xffffffffcfffffff, 1601,{0xffff,0x18bd}}, // 1592 +{0x00000000f1ffffff, 1397,{0x011c,0xffff}}, // 1593, depth=2 +{0x00007ffffffc0000, -1,{0xffff,0x1b9c}}, // 1594, depth=1 +{0xffff800000ffffff, -1,{0xffff,0x1468}}, // 1595, depth=1 +{0x000000007fc07fc0, 1399,{0x02a8,0xffff}}, // 1596, depth=2 +{0xffffffffffff003f, -1,{0xffff,0x1c35}}, // 1597, depth=1 +{0x0fffffe000000000, -1,{0xffff,0x16d6}}, // 1598, depth=1 +{0x00000000f9fff9ff, -1,{0x016d,0xffff}}, // 1599, depth=1 +{0x00000001fc000000, -1,{0xffff,0x1986}}, // 1600, depth=1 +{0x00000000ffffc001, -1,{0x0492,0xffff}}, // 1601 +{0x1fffff8000000000, -1,{0xffff,0x1655}}, // 1602 +{0xfffc00000000001f, 1400,{0xffff,0x1392}}, // 1603, depth=2 +{0x03fffffffffffe00, -1,{0xffff,0x1df0}}, // 1604, depth=1 +{0xffffe0000007ffff, 1606,{0xffff,0x14e5}}, // 1605 +{0x00000000ffffc003, 1608,{0x0493,0xffff}}, // 1606 +{0x8fffffffffffffff, -1,{0xffff,0x107c}}, // 1607, depth=1 +{0xfdfdfdfdfdfdfdfd, -1,{0xffff,0x01b6}}, // 1608 +{0xfff800000000ffff, -1,{0xffff,0x135c}}, // 1609, depth=1 +{0x0000018000000000, -1,{0xffff,0x1641}}, // 1610, depth=1 +{0xffffffffff07ffff, -1,{0xffff,0x1a3a}}, // 1611, depth=1 +{0xffffffffffe00000, -1,{0xffff,0x1aea}}, // 1612 +{0xfe00000000003fff, 1403,{0xffff,0x11d4}}, // 1613, depth=2 +{0x03f8000000000000, -1,{0xffff,0x1346}}, // 1614, depth=1 +{0xffc00fffffc00fff, -1,{0xffff,0x0295}}, // 1615, depth=1 +{0x7fffffffffffc000, -1,{0xffff,0x1cb0}}, // 1616, depth=1 +{0xfc00fffffc00ffff, -1,{0xffff,0x0195}}, // 1617, depth=1 +{0xffffffffffe00001, 1620,{0xffff,0x1aeb}}, // 1618 +{0xff00000fffffffff, -1,{0xffff,0x122b}}, // 1619, depth=1 +{0xfffc000fffffffff, -1,{0xffff,0x13b1}}, // 1620 +{0x00000000ff807fff, -1,{0x0257,0xffff}}, // 1621, depth=1 +{0x000000000e000e00, 1409,{0x01e2,0xffff}}, // 1622, depth=2 +{0xffffffffffe00003, -1,{0xffff,0x1aec}}, // 1623 +{0x07ffff8000000000, -1,{0xffff,0x1653}}, // 1624, depth=1 +{0x0000000003ffe000, -1,{0x04cc,0x1ccc}}, // 1625 +{0xffffffffffe00007, -1,{0xffff,0x1aed}}, // 1626 +{0x000001fffff80000, -1,{0xffff,0x1b55}}, // 1627 +{0x0f800f800f800f80, 1412,{0xffff,0x0264}}, // 1628, depth=2 +{0xffffe000000007ff, 1413,{0xffff,0x14dd}}, // 1629, depth=2 +{0x3ffffffffffc0000, -1,{0xffff,0x1bab}}, // 1630, depth=1 +{0xffffffffffe0000f, -1,{0xffff,0x1aee}}, // 1631 +{0x07fffffffff80000, -1,{0xffff,0x1b67}}, // 1632 +{0xffe000ffffffffff, -1,{0xffff,0x12f2}}, // 1633 +{0x0000000000007fc0, -1,{0x0688,0x1e88}}, // 1634, depth=1 +{0xfffc00000000003f, -1,{0xffff,0x1393}}, // 1635, depth=1 +{0x0ffffff000000000, -1,{0xffff,0x1717}}, // 1636 +{0xff807fffff807fff, -1,{0xffff,0x0257}}, // 1637, depth=1 +{0xffffffffffe0001f, -1,{0xffff,0x1aef}}, // 1638 +{0xfe07fffffe07ffff, 1417,{0xffff,0x01d9}}, // 1639, depth=2 +{0x1ff800001ff80000, -1,{0xffff,0x0349}}, // 1640, depth=1 +{0xfffff8000003ffff, -1,{0xffff,0x1566}}, // 1641, depth=1 +{0x01ffffffff000000, -1,{0xffff,0x1a20}}, // 1642, depth=1 +{0x5555555555555555, 1419,{0xffff,0x003c}}, // 1643, depth=2 +{0x000003fffffe0000, -1,{0xffff,0x1bd8}}, // 1644, depth=1 +{0xfc00000001ffffff, -1,{0xffff,0x119e}}, // 1645, depth=1 +{0x003fc000003fc000, -1,{0xffff,0x0487}}, // 1646, depth=1 +{0xfff001ffffffffff, -1,{0xffff,0x1334}}, // 1647 +{0xff80000001ffffff, -1,{0xffff,0x1261}}, // 1648 +{0xc00fffffc00fffff, -1,{0xffff,0x0095}}, // 1649, depth=1 +{0x0000000001ff0000, 1420,{0x0408,0x1c08}}, // 1650, depth=2 +{0xfffffff7fffffff7, 1424,{0xffff,0x071e}}, // 1651, depth=2 +{0x000000f800000000, 1657,{0xffff,0x1744}}, // 1652 +{0x00000000c0ffc0ff, -1,{0x00a9,0xffff}}, // 1653, depth=1 +{0x0000000078787878, -1,{0x0173,0xffff}}, // 1654, depth=1 +{0x00000000e0001fff, 1427,{0x00cf,0xffff}}, // 1655, depth=2 +{0x01ff800001ff8000, -1,{0xffff,0x0449}}, // 1656, depth=1 +{0x0000000000001fe0, -1,{0x06c7,0x1ec7}}, // 1657 +{0x00000003f0000000, 1428,{0xffff,0x1905}}, // 1658, depth=2 +{0xfc0ffc0ffc0ffc0f, 1431,{0xffff,0x01a9}}, // 1659, depth=2 +{0xfffffff800000000, 1434,{0xffff,0x175c}}, // 1660, depth=2 +{0xfffffff800000001, 1435,{0xffff,0x175d}}, // 1661, depth=2 +{0xfc001fffffffffff, -1,{0xffff,0x11b2}}, // 1662 +{0xfffffff800000003, -1,{0xffff,0x175e}}, // 1663, depth=1 +{0xffffff80ffffffff, -1,{0xffff,0x1678}}, // 1664 +{0xffffffffffe0003f, -1,{0xffff,0x1af0}}, // 1665 +{0x0000000000007fe0, -1,{0x06c9,0x1ec9}}, // 1666, depth=1 +{0xfff0000000003fff, 1436,{0xffff,0x1319}}, // 1667, depth=2 +{0x0000300000003000, -1,{0xffff,0x0501}}, // 1668, depth=1 +{0x800000000007ffff, -1,{0xffff,0x1053}}, // 1669, depth=1 +{0x8080808080808080, 1438,{0xffff,0x0070}}, // 1670, depth=2 +{0xfc00007ffc00007f, 1439,{0xffff,0x018c}}, // 1671, depth=2 +{0x0000003f00000000, 1440,{0xffff,0x1805}}, // 1672, depth=2 +{0xe0ffe0ffe0ffe0ff, 1441,{0xffff,0x00ea}}, // 1673, depth=2 +{0x0000000000ffc000, -1,{0x0489,0x1c89}}, // 1674, depth=1 +{0x00000000fc7fffff, 1445,{0x019c,0xffff}}, // 1675, depth=2 +{0xfffff000007fffff, -1,{0xffff,0x152a}}, // 1676 +{0xf000ffffffffffff, -1,{0xffff,0x1133}}, // 1677 +{0xe000e000e000e000, 1451,{0xffff,0x00e2}}, // 1678, depth=2 +{0x000003ffffffff00, -1,{0xffff,0x1e21}}, // 1679 +{0x003ffffffffff800, -1,{0xffff,0x1d6a}}, // 1680 +{0xf00000ffffffffff, -1,{0xffff,0x112b}}, // 1681, depth=1 +{0x0000000000007ff0, 1454,{0x070a,0x1f0a}}, // 1682, depth=2 +{0xfffffbfffffffbff, 1456,{0xffff,0x055e}}, // 1683, depth=2 +{0x00ffffc000ffffc0, -1,{0xffff,0x0691}}, // 1684, depth=1 +{0xfffe000007ffffff, -1,{0xffff,0x13e9}}, // 1685, depth=1 +{0x00000000fc000001, -1,{0x0186,0xffff}}, // 1686 +{0xfffffc01ffffffff, 1689,{0xffff,0x15b6}}, // 1687 +{0x0000000007c00000, -1,{0x0284,0x1a84}}, // 1688, depth=1 +{0xe000000007ffffff, 1692,{0xffff,0x10dd}}, // 1689 +{0x0000000000007ff8, 1457,{0x074b,0x1f4b}}, // 1690, depth=2 +{0xffffff0000001fff, 1458,{0xffff,0x1624}}, // 1691, depth=2 +{0xffffc001ffffc001, 1693,{0xffff,0x0492}}, // 1692 +{0x00000000ff8007ff, -1,{0x0253,0xffff}}, // 1693 +{0x0000000000007ffc, 1460,{0x078c,0x1f8c}}, // 1694, depth=2 +{0x0007fffc00000000, -1,{0xffff,0x1790}}, // 1695 +{0x0000000000007ffe, -1,{0x07cd,0x1fcd}}, // 1696, depth=1 +{0x0000000000007fff, -1,{0x000e,0x100e}}, // 1697, depth=1 +{0x0000000000008000, -1,{0x0440,0x1c40}}, // 1698, depth=1 +{0xfffc00000000007f, 1463,{0xffff,0x1394}}, // 1699, depth=2 +{0x001fffffffffffe0, -1,{0xffff,0x1eef}}, // 1700 +{0x00000000c0001fff, 1465,{0x008e,0xffff}}, // 1701, depth=2 +{0x0007e0000007e000, 1467,{0xffff,0x04c5}}, // 1702, depth=2 +{0xff83ffffff83ffff, -1,{0xffff,0x025a}}, // 1703, depth=1 +{0x003ffffffff80000, -1,{0xffff,0x1b62}}, // 1704, depth=1 +{0xffffffff8fffffff, 1706,{0xffff,0x187c}}, // 1705 +{0xfff0fffffff0ffff, -1,{0xffff,0x031b}}, // 1706 +{0x0000000087ff87ff, -1,{0x006b,0xffff}}, // 1707, depth=1 +{0x00000003ffe00000, -1,{0xffff,0x1acc}}, // 1708, depth=1 +{0xfffffcffffffffff, -1,{0xffff,0x15bd}}, // 1709, depth=1 +{0x000003fffffffe00, -1,{0xffff,0x1de0}}, // 1710, depth=1 +{0xfcfffffffcffffff, -1,{0xffff,0x019d}}, // 1711 +{0x00007f8000007f80, -1,{0xffff,0x0647}}, // 1712, depth=1 +{0xffffc00007ffffff, -1,{0xffff,0x14ac}}, // 1713 +{0x0fffffffffffff00, -1,{0xffff,0x1e33}}, // 1714 +{0xfffff807fffff807, -1,{0xffff,0x0557}}, // 1715, depth=1 +{0xffffffffffffc3ff, -1,{0xffff,0x1cbb}}, // 1716 +{0xf800003fffffffff, -1,{0xffff,0x116a}}, // 1717 +{0x1fffff801fffff80, 1468,{0xffff,0x0655}}, // 1718, depth=2 +{0x007fffff80000000, -1,{0xffff,0x1857}}, // 1719 +{0x00000000fffff0ff, -1,{0x051b,0xffff}}, // 1720 +{0xf8000000000003ff, -1,{0xffff,0x114e}}, // 1721, depth=1 +{0x0000000000001f00, -1,{0x0604,0x1e04}}, // 1722, depth=1 +{0xfffffff80000003f, -1,{0xffff,0x1762}}, // 1723, depth=1 +{0x001ffffffffffffe, -1,{0xffff,0x1ff3}}, // 1724 +{0x00000000e00007ff, -1,{0x00cd,0xffff}}, // 1725, depth=1 +{0x00007ffffffffc00, -1,{0xffff,0x1da4}}, // 1726, depth=1 +{0x07fffc0000000000, 1730,{0xffff,0x1590}}, // 1727 +{0x3e00000000000000, 1469,{0xffff,0x11c4}}, // 1728, depth=2 +{0xfffffffc07ffffff, -1,{0xffff,0x17b8}}, // 1729, depth=1 +{0x3fffffe03fffffe0, -1,{0xffff,0x06d8}}, // 1730 +{0x00000000f01ff01f, -1,{0x0128,0xffff}}, // 1731, depth=1 +{0xfffffe3fffffffff, -1,{0xffff,0x15fc}}, // 1732 +{0x00000000fff001ff, 1472,{0x0314,0xffff}}, // 1733, depth=2 +{0x0000000000060000, -1,{0x03c1,0x1bc1}}, // 1734, depth=1 +{0x0000003f0000003f, 1474,{0xffff,0x0005}}, // 1735, depth=2 +{0xffffff000007ffff, -1,{0xffff,0x162a}}, // 1736 +{0xffffff8000ffffff, -1,{0xffff,0x1670}}, // 1737, depth=1 +{0x0ffffffffffffe00, -1,{0xffff,0x1df2}}, // 1738, depth=1 +{0xffffff80007fffff, -1,{0xffff,0x166f}}, // 1739 +{0x0000000000060006, 1481,{0x03e1,0xffff}}, // 1740, depth=2 +{0xffff00000007ffff, -1,{0xffff,0x1422}}, // 1741, depth=1 +{0x80000fffffffffff, -1,{0xffff,0x106c}}, // 1742 +{0xffc0001fffc0001f, -1,{0xffff,0x028e}}, // 1743, depth=1 +{0xffff8000003fffff, -1,{0xffff,0x1466}}, // 1744 +{0xffffffc0000fffff, 1747,{0xffff,0x16ad}}, // 1745 +{0x000007fc000007fc, -1,{0xffff,0x0788}}, // 1746, depth=1 +{0xf9f9f9f9f9f9f9f9, -1,{0xffff,0x0175}}, // 1747 +{0xfff80000fff80000, 1484,{0xffff,0x034c}}, // 1748, depth=2 +{0xfc07fffffc07ffff, 1486,{0xffff,0x0198}}, // 1749, depth=2 +{0x00000000fffff000, 1489,{0x0513,0x1d13}}, // 1750, depth=2 +{0x00000000fffff001, 1490,{0x0514,0xffff}}, // 1751, depth=2 +{0x0001ffffffe00000, 1495,{0xffff,0x1adb}}, // 1752, depth=2 +{0x00000000fffff003, 1497,{0x0515,0xffff}}, // 1753, depth=3 +{0x007fffffffffffc0, -1,{0xffff,0x1eb0}}, // 1754, depth=1 +{0x00000000ffc01fff, 1504,{0x0296,0xffff}}, // 1755, depth=2 +{0xffff007fffffffff, -1,{0xffff,0x1436}}, // 1756 +{0x00000000fffff007, -1,{0x0516,0xffff}}, // 1757, depth=1 +{0x0000003e00000000, 1760,{0xffff,0x17c4}}, // 1758 +{0x00000000c7c7c7c7, -1,{0x00b4,0xffff}}, // 1759, depth=1 +{0x00000000000007f8, -1,{0x0747,0x1f47}}, // 1760 +{0xffffff00000007ff, -1,{0xffff,0x1622}}, // 1761, depth=1 +{0x0000060000000600, 1508,{0xffff,0x05c1}}, // 1762, depth=2 +{0xfffffffe0007ffff, -1,{0xffff,0x17f1}}, // 1763, depth=1 +{0x001ffff8001ffff8, -1,{0xffff,0x0751}}, // 1764, depth=1 +{0x80003fff80003fff, 1512,{0xffff,0x004e}}, // 1765, depth=2 +{0xffffffffffff01ff, -1,{0xffff,0x1c38}}, // 1766 +{0x03ffffffffffffc0, -1,{0xffff,0x1eb3}}, // 1767 +{0x001fffffe0000000, -1,{0xffff,0x18d7}}, // 1768 +{0x01ffff0000000000, 1770,{0xffff,0x1610}}, // 1769 +{0x0ffffff80ffffff8, -1,{0xffff,0x0758}}, // 1770 +{0x00000000c00007ff, -1,{0x008c,0xffff}}, // 1771, depth=1 +{0x1fff00001fff0000, 1517,{0xffff,0x040c}}, // 1772, depth=2 +{0xfffff0007fffffff, -1,{0xffff,0x1532}}, // 1773 +{0xfff8000003ffffff, -1,{0xffff,0x1366}}, // 1774 +{0xc0000000ffffffff, -1,{0xffff,0x10a1}}, // 1775, depth=1 +{0xfffffffffffe3fff, -1,{0xffff,0x1bfc}}, // 1776 +{0x000003ffffffff80, -1,{0xffff,0x1e62}}, // 1777 +{0x0003ff800003ff80, -1,{0xffff,0x064a}}, // 1778, depth=1 +{0xf000000000ffffff, -1,{0xffff,0x111b}}, // 1779 +{0x0000007ffffffe00, 1784,{0xffff,0x1ddd}}, // 1780 +{0xfc07fc07fc07fc07, 1520,{0xffff,0x01a8}}, // 1781, depth=2 +{0x3ff0000000000000, -1,{0xffff,0x1309}}, // 1782, depth=1 +{0xfffc003ffffc003f, -1,{0xffff,0x0393}}, // 1783, depth=1 +{0x00000ffffffe0000, -1,{0xffff,0x1bda}}, // 1784 +{0x00000000fff1fff1, 1524,{0x032c,0xffff}}, // 1785, depth=2 +{0x007fffffffffffe0, -1,{0xffff,0x1ef1}}, // 1786, depth=1 +{0xfffffff80000007f, -1,{0xffff,0x1763}}, // 1787, depth=1 +{0x03fffffffffffff0, -1,{0xffff,0x1f35}}, // 1788 +{0xfffe3ffffffe3fff, 1528,{0xffff,0x03dc}}, // 1789, depth=3 +{0x0780078007800780, 1530,{0xffff,0x0263}}, // 1790, depth=2 +{0xfffffffff00000ff, -1,{0xffff,0x192b}}, // 1791 +{0x0000000000000700, -1,{0x0602,0x1e02}}, // 1792, depth=1 +{0x0000000080001fff, -1,{0x004d,0xffff}}, // 1793, depth=1 +{0x003ffc0000000000, 1531,{0xffff,0x158b}}, // 1794, depth=2 +{0xc7ffffffc7ffffff, 1532,{0xffff,0x009c}}, // 1795, depth=3 +{0x001ffc00001ffc00, -1,{0xffff,0x058a}}, // 1796, depth=1 +{0xfffffffff80fffff, -1,{0xffff,0x1978}}, // 1797, depth=1 +{0x0000000c00000000, -1,{0xffff,0x1781}}, // 1798, depth=1 +{0x00000000fff1ffff, -1,{0x031c,0xffff}}, // 1799, depth=1 +{0x000000000007fe00, -1,{0x05c9,0x1dc9}}, // 1800, depth=1 +{0xffff0fffffffffff, 1804,{0xffff,0x143b}}, // 1801 +{0x007ffffffffffff0, -1,{0xffff,0x1f32}}, // 1802, depth=1 +{0xffffe3ffffffffff, -1,{0xffff,0x14fc}}, // 1803, depth=1 +{0xfe000007fe000007, -1,{0xffff,0x01c9}}, // 1804 +{0xff000000000001ff, -1,{0xffff,0x1210}}, // 1805, depth=1 +{0x007fffffff800000, -1,{0xffff,0x1a5f}}, // 1806 +{0xfff0000000000fff, -1,{0xffff,0x1317}}, // 1807, depth=1 +{0x0000300000000000, -1,{0xffff,0x1501}}, // 1808, depth=1 +{0x03fffffffffffffc, 1822,{0xffff,0x1fb7}}, // 1809 +{0x0000000c0000000c, 1545,{0xffff,0x0781}}, // 1810, depth=2 +{0xffff8000ffffffff, -1,{0xffff,0x1470}}, // 1811, depth=1 +{0x7c7c7c7c7c7c7c7c, -1,{0xffff,0x01b4}}, // 1812, depth=1 +{0x00000000fffff03f, 1547,{0x0519,0xffff}}, // 1813, depth=2 +{0x007ffffffffffffc, -1,{0xffff,0x1fb4}}, // 1814, depth=1 +{0xfc0000ffffffffff, -1,{0xffff,0x11ad}}, // 1815, depth=1 +{0x0003fffff8000000, 1548,{0xffff,0x1956}}, // 1816, depth=2 +{0x00000000c07fc07f, 1550,{0x00a8,0xffff}}, // 1817, depth=2 +{0x0080000000000000, -1,{0xffff,0x1240}}, // 1818, depth=1 +{0xf0003ffff0003fff, -1,{0xffff,0x0111}}, // 1819, depth=1 +{0x0000001ffe000000, 1551,{0xffff,0x19cb}}, // 1820, depth=2 +{0x00000000fc3fffff, -1,{0x019b,0xffff}}, // 1821, depth=1 +{0x0001f00000000000, 1824,{0xffff,0x1504}}, // 1822 +{0x00000000fe0003ff, -1,{0x01d0,0xffff}}, // 1823, depth=1 +{0x00000000003fc000, -1,{0x0487,0x1c87}}, // 1824 +{0x00000000ffc007ff, -1,{0x0294,0xffff}}, // 1825, depth=1 +{0x00000000007ff000, 1552,{0x050a,0x1d0a}}, // 1826, depth=3 +{0xfffc0000000000ff, -1,{0xffff,0x1395}}, // 1827, depth=1 +{0x03fffffffffffffe, -1,{0xffff,0x1ff8}}, // 1828 +{0x03ffffffffffffff, 1831,{0xffff,0x1039}}, // 1829 +{0x0000000003fff800, -1,{0x054e,0x1d4e}}, // 1830, depth=1 +{0xfff7fffffff7ffff, -1,{0xffff,0x031e}}, // 1831 +{0x0003000000030000, -1,{0xffff,0x0401}}, // 1832, depth=1 +{0xfffffc0000ffffff, -1,{0xffff,0x15ad}}, // 1833 +{0x0000000007800000, -1,{0x0243,0x1a43}}, // 1834, depth=1 +{0x0000001c00000000, -1,{0xffff,0x1782}}, // 1835 +{0x0000000003e003e0, 1555,{0x02e4,0xffff}}, // 1836, depth=2 +{0xf800fffff800ffff, -1,{0xffff,0x0154}}, // 1837, depth=1 +{0x0000f0000000f000, -1,{0xffff,0x0503}}, // 1838 +{0xe000000000007fff, -1,{0xffff,0x10d1}}, // 1839 +{0x000007fffff80000, -1,{0xffff,0x1b57}}, // 1840 +{0xfffe000000007fff, 1557,{0xffff,0x13dd}}, // 1841, depth=2 +{0x000000007f007f00, -1,{0x0226,0xffff}}, // 1842, depth=1 +{0xe000003fe000003f, -1,{0xffff,0x00c8}}, // 1843, depth=1 +{0xffffc00000007fff, 1848,{0xffff,0x14a0}}, // 1844 +{0xffffffffefffffff, -1,{0xffff,0x18fe}}, // 1845, depth=1 +{0x00001ffe00001ffe, 1560,{0xffff,0x07cb}}, // 1846, depth=2 +{0xfffffffff0000001, -1,{0xffff,0x1924}}, // 1847, depth=1 +{0xc000000000000001, -1,{0xffff,0x1082}}, // 1848 +{0xffff803fffff803f, 1564,{0xffff,0x0456}}, // 1849, depth=2 +{0x0000000000001f80, -1,{0x0645,0x1e45}}, // 1850, depth=1 +{0xc0000000007fffff, -1,{0xffff,0x1098}}, // 1851, depth=1 +{0xffffffffffe000ff, -1,{0xffff,0x1af2}}, // 1852 +{0xf80000000003ffff, 1568,{0xffff,0x1156}}, // 1853, depth=2 +{0x00001f0000001f00, -1,{0xffff,0x0604}}, // 1854, depth=1 +{0x0000001c0000001c, -1,{0xffff,0x0782}}, // 1855 +{0xfff007ffffffffff, -1,{0xffff,0x1336}}, // 1856 +{0xfffffffffffff3ff, -1,{0xffff,0x1d3d}}, // 1857, depth=1 +{0xffffffe000000fff, -1,{0xffff,0x16e6}}, // 1858 +{0x00000ffffffffe00, -1,{0xffff,0x1de2}}, // 1859 +{0x03ffffffffffff00, -1,{0xffff,0x1e31}}, // 1860, depth=1 +{0xfffffffff000000f, 1569,{0xffff,0x1927}}, // 1861, depth=2 +{0x000001fffffff800, 1865,{0xffff,0x1d5d}}, // 1862 +{0x00000000800007ff, -1,{0x004b,0xffff}}, // 1863, depth=1 +{0x007fffffe0000000, -1,{0xffff,0x18d9}}, // 1864, depth=1 +{0x00003ffffff80000, -1,{0xffff,0x1b5a}}, // 1865 +{0xfffffff8000001ff, -1,{0xffff,0x1765}}, // 1866 +{0xfffffe000003ffff, -1,{0xffff,0x15e8}}, // 1867, depth=1 +{0xc0000000c0000000, 1576,{0xffff,0x0081}}, // 1868, depth=2 +{0x00007ffffffe0000, -1,{0xffff,0x1bdd}}, // 1869 +{0x000fe00000000000, -1,{0xffff,0x14c6}}, // 1870, depth=1 +{0x00000000fffcffff, 1577,{0x039d,0xffff}}, // 1871, depth=2 +{0x3ffc3ffc3ffc3ffc, -1,{0xffff,0x03ab}}, // 1872, depth=1 +{0xffffff80003fffff, -1,{0xffff,0x166e}}, // 1873 +{0x00003f8000000000, -1,{0xffff,0x1646}}, // 1874, depth=1 +{0xfe0001ffffffffff, -1,{0xffff,0x11ef}}, // 1875, depth=1 +{0xffff800000000000, -1,{0xffff,0x1450}}, // 1876 +{0xfefffffffeffffff, 1578,{0xffff,0x01de}}, // 1877, depth=3 +{0x00000000001c0000, 1583,{0x0382,0x1b82}}, // 1878, depth=2 +{0xffff800000000001, -1,{0xffff,0x1451}}, // 1879 +{0xffff0000ffff0000, 1586,{0xffff,0x040f}}, // 1880, depth=2 +{0xfffff80000007fff, -1,{0xffff,0x1563}}, // 1881 +{0x00003ff000003ff0, -1,{0xffff,0x0709}}, // 1882, depth=1 +{0xfffbfffbfffbfffb, -1,{0xffff,0x036e}}, // 1883, depth=1 +{0x07fffffffffff800, -1,{0xffff,0x1d6f}}, // 1884 +{0xfffffffc00007fff, -1,{0xffff,0x17ac}}, // 1885, depth=1 +{0xffe00001ffffffff, -1,{0xffff,0x12eb}}, // 1886 +{0xffff8000007fffff, 1591,{0xffff,0x1467}}, // 1887, depth=2 +{0x0000003fff000000, -1,{0xffff,0x1a0d}}, // 1888, depth=1 +{0x00000000ffffbfff, -1,{0x045e,0xffff}}, // 1889, depth=1 +{0x00000000ffffc000, -1,{0x0491,0x1c91}}, // 1890, depth=1 +{0xf800007ff800007f, 1592,{0xffff,0x014b}}, // 1891, depth=3 +{0x3c003c003c003c00, 1602,{0xffff,0x01a3}}, // 1892, depth=2 +{0x007fffff007fffff, 1605,{0xffff,0x0016}}, // 1893, depth=4 +{0x0fffffffffffffc0, -1,{0xffff,0x1eb5}}, // 1894 +{0xffffffffffdfffff, -1,{0xffff,0x1abe}}, // 1895, depth=1 +{0x000003f000000000, 1612,{0xffff,0x1705}}, // 1896, depth=2 +{0x00000000ffffc007, 1618,{0x0494,0xffff}}, // 1897, depth=3 +{0x001fffff80000000, -1,{0xffff,0x1855}}, // 1898 +{0x00000000c03fc03f, 1623,{0x00a7,0xffff}}, // 1899, depth=2 +{0x2222222222222222, 1625,{0xffff,0x00f8}}, // 1900, depth=2 +{0x00000000ff801fff, -1,{0x0255,0xffff}}, // 1901, depth=1 +{0xfff03fffffffffff, 1907,{0xffff,0x1339}}, // 1902 +{0xfbfffbfffbfffbff, 1626,{0xffff,0x016e}}, // 1903, depth=2 +{0x07c0000007c00000, -1,{0xffff,0x0284}}, // 1904, depth=1 +{0x00000000ffffc00f, -1,{0x0495,0xffff}}, // 1905, depth=1 +{0x00000000001c001c, 1627,{0x03a2,0xffff}}, // 1906, depth=2 +{0xffffff7fffffff7f, -1,{0xffff,0x061e}}, // 1907 +{0x0000000000003800, -1,{0x0542,0x1d42}}, // 1908, depth=1 +{0xfffffffff000003f, -1,{0xffff,0x1929}}, // 1909, depth=1 +{0x007fffffc0000000, -1,{0xffff,0x1898}}, // 1910, depth=1 +{0x00000000c3c3c3c3, 1631,{0x00b3,0xffff}}, // 1911, depth=2 +{0xfffffffffe07ffff, -1,{0xffff,0x19f9}}, // 1912 +{0x00000000ff007fff, -1,{0x0216,0xffff}}, // 1913, depth=1 +{0x0000000000001fc0, -1,{0x0686,0x1e86}}, // 1914, depth=1 +{0xfffffff8000000ff, -1,{0xffff,0x1764}}, // 1915, depth=1 +{0x0000000ffff00000, -1,{0xffff,0x1b0f}}, // 1916, depth=1 +{0xffcfffffffffffff, -1,{0xffff,0x12bd}}, // 1917, depth=1 +{0xfffffffffc03ffff, 1922,{0xffff,0x19b7}}, // 1918 +{0xff8001ffff8001ff, -1,{0xffff,0x0251}}, // 1919, depth=1 +{0x0000000000000780, 1632,{0x0643,0x1e43}}, // 1920, depth=2 +{0x00000000ffffc01f, -1,{0x0496,0xffff}}, // 1921, depth=1 +{0xffe0ffffffffffff, 1925,{0xffff,0x12fa}}, // 1922 +{0xf803f803f803f803, 1633,{0xffff,0x0166}}, // 1923, depth=2 +{0x01ffe00000000000, 1636,{0xffff,0x14cb}}, // 1924, depth=2 +{0xc00000000000003f, -1,{0xffff,0x1087}}, // 1925 +{0x3ffffffffffe0000, -1,{0xffff,0x1bec}}, // 1926 +{0x00000000f8fff8ff, 1638,{0x016c,0xffff}}, // 1927, depth=2 +{0x000000000ffc0000, -1,{0x0389,0x1b89}}, // 1928, depth=1 +{0x000000001f1f1f1f, 1647,{0x0034,0xffff}}, // 1929, depth=2 +{0x0006000000000000, -1,{0xffff,0x13c1}}, // 1930, depth=1 +{0xfffffffffe0007ff, -1,{0xffff,0x19f1}}, // 1931, depth=1 +{0x0000000020002000, -1,{0x00e0,0xffff}}, // 1932, depth=1 +{0xffffffff801fffff, -1,{0xffff,0x1875}}, // 1933, depth=1 +{0x000000007ffff000, -1,{0x0512,0x1d12}}, // 1934, depth=1 +{0xff800003ff800003, -1,{0xffff,0x024a}}, // 1935, depth=1 +{0x7f00000000000000, -1,{0xffff,0x1206}}, // 1936, depth=1 +{0xffc00000000003ff, -1,{0xffff,0x1293}}, // 1937, depth=1 +{0x00ffffffffff8000, -1,{0xffff,0x1c68}}, // 1938, depth=1 +{0x000003fffffffff8, -1,{0xffff,0x1f66}}, // 1939 +{0x00ffe00000ffe000, -1,{0xffff,0x04ca}}, // 1940, depth=1 +{0xffffffe003ffffff, -1,{0xffff,0x16f4}}, // 1941, depth=1 +{0x000003fffffffffc, -1,{0xffff,0x1fa7}}, // 1942 +{0xf0000001ffffffff, 1648,{0xffff,0x1124}}, // 1943, depth=2 +{0x001fffffffffffc0, -1,{0xffff,0x1eae}}, // 1944, depth=1 +{0xff00001fffffffff, -1,{0xffff,0x122c}}, // 1945, depth=1 +{0x0000380000003800, 1652,{0xffff,0x0542}}, // 1946, depth=3 +{0x007f007f007f007f, 1662,{0xffff,0x0026}}, // 1947, depth=2 +{0xfffffffff9ffffff, -1,{0xffff,0x197d}}, // 1948 +{0xfffc001fffffffff, 1950,{0xffff,0x13b2}}, // 1949 +{0x00000000fc0000ff, -1,{0x018d,0xffff}}, // 1950 +{0x07e0000000000000, -1,{0xffff,0x12c5}}, // 1951 +{0x00001fffffff0000, -1,{0xffff,0x1c1c}}, // 1952, depth=1 +{0x00000000ffffc03f, 1664,{0x0497,0xffff}}, // 1953, depth=2 +{0x7878787878787878, -1,{0xffff,0x0173}}, // 1954, depth=1 +{0x00000000fe03ffff, -1,{0x01d8,0xffff}}, // 1955, depth=1 +{0x0000006000000000, -1,{0xffff,0x16c1}}, // 1956, depth=1 +{0xffffff803fffffff, -1,{0xffff,0x1676}}, // 1957 +{0x0000000070707070, -1,{0x0132,0xffff}}, // 1958, depth=1 +{0xc00000007fffffff, 1665,{0xffff,0x10a0}}, // 1959, depth=2 +{0x0000fff800000000, -1,{0xffff,0x174c}}, // 1960 +{0x0ffffffffffffff0, 1979,{0xffff,0x1f37}}, // 1961 +{0x0000000000001ff0, -1,{0x0708,0x1f08}}, // 1962, depth=1 +{0xffffc0ffffffc0ff, 1676,{0xffff,0x0499}}, // 1963, depth=2 +{0x007fffffffc00000, -1,{0xffff,0x1aa0}}, // 1964, depth=1 +{0x8000007fffffffff, 1677,{0xffff,0x1067}}, // 1965, depth=2 +{0x00000000007fc000, 1679,{0x0488,0x1c88}}, // 1966, depth=2 +{0x00000000fbffffff, -1,{0x015e,0xffff}}, // 1967, depth=1 +{0x00000000fc000000, 1680,{0x0185,0x1985}}, // 1968, depth=2 +{0xf807fffff807ffff, 1686,{0xffff,0x0157}}, // 1969, depth=2 +{0x0000000000001ff8, -1,{0x0749,0x1f49}}, // 1970, depth=1 +{0x00000000fc000003, 1687,{0x0187,0xffff}}, // 1971, depth=5 +{0x00000000003ff000, -1,{0x0509,0x1d09}}, // 1972, depth=1 +{0xfffffffff000007f, -1,{0xffff,0x192a}}, // 1973, depth=1 +{0x0000000000001ffc, 1695,{0x078a,0x1f8a}}, // 1974, depth=2 +{0x00000000fc000007, -1,{0x0188,0xffff}}, // 1975, depth=1 +{0x0000000000001ffe, 1700,{0x07cb,0x1fcb}}, // 1976, depth=2 +{0x0000000000001fff, -1,{0x000c,0x100c}}, // 1977, depth=1 +{0x0000000000002000, -1,{0x04c0,0x1cc0}}, // 1978, depth=1 +{0x0007c00000000000, 1980,{0xffff,0x1484}}, // 1979 +{0x0000000000ff0000, -1,{0x0407,0x1c07}}, // 1980 +{0x00000000bfffbfff, -1,{0x006e,0xffff}}, // 1981, depth=1 +{0xfffffffc000007ff, 1985,{0xffff,0x17a8}}, // 1982 +{0x00000000fc00000f, 1705,{0x0189,0xffff}}, // 1983, depth=3 +{0x00000000000007c0, -1,{0x0684,0x1e84}}, // 1984, depth=1 +{0x00000000ff87ffff, -1,{0x025b,0xffff}}, // 1985 +{0x00007ffffffffe00, -1,{0xffff,0x1de5}}, // 1986 +{0x00000000c1c1c1c1, 1711,{0x00b2,0xffff}}, // 1987, depth=2 +{0x03ffffffffffff80, -1,{0xffff,0x1e72}}, // 1988, depth=1 +{0x00000000e007ffff, 1713,{0x00d5,0xffff}}, // 1989, depth=2 +{0x0ffffffffffffff8, -1,{0xffff,0x1f78}}, // 1990 +{0xff801fffffffffff, -1,{0xffff,0x1275}}, // 1991 +{0x001ffffffffffff0, -1,{0xffff,0x1f30}}, // 1992, depth=1 +{0x0ffffffffffffffc, -1,{0xffff,0x1fb9}}, // 1993 +{0x0000018000000180, 1714,{0xffff,0x0641}}, // 1994, depth=2 +{0xffff80007fffffff, -1,{0xffff,0x146f}}, // 1995, depth=1 +{0xe07fffffffffffff, -1,{0xffff,0x10f9}}, // 1996 +{0xc0000000003fffff, 1716,{0xffff,0x1097}}, // 1997, depth=2 +{0x0000ffe00000ffe0, -1,{0xffff,0x06ca}}, // 1998, depth=1 +{0x00000000fc00001f, -1,{0x018a,0xffff}}, // 1999, depth=1 +{0x001ffffffffffff8, -1,{0xffff,0x1f71}}, // 2000, depth=1 +{0xe07fffffe07fffff, 1717,{0xffff,0x00d9}}, // 2001, depth=2 +{0x000fff0000000000, 1719,{0xffff,0x160b}}, // 2002, depth=2 +{0xfffffffffff07fff, -1,{0xffff,0x1b3a}}, // 2003, depth=1 +{0x001ffffffffffffc, -1,{0xffff,0x1fb2}}, // 2004, depth=1 +{0xfff3fff3fff3fff3, 1720,{0xffff,0x032d}}, // 2005, depth=2 +{0xffc0ffc0ffc0ffc0, 1724,{0xffff,0x02a9}}, // 2006, depth=2 +{0x001fffffffffffff, -1,{0xffff,0x1034}}, // 2007, depth=1 +{0x0020000000000000, -1,{0xffff,0x12c0}}, // 2008, depth=1 +{0x0ffffffffffffffe, -1,{0xffff,0x1ffa}}, // 2009 +{0x00000000001ffc00, 1727,{0x058a,0x1d8a}}, // 2010, depth=3 +{0x0fffffffffffffff, -1,{0xffff,0x103b}}, // 2011 +{0x0000000001e00000, -1,{0x02c3,0x1ac3}}, // 2012, depth=1 +{0xffffefffffffffff, -1,{0xffff,0x14fe}}, // 2013 +{0x000000001fc01fc0, -1,{0x02a6,0xffff}}, // 2014, depth=1 +{0xc3ffffffc3ffffff, 1732,{0xffff,0x009b}}, // 2015, depth=2 +{0x00000000000007e0, -1,{0x06c5,0x1ec5}}, // 2016, depth=1 +{0x00000000ffffc07f, -1,{0x0498,0xffff}}, // 2017, depth=1 +{0xffffffffffc0ffff, -1,{0xffff,0x1ab9}}, // 2018 +{0xffffffe000003fff, -1,{0xffff,0x16e8}}, // 2019, depth=1 +{0x00003c0000000000, 2021,{0xffff,0x1583}}, // 2020 +{0x007ffffe007ffffe, -1,{0xffff,0x07d5}}, // 2021 +{0x00000fe000000000, -1,{0xffff,0x16c6}}, // 2022, depth=1 +{0xffffffffffe0007f, -1,{0xffff,0x1af1}}, // 2023, depth=1 +{0x00000ffc00000ffc, -1,{0xffff,0x0789}}, // 2024, depth=1 +{0xfffffc0ffffffc0f, 1736,{0xffff,0x0599}}, // 2025, depth=2 +{0x000000003ffff000, -1,{0x0511,0x1d11}}, // 2026, depth=1 +{0xfffff80007ffffff, -1,{0xffff,0x156f}}, // 2027, depth=1 +{0xfffff00000000007, -1,{0xffff,0x1516}}, // 2028 +{0x00000000ffff8fff, 1739,{0x045c,0xffff}}, // 2029, depth=2 +{0x0000007ffffe0000, -1,{0xffff,0x1bd5}}, // 2030, depth=1 +{0x00000000fc00003f, 1742,{0x018b,0xffff}}, // 2031, depth=2 +{0x00000000000007f0, -1,{0x0706,0x1f06}}, // 2032, depth=1 +{0x00000000ffc7ffc7, 1744,{0x02ac,0xffff}}, // 2033, depth=2 +{0x000003ffe0000000, -1,{0xffff,0x18cc}}, // 2034 +{0x00000000c007ffff, 1745,{0x0094,0xffff}}, // 2035, depth=3 +{0x0001800000000000, -1,{0xffff,0x1441}}, // 2036, depth=1 +{0xfff0007ffff0007f, 1756,{0xffff,0x0312}}, // 2037, depth=2 +{0x003fffffffffe000, -1,{0xffff,0x1ce8}}, // 2038, depth=1 +{0xfffff0000000000f, -1,{0xffff,0x1517}}, // 2039 +{0x00000e0000000e00, 1758,{0xffff,0x05c2}}, // 2040, depth=3 +{0xffffffffff9fffff, -1,{0xffff,0x1a7d}}, // 2041, depth=1 +{0x1e1e1e1e1e1e1e1e, -1,{0xffff,0x01f3}}, // 2042, depth=1 +{0xf000fffff000ffff, -1,{0xffff,0x0113}}, // 2043 +{0x00000000000007fc, -1,{0x0788,0x1f88}}, // 2044, depth=1 +{0x00000000f8003fff, 1766,{0x0152,0xffff}}, // 2045, depth=2 +{0x00000000000007fe, -1,{0x07c9,0x1fc9}}, // 2046, depth=1 +{0x00000000000007ff, -1,{0x000a,0x100a}}, // 2047, depth=1 +{0x0000000000000800, -1,{0x0540,0x1d40}}, // 2048, depth=1 +{0x1ffffc0000000000, -1,{0xffff,0x1592}}, // 2049 +{0x0000007000000000, -1,{0xffff,0x1702}}, // 2050 +{0xc00000003fffffff, -1,{0xffff,0x109f}}, // 2051, depth=1 +{0x0000006000000060, 1767,{0xffff,0x06c1}}, // 2052, depth=2 +{0x0003c0000003c000, -1,{0xffff,0x0483}}, // 2053 +{0x0003ffc000000000, 1768,{0xffff,0x168b}}, // 2054, depth=2 +{0xffe01fffffffffff, -1,{0xffff,0x12f7}}, // 2055, depth=1 +{0x000000000007ff00, 1769,{0x060a,0x1e0a}}, // 2056, depth=3 +{0x0fffffffe0000000, -1,{0xffff,0x18de}}, // 2057 +{0x001fffffff800000, -1,{0xffff,0x1a5d}}, // 2058 +{0x000000000007fffe, -1,{0x07d1,0x1fd1}}, // 2059 +{0x000000000ffffc00, -1,{0x0591,0x1d91}}, // 2060, depth=1 +{0xf0000000ffffffff, -1,{0xffff,0x1123}}, // 2061 +{0x00000000f000f000, -1,{0x0123,0xffff}}, // 2062, depth=1 +{0x00000000bfbfbfbf, -1,{0x0076,0xffff}}, // 2063, depth=1 +{0x00001fffffe00000, -1,{0xffff,0x1ad7}}, // 2064 +{0xf3fff3fff3fff3ff, -1,{0xffff,0x012d}}, // 2065, depth=1 +{0xfffff0000000003f, -1,{0xffff,0x1519}}, // 2066 +{0xffffff7fffffffff, -1,{0xffff,0x163e}}, // 2067 +{0xffffffffff1fffff, -1,{0xffff,0x1a3c}}, // 2068 +{0xffc000000003ffff, -1,{0xffff,0x129b}}, // 2069, depth=1 +{0xffffff800000000f, -1,{0xffff,0x165c}}, // 2070 +{0xfe0003fffe0003ff, 1773,{0xffff,0x01d0}}, // 2071, depth=2 +{0x000000001ffff000, -1,{0x0510,0x1d10}}, // 2072, depth=1 +{0xffffc000ffffc000, -1,{0xffff,0x0491}}, // 2073 +{0x000000007fffc000, -1,{0x0490,0x1c90}}, // 2074, depth=1 +{0xfffffffffc0003ff, -1,{0xffff,0x19af}}, // 2075, depth=1 +{0xfffffc00ffffffff, -1,{0xffff,0x15b5}}, // 2076 +{0xfc000001ffffffff, -1,{0xffff,0x11a6}}, // 2077, depth=1 +{0x00001ff800000000, -1,{0xffff,0x1749}}, // 2078, depth=1 +{0x0000007fffffff00, -1,{0xffff,0x1e1e}}, // 2079 +{0xfffffffffff007ff, -1,{0xffff,0x1b36}}, // 2080 +{0xfffe03ffffffffff, -1,{0xffff,0x13f8}}, // 2081 +{0x00000001ffff0000, -1,{0xffff,0x1c10}}, // 2082, depth=1 +{0xfffc0000000001ff, -1,{0xffff,0x1396}}, // 2083, depth=1 +{0x03ffffffffffffe0, -1,{0xffff,0x1ef4}}, // 2084, depth=1 +{0xf003f003f003f003, -1,{0xffff,0x0125}}, // 2085, depth=1 +{0x0001fff80001fff8, -1,{0xffff,0x074d}}, // 2086, depth=1 +{0xffff80003fffffff, -1,{0xffff,0x146e}}, // 2087, depth=1 +{0x0ffffc000ffffc00, -1,{0xffff,0x0591}}, // 2088, depth=1 +{0x00000000ffc7ffff, -1,{0x029c,0xffff}}, // 2089, depth=1 +{0x000003ffffc00000, -1,{0xffff,0x1a93}}, // 2090 +{0x00000000f87ff87f, 1774,{0x016b,0xffff}}, // 2091, depth=2 +{0x0007fffffff00000, -1,{0xffff,0x1b1e}}, // 2092, depth=1 +{0xffffffc3ffffffc3, 1776,{0xffff,0x069b}}, // 2093, depth=2 +{0x00fffffff8000000, 1777,{0xffff,0x195c}}, // 2094, depth=2 +{0x00000000fc00007f, 1779,{0x018c,0xffff}}, // 2095, depth=2 +{0x000000001f801f80, 1780,{0x0265,0xffff}}, // 2096, depth=3 +{0xc00000001fffffff, -1,{0xffff,0x109e}}, // 2097, depth=1 +{0x00007fe000000000, -1,{0xffff,0x16c9}}, // 2098, depth=1 +{0xfc00ffffffffffff, -1,{0xffff,0x11b5}}, // 2099, depth=1 +{0x001fffffc0000000, 1788,{0xffff,0x1896}}, // 2100, depth=2 +{0xfe0007ffffffffff, 1791,{0xffff,0x11f1}}, // 2101, depth=2 +{0x0000003e0000003e, -1,{0xffff,0x07c4}}, // 2102, depth=1 +{0x00000000fc03fc03, 1801,{0x01a7,0xffff}}, // 2103, depth=3 +{0x0000ffffffff0000, -1,{0xffff,0x1c1f}}, // 2104, depth=1 +{0xff800001ffffffff, -1,{0xffff,0x1269}}, // 2105 +{0x001fffff00000000, -1,{0xffff,0x1814}}, // 2106 +{0x80007fffffffffff, -1,{0xffff,0x106f}}, // 2107, depth=1 +{0x03fffffffffffff8, -1,{0xffff,0x1f76}}, // 2108, depth=1 +{0xfffff000003fffff, -1,{0xffff,0x1529}}, // 2109, depth=1 +{0x7ffffff87ffffff8, 1806,{0xffff,0x075b}}, // 2110, depth=2 +{0xffe03fffffe03fff, -1,{0xffff,0x02d8}}, // 2111, depth=1 +{0x0070000000700000, 1809,{0xffff,0x0302}}, // 2112, depth=4 +{0xff8000ffffffffff, -1,{0xffff,0x1270}}, // 2113, depth=1 +{0x00000007fffc0000, 1828,{0xffff,0x1b90}}, // 2114, depth=2 +{0x00000000ff87ff87, 1829,{0x026b,0xffff}}, // 2115, depth=3 +{0x0400000000000000, -1,{0xffff,0x1180}}, // 2116, depth=1 +{0xffffffff001fffff, -1,{0xffff,0x1834}}, // 2117, depth=1 +{0x0001fc000001fc00, -1,{0xffff,0x0586}}, // 2118, depth=1 +{0x00000001f0000000, -1,{0xffff,0x1904}}, // 2119 +{0x000007fffffff800, -1,{0xffff,0x1d5f}}, // 2120 +{0xfffe000000001fff, -1,{0xffff,0x13db}}, // 2121, depth=1 +{0x0fffffffffffff80, -1,{0xffff,0x1e74}}, // 2122, depth=1 +{0x9f9f9f9f9f9f9f9f, 1833,{0xffff,0x0075}}, // 2123, depth=2 +{0x03c0000003c00000, 1835,{0xffff,0x0283}}, // 2124, depth=2 +{0xc1ffffffc1ffffff, -1,{0xffff,0x009a}}, // 2125, depth=1 +{0x0000000007000000, 1838,{0x0202,0x1a02}}, // 2126, depth=2 +{0x000000008007ffff, 1839,{0x0053,0xffff}}, // 2127, depth=2 +{0xfe000003ffffffff, -1,{0xffff,0x11e8}}, // 2128 +{0x00000000ffffc1ff, -1,{0x049a,0xffff}}, // 2129 +{0x0007ffe00007ffe0, -1,{0xffff,0x06cd}}, // 2130, depth=1 +{0xff1fff1fff1fff1f, -1,{0xffff,0x022c}}, // 2131, depth=1 +{0x000000fff0000000, 1840,{0xffff,0x190b}}, // 2132, depth=2 +{0xffff80001fffffff, -1,{0xffff,0x146d}}, // 2133, depth=1 +{0x3fffffe000000000, -1,{0xffff,0x16d8}}, // 2134, depth=1 +{0xffffffffffe001ff, -1,{0xffff,0x1af3}}, // 2135 +{0xfffffe0000007fff, 2140,{0xffff,0x15e5}}, // 2136 +{0xffffff807fffffff, -1,{0xffff,0x1677}}, // 2137, depth=1 +{0x3ffff0003ffff000, -1,{0xffff,0x0511}}, // 2138, depth=1 +{0xfe003fffffffffff, -1,{0xffff,0x11f4}}, // 2139, depth=1 +{0xf007fffff007ffff, -1,{0xffff,0x0116}}, // 2140 +{0x0000fffff0000000, -1,{0xffff,0x1913}}, // 2141 +{0x7ffffc007ffffc00, -1,{0xffff,0x0594}}, // 2142, depth=1 +{0xbfffffffffffffff, -1,{0xffff,0x107e}}, // 2143, depth=1 +{0xc000000000000000, -1,{0xffff,0x1081}}, // 2144, depth=1 +{0x00000000ffffc0ff, 1844,{0x0499,0xffff}}, // 2145, depth=3 +{0x00000003fff80000, -1,{0xffff,0x1b4e}}, // 2146 +{0xc000000000000003, -1,{0xffff,0x1083}}, // 2147, depth=1 +{0xfff801ffffffffff, -1,{0xffff,0x1375}}, // 2148 +{0xfffc00000001ffff, -1,{0xffff,0x139e}}, // 2149, depth=1 +{0x000e000000000000, -1,{0xffff,0x13c2}}, // 2150 +{0xc000000000000007, 1852,{0xffff,0x1084}}, // 2151, depth=2 +{0x000000007c000000, 1855,{0x0184,0x1984}}, // 2152, depth=2 +{0xffffffc3ffffffff, -1,{0xffff,0x16bb}}, // 2153, depth=1 +{0x001fffffffc00000, -1,{0xffff,0x1a9e}}, // 2154, depth=1 +{0xff0007ffff0007ff, 1856,{0xffff,0x0212}}, // 2155, depth=2 +{0xff000fffff000fff, -1,{0xffff,0x0213}}, // 2156 +{0xffffffffe000ffff, -1,{0xffff,0x18f2}}, // 2157, depth=1 +{0x000003ffffffffc0, -1,{0xffff,0x1ea3}}, // 2158, depth=1 +{0xc00000000000000f, 1858,{0xffff,0x1085}}, // 2159, depth=2 +{0x00003ffffffff800, -1,{0xffff,0x1d62}}, // 2160 +{0x0000000001ff01ff, -1,{0x0028,0xffff}}, // 2161, depth=1 +{0x03ffffffe0000000, 1859,{0xffff,0x18dc}}, // 2162, depth=2 +{0xfffff0003fffffff, -1,{0xffff,0x1531}}, // 2163, depth=1 +{0x0000000ffffff000, -1,{0xffff,0x1d17}}, // 2164 +{0xfffffffc00001fff, -1,{0xffff,0x17aa}}, // 2165, depth=1 +{0x000000003fffc000, -1,{0x048f,0x1c8f}}, // 2166, depth=1 +{0xffffffff0fffffff, -1,{0xffff,0x183b}}, // 2167, depth=1 +{0xffffff800000007f, 2174,{0xffff,0x165f}}, // 2168 +{0xfff8000000003fff, -1,{0xffff,0x135a}}, // 2169, depth=1 +{0x000000007e007e00, 1862,{0x01e5,0xffff}}, // 2170, depth=3 +{0xffc01fffffc01fff, 1866,{0xffff,0x0296}}, // 2171, depth=2 +{0x000ffffffe000000, 1869,{0xffff,0x19da}}, // 2172, depth=2 +{0x00000000f83ff83f, -1,{0x016a,0xffff}}, // 2173, depth=1 +{0xff0000000003ffff, -1,{0xffff,0x1219}}, // 2174 +{0xc00000000000001f, 1873,{0xffff,0x1086}}, // 2175, depth=2 +{0x7fffffffffff0000, -1,{0xffff,0x1c2e}}, // 2176, depth=1 +{0x00000000f0ffffff, -1,{0x011b,0xffff}}, // 2177, depth=1 +{0x0001ff8000000000, -1,{0xffff,0x1649}}, // 2178, depth=1 +{0xffff7fffffffffff, -1,{0xffff,0x143e}}, // 2179, depth=1 +{0x0000000003ff8000, 1876,{0x044a,0x1c4a}}, // 2180, depth=2 +{0xfc0003fffc0003ff, 1879,{0xffff,0x018f}}, // 2181, depth=2 +{0x000000ffffe00000, -1,{0xffff,0x1ad2}}, // 2182, depth=1 +{0xffff800000000003, 1881,{0xffff,0x1452}}, // 2183, depth=2 +{0x000000000007ff80, 1884,{0x064b,0x1e4b}}, // 2184, depth=2 +{0x00000000f8000fff, 1886,{0x0150,0xffff}}, // 2185, depth=2 +{0x007fffff00000000, 1894,{0xffff,0x1816}}, // 2186, depth=2 +{0xffff800000000007, -1,{0xffff,0x1453}}, // 2187, depth=1 +{0x1ffffffffff80000, -1,{0xffff,0x1b69}}, // 2188, depth=1 +{0xffffe07fffffffff, -1,{0xffff,0x14f9}}, // 2189, depth=1 +{0x000003ffffffffe0, -1,{0xffff,0x1ee4}}, // 2190, depth=1 +{0xfffe0000000007ff, -1,{0xffff,0x13d9}}, // 2191, depth=1 +{0x003c003c003c003c, 1898,{0xffff,0x03a3}}, // 2192, depth=2 +{0x00000000ff001fff, 1902,{0x0214,0xffff}}, // 2193, depth=3 +{0x000000f8000000f8, -1,{0xffff,0x0744}}, // 2194, depth=1 +{0xffff80000000000f, 1912,{0xffff,0x1454}}, // 2195, depth=2 +{0xfff00003ffffffff, -1,{0xffff,0x132d}}, // 2196 +{0xfffe00000007ffff, -1,{0xffff,0x13e1}}, // 2197 +{0xffffffc001ffffff, 2199,{0xffff,0x16b2}}, // 2198 +{0x00000000ffff0007, -1,{0x0412,0xffff}}, // 2199 +{0xfffff80000001fff, -1,{0xffff,0x1561}}, // 2200 +{0x000007ffffffe000, -1,{0xffff,0x1cdd}}, // 2201 +{0x0003fffffffc0000, -1,{0xffff,0x1b9f}}, // 2202, depth=1 +{0xffffffffc000ffff, -1,{0xffff,0x18b1}}, // 2203, depth=1 +{0xc000000fffffffff, -1,{0xffff,0x10a5}}, // 2204 +{0x0000003ffe000000, -1,{0xffff,0x19cc}}, // 2205 +{0x000003fffffffff0, -1,{0xffff,0x1f25}}, // 2206, depth=1 +{0xf8fffffff8ffffff, 1918,{0xffff,0x015c}}, // 2207, depth=4 +{0x03ffffffc0000000, 1926,{0xffff,0x189b}}, // 2208, depth=2 +{0xfffff0001fffffff, -1,{0xffff,0x1530}}, // 2209, depth=1 +{0x0001fffffff80000, -1,{0xffff,0x1b5d}}, // 2210 +{0xffff80000000001f, -1,{0xffff,0x1455}}, // 2211, depth=1 +{0x000000001fffc000, -1,{0x048e,0x1c8e}}, // 2212, depth=1 +{0xfc000007fc000007, -1,{0xffff,0x0188}}, // 2213, depth=1 +{0x7ffc000000000000, 1939,{0xffff,0x138c}}, // 2214, depth=2 +{0x00000000bbbbbbbb, -1,{0x007a,0xffff}}, // 2215, depth=1 +{0xffffffff0000ffff, -1,{0xffff,0x182f}}, // 2216 +{0xffc0003fffffffff, -1,{0xffff,0x12af}}, // 2217, depth=1 +{0x0fffffffffffffe0, 1942,{0xffff,0x1ef6}}, // 2218, depth=2 +{0xff00000fff00000f, 1948,{0xffff,0x020b}}, // 2219, depth=2 +{0x000003fffffffffe, -1,{0xffff,0x1fe8}}, // 2220, depth=1 +{0x000003ffffffffff, -1,{0xffff,0x1029}}, // 2221, depth=1 +{0x0000040000000000, -1,{0xffff,0x1580}}, // 2222, depth=1 +{0x8000ffff8000ffff, 1949,{0xffff,0x0050}}, // 2223, depth=3 +{0x0000400000004000, 1951,{0xffff,0x0480}}, // 2224, depth=2 +{0x0000007fffffff80, -1,{0xffff,0x1e5f}}, // 2225 +{0x01fffffffe000000, -1,{0xffff,0x19df}}, // 2226, depth=1 +{0xfffffffe001fffff, -1,{0xffff,0x17f3}}, // 2227 +{0x0018000000180000, -1,{0xffff,0x0341}}, // 2228, depth=1 +{0xfc00000000ffffff, 1957,{0xffff,0x119d}}, // 2229, depth=2 +{0x1fffc0001fffc000, 1960,{0xffff,0x048e}}, // 2230, depth=2 +{0xff9fffffff9fffff, -1,{0xffff,0x025d}}, // 2231, depth=1 +{0x01fe000000000000, -1,{0xffff,0x13c7}}, // 2232 +{0xfffffffffffe0fff, -1,{0xffff,0x1bfa}}, // 2233, depth=1 +{0x01c0000001c00000, 1961,{0xffff,0x0282}}, // 2234, depth=4 +{0xbfffffffbfffffff, 1982,{0xffff,0x005e}}, // 2235, depth=3 +{0x1fe0000000000000, -1,{0xffff,0x12c7}}, // 2236 +{0xfffffff80001ffff, -1,{0xffff,0x176d}}, // 2237, depth=1 +{0x7070707070707070, 1986,{0xffff,0x0132}}, // 2238, depth=2 +{0xf800000007ffffff, -1,{0xffff,0x115f}}, // 2239, depth=1 +{0x000001ffffffe000, -1,{0xffff,0x1cdb}}, // 2240, depth=1 +{0xffffc000000007ff, -1,{0xffff,0x149c}}, // 2241 +{0x0000001ffff00000, 1990,{0xffff,0x1b10}}, // 2242, depth=2 +{0xffff80000000003f, -1,{0xffff,0x1456}}, // 2243, depth=1 +{0x000000003c000000, -1,{0x0183,0x1983}}, // 2244, depth=1 +{0x00000000fff003ff, 1991,{0x0315,0xffff}}, // 2245, depth=2 +{0x00000007fffffc00, 1993,{0xffff,0x1d98}}, // 2246, depth=2 +{0xfffefffffffeffff, 1996,{0xffff,0x03de}}, // 2247, depth=2 +{0x000000000007ffc0, 2009,{0x068c,0x1e8c}}, // 2248, depth=2 +{0xffe3ffe3ffe3ffe3, 2011,{0xffff,0x02ec}}, // 2249, depth=2 +{0x1000000000000000, -1,{0xffff,0x1100}}, // 2250, depth=1 +{0x07fffff807fffff8, -1,{0xffff,0x0757}}, // 2251 +{0xfff1ffffffffffff, 2265,{0xffff,0x133c}}, // 2252 +{0xfffffe0007ffffff, -1,{0xffff,0x15f1}}, // 2253, depth=1 +{0x07ffffffffffe000, -1,{0xffff,0x1ced}}, // 2254, depth=1 +{0x00000000f7fff7ff, 2013,{0x012e,0xffff}}, // 2255, depth=2 +{0xfffff00000000000, -1,{0xffff,0x1513}}, // 2256, depth=1 +{0xfffff00000000001, 2018,{0xffff,0x1514}}, // 2257, depth=2 +{0x0007f0000007f000, -1,{0xffff,0x0506}}, // 2258, depth=1 +{0xfffff00000000003, -1,{0xffff,0x1515}}, // 2259, depth=1 +{0x000000001f001f00, 2020,{0x0224,0xffff}}, // 2260, depth=3 +{0x00000000fffff1ff, -1,{0x051c,0xffff}}, // 2261, depth=1 +{0x03ffffffffc00000, -1,{0xffff,0x1aa3}}, // 2262, depth=1 +{0x00000000ff0007ff, 2028,{0x0212,0xffff}}, // 2263, depth=2 +{0x00001ffff0000000, -1,{0xffff,0x1910}}, // 2264, depth=1 +{0xff07ff07ff07ff07, -1,{0xffff,0x022a}}, // 2265 +{0xffff00000fffffff, 2269,{0xffff,0x142b}}, // 2266 +{0xfffffff003ffffff, -1,{0xffff,0x1735}}, // 2267, depth=1 +{0x007fff00007fff00, 2034,{0xffff,0x060e}}, // 2268, depth=2 +{0x00000000ffff003f, -1,{0x0415,0xffff}}, // 2269 +{0x000001ffffff8000, 2273,{0xffff,0x1c59}}, // 2270 +{0xc00000000000007f, 2039,{0xffff,0x1088}}, // 2271, depth=2 +{0x0007f80000000000, -1,{0xffff,0x1547}}, // 2272, depth=1 +{0x1ffc1ffc1ffc1ffc, -1,{0xffff,0x03aa}}, // 2273 +{0x3ffffffffffffe00, -1,{0xffff,0x1df4}}, // 2274, depth=1 +{0xffffff801fffffff, -1,{0xffff,0x1675}}, // 2275, depth=1 +{0x1fffffffffffe000, -1,{0xffff,0x1cef}}, // 2276 +{0x8000007f8000007f, 2043,{0xffff,0x0047}}, // 2277, depth=2 +{0x000000000c000c00, 2049,{0x01a1,0xffff}}, // 2278, depth=2 +{0x00000000ff07ff07, -1,{0x022a,0xffff}}, // 2279, depth=1 +{0x000000000007ffe0, -1,{0x06cd,0x1ecd}}, // 2280, depth=1 +{0xfe000000000fffff, -1,{0xffff,0x11da}}, // 2281, depth=1 +{0x0f0000000f000000, 2050,{0xffff,0x0203}}, // 2282, depth=2 +{0xfffffffffff01fff, -1,{0xffff,0x1b38}}, // 2283, depth=1 +{0x3ff8000000000000, -1,{0xffff,0x134a}}, // 2284, depth=1 +{0xff80000000ffffff, -1,{0xffff,0x1260}}, // 2285 +{0x3fffffffffffff00, -1,{0xffff,0x1e35}}, // 2286 +{0xfffff0000000001f, -1,{0xffff,0x1518}}, // 2287, depth=1 +{0xfffff800000007ff, -1,{0xffff,0x155f}}, // 2288 +{0xfffffffe0fffffff, -1,{0xffff,0x17fa}}, // 2289 +{0x000000001c000000, 2053,{0x0182,0x1982}}, // 2290, depth=2 +{0x000000000ff00ff0, -1,{0x0327,0xffff}}, // 2291 +{0xe3ffffffffffffff, -1,{0xffff,0x10fc}}, // 2292 +{0xffe00000ffffffff, -1,{0xffff,0x12ea}}, // 2293 +{0x007ffffe00000000, -1,{0xffff,0x17d5}}, // 2294 +{0xffffffff8000ffff, -1,{0xffff,0x1870}}, // 2295, depth=1 +{0x000000000007fff0, 2057,{0x070e,0x1f0e}}, // 2296, depth=2 +{0xff0fffffffffffff, -1,{0xffff,0x123b}}, // 2297, depth=1 +{0xfffffc00003fffff, 2299,{0xffff,0x15ab}}, // 2298 +{0xff00001fff00001f, -1,{0xffff,0x020c}}, // 2299 +{0x03ffffff80000000, 2058,{0xffff,0x185a}}, // 2300, depth=2 +{0xfffe007ffffe007f, -1,{0xffff,0x03d5}}, // 2301, depth=1 +{0x7ffffff800000000, -1,{0xffff,0x175b}}, // 2302, depth=1 +{0x0000007fffffffe0, -1,{0xffff,0x1ee1}}, // 2303 +{0x000000000007fff8, -1,{0x074f,0x1f4f}}, // 2304, depth=1 +{0x01ff01ff01ff01ff, -1,{0xffff,0x0028}}, // 2305, depth=1 +{0x001fff80001fff80, -1,{0xffff,0x064d}}, // 2306, depth=1 +{0xffff80000000007f, -1,{0xffff,0x1457}}, // 2307, depth=1 +{0x000000000007fffc, -1,{0x0790,0x1f90}}, // 2308, depth=1 +{0xfff8000000000fff, -1,{0xffff,0x1358}}, // 2309, depth=1 +{0x0100010001000100, 2059,{0xffff,0x0220}}, // 2310, depth=2 +{0x000000000007ffff, 2061,{0x0012,0x1012}}, // 2311, depth=2 +{0x0000000000080000, -1,{0x0340,0x1b40}}, // 2312, depth=1 +{0xffffff80000000ff, 2316,{0xffff,0x1660}}, // 2313 +{0x000003ffc0000000, 2064,{0xffff,0x188b}}, // 2314, depth=2 +{0x0001000100010001, -1,{0xffff,0x0020}}, // 2315, depth=1 +{0x00000000ffff007f, -1,{0x0416,0xffff}}, // 2316 +{0xff000000000003ff, -1,{0xffff,0x1211}}, // 2317, depth=1 +{0x003fffffffff8000, -1,{0xffff,0x1c66}}, // 2318, depth=1 +{0xf1f1f1f1f1f1f1f1, 2066,{0xffff,0x0134}}, // 2319, depth=2 +{0x0000000000080008, -1,{0x0360,0xffff}}, // 2320, depth=1 +{0xc0ffc0ffc0ffc0ff, 2067,{0xffff,0x00a9}}, // 2321, depth=2 +{0xffffff8000000000, -1,{0xffff,0x1658}}, // 2322, depth=1 +{0xffffff8000000001, -1,{0xffff,0x1659}}, // 2323, depth=1 +{0x0000007ffffffff0, -1,{0xffff,0x1f22}}, // 2324 +{0xffffff8000000003, -1,{0xffff,0x165a}}, // 2325, depth=1 +{0xc000c000c000c000, -1,{0xffff,0x00a1}}, // 2326, depth=1 +{0x00001e0000001e00, -1,{0xffff,0x05c3}}, // 2327 +{0x0000007fffffffff, -1,{0xffff,0x1026}}, // 2328 +{0xffffff8000000007, -1,{0xffff,0x165b}}, // 2329, depth=1 +{0x0000008000000000, -1,{0xffff,0x1640}}, // 2330 +{0xf000007ff000007f, -1,{0xffff,0x010a}}, // 2331, depth=1 +{0x00ffffc000000000, -1,{0xffff,0x1691}}, // 2332, depth=1 +{0xffffe1ffffffe1ff, 2068,{0xffff,0x04db}}, // 2333, depth=2 +{0x0003fffffffffc00, -1,{0xffff,0x1da7}}, // 2334, depth=1 +{0xfff00000000fffff, -1,{0xffff,0x131f}}, // 2335, depth=1 +{0x7f0000007f000000, -1,{0xffff,0x0206}}, // 2336, depth=1 +{0xffe0000000ffffff, 2070,{0xffff,0x12e2}}, // 2337, depth=2 +{0x0000000066666666, 2073,{0x00f9,0xffff}}, // 2338, depth=2 +{0x00000000e00fe00f, 2076,{0x00e6,0xffff}}, // 2339, depth=2 +{0x0000fff00000fff0, -1,{0xffff,0x070b}}, // 2340, depth=1 +{0x00000fffffffffc0, -1,{0xffff,0x1ea5}}, // 2341 +{0x0fffffffc0000000, -1,{0xffff,0x189d}}, // 2342, depth=1 +{0xfffffc003fffffff, 2344,{0xffff,0x15b3}}, // 2343 +{0xffffe000001fffff, -1,{0xffff,0x14e7}}, // 2344 +{0xfffffff000003fff, -1,{0xffff,0x1729}}, // 2345, depth=1 +{0xfffffffffff80000, -1,{0xffff,0x1b6c}}, // 2346 +{0xfffffffffff80001, -1,{0xffff,0x1b6d}}, // 2347 +{0x00000ff000000000, -1,{0xffff,0x1707}}, // 2348, depth=1 +{0xffffe003ffffe003, -1,{0xffff,0x04d4}}, // 2349, depth=1 +{0x000ffff8000ffff8, -1,{0xffff,0x0750}}, // 2350, depth=1 +{0xffe00000007fffff, -1,{0xffff,0x12e1}}, // 2351 +{0x3ffffff03ffffff0, 2079,{0xffff,0x0719}}, // 2352, depth=2 +{0xffffff800000001f, 2080,{0xffff,0x165d}}, // 2353, depth=2 +{0xfffffffffff8000f, -1,{0xffff,0x1b70}}, // 2354 +{0x8007ffff8007ffff, -1,{0xffff,0x0053}}, // 2355, depth=1 +{0xffffffffe3ffffff, -1,{0xffff,0x18fc}}, // 2356 +{0xfffffffff00001ff, -1,{0xffff,0x192c}}, // 2357, depth=1 +{0xffffff8fffffffff, -1,{0xffff,0x167c}}, // 2358 +{0x7fffff807fffff80, -1,{0xffff,0x0657}}, // 2359 +{0x001f0000001f0000, -1,{0xffff,0x0404}}, // 2360, depth=1 +{0x00000ffffffffff0, -1,{0xffff,0x1f27}}, // 2361 +{0xfffffc001fffffff, -1,{0xffff,0x15b2}}, // 2362 +{0xffffc3ffffffffff, -1,{0xffff,0x14bb}}, // 2363 +{0x00000ffffffffffe, -1,{0xffff,0x1fea}}, // 2364 +{0x00000000fff3fff3, 2081,{0x032d,0xffff}}, // 2365, depth=2 +{0xf000000000000000, -1,{0xffff,0x1103}}, // 2366 +{0xfffffc1ffffffc1f, -1,{0xffff,0x059a}}, // 2367, depth=1 +{0x00ffffe000ffffe0, 2090,{0xffff,0x06d2}}, // 2368, depth=2 +{0xfffffffffff8003f, -1,{0xffff,0x1b72}}, // 2369 +{0x1f80000000000000, -1,{0xffff,0x1245}}, // 2370 +{0xfffffff8000003ff, -1,{0xffff,0x1766}}, // 2371 +{0x000000000000fc00, -1,{0x0585,0x1d85}}, // 2372, depth=1 +{0xffffffe0000fffff, -1,{0xffff,0x16ee}}, // 2373 +{0xffff8000000001ff, -1,{0xffff,0x1459}}, // 2374 +{0xff0fff0fff0fff0f, 2105,{0xffff,0x022b}}, // 2375, depth=2 +{0x007e0000007e0000, 2106,{0xffff,0x03c5}}, // 2376, depth=2 +{0x00000000fff3ffff, -1,{0x031d,0xffff}}, // 2377, depth=1 +{0x00000003fffff800, -1,{0xffff,0x1d56}}, // 2378 +{0xffffffffff00ffff, 2380,{0xffff,0x1a37}}, // 2379 +{0xfff83fffffffffff, 2381,{0xffff,0x137a}}, // 2380 +{0xf00000000000000f, -1,{0xffff,0x1107}}, // 2381 +{0x000ffc00000ffc00, -1,{0xffff,0x0589}}, // 2382, depth=1 +{0xfffff0000000007f, -1,{0xffff,0x151a}}, // 2383, depth=1 +{0x1c00000000000000, -1,{0xffff,0x1182}}, // 2384, depth=1 +{0xffffff800000003f, -1,{0xffff,0x165e}}, // 2385, depth=1 +{0xffff0007ffffffff, -1,{0xffff,0x1432}}, // 2386 +{0xf0000000007fffff, -1,{0xffff,0x111a}}, // 2387, depth=1 +{0x03ffffffff000000, -1,{0xffff,0x1a21}}, // 2388 +{0xe3ffe3ffe3ffe3ff, -1,{0xffff,0x00ec}}, // 2389, depth=1 +{0xf81fffffffffffff, 2392,{0xffff,0x1179}}, // 2390 +{0x80000000001fffff, -1,{0xffff,0x1055}}, // 2391, depth=1 +{0xffffbfffffffbfff, -1,{0xffff,0x045e}}, // 2392 +{0xfff807fffff807ff, -1,{0xffff,0x0357}}, // 2393, depth=1 +{0x0000007000000070, 2119,{0xffff,0x0702}}, // 2394, depth=2 +{0xf800000000007fff, -1,{0xffff,0x1153}}, // 2395, depth=1 +{0x0fffffffffc00000, 2120,{0xffff,0x1aa5}}, // 2396, depth=2 +{0xff80ffffffffffff, -1,{0xffff,0x1278}}, // 2397, depth=1 +{0x0003ffe000000000, -1,{0xffff,0x16cc}}, // 2398 +{0xc0000000000000ff, 2128,{0xffff,0x1089}}, // 2399, depth=2 +{0x00fffff000fffff0, -1,{0xffff,0x0713}}, // 2400 +{0xf80003fff80003ff, 2129,{0xffff,0x014e}}, // 2401, depth=2 +{0x007fffffff000000, -1,{0xffff,0x1a1e}}, // 2402, depth=1 +{0xffffffffff80ffff, -1,{0xffff,0x1a78}}, // 2403, depth=1 +{0x0000f8000000f800, -1,{0xffff,0x0544}}, // 2404, depth=1 +{0xfffffc0000000003, 2410,{0xffff,0x1597}}, // 2405 +{0x000003ff80000000, -1,{0xffff,0x184a}}, // 2406, depth=1 +{0xe000000000001fff, 2135,{0xffff,0x10cf}}, // 2407, depth=2 +{0x03ffffffff800000, -1,{0xffff,0x1a62}}, // 2408, depth=1 +{0xe003e003e003e003, 2136,{0xffff,0x00e4}}, // 2409, depth=3 +{0xf00000000000001f, -1,{0xffff,0x1108}}, // 2410 +{0xfffffc0000000007, -1,{0xffff,0x1598}}, // 2411 +{0xfc0000003fffffff, -1,{0xffff,0x11a3}}, // 2412 +{0x3fffffffffffffc0, 2417,{0xffff,0x1eb7}}, // 2413 +{0x0780000000000000, -1,{0xffff,0x1243}}, // 2414, depth=1 +{0xfffffc00007fffff, -1,{0xffff,0x15ac}}, // 2415, depth=1 +{0x3ffff8003ffff800, 2141,{0xffff,0x0552}}, // 2416, depth=2 +{0x001f000000000000, 2419,{0xffff,0x1404}}, // 2417 +{0x00000fffffffff00, -1,{0xffff,0x1e23}}, // 2418, depth=1 +{0x0000000003fc0000, -1,{0x0387,0x1b87}}, // 2419 +{0x00007ffffffffff0, -1,{0xffff,0x1f2a}}, // 2420 +{0xffffff07ffffff07, -1,{0xffff,0x061a}}, // 2421 +{0x000fc00000000000, -1,{0xffff,0x1485}}, // 2422 +{0xfffffffff001ffff, -1,{0xffff,0x1934}}, // 2423, depth=1 +{0x00007ff000000000, -1,{0xffff,0x170a}}, // 2424, depth=1 +{0xffffc00000001fff, -1,{0xffff,0x149e}}, // 2425, depth=1 +{0xffe000007fffffff, -1,{0xffff,0x12e9}}, // 2426 +{0xffc0003fffc0003f, -1,{0xffff,0x028f}}, // 2427, depth=1 +{0xff800000ffffffff, -1,{0xffff,0x1268}}, // 2428 +{0xfffffffffff8007f, -1,{0xffff,0x1b73}}, // 2429 +{0x0000000007fc07fc, 2146,{0x03a8,0xffff}}, // 2430, depth=2 +{0x00000000fffc3fff, 2148,{0x039b,0xffff}}, // 2431, depth=2 +{0x00f800f800f800f8, 2150,{0xffff,0x0364}}, // 2432, depth=2 +{0xf8000007f8000007, 2156,{0xffff,0x0147}}, // 2433, depth=2 +{0x0fffffff80000000, 2160,{0xffff,0x185c}}, // 2434, depth=2 +{0xffff8000000000ff, -1,{0xffff,0x1458}}, // 2435, depth=1 +{0x00007ffffffffffc, -1,{0xffff,0x1fac}}, // 2436 +{0xe01fffffffffffff, -1,{0xffff,0x10f7}}, // 2437, depth=1 +{0x00007ffffffffffe, -1,{0xffff,0x1fed}}, // 2438 +{0xfffffffffc007fff, -1,{0xffff,0x19b4}}, // 2439 +{0x3fffffffffffffe0, -1,{0xffff,0x1ef8}}, // 2440 +{0x800000000fffffff, -1,{0xffff,0x105c}}, // 2441, depth=1 +{0xffff80000001ffff, 2446,{0xffff,0x1461}}, // 2442 +{0xfe01ffffffffffff, -1,{0xffff,0x11f7}}, // 2443, depth=1 +{0x00000001ffe00000, 2164,{0xffff,0x1acb}}, // 2444, depth=2 +{0xfc000000ffffffff, -1,{0xffff,0x11a5}}, // 2445, depth=1 +{0xfff0000001ffffff, 2447,{0xffff,0x1324}}, // 2446 +{0x00000000c01fffff, -1,{0x0096,0xffff}}, // 2447 +{0x00000000fffefffe, -1,{0x03ee,0xffff}}, // 2448, depth=1 +{0x00000000fffeffff, 2168,{0x03de,0xffff}}, // 2449, depth=3 +{0x00000000ffff0000, -1,{0x040f,0x1c0f}}, // 2450, depth=1 +{0x00000000ffff0001, -1,{0x0410,0xffff}}, // 2451, depth=1 +{0x1ffffffffffff800, -1,{0xffff,0x1d71}}, // 2452, depth=1 +{0x00000000ffff0003, 2196,{0x0411,0xffff}}, // 2453, depth=2 +{0x00000007fffffe00, -1,{0xffff,0x1dd9}}, // 2454 +{0xffc0000007ffffff, 2197,{0xffff,0x12a4}}, // 2455, depth=2 +{0x00000000001e0000, -1,{0x03c3,0x1bc3}}, // 2456, depth=1 +{0xfff8000ffff8000f, 2198,{0xffff,0x0350}}, // 2457, depth=3 +{0xfffffe00000007ff, -1,{0xffff,0x15e1}}, // 2458 +{0xffffffffc0003fff, -1,{0xffff,0x18af}}, // 2459 +{0x3ffffff000000000, -1,{0xffff,0x1719}}, // 2460, depth=1 +{0x0000000011111111, -1,{0x0038,0xffff}}, // 2461, depth=1 +{0xfffff000000001ff, -1,{0xffff,0x151c}}, // 2462 +{0xffff0000001fffff, 2200,{0xffff,0x1424}}, // 2463, depth=2 +{0x3ffffffffffffff0, -1,{0xffff,0x1f39}}, // 2464 +{0x00000000ffff000f, -1,{0x0413,0xffff}}, // 2465, depth=1 +{0x0000ffffffe00000, 2201,{0xffff,0x1ada}}, // 2466, depth=2 +{0x000ff80000000000, -1,{0xffff,0x1548}}, // 2467 +{0x0000003c00000000, -1,{0xffff,0x1783}}, // 2468 +{0x00000000f07fffff, 2204,{0x011a,0xffff}}, // 2469, depth=2 +{0xffffffff83ffffff, 2471,{0xffff,0x187a}}, // 2470 +{0xffffffe3ffffffe3, 2475,{0xffff,0x06dc}}, // 2471 +{0x0007fff00007fff0, 2205,{0xffff,0x070e}}, // 2472, depth=2 +{0xffffffffffe1ffff, -1,{0xffff,0x1afb}}, // 2473, depth=1 +{0x003ffffff8000000, 2210,{0xffff,0x195a}}, // 2474, depth=2 +{0x00000000fe001fff, -1,{0x01d3,0xffff}}, // 2475 +{0x000ffffc00000000, -1,{0xffff,0x1791}}, // 2476, depth=1 +{0xe0000000000007ff, -1,{0xffff,0x10cd}}, // 2477, depth=1 +{0x3ffffffffffffff8, -1,{0xffff,0x1f7a}}, // 2478 +{0x00000000fc0001ff, 2216,{0x018e,0xffff}}, // 2479, depth=2 +{0x00fffffffffc0000, 2225,{0xffff,0x1ba5}}, // 2480, depth=2 +{0x00000000ffff001f, -1,{0x0414,0xffff}}, // 2481, depth=1 +{0x3ffffffffffffffe, -1,{0xffff,0x1ffc}}, // 2482 +{0xffffff000fffffff, -1,{0xffff,0x1633}}, // 2483 +{0x03ffffff00000000, -1,{0xffff,0x1819}}, // 2484, depth=1 +{0xfffffff000000fff, 2227,{0xffff,0x1727}}, // 2485, depth=2 +{0x00000000001e001e, 2232,{0x03e3,0xffff}}, // 2486, depth=2 +{0xfffffffff8ffffff, -1,{0xffff,0x197c}}, // 2487 +{0x7ffffffff0000000, -1,{0xffff,0x1922}}, // 2488, depth=1 +{0x0000000000ff00ff, -1,{0x0027,0xffff}}, // 2489, depth=1 +{0xffffffe3ffffffff, -1,{0xffff,0x16fc}}, // 2490 +{0x000003ffff000000, -1,{0xffff,0x1a11}}, // 2491 +{0x0000000001e001e0, 2236,{0x02e3,0xffff}}, // 2492, depth=2 +{0xf00000000000007f, -1,{0xffff,0x110a}}, // 2493 +{0x00007fffffffff00, -1,{0xffff,0x1e26}}, // 2494, depth=1 +{0xf00000007fffffff, 2241,{0xffff,0x1122}}, // 2495, depth=2 +{0x00fff00000fff000, 2251,{0xffff,0x050b}}, // 2496, depth=2 +{0x00000000fe007fff, 2252,{0x01d5,0xffff}}, // 2497, depth=3 +{0x0007fe0000000000, -1,{0xffff,0x15c9}}, // 2498, depth=1 +{0xfffffffc0007ffff, -1,{0xffff,0x17b0}}, // 2499, depth=1 +{0xfffe03fffffe03ff, -1,{0xffff,0x03d8}}, // 2500 +{0xfbffffffffffffff, -1,{0xffff,0x117e}}, // 2501 +{0x003fffc0003fffc0, -1,{0xffff,0x068f}}, // 2502, depth=1 +{0xfc00000000000000, -1,{0xffff,0x1185}}, // 2503 +{0x00003fffffffe000, -1,{0xffff,0x1ce0}}, // 2504, depth=1 +{0xffff800fffffffff, -1,{0xffff,0x1474}}, // 2505, depth=1 +{0x000000000ffe0000, -1,{0x03ca,0x1bca}}, // 2506, depth=1 +{0xfffffff80003ffff, 2508,{0xffff,0x176e}}, // 2507 +{0xfc00000000000001, -1,{0xffff,0x1186}}, // 2508 +{0xffffffffffc03fff, 2510,{0xffff,0x1ab7}}, // 2509 +{0xfffe0fffffffffff, 2512,{0xffff,0x13fa}}, // 2510 +{0xfffff000000000ff, -1,{0xffff,0x151b}}, // 2511, depth=1 +{0xfc00000000000003, -1,{0xffff,0x1187}}, // 2512 +{0xc00007ffc00007ff, 2266,{0xffff,0x008c}}, // 2513, depth=3 +{0x000003ffff800000, -1,{0xffff,0x1a52}}, // 2514, depth=1 +{0xf87fffffffffffff, -1,{0xffff,0x117b}}, // 2515, depth=1 +{0xff800000007fffff, 2517,{0xffff,0x125f}}, // 2516 +{0x00000000ffe00007, -1,{0x02cd,0xffff}}, // 2517 +{0x00000fffffc00000, -1,{0xffff,0x1a95}}, // 2518 +{0xffff00000000ffff, -1,{0xffff,0x141f}}, // 2519 +{0x0ff800000ff80000, 2270,{0xffff,0x0348}}, // 2520, depth=3 +{0xfc000000007fffff, -1,{0xffff,0x119c}}, // 2521, depth=1 +{0x00000000001ffe00, 2276,{0x05cb,0x1dcb}}, // 2522, depth=2 +{0xfffffc007fffffff, -1,{0xffff,0x15b4}}, // 2523, depth=1 +{0x0000f00000000000, 2529,{0xffff,0x1503}}, // 2524 +{0xffff07ffffff07ff, -1,{0xffff,0x041a}}, // 2525, depth=1 +{0x00000000007f0000, -1,{0x0406,0x1c06}}, // 2526, depth=1 +{0x00000000ff07ffff, 2285,{0x021a,0xffff}}, // 2527, depth=2 +{0x07fffc0007fffc00, -1,{0xffff,0x0590}}, // 2528, depth=1 +{0x01fffff801fffff8, -1,{0xffff,0x0755}}, // 2529 +{0x01fffffc00000000, 2286,{0xffff,0x1796}}, // 2530, depth=2 +{0xffffffc1ffffffc1, -1,{0xffff,0x069a}}, // 2531 +{0x007f000000000000, -1,{0xffff,0x1406}}, // 2532, depth=1 +{0xf0000000003fffff, 2288,{0xffff,0x1119}}, // 2533, depth=2 +{0x07ffffffffff8000, -1,{0xffff,0x1c6b}}, // 2534, depth=1 +{0xffffff8fffffff8f, 2289,{0xffff,0x065c}}, // 2535, depth=2 +{0x0007f8000007f800, -1,{0xffff,0x0547}}, // 2536, depth=1 +{0x000000000f0f0f0f, -1,{0x0033,0xffff}}, // 2537, depth=1 +{0x7fffffffffe00000, -1,{0xffff,0x1ae9}}, // 2538, depth=1 +{0x01fff80000000000, -1,{0xffff,0x154d}}, // 2539 +{0x1c001c001c001c00, 2291,{0xffff,0x01a2}}, // 2540, depth=2 +{0xffe000003fffffff, -1,{0xffff,0x12e8}}, // 2541 +{0x0fffffffff800000, -1,{0xffff,0x1a64}}, // 2542, depth=1 +{0xffffff80000001ff, -1,{0xffff,0x1661}}, // 2543 +{0x0000007fffffffc0, -1,{0xffff,0x1ea0}}, // 2544, depth=1 +{0x00000000fc01ffff, 2292,{0x0196,0xffff}}, // 2545, depth=2 +{0x00000fffffffff80, -1,{0xffff,0x1e64}}, // 2546, depth=1 +{0xfff003fffff003ff, -1,{0xffff,0x0315}}, // 2547, depth=1 +{0xfffffc000000007f, 2549,{0xffff,0x159c}}, // 2548 +{0xff00000007ffffff, -1,{0xffff,0x1222}}, // 2549 +{0x0000003c0000003c, -1,{0xffff,0x0783}}, // 2550 +{0xf00003fff00003ff, -1,{0xffff,0x010d}}, // 2551 +{0xfffe0007fffe0007, -1,{0xffff,0x03d1}}, // 2552 +{0xff81ffffff81ffff, 2293,{0xffff,0x0259}}, // 2553, depth=2 +{0x00f000f000f000f0, 2294,{0xffff,0x0323}}, // 2554, depth=2 +{0xfffffffe0000ffff, -1,{0xffff,0x17ee}}, // 2555 +{0x03fffffe00000000, -1,{0xffff,0x17d8}}, // 2556 +{0xffffffffffff03ff, -1,{0xffff,0x1c39}}, // 2557, depth=1 +{0x00000fff80000000, -1,{0xffff,0x184c}}, // 2558 +{0xfffffffffff800ff, 2560,{0xffff,0x1b74}}, // 2559 +{0xfe0000ffffffffff, -1,{0xffff,0x11ee}}, // 2560 +{0x00000000c001c001, 2298,{0x00a2,0xffff}}, // 2561, depth=3 +{0x000003e0000003e0, -1,{0xffff,0x06c4}}, // 2562, depth=1 +{0xfffc003fffffffff, 2565,{0xffff,0x13b3}}, // 2563 +{0x0001fc0000000000, -1,{0xffff,0x1586}}, // 2564, depth=1 +{0xffe000001fffffff, -1,{0xffff,0x12e7}}, // 2565 +{0x0000000060606060, -1,{0x00f1,0xffff}}, // 2566, depth=1 +{0xfc0000000000003f, -1,{0xffff,0x118b}}, // 2567 +{0xfffffffffffff807, 2570,{0xffff,0x1d77}}, // 2568 +{0xffe0ffffffe0ffff, -1,{0xffff,0x02da}}, // 2569, depth=1 +{0xffffffc1ffffffff, 2573,{0xffff,0x16ba}}, // 2570 +{0x00000000fffc0fff, -1,{0x0399,0xffff}}, // 2571, depth=1 +{0x000000000ffffe00, -1,{0x05d2,0x1dd2}}, // 2572, depth=1 +{0xfffff1fffffff1ff, -1,{0xffff,0x051c}}, // 2573 +{0x7ff800007ff80000, -1,{0xffff,0x034b}}, // 2574, depth=1 +{0x0000ff8000000000, -1,{0xffff,0x1648}}, // 2575 +{0x00000000000ff800, 2303,{0x0548,0x1d48}}, // 2576, depth=2 +{0xc000000fc000000f, 2313,{0xffff,0x0085}}, // 2577, depth=3 +{0x0000003ffff00000, -1,{0xffff,0x1b11}}, // 2578 +{0xfff00007fff00007, -1,{0xffff,0x030e}}, // 2579, depth=1 +{0x00001ffc00001ffc, -1,{0xffff,0x078a}}, // 2580, depth=1 +{0xfffff00fffffffff, -1,{0xffff,0x1537}}, // 2581, depth=1 +{0x0000000003f803f8, -1,{0x0366,0xffff}}, // 2582, depth=1 +{0x7ffff00000000000, -1,{0xffff,0x1512}}, // 2583 +{0x0000000fffffc000, -1,{0xffff,0x1c95}}, // 2584, depth=1 +{0xffffff800001ffff, -1,{0xffff,0x1669}}, // 2585 +{0x000000fffff80000, -1,{0xffff,0x1b54}}, // 2586 +{0xf00000003fffffff, -1,{0xffff,0x1121}}, // 2587, depth=1 +{0x000000001e001e00, -1,{0x01e3,0xffff}}, // 2588, depth=1 +{0xffff000fffff000f, -1,{0xffff,0x0413}}, // 2589, depth=1 +{0x000003ff00000000, -1,{0xffff,0x1809}}, // 2590, depth=1 +{0x00003fff00003fff, -1,{0xffff,0x000d}}, // 2591, depth=1 +{0x001fffffff000000, 2324,{0xffff,0x1a1c}}, // 2592, depth=2 +{0x80ffffff80ffffff, -1,{0xffff,0x0058}}, // 2593, depth=1 +{0x000ffffffff00000, -1,{0xffff,0x1b1f}}, // 2594, depth=1 +{0xfffc0000000003ff, -1,{0xffff,0x1397}}, // 2595, depth=1 +{0x0000000000e00000, 2327,{0x02c2,0x1ac2}}, // 2596, depth=2 +{0xff00003fffffffff, -1,{0xffff,0x122d}}, // 2597, depth=1 +{0x0fffff800fffff80, -1,{0xffff,0x0654}}, // 2598, depth=1 +{0xfffffffffffff81f, -1,{0xffff,0x1d79}}, // 2599 +{0x0000007ffffffff8, -1,{0xffff,0x1f63}}, // 2600, depth=1 +{0x00000000e3ffe3ff, -1,{0x00ec,0xffff}}, // 2601, depth=1 +{0x000001c000000000, -1,{0xffff,0x1682}}, // 2602 +{0x3fff3fff3fff3fff, -1,{0xffff,0x002d}}, // 2603, depth=1 +{0x0000007ffffffffc, -1,{0xffff,0x1fa4}}, // 2604, depth=1 +{0xffffffffffe003ff, 2609,{0xffff,0x1af4}}, // 2605 +{0x0000007ffffffffe, -1,{0xffff,0x1fe5}}, // 2606, depth=1 +{0x00000000fe07fe07, 2328,{0x01e9,0xffff}}, // 2607, depth=2 +{0x3f003f003f003f00, 2330,{0xffff,0x0225}}, // 2608, depth=2 +{0xf80003ffffffffff, 2613,{0xffff,0x116e}}, // 2609 +{0x0e0e0e0e0e0e0e0e, 2341,{0xffff,0x01f2}}, // 2610, depth=2 +{0xffc0000000007fff, -1,{0xffff,0x1298}}, // 2611, depth=1 +{0x00fffffffffffc00, -1,{0xffff,0x1dad}}, // 2612, depth=1 +{0x00000000fff07fff, -1,{0x031a,0xffff}}, // 2613 +{0xfffefffefffefffe, -1,{0xffff,0x03ee}}, // 2614, depth=1 +{0x00000000f03fffff, 2343,{0x0119,0xffff}}, // 2615, depth=3 +{0xffe0000000000001, -1,{0xffff,0x12cb}}, // 2616 +{0xfffffffffff7ffff, -1,{0xffff,0x1b3e}}, // 2617, depth=1 +{0x0fffffff00000000, 2346,{0xffff,0x181b}}, // 2618, depth=2 +{0xfefffefffefffeff, 2347,{0xffff,0x01ee}}, // 2619, depth=2 +{0x0007fffffffff000, -1,{0xffff,0x1d26}}, // 2620, depth=1 +{0xfffffffffff80003, -1,{0xffff,0x1b6e}}, // 2621, depth=1 +{0x00007fffffffff80, -1,{0xffff,0x1e67}}, // 2622, depth=1 +{0xffe0007fffe0007f, -1,{0xffff,0x02d1}}, // 2623, depth=1 +{0xfe00fe00fe00fe00, -1,{0xffff,0x01e6}}, // 2624, depth=1 +{0xfffffffffff80007, -1,{0xffff,0x1b6f}}, // 2625, depth=1 +{0xfff000ffffffffff, -1,{0xffff,0x1333}}, // 2626 +{0x80000007ffffffff, -1,{0xffff,0x1063}}, // 2627, depth=1 +{0x0001ff800001ff80, -1,{0xffff,0x0649}}, // 2628, depth=1 +{0xfc0000007fffffff, 2351,{0xffff,0x11a4}}, // 2629, depth=2 +{0x07ffffc000000000, -1,{0xffff,0x1694}}, // 2630 +{0x3fffffffffc00000, -1,{0xffff,0x1aa7}}, // 2631 +{0x00f0000000000000, -1,{0xffff,0x1303}}, // 2632, depth=1 +{0xf00000001fffffff, 2354,{0xffff,0x1120}}, // 2633, depth=2 +{0x000000007fff0000, -1,{0x040e,0x1c0e}}, // 2634, depth=1 +{0xf0000000000000ff, -1,{0xffff,0x110b}}, // 2635 +{0x000f0000000f0000, -1,{0xffff,0x0403}}, // 2636 +{0xffffffffffffe001, -1,{0xffff,0x1cf3}}, // 2637 +{0xffffffffffffe003, -1,{0xffff,0x1cf4}}, // 2638 +{0xfffc3ffffffc3fff, 2356,{0xffff,0x039b}}, // 2639, depth=2 +{0xffffffffffc00fff, -1,{0xffff,0x1ab5}}, // 2640 +{0x1ffffffff8000000, 2643,{0xffff,0x1961}}, // 2641 +{0x00000fffffffffe0, -1,{0xffff,0x1ee6}}, // 2642, depth=1 +{0x000003fe00000000, -1,{0xffff,0x17c8}}, // 2643 +{0xffffffff03ffffff, 2650,{0xffff,0x1839}}, // 2644 +{0xc007ffffffffffff, -1,{0xffff,0x10b4}}, // 2645, depth=1 +{0x00000000000fe000, -1,{0x04c6,0x1cc6}}, // 2646, depth=1 +{0xf0fffffff0ffffff, 2358,{0xffff,0x011b}}, // 2647, depth=2 +{0x01fffffffff00000, -1,{0xffff,0x1b24}}, // 2648, depth=1 +{0xfffffffffff8001f, -1,{0xffff,0x1b71}}, // 2649, depth=1 +{0xffc00000000007ff, -1,{0xffff,0x1294}}, // 2650 +{0xe00003ffffffffff, -1,{0xffff,0x10ec}}, // 2651, depth=1 +{0x0fff00000fff0000, 2359,{0xffff,0x040b}}, // 2652, depth=2 +{0x00000000007f007f, -1,{0x0026,0xffff}}, // 2653, depth=1 +{0x0000007fe0000000, -1,{0xffff,0x18c9}}, // 2654, depth=1 +{0xc0000000000001ff, -1,{0xffff,0x108a}}, // 2655, depth=1 +{0xffffffffff803fff, -1,{0xffff,0x1a76}}, // 2656 +{0xfff807ffffffffff, -1,{0xffff,0x1377}}, // 2657, depth=1 +{0x3fffffffffffff80, 2361,{0xffff,0x1e76}}, // 2658, depth=2 +{0x7fffff8000000000, -1,{0xffff,0x1657}}, // 2659 +{0x00000fffff800000, -1,{0xffff,0x1a54}}, // 2660 +{0xff8000ffff8000ff, 2362,{0xffff,0x0250}}, // 2661, depth=2 +{0x0000000ffc000000, -1,{0xffff,0x1989}}, // 2662, depth=1 +{0x3fffffff80000000, -1,{0xffff,0x185e}}, // 2663 +{0x03ffe00000000000, -1,{0xffff,0x14cc}}, // 2664 +{0xffffe0000fffffff, -1,{0xffff,0x14ee}}, // 2665, depth=1 +{0x00000ffffffffff8, -1,{0xffff,0x1f68}}, // 2666, depth=1 +{0xfc000000003fffff, -1,{0xffff,0x119b}}, // 2667, depth=1 +{0xffffffffffffe01f, 2677,{0xffff,0x1cf7}}, // 2668 +{0xff800001ff800001, 2363,{0xffff,0x0249}}, // 2669, depth=2 +{0x00000ffffffffffc, -1,{0xffff,0x1fa9}}, // 2670, depth=1 +{0xfff80ffffff80fff, -1,{0xffff,0x0358}}, // 2671, depth=1 +{0x00000000003f0000, 2364,{0x0405,0x1c05}}, // 2672, depth=2 +{0x00000fffffffffff, -1,{0xffff,0x102b}}, // 2673, depth=1 +{0x0000100000000000, -1,{0xffff,0x1500}}, // 2674, depth=1 +{0xf800000000001fff, -1,{0xffff,0x1151}}, // 2675, depth=1 +{0x000001fff8000000, -1,{0xffff,0x194d}}, // 2676, depth=1 +{0xffffff07ffffffff, -1,{0xffff,0x163a}}, // 2677 +{0x00ffffe000000000, -1,{0xffff,0x16d2}}, // 2678 +{0xefffffffffffffff, -1,{0xffff,0x10fe}}, // 2679, depth=1 +{0x001c001c001c001c, 2366,{0xffff,0x03a2}}, // 2680, depth=2 +{0xf000000000000001, 2369,{0xffff,0x1104}}, // 2681, depth=2 +{0x0001000000010000, 2370,{0xffff,0x0400}}, // 2682, depth=2 +{0xf000000000000003, 2371,{0xffff,0x1105}}, // 2683, depth=2 +{0x007fe00000000000, -1,{0xffff,0x14c9}}, // 2684, depth=1 +{0xffffffffc3ffffff, -1,{0xffff,0x18bb}}, // 2685, depth=1 +{0x00007fffffffffc0, -1,{0xffff,0x1ea8}}, // 2686, depth=1 +{0xf000000000000007, 2373,{0xffff,0x1106}}, // 2687, depth=2 +{0x007ffffffe000000, -1,{0xffff,0x19dd}}, // 2688 +{0xfffffe0000001fff, -1,{0xffff,0x15e3}}, // 2689, depth=1 +{0x07fffffff8000000, -1,{0xffff,0x195f}}, // 2690, depth=1 +{0x8f8f8f8f8f8f8f8f, 2374,{0xffff,0x0074}}, // 2691, depth=2 +{0x00000007fffe0000, -1,{0xffff,0x1bd1}}, // 2692, depth=1 +{0xff00000000007fff, -1,{0xffff,0x1216}}, // 2693 +{0x4000000040000000, 2378,{0xffff,0x0080}}, // 2694, depth=2 +{0xfe3ffffffe3fffff, 2379,{0xffff,0x01dc}}, // 2695, depth=4 +{0x000000000001f000, -1,{0x0504,0x1d04}}, // 2696, depth=1 +{0x80ffffffffffffff, -1,{0xffff,0x1078}}, // 2697 +{0x0060000000600000, -1,{0xffff,0x02c1}}, // 2698, depth=1 +{0xe0003fffe0003fff, 2386,{0xffff,0x00d0}}, // 2699, depth=2 +{0x0000007fc0000000, 2388,{0xffff,0x1888}}, // 2700, depth=2 +{0xffe7ffffffe7ffff, -1,{0xffff,0x02dd}}, // 2701, depth=1 +{0xfe001fffffffffff, -1,{0xffff,0x11f3}}, // 2702 +{0xfe00000001ffffff, -1,{0xffff,0x11df}}, // 2703, depth=1 +{0x000000003ffc3ffc, -1,{0x03ab,0xffff}}, // 2704, depth=1 +{0x00000000ffff00ff, 2390,{0x0417,0xffff}}, // 2705, depth=3 +{0x7fff00007fff0000, 2398,{0xffff,0x040e}}, // 2706, depth=2 +{0xfffffbffffffffff, -1,{0xffff,0x157e}}, // 2707, depth=1 +{0xfffffc0000000000, -1,{0xffff,0x1595}}, // 2708, depth=1 +{0xfffffc0000000001, -1,{0xffff,0x1596}}, // 2709, depth=1 +{0x0000000006000000, 2400,{0x01c1,0x19c1}}, // 2710, depth=2 +{0x00000000e01fffff, 2405,{0x00d7,0xffff}}, // 2711, depth=3 +{0x003fffc000000000, -1,{0xffff,0x168f}}, // 2712, depth=1 +{0x00000000f80fffff, -1,{0x0158,0xffff}}, // 2713, depth=1 +{0x001fff0000000000, -1,{0xffff,0x160c}}, // 2714 +{0x8003ffffffffffff, 2411,{0xffff,0x1072}}, // 2715, depth=2 +{0x03fffff803fffff8, -1,{0xffff,0x0756}}, // 2716, depth=1 +{0xffffffffe0003fff, -1,{0xffff,0x18f0}}, // 2717, depth=1 +{0x00007fffffffffe0, -1,{0xffff,0x1ee9}}, // 2718, depth=1 +{0xfffffffffffff87f, 2724,{0xffff,0x1d7b}}, // 2719 +{0x00000fffe0000000, -1,{0xffff,0x18ce}}, // 2720, depth=1 +{0xc00000000001ffff, 2412,{0xffff,0x1092}}, // 2721, depth=2 +{0x0700000007000000, 2413,{0xffff,0x0202}}, // 2722, depth=4 +{0xfffffc000000000f, -1,{0xffff,0x1599}}, // 2723, depth=1 +{0xf80000000007ffff, -1,{0xffff,0x1157}}, // 2724 +{0x007ffe00007ffe00, -1,{0xffff,0x05cd}}, // 2725 +{0x000000003fff0000, -1,{0x040d,0x1c0d}}, // 2726, depth=1 +{0xfffc00000003ffff, -1,{0xffff,0x139f}}, // 2727, depth=1 +{0xff8000003fffffff, -1,{0xffff,0x1266}}, // 2728 +{0x00000000ff1fff1f, -1,{0x022c,0xffff}}, // 2729 +{0x00000000001ffff8, -1,{0x0751,0x1f51}}, // 2730 +{0xfffffffffc001fff, -1,{0xffff,0x19b2}}, // 2731 +{0x0003fff000000000, -1,{0xffff,0x170d}}, // 2732 +{0xfffffc0fffffffff, -1,{0xffff,0x15b9}}, // 2733 +{0x0000000001f80000, 2420,{0x0345,0x1b45}}, // 2734, depth=2 +{0x00000000003f003f, 2421,{0x0025,0xffff}}, // 2735, depth=2 +{0x0000008000000080, 2422,{0xffff,0x0640}}, // 2736, depth=2 +{0xffc3ffc3ffc3ffc3, 2426,{0xffff,0x02ab}}, // 2737, depth=2 +{0x0001fffffffff800, -1,{0xffff,0x1d65}}, // 2738, depth=1 +{0xfffffc000000001f, -1,{0xffff,0x159a}}, // 2739, depth=1 +{0x00001f8000000000, -1,{0xffff,0x1645}}, // 2740, depth=1 +{0xe00000000007ffff, -1,{0xffff,0x10d5}}, // 2741, depth=1 +{0x00007ffffffffff8, -1,{0xffff,0x1f6b}}, // 2742, depth=1 +{0xf00000000000003f, 2428,{0xffff,0x1109}}, // 2743, depth=2 +{0x001ffffe00000000, -1,{0xffff,0x17d3}}, // 2744, depth=1 +{0xf8000000000007ff, 2429,{0xffff,0x114f}}, // 2745, depth=2 +{0x000007ffffff8000, 2436,{0xffff,0x1c5b}}, // 2746, depth=2 +{0xffffff00001fffff, -1,{0xffff,0x162c}}, // 2747, depth=1 +{0x03fffc0003fffc00, 2438,{0xffff,0x058f}}, // 2748, depth=2 +{0x00007fffffffffff, 2439,{0xffff,0x102e}}, // 2749, depth=2 +{0x0000800000000000, -1,{0xffff,0x1440}}, // 2750, depth=1 +{0xfffe007fffffffff, -1,{0xffff,0x13f5}}, // 2751, depth=1 +{0x00001ffffff80000, 2755,{0xffff,0x1b59}}, // 2752 +{0x800000000000ffff, -1,{0xffff,0x1050}}, // 2753, depth=1 +{0x0000007fffc00000, 2440,{0xffff,0x1a90}}, // 2754, depth=2 +{0xff800000ff800000, -1,{0xffff,0x0248}}, // 2755 +{0xe000007fffffffff, -1,{0xffff,0x10e9}}, // 2756 +{0x00000000800f800f, 2442,{0x0064,0xffff}}, // 2757, depth=4 +{0x003fe000003fe000, 2454,{0xffff,0x04c8}}, // 2758, depth=2 +{0xffffc0000007ffff, 2458,{0xffff,0x14a4}}, // 2759, depth=2 +{0x0007ffffffffc000, -1,{0xffff,0x1ca4}}, // 2760, depth=1 +{0x00000000efffffff, -1,{0x00de,0xffff}}, // 2761, depth=1 +{0x00000000f0000000, -1,{0x0103,0x1903}}, // 2762, depth=1 +{0x00000000f0000001, 2459,{0x0104,0xffff}}, // 2763, depth=2 +{0x00000003ffffe000, -1,{0xffff,0x1cd4}}, // 2764, depth=1 +{0x00000000f0000003, -1,{0x0105,0xffff}}, // 2765, depth=1 +{0x00000fffc0000000, -1,{0xffff,0x188d}}, // 2766, depth=1 +{0xfc0000001fffffff, 2462,{0xffff,0x11a2}}, // 2767, depth=2 +{0x07ffff8007ffff80, -1,{0xffff,0x0653}}, // 2768 +{0x00000000f0000007, -1,{0x0106,0xffff}}, // 2769, depth=1 +{0x0000001ffffff000, 2464,{0xffff,0x1d18}}, // 2770, depth=2 +{0xfffffc000000003f, -1,{0xffff,0x159b}}, // 2771, depth=1 +{0x000000001fff0000, -1,{0x040c,0x1c0c}}, // 2772, depth=1 +{0x00000000fffff3ff, -1,{0x051d,0xffff}}, // 2773, depth=1 +{0x00fff80000fff800, 2467,{0xffff,0x054c}}, // 2774, depth=2 +{0xffe00000003fffff, -1,{0xffff,0x12e0}}, // 2775, depth=1 +{0x00000000fefefefe, 2468,{0x01f6,0xffff}}, // 2776, depth=2 +{0x00000000f000000f, 2470,{0x0107,0xffff}}, // 2777, depth=4 +{0x00000000001fff00, 2478,{0x060c,0x1e0c}}, // 2778, depth=2 +{0x00000000ffdfffdf, -1,{0x02ae,0xffff}}, // 2779, depth=1 +{0x0003fffffffe0000, -1,{0xffff,0x1be0}}, // 2780, depth=1 +{0x00007fffff800000, -1,{0xffff,0x1a57}}, // 2781 +{0x3ffffffffffffffc, -1,{0xffff,0x1fbb}}, // 2782, depth=1 +{0xffe000000000007f, -1,{0xffff,0x12d1}}, // 2783 +{0x00003fffffff8000, 2482,{0xffff,0x1c5e}}, // 2784, depth=2 +{0x3fffffffffffffff, -1,{0xffff,0x103d}}, // 2785, depth=1 +{0x4000000000000000, -1,{0xffff,0x1080}}, // 2786, depth=1 +{0x800003ff800003ff, -1,{0xffff,0x004a}}, // 2787, depth=1 +{0xffffffffffe3ffff, -1,{0xffff,0x1afc}}, // 2788 +{0x000000000fffffe0, -1,{0x06d6,0x1ed6}}, // 2789 +{0x01ffc00000000000, -1,{0xffff,0x148a}}, // 2790, depth=1 +{0xc0000fffc0000fff, -1,{0xffff,0x008d}}, // 2791, depth=1 +{0x0000007f80000000, -1,{0xffff,0x1847}}, // 2792, depth=1 +{0x00000000f000001f, -1,{0x0108,0xffff}}, // 2793, depth=1 +{0x000000000ffffff0, -1,{0x0717,0x1f17}}, // 2794 +{0xc000001fffffffff, -1,{0xffff,0x10a6}}, // 2795, depth=1 +{0x00007fffe0000000, -1,{0xffff,0x18d1}}, // 2796, depth=1 +{0xfffff8000007ffff, 2483,{0xffff,0x1567}}, // 2797, depth=2 +{0x00e000e000e000e0, -1,{0xffff,0x02e2}}, // 2798, depth=1 +{0xfff8001ffff8001f, -1,{0xffff,0x0351}}, // 2799, depth=1 +{0xfc000000000000ff, -1,{0xffff,0x118d}}, // 2800 +{0x07fffffffffc0000, -1,{0xffff,0x1ba8}}, // 2801 +{0x1fffffffffff8000, -1,{0xffff,0x1c6d}}, // 2802, depth=1 +{0xffff0fffffff0fff, 2487,{0xffff,0x041b}}, // 2803, depth=2 +{0x3e0000003e000000, -1,{0xffff,0x01c4}}, // 2804, depth=1 +{0xfc3ffffffc3fffff, 2490,{0xffff,0x019b}}, // 2805, depth=2 +{0x6060606060606060, 2491,{0xffff,0x00f1}}, // 2806, depth=2 +{0x00000000cfffffff, 2493,{0x009d,0xffff}}, // 2807, depth=2 +{0x0001ffffffffe000, -1,{0xffff,0x1ce3}}, // 2808, depth=1 +{0x000000000ffffffc, -1,{0x0799,0x1f99}}, // 2809 +{0xffffe001ffffe001, -1,{0xffff,0x04d3}}, // 2810 +{0x00000000ffdfffff, 2500,{0x029e,0xffff}}, // 2811, depth=2 +{0x00000000ffe00000, -1,{0x02ca,0x1aca}}, // 2812, depth=1 +{0x00000000ffe00001, 2501,{0x02cb,0xffff}}, // 2813, depth=2 +{0x0008000000080000, 2503,{0xffff,0x0340}}, // 2814, depth=2 +{0x00000000ffe00003, 2507,{0x02cc,0xffff}}, // 2815, depth=3 +{0x007fff0000000000, -1,{0xffff,0x160e}}, // 2816, depth=1 +{0xff8fffffff8fffff, 2509,{0xffff,0x025c}}, // 2817, depth=4 +{0x001fc000001fc000, -1,{0xffff,0x0486}}, // 2818, depth=1 +{0x8000000780000007, 2516,{0xffff,0x0043}}, // 2819, depth=3 +{0x0000000000e000e0, 2518,{0x02e2,0xffff}}, // 2820, depth=2 +{0xfc00000000000007, -1,{0xffff,0x1188}}, // 2821, depth=1 +{0x7fff800000000000, -1,{0xffff,0x144f}}, // 2822, depth=1 +{0x0001ffffffff8000, 2824,{0xffff,0x1c61}}, // 2823 +{0x000000007ff07ff0, -1,{0x032a,0xffff}}, // 2824 +{0x00000000f000003f, 2519,{0x0109,0xffff}}, // 2825, depth=2 +{0x000000007c007c00, 2524,{0x01a4,0xffff}}, // 2826, depth=3 +{0x00000000ffe0000f, 2531,{0x02ce,0xffff}}, // 2827, depth=2 +{0x000000000fffff00, 2539,{0x0613,0x1e13}}, // 2828, depth=2 +{0xfc0000000000000f, 2541,{0xffff,0x1189}}, // 2829, depth=2 +{0x03ff000000000000, -1,{0xffff,0x1409}}, // 2830, depth=1 +{0xffff801fffffffff, -1,{0xffff,0x1475}}, // 2831, depth=1 +{0x3fffffffe0000000, -1,{0xffff,0x18e0}}, // 2832, depth=1 +{0xfffff0000001ffff, 2543,{0xffff,0x1524}}, // 2833, depth=2 +{0x0fffffffff000000, -1,{0xffff,0x1a23}}, // 2834, depth=1 +{0x00000000f801f801, 2548,{0x0165,0xffff}}, // 2835, depth=3 +{0x000000000001c000, 2550,{0x0482,0x1c82}}, // 2836, depth=2 +{0xfff80000000fffff, -1,{0xffff,0x1360}}, // 2837, depth=1 +{0x0007fffffc000000, -1,{0xffff,0x1998}}, // 2838, depth=1 +{0xffffffffff800fff, 2840,{0xffff,0x1a74}}, // 2839 +{0xe0000fffffffffff, -1,{0xffff,0x10ee}}, // 2840 +{0x0000000007070707, 2551,{0x0032,0xffff}}, // 2841, depth=2 +{0x00007fffc0000000, -1,{0xffff,0x1890}}, // 2842, depth=1 +{0x00000000ffe0001f, 2552,{0x02cf,0xffff}}, // 2843, depth=2 +{0x0ffc0ffc0ffc0ffc, -1,{0xffff,0x03a9}}, // 2844, depth=1 +{0xfc0000000000001f, -1,{0xffff,0x118a}}, // 2845, depth=1 +{0x0003fffffffffe00, -1,{0xffff,0x1de8}}, // 2846, depth=1 +{0x00000000fe0007ff, 2555,{0x01d1,0xffff}}, // 2847, depth=2 +{0xffffffe001ffffff, -1,{0xffff,0x16f3}}, // 2848 +{0x00000000801fffff, -1,{0x0055,0xffff}}, // 2849, depth=1 +{0x0fffc0000fffc000, -1,{0xffff,0x048d}}, // 2850 +{0xffffe007ffffffff, -1,{0xffff,0x14f5}}, // 2851, depth=1 +{0x00000000fcfcfcfc, 2556,{0x01b5,0xffff}}, // 2852, depth=2 +{0xff7fffffffffffff, -1,{0xffff,0x123e}}, // 2853 +{0x0000000003fffc00, -1,{0x058f,0x1d8f}}, // 2854, depth=1 +{0xffffffff80003fff, -1,{0xffff,0x186e}}, // 2855, depth=1 +{0xfffc000007ffffff, -1,{0xffff,0x13a8}}, // 2856 +{0xffffffffe0000fff, -1,{0xffff,0x18ee}}, // 2857, depth=1 +{0x01fffc0001fffc00, 2558,{0xffff,0x058e}}, // 2858, depth=2 +{0xff80000000000007, 2862,{0xffff,0x124b}}, // 2859 +{0x003ffffffffc0000, -1,{0xffff,0x1ba3}}, // 2860, depth=1 +{0x00000000ff9fff9f, -1,{0x026d,0xffff}}, // 2861, depth=1 +{0xfffffff3fffffff3, -1,{0xffff,0x071d}}, // 2862 +{0x00f8000000000000, 2865,{0xffff,0x1344}}, // 2863 +{0x0c000c000c000c00, -1,{0xffff,0x01a1}}, // 2864, depth=1 +{0x000000001fe00000, -1,{0x02c7,0x1ac7}}, // 2865 +{0xffc003ffffffffff, 2867,{0xffff,0x12b3}}, // 2866 +{0xfe000001ffffffff, -1,{0xffff,0x11e7}}, // 2867 +{0xfc00000fffffffff, -1,{0xffff,0x11a9}}, // 2868 +{0xfffffffff00003ff, -1,{0xffff,0x192d}}, // 2869, depth=1 +{0x000007c000000000, 2871,{0xffff,0x1684}}, // 2870 +{0x000000000000ff00, -1,{0x0607,0x1e07}}, // 2871 +{0xfe00ffffffffffff, -1,{0xffff,0x11f6}}, // 2872 +{0xf0000007f0000007, 2559,{0xffff,0x0106}}, // 2873, depth=3 +{0x001fe00000000000, -1,{0xffff,0x14c7}}, // 2874, depth=1 +{0x00000000ffe0003f, 2563,{0x02d0,0xffff}}, // 2875, depth=3 +{0xc0000000000003ff, -1,{0xffff,0x108b}}, // 2876 +{0xffffff9fffffff9f, 2567,{0xffff,0x065d}}, // 2877, depth=2 +{0x3fffffffc0000000, -1,{0xffff,0x189f}}, // 2878, depth=1 +{0x01fffffffffff000, -1,{0xffff,0x1d2c}}, // 2879 +{0xfffe0000001fffff, -1,{0xffff,0x13e3}}, // 2880 +{0xfffffffffffff7ff, -1,{0xffff,0x1d3e}}, // 2881, depth=1 +{0xfffffffffffff800, -1,{0xffff,0x1d74}}, // 2882, depth=1 +{0xfffffffffffff801, -1,{0xffff,0x1d75}}, // 2883, depth=1 +{0x000000000000fe00, -1,{0x05c6,0x1dc6}}, // 2884, depth=1 +{0xfffffffffffff803, -1,{0xffff,0x1d76}}, // 2885, depth=1 +{0xffffffff00000fff, -1,{0xffff,0x182b}}, // 2886 +{0xe1e1e1e1e1e1e1e1, -1,{0xffff,0x00f3}}, // 2887, depth=1 +{0x0000000000600000, -1,{0x02c1,0x1ac1}}, // 2888, depth=1 +{0x00000000f000007f, 2568,{0x010a,0xffff}}, // 2889, depth=4 +{0xf007ffffffffffff, -1,{0xffff,0x1136}}, // 2890 +{0xffc0000000001fff, -1,{0xffff,0x1296}}, // 2891, depth=1 +{0x000fff80000fff80, 2575,{0xffff,0x064c}}, // 2892, depth=2 +{0xfffe7fffffffffff, -1,{0xffff,0x13fd}}, // 2893, depth=1 +{0x0606060606060606, 2578,{0xffff,0x01f1}}, // 2894, depth=2 +{0x0000007fff000000, -1,{0xffff,0x1a0e}}, // 2895 +{0x00007fffffc00000, -1,{0xffff,0x1a98}}, // 2896, depth=1 +{0xfffffffffffff80f, -1,{0xffff,0x1d78}}, // 2897, depth=1 +{0x0000000030003000, 2583,{0x0121,0xffff}}, // 2898, depth=2 +{0x000000008fffffff, 2585,{0x005c,0xffff}}, // 2899, depth=2 +{0x0000007fff800000, -1,{0xffff,0x1a4f}}, // 2900, depth=1 +{0x000001fffffffc00, -1,{0xffff,0x1d9e}}, // 2901 +{0x000007fff8000000, -1,{0xffff,0x194f}}, // 2902, depth=1 +{0xffffffffc0000fff, -1,{0xffff,0x18ad}}, // 2903, depth=1 +{0x000003f0000003f0, 2586,{0xffff,0x0705}}, // 2904, depth=2 +{0xfffff003fffff003, -1,{0xffff,0x0515}}, // 2905, depth=1 +{0x00000000001fff80, -1,{0x064d,0x1e4d}}, // 2906, depth=1 +{0xfffff01fffffffff, -1,{0xffff,0x1538}}, // 2907, depth=1 +{0xfffffff807ffffff, -1,{0xffff,0x1777}}, // 2908 +{0xfff0ffffffffffff, 2911,{0xffff,0x133b}}, // 2909 +{0x0000001fffffc000, -1,{0xffff,0x1c96}}, // 2910, depth=1 +{0xe000007fe000007f, -1,{0xffff,0x00c9}}, // 2911 +{0xfffe00000fffffff, -1,{0xffff,0x13ea}}, // 2912 +{0x00000000ffffc3ff, 2599,{0x049b,0xffff}}, // 2913, depth=2 +{0x3c0000003c000000, 2602,{0xffff,0x0183}}, // 2914, depth=2 +{0x0003ffffffffff80, -1,{0xffff,0x1e6a}}, // 2915 +{0xffffffffffff8003, -1,{0xffff,0x1c72}}, // 2916 +{0xfffffffffe1fffff, -1,{0xffff,0x19fb}}, // 2917, depth=1 +{0x00000007ffffffe0, 2920,{0xffff,0x1edd}}, // 2918 +{0xc000001fc000001f, 2605,{0xffff,0x0086}}, // 2919, depth=4 +{0x000000ffffffe000, -1,{0xffff,0x1cda}}, // 2920 +{0xffdfffffffffffff, -1,{0xffff,0x12be}}, // 2921, depth=1 +{0xffe0000000000000, -1,{0xffff,0x12ca}}, // 2922, depth=1 +{0x003f003f003f003f, 2616,{0xffff,0x0025}}, // 2923, depth=2 +{0x000c000c000c000c, -1,{0xffff,0x03a1}}, // 2924, depth=1 +{0xffe0000000000003, -1,{0xffff,0x12cc}}, // 2925, depth=1 +{0x00000000000f8000, -1,{0x0444,0x1c44}}, // 2926, depth=1 +{0xff8000007fffffff, 2626,{0xffff,0x1267}}, // 2927, depth=2 +{0x1f8000001f800000, 2630,{0xffff,0x0245}}, // 2928, depth=2 +{0xffe0000000000007, -1,{0xffff,0x12cd}}, // 2929, depth=1 +{0xffffffffffff8007, -1,{0xffff,0x1c73}}, // 2930 +{0xffff001fffff001f, -1,{0xffff,0x0414}}, // 2931, depth=1 +{0x0000000000003c00, 2631,{0x0583,0x1d83}}, // 2932, depth=2 +{0x0001fffff8000000, -1,{0xffff,0x1955}}, // 2933 +{0x00007fff80000000, -1,{0xffff,0x184f}}, // 2934, depth=1 +{0xfffffe7ffffffe7f, 2635,{0xffff,0x05dd}}, // 2935, depth=2 +{0x007e000000000000, -1,{0xffff,0x13c5}}, // 2936 +{0xffe000000000000f, -1,{0xffff,0x12ce}}, // 2937, depth=1 +{0xffffffffffff800f, -1,{0xffff,0x1c74}}, // 2938 +{0x00000000ffe0007f, -1,{0x02d1,0xffff}}, // 2939, depth=1 +{0x00003ffff8000000, -1,{0xffff,0x1952}}, // 2940, depth=1 +{0xfc0000000000007f, -1,{0xffff,0x118c}}, // 2941, depth=1 +{0x0300000003000000, -1,{0xffff,0x0201}}, // 2942, depth=1 +{0x01c0000000000000, -1,{0xffff,0x1282}}, // 2943 +{0xffffffc0ffffffff, 2948,{0xffff,0x16b9}}, // 2944 +{0xfffffffffffff83f, -1,{0xffff,0x1d7a}}, // 2945, depth=1 +{0x0000000070000000, 2636,{0x0102,0x1902}}, // 2946, depth=2 +{0x00000000cfffcfff, -1,{0x00ad,0xffff}}, // 2947, depth=1 +{0xf00000000001ffff, -1,{0xffff,0x1114}}, // 2948 +{0x00000fffff000000, -1,{0xffff,0x1a13}}, // 2949 +{0xfff8000001ffffff, -1,{0xffff,0x1365}}, // 2950 +{0xffffffffffffdfff, -1,{0xffff,0x1cbe}}, // 2951, depth=1 +{0xffffffffffffe000, -1,{0xffff,0x1cf2}}, // 2952, depth=1 +{0xffe000000000001f, 2637,{0xffff,0x12cf}}, // 2953, depth=2 +{0x00000007fffffff8, -1,{0xffff,0x1f5f}}, // 2954 +{0xfff80003ffffffff, 2638,{0xffff,0x136e}}, // 2955, depth=2 +{0x000000000fffff80, -1,{0x0654,0x1e54}}, // 2956, depth=1 +{0x00000000ff9fffff, 2640,{0x025d,0xffff}}, // 2957, depth=2 +{0x00003ffe00003ffe, 2641,{0xffff,0x07cc}}, // 2958, depth=3 +{0xffffffffffffe007, -1,{0xffff,0x1cf5}}, // 2959, depth=1 +{0x07f8000007f80000, -1,{0xffff,0x0347}}, // 2960, depth=1 +{0x00000000ffff01ff, 2644,{0x0418,0xffff}}, // 2961, depth=3 +{0xffffffffffff801f, -1,{0xffff,0x1c75}}, // 2962 +{0xfffffc00000000ff, 2656,{0xffff,0x159d}}, // 2963, depth=2 +{0x0fff000000000000, 2659,{0xffff,0x140b}}, // 2964, depth=2 +{0xff800000003fffff, -1,{0xffff,0x125e}}, // 2965, depth=1 +{0x00003f0000003f00, 2660,{0xffff,0x0605}}, // 2966, depth=2 +{0xffffffffffffe00f, -1,{0xffff,0x1cf6}}, // 2967, depth=1 +{0x00000007fffffffe, -1,{0xffff,0x1fe1}}, // 2968 +{0xfffc000000007fff, 2971,{0xffff,0x139c}}, // 2969 +{0x00000000001fffc0, 2663,{0x068e,0x1e8e}}, // 2970, depth=2 +{0x00000007ffffffff, -1,{0xffff,0x1022}}, // 2971 +{0x0000000800000000, -1,{0xffff,0x1740}}, // 2972 +{0xffffff9fffffffff, -1,{0xffff,0x167d}}, // 2973, depth=1 +{0xfffffffc0fffffff, -1,{0xffff,0x17b9}}, // 2974 +{0x8787878787878787, -1,{0xffff,0x0073}}, // 2975, depth=1 +{0x0000007f00000000, -1,{0xffff,0x1806}}, // 2976, depth=1 +{0xffffe0000000ffff, -1,{0xffff,0x14e2}}, // 2977, depth=1 +{0xfe007ffffe007fff, -1,{0xffff,0x01d5}}, // 2978 +{0x0000fc0000000000, -1,{0xffff,0x1585}}, // 2979 +{0xfffffffffe00ffff, 2981,{0xffff,0x19f6}}, // 2980 +{0xfffff000000003ff, -1,{0xffff,0x151d}}, // 2981 +{0xff80ff80ff80ff80, 2664,{0xffff,0x0268}}, // 2982, depth=2 +{0xffffc7ffffffc7ff, 2668,{0xffff,0x049c}}, // 2983, depth=3 +{0x0000000000600060, 2678,{0x02e1,0xffff}}, // 2984, depth=2 +{0xffe000000000003f, -1,{0xffff,0x12d0}}, // 2985, depth=1 +{0x0ffffffe00000000, 2688,{0xffff,0x17da}}, // 2986, depth=2 +{0x03fffffffe000000, -1,{0xffff,0x19e0}}, // 2987 +{0x0000001ffc000000, -1,{0xffff,0x198a}}, // 2988, depth=1 +{0xff001fffff001fff, -1,{0xffff,0x0214}}, // 2989, depth=1 +{0x00c000c000c000c0, -1,{0xffff,0x02a1}}, // 2990 +{0x00000000fc0003ff, 2693,{0x018f,0xffff}}, // 2991, depth=2 +{0x003ffffffffffc00, -1,{0xffff,0x1dab}}, // 2992, depth=1 +{0x0000000003030303, 2697,{0x0031,0xffff}}, // 2993, depth=2 +{0x007ffffc007ffffc, -1,{0xffff,0x0794}}, // 2994, depth=1 +{0xffffffff80000fff, -1,{0xffff,0x186c}}, // 2995, depth=1 +{0x000000007fe00000, -1,{0x02c9,0x1ac9}}, // 2996, depth=1 +{0x007ffffc00000000, -1,{0xffff,0x1794}}, // 2997 +{0x0000000001fff800, -1,{0x054d,0x1d4d}}, // 2998, depth=1 +{0xfff9ffffffffffff, -1,{0xffff,0x137d}}, // 2999, depth=1 +{0x000ffe0000000000, -1,{0xffff,0x15ca}}, // 3000, depth=1 +{0xfffffffff003ffff, -1,{0xffff,0x1935}}, // 3001, depth=1 +{0x00000000001fffe0, -1,{0x06cf,0x1ecf}}, // 3002, depth=1 +{0x00001ffffffff800, -1,{0xffff,0x1d61}}, // 3003 +{0x00000000f8f8f8f8, -1,{0x0174,0xffff}}, // 3004, depth=1 +{0xf000000fffffffff, 2702,{0xffff,0x1127}}, // 3005, depth=2 +{0x07fc07fc07fc07fc, 2714,{0xffff,0x03a8}}, // 3006, depth=2 +{0xff1fffffffffffff, -1,{0xffff,0x123c}}, // 3007 +{0xf800007fffffffff, -1,{0xffff,0x116b}}, // 3008 +{0x00000000fffe3fff, 2719,{0x03dc,0xffff}}, // 3009, depth=3 +{0x0000000007fe07fe, 2725,{0x03e9,0xffff}}, // 3010, depth=2 +{0x01ffffffffffc000, -1,{0xffff,0x1caa}}, // 3011 +{0x0030000000000000, -1,{0xffff,0x1301}}, // 3012, depth=1 +{0xfffffff0000fffff, -1,{0xffff,0x172f}}, // 3013, depth=1 +{0x00000007ffffff00, -1,{0xffff,0x1e1a}}, // 3014, depth=1 +{0xffffffffffffe03f, -1,{0xffff,0x1cf8}}, // 3015, depth=1 +{0xfffffe7fffffffff, -1,{0xffff,0x15fd}}, // 3016 +{0x00000000f00000ff, -1,{0x010b,0xffff}}, // 3017, depth=1 +{0x00000000001ffff0, -1,{0x0710,0x1f10}}, // 3018, depth=1 +{0x0000000083ff83ff, 2728,{0x006a,0xffff}}, // 3019, depth=2 +{0x000000000fffffc0, -1,{0x0695,0x1e95}}, // 3020, depth=1 +{0xffffffffffffc7ff, -1,{0xffff,0x1cbc}}, // 3021, depth=1 +{0x0003ffffffffffe0, -1,{0xffff,0x1eec}}, // 3022 +{0xfffffe000007ffff, -1,{0xffff,0x15e9}}, // 3023, depth=1 +{0xfe03fffffe03ffff, -1,{0xffff,0x01d8}}, // 3024 +{0xf83ffffff83fffff, 2729,{0xffff,0x015a}}, // 3025, depth=2 +{0x0400040004000400, 2730,{0xffff,0x01a0}}, // 3026, depth=2 +{0xfff0000000ffffff, -1,{0xffff,0x1323}}, // 3027 +{0x0003fffffffffff0, -1,{0xffff,0x1f2d}}, // 3028 +{0xdddddddddddddddd, 2731,{0xffff,0x00ba}}, // 3029, depth=2 +{0x00000000001ffffc, -1,{0x0792,0x1f92}}, // 3030, depth=1 +{0x1ffffffffffc0000, -1,{0xffff,0x1baa}}, // 3031 +{0x00000000001ffffe, 2732,{0x07d3,0x1fd3}}, // 3032, depth=2 +{0x00000000001fffff, 2733,{0x0014,0x1014}}, // 3033, depth=2 +{0x0000000000200000, -1,{0x02c0,0x1ac0}}, // 3034, depth=1 +{0x0003fffffffffff8, -1,{0xffff,0x1f6e}}, // 3035 +{0x0202020202020202, 2752,{0xffff,0x01f0}}, // 3036, depth=3 +{0xc3ffc3ffc3ffc3ff, 2756,{0xffff,0x00ab}}, // 3037, depth=2 +{0x0000000030000000, 2768,{0x0101,0x1901}}, // 3038, depth=2 +{0xffffffff00003fff, -1,{0xffff,0x182d}}, // 3039, depth=1 +{0x0003fffffffffffe, -1,{0xffff,0x1ff0}}, // 3040 +{0xffffffc000ffffff, -1,{0xffff,0x16b1}}, // 3041, depth=1 +{0x00000fff00000000, 2781,{0xffff,0x180b}}, // 3042, depth=2 +{0xfffffff800007fff, -1,{0xffff,0x176b}}, // 3043 +{0x00000003ffff8000, -1,{0xffff,0x1c52}}, // 3044, depth=1 +{0xffffffffffff807f, 3048,{0xffff,0x1c77}}, // 3045 +{0x0004000400040004, -1,{0xffff,0x03a0}}, // 3046, depth=1 +{0xffffc00fffffc00f, -1,{0xffff,0x0495}}, // 3047, depth=1 +{0xfffffc1fffffffff, 3050,{0xffff,0x15ba}}, // 3048 +{0x0000ffff0000ffff, 2783,{0xffff,0x000f}}, // 3049, depth=2 +{0xffff1fffffff1fff, -1,{0xffff,0x041c}}, // 3050 +{0xfffffc3ffffffc3f, 2788,{0xffff,0x059b}}, // 3051, depth=2 +{0x0100000001000000, 2789,{0xffff,0x0200}}, // 3052, depth=2 +{0x00000007c0000000, -1,{0xffff,0x1884}}, // 3053 +{0x01fffe0000000000, -1,{0xffff,0x15cf}}, // 3054, depth=1 +{0xffffc07fffffffff, -1,{0xffff,0x14b8}}, // 3055, depth=1 +{0x003fffe000000000, -1,{0xffff,0x16d0}}, // 3056 +{0xc003c003c003c003, -1,{0xffff,0x00a3}}, // 3057, depth=1 +{0x00fffffffffe0000, -1,{0xffff,0x1be6}}, // 3058, depth=1 +{0xfff01fffffffffff, -1,{0xffff,0x1338}}, // 3059, depth=1 +{0x00001fffffffe000, -1,{0xffff,0x1cdf}}, // 3060 +{0x3fffffff3fffffff, -1,{0xffff,0x001d}}, // 3061, depth=1 +{0x000001fffffc0000, -1,{0xffff,0x1b96}}, // 3062, depth=1 +{0x00ffffffffffff00, -1,{0xffff,0x1e2f}}, // 3063 +{0xffffffffe00fffff, -1,{0xffff,0x18f6}}, // 3064 +{0xff8000001fffffff, -1,{0xffff,0x1265}}, // 3065, depth=1 +{0x0000000000200020, -1,{0x02e0,0xffff}}, // 3066, depth=1 +{0x00000000ffe000ff, -1,{0x02d2,0xffff}}, // 3067, depth=1 +{0x0000000001ffe000, 2794,{0x04cb,0x1ccb}}, // 3068, depth=2 +{0x0000000001010101, 2800,{0x0030,0xffff}}, // 3069, depth=2 +{0xfffffffff8000000, -1,{0xffff,0x1964}}, // 3070 +{0xfffffffff8000001, 3074,{0xffff,0x1965}}, // 3071 +{0x0000000000000c00, -1,{0x0581,0x1d81}}, // 3072, depth=1 +{0x00000000e000ffff, -1,{0x00d2,0xffff}}, // 3073, depth=1 +{0xffffc01fffffc01f, -1,{0xffff,0x0496}}, // 3074 +{0xffffe0ffffffe0ff, -1,{0xffff,0x04da}}, // 3075, depth=1 +{0x000000000ffffff8, 2801,{0x0758,0x1f58}}, // 3076, depth=2 +{0xfffffffff8000003, -1,{0xffff,0x1966}}, // 3077 +{0x3fffffffff800000, -1,{0xffff,0x1a66}}, // 3078, depth=1 +{0xffffffffffffe07f, -1,{0xffff,0x1cf9}}, // 3079, depth=1 +{0x00007fc000007fc0, 2809,{0xffff,0x0688}}, // 3080, depth=2 +{0x01fffffffc000000, -1,{0xffff,0x199e}}, // 3081 +{0x000000000ffffffe, -1,{0x07da,0x1fda}}, // 3082, depth=1 +{0x000000000fffffff, 2810,{0x001b,0x101b}}, // 3083, depth=2 +{0x0000000010000000, -1,{0x0100,0x1900}}, // 3084, depth=1 +{0xffffffffff000fff, 3087,{0xffff,0x1a33}}, // 3085 +{0x1fffffc01fffffc0, -1,{0xffff,0x0696}}, // 3086, depth=1 +{0xfffffffff8000007, -1,{0xffff,0x1967}}, // 3087 +{0x000000003fe00000, 2823,{0x02c8,0x1ac8}}, // 3088, depth=3 +{0xfffffffff800000f, -1,{0xffff,0x1968}}, // 3089 +{0x0003ffffe0000000, -1,{0xffff,0x18d4}}, // 3090 +{0xfffff0000003ffff, 3094,{0xffff,0x1525}}, // 3091 +{0x07ff000007ff0000, -1,{0xffff,0x040a}}, // 3092, depth=1 +{0xfffff87fffffffff, -1,{0xffff,0x157b}}, // 3093, depth=1 +{0x803fffff803fffff, -1,{0xffff,0x0056}}, // 3094 +{0xfffffffff87fffff, -1,{0xffff,0x197b}}, // 3095, depth=1 +{0x00000007ffc00000, -1,{0xffff,0x1a8c}}, // 3096 +{0xfffcfffffffcffff, -1,{0xffff,0x039d}}, // 3097, depth=1 +{0xfffffffff800001f, -1,{0xffff,0x1969}}, // 3098 +{0xfffffffffc0007ff, -1,{0xffff,0x19b0}}, // 3099, depth=1 +{0x0000003ffffff000, -1,{0xffff,0x1d19}}, // 3100 +{0x001e000000000000, -1,{0xffff,0x13c3}}, // 3101 +{0x0003ffffffffff00, -1,{0xffff,0x1e29}}, // 3102, depth=1 +{0x0000007f0000007f, 2839,{0xffff,0x0006}}, // 3103, depth=3 +{0xf8007fffffffffff, -1,{0xffff,0x1173}}, // 3104 +{0x0003ffffc0000000, -1,{0xffff,0x1893}}, // 3105 +{0x0000000ff0000000, -1,{0xffff,0x1907}}, // 3106 +{0xffffffffffffe1ff, -1,{0xffff,0x1cfb}}, // 3107 +{0xfc00001fffffffff, -1,{0xffff,0x11aa}}, // 3108 +{0xffffff000000ffff, 2848,{0xffff,0x1627}}, // 3109, depth=2 +{0x00000000ffc0ffc0, 2850,{0x02a9,0xffff}}, // 3110, depth=2 +{0x00000000fe07ffff, 2853,{0x01d9,0xffff}}, // 3111, depth=2 +{0xff80000000000000, -1,{0xffff,0x1248}}, // 3112, depth=1 +{0xff80000000000001, 2856,{0xffff,0x1249}}, // 3113, depth=2 +{0x03ffff0000000000, -1,{0xffff,0x1611}}, // 3114, depth=1 +{0xff80000000000003, -1,{0xffff,0x124a}}, // 3115, depth=1 +{0x0fffe00000000000, -1,{0xffff,0x14ce}}, // 3116, depth=1 +{0x8383838383838383, -1,{0xffff,0x0072}}, // 3117, depth=1 +{0x00007fff00000000, -1,{0xffff,0x180e}}, // 3118, depth=1 +{0x00000000c000ffff, 2859,{0x0091,0xffff}}, // 3119, depth=3 +{0x0000001fffff0000, -1,{0xffff,0x1c14}}, // 3120 +{0xffffcfffffffffff, -1,{0xffff,0x14bd}}, // 3121, depth=1 +{0x000ffffffffff000, -1,{0xffff,0x1d27}}, // 3122, depth=1 +{0x00000000fc03ffff, -1,{0x0197,0xffff}}, // 3123, depth=1 +{0x00fffffffffffe00, -1,{0xffff,0x1dee}}, // 3124, depth=1 +{0xffffff800003ffff, -1,{0xffff,0x166a}}, // 3125 +{0x00001c0000000000, -1,{0xffff,0x1582}}, // 3126, depth=1 +{0xff8000000000000f, -1,{0xffff,0x124c}}, // 3127, depth=1 +{0x001ffffc00000000, -1,{0xffff,0x1792}}, // 3128 +{0xfffffffffff801ff, -1,{0xffff,0x1b75}}, // 3129, depth=1 +{0x0001ffc000000000, -1,{0xffff,0x168a}}, // 3130 +{0xfffffff3ffffffff, -1,{0xffff,0x173d}}, // 3131, depth=1 +{0x0000000007f00000, -1,{0x0306,0x1b06}}, // 3132, depth=1 +{0xffe003ffffe003ff, -1,{0xffff,0x02d4}}, // 3133, depth=1 +{0x3800000038000000, 2863,{0xffff,0x0142}}, // 3134, depth=3 +{0x00000000f9ffffff, 2866,{0x015d,0xffff}}, // 3135, depth=3 +{0xffff803fffffffff, -1,{0xffff,0x1476}}, // 3136 +{0xfffffffffffff8ff, -1,{0xffff,0x1d7c}}, // 3137, depth=1 +{0x00000001ffffe000, -1,{0xffff,0x1cd3}}, // 3138 +{0xf87ff87ff87ff87f, 2868,{0xffff,0x016b}}, // 3139, depth=2 +{0x0001c0000001c000, 2870,{0xffff,0x0482}}, // 3140, depth=3 +{0x00000000c003c003, -1,{0x00a3,0xffff}}, // 3141, depth=1 +{0x00000007ffffff80, -1,{0xffff,0x1e5b}}, // 3142, depth=1 +{0xff8000000000001f, -1,{0xffff,0x124d}}, // 3143, depth=1 +{0x0000000fffff0000, -1,{0xffff,0x1c13}}, // 3144, depth=1 +{0x003ffffffffffe00, -1,{0xffff,0x1dec}}, // 3145 +{0x0003ffc00003ffc0, -1,{0xffff,0x068b}}, // 3146, depth=1 +{0xc00fffffffffffff, -1,{0xffff,0x10b5}}, // 3147, depth=1 +{0x03f803f803f803f8, -1,{0xffff,0x0366}}, // 3148, depth=1 +{0x00000000fffe0fff, -1,{0x03da,0xffff}}, // 3149, depth=1 +{0x0000000fffe00000, -1,{0xffff,0x1ace}}, // 3150 +{0xfffc007ffffc007f, -1,{0xffff,0x0394}}, // 3151, depth=1 +{0xf801f801f801f801, -1,{0xffff,0x0165}}, // 3152 +{0xffffffffffff1fff, -1,{0xffff,0x1c3c}}, // 3153 +{0x3fffffff00000000, -1,{0xffff,0x181d}}, // 3154, depth=1 +{0x0038000000000000, -1,{0xffff,0x1342}}, // 3155 +{0xfffffffff800007f, -1,{0xffff,0x196b}}, // 3156 +{0xe000ffffe000ffff, 2872,{0xffff,0x00d2}}, // 3157, depth=2 +{0x0000ffffffffe000, -1,{0xffff,0x1ce2}}, // 3158 +{0x7ffffffffffff800, -1,{0xffff,0x1d73}}, // 3159 +{0xffff000000000fff, -1,{0xffff,0x141b}}, // 3160 +{0xffffffc03fffffff, -1,{0xffff,0x16b7}}, // 3161 +{0xffffe00000003fff, -1,{0xffff,0x14e0}}, // 3162 +{0xffffffe1ffffffff, -1,{0xffff,0x16fb}}, // 3163 +{0x7fffc0007fffc000, -1,{0xffff,0x0490}}, // 3164, depth=1 +{0xffe00007ffe00007, -1,{0xffff,0x02cd}}, // 3165, depth=1 +{0x00000001fff80000, -1,{0xffff,0x1b4d}}, // 3166, depth=1 +{0xfffff9fffffff9ff, 2876,{0xffff,0x055d}}, // 3167, depth=2 +{0x000000fffffff800, -1,{0xffff,0x1d5c}}, // 3168, depth=1 +{0xfffffffff0007fff, -1,{0xffff,0x1932}}, // 3169 +{0x03fe000000000000, -1,{0xffff,0x13c8}}, // 3170 +{0xfffc000000001fff, -1,{0xffff,0x139a}}, // 3171 +{0x007fc00000000000, -1,{0xffff,0x1488}}, // 3172 +{0x00000000ffc0ffff, -1,{0x0299,0xffff}}, // 3173, depth=1 +{0x0600000000000000, -1,{0xffff,0x11c1}}, // 3174, depth=1 +{0xff8000000000003f, -1,{0xffff,0x124e}}, // 3175, depth=1 +{0x001ffffffe000000, 2879,{0xffff,0x19db}}, // 3176, depth=2 +{0xffe00000000000ff, 2880,{0xffff,0x12d2}}, // 3177, depth=2 +{0x00003fc000000000, -1,{0xffff,0x1687}}, // 3178, depth=1 +{0xe0007fffffffffff, 2886,{0xffff,0x10f1}}, // 3179, depth=2 +{0x03f8000003f80000, -1,{0xffff,0x0346}}, // 3180, depth=1 +{0x0007ffff0007ffff, 2890,{0xffff,0x0012}}, // 3181, depth=2 +{0xfe0001fffe0001ff, -1,{0xffff,0x01cf}}, // 3182 +{0xfffff803fffff803, -1,{0xffff,0x0556}}, // 3183, depth=1 +{0xfff81fffffffffff, -1,{0xffff,0x1379}}, // 3184 +{0x0000003fffffc000, -1,{0xffff,0x1c97}}, // 3185 +{0x003fffe0003fffe0, -1,{0xffff,0x06d0}}, // 3186, depth=1 +{0x000001e000000000, -1,{0xffff,0x16c3}}, // 3187 +{0x0000fffffff80000, -1,{0xffff,0x1b5c}}, // 3188, depth=1 +{0xfff00001ffffffff, -1,{0xffff,0x132c}}, // 3189, depth=1 +{0x800001ffffffffff, -1,{0xffff,0x1069}}, // 3190 +{0xf0000000000001ff, -1,{0xffff,0x110c}}, // 3191, depth=1 +{0x00000000ff80ff80, 2895,{0x0268,0xffff}}, // 3192, depth=2 +{0xffffffc01fffffff, -1,{0xffff,0x16b6}}, // 3193 +{0xffffffc0ffffffc0, 2901,{0xffff,0x0699}}, // 3194, depth=2 +{0xfffffffffff9ffff, -1,{0xffff,0x1b7d}}, // 3195, depth=1 +{0x1fffffc000000000, -1,{0xffff,0x1696}}, // 3196, depth=1 +{0x07ffffe000000000, -1,{0xffff,0x16d5}}, // 3197 +{0x03fffffc00000000, -1,{0xffff,0x1797}}, // 3198 +{0x00000000fff01fff, -1,{0x0318,0xffff}}, // 3199, depth=1 +{0x00000003f8000000, -1,{0xffff,0x1946}}, // 3200, depth=1 +{0xc1ffffffffffffff, 2908,{0xffff,0x10ba}}, // 3201, depth=2 +{0x87ffffffffffffff, -1,{0xffff,0x107b}}, // 3202 +{0xffff8000000003ff, -1,{0xffff,0x145a}}, // 3203, depth=1 +{0xf8007ffff8007fff, -1,{0xffff,0x0153}}, // 3204 +{0xff87ffffffffffff, -1,{0xffff,0x127b}}, // 3205 +{0x00000007ffffffc0, -1,{0xffff,0x1e9c}}, // 3206, depth=1 +{0xffffffffffffe0ff, -1,{0xffff,0x1cfa}}, // 3207, depth=1 +{0x07fffffffffffc00, -1,{0xffff,0x1db0}}, // 3208, depth=1 +{0x00fffffffffffff0, -1,{0xffff,0x1f33}}, // 3209 +{0x0000000003ffff00, -1,{0x0611,0x1e11}}, // 3210 +{0x000000008000ffff, 2909,{0x0050,0xffff}}, // 3211, depth=3 +{0xffffffbfffffffff, -1,{0xffff,0x167e}}, // 3212 +{0x0001fffffffc0000, -1,{0xffff,0x1b9e}}, // 3213 +{0x000007f8000007f8, -1,{0xffff,0x0747}}, // 3214, depth=1 +{0xffffffffff8fffff, -1,{0xffff,0x1a7c}}, // 3215 +{0x00fffffffffffffc, -1,{0xffff,0x1fb5}}, // 3216 +{0xffff807fffff807f, -1,{0xffff,0x0457}}, // 3217, depth=1 +{0xffffffc000000007, 3222,{0xffff,0x169c}}, // 3218 +{0xfffffc00000001ff, -1,{0xffff,0x159e}}, // 3219, depth=1 +{0x0000030000000000, -1,{0xffff,0x1601}}, // 3220, depth=1 +{0xfffffffc001fffff, -1,{0xffff,0x17b2}}, // 3221, depth=1 +{0xfff00000007fffff, -1,{0xffff,0x1322}}, // 3222 +{0x0000000700000000, -1,{0xffff,0x1802}}, // 3223 +{0x000001fffffe0000, -1,{0xffff,0x1bd7}}, // 3224 +{0xffc000000007ffff, -1,{0xffff,0x129c}}, // 3225, depth=1 +{0x007c0000007c0000, -1,{0xffff,0x0384}}, // 3226, depth=1 +{0xfff81ffffff81fff, 2912,{0xffff,0x0359}}, // 3227, depth=2 +{0x07f0000000000000, -1,{0xffff,0x1306}}, // 3228, depth=1 +{0xfffffffffff803ff, -1,{0xffff,0x1b76}}, // 3229 +{0x000000000fc00000, 2915,{0x0285,0x1a85}}, // 3230, depth=2 +{0xffffffffffff7fff, -1,{0xffff,0x1c3e}}, // 3231, depth=1 +{0xffffffffffff8000, -1,{0xffff,0x1c70}}, // 3232, depth=1 +{0xffffffffffff8001, -1,{0xffff,0x1c71}}, // 3233, depth=1 +{0x00001fffffff8000, -1,{0xffff,0x1c5d}}, // 3234 +{0x8000000003ffffff, 2916,{0xffff,0x105a}}, // 3235, depth=2 +{0x3fffe00000000000, -1,{0xffff,0x14d0}}, // 3236 +{0xfffc03fffffc03ff, -1,{0xffff,0x0397}}, // 3237 +{0x0000000001f801f8, 2918,{0x0365,0xffff}}, // 3238, depth=3 +{0xff8000000000007f, 2930,{0xffff,0x124f}}, // 3239, depth=2 +{0x00000000fc007fff, -1,{0x0194,0xffff}}, // 3240 +{0xfffffffff83fffff, -1,{0xffff,0x197a}}, // 3241, depth=1 +{0xffffff0000003fff, 3243,{0xffff,0x1625}}, // 3242 +{0xf803fffff803ffff, -1,{0xffff,0x0156}}, // 3243 +{0x000000001c001c00, 2933,{0x01a2,0xffff}}, // 3244, depth=2 +{0xff00003fff00003f, -1,{0xffff,0x020d}}, // 3245, depth=1 +{0x0000040000000400, 2936,{0xffff,0x0580}}, // 3246, depth=2 +{0xffe0000fffffffff, 2938,{0xffff,0x12ee}}, // 3247, depth=2 +{0x0fffff0000000000, -1,{0xffff,0x1613}}, // 3248, depth=1 +{0x00000000ff1fffff, -1,{0x021c,0xffff}}, // 3249, depth=1 +{0x00000f0000000000, -1,{0xffff,0x1603}}, // 3250 +{0x1fff1fff1fff1fff, -1,{0xffff,0x002c}}, // 3251, depth=1 +{0x000000fff8000000, -1,{0xffff,0x194c}}, // 3252 +{0xff8007ffff8007ff, -1,{0xffff,0x0253}}, // 3253 +{0x00000007fffffff0, -1,{0xffff,0x1f1e}}, // 3254, depth=1 +{0xffffffffff003fff, -1,{0xffff,0x1a35}}, // 3255, depth=1 +{0x1f001f001f001f00, 2943,{0xffff,0x0224}}, // 3256, depth=2 +{0x00000000e1ffe1ff, 2944,{0x00eb,0xffff}}, // 3257, depth=3 +{0x03ffff8003ffff80, 2949,{0xffff,0x0652}}, // 3258, depth=2 +{0x7f7f7f7f7f7f7f7f, 2950,{0xffff,0x0036}}, // 3259, depth=2 +{0x7ffffffffff80000, -1,{0xffff,0x1b6b}}, // 3260, depth=1 +{0xffffcfffffffcfff, -1,{0xffff,0x049d}}, // 3261, depth=1 +{0x000fffffffffc000, 2954,{0xffff,0x1ca5}}, // 3262, depth=2 +{0x00000000fc07fc07, 2962,{0x01a8,0xffff}}, // 3263, depth=2 +{0x0007ffffffe00000, -1,{0xffff,0x1add}}, // 3264 +{0xffffffc00000003f, -1,{0xffff,0x169f}}, // 3265 +{0x00000007fffffffc, -1,{0xffff,0x1fa0}}, // 3266, depth=1 +{0xffffffe000ffffff, 3272,{0xffff,0x16f2}}, // 3267 +{0x000000000000ff80, 2968,{0x0648,0x1e48}}, // 3268, depth=2 +{0x00000000fff007ff, 2969,{0x0316,0xffff}}, // 3269, depth=3 +{0x03f003f003f003f0, 2972,{0xffff,0x0325}}, // 3270, depth=2 +{0xff00000000001fff, 2974,{0xffff,0x1214}}, // 3271, depth=2 +{0xfffc0007fffc0007, -1,{0xffff,0x0390}}, // 3272 +{0x00000000f00001ff, 2978,{0x010c,0xffff}}, // 3273, depth=2 +{0x000000000003f000, -1,{0x0505,0x1d05}}, // 3274, depth=1 +{0x000001fffffffe00, -1,{0xffff,0x1ddf}}, // 3275 +{0xffffffff000fffff, -1,{0xffff,0x1833}}, // 3276 +{0xfff8ffffffffffff, -1,{0xffff,0x137c}}, // 3277 +{0x0000000800000008, 2979,{0xffff,0x0740}}, // 3278, depth=2 +{0x000000009f9f9f9f, 2980,{0x0075,0xffff}}, // 3279, depth=3 +{0x3ff000003ff00000, -1,{0xffff,0x0309}}, // 3280, depth=1 +{0x00000003fffffc00, -1,{0xffff,0x1d97}}, // 3281 +{0xffff800007ffffff, -1,{0xffff,0x146b}}, // 3282 +{0xffc03fffffc03fff, -1,{0xffff,0x0297}}, // 3283, depth=1 +{0x000000003ffe3ffe, 2987,{0x03ec,0xffff}}, // 3284, depth=2 +{0xfffffc000001ffff, -1,{0xffff,0x15a6}}, // 3285, depth=1 +{0xaaaaaaaaaaaaaaaa, 2990,{0xffff,0x007c}}, // 3286, depth=2 +{0xfe00000000ffffff, -1,{0xffff,0x11de}}, // 3287, depth=1 +{0x000007fffffc0000, -1,{0xffff,0x1b98}}, // 3288, depth=1 +{0xe007ffffe007ffff, -1,{0xffff,0x00d5}}, // 3289, depth=1 +{0x01f8000001f80000, 2997,{0xffff,0x0345}}, // 3290, depth=2 +{0x07f8000000000000, -1,{0xffff,0x1347}}, // 3291 +{0x007f8000007f8000, -1,{0xffff,0x0447}}, // 3292, depth=1 +{0xfffffc00000003ff, -1,{0xffff,0x159f}}, // 3293 +{0x0003ffffffffffc0, -1,{0xffff,0x1eab}}, // 3294, depth=1 +{0xffffffffffff803f, -1,{0xffff,0x1c76}}, // 3295, depth=1 +{0xf1ffffffffffffff, -1,{0xffff,0x113c}}, // 3296 +{0xfff000007fffffff, -1,{0xffff,0x132a}}, // 3297 +{0x0000000003fc03fc, -1,{0x03a7,0xffff}}, // 3298 +{0xc00000000003ffff, -1,{0xffff,0x1093}}, // 3299, depth=1 +{0x0000000003fe0000, 3003,{0x03c8,0x1bc8}}, // 3300, depth=2 +{0xf07ff07ff07ff07f, 3007,{0xffff,0x012a}}, // 3301, depth=2 +{0xfffffe00001fffff, -1,{0xffff,0x15eb}}, // 3302 +{0xfff07ffffff07fff, -1,{0xffff,0x031a}}, // 3303 +{0xffffffc00000007f, -1,{0xffff,0x16a0}}, // 3304 +{0x00000000f00ff00f, 3008,{0x0127,0xffff}}, // 3305, depth=2 +{0x7f80000000000000, -1,{0xffff,0x1247}}, // 3306 +{0xffff000003ffffff, -1,{0xffff,0x1429}}, // 3307, depth=1 +{0x00000000f0f0f0f0, -1,{0x0133,0xffff}}, // 3308, depth=1 +{0x0000078000000780, -1,{0xffff,0x0643}}, // 3309 +{0x00fffff000000000, -1,{0xffff,0x1713}}, // 3310, depth=1 +{0x1fffffe01fffffe0, -1,{0xffff,0x06d7}}, // 3311 +{0x03ff000003ff0000, -1,{0xffff,0x0409}}, // 3312, depth=1 +{0x8000000000003fff, -1,{0xffff,0x104e}}, // 3313, depth=1 +{0x003ff000003ff000, -1,{0xffff,0x0509}}, // 3314, depth=1 +{0xfc07ffffffffffff, -1,{0xffff,0x11b8}}, // 3315, depth=1 +{0x00000007e0000000, 3011,{0xffff,0x18c5}}, // 3316, depth=2 +{0xfffffffffffbffff, -1,{0xffff,0x1b7e}}, // 3317 +{0x0000000000f80000, -1,{0x0344,0x1b44}}, // 3318, depth=1 +{0x00000000ff80ffff, 3016,{0x0258,0xffff}}, // 3319, depth=2 +{0x0007ffffffff0000, -1,{0xffff,0x1c22}}, // 3320, depth=1 +{0xfffffffffffc0003, -1,{0xffff,0x1baf}}, // 3321 +{0x7000000000000000, -1,{0xffff,0x1102}}, // 3322, depth=1 +{0x00000000ffe001ff, -1,{0x02d3,0xffff}}, // 3323, depth=1 +{0xfff00000003fffff, -1,{0xffff,0x1321}}, // 3324 +{0xfc000000000001ff, -1,{0xffff,0x118e}}, // 3325, depth=1 +{0x00003ffffffc0000, 3022,{0xffff,0x1b9b}}, // 3326, depth=2 +{0xfffffffffffc0007, -1,{0xffff,0x1bb0}}, // 3327 +{0x00ffffffffc00000, 3330,{0xffff,0x1aa1}}, // 3328 +{0xfffffffe03ffffff, -1,{0xffff,0x17f8}}, // 3329, depth=1 +{0x0000001ff0000000, -1,{0xffff,0x1908}}, // 3330 +{0xf000001fffffffff, -1,{0xffff,0x1128}}, // 3331, depth=1 +{0x000000000000ffc0, -1,{0x0689,0x1e89}}, // 3332, depth=1 +{0xffffffc0007fffff, -1,{0xffff,0x16b0}}, // 3333, depth=1 +{0x00007fffff000000, -1,{0xffff,0x1a16}}, // 3334, depth=1 +{0xffff80000003ffff, -1,{0xffff,0x1462}}, // 3335, depth=1 +{0x0000600000006000, -1,{0xffff,0x04c1}}, // 3336, depth=1 +{0x3fffff0000000000, -1,{0xffff,0x1615}}, // 3337 +{0xfffffffffffc000f, -1,{0xffff,0x1bb1}}, // 3338 +{0x00000000f001ffff, 3024,{0x0114,0xffff}}, // 3339, depth=2 +{0x000ffffffc000000, -1,{0xffff,0x1999}}, // 3340, depth=1 +{0xff000000000007ff, 3027,{0xffff,0x1212}}, // 3341, depth=2 +{0x1fffe0001fffe000, 3028,{0xffff,0x04cf}}, // 3342, depth=2 +{0xfffffe000fffffff, -1,{0xffff,0x15f2}}, // 3343 +{0x0000007e00000000, 3031,{0xffff,0x17c5}}, // 3344, depth=2 +{0xffffff80000003ff, -1,{0xffff,0x1662}}, // 3345, depth=1 +{0xfffff00007ffffff, -1,{0xffff,0x152e}}, // 3346 +{0xc0001fffc0001fff, -1,{0xffff,0x008e}}, // 3347, depth=1 +{0x0000000001ff8000, -1,{0x0449,0x1c49}}, // 3348, depth=1 +{0xffffe1ffffffffff, -1,{0xffff,0x14fb}}, // 3349 +{0x7ffffc0000000000, 3035,{0xffff,0x1594}}, // 3350, depth=2 +{0x0000000007ffc000, -1,{0x048c,0x1c8c}}, // 3351 +{0x800007ffffffffff, -1,{0xffff,0x106b}}, // 3352 +{0x00000000fe1ffe1f, -1,{0x01eb,0xffff}}, // 3353, depth=1 +{0x0003fffffffffffc, -1,{0xffff,0x1faf}}, // 3354, depth=1 +{0xfe03fe03fe03fe03, -1,{0xffff,0x01e8}}, // 3355, depth=1 +{0x00000000ff00ff00, 3040,{0x0227,0xffff}}, // 3356, depth=2 +{0x0003ffffffffffff, 3043,{0xffff,0x1031}}, // 3357, depth=2 +{0x0004000000000000, -1,{0xffff,0x1380}}, // 3358, depth=1 +{0x00000000ffe1ffe1, 3045,{0x02eb,0xffff}}, // 3359, depth=4 +{0xfffffffffffc001f, -1,{0xffff,0x1bb2}}, // 3360 +{0x000003fffff00000, -1,{0xffff,0x1b15}}, // 3361 +{0x000001c0000001c0, 3053,{0xffff,0x0682}}, // 3362, depth=2 +{0xfffffffffc07ffff, -1,{0xffff,0x19b8}}, // 3363, depth=1 +{0x000000000000ffe0, 3056,{0x06ca,0x1eca}}, // 3364, depth=2 +{0x007ffe0000000000, -1,{0xffff,0x15cd}}, // 3365 +{0x0000000003fffe00, -1,{0x05d0,0x1dd0}}, // 3366, depth=1 +{0xff800000000000ff, -1,{0xffff,0x1250}}, // 3367, depth=1 +{0x01ffff8001ffff80, -1,{0xffff,0x0651}}, // 3368, depth=1 +{0xfc0fffffffffffff, -1,{0xffff,0x11b9}}, // 3369 +{0x3fffffffff000000, 3060,{0xffff,0x1a25}}, // 3370, depth=2 +{0xf8000fffffffffff, -1,{0xffff,0x1170}}, // 3371, depth=1 +{0xfe0000001fffffff, -1,{0xffff,0x11e3}}, // 3372 +{0x803fffffffffffff, -1,{0xffff,0x1076}}, // 3373, depth=1 +{0x00003fe000000000, -1,{0xffff,0x16c8}}, // 3374 +{0xfff000003fffffff, 3377,{0xffff,0x1329}}, // 3375 +{0x000000000f800000, -1,{0x0244,0x1a44}}, // 3376, depth=1 +{0xffe1ffe1ffe1ffe1, -1,{0xffff,0x02eb}}, // 3377 +{0xf00000000003ffff, -1,{0xffff,0x1115}}, // 3378 +{0xfffffffffffc003f, -1,{0xffff,0x1bb3}}, // 3379 +{0x000000000000fff0, 3063,{0x070b,0x1f0b}}, // 3380, depth=2 +{0xfffffffffe003fff, -1,{0xffff,0x19f4}}, // 3381 +{0x0ffffffffff00000, -1,{0xffff,0x1b27}}, // 3382 +{0xfc007ffffc007fff, -1,{0xffff,0x0194}}, // 3383, depth=1 +{0x00000000eeeeeeee, -1,{0x00fa,0xffff}}, // 3384, depth=1 +{0xffff000000003fff, 3064,{0xffff,0x141d}}, // 3385, depth=2 +{0xffffc0000000ffff, -1,{0xffff,0x14a1}}, // 3386 +{0xfffffffff7ffffff, -1,{0xffff,0x193e}}, // 3387, depth=1 +{0x000000000000fff8, 3070,{0x074c,0x1f4c}}, // 3388, depth=2 +{0x00000000ffe1ffff, 3071,{0x02db,0xffff}}, // 3389, depth=3 +{0x000003fffe000000, -1,{0xffff,0x19d0}}, // 3390, depth=1 +{0xfc0000000001ffff, 3077,{0xffff,0x1196}}, // 3391, depth=2 +{0x000000000000fffc, -1,{0x078d,0x1f8d}}, // 3392, depth=1 +{0xfffffffffffff9ff, -1,{0xffff,0x1d7d}}, // 3393, depth=1 +{0x000000000000fffe, 3081,{0x07ce,0x1fce}}, // 3394, depth=2 +{0x000000000000ffff, 3085,{0x000f,0x100f}}, // 3395, depth=3 +{0x0000000000010000, -1,{0x0400,0x1c00}}, // 3396, depth=1 +{0x0000000000010001, -1,{0x0020,0xffff}}, // 3397, depth=1 +{0x1fffffe000000000, -1,{0xffff,0x16d7}}, // 3398 +{0xffffffffc1ffffff, -1,{0xffff,0x18ba}}, // 3399 +{0x0000000003fffff0, -1,{0x0715,0x1f15}}, // 3400 +{0xffffff8007ffffff, -1,{0xffff,0x1673}}, // 3401 +{0x0003e0000003e000, -1,{0xffff,0x04c4}}, // 3402, depth=1 +{0xff7fffffff7fffff, 3089,{0xffff,0x021e}}, // 3403, depth=2 +{0x000fc000000fc000, 3090,{0xffff,0x0485}}, // 3404, depth=2 +{0x000007fffffe0000, 3406,{0xffff,0x1bd9}}, // 3405 +{0x7ff07ff07ff07ff0, -1,{0xffff,0x032a}}, // 3406 +{0xfffffffe00003fff, -1,{0xffff,0x17ec}}, // 3407, depth=1 +{0x007ffffffff00000, -1,{0xffff,0x1b22}}, // 3408, depth=1 +{0xfffffff1ffffffff, 3412,{0xffff,0x173c}}, // 3409 +{0x00000ffe00000000, -1,{0xffff,0x17ca}}, // 3410, depth=1 +{0x001f001f001f001f, 3091,{0xffff,0x0024}}, // 3411, depth=3 +{0x00000000ffffdfff, -1,{0x049e,0xffff}}, // 3412 +{0xfffe0007ffffffff, -1,{0xffff,0x13f1}}, // 3413, depth=1 +{0x000000000003c000, -1,{0x0483,0x1c83}}, // 3414, depth=1 +{0x00000000f803f803, -1,{0x0166,0xffff}}, // 3415, depth=1 +{0x0000fffe0000fffe, 3096,{0xffff,0x07ce}}, // 3416, depth=2 +{0x0000000003fffff8, -1,{0x0756,0x1f56}}, // 3417 +{0x0ffffffffe000000, -1,{0xffff,0x19e2}}, // 3418, depth=1 +{0x00ffffff00ffffff, 3098,{0xffff,0x0017}}, // 3419, depth=2 +{0x000007fffffffc00, -1,{0xffff,0x1da0}}, // 3420, depth=1 +{0xfdffffffffffffff, -1,{0xffff,0x11be}}, // 3421 +{0x01ff000001ff0000, 3100,{0xffff,0x0408}}, // 3422, depth=2 +{0xffe7ffffffffffff, -1,{0xffff,0x12fd}}, // 3423, depth=1 +{0x0000ff000000ff00, -1,{0xffff,0x0607}}, // 3424, depth=1 +{0xffffffffffe01fff, 3426,{0xffff,0x1af7}}, // 3425 +{0xffff07ffffffffff, 3427,{0xffff,0x143a}}, // 3426 +{0xfe00000000000001, 3432,{0xffff,0x11c7}}, // 3427 +{0x3ffffffe3ffffffe, -1,{0xffff,0x07dc}}, // 3428, depth=1 +{0xfff800ffffffffff, -1,{0xffff,0x1374}}, // 3429, depth=1 +{0x00000001fffff800, -1,{0xffff,0x1d55}}, // 3430, depth=1 +{0xffffffffc00fffff, -1,{0xffff,0x18b5}}, // 3431, depth=1 +{0xffc7ffffffc7ffff, -1,{0xffff,0x029c}}, // 3432 +{0xffe00000000001ff, -1,{0xffff,0x12d3}}, // 3433, depth=1 +{0x7fffffffffff8000, 3439,{0xffff,0x1c6f}}, // 3434 +{0xfffffff001ffffff, -1,{0xffff,0x1734}}, // 3435, depth=1 +{0x3fffff003fffff00, 3101,{0xffff,0x0615}}, // 3436, depth=2 +{0xff80000fffffffff, -1,{0xffff,0x126c}}, // 3437, depth=1 +{0x003ffffffffe0000, -1,{0xffff,0x1be4}}, // 3438, depth=1 +{0x0000000003fffffc, -1,{0x0797,0x1f97}}, // 3439 +{0xfe00000000000003, -1,{0xffff,0x11c8}}, // 3440 +{0xffffffc07fffffff, -1,{0xffff,0x16b8}}, // 3441, depth=1 +{0x1e00000000000000, -1,{0xffff,0x11c3}}, // 3442, depth=1 +{0x01ffffffffff0000, -1,{0xffff,0x1c28}}, // 3443 +{0x0000000000003e00, -1,{0x05c4,0x1dc4}}, // 3444, depth=1 +{0xffff800000007fff, -1,{0xffff,0x145f}}, // 3445 +{0x0007fff800000000, -1,{0xffff,0x174f}}, // 3446, depth=1 +{0xc000003fffffffff, 3104,{0xffff,0x10a7}}, // 3447, depth=2 +{0xffffffe0ffffffe0, -1,{0xffff,0x06da}}, // 3448 +{0xfc03fffffc03ffff, -1,{0xffff,0x0197}}, // 3449, depth=1 +{0xffffe000ffffe000, 3105,{0xffff,0x04d2}}, // 3450, depth=2 +{0xfffffffff800003f, -1,{0xffff,0x196a}}, // 3451, depth=1 +{0x0000fffffffff800, -1,{0xffff,0x1d64}}, // 3452, depth=1 +{0x8000000000000fff, -1,{0xffff,0x104c}}, // 3453, depth=1 +{0x0000000780000000, -1,{0xffff,0x1843}}, // 3454, depth=1 +{0xfff000001fffffff, 3457,{0xffff,0x1328}}, // 3455 +{0x7c00000000000000, 3106,{0xffff,0x1184}}, // 3456, depth=2 +{0xfe00000000000007, -1,{0xffff,0x11c9}}, // 3457 +{0x00003ffffffffc00, -1,{0xffff,0x1da3}}, // 3458, depth=1 +{0xffffe00003ffffff, -1,{0xffff,0x14ec}}, // 3459, depth=1 +{0xffffffc0000000ff, -1,{0xffff,0x16a1}}, // 3460 +{0xfffc00000007ffff, -1,{0xffff,0x13a0}}, // 3461 +{0xfe0000000000000f, -1,{0xffff,0x11ca}}, // 3462 +{0xe0000000001fffff, 3107,{0xffff,0x10d7}}, // 3463, depth=2 +{0x000001f000000000, 3466,{0xffff,0x1704}}, // 3464 +{0xf03ffffff03fffff, 3108,{0xffff,0x0119}}, // 3465, depth=2 +{0x0000000000003fc0, -1,{0x0687,0x1e87}}, // 3466 +{0xfff9fff9fff9fff9, -1,{0xffff,0x036d}}, // 3467, depth=1 +{0x00000000000c0000, -1,{0x0381,0x1b81}}, // 3468, depth=1 +{0xfffffffff80001ff, -1,{0xffff,0x196d}}, // 3469 +{0x0000007e0000007e, 3120,{0xffff,0x07c5}}, // 3470, depth=2 +{0xfffffffffffc007f, 3472,{0xffff,0x1bb4}}, // 3471 +{0xff00007fffffffff, -1,{0xffff,0x122e}}, // 3472 +{0x00000000ffff03ff, -1,{0x0419,0xffff}}, // 3473, depth=1 +{0xfe0000000000001f, -1,{0xffff,0x11cb}}, // 3474 +{0xfffffffffffffc00, -1,{0xffff,0x1db5}}, // 3475 +{0x1ffffffffffffc00, -1,{0xffff,0x1db2}}, // 3476, depth=1 +{0xfffffe07fffffe07, 3125,{0xffff,0x05d9}}, // 3477, depth=2 +{0xfffffffffffffc03, 3484,{0xffff,0x1db7}}, // 3478 +{0xffffffc0003fffff, -1,{0xffff,0x16af}}, // 3479, depth=1 +{0x00000000000c000c, 3128,{0x03a1,0xffff}}, // 3480, depth=2 +{0xffffc000001fffff, -1,{0xffff,0x14a6}}, // 3481, depth=1 +{0xfcfcfcfcfcfcfcfc, 3130,{0xffff,0x01b5}}, // 3482, depth=2 +{0xfff8003ffff8003f, 3136,{0xffff,0x0352}}, // 3483, depth=2 +{0xffffffe0ffffffff, -1,{0xffff,0x16fa}}, // 3484 +{0xffffffffffcfffff, -1,{0xffff,0x1abd}}, // 3485, depth=1 +{0x00007ffe00000000, -1,{0xffff,0x17cd}}, // 3486, depth=1 +{0xffffffffffff80ff, -1,{0xffff,0x1c78}}, // 3487, depth=1 +{0xffff3fffffffffff, -1,{0xffff,0x143d}}, // 3488 +{0xfffffffffffffc07, -1,{0xffff,0x1db8}}, // 3489 +{0xfffff801fffff801, -1,{0xffff,0x0555}}, // 3490 +{0x00007ffffe000000, -1,{0xffff,0x19d5}}, // 3491 +{0x00000ff800000ff8, -1,{0xffff,0x0748}}, // 3492, depth=1 +{0xffefffffffffffff, -1,{0xffff,0x12fe}}, // 3493 +{0x000007fffffffe00, -1,{0xffff,0x1de1}}, // 3494 +{0x007ffffffffff000, -1,{0xffff,0x1d2a}}, // 3495 +{0x1ff0000000000000, -1,{0xffff,0x1308}}, // 3496, depth=1 +{0xf9fff9fff9fff9ff, -1,{0xffff,0x016d}}, // 3497, depth=1 +{0xfffffffffffffc1f, -1,{0xffff,0x1dba}}, // 3498 +{0xffe000000001ffff, -1,{0xffff,0x12db}}, // 3499, depth=1 +{0x3fff000000000000, 3138,{0xffff,0x140d}}, // 3500, depth=2 +{0x0003ffffff000000, -1,{0xffff,0x1a19}}, // 3501 +{0xffffffff81ffffff, 3505,{0xffff,0x1879}}, // 3502 +{0xfe000000ffffffff, -1,{0xffff,0x11e6}}, // 3503, depth=1 +{0x0003ffffffc00000, 3145,{0xffff,0x1a9b}}, // 3504, depth=2 +{0xffe00000000003ff, -1,{0xffff,0x12d4}}, // 3505 +{0x000000001ff01ff0, 3150,{0x0328,0xffff}}, // 3506, depth=2 +{0x0000000099999999, 3152,{0x0079,0xffff}}, // 3507, depth=2 +{0x00ffffffffffff80, -1,{0xffff,0x1e70}}, // 3508, depth=1 +{0x000000003fc03fc0, -1,{0x02a7,0xffff}}, // 3509 +{0x000ffff800000000, -1,{0xffff,0x1750}}, // 3510 +{0xffffffe1ffffffe1, 3153,{0xffff,0x06db}}, // 3511, depth=2 +{0x003fffffffffffc0, -1,{0xffff,0x1eaf}}, // 3512 +{0xe00000000fffffff, -1,{0xffff,0x10de}}, // 3513, depth=1 +{0x03e003e003e003e0, 3155,{0xffff,0x02e4}}, // 3514, depth=2 +{0xff0003ffffffffff, 3156,{0xffff,0x1231}}, // 3515, depth=2 +{0x3ffffffffe000000, -1,{0xffff,0x19e4}}, // 3516 +{0x0000fffff8000000, -1,{0xffff,0x1954}}, // 3517 +{0x000000ffffff8000, -1,{0xffff,0x1c58}}, // 3518, depth=1 +{0xfffff800001fffff, -1,{0xffff,0x1569}}, // 3519, depth=1 +{0x0007800000000000, -1,{0xffff,0x1443}}, // 3520 +{0xffc0007fffffffff, -1,{0xffff,0x12b0}}, // 3521, depth=1 +{0x3ffffffe00000000, 3158,{0xffff,0x17dc}}, // 3522, depth=2 +{0xffffffff800fffff, -1,{0xffff,0x1874}}, // 3523, depth=1 +{0x00000c0000000c00, 3159,{0xffff,0x0581}}, // 3524, depth=2 +{0x00000000fff7fff7, 3160,{0x032e,0xffff}}, // 3525, depth=2 +{0xff000fffffffffff, 3529,{0xffff,0x1233}}, // 3526 +{0xe0ffffffe0ffffff, -1,{0xffff,0x00da}}, // 3527, depth=1 +{0x003ffff0003ffff0, -1,{0xffff,0x0711}}, // 3528, depth=1 +{0xf8000007ffffffff, -1,{0xffff,0x1167}}, // 3529 +{0xfffffffffffffc3f, -1,{0xffff,0x1dbb}}, // 3530 +{0xffffc0000fffffff, -1,{0xffff,0x14ad}}, // 3531, depth=1 +{0xfc1ffffffc1fffff, -1,{0xffff,0x019a}}, // 3532 +{0x00000000fff7ffff, 3161,{0x031e,0xffff}}, // 3533, depth=2 +{0x00000000fff80000, -1,{0x034c,0x1b4c}}, // 3534, depth=1 +{0x00000000fff80001, -1,{0x034d,0xffff}}, // 3535, depth=1 +{0xfffffe07ffffffff, -1,{0xffff,0x15f9}}, // 3536 +{0x00000000fff80003, 3162,{0x034e,0xffff}}, // 3537, depth=2 +{0x0fffc00000000000, -1,{0xffff,0x148d}}, // 3538 +{0xfffe00000000ffff, -1,{0xffff,0x13de}}, // 3539, depth=1 +{0xf000003fffffffff, -1,{0xffff,0x1129}}, // 3540 +{0x00000000fff80007, 3163,{0x034f,0xffff}}, // 3541, depth=2 +{0x0003ffff80000000, -1,{0xffff,0x1852}}, // 3542, depth=1 +{0x7777777777777777, 3169,{0xffff,0x003a}}, // 3543, depth=2 +{0x3ffe00003ffe0000, 3170,{0xffff,0x03cc}}, // 3544, depth=2 +{0x1ffffffffffffe00, -1,{0xffff,0x1df3}}, // 3545 +{0xfff000000000003f, -1,{0xffff,0x1311}}, // 3546 +{0xfffffffe00000fff, -1,{0xffff,0x17ea}}, // 3547, depth=1 +{0x0007fffe0007fffe, -1,{0xffff,0x07d1}}, // 3548, depth=1 +{0x00000000fff8000f, 3171,{0x0350,0xffff}}, // 3549, depth=2 +{0x07ffc00007ffc000, 3172,{0xffff,0x048c}}, // 3550, depth=2 +{0x00000000ffffe07f, -1,{0x04d9,0xffff}}, // 3551 +{0x01fffff800000000, -1,{0xffff,0x1755}}, // 3552 +{0x00ffffff00000000, -1,{0xffff,0x1817}}, // 3553 +{0x0000000600000000, -1,{0xffff,0x17c1}}, // 3554 +{0x00000000e3ffffff, 3182,{0x00dc,0xffff}}, // 3555, depth=2 +{0x0007ff000007ff00, -1,{0xffff,0x060a}}, // 3556, depth=1 +{0xfff00000ffffffff, -1,{0xffff,0x132b}}, // 3557, depth=1 +{0xfffffc3fffffffff, -1,{0xffff,0x15bb}}, // 3558 +{0xfffff03fffffffff, -1,{0xffff,0x1539}}, // 3559, depth=1 +{0x003ffffffffffffc, -1,{0xffff,0x1fb3}}, // 3560 +{0xffffffbfffffffbf, 3184,{0xffff,0x065e}}, // 3561, depth=2 +{0x00000007ff800000, 3185,{0xffff,0x1a4b}}, // 3562, depth=2 +{0x003fffffffffffff, -1,{0xffff,0x1035}}, // 3563 +{0x7fe0000000000000, -1,{0xffff,0x12c9}}, // 3564, depth=1 +{0x00000000fff8001f, -1,{0x0351,0xffff}}, // 3565, depth=1 +{0x0000000000f800f8, 3187,{0x0364,0xffff}}, // 3566, depth=2 +{0x00000000f3fff3ff, -1,{0x012d,0xffff}}, // 3567, depth=1 +{0xfffffff000ffffff, 3570,{0xffff,0x1733}}, // 3568 +{0xfffff8000fffffff, -1,{0xffff,0x1570}}, // 3569, depth=1 +{0xffffff8000007fff, -1,{0xffff,0x1667}}, // 3570 +{0xfe000003fe000003, -1,{0xffff,0x01c8}}, // 3571, depth=1 +{0x00ffffffffffffc0, -1,{0xffff,0x1eb1}}, // 3572, depth=1 +{0xffe0001fffffffff, -1,{0xffff,0x12ef}}, // 3573, depth=1 +{0x3000000030000000, -1,{0xffff,0x0101}}, // 3574, depth=1 +{0x0fff0fff0fff0fff, 3190,{0xffff,0x002b}}, // 3575, depth=2 +{0x0ffff80000000000, 3577,{0xffff,0x1550}}, // 3576 +{0x7fffffc07fffffc0, -1,{0xffff,0x0698}}, // 3577 +{0xff007fffffffffff, -1,{0xffff,0x1236}}, // 3578 +{0xfe000000007fffff, 3193,{0xffff,0x11dd}}, // 3579, depth=2 +{0x0f000f000f000f00, 3197,{0xffff,0x0223}}, // 3580, depth=2 +{0xffffffffffff07ff, -1,{0xffff,0x1c3a}}, // 3581, depth=1 +{0x0000000000fff800, -1,{0x054c,0x1d4c}}, // 3582, depth=1 +{0xfffffffc0000ffff, -1,{0xffff,0x17ad}}, // 3583, depth=1 +{0x0000000000000e00, -1,{0x05c2,0x1dc2}}, // 3584, depth=1 +{0x00000000e0ffe0ff, -1,{0x00ea,0xffff}}, // 3585, depth=1 +{0x00000003fffc0000, -1,{0xffff,0x1b8f}}, // 3586, depth=1 +{0xffc00fffffffffff, -1,{0xffff,0x12b5}}, // 3587, depth=1 +{0x007ff80000000000, 3198,{0xffff,0x154b}}, // 3588, depth=2 +{0xfff1fff1fff1fff1, 3202,{0xffff,0x032c}}, // 3589, depth=2 +{0x0000000008000800, -1,{0x0160,0xffff}}, // 3590, depth=1 +{0xffffff0003ffffff, -1,{0xffff,0x1631}}, // 3591, depth=1 +{0x003ff800003ff800, -1,{0xffff,0x054a}}, // 3592, depth=1 +{0xffffffffffe07fff, -1,{0xffff,0x1af9}}, // 3593, depth=1 +{0x7fffffffffffe000, -1,{0xffff,0x1cf1}}, // 3594, depth=1 +{0x000001e0000001e0, -1,{0xffff,0x06c3}}, // 3595 +{0x0000001800000000, -1,{0xffff,0x1741}}, // 3596, depth=1 +{0x00000000fff8003f, -1,{0x0352,0xffff}}, // 3597, depth=1 +{0x001ffffffff00000, -1,{0xffff,0x1b20}}, // 3598, depth=1 +{0xffff0000000fffff, 3602,{0xffff,0x1423}}, // 3599 +{0x00000000000ffc00, -1,{0x0589,0x1d89}}, // 3600, depth=1 +{0x00000000c3ffffff, -1,{0x009b,0xffff}}, // 3601, depth=1 +{0xfff000000000007f, -1,{0xffff,0x1312}}, // 3602 +{0xc000003fc000003f, 3204,{0xffff,0x0087}}, // 3603, depth=2 +{0x00ffffffffffffe0, -1,{0xffff,0x1ef2}}, // 3604, depth=1 +{0xff0000000007ffff, -1,{0xffff,0x121a}}, // 3605, depth=1 +{0xf803ffffffffffff, -1,{0xffff,0x1176}}, // 3606 +{0x000000fffffc0000, -1,{0xffff,0x1b95}}, // 3607 +{0xfffffffc03ffffff, -1,{0xffff,0x17b7}}, // 3608 +{0x0000007c00000000, 3612,{0xffff,0x1784}}, // 3609 +{0x0000000000780000, -1,{0x0343,0x1b43}}, // 3610, depth=1 +{0x00000000ff00ffff, -1,{0x0217,0xffff}}, // 3611, depth=1 +{0x0000000000000ff0, -1,{0x0707,0x1f07}}, // 3612 +{0x000003ff000003ff, 3205,{0xffff,0x0009}}, // 3613, depth=2 +{0x000001ffffffff80, -1,{0xffff,0x1e61}}, // 3614 +{0xffff003fffff003f, -1,{0xffff,0x0415}}, // 3615, depth=1 +{0x0000600000000000, -1,{0xffff,0x14c1}}, // 3616, depth=1 +{0x80ff80ff80ff80ff, -1,{0xffff,0x0068}}, // 3617, depth=1 +{0xffffffe07fffffff, -1,{0xffff,0x16f9}}, // 3618 +{0xfffc0000000007ff, -1,{0xffff,0x1398}}, // 3619, depth=1 +{0x0000001800000018, 3209,{0xffff,0x0741}}, // 3620, depth=2 +{0x0003fffe00000000, -1,{0xffff,0x17d0}}, // 3621 +{0x8000800080008000, 3210,{0xffff,0x0060}}, // 3622, depth=2 +{0xff800000000001ff, -1,{0xffff,0x1251}}, // 3623, depth=1 +{0xf8f8f8f8f8f8f8f8, -1,{0xffff,0x0174}}, // 3624, depth=1 +{0xe07fe07fe07fe07f, 3212,{0xffff,0x00e9}}, // 3625, depth=2 +{0xffffffc000000000, -1,{0xffff,0x1699}}, // 3626, depth=1 +{0xffffffc000000001, -1,{0xffff,0x169a}}, // 3627, depth=1 +{0x00fffffffffffff8, -1,{0xffff,0x1f74}}, // 3628, depth=1 +{0xffffffc000000003, -1,{0xffff,0x169b}}, // 3629, depth=1 +{0x0000000044444444, 3213,{0x00b8,0xffff}}, // 3630, depth=2 +{0xfffff0fffffff0ff, 3215,{0xffff,0x051b}}, // 3631, depth=2 +{0x0007fffff0000000, 3216,{0xffff,0x1916}}, // 3632, depth=2 +{0x00000000e0003fff, 3218,{0x00d0,0xffff}}, // 3633, depth=3 +{0x00fffffffffffffe, -1,{0xffff,0x1ff6}}, // 3634, depth=1 +{0x00ffffffffffffff, -1,{0xffff,0x1037}}, // 3635, depth=1 +{0x0100000000000000, -1,{0xffff,0x1200}}, // 3636, depth=1 +{0xfffffff800001fff, -1,{0xffff,0x1769}}, // 3637, depth=1 +{0x00f0000000f00000, 3223,{0xffff,0x0303}}, // 3638, depth=2 +{0xfffff001fffff001, -1,{0xffff,0x0514}}, // 3639, depth=1 +{0x0000003ffc000000, 3224,{0xffff,0x198b}}, // 3640, depth=2 +{0xffffffc00000000f, 3229,{0xffff,0x169d}}, // 3641, depth=2 +{0xffffe7ffffffe7ff, -1,{0xffff,0x04dd}}, // 3642 +{0xfffffffff80000ff, -1,{0xffff,0x196c}}, // 3643, depth=1 +{0xfffe000000003fff, -1,{0xffff,0x13dc}}, // 3644 +{0x0000000700000007, -1,{0xffff,0x0002}}, // 3645, depth=1 +{0x07ffffffffffff80, -1,{0xffff,0x1e73}}, // 3646 +{0xffff01ffffffffff, -1,{0xffff,0x1438}}, // 3647, depth=1 +{0x003fffffc0000000, -1,{0xffff,0x1897}}, // 3648 +{0x03fffe0000000000, 3651,{0xffff,0x15d0}}, // 3649 +{0x0003ffffff800000, 3234,{0xffff,0x1a5a}}, // 3650, depth=2 +{0x1ffffff01ffffff0, -1,{0xffff,0x0718}}, // 3651 +{0x0000000000ffe000, 3236,{0x04ca,0x1cca}}, // 3652, depth=2 +{0xff8fffffffffffff, -1,{0xffff,0x127c}}, // 3653 +{0x07fffffffffe0000, -1,{0xffff,0x1be9}}, // 3654, depth=1 +{0x000f000f000f000f, -1,{0xffff,0x0023}}, // 3655, depth=1 +{0x000ffffff0000000, -1,{0xffff,0x1917}}, // 3656 +{0xffffffc00000001f, -1,{0xffff,0x169e}}, // 3657, depth=1 +{0xfff80000007fffff, -1,{0xffff,0x1363}}, // 3658 +{0xf1fff1fff1fff1ff, -1,{0xffff,0x012c}}, // 3659, depth=1 +{0x0000000007fff000, -1,{0x050e,0x1d0e}}, // 3660, depth=1 +{0x00000000fff8007f, 3237,{0x0353,0xffff}}, // 3661, depth=2 +{0xfffffffc00003fff, -1,{0xffff,0x17ab}}, // 3662 +{0xffc07fffffffffff, -1,{0xffff,0x12b8}}, // 3663, depth=1 +{0x0006000000060000, -1,{0xffff,0x03c1}}, // 3664, depth=1 +{0xfc0001fffc0001ff, 3240,{0xffff,0x018e}}, // 3665, depth=2 +{0xc01fffffffffffff, -1,{0xffff,0x10b6}}, // 3666 +{0x000001ffffffffc0, -1,{0xffff,0x1ea2}}, // 3667 +{0x000000000f000000, -1,{0x0203,0x1a03}}, // 3668, depth=1 +{0xf001f001f001f001, 3242,{0xffff,0x0124}}, // 3669, depth=3 +{0xfffffffff007ffff, 3671,{0xffff,0x1936}}, // 3670 +{0xffff800000001fff, -1,{0xffff,0x145d}}, // 3671 +{0x0000000007c007c0, 3250,{0x02a4,0xffff}}, // 3672, depth=2 +{0x003fffffffc00000, -1,{0xffff,0x1a9f}}, // 3673 +{0x001fffc0001fffc0, 3252,{0xffff,0x068e}}, // 3674, depth=2 +{0x0000000081ff81ff, -1,{0x0069,0xffff}}, // 3675, depth=1 +{0x0000780000007800, -1,{0xffff,0x0543}}, // 3676 +{0xffffe00000000fff, -1,{0xffff,0x14de}}, // 3677, depth=1 +{0x0ffe000000000000, -1,{0xffff,0x13ca}}, // 3678, depth=1 +{0x00000000c0003fff, -1,{0x008f,0xffff}}, // 3679, depth=1 +{0xffff0003ffffffff, -1,{0xffff,0x1431}}, // 3680 +{0xfc000003fc000003, 3253,{0xffff,0x0187}}, // 3681, depth=2 +{0x00ffffffe0000000, 3264,{0xffff,0x18da}}, // 3682, depth=2 +{0xf00fffffffffffff, -1,{0xffff,0x1137}}, // 3683, depth=1 +{0x00000000fe00fe00, -1,{0x01e6,0xffff}}, // 3684, depth=1 +{0xc000000007ffffff, -1,{0xffff,0x109c}}, // 3685, depth=1 +{0xfffc007fffffffff, -1,{0xffff,0x13b4}}, // 3686 +{0xfe0000007fffffff, -1,{0xffff,0x11e5}}, // 3687, depth=1 +{0x000007ffffffff00, -1,{0xffff,0x1e22}}, // 3688 +{0xff8000000001ffff, 3265,{0xffff,0x1259}}, // 3689, depth=2 +{0x003ffff000000000, -1,{0xffff,0x1711}}, // 3690, depth=1 +{0xfff80001ffffffff, -1,{0xffff,0x136d}}, // 3691, depth=1 +{0x00003ffc00003ffc, -1,{0xffff,0x078b}}, // 3692, depth=1 +{0x0000000083ffffff, 3267,{0x005a,0xffff}}, // 3693, depth=3 +{0x000003fc00000000, -1,{0xffff,0x1787}}, // 3694, depth=1 +{0xc0000000000007ff, -1,{0xffff,0x108c}}, // 3695 +{0x000000fffffffc00, 3697,{0xffff,0x1d9d}}, // 3696 +{0x00001ffffffc0000, -1,{0xffff,0x1b9a}}, // 3697 +{0xfe00000fffffffff, -1,{0xffff,0x11ea}}, // 3698 +{0xe0000007ffffffff, -1,{0xffff,0x10e5}}, // 3699, depth=1 +{0x0000000000003f00, -1,{0x0605,0x1e05}}, // 3700, depth=1 +{0xfffffffffff0ffff, -1,{0xffff,0x1b3b}}, // 3701, depth=1 +{0x0000007ffff00000, -1,{0xffff,0x1b12}}, // 3702 +{0xf0000000000003ff, -1,{0xffff,0x110d}}, // 3703, depth=1 +{0x07ffffffffffffe0, -1,{0xffff,0x1ef5}}, // 3704 +{0xffffffc00001ffff, -1,{0xffff,0x16aa}}, // 3705 +{0x03fffffffff00000, 3275,{0xffff,0x1b25}}, // 3706, depth=2 +{0xfffffff8000007ff, 3276,{0xffff,0x1767}}, // 3707, depth=2 +{0x00003e0000003e00, -1,{0xffff,0x05c4}}, // 3708, depth=1 +{0x000001fffffffffc, -1,{0xffff,0x1fa6}}, // 3709 +{0x000001fffffffffe, -1,{0xffff,0x1fe7}}, // 3710 +{0x0000020000000000, -1,{0xffff,0x15c0}}, // 3711 +{0x00ffffffff000000, -1,{0xffff,0x1a1f}}, // 3712 +{0xff83ff83ff83ff83, 3277,{0xffff,0x026a}}, // 3713, depth=2 +{0x00007ffc00000000, -1,{0xffff,0x178c}}, // 3714 +{0x07fffffffffffff8, 3716,{0xffff,0x1f77}}, // 3715 +{0x0003e00000000000, 3723,{0xffff,0x14c4}}, // 3716 +{0xffffc007ffffffff, -1,{0xffff,0x14b4}}, // 3717, depth=1 +{0x000000007ff80000, 3281,{0x034b,0x1b4b}}, // 3718, depth=2 +{0x00000000f8ffffff, -1,{0x015c,0xffff}}, // 3719, depth=1 +{0x07fffffffffffe00, -1,{0xffff,0x1df1}}, // 3720, depth=1 +{0xe00003ffe00003ff, 3282,{0xffff,0x00cc}}, // 3721, depth=2 +{0x0ffffffc00000000, -1,{0xffff,0x1799}}, // 3722, depth=1 +{0x00000000007f8000, -1,{0x0447,0x1c47}}, // 3723 +{0x00003fffffffff00, -1,{0xffff,0x1e25}}, // 3724 +{0xfe000000003fffff, -1,{0xffff,0x11dc}}, // 3725, depth=1 +{0x0003ffff00000000, -1,{0xffff,0x1811}}, // 3726, depth=1 +{0xffff83ffffff83ff, -1,{0xffff,0x045a}}, // 3727, depth=1 +{0x00ffffffc0000000, -1,{0xffff,0x1899}}, // 3728, depth=1 +{0x07fffffffffffffc, -1,{0xffff,0x1fb8}}, // 3729 +{0x0000000000780078, 3291,{0x0363,0xffff}}, // 3730, depth=2 +{0xf8000000001fffff, 3293,{0xffff,0x1159}}, // 3731, depth=2 +{0x07fffffffffffffe, -1,{0xffff,0x1ff9}}, // 3732 +{0x00000000ffc03fff, -1,{0x0297,0xffff}}, // 3733, depth=1 +{0xffffffe01fffffff, -1,{0xffff,0x16f7}}, // 3734 +{0xfffc0fffffffffff, -1,{0xffff,0x13b9}}, // 3735 +{0x0ffffe0000000000, -1,{0xffff,0x15d2}}, // 3736 +{0x07ff07ff07ff07ff, 3296,{0xffff,0x002a}}, // 3737, depth=2 +{0x0000003800000000, -1,{0xffff,0x1742}}, // 3738 +{0xfffffc0007ffffff, -1,{0xffff,0x15b0}}, // 3739 +{0x001fc00000000000, -1,{0xffff,0x1486}}, // 3740, depth=1 +{0xffc0ffffffc0ffff, 3297,{0xffff,0x0299}}, // 3741, depth=2 +{0x0700070007000700, 3298,{0xffff,0x0222}}, // 3742, depth=2 +{0xffffffffffff81ff, -1,{0xffff,0x1c79}}, // 3743, depth=1 +{0x7ff87ff87ff87ff8, -1,{0xffff,0x036b}}, // 3744, depth=1 +{0xff80000fff80000f, 3302,{0xffff,0x024c}}, // 3745, depth=2 +{0x0001e0000001e000, -1,{0xffff,0x04c3}}, // 3746 +{0x00000ffffff00000, -1,{0xffff,0x1b17}}, // 3747 +{0x00007f0000000000, -1,{0xffff,0x1606}}, // 3748, depth=1 +{0x00000000e07fe07f, 3303,{0x00e9,0xffff}}, // 3749, depth=2 +{0x0000000003ffff80, -1,{0x0652,0x1e52}}, // 3750, depth=1 +{0xffc3ffffffffffff, -1,{0xffff,0x12bb}}, // 3751 +{0xffffffdfffffffff, -1,{0xffff,0x16be}}, // 3752 +{0xe0000007e0000007, 3304,{0xffff,0x00c5}}, // 3753, depth=2 +{0x0000000007800780, 3306,{0x0263,0xffff}}, // 3754, depth=2 +{0xfffff807ffffffff, -1,{0xffff,0x1577}}, // 3755, depth=1 +{0x0000000000380000, 3309,{0x0342,0x1b42}}, // 3756, depth=2 +{0x07ffffffe0000000, -1,{0xffff,0x18dd}}, // 3757 +{0xffffffe000000001, -1,{0xffff,0x16db}}, // 3758 +{0xffff8007ffff8007, -1,{0xffff,0x0453}}, // 3759, depth=1 +{0x003fffffffffff00, -1,{0xffff,0x1e2d}}, // 3760, depth=1 +{0xc07fffffc07fffff, -1,{0xffff,0x0098}}, // 3761, depth=1 +{0x0001fffffffffc00, -1,{0xffff,0x1da6}}, // 3762, depth=1 +{0xff80001fffffffff, -1,{0xffff,0x126d}}, // 3763, depth=1 +{0x00007fe000007fe0, -1,{0xffff,0x06c9}}, // 3764, depth=1 +{0xffffffe000000003, -1,{0xffff,0x16dc}}, // 3765 +{0xfffffffffffc01ff, -1,{0xffff,0x1bb6}}, // 3766 +{0xffffff8000001fff, -1,{0xffff,0x1665}}, // 3767 +{0x00000000e00fffff, -1,{0x00d6,0xffff}}, // 3768 +{0xfffff000000007ff, -1,{0xffff,0x151e}}, // 3769 +{0x03ffc00003ffc000, 3311,{0xffff,0x048b}}, // 3770, depth=2 +{0x0000000080003fff, -1,{0x004e,0xffff}}, // 3771, depth=1 +{0x0000003800000038, -1,{0xffff,0x0742}}, // 3772 +{0x00000000e0000fff, 3317,{0x00ce,0xffff}}, // 3773, depth=2 +{0xfffffffffffc0000, -1,{0xffff,0x1bad}}, // 3774, depth=1 +{0xfffffffffffc0001, -1,{0xffff,0x1bae}}, // 3775, depth=1 +{0x0000007ffe000000, -1,{0xffff,0x19cd}}, // 3776, depth=1 +{0x0007000700070007, 3321,{0xffff,0x0022}}, // 3777, depth=2 +{0x001ff80000000000, -1,{0xffff,0x1549}}, // 3778, depth=1 +{0xfe0000003fffffff, 3324,{0xffff,0x11e4}}, // 3779, depth=2 +{0x00000001ffff8000, -1,{0xffff,0x1c51}}, // 3780, depth=1 +{0xf80000000fffffff, 3327,{0xffff,0x1160}}, // 3781, depth=2 +{0x0000000040404040, 3328,{0x00b0,0xffff}}, // 3782, depth=3 +{0x000000000fff0fff, -1,{0x002b,0xffff}}, // 3783, depth=1 +{0x7800780078007800, 3337,{0xffff,0x0163}}, // 3784, depth=2 +{0x00000000f00003ff, -1,{0x010d,0xffff}}, // 3785, depth=1 +{0x00fffffe00fffffe, -1,{0xffff,0x07d6}}, // 3786, depth=1 +{0xe003ffffffffffff, -1,{0xffff,0x10f4}}, // 3787, depth=1 +{0xffc003ffffc003ff, 3790,{0xffff,0x0293}}, // 3788 +{0x00000000fff800ff, 3338,{0x0354,0xffff}}, // 3789, depth=2 +{0xfe000001fe000001, -1,{0xffff,0x01c7}}, // 3790 +{0xe000000003ffffff, -1,{0xffff,0x10dc}}, // 3791 +{0x000007e000000000, -1,{0xffff,0x16c5}}, // 3792, depth=1 +{0xfffc03ffffffffff, -1,{0xffff,0x13b7}}, // 3793, depth=1 +{0x00ffff0000ffff00, -1,{0xffff,0x060f}}, // 3794, depth=1 +{0xffc0007fffc0007f, 3343,{0xffff,0x0290}}, // 3795, depth=2 +{0xffffffe00000001f, 3803,{0xffff,0x16df}}, // 3796 +{0x00000000fffff7ff, 3346,{0x051e,0xffff}}, // 3797, depth=2 +{0x00000000fffff800, -1,{0x0554,0x1d54}}, // 3798, depth=1 +{0x00000000fffff801, 3349,{0x0555,0xffff}}, // 3799, depth=2 +{0x4444444444444444, 3351,{0xffff,0x00b8}}, // 3800, depth=2 +{0x00000000fffff803, 3352,{0x0556,0xffff}}, // 3801, depth=2 +{0x0000ffffffff8000, -1,{0xffff,0x1c60}}, // 3802, depth=1 +{0xffc000000000ffff, -1,{0xffff,0x1299}}, // 3803 +{0xfffffff0007fffff, 3811,{0xffff,0x1732}}, // 3804 +{0x00000000fffff807, 3360,{0x0557,0xffff}}, // 3805, depth=2 +{0x00001ffff8000000, -1,{0xffff,0x1951}}, // 3806, depth=1 +{0xffffffffe1ffffff, -1,{0xffff,0x18fb}}, // 3807, depth=1 +{0x0f8000000f800000, -1,{0xffff,0x0244}}, // 3808, depth=1 +{0xffffff0000000fff, -1,{0xffff,0x1623}}, // 3809, depth=1 +{0x000000003ff80000, -1,{0x034a,0x1b4a}}, // 3810, depth=1 +{0xfffe0003fffe0003, 3818,{0xffff,0x03d0}}, // 3811 +{0x0000000000380038, 3361,{0x0362,0xffff}}, // 3812, depth=2 +{0x00000000fffff80f, -1,{0x0558,0xffff}}, // 3813, depth=1 +{0x0000000003ffffc0, 3365,{0x0693,0x1e93}}, // 3814, depth=2 +{0xfff3fffffff3ffff, -1,{0xffff,0x031d}}, // 3815, depth=1 +{0x0000000000007000, -1,{0x0502,0x1d02}}, // 3816, depth=1 +{0xffffdfffffffdfff, 3369,{0xffff,0x049e}}, // 3817, depth=2 +{0x00000000ff000fff, -1,{0x0213,0xffff}}, // 3818 +{0x00000000c0000fff, -1,{0x008d,0xffff}}, // 3819, depth=1 +{0x00ffffff80000000, -1,{0xffff,0x1858}}, // 3820, depth=1 +{0xfffc7fffffffffff, -1,{0xffff,0x13bc}}, // 3821 +{0x000fffffffff0000, -1,{0xffff,0x1c23}}, // 3822, depth=1 +{0xfffffffff0001fff, -1,{0xffff,0x1930}}, // 3823, depth=1 +{0x00000001fffc0000, -1,{0xffff,0x1b8e}}, // 3824 +{0xe00000000000ffff, 3372,{0xffff,0x10d2}}, // 3825, depth=2 +{0x00001ffffffffc00, -1,{0xffff,0x1da2}}, // 3826 +{0xffffc00003ffffff, -1,{0xffff,0x14ab}}, // 3827 +{0x0000000000003f80, -1,{0x0646,0x1e46}}, // 3828, depth=1 +{0x00000000fffff81f, -1,{0x0559,0xffff}}, // 3829, depth=1 +{0x0003ffe00003ffe0, 3374,{0xffff,0x06cc}}, // 3830, depth=2 +{0x00000000e03fe03f, -1,{0x00e8,0xffff}}, // 3831, depth=1 +{0x0000001fffe00000, -1,{0xffff,0x1acf}}, // 3832, depth=1 +{0x00000000fe1fffff, 3375,{0x01db,0xffff}}, // 3833, depth=3 +{0xf8ffffffffffffff, -1,{0xffff,0x117c}}, // 3834 +{0x00000000ffe003ff, 3378,{0x02d4,0xffff}}, // 3835, depth=2 +{0xfff800003fffffff, 3838,{0xffff,0x136a}}, // 3836 +{0xfc000000000003ff, 3379,{0xffff,0x118f}}, // 3837, depth=2 +{0xffe07fffffe07fff, -1,{0xffff,0x02d9}}, // 3838 +{0x80003fffffffffff, 3381,{0xffff,0x106e}}, // 3839, depth=2 +{0x0000000000000f00, 3382,{0x0603,0x1e03}}, // 3840, depth=2 +{0xc000000000007fff, -1,{0xffff,0x1090}}, // 3841, depth=1 +{0x00000ffffe000000, -1,{0xffff,0x19d2}}, // 3842, depth=1 +{0xfff8000000ffffff, 3386,{0xffff,0x1364}}, // 3843, depth=2 +{0xffffff00000fffff, -1,{0xffff,0x162b}}, // 3844 +{0x000003fffffff000, 3847,{0xffff,0x1d1d}}, // 3845 +{0x0000000003ffffe0, -1,{0x06d4,0x1ed4}}, // 3846, depth=1 +{0x00007ffffff00000, -1,{0xffff,0x1b1a}}, // 3847 +{0x03ffc00000000000, 3398,{0xffff,0x148b}}, // 3848, depth=2 +{0xffffffe00000003f, -1,{0xffff,0x16e0}}, // 3849 +{0x0000fffffffc0000, -1,{0xffff,0x1b9d}}, // 3850 +{0xfffffffffffe0001, 3852,{0xffff,0x1bef}}, // 3851 +{0x00000000ffcfffcf, -1,{0x02ad,0xffff}}, // 3852 +{0xfffffff1fffffff1, 3399,{0xffff,0x071c}}, // 3853, depth=2 +{0x00000007ff000000, -1,{0xffff,0x1a0a}}, // 3854, depth=1 +{0xfffffffffffe0003, -1,{0xffff,0x1bf0}}, // 3855 +{0x000000001ff80000, -1,{0x0349,0x1b49}}, // 3856, depth=1 +{0x9fffffffffffffff, -1,{0xffff,0x107d}}, // 3857, depth=1 +{0x000000003e3e3e3e, -1,{0x01f4,0xffff}}, // 3858, depth=1 +{0xfffffffffffe000f, -1,{0xffff,0x1bf2}}, // 3859 +{0x000c000000000000, -1,{0xffff,0x1381}}, // 3860, depth=1 +{0x00000000fffff83f, -1,{0x055a,0xffff}}, // 3861, depth=1 +{0x7f8000007f800000, 3400,{0xffff,0x0247}}, // 3862, depth=2 +{0xfffffc000003ffff, 3401,{0xffff,0x15a7}}, // 3863, depth=2 +{0x0000000040004000, -1,{0x00a0,0xffff}}, // 3864, depth=1 +{0x0ffffffffffff000, -1,{0xffff,0x1d2f}}, // 3865 +{0x3fe000003fe00000, 3405,{0xffff,0x02c8}}, // 3866, depth=3 +{0xfe1ffffffe1fffff, 3409,{0xffff,0x01db}}, // 3867, depth=3 +{0x00000000ffffe000, -1,{0x04d2,0x1cd2}}, // 3868, depth=1 +{0x00000000ffffe001, -1,{0x04d3,0xffff}}, // 3869, depth=1 +{0x0040000000400000, 3417,{0xffff,0x0280}}, // 3870, depth=2 +{0x00000000ffffe003, 3421,{0x04d4,0xffff}}, // 3871, depth=2 +{0xfe00000000000000, -1,{0xffff,0x11c6}}, // 3872, depth=1 +{0x00000000ffc00fff, 3425,{0x0295,0xffff}}, // 3873, depth=5 +{0x00000000007ff800, 3434,{0x054b,0x1d4b}}, // 3874, depth=3 +{0x00000000ffffe007, 3440,{0x04d5,0xffff}}, // 3875, depth=2 +{0x0000000003fffffe, 3443,{0x07d8,0x1fd8}}, // 3876, depth=2 +{0x0000000003ffffff, 3445,{0x0019,0x1019}}, // 3877, depth=2 +{0x0000000004000000, 3448,{0x0180,0x1980}}, // 3878, depth=2 +{0x00000000ff803fff, 3455,{0x0256,0xffff}}, // 3879, depth=3 +{0x01ffc00001ffc000, -1,{0xffff,0x048a}}, // 3880, depth=1 +{0xfffff8000000ffff, 3460,{0xffff,0x1564}}, // 3881, depth=2 +{0x1fffffffffffff80, -1,{0xffff,0x1e75}}, // 3882 +{0x00000000ffffe00f, 3461,{0x04d6,0xffff}}, // 3883, depth=2 +{0xfe07ffffffffffff, -1,{0xffff,0x11f9}}, // 3884 +{0xf80001fff80001ff, -1,{0xffff,0x014d}}, // 3885, depth=1 +{0x03fff80000000000, -1,{0xffff,0x154e}}, // 3886, depth=1 +{0x000000008f8f8f8f, 3462,{0x0074,0xffff}}, // 3887, depth=2 +{0x003fffffffffff80, -1,{0xffff,0x1e6e}}, // 3888, depth=1 +{0xff0000000fffffff, -1,{0xffff,0x1223}}, // 3889 +{0x0000000001fc0000, -1,{0x0386,0x1b86}}, // 3890, depth=1 +{0xfffffffffffe001f, -1,{0xffff,0x1bf3}}, // 3891 +{0x0000700000007000, 3464,{0xffff,0x0502}}, // 3892, depth=3 +{0xfffffffff00007ff, -1,{0xffff,0x192e}}, // 3893, depth=1 +{0x00fe00fe00fe00fe, -1,{0xffff,0x03e6}}, // 3894, depth=1 +{0x003fffff00000000, -1,{0xffff,0x1815}}, // 3895 +{0xfffffffffff00fff, 3897,{0xffff,0x1b37}}, // 3896 +{0xffff83ffffffffff, 3900,{0xffff,0x147a}}, // 3897 +{0x1ffff0001ffff000, -1,{0xffff,0x0510}}, // 3898, depth=1 +{0x00000000ffffe01f, 3469,{0x04d7,0xffff}}, // 3899, depth=2 +{0xffe3ffffffe3ffff, -1,{0xffff,0x02dc}}, // 3900 +{0xf8000003f8000003, 3471,{0xffff,0x0146}}, // 3901, depth=3 +{0x00fe000000fe0000, -1,{0xffff,0x03c6}}, // 3902, depth=1 +{0xffffffcfffffffcf, 3474,{0xffff,0x069d}}, // 3903, depth=2 +{0x00003ffffffe0000, -1,{0xffff,0x1bdc}}, // 3904, depth=1 +{0xfffffffffffffbff, -1,{0xffff,0x1d7e}}, // 3905, depth=1 +{0x07fffff000000000, 3475,{0xffff,0x1716}}, // 3906, depth=2 +{0xfffffffffffffc01, -1,{0xffff,0x1db6}}, // 3907, depth=1 +{0xf0f0f0f0f0f0f0f0, -1,{0xffff,0x0133}}, // 3908, depth=1 +{0xfffff8fffffff8ff, 3478,{0xffff,0x055c}}, // 3909, depth=3 +{0xffffc00000003fff, 3915,{0xffff,0x149f}}, // 3910 +{0x0000000080000fff, 3488,{0x004c,0xffff}}, // 3911, depth=2 +{0x000000c000000000, -1,{0xffff,0x1681}}, // 3912, depth=1 +{0x00000000dfffdfff, 3489,{0x00ae,0xffff}}, // 3913, depth=2 +{0x01fc000000000000, -1,{0xffff,0x1386}}, // 3914, depth=1 +{0x8000000001ffffff, -1,{0xffff,0x1059}}, // 3915 +{0x00000000e0e0e0e0, -1,{0x00f2,0xffff}}, // 3916, depth=1 +{0x00000000f003ffff, 3490,{0x0115,0xffff}}, // 3917, depth=2 +{0x0000000007000700, 3491,{0x0222,0xffff}}, // 3918, depth=2 +{0xffffffe00000007f, -1,{0xffff,0x16e1}}, // 3919 +{0xfffffffffffe003f, 3938,{0xffff,0x1bf4}}, // 3920 +{0xfffffffffffffc0f, -1,{0xffff,0x1db9}}, // 3921, depth=1 +{0x1ffffffffffe0000, -1,{0xffff,0x1beb}}, // 3922, depth=1 +{0xffffffffff0fffff, -1,{0xffff,0x1a3b}}, // 3923, depth=1 +{0x0000000000003fe0, -1,{0x06c8,0x1ec8}}, // 3924, depth=1 +{0x00000000fffff87f, 3493,{0x055b,0xffff}}, // 3925, depth=2 +{0xfff0000000000000, -1,{0xffff,0x130b}}, // 3926, depth=1 +{0xfff0000000000001, -1,{0xffff,0x130c}}, // 3927, depth=1 +{0x00ffffffff800000, -1,{0xffff,0x1a60}}, // 3928, depth=1 +{0xfff0000000000003, -1,{0xffff,0x130d}}, // 3929, depth=1 +{0x001fe000001fe000, -1,{0xffff,0x04c7}}, // 3930, depth=1 +{0x00000000ffffe03f, -1,{0x04d8,0xffff}}, // 3931, depth=1 +{0x0000000000ff8000, 3494,{0x0448,0x1c48}}, // 3932, depth=2 +{0xfff0000000000007, -1,{0xffff,0x130e}}, // 3933, depth=1 +{0x000000003c3c3c3c, -1,{0x01b3,0xffff}}, // 3934, depth=1 +{0xfe0000000000003f, -1,{0xffff,0x11cc}}, // 3935, depth=1 +{0x00000001f8000000, 3495,{0xffff,0x1945}}, // 3936, depth=2 +{0x00000000ffffc7ff, 3498,{0x049c,0xffff}}, // 3937, depth=2 +{0xff80003fffffffff, -1,{0xffff,0x126e}}, // 3938 +{0x00000000ffe3ffe3, -1,{0x02ec,0xffff}}, // 3939, depth=1 +{0x0000000000003ff0, -1,{0x0709,0x1f09}}, // 3940, depth=1 +{0xfff000000000000f, -1,{0xffff,0x130f}}, // 3941, depth=1 +{0x4040404040404040, 3501,{0xffff,0x00b0}}, // 3942, depth=2 +{0xffffffffffe007ff, -1,{0xffff,0x1af5}}, // 3943, depth=1 +{0x00000000007fe000, -1,{0x04c9,0x1cc9}}, // 3944, depth=1 +{0x00000000fc001fff, 3502,{0x0192,0xffff}}, // 3945, depth=3 +{0x7000700070007000, 3509,{0xffff,0x0122}}, // 3946, depth=2 +{0xffc00000001fffff, -1,{0xffff,0x129e}}, // 3947, depth=1 +{0x0000000000003ff8, 3510,{0x074a,0x1f4a}}, // 3948, depth=2 +{0x7ffffffffffc0000, -1,{0xffff,0x1bac}}, // 3949 +{0x00003fffffffffc0, -1,{0xffff,0x1ea7}}, // 3950 +{0xffffffcfffffffff, -1,{0xffff,0x16bd}}, // 3951, depth=1 +{0x0000000000003ffc, 3512,{0x078b,0x1f8b}}, // 3952, depth=2 +{0xfffff00000007fff, -1,{0xffff,0x1522}}, // 3953, depth=1 +{0x0000000000003ffe, 3516,{0x07cc,0x1fcc}}, // 3954, depth=2 +{0x0000000000003fff, -1,{0x000d,0x100d}}, // 3955, depth=1 +{0x0000000000004000, -1,{0x0480,0x1c80}}, // 3956, depth=1 +{0xfff000000000001f, -1,{0xffff,0x1310}}, // 3957, depth=1 +{0x0003f0000003f000, 3517,{0xffff,0x0505}}, // 3958, depth=2 +{0xff800fffff800fff, -1,{0xffff,0x0254}}, // 3959, depth=1 +{0xfffffffffffffe01, 3963,{0xffff,0x1df7}}, // 3960 +{0xc07fffffffffffff, -1,{0xffff,0x10b8}}, // 3961, depth=1 +{0x000001ffffffff00, -1,{0xffff,0x1e20}}, // 3962, depth=1 +{0xfffffff07fffffff, 3964,{0xffff,0x173a}}, // 3963 +{0xfffffc7ffffffc7f, -1,{0xffff,0x059c}}, // 3964 +{0xfffffffff801ffff, -1,{0xffff,0x1975}}, // 3965, depth=1 +{0x0fffffc00fffffc0, 3520,{0xffff,0x0695}}, // 3966, depth=2 +{0x00000000ffe3ffff, 3526,{0x02dc,0xffff}}, // 3967, depth=3 +{0x0000000000000f80, -1,{0x0644,0x1e44}}, // 3968, depth=1 +{0xfc0000000003ffff, 3530,{0xffff,0x1197}}, // 3969, depth=2 +{0x00003ffffffffe00, -1,{0xffff,0x1de4}}, // 3970, depth=1 +{0xfffffff80007ffff, -1,{0xffff,0x176f}}, // 3971, depth=1 +{0xfff7ffffffffffff, -1,{0xffff,0x133e}}, // 3972 +{0x000007fffffffff0, -1,{0xffff,0x1f26}}, // 3973 +{0x0000000000030000, -1,{0x0401,0x1c01}}, // 3974, depth=1 +{0xffffffffffffe3ff, -1,{0xffff,0x1cfc}}, // 3975, depth=1 +{0x07ffffffffffff00, -1,{0xffff,0x1e32}}, // 3976, depth=1 +{0x0000000000030003, 3532,{0x0021,0xffff}}, // 3977, depth=2 +{0xfff8000000000003, -1,{0xffff,0x134e}}, // 3978 +{0xfffffffffe000fff, -1,{0xffff,0x19f2}}, // 3979, depth=1 +{0x000003fe000003fe, -1,{0xffff,0x07c8}}, // 3980, depth=1 +{0x80000000000fffff, 3536,{0xffff,0x1054}}, // 3981, depth=2 +{0x000000007ffff800, 3538,{0x0553,0x1d53}}, // 3982, depth=2 +{0xe1ffe1ffe1ffe1ff, 3540,{0xffff,0x00eb}}, // 3983, depth=2 +{0x003fffffffffffe0, -1,{0xffff,0x1ef0}}, // 3984, depth=1 +{0xffffffe0007fffff, -1,{0xffff,0x16f1}}, // 3985, depth=1 +{0xfff8000000000007, -1,{0xffff,0x134f}}, // 3986 +{0x000007fffffffff8, -1,{0xffff,0x1f67}}, // 3987 +{0x0000030000000300, 3545,{0xffff,0x0601}}, // 3988, depth=2 +{0x80007fff80007fff, 3546,{0xffff,0x004f}}, // 3989, depth=2 +{0xffffffffc0ffffff, -1,{0xffff,0x18b9}}, // 3990 +{0xfff800000000000f, -1,{0xffff,0x1350}}, // 3991 +{0x0fc0000000000000, -1,{0xffff,0x1285}}, // 3992 +{0xe001e001e001e001, -1,{0xffff,0x00e3}}, // 3993, depth=1 +{0xfffffffffffffe1f, -1,{0xffff,0x1dfb}}, // 3994 +{0x9fffffff9fffffff, 3551,{0xffff,0x005d}}, // 3995, depth=2 +{0x0001ffc00001ffc0, -1,{0xffff,0x068a}}, // 3996, depth=1 +{0xffc000000fffffff, -1,{0xffff,0x12a5}}, // 3997, depth=1 +{0x1ff8000000000000, -1,{0xffff,0x1349}}, // 3998, depth=1 +{0xfe0000000000007f, -1,{0xffff,0x11cd}}, // 3999, depth=1 +{0x003ffffffffffff0, -1,{0xffff,0x1f31}}, // 4000, depth=1 +{0x00000001fffffc00, -1,{0xffff,0x1d96}}, // 4001 +{0x03c003c003c003c0, 3552,{0xffff,0x02a3}}, // 4002, depth=2 +{0x0000000080ff80ff, -1,{0x0068,0xffff}}, // 4003, depth=1 +{0x001ffe0000000000, 3553,{0xffff,0x15cb}}, // 4004, depth=2 +{0xffffff03ffffffff, -1,{0xffff,0x1639}}, // 4005 +{0xfffff000fffff000, 3554,{0xffff,0x0513}}, // 4006, depth=2 +{0xfff800000000001f, 4010,{0xffff,0x1351}}, // 4007 +{0x003ffffffffffff8, -1,{0xffff,0x1f72}}, // 4008, depth=1 +{0x00000000fc1ffc1f, -1,{0x01aa,0xffff}}, // 4009, depth=1 +{0x00000000f0007fff, -1,{0x0112,0xffff}}, // 4010 +{0x00000000f87fffff, 3558,{0x015b,0xffff}}, // 4011, depth=2 +{0x0000000600000006, 3560,{0xffff,0x07c1}}, // 4012, depth=2 +{0xfffe7ffffffe7fff, -1,{0xffff,0x03dd}}, // 4013, depth=1 +{0x003ffffffffffffe, -1,{0xffff,0x1ff4}}, // 4014, depth=1 +{0x00000000fc0007ff, 3563,{0x0190,0xffff}}, // 4015, depth=2 +{0x0040000000000000, -1,{0xffff,0x1280}}, // 4016, depth=1 +{0x0001fff000000000, -1,{0xffff,0x170c}}, // 4017 +{0x007ffff8007ffff8, -1,{0xffff,0x0753}}, // 4018 +{0x00000000ff800fff, 3568,{0x0254,0xffff}}, // 4019, depth=3 +{0x00000000003ff800, 3576,{0x054a,0x1d4a}}, // 4020, depth=3 +{0xfffe000003ffffff, -1,{0xffff,0x13e8}}, // 4021, depth=1 +{0x0000000001fffc00, -1,{0x058e,0x1d8e}}, // 4022, depth=1 +{0xc1c1c1c1c1c1c1c1, -1,{0xffff,0x00b2}}, // 4023, depth=1 +{0x0000000003c00000, -1,{0x0283,0x1a83}}, // 4024, depth=1 +{0xffffe7ffffffffff, -1,{0xffff,0x14fd}}, // 4025, depth=1 +{0x1fffffffffffffe0, 4027,{0xffff,0x1ef7}}, // 4026 +{0x000f800000000000, 4035,{0xffff,0x1444}}, // 4027 +{0x000000003f803f80, -1,{0x0266,0xffff}}, // 4028, depth=1 +{0xfffffffffffc00ff, -1,{0xffff,0x1bb5}}, // 4029, depth=1 +{0x7ffffffff8000000, -1,{0xffff,0x1963}}, // 4030, depth=1 +{0xfff001fffff001ff, -1,{0xffff,0x0314}}, // 4031, depth=1 +{0x0000000000000fc0, -1,{0x0685,0x1e85}}, // 4032, depth=1 +{0xfffffffffffffc7f, -1,{0xffff,0x1dbc}}, // 4033, depth=1 +{0x00000f8000000f80, -1,{0xffff,0x0644}}, // 4034, depth=1 +{0x0000000001fe0000, -1,{0x03c7,0x1bc7}}, // 4035 +{0x00003ffffffffff8, -1,{0xffff,0x1f6a}}, // 4036 +{0x0000fffffffffc00, -1,{0xffff,0x1da5}}, // 4037 +{0x00003ffffffffffe, -1,{0xffff,0x1fec}}, // 4038 +{0xfffffffffffffe3f, -1,{0xffff,0x1dfc}}, // 4039 +{0x1ffffffffffffff0, -1,{0xffff,0x1f38}}, // 4040 +{0x00000003ffffff00, -1,{0xffff,0x1e19}}, // 4041 +{0x0007f00000000000, -1,{0xffff,0x1506}}, // 4042, depth=1 +{0xf0007ffff0007fff, 3578,{0xffff,0x0112}}, // 4043, depth=2 +{0x00001fc000000000, -1,{0xffff,0x1686}}, // 4044, depth=1 +{0x00000000fff801ff, -1,{0x0355,0xffff}}, // 4045, depth=1 +{0x00000000000e0000, 3595,{0x03c2,0x1bc2}}, // 4046, depth=2 +{0xfff00003fff00003, -1,{0xffff,0x030d}}, // 4047, depth=1 +{0x00001ff800001ff8, -1,{0xffff,0x0749}}, // 4048, depth=1 +{0xffff80000007ffff, -1,{0xffff,0x1463}}, // 4049 +{0x1ffffffffffffff8, -1,{0xffff,0x1f79}}, // 4050 +{0x0007fc0000000000, -1,{0xffff,0x1588}}, // 4051 +{0x000000007fffe000, -1,{0x04d1,0x1cd1}}, // 4052, depth=1 +{0x00000000fffff8ff, 3599,{0x055c,0xffff}}, // 4053, depth=3 +{0x1ffffffffffffffc, -1,{0xffff,0x1fba}}, // 4054 +{0x8003ffff8003ffff, 3606,{0xffff,0x0052}}, // 4055, depth=2 +{0xfffffffe01ffffff, 4058,{0xffff,0x17f7}}, // 4056 +{0x1111111111111111, -1,{0xffff,0x0038}}, // 4057, depth=1 +{0xf07fffffffffffff, -1,{0xffff,0x113a}}, // 4058 +{0xfff80000ffffffff, -1,{0xffff,0x136c}}, // 4059, depth=1 +{0x00000000000e000e, 3607,{0x03e2,0xffff}}, // 4060, depth=2 +{0x000001ffff800000, -1,{0xffff,0x1a51}}, // 4061 +{0x003fffffe0000000, -1,{0xffff,0x18d8}}, // 4062, depth=1 +{0xfffffff03fffffff, -1,{0xffff,0x1739}}, // 4063 +{0x0000000000000fe0, -1,{0x06c6,0x1ec6}}, // 4064, depth=1 +{0xe0ffffffffffffff, 3608,{0xffff,0x10fa}}, // 4065, depth=2 +{0x7e00000000000000, -1,{0xffff,0x11c5}}, // 4066 +{0x0000780000000000, 4068,{0xffff,0x1543}}, // 4067 +{0x00fffffc00fffffc, -1,{0xffff,0x0795}}, // 4068 +{0x000007ffc0000000, -1,{0xffff,0x188c}}, // 4069 +{0xfffffffff803ffff, -1,{0xffff,0x1976}}, // 4070 +{0x3ffff80000000000, -1,{0xffff,0x1552}}, // 4071 +{0x0003000000000000, -1,{0xffff,0x1401}}, // 4072, depth=1 +{0xffffc03fffffc03f, -1,{0xffff,0x0497}}, // 4073, depth=1 +{0x000000003ffff800, -1,{0x0552,0x1d52}}, // 4074, depth=1 +{0xfffffffe000fffff, -1,{0xffff,0x17f2}}, // 4075, depth=1 +{0x007fffffffffc000, -1,{0xffff,0x1ca8}}, // 4076, depth=1 +{0xffe000000003ffff, -1,{0xffff,0x12dc}}, // 4077, depth=1 +{0xfffffff01fffffff, -1,{0xffff,0x1738}}, // 4078 +{0xff00ffffff00ffff, -1,{0xffff,0x0217}}, // 4079 +{0x00001c0000001c00, 3609,{0xffff,0x0582}}, // 4080, depth=3 +{0xff000007ffffffff, -1,{0xffff,0x122a}}, // 4081 +{0x000000e000000000, -1,{0xffff,0x16c2}}, // 4082 +{0xf800000003ffffff, -1,{0xffff,0x115e}}, // 4083 +{0x3c3c3c3c3c3c3c3c, -1,{0xffff,0x01b3}}, // 4084, depth=1 +{0xfffffffffc1fffff, -1,{0xffff,0x19ba}}, // 4085, depth=1 +{0x0000000038383838, -1,{0x0172,0xffff}}, // 4086, depth=1 +{0xff80001fff80001f, -1,{0xffff,0x024d}}, // 4087, depth=1 +{0x0000000000000ff8, -1,{0x0748,0x1f48}}, // 4088, depth=1 +{0x0007800000078000, -1,{0xffff,0x0443}}, // 4089 +{0x00000000003fe000, 3614,{0x04c8,0x1cc8}}, // 4090, depth=2 +{0x0ffffffffc000000, -1,{0xffff,0x19a1}}, // 4091 +{0x0000000000000ffc, -1,{0x0789,0x1f89}}, // 4092, depth=1 +{0xf80000000000ffff, 3618,{0xffff,0x1154}}, // 4093, depth=2 +{0x0000000000000ffe, 3621,{0x07ca,0x1fca}}, // 4094, depth=2 +{0x0000000000000fff, 3642,{0x000b,0x100b}}, // 4095, depth=2 +{0x0000000000001000, -1,{0x0500,0x1d00}}, // 4096, depth=1 +{0xfffe07ffffffffff, -1,{0xffff,0x13f9}}, // 4097 +{0x000007ffffc00000, -1,{0xffff,0x1a94}}, // 4098 +{0x80000003ffffffff, 3644,{0xffff,0x1062}}, // 4099, depth=2 +{0x1fffffffc0000000, -1,{0xffff,0x189e}}, // 4100 +{0xff003fffff003fff, -1,{0xffff,0x0215}}, // 4101, depth=1 +{0x01fff00000000000, -1,{0xffff,0x150c}}, // 4102 +{0x003fffffff000000, -1,{0xffff,0x1a1d}}, // 4103 +{0x000000c0000000c0, 3646,{0xffff,0x0681}}, // 4104, depth=2 +{0x00000000fff9fff9, -1,{0x036d,0xffff}}, // 4105, depth=1 +{0x00007ff000007ff0, -1,{0xffff,0x070a}}, // 4106, depth=1 +{0xfffffe000000ffff, -1,{0xffff,0x15e6}}, // 4107, depth=1 +{0x0007ff8000000000, 3648,{0xffff,0x164b}}, // 4108, depth=2 +{0xf003fffff003ffff, -1,{0xffff,0x0115}}, // 4109, depth=1 +{0x7fe07fe07fe07fe0, -1,{0xffff,0x02e9}}, // 4110, depth=1 +{0x00000000fff9ffff, -1,{0x035d,0xffff}}, // 4111, depth=1 +{0x00000000000ffe00, 3649,{0x05ca,0x1dca}}, // 4112, depth=3 +{0xffffffefffffffff, -1,{0xffff,0x16fe}}, // 4113 +{0x000000000fe00fe0, -1,{0x02e6,0xffff}}, // 4114, depth=1 +{0xf83ff83ff83ff83f, 3653,{0xffff,0x016a}}, // 4115, depth=2 +{0xfffffff000000000, -1,{0xffff,0x171b}}, // 4116 +{0xfc00003fffffffff, -1,{0xffff,0x11ab}}, // 4117, depth=1 +{0x000007f000000000, -1,{0xffff,0x1706}}, // 4118, depth=1 +{0xfffffff000000001, -1,{0xffff,0x171c}}, // 4119 +{0x000000001ffff800, -1,{0x0551,0x1d51}}, // 4120, depth=1 +{0xc000000000001fff, -1,{0xffff,0x108e}}, // 4121, depth=1 +{0x0000003fffff0000, -1,{0xffff,0x1c15}}, // 4122, depth=1 +{0x00000000ffffe0ff, -1,{0x04da,0xffff}}, // 4123, depth=1 +{0xfffffffffffe00ff, -1,{0xffff,0x1bf6}}, // 4124 +{0x000fff8000000000, -1,{0xffff,0x164c}}, // 4125 +{0x001ffffffffff000, -1,{0xffff,0x1d28}}, // 4126, depth=1 +{0xfe000000000000ff, -1,{0xffff,0x11ce}}, // 4127, depth=1 +{0x00000000fff0ffff, -1,{0x031b,0xffff}}, // 4128 +{0xffffffff01ffffff, -1,{0xffff,0x1838}}, // 4129, depth=1 +{0xfffffff00000000f, -1,{0xffff,0x171f}}, // 4130 +{0xffffffe0003fffff, -1,{0xffff,0x16f0}}, // 4131, depth=1 +{0x00000000000ffffc, -1,{0x0791,0x1f91}}, // 4132 +{0xfffe3fffffffffff, -1,{0xffff,0x13fc}}, // 4133 +{0x0001ffe000000000, 3656,{0xffff,0x16cb}}, // 4134, depth=2 +{0xff800000000003ff, 3658,{0xffff,0x1252}}, // 4135, depth=2 +{0x03ffffc003ffffc0, -1,{0xffff,0x0693}}, // 4136 +{0xffffffc0000001ff, -1,{0xffff,0x16a2}}, // 4137, depth=1 +{0x0000000078007800, -1,{0x0163,0xffff}}, // 4138, depth=1 +{0xffffe00001ffffff, -1,{0xffff,0x14eb}}, // 4139 +{0x00003fffffc00000, -1,{0xffff,0x1a97}}, // 4140 +{0xfc7fffffffffffff, -1,{0xffff,0x11bc}}, // 4141 +{0xffffff800007ffff, -1,{0xffff,0x166b}}, // 4142 +{0x8001ffffffffffff, 3662,{0xffff,0x1071}}, // 4143, depth=2 +{0x000000003fffe000, -1,{0x04d0,0x1cd0}}, // 4144, depth=1 +{0xfffffff00000001f, -1,{0xffff,0x1720}}, // 4145 +{0x00000ffc00000000, -1,{0xffff,0x1789}}, // 4146, depth=1 +{0x00000000ffff7fff, -1,{0x041e,0xffff}}, // 4147, depth=1 +{0x00000000ffff8000, -1,{0x0450,0x1c50}}, // 4148, depth=1 +{0x00000000ffff8001, -1,{0x0451,0xffff}}, // 4149, depth=1 +{0x0000fffc0000fffc, -1,{0xffff,0x078d}}, // 4150, depth=1 +{0x00000000ffff8003, 3666,{0x0452,0xffff}}, // 4151, depth=2 +{0xff03ffffffffffff, -1,{0xffff,0x1239}}, // 4152 +{0xff80000007ffffff, -1,{0xffff,0x1263}}, // 4153 +{0x007ffffffc000000, 3667,{0xffff,0x199c}}, // 4154, depth=2 +{0x00000000ffff8007, -1,{0x0453,0xffff}}, // 4155, depth=1 +{0x00003ff000000000, -1,{0xffff,0x1709}}, // 4156, depth=1 +{0x00000000f83fffff, 3670,{0x015a,0xffff}}, // 4157, depth=3 +{0x07ffe00007ffe000, -1,{0xffff,0x04cd}}, // 4158 +{0xffffe00fffffe00f, -1,{0xffff,0x04d6}}, // 4159, depth=1 +{0xfffffffffff807ff, 4165,{0xffff,0x1b77}}, // 4160 +{0xfffffffffffffcff, -1,{0xffff,0x1dbd}}, // 4161, depth=1 +{0x3ffffffc3ffffffc, 3673,{0xffff,0x079b}}, // 4162, depth=2 +{0x00000000ffff800f, -1,{0x0454,0xffff}}, // 4163, depth=1 +{0x00000003fffe0000, -1,{0xffff,0x1bd0}}, // 4164, depth=1 +{0xffffc1ffffffffff, -1,{0xffff,0x14ba}}, // 4165 +{0x0000fe000000fe00, -1,{0xffff,0x05c6}}, // 4166, depth=1 +{0x00000000807f807f, -1,{0x0067,0xffff}}, // 4167, depth=1 +{0x07ffffffffffffc0, -1,{0xffff,0x1eb4}}, // 4168, depth=1 +{0xfffffff00000003f, -1,{0xffff,0x1721}}, // 4169 +{0x0000000003800000, 3676,{0x0242,0x1a42}}, // 4170, depth=2 +{0x00000000ff003fff, 3680,{0x0215,0xffff}}, // 4171, depth=2 +{0x0003fff00003fff0, -1,{0xffff,0x070d}}, // 4172, depth=1 +{0xffffffffffffff00, 4175,{0xffff,0x1e37}}, // 4173 +{0x1ffffff000000000, -1,{0xffff,0x1718}}, // 4174, depth=1 +{0x007c000000000000, 4177,{0xffff,0x1384}}, // 4175 +{0x1ffff8001ffff800, -1,{0xffff,0x0551}}, // 4176, depth=1 +{0x000000000ff00000, -1,{0x0307,0x1b07}}, // 4177 +{0x3ffffe003ffffe00, -1,{0xffff,0x05d4}}, // 4178, depth=1 +{0x00000000ffff801f, 3686,{0x0455,0xffff}}, // 4179, depth=2 +{0xffffffffe07fffff, -1,{0xffff,0x18f9}}, // 4180 +{0xfff00000000000ff, -1,{0xffff,0x1313}}, // 4181, depth=1 +{0xfffffc0000001fff, -1,{0xffff,0x15a2}}, // 4182 +{0xffc00007ffffffff, -1,{0xffff,0x12ac}}, // 4183, depth=1 +{0x000fffffffe00000, -1,{0xffff,0x1ade}}, // 4184, depth=1 +{0xffffffe03fffffff, -1,{0xffff,0x16f8}}, // 4185, depth=1 +{0x000001ffffffffe0, -1,{0xffff,0x1ee3}}, // 4186, depth=1 +{0xffffffffffffff0f, 4193,{0xffff,0x1e3b}}, // 4187 +{0x01fffffff0000000, 3688,{0xffff,0x191c}}, // 4188, depth=2 +{0xfe01fffffe01ffff, -1,{0xffff,0x01d7}}, // 4189, depth=1 +{0x000000001fffe000, -1,{0x04cf,0x1ccf}}, // 4190, depth=1 +{0x0000000087878787, 3695,{0x0073,0xffff}}, // 4191, depth=2 +{0x000000003f003f00, 3696,{0x0225,0xffff}}, // 4192, depth=3 +{0xff0000000000ffff, -1,{0xffff,0x1217}}, // 4193 +{0x00000000fffc0001, -1,{0x038e,0xffff}}, // 4194 +{0x00000000fe00ffff, -1,{0x01d6,0xffff}}, // 4195, depth=1 +{0x0000ffc000000000, -1,{0xffff,0x1689}}, // 4196, depth=1 +{0xf81ffffff81fffff, 3698,{0xffff,0x0159}}, // 4197, depth=2 +{0xfffcfffcfffcfffc, 3702,{0xffff,0x03ad}}, // 4198, depth=2 +{0xfffffff8001fffff, -1,{0xffff,0x1771}}, // 4199 +{0x003fffff80000000, 3704,{0xffff,0x1856}}, // 4200, depth=2 +{0x000000fffffffe00, -1,{0xffff,0x1dde}}, // 4201 +{0x000001fffffffff0, -1,{0xffff,0x1f24}}, // 4202, depth=1 +{0xffffff03ffffff03, 3705,{0xffff,0x0619}}, // 4203, depth=2 +{0x0000007c0000007c, -1,{0xffff,0x0784}}, // 4204, depth=1 +{0xffffe000000fffff, -1,{0xffff,0x14e6}}, // 4205, depth=1 +{0xffffffffffffff1f, 4209,{0xffff,0x1e3c}}, // 4206 +{0xffffffffffe7ffff, -1,{0xffff,0x1afd}}, // 4207, depth=1 +{0x0001fffffffe0000, -1,{0xffff,0x1bdf}}, // 4208, depth=1 +{0x80001fffffffffff, -1,{0xffff,0x106d}}, // 4209 +{0x000001fffffffff8, -1,{0xffff,0x1f65}}, // 4210, depth=1 +{0x00000000ffff803f, -1,{0x0456,0xffff}}, // 4211, depth=1 +{0xffffffff00ffffff, -1,{0xffff,0x1837}}, // 4212 +{0xfcfffcfffcfffcff, -1,{0xffff,0x01ad}}, // 4213, depth=1 +{0x3ffe000000000000, 3709,{0xffff,0x13cc}}, // 4214, depth=2 +{0xfffff00ffffff00f, -1,{0xffff,0x0517}}, // 4215 +{0x07fffffffffffff0, 3710,{0xffff,0x1f36}}, // 4216, depth=2 +{0x000001ffffffffff, -1,{0xffff,0x1028}}, // 4217, depth=1 +{0xfc00fc00fc00fc00, 3711,{0xffff,0x01a5}}, // 4218, depth=2 +{0x0001ffffffffffc0, -1,{0xffff,0x1eaa}}, // 4219 +{0xfffffff0fffffff0, 3712,{0xffff,0x071b}}, // 4220, depth=2 +{0xf000000007ffffff, -1,{0xffff,0x111e}}, // 4221, depth=1 +{0x0fffe0000fffe000, 3714,{0xffff,0x04ce}}, // 4222, depth=2 +{0x00000000f1fff1ff, -1,{0x012c,0xffff}}, // 4223, depth=1 +{0x00e0000000e00000, 3715,{0xffff,0x02c2}}, // 4224, depth=4 +{0xffe0003fffffffff, -1,{0xffff,0x12f0}}, // 4225, depth=1 +{0x3838383838383838, 3724,{0xffff,0x0172}}, // 4226, depth=2 +{0xffff8000000007ff, -1,{0xffff,0x145b}}, // 4227, depth=1 +{0x0000000ffff80000, 3729,{0xffff,0x1b50}}, // 4228, depth=2 +{0x00000003fffffff0, 4240,{0xffff,0x1f1d}}, // 4229 +{0x00000003fffffe00, 3732,{0xffff,0x1dd8}}, // 4230, depth=2 +{0x07ffffffffffffff, 3734,{0xffff,0x103a}}, // 4231, depth=2 +{0x0800000000000000, -1,{0xffff,0x1140}}, // 4232, depth=1 +{0xfffff00000001fff, -1,{0xffff,0x1520}}, // 4233, depth=1 +{0x03fffffffffff000, -1,{0xffff,0x1d2d}}, // 4234, depth=1 +{0xfffffff0ffffffff, -1,{0xffff,0x173b}}, // 4235, depth=1 +{0x0003f8000003f800, -1,{0xffff,0x0546}}, // 4236, depth=1 +{0x003fffff003fffff, -1,{0xffff,0x0015}}, // 4237, depth=1 +{0x01ffffffffe00000, -1,{0xffff,0x1ae3}}, // 4238, depth=1 +{0xfffe000000000fff, -1,{0xffff,0x13da}}, // 4239, depth=1 +{0x0000007ffffff000, -1,{0xffff,0x1d1a}}, // 4240 +{0x003f000000000000, -1,{0xffff,0x1405}}, // 4241 +{0x000007ffff800000, -1,{0xffff,0x1a53}}, // 4242 +{0xfff800007fffffff, -1,{0xffff,0x136b}}, // 4243, depth=1 +{0x1fffffffffffff00, -1,{0xffff,0x1e34}}, // 4244, depth=1 +{0xffffffdfffffffdf, 3735,{0xffff,0x069e}}, // 4245, depth=2 +{0x0000000006000600, 3736,{0x01e1,0xffff}}, // 4246, depth=2 +{0x00000003fffffffc, -1,{0xffff,0x1f9f}}, // 4247 +{0x0780000007800000, 3738,{0xffff,0x0243}}, // 4248, depth=2 +{0x00000000803f803f, 3739,{0x0066,0xffff}}, // 4249, depth=2 +{0x0000000400000000, -1,{0xffff,0x1780}}, // 4250 +{0xfff0000fffffffff, -1,{0xffff,0x132f}}, // 4251, depth=1 +{0x000000000e000000, 3746,{0x01c2,0x19c2}}, // 4252, depth=2 +{0x00007e0000000000, -1,{0xffff,0x15c5}}, // 4253 +{0x003ffffe00000000, -1,{0xffff,0x17d4}}, // 4254 +{0xffffffffffff83ff, -1,{0xffff,0x1c7a}}, // 4255, depth=1 +{0xfff8000fffffffff, -1,{0xffff,0x1370}}, // 4256 +{0xfffffc00000007ff, -1,{0xffff,0x15a0}}, // 4257 +{0x3ffffffc00000000, -1,{0xffff,0x179b}}, // 4258, depth=1 +{0xc3ffffffffffffff, -1,{0xffff,0x10bb}}, // 4259, depth=1 +{0x000fffc0000fffc0, -1,{0xffff,0x068d}}, // 4260, depth=1 +{0xfffffffffff03fff, -1,{0xffff,0x1b39}}, // 4261, depth=1 +{0x0080008000800080, -1,{0xffff,0x0260}}, // 4262, depth=1 +{0x0001fffffffffff0, -1,{0xffff,0x1f2c}}, // 4263 +{0x000001ffe0000000, 3747,{0xffff,0x18cb}}, // 4264, depth=2 +{0x0001fffffffffff8, -1,{0xffff,0x1f6d}}, // 4265 +{0x001fffffffffc000, -1,{0xffff,0x1ca6}}, // 4266, depth=1 +{0xff8000000003ffff, -1,{0xffff,0x125a}}, // 4267, depth=1 +{0x7fffffc000000000, -1,{0xffff,0x1698}}, // 4268, depth=1 +{0xffffffc00003ffff, -1,{0xffff,0x16ab}}, // 4269 +{0x6000600060006000, -1,{0xffff,0x00e1}}, // 4270, depth=1 +{0x800001ff800001ff, 3751,{0xffff,0x0049}}, // 4271, depth=2 +{0x0001fffffffffffc, 4280,{0xffff,0x1fae}}, // 4272 +{0xc07fc07fc07fc07f, -1,{0xffff,0x00a8}}, // 4273, depth=1 +{0x0001fffffffffe00, -1,{0xffff,0x1de7}}, // 4274, depth=1 +{0x00000000ffff807f, -1,{0x0457,0xffff}}, // 4275, depth=1 +{0x7fffe0007fffe000, -1,{0xffff,0x04d1}}, // 4276, depth=1 +{0xf03ff03ff03ff03f, 3752,{0xffff,0x0129}}, // 4277, depth=2 +{0xffffffe000000000, 3757,{0xffff,0x16da}}, // 4278, depth=2 +{0x00000000fc07ffff, 3758,{0x0198,0xffff}}, // 4279, depth=2 +{0x3ffffe0000000000, -1,{0xffff,0x15d4}}, // 4280 +{0xfff80000003fffff, 3765,{0xffff,0x1362}}, // 4281, depth=2 +{0x0007fffc0007fffc, -1,{0xffff,0x0790}}, // 4282, depth=1 +{0xfffffffc00000fff, -1,{0xffff,0x17a9}}, // 4283, depth=1 +{0xfffff800fffff800, -1,{0xffff,0x0554}}, // 4284, depth=1 +{0xffffffe000000007, 3766,{0xffff,0x16dd}}, // 4285, depth=2 +{0x00000003e0000000, -1,{0xffff,0x18c4}}, // 4286 +{0x8000000380000003, -1,{0xffff,0x0042}}, // 4287, depth=1 +{0xffffffe0000001ff, -1,{0xffff,0x16e3}}, // 4288 +{0xffc0000003ffffff, -1,{0xffff,0x12a3}}, // 4289 +{0x00000ffffffff000, -1,{0xffff,0x1d1f}}, // 4290 +{0xfffffffffffc03ff, 4292,{0xffff,0x1bb7}}, // 4291 +{0xffffe0ffffffffff, 4294,{0xffff,0x14fa}}, // 4292 +{0xffffffe00000000f, -1,{0xffff,0x16de}}, // 4293, depth=1 +{0xfff8fffffff8ffff, -1,{0xffff,0x035c}}, // 4294 +{0xfffe01fffffe01ff, -1,{0xffff,0x03d7}}, // 4295, depth=1 +{0xffffffffffffff80, -1,{0xffff,0x1e78}}, // 4296 +{0xfe0000fffe0000ff, -1,{0xffff,0x01ce}}, // 4297, depth=1 +{0x0007fe000007fe00, -1,{0xffff,0x05c9}}, // 4298, depth=1 +{0xfc01fffffc01ffff, 3767,{0xffff,0x0196}}, // 4299, depth=2 +{0xffffffffffffff87, 4302,{0xffff,0x1e7b}}, // 4300 +{0x00000000c007c007, 3768,{0x00a4,0xffff}}, // 4301, depth=2 +{0xff80000000007fff, -1,{0xffff,0x1257}}, // 4302 +{0x00000000f7ffffff, 3769,{0x011e,0xffff}}, // 4303, depth=2 +{0x00000000f8000000, 3772,{0x0144,0x1944}}, // 4304, depth=2 +{0x00000000f8000001, 3788,{0x0145,0xffff}}, // 4305, depth=3 +{0x00000000f80001ff, -1,{0x014d,0xffff}}, // 4306 +{0x00000000f8000003, 3791,{0x0146,0xffff}}, // 4307, depth=2 +{0x003fffffff800000, -1,{0xffff,0x1a5e}}, // 4308, depth=1 +{0x00000000fffff9ff, 3796,{0x055d,0xffff}}, // 4309, depth=3 +{0x000001ffc0000000, -1,{0xffff,0x188a}}, // 4310, depth=1 +{0x00000000f8000007, 3804,{0x0147,0xffff}}, // 4311, depth=4 +{0xffffffffffffff8f, 4313,{0xffff,0x1e7c}}, // 4312 +{0xc0000fffffffffff, -1,{0xffff,0x10ad}}, // 4313 +{0x03c0000000000000, -1,{0xffff,0x1283}}, // 4314, depth=1 +{0xfffffffffff87fff, -1,{0xffff,0x1b7b}}, // 4315, depth=1 +{0x000007ffffffff80, -1,{0xffff,0x1e63}}, // 4316, depth=1 +{0x0000001ffffff800, -1,{0xffff,0x1d59}}, // 4317 +{0xffffffff807fffff, 4320,{0xffff,0x1877}}, // 4318 +{0x00000000f800000f, -1,{0x0148,0xffff}}, // 4319, depth=1 +{0xfc1fffffffffffff, 4326,{0xffff,0x11ba}}, // 4320 +{0xffc1ffc1ffc1ffc1, 3821,{0xffff,0x02aa}}, // 4321, depth=2 +{0x0000000003fe03fe, 3824,{0x03e8,0xffff}}, // 4322, depth=2 +{0xffffe003ffffffff, -1,{0xffff,0x14f4}}, // 4323, depth=1 +{0x07ffffffc0000000, 3826,{0xffff,0x189c}}, // 4324, depth=2 +{0xf00001fff00001ff, 3827,{0xffff,0x010c}}, // 4325, depth=2 +{0x00000000fffffbff, -1,{0x055e,0xffff}}, // 4326 +{0xff000000001fffff, -1,{0xffff,0x121c}}, // 4327, depth=1 +{0xffffffffe03fffff, -1,{0xffff,0x18f8}}, // 4328 +{0x0001ffffe0000000, -1,{0xffff,0x18d3}}, // 4329 +{0x0000ffe000000000, -1,{0xffff,0x16ca}}, // 4330 +{0x000000007fff7fff, -1,{0x002e,0xffff}}, // 4331, depth=1 +{0x000000007fff8000, -1,{0x044f,0x1c4f}}, // 4332, depth=1 +{0x83ff83ff83ff83ff, 3834,{0xffff,0x006a}}, // 4333, depth=2 +{0xffff8fffffffffff, -1,{0xffff,0x147c}}, // 4334 +{0x00000000f800001f, 3836,{0x0149,0xffff}}, // 4335, depth=3 +{0xfffffff0000000ff, -1,{0xffff,0x1723}}, // 4336 +{0xffc00007ffc00007, 3844,{0xffff,0x028c}}, // 4337, depth=2 +{0x00000007fff00000, -1,{0xffff,0x1b0e}}, // 4338 +{0xfff83ffffff83fff, -1,{0xffff,0x035a}}, // 4339, depth=1 +{0x00000000fc00fc00, 3845,{0x01a5,0xffff}}, // 4340, depth=3 +{0xf0000003f0000003, 3849,{0xffff,0x0105}}, // 4341, depth=2 +{0xfc000000000007ff, -1,{0xffff,0x1190}}, // 4342 +{0x0000000083838383, -1,{0x0072,0xffff}}, // 4343, depth=1 +{0x001ffffffc000000, 3850,{0xffff,0x199a}}, // 4344, depth=2 +{0xe03fffffe03fffff, -1,{0xffff,0x00d8}}, // 4345, depth=1 +{0xfffffffffffe01ff, 4348,{0xffff,0x1bf7}}, // 4346 +{0x00000000c00fffff, -1,{0x0095,0xffff}}, // 4347, depth=1 +{0xfffff07fffffffff, -1,{0xffff,0x153a}}, // 4348 +{0x001c000000000000, -1,{0xffff,0x1382}}, // 4349 +{0x00ff000000000000, -1,{0xffff,0x1407}}, // 4350, depth=1 +{0xfffffffffffdffff, -1,{0xffff,0x1bbe}}, // 4351, depth=1 +{0xfffffffffffe0000, -1,{0xffff,0x1bee}}, // 4352, depth=1 +{0x8003800380038003, 3851,{0xffff,0x0062}}, // 4353, depth=3 +{0x00003fffffffff80, -1,{0xffff,0x1e66}}, // 4354, depth=1 +{0xfc00000007ffffff, 3855,{0xffff,0x11a0}}, // 4355, depth=2 +{0x0003ff0000000000, -1,{0xffff,0x1609}}, // 4356, depth=1 +{0xffffffffffffffc0, -1,{0xffff,0x1eb9}}, // 4357 +{0x001fffe0001fffe0, -1,{0xffff,0x06cf}}, // 4358, depth=1 +{0xfffffffffffe0007, -1,{0xffff,0x1bf1}}, // 4359, depth=1 +{0x0000000007ff0000, -1,{0x040a,0x1c0a}}, // 4360, depth=1 +{0xfffe01ffffffffff, -1,{0xffff,0x13f7}}, // 4361, depth=1 +{0x00007ffffffff000, -1,{0xffff,0x1d22}}, // 4362 +{0xfffff80003ffffff, -1,{0xffff,0x156e}}, // 4363, depth=1 +{0x000001ffffc00000, -1,{0xffff,0x1a92}}, // 4364, depth=1 +{0xc00003ffffffffff, -1,{0xffff,0x10ab}}, // 4365, depth=1 +{0xffffffffffffffc3, -1,{0xffff,0x1ebb}}, // 4366 +{0x00000000f800003f, 3859,{0x014a,0xffff}}, // 4367, depth=2 +{0x00000000000fff00, 3865,{0x060b,0x1e0b}}, // 4368, depth=2 +{0xffffff80000007ff, -1,{0xffff,0x1663}}, // 4369, depth=1 +{0x00000000003f8000, -1,{0x0446,0x1c46}}, // 4370, depth=1 +{0xffffffffffffffc7, -1,{0xffff,0x1ebc}}, // 4371 +{0x00fffffe00000000, 3882,{0xffff,0x17d6}}, // 4372, depth=2 +{0xffffefffffffefff, 3884,{0xffff,0x04de}}, // 4373, depth=2 +{0x03ffffffffffc000, -1,{0xffff,0x1cab}}, // 4374, depth=1 +{0xffffffffc03fffff, 4382,{0xffff,0x18b7}}, // 4375 +{0x3ffffffffff00000, -1,{0xffff,0x1b29}}, // 4376, depth=1 +{0xf000000000007fff, 3889,{0xffff,0x1112}}, // 4377, depth=2 +{0x07ffffffffc00000, -1,{0xffff,0x1aa4}}, // 4378, depth=1 +{0x00000000ffffe1ff, -1,{0x04db,0xffff}}, // 4379, depth=1 +{0x000007ffffffffc0, -1,{0xffff,0x1ea4}}, // 4380, depth=1 +{0xfff800001fffffff, -1,{0xffff,0x1369}}, // 4381, depth=1 +{0xfe0fffffffffffff, -1,{0xffff,0x11fa}}, // 4382 +{0xfe000000000001ff, 3891,{0xffff,0x11cf}}, // 4383, depth=2 +{0x0078007800780078, 3895,{0xffff,0x0363}}, // 4384, depth=2 +{0xe000000000003fff, -1,{0xffff,0x10d0}}, // 4385, depth=1 +{0xfffffffff01fffff, -1,{0xffff,0x1938}}, // 4386 +{0xffffffffffffffcf, 4389,{0xffff,0x1ebd}}, // 4387 +{0x000001f0000001f0, -1,{0xffff,0x0704}}, // 4388, depth=1 +{0x00000000f801ffff, -1,{0x0155,0xffff}}, // 4389 +{0x0000000030303030, -1,{0x0131,0xffff}}, // 4390, depth=1 +{0xffffffffe0ffffff, -1,{0xffff,0x18fa}}, // 4391, depth=1 +{0x003fe00000000000, -1,{0xffff,0x14c8}}, // 4392 +{0xcfffffffffffffff, -1,{0xffff,0x10bd}}, // 4393, depth=1 +{0x3ffc00003ffc0000, -1,{0xffff,0x038b}}, // 4394, depth=1 +{0xfffe0003ffffffff, -1,{0xffff,0x13f0}}, // 4395 +{0x0000001fffffe000, -1,{0xffff,0x1cd7}}, // 4396 +{0x000000f000000000, -1,{0xffff,0x1703}}, // 4397 +{0x0000000001fc01fc, -1,{0x03a6,0xffff}}, // 4398, depth=1 +{0xffffc7ffffffffff, -1,{0xffff,0x14bc}}, // 4399 +{0xfe000000000003ff, -1,{0xffff,0x11d0}}, // 4400 +{0x00000000ffcfffff, 3896,{0x029d,0xffff}}, // 4401, depth=4 +{0x000001ff80000000, -1,{0xffff,0x1849}}, // 4402, depth=1 +{0x00000000ffff80ff, 3910,{0x0458,0xffff}}, // 4403, depth=3 +{0x0007fffffff80000, -1,{0xffff,0x1b5f}}, // 4404, depth=1 +{0xfffffc0000007fff, 3919,{0xffff,0x15a4}}, // 4405, depth=2 +{0x07ffffc007ffffc0, -1,{0xffff,0x0694}}, // 4406, depth=1 +{0xfc0000fffc0000ff, -1,{0xffff,0x018d}}, // 4407, depth=1 +{0xffffffffffffffe0, -1,{0xffff,0x1efa}}, // 4408 +{0xffffffffffffffe1, -1,{0xffff,0x1efb}}, // 4409 +{0xffffffffffffffe3, -1,{0xffff,0x1efc}}, // 4410 +{0xfffffffff80003ff, -1,{0xffff,0x196e}}, // 4411, depth=1 +{0x000007ffffffffe0, -1,{0xffff,0x1ee5}}, // 4412, depth=1 +{0xffffffffffffffe7, -1,{0xffff,0x1efd}}, // 4413 +{0xe0003fffffffffff, -1,{0xffff,0x10f0}}, // 4414 +{0xfc000001fc000001, 3920,{0xffff,0x0186}}, // 4415, depth=3 +{0x07ffffff80000000, 3949,{0xffff,0x185b}}, // 4416, depth=2 +{0xfffffffffffffdff, -1,{0xffff,0x1dbe}}, // 4417, depth=1 +{0xfffffffffffffe00, 3950,{0xffff,0x1df6}}, // 4418, depth=2 +{0x0000000081818181, 3960,{0x0071,0xffff}}, // 4419, depth=4 +{0xfffffffffffffff1, -1,{0xffff,0x1f3c}}, // 4420 +{0xfffffffffffffe03, -1,{0xffff,0x1df8}}, // 4421, depth=1 +{0xfffffffffffffff3, -1,{0xffff,0x1f3d}}, // 4422 +{0x0000000001ffff80, -1,{0x0651,0x1e51}}, // 4423 +{0x000000003fff8000, -1,{0x044e,0x1c4e}}, // 4424, depth=1 +{0xfffffffffffffe07, -1,{0xffff,0x1df9}}, // 4425, depth=1 +{0xfffffffffffffff8, 4432,{0xffff,0x1f7c}}, // 4426 +{0x00000000ffff1fff, 3972,{0x041c,0xffff}}, // 4427, depth=2 +{0xfff8000000000000, 3973,{0xffff,0x134c}}, // 4428, depth=2 +{0xfff8000000000001, -1,{0xffff,0x134d}}, // 4429, depth=1 +{0x000000000007f000, -1,{0x0506,0x1d06}}, // 4430, depth=1 +{0x00000000f800007f, 3978,{0x014b,0xffff}}, // 4431, depth=2 +{0x0000fffffffe0000, -1,{0xffff,0x1bde}}, // 4432 +{0xfffffffffffffe0f, -1,{0xffff,0x1dfa}}, // 4433, depth=1 +{0x0000003ff0000000, -1,{0xffff,0x1909}}, // 4434, depth=1 +{0x00000000ff8fff8f, 3986,{0x026c,0xffff}}, // 4435, depth=2 +{0x1fffffffffffffc0, 3987,{0xffff,0x1eb6}}, // 4436, depth=2 +{0xfff00000000001ff, 3990,{0xffff,0x1314}}, // 4437, depth=2 +{0x00000007fe000000, -1,{0xffff,0x19c9}}, // 4438, depth=1 +{0x00000000800fffff, -1,{0x0054,0xffff}}, // 4439, depth=1 +{0x000007fffffffffc, -1,{0xffff,0x1fa8}}, // 4440, depth=1 +{0xfffff80000003fff, -1,{0xffff,0x1562}}, // 4441, depth=1 +{0x000007fffffffffe, -1,{0xffff,0x1fe9}}, // 4442, depth=1 +{0x000007ffffffffff, 3991,{0xffff,0x102a}}, // 4443, depth=2 +{0x0000080000000000, -1,{0xffff,0x1540}}, // 4444, depth=1 +{0xe03fffffffffffff, -1,{0xffff,0x10f8}}, // 4445, depth=1 +{0xfffffffffffffff9, -1,{0xffff,0x1f7d}}, // 4446 +{0xfffffffffc00ffff, -1,{0xffff,0x19b5}}, // 4447, depth=1 +{0x0000800000008000, 3992,{0xffff,0x0440}}, // 4448, depth=2 +{0xfe0000000001ffff, 3994,{0xffff,0x11d7}}, // 4449, depth=2 +{0x00003fffffffffe0, -1,{0xffff,0x1ee8}}, // 4450, depth=1 +{0xfffffffffffffffc, 4458,{0xffff,0x1fbd}}, // 4451 +{0x03fffffffc000000, -1,{0xffff,0x199f}}, // 4452, depth=1 +{0xfe0ffffffe0fffff, -1,{0xffff,0x01da}}, // 4453, depth=1 +{0x2000000020000000, 4001,{0xffff,0x00c0}}, // 4454, depth=2 +{0xc00000000007ffff, 4005,{0xffff,0x1094}}, // 4455, depth=2 +{0x0030000000300000, -1,{0xffff,0x0301}}, // 4456, depth=1 +{0xfffffff0003fffff, -1,{0xffff,0x1731}}, // 4457, depth=1 +{0x0000000380000000, -1,{0xffff,0x1842}}, // 4458 +{0xc0003fffc0003fff, 4007,{0xffff,0x008f}}, // 4459, depth=3 +{0x3fff80003fff8000, 4017,{0xffff,0x044e}}, // 4460, depth=2 +{0xfffffffffffffffd, -1,{0xffff,0x1fbe}}, // 4461 +{0x0000000003000000, 4018,{0x0201,0x1a01}}, // 4462, depth=2 +{0xffe0000007ffffff, -1,{0xffff,0x12e5}}, // 4463, depth=1 +{0x00000fffffffc000, -1,{0xffff,0x1c9d}}, // 4464 +{0x03ffffffffff0000, -1,{0xffff,0x1c29}}, // 4465 +{0x00003ffffffffff0, -1,{0xffff,0x1f29}}, // 4466, depth=1 +{0xfff80000000001ff, -1,{0xffff,0x1355}}, // 4467 +{0x0380000003800000, 4026,{0xffff,0x0242}}, // 4468, depth=4 +{0x0000007ffc000000, -1,{0xffff,0x198c}}, // 4469 +{0x000000001fff8000, -1,{0x044d,0x1c4d}}, // 4470, depth=1 +{0xffff3fffffff3fff, -1,{0xffff,0x041d}}, // 4471, depth=1 +{0xfffffe03fffffe03, -1,{0xffff,0x05d8}}, // 4472 +{0x0003fffffff00000, -1,{0xffff,0x1b1d}}, // 4473 +{0x0000000000fc0000, 4036,{0x0385,0x1b85}}, // 4474, depth=2 +{0xffff000001ffffff, -1,{0xffff,0x1428}}, // 4475, depth=1 +{0xe0e0e0e0e0e0e0e0, 4037,{0xffff,0x00f2}}, // 4476, depth=2 +{0xfffff3ffffffffff, -1,{0xffff,0x153d}}, // 4477, depth=1 +{0x00003ffffffffffc, -1,{0xffff,0x1fab}}, // 4478, depth=1 +{0xfffffffffffe007f, -1,{0xffff,0x1bf5}}, // 4479, depth=1 +{0x000003ffffffc000, 4038,{0xffff,0x1c9b}}, // 4480, depth=2 +{0x00003fffffffffff, 4039,{0xffff,0x102d}}, // 4481, depth=2 +{0x0000400000000000, -1,{0xffff,0x1480}}, // 4482, depth=1 +{0xfff00000000003ff, 4485,{0xffff,0x1315}}, // 4483 +{0x0000003fffe00000, 4040,{0xffff,0x1ad0}}, // 4484, depth=2 +{0x00000000fffffc7f, -1,{0x059c,0xffff}}, // 4485 +{0x001ff000001ff000, 4041,{0xffff,0x0508}}, // 4486, depth=2 +{0x000000ffffffff00, -1,{0xffff,0x1e1f}}, // 4487 +{0x0000000078000000, -1,{0x0143,0x1943}}, // 4488, depth=1 +{0x00000001fffffe00, -1,{0xffff,0x1dd7}}, // 4489 +{0x000007ffe0000000, -1,{0xffff,0x18cd}}, // 4490, depth=1 +{0xfff800000000003f, 4049,{0xffff,0x1352}}, // 4491, depth=2 +{0x0000000ffffff800, 4050,{0xffff,0x1d58}}, // 4492, depth=2 +{0x00000000e001e001, -1,{0x00e3,0xffff}}, // 4493, depth=1 +{0x007ffc00007ffc00, 4051,{0xffff,0x058c}}, // 4494, depth=2 +{0x000000007f7f7f7f, -1,{0x0036,0xffff}}, // 4495, depth=1 +{0x00000000000fff80, 4054,{0x064c,0x1e4c}}, // 4496, depth=2 +{0x00000000ffff07ff, 4056,{0x041a,0xffff}}, // 4497, depth=3 +{0x1ffffffffffffffe, -1,{0xffff,0x1ffb}}, // 4498, depth=1 +{0x1fffffffffffffff, -1,{0xffff,0x103c}}, // 4499, depth=1 +{0x2000000000000000, -1,{0xffff,0x10c0}}, // 4500, depth=1 +{0xffffe01fffffe01f, -1,{0xffff,0x04d7}}, // 4501, depth=1 +{0x00ffe00000000000, -1,{0xffff,0x14ca}}, // 4502, depth=1 +{0xfff000000001ffff, -1,{0xffff,0x131c}}, // 4503, depth=1 +{0xffffffff803fffff, -1,{0xffff,0x1876}}, // 4504 +{0xffe00000000007ff, -1,{0xffff,0x12d5}}, // 4505 +{0x0070007000700070, -1,{0xffff,0x0322}}, // 4506, depth=1 +{0xfffffffffe0fffff, -1,{0xffff,0x19fa}}, // 4507, depth=1 +{0x0fffffffffffc000, -1,{0xffff,0x1cad}}, // 4508, depth=1 +{0x00000000ffe07fff, -1,{0x02d9,0xffff}}, // 4509, depth=1 +{0x3030303030303030, 4061,{0xffff,0x0131}}, // 4510, depth=2 +{0xfc00000000007fff, 4063,{0xffff,0x1194}}, // 4511, depth=2 +{0x03fc000000000000, -1,{0xffff,0x1387}}, // 4512 +{0x0000000001fe01fe, -1,{0x03e7,0xffff}}, // 4513 +{0x0004000000040000, 4066,{0xffff,0x0380}}, // 4514, depth=2 +{0xff801fffff801fff, -1,{0xffff,0x0255}}, // 4515, depth=1 +{0x000fe000000fe000, -1,{0xffff,0x04c6}}, // 4516, depth=1 +{0xffffffffe0000007, -1,{0xffff,0x18e5}}, // 4517 +{0x3fffc00000000000, -1,{0xffff,0x148f}}, // 4518, depth=1 +{0xf801fffff801ffff, -1,{0xffff,0x0155}}, // 4519, depth=1 +{0x000000003e003e00, 4067,{0x01e4,0xffff}}, // 4520, depth=3 +{0x3fc0000000000000, -1,{0xffff,0x1287}}, // 4521 +{0x01ff800000000000, -1,{0xffff,0x1449}}, // 4522, depth=1 +{0xfe00001fffffffff, -1,{0xffff,0x11eb}}, // 4523, depth=1 +{0x07ffffffff800000, -1,{0xffff,0x1a63}}, // 4524, depth=1 +{0xe000000000000fff, -1,{0xffff,0x10ce}}, // 4525, depth=1 +{0x0003fffffe000000, -1,{0xffff,0x19d8}}, // 4526, depth=1 +{0xffffffffe000000f, -1,{0xffff,0x18e6}}, // 4527 +{0x00003fffe0000000, -1,{0xffff,0x18d0}}, // 4528, depth=1 +{0xffffffff80ffffff, -1,{0xffff,0x1878}}, // 4529, depth=1 +{0x0001ffffffffff00, -1,{0xffff,0x1e28}}, // 4530, depth=1 +{0x0ffffff00ffffff0, -1,{0xffff,0x0717}}, // 4531 +{0x007fffffffe00000, 4535,{0xffff,0x1ae1}}, // 4532 +{0xffffffe0000000ff, -1,{0xffff,0x16e2}}, // 4533, depth=1 +{0x0000000001fffe00, -1,{0x05cf,0x1dcf}}, // 4534, depth=1 +{0x0000000ff8000000, -1,{0xffff,0x1948}}, // 4535 +{0x00fffe0000fffe00, 4069,{0xffff,0x05ce}}, // 4536, depth=2 +{0xffffffff007fffff, -1,{0xffff,0x1836}}, // 4537 +{0xfffffffffc003fff, -1,{0xffff,0x19b3}}, // 4538 +{0xffc0000000000fff, -1,{0xffff,0x1295}}, // 4539 +{0x003fff0000000000, -1,{0xffff,0x160d}}, // 4540 +{0xffffffffbfffffff, -1,{0xffff,0x187e}}, // 4541 +{0xffffffffc0000000, 4549,{0xffff,0x18a1}}, // 4542 +{0xffffc00000000fff, 4070,{0xffff,0x149d}}, // 4543, depth=2 +{0x000ff00000000000, -1,{0xffff,0x1507}}, // 4544, depth=1 +{0xfffffffffffffe7f, -1,{0xffff,0x1dfd}}, // 4545, depth=1 +{0x1fffffffe0000000, -1,{0xffff,0x18df}}, // 4546, depth=1 +{0x00000000ff8fffff, -1,{0x025c,0xffff}}, // 4547, depth=1 +{0x7ffffffffffffc00, -1,{0xffff,0x1db4}}, // 4548, depth=1 +{0x00001ff000000000, -1,{0xffff,0x1708}}, // 4549 +{0xffffffffc000000f, -1,{0xffff,0x18a5}}, // 4550 +{0x00000000f0fff0ff, -1,{0x012b,0xffff}}, // 4551, depth=1 +{0x0000000001fffff8, -1,{0x0755,0x1f55}}, // 4552 +{0xffffffffe000003f, -1,{0xffff,0x18e8}}, // 4553 +{0x0000001ffff80000, -1,{0xffff,0x1b51}}, // 4554, depth=1 +{0xfff800000000007f, -1,{0xffff,0x1353}}, // 4555, depth=1 +{0x0000000018001800, 4071,{0x0161,0xffff}}, // 4556, depth=2 +{0x00000000fff803ff, 4078,{0x0356,0xffff}}, // 4557, depth=2 +{0x000003fffc000000, -1,{0xffff,0x198f}}, // 4558, depth=1 +{0x00000000f80000ff, 4079,{0x014c,0xffff}}, // 4559, depth=2 +{0x00000000000fffc0, -1,{0x068d,0x1e8d}}, // 4560, depth=1 +{0x000003ffffff0000, 4565,{0xffff,0x1c19}}, // 4561 +{0x0000000fffffe000, -1,{0xffff,0x1cd6}}, // 4562, depth=1 +{0xfc0ffffffc0fffff, 4081,{0xffff,0x0199}}, // 4563, depth=2 +{0x1e0000001e000000, 4082,{0xffff,0x01c3}}, // 4564, depth=2 +{0x3ff83ff83ff83ff8, -1,{0xffff,0x036a}}, // 4565 +{0x0000000001fffffc, -1,{0x0796,0x1f96}}, // 4566 +{0xfffff0000007ffff, -1,{0xffff,0x1526}}, // 4567, depth=1 +{0x7ff0000000000000, -1,{0xffff,0x130a}}, // 4568, depth=1 +{0x3fffffffffffc000, 4572,{0xffff,0x1caf}}, // 4569 +{0x000000000007c000, -1,{0x0484,0x1c84}}, // 4570, depth=1 +{0xfe7ffe7ffe7ffe7f, -1,{0xffff,0x01ed}}, // 4571, depth=1 +{0x0000000001fffffe, -1,{0x07d7,0x1fd7}}, // 4572 +{0x800000ffffffffff, -1,{0xffff,0x1068}}, // 4573, depth=1 +{0x00003fffc0000000, -1,{0xffff,0x188f}}, // 4574, depth=1 +{0x00000000f807f807, 4083,{0x0167,0xffff}}, // 4575, depth=2 +{0xfffe0001fffe0001, -1,{0xffff,0x03cf}}, // 4576 +{0xfff0001fffffffff, -1,{0xffff,0x1330}}, // 4577, depth=1 +{0x0180000001800000, -1,{0xffff,0x0241}}, // 4578, depth=1 +{0x7ffffff07ffffff0, -1,{0xffff,0x071a}}, // 4579 +{0x0000000038000000, 4089,{0x0142,0x1942}}, // 4580, depth=2 +{0xfffff80000000fff, -1,{0xffff,0x1560}}, // 4581, depth=1 +{0xffffffffc000001f, -1,{0xffff,0x18a6}}, // 4582 +{0x801fffff801fffff, -1,{0xffff,0x0055}}, // 4583, depth=1 +{0xffffe001ffffffff, -1,{0xffff,0x14f3}}, // 4584 +{0x7ffffffffffffe00, -1,{0xffff,0x1df5}}, // 4585 +{0x000001ff00000000, 4091,{0xffff,0x1808}}, // 4586, depth=2 +{0xffffffefffffffef, 4097,{0xffff,0x06de}}, // 4587, depth=2 +{0x00003fffff000000, -1,{0xffff,0x1a15}}, // 4588 +{0xfffffe0003ffffff, -1,{0xffff,0x15f0}}, // 4589, depth=1 +{0x00001f8000001f80, 4098,{0xffff,0x0645}}, // 4590, depth=2 +{0xffffffff9fffffff, -1,{0xffff,0x187d}}, // 4591 +{0x00000000000fffe0, 4100,{0x06ce,0x1ece}}, // 4592, depth=2 +{0xffffc000000fffff, -1,{0xffff,0x14a5}}, // 4593 +{0x00000000f007ffff, -1,{0x0116,0xffff}}, // 4594 +{0xfffffffffff81fff, -1,{0xffff,0x1b79}}, // 4595, depth=1 +{0xffffffffffbfffff, -1,{0xffff,0x1a7e}}, // 4596 +{0xffffffffffc00001, -1,{0xffff,0x1aaa}}, // 4597 +{0x7fc07fc07fc07fc0, 4102,{0xffff,0x02a8}}, // 4598, depth=2 +{0x00000000ff0fff0f, -1,{0x022b,0xffff}}, // 4599, depth=1 +{0x07ffffff00000000, 4103,{0xffff,0x181a}}, // 4600, depth=2 +{0xe03fe03fe03fe03f, -1,{0xffff,0x00e8}}, // 4601, depth=1 +{0x00000000fff0fff0, -1,{0x032b,0xffff}}, // 4602, depth=1 +{0xf81ff81ff81ff81f, 4113,{0xffff,0x0169}}, // 4603, depth=2 +{0x003ffffe003ffffe, 4116,{0xffff,0x07d4}}, // 4604, depth=2 +{0xfffc0000001fffff, 4119,{0xffff,0x13a2}}, // 4605, depth=2 +{0x0000000000fffc00, -1,{0x058d,0x1d8d}}, // 4606, depth=1 +{0xfffffff000000003, 4124,{0xffff,0x171d}}, // 4607, depth=2 +{0x00000000000ffff0, -1,{0x070f,0x1f0f}}, // 4608, depth=1 +{0x0001ffffff800000, -1,{0xffff,0x1a59}}, // 4609 +{0x03fe03fe03fe03fe, 4125,{0xffff,0x03e8}}, // 4610, depth=2 +{0xfffffff000000007, -1,{0xffff,0x171e}}, // 4611, depth=1 +{0x003fff00003fff00, -1,{0xffff,0x060d}}, // 4612, depth=1 +{0xff00007fff00007f, -1,{0xffff,0x020e}}, // 4613, depth=1 +{0x00000003ffffff80, -1,{0xffff,0x1e5a}}, // 4614, depth=1 +{0xffffffffffc00003, -1,{0xffff,0x1aab}}, // 4615 +{0x00000000000ffff8, -1,{0x0750,0x1f50}}, // 4616, depth=1 +{0xffe001ffffe001ff, 4128,{0xffff,0x02d3}}, // 4617, depth=2 +{0x000000001fe01fe0, -1,{0x02e7,0xffff}}, // 4618 +{0xffe0000000007fff, 4130,{0xffff,0x12d9}}, // 4619, depth=2 +{0x0200020002000200, 4132,{0xffff,0x01e0}}, // 4620, depth=2 +{0xfffffffe00ffffff, -1,{0xffff,0x17f6}}, // 4621 +{0x00000000000ffffe, -1,{0x07d2,0x1fd2}}, // 4622, depth=1 +{0x00000000000fffff, -1,{0x0013,0x1013}}, // 4623, depth=1 +{0x0000000000100000, -1,{0x0300,0x1b00}}, // 4624, depth=1 +{0x0101010101010101, 4133,{0xffff,0x0030}}, // 4625, depth=2 +{0x0000000018000000, 4136,{0x0141,0x1941}}, // 4626, depth=2 +{0xf80000fff80000ff, 4139,{0xffff,0x014c}}, // 4627, depth=2 +{0x000007ff80000000, 4140,{0xffff,0x184b}}, // 4628, depth=2 +{0xfffffffff8007fff, -1,{0xffff,0x1973}}, // 4629 +{0x0002000200020002, -1,{0xffff,0x03e0}}, // 4630, depth=1 +{0xc1ffc1ffc1ffc1ff, 4141,{0xffff,0x00aa}}, // 4631, depth=2 +{0x00007ffffc000000, -1,{0xffff,0x1994}}, // 4632 +{0xffe00003ffe00003, 4142,{0xffff,0x02cc}}, // 4633, depth=2 +{0x00ffff0000000000, -1,{0xffff,0x160f}}, // 4634, depth=1 +{0xf8000001f8000001, 4145,{0xffff,0x0145}}, // 4635, depth=2 +{0x007fffffffff0000, -1,{0xffff,0x1c26}}, // 4636, depth=1 +{0xf01ffffff01fffff, -1,{0xffff,0x0118}}, // 4637, depth=1 +{0x000000fffffe0000, -1,{0xffff,0x1bd6}}, // 4638, depth=1 +{0xff80000000001fff, -1,{0xffff,0x1255}}, // 4639 +{0x0000000000100010, -1,{0x0320,0xffff}}, // 4640, depth=1 +{0xc001c001c001c001, -1,{0xffff,0x00a2}}, // 4641, depth=1 +{0x0003c00000000000, -1,{0xffff,0x1483}}, // 4642 +{0xffffffffffc0000f, -1,{0xffff,0x1aad}}, // 4643 +{0x07ffe00000000000, -1,{0xffff,0x14cd}}, // 4644 +{0xffff00ffffffffff, -1,{0xffff,0x1437}}, // 4645, depth=1 +{0x1fffffffffc00000, -1,{0xffff,0x1aa6}}, // 4646, depth=1 +{0xe00001ffffffffff, -1,{0xffff,0x10eb}}, // 4647, depth=1 +{0x00fffffc00000000, -1,{0xffff,0x1795}}, // 4648 +{0xffffffc0000003ff, -1,{0xffff,0x16a3}}, // 4649, depth=1 +{0x0fffffe00fffffe0, -1,{0xffff,0x06d6}}, // 4650, depth=1 +{0xfffff7fffffff7ff, 4152,{0xffff,0x051e}}, // 4651, depth=2 +{0x0000000300000000, -1,{0xffff,0x1801}}, // 4652 +{0xf800000000003fff, 4153,{0xffff,0x1152}}, // 4653, depth=2 +{0xffffffff7fffffff, -1,{0xffff,0x183e}}, // 4654 +{0xfffc00000fffffff, -1,{0xffff,0x13a9}}, // 4655, depth=1 +{0xffffffff80000001, -1,{0xffff,0x1861}}, // 4656 +{0xf000000000001fff, -1,{0xffff,0x1110}}, // 4657, depth=1 +{0x0001ffffffffff80, -1,{0xffff,0x1e69}}, // 4658, depth=1 +{0x00000000ffff81ff, -1,{0x0459,0xffff}}, // 4659, depth=1 +{0x00000000ffe7ffff, -1,{0x02dd,0xffff}}, // 4660 +{0xe7ffffffffffffff, -1,{0xffff,0x10fd}}, // 4661, depth=1 +{0x000000007fe07fe0, 4158,{0x02e9,0xffff}}, // 4662, depth=2 +{0x000000f0000000f0, -1,{0xffff,0x0703}}, // 4663 +{0x01ffff8000000000, -1,{0xffff,0x1651}}, // 4664, depth=1 +{0xfff1fffffff1ffff, 4160,{0xffff,0x031c}}, // 4665, depth=3 +{0x00003fff80000000, -1,{0xffff,0x184e}}, // 4666, depth=1 +{0xfffffe0000003fff, 4169,{0xffff,0x15e4}}, // 4667, depth=2 +{0x0007fffffffff800, -1,{0xffff,0x1d67}}, // 4668, depth=1 +{0xffc001ffffffffff, -1,{0xffff,0x12b2}}, // 4669 +{0x00000e0000000000, -1,{0xffff,0x15c2}}, // 4670, depth=1 +{0xffffffff8000001f, -1,{0xffff,0x1865}}, // 4671 +{0xfe000000fe000000, -1,{0xffff,0x01c6}}, // 4672, depth=1 +{0xfffffffffffffeff, -1,{0xffff,0x1dfe}}, // 4673, depth=1 +{0x1c0000001c000000, 4173,{0xffff,0x0182}}, // 4674, depth=4 +{0xffffffffffffff01, -1,{0xffff,0x1e38}}, // 4675, depth=1 +{0x00000000cccccccc, -1,{0x00b9,0xffff}}, // 4676, depth=1 +{0xffffffffffffff03, -1,{0xffff,0x1e39}}, // 4677, depth=1 +{0x00000003ffffffc0, -1,{0xffff,0x1e9b}}, // 4678, depth=1 +{0xffffffffc000007f, -1,{0xffff,0x18a8}}, // 4679 +{0x0001ffe00001ffe0, -1,{0xffff,0x06cb}}, // 4680, depth=1 +{0xffffffffffffff07, -1,{0xffff,0x1e3a}}, // 4681, depth=1 +{0x000000ffffffffc0, -1,{0xffff,0x1ea1}}, // 4682 +{0xfff80000000000ff, 4180,{0xffff,0x1354}}, // 4683, depth=2 +{0x1fffffff80000000, -1,{0xffff,0x185d}}, // 4684, depth=1 +{0x00000000fffbfffb, 4182,{0x036e,0xffff}}, // 4685, depth=2 +{0xff00000003ffffff, 4688,{0xffff,0x1221}}, // 4686 +{0xf01fffffffffffff, -1,{0xffff,0x1138}}, // 4687, depth=1 +{0xe0000003ffffffff, -1,{0xffff,0x10e4}}, // 4688 +{0x00000000fffbffff, 4187,{0x035e,0xffff}}, // 4689, depth=3 +{0x00000000fffc0000, -1,{0x038d,0x1b8d}}, // 4690, depth=1 +{0xff07ffffff07ffff, 4194,{0xffff,0x021a}}, // 4691, depth=2 +{0x0007fffff8000000, -1,{0xffff,0x1957}}, // 4692 +{0x00000000fffc0003, 4199,{0x038f,0xffff}}, // 4693, depth=2 +{0x0300000000000000, -1,{0xffff,0x1201}}, // 4694, depth=1 +{0xffffffff8000003f, 4698,{0xffff,0x1866}}, // 4695 +{0x00001fe000000000, -1,{0xffff,0x16c7}}, // 4696, depth=1 +{0x00000000fffc0007, -1,{0x0390,0xffff}}, // 4697, depth=1 +{0xc0000000001fffff, -1,{0xffff,0x1096}}, // 4698 +{0x000000ffffffffe0, -1,{0xffff,0x1ee2}}, // 4699 +{0x001ffff0001ffff0, -1,{0xffff,0x0710}}, // 4700, depth=1 +{0x001fffffffe00000, -1,{0xffff,0x1adf}}, // 4701 +{0xffffc003ffffffff, -1,{0xffff,0x14b3}}, // 4702 +{0xfffff9ffffffffff, -1,{0xffff,0x157d}}, // 4703, depth=1 +{0x7fffffe07fffffe0, 4201,{0xffff,0x06d9}}, // 4704, depth=2 +{0x00000000fffc000f, 4206,{0x0391,0xffff}}, // 4705, depth=3 +{0x00003c0000003c00, -1,{0xffff,0x0583}}, // 4706 +{0xffffffffffc0007f, -1,{0xffff,0x1ab0}}, // 4707 +{0xffffffff3fffffff, -1,{0xffff,0x183d}}, // 4708 +{0x0000003ffff80000, -1,{0xffff,0x1b52}}, // 4709 +{0x00000003ffffffe0, -1,{0xffff,0x1edc}}, // 4710, depth=1 +{0xffffe00000ffffff, -1,{0xffff,0x14ea}}, // 4711 +{0xffff8000001fffff, -1,{0xffff,0x1465}}, // 4712 +{0xf83fffffffffffff, 4212,{0xffff,0x117a}}, // 4713, depth=2 +{0x000003fc000003fc, -1,{0xffff,0x0787}}, // 4714, depth=1 +{0x00000000f07ff07f, 4215,{0x012a,0xffff}}, // 4715, depth=2 +{0x000000fffffffffe, -1,{0xffff,0x1fe6}}, // 4716 +{0xe001ffffffffffff, -1,{0xffff,0x10f3}}, // 4717 +{0x0000010000000000, -1,{0xffff,0x1600}}, // 4718 +{0x00003ffe00000000, -1,{0xffff,0x17cc}}, // 4719 +{0x003e0000003e0000, -1,{0xffff,0x03c4}}, // 4720, depth=1 +{0x00000000fffc001f, -1,{0x0392,0xffff}}, // 4721, depth=1 +{0x0000000007e00000, 4219,{0x02c5,0x1ac5}}, // 4722, depth=2 +{0x00000000e1ffffff, -1,{0x00db,0xffff}}, // 4723, depth=1 +{0x00001fffffffff80, -1,{0xffff,0x1e65}}, // 4724 +{0xffffffffff7fffff, -1,{0xffff,0x1a3e}}, // 4725 +{0x0000000000fc00fc, 4229,{0x03a5,0xffff}}, // 4726, depth=3 +{0xf0000000000007ff, -1,{0xffff,0x110e}}, // 4727, depth=1 +{0x00000001ffffff00, -1,{0xffff,0x1e18}}, // 4728 +{0xffffffffc07fffff, -1,{0xffff,0x18b8}}, // 4729, depth=1 +{0x0000020000000200, 4241,{0xffff,0x05c0}}, // 4730, depth=2 +{0xfffffff00000007f, -1,{0xffff,0x1722}}, // 4731, depth=1 +{0xffffffffff800001, -1,{0xffff,0x1a69}}, // 4732 +{0xfffff803ffffffff, 4735,{0xffff,0x1576}}, // 4733 +{0x00000003fffffff8, -1,{0xffff,0x1f5e}}, // 4734, depth=1 +{0xc00000000fffffff, -1,{0xffff,0x109d}}, // 4735 +{0x01ffffc001ffffc0, 4242,{0xffff,0x0692}}, // 4736, depth=2 +{0xffffffffffffff3f, -1,{0xffff,0x1e3d}}, // 4737, depth=1 +{0x0007ffffffffe000, 4247,{0xffff,0x1ce5}}, // 4738, depth=2 +{0x00000000f0001fff, -1,{0x0110,0xffff}}, // 4739, depth=1 +{0x00000003fffffffe, -1,{0xffff,0x1fe0}}, // 4740, depth=1 +{0x00000003ffffffff, -1,{0xffff,0x1021}}, // 4741, depth=1 +{0x01f801f801f801f8, 4250,{0xffff,0x0365}}, // 4742, depth=2 +{0xfffffff80fffffff, -1,{0xffff,0x1778}}, // 4743, depth=1 +{0x000000000001f800, -1,{0x0545,0x1d45}}, // 4744, depth=1 +{0xffffffffff800007, -1,{0xffff,0x1a6b}}, // 4745 +{0x0000000400000004, 4253,{0xffff,0x0780}}, // 4746, depth=2 +{0x07ffff0000000000, -1,{0xffff,0x1612}}, // 4747 +{0xffffffffe00000ff, -1,{0xffff,0x18ea}}, // 4748 +{0x000000001fff1fff, -1,{0x002c,0xffff}}, // 4749, depth=1 +{0x0060006000600060, -1,{0xffff,0x02e1}}, // 4750, depth=1 +{0xc000007fffffffff, -1,{0xffff,0x10a8}}, // 4751, depth=1 +{0x00fc000000fc0000, 4254,{0xffff,0x0385}}, // 4752, depth=2 +{0x00000000fffc003f, 4256,{0x0393,0xffff}}, // 4753, depth=2 +{0x0001ffffffffffe0, -1,{0xffff,0x1eeb}}, // 4754, depth=1 +{0x00000000fe003fff, 4257,{0x01d4,0xffff}}, // 4755, depth=2 +{0xfffffffc01ffffff, -1,{0xffff,0x17b6}}, // 4756 +{0xfffffffff000ffff, -1,{0xffff,0x1933}}, // 4757 +{0x03fffffff0000000, -1,{0xffff,0x191d}}, // 4758 +{0xffffff0001ffffff, -1,{0xffff,0x1630}}, // 4759, depth=1 +{0xff00000000003fff, -1,{0xffff,0x1215}}, // 4760 +{0xffffffff1fffffff, -1,{0xffff,0x183c}}, // 4761 +{0x007ffff800000000, -1,{0xffff,0x1753}}, // 4762, depth=1 +{0xffffffffff80001f, -1,{0xffff,0x1a6d}}, // 4763 +{0x001ff800001ff800, -1,{0xffff,0x0549}}, // 4764, depth=1 +{0xf01ff01ff01ff01f, -1,{0xffff,0x0128}}, // 4765, depth=1 +{0x00000000007c0000, -1,{0x0384,0x1b84}}, // 4766, depth=1 +{0xfffe0000000fffff, -1,{0xffff,0x13e2}}, // 4767, depth=1 +{0x3800000000000000, -1,{0xffff,0x1142}}, // 4768, depth=1 +{0x00000000c1ffffff, -1,{0x009a,0xffff}}, // 4769, depth=1 +{0x00001ffffffe0000, 4263,{0xffff,0x1bdb}}, // 4770, depth=2 +{0xff80003fff80003f, -1,{0xffff,0x024e}}, // 4771, depth=1 +{0xffff0000ffffffff, -1,{0xffff,0x142f}}, // 4772 +{0xfff000fffff000ff, -1,{0xffff,0x0313}}, // 4773, depth=1 +{0x00003fffff800000, -1,{0xffff,0x1a56}}, // 4774, depth=1 +{0xffffffffffff87ff, -1,{0xffff,0x1c7b}}, // 4775 +{0xf000007fffffffff, -1,{0xffff,0x112a}}, // 4776 +{0xffff1fffffffffff, -1,{0xffff,0x143c}}, // 4777, depth=1 +{0x0ffff0000ffff000, 4265,{0xffff,0x050f}}, // 4778, depth=2 +{0x03ffffffffe00000, -1,{0xffff,0x1ae4}}, // 4779 +{0xfffffffeffffffff, 4794,{0xffff,0x17fe}}, // 4780 +{0xfff00001fff00001, 4269,{0xffff,0x030c}}, // 4781, depth=2 +{0xfc000000fc000000, 4272,{0xffff,0x0185}}, // 4782, depth=3 +{0xf80ffffff80fffff, -1,{0xffff,0x0158}}, // 4783, depth=1 +{0x0001fffffffffffe, -1,{0xffff,0x1fef}}, // 4784, depth=1 +{0x0001ffffffffffff, -1,{0xffff,0x1030}}, // 4785, depth=1 +{0x0002000000000000, -1,{0xffff,0x13c0}}, // 4786, depth=1 +{0xffff807fffffffff, -1,{0xffff,0x1477}}, // 4787, depth=1 +{0x000000e0000000e0, 4286,{0xffff,0x06c2}}, // 4788, depth=2 +{0x00000000ffe01fff, 4288,{0x02d7,0xffff}}, // 4789, depth=2 +{0x0000000001ffff00, -1,{0x0610,0x1e10}}, // 4790, depth=1 +{0xfc00000000001fff, 4289,{0xffff,0x1192}}, // 4791, depth=2 +{0x1fffffffff800000, 4290,{0xffff,0x1a65}}, // 4792, depth=2 +{0xf800000000000fff, -1,{0xffff,0x1150}}, // 4793, depth=1 +{0xff81ff81ff81ff81, -1,{0xffff,0x0269}}, // 4794 +{0xf3ffffffffffffff, -1,{0xffff,0x113d}}, // 4795, depth=1 +{0xffffffff00000001, -1,{0xffff,0x1820}}, // 4796 +{0x00000000f03ff03f, 4291,{0x0129,0xffff}}, // 4797, depth=4 +{0xffffffff00000003, -1,{0xffff,0x1821}}, // 4798 +{0x0000000077777777, -1,{0x003a,0xffff}}, // 4799, depth=1 +{0xffffff00ffffff00, -1,{0xffff,0x0617}}, // 4800 +{0xffffffffffffff7f, -1,{0xffff,0x1e3e}}, // 4801, depth=1 +{0x000001ffff000000, 4296,{0xffff,0x1a10}}, // 4802, depth=2 +{0xffffffffffffff81, -1,{0xffff,0x1e79}}, // 4803, depth=1 +{0x00fffffffe000000, -1,{0xffff,0x19de}}, // 4804, depth=1 +{0xffffffffffffff83, -1,{0xffff,0x1e7a}}, // 4805, depth=1 +{0xfffffc7fffffffff, -1,{0xffff,0x15bc}}, // 4806 +{0xfffffe0000000fff, -1,{0xffff,0x15e2}}, // 4807, depth=1 +{0x0001f0000001f000, -1,{0xffff,0x0504}}, // 4808, depth=1 +{0x00000000f00007ff, 4300,{0x010e,0xffff}}, // 4809, depth=3 +{0x00001fffffffffe0, -1,{0xffff,0x1ee7}}, // 4810 +{0xfffffffc000fffff, -1,{0xffff,0x17b1}}, // 4811, depth=1 +{0x000007ff00000000, -1,{0xffff,0x180a}}, // 4812, depth=1 +{0x00000000fff00fff, -1,{0x0317,0xffff}}, // 4813 +{0x000000000001e000, -1,{0x04c3,0x1cc3}}, // 4814, depth=1 +{0x00007fff00007fff, 4306,{0xffff,0x000e}}, // 4815, depth=2 +{0x07ffffffff000000, -1,{0xffff,0x1a22}}, // 4816, depth=1 +{0x00000000fffc007f, 4312,{0x0394,0xffff}}, // 4817, depth=3 +{0x00ff800000ff8000, 4317,{0xffff,0x0448}}, // 4818, depth=2 +{0xf8000000000fffff, -1,{0xffff,0x1158}}, // 4819 +{0xffffffffffc000ff, -1,{0xffff,0x1ab1}}, // 4820 +{0x1fffffff1fffffff, 4318,{0xffff,0x001c}}, // 4821, depth=4 +{0x00000000fffffc00, -1,{0x0595,0x1d95}}, // 4822, depth=1 +{0x00000000fffffc01, -1,{0x0596,0xffff}}, // 4823, depth=1 +{0xff8003ffffffffff, 4827,{0xffff,0x1272}}, // 4824 +{0x00000000fffffc03, -1,{0x0597,0xffff}}, // 4825, depth=1 +{0x001fffffffff0000, -1,{0xffff,0x1c24}}, // 4826, depth=1 +{0x00000000fffffdff, -1,{0x059e,0xffff}}, // 4827 +{0x0f00000000000000, -1,{0xffff,0x1203}}, // 4828, depth=1 +{0x00000000fffffc07, 4328,{0x0598,0xffff}}, // 4829, depth=2 +{0x0003fffc00000000, -1,{0xffff,0x178f}}, // 4830, depth=1 +{0x00000000fffffe00, -1,{0x05d6,0x1dd6}}, // 4831 +{0x7ffff0007ffff000, 4329,{0xffff,0x0512}}, // 4832, depth=2 +{0xffffffffffffff9f, -1,{0xffff,0x1e7d}}, // 4833, depth=1 +{0x00000003c0000000, -1,{0xffff,0x1883}}, // 4834, depth=1 +{0x80000001ffffffff, -1,{0xffff,0x1061}}, // 4835, depth=1 +{0x00001ffffffffe00, -1,{0xffff,0x1de3}}, // 4836, depth=1 +{0x00000000fffffc0f, -1,{0x0599,0xffff}}, // 4837, depth=1 +{0xfffffe00000fffff, 4840,{0xffff,0x15ea}}, // 4838 +{0x00000000ff0fffff, -1,{0x021b,0xffff}}, // 4839, depth=1 +{0x00000000fffffe01, -1,{0x05d7,0xffff}}, // 4840 +{0xfffc0007ffffffff, -1,{0xffff,0x13b0}}, // 4841, depth=1 +{0x0000000fffff8000, -1,{0xffff,0x1c54}}, // 4842, depth=1 +{0x003ffffc003ffffc, -1,{0xffff,0x0793}}, // 4843 +{0x00001ffffffffffc, -1,{0xffff,0x1faa}}, // 4844 +{0xffffffffff80007f, -1,{0xffff,0x1a6f}}, // 4845 +{0x00000001ffffff80, -1,{0xffff,0x1e59}}, // 4846 +{0xf80ff80ff80ff80f, -1,{0xffff,0x0168}}, // 4847, depth=1 +{0x7e7e7e7e7e7e7e7e, 4330,{0xffff,0x01f5}}, // 4848, depth=2 +{0xf0000fffffffffff, -1,{0xffff,0x112f}}, // 4849 +{0x00003fff00000000, -1,{0xffff,0x180d}}, // 4850, depth=1 +{0xfff8007ffff8007f, -1,{0xffff,0x0353}}, // 4851, depth=1 +{0x0003fe0000000000, -1,{0xffff,0x15c8}}, // 4852 +{0x00000000fffffc1f, 4334,{0x059a,0xffff}}, // 4853, depth=2 +{0xffffff80001fffff, -1,{0xffff,0x166d}}, // 4854 +{0xffffffe00001ffff, -1,{0xffff,0x16eb}}, // 4855, depth=1 +{0xfffe00ffffffffff, -1,{0xffff,0x13f6}}, // 4856 +{0x8000ffffffffffff, -1,{0xffff,0x1070}}, // 4857, depth=1 +{0xffffffff0000003f, -1,{0xffff,0x1825}}, // 4858 +{0x00000000ffe007ff, 4336,{0x02d5,0xffff}}, // 4859, depth=2 +{0x000000000ff80ff8, 4338,{0x0368,0xffff}}, // 4860, depth=2 +{0x0000000081ffffff, 4342,{0x0059,0xffff}}, // 4861, depth=2 +{0x000000ffffc00000, -1,{0xffff,0x1a91}}, // 4862 +{0xfffc7ffffffc7fff, 4346,{0xffff,0x039c}}, // 4863, depth=3 +{0x01f001f001f001f0, 4349,{0xffff,0x0324}}, // 4864, depth=2 +{0xffffffffffffffbf, -1,{0xffff,0x1e7e}}, // 4865, depth=1 +{0x0000007fffffc000, 4357,{0xffff,0x1c98}}, // 4866, depth=2 +{0xffffffffffffffc1, -1,{0xffff,0x1eba}}, // 4867, depth=1 +{0x1fffffff00000000, 4362,{0xffff,0x181c}}, // 4868, depth=2 +{0xffc0000000003fff, 4366,{0xffff,0x1297}}, // 4869, depth=2 +{0x3f00000000000000, -1,{0xffff,0x1205}}, // 4870 +{0xfffffffff8001fff, -1,{0xffff,0x1971}}, // 4871 +{0xffffffffff3fffff, -1,{0xffff,0x1a3d}}, // 4872 +{0xe00007ffffffffff, 4371,{0xffff,0x10ed}}, // 4873, depth=2 +{0x000000007ffc0000, -1,{0x038c,0x1b8c}}, // 4874, depth=1 +{0x8fffffff8fffffff, 4375,{0xffff,0x005c}}, // 4875, depth=3 +{0xffffffff800000ff, -1,{0xffff,0x1868}}, // 4876 +{0x00000007fffff000, -1,{0xffff,0x1d16}}, // 4877 +{0x0001ffffc0000000, -1,{0xffff,0x1892}}, // 4878, depth=1 +{0x00000000efffefff, 4386,{0x00ee,0xffff}}, // 4879, depth=2 +{0xffc03fffffffffff, -1,{0xffff,0x12b7}}, // 4880 +{0x0003ffff0003ffff, 4387,{0xffff,0x0011}}, // 4881, depth=3 +{0x03ffe00003ffe000, 4392,{0xffff,0x04cc}}, // 4882, depth=2 +{0x07fffffffe000000, -1,{0xffff,0x19e1}}, // 4883 +{0x000003ffffe00000, -1,{0xffff,0x1ad4}}, // 4884 +{0x00000000fffffc3f, 4395,{0x059b,0xffff}}, // 4885, depth=2 +{0x00fff80000000000, -1,{0xffff,0x154c}}, // 4886 +{0x0007ffc000000000, -1,{0xffff,0x168c}}, // 4887 +{0x00000003ffc00000, 4396,{0xffff,0x1a8b}}, // 4888, depth=2 +{0xfe00000007ffffff, -1,{0xffff,0x11e1}}, // 4889 +{0x00000000007c007c, 4397,{0x03a4,0xffff}}, // 4890, depth=2 +{0x00000000ffffe3ff, 4399,{0x04dc,0xffff}}, // 4891, depth=2 +{0x01ffffe001ffffe0, -1,{0xffff,0x06d3}}, // 4892 +{0xc0007fffffffffff, -1,{0xffff,0x10b0}}, // 4893, depth=1 +{0x1800000018000000, -1,{0xffff,0x0141}}, // 4894, depth=1 +{0x00000000fe000fff, 4400,{0x01d2,0xffff}}, // 4895, depth=2 +{0xff8000000007ffff, -1,{0xffff,0x125b}}, // 4896 +{0xffffffffffffffdf, -1,{0xffff,0x1ebe}}, // 4897, depth=1 +{0x00000000007ffc00, 4408,{0x058c,0x1d8c}}, // 4898, depth=2 +{0xffe0000000001fff, 4409,{0xffff,0x12d7}}, // 4899, depth=2 +{0x00000001fffe0000, -1,{0xffff,0x1bcf}}, // 4900, depth=1 +{0xf00003ffffffffff, 4410,{0xffff,0x112d}}, // 4901, depth=2 +{0x0000000004000400, -1,{0x01a0,0xffff}}, // 4902, depth=1 +{0xffffffff0000007f, -1,{0xffff,0x1826}}, // 4903 +{0x3ffffffffffff000, -1,{0xffff,0x1d31}}, // 4904, depth=1 +{0x8001ffff8001ffff, 4413,{0xffff,0x0051}}, // 4905, depth=2 +{0x000ffffffff80000, -1,{0xffff,0x1b60}}, // 4906, depth=1 +{0xffff0001ffffffff, -1,{0xffff,0x1430}}, // 4907, depth=1 +{0xffffe000ffffffff, -1,{0xffff,0x14f2}}, // 4908 +{0x03fff00003fff000, -1,{0xffff,0x050d}}, // 4909 +{0x0000070000000000, -1,{0xffff,0x1602}}, // 4910 +{0x0000000080018001, 4414,{0x0061,0xffff}}, // 4911, depth=2 +{0x00000000003c0000, -1,{0x0383,0x1b83}}, // 4912, depth=1 +{0xffffffffffffffef, -1,{0xffff,0x1efe}}, // 4913, depth=1 +{0xfffffffffffffff0, -1,{0xffff,0x1f3b}}, // 4914, depth=1 +{0xf80001ffffffffff, 4420,{0xffff,0x116d}}, // 4915, depth=2 +{0x7fffffffffffff80, 4919,{0xffff,0x1e77}}, // 4916 +{0xc000ffffc000ffff, 4422,{0xffff,0x0091}}, // 4917, depth=2 +{0x4000400040004000, 4423,{0xffff,0x00a0}}, // 4918, depth=2 +{0x003e000000000000, 4924,{0xffff,0x13c4}}, // 4919 +{0x7fffffe000000000, -1,{0xffff,0x16d9}}, // 4920, depth=1 +{0xfffffffffffffff7, -1,{0xffff,0x1f3e}}, // 4921, depth=1 +{0x0000000022222222, 4426,{0x00f8,0xffff}}, // 4922, depth=3 +{0xe0007fffe0007fff, 4446,{0xffff,0x00d1}}, // 4923, depth=2 +{0x0000000007f80000, -1,{0x0347,0x1b47}}, // 4924 +{0xfffffffffffffffb, -1,{0xffff,0x1f7e}}, // 4925, depth=1 +{0x0078000000780000, 4451,{0xffff,0x0343}}, // 4926, depth=3 +{0x00000000fe0ffe0f, 4461,{0x01ea,0xffff}}, // 4927, depth=2 +{0xfffffffffffffffe, -1,{0xffff,0x1ffe}}, // 4928, depth=1 +{0xffff8007ffffffff, -1,{0xffff,0x1473}}, // 4929 +{0xffff00007fffffff, 4931,{0xffff,0x142e}}, // 4930 +{0x00000000f803ffff, -1,{0x0156,0xffff}}, // 4931 +{0x0001ffffffc00000, 4464,{0xffff,0x1a9a}}, // 4932, depth=2 +{0x0000ffffffffffe0, -1,{0xffff,0x1eea}}, // 4933 +{0xff00ff00ff00ff00, 4465,{0xffff,0x0227}}, // 4934, depth=2 +{0x00000001fffffff8, 4936,{0xffff,0x1f5d}}, // 4935 +{0x0000003ffffff800, -1,{0xffff,0x1d5a}}, // 4936 +{0xffffff01ffffff01, -1,{0xffff,0x0618}}, // 4937, depth=1 +{0xfffffffffffc7fff, -1,{0xffff,0x1bbc}}, // 4938 +{0xfe01fe01fe01fe01, 4467,{0xffff,0x01e7}}, // 4939, depth=2 +{0x001f800000000000, -1,{0xffff,0x1445}}, // 4940 +{0x00000001fffffffe, -1,{0xffff,0x1fdf}}, // 4941 +{0xffffffffff8000ff, -1,{0xffff,0x1a70}}, // 4942 +{0x0000000200000000, -1,{0xffff,0x17c0}}, // 4943 +{0x000fffe0000fffe0, 4469,{0xffff,0x06ce}}, // 4944, depth=2 +{0x00000000fffc00ff, 4472,{0x0395,0xffff}}, // 4945, depth=2 +{0x07ff000000000000, -1,{0xffff,0x140a}}, // 4946, depth=1 +{0x00003f0000000000, -1,{0xffff,0x1605}}, // 4947 +{0x007ffffff0000000, 4473,{0xffff,0x191a}}, // 4948, depth=2 +{0xfc03fc03fc03fc03, 4483,{0xffff,0x01a7}}, // 4949, depth=3 +{0xfffffffe7fffffff, -1,{0xffff,0x17fd}}, // 4950 +{0xffffffffe00001ff, -1,{0xffff,0x18eb}}, // 4951 +{0x001ffff800000000, -1,{0xffff,0x1751}}, // 4952, depth=1 +{0xfffe1fffffffffff, 4955,{0xffff,0x13fb}}, // 4953 +{0x000001fe00000000, -1,{0xffff,0x17c7}}, // 4954, depth=1 +{0xfc00000ffc00000f, -1,{0xffff,0x0189}}, // 4955 +{0x0000fffffffffff8, -1,{0xffff,0x1f6c}}, // 4956 +{0xffffc00001ffffff, -1,{0xffff,0x14aa}}, // 4957 +{0x0000fffffffffffc, -1,{0xffff,0x1fad}}, // 4958 +{0xf001fffff001ffff, -1,{0xffff,0x0114}}, // 4959, depth=1 +{0x01fffffffff80000, 4487,{0xffff,0x1b65}}, // 4960, depth=2 +{0xfffffc07fffffc07, -1,{0xffff,0x0598}}, // 4961, depth=1 +{0xffff0000003fffff, -1,{0xffff,0x1425}}, // 4962 +{0x0000fffffffffffe, 4964,{0xffff,0x1fee}}, // 4963 +{0x1fffff0000000000, -1,{0xffff,0x1614}}, // 4964 +{0x7fffffffffffffc0, -1,{0xffff,0x1eb8}}, // 4965 +{0x000000003ffc0000, 4489,{0x038b,0x1b8b}}, // 4966, depth=2 +{0xfffc00000000ffff, 4504,{0xffff,0x139d}}, // 4967, depth=2 +{0x07fffffe00000000, -1,{0xffff,0x17d9}}, // 4968, depth=1 +{0xf807f807f807f807, 4505,{0xffff,0x0167}}, // 4969, depth=2 +{0x0001ffff80000000, -1,{0xffff,0x1851}}, // 4970, depth=1 +{0xc000007fc000007f, -1,{0xffff,0x0088}}, // 4971, depth=1 +{0x00000000003c003c, 4512,{0x03a3,0xffff}}, // 4972, depth=2 +{0xff0001ffffffffff, -1,{0xffff,0x1230}}, // 4973 +{0xfffffffffeffffff, -1,{0xffff,0x19fe}}, // 4974 +{0xffffffffdfffffff, -1,{0xffff,0x18be}}, // 4975, depth=1 +{0xffffffffe0000000, -1,{0xffff,0x18e2}}, // 4976, depth=1 +{0xffffffffe0000001, -1,{0xffff,0x18e3}}, // 4977, depth=1 +{0x0380038003800380, 4513,{0xffff,0x0262}}, // 4978, depth=2 +{0xffffffffe0000003, -1,{0xffff,0x18e4}}, // 4979, depth=1 +{0xffffffffff000000, -1,{0xffff,0x1a27}}, // 4980 +{0xffffffffff000001, -1,{0xffff,0x1a28}}, // 4981 +{0x0000000001ffffc0, -1,{0x0692,0x1e92}}, // 4982, depth=1 +{0xffff007fffff007f, 4517,{0xffff,0x0416}}, // 4983, depth=2 +{0x0000000003c003c0, 4521,{0x02a3,0xffff}}, // 4984, depth=2 +{0x0000000ffffffc00, -1,{0xffff,0x1d99}}, // 4985 +{0xffffffffff000003, -1,{0xffff,0x1a29}}, // 4986 +{0x8000000000ffffff, -1,{0xffff,0x1058}}, // 4987, depth=1 +{0x0000fffffffffe00, -1,{0xffff,0x1de6}}, // 4988, depth=1 +{0xe003ffffe003ffff, -1,{0xffff,0x00d4}}, // 4989, depth=1 +{0xfffff007ffffffff, 4995,{0xffff,0x1536}}, // 4990 +{0xf00000000007ffff, 4527,{0xffff,0x1116}}, // 4991, depth=2 +{0x01ffe00001ffe000, 4531,{0xffff,0x04cb}}, // 4992, depth=2 +{0xfffff80ffffff80f, -1,{0xffff,0x0558}}, // 4993, depth=1 +{0x7ffffffffffe0000, -1,{0xffff,0x1bed}}, // 4994, depth=1 +{0x800000001fffffff, -1,{0xffff,0x105d}}, // 4995 +{0x000ffc0000000000, -1,{0xffff,0x1589}}, // 4996, depth=1 +{0xffffffffff00000f, -1,{0xffff,0x1a2b}}, // 4997 +{0x0000000020202020, 4532,{0x00f0,0xffff}}, // 4998, depth=3 +{0xffffffffffffe7ff, -1,{0xffff,0x1cfd}}, // 4999, depth=1 +{0xfffff80001ffffff, -1,{0xffff,0x156d}}, // 5000 +{0x00000000fc1fffff, -1,{0x019a,0xffff}}, // 5001, depth=1 +{0xf8000000f8000000, -1,{0xffff,0x0144}}, // 5002, depth=1 +{0xfffffff803ffffff, -1,{0xffff,0x1776}}, // 5003 +{0x007fff80007fff80, -1,{0xffff,0x064f}}, // 5004, depth=1 +{0xfff800000001ffff, 4537,{0xffff,0x135d}}, // 5005, depth=2 +{0x000000007ffffc00, -1,{0x0594,0x1d94}}, // 5006, depth=1 +{0xffffffffe000001f, 4538,{0xffff,0x18e7}}, // 5007, depth=2 +{0x00007fffffffc000, -1,{0xffff,0x1ca0}}, // 5008, depth=1 +{0xf00ff00ff00ff00f, 4539,{0xffff,0x0127}}, // 5009, depth=2 +{0x00000ffffc000000, -1,{0xffff,0x1991}}, // 5010, depth=1 +{0x7fffffffffffffe0, -1,{0xffff,0x1ef9}}, // 5011 +{0x000000001ffc0000, -1,{0x038a,0x1b8a}}, // 5012, depth=1 +{0x800000ff800000ff, -1,{0xffff,0x0048}}, // 5013, depth=1 +{0x0000000001ffffe0, 4540,{0x06d3,0x1ed3}}, // 5014, depth=2 +{0x001ff00000000000, -1,{0xffff,0x1508}}, // 5015 +{0x0000007800000000, -1,{0xffff,0x1743}}, // 5016 +{0xffffffffe001ffff, -1,{0xffff,0x18f3}}, // 5017 +{0x0007ffffffff8000, -1,{0xffff,0x1c63}}, // 5018, depth=1 +{0xfffffc000007ffff, -1,{0xffff,0x15a8}}, // 5019, depth=1 +{0x7ffffffffffffff0, -1,{0xffff,0x1f3a}}, // 5020 +{0x8000000180000001, 4541,{0xffff,0x0041}}, // 5021, depth=2 +{0x0001fff00001fff0, 4542,{0xffff,0x070c}}, // 5022, depth=3 +{0xffffffffc0000001, -1,{0xffff,0x18a2}}, // 5023, depth=1 +{0x0000000000ffffc0, -1,{0x0691,0x1e91}}, // 5024 +{0xffffffffc0000003, -1,{0xffff,0x18a3}}, // 5025, depth=1 +{0x7ffffffffffffffc, -1,{0xffff,0x1fbc}}, // 5026 +{0xfe0000000003ffff, -1,{0xffff,0x11d8}}, // 5027, depth=1 +{0x000007ffff000000, -1,{0xffff,0x1a12}}, // 5028, depth=1 +{0xffffffffc0000007, -1,{0xffff,0x18a4}}, // 5029, depth=1 +{0x0000000001fffff0, -1,{0x0714,0x1f14}}, // 5030, depth=1 +{0xfe00000000007fff, -1,{0xffff,0x11d5}}, // 5031 +{0x7ffffffffffffffe, 5033,{0xffff,0x1ffd}}, // 5032 +{0x00000001c0000000, -1,{0xffff,0x1882}}, // 5033 +{0x00000003ff800000, -1,{0xffff,0x1a4a}}, // 5034, depth=1 +{0xfc0003ffffffffff, -1,{0xffff,0x11af}}, // 5035, depth=1 +{0x7fffffffffffffff, -1,{0xffff,0x103e}}, // 5036 +{0xfffe00fffffe00ff, 4550,{0xffff,0x03d6}}, // 5037, depth=2 +{0x3fc000003fc00000, 4552,{0xffff,0x0287}}, // 5038, depth=2 +{0xfdfffffffdffffff, 4553,{0xffff,0x019e}}, // 5039, depth=2 +{0x1ff000001ff00000, 4561,{0xffff,0x0308}}, // 5040, depth=3 +{0xfffffffe3fffffff, 5043,{0xffff,0x17fc}}, // 5041 +{0x0020000000200000, 4566,{0xffff,0x02c0}}, // 5042, depth=2 +{0x8000000000000001, -1,{0xffff,0x1041}}, // 5043 +{0x00000000003ffc00, 4569,{0x058b,0x1d8b}}, // 5044, depth=3 +{0x0000000001ffffff, 4576,{0x0018,0x1018}}, // 5045, depth=2 +{0x0000000002000000, 4579,{0x01c0,0x19c0}}, // 5046, depth=2 +{0x00000000c01fc01f, -1,{0x00a6,0xffff}}, // 5047, depth=1 +{0x01ffffffffff8000, -1,{0xffff,0x1c69}}, // 5048 +{0xc007ffffc007ffff, -1,{0xffff,0x0094}}, // 5049, depth=1 +{0x01fffc0000000000, -1,{0xffff,0x158e}}, // 5050, depth=1 +{0xfff7fff7fff7fff7, -1,{0xffff,0x032e}}, // 5051, depth=1 +{0x0000000000fe0000, -1,{0x03c6,0x1bc6}}, // 5052, depth=1 +{0xe0000000000fffff, 4582,{0xffff,0x10d6}}, // 5053, depth=2 +{0xffff80000000ffff, -1,{0xffff,0x1460}}, // 5054 +{0xfffffff80000ffff, -1,{0xffff,0x176c}}, // 5055, depth=1 +{0x0ffff8000ffff800, -1,{0xffff,0x0550}}, // 5056, depth=1 +{0xfffff01ffffff01f, -1,{0xffff,0x0518}}, // 5057, depth=1 +{0x007f0000007f0000, -1,{0xffff,0x0406}}, // 5058, depth=1 +{0xffff000000ffffff, 4584,{0xffff,0x1427}}, // 5059, depth=2 +{0x03fffff800000000, 4585,{0xffff,0x1756}}, // 5060, depth=2 +{0xffffffffff00003f, -1,{0xffff,0x1a2d}}, // 5061 +{0xfff800000003ffff, -1,{0xffff,0x135e}}, // 5062 +{0xffffffffffc001ff, -1,{0xffff,0x1ab2}}, // 5063 +{0x00fe000000000000, -1,{0xffff,0x13c6}}, // 5064, depth=1 +{0x00000000fffffeff, -1,{0x05de,0xffff}}, // 5065 +{0x0000000003800380, 4588,{0x0262,0xffff}}, // 5066, depth=2 +{0xf00000fff00000ff, 4591,{0xffff,0x010b}}, // 5067, depth=2 +{0x0fffffffffff0000, -1,{0xffff,0x1c2b}}, // 5068, depth=1 +{0xffffffffffffcfff, -1,{0xffff,0x1cbd}}, // 5069, depth=1 +{0x7ff8000000000000, -1,{0xffff,0x134b}}, // 5070, depth=1 +{0xfbfbfbfbfbfbfbfb, 4593,{0xffff,0x0176}}, // 5071, depth=2 +{0x000ff000000ff000, -1,{0xffff,0x0507}}, // 5072, depth=1 +{0x00000000e003e003, 4594,{0x00e4,0xffff}}, // 5073, depth=2 +{0x000000001e1e1e1e, -1,{0x01f3,0xffff}}, // 5074, depth=1 +{0xf0000001f0000001, 4596,{0xffff,0x0104}}, // 5075, depth=2 +{0xffffffffffc00000, -1,{0xffff,0x1aa9}}, // 5076, depth=1 +{0x00000000fffffcff, 4597,{0x059d,0xffff}}, // 5077, depth=2 +{0x2020202020202020, 4609,{0xffff,0x00f0}}, // 5078, depth=2 +{0xfff8001fffffffff, 4615,{0xffff,0x1371}}, // 5079, depth=2 +{0x3800380038003800, 4618,{0xffff,0x0162}}, // 5080, depth=2 +{0xfff000000003ffff, 4621,{0xffff,0x131d}}, // 5081, depth=2 +{0x00000000ffffff00, -1,{0x0617,0x1e17}}, // 5082 +{0xffffffffffc00007, -1,{0xffff,0x1aac}}, // 5083, depth=1 +{0x1fffffffff000000, -1,{0xffff,0x1a24}}, // 5084, depth=1 +{0xffffffffc000003f, 4629,{0xffff,0x18a7}}, // 5085, depth=2 +{0x0001f8000001f800, 4632,{0xffff,0x0545}}, // 5086, depth=2 +{0xffffff87ffffffff, -1,{0xffff,0x167b}}, // 5087 +{0x000000ffffffff80, -1,{0xffff,0x1e60}}, // 5088, depth=1 +{0xe01fe01fe01fe01f, 4639,{0xffff,0x00e7}}, // 5089, depth=2 +{0x07ffffe007ffffe0, 4642,{0xffff,0x06d5}}, // 5090, depth=2 +{0xf7fff7fff7fff7ff, 4643,{0xffff,0x012e}}, // 5091, depth=2 +{0x00001fffffffff00, -1,{0xffff,0x1e24}}, // 5092, depth=1 +{0xffe00fffffffffff, -1,{0xffff,0x12f6}}, // 5093 +{0x0000000000018000, -1,{0x0441,0x1c41}}, // 5094, depth=1 +{0xffff00001fffffff, -1,{0xffff,0x142c}}, // 5095 +{0xffffffffc001ffff, -1,{0xffff,0x18b2}}, // 5096 +{0x000001ff000001ff, -1,{0xffff,0x0008}}, // 5097, depth=1 +{0x000000003ffffc00, 4644,{0x0593,0x1d93}}, // 5098, depth=2 +{0x00000000ffe7ffe7, -1,{0x02ed,0xffff}}, // 5099, depth=1 +{0xffffffc000001fff, -1,{0xffff,0x16a6}}, // 5100 +{0x003ffffffff00000, 5102,{0xffff,0x1b21}}, // 5101 +{0x00000007fc000000, -1,{0xffff,0x1988}}, // 5102 +{0xffffffffe000007f, -1,{0xffff,0x18e9}}, // 5103, depth=1 +{0x000007fffe000000, -1,{0xffff,0x19d1}}, // 5104 +{0x001fff8000000000, -1,{0xffff,0x164d}}, // 5105 +{0x0ffc000000000000, -1,{0xffff,0x1389}}, // 5106, depth=1 +{0xffffffffffc0001f, -1,{0xffff,0x1aae}}, // 5107, depth=1 +{0x01e001e001e001e0, 4648,{0xffff,0x02e3}}, // 5108, depth=2 +{0xfffff800000fffff, -1,{0xffff,0x1568}}, // 5109, depth=1 +{0x7ffff8007ffff800, 4652,{0xffff,0x0553}}, // 5110, depth=2 +{0x7fffffffe0000000, 5112,{0xffff,0x18e1}}, // 5111 +{0x00000ff800000000, -1,{0xffff,0x1748}}, // 5112 +{0x0000000300000003, 4654,{0xffff,0x0001}}, // 5113, depth=2 +{0xffffffff80000000, -1,{0xffff,0x1860}}, // 5114, depth=1 +{0xfffffff0000001ff, 4656,{0xffff,0x1724}}, // 5115, depth=2 +{0xfffe0001ffffffff, -1,{0xffff,0x13ef}}, // 5116 +{0xffffffff80000003, -1,{0xffff,0x1862}}, // 5117, depth=1 +{0x0000000000fffe00, -1,{0x05ce,0x1dce}}, // 5118, depth=1 +{0xff9fffffffffffff, -1,{0xffff,0x127d}}, // 5119, depth=1 +{0x0000000000fffffc, -1,{0x0795,0x1f95}}, // 5120 +{0xffffffff80000007, -1,{0xffff,0x1863}}, // 5121, depth=1 +{0x3ffffffffc000000, -1,{0xffff,0x19a3}}, // 5122, depth=1 +{0xff0003ffff0003ff, 4660,{0xffff,0x0211}}, // 5123, depth=2 +{0x000007c0000007c0, -1,{0xffff,0x0684}}, // 5124, depth=1 +{0xfc0000000007ffff, -1,{0xffff,0x1198}}, // 5125, depth=1 +{0xfffffff0000003ff, -1,{0xffff,0x1725}}, // 5126 +{0x0000000000fffffe, -1,{0x07d6,0x1fd6}}, // 5127 +{0x0003f80000000000, -1,{0xffff,0x1546}}, // 5128, depth=1 +{0xffffffff8000000f, -1,{0xffff,0x1864}}, // 5129, depth=1 +{0x0000000000070000, 4663,{0x0402,0x1c02}}, // 5130, depth=2 +{0xf007f007f007f007, 4669,{0xffff,0x0126}}, // 5131, depth=2 +{0x00000000c0c0c0c0, -1,{0x00b1,0xffff}}, // 5132, depth=1 +{0xffffffffffff0fff, -1,{0xffff,0x1c3b}}, // 5133 +{0x3ffffff83ffffff8, -1,{0xffff,0x075a}}, // 5134 +{0xffffff00007fffff, -1,{0xffff,0x162e}}, // 5135 +{0x00001fffff800000, -1,{0xffff,0x1a55}}, // 5136 +{0x0000000000070007, -1,{0x0022,0xffff}}, // 5137, depth=1 +{0x001ffffff0000000, -1,{0xffff,0x1918}}, // 5138, depth=1 +{0xffffffffffc0003f, -1,{0xffff,0x1aaf}}, // 5139, depth=1 +{0xffff000000000001, 5142,{0xffff,0x1410}}, // 5140 +{0xf80007ffffffffff, -1,{0xffff,0x116f}}, // 5141, depth=1 +{0xe00000ffffffffff, 5146,{0xffff,0x10ea}}, // 5142 +{0xffe003ffffffffff, -1,{0xffff,0x12f4}}, // 5143, depth=1 +{0x000000001ffffc00, -1,{0x0592,0x1d92}}, // 5144, depth=1 +{0xfffc01fffffc01ff, 4671,{0xffff,0x0396}}, // 5145, depth=2 +{0x00000000c07fffff, -1,{0x0098,0xffff}}, // 5146 +{0xfffffffffc000fff, -1,{0xffff,0x19b1}}, // 5147, depth=1 +{0xfff00000fff00000, -1,{0xffff,0x030b}}, // 5148, depth=1 +{0xfbfffffffbffffff, 4679,{0xffff,0x015e}}, // 5149, depth=2 +{0x000000001c1c1c1c, -1,{0x01b2,0xffff}}, // 5150, depth=1 +{0xffffffff003fffff, -1,{0xffff,0x1835}}, // 5151, depth=1 +{0x00000000001ff000, 4682,{0x0508,0x1d08}}, // 5152, depth=2 +{0x0000ffffffc00000, -1,{0xffff,0x1a99}}, // 5153 +{0x0001ffff00000000, -1,{0xffff,0x1810}}, // 5154, depth=1 +{0xff000007ff000007, -1,{0xffff,0x020a}}, // 5155, depth=1 +{0xffff000000000003, -1,{0xffff,0x1411}}, // 5156 +{0x00003ffffe000000, -1,{0xffff,0x19d4}}, // 5157 +{0xfffff0000000ffff, -1,{0xffff,0x1523}}, // 5158 +{0xff800000000007ff, -1,{0xffff,0x1253}}, // 5159, depth=1 +{0x00003ff800003ff8, -1,{0xffff,0x074a}}, // 5160, depth=1 +{0xfffc0003fffc0003, -1,{0xffff,0x038f}}, // 5161, depth=1 +{0x3ff03ff03ff03ff0, -1,{0xffff,0x0329}}, // 5162, depth=1 +{0x0001e00000000000, 5165,{0xffff,0x14c3}}, // 5163 +{0x0000000007f007f0, -1,{0x0326,0xffff}}, // 5164, depth=1 +{0x03fffff003fffff0, -1,{0xffff,0x0715}}, // 5165 +{0x000003f800000000, -1,{0xffff,0x1746}}, // 5166, depth=1 +{0xffffffc007ffffff, -1,{0xffff,0x16b4}}, // 5167, depth=1 +{0x0000001fffff8000, -1,{0xffff,0x1c55}}, // 5168, depth=1 +{0x800fffff800fffff, -1,{0xffff,0x0054}}, // 5169, depth=1 +{0x000ffffffffff800, -1,{0xffff,0x1d68}}, // 5170, depth=1 +{0x00000000ffff83ff, 4686,{0x045a,0xffff}}, // 5171, depth=3 +{0xffffffffffc1ffff, -1,{0xffff,0x1aba}}, // 5172 +{0xffefffefffefffef, -1,{0xffff,0x02ee}}, // 5173, depth=1 +{0x0000fff000000000, 4692,{0xffff,0x170b}}, // 5174, depth=2 +{0xfe00003fffffffff, -1,{0xffff,0x11ec}}, // 5175, depth=1 +{0x000000003c003c00, -1,{0x01a3,0xffff}}, // 5176, depth=1 +{0x00000000fff03fff, 4695,{0x0319,0xffff}}, // 5177, depth=3 +{0x03fff00000000000, -1,{0xffff,0x150d}}, // 5178 +{0xf8003fffffffffff, -1,{0xffff,0x1172}}, // 5179, depth=1 +{0x000007fe00000000, -1,{0xffff,0x17c9}}, // 5180, depth=1 +{0xfffffff00001ffff, -1,{0xffff,0x172c}}, // 5181, depth=1 +{0x00007ffe00007ffe, -1,{0xffff,0x07cd}}, // 5182, depth=1 +{0x0000000180000000, -1,{0xffff,0x1841}}, // 5183 +{0x003ffffffe000000, 4699,{0xffff,0x19dc}}, // 5184, depth=2 +{0xffffe03fffffe03f, -1,{0xffff,0x04d8}}, // 5185, depth=1 +{0xcccccccccccccccc, -1,{0xffff,0x00b9}}, // 5186, depth=1 +{0xffffc0ffffffffff, -1,{0xffff,0x14b9}}, // 5187 +{0x1ffffffe1ffffffe, 4701,{0xffff,0x07db}}, // 5188, depth=2 +{0xfffe000001ffffff, 4702,{0xffff,0x13e7}}, // 5189, depth=2 +{0x00007f0000007f00, -1,{0xffff,0x0606}}, // 5190, depth=1 +{0xffffff01ffffffff, -1,{0xffff,0x1638}}, // 5191, depth=1 +{0x0000000001c00000, 4706,{0x0282,0x1a82}}, // 5192, depth=2 +{0xfffffffdffffffff, -1,{0xffff,0x17be}}, // 5193 +{0x0ffffff800000000, -1,{0xffff,0x1758}}, // 5194, depth=1 +{0xfffffffe00000000, -1,{0xffff,0x17de}}, // 5195 +{0x1fffff001fffff00, -1,{0xffff,0x0614}}, // 5196, depth=1 +{0xfffffffe00000001, -1,{0xffff,0x17df}}, // 5197 +{0xffe07fffffffffff, -1,{0xffff,0x12f9}}, // 5198 +{0x0000007800000078, -1,{0xffff,0x0743}}, // 5199 +{0x000000fffffffff0, -1,{0xffff,0x1f23}}, // 5200, depth=1 +{0x00000000fffc01ff, -1,{0x0396,0xffff}}, // 5201, depth=1 +{0x000000000ffff000, -1,{0x050f,0x1d0f}}, // 5202, depth=1 +{0x80000000ffffffff, 4707,{0xffff,0x1060}}, // 5203, depth=2 +{0xfffffffe00000007, -1,{0xffff,0x17e1}}, // 5204 +{0xe00001ffe00001ff, 4708,{0xffff,0x00cb}}, // 5205, depth=2 +{0x7ffe7ffe7ffe7ffe, 4709,{0xffff,0x03ed}}, // 5206, depth=2 +{0xfffffffffc0fffff, -1,{0xffff,0x19b9}}, // 5207 +{0x000000fffffffff8, -1,{0xffff,0x1f64}}, // 5208, depth=1 +{0xffffffffffff9fff, -1,{0xffff,0x1c7d}}, // 5209, depth=1 +{0x0003fffffc000000, -1,{0xffff,0x1997}}, // 5210 +{0xffff81ffffff81ff, 4711,{0xffff,0x0459}}, // 5211, depth=2 +{0x000000fffffffffc, -1,{0xffff,0x1fa5}}, // 5212, depth=1 +{0xf7f7f7f7f7f7f7f7, 4712,{0xffff,0x0136}}, // 5213, depth=2 +{0x1fff000000000000, 4716,{0xffff,0x140c}}, // 5214, depth=2 +{0x000000ffffffffff, 4717,{0xffff,0x1027}}, // 5215, depth=2 +{0x7e007e007e007e00, 4718,{0xffff,0x01e5}}, // 5216, depth=2 +{0xfffffffff807ffff, 5219,{0xffff,0x1977}}, // 5217 +{0x07fff00007fff000, 4719,{0xffff,0x050e}}, // 5218, depth=2 +{0xffc1ffffffffffff, 5228,{0xffff,0x12ba}}, // 5219 +{0x1c1c1c1c1c1c1c1c, 4724,{0xffff,0x01b2}}, // 5220, depth=2 +{0xe0000003e0000003, 4725,{0xffff,0x00c4}}, // 5221, depth=2 +{0xffffffffff800000, 4728,{0xffff,0x1a68}}, // 5222, depth=2 +{0xf00ffffff00fffff, 4732,{0xffff,0x0117}}, // 5223, depth=2 +{0x01fffffffffff800, -1,{0xffff,0x1d6d}}, // 5224, depth=1 +{0xffffffffff800003, -1,{0xffff,0x1a6a}}, // 5225, depth=1 +{0x00fffffffff00000, -1,{0xffff,0x1b23}}, // 5226, depth=1 +{0xffff8003ffff8003, 4733,{0xffff,0x0452}}, // 5227, depth=3 +{0x800000000000007f, -1,{0xffff,0x1047}}, // 5228 +{0xfff0003fffffffff, 4745,{0xffff,0x1331}}, // 5229, depth=2 +{0x0000000003000300, 4747,{0x0221,0xffff}}, // 5230, depth=2 +{0x00000000fff87fff, 4748,{0x035b,0xffff}}, // 5231, depth=2 +{0xfffff8ffffffffff, -1,{0xffff,0x157c}}, // 5232 +{0xffe000000007ffff, 4756,{0xffff,0x12dd}}, // 5233, depth=2 +{0xf0000000001fffff, -1,{0xffff,0x1118}}, // 5234 +{0x00001fff00000000, -1,{0xffff,0x180c}}, // 5235 +{0x1ffffffe00000000, -1,{0xffff,0x17db}}, // 5236, depth=1 +{0xffffffffff80000f, -1,{0xffff,0x1a6c}}, // 5237, depth=1 +{0x0040004000400040, -1,{0xffff,0x02a0}}, // 5238, depth=1 +{0xffffff800000ffff, -1,{0xffff,0x1668}}, // 5239 +{0x000fffffffffe000, -1,{0xffff,0x1ce6}}, // 5240, depth=1 +{0xffffffff8000007f, 4757,{0xffff,0x1867}}, // 5241, depth=2 +{0x3000300030003000, -1,{0xffff,0x0121}}, // 5242, depth=1 +{0x7fffffffffc00000, -1,{0xffff,0x1aa8}}, // 5243 +{0x0000ffffffffff00, -1,{0xffff,0x1e27}}, // 5244, depth=1 +{0xff80007fffffffff, -1,{0xffff,0x126f}}, // 5245 +{0x7ffffff000000000, 4758,{0xffff,0x171a}}, // 5246, depth=2 +{0x03ffff8000000000, -1,{0xffff,0x1652}}, // 5247 +{0x0003fffe0003fffe, -1,{0xffff,0x07d0}}, // 5248, depth=1 +{0xc03fc03fc03fc03f, 4760,{0xffff,0x00a7}}, // 5249, depth=2 +{0xfffffffff3ffffff, -1,{0xffff,0x193d}}, // 5250 +{0xffe1ffffffe1ffff, 4761,{0xffff,0x02db}}, // 5251, depth=2 +{0x01fffffff8000000, -1,{0xffff,0x195d}}, // 5252 +{0xefffefffefffefff, 4763,{0xffff,0x00ee}}, // 5253, depth=2 +{0xfff8003fffffffff, -1,{0xffff,0x1372}}, // 5254 +{0xffffffffff8001ff, -1,{0xffff,0x1a71}}, // 5255 +{0x0003ff000003ff00, -1,{0xffff,0x0609}}, // 5256, depth=1 +{0xff0007ffffffffff, 5258,{0xffff,0x1232}}, // 5257 +{0xc01fc01fc01fc01f, -1,{0xffff,0x00a6}}, // 5258 +{0xf9fffffff9ffffff, -1,{0xffff,0x015d}}, // 5259, depth=1 +{0xfffffc00001fffff, -1,{0xffff,0x15aa}}, // 5260 +{0xffffff007fffffff, -1,{0xffff,0x1636}}, // 5261 +{0x000000ffe0000000, -1,{0xffff,0x18ca}}, // 5262, depth=1 +{0xffff80000fffffff, -1,{0xffff,0x146c}}, // 5263, depth=1 +{0x01e0000000000000, -1,{0xffff,0x12c3}}, // 5264, depth=1 +{0x00000000fffdfffd, -1,{0x03ae,0xffff}}, // 5265, depth=1 +{0xffffe0001fffffff, -1,{0xffff,0x14ef}}, // 5266 +{0x00000000fffdffff, -1,{0x039e,0xffff}}, // 5267, depth=1 +{0x00000000fffe0000, -1,{0x03ce,0x1bce}}, // 5268, depth=1 +{0x00000000fffe0001, -1,{0x03cf,0xffff}}, // 5269, depth=1 +{0xfffffff800000fff, -1,{0xffff,0x1768}}, // 5270 +{0x00000000fffe0003, -1,{0x03d0,0xffff}}, // 5271, depth=1 +{0x000000007fffff00, -1,{0x0616,0x1e16}}, // 5272 +{0x001ffffe001ffffe, -1,{0xffff,0x07d3}}, // 5273 +{0xc0ffffffffffffff, 5276,{0xffff,0x10b9}}, // 5274 +{0x00000000fffe0007, 4772,{0x03d1,0xffff}}, // 5275, depth=2 +{0x00000000fffe01ff, -1,{0x03d7,0xffff}}, // 5276 +{0xffffffffc00000ff, -1,{0xffff,0x18a9}}, // 5277, depth=1 +{0xffffff00003fffff, 5280,{0xffff,0x162d}}, // 5278 +{0x80000000007fffff, 4775,{0xffff,0x1057}}, // 5279, depth=2 +{0x00000000ffffffbf, -1,{0x065e,0xffff}}, // 5280 +{0x00000000ffffffc0, -1,{0x0699,0x1e99}}, // 5281 +{0x007f800000000000, -1,{0xffff,0x1447}}, // 5282, depth=1 +{0x00000000fffe000f, -1,{0x03d2,0xffff}}, // 5283, depth=1 +{0x00001fffffffffc0, -1,{0xffff,0x1ea6}}, // 5284, depth=1 +{0xffffffffff80003f, -1,{0xffff,0x1a6e}}, // 5285, depth=1 +{0x000ffff0000ffff0, -1,{0xffff,0x070f}}, // 5286, depth=1 +{0xc0ffffffc0ffffff, 4776,{0xffff,0x0099}}, // 5287, depth=2 +{0x00000000ffffffc1, -1,{0x069a,0xffff}}, // 5288 +{0xfffff000001fffff, -1,{0xffff,0x1528}}, // 5289, depth=1 +{0x0001ff0000000000, -1,{0xffff,0x1608}}, // 5290 +{0xffffffffffe0ffff, -1,{0xffff,0x1afa}}, // 5291, depth=1 +{0x00000000001fc000, -1,{0x0486,0x1c86}}, // 5292, depth=1 +{0xff800fffffffffff, -1,{0xffff,0x1274}}, // 5293 +{0x01ffffffffffe000, -1,{0xffff,0x1ceb}}, // 5294, depth=1 +{0xffe7ffe7ffe7ffe7, -1,{0xffff,0x02ed}}, // 5295, depth=1 +{0xfffffffefffffffe, 4779,{0xffff,0x07de}}, // 5296, depth=2 +{0x000000008fff8fff, 4780,{0x006c,0xffff}}, // 5297, depth=3 +{0xffffffff00000000, -1,{0xffff,0x181f}}, // 5298, depth=1 +{0x00000000fffe001f, 4796,{0x03d3,0xffff}}, // 5299, depth=2 +{0x0000007fffe00000, -1,{0xffff,0x1ad1}}, // 5300 +{0xffffffe0000003ff, 4798,{0xffff,0x16e4}}, // 5301, depth=2 +{0x0000000018181818, -1,{0x0171,0xffff}}, // 5302, depth=1 +{0xfffc01ffffffffff, 5311,{0xffff,0x13b6}}, // 5303 +{0x1ffe00001ffe0000, 4800,{0xffff,0x03cb}}, // 5304, depth=2 +{0xffffffff00000007, -1,{0xffff,0x1822}}, // 5305, depth=1 +{0x0000000000fe00fe, -1,{0x03e6,0xffff}}, // 5306, depth=1 +{0x00000000e0ffffff, -1,{0x00da,0xffff}}, // 5307, depth=1 +{0x000000ffc0000000, -1,{0xffff,0x1889}}, // 5308, depth=1 +{0xff3fffffffffffff, -1,{0xffff,0x123d}}, // 5309, depth=1 +{0x03ffffe003ffffe0, -1,{0xffff,0x06d4}}, // 5310, depth=1 +{0x00000000ffffffc7, -1,{0x069c,0xffff}}, // 5311 +{0xfffffc000fffffff, -1,{0xffff,0x15b1}}, // 5312 +{0xffffffff0000000f, -1,{0xffff,0x1823}}, // 5313, depth=1 +{0xfffffffe0000007f, -1,{0xffff,0x17e5}}, // 5314 +{0x87ffffff87ffffff, 4806,{0xffff,0x005b}}, // 5315, depth=2 +{0x7fffffffffffff00, 4810,{0xffff,0x1e36}}, // 5316, depth=2 +{0xfe0007fffe0007ff, 4813,{0xffff,0x01d1}}, // 5317, depth=2 +{0xffffdfffffffffff, -1,{0xffff,0x14be}}, // 5318 +{0xffffe00000000000, -1,{0xffff,0x14d2}}, // 5319 +{0xffffe00000000001, -1,{0xffff,0x14d3}}, // 5320 +{0x00000000f81ff81f, 4819,{0x0169,0xffff}}, // 5321, depth=2 +{0x000000000003f800, -1,{0x0546,0x1d46}}, // 5322, depth=1 +{0xffffffc000007fff, -1,{0xffff,0x16a8}}, // 5323, depth=1 +{0x0000001ff8000000, -1,{0xffff,0x1949}}, // 5324, depth=1 +{0xffffffffff81ffff, -1,{0xffff,0x1a79}}, // 5325 +{0x00000003ff000000, -1,{0xffff,0x1a09}}, // 5326, depth=1 +{0x00000000f80003ff, -1,{0x014e,0xffff}}, // 5327, depth=1 +{0xfffffffffe7fffff, -1,{0xffff,0x19fd}}, // 5328 +{0xffffffff0000001f, -1,{0xffff,0x1824}}, // 5329, depth=1 +{0x000001fffff00000, -1,{0xffff,0x1b14}}, // 5330 +{0x00000000fffe003f, 4820,{0x03d4,0xffff}}, // 5331, depth=2 +{0x00001ffffffffff0, -1,{0xffff,0x1f28}}, // 5332, depth=1 +{0xe00fe00fe00fe00f, 4824,{0xffff,0x00e6}}, // 5333, depth=3 +{0x1000000010000000, 4831,{0xffff,0x0100}}, // 5334, depth=2 +{0xfffff81ffffff81f, 4838,{0xffff,0x0559}}, // 5335, depth=3 +{0xffffffff000001ff, -1,{0xffff,0x1828}}, // 5336 +{0x00000000fffffe03, -1,{0x05d8,0xffff}}, // 5337, depth=1 +{0x0000000001800000, 4843,{0x0241,0x1a41}}, // 5338, depth=2 +{0xfffff0000fffffff, -1,{0xffff,0x152f}}, // 5339, depth=1 +{0x00001ffffffffff8, -1,{0xffff,0x1f69}}, // 5340, depth=1 +{0x00000000fffffe07, -1,{0x05d9,0xffff}}, // 5341, depth=1 +{0x000000000fffc000, -1,{0x048d,0x1c8d}}, // 5342, depth=1 +{0xffffff0000ffffff, -1,{0xffff,0x162f}}, // 5343, depth=1 +{0x00000000007e0000, 4844,{0x03c5,0x1bc5}}, // 5344, depth=2 +{0x007ffc0000000000, -1,{0xffff,0x158c}}, // 5345 +{0x00001ffffffffffe, -1,{0xffff,0x1feb}}, // 5346, depth=1 +{0x00001fffffffffff, -1,{0xffff,0x102c}}, // 5347, depth=1 +{0x0000200000000000, -1,{0xffff,0x14c0}}, // 5348, depth=1 +{0x00000000fffffe0f, 4845,{0x05da,0xffff}}, // 5349, depth=2 +{0x000ff800000ff800, 4846,{0xffff,0x0548}}, // 5350, depth=2 +{0xffff0000007fffff, -1,{0xffff,0x1426}}, // 5351, depth=1 +{0x000003fff0000000, -1,{0xffff,0x190d}}, // 5352, depth=1 +{0x00000000c0ffffff, 4849,{0x0099,0xffff}}, // 5353, depth=2 +{0x003ffe00003ffe00, 4852,{0xffff,0x05cc}}, // 5354, depth=2 +{0xf3f3f3f3f3f3f3f3, 4854,{0xffff,0x0135}}, // 5355, depth=2 +{0xfffffffc00ffffff, -1,{0xffff,0x17b5}}, // 5356 +{0xffc007ffffffffff, -1,{0xffff,0x12b4}}, // 5357, depth=1 +{0x007ff00000000000, -1,{0xffff,0x150a}}, // 5358, depth=1 +{0xffe000ffffe000ff, 4856,{0xffff,0x02d2}}, // 5359, depth=2 +{0x0038003800380038, -1,{0xffff,0x0362}}, // 5360, depth=1 +{0xfff803fffff803ff, 4858,{0xffff,0x0356}}, // 5361, depth=2 +{0x1818181818181818, 4862,{0xffff,0x0171}}, // 5362, depth=2 +{0x00000000fc00ffff, -1,{0x0195,0xffff}}, // 5363, depth=1 +{0x0002000000020000, 4870,{0xffff,0x03c0}}, // 5364, depth=2 +{0x00000000fffffe1f, 4871,{0x05db,0xffff}}, // 5365, depth=2 +{0x1fffe00000000000, -1,{0xffff,0x14cf}}, // 5366, depth=1 +{0xffe00001ffe00001, 4872,{0xffff,0x02cb}}, // 5367, depth=2 +{0x00ffc00000000000, -1,{0xffff,0x1489}}, // 5368, depth=1 +{0xf7fffffff7ffffff, 4876,{0xffff,0x011e}}, // 5369, depth=2 +{0x0001ffffff000000, -1,{0xffff,0x1a18}}, // 5370, depth=1 +{0xfffffffffffc07ff, -1,{0xffff,0x1bb8}}, // 5371 +{0x0000ffffffffff80, -1,{0xffff,0x1e68}}, // 5372, depth=1 +{0xfffffffe007fffff, -1,{0xffff,0x17f5}}, // 5373, depth=1 +{0x0000000000ffff00, -1,{0x060f,0x1e0f}}, // 5374, depth=1 +{0xfffffffffffe03ff, -1,{0xffff,0x1bf8}}, // 5375, depth=1 +{0x01fff80001fff800, -1,{0xffff,0x054d}}, // 5376 +{0xffffe0000000001f, -1,{0xffff,0x14d7}}, // 5377 +{0x00000000c000c000, -1,{0x00a1,0xffff}}, // 5378, depth=1 +{0x0000038000000000, -1,{0xffff,0x1642}}, // 5379 +{0x0ffffffff0000000, -1,{0xffff,0x191f}}, // 5380, depth=1 +{0xfe00000ffe00000f, -1,{0xffff,0x01ca}}, // 5381, depth=1 +{0x00000000fffffff3, -1,{0x071d,0xffff}}, // 5382 +{0x00000000fffffff9, 5385,{0x075d,0xffff}}, // 5383 +{0x0000000ffffc0000, -1,{0xffff,0x1b91}}, // 5384, depth=1 +{0xe001ffffe001ffff, -1,{0xffff,0x00d3}}, // 5385 +{0x000001fffe000000, -1,{0xffff,0x19cf}}, // 5386, depth=1 +{0x800000007fffffff, -1,{0xffff,0x105f}}, // 5387, depth=1 +{0x8000000080000000, 4877,{0xffff,0x0040}}, // 5388, depth=2 +{0xff00000000000fff, -1,{0xffff,0x1213}}, // 5389, depth=1 +{0x0000001ffffffc00, -1,{0xffff,0x1d9a}}, // 5390 +{0x0000000100000000, -1,{0xffff,0x1800}}, // 5391 +{0x000000000003e000, -1,{0x04c4,0x1cc4}}, // 5392, depth=1 +{0xfff80007fff80007, -1,{0xffff,0x034f}}, // 5393, depth=1 +{0x00001fffe0000000, -1,{0xffff,0x18cf}}, // 5394, depth=1 +{0x00000000fffe007f, 4880,{0x03d5,0xffff}}, // 5395, depth=2 +{0x00c0000000c00000, -1,{0xffff,0x0281}}, // 5396, depth=1 +{0x00000000fffffe3f, -1,{0x05dc,0xffff}}, // 5397, depth=1 +{0xfc000000001fffff, -1,{0xffff,0x119a}}, // 5398 +{0x0fffff8000000000, -1,{0xffff,0x1654}}, // 5399 +{0x000000ff80000000, 4883,{0xffff,0x1848}}, // 5400, depth=2 +{0x7fffffffff800000, -1,{0xffff,0x1a67}}, // 5401 +{0x00000fc000000fc0, 4884,{0xffff,0x0685}}, // 5402, depth=2 +{0x00000000803fffff, -1,{0x0056,0xffff}}, // 5403 +{0x00000000007fffe0, -1,{0x06d1,0x1ed1}}, // 5404 +{0xffffff800fffffff, -1,{0xffff,0x1674}}, // 5405, depth=1 +{0x3fe03fe03fe03fe0, 4886,{0xffff,0x02e8}}, // 5406, depth=2 +{0x001e0000001e0000, -1,{0xffff,0x03c3}}, // 5407 +{0x000000007ff87ff8, -1,{0x036b,0xffff}}, // 5408, depth=1 +{0x001fffff001fffff, -1,{0xffff,0x0014}}, // 5409, depth=1 +{0x00000000007ffe00, -1,{0x05cd,0x1dcd}}, // 5410, depth=1 +{0x00ffffffffffc000, -1,{0xffff,0x1ca9}}, // 5411 +{0xfffe0000fffe0000, 4887,{0xffff,0x03ce}}, // 5412, depth=2 +{0xc0000007ffffffff, 4889,{0xffff,0x10a4}}, // 5413, depth=2 +{0x00000001ffffffc0, -1,{0xffff,0x1e9a}}, // 5414, depth=1 +{0xe7ffe7ffe7ffe7ff, -1,{0xffff,0x00ed}}, // 5415, depth=1 +{0xfffc0001fffc0001, -1,{0xffff,0x038e}}, // 5416 +{0xffdfffdfffdfffdf, -1,{0xffff,0x02ae}}, // 5417, depth=1 +{0xfc0000000fffffff, -1,{0xffff,0x11a1}}, // 5418 +{0xffff0000000000ff, -1,{0xffff,0x1417}}, // 5419 +{0x000000000c000000, 4892,{0x0181,0x1981}}, // 5420, depth=2 +{0xfc00007fffffffff, -1,{0xffff,0x11ac}}, // 5421, depth=1 +{0x000000007fffff80, -1,{0x0657,0x1e57}}, // 5422 +{0x00000000fe0fffff, 4896,{0x01da,0xffff}}, // 5423, depth=2 +{0x007fff8000000000, -1,{0xffff,0x164f}}, // 5424, depth=1 +{0x80000000003fffff, 4903,{0xffff,0x1056}}, // 5425, depth=2 +{0x0000007fffff0000, -1,{0xffff,0x1c16}}, // 5426, depth=1 +{0xfc0007fffc0007ff, 4908,{0xffff,0x0190}}, // 5427, depth=2 +{0xe0000001ffffffff, -1,{0xffff,0x10e3}}, // 5428 +{0xf0007fffffffffff, -1,{0xffff,0x1132}}, // 5429, depth=1 +{0x0fffffffffe00000, -1,{0xffff,0x1ae6}}, // 5430, depth=1 +{0x001ffffffff80000, 5434,{0xffff,0x1b61}}, // 5431 +{0x07fffff007fffff0, -1,{0xffff,0x0716}}, // 5432, depth=1 +{0xffffffe00003ffff, -1,{0xffff,0x16ec}}, // 5433, depth=1 +{0x00000003fe000000, -1,{0xffff,0x19c8}}, // 5434 +{0xfffffffff80007ff, -1,{0xffff,0x196f}}, // 5435, depth=1 +{0x0000ffffffffffc0, -1,{0xffff,0x1ea9}}, // 5436, depth=1 +{0x000fffc000000000, -1,{0xffff,0x168d}}, // 5437 +{0x000000003ff03ff0, 4909,{0x0329,0xffff}}, // 5438, depth=2 +{0xf8000003ffffffff, -1,{0xffff,0x1166}}, // 5439, depth=1 +{0x00001fffc0000000, -1,{0xffff,0x188e}}, // 5440, depth=1 +{0xffffc07fffffc07f, -1,{0xffff,0x0498}}, // 5441, depth=1 +{0xf0000000f0000000, 4910,{0xffff,0x0103}}, // 5442, depth=2 +{0x9999999999999999, -1,{0xffff,0x0079}}, // 5443, depth=1 +{0x0e0000000e000000, 4916,{0xffff,0x01c2}}, // 5444, depth=4 +{0x0000000080ffffff, -1,{0x0058,0xffff}}, // 5445, depth=1 +{0x00000001ffffffe0, -1,{0xffff,0x1edb}}, // 5446, depth=1 +{0x3ffffffff0000000, 5448,{0xffff,0x1921}}, // 5447 +{0x000007fc00000000, -1,{0xffff,0x1788}}, // 5448 +{0xfffc000003ffffff, 4929,{0xffff,0x13a7}}, // 5449, depth=2 +{0x00000000007ffffe, -1,{0x07d5,0x1fd5}}, // 5450 +{0xfff80000000003ff, -1,{0xffff,0x1356}}, // 5451, depth=1 +{0x000000007ffe0000, -1,{0x03cd,0x1bcd}}, // 5452, depth=1 +{0xfffffe03ffffffff, -1,{0xffff,0x15f8}}, // 5453, depth=1 +{0x0180000000000000, -1,{0xffff,0x1241}}, // 5454, depth=1 +{0xe007e007e007e007, -1,{0xffff,0x00e5}}, // 5455, depth=1 +{0xfffffffe000000ff, 5457,{0xffff,0x17e6}}, // 5456 +{0x00000000fdfdfdfd, -1,{0x01b6,0xffff}}, // 5457 +{0x1ffffffc1ffffffc, -1,{0xffff,0x079a}}, // 5458 +{0x00000000f001f001, 4930,{0x0124,0xffff}}, // 5459, depth=3 +{0xffffe0000000007f, 5463,{0xffff,0x14d9}}, // 5460 +{0x00000000fffffe7f, -1,{0x05dd,0xffff}}, // 5461, depth=1 +{0x00000001fffffff0, -1,{0xffff,0x1f1c}}, // 5462, depth=1 +{0x00000000fc003fff, 5465,{0x0193,0xffff}}, // 5463 +{0x000001fe000001fe, -1,{0xffff,0x07c7}}, // 5464, depth=1 +{0xe3e3e3e3e3e3e3e3, -1,{0xffff,0x00f4}}, // 5465 +{0xffffc001ffffffff, -1,{0xffff,0x14b2}}, // 5466 +{0xfff0000007ffffff, -1,{0xffff,0x1326}}, // 5467, depth=1 +{0x0000000003f00000, 4933,{0x0305,0x1b05}}, // 5468, depth=2 +{0xfffffeffffffffff, 5473,{0xffff,0x15fe}}, // 5469 +{0x00000000007e007e, 4935,{0x03e5,0xffff}}, // 5470, depth=3 +{0xffffff87ffffff87, 4938,{0xffff,0x065b}}, // 5471, depth=2 +{0x0000010000000100, 4940,{0xffff,0x0600}}, // 5472, depth=2 +{0x00000000ffbfffbf, -1,{0x026e,0xffff}}, // 5473 +{0x00000001fffffffc, -1,{0xffff,0x1f9e}}, // 5474, depth=1 +{0xe000000001ffffff, -1,{0xffff,0x10db}}, // 5475, depth=1 +{0x0003fffffffff000, 4941,{0xffff,0x1d25}}, // 5476, depth=2 +{0x00000001ffffffff, 4942,{0xffff,0x1020}}, // 5477, depth=2 +{0x00fc00fc00fc00fc, 4943,{0xffff,0x03a5}}, // 5478, depth=2 +{0x800000003fffffff, -1,{0xffff,0x105e}}, // 5479, depth=1 +{0x0000000200000002, 4947,{0xffff,0x07c0}}, // 5480, depth=2 +{0xc00003ffc00003ff, 4950,{0xffff,0x008b}}, // 5481, depth=2 +{0x0030003000300030, -1,{0xffff,0x0321}}, // 5482, depth=1 +{0xf801ffffffffffff, -1,{0xffff,0x1175}}, // 5483, depth=1 +{0x0000fffffffffff0, -1,{0xffff,0x1f2b}}, // 5484, depth=1 +{0xffffff0000000000, -1,{0xffff,0x1617}}, // 5485 +{0xffffff0000000001, -1,{0xffff,0x1618}}, // 5486 +{0xfc000fffffffffff, 4951,{0xffff,0x11b1}}, // 5487, depth=2 +{0x003ffffc00000000, -1,{0xffff,0x1793}}, // 5488, depth=1 +{0xffffffffffff3fff, -1,{0xffff,0x1c3d}}, // 5489, depth=1 +{0x00000000003e0000, -1,{0x03c4,0x1bc4}}, // 5490, depth=1 +{0x0000000080038003, 4953,{0x0062,0xffff}}, // 5491, depth=3 +{0x00000fffffff0000, 4956,{0xffff,0x1c1b}}, // 5492, depth=2 +{0xffff03ffffff03ff, 4957,{0xffff,0x0419}}, // 5493, depth=2 +{0x00001fffffc00000, -1,{0xffff,0x1a96}}, // 5494, depth=1 +{0x00007fffffe00000, -1,{0xffff,0x1ad9}}, // 5495 +{0x07fff80007fff800, 4958,{0xffff,0x054f}}, // 5496, depth=2 +{0xefefefefefefefef, 4962,{0xffff,0x00f6}}, // 5497, depth=2 +{0x7e0000007e000000, 4963,{0xffff,0x01c5}}, // 5498, depth=3 +{0x0000ffffffffffff, -1,{0xffff,0x102f}}, // 5499, depth=1 +{0x0001000000000000, -1,{0xffff,0x1400}}, // 5500, depth=1 +{0xc003ffffffffffff, -1,{0xffff,0x10b3}}, // 5501, depth=1 +{0x0000000000ffff80, -1,{0x0650,0x1e50}}, // 5502, depth=1 +{0xffffe000007fffff, -1,{0xffff,0x14e9}}, // 5503, depth=1 +{0x00001fffff000000, -1,{0xffff,0x1a14}}, // 5504 +{0xffffffc00007ffff, 5506,{0xffff,0x16ac}}, // 5505 +{0x8001800180018001, -1,{0xffff,0x0061}}, // 5506 +{0xffc07fffffc07fff, -1,{0xffff,0x0298}}, // 5507, depth=1 +{0x000000ffff800000, 4965,{0xffff,0x1a50}}, // 5508, depth=2 +{0x1ffffe001ffffe00, -1,{0xffff,0x05d3}}, // 5509 +{0x7fffffff00000000, -1,{0xffff,0x181e}}, // 5510 +{0x00000000fff81fff, 4973,{0x0359,0xffff}}, // 5511, depth=2 +{0xfffffffff0000fff, -1,{0xffff,0x192f}}, // 5512 +{0xc0000007c0000007, 4974,{0xffff,0x0084}}, // 5513, depth=2 +{0x000000000000f000, 4980,{0x0503,0x1d03}}, // 5514, depth=2 +{0xffefffffffefffff, 4981,{0xffff,0x02de}}, // 5515, depth=2 +{0x007fc000007fc000, 4985,{0xffff,0x0488}}, // 5516, depth=2 +{0xe01fffffe01fffff, 4986,{0xffff,0x00d7}}, // 5517, depth=2 +{0x000000007ffffe00, -1,{0x05d5,0x1dd5}}, // 5518, depth=1 +{0xfffffffe003fffff, -1,{0xffff,0x17f4}}, // 5519, depth=1 +{0x000fffffffff8000, -1,{0xffff,0x1c64}}, // 5520, depth=1 +{0xffffffffff000007, -1,{0xffff,0x1a2a}}, // 5521, depth=1 +{0x0001fffe00000000, -1,{0xffff,0x17cf}}, // 5522, depth=1 +{0x00000000fffe00ff, -1,{0x03d6,0xffff}}, // 5523, depth=1 +{0x00000001e0000000, -1,{0xffff,0x18c3}}, // 5524, depth=1 +{0xffff0007ffff0007, 4990,{0xffff,0x0412}}, // 5525, depth=3 +{0xfffffffffe3fffff, -1,{0xffff,0x19fc}}, // 5526 +{0xfffc000000003fff, -1,{0xffff,0x139b}}, // 5527, depth=1 +{0x00000007ffffc000, -1,{0xffff,0x1c94}}, // 5528, depth=1 +{0xffe0007fffffffff, 4997,{0xffff,0x12f1}}, // 5529, depth=2 +{0xffff80ffffff80ff, -1,{0xffff,0x0458}}, // 5530 +{0x3f3f3f3f3f3f3f3f, 5000,{0xffff,0x0035}}, // 5531, depth=2 +{0x00001fff80000000, -1,{0xffff,0x184d}}, // 5532, depth=1 +{0xffffffffc00001ff, -1,{0xffff,0x18aa}}, // 5533, depth=1 +{0x0001fffffe000000, -1,{0xffff,0x19d7}}, // 5534 +{0x83ffffff83ffffff, -1,{0xffff,0x005a}}, // 5535, depth=1 +{0xffe00000001fffff, 5538,{0xffff,0x12df}}, // 5536 +{0xffc00000000fffff, 5003,{0xffff,0x129d}}, // 5537, depth=2 +{0x00000000e000003f, -1,{0x00c8,0xffff}}, // 5538 +{0xc00000000000ffff, -1,{0xffff,0x1091}}, // 5539, depth=1 +{0x0000003fffffe000, 5011,{0xffff,0x1cd8}}, // 5540, depth=2 +{0xffffff000000001f, -1,{0xffff,0x161c}}, // 5541 +{0x3fffffffffe00000, -1,{0xffff,0x1ae8}}, // 5542 +{0x01ffffc000000000, 5549,{0xffff,0x1692}}, // 5543 +{0x000000003ffe0000, -1,{0x03cc,0x1bcc}}, // 5544, depth=1 +{0xffffffffff00001f, -1,{0xffff,0x1a2c}}, // 5545, depth=1 +{0x0000ffffe0000000, -1,{0xffff,0x18d2}}, // 5546, depth=1 +{0xfe3ffe3ffe3ffe3f, -1,{0xffff,0x01ec}}, // 5547, depth=1 +{0x01fff00001fff000, 5015,{0xffff,0x050c}}, // 5548, depth=2 +{0x0000000000c000c0, -1,{0x02a1,0xffff}}, // 5549 +{0xffff000fffffffff, 5555,{0xffff,0x1433}}, // 5550 +{0xffff00003fffffff, -1,{0xffff,0x142d}}, // 5551, depth=1 +{0x00000000003e003e, 5016,{0x03e4,0xffff}}, // 5552, depth=2 +{0xffffffff000000ff, 5017,{0xffff,0x1827}}, // 5553, depth=2 +{0x0c0000000c000000, -1,{0xffff,0x0181}}, // 5554, depth=1 +{0xfff8000007ffffff, -1,{0xffff,0x1367}}, // 5555 +{0x00000000003ffe00, 5020,{0x05cc,0x1dcc}}, // 5556, depth=2 +{0x00fffffffc000000, -1,{0xffff,0x199d}}, // 5557 +{0x0000000002000200, -1,{0x01e0,0xffff}}, // 5558, depth=1 +{0xffffff00ffffffff, -1,{0xffff,0x1637}}, // 5559, depth=1 +{0x0007fffffffc0000, -1,{0xffff,0x1ba0}}, // 5560, depth=1 +{0xffffc007ffffc007, -1,{0xffff,0x0494}}, // 5561 +{0xffffffffffe00fff, 5565,{0xffff,0x1af6}}, // 5562 +{0xfc007fffffffffff, -1,{0xffff,0x11b4}}, // 5563, depth=1 +{0x7ffffffffffffff8, -1,{0xffff,0x1f7b}}, // 5564, depth=1 +{0xffffff000000003f, -1,{0xffff,0x161d}}, // 5565 +{0x2000200020002000, 5024,{0xffff,0x00e0}}, // 5566, depth=2 +{0x000000003fffff80, -1,{0x0656,0x1e56}}, // 5567 +{0x00007fffffff0000, 5026,{0xffff,0x1c1e}}, // 5568, depth=2 +{0x807f807f807f807f, 5031,{0xffff,0x0067}}, // 5569, depth=2 +{0x003c0000003c0000, 5032,{0xffff,0x0383}}, // 5570, depth=3 +{0x00000000c7ffc7ff, 5036,{0x00ac,0xffff}}, // 5571, depth=2 +{0x8000000000000000, -1,{0xffff,0x1040}}, // 5572, depth=1 +{0xffc3ffffffc3ffff, 5041,{0xffff,0x029b}}, // 5573, depth=3 +{0x7f807f807f807f80, 5048,{0xffff,0x0267}}, // 5574, depth=2 +{0x8000000000000003, 5054,{0xffff,0x1042}}, // 5575, depth=2 +{0x00000000ffc00003, -1,{0x028b,0xffff}}, // 5576 +{0xdfffdfffdfffdfff, 5061,{0xffff,0x00ae}}, // 5577, depth=2 +{0x000000007fffffe0, -1,{0x06d9,0x1ed9}}, // 5578 +{0x8000000000000007, -1,{0xffff,0x1043}}, // 5579, depth=1 +{0x03ff800000000000, -1,{0xffff,0x144a}}, // 5580, depth=1 +{0x00000000fff807ff, -1,{0x0357,0xffff}}, // 5581, depth=1 +{0xffffffffe00003ff, -1,{0xffff,0x18ec}}, // 5582 +{0x00000000fc0ffc0f, 5062,{0x01a9,0xffff}}, // 5583, depth=2 +{0x000000ff00000000, -1,{0xffff,0x1807}}, // 5584, depth=1 +{0x00000000f8007fff, -1,{0x0153,0xffff}}, // 5585 +{0x003ffe0000000000, -1,{0xffff,0x15cc}}, // 5586 +{0x800000000000000f, 5063,{0xffff,0x1044}}, // 5587, depth=2 +{0xfffffffffff8ffff, -1,{0xffff,0x1b7c}}, // 5588 +{0xf3fffffff3ffffff, 5065,{0xffff,0x011d}}, // 5589, depth=2 +{0x000000001ffe0000, 5082,{0x03cb,0x1bcb}}, // 5590, depth=2 +{0x00000000ffffff01, 5087,{0x0618,0xffff}}, // 5591, depth=2 +{0x0000ffffc0000000, -1,{0xffff,0x1891}}, // 5592, depth=1 +{0x00000000ffffff03, -1,{0x0619,0xffff}}, // 5593, depth=1 +{0xfffff83ffffff83f, -1,{0xffff,0x055a}}, // 5594 +{0xfe000ffffe000fff, 5093,{0xffff,0x01d2}}, // 5595, depth=2 +{0x01c001c001c001c0, -1,{0xffff,0x02a2}}, // 5596, depth=1 +{0x00000000ffffff07, 5095,{0x061a,0xffff}}, // 5597, depth=2 +{0x0000000000ffffe0, -1,{0x06d2,0x1ed2}}, // 5598, depth=1 +{0x00000000e07fffff, 5096,{0x00d9,0xffff}}, // 5599, depth=2 +{0x00fffc0000fffc00, -1,{0xffff,0x058d}}, // 5600 +{0x0000000ffffffe00, -1,{0xffff,0x1dda}}, // 5601 +{0xfffffffcfffffffc, -1,{0xffff,0x079d}}, // 5602 +{0x800000000000001f, 5100,{0xffff,0x1045}}, // 5603, depth=2 +{0x3fffffffffff0000, -1,{0xffff,0x1c2d}}, // 5604, depth=1 +{0x00000000ffffff0f, -1,{0x061b,0xffff}}, // 5605, depth=1 +{0x0000000010101010, 5101,{0x0130,0xffff}}, // 5606, depth=3 +{0xfffffffcffffffff, 5609,{0xffff,0x17bd}}, // 5607 +{0x7c0000007c000000, -1,{0xffff,0x0184}}, // 5608, depth=1 +{0x800007ff800007ff, -1,{0xffff,0x004b}}, // 5609 +{0x000000003ffffe00, -1,{0x05d4,0x1dd4}}, // 5610, depth=1 +{0xffffe0007fffffff, -1,{0xffff,0x14f1}}, // 5611, depth=1 +{0xc0c0c0c0c0c0c0c0, 5104,{0xffff,0x00b1}}, // 5612, depth=2 +{0xff000003ffffffff, -1,{0xffff,0x1229}}, // 5613 +{0x0000000000fffff0, 5105,{0x0713,0x1f13}}, // 5614, depth=2 +{0xfffffff800003fff, -1,{0xffff,0x176a}}, // 5615, depth=1 +{0x0003ffffffffc000, -1,{0xffff,0x1ca3}}, // 5616, depth=1 +{0xf003ffffffffffff, -1,{0xffff,0x1135}}, // 5617 +{0x0000fff80000fff8, 5111,{0xffff,0x074c}}, // 5618, depth=3 +{0xfffffffe1fffffff, -1,{0xffff,0x17fb}}, // 5619, depth=1 +{0xffffffffc00003ff, 5631,{0xffff,0x18ab}}, // 5620 +{0x00000000ffffff1f, 5116,{0x061c,0xffff}}, // 5621, depth=2 +{0x0000000000fffff8, -1,{0x0754,0x1f54}}, // 5622, depth=1 +{0xfff0000000007fff, -1,{0xffff,0x131a}}, // 5623, depth=1 +{0x00000001ffc00000, -1,{0xffff,0x1a8a}}, // 5624, depth=1 +{0xffffffff800001ff, -1,{0xffff,0x1869}}, // 5625, depth=1 +{0x1fe000001fe00000, 5120,{0xffff,0x02c7}}, // 5626, depth=2 +{0xff803fffff803fff, 5126,{0xffff,0x0256}}, // 5627, depth=2 +{0x0010000000100000, 5127,{0xffff,0x0300}}, // 5628, depth=2 +{0x0000000000ffffff, 5133,{0x0017,0x1017}}, // 5629, depth=2 +{0x0000000001000000, 5134,{0x0200,0x1a00}}, // 5630, depth=2 +{0xf8001fffffffffff, -1,{0xffff,0x1171}}, // 5631 +{0x00fffe0000000000, -1,{0xffff,0x15ce}}, // 5632, depth=1 +{0x00000000003ffff0, -1,{0x0711,0x1f11}}, // 5633 +{0xfffc3fffffffffff, -1,{0xffff,0x13bb}}, // 5634 +{0x800000000000003f, 5135,{0xffff,0x1046}}, // 5635, depth=2 +{0x003f8000003f8000, -1,{0xffff,0x0446}}, // 5636, depth=1 +{0x007fffffffffe000, -1,{0xffff,0x1ce9}}, // 5637 +{0xffffff000000007f, -1,{0xffff,0x161e}}, // 5638 +{0xffff800003ffffff, -1,{0xffff,0x146a}}, // 5639 +{0x0000000001c001c0, 5136,{0x02a2,0xffff}}, // 5640, depth=2 +{0xffffffffff00007f, -1,{0xffff,0x1a2e}}, // 5641, depth=1 +{0x3ffc000000000000, -1,{0xffff,0x138b}}, // 5642, depth=1 +{0xfffeffffffffffff, -1,{0xffff,0x13fe}}, // 5643, depth=1 +{0xffff000000000000, -1,{0xffff,0x140f}}, // 5644, depth=1 +{0x81ffffff81ffffff, 5140,{0xffff,0x0059}}, // 5645, depth=4 +{0x1010101010101010, 5153,{0xffff,0x0130}}, // 5646, depth=2 +{0xf80007fff80007ff, 5156,{0xffff,0x014f}}, // 5647, depth=2 +{0x000000003fffffc0, -1,{0x0697,0x1e97}}, // 5648 +{0xffffe000003fffff, -1,{0xffff,0x14e8}}, // 5649, depth=1 +{0x0000fc000000fc00, 5157,{0xffff,0x0585}}, // 5650, depth=2 +{0xffff000000000007, 5158,{0xffff,0x1412}}, // 5651, depth=2 +{0x00000000f800f800, 5163,{0x0164,0xffff}}, // 5652, depth=3 +{0x00000000ffffff3f, 5172,{0x061d,0xffff}}, // 5653, depth=2 +{0x000000000000c000, -1,{0x0481,0x1c81}}, // 5654, depth=1 +{0xffc00003ffffffff, -1,{0xffff,0x12ab}}, // 5655, depth=1 +{0x000000001ffffe00, 5178,{0x05d3,0x1dd3}}, // 5656, depth=2 +{0x000ffffffffc0000, 5658,{0xffff,0x1ba1}}, // 5657 +{0x00000001ff000000, -1,{0xffff,0x1a08}}, // 5658 +{0xffff00000000000f, -1,{0xffff,0x1413}}, // 5659, depth=1 +{0x07fe000000000000, -1,{0xffff,0x13c9}}, // 5660, depth=1 +{0xffcfffcfffcfffcf, -1,{0xffff,0x02ad}}, // 5661, depth=1 +{0x3ffffc003ffffc00, 5183,{0xffff,0x0593}}, // 5662, depth=2 +{0xfffffffdfffffffd, 5187,{0xffff,0x079e}}, // 5663, depth=2 +{0x7fffffffc0000000, -1,{0xffff,0x18a0}}, // 5664, depth=1 +{0xff03ff03ff03ff03, 5193,{0xffff,0x0229}}, // 5665, depth=2 +{0x00000000007fff00, 5195,{0x060e,0x1e0e}}, // 5666, depth=2 +{0xfffc000000000fff, 5197,{0xffff,0x1399}}, // 5667, depth=2 +{0x1ffffffffe000000, -1,{0xffff,0x19e3}}, // 5668, depth=1 +{0xfffffffe00000003, -1,{0xffff,0x17e0}}, // 5669, depth=1 +{0x00000000fc000fff, -1,{0x0191,0xffff}}, // 5670 +{0xfffffefffffffeff, 5198,{0xffff,0x05de}}, // 5671, depth=2 +{0x0000000000038000, 5199,{0x0442,0x1c42}}, // 5672, depth=2 +{0xffffffc0000007ff, 5204,{0xffff,0x16a4}}, // 5673, depth=2 +{0x0007ffe000000000, -1,{0xffff,0x16cd}}, // 5674 +{0xffff00000000001f, 5207,{0xffff,0x1414}}, // 5675, depth=2 +{0x000ffffff8000000, -1,{0xffff,0x1958}}, // 5676, depth=1 +{0xfffe0000007fffff, 5678,{0xffff,0x13e5}}, // 5677 +{0xdfdfdfdfdfdfdfdf, -1,{0xffff,0x00b6}}, // 5678 +{0xfffffe01fffffe01, -1,{0xffff,0x05d7}}, // 5679, depth=1 +{0x0ffffffe0ffffffe, -1,{0xffff,0x07da}}, // 5680 +{0xfffffffe0000000f, -1,{0xffff,0x17e2}}, // 5681, depth=1 +{0x000000000e0e0e0e, -1,{0x01f2,0xffff}}, // 5682, depth=1 +{0x00003ffffff00000, -1,{0xffff,0x1b19}}, // 5683 +{0x0000ffff80000000, -1,{0xffff,0x1850}}, // 5684, depth=1 +{0x8007ffffffffffff, -1,{0xffff,0x1073}}, // 5685 +{0x0fffff000fffff00, -1,{0xffff,0x0613}}, // 5686 +{0xfc000007ffffffff, -1,{0xffff,0x11a8}}, // 5687 +{0x1ff81ff81ff81ff8, -1,{0xffff,0x0369}}, // 5688, depth=1 +{0xfe7fffffffffffff, -1,{0xffff,0x11fd}}, // 5689, depth=1 +{0x000001fc00000000, -1,{0xffff,0x1786}}, // 5690, depth=1 +{0xffffffff8001ffff, -1,{0xffff,0x1871}}, // 5691, depth=1 +{0x0007fffffffffc00, -1,{0xffff,0x1da8}}, // 5692, depth=1 +{0x0000ffffff000000, -1,{0xffff,0x1a17}}, // 5693 +{0x00007ff800000000, 5210,{0xffff,0x174b}}, // 5694, depth=2 +{0x1ffffffffff00000, -1,{0xffff,0x1b28}}, // 5695 +{0xffffffffff01ffff, 5698,{0xffff,0x1a38}}, // 5696 +{0xfffffffe0000001f, -1,{0xffff,0x17e3}}, // 5697, depth=1 +{0x00000000ff3fff3f, -1,{0x022d,0xffff}}, // 5698 +{0xf1fffffff1ffffff, 5217,{0xffff,0x011c}}, // 5699, depth=4 +{0x6666666666666666, -1,{0xffff,0x00f9}}, // 5700, depth=1 +{0x0fffffff0fffffff, 5232,{0xffff,0x001b}}, // 5701, depth=2 +{0x00003f8000003f80, -1,{0xffff,0x0646}}, // 5702, depth=1 +{0xffffe0003fffffff, -1,{0xffff,0x14f0}}, // 5703, depth=1 +{0x07fffffc00000000, -1,{0xffff,0x1798}}, // 5704, depth=1 +{0xfc000ffffc000fff, -1,{0xffff,0x0191}}, // 5705, depth=1 +{0xfe0003ffffffffff, -1,{0xffff,0x11f0}}, // 5706 +{0xffff00000000003f, -1,{0xffff,0x1415}}, // 5707, depth=1 +{0x0000000007fff800, -1,{0x054f,0x1d4f}}, // 5708, depth=1 +{0xfffffffffdffffff, -1,{0xffff,0x19be}}, // 5709 +{0x0000001ffffc0000, -1,{0xffff,0x1b92}}, // 5710, depth=1 +{0xf800000ff800000f, -1,{0xffff,0x0148}}, // 5711, depth=1 +{0xfffffffffe000000, -1,{0xffff,0x19e6}}, // 5712 +{0x00000000fffc03ff, 5234,{0x0397,0xffff}}, // 5713, depth=2 +{0x0fff800000000000, -1,{0xffff,0x144c}}, // 5714, depth=1 +{0xffffffffffc003ff, 5724,{0xffff,0x1ab3}}, // 5715 +{0x03fff80003fff800, 5235,{0xffff,0x054e}}, // 5716, depth=2 +{0x00000000ffffff7f, 5239,{0x061e,0xffff}}, // 5717, depth=2 +{0x00000000ffffff80, 5243,{0x0658,0x1e58}}, // 5718, depth=2 +{0x00000000ffffff81, 5245,{0x0659,0xffff}}, // 5719, depth=2 +{0x007ffffffff80000, -1,{0xffff,0x1b63}}, // 5720, depth=1 +{0x00000000ffffff83, -1,{0x065a,0xffff}}, // 5721, depth=1 +{0x0000000001800180, 5247,{0x0261,0xffff}}, // 5722, depth=2 +{0xfe00001ffe00001f, 5250,{0xffff,0x01cb}}, // 5723, depth=2 +{0xfffffffffe000001, -1,{0xffff,0x19e7}}, // 5724 +{0x00000000ffffff87, -1,{0x065b,0xffff}}, // 5725, depth=1 +{0x0020002000200020, -1,{0xffff,0x02e0}}, // 5726, depth=1 +{0xfffffffffe000003, -1,{0xffff,0x19e8}}, // 5727 +{0x1800180018001800, -1,{0xffff,0x0161}}, // 5728, depth=1 +{0xfffffffe0000003f, -1,{0xffff,0x17e4}}, // 5729, depth=1 +{0x3ffffff800000000, 5252,{0xffff,0x175a}}, // 5730, depth=2 +{0x0001ffff0001ffff, 5254,{0xffff,0x0010}}, // 5731, depth=2 +{0xfffffc000000ffff, 5735,{0xffff,0x15a5}}, // 5732 +{0x00000000ffffff8f, 5255,{0x065c,0xffff}}, // 5733, depth=2 +{0xffe00000ffe00000, -1,{0xffff,0x02ca}}, // 5734, depth=1 +{0xe00fffffe00fffff, -1,{0xffff,0x00d6}}, // 5735 +{0x000000001fffffc0, -1,{0x0696,0x1e96}}, // 5736 +{0x00000000807fffff, 5257,{0x0057,0xffff}}, // 5737, depth=3 +{0x0000007ff0000000, -1,{0xffff,0x190a}}, // 5738, depth=1 +{0xfffffffffe000007, -1,{0xffff,0x19e9}}, // 5739 +{0x000000003ffffff0, -1,{0x0719,0x1f19}}, // 5740 +{0xfffff03ffffff03f, 5260,{0xffff,0x0519}}, // 5741, depth=2 +{0xffffe00fffffffff, 5744,{0xffff,0x14f6}}, // 5742 +{0xf800000001ffffff, 5261,{0xffff,0x115d}}, // 5743, depth=2 +{0xfffe000ffffe000f, -1,{0xffff,0x03d2}}, // 5744 +{0x00000000e03fffff, -1,{0x00d8,0xffff}}, // 5745, depth=1 +{0x7ffffffe7ffffffe, -1,{0xffff,0x07dd}}, // 5746 +{0xff3fffffff3fffff, -1,{0xffff,0x021d}}, // 5747, depth=1 +{0x003fc00000000000, -1,{0xffff,0x1487}}, // 5748, depth=1 +{0x00000000ffffff9f, 5266,{0x065d,0xffff}}, // 5749, depth=2 +{0x0007fff80007fff8, -1,{0xffff,0x074f}}, // 5750, depth=1 +{0xfffffffffffc1fff, -1,{0xffff,0x1bba}}, // 5751, depth=1 +{0xfff8000000007fff, -1,{0xffff,0x135b}}, // 5752 +{0xfffffffffe00001f, -1,{0xffff,0x19eb}}, // 5753 +{0x00fffffffffff000, -1,{0xffff,0x1d2b}}, // 5754, depth=1 +{0x7fffffff7fffffff, 5270,{0xffff,0x001e}}, // 5755, depth=2 +{0x7fffffff80000000, -1,{0xffff,0x185f}}, // 5756, depth=1 +{0xfffffe0001ffffff, -1,{0xffff,0x15ef}}, // 5757, depth=1 +{0x000000000c0c0c0c, -1,{0x01b1,0xffff}}, // 5758, depth=1 +{0xfffffff00003ffff, -1,{0xffff,0x172d}}, // 5759, depth=1 +{0x003ffffffffff000, -1,{0xffff,0x1d29}}, // 5760 +{0x000000001fffffe0, -1,{0x06d7,0x1ed7}}, // 5761 +{0x01fffff001fffff0, -1,{0xffff,0x0714}}, // 5762, depth=1 +{0xf00000000fffffff, -1,{0xffff,0x111f}}, // 5763, depth=1 +{0xffffffff800003ff, -1,{0xffff,0x186a}}, // 5764 +{0x0007fffffffe0000, 5766,{0xffff,0x1be1}}, // 5765 +{0x00000000ff800000, -1,{0x0248,0x1a48}}, // 5766 +{0xff80007fff80007f, -1,{0xffff,0x024f}}, // 5767 +{0x000000000001fc00, -1,{0x0586,0x1d86}}, // 5768, depth=1 +{0xffffffffff0000ff, -1,{0xffff,0x1a2f}}, // 5769, depth=1 +{0x00000001ff800000, -1,{0xffff,0x1a49}}, // 5770, depth=1 +{0xffff00000000007f, -1,{0xffff,0x1416}}, // 5771, depth=1 +{0x00000000ff800003, -1,{0x024a,0xffff}}, // 5772 +{0xfffe000000ffffff, -1,{0xffff,0x13e6}}, // 5773, depth=1 +{0x0800000008000000, 5272,{0xffff,0x0140}}, // 5774, depth=2 +{0xff003fffffffffff, -1,{0xffff,0x1235}}, // 5775, depth=1 +{0x0000000000c00000, 5273,{0x0281,0x1a81}}, // 5776, depth=2 +{0xe0001fffffffffff, -1,{0xffff,0x10ef}}, // 5777, depth=1 +{0x0000000007ffe000, -1,{0x04cd,0x1ccd}}, // 5778, depth=1 +{0xfffdfffffffdffff, 5274,{0xffff,0x039e}}, // 5779, depth=3 +{0xfffffff007ffffff, 5787,{0xffff,0x1736}}, // 5780 +{0xe7e7e7e7e7e7e7e7, 5278,{0xffff,0x00f5}}, // 5781, depth=3 +{0x0007fc000007fc00, 5281,{0xffff,0x0588}}, // 5782, depth=2 +{0xffc7ffc7ffc7ffc7, 5288,{0xffff,0x02ac}}, // 5783, depth=2 +{0x001fff00001fff00, 5290,{0xffff,0x060c}}, // 5784, depth=2 +{0x00000000ffffffc3, 5293,{0x069b,0xffff}}, // 5785, depth=2 +{0x003ff80000000000, -1,{0xffff,0x154a}}, // 5786, depth=1 +{0xff800000001fffff, -1,{0xffff,0x125d}}, // 5787 +{0x0c0c0c0c0c0c0c0c, 5300,{0xffff,0x01b1}}, // 5788, depth=2 +{0xffc001ffffc001ff, 5303,{0xffff,0x0292}}, // 5789, depth=3 +{0x0ffff00000000000, -1,{0xffff,0x150f}}, // 5790, depth=1 +{0x00000000c03fffff, 5312,{0x0097,0xffff}}, // 5791, depth=2 +{0x0000ffffff800000, -1,{0xffff,0x1a58}}, // 5792, depth=1 +{0xfff007fffff007ff, 5314,{0xffff,0x0316}}, // 5793, depth=2 +{0x00000000007fff80, -1,{0x064f,0x1e4f}}, // 5794, depth=1 +{0x00000000f01fffff, 5318,{0x0118,0xffff}}, // 5795, depth=2 +{0x0000000060006000, 5319,{0x00e1,0xffff}}, // 5796, depth=2 +{0x00000000ffffffcf, 5320,{0x069d,0xffff}}, // 5797, depth=2 +{0xfff003ffffffffff, -1,{0xffff,0x1335}}, // 5798 +{0xffffe00000000003, 5325,{0xffff,0x14d4}}, // 5799, depth=2 +{0x000000ffff000000, -1,{0xffff,0x1a0f}}, // 5800, depth=1 +{0xfffffffff0003fff, -1,{0xffff,0x1931}}, // 5801, depth=1 +{0x800000000001ffff, -1,{0xffff,0x1051}}, // 5802 +{0xffffe00000000007, -1,{0xffff,0x14d5}}, // 5803, depth=1 +{0x00000ffff0000000, -1,{0xffff,0x190f}}, // 5804, depth=1 +{0xffc00003ffc00003, 5328,{0xffff,0x028b}}, // 5805, depth=2 +{0xfe001ffffe001fff, -1,{0xffff,0x01d3}}, // 5806 +{0x0ffffffffff80000, -1,{0xffff,0x1b68}}, // 5807 +{0x000007e0000007e0, 5330,{0xffff,0x06c5}}, // 5808, depth=2 +{0xefffffffefffffff, 5336,{0xffff,0x00de}}, // 5809, depth=2 +{0x1ff01ff01ff01ff0, 5345,{0xffff,0x0328}}, // 5810, depth=2 +{0xffffe0000000000f, -1,{0xffff,0x14d6}}, // 5811, depth=1 +{0x00000000003fff00, -1,{0x060d,0x1e0d}}, // 5812, depth=1 +{0x00000000ffffffdf, -1,{0x069e,0xffff}}, // 5813, depth=1 +{0x00000000ffffffe0, -1,{0x06da,0x1eda}}, // 5814, depth=1 +{0x00000000ffffffe1, -1,{0x06db,0xffff}}, // 5815, depth=1 +{0x00000000f000ffff, -1,{0x0113,0xffff}}, // 5816 +{0x00000000ffffffe3, 5356,{0x06dc,0xffff}}, // 5817, depth=2 +{0x000000001ffffff8, -1,{0x0759,0x1f59}}, // 5818 +{0xffffffe007ffffff, -1,{0xffff,0x16f5}}, // 5819, depth=1 +{0x0000003fffff8000, -1,{0xffff,0x1c56}}, // 5820, depth=1 +{0x00000000ffffffe7, 5371,{0x06dd,0xffff}}, // 5821, depth=2 +{0x07fffffffff00000, -1,{0xffff,0x1b26}}, // 5822, depth=1 +{0xfffe00007fffffff, -1,{0xffff,0x13ed}}, // 5823 +{0x001ffffffffff800, -1,{0xffff,0x1d69}}, // 5824 +{0x0003ffffffff0000, 5832,{0xffff,0x1c21}}, // 5825 +{0x000000001ff81ff8, 5376,{0x0369,0xffff}}, // 5826, depth=2 +{0x80000000000000ff, 5377,{0xffff,0x1048}}, // 5827, depth=2 +{0x7800000078000000, 5379,{0xffff,0x0143}}, // 5828, depth=2 +{0x00000000ffffffef, -1,{0x06de,0xffff}}, // 5829, depth=1 +{0x00000000fffffff0, -1,{0x071b,0x1f1b}}, // 5830, depth=1 +{0x00000000fffffff1, -1,{0x071c,0xffff}}, // 5831, depth=1 +{0x00000000ffe0ffe0, -1,{0x02ea,0xffff}}, // 5832 +{0xfc00001ffc00001f, 5382,{0xffff,0x018a}}, // 5833, depth=2 +{0x00c0000000000000, -1,{0xffff,0x1281}}, // 5834, depth=1 +{0xffffff003fffffff, -1,{0xffff,0x1635}}, // 5835, depth=1 +{0xffffffffc003ffff, -1,{0xffff,0x18b3}}, // 5836 +{0x00000000fffffff7, -1,{0x071e,0xffff}}, // 5837, depth=1 +{0x00000000fffffff8, -1,{0x075c,0x1f5c}}, // 5838, depth=1 +{0x000000ff000000ff, 5383,{0xffff,0x0007}}, // 5839, depth=3 +{0xffffff00000000ff, -1,{0xffff,0x161f}}, // 5840 +{0x00000000fffffffb, -1,{0x075e,0xffff}}, // 5841, depth=1 +{0x00000000fffffffc, 5390,{0x079d,0x1f9d}}, // 5842, depth=2 +{0x00000000fffffffd, -1,{0x079e,0xffff}}, // 5843, depth=1 +{0x00000000fffffffe, -1,{0x07de,0x1fde}}, // 5844, depth=1 +{0x00000000ffffffff, -1,{0xffff,0x101f}}, // 5845, depth=1 +{0x007e007e007e007e, 5391,{0xffff,0x03e5}}, // 5846, depth=2 +{0x0000000100000001, 5398,{0xffff,0x0000}}, // 5847, depth=2 +{0x0018001800180018, -1,{0xffff,0x0361}}, // 5848, depth=1 +{0xfe00000000001fff, -1,{0xffff,0x11d3}}, // 5849, depth=1 +{0x000ffffffffffc00, -1,{0xffff,0x1da9}}, // 5850 +{0xffffffffffe03fff, -1,{0xffff,0x1af8}}, // 5851, depth=1 +{0x00000000001f0000, -1,{0x0404,0x1c04}}, // 5852, depth=1 +{0xfffc0000000fffff, 5855,{0xffff,0x13a1}}, // 5853 +{0x00000fffffe00000, -1,{0xffff,0x1ad6}}, // 5854, depth=1 +{0xff8000000fffffff, -1,{0xffff,0x1264}}, // 5855 +{0x3f0000003f000000, 5399,{0xffff,0x0205}}, // 5856, depth=2 +{0xfff0000ffff0000f, -1,{0xffff,0x030f}}, // 5857, depth=1 +{0x00000000007fffc0, -1,{0x0690,0x1e90}}, // 5858, depth=1 +{0xffffe0000000003f, -1,{0xffff,0x14d8}}, // 5859, depth=1 +{0xffffff8003ffffff, -1,{0xffff,0x1672}}, // 5860 +{0xff807fffffffffff, -1,{0xffff,0x1277}}, // 5861, depth=1 +{0x0007fffffffffe00, -1,{0xffff,0x1de9}}, // 5862 +{0xfc0000000000ffff, -1,{0xffff,0x1195}}, // 5863 +{0x0000000000007800, 5401,{0x0543,0x1d43}}, // 5864, depth=2 +{0xfffff00000003fff, -1,{0xffff,0x1521}}, // 5865 +{0x000000003fffff00, -1,{0x0615,0x1e15}}, // 5866, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5867 +{0x0000ffff00000000, -1,{0xffff,0x180f}}, // 5868, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5869 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5870 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5871 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5872 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5873 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5874 +{0xffffffff0001ffff, -1,{0xffff,0x1830}}, // 5875, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5876 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5877 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5878 +{0xfe1fffffffffffff, -1,{0xffff,0x11fb}}, // 5879, depth=1 +{0x00007ffff0000000, -1,{0xffff,0x1912}}, // 5880, depth=1 +{0xffffff001fffffff, -1,{0xffff,0x1634}}, // 5881, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5882 +{0x00000000001f001f, 5403,{0x0024,0xffff}}, // 5883, depth=2 +{0x0600000006000000, -1,{0xffff,0x01c1}}, // 5884, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5885 +{0x0000000001000100, -1,{0x0220,0xffff}}, // 5886, depth=1 +{0xfffc00fffffc00ff, -1,{0xffff,0x0395}}, // 5887, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5888 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5889 +{0x1000100010001000, 5404,{0xffff,0x0120}}, // 5890, depth=2 +{0x00000000dfffffff, -1,{0x009e,0xffff}}, // 5891, depth=1 +{0x00000000e0000000, 5407,{0x00c2,0x18c2}}, // 5892, depth=2 +{0x00000000e0000001, -1,{0x00c3,0xffff}}, // 5893, depth=1 +{0x3fc03fc03fc03fc0, 5411,{0xffff,0x02a7}}, // 5894, depth=2 +{0x00000000e0000003, 5416,{0x00c4,0xffff}}, // 5895, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5896 +{0x8000000fffffffff, 5418,{0xffff,0x1064}}, // 5897, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5898 +{0x00000000e0000007, 5419,{0x00c5,0xffff}}, // 5899, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5900 +{0xcfffcfffcfffcfff, -1,{0xffff,0x00ad}}, // 5901, depth=1 +{0x000000000fff0000, 5422,{0x040b,0x1c0b}}, // 5902, depth=2 +{0xfff0000000001fff, -1,{0xffff,0x1318}}, // 5903, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5904 +{0xffbfffbfffbfffbf, -1,{0xffff,0x026e}}, // 5905, depth=1 +{0x00000000007ffff0, -1,{0x0712,0x1f12}}, // 5906, depth=1 +{0x00000000e000000f, 5428,{0x00c6,0xffff}}, // 5907, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5908 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5909 +{0x0000000008080808, 5431,{0x0170,0xffff}}, // 5910, depth=3 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5911 +{0x000000001fffff00, -1,{0x0614,0x1e14}}, // 5912, depth=1 +{0xf80000ffffffffff, -1,{0xffff,0x116c}}, // 5913, depth=1 +{0x00000000007ffff8, 5437,{0x0753,0x1f53}}, // 5914, depth=2 +{0x00000000ffffe7ff, -1,{0x04dd,0xffff}}, // 5915, depth=1 +{0x00007ffc00007ffc, 5447,{0xffff,0x078c}}, // 5916, depth=3 +{0xff000000000fffff, -1,{0xffff,0x121b}}, // 5917, depth=1 +{0x00000000007ffffc, -1,{0x0794,0x1f94}}, // 5918, depth=1 +{0xfe000000000007ff, -1,{0xffff,0x11d1}}, // 5919, depth=1 +{0x0ff000000ff00000, 5450,{0xffff,0x0307}}, // 5920, depth=2 +{0x00000000007fffff, 5456,{0x0016,0x1016}}, // 5921, depth=3 +{0x0000000000800000, 5458,{0x0240,0x1a40}}, // 5922, depth=2 +{0x00000000e000001f, 5460,{0x00c7,0xffff}}, // 5923, depth=4 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5924 +{0xf8000ffff8000fff, 5466,{0xffff,0x0150}}, // 5925, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5926 +{0x81ff81ff81ff81ff, 5469,{0xffff,0x0069}}, // 5927, depth=3 +{0x1ffe000000000000, 5485,{0xffff,0x13cb}}, // 5928, depth=2 +{0xe000ffffffffffff, 5486,{0xffff,0x10f2}}, // 5929, depth=2 +{0x0808080808080808, 5495,{0xffff,0x0170}}, // 5930, depth=2 +{0xffffff0000000003, -1,{0xffff,0x1619}}, // 5931, depth=1 +{0x00007e0000007e00, 5504,{0xffff,0x05c5}}, // 5932, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5933 +{0x0000000000006000, -1,{0x04c1,0x1cc1}}, // 5934, depth=1 +{0xffffff0000000007, -1,{0xffff,0x161a}}, // 5935, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5936 +{0x00000000bfffffff, 5505,{0x005e,0xffff}}, // 5937, depth=3 +{0x00000000c0000000, 5509,{0x0081,0x1881}}, // 5938, depth=2 +{0x00000000c0000001, -1,{0x0082,0xffff}}, // 5939, depth=1 +{0x00000000003fff80, 5510,{0x064e,0x1e4e}}, // 5940, depth=2 +{0x00000000c0000003, 5512,{0x0083,0xffff}}, // 5941, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5942 +{0xffffff000000000f, -1,{0xffff,0x161b}}, // 5943, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5944 +{0x00000000c0000007, -1,{0x0084,0xffff}}, // 5945, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5946 +{0xe00000ffe00000ff, -1,{0xffff,0x00ca}}, // 5947, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5948 +{0xf0000007ffffffff, -1,{0xffff,0x1126}}, // 5949, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5950 +{0xffffc3ffffffc3ff, 5526,{0xffff,0x049b}}, // 5951, depth=2 +{0x000000fe00000000, -1,{0xffff,0x17c6}}, // 5952, depth=1 +{0x00000000c000000f, 5530,{0x0085,0xffff}}, // 5953, depth=2 +{0x00003ffc00000000, 5534,{0xffff,0x178b}}, // 5954, depth=2 +{0xe0000001e0000001, 5536,{0xffff,0x00c3}}, // 5955, depth=3 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5956 +{0x3333333333333333, -1,{0xffff,0x0039}}, // 5957, depth=1 +{0x00001fc000001fc0, -1,{0xffff,0x0686}}, // 5958, depth=1 +{0xffc0000001ffffff, 5541,{0xffff,0x12a2}}, // 5959, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5960 +{0xffff8001ffff8001, -1,{0xffff,0x0451}}, // 5961, depth=1 +{0x0000000ffffe0000, -1,{0xffff,0x1bd2}}, // 5962, depth=1 +{0xfffff801ffffffff, -1,{0xffff,0x1575}}, // 5963, depth=1 +{0x07ffc00000000000, -1,{0xffff,0x148c}}, // 5964, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5965 +{0x000000007fffffc0, 5542,{0x0698,0x1e98}}, // 5966, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5967 +{0x00000000aaaaaaaa, 5543,{0x007c,0xffff}}, // 5968, depth=3 +{0x00000000c000001f, 5550,{0x0086,0xffff}}, // 5969, depth=3 +{0x0010001000100010, -1,{0xffff,0x0320}}, // 5970, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5971 +{0x1ffffffc00000000, 5557,{0xffff,0x179a}}, // 5972, depth=2 +{0xfff00000000007ff, -1,{0xffff,0x1316}}, // 5973, depth=1 +{0x7ff000007ff00000, -1,{0xffff,0x030a}}, // 5974, depth=1 +{0xffffffe000007fff, -1,{0xffff,0x16e9}}, // 5975, depth=1 +{0x0000003ff8000000, -1,{0xffff,0x194a}}, // 5976, depth=1 +{0xfffffc07ffffffff, -1,{0xffff,0x15b8}}, // 5977, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5978 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5979 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5980 +{0xc00fc00fc00fc00f, -1,{0xffff,0x00a5}}, // 5981, depth=1 +{0x0003fffc0003fffc, -1,{0xffff,0x078f}}, // 5982, depth=1 +{0x000000009fffffff, 5561,{0x005d,0xffff}}, // 5983, depth=2 +{0x007ffffffffff800, -1,{0xffff,0x1d6b}}, // 5984, depth=1 +{0x00000000ffffcfff, -1,{0x049d,0xffff}}, // 5985, depth=1 +{0x0000000006060606, -1,{0x01f1,0xffff}}, // 5986, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5987 +{0x00fffff800fffff8, -1,{0xffff,0x0754}}, // 5988, depth=1 +{0xfffe0000ffffffff, -1,{0xffff,0x13ee}}, // 5989, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 5990 +{0x00000000ffbfffff, 5562,{0x025e,0xffff}}, // 5991, depth=3 +{0x00000000ffc00000, -1,{0x0289,0x1a89}}, // 5992, depth=1 +{0x00000000ffc00001, -1,{0x028a,0xffff}}, // 5993, depth=1 +{0x0400000004000000, 5567,{0xffff,0x0180}}, // 5994, depth=2 +{0x000fffff000fffff, 5576,{0xffff,0x0013}}, // 5995, depth=2 +{0x0000000003fff000, -1,{0x050d,0x1d0d}}, // 5996, depth=1 +{0x00000000fbfbfbfb, -1,{0x0176,0xffff}}, // 5997, depth=1 +{0x0003fe000003fe00, 5578,{0xffff,0x05c8}}, // 5998, depth=2 +{0x00000000ffc00007, 5582,{0x028c,0xffff}}, // 5999, depth=2 +{0x001ffc0000000000, -1,{0xffff,0x158a}}, // 6000, depth=1 +{0x00000000c000003f, 5585,{0x0087,0xffff}}, // 6001, depth=2 +{0x07fff80000000000, -1,{0xffff,0x154f}}, // 6002, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6003 +{0x00000000003fffc0, -1,{0x068f,0x1e8f}}, // 6004, depth=1 +{0xffe000000fffffff, -1,{0xffff,0x12e6}}, // 6005, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6006 +{0x00000000ffc0000f, -1,{0x028d,0xffff}}, // 6007, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6008 +{0x00000000ff7fff7f, -1,{0x022e,0xffff}}, // 6009, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6010 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6011 +{0x0ff80ff80ff80ff8, 5586,{0xffff,0x0368}}, // 6012, depth=2 +{0xffffff0fffffff0f, 5588,{0xffff,0x061b}}, // 6013, depth=2 +{0x000000007ffffff0, -1,{0x071a,0x1f1a}}, // 6014, depth=1 +{0xfffc07ffffffffff, -1,{0xffff,0x13b8}}, // 6015, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6016 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6017 +{0x03fffffffff80000, -1,{0xffff,0x1b66}}, // 6018, depth=1 +{0x00000000e000007f, 5594,{0x00c9,0xffff}}, // 6019, depth=2 +{0x000000000ffc0ffc, 5600,{0x03a9,0xffff}}, // 6020, depth=2 +{0xc000000003ffffff, -1,{0xffff,0x109b}}, // 6021, depth=1 +{0x000000007ffffff8, -1,{0x075b,0x1f5b}}, // 6022, depth=1 +{0x00000000ffc0001f, -1,{0x028e,0xffff}}, // 6023, depth=1 +{0x0060000000000000, -1,{0xffff,0x12c1}}, // 6024, depth=1 +{0xffffffffff0001ff, -1,{0xffff,0x1a30}}, // 6025, depth=1 +{0x000000007ffffffc, -1,{0x079c,0x1f9c}}, // 6026, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6027 +{0x000000007ffffffe, 5601,{0x07dd,0x1fdd}}, // 6028, depth=2 +{0x000000007fffffff, -1,{0x001e,0x101e}}, // 6029, depth=1 +{0x0000000080000000, 5602,{0x0040,0x1840}}, // 6030, depth=2 +{0x0000000080000001, -1,{0x0041,0xffff}}, // 6031, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6032 +{0x0000000080000003, 5607,{0x0042,0xffff}}, // 6033, depth=3 +{0x000007fffff00000, -1,{0xffff,0x1b16}}, // 6034, depth=1 +{0xfe1ffe1ffe1ffe1f, 5613,{0xffff,0x01eb}}, // 6035, depth=2 +{0x00000000003fffe0, -1,{0x06d0,0x1ed0}}, // 6036, depth=1 +{0x0000000080000007, 5617,{0x0043,0xffff}}, // 6037, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6038 +{0x00000000f003f003, -1,{0x0125,0xffff}}, // 6039, depth=1 +{0x000000001fffff80, -1,{0x0655,0x1e55}}, // 6040, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6041 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6042 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6043 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6044 +{0x000000008000000f, 5620,{0x0044,0xffff}}, // 6045, depth=3 +{0xfffffe00fffffe00, -1,{0xffff,0x05d6}}, // 6046, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6047 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6048 +{0xfffffffffffe7fff, -1,{0xffff,0x1bfd}}, // 6049, depth=1 +{0x0000000000800080, -1,{0x0260,0xffff}}, // 6050, depth=1 +{0xffffe000000000ff, -1,{0xffff,0x14da}}, // 6051, depth=1 +{0x0800080008000800, 5633,{0xffff,0x0160}}, // 6052, depth=2 +{0xf800001ff800001f, 5634,{0xffff,0x0149}}, // 6053, depth=2 +{0x1fe01fe01fe01fe0, 5637,{0xffff,0x02e7}}, // 6054, depth=2 +{0x00000000ffc0003f, 5638,{0x028f,0xffff}}, // 6055, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6056 +{0xfffe07fffffe07ff, 5639,{0xffff,0x03d9}}, // 6057, depth=2 +{0x0000000007ff8000, 5648,{0x044b,0x1c4b}}, // 6058, depth=2 +{0xe000000000ffffff, -1,{0xffff,0x10da}}, // 6059, depth=1 +{0x00000000003ffff8, -1,{0x0752,0x1f52}}, // 6060, depth=1 +{0x000000008000001f, -1,{0x0045,0xffff}}, // 6061, depth=1 +{0x0000000004040404, 5657,{0x01b0,0xffff}}, // 6062, depth=3 +{0xc7ffc7ffc7ffc7ff, 5670,{0xffff,0x00ac}}, // 6063, depth=2 +{0x00000000003ffffc, 5674,{0x0793,0x1f93}}, // 6064, depth=2 +{0x00000000c000007f, 5677,{0x0088,0xffff}}, // 6065, depth=3 +{0x00000000003ffffe, -1,{0x07d4,0x1fd4}}, // 6066, depth=1 +{0x00000000003fffff, -1,{0x0015,0x1015}}, // 6067, depth=1 +{0x0000000000400000, 5680,{0x0280,0x1a80}}, // 6068, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6069 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6070 +{0xfff00ffffff00fff, -1,{0xffff,0x0317}}, // 6071, depth=1 +{0x0404040404040404, 5683,{0xffff,0x01b0}}, // 6072, depth=2 +{0x00000000f9f9f9f9, 5685,{0x0175,0xffff}}, // 6073, depth=2 +{0x0000000000003000, -1,{0x0501,0x1d01}}, // 6074, depth=1 +{0xf00000000000ffff, -1,{0xffff,0x1113}}, // 6075, depth=1 +{0x0000000060000000, 5686,{0x00c1,0x18c1}}, // 6076, depth=2 +{0xffffc00000ffffff, -1,{0xffff,0x14a9}}, // 6077, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6078 +{0xff01ffffffffffff, -1,{0xffff,0x1238}}, // 6079, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6080 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6081 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6082 +{0x80000000000001ff, 5687,{0xffff,0x1049}}, // 6083, depth=2 +{0x00001ffe00000000, 5693,{0xffff,0x17cb}}, // 6084, depth=2 +{0xff80ffffff80ffff, -1,{0xffff,0x0258}}, // 6085, depth=1 +{0x00000fe000000fe0, -1,{0xffff,0x06c6}}, // 6086, depth=1 +{0xf00007fff00007ff, -1,{0xffff,0x010e}}, // 6087, depth=1 +{0x00000007ffff0000, -1,{0xffff,0x1c12}}, // 6088, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6089 +{0x000000003fffffe0, 5695,{0x06d8,0x1ed8}}, // 6090, depth=2 +{0x0000000055555555, 5696,{0x003c,0xffff}}, // 6091, depth=3 +{0x0008000800080008, -1,{0xffff,0x0360}}, // 6092, depth=1 +{0x000000008000003f, 5706,{0x0046,0xffff}}, // 6093, depth=2 +{0x3ff800003ff80000, -1,{0xffff,0x034a}}, // 6094, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6095 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6096 +{0x8000000f8000000f, 5709,{0xffff,0x0044}}, // 6097, depth=2 +{0x0001fffe0001fffe, 5712,{0xffff,0x07cf}}, // 6098, depth=2 +{0xc000000000003fff, 5715,{0xffff,0x108f}}, // 6099, depth=3 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6100 +{0xffdfffffffdfffff, 5727,{0xffff,0x029e}}, // 6101, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6102 +{0xc007c007c007c007, 5732,{0xffff,0x00a4}}, // 6103, depth=3 +{0x0200000002000000, 5736,{0xffff,0x01c0}}, // 6104, depth=2 +{0xc03fffffc03fffff, 5739,{0xffff,0x0097}}, // 6105, depth=2 +{0x0001ff000001ff00, 5740,{0xffff,0x0608}}, // 6106, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6107 +{0x03fffc0000000000, -1,{0xffff,0x158f}}, // 6108, depth=1 +{0xfffffffc007fffff, -1,{0xffff,0x17b4}}, // 6109, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6110 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6111 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6112 +{0xfffffffffe00000f, -1,{0xffff,0x19ea}}, // 6113, depth=1 +{0x000000003ffffff8, -1,{0x075a,0x1f5a}}, // 6114, depth=1 +{0xfffff80000ffffff, -1,{0xffff,0x156c}}, // 6115, depth=1 +{0x01fffffffffc0000, -1,{0xffff,0x1ba6}}, // 6116, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6117 +{0x000000003ffffffc, -1,{0x079b,0x1f9b}}, // 6118, depth=1 +{0x00000000ffc0007f, -1,{0x0290,0xffff}}, // 6119, depth=1 +{0x000000003ffffffe, -1,{0x07dc,0x1fdc}}, // 6120, depth=1 +{0x000000003fffffff, 5742,{0x001d,0x101d}}, // 6121, depth=3 +{0x0000000040000000, 5746,{0x0080,0x1880}}, // 6122, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6123 +{0x000003fffff80000, -1,{0xffff,0x1b56}}, // 6124, depth=1 +{0x00000000ffff9fff, 5752,{0x045d,0xffff}}, // 6125, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6126 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6127 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6128 +{0xffc000ffffffffff, 5753,{0xffff,0x12b1}}, // 6129, depth=2 +{0x7fffff007fffff00, -1,{0xffff,0x0616}}, // 6130, depth=1 +{0xffffffffe003ffff, -1,{0xffff,0x18f4}}, // 6131, depth=1 +{0x0000000000400040, -1,{0x02a0,0xffff}}, // 6132, depth=1 +{0xfffff00003ffffff, -1,{0xffff,0x152d}}, // 6133, depth=1 +{0x0ff00ff00ff00ff0, 5760,{0xffff,0x0327}}, // 6134, depth=2 +{0xffff800000003fff, -1,{0xffff,0x145e}}, // 6135, depth=1 +{0x0000000003ffc000, 5761,{0x048b,0x1c8b}}, // 6136, depth=2 +{0x00000000ff7fffff, 5764,{0x021e,0xffff}}, // 6137, depth=2 +{0x0000000002020202, 5765,{0x01f0,0xffff}}, // 6138, depth=3 +{0x00000000ff800001, 5767,{0x0249,0xffff}}, // 6139, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6140 +{0x07ffffff07ffffff, 5772,{0xffff,0x001a}}, // 6141, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6142 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6143 +{0x0000000000001800, -1,{0x0541,0x1d41}}, // 6144, depth=1 +{0x00000000ff800007, 5780,{0x024b,0xffff}}, // 6145, depth=3 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6146 +{0x00000000e00000ff, 5798,{0x00ca,0xffff}}, // 6147, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6148 +{0x00000000f7f7f7f7, 5802,{0x0136,0xffff}}, // 6149, depth=2 +{0x000007f0000007f0, -1,{0xffff,0x0706}}, // 6150, depth=1 +{0xf000000ff000000f, 5806,{0xffff,0x0107}}, // 6151, depth=2 +{0x000000001ffffff0, 5807,{0x0718,0x1f18}}, // 6152, depth=2 +{0x00000000ff80000f, -1,{0x024c,0xffff}}, // 6153, depth=1 +{0x1ffc00001ffc0000, -1,{0xffff,0x038a}}, // 6154, depth=1 +{0xffff0000000001ff, -1,{0xffff,0x1418}}, // 6155, depth=1 +{0x7fffffffff000000, -1,{0xffff,0x1a26}}, // 6156, depth=1 +{0x000000008000007f, 5816,{0x0047,0xffff}}, // 6157, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6158 +{0xc03fffffffffffff, -1,{0xffff,0x10b7}}, // 6159, depth=1 +{0x0000ff800000ff80, 5818,{0xffff,0x0648}}, // 6160, depth=2 +{0xfffffffffe00003f, -1,{0xffff,0x19ec}}, // 6161, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6162 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6163 +{0x000000001ffffffc, -1,{0x079a,0x1f9a}}, // 6164, depth=1 +{0xfc7ffc7ffc7ffc7f, -1,{0xffff,0x01ac}}, // 6165, depth=1 +{0x000000001ffffffe, -1,{0x07db,0x1fdb}}, // 6166, depth=1 +{0x000000001fffffff, -1,{0x001c,0x101c}}, // 6167, depth=1 +{0x0000000020000000, -1,{0x00c0,0x18c0}}, // 6168, depth=1 +{0x00000000ff80001f, -1,{0x024d,0xffff}}, // 6169, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6170 +{0xfc03ffffffffffff, -1,{0xffff,0x11b7}}, // 6171, depth=1 +{0x3fffff803fffff80, -1,{0xffff,0x0656}}, // 6172, depth=1 +{0x00000000fefffeff, 5823,{0x01ee,0xffff}}, // 6173, depth=2 +{0x07f807f807f807f8, 5824,{0xffff,0x0367}}, // 6174, depth=2 +{0xf8000001ffffffff, -1,{0xffff,0x1165}}, // 6175, depth=1 +{0x000000007fc00000, 5825,{0x0288,0x1a88}}, // 6176, depth=3 +{0xfffffffe000001ff, 5836,{0xffff,0x17e7}}, // 6177, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6178 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6179 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6180 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6181 +{0x000003f8000003f8, -1,{0xffff,0x0746}}, // 6182, depth=1 +{0xfe0000000007ffff, 5840,{0xffff,0x11d9}}, // 6183, depth=2 +{0x0ffe00000ffe0000, -1,{0xffff,0x03ca}}, // 6184, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6185 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6186 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6187 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6188 +{0xfffffe01ffffffff, -1,{0xffff,0x15f7}}, // 6189, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6190 +{0xffe00007ffffffff, -1,{0xffff,0x12ed}}, // 6191, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6192 +{0x00000000c00000ff, -1,{0x0089,0xffff}}, // 6193, depth=1 +{0x03fc03fc03fc03fc, 5850,{0xffff,0x03a7}}, // 6194, depth=2 +{0x00000000ffff87ff, 5853,{0x045b,0xffff}}, // 6195, depth=3 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6196 +{0xf800ffffffffffff, -1,{0xffff,0x1174}}, // 6197, depth=1 +{0x000001fc000001fc, -1,{0xffff,0x0786}}, // 6198, depth=1 +{0xfff0001ffff0001f, 5860,{0xffff,0x0310}}, // 6199, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6200 +{0x00000000ff80003f, -1,{0x024e,0xffff}}, // 6201, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6202 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6203 +{0x01fe01fe01fe01fe, 5862,{0xffff,0x03e7}}, // 6204, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6205 +{0x000000fe000000fe, -1,{0xffff,0x07c6}}, // 6206, depth=1 +{0x00000000ffe0ffff, -1,{0x02da,0xffff}}, // 6207, depth=1 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6208 +{0x00ff00ff00ff00ff, 5863,{0xffff,0x0027}}, // 6209, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6210 +{0xfffe0000003fffff, 5865,{0xffff,0x13e4}}, // 6211, depth=2 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6212 +{0xbaadf00dbaadf00d, -1,{0xffff,0xffff}}, // 6213 +}; +#endif // ARM64_INCLUDE_LOGICAL_IMMEDIATE_TABLE +// Average depth (hit): 1.73 +// Average depth (fail): 1.35 +// Maximum depth: 5 diff --git a/deps/chakrashim/core/lib/Backend/arm64/ARM64NeonEncoder.h b/deps/chakrashim/core/lib/Backend/arm64/ARM64NeonEncoder.h new file mode 100644 index 00000000000..cf21f6e1544 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/ARM64NeonEncoder.h @@ -0,0 +1,5022 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +// +// This file contains low-level emitter functions, where each emitter encodes +// exactly one VFP/Neon instruction. +// + +#pragma once + +typedef UCHAR NEON_REGISTER; + +class NeonRegisterParam +{ + static const UCHAR REGISTER_SHIFT = 0; + static const UCHAR REGISTER_MASK = 0xff; + static const ULONG REGISTER_MASK_SHIFTED = REGISTER_MASK << REGISTER_SHIFT; + + static const UCHAR SIZE_SHIFT = 8; + static const UCHAR SIZE_MASK = 0x07; + static const ULONG SIZE_MASK_SHIFTED = SIZE_MASK << SIZE_SHIFT; + + NeonRegisterParam() + { + } + +public: + + // + // N.B. Derived class must initialize m_Encoded. + // + + NeonRegisterParam( + NEON_REGISTER Reg, + UCHAR Size = 8 + ) + : m_Encoded(((Reg & REGISTER_MASK) << REGISTER_SHIFT) | + (EncodeSize(Size) << SIZE_SHIFT)) + { + AssertValidRegister(Reg); + AssertValidSize(Size); + } + + NEON_REGISTER + Register() const + { + return (m_Encoded >> REGISTER_SHIFT) & REGISTER_MASK; + } + + UCHAR + RawRegister() const + { + return UCHAR(Register() - NEONREG_FIRST); + } + + UCHAR + SizeShift() const + { + return (m_Encoded >> SIZE_SHIFT) & SIZE_MASK; + } + + UCHAR + Size() const + { + return 1 << SizeShift(); + } + +protected: + static + ULONG + EncodeSize( + UCHAR Size + ) + { + return (Size == 1) ? 0 : + (Size == 2) ? 1 : + (Size == 4) ? 2 : + (Size == 8) ? 3 : + 4; + } + + static + void + AssertValidRegister( + NEON_REGISTER Reg + ) + { + UNREFERENCED_PARAMETER(Reg); + NT_ASSERT(Reg >= NEONREG_FIRST && Reg <= NEONREG_LAST); + } + + static + void + AssertValidSize( + UCHAR Size + ) + { + UNREFERENCED_PARAMETER(Size); + NT_ASSERT(Size == 4 || Size == 8 || Size == 16); + } + + ULONG m_Encoded; +}; + +enum NEON_SIZE +{ + // scalar sizes, encoded as 0:Q:size + SIZE_1B = 0, + SIZE_1H = 1, + SIZE_1S = 2, + SIZE_1D = 3, + SIZE_1Q = 4, + + // vector sizes, encoded as 1:Q:size + SIZE_8B = 8, + SIZE_4H = 9, + SIZE_2S = 10, + SIZE_16B = 12, + SIZE_8H = 13, + SIZE_4S = 14, + SIZE_2D = 15 +}; + +inline +NEON_SIZE +NeonSize( + ULONG ElementSizeInBytes, + ULONG NumElements + ) +{ + switch (ElementSizeInBytes) + { + case 1: + NT_ASSERT(NumElements == 1 || NumElements == 8 || NumElements == 16); + return (NumElements == 1) ? SIZE_1B : (NumElements == 8) ? SIZE_8B : SIZE_16B; + + case 2: + NT_ASSERT(NumElements == 1 || NumElements == 4 || NumElements == 8); + return (NumElements == 1) ? SIZE_1H : (NumElements == 4) ? SIZE_4H : SIZE_8H; + + case 4: + NT_ASSERT(NumElements == 1 || NumElements == 2 || NumElements == 4); + return (NumElements == 1) ? SIZE_1S : (NumElements == 2) ? SIZE_2S : SIZE_4S; + + case 8: + NT_ASSERT(NumElements == 1 || NumElements == 2); + return (NumElements == 1) ? SIZE_1D : SIZE_2D; + + case 16: + NT_ASSERT(NumElements == 1); + return SIZE_1Q; + + default: + NT_ASSERT(!"Invalid element size passed to NeonSize."); + return SIZE_1B; + } +} + +inline +NEON_SIZE +NeonSizeScalar( + ULONG ElementSizeInBytes + ) +{ + return NeonSize(ElementSizeInBytes, 1); +} + +inline +NEON_SIZE +NeonSizeFullVector( + ULONG ElementSizeInBytes + ) +{ + return NeonSize(ElementSizeInBytes, 16 / ElementSizeInBytes); +} + +inline +NEON_SIZE +NeonSizeHalfVector( + ULONG ElementSizeInBytes + ) +{ + return NeonSize(ElementSizeInBytes, 8 / ElementSizeInBytes); +} + +#define VALID_1B (1 << SIZE_1B) +#define VALID_1H (1 << SIZE_1H) +#define VALID_1S (1 << SIZE_1S) +#define VALID_1D (1 << SIZE_1D) +#define VALID_1Q (1 << SIZE_1Q) + +#define VALID_8B (1 << SIZE_8B) +#define VALID_16B (1 << SIZE_16B) +#define VALID_4H (1 << SIZE_4H) +#define VALID_8H (1 << SIZE_8H) +#define VALID_2S (1 << SIZE_2S) +#define VALID_4S (1 << SIZE_4S) +#define VALID_2D (1 << SIZE_2D) + +#define VALID_816B (VALID_8B | VALID_16B) +#define VALID_48H (VALID_4H | VALID_8H) +#define VALID_24S (VALID_2S | VALID_4S) + +inline +bool +NeonSizeIsValid( + NEON_SIZE Valid, + ULONG ValidMask + ) +{ + return ((ValidMask >> int(Valid)) & 1) ? true : false; +} + +inline +bool +NeonSizeIsScalar( + NEON_SIZE Size + ) +{ + return (Size >= SIZE_1B && Size <= SIZE_1Q); +} + +inline +bool +NeonSizeIsVector( + NEON_SIZE Size + ) +{ + return (Size >= SIZE_8B && Size <= SIZE_2D); +} + +inline +int +NeonElementSize( + NEON_SIZE Size + ) +{ + return NeonSizeIsScalar(Size) ? Size : (Size & 3); +} + +// +// Binary integer operations +// + +inline +int +EmitNeonBinaryCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize, + ULONG VectorOpcode, + ULONG ScalarOpcode = 0 + ) +{ + + if (NeonSizeIsScalar(SrcSize)) { + NT_ASSERT(ScalarOpcode != 0); + return Emitter.EmitFourBytes(ScalarOpcode | ((SrcSize & 3) << 22) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } else { + NT_ASSERT(VectorOpcode != 0); + return Emitter.EmitFourBytes(VectorOpcode | (((SrcSize >> 2) & 1) << 30) | ((SrcSize & 3) << 22) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } +} + +inline +int +EmitNeonAbs( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e20b800, 0x5e20b800); +} + +inline +int +EmitNeonAddp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(SrcSize == SIZE_1D); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0, 0x5e31b800); +} + +inline +int +EmitNeonAddv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_4S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e31b800); +} + +inline +int +EmitNeonCls( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e204800); +} + +inline +int +EmitNeonClz( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e204800); +} + +inline +int +EmitNeonCmeq0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e209800, 0x5e209800); +} + +inline +int +EmitNeonCmge0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e208800, 0x7e208800); +} + +inline +int +EmitNeonCmgt0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e208800, 0x5e208800); +} + +inline +int +EmitNeonCmle0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e209800, 0x7e209800); +} + +inline +int +EmitNeonCmlt0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e20a800, 0x5e20a800); +} + +inline +int +EmitNeonCnt( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e205800); +} + +inline +int +EmitNeonNeg( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e20b800, 0x7e20b800); +} + +inline +int +EmitNeonNot( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e205800); +} + +inline +int +EmitNeonRbit( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e605800); +} + +inline +int +EmitNeonRev16( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e201800); +} + +inline +int +EmitNeonRev32( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e200800); +} + +inline +int +EmitNeonRev64( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e200800); +} + +inline +int +EmitNeonSadalp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e206800); +} + +inline +int +EmitNeonSaddlp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e202800); +} + +inline +int +EmitNeonSaddlv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_4S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e303800); +} + +inline +int +EmitNeonShll( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE(SrcSize & ~4), 0x2e213800); +} + +inline +int +EmitNeonShll2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_16B | VALID_8H | VALID_4S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE(SrcSize | 4), 0x2e213800); +} + +inline +int +EmitNeonSmaxv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_4S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e30a800); +} + +inline +int +EmitNeonSminv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_4S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e31a800); +} + +inline +int +EmitNeonSqabs( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e207800, 0x5e207800); +} + +inline +int +EmitNeonSqneg( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e207800, 0x7e207800); +} + +inline +int +EmitNeonSqxtn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize - 1) & ~4), 0x0e214800, 0x5e214800); +} + +inline +int +EmitNeonSqxtn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize - 1) | 4), 0x0e214800, 0x5e214800); +} + +inline +int +EmitNeonSqxtun( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize - 1) & ~4), 0x2e212800, 0x7e212800); +} + +inline +int +EmitNeonSqxtun2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize - 1) | 4), 0x2e212800, 0x7e212800); +} + +inline +int +EmitNeonSuqadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e203800, 0x5e203800); +} + +inline +int +EmitNeonUadalp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e206800); +} + +inline +int +EmitNeonUaddlp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e202800); +} + +inline +int +EmitNeonUaddlv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_4S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e303800); +} + +inline +int +EmitNeonUmaxv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_4S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e30a800); +} + +inline +int +EmitNeonUminv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_4S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e31a800); +} + +inline +int +EmitNeonUqxtn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize - 1) & ~4), 0x2e214800, 0x7e214800); +} + +inline +int +EmitNeonUqxtn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize - 1) | 4), 0x2e214800, 0x7e214800); +} + +inline +int +EmitNeonUrecpe( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea1c800); +} + +inline +int +EmitNeonUrsqrte( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea1c800); +} + +inline +int +EmitNeonUsqadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e203800, 0x7e203800); +} + +inline +int +EmitNeonXtn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize - 1) & ~4), 0x0e212800); +} + +inline +int +EmitNeonXtn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize - 1) | 4), 0x0e212800); +} + +// +// Binary FP operations +// + +inline +int +EmitNeonFloatBinaryCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize, + ULONG VectorOpcode, + ULONG ScalarOpcode = 0 + ) +{ + + if (NeonSizeIsScalar(SrcSize)) { + NT_ASSERT(ScalarOpcode != 0); + return Emitter.EmitFourBytes(ScalarOpcode | ((SrcSize & 1) << 22) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } else { + NT_ASSERT(VectorOpcode != 0); + return Emitter.EmitFourBytes(VectorOpcode | (((SrcSize >> 2) & 1) << 30) | ((SrcSize & 1) << 22) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } +} + +inline +int +EmitNeonFabs( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea0f800, 0x1e20c000); +} + +inline +int +EmitNeonFaddp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_2S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x7e30d800); +} + +inline +int +EmitNeonFcmeq0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea0d800, 0x5ea0d800); +} + +inline +int +EmitNeonFcmge0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea0c800, 0x7ea0c800); +} + +inline +int +EmitNeonFcmgt0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea0c800, 0x5ea0c800); +} + +inline +int +EmitNeonFcmle0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea0d800, 0x7ea0d800); +} + +inline +int +EmitNeonFcmlt0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea0e800, 0x5ea0e800); +} + +inline +int +EmitNeonFcvtas( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e21c800, 0x5e21c800); +} + +inline +int +EmitNeonFcvtau( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e21c800, 0x7e21c800); +} + +inline +int +EmitNeonFcvt( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NEON_SIZE DestSize, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D)); + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_1H | VALID_1S | VALID_1D)); + NT_ASSERT(SrcSize != DestSize); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0, 0x1ea34000 ^ ((SrcSize & 2) << 22) ^ ((DestSize & 3) << 15)); +} + +inline +int +EmitNeonFcvtl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize + 1) & ~4), 0x0e217800); +} + +inline +int +EmitNeonFcvtl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, NEON_SIZE((SrcSize + 1) | 4), 0x0e217800); +} + +inline +int +EmitNeonFcvtms( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e21b800, 0x5e21b800); +} + +inline +int +EmitNeonFcvtmu( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e21b800, 0x7e21b800); +} + +inline +int +EmitNeonFcvtn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_4S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, NEON_SIZE(SrcSize & ~4), 0x0e216800); +} + +inline +int +EmitNeonFcvtn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_4S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, NEON_SIZE(SrcSize | 4), 0x4e216800); +} + +inline +int +EmitNeonFcvtns( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e21a800, 0x5e21a800); +} + +inline +int +EmitNeonFcvtnu( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e21a800, 0x7e21a800); +} + +inline +int +EmitNeonFcvtps( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea1a800, 0x5ea1a800); +} + +inline +int +EmitNeonFcvtpu( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea1a800, 0x7ea1a800); +} + +inline +int +EmitNeonFcvtxn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_4S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, NEON_SIZE(SrcSize & ~4), 0x2e216800, 0x7e216800); +} + +inline +int +EmitNeonFcvtxn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_4S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, NEON_SIZE(SrcSize | 4), 0x2e216800, 0x7e216800); +} + +inline +int +EmitNeonFcvtzs( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea1b800, 0x5ea1b800); +} + +inline +int +EmitNeonFcvtzu( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea1b800, 0x7ea1b800); +} + +inline +int +EmitNeonFmaxnmp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_2S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x7e30c800); +} + +inline +int +EmitNeonFmaxnmv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_4S)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e30c800); +} + +inline +int +EmitNeonFmaxp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_2S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x7e30f800); +} + +inline +int +EmitNeonFmaxv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_4S)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e30f800); +} + +inline +int +EmitNeonFminnmp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_2S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x7eb0c800); +} + +inline +int +EmitNeonFminnmv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_4S)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2eb0c800); +} + +inline +int +EmitNeonFminp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_2S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x7eb0f800); +} + +inline +int +EmitNeonFminv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_4S)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2eb0f800); +} + +inline +int +EmitNeonFmov( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0, 0x1e204000); +} + +inline +int +EmitNeonFmovImmediate( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + UCHAR Immediate, + NEON_SIZE DestSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_1S | VALID_1D)); + return Emitter.EmitFourBytes(0x1e201000 | ((DestSize & 1) << 22) | (ULONG(Immediate) << 13) | Dest.RawRegister()); +} + +inline +int +EmitNeonFneg( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea0f800, 0x1e214000); +} + +inline +int +EmitNeonFrecpe( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea1d800, 0x5ea1d800); +} + +inline +int +EmitNeonFrecpx( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0, 0x5ea1f800); +} + +inline +int +EmitNeonFrinta( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e218800, 0x1e264000); +} + +inline +int +EmitNeonFrinti( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea19800, 0x1e27c000); +} + +inline +int +EmitNeonFrintm( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e219800, 0x1e254000); +} + +inline +int +EmitNeonFrintn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e218800, 0x1e244000); +} + +inline +int +EmitNeonFrintp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea18800, 0x1e24c000); +} + +inline +int +EmitNeonFrintx( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e219800, 0x1e274000); +} + +inline +int +EmitNeonFrintz( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0ea19800, 0x1e25c000); +} + +inline +int +EmitNeonFrsqrte( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea1d800, 0x7ea1d800); +} + +inline +int +EmitNeonFsqrt( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2ea1f800, 0x1e21c000); +} + +inline +int +EmitNeonScvtf( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x0e21d800, 0x5e21d800); +} + +inline +int +EmitNeonUcvtf( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatBinaryCommon(Emitter, Dest, Src, SrcSize, 0x2e21d800, 0x7e21d800); +} + +// +// Trinary integer operations +// + +inline +int +EmitNeonTrinaryCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize, + ULONG VectorOpcode, + ULONG ScalarOpcode = 0 + ) +{ + + if (NeonSizeIsScalar(SrcSize)) { + NT_ASSERT(ScalarOpcode != 0); + return Emitter.EmitFourBytes(ScalarOpcode | ((SrcSize & 3) << 22) | (Src2.RawRegister() << 16) | (Src1.RawRegister() << 5) | Dest.RawRegister()); + } else { + NT_ASSERT(VectorOpcode != 0); + return Emitter.EmitFourBytes(VectorOpcode | (((SrcSize >> 2) & 1) << 30) | ((SrcSize & 3) << 22) | (Src2.RawRegister() << 16) | (Src1.RawRegister() << 5) | Dest.RawRegister()); + } +} + +inline +int +EmitNeonAdd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e208400, 0x5e208400); +} + +inline +int +EmitNeonAddhn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e204000); +} + +inline +int +EmitNeonAddhn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e204000); +} + +inline +int +EmitNeonAddp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20bc00); +} + +inline +int +EmitNeonAnd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e201c00); +} + +inline +int +EmitNeonBicRegister( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e601c00); +} + +inline +int +EmitNeonBif( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2ee01c00); +} + +inline +int +EmitNeonBit( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2ea01c00); +} + +inline +int +EmitNeonBsl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e601c00); +} + +inline +int +EmitNeonCmeq( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e208c00, 0x7e208c00); +} + +inline +int +EmitNeonCmge( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e203c00, 0x5e203c00); +} + +inline +int +EmitNeonCmgt( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e203400, 0x5e203400); +} + +inline +int +EmitNeonCmhi( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e203400, 0x7e203400); +} + +inline +int +EmitNeonCmhs( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e203c00, 0x7e203c00); +} + +inline +int +EmitNeonCmtst( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e208c00, 0x5e208c00); +} + +inline +int +EmitNeonEor( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e201c00); +} + +inline +int +EmitNeonMla( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e209400); +} + +inline +int +EmitNeonMls( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e209400); +} + +inline +int +EmitNeonMov( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src, Src, SrcSize, 0x0ea01c00); +} + +inline +int +EmitNeonMul( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e209c00); +} + +inline +int +EmitNeonOrn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0ee01c00); +} + +inline +int +EmitNeonOrrRegister( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0ea01c00); +} + +inline +int +EmitNeonPmul( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e209c00); +} + +inline +int +EmitNeonPmull( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_1D | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e20e000, 0x0e20e000); +} + +inline +int +EmitNeonPmull2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_16B | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e20e000, 0x0e20e000); +} + +inline +int +EmitNeonRaddhn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE((SrcSize - 1) & ~4), 0x2e204000); +} + +inline +int +EmitNeonRaddhn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE((SrcSize - 1) | 4), 0x2e204000); +} + +inline +int +EmitNeonRsubhn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE((SrcSize - 1) & ~4), 0x2e206000); +} + +inline +int +EmitNeonRsubhn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE((SrcSize - 1) | 4), 0x2e206000); +} + +inline +int +EmitNeonSaba( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e207c00); +} + +inline +int +EmitNeonSabal( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e205000); +} + +inline +int +EmitNeonSabal2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e205000); +} + +inline +int +EmitNeonSabd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e207400); +} + +inline +int +EmitNeonSabdl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e207000); +} + +inline +int +EmitNeonSabdl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e207000); +} + +inline +int +EmitNeonSaddl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e200000); +} + +inline +int +EmitNeonSaddl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e200000); +} + +inline +int +EmitNeonSaddw( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e201000); +} + +inline +int +EmitNeonSaddw2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e201000); +} + +inline +int +EmitNeonShadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e200400); +} + +inline +int +EmitNeonShsub( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e202400); +} + +inline +int +EmitNeonSmax( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e206400); +} + +inline +int +EmitNeonSmaxp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20a400); +} + +inline +int +EmitNeonSmin( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e206c00); +} + +inline +int +EmitNeonSminp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20ac00); +} + +inline +int +EmitNeonSmlal( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e208000); +} + +inline +int +EmitNeonSmlal2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e208000); +} + +inline +int +EmitNeonSmlsl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e20a000); +} + +inline +int +EmitNeonSmlsl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e20a000); +} + +inline +int +EmitNeonSmull( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e20c000); +} + +inline +int +EmitNeonSmull2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e20c000); +} + +inline +int +EmitNeonSqadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e200c00, 0x5e200c00); +} + +inline +int +EmitNeonSqdmlal( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e209000, 0x5e209000); +} + +inline +int +EmitNeonSqdmlal2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e209000); +} + +inline +int +EmitNeonSqdmlsl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e20b000, 0x5e20b00); +} + +inline +int +EmitNeonSqdmlsl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e20b000); +} + +inline +int +EmitNeonSqdmulh( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20b400, 0x5e20b400); +} + +inline +int +EmitNeonSqdmull( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e20d000, 0x5e20d000); +} + +inline +int +EmitNeonSqdmull2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e20d000); +} + +inline +int +EmitNeonSqrdmulh( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20b400, 0x7e20b400); +} + +inline +int +EmitNeonSqrshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e205c00, 0x5e205c00); +} + +inline +int +EmitNeonSqshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e204c00, 0x5e204c00); +} + +inline +int +EmitNeonSqsub( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e202c00, 0x5e202c00); +} + +inline +int +EmitNeonSrhadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e201400); +} + +inline +int +EmitNeonSrshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e205400, 0x5e205400); +} + +inline +int +EmitNeonSshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e204400, 0x5e204400); +} + +inline +int +EmitNeonSsubl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e202000); +} + +inline +int +EmitNeonSsubl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e202000); +} + +inline +int +EmitNeonSsubw( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e203000); +} + +inline +int +EmitNeonSsubw2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e203000); +} + +inline +int +EmitNeonSub( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e208400, 0x7e208400); +} + +inline +int +EmitNeonSubhn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x0e206000); +} + +inline +int +EmitNeonSubhn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x0e206000); +} + +inline +int +EmitNeonTrn1( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e002800); +} + +inline +int +EmitNeonTrn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e006800); +} + +inline +int +EmitNeonUaba( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e207c00); +} + +inline +int +EmitNeonUabal( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e205000); +} + +inline +int +EmitNeonUabal2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e205000); +} + +inline +int +EmitNeonUabd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e207400); +} + +inline +int +EmitNeonUabdl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e207000); +} + +inline +int +EmitNeonUabdl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e207000); +} + +inline +int +EmitNeonUaddl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e200000); +} + +inline +int +EmitNeonUaddl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e200000); +} + +inline +int +EmitNeonUaddw( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e201000); +} + +inline +int +EmitNeonUaddw2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e201000); +} + +inline +int +EmitNeonUhadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e200400); +} + +inline +int +EmitNeonUhsub( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e202400); +} + +inline +int +EmitNeonUmax( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e206400); +} + +inline +int +EmitNeonUmaxp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20a400); +} + +inline +int +EmitNeonUmin( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e206c00); +} + +inline +int +EmitNeonUminp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20ac00); +} + +inline +int +EmitNeonUmlal( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e208000); +} + +inline +int +EmitNeonUmlal2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e208000); +} + +inline +int +EmitNeonUmlsl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e20a000); +} + +inline +int +EmitNeonUmlsl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e20a000); +} + +inline +int +EmitNeonUmull( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e20c000); +} + +inline +int +EmitNeonUmull2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e20c000); +} + +inline +int +EmitNeonUqadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e200c00, 0x7e200c00); +} + +inline +int +EmitNeonUqrshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e205c00, 0x7e205c00); +} + +inline +int +EmitNeonUqshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e204c00, 0x7e204c00); +} + +inline +int +EmitNeonUqsub( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e202c00, 0x7e202c00); +} + +inline +int +EmitNeonUrhadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e201400); +} + +inline +int +EmitNeonUrshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e205400, 0x7e205400); +} + +inline +int +EmitNeonUshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e204400, 0x7e204400); +} + +inline +int +EmitNeonUsubl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e202000); +} + +inline +int +EmitNeonUsubl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e202000); +} + +inline +int +EmitNeonUsubw( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize & ~4), 0x2e203000); +} + +inline +int +EmitNeonUsubw2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, NEON_SIZE(SrcSize | 4), 0x2e203000); +} + +inline +int +EmitNeonUzp1( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e001800); +} + +inline +int +EmitNeonUzp2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e005800); +} + +inline +int +EmitNeonZip1( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e003800); +} + +inline +int +EmitNeonZip2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e007800); +} + +// +// Trinary FP operations +// + +inline +int +EmitNeonFloatTrinaryCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize, + ULONG VectorOpcode, + ULONG ScalarOpcode = 0 + ) +{ + + if (NeonSizeIsScalar(SrcSize)) { + NT_ASSERT(ScalarOpcode != 0); + return Emitter.EmitFourBytes(ScalarOpcode | ((SrcSize & 1) << 22) | (Src2.RawRegister() << 16) | (Src1.RawRegister() << 5) | Dest.RawRegister()); + } else { + NT_ASSERT(VectorOpcode != 0); + return Emitter.EmitFourBytes(VectorOpcode | (((SrcSize >> 2) & 1) << 30) | ((SrcSize & 1) << 22) | (Src2.RawRegister() << 16) | (Src1.RawRegister() << 5) | Dest.RawRegister()); + } +} + +inline +int +EmitNeonFabd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2ea0d400, 0x7ea0d400); +} + +inline +int +EmitNeonFacge( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20ec00, 0x7e20ec00); +} + +inline +int +EmitNeonFacgt( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2ea0ec00, 0x7ea0ec00); +} + +inline +int +EmitNeonFadd( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20d400, 0x1e202800); +} + +inline +int +EmitNeonFaddp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20d400); +} + +inline +int +EmitNeonFcmeq( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + // + // NaNs produce 0s (false) + // + + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20e400, 0x5e20e400); +} + +inline +int +EmitNeonFcmge( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20e400, 0x7e20e400); +} + +inline +int +EmitNeonFcmgt( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2ea0e400, 0x7ea0e400); +} + +inline +int +EmitNeonFcmp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonFloatTrinaryCommon(Emitter, NEONREG_D0, Src1, Src2, SrcSize, 0, 0x1e202000); +} + +inline +int +EmitNeonFcmp0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Src1, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonFloatTrinaryCommon(Emitter, NEONREG_D0, Src1, NEONREG_D0, SrcSize, 0, 0x1e202008); +} + +inline +int +EmitNeonFcmpe( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonFloatTrinaryCommon(Emitter, NEONREG_D0, Src1, Src2, SrcSize, 0, 0x1e202010); +} + +inline +int +EmitNeonFcmpe0( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Src1, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonFloatTrinaryCommon(Emitter, NEONREG_D0, Src1, NEONREG_D0, SrcSize, 0, 0x1e204018); +} + +inline +int +EmitNeonFdiv( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20fc00, 0x1e201800); +} + +inline +int +EmitNeonFmax( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20f400, 0x1e204800); +} + +inline +int +EmitNeonFmaxnm( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20c400, 0x1e206800); +} + +inline +int +EmitNeonFmaxnmp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20c400); +} + +inline +int +EmitNeonFmaxp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20f400); +} + +inline +int +EmitNeonFmin( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0ea0f400, 0x1e205800); +} + +inline +int +EmitNeonFminnm( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0ea0c400, 0x1e207800); +} + +inline +int +EmitNeonFminnmp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2ea0c400); +} + +inline +int +EmitNeonFminp( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2ea0f400); +} + +inline +int +EmitNeonFmla( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20cc00); +} + +inline +int +EmitNeonFmls( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0ea0cc00); +} + +inline +int +EmitNeonFmul( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x2e20dc00, 0x1e200800); +} + +inline +int +EmitNeonFmulx( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20dc00, 0x5e20dc00); +} + +inline +int +EmitNeonFnmul( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0, 0x1e208800); +} + +inline +int +EmitNeonFrecps( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0e20fc00, 0x5e20fc00); +} + +inline +int +EmitNeonFrsqrts( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0ea0fc00, 0x5ea0fc00); +} + +inline +int +EmitNeonFsub( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D | VALID_24S | VALID_2D)); + return EmitNeonFloatTrinaryCommon(Emitter, Dest, Src1, Src2, SrcSize, 0x0ea0d400, 0x1e203800); +} + +// +// Shift immediate forms +// + +inline +int +EmitNeonShiftLeftImmediateCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize, + ULONG VectorOpcode, + ULONG ScalarOpcode = 0 + ) +{ + ULONG Size = SrcSize & 3; + NT_ASSERT(Immediate < (8U << Size)); + + ULONG EffShift = Immediate + (8 << Size); + + if (NeonSizeIsScalar(SrcSize)) { + NT_ASSERT(ScalarOpcode != 0); + return Emitter.EmitFourBytes(ScalarOpcode | (EffShift << 16) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } else { + NT_ASSERT(VectorOpcode != 0); + return Emitter.EmitFourBytes(VectorOpcode | (((SrcSize >> 2) & 1) << 30) | (EffShift << 16) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } +} + +inline +int +EmitNeonShiftRightImmediateCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize, + ULONG VectorOpcode, + ULONG ScalarOpcode = 0 + ) +{ + ULONG Size = SrcSize & 3; + NT_ASSERT(Immediate <= (8U << Size)); + + ULONG EffShift = (16 << Size) - Immediate; + + if (NeonSizeIsScalar(SrcSize)) { + NT_ASSERT(ScalarOpcode != 0); + return Emitter.EmitFourBytes(ScalarOpcode | (EffShift << 16) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } else { + NT_ASSERT(VectorOpcode != 0); + return Emitter.EmitFourBytes(VectorOpcode | (((SrcSize >> 2) & 1) << 30) | (EffShift << 16) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } +} + +inline +int +EmitNeonRshrn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) & ~4), 0x0f008c00); +} + +inline +int +EmitNeonRshrn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) | 4), 0x0f008c00); +} + +inline +int +EmitNeonShl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x0f005400, 0x5f005400); +} + +inline +int +EmitNeonShrn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) & ~4), 0x0f008400); +} + +inline +int +EmitNeonShrn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) | 4), 0x0f008400); +} + +inline +int +EmitNeonSli( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x2f005400, 0x7f005400); +} + +inline +int +EmitNeonSqrshrn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) & ~4), 0x0f009c00, 0x5f009c00); +} + +inline +int +EmitNeonSqrshrn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) | 4), 0x0f009c00); +} + +inline +int +EmitNeonSqrshrun( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) & ~4), 0x2f008c00, 0x7f008c00); +} + +inline +int +EmitNeonSqrshrun2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) | 4), 0x2f008c00); +} + +inline +int +EmitNeonSqshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x0f007400, 0x5f007400); +} + +inline +int +EmitNeonSqshlu( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x2f006400, 0x7f006400); +} + +inline +int +EmitNeonSqshrn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) & ~4), 0x0f009400, 0x5f009400); +} + +inline +int +EmitNeonSqshrn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) | 4), 0x0f009400); +} + +inline +int +EmitNeonSri( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x2f004400, 0x7f004400); +} + +inline +int +EmitNeonSrshr( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x0f002400, 0x5f002400); +} + +inline +int +EmitNeonSrsra( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x0f003400, 0x5f003400); +} + +inline +int +EmitNeonSshll( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE(SrcSize & ~4), 0x0f00a400); +} + +inline +int +EmitNeonSshll2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_16B | VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE(SrcSize | 4), 0x0f00a400); +} + +inline +int +EmitNeonSshr( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x0f000400, 0x5f000400); +} + +inline +int +EmitNeonSsra( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x0f001400, 0x5f001400); +} + +inline +int +EmitNeonSxtl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, 0, NEON_SIZE(SrcSize & ~4), 0x0f00a400); +} + +inline +int +EmitNeonSxtl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_16B | VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, 0, NEON_SIZE(SrcSize | 4), 0x0f00a400); +} + +inline +int +EmitNeonUqrshrn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) & ~4), 0x2f009c00, 0x7f009c00); +} + +inline +int +EmitNeonUqrshrn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) | 4), 0x2f009c00); +} + +inline +int +EmitNeonUqshl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x2f007400, 0x7f007400); +} + +inline +int +EmitNeonUqshrn( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1H | VALID_1S | VALID_1D | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) & ~4), 0x2f009400, 0x7f009400); +} + +inline +int +EmitNeonUqshrn2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE((SrcSize - 1) | 4), 0x2f009400); +} + +inline +int +EmitNeonUrshr( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x2f002400, 0x7f002400); +} + +inline +int +EmitNeonUrsra( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x2f003400, 0x7f003400); +} + +inline +int +EmitNeonUshll( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE(SrcSize & ~4), 0x2f00a400); +} + +inline +int +EmitNeonUshll2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_16B | VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, Immediate, NEON_SIZE(SrcSize | 4), 0x2f00a400); +} + +inline +int +EmitNeonUshr( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x2f000400, 0x7f000400); +} + +inline +int +EmitNeonUsra( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftRightImmediateCommon(Emitter, Dest, Src, Immediate, SrcSize, 0x2f001400, 0x7f001400); +} + +inline +int +EmitNeonUxtl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, 0, NEON_SIZE(SrcSize & ~4), 0x2f00a400); +} + +inline +int +EmitNeonUxtl2( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_16B | VALID_8H | VALID_4S | VALID_2D)); + return EmitNeonShiftLeftImmediateCommon(Emitter, Dest, Src, 0, NEON_SIZE(SrcSize | 4), 0x2f00a400); +} + +// +// FCVT* Rx,V.T +// + +inline +int +EmitNeonConvertScalarCommon( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | ((SrcSize & 1) << 22) | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitNeonFcvtmsGen( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x1e300000); +} + +inline +int +EmitNeonFcvtmsGen64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x9e300000); +} + +inline +int +EmitNeonFcvtmuGen( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x1e310000); +} + +inline +int +EmitNeonFcvtmuGen64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x9e310000); +} + +inline +int +EmitNeonFcvtnsGen( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x1e200000); +} + +inline +int +EmitNeonFcvtnsGen64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x9e200000); +} + +inline +int +EmitNeonFcvtnuGen( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x1e210000); +} + +inline +int +EmitNeonFcvtnuGen64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x9e210000); +} + +inline +int +EmitNeonFcvtpsGen( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x1e280000); +} + +inline +int +EmitNeonFcvtpsGen64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x9e280000); +} + +inline +int +EmitNeonFcvtpuGen( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x1e290000); +} + +inline +int +EmitNeonFcvtpuGen64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x9e290000); +} + +inline +int +EmitNeonFcvtzsGen( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x1e380000); +} + +inline +int +EmitNeonFcvtzsGen64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x9e380000); +} + +inline +int +EmitNeonFcvtzuGen( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x1e390000); +} + +inline +int +EmitNeonFcvtzuGen64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize +) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SrcSize, 0x9e390000); +} + +inline +int +EmitNeonFmovToGeneral( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + UNREFERENCED_PARAMETER(SrcSize); + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SIZE_1S, 0x1e260000); +} + +// +// e.g. FMOV X6, D0 +// + +inline +int +EmitNeonFmovToGeneral64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + UNREFERENCED_PARAMETER(SrcSize); + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1D | VALID_2D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SIZE_1D, 0x9e260000); +} + +// +// e.g. FMOV X7, V0.D[1] +// + +inline +int +EmitNeonFmovToGeneralHigh64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + UNREFERENCED_PARAMETER(SrcSize); + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_2D)); // TODO: Should this be VALID_1D? + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SIZE_1S /* SIZE_1D */, 0x9eae0000); +} + +// +// SCVTF* V.T,D +// + +inline +int +EmitNeonConvertScalarCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DstSize, + ULONG Opcode + ) +{ + return Emitter.EmitFourBytes(Opcode | ((DstSize & 1) << 22) | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitNeonFmovFromGeneral( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DestSize + ) +{ + UNREFERENCED_PARAMETER(DestSize); + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_1S)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SIZE_1S, 0x1e270000); +} + +// +// e.g. FMOV D0, X6 +// + +inline +int +EmitNeonFmovFromGeneral64( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DestSize + ) +{ + UNREFERENCED_PARAMETER(DestSize); + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_1D | VALID_2D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SIZE_1D, 0x9e270000); +} + +// +// e.g. FMOV V0.d[1], X7 +// + +inline +int +EmitNeonFmovFromGeneralHigh64( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DestSize + ) +{ + UNREFERENCED_PARAMETER(DestSize); + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_2D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, SIZE_1S /* SIZE_1D */, 0x9eaf0000); +} + +inline +int +EmitNeonScvtf( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DstSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DstSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, DstSize, 0x1e220000); +} + +inline +int +EmitNeonScvtf64( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DstSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DstSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, DstSize, 0x9e220000); +} + +inline +int +EmitNeonUcvtf( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DstSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DstSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, DstSize, 0x1e230000); +} + +inline +int +EmitNeonUcvtf64( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DstSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DstSize, VALID_1S | VALID_1D)); + return EmitNeonConvertScalarCommon(Emitter, Dest, Src, DstSize, 0x9e230000); +} + +// +// DUP V.T,V.T[index] +// + +inline +int +EmitNeonMovElementCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG SrcIndex, + NEON_SIZE SrcSize, + ULONG Opcode + ) +{ + ULONG Size = SrcSize & 3; + NT_ASSERT((SrcIndex << Size) < 16); + + SrcIndex = ((SrcIndex << 1) | 1) << Size; + + return Emitter.EmitFourBytes(Opcode | (SrcIndex << 16) | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitNeonDupElement( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + ULONG SrcIndex, + NEON_SIZE DestSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonMovElementCommon(Emitter, Dest, Src, SrcIndex, DestSize, 0x0e000400 | (((DestSize >> 2) & 1) << 30)); +} + +inline +int +EmitNeonDup( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + Arm64SimpleRegisterParam Src, + NEON_SIZE DestSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + return EmitNeonMovElementCommon(Emitter, Dest, NeonRegisterParam(NEONREG_D0 + Src.RawRegister()), 0, DestSize, 0x0e000c00 | (((DestSize >> 2) & 1) << 30)); +} + +inline +int +EmitNeonIns( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + ULONG DestIndex, + Arm64SimpleRegisterParam Src, + NEON_SIZE DestSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D)); + return EmitNeonMovElementCommon(Emitter, Dest, NeonRegisterParam(NEONREG_D0 + Src.RawRegister()), DestIndex, DestSize, 0x4e001c00); +} + +inline +int +EmitNeonSmov( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + ULONG SrcIndex, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H)); + return EmitNeonMovElementCommon(Emitter, NeonRegisterParam(NEONREG_D0 + Dest.RawRegister()), Src, SrcIndex, SrcSize, 0x0e002c00); +} + +inline +int +EmitNeonSmov64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + ULONG SrcIndex, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S)); + return EmitNeonMovElementCommon(Emitter, NeonRegisterParam(NEONREG_D0 + Dest.RawRegister()), Src, SrcIndex, SrcSize, 0x4e002c00); +} + +inline +int +EmitNeonUmov( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + ULONG SrcIndex, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S)); + return EmitNeonMovElementCommon(Emitter, NeonRegisterParam(NEONREG_D0 + Dest.RawRegister()), Src, SrcIndex, SrcSize, 0x0e003c00); +} + +inline +int +EmitNeonUmov64( + Arm64CodeEmitter &Emitter, + Arm64SimpleRegisterParam Dest, + NeonRegisterParam Src, + ULONG SrcIndex, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1B | VALID_1H | VALID_1S | VALID_1D)); + return EmitNeonMovElementCommon(Emitter, NeonRegisterParam(NEONREG_D0 + Dest.RawRegister()), Src, SrcIndex, SrcSize, 0x4e003c00); +} + +// +// INS V.T[index],V.T[index] +// + +inline +int +EmitNeonInsElement( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + ULONG DestIndex, + NeonRegisterParam Src, + ULONG SrcIndex, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D)); + + ULONG Size = SrcSize & 3; + NT_ASSERT((DestIndex << Size) < 16); + NT_ASSERT((SrcIndex << Size) < 16); + + DestIndex = ((DestIndex << 1) | 1) << Size; + SrcIndex <<= Size; + + return Emitter.EmitFourBytes(0x6e000400 | (DestIndex << 16) | (SrcIndex << 11) | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +// +// FCSEL V.T,V.T,V.T,condition +// + +inline +int +EmitNeonFcsel( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + ULONG Condition, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_1S | VALID_1D)); + return Emitter.EmitFourBytes(0x1e200c00 | ((SrcSize & 1) << 22) | (Src2.RawRegister() << 16) | ((Condition & 15) << 12) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +// +// MOVI V.T,#x +// + +inline +ULONG +ComputeNeonImmediate( + ULONG64 Immediate, + NEON_SIZE DestSize + ) +{ + + // + // Expand the immediate + // + + ULONG OpSize = DestSize & 3; + if (OpSize == 0) { + Immediate &= 0xff; + Immediate |= Immediate << 8; + } + if (OpSize <= 1) { + Immediate &= 0xffff; + Immediate |= Immediate << 16; + } + if (OpSize <= 2) { + Immediate &= 0xffffffff; + Immediate |= Immediate << 32; + } + bool Replicated2x = (((Immediate >> 32) & 0xffffffff) == (Immediate & 0xffffffff)); + bool Replicated4x = Replicated2x && (((Immediate >> 16) & 0xffff) == (Immediate & 0xffff)); + + // + // Determine CMODE and Op + // + + ULONG Op = 0; + ULONG Cmode; + ULONG EncImmediate; + if (Replicated2x && (Immediate & 0xffffff00) == 0) { + Cmode = 0; + EncImmediate = Immediate & 0xff; + } else if (Replicated2x && (Immediate & 0xffff00ff) == 0) { + Cmode = 2; + EncImmediate = (Immediate >> 8) & 0xff; + } else if (Replicated2x && (Immediate & 0xff00ffff) == 0) { + Cmode = 4; + EncImmediate = (Immediate >> 16) & 0xff; + } else if (Replicated2x && (Immediate & 0x00ffffff) == 0) { + Cmode = 6; + EncImmediate = (Immediate >> 24) & 0xff; + } else if (Replicated4x && (Immediate & 0xff00) == 0) { + Cmode = 8; + EncImmediate = Immediate & 0xff; + } else if (Replicated4x && (Immediate & 0x00ff) == 0) { + Cmode = 10; + EncImmediate = (Immediate >> 8) & 0xff; + } else if (Replicated2x && (Immediate & 0xffff00ff) == 0x000000ff) { + Cmode = 12; + EncImmediate = (Immediate >> 8) & 0xff; + } else if (Replicated2x && (Immediate & 0xff00ffff) == 0x0000ffff) { + Cmode = 13; + EncImmediate = (Immediate >> 16) & 0xff; + } else if (Replicated4x && ((Immediate >> 8) & 0xff) == (Immediate & 0xff)) { + Cmode = 14; + EncImmediate = Immediate & 0xff; + } else if (Replicated2x && ((Immediate & 0x7e07ffff) == 0x40000000 || (Immediate & 0x7e07ffffull) == 0x3e000000)) { + Cmode = 15; + EncImmediate = (((Immediate >> 31) & 1) << 7) | (((Immediate >> 29) & 1) << 6) | ((Immediate >> 19) & 0x3f); + } else if ((Immediate & 0x7fc0ffffffffffffull) == 0x4000000000000000ull || + (Immediate & 0x7fc0ffffffffffffull) == 0x3fc0000000000000ull) { + Cmode = 15; + Op = 1; + EncImmediate = (((Immediate >> 63) & 1) << 7) | (((Immediate >> 61) & 1) << 6) | ((Immediate >> 48) & 0x3f); + } else { + EncImmediate = 0; + for (int Index = 0; Index < 8; Index++) { + ULONG Temp = (Immediate >> (8 * Index)) & 0xff; + if (Temp == 0xff) { + EncImmediate |= 1 << Index; + } else if (Temp != 0) { + return 1; + } + } + Cmode = 14; + Op = 1; + } + + NT_ASSERT(EncImmediate < 256); + return (Op << 29) | (((EncImmediate >> 5) & 7) << 16) | (Cmode << 12) | ((EncImmediate & 0x1f) << 5); +} + +inline +int +EmitNeonMovi( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + ULONG64 Immediate, + NEON_SIZE DestSize + ) +{ + NT_ASSERT(NeonSizeIsValid(DestSize, VALID_816B | VALID_48H | VALID_24S | VALID_2D | VALID_1D)); + + ULONG EncImmediate = ComputeNeonImmediate(Immediate, DestSize); + if (EncImmediate != 1) { + return Emitter.EmitFourBytes(0x0f000400 | (((DestSize >> 2) & 1) << 30) | EncImmediate | Dest.RawRegister()); + } + + EncImmediate = ComputeNeonImmediate(~Immediate, DestSize); + if (EncImmediate != 1) { + return Emitter.EmitFourBytes(0x2f000400 | (((DestSize >> 2) & 1) << 30) | EncImmediate | Dest.RawRegister()); + } + + NT_ASSERT(false); + return 0; +} + +// +// TBL Vd.T,Vn.16B,Vm.T +// +// + +inline +int +EmitNeonTbl( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NeonRegisterParam Indices, + NEON_SIZE Size + ) +{ + + if (Size == SIZE_8B) { + return Emitter.EmitFourBytes(0x0e000000 | (Indices.RawRegister() << 16) | (Src.RawRegister() << 5) | Dest.RawRegister()); + + } else { + + NT_ASSERT(Size == SIZE_16B); + + return Emitter.EmitFourBytes(0x4e000000 | (Indices.RawRegister() << 16) | (Src.RawRegister() << 5) | Dest.RawRegister()); + } +} + +// +// EXT Vd.T,Vn.T,Vm.T,#x +// + +inline +int +EmitNeonExt( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src1, + NeonRegisterParam Src2, + ULONG Immediate, + NEON_SIZE SrcSize + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcSize, VALID_816B)); + NT_ASSERT(((SrcSize == SIZE_8B) && (Immediate < 8)) || + ((SrcSize == SIZE_16B) && (Immediate < 16))); + + return Emitter.EmitFourBytes(0x2e000000 | (((SrcSize >> 2) & 1) << 30) | (Src2.RawRegister() << 16) | (Immediate << 11) | (Src1.RawRegister() << 5) | Dest.RawRegister()); +} + +// +// LDR (immediate, SIMD&FP) - Unsigned offset form +// + +inline +int +EmitNeonLdrStrOffsetCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam SrcDest, + NEON_SIZE SrcDestSize, + Arm64SimpleRegisterParam Addr, + LONG Offset, + ULONG Opcode, + ULONG OpcodeUnscaled + ) +{ + NT_ASSERT(NeonSizeIsScalar(SrcDestSize)); + + ULONG SizeBits = ((SrcDestSize & 3) << 30) | ((SrcDestSize >> 2) << 23); + + if (Opcode != 0) { + LONG EncodeOffset = Offset >> SrcDestSize; + if ((EncodeOffset << SrcDestSize) == Offset && (EncodeOffset & 0xfff) == EncodeOffset) { + return Emitter.EmitFourBytes(Opcode | SizeBits | ((EncodeOffset & 0xfff) << 10) | (Addr.RawRegister() << 5) | SrcDest.RawRegister()); + } + } + + if (OpcodeUnscaled != 0 && Offset >= -0x100 && Offset <= 0xff) { + return Emitter.EmitFourBytes(OpcodeUnscaled | SizeBits | ((Offset & 0x1ff) << 12) | (Addr.RawRegister() << 5) | SrcDest.RawRegister()); + } + + return 0; +} + +inline +int +EmitNeonLdrOffset( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NEON_SIZE DestSize, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitNeonLdrStrOffsetCommon(Emitter, Dest, DestSize, Addr, Offset, 0x3d400000, 0x3c400000); +} + +inline +int +EmitNeonStrOffset( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Source, + NEON_SIZE SourceSize, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitNeonLdrStrOffsetCommon(Emitter, Source, SourceSize, Addr, Offset, 0x3d000000, 0x3c000000); +} + +// +// LDP (immediate, SIMD&FP) - Unsigned offset form +// + +inline +int +EmitNeonLdpStpOffsetCommon( + Arm64CodeEmitter &Emitter, + NeonRegisterParam SrcDest1, + NeonRegisterParam SrcDest2, + NEON_SIZE SrcDestSize, + Arm64SimpleRegisterParam Addr, + LONG Offset, + ULONG Opcode + ) +{ + NT_ASSERT(NeonSizeIsValid(SrcDestSize, VALID_1S | VALID_1D | VALID_1Q)); + + ULONG Opc = (SrcDestSize - 2); + + LONG EncodeOffset = Offset >> SrcDestSize; + if ((EncodeOffset << SrcDestSize) == Offset && EncodeOffset >= -0x40 && EncodeOffset <= 0x3f) { + return Emitter.EmitFourBytes(Opcode | (Opc << 30) | ((EncodeOffset & 0x7f) << 15) | (SrcDest2.RawRegister() << 10) | (Addr.RawRegister() << 5) | SrcDest1.RawRegister()); + } + + return 0; +} + +inline +int +EmitNeonLdpOffset( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest1, + NeonRegisterParam Dest2, + NEON_SIZE DestSize, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitNeonLdpStpOffsetCommon(Emitter, Dest1, Dest2, DestSize, Addr, Offset, 0x2d400000); +} + +inline +int +EmitNeonStpOffset( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Source1, + NeonRegisterParam Source2, + NEON_SIZE SourceSize, + Arm64SimpleRegisterParam Addr, + LONG Offset + ) +{ + return EmitNeonLdpStpOffsetCommon(Emitter, Source1, Source2, SourceSize, Addr, Offset, 0x2d000000); +} + +// +// LD1/ST1 (immediate, SIMD&FP) - Unsigned offset form +// + +inline +int +EmitNeonLd1St1Common( + Arm64CodeEmitter &Emitter, + NeonRegisterParam SrcDest, + LONG Index, + Arm64SimpleRegisterParam Addr, + NEON_SIZE SrcDestSize, + ULONG Opcode + ) +{ + ULONG QSSize = Index << (SrcDestSize & 3); + if (SrcDestSize == SIZE_1D) { + QSSize |= 1; + } + + NT_ASSERT(QSSize < 16); + ULONG Op = (SrcDestSize == SIZE_1B) ? 0 : (SrcDestSize == SIZE_1H) ? 2 : 4; + + return Emitter.EmitFourBytes(Opcode | ((QSSize >> 3) << 30) | (Op << 13) | ((QSSize & 7) << 10) | (Addr.RawRegister() << 5) | SrcDest.RawRegister()); +} + +inline +int +EmitNeonLd1( + Arm64CodeEmitter &Emitter, + NeonRegisterParam SrcDest, + LONG Index, + Arm64SimpleRegisterParam Addr, + NEON_SIZE SrcDestSize + ) +{ + return EmitNeonLd1St1Common(Emitter, SrcDest, Index, Addr, SrcDestSize, 0x0d400000); +} + +inline +int +EmitNeonSt1( + Arm64CodeEmitter &Emitter, + NeonRegisterParam SrcDest, + LONG Index, + Arm64SimpleRegisterParam Addr, + NEON_SIZE SrcDestSize + ) +{ + return EmitNeonLd1St1Common(Emitter, SrcDest, Index, Addr, SrcDestSize, 0x0d000000); +} + +// +// AES +// + +inline +int +EmitNeonAesD( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + + UNREFERENCED_PARAMETER(SrcSize); + + NT_ASSERT(SrcSize == SIZE_16B); + + return Emitter.EmitFourBytes(0x4e285800 | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitNeonAesE( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + + UNREFERENCED_PARAMETER(SrcSize); + + NT_ASSERT(SrcSize == SIZE_16B); + + return Emitter.EmitFourBytes(0x4e284800 | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitNeonAesImc( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + + UNREFERENCED_PARAMETER(SrcSize); + + NT_ASSERT(SrcSize == SIZE_16B); + + return Emitter.EmitFourBytes(0x4e287800 | (Src.RawRegister() << 5) | Dest.RawRegister()); +} + +inline +int +EmitNeonAesMc( + Arm64CodeEmitter &Emitter, + NeonRegisterParam Dest, + NeonRegisterParam Src, + NEON_SIZE SrcSize + ) +{ + + UNREFERENCED_PARAMETER(SrcSize); + + NT_ASSERT(SrcSize == SIZE_16B); + + return Emitter.EmitFourBytes(0x4e286800 | (Src.RawRegister() << 5) | Dest.RawRegister()); +} diff --git a/deps/chakrashim/core/lib/Backend/arm64/ARM64UnwindEncoder.cpp b/deps/chakrashim/core/lib/Backend/arm64/ARM64UnwindEncoder.cpp new file mode 100644 index 00000000000..c69a85ad70f --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/ARM64UnwindEncoder.cpp @@ -0,0 +1,686 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "Backend.h" +#include "ARM64UnwindEncoder.h" + +const OpcodeMatcher Arm64UnwindCodeGenerator::MovkOpcode = { 0x1f800000, 0x12800000 }; +const OpcodeMatcher Arm64UnwindCodeGenerator::BlrOpcode = { 0xfffffc1f, 0xd63f0000 }; +const OpcodeMatcher Arm64UnwindCodeGenerator::RetOpcode = { 0xffffffff, 0xd65f03c0 }; +const OpcodeMatcher Arm64UnwindCodeGenerator::SubSpSpX15Uxtx4Opcode = { 0xffffffff, 0xcb2f73ff }; + +const OpcodeList Arm64UnwindCodeGenerator::PrologOpcodes = +{ + { 0xff8003ff, 0xd10003ff }, // sub sp, sp, #imm + { 0xffe0ffff, 0xcb4063ff }, // sub sp, sp, reg + { 0xff8003ff, 0x910003fd }, // add fp, sp, #imm + { 0xffc003e0, 0xa90003e0 }, // stp rt, rt2, [sp, #offs] + { 0xffc003e0, 0xa98003e0 }, // stp rt, rt2, [sp, #offs]! + { 0xffc003e0, 0xf90003e0 }, // str rt, [sp, #offs] + { 0xffe00fe0, 0xf8000fe0 }, // str rt, [sp, #offs]! + { 0xffc003e0, 0x6d0003e0 }, // stp dt, dt2, [sp, #offs] + { 0xffc003e0, 0x6d8003e0 }, // stp dt, dt2, [sp, #offs]! + { 0xffc003e0, 0xfd0003e0 }, // str dt, [sp, #offs] + { 0xffe00fe0, 0xfc000fe0 }, // str dt, [sp, #offs]! +}; + +const OpcodeList Arm64UnwindCodeGenerator::EpilogOpcodes = +{ + { 0xff8003ff, 0x910003ff }, // add sp, sp, #imm + { 0xffe0ffff, 0x8b2063ff }, // add sp, sp, reg + { 0xff8003ff, 0xd10003bf }, // sub sp, fp, #imm + { 0xffc003e0, 0xa94003e0 }, // ldp rt, rt2, [sp, #offs] + { 0xffc003e0, 0xa8c003e0 }, // ldp rt, rt2, [sp], #offs + { 0xffc003e0, 0xf94003e0 }, // ldr rt, [sp, #offs] + { 0xffe00fe0, 0xf84007e0 }, // ldr rt, [sp], #offs + { 0xffc003e0, 0x6d4003e0 }, // ldp dt, dt2, [sp, #offs] + { 0xffc003e0, 0x6cc003e0 }, // ldp dt, dt2, [sp], #offs + { 0xffc003e0, 0xfd4003e0 }, // ldr dt, [sp, #offs] + { 0xffe00fe0, 0xfc4007e0 }, // ldr dt, [sp], #offs +}; + + +Arm64XdataGenerator::Arm64XdataGenerator() + : m_xdataBytes(0) +{ +} + +void Arm64XdataGenerator::SafeAppendDword(DWORD value) +{ + Assert(m_xdataBytes < sizeof(this->m_xdata)); + if (m_xdataBytes < sizeof(this->m_xdata)) + { + this->m_xdata[this->m_xdataBytes / 4] = value; + } + this->m_xdataBytes += 4; +} + +void Arm64XdataGenerator::Generate(PULONG prologStart, PULONG prologEnd, PULONG epilogStart, PULONG epilogEnd, PULONG functionEnd, ULONG exceptionHandlerRva, ULONG exceptionData) +{ + Assert(prologStart != NULL); + Assert(prologEnd != NULL); + Assert(prologEnd >= prologStart); + Assert(functionEnd != NULL); + Assert(functionEnd >= prologEnd); + + if (epilogStart != NULL) + { + Assert(epilogEnd != NULL); + Assert(epilogStart >= prologEnd); + Assert(epilogEnd >= epilogStart); + Assert(functionEnd >= epilogEnd); + } + + // single records are capped to 0x40000 instructions, or 1MB total code size + // future: if needed, break functions into parts + ptrdiff_t functionLength = functionEnd - prologStart; + if (functionLength >= 0x40000) + { + // forcenative can hit this, so instead of asserting abort jit + throw Js::OperationAbortedException(); + } + + // first generate the codes for prolog + Arm64UnwindCodeGenerator generator; + BYTE unwindCodes[maxOpcodeBytes * 2]; + ULONG prologCodeBytes = generator.GeneratePrologCodes(&unwindCodes[0], sizeof(unwindCodes), prologStart, prologEnd); + + // then for the epilog + PBYTE epilogCodes = &unwindCodes[prologCodeBytes]; + ULONG epilogCodeBytes = 0; + if (epilogStart != NULL) + { + epilogCodeBytes = generator.GenerateEpilogCodes(epilogCodes, sizeof(unwindCodes) - prologCodeBytes, epilogStart, epilogEnd); + } + + // see if the epilog codes can point into the prolog codes, then compute the total size + bool epilogSubstring = (epilogCodeBytes > 0 && epilogCodeBytes <= prologCodeBytes && memcmp(epilogCodes, &unwindCodes[prologCodeBytes - epilogCodeBytes], epilogCodeBytes) == 0); + ULONG epilogCodesStart = epilogSubstring ? (prologCodeBytes - epilogCodeBytes) : prologCodeBytes; + ULONG totalCodeSize = epilogCodesStart + epilogCodeBytes; + ULONG codeWords = (totalCodeSize + 3) / 4; + + // determine if the epilog is at the very end or not + bool epilogAtEnd = (epilogEnd == functionEnd) && (epilogCodesStart < 32); + ULONG epilogCount = epilogAtEnd ? epilogCodesStart : 1; + + // determine if there is an exception handler + bool hasExceptionHandler = (exceptionHandlerRva != 0); + + // create the header -- currentely limited to "small" functions (up to 1MB in size) + this->m_xdataBytes = 0; + if (codeWords < 32) + { + this->SafeAppendDword((codeWords << 27) | (epilogCount << 22) | (epilogAtEnd << 21) | (hasExceptionHandler << 20) | (0 << 18) | ULONG(functionLength)); + } + else + { + this->SafeAppendDword((0 << 27) | (0 << 22) | (epilogAtEnd << 21) | (hasExceptionHandler << 20) | (0 << 18) | ULONG(functionLength)); + this->SafeAppendDword((codeWords << 16) | epilogCount); + } + + // if the epilog is not at the end, append the single epilog scope + if (!epilogAtEnd) + { + this->SafeAppendDword((epilogCodesStart << 22) | ULONG(epilogStart - prologStart)); + } + + // next append the prolog codes + for (ULONG curWord = 0; curWord < codeWords; curWord++) + { + this->SafeAppendDword(PULONG(&unwindCodes[0])[curWord]); + } + + // finally append the exception handler & data + if (hasExceptionHandler) + { + this->SafeAppendDword(exceptionHandlerRva); + this->SafeAppendDword(exceptionData); + } +} + + +Arm64UnwindCodeGenerator::Arm64UnwindCodeGenerator() + : m_lastPair(0), + m_lastPairOffset(0) +{ +} + +int Arm64UnwindCodeGenerator::RebaseReg(int reg) +{ + Assert(reg >= 19 && reg <= 30); + return reg - 19; +} + +int Arm64UnwindCodeGenerator::RebaseRegPair(int reg1, int reg2) +{ + int result = RebaseReg(reg1); + RebaseReg(reg2); + Assert(reg1 + 1 == reg2); + return result; +} + +int Arm64UnwindCodeGenerator::RebaseFpReg(int reg) +{ + Assert(reg >= 8 && reg <= 16); + return reg - 8; +} + +int Arm64UnwindCodeGenerator::RebaseFpRegPair(int reg1, int reg2) +{ + int result = RebaseFpReg(reg1); + RebaseFpReg(reg2); + Assert(reg1 + 1 == reg2); + return result; +} + +int Arm64UnwindCodeGenerator::RebaseOffset(int offset, int maxOffset) +{ + Assert(offset >= 0); + Assert(offset % 8 == 0); + offset /= 8; + Assert(offset < maxOffset); + return offset; +} + +ULONG Arm64UnwindCodeGenerator::SafeEncode(ULONG opcode, ULONG params) +{ + // reset tracking for save_next opcode + m_lastPair = 0; + m_lastPairOffset = 0; + return opcode | params; +} + +ULONG Arm64UnwindCodeGenerator::SafeEncodeRegPair(ULONG opcode, ULONG params, int regBase, int rebasedOffset) +{ + // only valid for those specific opcodes which can precede a save_next opcode + Assert(opcode == op_save_r19r20_x || opcode == op_save_regp || opcode == op_save_regp_x || opcode == op_save_fregp || opcode == op_save_fregp_x); + + // if this is the next register in sequence and the offset matches, encode as save next instead + if (m_lastPair + 2 == regBase && m_lastPairOffset + 2 == rebasedOffset) + { + opcode = op_save_next; + params = 0; + } + + // update the next register tracking + m_lastPair = regBase; + m_lastPairOffset = rebasedOffset; + return opcode | params; +} + +ULONG Arm64UnwindCodeGenerator::EncodeAlloc(ULONG bytes) +{ + Assert(bytes % 16 == 0); + ULONG immed = bytes / 16; + + if (immed < 0x20) + { + // alloc_s 000xxxxx: allocate small stack with size < 512 (2^5 * 16). + return this->SafeEncode(op_alloc_s, immed & 0x1f); + } + else if (immed < 0x800) + { + // alloc_m 11000xxx|xxxxxxxx: allocate large stack with size < 32k (2^11 * 16). + return this->SafeEncode(op_alloc_m, immed & 0x3ff); + } + else + { + // alloc_l 11100000|xxxxxxxx|xxxxxxxx|xxxxxxxx: allocate large stack with size < 256M + return this->SafeEncode(op_alloc_l, immed & 0xffffff); + } +} + +ULONG Arm64UnwindCodeGenerator::EncodeStoreReg(int reg, int offset) +{ + Assert(offset >= 0); + int immed = this->RebaseOffset(offset, 0x40); + int regBase = this->RebaseReg(reg); + + // save_reg 110100xx|xxzzzzzz: save reg r(19+#X) at [sp+#Z*8], offset <=504 + return this->SafeEncode(op_save_reg, ((regBase << 6) & 0x3c0) | (immed & 0x3f)); +} + +ULONG Arm64UnwindCodeGenerator::EncodeStoreRegPredec(int reg, int offset) +{ + Assert(offset < 0); + int immed = this->RebaseOffset(-offset, 0x20); + int regBase = this->RebaseReg(reg); + + // save_reg_x 1101010x|xxxzzzzz: save reg r(19+#X) at [sp-(#Z+1)*8]!, pre-indexed offset >= -256 + return this->SafeEncode(op_save_reg_x, ((regBase << 5) & 0x1e0) | (immed & 0x1f)); +} + +ULONG Arm64UnwindCodeGenerator::EncodeStorePair(int reg1, int reg2, int offset) +{ + Assert(offset >= 0); + int immed = this->RebaseOffset(offset, 0x40); + + // special case for LR as second register + if (reg2 == 30) + { + if (reg1 == 29) + { + // save_fplr 01zzzzzz: save pair at [sp+#Z*8], offset <= 504. + return this->SafeEncode(op_save_fplr, immed & 0x3f); + } + else + { + // save_lrpair 1101011x|xxzzzzzz: save pair at [sp+#Z*8], offset <= 504 + int regBase = this->RebaseReg(reg1); + Assert(regBase % 2 == 0); + regBase /= 2; + return this->SafeEncode(op_save_lrpair, ((regBase << 6) & 0x1c0) | (immed & 0x3f)); + } + } + else + { + // save_regp 110010xx|xxzzzzzz: save r(19+#X) pair at [sp+#Z*8], offset <= 504 + int regBase = this->RebaseRegPair(reg1, reg2); + return this->SafeEncodeRegPair(op_save_regp, ((regBase << 6) & 0x3c0) | (immed & 0x3f), regBase, immed); + } +} + +ULONG Arm64UnwindCodeGenerator::EncodeStorePairPredec(int reg1, int reg2, int offset) +{ + Assert(offset < 0); + int immed = this->RebaseOffset(-offset, 0x40); + int regBase = this->RebaseRegPair(reg1, reg2); + + // special case for FP/LR + if (reg1 == 29) + { + // save_fplr_x 10zzzzzz: save pair at [sp-(#Z+1)*8]!, pre-indexed offset >= -512 + return this->SafeEncode(op_save_fplr_x, immed & 0x3f); + } + else if (reg1 == 19 && immed < 0x20) + { + // save_r19r20_x 001zzzzz: save pair at [sp-#Z*8]!, pre-indexed offset >= -248 + return this->SafeEncodeRegPair(op_save_r19r20_x, immed & 0x1f, this->RebaseReg(19), 0); + } + else + { + // save_regp_x 110011xx|xxzzzzzz: save pair r(19+#X) at [sp-(#Z+1)*8]!, pre-indexed offset >= -512 + return this->SafeEncodeRegPair(op_save_regp_x, ((regBase << 6) & 0x3c0) | (immed & 0x3f), regBase, 0); + } +} + +ULONG Arm64UnwindCodeGenerator::EncodeStoreFpReg(int reg, int offset) +{ + Assert(offset >= 0); + int immed = this->RebaseOffset(offset, 0x40); + int regBase = this->RebaseFpReg(reg); + + // save_freg 1101110x|xxzzzzzz: save reg d(9+#X) at [sp+#Z*8], offset <=504 + return this->SafeEncode(op_save_freg, ((regBase << 6) & 0x1c0) | (immed & 0x3f)); +} + +ULONG Arm64UnwindCodeGenerator::EncodeStoreFpRegPredec(int reg, int offset) +{ + Assert(offset < 0); + int immed = this->RebaseOffset(-offset, 0x20); + int regBase = this->RebaseFpReg(reg); + + // save_freg_x 11011110|xxxzzzzz: save reg d(8+#X) at [sp-(#Z+1)*8]!, pre-indexed offset >= -256 + return this->SafeEncode(op_save_freg_x, ((regBase << 5) & 0xe0) | (immed & 0x1f)); +} + +ULONG Arm64UnwindCodeGenerator::EncodeStoreFpPair(int reg1, int reg2, int offset) +{ + Assert(offset >= 0); + int immed = this->RebaseOffset(offset, 0x40); + int regBase = this->RebaseFpRegPair(reg1, reg2); + + // save_fregp 1101100x|xxzzzzzz: save pair d(8+#X) at [sp+#Z*8], offset <=504 + return this->SafeEncodeRegPair(op_save_fregp, ((regBase << 6) & 0x1c0) | (immed & 0x3f), 32 + regBase, immed); +} + +ULONG Arm64UnwindCodeGenerator::EncodeStoreFpPairPredec(int reg1, int reg2, int offset) +{ + Assert(offset < 0); + int immed = this->RebaseOffset(offset, 0x40); + int regBase = this->RebaseFpRegPair(reg1, reg2); + + // save_fregp_x 1101101x|xxzzzzzz: save pair d(8+#X), at [sp-(#Z+1)*8]!, pre-indexed offset >= -512 + return this->SafeEncodeRegPair(op_save_fregp_x, ((regBase << 6) & 0x1c0) | (immed & 0x3f), 32 + regBase, 0); +} + +ULONG Arm64UnwindCodeGenerator::EncodeAddFp(int offset) +{ + Assert(offset > 0); + int immed = this->RebaseOffset(offset, 0x100); + return this->SafeEncode(op_add_fp, immed & 0xff); +} + +ULONG Arm64UnwindCodeGenerator::GenerateSingleOpcode(PULONG opcodePtr, PULONG regionStart, const OpcodeList &opcodeList) +{ + ULONG opcode = *opcodePtr; + + // SUB SP, SP, #imm / ADD SP, SP, #imm + if (opcodeList.subSpSpImm.Matches(opcode)) + { + int shift = (opcode >> 22) & 1; + ULONG bytes = ((opcode >> 10) & 0xfff) << (12 * shift); + return this->EncodeAlloc(bytes); + } + + // SUB SP, SP, reg / ADD SP, SP, reg + else if (opcodeList.subSpSpReg.Matches(opcode)) + { + int regNum = (opcode >> 16) & 31; + ULONG64 immediate = this->FindRegisterImmediate(regNum, regionStart, opcodePtr); + Assert(immediate < 0xffffff); + return this->EncodeAlloc(ULONG(immediate)); + } + + // ADD FP, SP, #imm + else if (opcodeList.addFpSpImm.Matches(opcode)) + { + int shift = (opcode >> 22) & 1; + ULONG bytes = ((opcode >> 10) & 0xfff) << (12 * shift); + if (bytes != 0) + { + return this->EncodeAddFp(bytes); + } + else + { + return this->EncodeSetFp(); + } + } + + // STP rT, rT2, [SP, #offs] / LDP rT, rT2, [SP, #offs] + else if (opcodeList.stpRtRt2SpOffs.Matches(opcode)) + { + int rt = opcode & 31; + int rt2 = (opcode >> 10) & 31; + int offset = (int32(opcode << 10) >> 25) << 3; + + // special case for homing parameters / volatile registers + if (rt < 19 && rt2 < 19) + { + return this->EncodeNop(); + } + else + { + return this->EncodeStorePair(rt, rt2, offset); + } + } + + // STP rT, rT2, [SP, #offs]! / LDP rT, rT2, [SP], #offs + else if (opcodeList.stpRtRt2SpOffsBang.Matches(opcode)) + { + int rt = opcode & 31; + int rt2 = (opcode >> 10) & 31; + int offset = (int32(opcode << 10) >> 25) << 3; + return this->EncodeStorePairPredec(rt, rt2, offset); + } + + // STR rT, [SP, #offs] / LDR rT, [SP, #offs] + else if (opcodeList.strRtSpOffs.Matches(opcode)) + { + int rt = opcode & 31; + int offset = ((opcode >> 10) & 0xfff) << 3; + return this->EncodeStoreReg(rt, offset); + } + + // STR rT, [SP, #offs]! / LDR rT, [SP], #offs + else if (opcodeList.strRtSpOffsBang.Matches(opcode)) + { + int rt = opcode & 31; + int offset = int32(opcode << 11) >> 23; + return this->EncodeStoreRegPredec(rt, offset); + } + + // STP dT, dT2, [SP, #offs] / LDP dT, dT2, [SP, #offs] + else if (opcodeList.stpDtDt2SpOffs.Matches(opcode)) + { + int rt = opcode & 31; + int rt2 = (opcode >> 10) & 31; + int offset = (int32(opcode << 10) >> 25) << 3; + return this->EncodeStoreFpPair(rt, rt2, offset); + } + + // STP dT, dT2, [SP, #offs]! / LDP dT, dT2, [SP], #offs + else if (opcodeList.stpDtDt2SpOffsBang.Matches(opcode)) + { + int rt = opcode & 31; + int rt2 = (opcode >> 10) & 31; + int offset = (int32(opcode << 10) >> 25) << 3; + return this->EncodeStoreFpPairPredec(rt, rt2, offset); + } + + // STR dT, [SP, #offs] / LDR dT, [SP, #offs] + else if (opcodeList.strDtSpOffs.Matches(opcode)) + { + int rt = opcode & 31; + int offset = ((opcode >> 10) & 0xfff) << 3; + return this->EncodeStoreFpReg(rt, offset); + } + + // STR dT, [SP, #offs]! / LDR dT, [SP], #offs + else if (opcodeList.strDtSpOffsBang.Matches(opcode)) + { + int rt = opcode & 31; + int offset = int32(opcode << 11) >> 23; + return this->EncodeStoreFpRegPredec(rt, offset); + } + + // SUB SP, SP, x15 UXTX #4 + else if (SubSpSpX15Uxtx4Opcode.Matches(opcode)) + { + ULONG64 immediate = this->FindRegisterImmediate(15, regionStart, opcodePtr); + Assert(immediate < 0xffffff / 16); + return this->EncodeAlloc(ULONG(immediate) * 16); + } + + // BLR / RET / MOVK/MOVN/MOVZ + else if (BlrOpcode.Matches(opcode) || RetOpcode.Matches(opcode) || MovkOpcode.Matches(opcode)) + { + // fall through to encode a NOP, but avoid the assert + } + + // unexpected opcode! + else + { + Assert(false); + } + + // by default just return an encoded NOP + return this->EncodeNop(); +} + +ULONG Arm64UnwindCodeGenerator::TrimNops(PULONG opcodeList, ULONG numOpcodes) +{ + ULONG count; + for (count = 0; count < numOpcodes; count++) + { + if (opcodeList[numOpcodes - 1 - count] != op_nop) + { + break; + } + } + return count; +} + +void Arm64UnwindCodeGenerator::ReverseCodes(PULONG opcodeList, ULONG numOpcodes) +{ + // simple swap-reversal + for (int index = numOpcodes / 2 - 1; index >= 0; index--) + { + ULONG temp = opcodeList[numOpcodes - 1 - index]; + opcodeList[numOpcodes - 1 - index] = opcodeList[index]; + opcodeList[index] = temp; + } +} + +ULONG Arm64UnwindCodeGenerator::EmitFinalCodes(PBYTE buffer, ULONG bufferSize, PULONG opcodes, ULONG count) +{ + ULONG outputIndex = 0; + for (ULONG opIndex = 0; opIndex < count; opIndex++) + { + ULONG opcode = opcodes[opIndex]; + + // trim unneeded bytes from the top + int numBytes = 4; + while ((opcode & 0xff000000) == 0) + { + opcode <<= 8; + numBytes -= 1; + } + + // output the final bytes + for (int curByte = 0; curByte < numBytes; curByte++) + { + if (outputIndex < bufferSize) + { + buffer[outputIndex] = (opcode >> 24) & 0xff; + } + opcode <<= 8; + outputIndex += 1; + } + } + return outputIndex; +} + +ULONG64 Arm64UnwindCodeGenerator::FindRegisterImmediate(int regNum, PULONG regionStart, PULONG regionEnd) +{ + // scan forward, looking for opcodes that assemble immediate values + ULONG64 pendingImmediate = 0; + int pendingImmediateReg = -1; + bool foundImmediate = false; + for (PULONG opcodePtr = regionStart; opcodePtr < regionEnd; opcodePtr++) + { + ULONG opcode = *opcodePtr; + + // MOVZ/MOVK/MOVN reg + if (MovkOpcode.Matches(opcode)) + { + // MOVK (opc == 3) should only ever modify a previously-written register + int opc = (opcode >> 29) & 3; + int rd = opcode & 31; + if (opc == 3) + { + Assert(pendingImmediateReg == rd); + } + pendingImmediateReg = rd; + + // Skip the rest if this isn't our target register + if (rd != regNum) + { + continue; + } + foundImmediate = true; + + // MOVN (opc == 0) sign-extends + int64 val = (opcode >> 5) & 0xffff; + if (opc == 0) + { + val = int16(val); + } + + // apply shift + int shift = 16 * ((opcode >> 21) & 3); + val <<= shift; + + // 32-bit operations clear the upper 32 bits + if ((opcode & 0x80000000) == 0) + { + val &= 0xffffffff; + } + + // MOVK (opc == 3) inserts into existing register; MOVN/MOVZ replace the whole value + if (opc == 3) + { + pendingImmediate = (pendingImmediate & ~(0xffff << shift)) | val; + } + else + { + pendingImmediate = val; + } + } + } + + // make sure we found something + Assert(foundImmediate); + return pendingImmediate; +} + +ULONG Arm64UnwindCodeGenerator::GeneratePrologCodes(PBYTE buffer, ULONG bufferSize, PULONG &prologStart, PULONG &prologEnd) +{ + Assert(prologStart != NULL); + Assert(prologEnd != NULL); + Assert(prologStart <= prologEnd); + + // verify against internal buffer size; truncate if out of bounds + ULONG numOpcodes = ULONG(prologEnd - prologStart); + Assert(numOpcodes <= MAX_INSTRUCTIONS); + if (numOpcodes > MAX_INSTRUCTIONS) + { + prologEnd = prologStart + MAX_INSTRUCTIONS; + numOpcodes = MAX_INSTRUCTIONS; + } + + // iterate over all prolog opcodes in forward order to produce the list of unwind opcodes + ULONG opcodeList[MAX_INSTRUCTIONS + 1]; + for (ULONG opIndex = 0; opIndex < numOpcodes; opIndex++) + { + opcodeList[opIndex] = this->GenerateSingleOpcode(&prologStart[opIndex], prologStart, PrologOpcodes); + } + + // trim out any trailing nops (they can be safely ignored) + int trimmed = this->TrimNops(opcodeList, numOpcodes); + prologEnd -= trimmed; + numOpcodes -= trimmed; + + // reverse the codes and append an end + this->ReverseCodes(opcodeList, numOpcodes); + + // don't trim initial NOPs because we want the function start to remain as-is + + // append an end and return the final size + opcodeList[numOpcodes++] = this->EncodeEnd(); + return this->EmitFinalCodes(buffer, bufferSize, opcodeList, numOpcodes); +} + +ULONG Arm64UnwindCodeGenerator::GenerateEpilogCodes(PBYTE buffer, ULONG bufferSize, PULONG &epilogStart, PULONG &epilogEnd) +{ + Assert(epilogStart != NULL); + Assert(epilogEnd != NULL); + Assert(epilogStart <= epilogEnd); + + // verify against internal buffer size; truncate if out of bounds + ULONG numOpcodes = ULONG(epilogEnd - epilogStart); + Assert(numOpcodes <= MAX_INSTRUCTIONS); + if (numOpcodes > MAX_INSTRUCTIONS) + { + epilogStart = epilogEnd - MAX_INSTRUCTIONS; + numOpcodes = MAX_INSTRUCTIONS; + } + + // iterate over all epilog opcodes in reverse order to produce the list of unwind opcodes + ULONG opcodeList[MAX_INSTRUCTIONS + 1]; + for (ULONG opIndex = 0; opIndex < numOpcodes; opIndex++) + { + opcodeList[opIndex] = this->GenerateSingleOpcode(&epilogStart[numOpcodes - 1 - opIndex], epilogStart, EpilogOpcodes); + } + + // trim out any trailing nops (they can be safely ignored) + int trimmed = this->TrimNops(opcodeList, numOpcodes); + epilogStart += trimmed; + numOpcodes -= trimmed; + + // reverse the codes and append an end + this->ReverseCodes(opcodeList, numOpcodes); + + // trim out any newly trailing nops + trimmed = this->TrimNops(opcodeList, numOpcodes); + epilogEnd -= trimmed; + numOpcodes -= trimmed; + + // but add back in the implicit RET + epilogEnd += 1; + + // append an end and return the final size + opcodeList[numOpcodes++] = this->EncodeEnd(); + return this->EmitFinalCodes(buffer, bufferSize, opcodeList, numOpcodes); +} diff --git a/deps/chakrashim/core/lib/Backend/arm64/ARM64UnwindEncoder.h b/deps/chakrashim/core/lib/Backend/arm64/ARM64UnwindEncoder.h new file mode 100644 index 00000000000..b248cd1bcfa --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/ARM64UnwindEncoder.h @@ -0,0 +1,162 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +class Arm64XdataGenerator +{ +public: + Arm64XdataGenerator(); + + void Generate(PULONG prologStart, PULONG prologEnd, PULONG epilogStart, PULONG epilogEnd, PULONG functionEnd, ULONG exceptionHandlerRva = 0, ULONG exceptionData = 0); + + const VOID *GetXdata() const { return &this->m_xdata[0]; } + ULONG GetXdataBytes() const { return this->m_xdataBytes; } + + // xdata opcodes map 1:1 with instructions; compute an estimated maximum + // instructions for prolog/epilog: + // 4: 2xMOV + BL + SUB for allocation (worst case assumes _chkstk call) + // 4: STP for homing parameters (x0-x7) + // 6: STP for saving integer non-vols in pairs (x19-x28 plus fp/lr) + // 4: STP for saving FP non-vols in pairs (d8-d16) + // =18, round up to 20 instructions for flotsam (extra no-ops) + // Assume 2 bytes/opcode on average (one opcode is 4 bytes; many are only 1) + // Plus a factor of 2 because prolog and epilog can each have a list + static const ULONG maxOpcodeBytes = 20 * 2 * 2; + + // xdata consists of a few header words plus opcodes for prolog and epilog: + // 8: up to 2 header words + // 4: possibly 1 exception scope + // MOB: opcode bytes + // 8: exception handler + data + static const ULONG maxXdataSize = 8 + 4 + maxOpcodeBytes + 8; + +private: + void SafeAppendDword(DWORD value); + + ULONG m_xdata[(maxXdataSize + 3) / 4]; + ULONG m_xdataBytes; +}; + +struct OpcodeMatcher +{ + bool Matches(ULONG opcode) const { return (opcode & this->mask) == this->pattern; } + + ULONG mask; + ULONG pattern; +}; + +struct OpcodeList +{ + OpcodeMatcher subSpSpImm; // sub sp, sp, #imm / add sp, sp, #imm [epilog] + OpcodeMatcher subSpSpReg; // sub sp, sp, reg / add sp, sp, reg [epilog] + OpcodeMatcher addFpSpImm; // add fp, sp, #imm + OpcodeMatcher stpRtRt2SpOffs; // stp rt, rt2, [sp, #offs] / ldp rt, rt2, [sp, #offs] + OpcodeMatcher stpRtRt2SpOffsBang; // stp rt, rt2, [sp, #offs]! / ldp rt, rt2, [sp], #offs + OpcodeMatcher strRtSpOffs; // str rt, [sp, #offs] / ldr rt, [sp, #offs] + OpcodeMatcher strRtSpOffsBang; // str rt, [sp, #offs]! / ldr rt, [sp], #offs + OpcodeMatcher stpDtDt2SpOffs; // stp dt, dt2, [sp, #offs] / ldp dt, dt2, [sp, #offs] + OpcodeMatcher stpDtDt2SpOffsBang; // stp dt, dt2, [sp, #offs]! / ldp dt, dt2, [sp], #offs + OpcodeMatcher strDtSpOffs; // str dt, [sp, #offs] / ldr dt, [sp, #offs] + OpcodeMatcher strDtSpOffsBang; // str dt, [sp, #offs]! / ldr dt, [sp], #offs +}; + +class Arm64UnwindCodeGenerator +{ + // opcodes as defined by the Windows ARM64 Exception Data document + static const ULONG op_alloc_s = 0x00; // 000xxxxx: allocate small stack with size < 512 (2^5 * 16). + static const ULONG op_save_r19r20_x = 0x20; // 001zzzzz: save pair at [sp-#Z*8]!, pre-indexed offset >= -248 + static const ULONG op_save_fplr = 0x40; // 01zzzzzz: save pair at [sp+#Z*8], offset <= 504. + static const ULONG op_save_fplr_x = 0x80; // 10zzzzzz: save pair at [sp-(#Z+1)*8]!, pre-indexed offset >= -512 + static const ULONG op_alloc_m = 0xc000; // 11000xxx|xxxxxxxx: allocate large stack with size < 32k (2^11 * 16). + static const ULONG op_save_regp = 0xc800; // 110010xx|xzzzzzz: save r(19+#X) pair at [sp+#Z*8], offset <= 504 + static const ULONG op_save_regp_x = 0xcc00; // 110011xx|xxzzzzzz: save pair r(19+#X) at [sp-(#Z+1)*8]!, pre-indexed offset >= -512 + static const ULONG op_save_reg = 0xd000; // 110100xx|xxzzzzzz: save reg r(19+#X) at [sp+#Z*8], offset <=504 + static const ULONG op_save_reg_x = 0xd400; // 1101010x|xxxzzzzz: save reg r(19+#X) at [sp-(#Z+1)*8]!, pre-indexed offset >= -256 + static const ULONG op_save_lrpair = 0xd600; // 1101011x|xxzzzzzz: save pair at [sp+#Z*8], offset <= 504 + static const ULONG op_save_fregp = 0xd800; // 1101100x|xxzzzzzz: save pair d(8+#X) at [sp+#Z*8], offset <=504 + static const ULONG op_save_fregp_x = 0xda00; // 1101101x|xxzzzzzz: save pair d(8+#X), at [sp-(#Z+1)*8]!, pre-indexed offset >= -512 + static const ULONG op_save_freg = 0xdc00; // 1101110x|xxzzzzzz: save reg d(9+#X) at [sp+#Z*8], offset <=504 + static const ULONG op_save_freg_x = 0xde00; // 11011110|xxxzzzzz: save reg d(8+#X) at [sp-(#Z+1)*8]!, pre-indexed offset >= -256 + static const ULONG op_alloc_l = 0xe0000000; // 11100000|xxxxxxxx|xxxxxxxx|xxxxxxxx: allocate large stack with size < 256M + static const ULONG op_set_fp = 0xe1; // 11100001: set up r29: with: mov r29,sp + static const ULONG op_add_fp = 0xe200; // 11100010|xxxxxxxx: set up r29 with: add r29,sp,#x*8 + static const ULONG op_nop = 0xe3; // 11100011: no unwind operation is required. + static const ULONG op_end = 0xe4; // 11100100: end of unwind code + static const ULONG op_end_c = 0xe5; // 11100101: end of unwind code in current chained scope. + static const ULONG op_save_next = 0xe6; // 11100110: save next non-volatile Int or FP register pair.** + + // maximum instructions in the internal buffer, figuring: + // +4 for worst-case stack allocation (via chkstk) + // +6 for saving integer non-volatiles + // +4 for saving FP non-volatiles + // +4 for homing paramters + // +1 for setting up/recovering frame pointer + // +1 for return + // +12 for random things and to be safe and to make a nice power of 2 + static const ULONG MAX_INSTRUCTIONS = 32; + +public: + Arm64UnwindCodeGenerator(); + + // generate the code for a prolog or epilog as appropriate + ULONG GeneratePrologCodes(PBYTE buffer, ULONG bufferSize, PULONG &prologStart, PULONG &prologEnd); + ULONG GenerateEpilogCodes(PBYTE buffer, ULONG bufferSize, PULONG &epilogStart, PULONG &epilogEnd); + +private: + // internal helpers + ULONG GenerateSingleOpcode(PULONG pOpcode, PULONG pRegionStart, const OpcodeList &opcodeList); + ULONG TrimNops(PULONG opcodeList, ULONG numOpcodes); + void ReverseCodes(PULONG opcodeList, ULONG numOpcodes); + ULONG64 FindRegisterImmediate(int regNum, PULONG registerStart, PULONG regionEnd); + ULONG EmitFinalCodes(PBYTE buffer, ULONG bufferSize, PULONG opcodes, ULONG count); + + // encode an opcode and parameters, up to 4 bytes depending on the opcode + ULONG SafeEncode(ULONG opcode, ULONG params); + + // encode an opcode and parameters for a register pair saving operation + ULONG SafeEncodeRegPair(ULONG opcode, ULONG params, int regBase, int rebasedOffset); + + // rebase registers and offets as needed for opcodes + int RebaseReg(int reg); + int RebaseRegPair(int reg1, int reg2); + int RebaseFpReg(int reg); + int RebaseFpRegPair(int reg1, int reg2); + int RebaseOffset(int offset, int maxOffset); + + // specific encoders + ULONG EncodeAlloc(ULONG bytes); + ULONG EncodeStoreReg(int reg, int offset); + ULONG EncodeStoreRegPredec(int reg, int offset); + ULONG EncodeStorePair(int reg1, int reg2, int offset); + ULONG EncodeStorePairPredec(int reg1, int reg2, int offset); + ULONG EncodeStoreFpReg(int reg, int offset); + ULONG EncodeStoreFpRegPredec(int reg, int offset); + ULONG EncodeStoreFpPair(int reg1, int reg2, int offset); + ULONG EncodeStoreFpPairPredec(int reg1, int reg2, int offset); + ULONG EncodeAddFp(int offset); + + // simple inline encoders + ULONG EncodeSetFp() { return this->SafeEncode(op_set_fp, 0); } + ULONG EncodeNop() { return this->SafeEncode(op_nop, 0); } + ULONG EncodeEnd() { return this->SafeEncode(op_end, 0); } + + // save_next tracking + int m_lastPair; + int m_lastPairOffset; + + // immediate tracking + int64 m_pendingImmediate; + int m_pendingImmediateReg; + + // fixed opcodes + static const OpcodeMatcher MovkOpcode; + static const OpcodeMatcher BlrOpcode; + static const OpcodeMatcher RetOpcode; + static const OpcodeMatcher SubSpSpX15Uxtx4Opcode; + + // specific opcodes for prologs vs. epilogs + static const OpcodeList PrologOpcodes; + static const OpcodeList EpilogOpcodes; +}; diff --git a/deps/chakrashim/core/lib/Backend/arm64/ARMEncode.h b/deps/chakrashim/core/lib/Backend/arm64/ARMEncode.h deleted file mode 100644 index 401461f4095..00000000000 --- a/deps/chakrashim/core/lib/Backend/arm64/ARMEncode.h +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -//------------------------------------------------------------------------------------------------------- -#pragma once - -// -// Contains constants and tables used by the encoder. -// -// #include "AssemblyStep.h" - -//THUMB2 specific decl -typedef unsigned int ENCODE_32; - -//Add more, if required -#define IS_CONST_01FFFFFF(x) (((x) & ~0x01ffffff) == 0) - -//Add more, if required -#define IS_CONST_NEG_26(x) (((x) & ~0x01ffffff) == ~0x01ffffff) - -//Add more, if required -#define IS_CONST_INT26(x) (IS_CONST_01FFFFFF(x) || IS_CONST_NEG_26(x)) diff --git a/deps/chakrashim/core/lib/Backend/arm64/EncoderMD.cpp b/deps/chakrashim/core/lib/Backend/arm64/EncoderMD.cpp index 088f644c78e..786ce6a16ef 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/EncoderMD.cpp +++ b/deps/chakrashim/core/lib/Backend/arm64/EncoderMD.cpp @@ -3,28 +3,1636 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "Backend.h" -#include "ARMEncode.h" +#include "ARM64Encoder.h" +#include "ARM64NeonEncoder.h" +#include "Language/JavascriptFunctionArgIndex.h" + +static const uint32 Opdope[] = +{ +#define MACRO(name, jnLayout, attrib, byte2, form, opbyte, dope, ...) dope, +#include "MdOpCodes.h" +#undef MACRO +}; + +DWORD +EncoderMD::BranchOffset_26(int64 x) +{ + Assert(IS_CONST_INT26(x >> 1)); + Assert((x & 0x3) == 0); + x = x >> 2; + return (DWORD) x; +} + +///---------------------------------------------------------------------------- +/// +/// EncoderMD::Init +/// +///---------------------------------------------------------------------------- + +void +EncoderMD::Init(Encoder *encoder) +{ + m_encoder = encoder; + m_relocList = nullptr; +} + +///---------------------------------------------------------------------------- +/// +/// EncoderMD::GetRegEncode +/// +/// Get the encoding of a given register. +/// +///---------------------------------------------------------------------------- + +const BYTE +EncoderMD::GetRegEncode(IR::RegOpnd *regOpnd) +{ + return GetRegEncode(regOpnd->GetReg()); +} + +const BYTE +EncoderMD::GetRegEncode(RegNum reg) +{ + return RegEncode[reg]; +} + +const BYTE +EncoderMD::GetFloatRegEncode(IR::RegOpnd *regOpnd) +{ + BYTE regEncode = GetRegEncode(regOpnd->GetReg()); + AssertMsg(regEncode <= LAST_FLOAT_REG_ENCODE, "Impossible to allocate higher registers on VFP"); + return regEncode; +} + +///---------------------------------------------------------------------------- +/// +/// EncoderMD::GetOpdope +/// +/// Get the dope vector of a particular instr. The dope vector describes +/// certain properties of an instr. +/// +///---------------------------------------------------------------------------- + +uint32 +EncoderMD::GetOpdope(IR::Instr *instr) +{ + return GetOpdope(instr->m_opcode); +} + +uint32 +EncoderMD::GetOpdope(Js::OpCode op) +{ + return Opdope[op - (Js::OpCode::MDStart+1)]; +} + +// +// EncoderMD::CanonicalizeInstr : +// Put the instruction in its final form for encoding. This may involve +// expanding a pseudo-op such as LEA or changing an opcode to indicate the +// op bits the encoder should use. +// +// Return the size of the final instruction's encoding. +// + +bool EncoderMD::CanonicalizeInstr(IR::Instr* instr) +{ + if (!instr->IsLowered()) + { + return false; + } + + if (instr->m_opcode == Js::OpCode::LEA) + { + this->CanonicalizeLea(instr); + } + + return true; +} + +void EncoderMD::CanonicalizeLea(IR::Instr * instr) +{ + int32 offset; + + IR::Opnd* src1 = instr->UnlinkSrc1(); + + if (src1->IsSymOpnd()) + { + RegNum baseReg; + // We may as well turn this LEA into the equivalent ADD instruction and let the common ADD + // logic handle it. + IR::SymOpnd *symOpnd = src1->AsSymOpnd(); + + this->BaseAndOffsetFromSym(symOpnd, &baseReg, &offset, this->m_func); + symOpnd->Free(this->m_func); + instr->SetSrc1(IR::RegOpnd::New(nullptr, baseReg, TyMachReg, this->m_func)); + Assert(IS_CONST_00000FFF(offset) || IS_CONST_00FFF000(offset)); + instr->SetSrc2(IR::IntConstOpnd::New(offset, TyMachReg, this->m_func)); + } + else + { + IR::IndirOpnd *indirOpnd = src1->AsIndirOpnd(); + IR::RegOpnd *baseOpnd = indirOpnd->GetBaseOpnd(); + IR::RegOpnd *indexOpnd = indirOpnd->GetIndexOpnd(); + offset = indirOpnd->GetOffset(); + + Assert(offset == 0 || indexOpnd == nullptr); + instr->SetSrc1(baseOpnd); + + if (indexOpnd) + { + AssertMsg(indirOpnd->GetScale() == 0, "NYI Needs shifted register support for ADD"); + instr->SetSrc2(indexOpnd); + } + else + { + // We want to emit a legal instruction + Assert(IS_CONST_00000FFF(offset) || IS_CONST_00FFF000(offset)); + instr->SetSrc2(IR::IntConstOpnd::New(offset, TyMachReg, this->m_func)); + } + indirOpnd->Free(this->m_func); + } + instr->m_opcode = Js::OpCode::ADD; +} bool -EncoderMD::EncodeImmediate16(int32 constant, DWORD * result) +EncoderMD::DecodeMemoryOpnd(IR::Opnd* opnd, ARM64_REGISTER &baseRegResult, ARM64_REGISTER &indexRegResult, BYTE &indexScale, int32 &offset) +{ + RegNum baseReg; + + if (opnd->IsSymOpnd()) + { + IR::SymOpnd *symOpnd = opnd->AsSymOpnd(); + + this->BaseAndOffsetFromSym(symOpnd, &baseReg, &offset, this->m_func); + baseRegResult = this->GetRegEncode(baseReg); + return false; + } + else + { + IR::IndirOpnd *indirOpnd = opnd->AsIndirOpnd(); + IR::RegOpnd *baseOpnd = indirOpnd->GetBaseOpnd(); + IR::RegOpnd *indexOpnd = indirOpnd->GetIndexOpnd(); + offset = indirOpnd->GetOffset(); + + Assert(offset == 0 || indexOpnd == nullptr); + baseRegResult = this->GetRegEncode(baseOpnd); + + if (indexOpnd) + { + indexRegResult = this->GetRegEncode(indexOpnd); + indexScale = indirOpnd->GetScale(); + return true; + } + else + { + return false; + } + } +} + +template +int EncoderMD::EmitOp1Register64(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc64 reg64) { - if (constant > 0xFFFF) + IR::Opnd* src1 = instr->GetSrc1(); + Assert(src1->IsRegOpnd()); + Assert(src1->GetSize() == 8); + + return reg64(Emitter, this->GetRegEncode(src1->AsRegOpnd())); +} + +template +int EncoderMD::EmitOp2Register(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + + int size = dst->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == src1->GetSize()); + + if (size == 8) + { + return reg64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd())); + } + else { - return FALSE; + return reg32(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd())); } +} + +template +int EncoderMD::EmitOp3Register(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); - DWORD encode = (constant & 0xFFFF) << 5; + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); - *result |= encode; - return TRUE; + int size = dst->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == src1->GetSize()); + Assert(size == src2->GetSize()); + + if (size == 8) + { + return reg64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), this->GetRegEncode(src2->AsRegOpnd())); + } + else + { + return reg32(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), this->GetRegEncode(src2->AsRegOpnd())); + } } -ENCODE_32 -EncoderMD::BranchOffset_26(int64 x) +template +int EncoderMD::EmitOp3RegisterShifted(Arm64CodeEmitter &Emitter, IR::Instr* instr, SHIFT_EXTEND_TYPE shiftType, int shiftAmount, _RegFunc32 reg32, _RegFunc64 reg64) { - Assert(IS_CONST_INT26(x >> 1)); - Assert((x & 0x3) == 0); - x = x >> 2; - return (ENCODE_32) x; + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); + + int size = dst->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == src1->GetSize()); + Assert(size == src2->GetSize()); + + if (size == 8) + { + return reg64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), Arm64RegisterParam(this->GetRegEncode(src2->AsRegOpnd()), shiftType, shiftAmount & 63)); + } + else + { + return reg32(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), Arm64RegisterParam(this->GetRegEncode(src2->AsRegOpnd()), shiftType, shiftAmount & 31)); + } +} + +template +int EncoderMD::EmitOp3Immediate(Arm64CodeEmitter &Emitter, IR::Instr* instr, _ImmFunc32 imm32, _ImmFunc64 imm64) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsImmediateOpnd()); + + int size = dst->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == src1->GetSize()); + + int64 immediate = src2->GetImmediateValue(instr->m_func); + if (size == 8) + { + return imm64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), ULONG64(immediate)); + } + else + { + return imm32(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), ULONG(immediate)); + } +} + +template +int EncoderMD::EmitOp3RegisterOrImmediate(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64, _ImmFunc32 imm32, _ImmFunc64 imm64) +{ + if (instr->GetSrc2()->IsImmediateOpnd()) + { + return this->EmitOp3Immediate(Emitter, instr, imm32, imm64); + } + else if (instr->GetSrc2()->IsRegOpnd()) + { + return this->EmitOp3Register(Emitter, instr, reg32, reg64); + } + else + { + AssertMsg(false, "EmitOp3RegisterOrImmediate failed to encode"); + return 0; + } +} + +template +int EncoderMD::EmitOp3RegisterOrImmediateExtendSPReg(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64, _ImmFunc32 imm32, _ImmFunc64 imm64) +{ + // if we have two regopnds as sources, then we need to be careful + if (instr->GetSrc1()->IsRegOpnd() && instr->GetSrc2()->IsRegOpnd()) + { + IR::RegOpnd* src1 = instr->GetSrc1()->AsRegOpnd(); + IR::RegOpnd* src2 = instr->GetSrc2()->AsRegOpnd(); + IR::RegOpnd* dst = instr->GetDst()->AsRegOpnd(); + AssertMsg(!(src1->GetReg() == RegSP && src2->GetReg() == RegSP), "Tried to encode an add or sub that used RegSP as both sources - tighten legalization restrictions!"); + + // We need to swap the parameters if + // 1. src2 is RegSP + // 2. src1 is RegZR and dst is RegSP + // This is because the valid instruction forms are + // add Rd, Rs, Rw_SFT + // add Rd|SP, Rs|SP, Rw_EXT + // and the encoding for SP is the same as the encoding for ZR + if (src2->GetReg() == RegSP || (src1->GetReg() == RegZR && dst->GetReg() == RegSP)) + { + // We can only really do this for addition, so we failfast if it's a sub + AssertOrFailFastMsg(instr->m_opcode != Js::OpCode::SUB && instr->m_opcode != Js::OpCode::SUBS, "Tried to encode a SUB/SUBS with RegSP as the second operand or as the dest with RegZR in first operand - tighten legalization restrictions!"); + // We need to swap the arguments + instr->UnlinkSrc1(); + instr->UnlinkSrc2(); + instr->SetSrc1(src2); + instr->SetSrc2(src1); + IR::RegOpnd* temp = src1; + src1 = src2; + src2 = temp; + } + + // The extended form of the instruction takes RegSP for dst and src1 and RegZR for src2 + if (src1->GetReg() == RegSP || instr->GetDst()->AsRegOpnd()->GetReg() == RegSP) + { + // EXTEND_UXTX effectively means LSL here, just that LSL is a shift, not an extend, operation + // Regardless, we do it by 0, so it should just be directly using the register + return this->EmitOp3RegisterShifted(Emitter, instr, EXTEND_UXTX, 0, reg32, reg64); + } + } + + return EmitOp3RegisterOrImmediate(Emitter, instr, reg32, reg64, imm32, imm64); +} + +int EncoderMD::EmitPrefetch(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd) +{ + Assert(memOpnd->IsIndirOpnd() || memOpnd->IsSymOpnd()); + + ARM64_REGISTER indexReg; + ARM64_REGISTER baseReg; + BYTE indexScale; + int32 offset; + if (DecodeMemoryOpnd(memOpnd, baseReg, indexReg, indexScale, offset)) + { + return EmitPrfmRegister(Emitter, baseReg, Arm64RegisterParam(indexReg, SHIFT_LSL, indexScale)); + } + else + { + return EmitPrfmOffset(Emitter, baseReg, offset); + } +} + +template +int EncoderMD::EmitLoadStore(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd, IR::Opnd* srcDstOpnd, _RegFunc8 reg8, _RegFunc16 reg16, _RegFunc32 reg32, _RegFunc64 reg64, _OffFunc8 off8, _OffFunc16 off16, _OffFunc32 off32, _OffFunc64 off64) +{ + Assert(srcDstOpnd->IsRegOpnd()); + Assert(memOpnd->IsIndirOpnd() || memOpnd->IsSymOpnd()); + + int size = memOpnd->GetSize(); + Assert(size == 1 || size == 2 || size == 4 || size == 8); + + ARM64_REGISTER indexReg; + ARM64_REGISTER baseReg; + BYTE indexScale; + int32 offset; + if (DecodeMemoryOpnd(memOpnd, baseReg, indexReg, indexScale, offset)) + { + if (size == 8) + { + return reg64(Emitter, this->GetRegEncode(srcDstOpnd->AsRegOpnd()), baseReg, Arm64RegisterParam(indexReg, SHIFT_LSL, indexScale)); + } + else if (size == 4) + { + return reg32(Emitter, this->GetRegEncode(srcDstOpnd->AsRegOpnd()), baseReg, Arm64RegisterParam(indexReg, SHIFT_LSL, indexScale)); + } + else if (size == 2) + { + return reg16(Emitter, this->GetRegEncode(srcDstOpnd->AsRegOpnd()), baseReg, Arm64RegisterParam(indexReg, SHIFT_LSL, indexScale)); + } + else + { + return reg8(Emitter, this->GetRegEncode(srcDstOpnd->AsRegOpnd()), baseReg, Arm64RegisterParam(indexReg, SHIFT_LSL, indexScale)); + } + } + else + { + if (size == 8) + { + return off64(Emitter, this->GetRegEncode(srcDstOpnd->AsRegOpnd()), baseReg, offset); + } + else if (size == 4) + { + return off32(Emitter, this->GetRegEncode(srcDstOpnd->AsRegOpnd()), baseReg, offset); + } + else if (size == 2) + { + return off16(Emitter, this->GetRegEncode(srcDstOpnd->AsRegOpnd()), baseReg, offset); + } + else + { + return off8(Emitter, this->GetRegEncode(srcDstOpnd->AsRegOpnd()), baseReg, offset); + } + } +} + +template +int EncoderMD::EmitLoadStorePair(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd, IR::Opnd* srcDst1Opnd, IR::Opnd* srcDst2Opnd, _OffFunc32 off32, _OffFunc64 off64) +{ + Assert(memOpnd->IsIndirOpnd() || memOpnd->IsSymOpnd()); + + int size = memOpnd->GetSize(); + Assert(size == 4 || size == 8); + + ARM64_REGISTER indexReg; + ARM64_REGISTER baseReg; + BYTE indexScale; + int32 offset; + if (DecodeMemoryOpnd(memOpnd, baseReg, indexReg, indexScale, offset)) + { + // Should never get here + AssertMsg(false, "EmitLoadStorePair failed to encode"); + return 0; + } + else + { + if (size == 8) + { + return off64(Emitter, this->GetRegEncode(srcDst1Opnd->AsRegOpnd()), this->GetRegEncode(srcDst2Opnd->AsRegOpnd()), baseReg, offset); + } + else + { + return off32(Emitter, this->GetRegEncode(srcDst1Opnd->AsRegOpnd()), this->GetRegEncode(srcDst2Opnd->AsRegOpnd()), baseReg, offset); + } + } +} + +template +int EncoderMD::EmitUnconditionalBranch(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Emitter emitter) +{ + ArmBranchLinker Linker; + EncodeReloc::New(&m_relocList, RelocTypeBranch26, m_pc, instr->AsBranchInstr()->GetTarget(), m_encoder->m_tempAlloc); + Linker.SetTarget(Emitter); + return emitter(Emitter, Linker); +} + +int EncoderMD::EmitConditionalBranch(Arm64CodeEmitter &Emitter, IR::Instr* instr, int condition) +{ + ArmBranchLinker Linker; + EncodeReloc::New(&m_relocList, RelocTypeBranch19, m_pc, instr->AsBranchInstr()->GetTarget(), m_encoder->m_tempAlloc); + Linker.SetTarget(Emitter); + return EmitBranch(Emitter, Linker, condition); +} + +template +int EncoderMD::EmitCompareAndBranch(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Emitter emitter, _Emitter64 emitter64) +{ + IR::Opnd* src1 = instr->GetSrc1(); + Assert(src1->IsRegOpnd()); + + int size = src1->GetSize(); + Assert(size == 4 || size == 8); + + ArmBranchLinker Linker; + EncodeReloc::New(&m_relocList, RelocTypeBranch19, m_pc, instr->AsBranchInstr()->GetTarget(), m_encoder->m_tempAlloc); + Linker.SetTarget(Emitter); + + if (size == 8) + { + return emitter64(Emitter, this->GetRegEncode(src1->AsRegOpnd()), Linker); + } + else + { + return emitter(Emitter, this->GetRegEncode(src1->AsRegOpnd()), Linker); + } +} + +template +int EncoderMD::EmitTestAndBranch(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Emitter emitter) +{ + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + Assert(src1->IsRegOpnd()); + Assert(src2->IsImmediateOpnd()); + + ArmBranchLinker Linker; + EncodeReloc::New(&m_relocList, RelocTypeBranch14, m_pc, instr->AsBranchInstr()->GetTarget(), m_encoder->m_tempAlloc); + Linker.SetTarget(Emitter); + + int64 immediate = src2->GetImmediateValue(instr->m_func); + Assert(immediate >= 0 && immediate < 64); + return emitter(Emitter, this->GetRegEncode(src1->AsRegOpnd()), ULONG(immediate), Linker); +} + +template +int EncoderMD::EmitMovConstant(Arm64CodeEmitter &Emitter, IR::Instr *instr, _Emitter emitter, _Emitter64 emitter64) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsImmediateOpnd() || src1->IsLabelOpnd()); + Assert(src2->IsIntConstOpnd()); + + int size = dst->GetSize(); + Assert(size == 4 || size == 8); + + uint32 shift = src2->AsIntConstOpnd()->AsUint32(); + Assert(shift < 32 || size == 8); + Assert(shift == 0 || shift == 16 || (size == 8 && (shift == 32 || shift == 48))); + + IntConstType immediate = 0; + if (src1->IsImmediateOpnd()) + { + immediate = src1->GetImmediateValue(instr->m_func); + } + else + { + Assert(src1->IsLabelOpnd()); + IR::LabelInstr* labelInstr = src1->AsLabelOpnd()->GetLabel(); + + if (labelInstr->m_isDataLabel) + { + // If the label is a data label, we don't know the label address yet so handle it as a reloc. + EncodeReloc::New(&m_relocList, RelocTypeLabelImmed, m_pc, labelInstr, m_encoder->m_tempAlloc); + immediate = 0; + } + else + { + // Here the LabelOpnd's offset is a post-lower immediate value; we need + // to mask in just the part indicated by our own shift amount, and send + // that along as our immediate load value. + uintptr_t fullvalue = labelInstr->GetOffset(); + immediate = (fullvalue >> shift) & 0xffff; + } + } + + Assert((immediate & 0xFFFF) == immediate); + + if (size == 8) + { + return emitter64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), ULONG(immediate), shift); + } + else + { + return emitter(Emitter, this->GetRegEncode(dst->AsRegOpnd()), ULONG(immediate), shift); + } +} + +template +int EncoderMD::EmitBitfield(Arm64CodeEmitter &Emitter, IR::Instr *instr, _Emitter emitter, _Emitter64 emitter64) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsImmediateOpnd()); + + int size = dst->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == src1->GetSize()); + + IntConstType immediate = src2->GetImmediateValue(instr->m_func); + int start = immediate & 0x3f; + int length = (immediate >> 16) & 0x3f; + Assert(start >= 0 && start < 8 * size); + Assert(length >= 0 && length < 8 * size); + + if (size == 8) + { + return emitter64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), start, length); + } + else + { + return emitter(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), start, length); + } +} + +template +int EncoderMD::EmitConditionalSelect(Arm64CodeEmitter &Emitter, IR::Instr *instr, int condition, _Emitter emitter, _Emitter64 emitter64) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); + + int size = dst->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == src1->GetSize()); + Assert(size == src2->GetSize()); + + if (size == 8) + { + return emitter64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), this->GetRegEncode(src2->AsRegOpnd()), condition); + } + else + { + return emitter(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), this->GetRegEncode(src2->AsRegOpnd()), condition); + } +} + +template +int EncoderMD::EmitOp2FpRegister(Arm64CodeEmitter &Emitter, IR::Instr *instr, _Emitter emitter) +{ + return EmitOp2FpRegister(Emitter, instr->GetDst(), instr->GetSrc1(), emitter); +} + +template +int EncoderMD::EmitOp2FpRegister(Arm64CodeEmitter &Emitter, IR::Opnd* opnd1, IR::Opnd* opnd2, _Emitter emitter) +{ + Assert(opnd1->IsRegOpnd()); + Assert(opnd2->IsRegOpnd()); + + int size = opnd1->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == opnd2->GetSize()); + + NEON_SIZE neonSize = (size == 8) ? SIZE_1D : SIZE_1S; + + return emitter(Emitter, this->GetFloatRegEncode(opnd1->AsRegOpnd()), this->GetFloatRegEncode(opnd2->AsRegOpnd()), neonSize); +} + +template +int EncoderMD::EmitOp3FpRegister(Arm64CodeEmitter &Emitter, IR::Instr *instr, _Emitter emitter) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); + + int size = dst->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == src1->GetSize()); + Assert(size == src2->GetSize()); + + NEON_SIZE neonSize = (size == 8) ? SIZE_1D : SIZE_1S; + + return emitter(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), this->GetFloatRegEncode(src1->AsRegOpnd()), this->GetFloatRegEncode(src2->AsRegOpnd()), neonSize); +} + +template +int EncoderMD::EmitLoadStoreFp(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd, IR::Opnd* srcDstOpnd, _LoadStoreFunc loadStore) +{ + Assert(srcDstOpnd->IsRegOpnd()); + Assert(memOpnd->IsIndirOpnd() || memOpnd->IsSymOpnd()); + + int size = memOpnd->GetSize(); + Assert(size == 4 || size == 8); + + ARM64_REGISTER indexReg; + ARM64_REGISTER baseReg; + BYTE indexScale; + int32 offset; + if (DecodeMemoryOpnd(memOpnd, baseReg, indexReg, indexScale, offset)) + { + // Should never get here + AssertMsg(false, "EmitLoadStoreFp failed to encode"); + return 0; + } + else + { + return loadStore(Emitter, this->GetFloatRegEncode(srcDstOpnd->AsRegOpnd()), (size == 8) ? SIZE_1D : SIZE_1S, baseReg, offset); + } +} + +template +int EncoderMD::EmitLoadStoreFpPair(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd, IR::Opnd* srcDst1Opnd, IR::Opnd* srcDst2Opnd, _LoadStoreFunc loadStore) +{ + Assert(memOpnd->IsIndirOpnd() || memOpnd->IsSymOpnd()); + + int size = memOpnd->GetSize(); + Assert(size == 4 || size == 8); + + ARM64_REGISTER indexReg; + ARM64_REGISTER baseReg; + BYTE indexScale; + int32 offset; + if (DecodeMemoryOpnd(memOpnd, baseReg, indexReg, indexScale, offset)) + { + // Should never get here + AssertMsg(false, "EmitLoadStoreFpPair failed to encode"); + return 0; + } + else + { + return loadStore(Emitter, this->GetFloatRegEncode(srcDst1Opnd->AsRegOpnd()), this->GetFloatRegEncode(srcDst2Opnd->AsRegOpnd()), (size == 8) ? SIZE_1D : SIZE_1S, baseReg, offset); + } +} + +template +int EncoderMD::EmitConvertToInt(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Int32Func toInt32, _Uint32Func toUint32, _Int64Func toInt64, _Uint64Func toUint64) +{ + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + Assert(dst->IsRegOpnd()); + Assert(!dst->IsFloat()); + Assert(src1->IsRegOpnd()); + Assert(src1->IsFloat()); + + DebugOnly(int size = dst->GetSize()); + Assert(size == 4 || size == 8); + int srcSize = src1->GetSize(); + Assert(srcSize == 4 || srcSize == 8); + + if (dst->GetType() == TyInt32) + { + return toInt32(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetFloatRegEncode(src1->AsRegOpnd()), (srcSize == 8) ? SIZE_1D : SIZE_1S); + } + else if (dst->GetType() == TyUint32) + { + return toUint32(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetFloatRegEncode(src1->AsRegOpnd()), (srcSize == 8) ? SIZE_1D : SIZE_1S); + } + else if (dst->GetType() == TyInt64) + { + return toInt64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetFloatRegEncode(src1->AsRegOpnd()), (srcSize == 8) ? SIZE_1D : SIZE_1S); + } + else if (dst->GetType() == TyUint64) + { + return toUint64(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetFloatRegEncode(src1->AsRegOpnd()), (srcSize == 8) ? SIZE_1D : SIZE_1S); + } + + // Shouldn't get here + AssertMsg(false, "EmitConvertToInt failed to encode"); + return 0; +} + +//--------------------------------------------------------------------------- +// +// GenerateEncoding() +// +// generates the encoding for the specified tuple/form by applying the +// associated encoding steps +// +//--------------------------------------------------------------------------- +ULONG +EncoderMD::GenerateEncoding(IR::Instr* instr, BYTE *pc) +{ + Arm64LocalCodeEmitter<1> Emitter; + IR::Opnd* dst = 0; + IR::Opnd* src1 = 0; + IR::Opnd* src2 = 0; + int bytes = 0; + int size; + + switch (instr->m_opcode) + { + case Js::OpCode::ADD: + bytes = this->EmitOp3RegisterOrImmediateExtendSPReg(Emitter, instr, EmitAddRegister, EmitAddRegister64, EmitAddImmediate, EmitAddImmediate64); + break; + + case Js::OpCode::ADDS: + // ADDS and SUBS have no valid encoding where dst == RegSP + Assert(instr->GetDst()->AsRegOpnd()->GetReg() != RegSP); + bytes = this->EmitOp3RegisterOrImmediateExtendSPReg(Emitter, instr, EmitAddsRegister, EmitAddsRegister64, EmitAddsImmediate, EmitAddsImmediate64); + break; + + case Js::OpCode::ADR: + dst = instr->GetDst(); + src1 = instr->GetSrc1(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsLabelOpnd()); + + Assert(dst->GetSize() == 8); + Assert(!src1->AsLabelOpnd()->GetLabel()->isInlineeEntryInstr); + EncodeReloc::New(&m_relocList, RelocTypeLabelAdr, m_pc, src1->AsLabelOpnd()->GetLabel(), m_encoder->m_tempAlloc); + bytes = EmitAdr(Emitter, this->GetRegEncode(dst->AsRegOpnd()), 0); + break; + + case Js::OpCode::AND: + bytes = this->EmitOp3RegisterOrImmediate(Emitter, instr, EmitAndRegister, EmitAndRegister64, EmitAndImmediate, EmitAndImmediate64); + break; + + case Js::OpCode::ANDS: + bytes = this->EmitOp3RegisterOrImmediate(Emitter, instr, EmitAndsRegister, EmitAndsRegister64, EmitAndsImmediate, EmitAndsImmediate64); + break; + + case Js::OpCode::ASR: + bytes = this->EmitOp3RegisterOrImmediate(Emitter, instr, EmitAsrRegister, EmitAsrRegister64, EmitAsrImmediate, EmitAsrImmediate64); + break; + + case Js::OpCode::B: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_AL); + break; + + case Js::OpCode::BFI: + bytes = this->EmitBitfield(Emitter, instr, EmitBfi, EmitBfi64); + break; + + case Js::OpCode::BFXIL: + bytes = this->EmitBitfield(Emitter, instr, EmitBfxil, EmitBfxil64); + break; + + // ARM64_WORKITEM: Legalizer needs to convert BIC with immediate to AND with inverted immediate + case Js::OpCode::BIC: + bytes = this->EmitOp3Register(Emitter, instr, EmitBicRegister, EmitBicRegister64); + break; + + case Js::OpCode::BL: + bytes = this->EmitUnconditionalBranch(Emitter, instr, EmitBl); + break; + + case Js::OpCode::BR: + bytes = this->EmitOp1Register64(Emitter, instr, EmitBr); + break; + + case Js::OpCode::BLR: + bytes = this->EmitOp1Register64(Emitter, instr, EmitBlr); + break; + + case Js::OpCode::BEQ: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_EQ); + break; + + case Js::OpCode::BNE: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_NE); + break; + + case Js::OpCode::BLT: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_LT); + break; + + case Js::OpCode::BLE: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_LE); + break; + + case Js::OpCode::BGT: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_GT); + break; + + case Js::OpCode::BGE: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_GE); + break; + + case Js::OpCode::BCS: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_CS); + break; + + case Js::OpCode::BCC: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_CC); + break; + + case Js::OpCode::BHI: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_HI); + break; + + case Js::OpCode::BLS: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_LS); + break; + + case Js::OpCode::BMI: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_MI); + break; + + case Js::OpCode::BPL: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_PL); + break; + + case Js::OpCode::BVS: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_VS); + break; + + case Js::OpCode::BVC: + bytes = this->EmitConditionalBranch(Emitter, instr, COND_VC); + break; + + case Js::OpCode::CBZ: + bytes = this->EmitCompareAndBranch(Emitter, instr, EmitCbz, EmitCbz64); + break; + + case Js::OpCode::CBNZ: + bytes = this->EmitCompareAndBranch(Emitter, instr, EmitCbnz, EmitCbnz64); + break; + + case Js::OpCode::CLZ: + bytes = this->EmitOp2Register(Emitter, instr, EmitClz, EmitClz64); + break; + + // Legalizer should convert this to SUBS before getting here + case Js::OpCode::CMP: + Assert(false); + break; + + // Legalizer should convert this to ADDS before getting here + case Js::OpCode::CMN: + Assert(false); + break; + + case Js::OpCode::CSELLT: + bytes = this->EmitConditionalSelect(Emitter, instr, COND_LT, EmitCsel, EmitCsel64); + break; + + case Js::OpCode::CSNEGPL: + bytes = this->EmitConditionalSelect(Emitter, instr, COND_PL, EmitCsneg, EmitCsneg64); + break; + + case Js::OpCode::CMP_SXTW: + src1 = instr->GetSrc1(); + src2 = instr->GetSrc2(); + Assert(instr->GetDst() == nullptr); + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); + + size = src1->GetSize(); + Assert(size == 8); + Assert(size == src2->GetSize()); + + bytes = EmitSubsRegister64(Emitter, ARMREG_ZR, this->GetRegEncode(src1->AsRegOpnd()), Arm64RegisterParam(this->GetRegEncode(src2->AsRegOpnd()), EXTEND_SXTW, 0)); + break; + + case Js::OpCode::DEBUGBREAK: + bytes = EmitDebugBreak(Emitter); + break; + + case Js::OpCode::EOR: + bytes = this->EmitOp3RegisterOrImmediate(Emitter, instr, EmitEorRegister, EmitEorRegister64, EmitEorImmediate, EmitEorImmediate64); + break; + + case Js::OpCode::EOR_ASR31: + bytes = this->EmitOp3RegisterShifted(Emitter, instr, SHIFT_ASR, 63, EmitEorRegister, EmitEorRegister64); + break; + + // Legalizer should convert these into MOVZ/MOVN/MOVK + case Js::OpCode::LDIMM: + Assert(false); + break; + + case Js::OpCode::LDR: + Assert(instr->GetDst()->GetSize() <= instr->GetSrc1()->GetSize() || instr->GetSrc1()->IsUnsigned()); + bytes = this->EmitLoadStore(Emitter, instr, instr->GetSrc1(), instr->GetDst(), EmitLdrbRegister, EmitLdrhRegister, EmitLdrRegister, EmitLdrRegister64, EmitLdrbOffset, EmitLdrhOffset, EmitLdrOffset, EmitLdrOffset64); + break; + + case Js::OpCode::LDRS: + Assert(instr->GetDst()->GetSize() <= instr->GetSrc1()->GetSize() || instr->GetSrc1()->IsSigned()); + bytes = this->EmitLoadStore(Emitter, instr, instr->GetSrc1(), instr->GetDst(), EmitLdrsbRegister, EmitLdrshRegister, EmitLdrswRegister64, EmitLdrRegister64, EmitLdrsbOffset, EmitLdrshOffset, EmitLdrswOffset64, EmitLdrOffset64); + break; + + // Note: src2 is really the second destination register, due to limitations of IR::Instr + case Js::OpCode::LDP: + bytes = this->EmitLoadStorePair(Emitter, instr, instr->GetSrc1(), instr->GetDst(), instr->GetSrc2(), EmitLdpOffset, EmitLdpOffset64); + break; + + // Note: src2 is really the second destination register, due to limitations of IR::Instr + case Js::OpCode::LDP_POST: + bytes = this->EmitLoadStorePair(Emitter, instr, instr->GetSrc1(), instr->GetDst(), instr->GetSrc2(), EmitLdpOffsetPostIndex, EmitLdpOffsetPostIndex64); + break; + + // Legalizer should convert this to MOV/ADD before getting here + case Js::OpCode::LEA: + Assert(false); + break; + + case Js::OpCode::LSL: + bytes = this->EmitOp3RegisterOrImmediate(Emitter, instr, EmitLslRegister, EmitLslRegister64, EmitLslImmediate, EmitLslImmediate64); + break; + + case Js::OpCode::LSR: + bytes = this->EmitOp3RegisterOrImmediate(Emitter, instr, EmitLsrRegister, EmitLsrRegister64, EmitLsrImmediate, EmitLsrImmediate64); + break; + + case Js::OpCode::MOV_TRUNC: + Assert(instr->GetDst()->GetSize() == 4); + Assert(instr->GetSrc1()->GetSize() == 4); + // fall through. + + case Js::OpCode::MOV: + bytes = this->EmitOp2Register(Emitter, instr, EmitMovRegister, EmitMovRegister64); + break; + + case Js::OpCode::MOVK: + bytes = this->EmitMovConstant(Emitter, instr, EmitMovk, EmitMovk64); + break; + + case Js::OpCode::MOVN: + bytes = this->EmitMovConstant(Emitter, instr, EmitMovn, EmitMovn64); + break; + + case Js::OpCode::MOVZ: + bytes = this->EmitMovConstant(Emitter, instr, EmitMovz, EmitMovz64); + break; + + case Js::OpCode::MRS_FPCR: + dst = instr->GetDst(); + Assert(dst->IsRegOpnd()); + Assert(dst->GetSize() == 4); + bytes = EmitMrs(Emitter, this->GetRegEncode(dst->AsRegOpnd()), ARM64_FPCR); + break; + + case Js::OpCode::MRS_FPSR: + dst = instr->GetDst(); + Assert(dst->IsRegOpnd()); + Assert(dst->GetSize() == 4); + bytes = EmitMrs(Emitter, this->GetRegEncode(dst->AsRegOpnd()), ARM64_FPSR); + break; + + case Js::OpCode::MSR_FPCR: + src1 = instr->GetSrc1(); + Assert(src1->IsRegOpnd()); + Assert(src1->GetSize() == 4); + bytes = EmitMsr(Emitter, this->GetRegEncode(src1->AsRegOpnd()), ARM64_FPCR); + break; + + case Js::OpCode::MSR_FPSR: + src1 = instr->GetSrc1(); + Assert(src1->IsRegOpnd()); + Assert(src1->GetSize() == 4); + bytes = EmitMsr(Emitter, this->GetRegEncode(src1->AsRegOpnd()), ARM64_FPSR); + break; + + case Js::OpCode::MUL: + bytes = this->EmitOp3Register(Emitter, instr, EmitMul, EmitMul64); + break; + + case Js::OpCode::MVN: + bytes = this->EmitOp2Register(Emitter, instr, EmitMvnRegister, EmitMvnRegister64); + break; + + // SMULL dst, src1, src2. src1 and src2 are 32-bit. dst is 64-bit. + case Js::OpCode::SMULL: + dst = instr->GetDst(); + src1 = instr->GetSrc1(); + src2 = instr->GetSrc2(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); + + Assert(dst->GetSize() == 8); + Assert(src1->GetSize() == 4); + Assert(src2->GetSize() == 4); + bytes = EmitSmull(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), this->GetRegEncode(src2->AsRegOpnd())); + break; + + // SMADDL (SMLAL from ARM32) dst, dst, src1, src2. src1 and src2 are 32-bit. dst is 64-bit. + case Js::OpCode::SMADDL: + dst = instr->GetDst(); + src1 = instr->GetSrc1(); + src2 = instr->GetSrc2(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); + bytes = EmitSmaddl(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), this->GetRegEncode(src2->AsRegOpnd())); + break; + + // MSUB (MLS from ARM32) dst, src1, src2: Multiply and Subtract. We use 3 registers: dst = src1 - src2 * dst + case Js::OpCode::MSUB: + dst = instr->GetDst(); + src1 = instr->GetSrc1(); + src2 = instr->GetSrc2(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); + bytes = EmitMsub(Emitter, this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src2->AsRegOpnd()), this->GetRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd())); + break; + + case Js::OpCode::NOP: + bytes = EmitNop(Emitter); + break; + + case Js::OpCode::ORR: + bytes = this->EmitOp3RegisterOrImmediate(Emitter, instr, EmitOrrRegister, EmitOrrRegister64, EmitOrrImmediate, EmitOrrImmediate64); + break; + + case Js::OpCode::PLD: + bytes = this->EmitPrefetch(Emitter, instr, instr->GetSrc1()); + break; + + case Js::OpCode::RET: + bytes = this->EmitOp1Register64(Emitter, instr, EmitRet); + break; + + // Legalizer should convert this to SDIV/MSUB before getting here + case Js::OpCode::REM: + Assert(false); + break; + + case Js::OpCode::SBFX: + bytes = this->EmitBitfield(Emitter, instr, EmitSbfx, EmitSbfx64); + break; + + case Js::OpCode::SDIV: + bytes = this->EmitOp3Register(Emitter, instr, EmitSdiv, EmitSdiv64); + break; + + case Js::OpCode::STR: + bytes = this->EmitLoadStore(Emitter, instr, instr->GetDst(), instr->GetSrc1(), EmitStrbRegister, EmitStrhRegister, EmitStrRegister, EmitStrRegister64, EmitStrbOffset, EmitStrhOffset, EmitStrOffset, EmitStrOffset64); + break; + + case Js::OpCode::STP: + bytes = this->EmitLoadStorePair(Emitter, instr, instr->GetDst(), instr->GetSrc1(), instr->GetSrc2(), EmitStpOffset, EmitStpOffset64); + break; + + case Js::OpCode::STP_PRE: + bytes = this->EmitLoadStorePair(Emitter, instr, instr->GetDst(), instr->GetSrc1(), instr->GetSrc2(), EmitStpOffsetPreIndex, EmitStpOffsetPreIndex64); + break; + + case Js::OpCode::SUB: + bytes = this->EmitOp3RegisterOrImmediateExtendSPReg(Emitter, instr, EmitSubRegister, EmitSubRegister64, EmitSubImmediate, EmitSubImmediate64); + break; + + case Js::OpCode::SUBS: + // ADDS and SUBS have no valid encoding where dst == RegSP + Assert(instr->GetDst()->AsRegOpnd()->GetReg() != RegSP); + bytes = this->EmitOp3RegisterOrImmediateExtendSPReg(Emitter, instr, EmitSubsRegister, EmitSubsRegister64, EmitSubsImmediate, EmitSubsImmediate64); + break; + + case Js::OpCode::SUB_LSL4: + bytes = this->EmitOp3RegisterShifted(Emitter, instr, EXTEND_UXTX, 4, EmitSubRegister, EmitSubRegister64); + break; + + case Js::OpCode::TBZ: + bytes = this->EmitTestAndBranch(Emitter, instr, EmitTbz); + break; + + case Js::OpCode::TBNZ: + bytes = this->EmitTestAndBranch(Emitter, instr, EmitTbnz); + break; + + // Legalizer should convert this to ANDS before getting here + case Js::OpCode::TST: + Assert(false); + break; + + case Js::OpCode::UBFX: + bytes = this->EmitBitfield(Emitter, instr, EmitUbfx, EmitUbfx64); + break; + + case Js::OpCode::FABS: + bytes = this->EmitOp2FpRegister(Emitter, instr, EmitNeonFabs); + break; + + case Js::OpCode::FADD: + bytes = this->EmitOp3FpRegister(Emitter, instr, EmitNeonFadd); + break; + + case Js::OpCode::FCMP: + bytes = this->EmitOp2FpRegister(Emitter, instr->GetSrc1(), instr->GetSrc2(), EmitNeonFcmp); + break; + + case Js::OpCode::FCVT: + dst = instr->GetDst(); + src1 = instr->GetSrc1(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + Assert(dst->IsFloat()); + + size = dst->GetSize(); + Assert(size == 4 || size == 8); + + if (src1->IsFloat()) + { + bytes = EmitNeonFcvt(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), (size == 8) ? SIZE_1D : SIZE_1S, this->GetFloatRegEncode(src1->AsRegOpnd()), (src1->GetSize() == 8) ? SIZE_1D : SIZE_1S); + } + else if (src1->GetType() == TyInt32) + { + bytes = EmitNeonScvtf(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), Arm64SimpleRegisterParam(this->GetRegEncode(src1->AsRegOpnd())), (size == 8) ? SIZE_1D : SIZE_1S); + } + else if (src1->GetType() == TyUint32) + { + bytes = EmitNeonUcvtf(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), Arm64SimpleRegisterParam(this->GetRegEncode(src1->AsRegOpnd())), (size == 8) ? SIZE_1D : SIZE_1S); + } + else if (src1->GetType() == TyInt64) + { + bytes = EmitNeonScvtf64(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), Arm64SimpleRegisterParam(this->GetRegEncode(src1->AsRegOpnd())), (size == 8) ? SIZE_1D : SIZE_1S); + } + else if (src1->GetType() == TyUint64) + { + bytes = EmitNeonUcvtf64(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), Arm64SimpleRegisterParam(this->GetRegEncode(src1->AsRegOpnd())), (size == 8) ? SIZE_1D : SIZE_1S); + } + break; + + case Js::OpCode::FCVTM: + bytes = this->EmitConvertToInt(Emitter, instr, EmitNeonFcvtmsGen, EmitNeonFcvtmuGen, EmitNeonFcvtmsGen64, EmitNeonFcvtmuGen64); + break; + + case Js::OpCode::FCVTN: + bytes = this->EmitConvertToInt(Emitter, instr, EmitNeonFcvtnsGen, EmitNeonFcvtnuGen, EmitNeonFcvtnsGen64, EmitNeonFcvtnuGen64); + break; + + case Js::OpCode::FCVTP: + bytes = this->EmitConvertToInt(Emitter, instr, EmitNeonFcvtpsGen, EmitNeonFcvtpuGen, EmitNeonFcvtpsGen64, EmitNeonFcvtpuGen64); + break; + + case Js::OpCode::FCVTZ: + bytes = this->EmitConvertToInt(Emitter, instr, EmitNeonFcvtzsGen, EmitNeonFcvtzuGen, EmitNeonFcvtzsGen64, EmitNeonFcvtzuGen64); + break; + + case Js::OpCode::FDIV: + bytes = this->EmitOp3FpRegister(Emitter, instr, EmitNeonFdiv); + break; + + case Js::OpCode::FLDR: + bytes = this->EmitLoadStoreFp(Emitter, instr, instr->GetSrc1(), instr->GetDst(), EmitNeonLdrOffset); + break; + + // Note: src2 is really the second destination register, due to limitations of IR::Instr + case Js::OpCode::FLDP: + bytes = this->EmitLoadStoreFpPair(Emitter, instr, instr->GetSrc1(), instr->GetDst(), instr->GetSrc2(), EmitNeonLdpOffset); + break; + + case Js::OpCode::FMIN: + bytes = this->EmitOp3FpRegister(Emitter, instr, EmitNeonFmin); + break; + + case Js::OpCode::FMAX: + bytes = this->EmitOp3FpRegister(Emitter, instr, EmitNeonFmax); + break; + + case Js::OpCode::FMOV: + bytes = this->EmitOp2FpRegister(Emitter, instr, EmitNeonFmov); + break; + + case Js::OpCode::FMOV_GEN: + dst = instr->GetDst(); + src1 = instr->GetSrc1(); + Assert(dst->IsRegOpnd()); + Assert(src1->IsRegOpnd()); + + size = dst->GetSize(); + Assert(size == 4 || size == 8); + Assert(size == src1->GetSize()); + + Assert(dst->IsFloat() != src1->IsFloat()); + if (dst->IsFloat()) + { + bytes = EmitNeonIns(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), 0, this->GetRegEncode(src1->AsRegOpnd()), (size == 8) ? SIZE_1D : SIZE_1S); + } + else + { + if (size == 8) + { + bytes = EmitNeonUmov64(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), 0, (size == 8) ? SIZE_1D : SIZE_1S); + } + else + { + bytes = EmitNeonUmov(Emitter, this->GetFloatRegEncode(dst->AsRegOpnd()), this->GetRegEncode(src1->AsRegOpnd()), 0, (size == 8) ? SIZE_1D : SIZE_1S); + } + } + break; + + case Js::OpCode::FMUL: + bytes = this->EmitOp3FpRegister(Emitter, instr, EmitNeonFmul); + break; + + case Js::OpCode::FNEG: + bytes = this->EmitOp2FpRegister(Emitter, instr, EmitNeonFneg); + break; + + case Js::OpCode::FRINTM: + bytes = this->EmitOp2FpRegister(Emitter, instr, EmitNeonFrintm); + break; + + case Js::OpCode::FRINTP: + bytes = this->EmitOp2FpRegister(Emitter, instr, EmitNeonFrintp); + break; + + case Js::OpCode::FSUB: + bytes = this->EmitOp3FpRegister(Emitter, instr, EmitNeonFsub); + break; + + case Js::OpCode::FSQRT: + bytes = this->EmitOp2FpRegister(Emitter, instr, EmitNeonFsqrt); + break; + + case Js::OpCode::FSTR: + bytes = this->EmitLoadStoreFp(Emitter, instr, instr->GetDst(), instr->GetSrc1(), EmitNeonStrOffset); + break; + + case Js::OpCode::FSTP: + bytes = this->EmitLoadStoreFpPair(Emitter, instr, instr->GetDst(), instr->GetSrc1(), instr->GetSrc2(), EmitNeonStpOffset); + break; + + // Opcode not yet implemented + default: +#if DBG_DUMP + instr->Dump(); + Output::Flush(); +#endif + AssertMsg(UNREACHED, "Unsupported Instruction Form"); + break; + + } + + Assert(bytes != 0); + + return Emitter.Opcode(); +} + +#ifdef INSERT_NOPS +ptrdiff_t insertNops(BYTE *pc, DWORD outInstr, uint count, uint size) +{ + //Insert count nops in the beginning + for(int i = 0; i < count;i++) + { + *(DWORD *)(pc + i * sizeof(DWORD)) = 0x8000F3AF; + } + + if (size == sizeof(ENCODE_16)) + { + *(ENCODE_16 *)(pc + count * sizeof(DWORD)) = (ENCODE_16)(outInstr & 0x0000ffff); + *(ENCODE_16 *)(pc + sizeof(ENCODE_16) + count * sizeof(DWORD)) = (ENCODE_16)(0xBF00); + } + else + { + Assert(size == sizeof(DWORD)); + *(DWORD *)(pc + count * sizeof(DWORD)) = outInstr; + } + + //Insert count nops at the end; + for(int i = count + 1; i < (2 *count + 1); i++) + { + *(DWORD *)(pc + i * sizeof(DWORD)) = 0x8000F3AF; + } + + return MachInt*(2*count + 1); +} +#endif //INSERT_NOPS + +///---------------------------------------------------------------------------- +/// +/// EncoderMD::Encode +/// +/// Emit the ARM encoding for the given instruction in the passed in +/// buffer ptr. +/// +///---------------------------------------------------------------------------- + +ptrdiff_t +EncoderMD::Encode(IR::Instr *instr, BYTE *pc, BYTE* beginCodeAddress) +{ + m_pc = pc; + + DWORD outInstr; + + // Instructions must be lowered, we don't handle non-MD opcodes here. + Assert(instr != nullptr); + + if (instr->IsLowered() == false) + { + if (instr->IsLabelInstr()) + { + if (instr->isInlineeEntryInstr) + { + size_t inlineeOffset = m_pc - m_encoder->m_encodeBuffer; + size_t argCount = instr->AsLabelInstr()->GetOffset(); + Assert(inlineeOffset == (inlineeOffset & 0x0FFFFFFF)); + + intptr_t inlineeCallInfo = 0; + const bool encodeResult = Js::InlineeCallInfo::Encode(inlineeCallInfo, argCount, inlineeOffset); + Assert(encodeResult); + //We are re-using offset to save the inlineeCallInfo which will be patched in ApplyRelocs + //This is a cleaner way to patch MOVW\MOVT pair with the right inlineeCallInfo + instr->AsLabelInstr()->ResetOffset((uintptr_t)inlineeCallInfo); + } + else + { + instr->AsLabelInstr()->SetPC(m_pc); + m_func->m_unwindInfo.SetLabelOffset(instr->AsLabelInstr()->m_id, DWORD(m_pc - m_encoder->m_encodeBuffer)); + } + } + #if DBG_DUMP + if (instr->IsEntryInstr() && Js::Configuration::Global.flags.DebugBreak.Contains(m_func->GetFunctionNumber())) + { + IR::Instr *int3 = IR::Instr::New(Js::OpCode::DEBUGBREAK, m_func); + return this->Encode(int3, m_pc); + } + #endif + return 0; + } + + this->CanonicalizeInstr(instr); + + outInstr = GenerateEncoding(instr, m_pc); + + if (outInstr == 0) + { + return 0; + } + + // TODO: Check if VFP/Neon instructions in Thumb-2 mode we need to swap the instruction halfwords +#ifdef INSERT_NOPS + return insertNops(m_pc, outInstr, CountNops, sizeof(DWORD)); +#else + *(DWORD *)m_pc = outInstr ; + return MachInt; +#endif +} + +bool +EncoderMD::EncodeLogicalConst(IntConstType constant, DWORD * result, int size = 4) +{ + *result = FindArm64LogicalImmediateEncoding(constant, size); + return (*result != ARM64_LOGICAL_IMMEDIATE_NO_ENCODING); +} + +bool +EncoderMD::CanEncodeLogicalConst(IntConstType constant, int size) +{ + DWORD encode; + return EncodeLogicalConst(constant, &encode, size); +} + +///---------------------------------------------------------------------------- +/// +/// EncodeReloc::New +/// +///---------------------------------------------------------------------------- + +void +EncodeReloc::New(EncodeReloc **pHead, RelocType relocType, BYTE *offset, IR::Instr *relocInstr, ArenaAllocator *alloc) +{ + EncodeReloc *newReloc = AnewStruct(alloc, EncodeReloc); + newReloc->m_relocType = relocType; + newReloc->m_consumerOffset = offset; + newReloc->m_next = *pHead; + newReloc->m_relocInstr = relocInstr; + *pHead = newReloc; +} + +void +EncoderMD::BaseAndOffsetFromSym(IR::SymOpnd *symOpnd, RegNum *pBaseReg, int32 *pOffset, Func * func) +{ + StackSym *stackSym = symOpnd->m_sym->AsStackSym(); + + RegNum baseReg = func->GetLocalsPointer(); + int32 offset = stackSym->m_offset + symOpnd->m_offset; + if (baseReg == RegSP) + { + // SP points to the base of the argument area. Non-reg SP points directly to the locals. + offset += (func->m_argSlotsForFunctionsCalled * MachRegInt); + } + + if (func->HasInlinee()) + { + Assert(func->HasInlinee()); + if ((!stackSym->IsArgSlotSym() || stackSym->m_isOrphanedArg) && !stackSym->IsParamSlotSym()) + { + offset += func->GetInlineeArgumentStackSize(); + } + } + + if (stackSym->IsParamSlotSym()) + { + offset += func->m_localStackHeight + func->m_ArgumentsOffset; + if (!EncoderMD::CanEncodeLoadStoreOffset(offset)) + { + // Use the frame pointer. No need to hoist an offset for a param. + baseReg = FRAME_REG; + offset = stackSym->m_offset + symOpnd->m_offset - (Js::JavascriptFunctionArgIndex_Frame * MachRegInt); + Assert(EncoderMD::CanEncodeLoadStoreOffset(offset)); + } + } +#ifdef DBG + else + { + // Locals are offset by the size of the area allocated for stack args. + Assert(offset >= 0); + Assert(baseReg != RegSP || (uint)offset >= (func->m_argSlotsForFunctionsCalled * MachRegInt)); + + if (func->HasInlinee()) + { + // TODO (megupta): BaseReg will be a pre-reserved non SP register when we start supporting try + Assert(baseReg == RegSP || baseReg == ALT_LOCALS_PTR); + if (stackSym->IsArgSlotSym() && !stackSym->m_isOrphanedArg) + { + Assert(stackSym->m_isInlinedArgSlot); + //Assert((uint)offset <= ((func->m_argSlotsForFunctionsCalled + func->GetMaxInlineeArgOutCount()) * MachRegInt)); + } + else + { + AssertMsg(stackSym->IsAllocated(), "StackSym offset should be set"); + //Assert((uint)offset > ((func->m_argSlotsForFunctionsCalled + func->GetMaxInlineeArgOutCount()) * MachRegInt)); + //Assert(offset > (func->HasTry() ? (int32)func->GetMaxInlineeArgOutSize() : (int32)(func->m_argSlotsForFunctionsCalled * MachRegInt + func->GetMaxInlineeArgOutSize()))); + } + } + // TODO: restore the following assert (very useful) once we have a way to tell whether prolog/epilog + // gen is complete. + //Assert(offset < func->m_localStackHeight); + } +#endif + *pBaseReg = baseReg; + *pOffset = offset; +} + +///---------------------------------------------------------------------------- +/// +/// EncoderMD::ApplyRelocs +/// We apply relocations to the temporary buffer using the target buffer's address +/// before we copy the contents of the temporary buffer to the target buffer. +///---------------------------------------------------------------------------- +void +EncoderMD::ApplyRelocs(size_t codeBufferAddress, size_t codeSize, uint* bufferCRC, BOOL isBrShorteningSucceeded, bool isFinalBufferValidation) +{ + for (EncodeReloc *reloc = m_relocList; reloc; reloc = reloc->m_next) + { + PULONG relocAddress = PULONG(reloc->m_consumerOffset); + PULONG targetAddress = PULONG(reloc->m_relocInstr->AsLabelInstr()->GetPC()); + ULONG_PTR immediate; + + switch (reloc->m_relocType) + { + case RelocTypeBranch14: + case RelocTypeBranch19: + case RelocTypeBranch26: + ArmBranchLinker::LinkRaw(relocAddress, targetAddress); + break; + + case RelocTypeLabelAdr: + Assert(!reloc->m_relocInstr->isInlineeEntryInstr); + immediate = ULONG_PTR(targetAddress) - ULONG_PTR(relocAddress); + Assert(IS_CONST_INT21(immediate)); + *relocAddress = (*relocAddress & ~(3 << 29)) | ULONG((immediate & 3) << 29); + *relocAddress = (*relocAddress & ~(0x7ffff << 5)) | ULONG(((immediate >> 2) & 0x7ffff) << 5); + break; + + case RelocTypeLabelImmed: + { + // read the shift from the encoded instruction. + uint32 shift = ((*relocAddress & (0x3 << 21)) >> 21) * 16; + uintptr_t fullvalue = ULONG_PTR(targetAddress) - ULONG_PTR(m_encoder->m_encodeBuffer) + ULONG_PTR(codeBufferAddress); + immediate = (fullvalue >> shift) & 0xffff; + + // replace the immediate value in the encoded instruction. + *relocAddress = (*relocAddress & ~(0xffff << 5)) | ULONG((immediate & 0xffff) << 5); + break; + } + + case RelocTypeLabel: + *(ULONG_PTR*)relocAddress = ULONG_PTR(targetAddress) - ULONG_PTR(m_encoder->m_encodeBuffer) + ULONG_PTR(codeBufferAddress); + break; + + default: + // unexpected/unimplemented type + Assert(UNREACHED); + } + } +} + +void +EncoderMD::EncodeInlineeCallInfo(IR::Instr *instr, uint32 codeOffset) +{ + DebugOnly(IR::LabelInstr* inlineeStart = instr->AsLabelInstr()); + Assert((inlineeStart->GetOffset() & 0x0F) == inlineeStart->GetOffset()); + return; +} + +bool EncoderMD::TryConstFold(IR::Instr *instr, IR::RegOpnd *regOpnd) +{ + Assert(regOpnd->m_sym->IsConst()); + + if (instr->m_opcode == Js::OpCode::MOV) + { + if (instr->GetSrc1() != regOpnd) + { + return false; + } + if (!instr->GetDst()->IsRegOpnd()) + { + return false; + } + + IR::Opnd* constOpnd = regOpnd->m_sym->GetConstOpnd(); + if (constOpnd->GetSize() > regOpnd->GetSize()) + { + return false; + } + + instr->ReplaceSrc(regOpnd, constOpnd); + LegalizeMD::LegalizeInstr(instr, false); + + return true; + } + else + { + return false; + } +} + +bool EncoderMD::TryFold(IR::Instr *instr, IR::RegOpnd *regOpnd) +{ + if (LowererMD::IsAssign(instr)) + { + if (!instr->GetDst()->IsRegOpnd() || regOpnd != instr->GetSrc1()) + { + return false; + } + IR::SymOpnd *symOpnd = IR::SymOpnd::New(regOpnd->m_sym, regOpnd->GetType(), instr->m_func); + instr->ReplaceSrc(regOpnd, symOpnd); + LegalizeMD::LegalizeInstr(instr, false); + + return true; + } + else + { + return false; + } +} + +void EncoderMD::AddLabelReloc(BYTE* relocAddress) +{ + Assert(relocAddress != nullptr); + EncodeReloc::New(&m_relocList, RelocTypeLabel, relocAddress, *(IR::Instr**)relocAddress, m_encoder->m_tempAlloc); } diff --git a/deps/chakrashim/core/lib/Backend/arm64/EncoderMD.h b/deps/chakrashim/core/lib/Backend/arm64/EncoderMD.h index 4fc3bdf9da3..63db30f6ca8 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/EncoderMD.h +++ b/deps/chakrashim/core/lib/Backend/arm64/EncoderMD.h @@ -2,25 +2,130 @@ // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- -#include "ARMEncode.h" +#include "ARM64Encoder.h" +#include "LegalizeMD.h" class Encoder; +// use this to encode the immediate field for a bitfield instruction +#define BITFIELD(lsb, width) ((lsb) | ((width) << 16)) + enum RelocType { - RelocTypeBranch26, - RelocTypeBranch19, RelocTypeBranch14, + RelocTypeBranch19, + RelocTypeBranch26, + RelocTypeLabelAdr, + RelocTypeLabelImmed, RelocTypeLabel }; enum InstructionType { None = 0, - Integer = 1, - Vfp = 2 + Vfp = 3, + A64 = 4, }; +#define RETURN_REG RegR0 +#define FIRST_INT_ARG_REG RegR0 +#define LAST_INT_ARG_REG RegR7 +#define NUM_INT_ARG_REGS\ + ((LAST_INT_ARG_REG - FIRST_INT_ARG_REG) + 1) + +#define FIRST_CALLEE_SAVED_GP_REG RegR19 +#define LAST_CALLEE_SAVED_GP_REG RegR28 +#define CALLEE_SAVED_GP_REG_COUNT\ + ((LAST_CALLEE_SAVED_GP_REG - FIRST_CALLEE_SAVED_GP_REG) + 1) + +// Note that CATCH_OBJ_REG and ALT_LOCALS_PTR are implicitly referenced in +// arm64_CallEhFrame.asm and must be updated there as well if these are changed. +#define CATCH_OBJ_REG RegR1 +#define UNUSED_REG_FOR_STACK_ALIGN RegR11 +#define SP_ALLOC_SCRATCH_REG RegR15 +#define SCRATCH_REG RegR17 +#define ALT_LOCALS_PTR RegR28 + +#define RETURN_DBL_REG RegD0 +#define FIRST_CALLEE_SAVED_DBL_REG RegD8 +#define LAST_CALLEE_SAVED_DBL_REG RegD15 +#define CALLEE_SAVED_DOUBLE_REG_COUNT\ + ((LAST_CALLEE_SAVED_DBL_REG - FIRST_CALLEE_SAVED_DBL_REG) + 1) +#define FIRST_CALLEE_SAVED_DBL_REG_NUM 8 +#define LAST_CALLEE_SAVED_DBL_REG_NUM 15 + + +// See comment in LowerEntryInstr: even in a global function, we'll home x0 and x1 +#define MIN_HOMED_PARAM_REGS 2 + #define FRAME_REG RegFP +// +// Opcode dope +// + +#define DMOVE 0x0001 +#define DLOAD 0x0002 +#define DSTORE 0x0003 +#define DMASK 0x0007 +#define DHALFORSB 0x0020 // halfword or signed byte +#define DSUPDATE 0x0100 +#define DSSUB 0x0200 +#define DSPOST 0x0400 +#define DSBIT 0x0800 + +#define D___ (0) +#define D__S (DSBIT) +#define DM__ (DMOVE) +#define DL__ (DLOAD) +#define DLH_ (DLOAD | DHALFORSB) +#define DS__ (DSTORE) +#define DSH_ (DSTORE | DHALFORSB) +#define DLUP (DLOAD | DSUPDATE | DSPOST) +#define DSUS (DSTORE | DSUPDATE | DSSUB) + +#define ISMOVE(o) ((EncoderMD::GetOpdope(o) & DMASK) == DMOVE) +#define ISLOAD(o) ((EncoderMD::GetOpdope(o) & DMASK) == DLOAD) +#define ISSTORE(o) ((EncoderMD::GetOpdope(o) & DMASK) == DSTORE) + +#define ISSHIFTERUPDATE(o) ((EncoderMD::GetOpdope(o) & DSUPDATE) != 0) +#define ISSHIFTERSUB(o) ((EncoderMD::GetOpdope(o) & DSSUB) != 0) +#define ISSHIFTERPOST(o) ((EncoderMD::GetOpdope(o) & DSPOST) != 0) + +#define SETS_SBIT(o) ((EncoderMD::GetOpdope(o) & DSBIT) != 0) + +#define IS_CONST_0000003F(x) (((x) & ~0x0000003f) == 0) +#define IS_CONST_0000007F(x) (((x) & ~0x0000007f) == 0) +#define IS_CONST_000000FF(x) (((x) & ~0x000000ff) == 0) +#define IS_CONST_000003FF(x) (((x) & ~0x000003ff) == 0) +#define IS_CONST_00000FFF(x) (((x) & ~0x00000fff) == 0) +#define IS_CONST_0000FFFF(x) (((x) & ~0x0000ffff) == 0) +#define IS_CONST_000FFFFF(x) (((x) & ~0x000fffff) == 0) +#define IS_CONST_007FFFFF(x) (((x) & ~0x007fffff) == 0) +#define IS_CONST_00FFF000(x) (((x) & ~0x00fff000) == 0) +#define IS_CONST_003F003F(x) (((x) & ~0x003f003f) == 0) + +#define IS_CONST_NEG_7(x) (((x) & ~0x0000003f) == ~0x0000003f) +#define IS_CONST_NEG_8(x) (((x) & ~0x0000007f) == ~0x0000007f) +#define IS_CONST_NEG_9(x) (((x) & ~0x000000ff) == ~0x000000ff) +#define IS_CONST_NEG_12(x) (((x) & ~0x000007ff) == ~0x000007ff) +#define IS_CONST_NEG_21(x) (((x) & ~0x000fffff) == ~0x000fffff) +#define IS_CONST_NEG_24(x) (((x) & ~0x007fffff) == ~0x007fffff) + +#define IS_CONST_INT7(x) (IS_CONST_0000003F(x) || IS_CONST_NEG_7(x)) +#define IS_CONST_INT8(x) (IS_CONST_0000007F(x) || IS_CONST_NEG_8(x)) +#define IS_CONST_INT9(x) (IS_CONST_000000FF(x) || IS_CONST_NEG_9(x)) +#define IS_CONST_INT12(x) (IS_CONST_00000FFF(x) || IS_CONST_NEG_12(x)) +#define IS_CONST_INT21(x) (IS_CONST_000FFFFF(x) || IS_CONST_NEG_21(x)) +#define IS_CONST_INT24(x) (IS_CONST_007FFFFF(x) || IS_CONST_NEG_24(x)) + +#define IS_CONST_UINT6(x) IS_CONST_0000003F(x) +#define IS_CONST_UINT7(x) IS_CONST_0000007F(x) +#define IS_CONST_UINT8(x) IS_CONST_000000FF(x) +#define IS_CONST_UINT10(x) IS_CONST_000003FF(x) +#define IS_CONST_UINT12(x) IS_CONST_00000FFF(x) +#define IS_CONST_UINT16(x) IS_CONST_0000FFFF(x) +#define IS_CONST_UINT12LSL12(x) IS_CONST_00FFF000(x) +#define IS_CONST_UINT6UINT6(x) IS_CONST_003F003F(x) + ///--------------------------------------------------------------------------- /// /// class EncoderReloc @@ -30,7 +135,7 @@ enum InstructionType { class EncodeReloc { public: - static void New(EncodeReloc **pHead, RelocType relocType, BYTE *offset, IR::Instr *relocInstr, ArenaAllocator *alloc) { __debugbreak(); } + static void New(EncodeReloc **pHead, RelocType relocType, BYTE *offset, IR::Instr *relocInstr, ArenaAllocator *alloc); public: EncodeReloc * m_next; @@ -50,33 +155,105 @@ class EncodeReloc class EncoderMD { public: - EncoderMD(Func * func) { } - ptrdiff_t Encode(IR::Instr * instr, BYTE *pc, BYTE* beginCodeAddress = nullptr) { __debugbreak(); return 0; } - void Init(Encoder *encoder) { __debugbreak(); } - void ApplyRelocs(size_t codeBufferAddress, size_t codeSize, uint* bufferCRC, BOOL isBrShorteningSucceeded, bool isFinalBufferValidation = false) { __debugbreak(); } - static bool TryConstFold(IR::Instr *instr, IR::RegOpnd *regOpnd) { __debugbreak(); return 0; } - static bool TryFold(IR::Instr *instr, IR::RegOpnd *regOpnd) { __debugbreak(); return 0; } - const BYTE GetRegEncode(IR::RegOpnd *regOpnd) { __debugbreak(); return 0; } - const BYTE GetFloatRegEncode(IR::RegOpnd *regOpnd) { __debugbreak(); return 0; } - static const BYTE GetRegEncode(RegNum reg) { __debugbreak(); return 0; } - static uint32 GetOpdope(IR::Instr *instr) { __debugbreak(); return 0; } - static uint32 GetOpdope(Js::OpCode op) { __debugbreak(); return 0; } - - static bool IsLoad(IR::Instr *instr) { __debugbreak(); return 0; } - static bool IsStore(IR::Instr *instr) { __debugbreak(); return 0; } - static bool IsShifterUpdate(IR::Instr *instr) { __debugbreak(); return 0; } - static bool IsShifterSub(IR::Instr *instr) { __debugbreak(); return 0; } - static bool IsShifterPost(IR::Instr *instr) { __debugbreak(); return 0; } - static bool SetsSBit(IR::Instr *instr) { __debugbreak(); return 0; } - - void AddLabelReloc(BYTE* relocAddress) { __debugbreak(); } - - static bool CanEncodeModConst12(DWORD constant) { __debugbreak(); return 0; } - static bool CanEncodeLoadStoreOffset(int32 offset) { __debugbreak(); return 0; } - static void BaseAndOffsetFromSym(IR::SymOpnd *symOpnd, RegNum *pBaseReg, int32 *pOffset, Func * func) { __debugbreak(); } - static bool EncodeImmediate16(int32 constant, DWORD * result); - - void EncodeInlineeCallInfo(IR::Instr *instr, uint32 offset) { __debugbreak(); } - - static ENCODE_32 BranchOffset_26(int64 x); + EncoderMD(Func * func) : m_func(func) { } + ptrdiff_t Encode(IR::Instr * instr, BYTE *pc, BYTE* beginCodeAddress = nullptr); + void Init(Encoder *encoder); + void ApplyRelocs(size_t codeBufferAddress, size_t codeSize, uint* bufferCRC, BOOL isBrShorteningSucceeded, bool isFinalBufferValidation = false); + static bool TryConstFold(IR::Instr *instr, IR::RegOpnd *regOpnd); + static bool TryFold(IR::Instr *instr, IR::RegOpnd *regOpnd); + const BYTE GetRegEncode(IR::RegOpnd *regOpnd); + const BYTE GetFloatRegEncode(IR::RegOpnd *regOpnd); + static const BYTE GetRegEncode(RegNum reg); + static uint32 GetOpdope(IR::Instr *instr); + static uint32 GetOpdope(Js::OpCode op); + + static bool IsLoad(IR::Instr *instr) + { + return ISLOAD(instr->m_opcode); + } + + static bool IsStore(IR::Instr *instr) + { + return ISSTORE(instr->m_opcode); + } + + static bool IsShifterUpdate(IR::Instr *instr) + { + return ISSHIFTERUPDATE(instr->m_opcode); + } + + static bool IsShifterSub(IR::Instr *instr) + { + return ISSHIFTERSUB(instr->m_opcode); + } + + static bool IsShifterPost(IR::Instr *instr) + { + return ISSHIFTERPOST(instr->m_opcode); + } + + static bool SetsSBit(IR::Instr *instr) + { + return SETS_SBIT(instr->m_opcode); + } + + static DWORD BranchOffset_26(int64 x); + + void AddLabelReloc(BYTE* relocAddress); + + static bool CanEncodeLogicalConst(IntConstType constant, int size); + // ToDo (SaAgarwa) Copied from ARM32 to compile. Validate is this correct + static bool CanEncodeLoadStoreOffset(int32 offset) { return IS_CONST_UINT12(offset); } + static void BaseAndOffsetFromSym(IR::SymOpnd *symOpnd, RegNum *pBaseReg, int32 *pOffset, Func * func); + void EncodeInlineeCallInfo(IR::Instr *instr, uint32 offset); +private: + Func * m_func; + Encoder * m_encoder; + BYTE * m_pc; + EncodeReloc * m_relocList; +private: + ULONG GenerateEncoding(IR::Instr* instr, BYTE *pc); + bool CanonicalizeInstr(IR::Instr *instr); + void CanonicalizeLea(IR::Instr * instr); + bool DecodeMemoryOpnd(IR::Opnd* opnd, ARM64_REGISTER &baseRegResult, ARM64_REGISTER &indexRegResult, BYTE &indexScale, int32 &offset); + static bool EncodeLogicalConst(IntConstType constant, DWORD * result, int size); + + // General 1-operand instructions (BR, RET) + template int EmitOp1Register64(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc64 reg64); + + // General 2-operand instructions (CLZ, MOV) + template int EmitOp2Register(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64); + + // General 3-operand instructions (ADD, AND, SUB, etc) follow a very standard pattern + template int EmitOp3Register(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64); + template int EmitOp3RegisterShifted(Arm64CodeEmitter &Emitter, IR::Instr* instr, SHIFT_EXTEND_TYPE shiftType, int shiftAmount, _RegFunc32 reg32, _RegFunc64 reg64); + template int EmitOp3Immediate(Arm64CodeEmitter &Emitter, IR::Instr* instr, _ImmFunc32 imm32, _ImmFunc64 imm64); + template int EmitOp3RegisterOrImmediate(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64, _ImmFunc32 imm32, _ImmFunc64 imm64); + template int EmitOp3RegisterOrImmediateExtendSPReg(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64, _ImmFunc32 imm32, _ImmFunc64 imm64); + template int EmitOp3RegisterOrImmediateExtendSP(Arm64CodeEmitter &Emitter, IR::Instr* instr, _RegFunc32 reg32, _RegFunc64 reg64, _ImmFunc32 imm32, _ImmFunc64 imm64); + + // Load/store operations + int EmitPrefetch(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd); + template + int EmitLoadStore(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd, IR::Opnd* srcDstOpnd, _RegFunc8 reg8, _RegFunc16 reg16, _RegFunc32 reg32, _RegFunc64 reg64, _OffFunc8 off8, _OffFunc16 off16, _OffFunc32 off32, _OffFunc64 off64); + template int EmitLoadStorePair(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd, IR::Opnd* srcDst1Opnd, IR::Opnd* srcDst2Opnd, _OffFunc32 off32, _OffFunc64 off64); + + // Branch operations + template int EmitUnconditionalBranch(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Emitter emitter); + int EmitConditionalBranch(Arm64CodeEmitter &Emitter, IR::Instr* instr, int condition); + template int EmitCompareAndBranch(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Emitter emitter, _Emitter64 emitter64); + template int EmitTestAndBranch(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Emitter emitter); + + // Misc operations + template int EmitMovConstant(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Emitter emitter, _Emitter64 emitter64); + template int EmitBitfield(Arm64CodeEmitter &Emitter, IR::Instr *instr, _Emitter emitter, _Emitter64 emitter64); + template int EmitConditionalSelect(Arm64CodeEmitter &Emitter, IR::Instr *instr, int condition, _Emitter emitter, _Emitter64 emitter64); + + // Floating point instructions + template int EmitOp2FpRegister(Arm64CodeEmitter &Emitter, IR::Instr *instr, _Emitter emitter); + template int EmitOp2FpRegister(Arm64CodeEmitter &Emitter, IR::Opnd* opnd1, IR::Opnd* opnd2, _Emitter emitter); + template int EmitOp3FpRegister(Arm64CodeEmitter &Emitter, IR::Instr *instr, _Emitter emitter); + template int EmitLoadStoreFp(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd, IR::Opnd* srcDstOpnd, _LoadStoreFunc loadStore); + template int EmitLoadStoreFpPair(Arm64CodeEmitter &Emitter, IR::Instr* instr, IR::Opnd* memOpnd, IR::Opnd* srcDst1Opnd, IR::Opnd* srcDst2Opnd, _LoadStoreFunc loadStore); + template int EmitConvertToInt(Arm64CodeEmitter &Emitter, IR::Instr* instr, _Int32Func toInt32, _Uint32Func toUint32, _Int64Func toInt64, _Uint64Func toUint64); }; diff --git a/deps/chakrashim/core/lib/Backend/arm64/LegalizeMD.cpp b/deps/chakrashim/core/lib/Backend/arm64/LegalizeMD.cpp new file mode 100644 index 00000000000..34b45d13805 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/LegalizeMD.cpp @@ -0,0 +1,1027 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "Backend.h" + +// Build static array of legal instruction forms +#undef MACRO +#define MACRO(name, jnLayout, attrib, byte2, legalforms, opbyte, ...) legalforms, +static const LegalInstrForms _InstrForms[] = +{ +#include "MdOpCodes.h" +}; + +// Local class for tracking the opcodes used by an expanded LDIMM +class LdImmOpcode +{ +public: + void Set(Js::OpCode opcode, IntConstType immed, int shift) + { + m_opcode = opcode; + m_immed = immed; + m_shift = shift; + } + + Js::OpCode m_opcode; + int m_shift; + IntConstType m_immed; +}; + + +static LegalForms LegalDstForms(IR::Instr * instr) +{ + Assert(instr->IsLowered()); + return _InstrForms[instr->m_opcode - (Js::OpCode::MDStart+1)].dst; +} + +static LegalForms LegalSrcForms(IR::Instr * instr, uint opndNum) +{ + Assert(instr->IsLowered()); + return _InstrForms[instr->m_opcode - (Js::OpCode::MDStart+1)].src[opndNum-1]; +} + +void LegalizeMD::LegalizeInstr(IR::Instr * instr, bool fPostRegAlloc) +{ + if (!instr->IsLowered()) + { + AssertMsg(UNREACHED, "Unlowered instruction in m.d. legalizer"); + return; + } + + // Convert CMP/CMN/TST opcodes into more primitive forms + switch (instr->m_opcode) + { + case Js::OpCode::CMP: + instr->SetDst(IR::RegOpnd::New(NULL, RegZR, instr->GetSrc1()->GetType() , instr->m_func)); + instr->m_opcode = Js::OpCode::SUBS; + break; + + case Js::OpCode::CMN: + instr->SetDst(IR::RegOpnd::New(NULL, RegZR, instr->GetSrc1()->GetType(), instr->m_func)); + instr->m_opcode = Js::OpCode::ADDS; + break; + + case Js::OpCode::TST: + instr->SetDst(IR::RegOpnd::New(NULL, RegZR, instr->GetSrc1()->GetType(), instr->m_func)); + instr->m_opcode = Js::OpCode::ANDS; + break; + } + + LegalizeDst(instr, fPostRegAlloc); + LegalizeSrc(instr, instr->GetSrc1(), 1, fPostRegAlloc); + LegalizeSrc(instr, instr->GetSrc2(), 2, fPostRegAlloc); +} + +void LegalizeMD::LegalizeRegOpnd(IR::Instr* instr, IR::Opnd* opnd) +{ + // Arm64 does not support 8 or 16 bit register usage, so promote anything smaller than 32 bits up to 32 bits. + IRType ty = opnd->GetType(); + switch(ty) + { + case TyInt8: + case TyInt16: + ty = TyInt32; + break; + + case TyUint8: + case TyUint16: + ty = TyUint32; + break; + } + + if (ty != opnd->GetType()) + { + // UseWithNewType will make a copy if the register is already in use. We know it is in use because it is used in this instruction, and we want to reuse this operand rather than making a copy + // so UnUse it before calling UseWithNewType. + opnd->UnUse(); + opnd->UseWithNewType(ty, instr->m_func); + } +} + +void LegalizeMD::LegalizeDst(IR::Instr * instr, bool fPostRegAlloc) +{ + LegalForms forms = LegalDstForms(instr); + + IR::Opnd * opnd = instr->GetDst(); + if (opnd == NULL) + { +#ifdef DBG + // No legalization possible, just report error. + if (forms != 0) + { + IllegalInstr(instr, _u("Expected dst opnd")); + } +#endif + return; + } + + switch (opnd->GetKind()) + { + case IR::OpndKindReg: +#ifdef DBG + if (!(forms & L_RegMask)) + { + IllegalInstr(instr, _u("Unexpected reg dst")); + } +#endif + LegalizeRegOpnd(instr, opnd); + break; + + case IR::OpndKindMemRef: + { + // MemRefOpnd is a deference of the memory location. + // So extract the location, load it to register, replace the MemRefOpnd with an IndirOpnd taking the + // register as base, and fall through to legalize the IndirOpnd. + intptr_t memLoc = opnd->AsMemRefOpnd()->GetMemLoc(); + IR::RegOpnd *newReg = IR::RegOpnd::New(TyMachPtr, instr->m_func); + if (fPostRegAlloc) + { + newReg->SetReg(SCRATCH_REG); + } + IR::Instr *newInstr = IR::Instr::New(Js::OpCode::LDIMM, newReg, + IR::AddrOpnd::New(memLoc, opnd->AsMemRefOpnd()->GetAddrKind(), instr->m_func, true), instr->m_func); + instr->InsertBefore(newInstr); + LegalizeMD::LegalizeInstr(newInstr, fPostRegAlloc); + IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(newReg, 0, opnd->GetType(), instr->m_func); + opnd = instr->ReplaceDst(indirOpnd); + } + // FALL THROUGH + case IR::OpndKindIndir: + if (!(forms & L_IndirMask)) + { + instr = LegalizeStore(instr, forms, fPostRegAlloc); + forms = LegalDstForms(instr); + } + LegalizeIndirOffset(instr, opnd->AsIndirOpnd(), forms, fPostRegAlloc); + break; + + case IR::OpndKindSym: + if (!(forms & L_SymMask)) + { + instr = LegalizeStore(instr, forms, fPostRegAlloc); + forms = LegalDstForms(instr); + } + + if (fPostRegAlloc) + { + // In order to legalize SymOffset we need to know final argument area, which is only available after lowerer. + // So, don't legalize sym offset here, but it will be done as part of register allocator. + LegalizeSymOffset(instr, opnd->AsSymOpnd(), forms, fPostRegAlloc); + } + break; + + default: + AssertMsg(UNREACHED, "Unexpected dst opnd kind"); + break; + } +} + +IR::Instr * LegalizeMD::LegalizeStore(IR::Instr *instr, LegalForms forms, bool fPostRegAlloc) +{ + if (LowererMD::IsAssign(instr) && instr->GetSrc1()->IsRegOpnd()) + { + // We can just change this to a store in place. + instr->m_opcode = LowererMD::GetStoreOp(instr->GetSrc1()->GetType()); + } + else + { + // Sink the mem opnd. The caller will verify the offset. + // We don't expect to hit this point after register allocation, because we + // can't guarantee that the instruction will be legal. + Assert(!fPostRegAlloc); + IR::Instr * newInstr = instr->SinkDst(LowererMD::GetStoreOp(instr->GetDst()->GetType()), RegNOREG); + LegalizeMD::LegalizeRegOpnd(instr, instr->GetDst()); + instr = newInstr; + } + + return instr; +} + +void LegalizeMD::LegalizeSrc(IR::Instr * instr, IR::Opnd * opnd, uint opndNum, bool fPostRegAlloc) +{ + LegalForms forms = LegalSrcForms(instr, opndNum); + if (opnd == NULL) + { +#ifdef DBG + // No legalization possible, just report error. + if (forms != 0) + { + IllegalInstr(instr, _u("Expected src %d opnd"), opndNum); + } +#endif + return; + } + + switch (opnd->GetKind()) + { + case IR::OpndKindReg: +#ifdef DBG + if (!(forms & L_RegMask)) + { + IllegalInstr(instr, _u("Unexpected reg as src%d opnd"), opndNum); + } +#endif + LegalizeRegOpnd(instr, opnd); + break; + + case IR::OpndKindAddr: + case IR::OpndKindHelperCall: + case IR::OpndKindIntConst: + LegalizeImmed(instr, opnd, opndNum, opnd->GetImmediateValue(instr->m_func), forms, fPostRegAlloc); + break; + + case IR::OpndKindLabel: + LegalizeLabelOpnd(instr, opnd, opndNum, fPostRegAlloc); + break; + + case IR::OpndKindMemRef: + { + // MemRefOpnd is a deference of the memory location. + // So extract the location, load it to register, replace the MemRefOpnd with an IndirOpnd taking the + // register as base, and fall through to legalize the IndirOpnd. + intptr_t memLoc = opnd->AsMemRefOpnd()->GetMemLoc(); + IR::RegOpnd *newReg = IR::RegOpnd::New(TyMachPtr, instr->m_func); + if (fPostRegAlloc) + { + newReg->SetReg(SCRATCH_REG); + } + IR::Instr *newInstr = IR::Instr::New(Js::OpCode::LDIMM, newReg, IR::AddrOpnd::New(memLoc, IR::AddrOpndKindDynamicMisc, instr->m_func), instr->m_func); + instr->InsertBefore(newInstr); + LegalizeMD::LegalizeInstr(newInstr, fPostRegAlloc); + IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(newReg, 0, opnd->GetType(), instr->m_func); + if (opndNum == 1) + { + opnd = instr->ReplaceSrc1(indirOpnd); + } + else + { + opnd = instr->ReplaceSrc2(indirOpnd); + } + } + // FALL THROUGH + case IR::OpndKindIndir: + if (!(forms & L_IndirMask)) + { + instr = LegalizeLoad(instr, opndNum, forms, fPostRegAlloc); + forms = LegalSrcForms(instr, 1); + } + LegalizeIndirOffset(instr, opnd->AsIndirOpnd(), forms, fPostRegAlloc); + break; + + case IR::OpndKindSym: + if (!(forms & L_SymMask)) + { + instr = LegalizeLoad(instr, opndNum, forms, fPostRegAlloc); + forms = LegalSrcForms(instr, 1); + } + + if (fPostRegAlloc) + { + // In order to legalize SymOffset we need to know final argument area, which is only available after lowerer. + // So, don't legalize sym offset here, but it will be done as part of register allocator. + LegalizeSymOffset(instr, opnd->AsSymOpnd(), forms, fPostRegAlloc); + } + break; + + default: + AssertMsg(UNREACHED, "Unexpected src opnd kind"); + break; + } +} + +IR::Instr * LegalizeMD::LegalizeLoad(IR::Instr *instr, uint opndNum, LegalForms forms, bool fPostRegAlloc) +{ + if (LowererMD::IsAssign(instr) && instr->GetDst()->IsRegOpnd()) + { + // We can just change this to a load in place. + instr->m_opcode = LowererMD::GetLoadOp(instr->GetDst()->GetType()); + } + else + { + // Hoist the memory opnd. The caller will verify the offset. + IR::Opnd* src = (opndNum == 1) ? instr->GetSrc1() : instr->GetSrc2(); + AssertMsg(!fPostRegAlloc || src->GetType() == TyMachReg, "Post RegAlloc other types disallowed"); + instr = GenerateHoistSrc(instr, opndNum, LowererMD::GetLoadOp(src->GetType()), fPostRegAlloc ? SCRATCH_REG : RegNOREG, fPostRegAlloc); + } + + if (instr->m_opcode == Js::OpCode::LDR && instr->GetSrc1()->IsSigned()) + { + instr->m_opcode = Js::OpCode::LDRS; + } + + return instr; +} + +void LegalizeMD::LegalizeIndirOffset(IR::Instr * instr, IR::IndirOpnd * indirOpnd, LegalForms forms, bool fPostRegAlloc) +{ + int32 offset = indirOpnd->GetOffset(); + + if (indirOpnd->IsFloat()) + { + IR::RegOpnd *baseOpnd = indirOpnd->GetBaseOpnd(); + IR::RegOpnd *indexOpnd = indirOpnd->UnlinkIndexOpnd(); //Clears index operand + byte scale = indirOpnd->GetScale(); + + if (indexOpnd) + { + if (scale > 0) + { + // There is no support for ADD instruction with barrel shifter in encoder, hence add an explicit instruction to left shift the index operand + // Reason is this requires 4 operand in IR and there is no support for this yet. + // If we encounter more such scenarios, its better to solve the root cause. + // Also VSTR & VLDR don't take index operand as parameter + IR::RegOpnd* newIndexOpnd = IR::RegOpnd::New(indexOpnd->GetType(), instr->m_func); + IR::Instr* newInstr = IR::Instr::New(Js::OpCode::LSL, newIndexOpnd, indexOpnd, + IR::IntConstOpnd::New(scale, TyMachReg, instr->m_func), instr->m_func); + instr->InsertBefore(newInstr); + indirOpnd->SetScale(0); //Clears scale + indexOpnd = newIndexOpnd; + } + + instr->HoistIndirIndexOpndAsAdd(indirOpnd, baseOpnd, indexOpnd, fPostRegAlloc ? SCRATCH_REG : RegNOREG); + } + } + else if (indirOpnd->GetIndexOpnd() != NULL && offset != 0) + { + // Can't have both offset and index, so hoist the offset and try again. + IR::Instr *addInstr = instr->HoistIndirOffset(indirOpnd, fPostRegAlloc ? SCRATCH_REG : RegNOREG); + LegalizeMD::LegalizeInstr(addInstr, fPostRegAlloc); + return; + } + + // Determine scale factor for scaled offsets + int size = indirOpnd->GetSize(); + int32 scaledOffset = offset / size; + + // Either scaled unsigned 12-bit offset, or unscaled signed 9-bit offset + if (forms & L_IndirSU12I9) + { + if (offset == (scaledOffset * size) && IS_CONST_UINT12(scaledOffset)) + { + return; + } + if (IS_CONST_INT9(offset)) + { + return; + } + } + if (forms & L_IndirU12Lsl12) + { + if (IS_CONST_UINT12(offset) || IS_CONST_UINT12LSL12(offset)) + { + return; + } + } + + // scaled signed 9-bit offset + if (forms & L_IndirSI7) + { + if (IS_CONST_INT7(scaledOffset)) + { + return; + } + } + + // Offset is too large, so hoist it and replace it with an index + IR::Instr *addInstr = instr->HoistIndirOffset(indirOpnd, fPostRegAlloc ? SCRATCH_REG : RegNOREG); + LegalizeMD::LegalizeInstr(addInstr, fPostRegAlloc); +} + +void LegalizeMD::LegalizeSymOffset( + IR::Instr * instr, + IR::SymOpnd * symOpnd, + LegalForms forms, + bool fPostRegAlloc) +{ + AssertMsg(fPostRegAlloc, "LegalizeMD::LegalizeSymOffset can (and will) be called as part of register allocation. Can't call it as part of lowerer, as final argument area is not available yet."); + + RegNum baseReg; + int32 offset; + + if (!symOpnd->m_sym->IsStackSym()) + { + return; + } + + EncoderMD::BaseAndOffsetFromSym(symOpnd, &baseReg, &offset, instr->m_func->GetTopFunc()); + + // Determine scale factor for scaled offsets + int scale = (symOpnd->GetType() == TyFloat64) ? 3 : 2; + int32 scaledOffset = offset >> scale; + + // Either scaled unsigned 12-bit offset, or unscaled signed 9-bit offset + if (forms & L_SymSU12I9) + { + if (offset == (scaledOffset << scale) && IS_CONST_UINT12(scaledOffset)) + { + return; + } + if (IS_CONST_INT9(offset)) + { + return; + } + } + + // This is so far used for LEA, where the offset ends up needing to be a valid ADD immediate + if (forms & L_SymU12Lsl12) + { + if (IS_CONST_00000FFF(offset) || IS_CONST_00FFF000(offset)) + { + return; + } + } + + // scaled signed 9-bit offset + if (forms & L_SymSI7) + { + if (IS_CONST_INT7(scaledOffset)) + { + return; + } + } + + IR::Instr * newInstr; + if (instr->m_opcode == Js::OpCode::LEA) + { + instr->m_opcode = Js::OpCode::ADD; + instr->ReplaceSrc1(IR::RegOpnd::New(NULL, baseReg, TyMachPtr, instr->m_func)); + instr->SetSrc2(IR::IntConstOpnd::New(offset, TyMachReg, instr->m_func)); + newInstr = instr->HoistSrc2(Js::OpCode::LDIMM, fPostRegAlloc ? SCRATCH_REG : RegNOREG); + LegalizeMD::LegalizeInstr(newInstr, fPostRegAlloc); + LegalizeMD::LegalizeInstr(instr, fPostRegAlloc); + } + else + { + newInstr = instr->HoistSymOffset(symOpnd, baseReg, offset, fPostRegAlloc ? SCRATCH_REG : RegNOREG); + LegalizeMD::LegalizeInstr(newInstr, fPostRegAlloc); + } +} + +void LegalizeMD::LegalizeImmed( + IR::Instr * instr, + IR::Opnd * opnd, + uint opndNum, + IntConstType immed, + LegalForms forms, + bool fPostRegAlloc) +{ + int size = instr->GetDst()->GetSize(); + if (!(((forms & L_ImmLog12) && EncoderMD::CanEncodeLogicalConst(immed, size)) || + ((forms & L_ImmU12) && IS_CONST_UINT12(immed)) || + ((forms & L_ImmU12Lsl12) && IS_CONST_UINT12LSL12(immed)) || + ((forms & L_ImmU6) && IS_CONST_UINT6(immed)) || + ((forms & L_ImmU16) && IS_CONST_UINT16(immed)) || + ((forms & L_ImmU6U6) && IS_CONST_UINT6UINT6(immed)))) + { + if (instr->m_opcode != Js::OpCode::LDIMM) + { + instr = LegalizeMD::GenerateLDIMM(instr, opndNum, fPostRegAlloc ? SCRATCH_REG : RegNOREG, fPostRegAlloc); + } + + if (fPostRegAlloc) + { + LegalizeMD::LegalizeLDIMM(instr, immed); + } + } +} + +void LegalizeMD::LegalizeLabelOpnd( + IR::Instr * instr, + IR::Opnd * opnd, + uint opndNum, + bool fPostRegAlloc) +{ + if (instr->m_opcode != Js::OpCode::LDIMM) + { + instr = LegalizeMD::GenerateLDIMM(instr, opndNum, fPostRegAlloc ? SCRATCH_REG : RegNOREG, fPostRegAlloc); + } + if (fPostRegAlloc) + { + LegalizeMD::LegalizeLdLabel(instr, opnd); + } +} + +IR::Instr * LegalizeMD::GenerateHoistSrc(IR::Instr * instr, uint opndNum, Js::OpCode op, RegNum scratchReg, bool fPostRegAlloc) +{ + IR::Instr * newInstr; + if (opndNum == 1) + { + newInstr = instr->HoistSrc1(op, scratchReg); + LegalizeMD::LegalizeRegOpnd(instr, instr->GetSrc1()); + } + else + { + newInstr = instr->HoistSrc2(op, scratchReg); + LegalizeMD::LegalizeRegOpnd(instr, instr->GetSrc2()); + } + return newInstr; +} + +IR::Instr * LegalizeMD::GenerateLDIMM(IR::Instr * instr, uint opndNum, RegNum scratchReg, bool fPostRegAlloc) +{ + if (LowererMD::IsAssign(instr) && instr->GetDst()->IsRegOpnd()) + { + instr->m_opcode = Js::OpCode::LDIMM; + } + else + { + instr = GenerateHoistSrc(instr, opndNum, Js::OpCode::LDIMM, scratchReg, fPostRegAlloc); + } + + return instr; +} + +void LegalizeMD::LegalizeLDIMM(IR::Instr * instr, IntConstType immed) +{ + // In case of inlined entry instruction, we don't know the offset till the encoding phase + if (!instr->isInlineeEntryInstr) + { + + // If the source is a tagged int, and the dest is int32 or uint32, untag the value so that it fits in 32 bits. + if (instr->GetDst()->IsIntegral32() && instr->GetSrc1()->IsTaggedInt()) + { + immed = (int32)immed; + instr->ReplaceSrc1(IR::IntConstOpnd::New(immed, instr->GetDst()->GetType(), instr->m_func)); + } + + // Short-circuit simple 16-bit immediates + if ((immed & 0xffff) == immed || (immed & 0xffff0000) == immed || (immed & 0xffff00000000ll) == immed || (immed & 0xffff000000000000ll) == immed) + { + instr->m_opcode = Js::OpCode::MOVZ; + uint32 shift = ShiftTo16((UIntConstType*)&immed); + instr->ReplaceSrc1(IR::IntConstOpnd::New(immed, TyUint16, instr->m_func)); + instr->SetSrc2(IR::IntConstOpnd::New(shift, TyUint8, instr->m_func)); + return; + } + + // Short-circuit simple inverted 16-bit immediates + IntConstType invImmed = ~immed; + if ((invImmed & 0xffff) == invImmed || (invImmed & 0xffff0000) == invImmed || (invImmed & 0xffff00000000ll) == invImmed || (invImmed & 0xffff000000000000ll) == invImmed) + { + instr->m_opcode = Js::OpCode::MOVN; + immed = invImmed; + uint32 shift = ShiftTo16((UIntConstType*)&immed); + instr->ReplaceSrc1(IR::IntConstOpnd::New(immed, TyUint16, instr->m_func)); + instr->SetSrc2(IR::IntConstOpnd::New(shift, TyUint8, instr->m_func)); + return; + } + + // Short-circuit simple inverted 16-bit immediates that can be implicitly truncated to 32 bits + if (immed == (uint32)immed) + { + IntConstType invImmed32 = ~immed & 0xffffffffull; + if ((invImmed32 & 0xffff) == invImmed32 || (invImmed32 & 0xffff0000) == invImmed32) + { + instr->GetDst()->SetType(TyInt32); + uint32 shift = ShiftTo16((UIntConstType*)&invImmed32); + IR::IntConstOpnd *src1 = IR::IntConstOpnd::New(invImmed32 & 0xFFFF, TyInt16, instr->m_func); + IR::IntConstOpnd *src2 = IR::IntConstOpnd::New(shift, TyUint8, instr->m_func); + instr->ReplaceSrc1(src1); + instr->SetSrc2(src2); + instr->m_opcode = Js::OpCode::MOVN; + return; + } + } + + // Short-circuit 32-bit logical constants + if (EncoderMD::CanEncodeLogicalConst(immed, 4)) + { + instr->GetDst()->SetType(TyInt32); + instr->SetSrc2(instr->GetSrc1()); + instr->ReplaceSrc1(IR::RegOpnd::New(NULL, RegZR, TyInt32, instr->m_func)); + instr->m_opcode = Js::OpCode::ORR; + return; + } + + // Short-circuit 64-bit logical constants + if (instr->GetDst()->GetSize() == 8 && EncoderMD::CanEncodeLogicalConst(immed, 8)) + { + instr->SetSrc2(instr->GetSrc1()); + instr->ReplaceSrc1(IR::RegOpnd::New(NULL, RegZR, TyInt64, instr->m_func)); + instr->m_opcode = Js::OpCode::ORR; + return; + } + + // Determine how many 16-bit chunks are all-0 versus all-1 + int numZeros = 0; + int numOnes = 0; + for (int wordNum = 0; wordNum < 4; wordNum++) + { + ULONG curWord = (immed >> (16 * wordNum)) & 0xffff; + if (curWord == 0) + { + numZeros++; + } + else if (curWord == 0xffff) + { + numOnes++; + } + } + + // Determine whether to obfuscate + bool fDontEncode = Security::DontEncode(instr->GetSrc1()); + + // Determine whether the initial opcode will be a MOVZ or a MOVN + ULONG wordMask = (numOnes > numZeros) ? 0xffff : 0x0000; + ULONG wordXor = wordMask; + Js::OpCode curOpcode = (wordMask == 0xffff) ? Js::OpCode::MOVN : Js::OpCode::MOVZ; + + // Build a theoretical list of opcodes + LdImmOpcode opcodeList[4]; + int opcodeListIndex = 0; + for (int wordNum = 0; wordNum < 4; wordNum++) + { + ULONG curWord = (immed >> (16 * wordNum)) & 0xffff; + if (curWord != wordMask) + { + opcodeList[opcodeListIndex++].Set(curOpcode, curWord ^ wordXor, 16 * wordNum); + curOpcode = Js::OpCode::MOVK; + wordXor = 0; + } + } + + // Insert extra opcodes as needed + for (int opNum = 0; opNum < opcodeListIndex - 1; opNum++) + { + IR::IntConstOpnd *src1 = IR::IntConstOpnd::New(opcodeList[opNum].m_immed, TyInt16, instr->m_func); + IR::IntConstOpnd *src2 = IR::IntConstOpnd::New(opcodeList[opNum].m_shift, TyUint8, instr->m_func); + IR::Instr * instrMov = IR::Instr::New(opcodeList[opNum].m_opcode, instr->GetDst(), src1, src2, instr->m_func); + instr->InsertBefore(instrMov); + } + + // Replace the LDIMM with the final opcode + IR::IntConstOpnd *src1 = IR::IntConstOpnd::New(opcodeList[opcodeListIndex - 1].m_immed, TyInt16, instr->m_func); + IR::IntConstOpnd *src2 = IR::IntConstOpnd::New(opcodeList[opcodeListIndex - 1].m_shift, TyUint8, instr->m_func); + instr->ReplaceSrc1(src1); + instr->SetSrc2(src2); + instr->m_opcode = opcodeList[opcodeListIndex - 1].m_opcode; + + if (!fDontEncode) + { + // ARM64_WORKITEM: Hook this up +// LegalizeMD::ObfuscateLDIMM(instrMov, instr); + } + } + else + { + // Since we don't know the value yet, we're going to handle it when we do + // This is done by having the load be from a label operand, which is later + // changed such that its offset is the correct value to ldimm + + // InlineeCallInfo is encoded as ((offset into function) << 4) | (argCount & 0xF). + // This will fit into 32 bits as long as the function has less than 2^26 instructions, which should be always. + + // The assembly generated becomes something like + // Label (offset:fake) + // MOVZ DST, Label + // MOVK DST, Label <- was the LDIMM + + Assert(Security::DontEncode(instr->GetSrc1())); + + // The label with the special offset value, used for reloc + IR::LabelInstr *label = IR::LabelInstr::New(Js::OpCode::Label, instr->m_func, false); + instr->InsertBefore(label); + Assert((immed & 0x0000000F) == immed); + label->SetOffset((uint32)immed); + label->isInlineeEntryInstr = true; + + IR::LabelOpnd *target = IR::LabelOpnd::New(label, instr->m_func); + + // We'll handle splitting this up to properly load the immediates now + // Typically (and worst case) we'll need to load 64 bits. + IR::Instr* bits0_15 = IR::Instr::New(Js::OpCode::MOVZ, instr->GetDst(), target, IR::IntConstOpnd::New(0, IRType::TyUint8, instr->m_func, true), instr->m_func); + instr->InsertBefore(bits0_15); + + instr->ReplaceSrc1(target); + instr->SetSrc2(IR::IntConstOpnd::New(16, IRType::TyUint8, instr->m_func, true)); + instr->m_opcode = Js::OpCode::MOVK; + + instr->isInlineeEntryInstr = false; + } +} + +void LegalizeMD::ObfuscateLDIMM(IR::Instr * instrMov, IR::Instr * instrMovt) +{ + // Are security measures disabled? + + if (CONFIG_ISENABLED(Js::DebugFlag) || + CONFIG_ISENABLED(Js::BenchmarkFlag) || + PHASE_OFF(Js::EncodeConstantsPhase, instrMov->m_func->GetTopFunc()) + ) + { + return; + } + + UINT_PTR rand = Math::Rand(); + + // Use this random value as follows: + // bits 0-3: reg to use in pre-LDIMM instr + // bits 4: do/don't emit pre-LDIMM instr + // bits 5-6: emit and/or/add/mov as pre-LDIMM instr + // Similarly for bits 7-13 (mid-LDIMM) and 14-20 (post-LDIMM) + + RegNum targetReg = instrMov->GetDst()->AsRegOpnd()->GetReg(); + + LegalizeMD::EmitRandomNopBefore(instrMov, rand, targetReg); + LegalizeMD::EmitRandomNopBefore(instrMovt, rand >> 7, targetReg); + LegalizeMD::EmitRandomNopBefore(instrMovt->m_next, rand >> 14, targetReg); +} + +void LegalizeMD::EmitRandomNopBefore(IR::Instr *insertInstr, UINT_PTR rand, RegNum targetReg) +{ + // bits 0-3: reg to use in pre-LDIMM instr + // bits 4: do/don't emit pre-LDIMM instr + // bits 5-6: emit and/or/add/mov as pre-LDIMM instr + + if (!(rand & (1 << 4)) && !PHASE_FORCE(Js::EncodeConstantsPhase, insertInstr->m_func->GetTopFunc())) + { + return; + } + + IR::Instr * instr; + IR::RegOpnd * opnd1; + IR::Opnd * opnd2 = NULL; + Js::OpCode op = Js::OpCode::InvalidOpCode; + + RegNum regNum = (RegNum)((rand & ((1 << 4) - 1)) + RegR0); + + opnd1 = IR::RegOpnd::New(NULL, regNum, TyMachReg, insertInstr->m_func); + + if (regNum == RegSP || regNum == targetReg) //skip sp & the target reg + { + // ORR pc,pc,0 has unpredicted behavior. + // AND sp,sp,sp has unpredicted behavior. + // We avoid target reg to avoid pipeline stalls. + // Less likely target reg will be RegR17 as we insert nops only for user defined constants and + // RegR12 is mostly used for temporary data such as legalizer post regalloc. + opnd1->SetReg(SCRATCH_REG); + } + + switch ((rand >> 5) & 3) + { + case 0: + op = Js::OpCode::AND; + opnd2 = opnd1; + break; + case 1: + op = Js::OpCode::ORR; + opnd2 = IR::IntConstOpnd::New(0, TyMachReg, insertInstr->m_func); + break; + case 2: + op = Js::OpCode::ADD; + opnd2 = IR::IntConstOpnd::New(0, TyMachReg, insertInstr->m_func); + break; + case 3: + op = Js::OpCode::MOV; + break; + } + + instr = IR::Instr::New(op, opnd1, opnd1, insertInstr->m_func); + if (opnd2) + { + instr->SetSrc2(opnd2); + } + insertInstr->InsertBefore(instr); +} + +void LegalizeMD::LegalizeLdLabel(IR::Instr * instr, IR::Opnd * opnd) +{ + Assert(instr->m_opcode == Js::OpCode::LDIMM); + Assert(opnd->IsLabelOpnd()); + + if (opnd->AsLabelOpnd()->GetLabel()->isInlineeEntryInstr) + { + // We want to leave it as LDIMMs so that we can easily disambiguate later + return; + } + else + { + instr->m_opcode = Js::OpCode::ADR; + } +} + +namespace +{ + IR::LabelInstr* TryInsertBranchIsland(IR::Instr* instr, IR::LabelInstr* target, int limit, bool forward) + { + int instrCount = 1; + IR::Instr* branchInstr = nullptr; + + if (forward) + { + for (IR::Instr* next = instr->m_next; instrCount < limit && next != nullptr; next = next->m_next) + { + if (next->IsBranchInstr() && next->AsBranchInstr()->IsUnconditional()) + { + branchInstr = next; + break; + } + ++instrCount; + } + } + else + { + for (IR::Instr* prev = instr->m_prev; instrCount < limit && prev != nullptr; prev = prev->m_prev) + { + if (prev->IsBranchInstr() && prev->AsBranchInstr()->IsUnconditional()) + { + branchInstr = prev; + break; + } + ++instrCount; + } + } + + if (branchInstr == nullptr) + { + return nullptr; + } + + IR::LabelInstr* islandLabel = IR::LabelInstr::New(Js::OpCode::Label, instr->m_func, false); + branchInstr->InsertAfter(islandLabel); + + IR::BranchInstr* targetBranch = IR::BranchInstr::New(Js::OpCode::B, target, branchInstr->m_func); + islandLabel->InsertAfter(targetBranch); + + return islandLabel; + } +} + +bool LegalizeMD::LegalizeDirectBranch(IR::BranchInstr *branchInstr, uintptr_t branchOffset) +{ + Assert(branchInstr->IsBranchInstr()); + + uintptr_t labelOffset = branchInstr->GetTarget()->GetOffset(); + Assert(labelOffset); //Label offset must be set. + + intptr_t wordOffset = intptr_t(labelOffset - branchOffset) / 4; + //We should never run out of 26 bits which corresponds to +-64MB of code size. + AssertMsg(IS_CONST_INT26(wordOffset), "Cannot encode more that 64 MB offset"); + + Assert(!LowererMD::IsUnconditionalBranch(branchInstr)); + + int limit = 0; + if (branchInstr->m_opcode == Js::OpCode::TBZ || branchInstr->m_opcode == Js::OpCode::TBNZ) + { + // TBZ and TBNZ are limited to 14 bit offsets. + if (IS_CONST_INT14(wordOffset)) + { + return false; + } + limit = 0x00001fff; + } + else + { + // Other conditional branches are limited to 19 bit offsets. + if (IS_CONST_INT19(wordOffset)) + { + return false; + } + limit = 0x0003ffff; + } + + // Attempt to find an unconditional branch within the range and insert a branch island below it: + // CB. $island + // ... + // B + // $island: + // B $target + + IR::LabelInstr* islandLabel = TryInsertBranchIsland(branchInstr, branchInstr->GetTarget(), limit, wordOffset < 0); + if (islandLabel != nullptr) + { + branchInstr->SetTarget(islandLabel); + return true; + } + + // Convert a conditional branch which can only be +-256kb(+-8kb for TBZ/TBNZ) to unconditional branch which is +-64MB + // Convert beq Label (where Label is long jump) to something like this + // bne Fallback + // b Label + // Fallback: + + IR::LabelInstr *fallbackLabel = IR::LabelInstr::New(Js::OpCode::Label, branchInstr->m_func, false); + IR::BranchInstr *fallbackBranch = IR::BranchInstr::New(branchInstr->m_opcode, fallbackLabel, branchInstr->m_func); + + // CBZ | CBNZ | TBZ | TBNZ + if (branchInstr->GetSrc1() != nullptr) + { + fallbackBranch->SetSrc1(branchInstr->UnlinkSrc1()); + } + + // TBZ | TBNZ + if (branchInstr->GetSrc2() != nullptr) + { + fallbackBranch->SetSrc2(branchInstr->UnlinkSrc2()); + } + + LowererMD::InvertBranch(fallbackBranch); + + branchInstr->InsertBefore(fallbackBranch); + branchInstr->InsertAfter(fallbackLabel); + branchInstr->m_opcode = Js::OpCode::B; + return true; +} + +bool LegalizeMD::LegalizeAdrOffset(IR::Instr *instr, uintptr_t instrOffset) +{ + Assert(instr->m_opcode == Js::OpCode::ADR); + + IR::LabelOpnd* labelOpnd = instr->GetSrc1()->AsLabelOpnd(); + IR::LabelInstr* label = labelOpnd->GetLabel(); + + uintptr_t labelOffset = label->GetOffset(); + Assert(labelOffset); //Label offset must be set. + + intptr_t wordOffset = intptr_t(labelOffset - instrOffset) / 4; + + if (IS_CONST_INT19(wordOffset)) + { + return false; + } + + //We should never run out of 26 bits which corresponds to +-64MB of code size. + AssertMsg(IS_CONST_INT26(wordOffset), "Cannot encode more that 64 MB offset"); + + // Attempt to find an unconditional branch within the range and insert a branch island below it: + // ADR $island + // ... + // B + // $island: + // B $target + + int limit = 0x0003ffff; + IR::LabelInstr* islandLabel = TryInsertBranchIsland(instr, label, limit, wordOffset < 0); + if (islandLabel != nullptr) + { + labelOpnd->SetLabel(islandLabel); + return true; + } + + // Convert an Adr instruction which can only be +-1mb to branch which is +-64MB + // Adr $adrLabel + // b continue + // $adrLabel: + // b label + // $continue: + + IR::LabelInstr* continueLabel = IR::LabelInstr::New(Js::OpCode::Label, instr->m_func, false); + instr->InsertAfter(continueLabel); + + IR::BranchInstr* continueBranch = IR::BranchInstr::New(Js::OpCode::B, continueLabel, instr->m_func); + continueLabel->InsertBefore(continueBranch); + + IR::LabelInstr* adrLabel = IR::LabelInstr::New(Js::OpCode::Label, instr->m_func, false); + continueLabel->InsertBefore(adrLabel); + + IR::BranchInstr* labelBranch = IR::BranchInstr::New(Js::OpCode::B, label, instr->m_func); + continueLabel->InsertBefore(labelBranch); + + labelOpnd->SetLabel(adrLabel); + return true; +} + +bool LegalizeMD::LegalizeDataAdr(IR::Instr *instr, uintptr_t dataOffset) +{ + Assert(instr->m_opcode == Js::OpCode::ADR); + + IR::LabelOpnd* labelOpnd = instr->GetSrc1()->AsLabelOpnd(); + + Assert(labelOpnd->GetLabel()->m_isDataLabel); + + + // dataOffset provides an upper bound on the distance between instr and the label. + if (IS_CONST_INT19(dataOffset >> 2)) + { + return false; + } + + // The distance is too large to encode as an ADR isntruction so it must be handled as a 3 instruction load immediate. + // The label address won't be known until after encoding. Assign the label opnd as src1 to let the encoder know to handle them as relocs. + + IR::Instr* bits0_15 = IR::Instr::New(Js::OpCode::MOVZ, instr->GetDst(), labelOpnd, IR::IntConstOpnd::New(0, IRType::TyUint8, instr->m_func, true), instr->m_func); + instr->InsertBefore(bits0_15); + + IR::Instr* bits16_31 = IR::Instr::New(Js::OpCode::MOVK, instr->GetDst(), labelOpnd, IR::IntConstOpnd::New(16, IRType::TyUint8, instr->m_func, true), instr->m_func); + instr->InsertBefore(bits16_31); + + instr->SetSrc2(IR::IntConstOpnd::New(32, IRType::TyUint8, instr->m_func, true)); + instr->m_opcode = Js::OpCode::MOVK; + + return true; +} + +#ifdef DBG + +void LegalizeMD::IllegalInstr(IR::Instr * instr, const char16 * msg, ...) +{ + va_list argptr; + va_start(argptr, msg); + Output::Print(_u("Illegal instruction: ")); + instr->Dump(); + Output::Print(msg, argptr); + Assert(UNREACHED); +} + +#endif diff --git a/deps/chakrashim/core/lib/Backend/arm64/LegalizeMD.h b/deps/chakrashim/core/lib/Backend/arm64/LegalizeMD.h new file mode 100644 index 00000000000..6fd771b7062 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/LegalizeMD.h @@ -0,0 +1,119 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +enum LegalForms +{ + L_None = 0, + + L_Reg = 1, + L_RegMask = L_Reg, + + L_ImmLog12 = 0x10, + L_ImmU12 = 0x20, + L_ImmU12Lsl12 = 0x40, + L_ImmU6 = 0x80, + L_ImmU16 = 0x100, + L_Imm = 0x200, + L_ImmU6U6 = 0x400, + L_ImmMask = (L_ImmLog12 | L_ImmU12 | L_ImmU12Lsl12 | L_ImmU6 | L_ImmU16 | L_Imm | L_ImmU6U6), + + L_IndirSU12I9 = 0x1000, + L_IndirSI7 = 0x2000, + L_IndirU12 = 0x4000, + L_IndirU12Lsl12=0x8000, + L_IndirMask = (L_IndirSU12I9 | L_IndirSI7 | L_IndirU12 | L_IndirU12Lsl12), + + L_SymSU12I9 = 0x10000, + L_SymSI7 = 0x20000, + L_SymU12 = 0x40000, + L_SymU12Lsl12 =0x80000, + L_SymMask = (L_SymSU12I9 | L_SymSI7 | L_SymU12 | L_SymU12Lsl12), + + L_Lab20 = 0x100000, + L_Label = 0x200000, + + L_RegBV = 0x1000000, +}; + +struct LegalInstrForms +{ + LegalForms dst, src[2]; +}; + +#define LEGAL_NONE { L_None, { L_None, L_None } } + +// Used for opcodes that should be converted before legalizer kicks in +#define LEGAL_PSEUDO LEGAL_NONE + +#define LEGAL_ADDSUB { L_Reg, { L_Reg, (LegalForms)(L_Reg | L_ImmU12 | L_ImmU12Lsl12) } } +#define LEGAL_ALU2 { L_Reg, { (LegalForms)(L_Reg | L_ImmLog12), L_None } } +#define LEGAL_ALU3 { L_Reg, { L_Reg, (LegalForms)(L_Reg | L_ImmLog12) } } +#define LEGAL_SHIFT { L_Reg, { L_Reg, (LegalForms)(L_Reg | L_ImmU6) } } +#define LEGAL_BITFIELD { L_Reg, { L_Reg, L_ImmU6U6 } } +#define LEGAL_BLAB LEGAL_NONE +#define LEGAL_CALL { L_Reg, { L_Lab20 , L_None } } // Not currently generated, offset check is missing +#define LEGAL_CBZ { L_None, { L_Reg } } +#define LEGAL_LABEL { L_Reg, { L_Label } } +#define LEGAL_LDIMM { L_Reg, { L_Imm, L_None } } +#define LEGAL_LDIMM_S { L_Reg, { (LegalForms)(L_ImmU16 | L_Label), L_ImmU6 } } +#define LEGAL_LEA { L_Reg, { (LegalForms)(L_IndirU12Lsl12 | L_SymU12Lsl12), L_None } } +#define LEGAL_LOAD { L_Reg, { (LegalForms)(L_IndirSU12I9 | L_SymSU12I9), L_None } } +#define LEGAL_LOADP { L_Reg, { (LegalForms)(L_IndirSI7 | L_SymSI7), L_Reg } } +#define LEGAL_PLD { L_None, { (LegalForms)(L_IndirSU12I9 | L_SymSU12I9), L_None } } +#define LEGAL_REG1 { L_Reg, { L_None, L_None } } +#define LEGAL_REG2 { L_Reg, { L_Reg, L_None } } +#define LEGAL_REG2_ND { L_None, { L_Reg, L_None } } +#define LEGAL_REG3 { L_Reg, { L_Reg, L_Reg } } +#define LEGAL_REG3_ND { L_None, { L_Reg, L_Reg } } +#define LEGAL_STORE { (LegalForms)(L_IndirSU12I9 | L_SymSU12I9), { L_Reg, L_None } } +#define LEGAL_STOREP { (LegalForms)(L_IndirSI7 | L_SymSI7), { L_Reg, L_Reg } } +#define LEGAL_TBZ { L_None, { L_Reg, L_ImmU6 } } + +class LegalizeMD +{ +public: + static void LegalizeInstr(IR::Instr * instr, bool fPostRegAlloc); + static void LegalizeDst(IR::Instr * instr, bool fPostRegAlloc); + static void LegalizeSrc(IR::Instr * instr, IR::Opnd * opnd, uint opndNum, bool fPostRegAlloc); + + static bool LegalizeDirectBranch(IR::BranchInstr *instr, uintptr_t branchOffset); + static bool LegalizeAdrOffset(IR::Instr *instr, uintptr_t instrOffset); + static bool LegalizeDataAdr(IR::Instr *instr, uintptr_t dataOffset); + +private: + static void LegalizeRegOpnd(IR::Instr* instr, IR::Opnd* opnd); + static IR::Instr *LegalizeStore(IR::Instr *instr, LegalForms forms, bool fPostRegAlloc); + static IR::Instr *LegalizeLoad(IR::Instr *instr, uint opndNum, LegalForms forms, bool fPostRegAlloc); + static void LegalizeIndirOffset(IR::Instr * instr, IR::IndirOpnd * indirOpnd, LegalForms forms, bool fPostRegAlloc); + static void LegalizeSymOffset(IR::Instr * instr, IR::SymOpnd * indirOpnd, LegalForms forms, bool fPostRegAlloc); + static void LegalizeImmed(IR::Instr * instr, IR::Opnd * opnd, uint opndNum, IntConstType immed, LegalForms forms, bool fPostRegAlloc); + static void LegalizeLabelOpnd(IR::Instr * instr, IR::Opnd * opnd, uint opndNum, bool fPostRegAlloc); + + static inline uint32 ShiftTo16(UIntConstType* immed) + { + uint32 shift = 0; + while (((*immed) & 0xffff) != *immed) + { + (*immed) >>= 16; + shift += 16; + } + Assert(shift == 0 || shift == 16 || shift == 32 || shift == 48); + return shift; + } + + static void LegalizeLDIMM(IR::Instr * instr, IntConstType immed); + static void LegalizeLdLabel(IR::Instr * instr, IR::Opnd * opnd); + static IR::Instr * GenerateLDIMM(IR::Instr * instr, uint opndNum, RegNum scratchReg, bool fPostRegAlloc); + + static IR::Instr * GenerateHoistSrc(IR::Instr * instr, uint opndNum, Js::OpCode op, RegNum scratchReg, bool fPostRegAlloc); + + static void ObfuscateLDIMM(IR::Instr * instrMov, IR::Instr * instrMovt); + static void EmitRandomNopBefore(IR::Instr * instrMov, UINT_PTR rand, RegNum targetReg); + +#ifdef DBG + static void IllegalInstr(IR::Instr * instr, const char16 * msg, ...); +#endif +}; diff --git a/deps/chakrashim/core/lib/Backend/arm64/LinearScanMD.cpp b/deps/chakrashim/core/lib/Backend/arm64/LinearScanMD.cpp new file mode 100644 index 00000000000..accde9c950b --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/LinearScanMD.cpp @@ -0,0 +1,365 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "Backend.h" +#include "SccLiveness.h" + +extern const IRType RegTypes[RegNumCount]; + +LinearScanMD::LinearScanMD(Func *func) + : helperSpillSlots(nullptr), + func(func), + maxOpHelperSpilledLiveranges(0) +{ +} + +void +LinearScanMD::Init(LinearScan *linearScan) +{ + LinearScanMDShared::Init(linearScan); + Func *func = linearScan->func; + RegNum localsReg = func->GetLocalsPointer(); + if (localsReg != RegSP) + { + func->m_regsUsed.Set(localsReg); + } + + memset(this->vfpSymTable, 0, sizeof(this->vfpSymTable)); +} + +StackSym * +LinearScanMD::EnsureSpillSymForVFPReg(RegNum reg, Func *func) +{ + Assert(REGNUM_ISVFPREG(reg)); + + __analysis_assume(reg - RegD0 < VFP_REGCOUNT); + StackSym *sym = this->vfpSymTable[reg - RegD0]; + + if (sym == nullptr) + { + sym = StackSym::New(TyFloat64, func); + func->StackAllocate(sym, MachRegDouble); + + __analysis_assume(reg - RegD0 < VFP_REGCOUNT); + this->vfpSymTable[reg - RegD0] = sym; + } + + return sym; +} + + +bool +LinearScanMD::IsAllocatable(RegNum reg, Func *func) const +{ + return reg != func->GetLocalsPointer(); +} + +BitVector +LinearScanMD::FilterRegIntSizeConstraints(BitVector regsBv, BitVector sizeUsageBv) const +{ + return regsBv; +} + +bool +LinearScanMD::FitRegIntSizeConstraints(RegNum reg, BitVector sizeUsageBv) const +{ + return true; +} + +bool +LinearScanMD::FitRegIntSizeConstraints(RegNum reg, IRType type) const +{ + return true; +} + +void +LinearScanMD::InsertOpHelperSpillAndRestores(SList *opHelperBlockList) +{ + if (maxOpHelperSpilledLiveranges) + { + Assert(!helperSpillSlots); + helperSpillSlots = AnewArrayZ(linearScan->GetTempAlloc(), StackSym *, maxOpHelperSpilledLiveranges); + } + + FOREACH_SLIST_ENTRY(OpHelperBlock, opHelperBlock, opHelperBlockList) + { + InsertOpHelperSpillsAndRestores(opHelperBlock); + } + NEXT_SLIST_ENTRY; +} + +void +LinearScanMD::InsertOpHelperSpillsAndRestores(const OpHelperBlock& opHelperBlock) +{ + uint32 index = 0; + + FOREACH_SLIST_ENTRY(OpHelperSpilledLifetime, opHelperSpilledLifetime, &opHelperBlock.spilledLifetime) + { + // Use the original sym as spill slot if this is an inlinee arg + StackSym* sym = nullptr; + if (opHelperSpilledLifetime.spillAsArg) + { + sym = opHelperSpilledLifetime.lifetime->sym; + AnalysisAssert(sym); + Assert(sym->IsAllocated()); + } + + if (RegTypes[opHelperSpilledLifetime.reg] == TyFloat64) + { + IR::RegOpnd * regOpnd = IR::RegOpnd::New(nullptr, opHelperSpilledLifetime.reg, TyMachDouble, this->func); + + if (!sym) + { + sym = EnsureSpillSymForVFPReg(regOpnd->GetReg(), this->func); + } + IR::Instr * pushInstr = IR::Instr::New(Js::OpCode::FSTR, IR::SymOpnd::New(sym, TyMachDouble, this->func), regOpnd, this->func); + opHelperBlock.opHelperLabel->InsertAfter(pushInstr); + pushInstr->CopyNumber(opHelperBlock.opHelperLabel); + if (opHelperSpilledLifetime.reload) + { + IR::Instr * popInstr = IR::Instr::New(Js::OpCode::FLDR, regOpnd, IR::SymOpnd::New(sym, TyMachDouble, this->func), this->func); + opHelperBlock.opHelperEndInstr->InsertBefore(popInstr); + popInstr->CopyNumber(opHelperBlock.opHelperEndInstr); + } + } + else + { + Assert(helperSpillSlots); + Assert(index < maxOpHelperSpilledLiveranges); + + if (!sym) + { + // Lazily allocate only as many slots as we really need. + if (!helperSpillSlots[index]) + { + helperSpillSlots[index] = StackSym::New(TyMachReg, func); + } + + sym = helperSpillSlots[index]; + index++; + + Assert(sym); + func->StackAllocate(sym, MachRegInt); + } + + IR::RegOpnd * regOpnd = IR::RegOpnd::New(sym, opHelperSpilledLifetime.reg, sym->GetType(), func); + IR::Instr * saveInstr = IR::Instr::New(Js::OpCode::STR, IR::SymOpnd::New(sym, sym->GetType(), func), regOpnd, func); + opHelperBlock.opHelperLabel->InsertAfter(saveInstr); + saveInstr->CopyNumber(opHelperBlock.opHelperLabel); + this->LegalizeDef(saveInstr); + + if (opHelperSpilledLifetime.reload) + { + IR::Instr * restoreInstr = IR::Instr::New(Js::OpCode::LDR, regOpnd, IR::SymOpnd::New(sym, sym->GetType(), func), func); + opHelperBlock.opHelperEndInstr->InsertBefore(restoreInstr); + restoreInstr->CopyNumber(opHelperBlock.opHelperEndInstr); + this->LegalizeUse(restoreInstr, restoreInstr->GetSrc1()); + } + } + } + NEXT_SLIST_ENTRY; +} + +void +LinearScanMD::EndOfHelperBlock(uint32 helperSpilledLiveranges) +{ + if (helperSpilledLiveranges > maxOpHelperSpilledLiveranges) + { + maxOpHelperSpilledLiveranges = helperSpilledLiveranges; + } +} + +void +LinearScanMD::LegalizeDef(IR::Instr * instr) +{ + if (instr->m_opcode == Js::OpCode::ArgOut_A_InlineBuiltIn) + { + // ArgOut_A_InlineBuiltIn pseudo instruction is kept through register allocator only to use for bailout as is, + // and thus it must not be changed here by legalization. + // It is removed in peeps, so only place to special case it is in register allocator. + return; + } + + // Legalize opcodes, etc., but do not expand symbol/indirs with large offsets + // because we can't safely do this until all loads and stores are in place. + LegalizeMD::LegalizeDst(instr, false); +} + +void +LinearScanMD::LegalizeUse(IR::Instr * instr, IR::Opnd * opnd) +{ + if (instr->m_opcode == Js::OpCode::ArgOut_A_InlineBuiltIn) + { + // ArgOut_A_InlineBuiltIn pseudo instruction is kept through register allocator only to use for bailout as is, + // and thus it must not be changed here by legalization. + // It is removed in peeps, so only place to special case it is in register allocator. + return; + } + + // Legalize opcodes, etc., but do not expand symbol/indirs with large offsets + // because we can't safely do this until all loads and stores are in place. + if (opnd == instr->GetSrc1()) + { + LegalizeMD::LegalizeSrc(instr, opnd, 1, false); + } + else + { + LegalizeMD::LegalizeSrc(instr, opnd, 2, false); + } +} + +void +LinearScanMD::GenerateBailOut( + IR::Instr * instr, + __in_ecount(registerSaveSymsCount) StackSym ** registerSaveSyms, + uint registerSaveSymsCount) +{ + Func *const func = instr->m_func; + BailOutInfo *const bailOutInfo = instr->GetBailOutInfo(); + IR::Instr *firstInstr = instr->m_prev; + Js::Var *const registerSaveSpace = (Js::Var*)func->GetThreadContextInfo()->GetBailOutRegisterSaveSpaceAddr(); + + const auto LoadRegSaveSpaceIntoScratch = [&](const RegNum reg) + { + // Load the register save space address for the specified register into the scratch register: + // ldimm SCRATCH_REG, regSaveSpace + LinearScan::InsertMove( + IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachPtr, func), + IR::AddrOpnd::New(®isterSaveSpace[reg - 1], IR::AddrOpndKindDynamicMisc, func), + instr); + }; + + const auto SaveReg = [&](const RegNum reg) + { + Assert(registerSaveSyms[reg - 1]); + + // LoadRegSaveSpaceIntoScratch(reg) + // mov [SCRATCH_REG], reg + LoadRegSaveSpaceIntoScratch(reg); + const IRType regType = RegTypes[reg]; + LinearScan::InsertMove( + IR::IndirOpnd::New( + IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachPtr, func), + 0, + regType, + func), + IR::RegOpnd::New(registerSaveSyms[reg - 1], reg, regType, func), + instr); + }; + + // Save registers used for parameters, and lr, if necessary, into the register save space + if(bailOutInfo->branchConditionOpnd && registerSaveSyms[RegR1 - 1] && registerSaveSyms[RegR0 - 1]) + { + // Save r0 and r1 with one store pair: + // LoadRegSaveSpaceIntoScratch(RegR0) + // STP r0, r1, [SCRATCH_REG] + LoadRegSaveSpaceIntoScratch(RegR0); + IR::Instr *instrSTP = IR::Instr::New(Js::OpCode::STP, + IR::IndirOpnd::New(IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachPtr, func), 0, TyMachReg, func), + IR::RegOpnd::New(registerSaveSyms[RegR0 - 1], RegR0, RegTypes[RegR0], func), + IR::RegOpnd::New(registerSaveSyms[RegR1 - 1], RegR1, RegTypes[RegR1], func), + func); + + instr->InsertBefore(instrSTP); + instrSTP->CopyNumber(instr); + } + else if(bailOutInfo->branchConditionOpnd && registerSaveSyms[RegR1 - 1]) + { + SaveReg(RegR1); + } + else if(registerSaveSyms[RegR0 - 1]) + { + SaveReg(RegR0); + } + if(registerSaveSyms[RegLR - 1]) + { + SaveReg(RegLR); + } + + if(bailOutInfo->branchConditionOpnd) + { + // Pass in the branch condition + // mov r1, condition + IR::Instr *const newInstr = + LinearScan::InsertMove( + IR::RegOpnd::New(nullptr, RegR1, bailOutInfo->branchConditionOpnd->GetType(), func), + bailOutInfo->branchConditionOpnd, + instr); + linearScan->SetSrcRegs(newInstr); + } + + if (func->IsOOPJIT()) + { + // ldimm r0, dataAddr + intptr_t nativeDataAddr = func->GetWorkItem()->GetWorkItemData()->nativeDataAddr; + IR::RegOpnd * r0 = IR::RegOpnd::New(nullptr, RegR0, TyMachPtr, func); + LinearScan::InsertMove(r0, IR::AddrOpnd::New(nativeDataAddr, IR::AddrOpndKindDynamicNativeCodeDataRef, func), instr); + + // mov r0, [r0] + LinearScan::InsertMove(r0, IR::IndirOpnd::New(r0, 0, TyMachPtr, func), instr); + + // lea r0, [r0 + bailoutRecord_offset] + unsigned int bailoutRecordOffset = NativeCodeData::GetDataTotalOffset(bailOutInfo->bailOutRecord); + LinearScan::InsertLea( + r0, + IR::IndirOpnd::New(r0, bailoutRecordOffset, TyUint32, +#if DBG + NativeCodeData::GetDataDescription(bailOutInfo->bailOutRecord, func->m_alloc), +#endif + this->func), instr); + } + else + { + // Pass in the bailout record + // ldimm r0, bailOutRecord + LinearScan::InsertMove( + IR::RegOpnd::New(nullptr, RegR0, TyMachPtr, func), + IR::AddrOpnd::New(bailOutInfo->bailOutRecord, IR::AddrOpndKindDynamicBailOutRecord, func, true), + instr); + } + + firstInstr = firstInstr->m_next; + for(uint i = 0; i < registerSaveSymsCount; i++) + { + StackSym *const stackSym = registerSaveSyms[i]; + if(!stackSym) + { + continue; + } + + // Record the use on the lifetime in case it spilled afterwards. Spill loads will be inserted before 'firstInstr', that + // is, before the register saves are done. + this->linearScan->RecordUse(stackSym->scratch.linearScan.lifetime, firstInstr, nullptr, true); + } + + // Load the bailout target into lr + // ldimm lr, BailOut + // blx lr + Assert(instr->GetSrc1()->IsHelperCallOpnd()); + LinearScan::InsertMove(IR::RegOpnd::New(nullptr, RegLR, TyMachPtr, func), instr->GetSrc1(), instr); + instr->ReplaceSrc1(IR::RegOpnd::New(nullptr, RegLR, TyMachPtr, func)); +} + +IR::Instr * +LinearScanMD::GenerateBailInForGeneratorYield(IR::Instr * resumeLabelInstr, BailOutInfo * bailOutInfo) +{ + Js::Throw::NotImplemented(); +} + +uint LinearScanMD::GetRegisterSaveIndex(RegNum reg) +{ + return reg; +} + +// static +RegNum LinearScanMD::GetRegisterFromSaveIndex(uint offset) +{ + return (RegNum)offset; +} + +RegNum LinearScanMD::GetParamReg(IR::SymOpnd *symOpnd, Func *func) +{ + /* TODO - Add ARM32 support according to register calling convention */ + return RegNOREG; +} diff --git a/deps/chakrashim/core/lib/Backend/arm64/LinearScanMD.h b/deps/chakrashim/core/lib/Backend/arm64/LinearScanMD.h index 432fbe94ab2..e2b90f4fe1d 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/LinearScanMD.h +++ b/deps/chakrashim/core/lib/Backend/arm64/LinearScanMD.h @@ -10,42 +10,61 @@ class BranchBailOutRecord; class LinearScanMD : public LinearScanMDShared { +private: + StackSym ** helperSpillSlots; + Func * func; + uint32 maxOpHelperSpilledLiveranges; + StackSym *vfpSymTable[VFP_REGCOUNT]; + public: - LinearScanMD(Func *func) { } + LinearScanMD(Func *func); - void Init(LinearScan *linearScan) { __debugbreak(); } + void Init(LinearScan *linearScan); - BitVector FilterRegIntSizeConstraints(BitVector regsBv, BitVector sizeUsageBv) const { __debugbreak(); return 0; } - bool FitRegIntSizeConstraints(RegNum reg, BitVector sizeUsageBv) const { __debugbreak(); return 0; } - void InsertOpHelperSpillAndRestores(SList *opHelperBlockList) { __debugbreak(); } - void EndOfHelperBlock(uint32 helperSpilledLiveranges) { __debugbreak(); } + BitVector FilterRegIntSizeConstraints(BitVector regsBv, BitVector sizeUsageBv) const; + bool FitRegIntSizeConstraints(RegNum reg, BitVector sizeUsageBv) const; + bool FitRegIntSizeConstraints(RegNum reg, IRType type) const; + void InsertOpHelperSpillAndRestores(SList *opHelperBlockList); + void EndOfHelperBlock(uint32 helperSpilledLiveranges); uint UnAllocatableRegCount(Func *func) const - { - __debugbreak(); return 0; -// return func->GetLocalsPointer() != RegSP ? 5 : 4; //r11(Frame Pointer),r12,sp,pc - } - - StackSym *EnsureSpillSymForVFPReg(RegNum reg, Func *func) { __debugbreak(); return 0; } + { + // number of regs marked RA_DONTALLOCATE, including: + // ALT_LOCALS_PTR when not the SP + uint result = 6; + if (func->GetLocalsPointer() != RegSP) + { + result += 1; + } + return result; + } - void LegalizeDef(IR::Instr * instr) { __debugbreak(); } - void LegalizeUse(IR::Instr * instr, IR::Opnd * opnd) { __debugbreak(); } - void LegalizeConstantUse(IR::Instr * instr, IR::Opnd * opnd) { __debugbreak(); } + StackSym *EnsureSpillSymForVFPReg(RegNum reg, Func *func); - void GenerateBailOut(IR::Instr * instr, StackSym ** registerSaveSyms, uint registerSaveSymsCount) { __debugbreak(); } - IR::Instr *GenerateBailInForGeneratorYield(IR::Instr * resumeLabelInstr, BailOutInfo * bailOutInfo) { __debugbreak(); return nullptr; } + void LegalizeDef(IR::Instr * instr); + void LegalizeUse(IR::Instr * instr, IR::Opnd * opnd); + void LegalizeConstantUse(IR::Instr * instr, IR::Opnd * opnd) { /* no op for arm */ } + void GenerateBailOut(IR::Instr * instr, __in_ecount(registerSaveSymsCount) StackSym ** registerSaveSyms, uint registerSaveSymsCount); + IR::Instr *GenerateBailInForGeneratorYield(IR::Instr * resumeLabelInstr, BailOutInfo * bailOutInfo); +private: + static void SaveAllRegisters(BailOutRecord *const bailOutRecord); public: - static void SaveAllRegistersAndBailOut(BailOutRecord *const bailOutRecord) { __debugbreak(); } - static void SaveAllRegistersAndBranchBailOut(BranchBailOutRecord *const bailOutRecord, const BOOL condition) { __debugbreak(); } - static RegNum GetParamReg(IR::SymOpnd *symOpnd, Func *func) { /* TODO */ return RegNOREG; } + static void SaveAllRegistersAndBailOut(BailOutRecord *const bailOutRecord); + static void SaveAllRegistersAndBranchBailOut(BranchBailOutRecord *const bailOutRecord, const BOOL condition); + static RegNum GetParamReg(IR::SymOpnd *symOpnd, Func *func); - bool IsAllocatable(RegNum reg, Func *func) const { __debugbreak(); return 0; } + bool IsAllocatable(RegNum reg, Func *func) const; static uint GetRegisterSaveSlotCount() { return RegisterSaveSlotCount ; } - static uint GetRegisterSaveIndex(RegNum reg) { __debugbreak(); return 0; } - static RegNum GetRegisterFromSaveIndex(uint offset) { __debugbreak(); return RegNum(0); } + static uint GetRegisterSaveIndex(RegNum reg); + static RegNum GetRegisterFromSaveIndex(uint offset); static const uint RegisterSaveSlotCount = RegNumCount + VFP_REGCOUNT; + +private: + bool LegalizeOffset(IR::Instr * instr, IR::Opnd * opnd); + bool LegalizeLEA(IR::Instr * instr, IR::SymOpnd * opnd); + void InsertOpHelperSpillsAndRestores(const OpHelperBlock& opHelperBlock); }; diff --git a/deps/chakrashim/core/lib/Backend/arm64/LinearScanMdA.asm b/deps/chakrashim/core/lib/Backend/arm64/LinearScanMdA.asm new file mode 100644 index 00000000000..e5aea7ac47f --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/LinearScanMdA.asm @@ -0,0 +1,125 @@ +;------------------------------------------------------------------------------------------------------- +; Copyright (C) Microsoft. All rights reserved. +; Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +;------------------------------------------------------------------------------------------------------- + + OPT 2 ; disable listing +#include "ksarm64.h" + OPT 1 ; re-enable listing + + TTL Lib\Backend\arm64\LinearScanMdA.asm + + EXPORT |?SaveAllRegistersAndBailOut@LinearScanMD@@SAXQEAVBailOutRecord@@@Z| + EXPORT |?SaveAllRegistersAndBranchBailOut@LinearScanMD@@SAXQEAVBranchBailOutRecord@@H@Z| + + ; BailOutRecord::BailOut(BailOutRecord const * bailOutRecord) + IMPORT |?BailOut@BailOutRecord@@SAPEAXPEBV1@@Z| + + ; BranchBailOutRecord::BailOut(BranchBailOutRecord const * bailOutRecord, BOOL cond) + IMPORT |?BailOut@BranchBailOutRecord@@SAPEAXPEBV1@H@Z| + + TEXTAREA + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; LinearScanMD::SaveAllRegistersAndBailOut(BailOutRecord *const bailOutRecord) + + NESTED_ENTRY ?SaveAllRegistersAndBailOut@LinearScanMD@@SAXQEAVBailOutRecord@@@Z + + ; x0 == bailOutRecord + ; lr == return address + + ; Save all registers except the above, which would have already been saved by jitted code if necessary + ldr x17, [x0] ; bailOutRecord->globalBailOutRecordDataTable + ldr x17, [x17] ; bailOutRecord->globalBailOutRecordDataTable->registerSaveSpace + str x1, [x17, #1*8] + stp x2, x3, [x17, #2*8] + stp x4, x5, [x17, #4*8] + stp x6, x7, [x17, #6*8] + stp x8, x9, [x17, #8*8] + stp x10, x11, [x17, #10*8] + stp x12, x13, [x17, #12*8] + stp x14, x15, [x17, #14*8] + str x16, [x17, #16*8] + ; skip x17/x18 + stp x19, x20, [x17, #19*8] + stp x21, x22, [x17, #21*8] + stp x23, x24, [x17, #23*8] + stp x25, x26, [x17, #25*8] + stp x27, x28, [x17, #27*8] + str fp, [x17, #29*8] + ; skip lr, sp, zr + add x17, x17, #33*8 + stp d0, d1, [x17, #0*8] + stp d2, d3, [x17, #2*8] + stp d4, d5, [x17, #4*8] + stp d6, d7, [x17, #6*8] + stp d8, d9, [x17, #8*8] + stp d10, d11, [x17, #10*8] + stp d12, d13, [x17, #12*8] + stp d14, d15, [x17, #14*8] + stp d16, d17, [x17, #16*8] + stp d18, d19, [x17, #18*8] + stp d20, d21, [x17, #20*8] + stp d22, d23, [x17, #22*8] + stp d24, d25, [x17, #24*8] + stp d26, d27, [x17, #26*8] + stp d28, d29, [x17, #28*8] + ;stp d30, d31, [x17, #30*8] + + b |?BailOut@BailOutRecord@@SAPEAXPEBV1@@Z| + + NESTED_END + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; LinearScanMD::SaveAllRegistersAndBranchBailOut(BranchBailOutRecord *const bailOutRecord, const BOOL condition) + + NESTED_ENTRY ?SaveAllRegistersAndBranchBailOut@LinearScanMD@@SAXQEAVBranchBailOutRecord@@H@Z + + ; x0 == bailOutRecord + ; x1 == condition + ; lr == return address + + ; Save all registers except the above, which would have already been saved by jitted code if necessary + ldr x17, [x0] ; bailOutRecord->globalBailOutRecordDataTable + ldr x17, [x17] ; bailOutRecord->globalBailOutRecordDataTable->registerSaveSpace + stp x2, x3, [x17, #2*8] + stp x4, x5, [x17, #4*8] + stp x6, x7, [x17, #6*8] + stp x8, x9, [x17, #8*8] + stp x10, x11, [x17, #10*8] + stp x12, x13, [x17, #12*8] + stp x14, x15, [x17, #14*8] + str x16, [x17, #16*8] + ; skip x17/x18 + stp x19, x20, [x17, #19*8] + stp x21, x22, [x17, #21*8] + stp x23, x24, [x17, #23*8] + stp x25, x26, [x17, #25*8] + stp x27, x28, [x17, #27*8] + str fp, [x17, #29*8] + ; skip lr, sp, zr + add x17, x17, #33*8 + stp d0, d1, [x17, #0*8] + stp d2, d3, [x17, #2*8] + stp d4, d5, [x17, #4*8] + stp d6, d7, [x17, #6*8] + stp d8, d9, [x17, #8*8] + stp d10, d11, [x17, #10*8] + stp d12, d13, [x17, #12*8] + stp d14, d15, [x17, #14*8] + stp d16, d17, [x17, #16*8] + stp d18, d19, [x17, #18*8] + stp d20, d21, [x17, #20*8] + stp d22, d23, [x17, #22*8] + stp d24, d25, [x17, #24*8] + stp d26, d27, [x17, #26*8] + stp d28, d29, [x17, #28*8] + ;stp d30, d31, [x17, #30*8] + + b |?BailOut@BranchBailOutRecord@@SAPEAXPEBV1@H@Z| + + NESTED_END + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + END diff --git a/deps/chakrashim/core/lib/Backend/arm64/LowerMD.cpp b/deps/chakrashim/core/lib/Backend/arm64/LowerMD.cpp index d3f0e1c3253..dce0281df68 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/LowerMD.cpp +++ b/deps/chakrashim/core/lib/Backend/arm64/LowerMD.cpp @@ -2,15 +2,7365 @@ // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- + #include "Backend.h" +#include "Language/JavascriptFunctionArgIndex.h" const Js::OpCode LowererMD::MDUncondBranchOpcode = Js::OpCode::B; +const Js::OpCode LowererMD::MDMultiBranchOpcode = Js::OpCode::BR; const Js::OpCode LowererMD::MDTestOpcode = Js::OpCode::TST; const Js::OpCode LowererMD::MDOrOpcode = Js::OpCode::ORR; const Js::OpCode LowererMD::MDXorOpcode = Js::OpCode::EOR; const Js::OpCode LowererMD::MDOverflowBranchOpcode = Js::OpCode::BVS; const Js::OpCode LowererMD::MDNotOverflowBranchOpcode = Js::OpCode::BVC; -const Js::OpCode LowererMD::MDConvertFloat32ToFloat64Opcode = Js::OpCode::VCVTF64F32; -const Js::OpCode LowererMD::MDConvertFloat64ToFloat32Opcode = Js::OpCode::VCVTF32F64; +const Js::OpCode LowererMD::MDConvertFloat32ToFloat64Opcode = Js::OpCode::FCVT; +const Js::OpCode LowererMD::MDConvertFloat64ToFloat32Opcode = Js::OpCode::FCVT; const Js::OpCode LowererMD::MDCallOpcode = Js::OpCode::Call; const Js::OpCode LowererMD::MDImulOpcode = Js::OpCode::MUL; +const Js::OpCode LowererMD::MDLea = Js::OpCode::LEA; + +template +inline void Swap(T& x, T& y) +{ + T temp = x; + x = y; + y = temp; +} + +// Static utility fn() +// +bool +LowererMD::IsAssign(const IR::Instr *instr) +{ + return (instr->m_opcode == Js::OpCode::MOV || + instr->m_opcode == Js::OpCode::FMOV || + instr->m_opcode == Js::OpCode::LDIMM || + instr->m_opcode == Js::OpCode::LDR || + instr->m_opcode == Js::OpCode::LDRS || + instr->m_opcode == Js::OpCode::FLDR || + instr->m_opcode == Js::OpCode::STR || + instr->m_opcode == Js::OpCode::FSTR); +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::IsCall +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::IsCall(const IR::Instr *instr) +{ + return (instr->m_opcode == Js::OpCode::BL || + instr->m_opcode == Js::OpCode::BLR); +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::IsIndirectBranch +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::IsIndirectBranch(const IR::Instr *instr) +{ + return (instr->m_opcode == Js::OpCode::BR); +} + + +///---------------------------------------------------------------------------- +/// +/// LowererMD::IsUnconditionalBranch +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::IsUnconditionalBranch(const IR::Instr *instr) +{ + return (instr->m_opcode == Js::OpCode::B || + instr->m_opcode == Js::OpCode::BR); +} + +bool +LowererMD::IsReturnInstr(const IR::Instr *instr) +{ + return instr->m_opcode == Js::OpCode::RET; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::InvertBranch +/// +///---------------------------------------------------------------------------- + +void +LowererMD::InvertBranch(IR::BranchInstr *branchInstr) +{ + switch (branchInstr->m_opcode) + { + case Js::OpCode::BEQ: + branchInstr->m_opcode = Js::OpCode::BNE; + break; + case Js::OpCode::BNE: + branchInstr->m_opcode = Js::OpCode::BEQ; + break; + case Js::OpCode::BGE: + branchInstr->m_opcode = Js::OpCode::BLT; + break; + case Js::OpCode::BGT: + branchInstr->m_opcode = Js::OpCode::BLE; + break; + case Js::OpCode::BLT: + branchInstr->m_opcode = Js::OpCode::BGE; + break; + case Js::OpCode::BLE: + branchInstr->m_opcode = Js::OpCode::BGT; + break; + case Js::OpCode::BCS: + branchInstr->m_opcode = Js::OpCode::BCC; + break; + case Js::OpCode::BCC: + branchInstr->m_opcode = Js::OpCode::BCS; + break; + case Js::OpCode::BMI: + branchInstr->m_opcode = Js::OpCode::BPL; + break; + case Js::OpCode::BPL: + branchInstr->m_opcode = Js::OpCode::BMI; + break; + case Js::OpCode::BVS: + branchInstr->m_opcode = Js::OpCode::BVC; + break; + case Js::OpCode::BVC: + branchInstr->m_opcode = Js::OpCode::BVS; + break; + case Js::OpCode::BLS: + branchInstr->m_opcode = Js::OpCode::BHI; + break; + case Js::OpCode::BHI: + branchInstr->m_opcode = Js::OpCode::BLS; + break; + case Js::OpCode::CBZ: + branchInstr->m_opcode = Js::OpCode::CBNZ; + break; + case Js::OpCode::CBNZ: + branchInstr->m_opcode = Js::OpCode::CBZ; + break; + case Js::OpCode::TBZ: + branchInstr->m_opcode = Js::OpCode::TBNZ; + break; + case Js::OpCode::TBNZ: + branchInstr->m_opcode = Js::OpCode::TBZ; + break; + + default: + AssertMsg(UNREACHED, "B missing in InvertBranch()"); + } + +} + +Js::OpCode +LowererMD::MDConvertFloat64ToInt32Opcode(const RoundMode roundMode) +{ + switch (roundMode) + { + case RoundModeTowardZero: + return Js::OpCode::FCVTZ; + case RoundModeTowardInteger: + return Js::OpCode::Nop; + case RoundModeHalfToEven: + return Js::OpCode::FCVTN; + default: + AssertMsg(0, "RoundMode has no MD mapping."); + return Js::OpCode::Nop; + } +} + +// GenerateMemRef: Return an opnd that can be used to access the given address. +// ARM can't encode direct accesses to physical addresses, so put the address in a register +// and return an indir. (This facilitates re-use of the loaded address without having to re-load it.) +IR::Opnd * +LowererMD::GenerateMemRef(intptr_t addr, IRType type, IR::Instr *instr, bool dontEncode) +{ + IR::RegOpnd *baseOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); + IR::AddrOpnd *addrOpnd = IR::AddrOpnd::New(addr, IR::AddrOpndKindDynamicMisc, this->m_func, dontEncode); + Lowerer::InsertMove(baseOpnd, addrOpnd, instr); + + return IR::IndirOpnd::New(baseOpnd, 0, type, this->m_func); +} + +void +LowererMD::FlipHelperCallArgsOrder() +{ + int left = 0; + int right = helperCallArgsCount - 1; + while (left < right) + { + IR::Opnd *tempOpnd = helperCallArgs[left]; + helperCallArgs[left] = helperCallArgs[right]; + helperCallArgs[right] = tempOpnd; + + left++; + right--; + } +} + +IR::Instr * +LowererMD::LowerCallHelper(IR::Instr *instrCall) +{ + IR::Opnd *argOpnd = instrCall->UnlinkSrc2(); + IR::Instr *prevInstr = instrCall; + IR::JnHelperMethod helperMethod = instrCall->GetSrc1()->AsHelperCallOpnd()->m_fnHelper; + instrCall->FreeSrc1(); + + while (argOpnd) + { + Assert(argOpnd->IsRegOpnd()); + IR::RegOpnd *regArg = argOpnd->AsRegOpnd(); + + Assert(regArg->m_sym->m_isSingleDef); + IR::Instr *instrArg = regArg->m_sym->m_instrDef; + + Assert(instrArg->m_opcode == Js::OpCode::ArgOut_A || + (helperMethod == IR::JnHelperMethod::HelperOP_InitCachedScope && instrArg->m_opcode == Js::OpCode::ExtendArg_A)); + prevInstr = this->LoadHelperArgument(prevInstr, instrArg->GetSrc1()); + + argOpnd = instrArg->GetSrc2(); + + if (instrArg->m_opcode == Js::OpCode::ArgOut_A) + { + instrArg->UnlinkSrc1(); + if (argOpnd) + { + instrArg->UnlinkSrc2(); + } + regArg->Free(this->m_func); + instrArg->Remove(); + } + } + + this->m_lowerer->LoadScriptContext(instrCall); + this->FlipHelperCallArgsOrder(); + return this->ChangeToHelperCall(instrCall, helperMethod); +} + +// Lower a call: May be either helper or native JS call. Just set the opcode, and +// put the result into the return register. (No stack adjustment required.) +IR::Instr * +LowererMD::LowerCall(IR::Instr * callInstr, Js::ArgSlot argCount) +{ + IR::Instr *retInstr = callInstr; + IR::Opnd *targetOpnd = callInstr->GetSrc1(); + AssertMsg(targetOpnd, "Call without a target?"); + + // This is required here due to calls created during lowering + callInstr->m_func->SetHasCallsOnSelfAndParents(); + + if (targetOpnd->IsRegOpnd()) + { + // Indirect call + callInstr->m_opcode = Js::OpCode::BLR; + } + else + { + AssertMsg(targetOpnd->IsHelperCallOpnd(), "Why haven't we loaded the call target?"); + // Direct call + // + // load the address into a register because we cannot directly access more than 24 bit constants + // in BL instruction. Non helper call methods will already be accessed indirectly. + // + // Skip this for bailout calls. The register allocator will lower that as appropriate, without affecting spill choices. + + if (!callInstr->HasBailOutInfo()) + { + IR::RegOpnd *regOpnd = IR::RegOpnd::New(nullptr, RegLR, TyMachPtr, this->m_func); + IR::Instr *movInstr = IR::Instr::New(Js::OpCode::LDIMM, regOpnd, callInstr->UnlinkSrc1(), this->m_func); + regOpnd->m_isCallArg = true; + callInstr->SetSrc1(regOpnd); + callInstr->InsertBefore(movInstr); + } + callInstr->m_opcode = Js::OpCode::BLR; + } + + IR::Opnd *dstOpnd = callInstr->GetDst(); + if (dstOpnd) + { + Js::OpCode assignOp; + RegNum returnReg; + + if(dstOpnd->IsFloat64()) + { + assignOp = Js::OpCode::FMOV; + returnReg = RETURN_DBL_REG; + } + else + { + assignOp = Js::OpCode::MOV; + returnReg = RETURN_REG; + + if (callInstr->GetSrc1()->IsHelperCallOpnd()) + { + // Truncate the result of a conversion to 32-bit int, because the C++ code doesn't. + IR::HelperCallOpnd *helperOpnd = callInstr->GetSrc1()->AsHelperCallOpnd(); + if (helperOpnd->m_fnHelper == IR::HelperConv_ToInt32 || + helperOpnd->m_fnHelper == IR::HelperConv_ToInt32_Full || + helperOpnd->m_fnHelper == IR::HelperConv_ToInt32Core || + helperOpnd->m_fnHelper == IR::HelperConv_ToUInt32 || + helperOpnd->m_fnHelper == IR::HelperConv_ToUInt32_Full || + helperOpnd->m_fnHelper == IR::HelperConv_ToUInt32Core) + { + assignOp = Js::OpCode::MOV_TRUNC; + } + } + } + + IR::Instr * movInstr = callInstr->SinkDst(assignOp); + + callInstr->GetDst()->AsRegOpnd()->SetReg(returnReg); + movInstr->GetSrc1()->AsRegOpnd()->SetReg(returnReg); + + retInstr = movInstr; + + Legalize(retInstr); + } + + // + // assign the arguments to appropriate positions + // + + AssertMsg(this->helperCallArgsCount >= 0, "Fatal. helper call arguments ought to be positive"); + AssertMsg(this->helperCallArgsCount <= MaxArgumentsToHelper, "Too many helper call arguments"); + + uint16 argsLeft = this->helperCallArgsCount; + uint16 doubleArgsLeft = this->helperCallDoubleArgsCount; + uint16 intArgsLeft = argsLeft - doubleArgsLeft; + + while(argsLeft > 0) + { + IR::Opnd *helperArgOpnd = this->helperCallArgs[this->helperCallArgsCount - argsLeft]; + IR::Opnd * opndParam = nullptr; + + if (helperArgOpnd->IsFloat()) + { + opndParam = this->GetOpndForArgSlot(doubleArgsLeft - 1, helperArgOpnd); + AssertMsg(opndParam->IsRegOpnd(), "NYI for other kind of operands"); + --doubleArgsLeft; + } + else + { + opndParam = this->GetOpndForArgSlot(intArgsLeft - 1, helperArgOpnd); + --intArgsLeft; + } + Lowerer::InsertMove(opndParam, helperArgOpnd, callInstr); + --argsLeft; + } + Assert(doubleArgsLeft == 0 && intArgsLeft == 0 && argsLeft == 0); + + // We're done with the args (if any) now, so clear the param location state. + this->FinishArgLowering(); + + return retInstr; +} + +IR::Instr * +LowererMD::LoadDynamicArgument(IR::Instr *instr, uint argNumber) +{ + Assert(instr->m_opcode == Js::OpCode::ArgOut_A_Dynamic); + Assert(instr->GetSrc2() == nullptr); + + IR::Opnd* dst = GetOpndForArgSlot((Js::ArgSlot) (argNumber - 1)); + instr->SetDst(dst); + instr->m_opcode = Js::OpCode::MOV; + LegalizeMD::LegalizeInstr(instr, false); + + return instr; +} + +IR::Instr * +LowererMD::LoadDynamicArgumentUsingLength(IR::Instr *instr) +{ + Assert(instr->m_opcode == Js::OpCode::ArgOut_A_Dynamic); + IR::RegOpnd* src2 = instr->UnlinkSrc2()->AsRegOpnd(); + + // We register store the first INT_ARG_REG_COUNT - 3 parameters, since the first 3 register parameters are taken by function object, callinfo, and this pointer + IR::Instr *add = IR::Instr::New(Js::OpCode::SUB, IR::RegOpnd::New(src2->GetType(), this->m_func), src2, IR::IntConstOpnd::New(INT_ARG_REG_COUNT - 3, TyInt8, this->m_func), this->m_func); + instr->InsertBefore(add); + LegalizeMD::LegalizeInstr(add, false); + //We need store nth actuals, so stack location is after function object, callinfo & this pointer + IR::RegOpnd *stackPointer = IR::RegOpnd::New(nullptr, GetRegStackPointer(), TyMachReg, this->m_func); + IR::IndirOpnd *actualsLocation = IR::IndirOpnd::New(stackPointer, add->GetDst()->AsRegOpnd(), GetDefaultIndirScale(), TyMachReg, this->m_func); + instr->SetDst(actualsLocation); + instr->m_opcode = Js::OpCode::LDR; + LegalizeMD::LegalizeInstr(instr, false); + + return instr; +} + +void +LowererMD::SetMaxArgSlots(Js::ArgSlot actualCount /*including this*/) +{ + Js::ArgSlot offset = 3;//For function object & callInfo & this + if (this->m_func->m_argSlotsForFunctionsCalled < (uint32) (actualCount + offset)) + { + this->m_func->m_argSlotsForFunctionsCalled = (uint32)(actualCount + offset); + } + return; +} + +void +LowererMD::GenerateMemInit(IR::RegOpnd * opnd, int32 offset, size_t value, IR::Instr * insertBeforeInstr, bool isZeroed) +{ + m_lowerer->GenerateMemInit(opnd, offset, (uint32)value, insertBeforeInstr, isZeroed); +} + +IR::Instr * +LowererMD::LowerCallIDynamic(IR::Instr *callInstr, IR::Instr*saveThisArgOutInstr, IR::Opnd *argsLength, ushort callFlags, IR::Instr * insertBeforeInstrForCFG) +{ + callInstr->InsertBefore(saveThisArgOutInstr); //Move this Argout next to call; + this->LoadDynamicArgument(saveThisArgOutInstr, 3); //this pointer is the 3rd argument + + //callInfo + if (callInstr->m_func->IsInlinee()) + { + Assert(argsLength->AsIntConstOpnd()->GetValue() == callInstr->m_func->actualCount); + this->SetMaxArgSlots((Js::ArgSlot)callInstr->m_func->actualCount); + } + else + { + callInstr->InsertBefore(IR::Instr::New(Js::OpCode::ADD, argsLength, argsLength, IR::IntConstOpnd::New(1, TyInt8, this->m_func), this->m_func)); + this->SetMaxArgSlots(Js::InlineeCallInfo::MaxInlineeArgoutCount); + } + Lowerer::InsertMove( this->GetOpndForArgSlot(1), argsLength, callInstr); + + IR::RegOpnd *funcObjOpnd = callInstr->UnlinkSrc1()->AsRegOpnd(); + GeneratePreCall(callInstr, funcObjOpnd, insertBeforeInstrForCFG); + + // functionOpnd is the first argument. + IR::Opnd * opndParam = this->GetOpndForArgSlot(0); + Lowerer::InsertMove(opndParam, funcObjOpnd, callInstr); + return this->LowerCall(callInstr, 0); +} + +void +LowererMD::GenerateFunctionObjectTest(IR::Instr * callInstr, IR::RegOpnd *functionObjOpnd, bool isHelper, IR::LabelInstr* continueAfterExLabel /* = nullptr */) +{ + AssertMsg(!m_func->IsJitInDebugMode() || continueAfterExLabel, "When jit is in debug mode, continueAfterExLabel must be provided otherwise continue after exception may cause AV."); + + // Need check and error if we are calling a tagged int. + if (!functionObjOpnd->IsNotTaggedValue()) + { + IR::LabelInstr * helperLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + if (this->GenerateObjectTest(functionObjOpnd, callInstr, helperLabel)) + { + + IR::LabelInstr * callLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, isHelper); + IR::Instr * instr = IR::BranchInstr::New(Js::OpCode::B, callLabel, this->m_func); + callInstr->InsertBefore(instr); + + callInstr->InsertBefore(helperLabel); + callInstr->InsertBefore(callLabel); + + this->m_lowerer->GenerateRuntimeError(callLabel, JSERR_NeedFunction); + + if (continueAfterExLabel) + { + // Under debugger the RuntimeError (exception) can be ignored, generate branch to jmp to safe place + // (which would normally be debugger bailout check). + IR::BranchInstr* continueAfterEx = IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, continueAfterExLabel, this->m_func); + callLabel->InsertBefore(continueAfterEx); + } + } + } +} + +IR::Instr* +LowererMD::GeneratePreCall(IR::Instr * callInstr, IR::Opnd *functionObjOpnd, IR::Instr * insertBeforeInstrForCFGCheck) +{ + if (insertBeforeInstrForCFGCheck == nullptr) + { + insertBeforeInstrForCFGCheck = callInstr; + } + + IR::RegOpnd * functionTypeRegOpnd = nullptr; + IR::IndirOpnd * entryPointIndirOpnd = nullptr; + + // For calls to fixed functions we load the function's type directly from the known (hard-coded) function object address. + // For other calls, we need to load it from the function object stored in a register operand. + if (functionObjOpnd->IsAddrOpnd() && functionObjOpnd->AsAddrOpnd()->m_isFunction) + { + functionTypeRegOpnd = this->m_lowerer->GenerateFunctionTypeFromFixedFunctionObject(insertBeforeInstrForCFGCheck, functionObjOpnd); + } + else if (functionObjOpnd->IsRegOpnd()) + { + AssertMsg(functionObjOpnd->AsRegOpnd()->m_sym->IsStackSym(), "Expected call target to be stackSym"); + + functionTypeRegOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); + + IR::IndirOpnd* functionTypeIndirOpnd = IR::IndirOpnd::New(functionObjOpnd->AsRegOpnd(), + Js::RecyclableObject::GetOffsetOfType(), TyMachReg, this->m_func); + Lowerer::InsertMove(functionTypeRegOpnd, functionTypeIndirOpnd, insertBeforeInstrForCFGCheck); + } + else + { + AnalysisAssertMsg(false, "Unexpected call target operand type."); + } + entryPointIndirOpnd = IR::IndirOpnd::New(functionTypeRegOpnd, Js::Type::GetOffsetOfEntryPoint(), TyMachPtr, m_func); + + IR::RegOpnd *entryPointRegOpnd = functionTypeRegOpnd; + entryPointRegOpnd->m_isCallArg = true; + + IR::Instr * stackParamInsert = Lowerer::InsertMove(entryPointRegOpnd, entryPointIndirOpnd, insertBeforeInstrForCFGCheck); + + // targetAddrOpnd is the address we'll call. + callInstr->SetSrc1(entryPointRegOpnd); + +#if defined(_CONTROL_FLOW_GUARD) + // verify that the call target is valid (CFG Check) + if (!PHASE_OFF(Js::CFGInJitPhase, this->m_func)) + { + this->GenerateCFGCheck(entryPointRegOpnd, insertBeforeInstrForCFGCheck); + } +#endif + + return stackParamInsert; +} + +IR::Instr * +LowererMD::LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper, IR::Instr * insertBeforeInstrForCFG) +{ + // Indirect call using JS calling convention: + // R0 = callee func object + // R1 = callinfo + // R2 = arg0 ("this") + // R3 = arg1 + // [sp] = arg2 + // etc. + + // First load the target address. Note that we want to wind up with this: + // ... + // [sp+4] = arg3 + // [sp] = arg2 + // load target addr from func obj + // R3 = arg1 + // ... + // R0 = func obj + // BLX target addr + // This way the register containing the target addr interferes with the param regs + // only, not the regs we use to store params to the stack. + + // We're sinking the stores of stack params so that the call sequence is contiguous. + // This is required by nested calls, since each call will re-use the same stack slots. + // But if there is no nesting, stack params can be stored as soon as they're computed. + + IR::Opnd * functionObjOpnd = callInstr->UnlinkSrc1(); + IR::Instr * insertBeforeInstrForCFGCheck = callInstr; + + // If this is a call for new, we already pass the function operand through NewScObject, + // which checks if the function operand is a real function or not, don't need to add a check again. + // If this is a call to a fixed function, we've already verified that the target is, indeed, a function. + if (callInstr->m_opcode != Js::OpCode::CallIFixed && !(callFlags & Js::CallFlags_New)) + { + Assert(functionObjOpnd->IsRegOpnd()); + IR::LabelInstr* continueAfterExLabel = Lowerer::InsertContinueAfterExceptionLabelForDebugger(m_func, callInstr, isHelper); + GenerateFunctionObjectTest(callInstr, functionObjOpnd->AsRegOpnd(), isHelper, continueAfterExLabel); + } + else if (insertBeforeInstrForCFG != nullptr) + { +// RegNum dstReg = insertBeforeInstrForCFG->GetDst()->AsRegOpnd()->GetReg(); +// AssertMsg(dstReg == RegArg2 || dstReg == RegArg3, "NewScObject should insert the first Argument in RegArg2/RegArg3 only based on Spread call or not."); + insertBeforeInstrForCFGCheck = insertBeforeInstrForCFG; + } + + IR::Instr * stackParamInsert = GeneratePreCall(callInstr, functionObjOpnd, insertBeforeInstrForCFGCheck); + + // We need to get the calculated CallInfo in SimpleJit because that doesn't include any changes for stack alignment + IR::IntConstOpnd *callInfo; + int32 argCount = this->LowerCallArgs(callInstr, stackParamInsert, callFlags, 1, &callInfo); + + // functionObjOpnd is the first argument. + IR::Opnd * opndParam = this->GetOpndForArgSlot(0); + Lowerer::InsertMove(opndParam, functionObjOpnd, callInstr); + + IR::Opnd *const finalDst = callInstr->GetDst(); + + // Finally, lower the call instruction itself. + IR::Instr* ret = this->LowerCall(callInstr, (Js::ArgSlot)argCount); + + IR::AutoReuseOpnd autoReuseSavedFunctionObjOpnd; + if (callInstr->IsJitProfilingInstr()) + { + Assert(callInstr->m_func->IsSimpleJit()); + Assert(!CONFIG_FLAG(NewSimpleJit)); + + if(finalDst && + finalDst->IsRegOpnd() && + functionObjOpnd->IsRegOpnd() && + finalDst->AsRegOpnd()->m_sym == functionObjOpnd->AsRegOpnd()->m_sym) + { + // The function object sym is going to be overwritten, so save it in a temp for profiling + IR::RegOpnd *const savedFunctionObjOpnd = IR::RegOpnd::New(functionObjOpnd->GetType(), callInstr->m_func); + autoReuseSavedFunctionObjOpnd.Initialize(savedFunctionObjOpnd, callInstr->m_func); + Lowerer::InsertMove(savedFunctionObjOpnd, functionObjOpnd, callInstr->m_next); + functionObjOpnd = savedFunctionObjOpnd; + } + + auto instr = callInstr->AsJitProfilingInstr(); + ret = this->m_lowerer->GenerateCallProfiling( + instr->profileId, + instr->inlineCacheIndex, + instr->GetDst(), + functionObjOpnd, + callInfo, + instr->isProfiledReturnCall, + callInstr, + ret); + } + return ret; +} + +int32 +LowererMD::LowerCallArgs(IR::Instr *callInstr, IR::Instr *stackParamInsert, ushort callFlags, Js::ArgSlot extraParams, IR::IntConstOpnd **callInfoOpndRef) +{ + AssertMsg(this->helperCallArgsCount == 0, "We don't support nested helper calls yet"); + + uint32 argCount = 0; + + IR::Opnd* opndParam; + // Now walk the user arguments and remember the arg count. + + IR::Instr * argInstr = callInstr; + IR::Opnd *src2Opnd = callInstr->UnlinkSrc2(); + while (src2Opnd->IsSymOpnd()) + { + // Get the arg instr + IR::SymOpnd * argLinkOpnd = src2Opnd->AsSymOpnd(); + StackSym * argLinkSym = argLinkOpnd->m_sym->AsStackSym(); + AssertMsg(argLinkSym->IsArgSlotSym() && argLinkSym->m_isSingleDef, "Arg tree not single def..."); + argLinkOpnd->Free(this->m_func); + + argInstr = argLinkSym->m_instrDef; + + // The arg sym isn't assigned a constant directly anymore + argLinkSym->m_isConst = false; + argLinkSym->m_isIntConst = false; + argLinkSym->m_isTaggableIntConst = false; + + // The arg slot nums are 1-based, so subtract 1. Then add 1 for the non-user args (callinfo). + auto argSlotNum = argLinkSym->GetArgSlotNum(); + if(argSlotNum + extraParams < argSlotNum) + { + Js::Throw::OutOfMemory(); + } + opndParam = this->GetOpndForArgSlot(argSlotNum + extraParams); + + src2Opnd = argInstr->UnlinkSrc2(); + argInstr->ReplaceDst(opndParam); + argInstr->Unlink(); + if (opndParam->IsRegOpnd()) + { + callInstr->InsertBefore(argInstr); + } + else + { + stackParamInsert->InsertBefore(argInstr); + } + this->ChangeToAssign(argInstr); + argCount++; + } + + IR::RegOpnd * argLinkOpnd = src2Opnd->AsRegOpnd(); + StackSym *argLinkSym = argLinkOpnd->m_sym->AsStackSym(); + AssertMsg(!argLinkSym->IsArgSlotSym() && argLinkSym->m_isSingleDef, "Arg tree not single def..."); + + IR::Instr *startCallInstr = argLinkSym->m_instrDef; + + AssertMsg(startCallInstr->m_opcode == Js::OpCode::StartCall || startCallInstr->m_opcode == Js::OpCode::LoweredStartCall, "Problem with arg chain."); + AssertMsg(startCallInstr->GetArgOutCount(/*getInterpreterArgOutCount*/ false) == argCount, + "ArgCount doesn't match StartCall count"); + + // Deal with the SC. + this->LowerStartCall(startCallInstr); + + // Second argument is the callinfo. + IR::IntConstOpnd *opndCallInfo = Lowerer::MakeCallInfoConst(callFlags, argCount, m_func); + if(callInfoOpndRef) + { + opndCallInfo->Use(m_func); + *callInfoOpndRef = opndCallInfo; + } + opndParam = this->GetOpndForArgSlot(extraParams); + Lowerer::InsertMove(opndParam, opndCallInfo, callInstr); + + return argCount + 1 + extraParams; // + 1 for call flags +} + +IR::Instr * +LowererMD::LowerStartCall(IR::Instr * instr) +{ + // StartCall doesn't need to generate a stack adjustment. Just delete it. + instr->m_opcode = Js::OpCode::LoweredStartCall; + return instr; +} + +IR::Instr * +LowererMD::LoadHelperArgument(IR::Instr * instr, IR::Opnd * opndArgValue) +{ + // Load the given parameter into the appropriate location. + // We update the current param state so we can do this work without making the caller + // do the work. + Assert(this->helperCallArgsCount < LowererMD::MaxArgumentsToHelper); + + __analysis_assume(this->helperCallArgsCount < MaxArgumentsToHelper); + + helperCallArgs[helperCallArgsCount++] = opndArgValue; + + if (opndArgValue->GetType() == TyMachDouble) + { + this->helperCallDoubleArgsCount++; + } + + return instr; +} + +void +LowererMD::FinishArgLowering() +{ + this->helperCallArgsCount = 0; + this->helperCallDoubleArgsCount = 0; +} + +IR::Opnd * +LowererMD::GetOpndForArgSlot(Js::ArgSlot argSlot, IR::Opnd * argOpnd) +{ + IR::Opnd * opndParam = nullptr; + + IRType type = argOpnd ? argOpnd->GetType() : TyMachReg; + if (argOpnd == nullptr || !argOpnd->IsFloat()) + { + if (argSlot < NUM_INT_ARG_REGS) + { + // Return an instance of the next arg register. + IR::RegOpnd *regOpnd; + regOpnd = IR::RegOpnd::New(nullptr, (RegNum)(argSlot + FIRST_INT_ARG_REG), type, this->m_func); + + regOpnd->m_isCallArg = true; + + opndParam = regOpnd; + } + else + { + // Create a stack slot reference and bump up the size of this function's outgoing param area, + // if necessary. + argSlot = argSlot - NUM_INT_ARG_REGS; + IntConstType offset = argSlot * MachRegInt; + IR::RegOpnd * spBase = IR::RegOpnd::New(nullptr, this->GetRegStackPointer(), TyMachReg, this->m_func); + opndParam = IR::IndirOpnd::New(spBase, int32(offset), type, this->m_func); + + if (this->m_func->m_argSlotsForFunctionsCalled < (uint32)(argSlot + 1)) + { + this->m_func->m_argSlotsForFunctionsCalled = argSlot + 1; + } + } + } + else + { + if (argSlot < MaxDoubleArgumentsToHelper) + { + // Return an instance of the next arg register. + IR::RegOpnd *regOpnd; + regOpnd = IR::RegOpnd::New(nullptr, (RegNum)(argSlot + FIRST_DOUBLE_ARG_REG), type, this->m_func); + regOpnd->m_isCallArg = true; + opndParam = regOpnd; + } + else + { + AssertMsg(false,"More than 8 double parameter passing disallowed"); + } + } + return opndParam; +} + +IR::Instr * +LowererMD::LoadDoubleHelperArgument(IR::Instr * instr, IR::Opnd * opndArg) +{ + // Load the given parameter into the appropriate location. + // We update the current param state so we can do this work without making the caller + // do the work. + Assert(opndArg->GetType() == TyMachDouble); + return this->LoadHelperArgument(instr, opndArg); +} + +void +LowererMD::GenerateStackProbe(IR::Instr *insertInstr, bool afterProlog) +{ + // + // Generate a stack overflow check. This can be as simple as a cmp esp, const + // because this function is guaranteed to be called on its base thread only. + // If the check fails call ThreadContext::ProbeCurrentStack which will check again and must throw. + // + // LDIMM r17, ThreadContext::scriptStackLimit + frameSize //Load to register first, as this can be more than 12 bit supported in CMP + // CMP sp, r17 + // BHI done + // begin: + // LDIMM r0, frameSize + // LDIMM r1, scriptContext + // LDIMM r2, ThreadContext::ProbeCurrentStack //MUST THROW + // BLX r2 //BX r2 if the stackprobe is before prolog + // done: + // + + // For thread context with script interrupt enabled: + // LDIMM r17, &ThreadContext::scriptStackLimitForCurrentThread + // LDR r17, [r17] + // MOV r15, frameSize + // ADDS r17, r17, r15 + // BVS $helper + // CMP sp, r17 + // BHI done + // $helper: + // LDIMM r0, frameSize + // LDIMM r1, scriptContext + // LDIMM r2, ThreadContext::ProbeCurrentStack //MUST THROW + // BLX r2 //BX r2 if the stackprobe is before prolog + // done: + // + + //m_localStackHeight for ARM contains (m_argSlotsForFunctionsCalled * MachPtr) + uint32 frameSize = this->m_func->m_localStackHeight + Js::Constants::MinStackJIT; + + IR::RegOpnd *scratchOpnd = IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachReg, this->m_func); + IR::LabelInstr *helperLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, afterProlog); + IR::Instr *instr; + bool doInterruptProbe = m_func->GetJITFunctionBody()->DoInterruptProbe(); + + if (doInterruptProbe || !m_func->GetThreadContextInfo()->IsThreadBound()) + { + // LDIMM r17, &ThreadContext::scriptStackLimitForCurrentThread + intptr_t pLimit = m_func->GetThreadContextInfo()->GetThreadStackLimitAddr(); + Lowerer::InsertMove(scratchOpnd, IR::AddrOpnd::New(pLimit, IR::AddrOpndKindDynamicMisc, this->m_func), insertInstr); + + // LDR r17, [r17, #0] + Lowerer::InsertMove(scratchOpnd, IR::IndirOpnd::New(scratchOpnd, 0, TyMachReg, this->m_func), insertInstr); + + AssertMsg(!IS_CONST_00000FFF(frameSize), "For small size we can just add frameSize to r17"); + + // MOV r15, frameSize + IR::Opnd* spAllocRegOpnd = IR::RegOpnd::New(nullptr, SP_ALLOC_SCRATCH_REG, TyMachReg, this->m_func); + Lowerer::InsertMove(spAllocRegOpnd, IR::IntConstOpnd::New(frameSize, TyMachReg, this->m_func), insertInstr); + + // ADDS r17, r17, r15 + instr = IR::Instr::New(Js::OpCode::ADDS, scratchOpnd, scratchOpnd, spAllocRegOpnd, this->m_func); + insertInstr->InsertBefore(instr); + + // If this add overflows, we have to call the helper. + instr = IR::BranchInstr::New(Js::OpCode::BVS, helperLabel, this->m_func); + insertInstr->InsertBefore(instr); + } + else + { + // MOV r17, frameSize + scriptStackLimit + uint64 scriptStackLimit = m_func->GetThreadContextInfo()->GetScriptStackLimit(); + IR::Opnd *stackLimitOpnd = IR::IntConstOpnd::New(frameSize + scriptStackLimit, TyMachReg, this->m_func); + Lowerer::InsertMove(scratchOpnd, stackLimitOpnd, insertInstr); + } + + IR::LabelInstr *doneLabelInstr = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, false); + if (!IS_FAULTINJECT_STACK_PROBE_ON) // Do stack check fastpath only if not doing StackProbe fault injection + { + // CMP sp, r17 + instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); + instr->SetSrc1(IR::RegOpnd::New(nullptr, GetRegStackPointer(), TyMachReg, this->m_func)); + instr->SetSrc2(scratchOpnd); + insertInstr->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + + // BHI done + instr = IR::BranchInstr::New(Js::OpCode::BHI, doneLabelInstr, this->m_func); + insertInstr->InsertBefore(instr); + } + + insertInstr->InsertBefore(helperLabel); + + // ToDo (SaAgarwa): Make sure all SP offsets are correct + // Zero out the pointer to the list of stack nested funcs, since the functions won't be initialized on this path. + /* + scratchOpnd = IR::RegOpnd::New(nullptr, RegR0, TyMachReg, m_func); + IR::RegOpnd *frameReg = IR::RegOpnd::New(nullptr, GetRegFramePointer(), TyMachReg, m_func); + Lowerer::InsertMove(scratchOpnd, IR::IntConstOpnd::New(0, TyMachReg, m_func), insertInstr); + IR::Opnd *indirOpnd = IR::IndirOpnd::New( + frameReg, -(int32)(Js::Constants::StackNestedFuncList * sizeof(Js::Var)), TyMachReg, m_func); + Lowerer::InsertMove(indirOpnd, scratchOpnd, insertInstr); + */ + IR::RegOpnd *r0Opnd = IR::RegOpnd::New(nullptr, RegR0, TyMachReg, this->m_func); + Lowerer::InsertMove(r0Opnd, IR::IntConstOpnd::New(frameSize, TyMachReg, this->m_func, true), insertInstr); + + IR::RegOpnd *r1Opnd = IR::RegOpnd::New(nullptr, RegR1, TyMachReg, this->m_func); + Lowerer::InsertMove(r1Opnd, this->m_lowerer->LoadScriptContextOpnd(insertInstr), insertInstr); + + IR::RegOpnd *r2Opnd = IR::RegOpnd::New(nullptr, RegR2, TyMachReg, m_func); + Lowerer::InsertMove(r2Opnd, IR::HelperCallOpnd::New(IR::HelperProbeCurrentStack, this->m_func), insertInstr); + + instr = IR::Instr::New(afterProlog? Js::OpCode::BLR : Js::OpCode::BR, this->m_func); + instr->SetSrc1(r2Opnd); + insertInstr->InsertBefore(instr); + + insertInstr->InsertBefore(doneLabelInstr); +} + +// +// Emits the code to allocate 'size' amount of space on stack. for values smaller than PAGE_SIZE +// this will just emit sub SP,size otherwise calls _chkstk. +// +bool +LowererMD::GenerateStackAllocation(IR::Instr *instr, uint32 allocSize, uint32 probeSize) +{ + IR::RegOpnd* spOpnd = IR::RegOpnd::New(nullptr, GetRegStackPointer(), TyMachReg, this->m_func); + + if (IsSmallStack(probeSize)) + { + AssertMsg(!(allocSize & 0xFFFFF000), "Must fit in 12 bits"); + AssertMsg(allocSize % MachStackAlignment == 0, "Must be aligned"); + // Generate SUB SP, SP, stackSize + IR::IntConstOpnd * stackSizeOpnd = IR::IntConstOpnd::New(allocSize, TyMachReg, this->m_func, true); + IR::Instr * subInstr = IR::Instr::New(Js::OpCode::SUB, spOpnd, spOpnd, stackSizeOpnd, this->m_func); + instr->InsertBefore(subInstr); + return false; + } + + //__chkStk is a leaf function and hence alignment is not required. + + // Generate _chkstk call + // LDIMM RegR15, stackSize/16 + // LDIMM RegR17, HelperCRT_chkstk + // BLX RegR17 + // SUB SP, SP, x15, lsl #4 + + //chkstk expects the stacksize argument in R15 register + IR::RegOpnd *spAllocOpnd = IR::RegOpnd::New(nullptr, SP_ALLOC_SCRATCH_REG, TyMachReg, this->m_func); + IR::RegOpnd *targetOpnd = IR::RegOpnd::New(nullptr, SCRATCH_REG, TyMachReg, this->m_func); + + IR::IntConstOpnd * stackSizeOpnd = IR::IntConstOpnd::New((allocSize / MachStackAlignment), TyMachReg, this->m_func, true); + + IR::Instr *movHelperAddrInstr = IR::Instr::New(Js::OpCode::LDIMM, targetOpnd, IR::HelperCallOpnd::New(IR::HelperCRT_chkstk, this->m_func), this->m_func); + instr->InsertBefore(movHelperAddrInstr); + + IR::Instr *movInstr = IR::Instr::New(Js::OpCode::LDIMM, spAllocOpnd, stackSizeOpnd, this->m_func); + instr->InsertBefore(movInstr); + + IR::Instr * callInstr = IR::Instr::New(Js::OpCode::BLR, spAllocOpnd, targetOpnd, this->m_func); + instr->InsertBefore(callInstr); + + // _chkstk succeeded adjust SP by allocSize. r15 contains allocSize/16 so left shift r15 by 4 to get allocSize + // Generate SUB SP, SP, x15, lsl #4 + IR::Instr * subInstr = IR::Instr::New(Js::OpCode::SUB_LSL4, spOpnd, spOpnd, spAllocOpnd, this->m_func); + instr->InsertBefore(subInstr); + + // return true to imply scratch register is trashed + return true; +} + +void +LowererMD::GenerateStackDeallocation(IR::Instr *instr, uint32 allocSize) +{ + IR::RegOpnd * spOpnd = IR::RegOpnd::New(nullptr, this->GetRegStackPointer(), TyMachReg, this->m_func); + + IR::Instr * spAdjustInstr = IR::Instr::New(Js::OpCode::ADD, + spOpnd, + spOpnd, + IR::IntConstOpnd::New(allocSize, TyMachReg, this->m_func, true), this->m_func); + instr->InsertBefore(spAdjustInstr); + LegalizeMD::LegalizeInstr(spAdjustInstr, true); +} + + + +class ARM64StackLayout +{ + // + // Canonical ARM64 prolog/epilog stack layout (stack grows downward): + // + // +-------------------------------------+ + // | caller-allocated parameters | + // +=====================================+-----> SP at time of call + // | callee-saved parameters (x0-x7) | + // +-------------------------------------+ + // | frame pointer + link register | + // +-------------------------------------+-----> updated FP points here + // | arguments slot + StackFunctionList | + // +-------------------------------------+ + // | callee-saved registers (x19-x28) | + // +-------------------------------------+ + // | callee-saved FP regs (d8-d15) | + // +-------------------------------------+-----> == regOffset + // | locals area | + // +-------------------------------------+-----> locals pointer if not SP + // | caller-allocated parameters | + // +=====================================+-----> SP points here when done + // + +public: + ARM64StackLayout(Func* func); + + // Getters + bool HasCalls() const { return m_hasCalls; } + bool HasTry() const { return m_hasTry; } + ULONG ArgSlotCount() const { return m_argSlotCount; } + BitVector HomedParams() const { return m_homedParams; } + BitVector SavedRegisters() const { return m_savedRegisters; } + BitVector SavedDoubles() const { return m_savedDoubles; } + + // Locals area sits right after space allocated for argments + ULONG LocalsOffset() const { return this->m_argSlotCount * MachRegInt; } + ULONG LocalsSize() const { return this->m_localsArea; } + + // Saved non-volatile double registers sit past the locals area + ULONG SavedDoublesOffset() const { return this->LocalsOffset() + this->LocalsSize(); } + ULONG SavedDoublesSize() const { return this->m_savedDoubles.Count() * MachRegDouble; } + + // Saved non-volatile integer registers sit after the saved doubles + ULONG SavedRegistersOffset() const { return this->SavedDoublesOffset() + this->SavedDoublesSize(); } + ULONG SavedRegistersSize() const { return this->m_savedRegisters.Count() * MachRegInt; } + + // The argument slot and StackFunctionList entry come after the saved integer registers + ULONG ArgSlotOffset() const { return this->SavedRegistersOffset() + this->SavedRegistersSize(); } + ULONG ArgSlotSize() const { return this->m_hasCalls ? (2 * MachRegInt) : 0; } + + // Next comes the frame chain + ULONG FpLrOffset() const { return this->ArgSlotOffset() + this->ArgSlotSize(); } + ULONG FpLrSize() const { return this->m_hasCalls ? (2 * MachRegInt) : 0; } + + // Followed by any homed parameters + ULONG HomedParamsOffset() const { return this->FpLrOffset() + this->FpLrSize(); } + ULONG HomedParamsSize() const { return this->m_homedParams.Count() * MachRegInt; } + + // And that's the total stack allocation + ULONG TotalStackSize() const { return this->HomedParamsOffset() + this->HomedParamsSize(); } + + // The register area is the area at the far end that doesn't include locals or arg slots + ULONG RegisterAreaOffset() const { return this->SavedDoublesOffset(); } + ULONG RegisterAreaSize() const { return this->TotalStackSize() - this->RegisterAreaOffset(); } + +private: + bool m_hasCalls; + bool m_hasTry; + ULONG m_argSlotCount; + ULONG m_localsArea; + BitVector m_homedParams; + BitVector m_savedRegisters; + BitVector m_savedDoubles; +}; + +ARM64StackLayout::ARM64StackLayout(Func* func) + : m_hasCalls(false), + m_hasTry(func->HasTry()), + m_argSlotCount(func->m_argSlotsForFunctionsCalled), + m_localsArea(func->m_localStackHeight) +{ + Assert(m_localsArea % 16 == 0); + Assert(m_argSlotCount % 2 == 0); + + // If there is a try, behave specially because the try/catch/finally helpers assume a + // fully-populated stack layout. + if (this->m_hasTry) + { + this->m_hasCalls = true; + this->m_savedRegisters.SetRange(FIRST_CALLEE_SAVED_GP_REG, CALLEE_SAVED_GP_REG_COUNT); + this->m_savedDoubles.SetRange(FIRST_CALLEE_SAVED_DBL_REG, CALLEE_SAVED_DOUBLE_REG_COUNT); + this->m_homedParams.SetRange(0, NUM_INT_ARG_REGS); + } + + // Otherwise, be more selective + else + { + // Determine integer register saves. Since registers are always saved in pairs, mark both registers + // in each pair as being saved even if only one is actually used. + for (RegNum curReg = FIRST_CALLEE_SAVED_GP_REG; curReg <= LAST_CALLEE_SAVED_GP_REG; curReg = RegNum(curReg + 2)) + { + Assert(LinearScan::IsCalleeSaved(curReg)); + RegNum nextReg = RegNum(curReg + 1); + Assert(LinearScan::IsCalleeSaved(nextReg)); + if (func->m_regsUsed.Test(curReg) || func->m_regsUsed.Test(nextReg)) + { + this->m_savedRegisters.SetRange(curReg, 2); + } + } + + // Determine double register saves. Since registers are always saved in pairs, mark both registers + // in each pair as being saved even if only one is actually used. + for (RegNum curReg = FIRST_CALLEE_SAVED_DBL_REG; curReg <= LAST_CALLEE_SAVED_DBL_REG; curReg = RegNum(curReg + 2)) + { + Assert(LinearScan::IsCalleeSaved(curReg)); + RegNum nextReg = RegNum(curReg + 1); + Assert(LinearScan::IsCalleeSaved(nextReg)); + if (func->m_regsUsed.Test(curReg) || func->m_regsUsed.Test(nextReg)) + { + this->m_savedDoubles.SetRange(curReg, 2); + } + } + + // Determine if there are nested calls. + // + // If the function has a try, we need to have the same register saves in the prolog as the + // arm64_CallEhFrame helper, so that we can use the same epilog. So always allocate a slot + // for the stack nested func here whether we actually do have any stack nested func or not + // TODO-STACK-NESTED-FUNC: May be use a different arm64_CallEhFrame for when we have + // stack nested func? + // + // Note that this->TotalStackSize() will not include the homed parameters yet, so we add in + // the worst case assumption (homing all NUM_INT_ARG_REGS). + this->m_hasCalls = func->GetHasCalls() || + func->HasAnyStackNestedFunc() || + !LowererMD::IsSmallStack(this->TotalStackSize() + NUM_INT_ARG_REGS * MachRegInt); + + // Home the params. This is done to enable on-the-fly creation of the arguments object, + // Dyno bailout code, etc. For non-global functions, that means homing all the param registers + // (since we have to assume they all have valid parameters). For the global function, + // just home x0 (function object) and x1 (callinfo), which the runtime can't get by any other means. + int homedParams = MIN_HOMED_PARAM_REGS; + if (func->IsLoopBody()) + { + // Jitted loop body takes only one "user" param: the pointer to the local slots. + homedParams += 1; + } + else if (!this->m_hasCalls) + { + // A leaf function (no calls of any kind, including helpers) may still need its params, or, if it + // has none, may still need the function object and call info. + homedParams += func->GetInParamsCount(); + } + else + { + homedParams = NUM_INT_ARG_REGS; + } + + // Round up to an even number to keep stack alignment + if (homedParams % 2 != 0) + { + homedParams += 1; + } + this->m_homedParams.SetRange(0, (homedParams < NUM_INT_ARG_REGS) ? homedParams : NUM_INT_ARG_REGS); + } +} + +IR::Instr * +LowererMD::LowerEntryInstr(IR::EntryInstr * entryInstr) +{ + IR::Instr *insertInstr = entryInstr->m_next; + + // Begin recording info for later pdata/xdata emission. + this->m_func->m_unwindInfo.Init(this->m_func); + + // Ensure there are an even number of slots for called functions + if (this->m_func->m_argSlotsForFunctionsCalled % 2 != 0) + { + this->m_func->m_argSlotsForFunctionsCalled += 1; + } + + if (this->m_func->HasInlinee()) + { + // Allocate the inlined arg out stack in the locals. Allocate an additional slot so that + // we can unconditionally clear the first slot past the current frame. + this->m_func->m_localStackHeight += this->m_func->GetInlineeArgumentStackSize(); + } + + // Ensure the locals area is 16 byte aligned. + this->m_func->m_localStackHeight = Math::Align(this->m_func->m_localStackHeight, MachStackAlignment); + + // Now that the localStackHeight has been adjusted, compute the final layout + ARM64StackLayout layout(this->m_func); + Assert(layout.TotalStackSize() % 16 == 0); + + // Set the arguments offset relative to the end of the locals area + this->m_func->m_ArgumentsOffset = layout.HomedParamsOffset() - (layout.LocalsOffset() + layout.LocalsSize()); + + // Set the frame height if inlinee arguments are needed + if (m_func->GetMaxInlineeArgOutSize() != 0) + { + // subtracting 2 for frame pointer & return address + this->m_func->GetJITOutput()->SetFrameHeight(this->m_func->m_localStackHeight + this->m_func->m_ArgumentsOffset - 2 * MachRegInt); + } + + // Two situations to handle: + // + // 1. If total stack allocation < 512, we can do a single allocation up front + // 2. Otherwise, we allocate the register area first, save regs, then allocate locals + // + // Breaking this down, there are two stack allocations + // + // Allocation 1 = situation1 ? TotalStackSize : RegisterAreaSize + // Allocation 2 = TotalStackSize - Allocation 1 + // + // + // prologStart: + // sub sp, sp, #allocation1 + // stp d8-d15, [sp, #savedDoublesOffset - allocation2] + // stp x19-x28, [sp, #savedRegistersOffset - allocation2] + // stp fp, lr, [sp, #fpLrOffset - allocation2] + // add fp, sp, #fpLrOffset - allocation2 + // sub sp, sp, #allocation2 (might be call to _chkstk) + // prologEnd: + // stp zr, zr, [fp, #argSlotOffset - fpLrOffset] + // stp x0-x7, [fp, #paramSaveOffset - fpLrOffset] + // add localsptr, sp, #localsOffset + // sub ehsave, fp, #fpLrOffset - registerAreaOffset + // + + // Determine the 1 or 2 stack allocation sizes + ULONG stackAllocation1 = (layout.TotalStackSize() < 512) ? layout.TotalStackSize() : layout.RegisterAreaSize(); + ULONG stackAllocation2 = layout.TotalStackSize() - stackAllocation1; + +// this->GenerateDebugBreak(insertInstr); + + // Generate a stack probe for large stacks first even before register push + bool fStackProbeAfterProlog = IsSmallStack(layout.TotalStackSize()); + if (!fStackProbeAfterProlog) + { + GenerateStackProbe(insertInstr, false); + } + + // Create the prologStart label + IR::LabelInstr *prologStartLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + insertInstr->InsertBefore(prologStartLabel); + this->m_func->m_unwindInfo.SetFunctionOffsetLabel(UnwindPrologStart, prologStartLabel); + + // Perform the initial stack allocation (guaranteed to be small) + IR::RegOpnd *spOpnd = IR::RegOpnd::New(nullptr, RegSP, TyMachReg, this->m_func); + if (stackAllocation1 > 0) + { + IR::Instr * instrSub = IR::Instr::New(Js::OpCode::SUB, spOpnd, spOpnd, IR::IntConstOpnd::New(stackAllocation1, TyMachReg, this->m_func), this->m_func); + insertInstr->InsertBefore(instrSub); + } + + // Save doubles in pairs + if (!layout.SavedDoubles().IsEmpty()) + { + ULONG curOffset = layout.SavedDoublesOffset() - stackAllocation2; + for (RegNum curReg = FIRST_CALLEE_SAVED_DBL_REG; curReg <= LAST_CALLEE_SAVED_DBL_REG; curReg = RegNum(curReg + 2)) + { + if (layout.SavedDoubles().Test(curReg)) + { + RegNum nextReg = RegNum(curReg + 1); + IR::Instr * instrStp = IR::Instr::New(Js::OpCode::FSTP, + IR::IndirOpnd::New(spOpnd, curOffset, TyMachReg, this->m_func), + IR::RegOpnd::New(curReg, TyMachDouble, this->m_func), + IR::RegOpnd::New(nextReg, TyMachDouble, this->m_func), this->m_func); + insertInstr->InsertBefore(instrStp); + curOffset += 2 * MachRegDouble; + } + } + } + + // Save integer registers in pairs + if (!layout.SavedRegisters().IsEmpty()) + { + ULONG curOffset = layout.SavedRegistersOffset() - stackAllocation2; + for (RegNum curReg = FIRST_CALLEE_SAVED_GP_REG; curReg <= LAST_CALLEE_SAVED_GP_REG; curReg = RegNum(curReg + 2)) + { + if (layout.SavedRegisters().Test(curReg)) + { + RegNum nextReg = RegNum(curReg + 1); + IR::Instr * instrStp = IR::Instr::New(Js::OpCode::STP, + IR::IndirOpnd::New(spOpnd, curOffset, TyMachReg, this->m_func), + IR::RegOpnd::New(curReg, TyMachReg, this->m_func), + IR::RegOpnd::New(nextReg, TyMachReg, this->m_func), this->m_func); + insertInstr->InsertBefore(instrStp); + curOffset += 2 * MachRegInt; + } + } + } + + // Save FP/LR and compute FP + IR::RegOpnd *fpOpnd = fpOpnd = IR::RegOpnd::New(nullptr, RegFP, TyMachReg, this->m_func); + if (layout.HasCalls()) + { + // STP fp, lr, [sp, #offs] + ULONG fpOffset = layout.FpLrOffset() - stackAllocation2; + IR::Instr * instrStp = IR::Instr::New(Js::OpCode::STP, + IR::IndirOpnd::New(spOpnd, fpOffset, TyMachReg, this->m_func), + fpOpnd, IR::RegOpnd::New(RegLR, TyMachReg, this->m_func), this->m_func); + insertInstr->InsertBefore(instrStp); + + // ADD fp, sp, #offs + // For exception handling, do this part AFTER the prolog to allow for proper unwinding + if (!layout.HasTry()) + { + Lowerer::InsertAdd(false, fpOpnd, spOpnd, IR::IntConstOpnd::New(fpOffset, TyMachReg, this->m_func), insertInstr); + } + } + + // Perform the second (potentially large) stack allocation + if (stackAllocation2 > 0) + { + // TODO: is the probeSize parameter correct here? + this->GenerateStackAllocation(insertInstr, stackAllocation2, stackAllocation1 + stackAllocation2); + } + + // Future work in the register area should be done FP-relative if it is set up + IR::RegOpnd *regAreaBaseOpnd = layout.HasCalls() ? fpOpnd : spOpnd; + ULONG regAreaBaseOffset = layout.HasCalls() ? layout.FpLrOffset() : 0; + + // This marks the end of the formal prolog (for EH purposes); create and register a label + IR::LabelInstr *prologEndLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + insertInstr->InsertBefore(prologEndLabel); + this->m_func->m_unwindInfo.SetFunctionOffsetLabel(UnwindPrologEnd, prologEndLabel); + + // Compute the FP now if there is a try present + if (layout.HasTry()) + { + Lowerer::InsertAdd(false, fpOpnd, spOpnd, IR::IntConstOpnd::New(layout.FpLrOffset(), TyMachReg, this->m_func), insertInstr); + } + + // Zero the argument slot if present + IR::RegOpnd *zrOpnd = IR::RegOpnd::New(nullptr, RegZR, TyMachReg, this->m_func); + if (layout.ArgSlotSize() > 0) + { + IR::Instr * instrStp = IR::Instr::New(Js::OpCode::STP, + IR::IndirOpnd::New(regAreaBaseOpnd, layout.ArgSlotOffset() - regAreaBaseOffset, TyMachReg, this->m_func), + zrOpnd, zrOpnd, this->m_func); + insertInstr->InsertBefore(instrStp); + } + + // Home parameter registers in pairs + if (!layout.HomedParams().IsEmpty()) + { + ULONG curOffset = layout.HomedParamsOffset() - regAreaBaseOffset; + for (RegNum curReg = FIRST_INT_ARG_REG; curReg <= LAST_INT_ARG_REG; curReg = RegNum(curReg + 2)) + { + if (layout.HomedParams().Test(curReg)) + { + RegNum nextReg = RegNum(curReg + 1); + IR::Instr * instrStp = IR::Instr::New(Js::OpCode::STP, + IR::IndirOpnd::New(regAreaBaseOpnd, curOffset, TyMachReg, this->m_func), + IR::RegOpnd::New(curReg, TyMachReg, this->m_func), + IR::RegOpnd::New(nextReg, TyMachReg, this->m_func), this->m_func); + insertInstr->InsertBefore(instrStp); + curOffset += 2 * MachRegInt; + } + } + } + + // Compute the locals pointer if needed + RegNum localsReg = this->m_func->GetLocalsPointer(); + if (localsReg != RegSP) + { + IR::RegOpnd* localsOpnd = IR::RegOpnd::New(nullptr, localsReg, TyMachReg, this->m_func); + Lowerer::InsertAdd(false, localsOpnd, spOpnd, IR::IntConstOpnd::New(layout.LocalsOffset(), TyMachReg, this->m_func), insertInstr); + } + + // Zero initialize the first inlinee frames argc. + if (this->m_func->GetMaxInlineeArgOutSize() != 0) + { + // STR argc, zr + StackSym *sym = this->m_func->m_symTable->GetArgSlotSym((Js::ArgSlot) - 1); + sym->m_isInlinedArgSlot = true; + sym->m_offset = 0; + IR::Instr * instrStr = IR::Instr::New(Js::OpCode::STR, IR::SymOpnd::New(sym, 0, TyMachReg, this->m_func), zrOpnd, this->m_func); + insertInstr->InsertBefore(instrStr); + } + + // Now do the stack probe for small stacks + // hasCalls catches the recursion case + if (layout.HasCalls() && fStackProbeAfterProlog) + { + GenerateStackProbe(insertInstr, true); //stack is already aligned in this case + } + + return entryInstr; +} + +IR::Instr * +LowererMD::LowerExitInstr(IR::ExitInstr * exitInstr) +{ + // Compute the final layout (should match the prolog) + ARM64StackLayout layout(this->m_func); + Assert(layout.TotalStackSize() % 16 == 0); + + // Determine the 1 or 2 stack allocation sizes + // Note that on exit, if there is a try, we always do a 2-step deallocation because the + // epilog is re-used by the try/catch/finally code + ULONG stackAllocation1 = (layout.TotalStackSize() < 512 && !layout.HasTry()) ? layout.TotalStackSize() : layout.RegisterAreaSize(); + ULONG stackAllocation2 = layout.TotalStackSize() - stackAllocation1; + + // Mark the start of the epilog + IR::LabelInstr *epilogStartLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + exitInstr->InsertBefore(epilogStartLabel); + this->m_func->m_unwindInfo.SetFunctionOffsetLabel(UnwindEpilogStart, epilogStartLabel); + + IR::RegOpnd *spOpnd = IR::RegOpnd::New(nullptr, RegSP, TyMachReg, this->m_func); + IR::RegOpnd *fpOpnd = IR::RegOpnd::New(nullptr, RegFP, TyMachReg, this->m_func); + + // Exception handling regions exit via the same epilog + IR::LabelInstr* ehEpilogLabel = this->m_func->m_epilogLabel; + if (ehEpilogLabel != nullptr) + { + ehEpilogLabel->Unlink(); + exitInstr->InsertBefore(ehEpilogLabel); + } + + // Undo the last stack allocation + if (stackAllocation2 > 0) + { + GenerateStackDeallocation(exitInstr, stackAllocation2); + } + + // Recover FP and LR + if (layout.HasCalls()) + { + // LDP fp, lr, [sp, #offs] + ULONG fpOffset = layout.FpLrOffset() - stackAllocation2; + IR::Instr * instrLdp = IR::Instr::New(Js::OpCode::LDP, fpOpnd, + IR::IndirOpnd::New(spOpnd, fpOffset, TyMachReg, this->m_func), + IR::RegOpnd::New(RegLR, TyMachReg, this->m_func), this->m_func); + exitInstr->InsertBefore(instrLdp); + } + + // Recover integer registers in pairs + if (!layout.SavedRegisters().IsEmpty()) + { + ULONG curOffset = layout.SavedRegistersOffset() - stackAllocation2 + layout.SavedRegistersSize(); + for (RegNum curReg = RegNum(LAST_CALLEE_SAVED_GP_REG - 1); curReg >= FIRST_CALLEE_SAVED_GP_REG; curReg = RegNum(curReg - 2)) + { + if (layout.SavedRegisters().Test(curReg)) + { + curOffset -= 2 * MachRegInt; + RegNum nextReg = RegNum(curReg + 1); + IR::Instr * instrLdp = IR::Instr::New(Js::OpCode::LDP, + IR::RegOpnd::New(curReg, TyMachReg, this->m_func), + IR::IndirOpnd::New(spOpnd, curOffset, TyMachReg, this->m_func), + IR::RegOpnd::New(nextReg, TyMachReg, this->m_func), this->m_func); + exitInstr->InsertBefore(instrLdp); + } + } + } + + // Recover doubles in pairs + if (!layout.SavedDoubles().IsEmpty()) + { + ULONG curOffset = layout.SavedDoublesOffset() - stackAllocation2 + layout.SavedDoublesSize(); + for (RegNum curReg = RegNum(LAST_CALLEE_SAVED_DBL_REG - 1); curReg >= FIRST_CALLEE_SAVED_DBL_REG; curReg = RegNum(curReg - 2)) + { + if (layout.SavedDoubles().Test(curReg)) + { + curOffset -= 2 * MachRegDouble; + RegNum nextReg = RegNum(curReg + 1); + IR::Instr * instrLdp = IR::Instr::New(Js::OpCode::FLDP, + IR::RegOpnd::New(curReg, TyMachDouble, this->m_func), + IR::IndirOpnd::New(spOpnd, curOffset, TyMachReg, this->m_func), + IR::RegOpnd::New(nextReg, TyMachDouble, this->m_func), this->m_func); + exitInstr->InsertBefore(instrLdp); + } + } + } + + // Final stack deallocation + if (stackAllocation1 > 0) + { + GenerateStackDeallocation(exitInstr, stackAllocation1); + } + + // Return + IR::Instr * instrRet = IR::Instr::New(Js::OpCode::RET, nullptr, IR::RegOpnd::New(nullptr, RegLR, TyMachReg, this->m_func), this->m_func); + exitInstr->InsertBefore(instrRet); + + // Label the end + IR::LabelInstr *epilogEndLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + exitInstr->InsertBefore(epilogEndLabel); + this->m_func->m_unwindInfo.SetFunctionOffsetLabel(UnwindEpilogEnd, epilogEndLabel); + + return exitInstr; +} + +IR::Instr * +LowererMD::LoadNewScObjFirstArg(IR::Instr * instr, IR::Opnd * argSrc, ushort extraArgs) +{ + // Spread moves down the argument slot by one. + // LowerCallArgs will handle the extraArgs. We only need to specify the argument number + // i.e 1 and not + extraArgs as done in AMD64 + IR::SymOpnd *argOpnd = IR::SymOpnd::New(this->m_func->m_symTable->GetArgSlotSym(1), TyVar, this->m_func); + IR::Instr *argInstr = IR::Instr::New(Js::OpCode::ArgOut_A, argOpnd, argSrc, this->m_func); + instr->InsertBefore(argInstr); + + // Insert the argument into the arg chain. + if (m_lowerer->IsSpreadCall(instr)) + { + // Spread calls need LdSpreadIndices as the last arg in the arg chain. + instr = m_lowerer->GetLdSpreadIndicesInstr(instr); + } + IR::Opnd *linkOpnd = instr->UnlinkSrc2(); + argInstr->SetSrc2(linkOpnd); + instr->SetSrc2(argOpnd); + + return argInstr; +} + +IR::Instr * +LowererMD::LowerTry(IR::Instr * tryInstr, IR::JnHelperMethod helperMethod) +{ + // Mark the entry to the try + IR::Instr * instr = tryInstr->GetNextRealInstrOrLabel(); + AssertMsg(instr->IsLabelInstr(), "No label at the entry to a try?"); + IR::LabelInstr * tryAddr = instr->AsLabelInstr(); + + // Arg 7: ScriptContext + this->m_lowerer->LoadScriptContext(tryAddr); + + if (tryInstr->m_opcode == Js::OpCode::TryCatch || this->m_func->DoOptimizeTry()) + { + // Arg 6 : hasBailedOutOffset + IR::Opnd * hasBailedOutOffset = IR::IntConstOpnd::New(this->m_func->m_hasBailedOutSym->m_offset + tryInstr->m_func->GetInlineeArgumentStackSize(), TyInt32, this->m_func); + this->LoadHelperArgument(tryAddr, hasBailedOutOffset); + } + + // Arg 5: arg out size + IR::RegOpnd * argOutSize = IR::RegOpnd::New(TyMachReg, this->m_func); + instr = IR::Instr::New(Js::OpCode::LDARGOUTSZ, argOutSize, this->m_func); + tryAddr->InsertBefore(instr); + this->LoadHelperArgument(tryAddr, argOutSize); + + // Arg 4: locals pointer + IR::RegOpnd * localsPtr = IR::RegOpnd::New(nullptr, this->m_func->GetLocalsPointer(), TyMachReg, this->m_func); + this->LoadHelperArgument(tryAddr, localsPtr); + + // Arg 3: frame pointer + IR::RegOpnd * framePtr = IR::RegOpnd::New(nullptr, FRAME_REG, TyMachReg, this->m_func); + this->LoadHelperArgument(tryAddr, framePtr); + + // Arg 2: helper address + IR::LabelInstr * helperAddr = tryInstr->AsBranchInstr()->GetTarget(); + this->LoadHelperArgument(tryAddr, IR::LabelOpnd::New(helperAddr, this->m_func)); + + // Arg 1: try address + this->LoadHelperArgument(tryAddr, IR::LabelOpnd::New(tryAddr, this->m_func)); + + // Call the helper + IR::RegOpnd *continuationAddr = + IR::RegOpnd::New(StackSym::New(TyMachReg,this->m_func), RETURN_REG, TyMachReg, this->m_func); + IR::Instr * callInstr = IR::Instr::New( + Js::OpCode::Call, continuationAddr, IR::HelperCallOpnd::New(helperMethod, this->m_func), this->m_func); + tryAddr->InsertBefore(callInstr); + this->LowerCall(callInstr, 0); + + // Jump to the continuation address supplied by the helper + IR::BranchInstr *branchInstr = IR::MultiBranchInstr::New(Js::OpCode::BR, continuationAddr, this->m_func); + tryAddr->InsertBefore(branchInstr); + + return tryInstr->m_prev; +} + +IR::Instr * +LowererMD::LowerLeaveNull(IR::Instr * leaveInstr) +{ + IR::Instr * instrPrev = leaveInstr->m_prev; + + // Return a NULL continuation address to the caller to indicate that the finally did not seize the flow. + this->LowerEHRegionReturn(leaveInstr, IR::IntConstOpnd::New(0, TyMachReg, this->m_func)); + + leaveInstr->Remove(); + return instrPrev; +} + +IR::Instr * +LowererMD::LowerEHRegionReturn(IR::Instr * insertBeforeInstr, IR::Opnd * targetOpnd) +{ + IR::RegOpnd *retReg = IR::RegOpnd::New(nullptr, RETURN_REG, TyMachReg, this->m_func); + + // Load the continuation address into the return register. + Lowerer::InsertMove(retReg, targetOpnd, insertBeforeInstr); + + IR::LabelInstr *epilogLabel = this->EnsureEHEpilogLabel(); + IR::BranchInstr *jmpInstr = IR::BranchInstr::New(Js::OpCode::B, epilogLabel, this->m_func); + insertBeforeInstr->InsertBefore(jmpInstr); + + // return the last instruction inserted + return jmpInstr; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::Init +/// +///---------------------------------------------------------------------------- + +void +LowererMD::Init(Lowerer *lowerer) +{ + m_lowerer = lowerer; + // The arg slot count computed by an earlier phase (e.g., IRBuilder) doesn't work for + // ARM if it accounts for nesting. Clear it here and let Lower compute its own value. + this->m_func->m_argSlotsForFunctionsCalled = 0; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::LoadInputParamPtr +/// +/// Load the address of the start of the passed-in parameters not including +/// the this parameter. +/// +///---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::LoadInputParamPtr(IR::Instr * instrInsert, IR::RegOpnd * optionalDstOpnd /* = nullptr */) +{ + if (this->m_func->GetJITFunctionBody()->IsCoroutine()) + { + IR::RegOpnd * argPtrRegOpnd = Lowerer::LoadGeneratorArgsPtr(instrInsert); + IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(argPtrRegOpnd, 1 * MachPtr, TyMachPtr, this->m_func); + IR::RegOpnd * dstOpnd = optionalDstOpnd != nullptr ? optionalDstOpnd : IR::RegOpnd::New(TyMachPtr, this->m_func); + + return Lowerer::InsertLea(dstOpnd, indirOpnd, instrInsert); + } + else + { + StackSym * paramSym = GetImplicitParamSlotSym(3); + return this->m_lowerer->InsertLoadStackAddress(paramSym, instrInsert); + } +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::LoadInputParamCount +/// +/// Load the passed-in parameter count from the appropriate slot. +/// +///---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::LoadInputParamCount(IR::Instr * instrInsert, int adjust, bool needFlags) +{ + // LDR Rz, CallInfo + // UBFX Rx, Rz, 27, #1 // Get CallEval bit. + // UBFX Rz, Rz, 0, #24 // Extract call count + // SUB Rz, Rz, Rx // Now Rz has the right number of parameters + + IR::SymOpnd * srcOpnd = Lowerer::LoadCallInfo(instrInsert); + IR::RegOpnd * dstOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); + + IR::Instr *instr = IR::Instr::New(Js::OpCode::LDR, dstOpnd, srcOpnd, this->m_func); + instrInsert->InsertBefore(instr); + + // Get the actual call count. On ARM64 top 32 bits are unused + instr = IR::Instr::New(Js::OpCode::UBFX, dstOpnd, dstOpnd, IR::IntConstOpnd::New(BITFIELD(0, Js::CallInfo::ksizeofCount), TyMachReg, this->m_func), this->m_func); + instrInsert->InsertBefore(instr); + + return Lowerer::InsertSub(needFlags, dstOpnd, dstOpnd, IR::IntConstOpnd::New(-adjust, TyUint32, this->m_func), instrInsert); +} + +IR::Instr * +LowererMD::LoadStackArgPtr(IR::Instr * instr) +{ + if (this->m_func->IsLoopBody()) + { + // Get the first user param from the interpreter frame instance that was passed in. + // These args don't include the func object and callinfo; we just need to advance past "this". + + // t1 = LDR [prm1 + m_inParams] + // dst = ADD t1, sizeof(var) + + Assert(this->m_func->m_loopParamSym); + IR::RegOpnd *baseOpnd = IR::RegOpnd::New(this->m_func->m_loopParamSym, TyMachReg, this->m_func); + size_t offset = Js::InterpreterStackFrame::GetOffsetOfInParams(); + IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(baseOpnd, (int32)offset, TyMachReg, this->m_func); + IR::RegOpnd *tmpOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); + Lowerer::InsertMove(tmpOpnd, indirOpnd, instr); + + instr->SetSrc1(tmpOpnd); + instr->SetSrc2(IR::IntConstOpnd::New(sizeof(Js::Var), TyMachReg, this->m_func)); + } + else if (this->m_func->GetJITFunctionBody()->IsCoroutine()) + { + IR::Instr *instr2 = LoadInputParamPtr(instr, instr->UnlinkDst()->AsRegOpnd()); + instr->Remove(); + instr = instr2; + } + else + { + // Get the args pointer relative to fp. We assume that fp is set up, since we'll only be looking + // for the stack arg pointer in a non-leaf. + + // dst = ADD r11, "this" offset + sizeof(var) + + instr->SetSrc1(IR::RegOpnd::New(nullptr, FRAME_REG, TyMachReg, this->m_func)); + instr->SetSrc2(IR::IntConstOpnd::New((ArgOffsetFromFramePtr + Js::JavascriptFunctionArgIndex_SecondScriptArg) * sizeof(Js::Var), TyMachReg, this->m_func)); + } + + instr->m_opcode = Js::OpCode::ADD; + Legalize(instr); + + return instr->m_prev; +} + +IR::Instr * +LowererMD::LoadArgumentsFromFrame(IR::Instr * instr) +{ + IR::RegOpnd *baseOpnd; + int32 offset; + + if (this->m_func->IsLoopBody()) + { + // Get the arguments ptr from the interpreter frame instance that was passed in. + Assert(this->m_func->m_loopParamSym); + baseOpnd = IR::RegOpnd::New(this->m_func->m_loopParamSym, TyMachReg, this->m_func); + offset = Js::InterpreterStackFrame::GetOffsetOfArguments(); + } + else + { + // Get the arguments relative to the frame pointer. + baseOpnd = IR::RegOpnd::New(nullptr, FRAME_REG, TyMachReg, this->m_func); + offset = -MachArgsSlotOffset; + } + + instr->SetSrc1(IR::IndirOpnd::New(baseOpnd, offset, TyMachReg, this->m_func)); + this->ChangeToAssign(instr); + + return instr->m_prev; +} + +// load argument count as I4 +IR::Instr * +LowererMD::LoadArgumentCount(IR::Instr * instr) +{ + IR::RegOpnd *baseOpnd; + int32 offset; + + if (this->m_func->IsLoopBody()) + { + // Pull the arg count from the interpreter frame instance that was passed in. + // (The callinfo in the loop body's frame just shows the single parameter, the interpreter frame.) + Assert(this->m_func->m_loopParamSym); + baseOpnd = IR::RegOpnd::New(this->m_func->m_loopParamSym, TyMachReg, this->m_func); + offset = Js::InterpreterStackFrame::GetOffsetOfInSlotsCount(); + } + else + { + baseOpnd = IR::RegOpnd::New(nullptr, FRAME_REG, TyMachReg, this->m_func); + offset = (ArgOffsetFromFramePtr + Js::JavascriptFunctionArgIndex_CallInfo) * sizeof(Js::Var); + } + + instr->SetSrc1(IR::IndirOpnd::New(baseOpnd, offset, TyInt32, this->m_func)); + this->ChangeToAssign(instr); + + return instr->m_prev; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::LoadHeapArguments +/// +/// Load the arguments object +/// NOTE: The same caveat regarding arguments passed on the stack applies here +/// as in LoadInputParamCount above. +///---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::LoadHeapArguments(IR::Instr * instrArgs) +{ + ASSERT_INLINEE_FUNC(instrArgs); + Func *func = instrArgs->m_func; + IR::Instr * instrPrev = instrArgs->m_prev; + + if (func->IsStackArgsEnabled()) + { + // The initial args slot value is zero. + instrArgs->m_opcode = Js::OpCode::LDIMM; + instrArgs->ReplaceSrc1(IR::AddrOpnd::NewNull(func)); + if (PHASE_TRACE1(Js::StackArgFormalsOptPhase) && func->GetJITFunctionBody()->GetInParamsCount() > 1) + { + Output::Print(_u("StackArgFormals : %s (%d) :Removing Heap Arguments object creation in Lowerer. \n"), instrArgs->m_func->GetJITFunctionBody()->GetDisplayName(), instrArgs->m_func->GetFunctionNumber()); + Output::Flush(); + } + } + else + { + // s7 = formals are let decls + // s6 = memory context + // s5 = array of property ID's + // s4 = local frame instance + // s3 = address of first actual argument (after "this") + // s2 = actual argument count + // s1 = current function + // dst = JavascriptOperators::LoadHeapArguments(s1, s2, s3, s4, s5, s6, s7) + + // s7 = formals are let decls + this->LoadHelperArgument(instrArgs, IR::IntConstOpnd::New(instrArgs->m_opcode == Js::OpCode::LdLetHeapArguments ? TRUE : FALSE, TyUint8, func)); + + // s6 = memory context + this->m_lowerer->LoadScriptContext(instrArgs); + + // s5 = array of property ID's + + intptr_t formalsPropIdArray = instrArgs->m_func->GetJITFunctionBody()->GetFormalsPropIdArrayAddr(); + if (!formalsPropIdArray) + { + formalsPropIdArray = instrArgs->m_func->GetScriptContextInfo()->GetNullAddr(); + } + + IR::Opnd * argArray = IR::AddrOpnd::New(formalsPropIdArray, IR::AddrOpndKindDynamicMisc, m_func); + this->LoadHelperArgument(instrArgs, argArray); + + // s4 = local frame instance + IR::Opnd * frameObj = instrArgs->UnlinkSrc1(); + this->LoadHelperArgument(instrArgs, frameObj); + + if (func->IsInlinee()) + { + // s3 = address of first actual argument (after "this"). + StackSym *firstRealArgSlotSym = func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); + this->m_func->SetArgOffset(firstRealArgSlotSym, firstRealArgSlotSym->m_offset + MachPtr); + IR::Instr *instr = this->m_lowerer->InsertLoadStackAddress(firstRealArgSlotSym, instrArgs); + this->LoadHelperArgument(instrArgs, instr->GetDst()); + + // s2 = actual argument count (without counting "this"). + this->LoadHelperArgument(instrArgs, IR::IntConstOpnd::New(func->actualCount - 1, TyUint32, func)); + + // s1 = current function. + this->LoadHelperArgument(instrArgs, func->GetInlineeFunctionObjectSlotOpnd()); + + // Save the newly-created args object to its dedicated stack slot. + IR::SymOpnd *argObjSlotOpnd = func->GetInlineeArgumentsObjectSlotOpnd(); + Lowerer::InsertMove(argObjSlotOpnd,instrArgs->GetDst(), instrArgs->m_next); + } + else + { + // s3 = address of first actual argument (after "this") + // Stack looks like (function object)+0, (arg count)+4, (this)+8, actual args + IR::Instr * instr = this->LoadInputParamPtr(instrArgs); + this->LoadHelperArgument(instrArgs, instr->GetDst()); + + // s2 = actual argument count (without counting "this") + instr = this->LoadInputParamCount(instrArgs, -1); + IR::Opnd * opndInputParamCount = instr->GetDst(); + + this->LoadHelperArgument(instrArgs, opndInputParamCount); + + // s1 = current function + StackSym * paramSym = GetImplicitParamSlotSym(0); + IR::Opnd * srcOpnd = IR::SymOpnd::New(paramSym, TyMachReg, func); + this->LoadHelperArgument(instrArgs, srcOpnd); + + // Save the newly-created args object to its dedicated stack slot. + Lowerer::InsertMove(CreateStackArgumentsSlotOpnd(), instrArgs->GetDst(), instrArgs->m_next); + } + this->ChangeToHelperCall(instrArgs, IR::HelperOp_LoadHeapArguments); + } + return instrPrev; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::LoadHeapArgsCached +/// +/// Load the heap-based arguments object using a cached scope +/// +///---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::LoadHeapArgsCached(IR::Instr * instrArgs) +{ + Assert(!this->m_func->GetJITFunctionBody()->IsGenerator()); + ASSERT_INLINEE_FUNC(instrArgs); + Func *func = instrArgs->m_func; + IR::Instr * instrPrev = instrArgs->m_prev; + + if (instrArgs->m_func->IsStackArgsEnabled()) + { + instrArgs->m_opcode = Js::OpCode::LDIMM; + instrArgs->ReplaceSrc1(IR::AddrOpnd::NewNull(func)); + + if (PHASE_TRACE1(Js::StackArgFormalsOptPhase) && func->GetJITFunctionBody()->GetInParamsCount() > 1) + { + Output::Print(_u("StackArgFormals : %s (%d) :Removing Heap Arguments object creation in Lowerer. \n"), instrArgs->m_func->GetJITFunctionBody()->GetDisplayName(), instrArgs->m_func->GetFunctionNumber()); + Output::Flush(); + } + } + else + { + // s7 = formals are let decls + // s6 = memory context + // s5 = local frame instance + // s4 = address of first actual argument (after "this") + // s3 = formal argument count + // s2 = actual argument count + // s1 = current function + // dst = JavascriptOperators::LoadHeapArgsCached(s1, s2, s3, s4, s5, s6, s7) + + + // s7 = formals are let decls + IR::Opnd * formalsAreLetDecls = IR::IntConstOpnd::New((IntConstType)(instrArgs->m_opcode == Js::OpCode::LdLetHeapArgsCached), TyUint8, func); + this->LoadHelperArgument(instrArgs, formalsAreLetDecls); + + // s6 = memory context + this->m_lowerer->LoadScriptContext(instrArgs); + + // s5 = local frame instance + IR::Opnd * frameObj = instrArgs->UnlinkSrc1(); + this->LoadHelperArgument(instrArgs, frameObj); + + if (func->IsInlinee()) + { + // s4 = address of first actual argument (after "this"). + StackSym *firstRealArgSlotSym = func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); + this->m_func->SetArgOffset(firstRealArgSlotSym, firstRealArgSlotSym->m_offset + MachPtr); + + IR::Instr *instr = this->m_lowerer->InsertLoadStackAddress(firstRealArgSlotSym, instrArgs); + this->LoadHelperArgument(instrArgs, instr->GetDst()); + + // s3 = formal argument count (without counting "this"). + uint32 formalsCount = func->GetJITFunctionBody()->GetInParamsCount() - 1; + this->LoadHelperArgument(instrArgs, IR::IntConstOpnd::New(formalsCount, TyUint32, func)); + + // s2 = actual argument count (without counting "this"). + this->LoadHelperArgument(instrArgs, IR::IntConstOpnd::New(func->actualCount - 1, TyUint32, func)); + + // s1 = current function. + this->LoadHelperArgument(instrArgs, func->GetInlineeFunctionObjectSlotOpnd()); + + // Save the newly-created args object to its dedicated stack slot. + IR::SymOpnd *argObjSlotOpnd = func->GetInlineeArgumentsObjectSlotOpnd(); + Lowerer::InsertMove(argObjSlotOpnd, instrArgs->GetDst(), instrArgs->m_next); + } + else + { + // s4 = address of first actual argument (after "this") + IR::Instr * instr = this->LoadInputParamPtr(instrArgs); + this->LoadHelperArgument(instrArgs, instr->GetDst()); + + // s3 = formal argument count (without counting "this") + uint32 formalsCount = func->GetInParamsCount() - 1; + this->LoadHelperArgument(instrArgs, IR::IntConstOpnd::New(formalsCount, TyMachReg, func)); + + // s2 = actual argument count (without counting "this") + instr = this->LoadInputParamCount(instrArgs, -1); + this->LoadHelperArgument(instrArgs, instr->GetDst()); + + // s1 = current function + StackSym * paramSym = GetImplicitParamSlotSym(0); + IR::Opnd * srcOpnd = IR::SymOpnd::New(paramSym, TyMachReg, func); + this->LoadHelperArgument(instrArgs, srcOpnd); + + + // Save the newly-created args object to its dedicated stack slot. + Lowerer::InsertMove(CreateStackArgumentsSlotOpnd(), instrArgs->GetDst(), instrArgs->m_next); + + } + + this->ChangeToHelperCall(instrArgs, IR::HelperOp_LoadHeapArgsCached); + } + return instrPrev; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::ChangeToHelperCall +/// +/// Change the current instruction to a call to the given helper. +/// +///---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::ChangeToHelperCall(IR::Instr * callInstr, IR::JnHelperMethod helperMethod, IR::LabelInstr *labelBailOut, + IR::Opnd *opndInstance, IR::PropertySymOpnd *propSymOpnd, bool isHelperContinuation) +{ + IR::Instr * bailOutInstr = callInstr; + if (callInstr->HasBailOutInfo()) + { + if (callInstr->GetBailOutKind() == IR::BailOutOnNotPrimitive) + { + callInstr = IR::Instr::New(callInstr->m_opcode, callInstr->m_func); + bailOutInstr->TransferTo(callInstr); + bailOutInstr->InsertBefore(callInstr); + + bailOutInstr->m_opcode = Js::OpCode::BailOnNotPrimitive; + bailOutInstr->SetSrc1(opndInstance); + } + else + { + bailOutInstr = this->m_lowerer->SplitBailOnImplicitCall(callInstr); + } + } + + IR::HelperCallOpnd *helperCallOpnd = Lowerer::CreateHelperCallOpnd(helperMethod, this->GetHelperArgsCount(), m_func); + if (helperCallOpnd->IsDiagHelperCallOpnd()) + { + // Load arguments for the wrapper. + this->LoadHelperArgument(callInstr, IR::AddrOpnd::New((Js::Var)IR::GetMethodOriginalAddress(m_func->GetThreadContextInfo(), helperMethod), IR::AddrOpndKindDynamicMisc, m_func)); + this->m_lowerer->LoadScriptContext(callInstr); + } + callInstr->SetSrc1(helperCallOpnd); + + IR::Instr * instrRet = this->LowerCall(callInstr, 0); + + if (bailOutInstr != callInstr) + { + // The bailout needs to be lowered after we lower the helper call because the helper argument + // has already been loaded. We need to drain them on AMD64 before starting another helper call + if (bailOutInstr->m_opcode == Js::OpCode::BailOnNotObject) + { + this->m_lowerer->LowerBailOnNotObject(bailOutInstr, nullptr, labelBailOut); + } + else if (bailOutInstr->m_opcode == Js::OpCode::BailOnNotPrimitive) + { + this->m_lowerer->LowerBailOnTrue(bailOutInstr, labelBailOut); + } + else + { + this->m_lowerer->LowerBailOnEqualOrNotEqual(bailOutInstr, nullptr, labelBailOut, propSymOpnd, isHelperContinuation); + } + } + + return instrRet; +} + +IR::Instr* LowererMD::ChangeToHelperCallMem(IR::Instr * instr, IR::JnHelperMethod helperMethod) +{ + this->m_lowerer->LoadScriptContext(instr); + + return this->ChangeToHelperCall(instr, helperMethod); +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::ChangeToAssign +/// +/// Change to a copy. Handle riscification of operands. +/// +///---------------------------------------------------------------------------- + +// ToDo (SaAgarwa) Copied from ARM32 to compile. Validate is this correct +IR::Instr * +LowererMD::ChangeToAssignNoBarrierCheck(IR::Instr * instr) +{ + return ChangeToAssign(instr, instr->GetDst()->GetType()); +} + +IR::Instr * +LowererMD::ChangeToAssign(IR::Instr * instr) +{ + return ChangeToAssign(instr, instr->GetDst()->GetType()); +} + +IR::Instr * +LowererMD::ChangeToAssign(IR::Instr * instr, IRType destType) +{ + Assert(!instr->HasBailOutInfo() || instr->GetBailOutKind() == IR::BailOutExpectingInteger + || instr->GetBailOutKind() == IR::BailOutExpectingString); + + IR::Opnd *src = instr->GetSrc1(); + IRType srcType = src->GetType(); + if (src->IsImmediateOpnd() || src->IsLabelOpnd()) + { + instr->m_opcode = Js::OpCode::LDIMM; + } + else if(destType == TyFloat32 && instr->GetDst()->IsRegOpnd()) + { + Assert(instr->GetSrc1()->IsFloat32()); + instr->m_opcode = Js::OpCode::FLDR; + + // Note that we allocate double register for single precision floats as well, as the register allocator currently + // does not support 32-bit float registers + instr->ReplaceDst(instr->GetDst()->UseWithNewType(TyFloat64, instr->m_func)); + if(instr->GetSrc1()->IsRegOpnd()) + { + instr->ReplaceSrc1(instr->GetSrc1()->UseWithNewType(TyFloat64, instr->m_func)); + } + } + else if (!src->IsIndirOpnd() && TySize[destType] > TySize[srcType] && (IRType_IsSignedInt(destType) || IRType_IsUnsignedInt(destType))) + { + // If we're moving between different lengths of registers, we need to use the + // right operator - sign extend if the source is int, zero extend if uint. + if (IRType_IsSignedInt(srcType)) + { + instr->ReplaceSrc1(src->UseWithNewType(IRType_EnsureSigned(destType), instr->m_func)); + instr->SetSrc2(IR::IntConstOpnd::New(BITFIELD(0, TySize[srcType] * MachBits), TyMachReg, instr->m_func, true)); + instr->m_opcode = Js::OpCode::SBFX; + } + else if (IRType_IsUnsignedInt(srcType)) + { + instr->ReplaceSrc1(src->UseWithNewType(IRType_EnsureUnsigned(destType), instr->m_func)); + instr->SetSrc2(IR::IntConstOpnd::New(BITFIELD(0, TySize[srcType] * MachBits), TyMachReg, instr->m_func, true)); + instr->m_opcode = Js::OpCode::UBFX; + } + else + { + AssertMsg(false, "argument size mismatch for mov instruction, with non int/uint types!"); + } + } + else + { + instr->m_opcode = IRType_IsFloat(destType) ? Js::OpCode::FMOV : Js::OpCode::MOV; + } + LegalizeMD::LegalizeInstr(instr, false); + + return instr; +} + +IR::Instr * +LowererMD::ChangeToWriteBarrierAssign(IR::Instr * assignInstr, const Func* func) +{ +#ifdef RECYCLER_WRITE_BARRIER_JIT + // WriteBarrier-TODO- Implement ARM JIT +#endif + return ChangeToAssignNoBarrierCheck(assignInstr); +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::LowerRet +/// +/// Lower Ret to "MOV EAX, src" +/// The real RET is inserted at the exit of the function when emitting the +/// epilog. +/// +///---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::LowerRet(IR::Instr * retInstr) +{ + IR::RegOpnd *retReg = IR::RegOpnd::New(TyMachReg, m_func); + retReg->SetReg(RETURN_REG); + Lowerer::InsertMove(retReg, retInstr->UnlinkSrc1(), retInstr); + + retInstr->SetSrc1(retReg); + + return retInstr; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::MDBranchOpcode +/// +/// Map HIR branch opcode to machine-dependent equivalent. +/// +///---------------------------------------------------------------------------- + +Js::OpCode +LowererMD::MDBranchOpcode(Js::OpCode opcode) +{ + switch (opcode) + { + case Js::OpCode::BrEq_A: + case Js::OpCode::BrSrEq_A: + case Js::OpCode::BrNotNeq_A: + case Js::OpCode::BrSrNotNeq_A: + case Js::OpCode::BrAddr_A: + return Js::OpCode::BEQ; + + case Js::OpCode::BrNeq_A: + case Js::OpCode::BrSrNeq_A: + case Js::OpCode::BrNotEq_A: + case Js::OpCode::BrSrNotEq_A: + case Js::OpCode::BrNotAddr_A: + return Js::OpCode::BNE; + + case Js::OpCode::BrLt_A: + case Js::OpCode::BrNotGe_A: + return Js::OpCode::BLT; + + case Js::OpCode::BrLe_A: + case Js::OpCode::BrNotGt_A: + return Js::OpCode::BLE; + + case Js::OpCode::BrGt_A: + case Js::OpCode::BrNotLe_A: + return Js::OpCode::BGT; + + case Js::OpCode::BrGe_A: + case Js::OpCode::BrNotLt_A: + return Js::OpCode::BGE; + + case Js::OpCode::BrUnGt_A: + return Js::OpCode::BHI; + + case Js::OpCode::BrUnGe_A: + return Js::OpCode::BCS; + + case Js::OpCode::BrUnLt_A: + return Js::OpCode::BCC; + + case Js::OpCode::BrUnLe_A: + return Js::OpCode::BLS; + + default: + AssertMsg(0, "NYI"); + return opcode; + } +} + +Js::OpCode +LowererMD::MDUnsignedBranchOpcode(Js::OpCode opcode) +{ + switch (opcode) + { + case Js::OpCode::BrEq_A: + case Js::OpCode::BrSrEq_A: + case Js::OpCode::BrSrNotNeq_A: + case Js::OpCode::BrNotNeq_A: + case Js::OpCode::BrAddr_A: + return Js::OpCode::BEQ; + + case Js::OpCode::BrNeq_A: + case Js::OpCode::BrSrNeq_A: + case Js::OpCode::BrSrNotEq_A: + case Js::OpCode::BrNotEq_A: + case Js::OpCode::BrNotAddr_A: + return Js::OpCode::BNE; + + case Js::OpCode::BrLt_A: + case Js::OpCode::BrNotGe_A: + return Js::OpCode::BCC; + + case Js::OpCode::BrLe_A: + case Js::OpCode::BrNotGt_A: + return Js::OpCode::BLS; + + case Js::OpCode::BrGt_A: + case Js::OpCode::BrNotLe_A: + return Js::OpCode::BHI; + + case Js::OpCode::BrGe_A: + case Js::OpCode::BrNotLt_A: + return Js::OpCode::BCS; + + default: + AssertMsg(0, "NYI"); + return opcode; + } +} + +Js::OpCode LowererMD::MDCompareWithZeroBranchOpcode(Js::OpCode opcode) +{ + Assert(opcode == Js::OpCode::BrLt_A || opcode == Js::OpCode::BrGe_A); + return opcode == Js::OpCode::BrLt_A ? Js::OpCode::BMI : Js::OpCode::BPL; +} + +void LowererMD::ChangeToAdd(IR::Instr *const instr, const bool needFlags) +{ + Assert(instr); + Assert(instr->GetDst()); + Assert(instr->GetSrc1()); + Assert(instr->GetSrc2()); + + if(instr->GetDst()->IsFloat64()) + { + Assert(instr->GetSrc1()->IsFloat64()); + Assert(instr->GetSrc2()->IsFloat64()); + Assert(!needFlags); + instr->m_opcode = Js::OpCode::FADD; + return; + } + + instr->m_opcode = needFlags ? Js::OpCode::ADDS : Js::OpCode::ADD; +} + +void LowererMD::ChangeToSub(IR::Instr *const instr, const bool needFlags) +{ + Assert(instr); + Assert(instr->GetDst()); + Assert(instr->GetSrc1()); + Assert(instr->GetSrc2()); + + if(instr->GetDst()->IsFloat64()) + { + Assert(instr->GetSrc1()->IsFloat64()); + Assert(instr->GetSrc2()->IsFloat64()); + Assert(!needFlags); + instr->m_opcode = Js::OpCode::FSUB; + return; + } + + instr->m_opcode = needFlags ? Js::OpCode::SUBS : Js::OpCode::SUB; +} + +void LowererMD::ChangeToShift(IR::Instr *const instr, const bool needFlags) +{ + Assert(instr); + Assert(instr->GetDst()); + Assert(instr->GetSrc1()); + Assert(instr->GetSrc2()); + + Func *const func = instr->m_func; + + switch(instr->m_opcode) + { + case Js::OpCode::Shl_A: + case Js::OpCode::Shl_I4: + Assert(!needFlags); // not implemented + instr->m_opcode = Js::OpCode::LSL; + break; + + case Js::OpCode::Shr_A: + case Js::OpCode::Shr_I4: + Assert(!needFlags); // not implemented + instr->m_opcode = Js::OpCode::ASR; + break; + + case Js::OpCode::ShrU_A: + case Js::OpCode::ShrU_I4: + Assert(!needFlags); // not implemented + instr->m_opcode = Js::OpCode::LSR; + break; + + default: + Assert(false); + __assume(false); + } + + // Javascript requires the ShiftCount is masked to the bottom 5 bits. + if(instr->GetSrc2()->IsIntConstOpnd()) + { + // In the constant case, do the mask manually. + IntConstType immed = instr->GetSrc2()->AsIntConstOpnd()->GetValue() & 0x1f; + if (immed == 0) + { + // Shift by zero is just a move, and the shift-right instructions + // don't permit encoding of a zero shift amount. + instr->m_opcode = Js::OpCode::MOV; + instr->FreeSrc2(); + } + else + { + instr->GetSrc2()->AsIntConstOpnd()->SetValue(immed); + } + } + else + { + // In the variable case, generate code to do the mask. + IR::Opnd *const src2 = instr->UnlinkSrc2(); + instr->SetSrc2(IR::RegOpnd::New(TyInt32, func)); + IR::Instr *const newInstr = IR::Instr::New( + Js::OpCode::AND, instr->GetSrc2(), src2, IR::IntConstOpnd::New(0x1f, TyInt8, func), func); + instr->InsertBefore(newInstr); + } +} + +const uint16 +LowererMD::GetFormalParamOffset() +{ + //In ARM formal params are offset into the param area. + //So we only count the non-user params (Function object & CallInfo and let the encoder account for the saved R11 and LR + return 2; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::LowerCondBranch +/// +///---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::LowerCondBranch(IR::Instr * instr) +{ + AssertMsg(instr->GetSrc1() != nullptr, "Expected src opnds on conditional branch"); + + IR::Opnd * opndSrc1 = instr->UnlinkSrc1(); + IR::Instr * instrPrev = nullptr; + + switch (instr->m_opcode) + { + case Js::OpCode::BrTrue_A: + case Js::OpCode::BrOnNotEmpty: + case Js::OpCode::BrNotNull_A: + case Js::OpCode::BrOnObject_A: + case Js::OpCode::BrOnClassConstructor: + case Js::OpCode::BrOnBaseConstructorKind: + Assert(!opndSrc1->IsFloat64()); + AssertMsg(opndSrc1->IsRegOpnd(),"NYI for other operands"); + AssertMsg(instr->GetSrc2() == nullptr, "Expected 1 src on boolean branch"); + instrPrev = IR::Instr::New(Js::OpCode::CMP, this->m_func); + instrPrev->SetSrc1(opndSrc1); + instrPrev->SetSrc2(IR::IntConstOpnd::New(0, TyInt32, m_func)); + instr->InsertBefore(instrPrev); + LegalizeMD::LegalizeInstr(instrPrev, false); + + instr->m_opcode = Js::OpCode::BNE; + + break; + case Js::OpCode::BrFalse_A: + case Js::OpCode::BrOnEmpty: + Assert(!opndSrc1->IsFloat64()); + AssertMsg(opndSrc1->IsRegOpnd(),"NYI for other operands"); + AssertMsg(instr->GetSrc2() == nullptr, "Expected 1 src on boolean branch"); + instrPrev = IR::Instr::New(Js::OpCode::CMP, this->m_func); + instrPrev->SetSrc1(opndSrc1); + instrPrev->SetSrc2(IR::IntConstOpnd::New(0, TyInt32, m_func)); + instr->InsertBefore(instrPrev); + LegalizeMD::LegalizeInstr(instrPrev, false); + + instr->m_opcode = Js::OpCode::BEQ; + + break; + + default: + IR::Opnd * opndSrc2 = instr->UnlinkSrc2(); + AssertMsg(opndSrc2 != nullptr, "Expected 2 src's on non-boolean branch"); + + if (opndSrc1->IsFloat64()) + { + AssertMsg(opndSrc1->IsRegOpnd(),"NYI for other operands"); + Assert(opndSrc2->IsFloat64()); + Assert(opndSrc2->IsRegOpnd() && opndSrc1->IsRegOpnd()); + //This comparison updates the FPSCR - floating point status control register + instrPrev = IR::Instr::New(Js::OpCode::FCMP, this->m_func); + instrPrev->SetSrc1(opndSrc1); + instrPrev->SetSrc2(opndSrc2); + instr->InsertBefore(instrPrev); + LegalizeMD::LegalizeInstr(instrPrev, false); + + instr->m_opcode = LowererMD::MDBranchOpcode(instr->m_opcode); + } + else + { + AssertMsg(opndSrc2->IsRegOpnd() || opndSrc2->IsIntConstOpnd() || (opndSrc2->IsAddrOpnd()), "NYI for other operands"); + + instrPrev = IR::Instr::New(Js::OpCode::CMP, this->m_func); + instrPrev->SetSrc1(opndSrc1); + instrPrev->SetSrc2(opndSrc2); + instr->InsertBefore(instrPrev); + + LegalizeMD::LegalizeInstr(instrPrev, false); + + instr->m_opcode = MDBranchOpcode(instr->m_opcode); + } + break; + } + return instr; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::ForceDstToReg +/// +///---------------------------------------------------------------------------- + +IR::Instr* +LowererMD::ForceDstToReg(IR::Instr *instr) +{ + IR::Opnd * dst = instr->GetDst(); + + if (dst->IsRegOpnd()) + { + return instr; + } + + IR::Instr * newInstr = instr->SinkDst(Js::OpCode::Ld_A); + LowererMD::ChangeToAssign(newInstr); + return newInstr; +} + +IR::Instr * +LowererMD::LoadFunctionObjectOpnd(IR::Instr *instr, IR::Opnd *&functionObjOpnd) +{ + IR::Opnd * src1 = instr->GetSrc1(); + IR::Instr * instrPrev = instr->m_prev; + if (src1 == nullptr) + { + IR::RegOpnd * regOpnd = IR::RegOpnd::New(TyMachPtr, m_func); + //function object is first argument and mark it as IsParamSlotSym. + StackSym *paramSym = GetImplicitParamSlotSym(0); + IR::SymOpnd *paramOpnd = IR::SymOpnd::New(paramSym, TyMachPtr, m_func); + + instrPrev = Lowerer::InsertMove(regOpnd, paramOpnd, instr); + functionObjOpnd = instrPrev->GetDst(); + } + else + { + // Inlinee LdHomeObj, use the function object opnd on the instruction + functionObjOpnd = instr->UnlinkSrc1(); + if (!functionObjOpnd->IsRegOpnd()) + { + Assert(functionObjOpnd->IsAddrOpnd()); + } + } + + return instrPrev; +} + +void +LowererMD::GenerateFastDivByPow2(IR::Instr *instrDiv) +{ + //// Given: + //// dst = Div_A src1, src2 + //// where src2 == power of 2 + //// + //// Generate: + //// (observation: positive q divides by p equally, where p = power of 2, if q's binary representation + //// has all zeroes to the right of p's power 2 bit, try to see if that is the case) + //// s1 = AND src1, 0x80000001 | ((src2Value - 1) << 1) + //// CMP s1, 1 + //// BNE $doesntDivideEqually + //// s1 = ASR src1, log2(src2Value) -- do the equal divide + //// dst = EOR s1, 1 -- restore tagged int bit + //// B $done + //// $doesntDivideEqually: + //// (now check if it divides with the remainder of 1, for which we can do integer divide and accommodate with +0.5 + //// note that we need only the part that is to the left of p's power 2 bit) + //// s1 = AND s1, 0x80000001 | (src2Value - 1) + //// CMP s1, 1 + //// BNE $helper + //// s1 = ASR src1, log2(src2Value) + 1 -- do the integer divide and also shift out the tagged int bit + //// PUSH 0xXXXXXXXX (ScriptContext) + //// PUSH s1 + //// dst = CALL Op_FinishOddDivByPow2 -- input: actual value, scriptContext; output: JavascriptNumber with 0.5 added to the input + //// JMP $done + //// $helper: + //// ... + //// $done: + + //if (instrDiv->GetSrc1()->IsRegOpnd() && instrDiv->GetSrc1()->AsRegOpnd()->m_sym->m_isNotInt) + //{ + // return; + //} + + //IR::Opnd *dst = instrDiv->GetDst(); + //IR::Opnd *src1 = instrDiv->GetSrc1(); + //IR::AddrOpnd *src2 = instrDiv->GetSrc2()->IsAddrOpnd() ? instrDiv->GetSrc2()->AsAddrOpnd() : nullptr; + //IR::LabelInstr *doesntDivideEqually = IR::LabelInstr::New(Js::OpCode::Label, m_func); + //IR::LabelInstr *helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); + //IR::LabelInstr *done = IR::LabelInstr::New(Js::OpCode::Label, m_func); + //IR::RegOpnd *s1 = IR::RegOpnd::New(TyVar, m_func); + //IR::Instr *instr; + + //Assert(src2 && src2->IsVar() && Js::TaggedInt::Is(src2->m_address) && (Math::IsPow2(Js::TaggedInt::ToInt32(src2->m_address)))); + //int32 src2Value = Js::TaggedInt::ToInt32(src2->m_address); + + //// s1 = AND src1, 0x80000001 | ((src2Value - 1) << 1) + //instr = IR::Instr::New(Js::OpCode::AND, s1, src1, IR::IntConstOpnd::New((0x80000001 | ((src2Value - 1) << 1)), TyInt32, m_func), m_func); + //instrDiv->InsertBefore(instr); + //LegalizeMD::LegalizeInstr(instr, false); + + //// CMP s1, 1 + //instr = IR::Instr::New(Js::OpCode::CMP, m_func); + //instr->SetSrc1(s1); + //instr->SetSrc2(IR::IntConstOpnd::New(1, TyInt32, m_func)); + //instrDiv->InsertBefore(instr); + + //// BNE $doesntDivideEqually + //instr = IR::BranchInstr::New(Js::OpCode::BNE, doesntDivideEqually, m_func); + //instrDiv->InsertBefore(instr); + + //// s1 = ASR src1, log2(src2Value) -- do the equal divide + //instr = IR::Instr::New(Js::OpCode::ASR, s1, src1, IR::IntConstOpnd::New(Math::Log2(src2Value), TyInt32, m_func), m_func); + //instrDiv->InsertBefore(instr); + //LegalizeMD::LegalizeInstr(instr, false); + + //// dst = ORR s1, 1 -- restore tagged int bit + //instr = IR::Instr::New(Js::OpCode::ORR, dst, s1, IR::IntConstOpnd::New(1, TyInt32, m_func), m_func); + //instrDiv->InsertBefore(instr); + //LegalizeMD::LegalizeInstr(instr, false); + // + //// B $done + //instr = IR::BranchInstr::New(Js::OpCode::B, done, m_func); + //instrDiv->InsertBefore(instr); + + //// $doesntDivideEqually: + //instrDiv->InsertBefore(doesntDivideEqually); + + //// s1 = AND s1, 0x80000001 | (src2Value - 1) + //instr = IR::Instr::New(Js::OpCode::AND, s1, s1, IR::IntConstOpnd::New((0x80000001 | (src2Value - 1)), TyInt32, m_func), m_func); + //instrDiv->InsertBefore(instr); + + //// CMP s1, 1 + //instr = IR::Instr::New(Js::OpCode::CMP, m_func); + //instr->SetSrc1(s1); + //instr->SetSrc2(IR::IntConstOpnd::New(1, TyInt32, m_func)); + //instrDiv->InsertBefore(instr); + + //// BNE $helper + //instrDiv->InsertBefore(IR::BranchInstr::New(Js::OpCode::BNE, helper, m_func)); + + //// s1 = ASR src1, log2(src2Value) + 1 -- do the integer divide and also shift out the tagged int bit + //instr = IR::Instr::New(Js::OpCode::ASR, s1, src1, IR::IntConstOpnd::New(Math::Log2(src2Value) + 1, TyInt32, m_func), m_func); + //instrDiv->InsertBefore(instr); + //LegalizeMD::LegalizeInstr(instr, false); + + //// Arg2: scriptContext + //IR::JnHelperMethod helperMethod; + //if (instrDiv->dstIsTempNumber) + //{ + // // Var JavascriptMath::FinishOddDivByPow2_InPlace(uint32 value, ScriptContext *scriptContext, __out JavascriptNumber* result) + // helperMethod = IR::HelperOp_FinishOddDivByPow2InPlace; + // Assert(dst->IsRegOpnd()); + // StackSym * tempNumberSym = this->m_lowerer->GetTempNumberSym(dst, instr->dstIsTempNumberTransferred); + + // instr = this->m_lowerer->InsertLoadStackAddress(tempNumberSym, instrDiv); + // LegalizeMD::LegalizeInstr(instr, false); + + // this->LoadHelperArgument(instrDiv, instr->GetDst()); + //} + //else + //{ + // // Var JavascriptMath::FinishOddDivByPow2(uint32 value, ScriptContext *scriptContext) + // helperMethod = IR::HelperOp_FinishOddDivByPow2; + //} + //this->m_lowerer->LoadScriptContext(instrDiv); + + //// Arg1: value + //this->LoadHelperArgument(instrDiv, s1); + + //// dst = CALL Op_FinishOddDivByPow2 -- input: actual value, output: JavascriptNumber with 0.5 added to the input + //instr = IR::Instr::New(Js::OpCode::Call, dst, IR::HelperCallOpnd::New(helperMethod, m_func), m_func); + //instrDiv->InsertBefore(instr); + //this->LowerCall(instr, 0); + + //// JMP $done + //instrDiv->InsertBefore(IR::BranchInstr::New(Js::OpCode::B, done, m_func)); + + //// $helper: + //instrDiv->InsertBefore(helper); + + //// $done: + //instrDiv->InsertAfter(done); + + return; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastCmSrEqConst +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastCmSrEqConst(IR::Instr *instr) +{ + // + // Given: + // s1 = CmSrEq_A s2, s3 + // where either s2 or s3 is 'null', 'true' or 'false' + // + // Generate: + // + // CMP s2, s3 + // JEQ $mov_true + // MOV s1, Library.GetFalse() + // JMP $done + // $mov_true: + // MOV s1, Library.GetTrue() + // $done: + // + + Assert(m_lowerer->IsConstRegOpnd(instr->GetSrc2()->AsRegOpnd())); + return false; +} + +bool LowererMD::GenerateFastCmXxI4(IR::Instr *instr) +{ + return this->GenerateFastCmXxTaggedInt(instr); +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastCmXxTaggedInt +/// +///---------------------------------------------------------------------------- +bool LowererMD::GenerateFastCmXxTaggedInt(IR::Instr *instr, bool isInHelper /* = false */) +{ + // The idea is to do an inline compare if we can prove that both sources + // are tagged ints (i.e., are vars with the low bit set). + // + // Given: + // + // Cmxx_A dst, src1, src2 + // + // Generate: + // + // (If not Int31's, goto $helper) + // LDIMM dst, trueResult + // CMP src1, src2 + // BEQ $fallthru + // LDIMM dst, falseResult + // B $fallthru + // $helper: + // (caller will generate normal helper call sequence) + // $fallthru: + IR::Opnd * src1 = instr->GetSrc1(); + IR::Opnd * src2 = instr->GetSrc2(); + IR::Opnd * dst = instr->GetDst(); + IR::LabelInstr * helper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); + IR::LabelInstr * fallthru = IR::LabelInstr::New(Js::OpCode::Label, m_func, isInHelper); + + Assert(src1 && src2 && dst); + + // Not tagged ints? + if (src1->IsRegOpnd() && src1->AsRegOpnd()->m_sym->m_isNotInt) + { + return false; + } + if (src2->IsRegOpnd() && src2->AsRegOpnd()->m_sym->m_isNotInt) + { + return false; + } + + Js::OpCode opcode = Js::OpCode::InvalidOpCode; + switch ( instr->m_opcode) + { + case Js::OpCode::CmEq_A: + case Js::OpCode::CmSrEq_A: + case Js::OpCode::CmEq_I4: + opcode = Js::OpCode::BEQ; + break; + + case Js::OpCode::CmNeq_A: + case Js::OpCode::CmSrNeq_A: + case Js::OpCode::CmNeq_I4: + opcode = Js::OpCode::BNE; + break; + + case Js::OpCode::CmGt_A: + case Js::OpCode::CmGt_I4: + opcode = Js::OpCode::BGT; + break; + + case Js::OpCode::CmGe_A: + case Js::OpCode::CmGe_I4: + opcode = Js::OpCode::BGE; + break; + + case Js::OpCode::CmLt_A: + case Js::OpCode::CmLt_I4: + opcode = Js::OpCode::BLT; + break; + + case Js::OpCode::CmLe_A: + case Js::OpCode::CmLe_I4: + opcode = Js::OpCode::BLE; + break; + + case Js::OpCode::CmUnGt_A: + case Js::OpCode::CmUnGt_I4: + opcode = Js::OpCode::BHI; + break; + + case Js::OpCode::CmUnGe_A: + case Js::OpCode::CmUnGe_I4: + opcode = Js::OpCode::BCS; + break; + + case Js::OpCode::CmUnLt_A: + case Js::OpCode::CmUnLt_I4: + opcode = Js::OpCode::BCC; + break; + + case Js::OpCode::CmUnLe_A: + case Js::OpCode::CmUnLe_I4: + opcode = Js::OpCode::BLS; + break; + + default: Assert(false); + } + + // Tagged ints? + bool isTaggedInts = false; + if (src1->IsTaggedInt() || src1->IsInt32()) + { + if (src2->IsTaggedInt() || src2->IsInt32()) + { + isTaggedInts = true; + } + } + + if (!isTaggedInts) + { + this->GenerateSmIntPairTest(instr, src1, src2, helper); + } + + if (dst->IsEqual(src1)) + { + IR::RegOpnd *newSrc1 = IR::RegOpnd::New(TyMachReg, m_func); + Lowerer::InsertMove(newSrc1, src1, instr); + src1 = newSrc1; + } + if (dst->IsEqual(src2)) + { + IR::RegOpnd *newSrc2 = IR::RegOpnd::New(TyMachReg, m_func); + Lowerer::InsertMove(newSrc2, src2, instr); + src2 = newSrc2; + } + + IR::Opnd *opndTrue, *opndFalse; + + if (dst->IsInt32()) + { + opndTrue = IR::IntConstOpnd::New(1, TyMachReg, this->m_func); + opndFalse = IR::IntConstOpnd::New(0, TyMachReg, this->m_func); + } + else + { + opndTrue = m_lowerer->LoadLibraryValueOpnd(instr, LibraryValue::ValueTrue); + opndFalse = m_lowerer->LoadLibraryValueOpnd(instr, LibraryValue::ValueFalse); + } + + // LDIMM dst, trueResult + // CMP src1, src2 + // BEQ $fallthru + // LDIMM dst, falseResult + // B $fallthru + + src1 = src1->UseWithNewType(TyInt32, m_func); + src2 = src2->UseWithNewType(TyInt32, m_func); + + instr->InsertBefore(IR::Instr::New(Js::OpCode::LDIMM, dst, opndTrue, m_func)); + IR::Instr *instrCmp = IR::Instr::New(Js::OpCode::CMP, m_func); + instrCmp->SetSrc1(src1); + instrCmp->SetSrc2(src2); + instr->InsertBefore(instrCmp); + LegalizeMD::LegalizeInstr(instrCmp,false); + + instr->InsertBefore(IR::BranchInstr::New(opcode, fallthru, m_func)); + instr->InsertBefore(IR::Instr::New(Js::OpCode::LDIMM, dst, opndFalse, m_func)); + + if (isTaggedInts) + { + instr->InsertAfter(fallthru); + instr->Remove(); + return true; + } + + // B $fallthru + instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::B, fallthru, m_func)); + + instr->InsertBefore(helper); + instr->InsertAfter(fallthru); + return false; +} + +IR::Instr * LowererMD::GenerateConvBool(IR::Instr *instr) +{ + // dst = LDIMM true + // TST src1, src2 + // BNE fallthrough + // dst = LDIMM false + // fallthrough: + + IR::RegOpnd *dst = instr->GetDst()->AsRegOpnd(); + IR::RegOpnd *src1 = instr->GetSrc1()->AsRegOpnd(); + IR::Opnd *opndTrue = m_lowerer->LoadLibraryValueOpnd(instr, LibraryValue::ValueTrue); + IR::Opnd *opndFalse = m_lowerer->LoadLibraryValueOpnd(instr, LibraryValue::ValueFalse); + IR::LabelInstr *fallthru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + + // dst = LDIMM true + IR::Instr *instrFirst = IR::Instr::New(Js::OpCode::LDIMM, dst, opndTrue, m_func); + instr->InsertBefore(instrFirst); + + // TST src1, src2 + IR::Instr *instrTst = IR::Instr::New(Js::OpCode::TST, m_func); + instrTst->SetSrc1(src1); + instrTst->SetSrc2(src1); + instr->InsertBefore(instrTst); + LegalizeMD::LegalizeInstr(instrTst, false); + + // BNE fallthrough + instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::BNE, fallthru, m_func)); + + // dst = LDIMM false + instr->InsertBefore(IR::Instr::New(Js::OpCode::LDIMM, dst, opndFalse, m_func)); + + // fallthrough: + instr->InsertAfter(fallthru); + instr->Remove(); + + return instrFirst; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastAdd +/// +/// NOTE: We assume that only the sum of two Int31's will have 0x2 set. This +/// is only true until we have a var type with tag == 0x2. +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastAdd(IR::Instr * instrAdd) +{ + // Given: + // + // dst = Add src1, src2 + // + // Generate: + // + // (If not 2 Int31's, jump to $helper.) + // s1 = MOV src1 + // s1 = ADDS s1, src2 -- try an inline add + // BVS $helper -- bail if the add overflowed + // s1 = ORR s1, AtomTag_IntPtr + // dst = MOV s1 + // B $fallthru + // $helper: + // (caller generates helper call) + // $fallthru: + + IR::Instr * instr; + IR::LabelInstr * labelHelper; + IR::LabelInstr * labelFallThru; + IR::Opnd * opndReg; + IR::Opnd * opndSrc1; + IR::Opnd * opndSrc2; + + opndSrc1 = instrAdd->GetSrc1(); + opndSrc2 = instrAdd->GetSrc2(); + AssertMsg(opndSrc1 && opndSrc2, "Expected 2 src opnd's on Add instruction"); + + // Generate fastpath for Incr_A anyway - + // Incrementing strings representing integers can be inter-mixed with integers e.g. "1"++ -> converts 1 to an int and thereafter, integer increment is expected. + if (opndSrc1->IsRegOpnd() && (opndSrc1->AsRegOpnd()->IsNotInt() || opndSrc1->GetValueType().IsString() + || (instrAdd->m_opcode != Js::OpCode::Incr_A && opndSrc1->GetValueType().IsLikelyString()))) + { + return false; + } + + if (opndSrc2->IsRegOpnd() && (opndSrc2->AsRegOpnd()->IsNotInt() || + opndSrc2->GetValueType().IsLikelyString())) + { + return false; + } + + // Tagged ints? + bool isTaggedInts = false; + if (opndSrc1->IsTaggedInt()) + { + if (opndSrc2->IsTaggedInt()) + { + isTaggedInts = true; + } + } + + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + + if (!isTaggedInts) + { + // (If not 2 Int31's, jump to $helper.) + + this->GenerateSmIntPairTest(instrAdd, opndSrc1, opndSrc2, labelHelper); + } + + if (opndSrc1->IsImmediateOpnd()) + { + // If opnd1 is a constant, just swap them. + IR::Opnd *opndTmp = opndSrc1; + opndSrc1 = opndSrc2; + opndSrc2 = opndTmp; + } + + // + // For 32 bit arithmetic we copy them and set the size of operands to be 32 bits. This is + // relevant only on ARM64. + // + + opndSrc1 = opndSrc1->UseWithNewType(TyInt32, this->m_func); + opndSrc2 = opndSrc2->UseWithNewType(TyInt32, this->m_func); + + // s1 = MOV src1 + + opndReg = IR::RegOpnd::New(TyInt32, this->m_func); + Lowerer::InsertMove(opndReg, opndSrc1, instrAdd); + + // s1 = ADDS s1, src2 + + instr = IR::Instr::New(Js::OpCode::ADDS, opndReg, opndReg, opndSrc2, this->m_func); + instrAdd->InsertBefore(instr); + Legalize(instr); + + // BVS $helper + + instr = IR::BranchInstr::New(Js::OpCode::BVS, labelHelper, this->m_func); + instrAdd->InsertBefore(instr); + + // + // Convert TyInt32 operand, back to TyMachPtr type. + // + + if(TyMachReg != opndReg->GetType()) + { + opndReg = opndReg->UseWithNewType(TyMachPtr, this->m_func); + } + + // s1 = ORR s1, AtomTag_IntPtr + GenerateInt32ToVarConversion(opndReg, instrAdd); + + // dst = MOV s1 + + instr = IR::Instr::New(Js::OpCode::MOV, instrAdd->GetDst(), opndReg, this->m_func); + instrAdd->InsertBefore(instr); + + // B $fallthru + + labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, this->m_func); + instrAdd->InsertBefore(instr); + + // $helper: + // (caller generates helper call) + // $fallthru: + + instrAdd->InsertBefore(labelHelper); + instrAdd->InsertAfter(labelFallThru); + + return true; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastSub +/// +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastSub(IR::Instr * instrSub) +{ + // Given: + // + // dst = Sub src1, src2 + // + // Generate: + // + // (If not 2 Int31's, jump to $helper.) + // s1 = MOV src1 + // s1 = SUBS s1, src2 -- try an inline sub + // BVS $helper -- bail if the subtract overflowed + // BNE $helper + // s1 = ORR s1, AtomTag_IntPtr + // dst = MOV s1 + // B $fallthru + // $helper: + // (caller generates helper call) + // $fallthru: + + IR::Instr * instr; + IR::LabelInstr * labelHelper; + IR::LabelInstr * labelFallThru; + IR::Opnd * opndReg; + IR::Opnd * opndSrc1; + IR::Opnd * opndSrc2; + + opndSrc1 = instrSub->GetSrc1(); + opndSrc2 = instrSub->GetSrc2(); + AssertMsg(opndSrc1 && opndSrc2, "Expected 2 src opnd's on Sub instruction"); + + // Not tagged ints? + if (opndSrc1->IsRegOpnd() && opndSrc1->AsRegOpnd()->IsNotInt()) + { + return false; + } + if (opndSrc2->IsRegOpnd() && opndSrc2->AsRegOpnd()->IsNotInt()) + { + return false; + } + + // Tagged ints? + bool isTaggedInts = false; + if (opndSrc1->IsTaggedInt()) + { + if (opndSrc2->IsTaggedInt()) + { + isTaggedInts = true; + } + } + + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + + if (!isTaggedInts) + { + // (If not 2 Int31's, jump to $helper.) + + this->GenerateSmIntPairTest(instrSub, opndSrc1, opndSrc2, labelHelper); + } + + // + // For 32 bit arithmetic we copy them and set the size of operands to be 32 bits. This is + // relevant only on ARM64. + // + + opndSrc1 = opndSrc1->UseWithNewType(TyInt32, this->m_func); + opndSrc2 = opndSrc2->UseWithNewType(TyInt32, this->m_func); + + // s1 = MOV src1 + + opndReg = IR::RegOpnd::New(TyInt32, this->m_func); + Lowerer::InsertMove(opndReg, opndSrc1, instrSub); + + // s1 = SUBS s1, src2 + + instr = IR::Instr::New(Js::OpCode::SUBS, opndReg, opndReg, opndSrc2, this->m_func); + instrSub->InsertBefore(instr); + Legalize(instr); + + // BVS $helper + + instr = IR::BranchInstr::New(Js::OpCode::BVS, labelHelper, this->m_func); + instrSub->InsertBefore(instr); + + // + // Convert TyInt32 operand, back to TyMachPtr type. + // + + if(TyMachReg != opndReg->GetType()) + { + opndReg = opndReg->UseWithNewType(TyMachPtr, this->m_func); + } + + // s1 = ORR s1, AtomTag_IntPtr + GenerateInt32ToVarConversion(opndReg, instrSub); + + // dst = MOV s1 + + instr = IR::Instr::New(Js::OpCode::MOV, instrSub->GetDst(), opndReg, this->m_func); + instrSub->InsertBefore(instr); + + // B $fallthru + + labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, this->m_func); + instrSub->InsertBefore(instr); + + // $helper: + // (caller generates helper call) + // $fallthru: + + instrSub->InsertBefore(labelHelper); + instrSub->InsertAfter(labelFallThru); + + return true; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastMul +/// +///---------------------------------------------------------------------------- +bool +LowererMD::GenerateFastMul(IR::Instr * instrMul) +{ + // Given: + // + // dst = Mul src1, src2 + // + // Generate: + // + // (If not 2 Int31's, jump to $helper.) + // s1 = MOV src1 + // s2 = MOV src2 + // s3 = SMULL s1, s2 -- do the signed mul + // CMP s3, s3 SXTW + // BNE $helper -- bail if the result overflowed + // CBZ s3, $zero -- Check result is 0. might be -0. Result is -0 when a negative number is multiplied with 0. + // B $nonzero + // $zero: -- result of mul was 0. try to check for -0 + // s2 = ADDS s2, src1 --check for same sign + // BGE $nonzero - positive 0 if signs are equal + // dst = ToVar(-0.0) -- load negative 0 + // B $fallthru + // $nonzero: + // s3 = ORR s3, AtomTag_IntPtr + // dst= MOV s3 + // B $fallthru + // $helper: + // (caller generates helper call) + // $fallthru: + + IR::LabelInstr * labelHelper; + IR::LabelInstr * labelFallThru; + IR::LabelInstr * labelNonZero; + IR::Instr * instr; + IR::RegOpnd * opndReg1; + IR::RegOpnd * opndReg2; + IR::RegOpnd * s3; + IR::Opnd * opndSrc1; + IR::Opnd * opndSrc2; + + opndSrc1 = instrMul->GetSrc1(); + opndSrc2 = instrMul->GetSrc2(); + AssertMsg(opndSrc1 && opndSrc2, "Expected 2 src opnd's on mul instruction"); + + if (opndSrc1->IsRegOpnd() && opndSrc1->AsRegOpnd()->IsNotInt()) + { + return true; + } + if (opndSrc2->IsRegOpnd() && opndSrc2->AsRegOpnd()->IsNotInt()) + { + return true; + } + // (If not 2 Int31's, jump to $helper.) + + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + labelNonZero = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + + this->GenerateSmIntPairTest(instrMul, opndSrc1, opndSrc2, labelHelper); + + // + // For 32 bit arithmetic we copy them and set the size of operands to be 32 bits. This is + // relevant only on ARM64. + // + + opndSrc1 = opndSrc1->UseWithNewType(TyInt32, this->m_func); + opndSrc2 = opndSrc2->UseWithNewType(TyInt32, this->m_func); + + if (opndSrc1->IsImmediateOpnd()) + { + IR::Opnd * temp = opndSrc1; + opndSrc1 = opndSrc2; + opndSrc2 = temp; + } + + // s1 = MOV src1 + + opndReg1 = IR::RegOpnd::New(TyInt32, this->m_func); + Lowerer::InsertMove(opndReg1, opndSrc1, instrMul); + + // s2 = MOV src2 + + opndReg2 = IR::RegOpnd::New(TyInt32, this->m_func); + Lowerer::InsertMove(opndReg2, opndSrc2, instrMul); + + // s3 = SMULL s1, s2 + + s3 = IR::RegOpnd::New(TyInt64, this->m_func); + instr = IR::Instr::New(Js::OpCode::SMULL, s3, opndReg1, opndReg2, this->m_func); + instrMul->InsertBefore(instr); + + // CMP s3, s3 SXTW s3 + + instr = IR::Instr::New(Js::OpCode::CMP_SXTW, this->m_func); + instr->SetSrc1(s3); + instr->SetSrc2(s3); + instrMul->InsertBefore(instr); + + // BNE $helper + + instr = IR::BranchInstr::New(Js::OpCode::BNE, labelHelper, this->m_func); + instrMul->InsertBefore(instr); + + // CBZ s3, $zero -- Check result is 0. might be -0. Result is -0 when a negative number is multiplied with 0. + + IR::LabelInstr *labelZero = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + instr = IR::BranchInstr::New(Js::OpCode::CBZ, labelZero, this->m_func); + instr->SetSrc1(s3); + instrMul->InsertBefore(instr); + + // B $nonzero + + instr = IR::BranchInstr::New(Js::OpCode::B, labelNonZero, this->m_func); + instrMul->InsertBefore(instr); + + // $zero: + + instrMul->InsertBefore(labelZero); + + // s2 = ADDS s2, s1 + + instr = IR::Instr::New(Js::OpCode::ADDS, opndReg2, opndReg2, opndReg1, this->m_func); + instrMul->InsertBefore(instr); + Legalize(instr); + + // BGE $nonzero + instr = IR::BranchInstr::New(Js::OpCode::BGE, labelNonZero, this->m_func); + instrMul->InsertBefore(instr); + + // dst = ToVar(-0.0) -- load negative 0 + + instr = IR::Instr::New(Js::OpCode::LDIMM, instrMul->GetDst(), m_lowerer->LoadLibraryValueOpnd(instrMul, LibraryValue::ValueNegativeZero), this->m_func); + instrMul->InsertBefore(instr); + + // B $fallthru + + instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, this->m_func); + instrMul->InsertBefore(instr); + + // $nonzero: + + instrMul->InsertBefore(labelNonZero); + + // dst = MOV_TRUNC s3 + + instr = IR::Instr::New(Js::OpCode::MOV_TRUNC, instrMul->GetDst()->UseWithNewType(TyInt32,this->m_func), s3->UseWithNewType(TyInt32, this->m_func), this->m_func); + instrMul->InsertBefore(instr); + + // dst = OR dst, AtomTag_IntPtr + + GenerateInt32ToVarConversion(instrMul->GetDst(), instrMul); + + + // B $fallthru + + instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, this->m_func); + instrMul->InsertBefore(instr); + + // $helper: + // (caller generates helper call) + // $fallthru: + + instrMul->InsertBefore(labelHelper); + instrMul->InsertAfter(labelFallThru); + + return true; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastAnd +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastAnd(IR::Instr * instrAnd) +{ + // Left empty to match AMD64; assuming this is not performance critical + return true; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastOr +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastOr(IR::Instr * instrOr) +{ + // Left empty to match AMD64; assuming this is not performance critical + return true; +} + + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastXor +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastXor(IR::Instr * instrXor) +{ + // Left empty to match AMD64; assuming this is not performance critical + return true; +} + +//---------------------------------------------------------------------------- +// +// LowererMD::GenerateFastNot +// +//---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastNot(IR::Instr * instrNot) +{ + // Left empty to match AMD64; assuming this is not performance critical + return true; +} + +// +// If value is zero in tagged int representation, jump to $labelHelper. +// +void +LowererMD::GenerateTaggedZeroTest( IR::Opnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr * labelHelper ) +{ + // Cast the var to 32 bit integer. + if(opndSrc->GetSize() != 4) + { + opndSrc = opndSrc->UseWithNewType(TyUint32, this->m_func); + } + AssertMsg(TySize[opndSrc->GetType()] == 4, "This technique works only on the 32-bit version"); + + if(labelHelper != nullptr) + { + // CBZ src1, $labelHelper + IR::Instr* instr = IR::BranchInstr::New(Js::OpCode::CBZ, labelHelper, this->m_func); + instr->SetSrc1(opndSrc); + insertInstr->InsertBefore(instr); + } + else + { + // TST src1, src1 + IR::Instr* instr = IR::Instr::New(Js::OpCode::TST, this->m_func); + instr->SetSrc1(opndSrc); + instr->SetSrc2(opndSrc); + insertInstr->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + } +} + +bool +LowererMD::GenerateFastNeg(IR::Instr * instrNeg) +{ + // Given: + // + // dst = Not src + // + // Generate: + // + // if not int, jump $helper + // if src == 0 -- test for zero (must be handled by the runtime to preserve + // BEQ $helper -- Difference between +0 and -0) + // dst = SUB dst, 0, src -- do an inline NEG + // BVS $helper -- bail if the subtract overflowed + // dst = OR dst, tag -- restore the var tag on the result + // BVS $helper + // B $fallthru + // $helper: + // (caller generates helper call) + // $fallthru: + + IR::Instr * instr; + IR::LabelInstr * labelHelper = nullptr; + IR::LabelInstr * labelFallThru = nullptr; + IR::Opnd * opndSrc1; + IR::Opnd * opndDst; + bool usingNewDst = false; + opndSrc1 = instrNeg->GetSrc1(); + AssertMsg(opndSrc1, "Expected src opnd on Neg instruction"); + + + if (opndSrc1->IsRegOpnd() && opndSrc1->AsRegOpnd()->m_sym->IsIntConst()) + { + IR::Opnd *newOpnd; + IntConstType value = opndSrc1->AsRegOpnd()->m_sym->GetIntConstValue(); + + if (value == 0) + { + // If the negate operand is zero, the result is -0.0, which is a Number rather than an Int31. + newOpnd = m_lowerer->LoadLibraryValueOpnd(instrNeg, LibraryValue::ValueNegativeZero); + } + else + { + // negation below can overflow because max negative int32 value > max positive value by 1. + newOpnd = IR::AddrOpnd::NewFromNumber(-(int64)value, m_func); + } + + instrNeg->ClearBailOutInfo(); + instrNeg->FreeSrc1(); + instrNeg->SetSrc1(newOpnd); + instrNeg = this->ChangeToAssign(instrNeg); + + // Skip lowering call to helper + return false; + } + + bool isInt = (opndSrc1->IsTaggedInt()); + + if (opndSrc1->IsRegOpnd() && opndSrc1->AsRegOpnd()->IsNotInt()) + { + return true; + } + + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + if (!isInt) + { + GenerateSmIntTest(opndSrc1, instrNeg, labelHelper); + } + + // For 32 bit arithmetic we copy them and set the size of operands to be 32 bits. + opndSrc1 = opndSrc1->UseWithNewType(TyInt32, this->m_func); + GenerateTaggedZeroTest(opndSrc1, instrNeg, labelHelper); + + if (opndSrc1->IsEqual(instrNeg->GetDst())) + { + usingNewDst = true; + opndDst = IR::RegOpnd::New(TyInt32, this->m_func); + } + else + { + opndDst = instrNeg->GetDst()->UseWithNewType(TyInt32, this->m_func); + } + + // dst = SUBS zr, src + + instr = IR::Instr::New(Js::OpCode::SUBS, opndDst, IR::RegOpnd::New(nullptr, RegZR, TyInt32, this->m_func), opndSrc1, this->m_func); + instrNeg->InsertBefore(instr); + + // BVS $helper + + instr = IR::BranchInstr::New(Js::OpCode::BVS, labelHelper, this->m_func); + instrNeg->InsertBefore(instr); + + // + // Convert TyInt32 operand, back to TyMachPtr type. + // + if (TyMachReg != opndDst->GetType()) + { + opndDst = opndDst->UseWithNewType(TyMachPtr, this->m_func); + } + + GenerateInt32ToVarConversion(opndDst, instrNeg); + + if (usingNewDst) + { + Lowerer::InsertMove(instrNeg->GetDst(), opndDst, instrNeg); + } + + // B $fallthru + + labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, this->m_func); + instrNeg->InsertBefore(instr); + + // $helper: + // (caller generates helper sequence) + // $fallthru: + + AssertMsg(labelHelper, "Should not be NULL"); + instrNeg->InsertBefore(labelHelper); + instrNeg->InsertAfter(labelFallThru); + + return true; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastShiftLeft +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastShiftLeft(IR::Instr * instrShift) +{ + // Left empty to match AMD64; assuming this is not performance critical + return true; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastShiftRight +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastShiftRight(IR::Instr * instrShift) +{ + // Given: + // + // dst = Shr/ShrU src1, src2 + // + // Generate: + // + // (If not 2 Int31's, jump to $helper.) + // s1 = MOV src1 + // s2 = MOV src2 + // AND s2, 0x1F [unsigned only] // Bail if unsigned and not shifting, + // BEQ $helper [unsigned only] // as we may not end up with a taggable int + // s1 = ASR/LSR s1, s2 + // ORR s1, 1 << VarTag_Shift + //dst = MOV s1 + // B $fallthru + // $helper: + // (caller generates helper call) + // $fallthru: + + IR::Instr * instr; + IR::LabelInstr * labelHelper; + IR::LabelInstr * labelFallThru; + IR::Opnd * opndReg; + IR::Opnd * opndSrc1; + IR::Opnd * opndSrc2; + Assert(instrShift->m_opcode == Js::OpCode::ShrU_A || instrShift->m_opcode == Js::OpCode::Shr_A); + bool isUnsigned = (instrShift->m_opcode == Js::OpCode::ShrU_A); + + opndSrc1 = instrShift->GetSrc1(); + opndSrc2 = instrShift->GetSrc2(); + AssertMsg(opndSrc1 && opndSrc2, "Expected 2 src opnd's on Add instruction"); + + // Not int? + if (opndSrc1->IsRegOpnd() && opndSrc1->AsRegOpnd()->IsNotInt()) + { + return true; + } + if (opndSrc2->IsRegOpnd() && opndSrc2->AsRegOpnd()->IsNotInt()) + { + return true; + } + + // Tagged ints? + bool isTaggedInts = false; + if (opndSrc1->IsTaggedInt()) + { + if (opndSrc2->IsTaggedInt()) + { + isTaggedInts = true; + } + } + + IntConstType s2Value = 0; + bool src2IsIntConst = false; + + if (isUnsigned) + { + if (opndSrc2->IsRegOpnd()) + { + src2IsIntConst = opndSrc2->AsRegOpnd()->m_sym->IsTaggableIntConst(); + if (src2IsIntConst) + { + s2Value = opndSrc2->AsRegOpnd()->m_sym->GetIntConstValue(); + } + } + else + { + AssertMsg(opndSrc2->IsAddrOpnd() && Js::TaggedInt::Is(opndSrc2->AsAddrOpnd()->m_address), + "Expect src2 of shift right to be reg or Var."); + src2IsIntConst = true; + s2Value = Js::TaggedInt::ToInt32(opndSrc2->AsAddrOpnd()->m_address); + } + + // 32-bit Shifts only uses the bottom 5 bits. + s2Value &= 0x1F; + + // Unsigned shift by 0 could yield a value not encodable as a tagged int. + if (isUnsigned && src2IsIntConst && s2Value == 0) + { + return true; + } + } + + + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + + if (!isTaggedInts) + { + // (If not 2 Int31's, jump to $helper.) + + this->GenerateSmIntPairTest(instrShift, opndSrc1, opndSrc2, labelHelper); + } + + opndSrc1 = opndSrc1->UseWithNewType(TyInt32, this->m_func); + if (src2IsIntConst) + { + opndSrc2 = IR::IntConstOpnd::New(s2Value, TyInt32, this->m_func); + } + else + { + // s2 = MOV src2 + opndReg = IR::RegOpnd::New(TyInt32, this->m_func); + Lowerer::InsertMove(opndReg, opndSrc2, instrShift); + opndSrc2 = opndReg; + } + + if (!src2IsIntConst && isUnsigned) + { + // s2 = AND s2, 0x1F [unsigned only] // Bail if unsigned and not shifting, + instr = IR::Instr::New(Js::OpCode::AND, opndSrc2, opndSrc2, IR::IntConstOpnd::New(0x1F, TyInt32, this->m_func), this->m_func); + instrShift->InsertBefore(instr); + + // CBZ s2, $helper [unsigned only] // as we may not end up with a taggable int + instr = IR::BranchInstr::New(Js::OpCode::CBZ, labelHelper, this->m_func); + instr->SetSrc1(opndSrc2); + instrShift->InsertBefore(instr); + } + + // s1 = MOV src1 + opndReg = IR::RegOpnd::New(TyInt32, this->m_func); + Lowerer::InsertMove(opndReg, opndSrc1, instrShift); + + // s1 = ASR/LSR s1, RCX + instr = IR::Instr::New(isUnsigned ? Js::OpCode::LSR : Js::OpCode::ASR, opndReg, opndReg, opndSrc2, this->m_func); + instrShift->InsertBefore(instr); + + // + // Convert TyInt32 operand, back to TyMachPtr type. + // + + if(TyMachReg != opndReg->GetType()) + { + opndReg = opndReg->UseWithNewType(TyMachPtr, this->m_func); + } + + // ORR s1, 1 << VarTag_Shift + this->GenerateInt32ToVarConversion(opndReg, instrShift); + + // dst = MOV s1 + + instr = IR::Instr::New(Js::OpCode::MOV, instrShift->GetDst(), opndReg, this->m_func); + instrShift->InsertBefore(instr); + + // B $fallthru + + labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, this->m_func); + instrShift->InsertBefore(instr); + + // $helper: + // (caller generates helper call) + // $fallthru: + + instrShift->InsertBefore(labelHelper); + instrShift->InsertAfter(labelFallThru); + + return true; +} + +void +LowererMD::GenerateFastBrS(IR::BranchInstr *brInstr) +{ + IR::Opnd *src1 = brInstr->UnlinkSrc1(); + + Assert(src1->IsIntConstOpnd() || src1->IsAddrOpnd() || src1->IsRegOpnd()); + + m_lowerer->InsertTest( + m_lowerer->LoadOptimizationOverridesValueOpnd( + brInstr, OptimizationOverridesValue::OptimizationOverridesSideEffects), + src1, + brInstr); + + Js::OpCode opcode; + + switch(brInstr->m_opcode) + { + case Js::OpCode::BrHasSideEffects: + opcode = Js::OpCode::BNE; + break; + + case Js::OpCode::BrNotHasSideEffects: + opcode = Js::OpCode::BEQ; + break; + + default: + Assert(UNREACHED); + __assume(false); + } + + brInstr->m_opcode = opcode; +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateSmIntPairTest +/// +/// Generate code to test whether the given operands are both Int31 vars +/// and branch to the given label if not. +/// +///---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::GenerateSmIntPairTest( + IR::Instr * instrInsert, + IR::Opnd * opndSrc1, + IR::Opnd * opndSrc2, + IR::LabelInstr * labelFail) +{ + IR::Opnd * opndReg; + IR::Instr * instrPrev = instrInsert->m_prev; + IR::Instr * instr; + + Assert(opndSrc1->GetType() == TyVar); + Assert(opndSrc2->GetType() == TyVar); + + if (opndSrc1->IsTaggedInt()) + { + IR::Opnd *tempOpnd = opndSrc1; + opndSrc1 = opndSrc2; + opndSrc2 = tempOpnd; + } + + if (opndSrc2->IsTaggedInt()) + { + if (opndSrc1->IsTaggedInt()) + { + return instrPrev; + } + + GenerateSmIntTest(opndSrc1, instrInsert, labelFail); + return instrPrev; + } + + opndReg = IR::RegOpnd::New(TyMachReg, this->m_func); + + // s1 = MOV src1 + // s1 = UBFX s1, VarTagShift - 16, 64 - (VarTag_Shift - 16) + // s2 = MOV src2 + // s1 = BFXIL s2, VarTagShift, 64 - VarTag_Shift + // s1 = EOR s1, AtomTag_Pair ------ compare the tags together to the expected tag pair + // CBNZ s1, $fail + + // s1 = MOV src1 + + instr = IR::Instr::New(Js::OpCode::MOV, opndReg, opndSrc1, this->m_func); + instrInsert->InsertBefore(instr); + + // s1 = UBFX s1, VarTagShift - 16, 64 - (VarTag_Shift - 16) + + instr = IR::Instr::New(Js::OpCode::UBFX, opndReg, opndReg, IR::IntConstOpnd::New(BITFIELD(Js::VarTag_Shift - 16, 64 - (Js::VarTag_Shift - 16)), TyMachReg, this->m_func), this->m_func); + instrInsert->InsertBefore(instr); + + // s2 = MOV src2 + + IR::Opnd * opndReg1 = IR::RegOpnd::New(TyMachReg, this->m_func); + instr = IR::Instr::New(Js::OpCode::MOV, opndReg1, opndSrc2, this->m_func); + instrInsert->InsertBefore(instr); + + // s1 = BFXIL s2, VarTagShift, 64 - VarTag_Shift + + instr = IR::Instr::New(Js::OpCode::BFXIL, opndReg, opndReg1, IR::IntConstOpnd::New(BITFIELD(Js::VarTag_Shift, 64 - Js::VarTag_Shift), TyMachReg, this->m_func), this->m_func); + instrInsert->InsertBefore(instr); + + opndReg = opndReg->UseWithNewType(TyInt32, this->m_func)->AsRegOpnd(); + + // s1 = EOR s1, AtomTag_Pair + instr = IR::Instr::New(Js::OpCode::EOR, opndReg, opndReg, IR::IntConstOpnd::New(Js::AtomTag_Pair, TyInt32, this->m_func, true), this->m_func); + instrInsert->InsertBefore(instr); + + // CBNZ s1, $fail + instr = IR::BranchInstr::New(Js::OpCode::CBNZ, labelFail, this->m_func); + instr->SetSrc1(opndReg); + instrInsert->InsertBefore(instr); + + return instrPrev; +} + +bool LowererMD::GenerateObjectTest(IR::Opnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel) +{ + AssertMsg(opndSrc->GetSize() == MachPtr, "64-bit register required"); + + if (opndSrc->IsTaggedValue() && fContinueLabel) + { + // Insert delete branch opcode to tell the dbChecks not to assert on the helper label we may fall through into + IR::Instr *fakeBr = IR::PragmaInstr::New(Js::OpCode::DeletedNonHelperBranch, 0, this->m_func); + insertInstr->InsertBefore(fakeBr); + + return false; + } + else if (opndSrc->IsNotTaggedValue() && !fContinueLabel) + { + return false; + } + + IR::Opnd * opndReg = IR::RegOpnd::New(TyMachReg, this->m_func); + + // s1 = MOV src1 - Move to a temporary + IR::Instr * instr = IR::Instr::New(Js::OpCode::MOV, opndReg, opndSrc, this->m_func); + insertInstr->InsertBefore(instr); + + // s1 = UBFX s1, s1, #VarTag_Shift, #64 - VarTag_Shift + instr = IR::Instr::New(Js::OpCode::UBFX, opndReg, opndReg, IR::IntConstOpnd::New(BITFIELD(Js::VarTag_Shift, 64 - Js::VarTag_Shift), TyMachReg, this->m_func), this->m_func); + insertInstr->InsertBefore(instr); + + if (fContinueLabel) + { + // CBZ s1, $labelHelper + instr = IR::BranchInstr::New(Js::OpCode::CBZ, labelTarget, this->m_func); + instr->SetSrc1(opndReg); + insertInstr->InsertBefore(instr); + IR::LabelInstr *labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + insertInstr->InsertBefore(labelHelper); + } + else + { + // CBNZ s1, $labelHelper + instr = IR::BranchInstr::New(Js::OpCode::CBNZ, labelTarget, this->m_func); + instr->SetSrc1(opndReg); + insertInstr->InsertBefore(instr); + } + return true; +} + +void +LowererMD::GenerateLoadTaggedType(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndTaggedType) +{ + // taggedType = OR type, InlineCacheAuxSlotTypeTag + IR::IntConstOpnd * opndAuxSlotTag = IR::IntConstOpnd::New(InlineCacheAuxSlotTypeTag, TyInt8, instrLdSt->m_func); + IR::Instr * instr = IR::Instr::New(Js::OpCode::ORR, opndTaggedType, opndType, opndAuxSlotTag, instrLdSt->m_func); + instrLdSt->InsertBefore(instr); +} + +void +LowererMD::GenerateLoadPolymorphicInlineCacheSlot(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::RegOpnd * opndType, uint polymorphicInlineCacheSize) +{ + // Generate + // + // LDR r1, type + // LSR r1, r1, #PolymorphicInlineCacheShift + // AND r1, r1, #(size - 1) + // LSL r1, r1, #log2(sizeof(Js::InlineCache)) + // ADD inlineCache, inlineCache, r1 + + // MOV r1, type + IR::RegOpnd * opndOffset = IR::RegOpnd::New(TyMachPtr, instrLdSt->m_func); + IR::Instr * instr = IR::Instr::New(Js::OpCode::MOV, opndOffset, opndType, instrLdSt->m_func); + instrLdSt->InsertBefore(instr); + + IntConstType rightShiftAmount = PolymorphicInlineCacheShift; + IntConstType leftShiftAmount = Math::Log2(sizeof(Js::InlineCache)); + // instead of generating + // LSR r1, r1, #PolymorphicInlineCacheShift + // AND r1, r1, #(size - 1) + // LSL r1, r1, #log2(sizeof(Js::InlineCache)) + // + // we can generate: + // LSR r1, r1, #(PolymorphicInlineCacheShift - log2(sizeof(Js::InlineCache)) + // AND r1, r1, #(size - 1) << log2(sizeof(Js::InlineCache)) + Assert(rightShiftAmount > leftShiftAmount); + instr = IR::Instr::New(Js::OpCode::LSR, opndOffset, opndOffset, IR::IntConstOpnd::New(rightShiftAmount - leftShiftAmount, TyUint8, instrLdSt->m_func, true), instrLdSt->m_func); + instrLdSt->InsertBefore(instr); + Lowerer::InsertAnd(opndOffset, opndOffset, IR::IntConstOpnd::New(((IntConstType)(polymorphicInlineCacheSize - 1)) << leftShiftAmount, TyMachPtr, instrLdSt->m_func, true), instrLdSt); + + // ADD inlineCache, inlineCache, r1 + Lowerer::InsertAdd(false, opndInlineCache, opndInlineCache, opndOffset, instrLdSt); +} + +///---------------------------------------------------------------------------- +/// +/// LowererMD::GenerateFastLdMethodFromFlags +/// +/// Make use of the helper to cache the type and slot index used to do a LdFld +/// and do an inline load from the appropriate slot if the type hasn't changed +/// since the last time this LdFld was executed. +/// +///---------------------------------------------------------------------------- + +bool +LowererMD::GenerateFastLdMethodFromFlags(IR::Instr * instrLdFld) +{ + IR::LabelInstr * labelFallThru; + IR::LabelInstr * bailOutLabel; + IR::Opnd * opndSrc; + IR::Opnd * opndDst; + IR::RegOpnd * opndBase; + IR::RegOpnd * opndType; + IR::RegOpnd * opndInlineCache; + intptr_t inlineCache; + + opndSrc = instrLdFld->GetSrc1(); + + AssertMsg(opndSrc->IsSymOpnd() && opndSrc->AsSymOpnd()->IsPropertySymOpnd() && opndSrc->AsSymOpnd()->m_sym->IsPropertySym(), + "Expected property sym operand as src of LdFldFlags"); + + IR::PropertySymOpnd * propertySymOpnd = opndSrc->AsPropertySymOpnd(); + + Assert(propertySymOpnd->m_runtimeInlineCache); + + Assert(!instrLdFld->DoStackArgsOpt(this->m_func)); + + // TODO: LdMethodFromFlags doesn't participate in object type specialization. We should be using a temporary + // register without a type sym here. + if (propertySymOpnd->IsTypeCheckSeqCandidate()) + { + AssertMsg(propertySymOpnd->HasObjectTypeSym(), "Type optimized property sym operand without a type sym?"); + StackSym *typeSym = propertySymOpnd->GetObjectTypeSym(); + opndType = IR::RegOpnd::New(typeSym, TyMachReg, this->m_func); + } + else + { + opndType = IR::RegOpnd::New(TyMachReg, this->m_func); + } + + opndBase = propertySymOpnd->CreatePropertyOwnerOpnd(m_func); + opndDst = instrLdFld->GetDst(); + + inlineCache = propertySymOpnd->m_runtimeInlineCache; + Assert(inlineCache != 0); + + opndInlineCache = IR::RegOpnd::New(TyMachReg, this->m_func); + + labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + // Label to jump to (or fall through to) when bailing out + bailOutLabel = IR::LabelInstr::New(Js::OpCode::Label, instrLdFld->m_func, true /* isOpHelper */); + + Lowerer::InsertMove(opndInlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrLdFld, propertySymOpnd), instrLdFld); + IR::LabelInstr * labelFlagAux = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + // Check the flag cache with the untagged type + this->m_lowerer->GenerateObjectTestAndTypeLoad(instrLdFld, opndBase, opndType, bailOutLabel); + //Blindly do the check for getter flag first and then do the type check + //We avoid repeated check for getter flag when the function object may be in either + //inline slots or auxiliary slots + this->m_lowerer->GenerateFlagInlineCacheCheckForGetterSetter(instrLdFld, opndInlineCache, bailOutLabel); + this->m_lowerer->GenerateFlagInlineCacheCheck(instrLdFld, opndType, opndInlineCache, labelFlagAux); + this->m_lowerer->GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, true); + + // Check the flag cache with the tagged type + instrLdFld->InsertBefore(labelFlagAux); + IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); + GenerateLoadTaggedType(instrLdFld, opndType, opndTaggedType); + this->m_lowerer->GenerateFlagInlineCacheCheck(instrLdFld, opndTaggedType, opndInlineCache, bailOutLabel); + this->m_lowerer->GenerateLdFldFromFlagInlineCache(instrLdFld, opndBase, opndDst, opndInlineCache, labelFallThru, false); + + instrLdFld->InsertBefore(bailOutLabel); + instrLdFld->InsertAfter(labelFallThru); + instrLdFld->UnlinkSrc1(); + // Generate the bailout helper call. 'instr' will be changed to the CALL into the bailout function, so it can't be used for + // ordering instructions anymore. + this->m_lowerer->GenerateBailOut(instrLdFld); + + return true; +} + +//---------------------------------------------------------------------------- +// +// LowererMD::GenerateFastScopedFldLookup +// +// This is a helper call which generates asm for both +// ScopedLdFld & ScopedStFld +// +//---------------------------------------------------------------------------- + +IR::Instr * +LowererMD::GenerateFastScopedFld(IR::Instr * instrScopedFld, bool isLoad) +{ + // LDR s1, [base, offset(length)] + // CMP s1, 1 -- get the length on array and test if it is 1. + // BNE $helper + // LDR s2, [base, offset(scopes)] -- load the first scope + // LDR s3, [s2, offset(type)] + // LDIMM s4, inlineCache + // LDR s5, [s4, offset(u.local.type)] + // CMP s3, s5 -- check type + // BNE $helper + // LDR s6, [s2, offset(slots)] -- load the slots array + // LDR s7 , [s4, offset(u.local.slotIndex)] -- load the cached slot index + // + // if (load) { + // LDR dst, [s6, s7, LSL #2] -- load the value from the slot + // } + // else { + // STR src, [s6, s7, LSL #2] + // } + // B $done + //$helper: + // dst = BLX PatchGetPropertyScoped(inlineCache, base, field, defaultInstance, scriptContext) + //$done: + + IR::Instr * instr; + IR::Instr * instrPrev = instrScopedFld->m_prev; + + IR::RegOpnd * opndBase; + IR::RegOpnd * opndReg1; //s1 + IR::RegOpnd * opndReg2; //s2 + IR::RegOpnd * opndInlineCache; //s4 + IR::IndirOpnd * indirOpnd; + IR::Opnd * propertyBase; + + IR::LabelInstr * labelHelper; + IR::LabelInstr * labelFallThru; + + if (isLoad) + { + propertyBase = instrScopedFld->GetSrc1(); + } + else + { + propertyBase = instrScopedFld->GetDst(); + } + + AssertMsg(propertyBase->IsSymOpnd() && propertyBase->AsSymOpnd()->IsPropertySymOpnd() && propertyBase->AsSymOpnd()->m_sym->IsPropertySym(), + "Expected property sym operand of ScopedLdFld or ScopedStFld"); + + IR::PropertySymOpnd * propertySymOpnd = propertyBase->AsPropertySymOpnd(); + + opndBase = propertySymOpnd->CreatePropertyOwnerOpnd(m_func); + const IR::AutoReuseOpnd holdAfterLegalization(opndBase, m_func); + AssertMsg(opndBase->m_sym->m_isSingleDef, "We assume this isn't redefined"); + + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + + // LDR s1, [base, offset(length)] -- get the length on array and test if it is 1. + indirOpnd = IR::IndirOpnd::New(opndBase, Js::FrameDisplay::GetOffsetOfLength(), TyInt16, this->m_func); + opndReg1 = IR::RegOpnd::New(TyInt32, this->m_func); + Lowerer::InsertMove(opndReg1, indirOpnd, instrScopedFld); + + // CMP s1, 1 -- get the length on array and test if it is 1. + instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); + instr->SetSrc1(opndReg1); + instr->SetSrc2(IR::IntConstOpnd::New(0x1, TyInt8, this->m_func)); + instrScopedFld->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + + // BNE $helper + instr = IR::BranchInstr::New(Js::OpCode::BNE, labelHelper, this->m_func); + instrScopedFld->InsertBefore(instr); + + // LDR s2, [base, offset(scopes)] -- load the first scope + indirOpnd = IR::IndirOpnd::New(opndBase, Js::FrameDisplay::GetOffsetOfScopes(), TyMachReg,this->m_func); + opndReg2 = IR::RegOpnd::New(TyMachReg, this->m_func); + Lowerer::InsertMove(opndReg2, indirOpnd, instrScopedFld); + + // LDR s3, [s2, offset(type)] + // LDIMM s4, inlineCache + // LDR s5, [s4, offset(u.local.type)] + // CMP s3, s5 -- check type + // BNE $helper + + opndInlineCache = IR::RegOpnd::New(TyMachReg, this->m_func); + opndReg2->m_sym->m_isNotInt = true; + + IR::RegOpnd * opndType = IR::RegOpnd::New(TyMachReg, this->m_func); + this->m_lowerer->GenerateObjectTestAndTypeLoad(instrScopedFld, opndReg2, opndType, labelHelper); + Lowerer::InsertMove(opndInlineCache, m_lowerer->LoadRuntimeInlineCacheOpnd(instrScopedFld, propertySymOpnd), instrScopedFld); + + labelFallThru = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + + // Check the local cache with the tagged type + IR::RegOpnd * opndTaggedType = IR::RegOpnd::New(TyMachReg, this->m_func); + GenerateLoadTaggedType(instrScopedFld, opndType, opndTaggedType); + Lowerer::GenerateLocalInlineCacheCheck(instrScopedFld, opndTaggedType, opndInlineCache, labelHelper); + if (isLoad) + { + IR::Opnd *opndDst = instrScopedFld->GetDst(); + Lowerer::GenerateLdFldFromLocalInlineCache(instrScopedFld, opndReg2, opndDst, opndInlineCache, labelFallThru, false); + } + else + { + IR::Opnd *opndSrc = instrScopedFld->GetSrc1(); + GenerateStFldFromLocalInlineCache(instrScopedFld, opndReg2, opndSrc, opndInlineCache, labelFallThru, false); + } + + // $helper: + // if (isLoad) { + // dst = BLX PatchGetPropertyScoped(inlineCache, opndBase, propertyId, srcBase, scriptContext) + // } + // else { + // BLX PatchSetPropertyScoped(inlineCache, base, field, value, defaultInstance, scriptContext) + // } + // $fallthru: + instrScopedFld->InsertBefore(labelHelper); + instrScopedFld->InsertAfter(labelFallThru); + + return instrPrev; +} + +//---------------------------------------------------------------------------- +// +// LowererMD::GenerateFastScopedLdFld +// +// Make use of the helper to cache the type and slot index used to do a ScopedLdFld +// when the scope is an array of length 1. +// Extract the only element from array and do an inline load from the appropriate slot +// if the type hasn't changed since the last time this ScopedLdFld was executed. +// +//---------------------------------------------------------------------------- +IR::Instr * +LowererMD::GenerateFastScopedLdFld(IR::Instr * instrLdScopedFld) +{ + //Helper GenerateFastScopedFldLookup generates following: + // + // LDR s1, [base, offset(length)] + // CMP s1, 1 -- get the length on array and test if it is 1. + // BNE $helper + // LDR s2, [base, offset(scopes)] -- load the first scope + // LDR s3, [s2, offset(type)] + // LDIMM s4, inlineCache + // LDR s5, [s4, offset(u.local.type)] + // CMP s3, s5 -- check type + // BNE $helper + // LDR s6, [s2, offset(slots)] -- load the slots array + // LDR s7 , [s4, offset(u.local.slotIndex)] -- load the cached slot index + // LDR dst, [s6, s7, LSL #2] -- load the value from the slot + // B $done + //$helper: + // dst = BLX PatchGetPropertyScoped(inlineCache, base, field, defaultInstance, scriptContext) + //$done: + + return GenerateFastScopedFld(instrLdScopedFld, true); +} + +//---------------------------------------------------------------------------- +// +// LowererMD::GenerateFastScopedStFld +// +// Make use of the helper to cache the type and slot index used to do a ScopedStFld +// when the scope is an array of length 1. +// Extract the only element from array and do an inline load from the appropriate slot +// if the type hasn't changed since the last time this ScopedStFld was executed. +// +//---------------------------------------------------------------------------- +IR::Instr * +LowererMD::GenerateFastScopedStFld(IR::Instr * instrStScopedFld) +{ + // LDR s1, [base, offset(length)] + // CMP s1, 1 -- get the length on array and test if it is 1. + // BNE $helper + // LDR s2, [base, offset(scopes)] -- load the first scope + // LDR s3, [s2, offset(type)] + // LDIMM s4, inlineCache + // LDR s5, [s4, offset(u.local.type)] + // CMP s3, s5 -- check type + // BNE $helper + // LDR s6, [s2, offset(slots)] -- load the slots array + // LDR s7 , [s4, offset(u.local.slotIndex)] -- load the cached slot index + // STR src, [s6, s7, LSL #2] -- store the value directly at the slot + // B $done + //$helper: + // BLX PatchSetPropertyScoped(inlineCache, base, field, value, defaultInstance, scriptContext) + //$done: + + return GenerateFastScopedFld(instrStScopedFld, false); +} + +void +LowererMD::GenerateStFldFromLocalInlineCache( + IR::Instr * instrStFld, + IR::RegOpnd * opndBase, + IR::Opnd * opndSrc, + IR::RegOpnd * opndInlineCache, + IR::LabelInstr * labelFallThru, + bool isInlineSlot) +{ + IR::RegOpnd * opndSlotArray = nullptr; + IR::IndirOpnd * opndIndir; + IR::Instr * instr; + + if (!isInlineSlot) + { + // s2 = MOV base->slots -- load the slot array + opndSlotArray = IR::RegOpnd::New(TyMachReg, instrStFld->m_func); + opndIndir = IR::IndirOpnd::New(opndBase, Js::DynamicObject::GetOffsetOfAuxSlots(), TyMachReg, instrStFld->m_func); + Lowerer::InsertMove(opndSlotArray, opndIndir, instrStFld); + } + + // LDR s5, [s2, offset(u.local.slotIndex)] -- load the cached slot index + IR::RegOpnd *opndSlotIndex = IR::RegOpnd::New(TyUint16, instrStFld->m_func); + opndIndir = IR::IndirOpnd::New(opndInlineCache, offsetof(Js::InlineCache, u.local.slotIndex), TyUint16, instrStFld->m_func); + Lowerer::InsertMove(opndSlotIndex, opndIndir, instrStFld); + + if (isInlineSlot) + { + // STR src, [base, s5, LSL #2] -- store the value directly to the slot [s4 + s5 * 4] = src + opndIndir = IR::IndirOpnd::New(opndBase, opndSlotIndex, LowererMD::GetDefaultIndirScale(), TyMachReg, instrStFld->m_func); + instr = IR::Instr::New(Js::OpCode::STR, opndIndir, opndSrc, instrStFld->m_func); + instrStFld->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + } + else + { + // STR src, [s4, s5, LSL #2] -- store the value directly to the slot [s4 + s5 * 4] = src + opndIndir = IR::IndirOpnd::New(opndSlotArray, opndSlotIndex, LowererMD::GetDefaultIndirScale(), TyMachReg, instrStFld->m_func); + instr = IR::Instr::New(Js::OpCode::STR, opndIndir, opndSrc, instrStFld->m_func); + instrStFld->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + } + + // B $done + instr = IR::BranchInstr::New(Js::OpCode::B, labelFallThru, instrStFld->m_func); + instrStFld->InsertBefore(instr); +} + +IR::Opnd * +LowererMD::CreateStackArgumentsSlotOpnd() +{ + // Save the newly-created args object to its dedicated stack slot. + IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(IR::RegOpnd::New(nullptr, FRAME_REG , TyMachReg, m_func), + -MachArgsSlotOffset, TyMachPtr, m_func); + + return indirOpnd; +} + +// +// jump to $labelHelper, based on the result of CMP +// +void LowererMD::GenerateSmIntTest(IR::Opnd *opndSrc, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::Instr **instrFirst, bool fContinueLabel /* = false */) +{ + AssertMsg(opndSrc->GetSize() == MachPtr, "64-bit register required"); + + IR::Opnd * opndReg = IR::RegOpnd::New(TyMachReg, this->m_func); + + // s1 = MOV src1 - Move to a temporary + IR::Instr * instr = IR::Instr::New(Js::OpCode::MOV, opndReg, opndSrc, this->m_func); + insertInstr->InsertBefore(instr); + + if (instrFirst) + { + *instrFirst = instr; + } + + // s1 = UBFX s1, VarTag_Shift, 64 - VarTag_Shift + instr = IR::Instr::New(Js::OpCode::UBFX, opndReg, opndReg, IR::IntConstOpnd::New(BITFIELD(Js::VarTag_Shift, 64 - Js::VarTag_Shift), TyMachReg, this->m_func), this->m_func); + insertInstr->InsertBefore(instr); + Legalize(instr); + + // s1 = EOR s1, AtomTag + instr = IR::Instr::New(Js::OpCode::EOR, opndReg, opndReg, IR::IntConstOpnd::New(Js::AtomTag, TyInt32, this->m_func, /* dontEncode = */ true), this->m_func); + insertInstr->InsertBefore(instr); + + if(fContinueLabel) + { + // CBZ s1, $labelHelper + instr = IR::BranchInstr::New(Js::OpCode::CBZ, labelHelper, this->m_func); + } + else + { + // CBNZ s1, $labelHelper + instr = IR::BranchInstr::New(Js::OpCode::CBNZ, labelHelper, this->m_func); + } + instr->SetSrc1(opndReg); + insertInstr->InsertBefore(instr); +} + +void LowererMD::GenerateInt32ToVarConversion(IR::Opnd * opndSrc, IR::Instr * insertInstr ) +{ + AssertMsg(opndSrc->IsRegOpnd(), "NYI for other types"); + + IR::Instr* instr = IR::Instr::New(Js::OpCode::ORR, opndSrc, opndSrc, IR::IntConstOpnd::New(Js::AtomTag_IntPtr, TyMachReg, this->m_func), this->m_func); + insertInstr->InsertBefore(instr); +} + +IR::RegOpnd * +LowererMD::GenerateUntagVar(IR::RegOpnd * src, IR::LabelInstr * labelFail, IR::Instr * assignInstr, bool generateTagCheck) +{ + Assert(src->IsVar()); + + // MOV valueOpnd, index + IR::RegOpnd *valueOpnd = IR::RegOpnd::New(TyInt32, this->m_func); + + // + // Convert Index to 32 bits. + // + if (generateTagCheck) + { + IR::Opnd * opnd = src->UseWithNewType(TyMachReg, this->m_func); + Assert(!opnd->IsTaggedInt()); + this->GenerateSmIntTest(opnd, assignInstr, labelFail); + } + + // Doing a 32-bit MOV clears the tag bits on ARM64. Use MOV_TRUNC so it doesn't get peeped away. + IR::Instr * instr = IR::Instr::New(Js::OpCode::MOV_TRUNC, valueOpnd, src->UseWithNewType(TyInt32, this->m_func), this->m_func); + assignInstr->InsertBefore(instr); + return valueOpnd; +} + +IR::RegOpnd *LowererMD::LoadNonnegativeIndex( + IR::RegOpnd *indexOpnd, + const bool skipNegativeCheck, + IR::LabelInstr *const notTaggedIntLabel, + IR::LabelInstr *const negativeLabel, + IR::Instr *const insertBeforeInstr) +{ + Assert(indexOpnd); + Assert(indexOpnd->IsVar() || indexOpnd->GetType() == TyInt32 || indexOpnd->GetType() == TyUint32); + Assert(indexOpnd->GetType() != TyUint32 || skipNegativeCheck); + Assert(!indexOpnd->IsVar() || notTaggedIntLabel); + Assert(skipNegativeCheck || negativeLabel); + Assert(insertBeforeInstr); + + if(indexOpnd->IsVar()) + { + if (indexOpnd->GetValueType().IsLikelyFloat()) + { + return m_lowerer->LoadIndexFromLikelyFloat(indexOpnd, skipNegativeCheck, notTaggedIntLabel, negativeLabel, insertBeforeInstr); + } + + indexOpnd = GenerateUntagVar(indexOpnd, notTaggedIntLabel, insertBeforeInstr, !indexOpnd->IsTaggedInt()); + } + + if(!skipNegativeCheck) + { + // TBNZ index, #31, $notTaggedIntOrNegative + IR::Instr *instr = IR::BranchInstr::New(Js::OpCode::TBNZ, negativeLabel, this->m_func); + instr->SetSrc1(indexOpnd); + instr->SetSrc2(IR::IntConstOpnd::New(31, TyVar, this->m_func)); + insertBeforeInstr->InsertBefore(instr); + } + return indexOpnd; +} + +// Inlines fast-path for int Mul/Add or int Mul/Sub. If not int, call MulAdd/MulSub helper +bool LowererMD::TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrPrev) +{ + IR::Instr *instrMul = instrAdd->GetPrevRealInstrOrLabel(); + IR::Opnd *addSrc; + IR::RegOpnd *addCommonSrcOpnd; + + Assert(instrAdd->m_opcode == Js::OpCode::Add_A || instrAdd->m_opcode == Js::OpCode::Sub_A); + + bool isSub = (instrAdd->m_opcode == Js::OpCode::Sub_A) ? true : false; + + // Mul needs to be a single def reg + if (instrMul->m_opcode != Js::OpCode::Mul_A || instrMul->GetDst()->IsRegOpnd() == false) + { + // Cannot generate MulAdd + return false; + } + + if (instrMul->HasBailOutInfo()) + { + // Bailout will be generated for the Add, but not the Mul. + // We could handle this, but this path isn't used that much anymore. + return false; + } + + IR::RegOpnd *regMulDst = instrMul->GetDst()->AsRegOpnd(); + + if (regMulDst->m_sym->m_isSingleDef == false) + { + // Cannot generate MulAdd + return false; + } + + // Only handle a * b + c, so dst of Mul needs to match left source of Add + if (instrMul->GetDst()->IsEqual(instrAdd->GetSrc1())) + { + addCommonSrcOpnd = instrAdd->GetSrc1()->AsRegOpnd(); + addSrc = instrAdd->GetSrc2(); + } + else if (instrMul->GetDst()->IsEqual(instrAdd->GetSrc2())) + { + addSrc = instrAdd->GetSrc1(); + addCommonSrcOpnd = instrAdd->GetSrc2()->AsRegOpnd(); + } + else + { + return false; + } + + // Only handle a * b + c where c != a * b + if (instrAdd->GetSrc1()->IsEqual(instrAdd->GetSrc2())) + { + return false; + } + + if (addCommonSrcOpnd->m_isTempLastUse == false) + { + return false; + } + + IR::Opnd *mulSrc1 = instrMul->GetSrc1(); + IR::Opnd *mulSrc2 = instrMul->GetSrc2(); + + if (mulSrc1->IsRegOpnd() && mulSrc1->AsRegOpnd()->IsTaggedInt() + && mulSrc2->IsRegOpnd() && mulSrc2->AsRegOpnd()->IsTaggedInt()) + { + return false; + } + + // Save prevInstr for the main lower loop + *pInstrPrev = instrMul->m_prev; + + // Generate int31 fast-path for Mul, go to MulAdd helper if it fails, or one of the source is marked notInt + if (!(addSrc->IsRegOpnd() && addSrc->AsRegOpnd()->IsNotInt()) + && !(mulSrc1->IsRegOpnd() && mulSrc1->AsRegOpnd()->IsNotInt()) + && !(mulSrc2->IsRegOpnd() && mulSrc2->AsRegOpnd()->IsNotInt())) + { + this->GenerateFastMul(instrMul); + + IR::LabelInstr *labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + IR::Instr *instr = IR::BranchInstr::New(Js::OpCode::B, labelHelper, this->m_func); + instrMul->InsertBefore(instr); + + // Generate int31 fast-path for Add + bool success; + if (isSub) + { + success = this->GenerateFastSub(instrAdd); + } + else + { + success = this->GenerateFastAdd(instrAdd); + } + + if (!success) + { + labelHelper->isOpHelper = false; + } + // Generate MulAdd helper call + instrAdd->InsertBefore(labelHelper); + } + + if (instrAdd->dstIsTempNumber) + { + m_lowerer->LoadHelperTemp(instrAdd, instrAdd); + } + else + { + IR::Opnd *tempOpnd = IR::IntConstOpnd::New(0, TyInt32, this->m_func); + this->LoadHelperArgument(instrAdd, tempOpnd); + } + this->m_lowerer->LoadScriptContext(instrAdd); + + IR::JnHelperMethod helper; + + if (addSrc == instrAdd->GetSrc2()) + { + instrAdd->FreeSrc1(); + IR::Opnd *addOpnd = instrAdd->UnlinkSrc2(); + this->LoadHelperArgument(instrAdd, addOpnd); + helper = isSub ? IR::HelperOp_MulSubRight : IR::HelperOp_MulAddRight; + } + else + { + instrAdd->FreeSrc2(); + IR::Opnd *addOpnd = instrAdd->UnlinkSrc1(); + this->LoadHelperArgument(instrAdd, addOpnd); + helper = isSub ? IR::HelperOp_MulSubLeft : IR::HelperOp_MulAddLeft; + } + + IR::Opnd *src2 = instrMul->UnlinkSrc2(); + this->LoadHelperArgument(instrAdd, src2); + + IR::Opnd *src1 = instrMul->UnlinkSrc1(); + this->LoadHelperArgument(instrAdd, src1); + + this->ChangeToHelperCall(instrAdd, helper); + + instrMul->Remove(); + + return true; +} + +IR::Instr * +LowererMD::LoadCheckedFloat( + IR::RegOpnd *opndOrig, + IR::RegOpnd *opndFloat, + IR::LabelInstr *labelInline, + IR::LabelInstr *labelHelper, + IR::Instr *instrInsert, + const bool checkForNullInLoopBody) +{ + // + // if (TaggedInt::Is(opndOrig)) + // opndFloat = FCVT opndOrig_32 + // B $labelInline + // else + // B $labelOpndIsNotInt + // + // $labelOpndIsNotInt: + // if (TaggedFloat::Is(opndOrig)) + // s2 = MOV opndOrig + // s2 = EOR FloatTag_Value + // opndFloat = FCVT s2 + // else + // B $labelHelper + // + // $labelInline: + // + + IR::Instr *instrFirst = nullptr; + + IR::LabelInstr *labelOpndIsNotInt = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + GenerateSmIntTest(opndOrig, instrInsert, labelOpndIsNotInt, &instrFirst); + + if (opndOrig->GetValueType().IsLikelyFloat()) + { + // Make this path helper if value is likely a float + instrInsert->InsertBefore(IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true)); + } + + IR::Opnd *opndOrig_32 = opndOrig->UseWithNewType(TyInt32, this->m_func); + EmitIntToFloat(opndFloat, opndOrig_32, instrInsert); + + IR::Instr *jmpInline = IR::BranchInstr::New(Js::OpCode::B, labelInline, this->m_func); + instrInsert->InsertBefore(jmpInline); + + instrInsert->InsertBefore(labelOpndIsNotInt); + + GenerateFloatTest(opndOrig, instrInsert, labelHelper, checkForNullInLoopBody); + + IR::RegOpnd *s2 = IR::RegOpnd::New(TyMachReg, this->m_func); + IR::Instr *mov = IR::Instr::New(Js::OpCode::MOV, s2, opndOrig, this->m_func); + instrInsert->InsertBefore(mov); + + IR::Instr *eorTag = IR::Instr::New(Js::OpCode::EOR, + s2, + s2, + IR::IntConstOpnd::New(Js::FloatTag_Value, + TyMachReg, + this->m_func, + /* dontEncode = */ true), + this->m_func); + instrInsert->InsertBefore(eorTag); + + IR::Instr *movFloat = IR::Instr::New(Js::OpCode::FMOV_GEN, opndFloat, s2, this->m_func); + instrInsert->InsertBefore(movFloat); + + return instrFirst; +} + +void +LowererMD::EmitLoadFloatFromNumber(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr) +{ + IR::LabelInstr *labelDone; + IR::Instr *instr; + labelDone = EmitLoadFloatCommon(dst, src, insertInstr, insertInstr->HasBailOutInfo()); + + if (labelDone == nullptr) + { + // We're done + insertInstr->Remove(); + return; + } + + // $Done note: insertAfter + insertInstr->InsertAfter(labelDone); + + if (!insertInstr->HasBailOutInfo()) + { + // $Done + insertInstr->Remove(); + return; + } + + IR::LabelInstr *labelNoBailOut = nullptr; + IR::SymOpnd *tempSymOpnd = nullptr; + + if (insertInstr->GetBailOutKind() == IR::BailOutPrimitiveButString) + { + if (!this->m_func->tempSymDouble) + { + this->m_func->tempSymDouble = StackSym::New(TyFloat64, this->m_func); + this->m_func->StackAllocate(this->m_func->tempSymDouble, MachDouble); + } + + // LEA r3, tempSymDouble + IR::RegOpnd *reg3Opnd = IR::RegOpnd::New(TyMachReg, this->m_func); + tempSymOpnd = IR::SymOpnd::New(this->m_func->tempSymDouble, TyFloat64, this->m_func); + Lowerer::InsertLea(reg3Opnd, tempSymOpnd, insertInstr); + + // regBoolResult = to_number_fromPrimitive(value, &dst, allowUndef, scriptContext); + + this->m_lowerer->LoadScriptContext(insertInstr); + IR::IntConstOpnd *allowUndefOpnd; + if (insertInstr->GetBailOutKind() == IR::BailOutPrimitiveButString) + { + allowUndefOpnd = IR::IntConstOpnd::New(true, TyInt32, this->m_func); + } + else + { + Assert(insertInstr->GetBailOutKind() == IR::BailOutNumberOnly); + allowUndefOpnd = IR::IntConstOpnd::New(false, TyInt32, this->m_func); + } + this->LoadHelperArgument(insertInstr, allowUndefOpnd); + this->LoadHelperArgument(insertInstr, reg3Opnd); + this->LoadHelperArgument(insertInstr, src); + + IR::RegOpnd *regBoolResult = IR::RegOpnd::New(TyInt32, this->m_func); + instr = IR::Instr::New(Js::OpCode::Call, regBoolResult, IR::HelperCallOpnd::New(IR::HelperOp_ConvNumber_FromPrimitive, this->m_func), this->m_func); + insertInstr->InsertBefore(instr); + + this->LowerCall(instr, 0); + + // TEST regBoolResult, regBoolResult + instr = IR::Instr::New(Js::OpCode::TST, this->m_func); + instr->SetSrc1(regBoolResult); + instr->SetSrc2(regBoolResult); + insertInstr->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + + // BNE $noBailOut + labelNoBailOut = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + instr = IR::BranchInstr::New(Js::OpCode::BNE, labelNoBailOut, this->m_func); + insertInstr->InsertBefore(instr); + } + + // Bailout code + Assert(insertInstr->m_opcode == Js::OpCode::FromVar); + insertInstr->UnlinkDst(); + insertInstr->FreeSrc1(); + IR::Instr *bailoutInstr = insertInstr; + insertInstr = bailoutInstr->m_next; + this->m_lowerer->GenerateBailOut(bailoutInstr); + + // $noBailOut + if (labelNoBailOut) + { + insertInstr->InsertBefore(labelNoBailOut); + + Assert(dst->IsRegOpnd()); + + // VLDR dst, [pResult].f64 + instr = IR::Instr::New(Js::OpCode::FLDR, dst, tempSymOpnd, this->m_func); + insertInstr->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + } +} + +IR::LabelInstr* +LowererMD::EmitLoadFloatCommon(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr, bool needHelperLabel) +{ + IR::Instr *instr; + + Assert(src->GetType() == TyVar); + Assert(dst->GetType() == TyFloat64 || TyFloat32); + bool isFloatConst = false; + IR::RegOpnd *regFloatOpnd = nullptr; + + if (src->IsRegOpnd() && src->AsRegOpnd()->m_sym->m_isFltConst) + { + IR::RegOpnd *regOpnd = src->AsRegOpnd(); + Assert(regOpnd->m_sym->m_isSingleDef); + + Js::Var value = regOpnd->m_sym->GetFloatConstValueAsVar_PostGlobOpt(); + IR::MemRefOpnd *memRef = IR::MemRefOpnd::New((BYTE*)value + Js::JavascriptNumber::GetValueOffset(), TyFloat64, this->m_func, IR::AddrOpndKindDynamicDoubleRef); + regFloatOpnd = IR::RegOpnd::New(TyFloat64, this->m_func); + instr = IR::Instr::New(Js::OpCode::FLDR, regFloatOpnd, memRef, this->m_func); + insertInstr->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + isFloatConst = true; + } + // Src is constant? + if (src->IsImmediateOpnd() || src->IsFloatConstOpnd()) + { + regFloatOpnd = IR::RegOpnd::New(TyFloat64, this->m_func); + m_lowerer->LoadFloatFromNonReg(src, regFloatOpnd, insertInstr); + isFloatConst = true; + } + if (isFloatConst) + { + if (dst->GetType() == TyFloat32) + { + // FCVT.F32.F64 regOpnd32.f32, regOpnd.f64 -- Convert regOpnd from f64 to f32 + IR::RegOpnd *regOpnd32 = regFloatOpnd->UseWithNewType(TyFloat32, this->m_func)->AsRegOpnd(); + instr = IR::Instr::New(Js::OpCode::FCVT, regOpnd32, regFloatOpnd, this->m_func); + insertInstr->InsertBefore(instr); + + // FMOV dst, regOpnd32 + instr = IR::Instr::New(Js::OpCode::FMOV, dst, regOpnd32, this->m_func); + insertInstr->InsertBefore(instr); + } + else + { + instr = IR::Instr::New(Js::OpCode::FMOV, dst, regFloatOpnd, this->m_func); + insertInstr->InsertBefore(instr); + } + LegalizeMD::LegalizeInstr(instr, false); + return nullptr; + } + Assert(src->IsRegOpnd()); + + IR::LabelInstr *labelStore = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + IR::LabelInstr *labelHelper; + IR::LabelInstr *labelDone = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + if (needHelperLabel) + { + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + } + else + { + labelHelper = labelDone; + } + IR::RegOpnd *reg2 = IR::RegOpnd::New(TyMachDouble, this->m_func); + // Load the float value in reg2 + this->LoadCheckedFloat(src->AsRegOpnd(), reg2, labelStore, labelHelper, insertInstr, needHelperLabel); + + // $Store + insertInstr->InsertBefore(labelStore); + if (dst->GetType() == TyFloat32) + { + IR::RegOpnd *reg2_32 = reg2->UseWithNewType(TyFloat32, this->m_func)->AsRegOpnd(); + // FCVT.F32.F64 r2_32.f32, r2.f64 -- Convert regOpnd from f64 to f32 + instr = IR::Instr::New(Js::OpCode::FCVT, reg2_32, reg2, this->m_func); + insertInstr->InsertBefore(instr); + + // FMOV dst, r2_32 + instr = IR::Instr::New(Js::OpCode::FMOV, dst, reg2_32, this->m_func); + insertInstr->InsertBefore(instr); + } + else + { + // FMOV dst, r2 + instr = IR::Instr::New(Js::OpCode::FMOV, dst, reg2, this->m_func); + insertInstr->InsertBefore(instr); + } + LegalizeMD::LegalizeInstr(instr, false); + + // B $Done + instr = IR::BranchInstr::New(Js::OpCode::B, labelDone, this->m_func); + insertInstr->InsertBefore(instr); + + if (needHelperLabel) + { + // $Helper + insertInstr->InsertBefore(labelHelper); + } + + return labelDone; +} + +void +LowererMD::EmitLoadFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr, IR::Instr * instrBailOut, IR::LabelInstr * labelBailOut) +{ + IR::LabelInstr *labelDone; + IR::Instr *instr; + + Assert(src->GetType() == TyVar); + Assert(dst->GetType() == TyFloat64 || TyFloat32); + Assert(src->IsRegOpnd()); + + labelDone = EmitLoadFloatCommon(dst, src, insertInstr, true); + + if (labelDone == nullptr) + { + // We're done + return; + } + + IR::BailOutKind bailOutKind = instrBailOut && instrBailOut->HasBailOutInfo() ? instrBailOut->GetBailOutKind() : IR::BailOutInvalid; + + if (bailOutKind & IR::BailOutOnArrayAccessHelperCall) + { + // Bail out instead of making the helper call. + Assert(labelBailOut); + m_lowerer->InsertBranch(Js::OpCode::Br, labelBailOut, insertInstr); + insertInstr->InsertBefore(labelDone); + return; + } + + IR::Opnd *memAddress = dst; + if (dst->IsRegOpnd()) + { + IR::SymOpnd *symOpnd = nullptr; + if (dst->GetType() == TyFloat32) + { + symOpnd = IR::SymOpnd::New(StackSym::New(TyFloat32, this->m_func), TyFloat32, this->m_func); + this->m_func->StackAllocate(symOpnd->m_sym->AsStackSym(), sizeof(float)); + } + else + { + symOpnd = IR::SymOpnd::New(StackSym::New(TyFloat64,this->m_func), TyMachDouble, this->m_func); + this->m_func->StackAllocate(symOpnd->m_sym->AsStackSym(), sizeof(double)); + } + memAddress = symOpnd; + } + + // LEA r3, dst + IR::RegOpnd *reg3Opnd = IR::RegOpnd::New(TyMachReg, this->m_func); + Lowerer::InsertLea(reg3Opnd, memAddress, insertInstr); + + // to_number_full(value, &dst, scriptContext); + // Create dummy binary op to convert into helper + + instr = IR::Instr::New(Js::OpCode::Add_A, this->m_func); + instr->SetSrc1(src); + instr->SetSrc2(reg3Opnd); + insertInstr->InsertBefore(instr); + + if (BailOutInfo::IsBailOutOnImplicitCalls(bailOutKind)) + { + _Analysis_assume_(instrBailOut != nullptr); + instr = instr->ConvertToBailOutInstr(instrBailOut->GetBailOutInfo(), bailOutKind); + if (instrBailOut->GetBailOutInfo()->bailOutInstr == instrBailOut) + { + IR::Instr * instrShare = instrBailOut->ShareBailOut(); + m_lowerer->LowerBailTarget(instrShare); + } + } + + IR::JnHelperMethod helper; + if (dst->GetType() == TyFloat32) + { + helper = IR::HelperOp_ConvFloat_Helper; + } + else + { + helper = IR::HelperOp_ConvNumber_Helper; + } + + this->m_lowerer->LowerBinaryHelperMem(instr, helper); + + if (dst->IsRegOpnd()) + { + instr = IR::Instr::New(Js::OpCode::FLDR, dst , memAddress, this->m_func); + insertInstr->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + } + + // $Done + insertInstr->InsertBefore(labelDone); +} + +void +LowererMD::GenerateFastRecyclerAlloc(size_t allocSize, IR::RegOpnd* newObjDst, IR::Instr* insertionPointInstr, IR::LabelInstr* allocHelperLabel, IR::LabelInstr* allocDoneLabel) +{ + ScriptContextInfo* scriptContext = this->m_func->GetScriptContextInfo(); + void* allocatorAddress; + uint32 endAddressOffset; + uint32 freeListOffset; + size_t alignedSize = HeapInfo::GetAlignedSizeNoCheck(allocSize); + + bool allowNativeCodeBumpAllocation = scriptContext->GetRecyclerAllowNativeCodeBumpAllocation(); + Recycler::GetNormalHeapBlockAllocatorInfoForNativeAllocation((void*)scriptContext->GetRecyclerAddr(), alignedSize, + allocatorAddress, endAddressOffset, freeListOffset, + allowNativeCodeBumpAllocation, this->m_func->IsOOPJIT()); + + IR::RegOpnd * allocatorAddressRegOpnd = IR::RegOpnd::New(TyMachPtr, this->m_func); + + // LDIMM allocatorAddressRegOpnd, allocator + IR::AddrOpnd* allocatorAddressOpnd = IR::AddrOpnd::New(allocatorAddress, IR::AddrOpndKindDynamicMisc, this->m_func); + IR::Instr * loadAllocatorAddressInstr = IR::Instr::New(Js::OpCode::LDIMM, allocatorAddressRegOpnd, allocatorAddressOpnd, this->m_func); + insertionPointInstr->InsertBefore(loadAllocatorAddressInstr); + + IR::IndirOpnd * endAddressOpnd = IR::IndirOpnd::New(allocatorAddressRegOpnd, endAddressOffset, TyMachPtr, this->m_func); + IR::IndirOpnd * freeObjectListOpnd = IR::IndirOpnd::New(allocatorAddressRegOpnd, freeListOffset, TyMachPtr, this->m_func); + + // LDR newObjDst, allocator->freeObjectList + IR::Instr * loadMemBlockInstr = IR::Instr::New(Js::OpCode::LDR, newObjDst, freeObjectListOpnd, this->m_func); + insertionPointInstr->InsertBefore(loadMemBlockInstr); + LegalizeMD::LegalizeInstr(loadMemBlockInstr, false); + + // nextMemBlock = ADD newObjDst, allocSize + IR::RegOpnd * nextMemBlockOpnd = IR::RegOpnd::New(TyMachPtr, this->m_func); + IR::IntConstOpnd* allocSizeOpnd = IR::IntConstOpnd::New((int32)allocSize, TyInt32, this->m_func); + IR::Instr * loadNextMemBlockInstr = IR::Instr::New(Js::OpCode::ADD, nextMemBlockOpnd, newObjDst, allocSizeOpnd, this->m_func); + insertionPointInstr->InsertBefore(loadNextMemBlockInstr); + LegalizeMD::LegalizeInstr(loadNextMemBlockInstr, false); + + // CMP nextMemBlock, allocator->endAddress + IR::Instr * checkInstr = IR::Instr::New(Js::OpCode::CMP, this->m_func); + checkInstr->SetSrc1(nextMemBlockOpnd); + checkInstr->SetSrc2(endAddressOpnd); + insertionPointInstr->InsertBefore(checkInstr); + LegalizeMD::LegalizeInstr(checkInstr, false); + + // BHI $allocHelper + IR::BranchInstr * branchToAllocHelperInstr = IR::BranchInstr::New(Js::OpCode::BHI, allocHelperLabel, this->m_func); + insertionPointInstr->InsertBefore(branchToAllocHelperInstr); + + // LDR allocator->freeObjectList, nextMemBlock + IR::Instr * setFreeObjectListInstr = IR::Instr::New(Js::OpCode::LDR, freeObjectListOpnd, nextMemBlockOpnd, this->m_func); + insertionPointInstr->InsertBefore(setFreeObjectListInstr); + LegalizeMD::LegalizeInstr(setFreeObjectListInstr, false); + + // B $allocDone + IR::BranchInstr * branchToAllocDoneInstr = IR::BranchInstr::New(Js::OpCode::B, allocDoneLabel, this->m_func); + insertionPointInstr->InsertBefore(branchToAllocDoneInstr); +} + +void +LowererMD::GenerateClz(IR::Instr * instr) +{ + Assert(instr->GetSrc1()->IsIntegral32()); + Assert(IRType_IsNativeInt(instr->GetDst()->GetType())); + instr->m_opcode = Js::OpCode::CLZ; + LegalizeMD::LegalizeInstr(instr, false); +} + +void +LowererMD::SaveDoubleToVar(IR::RegOpnd * dstOpnd, IR::RegOpnd *opndFloat, IR::Instr *instrOrig, IR::Instr *instrInsert, bool isHelper) +{ + Assert(opndFloat->GetType() == TyFloat64); + + // Call JSNumber::ToVar to save the float operand to the result of the original (var) instruction + + // s1 = MOV opndFloat + IR::RegOpnd *s1 = IR::RegOpnd::New(TyMachReg, m_func); + IR::Instr *mov = IR::Instr::New(Js::OpCode::FMOV_GEN, s1, opndFloat, m_func); + instrInsert->InsertBefore(mov); + + if (m_func->GetJITFunctionBody()->IsAsmJsMode()) + { + // s1 = FMOV_GEN src + // tmp = UBFX s1, #52, #11 ; extract exponent, bits 52-62 + // cmp = tmp, 0x7FF + // beq tmp, helper + // b done + // helper: + // tmp2 = tmp2 = UBFX s1, #0, #52 ; extract mantissa, bits 0-51 + // cbz tmp2, done + // s1 = JavascriptNumber::k_Nan + // done: + + IR::RegOpnd* tmp = IR::RegOpnd::New(TyMachReg, m_func); + + IR::Instr* newInstr = IR::Instr::New(Js::OpCode::UBFX, tmp, s1, IR::IntConstOpnd::New(BITFIELD(52, 11), TyMachReg, m_func, true), m_func); + instrInsert->InsertBefore(newInstr); + LowererMD::Legalize(newInstr); + + newInstr = IR::Instr::New(Js::OpCode::CMP, tmp, IR::IntConstOpnd::New(0x7FF, TyMachReg, m_func, true), m_func); + instrInsert->InsertBefore(newInstr); + LowererMD::Legalize(newInstr); + + IR::LabelInstr* helper = Lowerer::InsertLabel(true, instrInsert); + IR::Instr* branch = IR::BranchInstr::New(Js::OpCode::BEQ, helper, m_func); + helper->InsertBefore(branch); + + IR::LabelInstr* done = Lowerer::InsertLabel(isHelper, instrInsert); + + Lowerer::InsertBranch(Js::OpCode::Br, done, helper); + + IR::RegOpnd* tmp2 = IR::RegOpnd::New(TyMachReg, m_func); + + newInstr = IR::Instr::New(Js::OpCode::UBFX, tmp2, s1, IR::IntConstOpnd::New(BITFIELD(0, 52), TyMachReg, m_func, true), m_func); + done->InsertBefore(newInstr); + LowererMD::Legalize(newInstr); + + branch = IR::BranchInstr::New(Js::OpCode::CBZ, done, m_func); + branch->SetSrc1(tmp2); + done->InsertBefore(branch); + + IR::Opnd * opndNaN = IR::AddrOpnd::New((Js::Var)Js::JavascriptNumber::k_Nan, IR::AddrOpndKindConstantVar, m_func, true); + Lowerer::InsertMove(s1, opndNaN, done); + } + + // s1 = EOR s1, FloatTag_Value + // dst = s1 + + IR::Instr* setTag = IR::Instr::New(Js::OpCode::EOR, s1, s1, IR::AddrOpnd::New((Js::Var)Js::FloatTag_Value, IR::AddrOpndKindConstantVar, this->m_func, true), this->m_func); + IR::Instr* movDst = IR::Instr::New(Js::OpCode::MOV, dstOpnd, s1, this->m_func); + + instrInsert->InsertBefore(setTag); + instrInsert->InsertBefore(movDst); + LowererMD::Legalize(setTag); +} + +void +LowererMD::GenerateFastAbs(IR::Opnd *dst, IR::Opnd *src, IR::Instr *callInstr, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::LabelInstr *doneLabel) +{ + // if isFloat goto $float + // s1 = MOV src + // CMP s1, #0 + // s1 = CSNEGPL s1, s1 + // TBNZ s1, #31, $labelHelper + // s1 = ORR s1, AtomTag_IntPtr + // JMP $done + // $float + // CMP [src], JavascriptNumber.vtable + // JNE $helper + // MOVSD r1, [src + offsetof(value)] + // ANDPD r1, absDoubleCst + // dst = DoubleToVar(r1) + + IR::Instr *instr = nullptr; + IR::LabelInstr *labelFloat = nullptr; + bool isInt = false; + bool isNotInt = false; + + if (src->IsRegOpnd()) + { + if (src->AsRegOpnd()->IsTaggedInt()) + { + isInt = true; + + } + else if (src->AsRegOpnd()->IsNotInt()) + { + isNotInt = true; + } + } + else if (src->IsAddrOpnd()) + { + IR::AddrOpnd *varOpnd = src->AsAddrOpnd(); + Assert(varOpnd->IsVar() && Js::TaggedInt::Is(varOpnd->m_address)); + + int64 absValue = ::_abs64(Js::TaggedInt::ToInt32(varOpnd->m_address)); + + if (!Js::TaggedInt::IsOverflow(absValue)) + { + varOpnd->SetAddress(Js::TaggedInt::ToVarUnchecked((int32)absValue), IR::AddrOpndKindConstantVar); + + instr = IR::Instr::New(Js::OpCode::MOV, dst, varOpnd, this->m_func); + insertInstr->InsertBefore(instr); + + return; + } + } + + if (src->IsRegOpnd() == false) + { + IR::RegOpnd *regOpnd = IR::RegOpnd::New(TyVar, this->m_func); + instr = IR::Instr::New(Js::OpCode::MOV, regOpnd, src, this->m_func); + insertInstr->InsertBefore(instr); + src = regOpnd; + } + + bool emitFloatAbs = !isInt; + + if (!isNotInt) + { + if (!isInt) + { + IR::LabelInstr *label = labelHelper; + if (emitFloatAbs) + { + label = labelFloat = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + } + + GenerateSmIntTest(src, insertInstr, label); + } + + // s1 = MOV src + IR::RegOpnd *regSrc = IR::RegOpnd::New(TyInt32, this->m_func); + Lowerer::InsertMove(regSrc, src, insertInstr); + + // CMP s1, #0 + instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); + instr->SetSrc1(regSrc); + instr->SetSrc2(IR::IntConstOpnd::New(0, IRType::TyInt32, this->m_func)); + insertInstr->InsertBefore(instr); + Legalize(instr); + + // s1 = CSNEGPL s1, s1 + instr = IR::Instr::New(Js::OpCode::CSNEGPL, regSrc, regSrc, regSrc, this->m_func); + insertInstr->InsertBefore(instr); + Legalize(instr); + + // TBNZ s1, #31, $labelHelper + instr = IR::BranchInstr::New(Js::OpCode::TBNZ, labelHelper, this->m_func); + instr->SetSrc1(regSrc); + instr->SetSrc2(IR::IntConstOpnd::New(31, IRType::TyInt32, this->m_func)); + insertInstr->InsertBefore(instr); + + // MOV dst, s1 + instr = IR::Instr::New(Js::OpCode::MOV, dst, regSrc, this->m_func); + insertInstr->InsertBefore(instr); + + GenerateInt32ToVarConversion(dst, insertInstr); + } + + if (labelFloat) + { + // B $done + instr = IR::BranchInstr::New(Js::OpCode::B, doneLabel, this->m_func); + insertInstr->InsertBefore(instr); + + // $float + insertInstr->InsertBefore(labelFloat); + } + + if (emitFloatAbs) + { + // if (typeof(src) == double) + IR::RegOpnd *src64 = src->AsRegOpnd(); + GenerateFloatTest(src64, insertInstr, labelHelper); + + // dst64 = MOV src64 + insertInstr->InsertBefore(IR::Instr::New(Js::OpCode::MOV, dst, src64, this->m_func)); + + // Unconditionally set the sign bit. This will get XORd away when we remove the tag. + // dst64 = ORR 0x8000000000000000 + insertInstr->InsertBefore(IR::Instr::New(Js::OpCode::ORR, dst, dst, IR::IntConstOpnd::New(MachSignBit, TyMachReg, this->m_func), this->m_func)); + } + else if(!isInt) + { + // The source is not known to be a tagged int, so either it's definitely not an int (isNotInt), or the int version of + // abs failed the tag check and jumped here. We can't emit the float version of abs (!emitFloatAbs) due to SSE2 not + // being available, so jump straight to the helper. + + // JMP $helper + instr = IR::BranchInstr::New(Js::OpCode::B, labelHelper, this->m_func); + insertInstr->InsertBefore(instr); + } +} + +bool LowererMD::GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR::Opnd *srcStr, IR::Opnd *srcIndex, IR::Instr *callInstr, + IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::LabelInstr *doneLabel) +{ + // if regSrcStr is not object, JMP $helper + // CMP [regSrcStr + offset(type)] , static string type -- check base string type + // BNE $helper + // MOV r1, [regSrcStr + offset(m_pszValue)] + // CBZ r1, $helper + // MOV r2, srcIndex + // If r2 is not int, B $helper + // Convert r2 to int + // CMP [regSrcStr + offsetof(length)], r2 + // BLS $helper + // LDRH r2, [r1 + r2 * 2] + // if (charAt) + // MOV x0, r1 + // MOV x1, scriptContext + // BL GetStringFromChar + // MOV dst, x0 + // else (charCodeAt) + // if (codePointAt) + // Lowerer.GenerateFastCodePointAt -- Common inline functions + // Convert r2 to Var + // MOV dst, r2 + bool isInt = false; + bool isNotTaggedValue = false; + IR::Instr *instr; + IR::RegOpnd *regSrcStr; + + if (srcStr->IsRegOpnd()) + { + if (srcStr->AsRegOpnd()->IsTaggedInt()) + { + isInt = true; + + } + else if (srcStr->AsRegOpnd()->IsNotTaggedValue()) + { + isNotTaggedValue = true; + } + } + + if (srcStr->IsRegOpnd() == false) + { + IR::RegOpnd *regOpnd = IR::RegOpnd::New(TyVar, this->m_func); + instr = IR::Instr::New(Js::OpCode::MOV, regOpnd, srcStr, this->m_func); + insertInstr->InsertBefore(instr); + regSrcStr = regOpnd; + } + else + { + regSrcStr = srcStr->AsRegOpnd(); + } + + if (!isNotTaggedValue) + { + if (!isInt) + { + GenerateObjectTest(regSrcStr, insertInstr, labelHelper); + } + else + { + // Insert delete branch opcode to tell the dbChecks not to assert on this helper label + IR::Instr *fakeBr = IR::PragmaInstr::New(Js::OpCode::DeletedNonHelperBranch, 0, this->m_func); + insertInstr->InsertBefore(fakeBr); + + instr = IR::BranchInstr::New(Js::OpCode::B, labelHelper, this->m_func); + insertInstr->InsertBefore(instr); + } + } + + // Bail out if index a constant and is less than zero. + if (srcIndex->IsAddrOpnd() && Js::TaggedInt::ToInt32(srcIndex->AsAddrOpnd()->m_address) < 0) + { + labelHelper->isOpHelper = false; + instr = IR::BranchInstr::New(Js::OpCode::B, labelHelper, this->m_func); + insertInstr->InsertBefore(instr); + return false; + } + + this->m_lowerer->GenerateStringTest(regSrcStr, insertInstr, labelHelper, nullptr, false); + + // r1 contains the value of the char16* pointer inside JavascriptString. + // MOV r1, [regSrcStr + offset(m_pszValue)] + IR::RegOpnd *r1 = IR::RegOpnd::New(TyMachReg, this->m_func); + IR::IndirOpnd * indirOpnd = IR::IndirOpnd::New(regSrcStr->AsRegOpnd(), Js::JavascriptString::GetOffsetOfpszValue(), TyMachPtr, this->m_func); + instr = IR::Instr::New(Js::OpCode::MOV, r1, indirOpnd, this->m_func); + insertInstr->InsertBefore(instr); + Legalize(instr); + + // CBZ r1, $helper -- Null pointer test + instr = IR::BranchInstr::New(Js::OpCode::CBZ, labelHelper, this->m_func); + instr->SetSrc1(r1); + insertInstr->InsertBefore(instr); + + IR::IndirOpnd *strLength = IR::IndirOpnd::New(regSrcStr, offsetof(Js::JavascriptString, m_charLength), TyUint32, this->m_func); + if (srcIndex->IsAddrOpnd()) + { + // CMP [regSrcStr + offsetof(length)], index + instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); + instr->SetSrc1(strLength); + instr->SetSrc2(IR::IntConstOpnd::New(Js::TaggedInt::ToUInt32(srcIndex->AsAddrOpnd()->m_address), TyUint32, this->m_func)); + insertInstr->InsertBefore(instr); + Legalize(instr); + + // Use unsigned compare, this should handle negative indexes as well (they become > INT_MAX) + // BLS $helper + instr = IR::BranchInstr::New(Js::OpCode::BLS, labelHelper, this->m_func); + insertInstr->InsertBefore(instr); + + indirOpnd = IR::IndirOpnd::New(r1, Js::TaggedInt::ToUInt32(srcIndex->AsAddrOpnd()->m_address) * sizeof(char16), TyUint16, this->m_func); + } + else + { + IR::RegOpnd *r2 = IR::RegOpnd::New(TyVar, this->m_func); + // MOV r2, srcIndex + instr = IR::Instr::New(Js::OpCode::MOV, r2, srcIndex, this->m_func); + insertInstr->InsertBefore(instr); + + if (!srcIndex->IsRegOpnd() || !srcIndex->AsRegOpnd()->IsTaggedInt()) + { + GenerateSmIntTest(r2, insertInstr, labelHelper); + } + + // Remove the tag + // MOV r2, r2 [32-bit move zeros upper 32 bits and thus the tag] + IR::Opnd * r2_32 = r2->UseWithNewType(TyInt32, this->m_func); + instr = IR::Instr::New(Js::OpCode::MOV_TRUNC, r2_32, r2_32, this->m_func); + insertInstr->InsertBefore(instr); + r2 = r2_32->AsRegOpnd(); + + // CMP [regSrcStr + offsetof(length)], r2 + instr = IR::Instr::New(Js::OpCode::CMP, this->m_func); + instr->SetSrc1(strLength); + instr->SetSrc2(r2); + insertInstr->InsertBefore(instr); + Legalize(instr); + + if (r2->GetSize() != MachPtr) + { + r2 = r2->UseWithNewType(TyMachPtr, this->m_func)->AsRegOpnd(); + } + + // Use unsigned compare, this should handle negative indexes as well (they become > INT_MAX) + // BLS $helper + instr = IR::BranchInstr::New(Js::OpCode::BLS, labelHelper, this->m_func); + insertInstr->InsertBefore(instr); + + indirOpnd = IR::IndirOpnd::New(r1, r2, 1, TyUint16, this->m_func); + } + // LDRH charReg, [r1 + r2 * 2] -- this is the value of the char + IR::RegOpnd *charReg = IR::RegOpnd::New(TyMachReg, this->m_func); + Lowerer::InsertMove(charReg, indirOpnd, insertInstr); + + if (index == Js::BuiltinFunction::JavascriptString_CharAt) + { + IR::Opnd *resultOpnd; + if (dst->IsEqual(srcStr)) + { + resultOpnd = IR::RegOpnd::New(TyVar, this->m_func); + } + else + { + resultOpnd = dst; + } + this->m_lowerer->GenerateGetSingleCharString(charReg, resultOpnd, labelHelper, doneLabel, insertInstr, false); + } + else + { + Assert(index == Js::BuiltinFunction::JavascriptString_CharCodeAt || index == Js::BuiltinFunction::JavascriptString_CodePointAt); + + if (index == Js::BuiltinFunction::JavascriptString_CodePointAt) + { + this->m_lowerer->GenerateFastInlineStringCodePointAt(insertInstr, this->m_func, strLength, srcIndex, charReg, r1); + } + + GenerateInt32ToVarConversion(charReg, insertInstr); + + // MOV dst, charReg + instr = IR::Instr::New(Js::OpCode::MOV, dst, charReg, this->m_func); + insertInstr->InsertBefore(instr); + } + return true; +} + +void +LowererMD::EmitInt4Instr(IR::Instr *instr) +{ + IR::Instr * newInstr; + IR::Opnd * src1; + IR::Opnd * src2; + + switch (instr->m_opcode) + { + case Js::OpCode::Neg_I4: + instr->m_opcode = Js::OpCode::SUB; + instr->SetSrc2(instr->UnlinkSrc1()); + instr->SetSrc1(IR::RegOpnd::New(nullptr, RegZR, TyInt32, instr->m_func)); + break; + + case Js::OpCode::Not_I4: + instr->m_opcode = Js::OpCode::MVN; + break; + + case Js::OpCode::Add_I4: + instr->m_opcode = Js::OpCode::ADD; + break; + + case Js::OpCode::Sub_I4: + instr->m_opcode = Js::OpCode::SUB; + break; + + case Js::OpCode::Mul_I4: + instr->m_opcode = Js::OpCode::MUL; + break; + + case Js::OpCode::DivU_I4: + AssertMsg(UNREACHED, "Unsigned div NYI"); + case Js::OpCode::Div_I4: + instr->m_opcode = Js::OpCode::SDIV; + break; + + case Js::OpCode::RemU_I4: + AssertMsg(UNREACHED, "Unsigned rem NYI"); + case Js::OpCode::Rem_I4: + instr->m_opcode = Js::OpCode::REM; + break; + + case Js::OpCode::Or_I4: + instr->m_opcode = Js::OpCode::ORR; + break; + + case Js::OpCode::Xor_I4: + instr->m_opcode = Js::OpCode::EOR; + break; + + case Js::OpCode::And_I4: + instr->m_opcode = Js::OpCode::AND; + break; + + case Js::OpCode::Shl_I4: + case Js::OpCode::ShrU_I4: + case Js::OpCode::Shr_I4: + ChangeToShift(instr, false /* needFlags */); + break; + + case Js::OpCode::BrTrue_I4: + instr->m_opcode = Js::OpCode::CBNZ; + break; + + case Js::OpCode::BrFalse_I4: + instr->m_opcode = Js::OpCode::CBZ; + break; + + case Js::OpCode::BrEq_I4: + instr->m_opcode = Js::OpCode::BEQ; + goto br2_Common; + + case Js::OpCode::BrNeq_I4: + instr->m_opcode = Js::OpCode::BNE; + goto br2_Common; + + case Js::OpCode::BrGt_I4: + instr->m_opcode = Js::OpCode::BGT; + goto br2_Common; + + case Js::OpCode::BrGe_I4: + instr->m_opcode = Js::OpCode::BGE; + goto br2_Common; + + case Js::OpCode::BrLe_I4: + instr->m_opcode = Js::OpCode::BLE; + goto br2_Common; + + case Js::OpCode::BrLt_I4: + instr->m_opcode = Js::OpCode::BLT; + goto br2_Common; + + case Js::OpCode::BrUnGt_I4: + instr->m_opcode = Js::OpCode::BHI; + goto br2_Common; + + case Js::OpCode::BrUnGe_I4: + instr->m_opcode = Js::OpCode::BCS; + goto br2_Common; + + case Js::OpCode::BrUnLt_I4: + instr->m_opcode = Js::OpCode::BCC; + goto br2_Common; + + case Js::OpCode::BrUnLe_I4: + instr->m_opcode = Js::OpCode::BLS; + goto br2_Common; + +br2_Common: + src1 = instr->UnlinkSrc1(); + src2 = instr->UnlinkSrc2(); + newInstr = IR::Instr::New(Js::OpCode::CMP, instr->m_func); + instr->InsertBefore(newInstr); + newInstr->SetSrc1(src1); + newInstr->SetSrc2(src2); + // Let instr point to the CMP so we can legalize it. + instr = newInstr; + break; + + default: + AssertMsg(UNREACHED, "NYI I4 instr"); + break; + } + + LegalizeMD::LegalizeInstr(instr, false); +} + +void +LowererMD::LowerInt4NegWithBailOut( + IR::Instr *const instr, + const IR::BailOutKind bailOutKind, + IR::LabelInstr *const bailOutLabel, + IR::LabelInstr *const skipBailOutLabel) +{ + Assert(instr); + Assert(instr->m_opcode == Js::OpCode::Neg_I4); + Assert(!instr->HasBailOutInfo()); + Assert(bailOutKind & IR::BailOutOnResultConditions || bailOutKind == IR::BailOutOnFailedHoistedLoopCountBasedBoundCheck); + Assert(bailOutLabel); + Assert(instr->m_next == bailOutLabel); + Assert(skipBailOutLabel); + Assert(instr->GetDst()->IsInt32()); + Assert(instr->GetSrc1()->IsInt32()); + + // SUBS dst, zr, src1 + // BVS $bailOutLabel + // BEQ $bailOutLabel + // B $skipBailOut + // $bailOut: + // ... + // $skipBailOut: + + // Lower the instruction + instr->m_opcode = Js::OpCode::SUBS; + instr->ReplaceDst(instr->GetDst()->UseWithNewType(TyInt32, instr->m_func)); + instr->SetSrc2(instr->UnlinkSrc1()->UseWithNewType(TyInt32, instr->m_func)); + instr->SetSrc1(IR::RegOpnd::New(nullptr, RegZR, TyInt32, instr->m_func)); + Legalize(instr); + + if(bailOutKind & IR::BailOutOnOverflow) + { + bailOutLabel->InsertBefore(IR::BranchInstr::New(Js::OpCode::BVS, bailOutLabel, instr->m_func)); + } + + if(bailOutKind & IR::BailOutOnNegativeZero) + { + bailOutLabel->InsertBefore(IR::BranchInstr::New(Js::OpCode::BEQ, bailOutLabel, instr->m_func)); + } + + // Skip bailout + bailOutLabel->InsertBefore(IR::BranchInstr::New(LowererMD::MDUncondBranchOpcode, skipBailOutLabel, instr->m_func)); +} + +void +LowererMD::LowerInt4AddWithBailOut( + IR::Instr *const instr, + const IR::BailOutKind bailOutKind, + IR::LabelInstr *const bailOutLabel, + IR::LabelInstr *const skipBailOutLabel) +{ + Assert(instr); + Assert(instr->m_opcode == Js::OpCode::Add_I4); + Assert(!instr->HasBailOutInfo()); + Assert( + (bailOutKind & IR::BailOutOnResultConditions) == IR::BailOutOnOverflow || + bailOutKind == IR::BailOutOnFailedHoistedLoopCountBasedBoundCheck); + Assert(bailOutLabel); + Assert(instr->m_next == bailOutLabel); + Assert(skipBailOutLabel); + Assert(instr->GetDst()->IsInt32()); + Assert(instr->GetSrc1()->IsInt32()); + Assert(instr->GetSrc2()->IsInt32()); + + // ADDS dst, src1, src2 + // BVC skipBailOutLabel + // fallthrough to bailout + + const auto dst = instr->GetDst(), src1 = instr->GetSrc1(), src2 = instr->GetSrc2(); + Assert(dst->IsRegOpnd()); + + const bool dstEquSrc1 = dst->IsEqual(src1), dstEquSrc2 = dst->IsEqual(src2); + if(dstEquSrc1 || dstEquSrc2) + { + LowererMD::ChangeToAssign(instr->SinkDst(Js::OpCode::Ld_I4, RegNOREG, skipBailOutLabel)); + } + + // Lower the instruction + ChangeToAdd(instr, true /* needFlags */); + Legalize(instr); + + // Skip bailout on no overflow + bailOutLabel->InsertBefore(IR::BranchInstr::New(Js::OpCode::BVC, skipBailOutLabel, instr->m_func)); + + // Fall through to bailOutLabel +} + +void +LowererMD::LowerInt4SubWithBailOut( + IR::Instr *const instr, + const IR::BailOutKind bailOutKind, + IR::LabelInstr *const bailOutLabel, + IR::LabelInstr *const skipBailOutLabel) +{ + Assert(instr); + Assert(instr->m_opcode == Js::OpCode::Sub_I4); + Assert(!instr->HasBailOutInfo()); + Assert( + (bailOutKind & IR::BailOutOnResultConditions) == IR::BailOutOnOverflow || + bailOutKind == IR::BailOutOnFailedHoistedLoopCountBasedBoundCheck); + Assert(bailOutLabel); + Assert(instr->m_next == bailOutLabel); + Assert(skipBailOutLabel); + Assert(instr->GetDst()->IsInt32()); + Assert(instr->GetSrc1()->IsInt32()); + Assert(instr->GetSrc2()->IsInt32()); + + // SUBS dst, src1, src2 + // BVC skipBailOutLabel + // fallthrough to bailout + + const auto dst = instr->GetDst(), src1 = instr->GetSrc1(), src2 = instr->GetSrc2(); + Assert(dst->IsRegOpnd()); + + const bool dstEquSrc1 = dst->IsEqual(src1), dstEquSrc2 = dst->IsEqual(src2); + if(dstEquSrc1 || dstEquSrc2) + { + LowererMD::ChangeToAssign(instr->SinkDst(Js::OpCode::Ld_I4, RegNOREG, skipBailOutLabel)); + } + + // Lower the instruction + ChangeToSub(instr, true /* needFlags */); + Legalize(instr); + + // Skip bailout on no overflow + bailOutLabel->InsertBefore(IR::BranchInstr::New(Js::OpCode::BVC, skipBailOutLabel, instr->m_func)); + + // Fall through to bailOutLabel +} + +void +LowererMD::LowerInt4MulWithBailOut( + IR::Instr *const instr, + const IR::BailOutKind bailOutKind, + IR::LabelInstr *const bailOutLabel, + IR::LabelInstr *const skipBailOutLabel) +{ + Assert(instr); + Assert(instr->m_opcode == Js::OpCode::Mul_I4); + Assert(!instr->HasBailOutInfo()); + Assert(bailOutKind & IR::BailOutOnResultConditions || bailOutKind == IR::BailOutOnFailedHoistedLoopCountBasedBoundCheck); + Assert(bailOutLabel); + Assert(instr->m_next == bailOutLabel); + Assert(skipBailOutLabel); + + IR::Opnd *dst = instr->GetDst(); + IR::Opnd *src1 = instr->UnlinkSrc1(); + IR::Opnd *src2 = instr->UnlinkSrc2(); + IR::Instr *insertInstr; + + Assert(dst->IsInt32()); + Assert(src1->IsInt32()); + Assert(src2->IsInt32()); + + // s3 = SMULL src1, src2 // result is i64 + IR::Opnd* s3 = IR::RegOpnd::New(TyInt64, instr->m_func); + insertInstr = IR::Instr::New(Js::OpCode::SMULL, s3, src1, src2, instr->m_func); + instr->InsertBefore(insertInstr); + LegalizeMD::LegalizeInstr(insertInstr, false); + + // dst = MOV_TRUNC s3 + instr->m_opcode = Js::OpCode::MOV_TRUNC; + instr->SetSrc1(s3->UseWithNewType(TyInt32, instr->m_func)); + + // check negative zero + // + // If the result is zero, we need to check and only bail out if it would be -0. + // We know that if the result is 0/-0, at least operand should be zero. + // We should bailout if src1 + src2 < 0, as this proves that the other operand is negative + // + // CMN src1, src2 + // BPL $skipBailOutLabel + // + // $bailOutLabel + // GenerateBailout + // + // $skipBailOutLabel + IR::LabelInstr *checkForNegativeZeroLabel = nullptr; + if(bailOutKind & IR::BailOutOnNegativeZero) + { + checkForNegativeZeroLabel = IR::LabelInstr::New(Js::OpCode::Label, instr->m_func, true); + bailOutLabel->InsertBefore(checkForNegativeZeroLabel); + + Assert(dst->IsRegOpnd()); + Assert(!src1->IsEqual(src2)); // cannot result in -0 if both operands are the same; GlobOpt should have figured that out + + // CMN src1, src2 + // BPL $skipBailOutLabel + insertInstr = IR::Instr::New(Js::OpCode::CMN, instr->m_func); + insertInstr->SetSrc1(src1); + insertInstr->SetSrc2(src2); + bailOutLabel->InsertBefore(insertInstr); + LegalizeMD::LegalizeInstr(insertInstr, false); + bailOutLabel->InsertBefore(IR::BranchInstr::New(Js::OpCode::BPL, skipBailOutLabel, instr->m_func)); + + // Fall through to bailOutLabel + } + + IR::LabelInstr* insertBeforeInstr = checkForNegativeZeroLabel ? checkForNegativeZeroLabel : bailOutLabel; + + //check overflow + if(bailOutKind & IR::BailOutOnMulOverflow || bailOutKind == IR::BailOutOnFailedHoistedLoopCountBasedBoundCheck) + { + insertInstr = IR::Instr::New(Js::OpCode::CMP_SXTW, instr->m_func); + insertInstr->SetSrc1(s3); + insertInstr->SetSrc2(s3); + instr->InsertBefore(insertInstr); + + // BNE $bailOutHelper + insertInstr = IR::BranchInstr::New(Js::OpCode::BNE, bailOutLabel, instr->m_func); + instr->InsertBefore(insertInstr); + } + + if(bailOutKind & IR::BailOutOnNegativeZero) + { + // TST dst, dst + // BEQ $checkForNegativeZeroLabel + insertInstr = IR::Instr::New(Js::OpCode::TST, instr->m_func); + insertInstr->SetSrc1(dst); + insertInstr->SetSrc2(dst); + insertBeforeInstr->InsertBefore(insertInstr); + LegalizeMD::LegalizeInstr(insertInstr, false); + + insertBeforeInstr->InsertBefore(IR::BranchInstr::New(Js::OpCode::BEQ, checkForNegativeZeroLabel, instr->m_func)); + } + + insertBeforeInstr->InsertBefore(IR::BranchInstr::New(Js::OpCode::B, skipBailOutLabel, instr->m_func)); +} + +void +LowererMD::LowerInt4RemWithBailOut( + IR::Instr *const instr, + const IR::BailOutKind bailOutKind, + IR::LabelInstr *const bailOutLabel, + IR::LabelInstr *const skipBailOutLabel) const +{ + Assert(instr); + Assert(instr->m_opcode == Js::OpCode::Rem_I4); + Assert(!instr->HasBailOutInfo()); + Assert(bailOutKind & IR::BailOutOnResultConditions); + Assert(bailOutLabel); + Assert(instr->m_next == bailOutLabel); + Assert(skipBailOutLabel); + + IR::Opnd *dst = instr->GetDst(); + IR::Opnd *src1 = instr->GetSrc1(); + + Assert(dst->IsInt32()); + Assert(src1->IsInt32()); + Assert(instr->GetSrc2()->IsInt32()); + + //Lower the instruction + EmitInt4Instr(instr); + + //check for negative zero + //We have, dst = src1 % src2 + //We need to bailout if dst == 0 and src1 < 0 + // tst dst, dst + // bne $skipBailOutLabel + // tst src1,src1 + // bpl $skipBailOutLabel + // + //$bailOutLabel + // GenerateBailout(); + // + //$skipBailOutLabel + if(bailOutKind & IR::BailOutOnNegativeZero) + { + IR::LabelInstr *checkForNegativeZeroLabel = IR::LabelInstr::New(Js::OpCode::Label, instr->m_func, true); + bailOutLabel->InsertBefore(checkForNegativeZeroLabel); + + IR::Instr *insertInstr = IR::Instr::New(Js::OpCode::TST, instr->m_func); + insertInstr->SetSrc1(dst); + insertInstr->SetSrc2(dst); + bailOutLabel->InsertBefore(insertInstr); + LegalizeMD::LegalizeInstr(insertInstr, false); + + IR::Instr *branchInstr = IR::BranchInstr::New(Js::OpCode::BNE, skipBailOutLabel, instr->m_func); + bailOutLabel->InsertBefore(branchInstr); + + insertInstr = IR::Instr::New(Js::OpCode::TST, instr->m_func); + insertInstr->SetSrc1(src1); + insertInstr->SetSrc2(src1); + bailOutLabel->InsertBefore(insertInstr); + LegalizeMD::LegalizeInstr(insertInstr, false); + + branchInstr = IR::BranchInstr::New(Js::OpCode::BPL, skipBailOutLabel, instr->m_func); + bailOutLabel->InsertBefore(branchInstr); + } + // Fall through to bailOutLabel +} + +void +LowererMD::EmitLoadVar(IR::Instr *instrLoad, bool isFromUint32, bool isHelper) +{ + // MOV.32 e1, e_src1 + // TBNZ e1, #31, $Helper [uint32] -- overflows? + // ORR r1, 1<GetSrc1()->IsRegOpnd()); + Assert(instrLoad->GetDst()->GetType() == TyVar); + + bool isInt = false; + IR::Opnd *dst = instrLoad->GetDst(); + IR::RegOpnd *src1 = instrLoad->GetSrc1()->AsRegOpnd(); + IR::LabelInstr *labelHelper = nullptr; + + // TODO: Fix bad lowering. We shouldn't get TyVars here. + // Assert(instrLoad->GetSrc1()->GetType() == TyInt32); + src1->SetType(isFromUint32 ? TyUint32 : TyInt32); + + if (src1->IsTaggedInt()) + { + isInt = true; + } + else if (src1->IsNotInt()) + { + // ToVar() + this->EmitLoadVarNoCheck(dst->AsRegOpnd(), src1, instrLoad, isFromUint32, isHelper); + return; + } + + IR::RegOpnd *r1 = IR::RegOpnd::New(TyVar, m_func); + + // e1 = MOV_TRUNC src1 + // (Use 32-bit MOV_TRUNC here as we rely on the register copy to clear the upper 32 bits.) + IR::RegOpnd *e1 = r1->Copy(m_func)->AsRegOpnd(); + e1->SetType(TyInt32); + instrLoad->InsertBefore(IR::Instr::New(Js::OpCode::MOV_TRUNC, + e1, + src1, + m_func)); + + if (!isInt && isFromUint32) + { + Assert(!labelHelper); + labelHelper = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); + + // TBNZ e1, #31, $helper + IR::Instr* instr = IR::BranchInstr::New(Js::OpCode::TBNZ, labelHelper, m_func); + instr->SetSrc1(e1); + instr->SetSrc2(IR::IntConstOpnd::New(31, TyInt32, m_func)); + instrLoad->InsertBefore(instr); + } + + // The previous operation clears the top 32 bits. + // ORR r1, 1<GenerateInt32ToVarConversion(r1, instrLoad); + + // REVIEW: We need r1 only if we could generate sn = Ld_A_I4 sn. i.e. the destination and + // source are the same. + // r_dst = MOV r1 + instrLoad->InsertBefore(IR::Instr::New(Js::OpCode::MOV, + dst, + r1, + m_func)); + + if (labelHelper) + { + Assert(isFromUint32); + + // B $done + IR::LabelInstr * labelDone = IR::LabelInstr::New(Js::OpCode::Label, m_func, isHelper); + instrLoad->InsertBefore(IR::BranchInstr::New(Js::OpCode::B, labelDone, m_func)); + + // $helper + instrLoad->InsertBefore(labelHelper); + + // ToVar() + this->EmitLoadVarNoCheck(dst->AsRegOpnd(), src1, instrLoad, isFromUint32, true); + + // $done + instrLoad->InsertBefore(labelDone); + } + instrLoad->Remove(); +} + +void +LowererMD::EmitLoadVarNoCheck(IR::RegOpnd * dst, IR::RegOpnd * src, IR::Instr *instrLoad, bool isFromUint32, bool isHelper) +{ + IR::RegOpnd * floatReg = IR::RegOpnd::New(TyFloat64, this->m_func); + if (isFromUint32) + { + this->EmitUIntToFloat(floatReg, src, instrLoad); + } + else + { + this->EmitIntToFloat(floatReg, src, instrLoad); + } + this->SaveDoubleToVar(dst, floatReg, instrLoad, instrLoad, isHelper); +} + +bool +LowererMD::EmitLoadInt32(IR::Instr *instrLoad, bool conversionFromObjectAllowed, bool bailOutOnHelper, IR::LabelInstr * labelBailOut) +{ + // + // r1 = MOV src1 + // rtest = UBFX src1, AtomTag_Shift, 64 - AtomTag_Shift + // EOR rtest, 1 + // CBNZ $helper or $float + // r_dst = MOV.32 e_src1 + // B $done + // $float: + // dst = ConvertToFloat(r1, $helper) + // $helper: + // r_dst = ToInt32() + // + + Assert(instrLoad->GetSrc1()->IsRegOpnd()); + Assert(instrLoad->GetSrc1()->GetType() == TyVar); + + // TODO: Fix bad lowering. We shouldn't see TyVars here. + // Assert(instrLoad->GetDst()->GetType() == TyInt32); + + bool isInt = false; + bool isNotInt = false; + IR::Opnd *dst = instrLoad->GetDst(); + IR::RegOpnd *src1 = instrLoad->GetSrc1()->AsRegOpnd(); + IR::LabelInstr *helper = nullptr; + IR::LabelInstr *labelFloat = nullptr; + IR::LabelInstr *done = nullptr; + + if (src1->IsTaggedInt()) + { + isInt = true; + } + else if (src1->IsNotInt()) + { + isNotInt = true; + } + + if (src1->IsEqual(instrLoad->GetDst()) == false) + { + // r1 = MOV src1 + IR::RegOpnd *r1 = IR::RegOpnd::New(TyVar, instrLoad->m_func); + r1->SetValueType(src1->GetValueType()); + instrLoad->InsertBefore(IR::Instr::New(Js::OpCode::MOV, r1, src1, instrLoad->m_func)); + src1 = r1; + } + + const ValueType src1ValueType(src1->GetValueType()); + const bool doFloatToIntFastPath = + (src1ValueType.IsLikelyFloat() || src1ValueType.IsLikelyUntaggedInt()) && + !(instrLoad->HasBailOutInfo() && (instrLoad->GetBailOutKind() == IR::BailOutIntOnly || instrLoad->GetBailOutKind() == IR::BailOutExpectingInteger)); + + if (isNotInt) + { + // Known to be non-integer. If we are required to bail out on helper call, just re-jit. + if (!doFloatToIntFastPath && bailOutOnHelper) + { + if(!GlobOpt::DoEliminateArrayAccessHelperCall(this->m_func)) + { + // Array access helper call removal is already off for some reason. Prevent trying to rejit again + // because it won't help and the same thing will happen again. Just abort jitting this function. + if(PHASE_TRACE(Js::BailOutPhase, this->m_func)) + { + Output::Print(_u(" Aborting JIT because EliminateArrayAccessHelperCall is already off\n")); + Output::Flush(); + } + throw Js::OperationAbortedException(); + } + + throw Js::RejitException(RejitReason::ArrayAccessHelperCallEliminationDisabled); + } + } + else + { + // It could be an integer in this case. + if (!isInt) + { + if(doFloatToIntFastPath) + { + labelFloat = IR::LabelInstr::New(Js::OpCode::Label, instrLoad->m_func, false); + } + else + { + helper = IR::LabelInstr::New(Js::OpCode::Label, instrLoad->m_func, true); + } + + this->GenerateSmIntTest(src1, instrLoad, labelFloat ? labelFloat : helper); + } + + instrLoad->InsertBefore(IR::Instr::New(Js::OpCode::MOV_TRUNC, + dst->UseWithNewType(TyInt32, instrLoad->m_func), + src1->UseWithNewType(TyInt32, instrLoad->m_func), + instrLoad->m_func)); + + if (!isInt) + { + // JMP $done + done = instrLoad->GetOrCreateContinueLabel(); + instrLoad->InsertBefore(IR::BranchInstr::New(Js::OpCode::B, done, m_func)); + } + } + + if (!isInt) + { + if(doFloatToIntFastPath) + { + if(labelFloat) + { + instrLoad->InsertBefore(labelFloat); + } + if(!helper) + { + helper = IR::LabelInstr::New(Js::OpCode::Label, instrLoad->m_func, true); + } + + if(!done) + { + done = instrLoad->GetOrCreateContinueLabel(); + } + IR::RegOpnd* floatOpnd = this->CheckFloatAndUntag(src1, instrLoad, helper); + this->ConvertFloatToInt32(instrLoad->GetDst(), floatOpnd, helper, done, instrLoad); + } + + // $helper: + if (helper) + { + instrLoad->InsertBefore(helper); + } + if(instrLoad->HasBailOutInfo() && (instrLoad->GetBailOutKind() == IR::BailOutIntOnly || instrLoad->GetBailOutKind() == IR::BailOutExpectingInteger)) + { + // Avoid bailout if we have a JavascriptNumber whose value is a signed 32-bit integer + m_lowerer->LoadInt32FromUntaggedVar(instrLoad); + + // Need to bail out instead of calling a helper + return true; + } + + if (bailOutOnHelper) + { + Assert(labelBailOut); + m_lowerer->InsertBranch(Js::OpCode::Br, labelBailOut, instrLoad); + instrLoad->Remove(); + } + else if (conversionFromObjectAllowed) + { + m_lowerer->LowerUnaryHelperMem(instrLoad, IR::HelperConv_ToInt32); + } + else + { + m_lowerer->LowerUnaryHelperMemWithBoolReference(instrLoad, IR::HelperConv_ToInt32_NoObjects, true /*useBoolForBailout*/); + } + } + else + { + instrLoad->Remove(); + } + + return false; +} + +void +LowererMD::ImmedSrcToReg(IR::Instr * instr, IR::Opnd * newOpnd, int srcNum) +{ + if (srcNum == 2) + { + instr->SetSrc2(newOpnd); + } + else + { + Assert(srcNum == 1); + instr->SetSrc1(newOpnd); + } + + switch (instr->m_opcode) + { + case Js::OpCode::LDIMM: + instr->m_opcode = Js::OpCode::MOV; + break; + default: + // Nothing to do (unless we have immed/reg variations for other instructions). + break; + } +} + +IR::LabelInstr * +LowererMD::GetBailOutStackRestoreLabel(BailOutInfo * bailOutInfo, IR::LabelInstr * exitTargetInstr) +{ + return exitTargetInstr; +} + +StackSym * +LowererMD::GetImplicitParamSlotSym(Js::ArgSlot argSlot) +{ + return GetImplicitParamSlotSym(argSlot, this->m_func); +} + +StackSym * +LowererMD::GetImplicitParamSlotSym(Js::ArgSlot argSlot, Func * func) +{ + // For ARM, offset for implicit params always start at 0 + // TODO: Consider not to use the argSlot number for the param slot sym, which can + // be confused with arg slot number from javascript + StackSym * stackSym = StackSym::NewParamSlotSym(argSlot, func); + func->SetArgOffset(stackSym, argSlot * MachPtr); + func->SetHasImplicitParamLoad(); + return stackSym; +} + +IR::LabelInstr * +LowererMD::EnsureEHEpilogLabel() +{ + if (this->m_func->m_epilogLabel) + { + return this->m_func->m_epilogLabel; + } + + IR::Instr *exitInstr = this->m_func->m_exitInstr; + IR::Instr *prevInstr = exitInstr->GetPrevRealInstrOrLabel(); + if (prevInstr->IsLabelInstr()) + { + this->m_func->m_epilogLabel = prevInstr->AsLabelInstr(); + return prevInstr->AsLabelInstr(); + } + IR::LabelInstr *labelInstr = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + exitInstr->InsertBefore(labelInstr); + this->m_func->m_epilogLabel = labelInstr; + return labelInstr; +} + +// Helper method: inserts legalized assign for given srcOpnd into RegD0 in front of given instr in the following way: +// dstReg = InsertMove srcOpnd +// Used to put args of inline built-in call into RegD0 and RegD1 before we call actual CRT function. +void LowererMD::GenerateAssignForBuiltinArg(RegNum dstReg, IR::Opnd* srcOpnd, IR::Instr* instr) +{ + IR::RegOpnd* tempDst = IR::RegOpnd::New(nullptr, dstReg, TyMachDouble, this->m_func); + tempDst->m_isCallArg = true; // This is to make sure that lifetime of opnd is virtually extended until next CALL instr. + Lowerer::InsertMove(tempDst, srcOpnd, instr); +} + +// For given InlineMathXXX instr, generate the call to actual CRT function/CPU instr. +void LowererMD::GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMethod helperMethod) +{ + switch (instr->m_opcode) + { + case Js::OpCode::InlineMathSqrt: + // Sqrt maps directly to the VFP instruction. + // src and dst are already float, all we need is just change the opcode and legalize. + // Before: + // dst = InlineMathSqrt src1 + // After: + // + // dst = FSQRT src1 + Assert(helperMethod == (IR::JnHelperMethod)0); + Assert(instr->GetSrc2() == nullptr); + instr->m_opcode = Js::OpCode::FSQRT; + LegalizeMD::LegalizeInstr(instr, /* fPostRegAlloc = */ false); + break; + + case Js::OpCode::InlineMathAbs: + Assert(helperMethod == (IR::JnHelperMethod)0); + return GenerateFastInlineBuiltInMathAbs(instr); + + case Js::OpCode::InlineMathFloor: + case Js::OpCode::InlineMathCeil: + Assert(helperMethod == (IR::JnHelperMethod)0); + return GenerateFastInlineBuiltInMathFloorCeil(instr); + + case Js::OpCode::InlineMathRound: + Assert(helperMethod == (IR::JnHelperMethod)0); + return GenerateFastInlineBuiltInMathRound(instr); + + case Js::OpCode::InlineMathMin: + case Js::OpCode::InlineMathMax: + Assert(helperMethod == (IR::JnHelperMethod)0); + return GenerateFastInlineBuiltInMathMinMax(instr); + + default: + // Before: + // dst = src1, src2 + // After: + // d0 = InsertMove src1 + // lr = MOV helperAddr + // BLX lr + // dst = InsertMove call->dst (d0) + + // Src1 + AssertMsg(instr->GetDst()->IsFloat(), "Currently accepting only float args for math helpers -- dst."); + AssertMsg(instr->GetSrc1()->IsFloat(), "Currently accepting only float args for math helpers -- src1."); + AssertMsg(!instr->GetSrc2() || instr->GetSrc2()->IsFloat(), "Currently accepting only float args for math helpers -- src2."); + this->GenerateAssignForBuiltinArg((RegNum)FIRST_FLOAT_REG, instr->UnlinkSrc1(), instr); + + // Src2 + if (instr->GetSrc2() != nullptr) + { + this->GenerateAssignForBuiltinArg((RegNum)(FIRST_FLOAT_REG + 1), instr->UnlinkSrc2(), instr); + } + + // Call CRT. + IR::RegOpnd* floatCallDst = IR::RegOpnd::New(nullptr, (RegNum)(FIRST_FLOAT_REG), TyMachDouble, this->m_func); // Dst in d0. + IR::Instr* floatCall = IR::Instr::New(Js::OpCode::BLR, floatCallDst, this->m_func); + instr->InsertBefore(floatCall); + + // lr = MOV helperAddr + // BLX lr + IR::AddrOpnd* targetAddr = IR::AddrOpnd::New((Js::Var)IR::GetMethodOriginalAddress(m_func->GetThreadContextInfo(), helperMethod), IR::AddrOpndKind::AddrOpndKindDynamicMisc, this->m_func); + IR::RegOpnd *targetOpnd = IR::RegOpnd::New(nullptr, RegLR, TyMachPtr, this->m_func); + IR::Instr *movInstr = IR::Instr::New(Js::OpCode::LDIMM, targetOpnd, targetAddr, this->m_func); + targetOpnd->m_isCallArg = true; + floatCall->SetSrc1(targetOpnd); + floatCall->InsertBefore(movInstr); + + // Save the result. + Lowerer::InsertMove(instr->UnlinkDst(), floatCall->GetDst(), instr); + instr->Remove(); + break; + } +} + +void +LowererMD::GenerateFastInlineBuiltInMathAbs(IR::Instr *inlineInstr) +{ + IR::Opnd* src = inlineInstr->GetSrc1()->Copy(this->m_func); + IR::Opnd* dst = inlineInstr->UnlinkDst(); + Assert(src); + IR::Instr* tmpInstr; + IRType srcType = src->GetType(); + + IR::Instr* nextInstr = IR::LabelInstr::New(Js::OpCode::Label, m_func); + IR::Instr* continueInstr = m_lowerer->LowerBailOnIntMin(inlineInstr); + continueInstr->InsertAfter(nextInstr); + if (srcType == IRType::TyInt32) + { + // Note: if execution gets so far, we always get (untagged) int32 here. + Assert(src->IsRegOpnd()); + + // CMP src, #0 + tmpInstr = IR::Instr::New(Js::OpCode::CMP, this->m_func); + tmpInstr->SetSrc1(src); + tmpInstr->SetSrc2(IR::IntConstOpnd::New(0, IRType::TyInt32, this->m_func)); + nextInstr->InsertBefore(tmpInstr); + Legalize(tmpInstr); + + // dst = CSNEGPL dst, src, src + tmpInstr = IR::Instr::New(Js::OpCode::CSNEGPL, dst, src, src, this->m_func); + nextInstr->InsertBefore(tmpInstr); + Legalize(tmpInstr); + } + else if (srcType == IRType::TyFloat64) + { + // FABS dst, src + tmpInstr = IR::Instr::New(Js::OpCode::FABS, dst, src, this->m_func); + nextInstr->InsertBefore(tmpInstr); + } + else + { + AssertMsg(FALSE, "GenerateFastInlineBuiltInMathAbs: unexpected type of the src!"); + } +} + + +void +LowererMD::GenerateFastInlineMathFround(IR::Instr* instr) +{ + // Note that this is fround, not round; this operation is to + // round a double to Float32 precision. + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* dst = instr->GetDst(); + + Assert(dst->IsFloat()); + Assert(src1->IsFloat()); + + IRType srcType = src1->GetType(); + IRType dstType = dst->GetType(); + + if (srcType == TyFloat32) + { + if (dstType == TyFloat32) + { + LowererMD::ChangeToAssign(instr); + } + else + { + Assert(dstType == TyFloat64); + instr->m_opcode = Js::OpCode::FCVT; + LegalizeMD::LegalizeInstr(instr, false); + } + } + else + { + Assert(srcType == TyFloat64); + if (dstType == TyFloat32) + { + instr->m_opcode = Js::OpCode::FCVT; + LegalizeMD::LegalizeInstr(instr, false); + } + else + { + Assert(dstType == TyFloat64); + IR::RegOpnd* tempOpnd = IR::RegOpnd::New(TyFloat32, instr->m_func); + IR::Instr* shortener = IR::Instr::New(Js::OpCode::FCVT, tempOpnd, instr->UnlinkSrc1(), instr->m_func); + instr->InsertBefore(shortener); + instr->SetSrc1(tempOpnd); + instr->m_opcode = Js::OpCode::FCVT; + LegalizeMD::LegalizeInstr(instr, false); + } + } +} + +void +LowererMD::GenerateFastInlineBuiltInMathRound(IR::Instr* instr) +{ + Assert(instr->GetDst()->IsInt32()); + + IR::LabelInstr * doneLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + + // Allocate an integer register for negative zero checks if needed + IR::Opnd * negZeroReg = nullptr; + if (instr->ShouldCheckForNegativeZero()) + { + negZeroReg = IR::RegOpnd::New(TyInt64, this->m_func); + } + + // FMOV floatOpnd, src + IR::Opnd * src = instr->UnlinkSrc1(); + IR::RegOpnd* floatOpnd = IR::RegOpnd::New(TyFloat64, this->m_func); + this->m_lowerer->InsertMove(floatOpnd, src, instr); + + IR::LabelInstr * bailoutLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true);; + bool sharedBailout = (instr->GetBailOutInfo()->bailOutInstr != instr) ? true : false; + + // FMOV_GEN negZeroReg, floatOpnd (note this is done before the 0.5 add below) + if (negZeroReg) + { + instr->InsertBefore(IR::Instr::New(Js::OpCode::FMOV_GEN, negZeroReg, floatOpnd, instr->m_func)); + } + + // Add 0.5 + IR::Opnd * pointFive = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetDoublePointFiveAddr(), IRType::TyFloat64, this->m_func, IR::AddrOpndKindDynamicDoubleRef); + this->m_lowerer->InsertAdd(false, floatOpnd, floatOpnd, pointFive, instr); + + // MSR FPSR, xzr + IR::Instr* setFPSRInstr = IR::Instr::New(Js::OpCode::MSR_FPSR, instr->m_func); + setFPSRInstr->SetSrc1(IR::RegOpnd::New(nullptr, RegZR, TyUint32, instr->m_func)); + instr->InsertBefore(setFPSRInstr); + + // FCVTM intOpnd, floatOpnd + IR::Opnd * intOpnd = IR::RegOpnd::New(TyInt32, this->m_func); + instr->InsertBefore(IR::Instr::New(Js::OpCode::FCVTM, intOpnd, floatOpnd, instr->m_func)); + + // FCVTM would set FPSR.IOC (0th bit in FPSR) if the source cannot be represented within the destination register + + // MRS exceptReg, FPSR + IR::Opnd * exceptReg = IR::RegOpnd::New(TyUint32, this->m_func); + instr->InsertBefore(IR::Instr::New(Js::OpCode::MRS_FPSR, exceptReg, instr->m_func)); + + IR::LabelInstr* checkOverflowLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + + // CBNZ intOpnd, done/checkOverflow + IR::BranchInstr * cbnzInstr = cbnzInstr = IR::BranchInstr::New(Js::OpCode::CBNZ, checkOverflowLabel, instr->m_func); + cbnzInstr->SetSrc1(intOpnd); + instr->InsertBefore(cbnzInstr); + + if (negZeroReg) + { + // TBZ negZeroReg, 63 + IR::BranchInstr * tbzInstr = IR::BranchInstr::New(Js::OpCode::TBZ, doneLabel, instr->m_func); + tbzInstr->SetSrc1(negZeroReg); + tbzInstr->SetSrc2(IR::IntConstOpnd::New(63, TyMachReg, instr->m_func)); + instr->InsertBefore(tbzInstr); + + Lowerer::InsertBranch(LowererMD::MDUncondBranchOpcode, bailoutLabel, instr); + } + + + instr->InsertBefore(checkOverflowLabel); + + // TBZ exceptReg, #0, done + IR::BranchInstr * tbzInstr = IR::BranchInstr::New(Js::OpCode::TBZ, doneLabel, instr->m_func); + tbzInstr->SetSrc1(exceptReg); + tbzInstr->SetSrc2(IR::IntConstOpnd::New(0, TyMachReg, instr->m_func)); + instr->InsertBefore(tbzInstr); + + IR::Opnd * dst = instr->UnlinkDst(); + instr->InsertAfter(doneLabel); + if (!sharedBailout) + { + instr->InsertBefore(bailoutLabel); + } + + // In case of a shared bailout, we should jump to the code that sets some data on the bailout record which is specific + // to this bailout. Pass the bailoutLabel to GenerateFunction so that it may use the label as the collectRuntimeStatsLabel. + this->m_lowerer->GenerateBailOut(instr, nullptr, nullptr, sharedBailout ? bailoutLabel : nullptr); + + // MOV dst, intOpnd + IR::Instr* movInstr = IR::Instr::New(Js::OpCode::MOV, dst, intOpnd, this->m_func); + doneLabel->InsertAfter(movInstr); +} + +void +LowererMD::GenerateFastInlineBuiltInMathFloorCeil(IR::Instr* instr) +{ + Assert(instr->GetDst()->IsInt32()); + + IR::LabelInstr * doneLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + + // Allocate an integer register for negative zero checks if needed + IR::Opnd * negZeroReg = nullptr; + if (instr->ShouldCheckForNegativeZero()) + { + negZeroReg = IR::RegOpnd::New(TyInt64, this->m_func); + } + + // FMOV floatOpnd, src + IR::Opnd * src = instr->UnlinkSrc1(); + IR::RegOpnd* floatOpnd = IR::RegOpnd::New(TyFloat64, this->m_func); + this->m_lowerer->InsertMove(floatOpnd, src, instr); + + IR::LabelInstr * bailoutLabel = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true);; + bool sharedBailout = (instr->GetBailOutInfo()->bailOutInstr != instr) ? true : false; + + // MSR FPSR, xzr + IR::Instr* setFPSRInstr = IR::Instr::New(Js::OpCode::MSR_FPSR, instr->m_func); + setFPSRInstr->SetSrc1(IR::RegOpnd::New(nullptr, RegZR, TyUint32, instr->m_func)); + instr->InsertBefore(setFPSRInstr); + + // FMOV_GEN negZeroReg, floatOpnd (note this is done before the 0.5 add below) + if (negZeroReg) + { + instr->InsertBefore(IR::Instr::New(Js::OpCode::FMOV_GEN, negZeroReg, floatOpnd, instr->m_func)); + } + + // FCVTM/FCVTP intOpnd, floatOpnd + IR::Opnd * intOpnd = IR::RegOpnd::New(TyInt32, this->m_func); + instr->InsertBefore(IR::Instr::New((instr->m_opcode == Js::OpCode::InlineMathCeil) ? Js::OpCode::FCVTP : Js::OpCode::FCVTM, intOpnd, floatOpnd, instr->m_func)); + + // EOR negZeroReg, #0x8000000000000000 + if (negZeroReg) + { + instr->InsertBefore(IR::Instr::New(Js::OpCode::EOR, negZeroReg, negZeroReg, IR::IntConstOpnd::New(0x8000000000000000ULL, IRType::TyInt64, this->m_func), instr->m_func)); + } + + // FCVTM would set FPSR.IOC (0th bit in FPSR) if the source cannot be represented within the destination register + + // MRS exceptReg, FPSR + IR::Opnd * exceptReg = IR::RegOpnd::New(TyUint32, this->m_func); + instr->InsertBefore(IR::Instr::New(Js::OpCode::MRS_FPSR, exceptReg, instr->m_func)); + + // CBZ negZeroReg, bailout + if (negZeroReg) + { + IR::BranchInstr * cbzInstr = IR::BranchInstr::New(Js::OpCode::CBZ, bailoutLabel, instr->m_func); + cbzInstr->SetSrc1(negZeroReg); + instr->InsertBefore(cbzInstr); + } + + // TBZ exceptReg, #0, done + IR::BranchInstr * tbzInstr = IR::BranchInstr::New(Js::OpCode::TBZ, doneLabel, instr->m_func); + tbzInstr->SetSrc1(exceptReg); + tbzInstr->SetSrc2(IR::IntConstOpnd::New(0, TyMachReg, instr->m_func)); + instr->InsertBefore(tbzInstr); + + IR::Opnd * dst = instr->UnlinkDst(); + instr->InsertAfter(doneLabel); + if(!sharedBailout) + { + instr->InsertBefore(bailoutLabel); + } + + // In case of a shared bailout, we should jump to the code that sets some data on the bailout record which is specific + // to this bailout. Pass the bailoutLabel to GenerateFunction so that it may use the label as the collectRuntimeStatsLabel. + this->m_lowerer->GenerateBailOut(instr, nullptr, nullptr, sharedBailout ? bailoutLabel : nullptr); + + // MOV dst, intOpnd + IR::Instr* movInstr = IR::Instr::New(Js::OpCode::MOV, dst, intOpnd, this->m_func); + doneLabel->InsertAfter(movInstr); +} + +void +LowererMD::GenerateFastInlineBuiltInMathMinMax(IR::Instr* instr) +{ + IR::Opnd* dst = instr->GetDst(); + + if (dst->IsInt32()) + { + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + + // CMP src1, src2 + IR::Instr* cmpInstr = IR::Instr::New(Js::OpCode::CMP, instr->m_func); + cmpInstr->SetSrc1(src1); + cmpInstr->SetSrc2(src2); + instr->InsertBefore(cmpInstr); + Legalize(cmpInstr); + + // (min) CSELLT dst, src1, src2 + // (max) CSELLT dst, src2, src1 + IR::Opnd* op1 = (instr->m_opcode == Js::OpCode::InlineMathMin) ? src1 : src2; + IR::Opnd* op2 = (instr->m_opcode == Js::OpCode::InlineMathMin) ? src2 : src1; + IR::Instr * csellinstr = IR::Instr::New(Js::OpCode::CSELLT, dst, op1, op2, instr->m_func); + instr->InsertBefore(csellinstr); + Legalize(csellinstr); + + instr->Remove(); + } + + else if (dst->IsFloat64()) + { + // (min) FMIN dst, src1, src2 + // (max) FMAX dst, src1, src2 + instr->m_opcode = (instr->m_opcode == Js::OpCode::InlineMathMin) ? Js::OpCode::FMIN : Js::OpCode::FMAX; + } +} + +IR::Instr * +LowererMD::LowerToFloat(IR::Instr *instr) +{ + switch (instr->m_opcode) + { + case Js::OpCode::Add_A: + instr->m_opcode = Js::OpCode::FADD; + break; + + case Js::OpCode::Sub_A: + instr->m_opcode = Js::OpCode::FSUB; + break; + + case Js::OpCode::Mul_A: + instr->m_opcode = Js::OpCode::FMUL; + break; + + case Js::OpCode::Div_A: + instr->m_opcode = Js::OpCode::FDIV; + break; + + case Js::OpCode::Neg_A: + instr->m_opcode = Js::OpCode::FNEG; + break; + + case Js::OpCode::BrEq_A: + case Js::OpCode::BrNeq_A: + case Js::OpCode::BrSrEq_A: + case Js::OpCode::BrSrNeq_A: + case Js::OpCode::BrGt_A: + case Js::OpCode::BrGe_A: + case Js::OpCode::BrLt_A: + case Js::OpCode::BrLe_A: + case Js::OpCode::BrNotEq_A: + case Js::OpCode::BrNotNeq_A: + case Js::OpCode::BrSrNotEq_A: + case Js::OpCode::BrSrNotNeq_A: + case Js::OpCode::BrNotGt_A: + case Js::OpCode::BrNotGe_A: + case Js::OpCode::BrNotLt_A: + case Js::OpCode::BrNotLe_A: + return this->LowerFloatCondBranch(instr->AsBranchInstr()); + + default: + Assume(UNREACHED); + } + + LegalizeMD::LegalizeInstr(instr, false); + return instr; +} + +IR::BranchInstr * +LowererMD::LowerFloatCondBranch(IR::BranchInstr *instrBranch, bool ignoreNaN) +{ + IR::Instr *instr; + Js::OpCode brOpcode = Js::OpCode::InvalidOpCode; + bool addNaNCheck = false; + + Func * func = instrBranch->m_func; + IR::Opnd *src1 = instrBranch->UnlinkSrc1(); + IR::Opnd *src2 = instrBranch->UnlinkSrc2(); + + IR::Instr *instrCmp = IR::Instr::New(Js::OpCode::FCMP, func); + instrCmp->SetSrc1(src1); + instrCmp->SetSrc2(src2); + instrBranch->InsertBefore(instrCmp); + LegalizeMD::LegalizeInstr(instrCmp, false); + + switch (instrBranch->m_opcode) + { + case Js::OpCode::BrSrEq_A: + case Js::OpCode::BrEq_A: + case Js::OpCode::BrNotNeq_A: + case Js::OpCode::BrSrNotNeq_A: + brOpcode = Js::OpCode::BEQ; + break; + + case Js::OpCode::BrNeq_A: + case Js::OpCode::BrSrNeq_A: + case Js::OpCode::BrSrNotEq_A: + case Js::OpCode::BrNotEq_A: + brOpcode = Js::OpCode::BNE; + addNaNCheck = !ignoreNaN; //Special check for BNE as it is set when the operands are unordered (NaN). + break; + + case Js::OpCode::BrLe_A: + brOpcode = Js::OpCode::BLS; //Can't use BLE as it is set when the operands are unordered (NaN). + break; + + case Js::OpCode::BrLt_A: + brOpcode = Js::OpCode::BCC; //Can't use BLT as is set when the operands are unordered (NaN). + break; + + case Js::OpCode::BrGe_A: + brOpcode = Js::OpCode::BGE; + break; + + case Js::OpCode::BrGt_A: + brOpcode = Js::OpCode::BGT; + break; + + case Js::OpCode::BrNotLe_A: + brOpcode = Js::OpCode::BHI; + break; + + case Js::OpCode::BrNotLt_A: + brOpcode = Js::OpCode::BPL; + break; + + case Js::OpCode::BrNotGe_A: + brOpcode = Js::OpCode::BLT; + break; + + case Js::OpCode::BrNotGt_A: + brOpcode = Js::OpCode::BLE; + break; + + default: + Assert(false); + break; + } + + if (addNaNCheck) + { + instr = IR::BranchInstr::New(Js::OpCode::BVS, instrBranch->GetTarget(), func); + instrBranch->InsertBefore(instr); + } + + instr = IR::BranchInstr::New(brOpcode, instrBranch->GetTarget(), func); + instrBranch->InsertBefore(instr); + + instrBranch->Remove(); + + return instr->AsBranchInstr(); +} + +void +LowererMD::EmitIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) +{ + IR::Instr *instr; + + Assert(dst->IsRegOpnd() && dst->IsFloat64()); + Assert(src->IsRegOpnd() && src->IsInt32()); + + // Convert to Float + instr = IR::Instr::New(Js::OpCode::FCVT, dst, src, this->m_func); + instrInsert->InsertBefore(instr); +} + +void +LowererMD::EmitUIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) +{ + IR::Instr *instr; + + Assert(dst->IsRegOpnd() && dst->IsFloat64()); + Assert(src->IsRegOpnd() && src->IsUInt32()); + + // Convert to Float + instr = IR::Instr::New(Js::OpCode::FCVT, dst, src, this->m_func); + instrInsert->InsertBefore(instr); +} + +void LowererMD::ConvertFloatToInt32(IR::Opnd* intOpnd, IR::Opnd* floatOpnd, IR::LabelInstr * labelHelper, IR::LabelInstr * labelDone, IR::Instr * instrInsert) +{ + Assert(floatOpnd->IsFloat64()); + Assert(intOpnd->IsInt32()); + + // VCVTS32F64 dst.i32, src.f64 + // Convert to int + // ARM64_WORKITEM: On ARM32 this used the current rounding mode; here we are explicitly rounding toward zero -- is that ok? + IR::Instr * instr = IR::Instr::New(Js::OpCode::FCVTZ, intOpnd, floatOpnd, this->m_func); + instrInsert->InsertBefore(instr); + Legalize(instr); + + this->CheckOverflowOnFloatToInt32(instrInsert, intOpnd, labelHelper, labelDone); +} + +void +LowererMD::EmitIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) +{ + Assert(UNREACHED); +} + +void +LowererMD::EmitUIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) +{ + Assert(UNREACHED); +} + +void +LowererMD::EmitLongToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) +{ + Assert(UNREACHED); +} + +void +LowererMD::CheckOverflowOnFloatToInt32(IR::Instr* instrInsert, IR::Opnd* intOpnd, IR::LabelInstr * labelHelper, IR::LabelInstr * labelDone) +{ + // Test for 0x80000000 or 0x7FFFFFFF + + // tmp = EOR src, 0x80000000; gives 0 or -1 for overflow values + // tmp = EOR_ASR31 tmp, tmp; tmp = tmp ^ ((int32)tmp >> 31) -- converts -1 or 0 to 0 + // CBZ tmp, helper; branch if tmp was -1 or 0 + // B done; + + IR::RegOpnd* tmp = IR::RegOpnd::New(TyInt32, this->m_func); + + IR::Instr* instr = IR::Instr::New(Js::OpCode::EOR, tmp, intOpnd, IR::IntConstOpnd::New(0x80000000, TyUint32, this->m_func, true), this->m_func); + instrInsert->InsertBefore(instr); + + instr = IR::Instr::New(Js::OpCode::EOR_ASR31, tmp, tmp, tmp, this->m_func); + instrInsert->InsertBefore(instr); + + // CBZ $helper + instr = IR::BranchInstr::New(Js::OpCode::CBZ, labelHelper, this->m_func); + instr->SetSrc1(tmp); + instrInsert->InsertBefore(instr); + + // B $done + instr = IR::BranchInstr::New(Js::OpCode::B, labelDone, this->m_func); + instrInsert->InsertBefore(instr); +} + +void +LowererMD::EmitFloatToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert, IR::Instr * instrBailOut, IR::LabelInstr * labelBailOut) +{ + IR::BailOutKind bailOutKind = IR::BailOutInvalid; + if (instrBailOut && instrBailOut->HasBailOutInfo()) + { + bailOutKind = instrBailOut->GetBailOutKind(); + if (bailOutKind & IR::BailOutOnArrayAccessHelperCall) + { + // Bail out instead of calling helper. If this is happening unconditionally, the caller should instead throw a rejit exception. + Assert(labelBailOut); + m_lowerer->InsertBranch(Js::OpCode::Br, labelBailOut, instrInsert); + return; + } + } + + IR::LabelInstr *labelDone = IR::LabelInstr::New(Js::OpCode::Label, this->m_func); + IR::LabelInstr *labelHelper = IR::LabelInstr::New(Js::OpCode::Label, this->m_func, true); + IR::Instr *instr; + + ConvertFloatToInt32(dst, src, labelHelper, labelDone, instrInsert); + + // $Helper + instrInsert->InsertBefore(labelHelper); + + instr = IR::Instr::New(Js::OpCode::Call, dst, this->m_func); + instrInsert->InsertBefore(instr); + + if (BailOutInfo::IsBailOutOnImplicitCalls(bailOutKind)) + { + _Analysis_assume_(instrBailOut != nullptr); + instr = instr->ConvertToBailOutInstr(instrBailOut->GetBailOutInfo(), bailOutKind); + if (instrBailOut->GetBailOutInfo()->bailOutInstr == instrBailOut) + { + IR::Instr * instrShare = instrBailOut->ShareBailOut(); + m_lowerer->LowerBailTarget(instrShare); + } + } + + // dst = ToInt32Core(src); + LoadDoubleHelperArgument(instr, src); + + this->ChangeToHelperCall(instr, IR::HelperConv_ToInt32Core); + + // $Done + instrInsert->InsertBefore(labelDone); +} + +IR::Instr * +LowererMD::InsertConvertFloat64ToInt32(const RoundMode roundMode, IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr) +{ + Assert(dst); + Assert(dst->IsInt32()); + Assert(src); + Assert(src->IsFloat64()); + Assert(insertBeforeInstr); + + // The caller is expected to check for overflow. To have that work be done automatically, use LowererMD::EmitFloatToInt. + + Func *const func = insertBeforeInstr->m_func; + IR::AutoReuseOpnd autoReuseSrcPlusHalf; + IR::Instr *instr = nullptr; + + switch (roundMode) + { + case RoundModeTowardInteger: + case RoundModeHalfToEven: + { + // Conversion with rounding towards nearest integer is not supported by the architecture. Add 0.5 and do a + // round-toward-zero conversion instead. + IR::RegOpnd *const srcPlusHalf = IR::RegOpnd::New(TyFloat64, func); + autoReuseSrcPlusHalf.Initialize(srcPlusHalf, func); + Lowerer::InsertAdd( + false /* needFlags */, + srcPlusHalf, + src, + IR::MemRefOpnd::New(insertBeforeInstr->m_func->GetThreadContextInfo()->GetDoublePointFiveAddr(), TyFloat64, func, + IR::AddrOpndKindDynamicDoubleRef), + insertBeforeInstr); + + instr = IR::Instr::New(LowererMD::MDConvertFloat64ToInt32Opcode(RoundModeTowardZero), dst, srcPlusHalf, func); + + insertBeforeInstr->InsertBefore(instr); + LowererMD::Legalize(instr); + return instr; + } + default: + AssertMsg(0, "RoundMode not supported."); + return nullptr; + } +} + +IR::Instr * +LowererMD::LoadFloatZero(IR::Opnd * opndDst, IR::Instr * instrInsert) +{ + Assert(opndDst->GetType() == TyFloat64); + IR::Opnd * zero = IR::MemRefOpnd::New(instrInsert->m_func->GetThreadContextInfo()->GetDoubleZeroAddr(), TyFloat64, instrInsert->m_func, IR::AddrOpndKindDynamicDoubleRef); + + // Todo(magardn): Make sure the correct opcode is used for moving between float and non-float regs (FMOV_GEN) + return Lowerer::InsertMove(opndDst, zero, instrInsert); +} + +IR::Instr * +LowererMD::LoadFloatValue(IR::Opnd * opndDst, double value, IR::Instr * instrInsert) +{ + // Floating point zero is a common value to load. Let's use a single memory location instead of allocating new memory for each. + const bool isFloatZero = value == 0.0 && !Js::JavascriptNumber::IsNegZero(value); // (-0.0 == 0.0) yields true + if (isFloatZero) + { + return LowererMD::LoadFloatZero(opndDst, instrInsert); + } + void * pValue = NativeCodeDataNewNoFixup(instrInsert->m_func->GetNativeCodeDataAllocator(), DoubleType, value); + IR::Opnd * opnd; + if (instrInsert->m_func->IsOOPJIT()) + { + int offset = NativeCodeData::GetDataTotalOffset(pValue); + auto addressRegOpnd = IR::RegOpnd::New(TyMachPtr, instrInsert->m_func); + + Lowerer::InsertMove( + addressRegOpnd, + IR::MemRefOpnd::New(instrInsert->m_func->GetWorkItem()->GetWorkItemData()->nativeDataAddr, TyMachPtr, instrInsert->m_func, IR::AddrOpndKindDynamicNativeCodeDataRef), + instrInsert); + + opnd = IR::IndirOpnd::New(addressRegOpnd, offset, TyMachDouble, +#if DBG + NativeCodeData::GetDataDescription(pValue, instrInsert->m_func->m_alloc), +#endif + instrInsert->m_func, true); + } + else + { + opnd = IR::MemRefOpnd::New((void*)pValue, TyMachDouble, instrInsert->m_func); + } + IR::Instr * instr = IR::Instr::New(Js::OpCode::FLDR, opndDst, opnd, instrInsert->m_func); + instrInsert->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr,false); + return instr; +} + +void LowererMD::GenerateFloatTest(IR::RegOpnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr* labelHelper, const bool checkForNullInLoopBody) +{ + if (opndSrc->GetValueType().IsFloat()) + { + return; + } + + // TST s1, floatTagReg + IR::Opnd* floatTag = IR::IntConstOpnd::New(Js::FloatTag_Value, TyMachReg, this->m_func, /* dontEncode = */ true); + IR::Instr* instr = IR::Instr::New(Js::OpCode::TST, this->m_func); + instr->SetSrc1(opndSrc); + instr->SetSrc2(floatTag); + insertInstr->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + + // BZ $helper + instr = IR::BranchInstr::New(Js::OpCode::BEQ /* BZ */, labelHelper, this->m_func); + insertInstr->InsertBefore(instr); +} + +IR::RegOpnd* LowererMD::CheckFloatAndUntag(IR::RegOpnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr* labelHelper) +{ + IR::Opnd* floatTag = IR::IntConstOpnd::New(Js::FloatTag_Value, TyMachReg, this->m_func, /* dontEncode = */ true); + + // MOV floatTagReg, FloatTag_Value + if (!opndSrc->GetValueType().IsFloat()) + { + // TST s1, floatTagReg + IR::Instr* instr = IR::Instr::New(Js::OpCode::TST, this->m_func); + instr->SetSrc1(opndSrc); + instr->SetSrc2(floatTag); + insertInstr->InsertBefore(instr); + LegalizeMD::LegalizeInstr(instr, false); + + // BZ $helper + instr = IR::BranchInstr::New(Js::OpCode::BEQ /* BZ */, labelHelper, this->m_func); + insertInstr->InsertBefore(instr); + } + + IR::RegOpnd* untaggedFloat = IR::RegOpnd::New(TyMachReg, this->m_func); + IR::Instr* instr = IR::Instr::New(Js::OpCode::EOR, untaggedFloat, opndSrc, floatTag, this->m_func); + insertInstr->InsertBefore(instr); + + IR::RegOpnd *floatReg = IR::RegOpnd::New(TyMachDouble, this->m_func); + instr = IR::Instr::New(Js::OpCode::FMOV_GEN, floatReg, untaggedFloat, this->m_func); + insertInstr->InsertBefore(instr); + return floatReg; +} + +template +void +LowererMD::Legalize(IR::Instr *const instr, bool fPostRegAlloc) +{ + if (verify) + { + // NYI for the rest of legalization + return; + } + LegalizeMD::LegalizeInstr(instr, fPostRegAlloc); +} + +template void LowererMD::Legalize(IR::Instr *const instr, bool fPostRegalloc); +#if DBG +template void LowererMD::Legalize(IR::Instr *const instr, bool fPostRegalloc); +#endif + +void +LowererMD::FinalLower() +{ + NoRecoverMemoryArenaAllocator tempAlloc(_u("BE-ARMFinalLower"), m_func->m_alloc->GetPageAllocator(), Js::Throw::OutOfMemory); + EncodeReloc *pRelocList = nullptr; + + size_t totalJmpTableSizeInBytes = 0; + + uintptr_t instrOffset = 0; + FOREACH_INSTR_BACKWARD_EDITING_IN_RANGE(instr, instrPrev, this->m_func->m_tailInstr, this->m_func->m_headInstr) + { + if (instr->IsLowered() == false) + { + if (instr->IsLabelInstr()) + { + //This is not the real set, Real offset gets set in encoder. + IR::LabelInstr *labelInstr = instr->AsLabelInstr(); + labelInstr->SetOffset(instrOffset); + } + + switch (instr->m_opcode) + { + case Js::OpCode::Ret: + instr->Remove(); + break; + case Js::OpCode::Leave: + Assert(this->m_func->DoOptimizeTry() && !this->m_func->IsLoopBodyInTry()); + instrPrev = m_lowerer->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/); + break; + } + } + else + { + instrOffset = instrOffset + MachMaxInstrSize; + + if (instr->IsBranchInstr()) + { + IR::BranchInstr *branchInstr = instr->AsBranchInstr(); + + if (branchInstr->IsMultiBranch()) + { + Assert(instr->GetSrc1() && instr->GetSrc1()->IsRegOpnd()); + IR::MultiBranchInstr * multiBranchInstr = instr->AsBranchInstr()->AsMultiBrInstr(); + + if (multiBranchInstr->m_isSwitchBr && + (multiBranchInstr->m_kind == IR::MultiBranchInstr::IntJumpTable || multiBranchInstr->m_kind == IR::MultiBranchInstr::SingleCharStrJumpTable)) + { + BranchJumpTableWrapper * branchJumpTableWrapper = multiBranchInstr->GetBranchJumpTable(); + totalJmpTableSizeInBytes += (branchJumpTableWrapper->tableSize * sizeof(void*)); + + // instrOffset is relative to the end of the function. Jump tables come after the function and so would result in negative offsets. label offsets + // are unsigned so instead give jump table lables offsets relative to the end of the jump table section. + branchJumpTableWrapper->labelInstr->SetOffset(totalJmpTableSizeInBytes); + } + } + else if (!LowererMD::IsUnconditionalBranch(branchInstr)) //Ignore other direct branches + { + uintptr_t targetOffset = branchInstr->GetTarget()->GetOffset(); + + if (targetOffset != 0) + { + // this is forward reference + if (LegalizeMD::LegalizeDirectBranch(branchInstr, instrOffset)) + { + //There might be an instruction inserted for legalizing conditional branch + instrOffset = instrOffset + MachMaxInstrSize; + } + } + else + { + EncodeReloc::New(&pRelocList, RelocTypeBranch19, (BYTE*)instrOffset, branchInstr, &tempAlloc); + //Assume this is a backward long branch, we shall fix up after complete pass, be conservative here + instrOffset = instrOffset + MachMaxInstrSize; + } + } + } + else if (LowererMD::IsAssign(instr) || instr->m_opcode == Js::OpCode::LEA || instr->m_opcode == Js::OpCode::LDARGOUTSZ || instr->m_opcode == Js::OpCode::REM) + { + // Cleanup spill code + // INSTR_BACKWARD_EDITING_IN_RANGE implies that next loop iteration will use instrPrev (instr->m_prev computed before entering current loop iteration). + IR::Instr* instrNext = instr->m_next; + bool canExpand = this->FinalLowerAssign(instr); + + if (canExpand) + { + uint32 expandedInstrCount = 0; // The number of instrs the LDIMM expands into. + FOREACH_INSTR_IN_RANGE(instrCount, instrPrev->m_next, instrNext) + { + ++expandedInstrCount; + } + NEXT_INSTR_IN_RANGE; + Assert(expandedInstrCount > 0); + + // Adjust the offset for expanded instrs. + instrOffset += (expandedInstrCount - 1) * MachMaxInstrSize; // We already accounted for one MachMaxInstrSize. + } + } + + if (instr->m_opcode == Js::OpCode::ADR) + { + IR::LabelInstr* label = instr->GetSrc1()->AsLabelOpnd()->GetLabel(); + if (label->GetOffset() != 0 && !label->m_isDataLabel) + { + // this is forward reference + if (LegalizeMD::LegalizeAdrOffset(instr, instrOffset)) + { + //Additional instructions were inserted. + instrOffset = instrOffset + MachMaxInstrSize * 2; + } + } + else + { + EncodeReloc::New(&pRelocList, RelocTypeLabelAdr, (BYTE*)instrOffset, instr, &tempAlloc); + //Assume this is a backward long branch, we shall fix up after complete pass, be conservative here + instrOffset = instrOffset + MachMaxInstrSize * 2; + } + } + } + } NEXT_INSTR_BACKWARD_EDITING_IN_RANGE; + + //Fixup all the backward branches + for (EncodeReloc *reloc = pRelocList; reloc; reloc = reloc->m_next) + { + uintptr_t relocAddress = (uintptr_t)reloc->m_consumerOffset; + + switch (reloc->m_relocType) + { + case RelocTypeBranch19: + AssertMsg(relocAddress < reloc->m_relocInstr->AsBranchInstr()->GetTarget()->GetOffset(), "Only backward branches require fixup"); + LegalizeMD::LegalizeDirectBranch(reloc->m_relocInstr->AsBranchInstr(), relocAddress); + break; + + case RelocTypeLabelAdr: + { + IR::LabelInstr* label = reloc->m_relocInstr->GetSrc1()->AsLabelOpnd()->GetLabel(); + if (label->m_isDataLabel) + { + uintptr_t dataOffset; + if (label == m_func->GetFuncStartLabel()) + { + dataOffset = instrOffset - relocAddress; + } + else if (label == m_func->GetFuncEndLabel()) + { + dataOffset = relocAddress; + } + else + { + Assert(label->GetOffset() != 0); + + // jump table label offsets are relative to the end of the jump table area. + dataOffset = relocAddress + totalJmpTableSizeInBytes - label->GetOffset(); + + // PC is a union with offset. Encoder expects this to be nullptr for jump table labels. + label->SetPC(nullptr); + } + + LegalizeMD::LegalizeDataAdr(reloc->m_relocInstr, dataOffset); + break; + } + + AssertMsg(relocAddress < label->GetOffset(), "Only backward branches require fixup"); + LegalizeMD::LegalizeAdrOffset(reloc->m_relocInstr, relocAddress); + break; + } + default: + Assert(false); + } + } +} + +// Returns true, if and only if the assign may expand into multiple instrs. +bool +LowererMD::FinalLowerAssign(IR::Instr * instr) +{ + if (instr->m_opcode == Js::OpCode::LDIMM) + { + LegalizeMD::LegalizeInstr(instr, true); + + // LDIMM can expand into up to 4 instructions when the immediate is more than 16 bytes, + // it can also expand into multiple different no-op (normally MOV) instrs when we obfuscate it, which is randomly. + return true; + } + else if (EncoderMD::IsLoad(instr) || instr->m_opcode == Js::OpCode::LEA) + { + Assert(instr->GetDst()->IsRegOpnd()); + if (!instr->GetSrc1()->IsRegOpnd()) + { + LegalizeMD::LegalizeSrc(instr, instr->GetSrc1(), 1, true); + return true; + } + instr->m_opcode = instr->GetSrc1()->IsFloat() ? Js::OpCode::FMOV : Js::OpCode::MOV; + } + else if (EncoderMD::IsStore(instr)) + { + Assert(instr->GetSrc1()->IsRegOpnd()); + if (!instr->GetDst()->IsRegOpnd()) + { + LegalizeMD::LegalizeDst(instr, true); + return true; + } + instr->m_opcode = instr->GetDst()->IsFloat() ? Js::OpCode::FMOV : Js::OpCode::MOV; + } + else if (instr->m_opcode == Js::OpCode::LDARGOUTSZ) + { + Assert(instr->GetDst()->IsRegOpnd()); + Assert((instr->GetSrc1() == nullptr) && (instr->GetSrc2() == nullptr)); + // dst = LDARGOUTSZ + // This loads the function's arg out area size into the dst operand. We need a pseudo-op, + // because we generate the instruction during Lower but don't yet know the value of the constant it needs + // to load. Change it to the appropriate LDIMM here. + uint32 argOutSize = UInt32Math::Mul(this->m_func->m_argSlotsForFunctionsCalled, MachRegInt, Js::Throw::OutOfMemory); + instr->SetSrc1(IR::IntConstOpnd::New(argOutSize, TyMachReg, this->m_func)); + instr->m_opcode = Js::OpCode::LDIMM; + LegalizeMD::LegalizeInstr(instr, true); + return true; + } + else if (instr->m_opcode == Js::OpCode::REM) + { + IR::Opnd* dst = instr->GetDst(); + IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* src2 = instr->GetSrc2(); + + Assert(src1->IsRegOpnd()); + Assert(src2->IsRegOpnd()); + + RegNum dstReg = dst->AsRegOpnd()->GetReg(); + + if (dstReg == src1->AsRegOpnd()->GetReg() || dstReg == src2->AsRegOpnd()->GetReg()) + { + Assert(src1->AsRegOpnd()->GetReg() != SCRATCH_REG); + Assert(src2->AsRegOpnd()->GetReg() != SCRATCH_REG); + Assert(src1->GetType() == src2->GetType()); + + // r17 = SDIV src1, src2 + IR::RegOpnd *regScratch = IR::RegOpnd::New(nullptr, SCRATCH_REG, src1->GetType(), instr->m_func); + IR::Instr *insertInstr = IR::Instr::New(Js::OpCode::SDIV, regScratch, src1, src2, instr->m_func); + instr->InsertBefore(insertInstr); + + // r17 = MSUB src1, src2, r17 (r17 = src1 - src2 * r17) + insertInstr = IR::Instr::New(Js::OpCode::MSUB, regScratch, src1, src2, instr->m_func); + instr->InsertBefore(insertInstr); + + // mov dst, r17 + insertInstr = IR::Instr::New(dst->IsFloat() ? Js::OpCode::FMOV : Js::OpCode::MOV, dst, regScratch, instr->m_func); + instr->InsertBefore(insertInstr); + instr->Remove(); + } + else + { + // dst = SDIV src1, src2 + IR::Instr *divInstr = IR::Instr::New(Js::OpCode::SDIV, dst, src1, src2, instr->m_func); + instr->InsertBefore(divInstr); + + // dst = MSUB src1, src2, dst (dst = src1 - src2 * dst) + instr->m_opcode = Js::OpCode::MSUB; + } + return true; + } + + return false; +} +IR::Opnd * +LowererMD::GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stackArgsInstr) +{ + return this->m_lowerer->GenerateArgOutForStackArgs(callInstr, stackArgsInstr); +} + +IR::Instr * +LowererMD::LowerDivI4AndBailOnReminder(IR::Instr * instr, IR::LabelInstr * bailOutLabel) +{ + // result = SDIV numerator, denominator + // mulResult = MUL result, denominator + // CMP mulResult, numerator + // BNE bailout + // + // dst = MOV result <-- insertBeforeInstr + + + instr->m_opcode = Js::OpCode::SDIV; + + // delay assigning to the final dst. + IR::Instr * sinkedInstr = instr->SinkDst(Js::OpCode::MOV); + LegalizeMD::LegalizeInstr(instr, false); + LegalizeMD::LegalizeInstr(sinkedInstr, false); + + IR::Opnd * resultOpnd = instr->GetDst(); + IR::Opnd * numerator = instr->GetSrc1(); + IR::Opnd * denominatorOpnd = instr->GetSrc2(); + + // Insert all check before the assignment to the actual + IR::Instr * insertBeforeInstr = instr->m_next; + + // Jump to bailout if the reminder is not 0 (or the divResult * denominator is not same as the numerator) + IR::RegOpnd * mulResult = IR::RegOpnd::New(TyInt32, m_func); + IR::Instr * mulInstr = IR::Instr::New(Js::OpCode::MUL, mulResult, resultOpnd, denominatorOpnd, m_func); + insertBeforeInstr->InsertBefore(mulInstr); + LegalizeMD::LegalizeInstr(mulInstr, false); + + this->m_lowerer->InsertCompareBranch(mulResult, numerator, Js::OpCode::BrNeq_A, bailOutLabel, insertBeforeInstr); + return insertBeforeInstr; +} + +void +LowererMD::LowerInlineSpreadArgOutLoop(IR::Instr *callInstr, IR::RegOpnd *indexOpnd, IR::RegOpnd *arrayElementsStartOpnd) +{ + this->m_lowerer->LowerInlineSpreadArgOutLoopUsingRegisters(callInstr, indexOpnd, arrayElementsStartOpnd); +} + +void +LowererMD::LowerTypeof(IR::Instr* typeOfInstr) +{ + Func * func = typeOfInstr->m_func; + IR::Opnd * src1 = typeOfInstr->GetSrc1(); + IR::Opnd * dst = typeOfInstr->GetDst(); + Assert(src1->IsRegOpnd() && dst->IsRegOpnd()); + IR::LabelInstr * helperLabel = IR::LabelInstr::New(Js::OpCode::Label, func, true); + IR::LabelInstr * taggedIntLabel = IR::LabelInstr::New(Js::OpCode::Label, func); + IR::LabelInstr * doneLabel = IR::LabelInstr::New(Js::OpCode::Label, func); + + // MOV typeDisplayStringsArray, &javascriptLibrary->typeDisplayStrings + IR::RegOpnd * typeDisplayStringsArrayOpnd = IR::RegOpnd::New(TyMachPtr, func); + m_lowerer->InsertMove(typeDisplayStringsArrayOpnd, IR::AddrOpnd::New((BYTE*)m_func->GetScriptContextInfo()->GetLibraryAddr() + Js::JavascriptLibrary::GetTypeDisplayStringsOffset(), IR::AddrOpndKindConstantAddress, this->m_func), typeOfInstr); + + GenerateObjectTest(src1, typeOfInstr, taggedIntLabel); + + // MOV typeRegOpnd, [src1 + offset(Type)] + IR::RegOpnd * typeRegOpnd = IR::RegOpnd::New(TyMachReg, func); + m_lowerer->InsertMove(typeRegOpnd, + IR::IndirOpnd::New(src1->AsRegOpnd(), Js::RecyclableObject::GetOffsetOfType(), TyMachReg, func), + typeOfInstr); + + IR::LabelInstr * falsyLabel = IR::LabelInstr::New(Js::OpCode::Label, func); + m_lowerer->GenerateFalsyObjectTest(typeOfInstr, typeRegOpnd, falsyLabel); + + // <$not falsy> + // MOV typeId, TypeIds_Object + // MOV objTypeId, [typeRegOpnd + offsetof(typeId)] + // CMP objTypeId, TypeIds_Limit /*external object test*/ + // BCS $externalObjectLabel + // MOV typeId, objTypeId + // $loadTypeDisplayStringLabel: + // MOV dst, typeDisplayStrings[typeId] + // TEST dst, dst + // BEQ $helper + // B $done + IR::RegOpnd * typeIdOpnd = IR::RegOpnd::New(TyUint32, func); + m_lowerer->InsertMove(typeIdOpnd, IR::IntConstOpnd::New(Js::TypeIds_Object, TyUint32, func), typeOfInstr); + + IR::RegOpnd * objTypeIdOpnd = IR::RegOpnd::New(TyUint32, func); + m_lowerer->InsertMove(objTypeIdOpnd, IR::IndirOpnd::New(typeRegOpnd, Js::Type::GetOffsetOfTypeId(), TyInt32, func), typeOfInstr); + + IR::LabelInstr * loadTypeDisplayStringLabel = IR::LabelInstr::New(Js::OpCode::Label, func); + m_lowerer->InsertCompareBranch(objTypeIdOpnd, IR::IntConstOpnd::New(Js::TypeIds_Limit, TyUint32, func), Js::OpCode::BrGe_A, true /*unsigned*/, loadTypeDisplayStringLabel, typeOfInstr); + + m_lowerer->InsertMove(typeIdOpnd, objTypeIdOpnd, typeOfInstr); + typeOfInstr->InsertBefore(loadTypeDisplayStringLabel); + + if (dst->IsEqual(src1)) + { + ChangeToAssign(typeOfInstr->HoistSrc1(Js::OpCode::Ld_A)); + } + m_lowerer->InsertMove(dst, IR::IndirOpnd::New(typeDisplayStringsArrayOpnd, typeIdOpnd, this->GetDefaultIndirScale(), TyMachPtr, func), typeOfInstr); + m_lowerer->InsertTestBranch(dst, dst, Js::OpCode::BrEq_A, helperLabel, typeOfInstr); + + m_lowerer->InsertBranch(Js::OpCode::Br, doneLabel, typeOfInstr); + + // $taggedInt: + // MOV dst, typeDisplayStrings[TypeIds_Number] + // B $done + typeOfInstr->InsertBefore(taggedIntLabel); + m_lowerer->InsertMove(dst, IR::IndirOpnd::New(typeDisplayStringsArrayOpnd, Js::TypeIds_Number * sizeof(Js::Var), TyMachPtr, func), typeOfInstr); + m_lowerer->InsertBranch(Js::OpCode::Br, doneLabel, typeOfInstr); + + // $falsy: + // MOV dst, "undefined" + // B $done + typeOfInstr->InsertBefore(falsyLabel); + IR::Opnd * undefinedDisplayStringOpnd = IR::IndirOpnd::New(typeDisplayStringsArrayOpnd, Js::TypeIds_Undefined, TyMachPtr, func); + m_lowerer->InsertMove(dst, undefinedDisplayStringOpnd, typeOfInstr); + m_lowerer->InsertBranch(Js::OpCode::Br, doneLabel, typeOfInstr); + + // $helper + // CALL OP_TypeOf + // $done + typeOfInstr->InsertBefore(helperLabel); + typeOfInstr->InsertAfter(doneLabel); + m_lowerer->LowerUnaryHelperMem(typeOfInstr, IR::HelperOp_Typeof); +} + +#if DBG +// +// Helps in debugging of fast paths. +// +void LowererMD::GenerateDebugBreak( IR::Instr * insertInstr ) +{ + IR::Instr *int3 = IR::Instr::New(Js::OpCode::DEBUGBREAK, insertInstr->m_func); + insertInstr->InsertBefore(int3); +} +#endif + +#ifdef _CONTROL_FLOW_GUARD +void +LowererMD::GenerateCFGCheck(IR::Opnd * entryPointOpnd, IR::Instr * insertBeforeInstr) +{ + bool useJITTrampoline = CONFIG_FLAG(UseJITTrampoline); + IR::LabelInstr * callLabelInstr = nullptr; + uintptr_t jitThunkStartAddress = NULL; + + if (useJITTrampoline) + { +#if ENABLE_OOP_NATIVE_CODEGEN + if (m_func->IsOOPJIT()) + { + OOPJITThunkEmitter * jitThunkEmitter = m_func->GetOOPThreadContext()->GetJITThunkEmitter(); + jitThunkStartAddress = jitThunkEmitter->EnsureInitialized(); + } + else +#endif + { + InProcJITThunkEmitter * jitThunkEmitter = m_func->GetInProcThreadContext()->GetJITThunkEmitter(); + jitThunkStartAddress = jitThunkEmitter->EnsureInitialized(); + } + if (jitThunkStartAddress) + { + uintptr_t endAddressOfSegment = jitThunkStartAddress + InProcJITThunkEmitter::TotalThunkSize; + Assert(endAddressOfSegment > jitThunkStartAddress); + // Generate instructions for local Pre-Reserved Segment Range check + + IR::AddrOpnd * endAddressOfSegmentConstOpnd = IR::AddrOpnd::New(endAddressOfSegment, IR::AddrOpndKindDynamicMisc, m_func); + IR::RegOpnd *resultOpnd = IR::RegOpnd::New(TyMachReg, this->m_func); + + callLabelInstr = IR::LabelInstr::New(Js::OpCode::Label, m_func); + IR::LabelInstr * cfgLabelInstr = IR::LabelInstr::New(Js::OpCode::Label, m_func, true); + + // resultOpnd = SUB endAddressOfSegmentConstOpnd, entryPointOpnd + // CMP resultOpnd, TotalThunkSize + // BHS $cfgLabel + // AND entryPointOpnd, ~(ThunkSize-1) + // JMP $callLabel + m_lowerer->InsertSub(false, resultOpnd, endAddressOfSegmentConstOpnd, entryPointOpnd, insertBeforeInstr); + m_lowerer->InsertCompareBranch(resultOpnd, IR::IntConstOpnd::New(InProcJITThunkEmitter::TotalThunkSize, TyMachReg, m_func, true), Js::OpCode::BrGe_A, true, cfgLabelInstr, insertBeforeInstr); + m_lowerer->InsertAnd(entryPointOpnd, entryPointOpnd, IR::IntConstOpnd::New(InProcJITThunkEmitter::ThunkAlignmentMask, TyMachReg, m_func, true), insertBeforeInstr); + m_lowerer->InsertBranch(Js::OpCode::Br, callLabelInstr, insertBeforeInstr); + + insertBeforeInstr->InsertBefore(cfgLabelInstr); + } + } + //MOV x15, entryPoint + IR::RegOpnd * entryPointRegOpnd = IR::RegOpnd::New(nullptr, RegR15, TyMachReg, this->m_func); + entryPointRegOpnd->m_isCallArg = true; + IR::Instr *movInstrEntryPointToRegister = Lowerer::InsertMove(entryPointRegOpnd, entryPointOpnd, insertBeforeInstr); + + //Generate CheckCFG CALL here + IR::HelperCallOpnd *cfgCallOpnd = IR::HelperCallOpnd::New(IR::HelperGuardCheckCall, this->m_func); + IR::Instr* cfgCallInstr = IR::Instr::New(Js::OpCode::BLR, this->m_func); + this->m_func->SetHasCallsOnSelfAndParents(); + + //mov x16, __guard_check_icall_fptr + IR::RegOpnd *targetOpnd = IR::RegOpnd::New(nullptr, RegR16, TyMachPtr, this->m_func); + IR::Instr *movInstr = Lowerer::InsertMove(targetOpnd, cfgCallOpnd, insertBeforeInstr); + Legalize(movInstr); + + //call x16 + cfgCallInstr->SetSrc1(targetOpnd); + + //CALL cfg(x15) + insertBeforeInstr->InsertBefore(cfgCallInstr); + + if (jitThunkStartAddress) + { + Assert(callLabelInstr); + if (CONFIG_FLAG(ForceJITCFGCheck)) + { + // Always generate CFG check to make sure that the address is still valid + movInstrEntryPointToRegister->InsertBefore(callLabelInstr); + } + else + { + insertBeforeInstr->InsertBefore(callLabelInstr); + } + } +} +#endif diff --git a/deps/chakrashim/core/lib/Backend/arm64/LowerMD.h b/deps/chakrashim/core/lib/Backend/arm64/LowerMD.h index ebaf96184e6..c0f56221c3a 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/LowerMD.h +++ b/deps/chakrashim/core/lib/Backend/arm64/LowerMD.h @@ -27,24 +27,30 @@ class LowererMD public: static const int MaxArgumentsToHelper = 16; - LowererMD(Func *func) { } + LowererMD(Func *func) : + m_func(func), + helperCallArgsCount(0), + helperCallDoubleArgsCount(0) + { + } - static bool IsUnconditionalBranch(const IR::Instr *instr) { __debugbreak(); return 0; } - static bool IsAssign(const IR::Instr *instr) { __debugbreak(); return 0; } - static bool IsCall(const IR::Instr *instr) { __debugbreak(); return 0; } - static bool IsIndirectBranch(const IR::Instr *instr) { __debugbreak(); return 0; } - static bool IsReturnInstr(const IR::Instr *instr) { __debugbreak(); return 0; } - static void InvertBranch(IR::BranchInstr *instr) { __debugbreak(); } - static Js::OpCode MDBranchOpcode(Js::OpCode opcode) { __debugbreak(); return Js::OpCode::InvalidOpCode; } - static Js::OpCode MDUnsignedBranchOpcode(Js::OpCode opcode) { __debugbreak(); return Js::OpCode::InvalidOpCode; } - static Js::OpCode MDCompareWithZeroBranchOpcode(Js::OpCode opcode) { __debugbreak(); return Js::OpCode::InvalidOpCode; } - static Js::OpCode MDConvertFloat64ToInt32Opcode(const bool roundTowardZero) { __debugbreak(); return Js::OpCode::InvalidOpCode; } - static void ChangeToAdd(IR::Instr *const instr, const bool needFlags) { __debugbreak(); } - static void ChangeToSub(IR::Instr *const instr, const bool needFlags) { __debugbreak(); } - static void ChangeToShift(IR::Instr *const instr, const bool needFlags) { __debugbreak(); } - static const uint16 GetFormalParamOffset() { __debugbreak(); return 0; } + static bool IsUnconditionalBranch(const IR::Instr *instr); + static bool IsAssign(const IR::Instr *instr); + static bool IsCall(const IR::Instr *instr); + static bool IsIndirectBranch(const IR::Instr *instr); + static bool IsReturnInstr(const IR::Instr *instr); + static void InvertBranch(IR::BranchInstr *instr); + static Js::OpCode MDBranchOpcode(Js::OpCode opcode); + static Js::OpCode MDUnsignedBranchOpcode(Js::OpCode opcode); + static Js::OpCode MDCompareWithZeroBranchOpcode(Js::OpCode opcode); + static Js::OpCode MDConvertFloat64ToInt32Opcode(const RoundMode roundMode); + static void ChangeToAdd(IR::Instr *const instr, const bool needFlags); + static void ChangeToSub(IR::Instr *const instr, const bool needFlags); + static void ChangeToShift(IR::Instr *const instr, const bool needFlags); + static const uint16 GetFormalParamOffset(); static const Js::OpCode MDUncondBranchOpcode; + static const Js::OpCode MDMultiBranchOpcode; static const Js::OpCode MDTestOpcode; static const Js::OpCode MDOrOpcode; static const Js::OpCode MDXorOpcode; @@ -54,222 +60,221 @@ class LowererMD static const Js::OpCode MDConvertFloat64ToFloat32Opcode; static const Js::OpCode MDCallOpcode; static const Js::OpCode MDImulOpcode; + static const Js::OpCode MDLea; public: - void Init(Lowerer *lowerer) { __debugbreak(); } - void FinalLower(){ __debugbreak(); } - bool FinalLowerAssign(IR::Instr* instr){ __debugbreak(); return 0; }; - IR::Opnd * GenerateMemRef(intptr_t addr, IRType type, IR::Instr *instr, bool dontEncode = false) { __debugbreak(); return 0; } - IR::Instr * ChangeToHelperCall(IR::Instr * instr, IR::JnHelperMethod helperMethod, IR::LabelInstr *labelBailOut = NULL, - IR::Opnd *opndInstance = NULL, IR::PropertySymOpnd * propSymOpnd = nullptr, bool isHelperContinuation = false) { __debugbreak(); return 0; } - IR::Instr * ChangeToHelperCallMem(IR::Instr * instr, IR::JnHelperMethod helperMethod) { __debugbreak(); return 0; } - static IR::Instr * CreateAssign(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsertPt, bool generateWriteBarrier = true) { __debugbreak(); return 0; } - static IR::Instr * ChangeToAssign(IR::Instr * instr) { __debugbreak(); return 0; } - static IR::Instr * ChangeToAssignNoBarrierCheck(IR::Instr * instr) { __debugbreak(); return 0;} - static IR::Instr * ChangeToAssign(IR::Instr * instr, IRType type) { __debugbreak(); return 0; } - static IR::Instr * ChangeToLea(IR::Instr *const instr, bool postRegAlloc = false) { __debugbreak(); return 0; } - static IR::Instr * ForceDstToReg(IR::Instr *instr) { __debugbreak(); return 0; } - static void ImmedSrcToReg(IR::Instr * instr, IR::Opnd * newOpnd, int srcNum) { __debugbreak(); } + void Init(Lowerer *lowerer); + void FinalLower(); + bool FinalLowerAssign(IR::Instr* instr); + IR::Opnd * GenerateMemRef(intptr_t addr, IRType type, IR::Instr *instr, bool dontEncode = false); + IR::Instr * ChangeToHelperCall(IR::Instr * instr, IR::JnHelperMethod helperMethod, IR::LabelInstr *labelBailOut = nullptr, + IR::Opnd *opndInstance = nullptr, IR::PropertySymOpnd * propSymOpnd = nullptr, bool isHelperContinuation = false); + IR::Instr * ChangeToHelperCallMem(IR::Instr * instr, IR::JnHelperMethod helperMethod); + static IR::Instr * ChangeToAssign(IR::Instr * instr); + static IR::Instr * ChangeToAssignNoBarrierCheck(IR::Instr * instr); + static IR::Instr * ForceDstToReg(IR::Instr *instr); + static void ImmedSrcToReg(IR::Instr * instr, IR::Opnd * newOpnd, int srcNum); - IR::Instr * LoadArgumentCount(IR::Instr * instr) { __debugbreak(); return 0; } - IR::Instr * LoadStackArgPtr(IR::Instr * instr) { __debugbreak(); return 0; } - IR::Instr * LoadHeapArguments(IR::Instr * instrArgs) { __debugbreak(); return 0; } - IR::Instr * LoadHeapArgsCached(IR::Instr * instr) { __debugbreak(); return 0; } - IR::Instr * LoadInputParamCount(IR::Instr * instr, int adjust = 0, bool needFlags = false) { __debugbreak(); return 0; } - IR::Instr * LoadArgumentsFromFrame(IR::Instr * instr) { __debugbreak(); return 0; } - IR::Instr * LowerRet(IR::Instr * instr) { __debugbreak(); return 0; } - static IR::Instr * LowerUncondBranch(IR::Instr * instr) { __debugbreak(); return 0; } - static IR::Instr * LowerMultiBranch(IR::Instr * instr) { __debugbreak(); return 0; } - IR::Instr * LowerCondBranch(IR::Instr * instr) { __debugbreak(); return 0; } - IR::Instr * LoadFunctionObjectOpnd(IR::Instr *instr, IR::Opnd *&functionObjOpnd) { __debugbreak(); return 0; } - IR::Instr * LowerLdSuper(IR::Instr * instr, IR::JnHelperMethod helperOpCode) { __debugbreak(); return 0; } - IR::Instr * GenerateSmIntPairTest(IR::Instr * instrInsert, IR::Opnd * opndSrc1, IR::Opnd * opndSrc2, IR::LabelInstr * labelFail) { __debugbreak(); return 0; } + IR::Instr * LoadArgumentCount(IR::Instr * instr); + IR::Instr * LoadStackArgPtr(IR::Instr * instr); + IR::Instr * LoadHeapArguments(IR::Instr * instrArgs); + IR::Instr * LoadHeapArgsCached(IR::Instr * instr); + IR::Instr * LoadInputParamPtr(IR::Instr * instrInsert, IR::RegOpnd * optionalDstOpnd = nullptr); + IR::Instr * LoadInputParamCount(IR::Instr * instr, int adjust = 0, bool needFlags = false); + IR::Instr * LoadArgumentsFromFrame(IR::Instr * instr); + IR::Instr * LowerRet(IR::Instr * instr); + IR::Instr * LowerCondBranch(IR::Instr * instr); + IR::Instr * LoadFunctionObjectOpnd(IR::Instr *instr, IR::Opnd *&functionObjOpnd); + IR::Instr * GenerateSmIntPairTest(IR::Instr * instrInsert, IR::Opnd * opndSrc1, IR::Opnd * opndSrc2, IR::LabelInstr * labelFail); #if DBG - static void GenerateDebugBreak(IR::Instr * insertInstr) { __debugbreak(); }; + static void GenerateDebugBreak(IR::Instr * insertInstr); +#endif + void GenerateTaggedZeroTest( IR::Opnd * opndSrc, IR::Instr * instrInsert, IR::LabelInstr * labelHelper = nullptr); + bool GenerateObjectTest(IR::Opnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel = false); + bool GenerateFastCmSrEqConst(IR::Instr *instr); + bool GenerateFastCmXxI4(IR::Instr *instr); + bool GenerateFastCmXxR8(IR::Instr *instr) { Assert(UNREACHED); return nullptr; } + bool GenerateFastCmXxTaggedInt(IR::Instr *instr, bool isInHelper = false); + IR::Instr * GenerateConvBool(IR::Instr *instr); + void GenerateClz(IR::Instr * instr); + void GenerateCtz(IR::Instr * instr) { Assert(UNREACHED); } + void GeneratePopCnt(IR::Instr * instr) { Assert(UNREACHED); } + void GenerateTruncWithCheck(IR::Instr * instr) { Assert(UNREACHED); } + void GenerateFastDivByPow2(IR::Instr *instr); + bool GenerateFastAdd(IR::Instr * instrAdd); + bool GenerateFastSub(IR::Instr * instrSub); + bool GenerateFastMul(IR::Instr * instrMul); + bool GenerateFastAnd(IR::Instr * instrAnd); + bool GenerateFastXor(IR::Instr * instrXor); + bool GenerateFastOr(IR::Instr * instrOr); + bool GenerateFastNot(IR::Instr * instrNot); + bool GenerateFastNeg(IR::Instr * instrNeg); + bool GenerateFastShiftLeft(IR::Instr * instrShift); + bool GenerateFastShiftRight(IR::Instr * instrShift); + void GenerateFastBrS(IR::BranchInstr *brInstr); + void GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMethod helperMethod); + void HelperCallForAsmMathBuiltin(IR::Instr* instr, IR::JnHelperMethod helperMethodFloat, IR::JnHelperMethod helperMethodDouble) { Assert(UNREACHED); } // only for asm.js + IR::Opnd * CreateStackArgumentsSlotOpnd(); + void GenerateSmIntTest(IR::Opnd *opndSrc, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::Instr **instrFirst = nullptr, bool fContinueLabel = false); + IR::RegOpnd * LoadNonnegativeIndex(IR::RegOpnd *indexOpnd, const bool skipNegativeCheck, IR::LabelInstr *const notTaggedIntLabel, IR::LabelInstr *const negativeLabel, IR::Instr *const insertBeforeInstr); + IR::RegOpnd * GenerateUntagVar(IR::RegOpnd * opnd, IR::LabelInstr * labelFail, IR::Instr * insertBeforeInstr, bool generateTagCheck = true); + bool GenerateFastLdMethodFromFlags(IR::Instr * instrLdFld); + void GenerateInt32ToVarConversion( IR::Opnd * opndSrc, IR::Instr * insertInstr ); + IR::Instr * GenerateFastScopedFld(IR::Instr * instrScopedFld, bool isLoad); + IR::Instr * GenerateFastScopedLdFld(IR::Instr * instrLdFld); + IR::Instr * GenerateFastScopedStFld(IR::Instr * instrStFld); + void GenerateFastAbs(IR::Opnd *dst, IR::Opnd *src, IR::Instr *callInstr, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::LabelInstr *doneLabel); + bool GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR::Opnd *srcStr, IR::Opnd *srcIndex, IR::Instr *callInstr, IR::Instr *insertInstr, + IR::LabelInstr *labelHelper, IR::LabelInstr *doneLabel); + bool TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrPrev); + void GenerateFloatTest(IR::RegOpnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr* labelHelper, const bool checkForNullInLoopBody = false); + IR::RegOpnd* CheckFloatAndUntag(IR::RegOpnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr* labelHelper); + + static void EmitInt4Instr(IR::Instr *instr); + void EmitLoadVar(IR::Instr *instr, bool isFromUint32 = false, bool isHelper = false); + bool EmitLoadInt32(IR::Instr *instr, bool conversionFromObjectAllowed, bool bailOutOnHelper = false, IR::LabelInstr * labelBailOut = nullptr); + + static void LowerInt4NegWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel); + static void LowerInt4AddWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel); + static void LowerInt4SubWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel); + static void LowerInt4MulWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel); + void LowerInt4RemWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel) const; + void GenerateFastRecyclerAlloc(size_t allocSize, IR::RegOpnd* newObjDst, IR::Instr* insertionPointInstr, IR::LabelInstr* allocHelperLabel, IR::LabelInstr* allocDoneLabel); +#ifdef _CONTROL_FLOW_GUARD + void GenerateCFGCheck(IR::Opnd * entryPointOpnd, IR::Instr * insertBeforeInstr); #endif - void GenerateTaggedZeroTest( IR::Opnd * opndSrc, IR::Instr * instrInsert, IR::LabelInstr * labelHelper = NULL) { __debugbreak(); } - void GenerateObjectPairTest(IR::Opnd * opndSrc1, IR::Opnd * opndSrc2, IR::Instr * insertInstr, IR::LabelInstr * labelTarget) { __debugbreak(); } - bool GenerateObjectTest(IR::Opnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel = false) { __debugbreak(); return false; } - bool GenerateFastCmSrEqConst(IR::Instr *instr) { __debugbreak(); return 0; } - bool GenerateFastCmXxI4(IR::Instr *instr) { __debugbreak(); return 0; } - bool GenerateFastCmXxR8(IR::Instr *instr) { Assert(UNREACHED); return NULL; } - bool GenerateFastCmXxTaggedInt(IR::Instr *instr, bool isInHelper = false) { __debugbreak(); return 0; } - IR::Instr * GenerateConvBool(IR::Instr *instr) { __debugbreak(); return 0; } + void SaveDoubleToVar(IR::RegOpnd * dstOpnd, IR::RegOpnd *opndFloat, IR::Instr *instrOrig, IR::Instr *instrInsert, bool isHelper = false); + void EmitLoadFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr, IR::Instr * instrBailOut = nullptr, IR::LabelInstr * labelBailOut = nullptr); + IR::Instr * LoadCheckedFloat(IR::RegOpnd *opndOrig, IR::RegOpnd *opndFloat, IR::LabelInstr *labelInline, IR::LabelInstr *labelHelper, IR::Instr *instrInsert, const bool checkForNullInLoopBody = false); - void GenerateClz(IR::Instr * instr) { __debugbreak(); } - void GenerateCtz(IR::Instr * instr) { __debugbreak(); } - void GeneratePopCnt(IR::Instr * instr) { __debugbreak(); } - void GenerateFastDivByPow2(IR::Instr *instr) { __debugbreak(); } - bool GenerateFastAdd(IR::Instr * instrAdd) { __debugbreak(); return 0; } - bool GenerateFastSub(IR::Instr * instrSub) { __debugbreak(); return 0; } - bool GenerateFastMul(IR::Instr * instrMul) { __debugbreak(); return 0; } - bool GenerateFastAnd(IR::Instr * instrAnd) { __debugbreak(); return 0; } - bool GenerateFastXor(IR::Instr * instrXor) { __debugbreak(); return 0; } - bool GenerateFastOr(IR::Instr * instrOr) { __debugbreak(); return 0; } - bool GenerateFastNot(IR::Instr * instrNot) { __debugbreak(); return 0; } - bool GenerateFastNeg(IR::Instr * instrNeg) { __debugbreak(); return 0; } - bool GenerateFastShiftLeft(IR::Instr * instrShift) { __debugbreak(); return 0; } - bool GenerateFastShiftRight(IR::Instr * instrShift) { __debugbreak(); return 0; } - void GenerateFastBrS(IR::BranchInstr *brInstr) { __debugbreak(); } - void GenerateFastInlineBuiltInCall(IR::Instr* instr, IR::JnHelperMethod helperMethod) { __debugbreak(); } - void HelperCallForAsmMathBuiltin(IR::Instr* instr, IR::JnHelperMethod helperMethodFloat, IR::JnHelperMethod helperMethodDouble) { __debugbreak(); } - IR::Opnd * CreateStackArgumentsSlotOpnd() { __debugbreak(); return 0; } - void GenerateSmIntTest(IR::Opnd *opndSrc, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::Instr **instrFirst = nullptr, bool fContinueLabel = false) { __debugbreak(); } - IR::RegOpnd * LoadNonnegativeIndex(IR::RegOpnd *indexOpnd, const bool skipNegativeCheck, IR::LabelInstr *const notTaggedIntLabel, IR::LabelInstr *const negativeLabel, IR::Instr *const insertBeforeInstr) { __debugbreak(); return nullptr; } - IR::RegOpnd * GenerateUntagVar(IR::RegOpnd * opnd, IR::LabelInstr * labelFail, IR::Instr * insertBeforeInstr, bool generateTagCheck = true) { __debugbreak(); return 0; } - bool GenerateFastLdMethodFromFlags(IR::Instr * instrLdFld) { __debugbreak(); return 0; } - void GenerateInt32ToVarConversion( IR::Opnd * opndSrc, IR::Instr * insertInstr ) { __debugbreak(); } - IR::Instr * GenerateFastScopedFld(IR::Instr * instrScopedFld, bool isLoad) { __debugbreak(); return 0; } - IR::Instr * GenerateFastScopedLdFld(IR::Instr * instrLdFld) { __debugbreak(); return 0; } - IR::Instr * GenerateFastScopedStFld(IR::Instr * instrStFld) { __debugbreak(); return 0; } - bool GenerateJSBooleanTest(IR::RegOpnd * regSrc, IR::Instr * insertInstr, IR::LabelInstr * labelTarget, bool fContinueLabel = false) { __debugbreak(); return 0; } - bool TryGenerateFastFloatOp(IR::Instr * instr, IR::Instr ** pInsertHelper, bool *pfNoLower) { __debugbreak(); return 0; } - bool GenerateFastFloatCall(IR::Instr * instr, IR::Instr ** pInsertHelper, bool noFieldFastPath, bool *pfNoLower, IR::Instr **pInstrPrev) { __debugbreak(); return 0; } - bool GenerateFastFloatBranch(IR::BranchInstr * instr, IR::Instr ** pInsertHelper, bool *pfNoLower) { __debugbreak(); return 0; } - void GenerateFastAbs(IR::Opnd *dst, IR::Opnd *src, IR::Instr *callInstr, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, IR::LabelInstr *doneLabel) { __debugbreak(); } - bool GenerateFastCharAt(Js::BuiltinFunction index, IR::Opnd *dst, IR::Opnd *srcStr, IR::Opnd *srcIndex, IR::Instr *callInstr, IR::Instr *insertInstr, - IR::LabelInstr *labelHelper, IR::LabelInstr *doneLabel) { __debugbreak(); return 0; } - bool TryGenerateFastMulAdd(IR::Instr * instrAdd, IR::Instr ** pInstrPrev) { __debugbreak(); return 0; } - void GenerateIsDynamicObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool fContinueLabel = false) { __debugbreak(); } - void GenerateIsRecyclableObject(IR::RegOpnd *regOpnd, IR::Instr *insertInstr, IR::LabelInstr *labelHelper, bool checkObjectAndDynamicObject = true) { __debugbreak(); } - bool GenerateLdThisCheck(IR::Instr * instr) { __debugbreak(); return 0; } - bool GenerateLdThisStrict(IR::Instr* instr) { __debugbreak(); return 0; } - void GenerateFloatTest(IR::RegOpnd * opndSrc, IR::Instr * insertInstr, IR::LabelInstr* labelHelper) { __debugbreak(); } - void GenerateFunctionObjectTest(IR::Instr * callInstr, IR::RegOpnd *functionObjOpnd, bool isHelper, IR::LabelInstr* afterCallLabel = nullptr) { __debugbreak(); } + IR::Instr * LowerCallHelper(IR::Instr *instrCall); - static void EmitInt4Instr(IR::Instr *instr) { __debugbreak(); } - void EmitLoadVar(IR::Instr *instr, bool isFromUint32 = false, bool isHelper = false) { __debugbreak(); } - bool EmitLoadInt32(IR::Instr *instr, bool conversionFromObjectAllowed, bool bailOutOnHelper = false, IR::LabelInstr * labelBailOut = nullptr) { __debugbreak(); return 0; } - IR::Instr * LowerInt64Assign(IR::Instr * instr) { __debugbreak(); return nullptr; } + IR::LabelInstr *GetBailOutStackRestoreLabel(BailOutInfo * bailOutInfo, IR::LabelInstr * exitTargetInstr); + StackSym * GetImplicitParamSlotSym(Js::ArgSlot argSlot); + static StackSym * GetImplicitParamSlotSym(Js::ArgSlot argSlot, Func * func); - static void LowerInt4NegWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel) { __debugbreak(); } - static void LowerInt4AddWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel) { __debugbreak(); } - static void LowerInt4SubWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel) { __debugbreak(); } - static void LowerInt4MulWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel) { __debugbreak(); } - static void LowerInt4RemWithBailOut(IR::Instr *const instr, const IR::BailOutKind bailOutKind, IR::LabelInstr *const bailOutLabel, IR::LabelInstr *const skipBailOutLabel) { __debugbreak(); } - void MarkOneFltTmpSym(StackSym *sym, BVSparse *bvTmps, bool fFltPrefOp) { __debugbreak(); } - void GenerateNumberAllocation(IR::RegOpnd * opndDst, IR::Instr * instrInsert, bool isHelper) { __debugbreak(); } - void GenerateFastRecyclerAlloc(size_t allocSize, IR::RegOpnd* newObjDst, IR::Instr* insertionPointInstr, IR::LabelInstr* allocHelperLabel, IR::LabelInstr* allocDoneLabel) { __debugbreak(); } - void SaveDoubleToVar(IR::RegOpnd * dstOpnd, IR::RegOpnd *opndFloat, IR::Instr *instrOrig, IR::Instr *instrInsert, bool isHelper = false) { __debugbreak(); } - void EmitLoadFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr, IR::Instr * instrBailOut = nullptr, IR::LabelInstr * labelBailOut = nullptr) { __debugbreak(); } - IR::Instr * LoadCheckedFloat(IR::RegOpnd *opndOrig, IR::RegOpnd *opndFloat, IR::LabelInstr *labelInline, IR::LabelInstr *labelHelper, IR::Instr *instrInsert) { __debugbreak(); return 0; } + IR::Instr * LowerDivI4AndBailOnReminder(IR::Instr * instr, IR::LabelInstr * bailOutLabel); +public: + IR::Instr * LowerCall(IR::Instr * callInstr, Js::ArgSlot argCount); + IR::Instr * LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper = false, IR::Instr* insertBeforeInstrForCFG = nullptr); + int32 LowerCallArgs(IR::Instr * callInstr, IR::Instr * stackParamInsert, ushort callFlags, Js::ArgSlot extraParams = 1 /* for function object */, IR::IntConstOpnd **callInfoOpndRef = nullptr); + int32 LowerCallArgs(IR::Instr * callInstr, ushort callFlags, Js::ArgSlot extraParams = 1 /* for function object */, IR::IntConstOpnd **callInfoOpndRef = nullptr) { return LowerCallArgs(callInstr, callInstr, callFlags, extraParams, callInfoOpndRef); } + IR::Instr * LowerStartCall(IR::Instr * instr); + IR::Instr * LowerAsmJsCallI(IR::Instr * callInstr) { Assert(UNREACHED); return nullptr; } + IR::Instr * LowerAsmJsCallE(IR::Instr * callInstr) { Assert(UNREACHED); return nullptr; } + IR::Instr * LowerWasmMemOp(IR::Instr * instr, IR::Opnd *addrOpnd) { Assert(UNREACHED); return nullptr; } + IR::Instr * LowerAsmJsStElemHelper(IR::Instr * callInstr) { Assert(UNREACHED); return nullptr; } + IR::Instr * LowerAsmJsLdElemHelper(IR::Instr * callInstr) { Assert(UNREACHED); return nullptr; } + IR::Instr * LowerCallIDynamic(IR::Instr *callInstr, IR::Instr*saveThisArgOutInstr, IR::Opnd *argsLength, ushort callFlags, IR::Instr * insertBeforeInstrForCFG = nullptr); + IR::Instr * LoadHelperArgument(IR::Instr * instr, IR::Opnd * opndArg); + IR::Instr * LoadDynamicArgument(IR::Instr * instr, uint argNumber = 1); + IR::Instr * LoadDynamicArgumentUsingLength(IR::Instr *instr); + IR::Instr * LoadDoubleHelperArgument(IR::Instr * instr, IR::Opnd * opndArg); + IR::Instr * LoadFloatHelperArgument(IR::Instr * instr, IR::Opnd * opndArg) { Assert(UNREACHED); return nullptr; } // only used for asm.js right now + IR::Instr * LowerToFloat(IR::Instr *instr); + static IR::BranchInstr * LowerFloatCondBranch(IR::BranchInstr *instrBranch, bool ignoreNaN = false); + void ConvertFloatToInt32(IR::Opnd* intOpnd, IR::Opnd* floatOpnd, IR::LabelInstr * labelHelper, IR::LabelInstr * labelDone, IR::Instr * instInsert); + void CheckOverflowOnFloatToInt32(IR::Instr* instrInsert, IR::Opnd* intOpnd, IR::LabelInstr * labelHelper, IR::LabelInstr * labelDone); + void EmitLoadVarNoCheck(IR::RegOpnd * dst, IR::RegOpnd * src, IR::Instr *instrLoad, bool isFromUint32, bool isHelper); + void EmitIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); + void EmitUIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); + void EmitFloatToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert, IR::Instr * instrBailOut = nullptr, IR::LabelInstr * labelBailOut = nullptr); + void EmitFloat32ToFloat64(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { Assert(UNREACHED); } + void EmitInt64toFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { Assert(UNREACHED); } + static IR::Instr * InsertConvertFloat64ToInt32(const RoundMode roundMode, IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr); + void EmitIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); + void EmitUIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); + void EmitLongToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert); + void EmitSignExtend(IR::Instr * instr) { Assert(UNREACHED); } + void EmitReinterpretPrimitive(IR::Opnd* dst, IR::Opnd* src, IR::Instr* insertBeforeInstr) { Assert(UNREACHED); } + void EmitLoadFloatFromNumber(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr); + IR::LabelInstr* EmitLoadFloatCommon(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr, bool needHelperLabel); + static IR::Instr * LoadFloatZero(IR::Opnd * opndDst, IR::Instr * instrInsert); + static IR::Instr * LoadFloatValue(IR::Opnd * opndDst, double value, IR::Instr * instrInsert); + + IR::Instr * LowerEntryInstr(IR::EntryInstr * entryInstr); + IR::Instr * LowerExitInstr(IR::ExitInstr * exitInstr); + IR::Instr * LowerExitInstrAsmJs(IR::ExitInstr * exitInstr) { Assert(UNREACHED); return nullptr; } + IR::Instr * LoadNewScObjFirstArg(IR::Instr * instr, IR::Opnd * dst, ushort extraArgs = 0); + IR::Instr * LowerTry(IR::Instr *instr, IR::JnHelperMethod helperMethod); + IR::Instr * LowerLeaveNull(IR::Instr *instr); + IR::LabelInstr * EnsureEHEpilogLabel(); + IR::Instr * LowerEHRegionReturn(IR::Instr * insertBeforeInstr, IR::Opnd * targetOpnd); + void FinishArgLowering(); + IR::Opnd * GetOpndForArgSlot(Js::ArgSlot argSlot, IR::Opnd * argOpnd = nullptr); + bool GenerateStackAllocation(IR::Instr *instr, uint32 allocSize, uint32 probeSize); + void GenerateStackDeallocation(IR::Instr *instr, uint32 allocSize); + void GenerateStackProbe(IR::Instr *instr, bool afterProlog); + IR::Opnd* GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stackArgsInstr); - void LoadFloatValue(IR::RegOpnd * javascriptNumber, IR::RegOpnd * opndFloat, IR::LabelInstr * labelHelper, IR::Instr * instrInsert) { __debugbreak(); } + template + static void Legalize(IR::Instr *const instr, bool fPostRegAlloc = false); - IR::Instr * LoadStackAddress(StackSym *sym, IR::RegOpnd* regDst = nullptr) { __debugbreak(); return 0; } - IR::Instr * LowerCatch(IR::Instr *instr) { __debugbreak(); return 0; } + void GenerateFastInlineBuiltInMathAbs(IR::Instr *callInstr); + void GenerateFastInlineBuiltInMathRound(IR::Instr *callInstr); + void GenerateFastInlineBuiltInMathFloorCeil(IR::Instr *callInstr); + void GenerateFastInlineBuiltInMathMinMax(IR::Instr *callInstr); + static void GenerateFastInlineMathFround(IR::Instr* instr); + static RegNum GetRegStackPointer() { return RegSP; } + static RegNum GetRegFramePointer() { return RegFP; } - IR::Instr * LowerGetCachedFunc(IR::Instr *instr) { __debugbreak(); return 0; } - IR::Instr * LowerCommitScope(IR::Instr *instr) { __debugbreak(); return 0; } + static RegNum GetRegReturn(IRType type) { return IRType_IsFloat(type) ? RegNOREG : RegR0; } + static RegNum GetRegArgI4(int32 argNum) { return RegNOREG; } + static RegNum GetRegArgR8(int32 argNum) { return RegNOREG; } + static Js::OpCode GetLoadOp(IRType type) { return IRType_IsFloat(type) ? Js::OpCode::FLDR : Js::OpCode::LDR; } + static Js::OpCode GetStoreOp(IRType type) { return IRType_IsFloat(type) ? Js::OpCode::FSTR : Js::OpCode::STR; } - IR::Instr * LowerCallHelper(IR::Instr *instrCall) { __debugbreak(); return 0; } + static BYTE GetDefaultIndirScale() + { + return IndirScale8; + } - IR::LabelInstr *GetBailOutStackRestoreLabel(BailOutInfo * bailOutInfo, IR::LabelInstr * exitTargetInstr) { __debugbreak(); return 0; } - bool AnyFloatTmps(void) { __debugbreak(); return 0; } - IR::LabelInstr* InsertBeforeRecoveryForFloatTemps(IR::Instr * insertBefore, IR::LabelInstr * labelRecover) { __debugbreak(); return 0; } - StackSym * GetImplicitParamSlotSym(Js::ArgSlot argSlot) { __debugbreak(); return 0; } - static StackSym * GetImplicitParamSlotSym(Js::ArgSlot argSlot, Func * func) { __debugbreak(); return 0; } - bool GenerateFastIsInst(IR::Instr * instr, Js::ScriptContext * scriptContext) { __debugbreak(); return 0; } + // -16 is to avoid alignment issues popping up, we are conservative here. + static bool IsSmallStack(uint32 size) { return (size < (PAGESIZE - MachStackAlignment)); } - IR::Instr * LowerDivI4AndBailOnReminder(IR::Instr * instr, IR::LabelInstr * bailOutLabel) { __debugbreak(); return NULL; } - bool GenerateFastIsInst(IR::Instr * instr) { __debugbreak(); return false; } - public: - IR::Instr * LowerCall(IR::Instr * callInstr, Js::ArgSlot argCount) { __debugbreak(); return 0; } - IR::Instr * LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper = false, IR::Instr* insertBeforeInstrForCFG = nullptr) { __debugbreak(); return 0; } - IR::Instr * LowerCallPut(IR::Instr * callInstr) { __debugbreak(); return 0; } - int32 LowerCallArgs(IR::Instr * callInstr, IR::Instr * stackParamInsert, ushort callFlags) { __debugbreak(); return 0; } - int32 LowerCallArgs(IR::Instr * callInstr, ushort callFlags, Js::ArgSlot extraParams = 1 /* for function object */, IR::IntConstOpnd **callInfoOpndRef = nullptr) { __debugbreak(); return 0; } - IR::Instr * LowerStartCall(IR::Instr * instr) { __debugbreak(); return 0; } - IR::Instr * LowerAsmJsCallI(IR::Instr * callInstr) { Assert(UNREACHED); return NULL; } - IR::Instr * LowerAsmJsCallE(IR::Instr * callInstr) { Assert(UNREACHED); return NULL; } - IR::Instr * LowerWasmMemOp(IR::Instr * instr, IR::Opnd *addrOpnd) { Assert(UNREACHED); return nullptr; } - IR::Instr * LowerAsmJsLdElemHelper(IR::Instr * callInstr) { Assert(UNREACHED); return NULL; } - IR::Instr * LowerAsmJsStElemHelper(IR::Instr * callInstr) { Assert(UNREACHED); return NULL; } - IR::Instr * LowerCallIDynamic(IR::Instr *callInstr, IR::Instr*saveThisArgOutInstr, IR::Opnd *argsLength, ushort callFlags, IR::Instr * insertBeforeInstrForCFG = nullptr) { __debugbreak(); return 0; } - IR::Instr * LoadHelperArgument(IR::Instr * instr, IR::Opnd * opndArg) { __debugbreak(); return 0; } - IR::Instr * LoadDynamicArgument(IR::Instr * instr, uint argNumber = 1) { __debugbreak(); return 0; } - IR::Instr * LoadDynamicArgumentUsingLength(IR::Instr *instr) { __debugbreak(); return 0; } - IR::Instr * LoadDoubleHelperArgument(IR::Instr * instr, IR::Opnd * opndArg) { __debugbreak(); return 0; } - IR::Instr * LoadFloatHelperArgument(IR::Instr * instr, IR::Opnd * opndArg) { __debugbreak(); return 0; } - IR::Instr * LowerToFloat(IR::Instr *instr) { __debugbreak(); return 0; } - static IR::BranchInstr * LowerFloatCondBranch(IR::BranchInstr *instrBranch, bool ignoreNaN = false) { __debugbreak(); return 0; } - void ConvertFloatToInt32(IR::Opnd* intOpnd, IR::Opnd* floatOpnd, IR::LabelInstr * labelHelper, IR::LabelInstr * labelDone, IR::Instr * instInsert) { __debugbreak(); } - void CheckOverflowOnFloatToInt32(IR::Instr* instr, IR::Opnd* intOpnd, IR::LabelInstr * labelHelper, IR::LabelInstr * labelDone) { __debugbreak(); } - void EmitLoadVarNoCheck(IR::RegOpnd * dst, IR::RegOpnd * src, IR::Instr *instrLoad, bool isFromUint32, bool isHelper) { __debugbreak(); } - void EmitIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { __debugbreak(); } - void EmitUIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { __debugbreak(); } - void EmitFloatToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert, IR::Instr * instrBailOut = nullptr, IR::LabelInstr * labelBailOut = nullptr) { __debugbreak(); } - void EmitFloat32ToFloat64(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { __debugbreak(); } - void EmitInt64toFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { __debugbreak(); } - void EmitIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { __debugbreak(); } - void EmitUIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { __debugbreak(); } - void EmitLongToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert) { __debugbreak(); } - void EmitReinterpretPrimitive(IR::Opnd* dst, IR::Opnd* src, IR::Instr* insertBeforeInstr) { __debugbreak(); } - void GenerateTruncWithCheck(IR::Instr * instr) { __debugbreak(); } - static IR::Instr * InsertConvertFloat64ToInt32(const RoundMode roundMode, IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr) { __debugbreak(); return 0; } - void EmitLoadFloatFromNumber(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr) { __debugbreak(); } - IR::LabelInstr* EmitLoadFloatCommon(IR::Opnd *dst, IR::Opnd *src, IR::Instr *insertInstr, bool needHelperLabel) { __debugbreak(); return 0; } - static IR::Instr * LoadFloatZero(IR::Opnd * opndDst, IR::Instr * instrInsert) { __debugbreak(); return 0; } - static IR::Instr * LoadFloatValue(IR::Opnd * opndDst, double value, IR::Instr * instrInsert) { __debugbreak(); return 0; } + static void GenerateLoadTaggedType(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndTaggedType); + static void GenerateLoadPolymorphicInlineCacheSlot(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::RegOpnd * opndType, uint polymorphicInlineCacheSize); + static void GenerateStFldFromLocalInlineCache(IR::Instr * instrStFld, IR::RegOpnd * opndBase, IR::Opnd * opndSrc, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot); + void GenerateFunctionObjectTest(IR::Instr * callInstr, IR::RegOpnd *functionOpnd, bool isHelper, IR::LabelInstr* continueAfterExLabel = nullptr); - IR::Instr * LowerEntryInstr(IR::EntryInstr * entryInstr) { __debugbreak(); return 0; } - IR::Instr * LowerExitInstr(IR::ExitInstr * exitInstr) { __debugbreak(); return 0; } - IR::Instr * LowerEntryInstrAsmJs(IR::EntryInstr * entryInstr) { Assert(UNREACHED); return NULL; } - IR::Instr * LowerExitInstrAsmJs(IR::ExitInstr * exitInstr) { Assert(UNREACHED); return NULL; } - IR::Instr * LoadNewScObjFirstArg(IR::Instr * instr, IR::Opnd * dst, ushort extraArgs = 0) { __debugbreak(); return 0; } - IR::Instr * LowerTry(IR::Instr *instr, IR::JnHelperMethod helperMethod) { __debugbreak(); return 0; } - IR::Instr * LowerLeave(IR::Instr *instr, IR::LabelInstr * targetInstr, bool fromFinalLower, bool isOrphanedLeave = false) { __debugbreak(); return 0; } - IR::Instr * LowerLeaveNull(IR::Instr *instr) { __debugbreak(); return 0; } - IR::LabelInstr * EnsureEpilogLabel() { __debugbreak(); return 0; } - IR::Instr * LowerEHRegionReturn(IR::Instr * retInstr, IR::Opnd * targetOpnd) { __debugbreak(); return 0; } - void FinishArgLowering() { __debugbreak(); } - IR::Opnd * GetOpndForArgSlot(Js::ArgSlot argSlot, bool isDoubleArgument = false) { __debugbreak(); return 0; } - void GenerateStackAllocation(IR::Instr *instr, uint32 allocSize, uint32 probeSize) { __debugbreak(); } - void GenerateStackDeallocation(IR::Instr *instr, uint32 allocSize) { __debugbreak(); } - void GenerateStackProbe(IR::Instr *instr, bool afterProlog) { __debugbreak(); } - IR::Opnd* GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stackArgsInstr) { __debugbreak(); return 0; } + static IR::Instr * ChangeToWriteBarrierAssign(IR::Instr * assignInstr, const Func* func); + + int GetHelperArgsCount() { return this->helperCallArgsCount; } + void ResetHelperArgsCount() { this->helperCallArgsCount = 0; } - template - static void Legalize(IR::Instr *const instr, bool fPostRegAlloc = false) { __debugbreak(); } + void LowerInlineSpreadArgOutLoop(IR::Instr *callInstr, IR::RegOpnd *indexOpnd, IR::RegOpnd *arrayElementsStartOpnd); + void LowerTypeof(IR::Instr * typeOfInstr); - void GenerateFastInlineBuiltInMathAbs(IR::Instr *callInstr) { __debugbreak(); } - void GenerateFastInlineBuiltInMathFloor(IR::Instr *callInstr) { __debugbreak(); } - void GenerateFastInlineBuiltInMathCeil(IR::Instr *callInstr) { __debugbreak(); } - void GenerateFastInlineBuiltInMathRound(IR::Instr *callInstr) { __debugbreak(); } - static RegNum GetRegStackPointer() { return RegSP; } - static RegNum GetRegFramePointer() { return RegFP; } - static RegNum GetRegReturn(IRType type) { return IRType_IsFloat(type) ? RegNOREG : RegX0; } - static Js::OpCode GetLoadOp(IRType type) { __debugbreak(); return Js::OpCode::InvalidOpCode; } - static Js::OpCode GetStoreOp(IRType type) { __debugbreak(); return Js::OpCode::InvalidOpCode; } - static Js::OpCode GetMoveOp(IRType type) { __debugbreak(); return Js::OpCode::InvalidOpCode; } - static RegNum GetRegArgI4(int32 argNum) { return RegNOREG; } - static RegNum GetRegArgR8(int32 argNum) { return RegNOREG; } + void GenerateMemInit(IR::RegOpnd * opnd, int32 offset, size_t value, IR::Instr * insertBeforeInstr, bool isZeroed = false); +public: + static IR::Instr * InsertCmovCC(const Js::OpCode opCode, IR::Opnd * dst, IR::Opnd* src1, IR::Instr* insertBeforeInstr, bool postRegAlloc); +private: + static IR::Instr * ChangeToAssign(IR::Instr * instr, IRType destType); - static BYTE GetDefaultIndirScale() { return IndirScale4; } + void GenerateAssignForBuiltinArg( + RegNum dstReg, + IR::Opnd* srcOpnd, + IR::Instr* instr); - // -4 is to avoid alignment issues popping up, we are conservative here. - // We might check for IsSmallStack first to push R4 register & then align. - static bool IsSmallStack(uint32 size) { return (size < (PAGESIZE - 4)); } + IR::Instr* GeneratePreCall(IR::Instr * callInstr, IR::Opnd *functionOpnd, IR::Instr * insertBeforeInstrForCFGCheck); + void SetMaxArgSlots(Js::ArgSlot actualCount /*including this*/); +// Data +protected: + Func * m_func; + Lowerer * m_lowerer; - static void GenerateLoadTaggedType(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndTaggedType) { __debugbreak(); } - static void GenerateLoadPolymorphicInlineCacheSlot(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::RegOpnd * opndType, uint polymorphicInlineCacheSize) { __debugbreak(); } - static IR::BranchInstr * GenerateLocalInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext, bool checkTypeWithoutProperty = false) { __debugbreak(); return 0; } - static IR::BranchInstr * GenerateProtoInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext) { __debugbreak(); return 0; } - static IR::BranchInstr * GenerateFlagInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext) { __debugbreak(); return 0; } - static IR::BranchInstr * GenerateFlagInlineCacheCheckForLocal(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext) { __debugbreak(); return 0; } - static void GenerateLdFldFromLocalInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot) { __debugbreak(); } - static void GenerateLdFldFromProtoInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot) { __debugbreak(); } - static void GenerateLdLocalFldFromFlagInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot) { __debugbreak(); } - static void GenerateStFldFromLocalInlineCache(IR::Instr * instrStFld, IR::RegOpnd * opndBase, IR::Opnd * opndSrc, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot) { __debugbreak(); } + // + // Support to load helper arguments. + // + static const int MaxDoubleArgumentsToHelper = 8; + // Only 8 double values can be passed through double registers, rest has to go through stack and + // need to following a different calling convention. We should never hit that case as there is no helper call with more + // than 8 double arguments. - static IR::Instr * ChangeToWriteBarrierAssign(IR::Instr * assignInstr, const Func* func) { __debugbreak(); return 0; } + uint16 helperCallArgsCount; //consists of both integer & double arguments + uint16 helperCallDoubleArgsCount; //consists of only double arguments + IR::Opnd * helperCallArgs[MaxArgumentsToHelper]; - int GetHelperArgsCount() { __debugbreak(); return 0; } - void ResetHelperArgsCount() { __debugbreak(); } + void FlipHelperCallArgsOrder(); - void LowerInlineSpreadArgOutLoop(IR::Instr *callInstr, IR::RegOpnd *indexOpnd, IR::RegOpnd *arrayElementsStartOpnd) { __debugbreak(); } - void LowerTypeof(IR::Instr * typeOfInstr) { __debugbreak(); } - void GenerateMemInit(IR::RegOpnd * opnd, int32 offset, size_t value, IR::Instr * insertBeforeInstr, bool isZeroed = false) { __debugbreak(); } -public: - static IR::Instr * InsertCmovCC(const Js::OpCode opCode, IR::Opnd * dst, IR::Opnd* src1, IR::Instr* insertBeforeInstr, bool postRegAlloc) { __debugbreak(); } }; diff --git a/deps/chakrashim/core/lib/Backend/arm64/MdOpCodes.h b/deps/chakrashim/core/lib/Backend/arm64/MdOpCodes.h index 56df1601e38..eddf917b7c9 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/MdOpCodes.h +++ b/deps/chakrashim/core/lib/Backend/arm64/MdOpCodes.h @@ -4,169 +4,126 @@ //------------------------------------------------------------------------------------------------------- // Instruction encoding macros. Used by ARM instruction encoder. // -#define INSTR_TYPE(x) (x) +#define UNUSED 0 // opcode -// / layout -// / / attrib byte2 -// / / / / form -// / / / / / opbyte -// / / / / / / -// / / / / / / dope -// / / / / / / / - -MACRO(ADD, Reg3, 0, 0, LEGAL_ADDSUB, INSTR_TYPE(Forms_ADD), D___C) -MACRO(ADDS, Reg3, OpSideEffect, 0, LEGAL_ALU3, INSTR_TYPE(Forms_ADD), D__SC) -MACRO(ADDW, Reg3, 0, 0, LEGAL_ADDSUBW, INSTR_TYPE(Forms_ADDW), D___C) -MACRO(AND, Reg3, 0, 0, LEGAL_ALU3, INSTR_TYPE(Forms_AND), D___C) -MACRO(ASR, Reg3, 0, 0, LEGAL_SHIFT, INSTR_TYPE(Forms_ASR), D___C) -MACRO(ASRS, Reg3, OpSideEffect, 0, LEGAL_SHIFT, INSTR_TYPE(Forms_ASR), D__SC) - -MACRO(B, Br, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_B), DQ__C) -MACRO(BX, Br, OpSideEffect, 0, LEGAL_BREG, INSTR_TYPE(Forms_BX), D___C) -MACRO(BL, CallI, OpSideEffect, 0, LEGAL_CALL, INSTR_TYPE(Forms_BL), D___C) -MACRO(BLX, CallI, OpSideEffect, 0, LEGAL_CALLREG, INSTR_TYPE(Forms_BLX), D___C) - -MACRO(BIC, Reg3, OpSideEffect, 0, LEGAL_ALU3, INSTR_TYPE(Forms_BIC), D___C) - -// B: explicit and resolved in encoder -MACRO(BEQ, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BEQ), DQ__C) -MACRO(BNE, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BNE), DQ__C) -MACRO(BLT, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BLT), DQ__C) -MACRO(BLE, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BLE), DQ__C) -MACRO(BGT, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BGT), DQ__C) -MACRO(BGE, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BGE), DQ__C) - -MACRO(BCS, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BCS), DQ__C) -MACRO(BCC, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BCC), DQ__C) -MACRO(BHI, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BHI), DQ__C) -MACRO(BLS, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BLS), DQ__C) -MACRO(BMI, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BMI), DQ__C) -MACRO(BPL, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BPL), DQ__C) -MACRO(BVS, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BVS), DQ__C) -MACRO(BVC, BrReg2, OpSideEffect, 0, LEGAL_BLAB, INSTR_TYPE(Forms_BVC), DQ__C) -MACRO(DEBUGBREAK, Reg1, OpSideEffect, 0, LEGAL_NONE, INSTR_TYPE(Forms_DBGBRK), D____) - -MACRO(CLZ, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_CLZ), D___C) -MACRO(CMP, Reg1, OpSideEffect, 0, LEGAL_CMP, INSTR_TYPE(Forms_CMP), D___C) -MACRO(CMN, Reg1, OpSideEffect, 0, LEGAL_CMN, INSTR_TYPE(Forms_CMN), D___C) -// CMP src1, src, ASR #31 -MACRO(CMP_ASR31,Reg1, OpSideEffect, 0, LEGAL_CMP_SH, INSTR_TYPE(Forms_CMP_ASR31),D___C) - -MACRO(EOR, Reg3, 0, 0, LEGAL_ALU3, INSTR_TYPE(Forms_EOR), D___C) -MACRO(EOR_ASR31,Reg3, 0, 0, LEGAL_ALU3, INSTR_TYPE(Forms_EOR_ASR31),D___C) - -// LDIMM: Load Immediate -MACRO(LDIMM, Reg2, 0, 0, LEGAL_LDIMM, INSTR_TYPE(Forms_LDIMM), DM__C) - -// Forms of LDM/STM that update the base reg (i.e., associate the update/sub/etc. with the opcode rather than indir) -MACRO(PUSH, Reg2, OpSideEffect, 0, LEGAL_PUSHPOP, INSTR_TYPE(Forms_STM), DSUS_C) -MACRO(POP, Reg2, OpSideEffect, 0, LEGAL_PUSHPOP, INSTR_TYPE(Forms_LDM), DLUP_C) - -// LDR: Load register from memory -MACRO(LDR, Reg2, 0, 0, LEGAL_LOAD, INSTR_TYPE(Forms_LDRN), DL__C) -// Wide LDR encoding (Thumb2) -MACRO(LDR_W, Reg2, 0, 0, LEGAL_LOAD, INSTR_TYPE(Forms_LDR_W),DL__C) - -// LDRRET: pseudo-op for "ldr pc, [sp], #imm" -MACRO(LDRRET, Reg2, OpSideEffect, 0, LEGAL_LOAD, INSTR_TYPE(Forms_LDRRET), DLUPQC) - -// LEA: Load Effective Address -MACRO(LEA, Reg3, 0, 0, LEGAL_LEA, INSTR_TYPE(Forms_LEA), D___C) - -// Shifter operands -MACRO(LSL, Reg2, 0, 0, LEGAL_SHIFT, INSTR_TYPE(Forms_LSL), D___C) -MACRO(LSR, Reg2, 0, 0, LEGAL_SHIFT, INSTR_TYPE(Forms_LSR), D___C) - -// MOV(P): Pseudo-op which can expands into ADD r2, r1, #0 (for MOVL) -MACRO(MOV_W, Reg2, 0, 0, LEGAL_ALU2, INSTR_TYPE(Forms_MOV_W),DM__C) - -MACRO(MOV, Reg2, 0, 0, LEGAL_ALU2, INSTR_TYPE(Forms_MOV), DM__C) - -MACRO(MOVT, Reg2, 0, 0, LEGAL_MOVIMM16, INSTR_TYPE(Forms_MOVT), DM__C) -MACRO(MOVW, Reg2, 0, 0, LEGAL_MOVIMM16, INSTR_TYPE(Forms_MOVW), DM__C) - -MACRO(MUL, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_MUL), D___C) - -// SMULL dst, r12, src1, src2. -MACRO(SMULL, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_SMULL),D___C) - -// SMLAL dst, r12, src1, src2. The add source comes from r12:s1. Dst is 64 bit and is in r12:s1. -MACRO(SMLAL, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_SMLAL),D___C) - -// MLS dst, src1, src2: Multiply and Subtract. We use 3 registers: dst = src1 - src2 * dst -MACRO(MLS, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_MLS), D___C) - -// MVN: Move NOT (register); Format 4 -MACRO(MVN, Reg2, 0, 0, LEGAL_ALU2, INSTR_TYPE(Forms_MVN), D___C) - -// NOP: No-op -MACRO(NOP, Empty, 0, 0, LEGAL_NONE, INSTR_TYPE(Forms_NOP), D___C) -MACRO(NOP_W, Empty, 0, 0, LEGAL_NONE, INSTR_TYPE(Forms_NOP_W), D___C) - -MACRO(ORR, Reg3, 0, 0, LEGAL_ALU3, INSTR_TYPE(Forms_ORR), D___C) - -MACRO(PLD, Reg2, 0, 0, LEGAL_LOAD, INSTR_TYPE(Forms_PLD), DL___) - -// RET: pseudo-op for function return -MACRO(RET, Reg2, OpSideEffect, 0, LEGAL_REG2, INSTR_TYPE(Forms_RET), D___C) - -// REM: pseudo-op -MACRO(REM, Reg3, OpSideEffect, 0, LEGAL_REG3, INSTR_TYPE(Forms_REM), D___C) - -// RSB: reserve subtract (i.e., NEG) -MACRO(RSB, Reg2, 0, 0, LEGAL_ALU3, INSTR_TYPE(Forms_RSB), D___C) -MACRO(RSBS, Reg2, OpSideEffect, 0, LEGAL_ALU3, INSTR_TYPE(Forms_RSB), D__SC) - -// SDIV: Signed divide -MACRO(SDIV, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_SDIV), D___C) - -// STR: Store register to memory -MACRO(STR, Reg2, 0, 0, LEGAL_STORE, INSTR_TYPE(Forms_STRN), DS__C) -// Wide STR encoding (Thumb2) -MACRO(STR_W, Reg2, 0, 0, LEGAL_STORE, INSTR_TYPE(Forms_STR_W),DS__C) - -MACRO(SUB, Reg3, 0, 0, LEGAL_ADDSUB, INSTR_TYPE(Forms_SUB), D___C) -MACRO(SUBS, Reg3, OpSideEffect, 0, LEGAL_ALU3, INSTR_TYPE(Forms_SUB), D__SC) -MACRO(SUBW, Reg2, 0, 0, LEGAL_ADDSUBW, INSTR_TYPE(Forms_SUBW), D___C) - -MACRO(TIOFLW, Reg1, OpSideEffect, 0, LEGAL_CMP1, INSTR_TYPE(Forms_TIOFLW), D___C) -MACRO(TST, Reg2, OpSideEffect, 0, LEGAL_CMP, INSTR_TYPE(Forms_TST), D___C) +// / layout +// / / attrib byte2 +// / / / / form +// / / / / / unused +// / / / / / / +// / / / / / / dope +// / / / / / / / + +MACRO(ADD, Reg3, 0, UNUSED, LEGAL_ADDSUB, UNUSED, D___) +MACRO(ADDS, Reg3, OpSideEffect, UNUSED, LEGAL_ADDSUB, UNUSED, D__S) +MACRO(ADR, Reg3, 0, UNUSED, LEGAL_LABEL, UNUSED, D___) +MACRO(AND, Reg3, 0, UNUSED, LEGAL_ALU3, UNUSED, D___) +MACRO(ANDS, Reg3, 0, UNUSED, LEGAL_ALU3, UNUSED, D__S) +MACRO(ASR, Reg3, 0, UNUSED, LEGAL_SHIFT, UNUSED, D___) +MACRO(B, Br, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BEQ, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BNE, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BLT, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BLE, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BGT, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BGE, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BCS, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BCC, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BHI, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BLS, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BMI, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BPL, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BVS, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BVC, BrReg2, OpSideEffect, UNUSED, LEGAL_BLAB, UNUSED, D___) +MACRO(BFI, Reg3, 0, UNUSED, LEGAL_BITFIELD, UNUSED, D___) +MACRO(BFXIL, Reg3, 0, UNUSED, LEGAL_BITFIELD, UNUSED, D___) +MACRO(BIC, Reg3, OpSideEffect, UNUSED, LEGAL_ALU3, UNUSED, D___) +MACRO(BL, CallI, OpSideEffect, UNUSED, LEGAL_CALL, UNUSED, D___) +MACRO(BLR, CallI, OpSideEffect, UNUSED, LEGAL_REG2_ND, UNUSED, D___) +MACRO(BR, Br, OpSideEffect, UNUSED, LEGAL_REG2_ND, UNUSED, D___) +MACRO(CBZ, BrReg2, OpSideEffect, UNUSED, LEGAL_CBZ, UNUSED, D___) +MACRO(CBNZ, BrReg2, OpSideEffect, UNUSED, LEGAL_CBZ, UNUSED, D___) +MACRO(CLZ, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(CMP, Reg1, OpSideEffect, UNUSED, LEGAL_PSEUDO, UNUSED, D__S) +MACRO(CMN, Reg1, OpSideEffect, UNUSED, LEGAL_PSEUDO, UNUSED, D__S) +// CMP src1, src2, SXTW -- used in multiply overflow checks +MACRO(CMP_SXTW, Reg1, OpSideEffect, UNUSED, LEGAL_REG3_ND, UNUSED, D__S) +// CSELLT src1, src2 -- select src1 if LT or src2 if not; used in integer min/max +MACRO(CSELLT, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +// CSNEGPL src1, src2 -- select src1 if PL or -src1 if not; used in integer absolute value +MACRO(CSNEGPL, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(DEBUGBREAK, Reg1, OpSideEffect, UNUSED, LEGAL_NONE, UNUSED, D___) +MACRO(EOR, Reg3, 0, UNUSED, LEGAL_ALU3, UNUSED, D___) +// EOR src1, src2, ASR #31/63 -- used in floating-point-to-integer overflow checks +MACRO(EOR_ASR31, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(LDIMM, Reg2, 0, UNUSED, LEGAL_LDIMM, UNUSED, DM__) +MACRO(LDP, Reg3, 0, UNUSED, LEGAL_LOADP, UNUSED, DL__) +MACRO(LDP_POST, Reg3, 0, UNUSED, LEGAL_LOADP, UNUSED, DL__) +MACRO(LDR, Reg2, 0, UNUSED, LEGAL_LOAD, UNUSED, DL__) +MACRO(LDRS, Reg2, 0, UNUSED, LEGAL_LOAD, UNUSED, DL__) +MACRO(LEA, Reg3, 0, UNUSED, LEGAL_LEA, UNUSED, D___) +MACRO(LSL, Reg2, 0, UNUSED, LEGAL_SHIFT, UNUSED, D___) +MACRO(LSR, Reg2, 0, UNUSED, LEGAL_SHIFT, UNUSED, D___) +MACRO(MOV, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, DM__) +// Alias of MOV that won't get optimized out when src and dst are the same. +MACRO(MOV_TRUNC, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, DM__) +MACRO(MOVK, Reg2, 0, UNUSED, LEGAL_LDIMM_S, UNUSED, DM__) +MACRO(MOVN, Reg2, 0, UNUSED, LEGAL_LDIMM_S, UNUSED, DM__) +MACRO(MOVZ, Reg2, 0, UNUSED, LEGAL_LDIMM_S, UNUSED, DM__) +MACRO(MRS_FPCR, Reg1, 0, UNUSED, LEGAL_REG1, UNUSED, D___) +MACRO(MRS_FPSR, Reg1, 0, UNUSED, LEGAL_REG1, UNUSED, D___) +MACRO(MSR_FPCR, Reg2, 0, UNUSED, LEGAL_REG2_ND, UNUSED, D___) +MACRO(MSR_FPSR, Reg2, 0, UNUSED, LEGAL_REG2_ND, UNUSED, D___) +MACRO(MSUB, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(MUL, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(MVN, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(NOP, Empty, 0, UNUSED, LEGAL_NONE, UNUSED, D___) +MACRO(ORR, Reg3, 0, UNUSED, LEGAL_ALU3, UNUSED, D___) +MACRO(PLD, Reg2, 0, UNUSED, LEGAL_PLD, UNUSED, DL__) +MACRO(REM, Reg3, OpSideEffect, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(RET, Reg2, OpSideEffect, UNUSED, LEGAL_REG2_ND, UNUSED, D___) +MACRO(SBFX, Reg3, 0, UNUSED, LEGAL_BITFIELD, UNUSED, D___) +MACRO(SDIV, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(SMADDL, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(SMULL, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(STP, Reg3, 0, UNUSED, LEGAL_STOREP, UNUSED, DL__) +MACRO(STP_PRE, Reg3, 0, UNUSED, LEGAL_STOREP, UNUSED, DL__) +MACRO(STR, Reg2, 0, UNUSED, LEGAL_STORE, UNUSED, DS__) +MACRO(SUB, Reg3, 0, UNUSED, LEGAL_ADDSUB, UNUSED, D___) +// SUB dst, src1, src2 LSL #4 -- used in prologs with _chkstk calls +MACRO(SUB_LSL4, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(SUBS, Reg3, OpSideEffect, UNUSED, LEGAL_ADDSUB, UNUSED, D__S) +MACRO(TBNZ, BrReg2, OpSideEffect, UNUSED, LEGAL_TBZ, UNUSED, D___) +MACRO(TBZ, BrReg2, OpSideEffect, UNUSED, LEGAL_TBZ, UNUSED, D___) +MACRO(TST, Reg2, OpSideEffect, UNUSED, LEGAL_PSEUDO, UNUSED, D__S) +MACRO(UBFX, Reg3, 0, UNUSED, LEGAL_BITFIELD, UNUSED, D___) // Pseudo-op that loads the size of the arg out area. A special op with no src is used so that the // actual arg out size can be fixed up by the encoder. -MACRO(LDARGOUTSZ,Reg1, 0, 0, LEGAL_REG1, INSTR_TYPE(Forms_LDIMM), D___C) - -// Pseudo-op: dst = EOR src, src ASR #31 -MACRO(CLRSIGN, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_CLRSIGN), D___C) - -// Pseudo-op: dst = SUB src1, src2 ASR #31 -MACRO(SBCMPLNT, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_SBCMPLNT), D___C) - +MACRO(LDARGOUTSZ, Reg1, 0, UNUSED, LEGAL_REG1, UNUSED, D___) //VFP instructions: -MACRO(VABS, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VABS), D___C) -MACRO(VADDF64, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_VADDF64), D___C) -MACRO(VCMPF64, Reg1, OpSideEffect, 0, LEGAL_CMP_SH, INSTR_TYPE(Forms_VCMPF64), D___C) -MACRO(VCVTF64F32, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VCVTF64F32), D___C) -MACRO(VCVTF32F64, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VCVTF32F64), D___C) -MACRO(VCVTF64S32, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VCVTF64S32), D___C) -MACRO(VCVTF64U32, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VCVTF64U32), D___C) -MACRO(VCVTS32F64, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VCVTS32F64), D___C) -MACRO(VCVTRS32F64, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VCVTRS32F64), D___C) -MACRO(VDIVF64, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_VDIVF64), D___C) -MACRO(VLDR, Reg2, 0, 0, LEGAL_VLOAD, INSTR_TYPE(Forms_VLDR), DL__C) -MACRO(VLDR32, Reg2, 0, 0, LEGAL_VLOAD, INSTR_TYPE(Forms_VLDR32), DL__C) //single precision float load -MACRO(VMOV, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VMOV), DM__C) -MACRO(VMOVARMVFP, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VMOVARMVFP), DM__C) -MACRO(VMRS, Empty, OpSideEffect, 0, LEGAL_NONE, INSTR_TYPE(Forms_VMRS), D___C) -MACRO(VMRSR, Reg1, OpSideEffect, 0, LEGAL_NONE, INSTR_TYPE(Forms_VMRSR), D___C) -MACRO(VMSR, Reg1, OpSideEffect, 0, LEGAL_NONE, INSTR_TYPE(Forms_VMSR), D___C) -MACRO(VMULF64, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_VMULF64), D___C) -MACRO(VNEGF64, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VNEGF64), D___C) -MACRO(VPUSH, Reg2, OpSideEffect, 0, LEGAL_VPUSHPOP, INSTR_TYPE(Forms_VPUSH), DSUS_C) -MACRO(VPOP, Reg2, OpSideEffect, 0, LEGAL_VPUSHPOP, INSTR_TYPE(Forms_VPOP), DLUP_C) -MACRO(VSUBF64, Reg3, 0, 0, LEGAL_REG3, INSTR_TYPE(Forms_VSUBF64), D___C) -MACRO(VSQRT, Reg2, 0, 0, LEGAL_REG2, INSTR_TYPE(Forms_VSQRT), D___C) -MACRO(VSTR, Reg2, 0, 0, LEGAL_VSTORE, INSTR_TYPE(Forms_VSTR), DS__C) -MACRO(VSTR32, Reg2, 0, 0, LEGAL_VSTORE, INSTR_TYPE(Forms_VSTR32), DS__C) //single precision float store +MACRO(FABS, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FADD, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(FCMP, Reg1, OpSideEffect, UNUSED, LEGAL_REG3_ND, UNUSED, D___) +MACRO(FCVT, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FCVTM, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FCVTN, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FCVTP, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FCVTZ, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FDIV, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(FLDR, Reg2, 0, UNUSED, LEGAL_LOAD, UNUSED, DL__) +MACRO(FLDP, Reg2, 0, UNUSED, LEGAL_LOADP, UNUSED, DL__) +MACRO(FMIN, Reg2, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(FMAX, Reg2, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(FMOV, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, DM__) +MACRO(FMOV_GEN, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, DM__) +MACRO(FMUL, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(FNEG, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FRINTM, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FRINTP, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FSUB, Reg3, 0, UNUSED, LEGAL_REG3, UNUSED, D___) +MACRO(FSQRT, Reg2, 0, UNUSED, LEGAL_REG2, UNUSED, D___) +MACRO(FSTR, Reg2, 0, UNUSED, LEGAL_STORE, UNUSED, DS__) +MACRO(FSTP, Reg2, 0, UNUSED, LEGAL_STOREP, UNUSED, DS__) diff --git a/deps/chakrashim/core/lib/Backend/arm64/PeepsMD.cpp b/deps/chakrashim/core/lib/Backend/arm64/PeepsMD.cpp new file mode 100644 index 00000000000..e624d20fd92 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/PeepsMD.cpp @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "Backend.h" + +static const uint8 RegAttribs[RegNumCount] = +{ +#define REGDAT(Name, ListName, Encode, Type, Attribs) Attribs, +#include "RegList.h" +#undef REGDAT +}; + + +// PeepsMD::Init +void +PeepsMD::Init(Peeps *peeps) +{ + this->peeps = peeps; +} + +// PeepsMD::ProcessImplicitRegs +void +PeepsMD::ProcessImplicitRegs(IR::Instr *instr) +{ + if (LowererMD::IsCall(instr)) + { + FOREACH_REG(reg) + { + // not DONTALLOCATE, not CALLEESAVED + if (RegAttribs[reg] == 0) + { + this->peeps->ClearReg(reg); + } + } NEXT_REG + + // The SCRATCH_REG (RegR17) is marked DONTALLOCATE, so it will be missed above. + Assert(RegAttribs[SCRATCH_REG] & RA_DONTALLOCATE); + this->peeps->ClearReg(SCRATCH_REG); + } + else if (instr->m_opcode == Js::OpCode::SMULL || + instr->m_opcode == Js::OpCode::SMADDL) + { + // As we don't currently have support for 4 operand instrs, we use R17 as 4th operand, + // Notify the peeps that we use r17: SMULL, dst, r12, src1, src2. + this->peeps->ClearReg(SCRATCH_REG); + } +} + +void +PeepsMD::PeepAssign(IR::Instr *instr) +{ + return; +} diff --git a/deps/chakrashim/core/lib/Backend/arm64/PeepsMD.h b/deps/chakrashim/core/lib/Backend/arm64/PeepsMD.h index 360f7edb705..310c54f1682 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/PeepsMD.h +++ b/deps/chakrashim/core/lib/Backend/arm64/PeepsMD.h @@ -14,9 +14,9 @@ class PeepsMD public: PeepsMD(Func *func) : func(func) {} - void Init(Peeps *peeps) { __debugbreak(); } - void ProcessImplicitRegs(IR::Instr *instr) { __debugbreak(); } - void PeepAssign(IR::Instr *instr) { __debugbreak(); } + void Init(Peeps *peeps); + void ProcessImplicitRegs(IR::Instr *instr); + void PeepAssign(IR::Instr *instr); }; diff --git a/deps/chakrashim/core/lib/Backend/arm64/Reg.h b/deps/chakrashim/core/lib/Backend/arm64/Reg.h index b995c4d94e4..dbb34696388 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/Reg.h +++ b/deps/chakrashim/core/lib/Backend/arm64/Reg.h @@ -4,8 +4,6 @@ //------------------------------------------------------------------------------------------------------- #pragma once -extern char const * const RegNames[]; - #define RA_DONTALLOCATE 0x1 #define RA_CALLEESAVE 0x2 diff --git a/deps/chakrashim/core/lib/Backend/arm64/RegList.h b/deps/chakrashim/core/lib/Backend/arm64/RegList.h index 7e9897f0f6c..6d87131ff66 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/RegList.h +++ b/deps/chakrashim/core/lib/Backend/arm64/RegList.h @@ -16,81 +16,93 @@ // / / / / / REGDAT(NOREG, noreg, 0xf, TyIllegal, RA_DONTALLOCATE) -// 64 bit Integer Registers -REGDAT(X0, x0, 0, TyInt64, 0) -REGDAT(X1, x1, 1, TyInt64, 0) -REGDAT(X2, x2, 2, TyInt64, 0) -REGDAT(X3, x3, 3, TyInt64, 0) -REGDAT(X4, x4, 4, TyInt64, 0) -REGDAT(X5, x5, 5, TyInt64, 0) -REGDAT(X6, x6, 6, TyInt64, 0) -REGDAT(X7, x7, 7, TyInt64, 0) -REGDAT(X8, x8, 8, TyInt64, 0) -REGDAT(X9, x9, 9, TyInt64, 0) -REGDAT(X10, x10, 10, TyInt64, 0) -REGDAT(X11, x11, 11, TyInt64, 0) -REGDAT(X12, x12, 12, TyInt64, 0) -REGDAT(X13, x13, 13, TyInt64, 0) -REGDAT(X14, x14, 14, TyInt64, 0) -REGDAT(X15, x15, 15, TyInt64, 0) -REGDAT(X16, x16, 16, TyInt64, RA_DONTALLOCATE) // ?? Why is this marked RA_DONTTRACK in UTC? -REGDAT(X17, x17, 17, TyInt64, RA_DONTALLOCATE) // ?? Why is this marked RA_DONTTRACK in UTC? -REGDAT(X18, x18, 18, TyInt64, RA_DONTALLOCATE) //Platform register (TEB pointer) -REGDAT(X19, x19, 19, TyInt64, RA_CALLEESAVE) -REGDAT(X20, x20, 20, TyInt64, RA_CALLEESAVE) -REGDAT(X21, x21, 21, TyInt64, RA_CALLEESAVE) -REGDAT(X22, x22, 22, TyInt64, RA_CALLEESAVE) -REGDAT(X23, x23, 23, TyInt64, RA_CALLEESAVE) -REGDAT(X24, x24, 24, TyInt64, RA_CALLEESAVE) -REGDAT(X25, x25, 25, TyInt64, RA_CALLEESAVE) -REGDAT(X26, x26, 26, TyInt64, RA_CALLEESAVE) -REGDAT(X27, x27, 27, TyInt64, RA_CALLEESAVE) -REGDAT(X28, x28, 28, TyInt64, RA_CALLEESAVE) -REGDAT(FP, fp, 29, TyInt64, RA_DONTALLOCATE) //Frame Pointer -REGDAT(LR, lr, 30, TyInt64, 0) -REGDAT(SP, sp, 31, TyInt64, RA_DONTALLOCATE) +// 32 bit Integer Registers +REGDAT(R0, r0, ARMREG_R0, TyInt64, 0) +REGDAT(R1, r1, ARMREG_R1, TyInt64, 0) +REGDAT(R2, r2, ARMREG_R2, TyInt64, 0) +REGDAT(R3, r3, ARMREG_R3, TyInt64, 0) +REGDAT(R4, r4, ARMREG_R4, TyInt64, 0) +REGDAT(R5, r5, ARMREG_R5, TyInt64, 0) +REGDAT(R6, r6, ARMREG_R6, TyInt64, 0) +REGDAT(R7, r7, ARMREG_R7, TyInt64, 0) +REGDAT(R8, r8, ARMREG_R8, TyInt64, 0) +REGDAT(R9, r9, ARMREG_R9, TyInt64, 0) +REGDAT(R10, r10, ARMREG_R10, TyInt64, 0) +REGDAT(R11, r11, ARMREG_R11, TyInt64, 0) +REGDAT(R12, r12, ARMREG_R12, TyInt64, 0) +REGDAT(R13, r13, ARMREG_R13, TyInt64, 0) +REGDAT(R14, r14, ARMREG_R14, TyInt64, 0) +REGDAT(R15, r15, ARMREG_R15, TyInt64, 0) +REGDAT(R16, r16, ARMREG_R16, TyInt64, RA_DONTALLOCATE) // x16, x17 are "inter-procedural scratch registers", linker is free to insert stubs/islands/etc that use both of them and the surrounding code cannot assume they will be preserved +REGDAT(R17, r17, ARMREG_R17, TyInt64, RA_DONTALLOCATE) // scratch +REGDAT(R18, r18, ARMREG_R18, TyInt64, RA_DONTALLOCATE) // platform register (TEB). x18 is a platform register, should not be touched/modified/saved/restored +REGDAT(R19, r19, ARMREG_R19, TyInt64, RA_CALLEESAVE) +REGDAT(R20, r20, ARMREG_R20, TyInt64, RA_CALLEESAVE) +REGDAT(R21, r21, ARMREG_R21, TyInt64, RA_CALLEESAVE) +REGDAT(R22, r22, ARMREG_R22, TyInt64, RA_CALLEESAVE) +REGDAT(R23, r23, ARMREG_R23, TyInt64, RA_CALLEESAVE) +REGDAT(R24, r24, ARMREG_R24, TyInt64, RA_CALLEESAVE) +REGDAT(R25, r25, ARMREG_R25, TyInt64, RA_CALLEESAVE) +REGDAT(R26, r26, ARMREG_R26, TyInt64, RA_CALLEESAVE) +REGDAT(R27, r27, ARMREG_R27, TyInt64, RA_CALLEESAVE) +REGDAT(R28, r28, ARMREG_R28, TyInt64, RA_CALLEESAVE) +REGDAT(FP, fp, ARMREG_FP, TyInt64, RA_DONTALLOCATE) +REGDAT(LR, lr, ARMREG_LR, TyInt64, 0) +REGDAT(SP, sp, ARMREG_SP, TyInt64, RA_DONTALLOCATE) +REGDAT(ZR, zr, ARMREG_ZR, TyInt64, RA_DONTALLOCATE) +//REGDAT(PC, pc, ARMREG_PC, TyInt64, RA_DONTALLOCATE) + +#ifndef INT_ARG_REG_COUNT +#define INT_ARG_REG_COUNT 8 +#endif // VFP Floating Point Registers -REGDAT(D0, d0, 0, TyFloat64, 0) -REGDAT(D1, d1, 1, TyFloat64, 0) -REGDAT(D2, d2, 2, TyFloat64, 0) -REGDAT(D3, d3, 3, TyFloat64, 0) -REGDAT(D4, d4, 4, TyFloat64, 0) -REGDAT(D5, d5, 5, TyFloat64, 0) -REGDAT(D6, d6, 6, TyFloat64, 0) -REGDAT(D7, d7, 7, TyFloat64, 0) -REGDAT(D8, d8, 8, TyFloat64, RA_CALLEESAVE) -REGDAT(D9, d9, 9, TyFloat64, RA_CALLEESAVE) -REGDAT(D10, d10, 10, TyFloat64, RA_CALLEESAVE) -REGDAT(D11, d11, 11, TyFloat64, RA_CALLEESAVE) -REGDAT(D12, d12, 12, TyFloat64, RA_CALLEESAVE) -REGDAT(D13, d13, 13, TyFloat64, RA_CALLEESAVE) -REGDAT(D14, d14, 14, TyFloat64, RA_CALLEESAVE) -REGDAT(D15, d15, 15, TyFloat64, RA_CALLEESAVE) -REGDAT(D16, d16, 16, TyFloat64, 0) -REGDAT(D17, d17, 17, TyFloat64, 0) -REGDAT(D18, d18, 18, TyFloat64, 0) -REGDAT(D19, d19, 19, TyFloat64, 0) -REGDAT(D20, d20, 20, TyFloat64, 0) -REGDAT(D21, d21, 21, TyFloat64, 0) -REGDAT(D22, d22, 22, TyFloat64, 0) -REGDAT(D23, d23, 23, TyFloat64, 0) -REGDAT(D24, d24, 24, TyFloat64, 0) -REGDAT(D25, d25, 25, TyFloat64, 0) -REGDAT(D26, d26, 26, TyFloat64, 0) -REGDAT(D27, d27, 27, TyFloat64, 0) -REGDAT(D28, d28, 28, TyFloat64, 0) -REGDAT(D29, d29, 29, TyFloat64, 0) -REGDAT(D30, d30, 30, TyFloat64, 0) -REGDAT(D31, d31, 31, TyFloat64, 0) +REGDAT(D0, d0, NEONREG_D0, TyFloat64, 0) +REGDAT(D1, d1, NEONREG_D1, TyFloat64, 0) +REGDAT(D2, d2, NEONREG_D2, TyFloat64, 0) +REGDAT(D3, d3, NEONREG_D3, TyFloat64, 0) +REGDAT(D4, d4, NEONREG_D4, TyFloat64, 0) +REGDAT(D5, d5, NEONREG_D5, TyFloat64, 0) +REGDAT(D6, d6, NEONREG_D6, TyFloat64, 0) +REGDAT(D7, d7, NEONREG_D7, TyFloat64, 0) +REGDAT(D8, d8, NEONREG_D8, TyFloat64, RA_CALLEESAVE) +REGDAT(D9, d9, NEONREG_D9, TyFloat64, RA_CALLEESAVE) +REGDAT(D10, d10, NEONREG_D10, TyFloat64, RA_CALLEESAVE) +REGDAT(D11, d11, NEONREG_D11, TyFloat64, RA_CALLEESAVE) +REGDAT(D12, d12, NEONREG_D12, TyFloat64, RA_CALLEESAVE) +REGDAT(D13, d13, NEONREG_D13, TyFloat64, RA_CALLEESAVE) +REGDAT(D14, d14, NEONREG_D14, TyFloat64, RA_CALLEESAVE) +REGDAT(D15, d15, NEONREG_D15, TyFloat64, RA_CALLEESAVE) +REGDAT(D16, d16, NEONREG_D16, TyFloat64, 0) +REGDAT(D17, d17, NEONREG_D17, TyFloat64, 0) +REGDAT(D18, d18, NEONREG_D18, TyFloat64, 0) +REGDAT(D19, d19, NEONREG_D19, TyFloat64, 0) +REGDAT(D20, d20, NEONREG_D20, TyFloat64, 0) +REGDAT(D21, d21, NEONREG_D21, TyFloat64, 0) +REGDAT(D22, d22, NEONREG_D22, TyFloat64, 0) +REGDAT(D23, d23, NEONREG_D23, TyFloat64, 0) +REGDAT(D24, d24, NEONREG_D24, TyFloat64, 0) +REGDAT(D25, d25, NEONREG_D25, TyFloat64, 0) +REGDAT(D26, d26, NEONREG_D26, TyFloat64, 0) +REGDAT(D27, d27, NEONREG_D27, TyFloat64, 0) +REGDAT(D28, d28, NEONREG_D28, TyFloat64, 0) +REGDAT(D29, d29, NEONREG_D29, TyFloat64, 0) + +// Arm64 has 66 register definitions. Ignore 2 for now to avoid going past the 64 that will fit into a bitvector during register allocation. +// TODO: Reorder registers instead to place DONT_ALLOCATE regs at the end. Requires some changes in LinearScan or for RegNumCount to be in the middle of the list. +//REGDAT(D30, d30, NEONREG_D30, TyFloat64, RA_CALLEESAVE) +//REGDAT(D31, d31, NEONREG_D31, TyFloat64, RA_CALLEESAVE) + +// NOTE: Any ordering change in reg list or addition/deletion requires a corresponding update in SaveAllRegistersAndBailOut/SaveAllRegistersAndBranchBailOut #define FIRST_DOUBLE_ARG_REG RegD0 -#define LAST_DOUBLE_REG RegD31 -#define LAST_DOUBLE_REG_NUM 31 -#define LAST_FLOAT_REG_NUM 31 -#define FIRST_DOUBLE_CALLEE_SAVED_REG_NUM 8 -#define LAST_DOUBLE_CALLEE_SAVED_REG_NUM 15 -#define VFP_REGCOUNT 31 +#define LAST_DOUBLE_REG RegD29 +#define LAST_DOUBLE_REG_NUM 29 +#define LAST_FLOAT_REG_NUM 29 +#define FIRST_DOUBLE_CALLEE_SAVED_REG_NUM 16 +#define LAST_DOUBLE_CALLEE_SAVED_REG_NUM 29 +#define VFP_REGCOUNT\ + ((LAST_DOUBLE_REG - FIRST_DOUBLE_ARG_REG) + 1) #define REGNUM_ISVFPREG(r) ((r) >= RegD0 && (r) <= LAST_DOUBLE_REG) diff --git a/deps/chakrashim/core/lib/Backend/arm64/Thunks.asm b/deps/chakrashim/core/lib/Backend/arm64/Thunks.asm index 43e9ca46650..23f4dd1aef4 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/Thunks.asm +++ b/deps/chakrashim/core/lib/Backend/arm64/Thunks.asm @@ -14,31 +14,47 @@ ;Js::JavascriptMethod NativeCodeGenerator::CheckCodeGen(Js::JavascriptFunction * function) IMPORT |?CheckCodeGen@NativeCodeGenerator@@SAP6APEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZPEAVScriptFunction@3@@Z| +#if defined(_CONTROL_FLOW_GUARD) + IMPORT __guard_check_icall_fptr +#endif + TEXTAREA ;;============================================================================================================ ; NativeCodeGenerator::CheckCodeGenThunk ;;============================================================================================================ ;Js::Var NativeCodeGenerator::CheckCodeGenThunk(Js::RecyclableObject* function, Js::CallInfo callInfo, ...) - NESTED_ENTRY ?CheckCodeGenThunk@NativeCodeGenerator@@SAPEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZ - PROLOG_SAVE_REG_PAIR fp, lr, #-80! ; save volatile registers - stp x0, x1, [sp, #16] - stp x2, x3, [sp, #32] - stp x4, x5, [sp, #48] - stp x6, x7, [sp, #64] - - bl |?CheckCodeGen@NativeCodeGenerator@@SAP6APEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZPEAVScriptFunction@3@@Z| ; call NativeCodeGenerator::CheckCodeGen - mov x16, x0 ; back up entryPoint in R16 - - ldp x6, x7, [sp, #64] ; restore arguments and return address - ldp x4, x5, [sp, #48] - ldp x2, x3, [sp, #32] - ldp x0, x1, [sp, #16] - EPILOG_RESTORE_REG_PAIR fp, lr, #80! - - EPILOG_NOP br x16 ; jump (tail call) to new entryPoint + PROLOG_SAVE_REG_PAIR fp, lr, #-(2*8+16*8)! ; establish stack frame + stp d0, d1, [sp, #16+0*8] + stp d2, d3, [sp, #16+2*8] + stp d4, d5, [sp, #16+4*8] + stp d6, d7, [sp, #16+6*8] + stp x0, x1, [sp, #16+8*8] + stp x2, x3, [sp, #16+10*8] + stp x4, x5, [sp, #16+12*8] + stp x6, x7, [sp, #16+14*8] + + bl |?CheckCodeGen@NativeCodeGenerator@@SAP6APEAXPEAVRecyclableObject@Js@@UCallInfo@3@ZZPEAVScriptFunction@3@@Z| ; call NativeCodeGenerator::CheckCodeGen + mov x15, x0 ; move entry point to x15 + +#if defined(_CONTROL_FLOW_GUARD) + adrp x17, __guard_check_icall_fptr + ldr x17, [x17, __guard_check_icall_fptr] + blr x17 +#endif + + ldp d0, d1, [sp, #16+0*8] + ldp d2, d3, [sp, #16+2*8] + ldp d4, d5, [sp, #16+4*8] + ldp d6, d7, [sp, #16+6*8] + ldp x0, x1, [sp, #16+8*8] + ldp x2, x3, [sp, #16+10*8] + ldp x4, x5, [sp, #16+12*8] + ldp x6, x7, [sp, #16+14*8] + EPILOG_RESTORE_REG_PAIR fp, lr, #(2*8+16*8)! + EPILOG_NOP br x15 ; jump (tail call) to new entryPoint NESTED_END diff --git a/deps/chakrashim/core/lib/Backend/arm64/UnwindInfoManager.cpp b/deps/chakrashim/core/lib/Backend/arm64/UnwindInfoManager.cpp new file mode 100644 index 00000000000..67e7a62b347 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/UnwindInfoManager.cpp @@ -0,0 +1,65 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "Backend.h" +#include "ARM64UnwindEncoder.h" + +UnwindInfoManager::UnwindInfoManager() +{ + for (int which = UnwindInvalid; which < UnwindFunctionOffsetCount; which++) + { + this->m_functionOffsetLabelId[which] = 0; + this->m_functionOffset[which] = 0xffffffff; + } +} + +void UnwindInfoManager::Init(Func * func) +{ + // necessary? Maybe not, but keeping around for now +} + +DWORD UnwindInfoManager::GetPDataCount(DWORD length) +{ + // TODO: Support splitting huge functions if needed? + return 1; +} + +DWORD UnwindInfoManager::GetFunctionOffset(UnwindFunctionOffsets which) +{ + Assert(which < UnwindFunctionOffsetCount); + DWORD result = this->m_functionOffset[which]; + Assert(result != 0xffffffff); + Assert(result % 4 == 0); + return result; +} + +void UnwindInfoManager::FinalizeUnwindInfo(BYTE *functionStart, DWORD codeSize) +{ + // fetch the appropriate offsets and hand off to the generic code + m_xdata.Generate(PULONG(functionStart + this->GetFunctionOffset(UnwindPrologStart)), + PULONG(functionStart + this->GetFunctionOffset(UnwindPrologEnd)), + PULONG(functionStart + this->GetFunctionOffset(UnwindEpilogStart)), + PULONG(functionStart + this->GetFunctionOffset(UnwindEpilogEnd)), + PULONG(functionStart + codeSize)); +} + +void UnwindInfoManager::SetFunctionOffsetLabel(UnwindFunctionOffsets which, IR::LabelInstr *label) +{ + Assert(which < UnwindFunctionOffsetCount); + Assert(this->m_functionOffsetLabelId[which] == 0); + this->m_functionOffsetLabelId[which] = label->m_id; +} + +void UnwindInfoManager::SetLabelOffset(DWORD id, DWORD offset) +{ + Assert(offset % 4 == 0); + for (int which = UnwindInvalid + 1; which < UnwindFunctionOffsetCount; which++) + { + if (this->m_functionOffsetLabelId[which] == id) + { + Assert(this->m_functionOffset[which] == 0xffffffff); + this->m_functionOffset[which] = offset; + } + } +} diff --git a/deps/chakrashim/core/lib/Backend/arm64/UnwindInfoManager.h b/deps/chakrashim/core/lib/Backend/arm64/UnwindInfoManager.h index 01256f22e4c..9373bb9d4ce 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/UnwindInfoManager.h +++ b/deps/chakrashim/core/lib/Backend/arm64/UnwindInfoManager.h @@ -4,253 +4,38 @@ //------------------------------------------------------------------------------------------------------- #pragma once -enum UnwindCode; +#include "ARM64UnwindEncoder.h" + +enum UnwindFunctionOffsets +{ + UnwindInvalid, + UnwindPrologStart, + UnwindPrologEnd, + UnwindEpilogStart, + UnwindEpilogEnd, + UnwindFunctionOffsetCount +}; class UnwindInfoManager { public: - UnwindInfoManager() : - func(NULL), - fragmentStart(NULL), - fragmentLength(0), - epilogEndOffset(0), - prologOffset(0), - savedRegMask(0), - savedDoubleRegMask(0), - homedParamCount(0), - stackDepth(0), - hasCalls(false), - prologLabelId(0), - epilogEndLabelId(0), - pdataArray(NULL), - xdataArray(NULL) - { - } - - void Init(Func * func) { this->func = func; } - void EmitUnwindInfo(PBYTE funcStart, DWORD size, CustomHeap::Allocation* allocation) { __debugbreak(); } - DWORD EmitLongUnwindInfoChunk(DWORD remainingLength) { __debugbreak(); } - - void SetFunc(Func *func) - { - Assert(this->func == NULL); - this->func = func; - } - Func * GetFunc() const - { - return this->func; - } - - void SetFragmentStart(PBYTE pStart) - { - this->fragmentStart = pStart; - } - PBYTE GetFragmentStart() const - { - return this->fragmentStart; - } - - void SetEpilogEndOffset(DWORD offset) - { - Assert(this->epilogEndOffset == 0); - this->epilogEndOffset = offset; - } - DWORD GetEpilogEndOffset() const - { - return this->epilogEndOffset; - } - - void SetPrologOffset(DWORD offset) - { - Assert(this->prologOffset == 0); - this->prologOffset = offset; - } - DWORD GetPrologOffset() const - { - return this->prologOffset; - } - - void SetFragmentLength(DWORD length) - { - this->fragmentLength = length; - } - DWORD GetFragmentLength() const - { - return this->fragmentLength; - } + UnwindInfoManager(); - void SetHomedParamCount(BYTE count) - { - Assert(this->homedParamCount == 0); - this->homedParamCount = count; - } - DWORD GetHomedParamCount() const - { - return this->homedParamCount; - } + void Init(Func * func); + DWORD GetPDataCount(DWORD length); + DWORD SizeOfUnwindInfo() const { return m_xdata.GetXdataBytes(); } + BYTE *GetUnwindInfo() { return reinterpret_cast(const_cast(m_xdata.GetXdata())); } + void FinalizeUnwindInfo(BYTE *functionStart, DWORD codeSize); - void SetStackDepth(DWORD depth) - { - Assert(this->stackDepth == 0); - this->stackDepth = depth; - } - DWORD GetStackDepth() const - { - return this->stackDepth; - } - - void SetHasCalls(bool has) - { - this->hasCalls = has; - } - bool GetHasCalls() const - { - return this->hasCalls; - } - - void SetPrologStartLabel(DWORD id) - { - Assert(this->prologLabelId == 0); - this->prologLabelId = id; - } - DWORD GetPrologStartLabel() const - { - return this->prologLabelId; - } - - void SetEpilogEndLabel(DWORD id) - { - Assert(this->epilogEndLabelId == 0); - this->epilogEndLabelId = id; - } - DWORD GetEpilogEndLabel() const - { - return this->epilogEndLabelId; - } - - bool GetHasChkStk() const { __debugbreak(); return 0; } - DWORD GetPDataCount(DWORD length) { __debugbreak(); return 0; } - void SetSavedReg(BYTE reg) { __debugbreak(); } - DWORD ClearSavedReg(DWORD mask, BYTE reg) const { __debugbreak(); return 0; } - - void SetDoubleSavedRegList(DWORD doubleRegMask) { __debugbreak(); } - DWORD GetDoubleSavedRegList() const { __debugbreak(); return 0; } - - static BYTE GetLastSavedReg(DWORD mask) { __debugbreak(); return 0; } - static BYTE GetFirstSavedReg(DWORD mask) { __debugbreak(); return 0; } + // label management + void SetFunctionOffsetLabel(UnwindFunctionOffsets which, IR::LabelInstr *label); + void SetLabelOffset(DWORD id, DWORD offset); private: + DWORD GetFunctionOffset(UnwindFunctionOffsets which); - Func * func; - PBYTE fragmentStart; - RUNTIME_FUNCTION* pdataArray; - BYTE* xdataArray; - DWORD fragmentLength; - DWORD prologOffset; - DWORD prologLabelId; - DWORD epilogEndLabelId; - DWORD epilogEndOffset; - DWORD savedRegMask; - DWORD savedDoubleRegMask; - DWORD stackDepth; - BYTE homedParamCount; - bool hasCalls; - bool fragmentHasProlog; - bool fragmentHasEpilog; - - void EmitPdata(); - bool CanEmitPackedPdata() const; - void EncodePackedUnwindData(); - void EncodeExpandedUnwindData(); - BYTE * GetBaseAddress(); - - bool IsR4SavedRegRange(bool saveR11) const; - static bool IsR4SavedRegRange(DWORD saveRegMask); - - DWORD XdataTemplate(UnwindCode op) const; - DWORD XdataLength(UnwindCode op) const; - - DWORD EmitXdataStackAlloc(BYTE xData[], DWORD byte, DWORD stack); - DWORD EmitXdataHomeParams(BYTE xData[], DWORD byte); - DWORD EmitXdataRestoreRegs(BYTE xData[], DWORD byte, DWORD savedRegMask, bool restoreLR); - DWORD EmitXdataRestoreDoubleRegs(BYTE xData[], DWORD byte, DWORD savedDoubleRegMask); - DWORD EmitXdataIndirReturn(BYTE xData[], DWORD byte); - DWORD EmitXdataNop32(BYTE xData[], DWORD byte); - DWORD EmitXdataNop16(BYTE xData[], DWORD byte); - DWORD EmitXdataEnd(BYTE xData[], DWORD byte); - DWORD EmitXdataEndPlus16(BYTE xData[], DWORD byte); - DWORD EmitXdataLocalsPointer(BYTE xData[], DWORD byte, BYTE regEncode); - - DWORD RelativeRegEncoding(RegNum reg, RegNum baseReg) const; - DWORD WriteXdataBytes(BYTE xdata[], DWORD byte, DWORD encoding, DWORD length); - - // Constants defined in the ABI. - - static const DWORD MaxPackedPdataFuncLength = 0xFFE; - static const DWORD MaxPackedPdataStackDepth = 0xFCC; - - static const DWORD PackedPdataFlagMask = 3; - static const DWORD ExpandedPdataFlag = 0; - - // Function length is required to have only these bits set. - static const DWORD PackedFuncLengthMask = 0xFFE; - // Bit offset of length within pdata dword, combined with right-shift of encoded length. - static const DWORD PackedFuncLengthShift = 1; - - static const DWORD PackedNoPrologBits = 2; - static const DWORD PackedNormalFuncBits = 1; - - static const DWORD PackedNonLeafRetBits = 0; - static const DWORD PackedLeafRetBits = (1 << 13); - static const DWORD PackedNoEpilogBits = (3 << 13); - - // C (frame chaining) and L (save LR) bits. - static const DWORD PackedNonLeafFunctionBits = (1 << 20) | (1 << 21); - - static const DWORD PackedHomedParamsBit = (1 << 15); - - static const DWORD PackedRegShift = 16; - static const DWORD PackedRegMask = 7; - // Indicate no saved regs with a Reg field of 0x111 and the R bit set. - static const DWORD PackedNoSavedRegsBits = (7 << PackedRegShift) | (1 << 19); - - // Stack depth is required to have only these bits set. - static const DWORD PackedStackDepthMask = 0xFFC; - // Bit offset of stack depth within pdata dword, combined with right-shift of encoded value. - static const DWORD PackedStackDepthShift = 20; - - static const DWORD MaxXdataFuncLength = 0x7FFFE; - static const DWORD XdataFuncLengthMask = 0x7FFFE; - static const DWORD XdataFuncLengthAdjust = 1; - - static const DWORD XdataSingleEpilogShift = 21; - static const DWORD XdataFuncFragmentShift = 22; - static const DWORD XdataEpilogCountShift = 23; - - static const DWORD MaxXdataEpilogCount = 0x1F; - static const DWORD MaxXdataDwordCount = 0xF; - static const DWORD XdataDwordCountShift = 28; - -public: - // Xdata constants. - static const DWORD MaxXdataBytes = 40; //buffer of 4 for any future additions - // - // 28 == 4 (header DWORD) + - // (4 (max stack alloc code) + - // 1 (locals pointer setup) + - // 5 (NOP for _chkstk case) + - // 1 (double reg saves) + - // 2 (reg saves) + - // 1 (r11 setup) + - // 2 (r11,lr saves) + - // 1 (home params) + - // 1 (NOP) + - // 1 (end prolog) + - // 4 (max stack alloc code, in case of locals pointer setup) + - // 1 (double reg saves) + - // 2 (reg saves) + - // 2 (r11 save) + - // 2 (indir return) + - // 1 (end epilog)) rounded up to a DWORD boundary + DWORD m_functionOffsetLabelId[UnwindFunctionOffsetCount]; + DWORD m_functionOffset[UnwindFunctionOffsetCount]; + Arm64XdataGenerator m_xdata; }; diff --git a/deps/chakrashim/core/lib/Backend/arm64/machvalues.h b/deps/chakrashim/core/lib/Backend/arm64/machvalues.h new file mode 100644 index 00000000000..9e508568046 --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/arm64/machvalues.h @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#pragma once + +// +// Machine dependent constants. +// + +static const int MachChar = 1; +static const int MachShort = 2; +static const int MachInt = 4; +static const int MachRegInt = 8; +static const int MachPtr = 8; +static const int MachDouble = 8; +static const int MachRegDouble = 8; +static const int MachArgsSlotOffset = MachPtr; +static const int MachStackAlignment = 16; // On ARM64 SP needs to be 16 byte aligned for load/store +static const unsigned __int64 MachSignBit = 0x8000000000000000; \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/arm64/md.h b/deps/chakrashim/core/lib/Backend/arm64/md.h index 7d34a210ab1..56c38dbf9f3 100644 --- a/deps/chakrashim/core/lib/Backend/arm64/md.h +++ b/deps/chakrashim/core/lib/Backend/arm64/md.h @@ -11,19 +11,6 @@ #undef MD_ENCODE_LG_CONSTS #define MD_ENCODE_LG_CONSTS false -// -// Machine dependent constants. -// -const int MachChar = 1; -const int MachShort = 2; -const int MachInt = 4; -const int MachRegInt = 8; -__declspec(selectany) const int MachPtr = 8; -const int MachDouble = 8; -const int MachRegDouble = 8; -const int MachArgsSlotOffset = MachPtr; -const int MachStackAlignment = 16; - const int PAGESIZE = 0x1000; const IRType TyMachReg = TyInt64; @@ -31,11 +18,13 @@ const IRType TyMachPtr = TyUint64; const IRType TyMachDouble = TyFloat64; const DWORD EMIT_BUFFER_ALIGNMENT = 16; -const DWORD INSTR_ALIGNMENT = 4; +const DWORD INSTR_ALIGNMENT = 2; #ifdef INSERT_NOPS const int CountNops = 10; -const int MachMaxInstrSize = (CountNops + 1)*4; +const int MachMaxInstrSize = (2 * CountNops + 1)*4; #else const int MachMaxInstrSize = 4; #endif + +#define SOFTWARE_FIXFOR_HARDWARE_BUGWIN8_502326 diff --git a/deps/chakrashim/core/lib/Backend/i386/EncoderMD.cpp b/deps/chakrashim/core/lib/Backend/i386/EncoderMD.cpp index e4f7a4d5283..22dd76f7d25 100644 --- a/deps/chakrashim/core/lib/Backend/i386/EncoderMD.cpp +++ b/deps/chakrashim/core/lib/Backend/i386/EncoderMD.cpp @@ -1070,6 +1070,7 @@ EncoderMD::Encode(IR::Instr *instr, BYTE *pc, BYTE* beginCodeAddress) case Js::OpCode::MOVAPS: case Js::OpCode::MOVUPS: case Js::OpCode::MOVHPD: + case Js::OpCode::MOVLPD: if (!opr1->IsRegOpnd()) { Assert(opr2->IsRegOpnd()); @@ -1137,6 +1138,9 @@ EncoderMD::Encode(IR::Instr *instr, BYTE *pc, BYTE* beginCodeAddress) continue; } break; + case Js::OpCode::PEXTRD: + this->EmitModRM(instr, opr1, this->GetRegEncode(opr2->AsRegOpnd())); + break; case Js::OpCode::BT: case Js::OpCode::BTR: /* diff --git a/deps/chakrashim/core/lib/Backend/i386/LinearScanMD.cpp b/deps/chakrashim/core/lib/Backend/i386/LinearScanMD.cpp index f7a373dbd1e..b00126f7ef8 100644 --- a/deps/chakrashim/core/lib/Backend/i386/LinearScanMD.cpp +++ b/deps/chakrashim/core/lib/Backend/i386/LinearScanMD.cpp @@ -219,6 +219,7 @@ LinearScanMD::GenerateBailInForGeneratorYield(IR::Instr * resumeLabelInstr, Bail newInstr = IR::Instr::New(Js::OpCode::CALL, this->func); newInstr->SetSrc1(IR::HelperCallOpnd::New(IR::HelperCRT_chkstk, this->func)); instrAfter->InsertBefore(newInstr); + this->func->SetHasCallsOnSelfAndParents(); } else { @@ -249,8 +250,8 @@ LinearScanMD::GenerateBailInForGeneratorYield(IR::Instr * resumeLabelInstr, Bail IR::Instr * instrInsertStackSym = instrAfter; IR::Instr * instrInsertRegSym = instrAfter; - Assert(bailOutInfo->capturedValues.constantValues.Empty()); - Assert(bailOutInfo->capturedValues.copyPropSyms.Empty()); + Assert(bailOutInfo->capturedValues->constantValues.Empty()); + Assert(bailOutInfo->capturedValues->copyPropSyms.Empty()); auto restoreSymFn = [this, &eaxRegOpnd, &ecxRegOpnd, &eaxRestoreInstr, &instrInsertStackSym, &instrInsertRegSym](SymID symId) { @@ -326,9 +327,9 @@ LinearScanMD::GenerateBailInForGeneratorYield(IR::Instr * resumeLabelInstr, Bail } NEXT_BITSET_IN_SPARSEBV; - if (bailOutInfo->capturedValues.argObjSyms) + if (bailOutInfo->capturedValues->argObjSyms) { - FOREACH_BITSET_IN_SPARSEBV(symId, bailOutInfo->capturedValues.argObjSyms) + FOREACH_BITSET_IN_SPARSEBV(symId, bailOutInfo->capturedValues->argObjSyms) { restoreSymFn(symId); } @@ -540,11 +541,11 @@ LinearScanMD::InsertOpHelperSpillsAndRestores(OpHelperBlock const& opHelperBlock else { regOpnd = IR::RegOpnd::New(NULL, opHelperSpilledLifetime.reg, sym->GetType(), this->func); - IR::Instr* instr = LowererMD::CreateAssign(IR::SymOpnd::New(sym, sym->GetType(), func), regOpnd, opHelperBlock.opHelperLabel->m_next); + IR::Instr* instr = Lowerer::InsertMove(IR::SymOpnd::New(sym, sym->GetType(), func), regOpnd, opHelperBlock.opHelperLabel->m_next); instr->CopyNumber(opHelperBlock.opHelperLabel); if (opHelperSpilledLifetime.reload) { - instr = LowererMD::CreateAssign(regOpnd, IR::SymOpnd::New(sym, sym->GetType(), func), opHelperBlock.opHelperEndInstr); + instr = Lowerer::InsertMove(regOpnd, IR::SymOpnd::New(sym, sym->GetType(), func), opHelperBlock.opHelperEndInstr); instr->CopyNumber(opHelperBlock.opHelperEndInstr); } } diff --git a/deps/chakrashim/core/lib/Backend/i386/LowererMDArch.cpp b/deps/chakrashim/core/lib/Backend/i386/LowererMDArch.cpp index 97b4d9ae1cb..51c187550a9 100644 --- a/deps/chakrashim/core/lib/Backend/i386/LowererMDArch.cpp +++ b/deps/chakrashim/core/lib/Backend/i386/LowererMDArch.cpp @@ -109,6 +109,7 @@ LowererMDArch::GetAssignOp(IRType type) case TySimd128B8: case TySimd128B16: case TySimd128D2: + case TySimd128I2: return Js::OpCode::MOVUPS; default: return Js::OpCode::MOV; @@ -147,9 +148,7 @@ LowererMDArch::LoadInputParamPtr(IR::Instr *instrInsert, IR::RegOpnd *optionalDs // Stack looks like (EBP chain)+0, (return addr)+4, (function object)+8, (arg count)+12, (this)+16, actual args StackSym *paramSym = StackSym::New(TyVar, this->m_func); this->m_func->SetArgOffset(paramSym, 5 * MachPtr); - IR::Instr *instr = this->lowererMD->LoadStackAddress(paramSym, optionalDstOpnd); - instrInsert->InsertBefore(instr); - return instr; + return this->lowererMD->m_lowerer->InsertLoadStackAddress(paramSym, instrInsert, optionalDstOpnd); } } @@ -295,8 +294,7 @@ LowererMDArch::LoadHeapArguments(IR::Instr *instrArgs) */ StackSym *firstRealArgSlotSym = func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); this->m_func->SetArgOffset(firstRealArgSlotSym, firstRealArgSlotSym->m_offset + MachPtr); - IR::Instr *instr = this->lowererMD->LoadStackAddress(firstRealArgSlotSym); - instrArgs->InsertBefore(instr); + IR::Instr *instr = this->lowererMD->m_lowerer->InsertLoadStackAddress(firstRealArgSlotSym, instrArgs); this->LoadHelperArgument(instrArgs, instr->GetDst()); // s2 = actual argument count (without counting "this"). @@ -340,7 +338,7 @@ LowererMDArch::LoadHeapArguments(IR::Instr *instrArgs) // the function object for generator calls is a GeneratorVirtualScriptFunction object // and we need to pass the real JavascriptGeneratorFunction object so grab it instead IR::RegOpnd *tmpOpnd = IR::RegOpnd::New(TyMachReg, func); - LowererMD::CreateAssign(tmpOpnd, srcOpnd, instrArgs); + Lowerer::InsertMove(tmpOpnd, srcOpnd, instrArgs); srcOpnd = IR::IndirOpnd::New(tmpOpnd, Js::GeneratorVirtualScriptFunction::GetRealFunctionOffset(), TyMachPtr, func); } @@ -413,8 +411,7 @@ LowererMDArch::LoadHeapArgsCached(IR::Instr *instrArgs) // s4 = address of first actual argument (after "this") StackSym *firstRealArgSlotSym = func->GetInlineeArgvSlotOpnd()->m_sym->AsStackSym(); this->m_func->SetArgOffset(firstRealArgSlotSym, firstRealArgSlotSym->m_offset + MachPtr); - IR::Instr *instr = this->lowererMD->LoadStackAddress(firstRealArgSlotSym); - instrArgs->InsertBefore(instr); + IR::Instr *instr = this->lowererMD->m_lowerer->InsertLoadStackAddress(firstRealArgSlotSym, instrArgs); this->LoadHelperArgument(instrArgs, instr->GetDst()); // s3 = formal argument count (without counting "this") @@ -482,7 +479,7 @@ LowererMDArch::LoadNewScObjFirstArg(IR::Instr * instr, IR::Opnd * dst, ushort ex { // No need to do anything different for spread calls on x86 since we push args. IR::SymOpnd * argOpnd = IR::SymOpnd::New(this->m_func->m_symTable->GetArgSlotSym(1), TyVar, this->m_func); - IR::Instr * argInstr = LowererMD::CreateAssign(argOpnd, dst, instr); + IR::Instr * argInstr = Lowerer::InsertMove(argOpnd, dst, instr); return argInstr; } @@ -806,15 +803,7 @@ LowererMDArch::LowerAsmJsCallI(IR::Instr * callInstr) // Mov each arg to it's argSlot src2 = argInstr->UnlinkSrc2(); - IR::Opnd* dst = argInstr->GetDst(); - if (dst && IRType_IsInt64(dst->GetType())) - { - argInstr = LowerInt64Assign(argInstr); - } - else - { - lowererMD->ChangeToAssign(argInstr); - } + LowererMD::ChangeToAssign(argInstr); ++argCount; } @@ -878,6 +867,7 @@ LowererMDArch::LowerAsmJsCallI(IR::Instr * callInstr) IR::Instr * retInstr = callInstr; callInstr->m_opcode = Js::OpCode::CALL; + callInstr->m_func->SetHasCallsOnSelfAndParents(); if (callInstr->GetDst()) { @@ -971,7 +961,22 @@ LowererMDArch::LowerAsmJsLdElemHelper(IR::Instr * instr, bool isSimdLoad /*= fal } else { - lowererMD->m_lowerer->InsertCompareBranch(cmpOpnd, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); +#ifdef ENABLE_WASM_SIMD + if (m_func->GetJITFunctionBody()->IsWasmFunction() && src1->AsIndirOpnd()->GetOffset()) //WASM.SIMD + { + IR::RegOpnd *tmp = IR::RegOpnd::New(cmpOpnd->GetType(), m_func); + Lowerer::InsertMove(tmp, cmpOpnd, helperLabel); + // ADD tmp, offset + Lowerer::InsertAdd(true, tmp, tmp, IR::IntConstOpnd::New((uint32)src1->AsIndirOpnd()->GetOffset(), tmp->GetType(), m_func), helperLabel); + // JB helper + Lowerer::InsertBranch(Js::OpCode::JB, helperLabel, helperLabel); + lowererMD->m_lowerer->InsertCompareBranch(tmp, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); + } + else +#endif + { + lowererMD->m_lowerer->InsertCompareBranch(cmpOpnd, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); + } } Lowerer::InsertBranch(Js::OpCode::Br, loadLabel, helperLabel); @@ -1033,7 +1038,22 @@ LowererMDArch::LowerAsmJsStElemHelper(IR::Instr * instr, bool isSimdStore /*= fa } else { - lowererMD->m_lowerer->InsertCompareBranch(cmpOpnd, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); +#ifdef ENABLE_WASM_SIMD + if (m_func->GetJITFunctionBody()->IsWasmFunction() && dst->AsIndirOpnd()->GetOffset()) //WASM.SIMD + { + IR::RegOpnd *tmp = IR::RegOpnd::New(cmpOpnd->GetType(), m_func); + Lowerer::InsertMove(tmp, cmpOpnd, helperLabel); + // ADD tmp, offset + Lowerer::InsertAdd(true, tmp, tmp, IR::IntConstOpnd::New((uint32)dst->AsIndirOpnd()->GetOffset(), tmp->GetType(), m_func), helperLabel); + // JB helper + Lowerer::InsertBranch(Js::OpCode::JB, helperLabel, helperLabel); + lowererMD->m_lowerer->InsertCompareBranch(tmp, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); + } + else +#endif + { + lowererMD->m_lowerer->InsertCompareBranch(cmpOpnd, instr->UnlinkSrc2(), Js::OpCode::BrGe_A, true, helperLabel, helperLabel); + } } if (isSimdStore) @@ -1048,27 +1068,6 @@ LowererMDArch::LowerAsmJsStElemHelper(IR::Instr * instr, bool isSimdStore /*= fa return doneLabel; } -IR::Instr * -LowererMDArch::LowerCallPut(IR::Instr *callInstr) -{ - int32 argCount = this->LowerCallArgs(callInstr, Js::CallFlags_None); - - // load native entry point from script function into eax - - IR::Opnd * functionWrapOpnd = callInstr->UnlinkSrc1(); - AssertMsg(functionWrapOpnd->IsRegOpnd() && functionWrapOpnd->AsRegOpnd()->m_sym->IsStackSym(), - "Expected call src to be stackSym"); - - // push function wrapper - - this->LoadHelperArgument(callInstr, functionWrapOpnd); - - IR::HelperCallOpnd *helperCallOpnd = IR::HelperCallOpnd::New(IR::HelperOp_InvokePut, this->m_func); - callInstr->SetSrc1(helperCallOpnd); - - return this->LowerCall(callInstr, argCount); -} - int32 LowererMDArch::LowerCallArgs(IR::Instr *callInstr, ushort callFlags, Js::ArgSlot extraArgs, IR::IntConstOpnd **callInfoOpndRef) { @@ -1114,7 +1113,7 @@ LowererMDArch::LowerCallArgs(IR::Instr *callInstr, ushort callFlags, Js::ArgSlot } AssertMsg(startCallInstr->m_opcode == Js::OpCode::StartCall || startCallInstr->m_opcode == Js::OpCode::LoweredStartCall, "Problem with arg chain."); - AssertMsg(m_func->GetJITFunctionBody()->IsAsmJsMode() || startCallInstr->GetArgOutCount(/*getInterpreterArgOutCount*/ false) == argCount, "ArgCount doesn't match StartCall count"); + AssertMsg(startCallInstr->GetArgOutCount(/*getInterpreterArgOutCount*/ false) == argCount, "ArgCount doesn't match StartCall count"); // // Machine dependent lowering @@ -1173,7 +1172,7 @@ LowererMDArch::LowerCall(IR::Instr * callInstr, uint32 argCount, RegNum regNum) callInstr->m_opcode = Js::OpCode::CALL; // This is required here due to calls created during lowering - callInstr->m_func->SetHasCalls(); + callInstr->m_func->SetHasCallsOnSelfAndParents(); if (callInstr->GetDst()) { @@ -1278,7 +1277,7 @@ LowererMDArch::LowerStartCall(IR::Instr * startCallInstr, IR::Instr* insertInstr // call _chkstk IR::RegOpnd *eaxOpnd = IR::RegOpnd::New(nullptr, this->GetRegChkStkParam(), TyMachReg, this->m_func); - this->lowererMD->CreateAssign(eaxOpnd, IR::IntConstOpnd::New(sizeValue, TyInt32, this->m_func, /*dontEncode*/true), insertInstr); + Lowerer::InsertMove(eaxOpnd, IR::IntConstOpnd::New(sizeValue, TyInt32, this->m_func, /*dontEncode*/true), insertInstr); newStartCall = IR::Instr::New(Js::OpCode::Call, this->m_func); @@ -1306,15 +1305,11 @@ int32 LowererMDArch::LowerStartCallAsmJs(IR::Instr * startCallInstr, IR::Instr * insertInstr, IR::Instr * callInstr) { AssertMsg(startCallInstr->GetSrc1()->IsIntConstOpnd(), "Bad src on StartCall"); + AssertMsg(startCallInstr->GetSrc2()->IsIntConstOpnd(), "Bad src on StartCall"); - IR::IntConstOpnd * sizeOpnd = startCallInstr->GetSrc1()->AsIntConstOpnd(); + IR::IntConstOpnd * sizeOpnd = startCallInstr->GetSrc2()->AsIntConstOpnd(); IntConstType sizeValue = sizeOpnd->GetValue(); - if (callInstr->m_opcode == Js::OpCode::AsmJsCallI) - { - // we will push FunctionObject, so don't need to worry about that - sizeValue -= MachPtr; - } // Maintain 8 byte alignment of the stack. // We do this by adjusting the SUB for stackCall to make sure it maintains 8 byte alignment. @@ -1333,7 +1328,7 @@ LowererMDArch::LowerStartCallAsmJs(IR::Instr * startCallInstr, IR::Instr * inser // call _chkstk IR::RegOpnd *eaxOpnd = IR::RegOpnd::New(nullptr, GetRegChkStkParam(), TyMachReg, m_func); - lowererMD->CreateAssign(eaxOpnd, IR::IntConstOpnd::New(sizeValue, TyInt32, m_func, /*dontEncode*/true), insertInstr); + Lowerer::InsertMove(eaxOpnd, IR::IntConstOpnd::New(sizeValue, TyInt32, m_func, /*dontEncode*/true), insertInstr); newStartCall = IR::Instr::New(Js::OpCode::Call, m_func); @@ -1515,7 +1510,7 @@ LowererMDArch::LowerEntryInstr(IR::EntryInstr * entryInstr) // Allocate the inlined arg out stack in the locals. Allocate an additional slot so that // we can unconditionally clear the argc slot of the next frame. - this->m_func->m_localStackHeight += ((this->m_func->GetMaxInlineeArgOutCount() + 1) * MachPtr); + this->m_func->m_localStackHeight += m_func->GetMaxInlineeArgOutSize() + MachPtr; bytesOnStack += this->m_func->m_localStackHeight; @@ -1529,14 +1524,10 @@ LowererMDArch::LowerEntryInstr(IR::EntryInstr * entryInstr) Assert(this->m_func->hasBailout || this->bailOutStackRestoreLabel == nullptr); this->m_func->frameSize = bytesOnStack; - if (this->m_func->GetMaxInlineeArgOutCount()) + if (this->m_func->HasInlinee()) { this->m_func->GetJITOutput()->SetFrameHeight(this->m_func->m_localStackHeight); - } - // Zero initialize the first inlinee frames argc. - if (this->m_func->GetMaxInlineeArgOutCount()) - { StackSym *sym = this->m_func->m_symTable->GetArgSlotSym((Js::ArgSlot)-1); sym->m_isInlinedArgSlot = true; sym->m_offset = 0; @@ -1577,7 +1568,7 @@ LowererMDArch::LowerEntryInstr(IR::EntryInstr * entryInstr) this->LowerCall(callInstr, 0, RegECX); IR::IntConstOpnd * stackSizeOpnd = IR::IntConstOpnd::New(stackSize, TyMachReg, this->m_func); - this->lowererMD->CreateAssign(eaxOpnd, stackSizeOpnd, entryInstr->m_next); + Lowerer::InsertMove(eaxOpnd, stackSizeOpnd, entryInstr->m_next); } } @@ -1605,115 +1596,6 @@ LowererMDArch::LowerEntryInstr(IR::EntryInstr * entryInstr) return entryInstr; } -IR::Instr * -LowererMDArch::LowerEntryInstrAsmJs(IR::EntryInstr * entryInstr) -{ - // PUSH EBP - // MOV EBP, ESP - // StackProbe - // MOV EAX, LocalStackHeight / LEA ESP, [ESP - stackSize] - // CALL chkstk / - // PUSH used nonvolatiles - - // Calculate stack size - int32 bytesOnStack = MachRegInt + MachRegInt; // Account for return address+push EBP... - - for (RegNum reg = (RegNum)(RegNOREG + 1); reg < RegNumCount; reg = (RegNum)(reg + 1)) - { - if (LinearScan::IsCalleeSaved(reg) && (m_func->m_regsUsed.Test(reg))) - { - bytesOnStack += MachRegInt; - } - } - m_func->m_localStackHeight += MachPtr; - bytesOnStack += m_func->m_localStackHeight; - - int32 alignment = Math::Align(bytesOnStack, MachStackAlignment) - bytesOnStack; - - // Make sure this frame allocation maintains 8-byte alignment. Our point of reference is the return address - m_func->m_localStackHeight += alignment; - bytesOnStack += alignment; - Assert(Math::Align(bytesOnStack, MachStackAlignment) == bytesOnStack); - - m_func->frameSize = bytesOnStack; - - - IR::Instr * insertInstr = entryInstr->m_next; - - IR::RegOpnd * ebpOpnd = IR::RegOpnd::New(nullptr, GetRegBlockPointer(), TyMachReg, m_func); - IR::RegOpnd * espOpnd = IR::RegOpnd::New(nullptr, GetRegStackPointer(), TyMachReg, m_func); - - // Generate PUSH EBP - IR::Instr * pushEbpInstr = IR::Instr::New(Js::OpCode::PUSH, m_func); - pushEbpInstr->SetSrc1(ebpOpnd); - insertInstr->InsertBefore(pushEbpInstr); - - // Generate MOV EBP, ESP - IR::Instr * movInstr = IR::Instr::New(Js::OpCode::MOV, ebpOpnd, espOpnd, m_func); - insertInstr->InsertBefore(movInstr); - - // Generate StackProbe - size_t frameSize = bytesOnStack + m_func->m_argSlotsForFunctionsCalled * MachPtr + Js::Constants::MinStackJIT; - GeneratePrologueStackProbe(insertInstr->m_prev, frameSize); - - if (m_func->m_localStackHeight != 0) - { - int32 stackSize = m_func->m_localStackHeight - MachPtr; - if (m_func->m_localStackHeight <= PAGESIZE) - { - // Generate LEA ESP, [ESP - LocalStackHeight] // Atom prefers LEA for address computations - - IR::IndirOpnd *indirOpnd = IR::IndirOpnd::New(espOpnd, -stackSize, TyMachReg, m_func); - IR::Instr * subInstr = IR::Instr::New(Js::OpCode::LEA, espOpnd, indirOpnd, m_func); - - insertInstr->InsertBefore(subInstr); - } - else - { - IR::RegOpnd *eaxOpnd = IR::RegOpnd::New(nullptr, GetRegChkStkParam(), TyMachReg, m_func); - - // Generate MOV EAX, LocalStackHeight - IR::IntConstOpnd * stackSizeOpnd = IR::IntConstOpnd::New(stackSize, TyMachReg, m_func); - lowererMD->CreateAssign(eaxOpnd, stackSizeOpnd, insertInstr); - - // Generate CALL chkstk - IR::Instr * callInstr = IR::Instr::New(Js::OpCode::Call, eaxOpnd, - IR::HelperCallOpnd::New(IR::HelperCRT_chkstk, m_func), m_func); - insertInstr->InsertBefore(callInstr); - - LowerCall(callInstr, 0, RegECX); - - } - } - - // PUSH used callee-saved registers - - for (RegNum reg = (RegNum)(RegNumCount - 1); reg > RegNOREG; reg = (RegNum)(reg - 1)) - { - if (LinearScan::IsCalleeSaved(reg) && (m_func->m_regsUsed.Test(reg))) - { - IR::RegOpnd * regOpnd = IR::RegOpnd::New(nullptr, reg, TyMachReg, m_func); - IR::Instr * pushInstr = IR::Instr::New(Js::OpCode::PUSH, m_func); - pushInstr->SetSrc1(regOpnd); - insertInstr->InsertBefore(pushInstr); - } - } - -#ifdef ENABLE_DEBUG_CONFIG_OPTIONS - if (Js::Configuration::Global.flags.IsEnabled(Js::CheckAlignmentFlag)) - { - // CALL CheckAlignment - IR::Instr * callInstr = IR::Instr::New(Js::OpCode::Call, m_func); - callInstr->SetSrc1(IR::HelperCallOpnd::New(IR::HelperScrFunc_CheckAlignment, m_func)); - insertInstr->InsertBefore(callInstr); - - LowerCall(callInstr, 0, RegEAX); - } -#endif - - return entryInstr; -} - void LowererMDArch::GeneratePrologueStackProbe(IR::Instr *entryInstr, size_t frameSize) { @@ -1763,7 +1645,7 @@ LowererMDArch::GeneratePrologueStackProbe(IR::Instr *entryInstr, size_t frameSiz stackLimitOpnd = IR::RegOpnd::New(nullptr, RegEAX, TyMachReg, this->m_func); intptr_t pLimit = m_func->GetThreadContextInfo()->GetThreadStackLimitAddr(); IR::MemRefOpnd * memOpnd = IR::MemRefOpnd::New(pLimit, TyMachReg, this->m_func); - this->lowererMD->CreateAssign(stackLimitOpnd, memOpnd, insertInstr); + Lowerer::InsertMove(stackLimitOpnd, memOpnd, insertInstr); instr = IR::Instr::New(Js::OpCode::ADD, stackLimitOpnd, stackLimitOpnd, IR::IntConstOpnd::New(frameSize, TyMachReg, this->m_func), this->m_func); @@ -1898,20 +1780,22 @@ LowererMDArch::LowerExitInstrCommon(IR::ExitInstr * exitInstr) } IR::Instr * -LowererMDArch::LowerInt64Assign(IR::Instr * instr) +LowererMDArch::ChangeToAssignInt64(IR::Instr * instr) { - IR::Opnd* dst = instr->GetDst(); - IR::Opnd* src1 = instr->GetSrc1(); + IR::Opnd* dst = instr->UnlinkDst(); + IR::Opnd* src1 = instr->UnlinkSrc1(); + Func* m_func = instr->m_func; if (dst && (dst->IsRegOpnd() || dst->IsSymOpnd() || dst->IsIndirOpnd()) && src1) { int dstSize = dst->GetSize(); int srcSize = src1->GetSize(); Int64RegPair dstPair = m_func->FindOrCreateInt64Pair(dst); Int64RegPair src1Pair = m_func->FindOrCreateInt64Pair(src1); - IR::Instr* lowLoadInstr = IR::Instr::New(Js::OpCode::Ld_I4, dstPair.low, src1Pair.low, m_func); - instr->InsertBefore(lowLoadInstr); - lowererMD->ChangeToAssign(lowLoadInstr); + instr->SetSrc1(src1Pair.low); + instr->SetDst(dstPair.low); + LowererMD::ChangeToAssignNoBarrierCheck(instr); // No WriteBarrier for assigning int64 on x86 + IR::Instr * insertBeforeInstr = instr->m_next; // Do not store to memory if we wanted less than 8 bytes const bool canAssignHigh = !dst->IsIndirOpnd() || dstSize == 8; @@ -1921,9 +1805,7 @@ LowererMDArch::LowerInt64Assign(IR::Instr * instr) if (!isLoadFromWordMem) { // Normal case, assign source's high bits to dst's high bits - IR::Instr* highLoadInstr = IR::Instr::New(Js::OpCode::Ld_I4, dstPair.high, src1Pair.high, m_func); - instr->InsertBefore(highLoadInstr); - lowererMD->ChangeToAssign(highLoadInstr); + Lowerer::InsertMove(dstPair.high, src1Pair.high, insertBeforeInstr, /*generateWriteBarrier*/false); } else { @@ -1932,30 +1814,26 @@ LowererMDArch::LowerInt64Assign(IR::Instr * instr) if (IRType_IsUnsignedInt(src1->GetType())) { // If this is an unsigned assign from memory, we can simply set the high bits to 0 - IR::Instr* highLoadInstr = IR::Instr::New(Js::OpCode::Ld_I4, dstPair.high, IR::IntConstOpnd::New(0, TyInt32, m_func), m_func); - lowererMD->ChangeToAssign(highLoadInstr); - instr->InsertBefore(highLoadInstr); + Lowerer::InsertMove(dstPair.high, IR::IntConstOpnd::New(0, TyInt32, m_func), insertBeforeInstr, /*generateWriteBarrier*/false); } else { // If this is a signed assign from memory, we need to extend the sign - IR::Instr* highExtendInstr = IR::Instr::New(Js::OpCode::Ld_I4, dstPair.high, dstPair.low, m_func); - instr->InsertBefore(highExtendInstr); - lowererMD->ChangeToAssign(highExtendInstr); + IR::Instr* highExtendInstr = Lowerer::InsertMove(dstPair.high, dstPair.low, insertBeforeInstr, /*generateWriteBarrier*/false); highExtendInstr = IR::Instr::New(Js::OpCode::SAR, dstPair.high, dstPair.high, IR::IntConstOpnd::New(31, TyInt32, m_func), m_func); - instr->InsertBefore(highExtendInstr); + insertBeforeInstr->InsertBefore(highExtendInstr); } } } - - instr->Remove(); - return lowLoadInstr->m_prev; + + return instr->m_prev; } return instr; } + void LowererMDArch::EmitInt64Instr(IR::Instr *instr) { @@ -3150,8 +3028,7 @@ bool Assert(dst->IsRegOpnd()); StackSym * tempNumberSym = lowererMD->GetLowerer()->GetTempNumberSym(dst, instrShift->dstIsTempNumberTransferred); - IR::Instr *load = lowererMD->LoadStackAddress(tempNumberSym); - instrShift->InsertBefore(load); + IR::Instr *load = lowererMD->m_lowerer->InsertLoadStackAddress(tempNumberSym, instrShift); tempOpnd = load->GetDst(); this->LoadHelperArgument(instrShift, tempOpnd); } @@ -3307,7 +3184,7 @@ bool if (opndSrc2->IsAddrOpnd()) { - instr = lowererMD->CreateAssign( + instr = Lowerer::InsertMove( IR::RegOpnd::New(opndSrc2->GetType(), instrShift->m_func), opndSrc2, instrShift); opndSrc2 = instr->GetDst(); @@ -4046,7 +3923,7 @@ LowererMDArch::FinalLower() break; case Js::OpCode::Leave: Assert(this->m_func->DoOptimizeTry() && !this->m_func->IsLoopBodyInTry()); - this->lowererMD->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/); + this->lowererMD->m_lowerer->LowerLeave(instr, instr->AsBranchInstr()->GetTarget(), true /*fromFinalLower*/); break; case Js::OpCode::BailOutStackRestore: @@ -4125,6 +4002,7 @@ LowererMDArch::GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stack IR::RegOpnd* stackArgs = stackArgsInstr->GetSrc1()->AsRegOpnd(); IR::RegOpnd* ldLenDstOpnd = IR::RegOpnd::New(TyUint32, func); + const IR::AutoReuseOpnd autoReuseLdLenDstOpnd(ldLenDstOpnd, func); IR::Instr* ldLen = IR::Instr::New(Js::OpCode::LdLen_A, ldLenDstOpnd, stackArgs, func); ldLenDstOpnd->SetValueType(ValueType::GetTaggedInt()); // LdLen_A works only on stack arguments callInstr->InsertBefore(ldLen); @@ -4150,6 +4028,7 @@ LowererMDArch::GenerateArgOutForStackArgs(IR::Instr* callInstr, IR::Instr* stack IR::IndirOpnd *nthArgument = IR::IndirOpnd::New(stackArgs, ldLenDstOpnd, TyMachReg, func); nthArgument->SetOffset(-1); IR::RegOpnd* ldElemDstOpnd = IR::RegOpnd::New(TyMachReg,func); + const IR::AutoReuseOpnd autoReuseldElemDstOpnd(ldElemDstOpnd, func); IR::Instr* ldElem = IR::Instr::New(Js::OpCode::LdElemI_A, ldElemDstOpnd, nthArgument, func); callInstr->InsertBefore(ldElem); this->lowererMD->m_lowerer->GenerateFastStackArgumentsLdElemI(ldElem); diff --git a/deps/chakrashim/core/lib/Backend/i386/LowererMDArch.h b/deps/chakrashim/core/lib/Backend/i386/LowererMDArch.h index 42703433357..fc313b13225 100644 --- a/deps/chakrashim/core/lib/Backend/i386/LowererMDArch.h +++ b/deps/chakrashim/core/lib/Backend/i386/LowererMDArch.h @@ -56,7 +56,6 @@ class LowererMDArch IR::Instr * LowerCall(IR::Instr * callInstr, uint32 argCount, RegNum regNum = RegNOREG); IR::Instr * LowerCallI(IR::Instr * callInstr, ushort callFlags, bool isHelper = false, IR::Instr * insertBeforeInstrForCFG = nullptr); IR::Instr * LowerCallIDynamic(IR::Instr * callInstr, IR::Instr* saveThis, IR::Opnd* argsLengthOpnd, ushort callFlags, IR::Instr * insertBeforeInstrForCFG = nullptr); - IR::Instr * LowerCallPut(IR::Instr * callInstr); int32 LowerCallArgs(IR::Instr * callInstr, ushort callFlags, Js::ArgSlot extraArgs = 1 /* for function object */, IR::IntConstOpnd **callInfoOpndRef = nullptr); int32 LowerStartCall(IR::Instr * startCallInstr, IR::Instr* insertInstr); int32 LowerStartCallAsmJs(IR::Instr * startCallInstr, IR::Instr * insertInstr, IR::Instr * callInstr); @@ -70,10 +69,9 @@ class LowererMDArch IR::Instr * LoadHeapArgsCached(IR::Instr * instr); IR::Instr * LowerEntryInstr(IR::EntryInstr * entryInstr); IR::Instr * LowerExitInstr(IR::ExitInstr * exitInstr); - IR::Instr * LowerEntryInstrAsmJs(IR::EntryInstr * entryInstr); IR::Instr * LowerExitInstrAsmJs(IR::ExitInstr * exitInstr); IR::ExitInstr * LowerExitInstrCommon(IR::ExitInstr * exitInstr); - IR::Instr * LowerInt64Assign(IR::Instr * instr); + static IR::Instr * ChangeToAssignInt64(IR::Instr * instr); void GeneratePrologueStackProbe(IR::Instr *entryInstr, size_t frameSize); void EmitInt64Instr(IR::Instr *instr); void LowerInt64Branch(IR::Instr *instr); diff --git a/deps/chakrashim/core/lib/Backend/i386/MdOpCodes.h b/deps/chakrashim/core/lib/Backend/i386/MdOpCodes.h index 802f8720416..fb293a9c25e 100644 --- a/deps/chakrashim/core/lib/Backend/i386/MdOpCodes.h +++ b/deps/chakrashim/core/lib/Backend/i386/MdOpCodes.h @@ -129,6 +129,7 @@ MACRO(MOVD, Reg2, None, RNON, f(SPECIAL), o(MOVD), DDST MACRO(MOVHLPS, Reg2, None, RNON, f(SPECIAL), o(MOVHLPS), DDST|DNO16|DZEROF, OLB_NONE) MACRO(MOVHPD, Reg2, None, RNON, f(SPECIAL), o(MOVHPD), DDST|DNO16|D66, OLB_NONE) +MACRO(MOVLPD, Reg2, None, RNON, f(SPECIAL), o(MOVLPD), DDST|DNO16|D66, OLB_NONE) MACRO(MOVLHPS, Reg2, None, RNON, f(SPECIAL), o(MOVLHPS), DDST|DNO16|DZEROF, OLB_NONE) MACRO(MOVMSKPD, Reg2, None, RNON, f(SPECIAL), o(MOVMSKPD), DDST|DNO16|D66, OLB_NONE) MACRO(MOVMSKPS, Reg2, None, RNON, f(SPECIAL), o(MOVMSKPS), DDST|DNO16|DZEROF, OLB_NONE) @@ -157,6 +158,7 @@ MACRO(OR , Reg2, None, R001, f(BINOP), o(OR), DOPE MACRO(ORPS, Reg2, None, R001, f(MODRM), o(ORPS), DOPEQ|DOPEQ|DZEROF|DCOMMOP, OLB_NONE) MACRO(PADDB, Reg2, None, RNON, f(MODRM), o(PADDB), DNO16|DOPEQ|D66|DCOMMOP, OLB_NONE) MACRO(PADDD, Reg2, None, RNON, f(MODRM), o(PADDD), DNO16|DOPEQ|D66|DCOMMOP, OLB_NONE) +MACRO(PADDQ, Reg2, None, RNON, f(MODRM), o(PADDQ), DNO16|DOPEQ|D66|DCOMMOP, OLB_NONE) MACRO(PADDW, Reg2, None, RNON, f(MODRM), o(PADDW), DNO16|DOPEQ|D66|DCOMMOP, OLB_NONE) MACRO(PADDSB, Reg2, None, RNON, f(MODRM), o(PADDSB), DNO16|DOPEQ|D66|DCOMMOP, OLB_NONE) MACRO(PADDSW, Reg2, None, RNON, f(MODRM), o(PADDSW), DNO16|DOPEQ|D66|DCOMMOP, OLB_NONE) @@ -182,18 +184,23 @@ MACRO(POP, Reg1, OpSideEffect, R000, f(PSHPOP), o(POP), DDST MACRO(POR, Reg2, None, RNON, f(MODRM), o(POR), DNO16|DOPEQ|D66|DCOMMOP, OLB_NONE) MACRO(PSHUFD, Reg3, None, RNON, f(MODRM), o(PSHUFD), DDST|DNO16|D66|DSSE, OLB_NONE) MACRO(PEXTRW, Reg3, None, RNON, f(MODRM), o(PEXTRW), DDST|DNO16|D66|DSSE, OLB_NONE) +MACRO(PEXTRD, Reg3, None, RNON, f(SPECIAL), o(PEXTRD), DDST|DNO16|DSSE|D66, OLB_0F3A) MACRO(PINSRW, Reg3, None, RNON, f(MODRM), o(PINSRW), DDST|DNO16|D66|DSSE, OLB_NONE) +MACRO(PINSRD, Reg3, None, RNON, f(MODRM), o(PINSRD), DDST|DNO16|D66|DSSE, OLB_0F3A) MACRO(PSLLDQ, Reg2, None, R111, f(SPECIAL), o(PSLLDQ), DDST|DNO16|DOPEQ|D66|DSSE, OLB_NONE) MACRO(PSRLDQ, Reg2, None, R011, f(SPECIAL), o(PSRLDQ), DDST|DNO16|DOPEQ|D66|DSSE, OLB_NONE) MACRO(PSRLW, Reg2, None, R010, f(SPECIAL), o(PSRLW), DNO16|DOPEQ|D66|DSSE, OLB_NONE) MACRO(PSRLD, Reg2, None, R010, f(SPECIAL), o(PSRLD), DNO16|DOPEQ|D66|DSSE, OLB_NONE) +MACRO(PSRLQ, Reg2, None, RNON, f(MODRM), o(PSRLQ), DNO16|DOPEQ|D66|DSSE, OLB_NONE) MACRO(PSRAW, Reg2, None, R100, f(SPECIAL), o(PSRAW), DNO16|DOPEQ|D66|DSSE, OLB_NONE) MACRO(PSRAD, Reg2, None, R100, f(SPECIAL), o(PSRAD), DNO16|DOPEQ|D66|DSSE, OLB_NONE) MACRO(PSLLW, Reg2, None, R110, f(SPECIAL), o(PSLLW), DNO16|DOPEQ|D66|DSSE, OLB_NONE) MACRO(PSLLD, Reg2, None, R110, f(SPECIAL), o(PSLLD), DNO16|DOPEQ|D66|DSSE, OLB_NONE) +MACRO(PSLLQ, Reg2, None, RNON, f(MODRM), o(PSLLQ), DNO16|DOPEQ|D66|DSSE, OLB_NONE) MACRO(PSUBB, Reg2, None, RNON, f(MODRM), o(PSUBB), DNO16|DOPEQ|D66, OLB_NONE) MACRO(PSUBD, Reg2, None, RNON, f(MODRM), o(PSUBD), DNO16|DOPEQ|D66, OLB_NONE) +MACRO(PSUBQ, Reg2, None, RNON, f(MODRM), o(PSUBQ), DNO16|DOPEQ|D66, OLB_NONE) MACRO(PSUBW, Reg2, None, RNON, f(MODRM), o(PSUBW), DNO16|DOPEQ|D66, OLB_NONE) MACRO(PSUBSB, Reg2, None, RNON, f(MODRM), o(PSUBSB), DNO16|DOPEQ|D66, OLB_NONE) MACRO(PSUBSW, Reg2, None, RNON, f(MODRM), o(PSUBSW), DNO16|DOPEQ|D66, OLB_NONE) diff --git a/deps/chakrashim/core/lib/Backend/i386/PeepsMD.cpp b/deps/chakrashim/core/lib/Backend/i386/PeepsMD.cpp index de85fdad2c1..c9d915ed36c 100644 --- a/deps/chakrashim/core/lib/Backend/i386/PeepsMD.cpp +++ b/deps/chakrashim/core/lib/Backend/i386/PeepsMD.cpp @@ -70,7 +70,7 @@ PeepsMD::PeepAssign(IR::Instr *instr) IR::Opnd *dst = instr->GetDst(); if (instr->m_opcode == Js::OpCode::MOV && src->IsIntConstOpnd() - && src->AsIntConstOpnd()->GetValue() == 0 && dst->IsRegOpnd()) + && src->AsIntConstOpnd()->GetValue() == 0 && dst->IsRegOpnd() && !instr->isInlineeEntryInstr) { Assert(instr->GetSrc2() == NULL); diff --git a/deps/chakrashim/core/lib/Backend/i386/Reg.h b/deps/chakrashim/core/lib/Backend/i386/Reg.h index 886c250260b..be0cd92d0ea 100644 --- a/deps/chakrashim/core/lib/Backend/i386/Reg.h +++ b/deps/chakrashim/core/lib/Backend/i386/Reg.h @@ -22,6 +22,7 @@ enum RegNum : BYTE { #define FIRST_INT_REG RegEAX #define FIRST_FLOAT_REG RegXMM0 #define FIRST_FLOAT_ARG_REG RegXMM0 +#define CATCH_OBJ_REG RegEAX #define XMM_REGCOUNT 8 diff --git a/deps/chakrashim/core/lib/Backend/i386/RegList.h b/deps/chakrashim/core/lib/Backend/i386/RegList.h index a4553b8e2b2..e6f67c9e645 100644 --- a/deps/chakrashim/core/lib/Backend/i386/RegList.h +++ b/deps/chakrashim/core/lib/Backend/i386/RegList.h @@ -23,6 +23,10 @@ REGDAT(EBP, ebp, 5, TyInt32, RA_DONTALLOCATE) REGDAT(ESI, esi, 6, TyInt32, RA_CALLEESAVE) REGDAT(EDI, edi, 7, TyInt32, RA_CALLEESAVE) +#ifndef INT_ARG_REG_COUNT +#define INT_ARG_REG_COUNT 0 +#endif + REGDAT(XMM0, xmm0, 0, TyFloat64, 0) REGDAT(XMM1, xmm1, 1, TyFloat64, 0) REGDAT(XMM2, xmm2, 2, TyFloat64, 0) diff --git a/deps/chakrashim/core/lib/Backend/i386/X86Encode.h b/deps/chakrashim/core/lib/Backend/i386/X86Encode.h index ad90914e685..da8adf4a04a 100644 --- a/deps/chakrashim/core/lib/Backend/i386/X86Encode.h +++ b/deps/chakrashim/core/lib/Backend/i386/X86Encode.h @@ -218,6 +218,7 @@ enum Forms : BYTE #define OPBYTE_MOVHLPS {0x12} // modrm #define OPBYTE_MOVHPD {0x16} // special +#define OPBYTE_MOVLPD {0x12} // special #define OPBYTE_MOVLHPS {0x16} // modrm #define OPBYTE_MOVMSKPD {0x50} // modrm #define OPBYTE_MOVMSKPS {0x50} // modrm @@ -245,6 +246,7 @@ enum Forms : BYTE #define OPBYTE_ORPS {0x56} // modrm #define OPBYTE_PADDB {0xfc} // modrm #define OPBYTE_PADDD {0xfe} // modrm +#define OPBYTE_PADDQ {0xd4} // modrm #define OPBYTE_PADDW {0xfd} // modrm #define OPBYTE_PADDSB {0xec} // modrm #define OPBYTE_PADDSW {0xed} // modrm @@ -273,19 +275,24 @@ enum Forms : BYTE #define OPBYTE_POPCNT {0xB8} // modrm #define OPBYTE_PSHUFD {0x70} // special #define OPBYTE_PEXTRW {0xc5} // special +#define OPBYTE_PEXTRD {0x16} // special #define OPBYTE_PINSRW {0xc4} // special +#define OPBYTE_PINSRD {0x22} // special #define OPBYTE_PSLLDQ {0x73} // mmxshift #define OPBYTE_PSRLDQ {0x73} // mmxshift #define OPBYTE_PSLLW {0x71} // mmx lane shift #define OPBYTE_PSLLD {0x72} // mmx lane shift +#define OPBYTE_PSLLQ {0xf3} // mmx lane shift #define OPBYTE_PSRAW {0x71} // mmx lane shift #define OPBYTE_PSRAD {0x72} // mmx lane shift #define OPBYTE_PSRLW {0x71} // mmx lane shift #define OPBYTE_PSRLD {0x72} // mmx lane shift +#define OPBYTE_PSRLQ {0xd3} // mmx lane shift #define OPBYTE_PSUBB {0xf8} // modrm #define OPBYTE_PSUBD {0xfa} // modrm +#define OPBYTE_PSUBQ {0xfb} // modrm #define OPBYTE_PSUBW {0xf9} // modrm #define OPBYTE_PSUBSB {0xe8} // modrm #define OPBYTE_PSUBSW {0xe9} // modrm diff --git a/deps/chakrashim/core/lib/Backend/i386/machvalues.h b/deps/chakrashim/core/lib/Backend/i386/machvalues.h new file mode 100644 index 00000000000..cd9c099b6bf --- /dev/null +++ b/deps/chakrashim/core/lib/Backend/i386/machvalues.h @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#pragma once + +// +// Machine dependent constants. +// + +static const int MachInt = 4; +static const int MachRegInt = 4; +static const int MachPtr = 4; +static const int MachDouble = 8; +static const int MachRegDouble = 8; +static const int MachMaxInstrSize = 11; +static const int MachArgsSlotOffset = MachPtr; +static const int MachStackAlignment = MachDouble; +static const unsigned int MachSignBit = 0x80000000; +static const int MachSimd128 = 16; \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Backend/i386/md.h b/deps/chakrashim/core/lib/Backend/i386/md.h index fbbf9da4108..dee0d225f8a 100644 --- a/deps/chakrashim/core/lib/Backend/i386/md.h +++ b/deps/chakrashim/core/lib/Backend/i386/md.h @@ -5,21 +5,6 @@ #pragma once -// -// Machine dependent constants. -// - -const int MachInt = 4; -const int MachRegInt = 4; -__declspec(selectany) const int MachPtr = 4; -const int MachDouble = 8; -const int MachRegDouble = 8; -const int MachMaxInstrSize = 11; -const int MachArgsSlotOffset = MachPtr; -const int MachStackAlignment = MachDouble; -const unsigned int MachSignBit = 0x80000000; -const int MachSimd128 = 16; - const int PAGESIZE = 0x1000; const IRType TyMachReg = TyInt32; @@ -36,6 +21,7 @@ const IRType TyMachSimd128B4 = TySimd128B4; const IRType TyMachSimd128B8 = TySimd128B8; const IRType TyMachSimd128B16 = TySimd128B16; const IRType TyMachSimd128D2 = TySimd128D2; +const IRType TyMachSimd128I2 = TySimd128I2; const DWORD EMIT_BUFFER_ALIGNMENT = 16; const DWORD INSTR_ALIGNMENT = 1; diff --git a/deps/chakrashim/core/lib/CMakeLists.txt b/deps/chakrashim/core/lib/CMakeLists.txt index 089f4aa5e1e..ec8a3805f9f 100644 --- a/deps/chakrashim/core/lib/CMakeLists.txt +++ b/deps/chakrashim/core/lib/CMakeLists.txt @@ -14,6 +14,10 @@ if(CAN_BUILD_WABT) set(wabt_includes ${CHAKRACORE_SOURCE_DIR}/lib/wabt) endif() +if (USE_LTTNG) + set(lttng_objects $) +endif() + add_library (ChakraCoreStatic STATIC ChakraCoreStatic.cpp $ @@ -38,8 +42,16 @@ add_library (ChakraCoreStatic STATIC $ ${wasm_objects} ${wabt_objects} + ${lttng_objects} ) +if(USE_LTTNG) + target_link_libraries(ChakraCoreStatic + -llttng-ust + -ldl + ) +endif() + if(CC_TARGET_OS_OSX) target_link_libraries(ChakraCoreStatic "-framework CoreFoundation" diff --git a/deps/chakrashim/core/lib/Common/BackendApi.h b/deps/chakrashim/core/lib/Common/BackendApi.h index 6b939d99fa6..1920623c581 100644 --- a/deps/chakrashim/core/lib/Common/BackendApi.h +++ b/deps/chakrashim/core/lib/Common/BackendApi.h @@ -50,6 +50,7 @@ typedef double FloatConstType; #include "IRType.h" #include "InlineeFrameInfo.h" #include "CodeGenAllocators.h" +#include "PropertyGuard.h" NativeCodeGenerator * NewNativeCodeGenerator(Js::ScriptContext * nativeCodeGen); void DeleteNativeCodeGenerator(NativeCodeGenerator * nativeCodeGen); @@ -61,7 +62,7 @@ void UpdateNativeCodeGeneratorForDebugMode(NativeCodeGenerator* nativeCodeGen); CriticalSection *GetNativeCodeGenCriticalSection(NativeCodeGenerator *pNativeCodeGen); bool TryReleaseNonHiPriWorkItem(Js::ScriptContext* scriptContext, CodeGenWorkItem* workItem); void NativeCodeGenEnterScriptStart(NativeCodeGenerator * nativeCodeGen); -void FreeNativeCodeGenAllocation(Js::ScriptContext* scriptContext, Js::JavascriptMethod codeAddress, Js::JavascriptMethod thunkAddress); +void FreeNativeCodeGenAllocation(Js::ScriptContext* scriptContext, Js::JavascriptMethod codeAddress, Js::JavascriptMethod thunkAddress, void** functionTable); InProcCodeGenAllocators* GetForegroundAllocator(NativeCodeGenerator * nativeCodeGen, PageAllocator* pageallocator); void GenerateFunction(NativeCodeGenerator * nativeCodeGen, Js::FunctionBody * functionBody, Js::ScriptFunction * function = NULL); void GenerateLoopBody(NativeCodeGenerator * nativeCodeGen, Js::FunctionBody * functionBody, Js::LoopHeader * loopHeader, Js::EntryPointInfo* entryPointInfo, uint localCount, Js::Var localSlots[]); @@ -71,6 +72,9 @@ void GenerateAllFunctions(NativeCodeGenerator * nativeCodeGen, Js::FunctionBody #ifdef IR_VIEWER Js::Var RejitIRViewerFunction(NativeCodeGenerator *nativeCodeGen, Js::FunctionBody *fn, Js::ScriptContext *scriptContext); #endif +#ifdef ALLOW_JIT_REPRO +HRESULT JitFromEncodedWorkItem(NativeCodeGenerator *nativeCodeGen, _In_reads_(bufSize) const byte* buffer, _In_ uint bufferSize); +#endif BOOL IsIntermediateCodeGenThunk(Js::JavascriptMethod codeAddress); BOOL IsAsmJsCodeGenThunk(Js::JavascriptMethod codeAddress); @@ -233,6 +237,7 @@ enum VTableValue { VtableDynamicObject, VtableInvalid, VtablePropertyString, + VtableLazyJSONString, VtableLiteralStringWithPropertyStringPtr, VtableJavascriptBoolean, VtableJavascriptArray, diff --git a/deps/chakrashim/core/lib/Common/ChakraCoreVersion.h b/deps/chakrashim/core/lib/Common/ChakraCoreVersion.h index 45a4b6e5e2c..5b3546af766 100644 --- a/deps/chakrashim/core/lib/Common/ChakraCoreVersion.h +++ b/deps/chakrashim/core/lib/Common/ChakraCoreVersion.h @@ -16,8 +16,8 @@ // ChakraCore version number definitions (used in ChakraCore binary metadata) #define CHAKRA_CORE_MAJOR_VERSION 1 -#define CHAKRA_CORE_MINOR_VERSION 7 -#define CHAKRA_CORE_PATCH_VERSION 6 +#define CHAKRA_CORE_MINOR_VERSION 9 +#define CHAKRA_CORE_PATCH_VERSION 0 #define CHAKRA_CORE_VERSION_RELEASE_QFE 0 // Redundant with PATCH_VERSION. Keep this value set to 0. // ------------- @@ -54,10 +54,10 @@ // * Does not add anything to the file description // ChakraCore RELEASE and PRERELEASE flags -#define CHAKRA_CORE_VERSION_RELEASE 1 +#define CHAKRA_CORE_VERSION_RELEASE 0 #define CHAKRA_CORE_VERSION_PRERELEASE 0 // Chakra RELEASE flag // Mostly redundant with CHAKRA_CORE_VERSION_RELEASE, // but semantically refers to Chakra rather than ChakraCore. -#define CHAKRA_VERSION_RELEASE 1 +#define CHAKRA_VERSION_RELEASE 0 diff --git a/deps/chakrashim/core/lib/Common/Codex/Utf8Helper.h b/deps/chakrashim/core/lib/Common/Codex/Utf8Helper.h index c8cd8f86a0d..26bcbb0b525 100644 --- a/deps/chakrashim/core/lib/Common/Codex/Utf8Helper.h +++ b/deps/chakrashim/core/lib/Common/Codex/Utf8Helper.h @@ -12,6 +12,9 @@ namespace utf8 /// The caller is responsible for freeing the memory, which is allocated /// using Allocator. /// The returned string is null terminated. + /// TODO(jahorto): This file's dependencies mean that it cannot be included in PlatformAgnostic + /// Thus, this function is currently ~duplicated in PlatformAgnostic::Intl::Utf16ToUtf8 (Intl.cpp) + /// As long as that function exists, it _must_ be updated alongside any updates here /// template HRESULT WideStringToNarrow(_In_ AllocatorFunction allocator, _In_ LPCWSTR sourceString, size_t sourceCount, _Out_ LPSTR* destStringPtr, _Out_ size_t* destCount, size_t* allocateCount = nullptr) @@ -83,30 +86,28 @@ namespace utf8 return WideStringToNarrow(Allocator::allocate, sourceString, sourceCount, destStringPtr, destCount, allocateCount); } - /// - /// Use the codex library to encode a UTF8 string to UTF16. - /// The caller is responsible for freeing the memory, which is allocated - /// using Allocator. - /// The returned string is null terminated. - /// - template - HRESULT NarrowStringToWide(_In_ AllocatorFunction allocator,_In_ LPCSTR sourceString, size_t sourceCount, _Out_ LPWSTR* destStringPtr, _Out_ size_t* destCount, size_t* allocateCount = nullptr) + inline HRESULT NarrowStringToWideNoAlloc(_In_ LPCSTR sourceString, size_t sourceCount, + __out_ecount(destBufferCount) LPWSTR destString, size_t destBufferCount, _Out_ size_t* destCount) { - size_t cbSourceString = sourceCount; size_t sourceStart = 0; - size_t cbDestString = (sourceCount + 1) * sizeof(WCHAR); - if (cbDestString < sourceCount) // overflow ? + size_t cbSourceString = sourceCount; + + if (sourceCount >= MAXUINT32) { + destString[0] = WCHAR(0); return E_OUTOFMEMORY; } - WCHAR* destString = (WCHAR*)allocator(cbDestString); if (destString == nullptr) { - return E_OUTOFMEMORY; + return E_INVALIDARG; } - if (allocateCount != nullptr) *allocateCount = cbDestString; + if (sourceCount >= destBufferCount) + { + destString[0] = WCHAR(0); + return E_INVALIDARG; + } for (; sourceStart < sourceCount; sourceStart++) { @@ -124,7 +125,6 @@ namespace utf8 { *destCount = sourceCount; destString[sourceCount] = WCHAR(0); - *destStringPtr = destString; } else { @@ -133,20 +133,56 @@ namespace utf8 charcount_t cchDestString = utf8::ByteIndexIntoCharacterIndex(remSourceString, cbSourceString - sourceStart); cchDestString += (charcount_t)sourceStart; - Assert (cchDestString <= sourceCount); + if (cchDestString > sourceCount) + { + return E_OUTOFMEMORY; + } // Some node tests depend on the utf8 decoder not swallowing invalid unicode characters // instead of replacing them with the "replacement" chracter. Pass a flag to our // decoder to require such behavior utf8::DecodeUnitsIntoAndNullTerminateNoAdvance(remDestString, remSourceString, (LPCUTF8) sourceString + cbSourceString, DecodeOptions::doAllowInvalidWCHARs); - Assert(destString[cchDestString] == 0); + static_assert(sizeof(utf8char_t) == sizeof(char), "Needs to be valid for cast"); - *destStringPtr = destString; *destCount = cchDestString; } + + Assert(destString[*destCount] == 0); + return S_OK; } + /// + /// Use the codex library to encode a UTF8 string to UTF16. + /// The caller is responsible for freeing the memory, which is allocated + /// using Allocator. + /// The returned string is null terminated. + /// + template + HRESULT NarrowStringToWide(_In_ AllocatorFunction allocator,_In_ LPCSTR sourceString, + size_t sourceCount, _Out_ LPWSTR* destStringPtr, _Out_ size_t* destCount, size_t* allocateCount = nullptr) + { + size_t cbDestString = (sourceCount + 1) * sizeof(WCHAR); + if (cbDestString < sourceCount) // overflow ? + { + return E_OUTOFMEMORY; + } + + WCHAR* destString = (WCHAR*)allocator(cbDestString); + if (destString == nullptr) + { + return E_OUTOFMEMORY; + } + + if (allocateCount != nullptr) + { + *allocateCount = cbDestString; + } + + *destStringPtr = destString; + return NarrowStringToWideNoAlloc(sourceString, sourceCount, destString, sourceCount + 1, destCount); + } + template HRESULT NarrowStringToWide(_In_ LPCSTR sourceString, size_t sourceCount, _Out_ LPWSTR* destStringPtr, _Out_ size_t* destCount, size_t* allocateCount = nullptr) { diff --git a/deps/chakrashim/core/lib/Common/Common.h b/deps/chakrashim/core/lib/Common/Common.h index ee9ddf88fc0..d2cfeb41947 100644 --- a/deps/chakrashim/core/lib/Common/Common.h +++ b/deps/chakrashim/core/lib/Common/Common.h @@ -11,6 +11,8 @@ typedef _Return_type_success_(return >= 0) LONG NTSTATUS; #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) #endif +#define MAKE_HR(errnum) (MAKE_HRESULT(SEVERITY_ERROR, FACILITY_CONTROL, errnum)) + // If we're using the PAL for C++ standard library compat, // we don't need to include wchar for string handling #ifndef USING_PAL_STDLIB @@ -115,7 +117,6 @@ template<> struct IntMath { using Type = Int64Math; }; #include "DataStructures/GrowingArray.h" #include "DataStructures/EvalMapString.h" #include "DataStructures/RegexKey.h" -#include "DataStructures/LineOffsetCache.h" #include "Core/ICustomConfigFlags.h" #include "Core/CmdParser.h" diff --git a/deps/chakrashim/core/lib/Common/Common/Chakra.Common.Common.vcxproj b/deps/chakrashim/core/lib/Common/Common/Chakra.Common.Common.vcxproj index e105ce17191..6d6fe48030b 100644 --- a/deps/chakrashim/core/lib/Common/Common/Chakra.Common.Common.vcxproj +++ b/deps/chakrashim/core/lib/Common/Common/Chakra.Common.Common.vcxproj @@ -85,9 +85,6 @@ true - - true - diff --git a/deps/chakrashim/core/lib/Common/Common/Chakra.Common.Common.vcxproj.filters b/deps/chakrashim/core/lib/Common/Common/Chakra.Common.Common.vcxproj.filters index 329c0e51011..4e41a9c4191 100644 --- a/deps/chakrashim/core/lib/Common/Common/Chakra.Common.Common.vcxproj.filters +++ b/deps/chakrashim/core/lib/Common/Common/Chakra.Common.Common.vcxproj.filters @@ -56,8 +56,5 @@ arm - - arm64 - \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Common/Common/Jobs.cpp b/deps/chakrashim/core/lib/Common/Common/Jobs.cpp index f7e77b7e5c8..0ce5d944396 100644 --- a/deps/chakrashim/core/lib/Common/Common/Jobs.cpp +++ b/deps/chakrashim/core/lib/Common/Common/Jobs.cpp @@ -27,6 +27,7 @@ #include "Common/Jobs.inl" #include "Core/CommonMinMax.h" #include "Memory/RecyclerWriteBarrierManager.h" +#include "Memory/XDataAllocator.h" namespace JsUtil { @@ -614,7 +615,8 @@ namespace JsUtil threadId(GetCurrentThreadContextId()), threadService(threadService), threadCount(0), - maxThreadCount(0) + maxThreadCount(0), + hasExtraWork(false) { if (!threadService->HasCallback()) { @@ -676,6 +678,8 @@ namespace JsUtil //Wait for 1 sec on jobReady and shutdownBackgroundThread events. unsigned int result = WaitForMultipleObjectsEx(_countof(handles), handles, false, 1000, false); + DoExtraWork(); + while (result == WAIT_TIMEOUT) { if (threadData->CanDecommit()) @@ -685,6 +689,7 @@ namespace JsUtil this->ForEachManager([&](JobManager *manager){ manager->OnDecommit(threadData); }); + result = WaitForMultipleObjectsEx(_countof(handles), handles, false, INFINITE, false); } else @@ -701,6 +706,15 @@ namespace JsUtil return result == WAIT_OBJECT_0; } + void BackgroundJobProcessor::DoExtraWork() + { + while (hasExtraWork) + { + DelayDeletingFunctionTable::Clear(); + Sleep(50); + } + } + bool BackgroundJobProcessor::WaitWithThreadForThreadStartedOrClosingEvent(ParallelThreadData *parallelThreadData, const unsigned int milliseconds) { return WaitWithThread(parallelThreadData, parallelThreadData->threadStartedOrClosing, milliseconds); @@ -1103,6 +1117,9 @@ namespace JsUtil } criticalSection.Leave(); + // flush the function tables in background thread after closed and before shutting down thread + DelayDeletingFunctionTable::Clear(); + EDGE_ETW_INTERNAL(EventWriteJSCRIPT_NATIVECODEGEN_STOP(this, 0)); } } @@ -1226,7 +1243,7 @@ namespace JsUtil { Assert(lpParam); -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 #ifdef RECYCLER_WRITE_BARRIER Memory::RecyclerWriteBarrierManager::OnThreadInit(); #endif @@ -1403,6 +1420,18 @@ namespace JsUtil #endif } + void BackgroundJobProcessor::StartExtraWork() + { + hasExtraWork = true; + + // Signal the background thread to wake up and process the extra work. + jobReady.Set(); + } + void BackgroundJobProcessor::EndExtraWork() + { + hasExtraWork = false; + } + #if DBG_DUMP //Just for debugging purpose char16 const * const BackgroundJobProcessor::DebugThreadNames[16] = { diff --git a/deps/chakrashim/core/lib/Common/Common/Jobs.h b/deps/chakrashim/core/lib/Common/Common/Jobs.h index b22c39fce3d..148c1417061 100644 --- a/deps/chakrashim/core/lib/Common/Common/Jobs.h +++ b/deps/chakrashim/core/lib/Common/Common/Jobs.h @@ -360,6 +360,9 @@ namespace JsUtil public: // Closes the job processor and closes the handle of background threads. virtual void Close(); + + virtual void StartExtraWork() { }; + virtual void EndExtraWork() { }; }; // ------------------------------------------------------------------------------------------------------------------------- @@ -457,6 +460,8 @@ namespace JsUtil unsigned int maxThreadCount; ParallelThreadData **parallelThreadData; + bool hasExtraWork; + #if DBG_DUMP static char16 const * const DebugThreadNames[16]; #endif @@ -465,6 +470,8 @@ namespace JsUtil BackgroundJobProcessor(AllocationPolicyManager* policyManager, ThreadService *threadService, bool disableParallelThreads); ~BackgroundJobProcessor(); + virtual void StartExtraWork() override; + virtual void EndExtraWork() override; private: bool WaitWithThread(ParallelThreadData *parallelThreadData, const Event &e, const unsigned int milliseconds = INFINITE); @@ -482,6 +489,8 @@ namespace JsUtil void InitializeParallelThreadData(AllocationPolicyManager* policyManager, bool disableParallelThreads); void InitializeParallelThreadDataForThreadServiceCallBack(AllocationPolicyManager* policyManager); + void DoExtraWork(); + public: virtual void AddManager(JobManager *const manager) override; virtual void RemoveManager(JobManager *const manager) override; diff --git a/deps/chakrashim/core/lib/Common/Common/NumberUtilities.cpp b/deps/chakrashim/core/lib/Common/Common/NumberUtilities.cpp index 0f1c926df0d..24bf6d80111 100644 --- a/deps/chakrashim/core/lib/Common/Common/NumberUtilities.cpp +++ b/deps/chakrashim/core/lib/Common/Common/NumberUtilities.cpp @@ -147,7 +147,7 @@ namespace Js bool NumberUtilities::IsFinite(double value) { -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) return 0 != (~(ToSpecial(value)) & 0x7FF0000000000000ull); #else return 0 != (~Js::NumberUtilities::LuHiDbl(value) & 0x7FF00000); diff --git a/deps/chakrashim/core/lib/Common/Common/NumberUtilities.inl b/deps/chakrashim/core/lib/Common/Common/NumberUtilities.inl index 0d762811781..b0e77429411 100644 --- a/deps/chakrashim/core/lib/Common/Common/NumberUtilities.inl +++ b/deps/chakrashim/core/lib/Common/Common/NumberUtilities.inl @@ -136,7 +136,7 @@ namespace Js NUMBER_UTIL_INLINE bool NumberUtilities::IsNan(double value) { -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) // NaN is a range of values; all bits on the exponent are 1's and some nonzero significant. // no distinction on signed NaN's uint64 nCompare = ToSpecial(value); diff --git a/deps/chakrashim/core/lib/Common/Common/NumberUtilities_strtod.cpp b/deps/chakrashim/core/lib/Common/Common/NumberUtilities_strtod.cpp index 99e8a46063f..dbf9793c85f 100644 --- a/deps/chakrashim/core/lib/Common/Common/NumberUtilities_strtod.cpp +++ b/deps/chakrashim/core/lib/Common/Common/NumberUtilities_strtod.cpp @@ -1263,7 +1263,7 @@ template double Js::NumberUtilities::StrToDbl(const utf8char_t * psz Uses big integer arithmetic to get the sequence of digits. ***************************************************************************/ _Success_(return) -static BOOL FDblToRgbPrecise(double dbl, __out_ecount(kcbMaxRgb) byte *prgb, int *pwExp10, byte **ppbLim, int normalizeHBound = 1) +static BOOL FDblToRgbPrecise(double dbl, __out_ecount(kcbMaxRgb) byte *prgb, int *pwExp10, byte **ppbLim, int nDigits = -1) { byte bT; BOOL fPow2; @@ -1518,7 +1518,8 @@ static BOOL FDblToRgbPrecise(double dbl, __out_ecount(kcbMaxRgb) byte *prgb, int Assert(ib < kcbMaxRgb); // Do not always push to higherBound // See Js::NumberUtilities::FDblToStr for the exception - prgb[ib++] = bT + (byte)normalizeHBound; + // i.e. we shouldn't push digits beyond interest to higherBound + prgb[ib++] = bT + (byte)(nDigits == -1 || ib < nDigits ? 1 : 0); break; } LRoundUp9: @@ -2314,7 +2315,7 @@ int Js::NumberUtilities::FDblToStr(double dbl, Js::NumberUtilities::FormatType f // in case we restrict the number of digits, do not push for a higher bound if (!FDblToRgbFast(dbl, rgb, &wExp10, &pbLim, nDigits) && - !FDblToRgbPrecise(dbl, rgb, &wExp10, &pbLim, nDigits != -1 ? 0 : 1)) + !FDblToRgbPrecise(dbl, rgb, &wExp10, &pbLim, nDigits)) { AssertMsg(FALSE, "Failure in FDblToRgbPrecise"); return FALSE; diff --git a/deps/chakrashim/core/lib/Common/Common/SmartFpuControl.cpp b/deps/chakrashim/core/lib/Common/Common/SmartFpuControl.cpp index d9ea6b56158..d060f54e68f 100644 --- a/deps/chakrashim/core/lib/Common/Common/SmartFpuControl.cpp +++ b/deps/chakrashim/core/lib/Common/Common/SmartFpuControl.cpp @@ -16,7 +16,7 @@ static errno_t SetFPUControlDefault(void) { #if _WIN32 -#if _M_AMD64 || _M_ARM +#if _M_AMD64 || _M_ARM || _M_ARM64 return _controlfp_s(0, _RC_NEAR + _DN_SAVE + _EM_INVALID + _EM_ZERODIVIDE + _EM_OVERFLOW + _EM_UNDERFLOW + _EM_INEXACT, _MCW_EM | _MCW_DN | _MCW_RC); @@ -49,7 +49,7 @@ static errno_t GetFPUControl(unsigned int *pctrl) static errno_t SetFPUControl(unsigned int fpctrl) { #if _WIN32 -#if _M_AMD64 || _M_ARM +#if _M_AMD64 || _M_ARM || _M_ARM64 return _controlfp_s(0, fpctrl, _MCW_EM | _MCW_DN | _MCW_RC); #elif _M_IX86 _control87(fpctrl, (unsigned int)(-1)); diff --git a/deps/chakrashim/core/lib/Common/Common/arm64/arm64_GET_CURRENT_FRAME.asm b/deps/chakrashim/core/lib/Common/Common/arm64/arm64_GET_CURRENT_FRAME.asm deleted file mode 100644 index 23357de29fe..00000000000 --- a/deps/chakrashim/core/lib/Common/Common/arm64/arm64_GET_CURRENT_FRAME.asm +++ /dev/null @@ -1,30 +0,0 @@ -;------------------------------------------------------------------------------------------------------- -; Copyright (C) Microsoft. All rights reserved. -; Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -;------------------------------------------------------------------------------------------------------- -;Var arm64_GET_CURRENT_FRAME() -; -; This method returns the current value of the frame pointer. -; - OPT 2 ; disable listing - -#include "ksarm64.h" - - OPT 1 ; re-enable listing - - TTL Lib\Common\arm64\arm64_GET_CURRENT_FRAME.asm - - - EXPORT arm64_GET_CURRENT_FRAME - - TEXTAREA - - LEAF_ENTRY arm64_GET_CURRENT_FRAME - - mov x0,x29 - - br lr - - LEAF_END arm64_GET_CURRENT_FRAME - - END diff --git a/deps/chakrashim/core/lib/Common/CommonBasic.h b/deps/chakrashim/core/lib/Common/CommonBasic.h index ee4531cef88..71a1f154f0c 100644 --- a/deps/chakrashim/core/lib/Common/CommonBasic.h +++ b/deps/chakrashim/core/lib/Common/CommonBasic.h @@ -8,6 +8,36 @@ #include "CommonDefines.h" #define _CRT_RAND_S // Enable rand_s in the CRT +#ifndef __has_feature +#define __has_feature(f) 0 +#endif + +#if __has_feature(address_sanitizer) +#define ADDRESS_SANITIZER_APPEND(x) , x +#define NO_SANITIZE_ADDRESS __attribute__((no_sanitize("address"))) +#define NO_SANITIZE_ADDRESS_FIXVC +#else +#define ADDRESS_SANITIZER_APPEND(x) +#define NO_SANITIZE_ADDRESS +#endif + +// AddressSanitizer: check if an address is in asan fake stack +#if __has_feature(address_sanitizer) +extern "C" +{ + void *__asan_get_current_fake_stack(); + void *__asan_addr_is_in_fake_stack(void *fake_stack, void *addr, void **beg, void **end); +} +inline bool IsAsanFakeStackAddr(const void * p) +{ + void * fakeStack = __asan_get_current_fake_stack(); + return fakeStack && __asan_addr_is_in_fake_stack(fakeStack, const_cast(p), nullptr, nullptr); +} +#define IS_ASAN_FAKE_STACK_ADDR(p) IsAsanFakeStackAddr(p) +#else +#define IS_ASAN_FAKE_STACK_ADDR(p) false +#endif + #if defined(PROFILE_RECYCLER_ALLOC) || defined(HEAP_TRACK_ALLOC) || defined(ENABLE_DEBUG_CONFIG_OPTIONS) #ifdef __clang__ #include @@ -17,6 +47,8 @@ using std::type_info; #include "CommonPal.h" +#include "Core/CommonMinMax.h" + // === Core Header Files === #include "Core/CommonTypedefs.h" #include "Core/Api.h" diff --git a/deps/chakrashim/core/lib/Common/CommonDefines.h b/deps/chakrashim/core/lib/Common/CommonDefines.h index 07e5baec5ee..eb85d16c70b 100644 --- a/deps/chakrashim/core/lib/Common/CommonDefines.h +++ b/deps/chakrashim/core/lib/Common/CommonDefines.h @@ -4,10 +4,15 @@ //------------------------------------------------------------------------------------------------------- #pragma once +/***************************************************************************************************** + * This file contains defines that switch feature on or off, or configuration a feature at build time + *****************************************************************************************************/ + #include "TargetVer.h" #include "Warnings.h" #include "ChakraCoreVersion.h" + //---------------------------------------------------------------------------------------------------- // Default debug/fretest/release flags values // - Set the default values of debug/fretest/release flags if it is not set by the command line @@ -58,12 +63,10 @@ #endif #if defined(_M_IX86) || defined(_M_ARM) -#define _M_IX86_OR_ARM32 1 #define TARGET_32 1 #endif #if defined(_M_X64) || defined(_M_ARM64) -#define _M_X64_OR_ARM64 1 #define TARGET_64 1 #endif @@ -77,9 +80,9 @@ // Memory Protections #ifdef _CONTROL_FLOW_GUARD -#define PAGE_EXECUTE_RO_TARGETS_INVALID (PAGE_EXECUTE | PAGE_TARGETS_INVALID) +#define PAGE_EXECUTE_RO_TARGETS_INVALID (PAGE_EXECUTE_READ | PAGE_TARGETS_INVALID) #else -#define PAGE_EXECUTE_RO_TARGETS_INVALID (PAGE_EXECUTE) +#define PAGE_EXECUTE_RO_TARGETS_INVALID (PAGE_EXECUTE_READ) #endif //---------------------------------------------------------------------------------------------------- @@ -108,8 +111,10 @@ #endif // Language features -#if defined(_WIN32) || defined(INTL_ICU) + +#if !defined(CHAKRACORE_LITE) && (defined(_WIN32) || defined(INTL_ICU)) #define ENABLE_INTL_OBJECT // Intl support +#define ENABLE_JS_BUILTINS // Built In functions support #endif //#define INTL_ICU 1 // NOTE: uncomment this to allow the IDE to see INTL_ICU blocks #ifdef INTL_ICU @@ -126,14 +131,20 @@ // Type system features #define PERSISTENT_INLINE_CACHES // *** TODO: Won't build if disabled currently -#define SUPPORT_FIXED_FIELDS_ON_PATH_TYPES // *** TODO: Won't build if disabled currently + +#if !DISABLE_JIT +#define ENABLE_FIXED_FIELDS 1 // Turn on fixed fields if JIT is enabled +#endif + +#if ENABLE_FIXED_FIELDS +#define SUPPORT_FIXED_FIELDS_ON_PATH_TYPES +#endif + // xplat-todo: revisit these features #ifdef _WIN32 // dep: TIME_ZONE_INFORMATION, DaylightTimeHelper, Windows.Globalization #define ENABLE_GLOBALIZATION -// dep: IActiveScriptProfilerCallback, IActiveScriptProfilerHeapEnum -#define ENABLE_SCRIPT_PROFILING // #ifndef __clang__ // xplat-todo: change DISABLE_SEH to ENABLE_SEH and move here // #define ENABLE_SIMDJS @@ -143,37 +154,60 @@ #endif // dep: IDebugDocumentContext +#if !BUILD_WITHOUT_SCRIPT_DEBUG #define ENABLE_SCRIPT_DEBUGGING +#endif // GC features #define BUCKETIZE_MEDIUM_ALLOCATIONS 1 // *** TODO: Won't build if disabled currently #define SMALLBLOCK_MEDIUM_ALLOC 1 // *** TODO: Won't build if disabled currently #define LARGEHEAPBLOCK_ENCODING 1 // Large heap block metadata encoding +#ifndef CHAKRACORE_LITE #define IDLE_DECOMMIT_ENABLED 1 // Idle Decommit -#define RECYCLER_PAGE_HEAP // PageHeap support +#endif + +#if defined(NTBUILD) || defined(ENABLE_DEBUG_CONFIG_OPTIONS) +#define RECYCLER_PAGE_HEAP // PageHeap support, on by default, off in ChakraCore release build +#endif + + +#ifndef ENABLE_VALGRIND +#define ENABLE_CONCURRENT_GC 1 +#ifdef _WIN32 +#define ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP 1 // Needs ENABLE_CONCURRENT_GC to be enabled for this to be enabled. +#else +#define ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP 0 // Needs ENABLE_CONCURRENT_GC to be enabled for this to be enabled. +#endif +#else +#define ENABLE_CONCURRENT_GC 0 +#define ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP 0 // Needs ENABLE_CONCURRENT_GC to be enabled for this to be enabled. +#endif #ifdef _WIN32 #define SYSINFO_IMAGE_BASE_AVAILABLE 1 -#define ENABLE_CONCURRENT_GC 1 -#define ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP 1 // Only takes effect when ENABLE_CONCURRENT_GC is enabled. -#define ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST 1 // Use Interlocked SLIST for allocableHeapBlockList #define SUPPORT_WIN32_SLIST 1 +#ifndef CHAKRACORE_LITE #define ENABLE_JS_ETW // ETW support +#endif #else #define SYSINFO_IMAGE_BASE_AVAILABLE 0 -#ifndef ENABLE_VALGRIND -#define ENABLE_CONCURRENT_GC 1 -#define ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP 1 // Only takes effect when ENABLE_CONCURRENT_GC is enabled. -#else -#define ENABLE_CONCURRENT_GC 0 -#define ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP 0 // Only takes effect when ENABLE_CONCURRENT_GC is enabled. -#endif #define SUPPORT_WIN32_SLIST 0 -#define ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST 0 // Use Interlocked SLIST for allocableHeapBlockList #endif +#ifdef CHAKRACORE_LITE +#define USE_VPM_TABLE 0 +#else +#define USE_VPM_TABLE 1 +#endif + +// xplat-todo: fix up vpm.64b.h generation to generate correctly +// templatized code +#if defined(_MSC_VER) && !defined(__clang__) +#define USE_STATIC_VPM 1 // Disable to force generation at runtime +#else +#define USE_STATIC_VPM 0 +#endif -#define MAKE_HR(errnum) (MAKE_HRESULT(SEVERITY_ERROR, FACILITY_CONTROL, errnum)) #if ENABLE_CONCURRENT_GC // Write-barrier refers to a software write barrier implementation using a card table. @@ -213,6 +247,10 @@ #error "Background page zeroing can't be turned on if freeing pages in the background is disabled" #endif +#if defined(_WIN32) && !GLOBAL_ENABLE_WRITE_BARRIER +#define RECYCLER_VISITED_HOST +#endif + // JIT features #if DISABLE_JIT @@ -233,7 +271,7 @@ #define ENABLE_BACKGROUND_JOB_PROCESSOR 1 #define ENABLE_COPYONACCESS_ARRAY 1 #ifndef DYNAMIC_INTERPRETER_THUNK -#if defined(_M_IX86_OR_ARM32) || defined(_M_X64_OR_ARM64) +#if defined(TARGET_32) || defined(TARGET_64) #define DYNAMIC_INTERPRETER_THUNK 1 #else #define DYNAMIC_INTERPRETER_THUNK 0 @@ -245,6 +283,10 @@ #define ENABLE_BACKGROUND_PARSING 1 #endif +#if ENABLE_DEBUG_CONFIG_OPTIONS +#define ALLOW_JIT_REPRO +#endif + #endif #if ENABLE_NATIVE_CODEGEN @@ -252,7 +294,8 @@ #define ENABLE_OOP_NATIVE_CODEGEN 1 // Out of process JIT #endif -#if _WIN64 +// ToDo (SaAgarwa): Disable VirtualTypedArray on ARM64 till we make sure it works correctly +#if _WIN64 && !defined(_M_ARM64) #define ENABLE_FAST_ARRAYBUFFER 1 #endif #endif @@ -260,18 +303,8 @@ // Other features // #define CHAKRA_CORE_DOWN_COMPAT 1 -// VS2015 RTM has bugs with constexpr, so require min of VS2015 Update 3 (known good version) -#if !defined(_MSC_VER) || _MSC_FULL_VER >= 190024210 -#define HAS_CONSTEXPR 1 -#endif - -#ifdef HAS_CONSTEXPR -#define OPT_CONSTEXPR constexpr -#else -#define OPT_CONSTEXPR -#endif - -#ifdef _WIN32 +// todo:: Enable vectorcall on NTBUILD. OS#13609380 +#if defined(_WIN32) && !defined(NTBUILD) && defined(_M_IX86) #define VECTORCALL __vectorcall #else #define VECTORCALL @@ -281,20 +314,13 @@ #define DELAYLOAD_SET_CFG_TARGET 1 #endif -// Configure whether we configure a signal handler -// to produce perf-.map files -#ifndef PERFMAP_TRACE_ENABLED -#define PERFMAP_TRACE_ENABLED 0 -#endif #ifndef PERFMAP_SIGNAL #define PERFMAP_SIGNAL SIGUSR2 #endif #ifndef NTBUILD #define DELAYLOAD_SECTIONAPI 1 -#endif - -#ifdef NTBUILD +#else #define ENABLE_PROJECTION #define ENABLE_FOUNDATION_OBJECT #define ENABLE_EXPERIMENTAL_FLAGS @@ -303,6 +329,7 @@ #define ENABLE_DOM_FAST_PATH #define EDIT_AND_CONTINUE #define ENABLE_JIT_CLAMP +#define ENABLE_SCRIPT_PROFILING #endif // Telemetry flags @@ -421,7 +448,7 @@ //////// //Time Travel flags //Include TTD code in the build when building for Chakra (except NT/Edge) or for debug/test builds -#if !defined(NTBUILD) || defined(ENABLE_DEBUG_CONFIG_OPTIONS) +#if defined(ENABLE_SCRIPT_DEBUGGING) && (!defined(NTBUILD) || defined(ENABLE_DEBUG_CONFIG_OPTIONS)) #define ENABLE_TTD 1 #else #define ENABLE_TTD 0 @@ -644,12 +671,16 @@ // #define RECYCLER_MARK_TRACK // #define INTERNAL_MEM_PROTECT_HEAP_ALLOC +#if defined(ENABLE_JS_ETW) || defined(DUMP_FRAGMENTATION_STATS) +#define ENABLE_MEM_STATS 1 +#endif + #define NO_SANITIZE_ADDRESS #if defined(__has_feature) #if __has_feature(address_sanitizer) #undef NO_SANITIZE_ADDRESS #define NO_SANITIZE_ADDRESS __attribute__((no_sanitize("address"))) -#define NO_SANITIZE_ADDRESS_FIXVC +#define NO_SANITIZE_ADDRESS_CHECK #endif #endif @@ -663,7 +694,7 @@ // Platform dependent flags //---------------------------------------------------------------------------------------------------- #ifndef INT32VAR -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) #define INT32VAR 1 #else #define INT32VAR 0 @@ -671,7 +702,7 @@ #endif #ifndef FLOATVAR -#if defined(_M_X64) +#if defined(TARGET_64) #define FLOATVAR 1 #else #define FLOATVAR 0 @@ -690,15 +721,13 @@ #endif #if defined(ASMJS_PLAT) -// xplat-todo: once all the wasm tests are passing on xplat, enable it for release builds -#if defined(_WIN32) || (defined(__clang__) && defined(ENABLE_DEBUG_CONFIG_OPTIONS)) #define ENABLE_WASM +#define ENABLE_WASM_SIMD #ifdef CAN_BUILD_WABT #define ENABLE_WABT #endif -#endif #endif #if _M_IX86 @@ -836,19 +865,3 @@ #ifndef PROFILE_DICTIONARY #define PROFILE_DICTIONARY 0 #endif - -#ifndef THREAD_LOCAL -#ifndef __APPLE__ - #if defined(_MSC_VER) && _MSC_VER <= 1800 // VS2013? - #define THREAD_LOCAL __declspec(thread) - #else // VS2015+, linux Clang etc. - #define THREAD_LOCAL thread_local - #endif // VS2013? -#else // __APPLE__ - #ifndef __IOS__ - #define THREAD_LOCAL _Thread_local - #else - #define THREAD_LOCAL - #endif -#endif // __APPLE__ -#endif // THREAD_LOCAL diff --git a/deps/chakrashim/core/lib/Common/CommonMin.h b/deps/chakrashim/core/lib/Common/CommonMin.h index 04d6e87ac4e..a4eb3168720 100644 --- a/deps/chakrashim/core/lib/Common/CommonMin.h +++ b/deps/chakrashim/core/lib/Common/CommonMin.h @@ -18,27 +18,6 @@ #endif // === Core Header Files === -// In Debug mode, the PALs definition of max and min are insufficient -// since some of our code expects the template min-max instead, so -// including that here -#if defined(DBG) && !defined(_MSC_VER) -#pragma push_macro("NO_PAL_MINMAX") -#pragma push_macro("_Post_equal_to") -#pragma push_macro("_Post_satisfies_") -#define NO_PAL_MINMAX -#define _Post_equal_to_(x) -#define _Post_satisfies_(x) -#endif - -#include "Core/CommonMinMax.h" - -// Restore the macros -#if defined(DBG) && !defined(_MSC_VER) -#pragma pop_macro("NO_PAL_MINMAX") -#pragma pop_macro("_Post_equal_to") -#pragma pop_macro("_Post_satisfies_") -#endif - #include "EnumHelp.h" #include "Core/Assertions.h" #include "Core/SysInfo.h" diff --git a/deps/chakrashim/core/lib/Common/CommonMinMemory.h b/deps/chakrashim/core/lib/Common/CommonMinMemory.h index 3c9c40597d5..b971cfe7810 100644 --- a/deps/chakrashim/core/lib/Common/CommonMinMemory.h +++ b/deps/chakrashim/core/lib/Common/CommonMinMemory.h @@ -40,5 +40,6 @@ class FinalizableObject; #include "Memory/RecyclerSweep.h" #include "Memory/RecyclerHeuristic.h" #include "Memory/MarkContext.h" +#include "Memory/MarkContextWrapper.h" #include "Memory/RecyclerWatsonTelemetry.h" #include "Memory/Recycler.h" diff --git a/deps/chakrashim/core/lib/Common/CommonPal.h b/deps/chakrashim/core/lib/Common/CommonPal.h index e49ebffa882..54419e2af49 100644 --- a/deps/chakrashim/core/lib/Common/CommonPal.h +++ b/deps/chakrashim/core/lib/Common/CommonPal.h @@ -37,6 +37,33 @@ #define DECLSPEC_GUARD_OVERFLOW __declspec(guard(overflow)) #endif +#ifndef THREAD_LOCAL +#ifndef __APPLE__ +#if defined(_MSC_VER) && _MSC_VER <= 1800 // VS2013? +#define THREAD_LOCAL __declspec(thread) +#else // VS2015+, linux Clang etc. +#define THREAD_LOCAL thread_local +#endif // VS2013? +#else // __APPLE__ +#ifndef __IOS__ +#define THREAD_LOCAL _Thread_local +#else +#define THREAD_LOCAL +#endif +#endif // __APPLE__ +#endif // THREAD_LOCAL + +// VS2015 RTM has bugs with constexpr, so require min of VS2015 Update 3 (known good version) +#if !defined(_MSC_VER) || _MSC_FULL_VER >= 190024210 +#define HAS_CONSTEXPR 1 +#endif + +#ifdef HAS_CONSTEXPR +#define OPT_CONSTEXPR constexpr +#else +#define OPT_CONSTEXPR +#endif + #ifdef __clang__ #define CLANG_WNO_BEGIN_(x) \ _Pragma("clang diagnostic push")\ @@ -59,6 +86,7 @@ #pragma warning(disable: 4995) /* 'function': name was marked as #pragma deprecated */ // === Windows Header Files === +#define WIN32_LEAN_AND_MEAN 1 #define INC_OLE2 /* for windows.h */ #define CONST_VTABLE /* for objbase.h */ #include @@ -470,15 +498,17 @@ DWORD __cdecl CharUpperBuffW(const char16* lpsz, DWORD cchLength); #include #endif - -#if defined(_MSC_VER) && !defined(__clang__) -// ms-specific keywords +// MSVC specific keywords +#if defined(_MSC_VER) #define _ABSTRACT abstract -// MSVC2015 does not support C++11 semantics for `typename QualifiedName` declarations -// outside of template code. -#define _TYPENAME #else #define _ABSTRACT +#endif + +// `typename QualifiedName` declarations outside of template code not supported before MSVC 2015 update 1 +#if defined(_MSC_VER) && _MSC_VER < 1910 +#define _TYPENAME +#else #define _TYPENAME typename #endif diff --git a/deps/chakrashim/core/lib/Common/ConfigFlagsList.h b/deps/chakrashim/core/lib/Common/ConfigFlagsList.h index 257f10115a6..7af891cff61 100644 --- a/deps/chakrashim/core/lib/Common/ConfigFlagsList.h +++ b/deps/chakrashim/core/lib/Common/ConfigFlagsList.h @@ -36,10 +36,10 @@ PHASE(All) PHASE(GatherCodeGenData) PHASE(Wasm) // Wasm frontend - PHASE(WasmBytecode) - PHASE(WasmReader) - PHASE(WasmSection) - PHASE(WasmLEB128) + PHASE(WasmBytecode) // Supports -off,-dump,-trace,-profile + PHASE(WasmReader) // Support -trace,-profile + PHASE(WasmSection) // Supports -trace + PHASE(WasmOpCodeDistribution) // Support -dump // Wasm features per functions PHASE(WasmDeferred) PHASE(WasmValidatePrejit) @@ -401,10 +401,13 @@ PHASE(All) #define DEFAULT_CONFIG_WasmFastArray (false) #endif #define DEFAULT_CONFIG_WasmCheckVersion (true) +#define DEFAULT_CONFIG_WasmIgnoreLimits (false) #define DEFAULT_CONFIG_WasmFold (true) #define DEFAULT_CONFIG_WasmMathExFilter (false) #define DEFAULT_CONFIG_WasmIgnoreResponse (false) #define DEFAULT_CONFIG_WasmMaxTableSize (10000000) +#define DEFAULT_CONFIG_WasmSimd (false) +#define DEFAULT_CONFIG_WasmSignExtends (false) #define DEFAULT_CONFIG_BgJitDelayFgBuffer (0) #define DEFAULT_CONFIG_BgJitPendingFuncCap (31) #define DEFAULT_CONFIG_CurrentSourceInfo (true) @@ -447,6 +450,7 @@ PHASE(All) #define DEFAULT_CONFIG_InlineThresholdAdjustCountInMediumSizedFunction (6) #define DEFAULT_CONFIG_InlineThresholdAdjustCountInSmallFunction (10) #define DEFAULT_CONFIG_ConstructorInlineThreshold (21) //Monomorphic constructor threshold +#define DEFAULT_CONFIG_AsmJsInlineAdjust (35) // wasm functions are cheaper to inline, so worth being more aggressive #define DEFAULT_CONFIG_ConstructorCallsRequiredToFinalizeCachedType (2) #define DEFAULT_CONFIG_OutsideLoopInlineThreshold (16) //Threshold to inline outside loops #define DEFAULT_CONFIG_LeafInlineThreshold (60) //Inlinee threshold for function which is leaf (irrespective of it has loops or not) @@ -507,6 +511,7 @@ PHASE(All) #define DEFAULT_CONFIG_RegexTracing (false) #define DEFAULT_CONFIG_RegexProfile (false) #define DEFAULT_CONFIG_RegexDebug (false) +#define DEFAULT_CONFIG_RegexBytecodeDebug (false) #define DEFAULT_CONFIG_RegexOptimize (true) #define DEFAULT_CONFIG_DynamicRegexMruListSize (16) #define DEFAULT_CONFIG_GoptCleanupThreshold (25) @@ -525,6 +530,14 @@ PHASE(All) #define DEFAULT_CONFIG_Intl (true) #define DEFAULT_CONFIG_IntlBuiltIns (true) +#ifdef ENABLE_JS_BUILTINS + #define DEFAULT_CONFIG_JsBuiltIn (true) +#else + #define DEFAULT_CONFIG_JsBuiltIn (false) +#endif +#define DEFAULT_CONFIG_JitRepro (false) +#define DEFAULT_CONFIG_LdChakraLib (false) + // ES6 DEFAULT BEHAVIOR #define DEFAULT_CONFIG_ES6 (true) // master flag to gate all P0-spec-test compliant ES6 features @@ -589,17 +602,12 @@ PHASE(All) #define DEFAULT_CONFIG_ES6RegExSymbols (false) #endif #define DEFAULT_CONFIG_ES6HasInstance (true) -#ifdef COMPILE_DISABLE_ArrayBufferTransfer - // If ArrayBufferTransfer needs to be disabled by compile flag, DEFAULT_CONFIG_ArrayBufferTransfer should be false - #define DEFAULT_CONFIG_ArrayBufferTransfer (false) -#else - #define DEFAULT_CONFIG_ArrayBufferTransfer (false) -#endif #define DEFAULT_CONFIG_ES7AsyncAwait (true) #define DEFAULT_CONFIG_ES7ExponentionOperator (true) #define DEFAULT_CONFIG_ES7TrailingComma (true) #define DEFAULT_CONFIG_ES7ValuesEntries (true) #define DEFAULT_CONFIG_ESObjectGetOwnPropertyDescriptors (true) +#define DEFAULT_CONFIG_ESDynamicImport (false) #define DEFAULT_CONFIG_ESSharedArrayBuffer (false) @@ -879,9 +887,14 @@ FLAGNR(Boolean, WasmI64 , "Enable Int64 testing for WebAssembly. A FLAGNR(Boolean, WasmFastArray , "Enable fast array implementation for WebAssembly", DEFAULT_CONFIG_WasmFastArray) FLAGNR(Boolean, WasmMathExFilter , "Enable Math exception filter for WebAssembly", DEFAULT_CONFIG_WasmMathExFilter) FLAGNR(Boolean, WasmCheckVersion , "Check the binary version for WebAssembly", DEFAULT_CONFIG_WasmCheckVersion) +FLAGNR(Boolean, WasmIgnoreLimits , "Ignore the WebAssembly binary limits ", DEFAULT_CONFIG_WasmIgnoreLimits) FLAGNR(Boolean, WasmFold , "Enable i32/i64 const folding", DEFAULT_CONFIG_WasmFold) FLAGNR(Boolean, WasmIgnoreResponse , "Ignore the type of the Response object", DEFAULT_CONFIG_WasmIgnoreResponse) FLAGNR(Number, WasmMaxTableSize , "Maximum size allowed to the WebAssembly.Table", DEFAULT_CONFIG_WasmMaxTableSize) +FLAGNR(Boolean, WasmSignExtends , "Use new WebAssembly sign extension operators", DEFAULT_CONFIG_WasmSignExtends) +#ifdef ENABLE_WASM_SIMD +FLAGNR(Boolean, WasmSimd , "Enable SIMD in WebAssembly", DEFAULT_CONFIG_WasmSimd) +#endif #ifdef ENABLE_SIMDJS #ifndef COMPILE_DISABLE_Simdjs @@ -995,6 +1008,10 @@ FLAGNR(Boolean, CollectGarbage , "Enable CollectGarbage API", DEFAULT_CON FLAGR (Boolean, Intl , "Intl object support", DEFAULT_CONFIG_Intl) FLAGNR(Boolean, IntlBuiltIns , "Intl built-in function support", DEFAULT_CONFIG_IntlBuiltIns) +FLAGNR(Boolean, JsBuiltIn , "JS Built-in function support", DEFAULT_CONFIG_JsBuiltIn) +FLAGNR(Boolean, JitRepro , "Add Function.invokeJit to execute codegen on an encoded rpc buffer", DEFAULT_CONFIG_JitRepro) + +FLAGNR(Boolean, LdChakraLib , "Access to the Chakra internal library with the __chakraLibrary keyword", DEFAULT_CONFIG_LdChakraLib) // ES6 (BLUE+1) features/flags // Master ES6 flag to enable STABLE ES6 features/flags @@ -1031,7 +1048,7 @@ FLAGPR (Boolean, ES6, ES6IsConcatSpreadable , "Enable ES6 isConcatSpr FLAGPR (Boolean, ES6, ES6Math , "Enable ES6 Math extensions" , DEFAULT_CONFIG_ES6Math) #ifndef COMPILE_DISABLE_ESDynamicImport -#define COMPILE_DISABLE_ESDynamicImport 0 + #define COMPILE_DISABLE_ESDynamicImport 0 #endif FLAGPR_REGOVR_EXP(Boolean, ES6, ESDynamicImport , "Enable dynamic import" , DEFAULT_CONFIG_ESDynamicImport) @@ -1073,12 +1090,6 @@ FLAGPR_REGOVR_EXP(Boolean, ES6, ES6RegExSymbols , "Enable ES6 RegExp symb FLAGPR (Boolean, ES6, ES6HasInstance , "Enable ES6 @@hasInstance symbol" , DEFAULT_CONFIG_ES6HasInstance) FLAGPR (Boolean, ES6, ES6Verbose , "Enable ES6 verbose trace" , DEFAULT_CONFIG_ES6Verbose) - -#ifndef COMPILE_DISABLE_ArrayBufferTransfer - #define COMPILE_DISABLE_ArrayBufferTransfer 0 -#endif -FLAGPR_REGOVR_EXP(Boolean, ES6, ArrayBufferTransfer , "Enable ArrayBuffer.transfer" , DEFAULT_CONFIG_ArrayBufferTransfer) - FLAGPR (Boolean, ES6, ESObjectGetOwnPropertyDescriptors, "Enable Object.getOwnPropertyDescriptors" , DEFAULT_CONFIG_ESObjectGetOwnPropertyDescriptors) #ifndef COMPILE_DISABLE_ESSharedArrayBuffer @@ -1136,7 +1147,7 @@ FLAGNR(Boolean, DumpCommentsFromReferencedFiles, "Allow printing comments of com FLAGNR(Number, DelayFullJITSmallFunc , "Scale Full JIT threshold for small functions which are going to be inlined soon. To provide fraction scale, the final scale is scale following this option divided by 10", DEFAULT_CONFIG_DelayFullJITSmallFunc) FLAGNR(Boolean, EnableFatalErrorOnOOM, "Enabling failfast fatal error on OOM", DEFAULT_CONFIG_EnableFatalErrorOnOOM) -#ifdef _M_ARM +#if defined(_M_ARM32_OR_ARM64) FLAGNR(Boolean, ForceLocalsPtr , "Force use of alternative locals pointer (JIT only)", false) #endif FLAGNR(Boolean, DeferLoadingAvailableSource, "Treat available source code as a dummy defer-mappable object to go through that code path.", DEFAULT_CONFIG_DeferLoadingAvailableSource) @@ -1181,6 +1192,7 @@ FLAGNR(Number, AggressiveInlineThreshold, "Maximum size in bytecodes of an inli FLAGNR(Number, InlineThresholdAdjustCountInLargeFunction , "Adjustment in the maximum size in bytecodes of an inline candidate in a large function", DEFAULT_CONFIG_InlineThresholdAdjustCountInLargeFunction) FLAGNR(Number, InlineThresholdAdjustCountInMediumSizedFunction , "Adjustment in the maximum size in bytecodes of an inline candidate in a medium sized function", DEFAULT_CONFIG_InlineThresholdAdjustCountInMediumSizedFunction) FLAGNR(Number, InlineThresholdAdjustCountInSmallFunction , "Adjustment in the maximum size in bytecodes of an inline candidate in a small function", DEFAULT_CONFIG_InlineThresholdAdjustCountInSmallFunction) +FLAGNR(Number, AsmJsInlineAdjust , "Adjustment in the maximum size in bytecodes of an inline candidate for wasm function", DEFAULT_CONFIG_AsmJsInlineAdjust) FLAGNR(String, Interpret , "List of functions to interpret", nullptr) FLAGNR(Phases, Instrument , "Instrument the generated code from the given phase", ) FLAGNR(Number, JitQueueThreshold , "Max number of work items/script context in the jit queue", DEFAULT_CONFIG_JitQueueThreshold) @@ -1271,12 +1283,7 @@ FLAGNR(Boolean, CrashOnOOPJITFailure , "Crash runtime process if JIT process cr FLAGNR(Boolean, OOPCFGRegistration , "Do CFG registration OOP (under OOP JIT)", DEFAULT_CONFIG_OOPCFGRegistration) FLAGNR(Boolean, ForceJITCFGCheck , "Have JIT code always do CFG check even if range check succeeded", DEFAULT_CONFIG_ForceJITCFGCheck) FLAGNR(Boolean, UseJITTrampoline , "Use trampoline for JIT entry points and emit range checks for it", DEFAULT_CONFIG_UseJITTrampoline) -#ifdef _ARM64_ -FLAGR (Boolean, NoNative , "Disable native codegen", true) -#else FLAGR (Boolean, NoNative , "Disable native codegen", false) -#endif - FLAGNR(Number, NopFrequency , "Frequency of NOPs inserted by NOP insertion phase. A NOP is guaranteed to be inserted within a range of (1< // wmemcpy_s #endif +int AssertCount = 0; +int AssertsToConsole = false; + +#if _WIN32 + // IsInAssert defined in header +#elif !defined(__IOS__) + __declspec(thread) int IsInAssert = false; +#else +int IsInAssert = false; +#endif + void __stdcall js_memcpy_s(__bcount(sizeInBytes) void *dst, size_t sizeInBytes, __in_bcount(count) const void *src, size_t count) { Assert((count) <= (sizeInBytes)); diff --git a/deps/chakrashim/core/lib/Common/Core/Assertions.h b/deps/chakrashim/core/lib/Common/Core/Assertions.h index 3f5332d4113..5fbc66a9c51 100644 --- a/deps/chakrashim/core/lib/Common/Core/Assertions.h +++ b/deps/chakrashim/core/lib/Common/Core/Assertions.h @@ -10,16 +10,16 @@ #if defined(DBG) && !defined(DIAG_DAC) // AutoDebug functions that are only available in DEBUG builds -_declspec(selectany) int AssertCount = 0; -_declspec(selectany) int AssertsToConsole = false; +extern int AssertCount; +extern int AssertsToConsole; #if _WIN32 _declspec(thread, selectany) int IsInAssert = false; #elif !defined(__IOS__) -__declspec(thread, selectany) int IsInAssert = false; +extern __declspec(thread) int IsInAssert; #else -// todo: implement thread local variable for iOS ?? -__declspec(selectany) int IsInAssert = false; + // todo: implement thread local variable for iOS ?? +extern int IsInAssert; #endif #if !defined(USED_IN_STATIC_LIB) diff --git a/deps/chakrashim/core/lib/Common/Core/CmdParser.cpp b/deps/chakrashim/core/lib/Common/Core/CmdParser.cpp index 024b4e219a1..016c1a70858 100644 --- a/deps/chakrashim/core/lib/Common/Core/CmdParser.cpp +++ b/deps/chakrashim/core/lib/Common/Core/CmdParser.cpp @@ -68,11 +68,12 @@ CmdLineArgsParser::ParseString(__inout_ecount(ceBuffer) LPWSTR buffer, size_t ce case ' ': case ',': case 0: - fDone = 1; + fDone = true; break; case '-': + case '=': case ':': - if(fTreatColonAsSeparator) + if (fTreatColonAsSeparator) { fDone = true; break; @@ -82,7 +83,7 @@ CmdLineArgsParser::ParseString(__inout_ecount(ceBuffer) LPWSTR buffer, size_t ce // Fallthrough } default: - if(len >= MaxTokenSize -1) + if (len >= MaxTokenSize - 1) { throw Exception(_u("String token too large to parse")); } @@ -681,7 +682,7 @@ int CmdLineArgsParser::Parse(__in LPWSTR oneArg) throw() } catch(Exception &exp) { - wprintf(_u("%s : %s\n"), (LPCWSTR)exp, oneArg); + Output::Print(_u("%s : %s\n"), (LPCWSTR)exp, oneArg); err = -1; } return err; diff --git a/deps/chakrashim/core/lib/Common/Core/CommonCorePch.h b/deps/chakrashim/core/lib/Common/Core/CommonCorePch.h index 3639a6ad0b6..cb5df328029 100644 --- a/deps/chakrashim/core/lib/Common/Core/CommonCorePch.h +++ b/deps/chakrashim/core/lib/Common/Core/CommonCorePch.h @@ -4,7 +4,6 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#include "CommonDefines.h" #include "CommonMin.h" #ifdef _MSC_VER diff --git a/deps/chakrashim/core/lib/Common/Core/ConfigFlagsTable.cpp b/deps/chakrashim/core/lib/Common/Core/ConfigFlagsTable.cpp index b77ad21a0b5..3e5e8acb2e3 100644 --- a/deps/chakrashim/core/lib/Common/Core/ConfigFlagsTable.cpp +++ b/deps/chakrashim/core/lib/Common/Core/ConfigFlagsTable.cpp @@ -869,53 +869,53 @@ namespace Js void ConfigFlagsTable::PrintUsageString() { - printf("List of Phases:\n"); + Output::Print(_u("List of Phases:\n")); for(int i = 0; i < PhaseCount; i++) { if (i % 4 == 0) { - printf("\n "); + Output::Print(_u("\n ")); } - printf("%-40ls ", PhaseNames[i]); + Output::Print(_u("%-40ls "), PhaseNames[i]); } - printf("\n\nList of flags:\n\n"); + Output::Print(_u("\n\nList of flags:\n\n")); for(int i = 0; i < FlagCount; i++) { - printf("%60ls ", FlagNames[i]); + Output::Print(_u("%60ls "), FlagNames[i]); switch(GetFlagType(Flag(i))) { case InvalidFlagType: break; case FlagString: - printf("[:String] "); + Output::Print(_u("[:String] ")); break; case FlagPhases: - printf("[:Phase] "); + Output::Print(_u("[:Phase] ")); break; case FlagNumber: - printf("[:Number] "); + Output::Print(_u("[:Number] ")); break; case FlagBoolean: - printf(" "); + Output::Print(_u(" ")); break; case FlagNumberSet: - printf("[:NumberSet] "); + Output::Print(_u("[:NumberSet] ")); break; case FlagNumberPairSet: - printf("[:NumberPairSet] "); + Output::Print(_u("[:NumberPairSet] ")); break; case FlagNumberTrioSet: - printf("[:NumberTrioSet] "); + Output::Print(_u("[:NumberTrioSet] ")); break; case FlagNumberRange: - printf("[:NumberRange] "); + Output::Print(_u("[:NumberRange] ")); break; default: Assert(false); __assume(false); } - printf("%ls\n", FlagDescriptions[i]); + Output::Print(_u("%ls\n"), FlagDescriptions[i]); } } diff --git a/deps/chakrashim/core/lib/Common/Core/ConfigParser.cpp b/deps/chakrashim/core/lib/Common/Core/ConfigParser.cpp index f522335311f..9738730526f 100644 --- a/deps/chakrashim/core/lib/Common/Core/ConfigParser.cpp +++ b/deps/chakrashim/core/lib/Common/Core/ConfigParser.cpp @@ -594,7 +594,7 @@ HRESULT ConfigParser::SetOutputFile(const WCHAR* outputFile, const WCHAR* openMo char16 fileName[_MAX_PATH]; char16 moduleName[_MAX_PATH]; - GetModuleFileName(0, moduleName, _MAX_PATH); + PlatformAgnostic::SystemInfo::GetBinaryLocation(moduleName, _MAX_PATH); _wsplitpath_s(moduleName, nullptr, 0, nullptr, 0, fileName, _MAX_PATH, nullptr, 0); if (_wcsicmp(fileName, _u("WWAHost")) == 0 || _wcsicmp(fileName, _u("ByteCodeGenerator")) == 0 || diff --git a/deps/chakrashim/core/lib/Common/Core/CriticalSection.h b/deps/chakrashim/core/lib/Common/Core/CriticalSection.h index cec44e9b2a8..2ac4ba0efa6 100644 --- a/deps/chakrashim/core/lib/Common/Core/CriticalSection.h +++ b/deps/chakrashim/core/lib/Common/Core/CriticalSection.h @@ -6,10 +6,10 @@ class CriticalSection #ifndef _WIN32 -: public CCSpinLock +: public CCLock { public: - CriticalSection(DWORD spincount = 0): CCSpinLock(spincount) { } + CriticalSection(DWORD spincount = 0): CCLock(true) { } }; #else // _WIN32 { diff --git a/deps/chakrashim/core/lib/Common/Core/DbgHelpSymbolManager.cpp b/deps/chakrashim/core/lib/Common/Core/DbgHelpSymbolManager.cpp index c8986dd9cd8..4931fdf6fad 100644 --- a/deps/chakrashim/core/lib/Common/Core/DbgHelpSymbolManager.cpp +++ b/deps/chakrashim/core/lib/Common/Core/DbgHelpSymbolManager.cpp @@ -63,7 +63,7 @@ DbgHelpSymbolManager::Initialize() if (wcscmp(wszModule, _u("")) == 0) { - if (GetModuleFileName(NULL, wszModuleName, static_cast(ceModuleName))) + if (PlatformAgnostic::SystemInfo::GetBinaryLocation(wszModuleName, static_cast(ceModuleName))) { wszModule = wszModuleName; } diff --git a/deps/chakrashim/core/lib/Common/Core/DelayLoadLibrary.cpp b/deps/chakrashim/core/lib/Common/Core/DelayLoadLibrary.cpp index f512942e13f..b4aa4b9d773 100644 --- a/deps/chakrashim/core/lib/Common/Core/DelayLoadLibrary.cpp +++ b/deps/chakrashim/core/lib/Common/Core/DelayLoadLibrary.cpp @@ -70,6 +70,7 @@ DWORD NtdllLibrary::AddGrowableFunctionTable( _Out_ PVOID * DynamicTable, _In_ ULONG_PTR RangeBase, _In_ ULONG_PTR RangeEnd ) { + Assert(AutoSystemInfo::Data.IsWin8OrLater()); if(m_hModule) { if(addGrowableFunctionTable == NULL) @@ -93,6 +94,7 @@ DWORD NtdllLibrary::AddGrowableFunctionTable( _Out_ PVOID * DynamicTable, VOID NtdllLibrary::DeleteGrowableFunctionTable( _In_ PVOID DynamicTable ) { + Assert(AutoSystemInfo::Data.IsWin8OrLater()); if(m_hModule) { if(deleteGrowableFunctionTable == NULL) diff --git a/deps/chakrashim/core/lib/Common/Core/EtwTraceCore.cpp b/deps/chakrashim/core/lib/Common/Core/EtwTraceCore.cpp index d0ebb6aa543..a2e5f849d6f 100644 --- a/deps/chakrashim/core/lib/Common/Core/EtwTraceCore.cpp +++ b/deps/chakrashim/core/lib/Common/Core/EtwTraceCore.cpp @@ -6,6 +6,7 @@ #include "Core/EtwTraceCore.h" #ifdef ENABLE_JS_ETW +#ifndef ENABLE_JS_LTTNG extern "C" { ETW_INLINE VOID EtwCallback( @@ -64,4 +65,5 @@ void EtwTraceCore::UnRegister() } } -#endif +#endif // !ENABLE_JS_LTTNG +#endif // ENABLE_JS_ETW diff --git a/deps/chakrashim/core/lib/Common/Core/EtwTraceCore.h b/deps/chakrashim/core/lib/Common/Core/EtwTraceCore.h index b7e0af085f6..ad9bc0c58d5 100644 --- a/deps/chakrashim/core/lib/Common/Core/EtwTraceCore.h +++ b/deps/chakrashim/core/lib/Common/Core/EtwTraceCore.h @@ -28,20 +28,29 @@ PAIR(EventWriteJSCRIPT_ ## e, args); \ } +#define IS_GCETW_Enabled(e) \ + (IsMemProtectMode() ? EventEnabledMEMPROTECT_##e() : EventEnabledJSCRIPT_##e()) + #define JS_ETW_INTERNAL(s) s #define EDGE_ETW_INTERNAL(s) s -#else +#else // !NTBUILD #define GCETW(e, args) \ PAIR(EventWriteJSCRIPT_ ## e, args); +#define IS_GCETW_Enabled(e) EventEnabledJSCRIPT_##e() + #define GCETW_INTERNAL(e, args) #define JS_ETW_INTERNAL(s) #define EDGE_ETW_INTERNAL(s) -#endif +#endif // !NTBUILD #define JS_ETW(s) s #define IS_JS_ETW(s) s +#ifdef ENABLE_JS_LTTNG +#include "jscriptEtw.h" + +#else // C-style callback extern "C" { void EtwCallback( @@ -82,9 +91,11 @@ class EtwTraceCore static bool s_registered; }; +#endif // ENABLE_JS_LTTNG #else #define GCETW(e, ...) +#define IS_GCETW_Enabled(e) false #define JS_ETW(s) #define IS_JS_ETW(s) (false) #define GCETW_INTERNAL(e, args) diff --git a/deps/chakrashim/core/lib/Common/Core/FaultInjection.cpp b/deps/chakrashim/core/lib/Common/Core/FaultInjection.cpp index f907991fd49..216e89974cd 100644 --- a/deps/chakrashim/core/lib/Common/Core/FaultInjection.cpp +++ b/deps/chakrashim/core/lib/Common/Core/FaultInjection.cpp @@ -370,14 +370,14 @@ namespace Js } FUNCTION_SIGNATURES, *PFUNCTION_SIGNATURES; // function address ranges of each signature - // use for faster address matching instead of symbol table lookup when reproing + // use for faster address matching instead of symbol table lookup when reproducing PFUNCTION_SIGNATURES baselineFuncSigs[FaultInjection::MAX_FRAME_COUNT] = { 0 }; // record hit count of each frame when Faults are injected. unsigned int stackMatchRank[FaultInjection::MAX_FRAME_COUNT] = { 0 }; #define FAULT_TYPE(x) _u(#x),\ - char16 *FaultInjection::FaultTypeNames[] = + const char16 *FaultInjection::FaultTypeNames[] = { #include "FaultTypes.h" }; @@ -1030,7 +1030,7 @@ namespace Js } // install exception filter to smart dump for faultinjection - // when reproing in debugger, only let debugger catch the exception + // when reproducing in debugger, only let debugger catch the exception // can't do this in ctor because the global flags are not initialized yet InstallExceptionFilters(); @@ -1235,7 +1235,7 @@ namespace Js //analyze duplication uintptr_t savedOffset = 0; auto& mainModule = modulePath; - GetModuleFileName(NULL, mainModule, MAX_PATH); + PlatformAgnostic::SystemInfo::GetBinaryLocation(mainModule, MAX_PATH); // multiple session of Fault Injection run shares the single crash offset recording file _snwprintf_s(filename, _TRUNCATE, _u("%s.FICrashes.txt"), mainModule); diff --git a/deps/chakrashim/core/lib/Common/Core/FaultInjection.h b/deps/chakrashim/core/lib/Common/Core/FaultInjection.h index 1cf23a53fe4..53fd0effc66 100644 --- a/deps/chakrashim/core/lib/Common/Core/FaultInjection.h +++ b/deps/chakrashim/core/lib/Common/Core/FaultInjection.h @@ -51,7 +51,7 @@ namespace Js bool IsEnabled(const char16* name); }; - static char16 *FaultTypeNames[]; + static const char16 *FaultTypeNames[]; void ParseFaultTypes(const char16* szFaultTypes); public: diff --git a/deps/chakrashim/core/lib/Common/Core/FinalizableObject.h b/deps/chakrashim/core/lib/Common/Core/FinalizableObject.h index 30088930174..26fe81514f5 100644 --- a/deps/chakrashim/core/lib/Common/Core/FinalizableObject.h +++ b/deps/chakrashim/core/lib/Common/Core/FinalizableObject.h @@ -3,24 +3,22 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #pragma once -class FinalizableObject +#include "RecyclerVisitedObject.h" + +class FinalizableObject : public IRecyclerVisitedObject { public: - // Called right after finish marking and this object is determined to be dead. - // Should contain only simple clean up code. - // Can't run another script - // Can't cause a re-entrant collection - - virtual void Finalize(bool isShutdown) = 0; - - // Call after sweeping is done. - // Can call other script or cause another collection. + virtual void OnMark() {} - virtual void Dispose(bool isShutdown) = 0; + void Mark(RecyclerHeapHandle recycler) final + { + Mark(static_cast(recycler)); + } - // Used only by TrackableObjects (created with TrackedBit on by RecyclerNew*Tracked) - virtual void Mark(Recycler * recycler) = 0; + void Trace(IRecyclerHeapMarkingContext* markingContext) + { + AssertMsg(false, "Trace called on object that isn't implemented by the host"); + } - // Special behavior on certain GC's - virtual void OnMark() {} + virtual void Mark(Recycler* recycler) = 0; }; diff --git a/deps/chakrashim/core/lib/Common/Core/Output.cpp b/deps/chakrashim/core/lib/Common/Core/Output.cpp index d6cdcad7a8d..c6766fd8922 100644 --- a/deps/chakrashim/core/lib/Common/Core/Output.cpp +++ b/deps/chakrashim/core/lib/Common/Core/Output.cpp @@ -36,9 +36,11 @@ unsigned int Output::s_traceEntryId = 0; #endif THREAD_ST FILE* Output::s_file = nullptr; +#ifdef _WIN32 THREAD_ST char16* Output::buffer = nullptr; THREAD_ST size_t Output::bufferAllocSize = 0; THREAD_ST size_t Output::bufferFreeSize = 0; +#endif THREAD_ST size_t Output::s_Column = 0; THREAD_ST WORD Output::s_color = 0; THREAD_ST bool Output::s_hasColor = false; @@ -268,11 +270,15 @@ Output::VPrint(const char16 *form, va_list argptr) size = _vsnwprintf_s(buf, _countof(buf), _TRUNCATE, form, argptr); if(size == -1) { - size = 2048; + size = _countof(buf) - 1; // characters written, excluding the terminating null } return Output::PrintBuffer(buf, size); } +// +// buf: a null terminated string +// size: characters in buf, excluding the terminating null ==> wcslen(buf) +// size_t __cdecl Output::PrintBuffer(const char16 * buf, size_t size) { @@ -305,6 +311,7 @@ Output::PrintBuffer(const char16 * buf, size_t size) { if (s_file == nullptr || Output::s_capture) { +#ifdef _WIN32 bool addToBuffer = true; if (Output::bufferFreeSize < size + 1) { @@ -349,9 +356,13 @@ Output::PrintBuffer(const char16 * buf, size_t size) { Assert(Output::bufferFreeSize >= size + 1); memcpy_s(Output::buffer + Output::bufferAllocSize - Output::bufferFreeSize, Output::bufferFreeSize * sizeof(char16), - buf, (size + 1) * sizeof(char16)); + buf, size * sizeof(char16)); bufferFreeSize -= size; + Output::buffer[Output::bufferAllocSize - Output::bufferFreeSize] = _u('\0'); // null terminate explicitly } +#else + DirectPrint(buf); +#endif } else { @@ -375,11 +386,13 @@ void Output::Flush() { return; } +#ifdef _WIN32 if (bufferFreeSize != bufferAllocSize) { DirectPrint(Output::buffer); bufferFreeSize = bufferAllocSize; } +#endif if(s_outputFile != nullptr) { fflush(s_outputFile); @@ -540,9 +553,14 @@ Output::CaptureEnd() { Assert(s_capture); s_capture = false; +#ifdef _WIN32 bufferFreeSize = 0; bufferAllocSize = 0; char16 * returnBuffer = buffer; buffer = nullptr; +#else + char16 * returnBuffer = nullptr; +#endif + return returnBuffer; } diff --git a/deps/chakrashim/core/lib/Common/Core/Output.h b/deps/chakrashim/core/lib/Common/Core/Output.h index 15a89105ffc..1af3fbeed4d 100644 --- a/deps/chakrashim/core/lib/Common/Core/Output.h +++ b/deps/chakrashim/core/lib/Common/Core/Output.h @@ -136,9 +136,11 @@ class Output THREAD_ST static bool s_capture; THREAD_ST static FILE * s_file; +#ifdef _WIN32 THREAD_ST static char16 * buffer; THREAD_ST static size_t bufferFreeSize; THREAD_ST static size_t bufferAllocSize; +#endif THREAD_ST static size_t s_Column; THREAD_ST static WORD s_color; THREAD_ST static bool s_hasColor; diff --git a/deps/chakrashim/core/lib/Common/Core/PerfCounterSet.h b/deps/chakrashim/core/lib/Common/Core/PerfCounterSet.h index 64c8123a20a..cc24e961325 100644 --- a/deps/chakrashim/core/lib/Common/Core/PerfCounterSet.h +++ b/deps/chakrashim/core/lib/Common/Core/PerfCounterSet.h @@ -55,7 +55,7 @@ namespace PerfCounter if (IsProviderInitialized()) { char16 wszModuleName[_MAX_PATH]; - if (!GetModuleFileName(NULL, wszModuleName, _MAX_PATH)) + if (!PlatformAgnostic::SystemInfo::GetBinaryLocation(wszModuleName, _MAX_PATH)) { return false; } diff --git a/deps/chakrashim/core/lib/Common/Core/ProfileMemory.h b/deps/chakrashim/core/lib/Common/Core/ProfileMemory.h index bcd6fbf2968..e064765d15b 100644 --- a/deps/chakrashim/core/lib/Common/Core/ProfileMemory.h +++ b/deps/chakrashim/core/lib/Common/Core/ProfileMemory.h @@ -98,7 +98,7 @@ class MemoryProfiler } private: - int MemoryProfiler::CreateArenaUsageSummary(ArenaAllocator * alloc, bool liveOnly, + int CreateArenaUsageSummary(ArenaAllocator * alloc, bool liveOnly, _Outptr_result_buffer_(return) LPWSTR ** name_ptr, _Outptr_result_buffer_(return) ArenaMemoryDataSummary *** summaries_ptr); template diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/EventTrace.h b/deps/chakrashim/core/lib/Common/Core/RecyclerHeapMarkingContext.h similarity index 70% rename from deps/chakrashim/core/lib/Runtime/PlatformAgnostic/EventTrace.h rename to deps/chakrashim/core/lib/Common/Core/RecyclerHeapMarkingContext.h index 4543c1103cc..719cff179bb 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/EventTrace.h +++ b/deps/chakrashim/core/lib/Common/Core/RecyclerHeapMarkingContext.h @@ -4,12 +4,8 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#include "Core/CommonTypedefs.h" - -namespace PlatformAgnostic +interface IRecyclerHeapMarkingContext { - namespace EventTrace - { - void FireGenericEventTrace(const void* traceData); - } -} \ No newline at end of file + virtual void MarkObjects(void** objects, size_t count, void* parent) = 0; +}; + diff --git a/deps/chakrashim/core/lib/Common/Core/RecyclerVisitedObject.h b/deps/chakrashim/core/lib/Common/Core/RecyclerVisitedObject.h new file mode 100644 index 00000000000..ca1c50e1d75 --- /dev/null +++ b/deps/chakrashim/core/lib/Common/Core/RecyclerVisitedObject.h @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +interface IRecyclerHeapMarkingContext; +typedef void* RecyclerHeapHandle; + +interface IRecyclerVisitedObject +{ + // Called right after finish marking and this object is determined to be dead. + // Should contain only simple clean up code. + // Can't run another script + // Can't cause a re-entrant collection + virtual void Finalize(bool isShutdown) = 0; + + // Call after sweeping is done. + // Can call other script or cause another collection. + virtual void Dispose(bool isShutdown) = 0; + + // Used only by TrackableObjects (created with TrackedBit on by RecyclerNew*Tracked) + virtual void Mark(RecyclerHeapHandle recycler) = 0; + + // Special behavior on certain GC's + virtual void OnMark() = 0; + + // Used only by RecyclerVisitedHost objects (created with RecyclerAllocVistedHost_Traced*) + virtual void Trace(IRecyclerHeapMarkingContext* markingContext) = 0; +}; + diff --git a/deps/chakrashim/core/lib/Common/Core/SysInfo.cpp b/deps/chakrashim/core/lib/Common/Core/SysInfo.cpp index d6a31e636b3..188be21c99b 100644 --- a/deps/chakrashim/core/lib/Common/Core/SysInfo.cpp +++ b/deps/chakrashim/core/lib/Common/Core/SysInfo.cpp @@ -384,7 +384,11 @@ AutoSystemInfo::IsWin8OrLater() bool AutoSystemInfo::IsWinThresholdOrLater() { +#if defined(_M_ARM64) + return true; +#else return IsWindowsThresholdOrGreater(); +#endif } #endif diff --git a/deps/chakrashim/core/lib/Common/DataStructures/BaseDictionary.h b/deps/chakrashim/core/lib/Common/DataStructures/BaseDictionary.h index 5d57c78854a..4840310d888 100644 --- a/deps/chakrashim/core/lib/Common/DataStructures/BaseDictionary.h +++ b/deps/chakrashim/core/lib/Common/DataStructures/BaseDictionary.h @@ -1163,14 +1163,14 @@ namespace JsUtil public: void Dump() { - printf("Dumping Dictionary\n"); - printf("-------------------\n"); + Output::Print(_u("Dumping Dictionary\n")); + Output::Print(_u("-------------------\n")); for (uint i = 0; i < bucketCount; i++) { - printf("Bucket value: %d\n", buckets[i]); + Output::Print(_u("Bucket value: %d\n"), buckets[i]); for (int j = buckets[i]; j >= 0; j = entries[j].next) { - printf("%d => %d Next: %d\n", entries[j].Key(), entries[j].Value(), entries[j].next); + Output::Print(_u("%d => %d Next: %d\n"), entries[j].Key(), entries[j].Value(), entries[j].next); } } } diff --git a/deps/chakrashim/core/lib/Common/DataStructures/BufferBuilder.h b/deps/chakrashim/core/lib/Common/DataStructures/BufferBuilder.h index 43ddf47fa7c..a16fa88a394 100644 --- a/deps/chakrashim/core/lib/Common/DataStructures/BufferBuilder.h +++ b/deps/chakrashim/core/lib/Common/DataStructures/BufferBuilder.h @@ -134,7 +134,7 @@ namespace Js { if (UseOneByte()) { - if (bufferSize - this->offsetoffset < sizeof(serialization_alignment byte)) { Throw::FatalInternalError(); } @@ -143,7 +143,7 @@ namespace Js } else if (UseTwoBytes()) { - if (bufferSize - this->offsetoffset < sizeof(serialization_alignment uint16) + sizeof(serialization_alignment byte)) { Throw::FatalInternalError(); } @@ -153,7 +153,7 @@ namespace Js } else { - if (bufferSize - this->offsetoffset < sizeof(serialization_alignment T) + sizeof(serialization_alignment byte)) { Throw::FatalInternalError(); } @@ -161,7 +161,7 @@ namespace Js *(serialization_alignment T*)(buffer + this->offset + SENTINEL_BYTE_COUNT) = this->value; DebugOnly(size = sizeof(T) + 1); #if INSTRUMENT_BUFFER_INTS - printf("[BCGENSTATS] %d, %d\n", value, sizeof(T)); + Output::Print(_u("[BCGENSTATS] %d, %d\n"), value, sizeof(T)); #endif } } diff --git a/deps/chakrashim/core/lib/Common/DataStructures/Chakra.Common.DataStructures.vcxproj b/deps/chakrashim/core/lib/Common/DataStructures/Chakra.Common.DataStructures.vcxproj index 8e9642c6571..75fb1174408 100644 --- a/deps/chakrashim/core/lib/Common/DataStructures/Chakra.Common.DataStructures.vcxproj +++ b/deps/chakrashim/core/lib/Common/DataStructures/Chakra.Common.DataStructures.vcxproj @@ -60,7 +60,6 @@ - diff --git a/deps/chakrashim/core/lib/Common/DataStructures/FixedBitVector.h b/deps/chakrashim/core/lib/Common/DataStructures/FixedBitVector.h index 4f356a5ec1f..6b803f37605 100644 --- a/deps/chakrashim/core/lib/Common/DataStructures/FixedBitVector.h +++ b/deps/chakrashim/core/lib/Common/DataStructures/FixedBitVector.h @@ -226,8 +226,9 @@ Container BVFixed::GetRange(BVIndex start, BVIndex len) const return Container(range); } +// the NO_SANITIZE_ADDRESS_CHECK ifdef is to work around a bug in some VC versions template -#ifdef NO_SANITIZE_ADDRESS_FIXVC +#ifdef NO_SANITIZE_ADDRESS_CHECK NO_SANITIZE_ADDRESS #endif void BVFixed::SetRange(Container* value, BVIndex start, BVIndex len) diff --git a/deps/chakrashim/core/lib/Common/DataStructures/LineOffsetCache.h b/deps/chakrashim/core/lib/Common/DataStructures/LineOffsetCache.h deleted file mode 100644 index c471467e0d1..00000000000 --- a/deps/chakrashim/core/lib/Common/DataStructures/LineOffsetCache.h +++ /dev/null @@ -1,269 +0,0 @@ -//------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -//------------------------------------------------------------------------------------------------------- -#pragma once - -namespace JsUtil -{ - template - class LineOffsetCache - { - public: - // Stores line offset information for a line in the source info. The index of this - // item in the LineOffsetCacheList determines which line it is. - struct LineOffsetCacheItem - { - // The character offset of where the line begins starting from the start of the source info. - charcount_t characterOffset; - - // The byte offset of where the line begins starting from the start of the source info's character buffer (UTF8). - charcount_t byteOffset; - }; - private: - typedef List LineOffsetCacheList; - typedef ReadOnlyList LineOffsetCacheReadOnlyList; - - public: - - static int FindLineForCharacterOffset( - _In_z_ LPCUTF8 sourceStartCharacter, - _In_z_ LPCUTF8 sourceEndCharacter, - charcount_t &inOutLineCharOffset, - charcount_t &inOutByteOffset, - charcount_t characterOffset) - { - int lastLine = 0; - - while (FindNextLine(sourceStartCharacter, sourceEndCharacter, inOutLineCharOffset, inOutByteOffset, characterOffset)) - { - lastLine++; - } - - return lastLine; - } - - LineOffsetCache(TAllocator* allocator, - _In_z_ LPCUTF8 sourceStartCharacter, - _In_z_ LPCUTF8 sourceEndCharacter, - charcount_t startingCharacterOffset = 0, - charcount_t startingByteOffset = 0) : - allocator(allocator), - isCacheBuilt(false) - { - AssertMsg(allocator, "An allocator must be supplied to the cache for allocation of items."); - LineOffsetCacheList *list = AllocatorNew(TAllocator, allocator, LineOffsetCacheList, allocator); - this->lineOffsetCacheList = list; - this->BuildCache(list, sourceStartCharacter, sourceEndCharacter, startingCharacterOffset, startingByteOffset); - } - - LineOffsetCache(TAllocator *allocator, - _In_reads_(numberOfLines) const LineOffsetCacheItem *lines, - __in int numberOfLines) : - allocator(allocator), - isCacheBuilt(false) - { - this->lineOffsetCacheList = LineOffsetCacheReadOnlyList::New(allocator, (LineOffsetCacheItem *)lines, numberOfLines); - } - - ~LineOffsetCache() - { - if (this->lineOffsetCacheList != nullptr) - { - this->lineOffsetCacheList->Delete(); - } - } - - // outLineCharOffset - The character offset of the start of the line returned - int GetLineForCharacterOffset(charcount_t characterOffset, charcount_t *outLineCharOffset, charcount_t *outByteOffset) - { - Assert(this->lineOffsetCacheList->Count() > 0); - - // The list is sorted, so binary search to find the line info. - int closestIndex = -1; - int minRange = INT_MAX; - - this->lineOffsetCacheList->BinarySearch([&](const LineOffsetCacheItem& item, int index) - { - int offsetRange = characterOffset - item.characterOffset; - if (offsetRange >= 0) - { - if (offsetRange < minRange) - { - // There are potentially many lines with starting offsets greater than the one we're searching - // for. As a result, we should track which index we've encountered so far that is the closest - // to the offset we're looking for without going under. This will find the line that contains - // the offset. - closestIndex = index; - minRange = offsetRange; - } - - // Search lower to see if we can find a closer index. - return -1; - } - else - { - // Search higher to get into a range that is greater than the offset. - return 1; - } - - // Note that we purposely don't return 0 (==) here. We want the search to end in failure (-1) because - // we're searching for the closest element, not necessarily an exact element offset. Exact offsets - // are possible when the offset we're searching for is the first character of the line, but that will - // be handled by the if statement above. - }); - - if (closestIndex >= 0) - { - LineOffsetCacheItem lastItem = this->lineOffsetCacheList->Item(closestIndex); - - if (outLineCharOffset != nullptr) - { - *outLineCharOffset = lastItem.characterOffset; - } - - if (outByteOffset != nullptr) - { - *outByteOffset = lastItem.byteOffset; - } - } - - return closestIndex; - } - - charcount_t GetCharacterOffsetForLine(charcount_t line, charcount_t *outByteOffset) const - { - AssertMsg(line < this->GetLineCount(), "Invalid line value passed in."); - - LineOffsetCacheItem item = this->lineOffsetCacheList->Item(line); - - if (outByteOffset != nullptr) - { - *outByteOffset = item.byteOffset; - } - - return item.characterOffset; - } - - uint32 GetLineCount() const - { - AssertMsg(this->lineOffsetCacheList != nullptr, "The list was either not set from the ByteCode or not created."); - return this->lineOffsetCacheList->Count(); - } - - const LineOffsetCacheItem* GetItems() - { - return this->lineOffsetCacheList->GetBuffer(); - } - - private: - - static bool FindNextLine(_In_z_ LPCUTF8 ¤tSourcePosition, _In_z_ LPCUTF8 sourceEndCharacter, charcount_t &inOutCharacterOffset, charcount_t &inOutByteOffset, charcount_t maxCharacterOffset = UINT32_MAX) - { - charcount_t currentCharacterOffset = inOutCharacterOffset; - charcount_t currentByteOffset = inOutByteOffset; - utf8::DecodeOptions options = utf8::doAllowThreeByteSurrogates; - - while (currentSourcePosition < sourceEndCharacter) - { - LPCUTF8 previousCharacter = currentSourcePosition; - - // Decode from UTF8 to wide char. Note that Decode will advance the current character by 1 at least. - char16 decodedCharacter = utf8::Decode(currentSourcePosition, sourceEndCharacter, options); - - bool wasLineEncountered = false; - switch (decodedCharacter) - { - case _u('\r'): - // Check if the next character is a '\n'. If so, consume that character as well - // (consider as one line). - if (*currentSourcePosition == '\n') - { - ++currentSourcePosition; - ++currentCharacterOffset; - } - - // Intentional fall-through. - case _u('\n'): - case 0x2028: - case 0x2029: - // Found a new line. - wasLineEncountered = true; - break; - } - - // Move to the next character offset. - ++currentCharacterOffset; - - // Count the current byte offset we're at in the UTF-8 buffer. - // The character size can be > 1 for unicode characters. - currentByteOffset += static_cast(currentSourcePosition - previousCharacter); - - if (wasLineEncountered) - { - inOutCharacterOffset = currentCharacterOffset; - inOutByteOffset = currentByteOffset; - return true; - } - else if (currentCharacterOffset >= maxCharacterOffset) - { - return false; - } - } - - return false; - } - - // Builds the cache of line offsets from the passed in source. - void BuildCache(_In_ LineOffsetCacheList *list, _In_z_ LPCUTF8 sourceStartCharacter, - _In_z_ LPCUTF8 sourceEndCharacter, - charcount_t startingCharacterOffset = 0, - charcount_t startingByteOffset = 0) - { - AssertMsg(sourceStartCharacter, "The source start character passed in is null."); - AssertMsg(sourceEndCharacter, "The source end character passed in is null."); - AssertMsg(sourceStartCharacter <= sourceEndCharacter, "The source start character should not be beyond the source end character."); - AssertMsg(!this->isCacheBuilt, "The cache is already built."); - - // Add the first line in the cache list. - this->AddLine(list, startingCharacterOffset, startingByteOffset); - - while (FindNextLine(sourceStartCharacter, sourceEndCharacter, startingCharacterOffset, startingByteOffset)) - { - this->AddLine(list, startingCharacterOffset, startingByteOffset); - } - - isCacheBuilt = true; - } - - // Tracks a new line offset in the cache. - void AddLine(_In_ LineOffsetCacheList *list, int characterOffset, int byteOffset) - { - AssertMsg(characterOffset >= 0, "The character offset is invalid."); - AssertMsg(byteOffset >= 0, "The byte offset is invalid."); - - LineOffsetCacheItem item; - item.characterOffset = characterOffset; - item.byteOffset = byteOffset; - - list->Add(item); - -#if DBG - if (list->Count() > 1) - { - // Ensure that the list remains sorted during insertion. - LineOffsetCacheItem previousItem = list->Item(list->Count() - 2); - AssertMsg(item.characterOffset > previousItem.characterOffset, "The character offsets must be inserted in increasing order per line."); - AssertMsg(item.byteOffset > previousItem.byteOffset, "The byte offsets must be inserted in increasing order per line."); - } -#endif // DBG - } - - private: - FieldNoBarrier(TAllocator*) allocator; - - // Line offset cache list used for quickly finding line/column offsets. - Field(LineOffsetCacheReadOnlyList*) lineOffsetCacheList; - Field(bool) isCacheBuilt; - }; -} diff --git a/deps/chakrashim/core/lib/Common/DataStructures/List.h b/deps/chakrashim/core/lib/Common/DataStructures/List.h index 2d348bdf8c1..40b4b385348 100644 --- a/deps/chakrashim/core/lib/Common/DataStructures/List.h +++ b/deps/chakrashim/core/lib/Common/DataStructures/List.h @@ -399,7 +399,7 @@ namespace JsUtil return pos; } - int32 AddRange(__readonly _In_reads_(count) const T* items, int32 count) + int32 AddRange(__readonly _In_reads_(count) T const * items, int32 count) { Assert(items != nullptr); Assert(count > 0); diff --git a/deps/chakrashim/core/lib/Common/DataStructures/PageStack.h b/deps/chakrashim/core/lib/Common/DataStructures/PageStack.h index 4da2a17274f..d52347ad9e1 100644 --- a/deps/chakrashim/core/lib/Common/DataStructures/PageStack.h +++ b/deps/chakrashim/core/lib/Common/DataStructures/PageStack.h @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- template @@ -96,6 +96,9 @@ bool PageStack::Pop(T * item) Assert(nextEntry > chunkStart && nextEntry <= chunkEnd); nextEntry--; +#if defined(_M_IX86) || defined(_M_X64) + _mm_prefetch((char*) (nextEntry - 1), _MM_HINT_T0); +#endif *item = *nextEntry; #if DBG diff --git a/deps/chakrashim/core/lib/Common/DataStructures/SparseBitVector.h b/deps/chakrashim/core/lib/Common/DataStructures/SparseBitVector.h index 322ef9708c7..134ddff4150 100644 --- a/deps/chakrashim/core/lib/Common/DataStructures/SparseBitVector.h +++ b/deps/chakrashim/core/lib/Common/DataStructures/SparseBitVector.h @@ -205,7 +205,7 @@ BVSparseNode::BVSparseNode(BVIndex beginIndex, BVSparseNode constexpr LONG BVUnitT_GetShiftValue(); + +template<> constexpr LONG BVUnitT_GetShiftValue() { return 5; } + +template<> constexpr LONG BVUnitT_GetShiftValue() { return 6; } + +} + template class BVUnitT { @@ -222,9 +233,9 @@ class BVUnitT AllOnesMask = -1 }; - //ShiftValue is essentially log(sizeof(T)) - //Initialization is through template specialization - static const LONG ShiftValue; + enum : LONG { + ShiftValue = BVUnitT_GetShiftValue() + }; static BVIndex Position(BVIndex index) { @@ -488,10 +499,7 @@ class BVUnitT typedef BVUnitT BVUnit32; typedef BVUnitT BVUnit64; -template<> const __declspec(selectany) LONG BVUnitT::ShiftValue = 5; -template<> const __declspec(selectany) LONG BVUnitT::ShiftValue = 6; - -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) typedef BVUnit64 BVUnit; #else typedef BVUnit32 BVUnit; diff --git a/deps/chakrashim/core/lib/Common/Exceptions/ReportError.cpp b/deps/chakrashim/core/lib/Common/Exceptions/ReportError.cpp index d92e6334a8e..c1a58d0ea76 100644 --- a/deps/chakrashim/core/lib/Common/Exceptions/ReportError.cpp +++ b/deps/chakrashim/core/lib/Common/Exceptions/ReportError.cpp @@ -73,7 +73,7 @@ _NOINLINE void FailedToBox_OOM_fatal_error( ReportFatalException(context, E_UNEXPECTED, Fatal_FailedToBox_OUTOFMEMORY, scenario); } -#if defined(RECYCLER_WRITE_BARRIER) && defined(_M_X64_OR_ARM64) +#if defined(RECYCLER_WRITE_BARRIER) && defined(TARGET_64) _NOINLINE void X64WriteBarrier_OOM_fatal_error() { int scenario = 3; @@ -108,6 +108,7 @@ _NOINLINE void LargeHeapBlock_Metadata_Corrupted( }; #endif +// If you see this error, it is because of a DOM bug. Assign to daniec or jdweiner. _NOINLINE void FromDOM_NoScriptScope_fatal_error() { int scenario = 5; diff --git a/deps/chakrashim/core/lib/Common/Exceptions/ReportError.h b/deps/chakrashim/core/lib/Common/Exceptions/ReportError.h index d6aea1b59a6..34fed7365e4 100644 --- a/deps/chakrashim/core/lib/Common/Exceptions/ReportError.h +++ b/deps/chakrashim/core/lib/Common/Exceptions/ReportError.h @@ -27,7 +27,8 @@ enum ErrorReason Fatal_JsReentrancy_Error = 19, Fatal_TTDAbort = 20, Fatal_Failed_API_Result = 21, - Fatal_OutOfMemory = 22 + Fatal_OutOfMemory = 22, + Fatal_RecyclerVisitedHost_LargeHeapBlock = 23, }; extern "C" void ReportFatalException( @@ -50,7 +51,7 @@ void Amd64StackWalkerOutOfContexts_fatal_error( void FailedToBox_OOM_fatal_error( __in ULONG_PTR context); -#if defined(RECYCLER_WRITE_BARRIER) && defined(_M_X64_OR_ARM64) +#if defined(RECYCLER_WRITE_BARRIER) && defined(TARGET_64) void X64WriteBarrier_OOM_fatal_error(); #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/ArenaAllocator.cpp b/deps/chakrashim/core/lib/Common/Memory/ArenaAllocator.cpp index 017165a05dd..29d14bb31de 100644 --- a/deps/chakrashim/core/lib/Common/Memory/ArenaAllocator.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/ArenaAllocator.cpp @@ -460,7 +460,7 @@ ReleaseHeapMemory() template _ALWAYSINLINE char *ArenaAllocatorBase::AllocInternal(size_t requestedBytes); -#if !(defined(__clang__) && defined(_M_IX86_OR_ARM32)) +#if !(defined(__clang__) && defined(TARGET_32)) // otherwise duplicate instantination of AllocInternal Error template _ALWAYSINLINE char *ArenaAllocatorBase::AllocInternal(size_t requestedBytes); #endif @@ -588,9 +588,10 @@ Free(void * buffer, size_t byteSize) void **policy = &this->freeList; #if DBG + void *delayFreeList; if (needsDelayFreeList) { - void *delayFreeList = reinterpret_cast(this->freeList) + (MaxSmallObjectSize >> ObjectAlignmentBitShift); + delayFreeList = reinterpret_cast(this->freeList) + (MaxSmallObjectSize >> ObjectAlignmentBitShift); policy = &delayFreeList; } #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/ArenaAllocator.h b/deps/chakrashim/core/lib/Common/Memory/ArenaAllocator.h index 522206b760a..58e95475716 100644 --- a/deps/chakrashim/core/lib/Common/Memory/ArenaAllocator.h +++ b/deps/chakrashim/core/lib/Common/Memory/ArenaAllocator.h @@ -136,7 +136,7 @@ class ArenaData // Implements most of memory management operations over ArenaData. // The TFreeListPolicy handles free-listing for "small objects". There // is no support for free-listing for "large objects". -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) // Some data structures such as jmp_buf expect to be 16 byte aligned on AMD64. template #else @@ -600,7 +600,7 @@ class InlineCacheAllocatorInfo CompileAssert(sizeof(CacheLayout) == sizeof(FreeObject)); CompileAssert(offsetof(CacheLayout, strongRef) == offsetof(FreeObject, next)); -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) CompileAssert(sizeof(CacheLayout) == 32); static const size_t ObjectAlignmentBitShift = 5; #else @@ -879,7 +879,7 @@ class RefCounted if (0 == refs) { - delete this; // invokes overrided operator delete + delete this; // invokes overridden operator delete } return refs; diff --git a/deps/chakrashim/core/lib/Common/Memory/CMakeLists.txt b/deps/chakrashim/core/lib/Common/Memory/CMakeLists.txt index 74e67051796..9c9e717709a 100644 --- a/deps/chakrashim/core/lib/Common/Memory/CMakeLists.txt +++ b/deps/chakrashim/core/lib/Common/Memory/CMakeLists.txt @@ -3,6 +3,7 @@ set (CCM_SOURCE_FILES ${CCM_SOURCE_FILES} ArenaAllocator.cpp CustomHeap.cpp CommonMemoryPch.cpp + DelayDeletingFunctionTable.cpp EtwMemoryTracking.cpp ForcedMemoryConstraints.cpp HeapAllocator.cpp diff --git a/deps/chakrashim/core/lib/Common/Memory/Chakra.Common.Memory.vcxproj b/deps/chakrashim/core/lib/Common/Memory/Chakra.Common.Memory.vcxproj index 10d784e80a0..615fa69012b 100644 --- a/deps/chakrashim/core/lib/Common/Memory/Chakra.Common.Memory.vcxproj +++ b/deps/chakrashim/core/lib/Common/Memory/Chakra.Common.Memory.vcxproj @@ -90,6 +90,7 @@ Create + @@ -157,6 +158,7 @@ true + @@ -185,4 +187,4 @@ - + \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Common/Memory/Chakra.Common.Memory.vcxproj.filters b/deps/chakrashim/core/lib/Common/Memory/Chakra.Common.Memory.vcxproj.filters index 49463fa1a17..d8e2509ac1e 100644 --- a/deps/chakrashim/core/lib/Common/Memory/Chakra.Common.Memory.vcxproj.filters +++ b/deps/chakrashim/core/lib/Common/Memory/Chakra.Common.Memory.vcxproj.filters @@ -54,7 +54,8 @@ arm64 - + + @@ -119,6 +120,7 @@ + diff --git a/deps/chakrashim/core/lib/Common/Memory/CollectionState.h b/deps/chakrashim/core/lib/Common/Memory/CollectionState.h index a1733e2cdcf..3cd04d21c3a 100644 --- a/deps/chakrashim/core/lib/Common/Memory/CollectionState.h +++ b/deps/chakrashim/core/lib/Common/Memory/CollectionState.h @@ -39,6 +39,18 @@ enum CollectionState Collection_PostSweepRedeferralCallback = 0x00040000, Collection_WrapperCallback = 0x00080000, +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // Please look at the documentation for PrepareForAllocationsDuringConcurrentSweep method for details on how the concurrent + // sweep progresses when allocations are allowed during sweep. + /* In Pass1 of the concurrent sweep we determine if a block is full or empty or needs to be swept. Leaf blocks will get + swept immediately where as non-leaf blocks may get put onto the pendingSweepList. */ + Collection_ConcurrentSweepPass1 = 0x00100000, + Collection_ConcurrentSweepPass1Wait = 0x00200000, + /* In Pass2, all blocks will go through SweepPartialReusePages to determine if the page can be reused. Also, any blocks + that were put in the pendingSweepList will be swept during this stage. */ + Collection_ConcurrentSweepPass2 = 0x00400000, + Collection_ConcurrentSweepPass2Wait = 0x00800000, +#endif // Actual states CollectionStateNotCollecting = 0, // not collecting @@ -63,6 +75,12 @@ enum CollectionState CollectionStateSetupConcurrentSweep = Collection_Sweep | Collection_ConcurrentSweepSetup, // setting up concurrent sweep CollectionStateConcurrentSweep = Collection_ConcurrentSweep | Collection_ExecutingConcurrent, // concurrent sweep +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + CollectionStateConcurrentSweepPass1 = Collection_ConcurrentSweep | Collection_ConcurrentSweepPass1 | Collection_ExecutingConcurrent, // concurrent sweep Pass 1 + CollectionStateConcurrentSweepPass1Wait = Collection_ConcurrentSweep | Collection_ConcurrentSweepPass1Wait, // concurrent sweep wait state after Pass 1 has finished + CollectionStateConcurrentSweepPass2 = Collection_ConcurrentSweep | Collection_ConcurrentSweepPass2 | Collection_ExecutingConcurrent, // concurrent sweep Pass 2 + CollectionStateConcurrentSweepPass2Wait = Collection_ConcurrentSweep | Collection_ConcurrentSweepPass2Wait, // concurrent sweep wait state after Pass 2 has finished +#endif CollectionStateTransferSweptWait = Collection_ConcurrentSweep | Collection_FinishConcurrent, // transfer swept objects (after concurrent sweep) #endif CollectionStateParallelMark = Collection_Mark | Collection_Parallel, diff --git a/deps/chakrashim/core/lib/Common/Memory/CommonMemoryPch.h b/deps/chakrashim/core/lib/Common/Memory/CommonMemoryPch.h index 3addf8e7f28..2825b6eb945 100644 --- a/deps/chakrashim/core/lib/Common/Memory/CommonMemoryPch.h +++ b/deps/chakrashim/core/lib/Common/Memory/CommonMemoryPch.h @@ -8,6 +8,7 @@ typedef _Return_type_success_(return >= 0) LONG NTSTATUS; #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) +#define MAKE_HR(errnum) (MAKE_HRESULT(SEVERITY_ERROR, FACILITY_CONTROL, errnum)) // === C Runtime Header Files === #include @@ -55,9 +56,9 @@ typedef _Return_type_success_(return >= 0) LONG NTSTATUS; #ifdef _CONTROL_FLOW_GUARD #define PAGE_EXECUTE_RW_TARGETS_INVALID (PAGE_EXECUTE_READWRITE | PAGE_TARGETS_INVALID) #define PAGE_EXECUTE_RW_TARGETS_NO_UPDATE (PAGE_EXECUTE_READWRITE | PAGE_TARGETS_NO_UPDATE) -#define PAGE_EXECUTE_RO_TARGETS_NO_UPDATE (PAGE_EXECUTE | PAGE_TARGETS_NO_UPDATE) +#define PAGE_EXECUTE_RO_TARGETS_NO_UPDATE (PAGE_EXECUTE_READ | PAGE_TARGETS_NO_UPDATE) #else #define PAGE_EXECUTE_RW_TARGETS_INVALID (PAGE_EXECUTE_READWRITE) #define PAGE_EXECUTE_RW_TARGETS_NO_UPDATE (PAGE_EXECUTE_READWRITE) -#define PAGE_EXECUTE_RO_TARGETS_NO_UPDATE (PAGE_EXECUTE) +#define PAGE_EXECUTE_RO_TARGETS_NO_UPDATE (PAGE_EXECUTE_READ) #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/CustomHeap.cpp b/deps/chakrashim/core/lib/Common/Memory/CustomHeap.cpp index b775ed690de..ece38c02e60 100644 --- a/deps/chakrashim/core/lib/Common/Memory/CustomHeap.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/CustomHeap.cpp @@ -3,16 +3,17 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "CommonMemoryPch.h" -#ifdef _M_X64 -#include "Memory/amd64/XDataAllocator.h" -#elif defined(_M_ARM) -#include "Memory/arm/XDataAllocator.h" +#include "Memory/XDataAllocator.h" +#if defined(_M_ARM) #include -#elif defined(_M_ARM64) -#include "Memory/arm64/XDataAllocator.h" #endif #include "CustomHeap.h" +#if PDATA_ENABLED && defined(_WIN32) +#include "Core/DelayLoadLibrary.h" +#include +#endif + namespace Memory { namespace CustomHeap @@ -115,7 +116,7 @@ void Heap::DecommitAll() DListBase::EditingIterator i(&this->largeObjectAllocations); while (i.Next()) - { + { Allocation& allocation = i.Data(); Assert(!allocation.largeObjectAllocation.isDecommitted); @@ -267,7 +268,7 @@ Allocation* Heap::Alloc(size_t bytes, ushort pdataCou } else { - Assert(memBasicInfo.Protect == PAGE_EXECUTE); + Assert(memBasicInfo.Protect == PAGE_EXECUTE_READ); } #endif @@ -292,11 +293,11 @@ BOOL Heap::ProtectAllocationWithExecuteReadWrite(Allo { protectFlags = PAGE_EXECUTE_READWRITE; } - return this->ProtectAllocation(allocation, protectFlags, PAGE_EXECUTE, addressInPage); + return this->ProtectAllocation(allocation, protectFlags, PAGE_EXECUTE_READ, addressInPage); } template -BOOL Heap::ProtectAllocationWithExecuteReadOnly(Allocation *allocation, __in_opt char* addressInPage) +BOOL Heap::ProtectAllocationWithExecuteReadOnly(__in Allocation *allocation, __in_opt char* addressInPage) { DWORD protectFlags = 0; if (AutoSystemInfo::Data.IsCFGEnabled()) @@ -305,7 +306,7 @@ BOOL Heap::ProtectAllocationWithExecuteReadOnly(Alloc } else { - protectFlags = PAGE_EXECUTE; + protectFlags = PAGE_EXECUTE_READ; } return this->ProtectAllocation(allocation, protectFlags, PAGE_EXECUTE_READWRITE, addressInPage); } @@ -419,7 +420,7 @@ Allocation* Heap::AllocLargeObject(size_t bytes, usho } else { - protectFlags = PAGE_EXECUTE; + protectFlags = PAGE_EXECUTE_READ; } this->codePageAllocators->ProtectPages(address, pages, segment, protectFlags /*dwVirtualProtectFlags*/, PAGE_READWRITE /*desiredOldProtectFlags*/); } @@ -444,7 +445,7 @@ Allocation* Heap::AllocLargeObject(size_t bytes, usho } else { - Assert(memBasicInfo.Protect == PAGE_EXECUTE); + Assert(memBasicInfo.Protect == PAGE_EXECUTE_READ); } #endif @@ -687,7 +688,7 @@ Page* Heap::AllocNewPage(BucketId bucket, bool canAll } else { - protectFlags = PAGE_EXECUTE; + protectFlags = PAGE_EXECUTE_READ; } //Change the protection of the page to Read-Only Execute, before adding it to the bucket list. @@ -819,7 +820,7 @@ bool Heap::FreeAllocation(Allocation* object) if (page->inFullList) { VerboseHeapTrace(_u("Recycling page 0x%p because address 0x%p of size %d was freed\n"), page->address, object->address, object->size); - + // If the object being freed is equal to the page size, we're // going to remove it anyway so don't add it to a bucket if (object->size != pageSize) @@ -842,7 +843,7 @@ bool Heap::FreeAllocation(Allocation* object) void* pageAddress = page->address; - this->fullPages[page->currentBucket].RemoveElement(this->auxiliaryAllocator, page); + this->fullPages[page->currentBucket].RemoveElement(this->auxiliaryAllocator, page); // The page is not in any bucket- just update the stats, free the allocation // and dump the page- we don't need to update free object size since the object @@ -877,7 +878,7 @@ bool Heap::FreeAllocation(Allocation* object) EnsureAllocationExecuteWriteable(object); FreeAllocationHelper(object, index, length); - // after freeing part of the page, the page should be in PAGE_EXECUTE_READWRITE protection, and turning to PAGE_EXECUTE (always with TARGETS_NO_UPDATE state) + // after freeing part of the page, the page should be in PAGE_EXECUTE_READWRITE protection, and turning to PAGE_EXECUTE_READ (always with TARGETS_NO_UPDATE state) DWORD protectFlags = 0; @@ -887,7 +888,7 @@ bool Heap::FreeAllocation(Allocation* object) } else { - protectFlags = PAGE_EXECUTE; + protectFlags = PAGE_EXECUTE_READ; } this->codePageAllocators->ProtectPages(page->address, 1, segment, protectFlags, PAGE_EXECUTE_READWRITE); @@ -1030,7 +1031,7 @@ bool Heap::UpdateFullPages() template void Heap::FreeXdata(XDataAllocation* xdata, void* segment) { - Assert(!xdata->IsFreed()); + Assert(!xdata->IsFreed()); { AutoCriticalSection autoLock(&this->codePageAllocators->cs); this->codePageAllocators->ReleaseSecondary(*xdata, segment); @@ -1052,17 +1053,17 @@ void Heap::DumpStats() HeapTrace(_u("Buckets: \n")); for (int i = 0; i < BucketId::NumBuckets; i++) { - printf("\t%d => %u [", (1 << (i + 7)), buckets[i].Count()); + Output::Print(_u("\t%d => %u ["), (1 << (i + 7)), buckets[i].Count()); FOREACH_DLISTBASE_ENTRY_EDITING(Page, page, &this->buckets[i], bucketIter) { BVUnit usedBitVector = page.freeBitVector; usedBitVector.ComplimentAll(); // Get the actual used bit vector - printf(" %u ", usedBitVector.Count() * Page::Alignment); // Print out the space used in this page + Output::Print(_u(" %u "), usedBitVector.Count() * Page::Alignment); // Print out the space used in this page } NEXT_DLISTBASE_ENTRY_EDITING - printf("] {{%u}}\n", this->fullPages[i].Count()); + Output::Print(_u("] {{%u}}\n"), this->fullPages[i].Count()); } } #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/CustomHeap.h b/deps/chakrashim/core/lib/Common/Memory/CustomHeap.h index 0260f352592..e3ccc8d6fd6 100644 --- a/deps/chakrashim/core/lib/Common/Memory/CustomHeap.h +++ b/deps/chakrashim/core/lib/Common/Memory/CustomHeap.h @@ -423,7 +423,7 @@ class Heap BOOL ProtectAllocation(__in Allocation* allocation, DWORD dwVirtualProtectFlags, DWORD desiredOldProtectFlag, __in_opt char* addressInPage = nullptr); BOOL ProtectAllocationWithExecuteReadWrite(Allocation *allocation, __in_opt char* addressInPage = nullptr); - BOOL ProtectAllocationWithExecuteReadOnly(Allocation *allocation, __in_opt char* addressInPage = nullptr); + BOOL ProtectAllocationWithExecuteReadOnly(__in Allocation *allocation, __in_opt char* addressInPage = nullptr); ~Heap(); @@ -482,8 +482,8 @@ class Heap DWORD EnsurePageReadWrite(Page* page) { Assert(!page->isDecommitted); - this->codePageAllocators->ProtectPages(page->address, 1, page->segment, readWriteFlags, PAGE_EXECUTE); - return PAGE_EXECUTE; + this->codePageAllocators->ProtectPages(page->address, 1, page->segment, readWriteFlags, PAGE_EXECUTE_READ); + return PAGE_EXECUTE_READ; } template @@ -492,8 +492,8 @@ class Heap { if (allocation->IsLargeAllocation()) { - this->ProtectAllocation(allocation, readWriteFlags, PAGE_EXECUTE); - return PAGE_EXECUTE; + this->ProtectAllocation(allocation, readWriteFlags, PAGE_EXECUTE_READ); + return PAGE_EXECUTE_READ; } else { diff --git a/deps/chakrashim/core/lib/Common/Memory/DelayDeletingFunctionTable.cpp b/deps/chakrashim/core/lib/Common/Memory/DelayDeletingFunctionTable.cpp new file mode 100644 index 00000000000..3ada0a27d9d --- /dev/null +++ b/deps/chakrashim/core/lib/Common/Memory/DelayDeletingFunctionTable.cpp @@ -0,0 +1,82 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "CommonMemoryPch.h" +#include "Memory/XDataAllocator.h" +#if PDATA_ENABLED && defined(_WIN32) +#include "Core/DelayLoadLibrary.h" +#include +#endif + +PSLIST_HEADER DelayDeletingFunctionTable::Head = nullptr; +DelayDeletingFunctionTable DelayDeletingFunctionTable::Instance; + +DelayDeletingFunctionTable::DelayDeletingFunctionTable() +{ +#if PDATA_ENABLED && defined(_WIN32) + Head = (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT); + if (Head) + { + InitializeSListHead(Head); + } +#endif +} +DelayDeletingFunctionTable::~DelayDeletingFunctionTable() +{ +#if PDATA_ENABLED && defined(_WIN32) + Clear(); + if (Head) + { + DebugOnly(SLIST_ENTRY* entry = InterlockedPopEntrySList(Head)); + Assert(entry == nullptr); + _aligned_free(Head); + Head = nullptr; + } +#endif +} + + +bool DelayDeletingFunctionTable::AddEntry(FunctionTableHandle ft) +{ +#if PDATA_ENABLED && defined(_WIN32) + if (Head) + { + FunctionTableNode* node = (FunctionTableNode*)_aligned_malloc(sizeof(FunctionTableNode), MEMORY_ALLOCATION_ALIGNMENT); + if (node) + { + node->functionTable = ft; + InterlockedPushEntrySList(Head, &(node->itemEntry)); + return true; + } + } +#endif + return false; +} + +void DelayDeletingFunctionTable::Clear() +{ +#if PDATA_ENABLED && defined(_WIN32) + if (Head) + { + SLIST_ENTRY* entry = InterlockedPopEntrySList(Head); + while (entry) + { + FunctionTableNode* list = (FunctionTableNode*)entry; + NtdllLibrary::Instance->DeleteGrowableFunctionTable(list->functionTable); + _aligned_free(entry); + entry = InterlockedPopEntrySList(Head); + } + } +#endif +} + +bool DelayDeletingFunctionTable::IsEmpty() +{ +#if PDATA_ENABLED && defined(_WIN32) + return QueryDepthSList(Head) == 0; +#else + return true; +#endif +} \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Common/Memory/ForcedMemoryConstraints.cpp b/deps/chakrashim/core/lib/Common/Memory/ForcedMemoryConstraints.cpp index 6e987a5c67e..fd03aaf206e 100644 --- a/deps/chakrashim/core/lib/Common/Memory/ForcedMemoryConstraints.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/ForcedMemoryConstraints.cpp @@ -20,7 +20,7 @@ ForcedMemoryConstraint::Apply() void ForcedMemoryConstraint::FragmentAddressSpace(size_t usableSize) { // AMD64 address space is too big -#if !defined(_M_X64_OR_ARM64) +#if !defined(TARGET_64) uint const allocationGranularity = 64 * 1024; // 64 KB Assert(allocationGranularity == AutoSystemInfo::Data.dwAllocationGranularity); uint64 const addressEnd = ((uint64)4) * 1024 * 1024 * 1024; diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapAllocator.h b/deps/chakrashim/core/lib/Common/Memory/HeapAllocator.h index d9b5d689b27..568dde48dbc 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapAllocator.h +++ b/deps/chakrashim/core/lib/Common/Memory/HeapAllocator.h @@ -93,6 +93,59 @@ struct HeapAllocatorData struct HeapAllocator { + template + struct AutoFree + { + private: + T * obj = nullptr; + public: + ~AutoFree() + { + HeapDelete(obj); + } + void Set(T* obj) + { + Assert(this->obj == nullptr); + this->obj = obj; + } + void Release() + { + this->obj = nullptr; + } + T* Get() const + { + return this->obj; + } + }; + + template + struct AutoFreeArray + { + private: + T* obj = nullptr; + size_t count = 0; + public: + ~AutoFreeArray() + { + HeapDeleteArray(count, obj); + } + void Set(__ecount(count) T* obj, size_t count) + { + Assert(this->obj == nullptr); + this->obj = obj; + this->count = count; + } + void Release() + { + this->obj = nullptr; + this->count = 0; + } + T* Get() const + { + return this->obj; + } + }; + static const bool FakeZeroLengthArray = false; char * Alloc(DECLSPEC_GUARD_OVERFLOW size_t byteSize) diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapBlock.cpp b/deps/chakrashim/core/lib/Common/Memory/HeapBlock.cpp index 551373f2c87..53f63ce8639 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapBlock.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/HeapBlock.cpp @@ -7,6 +7,95 @@ #include #endif + +#if ENABLE_MEM_STATS +MemStats::MemStats() + : objectByteCount(0), totalByteCount(0) +{} + +void MemStats::Reset() +{ + objectByteCount = 0; + totalByteCount = 0; +} + +size_t MemStats::FreeBytes() const +{ + return totalByteCount - objectByteCount; +} + +double MemStats::UsedRatio() const +{ + return (double)objectByteCount / totalByteCount; +} + +void MemStats::Aggregate(const MemStats& other) +{ + objectByteCount += other.objectByteCount; + totalByteCount += other.totalByteCount; +} + +#ifdef DUMP_FRAGMENTATION_STATS +HeapBucketStats::HeapBucketStats() + : totalBlockCount(0), objectCount(0), finalizeCount(0) +{} + +void HeapBucketStats::Reset() +{ + MemStats::Reset(); + totalBlockCount = 0; + objectCount = 0; + finalizeCount = 0; +} + +void HeapBucketStats::Dump() const +{ + Output::Print(_u("%5d %7d %7d %11lu %11lu %11lu %6.2f%%\n"), + totalBlockCount, objectCount, finalizeCount, + static_cast(objectByteCount), + static_cast(FreeBytes()), + static_cast(totalByteCount), + UsedRatio() * 100); +} +#endif + +void HeapBucketStats::PreAggregate() +{ + // When first enter Pre-Aggregate state, clear data and mark state. + if (!(totalByteCount & 1)) + { + Reset(); + totalByteCount |= 1; + } +} + +void HeapBucketStats::BeginAggregate() +{ + // If was Pre-Aggregate state, keep data and clear state + if (totalByteCount & 1) + { + totalByteCount &= ~1; + } + else + { + Reset(); + } +} + +void HeapBucketStats::Aggregate(const HeapBucketStats& other) +{ + MemStats::Aggregate(other); +#ifdef DUMP_FRAGMENTATION_STATS + totalBlockCount += other.totalBlockCount; + objectCount += other.objectCount; + finalizeCount += other.finalizeCount; +#endif +} +#endif // ENABLE_MEM_STATS + +//======================================================================================================== +// HeapBlock +//======================================================================================================== template SmallNormalHeapBlockT * HeapBlock::AsNormalBlock() @@ -31,6 +120,16 @@ HeapBlock::AsFinalizableBlock() return static_cast *>(this); } +#ifdef RECYCLER_VISITED_HOST +template +SmallRecyclerVisitedHostHeapBlockT * +HeapBlock::AsRecyclerVisitedHostBlock() +{ + Assert(IsRecyclerVisitedHostBlock()); + return static_cast *>(this); +} +#endif + #ifdef RECYCLER_WRITE_BARRIER template SmallNormalWithBarrierHeapBlockT * @@ -88,7 +187,7 @@ SmallHeapBlockT::ConstructorCommon(HeapBucket * bucket, ushort this->Init(objectSize, objectCount); Assert(heapBlockType < HeapBlock::HeapBlockType::SmallAllocBlockTypeCount + HeapBlock::HeapBlockType::MediumAllocBlockTypeCount); Assert(objectCount > 1 && objectCount == (this->GetPageCount() * AutoSystemInfo::PageSize) / objectSize); -#ifdef RECYCLER_SLOW_CHECK_ENABLED +#if defined(RECYCLER_SLOW_CHECK_ENABLED) heapBucket->heapInfo->heapBlockCount[heapBlockType]++; #endif @@ -131,8 +230,11 @@ SmallHeapBlockT::~SmallHeapBlockT() (this->IsLeafBlock()) || this->GetPageAllocator(heapBucket->heapInfo->recycler)->IsClosed()); -#ifdef RECYCLER_SLOW_CHECK_ENABLED +#if defined(RECYCLER_SLOW_CHECK_ENABLED) heapBucket->heapInfo->heapBlockCount[this->GetHeapBlockType()]--; +#endif + +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP heapBucket->heapBlockCount--; #endif } @@ -234,8 +336,10 @@ ushort SmallHeapBlockT::GetExpectedFreeObjectCount() const { Assert(this->GetRecycler()->IsSweeping()); + return objectCount - markCount; } + template uint SmallHeapBlockT::GetExpectedFreeBytes() const @@ -269,6 +373,19 @@ SmallHeapBlockT::Init(ushort objectSize, ushort objectCount) #endif #if ENABLE_CONCURRENT_GC this->isPendingConcurrentSweep = false; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + // This flag is to identify whether this block was made available for allocations during the concurrent sweep and still needs to be swept. + this->isPendingConcurrentSweepPrep = false; +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + this->objectsAllocatedDuringConcurrentSweepCount = 0; + this->hasFinishedSweepObjects = false; + this->wasAllocatedFromDuringSweep = false; + this->lastObjectsAllocatedDuringConcurrentSweepCount = 0; +#endif + } +#endif #endif Assert(!this->isInAllocator); @@ -468,6 +585,20 @@ SmallHeapBlockT::Reset() this->freeCount = 0; this->markCount = 0; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + this->hasFinishedSweepObjects = false; + this->wasAllocatedFromDuringSweep = false; + this->objectsMarkedDuringSweep = 0; + this->objectsAllocatedDuringConcurrentSweepCount = 0; + this->lastObjectsAllocatedDuringConcurrentSweepCount = 0; +#endif + this->isPendingConcurrentSweepPrep = false; + } +#endif + #if ENABLE_PARTIAL_GC this->oldFreeCount = this->lastFreeCount = this->objectCount; #else @@ -877,7 +1008,7 @@ void HeapBlock::PrintVerifyMarkFailure(Recycler* recycler, char* objectAddress, } else { - auto dumpFalsePositive = [&]() + auto dumpFalsePositive = [&]() { if (CONFIG_FLAG(Verbose)) { @@ -894,7 +1025,7 @@ void HeapBlock::PrintVerifyMarkFailure(Recycler* recycler, char* objectAddress, //TODO: (leish)(swb) analyze pdb to check if the field is a pointer field or not Output::Print(_u("Missing Barrier\nOn type %S+0x%x\n"), typeName, offset); } - } + } targetStartAddress = target - targetOffset; @@ -1055,6 +1186,24 @@ SmallHeapBlockT::ClearAllAllocBytes() #endif } +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) +template +void +SmallHeapBlockT::ResetConcurrentSweepAllocationCounts() +{ + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && this->objectsAllocatedDuringConcurrentSweepCount > 0) + { + // Reset the count of objects allocated during this concurrent sweep; so we will start afresh the next time around. + Assert(this->objectsAllocatedDuringConcurrentSweepCount == this->objectsMarkedDuringSweep); + this->lastObjectsAllocatedDuringConcurrentSweepCount = this->objectsAllocatedDuringConcurrentSweepCount; + this->objectsAllocatedDuringConcurrentSweepCount = 0; + this->objectsMarkedDuringSweep = 0; + } +} +#endif +#endif + #if ENABLE_PARTIAL_GC template bool @@ -1090,6 +1239,7 @@ SmallHeapBlockT::GetAndClearUnaccountedAllocBytes() { Assert(this->lastFreeCount >= this->freeCount); const ushort currentFreeCount = this->freeCount; + uint unaccountedAllocBytes = (this->lastFreeCount - currentFreeCount) * this->objectSize; this->lastFreeCount = currentFreeCount; return unaccountedAllocBytes; @@ -1171,17 +1321,28 @@ SmallHeapBlockT::Sweep(RecyclerSweep& recyclerSweep, bool queu #if ENABLE_CONCURRENT_GC Assert(!this->isPendingConcurrentSweep); #endif - DebugOnly(VerifyMarkBitVector()); + +#if DBG && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // In concurrent sweep pass1, we mark the object directly in the mark bit vector for objects allocated during the sweep to prevent them from getting swept during the ongoing sweep itself. + // This will make the mark bit vector on the HeapBlockMap out-of-date w.r.t. these newly allocated objects. + if (!this->wasAllocatedFromDuringSweep) +#endif + { + DebugOnly(VerifyMarkBitVector()); + } if (allocable) { // This block has been allocated from since the last GC. // We need to update its free bit vector so we can use it below. - Assert(freeCount == this->GetFreeBitVector()->Count()); + DebugOnly(ushort currentFreeCount = (ushort)this->GetFreeBitVector()->Count()); + Assert(freeCount == currentFreeCount); #if ENABLE_PARTIAL_GC Assert(this->lastFreeCount == 0 || this->oldFreeCount == this->lastFreeCount); #endif + this->EnsureFreeBitVector(); + Assert(this->lastFreeCount >= this->freeCount); #if ENABLE_PARTIAL_GC Assert(this->oldFreeCount >= this->freeCount); @@ -1203,7 +1364,8 @@ SmallHeapBlockT::Sweep(RecyclerSweep& recyclerSweep, bool queu const uint expectFreeCount = objectCount - localMarkCount; Assert(expectFreeCount >= this->freeCount); - const uint expectSweepCount = expectFreeCount - this->freeCount; + uint expectSweepCount = expectFreeCount - this->freeCount; + Assert(!this->IsLeafBlock() || finalizeCount == 0); Recycler * recycler = recyclerSweep.GetRecycler(); @@ -1219,14 +1381,35 @@ SmallHeapBlockT::Sweep(RecyclerSweep& recyclerSweep, bool queu bool noRealObjectsMarked = (localMarkCount == 0); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + Assert(!this->IsAnyFinalizableBlock() || !this->isPendingConcurrentSweepPrep); + // This heap block is ready to be swept concurrently. +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + this->hasFinishedSweepObjects = false; +#endif + this->isPendingConcurrentSweepPrep = false; + } +#endif + const bool isAllFreed = (finalizeCount == 0 && noRealObjectsMarked && !hasPendingDispose); if (isAllFreed) { - recycler->NotifyFree(this); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + AssertMsg(this->objectsAllocatedDuringConcurrentSweepCount == 0, "This block shouldn't be considered EMPTY if we allocated from it during concurrent sweep."); + } +#endif + recycler->NotifyFree(this); - Assert(!this->HasPendingDisposeObjects()); + Assert(!this->HasPendingDisposeObjects()); - return SweepStateEmpty; +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this->heapBucket, this, _u("[**26**] ending sweep Pass1, state returned SweepStateEmpty.")); +#endif + return SweepStateEmpty; } RECYCLER_STATS_ADD(recycler, heapBlockFreeByteCount[this->GetHeapBlockType()], expectFreeCount * this->objectSize); @@ -1241,7 +1424,23 @@ SmallHeapBlockT::Sweep(RecyclerSweep& recyclerSweep, bool queu if (expectSweepCount == 0) { +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + this->ResetConcurrentSweepAllocationCounts(); + } +#endif +#endif + // nothing has been freed +#ifdef RECYCLER_TRACE + if (recycler->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + SweepState stateReturned = (this->freeCount == 0) ? SweepStateFull : state; + Output::Print(_u("[GC #%d] [HeapBucket 0x%p] HeapBlock 0x%p %s %d [CollectionState: %d] \n"), recycler->collectionCount, this->heapBucket, this, _u("[**37**] heapBlock swept. State returned:"), stateReturned, recycler->collectionState); + } +#endif return (this->freeCount == 0) ? SweepStateFull : state; } @@ -1267,21 +1466,54 @@ SmallHeapBlockT::Sweep(RecyclerSweep& recyclerSweep, bool queu RECYCLER_STATS_INC(recycler, heapBlockConcurrentSweptCount[this->GetHeapBlockType()]); // This heap block has objects that need to be swept concurrently. this->isPendingConcurrentSweep = true; +#ifdef RECYCLER_TRACE + if (recycler->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase)) + { + recycler->PrintBlockStatus(this->heapBucket, this, _u("[**29**] heapBlock swept. State returned: SweepStatePendingSweep")); + } +#endif return SweepStatePendingSweep; } #else Assert(!recyclerSweep.IsBackground()); #endif +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this->heapBucket, this, _u("[**16**] calling SweepObjects.")); +#endif SweepObjects(recycler); if (HasPendingDisposeObjects()) { Assert(finalizeCount != 0); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + AssertMsg(this->objectsAllocatedDuringConcurrentSweepCount == 0, "Allocations during concurrent sweep not supported for finalizable blocks."); + } +#endif + return SweepStatePendingDispose; } - // Already swept, no more work to be done. Put it back to the queue - return state; + // Already swept, no more work to be done. Put it back to the queue. +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBlock()) + { +#ifdef RECYCLER_TRACE + if (recycler->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + SweepState stateReturned = (this->freeCount == 0) ? SweepStateFull : state; + Output::Print(_u("[GC #%d] [HeapBucket 0x%p] HeapBlock 0x%p %s %d [CollectionState: %d] \n"), recycler->collectionCount, this->heapBucket, this, _u("[**38**] heapBlock swept. State returned:"), stateReturned, recycler->collectionState); + } +#endif + // We always need to check the free count as we may have allocated from this block during concurrent sweep. + return (this->freeCount == 0) ? SweepStateFull : state; + } + else +#endif + { + return state; + } } #if DBG @@ -1313,15 +1545,43 @@ SmallHeapBlockT::SweepObjects(Recycler * recycler) Assert(mode == SweepMode_InThread); #endif Assert(this->IsFreeBitsValid()); - Assert(this->markCount != 0 || this->isForceSweeping || this->IsAnyFinalizableBlock()); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + AssertMsg(!hasFinishedSweepObjects, "Block in SweepObjects more than once during the ongoing sweep."); + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + Assert(this->markCount != 0 || this->objectsAllocatedDuringConcurrentSweepCount > 0 || this->isForceSweeping || this->IsAnyFinalizableBlock()); + } + else +#endif + { + Assert(this->markCount != 0 || this->isForceSweeping || this->IsAnyFinalizableBlock()); + } + Assert(this->markCount == this->GetMarkCountForSweep()); - DebugOnly(VerifyMarkBitVector()); +#if DBG && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // In concurrent sweep pass1, we mark the object directly in the mark bit vector for objects allocated during the sweep to prevent them from getting swept during the ongoing sweep itself. + // This will make the mark bit vector on the HeapBlockMap out-of-date w.r.t. these newly allocated objects. + if (!this->wasAllocatedFromDuringSweep) +#endif + { + DebugOnly(VerifyMarkBitVector()); + } SmallHeapBlockBitVector * marked = this->GetMarkedBitVector(); - DebugOnly(const uint expectedSweepCount = objectCount - freeCount - markCount); - Assert(expectedSweepCount != 0 || this->isForceSweeping); + DebugOnly(uint expectedSweepCount = objectCount - freeCount - markCount); +#if DBG && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + Assert(expectedSweepCount != 0 || this->isForceSweeping || this->objectsAllocatedDuringConcurrentSweepCount != 0); + } + else +#endif + { + Assert(expectedSweepCount != 0 || this->isForceSweeping); + } + DebugOnly(uint sweepCount = 0); const uint localSize = objectSize; @@ -1334,6 +1594,7 @@ SmallHeapBlockT::SweepObjects(Recycler * recycler) Assert(IsValidBitIndex(bitIndex)); RECYCLER_STATS_ADD(recycler, objectSweepScanCount, !isForceSweeping); + if (!marked->Test(bitIndex)) { if (!this->GetFreeBitVector()->Test(bitIndex)) @@ -1368,6 +1629,7 @@ SmallHeapBlockT::SweepObjects(Recycler * recycler) } Assert(sweepCount == expectedSweepCount); + #if ENABLE_CONCURRENT_GC this->isPendingConcurrentSweep = false; #endif @@ -1387,6 +1649,7 @@ SmallHeapBlockT::SweepObjects(Recycler * recycler) // Need to update even if there are not swept object because finalizable object are // consider freed but not on the free list. ushort currentFreeCount = GetExpectedFreeObjectCount(); + this->GetFreeBitVector()->OrComplimented(marked); this->GetFreeBitVector()->Minus(this->GetInvalidBitVector()); #if ENABLE_PARTIAL_GC @@ -1398,10 +1661,34 @@ SmallHeapBlockT::SweepObjects(Recycler * recycler) this->lastFreeObjectHead = this->freeObjectList; } - RECYCLER_SLOW_CHECK(CheckFreeBitVector(true)); + // While allocations are allowed during concurrent sweep into still unswept blocks the + // free bit vectors are not valid yet. +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && defined(RECYCLER_SLOW_CHECK_ENABLED) + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && this->objectsAllocatedDuringConcurrentSweepCount == 0) +#endif + { + RECYCLER_SLOW_CHECK(CheckFreeBitVector(true)); + } + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + this->ResetConcurrentSweepAllocationCounts(); + } +#endif +#endif // The count of marked, non-free objects should still be the same Assert(this->markCount == this->GetMarkCountForSweep()); + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(this->hasFinishedSweepObjects = true); +#endif + +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this->heapBucket, this, _u("[**30**] finished SweepObjects, heapblock SWEPT.")); +#endif } template @@ -1494,28 +1781,39 @@ template void SmallHeapBlockT::Check(bool expectFull, bool expectPending) { - if (this->IsFreeBitsValid()) - { - CheckFreeBitVector(false); - } - else +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // If we allocated from this block during the concurrent sweep the free bit vectors would be invalid. +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + if (!this->wasAllocatedFromDuringSweep) +#endif +#endif { - CheckDebugFreeBitVector(false); + if (this->IsFreeBitsValid()) + { + CheckFreeBitVector(false); + } + else + { + CheckDebugFreeBitVector(false); + } } Assert(expectPending == HasAnyDisposeObjects()); - // As the blocks are added to the SLIST and used from there during concurrent sweep, the exepectFull assertion doesn't hold anymore. -#if !(ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP) - if (this->isInAllocator || this->isClearedFromAllocator) - { - Assert(expectFull && !expectPending); - } - else + // As the blocks are added to the SLIST and used from there during concurrent sweep, the expectFull assertion doesn't hold anymore. +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#endif { - Assert(expectFull == (!this->HasFreeObject() && !HasAnyDisposeObjects())); + if (this->isInAllocator || this->isClearedFromAllocator) + { + Assert(expectFull && !expectPending); + } + else + { + Assert(expectFull == (!this->HasFreeObject() && !HasAnyDisposeObjects())); + } } -#endif } @@ -1944,28 +2242,26 @@ void SmallHeapBlockT::Verify(bool pendingDispose) } #endif -#ifdef DUMP_FRAGMENTATION_STATS +#if ENABLE_MEM_STATS template void SmallHeapBlockT::AggregateBlockStats(HeapBucketStats& stats, bool isAllocatorBlock, FreeObject* freeObjectList, bool isBumpAllocated) { - stats.totalBlockCount++; + if (this->segment == nullptr || this->IsInAllocator() != isAllocatorBlock) + { + return; // skip empty blocks, or blocks mismatching isInAllocator to avoid double count + } + + DUMP_FRAGMENTATION_STATS_ONLY(stats.totalBlockCount++); ushort blockObjectCount = this->objectCount; BVIndex blockFreeCount = this->GetFreeBitVector()->Count(); ushort blockObjectSize = this->objectSize; - if (this->segment == nullptr) - { - stats.emptyBlockCount++; - blockObjectCount = 0; - blockFreeCount = 0; - } - - int objectCount = 0; + uint objectCount = 0; if (isBumpAllocated) { - objectCount = ((char*) freeObjectList - this->address) / blockObjectSize; + objectCount = static_cast(((char*) freeObjectList - this->address) / blockObjectSize); } else { @@ -1989,34 +2285,20 @@ SmallHeapBlockT::AggregateBlockStats(HeapBucketStats& stats, b } } - // If we have a block that's on the allocator, it could also be on the heap block list - // In that case, we need to make sure we don't double-count this. To do that, we take out - // the block's allocatorCount/freeCount and adjust it later when we see the block - if (isAllocatorBlock) - { - objectCount -= blockObjectCount; - objectCount += blockFreeCount; - } - - // Don't count empty blocks as allocable - if (this->segment != nullptr) - { - stats.totalByteCount += AutoSystemInfo::PageSize; - } - - stats.objectCount += objectCount; + DUMP_FRAGMENTATION_STATS_ONLY(stats.objectCount += objectCount); stats.objectByteCount += (objectCount * blockObjectSize); + stats.totalByteCount += this->GetPageCount() * AutoSystemInfo::PageSize; +#ifdef DUMP_FRAGMENTATION_STATS if (!isAllocatorBlock) { if (this->IsAnyFinalizableBlock()) { - SmallFinalizableHeapBlock* finalizableBlock = this->AsFinalizableBlock(); - - stats.finalizeBlockCount++; + auto finalizableBlock = this->AsFinalizableBlock(); stats.finalizeCount += (finalizableBlock->GetFinalizeCount()); } } +#endif } #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapBlock.h b/deps/chakrashim/core/lib/Common/Memory/HeapBlock.h index 76374541bee..0377a010111 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapBlock.h +++ b/deps/chakrashim/core/lib/Common/Memory/HeapBlock.h @@ -37,18 +37,45 @@ template class HeapBucketT; class RecyclerSweep; class MarkContext; -#ifdef DUMP_FRAGMENTATION_STATS -struct HeapBucketStats +#if ENABLE_MEM_STATS +struct MemStats { + size_t objectByteCount; + size_t totalByteCount; + + MemStats(); + + void Reset(); + size_t FreeBytes() const; + double UsedRatio() const; + void Aggregate(const MemStats& other); +}; + +struct HeapBucketStats: MemStats +{ +#ifdef DUMP_FRAGMENTATION_STATS uint totalBlockCount; - uint emptyBlockCount; - uint finalizeBlockCount; uint objectCount; uint finalizeCount; - uint objectByteCount; - uint totalByteCount; + + HeapBucketStats(); + void Reset(); + void Dump() const; +#endif + + void PreAggregate(); + void BeginAggregate(); + void Aggregate(const HeapBucketStats& other); }; + +#ifdef DUMP_FRAGMENTATION_STATS +#define DUMP_FRAGMENTATION_STATS_ONLY(x) x +#define DUMP_FRAGMENTATION_STATS_IS(x) x +#else +#define DUMP_FRAGMENTATION_STATS_ONLY(x) +#define DUMP_FRAGMENTATION_STATS_IS(x) false #endif +#endif // ENABLE_MEM_STATS #if defined(PROFILE_RECYCLER_ALLOC) || defined(RECYCLER_MEMORY_VERIFY) || defined(MEMSPECT_TRACKING) || defined(RECYCLER_PERF_COUNTERS) || defined(ETW_MEMORY_TRACKING) #define RECYCLER_TRACK_NATIVE_ALLOCATED_OBJECTS @@ -73,7 +100,7 @@ enum ObjectInfoBits : unsigned short FinalizeBit = 0x80, // Indicates that the object has a finalizer PendingDisposeBit = 0x40, // Indicates that the object is pending dispose LeafBit = 0x20, // Indicates that the object is a leaf-object (objects without this bit need to be scanned) - TrackBit = 0x10, // Indicates that the object is a TrackableObject + TrackBit = 0x10, // Indicates that the object is a TrackableObject, but has also been overloaded to mean traced for RecyclerVisitedHostHeap objects ImplicitRootBit = 0x08, NewTrackBit = 0x04, // Tracked object is newly allocated and hasn't been process by concurrent GC MemoryProfilerOldObjectBit = 0x02, @@ -91,13 +118,17 @@ enum ObjectInfoBits : unsigned short WithBarrierBit = 0x0100, #endif +#ifdef RECYCLER_VISITED_HOST + RecyclerVisitedHostBit = 0x0200, +#endif + // Mask for above bits - InternalObjectInfoBitMask = 0x01FF, + InternalObjectInfoBitMask = 0x03FF, // Bits that only affect allocation behavior, not mark/sweep/etc - ClientTrackedBit = 0x0200, // This allocation is client tracked - TraceBit = 0x0400, + ClientTrackedBit = 0x0400, // This allocation is client tracked + TraceBit = 0x0800, // Additional definitions based on above @@ -113,7 +144,7 @@ enum ObjectInfoBits : unsigned short // Allocation bits FinalizableLeafBits = NewFinalizeBit | FinalizeBit | LeafBit, - FinalizableObjectBits = NewFinalizeBit | FinalizeBit , + FinalizableObjectBits = NewFinalizeBit | FinalizeBit, #ifdef RECYCLER_WRITE_BARRIER FinalizableWithBarrierObjectBits = NewFinalizeBit | FinalizableWithBarrierBit, #endif @@ -134,11 +165,34 @@ enum ObjectInfoBits : unsigned short // Pending dispose objects should have LeafBit set and no others PendingDisposeObjectBits = PendingDisposeBit | LeafBit, +#ifdef RECYCLER_VISITED_HOST + // Bits for use with recycler visited host heap block. + // Recycler visited host heap block will both mark and finalize based on IRecyclerVisitedHost v-table, as specified + // by TrackBit and FinalizeBit. These objects are expected to be allocated by chakra, but implemented by + // the host, including construction of the IRecyclerVisitedHost v-table. + // + // RecyclerVisitedHostBit is implicit in the heap block type and thus isn't part of the StoredObjectInfoBitMask. + // LeafBit is also set for any object that is not precisely traced. + RecyclerVisitedHostTracedBits = RecyclerVisitedHostBit | TrackBit | NewTrackBit, + RecyclerVisitedHostFinalizableBits = RecyclerVisitedHostBit | LeafBit | FinalizeBit | NewFinalizeBit, + RecyclerVisitedHostTracedFinalizableBits = RecyclerVisitedHostTracedBits | FinalizeBit, + + // These set of bits describe the four possible types of blocktype bits for recycler visited host heap blocks. + // These are the four combinations of the above bits, AND'd with GetBlockTypeBitMask. + // In the end, these are treated the same in terms of which heap block/bucket type they end up using and + // but are defined here for ease of use. + RecyclerVisitedHostFinalizableBlockTypeBits = RecyclerVisitedHostBit | LeafBit | FinalizeBit, + RecyclerVisitedHostTracedFinalizableBlockTypeBits = RecyclerVisitedHostBit | FinalizeBit, +#endif + + GetBlockTypeBitMask = FinalizeBit | LeafBit #ifdef RECYCLER_WRITE_BARRIER - GetBlockTypeBitMask = FinalizeBit | LeafBit | WithBarrierBit, -#else - GetBlockTypeBitMask = FinalizeBit | LeafBit, + | WithBarrierBit #endif +#ifdef RECYCLER_VISITED_HOST + | RecyclerVisitedHostBit +#endif + , CollectionBitMask = LeafBit | FinalizeBit | TrackBit | NewTrackBit, // Bits relevant to collection @@ -187,32 +241,41 @@ enum FindHeapObjectFlags template class SmallNormalHeapBlockT; template class SmallLeafHeapBlockT; template class SmallFinalizableHeapBlockT; + #ifdef RECYCLER_WRITE_BARRIER template class SmallNormalWithBarrierHeapBlockT; template class SmallFinalizableWithBarrierHeapBlockT; -#define EXPLICIT_INSTANTIATE_WITH_SMALL_HEAP_BLOCK_TYPE(TemplateType) \ - template class TemplateType; \ - template class TemplateType; \ - template class TemplateType; \ +#define INSTANTIATE_SWB_BLOCKTYPES(TemplateType) \ template class TemplateType; \ template class TemplateType; \ - template class TemplateType; \ - template class TemplateType; \ - template class TemplateType; \ template class TemplateType; \ template class TemplateType; \ + +#else +#define INSTANTIATE_SWB_BLOCKTYPES(TemplateType) +#endif + +#ifdef RECYCLER_VISITED_HOST +template class SmallRecyclerVisitedHostHeapBlockT; +#define INSTANTIATE_RECYCLER_VISITED_BLOCKTYPES(TemplateType) \ + template class TemplateType; \ + template class TemplateType; \ + #else +#define INSTANTIATE_RECYCLER_VISITED_BLOCKTYPES(TemplateType) +#endif + #define EXPLICIT_INSTANTIATE_WITH_SMALL_HEAP_BLOCK_TYPE(TemplateType) \ - template class TemplateType; \ + template class TemplateType; \ template class TemplateType; \ template class TemplateType; \ - template class TemplateType; \ + template class TemplateType; \ template class TemplateType; \ template class TemplateType; \ - -#endif + INSTANTIATE_SWB_BLOCKTYPES(TemplateType) \ + INSTANTIATE_RECYCLER_VISITED_BLOCKTYPES(TemplateType) \ class RecyclerHeapObjectInfo; class HeapBlock @@ -221,31 +284,58 @@ class HeapBlock enum HeapBlockType : byte { FreeBlockType = 0, // Only used in HeapBlockMap. Actual HeapBlock structures should never have this. - SmallNormalBlockType = 1, - SmallLeafBlockType = 2, - SmallFinalizableBlockType = 3, + SmallNormalBlockType, + SmallLeafBlockType, + SmallFinalizableBlockType, #ifdef RECYCLER_WRITE_BARRIER - SmallNormalBlockWithBarrierType = 4, - SmallFinalizableBlockWithBarrierType = 5, + SmallNormalBlockWithBarrierType, + SmallFinalizableBlockWithBarrierType, +#endif +#ifdef RECYCLER_VISITED_HOST + SmallRecyclerVisitedHostBlockType, #endif - MediumNormalBlockType = 6, - MediumLeafBlockType = 7, - MediumFinalizableBlockType = 8, + MediumNormalBlockType, + MediumLeafBlockType, + MediumFinalizableBlockType, #ifdef RECYCLER_WRITE_BARRIER - MediumNormalBlockWithBarrierType = 9, - MediumFinalizableBlockWithBarrierType = 10, + MediumNormalBlockWithBarrierType, + MediumFinalizableBlockWithBarrierType, +#endif +#ifdef RECYCLER_VISITED_HOST + MediumRecyclerVisitedHostBlockType, +#endif + LargeBlockType, + +#ifdef RECYCLER_VISITED_HOST + SmallAllocBlockTypeCount = 7, // Actual number of types for blocks containing small allocations +#else + SmallAllocBlockTypeCount = 6, +#endif + +#ifdef RECYCLER_VISITED_HOST + MediumAllocBlockTypeCount = 6, // Actual number of types for blocks containing medium allocations +#else + MediumAllocBlockTypeCount = 5, #endif - LargeBlockType = 11, - SmallAllocBlockTypeCount = 6, // Actual number of types for blocks containing small allocations - MediumAllocBlockTypeCount = 5, // Actual number of types for blocks containing medium allocations - SmallBlockTypeCount = 11, // Distinct block types independent of allocation size using SmallHeapBlockT + SmallBlockTypeCount = SmallAllocBlockTypeCount + MediumAllocBlockTypeCount, // Distinct block types independent of allocation size using SmallHeapBlockT + LargeBlockTypeCount = 1, // There is only one LargeBlockType - BlockTypeCount = 12, + BlockTypeCount = SmallBlockTypeCount + LargeBlockTypeCount, }; bool IsNormalBlock() const { return this->GetHeapBlockType() == SmallNormalBlockType || this->GetHeapBlockType() == MediumNormalBlockType; } bool IsLeafBlock() const { return this->GetHeapBlockType() == SmallLeafBlockType || this->GetHeapBlockType() == MediumLeafBlockType; } - bool IsFinalizableBlock() const { return this->GetHeapBlockType() == SmallFinalizableBlockType || this->GetHeapBlockType() == MediumFinalizableBlockType; } + bool IsFinalizableBlock() const + { + return this->GetHeapBlockType() == SmallFinalizableBlockType || this->GetHeapBlockType() == MediumFinalizableBlockType +#ifdef RECYCLER_VISITED_HOST + || IsRecyclerVisitedHostBlock() +#endif + ; + } +#ifdef RECYCLER_VISITED_HOST + bool IsRecyclerVisitedHostBlock() const { return this->GetHeapBlockType() == SmallRecyclerVisitedHostBlockType || this->GetHeapBlockType() == MediumRecyclerVisitedHostBlockType; } +#endif #ifdef RECYCLER_WRITE_BARRIER bool IsAnyNormalBlock() const { return IsNormalBlock() || IsNormalWriteBarrierBlock(); } @@ -269,6 +359,12 @@ class HeapBlock template SmallFinalizableHeapBlockT * AsFinalizableBlock(); + +#ifdef RECYCLER_VISITED_HOST + template + SmallRecyclerVisitedHostHeapBlockT * AsRecyclerVisitedHostBlock(); +#endif + #ifdef RECYCLER_WRITE_BARRIER template SmallNormalWithBarrierHeapBlockT * AsNormalWriteBarrierBlock(); @@ -284,6 +380,19 @@ class HeapBlock bool needOOMRescan; // Set if we OOMed while marking a particular object #if ENABLE_CONCURRENT_GC bool isPendingConcurrentSweep; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // This flag is to identify whether this block was made available for allocations during the concurrent sweep and + // still needs to be swept. + bool isPendingConcurrentSweepPrep; +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + // This flag ensures a block doesn't get swept more than once during a given sweep. + bool hasFinishedSweepObjects; + + // When allocate from a block during concurrent sweep some checks need to be delayed until + // the free and mark bits are rebuilt. This flag helps skip those validations until then. + bool wasAllocatedFromDuringSweep; +#endif +#endif #endif public: @@ -295,6 +404,7 @@ class HeapBlock heapBlockType(heapBlockType), needOOMRescan(false) { + static_assert(HeapBlockType::LargeBlockType == HeapBlockType::SmallBlockTypeCount, "LargeBlockType must come right after small+medium alloc block types"); Assert(GetHeapBlockType() <= HeapBlock::HeapBlockType::BlockTypeCount); } @@ -303,6 +413,13 @@ class HeapBlock return (heapBlockType); } +#if (DBG || defined(RECYCLER_SLOW_CHECK_ENABLED)) && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + bool WasAllocatedFromDuringSweep() + { + return this->wasAllocatedFromDuringSweep; + } +#endif + IdleDecommitPageAllocator* GetPageAllocator(Recycler* recycler); bool GetAndClearNeedOOMRescan() @@ -353,7 +470,7 @@ class HeapBlock #endif }; -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST template struct HeapBlockSListItem { // SLIST_ENTRY needs to be the first element in the structure to avoid calculating offset with the SList API calls. @@ -389,11 +506,22 @@ template class ValidPointers { public: - ValidPointers(ushort const * validPointers); + ValidPointers(ushort const * validPointers, uint bucketIndex); ushort GetInteriorAddressIndex(uint index) const; ushort GetAddressIndex(uint index) const; private: +#if USE_VPM_TABLE ushort const * validPointers; +#endif + +#if !USE_VPM_TABLE || DBG + uint indexPerObject; + uint maxObjectIndex; + + static uint CalculateBucketInfo(uint bucketIndex, uint * stride); + static ushort CalculateAddressIndex(uint index, uint indexPerObject, uint maxObjectIndex); + static ushort CalculateInteriorAddressIndex(uint index, uint indexPerObject, uint maxObjectIndex); +#endif }; template @@ -439,6 +567,18 @@ class SmallHeapBlockT : public HeapBlock ushort freeCount; ushort lastFreeCount; ushort markCount; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + // We need to keep track of the number of objects allocated during concurrent sweep, to be + // able to make the correct determination about whether a block is EMPTY or FULL when the actual + // sweep of this block happens. + ushort objectsAllocatedDuringConcurrentSweepCount; + ushort objectsMarkedDuringSweep; + ushort lastObjectsAllocatedDuringConcurrentSweepCount; + bool blockNotReusedInPartialHeapBlockList; + bool blockNotReusedInPendingList; +#endif +#endif #if ENABLE_PARTIAL_GC ushort oldFreeCount; @@ -554,7 +694,7 @@ class SmallHeapBlockT : public HeapBlock void InduceFalsePositive(Recycler * recycler); #endif -#ifdef DUMP_FRAGMENTATION_STATS +#if ENABLE_MEM_STATS void AggregateBlockStats(HeapBucketStats& stats, bool isAllocatorBlock = false, FreeObject* freeObjectList = nullptr, bool isBumpAllocated = false); #endif @@ -621,6 +761,11 @@ class SmallHeapBlockT : public HeapBlock virtual size_t GetObjectSize(void* object) const override { return objectSize; } uint GetMarkCountForSweep(); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + void ResetConcurrentSweepAllocationCounts(); +#endif +#endif SweepState Sweep(RecyclerSweep& recyclerSweep, bool queuePendingSweep, bool allocable, ushort finalizeCount = 0, bool hasPendingDispose = false); template void SweepObjects(Recycler * recycler); @@ -681,10 +826,10 @@ class SmallHeapBlockT : public HeapBlock protected: static size_t GetAllocPlusSize(uint objectCount); inline void SetAttributes(void * address, unsigned char attributes); + ushort GetAddressIndex(void * objectAddress); SmallHeapBlockT(HeapBucket * bucket, ushort objectSize, ushort objectCount, HeapBlockType heapBlockType); - ushort GetAddressIndex(void * objectAddress); ushort GetInteriorAddressIndex(void * interiorAddress); ushort GetObjectIndexFromBitIndex(ushort bitIndex); diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapBlock.inl b/deps/chakrashim/core/lib/Common/Memory/HeapBlock.inl index cfc3ceaf6fd..d118fcd3167 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapBlock.inl +++ b/deps/chakrashim/core/lib/Common/Memory/HeapBlock.inl @@ -157,6 +157,10 @@ template bool HeapBlock::UpdateAttributesOfMarkedObjects(MarkContext * markContext, void * objectAddress, size_t objectSize, unsigned char attributes, Fn fn) { +#ifdef RECYCLER_VISITED_HOST + Assert(GetHeapBlockType() != HeapBlock::HeapBlockType::SmallRecyclerVisitedHostBlockType && GetHeapBlockType() != HeapBlock::HeapBlockType::MediumRecyclerVisitedHostBlockType); +#endif + bool noOOMDuringMark = true; if (attributes & TrackBit) diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.cpp b/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.cpp index 5a6ab212e30..e99fcccff7b 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.cpp @@ -12,7 +12,7 @@ const uint Memory::HeapBlockMap32::L1Count; const uint Memory::HeapBlockMap32::L2Count; #endif -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) HeapBlockMap32::HeapBlockMap32(__in char * startAddress) : startAddress(startAddress), #else @@ -22,7 +22,7 @@ HeapBlockMap32::HeapBlockMap32() : { memset(map, 0, sizeof(map)); -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) Assert(((size_t)startAddress) % TotalSize == 0); #endif } @@ -327,7 +327,12 @@ HeapBlockMap32::SetPageMarkCount(void * address, ushort markCount) // Callers should already have updated the mark bits by the time they call this, // so check that the new count is correct for the current mark bits. // Not true right now, will be true... +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(HeapBlock * heapBlock = this->GetHeapBlock(address)); + Assert(l2map->GetPageMarkBitVector(id2)->Count() == markCount || heapBlock->WasAllocatedFromDuringSweep()); +#else Assert(l2map->GetPageMarkBitVector(id2)->Count() == markCount); +#endif l2map->pageMarkCount[id2] = markCount; } @@ -350,7 +355,12 @@ HeapBlockMap32::VerifyMarkCountForPages(void * address, uint pageCount) for (uint i = id2; i < pageCount + id2; i++) { uint markCountForPage = l2map->GetPageMarkBitVector(i)->Count(); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(HeapBlock * heapBlock = this->GetHeapBlock(address)); + Assert(markCountForPage == l2map->pageMarkCount[i] || heapBlock->WasAllocatedFromDuringSweep()); +#else Assert(markCountForPage == l2map->pageMarkCount[i]); +#endif } } #endif @@ -581,7 +591,7 @@ HeapBlockMap32::ForEachSegment(Recycler * recycler, Fn func) PageAllocator* segmentPageAllocator = (PageAllocator*)currentSegment->GetAllocator(); Assert(segmentPageAllocator == block->GetPageAllocator(recycler)); -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) // On 64 bit, the segment may span multiple HeapBlockMap32 structures. // Limit the processing to the portion of the segment in this HeapBlockMap32. // We'll process other portions when we visit the other HeapBlockMap32 structures. @@ -624,7 +634,7 @@ HeapBlockMap32::ResetDirtyPages(Recycler * recycler) #endif #ifdef RECYCLER_WRITE_BARRIER -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) if (segment->IsWriteBarrierEnabled()) #endif { @@ -662,6 +672,10 @@ HeapBlockMap32::RescanPage(void * dirtyPage, bool* anyObjectsMarkedOnPage, Recyc case HeapBlock::HeapBlockType::SmallFinalizableBlockWithBarrierType: #endif return RescanHeapBlock(dirtyPage, blockType, chunk, id2, anyObjectsMarkedOnPage, recycler); +#ifdef RECYCLER_VISITED_HOST + case HeapBlock::HeapBlockType::SmallRecyclerVisitedHostBlockType: + return RescanHeapBlock(dirtyPage, blockType, chunk, id2, anyObjectsMarkedOnPage, recycler); +#endif case HeapBlock::HeapBlockType::MediumNormalBlockType: #ifdef RECYCLER_WRITE_BARRIER case HeapBlock::HeapBlockType::MediumNormalBlockWithBarrierType: @@ -672,6 +686,10 @@ HeapBlockMap32::RescanPage(void * dirtyPage, bool* anyObjectsMarkedOnPage, Recyc case HeapBlock::HeapBlockType::MediumFinalizableBlockWithBarrierType: #endif return RescanHeapBlock(dirtyPage, blockType, chunk, id2, anyObjectsMarkedOnPage, recycler); +#ifdef RECYCLER_VISITED_HOST + case HeapBlock::HeapBlockType::MediumRecyclerVisitedHostBlockType: + return RescanHeapBlock(dirtyPage, blockType, chunk, id2, anyObjectsMarkedOnPage, recycler); +#endif default: // Shouldn't be here -- leaf blocks aren't rescanned, and large blocks are handled separately Assert(false); @@ -743,6 +761,24 @@ HeapBlockMap32::GetHeapBlockForRescan(HeapBlockMap32::L2MapChunk* chunk, uint id return (MediumFinalizableHeapBlock*)chunk->map[id2]; } +#ifdef RECYCLER_VISITED_HOST +template <> +SmallRecyclerVisitedHostHeapBlock* +HeapBlockMap32::GetHeapBlockForRescan(HeapBlockMap32::L2MapChunk* chunk, uint id2) const +{ + return (SmallRecyclerVisitedHostHeapBlock*) chunk->map[id2]; +} +#endif + +#ifdef RECYCLER_VISITED_HOST +template <> +MediumRecyclerVisitedHostHeapBlock* +HeapBlockMap32::GetHeapBlockForRescan(HeapBlockMap32::L2MapChunk* chunk, uint id2) const +{ + return (MediumRecyclerVisitedHostHeapBlock*)chunk->map[id2]; +} +#endif + void HeapBlockMap32::MakeAllPagesReadOnly(Recycler* recycler) { @@ -891,7 +927,7 @@ HeapBlockMap32::Rescan(Recycler * recycler, bool resetWriteWatch) Assert(dirtyPage >= segmentStart); Assert(dirtyPage < segmentStart + segmentLength); -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) Assert(HeapBlockMap64::GetNodeStartAddress(dirtyPage) == this->startAddress); #endif @@ -915,7 +951,7 @@ HeapBlockMap32::Rescan(Recycler * recycler, bool resetWriteWatch) char * pageAddress = segmentStart + (i * AutoSystemInfo::PageSize); Assert((size_t)(pageAddress - segmentStart) < segmentLength); -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) Assert(HeapBlockMap64::GetNodeStartAddress(pageAddress) == this->startAddress); #endif @@ -977,7 +1013,7 @@ HeapBlockMap32::OOMRescan(Recycler * recycler) char * pageAddress = segmentStart + (i * AutoSystemInfo::PageSize); Assert((size_t)(pageAddress - segmentStart) < segmentLength); -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) Assert(HeapBlockMap64::GetNodeStartAddress(pageAddress) == this->startAddress); #endif @@ -1022,6 +1058,14 @@ HeapBlockMap32::OOMRescan(Recycler * recycler) return; } break; +#ifdef RECYCLER_VISITED_HOST + case HeapBlock::HeapBlockType::SmallRecyclerVisitedHostBlockType: + if (!RescanHeapBlockOnOOM((SmallRecyclerVisitedHostHeapBlock*) heapBlock, pageAddress, blockType, chunk->blockInfo[id2].bucketIndex, chunk, recycler)) + { + return; + } + break; +#endif case HeapBlock::HeapBlockType::MediumNormalBlockType: #ifdef RECYCLER_WRITE_BARRIER @@ -1042,6 +1086,14 @@ HeapBlockMap32::OOMRescan(Recycler * recycler) return; } break; +#ifdef RECYCLER_VISITED_HOST + case HeapBlock::HeapBlockType::MediumRecyclerVisitedHostBlockType: + if (!RescanHeapBlockOnOOM((MediumRecyclerVisitedHostHeapBlock*) heapBlock, pageAddress, blockType, chunk->blockInfo[id2].bucketIndex, chunk, recycler)) + { + return; + } + break; +#endif default: // Shouldn't be here -- leaf blocks aren't rescanned, and large blocks are handled separately @@ -1130,7 +1182,7 @@ HeapBlockMap32::Cleanup(bool concurrentFindImplicitRoot) } } -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) HeapBlockMap64::HeapBlockMap64(): list(nullptr) diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.h b/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.h index ee30afc0988..329debe5348 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.h +++ b/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.h @@ -21,7 +21,7 @@ class HeapBlockMap32 static const uint PageMarkBitCount = PageSize / HeapConstants::ObjectGranularity; static const uint L2ChunkMarkBitCount = L2Count * PageMarkBitCount; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) static const size_t TotalSize = 0x100000000; // 4GB #endif @@ -33,7 +33,7 @@ class HeapBlockMap32 // so set it to the MaxPageCount for PageSegments. static const uint MaxGetWriteWatchPages = PageSegment::MaxPageCount; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) HeapBlockMap32(__in char * startAddress); #else HeapBlockMap32(); @@ -206,7 +206,7 @@ class HeapBlockMap32 L2MapChunk * map[L1Count]; bool anyHeapBlockRescannedDuringOOM; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) // On 64 bit, this structure only maps one particular 32 bit space. // Store the startAddress of that 32 bit space so we know which it is. // This value should always be 4GB aligned. @@ -228,7 +228,7 @@ class HeapBlockMap32 }; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) class HeapBlockMap64 { diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.inl b/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.inl index db619eb9fc9..1fac17490b3 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.inl +++ b/deps/chakrashim/core/lib/Common/Memory/HeapBlockMap.inl @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- @@ -142,13 +142,38 @@ HeapBlockMap32::Mark(void * candidate, MarkContext * markContext) #endif ((SmallFinalizableHeapBlock*)chunk->map[id2])->ProcessMarkedObject(candidate, markContext); break; +#ifdef RECYCLER_VISITED_HOST + case HeapBlock::HeapBlockType::SmallRecyclerVisitedHostBlockType: + { + void * realCandidate = ((SmallFinalizableHeapBlock*)chunk->map[id2])->GetRealAddressFromInterior(candidate); + if (MarkInteriorInternal(markContext, chunk, candidate, realCandidate)) + { + break; + } + + ((SmallRecyclerVisitedHostHeapBlock*)chunk->map[id2])->ProcessMarkedObject(realCandidate, markContext); + } + break; +#endif case HeapBlock::HeapBlockType::MediumFinalizableBlockType: #ifdef RECYCLER_WRITE_BARRIER case HeapBlock::HeapBlockType::MediumFinalizableBlockWithBarrierType: #endif ((MediumFinalizableHeapBlock*)chunk->map[id2])->ProcessMarkedObject(candidate, markContext); break; +#ifdef RECYCLER_VISITED_HOST + case HeapBlock::HeapBlockType::MediumRecyclerVisitedHostBlockType: + { + void * realCandidate = ((MediumFinalizableHeapBlock*)chunk->map[id2])->GetRealAddressFromInterior(candidate); + if (MarkInteriorInternal(markContext, chunk, candidate, realCandidate)) + { + break; + } + ((MediumRecyclerVisitedHostHeapBlock*)chunk->map[id2])->ProcessMarkedObject(realCandidate, markContext); + } + break; +#endif case HeapBlock::HeapBlockType::LargeBlockType: ((LargeHeapBlock*)chunk->map[id2])->Mark(candidate, markContext); break; @@ -237,13 +262,13 @@ HeapBlockMap32::MarkInteriorInternal(MarkContext * markContext, L2MapChunk *& ch if (largeBlockType) { -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) // we only check the first MaxLargeObjectMarkOffset byte for marking purpuse. if ( (size_t)originalCandidate - (size_t)realCandidate > HeapConstants::MaxLargeObjectMarkOffset ) return true; #endif -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) if (HeapBlockMap64::GetNodeIndex(originalCandidate) != HeapBlockMap64::GetNodeIndex(realCandidate)) { // We crossed a node boundary (very rare) so we should just re-start from the real candidate. @@ -367,7 +392,30 @@ HeapBlockMap32::MarkInterior(void * candidate, MarkContext * markContext) ((MediumFinalizableHeapBlock*)chunk->map[id2])->ProcessMarkedObject(realCandidate, markContext); } break; +#ifdef RECYCLER_VISITED_HOST + case HeapBlock::HeapBlockType::SmallRecyclerVisitedHostBlockType: + { + void * realCandidate = ((SmallFinalizableHeapBlock*)chunk->map[id2])->GetRealAddressFromInterior(candidate); + if (MarkInteriorInternal(markContext, chunk, candidate, realCandidate)) + { + break; + } + ((SmallRecyclerVisitedHostHeapBlock*)chunk->map[id2])->ProcessMarkedObject(realCandidate, markContext); + } + break; + case HeapBlock::HeapBlockType::MediumRecyclerVisitedHostBlockType: + { + void * realCandidate = ((MediumFinalizableHeapBlock*)chunk->map[id2])->GetRealAddressFromInterior(candidate); + if (MarkInteriorInternal(markContext, chunk, candidate, realCandidate)) + { + break; + } + + ((MediumRecyclerVisitedHostHeapBlock*)chunk->map[id2])->ProcessMarkedObject(realCandidate, markContext); + } + break; +#endif case HeapBlock::HeapBlockType::LargeBlockType: { void * realCandidate = ((LargeHeapBlock*)chunk->map[id2])->GetRealAddressFromInterior(candidate); @@ -391,7 +439,7 @@ HeapBlockMap32::MarkInterior(void * candidate, MarkContext * markContext) } } -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) // // 64-bit Mark @@ -403,6 +451,10 @@ inline void HeapBlockMap64::Mark(void * candidate, MarkContext * markContext) { + if (!list || !HeapInfo::IsAlignedAddress(candidate) || (size_t)candidate < 0x10000) + { + return; + } uint index = GetNodeIndex(candidate); Node * node = list; @@ -427,6 +479,10 @@ inline void HeapBlockMap64::MarkInterior(void * candidate, MarkContext * markContext) { + if (!list || (size_t)candidate < 0x10000) + { + return; + } uint index = GetNodeIndex(candidate); Node * node = list; @@ -446,4 +502,4 @@ HeapBlockMap64::MarkInterior(void * candidate, MarkContext * markContext) // No Node found; must be an invalid reference. Do nothing. } -#endif // defined(_M_X64_OR_ARM64) +#endif // defined(TARGET_64) diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapBucket.cpp b/deps/chakrashim/core/lib/Common/Memory/HeapBucket.cpp index f98a5865f95..ab6aa3f94a5 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapBucket.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/HeapBucket.cpp @@ -9,17 +9,31 @@ HeapBucket::HeapBucket() : heapInfo(nullptr), sizeCat(0) { -#ifdef RECYCLER_SLOW_CHECK_ENABLED +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP heapBlockCount = 0; newHeapBlockCount = 0; +#endif + +#if defined(RECYCLER_SLOW_CHECK_ENABLED) emptyHeapBlockCount = 0; #endif +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + this->allocationsStartedDuringConcurrentSweep = false; + this->concurrentSweepAllocationsThresholdExceeded = false; +#endif + #ifdef RECYCLER_PAGE_HEAP isPageHeapEnabled = false; #endif } +uint +HeapBucket::GetSizeCat() const +{ + return this->sizeCat; +} + uint HeapBucket::GetBucketIndex() const { @@ -41,9 +55,10 @@ HeapBucketT::HeapBucketT() : emptyBlockList(nullptr), fullBlockList(nullptr), heapBlockList(nullptr), -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP -#if SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - allocableHeapBlockListHead((PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT)), +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if SUPPORT_WIN32_SLIST + lastKnownNextAllocableBlockHead(nullptr), + allocableHeapBlockListHead(nullptr), sweepableHeapBlockList(nullptr), #endif #endif @@ -54,10 +69,6 @@ HeapBucketT::HeapBucketT() : explicitFreeLockBlockList = nullptr; #endif -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - this->allocationsStartedDuringConcurrentSweep = false; -#endif - isAllocationStopped = false; } @@ -68,8 +79,8 @@ HeapBucketT::~HeapBucketT() DeleteHeapBlockList(this->heapBlockList); DeleteHeapBlockList(this->fullBlockList); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP -#if SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if SUPPORT_WIN32_SLIST if (allocableHeapBlockListHead != nullptr) { if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) @@ -80,14 +91,18 @@ HeapBucketT::~HeapBucketT() _aligned_free(this->allocableHeapBlockListHead); } - DeleteHeapBlockList(sweepableHeapBlockList); + DeleteHeapBlockList(this->sweepableHeapBlockList); #endif #endif +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP Assert(this->heapBlockCount + this->newHeapBlockCount == 0); +#endif RECYCLER_SLOW_CHECK(Assert(this->emptyHeapBlockCount == HeapBlockList::Count(this->emptyBlockList))); DeleteEmptyHeapBlockList(this->emptyBlockList); +#if defined(RECYCLER_SLOW_CHECK_ENABLED) Assert(this->heapBlockCount + this->newHeapBlockCount + this->emptyHeapBlockCount == 0); +#endif } }; @@ -121,7 +136,7 @@ HeapBucketT::DeleteHeapBlockList(TBlockType * list) DeleteHeapBlockList(list, this->heapInfo->recycler); } -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST template bool HeapBucketT::PushHeapBlockToSList(PSLIST_HEADER list, TBlockType * heapBlock) @@ -133,7 +148,11 @@ HeapBucketT::PushHeapBlockToSList(PSLIST_HEADER list, TBlockType * h return false; } + // While in the SLIST the blocks live as standalone, when they come out they + // will go into appropriate list and the Next block will be set accordingly. + heapBlock->SetNextBlock(nullptr); currentBlock->itemHeapBlock = heapBlock; + ::InterlockedPushEntrySList(list, &(currentBlock->itemEntry)); return true; } @@ -198,20 +217,6 @@ HeapBucketT::Initialize(HeapInfo * heapInfo, uint sizeCat) allocatorHead.bucket = this; #endif this->lastExplicitFreeListAllocator = &allocatorHead; - -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) - { - if (allocableHeapBlockListHead == nullptr) - { - heapInfo->recycler->OutOfMemory(); - } - else - { - ::InitializeSListHead(allocableHeapBlockListHead); - } - } -#endif } template @@ -335,7 +340,10 @@ HeapBucketT::IntegrateBlock(char * blockAddress, PageSegment * segme heapBlock->SetNextBlock(this->fullBlockList); this->fullBlockList = heapBlock; - RECYCLER_SLOW_CHECK(this->heapBlockCount++); + +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + this->heapBlockCount++; +#endif this->heapInfo->uncollectedAllocBytes += heapBlock->GetAndClearLastFreeCount() * heapBlock->GetObjectSize(); RecyclerMemoryTracking::ReportAllocation(recycler, blockAddress, heapBlock->GetObjectSize() * heapBlock->GetObjectCount()); @@ -389,8 +397,23 @@ HeapBucketT::HasPendingDisposeHeapBlocks() const return IsFinalizableBucket && ((SmallFinalizableHeapBucketT *)this)->pendingDisposeList != nullptr; #endif } + #endif +template +void +HeapBucketT::AssertCheckHeapBlockNotInAnyList(TBlockType * heapBlock) +{ +#if DBG + AssertMsg(!HeapBlockList::Contains(heapBlock, heapBlockList), "The heap block already exists in the heapBlockList."); + AssertMsg(!HeapBlockList::Contains(heapBlock, fullBlockList), "The heap block already exists in the fullBlockList."); + AssertMsg(!HeapBlockList::Contains(heapBlock, emptyBlockList), "The heap block already exists in the emptyBlockList."); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + AssertMsg(!HeapBlockList::Contains(heapBlock, sweepableHeapBlockList), "The heap block already exists in the sweepableHeapBlockList."); +#endif +#endif +} + #if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) template size_t @@ -402,15 +425,18 @@ HeapBucketT::GetNonEmptyHeapBlockCount(bool checkCount) const #if ENABLE_CONCURRENT_GC #if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP -#if SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { allocatingDuringConcurrentSweep = true; // This lock is needed only in the debug mode while we verify block counts. Not needed otherwise, as this list is never accessed concurrently. // Items are added to it by the allocator when allocations are allowed during concurrent sweep. The list is drained during the next sweep while // allocation are stopped. debugSweepableHeapBlockListLock.Enter(); - currentHeapBlockCount += QueryDepthInterlockedSList(allocableHeapBlockListHead); + if (allocableHeapBlockListHead != nullptr) + { + currentHeapBlockCount += QueryDepthInterlockedSList(allocableHeapBlockListHead); + } currentHeapBlockCount += HeapBlockList::Count(sweepableHeapBlockList); debugSweepableHeapBlockListLock.Leave(); } @@ -425,7 +451,7 @@ HeapBucketT::GetNonEmptyHeapBlockCount(bool checkCount) const #endif // There is no way to determine the number of item in an SLIST if there are >= 65535 items in the list. - RECYCLER_SLOW_CHECK(Assert(!checkCount || heapBlockCount == currentHeapBlockCount || allocatingDuringConcurrentSweep)); + RECYCLER_SLOW_CHECK(Assert(!checkCount || heapBlockCount == currentHeapBlockCount || (heapBlockCount >= 65535 && allocatingDuringConcurrentSweep))); return currentHeapBlockCount; } @@ -451,10 +477,12 @@ HeapBucketT::TryAlloc(Recycler * recycler, TBlockAllocatorType * all ClearAllocator(allocator); TBlockType * heapBlock = this->nextAllocableBlockHead; -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP -#if SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - bool heapBlockInSweepableList = false; - if (heapBlock == nullptr && CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if SUPPORT_WIN32_SLIST + bool heapBlockFromAllocableHeapBlockList = false; + DebugOnly(bool heapBlockInPendingSweepPrepList = false); + + if (heapBlock == nullptr && this->allocationsStartedDuringConcurrentSweep) { #if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) // This lock is needed only in the debug mode while we verify block counts. Not needed otherwise, as this list is never accessed concurrently. @@ -465,11 +493,35 @@ HeapBucketT::TryAlloc(Recycler * recycler, TBlockAllocatorType * all heapBlock = PopHeapBlockFromSList(this->allocableHeapBlockListHead); if (heapBlock != nullptr) { - // Put the block in the sweepable heap block list so we don't lose track of it. The block will eventually be moved to the - // heapBlockList or fullBlockList as appropriate during the next sweep. + Assert(!this->IsAnyFinalizableBucket()); + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + heapBlock->wasAllocatedFromDuringSweep = true; +#endif +#if DBG || defined(RECYCLER_TRACE) + if (heapBlock->isPendingConcurrentSweepPrep) + { + AssertMsg(heapBlock->objectsAllocatedDuringConcurrentSweepCount == 0, "We just picked up this block for allocations during concurrent sweep, we haven't allocated from it yet."); + +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this, heapBlock, _u("[**31**] pending Pass1 prep, picked up for allocations during concurrent sweep.")); +#endif + DebugOnly(heapBlockInPendingSweepPrepList = true); + } + else + { + // Put the block in the sweepable heap block list so we don't lose track of it. The block will eventually be moved to the + // heapBlockList or fullBlockList as appropriate during the next sweep. + AssertMsg(!HeapBlockList::Contains(heapBlock, sweepableHeapBlockList), "The heap block already exists in this list."); + +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this, heapBlock, _u("[**32**] picked up for allocations during concurrent sweep.")); +#endif + } +#endif heapBlock->SetNextBlock(sweepableHeapBlockList); sweepableHeapBlockList = heapBlock; - heapBlockInSweepableList = true; + heapBlockFromAllocableHeapBlockList = true; } #if DBG|| defined(RECYCLER_SLOW_CHECK_ENABLED) debugSweepableHeapBlockListLock.Leave(); @@ -482,12 +534,12 @@ HeapBucketT::TryAlloc(Recycler * recycler, TBlockAllocatorType * all { Assert(!this->IsAllocationStopped()); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST // When allocations are allowed during concurrent sweep we set nextAllocableBlockHead to NULL as the allocator will pick heap blocks from the // interlocked SLIST. During that time, the heap block at the top of the SLIST is always the nextAllocableBlockHead. // If the heapBlock was just picked from the SLIST and nextAllocableBlockHead is not NULL then we just resumed normal allocations on the background thread // while finishing the concurrent sweep, and the nextAllocableBlockHead is already set properly. - if (this->nextAllocableBlockHead != nullptr && !heapBlockInSweepableList) + if (this->nextAllocableBlockHead != nullptr && !heapBlockFromAllocableHeapBlockList) #endif { this->nextAllocableBlockHead = heapBlock->GetNextBlock(); @@ -546,6 +598,42 @@ HeapBucket::GetRecycler() const return this->heapInfo->recycler; } +bool +HeapBucket::AllocationsStartedDuringConcurrentSweep() const +{ +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + return this->allocationsStartedDuringConcurrentSweep; +#else + return false; +#endif +} + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +bool +HeapBucket::ConcurrentSweepAllocationsThresholdExceeded() const +{ + return this->concurrentSweepAllocationsThresholdExceeded; +} + +bool +HeapBucket::DoTwoPassConcurrentSweepPreCheck() +{ + this->concurrentSweepAllocationsThresholdExceeded = ((this->heapBlockCount + this->newHeapBlockCount) > RecyclerHeuristic::AllocDuringConcurrentSweepHeapBlockThreshold); + +#ifdef RECYCLER_TRACE + if (this->GetRecycler()->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + if (this->concurrentSweepAllocationsThresholdExceeded) + { + Output::Print(_u("[HeapBucket 0x%p] exceeded concurrent sweep allocations threshold (%d). Total heap block count: %d \n"), this, RecyclerHeuristic::AllocDuringConcurrentSweepHeapBlockThreshold, this->heapBlockCount + this->newHeapBlockCount); + } + } +#endif + + return this->concurrentSweepAllocationsThresholdExceeded; +} +#endif + #ifdef RECYCLER_PAGE_HEAP template char * @@ -587,11 +675,12 @@ HeapBucketT::SnailAlloc(Recycler * recycler, TBlockAllocatorType * a #endif AllocationVerboseTrace(recycler->GetRecyclerFlagsTable(), _u("TryAlloc failed, forced collection on allocation [Collected: %d]\n"), collected); + if (!collected) { #if ENABLE_CONCURRENT_GC - // wait for background sweeping finish if there are too many pages allocated during background sweeping #if ENABLE_PARTIAL_GC + // wait for background sweeping finish if there are too many pages allocated during background sweeping if (recycler->IsConcurrentSweepExecutingState() && this->heapInfo->uncollectedNewPageCount > (uint)CONFIG_FLAG(NewPagesCapDuringBGSweeping)) #else if (recycler->IsConcurrentSweepExecutingState()) @@ -605,6 +694,7 @@ HeapBucketT::SnailAlloc(Recycler * recycler, TBlockAllocatorType * a } } #endif + // We didn't collect, try to add a new heap block memBlock = TryAllocFromNewHeapBlock(recycler, allocator, sizeCat, size, attributes); if (memBlock != nullptr) @@ -665,12 +755,16 @@ HeapBucketT::GetUnusedHeapBlock() { // We couldn't find a reusable heap block heapBlock = TBlockType::New(this); - RECYCLER_SLOW_CHECK(Assert(this->emptyHeapBlockCount == 0)); +#if defined(RECYCLER_SLOW_CHECK_ENABLED) + Assert(this->emptyHeapBlockCount == 0); +#endif } else { emptyBlockList = heapBlock->GetNextBlock(); - RECYCLER_SLOW_CHECK(this->emptyHeapBlockCount--); +#if defined(RECYCLER_SLOW_CHECK_ENABLED) + this->emptyHeapBlockCount--; +#endif } return heapBlock; } @@ -696,7 +790,7 @@ HeapBucketT::CreateHeapBlock(Recycler * recycler) // Add it to head of heap block list so we will keep track of the block recycler->autoHeap.AppendNewHeapBlock(heapBlock, this); -#ifdef RECYCLER_SLOW_CHECK_ENABLED +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP #if ENABLE_CONCURRENT_GC ::InterlockedIncrement(&this->newHeapBlockCount); #else @@ -713,7 +807,9 @@ HeapBucketT::FreeHeapBlock(TBlockType * heapBlock) heapBlock->Reset(); heapBlock->SetNextBlock(emptyBlockList); emptyBlockList = heapBlock; - RECYCLER_SLOW_CHECK(this->emptyHeapBlockCount++); +#if defined(RECYCLER_SLOW_CHECK_ENABLED) + this->emptyHeapBlockCount++; +#endif } template @@ -743,8 +839,8 @@ HeapBucketT::ResetMarks(ResetMarkFlags flags) Assert(!heapBlock->HasFreeObject()); }); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { HeapBlockList::ForEach(sweepableHeapBlockList, [flags](TBlockType * heapBlock) { @@ -764,22 +860,25 @@ HeapBucketT::ResetMarks(ResetMarkFlags flags) { // When allocations are enabled for buckets during oncurrent sweep we don't keep track of the nextAllocableBlockHead as it directly // comes out of the SLIST. As a result, the below validations can't be performed reliably on a heap block. -#if !(ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP) - // Verify that if you are in the heapBlockList, before the nextAllocableBlockHead, we have fully allocated from - // the block already, except if we have cleared from the allocator, or it is still in the allocator - HeapBlockList::ForEach(heapBlockList, nextAllocableBlockHead, [](TBlockType * heapBlock) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) || this->IsAnyFinalizableBucket()) +#endif { - // If the heap block is in the allocator, then the heap block may or may not have free object still - // So we can't assert. Otherwise, we have free object iff we were cleared from allocator - Assert(heapBlock->IsInAllocator() || heapBlock->HasFreeObject() == heapBlock->IsClearedFromAllocator()); - }); + // Verify that if you are in the heapBlockList, before the nextAllocableBlockHead, we have fully allocated from + // the block already, except if we have cleared from the allocator, or it is still in the allocator + HeapBlockList::ForEach(heapBlockList, nextAllocableBlockHead, [](TBlockType * heapBlock) + { + // If the heap block is in the allocator, then the heap block may or may not have free object still + // So we can't assert. Otherwise, we have free object iff we were cleared from allocator + Assert(heapBlock->IsInAllocator() || heapBlock->HasFreeObject() == heapBlock->IsClearedFromAllocator()); + }); - // We should still have allocable free object after nextAllocableBlockHead - HeapBlockList::ForEach(nextAllocableBlockHead, [](TBlockType * heapBlock) - { - Assert(heapBlock->HasFreeObject()); - }); -#endif + // We should still have allocable free object after nextAllocableBlockHead + HeapBlockList::ForEach(nextAllocableBlockHead, [](TBlockType * heapBlock) + { + Assert(heapBlock->HasFreeObject()); + }); + } } #endif } @@ -793,8 +892,8 @@ HeapBucketT::ScanNewImplicitRoots(Recycler * recycler) heapBlock->ScanNewImplicitRoots(recycler); }); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { HeapBlockList::ForEach(sweepableHeapBlockList, [recycler](TBlockType * heapBlock) { @@ -841,13 +940,16 @@ HeapBucketT::VerifyBlockConsistencyInList(TBlockType * heapBlock, Re } if (heapBlock->IsClearedFromAllocator()) { - // As the blocks are added to a stack and used from there during concurrent sweep, the exepectFull assertion doesn't hold anymore. +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // As the blocks are added to a SLIST and used from there during concurrent sweep, the expectFull assertion doesn't hold anymore. // We could do some work to make this work again but there may be perf hit and it may be fragile. -#if !(ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP) - Assert(*expectFull && !*expectDispose); - Assert(heapBlock->HasFreeObject()); - Assert(!heapBlock->HasAnyDisposeObjects()); + if (!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) #endif + { + Assert(*expectFull && !*expectDispose); + Assert(heapBlock->HasFreeObject()); + Assert(!heapBlock->HasAnyDisposeObjects()); + } } else if (*expectDispose) { @@ -863,10 +965,13 @@ HeapBucketT::VerifyBlockConsistencyInList(TBlockType * heapBlock, Re // blocks before nextAllocableBlockHead that are not being bump allocated from must be considered "full". // However, the exception is if this is the only heap block in this bucket, in which case nextAllocableBlockHead // would be null -#if !(ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP) - // As the blocks are added to the SLIST and used from there during concurrent sweep, the exepectFull assertion doesn't hold anymore. - Assert(*expectFull == (!heapBlock->HasFreeObject() || heapBlock->IsInAllocator()) || nextAllocableBlockHead == nullptr); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // As the blocks are added to the SLIST and used from there during concurrent sweep, the expectFull assertion doesn't hold anymore. + if (!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) #endif + { + Assert(*expectFull == (!heapBlock->HasFreeObject() || heapBlock->IsInAllocator()) || nextAllocableBlockHead == nullptr); + } } } @@ -963,7 +1068,7 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock bool const queuePendingSweep = false; #endif -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP Assert(this->IsAllocationStopped() || this->AllocationsStartedDuringConcurrentSweep()); #else Assert(this->IsAllocationStopped()); @@ -974,6 +1079,9 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock // The whole list need to be consistent DebugOnly(VerifyBlockConsistencyInList(heapBlock, recyclerSweep)); +#ifdef RECYCLER_TRACE + recyclerSweep.GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**1**] starting Sweep Pass1.")); +#endif SweepState state = heapBlock->Sweep(recyclerSweep, queuePendingSweep, allocable); DebugOnly(VerifyBlockConsistencyInList(heapBlock, recyclerSweep, state)); @@ -987,8 +1095,14 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock // blocks that have swept object. Queue up the block for concurrent sweep. Assert(queuePendingSweep); TBlockType *& pendingSweepList = recyclerSweep.GetPendingSweepBlockList(this); + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + AssertMsg(!HeapBlockList::Contains(heapBlock, pendingSweepList), "The heap block already exists in the pendingSweepList."); + heapBlock->SetNextBlock(pendingSweepList); pendingSweepList = heapBlock; +#ifdef RECYCLER_TRACE + recyclerSweep.GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**2**] finished Sweep Pass1, heapblock added to pendingSweepList.")); +#endif #if ENABLE_PARTIAL_GC recyclerSweep.NotifyAllocableObjects(heapBlock); #endif @@ -1003,6 +1117,12 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock #else Assert(IsFinalizableBucket); #endif +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + AssertMsg(!heapBlock->isPendingConcurrentSweepPrep, "Finalizable blocks don't support allocations during concurrent sweep."); + } +#endif DebugOnly(heapBlock->template AsFinalizableBlock()->SetIsPendingDispose()); @@ -1013,18 +1133,56 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock // finalizable objects, so that we can go through and call the dispose, and then // transfer the finalizable object back to the free list. SmallFinalizableHeapBucketT * finalizableHeapBucket = (SmallFinalizableHeapBucketT*)this; + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + //AssertMsg(!HeapBlockList::Contains(heapBlock, finalizableHeapBucket->pendingDisposeList), "The heap block already exists in the pendingDisposeList."); heapBlock->template AsFinalizableBlock()->SetNextBlock(finalizableHeapBucket->pendingDisposeList); finalizableHeapBucket->pendingDisposeList = heapBlock->template AsFinalizableBlock(); Assert(!recycler->hasPendingTransferDisposedObjects); recycler->hasDisposableObject = true; +#ifdef RECYCLER_TRACE + recyclerSweep.GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**3**] finished Sweep Pass1, heapblock added to pendingDisposeList.")); +#endif break; } case SweepStateSwept: { Assert(this->nextAllocableBlockHead == nullptr); Assert(heapBlock->HasFreeObject()); - heapBlock->SetNextBlock(this->heapBlockList); - this->heapBlockList = heapBlock; + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (this->AllocationsStartedDuringConcurrentSweep()) + { + Assert(!this->IsAnyFinalizableBucket()); + Assert(!heapBlock->isPendingConcurrentSweepPrep); + bool blockAddedToSList = HeapBucketT::PushHeapBlockToSList(this->allocableHeapBlockListHead, heapBlock); + + // If we encountered OOM while pushing the heapBlock to the SLIST we must add it to the heapBlockList so we don't lose track of it. + if (!blockAddedToSList) + { + //TODO: akatti: We should handle this gracefully and try to recover from this state. + AssertOrFailFastMsg(false, "OOM while adding a heap block to the SLIST during concurrent sweep."); + } +#ifdef RECYCLER_TRACE + else + { + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**4**] swept and added to SLIST allocableHeapBlockListHead during Pass1.")); + } +#endif + } + else +#endif + { +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + AssertMsg(!this->AllowAllocationsDuringConcurrentSweep(), "Why are allocations not started during concurrent sweep?"); +#endif + heapBlock->SetNextBlock(this->heapBlockList); + this->heapBlockList = heapBlock; + } + +#ifdef RECYCLER_TRACE + recyclerSweep.GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**6**] finished Sweep Pass1, heapblock added to heapBlockList.")); +#endif #if ENABLE_PARTIAL_GC recyclerSweep.NotifyAllocableObjects(heapBlock); #endif @@ -1033,8 +1191,12 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock case SweepStateFull: { Assert(!heapBlock->HasFreeObject()); + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); heapBlock->SetNextBlock(this->fullBlockList); this->fullBlockList = heapBlock; +#ifdef RECYCLER_TRACE + recyclerSweep.GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**7**] finished Sweep Pass1, heapblock FULL added to fullBlockList.")); +#endif break; } case SweepStateEmpty: @@ -1053,6 +1215,14 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock #if ENABLE_CONCURRENT_GC // CONCURRENT-TODO: Finalizable block never have background == true and always be processed // in thread, so it will not queue up the pages even if we are doing concurrent GC + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + AssertMsg(heapBlock->objectsAllocatedDuringConcurrentSweepCount == 0, "We allocated to this block during concurrent sweep; it's not EMPTY anymore, it should NOT be freed or queued as EMPTY."); + } +#endif + if (recyclerSweep.IsBackground()) { #ifdef RECYCLER_WRITE_BARRIER @@ -1064,6 +1234,9 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock // the maximum and will get decommitted anyway recyclerSweep.template QueueEmptyHeapBlock(this, heapBlock); RECYCLER_STATS_INC(recycler, numZeroedOutSmallBlocks); +#ifdef RECYCLER_TRACE + recyclerSweep.GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**8**] finished Sweep Pass1, heapblock EMPTY added to pendingEmptyBlockList.")); +#endif } else #endif @@ -1071,7 +1244,12 @@ HeapBucketT::SweepHeapBlockList(RecyclerSweep& recyclerSweep, TBlock // Just free the page in thread (and zero the page) heapBlock->ReleasePagesSweep(recycler); FreeHeapBlock(heapBlock); - RECYCLER_SLOW_CHECK(this->heapBlockCount--); +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + this->heapBlockCount--; +#endif +#ifdef RECYCLER_TRACE + recyclerSweep.GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**9**] finished Sweep Pass1, heapblock EMPTY, was FREED in-thread.")); +#endif } break; @@ -1108,18 +1286,34 @@ HeapBucketT::SweepBucket(RecyclerSweep& recyclerSweep) Assert(!recyclerSweep.IsBackground()); #endif -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && this->sweepableHeapBlockList != nullptr) { - // Return the blocks we may have allocated from during a previous concurrent sweep back to the fullBlockList. We need to rebuild the free bit vectors for these blocks. + Assert(!this->IsAnyFinalizableBucket()); + +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + // This lock is needed only in the debug mode while we verify block counts. Not needed otherwise, as this list is never accessed concurrently. + // Items are added to it by the allocator when allocations are allowed during concurrent sweep. The list is drained during the next sweep while + // allocation are stopped. + debugSweepableHeapBlockListLock.Enter(); +#endif + // Return the blocks we may have allocated from during the previous concurrent sweep back to the fullBlockList. + // We need to rebuild the free bit vectors for these blocks. HeapBlockList::ForEachEditing(this->sweepableHeapBlockList, [this](TBlockType * heapBlock) { heapBlock->BuildFreeBitVector(); + + AssertMsg(!HeapBlockList::Contains(heapBlock, heapBlockList), "The heap block already exists in the heapBlockList."); + AssertMsg(!HeapBlockList::Contains(heapBlock, fullBlockList), "The heap block already exists in the fullBlockList."); + AssertMsg(!HeapBlockList::Contains(heapBlock, emptyBlockList), "The heap block already exists in the emptyBlockList."); + heapBlock->SetNextBlock(this->fullBlockList); this->fullBlockList = heapBlock; }); - this->sweepableHeapBlockList = nullptr; +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + debugSweepableHeapBlockListLock.Leave(); +#endif } #endif @@ -1144,6 +1338,13 @@ HeapBucketT::SweepBucket(RecyclerSweep& recyclerSweep) this->heapBlockList = nullptr; this->fullBlockList = nullptr; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // In order to allow allocations during sweep (Pass-1) we will set aside blocks after nextAllocableBlockHead (excluding) and allow + // allocations to these blocks as we know that these blocks are not full yet. These will need to be swept later though before starting Pass-2 + // of the sweep. + this->PrepareForAllocationsDuringConcurrentSweep(currentHeapBlockList); +#endif + this->SweepHeapBlockList(recyclerSweep, currentHeapBlockList, true); #if DBG @@ -1171,13 +1372,13 @@ template bool HeapBucketT::AllowAllocationsDuringConcurrentSweep() { -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP - if (!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + Recycler * recycler = this->GetRecycler(); + if (!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) || !recycler->AllowAllocationsDuringConcurrentSweep() || !this->concurrentSweepAllocationsThresholdExceeded) { return false; } - Recycler * recycler = this->GetRecycler(); #if ENABLE_PARTIAL_GC bool isPartialGC = (recycler->recyclerSweep != nullptr) && recycler->recyclerSweep->InPartialCollect(); #else @@ -1195,8 +1396,11 @@ template void HeapBucketT::StopAllocationBeforeSweep() { -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP this->allocationsStartedDuringConcurrentSweep = false; +#if SUPPORT_WIN32_SLIST + this->lastKnownNextAllocableBlockHead = this->nextAllocableBlockHead; +#endif #endif Assert(!this->IsAllocationStopped()); @@ -1213,20 +1417,25 @@ HeapBucketT::StartAllocationAfterSweep() this->nextAllocableBlockHead = this->heapBlockList; } -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP template void HeapBucketT::StartAllocationDuringConcurrentSweep() { + Recycler * recycler = this->GetRecycler(); + Assert(!recycler->recyclerSweep->InPartialCollect()); + Assert(!this->IsAnyFinalizableBucket()); + Assert(this->IsAllocationStopped()); this->isAllocationStopped = false; Assert(!this->allocationsStartedDuringConcurrentSweep); this->allocationsStartedDuringConcurrentSweep = true; -#if SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if SUPPORT_WIN32_SLIST // When allocations are allowed during concurrent sweep we set nextAllocableBlockHead to NULL as the allocator will pick heap blocks from the // interlocked SLIST. During that time, the heap block at the top of the SLIST is always the nextAllocableBlockHead. this->nextAllocableBlockHead = nullptr; + this->lastKnownNextAllocableBlockHead = nullptr; #endif } @@ -1240,11 +1449,109 @@ HeapBucketT::ResumeNormalAllocationAfterConcurrentSweep(TBlockType * this->nextAllocableBlockHead = newNextAllocableBlockHead; } -template -bool -HeapBucketT::AllocationsStartedDuringConcurrentSweep() const +/*////////////////////////////////////////////////////////////////////////////////////////////////////// +If allocations are to be allowed to existing heap blocks during concurrent sweep, we set aside a few +heap blocks from the heapBlockList prior to beginning sweep. However, we eed to then go back and make +sure these blocks also swept before this sweep finishes. In order to do this we clearly define concurrent +sweep having 2 passes now. These passes existed before but were not distiguished as they would always start +and finish in one go on the background thread. However, whenever allocations are allowed during concurrent +sweep; the concurrent sweep will start Pass1 on the background thread, wait to finish Pass1 of the blocks +we set aside to allocate from on the main thread and then go back to finish Pass2 for all heap blocks on +the background thread. Note that, due to this need to finish Pass1 on the foreground thread the overall +background sweep will now appear to take longer whenever we chose to do such a two-pass sweep. + +The sequence of things we do to allow allocations during concurrent sweep is described below: +1. At the beginning of concurrrent sweep we decide if we will benefit from allowing allocations during concurrent +sweep for any of the buckets. If there is at-least one bucket for which we think we will benefit we will turn on +allocations during concurrent sweep. Once turned on we will attempt to enable allocations during concurrent sweep +for all supported buckets (i.e. small/medium, normal/leaf, non-finalizable buckets.write barrrier bickets are supported +as well.). +2. If allocations are turned on during concurrent sweep, we will see if there are any allocable blocks in the +heapBlockList after the nextAllocableBlockHead. If we find any such blocks, we move them to a SLIST that the +allocator can pick these blocks from during sweep. +3. CollectionStateConcurrentSweepPass1: We will finish Pass1 of the sweep for all the remaining blocks (other than the +ones we put in the SLIST in step 2 above) This will generally happen on the background thread unless we are forcing +in-thread sweep. This state is now specifically identified as CollectionStateConcurrentSweepPass1. +4. CollectionStateConcurrentSweepPass1Wait: At this point we need to wait for all the blocks that we put in the SLIST +to also finish the Pass1 of the sweep. This needs to happen on the foreground thread so we prevent the allocator from +picking up the blocks from SLIST while we do this. This state is now identified as CollectionStateConcurrentSweepPass1Wait. +5. CollectionStateConcurrentSweepPass2: At this point we will do the actual sweeping of all the blocks that are not yet swept, +for eaxample, any blocks that were put onto the pendingSweepList. As these blocks get swept we keep adding them to the +SLIST again to allow allocators to allocate from them as soon as they are swept. +6. Before the Pass2 can finish we can call this concurrent sweep done we need to move all the blocks off of the SLIST so +that normal allocations can begin after the sweep. This is the last step of the concurrent sweep. +//////////////////////////////////////////////////////////////////////////////////////////////////////*/ +template +void +HeapBucketT::PrepareForAllocationsDuringConcurrentSweep(TBlockType * ¤tHeapBlockList) { - return this->allocationsStartedDuringConcurrentSweep; +#if SUPPORT_WIN32_SLIST + if (this->AllowAllocationsDuringConcurrentSweep()) + { + this->EnsureAllocableHeapBlockList(); + + Assert(!this->IsAnyFinalizableBucket()); + Assert(HeapBucketT::QueryDepthInterlockedSList(this->allocableHeapBlockListHead) == 0); + Assert(HeapBlockList::Count(this->sweepableHeapBlockList) == 0); + + TBlockType* startingNextAllocableBlockHead = this->lastKnownNextAllocableBlockHead; + bool allocationsStarted = false; + if (startingNextAllocableBlockHead != nullptr) + { + // To avoid a race condition between the allocator attempting to allocate from the lastKnownNextAllocableBlockHead and this code + // where we are adding it to the SLIST we skip the lastKnownNextAllocableBlockHead and pick up the next block to start with. + // Allocations should have stopped by then; so allocator shouldn't pick up the lastKnownNextAllocableBlockHead->Next block. + TBlockType* savedNextAllocableBlockHead = startingNextAllocableBlockHead->GetNextBlock(); + startingNextAllocableBlockHead->SetNextBlock(nullptr); + startingNextAllocableBlockHead = savedNextAllocableBlockHead; + + if (startingNextAllocableBlockHead != nullptr) + { + // The allocable blocks, if any are available, will now be added to the allocable blocks SLIST at this time; start allocations now. + this->StartAllocationDuringConcurrentSweep(); + allocationsStarted = true; + + HeapBlockList::ForEachEditing(startingNextAllocableBlockHead, [this, &allocationsStarted](TBlockType * heapBlock) + { + // This heap block is NOT ready to be swept concurrently as it hasn't yet been through sweep prep (i.e. Pass1 of sweep). + heapBlock->isPendingConcurrentSweepPrep = true; + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + bool blockAddedToSList = HeapBucketT::PushHeapBlockToSList(this->allocableHeapBlockListHead, heapBlock); + + // If we encountered OOM while pushing the heapBlock to the SLIST we must add it to the heapBlockList so we don't lose track of it. + if (!blockAddedToSList) + { + //TODO: akatti: We should handle this gracefully and try to recover from this state. + AssertOrFailFastMsg(false, "OOM while adding a heap block to the SLIST during concurrent sweep."); + } + else + { +#ifdef RECYCLER_TRACE + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**5**] added to SLIST before Pass1.")); +#endif + } + }); +#ifdef RECYCLER_TRACE + if (this->GetRecycler()->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + size_t currentHeapBlockCount = QueryDepthInterlockedSList(allocableHeapBlockListHead); + Output::Print(_u("[GC #%d] [HeapBucket 0x%p] Starting allocations during concurrent sweep with %d blocks. [CollectionState: %d] \n"), this->GetRecycler()->collectionCount, this, currentHeapBlockCount, this->GetRecycler()->collectionState); + Output::Print(_u("[GC #%d] [HeapBucket 0x%p] The heapBlockList has %d blocks. Total heapBlockCount is %d.\n\n"), this->GetRecycler()->collectionCount, this, HeapBlockList::Count(this->heapBlockList), this->heapBlockCount); + } +#endif + } + } + + if (!allocationsStarted) + { + // If we didn't start allocations yet, start them now in anticipation of blocks becoming available later as blocks complete sweep. + this->StartAllocationDuringConcurrentSweep(); + allocationsStarted = true; + } + + Assert(!this->IsAllocationStopped()); + } +#endif } #endif @@ -1292,8 +1599,10 @@ HeapBucketT::MergeNewHeapBlock(TBlockType * heapBlock) Assert(heapBlock->GetObjectSize() == this->sizeCat); heapBlock->SetNextBlock(this->heapBlockList); this->heapBlockList = heapBlock; - RECYCLER_SLOW_CHECK(::InterlockedDecrement(&this->newHeapBlockCount)); - RECYCLER_SLOW_CHECK(this->heapBlockCount++); +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + ::InterlockedDecrement(&this->newHeapBlockCount); + this->heapBlockCount++; +#endif } template @@ -1314,30 +1623,194 @@ HeapBucketT::SetupBackgroundSweep(RecyclerSweep& recyclerSweep) #endif #if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +template +void +HeapBucketT::FinishConcurrentSweepPass1(RecyclerSweep& recyclerSweep) +{ + if (this->concurrentSweepAllocationsThresholdExceeded) + { + AssertMsg(this->AllowAllocationsDuringConcurrentSweep(), "Why are we in two pass concurrent sweep?"); + Assert(!this->IsAnyFinalizableBucket()); + + // Rebuild the free bit vectors for the blocks we allocated from during concurrent sweep. + TBlockType * currentPendingSweepPrepHeapBlockList = nullptr; + TBlockType * currentSweepableHeapBlockList = this->sweepableHeapBlockList; + this->sweepableHeapBlockList = nullptr; + + HeapBlockList::ForEachEditing(currentSweepableHeapBlockList, [this, ¤tPendingSweepPrepHeapBlockList](TBlockType * heapBlock) + { + if (heapBlock->isPendingConcurrentSweepPrep) + { + ushort previousFreeCount = heapBlock->freeCount; + heapBlock->BuildFreeBitVector(); + +#if ENABLE_PARTIAL_GC + heapBlock->oldFreeCount = heapBlock->lastFreeCount = heapBlock->freeCount; +#else + heapBlock->lastFreeCount = heapBlock->freeCount; +#endif + ushort newAllocatedObjects = previousFreeCount - heapBlock->freeCount; + AssertMsg(newAllocatedObjects == heapBlock->objectsMarkedDuringSweep, "The counts of objects allocated during sweep should match the objects marked during sweep."); +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + heapBlock->objectsAllocatedDuringConcurrentSweepCount = newAllocatedObjects; +#endif + + ushort currentMarkCount = (ushort)heapBlock->GetMarkCountForSweep(); + heapBlock->markCount = currentMarkCount; +#if DBG + heapBlock->GetRecycler()->heapBlockMap.SetPageMarkCount(heapBlock->GetAddress(), currentMarkCount); +#endif +#ifdef RECYCLER_TRACE + heapBlock->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**13**] ending sweep Pass1, rebuilt free bit vector and set page mark count to match.")); +#endif + + heapBlock->SetNextBlock(currentPendingSweepPrepHeapBlockList); + currentPendingSweepPrepHeapBlockList = heapBlock; + } + else + { + heapBlock->SetNextBlock(this->sweepableHeapBlockList); + this->sweepableHeapBlockList = heapBlock; + } + }); + +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + // This lock is needed only in the debug mode while we verify block counts. Not needed otherwise, as this list is never accessed concurrently. + // Items are added to it by the allocator when allocations are allowed during concurrent sweep. The list is drained during the next sweep while + // allocation are stopped. + debugSweepableHeapBlockListLock.Enter(); +#endif + + // Pull the blocks from the allocable SLIST that we didn't use. We need to finish the Pass-1 sweep of these blocks too. + TBlockType * heapBlock = PopHeapBlockFromSList(this->allocableHeapBlockListHead); + while (heapBlock != nullptr) + { + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + if (heapBlock->isPendingConcurrentSweepPrep) + { +#ifdef RECYCLER_TRACE + heapBlock->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**19**] ending sweep Pass1, removed from SLIST.")); +#endif + heapBlock->SetNextBlock(currentPendingSweepPrepHeapBlockList); + currentPendingSweepPrepHeapBlockList = heapBlock; + } + else + { +#ifdef RECYCLER_TRACE + heapBlock->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**23**] ending sweep Pass1, removed from SLIST and added to sweepableHeapBlockList.")); +#endif + // Already swept, put it back to the sweepableHeapBlockList list; so it can be processed later. + heapBlock->SetNextBlock(this->sweepableHeapBlockList); + this->sweepableHeapBlockList = heapBlock; + } + + heapBlock = PopHeapBlockFromSList(this->allocableHeapBlockListHead); + } + Assert(QueryDepthInterlockedSList(this->allocableHeapBlockListHead) == 0); + +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + debugSweepableHeapBlockListLock.Leave(); +#endif + +#if DBG + if (TBlockType::HeapBlockAttributes::IsSmallBlock) + { + recyclerSweep.SetupVerifyListConsistencyDataForSmallBlock(nullptr, true, false); + } + else if (TBlockType::HeapBlockAttributes::IsMediumBlock) + { + recyclerSweep.SetupVerifyListConsistencyDataForMediumBlock(nullptr, true, false); + } + else + { + Assert(false); + } +#endif + + // Start allocations now as we may start adding blocks to the SLIST during Pass1 sweep below. + this->StartAllocationDuringConcurrentSweep(); + this->SweepHeapBlockList(recyclerSweep, currentPendingSweepPrepHeapBlockList, true /*allocable*/); + } +} + template void -HeapBucketT::FinishConcurrentSweep() +HeapBucketT::EnsureAllocableHeapBlockList() { -#if SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - Assert(this->allocableHeapBlockListHead != nullptr); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + if (allocableHeapBlockListHead == nullptr) + { + allocableHeapBlockListHead = ((PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT)); + + if (allocableHeapBlockListHead == nullptr) + { + this->heapInfo->recycler->OutOfMemory(); + } + else + { + ::InitializeSListHead(allocableHeapBlockListHead); + } + } + } +#endif +} - TBlockType * newNextAllocableBlockHead = nullptr; - // Put the blocks from the allocable SLIST into the heapBlockList. - TBlockType * heapBlock = PopHeapBlockFromSList(this->allocableHeapBlockListHead); - while (heapBlock != nullptr) +template +void +HeapBucketT::FinishSweepPrep(RecyclerSweep& recyclerSweep) +{ + if (this->AllocationsStartedDuringConcurrentSweep()) { - newNextAllocableBlockHead = heapBlock; - heapBlock->SetNextBlock(this->heapBlockList); - this->heapBlockList = heapBlock; - heapBlock = PopHeapBlockFromSList(this->allocableHeapBlockListHead); + AssertMsg(this->AllowAllocationsDuringConcurrentSweep(), "Why are allocations started during concurrent sweep, if not allowed?"); + Assert(!this->IsAnyFinalizableBucket()); + + this->StopAllocationBeforeSweep(); + this->ClearAllocators(); } +} - Assert(QueryDepthInterlockedSList(this->allocableHeapBlockListHead) == 0); +template +void +HeapBucketT::FinishConcurrentSweep() +{ + if (this->AllocationsStartedDuringConcurrentSweep()) + { +#if SUPPORT_WIN32_SLIST + Assert(!this->IsAnyFinalizableBucket()); + Assert(this->allocableHeapBlockListHead != nullptr); - this->ResumeNormalAllocationAfterConcurrentSweep(newNextAllocableBlockHead); +#ifdef RECYCLER_TRACE + if (this->GetRecycler()->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + Output::Print(_u("[GC #%d] [HeapBucket 0x%p] starting FinishConcurrentSweep [CollectionState: %d] \n"), this->GetRecycler()->collectionCount, this, this->GetRecycler()->collectionState); + } #endif - Assert(!this->IsAllocationStopped()); + TBlockType * newNextAllocableBlockHead = nullptr; + // Put the blocks from the allocable SLIST into the heapBlockList. + TBlockType * heapBlock = PopHeapBlockFromSList(this->allocableHeapBlockListHead); + while (heapBlock != nullptr) + { + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + AssertMsg(!heapBlock->isPendingConcurrentSweepPrep, "The blocks in the SLIST at this time should NOT have sweep prep i.e. sweep-Pass1 pending."); + newNextAllocableBlockHead = heapBlock; + heapBlock->SetNextBlock(this->heapBlockList); + this->heapBlockList = heapBlock; +#ifdef RECYCLER_TRACE + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**40**] finished FinishConcurrentSweep, heapblock removed from SLIST and added to heapBlockList.")); +#endif + heapBlock = PopHeapBlockFromSList(this->allocableHeapBlockListHead); + } + + Assert(QueryDepthInterlockedSList(this->allocableHeapBlockListHead) == 0); + + this->ResumeNormalAllocationAfterConcurrentSweep(newNextAllocableBlockHead); +#endif + + Assert(!this->IsAllocationStopped()); + } } #endif @@ -1345,6 +1818,12 @@ template void HeapBucketT::AppendAllocableHeapBlockList(TBlockType * list) { +#ifdef RECYCLER_TRACE + if (this->GetRecycler()->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + Output::Print(_u("[GC #%d] [HeapBucket 0x%p] in AppendAllocableHeapBlockList [CollectionState: %d] \n"), this->GetRecycler()->collectionCount, this, this->GetRecycler()->collectionState); + } +#endif // Add the list to the end of the current list TBlockType * currentHeapBlockList = this->heapBlockList; if (currentHeapBlockList == nullptr) @@ -1355,7 +1834,7 @@ HeapBucketT::AppendAllocableHeapBlockList(TBlockType * list) } else { - // Find the last block and append the pendingSwpetList + // Find the last block and append the list TBlockType * tail = HeapBlockList::Tail(currentHeapBlockList); Assert(tail != nullptr); tail->SetNextBlock(list); @@ -1375,8 +1854,8 @@ HeapBucketT::EnumerateObjects(ObjectInfoBits infoBits, void (*CallBa { UpdateAllocators(); HeapBucket::EnumerateObjects(fullBlockList, infoBits, CallBackFunction); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { HeapBucket::EnumerateObjects(sweepableHeapBlockList, infoBits, CallBackFunction); } @@ -1404,9 +1883,11 @@ HeapBucketT::Check(bool checkCount) Assert(this->GetRecycler()->recyclerSweep == nullptr); UpdateAllocators(); size_t smallHeapBlockCount = HeapInfo::Check(true, false, this->fullBlockList); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + bool allocatingDuringConcurrentSweep = false; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { + allocatingDuringConcurrentSweep = true; // This lock is needed only in the debug mode while we verify block counts. Not needed otherwise, as this list is never accessed concurrently. // Items are added to it by the allocator when allocations are allowed during concurrent sweep. The list is drained during the next sweep while // allocation are stopped. @@ -1417,16 +1898,18 @@ HeapBucketT::Check(bool checkCount) #endif smallHeapBlockCount += HeapInfo::Check(true, false, this->heapBlockList, this->nextAllocableBlockHead); smallHeapBlockCount += HeapInfo::Check(false, false, this->nextAllocableBlockHead); - Assert(!checkCount || this->heapBlockCount == smallHeapBlockCount); + Assert(!checkCount || this->heapBlockCount == smallHeapBlockCount || (this->heapBlockCount >= 65535 && allocatingDuringConcurrentSweep)); return smallHeapBlockCount; } #endif -#ifdef DUMP_FRAGMENTATION_STATS +#if ENABLE_MEM_STATS template void -HeapBucketT::AggregateBucketStats(HeapBucketStats& stats) +HeapBucketT::AggregateBucketStats() { + HeapBucket::AggregateBucketStats(); // call super + auto allocatorHead = &this->allocatorHead; auto allocatorCurr = allocatorHead; @@ -1435,19 +1918,18 @@ HeapBucketT::AggregateBucketStats(HeapBucketStats& stats) TBlockType* allocatorHeapBlock = allocatorCurr->GetHeapBlock(); if (allocatorHeapBlock) { - allocatorHeapBlock->AggregateBlockStats(stats, true, allocatorCurr->freeObjectList, allocatorCurr->endAddress != 0); + allocatorHeapBlock->AggregateBlockStats(this->memStats, true, allocatorCurr->freeObjectList, allocatorCurr->endAddress != 0); } allocatorCurr = allocatorCurr->GetNext(); } while (allocatorCurr != allocatorHead); - auto blockStatsAggregator = [&stats](TBlockType* heapBlock) { - heapBlock->AggregateBlockStats(stats); + auto blockStatsAggregator = [this](TBlockType* heapBlock) { + heapBlock->AggregateBlockStats(this->memStats); }; - HeapBlockList::ForEach(emptyBlockList, blockStatsAggregator); HeapBlockList::ForEach(fullBlockList, blockStatsAggregator); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { HeapBlockList::ForEach(sweepableHeapBlockList, blockStatsAggregator); } @@ -1485,8 +1967,8 @@ HeapBucketT::Verify() heapBlock->Verify(); }); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { #if DBG if (TBlockType::HeapBlockAttributes::IsSmallBlock) @@ -1560,8 +2042,8 @@ HeapBucketT::VerifyMark() heapBlock->VerifyMark(); }); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { HeapBlockList::ForEach(this->sweepableHeapBlockList, [](TBlockType * heapBlock) { @@ -1588,6 +2070,9 @@ HeapBucketGroup::Initialize(HeapInfo * heapInfo, uint sizeCat) smallFinalizableWithBarrierHeapBucket.Initialize(heapInfo, sizeCat); #endif finalizableHeapBucket.Initialize(heapInfo, sizeCat); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.Initialize(heapInfo, sizeCat); +#endif } template @@ -1604,6 +2089,9 @@ HeapBucketGroup::ResetMarks(ResetMarkFlags flags) // Although we pass in premarkFreeObjects, the finalizable heap bucket ignores // this parameter and never pre-marks free objects finalizableHeapBucket.ResetMarks(flags); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.ResetMarks(flags); +#endif } template @@ -1651,6 +2139,9 @@ void HeapBucketGroup::SweepFinalizableObjects(RecyclerSweep& recyclerSweep) { finalizableHeapBucket.Sweep(recyclerSweep); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.Sweep(recyclerSweep); +#endif #ifdef RECYCLER_WRITE_BARRIER smallFinalizableWithBarrierHeapBucket.Sweep(recyclerSweep); #endif @@ -1661,6 +2152,9 @@ void HeapBucketGroup::DisposeObjects() { finalizableHeapBucket.DisposeObjects(); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.DisposeObjects(); +#endif #ifdef RECYCLER_WRITE_BARRIER smallFinalizableWithBarrierHeapBucket.DisposeObjects(); #endif @@ -1671,6 +2165,9 @@ void HeapBucketGroup::TransferDisposedObjects() { finalizableHeapBucket.TransferDisposedObjects(); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.TransferDisposedObjects(); +#endif #ifdef RECYCLER_WRITE_BARRIER smallFinalizableWithBarrierHeapBucket.TransferDisposedObjects(); #endif @@ -1687,6 +2184,9 @@ HeapBucketGroup::EnumerateObjects(ObjectInfoBits infoBits, voi smallFinalizableWithBarrierHeapBucket.EnumerateObjects(infoBits, CallBackFunction); #endif finalizableHeapBucket.EnumerateObjects(infoBits, CallBackFunction); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.EnumerateObjects(infoBits, CallBackFunction); +#endif } template @@ -1694,6 +2194,9 @@ void HeapBucketGroup::FinalizeAllObjects() { finalizableHeapBucket.FinalizeAllObjects(); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.FinalizeAllObjects(); +#endif #ifdef RECYCLER_WRITE_BARRIER smallFinalizableWithBarrierHeapBucket.FinalizeAllObjects(); #endif @@ -1708,6 +2211,9 @@ HeapBucketGroup::Rescan(Recycler * recycler, RescanFlags flags #ifdef RECYCLER_WRITE_BARRIER smallNormalWithBarrierHeapBucket.Rescan(recycler, flags) + smallFinalizableWithBarrierHeapBucket.Rescan(recycler, flags) + +#endif +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.Rescan(recycler, flags) + #endif finalizableHeapBucket.Rescan(recycler, flags); } @@ -1724,6 +2230,9 @@ HeapBucketGroup::PrepareSweep() smallFinalizableWithBarrierHeapBucket.PrepareSweep(); #endif finalizableHeapBucket.PrepareSweep(); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.PrepareSweep(); +#endif } template @@ -1752,6 +2261,9 @@ HeapBucketGroup::SweepPartialReusePages(RecyclerSweep& recycle #endif finalizableHeapBucket.SweepPartialReusePages(recyclerSweep); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.SweepPartialReusePages(recyclerSweep); +#endif } template @@ -1764,6 +2276,9 @@ HeapBucketGroup::FinishPartialCollect(RecyclerSweep * recycler smallFinalizableWithBarrierHeapBucket.FinishPartialCollect(recyclerSweep); #endif finalizableHeapBucket.FinishPartialCollect(recyclerSweep); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.FinishPartialCollect(recyclerSweep); +#endif // Leaf heap block always do a full sweep instead of partial sweep // (since touching the page doesn't affect rescan) @@ -1790,6 +2305,9 @@ HeapBucketGroup::SweepPendingObjects(RecyclerSweep& recyclerSw #endif finalizableHeapBucket.SweepPendingObjects(recyclerSweep); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.SweepPendingObjects(recyclerSweep); +#endif } template @@ -1803,6 +2321,9 @@ HeapBucketGroup::TransferPendingEmptyHeapBlocks(RecyclerSweep& recyclerSweep.TransferPendingEmptyHeapBlocks(&smallFinalizableWithBarrierHeapBucket); #endif recyclerSweep.TransferPendingEmptyHeapBlocks(&finalizableHeapBucket); +#ifdef RECYCLER_VISITED_HOST + recyclerSweep.TransferPendingEmptyHeapBlocks(&recyclerVisitedHostHeapBucket); +#endif } #endif @@ -1813,6 +2334,9 @@ HeapBucketGroup::GetNonEmptyHeapBlockCount(bool checkCount) co { return heapBucket.GetNonEmptyHeapBlockCount(checkCount) + finalizableHeapBucket.GetNonEmptyHeapBlockCount(checkCount) + +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.GetNonEmptyHeapBlockCount(checkCount) + +#endif #ifdef RECYCLER_WRITE_BARRIER smallNormalWithBarrierHeapBucket.GetNonEmptyHeapBlockCount(checkCount) + smallFinalizableWithBarrierHeapBucket.GetNonEmptyHeapBlockCount(checkCount) + @@ -1826,6 +2350,9 @@ HeapBucketGroup::GetEmptyHeapBlockCount() const { return heapBucket.GetEmptyHeapBlockCount() + finalizableHeapBucket.GetEmptyHeapBlockCount() + +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.GetEmptyHeapBlockCount() + +#endif #ifdef RECYCLER_WRITE_BARRIER smallNormalWithBarrierHeapBucket.GetEmptyHeapBlockCount() + smallFinalizableWithBarrierHeapBucket.GetEmptyHeapBlockCount() + @@ -1840,6 +2367,9 @@ size_t HeapBucketGroup::Check() { return heapBucket.Check() + finalizableHeapBucket.Check() + leafHeapBucket.Check() +#ifdef RECYCLER_VISITED_HOST + + recyclerVisitedHostHeapBucket.Check() +#endif #ifdef RECYCLER_WRITE_BARRIER + smallNormalWithBarrierHeapBucket.Check() + smallFinalizableWithBarrierHeapBucket.Check() #endif @@ -1853,6 +2383,9 @@ HeapBucketGroup::Verify() { heapBucket.Verify(); finalizableHeapBucket.Verify(); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.Verify(); +#endif leafHeapBucket.Verify(); #ifdef RECYCLER_WRITE_BARRIER smallNormalWithBarrierHeapBucket.Verify(); @@ -1867,6 +2400,9 @@ HeapBucketGroup::VerifyMark() { heapBucket.VerifyMark(); finalizableHeapBucket.VerifyMark(); +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostHeapBucket.VerifyMark(); +#endif leafHeapBucket.VerifyMark(); #ifdef RECYCLER_WRITE_BARRIER smallNormalWithBarrierHeapBucket.VerifyMark(); @@ -1875,7 +2411,7 @@ HeapBucketGroup::VerifyMark() } #endif -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP template void HeapBucketGroup::StartAllocationDuringConcurrentSweep() @@ -1898,6 +2434,42 @@ HeapBucketGroup::StartAllocationDuringConcurrentSweep() #endif } +template +bool +HeapBucketGroup::DoTwoPassConcurrentSweepPreCheck() +{ + return heapBucket.DoTwoPassConcurrentSweepPreCheck() || + leafHeapBucket.DoTwoPassConcurrentSweepPreCheck() + +#ifdef RECYCLER_WRITE_BARRIER + || smallNormalWithBarrierHeapBucket.DoTwoPassConcurrentSweepPreCheck(); +#endif +} + +template +void +HeapBucketGroup::FinishConcurrentSweepPass1(RecyclerSweep& recyclerSweep) +{ + heapBucket.FinishConcurrentSweepPass1(recyclerSweep); + leafHeapBucket.FinishConcurrentSweepPass1(recyclerSweep); + +#ifdef RECYCLER_WRITE_BARRIER + smallNormalWithBarrierHeapBucket.FinishConcurrentSweepPass1(recyclerSweep); +#endif +} + +template +void +HeapBucketGroup::FinishSweepPrep(RecyclerSweep& recyclerSweep) +{ + heapBucket.FinishSweepPrep(recyclerSweep); + leafHeapBucket.FinishSweepPrep(recyclerSweep); + +#ifdef RECYCLER_WRITE_BARRIER + smallNormalWithBarrierHeapBucket.FinishSweepPrep(recyclerSweep); +#endif +} + template void HeapBucketGroup::FinishConcurrentSweep() @@ -1918,6 +2490,9 @@ HeapBucketGroup::AllocatorsAreEmpty() { return heapBucket.AllocatorsAreEmpty() && finalizableHeapBucket.AllocatorsAreEmpty() +#ifdef RECYCLER_VISITED_HOST + && recyclerVisitedHostHeapBucket.AllocatorsAreEmpty() +#endif && leafHeapBucket.AllocatorsAreEmpty() #ifdef RECYCLER_WRITE_BARRIER && smallNormalWithBarrierHeapBucket.AllocatorsAreEmpty() diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapBucket.h b/deps/chakrashim/core/lib/Common/Memory/HeapBucket.h index a422b2013df..a7a1dd2fdea 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapBucket.h +++ b/deps/chakrashim/core/lib/Common/Memory/HeapBucket.h @@ -65,6 +65,7 @@ class HeapBucket public: HeapBucket(); + uint GetSizeCat() const; uint GetBucketIndex() const; uint GetMediumBucketIndex() const; @@ -74,14 +75,22 @@ class HeapBucket protected: HeapInfo * heapInfo; uint sizeCat; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + bool allocationsStartedDuringConcurrentSweep; + bool concurrentSweepAllocationsThresholdExceeded; +#endif -#ifdef RECYCLER_SLOW_CHECK_ENABLED - size_t heapBlockCount; - size_t newHeapBlockCount; // count of heap bock that is in the heap info and not in the heap bucket yet - size_t emptyHeapBlockCount; +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + uint32 heapBlockCount; + uint32 newHeapBlockCount; // count of heap bock that is in the heap info and not in the heap bucket yet +#endif + +#if defined(RECYCLER_SLOW_CHECK_ENABLED) + uint32 emptyHeapBlockCount; #endif #ifdef RECYCLER_PAGE_HEAP +protected: bool isPageHeapEnabled; public: inline bool IsPageHeapEnabled(ObjectInfoBits attributes) const @@ -90,7 +99,33 @@ class HeapBucket return isPageHeapEnabled && ((attributes & ClientTrackableObjectBits) == 0); } #endif + +#if ENABLE_MEM_STATS +protected: + HeapBucketStats memStats; // mem stats per bucket +public: + const HeapBucketStats& GetMemStats() const { return memStats; } + + template + void PreAggregateBucketStats(TBlockType* heapBlock) + { + Assert(heapBlock->heapBucket == this); + memStats.PreAggregate(); + heapBlock->AggregateBlockStats(memStats); + } + + void AggregateBucketStats() + { + memStats.BeginAggregate(); // Begin aggregate, clear if needed + } +#endif + Recycler * GetRecycler() const; + bool AllocationsStartedDuringConcurrentSweep() const; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + bool ConcurrentSweepAllocationsThresholdExceeded() const; + bool DoTwoPassConcurrentSweepPreCheck(); +#endif template friend class SmallHeapBlockAllocator; @@ -101,6 +136,11 @@ class HeapBucket template friend class SmallFinalizableHeapBlockT; +#ifdef RECYCLER_VISITED_HOST + template + friend class SmallRecyclerVisitedHostHeapBlockT; +#endif + friend class LargeHeapBlock; #ifdef RECYCLER_WRITE_BARRIER template @@ -136,9 +176,10 @@ class HeapBucketT : public HeapBucket void ResetMarks(ResetMarkFlags flags); void ScanNewImplicitRoots(Recycler * recycler); -#ifdef DUMP_FRAGMENTATION_STATS - void AggregateBucketStats(HeapBucketStats& stats); +#if ENABLE_MEM_STATS + void AggregateBucketStats(); #endif + uint Rescan(Recycler * recycler, RescanFlags flags); #if ENABLE_CONCURRENT_GC void MergeNewHeapBlock(TBlockType * heapBlock); @@ -164,7 +205,12 @@ class HeapBucketT : public HeapBucket protected: static bool const IsLeafBucket = TBlockType::RequiredAttributes == LeafBit; - static bool const IsFinalizableBucket = TBlockType::RequiredAttributes == FinalizeBit; + // Not all objects in the recycler visited host heap block are finalizable, but we still require finalizable semantics + static bool const IsFinalizableBucket = TBlockType::RequiredAttributes == FinalizeBit +#ifdef RECYCLER_VISITED_HOST + || ((TBlockType::RequiredAttributes & RecyclerVisitedHostBit) == (RecyclerVisitedHostBit)) +#endif + ; static bool const IsNormalBucket = TBlockType::RequiredAttributes == NoBit; #ifdef RECYCLER_WRITE_BARRIER static bool const IsWriteBarrierBucket = TBlockType::RequiredAttributes == WithBarrierBit; @@ -173,13 +219,16 @@ class HeapBucketT : public HeapBucket void Initialize(HeapInfo * heapInfo, DECLSPEC_GUARD_OVERFLOW uint sizeCat); void AppendAllocableHeapBlockList(TBlockType * list); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + void EnsureAllocableHeapBlockList(); + void FinishSweepPrep(RecyclerSweep& recyclerSweep); + void FinishConcurrentSweepPass1(RecyclerSweep& recyclerSweep); void FinishConcurrentSweep(); #endif void DeleteHeapBlockList(TBlockType * list); static void DeleteEmptyHeapBlockList(TBlockType * list); static void DeleteHeapBlockList(TBlockType * list, Recycler * recycler); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST static bool PushHeapBlockToSList(PSLIST_HEADER list, TBlockType * heapBlock); static TBlockType * PopHeapBlockFromSList(PSLIST_HEADER list); static ushort QueryDepthInterlockedSList(PSLIST_HEADER list); @@ -208,8 +257,8 @@ class HeapBucketT : public HeapBucket void SweepBucket(RecyclerSweep& recyclerSweep, Fn sweepFn); #if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + void PrepareForAllocationsDuringConcurrentSweep(TBlockType * ¤tHeapBlockList); void StartAllocationDuringConcurrentSweep(); - bool AllocationsStartedDuringConcurrentSweep() const; void ResumeNormalAllocationAfterConcurrentSweep(TBlockType * newNextAllocableBlockHead = nullptr); #endif @@ -227,6 +276,8 @@ class HeapBucketT : public HeapBucket // Partial/Concurrent GC void EnumerateObjects(ObjectInfoBits infoBits, void (*CallBackFunction)(void * address, size_t size)); + + void AssertCheckHeapBlockNotInAnyList(TBlockType * heapBlock); #if DBG bool AllocatorsAreEmpty() const; bool HasPendingDisposeHeapBlocks() const; @@ -256,9 +307,10 @@ class HeapBucketT : public HeapBucket TBlockType * fullBlockList; // list of blocks that are fully allocated TBlockType * heapBlockList; // list of blocks that has free objects -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP -#if SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if SUPPORT_WIN32_SLIST PSLIST_HEADER allocableHeapBlockListHead; + TBlockType * lastKnownNextAllocableBlockHead; #if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) // This lock is needed only in the debug mode while we verify block counts. Not needed otherwise, as this list is never accessed concurrently. // Items are added to it by the allocator when allocations are allowed during concurrent sweep. The list is drained during the next sweep while @@ -266,10 +318,9 @@ class HeapBucketT : public HeapBucket mutable CriticalSection debugSweepableHeapBlockListLock; #endif // This is the list of blocks that we allocated from during concurrent sweep. These blocks will eventually get processed during the next sweep and either go into - // the heapBlockList or fullBlockList. + // the fullBlockList. TBlockType * sweepableHeapBlockList; #endif - bool allocationsStartedDuringConcurrentSweep; #endif FreeObject* explicitFreeList; // List of objects that have been explicitly freed @@ -319,10 +370,16 @@ HeapBucketT::SweepBucket(RecyclerSweep& recyclerSweep, Fn sweepFn) #if ENABLE_CONCURRENT_GC // We should only queue up pending sweep if we are doing partial collect Assert(recyclerSweep.GetPendingSweepBlockList(this) == nullptr); + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (!this->AllocationsStartedDuringConcurrentSweep()) +#endif #endif - // Every thing is swept immediately in non partial collect, so we can allocate - // from the heap block list now - StartAllocationAfterSweep(); + { + // Every thing is swept immediately in non partial collect, so we can allocate + // from the heap block list now + StartAllocationAfterSweep(); + } } RECYCLER_SLOW_CHECK(this->VerifyHeapBlockCount(recyclerSweep.IsBackground())); diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapConstants.h b/deps/chakrashim/core/lib/Common/Memory/HeapConstants.h index 33137ed4310..d2148699422 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapConstants.h +++ b/deps/chakrashim/core/lib/Common/Memory/HeapConstants.h @@ -7,7 +7,7 @@ class HeapConstants { public: -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) static const uint MaxSmallObjectSize = 512; #else static const uint MaxSmallObjectSize = 768; @@ -21,7 +21,7 @@ class HeapConstants static const uint MaxLargeObjectSize = 1u << 31; // Maximum recycler object is 2GB -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) // Only if a pointer points to first 8k region of a large object, it will set the mark bit in the chunk->MarkBits // If the pointer points outside of that region, no mark bit will be set static const uint MaxLargeObjectMarkOffset = 8 * 1024; @@ -50,7 +50,7 @@ class SmallAllocationBlockAttributes public: static const size_t MinObjectSize = HeapConstants::ObjectGranularity; -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) static const size_t PageCount = 2; #else static const size_t PageCount = 4; diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapInfo.cpp b/deps/chakrashim/core/lib/Common/Memory/HeapInfo.cpp index a7238a57ad8..6561a5686af 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapInfo.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/HeapInfo.cpp @@ -4,9 +4,9 @@ //------------------------------------------------------------------------------------------------------- #include "CommonMemoryPch.h" #include "Memory/PageHeapBlockTypeFilter.h" -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) #include "ValidPointersMap/vpm.32b.h" -#elif defined(_M_X64_OR_ARM64) +#elif defined(TARGET_64) #include "ValidPointersMap/vpm.64b.h" #else #error "Platform is not handled" @@ -26,38 +26,117 @@ HeapInfo::ValidPointersMap HeapInfo::smallAlloc HeapInfo::ValidPointersMap HeapInfo::mediumAllocValidPointersMap; template -ValidPointers::ValidPointers(ushort const * validPointers) +ValidPointers::ValidPointers(ushort const * validPointers, uint bucketIndex) +#if USE_VPM_TABLE : validPointers(validPointers) +#endif { +#if !USE_VPM_TABLE + Assert(validPointers == nullptr); + maxObjectIndex = CalculateBucketInfo(bucketIndex, &indexPerObject); +#endif +#if DBG && USE_VPM_TABLE + uint localIndexPerObject; + uint localMaxObjectIndex = CalculateBucketInfo(bucketIndex, &localIndexPerObject); + for (uint index = 0; index < TBlockAttributes::MaxSmallObjectCount; index++) + { + Assert(CalculateAddressIndex(index, localIndexPerObject, localMaxObjectIndex) == validPointers[index]); + Assert(CalculateInteriorAddressIndex(index, localIndexPerObject, localMaxObjectIndex) == validPointers[index + TBlockAttributes::MaxSmallObjectCount]); + } +#endif } template ushort ValidPointers::GetAddressIndex(uint index) const { Assert(index < TBlockAttributes::MaxSmallObjectCount); +#if USE_VPM_TABLE return validPointers[index]; +#else + return CalculateAddressIndex(index, indexPerObject, maxObjectIndex); +#endif + } template ushort ValidPointers::GetInteriorAddressIndex(uint index) const { Assert(index < TBlockAttributes::MaxSmallObjectCount); +#if USE_VPM_TABLE return validPointers[index + TBlockAttributes::MaxSmallObjectCount]; +#else + return CalculateInteriorAddressIndex(index, indexPerObject, maxObjectIndex); +#endif } +#if !USE_VPM_TABLE || DBG template -void HeapInfo::ValidPointersMap::GenerateValidPointersMap(ValidPointersMapTable& validTable, InvalidBitsTable& invalidTable, BlockInfoMapTable& blockInfoTable) +uint ValidPointers::CalculateBucketInfo(uint bucketIndex, uint * indexPerObject) +{ + uint bucketSize; + if (TBlockAttributes::IsSmallBlock) + { + bucketSize = TBlockAttributes::MinObjectSize + HeapConstants::ObjectGranularity * bucketIndex; + } + else + { + bucketSize = TBlockAttributes::MinObjectSize + HeapConstants::MediumObjectGranularity * (bucketIndex + 1); + } + *indexPerObject = bucketSize / HeapConstants::ObjectGranularity; + return ((TBlockAttributes::PageCount * AutoSystemInfo::PageSize) / bucketSize) * bucketSize / HeapConstants::ObjectGranularity; +} + +template +ushort ValidPointers::CalculateAddressIndex(uint index, uint indexPerObject, uint maxObjectIndex) +{ + Assert(index < TBlockAttributes::MaxSmallObjectCount); + if (index >= maxObjectIndex) + { + return (ushort)-1; + } + uint addressIndex = index / indexPerObject; + Assert(addressIndex < USHRT_MAX); + if (addressIndex * indexPerObject != index) + { + return (ushort)-1; + } + return (ushort)addressIndex; +} + +template +ushort ValidPointers::CalculateInteriorAddressIndex(uint index, uint indexPerObject, uint maxObjectIndex) +{ + Assert(index < TBlockAttributes::MaxSmallObjectCount); + if (index >= maxObjectIndex) + { + return (ushort)-1; + } + uint addressIndex = index / indexPerObject; + Assert(addressIndex < USHRT_MAX); + return (ushort)addressIndex; +} +#endif + +#if defined(ENABLE_TEST_HOOKS) || !USE_STATIC_VPM +template +void HeapInfo::ValidPointersMap::GenerateValidPointersMap(ValidPointersMapTable * validTable, InvalidBitsTable& invalidTable, BlockInfoMapTable& blockInfoTable) { // Create the valid pointer map to be shared by the buckets. // Also create the invalid objects bit vector. - ushort * buffer = &validTable[0][0]; - memset(buffer, -1, sizeof(ushort)* 2 * TBlockAttributes::MaxSmallObjectCount * TBlockAttributes::BucketCount); + ushort * buffer = &((*validTable)[0][0]); + if (buffer) + { + memset(buffer, -1, sizeof(ushort) * 2 * TBlockAttributes::MaxSmallObjectCount * TBlockAttributes::BucketCount); + } for (uint i = 0; i < TBlockAttributes::BucketCount; i++) { // Non-interior first ushort * validPointers = buffer; - buffer += TBlockAttributes::MaxSmallObjectCount; + if (buffer) + { + buffer += TBlockAttributes::MaxSmallObjectCount; + } typename SmallHeapBlockT::SmallHeapBlockBitVector * invalidBitVector = &invalidTable[i]; invalidBitVector->SetAll(); @@ -82,7 +161,10 @@ void HeapInfo::ValidPointersMap::GenerateValidPointersMap(Vali for (ushort j = 0; j < maxObjectCountForBucket; j++) { - validPointers[j * stride] = j; + if (validPointers) + { + validPointers[j * stride] = j; + } uintptr_t objectAddress = j * bucketSize; Assert(objectAddress / AutoSystemInfo::PageSize < USHRT_MAX); @@ -94,21 +176,26 @@ void HeapInfo::ValidPointersMap::GenerateValidPointersMap(Vali invalidBitVector->Clear(j * stride); } - // interior pointer - ushort * validInteriorPointers = buffer; - buffer += TBlockAttributes::MaxSmallObjectCount; - for (ushort j = 0; j < maxObjectCountForBucket; j++) + if (buffer) { - uint start = j * stride; - uint end = min(start + stride, TBlockAttributes::MaxSmallObjectCount); - for (uint k = start; k < end; k++) + // interior pointer + ushort * validInteriorPointers = buffer; + buffer += TBlockAttributes::MaxSmallObjectCount; + for (ushort j = 0; j < maxObjectCountForBucket; j++) { - validInteriorPointers[k] = j; + uint start = j * stride; + uint end = min(start + stride, TBlockAttributes::MaxSmallObjectCount); + for (uint k = start; k < end; k++) + { + validInteriorPointers[k] = j; + } } } } } +#endif +#ifdef ENABLE_TEST_HOOKS template <> HRESULT HeapInfo::ValidPointersMap::GenerateValidPointersMapForBlockType(FILE* file) { @@ -128,8 +215,9 @@ HRESULT HeapInfo::ValidPointersMap::GenerateVali hr = E_FAIL; goto cleanup; } - GenerateValidPointersMap(*valid, *invalid, *blockMap); + GenerateValidPointersMap(valid, *invalid, *blockMap); + IfErrorGotoCleanup(fwprintf(file, _u("#if USE_VPM_TABLE\n"))) IfErrorGotoCleanup(fwprintf(file, _u("const ushort HeapInfo::ValidPointersMap::validPointersBuffer[HeapConstants::BucketCount][HeapInfo::ValidPointersMap::rowSize] = \n{\n"))); // Generate the full buffer. for (unsigned i = 0; i < HeapConstants::BucketCount; ++i) @@ -145,6 +233,7 @@ HRESULT HeapInfo::ValidPointersMap::GenerateVali IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? _u("\n },\n") : _u("\n }\n")))); } IfErrorGotoCleanup(fwprintf(file, _u("};\n"))); + IfErrorGotoCleanup(fwprintf(file, _u("#endif // USE_VPM_TABLE\n\n"))) // Generate the invalid bitvectors. IfErrorGotoCleanup(fwprintf( @@ -157,9 +246,9 @@ HRESULT HeapInfo::ValidPointersMap::GenerateVali for (unsigned j = 0; j < (*invalid)[i].wordCount; ++j) { const char16 *format = (j < (*invalid)[i].wordCount - 1) ? -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) _u("0x%08X, ") : _u("0x%08X") -#elif defined(_M_X64_OR_ARM64) +#elif defined(TARGET_64) _u("0x%016I64X, ") : _u("0x%016I64X") #else #error "Platform is not handled" @@ -194,7 +283,7 @@ HRESULT HeapInfo::ValidPointersMap::GenerateVali IfErrorGotoCleanup(fwprintf(file, format, (*blockMap)[i][j].lastObjectIndexOnPage, (*blockMap)[i][j].pageObjectCount)); IfErrorGotoCleanup(fwprintf(file, (j < SmallAllocationBlockAttributes::PageCount - 1 ? _u(" },\n") : _u(" }\n")))); } - IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? _u("\n },\n") : _u("\n }\n")))); + IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? _u(" },\n") : _u(" }\n")))); } IfErrorGotoCleanup(fwprintf(file, _u("};\n"))); @@ -225,8 +314,9 @@ HRESULT HeapInfo::ValidPointersMap::GenerateVal hr = E_FAIL; goto cleanup; } - GenerateValidPointersMap(*valid, *invalid, *blockMap); + GenerateValidPointersMap(valid, *invalid, *blockMap); + IfErrorGotoCleanup(fwprintf(file, _u("#if USE_VPM_TABLE\n"))) IfErrorGotoCleanup(fwprintf(file, _u("const ushort HeapInfo::ValidPointersMap::validPointersBuffer[MediumAllocationBlockAttributes::BucketCount][HeapInfo::ValidPointersMap::rowSize] = \n{\n"))); // Generate the full buffer. for (unsigned i = 0; i < HeapConstants::MediumBucketCount; ++i) @@ -242,6 +332,7 @@ HRESULT HeapInfo::ValidPointersMap::GenerateVal IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? _u("\n },\n") : _u("\n }\n")))); } IfErrorGotoCleanup(fwprintf(file, _u("};\n"))); + IfErrorGotoCleanup(fwprintf(file, _u("#endif // USE_VPM_TABLE\n\n"))) // Generate the invalid bitvectors. IfErrorGotoCleanup(fwprintf( @@ -254,9 +345,9 @@ HRESULT HeapInfo::ValidPointersMap::GenerateVal for (unsigned j = 0; j < (*invalid)[i].wordCount; ++j) { const char16 *format = (j < (*invalid)[i].wordCount - 1) ? -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) _u("0x%08X, ") : _u("0x%08X") -#elif defined(_M_X64_OR_ARM64) +#elif defined(TARGET_64) _u("0x%016I64X, ") : _u("0x%016I64X") #else #error "Platform is not handled" @@ -291,7 +382,7 @@ HRESULT HeapInfo::ValidPointersMap::GenerateVal IfErrorGotoCleanup(fwprintf(file, format, (*blockMap)[i][j].lastObjectIndexOnPage, (*blockMap)[i][j].pageObjectCount)); IfErrorGotoCleanup(fwprintf(file, (j < MediumAllocationBlockAttributes::PageCount - 1 ? _u(" },\n") : _u(" }\n")))); } - IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? _u("\n },\n") : _u("\n }\n")))); + IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? _u(" },\n") : _u(" }\n")))); } IfErrorGotoCleanup(fwprintf(file, _u("};\n"))); @@ -318,9 +409,9 @@ HRESULT HeapInfo::ValidPointersMap::GenerateValidPointersMapHe _u("// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.\n") _u("//-------------------------------------------------------------------------------------------------------\n") _u("// Generated via jshost -GenerateValidPointersMapHeader\n") -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) _u("// Target platforms: 32bit - x86 & arm\n") -#elif defined(_M_X64_OR_ARM64) +#elif defined(TARGET_64) _u("// Target platform: 64bit - amd64 & arm64\n") #else #error "Platform is not handled" @@ -343,6 +434,7 @@ HRESULT HeapInfo::ValidPointersMap::GenerateValidPointersMapHe return hr; } +#endif HeapInfo::HeapInfo() : recycler(nullptr), @@ -354,11 +446,17 @@ HeapInfo::HeapInfo() : newFinalizableWithBarrierHeapBlockList(nullptr), #endif newFinalizableHeapBlockList(nullptr), +#ifdef RECYCLER_VISITED_HOST + newRecyclerVisitedHostHeapBlockList(nullptr), +#endif newMediumLeafHeapBlockList(nullptr), newMediumNormalHeapBlockList(nullptr), #ifdef RECYCLER_WRITE_BARRIER newMediumNormalWithBarrierHeapBlockList(nullptr), newMediumFinalizableWithBarrierHeapBlockList(nullptr), +#endif +#ifdef RECYCLER_VISITED_HOST + newMediumRecyclerVisitedHostHeapBlockList(nullptr), #endif newMediumFinalizableHeapBlockList(nullptr), #endif @@ -406,6 +504,10 @@ HeapInfo::~HeapInfo() #if ENABLE_CONCURRENT_GC SmallFinalizableHeapBucket::FinalizeHeapBlockList(this->newFinalizableHeapBlockList); MediumFinalizableHeapBucket::FinalizeHeapBlockList(this->newMediumFinalizableHeapBlockList); +#ifdef RECYCLER_VISITED_HOST + SmallRecyclerVisitedHostHeapBucket::FinalizeHeapBlockList(this->newRecyclerVisitedHostHeapBlockList); + MediumRecyclerVisitedHostHeapBucket::FinalizeHeapBlockList(this->newMediumRecyclerVisitedHostHeapBlockList); +#endif #ifdef RECYCLER_WRITE_BARRIER SmallFinalizableWithBarrierHeapBucket::FinalizeHeapBlockList(this->newFinalizableWithBarrierHeapBlockList); MediumFinalizableWithBarrierHeapBucket::FinalizeHeapBlockList(this->newMediumFinalizableWithBarrierHeapBlockList); @@ -449,6 +551,12 @@ HeapInfo::~HeapInfo() MediumFinalizableWithBarrierHeapBucket::DeleteHeapBlockList(this->newMediumFinalizableWithBarrierHeapBlockList, recycler); #endif MediumFinalizableHeapBucket::DeleteHeapBlockList(this->newMediumFinalizableHeapBlockList, recycler); + +#ifdef RECYCLER_VISITED_HOST + SmallFinalizableHeapBucket::DeleteHeapBlockList(this->newRecyclerVisitedHostHeapBlockList, recycler); + MediumFinalizableHeapBucket::DeleteHeapBlockList(this->newMediumRecyclerVisitedHostHeapBlockList, recycler); +#endif + #endif // We do this here, instead of in the Recycler destructor, because the above stuff may @@ -468,9 +576,9 @@ HeapInfo::Initialize(Recycler * recycler { this->recycler = recycler; #ifdef DUMP_FRAGMENTATION_STATS - if (recycler->GetRecyclerFlagsTable().flags.DumpFragmentationStats) + if (recycler->GetRecyclerFlagsTable().DumpFragmentationStats) { - printf("[FRAG %d] Start", ::GetTickCount()); + Output::Print(_u("[FRAG %d] Start"), ::GetTickCount()); } #endif @@ -689,7 +797,6 @@ HeapInfo::ResetMarks(ResetMarkFlags flags) heapBlock->MarkImplicitRoots(); }); #endif - HeapBlockList::ForEach(newMediumFinalizableHeapBlockList, [flags](MediumNormalHeapBlock * heapBlock) { heapBlock->MarkImplicitRoots(); @@ -936,10 +1043,15 @@ HeapInfo::Sweep(RecyclerSweep& recyclerSweep, bool concurrent) // Merge the new blocks before we sweep the finalizable object in thread recyclerSweep.MergePendingNewHeapBlockList(); recyclerSweep.MergePendingNewMediumHeapBlockList(); + #ifdef RECYCLER_WRITE_BARRIER recyclerSweep.MergePendingNewHeapBlockList(); recyclerSweep.MergePendingNewMediumHeapBlockList(); #endif +#ifdef RECYCLER_VISITED_HOST + recyclerSweep.MergePendingNewHeapBlockList(); + recyclerSweep.MergePendingNewMediumHeapBlockList(); +#endif #endif SweepBuckets(recyclerSweep, concurrent); @@ -1037,42 +1149,257 @@ HeapInfo::Rescan(RescanFlags flags) return scannedPageCount; } + +#if ENABLE_MEM_STATS + #ifdef DUMP_FRAGMENTATION_STATS +template +struct DumpBucketTypeName { static char16 name[]; }; +template<> char16 DumpBucketTypeName::name[] = _u("Normal "); +template<> char16 DumpBucketTypeName::name[] = _u("Leaf "); +template<> char16 DumpBucketTypeName::name[] = _u("Fin "); +#ifdef RECYCLER_WRITE_BARRIER +template<> char16 DumpBucketTypeName::name[] = _u("NormWB "); +template<> char16 DumpBucketTypeName::name[] = _u("FinWB "); +#endif +#ifdef RECYCLER_VISITED_HOST +template<> char16 DumpBucketTypeName::name[] = _u("Visited"); +#endif +template +struct DumpBlockTypeName { static char16 name[]; }; +template<> char16 DumpBlockTypeName::name[] = _u("(S)"); +template<> char16 DumpBlockTypeName::name[] = _u("(M)"); +#endif // DUMP_FRAGMENTATION_STATS + +template +struct EtwBucketTypeEnum { static uint16 code; }; +template<> uint16 EtwBucketTypeEnum::code = 0; +template<> uint16 EtwBucketTypeEnum::code = 1; +template<> uint16 EtwBucketTypeEnum::code = 2; +#ifdef RECYCLER_WRITE_BARRIER +template<> uint16 EtwBucketTypeEnum::code = 3; +template<> uint16 EtwBucketTypeEnum::code = 4; +#endif +#ifdef RECYCLER_VISITED_HOST +template<> uint16 EtwBucketTypeEnum::code = 5; +#endif +template +struct EtwBlockTypeEnum { static uint16 code; }; +template<> uint16 EtwBlockTypeEnum::code = 0; +template<> uint16 EtwBlockTypeEnum::code = 1; -template -void DumpBucket(uint bucketIndex, typename SmallHeapBlockType::BucketType& bucket) +class BucketStatsReporter { - HeapBucketStats stats = { 0 }; +private: + static const uint16 LargeBucketNameCode = 2 << 8; + static const uint16 TotalBucketNameCode = 3 << 8; - bucket.AggregateBucketStats(stats); + Recycler* recycler; + HeapBucketStats total; - Output::Print(_u("%d,%d,"), bucketIndex, (bucketIndex + 1) << HeapConstants::ObjectAllocationShift); - Output::Print(_u("%d,%d,%d,%d,%d,%d,%d\n"), stats.totalBlockCount, stats.finalizeBlockCount, stats.emptyBlockCount, stats.objectCount, stats.finalizeCount, stats.objectByteCount, stats.totalByteCount); -} + template + uint16 BucketNameCode() const + { + return EtwBucketTypeEnum::code + (EtwBlockTypeEnum::code << 8); + } + + bool IsMemProtectMode() const + { + return recycler->IsMemProtectMode(); + } + +public: + BucketStatsReporter(Recycler* recycler) + : recycler(recycler) + { + DUMP_FRAGMENTATION_STATS_ONLY(DumpHeader()); + } + + bool IsEtwEnabled() const + { + return IS_GCETW_Enabled(GC_BUCKET_STATS); + } + + bool IsDumpEnabled() const + { + return DUMP_FRAGMENTATION_STATS_IS(!!recycler->GetRecyclerFlagsTable().DumpFragmentationStats); + } + + bool IsEnabled() const + { + return IsEtwEnabled() || IsDumpEnabled(); + } + + template + void PreAggregateBucketStats(TBlockType* list) + { + HeapBlockList::ForEach(list, [](TBlockType* heapBlock) + { + // Process blocks not in allocator in pre-pass. They are not put into buckets yet. + if (!heapBlock->IsInAllocator()) + { + heapBlock->heapBucket->PreAggregateBucketStats(heapBlock); + } + }); + } + + template + void GetBucketStats(HeapBucketGroup& group) + { + auto& bucket = group.template GetBucket(); + bucket.AggregateBucketStats(); + + const auto& stats = bucket.GetMemStats(); + total.Aggregate(stats); + + if (stats.totalByteCount > 0) + { + const uint16 bucketNameCode = BucketNameCode(); + const uint16 sizeCat = static_cast(bucket.GetSizeCat()); + GCETW(GC_BUCKET_STATS, (recycler, bucketNameCode, sizeCat, stats.objectByteCount, stats.totalByteCount)); +#ifdef DUMP_FRAGMENTATION_STATS + DumpStats(sizeCat, stats); +#endif + } + } + + void GetBucketStats(LargeHeapBucket& bucket) + { + bucket.AggregateBucketStats(); + + const auto& stats = bucket.GetMemStats(); + total.Aggregate(stats); + + if (stats.totalByteCount > 0) + { + const uint16 sizeCat = static_cast(bucket.GetSizeCat()); + GCETW(GC_BUCKET_STATS, (recycler, LargeBucketNameCode, sizeCat, stats.objectByteCount, stats.totalByteCount)); + DUMP_FRAGMENTATION_STATS_ONLY(DumpLarge(stats)); + } + } + + void Report() + { + GCETW(GC_BUCKET_STATS, (recycler, TotalBucketNameCode, 0, total.objectByteCount, total.totalByteCount)); + DUMP_FRAGMENTATION_STATS_ONLY(DumpFooter()); + } + +#ifdef DUMP_FRAGMENTATION_STATS + void DumpHeader() + { + if (IsDumpEnabled()) + { + Output::Print(_u("[FRAG %d] Post-Collection State\n"), ::GetTickCount()); + Output::Print(_u("---------------------------------------------------------------------------------------\n")); + Output::Print(_u(" #Blk #Objs #Fin ObjBytes FreeBytes TotalBytes UsedPercent\n")); + Output::Print(_u("---------------------------------------------------------------------------------------\n")); + } + } + + template + void DumpStats(uint sizeCat, const HeapBucketStats& stats) + { + if (IsDumpEnabled()) + { + Output::Print(_u("%-7s%s %4d : "), + DumpBucketTypeName::name, DumpBlockTypeName::name, sizeCat); + stats.Dump(); + } + } + + void DumpLarge(const HeapBucketStats& stats) + { + if (IsDumpEnabled()) + { + Output::Print(_u("Large : ")); + stats.Dump(); + } + } + + void DumpFooter() + { + if (IsDumpEnabled()) + { + Output::Print(_u("---------------------------------------------------------------------------------------\n")); + Output::Print(_u("Total : ")); + total.Dump(); + } + } +#endif +}; void -HeapInfo::DumpFragmentationStats() +HeapInfo::ReportMemStats() { - Output::Print(_u("[FRAG %d] Post-Collection State\n"), ::GetTickCount()); - Output::Print(_u("Bucket,SizeCat,Block Count,Finalizable Block Count,Empty Block Count, Object Count, Finalizable Object Count, Object size, Block Size\n")); + BucketStatsReporter report(recycler); + if (!report.IsEnabled()) + { + return; + } + +#if ENABLE_CONCURRENT_GC + // Pre aggregate pass on all the heap blocks that are not merged into bucket's lists yet + report.PreAggregateBucketStats(this->newNormalHeapBlockList); + report.PreAggregateBucketStats(this->newLeafHeapBlockList); + report.PreAggregateBucketStats(this->newFinalizableHeapBlockList); +#ifdef RECYCLER_WRITE_BARRIER + report.PreAggregateBucketStats(this->newNormalWithBarrierHeapBlockList); + report.PreAggregateBucketStats(this->newFinalizableWithBarrierHeapBlockList); +#endif +#ifdef RECYCLER_VISITED_HOST + report.PreAggregateBucketStats(this->newRecyclerVisitedHostHeapBlockList); +#endif + +#if defined(BUCKETIZE_MEDIUM_ALLOCATIONS) && SMALLBLOCK_MEDIUM_ALLOC + report.PreAggregateBucketStats(this->newMediumNormalHeapBlockList); + report.PreAggregateBucketStats(this->newMediumLeafHeapBlockList); + report.PreAggregateBucketStats(this->newMediumFinalizableHeapBlockList); +#ifdef RECYCLER_WRITE_BARRIER + report.PreAggregateBucketStats(this->newMediumNormalWithBarrierHeapBlockList); + report.PreAggregateBucketStats(this->newMediumFinalizableWithBarrierHeapBlockList); +#endif +#ifdef RECYCLER_VISITED_HOST + report.PreAggregateBucketStats(this->newMediumRecyclerVisitedHostHeapBlockList); +#endif +#endif +#endif // ENABLE_CONCURRENT_GC for (uint i = 0; i < HeapConstants::BucketCount; i++) { - DumpBucket(i, heapBuckets[i].GetBucket()); - DumpBucket(i, heapBuckets[i].GetBucket()); - DumpBucket(i, heapBuckets[i].GetBucket()); + report.GetBucketStats(heapBuckets[i]); + report.GetBucketStats(heapBuckets[i]); + report.GetBucketStats(heapBuckets[i]); +#ifdef RECYCLER_WRITE_BARRIER + report.GetBucketStats(heapBuckets[i]); + report.GetBucketStats(heapBuckets[i]); +#endif +#ifdef RECYCLER_VISITED_HOST + report.GetBucketStats(heapBuckets[i]); +#endif } #if defined(BUCKETIZE_MEDIUM_ALLOCATIONS) && SMALLBLOCK_MEDIUM_ALLOC for (uint i = 0; i < HeapConstants::MediumBucketCount; i++) { - DumpBucket(i, mediumHeapBuckets[i].GetBucket()); - DumpBucket(i, mediumHeapBuckets[i].GetBucket()); - DumpBucket(i, mediumHeapBuckets[i].GetBucket()); + report.GetBucketStats(mediumHeapBuckets[i]); + report.GetBucketStats(mediumHeapBuckets[i]); + report.GetBucketStats(mediumHeapBuckets[i]); +#ifdef RECYCLER_WRITE_BARRIER + report.GetBucketStats(mediumHeapBuckets[i]); + report.GetBucketStats(mediumHeapBuckets[i]); +#endif +#ifdef RECYCLER_VISITED_HOST + report.GetBucketStats(mediumHeapBuckets[i]); +#endif } #endif + + report.GetBucketStats(largeObjectBucket); + report.Report(); } -#endif + +#endif // ENABLE_MEM_STATS + #if ENABLE_PARTIAL_GC void @@ -1171,7 +1498,7 @@ HeapInfo::SweepPendingObjects(RecyclerSweep& recyclerSweep) } #endif -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP void HeapInfo::StartAllocationsDuringConcurrentSweep() { for (uint i = 0; i < HeapConstants::BucketCount; i++) @@ -1187,6 +1514,65 @@ void HeapInfo::StartAllocationsDuringConcurrentSweep() #endif } +bool +HeapInfo::DoTwoPassConcurrentSweepPreCheck() +{ + bool enableTwoPassSweep = false; + // We will continue to do the check for all the buckets so we can enable/disable the feature + // per bucket. + for (uint i = 0; i < HeapConstants::BucketCount; i++) + { + if (heapBuckets[i].DoTwoPassConcurrentSweepPreCheck()) + { + enableTwoPassSweep = true; + } + } + +#if defined(BUCKETIZE_MEDIUM_ALLOCATIONS) && SMALLBLOCK_MEDIUM_ALLOC + for (uint i = 0; i < HeapConstants::MediumBucketCount; i++) + { + if (mediumHeapBuckets[i].DoTwoPassConcurrentSweepPreCheck()) + { + enableTwoPassSweep = true; + } + } +#endif + + return enableTwoPassSweep; +} + +void +HeapInfo::FinishConcurrentSweepPass1(RecyclerSweep& recyclerSweep) +{ + for (uint i = 0; i < HeapConstants::BucketCount; i++) + { + heapBuckets[i].FinishConcurrentSweepPass1(recyclerSweep); + } + +#if defined(BUCKETIZE_MEDIUM_ALLOCATIONS) && SMALLBLOCK_MEDIUM_ALLOC + for (uint i = 0; i < HeapConstants::MediumBucketCount; i++) + { + mediumHeapBuckets[i].FinishConcurrentSweepPass1(recyclerSweep); + } +#endif +} + +void +HeapInfo::FinishSweepPrep(RecyclerSweep& recyclerSweep) +{ + for (uint i = 0; i < HeapConstants::BucketCount; i++) + { + heapBuckets[i].FinishSweepPrep(recyclerSweep); + } + +#if defined(BUCKETIZE_MEDIUM_ALLOCATIONS) && SMALLBLOCK_MEDIUM_ALLOC + for (uint i = 0; i < HeapConstants::MediumBucketCount; i++) + { + mediumHeapBuckets[i].FinishSweepPrep(recyclerSweep); + } +#endif +} + void HeapInfo::FinishConcurrentSweep() { @@ -1304,7 +1690,12 @@ HeapInfo::DisposeObjects() recycler->hasPendingTransferDisposedObjects = true; #if ENABLE_CONCURRENT_GC +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // As during concurrent sweep we start/stop allocations it is safer to prevent transferring disposed objects altogether. + if (!recycler->IsConcurrentExecutingState() && !recycler->IsConcurrentSweepState()) +#else if (!recycler->IsConcurrentExecutingState()) +#endif #endif { // Can't transfer disposed object when the background thread is walking the heap block list @@ -1326,7 +1717,11 @@ HeapInfo::TransferDisposedObjects() Recycler * recycler = this->recycler; Assert(recycler->hasPendingTransferDisposedObjects); #if ENABLE_CONCURRENT_GC +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + Assert(!recycler->IsConcurrentExecutingState() && !recycler->IsConcurrentSweepState()); +#else Assert(!recycler->IsConcurrentExecutingState()); +#endif #endif recycler->hasPendingTransferDisposedObjects = false; @@ -1370,6 +1765,9 @@ HeapInfo::EnumerateObjects(ObjectInfoBits infoBits, void (*CallBackFunction)(voi HeapBucket::EnumerateObjects(newFinalizableWithBarrierHeapBlockList, infoBits, CallBackFunction); #endif +#ifdef RECYCLER_VISITED_HOST + HeapBucket::EnumerateObjects(newRecyclerVisitedHostHeapBlockList, infoBits, CallBackFunction); +#endif HeapBucket::EnumerateObjects(newFinalizableHeapBlockList, infoBits, CallBackFunction); HeapBucket::EnumerateObjects(newMediumLeafHeapBlockList, infoBits, CallBackFunction); @@ -1379,6 +1777,9 @@ HeapInfo::EnumerateObjects(ObjectInfoBits infoBits, void (*CallBackFunction)(voi HeapBucket::EnumerateObjects(newMediumFinalizableWithBarrierHeapBlockList, infoBits, CallBackFunction); #endif +#ifdef RECYCLER_VISITED_HOST + HeapBucket::EnumerateObjects(newMediumRecyclerVisitedHostHeapBlockList, infoBits, CallBackFunction); +#endif HeapBucket::EnumerateObjects(newMediumFinalizableHeapBlockList, infoBits, CallBackFunction); #endif } @@ -1406,6 +1807,9 @@ HeapInfo::GetSmallHeapBlockCount(bool checkCount) const currentSmallHeapBlockCount += HeapBlockList::Count(this->newLeafHeapBlockList); currentSmallHeapBlockCount += HeapBlockList::Count(this->newNormalHeapBlockList); currentSmallHeapBlockCount += HeapBlockList::Count(this->newFinalizableHeapBlockList); +#ifdef RECYCLER_VISITED_HOST + currentSmallHeapBlockCount += HeapBlockList::Count(this->newRecyclerVisitedHostHeapBlockList); +#endif #ifdef RECYCLER_WRITE_BARRIER currentSmallHeapBlockCount += HeapBlockList::Count(this->newNormalWithBarrierHeapBlockList); currentSmallHeapBlockCount += HeapBlockList::Count(this->newFinalizableWithBarrierHeapBlockList); @@ -1413,6 +1817,9 @@ HeapInfo::GetSmallHeapBlockCount(bool checkCount) const currentSmallHeapBlockCount += HeapBlockList::Count(this->newMediumLeafHeapBlockList); currentSmallHeapBlockCount += HeapBlockList::Count(this->newMediumNormalHeapBlockList); +#ifdef RECYCLER_VISITED_HOST + currentSmallHeapBlockCount += HeapBlockList::Count(this->newMediumRecyclerVisitedHostHeapBlockList); +#endif currentSmallHeapBlockCount += HeapBlockList::Count(this->newMediumFinalizableHeapBlockList); #ifdef RECYCLER_WRITE_BARRIER currentSmallHeapBlockCount += HeapBlockList::Count(this->newMediumNormalWithBarrierHeapBlockList); @@ -1433,6 +1840,10 @@ HeapInfo::GetSmallHeapBlockCount(bool checkCount) const this->heapBlockCount[HeapBlock::HeapBlockType::SmallNormalBlockType] + this->heapBlockCount[HeapBlock::HeapBlockType::SmallLeafBlockType] + this->heapBlockCount[HeapBlock::HeapBlockType::SmallFinalizableBlockType] +#ifdef RECYCLER_VISITED_HOST + + this->heapBlockCount[HeapBlock::HeapBlockType::SmallRecyclerVisitedHostBlockType] + + this->heapBlockCount[HeapBlock::HeapBlockType::MediumRecyclerVisitedHostBlockType] +#endif + this->heapBlockCount[HeapBlock::HeapBlockType::MediumNormalBlockType] + this->heapBlockCount[HeapBlock::HeapBlockType::MediumLeafBlockType] + this->heapBlockCount[HeapBlock::HeapBlockType::MediumFinalizableBlockType]; @@ -1506,6 +1917,10 @@ HeapInfo::Check() currentSmallHeapBlockCount += Check(true, false, this->newFinalizableWithBarrierHeapBlockList); #endif currentSmallHeapBlockCount += Check(true, false, this->newFinalizableHeapBlockList); +#ifdef RECYCLER_VISITED_HOST + currentSmallHeapBlockCount += Check(true, false, this->newRecyclerVisitedHostHeapBlockList); + currentSmallHeapBlockCount += Check(true, false, this->newMediumRecyclerVisitedHostHeapBlockList); +#endif #endif #if ENABLE_CONCURRENT_GC @@ -1522,6 +1937,10 @@ HeapInfo::Check() this->heapBlockCount[HeapBlock::HeapBlockType::SmallNormalBlockType] + this->heapBlockCount[HeapBlock::HeapBlockType::SmallLeafBlockType] + this->heapBlockCount[HeapBlock::HeapBlockType::SmallFinalizableBlockType] +#ifdef RECYCLER_VISITED_HOST + + this->heapBlockCount[HeapBlock::HeapBlockType::SmallRecyclerVisitedHostBlockType] + + this->heapBlockCount[HeapBlock::HeapBlockType::MediumRecyclerVisitedHostBlockType] +#endif + this->heapBlockCount[HeapBlock::HeapBlockType::MediumNormalBlockType] + this->heapBlockCount[HeapBlock::HeapBlockType::MediumLeafBlockType] + this->heapBlockCount[HeapBlock::HeapBlockType::MediumFinalizableBlockType]; @@ -1558,6 +1977,10 @@ HeapInfo::Check(bool expectFull, bool expectPending, TBlockType * list, TBlockTy template size_t HeapInfo::Check(bool expectFull, bool expectPending, SmallNormalHeapBlock * list, SmallNormalHeapBlock * tail); template size_t HeapInfo::Check(bool expectFull, bool expectPending, SmallLeafHeapBlock * list, SmallLeafHeapBlock * tail); template size_t HeapInfo::Check(bool expectFull, bool expectPending, SmallFinalizableHeapBlock * list, SmallFinalizableHeapBlock * tail); +#ifdef RECYCLER_VISITED_HOST +template size_t HeapInfo::Check(bool expectFull, bool expectPending, SmallRecyclerVisitedHostHeapBlock * list, SmallRecyclerVisitedHostHeapBlock * tail); +template size_t HeapInfo::Check(bool expectFull, bool expectPending, MediumRecyclerVisitedHostHeapBlock * list, MediumRecyclerVisitedHostHeapBlock * tail); +#endif template size_t HeapInfo::Check(bool expectFull, bool expectPending, LargeHeapBlock * list, LargeHeapBlock * tail); #ifdef RECYCLER_WRITE_BARRIER template size_t HeapInfo::Check(bool expectFull, bool expectPending, SmallNormalWithBarrierHeapBlock * list, SmallNormalWithBarrierHeapBlock * tail); @@ -1622,6 +2045,12 @@ HeapInfo::Verify() { heapBlock->Verify(); }); +#endif +#ifdef RECYCLER_VISITED_HOST + HeapBlockList::ForEach(newRecyclerVisitedHostHeapBlockList, [](SmallFinalizableHeapBlock * heapBlock) + { + heapBlock->Verify(); + }); #endif HeapBlockList::ForEach(newFinalizableHeapBlockList, [](SmallFinalizableHeapBlock * heapBlock) { @@ -1647,6 +2076,12 @@ HeapInfo::Verify() { heapBlock->Verify(); }); +#endif +#ifdef RECYCLER_VISITED_HOST + HeapBlockList::ForEach(newMediumRecyclerVisitedHostHeapBlockList, [](MediumFinalizableHeapBlock * heapBlock) + { + heapBlock->Verify(); + }); #endif HeapBlockList::ForEach(newMediumFinalizableHeapBlockList, [](MediumFinalizableHeapBlock * heapBlock) { @@ -1692,6 +2127,12 @@ HeapInfo::VerifyMark() { heapBlock->VerifyMark(); }); +#endif +#ifdef RECYCLER_VISITED_HOST + HeapBlockList::ForEach(newRecyclerVisitedHostHeapBlockList, [](SmallFinalizableHeapBlock * heapBlock) + { + heapBlock->VerifyMark(); + }); #endif HeapBlockList::ForEach(newFinalizableHeapBlockList, [](SmallFinalizableHeapBlock * heapBlock) { @@ -1717,6 +2158,12 @@ HeapInfo::VerifyMark() { heapBlock->VerifyMark(); }); +#endif +#ifdef RECYCLER_VISITED_HOST + HeapBlockList::ForEach(newMediumRecyclerVisitedHostHeapBlockList, [](MediumFinalizableHeapBlock * heapBlock) + { + heapBlock->VerifyMark(); + }); #endif HeapBlockList::ForEach(newMediumFinalizableHeapBlockList, [](MediumFinalizableHeapBlock * heapBlock) { diff --git a/deps/chakrashim/core/lib/Common/Memory/HeapInfo.h b/deps/chakrashim/core/lib/Common/Memory/HeapInfo.h index 7f3cef272e0..ca809bf1155 100644 --- a/deps/chakrashim/core/lib/Common/Memory/HeapInfo.h +++ b/deps/chakrashim/core/lib/Common/Memory/HeapInfo.h @@ -46,8 +46,8 @@ class HeapInfo const bool IsPageHeapEnabled() const{ return false; } #endif -#ifdef DUMP_FRAGMENTATION_STATS - void DumpFragmentationStats(); +#if ENABLE_MEM_STATS + void ReportMemStats(); #endif template @@ -89,6 +89,9 @@ class HeapInfo void PrepareSweep(); #if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP void StartAllocationsDuringConcurrentSweep(); + bool DoTwoPassConcurrentSweepPreCheck(); + void FinishSweepPrep(RecyclerSweep& recyclerSweep); + void FinishConcurrentSweepPass1(RecyclerSweep& recyclerSweep); void FinishConcurrentSweep(); #endif @@ -214,6 +217,13 @@ class HeapInfo // so new block can't go into heapBlockList return this->newFinalizableHeapBlockList; } +#ifdef RECYCLER_VISITED_HOST + template <> + SmallRecyclerVisitedHostHeapBlock *& GetNewHeapBlockList(HeapBucketT * HeapBucket) + { + return this->newRecyclerVisitedHostHeapBlockList; + } +#endif #ifdef RECYCLER_WRITE_BARRIER template <> @@ -248,6 +258,14 @@ class HeapInfo return this->newMediumFinalizableHeapBlockList; } +#ifdef RECYCLER_VISITED_HOST + template <> + MediumRecyclerVisitedHostHeapBlock *& GetNewHeapBlockList(HeapBucketT * HeapBucket) + { + return this->newMediumRecyclerVisitedHostHeapBlockList; + } +#endif + #ifdef RECYCLER_WRITE_BARRIER template <> MediumNormalWithBarrierHeapBlock *& GetNewHeapBlockList(HeapBucketT * heapBucket) @@ -285,14 +303,6 @@ class HeapInfo template class ValidPointersMap { - // xplat-todo: fix up vpm.64b.h generation to generate correctly - // templatized code -#if defined(_MSC_VER) && !defined(__clang__) -#define USE_STATIC_VPM 1 // Disable to force generation at runtime -#else -#define USE_STATIC_VPM 0 -#endif - private: static const uint rowSize = TBlockAttributes::MaxSmallObjectCount * 2; typedef ushort ValidPointersMapRow[rowSize]; @@ -302,10 +312,12 @@ class HeapInfo typedef BlockInfoMapRow BlockInfoMapTable[TBlockAttributes::BucketCount]; // Architecture-dependent initialization done in ValidPointersMap/vpm.(32b|64b).h +#if USE_VPM_TABLE #if USE_STATIC_VPM static const #endif ValidPointersMapTable validPointersBuffer; +#endif #if USE_STATIC_VPM static const @@ -320,48 +332,62 @@ class HeapInfo public: #if !USE_STATIC_VPM InvalidBitsTable invalidBitsBuffers; - ValidPointersMap() { GenerateValidPointersMap(validPointersBuffer, invalidBitsBuffers, blockInfoBuffer); } + ValidPointersMap() + { +#if USE_VPM_TABLE + GenerateValidPointersMap(&validPointersBuffer, invalidBitsBuffers, blockInfoBuffer); +#else + GenerateValidPointersMap(nullptr, invalidBitsBuffers, blockInfoBuffer); +#endif + } #endif - static void GenerateValidPointersMap(ValidPointersMapTable& validTable, InvalidBitsTable& invalidTable, BlockInfoMapTable& blockInfoTable); - inline const ValidPointers GetValidPointersForIndex(uint index) const +#if defined(ENABLE_TEST_HOOKS) || !USE_STATIC_VPM + static void GenerateValidPointersMap(ValidPointersMapTable * validTable, InvalidBitsTable& invalidTable, BlockInfoMapTable& blockInfoTable); +#endif + + inline const ValidPointers GetValidPointersForIndex(uint bucketIndex) const { - Assert(index < TBlockAttributes::BucketCount); - __analysis_assume(index < TBlockAttributes::BucketCount); - return validPointersBuffer[index]; + AnalysisAssert(bucketIndex < TBlockAttributes::BucketCount); + ushort const * validPointers = nullptr; +#if USE_VPM_TABLE + validPointers = validPointersBuffer[bucketIndex]; +#endif + return ValidPointers(validPointers, bucketIndex); } inline const typename SmallHeapBlockT::SmallHeapBlockBitVector * GetInvalidBitVector(uint index) const { - Assert(index < TBlockAttributes::BucketCount); - __analysis_assume(index < TBlockAttributes::BucketCount); - #if USE_STATIC_VPM + AnalysisAssert(index < TBlockAttributes::BucketCount); +#if USE_STATIC_VPM return &(*invalidBitsBuffers)[index]; - #else +#else return &invalidBitsBuffers[index]; - #endif +#endif } inline const typename SmallHeapBlockT::BlockInfo * GetBlockInfo(uint index) const { - Assert(index < TBlockAttributes::BucketCount); - __analysis_assume(index < TBlockAttributes::BucketCount); + AnalysisAssert(index < TBlockAttributes::BucketCount); return blockInfoBuffer[index]; } +#ifdef ENABLE_TEST_HOOKS static HRESULT GenerateValidPointersMapHeader(LPCWSTR vpmFullPath); - static HRESULT GenerateValidPointersMapForBlockType(FILE* file); +#endif }; static ValidPointersMap smallAllocValidPointersMap; static ValidPointersMap mediumAllocValidPointersMap; public: +#ifdef ENABLE_TEST_HOOKS static HRESULT GenerateValidPointersMapHeader(LPCWSTR vpmFullPath) { return smallAllocValidPointersMap.GenerateValidPointersMapHeader(vpmFullPath); } +#endif template static typename SmallHeapBlockT::SmallHeapBlockBitVector const * GetInvalidBitVector(uint objectSize); @@ -393,6 +419,9 @@ class HeapInfo SmallLeafHeapBlock * newLeafHeapBlockList; SmallNormalHeapBlock * newNormalHeapBlockList; SmallFinalizableHeapBlock * newFinalizableHeapBlockList; +#ifdef RECYCLER_VISITED_HOST + SmallRecyclerVisitedHostHeapBlock * newRecyclerVisitedHostHeapBlockList; +#endif #ifdef RECYCLER_WRITE_BARRIER SmallNormalWithBarrierHeapBlock * newNormalWithBarrierHeapBlockList; @@ -404,6 +433,9 @@ class HeapInfo MediumLeafHeapBlock * newMediumLeafHeapBlockList; MediumNormalHeapBlock * newMediumNormalHeapBlockList; MediumFinalizableHeapBlock * newMediumFinalizableHeapBlockList; +#ifdef RECYCLER_VISITED_HOST + MediumRecyclerVisitedHostHeapBlock* newMediumRecyclerVisitedHostHeapBlockList; +#endif #ifdef RECYCLER_WRITE_BARRIER MediumNormalWithBarrierHeapBlock * newMediumNormalWithBarrierHeapBlockList; @@ -433,7 +465,7 @@ class HeapInfo LargeHeapBucket largeObjectBucket; static const size_t ObjectAlignmentMask = HeapConstants::ObjectGranularity - 1; // 0xF -#ifdef RECYCLER_SLOW_CHECK_ENABLED +#if defined(RECYCLER_SLOW_CHECK_ENABLED) size_t heapBlockCount[HeapBlock::BlockTypeCount]; #endif #ifdef RECYCLER_FINALIZE_CHECK @@ -463,6 +495,10 @@ class HeapInfo friend class SmallLeafHeapBlockT; template friend class SmallFinalizableHeapBlockT; +#ifdef RECYCLER_VISITED_HOST + template + friend class SmallRecyclerVisitedHostHeapBlockT; +#endif friend class LargeHeapBlock; friend class RecyclerSweep; }; @@ -581,17 +617,18 @@ HeapInfo::SmallAllocatorAlloc(Recycler * recycler, SmallHeapBlockAllocatorType * return bucket.SnailAlloc(recycler, allocator, sizeCat, size, attributes, /* nothrow = */ false); } +#ifdef ENABLE_TEST_HOOKS // Forward declaration of explicit specialization before instantiation template <> HRESULT HeapInfo::ValidPointersMap::GenerateValidPointersMapForBlockType(FILE* file); template <> HRESULT HeapInfo::ValidPointersMap::GenerateValidPointersMapForBlockType(FILE* file); +#endif // Template instantiation extern template class HeapInfo::ValidPointersMap; extern template class HeapInfo::ValidPointersMap; - template inline uint HeapInfo::GetObjectSizeForBucketIndex(uint bucketIndex) { @@ -650,7 +687,6 @@ HeapInfo::GetValidPointersMapForBucket(uint buc return mediumAllocValidPointersMap.GetValidPointersForIndex(bucketIndex); } - template inline typename SmallHeapBlockT::BlockInfo const * HeapInfo::GetBlockInfo(uint objectSize) diff --git a/deps/chakrashim/core/lib/Common/Memory/LargeHeapBlock.cpp b/deps/chakrashim/core/lib/Common/Memory/LargeHeapBlock.cpp index ee27a7905ac..360d52fa75d 100644 --- a/deps/chakrashim/core/lib/Common/Memory/LargeHeapBlock.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/LargeHeapBlock.cpp @@ -8,9 +8,11 @@ CompileAssert( sizeof(LargeObjectHeader) == HeapConstants::ObjectGranularity || sizeof(LargeObjectHeader) == HeapConstants::ObjectGranularity * 2); +#ifdef RECYCLER_PAGE_HEAP #ifdef STACK_BACK_TRACE const StackBackTrace* PageHeapData::s_StackTraceAllocFailed = (StackBackTrace*)1; #endif +#endif void * LargeObjectHeader::GetAddress() { return ((char *)this) + sizeof(LargeObjectHeader); } @@ -188,6 +190,13 @@ LargeHeapBlock::LargeHeapBlock(__in char * address, size_t pageCount, Segment * this->segment = segment; #if ENABLE_CONCURRENT_GC this->isPendingConcurrentSweep = false; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // This flag is to identify whether this block was made available for allocations during the concurrent sweep and still needs to be swept. + this->isPendingConcurrentSweepPrep = false; +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + this->wasAllocatedFromDuringSweep = false; +#endif +#endif #endif this->addressEnd = this->address + this->pageCount * AutoSystemInfo::PageSize; @@ -343,7 +352,7 @@ LargeHeapBlock::ReleasePages(Recycler * recycler) size_t guardPageCount = pageHeapData->actualPageCount - this->pageCount; realPageCount = pageHeapData->actualPageCount; - if (pageHeapData->isGuardPageDecommited) + if (pageHeapData->isGuardPageDecommitted) { void* addr = nullptr; #ifdef RECYCLER_NO_PAGE_REUSE @@ -502,6 +511,13 @@ LargeHeapBlock::AllocFreeListEntry(DECLSPEC_GUARD_OVERFLOW size_t size, ObjectIn Assert(entry->headerIndex < this->objectCount); Assert(this->HeaderList()[entry->headerIndex] == nullptr); +#ifdef RECYCLER_VISITED_HOST + if (attributes & RecyclerVisitedHostBit) + { + ReportFatalException(NULL, E_FAIL, Fatal_RecyclerVisitedHost_LargeHeapBlock, 1); + } +#endif + uint headerIndex = entry->headerIndex; size_t originalSize = entry->objectSize; @@ -544,6 +560,16 @@ LargeHeapBlock::AllocFreeListEntry(DECLSPEC_GUARD_OVERFLOW size_t size, ObjectIn #ifdef RECYCLER_WRITE_BARRIER header->hasWriteBarrier = (attributes & WithBarrierBit) == WithBarrierBit; #endif + + if ((attributes & (FinalizeBit | TrackBit)) != 0) + { + // Make sure a valid vtable is installed as once the attributes have been set this allocation may be traced by background marking + allocObject = (char *)new (allocObject) DummyVTableObject(); +#if defined(_M_ARM32_OR_ARM64) + // On ARM, make sure the v-table write is performed before setting the attributes + MemoryBarrier(); +#endif + } header->SetAttributes(this->heapInfo->recycler->Cookie, (attributes & StoredObjectInfoBitMask)); header->markOnOOMRescan = false; header->SetNext(this->heapInfo->recycler->Cookie, nullptr); @@ -569,6 +595,12 @@ LargeHeapBlock::Alloc(DECLSPEC_GUARD_OVERFLOW size_t size, ObjectInfoBits attrib Assert(HeapInfo::IsAlignedSize(size) || InPageHeapMode()); Assert((attributes & InternalObjectInfoBitMask) == attributes); AssertMsg((attributes & TrackBit) == 0, "Large tracked object collection not implemented"); +#ifdef RECYCLER_VISITED_HOST + if (attributes & RecyclerVisitedHostBit) + { + ReportFatalException(NULL, E_FAIL, Fatal_RecyclerVisitedHost_LargeHeapBlock, 2); + } +#endif LargeObjectHeader * header = (LargeObjectHeader *)allocAddressEnd; #if ENABLE_PARTIAL_GC && ENABLE_CONCURRENT_GC @@ -603,6 +635,15 @@ LargeHeapBlock::Alloc(DECLSPEC_GUARD_OVERFLOW size_t size, ObjectInfoBits attrib #ifdef RECYCLER_WRITE_BARRIER header->hasWriteBarrier = (attributes&WithBarrierBit) == WithBarrierBit; #endif + if ((attributes & (FinalizeBit | TrackBit)) != 0) + { + // Make sure a valid vtable is installed as once the attributes have been set this allocation may be traced by background marking + allocObject = (char *)new (allocObject) DummyVTableObject(); +#if defined(_M_ARM32_OR_ARM64) + // On ARM, make sure the v-table write is performed before setting the attributes + MemoryBarrier(); +#endif + } header->SetAttributes(recycler->Cookie, (attributes & StoredObjectInfoBitMask)); HeaderList()[allocCount++] = header; finalizeCount += ((attributes & FinalizeBit) != 0); @@ -635,6 +676,7 @@ LargeHeapBlock::Mark(void* objectAddress, MarkContext * markContext) DUMP_OBJECT_REFERENCE(markContext->GetRecycler(), objectAddress); size_t objectSize = header->objectSize; +#ifdef RECYCLER_PAGE_HEAP if (this->InPageHeapMode()) { this->VerifyPageHeapPattern(); @@ -651,6 +693,7 @@ LargeHeapBlock::Mark(void* objectAddress, MarkContext * markContext) this->pageHeapData->lastMarkedBy = markContext->parentRef ? (char*)markContext->parentRef : "root"; #endif } +#endif bool markSucceed = UpdateAttributesOfMarkedObjects(markContext, objectAddress, objectSize, attributes, [&](unsigned char attributes) @@ -807,6 +850,7 @@ LargeObjectHeader * LargeHeapBlock::GetHeader(void * objectAddress) const { LargeObjectHeader * header = nullptr; +#ifdef RECYCLER_PAGE_HEAP if (this->InPageHeapMode()) { header = (LargeObjectHeader*)this->address; @@ -816,6 +860,7 @@ LargeHeapBlock::GetHeader(void * objectAddress) const } } else +#endif { Assert(objectAddress >= this->address && objectAddress < this->addressEnd); header = GetHeaderFromAddress(objectAddress); @@ -982,6 +1027,7 @@ LargeHeapBlock::ScanInitialImplicitRoots(Recycler * recycler) // TODO: Assume scan interior? DUMP_IMPLICIT_ROOT(recycler, objectAddress); +#ifdef RECYCLER_PAGE_HEAP if (this->InPageHeapMode()) { size_t objectSize = header->objectSize; @@ -993,6 +1039,7 @@ LargeHeapBlock::ScanInitialImplicitRoots(Recycler * recycler) } } else +#endif { recycler->ScanObjectInlineInterior((void **)objectAddress, header->objectSize); } @@ -1037,6 +1084,7 @@ LargeHeapBlock::ScanNewImplicitRoots(Recycler * recycler) continue; } +#ifdef RECYCLER_PAGE_HEAP if (this->InPageHeapMode()) { size_t objectSize = header->objectSize; @@ -1048,6 +1096,7 @@ LargeHeapBlock::ScanNewImplicitRoots(Recycler * recycler) } } else +#endif { // TODO: Assume scan interior recycler->ScanObjectInlineInterior((void **)objectAddress, header->objectSize); @@ -1185,11 +1234,13 @@ LargeHeapBlock::RescanOnePage(Recycler * recycler) RECYCLER_STATS_ADD(recycler, markData.rescanLargeByteCount, header->objectSize); size_t objectSize = header->objectSize; +#ifdef RECYCLER_PAGE_HEAP if (this->InPageHeapMode()) { // trim off the trailing part which is not a pointer objectSize = HeapInfo::RoundObjectSize(objectSize); } +#endif if (objectSize > 0) // otherwize the object total size is less than a pointer size { if (!recycler->AddMark(objectAddress, objectSize)) @@ -1294,11 +1345,13 @@ LargeHeapBlock::RescanMultiPage(Recycler * recycler) #endif size_t objectSize = header->objectSize; +#ifdef RECYCLER_PAGE_HEAP if (this->InPageHeapMode()) { // trim off the trailing part which is not a pointer objectSize = HeapInfo::RoundObjectSize(objectSize); } +#endif Assert(objectSize > 0); Assert(oldNeedOOMRescan || !header->markOnOOMRescan); @@ -1758,7 +1811,7 @@ LargeHeapBlock::SweepObjects(Recycler * recycler) // mark count included newly allocated objects #if ENABLE_CONCURRENT_GC - Assert(expectedSweepCount == allocCount - markCount || recycler->collectionState == CollectionStateConcurrentSweep); + Assert(expectedSweepCount == allocCount - markCount || recycler->IsConcurrentSweepState()); #else Assert(expectedSweepCount == allocCount - markCount); #endif @@ -1923,6 +1976,30 @@ LargeHeapBlock::EnumerateObjects(ObjectInfoBits infoBits, void (*CallBackFunctio } } +#if ENABLE_MEM_STATS +void +LargeHeapBlock::AggregateBlockStats(HeapBucketStats& stats) +{ + DUMP_FRAGMENTATION_STATS_ONLY(uint objectCount = 0); + size_t objectSize = 0; + for (uint i = 0; i < allocCount; i++) + { + LargeObjectHeader * header = this->GetHeaderByIndex(i); + if (header) + { + DUMP_FRAGMENTATION_STATS_ONLY(objectCount++); + objectSize += header->objectSize; + } + } + + DUMP_FRAGMENTATION_STATS_ONLY(stats.totalBlockCount++); + DUMP_FRAGMENTATION_STATS_ONLY(stats.objectCount += objectCount); + DUMP_FRAGMENTATION_STATS_ONLY(stats.finalizeCount += this->finalizeCount); + + stats.objectByteCount += objectSize; + stats.totalByteCount += AutoSystemInfo::PageSize * pageCount; +} +#endif // ENABLE_MEM_STATS uint LargeHeapBlock::GetMaxLargeObjectCount(size_t pageCount, size_t firstAllocationSize) diff --git a/deps/chakrashim/core/lib/Common/Memory/LargeHeapBlock.h b/deps/chakrashim/core/lib/Common/Memory/LargeHeapBlock.h index 25fd1a9f230..3f5e54d1b99 100644 --- a/deps/chakrashim/core/lib/Common/Memory/LargeHeapBlock.h +++ b/deps/chakrashim/core/lib/Common/Memory/LargeHeapBlock.h @@ -4,7 +4,7 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) #define UINT_PAD_64BIT(x) uint x #else #define UINT_PAD_64BIT(x) @@ -56,7 +56,7 @@ struct LargeObjectHeader void SetAttributes(uint cookie, unsigned char attributes); unsigned char GetAttributes(uint cookie); }; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) static_assert(sizeof(LargeObjectHeader) == 0x20, "Incorrect LargeObjectHeader size"); #else static_assert(sizeof(LargeObjectHeader) == 0x10, "Incorrect LargeObjectHeader size"); @@ -96,7 +96,7 @@ struct PageHeapData { ~PageHeapData(); bool isLockedWithPageHeap; - bool isGuardPageDecommited; + bool isGuardPageDecommitted; PageHeapMode pageHeapMode; uint actualPageCount; @@ -186,6 +186,10 @@ class LargeHeapBlock sealed : public HeapBlock void EnumerateObjects(ObjectInfoBits infoBits, void (*CallBackFunction)(void * address, size_t size)); +#if ENABLE_MEM_STATS + void AggregateBlockStats(HeapBucketStats& stats); +#endif + #ifdef RECYCLER_SLOW_CHECK_ENABLED void Check(bool expectFull, bool expectPending); #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/LargeHeapBucket.cpp b/deps/chakrashim/core/lib/Common/Memory/LargeHeapBucket.cpp index 605e44ae83e..b58e532edbc 100644 --- a/deps/chakrashim/core/lib/Common/Memory/LargeHeapBucket.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/LargeHeapBucket.cpp @@ -222,7 +222,7 @@ LargeHeapBucket::PageHeapAlloc(Recycler * recycler, size_t sizeCat, size_t size, #pragma prefast(suppress:6250, "Calling 'VirtualFree' without the MEM_RELEASE flag might free memory but not address descriptors (VADs).") if (VirtualFree(guardPageAddress, AutoSystemInfo::PageSize * guardPageCount, MEM_DECOMMIT)) { - pageHeapData->isGuardPageDecommited = true; + pageHeapData->isGuardPageDecommitted = true; } else { @@ -234,7 +234,7 @@ LargeHeapBucket::PageHeapAlloc(Recycler * recycler, size_t sizeCat, size_t size, DWORD oldProtect; if (VirtualProtect(guardPageAddress, AutoSystemInfo::PageSize * guardPageCount, PAGE_NOACCESS, &oldProtect)) { - pageHeapData->isGuardPageDecommited = false; + pageHeapData->isGuardPageDecommitted = false; } else { @@ -587,7 +587,11 @@ LargeHeapBucket::Sweep(RecyclerSweep& recyclerSweep) { #if ENABLE_CONCURRENT_GC // CONCURRENT-TODO: large buckets are not swept in the background currently. +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + Assert(!recyclerSweep.GetRecycler()->IsConcurrentExecutingState() && !recyclerSweep.GetRecycler()->IsConcurrentSweepState()); +#else Assert(!recyclerSweep.GetRecycler()->IsConcurrentExecutingState()); +#endif #endif LargeHeapBlock * currentLargeObjectBlocks = largeBlockList; @@ -979,9 +983,12 @@ LargeHeapBucket::TransferDisposedObjects() { #if ENABLE_CONCURRENT_GC Recycler * recycler = this->heapInfo->recycler; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + Assert(!recycler->IsConcurrentExecutingState() && !recycler->IsConcurrentSweepState()); +#else Assert(!recycler->IsConcurrentExecutingState()); #endif - +#endif HeapBlockList::ForEachEditing(this->pendingDisposeLargeBlockList, [this](LargeHeapBlock * heapBlock) { /* GC-TODO: large heap block doesn't support free list yet */ @@ -1123,3 +1130,24 @@ LargeHeapBucket::VerifyMark() } #endif +#if ENABLE_MEM_STATS +void +LargeHeapBucket::AggregateBucketStats() +{ + HeapBucket::AggregateBucketStats(); // call super + + auto blockStatsAggregator = [this](LargeHeapBlock* largeHeapBlock) { + largeHeapBlock->AggregateBlockStats(this->memStats); + }; + + HeapBlockList::ForEach(largeBlockList, blockStatsAggregator); + HeapBlockList::ForEach(fullLargeBlockList, blockStatsAggregator); + HeapBlockList::ForEach(pendingDisposeLargeBlockList, blockStatsAggregator); +#if ENABLE_CONCURRENT_GC + HeapBlockList::ForEach(pendingSweepLargeBlockList, blockStatsAggregator); +#if ENABLE_PARTIAL_GC + HeapBlockList::ForEach(partialSweptLargeBlockList, blockStatsAggregator); +#endif +#endif +} +#endif diff --git a/deps/chakrashim/core/lib/Common/Memory/LargeHeapBucket.h b/deps/chakrashim/core/lib/Common/Memory/LargeHeapBucket.h index 97aeac153fe..fb3d064c16a 100644 --- a/deps/chakrashim/core/lib/Common/Memory/LargeHeapBucket.h +++ b/deps/chakrashim/core/lib/Common/Memory/LargeHeapBucket.h @@ -94,6 +94,10 @@ class LargeHeapBucket: public HeapBucket #endif #endif +#if ENABLE_MEM_STATS + void AggregateBucketStats(); +#endif + private: char * SnailAlloc(Recycler * recycler, DECLSPEC_GUARD_OVERFLOW size_t sizeCat, size_t size, ObjectInfoBits attributes, bool nothrow); char * TryAlloc(Recycler * recycler, DECLSPEC_GUARD_OVERFLOW size_t sizeCat, ObjectInfoBits attributes); diff --git a/deps/chakrashim/core/lib/Common/Memory/MarkContext.cpp b/deps/chakrashim/core/lib/Common/Memory/MarkContext.cpp index 274e084c39d..0e21c95ea3f 100644 --- a/deps/chakrashim/core/lib/Common/Memory/MarkContext.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/MarkContext.cpp @@ -14,6 +14,9 @@ MarkContext::MarkContext(Recycler * recycler, PagePool * pagePool) : recycler(recycler), pagePool(pagePool), markStack(pagePool), +#ifdef RECYCLER_VISITED_HOST + preciseStack(pagePool), +#endif trackStack(pagePool) { } @@ -39,18 +42,27 @@ void MarkContext::OnObjectMarked(void* object, void* parent) void MarkContext::Init(uint reservedPageCount) { markStack.Init(reservedPageCount); +#ifdef RECYCLER_VISITED_HOST + preciseStack.Init(); +#endif trackStack.Init(); } void MarkContext::Clear() { markStack.Clear(); +#ifdef RECYCLER_VISITED_HOST + preciseStack.Clear(); +#endif trackStack.Clear(); } void MarkContext::Abort() { markStack.Abort(); +#ifdef RECYCLER_VISITED_HOST + preciseStack.Abort(); +#endif trackStack.Abort(); pagePool->ReleaseFreePages(); @@ -60,6 +72,9 @@ void MarkContext::Abort() void MarkContext::Release() { markStack.Release(); +#ifdef RECYCLER_VISITED_HOST + preciseStack.Release(); +#endif trackStack.Release(); pagePool->ReleaseFreePages(); @@ -68,17 +83,33 @@ void MarkContext::Release() uint MarkContext::Split(uint targetCount, __in_ecount(targetCount) MarkContext ** targetContexts) { - Assert(targetCount > 0 && targetCount <= PageStack::MaxSplitTargets); + Assert(targetCount > 0 && targetCount <= PageStack::MaxSplitTargets && targetCount <= PageStack::MaxSplitTargets); __analysis_assume(targetCount <= PageStack::MaxSplitTargets); + __analysis_assume(targetCount <= PageStack::MaxSplitTargets); - PageStack * targetStacks[PageStack::MaxSplitTargets]; + PageStack * targetMarkStacks[PageStack::MaxSplitTargets]; +#ifdef RECYCLER_VISITED_HOST + PageStack * targetPreciseStacks[PageStack::MaxSplitTargets]; +#endif for (uint i = 0; i < targetCount; i++) { - targetStacks[i] = &targetContexts[i]->markStack; + targetMarkStacks[i] = &targetContexts[i]->markStack; +#ifdef RECYCLER_VISITED_HOST + targetPreciseStacks[i] = &targetContexts[i]->preciseStack; +#endif } - return this->markStack.Split(targetCount, targetStacks); + // Return the max count of the two splits - since the stacks have more or less unrelated sizes, they + // could yield different number of splits, but the caller wants to know the max parallelism it + // should use on the results of the split. + const uint markStackSplitCount = this->markStack.Split(targetCount, targetMarkStacks); +#ifdef RECYCLER_VISITED_HOST + const uint preciseStackSplitCount = this->preciseStack.Split(targetCount, targetPreciseStacks); + return max(markStackSplitCount, preciseStackSplitCount); +#else + return markStackSplitCount; +#endif } diff --git a/deps/chakrashim/core/lib/Common/Memory/MarkContext.h b/deps/chakrashim/core/lib/Common/Memory/MarkContext.h index 9ecb055c6e1..ddf1ce71c3e 100644 --- a/deps/chakrashim/core/lib/Common/Memory/MarkContext.h +++ b/deps/chakrashim/core/lib/Common/Memory/MarkContext.h @@ -2,12 +2,18 @@ // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- +interface IRecyclerVisitedObject; + namespace Memory { class Recycler; typedef JsUtil::SynchronizedDictionary MarkMap; +#if __has_feature(address_sanitizer) +enum class RecyclerScanMemoryType { General, Stack }; +#endif + class MarkContext { private: @@ -29,6 +35,9 @@ class MarkContext Recycler * GetRecycler() { return this->recycler; } bool AddMarkedObject(void * obj, size_t byteCount); +#ifdef RECYCLER_VISITED_HOST + bool AddPreciselyTracedObject(IRecyclerVisitedObject *obj); +#endif #if ENABLE_CONCURRENT_GC bool AddTrackedObject(FinalizableObject * obj); #endif @@ -39,8 +48,11 @@ class MarkContext void MarkInterior(void * candidate); template void ScanObject(void ** obj, size_t byteCount); + template - void ScanMemory(void ** obj, size_t byteCount); + void ScanMemory(void ** obj, size_t byteCount + ADDRESS_SANITIZER_APPEND(void *asanFakeStack = nullptr)); + template void ProcessMark(); @@ -53,8 +65,17 @@ class MarkContext void Release(); bool HasPendingMarkObjects() const { return !markStack.IsEmpty(); } +#ifdef RECYCLER_VISITED_HOST + bool HasPendingPreciselyTracedObjects() const { return !preciseStack.IsEmpty(); } +#endif bool HasPendingTrackObjects() const { return !trackStack.IsEmpty(); } - bool HasPendingObjects() const { return HasPendingMarkObjects() || HasPendingTrackObjects(); } + bool HasPendingObjects() const { + return HasPendingMarkObjects() +#ifdef RECYCLER_VISITED_HOST + || HasPendingPreciselyTracedObjects() +#endif + || HasPendingTrackObjects(); + } PageAllocator * GetPageAllocator() { return this->pagePool->GetPageAllocator(); } @@ -88,7 +109,13 @@ class MarkContext #ifdef ENABLE_DEBUG_CONFIG_OPTIONS - void SetMaxPageCount(size_t maxPageCount) { markStack.SetMaxPageCount(maxPageCount); trackStack.SetMaxPageCount(maxPageCount); } + void SetMaxPageCount(size_t maxPageCount) { + markStack.SetMaxPageCount(maxPageCount); +#ifdef RECYCLER_VISITED_HOST + preciseStack.SetMaxPageCount(maxPageCount); +#endif + trackStack.SetMaxPageCount(maxPageCount); + } #endif #ifdef RECYCLER_MARK_TRACK @@ -102,6 +129,9 @@ class MarkContext Recycler * recycler; PagePool * pagePool; PageStack markStack; +#ifdef RECYCLER_VISITED_HOST + PageStack preciseStack; +#endif PageStack trackStack; #ifdef RECYCLER_MARK_TRACK diff --git a/deps/chakrashim/core/lib/Common/Memory/MarkContext.inl b/deps/chakrashim/core/lib/Common/Memory/MarkContext.inl index bf4b3ef9671..2a0bb4ea636 100644 --- a/deps/chakrashim/core/lib/Common/Memory/MarkContext.inl +++ b/deps/chakrashim/core/lib/Common/Memory/MarkContext.inl @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- @@ -22,11 +22,27 @@ bool MarkContext::AddMarkedObject(void * objectAddress, size_t objectSize) RECYCLER_STATS_INTERLOCKED_INC(recycler, scanCount); MarkCandidate markCandidate; - markCandidate.obj = (void **) objectAddress; + +#if defined(_WIN64) && defined(_M_X64) + // Enabling store forwards. The intrinsic generates stores matching the load in size. + // This enables skipping caches and forwarding the store data to the following load. + *(__m128i *)&markCandidate = _mm_set_epi64x(objectSize, (__int64)objectAddress); +#else + markCandidate.obj = (void**)objectAddress; markCandidate.byteCount = objectSize; +#endif return markStack.Push(markCandidate); } +#ifdef RECYCLER_VISITED_HOST +inline bool MarkContext::AddPreciselyTracedObject(IRecyclerVisitedObject* obj) +{ + FAULTINJECT_MEMORY_MARK_NOTHROW(_u("AddPreciselyTracedObject"), 0); + + return preciseStack.Push(obj); +} +#endif + #if ENABLE_CONCURRENT_GC inline bool MarkContext::AddTrackedObject(FinalizableObject * obj) @@ -48,7 +64,8 @@ bool MarkContext::AddTrackedObject(FinalizableObject * obj) template NO_SANITIZE_ADDRESS inline -void MarkContext::ScanMemory(void ** obj, size_t byteCount) +void MarkContext::ScanMemory(void ** obj, size_t byteCount + ADDRESS_SANITIZER_APPEND(void *asanFakeStack)) { Assert(byteCount != 0); Assert(byteCount % sizeof(void *) == 0); @@ -63,6 +80,11 @@ void MarkContext::ScanMemory(void ** obj, size_t byteCount) } #endif +#if __has_feature(address_sanitizer) + void *fakeFrameBegin = nullptr; + void *fakeFrameEnd = nullptr; +#endif + do { // We need to ensure that the compiler does not reintroduce reads to the object after inlining. @@ -79,7 +101,30 @@ void MarkContext::ScanMemory(void ** obj, size_t byteCount) #if DBG this->parentRef = obj; #endif - Mark(candidate, parentObject); + +#if __has_feature(address_sanitizer) + bool isFakeStackAddr = false; + if (asanFakeStack) + { + void *beg = nullptr; + void *end = nullptr; + isFakeStackAddr = __asan_addr_is_in_fake_stack(asanFakeStack, candidate, &beg, &end) != nullptr; + if (isFakeStackAddr && (beg != fakeFrameBegin || end != fakeFrameEnd)) + { + ScanMemory((void**)beg, (char*)end - (char*)beg); + fakeFrameBegin = beg; + fakeFrameEnd = end; + } + } + + if (!isFakeStackAddr) + { +#endif + Mark(candidate, parentObject); + +#if __has_feature(address_sanitizer) + } +#endif obj++; } while (obj != objEnd); @@ -117,29 +162,27 @@ void MarkContext::Mark(void * candidate, void * parentReference) // Otherwise our rescanState could be out of sync with mark state. Assert(!recycler->isProcessingRescan); +#if defined(RECYCLER_STATS) || !defined(_M_X64) if ((size_t)candidate < 0x10000) { RECYCLER_STATS_INTERLOCKED_INC(recycler, tryMarkNullCount); return; } +#endif if (interior) { -#if ENABLE_CONCURRENT_GC - Assert(recycler->enableScanInteriorPointers - || (!recycler->IsConcurrentState() && recycler->collectionState != CollectionStateParallelMark)); -#else - Assert(recycler->enableScanInteriorPointers || recycler->collectionState != CollectionStateParallelMark); -#endif recycler->heapBlockMap.MarkInterior(candidate, this); return; } +#if defined(RECYCLER_STATS) || !defined(_M_X64) if (!HeapInfo::IsAlignedAddress(candidate)) { RECYCLER_STATS_INTERLOCKED_INC(recycler, tryMarkUnalignedCount); return; } +#endif recycler->heapBlockMap.Mark(candidate, this); @@ -153,8 +196,12 @@ void MarkContext::MarkTrackedObject(FinalizableObject * trackedObject) { #if ENABLE_CONCURRENT_GC Assert(!recycler->queueTrackedObject); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + Assert(!recycler->IsConcurrentExecutingState() && !recycler->IsConcurrentSweepState()); +#else Assert(!recycler->IsConcurrentExecutingState()); #endif +#endif #if ENABLE_PARTIAL_GC Assert(!recycler->inPartialCollectMode); #endif @@ -183,39 +230,69 @@ void MarkContext::ProcessMark() } #endif -#if defined(_M_IX86) || defined(_M_X64) - MarkCandidate current, next; - - while (markStack.Pop(¤t)) +#ifdef RECYCLER_VISITED_HOST + // Flip between processing the generic mark stack (conservatively traced with ScanMemory) and + // the precise stack (precisely traced via IRecyclerVisitedObject::Trace). Each of those + // operations on an object has the potential to add new marked objects to either or both + // stacks so we must loop until they are both empty. + while (!markStack.IsEmpty() || !preciseStack.IsEmpty()) +#endif { - // Process entries and prefetch as we go. - while (markStack.Pop(&next)) + // It is possible that when the stacks were split, only one of them had any chunks to process. + // If that is the case, one of the stacks might not be initialized, so we must check !IsEmpty before popping. + if (!markStack.IsEmpty()) { - // Prefetch the next entry so it's ready when we need it. - _mm_prefetch((char *)next.obj, _MM_HINT_T0); +#if defined(_M_IX86) || defined(_M_X64) + MarkCandidate current, next; - // Process the previously retrieved entry. - ScanObject(current.obj, current.byteCount); + while (markStack.Pop(¤t)) + { + // Process entries and prefetch as we go. + while (markStack.Pop(&next)) + { + // Prefetch the next entry so it's ready when we need it. + _mm_prefetch((char *)next.obj, _MM_HINT_T0); - current = next; - } + // Process the previously retrieved entry. + ScanObject(current.obj, current.byteCount); - // The stack is empty, but we still have a previously retrieved entry; process it now. - ScanObject(current.obj, current.byteCount); + _mm_prefetch((char *)*(next.obj), _MM_HINT_T0); - // Processing that entry may have generated more entries in the mark stack, so continue the loop. - } -#else - // _mm_prefetch intrinsic is specific to Intel platforms. - // CONSIDER: There does seem to be a compiler intrinsic for prefetch on ARM, - // however, the information on this is scarce, so for now just don't do prefetch on ARM. - MarkCandidate current; + current = next; + } - while (markStack.Pop(¤t)) - { - ScanObject(current.obj, current.byteCount); - } + // The stack is empty, but we still have a previously retrieved entry; process it now. + ScanObject(current.obj, current.byteCount); + + // Processing that entry may have generated more entries in the mark stack, so continue the loop. + } +#else + // _mm_prefetch intrinsic is specific to Intel platforms. + // CONSIDER: There does seem to be a compiler intrinsic for prefetch on ARM, + // however, the information on this is scarce, so for now just don't do prefetch on ARM. + MarkCandidate current; + + while (markStack.Pop(¤t)) + { + ScanObject(current.obj, current.byteCount); + } #endif + } + + Assert(markStack.IsEmpty()); - Assert(markStack.IsEmpty()); +#ifdef RECYCLER_VISITED_HOST + if (!preciseStack.IsEmpty()) + { + MarkContextWrapper markContextWrapper(this); + IRecyclerVisitedObject* tracedObject; + while (preciseStack.Pop(&tracedObject)) + { + tracedObject->Trace(&markContextWrapper); + } + } + + Assert(preciseStack.IsEmpty()); +#endif + } } diff --git a/deps/chakrashim/core/lib/Common/Memory/MarkContextWrapper.h b/deps/chakrashim/core/lib/Common/Memory/MarkContextWrapper.h new file mode 100644 index 00000000000..7d8efb69fdb --- /dev/null +++ b/deps/chakrashim/core/lib/Common/Memory/MarkContextWrapper.h @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "Core/RecyclerHeapMarkingContext.h" + +// Class used to wrap a MarkContext so that calls to MarkObjects during IRecyclerVisitedObject::Trace +// can mark with the correct contextual template parameters +template +class MarkContextWrapper : public IRecyclerHeapMarkingContext +{ +public: + MarkContextWrapper(MarkContext* context) : markContext(context) {} + + void MarkObjects(void** objects, size_t count, void* parent) override + { + for (size_t i = 0; i < count; i++) + { + // We pass true for interior, since we expect a majority of the pointers being marked by + // external objects to themselves be external (and thus candidates for interior pointers). + markContext->Mark(objects[i], parent); + } + } + +private: + // Should only be created on the stack + void* operator new(size_t); + MarkContext* markContext; +}; diff --git a/deps/chakrashim/core/lib/Common/Memory/PageAllocator.cpp b/deps/chakrashim/core/lib/Common/Memory/PageAllocator.cpp index 61a3772d25d..fed19d5efc8 100644 --- a/deps/chakrashim/core/lib/Common/Memory/PageAllocator.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/PageAllocator.cpp @@ -36,7 +36,7 @@ SegmentBase::SegmentBase(PageAllocatorBase * allocator, size_t pageCount, leadingGuardPageCount(0), secondaryAllocPageCount(allocator->secondaryAllocPageCount), secondaryAllocator(nullptr) -#if defined(_M_X64_OR_ARM64) && defined(RECYCLER_WRITE_BARRIER) +#if defined(TARGET_64) && defined(RECYCLER_WRITE_BARRIER) , isWriteBarrierAllowed(false) , isWriteBarrierEnabled(enableWriteBarrier) #endif @@ -62,7 +62,7 @@ SegmentBase::~SegmentBase() char* originalAddress = this->address - (leadingGuardPageCount * AutoSystemInfo::PageSize); GetAllocator()->GetVirtualAllocator()->Free(originalAddress, GetPageCount() * AutoSystemInfo::PageSize, MEM_RELEASE); GetAllocator()->ReportFree(this->segmentPageCount * AutoSystemInfo::PageSize); //Note: We reported the guard pages free when we decommitted them during segment initialization -#if defined(_M_X64_OR_ARM64) && defined(RECYCLER_WRITE_BARRIER_BYTE) +#if defined(TARGET_64) && defined(RECYCLER_WRITE_BARRIER_BYTE) #if ENABLE_DEBUG_CONFIG_OPTIONS if (CONFIG_FLAG(StrictWriteBarrierCheck) && this->isWriteBarrierEnabled) { @@ -84,7 +84,7 @@ SegmentBase::Initialize(DWORD allocFlags, bool excludeGuardPages) if (!excludeGuardPages) { addGuardPages = (this->segmentPageCount * AutoSystemInfo::PageSize) > VirtualAllocThreshold; -#if _M_IX86_OR_ARM32 +#if TARGET_32 unsigned int randomNumber2 = static_cast(Math::Rand()); addGuardPages = addGuardPages && (randomNumber2 % 4 == 1); #endif @@ -160,7 +160,7 @@ SegmentBase::Initialize(DWORD allocFlags, bool excludeGuardPages) } #ifdef RECYCLER_WRITE_BARRIER -#if defined(_M_X64_OR_ARM64) && defined(RECYCLER_WRITE_BARRIER_BYTE) +#if defined(TARGET_64) && defined(RECYCLER_WRITE_BARRIER_BYTE) bool registerBarrierResult = true; #if ENABLE_DEBUG_CONFIG_OPTIONS if (CONFIG_FLAG(StrictWriteBarrierCheck)) @@ -2187,7 +2187,7 @@ void PageAllocatorBase::AddUsedBytes(size_t bytes) { usedBytes += bytes; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) size_t lastTotalUsedBytes = ::InterlockedExchangeAdd64((volatile LONG64 *)&totalUsedBytes, bytes); #else DWORD lastTotalUsedBytes = ::InterlockedExchangeAdd(&totalUsedBytes, bytes); @@ -2221,7 +2221,7 @@ PageAllocatorBase::SubUsedBytes(size_t by usedBytes -= bytes; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) size_t lastTotalUsedBytes = ::InterlockedExchangeAdd64((volatile LONG64 *)&totalUsedBytes, -(LONG64)bytes); #else DWORD lastTotalUsedBytes = ::InterlockedExchangeSubtract(&totalUsedBytes, bytes); diff --git a/deps/chakrashim/core/lib/Common/Memory/PageAllocator.h b/deps/chakrashim/core/lib/Common/Memory/PageAllocator.h index 1970e570d15..088675f0d6f 100644 --- a/deps/chakrashim/core/lib/Common/Memory/PageAllocator.h +++ b/deps/chakrashim/core/lib/Common/Memory/PageAllocator.h @@ -65,7 +65,7 @@ typedef void* FunctionTableHandle; #endif -#ifdef _M_X64 +#ifdef TARGET_64 #define XDATA_RESERVE_PAGE_COUNT (2) // Number of pages per page segment (32 pages) reserved for xdata. #else #define XDATA_RESERVE_PAGE_COUNT (0) // ARM uses the heap, so it's not required. @@ -83,13 +83,13 @@ struct SecondaryAllocation } }; -#if defined(_M_X64) +#if defined(TARGET_64) struct XDataInfo { RUNTIME_FUNCTION pdata; FunctionTableHandle functionTable; }; -#elif defined(_M_ARM32_OR_ARM64) +#elif defined(_M_ARM) struct XDataInfo { ushort pdataCount; @@ -183,7 +183,7 @@ class SegmentBase: public SegmentBaseCommon SecondaryAllocator* GetSecondaryAllocator() { return secondaryAllocator; } -#if defined(_M_X64_OR_ARM64) && defined(RECYCLER_WRITE_BARRIER) +#if defined(TARGET_64) && defined(RECYCLER_WRITE_BARRIER) bool IsWriteBarrierAllowed() { return isWriteBarrierAllowed; @@ -195,9 +195,9 @@ class SegmentBase: public SegmentBaseCommon #endif protected: -#if _M_IX86_OR_ARM32 +#if TARGET_32 static const uint VirtualAllocThreshold = 524288; // 512kb As per spec -#else // _M_X64_OR_ARM64 +#else // TARGET_64 static const uint VirtualAllocThreshold = 1048576; // 1MB As per spec : when we cross this threshold of bytes, we should add guard pages #endif static const uint maxGuardPages = 15; diff --git a/deps/chakrashim/core/lib/Common/Memory/Recycler.cpp b/deps/chakrashim/core/lib/Common/Memory/Recycler.cpp index 882f13a43d0..f88de4c41bf 100644 --- a/deps/chakrashim/core/lib/Common/Memory/Recycler.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/Recycler.cpp @@ -35,20 +35,6 @@ Recycler::TrackerData Recycler::TrackerData::EmptyData(&typeid(UnallocatedPortio Recycler::TrackerData Recycler::TrackerData::ExplicitFreeListObjectData(&typeid(ExplicitFreeListedObject), false); #endif -enum ETWEventGCActivationKind : unsigned -{ - ETWEvent_GarbageCollect = 0, // force in-thread GC - ETWEvent_ThreadCollect = 1, // thread GC with wait - ETWEvent_ConcurrentCollect = 2, - ETWEvent_PartialCollect = 3, - - ETWEvent_ConcurrentMark = 11, - ETWEvent_ConcurrentRescan = 12, - ETWEvent_ConcurrentSweep = 13, - ETWEvent_ConcurrentTransferSwept = 14, - ETWEvent_ConcurrentFinishMark = 15, -}; - DefaultRecyclerCollectionWrapper DefaultRecyclerCollectionWrapper::Instance; inline bool @@ -160,6 +146,9 @@ Recycler::Recycler(AllocationPolicyManager * policyManager, IdleDecommitPageAllo enableConcurrentMark(false), // Default to non-concurrent enableParallelMark(false), enableConcurrentSweep(false), +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + allowAllocationsDuringConcurrentSweepForCollection(false), +#endif concurrentThread(NULL), concurrentWorkReadyEvent(NULL), concurrentWorkDoneEvent(NULL), @@ -293,13 +282,13 @@ Recycler::Recycler(AllocationPolicyManager * policyManager, IdleDecommitPageAllo #if DBG this->heapBlockCount = 0; - this->collectionCount = 0; this->disableThreadAccessCheck = false; #if ENABLE_CONCURRENT_GC this->disableConcurrentThreadExitedCheck = false; #endif #endif #if DBG || defined RECYCLER_TRACE + this->collectionCount = 0; this->inResolveExternalWeakReferences = false; #endif #if DBG || defined(RECYCLER_STATS) @@ -1383,7 +1372,7 @@ Recycler::TryLargeAlloc(HeapInfo * heap, size_t size, ObjectInfoBits attributes, if (memBlock != nullptr) { #ifdef RECYCLER_ZERO_MEM_CHECK - VerifyZeroFill(memBlock, sizeCat); + VerifyLargeAllocZeroFill(memBlock, sizeCat, attributes); #endif return memBlock; } @@ -1406,7 +1395,7 @@ Recycler::TryLargeAlloc(HeapInfo * heap, size_t size, ObjectInfoBits attributes, if (memBlock != nullptr) { #ifdef RECYCLER_ZERO_MEM_CHECK - VerifyZeroFill(memBlock, size); + VerifyLargeAllocZeroFill(memBlock, size, attributes); #endif return memBlock; } @@ -1422,7 +1411,7 @@ Recycler::TryLargeAlloc(HeapInfo * heap, size_t size, ObjectInfoBits attributes, memBlock = heapBlock->Alloc(sizeCat, attributes); Assert(memBlock != nullptr); #ifdef RECYCLER_ZERO_MEM_CHECK - VerifyZeroFill(memBlock, sizeCat); + VerifyLargeAllocZeroFill(memBlock, sizeCat, attributes); #endif return memBlock; } @@ -1595,14 +1584,21 @@ static void* GetStackBase() __asm { mov [eax+0x14], ebp} \ __asm { mov [eax+0x18], esi} \ __asm { mov [eax+0x1c], edi} \ - __asm { pop eax } + __asm { pop eax } \ + SAVE_THREAD_ASAN_FAKE_STACK() #elif _M_ARM -#define SAVE_THREAD_CONTEXT() arm_SAVE_REGISTERS(this->savedThreadContext.GetRegisters()); +#define SAVE_THREAD_CONTEXT() \ + arm_SAVE_REGISTERS(this->savedThreadContext.GetRegisters()); \ + SAVE_THREAD_ASAN_FAKE_STACK() #elif _M_ARM64 -#define SAVE_THREAD_CONTEXT() arm64_SAVE_REGISTERS(this->savedThreadContext.GetRegisters()); +#define SAVE_THREAD_CONTEXT() \ + arm64_SAVE_REGISTERS(this->savedThreadContext.GetRegisters()); \ + SAVE_THREAD_ASAN_FAKE_STACK() #elif _M_AMD64 -#define SAVE_THREAD_CONTEXT() amd64_SAVE_REGISTERS(this->savedThreadContext.GetRegisters()); +#define SAVE_THREAD_CONTEXT() \ + amd64_SAVE_REGISTERS(this->savedThreadContext.GetRegisters()); \ + SAVE_THREAD_ASAN_FAKE_STACK() #else #error Unexpected architecture #endif @@ -1740,22 +1736,28 @@ Recycler::ScanStack() BEGIN_DUMP_OBJECT(this, _u("Registers")); if (doSpecialMark) { - ScanMemoryInline(this->savedThreadContext.GetRegisters(), sizeof(void*) * SavedRegisterState::NumRegistersToSave); + ScanMemoryInline( + this->savedThreadContext.GetRegisters(), sizeof(void*) * SavedRegisterState::NumRegistersToSave + ADDRESS_SANITIZER_APPEND(RecyclerScanMemoryType::Stack)); } else { - ScanMemoryInline(this->savedThreadContext.GetRegisters(), sizeof(void*) * SavedRegisterState::NumRegistersToSave); + ScanMemoryInline( + this->savedThreadContext.GetRegisters(), sizeof(void*) * SavedRegisterState::NumRegistersToSave + ADDRESS_SANITIZER_APPEND(RecyclerScanMemoryType::Stack)); } END_DUMP_OBJECT(this); BEGIN_DUMP_OBJECT(this, _u("Stack")); if (doSpecialMark) { - ScanMemoryInline((void**) stackTop, stackScanned); + ScanMemoryInline((void**) stackTop, stackScanned + ADDRESS_SANITIZER_APPEND(RecyclerScanMemoryType::Stack)); } else { - ScanMemoryInline((void**) stackTop, stackScanned); + ScanMemoryInline((void**) stackTop, stackScanned + ADDRESS_SANITIZER_APPEND(RecyclerScanMemoryType::Stack)); } END_DUMP_OBJECT(this); @@ -3084,15 +3086,23 @@ Recycler::Sweep(bool concurrent) #if ENABLE_CONCURRENT_GC if (concurrent) { - if (!StartConcurrent(CollectionStateConcurrentSweep)) + bool needForceForground = !StartConcurrent(CollectionStateConcurrentSweep); + + if(needForceForground) { - // Failed to spawn the concurrent sweep. - // Instead, force the concurrent sweep to happen right here in thread. - this->collectionState = CollectionStateConcurrentSweep; + // Failed to spawn the concurrent sweep. + // Instead, force the concurrent sweep to happen right here in thread. +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + this->allowAllocationsDuringConcurrentSweepForCollection = false; + } +#endif + this->collectionState = CollectionStateConcurrentSweep; - DoBackgroundWork(true); - // Continue as if the concurrent sweep were executing - // Next time we check for completion, we will finish the sweep just as if it had happened out of thread. + DoBackgroundWork(true); + // Continue as if the concurrent sweep were executing + // Next time we check for completion, we will finish the sweep just as if it had happened out of thread. } return true; } @@ -3106,11 +3116,11 @@ void Recycler::DisplayMemStats() { #ifdef PERF_COUNTERS #if DBG_DUMP - printf("Recycler Live Object Count %u\n", PerfCounter::RecyclerCounterSet::GetLiveObjectCounter().GetValue()); - printf("Recycler Live Object Size %u\n", PerfCounter::RecyclerCounterSet::GetLiveObjectSizeCounter().GetValue()); + Output::Print(_u("Recycler Live Object Count %u\n"), PerfCounter::RecyclerCounterSet::GetLiveObjectCounter().GetValue()); + Output::Print(_u("Recycler Live Object Size %u\n"), PerfCounter::RecyclerCounterSet::GetLiveObjectSizeCounter().GetValue()); #endif - printf("Recycler Used Page Size %u\n", PerfCounter::PageAllocatorCounterSet::GetUsedSizeCounter(PageAllocatorType::PageAllocatorType_Recycler).GetValue()); + Output::Print(_u("Recycler Used Page Size %u\n"), PerfCounter::PageAllocatorCounterSet::GetUsedSizeCounter(PageAllocatorType::PageAllocatorType_Recycler).GetValue()); #endif } #endif @@ -3367,7 +3377,7 @@ Recycler::FinishDisposeObjects() if (!this->inDispose && this->hasDisposableObject && GetRecyclerFlagsTable().Trace.IsEnabled(Js::RecyclerPhase)) { - Output::Print(_u("%04X> RC(%p): %s\n"), this->mainThreadId, this, _u("Dispose object delayed")); + Output::Print(_u("%04X> RC(%p): %s %d\n"), this->mainThreadId, this, _u("Dispose object delayed"), this->collectionState); } #endif return false; @@ -3757,7 +3767,7 @@ Recycler::DoCollectWrapped(CollectionFlags flags) BOOL collected = collectionWrapper->ExecuteRecyclerCollectionFunction(this, &Recycler::DoCollect, flags); #if ENABLE_CONCURRENT_GC - Assert(IsConcurrentExecutingState() || IsConcurrentFinishedState() || !CollectionInProgress()); + Assert(IsConcurrentExecutingState() || IsConcurrentSweepState() || IsConcurrentFinishedState() || !CollectionInProgress()); #else Assert(!CollectionInProgress()); #endif @@ -3861,7 +3871,7 @@ Recycler::DoCollect(CollectionFlags flags) Assert(this->backgroundFinishMarkCount == 0); #endif -#if DBG +#if DBG || defined RECYCLER_TRACE collectionCount++; #endif collectionState = Collection_PreCollection; @@ -4370,7 +4380,7 @@ BOOL Recycler::RequestConcurrentWrapperCallback() { #if ENABLE_CONCURRENT_GC - Assert(!IsConcurrentExecutingState()); + Assert(!IsConcurrentExecutingState() && !IsConcurrentSweepState()); // Save the original collection state CollectionState oldState = this->collectionState; @@ -4481,7 +4491,7 @@ Recycler::FinishConcurrent() #if ENABLE_BACKGROUND_PAGE_FREEING if (CONFIG_FLAG(EnableBGFreeZero)) { - if (this->collectionState == CollectionStateConcurrentSweep) + if (this->IsConcurrentSweepState()) { // Help with the background thread to zero and flush zero pages // if we are going to wait anyways. @@ -4641,7 +4651,19 @@ Recycler::IsConcurrentSweepSetupState() const BOOL Recycler::IsConcurrentSweepState() const { - return this->collectionState == CollectionStateConcurrentSweep; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + return this->collectionState == CollectionStateConcurrentSweepPass1 || + this->collectionState == CollectionStateConcurrentSweepPass1Wait || + this->collectionState == CollectionStateConcurrentSweepPass2 || + this->collectionState == CollectionStateConcurrentSweepPass2Wait; + } + else +#endif + { + return this->collectionState == CollectionStateConcurrentSweep; + } } BOOL @@ -4747,6 +4769,36 @@ bool Recycler::AbortConcurrent(bool restoreState) { this->ResetMarkCollectionState(); } +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + else if (collectionState == CollectionStateConcurrentSweepPass1Wait) + { + // Make sure we don't do another GC after finishing this one. + this->inExhaustiveCollection = false; + + this->FinishSweepPrep(); + this->FinishConcurrentSweepPass1(); + this->collectionState = CollectionStateConcurrentSweepPass2; + this->recyclerSweep->FinishSweep(); + this->FinishConcurrentSweep(); + this->recyclerSweep->EndBackground(); + + uint sweptBytes = 0; +#ifdef RECYCLER_STATS + sweptBytes = (uint)collectionStats.objectSweptBytes; +#endif + + GCETW(GC_BACKGROUNDSWEEP_STOP, (this, sweptBytes)); + + this->collectionState = CollectionStateTransferSweptWait; + RECYCLER_PROFILE_EXEC_BACKGROUND_END(this, Js::ConcurrentSweepPhase); + + // AbortConcurrent already consumed the event from the concurrent thread, just signal it so + // FinishConcurrentCollect can wait for it again. + SetEvent(this->concurrentWorkDoneEvent); + + EnsureNotCollecting(); + } +#endif else if (collectionState == CollectionStateTransferSweptWait) { // Make sure we don't do another GC after finishing this one. @@ -5259,7 +5311,8 @@ Recycler::BackgroundScanStack() if (stackTop != nullptr) { size_t size = (char *)stackBase - stackTop; - ScanMemoryInline((void **)stackTop, size); + ScanMemoryInline((void **)stackTop, size + ADDRESS_SANITIZER_APPEND(RecyclerScanMemoryType::Stack)); return size; } @@ -5687,8 +5740,48 @@ Recycler::FinishConcurrentCollect(CollectionFlags flags) #endif GCETW_INTERNAL(GC_STOP, (this, ETWEvent_ConcurrentRescan)); } +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + else if (collectionState == CollectionStateConcurrentSweepPass1Wait) + { + this->FinishSweepPrep(); + + if (forceInThread) + { + this->FinishConcurrentSweepPass1(); + this->collectionState = CollectionStateConcurrentSweepPass2; +#ifdef RECYCLER_TRACE + if (this->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + Output::Print(_u("[GC #%d] Finishing Sweep Pass2 in-thread. \n"), this->collectionCount); + } +#endif + this->recyclerSweep->FinishSweep(); + this->FinishConcurrentSweep(); + this->recyclerSweep->EndBackground(); + + uint sweptBytes = 0; +#ifdef RECYCLER_STATS + sweptBytes = (uint)collectionStats.objectSweptBytes; +#endif + + GCETW(GC_BACKGROUNDSWEEP_STOP, (this, sweptBytes)); + + this->collectionState = CollectionStateTransferSweptWait; + RECYCLER_PROFILE_EXEC_BACKGROUND_END(this, Js::ConcurrentSweepPhase); + + FinishTransferSwept(flags); + } + else + { + needConcurrentSweep = true; + // Signal the background thread to finish concurrent sweep Pass2 for all the buckets. + StartConcurrent(CollectionStateConcurrentSweepPass2); + } + } +#endif else { + AssertMsg(this->collectionState == CollectionStateTransferSweptWait, "Do we need to handle this state?"); FinishTransferSwept(flags); } @@ -5886,54 +5979,156 @@ Recycler::DoBackgroundWork(bool forceForeground) else { Assert(this->enableConcurrentSweep); - Assert(this->collectionState == CollectionStateConcurrentSweep); - RECYCLER_PROFILE_EXEC_BACKGROUND_BEGIN(this, Js::ConcurrentSweepPhase); - GCETW_INTERNAL(GC_START, (this, ETWEvent_ConcurrentSweep)); - GCETW(GC_BACKGROUNDZEROPAGE_START, (this)); +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !forceForeground) + { + if (this->collectionState == CollectionStateConcurrentSweep) + { + this->DoTwoPassConcurrentSweepPreCheck(); -#if ENABLE_BACKGROUND_PAGE_ZEROING - if (CONFIG_FLAG(EnableBGFreeZero)) + if (this->AllowAllocationsDuringConcurrentSweep()) + { + this->collectionState = CollectionStateConcurrentSweepPass1; + } + } + + Assert((!this->AllowAllocationsDuringConcurrentSweep() && this->collectionState == CollectionStateConcurrentSweep) || this->collectionState == CollectionStateConcurrentSweepPass1 || this->collectionState == CollectionStateConcurrentSweepPass2); + } + else +#endif + { + Assert(this->collectionState == CollectionStateConcurrentSweep); + } + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (this->collectionState == CollectionStateConcurrentSweepPass1 || + ((!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) ||!this->AllowAllocationsDuringConcurrentSweep()) && this->collectionState == CollectionStateConcurrentSweep)) +#endif { - // Zero the queued pages first so they are available to be allocated - recyclerPageAllocator.BackgroundZeroQueuedPages(); - recyclerLargeBlockPageAllocator.BackgroundZeroQueuedPages(); + RECYCLER_PROFILE_EXEC_BACKGROUND_BEGIN(this, Js::ConcurrentSweepPhase); + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (this->collectionState == CollectionStateConcurrentSweepPass1) + { + GCETW_INTERNAL(GC_START, (this, ETWEvent_ConcurrentSweep_Pass1)); + } + else +#endif + { + GCETW_INTERNAL(GC_START, (this, ETWEvent_ConcurrentSweep)); + } + + GCETW(GC_BACKGROUNDZEROPAGE_START, (this)); + +#if ENABLE_BACKGROUND_PAGE_ZEROING + if (CONFIG_FLAG(EnableBGFreeZero)) + { + // Zero the queued pages first so they are available to be allocated + recyclerPageAllocator.BackgroundZeroQueuedPages(); + recyclerLargeBlockPageAllocator.BackgroundZeroQueuedPages(); #ifdef RECYCLER_WRITE_BARRIER_ALLOC_SEPARATE_PAGE - recyclerWithBarrierPageAllocator.BackgroundZeroQueuedPages(); + recyclerWithBarrierPageAllocator.BackgroundZeroQueuedPages(); #endif - } + } #endif - GCETW(GC_BACKGROUNDZEROPAGE_STOP, (this)); - GCETW(GC_BACKGROUNDSWEEP_START, (this)); + GCETW(GC_BACKGROUNDZEROPAGE_STOP, (this)); + GCETW(GC_BACKGROUNDSWEEP_START, (this)); - Assert(this->recyclerSweep != nullptr); - this->recyclerSweep->BackgroundSweep(); + Assert(this->recyclerSweep != nullptr); + this->recyclerSweep->BackgroundSweep(); - uint sweptBytes = 0; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (this->collectionState == CollectionStateConcurrentSweepPass1) + { + GCETW_INTERNAL(GC_STOP, (this, ETWEvent_ConcurrentSweep_Pass1)); + } +#endif + + // If allocations were allowed during concurrent sweep then the allocableHeapBlock lists still needs to be swept so we + // will remain in CollectionStateConcurrentSweepPass1Wait state. +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && this->AllowAllocationsDuringConcurrentSweep()) + { + this->collectionState = CollectionStateConcurrentSweepPass1Wait; + } +#endif + } +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + if (this->collectionState == CollectionStateConcurrentSweepPass2) + { +#ifdef RECYCLER_TRACE + if (this->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + Output::Print(_u("[GC #%d] Finishing Sweep Pass2 on background thread. \n"), this->collectionCount); + } +#endif +#if ENABLE_BACKGROUND_PAGE_ZEROING + if (CONFIG_FLAG(EnableBGFreeZero)) + { + // Drain the zero queue again as we might have free more during sweep + // in the background + GCETW(GC_BACKGROUNDZEROPAGE_START, (this)); + recyclerPageAllocator.BackgroundZeroQueuedPages(); +#ifdef RECYCLER_WRITE_BARRIER_ALLOC_SEPARATE_PAGE + recyclerWithBarrierPageAllocator.BackgroundZeroQueuedPages(); +#endif + recyclerLargeBlockPageAllocator.BackgroundZeroQueuedPages(); + GCETW(GC_BACKGROUNDZEROPAGE_STOP, (this)); + } +#endif + this->FinishConcurrentSweepPass1(); + this->recyclerSweep->FinishSweep(); + this->FinishConcurrentSweep(); + this->recyclerSweep->EndBackground(); + + this->collectionState = CollectionStateConcurrentSweepPass2Wait; + } + } +#endif +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (this->collectionState == CollectionStateConcurrentSweepPass2Wait || + (!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) || !this->AllowAllocationsDuringConcurrentSweep())) +#endif + { + uint sweptBytes = 0; #ifdef RECYCLER_STATS - sweptBytes = (uint)collectionStats.objectSweptBytes; + sweptBytes = (uint)collectionStats.objectSweptBytes; #endif - GCETW(GC_BACKGROUNDSWEEP_STOP, (this, sweptBytes)); + GCETW(GC_BACKGROUNDSWEEP_STOP, (this, sweptBytes)); #if ENABLE_BACKGROUND_PAGE_ZEROING - if (CONFIG_FLAG(EnableBGFreeZero)) - { - // Drain the zero queue again as we might have free more during sweep - // in the background - GCETW(GC_BACKGROUNDZEROPAGE_START, (this)); - recyclerPageAllocator.BackgroundZeroQueuedPages(); + if (CONFIG_FLAG(EnableBGFreeZero)) + { + // Drain the zero queue again as we might have free more during sweep + // in the background + GCETW(GC_BACKGROUNDZEROPAGE_START, (this)); + recyclerPageAllocator.BackgroundZeroQueuedPages(); #ifdef RECYCLER_WRITE_BARRIER_ALLOC_SEPARATE_PAGE - recyclerWithBarrierPageAllocator.BackgroundZeroQueuedPages(); + recyclerWithBarrierPageAllocator.BackgroundZeroQueuedPages(); #endif - recyclerLargeBlockPageAllocator.BackgroundZeroQueuedPages(); - GCETW(GC_BACKGROUNDZEROPAGE_STOP, (this)); - } + recyclerLargeBlockPageAllocator.BackgroundZeroQueuedPages(); + GCETW(GC_BACKGROUNDZEROPAGE_STOP, (this)); + } #endif - GCETW_INTERNAL(GC_STOP, (this, ETWEvent_ConcurrentSweep)); - Assert(this->collectionState == CollectionStateConcurrentSweep); - this->collectionState = CollectionStateTransferSweptWait; + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && this->AllowAllocationsDuringConcurrentSweep()) + { + Assert(this->collectionState == CollectionStateConcurrentSweepPass2Wait); + } + else +#endif + { + Assert(this->collectionState == CollectionStateConcurrentSweep); + GCETW_INTERNAL(GC_STOP, (this, ETWEvent_ConcurrentSweep)); + } + this->collectionState = CollectionStateTransferSweptWait; + } RECYCLER_PROFILE_EXEC_BACKGROUND_END(this, Js::ConcurrentSweepPhase); } @@ -5966,7 +6161,8 @@ Recycler::ThreadProc() } #endif -#ifdef ENABLE_JS_ETW +#if defined(ENABLE_JS_ETW) && ! defined(ENABLE_JS_LTTNG) + // LTTng has no concept of EventActivityIdControl // Create an ETW ActivityId for this thread, to help tools correlate ETW events we generate GUID activityId = { 0 }; auto eventActivityIdControlResult = EventActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_SET_ID, &activityId); @@ -6078,12 +6274,66 @@ Recycler::ThreadProc() #endif //ENABLE_CONCURRENT_GC -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + +void +Recycler::DoTwoPassConcurrentSweepPreCheck() +{ + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + // We will do two pass sweep only when BOTH of the following conditions are met: + // 1. GC was triggered while we are in script, as this is the only case when we will make use of the blocks in the + // SLIST during concurrent sweep. + // 2. We are not in a Partial GC. + // 3. At-least one heap bucket exceeds the RecyclerHeuristic::AllocDuringConcurrentSweepHeapBlockThreshold. + this->allowAllocationsDuringConcurrentSweepForCollection = this->isInScript && !this->recyclerSweep->InPartialCollect(); + + // Do the actual 2-pass check only if the first 2 checks pass. + if (this->allowAllocationsDuringConcurrentSweepForCollection) + { + // We fire the ETW event only when the actual 2-pass check is performed. This is to avoid messing up ETL processing of test runs when in partial collect. + GCETW_INTERNAL(GC_START, (this, ETWEvent_ConcurrentSweep_TwoPassSweepPreCheck)); + this->allowAllocationsDuringConcurrentSweepForCollection = this->autoHeap.DoTwoPassConcurrentSweepPreCheck(); + GCETW_INTERNAL(GC_STOP, (this, ETWEvent_ConcurrentSweep_TwoPassSweepPreCheck)); + } + } +} + +void +Recycler::FinishConcurrentSweepPass1() +{ + GCETW_INTERNAL(GC_START, (this, ETWEvent_ConcurrentSweep_FinishPass1)); + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + AssertMsg(this->allowAllocationsDuringConcurrentSweepForCollection, "Two pass concurrent sweep must be turned on."); + this->autoHeap.FinishConcurrentSweepPass1(this->recyclerSweepInstance); + } + GCETW_INTERNAL(GC_STOP, (this, ETWEvent_ConcurrentSweep_FinishPass1)); +} + +void +Recycler::FinishSweepPrep() +{ + GCETW_INTERNAL(GC_START, (this, ETWEvent_ConcurrentSweep_FinishSweepPrep)); + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + AssertMsg(this->allowAllocationsDuringConcurrentSweepForCollection, "Two pass concurrent sweep must be turned on."); + this->autoHeap.FinishSweepPrep(this->recyclerSweepInstance); + } + GCETW_INTERNAL(GC_STOP, (this, ETWEvent_ConcurrentSweep_FinishSweepPrep)); +} + void Recycler::FinishConcurrentSweep() { -#if SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - this->autoHeap.FinishConcurrentSweep(); +#if SUPPORT_WIN32_SLIST + GCETW_INTERNAL(GC_START, (this, ETWEvent_ConcurrentSweep_FinishTwoPassSweep)); + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + AssertMsg(this->allowAllocationsDuringConcurrentSweepForCollection, "Two pass concurrent sweep must be turned on."); + this->autoHeap.FinishConcurrentSweep(); + } + GCETW_INTERNAL(GC_STOP, (this, ETWEvent_ConcurrentSweep_FinishTwoPassSweep)); #endif } #endif @@ -6174,11 +6424,12 @@ Recycler::FinishCollection() } #endif -#ifdef DUMP_FRAGMENTATION_STATS - if (GetRecyclerFlagsTable().DumpFragmentationStats) - { - autoHeap.DumpFragmentationStats(); - } +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + this->allowAllocationsDuringConcurrentSweepForCollection = false; +#endif + +#if ENABLE_MEM_STATS + autoHeap.ReportMemStats(); #endif RECORD_TIMESTAMP(currentCollectionEndTime); @@ -6537,7 +6788,8 @@ RecyclerParallelThread::StaticThreadProc(LPVOID lpParameter) dllHandle = NULL; } #endif -#ifdef ENABLE_JS_ETW +#if defined(ENABLE_JS_ETW) && ! defined(ENABLE_JS_LTTNG) + // LTTng has no concept of EventActivityIdControl // Create an ETW ActivityId for this thread, to help tools correlate ETW events we generate GUID activityId = { 0 }; auto eventActivityIdControlResult = EventActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_SET_ID, &activityId); @@ -6766,6 +7018,17 @@ Recycler::PrintCollectTrace(Js::Phase phase, bool finish, bool noConcurrentWork) } #endif +#ifdef RECYCLER_TRACE +void +Recycler::PrintBlockStatus(HeapBucket * heapBucket, HeapBlock * heapBlock, char16 const * statusMessage) +{ + if (this->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + Output::Print(_u("[GC #%d] [HeapBucket 0x%p] HeapBlock 0x%p %s [CollectionState: %d] \n"), this->collectionCount, heapBucket, heapBlock, statusMessage, this->collectionState); + } +} +#endif + #ifdef RECYCLER_STATS void Recycler::PrintHeapBlockStats(char16 const * name, HeapBlock::HeapBlockType type) @@ -6799,7 +7062,9 @@ Recycler::PrintHeapBlockMemoryStats(char16 const * name, HeapBlock::HeapBlockTyp allocableFreeByteCount -= partialUnusedBytes; } #endif - size_t totalByteCount = (collectionStats.heapBlockCount[type] - collectionStats.heapBlockFreeCount[type]) * AutoSystemInfo::PageSize; + size_t blockPages = type < HeapBlock::HeapBlockType::SmallAllocBlockTypeCount ? + SmallAllocationBlockAttributes::PageCount : MediumAllocationBlockAttributes::PageCount; + size_t totalByteCount = (collectionStats.heapBlockCount[type] - collectionStats.heapBlockFreeCount[type]) * blockPages * AutoSystemInfo::PageSize; size_t liveByteCount = totalByteCount - collectionStats.heapBlockFreeByteCount[type]; Output::Print(_u(" %6s: %10d %10d"), name, liveByteCount, allocableFreeByteCount); @@ -7297,6 +7562,25 @@ Recycler::VerifyZeroFill(void * address, size_t size) Assert(IsAll((byte *)address, size, expectedFill)); } + +void +Recycler::VerifyLargeAllocZeroFill(void * address, size_t size, ObjectInfoBits attributes) +{ + // Large allocs will have already written the dummy vtable at the beginning of the allocation + // if either FinalizeBit or TrackBit attributes were set. Skip the verify for that memory + // if that is the case. + if ((attributes & (FinalizeBit | TrackBit)) != 0) + { + // Verify that it really is the dummy v-table before skipping it. + DummyVTableObject dummy; + Assert((*(void**)(&dummy)) == *((void**)address)); + + address = ((char*)address) + sizeof(DummyVTableObject); + size -= sizeof(DummyVTableObject); + } + VerifyZeroFill(address, size); +} + #endif #ifdef RECYCLER_MEMORY_VERIFY @@ -7313,6 +7597,21 @@ Recycler::FillCheckPad(void * address, size_t size, size_t alignedAllocSize, boo addressToVerify = ((char*) address + size); sizeToVerify = (alignedAllocSize - size); } + else + { + // It could be the case that an uninitialized object already has a dummy vtable installed + // at the beginning of the address. If that is the case, we can't verify the fill pattern + // on that memory, since it's already been initialized. + // Note that FillPadNoCheck will skip over the first sizeof(FreeObject) bytes, which + // prevents overwriting of the vtable. + static_assert(sizeof(DummyVTableObject) == sizeof(void*), "Incorrect size for a DummyVTableObject - it must contain a single v-table pointer"); + DummyVTableObject dummy; + if ((*(void**)(&dummy)) == *((void**)address)) + { + addressToVerify = (char*)address + sizeof(DummyVTableObject); + sizeToVerify = alignedAllocSize - sizeof(DummyVTableObject); + } + } // Actually this is filling the non-pad to zero VerifyCheckFill(addressToVerify, sizeToVerify - sizeof(size_t)); @@ -8736,3 +9035,9 @@ RecyclerHeapObjectInfo::GetSize() const } template char* Recycler::AllocWithAttributesInlined<(Memory::ObjectInfoBits)32, false>(size_t); +#ifdef RECYCLER_VISITED_HOST +template char* Recycler::AllocZeroWithAttributesInlined(size_t); +template char* Recycler::AllocZeroWithAttributesInlined(size_t); +template char* Recycler::AllocZeroWithAttributesInlined(size_t); +template char* Recycler::AllocZeroWithAttributesInlined(size_t); +#endif diff --git a/deps/chakrashim/core/lib/Common/Memory/Recycler.h b/deps/chakrashim/core/lib/Common/Memory/Recycler.h index 056e171bc97..2eb5b65cffb 100644 --- a/deps/chakrashim/core/lib/Common/Memory/Recycler.h +++ b/deps/chakrashim/core/lib/Common/Memory/Recycler.h @@ -29,6 +29,30 @@ struct RecyclerMemoryData; namespace Memory { +// NOTE: There is perf lab test infrastructure that takes a dependency on the events in this enumeration. Any modifications may cause +// errors in ETL analysis or report incorrect numbers. Please verify that the GC events are analyzed correctly with your changes. + enum ETWEventGCActivationKind : unsigned + { + ETWEvent_GarbageCollect = 0, // force in-thread GC + ETWEvent_ThreadCollect = 1, // thread GC with wait + ETWEvent_ConcurrentCollect = 2, + ETWEvent_PartialCollect = 3, + + ETWEvent_ConcurrentMark = 11, + ETWEvent_ConcurrentRescan = 12, + ETWEvent_ConcurrentSweep = 13, + ETWEvent_ConcurrentTransferSwept = 14, + ETWEvent_ConcurrentFinishMark = 15, + ETWEvent_ConcurrentSweep_TwoPassSweepPreCheck = 16, // Check whether we should do a 2-pass concurrent sweep. + + // The following events are only relevant to the 2-pass concurrent sweep and should not be seen otherwise. + ETWEvent_ConcurrentSweep_Pass1 = 17, // Concurrent sweep Pass1 of the blocks not getting allocated from during concurrent sweep. + ETWEvent_ConcurrentSweep_FinishSweepPrep = 18, // Stop allocations and remove all blocks from SLIST so we can finish Pass1 of the remaining blocks. + ETWEvent_ConcurrentSweep_FinishPass1 = 19, // Concurrent sweep Pass1 of the blocks that were set aside for allocations during concurrent sweep. + ETWEvent_ConcurrentSweep_Pass2 = 20, // Concurrent sweep Pass1 of the blocks not getting allocated from during concurrent sweep. + ETWEvent_ConcurrentSweep_FinishTwoPassSweep = 21, // Drain the SLIST at the end of the 2-pass concurrent sweep and begin normal allocations. + }; + template class RecyclerRootPtr; class AutoBooleanToggle @@ -182,7 +206,12 @@ struct InfoBitsWrapper{}; #define RecyclerNewTrackedLeaf(recycler,T,...) static_cast(static_cast(AllocatorNewBase(Recycler, recycler, AllocTrackedLeafInlined, T, __VA_ARGS__))) #define RecyclerNewTrackedLeafPlusZ(recycler,size,T,...) static_cast(static_cast(AllocatorNewPlusBase(Recycler, recycler, AllocZeroTrackedLeafInlined, size, T, __VA_ARGS__))) - +#ifdef RECYCLER_VISITED_HOST +#define RecyclerAllocVisitedHostTracedAndFinalizedZero(recycler,size) recycler->AllocVisitedHost(size) +#define RecyclerAllocVisitedHostFinalizedZero(recycler,size) recycler->AllocVisitedHost(size) +#define RecyclerAllocVisitedHostTracedZero(recycler,size) recycler->AllocVisitedHost(size) +#define RecyclerAllocLeafZero(recycler,size) recycler->AllocVisitedHost(size) +#endif #ifdef TRACE_OBJECT_LIFETIME #define RecyclerNewLeafTrace(recycler,T,...) AllocatorNewBase(Recycler, recycler, AllocLeafTrace, T, __VA_ARGS__) @@ -610,7 +639,6 @@ class AutoProtectPages }; #endif - class Recycler { friend class RecyclerScanMemoryCallback; @@ -724,6 +752,9 @@ class Recycler CollectionState collectionState; JsUtil::ThreadService *threadService; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + bool allowAllocationsDuringConcurrentSweepForCollection; +#endif HeapBlockMap heapBlockMap; @@ -845,7 +876,7 @@ class Recycler #elif _M_ARM static const int NumRegistersToSave = 13; #elif _M_ARM64 - static const int NumRegistersToSave = 13; + static const int NumRegistersToSave = 27; #elif _M_AMD64 static const int NumRegistersToSave = 16; #endif @@ -873,12 +904,18 @@ class Recycler SavedRegisterState savedThreadContext; +#if __has_feature(address_sanitizer) + void* savedAsanFakeStack; +#define SAVE_THREAD_ASAN_FAKE_STACK() \ + this->savedAsanFakeStack = __asan_get_current_fake_stack() +#else +#define SAVE_THREAD_ASAN_FAKE_STACK() +#endif + bool inDispose; -#if DBG - uint collectionCount; -#endif #if DBG || defined RECYCLER_TRACE + uint collectionCount; bool inResolveExternalWeakReferences; #endif @@ -1056,6 +1093,7 @@ class Recycler #endif #ifdef RECYCLER_TRACE CollectionParam collectionParam; + void PrintBlockStatus(HeapBucket * heapBucket, HeapBlock * heapBlock, char16 const * name); #endif #ifdef RECYCLER_MEMORY_VERIFY uint verifyPad; @@ -1246,7 +1284,7 @@ class Recycler #define DEFINE_RECYCLER_NOTHROW_ALLOC(AllocFunc, attributes) DEFINE_RECYCLER_NOTHROW_ALLOC_BASE(AllocFunc, AllocWithAttributes, attributes) #define DEFINE_RECYCLER_NOTHROW_ALLOC_ZERO(AllocFunc, attributes) DEFINE_RECYCLER_NOTHROW_ALLOC_BASE(AllocFunc, AllocZeroWithAttributes, attributes) -#if GLOBAL_ENABLE_WRITE_BARRIER && !defined(_WIN32) +#if GLOBAL_ENABLE_WRITE_BARRIER DEFINE_RECYCLER_ALLOC(Alloc, WithBarrierBit); DEFINE_RECYCLER_ALLOC_ZERO(AllocZero, WithBarrierBit); DEFINE_RECYCLER_ALLOC(AllocFinalized, FinalizableWithBarrierObjectBits); @@ -1290,6 +1328,11 @@ class Recycler { return AllocWithAttributes(size); } + template + char * AllocVisitedHost(DECLSPEC_GUARD_OVERFLOW size_t size) + { + return AllocZeroWithAttributes(size); + } template RecyclerWeakReference* CreateWeakReferenceHandle(T* pStrongReference); @@ -1407,6 +1450,7 @@ class Recycler #endif #ifdef RECYCLER_ZERO_MEM_CHECK void VerifyZeroFill(void * address, size_t size); + void VerifyLargeAllocZeroFill(void * address, size_t size, ObjectInfoBits attributes); #endif #ifdef RECYCLER_DUMP_OBJECT_GRAPH bool DumpObjectGraph(RecyclerObjectGraphDumper::Param * param = nullptr); @@ -1560,11 +1604,17 @@ class Recycler inline void ScanObjectInline(void ** obj, size_t byteCount); inline void ScanObjectInlineInterior(void ** obj, size_t byteCount); + template - inline void ScanMemoryInline(void ** obj, size_t byteCount); + inline void ScanMemoryInline(void ** obj, size_t byteCount + ADDRESS_SANITIZER_APPEND(RecyclerScanMemoryType scanMemoryType = RecyclerScanMemoryType::General)); + template void ScanMemory(void ** obj, size_t byteCount) { if (byteCount != 0) { ScanMemoryInline(obj, byteCount); } } - bool AddMark(void * candidate, size_t byteCount); + bool AddMark(void * candidate, size_t byteCount) throw(); +#ifdef RECYCLER_VISITED_HOST + bool AddPreciselyTracedMark(IRecyclerVisitedObject * candidate) throw(); +#endif // Sweep #if ENABLE_PARTIAL_GC @@ -1576,7 +1626,10 @@ class Recycler void SweepHeap(bool concurrent, RecyclerSweep& recyclerSweep); void FinishSweep(RecyclerSweep& recyclerSweep); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + void DoTwoPassConcurrentSweepPreCheck(); + void FinishSweepPrep(); + void FinishConcurrentSweepPass1(); void FinishConcurrentSweep(); #endif @@ -1640,6 +1693,14 @@ class Recycler { return ((collectionState & Collection_ConcurrentSweep) == Collection_ConcurrentSweep); } + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + bool AllowAllocationsDuringConcurrentSweep() + { + return this->allowAllocationsDuringConcurrentSweepForCollection; + } +#endif + #if DBG BOOL IsConcurrentFinishedState() const; #endif // DBG @@ -1717,6 +1778,9 @@ class Recycler template friend class SmallNormalHeapBlockT; template friend class SmallLeafHeapBlockT; template friend class SmallFinalizableHeapBlockT; +#ifdef RECYCLER_VISITED_HOST + template friend class SmallRecyclerVisitedHostHeapBlockT; +#endif friend class LargeHeapBlock; friend class HeapInfo; friend class LargeHeapBucket; @@ -1907,8 +1971,10 @@ class Recycler bool IsPostEnumHeapValidationInProgress() const { return pfPostHeapEnumScanCallback != NULL; } #endif -private: +public: void* GetRealAddressFromInterior(void* candidate); + +private: void BeginNonCollectingMark(); void EndNonCollectingMark(); @@ -2180,7 +2246,6 @@ class CollectedRecyclerWeakRefHeapBlock : public HeapBlock virtual bool FindHeapObject(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject) override { Assert(false); return false; } virtual bool TestObjectMarkedBit(void* objectAddress) override { Assert(false); return false; } virtual void SetObjectMarkedBit(void* objectAddress) override { Assert(false); } - #ifdef RECYCLER_VERIFY_MARK virtual bool VerifyMark(void * objectAddress, void * target) override { Assert(false); return false; } #endif @@ -2466,7 +2531,7 @@ struct ForceLeafAllocator }; // TODO: enable -profile for GC phases. -// access the same profiler object from multiple GC threads which shares one recyler object, +// access the same profiler object from multiple GC threads which shares one recycler object, // but profiler object is not thread safe #if defined(PROFILE_EXEC) && 0 #define RECYCLER_PROFILE_EXEC_BEGIN(recycler, phase) if (recycler->profiler != nullptr) { recycler->profiler->Begin(phase); } diff --git a/deps/chakrashim/core/lib/Common/Memory/Recycler.inl b/deps/chakrashim/core/lib/Common/Memory/Recycler.inl index b457a35bfad..ab8011d18d9 100644 --- a/deps/chakrashim/core/lib/Common/Memory/Recycler.inl +++ b/deps/chakrashim/core/lib/Common/Memory/Recycler.inl @@ -36,9 +36,10 @@ namespace Memory class DummyVTableObject : public FinalizableObject { public: - virtual void Finalize(bool isShutdown) {} - virtual void Dispose(bool isShutdown) {} - virtual void Mark(Recycler * recycler) {} + virtual void Finalize(bool isShutdown) final {} + virtual void Dispose(bool isShutdown) final {} + virtual void Mark(Recycler * recycler) final {} + virtual void Trace(IRecyclerHeapMarkingContext* markingContext) final {} }; } @@ -46,8 +47,12 @@ template inline char * Recycler::AllocWithAttributesInlined(DECLSPEC_GUARD_OVERFLOW size_t size) { - // All tracked objects are client tracked objects + // All tracked objects are client tracked or recycler host visited objects +#ifndef RECYCLER_VISITED_HOST CompileAssert((attributes & TrackBit) == 0 || (attributes & ClientTrackedBit) != 0); +#else + CompileAssert((attributes & TrackBit) == 0 || (attributes & ClientTrackedBit) != 0 || (attributes & RecyclerVisitedHostBit) != 0); +#endif Assert(this->enableScanImplicitRoots || (attributes & ImplicitRootBit) == 0); AssertMsg(this->disableThreadAccessCheck || this->mainThreadId == GetCurrentThreadContextId(), "Allocating from the recycler can only be done on the main thread"); @@ -167,22 +172,18 @@ Recycler::AllocWithAttributesInlined(DECLSPEC_GUARD_OVERFLOW size_t size) #endif -#pragma prefast(suppress:6313, "attributes is a template parameter and can be 0") - if (attributes & (FinalizeBit | TrackBit)) - { - // Make sure a valid vtable is installed in case of OOM before the real vtable is set - memBlock = (char *)new (memBlock) DummyVTableObject(); - } - #ifdef RECYCLER_WRITE_BARRIER SwbVerboseTrace(this->GetRecyclerFlagsTable(), _u("Allocated SWB memory: 0x%p\n"), memBlock); #pragma prefast(suppress:6313, "attributes is a template parameter and can be 0") - if (attributes & NewTrackBit & WithBarrierBit) + if ((attributes & NewTrackBit) && +#if GLOBAL_ENABLE_WRITE_BARRIER && defined(RECYCLER_STATS) + true // Trigger WB to force re-mark, to work around old mark false positive +#else + (attributes & WithBarrierBit) +#endif + ) { - //REVIEW: is following comment correct? I added WithBarrierBit above - // why we need to set write barrier bit for none write barrier page address - // For objects allocated with NewTrackBit, we need to trigger the write barrier since // there could be a GC triggered by an allocation in the constructor, and we'd miss // calling track on the partially constructed object. To deal with this, we set the write @@ -281,6 +282,7 @@ Recycler::AllocZeroWithAttributesInlined(DECLSPEC_GUARD_OVERFLOW size_t size) return obj; } +#ifdef RECYCLER_PAGE_HEAP template bool Recycler::IsPageHeapEnabled(size_t size) { @@ -304,6 +306,7 @@ bool Recycler::IsPageHeapEnabled(size_t size) } return false; } +#endif template inline char* @@ -493,17 +496,26 @@ Recycler::ScanObjectInlineInterior(void ** obj, size_t byteCount) template NO_SANITIZE_ADDRESS inline void -Recycler::ScanMemoryInline(void ** obj, size_t byteCount) +Recycler::ScanMemoryInline(void ** obj, size_t byteCount + ADDRESS_SANITIZER_APPEND(RecyclerScanMemoryType scanMemoryType)) { // This is never called during parallel marking Assert(this->collectionState != CollectionStateParallelMark); + +#if __has_feature(address_sanitizer) + void *asanFakeStack = + scanMemoryType == RecyclerScanMemoryType::Stack ? this->savedAsanFakeStack : nullptr; +#endif + if (this->enableScanInteriorPointers) { - markContext.ScanMemory(obj, byteCount); + markContext.ScanMemory( + obj, byteCount ADDRESS_SANITIZER_APPEND(asanFakeStack)); } else { - markContext.ScanMemory(obj, byteCount); + markContext.ScanMemory( + obj, byteCount ADDRESS_SANITIZER_APPEND(asanFakeStack)); } } @@ -515,6 +527,15 @@ Recycler::AddMark(void * candidate, size_t byteCount) throw() return markContext.AddMarkedObject(candidate, byteCount); } +#ifdef RECYCLER_VISITED_HOST +inline bool +Recycler::AddPreciselyTracedMark(IRecyclerVisitedObject * candidate) throw() +{ + // This API cannot be used for parallel marking as we don't have enough information to determine which MarkingContext to use. + Assert((this->collectionState & Collection_Parallel) == 0); + return markContext.AddPreciselyTracedObject(candidate); +} +#endif template void @@ -527,6 +548,9 @@ Recycler::NotifyFree(T * heapBlock) #if DBG || defined(RECYCLER_STATS) this->isForceSweeping = true; heapBlock->isForceSweeping = true; +#endif +#ifdef RECYCLER_TRACE + this->PrintBlockStatus(nullptr, heapBlock, _u("[**34**] calling SweepObjects during NotifyFree.")); #endif heapBlock->template SweepObjects(this); #if DBG || defined(RECYCLER_STATS) diff --git a/deps/chakrashim/core/lib/Common/Memory/RecyclerHeuristic.h b/deps/chakrashim/core/lib/Common/Memory/RecyclerHeuristic.h index f5026c82a81..9cddd1618d7 100644 --- a/deps/chakrashim/core/lib/Common/Memory/RecyclerHeuristic.h +++ b/deps/chakrashim/core/lib/Common/Memory/RecyclerHeuristic.h @@ -61,6 +61,16 @@ class RecyclerHeuristic // If we rescan at least 128 pages in the first background repeat mark, // then trigger a second repeat mark pass. static const uint BackgroundSecondRepeatMarkThreshold = 128; + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // Number of blocks a heap bucket needs to have before allocations during concurrent sweep feature kicks-in. +#if DBG + // We would want the feature to kick-in more frequently in debug builds so we excercise the code. + static const uint AllocDuringConcurrentSweepHeapBlockThreshold = 100; +#else + static const uint AllocDuringConcurrentSweepHeapBlockThreshold = 60000; +#endif +#endif #endif private: diff --git a/deps/chakrashim/core/lib/Common/Memory/RecyclerSweep.cpp b/deps/chakrashim/core/lib/Common/Memory/RecyclerSweep.cpp index ca77e4242cb..4817694d2a6 100644 --- a/deps/chakrashim/core/lib/Common/Memory/RecyclerSweep.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/RecyclerSweep.cpp @@ -72,6 +72,9 @@ RecyclerSweep::BeginSweep(Recycler * recycler) finalizableWithBarrierData.pendingMergeNewHeapBlockList = recycler->autoHeap.newFinalizableWithBarrierHeapBlockList; #endif finalizableData.pendingMergeNewHeapBlockList = recycler->autoHeap.newFinalizableHeapBlockList; +#ifdef RECYCLER_VISITED_HOST + recyclerVisitedHostData.pendingMergeNewHeapBlockList = recycler->autoHeap.newRecyclerVisitedHostHeapBlockList; +#endif mediumLeafData.pendingMergeNewHeapBlockList = recycler->autoHeap.newMediumLeafHeapBlockList; mediumNormalData.pendingMergeNewHeapBlockList = recycler->autoHeap.newMediumNormalHeapBlockList; @@ -80,11 +83,17 @@ RecyclerSweep::BeginSweep(Recycler * recycler) mediumFinalizableWithBarrierData.pendingMergeNewHeapBlockList = recycler->autoHeap.newMediumFinalizableWithBarrierHeapBlockList; #endif mediumFinalizableData.pendingMergeNewHeapBlockList = recycler->autoHeap.newMediumFinalizableHeapBlockList; +#ifdef RECYCLER_VISITED_HOST + mediumRecyclerVisitedHostData.pendingMergeNewHeapBlockList = recycler->autoHeap.newMediumRecyclerVisitedHostHeapBlockList; +#endif recycler->autoHeap.newLeafHeapBlockList = nullptr; recycler->autoHeap.newNormalHeapBlockList = nullptr; recycler->autoHeap.newFinalizableHeapBlockList = nullptr; +#ifdef RECYCLER_VISITED_HOST + recycler->autoHeap.newRecyclerVisitedHostHeapBlockList = nullptr; +#endif #ifdef RECYCLER_WRITE_BARRIER recycler->autoHeap.newNormalWithBarrierHeapBlockList = nullptr; recycler->autoHeap.newFinalizableWithBarrierHeapBlockList = nullptr; @@ -93,6 +102,9 @@ RecyclerSweep::BeginSweep(Recycler * recycler) recycler->autoHeap.newMediumLeafHeapBlockList = nullptr; recycler->autoHeap.newMediumNormalHeapBlockList = nullptr; recycler->autoHeap.newMediumFinalizableHeapBlockList = nullptr; +#ifdef RECYCLER_VISITED_HOST + recycler->autoHeap.newMediumRecyclerVisitedHostHeapBlockList = nullptr; +#endif #ifdef RECYCLER_WRITE_BARRIER recycler->autoHeap.newMediumNormalWithBarrierHeapBlockList = nullptr; recycler->autoHeap.newMediumFinalizableWithBarrierHeapBlockList = nullptr; @@ -160,6 +172,13 @@ void RecyclerSweep::FinishSweep() { #if ENABLE_PARTIAL_GC +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (recycler->collectionState == CollectionStateConcurrentSweepPass2) + { + GCETW_INTERNAL(GC_START, (recycler, ETWEvent_ConcurrentSweep_Pass2)); + } +#endif + Assert(this->partial == recycler->inPartialCollectMode); // Adjust heuristics if (recycler->inPartialCollectMode) @@ -237,6 +256,12 @@ RecyclerSweep::FinishSweep() #if ENABLE_CONCURRENT_GC recycler->SweepPendingObjects(*this); #endif +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (recycler->collectionState == CollectionStateConcurrentSweepPass2) + { + GCETW_INTERNAL(GC_STOP, (recycler, ETWEvent_ConcurrentSweep_Pass2)); + } +#endif #endif } @@ -276,18 +301,16 @@ RecyclerSweep::BackgroundSweep() // Finish the concurrent part of the first pass this->recycler->autoHeap.SweepSmallNonFinalizable(*this); - - // Finish the rest of the sweep - this->FinishSweep(); #if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) - { - this->recycler->FinishConcurrentSweep(); - } + if (!CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) || !this->recycler->AllowAllocationsDuringConcurrentSweep()) #endif + { + // Finish the rest of the sweep + this->FinishSweep(); - this->EndBackground(); + this->EndBackground(); + } } #endif @@ -401,6 +424,9 @@ RecyclerSweep::MergePendingNewHeapBlockList() template void RecyclerSweep::MergePendingNewHeapBlockList(); template void RecyclerSweep::MergePendingNewHeapBlockList(); template void RecyclerSweep::MergePendingNewHeapBlockList(); +#ifdef RECYCLER_VISITED_HOST +template void RecyclerSweep::MergePendingNewHeapBlockList(); +#endif #ifdef RECYCLER_WRITE_BARRIER template void RecyclerSweep::MergePendingNewHeapBlockList(); template void RecyclerSweep::MergePendingNewHeapBlockList(); @@ -424,6 +450,9 @@ RecyclerSweep::MergePendingNewMediumHeapBlockList() template void RecyclerSweep::MergePendingNewMediumHeapBlockList(); template void RecyclerSweep::MergePendingNewMediumHeapBlockList(); template void RecyclerSweep::MergePendingNewMediumHeapBlockList(); +#ifdef RECYCLER_VISITED_HOST +template void RecyclerSweep::MergePendingNewMediumHeapBlockList(); +#endif #ifdef RECYCLER_WRITE_BARRIER template void RecyclerSweep::MergePendingNewMediumHeapBlockList(); template void RecyclerSweep::MergePendingNewMediumHeapBlockList(); @@ -492,6 +521,10 @@ RecyclerSweep::SetPendingMergeNewHeapBlockCount() return HeapBlockList::Count(leafData.pendingMergeNewHeapBlockList) + HeapBlockList::Count(normalData.pendingMergeNewHeapBlockList) + HeapBlockList::Count(finalizableData.pendingMergeNewHeapBlockList) +#ifdef RECYCLER_VISITED_HOST + + HeapBlockList::Count(recyclerVisitedHostData.pendingMergeNewHeapBlockList) + + HeapBlockList::Count(mediumRecyclerVisitedHostData.pendingMergeNewHeapBlockList) +#endif #ifdef RECYCLER_WRITE_BARRIER + HeapBlockList::Count(withBarrierData.pendingMergeNewHeapBlockList) + HeapBlockList::Count(finalizableWithBarrierData.pendingMergeNewHeapBlockList) diff --git a/deps/chakrashim/core/lib/Common/Memory/RecyclerSweep.h b/deps/chakrashim/core/lib/Common/Memory/RecyclerSweep.h index 1cae6ef178e..280902da5c1 100644 --- a/deps/chakrashim/core/lib/Common/Memory/RecyclerSweep.h +++ b/deps/chakrashim/core/lib/Common/Memory/RecyclerSweep.h @@ -122,6 +122,9 @@ class RecyclerSweep template <> Data& GetData() { return leafData; } template <> Data& GetData() { return normalData; } template <> Data& GetData() { return finalizableData; } +#ifdef RECYCLER_VISITED_HOST + template <> Data& GetData() { return recyclerVisitedHostData; } +#endif #ifdef RECYCLER_WRITE_BARRIER template <> Data& GetData() { return withBarrierData; } template <> Data& GetData() { return finalizableWithBarrierData; } @@ -130,6 +133,9 @@ class RecyclerSweep template <> Data& GetData() { return mediumLeafData; } template <> Data& GetData() { return mediumNormalData; } template <> Data& GetData() { return mediumFinalizableData; } +#ifdef RECYCLER_VISITED_HOST + template <> Data& GetData() { return mediumRecyclerVisitedHostData; } +#endif #ifdef RECYCLER_WRITE_BARRIER template <> Data& GetData() { return mediumWithBarrierData; } template <> Data& GetData() { return mediumFinalizableWithBarrierData; } @@ -142,6 +148,9 @@ class RecyclerSweep Data leafData; Data normalData; Data finalizableData; +#ifdef RECYCLER_VISITED_HOST + Data recyclerVisitedHostData; +#endif #ifdef RECYCLER_WRITE_BARRIER Data withBarrierData; Data finalizableWithBarrierData; @@ -149,6 +158,9 @@ class RecyclerSweep Data mediumLeafData; Data mediumNormalData; Data mediumFinalizableData; +#ifdef RECYCLER_VISITED_HOST + Data mediumRecyclerVisitedHostData; +#endif #ifdef RECYCLER_WRITE_BARRIER Data mediumWithBarrierData; Data mediumFinalizableWithBarrierData; @@ -231,8 +243,8 @@ RecyclerSweep::TransferPendingEmptyHeapBlocks(HeapBucketT * heapBuck if (list) { TBlockType * tail = bucketData.pendingEmptyBlockListTail; -#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) - size_t count = 0; +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + uint32 count = 0; HeapBlockList::ForEach(list, [tail, &count](TBlockType * heapBlock) { Assert(heapBlock->GetAddress() == nullptr); @@ -240,8 +252,12 @@ RecyclerSweep::TransferPendingEmptyHeapBlocks(HeapBucketT * heapBuck Assert(heapBlock->GetNextBlock() != nullptr || heapBlock == tail); count++; }); - RECYCLER_SLOW_CHECK(heapBucket->emptyHeapBlockCount += count); - RECYCLER_SLOW_CHECK(heapBucket->heapBlockCount -= count); +#if defined(RECYCLER_SLOW_CHECK_ENABLED) + heapBucket->emptyHeapBlockCount += count; +#endif +#if defined(RECYCLER_SLOW_CHECK_ENABLED) || ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + heapBucket->heapBlockCount -= count; +#endif #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/RecyclerWeakReference.h b/deps/chakrashim/core/lib/Common/Memory/RecyclerWeakReference.h index 68920e0d200..fcf7f4d9566 100644 --- a/deps/chakrashim/core/lib/Common/Memory/RecyclerWeakReference.h +++ b/deps/chakrashim/core/lib/Common/Memory/RecyclerWeakReference.h @@ -355,7 +355,7 @@ class WeakReferenceHashTable entry->weakRefHeapBlock = weakRefHeapBlock; #ifdef RECYCLER_TRACE_WEAKREF - Output::Print(_u("Add 0x%08x to bucket %d\n"), entry, targetBucket); + Output::Print(_u("Add WeakRef 0x%08x for StrongRef %p to bucket %d\n"), entry, strongReference, targetBucket); #endif AddEntry(entry, &buckets[targetBucket]); count++; diff --git a/deps/chakrashim/core/lib/Common/Memory/RecyclerWriteBarrierManager.cpp b/deps/chakrashim/core/lib/Common/Memory/RecyclerWriteBarrierManager.cpp index 1f61655f71c..f8a9c2aedd0 100644 --- a/deps/chakrashim/core/lib/Common/Memory/RecyclerWriteBarrierManager.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/RecyclerWriteBarrierManager.cpp @@ -27,7 +27,7 @@ namespace Memory } #endif #ifdef RECYCLER_WRITE_BARRIER_BYTE -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 X64WriteBarrierCardTableManager RecyclerWriteBarrierManager::x64CardTableManager; X64WriteBarrierCardTableManager::CommittedSectionBitVector X64WriteBarrierCardTableManager::committedSections(&HeapAllocator::Instance); @@ -46,7 +46,7 @@ DWORD RecyclerWriteBarrierManager::cardTable[1 * 1024 * 1024]; #endif #ifdef RECYCLER_WRITE_BARRIER_BYTE -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 bool X64WriteBarrierCardTableManager::OnThreadInit() @@ -54,8 +54,9 @@ X64WriteBarrierCardTableManager::OnThreadInit() // We page in the card table sections for the current threads stack reservation // So any writes to stack allocated vars can also have the write barrier set + // ToDo (SaAgarwa) __readgsqword is not on ARM64? // xplat-todo: Replace this on Windows too with GetCurrentThreadStackBounds -#if defined(_WIN32) && defined(_M_X64) +#if defined(_WIN32) && defined(_M_X64) && !defined(_M_ARM64) // check StackProber.cpp for the stack pages layout information NT_TIB* teb = (NT_TIB*) ::NtCurrentTeb(); char* stackBase = (char*) teb->StackBase; @@ -317,6 +318,11 @@ RecyclerWriteBarrierManager::OnSegmentFree(_In_ char* segmentAddress, size_t num void RecyclerWriteBarrierManager::WriteBarrier(void * address) { + if (IS_ASAN_FAKE_STACK_ADDR(address)) + { + return; + } + #ifdef RECYCLER_WRITE_BARRIER_BYTE #if ENABLE_DEBUG_CONFIG_OPTIONS VerifyIsBarrierAddress(address); @@ -341,6 +347,11 @@ RecyclerWriteBarrierManager::WriteBarrier(void * address) void RecyclerWriteBarrierManager::WriteBarrier(void * address, size_t bytes) { + if (IS_ASAN_FAKE_STACK_ADDR(address)) + { + return; + } + #if ENABLE_DEBUG_CONFIG_OPTIONS VerifyIsBarrierAddress(address, bytes); #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/RecyclerWriteBarrierManager.h b/deps/chakrashim/core/lib/Common/Memory/RecyclerWriteBarrierManager.h index 40f2030a541..61d8ecf2dc8 100644 --- a/deps/chakrashim/core/lib/Common/Memory/RecyclerWriteBarrierManager.h +++ b/deps/chakrashim/core/lib/Common/Memory/RecyclerWriteBarrierManager.h @@ -55,7 +55,7 @@ namespace Memory #endif -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 #ifdef RECYCLER_WRITE_BARRIER_BYTE #define X64_WB_DIAG 1 @@ -169,7 +169,7 @@ class RecyclerWriteBarrierManager #if ENABLE_DEBUG_CONFIG_OPTIONS static bool IsCardTableCommited(_In_ uintptr_t index) { -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 return x64CardTableManager.IsCardTableCommited(index) != FALSE; #else return true; @@ -177,7 +177,7 @@ class RecyclerWriteBarrierManager } static bool IsCardTableCommitedAddress(_In_ void* address) { -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 return x64CardTableManager.IsCardTableCommited(address) != FALSE; #else return true; @@ -188,7 +188,7 @@ class RecyclerWriteBarrierManager // For JIT static uintptr_t GetCardTableIndex(void * address); #ifdef RECYCLER_WRITE_BARRIER_BYTE -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 static BYTE * GetAddressOfCardTable() { return x64CardTableManager.GetAddressOfCardTable(); } #else static BYTE * GetAddressOfCardTable() { return cardTable; } @@ -198,7 +198,7 @@ class RecyclerWriteBarrierManager #endif // For GC -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 static bool OnThreadInit(); static bool OnSegmentAlloc(_In_ char* segment, DECLSPEC_GUARD_OVERFLOW size_t pageCount); static bool OnSegmentFree(_In_ char* segment, size_t pageCount); @@ -219,7 +219,7 @@ class RecyclerWriteBarrierManager private: #ifdef RECYCLER_WRITE_BARRIER_BYTE -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 // On AMD64, we use a different scheme // As of Windows 8.1, the process user-mode address space is 128TB // We still use a write barrier page size of 4KB diff --git a/deps/chakrashim/core/lib/Common/Memory/SectionAllocWrapper.cpp b/deps/chakrashim/core/lib/Common/Memory/SectionAllocWrapper.cpp index 3dc1a7bad8a..6c39914aa6f 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SectionAllocWrapper.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/SectionAllocWrapper.cpp @@ -85,7 +85,7 @@ PVOID MapView(HANDLE process, HANDLE sectionHandle, size_t size, size_t offset, { return nullptr; } - flags = AutoSystemInfo::Data.IsCFGEnabled() ? PAGE_EXECUTE_RO_TARGETS_INVALID : PAGE_EXECUTE; + flags = AutoSystemInfo::Data.IsCFGEnabled() ? PAGE_EXECUTE_RO_TARGETS_INVALID : PAGE_EXECUTE_READ; } #if USEFILEMAP2 @@ -113,7 +113,7 @@ PVOID MapView(HANDLE process, HANDLE sectionHandle, size_t size, size_t offset, return address; } -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) SectionMap32::SectionMap32(__in char * startAddress) : startAddress(startAddress), #else @@ -123,7 +123,7 @@ SectionMap32::SectionMap32() : { memset(map, 0, sizeof(map)); -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) Assert(((size_t)startAddress) % TotalSize == 0); #endif } @@ -596,7 +596,7 @@ SectionAllocWrapper::AllocPages(LPVOID requestAddress, size_t pageCount, DWORD a if ((allocationType & MEM_COMMIT) == MEM_COMMIT) { - const DWORD allocProtectFlags = AutoSystemInfo::Data.IsCFGEnabled() ? PAGE_EXECUTE_RO_TARGETS_INVALID : PAGE_EXECUTE; + const DWORD allocProtectFlags = AutoSystemInfo::Data.IsCFGEnabled() ? PAGE_EXECUTE_RO_TARGETS_INVALID : PAGE_EXECUTE_READ; address = VirtualAllocEx(this->process, address, dwSize, MEM_COMMIT, allocProtectFlags); } } @@ -674,7 +674,7 @@ BOOL SectionAllocWrapper::Free(LPVOID lpAddress, size_t dwSize, DWORD dwFreeType /* * class PreReservedVirtualAllocWrapper */ -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD // TODO: this should be on runtime process uint PreReservedSectionAllocWrapper::numPreReservedSegment = 0; #endif @@ -697,7 +697,7 @@ PreReservedSectionAllocWrapper::~PreReservedSectionAllocWrapper() CloseSectionHandle(this->section); PreReservedHeapTrace(_u("MEM_RELEASE the PreReservedSegment. Start Address: 0x%p, Size: 0x%x * 0x%x bytes"), this->preReservedStartAddress, PreReservedAllocationSegmentCount, AutoSystemInfo::Data.GetAllocationGranularityPageSize()); -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD Assert(numPreReservedSegment > 0); InterlockedDecrement(&PreReservedSectionAllocWrapper::numPreReservedSegment); #endif @@ -723,7 +723,7 @@ PreReservedSectionAllocWrapper::IsInRange(void * address) { MEMORY_BASIC_INFORMATION memBasicInfo; size_t bytes = VirtualQueryEx(this->process, address, &memBasicInfo, sizeof(memBasicInfo)); - Assert(bytes == 0 || (memBasicInfo.State == MEM_COMMIT && memBasicInfo.AllocationProtect == PAGE_EXECUTE)); + Assert(bytes == 0 || (memBasicInfo.State == MEM_COMMIT && memBasicInfo.AllocationProtect == PAGE_EXECUTE_READ)); } #endif return isInRange; @@ -932,7 +932,7 @@ LPVOID PreReservedSectionAllocWrapper::AllocPages(LPVOID lpAddress, DECLSPEC_GUA AutoEnableDynamicCodeGen enableCodeGen; #endif - const DWORD allocProtectFlags = AutoSystemInfo::Data.IsCFGEnabled() ? PAGE_EXECUTE_RO_TARGETS_INVALID : PAGE_EXECUTE; + const DWORD allocProtectFlags = AutoSystemInfo::Data.IsCFGEnabled() ? PAGE_EXECUTE_RO_TARGETS_INVALID : PAGE_EXECUTE_READ; allocatedAddress = (char *)VirtualAllocEx(this->process, addressToReserve, dwSize, MEM_COMMIT, allocProtectFlags); if (allocatedAddress == nullptr) { diff --git a/deps/chakrashim/core/lib/Common/Memory/SectionAllocWrapper.h b/deps/chakrashim/core/lib/Common/Memory/SectionAllocWrapper.h index 0d19daa2a50..b0eedf51ed3 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SectionAllocWrapper.h +++ b/deps/chakrashim/core/lib/Common/Memory/SectionAllocWrapper.h @@ -147,13 +147,13 @@ class SectionAllocWrapper class PreReservedSectionAllocWrapper { public: -#if _M_IX86_OR_ARM32 +#if TARGET_32 static const uint PreReservedAllocationSegmentCount = 256; // (256 * 64K) == 16 MB, if 64k is the AllocationGranularity -#else // _M_X64_OR_ARM64 +#else // TARGET_64 static const uint PreReservedAllocationSegmentCount = 4096; //(4096 * 64K) == 256MB, if 64k is the AllocationGranularity #endif -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD static const unsigned MaxPreReserveSegment = 6; #endif @@ -171,7 +171,7 @@ class PreReservedSectionAllocWrapper LPVOID GetPreReservedEndAddress(); static LPVOID GetPreReservedEndAddress(void * regionStart); -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD static int NumPreReservedSegment() { return numPreReservedSegment; } #endif @@ -189,7 +189,7 @@ class PreReservedSectionAllocWrapper BVStatic freeSegments; LPVOID preReservedStartAddress; CriticalSection cs; -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD static uint numPreReservedSegment; #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallBlockDeclarations.inl b/deps/chakrashim/core/lib/Common/Memory/SmallBlockDeclarations.inl index b3bf397615d..2242f015043 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallBlockDeclarations.inl +++ b/deps/chakrashim/core/lib/Common/Memory/SmallBlockDeclarations.inl @@ -18,6 +18,9 @@ template SweepState SmallHeapBlockT::Sweep(RecyclerSweep& template SmallNormalHeapBlockT* HeapBlock::AsNormalBlock(); template SmallLeafHeapBlockT* HeapBlock::AsLeafBlock(); template SmallFinalizableHeapBlockT* HeapBlock::AsFinalizableBlock(); +#ifdef RECYCLER_VISITED_HOST +template SmallRecyclerVisitedHostHeapBlockT* HeapBlock::AsRecyclerVisitedHostBlock(); +#endif #ifdef RECYCLER_WRITE_BARRIER template SmallNormalWithBarrierHeapBlockT* HeapBlock::AsNormalWriteBarrierBlock(); template SmallFinalizableWithBarrierHeapBlockT* HeapBlock::AsFinalizableWriteBarrierBlock(); @@ -26,6 +29,9 @@ template SmallFinalizableWithBarrierHeapBlockT* HeapBlock: template bool SmallHeapBlockT::FindHeapObjectImpl>(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject); template bool SmallHeapBlockT::FindHeapObjectImpl>(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject); template bool SmallHeapBlockT::FindHeapObjectImpl>(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject); +#ifdef RECYCLER_VISITED_HOST +template bool SmallHeapBlockT::FindHeapObjectImpl>(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject); +#endif #ifdef RECYCLER_WRITE_BARRIER template bool SmallHeapBlockT::FindHeapObjectImpl>(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject); template bool SmallHeapBlockT::FindHeapObjectImpl>(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject); @@ -35,6 +41,9 @@ template bool SmallHeapBlockT::FindHeapObjectImpl::GetFreeObjectListOnAllocatorImpl>(FreeObject ** freeObjectList); template bool SmallHeapBlockT::GetFreeObjectListOnAllocatorImpl>(FreeObject ** freeObjectList); template bool SmallHeapBlockT::GetFreeObjectListOnAllocatorImpl>(FreeObject ** freeObjectList); +#ifdef RECYCLER_VISITED_HOST +template bool SmallHeapBlockT::GetFreeObjectListOnAllocatorImpl>(FreeObject ** freeObjectList); +#endif #ifdef RECYCLER_WRITE_BARRIER template bool SmallHeapBlockT::GetFreeObjectListOnAllocatorImpl>(FreeObject ** freeObjectList); template bool SmallHeapBlockT::GetFreeObjectListOnAllocatorImpl>(FreeObject ** freeObjectList); @@ -89,7 +98,11 @@ SmallHeapBlockT::SweepObject(Recycler Assert(this->IsAnyFinalizableBlock()); #if ENABLE_CONCURRENT_GC +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + Assert(!recycler->IsConcurrentExecutingState() && !recycler->IsConcurrentSweepState()); +#else Assert(!recycler->IsConcurrentExecutingState()); +#endif #endif // Call prepare finalize to do clean up that needs to be done immediately diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBlock.cpp b/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBlock.cpp index 6806ba7022a..c33ce3285a8 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBlock.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBlock.cpp @@ -29,6 +29,30 @@ SmallFinalizableWithBarrierHeapBlockT::Delete(SmallFinalizable } #endif +#ifdef RECYCLER_VISITED_HOST +template +SmallRecyclerVisitedHostHeapBlockT* +SmallRecyclerVisitedHostHeapBlockT::New(HeapBucketT> * bucket) +{ + CompileAssert(TBlockAttributes::MaxObjectSize <= USHRT_MAX); + Assert(bucket->sizeCat <= TBlockAttributes::MaxObjectSize); + Assert((TBlockAttributes::PageCount * AutoSystemInfo::PageSize) / bucket->sizeCat <= USHRT_MAX); + + ushort objectSize = (ushort)bucket->sizeCat; + ushort objectCount = (ushort)(TBlockAttributes::PageCount * AutoSystemInfo::PageSize) / objectSize; + return NoMemProtectHeapNewNoThrowPlusPrefixZ(Base::GetAllocPlusSize(objectCount), SmallRecyclerVisitedHostHeapBlockT, bucket, objectSize, objectCount); +} + +template +void +SmallRecyclerVisitedHostHeapBlockT::Delete(SmallRecyclerVisitedHostHeapBlockT* heapBlock) +{ + Assert(heapBlock->IsRecyclerVisitedHostBlock()); + + NoMemProtectHeapDeletePlusPrefix(Base::GetAllocPlusSize(heapBlock->objectCount), heapBlock); +} +#endif + template SmallFinalizableHeapBlockT * SmallFinalizableHeapBlockT::New(HeapBucketT> * bucket) @@ -74,6 +98,20 @@ SmallFinalizableHeapBlockT::SmallFinalizableHea Assert(!this->isPendingDispose); } +#ifdef RECYCLER_VISITED_HOST +template +SmallFinalizableHeapBlockT::SmallFinalizableHeapBlockT(HeapBucketT> * bucket, ushort objectSize, ushort objectCount, HeapBlockType blockType) + : SmallNormalHeapBlockT(bucket, objectSize, objectCount, blockType) +{ + // We used AllocZ + Assert(this->finalizeCount == 0); + Assert(this->pendingDisposeCount == 0); + Assert(this->disposedObjectList == nullptr); + Assert(this->disposedObjectListTail == nullptr); + Assert(!this->isPendingDispose); +} +#endif + #ifdef RECYCLER_WRITE_BARRIER template SmallFinalizableHeapBlockT::SmallFinalizableHeapBlockT(HeapBucketT> * bucket, ushort objectSize, ushort objectCount, HeapBlockType blockType) @@ -96,6 +134,13 @@ SmallFinalizableHeapBlockT::SetAttributes(void * address, unsi __super::SetAttributes(address, attributes); finalizeCount++; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + AssertMsg(!this->isPendingConcurrentSweepPrep, "Finalizable blocks don't support allocations during concurrent sweep."); + } +#endif + #ifdef RECYCLER_FINALIZE_CHECK HeapInfo * heapInfo = this->heapBucket->heapInfo; heapInfo->liveFinalizableObjectCount++; @@ -103,6 +148,146 @@ SmallFinalizableHeapBlockT::SetAttributes(void * address, unsi #endif } +#ifdef RECYCLER_VISITED_HOST +template +void +SmallRecyclerVisitedHostHeapBlockT::SetAttributes(void * address, unsigned char attributes) +{ + // Don't call __super, since that has behavior we don't want (it asserts that FinalizeBit is set + // but recycler visited block allows traced only objects; it also unconditionally bumps the heap info + // live/new finalizable object counts which will become unbalance if FinalizeBit is not set). + // We do want the grandparent class behavior though, which actually sets the ObjectInfo bits. + SmallFinalizableHeapBlockT::Base::SetAttributes(address, attributes); + +#ifdef RECYCLER_FINALIZE_CHECK + if (attributes & FinalizeBit) + { + this->finalizeCount++; + HeapInfo * heapInfo = this->heapBucket->heapInfo; + heapInfo->liveFinalizableObjectCount++; + heapInfo->newFinalizableObjectCount++; + } +#endif +} + +template +template +_NOINLINE +void SmallRecyclerVisitedHostHeapBlockT::ProcessMarkedObject(void* objectAddress, MarkContext * markContext) +{ + unsigned char * attributes = nullptr; + if (!this->TryGetAddressOfAttributes(objectAddress, &attributes)) + { + return; + } + + if (!this->template UpdateAttributesOfMarkedObjects(markContext, objectAddress, this->objectSize, *attributes, + [&](unsigned char _attributes) { *attributes = _attributes; })) + { + // Couldn't mark children- bail out and come back later + this->SetNeedOOMRescan(markContext->GetRecycler()); + } +} + +template +template +bool SmallRecyclerVisitedHostHeapBlockT::UpdateAttributesOfMarkedObjects(MarkContext * markContext, void * objectAddress, size_t objectSize, unsigned char attributes, Fn fn) +{ + bool noOOMDuringMark = true; + + if (attributes & TrackBit) + { + Assert((attributes & LeafBit) == 0); + IRecyclerVisitedObject* recyclerVisited = static_cast(objectAddress); + noOOMDuringMark = markContext->AddPreciselyTracedObject(recyclerVisited); + + if (noOOMDuringMark) + { + // Object has been successfully processed, so clear NewTrackBit + attributes &= ~NewTrackBit; + } + else + { + // Set the NewTrackBit, so that the main thread will redo tracking + attributes |= NewTrackBit; + noOOMDuringMark = false; + } + fn(attributes); + } + +#ifdef RECYCLER_STATS + RECYCLER_STATS_INTERLOCKED_INC(markContext->GetRecycler(), markData.markCount); + RECYCLER_STATS_INTERLOCKED_ADD(markContext->GetRecycler(), markData.markBytes, objectSize); + + // Count track or finalize if we don't have to process it in thread because of OOM. + if ((attributes & (TrackBit | NewTrackBit)) != (TrackBit | NewTrackBit)) + { + // Only count those we have queued, so we don't double count + if (attributes & TrackBit) + { + RECYCLER_STATS_INTERLOCKED_INC(markContext->GetRecycler(), trackCount); + } + if (attributes & FinalizeBit) + { + // we counted the finalizable object here, + // turn off the new bit so we don't count it again + // on Rescan + attributes &= ~NewFinalizeBit; + fn(attributes); + RECYCLER_STATS_INTERLOCKED_INC(markContext->GetRecycler(), finalizeCount); + } + } +#endif + + return noOOMDuringMark; +} + +// static +template +bool +SmallRecyclerVisitedHostHeapBlockT::RescanObject(SmallRecyclerVisitedHostHeapBlockT * block, __in_ecount(localObjectSize) char * objectAddress, uint localObjectSize, + uint objectIndex, Recycler * recycler) +{ + unsigned char const attributes = block->ObjectInfo(objectIndex); + + if ((attributes & TrackBit) != 0) + { + Assert((attributes & LeafBit) == 0); + Assert(block->GetAddressIndex(objectAddress) != SmallHeapBlockT::InvalidAddressBit); + + if (!recycler->AddPreciselyTracedMark(reinterpret_cast(objectAddress))) + { + // Failed to add to the mark stack due to OOM. + return false; + } + + // We have processed this object as tracked, we can clear the NewTrackBit + block->ObjectInfo(objectIndex) &= ~NewTrackBit; + RECYCLER_STATS_INC(recycler, trackCount); + + RECYCLER_STATS_INC(recycler, markData.rescanObjectCount); + RECYCLER_STATS_ADD(recycler, markData.rescanObjectByteCount, localObjectSize); + } + +#ifdef RECYCLER_STATS + if (attributes & FinalizeBit) + { + // Concurrent thread mark the object before the attribute is set and missed the finalize count + // For finalized object, we will always write a dummy vtable before returning to the call, + // so the page will always need to be rescanned, and we can count those here. + + // NewFinalizeBit is cleared if the background thread has already counted the object. + // So if it is still set here, we need to count it + + RECYCLER_STATS_INC_IF(attributes & NewFinalizeBit, recycler, finalizeCount); + block->ObjectInfo(objectIndex) &= ~NewFinalizeBit; + } +#endif + + return true; +} +#endif + template bool SmallFinalizableHeapBlockT::TryGetAttributes(void* objectAddress, unsigned char * pAttr) @@ -476,6 +661,14 @@ namespace Memory template class SmallFinalizableHeapBlockT; template void SmallFinalizableHeapBlockT::ProcessMarkedObject(void* objectAddress, MarkContext * markContext);; template void SmallFinalizableHeapBlockT::ProcessMarkedObject(void* objectAddress, MarkContext * markContext);; +#ifdef RECYCLER_VISITED_HOST + template class SmallRecyclerVisitedHostHeapBlockT; + template void SmallRecyclerVisitedHostHeapBlockT::ProcessMarkedObject(void* objectAddress, MarkContext * markContext); + template void SmallRecyclerVisitedHostHeapBlockT::ProcessMarkedObject(void* objectAddress, MarkContext * markContext); + template class SmallRecyclerVisitedHostHeapBlockT; + template void SmallRecyclerVisitedHostHeapBlockT::ProcessMarkedObject(void* objectAddress, MarkContext * markContext);; + template void SmallRecyclerVisitedHostHeapBlockT::ProcessMarkedObject(void* objectAddress, MarkContext * markContext);; +#endif #ifdef RECYCLER_WRITE_BARRIER template class SmallFinalizableWithBarrierHeapBlockT; diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBlock.h b/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBlock.h index 5669b8c04f0..b2baa766d37 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBlock.h +++ b/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBlock.h @@ -5,6 +5,9 @@ namespace Memory { template class SmallFinalizableHeapBucketT; +#ifdef RECYCLER_VISITED_HOST +template class SmallRecyclerVisitedHostHeapBlockT; +#endif #ifdef RECYCLER_WRITE_BARRIER template class SmallFinalizableWithBarrierHeapBlockT; #endif @@ -55,6 +58,13 @@ class SmallFinalizableHeapBlockT : public SmallNormalHeapBlockTisPendingConcurrentSweepPrep, "Finalizable blocks don't support allocations during concurrent sweep."); + } +#endif + this->pendingDisposeCount++; Assert(this->pendingDisposeCount <= this->objectCount); } @@ -115,6 +125,9 @@ class SmallFinalizableHeapBlockT : public SmallNormalHeapBlockT * bucket, ushort objectSize, ushort objectCount); +#ifdef RECYCLER_VISITED_HOST + SmallFinalizableHeapBlockT(HeapBucketT> * bucket, ushort objectSize, ushort objectCount, HeapBlockType blockType); +#endif #ifdef RECYCLER_WRITE_BARRIER SmallFinalizableHeapBlockT(HeapBucketT> * bucket, ushort objectSize, ushort objectCount, HeapBlockType blockType); #endif @@ -134,6 +147,48 @@ class SmallFinalizableHeapBlockT : public SmallNormalHeapBlockT +class SmallRecyclerVisitedHostHeapBlockT : public SmallFinalizableHeapBlockT +{ + typedef SmallFinalizableHeapBlockT Base; + friend class HeapBucketT; +public: + typedef TBlockAttributes HeapBlockAttributes; + + static const ObjectInfoBits RequiredAttributes = RecyclerVisitedHostBit; + + static SmallRecyclerVisitedHostHeapBlockT * New(HeapBucketT * bucket); + static void Delete(SmallRecyclerVisitedHostHeapBlockT * block); + + void SetAttributes(void * address, unsigned char attributes); + + template + void ProcessMarkedObject(void* candidate, MarkContext * markContext); + + template + bool UpdateAttributesOfMarkedObjects(MarkContext * markContext, void * objectAddress, size_t objectSize, unsigned char attributes, Fn fn); + + static bool RescanObject(SmallRecyclerVisitedHostHeapBlockT * block, __in_ecount(localObjectSize) char * objectAddress, uint localObjectSize, uint objectIndex, Recycler * recycler); + + SmallRecyclerVisitedHostHeapBlockT * GetNextBlock() const + { + HeapBlock* block = SmallHeapBlockT::GetNextBlock(); + return block ? block->template AsRecyclerVisitedHostBlock() : nullptr; + } + + virtual bool FindHeapObject(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject) override sealed + { + return this->template FindHeapObjectImpl>(objectAddress, recycler, flags, heapObject); + } +protected: + SmallRecyclerVisitedHostHeapBlockT(HeapBucketT * bucket, ushort objectSize, ushort objectCount) + : SmallFinalizableHeapBlockT(bucket, objectSize, objectCount, TBlockAttributes::IsSmallBlock ? Base::SmallRecyclerVisitedHostBlockType : Base::MediumRecyclerVisitedHostBlockType) + { + } +}; +#endif + #ifdef RECYCLER_WRITE_BARRIER template class SmallFinalizableWithBarrierHeapBlockT : public SmallFinalizableHeapBlockT @@ -144,7 +199,6 @@ class SmallFinalizableWithBarrierHeapBlockT : public SmallFinalizableHeapBlockT< typedef TBlockAttributes HeapBlockAttributes; static const ObjectInfoBits RequiredAttributes = FinalizableWithBarrierBit; - static const bool IsLeafOnly = false; static SmallFinalizableWithBarrierHeapBlockT * New(HeapBucketT * bucket); static void Delete(SmallFinalizableWithBarrierHeapBlockT * block); @@ -170,6 +224,11 @@ class SmallFinalizableWithBarrierHeapBlockT : public SmallFinalizableHeapBlockT< typedef SmallFinalizableHeapBlockT SmallFinalizableHeapBlock; typedef SmallFinalizableHeapBlockT MediumFinalizableHeapBlock; +#ifdef RECYCLER_VISITED_HOST +typedef SmallRecyclerVisitedHostHeapBlockT SmallRecyclerVisitedHostHeapBlock; +typedef SmallRecyclerVisitedHostHeapBlockT MediumRecyclerVisitedHostHeapBlock; +#endif + #ifdef RECYCLER_WRITE_BARRIER typedef SmallFinalizableWithBarrierHeapBlockT SmallFinalizableWithBarrierHeapBlock; typedef SmallFinalizableWithBarrierHeapBlockT MediumFinalizableWithBarrierHeapBlock; diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBucket.cpp b/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBucket.cpp index f1a8ecd4b19..7703427d8a1 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBucket.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBucket.cpp @@ -80,15 +80,15 @@ SmallFinalizableHeapBucketBaseT::ResetMarks(ResetMarkFlags flags) } } -#ifdef DUMP_FRAGMENTATION_STATS +#if ENABLE_MEM_STATS template void -SmallFinalizableHeapBucketBaseT::AggregateBucketStats(HeapBucketStats& stats) +SmallFinalizableHeapBucketBaseT::AggregateBucketStats() { - __super::AggregateBucketStats(stats); + __super::AggregateBucketStats(); - HeapBlockList::ForEach(pendingDisposeList, [&stats](TBlockType* heapBlock) { - heapBlock->AggregateBlockStats(stats); + HeapBlockList::ForEach(pendingDisposeList, [this](TBlockType* heapBlock) { + heapBlock->AggregateBlockStats(this->memStats); }); } #endif @@ -239,6 +239,10 @@ SmallFinalizableHeapBucketBaseT::VerifyMark() namespace Memory { template class SmallFinalizableHeapBucketBaseT; +#ifdef RECYCLER_VISITED_HOST + template class SmallFinalizableHeapBucketBaseT; + template class SmallFinalizableHeapBucketBaseT; +#endif #ifdef RECYCLER_WRITE_BARRIER template class SmallFinalizableHeapBucketBaseT; #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBucket.h b/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBucket.h index dd2bf1bc49b..be80fa4deb9 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBucket.h +++ b/deps/chakrashim/core/lib/Common/Memory/SmallFinalizableHeapBucket.h @@ -19,8 +19,8 @@ class SmallFinalizableHeapBucketBaseT : public SmallNormalHeapBucketBase class SmallFinalizableHeapBucketT : public SmallFinalizableHeapBucketBaseT > { }; +#ifdef RECYCLER_VISITED_HOST +template +class SmallRecyclerVisitedHostHeapBucketT : public SmallFinalizableHeapBucketBaseT > +{ +}; +#endif #ifdef RECYCLER_WRITE_BARRIER template class SmallFinalizableWithBarrierHeapBucketT : public SmallFinalizableHeapBucketBaseT > @@ -70,6 +76,10 @@ class SmallFinalizableWithBarrierHeapBucketT : public SmallFinalizableHeapBucket typedef SmallFinalizableHeapBucketT MediumFinalizableHeapBucket; typedef SmallFinalizableHeapBucketT SmallFinalizableHeapBucket; +#ifdef RECYCLER_VISITED_HOST +typedef SmallRecyclerVisitedHostHeapBucketT MediumRecyclerVisitedHostHeapBucket; +typedef SmallRecyclerVisitedHostHeapBucketT SmallRecyclerVisitedHostHeapBucket; +#endif #ifdef RECYCLER_WRITE_BARRIER typedef SmallFinalizableWithBarrierHeapBucketT MediumFinalizableWithBarrierHeapBucket; typedef SmallFinalizableWithBarrierHeapBucketT SmallFinalizableWithBarrierHeapBucket; @@ -81,11 +91,42 @@ template class SmallHeapBlockType { public: - CompileAssert(attributes & FinalizeBit); + + CompileAssert((attributes & FinalizeBit) != 0); +#ifdef RECYCLER_VISITED_HOST + // attributes with RecyclerVisitedHostBit must use SmallRecyclerVisitedHostHeap{Bucket|Block}T + CompileAssert((attributes & RecyclerVisitedHostBit) == 0); +#endif typedef SmallFinalizableHeapBlockT BlockType; typedef SmallFinalizableHeapBucketT BucketType; }; +#ifdef RECYCLER_VISITED_HOST +template <> +class SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostBit), SmallAllocationBlockAttributes> +{ +public: + typedef SmallRecyclerVisitedHostHeapBlock BlockType; + typedef SmallRecyclerVisitedHostHeapBucket BucketType; +}; + +template <> +class SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostTracedFinalizableBlockTypeBits), SmallAllocationBlockAttributes> +{ +public: + typedef SmallRecyclerVisitedHostHeapBlock BlockType; + typedef SmallRecyclerVisitedHostHeapBucket BucketType; +}; + +template <> +class SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostFinalizableBlockTypeBits), SmallAllocationBlockAttributes> +{ +public: + typedef SmallRecyclerVisitedHostHeapBlock BlockType; + typedef SmallRecyclerVisitedHostHeapBucket BucketType; +}; +#endif + template <> class SmallHeapBlockType { @@ -137,6 +178,32 @@ class SmallHeapBlockType typedef MediumFinalizableHeapBucket BucketType; }; +#ifdef RECYCLER_VISITED_HOST +template <> +class SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostBit), MediumAllocationBlockAttributes> +{ +public: + typedef MediumRecyclerVisitedHostHeapBlock BlockType; + typedef MediumRecyclerVisitedHostHeapBucket BucketType; +}; + +template <> +class SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostTracedFinalizableBlockTypeBits), MediumAllocationBlockAttributes> +{ +public: + typedef MediumRecyclerVisitedHostHeapBlock BlockType; + typedef MediumRecyclerVisitedHostHeapBucket BucketType; +}; + +template <> +class SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostFinalizableBlockTypeBits), MediumAllocationBlockAttributes> +{ +public: + typedef MediumRecyclerVisitedHostHeapBlock BlockType; + typedef MediumRecyclerVisitedHostHeapBucket BucketType; +}; +#endif + template <> class SmallHeapBlockType { @@ -229,6 +296,41 @@ class HeapBucketGroup } }; +#ifdef RECYCLER_VISITED_HOST + template <> + class BucketGetter<(ObjectInfoBits)(RecyclerVisitedHostBit)> + { + public: + typedef typename SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostBit), TBlockAttributes>::BucketType BucketType; + static BucketType& GetBucket(HeapBucketGroup * HeapBucketGroup) + { + return HeapBucketGroup->recyclerVisitedHostHeapBucket; + } + }; + + template <> + class BucketGetter<(ObjectInfoBits)(RecyclerVisitedHostTracedFinalizableBlockTypeBits)> + { + public: + typedef typename SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostTracedFinalizableBlockTypeBits), TBlockAttributes>::BucketType BucketType; + static BucketType& GetBucket(HeapBucketGroup * HeapBucketGroup) + { + return HeapBucketGroup->recyclerVisitedHostHeapBucket; + } + }; + + template <> + class BucketGetter<(ObjectInfoBits)(RecyclerVisitedHostFinalizableBlockTypeBits)> + { + public: + typedef typename SmallHeapBlockType<(ObjectInfoBits)(RecyclerVisitedHostFinalizableBlockTypeBits), TBlockAttributes>::BucketType BucketType; + static BucketType& GetBucket(HeapBucketGroup * HeapBucketGroup) + { + return HeapBucketGroup->recyclerVisitedHostHeapBucket; + } + }; +#endif + #ifdef RECYCLER_WRITE_BARRIER template <> class BucketGetter @@ -312,8 +414,11 @@ class HeapBucketGroup #ifdef RECYCLER_VERIFY_MARK void VerifyMark(); #endif -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP void StartAllocationDuringConcurrentSweep(); + bool DoTwoPassConcurrentSweepPreCheck(); + void FinishSweepPrep(RecyclerSweep& recyclerSweep); + void FinishConcurrentSweepPass1(RecyclerSweep& recyclerSweep); void FinishConcurrentSweep(); #endif #if DBG @@ -323,6 +428,9 @@ class HeapBucketGroup SmallNormalHeapBucketT heapBucket; SmallLeafHeapBucketT leafHeapBucket; SmallFinalizableHeapBucketT finalizableHeapBucket; +#ifdef RECYCLER_VISITED_HOST + SmallRecyclerVisitedHostHeapBucketT recyclerVisitedHostHeapBucket; +#endif #ifdef RECYCLER_WRITE_BARRIER SmallNormalWithBarrierHeapBucketT smallNormalWithBarrierHeapBucket; SmallFinalizableWithBarrierHeapBucketT smallFinalizableWithBarrierHeapBucket; diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallHeapBlockAllocator.cpp b/deps/chakrashim/core/lib/Common/Memory/SmallHeapBlockAllocator.cpp index 630ceafd41c..3cb31057e16 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallHeapBlockAllocator.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/SmallHeapBlockAllocator.cpp @@ -27,6 +27,10 @@ SmallHeapBlockAllocator::Initialize() this->prev = this; this->next = this; + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(this->isAllocatingFromNewBlock = false); +#endif } template @@ -134,7 +138,9 @@ SmallHeapBlockAllocator::Clear() #endif this->freeObjectList = nullptr; } - +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(this->isAllocatingFromNewBlock = false); +#endif } template @@ -155,6 +161,10 @@ SmallHeapBlockAllocator::SetNew(BlockType * heapBlock) this->heapBlock = heapBlock; this->freeObjectList = (FreeObject *)heapBlock->GetAddress(); this->endAddress = heapBlock->GetEndAddress(); + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(this->isAllocatingFromNewBlock = true); +#endif } template @@ -175,6 +185,10 @@ SmallHeapBlockAllocator::Set(BlockType * heapBlock) this->heapBlock = heapBlock; RECYCLER_SLOW_CHECK(this->heapBlock->CheckDebugFreeBitVector(true)); this->freeObjectList = this->heapBlock->freeObjectList; + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(this->isAllocatingFromNewBlock = false); +#endif } diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallHeapBlockAllocator.h b/deps/chakrashim/core/lib/Common/Memory/SmallHeapBlockAllocator.h index ad6394b6e05..bd063a0e9cd 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallHeapBlockAllocator.h +++ b/deps/chakrashim/core/lib/Common/Memory/SmallHeapBlockAllocator.h @@ -66,6 +66,12 @@ class SmallHeapBlockAllocator { return !IsBumpAllocMode() && !IsExplicitFreeObjectListAllocMode(); } +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + bool IsAllocatingDuringConcurrentSweepMode(Recycler * recycler) const + { + return IsFreeListAllocMode() && recycler->IsConcurrentSweepState(); + } +#endif private: static bool NeedSetAttributes(ObjectInfoBits attributes) { @@ -75,6 +81,11 @@ class SmallHeapBlockAllocator char * endAddress; FreeObject * freeObjectList; TBlockType * heapBlock; +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if DBG + bool isAllocatingFromNewBlock; +#endif +#endif SmallHeapBlockAllocator * prev; SmallHeapBlockAllocator * next; @@ -129,6 +140,15 @@ SmallHeapBlockAllocator::InlinedAllocImpl(Recycler * recycler, DECLS if (NeedSetAttributes(attributes)) { + if ((attributes & (FinalizeBit | TrackBit)) != 0) + { + // Make sure a valid vtable is installed as once the attributes have been set this allocation may be traced by background marking + memBlock = (char *)new (memBlock) DummyVTableObject(); +#if defined(_M_ARM32_OR_ARM64) + // On ARM, make sure the v-table write is performed before setting the attributes + MemoryBarrier(); +#endif + } heapBlock->SetAttributes(memBlock, (attributes & StoredObjectInfoBitMask)); } @@ -138,6 +158,11 @@ SmallHeapBlockAllocator::InlinedAllocImpl(Recycler * recycler, DECLS if (memBlock != nullptr && endAddress == nullptr) { // Free list allocation + freeObjectList = ((FreeObject *)memBlock)->GetNext(); +#ifdef RECYCLER_MEMORY_VERIFY + ((FreeObject *)memBlock)->DebugFillNext(); +#endif + Assert(!this->IsBumpAllocMode()); if (NeedSetAttributes(attributes)) { @@ -149,13 +174,20 @@ SmallHeapBlockAllocator::InlinedAllocImpl(Recycler * recycler, DECLS Assert(allocationHeapBlock != nullptr); Assert(!allocationHeapBlock->IsLargeHeapBlock()); } + + if ((attributes & (FinalizeBit | TrackBit)) != 0) + { + // Make sure a valid vtable is installed as once the attributes have been set this allocation may be traced by background marking + memBlock = (char *)new (memBlock) DummyVTableObject(); +#if defined(_M_ARM32_OR_ARM64) + // On ARM, make sure the v-table write is performed before setting the attributes + MemoryBarrier(); +#endif + } allocationHeapBlock->SetAttributes(memBlock, (attributes & StoredObjectInfoBitMask)); } - freeObjectList = ((FreeObject *)memBlock)->GetNext(); #ifdef RECYCLER_MEMORY_VERIFY - ((FreeObject *)memBlock)->DebugFillNext(); - if (this->IsExplicitFreeObjectListAllocMode()) { HeapBlock* heapBlock = recycler->FindHeapBlock(memBlock); @@ -172,6 +204,31 @@ SmallHeapBlockAllocator::InlinedAllocImpl(Recycler * recycler, DECLS BOOL isSet = heapBlock->GetDebugFreeBitVector()->TestAndClear(heapBlock->GetAddressBitIndex(memBlock)); Assert(isSet); } +#endif +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + // If we are allocating during concurrent sweep we must mark the object to prevent it from being swept + // in the ongoing sweep. + if (heapBlock != nullptr && heapBlock->isPendingConcurrentSweepPrep) + { + AssertMsg(!this->isAllocatingFromNewBlock, "We shouldn't be tracking allocation to a new block; i.e. bump allocation; during concurrent sweep."); + AssertMsg(!heapBlock->IsAnyFinalizableBlock(), "Allocations are not allowed to finalizable blocks during concurrent sweep."); + AssertMsg(heapBlock->heapBucket->AllocationsStartedDuringConcurrentSweep(), "We shouldn't be allocating from this block while allocations are disabled."); + + // Explcitly mark this object and also clear the free bit. + heapBlock->SetObjectMarkedBit(memBlock); +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + uint bitIndex = heapBlock->GetAddressBitIndex(memBlock); + heapBlock->GetDebugFreeBitVector()->Clear(bitIndex); + heapBlock->objectsMarkedDuringSweep++; +#endif + +#ifdef RECYCLER_TRACE + if (recycler->GetRecyclerFlagsTable().Trace.IsEnabled(Js::ConcurrentSweepPhase) && recycler->GetRecyclerFlagsTable().Trace.IsEnabled(Js::MemoryAllocationPhase) && CONFIG_FLAG_RELEASE(Verbose)) + { + Output::Print(_u("[**33**]FreeListAlloc: Object 0x%p from HeapBlock 0x%p used for allocation during ConcurrentSweep [CollectionState: %d] \n"), memBlock, heapBlock, recycler->collectionState); + } +#endif + } #endif return memBlock; } diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBlock.h b/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBlock.h index b9137aeefaa..c6f9edaace2 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBlock.h +++ b/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBlock.h @@ -18,7 +18,6 @@ class SmallNormalHeapBlockT : public SmallHeapBlockT typedef typename Base::SmallHeapBlockBitVector SmallHeapBlockBitVector; typedef TBlockAttributes HeapBlockAttributes; static const ObjectInfoBits RequiredAttributes = NoBit; - static const bool IsLeafOnly = false; static SmallNormalHeapBlockT * New(HeapBucketT * bucket); static void Delete(SmallNormalHeapBlockT * block); @@ -67,7 +66,6 @@ class SmallNormalWithBarrierHeapBlockT : public SmallNormalHeapBlockT * bucket); static void Delete(SmallNormalWithBarrierHeapBlockT * heapBlock); diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBucket.cpp b/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBucket.cpp index 4113e1a46b2..c2825409fc8 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBucket.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBucket.cpp @@ -16,18 +16,18 @@ SmallNormalHeapBucketBase::SmallNormalHeapBucketBase() { } -#ifdef DUMP_FRAGMENTATION_STATS +#if ENABLE_MEM_STATS template void -SmallNormalHeapBucketBase::AggregateBucketStats(HeapBucketStats& stats) +SmallNormalHeapBucketBase::AggregateBucketStats() { - __super::AggregateBucketStats(stats); + __super::AggregateBucketStats(); - HeapBlockList::ForEach(partialHeapBlockList, [&stats](SmallHeapBlock* heapBlock) { - heapBlock->AggregateBlockStats(stats); + HeapBlockList::ForEach(partialHeapBlockList, [this](TBlockType* heapBlock) { + heapBlock->AggregateBlockStats(this->memStats); }); - HeapBlockList::ForEach(partialSweptHeapBlockList, [&stats](SmallHeapBlock* heapBlock) { - heapBlock->AggregateBlockStats(stats); + HeapBlockList::ForEach(partialSweptHeapBlockList, [this](TBlockType* heapBlock) { + heapBlock->AggregateBlockStats(this->memStats); }); } #endif @@ -41,8 +41,8 @@ SmallNormalHeapBucketBase::ScanInitialImplicitRoots(Recycler * recyc heapBlock->ScanInitialImplicitRoots(recycler); }); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc) && !this->IsAnyFinalizableBucket()) { HeapBlockList::ForEach(this->sweepableHeapBlockList, [recycler](TBlockType * heapBlock) { @@ -243,20 +243,31 @@ SmallNormalHeapBucketBase::SweepPendingObjects(RecyclerSweep& recycl // The sweepable objects will be collected in a future Sweep. // Note, page heap blocks are never swept concurrently +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this, heapBlock, _u("[**17**] calling SweepObjects.")); +#endif heapBlock->template SweepObjects(recycler); // page heap mode should never reach here, so don't check pageheap enabled or not + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); if (heapBlock->HasFreeObject()) { + AssertMsg(!HeapBlockList::Contains(heapBlock, partialSweptHeapBlockList), "The heap block already exists in the partialSweptHeapBlockList."); // We have pre-existing free objects, so put this in the partialSweptHeapBlockList heapBlock->SetNextBlock(this->partialSweptHeapBlockList); this->partialSweptHeapBlockList = heapBlock; +#ifdef RECYCLER_TRACE + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**21**] finished SweepPendingObjects, heapblock added to partialSweptHeapBlockList.")); +#endif } else { // No free objects, so put in the fullBlockList heapBlock->SetNextBlock(this->fullBlockList); this->fullBlockList = heapBlock; +#ifdef RECYCLER_TRACE + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**22**] finished SweepPendingObjects, heapblock FULL added to fullBlockList.")); +#endif } }); } @@ -266,16 +277,20 @@ SmallNormalHeapBucketBase::SweepPendingObjects(RecyclerSweep& recycl // We decided not to do a partial sweep. // Blocks in the pendingSweepList need to have a regular sweep. -#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (this->AllowAllocationsDuringConcurrentSweep() && !this->AllocationsStartedDuringConcurrentSweep()) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) { - this->StartAllocationDuringConcurrentSweep(); + if (this->AllowAllocationsDuringConcurrentSweep() && !this->AllocationsStartedDuringConcurrentSweep()) + { + Assert(!this->IsAnyFinalizableBucket()); + this->StartAllocationDuringConcurrentSweep(); + } } #endif TBlockType * tail = SweepPendingObjects(recycler, list); -#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST // During concurrent sweep if allocations were allowed, the heap blocks directly go into the SLIST of // allocable heap blocks. They will be returned to the heapBlockList at the end of the sweep. if (!this->AllowAllocationsDuringConcurrentSweep()) @@ -303,19 +318,44 @@ SmallNormalHeapBucketBase::SweepPendingObjects(Recycler * recycler, HeapBlockList::ForEachEditing(list, [this, recycler, &tail](TBlockType * heapBlock) { // Note, page heap blocks are never swept concurrently +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this, heapBlock, _u("[**18**] calling SweepObjects.")); +#endif heapBlock->template SweepObjects(recycler); tail = heapBlock; -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (this->AllowAllocationsDuringConcurrentSweep()) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + if (this->AllocationsStartedDuringConcurrentSweep()) { - bool blockAddedToSList = HeapBucketT::PushHeapBlockToSList(this->allocableHeapBlockListHead, heapBlock); + Assert(!this->IsAnyFinalizableBucket()); + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + // If we exhausted the free list during this sweep, we will need to send this block to the FullBlockList. + if (heapBlock->HasFreeObject()) + { + Assert(!heapBlock->isPendingConcurrentSweepPrep); + bool blockAddedToSList = HeapBucketT::PushHeapBlockToSList(this->allocableHeapBlockListHead, heapBlock); - // If we encountered OOM while pushing the heapBlock to the SLIST we must add it to the heapBlockList so we don't lose track of it. - if (!blockAddedToSList) + // If we encountered OOM while pushing the heapBlock to the SLIST we must add it to the heapBlockList so we don't lose track of it. + if (!blockAddedToSList) + { + //TODO: akatti: We should handle this gracefully and try to recover from this state. + AssertOrFailFastMsg(false, "OOM while adding a heap block to the SLIST during concurrent sweep."); + } +#ifdef RECYCLER_TRACE + else + { + recycler->PrintBlockStatus(this, heapBlock, _u("[**24**] finished SweepPendingObjects, heapblock added to SLIST allocableHeapBlockListHead.")); + } +#endif + } + else { - heapBlock->SetNextBlock(this->heapBlockList); - this->heapBlockList = heapBlock; + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + heapBlock->SetNextBlock(this->fullBlockList); + this->fullBlockList = heapBlock; +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this, heapBlock, _u("[**25**] finished SweepPendingObjects, heapblock added to fullBlockList.")); +#endif } } #endif @@ -341,7 +381,7 @@ SmallNormalHeapBucketBase::SweepPartialReusePages(RecyclerSweep& rec TBlockType *& reuseBlocklist, TBlockType *&unusedBlockList, bool allocationsAllowedDuringConcurrentSweep, Fn callback) { HeapBlockList::ForEachEditing(heapBlockList, - [&recyclerSweep, &reuseBlocklist, &unusedBlockList, callback, allocationsAllowedDuringConcurrentSweep](TBlockType * heapBlock) + [&recyclerSweep, &reuseBlocklist, &unusedBlockList, callback, allocationsAllowedDuringConcurrentSweep, this](TBlockType * heapBlock) { uint expectFreeByteCount; if (heapBlock->DoPartialReusePage(recyclerSweep, expectFreeByteCount)) @@ -349,12 +389,13 @@ SmallNormalHeapBucketBase::SweepPartialReusePages(RecyclerSweep& rec callback(heapBlock, true); -#if ENABLE_CONCURRENT_GC && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST // During concurrent sweep if allocations were allowed, the heap blocks directly go into the SLIST of // allocable heap blocks. They will be returned to the heapBlockList at the end of the sweep. if(!allocationsAllowedDuringConcurrentSweep) #endif { + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); // Reuse the page heapBlock->SetNextBlock(reuseBlocklist); reuseBlocklist = heapBlock; @@ -368,6 +409,7 @@ SmallNormalHeapBucketBase::SweepPartialReusePages(RecyclerSweep& rec // Don't not reuse the page if it don't have much free memory. callback(heapBlock, false); + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); heapBlock->SetNextBlock(unusedBlockList); unusedBlockList = heapBlock; @@ -385,9 +427,10 @@ SmallNormalHeapBucketBase::SweepPartialReusePages(RecyclerSweep& rec RECYCLER_SLOW_CHECK(this->VerifyHeapBlockCount(recyclerSweep.IsBackground())); Assert(this->GetRecycler()->inPartialCollectMode); -#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST if (this->AllowAllocationsDuringConcurrentSweep() && !this->AllocationsStartedDuringConcurrentSweep()) { + Assert(!this->IsAnyFinalizableBucket()); this->StartAllocationDuringConcurrentSweep(); } #endif @@ -395,23 +438,59 @@ SmallNormalHeapBucketBase::SweepPartialReusePages(RecyclerSweep& rec TBlockType * currentHeapBlockList = this->heapBlockList; this->heapBlockList = nullptr; SmallNormalHeapBucketBase::SweepPartialReusePages(recyclerSweep, currentHeapBlockList, this->heapBlockList, - this->partialHeapBlockList, this->AllowAllocationsDuringConcurrentSweep(), + this->partialHeapBlockList, this->AllocationsStartedDuringConcurrentSweep(), [this](TBlockType * heapBlock, bool isReused) { -#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST if (isReused) { - if (this->AllowAllocationsDuringConcurrentSweep()) - { - bool blockAddedToSList = HeapBucketT::PushHeapBlockToSList(this->allocableHeapBlockListHead, heapBlock); + DebugOnly(heapBlock->blockNotReusedInPartialHeapBlockList = false); - // If we encountered OOM while pushing the heapBlock to the SLIST we must add it to the heapBlockList so we don't lose track of it. - if (!blockAddedToSList) + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + if (heapBlock->HasFreeObject()) + { + if (this->AllocationsStartedDuringConcurrentSweep()) { - heapBlock->SetNextBlock(this->heapBlockList); - this->heapBlockList = heapBlock; + Assert(!this->IsAnyFinalizableBucket()); + Assert(!heapBlock->isPendingConcurrentSweepPrep); + bool blockAddedToSList = HeapBucketT::PushHeapBlockToSList(this->allocableHeapBlockListHead, heapBlock); + + // If we encountered OOM while pushing the heapBlock to the SLIST we must add it to the heapBlockList so we don't lose track of it. + if (!blockAddedToSList) + { + //TODO: akatti: We should handle this gracefully and try to recover from this state. + AssertOrFailFastMsg(false, "OOM while adding a heap block to the SLIST during concurrent sweep."); + } +#ifdef RECYCLER_TRACE + else + { + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**11**] finished SweepPartialReusePages, heapblock REUSED added to SLIST allocableHeapBlockListHead.")); + } +#endif } } + else + { + heapBlock->SetNextBlock(this->fullBlockList); + this->fullBlockList = heapBlock; +#ifdef RECYCLER_TRACE + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**27**] finished SweepPartialReusePages, heapblock FULL added to fullBlockList.")); +#endif + } + } + else + { + DebugOnly(heapBlock->blockNotReusedInPartialHeapBlockList = true); +#ifdef RECYCLER_TRACE + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**12**] finished SweepPartialReusePages, heapblock NOT REUSED, added to partialHeapBlockList.")); +#endif + +#if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED) + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + heapBlock->ResetConcurrentSweepAllocationCounts(); + } +#endif } #endif }); @@ -425,41 +504,76 @@ SmallNormalHeapBucketBase::SweepPartialReusePages(RecyclerSweep& rec pendingSweepList = nullptr; Recycler * recycler = recyclerSweep.GetRecycler(); SmallNormalHeapBucketBase::SweepPartialReusePages(recyclerSweep, currentHeapBlockList, this->heapBlockList, - pendingSweepList, this->AllowAllocationsDuringConcurrentSweep(), + pendingSweepList, this->AllocationsStartedDuringConcurrentSweep(), [this, recycler](TBlockType * heapBlock, bool isReused) { if (isReused) { +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(heapBlock->blockNotReusedInPendingList = false); +#endif // Finalizable blocks are always swept in thread, so shouldn't be here Assert(!heapBlock->IsAnyFinalizableBlock()); // Page heap blocks are never swept concurrently +#ifdef RECYCLER_TRACE + recycler->PrintBlockStatus(this, heapBlock, _u("[**20**] calling SweepObjects.")); +#endif heapBlock->template SweepObjects(recycler); -#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST - if (this->AllowAllocationsDuringConcurrentSweep()) +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST + DebugOnly(this->AssertCheckHeapBlockNotInAnyList(heapBlock)); + if (heapBlock->HasFreeObject()) { - bool blockAddedToSList = HeapBucketT::PushHeapBlockToSList(this->allocableHeapBlockListHead, heapBlock); - - // If we encountered OOM while pushing the heapBlock to the SLIST we must add it to the heapBlockList so we don't lose track of it. - if (!blockAddedToSList) + if (this->AllocationsStartedDuringConcurrentSweep()) { - heapBlock->SetNextBlock(this->heapBlockList); - this->heapBlockList = heapBlock; + Assert(!this->IsAnyFinalizableBucket()); + Assert(!heapBlock->isPendingConcurrentSweepPrep); + bool blockAddedToSList = HeapBucketT::PushHeapBlockToSList(this->allocableHeapBlockListHead, heapBlock); + + // If we encountered OOM while pushing the heapBlock to the SLIST we must add it to the heapBlockList so we don't lose track of it. + if (!blockAddedToSList) + { + //TODO: akatti: We should handle this gracefully and try to recover from this state. + AssertOrFailFastMsg(false, "OOM while adding a heap block to the SLIST during concurrent sweep."); + } +#ifdef RECYCLER_TRACE + else + { + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**14**] finished SweepPartialReusePages, heapblock from PendingSweepList REUSED added to SLIST allocableHeapBlockListHead.")); + } +#endif } } + else + { + heapBlock->SetNextBlock(this->fullBlockList); + this->fullBlockList = heapBlock; +#ifdef RECYCLER_TRACE + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**28**] finished SweepPartialReusePages, heapblock FULL added to fullBlockList.")); +#endif + } #endif // This block has been counted as concurrently swept, and now we changed our mind // and sweep it in thread. Remove the count RECYCLER_STATS_DEC(recycler, heapBlockConcurrentSweptCount[heapBlock->GetHeapBlockType()]); } + else + { +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + DebugOnly(heapBlock->blockNotReusedInPendingList = true); +#endif +#ifdef RECYCLER_TRACE + this->GetRecycler()->PrintBlockStatus(this, heapBlock, _u("[**15**] finished SweepPartialReusePages, heapblock NOT REUSED added to pendingSweepList.")); +#endif + } } ); #endif RECYCLER_SLOW_CHECK(this->VerifyHeapBlockCount(recyclerSweep.IsBackground())); -#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST && ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP_USE_SLIST +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP && SUPPORT_WIN32_SLIST if (!this->AllocationsStartedDuringConcurrentSweep()) #endif { @@ -477,7 +591,12 @@ SmallNormalHeapBucketBase::FinishPartialCollect(RecyclerSweep * recy RECYCLER_SLOW_CHECK(this->VerifyHeapBlockCount(recyclerSweep != nullptr && recyclerSweep->IsBackground())); Assert(this->GetRecycler()->inPartialCollectMode); + +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + Assert(recyclerSweep == nullptr || this->IsAllocationStopped() || this->AllocationsStartedDuringConcurrentSweep()); +#else Assert(recyclerSweep == nullptr || this->IsAllocationStopped()); +#endif #if ENABLE_CONCURRENT_GC // Process the partial Swept block and move it to the partial heap block list @@ -525,7 +644,11 @@ SmallNormalHeapBucketBase::FinishPartialCollect(RecyclerSweep * recy } } #if ENABLE_CONCURRENT_GC +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP + if (recyclerSweep->GetPendingSweepBlockList(this) == nullptr && !this->AllocationsStartedDuringConcurrentSweep()) +#else if (recyclerSweep->GetPendingSweepBlockList(this) == nullptr) +#endif #endif { // nothing else to sweep now, we can start allocating now. @@ -584,7 +707,19 @@ SmallNormalHeapBucketBase::GetNonEmptyHeapBlockCount(bool checkCount #if ENABLE_CONCURRENT_GC currentHeapBlockCount += HeapBlockList::Count(partialSweptHeapBlockList); #endif - RECYCLER_SLOW_CHECK(Assert(!checkCount || this->heapBlockCount == currentHeapBlockCount)); + bool allocatingDuringConcurrentSweep = false; + +#if ENABLE_CONCURRENT_GC +#if ENABLE_ALLOCATIONS_DURING_CONCURRENT_SWEEP +#if SUPPORT_WIN32_SLIST + if (CONFIG_FLAG_RELEASE(EnableConcurrentSweepAlloc)) + { + allocatingDuringConcurrentSweep = true; + } +#endif +#endif +#endif + RECYCLER_SLOW_CHECK(Assert(!checkCount || this->heapBlockCount == currentHeapBlockCount || (this->heapBlockCount >= 65535 && allocatingDuringConcurrentSweep))); return currentHeapBlockCount; } #endif @@ -601,6 +736,7 @@ SmallNormalHeapBucketBase::Check(bool checkCount) Assert(partialSweptHeapBlockList == nullptr || this->GetRecycler()->inPartialCollectMode); smallHeapBlockCount += HeapInfo::Check(false, false, this->partialSweptHeapBlockList); #endif + Assert(!checkCount || this->heapBlockCount == smallHeapBlockCount); return smallHeapBlockCount; } @@ -683,6 +819,11 @@ namespace Memory template class SmallNormalHeapBucketBase; template class SmallNormalHeapBucketBase; +#ifdef RECYCLER_VISITED_HOST + template class SmallNormalHeapBucketBase; + template class SmallNormalHeapBucketBase; +#endif + #ifdef RECYCLER_WRITE_BARRIER template class SmallNormalHeapBucketBase; template class SmallNormalHeapBucketBase; diff --git a/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBucket.h b/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBucket.h index bd686b82057..2bf92bc2939 100644 --- a/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBucket.h +++ b/deps/chakrashim/core/lib/Common/Memory/SmallNormalHeapBucket.h @@ -20,8 +20,8 @@ class SmallNormalHeapBucketBase : public HeapBucketT friend class ::ScriptMemoryDumper; #endif -#ifdef DUMP_FRAGMENTATION_STATS - void AggregateBucketStats(HeapBucketStats& stats); +#if ENABLE_MEM_STATS + void AggregateBucketStats(); #endif protected: template @@ -44,7 +44,7 @@ class SmallNormalHeapBucketBase : public HeapBucketT ~SmallNormalHeapBucketBase(); template - static void SweepPartialReusePages(RecyclerSweep& recyclerSweep, TBlockType * heapBlockList, + void SweepPartialReusePages(RecyclerSweep& recyclerSweep, TBlockType * heapBlockList, TBlockType *& reuseBlocklist, TBlockType *&unusedBlockList, bool allocationsAllowedDuringConcurrentSweep, Fn callBack); void SweepPartialReusePages(RecyclerSweep& recyclerSweep); void FinishPartialCollect(RecyclerSweep * recyclerSweep); diff --git a/deps/chakrashim/core/lib/Common/Memory/StressTest.cpp b/deps/chakrashim/core/lib/Common/Memory/StressTest.cpp index 09c35380c0b..8e5b15c5c1b 100644 --- a/deps/chakrashim/core/lib/Common/Memory/StressTest.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/StressTest.cpp @@ -168,7 +168,7 @@ void TestObject::CreateFalseReferenceRandom(TestObject *val) StressTester::StressTester(Recycler *_recycler) : recycler(_recycler) { uint seed = (uint)time(NULL); - printf("Random seed: %u\n", seed); + Output::Print(_u("Random seed: %u\n"), seed); srand(seed); } diff --git a/deps/chakrashim/core/lib/Common/Memory/ValidPointersMap/vpm.32b.h b/deps/chakrashim/core/lib/Common/Memory/ValidPointersMap/vpm.32b.h index 05c524fc9ce..3fa5eb96981 100644 --- a/deps/chakrashim/core/lib/Common/Memory/ValidPointersMap/vpm.32b.h +++ b/deps/chakrashim/core/lib/Common/Memory/ValidPointersMap/vpm.32b.h @@ -6,7 +6,8 @@ // Target platforms: 32bit - x86 & arm #if USE_STATIC_VPM -const ushort HeapInfo::ValidPointersMap::validPointersBuffer[HeapConstants::BucketCount][HeapInfo::ValidPointersMap::rowSize] = +#if USE_VPM_TABLE +const ushort HeapInfo::ValidPointersMap::validPointersBuffer[HeapConstants::BucketCount][HeapInfo::ValidPointersMap::rowSize] = { { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, 0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x013F, 0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014A, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, 0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F, 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018A, 0x018B, 0x018C, 0x018D, 0x018E, 0x018F, 0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, 0x019A, 0x019B, 0x019C, 0x019D, 0x019E, 0x019F, 0x01A0, 0x01A1, 0x01A2, 0x01A3, 0x01A4, 0x01A5, 0x01A6, 0x01A7, 0x01A8, 0x01A9, 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x01AE, 0x01AF, 0x01B0, 0x01B1, 0x01B2, 0x01B3, 0x01B4, 0x01B5, 0x01B6, 0x01B7, 0x01B8, 0x01B9, 0x01BA, 0x01BB, 0x01BC, 0x01BD, 0x01BE, 0x01BF, 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C4, 0x01C5, 0x01C6, 0x01C7, 0x01C8, 0x01C9, 0x01CA, 0x01CB, 0x01CC, 0x01CD, 0x01CE, 0x01CF, 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, 0x01DE, 0x01DF, 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E4, 0x01E5, 0x01E6, 0x01E7, 0x01E8, 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, 0x01EE, 0x01EF, 0x01F0, 0x01F1, 0x01F2, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x01FA, 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, 0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x013F, 0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014A, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, 0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F, 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018A, 0x018B, 0x018C, 0x018D, 0x018E, 0x018F, 0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, 0x019A, 0x019B, 0x019C, 0x019D, 0x019E, 0x019F, 0x01A0, 0x01A1, 0x01A2, 0x01A3, 0x01A4, 0x01A5, 0x01A6, 0x01A7, 0x01A8, 0x01A9, 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x01AE, 0x01AF, 0x01B0, 0x01B1, 0x01B2, 0x01B3, 0x01B4, 0x01B5, 0x01B6, 0x01B7, 0x01B8, 0x01B9, 0x01BA, 0x01BB, 0x01BC, 0x01BD, 0x01BE, 0x01BF, 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C4, 0x01C5, 0x01C6, 0x01C7, 0x01C8, 0x01C9, 0x01CA, 0x01CB, 0x01CC, 0x01CD, 0x01CE, 0x01CF, 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, 0x01DE, 0x01DF, 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E4, 0x01E5, 0x01E6, 0x01E7, 0x01E8, 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, 0x01EE, 0x01EF, 0x01F0, 0x01F1, 0x01F2, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x01FA, 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF @@ -105,6 +106,8 @@ const ushort HeapInfo::ValidPointersMap::validPo 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0002, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0004, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0007, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0008, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0009, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F } }; +#endif // USE_VPM_TABLE + const BVUnit HeapInfo::ValidPointersMap::invalidBitsData[HeapConstants::BucketCount][SmallHeapBlockT::SmallHeapBlockBitVector::wordCount] = { { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 @@ -211,196 +214,165 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { { 0x00FF, 0x0100 }, { 0x01FF, 0x0100 } - }, // Bucket: 1, Size: 32 { { 0x007F, 0x0080 }, { 0x00FF, 0x0080 } - }, // Bucket: 2, Size: 48 { { 0x0055, 0x0056 }, { 0x00A9, 0x0054 } - }, // Bucket: 3, Size: 64 { { 0x003F, 0x0040 }, { 0x007F, 0x0040 } - }, // Bucket: 4, Size: 80 { { 0x0033, 0x0034 }, { 0x0065, 0x0032 } - }, // Bucket: 5, Size: 96 { { 0x002A, 0x002B }, { 0x0054, 0x002A } - }, // Bucket: 6, Size: 112 { { 0x0024, 0x0025 }, { 0x0048, 0x0024 } - }, // Bucket: 7, Size: 128 { { 0x001F, 0x0020 }, { 0x003F, 0x0020 } - }, // Bucket: 8, Size: 144 { { 0x001C, 0x001D }, { 0x0037, 0x001B } - }, // Bucket: 9, Size: 160 { { 0x0019, 0x001A }, { 0x0032, 0x0019 } - }, // Bucket: 10, Size: 176 { { 0x0017, 0x0018 }, { 0x002D, 0x0016 } - }, // Bucket: 11, Size: 192 { { 0x0015, 0x0016 }, { 0x0029, 0x0014 } - }, // Bucket: 12, Size: 208 { { 0x0013, 0x0014 }, { 0x0026, 0x0013 } - }, // Bucket: 13, Size: 224 { { 0x0012, 0x0013 }, { 0x0023, 0x0011 } - }, // Bucket: 14, Size: 240 { { 0x0011, 0x0012 }, { 0x0021, 0x0010 } - }, // Bucket: 15, Size: 256 { { 0x000F, 0x0010 }, { 0x001F, 0x0010 } - }, // Bucket: 16, Size: 272 { { 0x000F, 0x0010 }, { 0x001D, 0x000E } - }, // Bucket: 17, Size: 288 { { 0x000E, 0x000F }, { 0x001B, 0x000D } - }, // Bucket: 18, Size: 304 { { 0x000D, 0x000E }, { 0x0019, 0x000C } - }, // Bucket: 19, Size: 320 { { 0x000C, 0x000D }, { 0x0018, 0x000C } - }, // Bucket: 20, Size: 336 { { 0x000C, 0x000D }, { 0x0017, 0x000B } - }, // Bucket: 21, Size: 352 { { 0x000B, 0x000C }, { 0x0016, 0x000B } - }, // Bucket: 22, Size: 368 { { 0x000B, 0x000C }, { 0x0015, 0x000A } - }, // Bucket: 23, Size: 384 { { 0x000A, 0x000B }, { 0x0014, 0x000A } - }, // Bucket: 24, Size: 400 { { 0x000A, 0x000B }, { 0x0013, 0x0009 } - }, // Bucket: 25, Size: 416 { { 0x0009, 0x000A }, { 0x0012, 0x0009 } - }, // Bucket: 26, Size: 432 { { 0x0009, 0x000A }, { 0x0011, 0x0008 } - }, // Bucket: 27, Size: 448 { { 0x0009, 0x000A }, { 0x0011, 0x0008 } - }, // Bucket: 28, Size: 464 { { 0x0008, 0x0009 }, { 0x0010, 0x0008 } - }, // Bucket: 29, Size: 480 { { 0x0008, 0x0009 }, { 0x0010, 0x0008 } - }, // Bucket: 30, Size: 496 { { 0x0008, 0x0009 }, { 0x000F, 0x0007 } - }, // Bucket: 31, Size: 512 { { 0x0007, 0x0008 }, { 0x000F, 0x0008 } - - } + } }; -const ushort HeapInfo::ValidPointersMap::validPointersBuffer[MediumAllocationBlockAttributes::BucketCount][HeapInfo::ValidPointersMap::rowSize] = +#if USE_VPM_TABLE +const ushort HeapInfo::ValidPointersMap::validPointersBuffer[MediumAllocationBlockAttributes::BucketCount][HeapInfo::ValidPointersMap::rowSize] = { { 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0002, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0004, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0007, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0008, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0009, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0010, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0011, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0012, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0013, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0014, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0015, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0016, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0017, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0018, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0019, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0021, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0022, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0023, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0024, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0025, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0026, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0027, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0028, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0029, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF @@ -493,6 +465,8 @@ const ushort HeapInfo::ValidPointersMap::validP 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0002, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003 } }; +#endif // USE_VPM_TABLE + const BVUnit HeapInfo::ValidPointersMap::invalidBitsData[MediumAllocationBlockAttributes::BucketCount][SmallHeapBlockT::SmallHeapBlockBitVector::wordCount] = { { 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFEFFFF, 0xFFFFFFFF, 0xFFFFFFFF @@ -599,7 +573,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x001F, 0x0005 }, { 0x0025, 0x0006 }, { 0x0029, 0x0004 } - }, // Bucket: 1, Size: 1024 { @@ -611,7 +584,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0017, 0x0004 }, { 0x001B, 0x0004 }, { 0x001F, 0x0004 } - }, // Bucket: 2, Size: 1280 { @@ -623,7 +595,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0013, 0x0004 }, { 0x0016, 0x0003 }, { 0x0018, 0x0002 } - }, // Bucket: 3, Size: 1536 { @@ -635,7 +606,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x000F, 0x0002 }, { 0x0012, 0x0003 }, { 0x0014, 0x0002 } - }, // Bucket: 4, Size: 1792 { @@ -647,7 +617,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x000D, 0x0002 }, { 0x000F, 0x0002 }, { 0x0011, 0x0002 } - }, // Bucket: 5, Size: 2048 { @@ -659,7 +628,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x000B, 0x0002 }, { 0x000D, 0x0002 }, { 0x000F, 0x0002 } - }, // Bucket: 6, Size: 2304 { @@ -671,7 +639,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x000A, 0x0002 }, { 0x000C, 0x0002 }, { 0x000D, 0x0001 } - }, // Bucket: 7, Size: 2560 { @@ -683,7 +650,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0009, 0x0002 }, { 0x000B, 0x0002 }, { 0x0000, 0x0000 } - }, // Bucket: 8, Size: 2816 { @@ -695,7 +661,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0008, 0x0001 }, { 0x000A, 0x0002 }, { 0x0000, 0x0000 } - }, // Bucket: 9, Size: 3072 { @@ -707,7 +672,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0007, 0x0001 }, { 0x0009, 0x0002 }, { 0x0000, 0x0000 } - }, // Bucket: 10, Size: 3328 { @@ -719,7 +683,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0007, 0x0001 }, { 0x0008, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 11, Size: 3584 { @@ -731,7 +694,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0006, 0x0001 }, { 0x0007, 0x0001 }, { 0x0008, 0x0001 } - }, // Bucket: 12, Size: 3840 { @@ -743,7 +705,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0006, 0x0001 }, { 0x0007, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 13, Size: 4096 { @@ -755,7 +716,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0005, 0x0001 }, { 0x0006, 0x0001 }, { 0x0007, 0x0001 } - }, // Bucket: 14, Size: 4352 { @@ -767,7 +727,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0005, 0x0001 }, { 0x0006, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 15, Size: 4608 { @@ -779,7 +738,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0005, 0x0001 }, { 0x0006, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 16, Size: 4864 { @@ -791,7 +749,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0005, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 17, Size: 5120 { @@ -803,7 +760,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0004, 0x0001 }, { 0x0005, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 18, Size: 5376 { @@ -815,7 +771,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0004, 0x0001 }, { 0x0005, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 19, Size: 5632 { @@ -827,7 +782,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0004, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 20, Size: 5888 { @@ -839,7 +793,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0004, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 21, Size: 6144 { @@ -851,7 +804,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0000, 0x0000 }, { 0x0004, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 22, Size: 6400 { @@ -863,7 +815,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0000, 0x0000 }, { 0x0004, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 23, Size: 6656 { @@ -875,7 +826,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0000, 0x0000 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 24, Size: 6912 { @@ -887,7 +837,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 25, Size: 7168 { @@ -899,7 +848,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 26, Size: 7424 { @@ -911,7 +859,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 27, Size: 7680 { @@ -923,7 +870,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 28, Size: 7936 { @@ -935,7 +881,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 29, Size: 8192 { @@ -947,7 +892,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0000, 0x0000 }, { 0x0003, 0x0001 }, { 0x0000, 0x0000 } - - } + } }; #endif // USE_STATIC_VPM diff --git a/deps/chakrashim/core/lib/Common/Memory/ValidPointersMap/vpm.64b.h b/deps/chakrashim/core/lib/Common/Memory/ValidPointersMap/vpm.64b.h index 292d276e52d..fd43fb4b2ba 100644 --- a/deps/chakrashim/core/lib/Common/Memory/ValidPointersMap/vpm.64b.h +++ b/deps/chakrashim/core/lib/Common/Memory/ValidPointersMap/vpm.64b.h @@ -6,7 +6,8 @@ // Target platform: 64bit - amd64 & arm64 #if USE_STATIC_VPM -const ushort HeapInfo::ValidPointersMap::validPointersBuffer[HeapConstants::BucketCount][HeapInfo::ValidPointersMap::rowSize] = +#if USE_VPM_TABLE +const ushort HeapInfo::ValidPointersMap::validPointersBuffer[HeapConstants::BucketCount][HeapInfo::ValidPointersMap::rowSize] = { { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, 0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x013F, 0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014A, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, 0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F, 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018A, 0x018B, 0x018C, 0x018D, 0x018E, 0x018F, 0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, 0x019A, 0x019B, 0x019C, 0x019D, 0x019E, 0x019F, 0x01A0, 0x01A1, 0x01A2, 0x01A3, 0x01A4, 0x01A5, 0x01A6, 0x01A7, 0x01A8, 0x01A9, 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x01AE, 0x01AF, 0x01B0, 0x01B1, 0x01B2, 0x01B3, 0x01B4, 0x01B5, 0x01B6, 0x01B7, 0x01B8, 0x01B9, 0x01BA, 0x01BB, 0x01BC, 0x01BD, 0x01BE, 0x01BF, 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C4, 0x01C5, 0x01C6, 0x01C7, 0x01C8, 0x01C9, 0x01CA, 0x01CB, 0x01CC, 0x01CD, 0x01CE, 0x01CF, 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, 0x01DE, 0x01DF, 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E4, 0x01E5, 0x01E6, 0x01E7, 0x01E8, 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, 0x01EE, 0x01EF, 0x01F0, 0x01F1, 0x01F2, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x01FA, 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209, 0x020A, 0x020B, 0x020C, 0x020D, 0x020E, 0x020F, 0x0210, 0x0211, 0x0212, 0x0213, 0x0214, 0x0215, 0x0216, 0x0217, 0x0218, 0x0219, 0x021A, 0x021B, 0x021C, 0x021D, 0x021E, 0x021F, 0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0226, 0x0227, 0x0228, 0x0229, 0x022A, 0x022B, 0x022C, 0x022D, 0x022E, 0x022F, 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237, 0x0238, 0x0239, 0x023A, 0x023B, 0x023C, 0x023D, 0x023E, 0x023F, 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, 0x0248, 0x0249, 0x024A, 0x024B, 0x024C, 0x024D, 0x024E, 0x024F, 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, 0x0258, 0x0259, 0x025A, 0x025B, 0x025C, 0x025D, 0x025E, 0x025F, 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, 0x0268, 0x0269, 0x026A, 0x026B, 0x026C, 0x026D, 0x026E, 0x026F, 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, 0x0278, 0x0279, 0x027A, 0x027B, 0x027C, 0x027D, 0x027E, 0x027F, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, 0x0288, 0x0289, 0x028A, 0x028B, 0x028C, 0x028D, 0x028E, 0x028F, 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, 0x0298, 0x0299, 0x029A, 0x029B, 0x029C, 0x029D, 0x029E, 0x029F, 0x02A0, 0x02A1, 0x02A2, 0x02A3, 0x02A4, 0x02A5, 0x02A6, 0x02A7, 0x02A8, 0x02A9, 0x02AA, 0x02AB, 0x02AC, 0x02AD, 0x02AE, 0x02AF, 0x02B0, 0x02B1, 0x02B2, 0x02B3, 0x02B4, 0x02B5, 0x02B6, 0x02B7, 0x02B8, 0x02B9, 0x02BA, 0x02BB, 0x02BC, 0x02BD, 0x02BE, 0x02BF, 0x02C0, 0x02C1, 0x02C2, 0x02C3, 0x02C4, 0x02C5, 0x02C6, 0x02C7, 0x02C8, 0x02C9, 0x02CA, 0x02CB, 0x02CC, 0x02CD, 0x02CE, 0x02CF, 0x02D0, 0x02D1, 0x02D2, 0x02D3, 0x02D4, 0x02D5, 0x02D6, 0x02D7, 0x02D8, 0x02D9, 0x02DA, 0x02DB, 0x02DC, 0x02DD, 0x02DE, 0x02DF, 0x02E0, 0x02E1, 0x02E2, 0x02E3, 0x02E4, 0x02E5, 0x02E6, 0x02E7, 0x02E8, 0x02E9, 0x02EA, 0x02EB, 0x02EC, 0x02ED, 0x02EE, 0x02EF, 0x02F0, 0x02F1, 0x02F2, 0x02F3, 0x02F4, 0x02F5, 0x02F6, 0x02F7, 0x02F8, 0x02F9, 0x02FA, 0x02FB, 0x02FC, 0x02FD, 0x02FE, 0x02FF, 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, 0x034F, 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 0x0358, 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, 0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x037F, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387, 0x0388, 0x0389, 0x038A, 0x038B, 0x038C, 0x038D, 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A2, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x03CF, 0x03D0, 0x03D1, 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, 0x03D8, 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD, 0x03DE, 0x03DF, 0x03E0, 0x03E1, 0x03E2, 0x03E3, 0x03E4, 0x03E5, 0x03E6, 0x03E7, 0x03E8, 0x03E9, 0x03EA, 0x03EB, 0x03EC, 0x03ED, 0x03EE, 0x03EF, 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, 0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x013F, 0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014A, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, 0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F, 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018A, 0x018B, 0x018C, 0x018D, 0x018E, 0x018F, 0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, 0x019A, 0x019B, 0x019C, 0x019D, 0x019E, 0x019F, 0x01A0, 0x01A1, 0x01A2, 0x01A3, 0x01A4, 0x01A5, 0x01A6, 0x01A7, 0x01A8, 0x01A9, 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x01AE, 0x01AF, 0x01B0, 0x01B1, 0x01B2, 0x01B3, 0x01B4, 0x01B5, 0x01B6, 0x01B7, 0x01B8, 0x01B9, 0x01BA, 0x01BB, 0x01BC, 0x01BD, 0x01BE, 0x01BF, 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C4, 0x01C5, 0x01C6, 0x01C7, 0x01C8, 0x01C9, 0x01CA, 0x01CB, 0x01CC, 0x01CD, 0x01CE, 0x01CF, 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, 0x01DE, 0x01DF, 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E4, 0x01E5, 0x01E6, 0x01E7, 0x01E8, 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, 0x01EE, 0x01EF, 0x01F0, 0x01F1, 0x01F2, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x01FA, 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209, 0x020A, 0x020B, 0x020C, 0x020D, 0x020E, 0x020F, 0x0210, 0x0211, 0x0212, 0x0213, 0x0214, 0x0215, 0x0216, 0x0217, 0x0218, 0x0219, 0x021A, 0x021B, 0x021C, 0x021D, 0x021E, 0x021F, 0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0226, 0x0227, 0x0228, 0x0229, 0x022A, 0x022B, 0x022C, 0x022D, 0x022E, 0x022F, 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237, 0x0238, 0x0239, 0x023A, 0x023B, 0x023C, 0x023D, 0x023E, 0x023F, 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, 0x0248, 0x0249, 0x024A, 0x024B, 0x024C, 0x024D, 0x024E, 0x024F, 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, 0x0258, 0x0259, 0x025A, 0x025B, 0x025C, 0x025D, 0x025E, 0x025F, 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, 0x0268, 0x0269, 0x026A, 0x026B, 0x026C, 0x026D, 0x026E, 0x026F, 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, 0x0278, 0x0279, 0x027A, 0x027B, 0x027C, 0x027D, 0x027E, 0x027F, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, 0x0288, 0x0289, 0x028A, 0x028B, 0x028C, 0x028D, 0x028E, 0x028F, 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, 0x0298, 0x0299, 0x029A, 0x029B, 0x029C, 0x029D, 0x029E, 0x029F, 0x02A0, 0x02A1, 0x02A2, 0x02A3, 0x02A4, 0x02A5, 0x02A6, 0x02A7, 0x02A8, 0x02A9, 0x02AA, 0x02AB, 0x02AC, 0x02AD, 0x02AE, 0x02AF, 0x02B0, 0x02B1, 0x02B2, 0x02B3, 0x02B4, 0x02B5, 0x02B6, 0x02B7, 0x02B8, 0x02B9, 0x02BA, 0x02BB, 0x02BC, 0x02BD, 0x02BE, 0x02BF, 0x02C0, 0x02C1, 0x02C2, 0x02C3, 0x02C4, 0x02C5, 0x02C6, 0x02C7, 0x02C8, 0x02C9, 0x02CA, 0x02CB, 0x02CC, 0x02CD, 0x02CE, 0x02CF, 0x02D0, 0x02D1, 0x02D2, 0x02D3, 0x02D4, 0x02D5, 0x02D6, 0x02D7, 0x02D8, 0x02D9, 0x02DA, 0x02DB, 0x02DC, 0x02DD, 0x02DE, 0x02DF, 0x02E0, 0x02E1, 0x02E2, 0x02E3, 0x02E4, 0x02E5, 0x02E6, 0x02E7, 0x02E8, 0x02E9, 0x02EA, 0x02EB, 0x02EC, 0x02ED, 0x02EE, 0x02EF, 0x02F0, 0x02F1, 0x02F2, 0x02F3, 0x02F4, 0x02F5, 0x02F6, 0x02F7, 0x02F8, 0x02F9, 0x02FA, 0x02FB, 0x02FC, 0x02FD, 0x02FE, 0x02FF, 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, 0x034F, 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 0x0358, 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, 0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x037F, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387, 0x0388, 0x0389, 0x038A, 0x038B, 0x038C, 0x038D, 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A2, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x03CF, 0x03D0, 0x03D1, 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, 0x03D8, 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD, 0x03DE, 0x03DF, 0x03E0, 0x03E1, 0x03E2, 0x03E3, 0x03E4, 0x03E5, 0x03E6, 0x03E7, 0x03E8, 0x03E9, 0x03EA, 0x03EB, 0x03EC, 0x03ED, 0x03EE, 0x03EF, 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF @@ -153,6 +154,8 @@ const ushort HeapInfo::ValidPointersMap::validPo 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0002, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0004, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0007, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0008, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0009, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0010, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0011, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0012, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0013, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0014, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF } }; +#endif // USE_VPM_TABLE + const BVUnit HeapInfo::ValidPointersMap::invalidBitsData[HeapConstants::BucketCount][SmallHeapBlockT::SmallHeapBlockBitVector::wordCount] = { { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 @@ -309,7 +312,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x01FF, 0x0100 }, { 0x02FF, 0x0100 }, { 0x03FF, 0x0100 } - }, // Bucket: 1, Size: 32 { @@ -317,7 +319,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x00FF, 0x0080 }, { 0x017F, 0x0080 }, { 0x01FF, 0x0080 } - }, // Bucket: 2, Size: 48 { @@ -325,7 +326,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x00AA, 0x0055 }, { 0x00FF, 0x0055 }, { 0x0154, 0x0055 } - }, // Bucket: 3, Size: 64 { @@ -333,7 +333,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x007F, 0x0040 }, { 0x00BF, 0x0040 }, { 0x00FF, 0x0040 } - }, // Bucket: 4, Size: 80 { @@ -341,7 +340,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0066, 0x0033 }, { 0x0099, 0x0033 }, { 0x00CB, 0x0032 } - }, // Bucket: 5, Size: 96 { @@ -349,7 +347,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0055, 0x002B }, { 0x007F, 0x002A }, { 0x00A9, 0x002A } - }, // Bucket: 6, Size: 112 { @@ -357,7 +354,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0049, 0x0025 }, { 0x006D, 0x0024 }, { 0x0091, 0x0024 } - }, // Bucket: 7, Size: 128 { @@ -365,7 +361,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x003F, 0x0020 }, { 0x005F, 0x0020 }, { 0x007F, 0x0020 } - }, // Bucket: 8, Size: 144 { @@ -373,7 +368,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0038, 0x001C }, { 0x0055, 0x001D }, { 0x0070, 0x001B } - }, // Bucket: 9, Size: 160 { @@ -381,7 +375,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0033, 0x001A }, { 0x004C, 0x0019 }, { 0x0065, 0x0019 } - }, // Bucket: 10, Size: 176 { @@ -389,7 +382,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x002E, 0x0017 }, { 0x0045, 0x0017 }, { 0x005C, 0x0017 } - }, // Bucket: 11, Size: 192 { @@ -397,7 +389,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x002A, 0x0015 }, { 0x003F, 0x0015 }, { 0x0054, 0x0015 } - }, // Bucket: 12, Size: 208 { @@ -405,7 +396,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0027, 0x0014 }, { 0x003B, 0x0014 }, { 0x004D, 0x0012 } - }, // Bucket: 13, Size: 224 { @@ -413,7 +403,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0024, 0x0012 }, { 0x0036, 0x0012 }, { 0x0048, 0x0012 } - }, // Bucket: 14, Size: 240 { @@ -421,7 +410,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0022, 0x0011 }, { 0x0033, 0x0011 }, { 0x0043, 0x0010 } - }, // Bucket: 15, Size: 256 { @@ -429,7 +417,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x001F, 0x0010 }, { 0x002F, 0x0010 }, { 0x003F, 0x0010 } - }, // Bucket: 16, Size: 272 { @@ -437,7 +424,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x001E, 0x000F }, { 0x002D, 0x000F }, { 0x003B, 0x000E } - }, // Bucket: 17, Size: 288 { @@ -445,7 +431,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x001C, 0x000E }, { 0x002A, 0x000E }, { 0x0037, 0x000D } - }, // Bucket: 18, Size: 304 { @@ -453,7 +438,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x001A, 0x000D }, { 0x0028, 0x000E }, { 0x0034, 0x000C } - }, // Bucket: 19, Size: 320 { @@ -461,7 +445,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0019, 0x000D }, { 0x0026, 0x000D }, { 0x0032, 0x000C } - }, // Bucket: 20, Size: 336 { @@ -469,7 +452,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0018, 0x000C }, { 0x0024, 0x000C }, { 0x002F, 0x000B } - }, // Bucket: 21, Size: 352 { @@ -477,7 +459,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0017, 0x000C }, { 0x0022, 0x000B }, { 0x002D, 0x000B } - }, // Bucket: 22, Size: 368 { @@ -485,7 +466,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0016, 0x000B }, { 0x0021, 0x000B }, { 0x002B, 0x000A } - }, // Bucket: 23, Size: 384 { @@ -493,7 +473,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0015, 0x000B }, { 0x001F, 0x000A }, { 0x0029, 0x000A } - }, // Bucket: 24, Size: 400 { @@ -501,7 +480,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0014, 0x000A }, { 0x001E, 0x000A }, { 0x0027, 0x0009 } - }, // Bucket: 25, Size: 416 { @@ -509,7 +487,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0013, 0x000A }, { 0x001D, 0x000A }, { 0x0026, 0x0009 } - }, // Bucket: 26, Size: 432 { @@ -517,7 +494,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0012, 0x0009 }, { 0x001C, 0x000A }, { 0x0024, 0x0008 } - }, // Bucket: 27, Size: 448 { @@ -525,7 +501,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0012, 0x0009 }, { 0x001B, 0x0009 }, { 0x0023, 0x0008 } - }, // Bucket: 28, Size: 464 { @@ -533,7 +508,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0011, 0x0009 }, { 0x001A, 0x0009 }, { 0x0022, 0x0008 } - }, // Bucket: 29, Size: 480 { @@ -541,7 +515,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0011, 0x0009 }, { 0x0019, 0x0008 }, { 0x0021, 0x0008 } - }, // Bucket: 30, Size: 496 { @@ -549,7 +522,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x0010, 0x0008 }, { 0x0018, 0x0008 }, { 0x0020, 0x0008 } - }, // Bucket: 31, Size: 512 { @@ -557,7 +529,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000F, 0x0008 }, { 0x0017, 0x0008 }, { 0x001F, 0x0008 } - }, // Bucket: 32, Size: 528 { @@ -565,7 +536,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000F, 0x0008 }, { 0x0017, 0x0008 }, { 0x001E, 0x0007 } - }, // Bucket: 33, Size: 544 { @@ -573,7 +543,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000F, 0x0008 }, { 0x0016, 0x0007 }, { 0x001D, 0x0007 } - }, // Bucket: 34, Size: 560 { @@ -581,7 +550,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000E, 0x0007 }, { 0x0015, 0x0007 }, { 0x001C, 0x0007 } - }, // Bucket: 35, Size: 576 { @@ -589,7 +557,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000E, 0x0007 }, { 0x0015, 0x0007 }, { 0x001B, 0x0006 } - }, // Bucket: 36, Size: 592 { @@ -597,7 +564,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000D, 0x0007 }, { 0x0014, 0x0007 }, { 0x001A, 0x0006 } - }, // Bucket: 37, Size: 608 { @@ -605,7 +571,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000D, 0x0007 }, { 0x0014, 0x0007 }, { 0x0019, 0x0005 } - }, // Bucket: 38, Size: 624 { @@ -613,7 +578,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000D, 0x0007 }, { 0x0013, 0x0006 }, { 0x0019, 0x0006 } - }, // Bucket: 39, Size: 640 { @@ -621,7 +585,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000C, 0x0006 }, { 0x0013, 0x0007 }, { 0x0018, 0x0005 } - }, // Bucket: 40, Size: 656 { @@ -629,7 +592,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000C, 0x0006 }, { 0x0012, 0x0006 }, { 0x0017, 0x0005 } - }, // Bucket: 41, Size: 672 { @@ -637,7 +599,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000C, 0x0006 }, { 0x0012, 0x0006 }, { 0x0017, 0x0005 } - }, // Bucket: 42, Size: 688 { @@ -645,7 +606,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000B, 0x0006 }, { 0x0011, 0x0006 }, { 0x0016, 0x0005 } - }, // Bucket: 43, Size: 704 { @@ -653,7 +613,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000B, 0x0006 }, { 0x0011, 0x0006 }, { 0x0016, 0x0005 } - }, // Bucket: 44, Size: 720 { @@ -661,7 +620,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000B, 0x0006 }, { 0x0011, 0x0006 }, { 0x0015, 0x0004 } - }, // Bucket: 45, Size: 736 { @@ -669,7 +627,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000B, 0x0006 }, { 0x0010, 0x0005 }, { 0x0015, 0x0005 } - }, // Bucket: 46, Size: 752 { @@ -677,7 +634,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000A, 0x0005 }, { 0x0010, 0x0006 }, { 0x0014, 0x0004 } - }, // Bucket: 47, Size: 768 { @@ -685,10 +641,10 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Vali { 0x000A, 0x0005 }, { 0x000F, 0x0005 }, { 0x0014, 0x0005 } - - } + } }; -const ushort HeapInfo::ValidPointersMap::validPointersBuffer[MediumAllocationBlockAttributes::BucketCount][HeapInfo::ValidPointersMap::rowSize] = +#if USE_VPM_TABLE +const ushort HeapInfo::ValidPointersMap::validPointersBuffer[MediumAllocationBlockAttributes::BucketCount][HeapInfo::ValidPointersMap::rowSize] = { { 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0002, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0004, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0007, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0008, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0009, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0010, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0011, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0012, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0013, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0014, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0015, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0016, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0017, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0018, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0019, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000A, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000B, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000D, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000E, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001A, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001D, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F @@ -778,6 +734,8 @@ const ushort HeapInfo::ValidPointersMap::validP 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0002, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003 } }; +#endif // USE_VPM_TABLE + const BVUnit HeapInfo::ValidPointersMap::invalidBitsData[MediumAllocationBlockAttributes::BucketCount][SmallHeapBlockT::SmallHeapBlockBitVector::wordCount] = { { 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFE @@ -881,7 +839,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0017, 0x0004 }, { 0x001B, 0x0004 }, { 0x001F, 0x0004 } - }, // Bucket: 1, Size: 1280 { @@ -893,7 +850,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0013, 0x0004 }, { 0x0016, 0x0003 }, { 0x0018, 0x0002 } - }, // Bucket: 2, Size: 1536 { @@ -905,7 +861,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x000F, 0x0002 }, { 0x0012, 0x0003 }, { 0x0014, 0x0002 } - }, // Bucket: 3, Size: 1792 { @@ -917,7 +872,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x000D, 0x0002 }, { 0x000F, 0x0002 }, { 0x0011, 0x0002 } - }, // Bucket: 4, Size: 2048 { @@ -929,7 +883,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x000B, 0x0002 }, { 0x000D, 0x0002 }, { 0x000F, 0x0002 } - }, // Bucket: 5, Size: 2304 { @@ -941,7 +894,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x000A, 0x0002 }, { 0x000C, 0x0002 }, { 0x000D, 0x0001 } - }, // Bucket: 6, Size: 2560 { @@ -953,7 +905,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0009, 0x0002 }, { 0x000B, 0x0002 }, { 0x0000, 0x0000 } - }, // Bucket: 7, Size: 2816 { @@ -965,7 +916,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0008, 0x0001 }, { 0x000A, 0x0002 }, { 0x0000, 0x0000 } - }, // Bucket: 8, Size: 3072 { @@ -977,7 +927,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0007, 0x0001 }, { 0x0009, 0x0002 }, { 0x0000, 0x0000 } - }, // Bucket: 9, Size: 3328 { @@ -989,7 +938,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0007, 0x0001 }, { 0x0008, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 10, Size: 3584 { @@ -1001,7 +949,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0006, 0x0001 }, { 0x0007, 0x0001 }, { 0x0008, 0x0001 } - }, // Bucket: 11, Size: 3840 { @@ -1013,7 +960,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0006, 0x0001 }, { 0x0007, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 12, Size: 4096 { @@ -1025,7 +971,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0005, 0x0001 }, { 0x0006, 0x0001 }, { 0x0007, 0x0001 } - }, // Bucket: 13, Size: 4352 { @@ -1037,7 +982,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0005, 0x0001 }, { 0x0006, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 14, Size: 4608 { @@ -1049,7 +993,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0005, 0x0001 }, { 0x0006, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 15, Size: 4864 { @@ -1061,7 +1004,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0005, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 16, Size: 5120 { @@ -1073,7 +1015,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0004, 0x0001 }, { 0x0005, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 17, Size: 5376 { @@ -1085,7 +1026,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0004, 0x0001 }, { 0x0005, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 18, Size: 5632 { @@ -1097,7 +1037,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0004, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 19, Size: 5888 { @@ -1109,7 +1048,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0004, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 20, Size: 6144 { @@ -1121,7 +1059,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0000, 0x0000 }, { 0x0004, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 21, Size: 6400 { @@ -1133,7 +1070,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0000, 0x0000 }, { 0x0004, 0x0001 }, { 0x0000, 0x0000 } - }, // Bucket: 22, Size: 6656 { @@ -1145,7 +1081,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0000, 0x0000 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 23, Size: 6912 { @@ -1157,7 +1092,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 24, Size: 7168 { @@ -1169,7 +1103,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 25, Size: 7424 { @@ -1181,7 +1114,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 26, Size: 7680 { @@ -1193,7 +1125,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 27, Size: 7936 { @@ -1205,7 +1136,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0003, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 } - }, // Bucket: 28, Size: 8192 { @@ -1217,7 +1147,6 @@ const SmallHeapBlockT::BlockInfo HeapInfo::Val { 0x0000, 0x0000 }, { 0x0003, 0x0001 }, { 0x0000, 0x0000 } - - } + } }; #endif // USE_STATIC_VPM diff --git a/deps/chakrashim/core/lib/Common/Memory/VirtualAllocWrapper.cpp b/deps/chakrashim/core/lib/Common/Memory/VirtualAllocWrapper.cpp index ba0b049b090..351f3118f80 100644 --- a/deps/chakrashim/core/lib/Common/Memory/VirtualAllocWrapper.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/VirtualAllocWrapper.cpp @@ -93,7 +93,7 @@ BOOL VirtualAllocWrapper::Free(LPVOID lpAddress, size_t dwSize, DWORD dwFreeType /* * class PreReservedVirtualAllocWrapper */ -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD uint PreReservedVirtualAllocWrapper::numPreReservedSegment = 0; #endif @@ -116,7 +116,7 @@ PreReservedVirtualAllocWrapper::~PreReservedVirtualAllocWrapper() // OOP JIT TODO: check if we need to cleanup the context related to this content process } -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD Assert(numPreReservedSegment > 0); InterlockedDecrement(&PreReservedVirtualAllocWrapper::numPreReservedSegment); #endif @@ -226,7 +226,7 @@ LPVOID PreReservedVirtualAllocWrapper::EnsurePreReservedRegionInternal() #if defined(_CONTROL_FLOW_GUARD) bool supportPreReservedRegion = true; -#if !_M_X64_OR_ARM64 +#if !TARGET_64 #if _M_IX86 // We want to restrict the number of prereserved segment for 32-bit process so that we don't use up the address space @@ -250,7 +250,7 @@ LPVOID PreReservedVirtualAllocWrapper::EnsurePreReservedRegionInternal() PreReservedHeapTrace(_u("Reserving PreReservedSegment For the first time(CFG Enabled). Address: 0x%p\n"), preReservedStartAddress); preReservedStartAddress = startAddress; -#if !_M_X64_OR_ARM64 +#if !TARGET_64 if (startAddress) { InterlockedIncrement(&PreReservedVirtualAllocWrapper::numPreReservedSegment); diff --git a/deps/chakrashim/core/lib/Common/Memory/VirtualAllocWrapper.h b/deps/chakrashim/core/lib/Common/Memory/VirtualAllocWrapper.h index 54071c6d3d5..f1899257f0f 100644 --- a/deps/chakrashim/core/lib/Common/Memory/VirtualAllocWrapper.h +++ b/deps/chakrashim/core/lib/Common/Memory/VirtualAllocWrapper.h @@ -42,13 +42,13 @@ class VirtualAllocWrapper class PreReservedVirtualAllocWrapper { public: -#if _M_IX86_OR_ARM32 +#if TARGET_32 static const uint PreReservedAllocationSegmentCount = 256; // (256 * 64K) == 16 MB, if 64k is the AllocationGranularity -#else // _M_X64_OR_ARM64 +#else // TARGET_64 static const uint PreReservedAllocationSegmentCount = 4096; //(4096 * 64K) == 256MB, if 64k is the AllocationGranularity #endif -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD static const unsigned MaxPreReserveSegment = 6; #endif public: @@ -65,7 +65,7 @@ class PreReservedVirtualAllocWrapper LPVOID GetPreReservedEndAddress(); static LPVOID GetPreReservedEndAddress(void * regionStart); -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD static int NumPreReservedSegment() { return numPreReservedSegment; } #endif @@ -83,7 +83,7 @@ class PreReservedVirtualAllocWrapper BVStatic freeSegments; LPVOID preReservedStartAddress; CriticalSection cs; -#if !_M_X64_OR_ARM64 && _CONTROL_FLOW_GUARD +#if !TARGET_64 && _CONTROL_FLOW_GUARD static uint numPreReservedSegment; #endif }; diff --git a/deps/chakrashim/core/lib/Common/Memory/XDataAllocator.h b/deps/chakrashim/core/lib/Common/Memory/XDataAllocator.h index fcdebc52a2f..2e6a69423b4 100644 --- a/deps/chakrashim/core/lib/Common/Memory/XDataAllocator.h +++ b/deps/chakrashim/core/lib/Common/Memory/XDataAllocator.h @@ -11,3 +11,25 @@ #elif defined(_M_ARM64) #include "Memory/arm64/XDataAllocator.h" #endif + +struct FunctionTableNode +{ +#ifdef _WIN32 + SLIST_ENTRY itemEntry; + FunctionTableHandle functionTable; + +#endif +}; + +struct DelayDeletingFunctionTable +{ + static PSLIST_HEADER Head; + static DelayDeletingFunctionTable Instance; + + DelayDeletingFunctionTable(); + ~DelayDeletingFunctionTable(); + + static bool AddEntry(FunctionTableHandle ft); + static void Clear(); + static bool IsEmpty(); +}; \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Common/Memory/amd64/XDataAllocator.cpp b/deps/chakrashim/core/lib/Common/Memory/amd64/XDataAllocator.cpp index 490d39ef694..6e0114695a3 100644 --- a/deps/chakrashim/core/lib/Common/Memory/amd64/XDataAllocator.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/amd64/XDataAllocator.cpp @@ -162,12 +162,7 @@ void XDataAllocator::Register(XDataAllocation * xdataInfo, ULONG_PTR functionSta void XDataAllocator::Unregister(XDataAllocation * xdataInfo) { #ifdef _WIN32 - // Delete the table - if (AutoSystemInfo::Data.IsWin8OrLater()) - { - NtdllLibrary::Instance->DeleteGrowableFunctionTable(xdataInfo->functionTable); - } - else + if (!AutoSystemInfo::Data.IsWin8OrLater()) { BOOLEAN success = RtlDeleteFunctionTable(&xdataInfo->pdata); Assert(success); diff --git a/deps/chakrashim/core/lib/Common/Memory/amd64/XDataAllocator.h b/deps/chakrashim/core/lib/Common/Memory/amd64/XDataAllocator.h index 54f6a18be0a..c73d4ab0f13 100644 --- a/deps/chakrashim/core/lib/Common/Memory/amd64/XDataAllocator.h +++ b/deps/chakrashim/core/lib/Common/Memory/amd64/XDataAllocator.h @@ -18,6 +18,9 @@ namespace Memory struct XDataAllocation : public SecondaryAllocation { XDataAllocation() +#ifdef _WIN32 + :functionTable(nullptr) +#endif {} bool IsFreed() const diff --git a/deps/chakrashim/core/lib/Common/Memory/arm/XDataAllocator.cpp b/deps/chakrashim/core/lib/Common/Memory/arm/XDataAllocator.cpp index 5b0f5a40b6c..770ac3dabfc 100644 --- a/deps/chakrashim/core/lib/Common/Memory/arm/XDataAllocator.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/arm/XDataAllocator.cpp @@ -99,9 +99,7 @@ void XDataAllocator::Register(XDataAllocation * xdataInfo, DWORD functionStart, /* static */ void XDataAllocator::Unregister(XDataAllocation * xdataInfo) { -#ifdef _WIN32 - NtdllLibrary::Instance->DeleteGrowableFunctionTable(xdataInfo->functionTable); -#else // !_WIN32 +#ifndef _WIN32 Assert(ReadHead(xdataInfo->address)); // should be non-empty .eh_frame __DEREGISTER_FRAME(xdataInfo->address); #endif diff --git a/deps/chakrashim/core/lib/Common/Memory/arm64/XDataAllocator.cpp b/deps/chakrashim/core/lib/Common/Memory/arm64/XDataAllocator.cpp index 9237f6c1ff9..8debfb577e9 100644 --- a/deps/chakrashim/core/lib/Common/Memory/arm64/XDataAllocator.cpp +++ b/deps/chakrashim/core/lib/Common/Memory/arm64/XDataAllocator.cpp @@ -2,8 +2,11 @@ // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- -// This one works only for ARM64 #include "CommonMemoryPch.h" + +// ARM64 TODO: this is nearly identical to AMD64, consider merging in the future + +// This one works only for ARM64 #if !defined(_M_ARM64) CompileAssert(false) #endif @@ -11,49 +14,148 @@ CompileAssert(false) #include "XDataAllocator.h" #include "Core/DelayLoadLibrary.h" -XDataAllocator::XDataAllocator(BYTE* address, uint size) -{ - __debugbreak(); -} - +#ifndef _WIN32 +#include "PlatformAgnostic/AssemblyCommon.h" // __REGISTER_FRAME / __DEREGISTER_FRAME +#endif -void XDataAllocator::Delete() +XDataAllocator::XDataAllocator(BYTE* address, uint size) : + freeList(nullptr), + start(address), + current(address), + size(size) { - __debugbreak(); + Assert(size > 0); + Assert(address != nullptr); } bool XDataAllocator::Initialize(void* segmentStart, void* segmentEnd) { - __debugbreak(); + Assert(segmentEnd > segmentStart); return true; } -bool XDataAllocator::Alloc(ULONG_PTR functionStart, DWORD functionSize, ushort pdataCount, ushort xdataSize, SecondaryAllocation* allocation) +XDataAllocator::~XDataAllocator() { - __debugbreak(); - return false; + current = nullptr; + ClearFreeList(); } +void XDataAllocator::Delete() +{ + HeapDelete(this); +} + +bool XDataAllocator::Alloc(ULONG_PTR functionStart, DWORD functionSize, + ushort pdataCount, ushort xdataSize, SecondaryAllocation* allocation) +{ + XDataAllocation* xdata = static_cast(allocation); + Assert(start != nullptr); + Assert(current != nullptr); + Assert(current >= start); + Assert(xdataSize <= XDATA_SIZE); + Assert(pdataCount == 1); + + // Allocate a new xdata entry + if((End() - current) >= XDATA_SIZE) + { + xdata->address = current; + current += XDATA_SIZE; + } // try allocating from the free list + else if(freeList) + { + auto entry = freeList; + xdata->address = entry->address; + this->freeList = entry->next; + HeapDelete(entry); + } + else + { + xdata->address = nullptr; + OUTPUT_TRACE(Js::XDataAllocatorPhase, _u("No space for XDATA.\n")); + } + +#ifndef _WIN32 + if (xdata->address) + { + ClearHead(xdata->address); // mark empty .eh_frame + } +#endif + + return xdata->address != nullptr; +} void XDataAllocator::Release(const SecondaryAllocation& allocation) { - __debugbreak(); + const XDataAllocation& xdata = static_cast(allocation); + Assert(allocation.address); + // Add it to free list + auto freed = HeapNewNoThrowStruct(XDataAllocationEntry); + if(freed) + { + freed->address = xdata.address; + freed->next = this->freeList; + this->freeList = freed; + } } -/* static */ -void XDataAllocator::Register(XDataAllocation * xdataInfo, intptr_t functionStart, DWORD functionSize) +bool XDataAllocator::CanAllocate() { - __debugbreak(); + return ((End() - current) >= XDATA_SIZE) || this->freeList; +} + +void XDataAllocator::ClearFreeList() +{ + XDataAllocationEntry* next = this->freeList; + XDataAllocationEntry* entry; + while(next) + { + entry = next; + next = entry->next; + entry->address = nullptr; + HeapDelete(entry); + } + this->freeList = NULL; } /* static */ -void XDataAllocator::Unregister(XDataAllocation * xdataInfo) +void XDataAllocator::Register(XDataAllocation * xdataInfo, ULONG_PTR functionStart, DWORD functionSize) { - __debugbreak(); +#ifdef _WIN32 + ULONG_PTR baseAddress = functionStart; + xdataInfo->pdata.BeginAddress = (DWORD)(functionStart - baseAddress); + xdataInfo->pdata.UnwindData = (DWORD)((intptr_t)xdataInfo->address - baseAddress); + + DWORD status = NtdllLibrary::Instance->AddGrowableFunctionTable(&xdataInfo->functionTable, + &xdataInfo->pdata, + /*MaxEntryCount*/ 1, + /*Valid entry count*/ 1, + /*RangeBase*/ functionStart, + /*RangeEnd*/ functionStart + functionSize); + BOOLEAN success = NT_SUCCESS(status); + if (success) + { + Assert(xdataInfo->functionTable != nullptr); + } + Js::Throw::CheckAndThrowOutOfMemory(success); + +#if DBG + // Validate that the PDATA registration succeeded + ULONG64 imageBase = 0; + RUNTIME_FUNCTION *runtimeFunction = RtlLookupFunctionEntry((DWORD64)functionStart, &imageBase, nullptr); + Assert(runtimeFunction != NULL); +#endif + +#else // !_WIN32 + Assert(ReadHead(xdataInfo->address)); // should be non-empty .eh_frame + __REGISTER_FRAME(xdataInfo->address); +#endif } -bool XDataAllocator::CanAllocate() +/* static */ +void XDataAllocator::Unregister(XDataAllocation * xdataInfo) { - __debugbreak(); - return true; +#ifndef _WIN32 + Assert(ReadHead(xdataInfo->address)); // should be non-empty .eh_frame + __DEREGISTER_FRAME(xdataInfo->address); +#endif } diff --git a/deps/chakrashim/core/lib/Common/Memory/arm64/XDataAllocator.h b/deps/chakrashim/core/lib/Common/Memory/arm64/XDataAllocator.h index 1efbd71b35a..d82b6e6375d 100644 --- a/deps/chakrashim/core/lib/Common/Memory/arm64/XDataAllocator.h +++ b/deps/chakrashim/core/lib/Common/Memory/arm64/XDataAllocator.h @@ -5,61 +5,100 @@ #if !defined(_M_ARM64) CompileAssert(false) #endif +#pragma once -struct XDataAllocation sealed : public SecondaryAllocation +// ARM64 TODO: this is nearly identical to AMD64, consider merging in the future +namespace Memory { - // ---- Methods ----- // - XDataAllocation() : - pdataCount(0) - , functionTable(NULL) - , xdataSize(0) - {} +#ifdef _WIN32 +#define XDATA_SIZE (100) +#else +#define XDATA_SIZE (0x80) +#endif - RUNTIME_FUNCTION* GetPdataArray() const + struct XDataAllocation : public SecondaryAllocation { - return reinterpret_cast(address + xdataSize); - } + XDataAllocation() +#ifdef _WIN32 + :functionTable(nullptr) +#endif + {} - bool IsFreed() const - { - return address == nullptr; - } + bool IsFreed() const + { + return address == nullptr; + } + void Free() + { + address = nullptr; + } - void Free() +#ifdef _WIN32 + RUNTIME_FUNCTION pdata; + FunctionTableHandle functionTable; +#endif + }; + + // + // Allocates xdata and pdata entries for ARM64 architecture. + // + // xdata + // ------ + // ARM64 architecture requires the xdata to be within 32-bit address range of the jitted code itself + // Hence, for every page segment we have an instance of the xdata allocator that allocates + // xdata entries in some specified non-executable region at the end of the page segment. + // + // pdata + // ------- + // XDataAllocator also manages the pdata entries for a the page segment range. It allocates the table of pdata entries + // on the heap to do that. + // + class XDataAllocator sealed : public SecondaryAllocator { - address = nullptr; - pdataCount = 0; - functionTable = nullptr; - xdataSize = 0; - } + // -------- Private members ---------/ + private: + struct XDataAllocationEntry : XDataAllocation + { + XDataAllocationEntry* next; + }; + BYTE* start; + BYTE* current; + uint size; - // ---- Data members ---- // - ushort pdataCount; // ARM requires more than 1 pdata/function - FunctionTableHandle functionTable; // stores the handle to the growable function table - ushort xdataSize; -}; + XDataAllocationEntry* freeList; -// -// Allocates xdata and pdata entries for ARM architecture on the heap. They are freed when released. -// -// -class XDataAllocator sealed : public SecondaryAllocator -{ - // --------- Public functions ---------/ -public: - XDataAllocator(BYTE* address, uint size); + // --------- Public functions ---------/ + public: + XDataAllocator(BYTE* address, uint size); + virtual ~XDataAllocator(); - bool Initialize(void* segmentStart, void* segmentEnd); - void Delete(); - bool Alloc(ULONG_PTR functionStart, DWORD functionSize, ushort pdataCount, ushort xdataSize, SecondaryAllocation* allocation); - void Release(const SecondaryAllocation& address); - bool CanAllocate(); - static DWORD GetAllocSize(ushort pdataCount, ushort xdataSize) - { - __debugbreak(); - return 0; - } + bool Initialize(void* segmentStart, void* segmentEnd); + void Delete(); + bool Alloc(ULONG_PTR functionStart, DWORD functionSize, ushort pdataCount, ushort xdataSize, SecondaryAllocation* allocation); + void Release(const SecondaryAllocation& address); + bool CanAllocate(); + + static void Register(XDataAllocation * xdataInfo, ULONG_PTR functionStart, DWORD functionSize); + static void Unregister(XDataAllocation * xdataInfo); + + // -------- Private helpers ---------/ + private: + BYTE* End() { return start + size; } + +#ifndef _WIN32 + // Read .eh_frame data head (length record). 0 means empty. + static uint32 ReadHead(const void* p) + { + return *reinterpret_cast(p); + } + + // Clear .eh_frame data head (length record). Set to 0 to mark empty. + static void ClearHead(void* p) + { + *reinterpret_cast(p) = 0; + } +#endif - static void Register(XDataAllocation * xdataInfo, intptr_t functionStart, DWORD functionSize); - static void Unregister(XDataAllocation * xdataInfo); -}; + void ClearFreeList(); + }; +} diff --git a/deps/chakrashim/core/lib/Common/Memory/arm64/arm64_SAVE_REGISTERS.asm b/deps/chakrashim/core/lib/Common/Memory/arm64/arm64_SAVE_REGISTERS.asm index 0a07f76f7ca..783d079295b 100644 --- a/deps/chakrashim/core/lib/Common/Memory/arm64/arm64_SAVE_REGISTERS.asm +++ b/deps/chakrashim/core/lib/Common/Memory/arm64/arm64_SAVE_REGISTERS.asm @@ -5,12 +5,10 @@ ;void arm64_SAVE_REGISTERS(void*) ; -; This method pushes sp and x1-x12 onto an array of 13 ULONG_PTR at x0. +; This method pushes sp and x1-x16,x19-x28 onto an array of 27 ULONG_PTR at x0. ; By convention, sp is at offset 0 -; TODO: From talking to SaRavind, the commented out register copies below -; likely need to be uncommented out ; -; ULONG_PTR registers[13]; +; ULONG_PTR registers[27]; ; arm64_SAVE_REGISTERS(registers); ; OPT 2 ; disable listing @@ -29,23 +27,22 @@ ; Can't use sp with stp so mov to a volatile register ; and then store onto passed in array - mov x16, sp - str x16, [x0, #0x00] + mov x17, sp + str x17, [x0, #0x00] str x1, [x0, #0x08] stp x2, x3, [x0, #0x10] stp x4, x5, [x0, #0x20] stp x6, x7, [x0, #0x30] stp x8, x9, [x0, #0x40] stp x10, x11, [x0, #0x50] - str x12, [x0, #0x60] - ;stp x13, x14, [x0, #0x70] - ;stp x15, x17, [x0, #0x80] - ;stp x18, x19, [x0, #0x90] - ;stp x20, x21, [x0, #0xA0] - ;stp x22, x23, [x0, #0xB0] - ;stp x24, x25, [x0, #0xC0] - ;stp x26, x27, [x0, #0xD0] - ;str x28, [x0, #0xE0] + stp x12, x13, [x0, #0x60] + stp x14, x15, [x0, #0x70] + stp x16, x19, [x0, #0x80] + stp x20, x21, [x0, #0x90] + stp x22, x23, [x0, #0xA0] + stp x24, x25, [x0, #0xB0] + stp x26, x27, [x0, #0xC0] + str x28, [x0, #0xD0] br lr diff --git a/deps/chakrashim/core/lib/Common/PlatformAgnostic/DateTimeInternal.h b/deps/chakrashim/core/lib/Common/PlatformAgnostic/DateTimeInternal.h index cf8fc56a115..ae2bf1e6b98 100644 --- a/deps/chakrashim/core/lib/Common/PlatformAgnostic/DateTimeInternal.h +++ b/deps/chakrashim/core/lib/Common/PlatformAgnostic/DateTimeInternal.h @@ -42,10 +42,16 @@ namespace DateTime void Update(const double time); }; - struct DaylightTimeHelperPlatformData // DaylightHelper.cpp + class DaylightTimeHelperPlatformData // DaylightHelper.cpp { + public: TimeZoneInfo cache1, cache2; bool useFirstCache; + + DaylightTimeHelperPlatformData() : + useFirstCache(true) + { + } }; class UtilityPlatformData @@ -71,9 +77,16 @@ namespace DateTime bool fInit; bool fHiResAvailable; - HiresTimerPlatformData(): fInit(false), dBaseTime(0), - baseMsCount(0), fHiResAvailable(true), - dLastTime(0), dAdjustFactor(1), fReset(true) {} + HiresTimerPlatformData() : + fInit(false), + dBaseTime(0), + baseMsCount(0), + fHiResAvailable(true), + dLastTime(0), + dAdjustFactor(1), + fReset(true) + { + } void Reset() { fReset = true; } }; diff --git a/deps/chakrashim/core/lib/Common/PlatformAgnostic/SystemInfo.h b/deps/chakrashim/core/lib/Common/PlatformAgnostic/SystemInfo.h index a95ed4ed48b..01e3e5f5176 100644 --- a/deps/chakrashim/core/lib/Common/PlatformAgnostic/SystemInfo.h +++ b/deps/chakrashim/core/lib/Common/PlatformAgnostic/SystemInfo.h @@ -8,28 +8,7 @@ namespace PlatformAgnostic { class SystemInfo { - - class PlatformData - { - public: - size_t totalRam; - - PlatformData(); - }; - static PlatformData data; public: - - static bool GetTotalRam(size_t *totalRam) - { - if (SystemInfo::data.totalRam == 0) - { - return false; - } - - *totalRam = SystemInfo::data.totalRam; - return true; - } - static bool GetMaxVirtualMemory(size_t *totalAS); #define SET_BINARY_PATH_ERROR_MESSAGE(path, msg) \ @@ -38,7 +17,7 @@ namespace PlatformAgnostic path[str_len] = char(0) #ifdef _WIN32 - static void GetBinaryLocation(char *path, const unsigned size) + static bool GetBinaryLocation(char *path, const unsigned size) { // TODO: make AssertMsg available under PlatformAgnostic //AssertMsg(path != nullptr, "Path can not be nullptr"); @@ -48,14 +27,14 @@ namespace PlatformAgnostic if (!wpath) { SET_BINARY_PATH_ERROR_MESSAGE(path, "GetBinaryLocation: GetModuleFileName has failed. OutOfMemory!"); - return; + return false; } str_len = GetModuleFileNameW(NULL, wpath, size - 1); if (str_len <= 0) { SET_BINARY_PATH_ERROR_MESSAGE(path, "GetBinaryLocation: GetModuleFileName has failed."); free(wpath); - return; + return false; } str_len = WideCharToMultiByte(CP_UTF8, 0, wpath, str_len, path, size, NULL, NULL); @@ -64,7 +43,7 @@ namespace PlatformAgnostic if (str_len <= 0) { SET_BINARY_PATH_ERROR_MESSAGE(path, "GetBinaryLocation: GetModuleFileName (WideCharToMultiByte) has failed."); - return; + return false; } if ((unsigned)str_len > size - 1) @@ -72,9 +51,27 @@ namespace PlatformAgnostic str_len = (int)size - 1; } path[str_len] = char(0); + return true; + } + + // Overloaded GetBinaryLocation: receive the location of current binary in char16. + // size: the second parameter is the size of the path buffer in count of wide characters. + static bool GetBinaryLocation(char16 *path, const unsigned size) + { + // TODO: make AssertMsg available under PlatformAgnostic + //AssertMsg(path != nullptr, "Path can not be nullptr"); + //AssertMsg(size < INT_MAX, "Isn't it too big for a path buffer?"); + int str_len = GetModuleFileNameW(NULL, path, size); + if (str_len <= 0) + { + wcscpy_s(path, size, _u("GetBinaryLocation: GetModuleFileName has failed.")); + return false; + } + return true; } #else - static void GetBinaryLocation(char *path, const unsigned size); + static bool GetBinaryLocation(char *path, const unsigned size); + static bool GetBinaryLocation(char16 *path, const unsigned size); #endif }; } // namespace PlatformAgnostic diff --git a/deps/chakrashim/core/lib/Common/Warnings.h b/deps/chakrashim/core/lib/Common/Warnings.h index 8b61d4d86c3..2f164814a3b 100644 --- a/deps/chakrashim/core/lib/Common/Warnings.h +++ b/deps/chakrashim/core/lib/Common/Warnings.h @@ -38,6 +38,18 @@ #pragma warning(disable:28112) // A variable (processNativeCodeSize) which is accessed via an Interlocked function must always be accessed via an Interlocked function. See line 1024: It is not always safe to access a variable which is accessed via the Interlocked* family of functions in any other way. #pragma warning(disable:28159) // Consider using 'GetTickCount64' instead of 'GetTickCount'. Reason: GetTickCount overflows roughly every 49 days. Code that does not take that into account can loop indefinitely. GetTickCount64 operates on 64 bit values and does not have that problem +#pragma warning(disable:6235) // Logical OR with non-zero constant on the left: 1 || +#pragma warning(disable:6236) // Logical-OR with non-zero constant, e.g., || 1. We end up with a lot of these in release builds because certain macros (notably CONFIG_FLAG) expand to compile-time constants in release builds and not in debug builds. +#pragma warning(disable:6327) // False constant expr on left side of AND, so right side never evaluated for effects -- e.g., 0 && +#pragma warning(disable:6239) // NONZEROLOGICALAND: 1 && ? +#pragma warning(disable:6240) // LOGICALANDNONZERO: && 1 ? +#pragma warning(disable:25037) // True constant expr in AND, e.g., && 1. +#pragma warning(disable:25038) // False constant expr in AND, e.g., && 0. +#pragma warning(disable:25039) // True Constant Expr in OR. Seems to be a duplicate of 6236. +#pragma warning(disable:25040) // False Constant Expr in OR, e.g., || 0. +#pragma warning(disable:25041) // 'if' condition is always true +#pragma warning(disable:25042) // 'if' condition is always false + #ifndef NTBUILD // Would be nice to clean these up. #pragma warning(disable:6054) // String 'dumpName' might not be zero-terminated. diff --git a/deps/chakrashim/core/lib/Common/arm64.h b/deps/chakrashim/core/lib/Common/arm64.h index 9ad0253847e..892cdc91dff 100644 --- a/deps/chakrashim/core/lib/Common/arm64.h +++ b/deps/chakrashim/core/lib/Common/arm64.h @@ -10,7 +10,7 @@ #error Include arm64.h in builds of ARM64 targets only. #endif -extern "C" LPVOID arm64_GET_CURRENT_FRAME(void); +#define arm64_GET_CURRENT_FRAME() ((LPVOID)__getReg(29)) extern "C" VOID arm64_SAVE_REGISTERS(void*); /* diff --git a/deps/chakrashim/core/lib/JITClient/JITManager.cpp b/deps/chakrashim/core/lib/JITClient/JITManager.cpp index 517ff168d2e..e8062f63824 100644 --- a/deps/chakrashim/core/lib/JITClient/JITManager.cpp +++ b/deps/chakrashim/core/lib/JITClient/JITManager.cpp @@ -144,6 +144,15 @@ JITManager::CreateBinding( } else { + Assert(waitStatus == WAIT_FAILED); +#ifdef DBG + LPWSTR messageBuffer = nullptr; + DWORD errorNumber = GetLastError(); + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, errorNumber, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&messageBuffer, 0, NULL); + Output::Print(_u("Last error was 0x%x (%s)"), errorNumber, messageBuffer); + free(messageBuffer); +#endif // wait operation failed for an unknown reason. Assert(false); status = HRESULT_FROM_WIN32(waitStatus); @@ -240,6 +249,9 @@ JITManager::ConnectRpcServer(__in HANDLE jitProcessHandle, __in_opt void* server m_jitConnectionId = connectionUuid; + hr = ConnectProcess(); + HandleServerCallResult(hr, RemoteCallType::StateUpdate); + return hr; FailureCleanup: @@ -277,11 +289,45 @@ JITManager::Shutdown() } HRESULT -JITManager::InitializeThreadContext( - __in ThreadContextDataIDL * data, +JITManager::ConnectProcess() +{ + Assert(IsOOPJITEnabled()); + +#ifdef USE_RPC_HANDLE_MARSHALLING + HANDLE processHandle; + if (!DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &processHandle, 0, false, DUPLICATE_SAME_ACCESS)) + { + return false; + } +#endif + + HRESULT hr = E_FAIL; + RpcTryExcept + { + hr = ClientConnectProcess( + m_rpcBindingHandle, +#ifdef USE_RPC_HANDLE_MARSHALLING + processHandle, +#endif + (intptr_t)AutoSystemInfo::Data.GetChakraBaseAddr(), + (intptr_t)AutoSystemInfo::Data.GetCRTHandle()); + } + RpcExcept(RpcExceptionFilter(RpcExceptionCode())) + { + hr = HRESULT_FROM_WIN32(RpcExceptionCode()); + } + RpcEndExcept; + #ifdef USE_RPC_HANDLE_MARSHALLING - __in HANDLE processHandle, + CloseHandle(processHandle); #endif + + return hr; +} + +HRESULT +JITManager::InitializeThreadContext( + __in ThreadContextDataIDL * data, __out PPTHREADCONTEXT_HANDLE threadContextInfoAddress, __out intptr_t * prereservedRegionAddr, __out intptr_t * jitThunkAddr) @@ -294,9 +340,6 @@ JITManager::InitializeThreadContext( hr = ClientInitializeThreadContext( m_rpcBindingHandle, data, -#ifdef USE_RPC_HANDLE_MARSHALLING - processHandle, -#endif threadContextInfoAddress, prereservedRegionAddr, jitThunkAddr); @@ -633,3 +676,126 @@ JITManager::IsInterpreterThunkAddr( return hr; } #endif + +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS +HRESULT +JITManager::DeserializeRPCData( + _In_reads_(bufferSize) const byte* buffer, + _In_ uint bufferSize, + _Out_ CodeGenWorkItemIDL **workItemData +) +{ + RPC_STATUS status = RPC_S_OK; + handle_t marshalHandle = nullptr; + *workItemData = nullptr; + __try + { + RpcTryExcept + { + status = MesDecodeBufferHandleCreate((char*)buffer, bufferSize, &marshalHandle); + if (status != RPC_S_OK) + { + return HRESULT_FROM_WIN32(status); + } + + pCodeGenWorkItemIDL_Decode( + marshalHandle, + workItemData); + } + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) + { + status = RpcExceptionCode(); + } + RpcEndExcept; + } + __finally + { + MesHandleFree(marshalHandle); + } + return HRESULT_FROM_WIN32(status); +} + +HRESULT +JITManager::SerializeRPCData(_In_ CodeGenWorkItemIDL *workItemData, _Out_ size_t* bufferSize, _Outptr_result_buffer_(*bufferSize) const byte** outBuffer) +{ + handle_t marshalHandle = nullptr; + *bufferSize = 0; + *outBuffer = nullptr; + RPC_STATUS status = RPC_S_OK; + __try + { + RpcTryExcept + { + char* data = nullptr; + unsigned long encodedSize; + status = MesEncodeDynBufferHandleCreate( + &data, + &encodedSize, + &marshalHandle); + if (status != RPC_S_OK) + { + return HRESULT_FROM_WIN32(status); + } + + MIDL_ES_CODE encodeType = MES_ENCODE; +#if TARGET_64 + encodeType = MES_ENCODE_NDR64; + // We only support encode syntax NDR64, however MesEncodeDynBufferHandleCreate doesn't allow to specify it + status = MesBufferHandleReset( + marshalHandle, + MES_DYNAMIC_BUFFER_HANDLE, + encodeType, + &data, + 0, + &encodedSize + ); + if (status != RPC_S_OK) + { + return HRESULT_FROM_WIN32(status); + } +#endif + + // Calculate how big we need to create the buffer + size_t tmpBufSize = pCodeGenWorkItemIDL_AlignSize(marshalHandle, &workItemData); + size_t alignedBufSize = Math::Align(tmpBufSize, 16); + data = HeapNewNoThrowArray(char, alignedBufSize); + if (!data) + { + // Ran out of memory + return E_OUTOFMEMORY; + } + + // Reset the buffer handle to a fixed buffer + status = MesBufferHandleReset( + marshalHandle, + MES_FIXED_BUFFER_HANDLE, + encodeType, + &data, + (unsigned long)alignedBufSize, + &encodedSize + ); + if (status != RPC_S_OK) + { + return HRESULT_FROM_WIN32(status); + } + + pCodeGenWorkItemIDL_Encode( + marshalHandle, + &workItemData); + *bufferSize = alignedBufSize; + *outBuffer = (byte*)data; + } + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) + { + status = RpcExceptionCode(); + } + RpcEndExcept; + } + __finally + { + MesHandleFree(marshalHandle); + } + + return HRESULT_FROM_WIN32(status); +} +#endif diff --git a/deps/chakrashim/core/lib/JITClient/JITManager.h b/deps/chakrashim/core/lib/JITClient/JITManager.h index 129932e6323..9ab4eac396b 100644 --- a/deps/chakrashim/core/lib/JITClient/JITManager.h +++ b/deps/chakrashim/core/lib/JITClient/JITManager.h @@ -33,9 +33,6 @@ class JITManager HRESULT InitializeThreadContext( __in ThreadContextDataIDL * data, -#ifdef USE_RPC_HANDLE_MARSHALLING - __in HANDLE processHandle, -#endif __out PPTHREADCONTEXT_HANDLE threadContextInfoAddress, __out intptr_t * prereservedRegionAddr, __out intptr_t * jitThunkAddr); @@ -107,6 +104,20 @@ class JITManager __out boolean * result); #endif +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS + static HRESULT DeserializeRPCData( + _In_reads_(bufferSize) const byte* buffer, + _In_ uint bufferSize, + _Out_ CodeGenWorkItemIDL **workItemData + ); + + static HRESULT SerializeRPCData( + _In_ CodeGenWorkItemIDL *workItemData, + _Out_ size_t* bufferSize, + _Outptr_result_buffer_(*bufferSize) const byte** outBuffer + ); +#endif + HRESULT Shutdown(); @@ -122,6 +133,8 @@ class JITManager __in UUID* connectionUuid, __out RPC_BINDING_HANDLE* bindingHandle); + HRESULT ConnectProcess(); + RPC_BINDING_HANDLE m_rpcBindingHandle; UUID m_jitConnectionId; bool m_oopJitEnabled; @@ -148,9 +161,6 @@ class JITManager HRESULT InitializeThreadContext( __in ThreadContextDataIDL * data, -#ifdef USE_RPC_HANDLE_MARSHALLING - __in HANDLE processHandle, -#endif __out PPTHREADCONTEXT_HANDLE threadContextInfoAddress, __out intptr_t *prereservedRegionAddr, __out intptr_t * jitThunkAddr) @@ -232,6 +242,20 @@ class JITManager { Assert(false); return E_FAIL; } #endif +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS + static HRESULT DeserializeRPCData( + _In_reads_(bufferSize) const byte* buffer, + _In_ uint bufferSize, + _Out_ CodeGenWorkItemIDL **workItemData + ) { *workItemData = nullptr; return E_NOTIMPL; } + + static HRESULT SerializeRPCData( + _In_ CodeGenWorkItemIDL *workItemData, + _Out_ size_t* bufferSize, + _Outptr_result_buffer_(*bufferSize) const byte** outBuffer + ) { *bufferSize = 0; *outBuffer = nullptr; return E_NOTIMPL; } +#endif + HRESULT Shutdown() { Assert(false); return E_FAIL; } diff --git a/deps/chakrashim/core/lib/JITIDL/Chakra.JITIDL.vcxproj b/deps/chakrashim/core/lib/JITIDL/Chakra.JITIDL.vcxproj index e6785a6b8dd..ed2202935e4 100644 --- a/deps/chakrashim/core/lib/JITIDL/Chakra.JITIDL.vcxproj +++ b/deps/chakrashim/core/lib/JITIDL/Chakra.JITIDL.vcxproj @@ -32,6 +32,7 @@ $(IntDir) %(AdditionalOptions) /acf "$(MsBuildThisFileDirectory)ChakraJIT.acf" /prefix client "Client" server "Server" + ..\Common diff --git a/deps/chakrashim/core/lib/JITIDL/ChakraJIT.acf b/deps/chakrashim/core/lib/JITIDL/ChakraJIT.acf index 2326e62a04c..9154454aa2b 100644 --- a/deps/chakrashim/core/lib/JITIDL/ChakraJIT.acf +++ b/deps/chakrashim/core/lib/JITIDL/ChakraJIT.acf @@ -11,4 +11,5 @@ typedef [context_handle_noserialize] PSCRIPTCONTEXT_HANDLE; ] interface IChakraJIT { + typedef [encode, decode] pCodeGenWorkItemIDL; } diff --git a/deps/chakrashim/core/lib/JITIDL/ChakraJIT.idl b/deps/chakrashim/core/lib/JITIDL/ChakraJIT.idl index 0f014ba09e1..e3d5a8e01cc 100644 --- a/deps/chakrashim/core/lib/JITIDL/ChakraJIT.idl +++ b/deps/chakrashim/core/lib/JITIDL/ChakraJIT.idl @@ -23,18 +23,26 @@ cpp_quote("#endif //__JITTypes_h__") ] interface IChakraJIT { + typedef CodeGenWorkItemIDL* pCodeGenWorkItemIDL; HRESULT Shutdown([in] handle_t binding); - HRESULT InitializeThreadContext( + HRESULT ConnectProcess( [in] handle_t binding, - [in] ThreadContextDataIDL * threadData, #ifdef USE_RPC_HANDLE_MARSHALLING [in, system_handle(sh_process, PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_LIMITED_INFORMATION)] HANDLE processHandle, #endif + [in] CHAKRA_PTR chakraBaseAddress, + [in] CHAKRA_PTR crtBaseAddress + ); + + HRESULT InitializeThreadContext( + [in] handle_t binding, + [in] ThreadContextDataIDL * threadData, [out] PPTHREADCONTEXT_HANDLE threadContextInfoAddress, [out] CHAKRA_PTR * prereservedRegionAddr, [out] CHAKRA_PTR * jitThunkAddr); + HRESULT CleanupThreadContext( [in] handle_t binding, [in, out] PPTHREADCONTEXT_HANDLE threadContextInfoAddress); diff --git a/deps/chakrashim/core/lib/JITIDL/JITTypes.h b/deps/chakrashim/core/lib/JITIDL/JITTypes.h index 75af61bbc48..9261dbc9e3d 100644 --- a/deps/chakrashim/core/lib/JITIDL/JITTypes.h +++ b/deps/chakrashim/core/lib/JITIDL/JITTypes.h @@ -5,6 +5,8 @@ #pragma once +#include "CommonDefines.h" + #ifdef __midl import "wtypes.idl"; #include "sdkddkver.h" @@ -18,7 +20,7 @@ cpp_quote("#define USE_RPC_HANDLE_MARSHALLING 1") #define USE_RPC_HANDLE_MARSHALLING 1 #endif -#if defined(_M_IX86) || defined(_M_ARM) +#if defined(TARGET_32) #ifdef __midl #define CHAKRA_WB_PTR int #else @@ -26,7 +28,7 @@ cpp_quote("#define USE_RPC_HANDLE_MARSHALLING 1") #endif #define CHAKRA_PTR int #define BV_SHIFT 5 -#elif defined(_M_X64) || defined(_M_ARM64) +#elif defined(TARGET_64) #ifdef __midl #define CHAKRA_WB_PTR __int64 #else @@ -46,13 +48,13 @@ cpp_quote("#define USE_RPC_HANDLE_MARSHALLING 1") #define IDL_PAD2(num) IDL_Field(short) struct_pad_##num; #define IDL_PAD4(num) IDL_Field(int) struct_pad_##num; -#if defined(_M_X64) || defined(_M_ARM64) +#if defined(TARGET_64) #define X64_PAD4(num) IDL_Field(int) struct_pad_##num; #else #define X64_PAD4(num) #endif -#if defined(_M_IX86) || defined(_M_ARM) +#if defined(TARGET_32) #define X86_PAD4(num) IDL_Field(int) struct_pad_##num; #else #define X86_PAD4(num) @@ -76,7 +78,7 @@ typedef unsigned char boolean; #define __JITTypes_h__ // TODO: OOP JIT, how do we make this better? -const int VTABLE_COUNT = 48; +const int VTABLE_COUNT = 49; const int EQUIVALENT_TYPE_CACHE_SIZE = 8; typedef IDL_DEF([context_handle]) void * PTHREADCONTEXT_HANDLE; @@ -125,9 +127,9 @@ typedef struct EquivalentTypeSetIDL typedef struct FixedFieldIDL { + IDL_Field(unsigned short) valueType; IDL_Field(boolean) nextHasSameFixedField; IDL_Field(boolean) isClassCtor; - IDL_Field(unsigned short) valueType; IDL_Field(unsigned int) localFuncId; IDL_Field(TypeIDL) type; IDL_Field(CHAKRA_WB_PTR) fieldValue; @@ -312,8 +314,6 @@ typedef struct ThreadContextDataIDL IDL_PAD2(0) X64_PAD4(1) - CHAKRA_PTR chakraBaseAddress; - CHAKRA_PTR crtBaseAddress; CHAKRA_PTR threadStackLimitAddr; CHAKRA_PTR scriptStackLimit; CHAKRA_PTR bailOutRegisterSaveSpaceAddr; @@ -364,10 +364,13 @@ typedef struct ScriptContextDataIDL CHAKRA_PTR numberAllocatorAddr; CHAKRA_PTR recyclerAddr; CHAKRA_PTR builtinFunctionsBaseAddr; +#ifdef ENABLE_SCRIPT_DEBUGGING CHAKRA_PTR debuggingFlagsAddr; CHAKRA_PTR debugStepTypeAddr; CHAKRA_PTR debugFrameAddressAddr; CHAKRA_PTR debugScriptIdWhenSetAddr; + CHAKRA_PTR chakraLibAddr; +#endif } ScriptContextDataIDL; typedef struct SmallSpanSequenceIDL @@ -824,9 +827,9 @@ typedef struct JITOutputIDL unsigned int propertyGuardCount; unsigned int ctorCachesCount; -#if defined(_M_X64) +#if TARGET_64 CHAKRA_PTR xdataAddr; -#elif defined(_M_ARM) || defined(_M_ARM64) +#elif defined(_M_ARM) unsigned int xdataOffset; #else X86_PAD4(0) diff --git a/deps/chakrashim/core/lib/JITServer/JITServer.cpp b/deps/chakrashim/core/lib/JITServer/JITServer.cpp index b96a0def39a..e35ad610944 100644 --- a/deps/chakrashim/core/lib/JITServer/JITServer.cpp +++ b/deps/chakrashim/core/lib/JITServer/JITServer.cpp @@ -187,15 +187,54 @@ HRESULT CheckModuleAddress(HANDLE process, LPCVOID remoteImageBase, LPCVOID loca return S_OK; } +HRESULT +ServerConnectProcess( + handle_t binding, +#ifdef USE_RPC_HANDLE_MARSHALLING + HANDLE processHandle, +#endif + intptr_t chakraBaseAddress, + intptr_t crtBaseAddress +) +{ + DWORD clientPid; + HRESULT hr = HRESULT_FROM_WIN32(I_RpcBindingInqLocalClientPID(binding, &clientPid)); + if (FAILED(hr)) + { + return hr; + } +#ifdef USE_RPC_HANDLE_MARSHALLING + HANDLE targetHandle; + if (!DuplicateHandle(GetCurrentProcess(), processHandle, GetCurrentProcess(), &targetHandle, 0, false, DUPLICATE_SAME_ACCESS)) + { + return E_ACCESSDENIED; + } +#else + HANDLE targetHandle = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_LIMITED_INFORMATION, false, clientPid); + if (!targetHandle) + { + return E_ACCESSDENIED; + } +#endif + hr = CheckModuleAddress(targetHandle, (LPCVOID)chakraBaseAddress, (LPCVOID)AutoSystemInfo::Data.dllLoadAddress); + if (FAILED(hr)) + { + return hr; + } + hr = CheckModuleAddress(targetHandle, (LPCVOID)crtBaseAddress, (LPCVOID)AutoSystemInfo::Data.GetCRTHandle()); + if (FAILED(hr)) + { + return hr; + } + return ProcessContextManager::RegisterNewProcess(clientPid, targetHandle, chakraBaseAddress, crtBaseAddress); +} + #pragma warning(push) #pragma warning(disable:6387 28196) // PREFast does not understand the out context can be null here HRESULT ServerInitializeThreadContext( /* [in] */ handle_t binding, /* [in] */ __RPC__in ThreadContextDataIDL * threadContextData, -#ifdef USE_RPC_HANDLE_MARSHALLING - /* [in] */ __RPC__in HANDLE processHandle, -#endif /* [out] */ __RPC__deref_out_opt PPTHREADCONTEXT_HANDLE threadContextInfoAddress, /* [out] */ __RPC__out intptr_t *prereservedRegionAddr, /* [out] */ __RPC__out intptr_t *jitThunkAddr) @@ -218,28 +257,30 @@ ServerInitializeThreadContext( { return hr; } -#ifdef USE_RPC_HANDLE_MARSHALLING - HANDLE targetHandle; - if (!DuplicateHandle(GetCurrentProcess(), processHandle, GetCurrentProcess(), &targetHandle, 0, false, DUPLICATE_SAME_ACCESS)) + ProcessContext* processContext = ProcessContextManager::GetProcessContext(clientPid); + if (processContext == nullptr) { return E_ACCESSDENIED; } -#else - HANDLE targetHandle = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_LIMITED_INFORMATION, false, clientPid); - if (!targetHandle) - { - return E_ACCESSDENIED; - } -#endif try { AUTO_NESTED_HANDLED_EXCEPTION_TYPE(static_cast(ExceptionType_OutOfMemory)); - contextInfo = HeapNew(ServerThreadContext, threadContextData, targetHandle); + contextInfo = HeapNew(ServerThreadContext, threadContextData, processContext); ServerContextManager::RegisterThreadContext(contextInfo); } catch (Js::OutOfMemoryException) { - CloseHandle(targetHandle); + if (contextInfo) + { + // If we OOM while registering the ThreadContext, we need to free it + HeapDelete(contextInfo); + } + else + { + // If we OOM while creating the ThreadContext, then we haven't transfered ownership + // of the ProcessContext reference, so we must release it here + processContext->Release(); + } return E_OUTOFMEMORY; } @@ -249,16 +290,6 @@ ServerInitializeThreadContext( { return E_ACCESSDENIED; } - hr = CheckModuleAddress(targetHandle, (LPCVOID)contextInfo->GetRuntimeChakraBaseAddress(), (LPCVOID)AutoSystemInfo::Data.dllLoadAddress); - if (FAILED(hr)) - { - return hr; - } - hr = CheckModuleAddress(targetHandle, (LPCVOID)contextInfo->GetRuntimeCRTBaseAddress(), (LPCVOID)contextInfo->GetJITCRTBaseAddress()); - if (FAILED(hr)) - { - return hr; - } *threadContextInfoAddress = (PTHREADCONTEXT_HANDLE)EncodePointer(contextInfo); @@ -267,7 +298,7 @@ ServerInitializeThreadContext( { *prereservedRegionAddr = (intptr_t)contextInfo->GetPreReservedSectionAllocator()->EnsurePreReservedRegion(); } -#if _M_IX86 || _M_X64 +#if !defined(_M_ARM) *jitThunkAddr = (intptr_t)contextInfo->GetJITThunkEmitter()->EnsureInitialized(); #endif #endif @@ -582,7 +613,11 @@ ServerNewInterpreterThunkBlock( // Call to set VALID flag for CFG check if (CONFIG_FLAG(OOPCFGRegistration)) { - threadContext->SetValidCallTargetForCFG(runtimeAddress); + BYTE* callTarget = runtimeAddress; +#ifdef _M_ARM + callTarget = (BYTE*)((uintptr_t)callTarget | 0x1); // Thumb-tag buffer to get actual callable value +#endif + threadContext->SetValidCallTargetForCFG(callTarget); } thunkOutput->thunkCount = thunkCount; @@ -641,7 +676,7 @@ ServerFreeAllocation( return ServerCallWrapper(context, [&]()->HRESULT { - context->GetCodeGenAllocators()->emitBufferManager.FreeAllocation((void*)codeAddress); + context->GetCodeGenAllocators()->emitBufferManager.FreeAllocation((void*)codeAddress, nullptr); return S_OK; }); } @@ -726,6 +761,19 @@ ServerRemoteCodeGen( Assert(false); return RPC_S_INVALID_ARG; } +#if DBG + size_t serializedRpcDataSize = 0; + const unsigned char* serializedRpcData = nullptr; + JITManager::SerializeRPCData(workItemData, &serializedRpcDataSize, &serializedRpcData); + struct AutoFreeArray + { + const byte* arr = nullptr; + size_t bufferSize = 0; + ~AutoFreeArray() { HeapDeleteArray(bufferSize, arr); } + } autoFreeArray; + autoFreeArray.arr = serializedRpcData; + autoFreeArray.bufferSize = serializedRpcDataSize; +#endif return ServerCallWrapper(scriptContextInfo, [&]() ->HRESULT { @@ -834,6 +882,65 @@ JsUtil::BaseHashSet ServerContextManager::t JsUtil::BaseHashSet ServerContextManager::scriptContexts(&HeapAllocator::Instance); CriticalSection ServerContextManager::cs; +BaseDictionary ProcessContextManager::ProcessContexts(&HeapAllocator::Instance); +CriticalSection ProcessContextManager::cs; + +HRESULT +ProcessContextManager::RegisterNewProcess(DWORD pid, HANDLE processHandle, intptr_t chakraBaseAddress, intptr_t crtBaseAddress) +{ + AutoCriticalSection autoCS(&cs); + for (auto iter = ProcessContexts.GetIteratorWithRemovalSupport(); iter.IsValid(); iter.MoveNext()) + { + ProcessContext* context = iter.CurrentValue(); + // We can delete a ProcessContext if no ThreadContexts refer to it and the process is terminated + if (!context->HasRef() && WaitForSingleObject(context->processHandle, 0) == WAIT_OBJECT_0) + { + iter.RemoveCurrent(); + HeapDelete(context); + } + } + // We cannot register multiple ProcessContexts for a single process + if (ProcessContexts.ContainsKey(pid)) + { + return E_ACCESSDENIED; + } + + ProcessContext* context = nullptr; + try + { + AUTO_NESTED_HANDLED_EXCEPTION_TYPE(static_cast(ExceptionType_OutOfMemory)); + + context = HeapNew(ProcessContext, processHandle, chakraBaseAddress, crtBaseAddress); + ProcessContexts.Add(pid, context); + } + catch (Js::OutOfMemoryException) + { + if (context != nullptr) + { + // If we OOM while registering the ProcessContext, we should free it + HeapDelete(context); + } + return E_OUTOFMEMORY; + } + + return S_OK; +} + +ProcessContext* +ProcessContextManager::GetProcessContext(DWORD pid) +{ + AutoCriticalSection autoCS(&cs); + ProcessContext* context = nullptr; + // It is possible that we don't have a ProcessContext for a pid in case ProcessContext initialization failed, + // or if the calling process terminated and the ProcessContext was already cleaned up before we got here + if (ProcessContexts.ContainsKey(pid)) + { + context = ProcessContexts.Item(pid); + context->AddRef(); + } + return context; +} + #ifdef STACK_BACK_TRACE SList*, NoThrowHeapAllocator> ServerContextManager::ClosedThreadContextList(&NoThrowHeapAllocator::Instance); SList*, NoThrowHeapAllocator> ServerContextManager::ClosedScriptContextList(&NoThrowHeapAllocator::Instance); diff --git a/deps/chakrashim/core/lib/JITServer/JITServer.h b/deps/chakrashim/core/lib/JITServer/JITServer.h index b45557cb81c..2ca7fb2190e 100644 --- a/deps/chakrashim/core/lib/JITServer/JITServer.h +++ b/deps/chakrashim/core/lib/JITServer/JITServer.h @@ -3,10 +3,23 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- +class ProcessContextManager +{ +private: + + static BaseDictionary ProcessContexts; + static CriticalSection cs; + +public: + static HRESULT RegisterNewProcess(DWORD pid, HANDLE processHandle, intptr_t chakraBaseAddress, intptr_t crtBaseAddress); + static ProcessContext* GetProcessContext(DWORD pid); +}; + class ServerContextManager { public: static void RegisterThreadContext(ServerThreadContext* threadContext); + static void UnRegisterThreadContext(ServerThreadContext* threadContext); static void RegisterScriptContext(ServerScriptContext* scriptContext); @@ -20,8 +33,8 @@ class ServerContextManager static JsUtil::BaseHashSet scriptContexts; static CriticalSection cs; -#ifdef STACK_BACK_TRACE public: +#ifdef STACK_BACK_TRACE template struct ClosedContextEntry { diff --git a/deps/chakrashim/core/lib/Jsrt/Chakra.Jsrt.vcxproj b/deps/chakrashim/core/lib/Jsrt/Chakra.Jsrt.vcxproj index 852c37c8252..82511cf8237 100644 --- a/deps/chakrashim/core/lib/Jsrt/Chakra.Jsrt.vcxproj +++ b/deps/chakrashim/core/lib/Jsrt/Chakra.Jsrt.vcxproj @@ -61,6 +61,7 @@ + diff --git a/deps/chakrashim/core/lib/Jsrt/ChakraCommon.h b/deps/chakrashim/core/lib/Jsrt/ChakraCommon.h index 32771963454..c01049e236d 100644 --- a/deps/chakrashim/core/lib/Jsrt/ChakraCommon.h +++ b/deps/chakrashim/core/lib/Jsrt/ChakraCommon.h @@ -94,6 +94,8 @@ typedef unsigned short WCHAR; #if (defined(_MSC_VER) && _MSC_VER <= 1900) || (!defined(_MSC_VER) && __cplusplus <= 199711L) // !C++11 typedef unsigned short uint16_t; +#else +#include #endif /// diff --git a/deps/chakrashim/core/lib/Jsrt/ChakraCore.h b/deps/chakrashim/core/lib/Jsrt/ChakraCore.h index f0680558a83..651a5ecdc02 100644 --- a/deps/chakrashim/core/lib/Jsrt/ChakraCore.h +++ b/deps/chakrashim/core/lib/Jsrt/ChakraCore.h @@ -54,7 +54,8 @@ typedef enum JsModuleHostInfoKind JsModuleHostInfo_HostDefined = 0x02, JsModuleHostInfo_NotifyModuleReadyCallback = 0x3, JsModuleHostInfo_FetchImportedModuleCallback = 0x4, - JsModuleHostInfo_FetchImportedModuleFromScriptCallback = 0x5 + JsModuleHostInfo_FetchImportedModuleFromScriptCallback = 0x5, + JsModuleHostInfo_Url = 0x6 } JsModuleHostInfoKind; /// @@ -103,6 +104,53 @@ typedef JsErrorCode(CHAKRA_CALLBACK * FetchImportedModuleFromScriptCallBack)(_In /// typedef JsErrorCode(CHAKRA_CALLBACK * NotifyModuleReadyCallback)(_In_opt_ JsModuleRecord referencingModule, _In_opt_ JsValueRef exceptionVar); +/// +/// A structure containing information about a native function callback. +/// +typedef struct JsNativeFunctionInfo +{ + JsValueRef thisArg; + JsValueRef newTargetArg; + bool isConstructCall; +}JsNativeFunctionInfo; + +/// +/// A function callback. +/// +/// +/// A function object that represents the function being invoked. +/// +/// The arguments to the call. +/// The number of arguments. +/// Additional information about this function call. +/// +/// The state passed to JsCreateFunction. +/// +/// The result of the call, if any. +typedef _Ret_maybenull_ JsValueRef(CHAKRA_CALLBACK * JsEnhancedNativeFunction)(_In_ JsValueRef callee, _In_ JsValueRef *arguments, _In_ unsigned short argumentCount, _In_ JsNativeFunctionInfo *info, _In_opt_ void *callbackState); + +/// +/// Creates a new enhanced JavaScript function. +/// +/// +/// Requires an active script context. +/// +/// The method to call when the function is invoked. +/// If this is not JS_INVALID_REFERENCE, it is converted to a string and used as the name of the function. +/// +/// User provided state that will be passed back to the callback. +/// +/// The new function object. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API +JsCreateEnhancedFunction( + _In_ JsEnhancedNativeFunction nativeFunction, + _In_opt_ JsValueRef metadata, + _In_opt_ void *callbackState, + _Out_ JsValueRef *function); + /// /// Initialize a ModuleRecord from host /// @@ -745,5 +793,204 @@ CHAKRA_API _Out_opt_ unsigned int *byteOffset, _Out_opt_ unsigned int *byteLength); +/// +/// Determine if one JavaScript value is less than another JavaScript value. +/// +/// +/// +/// This function is equivalent to the < operator in Javascript. +/// +/// +/// Requires an active script context. +/// +/// +/// The first object to compare. +/// The second object to compare. +/// Whether object1 is less than object2. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsLessThan( + _In_ JsValueRef object1, + _In_ JsValueRef object2, + _Out_ bool *result); + +/// +/// Determine if one JavaScript value is less than or equal to another JavaScript value. +/// +/// +/// +/// This function is equivalent to the <= operator in Javascript. +/// +/// +/// Requires an active script context. +/// +/// +/// The first object to compare. +/// The second object to compare. +/// Whether object1 is less than or equal to object2. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsLessThanOrEqual( + _In_ JsValueRef object1, + _In_ JsValueRef object2, + _Out_ bool *result); + +/// +/// Creates a new object (with prototype) that stores some external data. +/// +/// +/// Requires an active script context. +/// +/// External data that the object will represent. May be null. +/// +/// A callback for when the object is finalized. May be null. +/// +/// Prototype object or nullptr. +/// The new object. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsCreateExternalObjectWithPrototype( + _In_opt_ void *data, + _In_opt_ JsFinalizeCallback finalizeCallback, + _In_ JsValueRef prototype, + _Out_ JsValueRef *object); + +/// +/// Gets an object's property. +/// +/// +/// Requires an active script context. +/// +/// The object that contains the property. +/// The key (JavascriptString or JavascriptSymbol) to the property. +/// The value of the property. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsObjectGetProperty( + _In_ JsValueRef object, + _In_ JsValueRef key, + _Out_ JsValueRef *value); + +/// +/// Puts an object's property. +/// +/// +/// Requires an active script context. +/// +/// The object that contains the property. +/// The key (JavascriptString or JavascriptSymbol) to the property. +/// The new value of the property. +/// The property set should follow strict mode rules. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsObjectSetProperty( + _In_ JsValueRef object, + _In_ JsValueRef key, + _In_ JsValueRef value, + _In_ bool useStrictRules); + +/// +/// Determines whether an object has a property. +/// +/// +/// Requires an active script context. +/// +/// The object that may contain the property. +/// The key (JavascriptString or JavascriptSymbol) to the property. +/// Whether the object (or a prototype) has the property. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsObjectHasProperty( + _In_ JsValueRef object, + _In_ JsValueRef key, + _Out_ bool *hasProperty); + +/// +/// Defines a new object's own property from a property descriptor. +/// +/// +/// Requires an active script context. +/// +/// The object that has the property. +/// The key (JavascriptString or JavascriptSymbol) to the property. +/// The property descriptor. +/// Whether the property was defined. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsObjectDefineProperty( + _In_ JsValueRef object, + _In_ JsValueRef key, + _In_ JsValueRef propertyDescriptor, + _Out_ bool *result); + +/// +/// Deletes an object's property. +/// +/// +/// Requires an active script context. +/// +/// The object that contains the property. +/// The key (JavascriptString or JavascriptSymbol) to the property. +/// The property set should follow strict mode rules. +/// Whether the property was deleted. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsObjectDeleteProperty( + _In_ JsValueRef object, + _In_ JsValueRef key, + _In_ bool useStrictRules, + _Out_ JsValueRef *result); + +/// +/// Gets a property descriptor for an object's own property. +/// +/// +/// Requires an active script context. +/// +/// The object that has the property. +/// The key (JavascriptString or JavascriptSymbol) to the property. +/// The property descriptor. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsObjectGetOwnPropertyDescriptor( + _In_ JsValueRef object, + _In_ JsValueRef key, + _Out_ JsValueRef *propertyDescriptor); + +/// +/// Determines whether an object has a non-inherited property. +/// +/// +/// Requires an active script context. +/// +/// The object that may contain the property. +/// The key (JavascriptString or JavascriptSymbol) to the property. +/// Whether the object has the non-inherited property. +/// +/// The code JsNoError if the operation succeeded, a failure code otherwise. +/// +CHAKRA_API + JsObjectHasOwnProperty( + _In_ JsValueRef object, + _In_ JsValueRef key, + _Out_ bool *hasOwnProperty); #endif // _CHAKRACOREBUILD #endif // _CHAKRACORE_H_ diff --git a/deps/chakrashim/core/lib/Jsrt/ChakraDebug.h b/deps/chakrashim/core/lib/Jsrt/ChakraDebug.h index b9d375f8550..82bd3493792 100644 --- a/deps/chakrashim/core/lib/Jsrt/ChakraDebug.h +++ b/deps/chakrashim/core/lib/Jsrt/ChakraDebug.h @@ -414,6 +414,7 @@ typedef unsigned __int32 uint32_t; /// NONE = 0x1, /// HAVE_CHILDRENS = 0x2, /// READ_ONLY_VALUE = 0x4, + /// IN_TDZ = 0x8, /// /// /// { diff --git a/deps/chakrashim/core/lib/Jsrt/Core/JsrtContextCore.cpp b/deps/chakrashim/core/lib/Jsrt/Core/JsrtContextCore.cpp index c604b86e3b2..5fb1a17006a 100644 --- a/deps/chakrashim/core/lib/Jsrt/Core/JsrtContextCore.cpp +++ b/deps/chakrashim/core/lib/Jsrt/Core/JsrtContextCore.cpp @@ -93,11 +93,13 @@ Js::ScriptContext* JsrtContextCore::EnsureScriptContext() void JsrtContextCore::OnScriptLoad(Js::JavascriptFunction * scriptFunction, Js::Utf8SourceInfo* utf8SourceInfo, CompileScriptException* compileException) { +#ifdef ENABLE_SCRIPT_DEBUGGING JsrtDebugManager* jsrtDebugManager = this->GetRuntime()->GetJsrtDebugManager(); if (jsrtDebugManager != nullptr) { jsrtDebugManager->ReportScriptCompile(scriptFunction, utf8SourceInfo, compileException); } +#endif } HRESULT ChakraCoreHostScriptContext::FetchImportedModule(Js::ModuleRecordBase* referencingModule, LPCOLESTR specifier, Js::ModuleRecordBase** dependentModuleRecord) diff --git a/deps/chakrashim/core/lib/Jsrt/Core/JsrtCore.cpp b/deps/chakrashim/core/lib/Jsrt/Core/JsrtCore.cpp index e8d57c10273..b6ab444ec58 100644 --- a/deps/chakrashim/core/lib/Jsrt/Core/JsrtCore.cpp +++ b/deps/chakrashim/core/lib/Jsrt/Core/JsrtCore.cpp @@ -77,7 +77,15 @@ JsParseModuleSource( SourceContextInfo* sourceContextInfo = scriptContext->GetSourceContextInfo(sourceContext, nullptr); if (sourceContextInfo == nullptr) { - sourceContextInfo = scriptContext->CreateSourceContextInfo(sourceContext, nullptr, 0, nullptr, nullptr, 0); + const char16 *moduleUrlSz = nullptr; + size_t moduleUrlLen = 0; + if (moduleRecord->GetModuleUrl()) + { + Js::JavascriptString *moduleUrl = Js::JavascriptString::FromVar(moduleRecord->GetModuleUrl()); + moduleUrlSz = moduleUrl->GetSz(); + moduleUrlLen = moduleUrl->GetLength(); + } + sourceContextInfo = scriptContext->CreateSourceContextInfo(sourceContext, moduleUrlSz, moduleUrlLen, nullptr, nullptr, 0); } SRCINFO si = { /* sourceContextInfo */ sourceContextInfo, @@ -164,6 +172,9 @@ JsSetModuleHostInfo( case JsModuleHostInfo_NotifyModuleReadyCallback: currentContext->GetHostScriptContext()->SetNotifyModuleReadyCallback(reinterpret_cast(hostInfo)); break; + case JsModuleHostInfo_Url: + moduleRecord->SetModuleUrl(hostInfo); + break; default: return JsInvalidModuleHostInfoKind; }; @@ -208,6 +219,9 @@ JsGetModuleHostInfo( case JsModuleHostInfo_NotifyModuleReadyCallback: *hostInfo = reinterpret_cast(currentContext->GetHostScriptContext()->GetNotifyModuleReadyCallback()); break; + case JsModuleHostInfo_Url: + *hostInfo = reinterpret_cast(moduleRecord->GetModuleUrl()); + break; default: return JsInvalidModuleHostInfoKind; }; diff --git a/deps/chakrashim/core/lib/Jsrt/Jsrt.cpp b/deps/chakrashim/core/lib/Jsrt/Jsrt.cpp index da92b472c7d..d42212147c8 100644 --- a/deps/chakrashim/core/lib/Jsrt/Jsrt.cpp +++ b/deps/chakrashim/core/lib/Jsrt/Jsrt.cpp @@ -173,6 +173,7 @@ JsErrorCode CreateContextCore(_In_ JsRuntimeHandle runtimeHandle, _In_ TTDRecord } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING JsrtDebugManager* jsrtDebugManager = runtime->GetJsrtDebugManager(); if(jsrtDebugManager != nullptr) @@ -189,6 +190,7 @@ JsErrorCode CreateContextCore(_In_ JsRuntimeHandle runtimeHandle, _In_ TTDRecord threadContext->GetDebugManager()->SetLocalsDisplayFlags(Js::DebugManager::LocalsDisplayFlags::LocalsDisplayFlags_NoGroupMethods); } +#endif #if ENABLE_TTD if(activelyRecording) @@ -206,7 +208,7 @@ void CALLBACK CreateExternalObject_TTDCallback(Js::ScriptContext* ctx, Js::Var* { TTDAssert(object != nullptr, "This should always be a valid location"); - *object = JsrtExternalObject::Create(nullptr, nullptr, ctx); + *object = JsrtExternalObject::Create(nullptr, nullptr, nullptr, ctx); } void CALLBACK TTDDummyPromiseContinuationCallback(JsValueRef task, void *callbackState) @@ -482,19 +484,21 @@ CHAKRA_API JsDisposeRuntime(_In_ JsRuntimeHandle runtimeHandle) recycler->ClearObjectBeforeCollectCallbacks(); } } - +#ifdef ENABLE_SCRIPT_DEBUGGING if (runtime->GetJsrtDebugManager() != nullptr) { runtime->GetJsrtDebugManager()->ClearDebuggerObjects(); } - +#endif Js::ScriptContext *scriptContext; for (scriptContext = threadContext->GetScriptContextList(); scriptContext; scriptContext = scriptContext->next) { +#ifdef ENABLE_SCRIPT_DEBUGGING if (runtime->GetJsrtDebugManager() != nullptr) { runtime->GetJsrtDebugManager()->ClearDebugDocument(scriptContext); } +#endif scriptContext->MarkForClose(); } @@ -502,7 +506,9 @@ CHAKRA_API JsDisposeRuntime(_In_ JsRuntimeHandle runtimeHandle) // We need to do this before recycler shutdown, because ScriptEngine->Close won't work then. runtime->CloseContexts(); +#ifdef ENABLE_SCRIPT_DEBUGGING runtime->DeleteJsrtDebugManager(); +#endif #if defined(CHECK_MEMORY_LEAK) || defined(LEAK_REPORT) bool doFinalGC = false; @@ -1279,7 +1285,7 @@ CHAKRA_API JsCreateExternalObject(_In_opt_ void *data, _In_opt_ JsFinalizeCallba PARAM_NOT_NULL(object); - *object = JsrtExternalObject::Create(data, finalizeCallback, scriptContext); + *object = JsrtExternalObject::Create(data, finalizeCallback, nullptr, scriptContext); PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, object); @@ -1287,6 +1293,38 @@ CHAKRA_API JsCreateExternalObject(_In_opt_ void *data, _In_opt_ JsFinalizeCallba }); } +#ifndef NTBUILD +CHAKRA_API JsCreateExternalObjectWithPrototype(_In_opt_ void *data, + _In_opt_ JsFinalizeCallback finalizeCallback, + _In_ JsValueRef prototype, + _Out_ JsValueRef *object) +{ + return ContextAPINoScriptWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTAllocateExternalObject); + + PARAM_NOT_NULL(object); + + Js::RecyclableObject * prototypeObject = nullptr; + if (prototype != nullptr) + { + VALIDATE_INCOMING_OBJECT(prototype, scriptContext); + prototypeObject = Js::RecyclableObject::FromVar(prototype); + } + + *object = JsrtExternalObject::Create(data, finalizeCallback, prototypeObject, scriptContext); + + PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, object); + + if (prototypeObject != nullptr) + { + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTSetPrototype, *object, prototypeObject); + } + + return JsNoError; + }); +} +#endif + CHAKRA_API JsConvertValueToObject(_In_ JsValueRef value, _Out_ JsValueRef *result) { return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { @@ -1383,102 +1421,258 @@ CHAKRA_API JsPreventExtension(_In_ JsValueRef object) }); } -CHAKRA_API JsGetProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _Out_ JsValueRef *value) +CHAKRA_API JsHasOwnPropertyCommon(Js::ScriptContext * scriptContext, _In_ JsValueRef object, + _In_ const Js::PropertyRecord * propertyRecord, _Out_ bool *hasOwnProperty, + TTDRecorder& _actionEntryPopper) { - return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetProperty, (Js::PropertyRecord *)propertyId, object); + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTHasOwnProperty, propertyRecord, object); + + *hasOwnProperty = Js::JavascriptOperators::OP_HasOwnProperty(object, + propertyRecord->GetPropertyId(), scriptContext) != 0; + + return JsNoError; +} + +CHAKRA_API JsHasOwnProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, + _Out_ bool *hasOwnProperty) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { VALIDATE_INCOMING_OBJECT(object, scriptContext); VALIDATE_INCOMING_PROPERTYID(propertyId); - PARAM_NOT_NULL(value); - *value = nullptr; + PARAM_NOT_NULL(hasOwnProperty); + *hasOwnProperty = false; - *value = Js::JavascriptOperators::OP_GetProperty((Js::Var)object, ((Js::PropertyRecord *)propertyId)->GetPropertyId(), scriptContext); - Assert(*value == nullptr || !Js::CrossSite::NeedMarshalVar(*value, scriptContext)); + return JsHasOwnPropertyCommon(scriptContext, object, + (const Js::PropertyRecord *)propertyId, hasOwnProperty, _actionEntryPopper); + }); +} - PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, value); +#ifdef _CHAKRACOREBUILD +static JsErrorCode InternalGetPropertyRecord(Js::ScriptContext * scriptContext, + Js::RecyclableObject * key, _Out_ const Js::PropertyRecord ** propertyRecord) +{ + Assert(propertyRecord != nullptr); + *propertyRecord = nullptr; + + switch(key->GetTypeId()) + { + case Js::TypeIds_String: + scriptContext->GetOrAddPropertyRecord(Js::JavascriptString::FromVar(key), + (Js::PropertyRecord const **)propertyRecord); + break; + case Js::TypeIds_Symbol: + *propertyRecord = Js::JavascriptSymbol::FromVar(key)->GetValue(); + break; + default: + return JsErrorInvalidArgument; + }; - return JsNoError; - }); + return JsNoError; } -CHAKRA_API JsGetOwnPropertyDescriptor(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _Out_ JsValueRef *propertyDescriptor) +CHAKRA_API JsObjectHasOwnProperty(_In_ JsValueRef object, _In_ JsValueRef propertyId, _Out_ bool *hasOwnProperty) { - return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetOwnPropertyInfo, (Js::PropertyRecord *)propertyId, object); + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { VALIDATE_INCOMING_OBJECT(object, scriptContext); - VALIDATE_INCOMING_PROPERTYID(propertyId); - PARAM_NOT_NULL(propertyDescriptor); - *propertyDescriptor = nullptr; + VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext); + PARAM_NOT_NULL(hasOwnProperty); + *hasOwnProperty = false; + + const Js::PropertyRecord *propertyRecord = nullptr; + JsErrorCode errorValue = InternalGetPropertyRecord(scriptContext, + Js::RecyclableObject::FromVar(propertyId), &propertyRecord); - Js::PropertyDescriptor propertyDescriptorValue; - if (Js::JavascriptOperators::GetOwnPropertyDescriptor(Js::RecyclableObject::FromVar(object), ((Js::PropertyRecord *)propertyId)->GetPropertyId(), scriptContext, &propertyDescriptorValue)) + if (errorValue != JsNoError) { - *propertyDescriptor = Js::JavascriptOperators::FromPropertyDescriptor(propertyDescriptorValue, scriptContext); + return errorValue; } - else + + return JsHasOwnPropertyCommon(scriptContext, object, propertyRecord, hasOwnProperty, _actionEntryPopper); + }); +} +#endif + +static JsErrorCode JsGetPropertyCommon(Js::ScriptContext * scriptContext, + _In_ Js::RecyclableObject * object, + _In_ const Js::PropertyRecord * propertyRecord, _Out_ JsValueRef *value, + TTDRecorder& _actionEntryPopper) +{ + AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!"); + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetProperty, propertyRecord, object); + + *value = Js::JavascriptOperators::GetPropertyNoCache(object, propertyRecord->GetPropertyId(), scriptContext); + Assert(*value == nullptr || !Js::CrossSite::NeedMarshalVar(*value, scriptContext)); + + PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, value); + + return JsNoError; +} + +CHAKRA_API JsGetProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _Out_ JsValueRef *value) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { + + VALIDATE_INCOMING_OBJECT(object, scriptContext); + VALIDATE_INCOMING_PROPERTYID(propertyId); + PARAM_NOT_NULL(value); + *value = nullptr; + + Js::RecyclableObject * instance = Js::RecyclableObject::FromVar(object); + return JsGetPropertyCommon(scriptContext, instance, (const Js::PropertyRecord *)propertyId, + value, _actionEntryPopper); + }); +} + +#ifdef _CHAKRACOREBUILD +CHAKRA_API JsObjectGetProperty(_In_ JsValueRef object, _In_ JsValueRef propertyId, _Out_ JsValueRef *value) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { + + VALIDATE_INCOMING_OBJECT(object, scriptContext); + VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext); + PARAM_NOT_NULL(value); + *value = nullptr; + + const Js::PropertyRecord *propertyRecord = nullptr; + JsErrorCode errorValue = InternalGetPropertyRecord(scriptContext, + Js::RecyclableObject::FromVar(propertyId), &propertyRecord); + + if (errorValue != JsNoError) { - *propertyDescriptor = scriptContext->GetLibrary()->GetUndefined(); + return errorValue; } - Assert(*propertyDescriptor == nullptr || !Js::CrossSite::NeedMarshalVar(*propertyDescriptor, scriptContext)); - PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, propertyDescriptor); + Assert(propertyRecord != nullptr); - return JsNoError; + Js::RecyclableObject * instance = Js::RecyclableObject::FromVar(object); + return JsGetPropertyCommon(scriptContext, instance, propertyRecord, value, _actionEntryPopper); }); } +#endif -CHAKRA_API JsGetOwnPropertyNames(_In_ JsValueRef object, _Out_ JsValueRef *propertyNames) +static JsErrorCode JsGetOwnPropertyDescriptorCommon(Js::ScriptContext * scriptContext, + _In_ JsValueRef object, _In_ const Js::PropertyRecord * propertyRecord, _Out_ JsValueRef *propertyDescriptor, + TTDRecorder& _actionEntryPopper) { - return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetOwnPropertyNamesInfo, object); + AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!"); + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetOwnPropertyInfo, propertyRecord, object); - VALIDATE_INCOMING_OBJECT(object, scriptContext); - PARAM_NOT_NULL(propertyNames); - *propertyNames = nullptr; + Js::PropertyDescriptor propertyDescriptorValue; + if (Js::JavascriptOperators::GetOwnPropertyDescriptor(Js::RecyclableObject::FromVar(object), + propertyRecord->GetPropertyId(), scriptContext, &propertyDescriptorValue)) + { + *propertyDescriptor = Js::JavascriptOperators::FromPropertyDescriptor(propertyDescriptorValue, scriptContext); + } + else + { + *propertyDescriptor = scriptContext->GetLibrary()->GetUndefined(); + } + Assert(*propertyDescriptor == nullptr || !Js::CrossSite::NeedMarshalVar(*propertyDescriptor, scriptContext)); - *propertyNames = Js::JavascriptOperators::GetOwnPropertyNames(object, scriptContext); - Assert(*propertyNames == nullptr || !Js::CrossSite::NeedMarshalVar(*propertyNames, scriptContext)); + PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, propertyDescriptor); - PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, propertyNames); + return JsNoError; +} - return JsNoError; +CHAKRA_API JsGetOwnPropertyDescriptor(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _Out_ JsValueRef *propertyDescriptor) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + VALIDATE_INCOMING_OBJECT(object, scriptContext); + VALIDATE_INCOMING_PROPERTYID(propertyId); + PARAM_NOT_NULL(propertyDescriptor); + *propertyDescriptor = nullptr; + + return JsGetOwnPropertyDescriptorCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId, + propertyDescriptor, _actionEntryPopper); }); } -CHAKRA_API JsGetOwnPropertySymbols(_In_ JsValueRef object, _Out_ JsValueRef *propertySymbols) +#ifdef _CHAKRACOREBUILD +CHAKRA_API JsObjectGetOwnPropertyDescriptor(_In_ JsValueRef object, _In_ JsValueRef propertyId, _Out_ JsValueRef *propertyDescriptor) { - return ContextAPIWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetOwnPropertySymbolsInfo, object); + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { VALIDATE_INCOMING_OBJECT(object, scriptContext); - PARAM_NOT_NULL(propertySymbols); + VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext); + PARAM_NOT_NULL(propertyDescriptor); + *propertyDescriptor = nullptr; - *propertySymbols = Js::JavascriptOperators::GetOwnPropertySymbols(object, scriptContext); - Assert(*propertySymbols == nullptr || !Js::CrossSite::NeedMarshalVar(*propertySymbols, scriptContext)); + const Js::PropertyRecord *propertyRecord = nullptr; + JsErrorCode errorValue = InternalGetPropertyRecord(scriptContext, + Js::RecyclableObject::FromVar(propertyId), &propertyRecord); - PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, propertySymbols); + if (errorValue != JsNoError) + { + return errorValue; + } - return JsNoError; + Assert(propertyRecord != nullptr); + + return JsGetOwnPropertyDescriptorCommon(scriptContext, object, propertyRecord, propertyDescriptor, _actionEntryPopper); }); } +#endif + +static JsErrorCode JsSetPropertyCommon(Js::ScriptContext * scriptContext, _In_ JsValueRef object, + _In_ const Js::PropertyRecord * propertyRecord, _In_ JsValueRef value, _In_ bool useStrictRules, + TTDRecorder& _actionEntryPopper) +{ + AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!"); + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTSetProperty, object, + propertyRecord, value, useStrictRules); + + Js::JavascriptOperators::OP_SetProperty(object, propertyRecord->GetPropertyId(), + value, scriptContext, nullptr, useStrictRules ? Js::PropertyOperation_StrictMode : Js::PropertyOperation_None); + + return JsNoError; +} CHAKRA_API JsSetProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _In_ JsValueRef value, _In_ bool useStrictRules) { - return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTSetProperty, object, (Js::PropertyRecord *)propertyId, value, useStrictRules); + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { VALIDATE_INCOMING_OBJECT(object, scriptContext); VALIDATE_INCOMING_PROPERTYID(propertyId); VALIDATE_INCOMING_REFERENCE(value, scriptContext); - Js::JavascriptOperators::OP_SetProperty(object, ((Js::PropertyRecord *)propertyId)->GetPropertyId(), value, scriptContext, - nullptr, useStrictRules ? Js::PropertyOperation_StrictMode : Js::PropertyOperation_None); + return JsSetPropertyCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId, + value, useStrictRules, _actionEntryPopper); + }); +} - return JsNoError; +#ifdef _CHAKRACOREBUILD +CHAKRA_API JsObjectSetProperty(_In_ JsValueRef object, _In_ JsValueRef propertyId, _In_ JsValueRef value, _In_ bool useStrictRules) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { + + VALIDATE_INCOMING_OBJECT(object, scriptContext); + VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext); + VALIDATE_INCOMING_REFERENCE(value, scriptContext); + + const Js::PropertyRecord *propertyRecord = nullptr; + JsErrorCode errorValue = InternalGetPropertyRecord(scriptContext, + Js::RecyclableObject::FromVar(propertyId), &propertyRecord); + + if (errorValue != JsNoError) + { + return errorValue; + } + + Assert(propertyRecord != nullptr); + + return JsSetPropertyCommon(scriptContext, object, propertyRecord, value, useStrictRules, _actionEntryPopper); }); } +#endif CHAKRA_API JsHasProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _Out_ bool *hasProperty) { @@ -1493,7 +1687,8 @@ CHAKRA_API JsHasProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId PARAM_NOT_NULL(hasProperty); *hasProperty = false; - *hasProperty = Js::JavascriptOperators::OP_HasProperty(object, ((Js::PropertyRecord *)propertyId)->GetPropertyId(), scriptContext) != 0; + Js::RecyclableObject * instance = Js::RecyclableObject::FromVar(object); + *hasProperty = Js::JavascriptOperators::HasProperty(instance, ((Js::PropertyRecord *)propertyId)->GetPropertyId()) != 0; return JsNoError; }; @@ -1516,30 +1711,144 @@ CHAKRA_API JsHasProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId } } -CHAKRA_API JsDeleteProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _In_ bool useStrictRules, _Out_ JsValueRef *result) +#ifdef _CHAKRACOREBUILD +CHAKRA_API JsObjectHasProperty(_In_ JsValueRef object, _In_ JsValueRef propertyId, _Out_ bool *hasProperty) { - return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTDeleteProperty, object, (Js::PropertyRecord *)propertyId, useStrictRules); + VALIDATE_JSREF(object); + if (!Js::JavascriptOperators::IsObject(object)) return JsErrorArgumentNotObject; + + auto internalHasProperty = [&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + VALIDATE_INCOMING_OBJECT(object, scriptContext); + VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext); + PARAM_NOT_NULL(hasProperty); + *hasProperty = false; + + const Js::PropertyRecord *propertyRecord = nullptr; + JsErrorCode errorValue = InternalGetPropertyRecord(scriptContext, + Js::RecyclableObject::FromVar(propertyId), &propertyRecord); + + if (errorValue != JsNoError) + { + return errorValue; + } + + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTHasProperty, propertyRecord, object); + + Js::RecyclableObject * instance = Js::RecyclableObject::FromVar(object); + *hasProperty = Js::JavascriptOperators::HasProperty(instance, propertyRecord->GetPropertyId()) != 0; + + return JsNoError; + }; + + Js::RecyclableObject* robject = Js::RecyclableObject::FromVar(object); + Js::TypeId typeId = Js::JavascriptOperators::GetTypeId(robject); + while (typeId != Js::TypeIds_Null && typeId != Js::TypeIds_Proxy) + { + robject = robject->GetPrototype(); + typeId = Js::JavascriptOperators::GetTypeId(robject); + } + + if (typeId == Js::TypeIds_Proxy) + { + return ContextAPIWrapper(internalHasProperty); + } + else + { + return ContextAPINoScriptWrapper(internalHasProperty); + } +} +#endif + +static JsErrorCode JsDeletePropertyCommon(Js::ScriptContext * scriptContext, _In_ JsValueRef object, + _In_ const Js::PropertyRecord * propertyRecord, _In_ bool useStrictRules, _Out_ JsValueRef *result, + TTDRecorder& _actionEntryPopper) +{ + AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!"); + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTDeleteProperty, object, + propertyRecord, useStrictRules); + + *result = Js::JavascriptOperators::OP_DeleteProperty((Js::Var)object, + propertyRecord->GetPropertyId(), + scriptContext, useStrictRules ? Js::PropertyOperation_StrictMode : Js::PropertyOperation_None); + + Assert(*result == nullptr || !Js::CrossSite::NeedMarshalVar(*result, scriptContext)); + + PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, result); + + return JsNoError; +} + +CHAKRA_API JsDeleteProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, + _In_ bool useStrictRules, _Out_ JsValueRef *result) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { VALIDATE_INCOMING_OBJECT(object, scriptContext); VALIDATE_INCOMING_PROPERTYID(propertyId); PARAM_NOT_NULL(result); *result = nullptr; - *result = Js::JavascriptOperators::OP_DeleteProperty((Js::Var)object, ((Js::PropertyRecord *)propertyId)->GetPropertyId(), - scriptContext, useStrictRules ? Js::PropertyOperation_StrictMode : Js::PropertyOperation_None); - Assert(*result == nullptr || !Js::CrossSite::NeedMarshalVar(*result, scriptContext)); + return JsDeletePropertyCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId, + useStrictRules, result, _actionEntryPopper); + }); +} - PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, result); +#ifdef _CHAKRACOREBUILD +CHAKRA_API JsObjectDeleteProperty(_In_ JsValueRef object, _In_ JsValueRef propertyId, + _In_ bool useStrictRules, _Out_ JsValueRef *result) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { - return JsNoError; + VALIDATE_INCOMING_OBJECT(object, scriptContext); + VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext); + PARAM_NOT_NULL(result); + *result = nullptr; + + const Js::PropertyRecord *propertyRecord = nullptr; + JsErrorCode errorValue = InternalGetPropertyRecord(scriptContext, + Js::RecyclableObject::FromVar(propertyId), &propertyRecord); + + if (errorValue != JsNoError) + { + return errorValue; + } + + Assert(propertyRecord != nullptr); + + return JsDeletePropertyCommon(scriptContext, object, propertyRecord, + useStrictRules, result, _actionEntryPopper); }); } +#endif -CHAKRA_API JsDefineProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _In_ JsValueRef propertyDescriptor, _Out_ bool *result) +static JsErrorCode JsDefinePropertyCommon(Js::ScriptContext * scriptContext, _In_ JsValueRef object, + _In_ const Js::PropertyRecord *propertyRecord, _In_ JsValueRef propertyDescriptor, + _Out_ bool *result, TTDRecorder& _actionEntryPopper) { - return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTDefineProperty, object, (Js::PropertyRecord *)propertyId, propertyDescriptor); + AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!"); + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTDefineProperty, object, + propertyRecord, propertyDescriptor); + + Js::PropertyDescriptor propertyDescriptorValue; + if (!Js::JavascriptOperators::ToPropertyDescriptor(propertyDescriptor, &propertyDescriptorValue, scriptContext)) + { + return JsErrorInvalidArgument; + } + + *result = Js::JavascriptOperators::DefineOwnPropertyDescriptor( + Js::RecyclableObject::FromVar(object), propertyRecord->GetPropertyId(), + propertyDescriptorValue, true, scriptContext) != 0; + + return JsNoError; +} + +CHAKRA_API JsDefineProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, + _In_ JsValueRef propertyDescriptor, _Out_ bool *result) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { VALIDATE_INCOMING_OBJECT(object, scriptContext); VALIDATE_INCOMING_PROPERTYID(propertyId); @@ -1547,15 +1856,68 @@ CHAKRA_API JsDefineProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propert PARAM_NOT_NULL(result); *result = false; - Js::PropertyDescriptor propertyDescriptorValue; - if (!Js::JavascriptOperators::ToPropertyDescriptor(propertyDescriptor, &propertyDescriptorValue, scriptContext)) + return JsDefinePropertyCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId, + propertyDescriptor, result, _actionEntryPopper); + }); +} + +#ifdef _CHAKRACOREBUILD +CHAKRA_API JsObjectDefineProperty(_In_ JsValueRef object, _In_ JsValueRef propertyId, + _In_ JsValueRef propertyDescriptor, _Out_ bool *result) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, + TTDRecorder& _actionEntryPopper) -> JsErrorCode { + + VALIDATE_INCOMING_OBJECT(object, scriptContext); + VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext); + VALIDATE_INCOMING_OBJECT(propertyDescriptor, scriptContext); + PARAM_NOT_NULL(result); + *result = false; + + const Js::PropertyRecord *propertyRecord = nullptr; + JsErrorCode errorValue = InternalGetPropertyRecord(scriptContext, + Js::RecyclableObject::FromVar(propertyId), &propertyRecord); + + if (errorValue != JsNoError) { - return JsErrorInvalidArgument; + return errorValue; } - *result = Js::JavascriptOperators::DefineOwnPropertyDescriptor( - Js::RecyclableObject::FromVar(object), ((Js::PropertyRecord *)propertyId)->GetPropertyId(), propertyDescriptorValue, - true, scriptContext) != 0; + return JsDefinePropertyCommon(scriptContext, object, propertyRecord, propertyDescriptor, result, _actionEntryPopper); + }); +} +#endif + +CHAKRA_API JsGetOwnPropertyNames(_In_ JsValueRef object, _Out_ JsValueRef *propertyNames) +{ + return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetOwnPropertyNamesInfo, object); + + VALIDATE_INCOMING_OBJECT(object, scriptContext); + PARAM_NOT_NULL(propertyNames); + *propertyNames = nullptr; + + *propertyNames = Js::JavascriptOperators::GetOwnPropertyNames(object, scriptContext); + Assert(*propertyNames == nullptr || !Js::CrossSite::NeedMarshalVar(*propertyNames, scriptContext)); + + PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, propertyNames); + + return JsNoError; + }); +} + +CHAKRA_API JsGetOwnPropertySymbols(_In_ JsValueRef object, _Out_ JsValueRef *propertySymbols) +{ + return ContextAPIWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetOwnPropertySymbolsInfo, object); + + VALIDATE_INCOMING_OBJECT(object, scriptContext); + PARAM_NOT_NULL(propertySymbols); + + *propertySymbols = Js::JavascriptOperators::GetOwnPropertySymbols(object, scriptContext); + Assert(*propertySymbols == nullptr || !Js::CrossSite::NeedMarshalVar(*propertySymbols, scriptContext)); + + PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, propertySymbols); return JsNoError; }); @@ -2148,7 +2510,7 @@ CHAKRA_API JsHasIndexedPropertiesExternalData(_In_ JsValueRef object, _Out_ bool if (Js::DynamicType::Is(Js::JavascriptOperators::GetTypeId(object))) { - Js::DynamicObject* dynamicObject = Js::DynamicObject::FromVar(object); + Js::DynamicObject* dynamicObject = Js::DynamicObject::UnsafeFromVar(object); Js::ArrayObject* objectArray = dynamicObject->GetObjectArray(); *value = (objectArray && !Js::DynamicObject::IsAnyArray(objectArray)); } @@ -2178,7 +2540,7 @@ CHAKRA_API JsGetIndexedPropertiesExternalData( *arrayType = JsTypedArrayType(); *elementLength = 0; - Js::DynamicObject* dynamicObject = Js::DynamicObject::FromVar(object); + Js::DynamicObject* dynamicObject = Js::DynamicObject::UnsafeFromVar(object); Js::ArrayObject* objectArray = dynamicObject->GetObjectArray(); if (!objectArray) { @@ -2221,6 +2583,36 @@ CHAKRA_API JsGetIndexedPropertiesExternalData( END_JSRT_NO_EXCEPTION } +CHAKRA_API JsLessThan(_In_ JsValueRef object1, _In_ JsValueRef object2, _Out_ bool *result) +{ + return ContextAPIWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTLessThan, object1, object2, false); + + VALIDATE_INCOMING_REFERENCE(object1, scriptContext); + VALIDATE_INCOMING_REFERENCE(object2, scriptContext); + PARAM_NOT_NULL(result); + + *result = Js::JavascriptOperators::Less((Js::Var)object1, (Js::Var)object2, scriptContext) != 0; + + return JsNoError; + }); +} + +CHAKRA_API JsLessThanOrEqual(_In_ JsValueRef object1, _In_ JsValueRef object2, _Out_ bool *result) +{ + return ContextAPIWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTLessThan, object1, object2, true); + + VALIDATE_INCOMING_REFERENCE(object1, scriptContext); + VALIDATE_INCOMING_REFERENCE(object2, scriptContext); + PARAM_NOT_NULL(result); + + *result = Js::JavascriptOperators::LessEqual((Js::Var)object1, (Js::Var)object2, scriptContext) != 0; + + return JsNoError; + }); +} + CHAKRA_API JsEquals(_In_ JsValueRef object1, _In_ JsValueRef object2, _Out_ bool *result) { return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { @@ -2399,44 +2791,65 @@ CHAKRA_API JsConstructObject(_In_ JsValueRef function, _In_reads_(cargs) JsValue }); } -CHAKRA_API JsCreateFunction(_In_ JsNativeFunction nativeFunction, _In_opt_ void *callbackState, _Out_ JsValueRef *function) +#ifndef _CHAKRACOREBUILD +typedef struct JsNativeFunctionInfo { - return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTAllocateFunction, false, nullptr); + JsValueRef thisArg; + JsValueRef newTargetArg; + bool isConstructCall; +}JsNativeFunctionInfo; - PARAM_NOT_NULL(nativeFunction); - PARAM_NOT_NULL(function); - *function = nullptr; - - Js::JavascriptExternalFunction *externalFunction = scriptContext->GetLibrary()->CreateStdCallExternalFunction((Js::StdCallJavascriptMethod)nativeFunction, 0, callbackState); - *function = (JsValueRef)externalFunction; +typedef _Ret_maybenull_ JsValueRef(CHAKRA_CALLBACK * JsEnhancedNativeFunction)(_In_ JsValueRef callee, _In_ JsValueRef *arguments, _In_ unsigned short argumentCount, _In_ JsNativeFunctionInfo *info, _In_opt_ void *callbackState); +#endif - PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, function); +typedef struct JsNativeFunctionWrapperHolder +{ + FieldNoBarrier(void *) callbackState; + FieldNoBarrier(JsNativeFunction) nativeFunction; +}JsNativeFunctionWrapperHolder; - return JsNoError; - }); +JsValueRef CALLBACK JsNativeFunctionWrapper(JsValueRef callee, JsValueRef *arguments, unsigned short argumentCount, JsNativeFunctionInfo *info, void *wrapperData) +{ + JsNativeFunctionWrapperHolder *wrapperHolder = static_cast(wrapperData); + JsValueRef result = wrapperHolder->nativeFunction(callee, info->isConstructCall, arguments, argumentCount, wrapperHolder->callbackState); + return result; } -CHAKRA_API JsCreateNamedFunction(_In_ JsValueRef name, _In_ JsNativeFunction nativeFunction, _In_opt_ void *callbackState, _Out_ JsValueRef *function) +template +JsErrorCode JsCreateEnhancedFunctionHelper(_In_ T nativeFunction, _In_opt_ JsValueRef metadata, _In_opt_ void *callbackState, _Out_ JsValueRef *function) { return ContextAPIWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTAllocateFunction, true, name); - - VALIDATE_INCOMING_REFERENCE(name, scriptContext); + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTAllocateFunction, true, metadata); PARAM_NOT_NULL(nativeFunction); PARAM_NOT_NULL(function); *function = nullptr; - if (name != JS_INVALID_REFERENCE) + Js::StdCallJavascriptMethod method; + + if (wrapNativeFunction) { - name = Js::JavascriptConversion::ToString(name, scriptContext); + JsNativeFunctionWrapperHolder *wrapperHolder = RecyclerNewStruct(scriptContext->GetRecycler(), JsNativeFunctionWrapperHolder); + wrapperHolder->callbackState = callbackState; + wrapperHolder->nativeFunction = (JsNativeFunction)nativeFunction; + callbackState = wrapperHolder; + method = (Js::StdCallJavascriptMethod)JsNativeFunctionWrapper; } else { - name = scriptContext->GetLibrary()->GetEmptyString(); + method = (Js::StdCallJavascriptMethod)nativeFunction; } - Js::JavascriptExternalFunction *externalFunction = scriptContext->GetLibrary()->CreateStdCallExternalFunction((Js::StdCallJavascriptMethod)nativeFunction, Js::JavascriptString::FromVar(name), callbackState); + if (metadata != JS_INVALID_REFERENCE) + { + VALIDATE_INCOMING_REFERENCE(metadata, scriptContext); + metadata = Js::JavascriptConversion::ToString(metadata, scriptContext); + } + else + { + metadata = scriptContext->GetLibrary()->GetEmptyString(); + } + + Js::JavascriptExternalFunction *externalFunction = scriptContext->GetLibrary()->CreateStdCallExternalFunction(method, metadata, callbackState); *function = (JsValueRef)externalFunction; PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, function); @@ -2445,6 +2858,21 @@ CHAKRA_API JsCreateNamedFunction(_In_ JsValueRef name, _In_ JsNativeFunction nat }); } +CHAKRA_API JsCreateEnhancedFunction(_In_ JsEnhancedNativeFunction nativeFunction, _In_opt_ JsValueRef metadata, _In_opt_ void *callbackState, _Out_ JsValueRef *function) +{ + return JsCreateEnhancedFunctionHelper(nativeFunction, metadata, callbackState, function); +} + +CHAKRA_API JsCreateFunction(_In_ JsNativeFunction nativeFunction, _In_opt_ void *callbackState, _Out_ JsValueRef *function) +{ + return JsCreateEnhancedFunctionHelper(nativeFunction, JS_INVALID_REFERENCE, callbackState, function); +} + +CHAKRA_API JsCreateNamedFunction(_In_ JsValueRef name, _In_ JsNativeFunction nativeFunction, _In_opt_ void *callbackState, _Out_ JsValueRef *function) +{ + return JsCreateEnhancedFunctionHelper(nativeFunction, name, callbackState, function); +} + void SetErrorMessage(Js::ScriptContext *scriptContext, JsValueRef newError, JsValueRef message) { Js::JavascriptOperators::OP_SetProperty(newError, Js::PropertyIds::message, message, scriptContext); @@ -4195,14 +4623,32 @@ CHAKRA_API JsCreateString( _Out_ JsValueRef *value) { PARAM_NOT_NULL(content); + PARAM_NOT_NULL(value); + *value = JS_INVALID_REFERENCE; + + if (length == static_cast(-1)) + { + length = strlen(content); + } - utf8::NarrowToWide wstr(content, length); - if (!wstr) + if (length > static_cast(-1)) { return JsErrorOutOfMemory; } - return JsPointerToString(wstr, wstr.Length(), value); + return ContextAPINoScriptWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + + Js::JavascriptString *stringValue = Js::LiteralStringWithPropertyStringPtr:: + NewFromCString(content, (CharCount)length, scriptContext->GetLibrary()); + + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTCreateString, stringValue->GetSz(), stringValue->GetLength()); + + *value = stringValue; + + PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, value); + + return JsNoError; + }); } CHAKRA_API JsCreateStringUtf16( @@ -4211,9 +4657,32 @@ CHAKRA_API JsCreateStringUtf16( _Out_ JsValueRef *value) { PARAM_NOT_NULL(content); + PARAM_NOT_NULL(value); + *value = JS_INVALID_REFERENCE; + + if (length == static_cast(-1)) + { + length = wcslen((const char16 *)content); + } + + if (length > static_cast(-1)) + { + return JsErrorOutOfMemory; + } + + return ContextAPINoScriptWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + + Js::JavascriptString *stringValue = Js::LiteralStringWithPropertyStringPtr:: + NewFromWideString((const char16 *)content, (CharCount)length, scriptContext->GetLibrary()); + + PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTCreateString, stringValue->GetSz(), stringValue->GetLength()); - return JsPointerToString( - reinterpret_cast(content), length, value); + *value = stringValue; + + PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, value); + + return JsNoError; + }); } @@ -4768,22 +5237,6 @@ CHAKRA_API JsGetAndClearExceptionWithMetadata(_Out_ JsValueRef *metadata) }); } -CHAKRA_API JsHasOwnProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _Out_ bool *hasOwnProperty) -{ - return ContextAPIWrapper([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { - PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTHasOwnProperty, (Js::PropertyRecord *)propertyId, object); - - VALIDATE_INCOMING_OBJECT(object, scriptContext); - VALIDATE_INCOMING_PROPERTYID(propertyId); - PARAM_NOT_NULL(hasOwnProperty); - *hasOwnProperty = false; - - *hasOwnProperty = Js::JavascriptOperators::OP_HasOwnProperty(object, ((Js::PropertyRecord *)propertyId)->GetPropertyId(), scriptContext) != 0; - - return JsNoError; - }); -} - CHAKRA_API JsCopyStringOneByte( _In_ JsValueRef value, _In_ int start, diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtCommonExports.inc b/deps/chakrashim/core/lib/Jsrt/JsrtCommonExports.inc index c10e758521d..610d026aa7c 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtCommonExports.inc +++ b/deps/chakrashim/core/lib/Jsrt/JsrtCommonExports.inc @@ -122,4 +122,12 @@ JsHasOwnProperty JsCopyStringOneByte JsGetDataViewInfo + JsCreateExternalObjectWithPrototype + JsObjectGetProperty + JsObjectHasProperty + JsObjectSetProperty + JsObjectDeleteProperty + JsObjectHasOwnProperty + JsObjectGetOwnPropertyDescriptor + JsObjectDefineProperty #endif diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtDebugEventObject.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtDebugEventObject.cpp index 4fa8a3e54f9..27235bfdb82 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtDebugEventObject.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtDebugEventObject.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "JsrtPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "JsrtDebugEventObject.h" #include "RuntimeDebugPch.h" #include "screrror.h" // For CompileScriptException @@ -123,3 +124,4 @@ JsrtDebugDocumentManager::BreakpointDebugDocumentDictionary * JsrtDebugDocumentM } return breakpointDebugDocumentDictionary; } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtDebugManager.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtDebugManager.cpp index 090d725bb5a..70dee959e9f 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtDebugManager.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtDebugManager.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "JsrtPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "JsrtDebugManager.h" #include "JsrtDebugEventObject.h" #include "JsrtDebugUtils.h" @@ -762,3 +763,4 @@ JsDiagDebugEvent JsrtDebugManager::GetDebugEventFromStopType(Js::StopType stopTy return JsDiagDebugEventBreakpoint; } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtDebugUtils.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtDebugUtils.cpp index dc69c1da428..ab1982d3b4b 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtDebugUtils.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtDebugUtils.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "JsrtPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "JsrtDebugUtils.h" #include "RuntimeDebugPch.h" #include "screrror.h" // For CompileScriptException @@ -144,6 +145,7 @@ void JsrtDebugUtils::AddPropertyType(Js::DynamicObject * object, Js::IDiagObject bool addValue = false; Js::Var varValue = objectDisplayRef->GetVarValue(FALSE); + Js::IDiagObjectAddress* varAddress = objectDisplayRef->GetDiagAddress(); if (varValue != nullptr) { @@ -365,6 +367,11 @@ void JsrtDebugUtils::AddPropertyType(Js::DynamicObject * object, Js::IDiagObject propertyAttributes |= JsrtDebugPropertyAttribute::HAVE_CHILDRENS; } + if (varAddress != nullptr && varAddress->IsInDeadZone()) + { + propertyAttributes |= JsrtDebugPropertyAttribute::IN_TDZ; + } + JsrtDebugUtils::AddPropertyToObject(object, JsrtDebugPropertyId::propertyAttributes, (UINT)propertyAttributes, scriptContext); } @@ -509,3 +516,4 @@ const char16 * JsrtDebugUtils::GetDebugPropertyName(JsrtDebugPropertyId property Assert(false); return _u(""); } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtDebugUtils.h b/deps/chakrashim/core/lib/Jsrt/JsrtDebugUtils.h index dec25f50ff3..0cce50d00a4 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtDebugUtils.h +++ b/deps/chakrashim/core/lib/Jsrt/JsrtDebugUtils.h @@ -14,6 +14,7 @@ BEGIN_ENUM_UINT(JsrtDebugPropertyAttribute) NONE = 0x1, HAVE_CHILDRENS = 0x2, READ_ONLY_VALUE = 0x4, + IN_TDZ = 0x8, END_ENUM_UINT() class JsrtDebugUtils diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtDebuggerObject.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtDebuggerObject.cpp index b0f2e6183bc..9286c3faebb 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtDebuggerObject.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtDebuggerObject.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "JsrtPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "JsrtDebuggerObject.h" #include "JsrtDebugUtils.h" #include "JsrtDebugManager.h" @@ -257,7 +258,14 @@ Js::DynamicObject * JsrtDebuggerStackFrame::GetJSONObject(Js::ScriptContext* scr JsrtDebugUtils::AddLineColumnToObject(stackTraceObject, functionBody, currentByteCodeOffset); JsrtDebugUtils::AddSourceLengthAndTextToObject(stackTraceObject, functionBody, currentByteCodeOffset); - JsrtDebuggerObjectBase* functionObject = JsrtDebuggerObjectFunction::Make(this->debuggerObjectsManager, functionBody); + Js::JavascriptFunction* javascriptFunction = stackFrame->GetJavascriptFunction(); + JsrtDebuggerObjectBase* functionObject = nullptr; + + if (!this->debuggerObjectsManager->TryGetDataFromDataToDebuggerObjectsDictionary(javascriptFunction, &functionObject)) + { + functionObject = JsrtDebuggerObjectFunction::Make(this->debuggerObjectsManager, javascriptFunction); + } + JsrtDebugUtils::AddPropertyToObject(stackTraceObject, JsrtDebugPropertyId::functionHandle, functionObject->GetHandle(), frameScriptContext); return stackTraceObject; @@ -660,30 +668,40 @@ Js::DynamicObject * JsrtDebuggerObjectScope::GetChildren(Js::ScriptContext * scr return childrens; } -JsrtDebuggerObjectFunction::JsrtDebuggerObjectFunction(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::FunctionBody* functionBody) : +JsrtDebuggerObjectFunction::JsrtDebuggerObjectFunction(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::JavascriptFunction* javascriptFunction) : JsrtDebuggerObjectBase(JsrtDebuggerObjectType::Function, debuggerObjectsManager), - functionBody(functionBody) + javascriptFunction(javascriptFunction), + objectDisplay(nullptr), + walkerRef(nullptr) { } JsrtDebuggerObjectFunction::~JsrtDebuggerObjectFunction() { - this->functionBody = nullptr; + if (this->objectDisplay != nullptr) + { + HeapDelete(this->objectDisplay); + this->objectDisplay = nullptr; + } + + if (this->walkerRef != nullptr) + { + HeapDelete(this->walkerRef); + this->walkerRef = nullptr; + } + + this->javascriptFunction = nullptr; } -JsrtDebuggerObjectBase * JsrtDebuggerObjectFunction::Make(JsrtDebuggerObjectsManager * debuggerObjectsManager, Js::FunctionBody * functionBody) +JsrtDebuggerObjectBase * JsrtDebuggerObjectFunction::Make(JsrtDebuggerObjectsManager * debuggerObjectsManager, Js::JavascriptFunction* javascriptFunction) { JsrtDebuggerObjectBase* debuggerObject = nullptr; - if (debuggerObjectsManager->TryGetDataFromDataToDebuggerObjectsDictionary(functionBody, &debuggerObject)) - { - Assert(debuggerObject != nullptr); - return debuggerObject; - } + Assert(!debuggerObjectsManager->TryGetDataFromDataToDebuggerObjectsDictionary(javascriptFunction, &debuggerObject)); + + debuggerObject = Anew(debuggerObjectsManager->GetDebugObjectArena(), JsrtDebuggerObjectFunction, debuggerObjectsManager, javascriptFunction); - debuggerObject = Anew(debuggerObjectsManager->GetDebugObjectArena(), JsrtDebuggerObjectFunction, debuggerObjectsManager, functionBody); - - debuggerObjectsManager->AddToDataToDebuggerObjectsDictionary(functionBody, debuggerObject); + debuggerObjectsManager->AddToDataToDebuggerObjectsDictionary(javascriptFunction, debuggerObject); return debuggerObject; } @@ -692,16 +710,47 @@ Js::DynamicObject * JsrtDebuggerObjectFunction::GetJSONObject(Js::ScriptContext { Js::DynamicObject* functionObject = scriptContext->GetLibrary()->CreateObject(); - JsrtDebugUtils::AddScriptIdToObject(functionObject, this->functionBody->GetUtf8SourceInfo()); - JsrtDebugUtils::AddPropertyToObject(functionObject, JsrtDebugPropertyId::line, (uint32) this->functionBody->GetLineNumber(), scriptContext); - JsrtDebugUtils::AddPropertyToObject(functionObject, JsrtDebugPropertyId::column, (uint32) this->functionBody->GetColumnNumber(), scriptContext); - JsrtDebugUtils::AddPropertyToObject(functionObject, JsrtDebugPropertyId::name, this->functionBody->GetDisplayName(), this->functionBody->GetDisplayNameLength(), scriptContext); + Js::FunctionBody* functionBody = this->javascriptFunction->GetFunctionBody(); + JsrtDebugUtils::AddScriptIdToObject(functionObject, functionBody->GetUtf8SourceInfo()); + JsrtDebugUtils::AddPropertyToObject(functionObject, JsrtDebugPropertyId::line, (uint32)functionBody->GetLineNumber(), scriptContext); + JsrtDebugUtils::AddPropertyToObject(functionObject, JsrtDebugPropertyId::column, (uint32)functionBody->GetColumnNumber(), scriptContext); + JsrtDebugUtils::AddPropertyToObject(functionObject, JsrtDebugPropertyId::name, functionBody->GetDisplayName(), functionBody->GetDisplayNameLength(), scriptContext); JsrtDebugUtils::AddPropertyToObject(functionObject, JsrtDebugPropertyId::type, scriptContext->GetLibrary()->GetFunctionTypeDisplayString(), scriptContext); JsrtDebugUtils::AddPropertyToObject(functionObject, JsrtDebugPropertyId::handle, this->GetHandle(), scriptContext); return functionObject; } +Js::DynamicObject * JsrtDebuggerObjectFunction::GetChildren(Js::ScriptContext * scriptContext, uint fromCount, uint totalCount) +{ + if (this->objectDisplay == nullptr) + { + Js::ResolvedObject functionResolvedObject; + functionResolvedObject.obj = this->javascriptFunction; + functionResolvedObject.scriptContext = scriptContext; + functionResolvedObject.name = _u("Function"); + functionResolvedObject.typeId = Js::JavascriptOperators::GetTypeId(functionResolvedObject.obj); + this->objectDisplay = functionResolvedObject.GetObjectDisplay(); + } + + Js::IDiagObjectModelDisplay* objectDisplayRef = this->objectDisplay->GetStrongReference(); + if (objectDisplayRef == nullptr) + { + return nullptr; + } + + if (this->walkerRef == nullptr) + { + this->walkerRef = objectDisplayRef->CreateWalker(); + } + + Js::DynamicObject* childrens = __super::GetChildren(this->walkerRef, scriptContext, fromCount, totalCount); + + this->objectDisplay->ReleaseStrongReference(); + + return childrens; +} + JsrtDebuggerObjectGlobalsNode::JsrtDebuggerObjectGlobalsNode(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference* objectDisplay) : JsrtDebuggerObjectBase(JsrtDebuggerObjectType::Globals, debuggerObjectsManager), objectDisplay(objectDisplay), @@ -903,3 +952,4 @@ void JsrtDebugStackFrames::ClearFrameDictionary() this->framesDictionary->Clear(); } } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtDebuggerObject.h b/deps/chakrashim/core/lib/Jsrt/JsrtDebuggerObject.h index afde7c2d62c..8a8ca67deb8 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtDebuggerObject.h +++ b/deps/chakrashim/core/lib/Jsrt/JsrtDebuggerObject.h @@ -58,13 +58,16 @@ class JsrtDebuggerObjectBase class JsrtDebuggerObjectFunction : public JsrtDebuggerObjectBase { public: - static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::FunctionBody* functionBody); + static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::JavascriptFunction* javascriptFunction); Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp); + Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount); private: - JsrtDebuggerObjectFunction(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::FunctionBody* functionBody); + JsrtDebuggerObjectFunction(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::JavascriptFunction* javascriptFunction); ~JsrtDebuggerObjectFunction(); - Js::FunctionBody* functionBody; + Js::JavascriptFunction* javascriptFunction; + WeakArenaReference* objectDisplay; + WeakArenaReference* walkerRef; }; class JsrtDebuggerObjectProperty : public JsrtDebuggerObjectBase diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtDiag.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtDiag.cpp index c9a0970912e..c80c62e01bf 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtDiag.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtDiag.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "JsrtPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "JsrtInternal.h" #include "RuntimeDebugPch.h" #include "ThreadContextTlsEntry.h" @@ -40,12 +41,16 @@ { \ return JsErrorWrongThread; \ } +#endif CHAKRA_API JsDiagStartDebugging( _In_ JsRuntimeHandle runtimeHandle, _In_ JsDiagDebugEventCallback debugEventCallback, _In_opt_ void* callbackState) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode { VALIDATE_INCOMING_RUNTIME_HANDLE(runtimeHandle); @@ -101,12 +106,16 @@ CHAKRA_API JsDiagStartDebugging( return JsNoError; }); +#endif } CHAKRA_API JsDiagStopDebugging( _In_ JsRuntimeHandle runtimeHandle, _Out_ void** callbackState) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode { VALIDATE_INCOMING_RUNTIME_HANDLE(runtimeHandle); @@ -150,11 +159,15 @@ CHAKRA_API JsDiagStopDebugging( return JsNoError; }); +#endif } CHAKRA_API JsDiagGetScripts( _Out_ JsValueRef *scriptsArray) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPIWrapper_NoRecord([&](Js::ScriptContext *scriptContext) -> JsErrorCode { PARAM_NOT_NULL(scriptsArray); @@ -177,12 +190,16 @@ CHAKRA_API JsDiagGetScripts( return JsErrorDiagUnableToPerformAction; }); +#endif } CHAKRA_API JsDiagGetSource( _In_ unsigned int scriptId, _Out_ JsValueRef *source) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPIWrapper_NoRecord([&](Js::ScriptContext *scriptContext) -> JsErrorCode { PARAM_NOT_NULL(source); @@ -205,11 +222,15 @@ CHAKRA_API JsDiagGetSource( return JsErrorInvalidArgument; }); +#endif } CHAKRA_API JsDiagRequestAsyncBreak( _In_ JsRuntimeHandle runtimeHandle) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode { VALIDATE_INCOMING_RUNTIME_HANDLE(runtimeHandle); @@ -229,11 +250,15 @@ CHAKRA_API JsDiagRequestAsyncBreak( return JsNoError; }); +#endif } CHAKRA_API JsDiagGetBreakpoints( _Out_ JsValueRef *breakpoints) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode { PARAM_NOT_NULL(breakpoints); @@ -268,6 +293,7 @@ CHAKRA_API JsDiagGetBreakpoints( return JsNoError; }); +#endif } CHAKRA_API JsDiagSetBreakpoint( @@ -276,6 +302,9 @@ CHAKRA_API JsDiagSetBreakpoint( _In_ unsigned int columnNumber, _Out_ JsValueRef *breakpoint) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode { PARAM_NOT_NULL(breakpoint); @@ -329,11 +358,15 @@ CHAKRA_API JsDiagSetBreakpoint( return JsErrorDiagObjectNotFound; }); +#endif } CHAKRA_API JsDiagRemoveBreakpoint( _In_ unsigned int breakpointId) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode { JsrtContext *currentContext = JsrtContext::GetCurrent(); @@ -358,12 +391,16 @@ CHAKRA_API JsDiagRemoveBreakpoint( return JsNoError; }); +#endif } CHAKRA_API JsDiagSetBreakOnException( _In_ JsRuntimeHandle runtimeHandle, _In_ JsDiagBreakOnExceptionAttributes exceptionAttributes) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode { VALIDATE_INCOMING_RUNTIME_HANDLE(runtimeHandle); @@ -378,12 +415,16 @@ CHAKRA_API JsDiagSetBreakOnException( return JsNoError; }); +#endif } CHAKRA_API JsDiagGetBreakOnException( _In_ JsRuntimeHandle runtimeHandle, _Out_ JsDiagBreakOnExceptionAttributes* exceptionAttributes) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode { VALIDATE_INCOMING_RUNTIME_HANDLE(runtimeHandle); @@ -402,11 +443,15 @@ CHAKRA_API JsDiagGetBreakOnException( return JsNoError; }); +#endif } CHAKRA_API JsDiagSetStepType( _In_ JsDiagStepType stepType) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPIWrapper_NoRecord([&](Js::ScriptContext * scriptContext) -> JsErrorCode { JsrtContext *currentContext = JsrtContext::GetCurrent(); @@ -479,12 +524,16 @@ CHAKRA_API JsDiagSetStepType( return JsNoError; }); +#endif } CHAKRA_API JsDiagGetFunctionPosition( _In_ JsValueRef function, _Out_ JsValueRef *functionPosition) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPIWrapper_NoRecord([&](Js::ScriptContext *scriptContext) -> JsErrorCode { VALIDATE_INCOMING_REFERENCE(function, scriptContext); @@ -543,11 +592,15 @@ CHAKRA_API JsDiagGetFunctionPosition( return JsErrorDiagObjectNotFound; }); +#endif } CHAKRA_API JsDiagGetStackTrace( _Out_ JsValueRef *stackTrace) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPIWrapper_NoRecord([&](Js::ScriptContext *scriptContext) -> JsErrorCode { PARAM_NOT_NULL(stackTrace); @@ -567,12 +620,16 @@ CHAKRA_API JsDiagGetStackTrace( return JsNoError; }); +#endif } CHAKRA_API JsDiagGetStackProperties( _In_ unsigned int stackFrameIndex, _Out_ JsValueRef *properties) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPIWrapper_NoRecord([&](Js::ScriptContext *scriptContext) -> JsErrorCode { PARAM_NOT_NULL(properties); @@ -604,6 +661,7 @@ CHAKRA_API JsDiagGetStackProperties( return JsErrorDiagUnableToPerformAction; }); +#endif } CHAKRA_API JsDiagGetProperties( @@ -612,7 +670,9 @@ CHAKRA_API JsDiagGetProperties( _In_ unsigned int totalCount, _Out_ JsValueRef *propertiesObject) { - +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPIWrapper_NoRecord([&](Js::ScriptContext *scriptContext) -> JsErrorCode { PARAM_NOT_NULL(propertiesObject); @@ -644,12 +704,16 @@ CHAKRA_API JsDiagGetProperties( return JsErrorDiagUnableToPerformAction; }); +#endif } CHAKRA_API JsDiagGetObjectFromHandle( _In_ unsigned int objectHandle, _Out_ JsValueRef *handleObject) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPIWrapper_NoRecord([&](Js::ScriptContext *scriptContext) -> JsErrorCode { PARAM_NOT_NULL(handleObject); @@ -681,6 +745,7 @@ CHAKRA_API JsDiagGetObjectFromHandle( return JsErrorDiagUnableToPerformAction; }); +#endif } CHAKRA_API JsDiagEvaluate( @@ -690,6 +755,9 @@ CHAKRA_API JsDiagEvaluate( _In_ bool forceSetValueProp, _Out_ JsValueRef *evalResult) { +#ifndef ENABLE_SCRIPT_DEBUGGING + return JsErrorCategoryUsage; +#else return ContextAPINoScriptWrapper_NoRecord([&](Js::ScriptContext *scriptContext) -> JsErrorCode { PARAM_NOT_NULL(expressionVal); @@ -765,4 +833,5 @@ CHAKRA_API JsDiagEvaluate( return success ? JsNoError : JsErrorScriptException; }, false /*allowInObjectBeforeCollectCallback*/, true /*scriptExceptionAllowed*/); +#endif } diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtExternalObject.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtExternalObject.cpp index 3d16e21e607..fe36826070c 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtExternalObject.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtExternalObject.cpp @@ -13,7 +13,7 @@ JsrtExternalType::JsrtExternalType(Js::ScriptContext* scriptContext, JsFinalizeC Js::TypeIds_Object, scriptContext->GetLibrary()->GetObjectPrototype(), nullptr, - Js::SimplePathTypeHandler::New(scriptContext, scriptContext->GetLibrary()->GetRootPath(), 0, 0, 0, true, true), + Js::SimplePathTypeHandlerNoAttr::New(scriptContext, scriptContext->GetLibrary()->GetRootPath(), 0, 0, 0, true, true), true, true) , jsFinalizeCallback(finalizeCallback) @@ -28,7 +28,7 @@ JsrtExternalObject::JsrtExternalObject(JsrtExternalType * type, void *data) : } /* static */ -JsrtExternalObject* JsrtExternalObject::Create(void *data, JsFinalizeCallback finalizeCallback, Js::ScriptContext *scriptContext) +JsrtExternalObject* JsrtExternalObject::Create(void *data, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext) { Js::DynamicType * dynamicType = scriptContext->GetLibrary()->GetCachedJsrtExternalType(reinterpret_cast(finalizeCallback)); @@ -41,7 +41,14 @@ JsrtExternalObject* JsrtExternalObject::Create(void *data, JsFinalizeCallback fi Assert(dynamicType->IsJsrtExternal()); Assert(dynamicType->GetIsShared()); - return RecyclerNewFinalized(scriptContext->GetRecycler(), JsrtExternalObject, static_cast(dynamicType), data); + JsrtExternalObject * externalObject = RecyclerNewFinalized(scriptContext->GetRecycler(), JsrtExternalObject, static_cast(dynamicType), data); + + if (prototype != nullptr) + { + externalObject->SetPrototype(prototype); + } + + return externalObject; } bool JsrtExternalObject::Is(Js::Var value) @@ -56,6 +63,12 @@ bool JsrtExternalObject::Is(Js::Var value) } JsrtExternalObject * JsrtExternalObject::FromVar(Js::Var value) +{ + AssertOrFailFast(Is(value)); + return static_cast(value); +} + +JsrtExternalObject * JsrtExternalObject::UnsafeFromVar(Js::Var value) { Assert(Is(value)); return static_cast(value); diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtExternalObject.h b/deps/chakrashim/core/lib/Jsrt/JsrtExternalObject.h index 710d37b60d6..0f648bbb6be 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtExternalObject.h +++ b/deps/chakrashim/core/lib/Jsrt/JsrtExternalObject.h @@ -49,7 +49,8 @@ class JsrtExternalObject : public Js::DynamicObject static bool Is(Js::Var value); static JsrtExternalObject * FromVar(Js::Var value); - static JsrtExternalObject * Create(void *data, JsFinalizeCallback finalizeCallback, Js::ScriptContext *scriptContext); + static JsrtExternalObject * UnsafeFromVar(Js::Var value); + static JsrtExternalObject * Create(void *data, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext); JsrtExternalType * GetExternalType() const { return (JsrtExternalType *)this->GetType(); } diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtHelper.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtHelper.cpp index 65203a66270..5f750d34046 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtHelper.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtHelper.cpp @@ -143,7 +143,7 @@ void JsrtCallbackState::ObjectBeforeCallectCallbackWrapper(JsObjectBeforeCollect ConfigParser::ParseOnModuleLoad(parser, mod); } - #ifdef ENABLE_JS_ETW + #if defined(ENABLE_JS_ETW) && !defined(ENABLE_JS_LTTNG) EtwTrace::Register(); #endif #ifdef VTUNE_PROFILING diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtInternal.h b/deps/chakrashim/core/lib/Jsrt/JsrtInternal.h index f4bf91bbfd7..95de950046a 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtInternal.h +++ b/deps/chakrashim/core/lib/Jsrt/JsrtInternal.h @@ -84,6 +84,16 @@ typedef struct {} TTDRecorder; MARSHAL_OBJECT(p, scriptContext) \ } +#define VALIDATE_INCOMING_RECYCLABLE(p, scriptContext) \ +{ \ + VALIDATE_JSREF(p); \ + if (!Js::RecyclableObject::Is(p)) \ + { \ + return JsErrorInvalidArgument; \ + } \ + MARSHAL_OBJECT(p, scriptContext) \ +} + #define VALIDATE_INCOMING_OBJECT_OR_NULL(p, scriptContext) \ { \ VALIDATE_JSREF(p); \ diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtRuntime.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtRuntime.cpp index 880c4a2b324..a77a497fcbe 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtRuntime.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtRuntime.cpp @@ -27,17 +27,21 @@ JsrtRuntime::JsrtRuntime(ThreadContext * threadContext, bool useIdle, bool dispa #ifdef ENABLE_DEBUG_CONFIG_OPTIONS serializeByteCodeForLibrary = false; #endif +#ifdef ENABLE_SCRIPT_DEBUGGING this->jsrtDebugManager = nullptr; +#endif } JsrtRuntime::~JsrtRuntime() { HeapDelete(allocationPolicyManager); +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->jsrtDebugManager != nullptr) { HeapDelete(this->jsrtDebugManager); this->jsrtDebugManager = nullptr; } +#endif } // This is called at process detach. @@ -126,6 +130,7 @@ unsigned int JsrtRuntime::Idle() return this->threadService.Idle(); } +#ifdef ENABLE_SCRIPT_DEBUGGING void JsrtRuntime::EnsureJsrtDebugManager() { if (this->jsrtDebugManager == nullptr) @@ -172,3 +177,4 @@ void JsrtRuntime::BPClearDocument_TTD() this->jsrtDebugManager->ClearBreakpointDebugDocumentDictionary(); } #endif +#endif diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtRuntime.h b/deps/chakrashim/core/lib/Jsrt/JsrtRuntime.h index de8a4641b80..32c5304c7ef 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtRuntime.h +++ b/deps/chakrashim/core/lib/Jsrt/JsrtRuntime.h @@ -6,7 +6,9 @@ #include "ChakraCore.h" #include "JsrtThreadService.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "JsrtDebugManager.h" +#endif class JsrtContext; @@ -42,9 +44,11 @@ class JsrtRuntime bool IsSerializeByteCodeForLibrary() const { return serializeByteCodeForLibrary; } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING void EnsureJsrtDebugManager(); void DeleteJsrtDebugManager(); JsrtDebugManager * GetJsrtDebugManager(); +#endif #if ENABLE_TTD uint32 BPRegister_TTD(int64 bpID, Js::ScriptContext* scriptContext, Js::Utf8SourceInfo* utf8SourceInfo, uint32 line, uint32 column, BOOL* isNewBP); @@ -68,5 +72,7 @@ class JsrtRuntime #ifdef ENABLE_DEBUG_CONFIG_OPTIONS bool serializeByteCodeForLibrary; #endif +#ifdef ENABLE_SCRIPT_DEBUGGING JsrtDebugManager * jsrtDebugManager; +#endif }; diff --git a/deps/chakrashim/core/lib/Jsrt/JsrtSourceHolder.cpp b/deps/chakrashim/core/lib/Jsrt/JsrtSourceHolder.cpp index d60cac3df00..21aef9c7200 100644 --- a/deps/chakrashim/core/lib/Jsrt/JsrtSourceHolder.cpp +++ b/deps/chakrashim/core/lib/Jsrt/JsrtSourceHolder.cpp @@ -113,7 +113,7 @@ namespace Js #if ENABLE_DEBUG_CONFIG_OPTIONS AssertMsg(reasonString != nullptr, "Reason string for why we are mapping the source was not provided."); - JS_ETW(EventWriteJSCRIPT_SOURCEMAPPING((uint32)wcslen(reasonString), reasonString, (ushort)requestedFor)); + JS_ETW(EventWriteJSCRIPT_SOURCEMAPPING(reasonString, (ushort)requestedFor)); #endif } @@ -285,7 +285,7 @@ namespace Js #if ENABLE_DEBUG_CONFIG_OPTIONS AssertMsg(reasonString != nullptr, "Reason string for why we are mapping the source was not provided."); - JS_ETW(EventWriteJSCRIPT_SOURCEMAPPING((uint32)wcslen(reasonString), reasonString, (ushort)requestedFor)); + JS_ETW(EventWriteJSCRIPT_SOURCEMAPPING(reasonString, (ushort)requestedFor)); #endif } diff --git a/deps/chakrashim/core/lib/Parser/CaseInsensitive.cpp b/deps/chakrashim/core/lib/Parser/CaseInsensitive.cpp index fb8ba8923fd..11a653fb93d 100644 --- a/deps/chakrashim/core/lib/Parser/CaseInsensitive.cpp +++ b/deps/chakrashim/core/lib/Parser/CaseInsensitive.cpp @@ -56,532 +56,409 @@ namespace UnifiedRegex } }; -/* -We first construct a total map from character codes to equivalence lists such that: - - if ToUpper(c1) == ToUpper(c2) then c1 has c2 in its equivalence list - - if c1 and c2 appear in the same equivalence list then c1 and c2 have equal equivalence lists - -We then compress the above map such that: - - characters with singleton equivalence classes are elided - - consecutive characters with consecutive equivalence lists are represented as a range and delta - - the result is in strictly increasing range order - -Using gawk the above is: - gawk -f equiv.gawk http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt | gawk -f table.gawk - -Where equiv.gawk is: ----------------------------------------------------------------------- -BEGIN { - FS = ";"; - previncode = -1; -} -length($1) == 4 { - incode = strtonum("0x" $1); - for (i = previncode + 1; i < incode; i++) - map[i] = i; - if ($3 == "Ll" && $15 != "") - { - map[incode] = strtonum("0x" $15); - # non-7-bit-ASCII cannot map to 7-bit-ASCII - if (incode > 127 && map[incode] <= 127) - map[incode] = incode; - } - else - map[incode] = incode; - previncode = incode; -} -END { - for (i = previncode + 1; i <= 0xffff; i++) - map[i] = i; - - for (i = 0x0000; i <= 0xffff; i++) - ninv[i] = 0; - - for (i = 0x0000; i <= 0xffff; i++) - { - if (map[i] != i) - ninv[map[i]]++; - } - - maxninv = 0; - for (i = 0x0000; i <= 0xffff; i++) - { - if (ninv[i] > maxninv) - maxninv = ninv[i]; - } - if (maxninv > 2) - print "ERROR"; - - for (i = 0x0000; i <= 0xffff; i++) - inv[i] = ""; - - for (i = 0x0000; i <= 0xffff; i++) - { - if (map[i] != i) - inv[map[i]] = sprintf("%s;0x%04x", inv[map[i]], i); - } - - for (i = 0x0000; i <= 0xffff; i++) - { - if (map[i] != i) - { - equiv[i] = sprintf("0x%04x%s", map[i], inv[map[i]]); - nequiv[i] = 1 + ninv[map[i]]; - } - else if (inv[i] != "") - { - equiv[i] = sprintf("0x%04x%s", i, inv[i]); - nequiv[i] = 1 + ninv[i]; - } - else - { - equiv[i] = sprintf("0x%04x", i); - nequiv[i] = 1; - } - } - - nentries = 0 - for (i = 0x0000; i <= 0xffff; i++) - { - if (nequiv[i] > 1) - { - printf("0x%04x;%s\n", i, equiv[i]); - nentries++; - } - } - #printf("nentries = %d\n", nentries); -} ----------------------------------------------------------------------- - -And table.gawk is: ----------------------------------------------------------------------- -BEGIN { - FS = ";"; - lastCode = -1; - currStart = -1; - for (i = 0; i < 3; i++) - currDeltas[i] = ""; -} -{ - if (NF > 4) - print "ERROR" - - incode = strtonum($1); - for (i = 0; i < NF - 1; i++) - equivs[i] = strtonum($(i+2)); - for (i = NF - 1; i < 3; i++) - equivs[i] = equivs[i - 1]; - - #printf("0x%04x, 0x%04x, 0x%04x, 0x%04x\n", incode, equivs[0], equivs[1], equivs[2]); - - for (i = 0; i < 3; i++) - deltas[i] = equivs[i] - incode; - - if (currStart < 0) - { - # start a new range - currStart = incode; - for (i = 0; i < 3; i++) - currDeltas[i] = deltas[i] - } - else if (incode == lastCode + 1 && deltas[0] == currDeltas[0] && deltas[1] == currDeltas[1] && deltas[2] == currDeltas[2]) - { - # keep accumulating range - } - else - { - # dump current range and start a new one - printf(" 0x%04x, 0x%04x, %d, %d, %d,\n", currStart, lastCode, currDeltas[0], currDeltas[1], currDeltas[2]); - currStart = incode; - for (i = 0; i < 3; i++) - currDeltas[i] = deltas[i] - } - - lastCode = incode; -} -END { - printf(" 0x%04x, 0x%04x, %d, %d, %d,\n", currStart, lastCode, currDeltas[0], currDeltas[1], currDeltas[2]); -} ----------------------------------------------------------------------- -*/ - // For case-folding entries, version 8.0.0 of CaseFolding.txt located at [1] was used. // [1] http://www.unicode.org/Public/8.0.0/ucd/CaseFolding.txt - static const Transform transforms[] = + static constexpr Transform transforms[] = { - 1, MappingSource::UnicodeData, 0x0041, 0x004a, 0, 32, 32, 32, - 1, MappingSource::CaseFolding, 0x004b, 0x004b, 0, 32, 8415, 8415, - 1, MappingSource::UnicodeData, 0x004b, 0x0052, 0, 32, 32, 32, - 1, MappingSource::CaseFolding, 0x0053, 0x0053, 0, 32, 300, 300, - 1, MappingSource::UnicodeData, 0x0053, 0x005a, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x0061, 0x006a, -32, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x006b, 0x006b, -32, 0, 8383, 8383, - 1, MappingSource::UnicodeData, 0x006b, 0x0072, -32, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x0073, 0x0073, -32, 0, 268, 268, - 1, MappingSource::UnicodeData, 0x0073, 0x007a, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x00b5, 0x00b5, 0, 743, 775, 775, - 1, MappingSource::UnicodeData, 0x00c0, 0x00c4, 0, 32, 32, 32, - 1, MappingSource::CaseFolding, 0x00c5, 0x00c5, 0, 32, 8294, 8294, - 1, MappingSource::UnicodeData, 0x00c5, 0x00d6, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x00d8, 0x00de, 0, 32, 32, 32, - 1, MappingSource::CaseFolding, 0x00df, 0x00df, 0, 7615, 7615, 7615, - 1, MappingSource::UnicodeData, 0x00e0, 0x00e4, -32, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x00e5, 0x00e5, -32, 0, 8262, 8262, - 1, MappingSource::UnicodeData, 0x00e5, 0x00f6, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x00f8, 0x00fe, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x00ff, 0x00ff, 0, 121, 121, 121, - 2, MappingSource::UnicodeData, 0x0100, 0x012f, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0x0132, 0x0137, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0x0139, 0x0148, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0x014a, 0x0177, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0178, 0x0178, -121, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x0179, 0x017e, -1, 1, 1, 1, - 1, MappingSource::CaseFolding, 0x017f, 0x017f, -300, -268, 0, 0, - 1, MappingSource::UnicodeData, 0x0180, 0x0180, 0, 195, 195, 195, - 1, MappingSource::UnicodeData, 0x0181, 0x0181, 0, 210, 210, 210, - 2, MappingSource::UnicodeData, 0x0182, 0x0185, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0186, 0x0186, 0, 206, 206, 206, - 1, MappingSource::UnicodeData, 0x0187, 0x0187, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0188, 0x0188, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0189, 0x018a, 0, 205, 205, 205, - 1, MappingSource::UnicodeData, 0x018b, 0x018b, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x018c, 0x018c, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x018e, 0x018e, 0, 79, 79, 79, - 1, MappingSource::UnicodeData, 0x018f, 0x018f, 0, 202, 202, 202, - 1, MappingSource::UnicodeData, 0x0190, 0x0190, 0, 203, 203, 203, - 1, MappingSource::UnicodeData, 0x0191, 0x0191, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0192, 0x0192, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0193, 0x0193, 0, 205, 205, 205, - 1, MappingSource::UnicodeData, 0x0194, 0x0194, 0, 207, 207, 207, - 1, MappingSource::UnicodeData, 0x0195, 0x0195, 0, 97, 97, 97, - 1, MappingSource::UnicodeData, 0x0196, 0x0196, 0, 211, 211, 211, - 1, MappingSource::UnicodeData, 0x0197, 0x0197, 0, 209, 209, 209, - 1, MappingSource::UnicodeData, 0x0198, 0x0198, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0199, 0x0199, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x019a, 0x019a, 0, 163, 163, 163, - 1, MappingSource::UnicodeData, 0x019c, 0x019c, 0, 211, 211, 211, - 1, MappingSource::UnicodeData, 0x019d, 0x019d, 0, 213, 213, 213, - 1, MappingSource::UnicodeData, 0x019e, 0x019e, 0, 130, 130, 130, - 1, MappingSource::UnicodeData, 0x019f, 0x019f, 0, 214, 214, 214, - 2, MappingSource::UnicodeData, 0x01a0, 0x01a5, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01a6, 0x01a6, 0, 218, 218, 218, - 1, MappingSource::UnicodeData, 0x01a7, 0x01a7, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01a8, 0x01a8, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x01a9, 0x01a9, 0, 218, 218, 218, - 1, MappingSource::UnicodeData, 0x01ac, 0x01ac, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01ad, 0x01ad, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x01ae, 0x01ae, 0, 218, 218, 218, - 1, MappingSource::UnicodeData, 0x01af, 0x01af, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01b0, 0x01b0, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x01b1, 0x01b2, 0, 217, 217, 217, - 1, MappingSource::UnicodeData, 0x01b3, 0x01b3, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01b4, 0x01b4, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x01b5, 0x01b5, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01b6, 0x01b6, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x01b7, 0x01b7, 0, 219, 219, 219, - 1, MappingSource::UnicodeData, 0x01b8, 0x01b8, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01b9, 0x01b9, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x01bc, 0x01bc, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01bd, 0x01bd, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x01bf, 0x01bf, 0, 56, 56, 56, - 1, MappingSource::UnicodeData, 0x01c4, 0x01c4, 0, 1, 2, 2, - 1, MappingSource::UnicodeData, 0x01c5, 0x01c5, -1, 0, 1, 1, - 1, MappingSource::UnicodeData, 0x01c6, 0x01c6, -2, -1, 0, 0, - 1, MappingSource::UnicodeData, 0x01c7, 0x01c7, 0, 1, 2, 2, - 1, MappingSource::UnicodeData, 0x01c8, 0x01c8, -1, 0, 1, 1, - 1, MappingSource::UnicodeData, 0x01c9, 0x01c9, -2, -1, 0, 0, - 1, MappingSource::UnicodeData, 0x01ca, 0x01ca, 0, 1, 2, 2, - 1, MappingSource::UnicodeData, 0x01cb, 0x01cb, -1, 0, 1, 1, - 1, MappingSource::UnicodeData, 0x01cc, 0x01cc, -2, -1, 0, 0, - 2, MappingSource::UnicodeData, 0x01cd, 0x01dc, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01dd, 0x01dd, -79, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x01de, 0x01ef, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01f1, 0x01f1, 0, 1, 2, 2, - 1, MappingSource::UnicodeData, 0x01f2, 0x01f2, -1, 0, 1, 1, - 1, MappingSource::UnicodeData, 0x01f3, 0x01f3, -2, -1, 0, 0, - 2, MappingSource::UnicodeData, 0x01f4, 0x01f5, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x01f6, 0x01f6, -97, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x01f7, 0x01f7, -56, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x01f8, 0x021f, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0220, 0x0220, -130, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x0222, 0x0233, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x023a, 0x023a, 0, 10795, 10795, 10795, - 1, MappingSource::UnicodeData, 0x023b, 0x023b, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x023c, 0x023c, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x023d, 0x023d, -163, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x023e, 0x023e, 0, 10792, 10792, 10792, - 1, MappingSource::UnicodeData, 0x023f, 0x0240, 0, 10815, 10815, 10815, - 1, MappingSource::UnicodeData, 0x0241, 0x0241, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0242, 0x0242, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0243, 0x0243, -195, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0244, 0x0244, 0, 69, 69, 69, - 1, MappingSource::UnicodeData, 0x0245, 0x0245, 0, 71, 71, 71, - 2, MappingSource::UnicodeData, 0x0246, 0x024f, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0250, 0x0250, 0, 10783, 10783, 10783, - 1, MappingSource::UnicodeData, 0x0251, 0x0251, 0, 10780, 10780, 10780, - 1, MappingSource::UnicodeData, 0x0252, 0x0252, 0, 10782, 10782, 10782, - 1, MappingSource::UnicodeData, 0x0253, 0x0253, -210, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0254, 0x0254, -206, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0256, 0x0257, -205, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0259, 0x0259, -202, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x025b, 0x025b, -203, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x025c, 0x025c, 0, 42319, 42319, 42319, - 1, MappingSource::UnicodeData, 0x0260, 0x0260, -205, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0261, 0x0261, 0, 42315, 42315, 42315, - 1, MappingSource::UnicodeData, 0x0263, 0x0263, -207, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0265, 0x0265, 0, 42280, 42280, 42280, - 1, MappingSource::UnicodeData, 0x0266, 0x0266, 0, 42308, 42308, 42308, - 1, MappingSource::UnicodeData, 0x0268, 0x0268, -209, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0269, 0x0269, -211, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x026b, 0x026b, 0, 10743, 10743, 10743, - 1, MappingSource::UnicodeData, 0x026c, 0x026c, 0, 42305, 42305, 42305, - 1, MappingSource::UnicodeData, 0x026f, 0x026f, -211, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0271, 0x0271, 0, 10749, 10749, 10749, - 1, MappingSource::UnicodeData, 0x0272, 0x0272, -213, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0275, 0x0275, -214, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x027d, 0x027d, 0, 10727, 10727, 10727, - 1, MappingSource::UnicodeData, 0x0280, 0x0280, -218, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0283, 0x0283, -218, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0287, 0x0287, 0, 42282, 42282, 42282, - 1, MappingSource::UnicodeData, 0x0288, 0x0288, -218, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0289, 0x0289, -69, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x028a, 0x028b, -217, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x028c, 0x028c, -71, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0292, 0x0292, -219, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x029d, 0x029d, 0, 42261, 42261, 42261, - 1, MappingSource::UnicodeData, 0x029e, 0x029e, 0, 42258, 42258, 42258, - 1, MappingSource::UnicodeData, 0x0345, 0x0345, 0, 84, 116, 7289, - 2, MappingSource::UnicodeData, 0x0370, 0x0373, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0376, 0x0376, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0377, 0x0377, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x037b, 0x037d, 0, 130, 130, 130, - 1, MappingSource::UnicodeData, 0x037f, 0x037f, 0, 116, 116, 116, - 1, MappingSource::UnicodeData, 0x0386, 0x0386, 0, 38, 38, 38, - 1, MappingSource::UnicodeData, 0x0388, 0x038a, 0, 37, 37, 37, - 1, MappingSource::UnicodeData, 0x038c, 0x038c, 0, 64, 64, 64, - 1, MappingSource::UnicodeData, 0x038e, 0x038f, 0, 63, 63, 63, - 1, MappingSource::UnicodeData, 0x0391, 0x0391, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x0392, 0x0392, 0, 32, 62, 62, - 1, MappingSource::UnicodeData, 0x0393, 0x0394, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x0395, 0x0395, 0, 32, 96, 96, - 1, MappingSource::UnicodeData, 0x0396, 0x0397, 0, 32, 32, 32, - 1, MappingSource::CaseFolding, 0x0398, 0x0398, 0, 32, 57, 92, - 1, MappingSource::UnicodeData, 0x0398, 0x0398, 0, 32, 57, 57, - 1, MappingSource::UnicodeData, 0x0399, 0x0399, -84, 0, 32, 7205, - 1, MappingSource::UnicodeData, 0x039a, 0x039a, 0, 32, 86, 86, - 1, MappingSource::UnicodeData, 0x039b, 0x039b, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x039c, 0x039c, -743, 0, 32, 32, - 1, MappingSource::UnicodeData, 0x039d, 0x039f, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x03a0, 0x03a0, 0, 32, 54, 54, - 1, MappingSource::UnicodeData, 0x03a1, 0x03a1, 0, 32, 80, 80, - 1, MappingSource::UnicodeData, 0x03a3, 0x03a3, 0, 31, 32, 32, - 1, MappingSource::UnicodeData, 0x03a4, 0x03a5, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x03a6, 0x03a6, 0, 32, 47, 47, - 1, MappingSource::UnicodeData, 0x03a7, 0x03a8, 0, 32, 32, 32, - 1, MappingSource::CaseFolding, 0x03a9, 0x03a9, 0, 32, 7549, 7549, - 1, MappingSource::UnicodeData, 0x03a9, 0x03ab, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x03ac, 0x03ac, -38, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03ad, 0x03af, -37, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03b1, 0x03b1, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03b2, 0x03b2, -32, 0, 30, 30, - 1, MappingSource::UnicodeData, 0x03b3, 0x03b4, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03b5, 0x03b5, -32, 0, 64, 64, - 1, MappingSource::UnicodeData, 0x03b6, 0x03b7, -32, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x03b8, 0x03b8, -32, 0, 25, 60, - 1, MappingSource::UnicodeData, 0x03b8, 0x03b8, -32, 0, 25, 25, - 1, MappingSource::UnicodeData, 0x03b9, 0x03b9, -116, -32, 0, 7173, - 1, MappingSource::UnicodeData, 0x03ba, 0x03ba, -32, 0, 54, 54, - 1, MappingSource::UnicodeData, 0x03bb, 0x03bb, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03bc, 0x03bc, -775, -32, 0, 0, - 1, MappingSource::UnicodeData, 0x03bd, 0x03bf, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03c0, 0x03c0, -32, 0, 22, 22, - 1, MappingSource::UnicodeData, 0x03c1, 0x03c1, -32, 0, 48, 48, - 1, MappingSource::UnicodeData, 0x03c2, 0x03c2, -31, 0, 1, 1, - 1, MappingSource::UnicodeData, 0x03c3, 0x03c3, -32, -1, 0, 0, - 1, MappingSource::UnicodeData, 0x03c4, 0x03c5, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03c6, 0x03c6, -32, 0, 15, 15, - 1, MappingSource::UnicodeData, 0x03c7, 0x03c8, -32, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x03c9, 0x03c9, -32, 0, 7517, 7517, - 1, MappingSource::UnicodeData, 0x03c9, 0x03cb, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03cc, 0x03cc, -64, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03cd, 0x03ce, -63, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03cf, 0x03cf, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x03d0, 0x03d0, -62, -30, 0, 0, - 1, MappingSource::CaseFolding, 0x03d1, 0x03d1, -57, -25, 0, 35, - 1, MappingSource::UnicodeData, 0x03d1, 0x03d1, -57, -25, 0, 0, - 1, MappingSource::UnicodeData, 0x03d5, 0x03d5, -47, -15, 0, 0, - 1, MappingSource::UnicodeData, 0x03d6, 0x03d6, -54, -22, 0, 0, - 1, MappingSource::UnicodeData, 0x03d7, 0x03d7, -8, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x03d8, 0x03ef, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x03f0, 0x03f0, -86, -54, 0, 0, - 1, MappingSource::UnicodeData, 0x03f1, 0x03f1, -80, -48, 0, 0, - 1, MappingSource::UnicodeData, 0x03f2, 0x03f2, 0, 7, 7, 7, - 1, MappingSource::UnicodeData, 0x03f3, 0x03f3, -116, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x03f4, 0x03f4, -92, -60, -35, 0, - 1, MappingSource::UnicodeData, 0x03f5, 0x03f5, -96, -64, 0, 0, - 1, MappingSource::UnicodeData, 0x03f7, 0x03f7, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x03f8, 0x03f8, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03f9, 0x03f9, -7, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03fa, 0x03fa, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x03fb, 0x03fb, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x03fd, 0x03ff, -130, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0400, 0x040f, 0, 80, 80, 80, - 1, MappingSource::UnicodeData, 0x0410, 0x042f, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0x0430, 0x044f, -32, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x0450, 0x045f, -80, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x0460, 0x0481, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0x048a, 0x04bf, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x04c0, 0x04c0, 0, 15, 15, 15, - 2, MappingSource::UnicodeData, 0x04c1, 0x04ce, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x04cf, 0x04cf, -15, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x04d0, 0x052f, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x0531, 0x0556, 0, 48, 48, 48, - 1, MappingSource::UnicodeData, 0x0561, 0x0586, -48, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x10a0, 0x10c5, 0, 7264, 7264, 7264, - 1, MappingSource::UnicodeData, 0x10c7, 0x10c7, 0, 7264, 7264, 7264, - 1, MappingSource::UnicodeData, 0x10cd, 0x10cd, 0, 7264, 7264, 7264, - 1, MappingSource::CaseFolding, 0x13a0, 0x13ef, 0, 38864, 38864, 38864, - 1, MappingSource::CaseFolding, 0x13f0, 0x13f5, 0, 8, 8, 8, - 1, MappingSource::CaseFolding, 0x13f8, 0x13fd, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1d79, 0x1d79, 0, 35332, 35332, 35332, - 1, MappingSource::UnicodeData, 0x1d7d, 0x1d7d, 0, 3814, 3814, 3814, - 2, MappingSource::UnicodeData, 0x1e00, 0x1e5f, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x1e60, 0x1e60, 0, 1, 59, 59, - 1, MappingSource::UnicodeData, 0x1e61, 0x1e61, -1, 0, 58, 58, - 2, MappingSource::UnicodeData, 0x1e62, 0x1e95, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x1e9b, 0x1e9b, -59, -58, 0, 0, - 1, MappingSource::CaseFolding, 0x1e9e, 0x1e9e, -7615, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x1ea0, 0x1eff, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x1f00, 0x1f07, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f08, 0x1f0f, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f10, 0x1f15, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f18, 0x1f1d, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f20, 0x1f27, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f28, 0x1f2f, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f30, 0x1f37, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f38, 0x1f3f, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f40, 0x1f45, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f48, 0x1f4d, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f51, 0x1f51, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f53, 0x1f53, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f55, 0x1f55, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f57, 0x1f57, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f59, 0x1f59, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f5b, 0x1f5b, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f5d, 0x1f5d, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f5f, 0x1f5f, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f60, 0x1f67, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1f68, 0x1f6f, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1f70, 0x1f71, 0, 74, 74, 74, - 1, MappingSource::UnicodeData, 0x1f72, 0x1f75, 0, 86, 86, 86, - 1, MappingSource::UnicodeData, 0x1f76, 0x1f77, 0, 100, 100, 100, - 1, MappingSource::UnicodeData, 0x1f78, 0x1f79, 0, 128, 128, 128, - 1, MappingSource::UnicodeData, 0x1f7a, 0x1f7b, 0, 112, 112, 112, - 1, MappingSource::UnicodeData, 0x1f7c, 0x1f7d, 0, 126, 126, 126, - 1, MappingSource::CaseFolding, 0x1f80, 0x1f87, 0, 8, 8, 8, - 1, MappingSource::CaseFolding, 0x1f88, 0x1f8f, -8, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x1f90, 0x1f97, 0, 8, 8, 8, - 1, MappingSource::CaseFolding, 0x1f98, 0x1f9f, -8, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x1fa0, 0x1fa7, 0, 8, 8, 8, - 1, MappingSource::CaseFolding, 0x1fa8, 0x1faf, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1fb0, 0x1fb1, 0, 8, 8, 8, - 1, MappingSource::CaseFolding, 0x1fb3, 0x1fb3, 0, 9, 9, 9, - 1, MappingSource::UnicodeData, 0x1fb8, 0x1fb9, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1fba, 0x1fbb, -74, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x1fbc, 0x1fbc, -9, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1fbe, 0x1fbe, -7289, -7205, -7173, 0, - 1, MappingSource::CaseFolding, 0x1fc3, 0x1fc3, 0, 9, 9, 9, - 1, MappingSource::UnicodeData, 0x1fc8, 0x1fcb, -86, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x1fcc, 0x1fcc, -9, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1fd0, 0x1fd1, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1fd8, 0x1fd9, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1fda, 0x1fdb, -100, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1fe0, 0x1fe1, 0, 8, 8, 8, - 1, MappingSource::UnicodeData, 0x1fe5, 0x1fe5, 0, 7, 7, 7, - 1, MappingSource::UnicodeData, 0x1fe8, 0x1fe9, -8, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1fea, 0x1feb, -112, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1fec, 0x1fec, -7, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x1ff3, 0x1ff3, 0, 9, 9, 9, - 1, MappingSource::UnicodeData, 0x1ff8, 0x1ff9, -128, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x1ffa, 0x1ffb, -126, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x1ffc, 0x1ffc, -9, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x2126, 0x2126, -7549, -7517, 0, 0, - 1, MappingSource::CaseFolding, 0x212a, 0x212a, -8415, -8383, 0, 0, - 1, MappingSource::CaseFolding, 0x212b, 0x212b, -8294, -8262, 0, 0, - 1, MappingSource::UnicodeData, 0x2132, 0x2132, 0, 28, 28, 28, - 1, MappingSource::UnicodeData, 0x214e, 0x214e, -28, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2160, 0x216f, 0, 16, 16, 16, - 1, MappingSource::UnicodeData, 0x2170, 0x217f, -16, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2183, 0x2183, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x2184, 0x2184, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x24b6, 0x24cf, 0, 26, 26, 26, - 1, MappingSource::UnicodeData, 0x24d0, 0x24e9, -26, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c00, 0x2c2e, 0, 48, 48, 48, - 1, MappingSource::UnicodeData, 0x2c30, 0x2c5e, -48, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c60, 0x2c60, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x2c61, 0x2c61, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c62, 0x2c62, -10743, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c63, 0x2c63, -3814, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c64, 0x2c64, -10727, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c65, 0x2c65, -10795, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c66, 0x2c66, -10792, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x2c67, 0x2c6c, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x2c6d, 0x2c6d, -10780, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c6e, 0x2c6e, -10749, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c6f, 0x2c6f, -10783, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c70, 0x2c70, -10782, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c72, 0x2c72, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x2c73, 0x2c73, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c75, 0x2c75, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x2c76, 0x2c76, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2c7e, 0x2c7f, -10815, 0, 0, 0, - 2, MappingSource::UnicodeData, 0x2c80, 0x2ce3, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0x2ceb, 0x2cee, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0x2cf2, 0x2cf3, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0x2d00, 0x2d25, -7264, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2d27, 0x2d27, -7264, 0, 0, 0, - 1, MappingSource::UnicodeData, 0x2d2d, 0x2d2d, -7264, 0, 0, 0, - 2, MappingSource::UnicodeData, 0xa640, 0xa66d, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0xa680, 0xa69b, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0xa722, 0xa72f, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0xa732, 0xa76f, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0xa779, 0xa77c, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0xa77d, 0xa77d, -35332, 0, 0, 0, - 2, MappingSource::UnicodeData, 0xa77e, 0xa787, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0xa78b, 0xa78b, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0xa78c, 0xa78c, -1, 0, 0, 0, - 1, MappingSource::UnicodeData, 0xa78d, 0xa78d, -42280, 0, 0, 0, - 1, MappingSource::UnicodeData, 0xa790, 0xa790, 0, 1, 1, 1, - 1, MappingSource::UnicodeData, 0xa791, 0xa791, -1, 0, 0, 0, - 2, MappingSource::UnicodeData, 0xa792, 0xa793, -1, 1, 1, 1, - 2, MappingSource::UnicodeData, 0xa796, 0xa7a9, -1, 1, 1, 1, - 1, MappingSource::UnicodeData, 0xa7aa, 0xa7aa, -42308, 0, 0, 0, - 1, MappingSource::UnicodeData, 0xa7ab, 0xa7ab, -42319, 0, 0, 0, - 1, MappingSource::UnicodeData, 0xa7ac, 0xa7ac, -42315, 0, 0, 0, - 1, MappingSource::UnicodeData, 0xa7ad, 0xa7ad, -42305, 0, 0, 0, - 1, MappingSource::UnicodeData, 0xa7b0, 0xa7b0, -42258, 0, 0, 0, - 1, MappingSource::UnicodeData, 0xa7b1, 0xa7b1, -42282, 0, 0, 0, - 1, MappingSource::CaseFolding, 0xa7b2, 0xa7b2, -42261, 0, 0, 0, - 1, MappingSource::CaseFolding, 0xa7b3, 0xa7b3, 0, 928, 928, 928, - 2, MappingSource::CaseFolding, 0xa7b4, 0xa7b7, -1, 1, 1, 1, - 1, MappingSource::CaseFolding, 0xab53, 0xab53, -928, 0, 0, 0, - 1, MappingSource::CaseFolding, 0xab70, 0xabbf, -38864, 0, 0, 0, - 1, MappingSource::UnicodeData, 0xff21, 0xff3a, 0, 32, 32, 32, - 1, MappingSource::UnicodeData, 0xff41, 0xff5a, -32, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x10400, 0x10427, 0, 40, 40, 40, - 1, MappingSource::CaseFolding, 0x10428, 0x1044f, -40, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x10c80, 0x10cb2, 0, 64, 64, 64, - 1, MappingSource::CaseFolding, 0x10cc0, 0x10cf2, -64, 0, 0, 0, - 1, MappingSource::CaseFolding, 0x118a0, 0x118bf, 0, 32, 32, 32, - 1, MappingSource::CaseFolding, 0x118c0, 0x118df, -32, 0, 0, 0, + { 1, MappingSource::UnicodeData, 0x0041, 0x004a, 0, 32, 32, 32 }, + { 1, MappingSource::CaseFolding, 0x004b, 0x004b, 0, 32, 8415, 8415 }, + { 1, MappingSource::UnicodeData, 0x004b, 0x0052, 0, 32, 32, 32 }, + { 1, MappingSource::CaseFolding, 0x0053, 0x0053, 0, 32, 300, 300 }, + { 1, MappingSource::UnicodeData, 0x0053, 0x005a, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x0061, 0x006a, -32, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x006b, 0x006b, -32, 0, 8383, 8383 }, + { 1, MappingSource::UnicodeData, 0x006b, 0x0072, -32, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x0073, 0x0073, -32, 0, 268, 268 }, + { 1, MappingSource::UnicodeData, 0x0073, 0x007a, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x00b5, 0x00b5, 0, 743, 775, 775 }, + { 1, MappingSource::UnicodeData, 0x00c0, 0x00c4, 0, 32, 32, 32 }, + { 1, MappingSource::CaseFolding, 0x00c5, 0x00c5, 0, 32, 8294, 8294 }, + { 1, MappingSource::UnicodeData, 0x00c5, 0x00d6, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x00d8, 0x00de, 0, 32, 32, 32 }, + { 1, MappingSource::CaseFolding, 0x00df, 0x00df, 0, 7615, 7615, 7615 }, + { 1, MappingSource::UnicodeData, 0x00e0, 0x00e4, -32, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x00e5, 0x00e5, -32, 0, 8262, 8262 }, + { 1, MappingSource::UnicodeData, 0x00e5, 0x00f6, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x00f8, 0x00fe, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x00ff, 0x00ff, 0, 121, 121, 121 }, + { 2, MappingSource::UnicodeData, 0x0100, 0x012f, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0x0132, 0x0137, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0x0139, 0x0148, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0x014a, 0x0177, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0178, 0x0178, -121, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x0179, 0x017e, -1, 1, 1, 1 }, + { 1, MappingSource::CaseFolding, 0x017f, 0x017f, -300, -268, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0180, 0x0180, 0, 195, 195, 195 }, + { 1, MappingSource::UnicodeData, 0x0181, 0x0181, 0, 210, 210, 210 }, + { 2, MappingSource::UnicodeData, 0x0182, 0x0185, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0186, 0x0186, 0, 206, 206, 206 }, + { 1, MappingSource::UnicodeData, 0x0187, 0x0187, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0188, 0x0188, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0189, 0x018a, 0, 205, 205, 205 }, + { 1, MappingSource::UnicodeData, 0x018b, 0x018b, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x018c, 0x018c, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x018e, 0x018e, 0, 79, 79, 79 }, + { 1, MappingSource::UnicodeData, 0x018f, 0x018f, 0, 202, 202, 202 }, + { 1, MappingSource::UnicodeData, 0x0190, 0x0190, 0, 203, 203, 203 }, + { 1, MappingSource::UnicodeData, 0x0191, 0x0191, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0192, 0x0192, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0193, 0x0193, 0, 205, 205, 205 }, + { 1, MappingSource::UnicodeData, 0x0194, 0x0194, 0, 207, 207, 207 }, + { 1, MappingSource::UnicodeData, 0x0195, 0x0195, 0, 97, 97, 97 }, + { 1, MappingSource::UnicodeData, 0x0196, 0x0196, 0, 211, 211, 211 }, + { 1, MappingSource::UnicodeData, 0x0197, 0x0197, 0, 209, 209, 209 }, + { 1, MappingSource::UnicodeData, 0x0198, 0x0198, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0199, 0x0199, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x019a, 0x019a, 0, 163, 163, 163 }, + { 1, MappingSource::UnicodeData, 0x019c, 0x019c, 0, 211, 211, 211 }, + { 1, MappingSource::UnicodeData, 0x019d, 0x019d, 0, 213, 213, 213 }, + { 1, MappingSource::UnicodeData, 0x019e, 0x019e, 0, 130, 130, 130 }, + { 1, MappingSource::UnicodeData, 0x019f, 0x019f, 0, 214, 214, 214 }, + { 2, MappingSource::UnicodeData, 0x01a0, 0x01a5, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01a6, 0x01a6, 0, 218, 218, 218 }, + { 1, MappingSource::UnicodeData, 0x01a7, 0x01a7, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01a8, 0x01a8, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01a9, 0x01a9, 0, 218, 218, 218 }, + { 1, MappingSource::UnicodeData, 0x01ac, 0x01ac, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01ad, 0x01ad, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01ae, 0x01ae, 0, 218, 218, 218 }, + { 1, MappingSource::UnicodeData, 0x01af, 0x01af, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01b0, 0x01b0, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01b1, 0x01b2, 0, 217, 217, 217 }, + { 1, MappingSource::UnicodeData, 0x01b3, 0x01b3, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01b4, 0x01b4, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01b5, 0x01b5, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01b6, 0x01b6, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01b7, 0x01b7, 0, 219, 219, 219 }, + { 1, MappingSource::UnicodeData, 0x01b8, 0x01b8, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01b9, 0x01b9, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01bc, 0x01bc, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01bd, 0x01bd, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01bf, 0x01bf, 0, 56, 56, 56 }, + { 1, MappingSource::UnicodeData, 0x01c4, 0x01c4, 0, 1, 2, 2 }, + { 1, MappingSource::UnicodeData, 0x01c5, 0x01c5, -1, 0, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01c6, 0x01c6, -2, -1, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01c7, 0x01c7, 0, 1, 2, 2 }, + { 1, MappingSource::UnicodeData, 0x01c8, 0x01c8, -1, 0, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01c9, 0x01c9, -2, -1, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01ca, 0x01ca, 0, 1, 2, 2 }, + { 1, MappingSource::UnicodeData, 0x01cb, 0x01cb, -1, 0, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01cc, 0x01cc, -2, -1, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x01cd, 0x01dc, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01dd, 0x01dd, -79, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x01de, 0x01ef, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01f1, 0x01f1, 0, 1, 2, 2 }, + { 1, MappingSource::UnicodeData, 0x01f2, 0x01f2, -1, 0, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01f3, 0x01f3, -2, -1, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x01f4, 0x01f5, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x01f6, 0x01f6, -97, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x01f7, 0x01f7, -56, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x01f8, 0x021f, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0220, 0x0220, -130, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x0222, 0x0233, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x023a, 0x023a, 0, 10795, 10795, 10795 }, + { 1, MappingSource::UnicodeData, 0x023b, 0x023b, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x023c, 0x023c, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x023d, 0x023d, -163, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x023e, 0x023e, 0, 10792, 10792, 10792 }, + { 1, MappingSource::UnicodeData, 0x023f, 0x0240, 0, 10815, 10815, 10815 }, + { 1, MappingSource::UnicodeData, 0x0241, 0x0241, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0242, 0x0242, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0243, 0x0243, -195, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0244, 0x0244, 0, 69, 69, 69 }, + { 1, MappingSource::UnicodeData, 0x0245, 0x0245, 0, 71, 71, 71 }, + { 2, MappingSource::UnicodeData, 0x0246, 0x024f, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0250, 0x0250, 0, 10783, 10783, 10783 }, + { 1, MappingSource::UnicodeData, 0x0251, 0x0251, 0, 10780, 10780, 10780 }, + { 1, MappingSource::UnicodeData, 0x0252, 0x0252, 0, 10782, 10782, 10782 }, + { 1, MappingSource::UnicodeData, 0x0253, 0x0253, -210, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0254, 0x0254, -206, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0256, 0x0257, -205, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0259, 0x0259, -202, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x025b, 0x025b, -203, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x025c, 0x025c, 0, 42319, 42319, 42319 }, + { 1, MappingSource::UnicodeData, 0x0260, 0x0260, -205, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0261, 0x0261, 0, 42315, 42315, 42315 }, + { 1, MappingSource::UnicodeData, 0x0263, 0x0263, -207, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0265, 0x0265, 0, 42280, 42280, 42280 }, + { 1, MappingSource::UnicodeData, 0x0266, 0x0266, 0, 42308, 42308, 42308 }, + { 1, MappingSource::UnicodeData, 0x0268, 0x0268, -209, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0269, 0x0269, -211, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x026b, 0x026b, 0, 10743, 10743, 10743 }, + { 1, MappingSource::UnicodeData, 0x026c, 0x026c, 0, 42305, 42305, 42305 }, + { 1, MappingSource::UnicodeData, 0x026f, 0x026f, -211, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0271, 0x0271, 0, 10749, 10749, 10749 }, + { 1, MappingSource::UnicodeData, 0x0272, 0x0272, -213, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0275, 0x0275, -214, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x027d, 0x027d, 0, 10727, 10727, 10727 }, + { 1, MappingSource::UnicodeData, 0x0280, 0x0280, -218, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0283, 0x0283, -218, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0287, 0x0287, 0, 42282, 42282, 42282 }, + { 1, MappingSource::UnicodeData, 0x0288, 0x0288, -218, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0289, 0x0289, -69, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x028a, 0x028b, -217, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x028c, 0x028c, -71, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0292, 0x0292, -219, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x029d, 0x029d, 0, 42261, 42261, 42261 }, + { 1, MappingSource::UnicodeData, 0x029e, 0x029e, 0, 42258, 42258, 42258 }, + { 1, MappingSource::UnicodeData, 0x0345, 0x0345, 0, 84, 116, 7289 }, + { 2, MappingSource::UnicodeData, 0x0370, 0x0373, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0376, 0x0376, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0377, 0x0377, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x037b, 0x037d, 0, 130, 130, 130 }, + { 1, MappingSource::UnicodeData, 0x037f, 0x037f, 0, 116, 116, 116 }, + { 1, MappingSource::UnicodeData, 0x0386, 0x0386, 0, 38, 38, 38 }, + { 1, MappingSource::UnicodeData, 0x0388, 0x038a, 0, 37, 37, 37 }, + { 1, MappingSource::UnicodeData, 0x038c, 0x038c, 0, 64, 64, 64 }, + { 1, MappingSource::UnicodeData, 0x038e, 0x038f, 0, 63, 63, 63 }, + { 1, MappingSource::UnicodeData, 0x0391, 0x0391, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x0392, 0x0392, 0, 32, 62, 62 }, + { 1, MappingSource::UnicodeData, 0x0393, 0x0394, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x0395, 0x0395, 0, 32, 96, 96 }, + { 1, MappingSource::UnicodeData, 0x0396, 0x0397, 0, 32, 32, 32 }, + { 1, MappingSource::CaseFolding, 0x0398, 0x0398, 0, 32, 57, 92 }, + { 1, MappingSource::UnicodeData, 0x0398, 0x0398, 0, 32, 57, 57 }, + { 1, MappingSource::UnicodeData, 0x0399, 0x0399, -84, 0, 32, 7205 }, + { 1, MappingSource::UnicodeData, 0x039a, 0x039a, 0, 32, 86, 86 }, + { 1, MappingSource::UnicodeData, 0x039b, 0x039b, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x039c, 0x039c, -743, 0, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x039d, 0x039f, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x03a0, 0x03a0, 0, 32, 54, 54 }, + { 1, MappingSource::UnicodeData, 0x03a1, 0x03a1, 0, 32, 80, 80 }, + { 1, MappingSource::UnicodeData, 0x03a3, 0x03a3, 0, 31, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x03a4, 0x03a5, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x03a6, 0x03a6, 0, 32, 47, 47 }, + { 1, MappingSource::UnicodeData, 0x03a7, 0x03a8, 0, 32, 32, 32 }, + { 1, MappingSource::CaseFolding, 0x03a9, 0x03a9, 0, 32, 7549, 7549 }, + { 1, MappingSource::UnicodeData, 0x03a9, 0x03ab, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x03ac, 0x03ac, -38, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03ad, 0x03af, -37, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03b1, 0x03b1, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03b2, 0x03b2, -32, 0, 30, 30 }, + { 1, MappingSource::UnicodeData, 0x03b3, 0x03b4, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03b5, 0x03b5, -32, 0, 64, 64 }, + { 1, MappingSource::UnicodeData, 0x03b6, 0x03b7, -32, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x03b8, 0x03b8, -32, 0, 25, 60 }, + { 1, MappingSource::UnicodeData, 0x03b8, 0x03b8, -32, 0, 25, 25 }, + { 1, MappingSource::UnicodeData, 0x03b9, 0x03b9, -116, -32, 0, 7173 }, + { 1, MappingSource::UnicodeData, 0x03ba, 0x03ba, -32, 0, 54, 54 }, + { 1, MappingSource::UnicodeData, 0x03bb, 0x03bb, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03bc, 0x03bc, -775, -32, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03bd, 0x03bf, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03c0, 0x03c0, -32, 0, 22, 22 }, + { 1, MappingSource::UnicodeData, 0x03c1, 0x03c1, -32, 0, 48, 48 }, + { 1, MappingSource::UnicodeData, 0x03c2, 0x03c2, -31, 0, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x03c3, 0x03c3, -32, -1, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03c4, 0x03c5, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03c6, 0x03c6, -32, 0, 15, 15 }, + { 1, MappingSource::UnicodeData, 0x03c7, 0x03c8, -32, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x03c9, 0x03c9, -32, 0, 7517, 7517 }, + { 1, MappingSource::UnicodeData, 0x03c9, 0x03cb, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03cc, 0x03cc, -64, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03cd, 0x03ce, -63, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03cf, 0x03cf, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x03d0, 0x03d0, -62, -30, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x03d1, 0x03d1, -57, -25, 0, 35 }, + { 1, MappingSource::UnicodeData, 0x03d1, 0x03d1, -57, -25, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03d5, 0x03d5, -47, -15, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03d6, 0x03d6, -54, -22, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03d7, 0x03d7, -8, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x03d8, 0x03ef, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x03f0, 0x03f0, -86, -54, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03f1, 0x03f1, -80, -48, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03f2, 0x03f2, 0, 7, 7, 7 }, + { 1, MappingSource::UnicodeData, 0x03f3, 0x03f3, -116, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x03f4, 0x03f4, -92, -60, -35, 0 }, + { 1, MappingSource::UnicodeData, 0x03f5, 0x03f5, -96, -64, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03f7, 0x03f7, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x03f8, 0x03f8, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03f9, 0x03f9, -7, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03fa, 0x03fa, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x03fb, 0x03fb, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x03fd, 0x03ff, -130, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0400, 0x040f, 0, 80, 80, 80 }, + { 1, MappingSource::UnicodeData, 0x0410, 0x042f, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0x0430, 0x044f, -32, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x0450, 0x045f, -80, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x0460, 0x0481, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0x048a, 0x04bf, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x04c0, 0x04c0, 0, 15, 15, 15 }, + { 2, MappingSource::UnicodeData, 0x04c1, 0x04ce, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x04cf, 0x04cf, -15, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x04d0, 0x052f, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x0531, 0x0556, 0, 48, 48, 48 }, + { 1, MappingSource::UnicodeData, 0x0561, 0x0586, -48, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x10a0, 0x10c5, 0, 7264, 7264, 7264 }, + { 1, MappingSource::UnicodeData, 0x10c7, 0x10c7, 0, 7264, 7264, 7264 }, + { 1, MappingSource::UnicodeData, 0x10cd, 0x10cd, 0, 7264, 7264, 7264 }, + { 1, MappingSource::CaseFolding, 0x13a0, 0x13ef, 0, 38864, 38864, 38864 }, + { 1, MappingSource::CaseFolding, 0x13f0, 0x13f5, 0, 8, 8, 8 }, + { 1, MappingSource::CaseFolding, 0x13f8, 0x13fd, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1d79, 0x1d79, 0, 35332, 35332, 35332 }, + { 1, MappingSource::UnicodeData, 0x1d7d, 0x1d7d, 0, 3814, 3814, 3814 }, + { 2, MappingSource::UnicodeData, 0x1e00, 0x1e5f, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x1e60, 0x1e60, 0, 1, 59, 59 }, + { 1, MappingSource::UnicodeData, 0x1e61, 0x1e61, -1, 0, 58, 58 }, + { 2, MappingSource::UnicodeData, 0x1e62, 0x1e95, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x1e9b, 0x1e9b, -59, -58, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x1e9e, 0x1e9e, -7615, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x1ea0, 0x1eff, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x1f00, 0x1f07, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f08, 0x1f0f, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f10, 0x1f15, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f18, 0x1f1d, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f20, 0x1f27, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f28, 0x1f2f, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f30, 0x1f37, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f38, 0x1f3f, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f40, 0x1f45, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f48, 0x1f4d, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f51, 0x1f51, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f53, 0x1f53, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f55, 0x1f55, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f57, 0x1f57, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f59, 0x1f59, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f5b, 0x1f5b, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f5d, 0x1f5d, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f5f, 0x1f5f, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f60, 0x1f67, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1f68, 0x1f6f, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1f70, 0x1f71, 0, 74, 74, 74 }, + { 1, MappingSource::UnicodeData, 0x1f72, 0x1f75, 0, 86, 86, 86 }, + { 1, MappingSource::UnicodeData, 0x1f76, 0x1f77, 0, 100, 100, 100 }, + { 1, MappingSource::UnicodeData, 0x1f78, 0x1f79, 0, 128, 128, 128 }, + { 1, MappingSource::UnicodeData, 0x1f7a, 0x1f7b, 0, 112, 112, 112 }, + { 1, MappingSource::UnicodeData, 0x1f7c, 0x1f7d, 0, 126, 126, 126 }, + { 1, MappingSource::CaseFolding, 0x1f80, 0x1f87, 0, 8, 8, 8 }, + { 1, MappingSource::CaseFolding, 0x1f88, 0x1f8f, -8, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x1f90, 0x1f97, 0, 8, 8, 8 }, + { 1, MappingSource::CaseFolding, 0x1f98, 0x1f9f, -8, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x1fa0, 0x1fa7, 0, 8, 8, 8 }, + { 1, MappingSource::CaseFolding, 0x1fa8, 0x1faf, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1fb0, 0x1fb1, 0, 8, 8, 8 }, + { 1, MappingSource::CaseFolding, 0x1fb3, 0x1fb3, 0, 9, 9, 9 }, + { 1, MappingSource::UnicodeData, 0x1fb8, 0x1fb9, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1fba, 0x1fbb, -74, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x1fbc, 0x1fbc, -9, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1fbe, 0x1fbe, -7289, -7205, -7173, 0 }, + { 1, MappingSource::CaseFolding, 0x1fc3, 0x1fc3, 0, 9, 9, 9 }, + { 1, MappingSource::UnicodeData, 0x1fc8, 0x1fcb, -86, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x1fcc, 0x1fcc, -9, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1fd0, 0x1fd1, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1fd8, 0x1fd9, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1fda, 0x1fdb, -100, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1fe0, 0x1fe1, 0, 8, 8, 8 }, + { 1, MappingSource::UnicodeData, 0x1fe5, 0x1fe5, 0, 7, 7, 7 }, + { 1, MappingSource::UnicodeData, 0x1fe8, 0x1fe9, -8, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1fea, 0x1feb, -112, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1fec, 0x1fec, -7, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x1ff3, 0x1ff3, 0, 9, 9, 9 }, + { 1, MappingSource::UnicodeData, 0x1ff8, 0x1ff9, -128, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x1ffa, 0x1ffb, -126, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x1ffc, 0x1ffc, -9, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x2126, 0x2126, -7549, -7517, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x212a, 0x212a, -8415, -8383, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x212b, 0x212b, -8294, -8262, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2132, 0x2132, 0, 28, 28, 28 }, + { 1, MappingSource::UnicodeData, 0x214e, 0x214e, -28, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2160, 0x216f, 0, 16, 16, 16 }, + { 1, MappingSource::UnicodeData, 0x2170, 0x217f, -16, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2183, 0x2183, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x2184, 0x2184, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x24b6, 0x24cf, 0, 26, 26, 26 }, + { 1, MappingSource::UnicodeData, 0x24d0, 0x24e9, -26, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c00, 0x2c2e, 0, 48, 48, 48 }, + { 1, MappingSource::UnicodeData, 0x2c30, 0x2c5e, -48, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c60, 0x2c60, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x2c61, 0x2c61, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c62, 0x2c62, -10743, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c63, 0x2c63, -3814, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c64, 0x2c64, -10727, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c65, 0x2c65, -10795, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c66, 0x2c66, -10792, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x2c67, 0x2c6c, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x2c6d, 0x2c6d, -10780, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c6e, 0x2c6e, -10749, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c6f, 0x2c6f, -10783, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c70, 0x2c70, -10782, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c72, 0x2c72, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x2c73, 0x2c73, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c75, 0x2c75, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x2c76, 0x2c76, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2c7e, 0x2c7f, -10815, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0x2c80, 0x2ce3, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0x2ceb, 0x2cee, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0x2cf2, 0x2cf3, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0x2d00, 0x2d25, -7264, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2d27, 0x2d27, -7264, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0x2d2d, 0x2d2d, -7264, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0xa640, 0xa66d, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0xa680, 0xa69b, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0xa722, 0xa72f, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0xa732, 0xa76f, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0xa779, 0xa77c, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0xa77d, 0xa77d, -35332, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0xa77e, 0xa787, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0xa78b, 0xa78b, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0xa78c, 0xa78c, -1, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0xa78d, 0xa78d, -42280, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0xa790, 0xa790, 0, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0xa791, 0xa791, -1, 0, 0, 0 }, + { 2, MappingSource::UnicodeData, 0xa792, 0xa793, -1, 1, 1, 1 }, + { 2, MappingSource::UnicodeData, 0xa796, 0xa7a9, -1, 1, 1, 1 }, + { 1, MappingSource::UnicodeData, 0xa7aa, 0xa7aa, -42308, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0xa7ab, 0xa7ab, -42319, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0xa7ac, 0xa7ac, -42315, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0xa7ad, 0xa7ad, -42305, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0xa7b0, 0xa7b0, -42258, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0xa7b1, 0xa7b1, -42282, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0xa7b2, 0xa7b2, -42261, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0xa7b3, 0xa7b3, 0, 928, 928, 928 }, + { 2, MappingSource::CaseFolding, 0xa7b4, 0xa7b7, -1, 1, 1, 1 }, + { 1, MappingSource::CaseFolding, 0xab53, 0xab53, -928, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0xab70, 0xabbf, -38864, 0, 0, 0 }, + { 1, MappingSource::UnicodeData, 0xff21, 0xff3a, 0, 32, 32, 32 }, + { 1, MappingSource::UnicodeData, 0xff41, 0xff5a, -32, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x10400, 0x10427, 0, 40, 40, 40 }, + { 1, MappingSource::CaseFolding, 0x10428, 0x1044f, -40, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x10c80, 0x10cb2, 0, 64, 64, 64 }, + { 1, MappingSource::CaseFolding, 0x10cc0, 0x10cf2, -64, 0, 0, 0 }, + { 1, MappingSource::CaseFolding, 0x118a0, 0x118bf, 0, 32, 32, 32 }, + { 1, MappingSource::CaseFolding, 0x118c0, 0x118df, -32, 0, 0, 0 }, }; static const int numTransforms = sizeof(transforms) / sizeof(Transform); static const Transform lastTransform = transforms[numTransforms - 1]; + static constexpr bool isTransformEntryValid(int offset) + { + return + // If we've made it to the end of the table, return true. (base case) + offset >= numTransforms || + // Otherwise, the transformation table is valid if + ( + // there is at least one delta that differs from delta0 in the transform entry that we're currently looking at + (transforms[offset].delta0 != transforms[offset].delta1 || transforms[offset].delta0 != transforms[offset].delta2 || transforms[offset].delta0 != transforms[offset].delta3) + // and the transformation range is ordered properly + && (transforms[offset].lo <= transforms[offset].hi) + // and the length of the range (inclusive of ends) is a multiple is the skipcount + && ( ((1 + transforms[offset].hi - transforms[offset].lo) % transforms[offset].skipCountOfRange) == 0) + // and the rest of the transformation table is valid. (compile-time recursive call) + && isTransformEntryValid(offset + 1) + ); + } + template bool RangeToEquivClass(uint& tblidx, uint l, uint h, uint& acth, Char equivl[EquivClassSize], Fn acceptSource) { + // Note: There's a few places where we assume that there's no equivalence set + // with only one actual member. If you fail this check, double-check the data + // in the table above - one line likely has the same value for all deltas. + // + // The 0 parameter here indicates that we're starting from the first entry in + // the transformation table. This function recursively checks (during compile + // time) the entry at the index passed as well as all after it. + static_assert(isTransformEntryValid(0), "Invalid Transform code - check for 4 identical deltas!"); Assert(l <= h); if (lastTransform.hi >= l) diff --git a/deps/chakrashim/core/lib/Parser/CharClassifier.cpp b/deps/chakrashim/core/lib/Parser/CharClassifier.cpp index aa792e50122..36e2945bb99 100644 --- a/deps/chakrashim/core/lib/Parser/CharClassifier.cpp +++ b/deps/chakrashim/core/lib/Parser/CharClassifier.cpp @@ -406,7 +406,7 @@ bool Js::CharClassifier::IsIdContinueFast(codepoint_t ch) const return isBigChar ? this->bigCharIsIdContinueFunc(ch, this) : (charFlags[ch] & CharacterTypeFlags::IdChar) != 0; } -Js::CharClassifier::CharClassifier(ScriptContext * scriptContext) +Js::CharClassifier::CharClassifier(void) { bool isES6UnicodeModeEnabled = CONFIG_FLAG(ES6Unicode); bool isFullUnicodeSupportAvailable = PlatformAgnostic::UnicodeText::IsExternalUnicodeLibraryAvailable(); diff --git a/deps/chakrashim/core/lib/Parser/CharClassifier.h b/deps/chakrashim/core/lib/Parser/CharClassifier.h index 3360817e120..9597a6e587a 100644 --- a/deps/chakrashim/core/lib/Parser/CharClassifier.h +++ b/deps/chakrashim/core/lib/Parser/CharClassifier.h @@ -145,9 +145,6 @@ namespace Js const OLECHAR* (*skipIdentifierFunc)(LPCOLESTR pcz, const CharClassifier* instance); const LPCUTF8 (*skipIdentifierStartEndFunc)(LPCUTF8 psz, LPCUTF8 end, const CharClassifier* instance); - void initClassifier(ScriptContext* scriptContext, CharClassifierModes identifierSupport, - CharClassifierModes whiteSpaceSupport, CharClassifierModes generalCharClassificationSupport, bool codePointSupport, bool isES6UnicodeVerboseEnabled, CharClassifierModes fallbackMode = CharClassifierModes::ES5); - public: CharTypes GetCharType(codepoint_t ch) const; @@ -262,7 +259,7 @@ namespace Js return SkipIdentifier(psz); } - CharClassifier(Js::ScriptContext* scriptContext); + CharClassifier(void); }; }; diff --git a/deps/chakrashim/core/lib/Parser/CharSet.h b/deps/chakrashim/core/lib/Parser/CharSet.h index 3203ec7f4b5..e8fe8564bce 100644 --- a/deps/chakrashim/core/lib/Parser/CharSet.h +++ b/deps/chakrashim/core/lib/Parser/CharSet.h @@ -29,37 +29,51 @@ namespace UnifiedRegex { uint w = h - l + 1; if (w == wordSize) + { v = ones; + } else + { v |= ((1U << w) - 1) << l; + } } inline static void clearrng(uint32 &v, uint l, uint h) { uint w = h - l + 1; if (w == wordSize) + { v = 0; + } else + { v &= ~(((1U << w) - 1) << l); + } } public: inline void CloneFrom(const CharBitvec& other) { for (int w = 0; w < vecSize; w++) + { vec[w] = other.vec[w]; + } } inline void Clear() { for (int w = 0; w < vecSize; w++) + { vec[w] = 0; + } } inline void SetAll() { for (int w = 0; w < vecSize; w++) + { vec[w] = ones; + } } inline void Set(uint k) @@ -67,7 +81,9 @@ namespace UnifiedRegex Assert(k < Size); __assume(k < Size); if (k < Size) + { vec[k / wordSize] |= 1U << (k % wordSize); + } } inline void SetRange(uint l, uint h) @@ -76,10 +92,12 @@ namespace UnifiedRegex Assert(h < Size); __assume(l < Size); __assume(h < Size); - if (l < Size && h < Size) + if (l < Size && h < Size) { if (l == h) + { vec[l / wordSize] |= 1U << (l % wordSize); + } else if (l < h) { int lw = l / wordSize; @@ -87,12 +105,16 @@ namespace UnifiedRegex int lo = l % wordSize; int hio = h % wordSize; if (lw == hw) + { setrng(vec[lw], lo, hio); + } else { - setrng(vec[lw], lo, wordSize-1); + setrng(vec[lw], lo, wordSize - 1); for (int w = lw + 1; w < hw; w++) + { vec[w] = ones; + } setrng(vec[hw], 0, hio); } } @@ -105,7 +127,7 @@ namespace UnifiedRegex Assert(h < Size); __assume(l < Size); __assume(h < Size); - if (l < Size && h < Size) + if (l < Size && h < Size) { if (l == h) { @@ -123,9 +145,11 @@ namespace UnifiedRegex } else { - clearrng(vec[lw], lo, wordSize-1); + clearrng(vec[lw], lo, wordSize - 1); for (int w = lw + 1; w < hw; w++) + { vec[w] = 0; + } clearrng(vec[hw], 0, hio); } } @@ -136,7 +160,7 @@ namespace UnifiedRegex { for (int i = 0; i < vecSize; i++) { - if(vec[i] != 0) + if (vec[i] != 0) { return false; } @@ -147,7 +171,9 @@ namespace UnifiedRegex inline void UnionInPlace(const CharBitvec& other) { for (int w = 0; w < vecSize; w++) + { vec[w] |= other.vec[w]; + } } inline bool UnionInPlaceFullCheck(const CharBitvec& other) @@ -157,7 +183,9 @@ namespace UnifiedRegex { vec[w] |= other.vec[w]; if (vec[w] != ones) + { isFull = false; + } } return isFull; } @@ -174,7 +202,9 @@ namespace UnifiedRegex for (int w = 0; w < vecSize; w++) { if (vec[w] != ones) + { return false; + } } return true; } @@ -185,7 +215,9 @@ namespace UnifiedRegex { uint32 v = other.vec[w]; if (v != (vec[w] | v)) + { return false; + } } return true; } @@ -195,7 +227,9 @@ namespace UnifiedRegex for (int w = 0; w < vecSize; w++) { if (vec[w] != other.vec[w]) + { return false; + } } return true; } @@ -229,7 +263,7 @@ namespace UnifiedRegex static const uint leafMask = branchingPerLeafLevel - 1; static const uint levels = 1 + (CharWidth - bitsPerLeafLevel) / bitsPerInnerLevel; - + inline static uint innerIdx(uint level, uint v) { return (v >> ((level + 1) * bitsPerInnerLevel)) & innerMask; @@ -285,7 +319,7 @@ namespace UnifiedRegex void ToEquivClass(ArenaAllocator* allocator, uint level, uint base, uint& tblidx, CharSet& result, codepoint_t baseOffset = 0x0) const; public: static CharSetFull Instance; - static CharSetFull* const TheFullNode; + static CharSetFull * const TheFullNode; CharSetFull(); @@ -307,14 +341,13 @@ namespace UnifiedRegex #endif }; - struct CharSetInner sealed : CharSetNode { private: template void ToEquivClass(ArenaAllocator* allocator, uint level, uint base, uint& tblidx, CharSet& result) const; public: - CharSetNode* children[branchingPerInnerLevel]; + CharSetNode * children[branchingPerInnerLevel]; CharSetInner(); void FreeSelf(ArenaAllocator* allocator) override; @@ -323,7 +356,7 @@ namespace UnifiedRegex CharSetNode* ClearRange(ArenaAllocator* allocator, uint level, uint l, uint h) override; CharSetNode* UnionInPlace(ArenaAllocator* allocator, uint level, const CharSetNode* other) override; bool Get(uint level, uint k) const override; - void ToComplement(ArenaAllocator* allocator, uint level, uint base, CharSet& result) const override;\ + void ToComplement(ArenaAllocator* allocator, uint level, uint base, CharSet& result) const override; void ToEquivClassW(ArenaAllocator* allocator, uint level, uint base, uint& tblidx, CharSet& result) const override; void ToEquivClassCP(ArenaAllocator* allocator, uint level, uint base, uint& tblidx, CharSet& result, codepoint_t baseOffset) const override; bool IsSubsetOf(uint level, const CharSetNode* other) const override; @@ -335,7 +368,7 @@ namespace UnifiedRegex #endif }; - struct CharSetLeaf sealed: CharSetNode + struct CharSetLeaf sealed : CharSetNode { private: template @@ -393,7 +426,6 @@ namespace UnifiedRegex struct FullRep full; } rep; - static const int compactSize = sizeof(CompactRep); static const int fullSize = sizeof(FullRep); @@ -425,18 +457,24 @@ namespace UnifiedRegex { Assert(MaxCompact == 4); return rep.compact.cs[0] == CTU(kc) || - rep.compact.cs[1] == CTU(kc) || - rep.compact.cs[2] == CTU(kc) || - rep.compact.cs[3] == CTU(kc); + rep.compact.cs[1] == CTU(kc) || + rep.compact.cs[2] == CTU(kc) || + rep.compact.cs[3] == CTU(kc); } else { if (CTU(kc) < CharSetNode::directSize) + { return rep.full.direct.Get(CTU(kc)); + } else if (rep.full.root == 0) + { return false; + } else + { return Get_helper(CTU(kc)); + } } } @@ -543,9 +581,13 @@ namespace UnifiedRegex inline uint Count() const { if (IsCompact()) + { return (uint)rep.compact.countPlusOne - 1; + } else if (rep.full.root == 0) + { return rep.full.direct.Count(); + } else { //The bit vector @@ -571,7 +613,7 @@ namespace UnifiedRegex // Character planes are composed of 65536 characters each. // First plane is the Basic Multilingual Plane (characters 0 - 65535) // Every subsequent plane also stores characters in the form [0 - 65535]; to get the actual value, add 'index * 0x10000' to it - CharSet characterPlanes [NumberOfPlanes]; + CharSet characterPlanes[NumberOfPlanes]; // Takes a character, and returns the index of the CharSet that holds it. inline int CharToIndex(Char c) const @@ -593,7 +635,7 @@ namespace UnifiedRegex Assert(c <= Chars::MaxUChar); Assert(index >= 0); Assert(index < NumberOfPlanes); - return (Char)(c) + 0x10000 * index; + return ((Char)c) + 0x10000 * index; } public: @@ -718,7 +760,7 @@ namespace UnifiedRegex { private: // Trie for remaining characters. Pointer value will be 0 or >> MaxCompact. - CharSetNode* root; + CharSetNode * root; // Entries for first 256 characters CharBitvec direct; @@ -731,11 +773,17 @@ namespace UnifiedRegex inline bool Get(Char kc) const { if (CTU(kc) < CharSetNode::directSize) + { return direct.Get(CTU(kc)); + } else if (root == 0) + { return false; + } else + { return Get_helper(CTU(kc)); + } } #if ENABLE_REGEX_CONFIG_OPTIONS diff --git a/deps/chakrashim/core/lib/Parser/Chars.h b/deps/chakrashim/core/lib/Parser/Chars.h index c7025d6c201..0d846aaa6b1 100644 --- a/deps/chakrashim/core/lib/Parser/Chars.h +++ b/deps/chakrashim/core/lib/Parser/Chars.h @@ -4,7 +4,6 @@ //------------------------------------------------------------------------------------------------------- #pragma once - namespace UnifiedRegex { template @@ -113,7 +112,6 @@ namespace UnifiedRegex } }; - template <> struct Chars { diff --git a/deps/chakrashim/core/lib/Parser/Hash.cpp b/deps/chakrashim/core/lib/Parser/Hash.cpp index 28a14578455..710e34db455 100644 --- a/deps/chakrashim/core/lib/Parser/Hash.cpp +++ b/deps/chakrashim/core/lib/Parser/Hash.cpp @@ -34,7 +34,7 @@ HashTbl * HashTbl::Create(uint cidHash) return nullptr; if (!phtbl->Init(cidHash)) { - delete phtbl; // invokes overrided operator delete + delete phtbl; // invokes overridden operator delete return nullptr; } @@ -145,8 +145,46 @@ uint HashTbl::CountAndVerifyItems(IdentPtr *buckets, uint bucketCount, uint mask } #endif + #pragma warning(push) -#pragma warning(disable:4740) // flow in or out of inline asm code suppresses global optimization +#pragma warning(disable:4740) // flow in or out of inline asm code suppresses global optimization + +// Decide if token is keyword by string matching - +// This method is used during colorizing when scanner isn't interested in storing the actual id and does not care about conversion of escape sequences +tokens Ident::TkFromNameLen(uint32 luHash, _In_reads_(cch) LPCOLESTR prgch, uint32 cch, bool isStrictMode, ushort * pgrfid, ushort * ptk) +{ + // look for a keyword + #include "kwds_sw.h" + + #define KEYWORD(tk,f,prec2,nop2,prec1,nop1,name) \ + LEqual_##name: \ + if (cch == g_ssym_##name.cch && \ + 0 == memcmp(g_ssym_##name.sz, prgch, cch * sizeof(OLECHAR))) \ + { \ + if (f) \ + *pgrfid |= f; \ + *ptk = tk; \ + return ((f & fidKwdRsvd) || (isStrictMode && (f & fidKwdFutRsvd))) ? tk : tkID; \ + } \ + goto LDefault; + #include "keywords.h" + +LDefault: + return tkID; +} + +#pragma warning(pop) + +#if DBG +tokens Ident::TkFromNameLen(_In_reads_(cch) LPCOLESTR prgch, uint32 cch, bool isStrictMode) +{ + uint32 luHash = CaseSensitiveComputeHash(prgch, prgch + cch); + ushort grfid; + ushort tk; + return TkFromNameLen(luHash, prgch, cch, isStrictMode, &grfid, &tk); +} +#endif + tokens Ident::Tk(bool isStrictMode) { const tokens token = (tokens)m_tk; @@ -156,22 +194,8 @@ tokens Ident::Tk(bool isStrictMode) const uint32 luHash = this->m_luHash; const LPCOLESTR prgch = Psz(); const uint32 cch = Cch(); - #include "kwds_sw.h" - - #define KEYWORD(tk,f,prec2,nop2,prec1,nop1,name) \ - LEqual_##name: \ - if (cch == g_ssym_##name.cch && \ - 0 == memcmp(g_ssym_##name.sz, prgch, cch * sizeof(OLECHAR))) \ - { \ - if (f) \ - this->m_grfid |= f; \ - this->m_tk = tk; \ - return ((f & fidKwdRsvd) || (isStrictMode && (f & fidKwdFutRsvd))) ? tk : tkID; \ - } \ - goto LDefault; - #include "keywords.h" -LDefault: - return tkID; + + return TkFromNameLen(luHash, prgch, cch, isStrictMode, &this->m_grfid, &this->m_tk); } else if (token == tkNone || !(m_grfid & fidKwdRsvd)) { @@ -182,7 +206,6 @@ tokens Ident::Tk(bool isStrictMode) } return token; } -#pragma warning(pop) void Ident::SetTk(tokens token, ushort grfid) { @@ -411,33 +434,6 @@ bool HashTbl::Contains(_In_reads_(cch) LPCOLESTR prgch, int32 cch) #include "HashFunc.cpp" -#pragma warning(push) -#pragma warning(disable:4740) // flow in or out of inline asm code suppresses global optimization - -// Decide if token is keyword by string matching - -// This method is used during colorizing when scanner isn't interested in storing the actual id and does not care about conversion of escape sequences -tokens HashTbl::TkFromNameLen(_In_reads_(cch) LPCOLESTR prgch, uint32 cch, bool isStrictMode) -{ - uint32 luHash = CaseSensitiveComputeHash(prgch, prgch + cch); - - // look for a keyword -#include "kwds_sw.h" - - #define KEYWORD(tk,f,prec2,nop2,prec1,nop1,name) \ - LEqual_##name: \ - if (cch == g_ssym_##name.cch && \ - 0 == memcmp(g_ssym_##name.sz, prgch, cch * sizeof(OLECHAR))) \ - { \ - return ((f & fidKwdRsvd) || (isStrictMode && (f & fidKwdFutRsvd))) ? tk : tkID; \ - } \ - goto LDefault; -#include "keywords.h" - -LDefault: - return tkID; -} - -#pragma warning(pop) __declspec(noreturn) void HashTbl::OutOfMemory() { diff --git a/deps/chakrashim/core/lib/Parser/Hash.h b/deps/chakrashim/core/lib/Parser/Hash.h index 81763421b9e..96e3d58ef50 100644 --- a/deps/chakrashim/core/lib/Parser/Hash.h +++ b/deps/chakrashim/core/lib/Parser/Hash.h @@ -31,19 +31,6 @@ enum fidKwdRsvd = 0x0001, // the keyword is a reserved word fidKwdFutRsvd = 0x0002, // a future reserved word, but only in strict mode - // Flags to identify tracked aliases of "eval" - fidEval = 0x0008, - // Flags to identify tracked aliases of "let" - fidLetOrConst = 0x0010, // ID has previously been used in a block-scoped declaration - - // This flag is used by the Parser CountDcls and FillDcls methods. - // CountDcls sets the bit as it walks through the var decls so that - // it can skip duplicates. FillDcls clears the bit as it walks through - // again to skip duplicates. - fidGlobalDcl = 0x2000, - - fidUsed = 0x4000, // name referenced by source code - fidModuleExport = 0x8000 // name is module export }; @@ -313,14 +300,14 @@ struct Ident Js::PropertyId GetPropertyId() const { return m_propertyId; } void SetPropertyId(Js::PropertyId id) { m_propertyId = id; } - void SetIsEval() { m_grfid |= fidEval; } - BOOL GetIsEval() const { return m_grfid & fidEval; } - - void SetIsLetOrConst() { m_grfid |= fidLetOrConst; } - BOOL GetIsLetOrConst() const { return m_grfid & fidLetOrConst; } - void SetIsModuleExport() { m_grfid |= fidModuleExport; } BOOL GetIsModuleExport() const { return m_grfid & fidModuleExport; } + + static tokens TkFromNameLen(uint32 luHash, _In_reads_(cch) LPCOLESTR prgch, uint32 cch, bool isStrictMode, ushort * pgrfid, ushort * ptk); + +#if DBG + static tokens TkFromNameLen(_In_reads_(cch) LPCOLESTR prgch, uint32 cch, bool isStrictMode); +#endif }; @@ -333,7 +320,7 @@ class HashTbl void Release(void) { - delete this; // invokes overrided operator delete + delete this; // invokes overridden operator delete } @@ -388,7 +375,6 @@ class HashTbl #endif ); - tokens TkFromNameLen(_In_reads_(cch) LPCOLESTR prgch, uint32 cch, bool isStrictMode); NoReleaseAllocator* GetAllocator() {return &m_noReleaseAllocator;} bool Contains(_In_reads_(cch) LPCOLESTR prgch, int32 cch); diff --git a/deps/chakrashim/core/lib/Parser/Parse.cpp b/deps/chakrashim/core/lib/Parser/Parse.cpp index 807bb4b4983..8d9784b5edf 100644 --- a/deps/chakrashim/core/lib/Parser/Parse.cpp +++ b/deps/chakrashim/core/lib/Parser/Parse.cpp @@ -15,7 +15,7 @@ const char* const nopNames[knopLim]= { #include "ptlist.h" }; void printNop(int nop) { - printf("%s\n",nopNames[nop]); + Output::Print(_u("%S\n"), nopNames[nop]); } const uint ParseNode::mpnopgrfnop[knopLim] = @@ -45,15 +45,14 @@ struct StmtNest struct { ParseNodePtr pnodeStmt; // This statement node. - ParseNodePtr pnodeLab; // Labels for this statement. }; struct { bool isDeferred : 1; OpCode op; // This statement operation. - LabelId* pLabelId; // Labels for this statement. }; }; + LabelId* pLabelId; // Labels for this statement. StmtNest *pstmtOuter; // Enclosing statement. OpCode GetNop() const @@ -78,63 +77,85 @@ Parser::Parser(Js::ScriptContext* scriptContext, BOOL strictMode, PageAllocator Parser::Parser(Js::ScriptContext* scriptContext, BOOL strictMode, PageAllocator *alloc, bool isBackground) #endif : m_nodeAllocator(_u("Parser"), alloc ? alloc : scriptContext->GetThreadContext()->GetPageAllocator(), Parser::OutOfMemory), + m_cactIdentToNodeLookup(0), + m_grfscr(fscrNil), + m_length(0), + m_originalLength(0), + m_nextFunctionId(nullptr), + m_sourceContextInfo(nullptr), +#if ENABLE_BACKGROUND_PARSING + m_isInBackground(isBackground), + m_hasParallelJob(false), + m_doingFastScan(false), +#endif + m_nextBlockId(0), // use the GuestArena directly for keeping the RegexPattern* alive during byte code generation - m_registeredRegexPatterns(scriptContext->GetGuestArena()) + m_registeredRegexPatterns(scriptContext->GetGuestArena()), + + m_scriptContext(scriptContext), + m_phtbl(nullptr), + + m_token(), // should initialize to 0/nullptrs + m_pscan(nullptr), + + m_currentNodeNonLambdaFunc(nullptr), + m_currentNodeNonLambdaDeferredFunc(nullptr), + m_currentNodeFunc(nullptr), + m_currentNodeDeferredFunc(nullptr), + m_currentNodeProg(nullptr), + m_currDeferredStub(nullptr), + m_prevSiblingDeferredStub(nullptr), + m_pCurrentAstSize(nullptr), + m_ppnodeScope(nullptr), + m_ppnodeExprScope(nullptr), + m_ppnodeVar(nullptr), + m_inDeferredNestedFunc(false), + m_reparsingLambdaParams(false), + m_disallowImportExportStmt(false), + m_isInParsingArgList(false), + m_hasDestructuringPattern(false), + m_hasDeferredShorthandInitError(false), + m_pnestedCount(nullptr), + + wellKnownPropertyPids(), // should initialize to nullptrs + m_sourceLim(0), + m_functionBody(nullptr), + m_parseType(ParseType_Upfront), + + m_arrayDepth(0), + m_funcInArrayDepth(0), + m_funcInArray(0), + m_scopeCountNoAst(0), + + m_parsingSuperRestrictionState(ParsingSuperRestrictionState_SuperDisallowed), + + m_funcParenExprDepth(0), + m_deferEllipsisError(false), + m_deferEllipsisErrorLoc(), // calls default initializer + + m_tryCatchOrFinallyDepth(0), + + m_pstmtCur(nullptr), + m_currentBlockInfo(nullptr), + m_currentScope(nullptr), + + currBackgroundParseItem(nullptr), + backgroundParseItems(nullptr), + fastScannedRegExpNodes(nullptr), + + m_currentDynamicBlock(nullptr), + + m_UsesArgumentsAtGlobal(false), + + m_fUseStrictMode(strictMode), + m_InAsmMode(false), + m_deferAsmJs(true), + m_fExpectExternalSource(FALSE), + m_deferringAST(FALSE), + m_stoppedDeferredParse(FALSE) { AssertMsg(size == sizeof(Parser), "verify conditionals affecting the size of Parser agree"); Assert(scriptContext != nullptr); - m_isInBackground = isBackground; - m_phtbl = nullptr; - m_pscan = nullptr; - m_deferringAST = FALSE; - m_stoppedDeferredParse = FALSE; - m_hasParallelJob = false; - m_doingFastScan = false; - m_isInParsingArgList = false; - m_hasDestructuringPattern = false; - m_scriptContext = scriptContext; - m_pCurrentAstSize = nullptr; - m_arrayDepth = 0; - m_funcInArrayDepth = 0; - m_parenDepth = 0; - m_funcInArray = 0; - m_tryCatchOrFinallyDepth = 0; - m_UsesArgumentsAtGlobal = false; - m_currentNodeFunc = nullptr; - m_currentNodeDeferredFunc = nullptr; - m_currentNodeNonLambdaFunc = nullptr; - m_currentNodeNonLambdaDeferredFunc = nullptr; - m_currentNodeProg = nullptr; - m_currDeferredStub = nullptr; - m_prevSiblingDeferredStub = nullptr; - m_pstmtCur = nullptr; - m_currentBlockInfo = nullptr; - m_currentScope = nullptr; - m_currentDynamicBlock = nullptr; - m_grfscr = fscrNil; - m_length = 0; - m_originalLength = 0; - m_nextFunctionId = nullptr; - m_errorCallback = nullptr; - m_uncertainStructure = FALSE; - m_reparsingLambdaParams = false; - currBackgroundParseItem = nullptr; - backgroundParseItems = nullptr; - fastScannedRegExpNodes = nullptr; - - m_fUseStrictMode = strictMode; - m_InAsmMode = false; - m_deferAsmJs = true; - m_scopeCountNoAst = 0; - m_fExpectExternalSource = 0; - - m_parseType = ParseType_Upfront; - - m_deferEllipsisError = false; - m_hasDeferredShorthandInitError = false; - m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperDisallowed; - - m_disallowImportExportStmt = false; } Parser::~Parser(void) @@ -146,9 +167,9 @@ Parser::~Parser(void) m_registeredRegexPatterns.Reset(); } +#if ENABLE_BACKGROUND_PARSING if (this->m_hasParallelJob) { -#if ENABLE_BACKGROUND_PARSING // Let the background threads know that they can decommit their arena pages. BackgroundParser *bgp = m_scriptContext->GetBackgroundParser(); Assert(bgp); @@ -162,8 +183,8 @@ Parser::~Parser(void) }); Assert(result); } -#endif } +#endif Release(); @@ -411,9 +432,9 @@ HRESULT Parser::ParseSourceInternal( hr = pse->ProcessError(m_pscan, hr, pnodeBase); } +#if ENABLE_BACKGROUND_PARSING if (this->m_hasParallelJob) { -#if ENABLE_BACKGROUND_PARSING ///// Wait here for remaining jobs to finish. Then look for errors, do final const bindings. // pleath TODO: If there are remaining jobs, let the main thread help finish them. BackgroundParser *bgp = m_scriptContext->GetBackgroundParser(); @@ -442,8 +463,8 @@ HRESULT Parser::ParseSourceInternal( Parser *parser = item->GetParser(); parser->FinishBackgroundPidRefs(item, this != parser); } -#endif } +#endif // done with the scanner RELEASEPTR(m_pscan); @@ -649,14 +670,14 @@ void Parser::FinishBackgroundRegExpNodes() } #endif -LabelId* Parser::CreateLabelId(IdentToken* pToken) +LabelId* Parser::CreateLabelId(IdentPtr pid) { LabelId* pLabelId; pLabelId = (LabelId*)m_nodeAllocator.Alloc(sizeof(LabelId)); if (NULL == pLabelId) Error(ERRnoMemory); - pLabelId->pid = pToken->pid; + pLabelId->pid = pid; pLabelId->next = NULL; return pLabelId; @@ -731,7 +752,7 @@ ParseNodePtr Parser::CreateNodeT(charcount_t ichMin,charcount_t ichLim) return pnode; } -ParseNodePtr Parser::CreateDeclNode(OpCode nop, IdentPtr pid, SymbolType symbolType, bool errorOnRedecl, bool *isRedecl) +ParseNodePtr Parser::CreateDeclNode(OpCode nop, IdentPtr pid, SymbolType symbolType, bool errorOnRedecl) { ParseNodePtr pnode = CreateNode(nop); @@ -739,23 +760,17 @@ ParseNodePtr Parser::CreateDeclNode(OpCode nop, IdentPtr pid, SymbolType symbolT if (symbolType != STUnknown) { - pnode->sxVar.sym = AddDeclForPid(pnode, pid, symbolType, errorOnRedecl, isRedecl); + pnode->sxVar.sym = AddDeclForPid(pnode, pid, symbolType, errorOnRedecl); } return pnode; } -Symbol* Parser::AddDeclForPid(ParseNodePtr pnode, IdentPtr pid, SymbolType symbolType, bool errorOnRedecl, bool *isRedecl) +Symbol* Parser::AddDeclForPid(ParseNodePtr pnode, IdentPtr pid, SymbolType symbolType, bool errorOnRedecl) { Assert(pnode->IsVarLetOrConst()); PidRefStack *refForUse = nullptr, *refForDecl = nullptr; - - if (isRedecl) - { - *isRedecl = false; - } - BlockInfoStack *blockInfo; bool fBlockScope = false; if (pnode->nop != knopVarDecl || symbolType == STFunction) @@ -814,10 +829,6 @@ Symbol* Parser::AddDeclForPid(ParseNodePtr pnode, IdentPtr pid, SymbolType symbo Symbol *sym = refForDecl->GetSym(); if (sym != nullptr) { - if (isRedecl) - { - *isRedecl = true; - } // Multiple declarations in the same scope. 3 possibilities: error, existing one wins, new one wins. switch (pnode->nop) { @@ -1457,9 +1468,9 @@ ParseNodePtr Parser::CreateModuleImportDeclNode(IdentPtr localName) return declNode; } -ParseNodePtr Parser::CreateVarDeclNode(IdentPtr pid, SymbolType symbolType, bool autoArgumentsObject, ParseNodePtr pnodeFnc, bool errorOnRedecl, bool *isRedecl) +ParseNodePtr Parser::CreateVarDeclNode(IdentPtr pid, SymbolType symbolType, bool autoArgumentsObject, ParseNodePtr pnodeFnc, bool errorOnRedecl) { - ParseNodePtr pnode = CreateDeclNode(knopVarDecl, pid, symbolType, errorOnRedecl, isRedecl); + ParseNodePtr pnode = CreateDeclNode(knopVarDecl, pid, symbolType, errorOnRedecl); // Append the variable to the end of the current variable list. AssertMem(m_ppnodeVar); @@ -1485,7 +1496,6 @@ ParseNodePtr Parser::CreateBlockScopedDeclNode(IdentPtr pid, OpCode nodeType) if (nullptr != pid) { AssertMem(pid); - pid->SetIsLetOrConst(); AddVarDeclToBlock(pnode); CheckPidIsValid(pid); } @@ -1521,11 +1531,11 @@ ParseNodePtr Parser::StartParseBlockWithCapacity(PnodeBlockType blockType, Scope scope = Anew(&m_nodeAllocator, Scope, &m_nodeAllocator, scopeType, capacity); PushScope(scope); - return StartParseBlockHelper(blockType, scope, nullptr, nullptr); + return StartParseBlockHelper(blockType, scope, nullptr); } template -ParseNodePtr Parser::StartParseBlock(PnodeBlockType blockType, ScopeType scopeType, ParseNodePtr pnodeLabel, LabelId* pLabelId) +ParseNodePtr Parser::StartParseBlock(PnodeBlockType blockType, ScopeType scopeType, LabelId* pLabelId) { Scope *scope = nullptr; // Block scopes are created lazily when we discover block-scoped content. @@ -1535,17 +1545,17 @@ ParseNodePtr Parser::StartParseBlock(PnodeBlockType blockType, ScopeType scopeTy PushScope(scope); } - return StartParseBlockHelper(blockType, scope, pnodeLabel, pLabelId); + return StartParseBlockHelper(blockType, scope, pLabelId); } template -ParseNodePtr Parser::StartParseBlockHelper(PnodeBlockType blockType, Scope *scope, ParseNodePtr pnodeLabel, LabelId* pLabelId) +ParseNodePtr Parser::StartParseBlockHelper(PnodeBlockType blockType, Scope *scope, LabelId* pLabelId) { ParseNodePtr pnodeBlock = CreateBlockNode(blockType); pnodeBlock->sxBlock.scope = scope; BlockInfoStack *newBlockInfo = PushBlockInfo(pnodeBlock); - PushStmt(&newBlockInfo->pstmt, pnodeBlock, knopBlock, pnodeLabel, pLabelId); + PushStmt(&newBlockInfo->pstmt, pnodeBlock, knopBlock, pLabelId); return pnodeBlock; } @@ -1608,13 +1618,13 @@ void Parser::PopFuncBlockScope(ParseNodePtr *ppnodeScopeSave, ParseNodePtr *ppno } template -ParseNodePtr Parser::ParseBlock(ParseNodePtr pnodeLabel, LabelId* pLabelId) +ParseNodePtr Parser::ParseBlock(LabelId* pLabelId) { ParseNodePtr pnodeBlock = nullptr; ParseNodePtr *ppnodeScopeSave = nullptr; ParseNodePtr *ppnodeExprScopeSave = nullptr; - pnodeBlock = StartParseBlock(PnodeBlockType::Regular, ScopeType_Block, pnodeLabel, pLabelId); + pnodeBlock = StartParseBlock(PnodeBlockType::Regular, ScopeType_Block, pLabelId); BlockInfoStack* outerBlockInfo = m_currentBlockInfo->pBlockInfoOuter; if (outerBlockInfo != nullptr && outerBlockInfo->pnodeBlock != nullptr @@ -1652,6 +1662,14 @@ ParseNodePtr Parser::ParseBlock(ParseNodePtr pnodeLabel, LabelId* pLabelId) return pnodeBlock; } +bool Parser::IsSpecialName(IdentPtr pid) +{ + return pid == wellKnownPropertyPids._this || + pid == wellKnownPropertyPids._super || + pid == wellKnownPropertyPids._superConstructor || + pid == wellKnownPropertyPids._newTarget; +} + ParseNodePtr Parser::ReferenceSpecialName(IdentPtr pid, charcount_t ichMin, charcount_t ichLim, bool createNode) { PidRefStack* ref = this->PushPidRef(pid); @@ -1780,7 +1798,7 @@ void Parser::FinishParseFncExprScope(ParseNodePtr pnodeFnc, ParseNodePtr pnodeFn if (pnodeName) { Assert(pnodeName->nop == knopVarDecl); - BindPidRefsInScope(pnodeName->sxVar.pid, pnodeName->sxVar.sym, fncExprScopeId); + BindPidRefsInScope(pnodeName->sxVar.pid, pnodeName->sxVar.sym, fncExprScopeId, m_nextBlockId - 1); } FinishParseBlock(pnodeFncExprScope); } @@ -1854,7 +1872,7 @@ void Parser::BindPidRefsInScope(IdentPtr pid, Symbol *sym, int blockId, uint max Js::LocalFunctionId funcId = GetCurrentFunctionNode()->sxFnc.functionId; Assert(sym); - if (pid->GetIsModuleExport()) + if (pid->GetIsModuleExport() && IsTopLevelModuleFunc()) { sym->SetIsModuleExportStorage(true); } @@ -2032,7 +2050,7 @@ void Parser::PopDynamicBlock() for (PidRefStack *ref = pid->GetTopRef(); ref && ref->GetScopeId() >= blockId; ref = ref->prev) { ref->SetDynamicBinding(); - } + } }); m_currentDynamicBlock = m_currentDynamicBlock->prev; @@ -2227,34 +2245,6 @@ void Parser::ReduceDeferredScriptLength(size_t chars) } } -/*************************************************************************** -Look for an existing label with the given name. -***************************************************************************/ -BOOL Parser::PnodeLabelNoAST(IdentToken* pToken, LabelId* pLabelIdList) -{ - StmtNest* pStmt; - LabelId* pLabelId; - - // Look in the label stack. - for (pStmt = m_pstmtCur; pStmt != nullptr; pStmt = pStmt->pstmtOuter) - { - for (pLabelId = pStmt->pLabelId; pLabelId != nullptr; pLabelId = pLabelId->next) - { - if (pLabelId->pid == pToken->pid) - return TRUE; - } - } - - // Also look in the pnodeLabels list. - for (pLabelId = pLabelIdList; pLabelId != nullptr; pLabelId = pLabelId->next) - { - if (pLabelId->pid == pToken->pid) - return TRUE; - } - - return FALSE; -} - void Parser::EnsureStackAvailable() { if (!m_scriptContext->GetThreadContext()->IsStackAvailable(Js::Constants::MinStackCompile)) @@ -3260,7 +3250,7 @@ ParseNodePtr Parser::ParseTerm(BOOL fAllowCall, m_pscan->Scan(); // If the token after the right paren is not => or if there was a newline between () and => this is a syntax error - if (!m_doingFastScan && (m_token.tk != tkDArrow || m_pscan->FHadNewLine())) + if (!IsDoingFastScan() && (m_token.tk != tkDArrow || m_pscan->FHadNewLine())) { Error(ERRsyntax); } @@ -3279,9 +3269,13 @@ ParseNodePtr Parser::ParseTerm(BOOL fAllowCall, uint saveCurrBlockId = GetCurrentBlock()->sxBlock.blockId; GetCurrentBlock()->sxBlock.blockId = m_nextBlockId++; - this->m_parenDepth++; + // Push the deferred error state for ellipsis errors. It is possible that another syntax error will occur before we undefer this one. + bool deferEllipsisErrorSave = m_deferEllipsisError; + RestorePoint ellipsisErrorLocSave = m_deferEllipsisErrorLoc; + + this->m_funcParenExprDepth++; pnode = ParseExpr(koplNo, &fCanAssign, TRUE, FALSE, nullptr, nullptr /*nameLength*/, nullptr /*pShortNameOffset*/, &term, true, nullptr, plastRParen); - this->m_parenDepth--; + this->m_funcParenExprDepth--; if (buildAST && plastRParen) { @@ -3301,13 +3295,18 @@ ParseNodePtr Parser::ParseTerm(BOOL fAllowCall, // Emit a deferred ... error if one was parsed. if (m_deferEllipsisError && m_token.tk != tkDArrow) { - m_pscan->SeekTo(m_EllipsisErrLoc); + m_pscan->SeekTo(m_deferEllipsisErrorLoc); Error(ERRInvalidSpreadUse); } else { m_deferEllipsisError = false; } + + // We didn't error out, so restore the deferred error state. + m_deferEllipsisError = deferEllipsisErrorSave; + m_deferEllipsisErrorLoc = ellipsisErrorLocSave; + break; } @@ -3545,6 +3544,7 @@ LFunction : } break; +#if ENABLE_BACKGROUND_PARSING case tkCASE: { if (!m_doingFastScan) @@ -3564,6 +3564,7 @@ LFunction : m_pscan->Scan(); ParseStatement(); break; +#endif default: LUnknown : @@ -3604,17 +3605,20 @@ ParseNodePtr Parser::ParseRegExp() { ParseNodePtr pnode = nullptr; - if (buildAST || m_doingFastScan) + if (buildAST || IsDoingFastScan()) { m_pscan->RescanRegExp(); +#if ENABLE_BACKGROUND_PARSING BOOL saveDeferringAST = this->m_deferringAST; if (m_doingFastScan) { this->m_deferringAST = false; } +#endif pnode = CreateNodeWithScanner(); pnode->sxPid.regexPattern = m_token.GetRegex(); +#if ENABLE_BACKGROUND_PARSING if (m_doingFastScan) { this->m_deferringAST = saveDeferringAST; @@ -3624,7 +3628,6 @@ ParseNodePtr Parser::ParseRegExp() pnode = nullptr; } } -#if ENABLE_BACKGROUND_PARSING else if (this->IsBackgroundParser()) { Assert(pnode->sxPid.regexPattern == nullptr); @@ -3732,7 +3735,6 @@ ParseNodePtr Parser::ParsePostfixOperators( } else { - bool fCallIsEval = false; if (!fAllowCall) { return pnode; @@ -3754,6 +3756,8 @@ ParseNodePtr Parser::ParsePostfixOperators( // We now detect this case up front in ParseFncDecl, which is cheaper and simpler. if (buildAST) { + bool fCallIsEval = false; + // Detect super() if (this->NodeIsSuperName(pnode)) { @@ -4033,39 +4037,23 @@ ParseNodePtr Parser::ParsePostfixOperators( /*************************************************************************** Look for an existing label with the given name. ***************************************************************************/ -ParseNodePtr Parser::PnodeLabel(IdentPtr pid, ParseNodePtr pnodeLabels) +bool Parser::LabelExists(IdentPtr pid, LabelId* pLabelIdList) { - AssertMem(pid); - AssertNodeMemN(pnodeLabels); - - StmtNest *pstmt; - ParseNodePtr pnodeT; + StmtNest dummy; + dummy.pLabelId = pLabelIdList; + dummy.pstmtOuter = m_pstmtCur; - // Look in the statement stack. - for (pstmt = m_pstmtCur; nullptr != pstmt; pstmt = pstmt->pstmtOuter) + // Look through each label list for the current stack of statements + for (StmtNest* pStmt = &dummy; pStmt != nullptr; pStmt = pStmt->pstmtOuter) { - AssertNodeMem(pstmt->pnodeStmt); - AssertNodeMemN(pstmt->pnodeLab); - - for (pnodeT = pstmt->pnodeLab; nullptr != pnodeT; - pnodeT = pnodeT->sxLabel.pnodeNext) + for (LabelId* pLabelId = pStmt->pLabelId; pLabelId != nullptr; pLabelId = pLabelId->next) { - Assert(knopLabel == pnodeT->nop); - if (pid == pnodeT->sxLabel.pid) - return pnodeT; + if (pLabelId->pid == pid) + return true; } } - // Also look in the pnodeLabels list. - for (pnodeT = pnodeLabels; nullptr != pnodeT; - pnodeT = pnodeT->sxLabel.pnodeNext) - { - Assert(knopLabel == pnodeT->nop); - if (pid == pnodeT->sxLabel.pid) - return pnodeT; - } - - return nullptr; + return false; } // Currently only ints and floats are treated as constants in function call @@ -4528,7 +4516,7 @@ ParseNodePtr Parser::ParseMemberList(LPCOLESTR pNameHint, uint32* pNameHintLengt iecpMin = m_pscan->IecpMinTok(); m_pscan->ScanForcingPid(); - if (m_token.tk == tkLParen || m_token.tk == tkColon || m_token.tk == tkRCurly || m_pscan->FHadNewLine()) + if (m_token.tk == tkLParen || m_token.tk == tkColon || m_token.tk == tkRCurly || m_pscan->FHadNewLine() || m_token.tk == tkComma) { m_pscan->SeekTo(parsedAsync); } @@ -5200,17 +5188,12 @@ ParseNodePtr Parser::ParseFncDecl(ushort flags, LPCOLESTR pNameHint, const bool // level and we accomplish this by having each block scoped function // declaration assign to both the block scoped "let" binding, as well // as the function scoped "var" binding. - bool isRedecl = false; - ParseNodePtr vardecl = CreateVarDeclNode(pnodeFnc->sxFnc.pnodeName->sxVar.pid, STVariable, false, nullptr, false, &isRedecl); + ParseNodePtr vardecl = CreateVarDeclNode(pnodeFnc->sxFnc.pnodeName->sxVar.pid, STVariable, false, nullptr, false); vardecl->sxVar.isBlockScopeFncDeclVar = true; if (vardecl->sxVar.sym->GetIsFormal()) { GetCurrentFunctionNode()->sxFnc.SetHasAnyWriteToFormals(true); } - if (isRedecl) - { - vardecl->sxVar.sym->SetHasBlockFncVarRedecl(); - } } } @@ -5321,8 +5304,11 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho Scope *fncExprScope = nullptr; if (!fDeclaration) { - pnodeFncExprScope = StartParseBlock(PnodeBlockType::Function, ScopeType_FuncExpr); - fncExprScope = pnodeFncExprScope->sxBlock.scope; + if (!fLambda) + { + pnodeFncExprScope = StartParseBlock(PnodeBlockType::Function, ScopeType_FuncExpr); + fncExprScope = pnodeFncExprScope->sxBlock.scope; + } // Function expression: push the new function onto the stack now so that the name (if any) will be // local to the new function. @@ -5401,12 +5387,14 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho bool isTopLevelDeferredFunc = false; +#if ENABLE_BACKGROUND_PARSING struct AutoFastScanFlag { bool savedDoingFastScan; AutoFastScanFlag(Parser *parser) : m_parser(parser) { savedDoingFastScan = m_parser->m_doingFastScan; } ~AutoFastScanFlag() { m_parser->m_doingFastScan = savedDoingFastScan; } Parser *m_parser; } flag(this); +#endif bool doParallel = false; bool parallelJobStarted = false; @@ -5435,6 +5423,7 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho isTopLevelDeferredFunc = isTopLevelDeferredFunc && !isDeferredFnc && (!isLikelyIIFE || !topLevelStmt || PHASE_FORCE_RAW(Js::DeferParsePhase, m_sourceContextInfo->sourceContextId, pnodeFnc->sxFnc.functionId)); +#if ENABLE_BACKGROUND_PARSING if (!fLambda && !isDeferredFnc && !isLikelyIIFE && @@ -5444,7 +5433,7 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho !(this->m_parseType == ParseType_Deferred && this->m_functionBody && this->m_functionBody->GetScopeInfo() && !isTopLevelDeferredFunc)) { doParallel = DoParallelParse(pnodeFnc); -#if ENABLE_BACKGROUND_PARSING + if (doParallel) { BackgroundParser *bgp = m_scriptContext->GetBackgroundParser(); @@ -5470,8 +5459,8 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho } } } -#endif } +#endif } if (!doParallel) @@ -5525,6 +5514,9 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho ppnodeExprScopeSave = m_ppnodeExprScope; m_ppnodeExprScope = nullptr; + uint parenExprDepthSave = m_funcParenExprDepth; + m_funcParenExprDepth = 0; + if (!skipFormals) { bool fLambdaParamsSave = m_reparsingLambdaParams; @@ -5539,7 +5531,7 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho saveDeferredStub = m_currDeferredStub; m_currDeferredStub = nullptr; } - this->ParseFncFormals(pnodeFnc, pnodeFncParent, flags); + this->ParseFncFormals(pnodeFnc, pnodeFncParent, flags, isTopLevelDeferredFunc); if (buildAST) { m_currDeferredStub = saveDeferredStub; @@ -5644,6 +5636,8 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho }); } + AssertMsg(m_funcParenExprDepth == 0, "Paren exprs should have been resolved by the time we finish function formals"); + if (fLambda) { #ifdef ASMJS_PLAT @@ -5751,6 +5745,9 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho } } + // Restore the paren count for any outer spread/rest error checking. + m_funcParenExprDepth = parenExprDepthSave; + if (pnodeInnerBlock) { FinishParseBlock(pnodeInnerBlock, *pNeedScanRCurly); @@ -6600,7 +6597,7 @@ void Parser::UpdateOrCheckForDuplicateInFormals(IdentPtr pid, SList *f } template -void Parser::ParseFncFormals(ParseNodePtr pnodeFnc, ParseNodePtr pnodeParentFnc, ushort flags) +void Parser::ParseFncFormals(ParseNodePtr pnodeFnc, ParseNodePtr pnodeParentFnc, ushort flags, bool isTopLevelDeferredFunc) { bool fLambda = (flags & fFncLambda) != 0; bool fMethod = (flags & fFncMethod) != 0; @@ -6701,7 +6698,15 @@ void Parser::ParseFncFormals(ParseNodePtr pnodeFnc, ParseNodePtr pnodeParentFnc, Assert(ppNodeLex != nullptr); ParseNodePtr paramPattern = nullptr; - ParseNodePtr pnodePattern = ParseDestructuredLiteral(tkLET, true /*isDecl*/, false /*topLevel*/); + ParseNodePtr pnodePattern = nullptr; + if (isTopLevelDeferredFunc) + { + pnodePattern = ParseDestructuredLiteral(tkLET, true /*isDecl*/, false /*topLevel*/); + } + else + { + pnodePattern = ParseDestructuredLiteral(tkLET, true /*isDecl*/, false /*topLevel*/); + } // Instead of passing the STFormal all the way on many methods, it seems it is better to change the symbol type afterward. for (ParseNodePtr lexNode = *ppNodeLex; lexNode != nullptr; lexNode = lexNode->sxVar.pnodeNext) @@ -6716,10 +6721,20 @@ void Parser::ParseFncFormals(ParseNodePtr pnodeFnc, ParseNodePtr pnodeParentFnc, } m_ppnodeVar = ppnodeVarSave; + if (buildAST) { - paramPattern = CreateParamPatternNode(pnodePattern); - + if (isTopLevelDeferredFunc) + { + Assert(pnodePattern == nullptr); + // Create a dummy pattern node as we need the node to be considered for the param count + paramPattern = CreateDummyParamPatternNode(m_pscan->IchMinTok()); + } + else + { + Assert(pnodePattern); + paramPattern = CreateParamPatternNode(pnodePattern); + } // Linking the current formal parameter (which is pattern parameter) with other formals. *m_ppnodeVar = paramPattern; paramPattern->sxParamPattern.pnodeNext = nullptr; @@ -6812,9 +6827,21 @@ void Parser::ParseFncFormals(ParseNodePtr pnodeFnc, ParseNodePtr pnodeParentFnc, } m_pscan->Scan(); - ParseNodePtr pnodeInit = ParseExpr(koplCma, nullptr, TRUE, FALSE, pNameHint, &nameHintLength, &nameHintOffset); - if (buildAST && pnodeInit->nop == knopFncDecl) + ParseNodePtr pnodeInit; + if (isTopLevelDeferredFunc) + { + // Defer default expressions if the function will be deferred, since we know they can't be evaluated + // until the function is fully compiled, and generating code for a function nested inside a deferred function + // creates inconsistencies. + pnodeInit = ParseExpr(koplCma, nullptr, TRUE, FALSE, pNameHint, &nameHintLength, &nameHintOffset); + } + else + { + pnodeInit = ParseExpr(koplCma, nullptr, TRUE, FALSE, pNameHint, &nameHintLength, &nameHintOffset); + } + + if (buildAST && pnodeInit && pnodeInit->nop == knopFncDecl) { Assert(nameHintLength >= nameHintOffset); pnodeInit->sxFnc.hint = pNameHint; @@ -7704,7 +7731,7 @@ ParseNodePtr Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, uin if (m_token.tk == tkEXTENDS) { m_pscan->Scan(); - pnodeExtends = ParseExpr(); + pnodeExtends = ParseTerm(); hasExtends = true; } @@ -7734,10 +7761,26 @@ ParseNodePtr Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, uin break; } - bool isStatic = m_token.tk == tkSTATIC; - if (isStatic) + bool isStatic = false; + if (m_token.tk == tkSTATIC) { + // 'static' can be used as an IdentifierName here, even in strict mode code. We need to see the next token before we know + // if this is being used as a keyword. This is similar to the way we treat 'let' in some cases. + // See https://tc39.github.io/ecma262/#sec-keywords for more info. + + RestorePoint beginStatic; + m_pscan->Capture(&beginStatic); + m_pscan->ScanForcingPid(); + + if (m_token.tk == tkLParen) + { + m_pscan->SeekTo(beginStatic); + } + else + { + isStatic = true; + } } ushort fncDeclFlags = fFncNoName | fFncMethod | fFncClassMember; @@ -8238,6 +8281,14 @@ LPCOLESTR Parser::ConstructNameHint(ParseNodePtr pNode, uint32* fullNameHintLeng { Assert(pNode != nullptr); Assert(pNode->nop == knopDot || pNode->nop == knopIndex); + + // This method recursively visits nodes in the AST and could cause an SOE crash for long knopDot chains. + // Although this method could be made non-recursive, Emit (ByteCodeEmitter.cpp) hits a stack probe + // for shorter chains than which cause SOE here, so add a stack probe to throw SOE rather than crash on SOE. + // Because of that correspondence, use Js::Constants::MinStackByteCodeVisitor (which is used in Emit) + // for the stack probe here. See OS#14711878. + PROBE_STACK_NO_DISPOSE(this->m_scriptContext, Js::Constants::MinStackByteCodeVisitor); + LPCOLESTR leftNode = nullptr; if (pNode->sxBin.pnode1->nop == knopDot || pNode->sxBin.pnode1->nop == knopIndex) { @@ -8492,14 +8543,15 @@ LPCOLESTR Parser::AppendNameHints(LPCOLESTR left, LPCOLESTR right, uint32 *pName */ void Parser::DeferOrEmitPotentialSpreadError(ParseNodePtr pnodeT) { - if (m_parenDepth > 0) + if (m_funcParenExprDepth > 0) { if (m_token.tk == tkRParen) { if (!m_deferEllipsisError) { - // Capture only the first error instance. - m_pscan->Capture(&m_EllipsisErrLoc); + // Capture only the first error instance. Because a lambda will cause a reparse in a formals context, we can assume + // that this will be a spread error. Nested paren exprs will have their own error instance. + m_pscan->Capture(&m_deferEllipsisErrorLoc); m_deferEllipsisError = true; } } @@ -8514,6 +8566,18 @@ void Parser::DeferOrEmitPotentialSpreadError(ParseNodePtr pnodeT) } } +bool Parser::IsTerminateToken() +{ + return (m_token.tk == tkRCurly || + m_token.tk == tkRBrack || + m_token.tk == tkRParen || + m_token.tk == tkSColon || + m_token.tk == tkColon || + m_token.tk == tkComma || + m_token.tk == tkLimKwd || + m_pscan->FHadNewLine()); +} + /*************************************************************************** Parse an optional sub expression returning null if there was no expression. Checks for no expression by looking for a token that can follow an @@ -8523,14 +8587,7 @@ template bool Parser::ParseOptionalExpr(ParseNodePtr* pnode, bool fUnaryOrParen, int oplMin, BOOL *pfCanAssign, BOOL fAllowIn, BOOL fAllowEllipsis, _Inout_opt_ IdentToken* pToken) { *pnode = nullptr; - if (m_token.tk == tkRCurly || - m_token.tk == tkRBrack || - m_token.tk == tkRParen || - m_token.tk == tkSColon || - m_token.tk == tkColon || - m_token.tk == tkComma || - m_token.tk == tkLimKwd || - m_pscan->FHadNewLine()) + if (IsTerminateToken()) { return false; } @@ -8749,8 +8806,8 @@ ParseNodePtr Parser::ParseExpr(int oplMin, { if (IsStrictMode()) { - if ((buildAST && pnode->sxUni.pnode1->nop == knopName) || - (!buildAST && operandToken.tk == tkID)) + if ((buildAST && pnode->sxUni.pnode1->IsUserIdentifier()) || + (!buildAST && operandToken.tk == tkID && !this->IsSpecialName(operandToken.pid))) { Error(ERRInvalidDelete); } @@ -9010,6 +9067,10 @@ ParseNodePtr Parser::ParseExpr(int oplMin, // ArrowFunction/AsyncArrowFunction is part of AssignmentExpression, which should terminate the expression unless followed by a comma if (m_token.tk != tkComma) { + if (!(IsTerminateToken())) + { + Error(ERRnoSemic); + } break; } } @@ -9475,7 +9536,7 @@ ParseNodePtr Parser::ParseTryCatchFinally() pnodeT->sxStmt.pnodeOuter = pnodeTC; pnodeTC->sxTryCatch.pnodeTry = pnodeT; } - PushStmt(&stmt, pnodeTC, knopTryCatch, nullptr, nullptr); + PushStmt(&stmt, pnodeTC, knopTryCatch, nullptr); ParseNodePtr pnodeCatch = ParseCatch(); if (buildAST) @@ -9491,6 +9552,7 @@ ParseNodePtr Parser::ParseTryCatchFinally() Error(ERRnoCatch); } Assert(!buildAST || pnodeTC); + this->m_tryCatchOrFinallyDepth--; return pnodeTC; } @@ -9499,7 +9561,7 @@ ParseNodePtr Parser::ParseTryCatchFinally() { pnodeTF = CreateNode(knopTryFinally); } - PushStmt(&stmt, pnodeTF, knopTryFinally, nullptr, nullptr); + PushStmt(&stmt, pnodeTF, knopTryFinally, nullptr); ParseNodePtr pnodeFinally = ParseFinally(); if (buildAST) { @@ -9538,7 +9600,7 @@ ParseNodePtr Parser::ParseTry() Error(ERRnoLcurly); } - PushStmt(&stmt, pnode, knopTry, nullptr, nullptr); + PushStmt(&stmt, pnode, knopTry, nullptr); ParseNodePtr pnodeBody = ParseStatement(); if (buildAST) { @@ -9566,7 +9628,7 @@ ParseNodePtr Parser::ParseFinally() Error(ERRnoLcurly); } - PushStmt(&stmt, pnode, knopFinally, nullptr, nullptr); + PushStmt(&stmt, pnode, knopFinally, nullptr); ParseNodePtr pnodeBody = ParseStatement(); if (buildAST) { @@ -9616,7 +9678,7 @@ ParseNodePtr Parser::ParseCatch() if (buildAST) { pnode = CreateNodeWithScanner(ichMin); - PushStmt(&stmt, pnode, knopCatch, nullptr, nullptr); + PushStmt(&stmt, pnode, knopCatch, nullptr); *ppnode = pnode; ppnode = &pnode->sxCatch.pnodeNext; *ppnode = nullptr; @@ -9788,7 +9850,6 @@ ParseNodePtr Parser::ParseStatement() BOOL fCanAssign; IdentPtr pid; uint fnop; - ParseNodePtr pnodeLabel = nullptr; bool expressionStmt = false; bool isAsyncMethod = false; tokens tok; @@ -9821,15 +9882,15 @@ ParseNodePtr Parser::ParseStatement() // create and push the try-catch node pParentTryCatchBlock = CreateBlockNode(); - PushStmt(&stmtTryCatchBlock, pParentTryCatchBlock, knopBlock, nullptr, nullptr); + PushStmt(&stmtTryCatchBlock, pParentTryCatchBlock, knopBlock, nullptr); pParentTryCatch = CreateNodeWithScanner(); - PushStmt(&stmtTryCatch, pParentTryCatch, knopTryCatch, nullptr, nullptr); + PushStmt(&stmtTryCatch, pParentTryCatch, knopTryCatch, nullptr); // create and push a try node pTry = CreateNodeWithScanner(); - PushStmt(&stmtTry, pTry, knopTry, nullptr, nullptr); + PushStmt(&stmtTry, pTry, knopTry, nullptr); pTryBlock = CreateBlockNode(); - PushStmt(&stmtTryBlock, pTryBlock, knopBlock, nullptr, nullptr); + PushStmt(&stmtTryBlock, pTryBlock, knopBlock, nullptr); // these nodes will be closed after the statement is parsed. } #endif // EXCEPTION_RECOVERY @@ -10101,7 +10162,7 @@ ParseNodePtr Parser::ParseStatement() TrackAssignment(pnodeT, nullptr); } - PushStmt(&stmt, pnode, isForOf ? knopForOf : knopForIn, pnodeLabel, pLabelIdList); + PushStmt(&stmt, pnode, isForOf ? knopForOf : knopForIn, pLabelIdList); ParseNodePtr pnodeBody = ParseStatement(); if (buildAST) @@ -10155,7 +10216,7 @@ ParseNodePtr Parser::ParseStatement() pnode->sxFor.pnodeIncr = pnodeIncr; pnode->ichLim = ichLim; } - PushStmt(&stmt, pnode, knopFor, pnodeLabel, pLabelIdList); + PushStmt(&stmt, pnode, knopFor, pLabelIdList); ParseNodePtr pnodeBody = ParseStatement(); if (buildAST) { @@ -10193,8 +10254,8 @@ ParseNodePtr Parser::ParseStatement() { pnode = CreateNodeWithScanner(ichMin); } - PushStmt(&stmt, pnode, knopSwitch, pnodeLabel, pLabelIdList); - pnodeBlock = StartParseBlock(PnodeBlockType::Regular, ScopeType_Block, nullptr, pLabelIdList); + PushStmt(&stmt, pnode, knopSwitch, pLabelIdList); + pnodeBlock = StartParseBlock(PnodeBlockType::Regular, ScopeType_Block); if (buildAST) { @@ -10295,7 +10356,7 @@ ParseNodePtr Parser::ParseStatement() } bool stashedDisallowImportExportStmt = m_disallowImportExportStmt; m_disallowImportExportStmt = true; - PushStmt(&stmt, pnode, knopWhile, pnodeLabel, pLabelIdList); + PushStmt(&stmt, pnode, knopWhile, pLabelIdList); ParseNodePtr pnodeBody = ParseStatement(); PopStmt(&stmt); @@ -10313,7 +10374,7 @@ ParseNodePtr Parser::ParseStatement() { pnode = CreateNodeWithScanner(); } - PushStmt(&stmt, pnode, knopDoWhile, pnodeLabel, pLabelIdList); + PushStmt(&stmt, pnode, knopDoWhile, pLabelIdList); m_pscan->Scan(); bool stashedDisallowImportExportStmt = m_disallowImportExportStmt; m_disallowImportExportStmt = true; @@ -10372,7 +10433,7 @@ ParseNodePtr Parser::ParseStatement() bool stashedDisallowImportExportStmt = m_disallowImportExportStmt; m_disallowImportExportStmt = true; - PushStmt(&stmt, pnode, knopIf, pnodeLabel, pLabelIdList); + PushStmt(&stmt, pnode, knopIf, pLabelIdList); ParseNodePtr pnodeTrue = ParseStatement(); ParseNodePtr pnodeFalse = nullptr; if (m_token.tk == tkELSE) @@ -10394,7 +10455,7 @@ ParseNodePtr Parser::ParseStatement() { pnode = CreateBlockNode(); pnode->grfpn |= PNodeFlags::fpnSyntheticNode; // block is not a user specifier block - PushStmt(&stmt, pnode, knopBlock, pnodeLabel, pLabelIdList); + PushStmt(&stmt, pnode, knopBlock, pLabelIdList); ParseNodePtr pnodeStmt = ParseTryCatchFinally(); if (buildAST) { @@ -10429,7 +10490,7 @@ ParseNodePtr Parser::ParseStatement() { pnode = CreateNodeWithScanner(ichMin); } - PushStmt(&stmt, pnode, knopWith, pnodeLabel, pLabelIdList); + PushStmt(&stmt, pnode, knopWith, pLabelIdList); ParseNodePtr *ppnodeExprScopeSave = nullptr; if (buildAST) @@ -10491,7 +10552,7 @@ ParseNodePtr Parser::ParseStatement() } case tkLCurly: - pnode = ParseBlock(pnodeLabel, pLabelIdList); + pnode = ParseBlock(pLabelIdList); break; case tkSColon: @@ -10520,24 +10581,19 @@ ParseNodePtr Parser::ParseStatement() { // Labeled break or continue. pid = m_token.GetIdentifier(m_phtbl); - AssertMem(pid); if (buildAST) { pnode->sxJump.hasExplicitTarget=true; pnode->ichLim = m_pscan->IchLimTok(); m_pscan->Scan(); - PushStmt(&stmt, pnode, pnode->nop, pnodeLabel, nullptr); + PushStmt(&stmt, pnode, pnode->nop, pLabelIdList); Assert(pnode->sxStmt.grfnop == 0); for (pstmt = m_pstmtCur; nullptr != pstmt; pstmt = pstmt->pstmtOuter) { - AssertNodeMem(pstmt->pnodeStmt); - AssertNodeMemN(pstmt->pnodeLab); - for (pnodeT = pstmt->pnodeLab; nullptr != pnodeT; - pnodeT = pnodeT->sxLabel.pnodeNext) + for (LabelId* label = pstmt->pLabelId; label != nullptr; label = label->next) { - Assert(knopLabel == pnodeT->nop); - if (pid == pnodeT->sxLabel.pid) + if (pid == label->pid) { // Found the label. Make sure we can use it. We can // break out of any statement, but we can only @@ -10590,13 +10646,13 @@ ParseNodePtr Parser::ParseStatement() { // If we're doing a fast scan, we're not tracking labels, so we can't accurately do this analysis. // Let the thread that's doing the full parse detect the error, if there is one. - if (!this->m_doingFastScan) + if (!this->IsDoingFastScan()) { // Unlabeled break or continue. if (buildAST) { pnode->sxJump.hasExplicitTarget=false; - PushStmt(&stmt, pnode, pnode->nop, pnodeLabel, nullptr); + PushStmt(&stmt, pnode, pnode->nop, pLabelIdList); Assert(pnode->sxStmt.grfnop == 0); } @@ -10663,12 +10719,10 @@ ParseNodePtr Parser::ParseStatement() pnode->ichLim = pnode->sxReturn.pnodeExpr->ichLim; } // See if return should call finally - PushStmt(&stmt, pnode, knopReturn, pnodeLabel, nullptr); + PushStmt(&stmt, pnode, knopReturn, pLabelIdList); Assert(pnode->sxStmt.grfnop == 0); for (pstmt = m_pstmtCur; nullptr != pstmt; pstmt = pstmt->pstmtOuter) { - AssertNodeMem(pstmt->pnodeStmt); - AssertNodeMemN(pstmt->pnodeLab); if (pstmt->pnodeStmt->Grfnop() & fnopCleanup) { pnode->sxStmt.grfnop |= fnopCleanup; @@ -10736,7 +10790,7 @@ ParseNodePtr Parser::ParseStatement() if (needTerminator) { - goto LNeedTerminator; + goto LNeedTerminator; } else { @@ -10749,69 +10803,27 @@ ParseNodePtr Parser::ParseStatement() { // First check for a label via lookahead. If not found, // rewind and reparse as expression statement. - if (m_token.tk == tkLParen || m_token.tk == tkID) + if (m_token.tk == tkID) { RestorePoint idStart; m_pscan->Capture(&idStart); - // Support legacy behavior of allowing parentheses around label identifiers. - // Require balanced parentheses for correcting parsing. Note unbalanced cases - // take care of themselves correctly by resulting in rewind and parsing as - // an expression statement. - // REVIEW[ianhall]: Can this legacy functionality be removed? Chrome does not support this parsing behavior. - uint parenCount = 0; - while (m_token.tk == tkLParen) - { - parenCount += 1; - m_pscan->Scan(); - } - - if (m_token.tk == tkID) - { - IdentToken tokInner; - tokInner.tk = tkID; - tokInner.ichMin = m_pscan->IchMinTok(); - tokInner.ichLim = m_pscan->IchLimTok(); - tokInner.pid = m_token.GetIdentifier(m_phtbl); + IdentPtr pidInner = m_token.GetIdentifier(m_phtbl); - m_pscan->Scan(); + m_pscan->Scan(); - while (parenCount > 0 && m_token.tk == tkRParen) + if (m_token.tk == tkColon) + { + // We have a label. + if (LabelExists(pidInner, pLabelIdList)) { - parenCount -= 1; - m_pscan->Scan(); - } - - if (parenCount == 0 && m_token.tk == tkColon) - { - // We have a label. - // TODO[ianhall]: Refactor to eliminate separate code paths for buildAST and !buildAST - if (buildAST) - { - // See if the label is already defined. - if (nullptr != PnodeLabel(tokInner.pid, pnodeLabel)) - { - Error(ERRbadLabel); - } - pnodeT = CreateNodeWithScanner(); - pnodeT->sxLabel.pid = tokInner.pid; - pnodeT->sxLabel.pnodeNext = pnodeLabel; - pnodeLabel = pnodeT; - } - else - { - // See if the label is already defined. - if (PnodeLabelNoAST(&tokInner, pLabelIdList)) - { - Error(ERRbadLabel); - } - LabelId* pLabelId = CreateLabelId(&tokInner); - pLabelId->next = pLabelIdList; - pLabelIdList = pLabelId; - } - m_pscan->Scan(); - goto LRestart; + Error(ERRbadLabel); } + LabelId* pLabelId = CreateLabelId(pidInner); + pLabelId->next = pLabelIdList; + pLabelIdList = pLabelId; + m_pscan->Scan(); + goto LRestart; } // No label, rewind back to the tkID and parse an expression @@ -10902,7 +10914,7 @@ ParseNodePtr Parser::ParseStatement() StmtNest stmtCatch; ParseNodePtr pCatch; pCatch = CreateNodeWithScanner(); - PushStmt(&stmtCatch, pCatch, knopCatch, nullptr, nullptr); + PushStmt(&stmtCatch, pCatch, knopCatch, nullptr); pCatch->sxCatch.pnodeBody = nullptr; if(pnode != nullptr) { @@ -11778,14 +11790,14 @@ ParseNodePtr Parser::Parse(LPCUTF8 pszSrc, size_t offset, size_t length, charcou if (m_stoppedDeferredParse) { +#if ENABLE_BACKGROUND_PARSING if (this->m_hasParallelJob) { -#if ENABLE_BACKGROUND_PARSING BackgroundParser *bgp = static_cast(m_scriptContext->GetBackgroundParser()); Assert(bgp); this->WaitForBackgroundJobs(bgp, pse); -#endif } +#endif // Do any remaining bindings of globals referenced in non-deferred functions. if (pnodeGlobalEvalBlock) @@ -11801,13 +11813,13 @@ ParseNodePtr Parser::Parse(LPCUTF8 pszSrc, size_t offset, size_t length, charcou // Restore global scope and blockinfo stacks preparatory to reparsing deferred functions. PushScope(pnodeGlobalBlock->sxBlock.scope); BlockInfoStack *newBlockInfo = PushBlockInfo(pnodeGlobalBlock); - PushStmt(&newBlockInfo->pstmt, pnodeGlobalBlock, knopBlock, nullptr, nullptr); + PushStmt(&newBlockInfo->pstmt, pnodeGlobalBlock, knopBlock, nullptr); if (pnodeGlobalEvalBlock) { PushScope(pnodeGlobalEvalBlock->sxBlock.scope); newBlockInfo = PushBlockInfo(pnodeGlobalEvalBlock); - PushStmt(&newBlockInfo->pstmt, pnodeGlobalEvalBlock, knopBlock, nullptr, nullptr); + PushStmt(&newBlockInfo->pstmt, pnodeGlobalEvalBlock, knopBlock, nullptr); } // Finally, see if there are any function bodies we now want to generate because we @@ -11911,6 +11923,7 @@ bool Parser::CheckAsmjsModeStrPid(IdentPtr pid) !m_pscan->IsEscapeOnLastTkStrCon() && wcsncmp(pid->Psz(), _u("use asm"), 10) == 0); +#ifdef ENABLE_SCRIPT_DEBUGGING if (isAsmCandidate && m_scriptContext->IsScriptContextInDebugMode()) { // We would like to report this to debugger - they may choose to disable debugging. @@ -11918,6 +11931,7 @@ bool Parser::CheckAsmjsModeStrPid(IdentPtr pid) m_scriptContext->RaiseMessageToDebugger(DEIT_ASMJS_IN_DEBUGGING, _u("AsmJs initialization error - AsmJs disabled due to script debugger"), m_sourceContextInfo && !m_sourceContextInfo->IsDynamic() ? m_sourceContextInfo->url : nullptr); return false; } +#endif return isAsmCandidate && !(m_grfscr & fscrNoAsmJs); #else @@ -11979,7 +11993,6 @@ void Parser::AddBackgroundParseItem(BackgroundParseItem *const item) } currBackgroundParseItem = item; } -#endif void Parser::AddFastScannedRegExpNode(ParseNodePtr const pnode) { @@ -11993,7 +12006,6 @@ void Parser::AddFastScannedRegExpNode(ParseNodePtr const pnode) fastScannedRegExpNodes->Append(pnode); } -#if ENABLE_BACKGROUND_PARSING void Parser::AddBackgroundRegExpNode(ParseNodePtr const pnode) { Assert(IsBackgroundParser()); @@ -12565,10 +12577,6 @@ ParseNode* Parser::CopyPnode(ParseNode *pnode) { break; //PTNODE(knopContinue , "continue" ,None ,Jump ,fnopNone) case knopContinue: - Assert(false); - break; - //PTNODE(knopLabel , "label" ,None ,Label,fnopNone) - case knopLabel: Assert(false); break; //PTNODE(knopSwitch , "switch" ,None ,Switch,fnopBreak) @@ -12690,7 +12698,7 @@ IdentPtr Parser::ParseSuper(bool fAllowCall) // Anything else is an error Error(ERRInvalidSuper); } - + return superPid; } @@ -12765,6 +12773,15 @@ ParseNodePtr Parser::CreateParamPatternNode(ParseNodePtr pnode1) return paramPatternNode; } +ParseNodePtr Parser::CreateDummyParamPatternNode(charcount_t ichMin) +{ + ParseNodePtr paramPatternNode = CreateNode(knopParamPattern, ichMin); + paramPatternNode->sxParamPattern.pnode1 = nullptr; + paramPatternNode->sxParamPattern.pnodeNext = nullptr; + paramPatternNode->sxParamPattern.location = Js::Constants::NoRegister; + return paramPatternNode; +} + ParseNodePtr Parser::ConvertObjectToObjectPattern(ParseNodePtr pnodeMemberList) { charcount_t ichMin = m_pscan->IchMinTok(); @@ -14021,12 +14038,6 @@ void PrintPnodeWIndent(ParseNode *pnode,int indentAmt) { Output::Print(_u("continue\n")); // TODO: some representation of target break; - //PTNODE(knopLabel , "label" ,None ,Label,fnopNone) - case knopLabel: - Indent(indentAmt); - Output::Print(_u("label %s"),pnode->sxLabel.pid->Psz()); - // TODO: print labeled statement - break; //PTNODE(knopSwitch , "switch" ,None ,Switch,fnopBreak) case knopSwitch: Indent(indentAmt); diff --git a/deps/chakrashim/core/lib/Parser/Parse.h b/deps/chakrashim/core/lib/Parser/Parse.h index e21d3ad28b4..2c0ec782717 100644 --- a/deps/chakrashim/core/lib/Parser/Parse.h +++ b/deps/chakrashim/core/lib/Parser/Parse.h @@ -71,8 +71,6 @@ struct BackgroundParseItem; struct PnClass; class HashTbl; -typedef void (*ParseErrorCallback)(void *data, charcount_t position, charcount_t length, HRESULT hr); - struct PidRefStack; struct DeferredFunctionStub; @@ -121,7 +119,6 @@ class Parser return pnode; } - public: #if DEBUG Parser(Js::ScriptContext* scriptContext, BOOL strictMode = FALSE, PageAllocator *alloc = nullptr, bool isBackground = false, size_t size = sizeof(Parser)); @@ -131,10 +128,14 @@ class Parser ~Parser(void); Js::ScriptContext* GetScriptContext() const { return m_scriptContext; } - void ClearScriptContext() { m_scriptContext = nullptr; } +#if ENABLE_BACKGROUND_PARSING bool IsBackgroundParser() const { return m_isInBackground; } bool IsDoingFastScan() const { return m_doingFastScan; } +#else + bool IsBackgroundParser() const { return false; } + bool IsDoingFastScan() const { return false; } +#endif bool GetIsInParsingArgList() const { return m_isInParsingArgList; } void SetIsInParsingArgList(bool set) { m_isInParsingArgList = set; } @@ -200,11 +201,11 @@ class Parser Js::LocalFunctionId * m_nextFunctionId; SourceContextInfo* m_sourceContextInfo; - ParseErrorCallback m_errorCallback; - void * m_errorCallbackData; - BOOL m_uncertainStructure; +#if ENABLE_BACKGROUND_PARSING bool m_hasParallelJob; + bool m_isInBackground; bool m_doingFastScan; +#endif int m_nextBlockId; // RegexPattern objects created for literal regexes are recycler-allocated and need to be kept alive until the function body @@ -224,9 +225,6 @@ class Parser __declspec(noreturn) void Error(HRESULT hr, charcount_t ichMin, charcount_t ichLim); __declspec(noreturn) static void OutOfMemory(); - void GenerateCode(ParseNodePtr pnode, void *pvUser, int32 cbUser, - LPCOLESTR pszSrc, int32 cchSrc, LPCOLESTR pszTitle); - void EnsureStackAvailable(); void IdentifierExpectedError(const Token& token); @@ -276,8 +274,8 @@ class Parser ParseNodePtr CreateTempRef(ParseNode* tempNode); ParseNodePtr CreateNode(OpCode nop) { return CreateNode(nop, m_pscan? m_pscan->IchMinTok() : 0); } - ParseNodePtr CreateDeclNode(OpCode nop, IdentPtr pid, SymbolType symbolType, bool errorOnRedecl = true, bool *isRedecl = nullptr); - Symbol* AddDeclForPid(ParseNodePtr pnode, IdentPtr pid, SymbolType symbolType, bool errorOnRedecl, bool *isRedecl = nullptr); + ParseNodePtr CreateDeclNode(OpCode nop, IdentPtr pid, SymbolType symbolType, bool errorOnRedecl = true); + Symbol* AddDeclForPid(ParseNodePtr pnode, IdentPtr pid, SymbolType symbolType, bool errorOnRedecl); void CheckRedeclarationErrorForBlockId(IdentPtr pid, int blockId); ParseNodePtr CreateNameNode(IdentPtr pid) { @@ -332,9 +330,9 @@ class Parser charcount_t ichMin,charcount_t ichLim); void PrepareScanner(bool fromExternal); +#if ENABLE_BACKGROUND_PARSING void PrepareForBackgroundParse(); void AddFastScannedRegExpNode(ParseNodePtr const pnode); -#if ENABLE_BACKGROUND_PARSING void AddBackgroundRegExpNode(ParseNodePtr const pnode); void AddBackgroundParseItem(BackgroundParseItem *const item); void FinishBackgroundRegExpNodes(); @@ -346,7 +344,7 @@ class Parser void CheckPidIsValid(IdentPtr pid, bool autoArgumentsObject = false); void AddVarDeclToBlock(ParseNode *pnode); // Add a var declaration. Only use while parsing. Assumes m_ppnodeVar is pointing to the right place already - ParseNodePtr CreateVarDeclNode(IdentPtr pid, SymbolType symbolType, bool autoArgumentsObject = false, ParseNodePtr pnodeFnc = NULL, bool checkReDecl = true, bool *isRedecl = nullptr); + ParseNodePtr CreateVarDeclNode(IdentPtr pid, SymbolType symbolType, bool autoArgumentsObject = false, ParseNodePtr pnodeFnc = NULL, bool checkReDecl = true); // Add a var declaration, during parse tree rewriting. Will setup m_ppnodeVar for the given pnodeFnc ParseNodePtr AddVarDeclNode(IdentPtr pid, ParseNodePtr pnodeFnc); // Add a 'const' or 'let' declaration. @@ -397,8 +395,7 @@ class Parser ParseNodePtr * m_ppnodeScope; // function list tail ParseNodePtr * m_ppnodeExprScope; // function expression list tail ParseNodePtr * m_ppnodeVar; // variable list tail - bool m_inDeferredNestedFunc; // true if parsing a function in deferred mode, nested within the current node - bool m_isInBackground; + bool m_inDeferredNestedFunc; // true if parsing a function in deferred mode, nested within the current node bool m_reparsingLambdaParams; bool m_disallowImportExportStmt; bool m_isInParsingArgList; @@ -443,7 +440,6 @@ class Parser charcount_t m_funcInArray; uint m_scopeCountNoAst; - /* * Parsing states for super restriction */ @@ -453,10 +449,10 @@ class Parser uint m_parsingSuperRestrictionState; friend class AutoParsingSuperRestrictionStateRestorer; - // Used for issuing spread and rest errors when there is ambiguity with parameter list and parenthesized expressions - uint m_parenDepth; + // Used for issuing spread and rest errors when there is ambiguity with lambda parameter lists and parenthesized expressions + uint m_funcParenExprDepth; bool m_deferEllipsisError; - RestorePoint m_EllipsisErrLoc; + RestorePoint m_deferEllipsisErrorLoc; uint m_tryCatchOrFinallyDepth; // Used to determine if parsing is currently in a try/catch/finally block in order to throw error on yield expressions inside them @@ -497,6 +493,7 @@ class Parser case knopLetDecl: case knopFncDecl: case knopName: + case knopParamPattern: return true; default: @@ -508,20 +505,14 @@ class Parser bool NextTokenIsPropertyNameStart() const { return m_token.tk == tkID || m_token.tk == tkStrCon || m_token.tk == tkIntCon || m_token.tk == tkFltCon || m_token.tk == tkLBrack || m_token.IsReservedWord(); } template - void PushStmt(StmtNest *pStmt, ParseNodePtr pnode, OpCode op, ParseNodePtr pnodeLab, LabelId* pLabelIdList) + void PushStmt(StmtNest *pStmt, ParseNodePtr pnode, OpCode op, LabelId* pLabelIdList) { - AssertMem(pStmt); - if (buildAST) { - AssertNodeMem(pnode); - AssertNodeMemN(pnodeLab); - pnode->sxStmt.grfnop = 0; pnode->sxStmt.pnodeOuter = (NULL == m_pstmtCur) ? NULL : m_pstmtCur->pnodeStmt; pStmt->pnodeStmt = pnode; - pStmt->pnodeLab = pnodeLab; } else { @@ -529,8 +520,8 @@ class Parser pStmt->pnodeStmt = 0; pStmt->isDeferred = true; pStmt->op = op; - pStmt->pLabelId = pLabelIdList; } + pStmt->pLabelId = pLabelIdList; pStmt->pstmtOuter = m_pstmtCur; SetCurrentStatement(pStmt); } @@ -542,8 +533,6 @@ class Parser void PushDynamicBlock(); void PopDynamicBlock(); - ParseNodePtr PnodeLabel(IdentPtr pid, ParseNodePtr pnodeLabels); - void MarkEvalCaller() { if (this->GetCurrentFunctionNode()) @@ -756,15 +745,16 @@ class Parser // TODO: We should really call this StartScope and separate out the notion of scopes and blocks; // blocks refer to actual curly braced syntax, whereas scopes contain symbols. All blocks have // a scope, but some statements like for loops or the with statement introduce a block-less scope. - template ParseNodePtr StartParseBlock(PnodeBlockType blockType, ScopeType scopeType, ParseNodePtr pnodeLabel = NULL, LabelId* pLabelId = NULL); + template ParseNodePtr StartParseBlock(PnodeBlockType blockType, ScopeType scopeType, LabelId* pLabelId = nullptr); template ParseNodePtr StartParseBlockWithCapacity(PnodeBlockType blockType, ScopeType scopeType, int capacity); - template ParseNodePtr StartParseBlockHelper(PnodeBlockType blockType, Scope *scope, ParseNodePtr pnodeLabel, LabelId* pLabelId); + template ParseNodePtr StartParseBlockHelper(PnodeBlockType blockType, Scope *scope, LabelId* pLabelId); void PushFuncBlockScope(ParseNodePtr pnodeBlock, ParseNodePtr **ppnodeScopeSave, ParseNodePtr **ppnodeExprScopeSave); void PopFuncBlockScope(ParseNodePtr *ppnodeScopeSave, ParseNodePtr *ppnodeExprScopeSave); - template ParseNodePtr ParseBlock(ParseNodePtr pnodeLabel, LabelId* pLabelId); + template ParseNodePtr ParseBlock(LabelId* pLabelId); void FinishParseBlock(ParseNode *pnodeBlock, bool needScanRCurly = true); void FinishParseFncExprScope(ParseNodePtr pnodeFnc, ParseNodePtr pnodeFncExprScope); + bool IsSpecialName(IdentPtr pid); void CreateSpecialSymbolDeclarations(ParseNodePtr pnodeFnc, bool isGlobal); ParseNodePtr ReferenceSpecialName(IdentPtr pid, charcount_t ichMin = 0, charcount_t ichLim = 0, bool createNode = false); ParseNodePtr CreateSpecialVarDeclIfNeeded(ParseNodePtr pnodeFnc, IdentPtr pid, bool forceCreate = false); @@ -783,6 +773,8 @@ class Parser template ParseNodePtr ParseMemberList(LPCOLESTR pNameHint, uint32 *pHintLength, tokens declarationType = tkNone); template IdentPtr ParseSuper(bool fAllowCall); + bool IsTerminateToken(); + // Used to determine the type of JavaScript object member. // The values can be combined using bitwise OR. // specifically, it is valid to have getter and setter at the same time. @@ -804,7 +796,7 @@ class Parser template ParseNodePtr ParseMemberGetSet(OpCode nop, LPCOLESTR* ppNameHint); template ParseNodePtr ParseFncDecl(ushort flags, LPCOLESTR pNameHint = NULL, const bool needsPIDOnRCurlyScan = false, bool resetParsingSuperRestrictionState = true, bool fUnaryOrParen = false); template bool ParseFncNames(ParseNodePtr pnodeFnc, ParseNodePtr pnodeFncParent, ushort flags, ParseNodePtr **pLastNodeRef); - template void ParseFncFormals(ParseNodePtr pnodeFnc, ParseNodePtr pnodeParentFnc, ushort flags); + template void ParseFncFormals(ParseNodePtr pnodeFnc, ParseNodePtr pnodeParentFnc, ushort flags, bool isTopLevelDeferredFunc = false); template bool ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, ushort flags, bool *pHasName, bool fUnaryOrParen, bool noStmtContext, bool *pNeedScanRCurly, bool skipFormals = false); template void ParseExpressionLambdaBody(ParseNodePtr pnodeFnc); template void UpdateCurrentNodeFunc(ParseNodePtr pnodeFnc, bool fLambda); @@ -932,6 +924,7 @@ class Parser BOOL IsConstantInArrayLiteral(ParseNodePtr pnode); ParseNodePtr CreateParamPatternNode(ParseNodePtr pnode1); + ParseNodePtr CreateDummyParamPatternNode(charcount_t ichMin); ParseNodePtr ConvertMemberToMemberPattern(ParseNodePtr pnodeMember); ParseNodePtr ConvertObjectToObjectPattern(ParseNodePtr pnodeMemberList); @@ -1024,8 +1017,8 @@ class Parser void RestoreScopeInfo(Js::ScopeInfo * scopeInfo); void FinishScopeInfo(Js::ScopeInfo * scopeInfo); - BOOL PnodeLabelNoAST(IdentToken* pToken, LabelId* pLabelIdList); - LabelId* CreateLabelId(IdentToken* pToken); + bool LabelExists(IdentPtr pid, LabelId* pLabelIdList); + LabelId* CreateLabelId(IdentPtr pid); void AddToNodeList(ParseNode ** ppnodeList, ParseNode *** pppnodeLast, ParseNode * pnodeAdd); void AddToNodeListEscapedUse(ParseNode ** ppnodeList, ParseNode *** pppnodeLast, ParseNode * pnodeAdd); diff --git a/deps/chakrashim/core/lib/Parser/ParseFlags.h b/deps/chakrashim/core/lib/Parser/ParseFlags.h index 9a1d31d2a8f..6344c188ef3 100644 --- a/deps/chakrashim/core/lib/Parser/ParseFlags.h +++ b/deps/chakrashim/core/lib/Parser/ParseFlags.h @@ -4,23 +4,19 @@ //------------------------------------------------------------------------------------------------------- #pragma once - // Parse flags enum { fscrNil = 0, - fscrHtmlComments = 1 << 0, // throw away html style comments + // Unused = 1 << 0, fscrReturnExpression = 1 << 1, // call should return the last expression fscrImplicitThis = 1 << 2, // 'this.' is optional (for Call) fscrImplicitParents = 1 << 3, // the parents of 'this' are implicit - fscrMapQuote = 1 << 4, // map single quote to double quote + // Unused = 1 << 4, fscrDynamicCode = 1 << 5, // The code is being generated dynamically (eval, new Function, etc.) // Unused = 1 << 6, fscrNoImplicitHandlers = 1 << 7, // same as Opt NoConnect at start of block - - // prevents the need to make a copy to strip off trailing html comments - // - modifies the behavior of fscrHtmlComments - fscrDoNotHandleTrailingHtmlComments = 1 << 8, + // Unused = 1 << 8, #if DEBUG fscrEnforceJSON = 1 << 9, // used together with fscrReturnExpression @@ -38,7 +34,7 @@ enum fscrAllowFunctionProxy = 1 << 17, // Allow creation of function proxies instead of function bodies fscrIsLibraryCode = 1 << 18, // Current code is engine library code written in Javascript fscrNoDeferParse = 1 << 19, // Do not defer parsing - // Unused = 1 << 20, + fscrJsBuiltIn = 1 << 20, // Current code is a JS built in code written in JavaScript #ifdef IR_VIEWER fscrIrDumpEnable = 1 << 21, // Allow parseIR to generate an IR dump #endif /* IRVIEWER */ diff --git a/deps/chakrashim/core/lib/Parser/RegexCompileTime.cpp b/deps/chakrashim/core/lib/Parser/RegexCompileTime.cpp index 2b27c0242b9..513843362f5 100644 --- a/deps/chakrashim/core/lib/Parser/RegexCompileTime.cpp +++ b/deps/chakrashim/core/lib/Parser/RegexCompileTime.cpp @@ -54,7 +54,7 @@ namespace UnifiedRegex } #define EMIT(compiler, T, ...) (new (compiler.Emit(sizeof(T))) T(__VA_ARGS__)) -#define L2I(O, label) LabelToInstPointer(Inst::O, label) +#define L2I(O, label) LabelToInstPointer(Inst::InstTag::O, label) // Remember: The machine address of an instruction is no longer valid after a subsequent emit, // so all label fixups must be done using Compiler::GetFixup / Compiler::DoFixup @@ -525,7 +525,15 @@ namespace UnifiedRegex // - not in a negative assertion // - backtracking could never rewind the input pointer // - EMIT(compiler, BOITestInst, isAtLeastOnce && isNotNegated && isPrevWillNotRegress); + bool canHardFail = isAtLeastOnce && isNotNegated && isPrevWillNotRegress; + if (canHardFail) + { + EMIT(compiler, BOITestInst); + } + else + { + EMIT(compiler, BOITestInst); + } } } break; @@ -533,13 +541,16 @@ namespace UnifiedRegex case EOL: { if ((compiler.program->flags & MultilineRegexFlag) != 0) + { // // Compilation scheme: // // EOLTest // EMIT(compiler, EOLTestInst); + } else + { // // Compilation scheme: // @@ -550,7 +561,16 @@ namespace UnifiedRegex // - not in a negative assertion // - backtracking could never advance the input pointer // - EMIT(compiler, EOITestInst, isAtLeastOnce && isNotNegated && isPrevWillNotProgress); + bool canHardFail = isAtLeastOnce && isNotNegated && isPrevWillNotProgress; + if (canHardFail) + { + EMIT(compiler, EOITestInst); + } + else + { + EMIT(compiler, EOITestInst); + } + } break; } default: @@ -726,7 +746,15 @@ namespace UnifiedRegex // // WordBoundaryTest // - EMIT(compiler, WordBoundaryTestInst, isNegation); + if (isNegation) + { + EMIT(compiler, WordBoundaryTestInst); + } + else + { + EMIT(compiler, WordBoundaryTestInst); + + } } CharCount WordBoundaryNode::EmitScan(Compiler& compiler, bool isHeadSyncronizingNode) @@ -2295,9 +2323,13 @@ namespace UnifiedRegex } numItems++; if (!curr->head->firstSet->IsCompact()) + { allCompact = false; + } if (!curr->head->IsSimpleOneChar()) + { allSimpleOneChar = false; + } totalChars += curr->head->firstSet->Count(); } @@ -2311,25 +2343,28 @@ namespace UnifiedRegex { // **COMMIT** if (allSimpleOneChar) + { // This will probably never fire since the parser has already converted alts-of-chars/sets // to sets. We include it for symmetry with below. scheme = Set; - else if (allCompact && totalChars <= Switch20Inst::MaxCases) + } + else if (allCompact && totalChars <= Switch24Inst::MaxCases) { // Can use a switch instruction to jump to item scheme = Switch; switchSize = totalChars; } else + { // Must use a chain of jump instructions to jump to item scheme = Chain; + } isOptional = false; return; } } } - // // Compilation scheme: None/Switch/Chain/Set, isOptional // @@ -2362,7 +2397,9 @@ namespace UnifiedRegex for (AltNode* curr = this; curr != 0; curr = curr->tail) { if (curr->head->IsEmptyOnly()) + { fires = true; + } else if (curr->head->thisConsumes.CouldMatchEmpty()) { fires = false; @@ -2372,9 +2409,13 @@ namespace UnifiedRegex { numNonEmpty++; if (!curr->head->IsSimpleOneChar()) + { allSimpleOneChar = false; + } if (!curr->head->firstSet->IsCompact()) + { allCompact = false; + } totalChars += curr->head->firstSet->Count(); } } @@ -2397,23 +2438,31 @@ namespace UnifiedRegex unionSet.UnionInPlace(compiler.ctAllocator, *firstSet); unionSet.UnionInPlace(compiler.ctAllocator, *followSet); if (totalChars + followSet->Count() == unionSet.Count()) + { fires = true; + } } if (fires) { // **COMMIT** if (numNonEmpty == 0) + { scheme = None; + } else if (allSimpleOneChar) + { scheme = Set; - else if (numNonEmpty > 1 && allCompact && totalChars <= Switch20Inst::MaxCases) + } + else if (numNonEmpty > 1 && allCompact && totalChars <= Switch24Inst::MaxCases) { switchSize = totalChars; scheme = Switch; } else + { scheme = Chain; + } isOptional = true; return; } @@ -2671,7 +2720,7 @@ namespace UnifiedRegex // // Compilation scheme: // - // Switch(AndConsume)?(10|20)() + // Switch(AndConsume)?(2|4|8|16|24)() // Fail (if non-optional) // Jump Lexit (if optional) // L1: @@ -2681,7 +2730,7 @@ namespace UnifiedRegex // L3: // Lexit: // - Assert(switchSize <= Switch20Inst::MaxCases); + Assert(switchSize <= Switch24Inst::MaxCases); int numItems = 0; bool allCanSkip = true; for (AltNode* curr = this; curr != 0; curr = curr->tail) @@ -2694,7 +2743,9 @@ namespace UnifiedRegex { numItems++; if (!curr->head->SupportsPrefixSkipping(compiler)) + { allCanSkip = false; + } } } Assert(numItems > 1); @@ -2705,28 +2756,73 @@ namespace UnifiedRegex Label* caseLabels = AnewArray(compiler.ctAllocator, Label, numItems); // We must fixup the switch arms Label switchLabel = compiler.CurrentLabel(); - Assert(switchSize <= Switch20Inst::MaxCases); + + Assert(switchSize <= Switch24Inst::MaxCases); if (allCanSkip) { - if (switchSize > Switch10Inst::MaxCases) - EMIT(compiler, SwitchAndConsume20Inst); + if (switchSize <= Switch2Inst::MaxCases) + { + EMIT(compiler, SwitchAndConsume2Inst); + } + else if (switchSize <= Switch4Inst::MaxCases) + { + EMIT(compiler, SwitchAndConsume4Inst); + } + else if (switchSize <= Switch8Inst::MaxCases) + { + EMIT(compiler, SwitchAndConsume8Inst); + } + else if (switchSize <= Switch16Inst::MaxCases) + { + EMIT(compiler, SwitchAndConsume16Inst); + } + else if (switchSize <= Switch24Inst::MaxCases) + { + EMIT(compiler, SwitchAndConsume24Inst); + } else - EMIT(compiler, SwitchAndConsume10Inst); + { + AssertOrFailFastMsg(false, "It should not be possible to reach here. This implies that we entered the Switch layout with greater than the max allowable cases."); + } } else { - if (switchSize > Switch10Inst::MaxCases) - EMIT(compiler, Switch20Inst); + if (switchSize <= Switch2Inst::MaxCases) + { + EMIT(compiler, Switch2Inst); + } + else if (switchSize <= Switch4Inst::MaxCases) + { + EMIT(compiler, Switch4Inst); + } + else if (switchSize <= Switch8Inst::MaxCases) + { + EMIT(compiler, Switch8Inst); + } + else if (switchSize <= Switch16Inst::MaxCases) + { + EMIT(compiler, Switch16Inst); + } + else if (switchSize <= Switch24Inst::MaxCases) + { + EMIT(compiler, Switch24Inst); + } else - EMIT(compiler, Switch10Inst); + { + AssertOrFailFastMsg(false, "It should not be possible to reach here. This implies that we entered the Switch layout with greater than the max allowable cases."); + } } Label defaultJumpFixup = 0; if (isOptional) + { // Must fixup default jump to exit defaultJumpFixup = compiler.GetFixup(&EMIT(compiler, JumpInst)->targetLabel); + } else + { compiler.Emit(); + } // Emit each item int item = 0; @@ -2735,20 +2831,29 @@ namespace UnifiedRegex if (!curr->head->thisConsumes.CouldMatchEmpty()) { if (allCanSkip) + { skipped = 1; + } caseLabels[item] = compiler.CurrentLabel(); curr->head->Emit(compiler, skipped); if (item < numItems - 1) + { jumpFixups[item] = compiler.GetFixup(&EMIT(compiler, JumpInst)->targetLabel); + } item++; } } // Fixup exit labels if (isOptional) + { compiler.DoFixup(defaultJumpFixup, compiler.CurrentLabel()); + } + for (item = 0; item < numItems - 1; item++) + { compiler.DoFixup(jumpFixups[item], compiler.CurrentLabel()); + } // Fixup the switch entries item = 0; @@ -2763,17 +2868,49 @@ namespace UnifiedRegex { if (allCanSkip) { - if (switchSize > Switch10Inst::MaxCases) - compiler.L2I(SwitchAndConsume20, switchLabel)->AddCase(entries[i], caseLabels[item]); - else - compiler.L2I(SwitchAndConsume10, switchLabel)->AddCase(entries[i], caseLabels[item]); + if (switchSize <= Switch2Inst::MaxCases) + { + compiler.L2I(SwitchAndConsume2, switchLabel)->AddCase(entries[i], caseLabels[item]); + } + else if (switchSize <= Switch4Inst::MaxCases) + { + compiler.L2I(SwitchAndConsume4, switchLabel)->AddCase(entries[i], caseLabels[item]); + } + else if (switchSize <= Switch8Inst::MaxCases) + { + compiler.L2I(SwitchAndConsume8, switchLabel)->AddCase(entries[i], caseLabels[item]); + } + else if (switchSize <= Switch16Inst::MaxCases) + { + compiler.L2I(SwitchAndConsume16, switchLabel)->AddCase(entries[i], caseLabels[item]); + } + else if (switchSize <= Switch24Inst::MaxCases) + { + compiler.L2I(SwitchAndConsume24, switchLabel)->AddCase(entries[i], caseLabels[item]); + } } else { - if (switchSize > Switch10Inst::MaxCases) - compiler.L2I(Switch20, switchLabel)->AddCase(entries[i], caseLabels[item]); - else - compiler.L2I(Switch10, switchLabel)->AddCase(entries[i], caseLabels[item]); + if (switchSize <= Switch2Inst::MaxCases) + { + compiler.L2I(Switch2, switchLabel)->AddCase(entries[i], caseLabels[item]); + } + else if (switchSize <= Switch4Inst::MaxCases) + { + compiler.L2I(Switch4, switchLabel)->AddCase(entries[i], caseLabels[item]); + } + else if (switchSize <= Switch8Inst::MaxCases) + { + compiler.L2I(Switch8, switchLabel)->AddCase(entries[i], caseLabels[item]); + } + else if (switchSize <= Switch16Inst::MaxCases) + { + compiler.L2I(Switch16, switchLabel)->AddCase(entries[i], caseLabels[item]); + } + else if (switchSize <= Switch24Inst::MaxCases) + { + compiler.L2I(Switch24, switchLabel)->AddCase(entries[i], caseLabels[item]); + } } } item++; @@ -4452,7 +4589,7 @@ namespace UnifiedRegex #endif ) { - program->tag = Program::InstructionsTag; + program->tag = Program::ProgramTag::InstructionsTag; CaptureNoLiterals(program); EmitAndCaptureSuccInst(pattern->GetScriptContext()->GetRecycler(), program); } @@ -4532,7 +4669,7 @@ namespace UnifiedRegex { program->rep.insts.litbuf = nullptr; oi.InitializeTrigramInfo(scriptContext, pattern); - program->tag = Program::OctoquadTag; + program->tag = Program::ProgramTag::OctoquadTag; program->rep.octoquad.matcher = OctoquadMatcher::New(scriptContext->GetRecycler(), standardChars, program->GetCaseMappingSource(), &oi); compiled = true; } @@ -4549,29 +4686,29 @@ namespace UnifiedRegex if (root->IsSingleChar(compiler, c)) { // SPECIAL CASE: c - program->tag = Program::SingleCharTag; + program->tag = Program::ProgramTag::SingleCharTag; program->rep.singleChar.c = c; } else if (root->IsBoundedWord(compiler)) { // SPECIAL CASE: \b\w+\b - program->tag = Program::BoundedWordTag; + program->tag = Program::ProgramTag::BoundedWordTag; } else if (root->IsLeadingTrailingSpaces(compiler, program->rep.leadingTrailingSpaces.beginMinMatch, program->rep.leadingTrailingSpaces.endMinMatch)) { // SPECIAL CASE: ^\s*|\s*$ - program->tag = Program::LeadingTrailingSpacesTag; + program->tag = Program::ProgramTag::LeadingTrailingSpacesTag; } else if (root->IsBOILiteral2(compiler)) { - program->tag = Program::BOILiteral2Tag; + program->tag = Program::ProgramTag::BOILiteral2Tag; program->rep.boiLiteral2.literal = *(DWORD *)litbuf; } else { - program->tag = Program::InstructionsTag; + program->tag = Program::ProgramTag::InstructionsTag; compiler.CaptureLiterals(root, litbuf); root->AnnotatePass0(compiler); @@ -4649,7 +4786,7 @@ namespace UnifiedRegex } else { - program->tag = Program::InstructionsTag; + program->tag = Program::ProgramTag::InstructionsTag; compiler.CaptureLiterals(root, litbuf); CharCount skipped = 0; root->Emit(compiler, skipped); @@ -4661,7 +4798,7 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS if (w != 0) { - w->PrintEOL(_u("REGEX PROGRAM /%s/ "), PointerValue(program->source)); + w->PrintEOL(_u("REGEX PROGRAM /%s/"), PointerValue(program->source)); program->Print(w); w->Flush(); } diff --git a/deps/chakrashim/core/lib/Parser/RegexCompileTime.h b/deps/chakrashim/core/lib/Parser/RegexCompileTime.h index 2f293bd60c4..d3e17829111 100644 --- a/deps/chakrashim/core/lib/Parser/RegexCompileTime.h +++ b/deps/chakrashim/core/lib/Parser/RegexCompileTime.h @@ -8,6 +8,8 @@ #pragma once +#include "RuntimeCommon.h" + namespace UnifiedRegex { // FORWARD @@ -617,8 +619,9 @@ namespace UnifiedRegex T* Emit(); // The instruction buffer may move, so we need to remember label fixup's relative to the instruction base - // rather than as machine addresses - inline Label GetFixup(Label* pLabel) + // rather than as machine addresses. + // NOTE: pLabel is declared unaligned because Inst structs are unaligned in the inst buffer (thanks to #pragma pack(1)). + inline Label GetFixup(unaligned Label* pLabel) { Assert((uint8*)pLabel >= instBuf && (uint8*)pLabel < instBuf + instNext); return (Label)((uint8*)pLabel - instBuf); @@ -661,20 +664,20 @@ namespace UnifiedRegex void SetBOIInstructionsProgramTag() { - Assert(this->program->tag == Program::InstructionsTag - || this->program->tag == Program::BOIInstructionsTag); + Assert(this->program->tag == Program::ProgramTag::InstructionsTag + || this->program->tag == Program::ProgramTag::BOIInstructionsTag); Assert(this->CurrentLabel() == 0); - this->program->tag = Program::BOIInstructionsTag; + this->program->tag = Program::ProgramTag::BOIInstructionsTag; } void SetBOIInstructionsProgramForStickyFlagTag() { - Assert(this->program->tag == Program::InstructionsTag - || this->program->tag == Program::BOIInstructionsForStickyFlagTag); + Assert(this->program->tag == Program::ProgramTag::InstructionsTag + || this->program->tag == Program::ProgramTag::BOIInstructionsForStickyFlagTag); Assert(this->CurrentLabel() == 0); AssertMsg((this->program->flags & StickyRegexFlag) != 0, "Shouldn't set BOIInstructionsForStickyFlagTag, if sticky is false."); - this->program->tag = Program::BOIInstructionsForStickyFlagTag; + this->program->tag = Program::ProgramTag::BOIInstructionsForStickyFlagTag; } static void CaptureNoLiterals(Program* program); diff --git a/deps/chakrashim/core/lib/Parser/RegexOpCodes.h b/deps/chakrashim/core/lib/Parser/RegexOpCodes.h index 10cfc4b1cdc..fdebe6bf0bf 100644 --- a/deps/chakrashim/core/lib/Parser/RegexOpCodes.h +++ b/deps/chakrashim/core/lib/Parser/RegexOpCodes.h @@ -6,6 +6,8 @@ // ClassName == TagName##Inst // MTemplate(TagName, TemplateDeclaration, GenericClassName, SpecializedClassName) +// 0x00 +M(Nop) // Opcode byte 0x00 is a NOP (allows for NOP-sleds for alignment if necessary) M(Fail) M(Succ) M(Jump) @@ -13,15 +15,27 @@ M(JumpIfNotChar) M(MatchCharOrJump) M(JumpIfNotSet) M(MatchSetOrJump) -M(Switch10) -M(Switch20) -M(SwitchAndConsume10) -M(SwitchAndConsume20) -M(BOITest) -M(EOITest) +// 0x08 +M(Switch2) +M(Switch4) +M(Switch8) +M(Switch16) // 16 = 0x10 +M(Switch24) // 24 = 0x18 (support at least 20 slots from previous iteration, less fragmentation (<= 7 empty) +M(SwitchAndConsume2) +M(SwitchAndConsume4) +M(SwitchAndConsume8) +M(SwitchAndConsume16) +M(SwitchAndConsume24) +MTemplate(BOIHardFailTest, template, BOITestInst, BOITestInst) +MTemplate(BOITest, template, BOITestInst, BOITestInst) +MTemplate(EOIHardFailTest, template, EOITestInst, EOITestInst) +MTemplate(EOITest, template, EOITestInst, EOITestInst) M(BOLTest) M(EOLTest) -M(WordBoundaryTest) +// TODO (doilij) update Tag numbers +// 0x10 +MTemplate(NegatedWordBoundaryTest, template, WordBoundaryTestInst, WordBoundaryTestInst) +MTemplate(WordBoundaryTest, template, WordBoundaryTestInst, WordBoundaryTestInst) M(MatchChar) M(MatchChar2) M(MatchChar3) @@ -29,6 +43,7 @@ M(MatchChar4) MTemplate(MatchSet, template, MatchSetInst, MatchSetInst) MTemplate(MatchNegatedSet, template, MatchSetInst, MatchSetInst) M(MatchLiteral) +// 0x18 M(MatchLiteralEquiv) M(MatchTrie) M(OptMatchChar) @@ -37,30 +52,35 @@ M(SyncToCharAndContinue) M(SyncToChar2SetAndContinue) MTemplate(SyncToSetAndContinue, template, SyncToSetAndContinueInst, SyncToSetAndContinueInst) MTemplate(SyncToNegatedSetAndContinue, template, SyncToSetAndContinueInst, SyncToSetAndContinueInst) -M(SyncToChar2LiteralAndContinue) -M(SyncToLiteralAndContinue) -M(SyncToLinearLiteralAndContinue) -M(SyncToLiteralEquivAndContinue) -M(SyncToLiteralEquivTrivialLastPatCharAndContinue) +// 0x20 +M(SyncToChar2LiteralAndContinue) // SyncToLiteralAndContinueInstT +M(SyncToLiteralAndContinue) // SyncToLiteralAndContinueInstT +M(SyncToLinearLiteralAndContinue) // SyncToLiteralAndContinueInstT +M(SyncToLiteralEquivAndContinue) // SyncToLiteralAndContinueInstT +M(SyncToLiteralEquivTrivialLastPatCharAndContinue) // SyncToLiteralAndContinueInstT M(SyncToCharAndConsume) M(SyncToChar2SetAndConsume) MTemplate(SyncToSetAndConsume, template, SyncToSetAndConsumeInst, SyncToSetAndConsumeInst) +// 0x28 MTemplate(SyncToNegatedSetAndConsume, template, SyncToSetAndConsumeInst, SyncToSetAndConsumeInst) -M(SyncToChar2LiteralAndConsume) -M(SyncToLiteralAndConsume) -M(SyncToLinearLiteralAndConsume) -M(SyncToLiteralEquivAndConsume) -M(SyncToLiteralEquivTrivialLastPatCharAndConsume) +M(SyncToChar2LiteralAndConsume) // SyncToLiteralAndConsumeInstT +M(SyncToLiteralAndConsume) // SyncToLiteralAndConsumeInstT +M(SyncToLinearLiteralAndConsume) // SyncToLiteralAndConsumeInstT +M(SyncToLiteralEquivAndConsume) // SyncToLiteralAndConsumeInstT +M(SyncToLiteralEquivTrivialLastPatCharAndConsume) // SyncToLiteralAndConsumeInstT M(SyncToCharAndBackup) +// REVIEW (doilij): why not have a SyncToChar2SetAndBackup ? MTemplate(SyncToSetAndBackup, template, SyncToSetAndBackupInst, SyncToSetAndBackupInst) +// 0x30 MTemplate(SyncToNegatedSetAndBackup, template, SyncToSetAndBackupInst, SyncToSetAndBackupInst) -M(SyncToChar2LiteralAndBackup) -M(SyncToLiteralAndBackup) -M(SyncToLinearLiteralAndBackup) -M(SyncToLiteralEquivAndBackup) -M(SyncToLiteralEquivTrivialLastPatCharAndBackup) +M(SyncToChar2LiteralAndBackup) // SyncToLiteralAndBackupInstT +M(SyncToLiteralAndBackup) // SyncToLiteralAndBackupInstT +M(SyncToLinearLiteralAndBackup) // SyncToLiteralAndBackupInstT +M(SyncToLiteralEquivAndBackup) // SyncToLiteralAndBackupInstT +M(SyncToLiteralEquivTrivialLastPatCharAndBackup) // SyncToLiteralAndBackupInstT M(SyncToLiteralsAndBackup) M(MatchGroup) +// 0x38 M(BeginDefineGroup) M(EndDefineGroup) M(DefineGroupFixed) @@ -69,6 +89,7 @@ M(RepeatLoop) M(BeginLoopIfChar) M(BeginLoopIfSet) M(RepeatLoopIfChar) +// 0x40 M(RepeatLoopIfSet) M(BeginLoopFixed) M(RepeatLoopFixed) @@ -77,6 +98,7 @@ M(LoopSetWithFollowFirst) M(BeginLoopFixedGroupLastIteration) M(RepeatLoopFixedGroupLastIteration) M(BeginGreedyLoopNoBacktrack) +// 0x48 M(RepeatGreedyLoopNoBacktrack) MTemplate(ChompCharStar, template, ChompCharInst, ChompCharInst) MTemplate(ChompCharPlus, template, ChompCharInst, ChompCharInst) @@ -85,6 +107,7 @@ MTemplate(ChompSetPlus, template, ChompSetInst, ChompSetInst, ChompCharGroupInst, ChompCharGroupInst) MTemplate(ChompCharGroupPlus, template, ChompCharGroupInst, ChompCharGroupInst) MTemplate(ChompSetGroupStar, template, ChompSetGroupInst, ChompSetGroupInst) +// 0x50 MTemplate(ChompSetGroupPlus, template, ChompSetGroupInst, ChompSetGroupInst) M(ChompCharBounded) M(ChompSetBounded) @@ -93,6 +116,7 @@ M(Try) M(TryIfChar) M(TryMatchChar) M(TryIfSet) +// 0x58 M(TryMatchSet) M(BeginAssertion) M(EndAssertion) diff --git a/deps/chakrashim/core/lib/Parser/RegexParser.cpp b/deps/chakrashim/core/lib/Parser/RegexParser.cpp index e59dcd58c66..33ae8aa6d78 100644 --- a/deps/chakrashim/core/lib/Parser/RegexParser.cpp +++ b/deps/chakrashim/core/lib/Parser/RegexParser.cpp @@ -769,11 +769,11 @@ namespace UnifiedRegex last->head = revisedPrev; nextList = nextList->tail; } - AnalysisAssert(nextList != nullptr); if (last == 0) node = Anew(ctAllocator, AltNode, node, nextList); else last->tail = nextList; + AnalysisAssert(nextList != nullptr); while (nextList->tail != 0) nextList = nextList->tail; last = nextList; diff --git a/deps/chakrashim/core/lib/Parser/RegexPattern.cpp b/deps/chakrashim/core/lib/Parser/RegexPattern.cpp index 0615a7f791c..5f5200bfd03 100644 --- a/deps/chakrashim/core/lib/Parser/RegexPattern.cpp +++ b/deps/chakrashim/core/lib/Parser/RegexPattern.cpp @@ -7,7 +7,7 @@ namespace UnifiedRegex { RegexPattern::RegexPattern(Js::JavascriptLibrary *const library, Program* program, bool isLiteral) - : library(library), isLiteral(isLiteral), isShallowClone(false) + : library(library), isLiteral(isLiteral), isShallowClone(false), testCache(nullptr) { rep.unified.program = program; rep.unified.matcher = nullptr; @@ -128,6 +128,21 @@ namespace UnifiedRegex return result; } + Field(RegExpTestCache*) RegexPattern::EnsureTestCache() + { + if (this->testCache == nullptr) + { + this->testCache = RecyclerNewPlusZ(this->library->GetRecycler(), TestCacheSize * sizeof(void*), RegExpTestCache); + } + return this->testCache; + } + + /* static */ + uint RegexPattern::GetTestCacheIndex(Js::JavascriptString* str) + { + return (uint)(((uintptr_t)str) >> PolymorphicInlineCacheShift) & (TestCacheSize - 1); + } + #if ENABLE_REGEX_CONFIG_OPTIONS void RegexPattern::Print(DebugWriter* w) { @@ -178,5 +193,33 @@ namespace UnifiedRegex w->Print(isLiteral ? _u("literal") : _u("dynamic")); w->Print(_u(" */")); } + + /* static */ + void RegexPattern::TraceTestCache(bool cacheHit, Js::JavascriptString* input, Js::JavascriptString* cachedValue, bool disabled) + { + if (REGEX_CONFIG_FLAG(RegexTracing)) + { + if (disabled) + { + Output::Print(_u("Regexp Test Cache Disabled.\n")); + } + else if (cacheHit) + { + Output::Print(_u("Regexp Test Cache Hit.\n")); + } + else + { + Output::Print(_u("Regexp Test Cache Miss. ")); + if (cachedValue != nullptr) + { + Output::Print(_u("Input: (%p); Cached String: (%p) '%s'\n"), input, cachedValue, cachedValue->GetString()); + } + else + { + Output::Print(_u("Cache was empty\n")); + } + } + } + } #endif } diff --git a/deps/chakrashim/core/lib/Parser/RegexPattern.h b/deps/chakrashim/core/lib/Parser/RegexPattern.h index 1e91eb39a45..3f2a31f4ad4 100644 --- a/deps/chakrashim/core/lib/Parser/RegexPattern.h +++ b/deps/chakrashim/core/lib/Parser/RegexPattern.h @@ -15,8 +15,17 @@ namespace UnifiedRegex class Matcher; struct TrigramInfo; + static const uint TestCacheSize = 8; + + struct RegExpTestCache + { + Field(BVStatic) resultBV; + Field(RecyclerWeakReference*) inputArray[]; + }; + struct RegexPattern : FinalizableObject { + Field(RegExpTestCache*) testCache; struct UnifiedRep { @@ -60,9 +69,17 @@ namespace UnifiedRegex Js::InternalString GetSource() const; RegexFlags GetFlags() const; + + Field(RegExpTestCache*) EnsureTestCache(); + static uint GetTestCacheIndex(Js::JavascriptString* str); + #if ENABLE_REGEX_CONFIG_OPTIONS void Print(DebugWriter* w); #endif RegexPattern *CopyToScriptContext(Js::ScriptContext *scriptContext); + +#if ENABLE_REGEX_CONFIG_OPTIONS + static void TraceTestCache(bool cacheHit, Js::JavascriptString* input, Js::JavascriptString* cachedValue, bool disabled); +#endif }; } diff --git a/deps/chakrashim/core/lib/Parser/RegexRuntime.cpp b/deps/chakrashim/core/lib/Parser/RegexRuntime.cpp index 4a084dcc7ef..b750713b3af 100644 --- a/deps/chakrashim/core/lib/Parser/RegexRuntime.cpp +++ b/deps/chakrashim/core/lib/Parser/RegexRuntime.cpp @@ -14,7 +14,9 @@ namespace UnifiedRegex void CountDomain::Print(DebugWriter* w) const { if (upper != CharCountFlag && lower == (CharCount)upper) + { w->Print(_u("[%u]"), lower); + } else { w->Print(_u("[%u-"), lower); @@ -32,7 +34,7 @@ namespace UnifiedRegex #define PUSH(contStack, T, ...) (new (contStack.Push()) T(__VA_ARGS__)) #define PUSHA(assertionStack, T, ...) (new (assertionStack.Push()) T(__VA_ARGS__)) -#define L2I(O, label) LabelToInstPointer(Inst::O, label) +#define L2I(O, label) LabelToInstPointer(Inst::InstTag::O, label) #define FAIL_PARAMETERS input, inputOffset, instPointer, contStack, assertionStack, qcTicks #define HARDFAIL_PARAMETERS(mode) input, inputLength, matchStart, inputOffset, instPointer, contStack, assertionStack, qcTicks, mode @@ -80,7 +82,9 @@ namespace UnifiedRegex void Matcher::PopStats(ContStack& contStack, const Char* const input) const { if (stats != 0) + { stats->numPops++; + } if (w != 0) { const Cont* top = contStack.Top(); @@ -97,7 +101,9 @@ namespace UnifiedRegex void Matcher::UnPopStats(ContStack& contStack, const Char* const input) const { if (stats != 0) + { stats->numPops--; + } if (w != 0) { const Cont* top = contStack.Top(); @@ -114,13 +120,17 @@ namespace UnifiedRegex void Matcher::CompStats() const { if (stats != 0) + { stats->numCompares++; + } } void Matcher::InstStats() const { if (stats != 0) + { stats->numInsts++; + } } #endif @@ -132,15 +142,19 @@ namespace UnifiedRegex Assert(!(TicksPerQcTimeCheck & TicksPerQcTimeCheck - 1)); // must be a power of 2 Assert(TicksPerQcTimeCheck < TicksPerQc); - if(PHASE_OFF1(Js::RegexQcPhase)) + if (PHASE_OFF1(Js::RegexQcPhase)) + { return; - if(++qcTicks & TicksPerQcTimeCheck - 1) + } + if (++qcTicks & TicksPerQcTimeCheck - 1) + { return; + } DoQueryContinue(qcTicks); } - inline bool Matcher::HardFail - ( const Char* const input + inline bool Matcher::HardFail( + const Char* const input , const CharCount inputLength , CharCount &matchStart , CharCount &inputOffset @@ -148,13 +162,13 @@ namespace UnifiedRegex , ContStack &contStack , AssertionStack &assertionStack , uint &qcTicks - , HardFailMode mode ) + , HardFailMode mode) { switch (mode) { - case BacktrackAndLater: + case HardFailMode::BacktrackAndLater: return Fail(FAIL_PARAMETERS); - case BacktrackOnly: + case HardFailMode::BacktrackOnly: if (Fail(FAIL_PARAMETERS)) { // No use trying any more start positions @@ -162,22 +176,27 @@ namespace UnifiedRegex return true; // STOP EXECUTING } else + { return false; - case LaterOnly: + } + case HardFailMode::LaterOnly: #if ENABLE_REGEX_CONFIG_OPTIONS if (w != 0) + { w->PrintEOL(_u("CLEAR")); + } #endif contStack.Clear(); assertionStack.Clear(); return true; // STOP EXECUTING - case ImmediateFail: + case HardFailMode::ImmediateFail: // No use trying any more start positions matchStart = inputLength; return true; // STOP EXECUTING default: Assume(false); } + return true; } @@ -192,7 +211,9 @@ namespace UnifiedRegex // NOTE: We don't include the effective pops in the stats #if ENABLE_REGEX_CONFIG_OPTIONS if (w != 0) + { w->PrintEOL(_u("POP TO %llu"), (unsigned long long)info->contStackPosition); + } #endif contStack.PopTo(info->contStackPosition); @@ -204,7 +225,9 @@ namespace UnifiedRegex // true true Fail into outer continuations (inner group binding MUST BE CLEARED) if (succeeded && begin->isNegation) + { ResetInnerGroups(begin->minBodyGroupId, begin->maxBodyGroupId); + } if (succeeded == begin->isNegation) { @@ -228,8 +251,10 @@ namespace UnifiedRegex const Char *const input, ContStack &contStack) { - if(toGroupId >= 0) + if (toGroupId >= 0) + { DoSaveInnerGroups(fromGroupId, toGroupId, reset, input, contStack); + } } void Matcher::DoSaveInnerGroups( @@ -248,14 +273,16 @@ namespace UnifiedRegex do { GroupInfo *const groupInfo = GroupIdToGroupInfo(groupId); - if(groupInfo->IsUndefined()) + if (groupInfo->IsUndefined()) { - if(undefinedRangeFromId < 0) + if (undefinedRangeFromId < 0) + { undefinedRangeFromId = groupId; + } continue; } - if(undefinedRangeFromId >= 0) + if (undefinedRangeFromId >= 0) { Assert(groupId > 0); DoSaveInnerGroups_AllUndefined(undefinedRangeFromId, groupId - 1, input, contStack); @@ -267,10 +294,12 @@ namespace UnifiedRegex PushStats(contStack, input); #endif - if(reset) + if (reset) + { groupInfo->Reset(); - } while(++groupId <= toGroupId); - if(undefinedRangeFromId >= 0) + } + } while (++groupId <= toGroupId); + if (undefinedRangeFromId >= 0) { Assert(toGroupId >= 0); DoSaveInnerGroups_AllUndefined(undefinedRangeFromId, toGroupId, input, contStack); @@ -283,8 +312,10 @@ namespace UnifiedRegex const Char *const input, ContStack &contStack) { - if(toGroupId >= 0) + if (toGroupId >= 0) + { DoSaveInnerGroups_AllUndefined(fromGroupId, toGroupId, input, contStack); + } } void Matcher::DoSaveInnerGroups_AllUndefined( @@ -298,16 +329,21 @@ namespace UnifiedRegex Assert(fromGroupId <= toGroupId); #if DBG - for(int groupId = fromGroupId; groupId <= toGroupId; ++groupId) + for (int groupId = fromGroupId; groupId <= toGroupId; ++groupId) { Assert(GroupIdToGroupInfo(groupId)->IsUndefined()); } #endif - if(fromGroupId == toGroupId) + if (fromGroupId == toGroupId) + { PUSH(contStack, ResetGroupCont, fromGroupId); + } else + { PUSH(contStack, ResetGroupRangeCont, fromGroupId, toGroupId); + } + #if ENABLE_REGEX_CONFIG_OPTIONS PushStats(contStack, input); #endif @@ -322,7 +358,9 @@ namespace UnifiedRegex inline void Matcher::ResetInnerGroups(int minGroupId, int maxGroupId) { for (int i = minGroupId; i <= maxGroupId; i++) + { ResetGroup(i); + } } #if ENABLE_REGEX_CONFIG_OPTIONS @@ -335,6 +373,91 @@ namespace UnifiedRegex { return IsBaselineMode() ? (Label)0xFFFF : label; } + + template + void Inst::PrintBytes(DebugWriter *w, Inst *inst, T *that, const char16 *annotation) const + { + T *start = (T*)that; + byte *startByte = (byte *)start; + byte *baseByte = (byte *)inst; + ptrdiff_t offset = startByte - baseByte; + size_t size = sizeof(*((T *)that)); + byte *endByte = startByte + size; + byte *currentByte = startByte; + w->Print(_u("0x%p[+0x%03x](0x%03x)(size:0x%02x)(align:0x%02x) [%s]:"), startByte, offset, size, sizeof(T), alignof(T), annotation); + + for (; currentByte < endByte; ++currentByte) + { + if ((currentByte - endByte) % 4 == 0) + { + w->Print(_u(" "), *currentByte); + } + w->Print(_u("%02x"), *currentByte); + } + w->PrintEOL(_u("")); + } + + template <> + void Inst::PrintBytes(DebugWriter *w, Inst *inst, Inst *that, const char16 *annotation) const + { + Inst *start = (Inst *)that; + + size_t baseSize = sizeof(*(Inst *)that); + ptrdiff_t offsetToData = (byte *)&(start->tag) - ((byte *)start); + size_t size = baseSize - offsetToData; + + byte *startByte = (byte *)(&(start->tag)); + byte *endByte = startByte + size; + byte *currentByte = startByte; + w->Print(_u("0x%p[+0x%03x](0x%03x)(size:0x%02x)(align:0x%02x) [%s]:"), startByte, offsetToData, size, sizeof(Inst), alignof(Inst), annotation); + for (; currentByte < endByte; ++currentByte) + { + if ((currentByte - endByte) % 4 == 0) + { + w->Print(_u(" "), *currentByte); + } + w->Print(_u("%02x"), *currentByte); + } + w->PrintEOL(_u("")); + } + +#define PRINT_BYTES(InstType) \ + Inst::PrintBytes(w, (Inst *)this, (InstType *)this, _u(#InstType)) + +#define PRINT_BYTES_ANNOTATED(InstType, Annotation) \ + Inst::PrintBytes(w, (Inst *)this, (InstType *)this, (Annotation)) + +#define PRINT_MIXIN(Mixin) \ + ((Mixin *)this)->Print(w, litbuf) + +#define PRINT_MIXIN_ARGS(Mixin, ...) \ + ((Mixin *)this)->Print(w, litbuf, __VA_ARGS__) + +#define PRINT_MIXIN_COMMA(Mixin) \ + PRINT_MIXIN(Mixin); \ + w->Print(_u(", ")); + +#define PRINT_RE_BYTECODE_BEGIN(Name) \ + w->Print(_u("L%04x: "), label); \ + if (REGEX_CONFIG_FLAG(RegexBytecodeDebug)) \ + { \ + w->Print(_u("(0x%03x bytes) "), sizeof(*this)); \ + } \ + w->Print(_u(Name)); \ + w->Print(_u("(")); + +#define PRINT_RE_BYTECODE_MID() \ + w->PrintEOL(_u(")")); \ + if (REGEX_CONFIG_FLAG(RegexBytecodeDebug)) \ + { \ + w->Indent(); \ + PRINT_BYTES(Inst); + +#define PRINT_RE_BYTECODE_END() \ + w->Unindent(); \ + } \ + return sizeof(*this); + #endif // ---------------------------------------------------------------------- @@ -402,10 +525,14 @@ namespace UnifiedRegex for (int i = 0; i < CaseInsensitive::EquivClassSize; i++) { if (i > 0) + { w->Print(_u(", ")); + } w->Print(_u("\"")); for (CharCount j = 0; j < length; j++) + { w->PrintEscapedChar(litbuf[offset + j * CaseInsensitive::EquivClassSize + i]); + } w->Print(_u("\"")); } } @@ -524,8 +651,8 @@ namespace UnifiedRegex ScannerMixinT::Match(Matcher& matcher, const char16 * const input, const CharCount inputLength, CharCount& inputOffset) const { Assert(length <= matcher.program->rep.insts.litbufLen - offset); - return scanner.template Match<1> - ( input + return scanner.template Match<1>( + input , inputLength , inputOffset , matcher.program->rep.insts.litbuf + offset @@ -558,8 +685,8 @@ namespace UnifiedRegex { Assert(length * CaseInsensitive::EquivClassSize <= matcher.program->rep.insts.litbufLen - offset); CompileAssert(lastPatCharEquivClassSize >= 1 && lastPatCharEquivClassSize <= CaseInsensitive::EquivClassSize); - return scanner.Match - ( input + return scanner.Match( + input , inputLength , inputOffset , matcher.program->rep.insts.litbuf + offset @@ -620,7 +747,9 @@ namespace UnifiedRegex for (int i = 0; i < numLiterals; i++) { if (i > 0) + { w->Print(_u(", ")); + } infos[i]->Print(w, litbuf); } w->Print(_u("}")); @@ -639,15 +768,17 @@ namespace UnifiedRegex { w->Print(_u("set: ")); if (IsNegation) + { w->Print(_u("not ")); + } set.Print(w); } #endif #if ENABLE_REGEX_CONFIG_OPTIONS - void HardFailMixin::Print(DebugWriter* w, const char16* litbuf) const + void TrieMixin::Print(DebugWriter* w, const char16* litbuf) const { - w->Print(_u("hardFail: %s"), canHardFail ? _u("true") : _u("false")); + trie.Print(w); } #endif @@ -681,12 +812,27 @@ namespace UnifiedRegex #endif #if ENABLE_REGEX_CONFIG_OPTIONS - void BeginLoopMixin::Print(DebugWriter* w, const char16* litbuf) const + void BeginLoopBasicsMixin::Print(DebugWriter* w, const char16* litbuf) const { w->Print(_u("loopId: %d, repeats: "), loopId); repeats.Print(w); - w->Print(_u(", exitLabel: L%04x, hasOuterLoops: %s, hasInnerNondet: %s"), - Inst::GetPrintLabel(exitLabel), hasOuterLoops ? _u("true") : _u("false"), hasInnerNondet ? _u("true") : _u("false")); + w->Print(_u(", hasOuterLoops: %s"), hasOuterLoops ? _u("true") : _u("false")); + } +#endif + +#if ENABLE_REGEX_CONFIG_OPTIONS + void BeginLoopMixin::Print(DebugWriter* w, const char16* litbuf) const + { + BeginLoopBasicsMixin::Print(w, litbuf); + w->Print(_u(", hasInnerNondet: %s, exitLabel: L%04x, "), + hasInnerNondet ? _u("true") : _u("false"), Inst::GetPrintLabel(exitLabel)); + } +#endif + +#if ENABLE_REGEX_CONFIG_OPTIONS + void GreedyMixin::Print(DebugWriter* w, const char16* litbuf) const + { + w->Print(_u("greedy: %s"), isGreedy ? _u("true") : _u("false")); } #endif @@ -697,6 +843,13 @@ namespace UnifiedRegex } #endif +#if ENABLE_REGEX_CONFIG_OPTIONS + void GreedyLoopNoBacktrackMixin::Print(DebugWriter* w, const char16* litbuf) const + { + w->Print(_u("loopId: %d, exitLabel: L%04x"), loopId, exitLabel); + } +#endif + #if ENABLE_REGEX_CONFIG_OPTIONS void TryMixin::Print(DebugWriter* w, const char16* litbuf) const { @@ -704,6 +857,20 @@ namespace UnifiedRegex } #endif +#if ENABLE_REGEX_CONFIG_OPTIONS + void NegationMixin::Print(DebugWriter* w, const char16* litbuf) const + { + w->Print(_u("isNegation: %s"), isNegation ? _u("true") : _u("false")); + } +#endif + +#if ENABLE_REGEX_CONFIG_OPTIONS + void NextLabelMixin::Print(DebugWriter* w, const char16* litbuf) const + { + w->Print(_u("nextLabel: L%04x"), Inst::GetPrintLabel(nextLabel)); + } +#endif + #if ENABLE_REGEX_CONFIG_OPTIONS void FixedLengthMixin::Print(DebugWriter* w, const char16* litbuf) const { @@ -711,6 +878,13 @@ namespace UnifiedRegex } #endif +#if ENABLE_REGEX_CONFIG_OPTIONS + void FollowFirstMixin::Print(DebugWriter* w, const char16* litbuf) const + { + w->Print(_u("followFirst: %c"), followFirst); + } +#endif + #if ENABLE_REGEX_CONFIG_OPTIONS void NoNeedToSaveMixin::Print(DebugWriter* w, const char16* litbuf) const { @@ -727,21 +901,24 @@ namespace UnifiedRegex } #endif - template + template void SwitchMixin::AddCase(char16 c, Label targetLabel) { - Assert(numCases < MaxCases); - int i; - __analysis_assume(numCases < MaxCases); + AnalysisAssert(numCases < MaxCases); + uint8 i; for (i = 0; i < numCases; i++) { Assert(cases[i].c != c); if (cases[i].c > c) + { break; + } } __analysis_assume(numCases < MaxCases); - for (int j = numCases; j > i; j--) + for (uint8 j = numCases; j > i; j--) + { cases[j] = cases[j - 1]; + } cases[i].c = c; cases[i].targetLabel = targetLabel; numCases++; @@ -749,34 +926,62 @@ namespace UnifiedRegex void UnifiedRegexSwitchMixinForceAllInstantiations() { - { - SwitchMixin<10> x; - x.AddCase(0, 0); #if ENABLE_REGEX_CONFIG_OPTIONS - x.Print(0, 0); -#endif - } - { - SwitchMixin<20> x; - x.AddCase(0, 0); -#if ENABLE_REGEX_CONFIG_OPTIONS - x.Print(0, 0); +#define SWITCH_FORCE_INSTANTIATION_PRINT x.Print(0, 0) +#else +#define SWITCH_FORCE_INSTANTIATION_PRINT #endif + +#define SWITCH_FORCE_INSTANTIATION(n) \ + { \ + SwitchMixin x; \ + x.AddCase(0, 0); \ + SWITCH_FORCE_INSTANTIATION_PRINT; \ } + + SWITCH_FORCE_INSTANTIATION(2); + SWITCH_FORCE_INSTANTIATION(4); + SWITCH_FORCE_INSTANTIATION(8); + SWITCH_FORCE_INSTANTIATION(16); + SWITCH_FORCE_INSTANTIATION(24); + +#undef SWITCH_FORCE_INSTANTIATION_PRINT +#undef SWITCH_FORCE_INSTANTIATION } #if ENABLE_REGEX_CONFIG_OPTIONS - template + template void SwitchMixin::Print(DebugWriter* w, const char16* litbuf) const { w->EOL(); w->Indent(); - for (int i = 0; i < numCases; i++) + for (uint8 i = 0; i < numCases; i++) + { cases[i].Print(w); + } w->Unindent(); } #endif + // ---------------------------------------------------------------------- + // NopInst + // ---------------------------------------------------------------------- + + inline bool NopInst::Exec(REGEX_INST_EXEC_PARAMETERS) const + { + return false; // don't stop execution + } + +#if ENABLE_REGEX_CONFIG_OPTIONS + int NopInst::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + PRINT_RE_BYTECODE_BEGIN("Nop"); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(NopInst); + PRINT_RE_BYTECODE_END(); + } +#endif + // ---------------------------------------------------------------------- // FailInst // ---------------------------------------------------------------------- @@ -789,8 +994,10 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int FailInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->PrintEOL(_u("L%04x: Fail()"), label); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("Fail"); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(NopInst); + PRINT_RE_BYTECODE_END(); } #endif @@ -809,8 +1016,10 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int SuccInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->PrintEOL(_u("L%04x: Succ()"), label); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("Succ"); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(NopInst); + PRINT_RE_BYTECODE_END(); } #endif @@ -827,10 +1036,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int JumpInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: Jump("), label); - JumpMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("Jump"); + PRINT_MIXIN(JumpMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(JumpMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -844,21 +1054,26 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset < inputLength && input[inputOffset] == c) + { instPointer += sizeof(*this); + } else + { instPointer = matcher.LabelToInstPointer(targetLabel); + } return false; } #if ENABLE_REGEX_CONFIG_OPTIONS int JumpIfNotCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: JumpIfNotChar("), label); - CharMixin::Print(w, litbuf); - w->Print(_u(", ")); - JumpMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("JumpIfNotChar"); + PRINT_MIXIN_COMMA(CharMixin); + PRINT_MIXIN(JumpMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_BYTES(JumpMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -877,23 +1092,25 @@ namespace UnifiedRegex instPointer += sizeof(*this); } else + { instPointer = matcher.LabelToInstPointer(targetLabel); + } return false; } #if ENABLE_REGEX_CONFIG_OPTIONS int MatchCharOrJumpInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchCharOrJump("), label); - CharMixin::Print(w, litbuf); - w->Print(_u(", ")); - JumpMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchCharOrJump"); + PRINT_MIXIN_COMMA(CharMixin); + PRINT_MIXIN(JumpMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_BYTES(JumpMixin); + PRINT_RE_BYTECODE_END(); } #endif - // ---------------------------------------------------------------------- // JumpIfNotSetInst (optimized instruction) // ---------------------------------------------------------------------- @@ -904,21 +1121,26 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset < inputLength && set.Get(input[inputOffset])) + { instPointer += sizeof(*this); + } else + { instPointer = matcher.LabelToInstPointer(targetLabel); + } return false; } #if ENABLE_REGEX_CONFIG_OPTIONS int JumpIfNotSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: JumpIfNotSet("), label); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - JumpMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("JumpIfNotSet"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN(JumpMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(JumpMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -937,311 +1159,187 @@ namespace UnifiedRegex instPointer += sizeof(*this); } else + { instPointer = matcher.LabelToInstPointer(targetLabel); + } return false; } #if ENABLE_REGEX_CONFIG_OPTIONS int MatchSetOrJumpInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchSetOrJump("), label); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - JumpMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchSetOrJump"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN(JumpMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(JumpMixin); + PRINT_RE_BYTECODE_END(); } #endif // ---------------------------------------------------------------------- - // Switch10Inst (optimized instruction) + // Switch(AndConsume)Inst (optimized instructions) // ---------------------------------------------------------------------- - inline bool Switch10Inst::Exec(REGEX_INST_EXEC_PARAMETERS) const - { - if (inputOffset >= inputLength) - return matcher.Fail(FAIL_PARAMETERS); -#if 0 - int l = 0; - int h = numCases - 1; - while (l <= h) - { - int m = (l + h) / 2; -#if ENABLE_REGEX_CONFIG_OPTIONS - matcher.CompStats(); -#endif - if (cases[m].c == input[inputOffset]) - { - instPointer = matcher.LabelToInstPointer(cases[m].targetLabel); - return false; - } - else if (cases[m].c < input[inputOffset]) - l = m + 1; - else - h = m - 1; - } -#else - const int localNumCases = numCases; - for (int i = 0; i < localNumCases; i++) - { #if ENABLE_REGEX_CONFIG_OPTIONS - matcher.CompStats(); -#endif - if (cases[i].c == input[inputOffset]) - { - instPointer = matcher.LabelToInstPointer(cases[i].targetLabel); - return false; - } - else if (cases[i].c > input[inputOffset]) - break; - } -#endif - - instPointer += sizeof(*this); - return false; +#define COMP_STATS matcher.CompStats() +#define SwitchAndConsumeInstPrintImpl(BaseName, n) \ + int BaseName##n##Inst::Print(DebugWriter* w, Label label, const Char* litbuf) const \ + { \ + PRINT_RE_BYTECODE_BEGIN("SwitchAndConsume"#n); \ + PRINT_MIXIN(SwitchMixin); \ + PRINT_RE_BYTECODE_MID(); \ + PRINT_BYTES(SwitchMixin); \ + PRINT_RE_BYTECODE_END(); \ } - -#if ENABLE_REGEX_CONFIG_OPTIONS - int Switch10Inst::Print(DebugWriter* w, Label label, const Char* litbuf) const - { - w->Print(_u("L%04x: Switch10("), label); - SwitchMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); - } -#endif +#else +#define COMP_STATS +#define SwitchAndConsumeInstPrintImpl(BaseName, n) +#endif + +#define SwitchAndConsumeInstImpl(BaseName, n) \ + inline bool BaseName##n##Inst::Exec(REGEX_INST_EXEC_PARAMETERS) const \ + { \ + if (inputOffset >= inputLength) \ + { \ + return matcher.Fail(FAIL_PARAMETERS); \ + } \ + \ + const uint8 localNumCases = numCases; \ + for (int i = 0; i < localNumCases; i++) \ + { \ + COMP_STATS; \ + if (cases[i].c == input[inputOffset]) \ + { \ + CONSUME; \ + instPointer = matcher.LabelToInstPointer(cases[i].targetLabel); \ + return false; \ + } \ + else if (cases[i].c > input[inputOffset]) \ + { \ + break; \ + } \ + } \ + \ + instPointer += sizeof(*this); \ + return false; \ + } \ + SwitchAndConsumeInstPrintImpl(BaseName, n); + +#define CONSUME + SwitchAndConsumeInstImpl(Switch, 2); + SwitchAndConsumeInstImpl(Switch, 4); + SwitchAndConsumeInstImpl(Switch, 8); + SwitchAndConsumeInstImpl(Switch, 16); + SwitchAndConsumeInstImpl(Switch, 24); +#undef CONSUME + +#define CONSUME inputOffset++ + SwitchAndConsumeInstImpl(SwitchAndConsume, 2); + SwitchAndConsumeInstImpl(SwitchAndConsume, 4); + SwitchAndConsumeInstImpl(SwitchAndConsume, 8); + SwitchAndConsumeInstImpl(SwitchAndConsume, 16); + SwitchAndConsumeInstImpl(SwitchAndConsume, 24); +#undef CONSUME + +#undef COMP_STATS +#undef SwitchAndConsumeInstPrintImpl +#undef SwitchAndConsumeInstImpl // ---------------------------------------------------------------------- - // Switch20Inst (optimized instruction) + // BOITestInst // ---------------------------------------------------------------------- - inline bool Switch20Inst::Exec(REGEX_INST_EXEC_PARAMETERS) const + template <> + BOITestInst::BOITestInst() : Inst(InstTag::BOIHardFailTest) {} + template <> + BOITestInst::BOITestInst() : Inst(InstTag::BOITest) {} + + template + inline bool BOITestInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { - if (inputOffset >= inputLength) - return matcher.Fail(FAIL_PARAMETERS); -#if 0 - int l = 0; - int h = numCases - 1; - while (l <= h) + if (inputOffset > 0) { - int m = (l + h) / 2; -#if ENABLE_REGEX_CONFIG_OPTIONS - matcher.CompStats(); -#endif - if (cases[m].c == input[inputOffset]) + if (canHardFail) { - instPointer = matcher.LabelToInstPointer(cases[m].targetLabel); - return false; + // Clearly trying to start from later in the input won't help, and we know backtracking can't take us earlier in the input + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); } - else if (cases[m].c < input[inputOffset]) - l = m + 1; else - h = m - 1; - } -#else - const int localNumCases = numCases; - for (int i = 0; i < localNumCases; i++) - { -#if ENABLE_REGEX_CONFIG_OPTIONS - matcher.CompStats(); -#endif - if (cases[i].c == input[inputOffset]) { - instPointer = matcher.LabelToInstPointer(cases[i].targetLabel); - return false; + return matcher.Fail(FAIL_PARAMETERS); } - else if (cases[i].c > input[inputOffset]) - break; } -#endif - instPointer += sizeof(*this); return false; } #if ENABLE_REGEX_CONFIG_OPTIONS - int Switch20Inst::Print(DebugWriter* w, Label label, const Char* litbuf) const + template + int BOITestInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: Switch20("), label); - SwitchMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); - } -#endif - - // ---------------------------------------------------------------------- - // SwitchAndConsume10Inst (optimized instruction) - // ---------------------------------------------------------------------- - - inline bool SwitchAndConsume10Inst::Exec(REGEX_INST_EXEC_PARAMETERS) const - { - if (inputOffset >= inputLength) - return matcher.Fail(FAIL_PARAMETERS); -#if 0 - int l = 0; - int h = numCases - 1; - while (l <= h) + if (canHardFail) { - int m = (l + h) / 2; -#if ENABLE_REGEX_CONFIG_OPTIONS - matcher.CompStats(); -#endif - if (cases[m].c == input[inputOffset]) - { - inputOffset++; - instPointer = matcher.LabelToInstPointer(cases[m].targetLabel); - return false; - } - else if (cases[m].c < input[inputOffset]) - l = m + 1; - else - h = m - 1; + PRINT_RE_BYTECODE_BEGIN("BOIHardFailTest"); } -#else - const int localNumCases = numCases; - for (int i = 0; i < localNumCases; i++) + else { -#if ENABLE_REGEX_CONFIG_OPTIONS - matcher.CompStats(); -#endif - if (cases[i].c == input[inputOffset]) - { - inputOffset++; - instPointer = matcher.LabelToInstPointer(cases[i].targetLabel); - return false; - } - else if (cases[i].c > input[inputOffset]) - break; + PRINT_RE_BYTECODE_BEGIN("BOITest"); } -#endif - instPointer += sizeof(*this); - return false; - } + w->Print(_u(": %s"), canHardFail ? _u("true") : _u("false")); -#if ENABLE_REGEX_CONFIG_OPTIONS - int SwitchAndConsume10Inst::Print(DebugWriter* w, Label label, const Char* litbuf) const - { - w->Print(_u("L%04x: SwitchAndConsume10("), label); - SwitchMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_MID(); + PRINT_RE_BYTECODE_END(); } #endif // ---------------------------------------------------------------------- - // SwitchAndConsume20Inst (optimized instruction) + // EOITestInst // ---------------------------------------------------------------------- - inline bool SwitchAndConsume20Inst::Exec(REGEX_INST_EXEC_PARAMETERS) const + template <> + EOITestInst::EOITestInst() : Inst(InstTag::EOIHardFailTest) {} + template <> + EOITestInst::EOITestInst() : Inst(InstTag::EOITest) {} + + template + inline bool EOITestInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { - if (inputOffset >= inputLength) - return matcher.Fail(FAIL_PARAMETERS); -#if 0 - int l = 0; - int h = numCases - 1; - while (l <= h) + if (inputOffset < inputLength) { - int m = (l + h) / 2; -#if ENABLE_REGEX_CONFIG_OPTIONS - matcher.CompStats(); -#endif - if (cases[m].c == input[inputOffset]) + if (canHardFail) { - inputOffset++; - instPointer = matcher.LabelToInstPointer(cases[m].targetLabel); - return false; + // We know backtracking can never take us later in the input, but starting from later in the input could help + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::LaterOnly)); } - else if (cases[m].c < input[inputOffset]) - l = m + 1; else - h = m - 1; - } -#else - const int localNumCases = numCases; - for (int i = 0; i < localNumCases; i++) - { -#if ENABLE_REGEX_CONFIG_OPTIONS - matcher.CompStats(); -#endif - if (cases[i].c == input[inputOffset]) { - inputOffset++; - instPointer = matcher.LabelToInstPointer(cases[i].targetLabel); - return false; + return matcher.Fail(FAIL_PARAMETERS); } - else if (cases[i].c > input[inputOffset]) - break; } -#endif - instPointer += sizeof(*this); return false; } #if ENABLE_REGEX_CONFIG_OPTIONS - int SwitchAndConsume20Inst::Print(DebugWriter* w, Label label, const Char* litbuf) const + template + int EOITestInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SwitchAndConsume20("), label); - SwitchMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); - } -#endif - - // ---------------------------------------------------------------------- - // BOITestInst - // ---------------------------------------------------------------------- - - inline bool BOITestInst::Exec(REGEX_INST_EXEC_PARAMETERS) const - { - if (inputOffset > 0) + if (canHardFail) { - if (canHardFail) - // Clearly trying to start from later in the input won't help, and we know backtracking can't take us earlier in the input - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); - else - return matcher.Fail(FAIL_PARAMETERS); + PRINT_RE_BYTECODE_BEGIN("EOIHardFailTest"); } - instPointer += sizeof(*this); - return false; - } - -#if ENABLE_REGEX_CONFIG_OPTIONS - int BOITestInst::Print(DebugWriter* w, Label label, const Char* litbuf) const - { - w->Print(_u("L%04x: BOITest("), label); - HardFailMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); - } -#endif - - // ---------------------------------------------------------------------- - // EOITestInst - // ---------------------------------------------------------------------- - - inline bool EOITestInst::Exec(REGEX_INST_EXEC_PARAMETERS) const - { - if (inputOffset < inputLength) + else { - if (canHardFail) - // We know backtracking can never take us later in the input, but starting from later in the input could help - return matcher.HardFail(HARDFAIL_PARAMETERS(LaterOnly)); - else - return matcher.Fail(FAIL_PARAMETERS); + PRINT_RE_BYTECODE_BEGIN("EOITest"); } - instPointer += sizeof(*this); - return false; - } -#if ENABLE_REGEX_CONFIG_OPTIONS - int EOITestInst::Print(DebugWriter* w, Label label, const Char* litbuf) const - { - w->Print(_u("L%04x: EOITest("), label); - HardFailMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + w->Print(_u(": %s"), canHardFail ? _u("true") : _u("false")); + + PRINT_RE_BYTECODE_MID(); + PRINT_RE_BYTECODE_END(); } #endif @@ -1255,7 +1353,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset > 0 && !matcher.standardChars->IsNewline(input[inputOffset - 1])) + { return matcher.Fail(FAIL_PARAMETERS); + } instPointer += sizeof(*this); return false; @@ -1264,8 +1364,9 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BOLTestInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->PrintEOL(_u("L%04x: BOLTest()"), label); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BOLTest"); + PRINT_RE_BYTECODE_MID(); + PRINT_RE_BYTECODE_END(); } #endif @@ -1279,7 +1380,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset < inputLength && !matcher.standardChars->IsNewline(input[inputOffset])) + { return matcher.Fail(FAIL_PARAMETERS); + } instPointer += sizeof(*this); return false; @@ -1288,8 +1391,9 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int EOLTestInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->PrintEOL(_u("L%04x: EOLTest()"), label); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("EOLTest"); + PRINT_RE_BYTECODE_MID(); + PRINT_RE_BYTECODE_END(); } #endif @@ -1297,7 +1401,13 @@ namespace UnifiedRegex // WordBoundaryTestInst // ---------------------------------------------------------------------- - inline bool WordBoundaryTestInst::Exec(REGEX_INST_EXEC_PARAMETERS) const + template <> + WordBoundaryTestInst::WordBoundaryTestInst() : Inst(InstTag::NegatedWordBoundaryTest) {} + template <> + WordBoundaryTestInst::WordBoundaryTestInst() : Inst(InstTag::WordBoundaryTest) {} + + template + inline bool WordBoundaryTestInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { #if ENABLE_REGEX_CONFIG_OPTIONS matcher.CompStats(); @@ -1305,17 +1415,29 @@ namespace UnifiedRegex const bool prev = inputOffset > 0 && matcher.standardChars->IsWord(input[inputOffset - 1]); const bool curr = inputOffset < inputLength && matcher.standardChars->IsWord(input[inputOffset]); if (isNegation == (prev != curr)) + { return matcher.Fail(FAIL_PARAMETERS); + } instPointer += sizeof(*this); return false; } #if ENABLE_REGEX_CONFIG_OPTIONS - int WordBoundaryTestInst::Print(DebugWriter* w, Label label, const Char* litbuf) const + template + int WordBoundaryTestInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->PrintEOL(_u("L%04x: WordBoundaryTest(isNegation: %s)"), label, isNegation ? _u("true") : _u("false")); - return sizeof(*this); + if (isNegation) + { + PRINT_RE_BYTECODE_BEGIN("NegatedWordBoundaryTest"); + } + else + { + PRINT_RE_BYTECODE_BEGIN("WordBoundaryTest"); + } + + PRINT_RE_BYTECODE_MID(); + PRINT_RE_BYTECODE_END(); } #endif @@ -1329,7 +1451,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset >= inputLength || input[inputOffset] != c) + { return matcher.Fail(FAIL_PARAMETERS); + } inputOffset++; instPointer += sizeof(*this); @@ -1339,10 +1463,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int MatchCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchChar("), label); - CharMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchChar"); + PRINT_MIXIN(CharMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1356,7 +1481,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset >= inputLength || (input[inputOffset] != cs[0] && input[inputOffset] != cs[1])) + { return matcher.Fail(FAIL_PARAMETERS); + } inputOffset++; instPointer += sizeof(*this); @@ -1366,10 +1493,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int MatchChar2Inst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchChar2("), label); - Char2Mixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchChar2"); + PRINT_MIXIN(Char2Mixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(Char2Mixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1383,7 +1511,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset >= inputLength || (input[inputOffset] != cs[0] && input[inputOffset] != cs[1] && input[inputOffset] != cs[2])) + { return matcher.Fail(FAIL_PARAMETERS); + } inputOffset++; instPointer += sizeof(*this); @@ -1393,10 +1523,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int MatchChar3Inst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchChar3("), label); - Char3Mixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchChar3"); + PRINT_MIXIN(Char3Mixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(Char3Mixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1410,7 +1541,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset >= inputLength || (input[inputOffset] != cs[0] && input[inputOffset] != cs[1] && input[inputOffset] != cs[2] && input[inputOffset] != cs[3])) + { return matcher.Fail(FAIL_PARAMETERS); + } inputOffset++; instPointer += sizeof(*this); @@ -1420,10 +1553,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int MatchChar4Inst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchChar4("), label); - Char4Mixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchChar4"); + PRINT_MIXIN(Char4Mixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(Char4Mixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1438,7 +1572,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset >= inputLength || this->set.Get(input[inputOffset]) == IsNegation) + { return matcher.Fail(FAIL_PARAMETERS); + } inputOffset++; instPointer += sizeof(*this); @@ -1449,10 +1585,20 @@ namespace UnifiedRegex template int MatchSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchSet("), label); - SetMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + if (IsNegation) + { + PRINT_RE_BYTECODE_BEGIN("MatchNegatedSet"); + PRINT_MIXIN(SetMixin); + } + else + { + PRINT_RE_BYTECODE_BEGIN("MatchSet"); + PRINT_MIXIN(SetMixin); + } + + PRINT_RE_BYTECODE_MID(); + IsNegation ? PRINT_BYTES(SetMixin) : PRINT_BYTES(SetMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1465,7 +1611,9 @@ namespace UnifiedRegex Assert(length <= matcher.program->rep.insts.litbufLen - offset); if (length > inputLength - inputOffset) + { return matcher.Fail(FAIL_PARAMETERS); + } const Char *const literalBuffer = matcher.program->rep.insts.litbuf; const Char * literalCurr = literalBuffer + offset; @@ -1505,10 +1653,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int MatchLiteralInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchLiteral("), label); - LiteralMixin::Print(w, litbuf, false); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchLiteral"); + PRINT_MIXIN_ARGS(LiteralMixin, false); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(LiteralMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1519,7 +1668,9 @@ namespace UnifiedRegex inline bool MatchLiteralEquivInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { if (length > inputLength - inputOffset) + { return matcher.Fail(FAIL_PARAMETERS); + } const Char *const literalBuffer = matcher.program->rep.insts.litbuf; CharCount literalOffset = offset; @@ -1552,10 +1703,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int MatchLiteralEquivInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchLiteralEquiv("), label); - LiteralMixin::Print(w, litbuf, true); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchLiteralEquiv"); + PRINT_MIXIN_ARGS(LiteralMixin, true); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(LiteralMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1565,15 +1717,17 @@ namespace UnifiedRegex inline bool MatchTrieInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { - if (!trie.Match - ( input + if (!trie.Match( + input , inputLength , inputOffset #if ENABLE_REGEX_CONFIG_OPTIONS , matcher.stats #endif - )) + )) + { return matcher.Fail(FAIL_PARAMETERS); + } instPointer += sizeof(*this); return false; @@ -1587,10 +1741,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int MatchTrieInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->PrintEOL(_u("L%04x: MatchTrie("), label); - trie.Print(w); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchTrie"); + PRINT_MIXIN(TrieMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(TrieMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1604,7 +1759,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset < inputLength && input[inputOffset] == c) + { inputOffset++; + } instPointer += sizeof(*this); return false; @@ -1613,10 +1770,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int OptMatchCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: OptMatchChar("), label); - CharMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("OptMatchChar"); + PRINT_MIXIN(CharMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1630,7 +1788,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (inputOffset < inputLength && set.Get(input[inputOffset])) + { inputOffset++; + } instPointer += sizeof(*this); return false; @@ -1639,10 +1799,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int OptMatchSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: OptMatchSet("), label); - SetMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("OptMatchSet"); + PRINT_MIXIN(SetMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1672,10 +1833,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int SyncToCharAndContinueInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SyncToCharAndContinue("), label); - CharMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("SyncToCharAndContinue"); + PRINT_MIXIN(CharMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1706,14 +1868,14 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int SyncToChar2SetAndContinueInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SyncToChar2SetAndContinue("), label); - Char2Mixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("SyncToChar2SetAndContinue"); + PRINT_MIXIN(Char2Mixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(Char2Mixin); + PRINT_RE_BYTECODE_END(); } #endif - // ---------------------------------------------------------------------- // SyncToSetAndContinueInst (optimized instruction) // ---------------------------------------------------------------------- @@ -1743,10 +1905,20 @@ namespace UnifiedRegex template int SyncToSetAndContinueInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SyncToSetAndContinue("), label); - SetMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + if (IsNegation) + { + PRINT_RE_BYTECODE_BEGIN("SyncToSetAndContinue"); + PRINT_MIXIN(SetMixin); + } + else + { + PRINT_RE_BYTECODE_BEGIN("SyncToNegatedSetAndContinue"); + PRINT_MIXIN(SetMixin); + } + + PRINT_RE_BYTECODE_MID(); + IsNegation ? PRINT_BYTES(SetMixin) : PRINT_BYTES(SetMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1758,7 +1930,9 @@ namespace UnifiedRegex inline bool SyncToLiteralAndContinueInstT::Exec(REGEX_INST_EXEC_PARAMETERS) const { if (!this->Match(matcher, input, inputLength, inputOffset)) - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + { + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } matchStart = inputOffset; instPointer += sizeof(*this); @@ -1766,21 +1940,70 @@ namespace UnifiedRegex } #if ENABLE_REGEX_CONFIG_OPTIONS - template - int SyncToLiteralAndContinueInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const - { - w->Print(_u("L%04x: SyncToLiteralAndContinue("), label); - ScannerT::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); - } - // explicit instantiation template struct SyncToLiteralAndContinueInstT; template struct SyncToLiteralAndContinueInstT; template struct SyncToLiteralAndContinueInstT; template struct SyncToLiteralAndContinueInstT; template struct SyncToLiteralAndContinueInstT; + + // Explicitly define each of these 5 Print functions so that the output will show the actual template param mixin and + // actual opcode name, even though the logic is basically the same in each definition. See notes below. + + template <> + int SyncToLiteralAndContinueInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndContinueInstT aka SyncToChar2LiteralAndContinue"); + PRINT_MIXIN(Char2LiteralScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(Char2LiteralScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndContinueInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndContinueInstT aka SyncToLiteralAndContinue"); + PRINT_MIXIN(ScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(ScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndContinueInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndContinueInstT aka SyncToLinearLiteralAndContinue"); + PRINT_MIXIN(ScannerMixin_WithLinearCharMap); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(ScannerMixin_WithLinearCharMap); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndContinueInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndContinueInstT aka SyncToLiteralEquivAndContinue"); + PRINT_MIXIN(EquivScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(EquivScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndContinueInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndContinueInstT aka SyncToLiteralEquivTrivialLastPatCharAndContinue"); + PRINT_MIXIN(EquivTrivialLastPatCharScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(EquivTrivialLastPatCharScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } #endif // ---------------------------------------------------------------------- @@ -1802,7 +2025,9 @@ namespace UnifiedRegex } if (inputOffset >= inputLength) - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + { + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } matchStart = inputOffset++; instPointer += sizeof(*this); @@ -1812,10 +2037,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int SyncToCharAndConsumeInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SyncToCharAndConsume("), label); - CharMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("SyncToCharAndConsume"); + PRINT_MIXIN(CharMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1839,7 +2065,9 @@ namespace UnifiedRegex } if (inputOffset >= inputLength) - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + { + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } matchStart = inputOffset++; instPointer += sizeof(*this); @@ -1849,10 +2077,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int SyncToChar2SetAndConsumeInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SyncToChar2SetAndConsume("), label); - Char2Mixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("SyncToChar2SetAndConsume"); + PRINT_MIXIN(Char2Mixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(Char2Mixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1876,7 +2105,9 @@ namespace UnifiedRegex } if (inputOffset >= inputLength) - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + { + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } matchStart = inputOffset++; instPointer += sizeof(*this); @@ -1887,10 +2118,20 @@ namespace UnifiedRegex template int SyncToSetAndConsumeInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SyncToSetAndConsume("), label); - SetMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + if (IsNegation) + { + PRINT_RE_BYTECODE_BEGIN("SyncToSetAndConsume"); + PRINT_MIXIN(SetMixin); + } + else + { + PRINT_RE_BYTECODE_BEGIN("SyncToNegatedSetAndConsume"); + PRINT_MIXIN(SetMixin); + } + + PRINT_RE_BYTECODE_MID(); + IsNegation ? PRINT_BYTES(SetMixin) : PRINT_BYTES(SetMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1902,7 +2143,9 @@ namespace UnifiedRegex inline bool SyncToLiteralAndConsumeInstT::Exec(REGEX_INST_EXEC_PARAMETERS) const { if (!this->Match(matcher, input, inputLength, inputOffset)) - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + { + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } matchStart = inputOffset; inputOffset += ScannerT::GetLiteralLength(); @@ -1911,21 +2154,70 @@ namespace UnifiedRegex } #if ENABLE_REGEX_CONFIG_OPTIONS - template - int SyncToLiteralAndConsumeInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const - { - w->Print(_u("L%04x: SyncToLiteralAndConsume("), label); - ScannerT::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); - } - // explicit instantiation template struct SyncToLiteralAndConsumeInstT; template struct SyncToLiteralAndConsumeInstT; template struct SyncToLiteralAndConsumeInstT; template struct SyncToLiteralAndConsumeInstT; template struct SyncToLiteralAndConsumeInstT; + + // Explicitly define each of these 5 Print functions so that the output will show the actual template param mixin and + // actual opcode name, even though the logic is basically the same in each definition. See notes below. + + template <> + int SyncToLiteralAndConsumeInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndConsumeInstT aka SyncToChar2LiteralAndConsume"); + PRINT_MIXIN(Char2LiteralScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(Char2LiteralScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndConsumeInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndConsumeInstT aka SyncToLiteralAndConsume"); + PRINT_MIXIN(ScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(ScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndConsumeInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndConsumeInstT aka SyncToLinearLiteralAndConsume"); + PRINT_MIXIN(ScannerMixin_WithLinearCharMap); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(ScannerMixin_WithLinearCharMap); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndConsumeInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndConsumeInstT aka SyncToLiteralEquivAndConsume"); + PRINT_MIXIN(EquivScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(EquivScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndConsumeInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndConsumeInstT aka SyncToLiteralEquivTrivialLastPatCharAndConsume"); + PRINT_MIXIN(EquivTrivialLastPatCharScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(EquivTrivialLastPatCharScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_RE_BYTECODE_END(); + } #endif // ---------------------------------------------------------------------- @@ -1935,10 +2227,12 @@ namespace UnifiedRegex inline bool SyncToCharAndBackupInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { if (backup.lower > inputLength - matchStart) + { // Even match at very end doesn't allow for minimum backup - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } - if(inputOffset < nextSyncInputOffset) + if (inputOffset < nextSyncInputOffset) { // We have not yet reached the offset in the input we last synced to before backing up, so it's unnecessary to sync // again since we'll sync to the same point in the input and back up to the same place we are at now @@ -1947,8 +2241,10 @@ namespace UnifiedRegex } if (backup.lower > inputOffset - matchStart) + { // No use looking for match until minimum backup is possible inputOffset = matchStart + backup.lower; + } const Char matchC = c; while (inputOffset < inputLength && input[inputOffset] != matchC) @@ -1960,7 +2256,9 @@ namespace UnifiedRegex } if (inputOffset >= inputLength) - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + { + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } nextSyncInputOffset = inputOffset + 1; @@ -1980,13 +2278,14 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int SyncToCharAndBackupInst::Print(DebugWriter* w, Label label, const Char* litbuf) const - { - w->Print(_u("L%04x: SyncToCharAndBackup("), label); - CharMixin::Print(w, litbuf); - w->Print(_u(", ")); - BackupMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + { + PRINT_RE_BYTECODE_BEGIN("SyncToCharAndBackup"); + PRINT_MIXIN_COMMA(CharMixin); + PRINT_MIXIN(BackupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_BYTES(BackupMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -1998,10 +2297,12 @@ namespace UnifiedRegex inline bool SyncToSetAndBackupInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { if (backup.lower > inputLength - matchStart) + { // Even match at very end doesn't allow for minimum backup - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } - if(inputOffset < nextSyncInputOffset) + if (inputOffset < nextSyncInputOffset) { // We have not yet reached the offset in the input we last synced to before backing up, so it's unnecessary to sync // again since we'll sync to the same point in the input and back up to the same place we are at now @@ -2010,8 +2311,10 @@ namespace UnifiedRegex } if (backup.lower > inputOffset - matchStart) + { // No use looking for match until minimum backup is possible inputOffset = matchStart + backup.lower; + } const RuntimeCharSet& matchSet = this->set; while (inputOffset < inputLength && matchSet.Get(input[inputOffset]) == IsNegation) @@ -2023,7 +2326,9 @@ namespace UnifiedRegex } if (inputOffset >= inputLength) - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + { + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } nextSyncInputOffset = inputOffset + 1; @@ -2045,12 +2350,22 @@ namespace UnifiedRegex template int SyncToSetAndBackupInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SyncToSetAndBackup("), label); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - BackupMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + if (IsNegation) + { + PRINT_RE_BYTECODE_BEGIN("SyncToSetAndBackup"); + PRINT_MIXIN_COMMA(SetMixin); + } + else + { + PRINT_RE_BYTECODE_BEGIN("SyncToNegatedSetAndBackup"); + PRINT_MIXIN_COMMA(SetMixin); + } + + PRINT_MIXIN(BackupMixin); + PRINT_RE_BYTECODE_MID(); + IsNegation ? PRINT_BYTES(SetMixin) : PRINT_BYTES(SetMixin); + PRINT_BYTES(BackupMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2061,8 +2376,10 @@ namespace UnifiedRegex inline bool SyncToLiteralAndBackupInstT::Exec(REGEX_INST_EXEC_PARAMETERS) const { if (backup.lower > inputLength - matchStart) + { // Even match at very end doesn't allow for minimum backup - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } if(inputOffset < nextSyncInputOffset) { @@ -2073,11 +2390,15 @@ namespace UnifiedRegex } if (backup.lower > inputOffset - matchStart) + { // No use looking for match until minimum backup is possible inputOffset = matchStart + backup.lower; + } if (!this->Match(matcher, input, inputLength, inputOffset)) - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + { + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } nextSyncInputOffset = inputOffset + 1; @@ -2097,23 +2418,80 @@ namespace UnifiedRegex } #if ENABLE_REGEX_CONFIG_OPTIONS - template - int SyncToLiteralAndBackupInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const - { - w->Print(_u("L%04x: SyncToLiteralAndBackup("), label); - ScannerT::Print(w, litbuf); - w->Print(_u(", ")); - BackupMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); - } - // explicit instantiation template struct SyncToLiteralAndBackupInstT; template struct SyncToLiteralAndBackupInstT; template struct SyncToLiteralAndBackupInstT; template struct SyncToLiteralAndBackupInstT; template struct SyncToLiteralAndBackupInstT; + + // Explicitly define each of these 5 Print functions so that the output will show the actual template param mixin and + // actual opcode name, even though the logic is basically the same in each definition. See notes below. + + template <> + int SyncToLiteralAndBackupInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndBackupInstT aka SyncToChar2LiteralAndBackup"); + PRINT_MIXIN_COMMA(Char2LiteralScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_MIXIN(BackupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(Char2LiteralScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_BYTES(BackupMixin); + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndBackupInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndBackupInstT aka SyncToLiteralAndBackup"); + PRINT_MIXIN_COMMA(ScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_MIXIN(BackupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(ScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_BYTES(BackupMixin); + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndBackupInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndBackupInstT aka SyncToLinearLiteralAndBackup"); + PRINT_MIXIN_COMMA(ScannerMixin_WithLinearCharMap); // NOTE: would work with template ScannerT::Print + PRINT_MIXIN(BackupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(ScannerMixin_WithLinearCharMap); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_BYTES(BackupMixin); + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndBackupInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndBackupInstT aka SyncToLiteralEquivAndBackup"); + PRINT_MIXIN_COMMA(EquivScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_MIXIN(BackupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(EquivScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_BYTES(BackupMixin); + PRINT_RE_BYTECODE_END(); + } + + template <> + int SyncToLiteralAndBackupInstT::Print(DebugWriter* w, Label label, const Char* litbuf) const + { + // NOTE: this text is unique to this instantiation + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralAndBackupInstT aka SyncToLiteralEquivTrivialLastPatCharAndBackup"); + PRINT_MIXIN_COMMA(EquivTrivialLastPatCharScannerMixin); // NOTE: would work with template ScannerT::Print + PRINT_MIXIN(BackupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(EquivTrivialLastPatCharScannerMixin); // NOTE: unique because macro expansion and _u(#InstType) happen before template is evaluated (so text would be ScannerT) + PRINT_BYTES(BackupMixin); + PRINT_RE_BYTECODE_END(); + } #endif // ---------------------------------------------------------------------- @@ -2123,10 +2501,12 @@ namespace UnifiedRegex inline bool SyncToLiteralsAndBackupInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { if (backup.lower > inputLength - matchStart) + { // Even match at very end doesn't allow for minimum backup - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } - if(inputOffset < nextSyncInputOffset) + if (inputOffset < nextSyncInputOffset) { // We have not yet reached the offset in the input we last synced to before backing up, so it's unnecessary to sync // again since we'll sync to the same point in the input and back up to the same place we are at now @@ -2135,8 +2515,10 @@ namespace UnifiedRegex } if (backup.lower > inputOffset - matchStart) + { // No use looking for match until minimum backup is possible inputOffset = matchStart + backup.lower; + } int besti = -1; CharCount bestMatchOffset = 0; @@ -2165,9 +2547,9 @@ namespace UnifiedRegex thisMatchOffset = inputOffset; } - if (infos[i]->isEquivClass ? - (infos[i]->scanner.Match - ( input + if (infos[i]->isEquivClass + ? (infos[i]->scanner.Match( + input , inputLength , thisMatchOffset , matcher.program->rep.insts.litbuf + infos[i]->offset @@ -2175,9 +2557,9 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS , matcher.stats #endif - )) : - (infos[i]->scanner.Match<1> - ( input + )) + : (infos[i]->scanner.Match<1>( + input , inputLength , thisMatchOffset , matcher.program->rep.insts.litbuf + infos[i]->offset @@ -2202,8 +2584,10 @@ namespace UnifiedRegex } if (besti < 0) + { // No literals matched - return matcher.HardFail(HARDFAIL_PARAMETERS(ImmediateFail)); + return matcher.HardFail(HARDFAIL_PARAMETERS(HardFailMode::ImmediateFail)); + } nextSyncInputOffset = bestMatchOffset + 1; @@ -2224,12 +2608,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int SyncToLiteralsAndBackupInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: SyncToLiteralsAndBackup("), label); - ScannersMixin::Print(w, litbuf); - w->Print(_u(", ")); - BackupMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("SyncToLiteralsAndBackup"); + PRINT_MIXIN_COMMA(ScannersMixin); + PRINT_MIXIN(BackupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(ScannersMixin); + PRINT_BYTES(BackupMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2243,7 +2628,9 @@ namespace UnifiedRegex if (!info->IsUndefined() && info->length > 0) { if (info->length > inputLength - inputOffset) + { return matcher.Fail(FAIL_PARAMETERS); + } CharCount groupOffset = info->offset; const CharCount groupEndOffset = groupOffset + info->length; @@ -2338,6 +2725,7 @@ namespace UnifiedRegex auto toCanonical = [&](CharCount &offset) { return matcher.standardChars->ToCanonical(CaseInsensitive::MappingSource::UnicodeData, input[offset++]); }; + if (toCanonical(groupOffset) != toCanonical(inputOffset)) { return matcher.Fail(FAIL_PARAMETERS); @@ -2353,7 +2741,9 @@ namespace UnifiedRegex matcher.CompStats(); #endif if (input[groupOffset++] != input[inputOffset++]) + { return matcher.Fail(FAIL_PARAMETERS); + } } while (groupOffset < groupEndOffset); } @@ -2367,10 +2757,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int MatchGroupInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: MatchGroup("), label); - GroupMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("MatchGroup"); + PRINT_MIXIN(GroupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(GroupMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2392,10 +2783,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BeginDefineGroupInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: BeginDefineGroup("), label); - GroupMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BeginDefineGroup"); + PRINT_MIXIN(GroupMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(GroupMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2426,12 +2818,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int EndDefineGroupInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: EndDefineGroup("), label); - GroupMixin::Print(w, litbuf); - w->Print(_u(", ")); - NoNeedToSaveMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("EndDefineGroup"); + PRINT_MIXIN_COMMA(GroupMixin); + PRINT_MIXIN(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(GroupMixin); + PRINT_BYTES(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2462,14 +2855,15 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int DefineGroupFixedInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: DefineGroupFixed("), label); - GroupMixin::Print(w, litbuf); - w->Print(_u(", ")); - FixedLengthMixin::Print(w, litbuf); - w->Print(_u(", ")); - NoNeedToSaveMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("DefineGroupFixed"); + PRINT_MIXIN_COMMA(GroupMixin); + PRINT_MIXIN_COMMA(FixedLengthMixin); + PRINT_MIXIN(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(GroupMixin); + PRINT_BYTES(FixedLengthMixin); + PRINT_BYTES(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2544,12 +2938,15 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BeginLoopInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: BeginLoop("), label); - BeginLoopMixin::Print(w, litbuf); - w->Print(_u(", ")); - BodyGroupsMixin::Print(w, litbuf); - w->PrintEOL(_u(", greedy: %s)"), isGreedy ? _u("true") : _u("false")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BeginLoop"); + PRINT_MIXIN_COMMA(BeginLoopMixin); + PRINT_MIXIN_COMMA(BodyGroupsMixin); + PRINT_MIXIN(GreedyMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(BeginLoopMixin); + PRINT_BYTES(BodyGroupsMixin); + PRINT_BYTES(GreedyMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2634,10 +3031,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int RepeatLoopInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: RepeatLoop("), label); - RepeatLoopMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("RepeatLoop"); + PRINT_MIXIN(RepeatLoopMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(RepeatLoopMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2668,7 +3066,9 @@ namespace UnifiedRegex } if (repeats.lower > 0) + { return matcher.Fail(FAIL_PARAMETERS); + } instPointer = matcher.LabelToInstPointer(exitLabel); return false; @@ -2677,14 +3077,15 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BeginLoopIfCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: BeginLoopIfChar("), label); - CharMixin::Print(w, litbuf); - w->Print(_u(", ")); - BeginLoopMixin::Print(w, litbuf); - w->Print(_u(", ")); - BodyGroupsMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BeginLoopIfChar"); + PRINT_MIXIN_COMMA(CharMixin); + PRINT_MIXIN_COMMA(BeginLoopMixin); + PRINT_MIXIN(BodyGroupsMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_BYTES(BeginLoopMixin); + PRINT_BYTES(BodyGroupsMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2717,7 +3118,9 @@ namespace UnifiedRegex } if (repeats.lower > 0) + { return matcher.Fail(FAIL_PARAMETERS); + } instPointer = matcher.LabelToInstPointer(exitLabel); return false; @@ -2726,14 +3129,15 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BeginLoopIfSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: BeginLoopIfSet("), label); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - BeginLoopMixin::Print(w, litbuf); - w->Print(_u(", ")); - BodyGroupsMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BeginLoopIfSet"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN_COMMA(BeginLoopMixin); + PRINT_MIXIN(BodyGroupsMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(BeginLoopMixin); + PRINT_BYTES(BodyGroupsMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2787,7 +3191,9 @@ namespace UnifiedRegex } if (loopInfo->number < begin->repeats.lower) + { return matcher.Fail(FAIL_PARAMETERS); + } // Proceed to exit instPointer = matcher.LabelToInstPointer(begin->exitLabel); @@ -2797,10 +3203,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int RepeatLoopIfCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: RepeatLoopIfChar(%d, "), label); - RepeatLoopMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("RepeatLoopIfChar"); + PRINT_MIXIN(RepeatLoopMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(RepeatLoopMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2837,7 +3244,7 @@ namespace UnifiedRegex } // Commit to one more iteration - if(begin->hasInnerNondet) + if (begin->hasInnerNondet) { // If it backtracks into the loop body of an earlier iteration, it must restore inner groups for that iteration. // Save the inner groups and reset them for the next iteration. @@ -2854,7 +3261,9 @@ namespace UnifiedRegex } if (loopInfo->number < begin->repeats.lower) + { return matcher.Fail(FAIL_PARAMETERS); + } // Proceed to exit instPointer = matcher.LabelToInstPointer(begin->exitLabel); @@ -2864,10 +3273,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int RepeatLoopIfSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: RepeatLoopIfSet("), label); - RepeatLoopMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("RepeatLoopIfSet"); + PRINT_MIXIN(RepeatLoopMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(RepeatLoopMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2912,12 +3322,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BeginLoopFixedInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: BeginLoopFixed("), label); - BeginLoopMixin::Print(w, litbuf); - w->Print(_u(", ")); - FixedLengthMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BeginLoopFixed"); + PRINT_MIXIN_COMMA(BeginLoopMixin); + PRINT_MIXIN(FixedLengthMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(BeginLoopMixin); + PRINT_BYTES(FixedLengthMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -2946,7 +3357,7 @@ namespace UnifiedRegex // Since loop body is non-deterministic and does not define groups the rewind continuation must be on top of the stack. Cont *top = contStack.Top(); Assert(top != 0); - Assert(top->tag == Cont::RewindLoopFixed); + Assert(top->tag == Cont::ContTag::RewindLoopFixed); RewindLoopFixedCont* rewind = (RewindLoopFixedCont*)top; rewind->tryingBody = false; } @@ -2973,10 +3384,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int RepeatLoopFixedInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: RepeatLoopFixed("), label); - RepeatLoopMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("RepeatLoopFixed"); + PRINT_MIXIN(RepeatLoopMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(RepeatLoopMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3023,8 +3435,10 @@ namespace UnifiedRegex loopInfo->number = inputOffset - loopMatchStart; if (loopInfo->number < repeats.lower) + { return matcher.Fail(FAIL_PARAMETERS); - if (loopInfo->number > repeats.lower) + } + else if (loopInfo->number > repeats.lower) { // CHOICEPOINT: If follow fails, try consuming one fewer characters Assert(instPointer == (uint8*)this); @@ -3043,12 +3457,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int LoopSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: LoopSet(loopId: %d, "), label, loopId); - repeats.Print(w); - w->Print(_u(", hasOuterLoops: %s, "), hasOuterLoops ? _u("true") : _u("false")); - SetMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("LoopSetInst"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN(BeginLoopBasicsMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(BeginLoopBasicsMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3100,8 +3515,10 @@ namespace UnifiedRegex loopInfo->number = inputOffset - loopMatchStart; if (loopInfo->number < repeats.lower) + { return matcher.Fail(FAIL_PARAMETERS); - if (loopInfo->number > repeats.lower) + } + else if (loopInfo->number > repeats.lower) { // CHOICEPOINT: If follow fails, try consuming one fewer characters Assert(instPointer == (uint8*)this); @@ -3120,12 +3537,15 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int LoopSetWithFollowFirstInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: LoopSet(loopId: %d, followFirst: %c, "), label, loopId, followFirst); - repeats.Print(w); - w->Print(_u(", hasOuterLoops: %s, "), hasOuterLoops ? _u("true") : _u("false")); - SetMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("LoopSetWithFollowFirstInst"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN_COMMA(BeginLoopBasicsMixin); + PRINT_MIXIN(FollowFirstMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(BeginLoopBasicsMixin); + PRINT_MIXIN(FollowFirstMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3181,16 +3601,17 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BeginLoopFixedGroupLastIterationInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: BeginLoopFixedGroupLastIteration("), label); - BeginLoopMixin::Print(w, litbuf); - w->Print(_u(", ")); - FixedLengthMixin::Print(w, litbuf); - w->Print(_u(", ")); - GroupMixin::Print(w, litbuf); - w->Print(_u(", ")); - NoNeedToSaveMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BeginLoopFixedGroupLastIteration"); + PRINT_MIXIN_COMMA(BeginLoopMixin); + PRINT_MIXIN_COMMA(FixedLengthMixin); + PRINT_MIXIN_COMMA(GroupMixin); + PRINT_MIXIN(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(BeginLoopMixin); + PRINT_BYTES(FixedLengthMixin); + PRINT_BYTES(GroupMixin); + PRINT_BYTES(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3219,7 +3640,7 @@ namespace UnifiedRegex // Since loop body is non-deterministic and does not define groups the rewind continuation must be on top of the stack. Cont *top = contStack.Top(); Assert(top != 0); - Assert(top->tag == Cont::RewindLoopFixedGroupLastIteration); + Assert(top->tag == Cont::ContTag::RewindLoopFixedGroupLastIteration); RewindLoopFixedGroupLastIterationCont* rewind = (RewindLoopFixedGroupLastIterationCont*)top; rewind->tryingBody = false; } @@ -3252,14 +3673,14 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int RepeatLoopFixedGroupLastIterationInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: RepeatLoopFixedGroupLastIteration("), label); - RepeatLoopMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("RepeatLoopFixedGroupLastIteration"); + PRINT_MIXIN(RepeatLoopMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(RepeatLoopMixin); + PRINT_RE_BYTECODE_END(); } #endif - // ---------------------------------------------------------------------- // BeginGreedyLoopNoBacktrackInst // ---------------------------------------------------------------------- @@ -3284,8 +3705,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BeginGreedyLoopNoBacktrackInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->PrintEOL(_u("L%04x: BeginGreedyLoopNoBacktrack(loopId: %d)"), label, loopId); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BeginGreedyLoopNoBacktrack"); + PRINT_MIXIN(GreedyLoopNoBacktrackMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(GreedyLoopNoBacktrackMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3312,7 +3736,7 @@ namespace UnifiedRegex // Therefore we can simply update the Resume continuation still on the top of the stack with the current // input pointer. Cont* top = contStack.Top(); - Assert(top != 0 && top->tag == Cont::Resume); + Assert(top != 0 && top->tag == Cont::ContTag::Resume); ResumeCont* resume = (ResumeCont*)top; resume->origInputOffset = inputOffset; @@ -3325,10 +3749,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int RepeatGreedyLoopNoBacktrackInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: RepeatGreedyLoopNoBacktrack("), label); - RepeatLoopMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("RepeatGreedyLoopNoBacktrack"); + PRINT_MIXIN(RepeatLoopMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(RepeatLoopMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3343,19 +3768,23 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS matcher.CompStats(); #endif - if(Mode == ChompMode::Star || (inputOffset < inputLength && input[inputOffset] == matchC)) + if (Mode == ChompMode::Star || (inputOffset < inputLength && input[inputOffset] == matchC)) { - while(true) + while (true) { - if(Mode != ChompMode::Star) + if (Mode != ChompMode::Star) + { ++inputOffset; + } #if ENABLE_REGEX_CONFIG_OPTIONS matcher.CompStats(); #endif - if(inputOffset < inputLength && input[inputOffset] == matchC) + if (inputOffset < inputLength && input[inputOffset] == matchC) { - if(Mode == ChompMode::Star) + if (Mode == ChompMode::Star) + { ++inputOffset; + } continue; } break; @@ -3372,10 +3801,19 @@ namespace UnifiedRegex template int ChompCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: ChompChar<%S>("), label, Mode == ChompMode::Star ? "Star" : "Plus"); - CharMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + if (Mode == ChompMode::Star) + { + PRINT_RE_BYTECODE_BEGIN("ChompChar"); + } + else + { + PRINT_RE_BYTECODE_BEGIN("ChompChar"); + } + + PRINT_MIXIN(CharMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3394,15 +3832,19 @@ namespace UnifiedRegex { while(true) { - if(Mode != ChompMode::Star) + if (Mode != ChompMode::Star) + { ++inputOffset; + } #if ENABLE_REGEX_CONFIG_OPTIONS matcher.CompStats(); #endif - if(inputOffset < inputLength && matchSet.Get(input[inputOffset])) + if (inputOffset < inputLength && matchSet.Get(input[inputOffset])) { - if(Mode == ChompMode::Star) + if (Mode == ChompMode::Star) + { ++inputOffset; + } continue; } break; @@ -3419,10 +3861,19 @@ namespace UnifiedRegex template int ChompSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: ChompSet<%S>("), label, Mode == ChompMode::Star ? "Star" : "Plus"); - SetMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + if (Mode == ChompMode::Star) + { + PRINT_RE_BYTECODE_BEGIN("ChompSet"); + } + else + { + PRINT_RE_BYTECODE_BEGIN("ChompSet"); + } + + PRINT_MIXIN(SetMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3442,23 +3893,27 @@ namespace UnifiedRegex #endif if(Mode == ChompMode::Star || (inputOffset < inputLength && input[inputOffset] == matchC)) { - while(true) + while (true) { - if(Mode != ChompMode::Star) + if (Mode != ChompMode::Star) + { ++inputOffset; + } #if ENABLE_REGEX_CONFIG_OPTIONS matcher.CompStats(); #endif - if(inputOffset < inputLength && input[inputOffset] == matchC) + if (inputOffset < inputLength && input[inputOffset] == matchC) { - if(Mode == ChompMode::Star) + if (Mode == ChompMode::Star) + { ++inputOffset; + } continue; } break; } - if(!noNeedToSave) + if (!noNeedToSave) { // UNDO ACTION: Restore group on backtrack PUSH(contStack, ResetGroupCont, groupId); @@ -3482,14 +3937,23 @@ namespace UnifiedRegex template int ChompCharGroupInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: ChompCharGroup<%S>("), label, Mode == ChompMode::Star ? "Star" : "Plus"); - CharMixin::Print(w, litbuf); - w->Print(_u(", ")); - GroupMixin::Print(w, litbuf); - w->Print(_u(", ")); - NoNeedToSaveMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + if (Mode == ChompMode::Star) + { + PRINT_RE_BYTECODE_BEGIN("ChompCharGroup"); + } + else + { + PRINT_RE_BYTECODE_BEGIN("ChompCharGroup"); + } + + PRINT_MIXIN_COMMA(CharMixin); + PRINT_MIXIN_COMMA(GroupMixin); + PRINT_MIXIN(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_BYTES(GroupMixin); + PRINT_BYTES(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3507,25 +3971,29 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS matcher.CompStats(); #endif - if(Mode == ChompMode::Star || (inputOffset < inputLength && matchSet.Get(input[inputOffset]))) + if (Mode == ChompMode::Star || (inputOffset < inputLength && matchSet.Get(input[inputOffset]))) { - while(true) + while (true) { - if(Mode != ChompMode::Star) + if (Mode != ChompMode::Star) + { ++inputOffset; + } #if ENABLE_REGEX_CONFIG_OPTIONS matcher.CompStats(); #endif - if(inputOffset < inputLength && matchSet.Get(input[inputOffset])) + if (inputOffset < inputLength && matchSet.Get(input[inputOffset])) { - if(Mode == ChompMode::Star) + if (Mode == ChompMode::Star) + { ++inputOffset; + } continue; } break; } - if(!noNeedToSave) + if (!noNeedToSave) { // UNDO ACTION: Restore group on backtrack PUSH(contStack, ResetGroupCont, groupId); @@ -3549,14 +4017,23 @@ namespace UnifiedRegex template int ChompSetGroupInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: ChompSetGroup<%S>("), label, Mode == ChompMode::Star ? "Star" : "Plus"); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - GroupMixin::Print(w, litbuf); - w->Print(_u(", ")); - NoNeedToSaveMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + if (Mode == ChompMode::Star) + { + PRINT_RE_BYTECODE_BEGIN("ChompSetGroup"); + } + else + { + PRINT_RE_BYTECODE_BEGIN("ChompSetGroup"); + } + + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN_COMMA(GroupMixin); + PRINT_MIXIN(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(GroupMixin); + PRINT_BYTES(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3585,7 +4062,9 @@ namespace UnifiedRegex } if (inputOffset - loopMatchStart < repeats.lower) + { return matcher.Fail(FAIL_PARAMETERS); + } instPointer += sizeof(*this); return false; @@ -3594,12 +4073,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int ChompCharBoundedInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: ChompCharBounded("), label); - CharMixin::Print(w, litbuf); - w->Print(_u(", ")); - ChompBoundedMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("ChompCharBounded"); + PRINT_MIXIN_COMMA(CharMixin); + PRINT_MIXIN(ChompBoundedMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_BYTES(ChompBoundedMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3628,7 +4108,9 @@ namespace UnifiedRegex } if (inputOffset - loopMatchStart < repeats.lower) + { return matcher.Fail(FAIL_PARAMETERS); + } instPointer += sizeof(*this); return false; @@ -3637,12 +4119,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int ChompSetBoundedInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: ChompSetBounded("), label); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - ChompBoundedMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("ChompSetBounded"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN(ChompBoundedMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(ChompBoundedMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3673,7 +4156,9 @@ namespace UnifiedRegex } if (inputOffset - loopMatchStart < repeats.lower) + { return matcher.Fail(FAIL_PARAMETERS); + } if (inputOffset > loopMatchStart) { @@ -3697,16 +4182,17 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int ChompSetBoundedGroupLastCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: ChompSetBoundedGroupLastChar("), label); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - ChompBoundedMixin::Print(w, litbuf); - w->Print(_u(", ")); - GroupMixin::Print(w, litbuf); - w->Print(_u(", ")); - NoNeedToSaveMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("ChompSetBoundedGroupLastChar"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN_COMMA(ChompBoundedMixin); + PRINT_MIXIN_COMMA(GroupMixin); + PRINT_MIXIN(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(ChompBoundedMixin); + PRINT_BYTES(GroupMixin); + PRINT_BYTES(NoNeedToSaveMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3729,10 +4215,11 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int TryInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: Try("), label); - TryMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("Try"); + PRINT_MIXIN(TryMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(TryMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3764,12 +4251,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int TryIfCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: TryIfChar("), label); - CharMixin::Print(w, litbuf); - w->Print(_u(", ")); - TryMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("TryIfChar"); + PRINT_MIXIN_COMMA(CharMixin); + PRINT_MIXIN(TryMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_BYTES(TryMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3802,12 +4290,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int TryMatchCharInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: TryMatchChar("), label); - CharMixin::Print(w, litbuf); - w->Print(_u(", ")); - TryMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("TryMatchChar"); + PRINT_MIXIN_COMMA(CharMixin); + PRINT_MIXIN(TryMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(CharMixin); + PRINT_BYTES(TryMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3839,12 +4328,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int TryIfSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: TryIfSet("), label); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - TryMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("TryIfSet"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN(TryMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(TryMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3877,12 +4367,13 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int TryMatchSetInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: TryMatchSet("), label); - SetMixin::Print(w, litbuf); - w->Print(_u(", ")); - TryMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("TryMatchSet"); + PRINT_MIXIN_COMMA(SetMixin); + PRINT_MIXIN(TryMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(SetMixin); + PRINT_BYTES(TryMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3915,11 +4406,15 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int BeginAssertionInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->Print(_u("L%04x: BeginAssertion(isNegation: %s, nextLabel: L%04x, "), - label, isNegation ? _u("true") : _u("false"), GetPrintLabel(nextLabel)); - BodyGroupsMixin::Print(w, litbuf); - w->PrintEOL(_u(")")); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("BeginAssertion"); + PRINT_MIXIN_COMMA(BodyGroupsMixin); + PRINT_MIXIN_COMMA(NegationMixin); + PRINT_MIXIN(NextLabelMixin); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(BodyGroupsMixin); + PRINT_BYTES(NegationMixin); + PRINT_BYTES(NextLabelMixin); + PRINT_RE_BYTECODE_END(); } #endif @@ -3930,8 +4425,10 @@ namespace UnifiedRegex inline bool EndAssertionInst::Exec(REGEX_INST_EXEC_PARAMETERS) const { if (!matcher.PopAssertion(inputOffset, instPointer, contStack, assertionStack, true)) + { // Body of negative assertion succeeded, so backtrack return matcher.Fail(FAIL_PARAMETERS); + } // else: body of positive assertion succeeded, instruction pointer already at next instruction return false; @@ -3940,8 +4437,10 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS int EndAssertionInst::Print(DebugWriter* w, Label label, const Char* litbuf) const { - w->PrintEOL(_u("L%04x: EndAssertion()"), label); - return sizeof(*this); + PRINT_RE_BYTECODE_BEGIN("EndAssertion"); + PRINT_RE_BYTECODE_MID(); + PRINT_BYTES(EndAssertionInst); + PRINT_RE_BYTECODE_END(); } #endif @@ -3968,7 +4467,9 @@ namespace UnifiedRegex void GroupInfo::Print(DebugWriter* w, const Char* const input) const { if (IsUndefined()) + { w->Print(_u(" (%u)"), offset); + } else { w->PrintQuotedString(input + offset, (CharCount)length); @@ -4007,7 +4508,7 @@ namespace UnifiedRegex // RestoreLoopCont // ---------------------------------------------------------------------- - inline RestoreLoopCont::RestoreLoopCont(int loopId, LoopInfo& origLoopInfo, Matcher& matcher) : Cont(RestoreLoop), loopId(loopId) + inline RestoreLoopCont::RestoreLoopCont(int loopId, LoopInfo& origLoopInfo, Matcher& matcher) : Cont(ContTag::RestoreLoop), loopId(loopId) { this->origLoopInfo.number = origLoopInfo.number; this->origLoopInfo.startInputOffset = origLoopInfo.startInputOffset; @@ -4138,11 +4639,15 @@ namespace UnifiedRegex { Assert(!assertionStack.IsEmpty()); if (matcher.PopAssertion(inputOffset, instPointer, contStack, assertionStack, false)) + { // Body of negative assertion failed return true; // STOP BACKTRACKING + } else + { // Body of positive assertion failed return false; // CONTINUE BACKTRACKING + } } #if ENABLE_REGEX_CONFIG_OPTIONS @@ -4286,7 +4791,7 @@ namespace UnifiedRegex else { // Backtrack to the previous offset where we matched the LoopSet's followFirst - // We will be doing one unnecessary match. But, if we wanted to avoid it, we'd have + // We will be doing one unnecessary match. But, if we wanted to avoid it, we'd have // to propagate to the next Inst, that the first character is already matched. // Seems like an overkill to avoid one match. loopInfo->number = loopInfo->offsetsOfFollowFirst->RemoveAtEnd(); @@ -4357,7 +4862,9 @@ namespace UnifiedRegex groupInfo->length = begin->length; } else + { groupInfo->Reset(); + } if (loopInfo->number > begin->repeats.lower) { @@ -4388,7 +4895,7 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS void ContStack::Print(DebugWriter* w, const Char* const input) const { - for(Iterator it(*this); it; ++it) + for (Iterator it(*this); it; ++it) { w->Print(_u("%4llu: "), static_cast(it.Position())); it->Print(w, input); @@ -4399,7 +4906,7 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS void AssertionStack::Print(DebugWriter* w, const Matcher* matcher) const { - for(Iterator it(*this); it; ++it) + for (Iterator it(*this); it; ++it) { it->Print(w); } @@ -4452,14 +4959,14 @@ namespace UnifiedRegex } #if DBG - const uint32 contTags[] = { -#define M(O) Cont::O, + const Cont::ContTag contTags[] = { +#define M(O) Cont::ContTag::O, #include "RegexContcodes.h" #undef M }; - const uint32 minContTag = contTags[0]; - const uint32 maxContTag = contTags[(sizeof(contTags) / sizeof(uint32)) - 1]; + const Cont::ContTag minContTag = contTags[0]; + const Cont::ContTag maxContTag = contTags[(sizeof(contTags) / sizeof(Cont::ContTag)) - 1]; #endif void Matcher::DoQueryContinue(const uint qcTicks) @@ -4468,8 +4975,10 @@ namespace UnifiedRegex const uint before = previousQcTime; const uint now = GetTickCount(); - if((!before || now - before < TimePerQc) && qcTicks & TicksPerQc - 1) + if ((!before || now - before < TimePerQc) && qcTicks & TicksPerQc - 1) + { return; + } previousQcTime = now; TraceQueryContinue(now); @@ -4510,8 +5019,10 @@ namespace UnifiedRegex void Matcher::TraceQueryContinue(const uint now) { - if(!PHASE_TRACE1(Js::RegexQcPhase)) + if (!PHASE_TRACE1(Js::RegexQcPhase)) + { return; + } Output::Print(_u("Regex QC")); @@ -4519,10 +5030,14 @@ namespace UnifiedRegex static uint firstQcTime = 0; ++n; - if(firstQcTime) + if (firstQcTime) + { Output::Print(_u(" - frequency: %0.1f"), static_cast(n * 1000) / (now - firstQcTime)); + } else + { firstQcTime = now; + } Output::Print(_u("\n")); Output::Flush(); @@ -4552,14 +5067,16 @@ namespace UnifiedRegex #endif Cont* cont = contStack.Pop(); if (cont == 0) + { break; + } Assert(cont->tag >= minContTag && cont->tag <= maxContTag); // All these cases RESUME EXECUTION if backtracking finds a stop point const Cont::ContTag tag = cont->tag; switch (tag) { -#define M(O) case Cont::O: if (((O##Cont*)cont)->Exec(*this, input, inputOffset, instPointer, contStack, assertionStack, qcTicks)) return false; break; +#define M(O) case Cont::ContTag::O: if (((O##Cont*)cont)->Exec(*this, input, inputOffset, instPointer, contStack, assertionStack, qcTicks)) return false; break; #include "RegexContcodes.h" #undef M default: @@ -4571,16 +5088,16 @@ namespace UnifiedRegex } #if DBG - const uint32 instTags[] = { -#define M(TagName) Inst::TagName, + const Inst::InstTag instTags[] = { +#define M(TagName) Inst::InstTag::TagName, #define MTemplate(TagName, ...) M(TagName) #include "RegexOpCodes.h" #undef M #undef MTemplate }; - const uint32 minInstTag = instTags[0]; - const uint32 maxInstTag = instTags[(sizeof(instTags) / sizeof(uint32)) - 1]; + const Inst::InstTag minInstTag = instTags[0]; + const Inst::InstTag maxInstTag = instTags[(sizeof(instTags) / sizeof(Inst::InstTag)) - 1]; #endif inline void Matcher::Run(const Char* const input, const CharCount inputLength, CharCount &matchStart, CharCount &nextSyncInputOffset, ContStack &contStack, AssertionStack &assertionStack, uint &qcTicks, bool firstIteration) @@ -4596,7 +5113,9 @@ namespace UnifiedRegex Assert(((Inst*)instPointer)->tag >= minInstTag && ((Inst*)instPointer)->tag <= maxInstTag); #if ENABLE_REGEX_CONFIG_OPTIONS if (w != 0) + { Print(w, input, inputLength, inputOffset, instPointer, contStack, assertionStack); + } InstStats(); #endif const Inst *inst = (const Inst*)instPointer; @@ -4604,9 +5123,8 @@ namespace UnifiedRegex switch (tag) { #define MBase(TagName, ClassName) \ - case Inst::TagName: \ - if (((const ClassName *)inst)->Exec(*this, input, inputLength, matchStart, inputOffset, nextSyncInputOffset, instPointer, contStack, assertionStack, qcTicks, firstIteration)) \ - return; \ + case Inst::InstTag::TagName: \ + if (((const ClassName *)inst)->Exec(*this, input, inputLength, matchStart, inputOffset, nextSyncInputOffset, instPointer, contStack, assertionStack, qcTicks, firstIteration)) { return; } \ break; #define M(TagName) MBase(TagName, TagName##Inst) #define MTemplate(TagName, TemplateDeclaration, GenericClassName, SpecializedClassName) MBase(TagName, SpecializedClassName) @@ -4625,7 +5143,9 @@ namespace UnifiedRegex void Matcher::ResetLoopInfos() { for (int i = 0; i < program->numLoops; i++) + { loopInfos[i].Reset(); + } } #endif @@ -4787,7 +5307,9 @@ namespace UnifiedRegex CompStats(); #endif if (!stdchrs.IsWord(input[offset])) + { break; + } } } @@ -4804,7 +5326,9 @@ namespace UnifiedRegex CompStats(); #endif if (stdchrs.IsWord(input[offset])) + { break; + } } } @@ -4951,7 +5475,7 @@ namespace UnifiedRegex bool isStickyPresent = this->pattern->IsSticky(); switch (prog->tag) { - case Program::BOIInstructionsTag: + case Program::ProgramTag::BOIInstructionsTag: if (offset != 0) { groupInfos[0].Reset(); @@ -4961,14 +5485,14 @@ namespace UnifiedRegex // fall through - case Program::BOIInstructionsForStickyFlagTag: - AssertMsg(prog->tag == Program::BOIInstructionsTag || isStickyPresent, "prog->tag should be BOIInstructionsForStickyFlagTag if sticky = true."); + case Program::ProgramTag::BOIInstructionsForStickyFlagTag: + AssertMsg(prog->tag == Program::ProgramTag::BOIInstructionsTag || isStickyPresent, "prog->tag should be BOIInstructionsForStickyFlagTag if sticky = true."); loopMatchHere = false; // fall through - case Program::InstructionsTag: + case Program::ProgramTag::InstructionsTag: { previousQcTime = 0; uint qcTicks = 0; @@ -4994,7 +5518,7 @@ namespace UnifiedRegex break; } - case Program::SingleCharTag: + case Program::ProgramTag::SingleCharTag: if (this->pattern->IsIgnoreCase()) { res = MatchSingleCharCaseInsensitive(input, inputLength, offset, prog->rep.singleChar.c); @@ -5006,19 +5530,19 @@ namespace UnifiedRegex break; - case Program::BoundedWordTag: + case Program::ProgramTag::BoundedWordTag: res = MatchBoundedWord(input, inputLength, offset); break; - case Program::LeadingTrailingSpacesTag: + case Program::ProgramTag::LeadingTrailingSpacesTag: res = MatchLeadingTrailingSpaces(input, inputLength, offset); break; - case Program::OctoquadTag: + case Program::ProgramTag::OctoquadTag: res = MatchOctoquad(input, inputLength, offset, prog->rep.octoquad.matcher); break; - case Program::BOILiteral2Tag: + case Program::ProgramTag::BOILiteral2Tag: res = MatchBOILiteral2(input, inputLength, offset, prog->rep.boiLiteral2.literal); break; @@ -5035,7 +5559,6 @@ namespace UnifiedRegex return res; } - #if ENABLE_REGEX_CONFIG_OPTIONS void Matcher::Print(DebugWriter* w, const Char* const input, const CharCount inputLength, CharCount inputOffset, const uint8* instPointer, ContStack &contStack, AssertionStack &assertionStack) const { @@ -5046,14 +5569,20 @@ namespace UnifiedRegex w->EOL(); w->Print(_u("inputPointer: ")); if (inputLength == 0) + { w->PrintEOL(_u("")); + } else if (inputLength > 1024) + { w->PrintEOL(_u("")); + } else { w->PrintEscapedString(input, inputOffset); if (inputOffset >= inputLength) + { w->Print(_u("<<<>>>")); + } else { w->Print(_u("<<<")); @@ -5063,10 +5592,31 @@ namespace UnifiedRegex } w->EOL(); } - if (program->tag == Program::BOIInstructionsTag || program->tag == Program::InstructionsTag) + if (program->tag == Program::ProgramTag::BOIInstructionsTag || program->tag == Program::ProgramTag::InstructionsTag) { w->Print(_u("instPointer: ")); - ((const Inst*)instPointer)->Print(w, InstPointerToLabel(instPointer), program->rep.insts.litbuf); + + const Inst* inst = (const Inst*)instPointer; + switch (inst->tag) + { +#define MBase(TagName, ClassName) \ + case Inst::InstTag::TagName: \ + { \ + const ClassName *actualInst = static_cast(inst); \ + actualInst->Print(w, InstPointerToLabel(instPointer), program->rep.insts.litbuf); \ + break; \ + } +#define M(TagName) MBase(TagName, TagName##Inst) +#define MTemplate(TagName, TemplateDeclaration, GenericClassName, SpecializedClassName) MBase(TagName, SpecializedClassName) +#include "RegexOpCodes.h" +#undef MBase +#undef M +#undef MTemplate + default: + Assert(false); + __assume(false); + } + w->PrintEOL(_u("groups:")); w->Indent(); for (int i = 0; i < program->numGroups; i++) @@ -5111,7 +5661,7 @@ namespace UnifiedRegex , numGroups(0) , numLoops(0) { - tag = InstructionsTag; + tag = ProgramTag::InstructionsTag; rep.insts.insts = nullptr; rep.insts.instsLen = 0; rep.insts.litbuf = nullptr; @@ -5126,7 +5676,7 @@ namespace UnifiedRegex Field(ScannerInfo *)*Program::CreateScannerArrayForSyncToLiterals(Recycler *const recycler) { - Assert(tag == InstructionsTag); + Assert(tag == ProgramTag::InstructionsTag); Assert(!rep.insts.scannersForSyncToLiterals); Assert(recycler); @@ -5142,7 +5692,7 @@ namespace UnifiedRegex const CharCount length, const bool isEquivClass) { - Assert(tag == InstructionsTag); + Assert(tag == ProgramTag::InstructionsTag); Assert(rep.insts.scannersForSyncToLiterals); Assert(recycler); Assert(scannerIndex >= 0); @@ -5156,8 +5706,10 @@ namespace UnifiedRegex void Program::FreeBody(ArenaAllocator* rtAllocator) { - if(tag != InstructionsTag || !rep.insts.insts) + if (tag != ProgramTag::InstructionsTag || !rep.insts.insts) + { return; + } Inst *inst = reinterpret_cast(PointerValue(rep.insts.insts)); const auto instEnd = reinterpret_cast(reinterpret_cast(inst) + rep.insts.instsLen); @@ -5167,7 +5719,7 @@ namespace UnifiedRegex switch(inst->tag) { #define MBase(TagName, ClassName) \ - case Inst::TagName: \ + case Inst::InstTag::TagName: \ { \ const auto actualInst = static_cast(inst); \ actualInst->FreeBody(rtAllocator); \ @@ -5211,12 +5763,12 @@ namespace UnifiedRegex w->PrintEOL(_u("numLoops: %d"), numLoops); switch (tag) { - case BOIInstructionsTag: - case InstructionsTag: + case ProgramTag::BOIInstructionsTag: + case ProgramTag::InstructionsTag: { w->PrintEOL(_u("instructions: {")); w->Indent(); - if (tag == BOIInstructionsTag) + if (tag == ProgramTag::BOIInstructionsTag) { w->PrintEOL(_u(" BOITest(hardFail: true)")); } @@ -5224,24 +5776,45 @@ namespace UnifiedRegex uint8* curr = rep.insts.insts; int i = 0; while (curr != instsLim) - curr += ((Inst*)curr)->Print(w, (Label)(isBaselineMode ? i++ : curr - rep.insts.insts), rep.insts.litbuf); + { + const Inst *inst = (const Inst*)curr; + switch (inst->tag) + { +#define MBase(TagName, ClassName) \ + case Inst::InstTag::TagName: \ + { \ + const ClassName *actualInst = static_cast(inst); \ + curr += actualInst->Print(w, (Label)(isBaselineMode ? i++ : curr - rep.insts.insts), rep.insts.litbuf); \ + break; \ + } +#define M(TagName) MBase(TagName, TagName##Inst) +#define MTemplate(TagName, TemplateDeclaration, GenericClassName, SpecializedClassName) MBase(TagName, SpecializedClassName) +#include "RegexOpCodes.h" +#undef MBase +#undef M +#undef MTemplate + default: + Assert(false); + __assume(false); + } + } w->Unindent(); w->PrintEOL(_u("}")); } break; - case SingleCharTag: + case ProgramTag::SingleCharTag: w->Print(_u("special form: PrintQuotedChar(rep.singleChar.c); w->PrintEOL(_u(">")); break; - case BoundedWordTag: + case ProgramTag::BoundedWordTag: w->PrintEOL(_u("special form: ")); break; - case LeadingTrailingSpacesTag: + case ProgramTag::LeadingTrailingSpacesTag: w->PrintEOL(_u("special form: "), rep.leadingTrailingSpaces.beginMinMatch, rep.leadingTrailingSpaces.endMinMatch); break; - case OctoquadTag: + case ProgramTag::OctoquadTag: w->Print(_u("special form: Print(w); w->PrintEOL(_u(">")); @@ -5253,8 +5826,11 @@ namespace UnifiedRegex #endif // Template parameter here is the max number of cases - template void UnifiedRegex::SwitchMixin<10>::AddCase(char16, unsigned int); - template void UnifiedRegex::SwitchMixin<20>::AddCase(char16, unsigned int); + template void UnifiedRegex::SwitchMixin<2>::AddCase(char16, Label); + template void UnifiedRegex::SwitchMixin<4>::AddCase(char16, Label); + template void UnifiedRegex::SwitchMixin<8>::AddCase(char16, Label); + template void UnifiedRegex::SwitchMixin<16>::AddCase(char16, Label); + template void UnifiedRegex::SwitchMixin<24>::AddCase(char16, Label); #define M(...) #define MTemplate(TagName, TemplateDeclaration, GenericClassName, SpecializedClassName) template struct SpecializedClassName; diff --git a/deps/chakrashim/core/lib/Parser/RegexRuntime.h b/deps/chakrashim/core/lib/Parser/RegexRuntime.h index 03395e2a467..71785f0e4c7 100644 --- a/deps/chakrashim/core/lib/Parser/RegexRuntime.h +++ b/deps/chakrashim/core/lib/Parser/RegexRuntime.h @@ -30,6 +30,7 @@ namespace UnifiedRegex struct Program : private Chars { + friend class Lowerer; friend class Compiler; friend struct MatchLiteralNode; friend struct AltNode; @@ -64,7 +65,7 @@ namespace UnifiedRegex Field(RegexFlags) flags; private: - enum ProgramTag : uint8 + enum class ProgramTag : uint8 { InstructionsTag, BOIInstructionsTag, @@ -280,6 +281,7 @@ namespace UnifiedRegex // Mix-in types // ---------------------------------------------------------------------- +#pragma pack(push, 1) // Contains information about how much to back up after syncing to a literal (for the SyncTo... instructions) struct BackupMixin { @@ -361,6 +363,17 @@ namespace UnifiedRegex #endif }; + struct TrieMixin + { + RuntimeCharTrie trie; + + // Trie must always be cloned + +#if ENABLE_REGEX_CONFIG_OPTIONS + void Print(DebugWriter* w, const char16* litbuf) const; +#endif + }; + struct Char2LiteralScannerMixin : Char2Mixin { // scanner must be setup @@ -442,17 +455,6 @@ namespace UnifiedRegex #endif }; - struct HardFailMixin - { - bool canHardFail; - - inline HardFailMixin(bool canHardFail) : canHardFail(canHardFail) {} - -#if ENABLE_REGEX_CONFIG_OPTIONS - void Print(DebugWriter* w, const char16* litbuf) const; -#endif - }; - struct GroupMixin { const int groupId; @@ -504,23 +506,45 @@ namespace UnifiedRegex #endif }; - struct BeginLoopMixin + struct BeginLoopBasicsMixin { int loopId; const CountDomain repeats; bool hasOuterLoops; + + inline BeginLoopBasicsMixin(int loopId, const CountDomain& repeats, bool hasOuterLoops) + : loopId(loopId), repeats(repeats), hasOuterLoops(hasOuterLoops) + {} + +#if ENABLE_REGEX_CONFIG_OPTIONS + void Print(DebugWriter* w, const char16* litbuf) const; +#endif + }; + + struct BeginLoopMixin : BeginLoopBasicsMixin + { bool hasInnerNondet; Label exitLabel; // exitLabel must always be fixed up inline BeginLoopMixin(int loopId, const CountDomain& repeats, bool hasOuterLoops, bool hasInnerNondet) - : loopId(loopId), repeats(repeats), hasOuterLoops(hasOuterLoops), hasInnerNondet(hasInnerNondet) + : BeginLoopBasicsMixin(loopId, repeats, hasOuterLoops), hasInnerNondet(hasInnerNondet) { #if DBG exitLabel = (Label)-1; #endif } +#if ENABLE_REGEX_CONFIG_OPTIONS + void Print(DebugWriter* w, const char16* litbuf) const; +#endif + }; + + struct GreedyMixin + { + bool isGreedy; + inline GreedyMixin(bool isGreedy) : isGreedy(isGreedy) {} + #if ENABLE_REGEX_CONFIG_OPTIONS void Print(DebugWriter* w, const char16* litbuf) const; #endif @@ -532,6 +556,19 @@ namespace UnifiedRegex inline RepeatLoopMixin(Label beginLabel) : beginLabel(beginLabel) {} +#if ENABLE_REGEX_CONFIG_OPTIONS + void Print(DebugWriter* w, const char16* litbuf) const; +#endif + }; + + struct GreedyLoopNoBacktrackMixin + { + int loopId; + Label exitLabel; + + // exitLabel must always be fixed up + inline GreedyLoopNoBacktrackMixin(int loopId) : loopId(loopId) {} + #if ENABLE_REGEX_CONFIG_OPTIONS void Print(DebugWriter* w, const char16* litbuf) const; #endif @@ -549,6 +586,34 @@ namespace UnifiedRegex #endif } +#if ENABLE_REGEX_CONFIG_OPTIONS + void Print(DebugWriter* w, const char16* litbuf) const; +#endif + }; + + struct NegationMixin + { + bool isNegation; + + inline NegationMixin(bool isNegation) : isNegation(isNegation) {} + +#if ENABLE_REGEX_CONFIG_OPTIONS + void Print(DebugWriter* w, const char16* litbuf) const; +#endif + }; + + struct NextLabelMixin + { + Label nextLabel; + + // nextLabel must always be fixed up + inline NextLabelMixin() + { +#if DBG + nextLabel = (Label)-1; +#endif + } + #if ENABLE_REGEX_CONFIG_OPTIONS void Print(DebugWriter* w, const char16* litbuf) const; #endif @@ -560,6 +625,17 @@ namespace UnifiedRegex inline FixedLengthMixin(CharCount length) : length(length) {} +#if ENABLE_REGEX_CONFIG_OPTIONS + void Print(DebugWriter* w, const char16* litbuf) const; +#endif + }; + + struct FollowFirstMixin : private Chars + { + Char followFirst; + + inline FollowFirstMixin(Char followFirst) : followFirst(followFirst) {} + #if ENABLE_REGEX_CONFIG_OPTIONS void Print(DebugWriter* w, const char16* litbuf) const; #endif @@ -586,12 +662,12 @@ namespace UnifiedRegex #endif }; - template + template struct SwitchMixin { - static const int MaxCases = n; + static constexpr uint8 MaxCases = n; - int numCases; + uint8 numCases; // numCases cases, in increasing character order SwitchCase cases[MaxCases]; @@ -599,7 +675,7 @@ namespace UnifiedRegex inline SwitchMixin() : numCases(0) { #if DBG - for (int i = 0; i < MaxCases; i++) + for (uint8 i = 0; i < MaxCases; i++) { cases[i].c = (char16)-1; cases[i].targetLabel = (Label)-1; @@ -619,9 +695,11 @@ namespace UnifiedRegex // Instructions // ---------------------------------------------------------------------- + // NOTE: #pragma pack(1) applies to all Inst structs as well as all Mixin structs (see above). + struct Inst : protected Chars { - enum InstTag : uint32 + enum class InstTag : uint8 { #define M(TagName) TagName, #define MTemplate(TagName, ...) M(TagName) @@ -638,7 +716,9 @@ namespace UnifiedRegex #if ENABLE_REGEX_CONFIG_OPTIONS static bool IsBaselineMode(); static Label GetPrintLabel(Label label); - virtual int Print(DebugWriter*w, Label label, const Char* litbuf) const = 0; + + template + void PrintBytes(DebugWriter *w, Inst *inst, T *that, const char16 *annotation) const; #endif }; @@ -650,7 +730,7 @@ namespace UnifiedRegex } #if ENABLE_REGEX_CONFIG_OPTIONS -#define INST_BODY_PRINT virtual int Print(DebugWriter*w, Label label, const Char* litbuf) const override; +#define INST_BODY_PRINT int Print(DebugWriter*w, Label label, const Char* litbuf) const; #else #define INST_BODY_PRINT #endif @@ -663,16 +743,23 @@ namespace UnifiedRegex // Control flow // + struct NopInst : Inst + { + inline NopInst() : Inst(InstTag::Nop) {} + + INST_BODY + }; + struct FailInst : Inst { - inline FailInst() : Inst(Fail) {} + inline FailInst() : Inst(InstTag::Fail) {} INST_BODY }; struct SuccInst : Inst { - inline SuccInst() : Inst(Succ) {} + inline SuccInst() : Inst(InstTag::Succ) {} INST_BODY }; @@ -680,7 +767,7 @@ namespace UnifiedRegex struct JumpInst : Inst, JumpMixin { // targetLabel must always be fixed up - inline JumpInst() : Inst(Jump), JumpMixin() {} + inline JumpInst() : Inst(InstTag::Jump), JumpMixin() {} INST_BODY }; @@ -688,7 +775,7 @@ namespace UnifiedRegex struct JumpIfNotCharInst : Inst, CharMixin, JumpMixin { // targetLabel must always be fixed up - inline JumpIfNotCharInst(Char c) : Inst(JumpIfNotChar), CharMixin(c), JumpMixin() {} + inline JumpIfNotCharInst(Char c) : Inst(InstTag::JumpIfNotChar), CharMixin(c), JumpMixin() {} INST_BODY }; @@ -696,7 +783,7 @@ namespace UnifiedRegex struct MatchCharOrJumpInst : Inst, CharMixin, JumpMixin { // targetLabel must always be fixed up - inline MatchCharOrJumpInst(Char c) : Inst(MatchCharOrJump), CharMixin(c), JumpMixin() {} + inline MatchCharOrJumpInst(Char c) : Inst(InstTag::MatchCharOrJump), CharMixin(c), JumpMixin() {} INST_BODY }; @@ -705,7 +792,7 @@ namespace UnifiedRegex { // set must always be cloned from source // targetLabel must always be fixed up - inline JumpIfNotSetInst() : Inst(JumpIfNotSet), JumpMixin() {} + inline JumpIfNotSetInst() : Inst(InstTag::JumpIfNotSet), JumpMixin() {} INST_BODY INST_BODY_FREE(SetMixin) @@ -715,81 +802,80 @@ namespace UnifiedRegex { // set must always be cloned from source // targetLabel must always be fixed up - inline MatchSetOrJumpInst() : Inst(MatchSetOrJump), JumpMixin() {} + inline MatchSetOrJumpInst() : Inst(InstTag::MatchSetOrJump), JumpMixin() {} INST_BODY INST_BODY_FREE(SetMixin) }; - struct Switch10Inst : Inst, SwitchMixin<10> - { - // Cases must always be added - inline Switch10Inst() : Inst(Switch10), SwitchMixin() {} - - INST_BODY - }; - - struct Switch20Inst : Inst, SwitchMixin<20> - { - // Cases must always be added - inline Switch20Inst() : Inst(Switch20), SwitchMixin() {} - - INST_BODY - }; - - struct SwitchAndConsume10Inst : Inst, SwitchMixin<10> - { - // Cases must always be added - inline SwitchAndConsume10Inst() : Inst(SwitchAndConsume10), SwitchMixin() {} - - INST_BODY - }; - - struct SwitchAndConsume20Inst : Inst, SwitchMixin<20> - { - // Cases must always be added - inline SwitchAndConsume20Inst() : Inst(SwitchAndConsume20), SwitchMixin() {} - - INST_BODY - }; +#define SwitchInstActual(n) \ + struct Switch##n##Inst : Inst, SwitchMixin \ + { \ + inline Switch##n##Inst() : Inst(InstTag::Switch##n), SwitchMixin() {} \ + INST_BODY \ + }; + SwitchInstActual(2); + SwitchInstActual(4); + SwitchInstActual(8); + SwitchInstActual(16); + SwitchInstActual(24); +#undef SwitchInstActual + +#define SwitchAndConsumeInstActual(n) \ + struct SwitchAndConsume##n##Inst : Inst, SwitchMixin \ + { \ + inline SwitchAndConsume##n##Inst() : Inst(InstTag::SwitchAndConsume##n), SwitchMixin() {} \ + INST_BODY \ + }; + SwitchAndConsumeInstActual(2); + SwitchAndConsumeInstActual(4); + SwitchAndConsumeInstActual(8); + SwitchAndConsumeInstActual(16); + SwitchAndConsumeInstActual(24); +#undef SwitchAndConsumeInstActual // // Built-in assertions // - struct BOITestInst : Inst, HardFailMixin + // BOI = Beginning of Input + template + struct BOITestInst : Inst { - inline BOITestInst(bool canHardFail) : Inst(BOITest), HardFailMixin(canHardFail) {} + BOITestInst(); INST_BODY }; - struct EOITestInst : Inst, HardFailMixin + // EOI = End of Input + template + struct EOITestInst : Inst { - inline EOITestInst(bool canHardFail) : Inst(EOITest), HardFailMixin(canHardFail) {} + EOITestInst(); INST_BODY }; + // BOL = Beginning of Line (/^.../) struct BOLTestInst : Inst { - inline BOLTestInst() : Inst(BOLTest) {} + inline BOLTestInst() : Inst(InstTag::BOLTest) {} INST_BODY }; + // EOL = End of Line (/...$/) struct EOLTestInst : Inst { - inline EOLTestInst() : Inst(EOLTest) {} + inline EOLTestInst() : Inst(InstTag::EOLTest) {} INST_BODY }; + template struct WordBoundaryTestInst : Inst { - bool isNegation; - - inline WordBoundaryTestInst(bool isNegation) : Inst(WordBoundaryTest), isNegation(isNegation) {} + WordBoundaryTestInst(); INST_BODY }; @@ -800,14 +886,14 @@ namespace UnifiedRegex struct MatchCharInst : Inst, CharMixin { - inline MatchCharInst(Char c) : Inst(MatchChar), CharMixin(c) {} + inline MatchCharInst(Char c) : Inst(InstTag::MatchChar), CharMixin(c) {} INST_BODY }; struct MatchChar2Inst : Inst, Char2Mixin { - inline MatchChar2Inst(Char c0, Char c1) : Inst(MatchChar2), Char2Mixin(c0, c1) {} + inline MatchChar2Inst(Char c0, Char c1) : Inst(InstTag::MatchChar2), Char2Mixin(c0, c1) {} INST_BODY }; @@ -815,14 +901,14 @@ namespace UnifiedRegex struct MatchChar3Inst : Inst, Char3Mixin { - inline MatchChar3Inst(Char c0, Char c1, Char c2) : Inst(MatchChar3), Char3Mixin(c0, c1, c2) {} + inline MatchChar3Inst(Char c0, Char c1, Char c2) : Inst(InstTag::MatchChar3), Char3Mixin(c0, c1, c2) {} INST_BODY }; struct MatchChar4Inst : Inst, Char4Mixin { - inline MatchChar4Inst(Char c0, Char c1, Char c2, Char c3) : Inst(MatchChar4), Char4Mixin(c0, c1, c2, c3) {} + inline MatchChar4Inst(Char c0, Char c1, Char c2, Char c3) : Inst(InstTag::MatchChar4), Char4Mixin(c0, c1, c2, c3) {} INST_BODY }; @@ -831,7 +917,7 @@ namespace UnifiedRegex struct MatchSetInst : Inst, SetMixin { // set must always be cloned from source - inline MatchSetInst() : Inst(IsNegation ? MatchNegatedSet : MatchSet) {} + inline MatchSetInst() : Inst(IsNegation ? InstTag::MatchNegatedSet : InstTag::MatchSet) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -839,24 +925,22 @@ namespace UnifiedRegex struct MatchLiteralInst : Inst, LiteralMixin { - inline MatchLiteralInst(CharCount offset, CharCount length) : Inst(MatchLiteral), LiteralMixin(offset, length) {} + inline MatchLiteralInst(CharCount offset, CharCount length) : Inst(InstTag::MatchLiteral), LiteralMixin(offset, length) {} INST_BODY }; struct MatchLiteralEquivInst : Inst, LiteralMixin { - inline MatchLiteralEquivInst(CharCount offset, CharCount length) : Inst(MatchLiteralEquiv), LiteralMixin(offset, length) {} + inline MatchLiteralEquivInst(CharCount offset, CharCount length) : Inst(InstTag::MatchLiteralEquiv), LiteralMixin(offset, length) {} INST_BODY }; - struct MatchTrieInst : Inst + struct MatchTrieInst : Inst, TrieMixin { - RuntimeCharTrie trie; - // Trie must always be cloned - inline MatchTrieInst() : Inst(MatchTrie) {} + inline MatchTrieInst() : Inst(InstTag::MatchTrie) {} void FreeBody(ArenaAllocator* rtAllocator); INST_BODY @@ -864,7 +948,7 @@ namespace UnifiedRegex struct OptMatchCharInst : Inst, CharMixin { - inline OptMatchCharInst(Char c) : Inst(OptMatchChar), CharMixin(c) {} + inline OptMatchCharInst(Char c) : Inst(InstTag::OptMatchChar), CharMixin(c) {} INST_BODY }; @@ -872,7 +956,7 @@ namespace UnifiedRegex struct OptMatchSetInst : Inst, SetMixin { // set must always be cloned from source - inline OptMatchSetInst() : Inst(OptMatchSet) {} + inline OptMatchSetInst() : Inst(InstTag::OptMatchSet) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -885,14 +969,14 @@ namespace UnifiedRegex struct SyncToCharAndContinueInst : Inst, CharMixin { - inline SyncToCharAndContinueInst(Char c) : Inst(SyncToCharAndContinue), CharMixin(c) {} + inline SyncToCharAndContinueInst(Char c) : Inst(InstTag::SyncToCharAndContinue), CharMixin(c) {} INST_BODY }; struct SyncToChar2SetAndContinueInst : Inst, Char2Mixin { - inline SyncToChar2SetAndContinueInst(Char c0, Char c1) : Inst(SyncToChar2SetAndContinue), Char2Mixin(c0, c1) {} + inline SyncToChar2SetAndContinueInst(Char c0, Char c1) : Inst(InstTag::SyncToChar2SetAndContinue), Char2Mixin(c0, c1) {} INST_BODY }; @@ -901,7 +985,7 @@ namespace UnifiedRegex struct SyncToSetAndContinueInst : Inst, SetMixin { // set must always be cloned from source - inline SyncToSetAndContinueInst() : Inst(IsNegation ? SyncToNegatedSetAndContinue : SyncToSetAndContinue) {} + inline SyncToSetAndContinueInst() : Inst(IsNegation ? InstTag::SyncToNegatedSetAndContinue : InstTag::SyncToSetAndContinue) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -919,14 +1003,14 @@ namespace UnifiedRegex struct SyncToChar2LiteralAndContinueInst : SyncToLiteralAndContinueInstT { SyncToChar2LiteralAndContinueInst(Char c0, Char c1) : - SyncToLiteralAndContinueInstT(SyncToChar2LiteralAndContinue, 0, 2) { Char2LiteralScannerMixin::Setup(c0, c1); } + SyncToLiteralAndContinueInstT(InstTag::SyncToChar2LiteralAndContinue, 0, 2) { Char2LiteralScannerMixin::Setup(c0, c1); } }; struct SyncToLiteralAndContinueInst : SyncToLiteralAndContinueInstT { // scanner must be setup SyncToLiteralAndContinueInst(CharCount offset, CharCount length) : - SyncToLiteralAndContinueInstT(SyncToLiteralAndContinue, offset, length) {} + SyncToLiteralAndContinueInstT(InstTag::SyncToLiteralAndContinue, offset, length) {} INST_BODY_FREE(ScannerMixin) }; @@ -935,7 +1019,7 @@ namespace UnifiedRegex { // scanner must be setup SyncToLinearLiteralAndContinueInst(CharCount offset, CharCount length) : - SyncToLiteralAndContinueInstT(SyncToLinearLiteralAndContinue, offset, length) {} + SyncToLiteralAndContinueInstT(InstTag::SyncToLinearLiteralAndContinue, offset, length) {} INST_BODY_FREE(ScannerMixin_WithLinearCharMap) }; @@ -944,7 +1028,7 @@ namespace UnifiedRegex { // scanner must be setup SyncToLiteralEquivAndContinueInst(CharCount offset, CharCount length) : - SyncToLiteralAndContinueInstT(SyncToLiteralEquivAndContinue, offset, length) {} + SyncToLiteralAndContinueInstT(InstTag::SyncToLiteralEquivAndContinue, offset, length) {} INST_BODY_FREE(EquivScannerMixin) }; @@ -953,21 +1037,21 @@ namespace UnifiedRegex { // scanner must be setup SyncToLiteralEquivTrivialLastPatCharAndContinueInst(CharCount offset, CharCount length) : - SyncToLiteralAndContinueInstT(SyncToLiteralEquivTrivialLastPatCharAndContinue, offset, length) {} + SyncToLiteralAndContinueInstT(InstTag::SyncToLiteralEquivTrivialLastPatCharAndContinue, offset, length) {} INST_BODY_FREE(EquivTrivialLastPatCharScannerMixin) }; struct SyncToCharAndConsumeInst : Inst, CharMixin { - inline SyncToCharAndConsumeInst(Char c) : Inst(SyncToCharAndConsume), CharMixin(c) {} + inline SyncToCharAndConsumeInst(Char c) : Inst(InstTag::SyncToCharAndConsume), CharMixin(c) {} INST_BODY }; struct SyncToChar2SetAndConsumeInst : Inst, Char2Mixin { - inline SyncToChar2SetAndConsumeInst(Char c0, Char c1) : Inst(SyncToChar2SetAndConsume), Char2Mixin(c0, c1) {} + inline SyncToChar2SetAndConsumeInst(Char c0, Char c1) : Inst(InstTag::SyncToChar2SetAndConsume), Char2Mixin(c0, c1) {} INST_BODY }; @@ -976,7 +1060,7 @@ namespace UnifiedRegex struct SyncToSetAndConsumeInst : Inst, SetMixin { // set must always be cloned from source - inline SyncToSetAndConsumeInst() : Inst(IsNegation ? SyncToNegatedSetAndConsume : SyncToSetAndConsume) {} + inline SyncToSetAndConsumeInst() : Inst(IsNegation ? InstTag::SyncToNegatedSetAndConsume : InstTag::SyncToSetAndConsume) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -994,14 +1078,14 @@ namespace UnifiedRegex struct SyncToChar2LiteralAndConsumeInst : SyncToLiteralAndConsumeInstT { SyncToChar2LiteralAndConsumeInst(Char c0, Char c1) : - SyncToLiteralAndConsumeInstT(SyncToChar2LiteralAndConsume, 0, 2) { Char2LiteralScannerMixin::Setup(c0, c1); } + SyncToLiteralAndConsumeInstT(InstTag::SyncToChar2LiteralAndConsume, 0, 2) { Char2LiteralScannerMixin::Setup(c0, c1); } }; struct SyncToLiteralAndConsumeInst : SyncToLiteralAndConsumeInstT { // scanner must be setup SyncToLiteralAndConsumeInst(CharCount offset, CharCount length) : - SyncToLiteralAndConsumeInstT(SyncToLiteralAndConsume, offset, length) {} + SyncToLiteralAndConsumeInstT(InstTag::SyncToLiteralAndConsume, offset, length) {} INST_BODY_FREE(ScannerMixin) }; @@ -1010,7 +1094,7 @@ namespace UnifiedRegex { // scanner must be setup SyncToLinearLiteralAndConsumeInst(CharCount offset, CharCount length) : - SyncToLiteralAndConsumeInstT(SyncToLinearLiteralAndConsume, offset, length) {} + SyncToLiteralAndConsumeInstT(InstTag::SyncToLinearLiteralAndConsume, offset, length) {} INST_BODY_FREE(ScannerMixin_WithLinearCharMap) }; @@ -1019,7 +1103,7 @@ namespace UnifiedRegex { // scanner must be setup SyncToLiteralEquivAndConsumeInst(CharCount offset, CharCount length) : - SyncToLiteralAndConsumeInstT(SyncToLiteralEquivAndConsume,offset, length) {} + SyncToLiteralAndConsumeInstT(InstTag::SyncToLiteralEquivAndConsume,offset, length) {} INST_BODY_FREE(EquivScannerMixin) }; @@ -1028,14 +1112,14 @@ namespace UnifiedRegex { // scanner must be setup SyncToLiteralEquivTrivialLastPatCharAndConsumeInst(CharCount offset, CharCount length) : - SyncToLiteralAndConsumeInstT(SyncToLiteralEquivTrivialLastPatCharAndConsume, offset, length) {} + SyncToLiteralAndConsumeInstT(InstTag::SyncToLiteralEquivTrivialLastPatCharAndConsume, offset, length) {} INST_BODY_FREE(EquivTrivialLastPatCharScannerMixin) }; struct SyncToCharAndBackupInst : Inst, CharMixin, BackupMixin { - inline SyncToCharAndBackupInst(Char c, const CountDomain& backup) : Inst(SyncToCharAndBackup), CharMixin(c), BackupMixin(backup) {} + inline SyncToCharAndBackupInst(Char c, const CountDomain& backup) : Inst(InstTag::SyncToCharAndBackup), CharMixin(c), BackupMixin(backup) {} INST_BODY }; @@ -1044,7 +1128,7 @@ namespace UnifiedRegex struct SyncToSetAndBackupInst : Inst, SetMixin, BackupMixin { // set must always be cloned from source - inline SyncToSetAndBackupInst(const CountDomain& backup) : Inst(IsNegation ? SyncToNegatedSetAndBackup : SyncToSetAndBackup), BackupMixin(backup) {} + inline SyncToSetAndBackupInst(const CountDomain& backup) : Inst(IsNegation ? InstTag::SyncToNegatedSetAndBackup : InstTag::SyncToSetAndBackup), BackupMixin(backup) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -1062,14 +1146,14 @@ namespace UnifiedRegex struct SyncToChar2LiteralAndBackupInst : SyncToLiteralAndBackupInstT { SyncToChar2LiteralAndBackupInst(Char c0, Char c1, const CountDomain& backup) : - SyncToLiteralAndBackupInstT(SyncToChar2LiteralAndBackup, 0, 2, backup) { Char2LiteralScannerMixin::Setup(c0, c1); } + SyncToLiteralAndBackupInstT(InstTag::SyncToChar2LiteralAndBackup, 0, 2, backup) { Char2LiteralScannerMixin::Setup(c0, c1); } }; struct SyncToLiteralAndBackupInst : SyncToLiteralAndBackupInstT { // scanner must be setup SyncToLiteralAndBackupInst(CharCount offset, CharCount length, const CountDomain& backup) : - SyncToLiteralAndBackupInstT(SyncToLiteralAndBackup, offset, length, backup) {} + SyncToLiteralAndBackupInstT(InstTag::SyncToLiteralAndBackup, offset, length, backup) {} INST_BODY_FREE(ScannerMixin) }; @@ -1078,7 +1162,7 @@ namespace UnifiedRegex { // scanner must be setup SyncToLinearLiteralAndBackupInst(CharCount offset, CharCount length, const CountDomain& backup) : - SyncToLiteralAndBackupInstT(SyncToLinearLiteralAndBackup, offset, length, backup) {} + SyncToLiteralAndBackupInstT(InstTag::SyncToLinearLiteralAndBackup, offset, length, backup) {} INST_BODY_FREE(ScannerMixin_WithLinearCharMap) }; @@ -1087,7 +1171,7 @@ namespace UnifiedRegex { // scanner must be setup SyncToLiteralEquivAndBackupInst(CharCount offset, CharCount length, const CountDomain& backup) : - SyncToLiteralAndBackupInstT(SyncToLiteralEquivAndBackup, offset, length, backup) {} + SyncToLiteralAndBackupInstT(InstTag::SyncToLiteralEquivAndBackup, offset, length, backup) {} INST_BODY_FREE(EquivScannerMixin) }; @@ -1096,7 +1180,7 @@ namespace UnifiedRegex { // scanner must be setup SyncToLiteralEquivTrivialLastPatCharAndBackupInst(CharCount offset, CharCount length, const CountDomain& backup) : - SyncToLiteralAndBackupInstT(SyncToLiteralEquivTrivialLastPatCharAndBackup, offset, length, backup) {} + SyncToLiteralAndBackupInstT(InstTag::SyncToLiteralEquivTrivialLastPatCharAndBackup, offset, length, backup) {} INST_BODY_FREE(EquivTrivialLastPatCharScannerMixin) }; @@ -1105,7 +1189,7 @@ namespace UnifiedRegex { // scanner mixins must be setup inline SyncToLiteralsAndBackupInst(Recycler *recycler, Program *program, const CountDomain& backup) - : Inst(SyncToLiteralsAndBackup), ScannersMixin(recycler, program), BackupMixin(backup) + : Inst(InstTag::SyncToLiteralsAndBackup), ScannersMixin(recycler, program), BackupMixin(backup) { } @@ -1119,14 +1203,14 @@ namespace UnifiedRegex struct MatchGroupInst : Inst, GroupMixin { - inline MatchGroupInst(int groupId) : Inst(MatchGroup), GroupMixin(groupId) {} + inline MatchGroupInst(int groupId) : Inst(InstTag::MatchGroup), GroupMixin(groupId) {} INST_BODY }; struct BeginDefineGroupInst : Inst, GroupMixin { - inline BeginDefineGroupInst(int groupId) : Inst(BeginDefineGroup), GroupMixin(groupId) {} + inline BeginDefineGroupInst(int groupId) : Inst(InstTag::BeginDefineGroup), GroupMixin(groupId) {} INST_BODY }; @@ -1134,7 +1218,7 @@ namespace UnifiedRegex struct EndDefineGroupInst : Inst, GroupMixin, NoNeedToSaveMixin { inline EndDefineGroupInst(int groupId, bool noNeedToSave) - : Inst(EndDefineGroup), GroupMixin(groupId), NoNeedToSaveMixin(noNeedToSave) + : Inst(InstTag::EndDefineGroup), GroupMixin(groupId), NoNeedToSaveMixin(noNeedToSave) { } @@ -1143,7 +1227,7 @@ namespace UnifiedRegex struct DefineGroupFixedInst : Inst, GroupMixin, FixedLengthMixin, NoNeedToSaveMixin { - inline DefineGroupFixedInst(int groupId, CharCount length, bool noNeedToSave) : Inst(DefineGroupFixed), GroupMixin(groupId), FixedLengthMixin(length), NoNeedToSaveMixin(noNeedToSave) {} + inline DefineGroupFixedInst(int groupId, CharCount length, bool noNeedToSave) : Inst(InstTag::DefineGroupFixed), GroupMixin(groupId), FixedLengthMixin(length), NoNeedToSaveMixin(noNeedToSave) {} INST_BODY }; @@ -1152,13 +1236,11 @@ namespace UnifiedRegex // Loops // - struct BeginLoopInst : Inst, BeginLoopMixin, BodyGroupsMixin + struct BeginLoopInst : Inst, BeginLoopMixin, BodyGroupsMixin, GreedyMixin { - bool isGreedy; - // exitLabel must always be fixed up inline BeginLoopInst(int loopId, const CountDomain& repeats, bool hasOuterLoops, bool hasInnerNondet, int minBodyGroupId, int maxBodyGroupId, bool isGreedy) - : Inst(BeginLoop), BeginLoopMixin(loopId, repeats, hasOuterLoops, hasInnerNondet), BodyGroupsMixin(minBodyGroupId, maxBodyGroupId), isGreedy(isGreedy) + : Inst(InstTag::BeginLoop), BeginLoopMixin(loopId, repeats, hasOuterLoops, hasInnerNondet), BodyGroupsMixin(minBodyGroupId, maxBodyGroupId), GreedyMixin(isGreedy) {} INST_BODY @@ -1166,7 +1248,7 @@ namespace UnifiedRegex struct RepeatLoopInst : Inst, RepeatLoopMixin { - inline RepeatLoopInst(Label beginLabel) : Inst(RepeatLoop), RepeatLoopMixin(beginLabel) {} + inline RepeatLoopInst(Label beginLabel) : Inst(InstTag::RepeatLoop), RepeatLoopMixin(beginLabel) {} INST_BODY }; @@ -1175,7 +1257,7 @@ namespace UnifiedRegex { // exitLabel must always be fixed up inline BeginLoopIfCharInst(Char c, int loopId, const CountDomain& repeats, bool hasOuterLoops, bool hasInnerNondet, int minBodyGroupId, int maxBodyGroupId) - : Inst(BeginLoopIfChar), CharMixin(c), BeginLoopMixin(loopId, repeats, hasOuterLoops, hasInnerNondet), BodyGroupsMixin(minBodyGroupId, maxBodyGroupId) {} + : Inst(InstTag::BeginLoopIfChar), CharMixin(c), BeginLoopMixin(loopId, repeats, hasOuterLoops, hasInnerNondet), BodyGroupsMixin(minBodyGroupId, maxBodyGroupId) {} INST_BODY }; @@ -1185,7 +1267,7 @@ namespace UnifiedRegex // set must always be cloned from source // exitLabel must always be fixed up inline BeginLoopIfSetInst(int loopId, const CountDomain& repeats, bool hasOuterLoops, bool hasInnerNondet, int minBodyGroupId, int maxBodyGroupId) - : Inst(BeginLoopIfSet), BeginLoopMixin(loopId, repeats, hasOuterLoops, hasInnerNondet), BodyGroupsMixin(minBodyGroupId, maxBodyGroupId) {} + : Inst(InstTag::BeginLoopIfSet), BeginLoopMixin(loopId, repeats, hasOuterLoops, hasInnerNondet), BodyGroupsMixin(minBodyGroupId, maxBodyGroupId) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -1193,14 +1275,14 @@ namespace UnifiedRegex struct RepeatLoopIfCharInst : Inst, RepeatLoopMixin { - inline RepeatLoopIfCharInst(Label beginLabel) : Inst(RepeatLoopIfChar), RepeatLoopMixin(beginLabel) {} + inline RepeatLoopIfCharInst(Label beginLabel) : Inst(InstTag::RepeatLoopIfChar), RepeatLoopMixin(beginLabel) {} INST_BODY }; struct RepeatLoopIfSetInst : Inst, RepeatLoopMixin { - inline RepeatLoopIfSetInst(Label beginLabel) : Inst(RepeatLoopIfSet), RepeatLoopMixin(beginLabel) {} + inline RepeatLoopIfSetInst(Label beginLabel) : Inst(InstTag::RepeatLoopIfSet), RepeatLoopMixin(beginLabel) {} INST_BODY }; @@ -1210,43 +1292,37 @@ namespace UnifiedRegex { // exitLabel must always be fixed up inline BeginLoopFixedInst(int loopId, const CountDomain& repeats, bool hasOuterLoops, CharCount length) - : Inst(BeginLoopFixed), BeginLoopMixin(loopId, repeats, hasOuterLoops, false), FixedLengthMixin(length) {} + : Inst(InstTag::BeginLoopFixed), BeginLoopMixin(loopId, repeats, hasOuterLoops, false), FixedLengthMixin(length) {} INST_BODY }; struct RepeatLoopFixedInst : Inst, RepeatLoopMixin { - inline RepeatLoopFixedInst(Label beginLabel) : Inst(RepeatLoopFixed), RepeatLoopMixin(beginLabel) {} + inline RepeatLoopFixedInst(Label beginLabel) : Inst(InstTag::RepeatLoopFixed), RepeatLoopMixin(beginLabel) {} INST_BODY }; // Loop is greedy, contains a MatchSet only - struct LoopSetInst : Inst, SetMixin + struct LoopSetInst : Inst, SetMixin, BeginLoopBasicsMixin { - int loopId; - const CountDomain repeats; - bool hasOuterLoops; - // set must always be cloned from source inline LoopSetInst(int loopId, const CountDomain& repeats, bool hasOuterLoops) - : Inst(LoopSet), loopId(loopId), repeats(repeats), hasOuterLoops(hasOuterLoops) {} + : Inst(InstTag::LoopSet), BeginLoopBasicsMixin(loopId, repeats, hasOuterLoops) {} inline LoopSetInst(InstTag tag, int loopId, const CountDomain& repeats, bool hasOuterLoops) - : Inst(tag), loopId(loopId), repeats(repeats), hasOuterLoops(hasOuterLoops) {} + : Inst(tag), BeginLoopBasicsMixin(loopId, repeats, hasOuterLoops) {} INST_BODY INST_BODY_FREE(SetMixin) }; // Loop is greedy, contains a MatchSet only, first character in its follow set is known - struct LoopSetWithFollowFirstInst : LoopSetInst + struct LoopSetWithFollowFirstInst : LoopSetInst, FollowFirstMixin { - Char followFirst; - inline LoopSetWithFollowFirstInst(int loopId, const CountDomain& repeats, bool hasOuterLoops, Char followFirst) - : LoopSetInst(InstTag::LoopSetWithFollowFirst, loopId, repeats, hasOuterLoops), followFirst(followFirst) {} + : LoopSetInst(InstTag::LoopSetWithFollowFirst, loopId, repeats, hasOuterLoops), FollowFirstMixin(followFirst) {} INST_BODY }; @@ -1256,33 +1332,30 @@ namespace UnifiedRegex { // exitLabel must always be fixed up inline BeginLoopFixedGroupLastIterationInst(int loopId, const CountDomain& repeats, bool hasOuterLoops, CharCount length, int groupId, bool noNeedToSave) - : Inst(BeginLoopFixedGroupLastIteration), BeginLoopMixin(loopId, repeats, hasOuterLoops, false), FixedLengthMixin(length), GroupMixin(groupId), NoNeedToSaveMixin(noNeedToSave) {} + : Inst(InstTag::BeginLoopFixedGroupLastIteration), BeginLoopMixin(loopId, repeats, hasOuterLoops, false), FixedLengthMixin(length), GroupMixin(groupId), NoNeedToSaveMixin(noNeedToSave) {} INST_BODY }; struct RepeatLoopFixedGroupLastIterationInst : Inst, RepeatLoopMixin { - inline RepeatLoopFixedGroupLastIterationInst(Label beginLabel) : Inst(RepeatLoopFixedGroupLastIteration), RepeatLoopMixin(beginLabel) {} + inline RepeatLoopFixedGroupLastIterationInst(Label beginLabel) : Inst(InstTag::RepeatLoopFixedGroupLastIteration), RepeatLoopMixin(beginLabel) {} INST_BODY }; // Loop is greedy, deterministic body, lower == 0, upper == inf, follow is irrefutable, no inner groups - struct BeginGreedyLoopNoBacktrackInst : Inst + struct BeginGreedyLoopNoBacktrackInst : Inst, GreedyLoopNoBacktrackMixin { - int loopId; - Label exitLabel; - // exitLabel must always be fixed up - inline BeginGreedyLoopNoBacktrackInst(int loopId) : Inst(BeginGreedyLoopNoBacktrack), loopId(loopId) {} + inline BeginGreedyLoopNoBacktrackInst(int loopId) : Inst(InstTag::BeginGreedyLoopNoBacktrack), GreedyLoopNoBacktrackMixin(loopId) {} INST_BODY }; struct RepeatGreedyLoopNoBacktrackInst : Inst, RepeatLoopMixin { - inline RepeatGreedyLoopNoBacktrackInst(Label beginLabel) : Inst(RepeatGreedyLoopNoBacktrack), RepeatLoopMixin(beginLabel) {} + inline RepeatGreedyLoopNoBacktrackInst(Label beginLabel) : Inst(InstTag::RepeatGreedyLoopNoBacktrack), RepeatLoopMixin(beginLabel) {} INST_BODY }; @@ -1290,7 +1363,7 @@ namespace UnifiedRegex template struct ChompCharInst : Inst, CharMixin { - ChompCharInst(const Char c) : Inst(Mode == ChompMode::Star ? ChompCharStar : ChompCharPlus), CharMixin(c) {} + ChompCharInst(const Char c) : Inst(Mode == ChompMode::Star ? InstTag::ChompCharStar : InstTag::ChompCharPlus), CharMixin(c) {} INST_BODY }; @@ -1299,7 +1372,7 @@ namespace UnifiedRegex struct ChompSetInst : Inst, SetMixin { // set must always be cloned from source - ChompSetInst() : Inst(Mode == ChompMode::Star ? ChompSetStar : ChompSetPlus) {} + ChompSetInst() : Inst(Mode == ChompMode::Star ? InstTag::ChompSetStar : InstTag::ChompSetPlus) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -1309,7 +1382,7 @@ namespace UnifiedRegex struct ChompCharGroupInst : Inst, CharMixin, GroupMixin, NoNeedToSaveMixin { ChompCharGroupInst(const Char c, const int groupId, const bool noNeedToSave) - : Inst(Mode == ChompMode::Star ? ChompCharGroupStar : ChompCharGroupPlus), + : Inst(Mode == ChompMode::Star ? InstTag::ChompCharGroupStar : InstTag::ChompCharGroupPlus), CharMixin(c), GroupMixin(groupId), NoNeedToSaveMixin(noNeedToSave) @@ -1324,7 +1397,7 @@ namespace UnifiedRegex { // set must always be cloned from source ChompSetGroupInst(const int groupId, const bool noNeedToSave) - : Inst(Mode == ChompMode::Star ? ChompSetGroupStar : ChompSetGroupPlus), + : Inst(Mode == ChompMode::Star ? InstTag::ChompSetGroupStar : InstTag::ChompSetGroupPlus), GroupMixin(groupId), NoNeedToSaveMixin(noNeedToSave) { @@ -1336,7 +1409,7 @@ namespace UnifiedRegex struct ChompCharBoundedInst : Inst, CharMixin, ChompBoundedMixin { - inline ChompCharBoundedInst(Char c, const CountDomain& repeats) : Inst(ChompCharBounded), CharMixin(c), ChompBoundedMixin(repeats) {} + inline ChompCharBoundedInst(Char c, const CountDomain& repeats) : Inst(InstTag::ChompCharBounded), CharMixin(c), ChompBoundedMixin(repeats) {} INST_BODY }; @@ -1344,7 +1417,7 @@ namespace UnifiedRegex struct ChompSetBoundedInst : Inst, SetMixin, ChompBoundedMixin { // set must always be cloned from source - inline ChompSetBoundedInst(const CountDomain& repeats) : Inst(ChompSetBounded), ChompBoundedMixin(repeats) {} + inline ChompSetBoundedInst(const CountDomain& repeats) : Inst(InstTag::ChompSetBounded), ChompBoundedMixin(repeats) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -1353,7 +1426,7 @@ namespace UnifiedRegex struct ChompSetBoundedGroupLastCharInst : Inst, SetMixin, ChompBoundedMixin, GroupMixin, NoNeedToSaveMixin { // set must always be cloned from source - inline ChompSetBoundedGroupLastCharInst(const CountDomain& repeats, int groupId, bool noNeedToSave) : Inst(ChompSetBoundedGroupLastChar), ChompBoundedMixin(repeats), GroupMixin(groupId), NoNeedToSaveMixin(noNeedToSave) {} + inline ChompSetBoundedGroupLastCharInst(const CountDomain& repeats, int groupId, bool noNeedToSave) : Inst(InstTag::ChompSetBoundedGroupLastChar), ChompBoundedMixin(repeats), GroupMixin(groupId), NoNeedToSaveMixin(noNeedToSave) {} INST_BODY INST_BODY_FREE(SetMixin) @@ -1366,7 +1439,7 @@ namespace UnifiedRegex struct TryInst : Inst, TryMixin { // failLabel must always be fixed up - inline TryInst() : Inst(Try), TryMixin() {} + inline TryInst() : Inst(InstTag::Try), TryMixin() {} INST_BODY }; @@ -1374,7 +1447,7 @@ namespace UnifiedRegex struct TryIfCharInst : Inst, CharMixin, TryMixin { // failLabel must always be fixed up - inline TryIfCharInst(Char c) : Inst(TryIfChar), CharMixin(c), TryMixin() {} + inline TryIfCharInst(Char c) : Inst(InstTag::TryIfChar), CharMixin(c), TryMixin() {} INST_BODY }; @@ -1382,7 +1455,7 @@ namespace UnifiedRegex struct TryMatchCharInst : Inst, CharMixin, TryMixin { // failLabel must always be fixed up - inline TryMatchCharInst(Char c) : Inst(TryMatchChar), CharMixin(c), TryMixin() {} + inline TryMatchCharInst(Char c) : Inst(InstTag::TryMatchChar), CharMixin(c), TryMixin() {} INST_BODY }; @@ -1391,7 +1464,7 @@ namespace UnifiedRegex { // set is always same as matching BeginLoopIfSetInst set // failLabel must always be fixed up - inline TryIfSetInst() : Inst(TryIfSet), TryMixin() {} + inline TryIfSetInst() : Inst(InstTag::TryIfSet), TryMixin() {} INST_BODY INST_BODY_FREE(SetMixin) @@ -1401,7 +1474,7 @@ namespace UnifiedRegex { // set is always same as matching BeginLoopIfSetInst set // failLabel must always be fixed up - inline TryMatchSetInst() : Inst(TryMatchSet), TryMixin() {} + inline TryMatchSetInst() : Inst(InstTag::TryMatchSet), TryMixin() {} INST_BODY INST_BODY_FREE(SetMixin) @@ -1411,28 +1484,23 @@ namespace UnifiedRegex // User-defined assertions // - struct BeginAssertionInst : Inst, BodyGroupsMixin + struct BeginAssertionInst : Inst, BodyGroupsMixin, NegationMixin, NextLabelMixin { - bool isNegation; - Label nextLabel; - // nextLabel must always be fixed up - inline BeginAssertionInst(bool isNegation, int minBodyGroupId, int maxBodyGroupId) : Inst(BeginAssertion), isNegation(isNegation), BodyGroupsMixin(minBodyGroupId, maxBodyGroupId) - { -#if DBG - nextLabel = (Label)-1; -#endif - } + inline BeginAssertionInst(bool isNegation, int minBodyGroupId, int maxBodyGroupId) + : Inst(InstTag::BeginAssertion), BodyGroupsMixin(minBodyGroupId, maxBodyGroupId), NegationMixin(isNegation), NextLabelMixin() + {} INST_BODY }; struct EndAssertionInst : Inst { - inline EndAssertionInst() : Inst(EndAssertion) {} + inline EndAssertionInst() : Inst(InstTag::EndAssertion) {} INST_BODY }; +#pragma pack(pop) // ---------------------------------------------------------------------- // Matcher state @@ -1508,7 +1576,7 @@ namespace UnifiedRegex struct Cont : protected Chars { - enum ContTag : uint32 + enum class ContTag : uint8 { #define M(O) O, #include "RegexContcodes.h" @@ -1539,7 +1607,7 @@ namespace UnifiedRegex CharCount origInputOffset; Label origInstLabel; - inline ResumeCont(CharCount origInputOffset, Label origInstLabel) : Cont(Resume), origInputOffset(origInputOffset), origInstLabel(origInstLabel) {} + inline ResumeCont(CharCount origInputOffset, Label origInstLabel) : Cont(ContTag::Resume), origInputOffset(origInputOffset), origInstLabel(origInstLabel) {} CONT_BODY }; @@ -1560,7 +1628,7 @@ namespace UnifiedRegex GroupInfo origGroupInfo; RestoreGroupCont(int groupId, const GroupInfo &origGroupInfo) - : Cont(RestoreGroup), groupId(groupId), origGroupInfo(origGroupInfo) + : Cont(ContTag::RestoreGroup), groupId(groupId), origGroupInfo(origGroupInfo) { } @@ -1571,7 +1639,7 @@ namespace UnifiedRegex { const int groupId; - ResetGroupCont(const int groupId) : Cont(ResetGroup), groupId(groupId) {} + ResetGroupCont(const int groupId) : Cont(ContTag::ResetGroup), groupId(groupId) {} CONT_BODY }; @@ -1582,7 +1650,7 @@ namespace UnifiedRegex const int toGroupId; ResetGroupRangeCont(const int fromGroupId, const int toGroupId) - : Cont(ResetGroupRange), fromGroupId(fromGroupId), toGroupId(toGroupId) + : Cont(ContTag::ResetGroupRange), fromGroupId(fromGroupId), toGroupId(toGroupId) { Assert(fromGroupId >= 0); Assert(toGroupId >= 0); @@ -1597,14 +1665,14 @@ namespace UnifiedRegex Label beginLabel; // label of BeginLoop instruction CharCount origInputOffset; // where to go back to - inline RepeatLoopCont(Label beginLabel, CharCount origInputOffset) : Cont(RepeatLoop), beginLabel(beginLabel), origInputOffset(origInputOffset) {} + inline RepeatLoopCont(Label beginLabel, CharCount origInputOffset) : Cont(ContTag::RepeatLoop), beginLabel(beginLabel), origInputOffset(origInputOffset) {} CONT_BODY }; struct PopAssertionCont : Cont { - inline PopAssertionCont() : Cont(PopAssertion) {} + inline PopAssertionCont() : Cont(ContTag::PopAssertion) {} CONT_BODY }; @@ -1614,7 +1682,7 @@ namespace UnifiedRegex Label beginLabel; // label of BeginLoopFixed instruction bool tryingBody; // true if attempting an additional iteration of loop body, otherwise attempting loop follow - inline RewindLoopFixedCont(Label beginLabel, bool tryingBody) : Cont(RewindLoopFixed), beginLabel(beginLabel), tryingBody(tryingBody) {} + inline RewindLoopFixedCont(Label beginLabel, bool tryingBody) : Cont(ContTag::RewindLoopFixed), beginLabel(beginLabel), tryingBody(tryingBody) {} CONT_BODY }; @@ -1623,7 +1691,7 @@ namespace UnifiedRegex { Label beginLabel; // label of LoopSet instruction - inline RewindLoopSetCont(Label beginLabel) : Cont(RewindLoopSet), beginLabel(beginLabel) {} + inline RewindLoopSetCont(Label beginLabel) : Cont(ContTag::RewindLoopSet), beginLabel(beginLabel) {} CONT_BODY }; @@ -1632,7 +1700,7 @@ namespace UnifiedRegex { Label beginLabel; // label of LoopSet instruction - inline RewindLoopSetWithFollowFirstCont(Label beginLabel) : Cont(RewindLoopSetWithFollowFirst), beginLabel(beginLabel) {} + inline RewindLoopSetWithFollowFirstCont(Label beginLabel) : Cont(ContTag::RewindLoopSetWithFollowFirst), beginLabel(beginLabel) {} CONT_BODY }; @@ -1642,7 +1710,7 @@ namespace UnifiedRegex Label beginLabel; // label of BeginLoopFixedGroupLastIteration instruction bool tryingBody; // true if attempting an additional iteration of loop body, otherwise attempting loop follow - inline RewindLoopFixedGroupLastIterationCont(Label beginLabel, bool tryingBody) : Cont(RewindLoopFixedGroupLastIteration), beginLabel(beginLabel), tryingBody(tryingBody) {} + inline RewindLoopFixedGroupLastIterationCont(Label beginLabel, bool tryingBody) : Cont(ContTag::RewindLoopFixedGroupLastIteration), beginLabel(beginLabel), tryingBody(tryingBody) {} CONT_BODY }; @@ -1688,7 +1756,7 @@ namespace UnifiedRegex AssertionStack assertionStack; }; - enum HardFailMode + enum class HardFailMode { BacktrackAndLater, BacktrackOnly, diff --git a/deps/chakrashim/core/lib/Parser/Scan.cpp b/deps/chakrashim/core/lib/Parser/Scan.cpp index 7c7f97c064a..88c978c8e6c 100644 --- a/deps/chakrashim/core/lib/Parser/Scan.cpp +++ b/deps/chakrashim/core/lib/Parser/Scan.cpp @@ -152,12 +152,14 @@ void Scanner::SetText(EncodedCharPtr pszSrc, size_t offset, size m_DeferredParseFlags = ScanFlagNone; } +#if ENABLE_BACKGROUND_PARSING template void Scanner::PrepareForBackgroundParse(Js::ScriptContext *scriptContext) { scriptContext->GetThreadContext()->GetStandardChars((EncodedChar*)0); scriptContext->GetThreadContext()->GetStandardChars((char16*)0); } +#endif //----------------------------------------------------------------------------- // Number of code points from 'first' up to, but not including the next @@ -464,26 +466,6 @@ tokens Scanner::ScanIdentifierContinue(bool identifyKwds, bool f return tkID; } - // During syntax coloring, scanner doesn't need to convert the escape sequence to get actual characters, it just needs the classification information - // So call up hashtables custom method to check if the string scanned is identifier or keyword. - // Do the same for deferred parsing, but use a custom method that only tokenizes JS keywords. - if ((m_DeferredParseFlags & ScanFlagSuppressIdPid) != 0) - { - m_ptoken->SetIdentifier(NULL); - if (!fHasEscape) - { - // If there are no escape, that the main scan loop would have found the keyword already - // So we can just assume it is an ID - DebugOnly(int32 cch = UnescapeToTempBuf(pchMin, p)); - DebugOnly(tokens tk = m_phtbl->TkFromNameLen(m_tempChBuf.m_prgch, cch, IsStrictMode())); - Assert(tk == tkID || (tk == tkYIELD && !this->YieldIsKeyword()) || (tk == tkAWAIT && !this->AwaitIsKeyword())); - return tkID; - } - int32 cch = UnescapeToTempBuf(pchMin, p); - tokens tk = m_phtbl->TkFromNameLen(m_tempChBuf.m_prgch, cch, IsStrictMode()); - return (!this->YieldIsKeyword() && tk == tkYIELD) || (!this->AwaitIsKeyword() && tk == tkAWAIT) ? tkID : tk; - } - // UTF16 Scanner are only for syntax coloring, so it shouldn't come here. if (EncodingPolicy::MultiUnitEncoding && !fHasMultiChar && !fHasEscape) { @@ -492,7 +474,7 @@ tokens Scanner::ScanIdentifierContinue(bool identifyKwds, bool f // If there are no escape, that the main scan loop would have found the keyword already // So we can just assume it is an ID DebugOnly(int32 cch = UnescapeToTempBuf(pchMin, p)); - DebugOnly(tokens tk = m_phtbl->TkFromNameLen(m_tempChBuf.m_prgch, cch, IsStrictMode())); + DebugOnly(tokens tk = Ident::TkFromNameLen(m_tempChBuf.m_prgch, cch, IsStrictMode())); Assert(tk == tkID || (tk == tkYIELD && !this->YieldIsKeyword()) || (tk == tkAWAIT && !this->AwaitIsKeyword())); m_ptoken->SetIdentifier(reinterpret_cast(pchMin), (int32)(p - pchMin)); @@ -505,8 +487,8 @@ tokens Scanner::ScanIdentifierContinue(bool identifyKwds, bool f if (!fHasEscape) { // If it doesn't have escape, then Scan() should have taken care of keywords (except - // yield if this->YieldIsKeyword() is false, in which case yield is treated as an identifier, and except - // await if this->AwaitIsKeyword() is false, in which case await is treated as an identifier). + // yield if m_fYieldIsKeyword is false, in which case yield is treated as an identifier, and except + // await if m_fAwaitIsKeyword is false, in which case await is treated as an identifier). // We don't have to check if the name is reserved word and return it as an Identifier Assert(pid->Tk(IsStrictMode()) == tkID || (pid->Tk(IsStrictMode()) == tkYIELD && !this->YieldIsKeyword()) @@ -584,9 +566,25 @@ typename Scanner::EncodedCharPtr Scanner::FScanN { EncodedCharPtr last = m_pchLast; EncodedCharPtr pchT = nullptr; + bool baseSpecified = false; likelyInt = true; // Reset m_OctOrLeadingZeroOnLastTKNumber = false; + + auto baseSpecifierCheck = [&pchT, &pdbl, p, &baseSpecified]() + { + if (pchT == p + 2) + { + // An octal token '0' was followed by a base specifier: /0[xXoObB]/ + // This literal can no longer be a double + *pdbl = 0; + // Advance the character pointer to the base specifier + pchT = p + 1; + // Set the flag so we know to offset the potential identifier search after the literal + baseSpecified = true; + } + }; + if ('0' == this->PeekFirst(p, last)) { switch(this->PeekFirst(p + 1, last)) @@ -602,37 +600,21 @@ typename Scanner::EncodedCharPtr Scanner::FScanN case 'X': // Hex *pdbl = Js::NumberUtilities::DblFromHex(p + 2, &pchT); - if (pchT == p + 2) - { - // "Octal zero token "0" followed by an identifier token beginning with character 'x'/'X' - *pdbl = 0; - return p + 1; - } - else - return pchT; + baseSpecifierCheck(); + goto LIdCheck; case 'o': case 'O': // Octal *pdbl = Js::NumberUtilities::DblFromOctal(p + 2, &pchT); - if (pchT == p + 2) - { - // "Octal zero token "0" followed by an identifier token beginning with character 'o'/'O' - *pdbl = 0; - return p + 1; - } - return pchT; + baseSpecifierCheck(); + goto LIdCheck; case 'b': case 'B': // Binary *pdbl = Js::NumberUtilities::DblFromBinary(p + 2, &pchT); - if (pchT == p + 2) - { - // "Octal zero token "0" followed by an identifier token beginning with character 'b'/'B' - *pdbl = 0; - return p + 1; - } - return pchT; + baseSpecifierCheck(); + goto LIdCheck; default: // Octal @@ -655,7 +637,7 @@ typename Scanner::EncodedCharPtr Scanner::FScanN m_OctOrLeadingZeroOnLastTKNumber = false; //08... or 09.... goto LFloat; } - return pchT; + goto LIdCheck; } } else @@ -663,105 +645,41 @@ typename Scanner::EncodedCharPtr Scanner::FScanN LFloat: *pdbl = Js::NumberUtilities::StrToDbl(p, &pchT, likelyInt); Assert(pchT == p || !Js::NumberUtilities::IsNan(*pdbl)); - return pchT; + // fall through to LIdCheck } -} -template -BOOL Scanner::oFScanNumber(double *pdbl, bool& likelyInt) -{ - EncodedCharPtr pchT; - m_OctOrLeadingZeroOnLastTKNumber = false; - likelyInt = true; - if ('0' == *m_currentCharacter) +LIdCheck: + // https://tc39.github.io/ecma262/#sec-literals-numeric-literals + // The SourceCharacter immediately following a NumericLiteral must not be an IdentifierStart or DecimalDigit. + // For example : 3in is an error and not the two input elements 3 and in + // If a base was speficied, use the first character denoting the constant. In this case, pchT is pointing to the base specifier. + EncodedCharPtr startingLocation = baseSpecified ? pchT + 1 : pchT; + codepoint_t outChar = *startingLocation; + if (this->IsMultiUnitChar((OLECHAR)outChar)) { - switch (m_currentCharacter[1]) - { - case '.': - case 'e': - case 'E': - likelyInt = false; - // Floating point. - goto LFloat; - - case 'x': - case 'X': - // Hex. - *pdbl = Js::NumberUtilities::DblFromHex(m_currentCharacter + 2, &pchT); - if (pchT == m_currentCharacter + 2) - { - // "Octal zero token "0" followed by an identifier token beginning with character 'x'/'X' - *pdbl = 0; - m_currentCharacter++; - } - else - m_currentCharacter = pchT; - break; - case 'o': - case 'O': - *pdbl = Js::NumberUtilities::DblFromOctal(m_currentCharacter + 2, &pchT); - if (pchT == m_currentCharacter + 2) - { - // "Octal zero token "0" followed by an identifier token beginning with character 'o'/'O' - *pdbl = 0; - m_currentCharacter++; - } - else - m_currentCharacter = pchT; - break; - - case 'b': - case 'B': - *pdbl = Js::NumberUtilities::DblFromBinary(m_currentCharacter + 2, &pchT); - if (pchT == m_currentCharacter + 2) - { - // "Octal zero token "0" followed by an identifier token beginning with character 'b'/'B' - *pdbl = 0; - m_currentCharacter++; - } - else - m_currentCharacter = pchT; - break; - - default: - // Octal. - *pdbl = Js::NumberUtilities::DblFromOctal(m_currentCharacter, &pchT); - Assert(pchT > m_currentCharacter); - - -#if !SOURCERELEASE - // If an octal literal is malformed then it is in fact a decimal literal. -#endif // !SOURCERELEASE - if(*pdbl != 0 || pchT > m_currentCharacter + 1) - m_OctOrLeadingZeroOnLastTKNumber = true; //report as an octal or hex for JSON when leading 0. Just '0' is ok - switch (*pchT) - { - case '8': - case '9': - // case 'e': - // case 'E': - // case '.': - m_OctOrLeadingZeroOnLastTKNumber = false; //08... or 09.... - goto LFloat; - } + outChar = this->template ReadRest((OLECHAR)outChar, startingLocation, last); + } + if (this->charClassifier->IsIdStart(outChar)) + { + Error(ERRIdAfterLit); + } - m_currentCharacter = pchT; - break; + // IsIdStart does not cover the unicode escape case. Try to read a unicode escape from the 'u' char. + if (*pchT == '\\') + { + startingLocation++; // TryReadEscape expects us to point to the 'u', and since it is by reference we need to do it beforehand. + if (TryReadEscape(startingLocation, m_pchLast, &outChar)) + { + Error(ERRIdAfterLit); } } - else - { -LFloat: - // Let StrToDbl do all the work. - *pdbl = Js::NumberUtilities::StrToDbl(m_currentCharacter, &pchT, likelyInt); - if (pchT == m_currentCharacter) - return FALSE; - m_currentCharacter = pchT; - Assert(!Js::NumberUtilities::IsNan(*pdbl)); + if (Js::NumberUtilities::IsDigit(*startingLocation)) + { + Error(ERRbadNumber); } - return TRUE; + return pchT; } template diff --git a/deps/chakrashim/core/lib/Parser/Scan.h b/deps/chakrashim/core/lib/Parser/Scan.h index 44e6823e53e..419b56deb73 100644 --- a/deps/chakrashim/core/lib/Parser/Scan.h +++ b/deps/chakrashim/core/lib/Parser/Scan.h @@ -318,7 +318,6 @@ enum ScanFlag { ScanFlagNone = 0, ScanFlagSuppressStrPid = 1, // Force strings to always have pid - ScanFlagSuppressIdPid = 2 // Force identifiers to always have pid (currently unused) }; typedef HRESULT (*CommentCallback)(void *data, OLECHAR firstChar, OLECHAR secondChar, bool containTypeDef, charcount_t min, charcount_t lim, bool adjacent, bool multiline, charcount_t startLine, charcount_t endLine); @@ -369,15 +368,16 @@ class Scanner : public IScanner, public EncodingPolicy } void Release(void) { - delete this; // invokes overrided operator delete + delete this; // invokes overridden operator delete } tokens Scan(); tokens ScanNoKeywords(); tokens ScanForcingPid(); void SetText(EncodedCharPtr psz, size_t offset, size_t length, charcount_t characterOffset, ULONG grfscr, ULONG lineNumber = 0); +#if ENABLE_BACKGROUND_PARSING void PrepareForBackgroundParse(Js::ScriptContext *scriptContext); - +#endif enum ScanState { ScanStateNormal = 0, @@ -781,7 +781,6 @@ class Scanner : public IScanner, public EncodingPolicy tokens SkipComment(EncodedCharPtr *pp, /* out */ bool* containTypeDef); tokens ScanRegExpConstant(ArenaAllocator* alloc); tokens ScanRegExpConstantNoAST(ArenaAllocator* alloc); - BOOL oFScanNumber(double *pdbl, bool& likelyInt); EncodedCharPtr FScanNumber(EncodedCharPtr p, double *pdbl, bool& likelyInt); IdentPtr PidOfIdentiferAt(EncodedCharPtr p, EncodedCharPtr last, bool fHadEscape, bool fHasMultiChar); IdentPtr PidOfIdentiferAt(EncodedCharPtr p, EncodedCharPtr last); diff --git a/deps/chakrashim/core/lib/Parser/perrors.h b/deps/chakrashim/core/lib/Parser/perrors.h index 5bd02dad69c..a94ede9b51a 100644 --- a/deps/chakrashim/core/lib/Parser/perrors.h +++ b/deps/chakrashim/core/lib/Parser/perrors.h @@ -22,6 +22,7 @@ LSC_ERROR_MSG( 1013, ERRbadNumber , "Invalid number") LSC_ERROR_MSG( 1014, ERRillegalChar , "Invalid character") LSC_ERROR_MSG( 1015, ERRnoStrEnd , "Unterminated string constant") LSC_ERROR_MSG( 1016, ERRnoCmtEnd , "Unterminated comment") +LSC_ERROR_MSG( 1017, ERRIdAfterLit , "Unexpected identifier after numeric literal") LSC_ERROR_MSG( 1018, ERRbadReturn , "'return' statement outside of function") LSC_ERROR_MSG( 1019, ERRbadBreak , "Can't have 'break' outside of loop") diff --git a/deps/chakrashim/core/lib/Parser/ptlist.h b/deps/chakrashim/core/lib/Parser/ptlist.h index 65cd46a6a58..c2605724c2f 100644 --- a/deps/chakrashim/core/lib/Parser/ptlist.h +++ b/deps/chakrashim/core/lib/Parser/ptlist.h @@ -140,7 +140,6 @@ PTNODE(knopStrTemplate, "``" , Nop , StrTemplate , fnopNone PTNODE(knopWith , "with" , Nop , With , fnopNotExprStmt , "WithStmt" ) PTNODE(knopBreak , "break" , Nop , Jump , fnopNotExprStmt , "BreakStmt" ) PTNODE(knopContinue , "continue" , Nop , Jump , fnopNotExprStmt , "ContinueStmt" ) -PTNODE(knopLabel , "label" , Nop , Label , fnopNotExprStmt , "LabelDecl" ) PTNODE(knopSwitch , "switch" , Nop , Switch , fnopNotExprStmt|fnopBreak, "SwitchStmt" ) PTNODE(knopCase , "case" , Nop , Case , fnopNotExprStmt , "CaseStmt" ) PTNODE(knopTryCatch , "try-catch" , Nop , TryCatch , fnopNotExprStmt , "TryCatchStmt" ) diff --git a/deps/chakrashim/core/lib/Parser/ptree.h b/deps/chakrashim/core/lib/Parser/ptree.h index 915851c1e48..3954dd4056e 100644 --- a/deps/chakrashim/core/lib/Parser/ptree.h +++ b/deps/chakrashim/core/lib/Parser/ptree.h @@ -146,12 +146,6 @@ struct PnVar } }; -struct PnLabel -{ - IdentPtr pid; - ParseNodePtr pnodeNext; -}; - struct PnArrLit : PnUni { uint count; @@ -673,7 +667,6 @@ struct ParseNode PnIf sxIf; // if PnInt sxInt; // integer constant PnJump sxJump; // break and continue - PnLabel sxLabel; // label nodes PnLoop sxLoop; // base for loop nodes PnModule sxModule; // global module PnParamPattern sxParamPattern; // Destructure pattern for function/catch parameter @@ -723,7 +716,7 @@ struct ParseNode BOOL IsStatement() { - return (nop >= knopList && nop != knopLabel) || ((Grfnop(nop) & fnopAsg) != 0); + return nop >= knopList || ((Grfnop(nop) & fnopAsg) != 0); } uint Grfnop(void) @@ -767,6 +760,11 @@ struct ParseNode bool IsSpecialName() { return isSpecialName; } void SetIsSpecialName() { isSpecialName = true; } + bool IsUserIdentifier() const + { + return this->nop == knopName && !this->isSpecialName; + } + bool IsVarLetOrConst() const { return this->nop == knopVarDecl || this->nop == knopLetDecl || this->nop == knopConstDecl; @@ -817,7 +815,6 @@ const int kcbPnHelperCall3 = kcbPnNone + sizeof(PnHelperCall2); const int kcbPnIf = kcbPnNone + sizeof(PnIf); const int kcbPnInt = kcbPnNone + sizeof(PnInt); const int kcbPnJump = kcbPnNone + sizeof(PnJump); -const int kcbPnLabel = kcbPnNone + sizeof(PnLabel); const int kcbPnModule = kcbPnNone + sizeof(PnModule); const int kcbPnParamPattern = kcbPnNone + sizeof(PnParamPattern); const int kcbPnPid = kcbPnNone + sizeof(PnPid); diff --git a/deps/chakrashim/core/lib/Parser/rterrors.h b/deps/chakrashim/core/lib/Parser/rterrors.h index 60f5297e119..1527be8fff5 100644 --- a/deps/chakrashim/core/lib/Parser/rterrors.h +++ b/deps/chakrashim/core/lib/Parser/rterrors.h @@ -369,10 +369,14 @@ RT_ERROR_MSG(JSERR_FatalMemoryExhaustion, 5669, "", "Encountered a non-recoverab RT_ERROR_MSG(JSERR_OutOfBoundString, 5670, "", "String length is out of bound", kjstRangeError, 0) RT_ERROR_MSG(JSERR_InvalidIterableObject, 5671, "%s : Invalid iterable object", "Invalid iterable object", kjstTypeError, 0) RT_ERROR_MSG(JSERR_InvalidIteratorObject, 5672, "%s : Invalid iterator object", "Invalid iterator object", kjstTypeError, 0) +RT_ERROR_MSG(JSERR_NoAccessors, 5673, "Invalid property descriptor: accessors not supported on this object", "", kjstTypeError, 0) //Host errors RT_ERROR_MSG(JSERR_HostMaybeMissingPromiseContinuationCallback, 5700, "", "Host may not have set any promise continuation callback. Promises may not be executed.", kjstTypeError, 0) +// Built In functions Errors +RT_ERROR_MSG(JSERR_BuiltInNotAvailable, 5800, "", "Built In functions are not available.", kjstTypeError, 0) + // WebAssembly Errors RT_ERROR_MSG(WASMERR_WasmCompileError, 7000, "%s", "Compilation failed.", kjstWebAssemblyCompileError, 0) RT_ERROR_MSG(WASMERR_Unreachable, 7001, "", "Unreachable Code", kjstWebAssemblyRuntimeError, 0) diff --git a/deps/chakrashim/core/lib/Runtime/Base/CMakeLists.txt b/deps/chakrashim/core/lib/Runtime/Base/CMakeLists.txt index 220b4c97cb1..0a9523ddc64 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/CMakeLists.txt +++ b/deps/chakrashim/core/lib/Runtime/Base/CMakeLists.txt @@ -10,8 +10,10 @@ add_library (Chakra.Runtime.Base OBJECT Exception.cpp ExpirableObject.cpp FunctionBody.cpp + FunctionExecutionStateMachine.cpp FunctionInfo.cpp LeaveScriptObject.cpp + LineOffsetCache.cpp PerfHint.cpp PropertyRecord.cpp RuntimeBasePch.cpp @@ -19,6 +21,7 @@ add_library (Chakra.Runtime.Base OBJECT ScriptContextOptimizationOverrideInfo.cpp ScriptContextProfiler.cpp ScriptMemoryDumper.cpp + SourceContextInfo.cpp SourceHolder.cpp StackProber.cpp TempArenaAllocatorObject.cpp diff --git a/deps/chakrashim/core/lib/Runtime/Base/CallInfo.cpp b/deps/chakrashim/core/lib/Runtime/Base/CallInfo.cpp index 0b02ccf03f8..ad389e3ead9 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/CallInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/CallInfo.cpp @@ -9,4 +9,40 @@ namespace Js const ushort CallInfo::ksizeofCount = 24; const ushort CallInfo::ksizeofCallFlags = 8; const uint CallInfo::kMaxCountArgs = (1 << ksizeofCount) - 1 ; + + // For Eval calls the FrameDisplay is passed in as an extra argument. + // This is not counted in Info.Count. Use this API to get the updated count. + ArgSlot CallInfo::GetArgCountWithExtraArgs(CallFlags flags, uint count) + { + AssertOrFailFastMsg(count < Constants::UShortMaxValue - 1, "ArgList too large"); + ArgSlot argSlotCount = (ArgSlot)count; + if (flags & CallFlags_ExtraArg) + { + argSlotCount++; + } + return argSlotCount; + } + + uint CallInfo::GetLargeArgCountWithExtraArgs(CallFlags flags, uint count) + { + if (flags & CallFlags_ExtraArg) + { + UInt32Math::Inc(count); + } + return count; + } + + ArgSlot CallInfo::GetArgCountWithoutExtraArgs(CallFlags flags, ArgSlot count) + { + ArgSlot newCount = count; + if (flags & Js::CallFlags_ExtraArg) + { + if (count == 0) + { + ::Math::DefaultOverflowPolicy(); + } + newCount = count - 1; + } + return newCount; + } } diff --git a/deps/chakrashim/core/lib/Runtime/Base/CallInfo.h b/deps/chakrashim/core/lib/Runtime/Base/CallInfo.h index e5338a815fa..1f0d77d5a00 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/CallInfo.h +++ b/deps/chakrashim/core/lib/Runtime/Base/CallInfo.h @@ -29,28 +29,97 @@ namespace Js * to pass this object by reference. Interpreter stack setup code expects * CallInfo to be passed by value. */ - explicit CallInfo(ushort count) + explicit CallInfo(ArgSlot count) : Flags(CallFlags_None) , Count(count) #ifdef TARGET_64 , unused(0) #endif { + // Keeping this version to avoid the assert } - CallInfo(CallFlags flags, ushort count) + // The bool is used to avoid the signature confusion between the ArgSlot and uint version of the constructor + explicit CallInfo(uint count, bool unusedBool) + : Flags(CallFlags_None) + , Count(count) +#ifdef TARGET_64 + , unused(0) +#endif + { + AssertOrFailFastMsg(count < CallInfo::kMaxCountArgs, "Argument list too large"); + } + + CallInfo(CallFlags flags, ArgSlot count) : Flags(flags) , Count(count) #ifdef TARGET_64 , unused(0) #endif { + // Keeping this version to avoid the assert + } + + // The bool is used to avoid the signature confusion between the ArgSlot and uint version of the constructor + CallInfo(CallFlags flags, uint count, bool unusedBool) + : Flags(flags) + , Count(count) +#ifdef TARGET_64 + , unused(0) +#endif + { + AssertOrFailFastMsg(count < CallInfo::kMaxCountArgs, "Argument list too large"); } CallInfo(VirtualTableInfoCtorEnum v) { } + ArgSlot GetArgCountWithExtraArgs() const + { + return CallInfo::GetArgCountWithExtraArgs(this->Flags, this->Count); + } + + uint GetLargeArgCountWithExtraArgs() const + { + return CallInfo::GetLargeArgCountWithExtraArgs(this->Flags, this->Count); + } + + bool HasExtraArg() const + { + return (this->Flags & CallFlags_ExtraArg) || this->HasNewTarget(); + } + + bool HasNewTarget() const + { + return CallInfo::HasNewTarget(this->Flags); + } + + static ArgSlot GetArgCountWithExtraArgs(CallFlags flags, uint count); + + static uint GetLargeArgCountWithExtraArgs(CallFlags flags, uint count); + + static ArgSlot GetArgCountWithoutExtraArgs(CallFlags flags, ArgSlot count); + + static bool HasNewTarget(CallFlags flags) + { + return (flags & CallFlags_NewTarget) == CallFlags_NewTarget; + } + + // New target value is passed as an extra argument which is nto included in the Count + static Var GetNewTarget(CallFlags flag, Var* values, ArgSlot count) + { + if (HasNewTarget(flag)) + { + return values[count]; + } + else + { + AssertOrFailFast(count > 0); + return values[0]; + } + } + // Assumes big-endian layout // If the size of the count is changed, change should happen at following places also // - scriptdirect.idl @@ -72,16 +141,6 @@ namespace Js static const ushort ksizeofCount; static const ushort ksizeofCallFlags; static const uint kMaxCountArgs; - - static bool isDirectEvalCall(CallFlags flags) - { - // This was recognized as an eval call at compile time. The last one or two args are internal to us. - // Argcount will be one of the following when called from global code - // - eval("...") : argcount 3 : this, evalString, frameDisplay - // - eval.call("..."): argcount 2 : this(which is string) , frameDisplay - - return (flags & (CallFlags_ExtraArg | CallFlags_NewTarget)) == CallFlags_ExtraArg; // ExtraArg == 1 && NewTarget == 0 - } }; struct InlineeCallInfo diff --git a/deps/chakrashim/core/lib/Runtime/Base/Chakra.Runtime.Base.vcxproj b/deps/chakrashim/core/lib/Runtime/Base/Chakra.Runtime.Base.vcxproj index 1f0735255de..4cbb8a4672a 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/Chakra.Runtime.Base.vcxproj +++ b/deps/chakrashim/core/lib/Runtime/Base/Chakra.Runtime.Base.vcxproj @@ -49,13 +49,16 @@ + + + @@ -94,9 +97,11 @@ + + @@ -107,6 +112,7 @@ + diff --git a/deps/chakrashim/core/lib/Runtime/Base/Constants.h b/deps/chakrashim/core/lib/Runtime/Base/Constants.h index c22b7d89e09..421ded80c6a 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/Constants.h +++ b/deps/chakrashim/core/lib/Runtime/Base/Constants.h @@ -4,7 +4,7 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 # define WIN64_STACK_FACTOR 3 #else # define WIN64_STACK_FACTOR 1 @@ -18,6 +18,8 @@ namespace Js // Id of the NoContextSourceContextInfo static const uint NoSourceContext = (uint)-1; // Variable indicating no source context cookie was passed in by the host- indicates Dynamic Script + static const uint JsBuiltInSourceContextId = (uint)-2; + static const DWORD_PTR JsBuiltInSourceContext = (DWORD_PTR)-2; static const DWORD_PTR NoHostSourceContext = (DWORD_PTR)-1; static const DWORD_PTR FunctionBodyUnavailable = (DWORD_PTR)NULL; // Not a valid Var static const LocalFunctionId NoFunctionId = (LocalFunctionId)-1; @@ -111,10 +113,10 @@ namespace Js static const unsigned MinStackDefault = 1 * 0x0400 * WIN64_STACK_FACTOR; static const unsigned ExtraStack = 2 * 0x0400 * WIN64_STACK_FACTOR; -#if _M_IX86_OR_ARM32 +#if TARGET_32 static const unsigned MaxThreadJITCodeHeapSize = 28 * 1024 * 1024; static const unsigned MaxProcessJITCodeHeapSize = 55 * 1024 * 1024; -#elif _M_X64_OR_ARM64 +#elif TARGET_64 // larger address space means we can keep this higher on 64 bit architectures static const unsigned MaxThreadJITCodeHeapSize = 800 * 1024 * 1024; static const unsigned MaxProcessJITCodeHeapSize = 1024 * 1024 * 1024; @@ -155,14 +157,17 @@ namespace Js static const char16 StringReplace[]; static const char16 StringMatch[]; - static const size_t AnonymousFunctionLength = _countof(_u("Anonymous function")) - 1; - static const size_t AnonymousLength = _countof(_u("anonymous")) - 1; - static const size_t AnonymousClassLength = _countof(_u("Anonymous class")) - 1; - static const size_t FunctionCodeLength = _countof(_u("Function code")) - 1; - static const size_t GlobalFunctionLength = _countof(_u("glo")) - 1; - static const size_t GlobalCodeLength = _countof(_u("Global code")) - 1; - static const size_t EvalCodeLength = _countof(_u("eval code")) - 1; - static const size_t UnknownScriptCodeLength = _countof(_u("Unknown script code")) - 1; + static const charcount_t AnonymousFunctionLength = _countof(_u("Anonymous function")) - 1; + static const charcount_t AnonymousLength = _countof(_u("anonymous")) - 1; + static const charcount_t AnonymousClassLength = _countof(_u("Anonymous class")) - 1; + static const charcount_t FunctionCodeLength = _countof(_u("Function code")) - 1; + static const charcount_t GlobalFunctionLength = _countof(_u("glo")) - 1; + static const charcount_t GlobalCodeLength = _countof(_u("Global code")) - 1; + static const charcount_t EvalCodeLength = _countof(_u("eval code")) - 1; + static const charcount_t UnknownScriptCodeLength = _countof(_u("Unknown script code")) - 1; + static const charcount_t NullStringLength = _countof(_u("Null")) - 1; + static const charcount_t TrueStringLength = _countof(_u("True")) - 1; + static const charcount_t FalseStringLength = _countof(_u("False")) - 1; }; extern const FrameDisplay NullFrameDisplay; diff --git a/deps/chakrashim/core/lib/Runtime/Base/CrossSite.cpp b/deps/chakrashim/core/lib/Runtime/Base/CrossSite.cpp index ff386d7eb91..db1da4fdfb5 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/CrossSite.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/CrossSite.cpp @@ -28,14 +28,14 @@ namespace Js { return FALSE; } - RecyclableObject * object = RecyclableObject::FromVar(instance); + RecyclableObject * object = RecyclableObject::UnsafeFromVar(instance); if (object->GetScriptContext() == requestContext) { return FALSE; } if (DynamicType::Is(object->GetTypeId())) { - return !DynamicObject::FromVar(object)->IsCrossSiteObject() && !object->IsExternal(); + return !DynamicObject::UnsafeFromVar(object)->IsCrossSiteObject() && !object->IsExternal(); } return TRUE; } @@ -159,7 +159,7 @@ namespace Js { return value; } - Js::RecyclableObject* object = RecyclableObject::FromVar(value); + Js::RecyclableObject* object = RecyclableObject::UnsafeFromVar(value); if (fRequestWrapper || scriptContext != object->GetScriptContext()) { return MarshalVarInner(scriptContext, object, fRequestWrapper); @@ -343,7 +343,7 @@ namespace Js TTD_XSITE_LOG(callable->GetScriptContext(), "DefaultOrProfileThunk", callable); #ifdef ENABLE_WASM - if (AsmJsScriptFunction::IsWasmScriptFunction(function)) + if (WasmScriptFunction::Is(function)) { AsmJsFunctionInfo* asmInfo = funcInfo->GetFunctionBody()->GetAsmJsFunctionInfo(); Assert(asmInfo); @@ -465,20 +465,20 @@ namespace Js if (args.Values[0] == nullptr) { i = 1; - Assert(args.Info.Flags & CallFlags_New); + Assert(args.IsNewCall()); Assert(JavascriptProxy::Is(function) || (JavascriptFunction::Is(function) && JavascriptFunction::FromVar(function)->GetFunctionInfo()->GetAttributes() & FunctionInfo::SkipDefaultNewObject)); } uint count = args.Info.Count; - if ((args.Info.Flags & CallFlags_ExtraArg) && ((args.Info.Flags & CallFlags_NewTarget) == 0)) - { - // The final eval arg is a frame display that needs to be marshaled specially. - args.Values[count-1] = CrossSite::MarshalFrameDisplay(targetScriptContext, (FrameDisplay*)args.Values[count-1]); - count--; - } for (; i < count; i++) { args.Values[i] = CrossSite::MarshalVar(targetScriptContext, args.Values[i]); } + if (args.HasExtraArg()) + { + // The final eval arg is a frame display that needs to be marshaled specially. + args.Values[count] = CrossSite::MarshalFrameDisplay(targetScriptContext, args.GetFrameDisplay()); + } + #if ENABLE_NATIVE_CODEGEN CheckCodeGenFunction checkCodeGenFunction = GetCheckCodeGenFunction(entryPoint); @@ -570,7 +570,7 @@ namespace Js } while (DynamicType::Is(object->GetTypeId()) && !JavascriptProxy::Is(object)) { - DynamicObject* dynamicObject = DynamicObject::FromVar(object); + DynamicObject* dynamicObject = DynamicObject::UnsafeFromVar(object); if (!dynamicObject->IsCrossSiteObject() && !dynamicObject->IsExternal()) { // force to install cross-site thunk on prototype objects. diff --git a/deps/chakrashim/core/lib/Runtime/Base/EtwTrace.cpp b/deps/chakrashim/core/lib/Runtime/Base/EtwTrace.cpp index fddc82e1993..ce4b50cccad 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/EtwTrace.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/EtwTrace.cpp @@ -10,6 +10,7 @@ using namespace Js; +#ifndef ENABLE_JS_LTTNG // // This C style callback is invoked by ETW when a trace session is started/stopped // by an ETW controller for the Jscript and MSHTML providers. @@ -47,6 +48,7 @@ void EtwCallbackApi::OnSessionChange(ULONG controlCode, PVOID callbackContext) } } } +#endif // // Registers the ETW provider - this is usually done on Jscript DLL load @@ -54,7 +56,9 @@ void EtwCallbackApi::OnSessionChange(ULONG controlCode, PVOID callbackContext) // void EtwTrace::Register() { +#ifndef ENABLE_JS_LTTNG EtwTraceCore::Register(); +#endif #ifdef TEST_ETW_EVENTS TestEtwEventSink::Load(); @@ -66,8 +70,10 @@ void EtwTrace::Register() // void EtwTrace::UnRegister() { +#ifndef ENABLE_JS_LTTNG EtwTraceCore::UnRegister(); - +#endif + #ifdef TEST_ETW_EVENTS TestEtwEventSink::Unload(); #endif diff --git a/deps/chakrashim/core/lib/Runtime/Base/FunctionBody.cpp b/deps/chakrashim/core/lib/Runtime/Base/FunctionBody.cpp index 8d38f7fe336..7845196762c 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/FunctionBody.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/FunctionBody.cpp @@ -21,8 +21,10 @@ #endif #include "Language/SourceDynamicProfileManager.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/ProbeContainer.h" #include "Debug/DebugContext.h" +#endif #include "Parser.h" #include "RegexCommon.h" @@ -109,10 +111,12 @@ namespace Js return nullptr; } -#if DBG && ENABLE_NATIVE_CODEGEN +#if DBG && ENABLE_NATIVE_CODEGEN && defined(_WIN32) // the lock for work item queue should not be locked while accessing AuxPtrs in background thread auto jobProcessor = this->GetScriptContext()->GetThreadContext()->GetJobProcessor(); auto jobProcessorCS = jobProcessor->GetCriticalSection(); + + // ->IsLocked is not supported on xplat Assert(!jobProcessorCS || !jobProcessor->ProcessesInBackground() || !jobProcessorCS->IsLocked()); #endif @@ -199,8 +203,10 @@ namespace Js void ParseableFunctionInfo::RegisterFuncToDiag(ScriptContext * scriptContext, char16 const * pszTitle) { +#ifdef ENABLE_SCRIPT_DEBUGGING // Register the function to the PDM as eval code (the debugger app will show file as 'eval code') scriptContext->GetDebugContext()->RegisterFunction(this, pszTitle); +#endif } bool ParseableFunctionInfo::IsES6ModuleCode() const @@ -499,8 +505,6 @@ namespace Js hasCachedScopePropIds(false), m_argUsedForBranch(0), m_envDepth((uint16)-1), - interpretedCount(0), - lastInterpretedCount(0), loopInterpreterLimit(CONFIG_FLAG(LoopInterpretCount)), savedPolymorphicCacheState(0), debuggerScopeIndex(0), @@ -546,16 +550,6 @@ namespace Js m_constTable(nullptr), inlineCaches(nullptr), cacheIdToPropertyIdMap(nullptr), - executionMode(ExecutionMode::Interpreter), - interpreterLimit(0), - autoProfilingInterpreter0Limit(0), - profilingInterpreter0Limit(0), - autoProfilingInterpreter1Limit(0), - simpleJitLimit(0), - profilingInterpreter1Limit(0), - fullJitThreshold(0), - fullJitRequeueThreshold(0), - committedProfiledIterations(0), wasCalledFromLoop(false), hasScopeObject(false), hasNestedLoop(false), @@ -585,7 +579,6 @@ namespace Js , m_canDoStackNestedFunc(false) , m_inlineCacheTypes(nullptr) , m_iProfileSession(-1) - , initializedExecutionModeAndLimits(false) #endif #if ENABLE_DEBUG_CONFIG_OPTIONS , regAllocLoadCount(0) @@ -641,8 +634,6 @@ namespace Js hasCachedScopePropIds(false), m_argUsedForBranch(0), m_envDepth((uint16)-1), - interpretedCount(0), - lastInterpretedCount(0), loopInterpreterLimit(CONFIG_FLAG(LoopInterpretCount)), savedPolymorphicCacheState(0), debuggerScopeIndex(0), @@ -688,16 +679,6 @@ namespace Js m_constTable(nullptr), inlineCaches(nullptr), cacheIdToPropertyIdMap(nullptr), - executionMode(ExecutionMode::Interpreter), - interpreterLimit(0), - autoProfilingInterpreter0Limit(0), - profilingInterpreter0Limit(0), - autoProfilingInterpreter1Limit(0), - simpleJitLimit(0), - profilingInterpreter1Limit(0), - fullJitThreshold(0), - fullJitRequeueThreshold(0), - committedProfiledIterations(0), wasCalledFromLoop(false), hasScopeObject(false), hasNestedLoop(false), @@ -727,7 +708,6 @@ namespace Js , m_canDoStackNestedFunc(false) , m_inlineCacheTypes(nullptr) , m_iProfileSession(-1) - , initializedExecutionModeAndLimits(false) #endif #if ENABLE_DEBUG_CONFIG_OPTIONS , regAllocLoadCount(0) @@ -770,12 +750,12 @@ namespace Js bool FunctionBody::InterpretedSinceCallCountCollection() const { - return this->interpretedCount != this->lastInterpretedCount; + return executionState.InterpretedSinceCallCountCollection(); } void FunctionBody::CollectInterpretedCounts() { - this->lastInterpretedCount = this->interpretedCount; + executionState.CollectInterpretedCounts(); } void FunctionBody::IncrInactiveCount(uint increment) @@ -969,7 +949,7 @@ namespace Js this->MapFunctionObjectTypes([&](ScriptFunctionType* functionType) { Assert(functionType->GetTypeId() == TypeIds_Function); - + if (!CrossSite::IsThunk(functionType->GetEntryPoint())) { functionType->SetEntryPoint(GetScriptContext()->DeferredParsingThunk); @@ -1154,6 +1134,13 @@ namespace Js void FunctionBody::SetOutParamMaxDepth(RegSlot cOutParamsDepth) { +#if _M_X64 + const RegSlot minAsmJsOutParams = MinAsmJsOutParams(); + if (GetIsAsmJsFunction() && cOutParamsDepth < minAsmJsOutParams) + { + cOutParamsDepth = minAsmJsOutParams; + } +#endif SetCountField(CounterFields::OutParamMaxDepth, cOutParamsDepth); } @@ -1609,8 +1596,8 @@ namespace Js m_tag21(true), m_isMethod(false) #if DBG - ,m_wasEverAsmjsMode(false) - ,scopeObjectSize(0) + ,m_wasEverAsmjsMode(false) + ,scopeObjectSize(0) #endif { this->functionInfo = RecyclerNew(scriptContext->GetRecycler(), FunctionInfo, entryPoint, attributes, functionId, this); @@ -1660,7 +1647,7 @@ namespace Js m_isMethod(proxy->IsMethod()), m_tag21(true) #if DBG - ,m_wasEverAsmjsMode(proxy->m_wasEverAsmjsMode) + , m_wasEverAsmjsMode(proxy->m_wasEverAsmjsMode) #endif { FunctionInfo * functionInfo = proxy->GetFunctionInfo(); @@ -2171,7 +2158,12 @@ namespace Js case VBSERR_OutOfStack: hrMapped = VBSERR_OutOfStack; break; + + case JSERR_AsmJsCompileError: + hrMapped = JSERR_AsmJsCompileError; + break; } + } if (FAILED(hrMapped)) @@ -2205,7 +2197,7 @@ namespace Js { AutoRestoreFunctionInfo autoRestoreFunctionInfo(this, DefaultEntryThunk); - + // If m_hasBeenParsed = true, one of the following things happened things happened: // - We had multiple function objects which were all defer-parsed, but with the same function body and one of them @@ -2374,7 +2366,8 @@ namespace Js if (FAILED(hrParser)) { hrParseCodeGen = MapDeferredReparseError(hrParser, se); // Map certain errors like OOM/SOE - AssertMsg(FAILED(hrParseCodeGen) && SUCCEEDED(hrParser), "Syntax errors should never be detected on deferred re-parse"); + AssertMsg(hrParseCodeGen == JSERR_AsmJsCompileError // AsmJsCompileError is not a syntax error + || (FAILED(hrParseCodeGen) && SUCCEEDED(hrParser)), "Syntax errors should never be detected on deferred re-parse"); } else { @@ -2591,6 +2584,7 @@ namespace Js return GetIsGlobalFunc() && !(flags & fscrGlobalCode); } +#ifdef NTBUILD bool ParseableFunctionInfo::GetExternalDisplaySourceName(BSTR* sourceName) { Assert(sourceName); @@ -2603,6 +2597,7 @@ namespace Js *sourceName = ::SysAllocString(GetSourceName()); return *sourceName != nullptr; } +#endif const char16* FunctionProxy::WrapWithBrackets(const char16* name, charcount_t sz, ScriptContext* scriptContext) { @@ -3073,7 +3068,7 @@ namespace Js bool FunctionBody::GetLineCharOffsetFromStartChar(int startCharOfStatement, ULONG* _line, LONG* _charOffset, bool canAllocateLineCache /*= true*/) { - Assert(!this->GetUtf8SourceInfo()->GetIsLibraryCode()); + Assert(!this->GetUtf8SourceInfo()->GetIsLibraryCode() || this->IsJsBuiltInCode()); // The following adjusts for where the script is within the document ULONG line = this->GetHostStartLine(); @@ -3413,10 +3408,6 @@ namespace Js // and dynamic profile collection is enabled return !this->m_isFromNativeCodeModule && - !this->m_isAsmJsFunction && -#ifdef ASMJS_PLAT - !this->GetAsmJsModuleInfo() && -#endif !this->HasExecutionDynamicProfileInfo() && DynamicProfileInfo::IsEnabled(this); } @@ -3444,7 +3435,7 @@ namespace Js #if ENABLE_NATIVE_CODEGEN JavascriptMethod originalEntryPoint = this->GetOriginalEntryPoint_Unchecked(); return -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) ( #if ENABLE_OOP_NATIVE_CODEGEN JITManager::GetJITManager()->IsOOPJITEnabled() @@ -3858,7 +3849,7 @@ namespace Js SetByteCodeInLoopCount(byteCodeInLoopCount); SetByteCodeWithoutLDACount(byteCodeWithoutLDACount); - InitializeExecutionModeAndLimits(); + executionState.InitializeExecutionModeAndLimits(this); this->SetAuxiliaryData(auxBlock); this->SetAuxiliaryContextData(auxContextBlock); @@ -3897,6 +3888,7 @@ namespace Js return loopNum; } +#ifdef ENABLE_SCRIPT_DEBUGGING bool FunctionBody::InstallProbe(int offset) { if (offset < 0 || ((uint)offset + 1) >= byteCodeBlock->GetLength()) @@ -3973,6 +3965,7 @@ namespace Js return false; } } +#endif void FunctionBody::SetStackNestedFuncParent(FunctionInfo * parentFunctionInfo) { @@ -4418,26 +4411,29 @@ namespace Js GetLineCharOffsetFromStartChar(cchStartOffset, &line, &col, false /*canAllocateLineCache*/); - WORD color = 0; - if (Js::Configuration::Global.flags.DumpLineNoInColor) + if (sourceInfo->GetSourceHolder() != ISourceHolder::GetEmptySourceHolder()) { - color = Output::SetConsoleForeground(12); - } - Output::Print(_u("\n\n Line %3d: "), line + 1); - // Need to match up cchStartOffset to appropriate cbStartOffset given function's cbStartOffset and cchStartOffset - size_t i = utf8::CharacterIndexToByteIndex(source, sourceInfo->GetCbLength(), cchStartOffset, this->m_cbStartOffset, this->m_cchStartOffset); + WORD color = 0; + if (Js::Configuration::Global.flags.DumpLineNoInColor) + { + color = Output::SetConsoleForeground(12); + } + Output::Print(_u("\n\n Line %3d: "), line + 1); + // Need to match up cchStartOffset to appropriate cbStartOffset given function's cbStartOffset and cchStartOffset + size_t i = utf8::CharacterIndexToByteIndex(source, sourceInfo->GetCbLength(), cchStartOffset, this->m_cbStartOffset, this->m_cchStartOffset); - size_t lastOffset = StartOffset() + LengthInBytes(); - for (;i < lastOffset && source[i] != '\n' && source[i] != '\r'; i++) - { - Output::Print(_u("%C"), source[i]); - } - Output::Print(_u("\n")); - Output::Print(_u(" Col %4d:%s^\n"), col + 1, ((col+1)<10000) ? _u(" ") : _u("")); + size_t lastOffset = StartOffset() + LengthInBytes(); + for (;i < lastOffset && source[i] != '\n' && source[i] != '\r'; i++) + { + Output::Print(_u("%C"), source[i]); + } + Output::Print(_u("\n")); + Output::Print(_u(" Col %4d:%s^\n"), col + 1, ((col+1)<10000) ? _u(" ") : _u("")); - if (color != 0) - { - Output::SetConsoleForeground(color); + if (color != 0) + { + Output::SetConsoleForeground(color); + } } } #endif // DBG_DUMP @@ -4917,6 +4913,7 @@ namespace Js this->SetAuxiliaryData(nullptr); this->SetAuxiliaryContextData(nullptr); + AssertMsg(!this->byteCodeBlock || !this->IsWasmFunction(), "We should never reset the bytecode block for Wasm"); this->byteCodeBlock = nullptr; this->SetLoopHeaderArray(nullptr); this->SetConstTable(nullptr); @@ -4946,7 +4943,31 @@ namespace Js this->SetByteCodeInLoopCount(0); #if ENABLE_PROFILE_INFO - this->dynamicProfileInfo = nullptr; + if (this->dynamicProfileInfo != nullptr) + { + SourceContextInfo * sourceContextInfo = GetSourceContextInfo(); + if(sourceContextInfo && sourceContextInfo->sourceDynamicProfileManager) + { + sourceContextInfo->sourceDynamicProfileManager->RemoveDynamicProfileInfo(GetFunctionInfo()->GetLocalFunctionId()); + } + +#ifdef DYNAMIC_PROFILE_STORAGE + DynamicProfileInfoList * profileInfoList = GetScriptContext()->GetProfileInfoList(); + if (profileInfoList) + { + FOREACH_SLISTBASE_ENTRY_EDITING(Field(DynamicProfileInfo*), info, profileInfoList, iter) + { + if (info->HasFunctionBody() && info->GetFunctionBody() == this) + { + iter.UnlinkCurrent(); + break; + } + } + NEXT_SLISTBASE_ENTRY_EDITING; + } +#endif + this->dynamicProfileInfo = nullptr; + } #endif this->hasExecutionDynamicProfileInfo = false; @@ -4976,7 +4997,7 @@ namespace Js this->SetPolymorphicCallSiteInfoHead(nullptr); #endif - this->SetInterpretedCount(0); + this->executionState.SetInterpretedCount(0); this->m_hasDoneAllNonLocalReferenced = false; @@ -5036,6 +5057,7 @@ namespace Js this->m_isAsmJsFunction = false; } +#ifdef ENABLE_SCRIPT_DEBUGGING void FunctionBody::SetEntryToDeferParseForDebugger() { ProxyEntryPointInfo* defaultEntryPointInfo = this->GetDefaultEntryPointInfo(); @@ -5076,6 +5098,7 @@ namespace Js this->UnlockCounters(); // asuming background jit is stopped and allow the counter setters access again #endif } +#endif void FunctionBody::ClearEntryPoints() { @@ -5418,7 +5441,21 @@ namespace Js return ScopeType_WithScope; } + // ScopeSlots + bool ScopeSlots::IsDebuggerScopeSlotArray() + { + return DebuggerScope::Is(slotArray[ScopeMetadataSlotIndex]); + } + // DebuggerScope + bool DebuggerScope::Is(void* ptr) + { + if (!ptr) + { + return false; + } + return VirtualTableInfo::HasVirtualTable(ptr); + } // Get the sibling for the current debugger scope. DebuggerScope * DebuggerScope::GetSiblingScope(RegSlot location, FunctionBody *functionBody) @@ -6361,9 +6398,10 @@ namespace Js hasCachedScopePropIds = false; this->SetConstantCount(0); this->SetConstTable(nullptr); + AssertMsg(!this->byteCodeBlock || !this->IsWasmFunction(), "We should never reset the bytecode block for Wasm"); this->byteCodeBlock = nullptr; - // Also, remove the function body from the source info to prevent any further processing + // Also, remove the function body from the source info to prevent any further processing // of the function such as attempts to set breakpoints. if (GetIsFuncRegistered()) { @@ -6611,105 +6649,35 @@ namespace Js this->SetAuxPtr(AuxPointerType::SimpleJitEntryPointInfo, entryPointInfo); } - void FunctionBody::VerifyExecutionMode(const ExecutionMode executionMode) const - { -#if DBG - Assert(initializedExecutionModeAndLimits); - Assert(executionMode < ExecutionMode::Count); - switch(executionMode) - { - case ExecutionMode::Interpreter: - Assert(!DoInterpreterProfile()); - break; - - case ExecutionMode::AutoProfilingInterpreter: - Assert(DoInterpreterProfile()); - Assert(DoInterpreterAutoProfile()); - break; - - case ExecutionMode::ProfilingInterpreter: - Assert(DoInterpreterProfile()); - break; - - case ExecutionMode::SimpleJit: - Assert(DoSimpleJit()); - break; - - case ExecutionMode::FullJit: - Assert(!PHASE_OFF(FullJitPhase, this)); - break; - - default: - Assert(false); - __assume(false); - } -#endif + uint32 FunctionBody::GetInterpretedCount() const + { + return executionState.GetInterpretedCount(); } - ExecutionMode FunctionBody::GetDefaultInterpreterExecutionMode() const + uint32 FunctionBody::IncreaseInterpretedCount() { - if(!DoInterpreterProfile()) - { - VerifyExecutionMode(ExecutionMode::Interpreter); - return ExecutionMode::Interpreter; - } - if(DoInterpreterAutoProfile()) - { - VerifyExecutionMode(ExecutionMode::AutoProfilingInterpreter); - return ExecutionMode::AutoProfilingInterpreter; - } - VerifyExecutionMode(ExecutionMode::ProfilingInterpreter); - return ExecutionMode::ProfilingInterpreter; + return executionState.IncreaseInterpretedCount(); } - ExecutionMode FunctionBody::GetExecutionMode() const + void FunctionBody::SetAsmJsExecutionMode() { - VerifyExecutionMode(executionMode); - return executionMode; + executionState.SetAsmJsExecutionMode(); } - ExecutionMode FunctionBody::GetInterpreterExecutionMode(const bool isPostBailout) + void FunctionBody::SetDefaultInterpreterExecutionMode() { - Assert(initializedExecutionModeAndLimits); - - if(isPostBailout && DoInterpreterProfile()) - { - return ExecutionMode::ProfilingInterpreter; - } - - switch(GetExecutionMode()) - { - case ExecutionMode::Interpreter: - case ExecutionMode::AutoProfilingInterpreter: - case ExecutionMode::ProfilingInterpreter: - return GetExecutionMode(); - - case ExecutionMode::SimpleJit: - if(CONFIG_FLAG(NewSimpleJit)) - { - return GetDefaultInterpreterExecutionMode(); - } - // fall through - - case ExecutionMode::FullJit: - { - const ExecutionMode executionMode = - DoInterpreterProfile() ? ExecutionMode::ProfilingInterpreter : ExecutionMode::Interpreter; - VerifyExecutionMode(executionMode); - return executionMode; - } + executionState.SetDefaultInterpreterExecutionMode(); + } - default: - Assert(false); - __assume(false); - } + ExecutionMode FunctionBody::GetExecutionMode() const + { + return executionState.GetExecutionMode(); } - void FunctionBody::SetExecutionMode(const ExecutionMode executionMode) + ExecutionMode FunctionBody::GetInterpreterExecutionMode(const bool isPostBailout) { - VerifyExecutionMode(executionMode); - this->executionMode = executionMode; + return executionState.GetInterpreterExecutionMode(isPostBailout); } bool FunctionBody::IsInterpreterExecutionMode() const @@ -6719,546 +6687,47 @@ namespace Js bool FunctionBody::TryTransitionToNextExecutionMode() { - Assert(initializedExecutionModeAndLimits); - - switch(GetExecutionMode()) - { - case ExecutionMode::Interpreter: - if(GetInterpretedCount() < interpreterLimit) - { - VerifyExecutionMode(GetExecutionMode()); - return false; - } - CommitExecutedIterations(interpreterLimit, interpreterLimit); - goto TransitionToFullJit; - - TransitionToAutoProfilingInterpreter: - if(autoProfilingInterpreter0Limit != 0 || autoProfilingInterpreter1Limit != 0) - { - SetExecutionMode(ExecutionMode::AutoProfilingInterpreter); - SetInterpretedCount(0); - return true; - } - goto TransitionFromAutoProfilingInterpreter; - - case ExecutionMode::AutoProfilingInterpreter: - { - uint16 &autoProfilingInterpreterLimit = - autoProfilingInterpreter0Limit == 0 && profilingInterpreter0Limit == 0 - ? autoProfilingInterpreter1Limit - : autoProfilingInterpreter0Limit; - if(GetInterpretedCount() < autoProfilingInterpreterLimit) - { - VerifyExecutionMode(GetExecutionMode()); - return false; - } - CommitExecutedIterations(autoProfilingInterpreterLimit, autoProfilingInterpreterLimit); - // fall through - } - - TransitionFromAutoProfilingInterpreter: - Assert(autoProfilingInterpreter0Limit == 0 || autoProfilingInterpreter1Limit == 0); - if(profilingInterpreter0Limit == 0 && autoProfilingInterpreter1Limit == 0) - { - goto TransitionToSimpleJit; - } - // fall through - - TransitionToProfilingInterpreter: - if(profilingInterpreter0Limit != 0 || profilingInterpreter1Limit != 0) - { - SetExecutionMode(ExecutionMode::ProfilingInterpreter); - SetInterpretedCount(0); - return true; - } - goto TransitionFromProfilingInterpreter; - - case ExecutionMode::ProfilingInterpreter: - { - uint16 &profilingInterpreterLimit = - profilingInterpreter0Limit == 0 && autoProfilingInterpreter1Limit == 0 && simpleJitLimit == 0 - ? profilingInterpreter1Limit - : profilingInterpreter0Limit; - if(GetInterpretedCount() < profilingInterpreterLimit) - { - VerifyExecutionMode(GetExecutionMode()); - return false; - } - CommitExecutedIterations(profilingInterpreterLimit, profilingInterpreterLimit); - // fall through - } - - TransitionFromProfilingInterpreter: - Assert(profilingInterpreter0Limit == 0 || profilingInterpreter1Limit == 0); - if(autoProfilingInterpreter1Limit == 0 && simpleJitLimit == 0 && profilingInterpreter1Limit == 0) - { - goto TransitionToFullJit; - } - goto TransitionToAutoProfilingInterpreter; - - TransitionToSimpleJit: - if(simpleJitLimit != 0) - { - SetExecutionMode(ExecutionMode::SimpleJit); - - // Zero the interpreted count here too, so that we can determine how many interpreter iterations ran - // while waiting for simple JIT - SetInterpretedCount(0); - return true; - } - goto TransitionToProfilingInterpreter; - - case ExecutionMode::SimpleJit: - { - FunctionEntryPointInfo *const simpleJitEntryPointInfo = GetSimpleJitEntryPointInfo(); - if(!simpleJitEntryPointInfo || simpleJitEntryPointInfo->callsCount != 0) - { - VerifyExecutionMode(GetExecutionMode()); - return false; - } - CommitExecutedIterations(simpleJitLimit, simpleJitLimit); - goto TransitionToProfilingInterpreter; - } - - TransitionToFullJit: - if(!PHASE_OFF(FullJitPhase, this)) - { - SetExecutionMode(ExecutionMode::FullJit); - return true; - } - // fall through - - case ExecutionMode::FullJit: - VerifyExecutionMode(GetExecutionMode()); - return false; - - default: - Assert(false); - __assume(false); - } + return executionState.TryTransitionToNextExecutionMode(); } void FunctionBody::TryTransitionToNextInterpreterExecutionMode() { - Assert(IsInterpreterExecutionMode()); - - TryTransitionToNextExecutionMode(); - SetExecutionMode(GetInterpreterExecutionMode(false)); + executionState.TryTransitionToNextInterpreterExecutionMode(); } void FunctionBody::SetIsSpeculativeJitCandidate() { - // This function is a candidate for speculative JIT. Ensure that it is profiled immediately by transitioning out of the - // auto-profiling interpreter mode. - if(GetExecutionMode() != ExecutionMode::AutoProfilingInterpreter || GetProfiledIterations() != 0) - { - return; - } - - TraceExecutionMode("IsSpeculativeJitCandidate (before)"); - - if(autoProfilingInterpreter0Limit != 0) - { - (profilingInterpreter0Limit == 0 ? profilingInterpreter0Limit : autoProfilingInterpreter1Limit) += - autoProfilingInterpreter0Limit; - autoProfilingInterpreter0Limit = 0; - } - else if(profilingInterpreter0Limit == 0) - { - profilingInterpreter0Limit += autoProfilingInterpreter1Limit; - autoProfilingInterpreter1Limit = 0; - } - - TraceExecutionMode("IsSpeculativeJitCandidate"); - TryTransitionToNextInterpreterExecutionMode(); + executionState.SetIsSpeculativeJitCandidate(); } bool FunctionBody::TryTransitionToJitExecutionMode() { - const ExecutionMode previousExecutionMode = GetExecutionMode(); - - TryTransitionToNextExecutionMode(); - switch(GetExecutionMode()) - { - case ExecutionMode::SimpleJit: - break; - - case ExecutionMode::FullJit: - if(fullJitRequeueThreshold == 0) - { - break; - } - --fullJitRequeueThreshold; - return false; - - default: - return false; - } - - if(GetExecutionMode() != previousExecutionMode) - { - TraceExecutionMode(); - } - return true; + return executionState.TryTransitionToJitExecutionMode(); } void FunctionBody::TransitionToSimpleJitExecutionMode() { - CommitExecutedIterations(); - - interpreterLimit = 0; - autoProfilingInterpreter0Limit = 0; - profilingInterpreter0Limit = 0; - autoProfilingInterpreter1Limit = 0; - fullJitThreshold = simpleJitLimit + profilingInterpreter1Limit; - - VerifyExecutionModeLimits(); - SetExecutionMode(ExecutionMode::SimpleJit); + executionState.TransitionToSimpleJitExecutionMode(); } void FunctionBody::TransitionToFullJitExecutionMode() { - CommitExecutedIterations(); - - interpreterLimit = 0; - autoProfilingInterpreter0Limit = 0; - profilingInterpreter0Limit = 0; - autoProfilingInterpreter1Limit = 0; - simpleJitLimit = 0; - profilingInterpreter1Limit = 0; - fullJitThreshold = 0; - - VerifyExecutionModeLimits(); - SetExecutionMode(ExecutionMode::FullJit); - } - - void FunctionBody::VerifyExecutionModeLimits() - { - Assert(initializedExecutionModeAndLimits); - Assert( - ( - interpreterLimit + - autoProfilingInterpreter0Limit + - profilingInterpreter0Limit + - autoProfilingInterpreter1Limit + - simpleJitLimit + - profilingInterpreter1Limit - ) == fullJitThreshold); - } - - void FunctionBody::InitializeExecutionModeAndLimits() - { - DebugOnly(initializedExecutionModeAndLimits = true); - - const ConfigFlagsTable &configFlags = Configuration::Global.flags; - - interpreterLimit = 0; - autoProfilingInterpreter0Limit = static_cast(configFlags.AutoProfilingInterpreter0Limit); - profilingInterpreter0Limit = static_cast(configFlags.ProfilingInterpreter0Limit); - autoProfilingInterpreter1Limit = static_cast(configFlags.AutoProfilingInterpreter1Limit); - simpleJitLimit = static_cast(configFlags.SimpleJitLimit); - profilingInterpreter1Limit = static_cast(configFlags.ProfilingInterpreter1Limit); - - // Based on which execution modes are disabled, calculate the number of additional iterations that need to be covered by - // the execution mode that will scale with the full JIT threshold - uint16 scale = 0; - const bool doInterpreterProfile = DoInterpreterProfile(); - if(!doInterpreterProfile) - { - scale += - autoProfilingInterpreter0Limit + - profilingInterpreter0Limit + - autoProfilingInterpreter1Limit + - profilingInterpreter1Limit; - autoProfilingInterpreter0Limit = 0; - profilingInterpreter0Limit = 0; - autoProfilingInterpreter1Limit = 0; - profilingInterpreter1Limit = 0; - } - else if(!DoInterpreterAutoProfile()) - { - scale += autoProfilingInterpreter0Limit + autoProfilingInterpreter1Limit; - autoProfilingInterpreter0Limit = 0; - autoProfilingInterpreter1Limit = 0; - if(!CONFIG_FLAG(NewSimpleJit)) - { - simpleJitLimit += profilingInterpreter0Limit; - profilingInterpreter0Limit = 0; - } - } - if(!DoSimpleJit()) - { - if(!CONFIG_FLAG(NewSimpleJit) && doInterpreterProfile) - { - // The old simple JIT is off, but since it does profiling, it will be replaced with the profiling interpreter - profilingInterpreter1Limit += simpleJitLimit; - } - else - { - scale += simpleJitLimit; - } - simpleJitLimit = 0; - } - if(PHASE_OFF(FullJitPhase, this)) - { - scale += profilingInterpreter1Limit; - profilingInterpreter1Limit = 0; - } - - uint16 fullJitThreshold = - static_cast( - configFlags.AutoProfilingInterpreter0Limit + - configFlags.ProfilingInterpreter0Limit + - configFlags.AutoProfilingInterpreter1Limit + - configFlags.SimpleJitLimit + - configFlags.ProfilingInterpreter1Limit); - if(!configFlags.EnforceExecutionModeLimits) - { - /* - Scale the full JIT threshold based on some heuristics: - - If the % of code in loops is > 50, scale by 1 - - Byte-code size of code outside loops - - If the size is < 50, scale by 1.2 - - If the size is < 100, scale by 1.4 - - If the size is >= 100, scale by 1.6 - */ - const uint loopPercentage = GetByteCodeInLoopCount() * 100 / max(1u, GetByteCodeCount()); - const int byteCodeSizeThresholdForInlineCandidate = CONFIG_FLAG(LoopInlineThreshold); - bool delayFullJITThisFunc = - (CONFIG_FLAG(DelayFullJITSmallFunc) > 0) && (this->GetByteCodeWithoutLDACount() <= (uint)byteCodeSizeThresholdForInlineCandidate); - - if(loopPercentage <= 50 || delayFullJITThisFunc) - { - const uint straightLineSize = GetByteCodeCount() - GetByteCodeInLoopCount(); - double fullJitDelayMultiplier; - if (delayFullJITThisFunc) - { - fullJitDelayMultiplier = CONFIG_FLAG(DelayFullJITSmallFunc) / 10.0; - } - else if(straightLineSize < 50) - { - fullJitDelayMultiplier = 1.2; - } - else if(straightLineSize < 100) - { - fullJitDelayMultiplier = 1.4; - } - else - { - fullJitDelayMultiplier = 1.6; - } - - const uint16 newFullJitThreshold = static_cast(fullJitThreshold * fullJitDelayMultiplier); - scale += newFullJitThreshold - fullJitThreshold; - fullJitThreshold = newFullJitThreshold; - } - } - - Assert(fullJitThreshold >= scale); - this->fullJitThreshold = fullJitThreshold - scale; - SetInterpretedCount(0); - SetExecutionMode(GetDefaultInterpreterExecutionMode()); - SetFullJitThreshold(fullJitThreshold); - TryTransitionToNextInterpreterExecutionMode(); + executionState.TransitionToFullJitExecutionMode(); } void FunctionBody::ReinitializeExecutionModeAndLimits() { + // Do not remove wasCalledFromLoop wasCalledFromLoop = false; - fullJitRequeueThreshold = 0; - committedProfiledIterations = 0; - InitializeExecutionModeAndLimits(); - } - - void FunctionBody::SetFullJitThreshold(const uint16 newFullJitThreshold, const bool skipSimpleJit) - { - Assert(initializedExecutionModeAndLimits); - Assert(GetExecutionMode() != ExecutionMode::FullJit); - - int scale = newFullJitThreshold - fullJitThreshold; - if(scale == 0) - { - VerifyExecutionModeLimits(); - return; - } - fullJitThreshold = newFullJitThreshold; - - const auto ScaleLimit = [&](uint16 &limit) -> bool - { - Assert(scale != 0); - const int limitScale = max(-static_cast(limit), scale); - const int newLimit = limit + limitScale; - Assert(static_cast(static_cast(newLimit)) == newLimit); - limit = static_cast(newLimit); - scale -= limitScale; - Assert(limit == 0 || scale == 0); - - if(&limit == &simpleJitLimit) - { - FunctionEntryPointInfo *const simpleJitEntryPointInfo = GetSimpleJitEntryPointInfo(); - if(GetDefaultFunctionEntryPointInfo() == simpleJitEntryPointInfo) - { - Assert(GetExecutionMode() == ExecutionMode::SimpleJit); - const int newSimpleJitCallCount = max(0, (int)simpleJitEntryPointInfo->callsCount + limitScale); - Assert(static_cast(static_cast(newSimpleJitCallCount)) == newSimpleJitCallCount); - SetSimpleJitCallCount(static_cast(newSimpleJitCallCount)); - } - } - - return scale == 0; - }; - - /* - Determine which execution mode's limit scales with the full JIT threshold, in order of preference: - - New simple JIT - - Auto-profiling interpreter 1 - - Auto-profiling interpreter 0 - - Interpreter - - Profiling interpreter 0 (when using old simple JIT) - - Old simple JIT - - Profiling interpreter 1 - - Profiling interpreter 0 (when using new simple JIT) - */ - const bool doSimpleJit = DoSimpleJit(); - const bool doInterpreterProfile = DoInterpreterProfile(); - const bool fullyScaled = - (CONFIG_FLAG(NewSimpleJit) && doSimpleJit && ScaleLimit(simpleJitLimit)) || - ( - doInterpreterProfile - ? DoInterpreterAutoProfile() && - (ScaleLimit(autoProfilingInterpreter1Limit) || ScaleLimit(autoProfilingInterpreter0Limit)) - : ScaleLimit(interpreterLimit) - ) || - ( - CONFIG_FLAG(NewSimpleJit) - ? doInterpreterProfile && - (ScaleLimit(profilingInterpreter1Limit) || ScaleLimit(profilingInterpreter0Limit)) - : (doInterpreterProfile && ScaleLimit(profilingInterpreter0Limit)) || - (doSimpleJit && ScaleLimit(simpleJitLimit)) || - (doInterpreterProfile && ScaleLimit(profilingInterpreter1Limit)) - ); - Assert(fullyScaled); - Assert(scale == 0); - - if(GetExecutionMode() != ExecutionMode::SimpleJit) - { - Assert(IsInterpreterExecutionMode()); - if(simpleJitLimit != 0 && - (skipSimpleJit || simpleJitLimit < DEFAULT_CONFIG_MinSimpleJitIterations) && - !PHASE_FORCE(Phase::SimpleJitPhase, this)) - { - // Simple JIT code has not yet been generated, and was either requested to be skipped, or the limit was scaled - // down too much. Skip simple JIT by moving any remaining iterations to an equivalent interpreter execution - // mode. - (CONFIG_FLAG(NewSimpleJit) ? autoProfilingInterpreter1Limit : profilingInterpreter1Limit) += simpleJitLimit; - simpleJitLimit = 0; - TryTransitionToNextInterpreterExecutionMode(); - } - } - - VerifyExecutionModeLimits(); - } - - void FunctionBody::CommitExecutedIterations() - { - Assert(initializedExecutionModeAndLimits); - - switch(GetExecutionMode()) - { - case ExecutionMode::Interpreter: - CommitExecutedIterations(interpreterLimit, GetInterpretedCount()); - break; - - case ExecutionMode::AutoProfilingInterpreter: - CommitExecutedIterations( - autoProfilingInterpreter0Limit == 0 && profilingInterpreter0Limit == 0 - ? autoProfilingInterpreter1Limit - : autoProfilingInterpreter0Limit, - GetInterpretedCount()); - break; - - case ExecutionMode::ProfilingInterpreter: - CommitExecutedIterations( - GetSimpleJitEntryPointInfo() - ? profilingInterpreter1Limit - : profilingInterpreter0Limit, - GetInterpretedCount()); - break; - - case ExecutionMode::SimpleJit: - CommitExecutedIterations(simpleJitLimit, GetSimpleJitExecutedIterations()); - break; - - case ExecutionMode::FullJit: - break; - - default: - Assert(false); - __assume(false); - } - } - - void FunctionBody::CommitExecutedIterations(uint16 &limit, const uint executedIterations) - { - Assert(initializedExecutionModeAndLimits); - Assert( - &limit == &interpreterLimit || - &limit == &autoProfilingInterpreter0Limit || - &limit == &profilingInterpreter0Limit || - &limit == &autoProfilingInterpreter1Limit || - &limit == &simpleJitLimit || - &limit == &profilingInterpreter1Limit); - - const uint16 clampedExecutedIterations = executedIterations >= limit ? limit : static_cast(executedIterations); - Assert(fullJitThreshold >= clampedExecutedIterations); - fullJitThreshold -= clampedExecutedIterations; - limit -= clampedExecutedIterations; - VerifyExecutionModeLimits(); - - if(&limit == &profilingInterpreter0Limit || - (!CONFIG_FLAG(NewSimpleJit) && &limit == &simpleJitLimit) || - &limit == &profilingInterpreter1Limit) - { - const uint16 newCommittedProfiledIterations = committedProfiledIterations + clampedExecutedIterations; - committedProfiledIterations = - newCommittedProfiledIterations >= committedProfiledIterations ? newCommittedProfiledIterations : UINT16_MAX; - } - } - - uint16 FunctionBody::GetSimpleJitExecutedIterations() const - { - Assert(initializedExecutionModeAndLimits); - Assert(GetExecutionMode() == ExecutionMode::SimpleJit); - - FunctionEntryPointInfo *const simpleJitEntryPointInfo = GetSimpleJitEntryPointInfo(); - if(!simpleJitEntryPointInfo) - { - return 0; - } - - // Simple JIT counts down and transitions on overflow - const uint32 callCount = simpleJitEntryPointInfo->callsCount; - Assert(simpleJitLimit == 0 ? callCount == 0 : simpleJitLimit > callCount); - return callCount == 0 ? - static_cast(simpleJitLimit) : - static_cast(simpleJitLimit) - static_cast(callCount) - 1; + executionState.ReinitializeExecutionModeAndLimits(this); } void FunctionBody::ResetSimpleJitLimitAndCallCount() { - Assert(initializedExecutionModeAndLimits); - Assert(GetExecutionMode() == ExecutionMode::SimpleJit); Assert(GetDefaultFunctionEntryPointInfo() == GetSimpleJitEntryPointInfo()); - const uint16 simpleJitNewLimit = static_cast(Configuration::Global.flags.SimpleJitLimit); - Assert(simpleJitNewLimit == Configuration::Global.flags.SimpleJitLimit); - if(simpleJitLimit < simpleJitNewLimit) - { - fullJitThreshold += simpleJitNewLimit - simpleJitLimit; - simpleJitLimit = simpleJitNewLimit; - } + executionState.ResetSimpleJitLimit(); - SetInterpretedCount(0); ResetSimpleJitCallCount(); } @@ -7275,6 +6744,7 @@ namespace Js void FunctionBody::ResetSimpleJitCallCount() { uint32 interpretedCount = GetInterpretedCount(); + uint16 simpleJitLimit = static_cast(executionState.GetSimpleJitLimit()); SetSimpleJitCallCount( simpleJitLimit > interpretedCount ? simpleJitLimit - static_cast(interpretedCount) @@ -7283,37 +6753,12 @@ namespace Js uint16 FunctionBody::GetProfiledIterations() const { - Assert(initializedExecutionModeAndLimits); - - uint16 profiledIterations = committedProfiledIterations; - switch(GetExecutionMode()) - { - case ExecutionMode::ProfilingInterpreter: - { - uint32 interpretedCount = GetInterpretedCount(); - const uint16 clampedInterpretedCount = - interpretedCount <= UINT16_MAX - ? static_cast(interpretedCount) - : UINT16_MAX; - const uint16 newProfiledIterations = profiledIterations + clampedInterpretedCount; - profiledIterations = newProfiledIterations >= profiledIterations ? newProfiledIterations : UINT16_MAX; - break; - } - - case ExecutionMode::SimpleJit: - if(!CONFIG_FLAG(NewSimpleJit)) - { - const uint16 newProfiledIterations = profiledIterations + GetSimpleJitExecutedIterations(); - profiledIterations = newProfiledIterations >= profiledIterations ? newProfiledIterations : UINT16_MAX; - } - break; - } - return profiledIterations; + return executionState.GetProfiledIterations(); } void FunctionBody::OnFullJitDequeued(const FunctionEntryPointInfo *const entryPointInfo) { - Assert(initializedExecutionModeAndLimits); + executionState.AssertIsInitialized(); Assert(GetExecutionMode() == ExecutionMode::FullJit); Assert(entryPointInfo); @@ -7323,12 +6768,12 @@ namespace Js } // Re-queue the full JIT work item after this many iterations - fullJitRequeueThreshold = static_cast(DEFAULT_CONFIG_FullJitRequeueThreshold); + executionState.SetFullJitRequeueThreshold(static_cast(DEFAULT_CONFIG_FullJitRequeueThreshold)); } void FunctionBody::TraceExecutionMode(const char *const eventDescription) const { - Assert(initializedExecutionModeAndLimits); + executionState.AssertIsInitialized(); if(PHASE_TRACE(Phase::ExecutionModePhase, this)) { @@ -7338,7 +6783,7 @@ namespace Js void FunctionBody::TraceInterpreterExecutionMode() const { - Assert(initializedExecutionModeAndLimits); + executionState.AssertIsInitialized(); if(!PHASE_TRACE(Phase::ExecutionModePhase, this)) { @@ -7358,25 +6803,20 @@ namespace Js void FunctionBody::DoTraceExecutionMode(const char *const eventDescription) const { Assert(PHASE_TRACE(Phase::ExecutionModePhase, this)); - Assert(initializedExecutionModeAndLimits); + executionState.AssertIsInitialized(); char16 functionIdString[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE]; Output::Print( _u("ExecutionMode - ") _u("function: %s (%s), ") _u("mode: %S, ") - _u("size: %u, ") - _u("limits: %hu.%hu.%hu.%hu.%hu = %hu"), + _u("size: %u, "), GetDisplayName(), GetDebugNumberSet(functionIdString), - ExecutionModeName(executionMode), - GetByteCodeCount(), - interpreterLimit + autoProfilingInterpreter0Limit, - profilingInterpreter0Limit, - autoProfilingInterpreter1Limit, - simpleJitLimit, - profilingInterpreter1Limit, - fullJitThreshold); + ExecutionModeName(executionState.GetExecutionMode()), + GetByteCodeCount()); + + executionState.PrintLimits(); if(eventDescription) { @@ -7391,6 +6831,9 @@ namespace Js { return !PHASE_OFF(Js::SimpleJitPhase, this) && +#ifdef ASMJS_PLAT + !GetIsAsmjsMode() && +#endif !GetScriptContext()->GetConfig()->IsNoNative() && !GetScriptContext()->IsScriptContextInDebugMode() && DoInterpreterProfile() && @@ -7403,6 +6846,9 @@ namespace Js { return !PHASE_OFF(Js::SimpleJitPhase, this) && +#ifdef ASMJS_PLAT + !GetIsAsmjsMode() && +#endif !GetScriptContext()->GetConfig()->IsNoNative() && !this->IsInDebugMode() && DoInterpreterProfileWithLock() && @@ -7421,17 +6867,7 @@ namespace Js bool FunctionBody::DoInterpreterProfile() const { #if ENABLE_PROFILE_INFO -#ifdef ASMJS_PLAT - // Switch off profiling is asmJsFunction - if (this->GetIsAsmJsFunction() || this->GetAsmJsModuleInfo()) - { - return false; - } - else -#endif - { - return !PHASE_OFF(InterpreterProfilePhase, this) && DynamicProfileInfo::IsEnabled(this); - } + return !PHASE_OFF(InterpreterProfilePhase, this) && DynamicProfileInfo::IsEnabled(this); #else return false; #endif @@ -7440,17 +6876,7 @@ namespace Js bool FunctionBody::DoInterpreterProfileWithLock() const { #if ENABLE_PROFILE_INFO -#ifdef ASMJS_PLAT - // Switch off profiling is asmJsFunction - if (this->GetIsAsmJsFunction() || this->GetAsmJsModuleInfoWithLock()) - { - return false; - } - else -#endif - { - return !PHASE_OFF(InterpreterProfilePhase, this) && DynamicProfileInfo::IsEnabled(this); - } + return !PHASE_OFF(InterpreterProfilePhase, this) && DynamicProfileInfo::IsEnabled(this); #else return false; #endif @@ -7460,6 +6886,10 @@ namespace Js { Assert(DoInterpreterProfile()); +#ifdef ASMJS_PLAT + if (this->GetIsAsmjsMode()) return false; +#endif + return !PHASE_OFF(InterpreterAutoProfilePhase, this) && !this->IsInDebugMode(); } @@ -7480,7 +6910,7 @@ namespace Js { if(PHASE_TRACE(Phase::ExecutionModePhase, this)) { - CommitExecutedIterations(); + executionState.CommitExecutedIterations(); TraceExecutionMode("WasCalledFromLoop (before)"); } } @@ -7488,11 +6918,12 @@ namespace Js { // This function is likely going to be called frequently since it's called from a loop. Reduce the full JIT // threshold to realize the full JIT perf benefit sooner. - CommitExecutedIterations(); + executionState.CommitExecutedIterations(); TraceExecutionMode("WasCalledFromLoop (before)"); + uint16 fullJitThreshold = executionState.GetFullJitThreshold(); if(fullJitThreshold > 1) { - SetFullJitThreshold(fullJitThreshold / 2, !CONFIG_FLAG(NewSimpleJit)); + executionState.SetFullJitThreshold(fullJitThreshold / 2, !CONFIG_FLAG(NewSimpleJit)); } } @@ -7953,8 +7384,9 @@ namespace Js this->SetScopeSlotArraySizes(0, 0); // Manually clear these values to break any circular references - // that might prevent the script context from being disposed + // that might prevent the script context from being disposed this->auxPtrs = nullptr; + AssertMsg(isScriptContextClosing || !m_hasActiveReference || !this->byteCodeBlock || !this->IsWasmFunction(), "We should never reset the bytecode block for Wasm when still referenced"); this->byteCodeBlock = nullptr; this->entryPoints = nullptr; this->inlineCaches = nullptr; @@ -8047,11 +7479,11 @@ namespace Js return; } - CommitExecutedIterations(); + executionState.CommitExecutedIterations(); TraceExecutionMode("HasHotLoop (before)"); - if(fullJitThreshold > 1) + if(executionState.GetFullJitThreshold() > 1) { - SetFullJitThreshold(1, true); + executionState.SetFullJitThreshold(1, true); } TraceExecutionMode("HasHotLoop"); } @@ -8110,6 +7542,7 @@ namespace Js } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING void FunctionBody::CheckAndRegisterFuncToDiag(ScriptContext *scriptContext) { // We will register function if, this is not host managed and it was not registered before. @@ -8142,6 +7575,7 @@ namespace Js } } +#endif DebuggerScope* FunctionBody::RecordStartScopeObject(DiagExtraScopesType scopeType, int start, RegSlot scopeLocation, int* index) { @@ -8670,12 +8104,20 @@ namespace Js // Set the recycler-allocated cache on the (heap-allocated) guard. (*guard)->SetCache(cache); - for(uint i = 0; i < EQUIVALENT_TYPE_CACHE_SIZE; i++) + for (uint i = 0; i < EQUIVALENT_TYPE_CACHE_SIZE; i++) { if((*cache).types[i] != nullptr) { (*cache).types[i]->SetHasBeenCached(); } + else + { +#ifdef DEBUG + for (uint __i = i; __i < EQUIVALENT_TYPE_CACHE_SIZE; __i++) + { Assert((*cache).types[__i] == nullptr); } +#endif + break; // type array must be shrinked. + } } cache++; } @@ -9310,6 +8752,14 @@ namespace Js #endif } } + else + { +#ifdef DEBUG + for (int __i = i; __i < EQUIVALENT_TYPE_CACHE_SIZE; __i++) + { Assert(this->types[__i] == nullptr); } +#endif + break; // array must be shrinked already + } } if (nonNullIndex > 0) @@ -9318,9 +8768,6 @@ namespace Js } else { -#if DBG - isGuardValuePresent = true; // never went into loop. (noNullIndex == 0) -#endif if (guard->IsInvalidatedDuringSweep()) { // just mark this as actual invalidated since there are no types @@ -9330,7 +8777,8 @@ namespace Js } // verify if guard value is valid, it is present in one of the types - AssertMsg(!this->guard->IsValid() || isGuardValuePresent, "After ClearUnusedTypes, valid guard value should be one of the cached equivalent types."); + AssertMsg(!this->guard->IsValid() || isGuardValuePresent || nonNullIndex == 0, + "After ClearUnusedTypes, valid guard value should be one of the cached equivalent types."); return isAnyTypeLive; } @@ -9401,31 +8849,38 @@ namespace Js { if (this->GetState() != CleanedUp) { - // Unregister xdataInfo before OnCleanup() which may release xdataInfo->address #if ENABLE_NATIVE_CODEGEN -#if defined(_M_X64) - if (this->xdataInfo != nullptr) - { - XDataAllocator::Unregister(this->xdataInfo); - HeapDelete(this->xdataInfo); - this->xdataInfo = nullptr; - } -#elif defined(_M_ARM32_OR_ARM64) + void* functionTable = nullptr; +#if PDATA_ENABLED if (this->xdataInfo != nullptr) { +#ifdef _WIN32 + functionTable = this->xdataInfo->functionTable; +#endif XDataAllocator::Unregister(this->xdataInfo); +#if defined(_M_ARM32_OR_ARM64) if (JITManager::GetJITManager()->IsOOPJITEnabled()) +#endif { HeapDelete(this->xdataInfo); } this->xdataInfo = nullptr; } -#endif #endif - this->OnCleanup(isShutdown); + this->OnCleanup(isShutdown, &functionTable); + +#if PDATA_ENABLED && defined(_WIN32) + // functionTable is not transferred somehow, delete in-thread + if (functionTable) + { + if (!DelayDeletingFunctionTable::AddEntry(functionTable)) + { + NtdllLibrary::Instance->DeleteGrowableFunctionTable(functionTable); + } + } +#endif -#if ENABLE_NATIVE_CODEGEN FreeJitTransferData(); if (this->bailoutRecordMap != nullptr) @@ -9547,7 +9002,15 @@ namespace Js // Reset the entry point upon a lazy bailout. this->Reset(true); Assert(this->nativeAddress != nullptr); - FreeNativeCodeGenAllocation(GetScriptContext(), this->nativeAddress, this->thunkAddress); + + void* functionTable = nullptr; +#if PDATA_ENABLED && defined(_WIN32) + if (this->xdataInfo) + { + functionTable = this->xdataInfo->functionTable; + } +#endif + FreeNativeCodeGenAllocation(GetScriptContext(), this->nativeAddress, this->thunkAddress, &functionTable); this->nativeAddress = nullptr; this->jsMethod = nullptr; } @@ -9643,7 +9106,7 @@ namespace Js return functionProxy->GetFunctionBody(); } - void FunctionEntryPointInfo::OnCleanup(bool isShutdown) + void FunctionEntryPointInfo::OnCleanup(bool isShutdown, void** functionTable) { if (this->IsCodeGenDone()) { @@ -9654,19 +9117,7 @@ namespace Js HeapDelete(this->inlineeFrameMap); this->inlineeFrameMap = nullptr; } -#if PDATA_ENABLED - if (this->xdataInfo != nullptr) - { - XDataAllocator::Unregister(this->xdataInfo); -#if defined(_M_ARM32_OR_ARM64) - if (JITManager::GetJITManager()->IsOOPJITEnabled()) -#endif - { - HeapDelete(this->xdataInfo); - } - this->xdataInfo = nullptr; - } -#endif + #endif if(nativeEntryPointProcessed) @@ -9717,7 +9168,8 @@ namespace Js if (validationCookie == currentCookie) { - scriptContext->FreeFunctionEntryPoint((Js::JavascriptMethod)this->GetNativeAddress(), this->GetThunkAddress()); + scriptContext->FreeFunctionEntryPoint((Js::JavascriptMethod)this->GetNativeAddress(), this->GetThunkAddress(), functionTable); + *functionTable = nullptr; } } @@ -9810,7 +9262,7 @@ namespace Js this->functionProxy->MapFunctionObjectTypes([&](ScriptFunctionType* functionType) { Assert(functionType->GetTypeId() == TypeIds_Function); - + if (functionType->GetEntryPointInfo() == this) { functionType->SetEntryPointInfo(entryPoint); @@ -9861,7 +9313,6 @@ namespace Js { newEntryPoint = simpleJitEntryPointInfo; functionBody->SetDefaultFunctionEntryPointInfo(simpleJitEntryPointInfo, newEntryPoint->GetNativeEntrypoint()); - functionBody->SetExecutionMode(ExecutionMode::SimpleJit); functionBody->ResetSimpleJitLimitAndCallCount(); } #ifdef ASMJS_PLAT @@ -9872,14 +9323,21 @@ namespace Js newEntryPoint->SetIsAsmJSFunction(true); newEntryPoint->jsMethod = AsmJsDefaultEntryThunk; functionBody->SetIsAsmJsFullJitScheduled(false); - functionBody->SetExecutionMode(functionBody->GetDefaultInterpreterExecutionMode()); + functionBody->SetDefaultInterpreterExecutionMode(); this->functionProxy->SetOriginalEntryPoint(AsmJsDefaultEntryThunk); } #endif else { newEntryPoint = functionBody->CreateNewDefaultEntryPoint(); - functionBody->SetExecutionMode(functionBody->GetDefaultInterpreterExecutionMode()); + functionBody->ReinitializeExecutionModeAndLimits(); +#if ENABLE_NATIVE_CODEGEN + // In order for the function to ever get JIT again, we need to call GenerateFunction now + if (!PHASE_OFF(Js::BackEndPhase, functionBody) && !functionBody->GetScriptContext()->GetConfig()->IsNoNative()) + { + GenerateFunction(functionBody->GetScriptContext()->GetNativeCodeGenerator(), functionBody); + } +#endif } functionBody->TraceExecutionMode("JitCodeExpired"); } @@ -9971,7 +9429,7 @@ namespace Js //End AsmJs Support - void LoopEntryPointInfo::OnCleanup(bool isShutdown) + void LoopEntryPointInfo::OnCleanup(bool isShutdown, void** functionTable) { #ifdef ASMJS_PLAT if (this->IsCodeGenDone() && !this->GetIsTJMode()) @@ -9979,8 +9437,8 @@ namespace Js if (this->IsCodeGenDone()) #endif { - uint loopNumber = this->loopHeader->functionBody->GetLoopNumber(this->loopHeader); - JS_ETW(EtwTrace::LogLoopBodyUnloadEvent(this->loopHeader->functionBody, this, loopNumber)); + JS_ETW(EtwTrace::LogLoopBodyUnloadEvent(this->loopHeader->functionBody, this, + this->loopHeader->functionBody->GetLoopNumber(this->loopHeader))); #if ENABLE_NATIVE_CODEGEN if (nullptr != this->inlineeFrameMap) @@ -9988,19 +9446,6 @@ namespace Js HeapDelete(this->inlineeFrameMap); this->inlineeFrameMap = nullptr; } -#if PDATA_ENABLED - if (this->xdataInfo != nullptr) - { - XDataAllocator::Unregister(this->xdataInfo); -#if defined(_M_ARM32_OR_ARM64) - if (JITManager::GetJITManager()->IsOOPJITEnabled()) -#endif - { - HeapDelete(this->xdataInfo); - } - this->xdataInfo = nullptr; - } -#endif #endif if (!isShutdown) @@ -10032,7 +9477,8 @@ namespace Js if (validationCookie == currentCookie) { - scriptContext->FreeFunctionEntryPoint(reinterpret_cast(this->GetNativeAddress()), this->GetThunkAddress()); + scriptContext->FreeFunctionEntryPoint(reinterpret_cast(this->GetNativeAddress()), this->GetThunkAddress(), functionTable); + *functionTable = nullptr; } } diff --git a/deps/chakrashim/core/lib/Runtime/Base/FunctionBody.h b/deps/chakrashim/core/lib/Runtime/Base/FunctionBody.h index 4dae69c3c4b..5d7ad18e75a 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/FunctionBody.h +++ b/deps/chakrashim/core/lib/Runtime/Base/FunctionBody.h @@ -7,6 +7,9 @@ #include "AuxPtrs.h" #include "CompactCounters.h" +// Where should I include this file? +#include "FunctionExecutionStateMachine.h" + struct CodeGenWorkItem; class SourceContextInfo; struct DeferredFunctionStub; @@ -79,198 +82,6 @@ namespace Js Type * type; void * data; }; - class PropertyGuard - { - friend class PropertyGuardValidator; - - private: - Field(intptr_t) value; // value is address of Js::Type -#if DBG - Field(bool) wasReincarnated = false; -#endif - public: - static PropertyGuard* New(Recycler* recycler) { return RecyclerNewLeaf(recycler, Js::PropertyGuard); } - PropertyGuard() : value(GuardValue::Uninitialized) {} - PropertyGuard(intptr_t value) : value(value) - { - // GuardValue::Invalidated and GuardValue::Invalidated_DuringSweeping can only be set using - // Invalidate() and InvalidatedDuringSweep() methods respectively. - Assert(this->value != GuardValue::Invalidated && this->value != GuardValue::Invalidated_DuringSweep); - } - - inline static size_t const GetSizeOfValue() { return sizeof(((PropertyGuard*)0)->value); } - inline static size_t const GetOffsetOfValue() { return offsetof(PropertyGuard, value); } - - intptr_t GetValue() const { return this->value; } - bool IsValid() - { - return this->value != GuardValue::Invalidated && this->value != GuardValue::Invalidated_DuringSweep; - } - bool IsInvalidatedDuringSweep() { return this->value == GuardValue::Invalidated_DuringSweep; } - void SetValue(intptr_t value) - { - // GuardValue::Invalidated and GuardValue::Invalidated_DuringSweeping can only be set using - // Invalidate() and InvalidatedDuringSweep() methods respectively. - Assert(value != GuardValue::Invalidated && value != GuardValue::Invalidated_DuringSweep); - this->value = value; - } - intptr_t const* GetAddressOfValue() { return &this->value; } - void Invalidate() { this->value = GuardValue::Invalidated; } - void InvalidateDuringSweep() - { -#if DBG - wasReincarnated = true; -#endif - this->value = GuardValue::Invalidated_DuringSweep; - } -#if DBG - bool WasReincarnated() { return this->wasReincarnated; } -#endif - enum GuardValue : intptr_t - { - Invalidated = 0, - Uninitialized = 1, - Invalidated_DuringSweep = 2 - }; - }; - - class PropertyGuardValidator - { - // Required by EquivalentTypeGuard::SetType. - CompileAssert(offsetof(PropertyGuard, value) == 0); - CompileAssert(offsetof(ConstructorCache, guard.value) == offsetof(PropertyGuard, value)); - }; - - class JitIndexedPropertyGuard : public Js::PropertyGuard - { - private: - int index; - - public: - JitIndexedPropertyGuard(intptr_t value, int index): - Js::PropertyGuard(value), index(index) {} - - int GetIndex() const { return this->index; } - }; - - class JitTypePropertyGuard : public Js::JitIndexedPropertyGuard - { - public: - JitTypePropertyGuard(intptr_t typeAddr, int index): - JitIndexedPropertyGuard(typeAddr, index) {} - - intptr_t GetTypeAddr() const { return this->GetValue(); } - - }; - - struct TypeGuardTransferEntry - { - PropertyId propertyId; - JitIndexedPropertyGuard* guards[0]; - - TypeGuardTransferEntry(): propertyId(Js::Constants::NoProperty) {} - }; - - class FakePropertyGuardWeakReference: public RecyclerWeakReference - { - public: - static FakePropertyGuardWeakReference* New(Recycler* recycler, Js::PropertyGuard* guard) - { - Assert(guard != nullptr); - return RecyclerNewLeaf(recycler, Js::FakePropertyGuardWeakReference, guard); - } - FakePropertyGuardWeakReference(const Js::PropertyGuard* guard) - { - this->strongRef = (char*)guard; - this->strongRefHeapBlock = &CollectedRecyclerWeakRefHeapBlock::Instance; - } - - void Zero() - { - Assert(this->strongRef != nullptr); - this->strongRef = nullptr; - } - }; - - struct CtorCacheGuardTransferEntry - { - PropertyId propertyId; - intptr_t caches[0]; - - CtorCacheGuardTransferEntry(): propertyId(Js::Constants::NoProperty) {} - }; - - struct EquivalentTypeCache - { - Js::Type* types[EQUIVALENT_TYPE_CACHE_SIZE]; - PropertyGuard *guard; - TypeEquivalenceRecord record; - uint nextEvictionVictim; - bool isLoadedFromProto; - bool hasFixedValue; - - EquivalentTypeCache(): nextEvictionVictim(EQUIVALENT_TYPE_CACHE_SIZE) {} - bool ClearUnusedTypes(Recycler *recycler); - void SetGuard(PropertyGuard *theGuard) { this->guard = theGuard; } - void SetIsLoadedFromProto() { this->isLoadedFromProto = true; } - bool IsLoadedFromProto() const { return this->isLoadedFromProto; } - void SetHasFixedValue() { this->hasFixedValue = true; } - bool HasFixedValue() const { return this->hasFixedValue; } - }; - - class JitEquivalentTypeGuard : public JitIndexedPropertyGuard - { - // This pointer is allocated from background thread first, and then transferred to recycler, - // so as to keep the cached types alive. - EquivalentTypeCache* cache; - uint32 objTypeSpecFldId; - // TODO: OOP JIT, reenable these asserts -#if DBG && 0 - // Intentionally have as intptr_t so this guard doesn't hold scriptContext - intptr_t originalScriptContextValue = 0; -#endif - - public: - JitEquivalentTypeGuard(intptr_t typeAddr, int index, uint32 objTypeSpecFldId): - JitIndexedPropertyGuard(typeAddr, index), cache(nullptr), objTypeSpecFldId(objTypeSpecFldId) - { -#if DBG && 0 - originalScriptContextValue = reinterpret_cast(type->GetScriptContext()); -#endif - } - - intptr_t GetTypeAddr() const { return this->GetValue(); } - - void SetTypeAddr(const intptr_t typeAddr) - { -#if DBG && 0 - if (originalScriptContextValue == 0) - { - originalScriptContextValue = reinterpret_cast(type->GetScriptContext()); - } - else - { - AssertMsg(originalScriptContextValue == reinterpret_cast(type->GetScriptContext()), "Trying to set guard type from different script context."); - } -#endif - this->SetValue(typeAddr); - } - - uint32 GetObjTypeSpecFldId() const - { - return this->objTypeSpecFldId; - } - - Js::EquivalentTypeCache* GetCache() const - { - return this->cache; - } - - void SetCache(Js::EquivalentTypeCache* cache) - { - this->cache = cache; - } - }; #pragma region Inline Cache Info class declarations class PolymorphicCacheUtilizationArray @@ -674,7 +485,7 @@ namespace Js virtual void ReleasePendingWorkItem() {}; - virtual void OnCleanup(bool isShutdown) = 0; + virtual void OnCleanup(bool isShutdown, void** functionTable) = 0; #ifdef PERF_COUNTERS virtual void OnRecorded() = 0; @@ -1096,7 +907,7 @@ namespace Js } #endif - virtual void OnCleanup(bool isShutdown) override; + virtual void OnCleanup(bool isShutdown, void** functionTable) override; virtual void ReleasePendingWorkItem() override; @@ -1125,7 +936,7 @@ namespace Js virtual FunctionBody *GetFunctionBody() const override; - virtual void OnCleanup(bool isShutdown) override; + virtual void OnCleanup(bool isShutdown, void** functionTable) override; #if ENABLE_NATIVE_CODEGEN virtual void ResetOnNativeCodeInstallFailure() override; @@ -1480,6 +1291,9 @@ namespace Js void SetIsPublicLibraryCode() { m_isPublicLibraryCode = true; } bool IsPublicLibraryCode() const { return m_isPublicLibraryCode; } + void SetIsJsBuiltInCode() { m_isJsBuiltInCode = true; } + bool IsJsBuiltInCode() const { return m_isJsBuiltInCode; } + #if DBG bool HasValidEntryPoint() const; #if defined(ENABLE_SCRIPT_PROFILING) || defined(ENABLE_SCRIPT_DEBUGGING) @@ -1539,6 +1353,7 @@ namespace Js FieldWithBarrier(bool) m_isTopLevel : 1; // Indicates that this function is top-level function, currently being used in script profiler and debugger FieldWithBarrier(bool) m_isPublicLibraryCode: 1; // Indicates this function is public boundary library code that should be visible in JS stack + FieldWithBarrier(bool) m_isJsBuiltInCode: 1; // Indicates this function comes from the JS Built In implementation FieldWithBarrier(bool) m_canBeDeferred : 1; FieldWithBarrier(bool) m_displayNameIsRecyclerAllocated : 1; @@ -1924,13 +1739,16 @@ namespace Js void SetIsAsmjsMode(bool value) { m_isAsmjsMode = value; - #if DBG +#if DBG if (value) { m_wasEverAsmjsMode = true; } - #endif +#endif } +#if DBG + bool WasEverAsmJsMode() const { return m_wasEverAsmjsMode; } +#endif void SetIsWasmFunction(bool val) { @@ -2027,7 +1845,9 @@ namespace Js void SetReparsed(bool set) { m_reparsed = set; } bool IsMethod() const { return m_isMethod; } void SetIsMethod(bool set) { m_isMethod = set; } +#ifdef NTBUILD bool GetExternalDisplaySourceName(BSTR* sourceName); +#endif void CleanupToReparse(); void CleanupToReparseHelper(); @@ -2164,6 +1984,9 @@ namespace Js FieldWithBarrier(bool) m_dontInline : 1; // Used by the JIT's inliner FieldWithBarrier(bool) m_reparsed : 1; // Indicates if the function has been reparsed for debug attach/detach scenario. FieldWithBarrier(bool) m_isMethod : 1; // Function is an object literal method +#if DBG + FieldWithBarrier(bool) m_wasEverAsmjsMode : 1; // has m_isAsmjsMode ever been true +#endif // This field is not required for deferred parsing but because our thunks can't handle offsets > 128 bytes // yet, leaving this here for now. We can look at optimizing the function info and function proxy structures some @@ -2192,7 +2015,6 @@ namespace Js public: #if DBG - FieldWithBarrier(bool) m_wasEverAsmjsMode; // has m_isAsmjsMode ever been true FieldWithBarrier(Js::LocalFunctionId) deferredParseNextFunctionId; #endif #if DBG @@ -2530,6 +2352,8 @@ namespace Js FieldWithBarrier(bool) m_hasFirstTmpRegister : 1; FieldWithBarrier(bool) m_hasActiveReference : 1; + + FieldWithBarrier(bool) m_isJsBuiltInForceInline : 1; #if DBG FieldWithBarrier(bool) m_isSerialized : 1; #endif @@ -2541,10 +2365,6 @@ namespace Js FieldWithBarrier(bool) m_canDoStackNestedFunc : 1; #endif -#if DBG - FieldWithBarrier(bool) initializedExecutionModeAndLimits : 1; -#endif - #ifdef IR_VIEWER // whether IR Dump is enabled for this function (used by parseIR) FieldWithBarrier(bool) m_isIRDumpEnabled : 1; @@ -2556,21 +2376,11 @@ namespace Js FieldWithBarrier(byte) inlineDepth; // Used by inlining to avoid recursively inlining functions excessively - FieldWithBarrier(ExecutionMode) executionMode; - FieldWithBarrier(uint16) interpreterLimit; - FieldWithBarrier(uint16) autoProfilingInterpreter0Limit; - FieldWithBarrier(uint16) profilingInterpreter0Limit; - FieldWithBarrier(uint16) autoProfilingInterpreter1Limit; - FieldWithBarrier(uint16) simpleJitLimit; - FieldWithBarrier(uint16) profilingInterpreter1Limit; - FieldWithBarrier(uint16) fullJitThreshold; - FieldWithBarrier(uint16) fullJitRequeueThreshold; - FieldWithBarrier(uint16) committedProfiledIterations; - - FieldWithBarrier(uint) m_depth; // Indicates how many times the function has been entered (so increases by one on each recursive call, decreases by one when we're done) - - FieldWithBarrier(uint32) interpretedCount; - FieldWithBarrier(uint32) lastInterpretedCount; + FieldWithBarrier(FunctionExecutionStateMachine) executionState; + + // Indicates how many times the function has been entered (so increases by one on each recursive call, decreases by one when we're done) + FieldWithBarrier(uint) m_depth; + FieldWithBarrier(uint32) loopInterpreterLimit; FieldWithBarrier(uint32) debuggerScopeIndex; FieldWithBarrier(uint32) savedPolymorphicCacheState; @@ -2727,9 +2537,8 @@ namespace Js bool HasCachedScopePropIds() const { return hasCachedScopePropIds; } void SetHasCachedScopePropIds(bool has) { hasCachedScopePropIds = has; } - uint32 GetInterpretedCount() const { return interpretedCount; } - uint32 SetInterpretedCount(uint32 val) { return interpretedCount = val; } - uint32 IncreaseInterpretedCount() { return interpretedCount++; } + uint32 GetInterpretedCount() const; + uint32 IncreaseInterpretedCount(); uint32 GetLoopInterpreterLimit() const { return loopInterpreterLimit; } uint32 SetLoopInterpreterLimit(uint32 val) { return loopInterpreterLimit = val; } @@ -2740,11 +2549,14 @@ namespace Js size_t GetLoopBodyName(uint loopNumber, _Out_writes_opt_z_(sizeInChars) WCHAR* displayName, _In_ size_t sizeInChars); + void SetJsBuiltInForceInline() { m_isJsBuiltInForceInline = true; } + bool IsJsBuiltInForceInline() const { return m_isJsBuiltInForceInline; } + void AllocateLoopHeaders(); void ReleaseLoopHeaders(); Js::LoopHeader * GetLoopHeader(uint index) const; Js::LoopHeader * GetLoopHeaderWithLock(uint index) const; - Js::Var GetLoopHeaderArrayPtr() const + Js::LoopHeader * GetLoopHeaderArrayPtr() const { Assert(this->GetLoopHeaderArray() != nullptr); return this->GetLoopHeaderArray(); @@ -2805,13 +2617,10 @@ namespace Js FunctionEntryPointInfo *GetSimpleJitEntryPointInfo() const; void SetSimpleJitEntryPointInfo(FunctionEntryPointInfo *const entryPointInfo); - private: - void VerifyExecutionMode(const ExecutionMode executionMode) const; - public: - ExecutionMode GetDefaultInterpreterExecutionMode() const; + void SetAsmJsExecutionMode(); + void SetDefaultInterpreterExecutionMode(); ExecutionMode GetExecutionMode() const; ExecutionMode GetInterpreterExecutionMode(const bool isPostBailout); - void SetExecutionMode(const ExecutionMode executionMode); private: bool IsInterpreterExecutionMode() const; @@ -2823,15 +2632,7 @@ namespace Js void TransitionToSimpleJitExecutionMode(); void TransitionToFullJitExecutionMode(); - private: - void VerifyExecutionModeLimits(); - void InitializeExecutionModeAndLimits(); - public: void ReinitializeExecutionModeAndLimits(); - private: - void SetFullJitThreshold(const uint16 newFullJitThreshold, const bool skipSimpleJit = false); - void CommitExecutedIterations(); - void CommitExecutedIterations(uint16 &limit, const uint executedIterations); private: uint16 GetSimpleJitExecutedIterations() const; @@ -2856,8 +2657,6 @@ namespace Js bool DoSimpleJit() const; bool DoSimpleJitWithLock() const; bool DoSimpleJitDynamicProfile() const; - - private: bool DoInterpreterProfile() const; bool DoInterpreterProfileWithLock() const; bool DoInterpreterAutoProfile() const; @@ -3324,6 +3123,11 @@ namespace Js RegSlot GetOutParamMaxDepth(); void SetOutParamMaxDepth(RegSlot cOutParamsDepth); void CheckAndSetOutParamMaxDepth(RegSlot cOutParamsDepth); +#if _M_X64 + // 1 Var to push current m_outparam, 1 Var for "this" + // 6 Vars for register optimization in InterpreterStackFrame::OP_CallAsmInternalCommon + static constexpr RegSlot MinAsmJsOutParams() { return 1 + 1 + 6; } +#endif RegSlot GetYieldRegister(); @@ -3358,9 +3162,11 @@ namespace Js void EndExecution(); SourceInfo * GetSourceInfo() { return &this->m_sourceInfo; } +#ifdef ENABLE_SCRIPT_DEBUGGING bool InstallProbe(int offset); bool UninstallProbe(int offset); bool ProbeAtOffset(int offset, OpCode* pOriginalOpcode); +#endif static bool ShouldShareInlineCaches() { return CONFIG_FLAG(ShareInlineCaches); } @@ -3458,7 +3264,7 @@ namespace Js UnifiedRegex::RegexPattern *GetLiteralRegex(const uint index); UnifiedRegex::RegexPattern *GetLiteralRegexWithLock(const uint index); #ifdef ASMJS_PLAT - AsmJsFunctionInfo* GetAsmJsFunctionInfo()const { return static_cast(this->GetAuxPtr(AuxPointerType::AsmJsFunctionInfo)); } + AsmJsFunctionInfo* GetAsmJsFunctionInfo() const { return static_cast(this->GetAuxPtr(AuxPointerType::AsmJsFunctionInfo)); } AsmJsFunctionInfo* GetAsmJsFunctionInfoWithLock()const { return static_cast(this->GetAuxPtrWithLock(AuxPointerType::AsmJsFunctionInfo)); } AsmJsFunctionInfo* AllocateAsmJsFunctionInfo(); AsmJsModuleInfo* GetAsmJsModuleInfo()const { return static_cast(this->GetAuxPtr(AuxPointerType::AsmJsModuleInfo)); } @@ -3468,7 +3274,7 @@ namespace Js SetAuxPtr(AuxPointerType::AsmJsFunctionInfo, nullptr); SetAuxPtr(AuxPointerType::AsmJsModuleInfo, nullptr); } - bool IsAsmJSModule()const{ return this->GetAsmJsFunctionInfo() != nullptr; } + bool IsAsmJSModule() const { return m_isAsmjsMode && !m_isAsmJsFunction; } AsmJsModuleInfo* AllocateAsmJsModuleInfo(); #endif void SetLiteralRegex(const uint index, UnifiedRegex::RegexPattern *const pattern); @@ -3599,8 +3405,10 @@ namespace Js void SetEntryToProfileMode(); #endif +#ifdef ENABLE_SCRIPT_DEBUGGING void CheckAndRegisterFuncToDiag(ScriptContext *scriptContext); void SetEntryToDeferParseForDebugger(); +#endif void ClearEntryPoints(); void ResetEntryPoint(); void CleanupToReparseHelper(); @@ -3774,20 +3582,17 @@ namespace Js { } - bool IsFunctionScopeSlotArray() - { - return FunctionInfo::Is(slotArray[ScopeMetadataSlotIndex]); - } + bool IsDebuggerScopeSlotArray(); FunctionInfo* GetFunctionInfo() { - Assert(IsFunctionScopeSlotArray()); + Assert(!IsDebuggerScopeSlotArray()); return (FunctionInfo*)PointerValue(slotArray[ScopeMetadataSlotIndex]); } DebuggerScope* GetDebuggerScope() { - Assert(!IsFunctionScopeSlotArray()); + Assert(IsDebuggerScopeSlotArray()); return (DebuggerScope*)PointerValue(slotArray[ScopeMetadataSlotIndex]); } @@ -3895,7 +3700,7 @@ namespace Js Field(bool) strictMode; Field(uint16) length; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) Field(uint32) unused; #endif Field(void*) scopes[]; @@ -4113,6 +3918,9 @@ namespace Js // Used to track with, catch, and block scopes for the debugger to determine context. class DebuggerScope { + protected: + DEFINE_VTABLE_CTOR_NOBASE(DebuggerScope); + public: typedef JsUtil::List DebuggerScopePropertyList; @@ -4128,6 +3936,9 @@ namespace Js this->range.end = -1; } + virtual ~DebuggerScope() {} + + static bool Is(void* ptr); DebuggerScope * GetSiblingScope(RegSlot location, FunctionBody *functionBody); void AddProperty(RegSlot location, Js::PropertyId propertyId, DebuggerScopePropertyFlags flags); bool GetPropertyIndex(Js::PropertyId propertyId, int& i); @@ -4189,10 +4000,10 @@ namespace Js void EnsurePropertyListIsAllocated(); private: + FieldNoBarrier(Recycler*) recycler; Field(DebuggerScope*) parentScope; Field(regex::Interval) range; // The start and end byte code writer offsets used when comparing where the debugger is currently stopped at (breakpoint location). Field(RegSlot) scopeLocation; - FieldNoBarrier(Recycler*) recycler; }; class ScopeObjectChain diff --git a/deps/chakrashim/core/lib/Runtime/Base/FunctionExecutionStateMachine.cpp b/deps/chakrashim/core/lib/Runtime/Base/FunctionExecutionStateMachine.cpp new file mode 100644 index 00000000000..de15be7997f --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Base/FunctionExecutionStateMachine.cpp @@ -0,0 +1,844 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "RuntimeBasePch.h" +#include "FunctionExecutionStateMachine.h" + +namespace Js +{ + FunctionExecutionStateMachine::FunctionExecutionStateMachine() : + owner(nullptr), + executionState(ExecutionState::Interpreter), + interpreterLimit(0), + autoProfilingInterpreter0Limit(0), + profilingInterpreter0Limit(0), + autoProfilingInterpreter1Limit(0), + simpleJitLimit(0), + profilingInterpreter1Limit(0), + interpretedCount(0), + fullJitThreshold(0), + fullJitRequeueThreshold(0), + committedProfiledIterations(0), + lastInterpretedCount(0) +#if DBG + ,initializedExecutionModeAndLimits(false) +#endif + { + } + + void FunctionExecutionStateMachine::InitializeExecutionModeAndLimits(FunctionBody* functionBody) + { +#if DBG + initializedExecutionModeAndLimits = true; +#endif + // Assert we're either uninitialized, or being reinitialized on the same FunctionBody + Assert(owner == nullptr || owner == functionBody); + owner = functionBody; + + const ConfigFlagsTable &configFlags = Configuration::Global.flags; + + interpreterLimit = 0; + autoProfilingInterpreter0Limit = static_cast(configFlags.AutoProfilingInterpreter0Limit); + profilingInterpreter0Limit = static_cast(configFlags.ProfilingInterpreter0Limit); + autoProfilingInterpreter1Limit = static_cast(configFlags.AutoProfilingInterpreter1Limit); + simpleJitLimit = static_cast(configFlags.SimpleJitLimit); + profilingInterpreter1Limit = static_cast(configFlags.ProfilingInterpreter1Limit); + + // Based on which execution modes are disabled, calculate the number of additional iterations that need to be covered by + // the execution mode that will scale with the full JIT threshold + uint16 scale = 0; + const bool doInterpreterProfile = owner->DoInterpreterProfile(); + if (!doInterpreterProfile) + { + scale += + autoProfilingInterpreter0Limit + + profilingInterpreter0Limit + + autoProfilingInterpreter1Limit + + profilingInterpreter1Limit; + autoProfilingInterpreter0Limit = 0; + profilingInterpreter0Limit = 0; + autoProfilingInterpreter1Limit = 0; + profilingInterpreter1Limit = 0; + } + else if (!owner->DoInterpreterAutoProfile()) + { + scale += autoProfilingInterpreter0Limit + autoProfilingInterpreter1Limit; + autoProfilingInterpreter0Limit = 0; + autoProfilingInterpreter1Limit = 0; + if (!CONFIG_FLAG(NewSimpleJit)) + { + simpleJitLimit += profilingInterpreter0Limit; + profilingInterpreter0Limit = 0; + } + } + if (!owner->DoSimpleJit()) + { + if (!CONFIG_FLAG(NewSimpleJit) && doInterpreterProfile) + { + // The old simple JIT is off, but since it does profiling, it will be replaced with the profiling interpreter + profilingInterpreter1Limit += simpleJitLimit; + } + else + { + scale += simpleJitLimit; + } + simpleJitLimit = 0; + } + if (PHASE_OFF(FullJitPhase, owner)) + { + scale += profilingInterpreter1Limit; + profilingInterpreter1Limit = 0; + } + + uint16 fullJitThresholdConfig = + static_cast( + configFlags.AutoProfilingInterpreter0Limit + + configFlags.ProfilingInterpreter0Limit + + configFlags.AutoProfilingInterpreter1Limit + + configFlags.SimpleJitLimit + + configFlags.ProfilingInterpreter1Limit); + if (!configFlags.EnforceExecutionModeLimits) + { + /* + Scale the full JIT threshold based on some heuristics: + - If the % of code in loops is > 50, scale by 1 + - Byte-code size of code outside loops + - If the size is < 50, scale by 1.2 + - If the size is < 100, scale by 1.4 + - If the size is >= 100, scale by 1.6 + */ + const uint loopPercentage = owner->GetByteCodeInLoopCount() * 100 / max(1u, owner->GetByteCodeCount()); + const int byteCodeSizeThresholdForInlineCandidate = CONFIG_FLAG(LoopInlineThreshold); + bool delayFullJITThisFunc = + (CONFIG_FLAG(DelayFullJITSmallFunc) > 0) && (owner->GetByteCodeWithoutLDACount() <= (uint)byteCodeSizeThresholdForInlineCandidate); + + if (loopPercentage <= 50 || delayFullJITThisFunc) + { + const uint straightLineSize = owner->GetByteCodeCount() - owner->GetByteCodeInLoopCount(); + double fullJitDelayMultiplier; + if (delayFullJITThisFunc) + { + fullJitDelayMultiplier = CONFIG_FLAG(DelayFullJITSmallFunc) / 10.0; + } + else if (straightLineSize < 50) + { + fullJitDelayMultiplier = 1.2; + } + else if (straightLineSize < 100) + { + fullJitDelayMultiplier = 1.4; + } + else + { + fullJitDelayMultiplier = 1.6; + } + + const uint16 newFullJitThreshold = static_cast(fullJitThresholdConfig * fullJitDelayMultiplier); + scale += newFullJitThreshold - fullJitThresholdConfig; + fullJitThresholdConfig = newFullJitThreshold; + } + } + + Assert(fullJitThresholdConfig >= scale); + fullJitThreshold = fullJitThresholdConfig - scale; + SetInterpretedCount(0); + SetDefaultInterpreterExecutionMode(); + SetFullJitThreshold(fullJitThresholdConfig); + TryTransitionToNextInterpreterExecutionMode(); + } + + void FunctionExecutionStateMachine::ReinitializeExecutionModeAndLimits(FunctionBody* functionBody) + { + // TODO: Investigate what it would take to make this invariant hold. Currently fails in AsmJS tests + // Assert(initializedExecutionModeAndLimits); + + fullJitRequeueThreshold = 0; + committedProfiledIterations = 0; + InitializeExecutionModeAndLimits(functionBody); + } + + bool FunctionExecutionStateMachine::InterpretedSinceCallCountCollection() const + { + return interpretedCount != lastInterpretedCount; + } + + void FunctionExecutionStateMachine::CollectInterpretedCounts() + { + lastInterpretedCount = interpretedCount; + } + + ExecutionMode FunctionExecutionStateMachine::GetExecutionMode() const + { + ExecutionMode executionMode = StateToMode(executionState); + + VerifyExecutionMode(executionMode); + return executionMode; + } + + void FunctionExecutionStateMachine::SetExecutionState(ExecutionState state) + { + // TODO: Investigate what it would take to make this invariant hold + // Assert(state == GetDefaultInterpreterExecutionState() || IsTerminalState(state)); + VerifyExecutionMode(StateToMode(state)); + executionState = state; + } + + void FunctionExecutionStateMachine::SetAsmJsExecutionMode() + { + SetExecutionState(ExecutionState::FullJit); + } + + void FunctionExecutionStateMachine::SetDefaultInterpreterExecutionMode() + { + SetExecutionState(GetDefaultInterpreterExecutionState()); + } + + FunctionExecutionStateMachine::ExecutionState FunctionExecutionStateMachine::GetDefaultInterpreterExecutionState() const + { + if (!owner->DoInterpreterProfile()) + { + VerifyExecutionMode(ExecutionMode::Interpreter); + return ExecutionState::Interpreter; + } + else if (owner->DoInterpreterAutoProfile()) + { + VerifyExecutionMode(ExecutionMode::AutoProfilingInterpreter); + return ExecutionState::AutoProfilingInterpreter0; + } + else + { + VerifyExecutionMode(ExecutionMode::ProfilingInterpreter); + return ExecutionState::ProfilingInterpreter0; + } + } + + ExecutionMode FunctionExecutionStateMachine::GetInterpreterExecutionMode(const bool isPostBailout) + { + Assert(initializedExecutionModeAndLimits); + + if (isPostBailout && owner->DoInterpreterProfile()) + { + return ExecutionMode::ProfilingInterpreter; + } + + switch (GetExecutionMode()) + { + case ExecutionMode::Interpreter: + case ExecutionMode::AutoProfilingInterpreter: + case ExecutionMode::ProfilingInterpreter: + return GetExecutionMode(); + + case ExecutionMode::SimpleJit: + if (CONFIG_FLAG(NewSimpleJit)) + { + return StateToMode(GetDefaultInterpreterExecutionState()); + } + // fall through + + case ExecutionMode::FullJit: + { + const ExecutionMode executionMode = + owner->DoInterpreterProfile() ? ExecutionMode::ProfilingInterpreter : ExecutionMode::Interpreter; + VerifyExecutionMode(executionMode); + return executionMode; + } + + default: + Assert(false); + __assume(false); + } + } + + bool FunctionExecutionStateMachine::IsInterpreterExecutionMode() const + { + return GetExecutionMode() <= ExecutionMode::ProfilingInterpreter; + } + + uint16 FunctionExecutionStateMachine::GetSimpleJitExecutedIterations() const + { + Assert(initializedExecutionModeAndLimits); + Assert(GetExecutionMode() == ExecutionMode::SimpleJit); + + FunctionEntryPointInfo *const simpleJitEntryPointInfo = owner->GetSimpleJitEntryPointInfo(); + if (!simpleJitEntryPointInfo) + { + return 0; + } + + // Simple JIT counts down and transitions on overflow + const uint32 callCount = simpleJitEntryPointInfo->callsCount; + Assert(simpleJitLimit == 0 ? callCount == 0 : simpleJitLimit > callCount); + return callCount == 0 ? + static_cast(simpleJitLimit) : + static_cast(simpleJitLimit) - static_cast(callCount) - 1; + } + + void FunctionExecutionStateMachine::SetSimpleJitCallCount(const uint16 simpleJitLimit) const + { + Assert(GetExecutionMode() == ExecutionMode::SimpleJit); + Assert(owner->GetDefaultFunctionEntryPointInfo() == owner->GetSimpleJitEntryPointInfo()); + + // Simple JIT counts down and transitions on overflow + const uint8 limit = static_cast(min(0xffui16, simpleJitLimit)); + owner->GetSimpleJitEntryPointInfo()->callsCount = limit == 0 ? 0 : limit - 1; + } + + void FunctionExecutionStateMachine::SetFullJitRequeueThreshold(const uint16 newFullJitRequeueThreshold) + { + fullJitRequeueThreshold = newFullJitRequeueThreshold; + } + + void FunctionExecutionStateMachine::SetFullJitThreshold(const uint16 newFullJitThreshold, const bool skipSimpleJit) + { + Assert(initializedExecutionModeAndLimits); + Assert(GetExecutionMode() != ExecutionMode::FullJit); + + int scale = newFullJitThreshold - fullJitThreshold; + if (scale == 0) + { + VerifyExecutionModeLimits(); + return; + } + fullJitThreshold = newFullJitThreshold; + + const auto ScaleLimit = [&](uint16 &limit) -> bool + { + Assert(scale != 0); + const int limitScale = max(-static_cast(limit), scale); + const int newLimit = limit + limitScale; + Assert(static_cast(static_cast(newLimit)) == newLimit); + limit = static_cast(newLimit); + scale -= limitScale; + Assert(limit == 0 || scale == 0); + + if (&limit == &simpleJitLimit) + { + FunctionEntryPointInfo *const simpleJitEntryPointInfo = owner->GetSimpleJitEntryPointInfo(); + if (owner->GetDefaultFunctionEntryPointInfo() == simpleJitEntryPointInfo) + { + Assert(GetExecutionMode() == ExecutionMode::SimpleJit); + const int newSimpleJitCallCount = max(0, (int)simpleJitEntryPointInfo->callsCount + limitScale); + Assert(static_cast(static_cast(newSimpleJitCallCount)) == newSimpleJitCallCount); + SetSimpleJitCallCount(static_cast(newSimpleJitCallCount)); + } + } + + return scale == 0; + }; + + /* + Determine which execution mode's limit scales with the full JIT threshold, in order of preference: + - New simple JIT + - Auto-profiling interpreter 1 + - Auto-profiling interpreter 0 + - Interpreter + - Profiling interpreter 0 (when using old simple JIT) + - Old simple JIT + - Profiling interpreter 1 + - Profiling interpreter 0 (when using new simple JIT) + */ + const bool doSimpleJit = owner->DoSimpleJit(); + const bool doInterpreterProfile = owner->DoInterpreterProfile(); + const bool fullyScaled = + (CONFIG_FLAG(NewSimpleJit) && doSimpleJit && ScaleLimit(simpleJitLimit)) || + ( + doInterpreterProfile + ? owner->DoInterpreterAutoProfile() && + (ScaleLimit(autoProfilingInterpreter1Limit) || ScaleLimit(autoProfilingInterpreter0Limit)) + : ScaleLimit(interpreterLimit) + ) || + ( + CONFIG_FLAG(NewSimpleJit) + ? doInterpreterProfile && + (ScaleLimit(profilingInterpreter1Limit) || ScaleLimit(profilingInterpreter0Limit)) + : (doInterpreterProfile && ScaleLimit(profilingInterpreter0Limit)) || + (doSimpleJit && ScaleLimit(simpleJitLimit)) || + (doInterpreterProfile && ScaleLimit(profilingInterpreter1Limit)) + ); + Assert(fullyScaled); + Assert(scale == 0); + + if (GetExecutionMode() != ExecutionMode::SimpleJit) + { + Assert(IsInterpreterExecutionMode()); + if (simpleJitLimit != 0 && + (skipSimpleJit || simpleJitLimit < DEFAULT_CONFIG_MinSimpleJitIterations) && + !PHASE_FORCE(Phase::SimpleJitPhase, owner)) + { + // Simple JIT code has not yet been generated, and was either requested to be skipped, or the limit was scaled + // down too much. Skip simple JIT by moving any remaining iterations to an equivalent interpreter execution + // mode. + (CONFIG_FLAG(NewSimpleJit) ? autoProfilingInterpreter1Limit : profilingInterpreter1Limit) += simpleJitLimit; + simpleJitLimit = 0; + TryTransitionToNextInterpreterExecutionMode(); + } + } + + VerifyExecutionModeLimits(); + } + + FunctionExecutionStateMachine::ExecutionState FunctionExecutionStateMachine::ModeToState(ExecutionMode mode) const + { + switch (mode) + { + case ExecutionMode::AutoProfilingInterpreter: + return ExecutionState::AutoProfilingInterpreter0; + + case ExecutionMode::ProfilingInterpreter: + return ExecutionState::ProfilingInterpreter0; + + case ExecutionMode::SimpleJit: + return ExecutionState::SimpleJit; + + case ExecutionMode::FullJit: + return ExecutionState::FullJit; + + default: + Assert(!"Unexpected ExecutionMode for ExecutionState"); + // fall through + case ExecutionMode::Interpreter: + return ExecutionState::Interpreter; + } + } + + ExecutionMode FunctionExecutionStateMachine::StateToMode(ExecutionState state) const + { + switch (state) + { + case ExecutionState::AutoProfilingInterpreter0: + case ExecutionState::AutoProfilingInterpreter1: + return ExecutionMode::AutoProfilingInterpreter; + + case ExecutionState::ProfilingInterpreter0: + case ExecutionState::ProfilingInterpreter1: + return ExecutionMode::ProfilingInterpreter; + + case ExecutionState::SimpleJit: + return ExecutionMode::SimpleJit; + + case ExecutionState::FullJit: + return ExecutionMode::FullJit; + + default: + Assert(!"Unexpected ExecutionState for ExecutionMode"); + // fall through + case ExecutionState::Interpreter: + return ExecutionMode::Interpreter; + } + } + + uint16& FunctionExecutionStateMachine::GetStateLimit(ExecutionState state) + { + switch (state) + { + case ExecutionState::Interpreter: + return interpreterLimit; + + case ExecutionState::AutoProfilingInterpreter0: + return autoProfilingInterpreter0Limit; + + case ExecutionState::AutoProfilingInterpreter1: + return autoProfilingInterpreter1Limit; + + case ExecutionState::ProfilingInterpreter0: + return profilingInterpreter0Limit; + + case ExecutionState::ProfilingInterpreter1: + return profilingInterpreter1Limit; + + case ExecutionState::SimpleJit: + return simpleJitLimit; + + default: + Assert(!"Unexpected ExecutionState for limit"); + return interpreterLimit; + } + } + + // An execution state is terminal if the current FunctionExecutionStateMachine's limits + // allow the state to continue to run. + // FullJit is always a terminal state and is the last terminal state. + bool FunctionExecutionStateMachine::IsTerminalState(ExecutionState state) + { + return state == ExecutionState::FullJit || GetStateLimit(state) != 0; + } + + // Safely moves from one execution mode to another and updates appropriate class members for the next + // mode. Note that there are other functions that modify execution state that do not involve this function. + // This function transitions ExecutionMode as ExecutionState in the following order: + // + // +-- Interpreter + // | + // | AutoProfilingInterpreter --+ + // | | ^ | + // | | | v + // | | | SimpleJit + // | v | | + // | ProfilingInterpreter <----+ + // | | + // | | + // | v + // +-> FullJit + // + // Transition to the next mode occurs when the limit for the current execution mode reaches 0. + // Returns true when a transition occurs (i.e., the execution state was updated since the beginning of + // this function call). Otherwise, returns false to indicate no change in state. + // See more details of each mode in ExecutionModes.h + bool FunctionExecutionStateMachine::TryTransitionToNextExecutionMode() + { + Assert(initializedExecutionModeAndLimits); + + bool isStateChanged = false; + if (executionState != ExecutionState::FullJit) + { + bool isTransitionNeeded; + uint16& stateLimit = GetStateLimit(executionState); + FunctionEntryPointInfo *const simpleJitEntryPointInfo = owner->GetSimpleJitEntryPointInfo(); + + // Determine if the current state should not transition when + // - for non-JITed states, the interpreted count is less than the limit + // - for JITed states (specifically, SimpleJIT because it can transition), the callsCount + // is non-zero. CallsCount starts at the limit and decrements to 0 to indicate transition. + if ((executionState != ExecutionState::SimpleJit && GetInterpretedCount() < stateLimit) + || (simpleJitEntryPointInfo != nullptr && simpleJitEntryPointInfo->callsCount > 0)) + { + // Since the current state is under its limit, no transition is needed. + // Simply verify the current state's execution mode before returning. + isTransitionNeeded = false; + } + else + { + // Since the current state's limit is reached, transition from this state to the next state + // First, save data from the current state + CommitExecutedIterations(stateLimit, stateLimit); + + // Then, reset data for the next state + SetInterpretedCount(0); + + isTransitionNeeded = true; + } + + if (isTransitionNeeded) + { + // Keep advancing the state until a terminal state is found or until there are no more + // states to reach. The path of advancement is described in the banner comment above. + ExecutionState newState = executionState; + while (isTransitionNeeded && !IsTerminalState(newState)) + { + if (newState != ExecutionState::Interpreter) + { + // Most states simply advance to the next state + newState = static_cast(static_cast(newState) + 1); + } + else + { + // Interpreter advances straight to FullJit + newState = ExecutionState::FullJit; + } + + // If FullJit is the next state, but FullJit is disabled, then no transition + // is needed. + if (newState == ExecutionState::FullJit && PHASE_OFF(FullJitPhase, owner)) + { + isTransitionNeeded = false; + } + else + { + // Otherwise, transition is needed because there is new state available + isTransitionNeeded = true; + } + } + + // Only update the execution state when the new state is a terminal state + if (isTransitionNeeded && IsTerminalState(newState)) + { + Assert(newState != executionState); + SetExecutionState(newState); + isStateChanged = true; + } + } + } + + return isStateChanged; + } + + void FunctionExecutionStateMachine::TryTransitionToNextInterpreterExecutionMode() + { + Assert(IsInterpreterExecutionMode()); + + TryTransitionToNextExecutionMode(); + SetExecutionState(ModeToState(GetInterpreterExecutionMode(false))); + } + + bool FunctionExecutionStateMachine::TryTransitionToJitExecutionMode() + { + const ExecutionMode previousExecutionMode = GetExecutionMode(); + + TryTransitionToNextExecutionMode(); + switch (GetExecutionMode()) + { + case ExecutionMode::SimpleJit: + break; + + case ExecutionMode::FullJit: + if (fullJitRequeueThreshold == 0) + { + break; + } + --fullJitRequeueThreshold; + return false; + + default: + return false; + } + + if (GetExecutionMode() != previousExecutionMode) + { + owner->TraceExecutionMode(); + } + return true; + } + + void FunctionExecutionStateMachine::TransitionToSimpleJitExecutionMode() + { + CommitExecutedIterations(); + + interpreterLimit = 0; + autoProfilingInterpreter0Limit = 0; + profilingInterpreter0Limit = 0; + autoProfilingInterpreter1Limit = 0; + fullJitThreshold = simpleJitLimit + profilingInterpreter1Limit; + + VerifyExecutionModeLimits(); + SetExecutionState(ExecutionState::SimpleJit); + } + + void FunctionExecutionStateMachine::TransitionToFullJitExecutionMode() + { + CommitExecutedIterations(); + + interpreterLimit = 0; + autoProfilingInterpreter0Limit = 0; + profilingInterpreter0Limit = 0; + autoProfilingInterpreter1Limit = 0; + simpleJitLimit = 0; + profilingInterpreter1Limit = 0; + fullJitThreshold = 0; + + VerifyExecutionModeLimits(); + SetExecutionState(ExecutionState::FullJit); + } + + void FunctionExecutionStateMachine::SetIsSpeculativeJitCandidate() + { + // This function is a candidate for speculative JIT. Ensure that it is profiled immediately by transitioning out of the + // auto-profiling interpreter mode. + if (GetExecutionMode() != ExecutionMode::AutoProfilingInterpreter || GetProfiledIterations() != 0) + { + return; + } + + owner->TraceExecutionMode("IsSpeculativeJitCandidate (before)"); + + if (autoProfilingInterpreter0Limit != 0) + { + (profilingInterpreter0Limit == 0 ? profilingInterpreter0Limit : autoProfilingInterpreter1Limit) += + autoProfilingInterpreter0Limit; + autoProfilingInterpreter0Limit = 0; + } + else if (profilingInterpreter0Limit == 0) + { + profilingInterpreter0Limit += autoProfilingInterpreter1Limit; + autoProfilingInterpreter1Limit = 0; + } + + owner->TraceExecutionMode("IsSpeculativeJitCandidate"); + + TryTransitionToNextInterpreterExecutionMode(); + } + + void FunctionExecutionStateMachine::ResetSimpleJitLimit() + { + Assert(initializedExecutionModeAndLimits); + + SetExecutionState(ExecutionState::SimpleJit); + + const uint16 simpleJitNewLimit = static_cast(Configuration::Global.flags.SimpleJitLimit); + if (simpleJitLimit < simpleJitNewLimit) + { + fullJitThreshold += simpleJitNewLimit - simpleJitLimit; + simpleJitLimit = simpleJitNewLimit; + } + + SetInterpretedCount(0); + } + + uint16 FunctionExecutionStateMachine::GetProfiledIterations() const + { + Assert(initializedExecutionModeAndLimits); + + uint16 profiledIterations = committedProfiledIterations; + switch (GetExecutionMode()) + { + case ExecutionMode::ProfilingInterpreter: + { + uint32 interpretedCount = GetInterpretedCount(); + const uint16 clampedInterpretedCount = + interpretedCount <= UINT16_MAX + ? static_cast(interpretedCount) + : UINT16_MAX; + const uint16 newProfiledIterations = profiledIterations + clampedInterpretedCount; + profiledIterations = newProfiledIterations >= profiledIterations ? newProfiledIterations : UINT16_MAX; + break; + } + + case ExecutionMode::SimpleJit: + if (!CONFIG_FLAG(NewSimpleJit)) + { + const uint16 newProfiledIterations = profiledIterations + GetSimpleJitExecutedIterations(); + profiledIterations = newProfiledIterations >= profiledIterations ? newProfiledIterations : UINT16_MAX; + } + break; + } + return profiledIterations; + } + + void FunctionExecutionStateMachine::CommitExecutedIterations() + { + Assert(initializedExecutionModeAndLimits); + + switch (GetExecutionMode()) + { + case ExecutionMode::Interpreter: + CommitExecutedIterations(interpreterLimit, GetInterpretedCount()); + break; + + case ExecutionMode::AutoProfilingInterpreter: + CommitExecutedIterations( + autoProfilingInterpreter0Limit == 0 && profilingInterpreter0Limit == 0 + ? autoProfilingInterpreter1Limit + : autoProfilingInterpreter0Limit, + GetInterpretedCount()); + break; + + case ExecutionMode::ProfilingInterpreter: + CommitExecutedIterations( + owner->GetSimpleJitEntryPointInfo() + ? profilingInterpreter1Limit + : profilingInterpreter0Limit, + GetInterpretedCount()); + break; + + case ExecutionMode::SimpleJit: + CommitExecutedIterations(simpleJitLimit, GetSimpleJitExecutedIterations()); + break; + + case ExecutionMode::FullJit: + break; + + default: + Assert(false); + __assume(false); + } + } + + void FunctionExecutionStateMachine::CommitExecutedIterations(uint16 &limit, const uint executedIterations) + { + Assert(initializedExecutionModeAndLimits); + Assert( + &limit == &interpreterLimit || + &limit == &autoProfilingInterpreter0Limit || + &limit == &profilingInterpreter0Limit || + &limit == &autoProfilingInterpreter1Limit || + &limit == &simpleJitLimit || + &limit == &profilingInterpreter1Limit); + + const uint16 clampedExecutedIterations = executedIterations >= limit ? limit : static_cast(executedIterations); + Assert(fullJitThreshold >= clampedExecutedIterations); + fullJitThreshold -= clampedExecutedIterations; + limit -= clampedExecutedIterations; + VerifyExecutionModeLimits(); + + if (&limit == &profilingInterpreter0Limit || + (!CONFIG_FLAG(NewSimpleJit) && &limit == &simpleJitLimit) || + &limit == &profilingInterpreter1Limit) + { + const uint16 newCommittedProfiledIterations = committedProfiledIterations + clampedExecutedIterations; + committedProfiledIterations = + newCommittedProfiledIterations >= committedProfiledIterations ? newCommittedProfiledIterations : UINT16_MAX; + } + } + + void FunctionExecutionStateMachine::VerifyExecutionModeLimits() const + { + Assert(initializedExecutionModeAndLimits); + Assert( + ( + interpreterLimit + + autoProfilingInterpreter0Limit + + profilingInterpreter0Limit + + autoProfilingInterpreter1Limit + + simpleJitLimit + + profilingInterpreter1Limit + ) == fullJitThreshold); + } + + void FunctionExecutionStateMachine::VerifyExecutionMode(const ExecutionMode executionMode) const + { +#if DBG + Assert(initializedExecutionModeAndLimits); + Assert(executionMode < ExecutionMode::Count); + + switch (executionMode) + { + case ExecutionMode::Interpreter: + Assert(!owner->DoInterpreterProfile()); + break; + + case ExecutionMode::AutoProfilingInterpreter: + Assert(owner->DoInterpreterProfile()); + Assert(owner->DoInterpreterAutoProfile()); + break; + + case ExecutionMode::ProfilingInterpreter: + Assert(owner->DoInterpreterProfile()); + break; + + case ExecutionMode::SimpleJit: + Assert(owner->DoSimpleJit()); + break; + + case ExecutionMode::FullJit: + Assert(!PHASE_OFF(FullJitPhase, owner)); + break; + + default: + Assert(false); + __assume(false); + } +#else + UNREFERENCED_PARAMETER(executionMode); +#endif + } + + void FunctionExecutionStateMachine::PrintLimits() const + { + Output::Print( + _u("limits: %hu.%hu.%hu.%hu.%hu = %hu"), + interpreterLimit + autoProfilingInterpreter0Limit, + profilingInterpreter0Limit, + autoProfilingInterpreter1Limit, + simpleJitLimit, + profilingInterpreter1Limit, + fullJitThreshold); + } + + void FunctionExecutionStateMachine::AssertIsInitialized() const + { +#if DBG + Assert(initializedExecutionModeAndLimits); + Assert(owner != nullptr); +#endif + } +} diff --git a/deps/chakrashim/core/lib/Runtime/Base/FunctionExecutionStateMachine.h b/deps/chakrashim/core/lib/Runtime/Base/FunctionExecutionStateMachine.h new file mode 100644 index 00000000000..19c3f9b10cc --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Base/FunctionExecutionStateMachine.h @@ -0,0 +1,118 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +namespace Js +{ + class FunctionExecutionStateMachine + { + public: + FunctionExecutionStateMachine(); + void InitializeExecutionModeAndLimits(FunctionBody* functionBody); + void ReinitializeExecutionModeAndLimits(FunctionBody* functionBody); + + // Public Getters and Setters + ExecutionMode GetExecutionMode() const; + void SetDefaultInterpreterExecutionMode(); + void SetAsmJsExecutionMode(); + + // Interpreter-related functions + ExecutionMode GetInterpreterExecutionMode(const bool isPostBailout); + bool IsInterpreterExecutionMode() const; + uint16 GetProfiledIterations() const; + uint32 GetInterpretedCount() const { return interpretedCount; } + uint32 SetInterpretedCount(uint32 val) { return interpretedCount = val; } + uint32 IncreaseInterpretedCount() { return interpretedCount++; } + bool InterpretedSinceCallCountCollection() const; + void CollectInterpretedCounts(); + void CommitExecutedIterations(); + + // JIT-relatedfunctions + void SetIsSpeculativeJitCandidate(); + uint16 GetSimpleJitLimit() const { return simpleJitLimit; } + void ResetSimpleJitLimit(); + uint16 GetSimpleJitExecutedIterations() const; + void SetSimpleJitCallCount(const uint16 simpleJitLimit) const; + void SetFullJitThreshold(const uint16 newFullJitThreshold, const bool skipSimpleJit = false); + uint16 GetFullJitThreshold() const { return fullJitThreshold; } + void SetFullJitRequeueThreshold(const uint16 newFullJitRequeueThreshold); + + // Transition functions + bool TryTransitionToNextExecutionMode(); + void TryTransitionToNextInterpreterExecutionMode(); + bool TryTransitionToJitExecutionMode(); + void TransitionToSimpleJitExecutionMode(); + void TransitionToFullJitExecutionMode(); + + // Debug functions + void PrintLimits() const; + void AssertIsInitialized() const; + + private: + // This enum creates a linear view of the progression of ExecutionModes, as + // described in the banner comment for TryTransitionToNextExecutionMode. Each + // state has an associated member variable for the state's limit. + // For more information about ExecutionModes, see ExecutionModes.h. + enum class ExecutionState : uint8 + { + Interpreter, + AutoProfilingInterpreter0, + ProfilingInterpreter0, + AutoProfilingInterpreter1, + SimpleJit, + ProfilingInterpreter1, + FullJit + }; + + + ExecutionState ModeToState(ExecutionMode mode) const; + ExecutionMode StateToMode(ExecutionState state) const; + + uint16& GetStateLimit(ExecutionState state); + bool IsTerminalState(ExecutionState state); + void SetExecutionState(ExecutionState state); + ExecutionState GetDefaultInterpreterExecutionState() const; + + void CommitExecutedIterations(uint16 &limit, const uint executedIterations); + + void VerifyExecutionMode(const ExecutionMode executionMode) const; + void VerifyExecutionModeLimits() const; + + // This state machine should be a member of this owner FunctionBody + FieldWithBarrier(FunctionBody*) owner; + + // Tracks the current execution state. See ExecutionModes.h for more info. + FieldWithBarrier(ExecutionState) executionState; + + // Each of the following limits below is decremented when transitioning from its related mode: + // Number of times to run interpreter (no profiling) before advancing to next mode + FieldWithBarrier(uint16) interpreterLimit; + // Number of times to run interpreter (min profiling) before advancing to next mode + FieldWithBarrier(uint16) autoProfilingInterpreter0Limit; + // Number of times to run interpreter (full profiling) before advancing to next mode + FieldWithBarrier(uint16) profilingInterpreter0Limit; + // Number of times to run interpreter (min profiling) after already running min and full profiling + FieldWithBarrier(uint16) autoProfilingInterpreter1Limit; + // Number of times to run simple JIT before advancing to next mode + FieldWithBarrier(uint16) simpleJitLimit; + // Number of times to run interpreter (full profiling) before advancing to next mode + FieldWithBarrier(uint16) profilingInterpreter1Limit; + + // Total limit to run in non-full JIT execution mode. Typically the sum of the other limits + FieldWithBarrier(uint16) fullJitThreshold; + // Number of attempts to schedule FullJIT until it becomes forced + FieldWithBarrier(uint16) fullJitRequeueThreshold; + // Total number of times this function has run under the interpreter with full profiling + FieldWithBarrier(uint16) committedProfiledIterations; + // Number of times this function has run under the interpreter in the current execution mode + FieldWithBarrier(uint32) interpretedCount; + // Used to detect when interpretedCount changed from a particular call + FieldWithBarrier(uint32) lastInterpretedCount; + +#if DBG + FieldWithBarrier(bool) initializedExecutionModeAndLimits; +#endif + }; +}; diff --git a/deps/chakrashim/core/lib/Runtime/Base/FunctionInfo.cpp b/deps/chakrashim/core/lib/Runtime/Base/FunctionInfo.cpp index 60cd71fc6e0..e75bd00c5a9 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/FunctionInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/FunctionInfo.cpp @@ -29,15 +29,6 @@ namespace Js } - bool FunctionInfo::Is(void* ptr) - { - if(!ptr) - { - return false; - } - return VirtualTableInfo::HasVirtualTable(ptr); - } - void FunctionInfo::VerifyOriginalEntryPoint() const { Assert(!this->HasBody() || this->IsDeferredParseFunction() || this->IsDeferredDeserializeFunction() || this->GetFunctionProxy()->HasValidEntryPoint()); @@ -70,6 +61,6 @@ namespace Js FunctionInfo::Attributes FunctionInfo::GetAttributes(Js::RecyclableObject * function) { return function->GetTypeId() == Js::TypeIds_Function ? - Js::JavascriptFunction::FromVar(function)->GetFunctionInfo()->GetAttributes() : Js::FunctionInfo::None; + Js::JavascriptFunction::UnsafeFromVar(function)->GetFunctionInfo()->GetAttributes() : Js::FunctionInfo::None; } } diff --git a/deps/chakrashim/core/lib/Runtime/Base/FunctionInfo.h b/deps/chakrashim/core/lib/Runtime/Base/FunctionInfo.h index 5c8095d22bd..3b8dcf7466a 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/FunctionInfo.h +++ b/deps/chakrashim/core/lib/Runtime/Base/FunctionInfo.h @@ -9,13 +9,11 @@ namespace Js class ParseableFunctionInfo; class DeferDeserializeFunctionInfo; - class FunctionInfo: public FinalizableObject + class FunctionInfo { friend class RemoteFunctionBody; - protected: - DEFINE_VTABLE_CTOR_NOBASE(FunctionInfo); - public: + public: enum Attributes : uint32 { None = 0x00000, @@ -46,7 +44,6 @@ namespace Js FunctionInfo(JavascriptMethod entryPoint, _no_write_barrier_tag, Attributes attributes = None, LocalFunctionId functionId = Js::Constants::NoFunctionId, FunctionProxy* functionBodyImpl = nullptr); FunctionInfo(FunctionInfo& that); // Todo: (leish)(swb) find a way to prevent non-static initializer calling this ctor - static bool Is(void *ptr); static DWORD GetFunctionBodyImplOffset() { return offsetof(FunctionInfo, functionBodyImpl); } static BYTE GetOffsetOfFunctionProxy() { @@ -116,16 +113,6 @@ namespace Js uint GetCompileCount() const { return compileCount; } void SetCompileCount(uint count) { compileCount = count; } - virtual void Finalize(bool isShutdown) override - { - } - - virtual void Dispose(bool isShutdown) override - { - } - - virtual void Mark(Recycler *recycler) override { AssertMsg(false, "Mark called on object that isn't TrackableObject"); } - BOOL IsDeferredDeserializeFunction() const { return ((this->attributes & DeferredDeserialize) == DeferredDeserialize); } BOOL IsDeferredParseFunction() const { return ((this->attributes & DeferredParse) == DeferredParse); } void SetCapturesThis() { attributes = (Attributes)(attributes | Attributes::CapturesThis); } diff --git a/deps/chakrashim/core/lib/Runtime/Base/JnDirectFields.h b/deps/chakrashim/core/lib/Runtime/Base/JnDirectFields.h index b77e95a424c..26f9a306fca 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/JnDirectFields.h +++ b/deps/chakrashim/core/lib/Runtime/Base/JnDirectFields.h @@ -158,6 +158,7 @@ ENTRY(blink) ENTRY(bold) ENTRY2(boolean_, _u("boolean")) // "boolean" cannot be an identifier in C++ so using "boolean_" instead ENTRY(Boolean) +ENTRY(JsBuiltIn) ENTRY(call) ENTRY(CanvasPixelArray) ENTRY(cast) @@ -182,6 +183,7 @@ ENTRY2(delete_, _u("delete")) // "delete" cannot be an identifier in C++ so usin ENTRY2(star_, _u("*")) ENTRY(deleteProperty) ENTRY(description) +ENTRY(detach) ENTRY(done) ENTRY(E) ENTRY(encodeURI) @@ -245,6 +247,7 @@ ENTRY(includes) ENTRY(indexOf) ENTRY(Infinity) ENTRY(Intl) +ENTRY(invokeJit) ENTRY(is) ENTRY(isArray) ENTRY(isConcatSpreadable) @@ -444,7 +447,6 @@ ENTRY(toStringTag) ENTRY(toTimeString) ENTRY(toUpperCase) ENTRY(toUTCString) -ENTRY(transfer) ENTRY(trim) ENTRY(trimLeft) ENTRY(trimRight) @@ -717,6 +719,18 @@ ENTRY(Common) ENTRY(Promise) ENTRY(MissingProperty) ENTRY(winglob) +//Built In +ENTRY(__chakraLibrary) +ENTRY(registerChakraLibraryFunction) +ENTRY(registerFunction) +ENTRY(className) +ENTRY(methodName) +ENTRY(argumentsCount) +ENTRY(forceInline) +ENTRY(alias) +ENTRY(GetLength) +ENTRY(GetIteratorPrototype) +ENTRY(InitInternalProperties) // These are ES5/6/7+ builtins that are tracked for telemetry purposes, but currently not implemented by Chakra or are otherwise special. // IMPORTANT NOTE: See notes at top of this file regarding GenByteCode and test failures after changing this list. diff --git a/deps/chakrashim/core/lib/Runtime/Base/LeaveScriptObject.cpp b/deps/chakrashim/core/lib/Runtime/Base/LeaveScriptObject.cpp index 5fd53139491..0d2c48989c8 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/LeaveScriptObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/LeaveScriptObject.cpp @@ -7,7 +7,7 @@ namespace Js { EnterScriptObject::EnterScriptObject(ScriptContext* scriptContext, ScriptEntryExitRecord* entryExitRecord, - void * returnAddress, bool doCleanup, bool isCallRoot, bool hasCaller) + void * addrOfReturnAddress, bool doCleanup, bool isCallRoot, bool hasCaller) { Assert(scriptContext); @@ -35,7 +35,7 @@ namespace Js false; // Initialize the entry exit record - entryExitRecord->returnAddrOfScriptEntryFunction = returnAddress; + entryExitRecord->addrOfReturnAddrOfScriptEntryFunction = addrOfReturnAddress; entryExitRecord->hasCaller = hasCaller; entryExitRecord->scriptContext = scriptContext; #ifdef EXCEPTION_CHECK diff --git a/deps/chakrashim/core/lib/Runtime/Base/LeaveScriptObject.h b/deps/chakrashim/core/lib/Runtime/Base/LeaveScriptObject.h index beb48f08409..f1b9694fe31 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/LeaveScriptObject.h +++ b/deps/chakrashim/core/lib/Runtime/Base/LeaveScriptObject.h @@ -21,7 +21,7 @@ Js::ScriptEntryExitRecord __entryExitRecord = {0}; \ SAVE_FS0(); \ Js::EnterScriptObject __enterScriptObject = Js::EnterScriptObject(__localScriptContext, &__entryExitRecord, \ - _ReturnAddress(), doCleanup, isCallRoot, hasCaller); \ + _AddressOfReturnAddress(), doCleanup, isCallRoot, hasCaller); \ __localScriptContext->OnScriptStart(isCallRoot, isScript); \ __enterScriptObject.VerifyEnterScript(); @@ -137,7 +137,7 @@ namespace Js JavascriptLibrary* library; // stack pin the library. public: EnterScriptObject(ScriptContext* scriptContext, ScriptEntryExitRecord* entryExitRecord, - void * returnAddress, bool doCleanup, bool isCallRoot, bool hasCaller); + void * addrOfReturnAddress, bool doCleanup, bool isCallRoot, bool hasCaller); void VerifyEnterScript(); diff --git a/deps/chakrashim/core/lib/Runtime/Base/LineOffsetCache.cpp b/deps/chakrashim/core/lib/Runtime/Base/LineOffsetCache.cpp new file mode 100644 index 00000000000..e62530f51a6 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Base/LineOffsetCache.cpp @@ -0,0 +1,248 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "RuntimeBasePch.h" + +namespace Js +{ + int LineOffsetCache::FindLineForCharacterOffset( + _In_z_ LPCUTF8 sourceStartCharacter, + _In_z_ LPCUTF8 sourceEndCharacter, + charcount_t &inOutLineCharOffset, + charcount_t &inOutByteOffset, + charcount_t characterOffset) + { + int lastLine = 0; + + while (FindNextLine(sourceStartCharacter, sourceEndCharacter, inOutLineCharOffset, inOutByteOffset, characterOffset)) + { + lastLine++; + } + + return lastLine; + } + + LineOffsetCache::LineOffsetCache(Recycler* allocator, + _In_z_ LPCUTF8 sourceStartCharacter, + _In_z_ LPCUTF8 sourceEndCharacter, + charcount_t startingCharacterOffset, + charcount_t startingByteOffset) : + lineCharacterOffsetCacheList(nullptr), + lineByteOffsetCacheList(nullptr) + { + AssertMsg(allocator, "An allocator must be supplied to the cache for allocation of items."); + this->BuildCache(allocator, sourceStartCharacter, sourceEndCharacter, startingCharacterOffset, startingByteOffset); + } + + LineOffsetCache::LineOffsetCache(Recycler *allocator, + _In_reads_(numberOfLines) const charcount_t *lineCharacterOffsets, + _In_reads_opt_(numberOfLines) const charcount_t *lineByteOffsets, + __in int numberOfLines) + { + this->lineCharacterOffsetCacheList = LineOffsetCacheReadOnlyList::New(allocator, (charcount_t *)lineCharacterOffsets, numberOfLines); + if (lineByteOffsets) + { + this->lineByteOffsetCacheList = LineOffsetCacheReadOnlyList::New(allocator, (charcount_t *)lineByteOffsets, numberOfLines); + } + else + { + this->lineByteOffsetCacheList = nullptr; + } + } + + // outLineCharOffset - The character offset of the start of the line returned + int LineOffsetCache::GetLineForCharacterOffset(charcount_t characterOffset, charcount_t *outLineCharOffset, charcount_t *outByteOffset) + { + Assert(this->lineCharacterOffsetCacheList->Count() > 0); + + // The list is sorted, so binary search to find the line info. + int closestIndex = -1; + int minRange = INT_MAX; + + this->lineCharacterOffsetCacheList->BinarySearch([&](const charcount_t item, int index) + { + int offsetRange = characterOffset - item; + if (offsetRange >= 0) + { + if (offsetRange < minRange) + { + // There are potentially many lines with starting offsets greater than the one we're searching + // for. As a result, we should track which index we've encountered so far that is the closest + // to the offset we're looking for without going under. This will find the line that contains + // the offset. + closestIndex = index; + minRange = offsetRange; + } + + // Search lower to see if we can find a closer index. + return -1; + } + else + { + // Search higher to get into a range that is greater than the offset. + return 1; + } + + // Note that we purposely don't return 0 (==) here. We want the search to end in failure (-1) because + // we're searching for the closest element, not necessarily an exact element offset. Exact offsets + // are possible when the offset we're searching for is the first character of the line, but that will + // be handled by the if statement above. + }); + + if (closestIndex >= 0) + { + charcount_t lastItemCharacterOffset = GetCharacterOffsetForLine(closestIndex, outByteOffset); + + if (outLineCharOffset != nullptr) + { + *outLineCharOffset = lastItemCharacterOffset; + } + } + + return closestIndex; + } + + charcount_t LineOffsetCache::GetCharacterOffsetForLine(charcount_t line, charcount_t *outByteOffset) const + { + AssertMsg(line < this->GetLineCount(), "Invalid line value passed in."); + + charcount_t characterOffset = this->lineCharacterOffsetCacheList->Item(line); + + if (outByteOffset != nullptr) + { + *outByteOffset = this->lineByteOffsetCacheList? this->lineByteOffsetCacheList->Item(line) : characterOffset; + } + + return characterOffset; + } + + uint32 LineOffsetCache::GetLineCount() const + { + AssertMsg(this->lineCharacterOffsetCacheList != nullptr, "The list was either not set from the ByteCode or not created."); + return this->lineCharacterOffsetCacheList->Count(); + } + + const charcount_t * LineOffsetCache::GetLineCharacterOffsetBuffer() const + { + return this->lineCharacterOffsetCacheList->GetBuffer(); + } + + const charcount_t * LineOffsetCache::GetLineByteOffsetBuffer() const + { + return this->lineByteOffsetCacheList ? this->lineByteOffsetCacheList->GetBuffer() : nullptr; + } + + bool LineOffsetCache::FindNextLine(_In_z_ LPCUTF8 ¤tSourcePosition, _In_z_ LPCUTF8 sourceEndCharacter, charcount_t &inOutCharacterOffset, charcount_t &inOutByteOffset, charcount_t maxCharacterOffset) + { + charcount_t currentCharacterOffset = inOutCharacterOffset; + charcount_t currentByteOffset = inOutByteOffset; + utf8::DecodeOptions options = utf8::doAllowThreeByteSurrogates; + + while (currentSourcePosition < sourceEndCharacter) + { + LPCUTF8 previousCharacter = currentSourcePosition; + + // Decode from UTF8 to wide char. Note that Decode will advance the current character by 1 at least. + char16 decodedCharacter = utf8::Decode(currentSourcePosition, sourceEndCharacter, options); + + bool wasLineEncountered = false; + switch (decodedCharacter) + { + case _u('\r'): + // Check if the next character is a '\n'. If so, consume that character as well + // (consider as one line). + if (*currentSourcePosition == '\n') + { + ++currentSourcePosition; + ++currentCharacterOffset; + } + + // Intentional fall-through. + case _u('\n'): + case 0x2028: + case 0x2029: + // Found a new line. + wasLineEncountered = true; + break; + } + + // Move to the next character offset. + ++currentCharacterOffset; + + // Count the current byte offset we're at in the UTF-8 buffer. + // The character size can be > 1 for unicode characters. + currentByteOffset += static_cast(currentSourcePosition - previousCharacter); + + if (wasLineEncountered) + { + inOutCharacterOffset = currentCharacterOffset; + inOutByteOffset = currentByteOffset; + return true; + } + else if (currentCharacterOffset >= maxCharacterOffset) + { + return false; + } + } + + return false; + } + + // Builds the cache of line offsets from the passed in source. + void LineOffsetCache::BuildCache(Recycler * allocator, _In_z_ LPCUTF8 sourceStartCharacter, + _In_z_ LPCUTF8 sourceEndCharacter, + charcount_t startingCharacterOffset, + charcount_t startingByteOffset) + { + AssertMsg(sourceStartCharacter, "The source start character passed in is null."); + AssertMsg(sourceEndCharacter, "The source end character passed in is null."); + AssertMsg(sourceStartCharacter <= sourceEndCharacter, "The source start character should not be beyond the source end character."); + AssertMsg(!this->lineCharacterOffsetCacheList, "The cache is already built."); + + this->lineCharacterOffsetCacheList = RecyclerNew(allocator, LineOffsetCacheList, allocator); + + // Add the first line in the cache list. + this->AddLine(allocator, startingCharacterOffset, startingByteOffset); + + while (FindNextLine(sourceStartCharacter, sourceEndCharacter, startingCharacterOffset, startingByteOffset)) + { + this->AddLine(allocator, startingCharacterOffset, startingByteOffset); + } + + } + + // Tracks a new line offset in the cache. + void LineOffsetCache::AddLine(Recycler * allocator, charcount_t characterOffset, charcount_t byteOffset) + { + LineOffsetCacheList * characterOffsetList = (LineOffsetCacheList *)(LineOffsetCacheReadOnlyList*)this->lineCharacterOffsetCacheList; + characterOffsetList->Add(characterOffset); + LineOffsetCacheList * byteOffsetList = (LineOffsetCacheList *)(LineOffsetCacheReadOnlyList*)this->lineByteOffsetCacheList; + if (byteOffsetList == nullptr && characterOffset != byteOffset) + { + byteOffsetList = RecyclerNew(allocator, LineOffsetCacheList, allocator); + byteOffsetList->Copy(characterOffsetList); + this->lineByteOffsetCacheList = byteOffsetList; + } + else if (byteOffsetList != nullptr) + { + byteOffsetList->Add(byteOffset); + } + +#if DBG + Assert(this->lineByteOffsetCacheList == nullptr || this->lineByteOffsetCacheList->Count() == this->lineCharacterOffsetCacheList->Count()); + if (this->lineCharacterOffsetCacheList->Count() > 1) + { + // Ensure that the list remains sorted during insertion. + charcount_t previousCharacterOffset = this->lineCharacterOffsetCacheList->Item(this->lineCharacterOffsetCacheList->Count() - 2); + AssertMsg(characterOffset > previousCharacterOffset, "The character offsets must be inserted in increasing order per line."); + if (this->lineByteOffsetCacheList != nullptr) + { + charcount_t previousByteOffset = this->lineByteOffsetCacheList->Item(this->lineByteOffsetCacheList->Count() - 2); + AssertMsg(byteOffset > previousByteOffset, "The byte offsets must be inserted in increasing order per line."); + } + } +#endif // DBG + } +} diff --git a/deps/chakrashim/core/lib/Runtime/Base/LineOffsetCache.h b/deps/chakrashim/core/lib/Runtime/Base/LineOffsetCache.h new file mode 100644 index 00000000000..fec23b2805a --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Base/LineOffsetCache.h @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +namespace Js +{ + class LineOffsetCache + { + private: + typedef JsUtil::List LineOffsetCacheList; + typedef JsUtil::ReadOnlyList LineOffsetCacheReadOnlyList; + + public: + + static int FindLineForCharacterOffset( + _In_z_ LPCUTF8 sourceStartCharacter, + _In_z_ LPCUTF8 sourceEndCharacter, + charcount_t &inOutLineCharOffset, + charcount_t &inOutByteOffset, + charcount_t characterOffset); + + LineOffsetCache(Recycler* allocator, + _In_z_ LPCUTF8 sourceStartCharacter, + _In_z_ LPCUTF8 sourceEndCharacter, + charcount_t startingCharacterOffset = 0, + charcount_t startingByteOffset = 0); + + LineOffsetCache(Recycler *allocator, + _In_reads_(numberOfLines) const charcount_t *lineCharacterOffsets, + _In_reads_opt_(numberOfLines) const charcount_t *lineByteOffsets, + __in int numberOfLines); + + // outLineCharOffset - The character offset of the start of the line returned + int GetLineForCharacterOffset(charcount_t characterOffset, charcount_t *outLineCharOffset, charcount_t *outByteOffset); + + charcount_t GetCharacterOffsetForLine(charcount_t line, charcount_t *outByteOffset) const; + + uint32 GetLineCount() const; + + const charcount_t * GetLineCharacterOffsetBuffer() const; + const charcount_t * GetLineByteOffsetBuffer() const; + + private: + + static bool FindNextLine(_In_z_ LPCUTF8 ¤tSourcePosition, _In_z_ LPCUTF8 sourceEndCharacter, charcount_t &inOutCharacterOffset, charcount_t &inOutByteOffset, charcount_t maxCharacterOffset = UINT32_MAX); + + // Builds the cache of line offsets from the passed in source. + void BuildCache(Recycler * allocator, _In_z_ LPCUTF8 sourceStartCharacter, _In_z_ LPCUTF8 sourceEndCharacter, charcount_t startingCharacterOffset, charcount_t startingByteOffset); + + // Tracks a new line offset in the cache. + void AddLine(Recycler * allocator, charcount_t characterOffset, charcount_t byteOffset); + + private: + // Line offset cache list used for quickly finding line/column offsets. + Field(LineOffsetCacheReadOnlyList*) lineCharacterOffsetCacheList; + Field(LineOffsetCacheReadOnlyList*) lineByteOffsetCacheList; + }; +} diff --git a/deps/chakrashim/core/lib/Runtime/Base/PropertyRecord.cpp b/deps/chakrashim/core/lib/Runtime/Base/PropertyRecord.cpp index cf6d5e3d61d..ea0e4fb1109 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/PropertyRecord.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/PropertyRecord.cpp @@ -134,6 +134,30 @@ namespace Js } } +#if DBG_DUMP + void PropertyRecord::Dump(unsigned indent) const + { + const auto padding(_u("")); + const unsigned fieldIndent(indent + 2); + + Output::Print(_u("%*sPropertyRecord (0x%p):\n"), indent, padding, this); + Output::Print(_u("%*spid: %d\n"), fieldIndent, padding, this->pid); + Output::Print(_u("%*shash: 0x%08x\n"), fieldIndent, padding, this->hash); + Output::Print(_u("%*sisNumeric: %d\n"), fieldIndent, padding, this->isNumeric); + Output::Print(_u("%*sIsBound: %d\n"), fieldIndent, padding, this->isBound); + Output::Print(_u("%*sIsSymbol: %d\n"), fieldIndent, padding, this->isSymbol); + Output::Print(_u("%*sbyteCount: %u\n"), fieldIndent, padding, this->byteCount); + if (this->isNumeric) + { + Output::Print(_u("%*sbuffer (numeric): %u\n"), fieldIndent, padding, this->GetNumericValue()); + } + else + { + Output::Print(_u("%*sbuffer (string): %s\n"), fieldIndent, padding, this->GetBuffer()); + } + } +#endif + // Initialize all BuiltIn property records const BuiltInPropertyRecord<1> BuiltInPropertyRecords::EMPTY = { PropertyRecord(PropertyIds::_none, 0, false, 0, false), _u("") }; #define ENTRY_INTERNAL_SYMBOL(n) const BuiltInPropertyRecord"))> BuiltInPropertyRecords::n = { PropertyRecord(PropertyIds::n, (uint)PropertyIds::n, false, (ARRAYSIZE(_u("<") _u(#n) _u(">")) - 1) * sizeof(char16), true), _u("<") _u(#n) _u(">") }; diff --git a/deps/chakrashim/core/lib/Runtime/Base/PropertyRecord.h b/deps/chakrashim/core/lib/Runtime/Base/PropertyRecord.h index 9da26d3bb2e..4977c5aa2ce 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/PropertyRecord.h +++ b/deps/chakrashim/core/lib/Runtime/Base/PropertyRecord.h @@ -100,6 +100,11 @@ namespace Js } virtual void Mark(Recycler *recycler) override { AssertMsg(false, "Mark called on object that isn't TrackableObject"); } + +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const; +#endif }; // This struct maps to the layout of runtime allocated PropertyRecord. Used for creating built-in PropertyRecords statically. @@ -116,8 +121,35 @@ namespace Js bool Equals(JsUtil::CharacterBuffer const & str) const { - return (LEN - 1 == str.GetLength() && - JsUtil::CharacterBuffer::StaticEquals(buffer, str.GetBuffer(), LEN - 1)); +#ifndef _NTBUILD + AssertMsg(false, "Do you really have to use this interface?"); +#endif + return Equals(str.GetBuffer(), str.GetLength()); + } + + bool Equals(JavascriptString * str) const + { + const PropertyRecord * propRecord = str->GetPropertyRecord(); + + if (propRecord == nullptr) + { + return Equals(str->GetString(), str->GetLength()); + } + else + { + return Equals(propRecord->GetPropertyId()); + } + } + + bool Equals(const PropertyId & propertyId) const + { + return propertyId == propertyRecord.GetPropertyId(); + } + + bool Equals(const WCHAR * str, const charcount_t length) const + { + return (LEN - 1 == length && + JsUtil::CharacterBuffer::StaticEquals(buffer, str, LEN - 1)); } }; @@ -164,8 +196,7 @@ namespace Js { inline static bool Equals(PropertyRecord const * str1, PropertyRecord const * str2) { - return (str1->GetLength() == str2->GetLength() && - JsUtil::CharacterBuffer::StaticEquals(str1->GetBuffer(), str2->GetBuffer(), str1->GetLength())); + return str1->GetPropertyId() == str2->GetPropertyId(); } inline static bool Equals(PropertyRecord const * str1, JsUtil::CharacterBuffer const * str2) diff --git a/deps/chakrashim/core/lib/Runtime/Base/RuntimeBasePch.h b/deps/chakrashim/core/lib/Runtime/Base/RuntimeBasePch.h index cd5d945452c..ad158656fd4 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/RuntimeBasePch.h +++ b/deps/chakrashim/core/lib/Runtime/Base/RuntimeBasePch.h @@ -4,14 +4,16 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#include "Parser.h" + #include "Runtime.h" #include "WasmReader.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DebuggingFlags.h" #include "Debug/DiagProbe.h" #include "Debug/DebugManager.h" #include "Debug/ProbeContainer.h" #include "Debug/DebugContext.h" +#endif diff --git a/deps/chakrashim/core/lib/Runtime/Base/ScriptContext.cpp b/deps/chakrashim/core/lib/Runtime/Base/ScriptContext.cpp index ddc7f0e4225..b15fd6eed78 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/ScriptContext.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/ScriptContext.cpp @@ -9,10 +9,12 @@ #include "DebugWriter.h" #include "RegexStats.h" +#include "ConfigFlagsList.h" #include "ByteCode/ByteCodeApi.h" #include "Library/ProfileString.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DiagHelperMethodWrapper.h" -#include "BackendApi.h" +#endif #if PROFILE_DICTIONARY #include "DictionaryStats.h" #endif @@ -44,7 +46,9 @@ namespace Js return scriptContext.Detach(); } +#if ENABLE_NATIVE_CODEGEN CriticalSection JITPageAddrToFuncRangeCache::cs; +#endif ScriptContext::ScriptContext(ThreadContext* threadContext) : ScriptContextBase(), @@ -59,7 +63,6 @@ namespace Js #endif trigramAlphabet(nullptr), regexStacks(nullptr), - arrayMatchInit(false), config(threadContext->GetConfig(), threadContext->IsOptimizedForManyInstances()), #if ENABLE_BACKGROUND_PARSING backgroundParser(nullptr), @@ -67,6 +70,8 @@ namespace Js #if ENABLE_NATIVE_CODEGEN nativeCodeGen(nullptr), m_domFastPathHelperMap(nullptr), + m_remoteScriptContextAddr(nullptr), + jitFuncRangeCache(nullptr), #endif threadContext(threadContext), scriptStartEventHandler(nullptr), @@ -76,13 +81,18 @@ namespace Js #endif #ifndef CC_LOW_MEMORY_TARGET - integerStringMap(this->GeneralAllocator()), integerStringMapCacheMissCount(0), integerStringMapCacheUseCount(0), #endif guestArena(nullptr), +#ifdef ENABLE_SCRIPT_DEBUGGING + diagnosticArena(nullptr), raiseMessageToDebuggerFunctionType(nullptr), transitionToDebugModeIfFirstSourceFn(nullptr), + debugContext(nullptr), + isDebugContextInitialized(false), + isEnumeratingRecyclerObjects(false), +#endif sourceSize(0), deferredBody(false), isScriptContextActuallyClosed(false), @@ -102,7 +112,6 @@ namespace Js DispatchDefaultInvoke(nullptr), DispatchProfileInvoke(nullptr), m_pBuiltinFunctionIdMap(nullptr), - diagnosticArena(nullptr), hostScriptContext(nullptr), scriptEngineHaltCallback(nullptr), #if DYNAMIC_INTERPRETER_THUNK @@ -133,9 +142,7 @@ namespace Js registeredPrototypeChainEnsuredToHaveOnlyWritableDataPropertiesScriptContext(nullptr), firstInterpreterFrameReturnAddress(nullptr), builtInLibraryFunctions(nullptr), - m_remoteScriptContextAddr(nullptr), - isWeakReferenceDictionaryListCleared(false), - isDebugContextInitialized(false) + isWeakReferenceDictionaryListCleared(false) #if ENABLE_PROFILE_INFO , referencesSharedDynamicSourceContextInfo(false) #endif @@ -178,18 +185,15 @@ namespace Js , webWorkerId(Js::Constants::NonWebWorkerContextId) , url(_u("")) , startupComplete(false) - , isEnumeratingRecyclerObjects(false) #ifdef EDIT_AND_CONTINUE , activeScriptEditQuery(nullptr) #endif -#ifdef ENABLE_SCRIPT_PROFILING - , heapEnum(nullptr) -#endif #ifdef RECYCLER_PERF_COUNTERS , bindReferenceCount(0) #endif , nextPendingClose(nullptr) #ifdef ENABLE_SCRIPT_PROFILING + , heapEnum(nullptr) , m_fTraceDomCall(FALSE) #endif , intConstPropsOnGlobalObject(nullptr) @@ -202,13 +206,13 @@ namespace Js , bailOutRecordBytes(0) , bailOutOffsetBytes(0) #endif - , debugContext(nullptr) - , jitFuncRangeCache(nullptr) + , emptyStringPropertyId(Js::PropertyIds::_none) { +#ifdef ENABLE_SCRIPT_DEBUGGING // This may allocate memory and cause exception, but it is ok, as we all we have done so far // are field init and those dtor will be called if exception occurs threadContext->EnsureDebugManager(); - +#endif // Don't use throwing memory allocation in ctor, as exception in ctor doesn't cause the dtor to be called // potentially causing memory leaks BEGIN_NO_EXCEPTION; @@ -317,7 +321,7 @@ namespace Js void ScriptContext::InitializeAllocations() { - this->charClassifier = Anew(GeneralAllocator(), CharClassifier, this); + this->charClassifier = Anew(GeneralAllocator(), CharClassifier); this->valueOfInlineCache = AllocatorNewZ(InlineCacheAllocator, GetInlineCacheAllocator(), InlineCache); this->toStringInlineCache = AllocatorNewZ(InlineCacheAllocator, GetInlineCacheAllocator(), InlineCache); @@ -345,10 +349,12 @@ namespace Js #if ENABLE_NATIVE_CODEGEN m_domFastPathHelperMap = HeapNew(JITDOMFastPathHelperMap, &HeapAllocator::Instance, 17); #endif - +#ifdef ENABLE_SCRIPT_DEBUGGING this->debugContext = HeapNew(DebugContext, this); +#endif } +#ifdef ENABLE_SCRIPT_DEBUGGING void ScriptContext::EnsureClearDebugDocument() { if (this->sourceList) @@ -362,6 +368,7 @@ namespace Js }); } } +#endif void ScriptContext::ShutdownClearSourceLists() { @@ -379,7 +386,9 @@ namespace Js }); } +#ifdef ENABLE_SCRIPT_DEBUGGING EnsureClearDebugDocument(); +#endif // Don't need the source list any more so ok to release this->sourceList.Unroot(this->GetRecycler()); @@ -486,12 +495,14 @@ namespace Js } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->debugContext != nullptr) { Assert(this->debugContext->IsClosed()); HeapDelete(this->debugContext); this->debugContext = nullptr; } +#endif #if ENABLE_NATIVE_CODEGEN if (this->nativeCodeGen != nullptr) @@ -643,6 +654,24 @@ namespace Js if (hasFunctions) { +#if ENABLE_NATIVE_CODEGEN + struct AutoReset + { + AutoReset(ThreadContext* threadContext) + :threadContext(threadContext) + { + // indicate background thread that we need help to delete the xData + threadContext->GetJobProcessor()->StartExtraWork(); + } + ~AutoReset() + { + threadContext->GetJobProcessor()->EndExtraWork(); + } + + ThreadContext* threadContext; + } autoReset(this->GetThreadContext()); +#endif + // We still need to walk through all the function bodies and call cleanup // because otherwise ETW events might not get fired if a GC doesn't happen // and the thread context isn't shut down cleanly (process detach case) @@ -675,6 +704,7 @@ namespace Js DeRegisterProfileProbe(S_OK, nullptr); #endif +#ifdef ENABLE_SCRIPT_DEBUGGING this->EnsureClearDebugDocument(); if (this->debugContext != nullptr) @@ -697,6 +727,7 @@ namespace Js HeapDelete(this->diagnosticArena); this->diagnosticArena = nullptr; } +#endif // Need to print this out before the native code gen is deleted // which will delete the codegenProfiler @@ -761,7 +792,9 @@ namespace Js threadContext->UnregisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertiesScriptContext(registeredScriptContext); } +#ifdef ENABLE_SCRIPT_DEBUGGING threadContext->ReleaseDebugManager(); +#endif // This can be null if the script context initialization threw // and InternalClose gets called in the destructor code path @@ -842,16 +875,9 @@ namespace Js return propertyRecord->GetPropertyId(); } - void ScriptContext::GetOrAddPropertyRecord(Js::JavascriptString * propertyString, PropertyRecord const** propertyRecord) + void ScriptContext::GetOrAddPropertyRecord(_In_ Js::JavascriptString * propertyString, _Out_ PropertyRecord const** propertyRecord) { - if (VirtualTableInfo::HasVirtualTable(propertyString) && propertyString->GetScriptContext() == this) - { - *propertyRecord = ((Js::PropertyString*)propertyString)->GetPropertyRecord(); - } - else - { - GetOrAddPropertyRecord(propertyString->GetString(), propertyString->GetLength(), propertyRecord); - } + *propertyRecord = propertyString->GetPropertyRecord(); } void ScriptContext::GetOrAddPropertyRecord(JsUtil::CharacterBuffer const& propertyName, PropertyRecord const ** propertyRecord) @@ -872,7 +898,7 @@ namespace Js return propertyRecord->GetPropertyId(); } - void ScriptContext::GetOrAddPropertyRecord(__in_ecount(propertyNameLength) LPCWSTR propertyName, __in int propertyNameLength, PropertyRecord const ** propertyRecord) + void ScriptContext::GetOrAddPropertyRecord(__in_ecount(propertyNameLength) LPCWSTR propertyName, _In_ int propertyNameLength, _Out_ PropertyRecord const ** propertyRecord) { threadContext->GetOrAddPropertyId(propertyName, propertyNameLength, propertyRecord); if (propertyNameLength == 2) @@ -1286,11 +1312,13 @@ namespace Js void ScriptContext::InitializePostGlobal() { +#ifdef ENABLE_SCRIPT_DEBUGGING this->GetDebugContext()->Initialize(); this->GetDebugContext()->GetProbeContainer()->Initialize(this); isDebugContextInitialized = true; +#endif #if defined(_M_ARM32_OR_ARM64) // We need to ensure that the above write to the isDebugContextInitialized is visible to the debugger thread. @@ -1444,6 +1472,7 @@ namespace Js this->GetThreadContext()->RegisterScriptContext(this); } +#ifdef ENABLE_SCRIPT_DEBUGGING ArenaAllocator* ScriptContext::AllocatorForDiagnostics() { if (this->diagnosticArena == nullptr) @@ -1453,6 +1482,7 @@ namespace Js Assert(this->diagnosticArena != nullptr); return this->diagnosticArena; } +#endif void ScriptContext::PushObject(Var object) { @@ -1761,7 +1791,12 @@ namespace Js #define NUMBER_TO_STRING_CACHE_SIZE 1024 #define NUMBER_TO_STRING_RE_CACHE_LIMIT 1024 #define NUMBER_TO_STRING_RE_CACHE_REASON_LIMIT 48 - if (!this->integerStringMap.TryGetValue(value, &string)) + if (this->Cache()->integerStringMap == nullptr) + { + this->Cache()->integerStringMap = RecyclerNew(GetRecycler(), StringMap, GetRecycler()); + } + StringMap * integerStringMap = this->Cache()->integerStringMap; + if (!integerStringMap->TryGetValue(value, &string)) { // Add the string to hash table cache // limit the htable size to NUMBER_TO_STRING_CACHE_SIZE and refresh the cache often @@ -1772,12 +1807,12 @@ namespace Js integerStringMapCacheMissCount = 0; if (integerStringMapCacheUseCount >= NUMBER_TO_STRING_RE_CACHE_REASON_LIMIT) { - this->integerStringMap.Clear(); + integerStringMap->Clear(); } integerStringMapCacheUseCount = 0; } - if (this->integerStringMap.Count() > NUMBER_TO_STRING_CACHE_SIZE) + if (integerStringMap->Count() > NUMBER_TO_STRING_CACHE_SIZE) { #endif // Use recycler memory @@ -1790,9 +1825,8 @@ namespace Js char16 stringBuffer[22]; int pos = TaggedInt::ToBuffer(value, stringBuffer, _countof(stringBuffer)); - string = JavascriptString::NewCopySzFromArena(stringBuffer + pos, - this, this->GeneralAllocator(), (_countof(stringBuffer) - 1) - pos); - this->integerStringMap.AddNew(value, string); + string = JavascriptString::NewCopyBuffer(stringBuffer + pos, (_countof(stringBuffer) - 1) - pos, this); + integerStringMap->AddNew(value, string); } } else if (integerStringMapCacheUseCount < NUMBER_TO_STRING_RE_CACHE_REASON_LIMIT) @@ -2092,14 +2126,19 @@ namespace Js void ScriptContext::OnScriptStart(bool isRoot, bool isScript) { - const bool isForcedEnter = this->GetDebugContext() != nullptr ? this->GetDebugContext()->GetProbeContainer()->isForcedToEnterScriptStart : false; + const bool isForcedEnter = +#ifdef ENABLE_SCRIPT_DEBUGGING + this->GetDebugContext() != nullptr ? this->GetDebugContext()->GetProbeContainer()->isForcedToEnterScriptStart : +#endif + false; if (this->scriptStartEventHandler != nullptr && ((isRoot && threadContext->GetCallRootLevel() == 1) || isForcedEnter)) { +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->GetDebugContext() != nullptr) { this->GetDebugContext()->GetProbeContainer()->isForcedToEnterScriptStart = false; } - +#endif this->scriptStartEventHandler(this); } @@ -2245,10 +2284,12 @@ namespace Js { Assert(sourceInfo->GetScriptContext() == this); +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsScriptContextInDebugMode() && !sourceInfo->GetIsLibraryCode() && !sourceInfo->IsInDebugMode()) { sourceInfo->SetInDebugMode(true); } +#endif RecyclerWeakReference* sourceWeakRef = this->GetRecycler()->CreateWeakReferenceHandle(sourceInfo); sourceInfo->SetIsCesu8(isCesu8); @@ -2997,7 +3038,7 @@ namespace Js // items that are pending in the JIT job queue. // Alloc first and then free so that the native code generator is at a different address #if ENABLE_NATIVE_CODEGEN - HRESULT ScriptContext::RecreateNativeCodeGenerator() + HRESULT ScriptContext::RecreateNativeCodeGenerator(NativeCodeGenerator ** previousCodeGen) { NativeCodeGenerator* oldCodeGen = this->nativeCodeGen; @@ -3010,12 +3051,45 @@ namespace Js // Delete the native code generator and recreate so that all jobs get cleared properly // and re-jitted. CloseNativeCodeGenerator(oldCodeGen); - DeleteNativeCodeGenerator(oldCodeGen); + if (previousCodeGen == nullptr) + { + DeleteNativeCodeGenerator(oldCodeGen); + } + else + { + *previousCodeGen = oldCodeGen; + } return hr; } + + void ScriptContext::DeletePreviousNativeCodeGenerator(NativeCodeGenerator * codeGen) + { + Assert(codeGen != nullptr); + DeleteNativeCodeGenerator(codeGen); + } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING +#if ENABLE_NATIVE_CODEGEN + // xplat XDataAllocator Reg/UnReg are lazy ops. + // Using the lazy delete class below, we let XData address unreg before old codegen is deleted + // This logic is also used for Windows since it works there too. + class OldCodeGenAutoDelete + { + public: + NativeCodeGenerator * oldCodegen; + ScriptContext * sc; + OldCodeGenAutoDelete(ScriptContext * s):oldCodegen(nullptr), sc(s) { } + ~OldCodeGenAutoDelete() + { + if (oldCodegen != nullptr) + { + sc->DeletePreviousNativeCodeGenerator(oldCodegen); + } + } + }; +#endif // ENABLE_NATIVE_CODEGEN HRESULT ScriptContext::OnDebuggerAttached() { OUTPUT_TRACE(Js::DebuggerPhase, _u("ScriptContext::OnDebuggerAttached: start 0x%p\n"), this); @@ -3041,7 +3115,12 @@ namespace Js // Rundown on all existing functions and change their thunks so that they will go to debug mode once they are called. +#if ENABLE_NATIVE_CODEGEN + OldCodeGenAutoDelete autoDelete(this); + HRESULT hr = OnDebuggerAttachedDetached(/*attach*/ true, &(autoDelete.oldCodegen)); +#else // ENABLE_NATIVE_CODEGEN HRESULT hr = OnDebuggerAttachedDetached(/*attach*/ true); +#endif // Debugger attach/detach failure is catastrophic, take down the process DEBUGGER_ATTACHDETACH_FATAL_ERROR_IF_FAILED(hr); @@ -3081,6 +3160,7 @@ namespace Js void* newEnv = AsmJsModuleInfo::ConvertFrameForJavascript(asmEnvIter.CurrentKey(), funcList->Head()); funcList->Iterate([&](AsmJsScriptFunction * func) { + func->SetEnvironment(RecyclerNewPlus(this->GetRecycler(), sizeof(void*), FrameDisplay, 1)); func->GetEnvironment()->SetItem(0, newEnv); }); asmEnvIter.MoveNext(); @@ -3094,7 +3174,7 @@ namespace Js Assert(!funcList->Empty()); funcList->Iterate([](AsmJsScriptFunction * func) { - func->SetModuleMemory(nullptr); + func->SetModuleEnvironment(nullptr); func->GetFunctionBody()->ResetAsmJsInfo(); }); asmCleanupIter.MoveNext(); @@ -3134,7 +3214,12 @@ namespace Js // and notify the script context that the debugger has detached to allow it to revert the runtime to the proper // state (JIT enabled). +#if ENABLE_NATIVE_CODEGEN + OldCodeGenAutoDelete autoDelete(this); + HRESULT hr = OnDebuggerAttachedDetached(/*attach*/ false, &(autoDelete.oldCodegen)); +#else // ENABLE_NATIVE_CODEGEN HRESULT hr = OnDebuggerAttachedDetached(/*attach*/ false); +#endif // Debugger attach/detach failure is catastrophic, take down the process DEBUGGER_ATTACHDETACH_FATAL_ERROR_IF_FAILED(hr); @@ -3164,7 +3249,11 @@ namespace Js return hr; } +#if ENABLE_NATIVE_CODEGEN + HRESULT ScriptContext::OnDebuggerAttachedDetached(bool attach, NativeCodeGenerator ** previousCodeGenHolder) +#else HRESULT ScriptContext::OnDebuggerAttachedDetached(bool attach) +#endif { // notify threadContext that debugger is attaching so do not do expire @@ -3185,13 +3274,7 @@ namespace Js } autoRestore(this->GetThreadContext()); - // xplat-todo: (obastemur) Enable JIT on Debug mode - // CodeGen entrypoint can be deleted before we are able to unregister - // due to how we handle xdata on xplat, resetting the entrypoints below might affect CodeGen process. - // it is safer (on xplat) to turn JIT off during Debug for now. -#ifdef _WIN32 if (!Js::Configuration::Global.EnableJitInDebugMode()) -#endif { if (attach) { @@ -3221,39 +3304,12 @@ namespace Js HRESULT hr = S_OK; -#ifndef _WIN32 - BEGIN_TRANSLATE_OOM_TO_HRESULT_NESTED - { - // xplat eh_frame handling is a bit different than Windows - // RecreateNativeCodeGenerator call below will be cleaning up - // XDataAllocation and we won't be able to __DEREGISTER_FRAME - - // xplat-todo: make eh_frame handling better - this->sourceList->Map([=](uint i, RecyclerWeakReference* sourceInfoWeakRef) { - Js::Utf8SourceInfo* sourceInfo = sourceInfoWeakRef->Get(); - - if (sourceInfo != nullptr) - { - sourceInfo->MapFunction([](Js::FunctionBody* functionBody) { - functionBody->ResetEntryPoint(); - }); - } - }); - } - END_TRANSLATE_OOM_TO_HRESULT(hr); - - if (FAILED(hr)) - { - return hr; - } -#endif - if (!CONFIG_FLAG(ForceDiagnosticsMode)) { #if ENABLE_NATIVE_CODEGEN // Recreate the native code generator so that all pending // JIT work items will be cleared. - hr = RecreateNativeCodeGenerator(); + hr = RecreateNativeCodeGenerator(previousCodeGenHolder); if (FAILED(hr)) { return hr; @@ -3290,14 +3346,12 @@ namespace Js functionBody->SetEntryToDeferParseForDebugger(); }); } -#ifdef _WIN32 else { sourceInfo->MapFunction([](Js::FunctionBody* functionBody) { functionBody->ResetEntryPoint(); }); } -#endif } }); } @@ -3324,6 +3378,7 @@ namespace Js #endif return hr; } +#endif #if defined(ENABLE_SCRIPT_DEBUGGING) || defined(ENABLE_SCRIPT_PROFILING) // We use ProfileThunk under debugger. @@ -3342,14 +3397,14 @@ namespace Js this->javascriptLibrary->SetProfileMode(true); this->javascriptLibrary->SetDispatchProfile(true, DispatchProfileInvoke); -#ifdef ENABLE_SCRIPT_PROFILING if (!calledDuringAttach) { +#ifdef ENABLE_SCRIPT_PROFILING m_fTraceDomCall = TRUE; // This flag is always needed in DebugMode to wrap external functions with DebugProfileThunk +#endif // Update the function objects currently present in there. this->SetFunctionInRecyclerToProfileMode(true/*enumerateNonUserFunctionsOnly*/); } -#endif } } @@ -3408,10 +3463,12 @@ namespace Js return hr; } +#endif // ENABLE_SCRIPT_PROFILING +#ifdef ENABLE_SCRIPT_DEBUGGING void ScriptContext::SetFunctionInRecyclerToProfileMode(bool enumerateNonUserFunctionsOnly/* = false*/) { - OUTPUT_TRACE(Js::ScriptProfilerPhase, _u("ScriptContext::SetFunctionInRecyclerToProfileMode started (m_fTraceDomCall : %s)\n"), IsTrueOrFalse(m_fTraceDomCall)); + OUTPUT_TRACE(Js::ScriptProfilerPhase, _u("ScriptContext::SetFunctionInRecyclerToProfileMode started (m_fTraceDomCall : %s)\n"), IsTrueOrFalse(IsTraceDomCall())); // Mark this script context isEnumeratingRecyclerObjects AutoEnumeratingRecyclerObjects enumeratingRecyclerObjects(this); @@ -3422,7 +3479,6 @@ namespace Js OUTPUT_TRACE(Js::ScriptProfilerPhase, _u("ScriptContext::SetFunctionInRecyclerToProfileMode ended\n")); } -#endif // ENABLE_SCRIPT_PROFILING void ScriptContext::UpdateRecyclerFunctionEntryPointsForDebugger() { @@ -3463,17 +3519,18 @@ namespace Js scriptFunction->GetFunctionBody()->GetAsmJsFunctionInfo() != nullptr && scriptFunction->GetFunctionBody()->GetAsmJsFunctionInfo()->GetModuleFunctionBody() != nullptr) { - void* env = scriptFunction->GetEnvironment()->GetItem(0); + AsmJsScriptFunction* asmFunc = AsmJsScriptFunction::FromVar(scriptFunction); + void* env = (void*)asmFunc->GetModuleEnvironment(); SList * funcList = nullptr; if (asmJsEnvironmentMap->TryGetValue(env, &funcList)) { - funcList->Push((AsmJsScriptFunction*)scriptFunction); + funcList->Push(asmFunc); } else { SList * newList = Anew(debugTransitionAlloc, SList, debugTransitionAlloc); asmJsEnvironmentMap->AddNew(env, newList); - newList->Push((AsmJsScriptFunction*)scriptFunction); + newList->Push(asmFunc); } } } @@ -3591,6 +3648,7 @@ namespace Js scriptFunction->ChangeEntryPoint(pBody->GetDefaultFunctionEntryPointInfo(), newEntryPoint); } +#endif #if defined(ENABLE_SCRIPT_PROFILING) || defined(ENABLE_SCRIPT_DEBUGGING) void ScriptContext::RecyclerEnumClassEnumeratorCallback(void *address, size_t size) @@ -3629,11 +3687,10 @@ namespace Js if (proxy != NULL) { +#if defined(ENABLE_SCRIPT_PROFILING) #if ENABLE_DEBUG_CONFIG_OPTIONS char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE]; #endif - -#if defined(ENABLE_SCRIPT_PROFILING) OUTPUT_TRACE(Js::ScriptProfilerPhase, _u("ScriptContext::RecyclerEnumClassEnumeratorCallback\n")); OUTPUT_TRACE(Js::ScriptProfilerPhase, _u("\tFunctionProxy : 0x%08X, FunctionNumber : %s, DeferredParseAttributes : %d, EntryPoint : 0x%08X"), (DWORD_PTR)proxy, proxy->GetDebugNumberSet(debugStringBuffer), proxy->GetAttributes(), (DWORD_PTR)entryPoint); @@ -3891,6 +3948,7 @@ namespace Js return forceNoNative; } +#ifdef ENABLE_SCRIPT_DEBUGGING void ScriptContext::InitializeDebugging() { if (!this->IsScriptContextInDebugMode()) // If we already in debug mode, we would have done below changes already. @@ -3909,6 +3967,7 @@ namespace Js } } } +#endif // Combined profile/debug wrapper thunk. // - used when we profile to send profile events @@ -3919,19 +3978,20 @@ namespace Js #if defined(ENABLE_SCRIPT_DEBUGGING) || defined(ENABLE_SCRIPT_PROFILING) RUNTIME_ARGUMENTS(args, callInfo); - Assert(!AsmJsScriptFunction::IsWasmScriptFunction(callable)); + Assert(!WasmScriptFunction::Is(callable)); JavascriptFunction* function = JavascriptFunction::FromVar(callable); ScriptContext* scriptContext = function->GetScriptContext(); + + // We can come here when profiling is not on + // e.g. User starts profiling, we update all thinks and then stop profiling - we don't update thunk + // So we still get this call +#if defined(ENABLE_SCRIPT_PROFILING) bool functionEnterEventSent = false; char16 *pwszExtractedFunctionName = NULL; size_t functionNameLen = 0; const char16 *pwszFunctionName = NULL; HRESULT hrOfEnterEvent = S_OK; - // We can come here when profiling is not on - // e.g. User starts profiling, we update all thinks and then stop profiling - we don't update thunk - // So we still get this call -#if defined(ENABLE_SCRIPT_PROFILING) PROFILER_TOKEN scriptId = -1; PROFILER_TOKEN functionId = -1; const bool isProfilingUserCode = scriptContext->GetThreadContext()->IsProfilingUserCode(); @@ -4078,7 +4138,8 @@ namespace Js } __TRY_FINALLY_BEGIN // SEH is not guaranteed, see the implementation { - aReturn = JavascriptFunction::CallFunction(function, origEntryPoint, args); + // This can be an apply call or a spread so we have to use the large arg count + aReturn = JavascriptFunction::CallFunction(function, origEntryPoint, args, /* useLargeArgCount */ true); } __FINALLY { @@ -4091,7 +4152,8 @@ namespace Js // Can we update return address to a thunk that sends Exit event and then jmp to entry instead of Calling it. // Saves stack space and it might be something we would be doing anyway for handling profile.Start/stop // which can come anywhere on the stack. - aReturn = JavascriptFunction::CallFunction(function, origEntryPoint, args); + // This can be an apply call or a spread so we have to use the large arg count + aReturn = JavascriptFunction::CallFunction(function, origEntryPoint, args, /* useLargeArgCount */ true); } } } @@ -4144,7 +4206,7 @@ namespace Js AutoRegisterIgnoreExceptionWrapper autoWrapper(scriptContext->GetThreadContext()); Var aReturn = HelperOrLibraryMethodWrapper(scriptContext, [=] { - return JavascriptFunction::CallFunction(function, entryPoint, args); + return JavascriptFunction::CallFunction(function, entryPoint, args, /* useLargeArgCount */ true); }); return aReturn; @@ -4257,9 +4319,9 @@ namespace Js return (m_pBuiltinFunctionIdMap == NULL) ? -1 : m_pBuiltinFunctionIdMap->Lookup(entryPoint, -1); } +#if defined(ENABLE_SCRIPT_PROFILING) HRESULT ScriptContext::RegisterLibraryFunction(const char16 *pwszObjectName, const char16 *pwszFunctionName, Js::PropertyId functionPropertyId, JavascriptMethod entryPoint) { -#if defined(ENABLE_SCRIPT_PROFILING) #if DEBUG const char16 *pwszObjectNameFromProperty = const_cast(GetPropertyName(functionPropertyId)->GetBuffer()); if (GetPropertyName(functionPropertyId)->IsSymbol()) @@ -4330,10 +4392,8 @@ namespace Js { return OnFunctionCompiled(functionPropertyId, BuiltInFunctionsScriptId, pwszFunctionName, NULL, NULL); } -#else - return S_OK; -#endif // ENABLE_SCRIPT_PROFILING } +#endif // ENABLE_SCRIPT_PROFILING void ScriptContext::BindReference(void * addr) { @@ -4359,10 +4419,10 @@ namespace Js } #endif - void ScriptContext::FreeFunctionEntryPoint(Js::JavascriptMethod codeAddress, Js::JavascriptMethod thunkAddress) + void ScriptContext::FreeFunctionEntryPoint(Js::JavascriptMethod codeAddress, Js::JavascriptMethod thunkAddress, void** functionTable) { #if ENABLE_NATIVE_CODEGEN - FreeNativeCodeGenAllocation(this, codeAddress, thunkAddress); + FreeNativeCodeGenAllocation(this, codeAddress, thunkAddress, functionTable); #endif } @@ -4587,13 +4647,13 @@ void ScriptContext::RegisterConstructorCache(Js::PropertyId propertyId, Js::Cons { this->threadContext->RegisterConstructorCache(propertyId, cache); } -#endif JITPageAddrToFuncRangeCache * ScriptContext::GetJitFuncRangeCache() { return jitFuncRangeCache; } +#endif void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertiesScriptContext() { @@ -4671,6 +4731,7 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie } #endif +#ifdef ENABLE_SCRIPT_PROFILING bool ScriptContext::SetDispatchProfile(bool fSet, JavascriptMethod dispatchInvoke) { if (!fSet) @@ -4678,18 +4739,14 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie this->javascriptLibrary->SetDispatchProfile(false, dispatchInvoke); return true; } -#ifdef ENABLE_SCRIPT_PROFILING else if (m_fTraceDomCall) { this->javascriptLibrary->SetDispatchProfile(true, dispatchInvoke); return true; } -#endif // ENABLE_SCRIPT_PROFILING - return false; } -#ifdef ENABLE_SCRIPT_PROFILING HRESULT ScriptContext::OnDispatchFunctionEnter(const WCHAR *pwszFunctionName) { if (m_pProfileCallback2 == NULL) @@ -4789,11 +4846,13 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie contextData.isRecyclerVerifyEnabled = FALSE; contextData.recyclerVerifyPad = 0; #endif +#ifdef ENABLE_SCRIPT_DEBUGGING contextData.debuggingFlagsAddr = GetDebuggingFlagsAddr(); contextData.debugStepTypeAddr = GetDebugStepTypeAddr(); contextData.debugFrameAddressAddr = GetDebugFrameAddressAddr(); contextData.debugScriptIdWhenSetAddr = GetDebugScriptIdWhenSetAddr(); - + contextData.chakraLibAddr = (intptr_t)GetLibrary()->GetChakraLib(); +#endif contextData.numberAllocatorAddr = (intptr_t)GetNumberAllocator(); #ifdef ENABLE_SIMDJS contextData.isSIMDEnabled = GetConfig()->IsSimdjsEnabled(); @@ -4807,7 +4866,7 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie } bool allowPrereserveAlloc = true; -#if !_M_X64_OR_ARM64 +#if !TARGET_64 if (this->webWorkerId != Js::Constants::NonWebWorkerContextId) { allowPrereserveAlloc = false; @@ -4960,6 +5019,7 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie return (intptr_t)GetRecycler(); } +#ifdef ENABLE_SCRIPT_DEBUGGING intptr_t ScriptContext::GetDebuggingFlagsAddr() const { return this->threadContext->GetDebugManager()->GetDebuggingFlagsAddr(); @@ -4979,6 +5039,12 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie { return (intptr_t)this->threadContext->GetDebugManager()->stepController.GetAddressOfScriptIdWhenSet(); } +#endif + + intptr_t Js::ScriptContext::GetChakraLibAddr() const + { + return (intptr_t)GetLibrary()->GetChakraLib(); + } bool ScriptContext::GetRecyclerAllowNativeCodeBumpAllocation() const { @@ -5827,6 +5893,7 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING DebugContext* ScriptContext::GetDebugContext() const { Assert(this->debugContext != nullptr); @@ -5840,34 +5907,43 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie return this->debugContext; } +#endif bool ScriptContext::IsScriptContextInNonDebugMode() const { +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->GetDebugContext() != nullptr) { return this->GetDebugContext()->IsDebugContextInNonDebugMode(); } +#endif return true; } + bool ScriptContext::IsScriptContextInDebugMode() const { +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->GetDebugContext() != nullptr) { return this->GetDebugContext()->IsDebugContextInDebugMode(); } +#endif return false; } bool ScriptContext::IsScriptContextInSourceRundownOrDebugMode() const { +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->GetDebugContext() != nullptr) { return this->GetDebugContext()->IsDebugContextInSourceRundownOrDebugMode(); } +#endif return false; } +#ifdef ENABLE_SCRIPT_DEBUGGING bool ScriptContext::IsDebuggerRecording() const { if (this->GetDebugContext() != nullptr) @@ -5884,6 +5960,7 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie this->GetDebugContext()->SetIsDebuggerRecording(isDebuggerRecording); } } +#endif bool ScriptContext::IsIntlEnabled() { @@ -5901,6 +5978,11 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie #endif return false; } + bool ScriptContext::IsJsBuiltInEnabled() + { + return CONFIG_FLAG(JsBuiltIn); + } + #ifdef INLINE_CACHE_STATS void ScriptContext::LogCacheUsage(Js::PolymorphicInlineCache *cache, bool isGetter, Js::PropertyId propertyId, bool hit, bool collision) @@ -6106,11 +6188,11 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie if (emitV2AsyncStackEvent) { - JS_ETW(EventWriteJSCRIPT_ASYNCCAUSALITY_STACKTRACE_V2(operationID, frameCount, nameBufferLength, sizeof(StackFrameInfo), &stackFrames.Item(0), nameBufferString)); + JS_ETW(EventWriteJSCRIPT_ASYNCCAUSALITY_STACKTRACE_V2(operationID, frameCount, nameBufferLength, nameBufferString, sizeof(StackFrameInfo), &stackFrames.Item(0))); } else { - JS_ETW(EventWriteJSCRIPT_STACKTRACE(operationID, frameCount, nameBufferLength, sizeof(StackFrameInfo), &stackFrames.Item(0), nameBufferString)); + JS_ETW(EventWriteJSCRIPT_STACKTRACE(operationID, frameCount, nameBufferLength, nameBufferString, sizeof(StackFrameInfo), &stackFrames.Item(0))); } } } @@ -6118,7 +6200,6 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie OUTPUT_FLUSH(); } -#endif // Info: Append sourceString to stringBuilder after escaping charToEscape with escapeChar. // "SomeBadly\0Formed\0String" => "SomeBadly\\\0Formed\\\0String" @@ -6194,6 +6275,7 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie return nameLen; } +#endif Field(Js::Var)* ScriptContext::GetModuleExportSlotArrayAddress(uint moduleIndex, uint slotIndex) { @@ -6209,6 +6291,7 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie return moduleRecord->GetLocalExportSlots(); } +#if ENABLE_NATIVE_CODEGEN void JITPageAddrToFuncRangeCache::ClearCache() { if (jitPageAddrToFuncRangeMap != nullptr) @@ -6334,6 +6417,7 @@ void ScriptContext::RegisterPrototypeChainEnsuredToHaveOnlyWritableDataPropertie { return largeJitFuncToSizeMap; } +#endif } // End namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Base/ScriptContext.h b/deps/chakrashim/core/lib/Runtime/Base/ScriptContext.h index b7db70089b1..9bd0b8a9336 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/ScriptContext.h +++ b/deps/chakrashim/core/lib/Runtime/Base/ScriptContext.h @@ -370,7 +370,7 @@ namespace Js #endif Js::ImplicitCallFlags savedImplicitCallFlags; - void * returnAddrOfScriptEntryFunction; + void * addrOfReturnAddrOfScriptEntryFunction; void * frameIdOfScriptExitFunction; // the frameAddres in x86, the return address in amd64/arm_soc ScriptContext * scriptContext; struct ScriptEntryExitRecord * next; @@ -383,6 +383,7 @@ namespace Js #endif }; +#if ENABLE_NATIVE_CODEGEN /* * This class caches jitted func address ranges. * This is to facilitate WER scenarios to use this cache for checking native addresses. @@ -415,6 +416,7 @@ namespace Js LargeJITFuncAddrToSizeMap * GetLargeJITFuncAddrToSizeMap(); static CriticalSection * GetCriticalSection() { return &cs; } }; +#endif class ScriptContext : public ScriptContextBase, public ScriptContextInfo { @@ -423,6 +425,7 @@ namespace Js friend class GlobalObject; // InitializeCache friend class SourceTextModuleRecord; // for module bytecode gen. +#if ENABLE_NATIVE_CODEGEN public: static DWORD GetThreadContextOffset() { return offsetof(ScriptContext, threadContext); } static DWORD GetOptimizationOverridesOffset() { return offsetof(ScriptContext, optimizationOverrides); } @@ -430,19 +433,13 @@ namespace Js static DWORD GetNumberAllocatorOffset() { return offsetof(ScriptContext, numberAllocator); } JITPageAddrToFuncRangeCache * GetJitFuncRangeCache(); + private: JITPageAddrToFuncRangeCache * jitFuncRangeCache; - +#endif + public: ScriptContext *next; ScriptContext *prev; bool IsRegistered() { return next != nullptr || prev != nullptr || threadContext->GetScriptContextList() == this; } - union - { - int64 int64Val; - float floatVal; - double dbVal; - AsmJsSIMDValue simdVal; // stores raw simd result for Asm interpreter - } asmJsReturnValue; - static DWORD GetAsmJsReturnValueOffset() { return offsetof(ScriptContext, asmJsReturnValue); } ScriptContextOptimizationOverrideInfo optimizationOverrides; @@ -492,17 +489,19 @@ namespace Js #ifdef ENABLE_JS_ETW void EmitStackTraceEvent(__in UINT64 operationID, __in USHORT maxFrameCount, bool emitV2AsyncStackEvent); + static ushort ProcessNameAndGetLength(Js::StringBuilder* nameBuffer, const WCHAR* name); #endif void SetIsDiagnosticsScriptContext(bool set) { this->isDiagnosticsScriptContext = set; } bool IsDiagnosticsScriptContext() const { return this->isDiagnosticsScriptContext; } - bool IsScriptContextInNonDebugMode() const; bool IsScriptContextInDebugMode() const; bool IsScriptContextInSourceRundownOrDebugMode() const; +#ifdef ENABLE_SCRIPT_DEBUGGING bool IsDebuggerRecording() const; void SetIsDebuggerRecording(bool isDebuggerRecording); +#endif bool IsRunningScript() const { return this->threadContext->GetScriptEntryExit() != nullptr; } @@ -569,13 +568,19 @@ namespace Js ArenaAllocator* interpreterArena; ArenaAllocator* guestArena; +#ifdef ENABLE_SCRIPT_DEBUGGING ArenaAllocator* diagnosticArena; +#endif +#if ENABLE_NATIVE_CODEGEN PSCRIPTCONTEXT_HANDLE m_remoteScriptContextAddr; +#endif bool startupComplete; // Indicates if the heuristic startup phase for this script context is complete bool isInvalidatedForHostObjects; // Indicates that we've invalidate all objects in the host so stop calling them. +#ifdef ENABLE_SCRIPT_DEBUGGING bool isEnumeratingRecyclerObjects; // Indicates this scriptContext is enumerating recycler objects. Used by recycler enumerating callbacks to filter out other unrelated scriptContexts. +#endif bool m_enumerateNonUserFunctionsOnly; // Indicates that recycler enumeration callback will consider only non-user functions (which are built-ins, external, winrt etc). ThreadContext* threadContext; @@ -800,7 +805,7 @@ namespace Js #ifdef ASMJS_PLAT InterpreterThunkEmitter* asmJsInterpreterThunkEmitter; AsmJsCodeGenerator* asmJsCodeGenerator; - typedef JsUtil::BaseDictionary*, ArenaAllocator> AsmFunctionMap; + typedef JsUtil::BaseDictionary*, ArenaAllocator> AsmFunctionMap; AsmFunctionMap* asmJsEnvironmentMap; ArenaAllocator* debugTransitionAlloc; #endif @@ -831,11 +836,9 @@ namespace Js #endif #ifndef CC_LOW_MEMORY_TARGET - JsUtil::BaseDictionary integerStringMap; uint integerStringMapCacheMissCount; uint integerStringMapCacheUseCount; #endif - double lastNumberToStringRadix10; double lastUtcTimeFromStr; @@ -866,6 +869,17 @@ namespace Js typedef JsUtil::List*, Recycler, false, Js::FreeListedRemovePolicy> SourceList; RecyclerRootPtr sourceList; +#ifdef ENABLE_SCRIPT_DEBUGGING + typedef void(*RaiseMessageToDebuggerFunctionType)(ScriptContext *, DEBUG_EVENT_INFO_TYPE, LPCWSTR, LPCWSTR); + RaiseMessageToDebuggerFunctionType raiseMessageToDebuggerFunctionType; + + typedef void(*TransitionToDebugModeIfFirstSourceFn)(ScriptContext *, Utf8SourceInfo *); + TransitionToDebugModeIfFirstSourceFn transitionToDebugModeIfFirstSourceFn; + + DebugContext* debugContext; + CriticalSection debugContextCloseCS; +#endif + #ifdef ENABLE_SCRIPT_PROFILING IActiveScriptProfilerHeapEnum* heapEnum; @@ -891,12 +905,6 @@ namespace Js SListBase weakReferenceDictionaryList; bool isWeakReferenceDictionaryListCleared; - typedef void(*RaiseMessageToDebuggerFunctionType)(ScriptContext *, DEBUG_EVENT_INFO_TYPE, LPCWSTR, LPCWSTR); - RaiseMessageToDebuggerFunctionType raiseMessageToDebuggerFunctionType; - - typedef void(*TransitionToDebugModeIfFirstSourceFn)(ScriptContext *, Utf8SourceInfo *); - TransitionToDebugModeIfFirstSourceFn transitionToDebugModeIfFirstSourceFn; - ScriptContext(ThreadContext* threadContext); void InitializeAllocations(); void InitializePreGlobal(); @@ -921,14 +929,7 @@ namespace Js void InternalClose(); - DebugContext* debugContext; - CriticalSection debugContextCloseCS; - public: - static const int kArrayMatchCh=72; - static const int kMaxArrayMatchIndex=8192; - short arrayMatchItems[kArrayMatchCh]; - bool arrayMatchInit; #ifdef LEAK_REPORT LeakReport::UrlRecord * urlRecord; @@ -967,6 +968,7 @@ namespace Js void SetDirectHostTypeId(TypeId typeId) {directHostTypeId = typeId; } TypeId GetDirectHostTypeId() const { return directHostTypeId; } +#if ENABLE_NATIVE_CODEGEN PSCRIPTCONTEXT_HANDLE GetRemoteScriptAddr(bool allowInitialize = true) { #if ENABLE_OOP_NATIVE_CODEGEN @@ -977,6 +979,7 @@ namespace Js #endif return m_remoteScriptContextAddr; } +#endif char16 const * GetUrl() const { return url; } void SetUrl(BSTR bstr); @@ -984,25 +987,16 @@ namespace Js time_t GetCreateTime() const { return createTime; } uint GetAllocId() const { return allocId; } #endif - void InitializeArrayMatch() - { - if (!arrayMatchInit) - { - for (int i=0;iisInitialized; } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING bool IsDebugContextInitialized() const { return this->isDebugContextInitialized; } DebugContext* GetDebugContext() const; CriticalSection* GetDebugContextCloseCS() { return &debugContextCloseCS; } +#endif uint callCount; @@ -1041,6 +1035,7 @@ namespace Js void InitializeGlobalObject(); bool IsIntlEnabled(); + bool IsJsBuiltInEnabled(); JavascriptLibrary* GetLibrary() const { return javascriptLibrary; } Js::Cache* Cache() const{ return &this->javascriptLibrary->cache; } const JavascriptLibraryBase* GetLibraryBase() const { return javascriptLibrary->GetLibraryBase(); } @@ -1221,14 +1216,14 @@ namespace Js { GetOrAddPropertyRecord(propertyName, N - 1, propertyRecord); } - void GetOrAddPropertyRecord(Js::JavascriptString * propertyString, PropertyRecord const** propertyRecord); + void GetOrAddPropertyRecord(_In_ Js::JavascriptString * propertyString, _Out_ PropertyRecord const** propertyRecord); PropertyId GetOrAddPropertyIdTracked(JsUtil::CharacterBuffer const& propName); template PropertyId GetOrAddPropertyIdTracked(const char16(&propertyName)[N]) { return GetOrAddPropertyIdTracked(propertyName, N - 1); } PropertyId GetOrAddPropertyIdTracked(__in_ecount(propertyNameLength) LPCWSTR pszPropertyName, __in int propertyNameLength); - void GetOrAddPropertyRecord(__in_ecount(propertyNameLength) LPCWSTR pszPropertyName, __in int propertyNameLength, PropertyRecord const** propertyRecord); + void GetOrAddPropertyRecord(__in_ecount(propertyNameLength) LPCWSTR pszPropertyName, _In_ int propertyNameLength, _Out_ PropertyRecord const** propertyRecord); BOOL IsNumericPropertyId(PropertyId propertyId, uint32* value); void RegisterWeakReferenceDictionary(JsUtil::IWeakReferenceDictionary* weakReferenceDictionary); @@ -1275,7 +1270,9 @@ namespace Js CacheAllocator * ForInCacheAllocator() { return &forInCacheAllocator; } ArenaAllocator* DynamicProfileInfoAllocator() { return &dynamicProfileInfoAllocator; } +#ifdef ENABLE_SCRIPT_DEBUGGING ArenaAllocator* AllocatorForDiagnostics(); +#endif Js::TempArenaAllocatorObject* GetTemporaryAllocator(LPCWSTR name); void ReleaseTemporaryAllocator(Js::TempArenaAllocatorObject* tempAllocator); @@ -1382,6 +1379,7 @@ namespace Js // Do not call this directly, look for ENFORCE_ENTRYEXITRECORD_HASCALLER macro. void EnforceEERHasCaller() { threadContext->GetScriptEntryExit()->hasCaller = true; } +#ifdef ENABLE_SCRIPT_DEBUGGING void SetRaiseMessageToDebuggerFunction(RaiseMessageToDebuggerFunctionType function) { raiseMessageToDebuggerFunctionType = function; @@ -1407,6 +1405,7 @@ namespace Js transitionToDebugModeIfFirstSourceFn(this, sourceInfo); } } +#endif void AddSourceSize(size_t sourceSize) { @@ -1439,7 +1438,7 @@ namespace Js return threadContext->GetEmptyStringPropertyId(); } - void FreeFunctionEntryPoint(Js::JavascriptMethod codeAddress, Js::JavascriptMethod thunkAddress); + void FreeFunctionEntryPoint(Js::JavascriptMethod codeAddress, Js::JavascriptMethod thunkAddress, void** functionTable); private: uint CloneSource(Utf8SourceInfo* info); @@ -1500,8 +1499,12 @@ namespace Js #endif } + SRCINFO *AddHostSrcInfo(SRCINFO const *pSrcInfo); + #if DBG SourceContextInfo const * GetNoContextSourceContextInfo() const { return this->Cache()->noContextSourceContextInfo; } + bool hadProfiled; + bool HadProfiled() const { return hadProfiled; } #ifdef ENABLE_SCRIPT_PROFILING int GetProfileSession() @@ -1521,38 +1524,37 @@ namespace Js AssertMsg(m_pProfileCallback == nullptr, "How to stop when there is still the callback out there"); } #endif // ENABLE_SCRIPT_PROFILING - - bool hadProfiled; - bool HadProfiled() const { return hadProfiled; } #endif - SRCINFO *AddHostSrcInfo(SRCINFO const *pSrcInfo); - - inline void CoreSetProfileEventMask(DWORD dwEventMask); - typedef HRESULT (*RegisterExternalLibraryType)(Js::ScriptContext *pScriptContext); #ifdef ENABLE_SCRIPT_PROFILING + void CoreSetProfileEventMask(DWORD dwEventMask); + typedef HRESULT(*RegisterExternalLibraryType)(Js::ScriptContext *pScriptContext); HRESULT RegisterProfileProbe(IActiveScriptProfilerCallback *pProfileCallback, DWORD dwEventMask, DWORD dwContext, RegisterExternalLibraryType RegisterExternalLibrary, JavascriptMethod dispatchInvoke); HRESULT DeRegisterProfileProbe(HRESULT hrReason, JavascriptMethod dispatchInvoke); -#endif + HRESULT RegisterLibraryFunction(const char16 *pwszObjectName, const char16 *pwszFunctionName, Js::PropertyId functionPropertyId, JavascriptMethod entryPoint); + HRESULT RegisterBuiltinFunctions(RegisterExternalLibraryType RegisterExternalLibrary); HRESULT SetProfileEventMask(DWORD dwEventMask); HRESULT RegisterScript(Js::FunctionProxy *pFunctionBody, BOOL fRegisterScript = TRUE); // Register static and dynamic scripts HRESULT RegisterAllScripts(); +#endif +#ifdef ENABLE_SCRIPT_DEBUGGING // Iterate through utf8sourceinfo and clear debug document if they are there. void EnsureClearDebugDocument(); + void UpdateRecyclerFunctionEntryPointsForDebugger(); + static void RecyclerFunctionCallbackForDebugger(void *address, size_t size); + void SetFunctionInRecyclerToProfileMode(bool enumerateNonUserFunctionsOnly = false); +#ifdef ASMJS_PLAT + void TransitionEnvironmentForDebugger(ScriptFunction * scriptFunction); +#endif +#endif // To be called directly only when the thread context is shutting down void ShutdownClearSourceLists(); - HRESULT RegisterLibraryFunction(const char16 *pwszObjectName, const char16 *pwszFunctionName, Js::PropertyId functionPropertyId, JavascriptMethod entryPoint); - - HRESULT RegisterBuiltinFunctions(RegisterExternalLibraryType RegisterExternalLibrary); - void UpdateRecyclerFunctionEntryPointsForDebugger(); - void SetFunctionInRecyclerToProfileMode(bool enumerateNonUserFunctionsOnly = false); - #if defined(ENABLE_SCRIPT_PROFILING) || defined(ENABLE_SCRIPT_DEBUGGING) void RegisterDebugThunk(bool calledDuringAttach = true); void UnRegisterDebugThunk(); @@ -1560,25 +1562,21 @@ namespace Js static void RestoreEntryPointFromProfileThunk(JavascriptFunction* function); static void RecyclerEnumClassEnumeratorCallback(void *address, size_t size); #endif - static void RecyclerFunctionCallbackForDebugger(void *address, size_t size); - - static ushort ProcessNameAndGetLength(Js::StringBuilder* nameBuffer, const WCHAR* name); - -#ifdef ASMJS_PLAT - void TransitionEnvironmentForDebugger(ScriptFunction * scriptFunction); -#endif #if ENABLE_NATIVE_CODEGEN - HRESULT RecreateNativeCodeGenerator(); + HRESULT RecreateNativeCodeGenerator(NativeCodeGenerator ** previousCodeGen = nullptr); + void DeletePreviousNativeCodeGenerator(NativeCodeGenerator * codeGen); + HRESULT OnDebuggerAttachedDetached(bool attach, NativeCodeGenerator ** previousCodeGenHolder = nullptr); +#else + HRESULT OnDebuggerAttachedDetached(bool attach); #endif + bool IsForceNoNative(); +#ifdef ENABLE_SCRIPT_DEBUGGING HRESULT OnDebuggerAttached(); HRESULT OnDebuggerDetached(); - HRESULT OnDebuggerAttachedDetached(bool attach); void InitializeDebugging(); - bool IsForceNoNative(); bool IsEnumeratingRecyclerObjects() const { return isEnumeratingRecyclerObjects; } - private: class AutoEnumeratingRecyclerObjects { @@ -1599,6 +1597,7 @@ namespace Js private: ScriptContext* m_scriptContext; }; +#endif #ifdef EDIT_AND_CONTINUE private: @@ -1628,7 +1627,10 @@ namespace Js Js::PropertyId GetFunctionNumber(JavascriptMethod entryPoint); static const char16* CopyString(const char16* str, size_t charCount, ArenaAllocator* alloc); + +#ifdef ENABLE_JS_ETW static charcount_t AppendWithEscapeCharacters(Js::StringBuilder* stringBuilder, const WCHAR* sourceString, charcount_t sourceStringLen, WCHAR escapeChar, WCHAR charToEscape); +#endif public: #if DYNAMIC_INTERPRETER_THUNK @@ -1673,12 +1675,13 @@ namespace Js static HRESULT FunctionExitSenderThunk(PROFILER_TOKEN functionId, PROFILER_TOKEN scriptId, ScriptContext *pScriptContext); static HRESULT FunctionExitByNameSenderThunk(const char16 *pwszFunctionName, ScriptContext *pScriptContext); -#endif // ENABLE_SCRIPT_PROFILING bool SetDispatchProfile(bool fSet, JavascriptMethod dispatchInvoke); HRESULT OnDispatchFunctionEnter(const WCHAR *pwszFunctionName); HRESULT OnDispatchFunctionExit(const WCHAR *pwszFunctionName); +#endif // ENABLE_SCRIPT_PROFILING + void OnStartupComplete(); void SaveStartupProfileAndRelease(bool isSaveOnClose = false); @@ -1744,10 +1747,14 @@ namespace Js virtual bool IsPRNGSeeded() const override; virtual intptr_t GetBuiltinFunctionsBaseAddr() const override; +#ifdef ENABLE_SCRIPT_DEBUGGING virtual intptr_t GetDebuggingFlagsAddr() const override; virtual intptr_t GetDebugStepTypeAddr() const override; virtual intptr_t GetDebugFrameAddressAddr() const override; virtual intptr_t GetDebugScriptIdWhenSetAddr() const override; +#endif + + virtual intptr_t GetChakraLibAddr() const override; #if ENABLE_NATIVE_CODEGEN virtual void AddToDOMFastPathHelperMap(intptr_t funcInfoAddr, IR::JnHelperMethod helper) override; @@ -1898,6 +1905,7 @@ namespace Js bool isPhaseComplete; }; +#ifdef ENABLE_SCRIPT_DEBUGGING // Set up a scope in which we will initialize library JS code (like Intl.js), // which should not be treated as user-level JS code. // We should not profile and should not log debugger information in such a scope. @@ -1924,6 +1932,7 @@ namespace Js this->scriptContext->SetIsDebuggerRecording(this->oldIsDebuggerRecording); } }; +#endif } #define BEGIN_TEMP_ALLOCATOR(allocator, scriptContext, name) \ diff --git a/deps/chakrashim/core/lib/Runtime/Base/ScriptContextInfo.h b/deps/chakrashim/core/lib/Runtime/Base/ScriptContextInfo.h index ba12b1bd250..f75e18489d4 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/ScriptContextInfo.h +++ b/deps/chakrashim/core/lib/Runtime/Base/ScriptContextInfo.h @@ -52,10 +52,14 @@ class ScriptContextInfo virtual Field(Js::Var)* GetModuleExportSlotArrayAddress(uint moduleIndex, uint slotIndex) = 0; +#ifdef ENABLE_SCRIPT_DEBUGGING virtual intptr_t GetDebuggingFlagsAddr() const = 0; virtual intptr_t GetDebugStepTypeAddr() const = 0; virtual intptr_t GetDebugFrameAddressAddr() const = 0; virtual intptr_t GetDebugScriptIdWhenSetAddr() const = 0; +#endif + + virtual intptr_t GetChakraLibAddr() const = 0; #if ENABLE_NATIVE_CODEGEN virtual void AddToDOMFastPathHelperMap(intptr_t funcInfoAddr, IR::JnHelperMethod helper) = 0; diff --git a/deps/chakrashim/core/lib/Runtime/Debug/SourceContextInfo.cpp b/deps/chakrashim/core/lib/Runtime/Base/SourceContextInfo.cpp similarity index 98% rename from deps/chakrashim/core/lib/Runtime/Debug/SourceContextInfo.cpp rename to deps/chakrashim/core/lib/Runtime/Base/SourceContextInfo.cpp index d3c21fee54f..2cf6e27396d 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/SourceContextInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/SourceContextInfo.cpp @@ -2,7 +2,7 @@ // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- -#include "RuntimeDebugPch.h" +#include "RuntimeBasePch.h" #include "Language/SourceDynamicProfileManager.h" using namespace Js; diff --git a/deps/chakrashim/core/lib/Runtime/Debug/SourceContextInfo.h b/deps/chakrashim/core/lib/Runtime/Base/SourceContextInfo.h similarity index 100% rename from deps/chakrashim/core/lib/Runtime/Debug/SourceContextInfo.h rename to deps/chakrashim/core/lib/Runtime/Base/SourceContextInfo.h diff --git a/deps/chakrashim/core/lib/Runtime/Base/ThreadConfigFlagsList.h b/deps/chakrashim/core/lib/Runtime/Base/ThreadConfigFlagsList.h index 019bb2da82d..8a23849f862 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/ThreadConfigFlagsList.h +++ b/deps/chakrashim/core/lib/Runtime/Base/ThreadConfigFlagsList.h @@ -44,7 +44,6 @@ FLAG_RELEASE(IsES6RegExSymbolsEnabled, ES6RegExSymbols) FLAG_RELEASE(IsES6HasInstanceEnabled, ES6HasInstance) FLAG_RELEASE(SkipSplitOnNoResult, SkipSplitOnNoResult) FLAG_RELEASE(IsES7AsyncAndAwaitEnabled, ES7AsyncAwait) -FLAG_RELEASE(IsArrayBufferTransferEnabled, ArrayBufferTransfer) FLAG_RELEASE(IsESObjectGetOwnPropertyDescriptorsEnabled, ESObjectGetOwnPropertyDescriptors) FLAG_RELEASE(IsESSharedArrayBufferEnabled, ESSharedArrayBuffer) FLAG_RELEASE(IsESDynamicImportEnabled, ESDynamicImport) diff --git a/deps/chakrashim/core/lib/Runtime/Base/ThreadContext.cpp b/deps/chakrashim/core/lib/Runtime/Base/ThreadContext.cpp index f7d0a75b5aa..9cec9aa0b35 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/ThreadContext.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/ThreadContext.cpp @@ -4,12 +4,13 @@ //------------------------------------------------------------------------------------------------------- #include "RuntimeBasePch.h" -#include "BackendApi.h" #include "ThreadServiceWrapper.h" #include "Types/TypePropertyCache.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DebuggingFlags.h" #include "Debug/DiagProbe.h" #include "Debug/DebugManager.h" +#endif #include "Chars.h" #include "CaseInsensitive.h" #include "CharSet.h" @@ -75,9 +76,13 @@ ThreadContext::RecyclableData::RecyclableData(Recycler *const recycler) : oomErrorObject(nullptr, nullptr, nullptr, true), terminatedErrorObject(nullptr, nullptr, nullptr), typesWithProtoPropertyCache(recycler), +#if ENABLE_NATIVE_CODEGEN propertyGuards(recycler, 128), +#endif oldEntryPointInfo(nullptr), +#ifdef ENABLE_SCRIPT_DEBUGGING returnedValueList(nullptr), +#endif constructorCacheInvalidationCount(0) { } @@ -120,6 +125,7 @@ ThreadContext::ThreadContext(AllocationPolicyManager * allocationPolicyManager, entryExitRecord(nullptr), leafInterpreterFrame(nullptr), threadServiceWrapper(nullptr), + tryCatchFrameAddr(nullptr), temporaryArenaAllocatorCount(0), temporaryGuestArenaAllocatorCount(0), crefSContextForDiag(0), @@ -166,7 +172,7 @@ ThreadContext::ThreadContext(AllocationPolicyManager * allocationPolicyManager, thunkPageAllocators(allocationPolicyManager, /* allocXData */ false, /* virtualAllocator */ nullptr, GetCurrentProcess()), #endif codePageAllocators(allocationPolicyManager, ALLOC_XDATA, GetPreReservedVirtualAllocator(), GetCurrentProcess()), -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) jitThunkEmitter(this, &VirtualAllocWrapper::Instance , GetCurrentProcess()), #endif #endif @@ -186,8 +192,10 @@ ThreadContext::ThreadContext(AllocationPolicyManager * allocationPolicyManager, gcSinceLastRedeferral(0), gcSinceCallCountsCollected(0), tridentLoadAddress(nullptr), - m_remoteThreadContextInfo(nullptr), - debugManager(nullptr) + m_remoteThreadContextInfo(nullptr) +#ifdef ENABLE_SCRIPT_DEBUGGING + , debugManager(nullptr) +#endif #if ENABLE_TTD , TTDContext(nullptr) , TTDExecutionInfo(nullptr) @@ -328,7 +336,7 @@ ThreadContext::GetThreadStackLimitAddr() const return (intptr_t)GetAddressOfStackLimitForCurrentThread(); } -#if ENABLE_NATIVE_CODEGEN && defined(ENABLE_SIMDJS) && (defined(_M_IX86) || defined(_M_X64)) +#if ENABLE_NATIVE_CODEGEN && (defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD)) && (defined(_M_IX86) || defined(_M_X64)) intptr_t ThreadContext::GetSimdTempAreaAddr(uint8 tempIndex) const { @@ -470,11 +478,13 @@ ThreadContext::~ThreadContext() this->recyclableData->symbolRegistrationMap = nullptr; } +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->recyclableData->returnedValueList != nullptr) { this->recyclableData->returnedValueList->Clear(); this->recyclableData->returnedValueList = nullptr; } +#endif if (this->propertyMap != nullptr) { @@ -522,9 +532,9 @@ ThreadContext::~ThreadContext() } #endif #endif - +#ifdef ENABLE_SCRIPT_DEBUGGING Assert(this->debugManager == nullptr); - +#endif HeapDelete(recycler); } @@ -618,7 +628,6 @@ void ThreadContext::CloseForJSRT() ShutdownThreads(); } - ThreadContext* ThreadContext::GetContextForCurrentThread() { ThreadContextTLSEntry * tlsEntry = ThreadContextTLSEntry::GetEntryForCurrentThread(); @@ -783,7 +792,7 @@ Recycler* ThreadContext::EnsureRecycler() try { #ifdef RECYCLER_WRITE_BARRIER -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 if (!RecyclerWriteBarrierManager::OnThreadInit()) { Js::Throw::OutOfMemory(); @@ -878,6 +887,13 @@ ThreadContext::GetPropertyNameImpl(Js::PropertyId propertyId) void ThreadContext::FindPropertyRecord(Js::JavascriptString *pstName, Js::PropertyRecord const ** propertyRecord) { + const Js::PropertyRecord * propRecord = pstName->GetPropertyRecord(true); + if (propRecord != nullptr) + { + *propertyRecord = propRecord; + return; + } + LPCWSTR psz = pstName->GetSz(); FindPropertyRecord(psz, pstName->GetLength(), propertyRecord); } @@ -1182,12 +1198,12 @@ ThreadContext::BindPropertyRecord(const Js::PropertyRecord * propertyRecord) } } -void ThreadContext::GetOrAddPropertyId(__in LPCWSTR propertyName, __in int propertyNameLength, Js::PropertyRecord const ** propertyRecord) +void ThreadContext::GetOrAddPropertyId(_In_ LPCWSTR propertyName, _In_ int propertyNameLength, _Out_ Js::PropertyRecord const ** propertyRecord) { GetOrAddPropertyId(JsUtil::CharacterBuffer(propertyName, propertyNameLength), propertyRecord); } -void ThreadContext::GetOrAddPropertyId(JsUtil::CharacterBuffer const& propertyName, Js::PropertyRecord const ** propRecord) +void ThreadContext::GetOrAddPropertyId(_In_ JsUtil::CharacterBuffer const& propertyName, _Out_ Js::PropertyRecord const ** propRecord) { EnterPinnedScope((volatile void **)propRecord); *propRecord = GetOrAddPropertyRecord(propertyName); @@ -1576,9 +1592,14 @@ ThreadContext::SetForceOneIdleCollection() } -BOOLEAN +bool ThreadContext::IsOnStack(void const *ptr) { + if (IS_ASAN_FAKE_STACK_ADDR(ptr)) + { + return true; + } + #if defined(_M_IX86) && defined(_MSC_VER) return ptr < (void*)__readfsdword(0x4) && ptr >= (void*)__readfsdword(0xE0C); #elif defined(_M_AMD64) && defined(_MSC_VER) @@ -1969,18 +1990,7 @@ ThreadContext::EnsureJITThreadContext(bool allowPrereserveAlloc) return true; } -#ifdef USE_RPC_HANDLE_MARSHALLING - HANDLE processHandle; - if (!DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &processHandle, 0, false, DUPLICATE_SAME_ACCESS)) - { - return false; - } - AutoCloseHandle autoClose(processHandle); -#endif - ThreadContextDataIDL contextData; - contextData.chakraBaseAddress = (intptr_t)AutoSystemInfo::Data.GetChakraBaseAddr(); - contextData.crtBaseAddress = (intptr_t)AutoSystemInfo::Data.GetCRTHandle(); contextData.threadStackLimitAddr = reinterpret_cast(GetAddressOfStackLimitForCurrentThread()); contextData.bailOutRegisterSaveSpaceAddr = (intptr_t)bailOutRegisterSaveSpace; contextData.disableImplicitFlagsAddr = (intptr_t)GetAddressOfDisableImplicitFlags(); @@ -1988,7 +1998,7 @@ ThreadContext::EnsureJITThreadContext(bool allowPrereserveAlloc) contextData.scriptStackLimit = GetScriptStackLimit(); contextData.isThreadBound = IsThreadBound(); contextData.allowPrereserveAlloc = allowPrereserveAlloc; -#if defined(ENABLE_SIMDJS) && (_M_IX86 || _M_AMD64) +#if (defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD)) && (_M_IX86 || _M_AMD64) contextData.simdTempAreaBaseAddr = (intptr_t)GetSimdTempArea(); #endif @@ -2005,9 +2015,6 @@ ThreadContext::EnsureJITThreadContext(bool allowPrereserveAlloc) HRESULT hr = JITManager::GetJITManager()->InitializeThreadContext( &contextData, -#ifdef USE_RPC_HANDLE_MARSHALLING - processHandle, -#endif &m_remoteThreadContextInfo, &m_prereservedRegionAddr, &m_jitThunkStartAddr); @@ -2201,9 +2208,11 @@ ThreadContext::PushEntryExitRecord(Js::ScriptEntryExitRecord * record) // then the list somehow got messed up if ( #if defined(JSRT_VERIFY_RUNTIME_STATE) || defined(DEBUG) - !IsOnStack(lastRecord) || + !IsOnStack(lastRecord) || #endif - (uintptr_t)record >= (uintptr_t)lastRecord) + ((uintptr_t)record >= (uintptr_t)lastRecord + && !IS_ASAN_FAKE_STACK_ADDR(record) + && !IS_ASAN_FAKE_STACK_ADDR(lastRecord))) { EntryExitRecord_Corrupted_fatal_error(); } @@ -2223,7 +2232,9 @@ void ThreadContext::PopEntryExitRecord(Js::ScriptEntryExitRecord * record) #if defined(JSRT_VERIFY_RUNTIME_STATE) || defined(DEBUG) !IsOnStack(next) || #endif - (uintptr_t)this->entryExitRecord >= (uintptr_t)next)) + ((uintptr_t)this->entryExitRecord >= (uintptr_t)next + && !IS_ASAN_FAKE_STACK_ADDR(this->entryExitRecord) + && !IS_ASAN_FAKE_STACK_ADDR(next)))) { EntryExitRecord_Corrupted_fatal_error(); } @@ -2274,6 +2285,7 @@ void ThreadContext::SetWellKnownHostTypeId(WellKnownHostType wellKnownType, Js:: } } +#ifdef ENABLE_SCRIPT_DEBUGGING void ThreadContext::EnsureDebugManager() { if (this->debugManager == nullptr) @@ -2307,7 +2319,7 @@ void ThreadContext::ReleaseDebugManager() } } - +#endif Js::TempArenaAllocatorObject * ThreadContext::GetTemporaryAllocator(LPCWSTR name) @@ -2956,9 +2968,13 @@ ThreadContext::InExpirableCollectMode() // and when debugger is attaching, it might have set the function to deferredParse. return (expirableObjectList != nullptr && numExpirableObjects > 0 && - expirableCollectModeGcCount >= 0 && + expirableCollectModeGcCount >= 0 +#ifdef ENABLE_SCRIPT_DEBUGGING + && (this->GetDebugManager() != nullptr && - !this->GetDebugManager()->IsDebuggerAttaching())); + !this->GetDebugManager()->IsDebuggerAttaching()) +#endif + ); } void @@ -3084,11 +3100,12 @@ ThreadContext::ClearInlineCachesWithDeadWeakRefs() polyInlineCacheSize += scriptContext->GetInlineCacheAllocator()->GetPolyInlineCacheSize(); #endif }; - printf("Inline cache arena: total = %5I64u KB, free list = %5I64u KB, poly caches = %5I64u KB, script contexts = %u\n", + Output::Print(_u("Inline cache arena: total = %5I64u KB, free list = %5I64u KB, poly caches = %5I64u KB, script contexts = %u\n"), static_cast(size / 1024), static_cast(freeListSize / 1024), static_cast(polyInlineCacheSize / 1024), scriptContextCount); } } +#if ENABLE_NATIVE_CODEGEN void ThreadContext::ClearInvalidatedUniqueGuards() { @@ -3121,6 +3138,7 @@ ThreadContext::ClearInvalidatedUniqueGuards() }); }); } +#endif void ThreadContext::ClearInlineCaches() @@ -3132,7 +3150,7 @@ ThreadContext::ClearInlineCaches() size_t polyInlineCacheSize = 0; uint scriptContextCount = 0; for (Js::ScriptContext *scriptContext = scriptContextList; - scriptContext; + scriptContext; scriptContext = scriptContext->next) { scriptContextCount++; @@ -3142,7 +3160,7 @@ ThreadContext::ClearInlineCaches() polyInlineCacheSize += scriptContext->GetInlineCacheAllocator()->GetPolyInlineCacheSize(); #endif }; - printf("Inline cache arena: total = %5I64u KB, free list = %5I64u KB, poly caches = %5I64u KB, script contexts = %u\n", + Output::Print(_u("Inline cache arena: total = %5I64u KB, free list = %5I64u KB, poly caches = %5I64u KB, script contexts = %u\n"), static_cast(size / 1024), static_cast(freeListSize / 1024), static_cast(polyInlineCacheSize / 1024), scriptContextCount); } diff --git a/deps/chakrashim/core/lib/Runtime/Base/ThreadContext.h b/deps/chakrashim/core/lib/Runtime/Base/ThreadContext.h index 986f6a45f5e..668b141efa8 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/ThreadContext.h +++ b/deps/chakrashim/core/lib/Runtime/Base/ThreadContext.h @@ -8,10 +8,12 @@ namespace Js { class ScriptContext; struct InlineCache; - class DebugManager; class CodeGenRecyclableData; +#ifdef ENABLE_SCRIPT_DEBUGGING + class DebugManager; struct ReturnedValue; typedef JsUtil::List ReturnedValueList; +#endif } typedef BVSparse ActiveFunctionSet; @@ -410,7 +412,9 @@ class ThreadContext sealed : void AddSimdFuncInfo(Js::OpCode op, Js::FunctionInfo *funcInfo); Js::OpCode GetSimdOpcodeFromFuncInfo(Js::FunctionInfo * funcInfo); void GetSimdFuncSignatureFromOpcode(Js::OpCode op, SimdFuncSignature &funcSignature); +#endif +#if defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) #if _M_IX86 || _M_AMD64 // auxiliary SIMD values in memory to help JIT'ed code. E.g. used for Int8x16 shuffle. _x86_SIMDValue X86_TEMP_SIMD[SIMD_TEMP_SIZE]; @@ -443,7 +447,9 @@ class ThreadContext sealed : Js::JavascriptExceptionObject * pendingFinallyException; bool noScriptScope; +#ifdef ENABLE_SCRIPT_DEBUGGING Js::DebugManager * debugManager; +#endif static uint const MaxTemporaryArenaAllocators = 5; @@ -584,6 +590,7 @@ class ThreadContext sealed : // that would not get removed, but it would also not get any bigger. Field(PropertyIdToTypeHashSetDictionary) typesWithProtoPropertyCache; +#if ENABLE_NATIVE_CODEGEN // The property guard dictionary contains property guards which need to be invalidated in response to properties changing // from writable to read-only and vice versa, properties being shadowed or unshadowed on prototypes, etc. The dictionary // holds only weak references to property guards and their lifetimes are controlled by their creators (typically entry points). @@ -591,7 +598,7 @@ class ThreadContext sealed : // the guards for a given property get invalidated. // TODO: Create and use a self-cleaning weak reference dictionary, which would periodically remove any unused weak references. Field(PropertyGuardDictionary) propertyGuards; - +#endif Field(PropertyNoCaseSetType *) caseInvariantPropertySet; @@ -610,8 +617,10 @@ class ThreadContext sealed : // See ES6 (draft 22) 19.4.2.2 Field(SymbolRegistrationMap*) symbolRegistrationMap; +#ifdef ENABLE_SCRIPT_DEBUGGING // Just holding the reference to the returnedValueList of the stepController. This way that list will not get recycled prematurely. Field(Js::ReturnedValueList *) returnedValueList; +#endif Field(uint) constructorCacheInvalidationCount; @@ -672,7 +681,7 @@ class ThreadContext sealed : ThreadServiceWrapper* threadServiceWrapper; uint functionCount; uint sourceInfoCount; - + void * tryCatchFrameAddr; enum RedeferralState { InitialRedeferralState, @@ -710,7 +719,7 @@ class ThreadContext sealed : CustomHeap::InProcCodePageAllocators thunkPageAllocators; #endif CustomHeap::InProcCodePageAllocators codePageAllocators; -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) InProcJITThunkEmitter jitThunkEmitter; #endif #endif @@ -873,7 +882,7 @@ class ThreadContext sealed : #endif CustomHeap::InProcCodePageAllocators * GetCodePageAllocators() { return &codePageAllocators; } -#if defined(_CONTROL_FLOW_GUARD) && (_M_IX86 || _M_X64) +#if defined(_CONTROL_FLOW_GUARD) && !defined(_M_ARM) InProcJITThunkEmitter * GetJITThunkEmitter() { return &jitThunkEmitter; } #endif #endif // ENABLE_NATIVE_CODEGEN @@ -963,6 +972,7 @@ class ThreadContext sealed : Js::PropertyId handlerPropertyId = Js::Constants::NoProperty; #endif +#ifdef ENABLE_SCRIPT_DEBUGGING void SetReturnedValueList(Js::ReturnedValueList *returnedValueList) { Assert(this->recyclableData != nullptr); @@ -974,6 +984,8 @@ class ThreadContext sealed : Assert(this->recyclableData == nullptr || this->recyclableData->returnedValueList == nullptr); } #endif +#endif + #if DBG || defined(RUNTIME_DATA_COLLECTION) uint GetScriptContextCount() const { return this->scriptContextCount; } #endif @@ -1136,8 +1148,8 @@ class ThreadContext sealed : } void AddBuiltInPropertyRecord(const Js::PropertyRecord *propertyRecord); - void GetOrAddPropertyId(__in LPCWSTR propertyName, __in int propertyNameLength, Js::PropertyRecord const** propertyRecord); - void GetOrAddPropertyId(JsUtil::CharacterBuffer const& propertyName, Js::PropertyRecord const** propertyRecord); + void GetOrAddPropertyId(_In_ LPCWSTR propertyName, _In_ int propertyNameLength, _Out_ Js::PropertyRecord const** propertyRecord); + void GetOrAddPropertyId(_In_ JsUtil::CharacterBuffer const& propertyName, _Out_ Js::PropertyRecord const** propertyRecord); Js::PropertyRecord const * UncheckedAddPropertyId(JsUtil::CharacterBuffer const& propertyName, bool bind, bool isSymbol = false); Js::PropertyRecord const * UncheckedAddPropertyId(__in LPCWSTR propertyName, __in int propertyNameLength, bool bind = false, bool isSymbol = false); @@ -1245,6 +1257,9 @@ class ThreadContext sealed : uint EnterScriptStart(Js::ScriptEntryExitRecord *, bool doCleanup); void EnterScriptEnd(Js::ScriptEntryExitRecord *, bool doCleanup); + void * GetTryCatchFrameAddr() { return this->tryCatchFrameAddr; } + void SetTryCatchFrameAddr(void * frameAddr) { this->tryCatchFrameAddr = frameAddr; } + template void LeaveScriptStart(void *); template @@ -1261,11 +1276,13 @@ class ThreadContext sealed : Js::TempGuestArenaAllocatorObject * GetTemporaryGuestAllocator(LPCWSTR name); void ReleaseTemporaryGuestAllocator(Js::TempGuestArenaAllocatorObject * tempAllocator); +#ifdef ENABLE_SCRIPT_DEBUGGING // Should be called from script context, at the time when construction for scriptcontext is just done. void EnsureDebugManager(); // Should be called from script context 's destructor, void ReleaseDebugManager(); +#endif void RegisterScriptContext(Js::ScriptContext *scriptContext); void UnregisterScriptContext(Js::ScriptContext *scriptContext); @@ -1309,7 +1326,7 @@ class ThreadContext sealed : virtual intptr_t GetThreadStackLimitAddr() const override; -#if ENABLE_NATIVE_CODEGEN && defined(ENABLE_SIMDJS) && (defined(_M_IX86) || defined(_M_X64)) +#if ENABLE_NATIVE_CODEGEN && (defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD)) && (defined(_M_IX86) || defined(_M_X64)) virtual intptr_t GetSimdTempAreaAddr(uint8 tempIndex) const override; #endif @@ -1442,7 +1459,7 @@ class ThreadContext sealed : } } - static BOOLEAN IsOnStack(void const *ptr); + static bool IsOnStack(void const *ptr); _NOINLINE bool IsStackAvailable(size_t size); _NOINLINE bool IsStackAvailableNoThrow(size_t size = Js::Constants::MinStackDefault); static bool IsCurrentStackAvailable(size_t size); @@ -1659,7 +1676,9 @@ class ThreadContext sealed : bool IsInThreadServiceCallback() const { return threadService.IsInCallback(); } +#ifdef ENABLE_SCRIPT_DEBUGGING Js::DebugManager * GetDebugManager() const { return this->debugManager; } +#endif const NativeLibraryEntryRecord::Entry* PeekNativeLibraryEntry() const { return this->nativeLibraryEntry.Peek(); } void PushNativeLibraryEntry(_In_ NativeLibraryEntryRecord::Entry* entry) { this->nativeLibraryEntry.Push(entry); } diff --git a/deps/chakrashim/core/lib/Runtime/Base/ThreadContextInfo.cpp b/deps/chakrashim/core/lib/Runtime/Base/ThreadContextInfo.cpp index 4616d932390..fadd850f468 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/ThreadContextInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/ThreadContextInfo.cpp @@ -418,7 +418,12 @@ ThreadContextInfo::SetValidCallTargetForCFG(PVOID callTargetAddress, bool isSetV #ifdef _CONTROL_FLOW_GUARD if (IsCFGEnabled()) { +#ifdef _M_ARM + AssertMsg(((uintptr_t)callTargetAddress & 0x1) != 0, "on ARM we expect the thumb bit to be set on anything we use as a call target"); + AssertMsg(IS_16BYTE_ALIGNED((uintptr_t)callTargetAddress & ~0x1), "callTargetAddress is not 16-byte page aligned?"); +#else AssertMsg(IS_16BYTE_ALIGNED(callTargetAddress), "callTargetAddress is not 16-byte page aligned?"); +#endif // If SetProcessValidCallTargets is not allowed by global policy (e.g. // OOP JIT is in use in the client), then generate a fast fail @@ -450,9 +455,9 @@ ThreadContextInfo::SetValidCallTargetForCFG(PVOID callTargetAddress, bool isSetV //Throw OOM, if there is not enough virtual memory for paging (required for CFG BitMap) Js::Throw::OutOfMemory(); } - else if (gle == STATUS_PROCESS_IS_TERMINATING) + else if (gle == ERROR_ACCESS_DENIED) { - // When this error is set, the target process is exiting and thus cannot proceed with + // When this error is set, the target process may be exiting and thus cannot proceed with // JIT output. Throw this exception to safely abort this call. throw Js::OperationAbortedException(); } diff --git a/deps/chakrashim/core/lib/Runtime/Base/ThreadContextInfo.h b/deps/chakrashim/core/lib/Runtime/Base/ThreadContextInfo.h index d5c6182d3aa..2412491090b 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/ThreadContextInfo.h +++ b/deps/chakrashim/core/lib/Runtime/Base/ThreadContextInfo.h @@ -103,7 +103,7 @@ class ThreadContextInfo virtual ptrdiff_t GetCRTBaseAddressDifference() const = 0; #if ENABLE_NATIVE_CODEGEN -#if defined(ENABLE_SIMDJS) && (defined(_M_IX86) || defined(_M_X64)) +#if (defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD)) && (defined(_M_IX86) || defined(_M_X64)) virtual intptr_t GetSimdTempAreaAddr(uint8 tempIndex) const = 0; #endif virtual intptr_t GetBailOutRegisterSaveSpaceAddr() const = 0; diff --git a/deps/chakrashim/core/lib/Runtime/Base/Utf8SourceInfo.cpp b/deps/chakrashim/core/lib/Runtime/Base/Utf8SourceInfo.cpp index e3c4566573f..26b1c65fdb4 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/Utf8SourceInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/Base/Utf8SourceInfo.cpp @@ -3,10 +3,12 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeBasePch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DiagProbe.h" #include "Debug/BreakpointProbe.h" #include "Debug/DebugDocument.h" #include "Debug/DebugManager.h" +#endif namespace Js { @@ -21,7 +23,9 @@ namespace Js m_pHostBuffer(nullptr), m_srcInfo(srcInfo), m_secondaryHostSourceContext(secondaryHostSourceContext), +#ifdef ENABLE_SCRIPT_DEBUGGING m_debugDocument(nullptr), +#endif m_sourceInfoId(scriptContext->GetThreadContext()->NewSourceInfoNumber()), m_hasHostBuffer(false), m_isCesu8(false), @@ -33,32 +37,38 @@ namespace Js m_deferredFunctionsDictionary(nullptr), m_deferredFunctionsInitialized(false), topLevelFunctionInfoList(nullptr), +#ifdef ENABLE_SCRIPT_DEBUGGING debugModeSource(nullptr), debugModeSourceIsEmpty(false), debugModeSourceLength(0), m_isInDebugMode(false), +#endif callerUtf8SourceInfo(nullptr) #ifndef NTBUILD ,sourceRef(scriptSource) #endif { +#ifdef ENABLE_SCRIPT_DEBUGGING if (!sourceHolder->IsDeferrable()) { this->debugModeSource = this->sourceHolder->GetSource(_u("Entering Debug Mode")); this->debugModeSourceLength = this->sourceHolder->GetByteLength(_u("Entering Debug Mode")); this->debugModeSourceIsEmpty = !this->HasSource() || this->debugModeSource == nullptr; } +#endif } LPCUTF8 Utf8SourceInfo::GetSource(const char16 * reason) const { AssertMsg(this->sourceHolder != nullptr, "We have no source mapper."); +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { AssertMsg(this->debugModeSource != nullptr || this->debugModeSourceIsEmpty, "Debug mode source should have been set by this point."); return debugModeSource; } else +#endif { return sourceHolder->GetSource(reason == nullptr ? _u("Utf8SourceInfo::GetSource") : reason); } @@ -67,12 +77,14 @@ namespace Js size_t Utf8SourceInfo::GetCbLength(const char16 * reason) const { AssertMsg(this->sourceHolder != nullptr, "We have no source mapper."); +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { AssertMsg(this->debugModeSource != nullptr || this->debugModeSourceIsEmpty, "Debug mode source should have been set by this point."); return debugModeSourceLength; } else +#endif { return sourceHolder->GetByteLength(reason == nullptr ? _u("Utf8SourceInfo::GetSource") : reason); } @@ -82,11 +94,13 @@ namespace Js void Utf8SourceInfo::Dispose(bool isShutdown) { +#ifdef ENABLE_SCRIPT_DEBUGGING ClearDebugDocument(); + this->debugModeSource = nullptr; +#endif #ifndef NTBUILD this->sourceRef = nullptr; #endif - this->debugModeSource = nullptr; if (this->m_hasHostBuffer) { PERF_COUNTER_DEC(Basic, ScriptCodeBufferCount); @@ -195,10 +209,12 @@ namespace Js { // TODO: make this finalizable? Or have a finalizable version which would HeapDelete the string? Is this needed? DWORD_PTR secondaryHostSourceContext = Js::Constants::NoHostSourceContext; +#ifdef ENABLE_SCRIPT_DEBUGGING if (srcInfo->sourceContextInfo->IsDynamic()) { secondaryHostSourceContext = scriptContext->GetThreadContext()->GetDebugManager()->AllocateSecondaryHostSourceContext(); } +#endif Recycler * recycler = scriptContext->GetRecycler(); @@ -206,12 +222,14 @@ namespace Js Utf8SourceInfo, sourceHolder, length, SRCINFO::Copy(recycler, srcInfo), secondaryHostSourceContext, scriptContext, isLibraryCode, scriptSource); +#ifdef ENABLE_SCRIPT_DEBUGGING if (!isLibraryCode && scriptContext->IsScriptContextInDebugMode()) { toReturn->debugModeSource = sourceHolder->GetSource(_u("Debug Mode Loading")); toReturn->debugModeSourceLength = sourceHolder->GetByteLength(_u("Debug Mode Loading")); toReturn->debugModeSourceIsEmpty = toReturn->debugModeSource == nullptr || sourceHolder->IsEmpty(); } +#endif return toReturn; } @@ -249,10 +267,12 @@ namespace Js newSourceInfo->SetIsCesu8(sourceInfo->GetIsCesu8()); newSourceInfo->m_lineOffsetCache = sourceInfo->m_lineOffsetCache; +#ifdef ENABLE_SCRIPT_DEBUGGING if (scriptContext->IsScriptContextInDebugMode() && !newSourceInfo->GetIsLibraryCode()) { newSourceInfo->SetInDebugMode(true); } +#endif return newSourceInfo; } @@ -284,7 +304,7 @@ namespace Js int64 byteStartOffset = (sourceAfterBOM - sourceStart); Recycler* recycler = this->m_scriptContext->GetRecycler(); - this->m_lineOffsetCache = RecyclerNew(recycler, JsUtil::LineOffsetCache, recycler, sourceAfterBOM, sourceEnd, startChar, (int)byteStartOffset); + this->m_lineOffsetCache = RecyclerNew(recycler, LineOffsetCache, recycler, sourceAfterBOM, sourceEnd, startChar, (int)byteStartOffset); } } @@ -323,7 +343,7 @@ namespace Js Assert((sourceAfterBOM - sourceStart) < MAXUINT32); charcount_t byteStartOffset = (charcount_t)(sourceAfterBOM - sourceStart); - line = JsUtil::LineOffsetCache::FindLineForCharacterOffset(sourceAfterBOM, sourceEnd, lineCharOffset, byteStartOffset, charPosition); + line = LineOffsetCache::FindLineForCharacterOffset(sourceAfterBOM, sourceEnd, lineCharOffset, byteStartOffset, charPosition); *outLineByteOffset = byteStartOffset; } @@ -338,11 +358,11 @@ namespace Js *outColumn = charPosition - lineCharOffset; } - void Utf8SourceInfo::CreateLineOffsetCache(const JsUtil::LineOffsetCache::LineOffsetCacheItem *items, charcount_t numberOfItems) + void Utf8SourceInfo::CreateLineOffsetCache(const charcount_t *lineCharacterOffsets, const charcount_t *lineByteOffsets, charcount_t numberOfItems) { AssertMsg(this->m_lineOffsetCache == nullptr, "LineOffsetCache is already initialized!"); Recycler* recycler = this->m_scriptContext->GetRecycler(); - this->m_lineOffsetCache = RecyclerNew(recycler, JsUtil::LineOffsetCache, recycler, items, numberOfItems); + this->m_lineOffsetCache = RecyclerNew(recycler, LineOffsetCache, recycler, lineCharacterOffsets, lineByteOffsets, numberOfItems); } DWORD_PTR Utf8SourceInfo::GetHostSourceContext() const @@ -422,6 +442,7 @@ namespace Js } } +#ifdef ENABLE_SCRIPT_DEBUGGING void Utf8SourceInfo::ClearDebugDocument(bool close) { if (this->m_debugDocument != nullptr) @@ -434,10 +455,11 @@ namespace Js this->m_debugDocument = nullptr; } } +#endif +#ifdef NTBUILD bool Utf8SourceInfo::GetDebugDocumentName(BSTR * sourceName) { -#if defined(ENABLE_SCRIPT_DEBUGGING) && defined(_WIN32) if (this->HasDebugDocument() && this->GetDebugDocument()->HasDocumentText()) { // ToDo (SaAgarwa): Fix for JsRT debugging @@ -447,7 +469,7 @@ namespace Js return true; } } -#endif return false; } +#endif } diff --git a/deps/chakrashim/core/lib/Runtime/Base/Utf8SourceInfo.h b/deps/chakrashim/core/lib/Runtime/Base/Utf8SourceInfo.h index 15ad733c814..b02c3ba60b0 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/Utf8SourceInfo.h +++ b/deps/chakrashim/core/lib/Runtime/Base/Utf8SourceInfo.h @@ -40,11 +40,17 @@ namespace Js this->byteCodeGenerationFlags = byteCodeGenerationFlags; } + bool IsInDebugMode() const { +#ifdef ENABLE_SCRIPT_DEBUGGING return (this->debugModeSource != nullptr || this->debugModeSourceIsEmpty) && this->m_isInDebugMode; +#else + return false; +#endif } +#ifdef ENABLE_SCRIPT_DEBUGGING void SetInDebugMode(bool inDebugMode) { AssertMsg(!GetIsLibraryCode(), "Shouldn't call SetInDebugMode for Library code."); @@ -75,6 +81,7 @@ namespace Js this->debugModeSourceLength = 0; } } +#endif size_t CharacterIndexToByteIndex(charcount_t cchIndex) const { @@ -211,6 +218,7 @@ namespace Js void SetHostBuffer(BYTE * pcszCode); +#ifdef ENABLE_SCRIPT_DEBUGGING bool HasDebugDocument() const { return m_debugDocument != nullptr; @@ -229,6 +237,7 @@ namespace Js } void ClearDebugDocument(bool close = true); +#endif void SetIsCesu8(bool isCesu8) { @@ -303,14 +312,14 @@ namespace Js this->m_lineOffsetCache = nullptr; } - void CreateLineOffsetCache(const JsUtil::LineOffsetCache::LineOffsetCacheItem *items, charcount_t numberOfItems); + void CreateLineOffsetCache(const charcount_t *lineCharacterOffsets, const charcount_t *lineByteOffsets, charcount_t numberOfItems); size_t GetLineCount() { return this->GetLineOffsetCache()->GetLineCount(); } - JsUtil::LineOffsetCache *GetLineOffsetCache() + LineOffsetCache *GetLineOffsetCache() { AssertMsg(this->m_lineOffsetCache != nullptr, "LineOffsetCache wasn't created, EnsureLineOffsetCache should have been called."); return m_lineOffsetCache; @@ -358,7 +367,9 @@ namespace Js void SetCallerUtf8SourceInfo(Utf8SourceInfo* callerUtf8SourceInfo); Utf8SourceInfo* GetCallerUtf8SourceInfo() const; +#ifdef NTBUILD bool GetDebugDocumentName(BSTR * sourceName); +#endif private: Field(charcount_t) m_cchLength; // The number of characters encoded in m_utf8Source. @@ -370,18 +381,21 @@ namespace Js Field(DeferredFunctionsDictionary*) m_deferredFunctionsDictionary; Field(FunctionInfoList*) topLevelFunctionInfoList; +#ifdef ENABLE_SCRIPT_DEBUGGING Field(DebugDocument*) m_debugDocument; +#endif Field(const SRCINFO*) m_srcInfo; Field(DWORD_PTR) m_secondaryHostSourceContext; +#ifdef ENABLE_SCRIPT_DEBUGGING Field(LPCUTF8) debugModeSource; Field(size_t) debugModeSourceLength; - +#endif Field(ScriptContext* const) m_scriptContext; // Pointer to ScriptContext under which this source info was created // Line offset cache used for quickly finding line/column offsets. - Field(JsUtil::LineOffsetCache*) m_lineOffsetCache; + Field(LineOffsetCache*) m_lineOffsetCache; // Utf8SourceInfo of the caller, used for mapping eval/new Function node to its caller node for debugger Field(Utf8SourceInfo*) callerUtf8SourceInfo; @@ -393,9 +407,10 @@ namespace Js Field(bool) m_isXDomain : 1; // we found that m_isXDomain could cause regression without CORS, so the new flag is just for callee.caller in window.onerror Field(bool) m_isXDomainString : 1; +#ifdef ENABLE_SCRIPT_DEBUGGING Field(bool) debugModeSourceIsEmpty : 1; Field(bool) m_isInDebugMode : 1; - +#endif Field(uint) m_sourceInfoId; // Various flags preserved for Edit-and-Continue re-compile purpose diff --git a/deps/chakrashim/core/lib/Runtime/Base/WindowsGlobalizationAdapter.h b/deps/chakrashim/core/lib/Runtime/Base/WindowsGlobalizationAdapter.h index e1a4df8f6b6..4b8f5f90cf4 100644 --- a/deps/chakrashim/core/lib/Runtime/Base/WindowsGlobalizationAdapter.h +++ b/deps/chakrashim/core/lib/Runtime/Base/WindowsGlobalizationAdapter.h @@ -6,11 +6,6 @@ #if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_ES6_CHAR_CLASSIFIER) -#ifdef INTL_ICU -#include -#include "PlatformAgnostic/Intl.h" -#endif // INTL_ICU - #ifdef INTL_WINGLOB #include "Windows.Globalization.h" #ifndef NTBUILD @@ -152,56 +147,5 @@ namespace Js #endif }; #endif // INTL_WINGLOB - -#ifdef INTL_ICU -#ifdef ENABLE_INTL_OBJECT - template - class AutoIcuJsObject : public FinalizableObject - { - private: - T *instance; - - public: - DEFINE_VTABLE_CTOR_NOBASE(AutoIcuJsObject); - - AutoIcuJsObject(T *object) - : instance(object) - { } - - static AutoIcuJsObject * New(Recycler *recycler, T *object) - { - return RecyclerNewFinalized(recycler, AutoIcuJsObject, object); - } - - void Finalize(bool isShutdown) override - { - } - - void Dispose(bool isShutdown) override - { - if (!isShutdown) - { - // Here we use Cleanup() because we can't rely on delete (not dealing with virtual destructors). - // The template thus requires that the type implement the Cleanup function. - instance->Cleanup(); // e.g. deletes the object held in the IPlatformAgnosticResource - - // REVIEW (doilij): Is cleanup in this way necessary or are the trivial destructors enough, assuming Cleanup() has been called? - // Note: delete here introduces a build break on Linux complaining of non-virtual dtor - // delete instance; // deletes the instance itself - // instance = nullptr; - } - } - - void Mark(Recycler *recycler) override - { - } - - T * GetInstance() - { - return instance; - } - }; -#endif // ENABLE_INTL_OBJECT -#endif // INTL_ICU } #endif // defined(ENABLE_INTL_OBJECT) || defined(ENABLE_ES6_CHAR_CLASSIFIER) diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeDumper.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeDumper.cpp index 1978892b880..919705a1bed 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeDumper.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeDumper.cpp @@ -61,6 +61,9 @@ namespace Js case AsmJsType::Float64x2: Output::Print(_u("D2(In%hu)"), i); break; + case AsmJsType::Int64x2: + Output::Print(_u("I2(In%hu)"), i); + break; } } else @@ -129,11 +132,6 @@ namespace Js Output::Print(_u("\n")); } - if (funcInfo->GetReturnType() == AsmJsRetType::Void) - { - Output::Print(_u(" 0000 %-20s R0\n"), OpCodeUtilAsmJs::GetOpCodeName(OpCodeAsmJs::LdUndef)); - } - uint32 statementIndex = 0; while (true) { @@ -374,6 +372,12 @@ namespace Js Output::Print(_u(" D2_%d "), (int)reg); } + // Int64x2 + void AsmJsByteCodeDumper::DumpInt64x2Reg(RegSlot reg) + { + Output::Print(_u(" I2_%d "), (int)reg); + } + template void AsmJsByteCodeDumper::DumpElementSlot(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader) { @@ -576,9 +580,9 @@ namespace Js switch (op) { case OpCodeAsmJs::LdArrWasm: - Output::Print(_u(" %c%d = %s[L%d + %d]"), tag.valueTag, data->Value, tag.heapTag, data->SlotIndex, data->Offset); break; + Output::Print(_u(" %c%d = %s[I%d + %d]"), tag.valueTag, data->Value, tag.heapTag, data->SlotIndex, data->Offset); break; case OpCodeAsmJs::StArrWasm: - Output::Print(_u(" %s[L%d + %d] = %c%d"), tag.heapTag, data->SlotIndex, data->Offset, tag.valueTag, data->Value); break; + Output::Print(_u(" %s[I%d + %d] = %c%d"), tag.heapTag, data->SlotIndex, data->Offset, tag.valueTag, data->Value); break; default: Assume(UNREACHED); } @@ -601,11 +605,29 @@ namespace Js Output::Print(_u(" R%d(ArgCount: %d)"), data->Function, data->ArgCount); } + template + void AsmJsByteCodeDumper::DumpProfiledAsmCall(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader) + { + if (data->Return != Constants::NoRegister) + { + DumpReg((RegSlot)data->Return); + Output::Print(_u("=")); + } + Output::Print(_u(" R%d(ArgCount: %d, profileId: %d)"), data->Function, data->ArgCount, data->profileId); + } + template void AsmJsByteCodeDumper::DumpAsmUnsigned1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader) { DumpU4(data->C1); } + + template + void AsmJsByteCodeDumper::DumpWasmLoopStart(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader) + { + DumpU4(data->loopId); + } + void AsmJsByteCodeDumper::DumpEmpty(OpCodeAsmJs op, const unaligned OpLayoutEmpty* data, FunctionBody * dumpFunction, ByteCodeReader& reader) { // empty @@ -966,6 +988,19 @@ namespace Js DumpI4(data->C1); } + template + void AsmJsByteCodeDumper::DumpAsmShuffle(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader) + { + DumpFloat32x4Reg(data->R0); + DumpFloat32x4Reg(data->R1); + DumpFloat32x4Reg(data->R2); + const uint NUM_LANES = 16; + for (uint i = 0; i < NUM_LANES; i++) + { + DumpU4(data->INDICES[i]); + } + } + template void AsmJsByteCodeDumper::DumpAsmSimdTypedArr(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader) { @@ -1011,6 +1046,7 @@ namespace Js #define SIMD_DUMP_ARR_U16 DumpUint8x16Reg #define SIMD_DUMP_ARR_F4 DumpFloat32x4Reg #define SIMD_DUMP_ARR_D2 DumpFloat64x2Reg +#define SIMD_DUMP_ARR_I2 DumpInt64x2Reg #define SIMD_DUMP_REG(type) SIMD_DUMP_ARR_##type(data->Value) #define SIMD_DUMP_ARR_VALUE(type) \ case OpCodeAsmJs::Simd128_LdArr_##type:\ diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeDumper.h b/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeDumper.h index b2c011ebfce..1b695690b23 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeDumper.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeDumper.h @@ -34,6 +34,7 @@ namespace Js { static void DumpBool8x16Reg(RegSlot reg); static void DumpFloat64x2Reg(RegSlot reg); + static void DumpInt64x2Reg(RegSlot reg); static void DumpRegReg(RegSlot reg) { DumpReg(reg); } static void DumpIntConstReg(int val) { DumpI4(val); } diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeWriter.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeWriter.cpp index 6bf5dd846eb..e04455938b3 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeWriter.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeWriter.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "RuntimeByteCodePch.h" +#include "../../WasmReader/WasmParseTree.h" #if defined(ASMJS_PLAT) || defined(ENABLE_WASM) @@ -19,6 +20,12 @@ namespace Js uint offset = GetCurrentOffset(); EncodeOpCode((ushort)op, writer); + if (op > Js::OpCodeAsmJs::Ld_Db || op < Js::OpCodeAsmJs::Ld_IntConst) + { + writer->m_byteCodeWithoutLDACount++; + } + CompileAssert((int)Js::OpCodeAsmJs::Ld_Db - (int)Js::OpCodeAsmJs::Ld_IntConst == 7); + if (!isPatching) { writer->IncreaseByteCodeCount(); @@ -77,6 +84,23 @@ namespace Js } return false; } + + template + bool AsmJsByteCodeWriter::TryWriteFloat32x4_IntConst4(OpCodeAsmJs op, RegSlot R0, int C1, int C2, int C3, int C4) + { + OpLayoutT_Float32x4_IntConst4 layout; + if (SizePolicy::Assign(layout.F4_0, R0) && + SizePolicy::Assign(layout.C1, C1) && + SizePolicy::Assign(layout.C2, C2) && + SizePolicy::Assign(layout.C3, C3) && + SizePolicy::Assign(layout.C4, C4) + ) + { + m_byteCodeData.EncodeT(op, &layout, sizeof(layout), this); + return true; + } + return false; + } template bool AsmJsByteCodeWriter::TryWriteAsmReg2(OpCodeAsmJs op, RegSlot R0, RegSlot R1) { @@ -227,6 +251,19 @@ namespace Js return false; } + template + bool AsmJsByteCodeWriter::TryWriteAsmShuffle(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, uint8 indices[]) + { + OpLayoutT_AsmShuffle layout; + if (SizePolicy::Assign(layout.R0, R0) && SizePolicy::Assign(layout.R1, R1) && SizePolicy::Assign(layout.R2, R2)) + { + memcpy_s(layout.INDICES, Wasm::Simd::MAX_LANES, indices, Wasm::Simd::MAX_LANES); + m_byteCodeData.EncodeT(op, &layout, sizeof(layout), this); + return true; + } + return false; + } + template bool AsmJsByteCodeWriter::TryWriteInt1Const1(OpCodeAsmJs op, RegSlot R0, int C1) { @@ -346,7 +383,7 @@ namespace Js } template - bool AsmJsByteCodeWriter::TryWriteAsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId) + bool AsmJsByteCodeWriter::TryWriteAsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, uint32 slotId) { OpLayoutT_ElementSlot layout; if (SizePolicy::Assign(layout.Value, value) && SizePolicy::Assign(layout.Instance, instance) @@ -386,11 +423,11 @@ namespace Js } template - bool AsmJsByteCodeWriter::TryWriteAsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType) + bool AsmJsByteCodeWriter::TryWriteAsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType, uint32 offset) { OpLayoutT_AsmSimdTypedArr layout; if (SizePolicy::Assign(layout.Value, value) && SizePolicy::template Assign(layout.ViewType, viewType) - && SizePolicy::Assign(layout.SlotIndex, slotIndex) && SizePolicy::template Assign(layout.DataWidth, dataWidth)) + && SizePolicy::Assign(layout.SlotIndex, slotIndex) && SizePolicy::template Assign(layout.DataWidth, dataWidth) && SizePolicy::Assign(layout.Offset, offset)) { m_byteCodeData.EncodeT(op, &layout, sizeof(layout), this); return true; @@ -494,12 +531,22 @@ namespace Js MULTISIZE_LAYOUT_WRITE(AsmReg18, op, R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17); } + void AsmJsByteCodeWriter::AsmShuffle(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, uint8 indices[]) + { + MULTISIZE_LAYOUT_WRITE(AsmShuffle, op, R0, R1, R2, indices); + } + void AsmJsByteCodeWriter::AsmReg19(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17, RegSlot R18) { MULTISIZE_LAYOUT_WRITE(AsmReg19, op, R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R18); } + void AsmJsByteCodeWriter::WasmSimdConst(OpCodeAsmJs op, RegSlot R0, int C0, int C1, int C2, int C3) + { + MULTISIZE_LAYOUT_WRITE(Float32x4_IntConst4, op, R0, C0, C1, C2, C3); + } + void AsmJsByteCodeWriter::AsmBr(ByteCodeLabel labelID, OpCodeAsmJs op) { CheckOpen(); @@ -546,9 +593,17 @@ namespace Js m_byteCodeData.Encode(op, &data, sizeof(data), this, isPatching); } - void AsmJsByteCodeWriter::AsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType) + void AsmJsByteCodeWriter::AsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType, Js::ProfileId profileId) { + if (DoDynamicProfileOpcode(InlinePhase) && profileId != Js::Constants::NoProfileId && OpCodeAttrAsmJs::HasProfiledOp(op)) + { + OpCodeUtilAsmJs::ConvertOpToProfiled(&op); + } MULTISIZE_LAYOUT_WRITE(AsmCall, op, returnValueRegister, functionRegister, givenArgCount, retType); + if (OpCodeAttrAsmJs::IsProfiledOp(op)) + { + m_byteCodeData.Encode(&profileId, sizeof(Js::ProfileId)); + } } void AsmJsByteCodeWriter::AsmTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, ArrayBufferView::ViewType viewType) @@ -561,13 +616,13 @@ namespace Js MULTISIZE_LAYOUT_WRITE(WasmMemAccess, op, value, slotIndex, offset, viewType); } - void AsmJsByteCodeWriter::AsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType) + void AsmJsByteCodeWriter::AsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType, uint32 offset) { Assert(dataWidth >= 4 && dataWidth <= 16); - MULTISIZE_LAYOUT_WRITE(AsmSimdTypedArr, op, value, slotIndex, dataWidth, viewType); + MULTISIZE_LAYOUT_WRITE(AsmSimdTypedArr, op, value, slotIndex, dataWidth, viewType, offset); } - void AsmJsByteCodeWriter::AsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId) + void AsmJsByteCodeWriter::AsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, uint32 slotId) { MULTISIZE_LAYOUT_WRITE(AsmSlot, op, value, instance, slotId); } diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeWriter.h b/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeWriter.h index 45fc73fbaf4..9febcb08185 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeWriter.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/AsmJsByteCodeWriter.h @@ -39,37 +39,40 @@ namespace Js IMP_IWASM void AsmBrReg1(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1); IMP_IWASM void AsmBrReg1Const1(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, int C1); IMP_IWASM void AsmStartCall(OpCodeAsmJs op, ArgSlot ArgCount, bool isPatching = false); - IMP_IWASM void AsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType); - IMP_IWASM void AsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId); + IMP_IWASM void AsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType, ProfileId profileId); + IMP_IWASM void AsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, uint32 slotId); IMP_IWASM void WasmMemAccess(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint32 offset, ArrayBufferView::ViewType viewType); IMP_IWASM void MarkAsmJsLabel(ByteCodeLabel labelID); - IMP_IWASM uint EnterLoop(ByteCodeLabel loopEntrance); IMP_IWASM void ExitLoop(uint loopId); + IMP_IWASM void AsmReg4(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3); + IMP_IWASM void AsmReg5(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4); + IMP_IWASM void AsmReg9(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8); + IMP_IWASM void AsmReg17(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, + RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16); + IMP_IWASM void AsmShuffle(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, uint8 indices[]); + IMP_IWASM void AsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType, uint32 offset = 0); + IMP_IWASM void WasmSimdConst(OpCodeAsmJs op, RegSlot R0, int C0, int C1, int C2, int C3); #ifdef WASM_BYTECODE_WRITER // We don't want to expose api not in IWasmByteCodeWriter, but it's easier to compile them anyway private: #endif - void AsmReg4(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3); - void AsmReg5(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4); + uint EnterLoop(ByteCodeLabel loopEntrance); void AsmReg6(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5); void AsmReg7(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6); - void AsmReg9(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8); void AsmReg10(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, RegSlot R9); void AsmReg11(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, RegSlot R9, RegSlot R10); - void AsmReg17(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, - RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16); void AsmReg18(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17); void AsmReg19(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, - RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17, RegSlot R18); + RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17, RegSlot R18); void AsmBrReg2(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, RegSlot R2); void AsmTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, ArrayBufferView::ViewType viewType); - void AsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType); private: void AsmJsUnsigned1(OpCodeAsmJs op, uint C1); template bool TryWriteAsmReg1(OpCodeAsmJs op, RegSlot R0); + template bool TryWriteFloat32x4_IntConst4(OpCodeAsmJs op, RegSlot R0, int C1, int C2, int C3, int C4); template bool TryWriteAsmReg2(OpCodeAsmJs op, RegSlot R0, RegSlot R1); template bool TryWriteAsmReg3(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2); template bool TryWriteAsmReg4(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3); @@ -87,6 +90,8 @@ namespace Js template bool TryWriteAsmReg19(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17, RegSlot R18); + template bool TryWriteAsmShuffle(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, uint8 indices[]); + template bool TryWriteInt1Const1(OpCodeAsmJs op, RegSlot R0, int C1); template bool TryWriteReg1IntConst1(OpCodeAsmJs op, RegSlot R0, int C1); template bool TryWriteLong1Const1(OpCodeAsmJs op, RegSlot R0, int64 C1); @@ -96,10 +101,10 @@ namespace Js template bool TryWriteAsmBrReg2(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, RegSlot R2); template bool TryWriteAsmBrReg1Const1(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, int C1); template bool TryWriteAsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType); - template bool TryWriteAsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId); + template bool TryWriteAsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, uint32 slotId); template bool TryWriteWasmMemAccess(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint32 offset, ArrayBufferView::ViewType viewType); template bool TryWriteAsmTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, ArrayBufferView::ViewType viewType); - template bool TryWriteAsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType); + template bool TryWriteAsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType, uint32 offset); template bool TryWriteAsmJsUnsigned1(OpCodeAsmJs op, uint C1); void AddJumpOffset(Js::OpCodeAsmJs op, ByteCodeLabel labelId, uint fieldByteOffset); @@ -113,6 +118,11 @@ namespace Js virtual void End() override; virtual void Reset() override; virtual ByteCodeLabel DefineLabel() override; + virtual void SetCallSiteCount(Js::ProfileId callSiteCount) override; + virtual uint32 WasmLoopStart(ByteCodeLabel loopEntrance, __in_ecount(WAsmJs::LIMIT) RegSlot* curRegs) override; + + private: + template bool TryWriteWasmLoopStart(OpCodeAsmJs op, uint looplabel, __in_ecount(WAsmJs::LIMIT) RegSlot* curRegs); #endif }; } diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteBlock.h b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteBlock.h index c5cd72ceb81..896f0a1f92d 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteBlock.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteBlock.h @@ -11,10 +11,10 @@ namespace Js DECLARE_OBJECT(ByteBlock) private: - Field(uint) m_contentSize; // Length of block, in bytes + Field(uint) m_contentSize = 0; // Length of block, in bytes __declspec(align(4)) // Align the buffer to sizeof(uint32) to improve GetHashCode() perf. - Field(byte*) m_content; // The block's content + Field(byte*) m_content = nullptr; // The block's content static ByteBlock* New(Recycler* alloc, const byte * initialContent, int initialContentSize, ScriptContext * requestContext); @@ -22,14 +22,14 @@ namespace Js ByteBlock(uint size, byte * content) : m_contentSize(size), m_content(content) { } - ByteBlock(uint size, Recycler *alloc) : m_contentSize(size) + ByteBlock(uint size, Recycler *alloc) : m_contentSize(size), m_content(nullptr) { // The New function below will copy over a buffer into this so // we don't need to zero it out m_content = RecyclerNewArrayLeaf(alloc, byte, size); } - ByteBlock(uint size, ArenaAllocator* alloc) : m_contentSize(size) + ByteBlock(uint size, ArenaAllocator* alloc) : m_contentSize(size), m_content(nullptr) { m_content = AnewArray(alloc, byte, size); } diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeCacheReleaseFileVersion.h b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeCacheReleaseFileVersion.h index 2f5201a9a39..d1834acdf7f 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeCacheReleaseFileVersion.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeCacheReleaseFileVersion.h @@ -4,6 +4,6 @@ //------------------------------------------------------------------------------------------------------- // NOTE: If there is a merge conflict the correct fix is to make a new GUID. -// {F856871A-E536-4CA1-83E6-819E26C7DC99} +// {7126F68E-E40A-4E97-80D6-777755A28BDF} const GUID byteCodeCacheReleaseFileVersion = -{ 0xF856871A, 0xE536, 0x4CA1, { 0x83, 0xE6, 0x81, 0x9E, 0x26, 0xC7, 0xDC, 0x99 } }; +{ 0x7126F68E, 0xE40A, 0x4E97, { 0x80, 0xD6, 0x77, 0x77, 0x55, 0xA2, 0x8B, 0xDF } }; diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeDumper.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeDumper.cpp index 42a82f23cde..247d4f27042 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeDumper.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeDumper.cpp @@ -1195,13 +1195,6 @@ namespace Js DumpReg(data->R1); } - template void - ByteCodeDumper::DumpReg2WithICIndex(OpCode op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader) - { - DumpReg2(op, data, dumpFunction, reader); - Output::Print(_u(" <%d> "), data->inlineCacheIndex); - } - template void ByteCodeDumper::DumpReg3(OpCode op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader) { @@ -1275,15 +1268,6 @@ namespace Js DumpU2(data->C1); } - void - ByteCodeDumper::DumpReg1Int2(OpCode op, const unaligned OpLayoutReg1Int2 * data, FunctionBody * dumpFunction, ByteCodeReader& reader) - { - DumpReg(data->R0); - Output::Print(_u("=")); - DumpI4(data->C1); - DumpI4(data->C2); - } - void ByteCodeDumper::DumpAuxNoReg(OpCode op, const unaligned OpLayoutAuxNoReg * playout, FunctionBody * dumpFunction, ByteCodeReader& reader) { diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeEmitter.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeEmitter.cpp index 047bf78fda7..f84865c3e3d 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeEmitter.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeEmitter.cpp @@ -5,11 +5,12 @@ #include "RuntimeByteCodePch.h" #include "FormalsUtil.h" #include "Language/AsmJs.h" +#include "ConfigFlagsList.h" void EmitReference(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo); void EmitAssignment(ParseNode *asgnNode, ParseNode *lhs, Js::RegSlot rhsLocation, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo); void EmitLoad(ParseNode *rhs, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo); -void EmitCall(ParseNode* pnode, Js::RegSlot rhsLocation, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, BOOL fReturnValue, BOOL fEvaluateComponents, Js::RegSlot overrideThisLocation = Js::Constants::NoRegister, Js::RegSlot newTargetLocation = Js::Constants::NoRegister); +void EmitCall(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, BOOL fReturnValue, BOOL fEvaluateComponents, Js::RegSlot overrideThisLocation = Js::Constants::NoRegister, Js::RegSlot newTargetLocation = Js::Constants::NoRegister); void EmitYield(Js::RegSlot inputLocation, Js::RegSlot resultLocation, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, Js::RegSlot yieldStarIterator = Js::Constants::NoRegister); void EmitUseBeforeDeclaration(Symbol *sym, ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo); @@ -179,7 +180,6 @@ bool IsArguments(ParseNode *pnode) case knopBlock: case knopBreak: case knopContinue: - case knopLabel: case knopTypeof: case knopThrow: case knopWith: @@ -1173,7 +1173,7 @@ void EmitAssignmentToFuncName(ParseNode *pnodeFnc, ByteCodeGenerator *byteCodeGe { byteCodeGenerator->EmitPropStore(pnodeFnc->location, sym, nullptr, funcInfoParent); } - else if (!sym->GetIsBlockVar() || sym->HasRealBlockVarRef() || sym->GetScope()->GetIsObject()) + else { byteCodeGenerator->EmitLocalPropInit(pnodeFnc->location, sym, funcInfoParent); } @@ -1800,7 +1800,7 @@ void ByteCodeGenerator::InitScopeSlotArray(FuncInfo * funcInfo) { Js::PropertyId *propertyIdsForScopeSlotArray = RecyclerNewArrayLeafZ(scriptContext->GetRecycler(), Js::PropertyId, scopeSlotCount); byteCodeFunction->SetPropertyIdsForScopeSlotArray(propertyIdsForScopeSlotArray, scopeSlotCount, scopeSlotCountForParamScope); - AssertMsg(!byteCodeFunction->IsReparsed() || byteCodeFunction->m_wasEverAsmjsMode || byteCodeFunction->scopeSlotArraySize == scopeSlotCount, + AssertMsg(!byteCodeFunction->IsReparsed() || byteCodeFunction->WasEverAsmJsMode() || byteCodeFunction->scopeSlotArraySize == scopeSlotCount, "The slot array size is different between debug and non-debug mode"); #if DEBUG for (UINT i = 0; i < scopeSlotCount; i++) @@ -1903,7 +1903,7 @@ void ByteCodeGenerator::LoadAllConstants(FuncInfo *funcInfo) // A reparse should result in the same size of the activation object. // Exclude functions which were created from the ByteCodeCache. AssertMsg(!byteCodeFunction->IsReparsed() || byteCodeFunction->HasGeneratedFromByteCodeCache() || - byteCodeFunction->scopeObjectSize == count || byteCodeFunction->m_wasEverAsmjsMode, + byteCodeFunction->scopeObjectSize == count || byteCodeFunction->WasEverAsmJsMode(), "The activation object size is different between debug and non-debug mode"); byteCodeFunction->scopeObjectSize = count; #endif @@ -1934,7 +1934,7 @@ void ByteCodeGenerator::LoadAllConstants(FuncInfo *funcInfo) { if (funcInfo->GetThisSymbol()) { - byteCodeFunction->MapAndSetThisRegisterForEventHandler(funcInfo->GetThisSymbol()->GetLocation()); + byteCodeFunction->MapAndSetThisRegisterForEventHandler(funcInfo->GetThisSymbol()->GetLocation()); } // The environment is the namespace hierarchy starting with "this". Assert(!funcInfo->RegIsConst(funcInfo->GetEnvRegister())); @@ -2073,7 +2073,7 @@ void ByteCodeGenerator::LoadAllConstants(FuncInfo *funcInfo) this->m_writer.Property(Js::OpCode::StFuncExpr, sym->GetLocation(), scopeLocation, funcInfo->FindOrAddReferencedPropertyId(sym->GetPosition())); } - else if ((funcInfo->paramScope->GetIsObject() || (funcInfo->paramScope->GetCanMerge() && funcInfo->bodyScope->GetIsObject()))) + else if (funcInfo->paramScope->GetIsObject() || (funcInfo->paramScope->GetCanMerge() && funcInfo->bodyScope->GetIsObject())) { this->m_writer.ElementU(Js::OpCode::StLocalFuncExpr, sym->GetLocation(), funcInfo->FindOrAddReferencedPropertyId(sym->GetPosition())); @@ -2115,7 +2115,7 @@ void ByteCodeGenerator::InvalidateCachedOuterScopes(FuncInfo *funcInfo) { if (func->Escapes() && func->GetHasCachedScope()) { - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.Unsigned1(Js::OpCode::InvalCachedScope, envIndex); } } @@ -2207,11 +2207,11 @@ void ByteCodeGenerator::LoadSuperConstructorObject(FuncInfo *funcInfo) { Symbol* superConstructorSym = funcInfo->GetSuperConstructorSymbol(); Assert(superConstructorSym); - Assert(!funcInfo->IsLambda()); + Assert(!funcInfo->IsLambda()); Assert(funcInfo->IsDerivedClassConstructor()); - m_writer.Reg1(Js::OpCode::LdFuncObj, superConstructorSym->GetLocation()); -} + m_writer.Reg1(Js::OpCode::LdFuncObj, superConstructorSym->GetLocation()); + } void ByteCodeGenerator::LoadSuperObject(FuncInfo *funcInfo) { @@ -2287,7 +2287,7 @@ void ByteCodeGenerator::EmitSuperCall(FuncInfo* funcInfo, ParseNode* pnode, BOOL this->Writer()->MarkLabel(useNewTargetForThisLabel); this->Writer()->Reg2(Js::OpCode::Ld_A, thisForSuperCall, pnode->sxSuperCall.pnodeNewTarget->location); this->Writer()->MarkLabel(makeCallLabel); - EmitCall(pnode, Js::Constants::NoRegister, this, funcInfo, fReturnValue, /*fEvaluateComponents*/ true, thisForSuperCall, pnode->sxSuperCall.pnodeNewTarget->location); + EmitCall(pnode, this, funcInfo, fReturnValue, /*fEvaluateComponents*/ true, thisForSuperCall, pnode->sxSuperCall.pnodeNewTarget->location); // We have to use another temp for the this value before assigning to this register. // This is because IRBuilder does not expect us to use the value of a temp after potentially assigning to that same temp. @@ -3066,41 +3066,38 @@ void ByteCodeGenerator::EmitOneFunction(ParseNode *pnode) // is expected to stay inside the function expression scope && (varSym && varSym->GetSymbolType() == STVariable && (varSym->IsInSlot(funcInfo) || varSym->GetLocation() != Js::Constants::NoRegister))) { - if (varSym->GetSymbolType() == STVariable && (varSym->IsInSlot(funcInfo) || varSym->GetLocation() != Js::Constants::NoRegister)) + if (!varSym->GetNeedDeclaration()) { - if (!varSym->GetNeedDeclaration()) + if (param->IsInSlot(funcInfo)) { - if (param->IsInSlot(funcInfo)) - { - // Simulating EmitPropLoad here. We can't directly call the method as we have to use the param scope specifically. - // Walking the scope chain is not possible at this time. - Js::RegSlot tempReg = funcInfo->AcquireTmpRegister(); - Js::PropertyId slot = param->EnsureScopeSlot(funcInfo); - Js::ProfileId profileId = funcInfo->FindOrAddSlotProfileId(paramScope, slot); - Js::OpCode op = paramScope->GetIsObject() ? Js::OpCode::LdParamObjSlot : Js::OpCode::LdParamSlot; - slot = slot + (paramScope->GetIsObject() ? 0 : Js::ScopeSlots::FirstSlotIndex); - - this->m_writer.SlotI1(op, tempReg, slot, profileId); - - this->EmitPropStore(tempReg, varSym, varSym->GetPid(), funcInfo); - funcInfo->ReleaseTmpRegister(tempReg); - } - else if (param->GetLocation() != Js::Constants::NoRegister) - { - this->EmitPropStore(param->GetLocation(), varSym, varSym->GetPid(), funcInfo); - } - else - { - Assert(param->IsArguments() && !funcInfo->GetHasArguments()); - } + // Simulating EmitPropLoad here. We can't directly call the method as we have to use the param scope specifically. + // Walking the scope chain is not possible at this time. + Js::RegSlot tempReg = funcInfo->AcquireTmpRegister(); + Js::PropertyId slot = param->EnsureScopeSlot(funcInfo); + Js::ProfileId profileId = funcInfo->FindOrAddSlotProfileId(paramScope, slot); + Js::OpCode op = paramScope->GetIsObject() ? Js::OpCode::LdParamObjSlot : Js::OpCode::LdParamSlot; + slot = slot + (paramScope->GetIsObject() ? 0 : Js::ScopeSlots::FirstSlotIndex); + + this->m_writer.SlotI1(op, tempReg, slot, profileId); + + this->EmitPropStore(tempReg, varSym, varSym->GetPid(), funcInfo); + funcInfo->ReleaseTmpRegister(tempReg); + } + else if (param->GetLocation() != Js::Constants::NoRegister) + { + this->EmitPropStore(param->GetLocation(), varSym, varSym->GetPid(), funcInfo); } else { - // There is a let redeclaration of arguments symbol. Any other var will cause a - // re-declaration error. - Assert(param->IsArguments()); + Assert(param->IsArguments() && !funcInfo->GetHasArguments()); } } + else + { + // There is a let redeclaration of arguments symbol. Any other var will cause a + // re-declaration error. + Assert(param->IsArguments()); + } } if (ShouldTrackDebuggerMetadata() && param->GetLocation() != Js::Constants::NoRegister) @@ -3494,322 +3491,320 @@ void ByteCodeGenerator::StartEmitFunction(ParseNode *pnodeFnc) Assert(pnodeFnc->nop == knopFncDecl || pnodeFnc->nop == knopProg); FuncInfo *funcInfo = pnodeFnc->sxFnc.funcInfo; + Scope * const bodyScope = funcInfo->GetBodyScope(); + Scope * const paramScope = funcInfo->GetParamScope(); - if (funcInfo->byteCodeFunction->IsFunctionParsed() && funcInfo->GetParsedFunctionBody()->GetByteCode() == nullptr) + if (funcInfo->byteCodeFunction->IsFunctionParsed() && funcInfo->root->sxFnc.pnodeBody != nullptr) { - if (!(flags & (fscrEval | fscrImplicitThis | fscrImplicitParents))) + if (funcInfo->GetParsedFunctionBody()->GetByteCode() == nullptr && !(flags & (fscrEval | fscrImplicitThis | fscrImplicitParents))) { // Only set the environment depth if it's truly known (i.e., not in eval or event handler). funcInfo->GetParsedFunctionBody()->SetEnvDepth(this->envDepth); } - } - if (funcInfo->GetCallsEval()) - { - funcInfo->byteCodeFunction->SetDontInline(true); - } - - Scope * const funcExprScope = funcInfo->funcExprScope; - if (funcExprScope) - { if (funcInfo->GetCallsEval()) { - Assert(funcExprScope->GetIsObject()); + funcInfo->byteCodeFunction->SetDontInline(true); } - if (funcExprScope->GetIsObject()) - { - funcExprScope->SetCapturesAll(true); - funcExprScope->SetMustInstantiate(true); - PushScope(funcExprScope); - } - else + Scope * const funcExprScope = funcInfo->funcExprScope; + if (funcExprScope) { - Symbol *sym = funcInfo->root->sxFnc.GetFuncSymbol(); - if (funcInfo->IsBodyAndParamScopeMerged()) + if (funcInfo->GetCallsEval()) { - funcInfo->bodyScope->AddSymbol(sym); + Assert(funcExprScope->GetIsObject()); } - else + + if (funcExprScope->GetIsObject()) { - funcInfo->paramScope->AddSymbol(sym); + funcExprScope->SetCapturesAll(true); + funcExprScope->SetMustInstantiate(true); + PushScope(funcExprScope); } - sym->EnsureScopeSlot(funcInfo); - if (sym->GetHasNonLocalReference()) + else { - sym->GetScope()->SetHasOwnLocalInClosure(true); + Symbol *sym = funcInfo->root->sxFnc.GetFuncSymbol(); + if (funcInfo->IsBodyAndParamScopeMerged()) + { + funcInfo->bodyScope->AddSymbol(sym); + } + else + { + funcInfo->paramScope->AddSymbol(sym); + } + sym->EnsureScopeSlot(funcInfo); + if (sym->GetHasNonLocalReference()) + { + sym->GetScope()->SetHasOwnLocalInClosure(true); + } } } - } - Scope * const bodyScope = funcInfo->GetBodyScope(); - Scope * const paramScope = funcInfo->GetParamScope(); - - if (pnodeFnc->nop != knopProg) - { - if (!bodyScope->GetIsObject() && NeedObjectAsFunctionScope(funcInfo, pnodeFnc)) - { - Assert(bodyScope->GetIsObject()); - } - - if (bodyScope->GetIsObject()) + if (pnodeFnc->nop != knopProg) { - bodyScope->SetLocation(funcInfo->frameObjRegister); - } - else - { - bodyScope->SetLocation(funcInfo->frameSlotsRegister); - } + if (!bodyScope->GetIsObject() && NeedObjectAsFunctionScope(funcInfo, pnodeFnc)) + { + Assert(bodyScope->GetIsObject()); + } - if (!funcInfo->IsBodyAndParamScopeMerged()) - { - if (paramScope->GetIsObject()) + if (bodyScope->GetIsObject()) { - paramScope->SetLocation(funcInfo->frameObjRegister); + bodyScope->SetLocation(funcInfo->frameObjRegister); } else { - paramScope->SetLocation(funcInfo->frameSlotsRegister); + bodyScope->SetLocation(funcInfo->frameSlotsRegister); } - } - - if (bodyScope->GetIsObject()) - { - // Win8 908700: Disable under F12 debugger because there are too many cached scopes holding onto locals. - funcInfo->SetHasCachedScope( - !PHASE_OFF(Js::CachedScopePhase, funcInfo->byteCodeFunction) && - !funcInfo->Escapes() && - funcInfo->frameObjRegister != Js::Constants::NoRegister && - !ApplyEnclosesArgs(pnodeFnc, this) && - funcInfo->IsBodyAndParamScopeMerged() && // There is eval in the param scope - !pnodeFnc->sxFnc.HasDefaultArguments() && - !pnodeFnc->sxFnc.HasDestructuredParams() && - (PHASE_FORCE(Js::CachedScopePhase, funcInfo->byteCodeFunction) || !IsInDebugMode()) -#if ENABLE_TTD - && !funcInfo->GetParsedFunctionBody()->GetScriptContext()->GetThreadContext()->IsRuntimeInTTDMode() -#endif - ); - if (funcInfo->GetHasCachedScope()) + if (!funcInfo->IsBodyAndParamScopeMerged()) { - Assert(funcInfo->funcObjRegister == Js::Constants::NoRegister); - Symbol *funcSym = funcInfo->root->sxFnc.GetFuncSymbol(); - if (funcSym && funcSym->GetIsFuncExpr()) + if (paramScope->GetIsObject()) { - if (funcSym->GetLocation() == Js::Constants::NoRegister) - { - funcInfo->funcObjRegister = funcInfo->NextVarRegister(); - } - else - { - funcInfo->funcObjRegister = funcSym->GetLocation(); - } + paramScope->SetLocation(funcInfo->frameObjRegister); } else { - funcInfo->funcObjRegister = funcInfo->NextVarRegister(); + paramScope->SetLocation(funcInfo->frameSlotsRegister); } - Assert(funcInfo->funcObjRegister != Js::Constants::NoRegister); } - ParseNode *pnode; - Symbol *sym; - - if (funcInfo->GetHasArguments()) + if (bodyScope->GetIsObject()) { - // Process function's formal parameters - MapFormals(pnodeFnc, [&](ParseNode *pnode) + // Win8 908700: Disable under F12 debugger because there are too many cached scopes holding onto locals. + funcInfo->SetHasCachedScope( + !PHASE_OFF(Js::CachedScopePhase, funcInfo->byteCodeFunction) && + !funcInfo->Escapes() && + funcInfo->frameObjRegister != Js::Constants::NoRegister && + !ApplyEnclosesArgs(pnodeFnc, this) && + funcInfo->IsBodyAndParamScopeMerged() && // There is eval in the param scope + !pnodeFnc->sxFnc.HasDefaultArguments() && + !pnodeFnc->sxFnc.HasDestructuredParams() && + (PHASE_FORCE(Js::CachedScopePhase, funcInfo->byteCodeFunction) || !IsInDebugMode()) +#if ENABLE_TTD + && !funcInfo->GetParsedFunctionBody()->GetScriptContext()->GetThreadContext()->IsRuntimeInTTDMode() +#endif + ); + + if (funcInfo->GetHasCachedScope()) { - if (pnode->IsVarLetOrConst()) + Assert(funcInfo->funcObjRegister == Js::Constants::NoRegister); + Symbol *funcSym = funcInfo->root->sxFnc.GetFuncSymbol(); + if (funcSym && funcSym->GetIsFuncExpr()) { - pnode->sxVar.sym->EnsureScopeSlot(funcInfo); + if (funcSym->GetLocation() == Js::Constants::NoRegister) + { + funcInfo->funcObjRegister = funcInfo->NextVarRegister(); + } + else + { + funcInfo->funcObjRegister = funcSym->GetLocation(); + } } - }); - - MapFormalsFromPattern(pnodeFnc, [&](ParseNode *pnode) { pnode->sxVar.sym->EnsureScopeSlot(funcInfo); }); - - // Only allocate scope slot for "arguments" when really necessary. "hasDeferredChild" - // doesn't require scope slot for "arguments" because inner functions can't access - // outer function's arguments directly. - sym = funcInfo->GetArgumentsSymbol(); - Assert(sym); - if (sym->NeedsSlotAlloc(funcInfo)) - { - sym->EnsureScopeSlot(funcInfo); + else + { + funcInfo->funcObjRegister = funcInfo->NextVarRegister(); + } + Assert(funcInfo->funcObjRegister != Js::Constants::NoRegister); } - } - sym = funcInfo->root->sxFnc.GetFuncSymbol(); + ParseNode *pnode; + Symbol *sym; - if (sym && sym->NeedsSlotAlloc(funcInfo)) - { - if (funcInfo->funcExprScope && funcInfo->funcExprScope->GetIsObject()) - { - sym->SetScopeSlot(0); - } - else if (funcInfo->GetFuncExprNameReference()) - { - sym->EnsureScopeSlot(funcInfo); - } - } - - if (!funcInfo->GetHasArguments()) - { - Symbol *formal; - Js::ArgSlot pos = 1; - auto moveArgToReg = [&](ParseNode *pnode) + if (funcInfo->GetHasArguments()) { - if (pnode->IsVarLetOrConst()) + // Process function's formal parameters + MapFormals(pnodeFnc, [&](ParseNode *pnode) { - formal = pnode->sxVar.sym; - // Get the param from its argument position into its assigned register. - // The position should match the location; otherwise, it has been shadowed by parameter with the same name. - if (formal->GetLocation() + 1 == pos) + if (pnode->IsVarLetOrConst()) { pnode->sxVar.sym->EnsureScopeSlot(funcInfo); } + }); + + MapFormalsFromPattern(pnodeFnc, [&](ParseNode *pnode) { pnode->sxVar.sym->EnsureScopeSlot(funcInfo); }); + + // Only allocate scope slot for "arguments" when really necessary. "hasDeferredChild" + // doesn't require scope slot for "arguments" because inner functions can't access + // outer function's arguments directly. + sym = funcInfo->GetArgumentsSymbol(); + Assert(sym); + if (sym->NeedsSlotAlloc(funcInfo)) + { + sym->EnsureScopeSlot(funcInfo); } - pos++; - }; - MapFormals(pnodeFnc, moveArgToReg); - MapFormalsFromPattern(pnodeFnc, [&](ParseNode *pnode) { pnode->sxVar.sym->EnsureScopeSlot(funcInfo); }); - } + } - for (pnode = pnodeFnc->sxFnc.pnodeVars; pnode; pnode = pnode->sxVar.pnodeNext) - { - sym = pnode->sxVar.sym; - if (!(pnode->sxVar.isBlockScopeFncDeclVar && sym->GetIsBlockVar())) + sym = funcInfo->root->sxFnc.GetFuncSymbol(); + + if (sym && sym->NeedsSlotAlloc(funcInfo)) { - if (sym->GetIsCatch() || (pnode->nop == knopVarDecl && sym->GetIsBlockVar())) + if (funcInfo->funcExprScope && funcInfo->funcExprScope->GetIsObject()) { - sym = funcInfo->bodyScope->FindLocalSymbol(sym->GetName()); + sym->SetScopeSlot(0); } - if (sym->GetSymbolType() == STVariable && !sym->IsArguments()) + else if (funcInfo->GetFuncExprNameReference()) { sym->EnsureScopeSlot(funcInfo); } } - } - auto ensureFncDeclScopeSlots = [&](ParseNode *pnodeScope) - { - for (pnode = pnodeScope; pnode;) + if (!funcInfo->GetHasArguments()) { - switch (pnode->nop) + Symbol *formal; + Js::ArgSlot pos = 1; + auto moveArgToReg = [&](ParseNode *pnode) { - case knopFncDecl: - if (pnode->sxFnc.IsDeclaration()) + if (pnode->IsVarLetOrConst()) { - EnsureFncDeclScopeSlot(pnode, funcInfo); + formal = pnode->sxVar.sym; + // Get the param from its argument position into its assigned register. + // The position should match the location; otherwise, it has been shadowed by parameter with the same name. + if (formal->GetLocation() + 1 == pos) + { + pnode->sxVar.sym->EnsureScopeSlot(funcInfo); + } } - pnode = pnode->sxFnc.pnodeNext; - break; - case knopBlock: - pnode = pnode->sxBlock.pnodeNext; - break; - case knopCatch: - pnode = pnode->sxCatch.pnodeNext; - break; - case knopWith: - pnode = pnode->sxWith.pnodeNext; - break; - } + pos++; + }; + MapFormals(pnodeFnc, moveArgToReg); + MapFormalsFromPattern(pnodeFnc, [&](ParseNode *pnode) { pnode->sxVar.sym->EnsureScopeSlot(funcInfo); }); } - }; - pnodeFnc->sxFnc.MapContainerScopes(ensureFncDeclScopeSlots); - if (pnodeFnc->sxFnc.pnodeBody) - { - Assert(pnodeFnc->sxFnc.pnodeScopes->nop == knopBlock); - this->EnsureLetConstScopeSlots(pnodeFnc->sxFnc.pnodeBodyScope, funcInfo); - } - } - else - { - ParseNode *pnode; - Symbol *sym; - - pnodeFnc->sxFnc.MapContainerScopes([&](ParseNode *pnodeScope) { this->EnsureFncScopeSlots(pnodeScope, funcInfo); }); - - for (pnode = pnodeFnc->sxFnc.pnodeVars; pnode; pnode = pnode->sxVar.pnodeNext) - { - sym = pnode->sxVar.sym; - if (!(pnode->sxVar.isBlockScopeFncDeclVar && sym->GetIsBlockVar())) + for (pnode = pnodeFnc->sxFnc.pnodeVars; pnode; pnode = pnode->sxVar.pnodeNext) { - if (sym->GetIsCatch() || (pnode->nop == knopVarDecl && sym->GetIsBlockVar())) + sym = pnode->sxVar.sym; + if (!(pnode->sxVar.isBlockScopeFncDeclVar && sym->GetIsBlockVar())) { - sym = funcInfo->bodyScope->FindLocalSymbol(sym->GetName()); + if (sym->GetIsCatch() || (pnode->nop == knopVarDecl && sym->GetIsBlockVar())) + { + sym = funcInfo->bodyScope->FindLocalSymbol(sym->GetName()); + } + if (sym->GetSymbolType() == STVariable && !sym->IsArguments()) + { + sym->EnsureScopeSlot(funcInfo); + } } - if (sym->GetSymbolType() == STVariable && sym->NeedsSlotAlloc(funcInfo) && !sym->IsArguments()) + } + auto ensureFncDeclScopeSlots = [&](ParseNode *pnodeScope) + { + for (pnode = pnodeScope; pnode;) { - sym->EnsureScopeSlot(funcInfo); + switch (pnode->nop) + { + case knopFncDecl: + if (pnode->sxFnc.IsDeclaration()) + { + EnsureFncDeclScopeSlot(pnode, funcInfo); + } + pnode = pnode->sxFnc.pnodeNext; + break; + case knopBlock: + pnode = pnode->sxBlock.pnodeNext; + break; + case knopCatch: + pnode = pnode->sxCatch.pnodeNext; + break; + case knopWith: + pnode = pnode->sxWith.pnodeNext; + break; + } } + }; + pnodeFnc->sxFnc.MapContainerScopes(ensureFncDeclScopeSlots); + + if (pnodeFnc->sxFnc.pnodeBody) + { + Assert(pnodeFnc->sxFnc.pnodeScopes->nop == knopBlock); + this->EnsureLetConstScopeSlots(pnodeFnc->sxFnc.pnodeBodyScope, funcInfo); } } - - auto ensureScopeSlot = [&](ParseNode *pnode) + else { - if (pnode->IsVarLetOrConst()) + ParseNode *pnode; + Symbol *sym; + + pnodeFnc->sxFnc.MapContainerScopes([&](ParseNode *pnodeScope) { this->EnsureFncScopeSlots(pnodeScope, funcInfo); }); + + for (pnode = pnodeFnc->sxFnc.pnodeVars; pnode; pnode = pnode->sxVar.pnodeNext) { sym = pnode->sxVar.sym; - if (sym->GetSymbolType() == STFormal && sym->NeedsSlotAlloc(funcInfo)) + if (!(pnode->sxVar.isBlockScopeFncDeclVar && sym->GetIsBlockVar())) { - sym->EnsureScopeSlot(funcInfo); + if (sym->GetIsCatch() || (pnode->nop == knopVarDecl && sym->GetIsBlockVar())) + { + sym = funcInfo->bodyScope->FindLocalSymbol(sym->GetName()); + } + if (sym->GetSymbolType() == STVariable && sym->NeedsSlotAlloc(funcInfo) && !sym->IsArguments()) + { + sym->EnsureScopeSlot(funcInfo); + } } } - }; - // Process function's formal parameters - MapFormals(pnodeFnc, ensureScopeSlot); - MapFormalsFromPattern(pnodeFnc, ensureScopeSlot); - if (funcInfo->GetHasArguments()) - { - sym = funcInfo->GetArgumentsSymbol(); - Assert(sym); + auto ensureScopeSlot = [&](ParseNode *pnode) + { + if (pnode->IsVarLetOrConst()) + { + sym = pnode->sxVar.sym; + if (sym->GetSymbolType() == STFormal && sym->NeedsSlotAlloc(funcInfo)) + { + sym->EnsureScopeSlot(funcInfo); + } + } + }; + // Process function's formal parameters + MapFormals(pnodeFnc, ensureScopeSlot); + MapFormalsFromPattern(pnodeFnc, ensureScopeSlot); - // There is no eval so the arguments may be captured in a lambda. - // But we cannot relay on slots getting allocated while the lambda is emitted as the function body may be reparsed. - sym->EnsureScopeSlot(funcInfo); - } + if (funcInfo->GetHasArguments()) + { + sym = funcInfo->GetArgumentsSymbol(); + Assert(sym); - if (pnodeFnc->sxFnc.pnodeBody) - { - this->EnsureLetConstScopeSlots(pnodeFnc->sxFnc.pnodeScopes, funcInfo); - this->EnsureLetConstScopeSlots(pnodeFnc->sxFnc.pnodeBodyScope, funcInfo); - } - } + // There is no eval so the arguments may be captured in a lambda. + // But we cannot relay on slots getting allocated while the lambda is emitted as the function body may be reparsed. + sym->EnsureScopeSlot(funcInfo); + } - // When we have split scope and body scope does not have any scope slots allocated, we don't have to mark the body scope as mustinstantiate. - if (funcInfo->frameObjRegister != Js::Constants::NoRegister) - { - bodyScope->SetMustInstantiate(true); - } - else if (pnodeFnc->sxFnc.IsBodyAndParamScopeMerged() || bodyScope->GetScopeSlotCount() != 0) - { - bodyScope->SetMustInstantiate(funcInfo->frameSlotsRegister != Js::Constants::NoRegister); - } + if (pnodeFnc->sxFnc.pnodeBody) + { + this->EnsureLetConstScopeSlots(pnodeFnc->sxFnc.pnodeScopes, funcInfo); + this->EnsureLetConstScopeSlots(pnodeFnc->sxFnc.pnodeBodyScope, funcInfo); + } + } - if (!pnodeFnc->sxFnc.IsBodyAndParamScopeMerged()) - { + // When we have split scope and body scope does not have any scope slots allocated, we don't have to mark the body scope as mustinstantiate. if (funcInfo->frameObjRegister != Js::Constants::NoRegister) { - paramScope->SetMustInstantiate(true); + bodyScope->SetMustInstantiate(true); } - else + else if (pnodeFnc->sxFnc.IsBodyAndParamScopeMerged() || bodyScope->GetScopeSlotCount() != 0) { - // In the case of function expression being captured in the param scope the hasownlocalinclosure will be false for param scope, - // as function expression symbol stays in the function expression scope. We don't have to set mustinstantiate for param scope in that case. - paramScope->SetMustInstantiate(paramScope->GetHasOwnLocalInClosure()); + bodyScope->SetMustInstantiate(funcInfo->frameSlotsRegister != Js::Constants::NoRegister); } - } - } - else - { - bool newScopeForEval = (funcInfo->byteCodeFunction->GetIsStrictMode() && (this->GetFlags() & fscrEval)); - if (newScopeForEval) + if (!pnodeFnc->sxFnc.IsBodyAndParamScopeMerged()) + { + if (funcInfo->frameObjRegister != Js::Constants::NoRegister) + { + paramScope->SetMustInstantiate(true); + } + else + { + // In the case of function expression being captured in the param scope the hasownlocalinclosure will be false for param scope, + // as function expression symbol stays in the function expression scope. We don't have to set mustinstantiate for param scope in that case. + paramScope->SetMustInstantiate(paramScope->GetHasOwnLocalInClosure()); + } + } + } + else { - Assert(bodyScope->GetIsObject()); + bool newScopeForEval = (funcInfo->byteCodeFunction->GetIsStrictMode() && (this->GetFlags() & fscrEval)); + + if (newScopeForEval) + { + Assert(bodyScope->GetIsObject()); + } } } @@ -3960,11 +3955,16 @@ void ByteCodeGenerator::EndEmitFunction(ParseNode *pnodeFnc) PopScope(); // Pop the param scope } - Scope *scope = funcInfo->funcExprScope; - if (scope && scope->GetMustInstantiate()) + if (funcInfo->byteCodeFunction->IsFunctionParsed() && funcInfo->root->sxFnc.pnodeBody != nullptr) { - Assert(currentScope == scope); - PopScope(); + // StartEmitFunction omits the matching PushScope for already-parsed functions. + // TODO: Refactor Start and EndEmitFunction for clarity. + Scope *scope = funcInfo->funcExprScope; + if (scope && scope->GetMustInstantiate()) + { + Assert(currentScope == scope); + PopScope(); + } } if (CONFIG_FLAG(DeferNested)) @@ -4097,7 +4097,7 @@ void ByteCodeGenerator::StartEmitWith(ParseNode *pnodeWith) Scope *scope = pnodeWith->sxWith.scope; - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); PushScope(scope); } @@ -4243,7 +4243,7 @@ void ByteCodeGenerator::EmitLoadInstance(Symbol *sym, IdentPtr pid, Js::RegSlot Js::RegSlot tmpReg = funcInfo->AcquireTmpRegister(); - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.SlotI1(Js::OpCode::LdEnvObj, tmpReg, envIndex + Js::FrameDisplay::GetOffsetOfScopes() / sizeof(Js::Var)); @@ -4263,7 +4263,7 @@ void ByteCodeGenerator::EmitLoadInstance(Symbol *sym, IdentPtr pid, Js::RegSlot funcInfo->FindOrAddReferencedPropertyId(propertyId)); Assert(!unwrapWithObj); - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.Reg1(Js::OpCode::LdLocalObj, instLocation); if (thisLocation != Js::Constants::NoRegister) { @@ -4336,7 +4336,7 @@ void ByteCodeGenerator::EmitLoadInstance(Symbol *sym, IdentPtr pid, Js::RegSlot { if (envIndex != -1) { - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.SlotI1(Js::OpCode::LdEnvObj, instLocation, envIndex + Js::FrameDisplay::GetOffsetOfScopes() / sizeof(Js::Var)); } @@ -4636,7 +4636,7 @@ void ByteCodeGenerator::EmitPropStore(Js::RegSlot rhsLocation, Symbol *sym, Iden Js::RegSlot instLocation = funcInfo->AcquireTmpRegister(); - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.SlotI1( Js::OpCode::LdEnvObj, instLocation, @@ -4745,7 +4745,7 @@ void ByteCodeGenerator::EmitPropStore(Js::RegSlot rhsLocation, Symbol *sym, Iden } else if (sym->IsInSlot(funcInfo) || envIndex != -1) { - if (!isConstDecl && sym->GetDecl() && sym->GetDecl()->nop == knopConstDecl) + if (!isConstDecl && sym->GetIsConst()) { // This is a case where const reassignment can't be proven statically (e.g., eval, with) so // we have to catch it at runtime. @@ -4881,7 +4881,7 @@ ByteCodeGenerator::GetLdSlotOp(Scope *scope, int envIndex, Js::RegSlot scopeLoca } else { - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); op = Js::OpCode::LdObjSlot; } @@ -4916,14 +4916,14 @@ void ByteCodeGenerator::EmitPropLoadThis(Js::RegSlot lhsLocation, ParseNode *pno } else { - this->EmitPropLoad(lhsLocation, pnode->sxPid.sym, pnode->sxPid.pid, funcInfo, true); + this->EmitPropLoad(lhsLocation, pnode->sxPid.sym, pnode->sxPid.pid, funcInfo, true); - if ((!sym || sym->GetNeedDeclaration()) && chkUndecl) - { - this->Writer()->Reg1(Js::OpCode::ChkUndecl, lhsLocation); - } + if ((!sym || sym->GetNeedDeclaration()) && chkUndecl) + { + this->Writer()->Reg1(Js::OpCode::ChkUndecl, lhsLocation); } } +} void ByteCodeGenerator::EmitPropStoreForSpecialSymbol(Js::RegSlot rhsLocation, Symbol *sym, IdentPtr pid, FuncInfo *funcInfo, bool init) { @@ -5000,7 +5000,7 @@ void ByteCodeGenerator::EmitPropLoad(Js::RegSlot lhsLocation, Symbol *sym, Ident Js::RegSlot instLocation = funcInfo->AcquireTmpRegister(); - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.SlotI1( Js::OpCode::LdEnvObj, instLocation, @@ -5122,6 +5122,11 @@ void ByteCodeGenerator::EmitPropLoad(Js::RegSlot lhsLocation, Symbol *sym, Ident case Js::PropertyIds::undefined: opcode = Js::OpCode::LdUndef; break; + case Js::PropertyIds::__chakraLibrary: + if (CONFIG_FLAG(LdChakraLib)) { + opcode = Js::OpCode::LdChakraLib; + } + break; } if (opcode == Js::OpCode::LdRootFld) @@ -5161,7 +5166,7 @@ void ByteCodeGenerator::EmitPropLoad(Js::RegSlot lhsLocation, Symbol *sym, Ident } else { - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.Slot(op, lhsLocation, scopeLocation, slot, profileId); } @@ -5251,7 +5256,7 @@ void ByteCodeGenerator::EmitPropDelete(Js::RegSlot lhsLocation, Symbol *sym, Ide Js::RegSlot instLocation = funcInfo->AcquireTmpRegister(); - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.SlotI1( Js::OpCode::LdEnvObj, instLocation, @@ -5421,7 +5426,7 @@ void ByteCodeGenerator::EmitPropTypeof(Js::RegSlot lhsLocation, Symbol *sym, Ide Js::RegSlot instLocation = funcInfo->AcquireTmpRegister(); - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.SlotI1(Js::OpCode::LdEnvObj, instLocation, envIndex + Js::FrameDisplay::GetOffsetOfScopes() / sizeof(Js::Var)); @@ -5530,7 +5535,7 @@ void ByteCodeGenerator::EmitPropTypeof(Js::RegSlot lhsLocation, Symbol *sym, Ide } else { - Assert(scope->GetIsObject()); + AssertOrFailFast(scope->GetIsObject()); this->m_writer.Slot(op, tmpLocation, scopeLocation, slot, profileId); } @@ -6896,9 +6901,21 @@ void EmitLoad( // f(x) += case knopCall: - funcInfo->AcquireLoc(lhs); - EmitReference(lhs, byteCodeGenerator, funcInfo); - EmitCall(lhs, /*rhs=*/ Js::Constants::NoRegister, byteCodeGenerator, funcInfo, /*fReturnValue=*/ false, /*fEvaluateComponents=*/ false); + if (lhs->sxCall.pnodeTarget->nop == knopImport) + { + ParseNodePtr args = lhs->sxCall.pnodeArgs; + Assert(CountArguments(args) == 2); // import() takes one argument + Emit(args, byteCodeGenerator, funcInfo, false); + funcInfo->ReleaseLoc(args); + funcInfo->AcquireLoc(lhs); + byteCodeGenerator->Writer()->Reg2(Js::OpCode::ImportCall, lhs->location, args->location); + } + else + { + funcInfo->AcquireLoc(lhs); + EmitReference(lhs, byteCodeGenerator, funcInfo); + EmitCall(lhs, byteCodeGenerator, funcInfo, /*fReturnValue=*/ false, /*fEvaluateComponents=*/ false); + } break; default: @@ -6930,6 +6947,7 @@ void EmitOneArg( Js::ArgSlot &argIndex, Js::ArgSlot &spreadIndex, Js::RegSlot argTempLocation, + bool emitProfiledArgout, Js::AuxArray *spreadIndices = nullptr ) { @@ -6954,7 +6972,7 @@ void EmitOneArg( } else { - byteCodeGenerator->Writer()->ArgOut(argIndex + 1, regVal, callSiteId); + byteCodeGenerator->Writer()->ArgOut(argIndex + 1, regVal, callSiteId, emitProfiledArgout); } funcInfo->ReleaseTmpRegister(regVal); } @@ -6966,7 +6984,7 @@ void EmitOneArg( } else { - byteCodeGenerator->Writer()->ArgOut(argIndex + 1, pnode->location, callSiteId); + byteCodeGenerator->Writer()->ArgOut(argIndex + 1, pnode->location, callSiteId, emitProfiledArgout); } } argIndex++; @@ -6985,6 +7003,7 @@ size_t EmitArgsWithArgOutsAtEnd( Js::ProfileId callSiteId, Js::RegSlot thisLocation, Js::ArgSlot argsCountForStartCall, + bool emitProfiledArgouts, Js::AuxArray *spreadIndices = nullptr ) { @@ -6998,12 +7017,12 @@ size_t EmitArgsWithArgOutsAtEnd( while (pnode->nop == knopList) { - EmitOneArg(pnode->sxBin.pnode1, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, argIndex, spreadIndex, argTempLocation, spreadIndices); + EmitOneArg(pnode->sxBin.pnode1, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, argIndex, spreadIndex, argTempLocation, false /*emitProfiledArgout*/, spreadIndices); pnode = pnode->sxBin.pnode2; argTempLocation = funcInfo->AcquireTmpRegister(); } - EmitOneArg(pnode, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, argIndex, spreadIndex, argTempLocation, spreadIndices); + EmitOneArg(pnode, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, argIndex, spreadIndex, argTempLocation, false /*emitProfiledArgout*/, spreadIndices); byteCodeGenerator->Writer()->StartCall(Js::OpCode::StartCall, argsCountForStartCall); @@ -7012,12 +7031,12 @@ size_t EmitArgsWithArgOutsAtEnd( if (thisLocation != Js::Constants::NoRegister) { // Emit the "this" object. - byteCodeGenerator->Writer()->ArgOut(0, thisLocation, callSiteId); + byteCodeGenerator->Writer()->ArgOut(0, thisLocation, callSiteId, false /*emitProfiledArgouts*/); } for (Js::ArgSlot index = 0; index < argIndex; index++) { - byteCodeGenerator->Writer()->ArgOut(index + 1, firstArgTempLocation + index, callSiteId); + byteCodeGenerator->Writer()->ArgOut(index + 1, firstArgTempLocation + index, callSiteId, emitProfiledArgouts); } // Now release all those temps register @@ -7035,6 +7054,7 @@ size_t EmitArgs( ByteCodeGenerator *byteCodeGenerator, FuncInfo *funcInfo, Js::ProfileId callSiteId, + bool emitProfiledArgouts, Js::AuxArray *spreadIndices = nullptr ) { @@ -7045,11 +7065,11 @@ size_t EmitArgs( { while (pnode->nop == knopList) { - EmitOneArg(pnode->sxBin.pnode1, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, argIndex, spreadIndex, Js::Constants::NoRegister, spreadIndices); + EmitOneArg(pnode->sxBin.pnode1, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, argIndex, spreadIndex, Js::Constants::NoRegister, emitProfiledArgouts, spreadIndices); pnode = pnode->sxBin.pnode2; } - EmitOneArg(pnode, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, argIndex, spreadIndex, Js::Constants::NoRegister, spreadIndices); + EmitOneArg(pnode, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, argIndex, spreadIndex, Js::Constants::NoRegister, emitProfiledArgouts, spreadIndices); } return argIndex; @@ -7066,13 +7086,12 @@ void EmitArgListStart( if (thisLocation != Js::Constants::NoRegister) { // Emit the "this" object. - byteCodeGenerator->Writer()->ArgOut(0, thisLocation, callSiteId); + byteCodeGenerator->Writer()->ArgOut(0, thisLocation, callSiteId, false /*emitProfiledArgout*/); } } Js::ArgSlot EmitArgListEnd( ParseNode *pnode, - Js::RegSlot rhsLocation, Js::RegSlot thisLocation, Js::RegSlot evalLocation, Js::RegSlot newTargetLocation, @@ -7082,7 +7101,6 @@ Js::ArgSlot EmitArgListEnd( Js::ProfileId callSiteId) { BOOL fEvalInModule = false; - BOOL fIsPut = (rhsLocation != Js::Constants::NoRegister); BOOL fIsEval = (evalLocation != Js::Constants::NoRegister); BOOL fHasNewTarget = (newTargetLocation != Js::Constants::NoRegister); @@ -7092,14 +7110,6 @@ Js::ArgSlot EmitArgListEnd( Js::ArgSlot argSlotIndex = (Js::ArgSlot) argIndex; Js::ArgSlot evalIndex; - if (fIsPut) - { - // Emit the assigned value as an additional operand. Note that the value has already been evaluated. - // We just need to emit the ArgOut instruction. - argSlotIndex++; - byteCodeGenerator->Writer()->ArgOut(argSlotIndex, rhsLocation, callSiteId); - } - if (fIsEval && argSlotIndex > 0) { Assert(!fHasNewTarget); @@ -7125,19 +7135,8 @@ Js::ArgSlot EmitArgListEnd( evalEnv = byteCodeGenerator->PrependLocalScopes(evalEnv, evalLocation, funcInfo); - Js::ModuleID moduleID = byteCodeGenerator->GetModuleID(); - if (moduleID != kmodGlobal) - { - // Pass both the module root and the environment. - fEvalInModule = true; - byteCodeGenerator->Writer()->ArgOut(argSlotIndex + 1, ByteCodeGenerator::RootObjectRegister, callSiteId); - evalIndex = argSlotIndex + 2; - } - else - { - // Just pass the environment. - evalIndex = argSlotIndex + 1; - } + // Passing the FrameDisplay as an extra argument + evalIndex = argSlotIndex + 1; if (evalEnv == funcInfo->GetEnvRegister() || evalEnv == funcInfo->frameDisplayRegister) { @@ -7145,7 +7144,7 @@ Js::ArgSlot EmitArgListEnd( } else { - byteCodeGenerator->Writer()->ArgOut(evalIndex, evalEnv, callSiteId); + byteCodeGenerator->Writer()->ArgOut(evalIndex, evalEnv, callSiteId, false /*emitProfiledArgout*/); } } @@ -7153,7 +7152,7 @@ Js::ArgSlot EmitArgListEnd( { Assert(!fIsEval); - byteCodeGenerator->Writer()->ArgOut(argSlotIndex + 1, newTargetLocation, callSiteId); + byteCodeGenerator->Writer()->ArgOut(argSlotIndex + 1, newTargetLocation, callSiteId, false /*emitProfiledArgout*/); } Js::ArgSlot argIntCount = argSlotIndex + 1 + (Js::ArgSlot)fIsEval + (Js::ArgSlot)fEvalInModule + (Js::ArgSlot)fHasNewTarget; @@ -7169,7 +7168,6 @@ Js::ArgSlot EmitArgListEnd( Js::ArgSlot EmitArgList( ParseNode *pnode, - Js::RegSlot rhsLocation, Js::RegSlot thisLocation, Js::RegSlot newTargetLocation, BOOL fIsEval, @@ -7179,6 +7177,7 @@ Js::ArgSlot EmitArgList( Js::ProfileId callSiteId, Js::ArgSlot argsCountForStartCall, bool emitArgOutsAtEnd, + bool emitProfiledArgouts, uint16 spreadArgCount = 0, Js::AuxArray **spreadIndices = nullptr) { @@ -7211,14 +7210,14 @@ Js::ArgSlot EmitArgList( size_t argIndex = 0; if (emitArgOutsAtEnd) { - argIndex = EmitArgsWithArgOutsAtEnd(pnode, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, thisLocation, argsCountForStartCall, spreadIndices == nullptr ? nullptr : *spreadIndices); + argIndex = EmitArgsWithArgOutsAtEnd(pnode, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, thisLocation, argsCountForStartCall, emitProfiledArgouts, spreadIndices == nullptr ? nullptr : *spreadIndices); } else { - argIndex = EmitArgs(pnode, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, spreadIndices == nullptr ? nullptr : *spreadIndices); + argIndex = EmitArgs(pnode, fAssignRegs, byteCodeGenerator, funcInfo, callSiteId, emitProfiledArgouts, spreadIndices == nullptr ? nullptr : *spreadIndices); } - Js::ArgSlot argumentsCount = EmitArgListEnd(pnode, rhsLocation, thisLocation, evalLocation, newTargetLocation, byteCodeGenerator, funcInfo, argIndex, callSiteId); + Js::ArgSlot argumentsCount = EmitArgListEnd(pnode, thisLocation, evalLocation, newTargetLocation, byteCodeGenerator, funcInfo, argIndex, callSiteId); if (fIsEval) { @@ -7363,7 +7362,6 @@ Js::ArgSlot EmitNewObjectOfConstants( Js::Constants::NoRegister, Js::Constants::NoRegister, Js::Constants::NoRegister, - Js::Constants::NoRegister, byteCodeGenerator, funcInfo, argCount - 1, @@ -7441,7 +7439,7 @@ void EmitMethodFld(ParseNode *pnode, Js::RegSlot callObjLocation, Js::PropertyId } // lhs.apply(this, arguments); -void EmitApplyCall(ParseNode* pnode, Js::RegSlot rhsLocation, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, BOOL fReturnValue) +void EmitApplyCall(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, BOOL fReturnValue) { ParseNode* applyNode = pnode->sxCall.pnodeTarget; ParseNode* thisNode = pnode->sxCall.pnodeArgs->sxBin.pnode1; @@ -7507,7 +7505,7 @@ void EmitApplyCall(ParseNode* pnode, Js::RegSlot rhsLocation, ByteCodeGenerator* byteCodeGenerator->LoadHeapArguments(funcInfo); byteCodeGenerator->Writer()->MarkLabel(argsAlreadyCreated); - EmitCall(pnode, rhsLocation, byteCodeGenerator, funcInfo, fReturnValue, /*fEvaluateComponents*/true); + EmitCall(pnode, byteCodeGenerator, funcInfo, fReturnValue, /*fEvaluateComponents*/true); byteCodeGenerator->Writer()->MarkLabel(afterSlowPath); } @@ -7676,21 +7674,21 @@ void EmitCallTarget( { if (!pnodeTarget->IsSpecialName()) { - funcInfo->AcquireLoc(pnodeTarget); - // Assign the call target operand(s), putting them into expression temps if necessary to protect - // them from side-effects. - if (fSideEffectArgs) - { - SaveOpndValue(pnodeTarget, funcInfo); - } - byteCodeGenerator->EmitLoadInstance(pnodeTarget->sxPid.sym, pnodeTarget->sxPid.pid, thisLocation, callObjLocation, funcInfo); - if (*callObjLocation != Js::Constants::NoRegister) - { - // Load the call target as a property of the instance. - Js::PropertyId propertyId = pnodeTarget->sxPid.PropertyIdFromNameNode(); - EmitMethodFld(pnodeTarget, *callObjLocation, propertyId, byteCodeGenerator, funcInfo); - break; - } + funcInfo->AcquireLoc(pnodeTarget); + // Assign the call target operand(s), putting them into expression temps if necessary to protect + // them from side-effects. + if (fSideEffectArgs) + { + SaveOpndValue(pnodeTarget, funcInfo); + } + byteCodeGenerator->EmitLoadInstance(pnodeTarget->sxPid.sym, pnodeTarget->sxPid.pid, thisLocation, callObjLocation, funcInfo); + if (*callObjLocation != Js::Constants::NoRegister) + { + // Load the call target as a property of the instance. + Js::PropertyId propertyId = pnodeTarget->sxPid.PropertyIdFromNameNode(); + EmitMethodFld(pnodeTarget, *callObjLocation, propertyId, byteCodeGenerator, funcInfo); + break; + } } // FALL THROUGH to evaluate call target. @@ -7711,7 +7709,6 @@ void EmitCallTarget( void EmitCallI( ParseNode *pnode, BOOL fEvaluateComponents, - BOOL fIsPut, BOOL fIsEval, BOOL fHasNewTarget, uint32 actualArgCount, @@ -7737,106 +7734,90 @@ void EmitCallI( Js::Throw::OutOfMemory(); } - if (fIsPut) + + if (fEvaluateComponents && !isSuperCall) { - if (pnode->sxCall.spreadArgCount > 0) - { - // TODO(tcare): We are disallowing spread with CallIPut for the moment. See DEVDIV2: 876387 - // When CallIPut is migrated to the CallIExtended layout, this can be removed. - byteCodeGenerator->Writer()->W1(Js::OpCode::RuntimeReferenceError, SCODE_CODE(JSERR_CantAsgCall)); - } - // Grab a tmp register for the call result. - Js::RegSlot tmpReg = funcInfo->AcquireTmpRegister(); - byteCodeGenerator->Writer()->CallI(Js::OpCode::CallIFlags, tmpReg, pnodeTarget->location, actualArgSlotCount, callSiteId, Js::CallFlags::CallFlags_NewTarget); - funcInfo->ReleaseTmpRegister(tmpReg); + // Release the call target operands we assigned above. If we didn't assign them here, + // we'll need them later, so we can't re-use them for the result of the call. + funcInfo->ReleaseLoc(pnodeTarget); + } + // Grab a register for the call result. + if (pnode->isUsed) + { + funcInfo->AcquireLoc(pnode); + } + + if (fIsEval) + { + op = Js::OpCode::CallIExtendedFlags; + callFlags = Js::CallFlags::CallFlags_ExtraArg; } else { - if (fEvaluateComponents && !isSuperCall) + if (isSuperCall) { - // Release the call target operands we assigned above. If we didn't assign them here, - // we'll need them later, so we can't re-use them for the result of the call. - funcInfo->ReleaseLoc(pnodeTarget); + callFlags = Js::CallFlags_New; } - // Grab a register for the call result. - if (pnode->isUsed) + if (fHasNewTarget) { - funcInfo->AcquireLoc(pnode); + callFlags = (Js::CallFlags) (callFlags | Js::CallFlags::CallFlags_ExtraArg | Js::CallFlags::CallFlags_NewTarget); } - if (fIsEval) + if (pnode->sxCall.spreadArgCount > 0) { - op = Js::OpCode::CallIExtendedFlags; - callFlags = Js::CallFlags::CallFlags_ExtraArg; + op = (isSuperCall || fHasNewTarget) ? Js::OpCode::CallIExtendedFlags : Js::OpCode::CallIExtended; } else { - if (isSuperCall) - { - callFlags = Js::CallFlags_New; - } - if (fHasNewTarget) - { - callFlags = (Js::CallFlags) (callFlags | Js::CallFlags::CallFlags_ExtraArg | Js::CallFlags::CallFlags_NewTarget); - } - - if (pnode->sxCall.spreadArgCount > 0) - { - op = (isSuperCall || fHasNewTarget) ? Js::OpCode::CallIExtendedFlags : Js::OpCode::CallIExtended; - } - else - { - op = (isSuperCall || fHasNewTarget) ? Js::OpCode::CallIFlags : Js::OpCode::CallI; - } + op = (isSuperCall || fHasNewTarget) ? Js::OpCode::CallIFlags : Js::OpCode::CallI; } + } - if (op == Js::OpCode::CallI || op == Js::OpCode::CallIFlags) + if (op == Js::OpCode::CallI || op == Js::OpCode::CallIFlags) + { + if (isSuperCall) { - if (isSuperCall) - { - Js::RegSlot tmpReg = byteCodeGenerator->EmitLdObjProto(Js::OpCode::LdFuncObjProto, pnodeTarget->location, funcInfo); - byteCodeGenerator->Writer()->CallI(op, pnode->location, tmpReg, actualArgSlotCount, callSiteId, callFlags); - } - else - { - byteCodeGenerator->Writer()->CallI(op, pnode->location, pnodeTarget->location, actualArgSlotCount, callSiteId, callFlags); - } + Js::RegSlot tmpReg = byteCodeGenerator->EmitLdObjProto(Js::OpCode::LdFuncObjProto, pnodeTarget->location, funcInfo); + byteCodeGenerator->Writer()->CallI(op, pnode->location, tmpReg, actualArgSlotCount, callSiteId, callFlags); } else { - uint spreadIndicesSize = 0; - Js::CallIExtendedOptions options = Js::CallIExtended_None; - - if (pnode->sxCall.spreadArgCount > 0) - { - Assert(spreadIndices != nullptr); - spreadExtraAlloc = UInt32Math::Mul(spreadIndices->count, sizeof(uint32)); - spreadIndicesSize = UInt32Math::Add(sizeof(*spreadIndices), spreadExtraAlloc); - options = Js::CallIExtended_SpreadArgs; - } - - if (isSuperCall) - { - Js::RegSlot tmpReg = byteCodeGenerator->EmitLdObjProto(Js::OpCode::LdFuncObjProto, pnodeTarget->location, funcInfo); - byteCodeGenerator->Writer()->CallIExtended(op, pnode->location, tmpReg, actualArgSlotCount, options, spreadIndices, spreadIndicesSize, callSiteId, callFlags); - } - else - { - byteCodeGenerator->Writer()->CallIExtended(op, pnode->location, pnodeTarget->location, actualArgSlotCount, options, spreadIndices, spreadIndicesSize, callSiteId, callFlags); - } + byteCodeGenerator->Writer()->CallI(op, pnode->location, pnodeTarget->location, actualArgSlotCount, callSiteId, callFlags); } + } + else + { + uint spreadIndicesSize = 0; + Js::CallIExtendedOptions options = Js::CallIExtended_None; if (pnode->sxCall.spreadArgCount > 0) { - Assert(spreadExtraAlloc != 0); - AdeletePlus(byteCodeGenerator->GetAllocator(), spreadExtraAlloc, spreadIndices); + Assert(spreadIndices != nullptr); + spreadExtraAlloc = UInt32Math::Mul(spreadIndices->count, sizeof(uint32)); + spreadIndicesSize = UInt32Math::Add(sizeof(*spreadIndices), spreadExtraAlloc); + options = Js::CallIExtended_SpreadArgs; + } + + if (isSuperCall) + { + Js::RegSlot tmpReg = byteCodeGenerator->EmitLdObjProto(Js::OpCode::LdFuncObjProto, pnodeTarget->location, funcInfo); + byteCodeGenerator->Writer()->CallIExtended(op, pnode->location, tmpReg, actualArgSlotCount, options, spreadIndices, spreadIndicesSize, callSiteId, callFlags); + } + else + { + byteCodeGenerator->Writer()->CallIExtended(op, pnode->location, pnodeTarget->location, actualArgSlotCount, options, spreadIndices, spreadIndicesSize, callSiteId, callFlags); } } + + if (pnode->sxCall.spreadArgCount > 0) + { + Assert(spreadExtraAlloc != 0); + AdeletePlus(byteCodeGenerator->GetAllocator(), spreadExtraAlloc, spreadIndices); + } } void EmitCallInstrNoEvalComponents( ParseNode *pnode, - BOOL fIsPut, BOOL fIsEval, Js::RegSlot thisLocation, Js::RegSlot callObjLocation, @@ -7861,14 +7842,14 @@ void EmitCallInstrNoEvalComponents( Js::PropertyId propertyId = pnodeTarget->sxBin.pnode2->sxPid.PropertyIdFromNameNode(); EmitMethodFld(pnodeTarget, callObjLocation, propertyId, byteCodeGenerator, funcInfo); - EmitCallI(pnode, /*fEvaluateComponents*/ FALSE, fIsPut, fIsEval, /*fHasNewTarget*/ FALSE, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); + EmitCallI(pnode, /*fEvaluateComponents*/ FALSE, fIsEval, /*fHasNewTarget*/ FALSE, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); } break; case knopIndex: { EmitMethodElem(pnodeTarget, pnodeTarget->sxBin.pnode1->location, pnodeTarget->sxBin.pnode2->location, byteCodeGenerator); - EmitCallI(pnode, /*fEvaluateComponents*/ FALSE, fIsPut, fIsEval, /*fHasNewTarget*/ FALSE, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); + EmitCallI(pnode, /*fEvaluateComponents*/ FALSE, fIsEval, /*fHasNewTarget*/ FALSE, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); } break; @@ -7885,21 +7866,20 @@ void EmitCallInstrNoEvalComponents( Js::PropertyId propertyId = pnodeTarget->sxPid.PropertyIdFromNameNode(); EmitMethodFld(pnodeTarget, callObjLocation, propertyId, byteCodeGenerator, funcInfo); - EmitCallI(pnode, /*fEvaluateComponents*/ FALSE, fIsPut, fIsEval, /*fHasNewTarget*/ FALSE, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); + EmitCallI(pnode, /*fEvaluateComponents*/ FALSE, fIsEval, /*fHasNewTarget*/ FALSE, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); break; } } // FALL THROUGH default: - EmitCallI(pnode, /*fEvaluateComponents*/ FALSE, fIsPut, fIsEval, /*fHasNewTarget*/ FALSE, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); + EmitCallI(pnode, /*fEvaluateComponents*/ FALSE, fIsEval, /*fHasNewTarget*/ FALSE, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); break; } } void EmitCallInstr( ParseNode *pnode, - BOOL fIsPut, BOOL fIsEval, BOOL fHasNewTarget, Js::RegSlot thisLocation, @@ -7926,7 +7906,7 @@ void EmitCallInstr( funcInfo->ReleaseTmpRegister(callObjLocation); } - EmitCallI(pnode, /*fEvaluateComponents*/ TRUE, fIsPut, fIsEval, fHasNewTarget, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); + EmitCallI(pnode, /*fEvaluateComponents*/ TRUE, fIsEval, fHasNewTarget, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); } void EmitNew(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo) @@ -7989,11 +7969,13 @@ void EmitNew(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* f Js::ProfileId callSiteId = byteCodeGenerator->GetNextCallSiteId(op); + // Only emit profiled argouts if we're going to profile this call. + bool emitProfiledArgouts = callSiteId != byteCodeGenerator->GetCurrentCallSiteId(); Js::AuxArray *spreadIndices = nullptr; - actualArgCount = EmitArgList(pnode->sxCall.pnodeArgs, Js::Constants::NoRegister, Js::Constants::NoRegister, Js::Constants::NoRegister, - false, true, byteCodeGenerator, funcInfo, callSiteId, argCount, pnode->sxCall.hasDestructuring, pnode->sxCall.spreadArgCount, &spreadIndices); + actualArgCount = EmitArgList(pnode->sxCall.pnodeArgs, Js::Constants::NoRegister, Js::Constants::NoRegister, + false, true, byteCodeGenerator, funcInfo, callSiteId, argCount, pnode->sxCall.hasDestructuring, emitProfiledArgouts, pnode->sxCall.spreadArgCount, &spreadIndices); funcInfo->ReleaseLoc(pnode->sxCall.pnodeTarget); @@ -8023,7 +8005,6 @@ void EmitNew(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, FuncInfo* f void EmitCall( ParseNode* pnode, - Js::RegSlot rhsLocation, ByteCodeGenerator* byteCodeGenerator, FuncInfo* funcInfo, BOOL fReturnValue, @@ -8031,7 +8012,6 @@ void EmitCall( Js::RegSlot overrideThisLocation, Js::RegSlot newTargetLocation) { - BOOL fIsPut = (rhsLocation != Js::Constants::NoRegister); // If the call returns a float, we'll note this in the byte code. Js::RegSlot thisLocation = Js::Constants::NoRegister; Js::RegSlot callObjLocation = Js::Constants::NoRegister; @@ -8051,9 +8031,10 @@ void EmitCall( return;*/ } - unsigned int argCount = CountArguments(pnode->sxCall.pnodeArgs, &fSideEffectArgs) + (unsigned int)fIsPut; + unsigned int argCount = CountArguments(pnode->sxCall.pnodeArgs, &fSideEffectArgs); - BOOL fIsEval = !fIsPut && pnode->sxCall.isEvalCall; + BOOL fIsEval = pnode->sxCall.isEvalCall; + Js::ArgSlot argSlotCount = (Js::ArgSlot)argCount; if (fIsEval) { @@ -8066,25 +8047,10 @@ void EmitCall( // if (argCount > 1) { - // Check the module ID as well. If it's not the global (default) module, - // we need to pass the root to eval so it can do the right global lookups. - // (Passing the module root is the least disruptive way to get the module ID - // to the helper, given the current set of byte codes. Once we have a full set - // of byte code ops taking immediate opnds, passing the ID is more intuitive.) - Js::ModuleID moduleID = byteCodeGenerator->GetModuleID(); - if (moduleID == kmodGlobal) - { - argCount++; - } - else - { - // Module ID must be passed - argCount += 2; - } + argCount++; } } - - if (fHasNewTarget) + else if (fHasNewTarget) { // When we need to pass new.target explicitly, it is passed as an extra argument. // This is similar to how eval passes an extra argument for the frame display and is @@ -8094,9 +8060,9 @@ void EmitCall( argCount++; } - Js::ArgSlot argSlotCount = (Js::ArgSlot)argCount; - - if (argCount != (unsigned int)argSlotCount) + // argCount indicates the total arguments count including the extra arguments. + // argSlotCount indicates the actual arguments count. So argCount should always never be les sthan argSlotCount. + if (argCount < (unsigned int)argSlotCount) { Js::Throw::OutOfMemory(); } @@ -8134,26 +8100,27 @@ void EmitCall( // Evaluate the arguments (nothing mode-specific here). // Start call, allocate out param space - funcInfo->StartRecordingOutArgs(argSlotCount); + // We have to use the arguments count including the extra args to Start Call as we use it to allocated space for all the args + funcInfo->StartRecordingOutArgs(argCount); Js::ProfileId callSiteId = byteCodeGenerator->GetNextCallSiteId(Js::OpCode::CallI); + // Only emit profiled argouts if we're going to allocate callSiteInfo (on the DynamicProfileInfo) for this call. + bool emitProfiledArgouts = callSiteId != byteCodeGenerator->GetCurrentCallSiteId(); Js::AuxArray *spreadIndices; - Js::ArgSlot actualArgCount = EmitArgList(pnodeArgs, rhsLocation, thisLocation, newTargetLocation, fIsEval, fEvaluateComponents, byteCodeGenerator, funcInfo, callSiteId, argSlotCount, pnode->sxCall.hasDestructuring, spreadArgCount, &spreadIndices); - - Assert(argSlotCount == actualArgCount); + EmitArgList(pnodeArgs, thisLocation, newTargetLocation, fIsEval, fEvaluateComponents, byteCodeGenerator, funcInfo, callSiteId, (Js::ArgSlot)argCount, pnode->sxCall.hasDestructuring, emitProfiledArgouts, spreadArgCount, &spreadIndices); if (!fEvaluateComponents) { - EmitCallInstrNoEvalComponents(pnode, fIsPut, fIsEval, thisLocation, callObjLocation, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); + EmitCallInstrNoEvalComponents(pnode, fIsEval, thisLocation, callObjLocation, argSlotCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); } else { - EmitCallInstr(pnode, fIsPut, fIsEval, fHasNewTarget, releaseThisLocation ? thisLocation : Js::Constants::NoRegister, callObjLocation, actualArgCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); + EmitCallInstr(pnode, fIsEval, fHasNewTarget, releaseThisLocation ? thisLocation : Js::Constants::NoRegister, callObjLocation, argSlotCount, byteCodeGenerator, funcInfo, callSiteId, spreadIndices); } // End call, pop param space - funcInfo->EndRecordingOutArgs(argSlotCount); + funcInfo->EndRecordingOutArgs((Js::ArgSlot)argCount); } void EmitInvoke( @@ -8191,7 +8158,7 @@ void EmitInvoke( byteCodeGenerator->Writer()->StartCall(Js::OpCode::StartCall, 2); EmitArgListStart(callObjLocation, byteCodeGenerator, funcInfo, callSiteId); - byteCodeGenerator->Writer()->ArgOut(1, arg1Location, callSiteId); + byteCodeGenerator->Writer()->ArgOut(1, arg1Location, callSiteId, false /*emitProfiledArgout*/); byteCodeGenerator->Writer()->CallI(Js::OpCode::CallI, location, location, 2, callSiteId); } @@ -10337,9 +10304,13 @@ void Emit(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncInfo *func } case knopName: { - funcInfo->AcquireLoc(pnode); - byteCodeGenerator->EmitPropTypeof(pnode->location, pnodeOpnd->sxPid.sym, pnodeOpnd->sxPid.pid, funcInfo); - break; + if (pnodeOpnd->IsUserIdentifier()) + { + funcInfo->AcquireLoc(pnode); + byteCodeGenerator->EmitPropTypeof(pnode->location, pnodeOpnd->sxPid.sym, pnodeOpnd->sxPid.pid, funcInfo); + break; + } + // Special names should fallthrough to default case } default: @@ -10525,11 +10496,11 @@ void Emit(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncInfo *func if (pnode->sxCall.isApplyCall && funcInfo->GetApplyEnclosesArgs()) { // TODO[ianhall]: Can we remove the ApplyCall bytecode gen time optimization? - EmitApplyCall(pnode, Js::Constants::NoRegister, byteCodeGenerator, funcInfo, fReturnValue); + EmitApplyCall(pnode, byteCodeGenerator, funcInfo, fReturnValue); } else { - EmitCall(pnode, Js::Constants::NoRegister, byteCodeGenerator, funcInfo, fReturnValue, /*fEvaluateComponents*/ true); + EmitCall(pnode, byteCodeGenerator, funcInfo, fReturnValue, /*fEvaluateComponents*/ true); } } @@ -11158,8 +11129,6 @@ void Emit(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator, FuncInfo *func byteCodeGenerator->Writer()->Br(funcInfo->singleExit); byteCodeGenerator->EndStatement(pnode); break; - case knopLabel: - break; // PTNODE(knopBlock , "{}" ,None ,Block,fnopNone) case knopBlock: if (pnode->sxBlock.pnodeStmt != nullptr) diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.cpp index 078face02db..333276d3507 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.cpp @@ -414,10 +414,6 @@ void Visit(ParseNode *pnode, ByteCodeGenerator* byteCodeGenerator, PrefixFn pref case knopContinue: // TODO: some representation of target break; - // PTNODE(knopLabel , "label" ,None ,Label,fnopNone) - case knopLabel: - // TODO: print labeled statement - break; // PTNODE(knopSwitch , "switch" ,None ,Switch,fnopBreak) case knopSwitch: Visit(pnode->sxSwitch.pnodeVal, byteCodeGenerator, prefix, postfix); @@ -1701,64 +1697,6 @@ Symbol * ByteCodeGenerator::FindSymbol(Symbol **symRef, IdentPtr pid, bool forRe } } - bool didTransferToFncVarSym = false; - - #pragma prefast(suppress:6237, "The right hand side condition does not have any side effects.") - if (PHASE_ON(Js::OptimizeBlockScopePhase, top->byteCodeFunction) && - sym->GetIsBlockVar() && - !sym->GetScope()->IsBlockInLoop() && - sym->GetSymbolType() == STFunction) - { - // Try to use the var-scoped function binding in place of the lexically scoped one. - // This can be done if neither binding is explicitly assigned to, if there's no ambiguity in the binding - // (with/eval), and if the function is not declared in a loop. (Loops are problematic, because as the loop - // iterates different instances can be captured. If we always capture the var-scoped binding, then we - // always get the latest instance, when we should get the instance belonging to the iteration that captured it.) - if (sym->GetHasNonLocalReference()) - { - if (!scope) - { - Js::PropertyId i; - scope = FindScopeForSym(symScope, nullptr, &i, top); - } - if (scope == symScope && !scope->GetIsObject()) - { - Symbol *fncVarSym = sym->GetFuncScopeVarSym(); - if (fncVarSym && - !fncVarSym->HasBlockFncVarRedecl() && - sym->GetAssignmentState() == NotAssigned && - fncVarSym->GetAssignmentState() == NotAssigned) - { - // Make sure no dynamic scope intrudes between the two bindings. - bool foundDynamicScope = false; - for (Scope *tmpScope = symScope->GetEnclosingScope(); tmpScope != fncVarSym->GetScope(); tmpScope = tmpScope->GetEnclosingScope()) - { - Assert(tmpScope); - if (tmpScope->GetIsDynamic()) - { - foundDynamicScope = true; - break; - } - } - if (!foundDynamicScope) - { - didTransferToFncVarSym = true; - sym = fncVarSym; - symScope = sym->GetScope(); - if (nonLocalRef) - { - sym->SetHasNonLocalReference(); - } - } - } - } - } - } - if (!didTransferToFncVarSym) - { - sym->SetHasRealBlockVarRef(); - } - // This may not be a non-local reference, but the symbol may still be accessed non-locally. ('with', e.g.) // In that case, make sure we still process the symbol and its scope for closure capture. if (nonLocalRef || sym->GetHasNonLocalReference()) @@ -1900,7 +1838,7 @@ bool ByteCodeGenerator::CanStackNestedFunc(FuncInfo * funcInfo, bool trace) return false; } - if (funcInfo->GetBodyScope()->GetIsObject() || funcInfo->GetParamScope()->GetIsObject()) + if (funcInfo->GetBodyScope()->GetIsObject() || funcInfo->GetParamScope()->GetIsObject() || (funcInfo->GetFuncExprScope() && funcInfo->GetFuncExprScope()->GetIsObject())) { if (trace) { @@ -2603,7 +2541,7 @@ FuncInfo* PreVisitFunction(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerato } PreVisitBlock(pnode->sxFnc.pnodeScopes, byteCodeGenerator); // If we have arguments, we are going to need locations if the function is in strict mode or we have a non-simple parameter list. This is because we will not create a scope object. - bool assignLocationForFormals = !(funcInfo->GetHasHeapArguments() && ByteCodeGenerator::NeedScopeObjectForArguments(funcInfo, funcInfo->root)); + bool assignLocationForFormals = !ByteCodeGenerator::NeedScopeObjectForArguments(funcInfo, funcInfo->root); AddArgsToScope(pnode, byteCodeGenerator, assignLocationForFormals); return funcInfo; @@ -2853,7 +2791,7 @@ FuncInfo* PostVisitFunction(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerat { if (top->GetCallsEval() || top->GetChildCallsEval() || - (top->GetHasArguments() && ByteCodeGenerator::NeedScopeObjectForArguments(top, pnode) && pnode->sxFnc.pnodeParams != nullptr) || + (top->GetHasArguments() && ByteCodeGenerator::NeedScopeObjectForArguments(top, pnode)) || top->GetHasLocalInClosure() || (top->funcExprScope && top->funcExprScope->GetMustInstantiate()) || // When we have split scope normally either eval will be present or the GetHasLocalInClosure will be true as one of the formal is @@ -3274,7 +3212,6 @@ void AddFunctionsToScope(ParseNodePtr scope, ByteCodeGenerator * byteCodeGenerat sym->GetScope() != sym->GetScope()->GetFunc()->GetParamScope()) { sym->SetIsBlockVar(true); - sym->SetHasRealBlockVarRef(true); } } }); @@ -3492,20 +3429,7 @@ void VisitNestedScopes(ParseNode* pnodeScopeList, ParseNode* pnodeParent, ByteCo { PreVisitCatch(pnodeScope, byteCodeGenerator); - if (pnodeScope->sxCatch.pnodeParam->nop == knopParamPattern) - { - Parser::MapBindIdentifier(pnodeScope->sxCatch.pnodeParam->sxParamPattern.pnode1, [byteCodeGenerator](ParseNodePtr pnode) - { - Assert(pnode->nop == knopLetDecl); - pnode->sxVar.sym->SetLocation(byteCodeGenerator->NextVarRegister()); - }); - - if (pnodeScope->sxCatch.pnodeParam->sxParamPattern.location == Js::Constants::NoRegister) - { - pnodeScope->sxCatch.pnodeParam->sxParamPattern.location = byteCodeGenerator->NextVarRegister(); - } - } - else + if (pnodeScope->sxCatch.pnodeParam->nop != knopParamPattern) { Visit(pnodeScope->sxCatch.pnodeParam, byteCodeGenerator, prefix, postfix); } @@ -3642,6 +3566,7 @@ void PreVisitBlock(ParseNode *pnodeBlock, ByteCodeGenerator *byteCodeGenerator) #endif sym->SetIsGlobal(isGlobalScope); sym->SetIsBlockVar(true); + sym->SetIsConst(pnode->nop == knopConstDecl); sym->SetNeedDeclaration(true); pnode->sxVar.sym = sym; }; @@ -5015,7 +4940,8 @@ void AssignRegisters(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator) // as we are going assign to the original sym CheckFuncAssignment(sym, pnode->sxVar.pnodeInit, byteCodeGenerator); - if (sym->GetIsCatch() || (pnode->nop == knopVarDecl && sym->GetIsBlockVar() && !pnode->sxVar.isBlockScopeFncDeclVar)) + // If this is a destructured param case then it is a let binding and we don't have to look for duplicate symbol in the body + if ((sym->GetIsCatch() && pnode->sxVar.sym->GetScope()->GetScopeType() != ScopeType_CatchParamPattern) || (pnode->nop == knopVarDecl && sym->GetIsBlockVar() && !pnode->sxVar.isBlockScopeFncDeclVar)) { // The LHS of the var decl really binds to the local symbol, not the catch or let symbol. // But the assignment will go to the catch or let symbol. Just assign a register to the local @@ -5030,13 +4956,6 @@ void AssignRegisters(ParseNode *pnode, ByteCodeGenerator *byteCodeGenerator) auto symName = sym->GetName(); sym = funcInfo->bodyScope->FindLocalSymbol(symName); - if (sym == nullptr && nop == knopLetDecl && pnode->sxVar.sym->GetIsCatch()) - { - // This should be a scenario like try {} catch([x]) {} with no duplicate definition inside the catch block. - // In non-destructured catch block param case, the created node will be a name node, not a var node. - break; - } - if (sym == nullptr) { sym = funcInfo->paramScope->FindLocalSymbol(symName); diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.h b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.h index 4c1bfec6a25..a27096ae8d5 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeGenerator.h @@ -154,6 +154,7 @@ class ByteCodeGenerator } return m_callSiteId; } + Js::ProfileId GetCurrentCallSiteId() { return m_callSiteId; } Js::RegSlot NextVarRegister(); Js::RegSlot NextConstRegister(); diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeReader.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeReader.cpp index ac19a517186..c3ace9b8603 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeReader.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeReader.cpp @@ -255,6 +255,11 @@ namespace Js template const unaligned Js::OpLayoutT_Unsigned1 >* Js::ByteCodeReader::GetLayout > >(const byte*&); template const unaligned Js::OpLayoutT_Unsigned1 >* Js::ByteCodeReader::GetLayout > >(const byte*&); template const unaligned Js::OpLayoutT_Unsigned1 >* Js::ByteCodeReader::GetLayout > >(const byte*&); +#ifdef ASMJS_PLAT + template const unaligned Js::OpLayoutT_WasmLoopStart >* Js::ByteCodeReader::GetLayout > >(const byte*&); + template const unaligned Js::OpLayoutT_WasmLoopStart >* Js::ByteCodeReader::GetLayout > >(const byte*&); + template const unaligned Js::OpLayoutT_WasmLoopStart >* Js::ByteCodeReader::GetLayout > >(const byte*&); +#endif const Js::PropertyIdArray * ByteCodeReader::ReadPropertyIdArray(uint offset, FunctionBody * functionBody) { diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeSerializer.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeSerializer.cpp index ac11cf97639..0d5ea5ebc97 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeSerializer.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeSerializer.cpp @@ -64,12 +64,12 @@ namespace Js const int magicStartOfPropIdsOfFormals = *(int*)"pif["; const int magicEndOfPropIdsOfFormals = *(int*)"]pif"; const int magicStartOfSlotIdToNestedIndexArray = *(int*)"sni["; - const int magicEndOfSlotIdToNestedIndexArray = *(int*)"]sni" + const int magicEndOfSlotIdToNestedIndexArray = *(int*)"]sni"; #endif // Serialized files are architecture specific #ifndef VALIDATE_SERIALIZED_BYTECODE -#if _M_AMD64 +#if TARGET_64 const byte magicArchitecture = 64; #else const byte magicArchitecture = 32; @@ -123,15 +123,21 @@ enum FileVersionScheme : byte // Used for selective serialization of Function Body fields to make the representation compact #define DECLARE_SERIALIZABLE_FIELD(type, name, serializableType) bool has_##name : 1 -#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD(type, name, serializableType) bool has_##name : 1 +#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD(type, name, serializableType, defaultValue) bool has_##name : 1 #define DEFINE_ALL_FIELDS struct SerializedFieldList { #include "SerializableFunctionFields.h" bool has_m_lineNumber: 1; bool has_m_columnNumber: 1; + bool has_attributes : 1; bool has_m_nestedCount: 1; + bool has_loopHeaderArray : 1; + bool has_asmJsInfo : 1; + bool has_auxiliary : 1; + bool has_propertyIdOfFormals: 1; bool has_slotIdInCachedScopeToNestedIndexArray : 1; + bool has_debuggerScopeSlotArray : 1; }; C_ASSERT(sizeof(GUID)==sizeof(DWORD)*4); @@ -223,16 +229,19 @@ enum FunctionFlags // Kinds of constant enum ConstantType : byte { - ctInt = 1, - ctString16 = 2, - ctNull = 3, - ctUndefined = 4, - ctNumber = 5, - ctNullDisplay = 6, - ctStrictNullDisplay = 7, - ctTrue = 8, - ctFalse = 9, - ctStringTemplateCallsite = 10 + ctInt8 = 1, + ctInt16 = 2, + ctInt32 = 3, + ctNumber = 4, + ctString16 = 5, + ctPropertyString16 = 6, + ctNull = 7, + ctUndefined = 8, + ctNullDisplay = 9, + ctStrictNullDisplay = 10, + ctTrue = 11, + ctFalse = 12, + ctStringTemplateCallsite = 13, }; @@ -343,16 +352,16 @@ class ByteCodeBufferBuilder BufferBuilderInt32 originalSourceSize; BufferBuilderInt32 originalCharLength; BufferBuilderRelativeOffset string16sOffset; - BufferBuilderRelativeOffset sourceSpansOffset; BufferBuilderRelativeOffset lineInfoCacheOffset; BufferBuilderRelativeOffset functionsOffset; BufferBuilderInt32 string16Count; BufferBuilderList string16IndexTable; BufferBuilderList string16Table; BufferBuilderAligned alignedString16Table; - BufferBuilderList sourceSpans; BufferBuilderInt32 lineInfoCacheCount; - BufferBuilderRaw lineInfoCache; + BufferBuilderRaw lineCharacterOffsetCacheBuffer; + BufferBuilderByte lineInfoHasByteCache; + BufferBuilderRaw lineByteOffsetCacheBuffer; BufferBuilderInt32 functionCount; BufferBuilderList functionsTable; // End File Layout --------------------------------- @@ -396,17 +405,17 @@ class ByteCodeBufferBuilder originalSourceSize(_u("Source Size"), sourceSize), originalCharLength(_u("Source Char Length"), sourceCharLength), string16sOffset(_u("Offset of String16s"), &string16Count), - sourceSpansOffset(_u("Offset of Source Spans"), &sourceSpans), - lineInfoCacheOffset(_u("Offset of Source Spans"), &lineInfoCacheCount), + lineInfoCacheOffset(_u("Offset of Line Info Cache"), &lineInfoCacheCount), functionCount(_u("Function Count"), 0), functionsOffset(_u("Offset of Functions"), &functionCount), string16Count(_u("String16 Count"), 0), string16IndexTable(_u("String16 Indexes")), string16Table(_u("String16 Table")), alignedString16Table(_u("Alignment for String16 Table"), &string16Table, sizeof(char16)), - sourceSpans(_u("Source Spans")), lineInfoCacheCount(_u("Line Info Cache"), sourceInfo->GetLineOffsetCache()->GetLineCount()), - lineInfoCache(_u("Line Info Cache"), lineInfoCacheCount.value * sizeof(JsUtil::LineOffsetCache::LineOffsetCacheItem), (byte *)sourceInfo->GetLineOffsetCache()->GetItems()), + lineCharacterOffsetCacheBuffer(_u("Line Info Character Cache"), lineInfoCacheCount.value * sizeof(charcount_t), (byte *)sourceInfo->GetLineOffsetCache()->GetLineCharacterOffsetBuffer()), + lineInfoHasByteCache(_u("Line Info Has Byte Cache"), sourceInfo->GetLineOffsetCache()->GetLineByteOffsetBuffer() != nullptr), + lineByteOffsetCacheBuffer(_u("Line Info Byte Cache"), lineInfoCacheCount.value * sizeof(charcount_t), (byte *)sourceInfo->GetLineOffsetCache()->GetLineByteOffsetBuffer()), functionsTable(_u("Functions")), nextString16Id(builtInPropertyCount), // Reserve the built-in property ids topFunctionId(0), @@ -498,13 +507,17 @@ class ByteCodeBufferBuilder // Prepend all sections (in reverse order because of prepend) all.list = regex::ImmutableList::OfSingle(&functionsTable, alloc); all.list = all.list->Prepend(&functionCount, alloc); - all.list = all.list->Prepend(&lineInfoCache, alloc); + if (lineByteOffsetCacheBuffer.raw != nullptr) + { + all.list = all.list->Prepend(&lineByteOffsetCacheBuffer, alloc); + } + all.list = all.list->Prepend(&lineInfoHasByteCache, alloc); + all.list = all.list->Prepend(&lineCharacterOffsetCacheBuffer, alloc); all.list = all.list->Prepend(&lineInfoCacheCount, alloc); all.list = all.list->Prepend(&alignedString16Table, alloc); all.list = all.list->Prepend(&string16IndexTable, alloc); all.list = all.list->Prepend(&string16Count, alloc); all.list = all.list->Prepend(&functionsOffset, alloc); - all.list = all.list->Prepend(&sourceSpansOffset, alloc); all.list = all.list->Prepend(&lineInfoCacheOffset, alloc); all.list = all.list->Prepend(&string16sOffset, alloc); all.list = all.list->Prepend(&originalCharLength, alloc); @@ -781,7 +794,7 @@ class ByteCodeBufferBuilder }; #ifdef ASMJS_PLAT - HRESULT RewriteAsmJsByteCodesInto(BufferBuilderList & builder, LPCWSTR clue, FunctionBody * function, ByteBlock * byteBlock) + HRESULT RewriteAsmJsByteCodesInto(BufferBuilderList & builder, LPCWSTR clue, FunctionBody * function, ByteBlock * byteBlock, SerializedFieldList& definedFields) { SListCounted auxRecords(alloc); @@ -875,12 +888,12 @@ class ByteCodeBufferBuilder } finalSize->value = size; - RewriteAuxiliaryInto(builder, auxRecords, reader, function); + RewriteAuxiliaryInto(builder, auxRecords, reader, function, definedFields); return S_OK; } #endif - HRESULT RewriteByteCodesInto(BufferBuilderList & builder, LPCWSTR clue, FunctionBody * function, ByteBlock * byteBlock) + HRESULT RewriteByteCodesInto(BufferBuilderList & builder, LPCWSTR clue, FunctionBody * function, ByteBlock * byteBlock, SerializedFieldList& definedFields) { SListCounted auxRecords(alloc); @@ -960,7 +973,6 @@ class ByteCodeBufferBuilder DEFAULT_LAYOUT(Empty); DEFAULT_LAYOUT_WITH_ONEBYTE(Reg1); DEFAULT_LAYOUT_WITH_ONEBYTE_AND_PROFILED(Reg2); - DEFAULT_LAYOUT_WITH_ONEBYTE_AND_PROFILED(Reg2WithICIndex); DEFAULT_LAYOUT_WITH_ONEBYTE_AND_PROFILED(Reg3); DEFAULT_LAYOUT_WITH_ONEBYTE(Reg4); DEFAULT_LAYOUT_WITH_ONEBYTE(Reg5); @@ -987,7 +999,6 @@ class ByteCodeBufferBuilder DEFAULT_LAYOUT_WITH_ONEBYTE_AND_PROFILED(ElementSlotI1); DEFAULT_LAYOUT_WITH_ONEBYTE_AND_PROFILED(ElementSlotI2); DEFAULT_LAYOUT(W1); - DEFAULT_LAYOUT(Reg1Int2); DEFAULT_LAYOUT_WITH_ONEBYTE_AND_PROFILED(Reg1Unsigned1); DEFAULT_LAYOUT_WITH_ONEBYTE(Reg2Int1); DEFAULT_LAYOUT_WITH_ONEBYTE(Unsigned1); @@ -1193,21 +1204,23 @@ class ByteCodeBufferBuilder } finalSize->value = size; - RewriteAuxiliaryInto(builder, auxRecords, reader, function); + RewriteAuxiliaryInto(builder, auxRecords, reader, function, definedFields); return S_OK; } void RewriteAuxiliaryInto(BufferBuilderList& builder, SListCounted const& auxRecordList, - ByteCodeReader& reader, FunctionBody * functionBody) + ByteCodeReader& reader, FunctionBody * functionBody, SerializedFieldList& definedFields) { uint count = auxRecordList.Count(); - PrependInt32(builder, _u("Auxiliary Structure Count"), count); + if (count == 0) { return; } + definedFields.has_auxiliary = true; + PrependInt32(builder, _u("Auxiliary Structure Count"), count); auto writeAuxVarArray = [&](uint offset, bool isVarCount, int count, const Var * elements) { typedef serialization_alignment SerializedVarArray T; T header(offset, isVarCount, count); @@ -1375,8 +1388,6 @@ class ByteCodeBufferBuilder #ifdef BYTE_CODE_MAGIC_CONSTANTS size += PrependInt32(builder, _u("Start String Constant"), magicStartStringConstant); #endif - size += PrependBool(builder, _u("Is Property String"), VirtualTableInfo::HasVirtualTable(str)); - auto bb = Anew(alloc, ByteBuffer, (str->GetLength() + 1) * sizeof(char16), (void*)str->GetSz()); size += PrependByteBuffer(builder, _u("String Constant 16 Value"), bb); @@ -1442,13 +1453,28 @@ class ByteCodeBufferBuilder case TypeIds_Integer: { - auto size = PrependByte(builder, _u("Integer Constant"), ctInt); - return size + PrependConstantInt32(builder, _u("Integer Constant Value"), TaggedInt::ToInt32(var)); + int32 value = TaggedInt::ToInt32(var); + if ((int8)value == value) + { + auto size = PrependByte(builder, _u("Integer Constant"), ctInt8); + return size + PrependByte(builder, _u("Integer Constant Value"), (byte)value); + } + else if ((int16)value == value) + { + auto size = PrependByte(builder, _u("Integer Constant"), ctInt16); + return size + PrependConstantInt16(builder, _u("Integer Constant Value"), (int16)value); + } + else + { + auto size = PrependByte(builder, _u("Integer Constant"), ctInt32); + return size + PrependConstantInt32(builder, _u("Integer Constant Value"), value); + } } case TypeIds_String: { - auto size = PrependByte(builder, _u("String Constant 16"), ctString16); + auto size = PrependByte(builder, _u("String Constant 16"), + Js::PropertyString::Is(var)? ctPropertyString16 : ctString16); return size + PrependStringConstant(builder, var); } @@ -1784,45 +1810,35 @@ class ByteCodeBufferBuilder return sizeof(serialization_alignment TStructType); } - uint32 AddPropertyIdOfFormals(BufferBuilderList & builder, FunctionBody * function) + uint32 AddPropertyIdOfFormals(BufferBuilderList & builder, PropertyIdArray * propIds, FunctionBody * function) { uint32 size = 0; #ifdef BYTE_CODE_MAGIC_CONSTANTS size += PrependInt32(builder, _u("Start propertyids of formals"), magicStartOfPropIdsOfFormals); #endif - PropertyIdArray * propIds = function->GetFormalsPropIdArray(false); - if (propIds == nullptr) + byte extraSlotCount = 0; + if (function->HasCachedScopePropIds()) { - size += PrependBool(builder, _u("ExportsIdArrayLength"), false); + extraSlotCount = ActivationObjectEx::ExtraSlotCount(); } - else - { - size += PrependBool(builder, _u("ExportsIdArrayLength"), true); - byte extraSlotCount = 0; - if (function->HasCachedScopePropIds()) - { - extraSlotCount = ActivationObjectEx::ExtraSlotCount(); - } + size += PrependInt32(builder, _u("ExportsIdArrayLength"), propIds->count); + size += PrependByte(builder, _u("ExtraSlotsCount"), extraSlotCount); + size += PrependByte(builder, _u("ExportsIdArrayDups"), propIds->hadDuplicates); + size += PrependByte(builder, _u("ExportsIdArray__proto__"), propIds->has__proto__); + size += PrependByte(builder, _u("ExportsIdArrayHasNonSimpleParams"), propIds->hasNonSimpleParams); - size += PrependInt32(builder, _u("ExportsIdArrayLength"), propIds->count); - size += PrependByte(builder, _u("ExtraSlotsCount"), extraSlotCount); - size += PrependByte(builder, _u("ExportsIdArrayDups"), propIds->hadDuplicates); - size += PrependByte(builder, _u("ExportsIdArray__proto__"), propIds->has__proto__); - size += PrependByte(builder, _u("ExportsIdArrayHasNonSimpleParams"), propIds->hasNonSimpleParams); - - for (uint i = 0; i < propIds->count; i++) - { - PropertyId propertyId = encodePossiblyBuiltInPropertyId(propIds->elements[i]); - size += PrependInt32(builder, _u("ExportsIdArrayElem"), propertyId); - } + for (uint i = 0; i < propIds->count; i++) + { + PropertyId propertyId = encodePossiblyBuiltInPropertyId(propIds->elements[i]); + size += PrependInt32(builder, _u("ExportsIdArrayElem"), propertyId); + } - auto slots = propIds->elements + propIds->count; - for (byte i = 0; i < extraSlotCount; i++) - { - size += PrependInt32(builder, _u("Extra Slot"), slots[i]); - } + auto slots = propIds->elements + propIds->count; + for (byte i = 0; i < extraSlotCount; i++) + { + size += PrependInt32(builder, _u("Extra Slot"), slots[i]); } #ifdef BYTE_CODE_MAGIC_CONSTANTS size += PrependInt32(builder, _u("End of prop ids for formals array"), magicEndOfPropIdsOfFormals); @@ -1985,11 +2001,6 @@ class ByteCodeBufferBuilder return ByteCodeSerializer::CantGenerate; } - bool isAnonymous = function->GetIsAnonymousFunction(); - const char16* displayName = isAnonymous ? nullptr : function->GetDisplayName(); - uint displayNameLength = isAnonymous ? 0 : function->m_displayNameLength; - PrependString16(builder, _u("Display Name"), displayName, (displayNameLength + 1)* sizeof(char16)); - if (function->m_lineNumber != 0) { definedFields.has_m_lineNumber = true; @@ -2002,6 +2013,8 @@ class ByteCodeBufferBuilder PrependInt32(builder, _u("Column Number"), function->m_columnNumber); } + bool isAnonymous = function->GetIsAnonymousFunction(); + // FunctionBody Details DWORD bitFlags = (function->m_isDeclaration ? ffIsDeclaration : 0) @@ -2032,23 +2045,36 @@ class ByteCodeBufferBuilder #endif ; - PrependInt32(builder, _u("BitFlags"), bitFlags); - PrependInt32(builder, _u("Relative Function ID"), function->GetLocalFunctionId() - topFunctionId); // Serialized function ids are relative to the top function ID - PrependInt32(builder, _u("Attributes"), function->GetAttributes()); - AssertMsg((function->GetAttributes() & - ~(FunctionInfo::Attributes::ErrorOnNew - | FunctionInfo::Attributes::SuperReference - | FunctionInfo::Attributes::Lambda - | FunctionInfo::Attributes::Async - | FunctionInfo::Attributes::CapturesThis - | FunctionInfo::Attributes::Generator - | FunctionInfo::Attributes::ClassConstructor - | FunctionInfo::Attributes::BaseConstructorKind - | FunctionInfo::Attributes::ClassMethod - | FunctionInfo::Attributes::EnclosedByGlobalFunc - | FunctionInfo::Attributes::AllowDirectSuper)) == 0, - "Only the ErrorOnNew|SuperReference|Lambda|CapturesThis|Generator|ClassConstructor|BaseConstructorKind|Async|ClassMember|EnclosedByGlobalFunc|AllowDirectSuper attributes should be set on a serialized function"); + PrependConstantInt32(builder, _u("BitFlags"), bitFlags); + if (!isAnonymous) + { + const char16* displayName = function->GetDisplayName(); + uint displayNameLength = function->m_displayNameLength; + PrependString16(builder, _u("Display Name"), displayName, (displayNameLength + 1) * sizeof(char16)); + } + + PrependInt32(builder, _u("Relative Function ID"), function->GetLocalFunctionId() - topFunctionId); // Serialized function ids are relative to the top function ID + auto attributes = function->GetAttributes(); + AssertMsg((attributes & + ~(FunctionInfo::Attributes::ErrorOnNew + | FunctionInfo::Attributes::SuperReference + | FunctionInfo::Attributes::Lambda + | FunctionInfo::Attributes::Async + | FunctionInfo::Attributes::CapturesThis + | FunctionInfo::Attributes::Generator + | FunctionInfo::Attributes::ClassConstructor + | FunctionInfo::Attributes::BaseConstructorKind + | FunctionInfo::Attributes::ClassMethod + | FunctionInfo::Attributes::EnclosedByGlobalFunc + | FunctionInfo::Attributes::AllowDirectSuper)) == 0, + "Only the ErrorOnNew|SuperReference|Lambda|CapturesThis|Generator|ClassConstructor|BaseConstructorKind|Async|ClassMember|EnclosedByGlobalFunc|AllowDirectSuper attributes should be set on a serialized function"); + if (attributes != FunctionInfo::Attributes::None) + { + definedFields.has_attributes = true; + PrependInt32(builder, _u("Attributes"), attributes); + } + PrependInt32(builder, _u("Offset Into Source"), sourceDiff); if (function->GetNestedCount() > 0) { @@ -2083,21 +2109,24 @@ class ByteCodeBufferBuilder definedFields.has_##name = true; \ Prepend##serializableType(builder, _u(#name), function->##name); \ } -#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD(type, name, serializableType) \ - if (function->Get##name##() != 0) { \ + +#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK(type, name, serializableType) \ + Prepend##serializableType(builder, _u(#name), function->Get##name##()); + +#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD(type, name, serializableType, defaultValue) \ + if (function->Get##name##() != defaultValue) { \ definedFields.has_##name = true; \ - Prepend##serializableType(builder, _u(#name), function->Get##name##()); \ + DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK(type, name, serializableType); \ } - #include "SerializableFunctionFields.h" } { auto loopHeaderArray = function->GetLoopHeaderArray(); - if (loopHeaderArray) + if (loopHeaderArray != nullptr) { - PrependByte(builder, _u("Loop Header Array Exists"), 1); + definedFields.has_loopHeaderArray = true; uint loopCount = function->GetLoopCount(); for (uint i = 0; i < loopCount; ++i) { @@ -2105,33 +2134,27 @@ class ByteCodeBufferBuilder PrependInt32(builder, _u("Loop Header End"), loopHeaderArray[i].endOffset); } } - else - { - PrependByte(builder, _u("Loop Header Array Exists"), 0); - } #ifdef ASMJS_PLAT if (function->GetAsmJsFunctionInfo()) { - PrependByte(builder, _u("Asm.js Info Exists"), 1); + definedFields.has_asmJsInfo = true; + PrependByte(builder, _u("Asm.js Info Kind"), 1); AddAsmJsFunctionInfo(builder, function); } else if (function->GetIsAsmjsMode()) { - PrependByte(builder, _u("Asm.js Info Exists"), 2); + definedFields.has_asmJsInfo = true; + PrependByte(builder, _u("Asm.js Info Kind"), 2); AddAsmJsModuleInfo(builder, function); } - else #endif - { - PrependByte(builder, _u("Asm.js Info Exists"), 0); - } #ifdef ASMJS_PLAT if (function->GetIsAsmJsFunction()) { AddAsmJsConstantTable(builder, function); - auto hr = RewriteAsmJsByteCodesInto(builder, _u("Rewritten Byte Code"), function, function->byteCodeBlock); + auto hr = RewriteAsmJsByteCodesInto(builder, _u("Rewritten Asm.js Byte Code"), function, function->byteCodeBlock, definedFields); if (FAILED(hr)) { return hr; @@ -2141,14 +2164,19 @@ class ByteCodeBufferBuilder #endif { AddConstantTable(builder, function); - auto hr = RewriteByteCodesInto(builder, _u("Rewritten Byte Code"), function, function->byteCodeBlock); + auto hr = RewriteByteCodesInto(builder, _u("Rewritten Byte Code"), function, function->byteCodeBlock, definedFields); if (FAILED(hr)) { return hr; } } - AddPropertyIdOfFormals(builder, function); + PropertyIdArray * propIds = function->GetFormalsPropIdArray(false); + if (propIds != nullptr) + { + definedFields.has_propertyIdOfFormals = true; + AddPropertyIdOfFormals(builder, propIds, function); + } AddCacheIdToPropertyIdMap(builder, function); AddReferencedPropertyIdMap(builder, function); @@ -2166,8 +2194,12 @@ class ByteCodeBufferBuilder } uint debuggerScopeSlotArraySize = GetDebuggerScopeSlotArrayCount(function); - PrependInt32(builder, _u("Debugger Scope Slot Array Size"), debuggerScopeSlotArraySize); - AddSlotArrayDebuggerScopes(builder, function, debuggerScopeSlotArraySize); + if (debuggerScopeSlotArraySize != 0) + { + definedFields.has_debuggerScopeSlotArray = true; + PrependInt32(builder, _u("Debugger Scope Slot Array Size"), debuggerScopeSlotArraySize); + AddSlotArrayDebuggerScopes(builder, function, debuggerScopeSlotArraySize); + } // Literal regexes for (uint i = 0; i < function->GetLiteralRegexCount(); ++i) @@ -2265,10 +2297,10 @@ class ByteCodeBufferReader int string16Count; const unaligned StringIndexRecord * string16IndexTable; const byte * string16Table; - const byte * sourceSpans; int lineInfoCacheCount; const byte * lineInfoCaches; - const JsUtil::LineOffsetCache::LineOffsetCacheItem * lineInfoCache; + const charcount_t * lineCharacterOffsetCacheBuffer; + const charcount_t * lineByteOffsetCacheBuffer; const byte * functions; int sourceSize; int sourceCharLength; @@ -2277,10 +2309,35 @@ class ByteCodeBufferReader bool const isLibraryCode; public: ByteCodeBufferReader(ScriptContext * scriptContext, byte * raw, bool isLibraryCode, int builtInPropertyCount) - : scriptContext(scriptContext), raw(raw), utf8SourceInfo(nullptr), isLibraryCode(isLibraryCode), + : scriptContext(scriptContext), + raw(raw), + magic(0), + totalSize(0), + fileVersionScheme(0), + V1(0), + V2(0), + V3(0), + V4(0), + architecture(0), expectedFunctionBodySize(sizeof(unaligned FunctionBody)), expectedBuildInPropertyCount(builtInPropertyCount), - expectedOpCodeCount((int)OpCode::Count) + expectedOpCodeCount((int)OpCode::Count), + firstFunctionId(0), + functionCount(0), + string16s(nullptr), + string16Count(0), + string16IndexTable(nullptr), + string16Table(nullptr), + lineInfoCacheCount(0), + lineInfoCaches(nullptr), + lineCharacterOffsetCacheBuffer(nullptr), + lineByteOffsetCacheBuffer(nullptr), + functions(nullptr), + sourceSize(0), + sourceCharLength(0), + utf8SourceInfo(nullptr), + sourceIndex(0), + isLibraryCode(isLibraryCode) { if (isLibraryCode) { @@ -2323,6 +2380,19 @@ class ByteCodeBufferReader return ReadByte(buffer, remainingBytes, value); } + static const byte * ReadConstantSizedInt16(const byte * buffer, size_t remainingBytes, int16 * value) + { + Assert(remainingBytes >= sizeof(int16)); + *value = *(int16 *)buffer; + return buffer + sizeof(int16); + } + + const byte * ReadConstantSizedInt16(const byte * buffer, int16 * value) + { + auto remainingBytes = (raw + totalSize) - buffer; + return ReadConstantSizedInt16(buffer, remainingBytes, value); + } + static const byte * ReadInt16(const byte * buffer, size_t remainingBytes, int16 * value) { #if VARIABLE_INT_ENCODING @@ -2366,6 +2436,11 @@ class ByteCodeBufferReader return ReadConstantSizedInt32(buffer, remainingBytes, value); } + const byte * ReadConstantSizedUInt32(const byte * buffer, uint * value) + { + return ReadConstantSizedInt32(buffer, (int *)value); + } + static const byte * ReadInt32(const byte * buffer, size_t remainingBytes, int * value) { #if VARIABLE_INT_ENCODING @@ -2508,10 +2583,8 @@ class ByteCodeBufferReader const byte * current = buffer; uint32 countOfAuxiliaryStructure; current = ReadUInt32(current, &countOfAuxiliaryStructure); - if (countOfAuxiliaryStructure == 0) - { - return current; - } + Assert(countOfAuxiliaryStructure != 0); + uint32 sizeOfAuxiliaryBlock; uint32 sizeOfAuxiliaryContextBlock; current = ReadUInt32(current, &sizeOfAuxiliaryBlock); @@ -2739,12 +2812,21 @@ class ByteCodeBufferReader current = ReadOffsetAsPointer(current, &string16s); current = ReadOffsetAsPointer(current, &lineInfoCaches); - current = ReadOffsetAsPointer(current, &sourceSpans); current = ReadOffsetAsPointer(current, &functions); // Read strings header string16IndexTable = (StringIndexRecord*)ReadInt32(string16s, &string16Count); - lineInfoCache = (JsUtil::LineOffsetCache::LineOffsetCacheItem *)ReadInt32(lineInfoCaches, &lineInfoCacheCount); + lineCharacterOffsetCacheBuffer = (charcount_t *)ReadInt32(lineInfoCaches, &lineInfoCacheCount); + byte haslineByteOffsetCacheBuffer; + current = ReadByte(lineInfoCaches + sizeof(charcount_t) * lineInfoCacheCount, &haslineByteOffsetCacheBuffer); + if (haslineByteOffsetCacheBuffer) + { + lineByteOffsetCacheBuffer = (charcount_t *)current; + } + else + { + lineByteOffsetCacheBuffer = nullptr; + } string16Table = (byte*)(string16IndexTable + string16Count + 1); @@ -2756,14 +2838,13 @@ class ByteCodeBufferReader return S_OK; } - const byte* ReadStringConstant(const byte* current, FunctionBody* function, _Out_ LPCWSTR * string, _Out_ uint32 * len, _Out_ bool * isPropertyString) + const byte* ReadStringConstant(const byte* current, FunctionBody* function, _Out_ LPCWSTR * string, _Out_ uint32 * len) { #ifdef BYTE_CODE_MAGIC_CONSTANTS int constant; current = ReadInt32(current, &constant); Assert(constant == magicStartStringConstant); #endif - current = ReadBool(current, isPropertyString); int stringId; current = ReadInt32(current, &stringId); #ifdef BYTE_CODE_MAGIC_CONSTANTS @@ -2788,23 +2869,12 @@ class ByteCodeBufferReader LPCWSTR string; uint32 len; - bool isPropertyString = false; uint32 rawlen = 0; for (int i = 0; i < arrayLength; i++) { - current = ReadStringConstant(current, function, &string, &len, &isPropertyString); - JavascriptString* str = nullptr; - if (isPropertyString) - { - PropertyRecord const * propertyRecord; - scriptContext->GetOrAddPropertyRecord(string, len, &propertyRecord); - str = scriptContext->GetPropertyString(propertyRecord->GetPropertyId()); - } - else - { - str = JavascriptString::NewCopyBuffer(string, len, scriptContext); - } + current = ReadStringConstant(current, function, &string, &len); + JavascriptString* str = JavascriptString::NewCopyBuffer(string, len, scriptContext); callsite->SetItemWithAttributes(i, str, PropertyEnumerable); } @@ -2812,20 +2882,10 @@ class ByteCodeBufferReader for (int i = 0; i < arrayLength; i++) { - current = ReadStringConstant(current, function, &string, &len, &isPropertyString); + current = ReadStringConstant(current, function, &string, &len); rawlen += len; - JavascriptString* str = nullptr; - if (isPropertyString) - { - PropertyRecord const * propertyRecord; - scriptContext->GetOrAddPropertyRecord(string, len, &propertyRecord); - str = scriptContext->GetPropertyString(propertyRecord->GetPropertyId()); - } - else - { - str = JavascriptString::NewCopyBuffer(string, len, scriptContext); - } + JavascriptString* str = JavascriptString::NewCopyBuffer(string, len, scriptContext); rawArray->SetItemWithAttributes(i, str, PropertyEnumerable); } @@ -2930,10 +2990,18 @@ class ByteCodeBufferReader { LPCWSTR string; uint32 len; - bool isPropertyString = false; - current = ReadStringConstant(current, function, &string, &len, &isPropertyString); + current = ReadStringConstant(current, function, &string, &len); + + function->RecordStrConstant(reg, string, len, false); + break; + } + case ctPropertyString16: + { + LPCWSTR string; + uint32 len; + current = ReadStringConstant(current, function, &string, &len); - function->RecordStrConstant(reg, string, len, isPropertyString); + function->RecordStrConstant(reg, string, len, true); break; } case ctStringTemplateCallsite: @@ -2944,13 +3012,27 @@ class ByteCodeBufferReader function->RecordConstant(reg, callsite); break; } - case ctInt: + case ctInt32: { int value; current = ReadConstantSizedInt32(current, &value); function->RecordIntConstant(reg, value); break; } + case ctInt16: + { + int16 value; + current = ReadConstantSizedInt16(current, &value); + function->RecordIntConstant(reg, value); + break; + } + case ctInt8: + { + int8 value; + current = ReadByte(current, (byte *)&value); + function->RecordIntConstant(reg, value); + break; + } case ctNull: function->RecordNullObject(reg); break; @@ -3086,11 +3168,8 @@ class ByteCodeBufferReader const byte * ReadSlotArrayDebuggerScopes(const byte * current, FunctionBody * function, uint debuggerScopeCount) { Assert(function); - if (debuggerScopeCount == 0) - { - return current; - } - + Assert(debuggerScopeCount != 0); + #ifdef BYTE_CODE_MAGIC_CONSTANTS int constant; current = ReadInt32(current, &constant); @@ -3249,7 +3328,6 @@ class ByteCodeBufferReader current = ReadInt32(current, &constant); Assert(constant == magicStartOfFunctionBody); #endif - current = ReadInt32(current, &displayNameId); if (definedFields->has_m_lineNumber) { current = ReadInt32(current, &lineNumber); @@ -3268,7 +3346,16 @@ class ByteCodeBufferReader columnNumber = 0; } - current = ReadUInt32(current, &bitflags); + current = ReadConstantSizedUInt32(current, &bitflags); + + if (bitflags & ffIsAnonymous) + { + displayNameId = -1; + } + else + { + current = ReadInt32(current, &displayNameId); + } return current; } @@ -3280,45 +3367,39 @@ class ByteCodeBufferReader Assert(constant == magicStartOfPropIdsOfFormals); #endif - bool isPropertyIdArrayAvailable = false; - current = ReadBool(current, &isPropertyIdArrayAvailable); - - if (isPropertyIdArrayAvailable) - { - uint32 count = 0; - current = ReadUInt32(current, &count); + uint32 count = 0; + current = ReadUInt32(current, &count); - byte extraSlotCount = 0; - current = ReadByte(current, &extraSlotCount); + byte extraSlotCount = 0; + current = ReadByte(current, &extraSlotCount); - PropertyIdArray * propIds = function->AllocatePropertyIdArrayForFormals((extraSlotCount + count) * sizeof(PropertyId), count, extraSlotCount); - propIds->count = count; + PropertyIdArray * propIds = function->AllocatePropertyIdArrayForFormals((extraSlotCount + count) * sizeof(PropertyId), count, extraSlotCount); + propIds->count = count; - bool hadDuplicates = false; - current = ReadBool(current, &hadDuplicates); - propIds->hadDuplicates = hadDuplicates; + bool hadDuplicates = false; + current = ReadBool(current, &hadDuplicates); + propIds->hadDuplicates = hadDuplicates; - bool has__proto__ = false; - current = ReadBool(current, &has__proto__); - propIds->has__proto__ = has__proto__; + bool has__proto__ = false; + current = ReadBool(current, &has__proto__); + propIds->has__proto__ = has__proto__; - bool hasNonSimpleParams = false; - current = ReadBool(current, &hasNonSimpleParams); - propIds->hasNonSimpleParams = hasNonSimpleParams; + bool hasNonSimpleParams = false; + current = ReadBool(current, &hasNonSimpleParams); + propIds->hasNonSimpleParams = hasNonSimpleParams; - int id = 0; - for (uint i = 0; i < propIds->count; ++i) - { - current = ReadInt32(current, &id); - PropertyId propertyId = function->GetByteCodeCache()->LookupPropertyId(id); - propIds->elements[i] = propertyId; - } + int id = 0; + for (uint i = 0; i < propIds->count; ++i) + { + current = ReadInt32(current, &id); + PropertyId propertyId = function->GetByteCodeCache()->LookupPropertyId(id); + propIds->elements[i] = propertyId; + } - for (int i = 0; i < extraSlotCount; ++i) - { - current = ReadInt32(current, &id); - propIds->elements[propIds->count + i] = id; - } + for (int i = 0; i < extraSlotCount; ++i) + { + current = ReadInt32(current, &id); + propIds->elements[propIds->count + i] = id; } #ifdef BYTE_CODE_MAGIC_CONSTANTS @@ -3607,8 +3688,11 @@ class ByteCodeBufferReader int functionId; current = ReadInt32(current, &functionId); - int32 attributes; - current = ReadInt32(current, &attributes); + int32 attributes = 0; + if (definedFields->has_attributes) + { + current = ReadInt32(current, &attributes); + } uint32 offsetIntoSource = 0; current = ReadUInt32(current, &offsetIntoSource); @@ -3707,11 +3791,15 @@ class ByteCodeBufferReader if (definedFields->has_##name == true) { \ current = Read##serializableType(current, &(*functionBody)->##name); \ } -#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD(type, name, serializableType) \ + +#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK(type, name, serializableType) \ + type tmp##name=0; \ + current = Read##serializableType(current, &tmp##name); \ + (*functionBody)->Set##name##(tmp##name); + +#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD(type, name, serializableType, defaultValue) \ if (definedFields->has_##name == true) { \ - type tmp##name=0; \ - current = Read##serializableType(current, &tmp##name); \ - (*functionBody)->Set##name##(tmp##name); \ + DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK(type, name, serializableType); \ } #include "SerializableFunctionFields.h" @@ -3729,11 +3817,6 @@ class ByteCodeBufferReader (*functionBody)->flags = (FunctionBody::FunctionBodyFlags)((*functionBody)->flags & ~FunctionBody::Flags_StackNestedFunc); } - if (definedFields->has_FirstTmpRegister == false) - { - (*functionBody)->SetFirstTmpRegister(0); - } - if (definedFields->has_m_envDepth == false) { (*functionBody)->m_envDepth = 0; @@ -3755,10 +3838,8 @@ class ByteCodeBufferReader (*functionBody)->m_isAsmJsFunction = (bitflags & ffIsAsmJsFunction) ? true : false; (*functionBody)->m_isAsmjsMode = (bitflags & ffIsAsmJsMode) ? true : false; #endif - - byte loopHeaderExists; - current = ReadByte(current, &loopHeaderExists); - if (loopHeaderExists) + + if (definedFields->has_loopHeaderArray) { (*functionBody)->AllocateLoopHeaders(); auto loopHeaderArray = (*functionBody)->GetLoopHeaderArray(); @@ -3773,22 +3854,25 @@ class ByteCodeBufferReader } } - byte asmJsInfoExists; - current = ReadByte(current, &asmJsInfoExists); #ifdef ASMJS_PLAT - if (asmJsInfoExists == 1) + if (definedFields->has_asmJsInfo) { - current = ReadAsmJsFunctionInfo(current, *functionBody); - } - else if (asmJsInfoExists == 2) - { - current = ReadAsmJsModuleInfo(current, *functionBody); + byte asmJsInfoKind; + current = ReadByte(current, &asmJsInfoKind); + if (asmJsInfoKind == 1) + { + current = ReadAsmJsFunctionInfo(current, *functionBody); + } + else if (asmJsInfoKind == 2) + { + current = ReadAsmJsModuleInfo(current, *functionBody); + } + else + { + Assert(false); + } } - else #endif - { - Assert(asmJsInfoExists == 0); - } // Read constants table #ifdef ASMJS_PLAT @@ -3817,9 +3901,15 @@ class ByteCodeBufferReader }); // Auxiliary - current = ReadAuxiliary(current, *functionBody); + if (definedFields->has_auxiliary) + { + current = ReadAuxiliary(current, *functionBody); + } - current = ReadPropertyIdOfFormals(current, *functionBody); + if (definedFields->has_propertyIdOfFormals) + { + current = ReadPropertyIdOfFormals(current, *functionBody); + } // Inline cache current = ReadCacheIdToPropertyIdMap(current, *functionBody); @@ -3833,9 +3923,12 @@ class ByteCodeBufferReader current = ReadSlotIdInCachedScopeToNestedIndexArray(current, *functionBody); } - uint debuggerScopeCount = 0; - current = ReadUInt32(current, &debuggerScopeCount); - current = ReadSlotArrayDebuggerScopes(current, *functionBody, debuggerScopeCount); + if (definedFields->has_debuggerScopeSlotArray) + { + uint debuggerScopeCount = 0; + current = ReadUInt32(current, &debuggerScopeCount); + current = ReadSlotArrayDebuggerScopes(current, *functionBody, debuggerScopeCount); + } (*functionBody)->AllocateObjectLiteralTypeArray(); @@ -3866,7 +3959,7 @@ class ByteCodeBufferReader // Read source information current = ReadSmallSpanSequence(current, &(*functionBody)->m_sourceInfo.pSpanSequence); - (*functionBody)->InitializeExecutionModeAndLimits(); + (*functionBody)->executionState.InitializeExecutionModeAndLimits(*functionBody); } // Read lexically nested functions @@ -4064,13 +4157,27 @@ class ByteCodeBufferReader current = ReadByte(current, &code); switch(code) { - case ctInt: + case ctInt32: { int value; current = ReadConstantSizedInt32(current, &value); result->elements[index] = Js::TaggedInt::ToVarUnchecked(value); break; } + case ctInt16: + { + int16 value; + current = ReadConstantSizedInt16(current, &value); + result->elements[index] = Js::TaggedInt::ToVarUnchecked(value); + break; + } + case ctInt8: + { + int8 value; + current = ReadByte(current, (byte *)&value); + result->elements[index] = Js::TaggedInt::ToVarUnchecked(value); + break; + } case ctNumber: { double value; @@ -4221,7 +4328,7 @@ HRESULT ByteCodeSerializer::SerializeToBuffer(ScriptContext * scriptContext, Are #if INSTRUMENT_BUFFER_INTS for (int i = 0; i < 4; i++) { - printf("[BCGENSTATS] %d, %d\n", i, Counts[i]); + Output::Print(_u("[BCGENSTATS] %d, %d\n"), i, Counts[i]); } #endif return hr; @@ -4244,8 +4351,10 @@ HRESULT ByteCodeSerializer::DeserializeFromBufferInternal(ScriptContext * script auto alloc = scriptContext->SourceCodeAllocator(); bool isLibraryCode = ((scriptFlags & fscrIsLibraryCode) == fscrIsLibraryCode); - int builtInPropertyCount = isLibraryCode ? PropertyIds::_countJSOnlyProperty : TotalNumberOfBuiltInProperties; - auto reader = Anew(alloc, ByteCodeBufferReader, scriptContext, buffer, isLibraryCode, builtInPropertyCount); + bool isJsBuiltInCode = ((scriptFlags & fscrJsBuiltIn) == fscrJsBuiltIn); + bool isLibraryOrJsBuiltInCode = isLibraryCode || isJsBuiltInCode; + int builtInPropertyCount = isLibraryOrJsBuiltInCode ? PropertyIds::_countJSOnlyProperty : TotalNumberOfBuiltInProperties; + auto reader = Anew(alloc, ByteCodeBufferReader, scriptContext, buffer, isLibraryOrJsBuiltInCode, builtInPropertyCount); auto hr = reader->ReadHeader(); if (FAILED(hr)) { @@ -4264,12 +4373,12 @@ HRESULT ByteCodeSerializer::DeserializeFromBufferInternal(ScriptContext * script } sourceInfo = Js::Utf8SourceInfo::NewWithHolder(scriptContext, sourceHolder, - reader->sourceCharLength, pinnedSrcInfo, isLibraryCode); + reader->sourceCharLength, pinnedSrcInfo, isLibraryOrJsBuiltInCode); reader->utf8SourceInfo = sourceInfo; reader->sourceIndex = scriptContext->SaveSourceNoCopy(sourceInfo, reader->sourceCharLength, false); - sourceInfo->CreateLineOffsetCache(reader->lineInfoCache, reader->lineInfoCacheCount); + sourceInfo->CreateLineOffsetCache(reader->lineCharacterOffsetCacheBuffer, reader->lineByteOffsetCacheBuffer, reader->lineInfoCacheCount); } else { diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.cpp index d4a7d5432ec..b285a4b1037 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.cpp @@ -365,27 +365,6 @@ namespace Js MULTISIZE_LAYOUT_WRITE(Reg1, op, R0); } - template - bool ByteCodeWriter::TryWriteReg2WithICIndex(OpCode op, RegSlot R0, RegSlot R1, uint32 inlineCacheIndex, bool isRootLoad) - { - OpLayoutT_Reg2WithICIndex layout; - if (SizePolicy::Assign(layout.R0, R0) && SizePolicy::Assign(layout.R1, R1) && SizePolicy::Assign(layout.inlineCacheIndex, inlineCacheIndex)) - { - uint offset = m_byteCodeData.EncodeT(op, &layout, sizeof(layout), this); - - if (isRootLoad) - { - Assert(m_byteCodeData.GetCurrentOffset() == offset + OpCodeUtil::EncodedSize(op, SizePolicy::LayoutEnum) + sizeof(OpLayoutT_Reg2WithICIndex)); - uint inlineCacheOffset = offset + OpCodeUtil::EncodedSize(op, SizePolicy::LayoutEnum) - + offsetof(OpLayoutT_Reg2WithICIndex, inlineCacheIndex); - - rootObjectLoadMethodInlineCacheOffsets.Prepend(m_labelOffsets->GetAllocator(), inlineCacheOffset); - } - return true; - } - return false; - } - template bool ByteCodeWriter::TryWriteReg2(OpCode op, RegSlot R0, RegSlot R1) { @@ -417,13 +396,9 @@ namespace Js R0 = ConsumeReg(R0); R1 = ConsumeReg(R1); - CacheIdUnit unit; - unit.cacheId = Js::Constants::NoInlineCacheIndex; - callRegToLdFldCacheIndexMap->TryGetValueAndRemove(R1, &unit); bool isProfiled = false; bool isProfiled2 = false; - bool isReg2WithICIndex = false; Js::ProfileId profileId = Js::Constants::NoProfileId; Js::ProfileId profileId2 = Js::Constants::NoProfileId; @@ -449,14 +424,7 @@ namespace Js isProfiled = true; } - if (isReg2WithICIndex) - { - MULTISIZE_LAYOUT_WRITE(Reg2WithICIndex, op, R0, R1, unit.cacheId, unit.isRootObjectCache); - } - else - { - MULTISIZE_LAYOUT_WRITE(Reg2, op, R0, R1); - } + MULTISIZE_LAYOUT_WRITE(Reg2, op, R0, R1); if (isProfiled) { @@ -666,8 +634,8 @@ namespace Js Reg1(OpCode::ArgIn0, reg); } - template void ByteCodeWriter::ArgOut(ArgSlot arg, RegSlot reg, ProfileId callSiteId); - template void ByteCodeWriter::ArgOut(ArgSlot arg, RegSlot reg, ProfileId callSiteId); + template void ByteCodeWriter::ArgOut(ArgSlot arg, RegSlot reg, ProfileId callSiteId, bool emitProfiledArgout); + template void ByteCodeWriter::ArgOut(ArgSlot arg, RegSlot reg, ProfileId callSiteId, bool emitProfiledArgout); template bool ByteCodeWriter::TryWriteArg(OpCode op, ArgSlot arg, RegSlot reg) @@ -682,7 +650,7 @@ namespace Js } template - void ByteCodeWriter::ArgOut(ArgSlot arg, RegSlot reg, ProfileId callSiteId) + void ByteCodeWriter::ArgOut(ArgSlot arg, RegSlot reg, ProfileId callSiteId, bool emitProfiledArgout) { CheckOpen(); Assert(OpCodeAttr::HasMultiSizeLayout(OpCode::ArgOut_A) && OpCodeAttr::HasMultiSizeLayout(OpCode::ArgOut_ANonVar)); @@ -702,7 +670,8 @@ namespace Js return; } - if (DoDynamicProfileOpcode(InlinePhase) + if (emitProfiledArgout + && DoDynamicProfileOpcode(InlinePhase) && arg > 0 && arg < Js::Constants::MaximumArgumentCountForConstantArgumentInlining && (reg > FunctionBody::FirstRegSlot && reg < m_functionWrite->GetConstantCount()) && callSiteId != Js::Constants::NoProfileId @@ -926,8 +895,7 @@ namespace Js // Otherwise, only in loops if the function has loop #pragma prefast(suppress:6236, "DevDiv bug 830883. False positive when PHASE_OFF is #defined as '(false)'.") return PHASE_FORCE(Phase::InlinePhase, this->m_functionWrite) || - (!this->m_functionWrite->GetDontInline() && - (noHeuristics || !this->m_hasLoop || (this->m_loopNest != 0) || + ((noHeuristics || !this->m_hasLoop || (this->m_loopNest != 0) || !(PHASE_OFF(InlineOutsideLoopsPhase, this->m_functionWrite)))); default: @@ -1257,14 +1225,13 @@ namespace Js if (unit.cacheId == Js::Constants::NoInlineCacheIndex) { op = Js::OpCodeUtil::ConvertCallOpToProfiled(op); - isProfiled = true; } else { isCallWithICIndex = true; op = Js::OpCodeUtil::ConvertCallOpToProfiled(op, true); - isProfiled = true; } + isProfiled = true; } else if ((DoDynamicProfileOpcode(AggressiveIntTypeSpecPhase) || DoDynamicProfileOpcode(FloatTypeSpecPhase)) && this->m_functionWrite->AllocProfiledReturnTypeId(&profileId)) @@ -1289,14 +1256,13 @@ namespace Js if (unit.cacheId == Js::Constants::NoInlineCacheIndex) { OpCodeUtil::ConvertNonCallOpToProfiled(op); - isProfiled = true; } else { isCallWithICIndex = true; OpCodeUtil::ConvertNonCallOpToProfiledWithICIndex(op); - isProfiled = true; } + isProfiled = true; } if (isCallWithICIndex) @@ -1537,7 +1503,7 @@ namespace Js } template - bool ByteCodeWriter::TryWriteElementSlot(OpCode op, RegSlot value, RegSlot instance, int32 slotId) + bool ByteCodeWriter::TryWriteElementSlot(OpCode op, RegSlot value, RegSlot instance, uint32 slotId) { OpLayoutT_ElementSlot layout; if (SizePolicy::Assign(layout.Value, value) && SizePolicy::Assign(layout.Instance, instance) @@ -1549,7 +1515,7 @@ namespace Js return false; } - void ByteCodeWriter::Slot(OpCode op, RegSlot value, RegSlot instance, int32 slotId) + void ByteCodeWriter::Slot(OpCode op, RegSlot value, RegSlot instance, uint32 slotId) { CheckOpen(); CheckOp(op, OpLayoutType::ElementSlot); @@ -1579,7 +1545,7 @@ namespace Js MULTISIZE_LAYOUT_WRITE(ElementSlot, op, value, instance, slotId); } - void ByteCodeWriter::Slot(OpCode op, RegSlot value, RegSlot instance, int32 slotId, ProfileId profileId) + void ByteCodeWriter::Slot(OpCode op, RegSlot value, RegSlot instance, uint32 slotId, ProfileId profileId) { CheckOpen(); CheckOp(op, OpLayoutType::ElementSlot); @@ -1612,7 +1578,7 @@ namespace Js } template - bool ByteCodeWriter::TryWriteElementSlotI1(OpCode op, RegSlot value, int32 slotId) + bool ByteCodeWriter::TryWriteElementSlotI1(OpCode op, RegSlot value, uint32 slotId) { OpLayoutT_ElementSlotI1 layout; if (SizePolicy::Assign(layout.Value, value) @@ -1624,7 +1590,7 @@ namespace Js return false; } - void ByteCodeWriter::SlotI1(OpCode op, RegSlot value, int32 slotId) + void ByteCodeWriter::SlotI1(OpCode op, RegSlot value, uint32 slotId) { CheckOpen(); CheckOp(op, OpLayoutType::ElementSlotI1); @@ -1659,7 +1625,7 @@ namespace Js MULTISIZE_LAYOUT_WRITE(ElementSlotI1, op, value, slotId); } - void ByteCodeWriter::SlotI1(OpCode op, RegSlot value, int32 slotId, ProfileId profileId) + void ByteCodeWriter::SlotI1(OpCode op, RegSlot value, uint32 slotId, ProfileId profileId) { CheckOpen(); CheckOp(op, OpLayoutType::ElementSlotI1); @@ -1694,7 +1660,7 @@ namespace Js } template - bool ByteCodeWriter::TryWriteElementSlotI2(OpCode op, RegSlot value, int32 slotId1, int32 slotId2) + bool ByteCodeWriter::TryWriteElementSlotI2(OpCode op, RegSlot value, uint32 slotId1, uint32 slotId2) { OpLayoutT_ElementSlotI2 layout; if (SizePolicy::Assign(layout.Value, value) @@ -1707,7 +1673,7 @@ namespace Js return false; } - void ByteCodeWriter::SlotI2(OpCode op, RegSlot value, int32 slotId1, int32 slotId2) + void ByteCodeWriter::SlotI2(OpCode op, RegSlot value, uint32 slotId1, uint32 slotId2) { CheckOpen(); CheckOp(op, OpLayoutType::ElementSlotI2); @@ -1743,7 +1709,7 @@ namespace Js MULTISIZE_LAYOUT_WRITE(ElementSlotI2, op, value, slotId1, slotId2); } - void ByteCodeWriter::SlotI2(OpCode op, RegSlot value, int32 slotId1, int32 slotId2, ProfileId profileId) + void ByteCodeWriter::SlotI2(OpCode op, RegSlot value, uint32 slotId1, uint32 slotId2, ProfileId profileId) { CheckOpen(); CheckOp(op, OpLayoutType::ElementSlotI2); @@ -2314,21 +2280,6 @@ namespace Js m_byteCodeData.Encode(op, &data, sizeof(data), this); } - void ByteCodeWriter::Reg1Int2(OpCode op, RegSlot R0, int C1, int C2) - { - CheckOpen(); - CheckOp(op, OpLayoutType::Reg1Int2); - Assert(!OpCodeAttr::HasMultiSizeLayout(op)); - - R0 = ConsumeReg(R0); - - OpLayoutReg1Int2 data; - data.R0 = R0; - data.C1 = C1; - data.C2 = C2; - m_byteCodeData.Encode(op, &data, sizeof(data), this); - } - template bool ByteCodeWriter::TryWriteReg2Int1(OpCode op, RegSlot R0, RegSlot R1, int C1) { @@ -2564,7 +2515,7 @@ namespace Js ByteCodeLabel ByteCodeWriter::DefineLabel() { -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) if (m_labelOffsets->Count() == INT_MAX) { // Reach our limit @@ -3290,7 +3241,7 @@ namespace Js } template - inline uint ByteCodeWriter::Data::EncodeT(OpCode op, ByteCodeWriter* writer) + uint ByteCodeWriter::Data::EncodeT(OpCode op, ByteCodeWriter* writer) { #ifdef BYTECODE_BRANCH_ISLAND if (writer->useBranchIsland) @@ -3315,7 +3266,7 @@ namespace Js } template - inline uint ByteCodeWriter::Data::EncodeT(OpCode op, const void* rawData, int byteSize, ByteCodeWriter* writer) + uint ByteCodeWriter::Data::EncodeT(OpCode op, const void* rawData, int byteSize, ByteCodeWriter* writer) { AssertMsg((rawData != nullptr) && (byteSize < 100), "Ensure valid data for opcode"); @@ -3324,7 +3275,7 @@ namespace Js return offset; } - inline void ByteCodeWriter::Data::Encode(const void* rawData, int byteSize) + void ByteCodeWriter::Data::Encode(const void* rawData, int byteSize) { AssertMsg(rawData != nullptr, "Ensure valid data for opcode"); Write(rawData, byteSize); diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.h b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.h index 7191ce3b9c8..950933462aa 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ByteCodeWriter.h @@ -251,7 +251,7 @@ namespace Js void Reg5(OpCode op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4); void ArgIn0(RegSlot arg); template - void ArgOut(ArgSlot arg, RegSlot reg, ProfileId callSiteId); + void ArgOut(ArgSlot arg, RegSlot reg, ProfileId callSiteId, bool emitProfiledArgout); void ArgOutEnv(ArgSlot arg); #ifdef BYTECODE_BRANCH_ISLAND void BrLong(OpCode op, ByteCodeLabel labelID); @@ -273,12 +273,12 @@ namespace Js void ElementUnsigned1(OpCode op, RegSlot value, RegSlot instance, uint32 element); void Property(OpCode op, RegSlot Value, RegSlot Instance, PropertyIdIndexType propertyIdIndex); void ScopedProperty(OpCode op, RegSlot Value, PropertyIdIndexType propertyIdIndex); - void Slot(OpCode op, RegSlot value, RegSlot instance, int32 slotId); - void Slot(OpCode op, RegSlot value, RegSlot instance, int32 slotId, ProfileId profileId); - void SlotI1(OpCode op, RegSlot value, int32 slotId1); - void SlotI1(OpCode op, RegSlot value, int32 slotId1, ProfileId profileId); - void SlotI2(OpCode op, RegSlot value, int32 slotId1, int32 slotId2); - void SlotI2(OpCode op, RegSlot value, int32 slotId1, int32 slotId2, ProfileId profileId); + void Slot(OpCode op, RegSlot value, RegSlot instance, uint32 slotId); + void Slot(OpCode op, RegSlot value, RegSlot instance, uint32 slotId, ProfileId profileId); + void SlotI1(OpCode op, RegSlot value, uint32 slotId1); + void SlotI1(OpCode op, RegSlot value, uint32 slotId1, ProfileId profileId); + void SlotI2(OpCode op, RegSlot value, uint32 slotId1, uint32 slotId2); + void SlotI2(OpCode op, RegSlot value, uint32 slotId1, uint32 slotId2, ProfileId profileId); void ElementU(OpCode op, RegSlot instance, PropertyIdIndexType propertyIdIndex); void ElementScopedU(OpCode op, PropertyIdIndexType propertyIdIndex); void ElementRootU(OpCode op, PropertyIdIndexType propertyIdIndex); @@ -289,14 +289,12 @@ namespace Js void PatchablePropertyWithThisPtr(OpCode op, RegSlot value, RegSlot instance, RegSlot thisInstance, uint cacheId, bool isCtor = false, bool registerCacheIdForCall = true); void ScopedProperty2(OpCode op, RegSlot Value, PropertyIdIndexType propertyIdIndex, RegSlot R2); void W1(OpCode op, unsigned short C1); - void Reg1Int2(OpCode op, RegSlot R0, int C1, int C2); void Reg2Int1(OpCode op, RegSlot R0, RegSlot R1, int C1); void Unsigned1(OpCode op, uint C1); void Num3(OpCode op, RegSlot C0, RegSlot C1, RegSlot C2); template bool TryWriteReg1(OpCode op, RegSlot R0); template bool TryWriteReg2(OpCode op, RegSlot R0, RegSlot R1); - template bool TryWriteReg2WithICIndex(OpCode op, RegSlot R0, RegSlot R1, uint32 inlineCacheIndex, bool isRootLoad); template bool TryWriteReg3(OpCode op, RegSlot R0, RegSlot R1, RegSlot R2); template bool TryWriteReg3C(OpCode op, RegSlot R0, RegSlot R1, RegSlot R2, CacheId cacheId); template bool TryWriteReg4(OpCode op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3); @@ -321,9 +319,9 @@ namespace Js template bool TryWriteElementUnsigned1(OpCode op, RegSlot Value, RegSlot Instance, uint32 Element); template bool TryWriteElementC(OpCode op, RegSlot value, RegSlot instance, PropertyIdIndexType propertyIdIndex); template bool TryWriteElementScopedC(OpCode op, RegSlot value, PropertyIdIndexType propertyIdIndex); - template bool TryWriteElementSlot(OpCode op, RegSlot value, RegSlot instance, int32 slotId); - template bool TryWriteElementSlotI1(OpCode op, RegSlot value, int32 slotId); - template bool TryWriteElementSlotI2(OpCode op, RegSlot value, int32 slotId1, int32 slotId2); + template bool TryWriteElementSlot(OpCode op, RegSlot value, RegSlot instance, uint32 slotId); + template bool TryWriteElementSlotI1(OpCode op, RegSlot value, uint32 slotId); + template bool TryWriteElementSlotI2(OpCode op, RegSlot value, uint32 slotId1, uint32 slotId2); template bool TryWriteElementU(OpCode op, RegSlot instance, PropertyIdIndexType index); template bool TryWriteElementScopedU(OpCode op, PropertyIdIndexType index); template bool TryWriteElementRootU(OpCode op, PropertyIdIndexType index); diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/FuncInfo.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/FuncInfo.cpp index afd38a720eb..fa4df126c2c 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/FuncInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/FuncInfo.cpp @@ -12,25 +12,36 @@ FuncInfo::FuncInfo( Scope *bodyScope, ParseNode *pnode, Js::ParseableFunctionInfo* byteCodeFunction) - : alloc(alloc), + : + inlineCacheCount(0), + rootObjectLoadInlineCacheCount(0), + rootObjectLoadMethodInlineCacheCount(0), + rootObjectStoreInlineCacheCount(0), + isInstInlineCacheCount(0), + referencedPropertyIdCount(0), + currentChildFunction(nullptr), + currentChildScope(nullptr), + capturedSyms(nullptr), + capturedSymMap(nullptr), + nextForInLoopLevel(0), + maxForInLoopLevel(0), + alloc(alloc), varRegsCount(0), constRegsCount(InitialConstRegsCount), inArgsCount(0), - innerScopeCount(0), - currentInnerScopeIndex((uint)-1), - firstTmpReg(Js::Constants::NoRegister), - curTmpReg(Js::Constants::NoRegister), outArgsMaxDepth(0), outArgsCurrentExpr(0), + innerScopeCount(0), + currentInnerScopeIndex((uint)-1), #if DBG outArgsDepth(0), #endif name(name), - thisConstantRegister(Js::Constants::NoRegister), nullConstantRegister(Js::Constants::NoRegister), undefinedConstantRegister(Js::Constants::NoRegister), trueConstantRegister(Js::Constants::NoRegister), falseConstantRegister(Js::Constants::NoRegister), + thisConstantRegister(Js::Constants::NoRegister), envRegister(Js::Constants::NoRegister), frameObjRegister(Js::Constants::NoRegister), frameSlotsRegister(Js::Constants::NoRegister), @@ -39,14 +50,11 @@ FuncInfo::FuncInfo( funcObjRegister(Js::Constants::NoRegister), localClosureReg(Js::Constants::NoRegister), yieldRegister(Js::Constants::NoRegister), - paramScope(paramScope), - bodyScope(bodyScope), - funcExprScope(nullptr), - root(pnode), - capturedSyms(nullptr), - capturedSymMap(nullptr), - currentChildFunction(nullptr), - currentChildScope(nullptr), + firstTmpReg(Js::Constants::NoRegister), + curTmpReg(Js::Constants::NoRegister), + argsPlaceHolderSlotCount(0), + originalAttributes(Js::FunctionInfo::Attributes::None), + callsEval(false), childCallsEval(false), hasArguments(false), @@ -65,32 +73,34 @@ FuncInfo::FuncInfo( #if DBG isReused(false), #endif - staticFuncId(-1), + + constantToRegister(alloc, 17), + stringToRegister(alloc, 17), + doubleConstantToRegister(alloc, 17), + stringTemplateCallsiteRegisterMap(alloc, 17), + + paramScope(paramScope), + bodyScope(bodyScope), + funcExprScope(nullptr), + root(pnode), + byteCodeFunction(byteCodeFunction), + targetStatements(alloc), + singleExit(0), + rootObjectLoadInlineCacheMap(nullptr), + rootObjectLoadMethodInlineCacheMap(nullptr), + rootObjectStoreInlineCacheMap(nullptr), inlineCacheMap(nullptr), + referencedPropertyIdToMapIndex(nullptr), + valueOfStoreCacheIds(), + toStringStoreCacheIds(), slotProfileIdMap(alloc), - argsPlaceHolderSlotCount(0), - inlineCacheCount(0), - rootObjectLoadInlineCacheCount(0), - rootObjectLoadMethodInlineCacheCount(0), - rootObjectStoreInlineCacheCount(0), - isInstInlineCacheCount(0), - referencedPropertyIdCount(0), argumentsSymbol(nullptr), thisSymbol(nullptr), newTargetSymbol(nullptr), superSymbol(nullptr), superConstructorSymbol(nullptr), - nonUserNonTempRegistersToInitialize(alloc), - constantToRegister(alloc, 17), - stringToRegister(alloc, 17), - doubleConstantToRegister(alloc, 17), - stringTemplateCallsiteRegisterMap(alloc, 17), - targetStatements(alloc), - nextForInLoopLevel(0), - maxForInLoopLevel(0), - originalAttributes(Js::FunctionInfo::Attributes::None) + nonUserNonTempRegistersToInitialize(alloc) { - this->byteCodeFunction = byteCodeFunction; if (bodyScope != nullptr) { bodyScope->SetFunc(this); diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/FuncInfo.h b/deps/chakrashim/core/lib/Runtime/ByteCode/FuncInfo.h index 253bf874a26..f43deb9734d 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/FuncInfo.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/FuncInfo.h @@ -117,9 +117,6 @@ class FuncInfo Js::RegSlot firstTmpReg; Js::RegSlot curTmpReg; int argsPlaceHolderSlotCount; // count of place holder slots for same name args and destructuring patterns - Js::RegSlot firstThunkArgReg; - short thunkArgCount; - short staticFuncId; Js::FunctionInfo::Attributes originalAttributes; uint callsEval : 1; diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/IWasmByteCodeWriter.h b/deps/chakrashim/core/lib/Runtime/ByteCode/IWasmByteCodeWriter.h index 57d4669e135..d18eeabc05a 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/IWasmByteCodeWriter.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/IWasmByteCodeWriter.h @@ -30,16 +30,27 @@ namespace Js virtual void AsmReg1(OpCodeAsmJs op, RegSlot R0) = 0; virtual void AsmReg2(OpCodeAsmJs op, RegSlot R0, RegSlot R1) = 0; virtual void AsmReg3(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2) = 0; - virtual void AsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId) = 0; + virtual void AsmReg4(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3) = 0; + virtual void AsmReg5(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4) = 0; + virtual void AsmReg9(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8) = 0; + virtual void AsmReg17(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, + RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16) = 0; + virtual void AsmShuffle(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, uint8 indices[]) = 0; + virtual void AsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType, uint32 offset = 0) = 0; + virtual void WasmSimdConst(OpCodeAsmJs op, RegSlot R0, int C0, int C1, int C2, int C3) = 0; + + virtual void AsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, uint32 slotId) = 0; virtual void AsmBr(ByteCodeLabel labelID, OpCodeAsmJs op = OpCodeAsmJs::AsmBr) = 0; virtual void AsmBrReg1(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1) = 0; virtual void AsmBrReg1Const1(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, int C1) = 0; virtual void WasmMemAccess(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint32 offset, ArrayBufferView::ViewType viewType) = 0; - virtual uint EnterLoop(ByteCodeLabel loopEntrance) = 0; + virtual uint32 WasmLoopStart(ByteCodeLabel loopEntrance, __in_ecount(WAsmJs::LIMIT) RegSlot* curRegs) = 0; virtual void ExitLoop(uint loopId) = 0; virtual void AsmStartCall(OpCodeAsmJs op, ArgSlot ArgCount, bool isPatching = false) = 0; - virtual void AsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType) = 0; + virtual void AsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType, Js::ProfileId profileId) = 0; + + virtual void SetCallSiteCount(Js::ProfileId callSiteCount) = 0; }; } #endif diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/LayoutTypes.h b/deps/chakrashim/core/lib/Runtime/ByteCode/LayoutTypes.h index e2498f0fe31..c14b3f400d3 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/LayoutTypes.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/LayoutTypes.h @@ -45,7 +45,6 @@ LAYOUT_TYPE (Empty) LAYOUT_TYPE_WMS (Reg1) LAYOUT_TYPE_PROFILED_WMS (Reg2) -LAYOUT_TYPE_PROFILED_WMS (Reg2WithICIndex) LAYOUT_TYPE_PROFILED_WMS (Reg3) LAYOUT_TYPE_WMS (Reg4) LAYOUT_TYPE_PROFILED_WMS (Reg1Unsigned1) @@ -92,7 +91,6 @@ LAYOUT_TYPE_WMS (ElementU) LAYOUT_TYPE_WMS (ElementScopedU) LAYOUT_TYPE_WMS (ElementRootU) LAYOUT_TYPE (W1) -LAYOUT_TYPE (Reg1Int2) LAYOUT_TYPE_WMS (Reg2Int1) LAYOUT_TYPE (AuxNoReg) LAYOUT_TYPE_PROFILED (Auxiliary) diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/LayoutTypesAsmJs.h b/deps/chakrashim/core/lib/Runtime/ByteCode/LayoutTypesAsmJs.h index df5e5a885d4..89f0edf46a0 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/LayoutTypesAsmJs.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/LayoutTypesAsmJs.h @@ -19,6 +19,18 @@ LAYOUT_TYPE(layout##_Large) #endif +#ifndef LAYOUT_TYPE_PROFILED +#define LAYOUT_TYPE_PROFILED(layout) \ + LAYOUT_TYPE(layout) \ + LAYOUT_TYPE(Profiled##layout) +#endif + +#ifndef LAYOUT_TYPE_PROFILED_WMS +#define LAYOUT_TYPE_PROFILED_WMS(layout) \ + LAYOUT_TYPE_WMS(layout) \ + LAYOUT_TYPE_WMS(Profiled##layout) +#endif + #ifndef LAYOUT_TYPE_WMS_REG2 #define LAYOUT_TYPE_WMS_REG2(layout, t0, t1) LAYOUT_TYPE_WMS(layout) #endif @@ -101,7 +113,8 @@ #define LAYOUT_PREFIX_Float32x4() F4_ #define LAYOUT_PREFIX_Bool32x4() B4_ #define LAYOUT_PREFIX_Int32x4() I4_ -#define LAYOUT_PREFIX_Float64x2() F2_ +#define LAYOUT_PREFIX_Float64x2() D2_ +#define LAYOUT_PREFIX_Int64x2() I2_ #define LAYOUT_PREFIX_Int16x8() I8_ #define LAYOUT_PREFIX_Bool16x8() B8_ #define LAYOUT_PREFIX_Int8x16() I16_ @@ -119,7 +132,7 @@ LAYOUT_TYPE_DUP ( Empty ) LAYOUT_TYPE_WMS ( AsmTypedArr ) LAYOUT_TYPE_WMS ( WasmMemAccess ) -LAYOUT_TYPE_WMS ( AsmCall ) +LAYOUT_TYPE_PROFILED_WMS( AsmCall ) LAYOUT_TYPE ( AsmBr ) LAYOUT_TYPE_WMS ( AsmReg1 ) // Generic layout with 1 RegSlot LAYOUT_TYPE_WMS_FE ( AsmReg2 ) // Generic layout with 2 RegSlot @@ -162,6 +175,7 @@ LAYOUT_TYPE_WMS ( BrInt1 ) // Conditional branching with 1 int LAYOUT_TYPE_WMS ( BrInt2 ) // Conditional branching with 2 int LAYOUT_TYPE_WMS ( BrInt1Const1 ) // Conditional branching with 1 int and 1 const LAYOUT_TYPE_WMS ( AsmUnsigned1 ) // 1 unsigned int register +LAYOUT_TYPE_WMS ( WasmLoopStart ) // Int64 LAYOUT_TYPE_WMS_REG2 ( Long1Reg1 , Long, Reg) @@ -201,6 +215,7 @@ LAYOUT_TYPE_WMS_REG4 ( Float32x4_2Int1Float1 , Float32x4, Float32x4, // Int32x4_2 LAYOUT_TYPE_WMS_REG2 ( Int32x4_2 , Int32x4, Int32x4) LAYOUT_TYPE_WMS_REG3 ( Int32x4_3 , Int32x4, Int32x4, Int32x4) +LAYOUT_TYPE_WMS_REG4 ( Int32x4_4 , Int32x4, Int32x4, Int32x4, Int32x4) LAYOUT_TYPE_WMS_REG3 ( Bool32x4_1Int32x4_2 , Bool32x4, Int32x4, Int32x4) LAYOUT_TYPE_WMS_REG4 ( Int32x4_1Bool32x4_1Int32x4_2 , Int32x4, Bool32x4, Int32x4, Int32x4) LAYOUT_TYPE_WMS_REG5 ( Int32x4_1Int4 , Int32x4, Int, Int, Int, Int) @@ -218,14 +233,18 @@ LAYOUT_TYPE_WMS_REG2 ( Int32x4_1Int8x16_1 , Int32x4, Int8x16) LAYOUT_TYPE_WMS_REG2 ( Int32x4_1Uint8x16_1 , Int32x4, Uint8x16) LAYOUT_TYPE_WMS_REG3 ( Int1Int32x4_1Int1 , Int, Int32x4, Int) LAYOUT_TYPE_WMS_REG4 ( Int32x4_2Int2 , Int32x4, Int32x4, Int, Int) +LAYOUT_TYPE_WMS_REG5 ( Float32x4_IntConst4 , Float32x4, IntConst, IntConst, IntConst, IntConst) + // Float64x2 +LAYOUT_TYPE_WMS_REG3 (Double1Float64x2_1Int1 , Double, Float64x2, Int) +LAYOUT_TYPE_WMS_REG4 (Float64x2_2Int1Double1 , Float64x2, Float64x2, Int, Double) +LAYOUT_TYPE_WMS_REG2 (Float64x2_2 , Float64x2, Float64x2) +LAYOUT_TYPE_WMS_REG3 (Float64x2_3 , Float64x2, Float64x2, Float64x2) +LAYOUT_TYPE_WMS_REG2 (Float64x2_1Double1 , Float64x2, Double) // Disabled for now #if 0 -LAYOUT_TYPE_WMS_REG2 ( Float64x2_2 , Float64x2, Float64x2) -LAYOUT_TYPE_WMS_REG3 ( Float64x2_3 , Float64x2, Float64x2, Float64x2) LAYOUT_TYPE_WMS_REG4 ( Float64x2_4 , Float64x2, Float64x2, Float64x2, Float64x2) LAYOUT_TYPE_WMS_REG3 ( Float64x2_1Double2 , Float64x2, Double, Double) -LAYOUT_TYPE_WMS_REG2 ( Float64x2_1Double1 , Float64x2, Double) LAYOUT_TYPE_WMS_REG3 ( Float64x2_2Double1 , Float64x2, Float64x2, Double) LAYOUT_TYPE_WMS_REG4 ( Float64x2_2Int2 , Float64x2, Float64x2, Int, Int) LAYOUT_TYPE_WMS_REG5 ( Float64x2_3Int2 , Float64x2, Float64x2, Float64x2, Int, Int) @@ -235,6 +254,15 @@ LAYOUT_TYPE_WMS_REG4 ( Float64x2_1Int32x4_1Float64x2_2 , Float64x2, Int32x4, F LAYOUT_TYPE_WMS_REG2 ( Reg1Float64x2_1 , Reg, Float64x2) #endif //0 +//Int64x2 +LAYOUT_TYPE_WMS_REG2 ( Int64x2_1Long1 , Int64x2, Long) +LAYOUT_TYPE_WMS_REG3 ( Long1Int64x2_1Int1 , Long, Int64x2, Int) +LAYOUT_TYPE_WMS_REG4 ( Int64x2_2_Int1_Long1 , Int64x2, Int64x2, Int, Long) +LAYOUT_TYPE_WMS_REG3 ( Int64x2_3 , Int64x2, Int64x2, Int64x2) +LAYOUT_TYPE_WMS_REG2 ( Int64x2_2 , Int64x2, Int64x2) +LAYOUT_TYPE_WMS_REG3 ( Int64x2_2Int1 , Int64x2, Int64x2, Int) +LAYOUT_TYPE_WMS_REG2 ( Int1Bool64x2_1 , Int, Int64x2) + // Int16x8 LAYOUT_TYPE_WMS_REG9 ( Int16x8_1Int8 , Int16x8, Int, Int, Int, Int, Int, Int, Int, Int) LAYOUT_TYPE_WMS_REG2 ( Reg1Int16x8_1 , Reg, Int16x8) @@ -363,8 +391,8 @@ LAYOUT_TYPE_WMS_REG2 ( Bool8x16_2 , Bool8x16, Bool8x16) LAYOUT_TYPE_WMS_REG3 ( Bool8x16_3 , Bool8x16, Bool8x16, Bool8x16) LAYOUT_TYPE_WMS_REG2 ( Reg1Bool8x16_1 , Reg, Bool8x16) - LAYOUT_TYPE_WMS ( AsmSimdTypedArr ) +LAYOUT_TYPE_WMS ( AsmShuffle ) #endif #undef LAYOUT_TYPE_DUP @@ -386,6 +414,8 @@ LAYOUT_TYPE_WMS ( AsmSimdTypedArr ) #undef EXCLUDE_DUP_LAYOUT #undef LAYOUT_TYPE_WMS_FE #undef EXCLUDE_FRONTEND_LAYOUT +#undef LAYOUT_TYPE_PROFILED_WMS +#undef LAYOUT_TYPE_PROFILED #undef LAYOUT_PREFIX_Int #undef LAYOUT_PREFIX_IntConst diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodeUtilAsmJs.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodeUtilAsmJs.cpp index 8e905ace5fb..3d5a3e454ae 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodeUtilAsmJs.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodeUtilAsmJs.cpp @@ -97,5 +97,12 @@ namespace Js return IsValidByteCodeOpcode(op) || (op > Js::OpCodeAsmJs::ByteCodeLast && op < Js::OpCodeAsmJs::Count); } + + void OpCodeUtilAsmJs::ConvertOpToProfiled(OpCodeAsmJs * op) + { + Assert(OpCodeAttrAsmJs::HasProfiledOp(*op)); + *op += 1; + Assert(OpCodeAttrAsmJs::IsProfiledOp(*op)); + } }; #endif diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodeUtilAsmJs.h b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodeUtilAsmJs.h index bb785142783..4ccaa976a01 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodeUtilAsmJs.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodeUtilAsmJs.h @@ -15,7 +15,7 @@ namespace Js static OpLayoutTypeAsmJs GetOpCodeLayout(OpCodeAsmJs op); static bool IsValidByteCodeOpcode(OpCodeAsmJs op); static bool IsValidOpcode(OpCodeAsmJs op); - + static void ConvertOpToProfiled(OpCodeAsmJs * op); private: #if DBG_DUMP || ENABLE_DEBUG_CONFIG_OPTIONS static char16 const * const OpCodeAsmJsNames[(int)Js::OpCodeAsmJs::MaxByteSizedOpcodes + 1]; diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodes.h b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodes.h index d17e55e9c6a..944fde0e43e 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodes.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodes.h @@ -149,7 +149,6 @@ MACRO_WMS( CallIFlags, CallIFlags, OpSideEffect|OpUseAl MACRO_WMS( CallIExtended, CallIExtended, OpSideEffect|OpUseAllFields|OpCallInstr) MACRO_WMS( CallIExtendedFlags, CallIExtendedFlags, OpSideEffect|OpUseAllFields|OpCallInstr) -MACRO_BACKEND_ONLY( CallIPut, CallIFlags, OpSideEffect|OpUseAllFields|OpCallInstr) // Call (indirect) Function(ArgCount) to put value MACRO_BACKEND_ONLY( CallINew, CallIFlags, OpSideEffect|OpUseAllFields|OpCallInstr) MACRO_BACKEND_ONLY( CallINewTargetNew, CallIFlags, OpSideEffect|OpUseAllFields|OpCallInstr) MACRO_BACKEND_ONLY( CallIExtendedNew, CallIExtendedFlags, OpSideEffect|OpUseAllFields|OpCallInstr) @@ -331,8 +330,6 @@ MACRO_BACKEND_ONLY( ArgOut_A_Dynamic, Empty, OpSideEffect MACRO_BACKEND_ONLY( ArgOut_A_FromStackArgs, Empty, OpSideEffect) // Copy from "local slot" to "out slot" MACRO_BACKEND_ONLY( ArgOut_A_FixupForStackArgs, Empty, OpSideEffect) MACRO_BACKEND_ONLY( ArgOut_A_SpreadArg, Empty, OpSideEffect) -MACRO_BACKEND_ONLY( ArgOutAsmJsI_A, Empty, OpSideEffect) -MACRO_BACKEND_ONLY( ArgOutAsmJsE_A, Empty, OpSideEffect) MACRO_WMS( Delete_A, Reg2, OpSideEffect|OpPostOpDbgBailOut) // Delete Var // Object operations @@ -459,8 +456,9 @@ MACRO_WMS( LdNaN, Reg1, OpByteCodeOnly|OpCan MACRO_WMS( LdInfinity, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'Infinity' MACRO_WMS( LdTrue, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'true' boolean primitive MACRO_WMS( LdFalse, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'false' boolean primitive -MACRO_BACKEND_ONLY( LdEnv, Reg1, OpCanCSE) // Load the optional FixedSizeArray environment for closures -MACRO_BACKEND_ONLY( LdAsmJsEnv, Reg1, OpCanCSE) // Load the asm.js memory +MACRO_EXTEND_WMS( LdChakraLib, Reg1, OpByteCodeOnly|OpCanCSE) // Load '__chakraLibrary' +MACRO_BACKEND_ONLY( LdEnv, Reg1, None) // Load the optional FixedSizeArray environment for closures +MACRO_BACKEND_ONLY( LdAsmJsEnv, Reg1, None) // Load the asm.js memory MACRO_WMS( LdArgCnt, Reg1, None) // Load the argument count from the current function @@ -541,7 +539,7 @@ MACRO_BACKEND_ONLY( NewStackScopeSlots, Reg1, None) MACRO_BACKEND_ONLY( InitLocalClosure, Reg1, None) MACRO_WMS( NewInnerScopeSlots, Reg3, None) MACRO_WMS( CloneInnerScopeSlots, Unsigned1, OpSideEffect) // Clone existing inner scope slots in place for for-loop iterations -MACRO_BACKEND_ONLY( NewScopeSlotsWithoutPropIds, Reg1Int2, None) +MACRO_BACKEND_ONLY( NewScopeSlotsWithoutPropIds, Reg3, None) MACRO_WMS( NewRegEx, Reg1Unsigned1, OpTempObjectCanStoreTemp|OpSideEffect) // Create a new RegEx expression MACRO_WMS( IsInst, Reg3C, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // instanceof() - SideEffect: can throw... @@ -766,7 +764,7 @@ MACRO_BACKEND_ONLY( TrapIfZero, Reg3, OpSideEffect) #undef MACRO_WMS_PROFILED #undef MACRO_WMS_PROFILED2 -#undef MACRO_WMS_PROFILED_OPCODE +#undef MACRO_WMS_PROFILED_OP #undef MACRO_PROFILED #undef MACRO_DEBUG_WMS #undef MACRO_DEBUG diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodesAsmJs.h b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodesAsmJs.h index 4280970264c..cf5f0d1354d 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodesAsmJs.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodesAsmJs.h @@ -19,6 +19,11 @@ #define MACRO_EXTEND_WMS(opcode, layout, attr) #endif +#define MACRO_WMS_PROFILED( opcode, layout, attr) \ + MACRO_WMS(opcode, layout, OpHasProfiled|attr) \ + MACRO_WMS(Profiled##opcode, Profiled##layout, OpProfiled|attr) \ + + // ( OpCodeAsmJs , LayoutAsmJs , OpCodeAttrAsmJs ) // ( | , | , | ) // ( | , | , | ) @@ -37,6 +42,19 @@ MACRO_EXTEND ( InvalidOpCode , Empty , None MACRO ( Label , Empty , None ) // No operation (Default value = 0) MACRO ( Ret , Empty , None ) + +// loads +// Note: bytecode generator assumes this is a contiguous group with this ordering, so don't insert other opcodes in the middle +// (See ByteCodeWriter::Data::EncodeT in AsmJsBytecodeWriter.cpp) +MACRO_WMS ( Ld_IntConst , Int1Const1 , None ) // Sets an int register from a const int +MACRO_WMS ( Ld_Int , Int2 , None ) // Sets an int from another int register +MACRO_WMS ( Ld_LongConst , Long1Const1 , None ) // Sets an int64 register from a const int64 +MACRO_WMS ( Ld_Long , Long2 , None ) // Sets an int64 from another int64 register +MACRO_WMS ( Ld_FltConst , Float1Const1 , None ) // Sets a float register from a const float +MACRO_WMS ( Ld_Flt , Float2 , None ) // Sets a float from another float register +MACRO_WMS ( Ld_DbConst , Double1Const1 , None ) // Sets a double register from a const double +MACRO_WMS ( Ld_Db , Double2 , None ) // Sets a double from another double register + // External Function calls MACRO ( StartCall , StartCall , None ) // Initialize memory for a call MACRO_WMS ( Call , AsmCall , None ) // Execute call and place return value in register @@ -46,22 +64,20 @@ MACRO_WMS ( ArgOut_Long , Reg1Long1 , None MACRO_WMS ( ArgOut_Flt , Reg1Float1 , None ) // convert float to var and place it for function call MACRO_WMS ( ArgOut_Db , Reg1Double1 , None ) // convert double to var and place it for function call MACRO_WMS ( Conv_VTI , Int1Reg1 , None ) // convert var to int -MACRO_WMS ( Conv_VTL , Long1Reg1 , None ) // convert var to int64 MACRO_WMS ( Conv_VTF , Float1Reg1 , None ) // convert var to float MACRO_WMS ( Conv_VTD , Double1Reg1 , None ) // convert var to double +MACRO_WMS ( Conv_VTL , Long1Reg1 , None ) // convert var to int64 // Internal calls -MACRO ( I_StartCall , StartCall , None ) // Initialize memory for a call -MACRO_WMS ( I_Call , AsmCall , None ) // Execute call and place return value in register -MACRO_WMS ( I_ArgOut_Db , Reg1Double1 , None ) // place double arg for function call -MACRO_WMS ( I_ArgOut_Int , Reg1Int1 , None ) // place int arg for function call -MACRO_WMS ( I_ArgOut_Long , Reg1Long1 , None ) // place int64 arg for function call -MACRO_WMS ( I_ArgOut_Flt , Reg1Float1 , None ) // place float arg for function call -MACRO_WMS ( I_Conv_VTI , Int2 , None ) // convert var to int -MACRO_WMS ( I_Conv_VTF , Float2 , None ) // convert var to float -MACRO_WMS ( I_Conv_VTD , Double2 , None ) // convert var to double +MACRO ( I_StartCall , StartCall , None ) // Initialize memory for a call +MACRO_WMS_PROFILED( I_Call , AsmCall , None ) // Execute call and place return value in register +MACRO_WMS ( I_ArgOut_Db , Reg1Double1 , None ) // place double arg for function call +MACRO_WMS ( I_ArgOut_Int , Reg1Int1 , None ) // place int arg for function call +MACRO_WMS ( I_ArgOut_Long , Reg1Long1 , None ) // place int64 arg for function call +MACRO_WMS ( I_ArgOut_Flt , Reg1Float1 , None ) // place float arg for function call // loop -MACRO_WMS ( AsmJsLoopBodyStart , AsmUnsigned1 , None ) // Marks the start of a loop body +MACRO_WMS ( AsmJsLoopBodyStart , AsmUnsigned1 , None ) // Marks the start of an asm.js loop body +MACRO_WMS ( WasmLoopBodyStart , WasmLoopStart , None ) // Marks the start of a wasm loop body // Branching MACRO ( AsmBr , AsmBr , OpNoFallThrough ) // Unconditional branch MACRO_WMS ( BrTrue_Int , BrInt1 , None ) // Jumps to offset if int value is not 0 @@ -103,8 +119,14 @@ MACRO_WMS ( Return_Db , Double2 , None MACRO_WMS ( Return_Flt , Float2 , None ) // convert float to var MACRO_WMS ( Return_Int , Int2 , None ) // convert int to var +// Wasm Sign Extension operators +MACRO_WMS ( I32Extend8_s , Int2 , None ) +MACRO_WMS ( I32Extend16_s , Int2 , None ) +MACRO_WMS ( I64Extend8_s , Long2 , None ) +MACRO_WMS ( I64Extend16_s , Long2 , None ) +MACRO_WMS ( I64Extend32_s , Long2 , None ) + // Module memory manipulation -MACRO_WMS ( LdUndef , AsmReg1 , None ) // Load 'undefined' usually in return register MACRO_WMS ( LdSlotArr , ElementSlot , None ) // Loads an array of Var from an array of Var MACRO_WMS ( LdSlot , ElementSlot , None ) // Loads a Var from an array of Var MACRO_WMS ( LdSlot_Db , ElementSlot , None ) // Loads a double from the Module @@ -127,9 +149,8 @@ MACRO_WMS ( LdArrConst , AsmTypedArr , None MACRO_WMS ( StArr , AsmTypedArr , None ) MACRO_WMS ( StArrConst , AsmTypedArr , None ) + // Int math -MACRO_WMS ( Ld_IntConst , Int1Const1 , None ) // Sets an int register from a const int -MACRO_WMS ( Ld_Int , Int2 , None ) // Sets an int from another int register MACRO_WMS ( Neg_Int , Int2 , None ) // int unary '-' MACRO_WMS ( Not_Int , Int2 , None ) // int unary '~' MACRO_WMS ( LogNot_Int , Int2 , None ) // int unary '!' @@ -158,8 +179,6 @@ MACRO_WMS ( Rem_UInt , Int3 , None MACRO_WMS ( Rem_Trap_UInt , Int3 , None ) // (checked) uint32 Arithmetic '%' // Int64 Math -MACRO_WMS ( Ld_LongConst , Long1Const1 , None ) // Sets an int64 register from a const int64 -MACRO_WMS ( Ld_Long , Long2 , None ) // Sets an int64 from another int64 register MACRO_WMS ( Add_Long , Long3 , None ) // int64 Arithmetic '+' MACRO_WMS ( Sub_Long , Long3 , None ) // int64 Arithmetic '-' (subtract) MACRO_WMS ( Mul_Long , Long3 , None ) // int64 Arithmetic '*' @@ -180,8 +199,6 @@ MACRO_WMS ( Ctz_Long , Long2 , None MACRO_WMS ( PopCnt_Long , Long2 , None ) // Double math -MACRO_WMS ( Ld_DbConst , Double1Const1 , None ) // Sets a double register from a const double -MACRO_WMS ( Ld_Db , Double2 , None ) // Sets a double from another double register MACRO_WMS ( Neg_Db , Double2 , None ) // Double Unary '-' MACRO_WMS ( Add_Db , Double3 , None ) // Double Arithmetic '+' MACRO_WMS ( Sub_Db , Double3 , None ) // Double Arithmetic '-' (subtract) @@ -190,8 +207,6 @@ MACRO_WMS ( Div_Db , Double3 , None MACRO_WMS ( Rem_Db , Double3 , None ) // Double Arithmetic '%' // float math -MACRO_WMS ( Ld_FltConst , Float1Const1 , None ) // Sets a float register from a const float -MACRO_WMS ( Ld_Flt , Float2 , None ) // Sets a float from another float register MACRO_WMS ( Neg_Flt , Float2 , None ) // Float Unary '-' MACRO_WMS ( Add_Flt , Float3 , None ) // Float Arithmetic '+' MACRO_WMS ( Sub_Flt , Float3 , None ) // Float Arithmetic '-' (subtract) @@ -324,3 +339,4 @@ MACRO_EXTEND_WMS( PrintF64, Double2, None) #undef MACRO_WMS #undef MACRO_EXTEND #undef MACRO_EXTEND_WMS +#undef MACRO_WMS_PROFILED diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodesSimd.h b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodesSimd.h index 78deb6ba688..349275b290f 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodesSimd.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/OpCodesSimd.h @@ -90,12 +90,14 @@ MACRO_SIMD_ASMJS_ONLY_WMS ( Simd128_LdSlot_I4 , ElementSlot MACRO_SIMD_ASMJS_ONLY_WMS ( Simd128_StSlot_I4 , ElementSlot , None , None ) MACRO_SIMD_ASMJS_ONLY_WMS ( Simd128_Return_I4 , Int32x4_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_WMS ( Simd128_I_ArgOut_I4 , Reg1Int32x4_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_WMS ( Simd128_I_Conv_VTI4 , Int32x4_2 , None , None ) // Extended opcodes. Running out of 1-byte opcode space. Add new opcodes here. MACRO_SIMD(Simd128_End, Empty, None, None) // Just a marker to indicate SIMD opcodes region MACRO_SIMD_EXTEND(Simd128_Start_Extend, Empty, None, None, 0) // Just a marker to indicate SIMD extended opcodes region +// Int32x4 +MACRO_SIMD_EXTEND_WMS ( Simd128_BitSelect_I4 , Int32x4_4 , None , OpCanCSE , 0) + // Float32x4 MACRO_SIMD_EXTEND_WMS ( Simd128_FloatsToF4 , Float32x4_1Float4 , None , OpCanCSE , 6, &Js::SIMDFloat32x4Lib::EntryInfo::Float32x4, T_F4, T_FLT, T_FLT, T_FLT, T_FLT) MACRO_SIMD_EXTEND_WMS ( Simd128_Splat_F4 , Float32x4_1Float1 , None , OpCanCSE , 3, &Js::SIMDFloat32x4Lib::EntryInfo::Splat , T_F4, T_FLT) @@ -128,40 +130,59 @@ MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_Ld_F4 , Float32x4_ MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_LdSlot_F4 , ElementSlot , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_StSlot_F4 , ElementSlot , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_Return_F4 , Float32x4_2 , None , None ) +MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_ArgOut_F4 , Reg1Float32x4_1 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_I_ArgOut_F4 , Reg1Float32x4_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_I_Conv_VTF4 , Float32x4_2 , None , None ) +// Int64x2 +MACRO_SIMD_EXTEND_WMS(Simd128_Splat_I2, Int64x2_1Long1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_ExtractLane_I2, Long1Int64x2_1Int1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_ReplaceLane_I2, Int64x2_2_Int1_Long1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Add_I2, Int64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Sub_I2, Int64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Neg_I2, Int64x2_2, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_ShLtByScalar_I2, Int64x2_2Int1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_ShRtByScalar_I2, Int64x2_2Int1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_ShRtByScalar_U2, Int64x2_2Int1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_AnyTrue_B2, Int1Bool64x2_1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_AllTrue_B2, Int1Bool64x2_1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_FromFloat64x2_I2, Int64x2_2, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_FromFloat64x2_U2, Int64x2_2, None, None, 0) // Float64x2 -#if 0 //Disabling this type until the specification decides to include or not. -MACRO_SIMD_EXTEND_WMS(Simd128_DoublesToD2, Float64x2_1Double2, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Splat_D2, Float64x2_1Double1, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_FromFloat32x4_D2, Float64x2_1Float32x4_1, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_FromFloat32x4Bits_D2, Float64x2_1Float32x4_1, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_FromInt32x4_D2, Float64x2_1Int32x4_1, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_FromInt32x4Bits_D2, Float64x2_1Int32x4_1, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_Abs_D2, Float64x2_2, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_ExtractLane_D2, Double1Float64x2_1Int1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_ReplaceLane_D2, Float64x2_2Int1Double1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Eq_D2, Float64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Neq_D2, Float64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Lt_D2, Float64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_LtEq_D2, Float64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Gt_D2, Float64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_GtEq_D2, Float64x2_3, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Neg_D2, Float64x2_2, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Abs_D2, Float64x2_2, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Min_D2, Float64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Max_D2, Float64x2_3, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Add_D2, Float64x2_3, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Sub_D2, Float64x2_3, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Mul_D2, Float64x2_3, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Div_D2, Float64x2_3, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_Sqrt_D2, Float64x2_2, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_FromInt64x2_D2, Int64x2_2, None, None, 0) //Int64x2_2 is intentional +MACRO_SIMD_EXTEND_WMS(Simd128_FromUint64x2_D2, Int64x2_2, None, None, 0) +// Float64x2 +#if 0 //Disabling this type until the specification decides to include or not. +MACRO_SIMD_EXTEND_WMS(Simd128_DoublesToD2, Float64x2_1Double2, None, None, 0) + +MACRO_SIMD_EXTEND_WMS(Simd128_FromFloat32x4_D2, Float64x2_1Float32x4_1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_FromFloat32x4Bits_D2, Float64x2_1Float32x4_1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_FromInt32x4_D2, Float64x2_1Int32x4_1, None, None, 0) +MACRO_SIMD_EXTEND_WMS(Simd128_FromInt32x4Bits_D2, Float64x2_1Int32x4_1, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Clamp_D2, Float64x2_4, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_Min_D2, Float64x2_3, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_Max_D2, Float64x2_3, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Rcp_D2, Float64x2_2, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_RcpSqrt_D2, Float64x2_2, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_Sqrt_D2, Float64x2_2, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_Lt_D2, Float64x2_3, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Select_D2, Float64x2_1Int32x4_1Float64x2_2, None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_LdSignMask_D2, Int1Float64x2_1, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_LtEq_D2, Float64x2_3, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_Eq_D2, Float64x2_3, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_Neq_D2, Float64x2_3, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_Gt_D2, Float64x2_3, None, None, 0) -MACRO_SIMD_EXTEND_WMS(Simd128_GtEq_D2, Float64x2_3, None, None, 0) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS(Simd128_Return_D2, Float64x2_2, None, None) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS(Simd128_I_ArgOut_D2, Reg1Float64x2_1, None, None) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS(Simd128_I_Conv_VTD2, Float64x2_2, None, None) #endif // 0 //Disabling this type until the specification decides to include or not. //Int8x16 @@ -201,7 +222,7 @@ MACRO_SIMD_EXTEND_WMS(Simd128_Not_B16 , Bool8x16_2 , No MACRO_SIMD_EXTEND_WMS(Simd128_Neg_U4 , Uint32x4_2 , None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Neg_U8 , Uint16x8_2 , None, None, 0) MACRO_SIMD_EXTEND_WMS(Simd128_Neg_U16 , Uint8x16_2 , None, None, 0) -MACRO_SIMD_BACKEND_ONLY(Simd128_LdC , Empty , None, OpCanCSE) // Load Simd128 const stack slot +MACRO_SIMD_EXTEND_WMS(Simd128_LdC , Float32x4_IntConst4 , None, OpCanCSE, 0) // Load Simd128 const stack slot #if 0 MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS(Simd128_Ld_D2, Float64x2_2, None, None) @@ -237,31 +258,24 @@ MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_LdSlot_U16 , ElementSlot MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_StSlot_U16 , ElementSlot , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_ArgOut_I8 , Reg1Int16x8_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_Conv_VTI8 , Int16x8_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_Return_I8 , Int16x8_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_ArgOut_U4 , Reg1Uint32x4_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_Conv_VTU4 , Uint32x4_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_Return_U4 , Uint32x4_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_ArgOut_U8 , Reg1Uint16x8_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_Conv_VTU8 , Uint16x8_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_Return_U8 , Uint16x8_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_ArgOut_U16 , Reg1Uint8x16_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_Conv_VTU16 , Uint8x16_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_Return_U16 , Uint8x16_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_ArgOut_B4 , Reg1Bool32x4_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_Conv_VTB4 , Bool32x4_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_Return_B4 , Bool32x4_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_ArgOut_B8 , Reg1Bool16x8_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_Conv_VTB8 , Bool16x8_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_Return_B8 , Bool16x8_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_ArgOut_B16 , Reg1Bool8x16_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_I_Conv_VTB16 , Bool8x16_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS ( Simd128_Return_B16 , Bool8x16_2 , None , None ) MACRO_SIMD_EXTEND_WMS ( Simd128_LdArr_I4 , AsmSimdTypedArr , None , OpCanCSE , 4, &Js::SIMDInt32x4Lib::EntryInfo::Load, T_I4, ValueType::GetObject(ObjectType::Int8Array) /*dummy place-holder for any typed array*/, T_INT) @@ -345,7 +359,6 @@ MACRO_SIMD_ASMJS_ONLY_WMS (Simd128_LdSlot_I16 , ElementSlot MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS (Simd128_StSlot_I16 , ElementSlot , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS (Simd128_Return_I16 , Int8x16_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS (Simd128_I_ArgOut_I16 , Reg1Int8x16_1 , None , None ) -MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS (Simd128_I_Conv_VTI16 , Int8x16_2 , None , None ) // Uint32x4 MACRO_SIMD_EXTEND_WMS ( Simd128_IntsToU4 , Uint32x4_1Int4 , None , None , 0) @@ -424,6 +437,8 @@ MACRO_SIMD_EXTEND_WMS ( Simd128_ExtractLane_U16 , Int1Uint8x16_1 MACRO_SIMD_EXTEND_WMS ( Simd128_ReplaceLane_U16 , Uint8x16_2Int2 , None , None , 0) MACRO_SIMD_EXTEND_WMS ( Simd128_Swizzle_U16 , Uint8x16_2Int16 , None , None , 0) MACRO_SIMD_EXTEND_WMS ( Simd128_Shuffle_U16 , Uint8x16_3Int16 , None , None , 0) +MACRO_SIMD_EXTEND_WMS ( Simd128_Shuffle_V8X16 , AsmShuffle , None , None , 0) + MACRO_SIMD_EXTEND_WMS ( Simd128_Splat_U16 , Uint8x16_1Int1 , None , None , 0) MACRO_SIMD_EXTEND_WMS ( Simd128_And_U16 , Uint8x16_3 , None , None , 0) MACRO_SIMD_EXTEND_WMS ( Simd128_Or_U16 , Uint8x16_3 , None , None , 0) @@ -498,8 +513,7 @@ MACRO_SIMD_EXTEND_WMS ( Simd128_AllTrue_B16 , Int1Bool8x16_1 MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_Ld_B16 , Bool8x16_2 , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_LdSlot_B16 , ElementSlot , None , None ) MACRO_SIMD_ASMJS_ONLY_EXTEND_WMS( Simd128_StSlot_B16 , ElementSlot , None , None ) - -MACRO_SIMD_EXTEND ( Simd128_End_Extend , Empty , None , None , 0) // Just a marker to indicate SIMD opcodes region +MACRO_SIMD_EXTEND ( Simd128_End_Extend , Empty , None , None , 0) // Just a marker to indicate SIMD opcodes region #undef T_F4 #undef T_I4 #undef T_INT diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/OpLayouts.h b/deps/chakrashim/core/lib/Runtime/ByteCode/OpLayouts.h index d107d599ffa..b27d8daacea 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/OpLayouts.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/OpLayouts.h @@ -132,12 +132,6 @@ namespace Js { typename SizePolicy::RegSlotType R1; }; - template - struct OpLayoutT_Reg2WithICIndex : public OpLayoutT_Reg2 - { - InlineCacheIndex inlineCacheIndex; - }; - template struct OpLayoutT_Reg3 // R0 <- R1 op R2 -- or -- R0 op R1 <- R2 { @@ -371,7 +365,7 @@ namespace Js { template struct OpLayoutT_ElementSlot // Value = Instance[SlotIndex] or Instance[SlotIndex] = Value { - int32 SlotIndex; // TODO: Make this one byte? + typename SizePolicy::UnsignedType SlotIndex; typename SizePolicy::RegSlotType Value; typename SizePolicy::RegSlotType Instance; }; @@ -379,15 +373,15 @@ namespace Js { template struct OpLayoutT_ElementSlotI1 { - int32 SlotIndex; // TODO: Make this one byte? + typename SizePolicy::UnsignedType SlotIndex; typename SizePolicy::RegSlotType Value; }; template struct OpLayoutT_ElementSlotI2 { - int32 SlotIndex1; // TODO: Make this one byte? - int32 SlotIndex2; // TODO: Make this one byte? + typename SizePolicy::UnsignedType SlotIndex1; + typename SizePolicy::UnsignedType SlotIndex2; typename SizePolicy::RegSlotType Value; }; @@ -459,13 +453,6 @@ namespace Js { unsigned short C1; }; - struct OpLayoutReg1Int2 // R0 <- Var(C1, C2) - { - RegSlot R0; - int32 C1; - int32 C2; - }; - template struct OpLayoutT_Reg2Int1 // R0 <- func(R1, C1) { diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/OpLayoutsAsmJs.h b/deps/chakrashim/core/lib/Runtime/ByteCode/OpLayoutsAsmJs.h index 006c590ed67..e7f279b2f57 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/OpLayoutsAsmJs.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/OpLayoutsAsmJs.h @@ -6,6 +6,7 @@ #pragma once #ifdef ASMJS_PLAT +#include "Language/WAsmjsUtils.h" namespace Js { ///---------------------------------------------------------------------------- @@ -274,6 +275,15 @@ namespace Js typename SizePolicy::RegSlotType R18; }; + template + struct OpLayoutT_AsmShuffle + { + uint8 INDICES[16]; + typename SizePolicy::RegSlotType R0; + typename SizePolicy::RegSlotType R1; + typename SizePolicy::RegSlotType R2; + }; + #define RegLayoutType typename SizePolicy::RegSlotType #define IntLayoutType typename SizePolicy::RegSlotType #define LongLayoutType typename SizePolicy::RegSlotType @@ -287,6 +297,7 @@ namespace Js #define Bool32x4LayoutType typename SizePolicy::RegSlotType #define Int32x4LayoutType typename SizePolicy::RegSlotType #define Float64x2LayoutType typename SizePolicy::RegSlotType +#define Int64x2LayoutType typename SizePolicy::RegSlotType #define Int16x8LayoutType typename SizePolicy::RegSlotType #define Bool16x8LayoutType typename SizePolicy::RegSlotType #define Int8x16LayoutType typename SizePolicy::RegSlotType @@ -296,6 +307,7 @@ namespace Js #define Uint8x16LayoutType typename SizePolicy::RegSlotType #define LAYOUT_FIELDS_HELPER(x, y) x ## y #define LAYOUT_FIELDS_DEF(x, y) LAYOUT_FIELDS_HELPER(x, y) + #define LAYOUT_TYPE_WMS_REG2(layout, t0, t1) \ template struct OpLayoutT_##layout\ {\ @@ -477,6 +489,7 @@ namespace Js #undef Uint32x4LayoutType #undef Uint16x8LayoutType #undef Uint8x16LayoutType +#undef Int64x2LayoutType template struct OpLayoutT_AsmUnsigned1 @@ -484,6 +497,13 @@ namespace Js typename SizePolicy::UnsignedType C1; }; + template + struct OpLayoutT_WasmLoopStart + { + typename SizePolicy::UnsignedType loopId; + typename SizePolicy::UnsignedType curRegs[WAsmJs::LIMIT]; + }; + struct OpLayoutAsmBr { int32 RelativeJumpOffset; @@ -520,6 +540,7 @@ namespace Js typename SizePolicy::RegSlotType Value; ArrayBufferView::ViewType ViewType; int8 DataWidth; // # of bytes to load/store + uint32 Offset; //WASM.SIMD }; // Generate the multi size layout type defs @@ -527,6 +548,17 @@ namespace Js typedef OpLayoutT_##layout OpLayout##layout##_Large; \ typedef OpLayoutT_##layout OpLayout##layout##_Medium; \ typedef OpLayoutT_##layout OpLayout##layout##_Small; + + // Generate the profiled type defs +#define LAYOUT_TYPE_PROFILED(layout) \ + typedef OpLayoutDynamicProfile OpLayoutProfiled##layout; + +#define LAYOUT_TYPE_PROFILED_WMS(layout) \ + LAYOUT_TYPE_WMS(layout) \ + LAYOUT_TYPE_PROFILED(layout##_Large) \ + LAYOUT_TYPE_PROFILED(layout##_Medium) \ + LAYOUT_TYPE_PROFILED(layout##_Small) + #include "LayoutTypesAsmJs.h" #pragma pack(pop) diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ScopeInfo.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/ScopeInfo.cpp index 042a352ef5b..c0a58e6b036 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ScopeInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ScopeInfo.cpp @@ -32,6 +32,7 @@ namespace Js this->SetSymbolType(scopeSlot, sym->GetSymbolType()); this->SetHasFuncAssignment(scopeSlot, sym->GetHasFuncAssignment()); this->SetIsBlockVariable(scopeSlot, sym->GetIsBlockVar()); + this->SetIsConst(scopeSlot, sym->GetIsConst()); this->SetIsFuncExpr(scopeSlot, sym->GetIsFuncExpr()); this->SetIsModuleExportStorage(scopeSlot, sym->GetIsModuleExportStorage()); this->SetIsModuleImport(scopeSlot, sym->GetIsModuleImport()); @@ -231,6 +232,7 @@ namespace Js sym->SetScopeSlot(static_cast(i)); sym->SetIsBlockVar(GetIsBlockVariable(i)); + sym->SetIsConst(GetIsConst(i)); sym->SetIsFuncExpr(GetIsFuncExpr(i)); sym->SetIsModuleExportStorage(GetIsModuleExportStorage(i)); sym->SetIsModuleImport(GetIsModuleImport(i)); diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/ScopeInfo.h b/deps/chakrashim/core/lib/Runtime/ByteCode/ScopeInfo.h index f5a61873b1b..df80ec00550 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/ScopeInfo.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/ScopeInfo.h @@ -27,11 +27,12 @@ namespace Js { Field(PropertyRecord const*) name; }; Field(SymbolType) symbolType; - Field(bool) hasFuncAssignment; - Field(bool) isBlockVariable; - Field(bool) isFuncExpr; - Field(bool) isModuleExportStorage; - Field(bool) isModuleImport; + Field(bool) hasFuncAssignment : 1; + Field(bool) isBlockVariable : 1; + Field(bool) isConst : 1; + Field(bool) isFuncExpr : 1; + Field(bool) isModuleExportStorage : 1; + Field(bool) isModuleImport : 1; }; private: @@ -85,6 +86,13 @@ namespace Js { symbols[i].isBlockVariable = is; } + void SetIsConst(int i, bool is) + { + Assert(!areNamesCached); + Assert(i >= 0 && i < symbolCount); + symbols[i].isConst = is; + } + void SetIsFuncExpr(int i, bool is) { Assert(!areNamesCached); @@ -150,6 +158,12 @@ namespace Js { return symbols[i].isBlockVariable; } + bool GetIsConst(int i) + { + Assert(i >= 0 && i < symbolCount); + return symbols[i].isConst; + } + bool GetIsFuncExpr(int i) { Assert(i >= 0 && i < symbolCount); diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/StatementReader.h b/deps/chakrashim/core/lib/Runtime/ByteCode/StatementReader.h index 9d2e950ba1a..952f41accf9 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/StatementReader.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/StatementReader.h @@ -10,14 +10,14 @@ namespace Js class StatementReader { private: - const byte* m_startLocation; - SmallSpanSequence* m_statementMap; + const byte* m_startLocation = nullptr; + SmallSpanSequence* m_statementMap = nullptr; SmallSpanSequenceIter m_statementMapIter; - TStatementMapList * m_fullstatementMap; - const byte* m_nextStatementBoundary; - int m_statementIndex; - bool m_startOfStatement; + TStatementMapList * m_fullstatementMap = nullptr; + const byte* m_nextStatementBoundary = nullptr; + int m_statementIndex = 0; + bool m_startOfStatement = true; public: void Create(FunctionBody* functionRead, uint startOffset = 0); diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/Symbol.h b/deps/chakrashim/core/lib/Runtime/ByteCode/Symbol.h index 05c40e1003a..bf02a23b377 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/Symbol.h +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/Symbol.h @@ -30,6 +30,7 @@ class Symbol BYTE defCount; BYTE needDeclaration : 1; BYTE isBlockVar : 1; + BYTE isConst : 1; BYTE isGlobal : 1; BYTE isEval : 1; BYTE hasNonLocalReference : 1; // if true, then this symbol needs to be heap-allocated @@ -40,8 +41,6 @@ class Symbol BYTE isGlobalCatch : 1; BYTE isCommittedToSlot : 1; BYTE hasNonCommittedReference : 1; - BYTE hasRealBlockVarRef : 1; - BYTE hasBlockFncVarRedecl : 1; BYTE hasVisitedCapturingFunc : 1; BYTE isTrackedForDebugger : 1; // Whether the sym is tracked for debugger scope. This is fine because a sym can only be added to (not more than) one scope. BYTE isModuleExportStorage : 1; // If true, this symbol should be stored in the global scope export storage array. @@ -63,29 +62,31 @@ class Symbol public: Symbol(SymbolName const& name, ParseNode *decl, SymbolType symbolType) : name(name), + pid(nullptr), decl(decl), - next(nullptr), + scope(nullptr), + position(Js::Constants::NoProperty), location(Js::Constants::NoRegister), + scopeSlot(Js::Constants::NoProperty), + moduleIndex(Js::Constants::NoProperty), + next(nullptr), + symbolType(symbolType), // will get set to the same value in SetSymbolType + defCount(0), needDeclaration(false), isBlockVar(false), + isConst(false), isGlobal(false), + isEval(false), // will get properly set in constructor body hasNonLocalReference(false), isFuncExpr(false), isCatch(false), hasInit(false), isUsed(false), - defCount(0), - position(Js::Constants::NoProperty), - scopeSlot(Js::Constants::NoProperty), isGlobalCatch(false), isCommittedToSlot(false), hasNonCommittedReference(false), - hasRealBlockVarRef(false), - hasBlockFncVarRedecl(false), hasVisitedCapturingFunc(false), isTrackedForDebugger(false), - isNonSimpleParameter(false), - assignmentState(NotAssigned), isModuleExportStorage(false), isModuleImport(false), isUsedInLdElem(false), @@ -94,7 +95,10 @@ class Symbol isSuper(false), isSuperConstructor(false), needsScopeObject(false), - moduleIndex(Js::Constants::NoProperty) + hasFuncAssignment(false), // will get reset by SetSymbolType + hasMaybeEscapedUse(false), // will get reset by SetSymbolType + isNonSimpleParameter(false), + assignmentState(NotAssigned) { SetSymbolType(symbolType); @@ -164,6 +168,16 @@ class Symbol return isBlockVar; } + void SetIsConst(bool is) + { + isConst = is; + } + + bool GetIsConst() const + { + return isConst; + } + void SetIsModuleExportStorage(bool is) { isModuleExportStorage = is; @@ -336,26 +350,6 @@ class Symbol isUsed = is; } - bool HasRealBlockVarRef() const - { - return hasRealBlockVarRef; - } - - void SetHasRealBlockVarRef(bool has = true) - { - hasRealBlockVarRef = has; - } - - bool HasBlockFncVarRedecl() const - { - return hasBlockFncVarRedecl; - } - - void SetHasBlockFncVarRedecl(bool has = true) - { - hasBlockFncVarRedecl = has; - } - AssignmentState GetAssignmentState() const { return assignmentState; diff --git a/deps/chakrashim/core/lib/Runtime/ByteCode/WasmByteCodeWriter.cpp b/deps/chakrashim/core/lib/Runtime/ByteCode/WasmByteCodeWriter.cpp index 3bce18a9d2a..43134a20c12 100644 --- a/deps/chakrashim/core/lib/Runtime/ByteCode/WasmByteCodeWriter.cpp +++ b/deps/chakrashim/core/lib/Runtime/ByteCode/WasmByteCodeWriter.cpp @@ -35,6 +35,44 @@ ByteCodeLabel WasmByteCodeWriter::DefineLabel() { return ByteCodeWriter::DefineLabel(); } +void WasmByteCodeWriter::SetCallSiteCount(Js::ProfileId callSiteCount) +{ + ByteCodeWriter::SetCallSiteCount(callSiteCount); +} + +uint32 WasmByteCodeWriter::WasmLoopStart(ByteCodeLabel loopEntrance, __in_ecount(WAsmJs::LIMIT) RegSlot* curRegs) +{ + uint loopId = m_functionWrite->IncrLoopCount(); + Assert((uint)m_loopHeaders->Count() == loopId); + + m_loopHeaders->Add(LoopHeaderData(m_byteCodeData.GetCurrentOffset(), 0, m_loopNest > 0)); + m_loopNest++; + this->MarkAsmJsLabel(loopEntrance); + MULTISIZE_LAYOUT_WRITE(WasmLoopStart, Js::OpCodeAsmJs::WasmLoopBodyStart, loopId, curRegs); + + return loopId; +} + +template +bool WasmByteCodeWriter::TryWriteWasmLoopStart(OpCodeAsmJs op, uint loopId, __in_ecount(WAsmJs::LIMIT) RegSlot* curRegs) +{ + OpLayoutT_WasmLoopStart layout; + if (SizePolicy::Assign(layout.loopId, loopId)) + { + for (WAsmJs::Types type = WAsmJs::Types(0); type != WAsmJs::LIMIT; type = WAsmJs::Types(type + 1)) + { + if (!SizePolicy::Assign(layout.curRegs[type], curRegs[type])) + { + return false; + } + } + + m_byteCodeData.EncodeT(op, &layout, sizeof(layout), this); + return true; + } + return false; +} + } #endif diff --git a/deps/chakrashim/core/lib/Runtime/Debug/BreakpointProbe.cpp b/deps/chakrashim/core/lib/Runtime/Debug/BreakpointProbe.cpp index 0d654ab5d40..e9a63f13c9f 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/BreakpointProbe.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/BreakpointProbe.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING namespace Js { BreakpointProbe::BreakpointProbe(DebugDocument* debugDocument, StatementLocation& statement, int breakpointId) : @@ -85,3 +86,4 @@ namespace Js statement->statement.begin = this->characterOffset; } } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/CMakeLists.txt b/deps/chakrashim/core/lib/Runtime/Debug/CMakeLists.txt index 4ecab8662d8..72a30584791 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/CMakeLists.txt +++ b/deps/chakrashim/core/lib/Runtime/Debug/CMakeLists.txt @@ -11,7 +11,6 @@ add_library (Chakra.Runtime.Debug OBJECT MutationBreakpoint.cpp ProbeContainer.cpp RuntimeDebugPch.cpp - SourceContextInfo.cpp TTActionEvents.cpp TTEventLog.cpp TTEvents.cpp diff --git a/deps/chakrashim/core/lib/Runtime/Debug/Chakra.Runtime.Debug.vcxproj b/deps/chakrashim/core/lib/Runtime/Debug/Chakra.Runtime.Debug.vcxproj index 05b06b7766b..3ddff329854 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/Chakra.Runtime.Debug.vcxproj +++ b/deps/chakrashim/core/lib/Runtime/Debug/Chakra.Runtime.Debug.vcxproj @@ -42,7 +42,7 @@ -Zc:implicitNoexcept- %(AdditionalOptions) - + @@ -54,7 +54,6 @@ - Create @@ -85,7 +84,6 @@ - diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DebugContext.cpp b/deps/chakrashim/core/lib/Runtime/Debug/DebugContext.cpp index af144fdc543..406bddf5bed 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DebugContext.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/DebugContext.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING namespace Js { DebugContext::DebugContext(Js::ScriptContext * scriptContext) : @@ -407,3 +408,4 @@ namespace Js }); } } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DebugDocument.cpp b/deps/chakrashim/core/lib/Runtime/Debug/DebugDocument.cpp index ffc3ae47c4f..e783c6c63dc 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DebugDocument.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/DebugDocument.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING namespace Js { DebugDocument::DebugDocument(Utf8SourceInfo* utf8SourceInfo, Js::FunctionBody* functionBody) : @@ -351,3 +352,4 @@ namespace Js return TRUE; } } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DebugManager.cpp b/deps/chakrashim/core/lib/Runtime/Debug/DebugManager.cpp index 9b6d8ceabd3..eb1b48e9195 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DebugManager.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/DebugManager.cpp @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" + +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Language/JavascriptStackWalker.h" namespace Js { @@ -231,3 +233,4 @@ AutoSetDispatchHaltFlag::~AutoSetDispatchHaltFlag() Assert(m_scriptContext->GetDebugContext()->GetProbeContainer()->IsPrimaryBrokenToDebuggerContext()); m_scriptContext->GetDebugContext()->GetProbeContainer()->SetIsPrimaryBrokenToDebuggerContext(false); } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DebuggingFlags.cpp b/deps/chakrashim/core/lib/Runtime/Debug/DebuggingFlags.cpp index 181c4fa82ad..13ba6c87a68 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DebuggingFlags.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/DebuggingFlags.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING //static DebuggingFlags::DebuggingFlags() : m_forceInterpreter(false), @@ -75,3 +76,4 @@ void DebuggingFlags::SetIsBuiltInWrapperPresent(bool value /* = true */) { m_isBuiltInWrapperPresent = value; } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DiagHelperMethodWrapper.cpp b/deps/chakrashim/core/lib/Runtime/Debug/DiagHelperMethodWrapper.cpp index a2445a6c83f..cfb75493a43 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DiagHelperMethodWrapper.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/DiagHelperMethodWrapper.cpp @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" + +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Language/JavascriptStackWalker.h" namespace Js @@ -268,3 +270,4 @@ namespace Js template void HandleHelperOrLibraryMethodWrapperException(ScriptContext * scriptContext, JavascriptExceptionObject * exceptionObject); template void HandleHelperOrLibraryMethodWrapperException (ScriptContext * scriptContext, JavascriptExceptionObject * exceptionObject); } // namespace Js +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DiagObjectModel.cpp b/deps/chakrashim/core/lib/Runtime/Debug/DiagObjectModel.cpp index 4f971362d05..4848fd5e912 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DiagObjectModel.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/DiagObjectModel.cpp @@ -4,6 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING // Parser includes #include "CharClassifier.h" // TODO: clean up the need of these regex related header here just for GroupInfo needed in JavascriptRegExpConstructor @@ -269,8 +270,13 @@ namespace Js } else { - Js::JavascriptString *builtInName = ParseFunctionName(returnValue->calledFunction->GetDisplayName(), pResolvedObject->scriptContext); - swprintf_s(finalName, RETURN_VALUE_MAX_NAME, _u("[%s returned]"), builtInName->GetSz()); + ENTER_PINNED_SCOPE(JavascriptString, displayName); + displayName = returnValue->calledFunction->GetDisplayName(); + + const char16 *builtInName = ParseFunctionName(displayName->GetString(), displayName->GetLength(), pResolvedObject->scriptContext); + swprintf_s(finalName, RETURN_VALUE_MAX_NAME, _u("[%s returned]"), builtInName); + + LEAVE_PINNED_SCOPE(); } pResolvedObject->obj = returnValue->returnedValue; defaultAttributes |= DBGPROP_ATTRIB_VALUE_READONLY; @@ -288,24 +294,21 @@ namespace Js // The debugger uses the functionNameId field instead of the "name" property to get the name of the funtion. The functionNameId field is overloaded and may contain the display name if // toString() has been called on the function object. For built-in or external functions the display name can be something like "function Echo() { native code }". We will try to parse the // function name out of the display name so the user will see just the function name e.g. "Echo" instead of the full display name in debugger. - JavascriptString * VariableWalkerBase::ParseFunctionName(JavascriptString* displayName, ScriptContext* scriptContext) + const char16 * VariableWalkerBase::ParseFunctionName(const char16 * displayNameBuffer, const charcount_t displayNameBufferLength, ScriptContext* scriptContext) { - Assert(displayName); - const char16 * displayNameBuffer = displayName->GetString(); - const charcount_t displayNameBufferLength = displayName->GetLength(); const charcount_t funcStringLength = _countof(JS_DISPLAY_STRING_FUNCTION_HEADER) - 1; // discount the ending null character in string literal const charcount_t templateStringLength = funcStringLength + _countof(JS_DISPLAY_STRING_FUNCTION_BODY) - 1; // discount the ending null character in string literal // If the string doesn't meet our expected format; return the original string. if (displayNameBufferLength <= templateStringLength || (wmemcmp(displayNameBuffer, JS_DISPLAY_STRING_FUNCTION_HEADER, funcStringLength) != 0)) { - return displayName; + return displayNameBuffer; } // Look for the left parenthesis, if we don't find one; return the original string. const char16* parenChar = wcschr(displayNameBuffer, '('); if (parenChar == nullptr) { - return displayName; + return displayNameBuffer; } charcount_t actualFunctionNameLength = displayNameBufferLength - templateStringLength; @@ -313,17 +316,12 @@ namespace Js char16 * actualFunctionNameBuffer = AnewArray(GetArenaFromContext(scriptContext), char16, actualFunctionNameLength + 1); // The last character will be the null character. if (actualFunctionNameBuffer == nullptr) { - return displayName; + return displayNameBuffer; } js_memcpy_s(actualFunctionNameBuffer, byteLengthForCopy, displayNameBuffer + funcStringLength, byteLengthForCopy); actualFunctionNameBuffer[actualFunctionNameLength] = _u('\0'); - JavascriptString * actualFunctionName = JavascriptString::NewWithArenaSz(actualFunctionNameBuffer, scriptContext); - if (actualFunctionName == nullptr) - { - return displayName; - } - return actualFunctionName; + return actualFunctionNameBuffer; } /*static*/ @@ -612,7 +610,7 @@ namespace Js ArenaAllocator *arena = pFrame->GetArena(); ScopeSlots slotArray = GetSlotArray(); - if (slotArray.IsFunctionScopeSlotArray()) + if (!slotArray.IsDebuggerScopeSlotArray()) { DebuggerScope *formalScope = GetScopeWhenHaltAtFormals(); bool isInParamScope = IsInParamScope(formalScope, pFrame); @@ -962,7 +960,11 @@ namespace Js // DiagScopeVariablesWalker DiagScopeVariablesWalker::DiagScopeVariablesWalker(DiagStackFrame* _pFrame, Var _instance, IDiagObjectModelWalkerBase* innerWalker) - : VariableWalkerBase(_pFrame, _instance, UIGroupType_InnerScope, /* allowLexicalThis */ false) + : VariableWalkerBase(_pFrame, _instance, UIGroupType_InnerScope, /* allowLexicalThis */ false), + pDiagScopeObjects(nullptr), + diagScopeVarCount(0), + scopeIsInitialized(false), // false until end of method + enumWithScopeAlso(false) { ScriptContext * scriptContext = _pFrame->GetScriptContext(); ArenaAllocator *arena = GetArenaFromContext(scriptContext); @@ -2474,19 +2476,9 @@ namespace Js { if (propertyId == Constants::NoProperty) { - if (VirtualTableInfo::HasVirtualTable(obj)) - { - // If we have a property string, it is assumed that the propertyId is being - // kept alive with the object - PropertyString * propertyString = (PropertyString *)obj; - propertyId = propertyString->GetPropertyRecord()->GetPropertyId(); - } - else - { - const PropertyRecord* propertyRecord; - objectContext->GetOrAddPropertyRecord(obj, &propertyRecord); - propertyId = propertyRecord->GetPropertyId(); - } + const PropertyRecord* propertyRecord; + objectContext->GetOrAddPropertyRecord(obj, &propertyRecord); + propertyId = propertyRecord->GetPropertyId(); } // MoveAndGetNext shouldn't return an internal property id Assert(!Js::IsInternalPropertyId(propertyId)); @@ -2600,6 +2592,7 @@ namespace Js // We need to special-case RegExp constructor here because it has some special properties (above) and some // special enumerable properties which should all show up in the debugger. JavascriptRegExpConstructor* regExp = scriptContext->GetLibrary()->GetRegExpConstructor(); + Js::JavascriptFunction* jsFunction = Js::JavascriptFunction::FromVar(object); if (regExp == object) { @@ -2615,7 +2608,7 @@ namespace Js InsertItem(originalObject, object, propertyId, isConst, isUnscoped, &pMethodsGroupWalker); } } - else if (Js::JavascriptFunction::FromVar(object)->IsScriptFunction() || Js::JavascriptFunction::FromVar(object)->IsBoundFunction()) + else if ((jsFunction->IsScriptFunction() && !jsFunction->IsJsBuiltIn()) || jsFunction->IsBoundFunction()) { // Adding special property length for the ScriptFunction, like it is done in JavascriptFunction::GetSpecialNonEnumerablePropertyName InsertItem(originalObject, object, PropertyIds::length, true/*not editable*/, false /*isUnscoped*/, &pMethodsGroupWalker); @@ -3278,9 +3271,9 @@ namespace Js BOOL RecyclableTypedArrayAddress::Set(Var updateObject) { - if (Js::TypedArrayBase::Is(parentArray)) + Js::TypedArrayBase* typedArrayObj = JavascriptOperators::TryFromVar(parentArray); + if (typedArrayObj) { - Js::TypedArrayBase* typedArrayObj = Js::TypedArrayBase::FromVar(parentArray); return typedArrayObj->SetItem(index, updateObject, PropertyOperation_None); } @@ -3298,9 +3291,9 @@ namespace Js BOOL RecyclableTypedArrayDisplay::HasChildren() { - if (Js::TypedArrayBase::Is(instance)) + Js::TypedArrayBase* typedArrayObj = JavascriptOperators::TryFromVar(instance); + if (typedArrayObj) { - Js::TypedArrayBase* typedArrayObj = Js::TypedArrayBase::FromVar(instance); if (typedArrayObj->GetLength() > 0) { return TRUE; @@ -4094,15 +4087,15 @@ namespace Js // The scope is defined by a slot array object so grab the function body out to get the function name. ScopeSlots slotArray = ScopeSlots(reinterpret_cast(instance)); - if(slotArray.IsFunctionScopeSlotArray()) + if(slotArray.IsDebuggerScopeSlotArray()) { - Js::FunctionBody *functionBody = slotArray.GetFunctionInfo()->GetFunctionBody(); - return functionBody->GetDisplayName(); + // handling for block/catch scope + return _u(""); } else { - // handling for block/catch scope - return _u(""); + Js::FunctionBody *functionBody = slotArray.GetFunctionInfo()->GetFunctionBody(); + return functionBody->GetDisplayName(); } } } @@ -4402,3 +4395,4 @@ namespace Js #endif // #ifdef ENABLE_SIMDJS } +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DiagObjectModel.h b/deps/chakrashim/core/lib/Runtime/Debug/DiagObjectModel.h index ee3b86dc061..6c42ace1599 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DiagObjectModel.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/DiagObjectModel.h @@ -218,7 +218,7 @@ namespace Js bool IsPropertyValid(PropertyId propertyId, RegSlot location, bool *isPropertyInDebuggerScope, bool* isConst, bool* isInDeadZone) const; private: - static JavascriptString * ParseFunctionName(JavascriptString* displayName, ScriptContext* scriptContext); + static const char16 * ParseFunctionName(const char16* displayNameBuffer, const charcount_t displayNameBufferLength, ScriptContext* scriptContext); }; diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DiagProbe.cpp b/deps/chakrashim/core/lib/Runtime/Debug/DiagProbe.cpp index d0c8597c0fb..b96a82d8aaa 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DiagProbe.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/DiagProbe.cpp @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" + +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Language/InterpreterStackFrame.h" #define InvalidScriptId 0xFFFFFFFF @@ -384,3 +386,4 @@ namespace Js } } } +#endif diff --git a/deps/chakrashim/core/lib/Runtime/Debug/DiagStackFrame.cpp b/deps/chakrashim/core/lib/Runtime/Debug/DiagStackFrame.cpp index 0348c3a5c1b..a1fc0985d87 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/DiagStackFrame.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/DiagStackFrame.cpp @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" + +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Language/JavascriptFunctionArgIndex.h" #include "Language/InterpreterStackFrame.h" #include "Language/JavascriptStackWalker.h" @@ -356,8 +358,7 @@ namespace Js #endif } - Js::Arguments args(1, (Js::Var*) &varThis); - varResult = pfuncScript->CallFunction(args); + varResult = CALL_FUNCTION(pfuncScript->GetScriptContext()->GetThreadContext(), pfuncScript, CallInfo(1), varThis); debugManager->UpdateConsoleScope(dummyObject, scriptContext); @@ -652,3 +653,4 @@ namespace Js } } // namespace Js +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/ProbeContainer.cpp b/deps/chakrashim/core/lib/Runtime/Debug/ProbeContainer.cpp index 2a7227912f8..c534c63e413 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/ProbeContainer.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/ProbeContainer.cpp @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" + +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Language/JavascriptStackWalker.h" #include "Language/InterpreterStackFrame.h" @@ -1133,3 +1135,4 @@ namespace Js } #endif } // namespace Js. +#endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Debug/RuntimeDebugPch.h b/deps/chakrashim/core/lib/Runtime/Debug/RuntimeDebugPch.h index f8f7db3b548..a3806cd0346 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/RuntimeDebugPch.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/RuntimeDebugPch.h @@ -5,6 +5,7 @@ #pragma once #include "Runtime.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #ifdef ENABLE_MUTATION_BREAKPOINT // Not enabled in ChakraCore #include "activdbg_private.h" @@ -25,3 +26,4 @@ #ifdef ENABLE_MUTATION_BREAKPOINT #include "Debug/MutationBreakpoint.h" #endif +#endif diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTActionEvents.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTActionEvents.cpp index 060c2aadd7c..97089378c86 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTActionEvents.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTActionEvents.cpp @@ -536,6 +536,26 @@ namespace TTD } } + void LessThanAction_Execute(const EventLogEntry* evt, ThreadContextTTD* executeContext) + { + TTD_REPLAY_ACTIVE_CONTEXT(executeContext); + const JsRTDoubleVarSingleScalarArgumentAction* action = GetInlineEventDataAs(evt); + Js::Var object1 = InflateVarInReplay(executeContext, GetVarItem_0(action)); + TTD_REPLAY_VALIDATE_INCOMING_REFERENCE(object1, ctx); + Js::Var object2 = InflateVarInReplay(executeContext, GetVarItem_1(action)); + TTD_REPLAY_VALIDATE_INCOMING_REFERENCE(object2, ctx); + + //Result is not needed but trigger computation for any effects + if (GetScalarItem_0(action)) + { + Js::JavascriptOperators::LessEqual(object1, object2, ctx); + } + else + { + Js::JavascriptOperators::Less(object1, object2, ctx); + } + } + void GetPropertyIdFromSymbolAction_Execute(const EventLogEntry* evt, ThreadContextTTD* executeContext) { TTD_REPLAY_ACTIVE_CONTEXT(executeContext); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTActionEvents.h b/deps/chakrashim/core/lib/Runtime/Debug/TTActionEvents.h index 14b00f931a4..51113d6d88d 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTActionEvents.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTActionEvents.h @@ -492,6 +492,7 @@ namespace TTD void HasOwnPropertyAction_Execute(const EventLogEntry* evt, ThreadContextTTD* executeContext); void InstanceOfAction_Execute(const EventLogEntry* evt, ThreadContextTTD* executeContext); void EqualsAction_Execute(const EventLogEntry* evt, ThreadContextTTD* executeContext); + void LessThanAction_Execute(const EventLogEntry* evt, ThreadContextTTD* executeContext); void GetPropertyIdFromSymbolAction_Execute(const EventLogEntry* evt, ThreadContextTTD* executeContext); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTEventLog.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTEventLog.cpp index 4366f4f4cbc..38d4951342f 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTEventLog.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTEventLog.cpp @@ -551,6 +551,7 @@ namespace TTD TTD_CREATE_EVENTLIST_VTABLE_ENTRY_COMMON(HasOwnPropertyActionTag, ContextAPIWrapper, JsRTSingleVarScalarArgumentAction, HasOwnPropertyAction_Execute); TTD_CREATE_EVENTLIST_VTABLE_ENTRY_COMMON(InstanceOfActionTag, ContextAPIWrapper, JsRTDoubleVarArgumentAction, InstanceOfAction_Execute); TTD_CREATE_EVENTLIST_VTABLE_ENTRY_COMMON(EqualsActionTag, ContextAPIWrapper, JsRTDoubleVarSingleScalarArgumentAction, EqualsAction_Execute); + TTD_CREATE_EVENTLIST_VTABLE_ENTRY_COMMON(LessThanActionTag, ContextAPIWrapper, JsRTDoubleVarSingleScalarArgumentAction, LessThanAction_Execute); TTD_CREATE_EVENTLIST_VTABLE_ENTRY_COMMON(GetPropertyIdFromSymbolTag, ContextAPINoScriptWrapper, JsRTSingleVarArgumentAction, GetPropertyIdFromSymbolAction_Execute); @@ -821,8 +822,8 @@ namespace TTD if(tEvent->InfoString.Length != infoStrLength) { - wprintf(_u("New Telemetry Msg: %ls\n"), infoStr); - wprintf(_u("Original Telemetry Msg: %ls\n"), tEvent->InfoString.Contents); + Output::Print(_u("New Telemetry Msg: %ls\n"), infoStr); + Output::Print(_u("Original Telemetry Msg: %ls\n"), tEvent->InfoString.Contents); TTDAssert(false, "Telemetry messages differ??"); } else @@ -831,8 +832,8 @@ namespace TTD { if(tEvent->InfoString.Contents[i] != infoStr[i]) { - wprintf(_u("New Telemetry Msg: %ls\n"), infoStr); - wprintf(_u("Original Telemetry Msg: %ls\n"), tEvent->InfoString.Contents); + Output::Print(_u("New Telemetry Msg: %ls\n"), infoStr); + Output::Print(_u("Original Telemetry Msg: %ls\n"), tEvent->InfoString.Contents); TTDAssert(false, "Telemetry messages differ??"); break; @@ -1198,7 +1199,8 @@ namespace TTD bool EventLog::IsTimeForSnapshot() const { - return (this->m_elapsedExecutionTimeSinceSnapshot > this->m_threadContext->TTDContext->SnapInterval); + return this->m_threadContext->TTDContext->SnapInterval == 0 // if SnapInterval is 0, we'll always snapshot irrespective of when last one was taken + || (this->m_elapsedExecutionTimeSinceSnapshot > this->m_threadContext->TTDContext->SnapInterval); } void EventLog::PruneLogLength() @@ -2200,6 +2202,17 @@ namespace TTD actionPopper.InitializeWithEventAndEnter(evt); } + void EventLog::RecordJsRTLessThan(TTDJsRTActionResultAutoRecorder& actionPopper, Js::Var var1, Js::Var var2, bool allowsEqual) + { + NSLogEvents::JsRTDoubleVarSingleScalarArgumentAction* gpAction = nullptr; + NSLogEvents::EventLogEntry* evt = this->RecordGetInitializedEvent(&gpAction); + NSLogEvents::SetVarItem_0(gpAction, TTD_CONVERT_JSVAR_TO_TTDVAR(var1)); + NSLogEvents::SetVarItem_1(gpAction, TTD_CONVERT_JSVAR_TO_TTDVAR(var2)); + NSLogEvents::SetScalarItem_0(gpAction, allowsEqual); + + actionPopper.InitializeWithEventAndEnter(evt); + } + void EventLog::RecordJsRTGetPropertyIdFromSymbol(TTDJsRTActionResultAutoRecorder& actionPopper, Js::Var sym) { NSLogEvents::JsRTSingleVarArgumentAction* gpAction = nullptr; @@ -2559,7 +2572,7 @@ namespace TTD writer.WriteSequenceStart_DefaultKey(NSTokens::Separator::CommaSeparator); writer.AdjustIndent(1); - writer.WriteSeperator(NSTokens::Separator::BigSpaceSeparator); + writer.WriteSeparator(NSTokens::Separator::BigSpaceSeparator); for(auto iter = this->m_eventList.GetIteratorAtFirst(); iter.IsValid(); iter.MoveNext()) { const NSLogEvents::EventLogEntry* evt = iter.Current(); @@ -2595,7 +2608,7 @@ namespace TTD { writer.AdjustIndent(1); - writer.WriteSeperator(NSTokens::Separator::BigSpaceSeparator); + writer.WriteSeparator(NSTokens::Separator::BigSpaceSeparator); firstElem = true; } } @@ -2607,7 +2620,7 @@ namespace TTD if(!isJsRTCall & !isExternalCall & !isRegisterCall) { writer.AdjustIndent(-1); - writer.WriteSeperator(NSTokens::Separator::BigSpaceSeparator); + writer.WriteSeparator(NSTokens::Separator::BigSpaceSeparator); } writer.WriteSequenceEnd(); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTEventLog.h b/deps/chakrashim/core/lib/Runtime/Debug/TTEventLog.h index eed4d5fa3c8..d3d7b06b66d 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTEventLog.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTEventLog.h @@ -560,6 +560,7 @@ namespace TTD void RecordJsRTHasOwnProperty(TTDJsRTActionResultAutoRecorder& actionPopper, const Js::PropertyRecord* pRecord, Js::Var var); void RecordJsRTInstanceOf(TTDJsRTActionResultAutoRecorder& actionPopper, Js::Var object, Js::Var constructor); void RecordJsRTEquals(TTDJsRTActionResultAutoRecorder& actionPopper, Js::Var var1, Js::Var var2, bool doStrict); + void RecordJsRTLessThan(TTDJsRTActionResultAutoRecorder& actionPopper, Js::Var var1, Js::Var var2, bool allowsEqual); //Record getters with native results void RecordJsRTGetPropertyIdFromSymbol(TTDJsRTActionResultAutoRecorder& actionPopper, Js::Var sym); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTEvents.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTEvents.cpp index 77a8edbf46d..d337b1693b2 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTEvents.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTEvents.cpp @@ -62,9 +62,9 @@ namespace TTD writer->WriteRecordEnd(); } - EventKind EventLogEntry_ParseHeader(bool readSeperator, FileReader* reader) + EventKind EventLogEntry_ParseHeader(bool readSeparator, FileReader* reader) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); return reader->ReadTag(NSTokens::Key::eventKind); } diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTEvents.h b/deps/chakrashim/core/lib/Runtime/Debug/TTEvents.h index bcf7703f2b5..1b84c70f180 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTEvents.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTEvents.h @@ -142,6 +142,7 @@ namespace TTD HasPropertyActionTag, InstanceOfActionTag, EqualsActionTag, + LessThanActionTag, GetPropertyIdFromSymbolTag, @@ -256,7 +257,7 @@ namespace TTD //Helpers for initializing, emitting and parsing the basic event data void EventLogEntry_Emit(const EventLogEntry* evt, EventLogEntryVTableEntry* evtFPVTable, FileWriter* writer, ThreadContext* threadContext, NSTokens::Separator separator); - EventKind EventLogEntry_ParseHeader(bool readSeperator, FileReader* reader); + EventKind EventLogEntry_ParseHeader(bool readSeparator, FileReader* reader); void EventLogEntry_ParseRest(EventLogEntry* evt, EventLogEntryVTableEntry* evtFPVTable, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc); bool EventFailsWithRuntimeError(const EventLogEntry* evt); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTExecutionInfo.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTExecutionInfo.cpp index 72c792a823b..5f2cf2dd15c 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTExecutionInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTExecutionInfo.cpp @@ -128,10 +128,10 @@ namespace TTD } else { - printf("BP: { bpId: %I64i, ctx: %I64u, topId: %I32u, fline: %I32u, fcolumn: %I32u, line: %I32u, column: %I32u }", this->m_bpId, this->m_sourceScriptLogId, this->m_topLevelBodyId, this->m_functionLine, this->m_functionColumn, this->m_line, this->m_column); + wprintf(_u("BP: { bpId: %I64i, ctx: %I64u, topId: %I32u, fline: %I32u, fcolumn: %I32u, line: %I32u, column: %I32u }"), this->m_bpId, this->m_sourceScriptLogId, this->m_topLevelBodyId, this->m_functionLine, this->m_functionColumn, this->m_line, this->m_column); if(this->m_etime != -1) { - printf(" TTDTime: { etime: %I64i, ftime: %I64i, ltime: %I64i }", this->m_etime, this->m_ftime, this->m_ltime); + wprintf(_u(" TTDTime: { etime: %I64i, ftime: %I64i, ltime: %I64i }"), this->m_etime, this->m_ftime, this->m_ltime); } } } diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTInflateMap.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTInflateMap.cpp index 40043343010..045e559b128 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTInflateMap.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTInflateMap.cpp @@ -322,34 +322,34 @@ namespace TTD case StepKind::Empty: break; case StepKind::Root: - wprintf(_u("root#%I64i"), this->m_step.IndexOrPID); + Output::Print(_u("root#%I64i"), this->m_step.IndexOrPID); break; case StepKind::PropertyData: - wprintf(_u("%ls%ls"), (isFirst ? _u("") : _u(".")), namebuff); + Output::Print(_u("%ls%ls"), (isFirst ? _u("") : _u(".")), namebuff); break; case StepKind::PropertyGetter: - wprintf(_u("%ls<%ls"), (isFirst ? _u("") : _u(".")), namebuff); + Output::Print(_u("%ls<%ls"), (isFirst ? _u("") : _u(".")), namebuff); break; case StepKind::PropertySetter: - wprintf(_u("%ls>%ls"), (isFirst ? _u("") : _u(".")), namebuff); + Output::Print(_u("%ls>%ls"), (isFirst ? _u("") : _u(".")), namebuff); break; case StepKind::Array: - wprintf(_u("[%I64i]"), this->m_step.IndexOrPID); + Output::Print(_u("[%I64i]"), this->m_step.IndexOrPID); break; case StepKind::Scope: - wprintf(_u("%ls_scope[%I64i]"), (isFirst ? _u("") : _u(".")), this->m_step.IndexOrPID); + Output::Print(_u("%ls_scope[%I64i]"), (isFirst ? _u("") : _u(".")), this->m_step.IndexOrPID); break; case StepKind::SlotArray: - wprintf(_u("%ls_slots[%I64i]"), (isFirst ? _u("") : _u(".")), this->m_step.IndexOrPID); + Output::Print(_u("%ls_slots[%I64i]"), (isFirst ? _u("") : _u(".")), this->m_step.IndexOrPID); break; case StepKind::FunctionBody: - wprintf(_u("%ls%ls"), (isFirst ? _u("") : _u(".")), this->m_step.OptName); + Output::Print(_u("%ls%ls"), (isFirst ? _u("") : _u(".")), this->m_step.OptName); break; case StepKind::Special: - wprintf(_u("%ls_%ls"), (isFirst ? _u("") : _u(".")), this->m_step.OptName); + Output::Print(_u("%ls_%ls"), (isFirst ? _u("") : _u(".")), this->m_step.OptName); break; case StepKind::SpecialArray: - wprintf(_u("%ls_%ls[%I64i]"), (isFirst ? _u("") : _u(".")), this->m_step.OptName, this->m_step.IndexOrPID); + Output::Print(_u("%ls_%ls[%I64i]"), (isFirst ? _u("") : _u(".")), this->m_step.OptName, this->m_step.IndexOrPID); break; default: TTDAssert(false, "Unknown tag in switch statement!!!"); @@ -358,7 +358,7 @@ namespace TTD if(printNewline) { - wprintf(_u("\n")); + Output::Print(_u("\n")); } } @@ -423,8 +423,8 @@ namespace TTD { if(this->CurrentPath != nullptr) { - wprintf(_u("Snap1 ptrid: *0x%I64x\n"), this->CurrentH1Ptr); - wprintf(_u("Snap2 ptrid: *0x%I64x\n"), this->CurrentH2Ptr); + Output::Print(_u("Snap1 ptrid: *0x%I64x\n"), this->CurrentH1Ptr); + Output::Print(_u("Snap2 ptrid: *0x%I64x\n"), this->CurrentH2Ptr); this->CurrentPath->WritePathToConsole(this->Context, true, this->PathBuffer, PATH_BUFFER_COUNT); } } diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTRuntmeInfoTracker.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTRuntmeInfoTracker.cpp index 26922951390..a9531072c84 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTRuntmeInfoTracker.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTRuntmeInfoTracker.cpp @@ -789,12 +789,24 @@ namespace TTD this->EnqueueRootPathObject(_u("_identityFunction"), ctx->GetLibrary()->GetIdentityFunction()); this->EnqueueRootPathObject(_u("_throwerFunction"), ctx->GetLibrary()->GetThrowerFunction()); } - + // ArrayIteratorPrototype is not created when we have JsBuiltins, it it created on-demand only +#ifdef ENABLE_JS_BUILTINS + if (ctx->IsJsBuiltInEnabled()) + { + ctx->GetLibrary()->EnsureBuiltInEngineIsReady(); + } +#endif this->EnqueueRootPathObject(_u("_arrayIteratorPrototype"), ctx->GetLibrary()->GetArrayIteratorPrototype()); this->EnqueueRootPathObject(_u("_mapIteratorPrototype"), ctx->GetLibrary()->GetMapIteratorPrototype()); this->EnqueueRootPathObject(_u("_setIteratorPrototype"), ctx->GetLibrary()->GetSetIteratorPrototype()); this->EnqueueRootPathObject(_u("_stringIteratorPrototype"), ctx->GetLibrary()->GetStringIteratorPrototype()); + this->EnqueueRootPathObject(_u("_generatorNextFunction"), ctx->GetLibrary()->EnsureGeneratorNextFunction()); + this->EnqueueRootPathObject(_u("_generatorReturnFunction"), ctx->GetLibrary()->EnsureGeneratorReturnFunction()); + this->EnqueueRootPathObject(_u("_generatorThrowFunction"), ctx->GetLibrary()->EnsureGeneratorThrowFunction()); + this->EnqueueRootPathObject(_u("_generatorFunctionConstructor"), ctx->GetLibrary()->GetGeneratorFunctionConstructor()); + this->EnqueueRootPathObject(_u("_asyncFunctionConstructor"), ctx->GetLibrary()->GetAsyncFunctionConstructor()); + uint32 counter = 0; while(!this->m_worklist.Empty()) { @@ -833,7 +845,7 @@ namespace TTD else { Js::Var pitem = nullptr; - BOOL isproperty = Js::JavascriptOperators::GetOwnProperty(curr, precord->GetPropertyId(), &pitem, ctx); + BOOL isproperty = Js::JavascriptOperators::GetOwnProperty(curr, precord->GetPropertyId(), &pitem, ctx, nullptr); TTDAssert(isproperty, "Not sure what went wrong."); this->EnqueueNewPathVarAsNeeded(curr, pitem, precord, nullptr); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSerialize.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTSerialize.cpp index a507d4229b0..e13cf267c7a 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSerialize.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSerialize.cpp @@ -177,7 +177,7 @@ namespace TTD NSTokens::CleanupKeyNamesArray(&(this->m_keyNameArray), &(this->m_keyNameLengthArray)); } - void TextFormatWriter::WriteSeperator(NSTokens::Separator separator) + void TextFormatWriter::WriteSeparator(NSTokens::Separator separator) { if((separator & NSTokens::Separator::CommaSeparator) == NSTokens::Separator::CommaSeparator) { @@ -211,7 +211,7 @@ namespace TTD void TextFormatWriter::WriteKey(NSTokens::Key key, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); TTDAssert(1 <= (uint32)key && (uint32)key < (uint32)NSTokens::Key::Count, "Key not in valid range!"); const char16* kname = this->m_keyNameArray[(uint32)key]; @@ -223,7 +223,7 @@ namespace TTD void TextFormatWriter::WriteSequenceStart(NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawChar(_u('[')); } @@ -231,13 +231,13 @@ namespace TTD { TTDAssert(separator == NSTokens::Separator::NoSeparator || separator == NSTokens::Separator::BigSpaceSeparator, "Shouldn't be anything else!!!"); - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawChar(_u(']')); } void TextFormatWriter::WriteRecordStart(NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawChar(_u('{')); } @@ -245,7 +245,7 @@ namespace TTD { TTDAssert(separator == NSTokens::Separator::NoSeparator || separator == NSTokens::Separator::BigSpaceSeparator, "Shouldn't be anything else!!!"); - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawChar(_u('}')); } @@ -261,14 +261,14 @@ namespace TTD void TextFormatWriter::WriteNakedNull(NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawCharBuff(_u("null"), 4); } void TextFormatWriter::WriteNakedByte(byte val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("%I32u"), (uint32)val); } @@ -287,31 +287,31 @@ namespace TTD void TextFormatWriter::WriteNakedInt32(int32 val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("%I32i"), val); } void TextFormatWriter::WriteNakedUInt32(uint32 val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("%I32u"), val); } void TextFormatWriter::WriteNakedInt64(int64 val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("%I64i"), val); } void TextFormatWriter::WriteNakedUInt64(uint64 val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("%I64u"), val); } void TextFormatWriter::WriteNakedDouble(double val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); if(Js::JavascriptNumber::IsNan(val)) { @@ -357,19 +357,19 @@ namespace TTD void TextFormatWriter::WriteNakedAddr(TTD_PTR_ID val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("*%I64u"), val); } void TextFormatWriter::WriteNakedLogTag(TTD_LOG_PTR_ID val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("!%I64i"), val); } void TextFormatWriter::WriteNakedTag(uint32 tagvalue, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("$%I32i"), tagvalue); } @@ -377,7 +377,7 @@ namespace TTD void TextFormatWriter::WriteNakedString(const TTString& val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); if(IsNullPtrTTString(val)) { @@ -395,7 +395,7 @@ namespace TTD void TextFormatWriter::WriteNakedWellKnownToken(TTD_WELLKNOWN_TOKEN val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawChar(_u('~')); this->WriteRawCharBuff(val, wcslen(val)); @@ -404,7 +404,7 @@ namespace TTD void TextFormatWriter::WriteInlineCode(_In_reads_(length) const char16* code, uint32 length, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("@%I32u"), length); @@ -415,7 +415,7 @@ namespace TTD void TextFormatWriter::WriteInlinePropertyRecordName(_In_reads_(length) const char16* pname, uint32 length, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteFormattedCharData(_u("@%I32u"), length); @@ -435,7 +435,7 @@ namespace TTD ; } - void BinaryFormatWriter::WriteSeperator(NSTokens::Separator separator) + void BinaryFormatWriter::WriteSeparator(NSTokens::Separator separator) { if((separator & NSTokens::Separator::CommaSeparator) == NSTokens::Separator::CommaSeparator) { @@ -445,31 +445,31 @@ namespace TTD void BinaryFormatWriter::WriteKey(NSTokens::Key key, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed((byte)key); } void BinaryFormatWriter::WriteSequenceStart(NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed('['); } void BinaryFormatWriter::WriteSequenceEnd(NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(']'); } void BinaryFormatWriter::WriteRecordStart(NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed('{'); } void BinaryFormatWriter::WriteRecordEnd(NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed('}'); } @@ -485,13 +485,13 @@ namespace TTD void BinaryFormatWriter::WriteNakedNull(NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed((byte)0); } void BinaryFormatWriter::WriteNakedByte(byte val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(val); } @@ -503,55 +503,55 @@ namespace TTD void BinaryFormatWriter::WriteNakedInt32(int32 val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(val); } void BinaryFormatWriter::WriteNakedUInt32(uint32 val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(val); } void BinaryFormatWriter::WriteNakedInt64(int64 val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(val); } void BinaryFormatWriter::WriteNakedUInt64(uint64 val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(val); } void BinaryFormatWriter::WriteNakedDouble(double val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(val); } void BinaryFormatWriter::WriteNakedAddr(TTD_PTR_ID val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(val); } void BinaryFormatWriter::WriteNakedLogTag(TTD_LOG_PTR_ID val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(val); } void BinaryFormatWriter::WriteNakedTag(uint32 tagvalue, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(tagvalue); } void BinaryFormatWriter::WriteNakedString(const TTString& val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); if(IsNullPtrTTString(val)) { @@ -566,7 +566,7 @@ namespace TTD void BinaryFormatWriter::WriteNakedWellKnownToken(TTD_WELLKNOWN_TOKEN val, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); uint32 charLen = (uint32)wcslen(val); this->WriteRawByteBuff_Fixed(charLen); @@ -575,7 +575,7 @@ namespace TTD void BinaryFormatWriter::WriteInlineCode(_In_reads_(length) const char16* code, uint32 length, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(length); this->WriteRawByteBuff((const byte*)code, length * sizeof(char16)); @@ -583,7 +583,7 @@ namespace TTD void BinaryFormatWriter::WriteInlinePropertyRecordName(_In_reads_(length) const char16* pname, uint32 length, NSTokens::Separator separator) { - this->WriteSeperator(separator); + this->WriteSeparator(separator); this->WriteRawByteBuff_Fixed(length); this->WriteRawByteBuff((const byte*)pname, length * sizeof(char16)); @@ -1175,7 +1175,7 @@ namespace TTD NSTokens::CleanupKeyNamesArray(&(this->m_keyNameArray), &(this->m_keyNameLengthArray)); } - void TextFormatReader::ReadSeperator(bool readSeparator) + void TextFormatReader::ReadSeparator(bool readSeparator) { if(readSeparator) { @@ -1186,7 +1186,7 @@ namespace TTD void TextFormatReader::ReadKey(NSTokens::Key keyCheck, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); //We do a special scan here for a key (instead of the more general scan we call elsewhere) NSTokens::ParseTokenKind tok = this->ScanKey(this->m_charListPrimary); @@ -1207,7 +1207,7 @@ namespace TTD void TextFormatReader::ReadSequenceStart(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListDiscard); TTDAssert(tok == NSTokens::ParseTokenKind::LBrack, "Error in parse."); @@ -1221,7 +1221,7 @@ namespace TTD void TextFormatReader::ReadRecordStart(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListDiscard); TTDAssert(tok == NSTokens::ParseTokenKind::LCurly, "Error in parse."); @@ -1235,7 +1235,7 @@ namespace TTD void TextFormatReader::ReadNakedNull(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListDiscard); TTDAssert(tok == NSTokens::ParseTokenKind::Null, "Error in parse."); @@ -1243,7 +1243,7 @@ namespace TTD byte TextFormatReader::ReadNakedByte(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse."); @@ -1266,7 +1266,7 @@ namespace TTD int32 TextFormatReader::ReadNakedInt32(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse."); @@ -1279,7 +1279,7 @@ namespace TTD uint32 TextFormatReader::ReadNakedUInt32(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse."); @@ -1292,7 +1292,7 @@ namespace TTD int64 TextFormatReader::ReadNakedInt64(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse."); @@ -1302,7 +1302,7 @@ namespace TTD uint64 TextFormatReader::ReadNakedUInt64(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse."); @@ -1312,7 +1312,7 @@ namespace TTD double TextFormatReader::ReadNakedDouble(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); @@ -1352,7 +1352,7 @@ namespace TTD TTD_PTR_ID TextFormatReader::ReadNakedAddr(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::Address, "Error in parse."); @@ -1362,7 +1362,7 @@ namespace TTD TTD_LOG_PTR_ID TextFormatReader::ReadNakedLogTag(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::LogTag, "Error in parse."); @@ -1372,7 +1372,7 @@ namespace TTD uint32 TextFormatReader::ReadNakedTag(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::EnumTag, "Error in parse."); @@ -1387,7 +1387,7 @@ namespace TTD void TextFormatReader::ReadNakedString(SlabAllocator& alloc, TTString& into, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::String || tok == NSTokens::ParseTokenKind::Null, "Error in parse."); @@ -1404,7 +1404,7 @@ namespace TTD void TextFormatReader::ReadNakedString(UnlinkableSlabAllocator& alloc, TTString& into, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::String || tok == NSTokens::ParseTokenKind::Null, "Error in parse."); @@ -1421,7 +1421,7 @@ namespace TTD TTD_WELLKNOWN_TOKEN TextFormatReader::ReadNakedWellKnownToken(SlabAllocator& alloc, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::WellKnownToken, "Error in parse."); @@ -1432,7 +1432,7 @@ namespace TTD TTD_WELLKNOWN_TOKEN TextFormatReader::ReadNakedWellKnownToken(UnlinkableSlabAllocator& alloc, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::WellKnownToken, "Error in parse."); @@ -1443,7 +1443,7 @@ namespace TTD void TextFormatReader::ReadInlineCode(_Out_writes_(length) char16* code, uint32 length, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt); TTDAssert(tok == NSTokens::ParseTokenKind::String, "Error in parse."); @@ -1462,7 +1462,7 @@ namespace TTD ; } - void BinaryFormatReader::ReadSeperator(bool readSeparator) + void BinaryFormatReader::ReadSeparator(bool readSeparator) { if(readSeparator) { @@ -1475,7 +1475,7 @@ namespace TTD void BinaryFormatReader::ReadKey(NSTokens::Key keyCheck, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); byte key = 0; this->ReadBytesInto_Fixed(key); @@ -1485,7 +1485,7 @@ namespace TTD void BinaryFormatReader::ReadSequenceStart(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); byte tok = 0; this->ReadBytesInto_Fixed(tok); @@ -1503,7 +1503,7 @@ namespace TTD void BinaryFormatReader::ReadRecordStart(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); byte tok = 0; this->ReadBytesInto_Fixed(tok); @@ -1521,7 +1521,7 @@ namespace TTD void BinaryFormatReader::ReadNakedNull(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); byte tok = 0; this->ReadBytesInto_Fixed(tok); @@ -1531,7 +1531,7 @@ namespace TTD byte BinaryFormatReader::ReadNakedByte(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); byte b = 0; this->ReadBytesInto_Fixed(b); @@ -1551,7 +1551,7 @@ namespace TTD int32 BinaryFormatReader::ReadNakedInt32(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); int32 i = 0; this->ReadBytesInto_Fixed(i); @@ -1561,7 +1561,7 @@ namespace TTD uint32 BinaryFormatReader::ReadNakedUInt32(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); uint32 i = 0; this->ReadBytesInto_Fixed(i); @@ -1571,7 +1571,7 @@ namespace TTD int64 BinaryFormatReader::ReadNakedInt64(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); int64 i = 0; this->ReadBytesInto_Fixed(i); @@ -1581,7 +1581,7 @@ namespace TTD uint64 BinaryFormatReader::ReadNakedUInt64(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); uint64 i = 0; this->ReadBytesInto_Fixed(i); @@ -1591,7 +1591,7 @@ namespace TTD double BinaryFormatReader::ReadNakedDouble(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); double d = 0.0; this->ReadBytesInto_Fixed(d); @@ -1601,7 +1601,7 @@ namespace TTD TTD_PTR_ID BinaryFormatReader::ReadNakedAddr(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); TTD_PTR_ID addr = TTD_INVALID_PTR_ID; this->ReadBytesInto_Fixed(addr); @@ -1611,7 +1611,7 @@ namespace TTD TTD_LOG_PTR_ID BinaryFormatReader::ReadNakedLogTag(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); TTD_LOG_PTR_ID tag = TTD_INVALID_LOG_PTR_ID; this->ReadBytesInto_Fixed(tag); @@ -1621,7 +1621,7 @@ namespace TTD uint32 BinaryFormatReader::ReadNakedTag(bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); uint32 tag = 0; this->ReadBytesInto_Fixed(tag); @@ -1631,7 +1631,7 @@ namespace TTD void BinaryFormatReader::ReadNakedString(SlabAllocator& alloc, TTString& into, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); uint32 sizeField = 0; this->ReadBytesInto_Fixed(sizeField); @@ -1650,7 +1650,7 @@ namespace TTD void BinaryFormatReader::ReadNakedString(UnlinkableSlabAllocator& alloc, TTString& into, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); uint32 sizeField = 0; this->ReadBytesInto_Fixed(sizeField); @@ -1669,7 +1669,7 @@ namespace TTD TTD_WELLKNOWN_TOKEN BinaryFormatReader::ReadNakedWellKnownToken(SlabAllocator& alloc, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); uint32 charLen = 0; this->ReadBytesInto_Fixed(charLen); @@ -1683,7 +1683,7 @@ namespace TTD TTD_WELLKNOWN_TOKEN BinaryFormatReader::ReadNakedWellKnownToken(UnlinkableSlabAllocator& alloc, bool readSeparator) { - this->ReadSeperator(readSeparator); + this->ReadSeparator(readSeparator); uint32 charLen = 0; this->ReadBytesInto_Fixed(charLen); @@ -1742,9 +1742,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseDiagnosticOriginInformation(DiagnosticOrigin& info, bool readSeperator, FileReader* reader) + void ParseDiagnosticOriginInformation(DiagnosticOrigin& info, bool readSeparator, FileReader* reader) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); info.SourceLine = reader->ReadInt32(NSTokens::Key::line); info.EventTime = reader->ReadUInt32(NSTokens::Key::eventTime, true); info.TimeHash = reader->ReadUInt64(NSTokens::Key::u64Val, true); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSerialize.h b/deps/chakrashim/core/lib/Runtime/Debug/TTSerialize.h index e71e10beb0d..587e071b057 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSerialize.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSerialize.h @@ -24,7 +24,7 @@ namespace TTD { namespace NSTokens { - //Seperator tokens for records + //Separator tokens for records enum class Separator : byte { NoSeparator = 0x0, @@ -187,7 +187,7 @@ namespace TTD //// - virtual void WriteSeperator(NSTokens::Separator separator) = 0; + virtual void WriteSeparator(NSTokens::Separator separator) = 0; virtual void WriteKey(NSTokens::Key key, NSTokens::Separator separator = NSTokens::Separator::NoSeparator) = 0; void WriteLengthValue(uint32 length, NSTokens::Separator separator = NSTokens::Separator::NoSeparator); @@ -270,7 +270,7 @@ namespace TTD //// - virtual void WriteSeperator(NSTokens::Separator separator) override; + virtual void WriteSeparator(NSTokens::Separator separator) override; virtual void WriteKey(NSTokens::Key key, NSTokens::Separator separator = NSTokens::Separator::NoSeparator) override; virtual void WriteSequenceStart(NSTokens::Separator separator = NSTokens::Separator::NoSeparator) override; @@ -317,7 +317,7 @@ namespace TTD //// - virtual void WriteSeperator(NSTokens::Separator separator) override; + virtual void WriteSeparator(NSTokens::Separator separator) override; virtual void WriteKey(NSTokens::Key key, NSTokens::Separator separator = NSTokens::Separator::NoSeparator) override; virtual void WriteSequenceStart(NSTokens::Separator separator = NSTokens::Separator::NoSeparator) override; @@ -506,7 +506,7 @@ namespace TTD FileReader(JsTTDStreamHandle handle, TTDReadBytesFromStreamCallback pfRead, TTDFlushAndCloseStreamCallback pfClose); virtual ~FileReader(); - virtual void ReadSeperator(bool readSeparator) = 0; + virtual void ReadSeparator(bool readSeparator) = 0; virtual void ReadKey(NSTokens::Key keyCheck, bool readSeparator = false) = 0; uint32 ReadLengthValue(bool readSeparator = false); @@ -620,7 +620,7 @@ namespace TTD TextFormatReader(JsTTDStreamHandle handle, TTDReadBytesFromStreamCallback pfRead, TTDFlushAndCloseStreamCallback pfClose); virtual ~TextFormatReader(); - virtual void ReadSeperator(bool readSeparator) override; + virtual void ReadSeparator(bool readSeparator) override; virtual void ReadKey(NSTokens::Key keyCheck, bool readSeparator = false) override; virtual void ReadSequenceStart(bool readSeparator = false) override; @@ -662,7 +662,7 @@ namespace TTD BinaryFormatReader(JsTTDStreamHandle handle, TTDReadBytesFromStreamCallback pfRead, TTDFlushAndCloseStreamCallback pfClose); virtual ~BinaryFormatReader(); - virtual void ReadSeperator(bool readSeparator) override; + virtual void ReadSeparator(bool readSeparator) override; virtual void ReadKey(NSTokens::Key keyCheck, bool readSeparator = false) override; virtual void ReadSequenceStart(bool readSeparator = false) override; @@ -715,7 +715,7 @@ namespace TTD void SetDiagnosticOriginInformation(DiagnosticOrigin& info, uint32 sourceLine, uint64 eTime, uint64 fTime, uint64 lTime); void EmitDiagnosticOriginInformation(const DiagnosticOrigin& info, FileWriter* writer, NSTokens::Separator separator); - void ParseDiagnosticOriginInformation(DiagnosticOrigin& info, bool readSeperator, FileReader* reader); + void ParseDiagnosticOriginInformation(DiagnosticOrigin& info, bool readSeparator, FileReader* reader); #endif #if ENABLE_BASIC_TRACE || ENABLE_FULL_BC_TRACE diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSerializeEnum.h b/deps/chakrashim/core/lib/Runtime/Debug/TTSerializeEnum.h index 4e996598200..167a4ae5f02 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSerializeEnum.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSerializeEnum.h @@ -140,5 +140,12 @@ ENTRY_SERIALIZE_ENUM(restoreLogTag) ENTRY_SERIALIZE_ENUM(restoreIdentityTag) ENTRY_SERIALIZE_ENUM(logDir) +ENTRY_SERIALIZE_ENUM(frame_slotArray) +ENTRY_SERIALIZE_ENUM(arguments_values) +ENTRY_SERIALIZE_ENUM(target) +ENTRY_SERIALIZE_ENUM(reject) +ENTRY_SERIALIZE_ENUM(resolve) +ENTRY_SERIALIZE_ENUM(argument) + #undef ENTRY_SERIALIZE_ENUM diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapObjects.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapObjects.cpp index a406d483932..110628e9bab 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapObjects.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapObjects.cpp @@ -3,6 +3,9 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeDebugPch.h" +#include "Library/JavascriptGenerator.h" +#include "Language/InterpreterStackFrame.h" +#include "Library/JavascriptPromise.h" #if ENABLE_TTD @@ -158,7 +161,7 @@ namespace TTD if(Js::IsInternalPropertyId(pid)) { propertyReset.Clear(); - return true; + return true; } //someone added a property that is not simple to remove so let's just be safe an recreate contexts @@ -288,7 +291,7 @@ namespace TTD // //We assume that placing properties back in the same order we read them out produces correct results. //This is not true for enumeration -- but we handle this by explicit logging - //There may also be sensitivity in other cases -- e.g. activataion objects with arguments objects that use slot index values directly. + //There may also be sensitivity in other cases -- e.g. activation objects with arguments objects that use slot index values directly. // Things look good in this case but future changes may require care and/or adding special case handling. // for(uint32 i = 0; i < handler->MaxPropertyIndex; ++i) @@ -328,7 +331,7 @@ namespace TTD { //get the value to see if it is alreay ok Js::Var currentValue = nullptr; - Js::JavascriptOperators::GetOwnProperty(obj, pid, ¤tValue, obj->GetScriptContext()); + Js::JavascriptOperators::GetOwnProperty(obj, pid, ¤tValue, obj->GetScriptContext(), nullptr); if(currentValue == pVal) { @@ -403,8 +406,6 @@ namespace TTD if(snpObject->SnapType->HasNoEnumerableProperties != obj->GetDynamicType()->GetHasNoEnumerableProperties()) { - TTDAssert(!obj->GetDynamicType()->GetIsShared(), "This is shared so we are mucking something up."); - obj->GetDynamicType()->SetHasNoEnumerableProperties(snpObject->SnapType->HasNoEnumerableProperties); } } @@ -499,9 +500,9 @@ namespace TTD writer->WriteRecordEnd(NSTokens::Separator::BigSpaceSeparator); } - void ParseObject(SnapObject* snpObject, bool readSeperator, FileReader* reader, SlabAllocator& alloc, const SnapObjectVTable* vtable, const TTDIdentifierDictionary& ptrIdToTypeMap) + void ParseObject(SnapObject* snpObject, bool readSeparator, FileReader* reader, SlabAllocator& alloc, const SnapObjectVTable* vtable, const TTDIdentifierDictionary& ptrIdToTypeMap) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); snpObject->ObjectPtrId = reader->ReadAddr(NSTokens::Key::objectId); snpObject->SnapObjectTag = reader->ReadTag(NSTokens::Key::objectType, true); @@ -740,33 +741,44 @@ namespace TTD { Js::ScriptFunction* fobj = Js::ScriptFunction::FromVar(obj); SnapScriptFunctionInfo* snapFuncInfo = SnapObjectGetAddtlInfoAs(snpObject); + DoAddtlValueInstantiation_SnapScriptFunctionInfoEx(snapFuncInfo, fobj, inflator); + } + + void DoAddtlValueInstantiation_SnapScriptFunctionInfoEx(const SnapScriptFunctionInfo* snapFuncInfo, Js::ScriptFunction* func, InflateMap* inflator) + { + func->SetHasSuperReference(snapFuncInfo->HasSuperReference); if(snapFuncInfo->CachedScopeObjId != TTD_INVALID_PTR_ID) { - fobj->SetCachedScope(Js::ActivationObjectEx::FromVar(inflator->LookupObject(snapFuncInfo->CachedScopeObjId))); + func->SetCachedScope(Js::ActivationObjectEx::FromVar(inflator->LookupObject(snapFuncInfo->CachedScopeObjId))); } if(snapFuncInfo->HomeObjId != TTD_INVALID_PTR_ID) { - fobj->SetHomeObj(inflator->LookupObject(snapFuncInfo->HomeObjId)); + func->SetHomeObj(inflator->LookupObject(snapFuncInfo->HomeObjId)); } if(snapFuncInfo->ScopeId != TTD_INVALID_PTR_ID) { Js::FrameDisplay* environment = inflator->LookupEnvironment(snapFuncInfo->ScopeId); - fobj->SetEnvironment(environment); + func->SetEnvironment(environment); } if(snapFuncInfo->ComputedNameInfo != nullptr) { Js::Var cNameVar = inflator->InflateTTDVar(snapFuncInfo->ComputedNameInfo); - fobj->SetComputedNameVar(cNameVar); + func->SetComputedNameVar(cNameVar); } } void EmitAddtlInfo_SnapScriptFunctionInfo(const SnapObject* snpObject, FileWriter* writer) { SnapScriptFunctionInfo* snapFuncInfo = SnapObjectGetAddtlInfoAs(snpObject); + EmitAddtlInfo_SnapScriptFunctionInfoEx(snapFuncInfo, writer); + } + + void EmitAddtlInfo_SnapScriptFunctionInfoEx(const SnapScriptFunctionInfo* snapFuncInfo, FileWriter* writer) + { writer->WriteAddr(NSTokens::Key::functionBodyId, snapFuncInfo->BodyRefId, NSTokens::Separator::CommaAndBigSpaceSeparator); @@ -784,9 +796,13 @@ namespace TTD void ParseAddtlInfo_SnapScriptFunctionInfo(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc) { SnapScriptFunctionInfo* snapFuncInfo = alloc.SlabAllocateStruct(); + ParseAddtlInfo_SnapScriptFunctionInfoEx(snapFuncInfo, reader, alloc); + SnapObjectSetAddtlInfoAs(snpObject, snapFuncInfo); + } + void ParseAddtlInfo_SnapScriptFunctionInfoEx(SnapScriptFunctionInfo* snapFuncInfo, FileReader* reader, SlabAllocator& alloc) + { snapFuncInfo->BodyRefId = reader->ReadAddr(NSTokens::Key::functionBodyId, true); - reader->ReadString(NSTokens::Key::name, alloc, snapFuncInfo->DebugFunctionName, true); snapFuncInfo->CachedScopeObjId = reader->ReadAddr(NSTokens::Key::cachedScopeObjId, true); snapFuncInfo->ScopeId = reader->ReadAddr(NSTokens::Key::scopeId, true); @@ -796,8 +812,6 @@ namespace TTD snapFuncInfo->ComputedNameInfo = NSSnapValues::ParseTTDVar(false, reader); snapFuncInfo->HasSuperReference = reader->ReadBool(NSTokens::Key::boolVal, true); - - SnapObjectSetAddtlInfoAs(snpObject, snapFuncInfo); } #if ENABLE_SNAPSHOT_COMPARE @@ -1476,7 +1490,7 @@ namespace TTD { SnapRegexInfo* regexInfo = alloc.SlabAllocateStruct(); - reader->ReadString(NSTokens::Key::stringVal, alloc, regexInfo->RegexStr, true); + reader->ReadString(NSTokens::Key::stringVal, alloc, regexInfo->RegexStr, true); regexInfo->Flags = reader->ReadTag(NSTokens::Key::attributeFlags, true); regexInfo->LastIndexOrFlag = reader->ReadUInt32(NSTokens::Key::u32Val, true); @@ -1999,7 +2013,7 @@ namespace TTD if(snpObject->SnapType->JsTypeId == Js::TypeIds_Map) { Js::JavascriptMap* mobj = (Js::JavascriptMap*)obj; - for(uint32 i = 0; i < mapInfo->MapSize; i+=2) + for(uint32 i = 0; i < mapInfo->MapSize; i += 2) { Js::Var key = inflator->InflateTTDVar(mapInfo->MapKeyValueArray[i]); Js::Var data = inflator->InflateTTDVar(mapInfo->MapKeyValueArray[i + 1]); @@ -2027,7 +2041,7 @@ namespace TTD if(mapInfo->MapSize > 0) { writer->WriteSequenceStart_DefaultKey(NSTokens::Separator::CommaSeparator); - for(uint32 i = 0; i < mapInfo->MapSize; i+=2) + for(uint32 i = 0; i < mapInfo->MapSize; i += 2) { writer->WriteSequenceStart(i != 0 ? NSTokens::Separator::CommaAndBigSpaceSeparator : NSTokens::Separator::BigSpaceSeparator); NSSnapValues::EmitTTDVar(mapInfo->MapKeyValueArray[i], writer, NSTokens::Separator::NoSeparator); @@ -2052,7 +2066,7 @@ namespace TTD mapInfo->MapKeyValueArray = alloc.SlabAllocateArray(mapInfo->MapSize); reader->ReadSequenceStart_WDefaultKey(true); - for(uint32 i = 0; i < mapInfo->MapSize; i+=2) + for(uint32 i = 0; i < mapInfo->MapSize; i += 2) { reader->ReadSequenceStart(i != 0); mapInfo->MapKeyValueArray[i] = NSSnapValues::ParseTTDVar(false, reader); @@ -2128,6 +2142,444 @@ namespace TTD compareMap.CheckConsistentAndAddPtrIdMapping_Special(proxyInfo1->TargetId, proxyInfo2->TargetId, _u("targetId")); } #endif + + ////////////////// + + Js::RecyclableObject* DoObjectInflation_SnapGeneratorInfo(const SnapObject* snpObject, InflateMap* inflator) + { + Js::ScriptContext* ctx = inflator->LookupScriptContext(snpObject->SnapType->ScriptContextLogId); + + SnapGeneratorInfo* generatorInfo = SnapObjectGetAddtlInfoAs(snpObject); + + Field(Js::Var)* argVals = nullptr; + if(generatorInfo->arguments_count > 0) + { + argVals = RecyclerNewArray(ctx->GetRecycler(), Field(Js::Var), generatorInfo->arguments_count); + for(Js::RegSlot i = 0; i < generatorInfo->arguments_count; i++) + { + argVals[i] = inflator->InflateTTDVar(generatorInfo->arguments_values[i]); + } + } + + Js::CallInfo callInfo(static_cast(generatorInfo->arguments_callInfo_flags), generatorInfo->arguments_callInfo_count, false /*unusedBool*/); + + Js::Arguments arguments(callInfo, (Js::Var*)argVals); + + // TODO: BUGBUG - figure out how to determine what the prototype was. Just use GetNull() for now + Js::RecyclableObject* prototype = ctx->GetLibrary()->GetNull(); + //if (generatorInfo->generatorPrototype == 1) { + // prototype = ctx->GetLibrary()->GetNull(); + //} + //else if (generatorInfo->generatorPrototype == 2) { + // prototype = ctx->GetLibrary()->CreateGeneratorConstructorPrototypeObject(); + //} + //else { + // //TTDAssert(false, "unexpected prototype found JavascriptGenerator"); + //} + + //Js::DynamicType* type = reinterpret_cast((snpObject->SnapType->TypePtrId != TTD_INVALID_PTR_ID) ? inflator->LookupType(snpObject->SnapType->TypePtrId): nullptr); + + return ctx->GetLibrary()->CreateJavascriptGenerator_TTD(ctx, prototype, arguments, static_cast(generatorInfo->state)); + } + + void DoAddtlValueInstantiation_SnapGeneratorInfo(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator) + { + Js::ScriptContext* ctx = inflator->LookupScriptContext(snpObject->SnapType->ScriptContextLogId); + Js::JavascriptGenerator* generator = reinterpret_cast(obj); + + SnapGeneratorInfo* generatorInfo = SnapObjectGetAddtlInfoAs(snpObject); + Js::ScriptFunction* scriptFunction = reinterpret_cast((generatorInfo->scriptFunction != TTD_INVALID_PTR_ID) ? inflator->LookupObject(generatorInfo->scriptFunction) : nullptr); + if (scriptFunction != nullptr) + { + generator->SetScriptFunction(scriptFunction); + Js::FunctionBody* executeFunction = scriptFunction->GetFunctionBody(); + +#if ENABLE_PROFILE_INFO + // call EnsureDynamicProfileInfo or we get asserts in some cases when creating the InterpreterStackFrame + executeFunction->EnsureDynamicProfileInfo(); +#endif + bool doProfile = Js::InterpreterStackFrame::ShouldDoProfile(executeFunction); + + Js::InterpreterStackFrame* frame = Js::InterpreterStackFrame::CreateInterpreterStackFrameForGenerator(scriptFunction, executeFunction, generator, doProfile); + TTDAssert(generator->GetFrame() == frame, "unexpected frame mis-match"); + + Field(Js::Var)* frameSlotArray = nullptr; + if (generatorInfo->frame_slotCount != 0) + { + frameSlotArray = RecyclerNewArray(ctx->GetRecycler(), Field(Js::Var), generatorInfo->frame_slotCount); + + for (Js::RegSlot i = 0; i < generatorInfo->frame_slotCount; i++) + { + if (generatorInfo->frame_slotArray[i] != nullptr) + { + frameSlotArray[i] = inflator->InflateTTDVar(generatorInfo->frame_slotArray[i]); + } + else + { + frameSlotArray[i] = nullptr; + } + } + } + + generator->SetFrameSlots(generatorInfo->frame_slotCount, frameSlotArray); + if (generatorInfo->byteCodeReader_offset > 0) + { + frame->InitializeClosures(); + frame->GetReader()->SetCurrentOffset(generatorInfo->byteCodeReader_offset); + } + } + else + { + TTDAssert(generator->IsCompleted(), "Unexpected null scriptFunction when generator is not in completed state"); + } + } + + void EmitAddtlInfo_SnapGeneratorInfo(const SnapObject* snpObject, FileWriter* writer) + { + SnapGeneratorInfo* sgi = SnapObjectGetAddtlInfoAs(snpObject); + + writer->WriteInt32(NSTokens::Key::i32Val, sgi->generatorPrototype, NSTokens::Separator::CommaSeparator); + + writer->WriteInt32(NSTokens::Key::i32Val, sgi->frame_slotCount, NSTokens::Separator::CommaSeparator); + + // frame_slotArray + writer->WriteKey(NSTokens::Key::frame_slotArray, NSTokens::Separator::CommaAndBigSpaceSeparator); + writer->WriteSequenceStart(); + for(Js::RegSlot i = 0; i < sgi->frame_slotCount; ++i) + { + NSSnapValues::EmitTTDVar(sgi->frame_slotArray[i], writer, i != 0 ? NSTokens::Separator::CommaSeparator : NSTokens::Separator::NoSeparator); + } + writer->WriteSequenceEnd(); + + writer->WriteUInt32(NSTokens::Key::u32Val, sgi->state, NSTokens::Separator::CommaSeparator); + writer->WriteAddr(NSTokens::Key::objectId, sgi->scriptFunction, NSTokens::Separator::CommaSeparator); + + writer->WriteUInt32(NSTokens::Key::u32Val, sgi->arguments_callInfo_count, NSTokens::Separator::CommaSeparator); + writer->WriteUInt32(NSTokens::Key::u32Val, sgi->arguments_callInfo_flags, NSTokens::Separator::CommaSeparator); + writer->WriteUInt32(NSTokens::Key::u32Val, sgi->arguments_count, NSTokens::Separator::CommaSeparator); + + // arguments_values array + writer->WriteKey(NSTokens::Key::arguments_values, NSTokens::Separator::CommaAndBigSpaceSeparator); + writer->WriteSequenceStart(); + for(uint32 i = 0; i < sgi->arguments_count; ++i) + { + NSSnapValues::EmitTTDVar(sgi->arguments_values[i], writer, i != 0 ? NSTokens::Separator::CommaSeparator : NSTokens::Separator::NoSeparator); + } + writer->WriteSequenceEnd(); + + writer->WriteUInt32(NSTokens::Key::u32Val, sgi->byteCodeReader_offset, NSTokens::Separator::CommaSeparator); + } + + void ParseAddtlInfo_SnapGeneratorInfo(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc) + { + SnapGeneratorInfo* sgi = alloc.SlabAllocateStruct(); + + sgi->generatorPrototype = reader->ReadInt32(NSTokens::Key::i32Val, true); + + sgi->frame_slotCount = reader->ReadInt32(NSTokens::Key::i32Val, true); + + if(sgi->frame_slotCount == 0) + { + sgi->frame_slotArray = nullptr; + } + else + { + sgi->frame_slotArray = alloc.SlabAllocateArray(sgi->frame_slotCount); + } + reader->ReadKey(NSTokens::Key::frame_slotArray, true); + reader->ReadSequenceStart(); + for(Js::RegSlot i = 0; i < sgi->frame_slotCount; ++i) + { + sgi->frame_slotArray[i] = NSSnapValues::ParseTTDVar(i != 0, reader); + } + reader->ReadSequenceEnd(); + + + sgi->state = reader->ReadUInt32(NSTokens::Key::u32Val, true); + sgi->scriptFunction = reader->ReadAddr(NSTokens::Key::objectId, true); + sgi->arguments_callInfo_count = reader->ReadUInt32(NSTokens::Key::u32Val, true); + sgi->arguments_callInfo_flags = static_cast(reader->ReadUInt32(NSTokens::Key::u32Val, true)); + sgi->arguments_count = reader->ReadUInt32(NSTokens::Key::u32Val, true); + + if(sgi->arguments_count == 0) + { + sgi->arguments_values = nullptr; + } + else + { + sgi->arguments_values = alloc.SlabAllocateArray(sgi->arguments_count); + } + reader->ReadKey(NSTokens::Key::arguments_values, true); + reader->ReadSequenceStart(); + for(uint32 i = 0; i < sgi->arguments_count; ++i) + { + sgi->arguments_values[i] = NSSnapValues::ParseTTDVar(i != 0, reader); + } + reader->ReadSequenceEnd(); + + sgi->byteCodeReader_offset = reader->ReadUInt32(NSTokens::Key::u32Val, true); + + SnapObjectSetAddtlInfoAs(snpObject, sgi); + } + +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapGeneratorInfo(const SnapObject *sobj1, const SnapObject *sobj2, TTDCompareMap &compareMap) + { + // TODO + } +#endif + + //////////////////// + + Js::RecyclableObject* DoObjectInflation_SnapGeneratorFunctionInfo(const SnapObject *snpObject, InflateMap *inflator) + { + Js::ScriptContext *ctx = inflator->LookupScriptContext(snpObject->SnapType->ScriptContextLogId); + SnapGeneratorFunctionInfo *sfi = SnapObjectGetAddtlInfoAs(snpObject); + Js::JavascriptGeneratorFunction* func = ctx->GetLibrary()->CreateGeneratorFunction(Js::JavascriptGeneratorFunction::EntryGeneratorFunctionImplementation, sfi->isAnonymousFunction); + return func; + } + + void DoAddtlValueInstantiation_SnapGeneratorFunctionInfo(const SnapObject *snpObject, Js::RecyclableObject *obj, InflateMap *inflator) + { + Js::JavascriptGeneratorFunction *func = Js::JavascriptGeneratorFunction::FromVar(obj); + SnapGeneratorFunctionInfo *sfi = SnapObjectGetAddtlInfoAs(snpObject); + + if(sfi->scriptFunction != TTD_INVALID_PTR_ID) + { + Js::GeneratorVirtualScriptFunction* gvsf = reinterpret_cast(inflator->LookupObject(sfi->scriptFunction)); + func->SetScriptFunction(gvsf); + } + } + + void EmitAddtlInfo_SnapGeneratorFunctionInfo(const SnapObject *snpObject, FileWriter *writer) + { + SnapGeneratorFunctionInfo* sgfi = SnapObjectGetAddtlInfoAs(snpObject); + writer->WriteAddr(NSTokens::Key::objectId, sgfi->scriptFunction, NSTokens::Separator::CommaSeparator); + writer->WriteBool(NSTokens::Key::boolVal, sgfi->isAnonymousFunction, NSTokens::Separator::CommaSeparator); + } + + void ParseAddtlInfo_SnapGeneratorFunctionInfo(SnapObject *snpObject, FileReader *reader, SlabAllocator &alloc) + { + SnapGeneratorFunctionInfo* sgfi = alloc.SlabAllocateStruct(); + sgfi->scriptFunction = reader->ReadAddr(NSTokens::Key::objectId, true); + sgfi->isAnonymousFunction = reader->ReadBool(NSTokens::Key::boolVal, true); + SnapObjectSetAddtlInfoAs(snpObject, sgfi); + } +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapGeneratorFunctionInfo(const SnapObject *sobj1, const SnapObject *sobj2, TTDCompareMap &compareMap) + { + // TODO + } +#endif + //////////////////// + + Js::RecyclableObject* DoObjectInflation_SnapAsyncFunction(const SnapObject *snpObject, InflateMap *inflator) + { + Js::ScriptContext* ctx = inflator->LookupScriptContext(snpObject->SnapType->ScriptContextLogId); + SnapGeneratorFunctionInfo* info = SnapObjectGetAddtlInfoAs(snpObject); + Js::JavascriptAsyncFunction* func = ctx->GetLibrary()->CreateAsyncFunction(Js::JavascriptAsyncFunction::EntryAsyncFunctionImplementation, info->isAnonymousFunction); + return func; + } + + void DoAddtlValueInstantiation_SnapAsyncFunction(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator) + { + Js::JavascriptAsyncFunction* func = Js::JavascriptAsyncFunction::FromVar(obj); + SnapGeneratorFunctionInfo* info = SnapObjectGetAddtlInfoAs(snpObject); + + if (info->scriptFunction != TTD_INVALID_PTR_ID) + { + Js::GeneratorVirtualScriptFunction* gvsf = reinterpret_cast(inflator->LookupObject(info->scriptFunction)); + func->SetScriptFunction(gvsf); + } + } + + void EmitAddtlInfo_SnapAsyncFunction(const SnapObject* snpObject, FileWriter* writer) + { + SnapGeneratorFunctionInfo* info = SnapObjectGetAddtlInfoAs(snpObject); + writer->WriteAddr(NSTokens::Key::objectId, info->scriptFunction, NSTokens::Separator::CommaSeparator); + writer->WriteBool(NSTokens::Key::boolVal, info->isAnonymousFunction, NSTokens::Separator::CommaSeparator); + } + + void ParseAddtlInfo_SnapAsyncFunction(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc) + { + SnapGeneratorFunctionInfo* info = alloc.SlabAllocateStruct(); + info->scriptFunction = reader->ReadAddr(NSTokens::Key::objectId, true); + info->isAnonymousFunction = reader->ReadBool(NSTokens::Key::boolVal, true); + SnapObjectSetAddtlInfoAs(snpObject, info); + } +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapAsyncFunction(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap) + { + } +#endif + + //////////////////// + + Js::RecyclableObject* DoObjectInflation_SnapGeneratorVirtualScriptFunctionInfo(const SnapObject *snpObject, InflateMap *inflator) + { + Js::ScriptContext *ctx = inflator->LookupScriptContext(snpObject->SnapType->ScriptContextLogId); + SnapGeneratorVirtualScriptFunctionInfo* sgvsf = SnapObjectGetAddtlInfoAs(snpObject); + Js::FunctionBody* fbody = inflator->LookupFunctionBody(sgvsf->BodyRefId); + return ctx->GetLibrary()->CreateGeneratorVirtualScriptFunction(fbody); + } + + void DoAddtlValueInstantiation_SnapGeneratorVirtualScriptFunctionInfo(const SnapObject *snpObject, Js::RecyclableObject *obj, InflateMap *inflator) + { + Js::GeneratorVirtualScriptFunction* fobj = reinterpret_cast(obj); + SnapGeneratorVirtualScriptFunctionInfo *sgvsf = SnapObjectGetAddtlInfoAs(snpObject); + + // fill in all the details of the base class + DoAddtlValueInstantiation_SnapScriptFunctionInfoEx(sgvsf, fobj, inflator); + + if(sgvsf->realFunction != TTD_INVALID_PTR_ID) + { + fobj->SetRealGeneratorFunction(reinterpret_cast(inflator->LookupObject(sgvsf->realFunction))); + } + } + + void EmitAddtlInfo_SnapGeneratorVirtualScriptFunctionInfo(const SnapObject *snpObject, FileWriter *writer) + { + SnapGeneratorVirtualScriptFunctionInfo* sgvsf = SnapObjectGetAddtlInfoAs(snpObject); + EmitAddtlInfo_SnapScriptFunctionInfoEx(sgvsf, writer); + writer->WriteAddr(NSTokens::Key::objectId, sgvsf->realFunction, NSTokens::Separator::CommaSeparator); + } + + void ParseAddtlInfo_SnapGeneratorVirtualScriptFunctionInfo(SnapObject *snpObject, FileReader *reader, SlabAllocator &alloc) + { + SnapGeneratorVirtualScriptFunctionInfo* sgvsf = alloc.SlabAllocateStruct(); + ParseAddtlInfo_SnapScriptFunctionInfoEx(sgvsf, reader, alloc); + sgvsf->realFunction = reader->ReadAddr(NSTokens::Key::objectId, true); + SnapObjectSetAddtlInfoAs(snpObject, sgvsf); + } +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapGeneratorVirtualScriptFunctionInfo(const SnapObject *sobj1, const SnapObject *sobj2, TTDCompareMap &compareMap) + { + // TODO + } +#endif + + //////////////////// + + Js::RecyclableObject* DoObjectInflation_SnapJavascriptPromiseAsyncSpawnExecutorFunction(const SnapObject *snpObject, InflateMap *inflator) + { + Js::ScriptContext *ctx = inflator->LookupScriptContext(snpObject->SnapType->ScriptContextLogId); + SnapJavascriptPromiseAsyncSpawnExecutorFunctionInfo* info = SnapObjectGetAddtlInfoAs(snpObject); + Js::Var target = (info->target!= nullptr) ? inflator->InflateTTDVar(info->target) : nullptr; + + Js::JavascriptGenerator* generator = nullptr; + if (info->generator != TTD_INVALID_PTR_ID) + { + generator = reinterpret_cast(inflator->LookupObject(info->generator)); + } + + // TODO; why do we need to cast here?? + Js::RecyclableObject* res = reinterpret_cast(ctx->GetLibrary()->CreatePromiseAsyncSpawnExecutorFunction(generator, target)); + return res; + } + + void DoAddtlValueInstantiation_SnapJavascriptPromiseAsyncSpawnExecutorFunction(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator) + { + } + + void EmitAddtlInfo_SnapJavascriptPromiseAsyncSpawnExecutorFunction(const SnapObject* snpObject, FileWriter* writer) + { + SnapJavascriptPromiseAsyncSpawnExecutorFunctionInfo* info = SnapObjectGetAddtlInfoAs(snpObject); + writer->WriteAddr(NSTokens::Key::objectId, info->generator, NSTokens::Separator::CommaSeparator); + writer->WriteKey(NSTokens::Key::target, NSTokens::Separator::CommaSeparator); + NSSnapValues::EmitTTDVar(info->target, writer, NSTokens::Separator::NoSeparator); + } + + void ParseAddtlInfo_SnapJavascriptPromiseAsyncSpawnExecutorFunction(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc) + { + SnapJavascriptPromiseAsyncSpawnExecutorFunctionInfo* info = alloc.SlabAllocateStruct(); + info->generator = reader->ReadAddr(NSTokens::Key::objectId, true); + reader->ReadKey(NSTokens::Key::target, true); + info->target= NSSnapValues::ParseTTDVar(false, reader); + SnapObjectSetAddtlInfoAs(snpObject, info); + } +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapJavascriptPromiseAsyncSpawnExecutorFunction(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap) + { + } +#endif + + //////////////////// + + Js::RecyclableObject *DoObjectInflation_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(const SnapObject *snpObject, InflateMap *inflator) + { + Js::ScriptContext *ctx = inflator->LookupScriptContext(snpObject->SnapType->ScriptContextLogId); + SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo* info = SnapObjectGetAddtlInfoAs(snpObject); + Js::Var reject = (info->reject != nullptr) ? inflator->InflateTTDVar(info->reject) : nullptr; + Js::Var resolve = (info->resolve != nullptr) ? inflator->InflateTTDVar(info->resolve) : nullptr; + Js::Var argument = (info->argument != nullptr) ? inflator->InflateTTDVar(info->argument) : nullptr; + bool isReject = info->isReject; + + Js::JavascriptGenerator* generator = nullptr; + if (info->generator != TTD_INVALID_PTR_ID) + { + generator = reinterpret_cast(inflator->LookupObject(info->generator)); + } + + Js::JavascriptMethod entryPoint = nullptr; + switch (info->entryPoint) + { + case 1: + entryPoint = Js::JavascriptPromise::EntryJavascriptPromiseAsyncSpawnStepNextExecutorFunction; + break; + case 2: + entryPoint = Js::JavascriptPromise::EntryJavascriptPromiseAsyncSpawnStepThrowExecutorFunction; + break; + case 3: + entryPoint = Js::JavascriptPromise::EntryJavascriptPromiseAsyncSpawnCallStepExecutorFunction; + break; + default: + TTDAssert(false, "Unexpected value for entryPoint when inflating JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction"); + break; + } + + return ctx->GetLibrary()->CreatePromiseAsyncSpawnStepArgumentExecutorFunction(entryPoint, generator, argument, resolve, reject, isReject); + } + + void DoAddtlValueInstantiation_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator) + { } + + void EmitAddtlInfo_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(const SnapObject* snpObject, FileWriter* writer) + { + SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo* info = SnapObjectGetAddtlInfoAs(snpObject); + writer->WriteAddr(NSTokens::Key::objectId, info->generator, NSTokens::Separator::CommaSeparator); + writer->WriteKey(NSTokens::Key::reject, NSTokens::Separator::CommaSeparator); + NSSnapValues::EmitTTDVar(info->reject, writer, NSTokens::Separator::NoSeparator); + writer->WriteKey(NSTokens::Key::resolve, NSTokens::Separator::CommaSeparator); + NSSnapValues::EmitTTDVar(info->resolve, writer, NSTokens::Separator::NoSeparator); + writer->WriteKey(NSTokens::Key::argument, NSTokens::Separator::CommaSeparator); + NSSnapValues::EmitTTDVar(info->argument, writer, NSTokens::Separator::NoSeparator); + writer->WriteUInt32(NSTokens::Key::u32Val, info->entryPoint, NSTokens::Separator::CommaSeparator); + writer->WriteBool(NSTokens::Key::boolVal, info->isReject, NSTokens::Separator::CommaSeparator); + } + + void ParseAddtlInfo_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc) + { + SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo* info = alloc.SlabAllocateStruct(); + info->generator = reader->ReadAddr(NSTokens::Key::objectId, true); + reader->ReadKey(NSTokens::Key::reject, true); + info->reject = NSSnapValues::ParseTTDVar(false, reader); + reader->ReadKey(NSTokens::Key::resolve, true); + info->resolve = NSSnapValues::ParseTTDVar(false, reader); + reader->ReadKey(NSTokens::Key::argument, true); + info->argument = NSSnapValues::ParseTTDVar(false, reader); + info->entryPoint = reader->ReadUInt32(NSTokens::Key::u32Val, true); + info->isReject = reader->ReadBool(NSTokens::Key::boolVal, true); + SnapObjectSetAddtlInfoAs(snpObject, info); + } + +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap) + { } +#endif + ////////// + + + } } diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapObjects.h b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapObjects.h index ee610c5515f..70340c9f197 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapObjects.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapObjects.h @@ -134,7 +134,7 @@ namespace TTD void EmitObject(const SnapObject* snpObject, FileWriter* writer, NSTokens::Separator separator, const SnapObjectVTable* vtable, ThreadContext* threadContext); //de-serialize a SnapObject - void ParseObject(SnapObject* snpObject, bool readSeperator, FileReader* reader, SlabAllocator& alloc, const SnapObjectVTable* vtable, const TTDIdentifierDictionary& ptrIdToTypeMap); + void ParseObject(SnapObject* snpObject, bool readSeparator, FileReader* reader, SlabAllocator& alloc, const SnapObjectVTable* vtable, const TTDIdentifierDictionary& ptrIdToTypeMap); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap); @@ -187,8 +187,11 @@ namespace TTD Js::RecyclableObject* DoObjectInflation_SnapScriptFunctionInfo(const SnapObject* snpObject, InflateMap* inflator); void DoAddtlValueInstantiation_SnapScriptFunctionInfo(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator); + void DoAddtlValueInstantiation_SnapScriptFunctionInfoEx(const SnapScriptFunctionInfo* snapFuncInfo, Js::ScriptFunction* fobj, InflateMap* inflator); void EmitAddtlInfo_SnapScriptFunctionInfo(const SnapObject* snpObject, FileWriter* writer); void ParseAddtlInfo_SnapScriptFunctionInfo(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc); + void EmitAddtlInfo_SnapScriptFunctionInfoEx(const SnapScriptFunctionInfo* snapFuncInfo, FileWriter* writer); + void ParseAddtlInfo_SnapScriptFunctionInfoEx(SnapScriptFunctionInfo* snapFuncInfo, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv_SnapScriptFunctionInfo(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap); @@ -1031,6 +1034,8 @@ namespace TTD void AssertSnapEquiv_SnapSetInfo(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap); #endif + ////////////////// + //A struct that represents a map (or weakmap) object struct SnapMapInfo { @@ -1075,6 +1080,109 @@ namespace TTD #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv_SnapProxyInfo(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap); #endif + + + ////////////////// + + struct SnapGeneratorFunctionInfo + { + TTD_PTR_ID scriptFunction; // pointer to GeneratorVirtualScriptFunction + bool isAnonymousFunction; + }; + + struct SnapGeneratorVirtualScriptFunctionInfo : SnapScriptFunctionInfo + { + TTD_PTR_ID realFunction; //pointer to JavascriptGeneratorFunction + + }; + + struct SnapAsyncFunctionInfo + { + + }; + + struct SnapGeneratorInfo + { + int generatorPrototype; // 0 == unknown, 1 == nullType, 2 == generatorPrototype + Js::RegSlot frame_slotCount; + TTDVar* frame_slotArray; + uint32 state; // enum value of JavascriptGenerator.GeneratorState + TTD_PTR_ID scriptFunction; + uint32 arguments_callInfo_count; + uint8 arguments_callInfo_flags; + uint arguments_count; + TTDVar* arguments_values; + uint byteCodeReader_offset; + }; + + Js::RecyclableObject* DoObjectInflation_SnapGeneratorInfo(const SnapObject* snpObject, InflateMap* inflator); + void DoAddtlValueInstantiation_SnapGeneratorInfo(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator); + void EmitAddtlInfo_SnapGeneratorInfo(const SnapObject* snpObject, FileWriter* writer); + void ParseAddtlInfo_SnapGeneratorInfo(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc); +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapGeneratorInfo(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap); +#endif + + + Js::RecyclableObject *DoObjectInflation_SnapGeneratorFunctionInfo(const SnapObject *snpObject, InflateMap *inflator); + void DoAddtlValueInstantiation_SnapGeneratorFunctionInfo(const SnapObject *snpObject, Js::RecyclableObject *obj, InflateMap *inflator); + void EmitAddtlInfo_SnapGeneratorFunctionInfo(const SnapObject *snpObject, FileWriter *writer); + void ParseAddtlInfo_SnapGeneratorFunctionInfo(SnapObject *snpObject, FileReader *reader, SlabAllocator &alloc); +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapGeneratorFunctionInfo(const SnapObject *sobj1, const SnapObject *sobj2, TTDCompareMap &compareMap); +#endif + + + Js::RecyclableObject* DoObjectInflation_SnapGeneratorVirtualScriptFunctionInfo(const SnapObject *snpObject, InflateMap *inflator); + void DoAddtlValueInstantiation_SnapGeneratorVirtualScriptFunctionInfo(const SnapObject *snpObject, Js::RecyclableObject *obj, InflateMap *inflator); + void EmitAddtlInfo_SnapGeneratorVirtualScriptFunctionInfo(const SnapObject *snpObject, FileWriter *writer); + void ParseAddtlInfo_SnapGeneratorVirtualScriptFunctionInfo(SnapObject *snpObject, FileReader *reader, SlabAllocator &alloc); +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapGeneratorVirtualScriptFunctionInfo(const SnapObject *sobj1, const SnapObject *sobj2, TTDCompareMap &compareMap); +#endif + + Js::RecyclableObject *DoObjectInflation_SnapAsyncFunction(const SnapObject *snpObject, InflateMap *inflator); + void DoAddtlValueInstantiation_SnapAsyncFunction(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator); + void EmitAddtlInfo_SnapAsyncFunction(const SnapObject* snpObject, FileWriter* writer); + void ParseAddtlInfo_SnapAsyncFunction(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc); +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapAsyncFunction(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap); +#endif + + ////////// + struct SnapJavascriptPromiseAsyncSpawnExecutorFunctionInfo + { + TTD_PTR_ID generator; + TTDVar target; + }; + + Js::RecyclableObject *DoObjectInflation_SnapJavascriptPromiseAsyncSpawnExecutorFunction(const SnapObject *snpObject, InflateMap *inflator); + void DoAddtlValueInstantiation_SnapJavascriptPromiseAsyncSpawnExecutorFunction(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator); + void EmitAddtlInfo_SnapJavascriptPromiseAsyncSpawnExecutorFunction(const SnapObject* snpObject, FileWriter* writer); + void ParseAddtlInfo_SnapJavascriptPromiseAsyncSpawnExecutorFunction(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc); +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapJavascriptPromiseAsyncSpawnExecutorFunction(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap); +#endif + ////////// + + struct SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo + { + TTD_PTR_ID generator; + TTDVar reject; + TTDVar resolve; + bool isReject; + TTDVar argument; + uint32 entryPoint; + }; + + Js::RecyclableObject *DoObjectInflation_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(const SnapObject *snpObject, InflateMap *inflator); + void DoAddtlValueInstantiation_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(const SnapObject* snpObject, Js::RecyclableObject* obj, InflateMap* inflator); + void EmitAddtlInfo_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(const SnapObject* snpObject, FileWriter* writer); + void ParseAddtlInfo_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(SnapObject* snpObject, FileReader* reader, SlabAllocator& alloc); +#if ENABLE_SNAPSHOT_COMPARE + void AssertSnapEquiv_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo(const SnapObject* sobj1, const SnapObject* sobj2, TTDCompareMap& compareMap); +#endif + ////////// } } diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapTypes.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapTypes.cpp index 2210986539c..9aa4500aed6 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapTypes.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapTypes.cpp @@ -95,9 +95,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseSnapPropertyRecord(SnapPropertyRecord* sRecord, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void ParseSnapPropertyRecord(SnapPropertyRecord* sRecord, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); sRecord->PropertyId = reader->ReadUInt32(NSTokens::Key::propertyId); @@ -159,9 +159,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseSnapHandler(SnapHandler* snapHandler, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void ParseSnapHandler(SnapHandler* snapHandler, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); snapHandler->HandlerId = reader->ReadAddr(NSTokens::Key::handlerId); @@ -264,9 +264,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseSnapType(SnapType* sType, bool readSeperator, FileReader* reader, SlabAllocator& alloc, const TTDIdentifierDictionary& typeHandlerMap) + void ParseSnapType(SnapType* sType, bool readSeparator, FileReader* reader, SlabAllocator& alloc, const TTDIdentifierDictionary& typeHandlerMap) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); sType->TypePtrId = reader->ReadAddr(NSTokens::Key::typeId); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapTypes.h b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapTypes.h index 9f1cd3f29cf..76880ffde7a 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapTypes.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapTypes.h @@ -34,7 +34,7 @@ namespace TTD void EmitSnapPropertyRecord(const SnapPropertyRecord* sRecord, FileWriter* writer, NSTokens::Separator separator); //de-serialize the data - void ParseSnapPropertyRecord(SnapPropertyRecord* sRecord, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + void ParseSnapPropertyRecord(SnapPropertyRecord* sRecord, bool readSeparator, FileReader* reader, SlabAllocator& alloc); ////////////////// @@ -98,7 +98,7 @@ namespace TTD void EmitSnapHandler(const SnapHandler* snapHandler, FileWriter* writer, NSTokens::Separator separator); //de-serialize the data - void ParseSnapHandler(SnapHandler* snapHandler, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + void ParseSnapHandler(SnapHandler* snapHandler, bool readSeparator, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE int64 ComputeLocationTagForAssertCompare(const SnapHandlerPropertyEntry& handlerEntry); @@ -133,7 +133,7 @@ namespace TTD void EmitSnapType(const SnapType* sType, FileWriter* writer, NSTokens::Separator separator); //de-serialize the data - void ParseSnapType(SnapType* sType, bool readSeperator, FileReader* reader, SlabAllocator& alloc, const TTDIdentifierDictionary& typeHandlerMap); + void ParseSnapType(SnapType* sType, bool readSeparator, FileReader* reader, SlabAllocator& alloc, const TTDIdentifierDictionary& typeHandlerMap); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const SnapType* t1, const SnapType* t2, TTDCompareMap& compareMap); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapValues.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapValues.cpp index 85825144ee7..82e764173e3 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapValues.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapValues.cpp @@ -202,9 +202,9 @@ namespace TTD writer->WriteRecordEnd(); } - TTDVar ParseTTDVar(bool readSeperator, FileReader* reader) + TTDVar ParseTTDVar(bool readSeparator, FileReader* reader) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); TTDVar res = nullptr; TTDVarEmitTag tag = reader->ReadTag(NSTokens::Key::ttdVarTag); @@ -456,9 +456,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseSnapPrimitiveValue(SnapPrimitiveValue* snapValue, bool readSeperator, FileReader* reader, SlabAllocator& alloc, const TTDIdentifierDictionary& ptrIdToTypeMap) + void ParseSnapPrimitiveValue(SnapPrimitiveValue* snapValue, bool readSeparator, FileReader* reader, SlabAllocator& alloc, const TTDIdentifierDictionary& ptrIdToTypeMap) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); snapValue->PrimitiveValueId = reader->ReadAddr(NSTokens::Key::primitiveId); TTD_PTR_ID snapTypeId = reader->ReadAddr(NSTokens::Key::typeId, true); @@ -674,9 +674,9 @@ namespace TTD writer->WriteRecordEnd(NSTokens::Separator::BigSpaceSeparator); } - void ParseSlotArrayInfo(SlotArrayInfo* slotInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void ParseSlotArrayInfo(SlotArrayInfo* slotInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); slotInfo->SlotId = reader->ReadAddr(NSTokens::Key::slotId); slotInfo->ScriptContextLogId = reader->ReadLogTag(NSTokens::Key::ctxTag, true); @@ -820,9 +820,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseScriptFunctionScopeInfo(ScriptFunctionScopeInfo* funcScopeInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void ParseScriptFunctionScopeInfo(ScriptFunctionScopeInfo* funcScopeInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); funcScopeInfo->ScopeId = reader->ReadAddr(NSTokens::Key::scopeId); funcScopeInfo->ScriptContextLogId = reader->ReadLogTag(NSTokens::Key::ctxTag, true); @@ -895,9 +895,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParsePromiseCapabilityInfo(SnapPromiseCapabilityInfo* capabilityInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void ParsePromiseCapabilityInfo(SnapPromiseCapabilityInfo* capabilityInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); capabilityInfo->CapabilityId = reader->ReadAddr(NSTokens::Key::ptrIdVal); @@ -952,9 +952,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParsePromiseReactionInfo(SnapPromiseReactionInfo* reactionInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void ParsePromiseReactionInfo(SnapPromiseReactionInfo* reactionInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); reactionInfo->PromiseReactionId = reader->ReadAddr(NSTokens::Key::ptrIdVal); @@ -1099,9 +1099,9 @@ namespace TTD } } - void ParseTopLevelCommonBodyResolveInfo(TopLevelCommonBodyResolveInfo* fbInfo, bool readSeperator, bool parseInline, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc) + void ParseTopLevelCommonBodyResolveInfo(TopLevelCommonBodyResolveInfo* fbInfo, bool readSeparator, bool parseInline, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); fbInfo->TopLevelBodyCtr = reader->ReadUInt32(NSTokens::Key::functionBodyId); fbInfo->ScriptContextLogId = reader->ReadLogTag(NSTokens::Key::ctxTag, true); @@ -1251,9 +1251,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseTopLevelLoadedFunctionBodyInfo(TopLevelScriptLoadFunctionBodyResolveInfo* fbInfo, bool readSeperator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc) + void ParseTopLevelLoadedFunctionBodyInfo(TopLevelScriptLoadFunctionBodyResolveInfo* fbInfo, bool readSeparator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc) { - NSSnapValues::ParseTopLevelCommonBodyResolveInfo(&fbInfo->TopLevelBase, readSeperator, false, threadContext, reader, alloc); + NSSnapValues::ParseTopLevelCommonBodyResolveInfo(&fbInfo->TopLevelBase, readSeparator, false, threadContext, reader, alloc); fbInfo->LoadFlag = reader->ReadTag(NSTokens::Key::loadFlag, true); @@ -1311,9 +1311,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseTopLevelNewFunctionBodyInfo(TopLevelNewFunctionBodyResolveInfo* fbInfo, bool readSeperator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc) + void ParseTopLevelNewFunctionBodyInfo(TopLevelNewFunctionBodyResolveInfo* fbInfo, bool readSeparator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc) { - NSSnapValues::ParseTopLevelCommonBodyResolveInfo(&fbInfo->TopLevelBase, readSeperator, false, threadContext, reader, alloc); + NSSnapValues::ParseTopLevelCommonBodyResolveInfo(&fbInfo->TopLevelBase, readSeparator, false, threadContext, reader, alloc); reader->ReadRecordEnd(); } @@ -1370,9 +1370,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseTopLevelEvalFunctionBodyInfo(TopLevelEvalFunctionBodyResolveInfo* fbInfo, bool readSeperator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc) + void ParseTopLevelEvalFunctionBodyInfo(TopLevelEvalFunctionBodyResolveInfo* fbInfo, bool readSeparator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc) { - NSSnapValues::ParseTopLevelCommonBodyResolveInfo(&fbInfo->TopLevelBase, readSeperator, false, threadContext, reader, alloc); + NSSnapValues::ParseTopLevelCommonBodyResolveInfo(&fbInfo->TopLevelBase, readSeparator, false, threadContext, reader, alloc); fbInfo->EvalFlags = reader->ReadUInt64(NSTokens::Key::u64Val, true); fbInfo->RegisterDocument = reader->ReadBool(NSTokens::Key::boolVal, true); @@ -1529,9 +1529,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseFunctionBodyInfo(FunctionBodyResolveInfo* fbInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void ParseFunctionBodyInfo(FunctionBodyResolveInfo* fbInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); fbInfo->FunctionBodyId = reader->ReadAddr(NSTokens::Key::functionBodyId); fbInfo->ScriptContextLogId = reader->ReadLogTag(NSTokens::Key::ctxTag, true); @@ -1834,9 +1834,9 @@ namespace TTD writer->WriteRecordEnd(); } - void ParseSnapContext(SnapContext* intoCtx, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void ParseSnapContext(SnapContext* intoCtx, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); intoCtx->ScriptContextLogId = reader->ReadLogTag(NSTokens::Key::ctxTag); intoCtx->IsPNRGSeeded = reader->ReadBool(NSTokens::Key::boolVal, true); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapValues.h b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapValues.h index 213c9aedf71..e895bac50e1 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapValues.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapValues.h @@ -75,7 +75,7 @@ namespace TTD void EmitTTDVar(TTDVar var, FileWriter* writer, NSTokens::Separator separator); //de-serialize the TTDVar - TTDVar ParseTTDVar(bool readSeperator, FileReader* reader); + TTDVar ParseTTDVar(bool readSeparator, FileReader* reader); #if ENABLE_SNAPSHOT_COMPARE bool CheckSnapEquivTTDDouble(double d1, double d2); @@ -119,7 +119,7 @@ namespace TTD void InflateSnapPrimitiveValue(const SnapPrimitiveValue* snapValue, InflateMap* inflator); void EmitSnapPrimitiveValue(const SnapPrimitiveValue* snapValue, FileWriter* writer, NSTokens::Separator separator); - void ParseSnapPrimitiveValue(SnapPrimitiveValue* snapValue, bool readSeperator, FileReader* reader, SlabAllocator& alloc, const TTDIdentifierDictionary& ptrIdToTypeMap); + void ParseSnapPrimitiveValue(SnapPrimitiveValue* snapValue, bool readSeparator, FileReader* reader, SlabAllocator& alloc, const TTDIdentifierDictionary& ptrIdToTypeMap); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const SnapPrimitiveValue* v1, const SnapPrimitiveValue* v2, TTDCompareMap& compareMap); @@ -156,7 +156,7 @@ namespace TTD Js::Var* InflateSlotArrayInfo(const SlotArrayInfo* slotInfo, InflateMap* inflator); void EmitSlotArrayInfo(const SlotArrayInfo* slotInfo, FileWriter* writer, NSTokens::Separator separator); - void ParseSlotArrayInfo(SlotArrayInfo* slotInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + void ParseSlotArrayInfo(SlotArrayInfo* slotInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const SlotArrayInfo* sai1, const SlotArrayInfo* sai2, TTDCompareMap& compareMap); @@ -192,7 +192,7 @@ namespace TTD Js::FrameDisplay* InflateScriptFunctionScopeInfo(const ScriptFunctionScopeInfo* funcScopeInfo, InflateMap* inflator); void EmitScriptFunctionScopeInfo(const ScriptFunctionScopeInfo* funcScopeInfo, FileWriter* writer, NSTokens::Separator separator); - void ParseScriptFunctionScopeInfo(ScriptFunctionScopeInfo* funcScopeInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + void ParseScriptFunctionScopeInfo(ScriptFunctionScopeInfo* funcScopeInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const ScriptFunctionScopeInfo* funcScopeInfo1, const ScriptFunctionScopeInfo* funcScopeInfo2, TTDCompareMap& compareMap); @@ -214,7 +214,7 @@ namespace TTD Js::JavascriptPromiseCapability* InflatePromiseCapabilityInfo(const SnapPromiseCapabilityInfo* capabilityInfo, Js::ScriptContext* ctx, InflateMap* inflator); void EmitPromiseCapabilityInfo(const SnapPromiseCapabilityInfo* capabilityInfo, FileWriter* writer, NSTokens::Separator separator); - void ParsePromiseCapabilityInfo(SnapPromiseCapabilityInfo* capabilityInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + void ParsePromiseCapabilityInfo(SnapPromiseCapabilityInfo* capabilityInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const SnapPromiseCapabilityInfo* capabilityInfo1, const SnapPromiseCapabilityInfo* capabilityInfo2, TTDCompareMap& compareMap); @@ -233,7 +233,7 @@ namespace TTD Js::JavascriptPromiseReaction* InflatePromiseReactionInfo(const SnapPromiseReactionInfo* reactionInfo, Js::ScriptContext* ctx, InflateMap* inflator); void EmitPromiseReactionInfo(const SnapPromiseReactionInfo* reactionInfo, FileWriter* writer, NSTokens::Separator separator); - void ParsePromiseReactionInfo(SnapPromiseReactionInfo* reactionInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + void ParsePromiseReactionInfo(SnapPromiseReactionInfo* reactionInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const SnapPromiseReactionInfo* reactionInfo1, const SnapPromiseReactionInfo* reactionInfo2, TTDCompareMap& compareMap); @@ -297,7 +297,7 @@ namespace TTD //Extract WITHOUT COPYING the info needed for this top level function -- use in script context when function is parsed to keep all the info together and then we do the copying later when doing snapshots void ExtractTopLevelCommonBodyResolveInfo(TopLevelCommonBodyResolveInfo* fbInfo, Js::FunctionBody* fb, uint32 topLevelCtr, Js::ModuleID moduleId, uint64 sourceContextId, bool isUtf8source, const byte* source, uint32 sourceLen, SlabAllocator& alloc); void EmitTopLevelCommonBodyResolveInfo(const TopLevelCommonBodyResolveInfo* fbInfo, bool emitInline, ThreadContext* threadContext, FileWriter* writer, NSTokens::Separator separator); - void ParseTopLevelCommonBodyResolveInfo(TopLevelCommonBodyResolveInfo* fbInfo, bool readSeperator, bool parseInline, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc); + void ParseTopLevelCommonBodyResolveInfo(TopLevelCommonBodyResolveInfo* fbInfo, bool readSeparator, bool parseInline, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const TopLevelCommonBodyResolveInfo* fbInfo1, const TopLevelCommonBodyResolveInfo* fbInfo2, TTDCompareMap& compareMap); @@ -317,7 +317,7 @@ namespace TTD Js::FunctionBody* InflateTopLevelLoadedFunctionBodyInfo(const TopLevelScriptLoadFunctionBodyResolveInfo* fbInfo, Js::ScriptContext* ctx); void EmitTopLevelLoadedFunctionBodyInfo(const TopLevelScriptLoadFunctionBodyResolveInfo* fbInfo, ThreadContext* threadContext, FileWriter* writer, NSTokens::Separator separator); - void ParseTopLevelLoadedFunctionBodyInfo(TopLevelScriptLoadFunctionBodyResolveInfo* fbInfo, bool readSeperator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc); + void ParseTopLevelLoadedFunctionBodyInfo(TopLevelScriptLoadFunctionBodyResolveInfo* fbInfo, bool readSeparator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const TopLevelScriptLoadFunctionBodyResolveInfo* fbInfo1, const TopLevelScriptLoadFunctionBodyResolveInfo* fbInfo2, TTDCompareMap& compareMap); @@ -334,7 +334,7 @@ namespace TTD Js::FunctionBody* InflateTopLevelNewFunctionBodyInfo(const TopLevelNewFunctionBodyResolveInfo* fbInfo, Js::ScriptContext* ctx); void EmitTopLevelNewFunctionBodyInfo(const TopLevelNewFunctionBodyResolveInfo* fbInfo, ThreadContext* threadContext, FileWriter* writer, NSTokens::Separator separator); - void ParseTopLevelNewFunctionBodyInfo(TopLevelNewFunctionBodyResolveInfo* fbInfo, bool readSeperator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc); + void ParseTopLevelNewFunctionBodyInfo(TopLevelNewFunctionBodyResolveInfo* fbInfo, bool readSeparator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const TopLevelNewFunctionBodyResolveInfo* fbInfo1, const TopLevelNewFunctionBodyResolveInfo* fbInfo2, TTDCompareMap& compareMap); @@ -357,7 +357,7 @@ namespace TTD Js::FunctionBody* InflateTopLevelEvalFunctionBodyInfo(const TopLevelEvalFunctionBodyResolveInfo* fbInfo, Js::ScriptContext* ctx); void EmitTopLevelEvalFunctionBodyInfo(const TopLevelEvalFunctionBodyResolveInfo* fbInfo, ThreadContext* threadContext, FileWriter* writer, NSTokens::Separator separator); - void ParseTopLevelEvalFunctionBodyInfo(TopLevelEvalFunctionBodyResolveInfo* fbInfo, bool readSeperator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc); + void ParseTopLevelEvalFunctionBodyInfo(TopLevelEvalFunctionBodyResolveInfo* fbInfo, bool readSeparator, ThreadContext* threadContext, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const TopLevelEvalFunctionBodyResolveInfo* fbInfo1, const TopLevelEvalFunctionBodyResolveInfo* fbInfo2, TTDCompareMap& compareMap); @@ -395,7 +395,7 @@ namespace TTD void InflateFunctionBody(const FunctionBodyResolveInfo* fbInfo, InflateMap* inflator, const TTDIdentifierDictionary& idToFbResolveMap); void EmitFunctionBodyInfo(const FunctionBodyResolveInfo* fbInfo, FileWriter* writer, NSTokens::Separator separator); - void ParseFunctionBodyInfo(FunctionBodyResolveInfo* fbInfo, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + void ParseFunctionBodyInfo(FunctionBodyResolveInfo* fbInfo, bool readSeparator, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const FunctionBodyResolveInfo* fbInfo1, const FunctionBodyResolveInfo* fbInfo2, TTDCompareMap& compareMap); @@ -463,7 +463,7 @@ namespace TTD void ResetPendingAsyncBufferModInfo(const SnapContext* snpCtx, Js::ScriptContext* intoCtx, InflateMap* inflator); void EmitSnapContext(const SnapContext* snapCtx, FileWriter* writer, NSTokens::Separator separator); - void ParseSnapContext(SnapContext* intoCtx, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + void ParseSnapContext(SnapContext* intoCtx, bool readSeparator, FileReader* reader, SlabAllocator& alloc); #if ENABLE_SNAPSHOT_COMPARE void AssertSnapEquiv(const SnapContext* snapCtx1, const SnapContext* snapCtx2, const JsUtil::BaseDictionary& allRootMap1, const JsUtil::BaseDictionary& allRootMap2, TTDCompareMap& compareMap); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshot.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshot.cpp index 5890f37c271..9463c66371e 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshot.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshot.cpp @@ -217,8 +217,12 @@ namespace TTD { //lookup the inflator function for this object and call it NSSnapObjects::fPtr_DoObjectInflation inflateFPtr = this->m_snapObjectVTableArray[(uint32)snpObject->SnapObjectTag].InflationFunc; - TTDAssert(inflateFPtr != nullptr, "We probably forgot to update the vtable with a tag we added."); - + if(inflateFPtr == nullptr) + { + char buff[1024]; + sprintf_s(buff, "We probably forgot to update the vtable with a tag we added. Tag is [%i]. SnapRuntimeFunctionObject is [%i]", (uint32)snpObject->SnapObjectTag, TTD::NSSnapObjects::SnapObjectType::SnapRuntimeFunctionObject); + TTDAssert(inflateFPtr != nullptr, buff); + } res = inflateFPtr(snpObject, inflator); } @@ -265,9 +269,9 @@ namespace TTD snapwriter->WriteRecordEnd(); } - void SnapShot::SnapRootPinEntryParse(NSSnapValues::SnapRootInfoEntry* spe, bool readSeperator, FileReader* reader, SlabAllocator& alloc) + void SnapShot::SnapRootPinEntryParse(NSSnapValues::SnapRootInfoEntry* spe, bool readSeparator, FileReader* reader, SlabAllocator& alloc) { - reader->ReadRecordStart(readSeperator); + reader->ReadRecordStart(readSeparator); spe->LogId = reader->ReadLogTag(NSTokens::Key::logTag); spe->LogObject = reader->ReadAddr(NSTokens::Key::objectId, true); spe->MaybeLongLivedRoot = reader->ReadBool(NSTokens::Key::boolVal, true); @@ -338,6 +342,42 @@ namespace TTD this->m_snapObjectVTableArray[(uint32)NSSnapObjects::SnapObjectType::SnapPromiseReactionTaskFunctionObject] = { &NSSnapObjects::DoObjectInflation_SnapPromiseReactionTaskFunctionInfo, nullptr, &NSSnapObjects::EmitAddtlInfo_SnapPromiseReactionTaskFunctionInfo, &NSSnapObjects::ParseAddtlInfo_SnapPromiseReactionTaskFunctionInfo }; this->m_snapObjectVTableArray[(uint32)NSSnapObjects::SnapObjectType::SnapPromiseAllResolveElementFunctionObject] = { &NSSnapObjects::DoObjectInflation_SnapPromiseAllResolveElementFunctionInfo, nullptr, &NSSnapObjects::EmitAddtlInfo_SnapPromiseAllResolveElementFunctionInfo, &NSSnapObjects::ParseAddtlInfo_SnapPromiseAllResolveElementFunctionInfo }; + this->m_snapObjectVTableArray[(uint32)NSSnapObjects::SnapObjectType::SnapGeneratorFunction] = { + &NSSnapObjects::DoObjectInflation_SnapGeneratorFunctionInfo, + &NSSnapObjects::DoAddtlValueInstantiation_SnapGeneratorFunctionInfo, + &NSSnapObjects::EmitAddtlInfo_SnapGeneratorFunctionInfo, + &NSSnapObjects::ParseAddtlInfo_SnapGeneratorFunctionInfo }; + this->m_snapObjectVTableArray[(uint32)NSSnapObjects::SnapObjectType::SnapGeneratorVirtualScriptFunction] = { + &NSSnapObjects::DoObjectInflation_SnapGeneratorVirtualScriptFunctionInfo, + &NSSnapObjects::DoAddtlValueInstantiation_SnapGeneratorVirtualScriptFunctionInfo, + &NSSnapObjects::EmitAddtlInfo_SnapGeneratorVirtualScriptFunctionInfo, + &NSSnapObjects::ParseAddtlInfo_SnapGeneratorVirtualScriptFunctionInfo }; + this->m_snapObjectVTableArray[(uint32)NSSnapObjects::SnapObjectType::SnapAsyncFunction] = { + &NSSnapObjects::DoObjectInflation_SnapAsyncFunction, + &NSSnapObjects::DoAddtlValueInstantiation_SnapAsyncFunction, + &NSSnapObjects::EmitAddtlInfo_SnapAsyncFunction, + &NSSnapObjects::ParseAddtlInfo_SnapAsyncFunction + }; + this->m_snapObjectVTableArray[(uint32)NSSnapObjects::SnapObjectType::SnapGenerator] = { + &NSSnapObjects::DoObjectInflation_SnapGeneratorInfo, + &NSSnapObjects::DoAddtlValueInstantiation_SnapGeneratorInfo, + &NSSnapObjects::EmitAddtlInfo_SnapGeneratorInfo, + &NSSnapObjects::ParseAddtlInfo_SnapGeneratorInfo }; + this->m_snapObjectVTableArray[(uint32)NSSnapObjects::SnapObjectType::JavascriptPromiseAsyncSpawnExecutorFunction] = { + &NSSnapObjects::DoObjectInflation_SnapJavascriptPromiseAsyncSpawnExecutorFunction, + &NSSnapObjects::DoAddtlValueInstantiation_SnapJavascriptPromiseAsyncSpawnExecutorFunction, + &NSSnapObjects::EmitAddtlInfo_SnapJavascriptPromiseAsyncSpawnExecutorFunction, + &NSSnapObjects::ParseAddtlInfo_SnapJavascriptPromiseAsyncSpawnExecutorFunction + }; + this->m_snapObjectVTableArray[(uint32)NSSnapObjects::SnapObjectType::JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction] = { + &NSSnapObjects::DoObjectInflation_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo, + &NSSnapObjects::DoAddtlValueInstantiation_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo, + &NSSnapObjects::EmitAddtlInfo_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo, + &NSSnapObjects::ParseAddtlInfo_SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo + }; + + + //// //For the objects that are always well known @@ -346,7 +386,7 @@ namespace TTD SnapShot::~SnapShot() { - ; + ; } uint32 SnapShot::ContextCount() const @@ -392,7 +432,7 @@ namespace TTD uint32 SnapShot::GetDbgScopeCountNonTopLevel() const { uint32 dbgScopeCount = 0; - for(auto iter = this->m_functionBodyList.GetIterator(); iter.IsValid(); iter.MoveNext()) + for(auto iter = this->m_functionBodyList.GetIterator(); iter.IsValid(); iter.MoveNext()) { dbgScopeCount += iter.Current()->ScopeChainInfo.ScopeCount; } diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshot.h b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshot.h index 1697fff1191..5e8e6c8906d 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshot.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshot.h @@ -114,7 +114,7 @@ namespace TTD void ReLinkThreadContextInfo(InflateMap* inflator, ThreadContextTTD* intoCtx) const; static void SnapRootPinEntryEmit(const NSSnapValues::SnapRootInfoEntry* spe, FileWriter* snapwriter, NSTokens::Separator separator); - static void SnapRootPinEntryParse(NSSnapValues::SnapRootInfoEntry* spe, bool readSeperator, FileReader* reader, SlabAllocator& alloc); + static void SnapRootPinEntryParse(NSSnapValues::SnapRootInfoEntry* spe, bool readSeparator, FileReader* reader, SlabAllocator& alloc); public: //Performance counter values diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshotExtractor.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshotExtractor.cpp index 120c37a0073..27b5572120c 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshotExtractor.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSnapshotExtractor.cpp @@ -19,7 +19,7 @@ namespace TTD if(this->m_marks.MarkAndTestAddr(type)) { - if(Js::DynamicType::Is(type->GetTypeId())) + if(Js::DynamicType::Is(type)) { Js::DynamicTypeHandler* handler = (static_cast(type))->GetTypeHandler(); @@ -68,14 +68,12 @@ namespace TTD { if(this->m_marks.IsMarked(jstype)) { - if(Js::DynamicType::Is(jstype->GetTypeId())) + NSSnapType::SnapHandler* sHandler = nullptr; + + if(Js::DynamicType::Is(jstype)) { this->ExtractHandlerIfNeeded(static_cast(jstype)->GetTypeHandler(), threadContext); - } - NSSnapType::SnapHandler* sHandler = nullptr; - if(Js::DynamicType::Is(jstype->GetTypeId())) - { Js::DynamicTypeHandler* dhandler = static_cast(jstype)->GetTypeHandler(); TTD_PTR_ID handlerId = TTD_CONVERT_TYPEINFO_TO_PTR_ID(dhandler); @@ -109,7 +107,7 @@ namespace TTD slotInfo->Slots[j] = slots.Get(j); } - if(slots.IsFunctionScopeSlotArray()) + if(!slots.IsDebuggerScopeSlotArray()) { Js::FunctionBody* fb = slots.GetFunctionInfo()->GetFunctionBody(); @@ -326,7 +324,7 @@ namespace TTD { Js::ScopeSlots slotArray = (Js::Var*)scope; uint slotArrayCount = static_cast(slotArray.GetCount()); - if(slotArray.IsFunctionScopeSlotArray()) + if(!slotArray.IsDebuggerScopeSlotArray()) { this->MarkFunctionBody(slotArray.GetFunctionInfo()->GetFunctionBody()); } diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSupport.cpp b/deps/chakrashim/core/lib/Runtime/Debug/TTSupport.cpp index 9070345d7dc..85503046e0b 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSupport.cpp +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSupport.cpp @@ -8,7 +8,7 @@ void TTDAbort_fatal_error(const char* msg) { - printf("TTD assert failed: %s\n", msg); + Output::Print(_u("TTD assert failed: %S\n"), msg); int scenario = 101; ReportFatalException(NULL, E_UNEXPECTED, Fatal_TTDAbort, scenario); diff --git a/deps/chakrashim/core/lib/Runtime/Debug/TTSupport.h b/deps/chakrashim/core/lib/Runtime/Debug/TTSupport.h index 4ce5d98b050..22b196ff5ab 100644 --- a/deps/chakrashim/core/lib/Runtime/Debug/TTSupport.h +++ b/deps/chakrashim/core/lib/Runtime/Debug/TTSupport.h @@ -69,7 +69,7 @@ void _NOINLINE __declspec(noreturn) TTDAbort_fatal_error(const char* msg); template T* TTD_MEM_ALLOC_CHECK(T* alloc) { - if(alloc == nullptr) + if (alloc == nullptr) { TTDAssert(false, "OOM in TTD"); } @@ -188,7 +188,7 @@ namespace TTD class TTModeStack { private: - TTDMode* m_stackEntries; + TTDMode * m_stackEntries; uint32 m_stackTop; uint32 m_stackMax; @@ -248,6 +248,12 @@ namespace TTD SnapPromiseResolveOrRejectFunctionObject, SnapPromiseReactionTaskFunctionObject, SnapPromiseAllResolveElementFunctionObject, + SnapGeneratorFunction, + SnapGeneratorVirtualScriptFunction, + SnapAsyncFunction, + SnapGenerator, + JavascriptPromiseAsyncSpawnExecutorFunction, + JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction, //objects that should always be well known but which may have other info we want to restore SnapWellKnownObject, @@ -456,7 +462,7 @@ namespace TTD uint32 desiredsize = TTD_WORD_ALIGN_ALLOC_SIZE(n + canUnlink); //make alloc size word aligned TTDAssert((desiredsize % 4 == 0) & (desiredsize >= (n + canUnlink)) & (desiredsize < TTD_SLAB_BLOCK_USABLE_SIZE(this->m_slabBlockSize)), "We can never allocate a block this big with the slab allocator!!"); - if(this->m_currPos + desiredsize > this->m_endPos) + if (this->m_currPos + desiredsize > this->m_endPos) { this->AddNewBlock(); } @@ -468,7 +474,7 @@ namespace TTD this->m_totalAllocatedSize += TTD_WORD_ALIGN_ALLOC_SIZE(n); #endif - if(canUnlink) + if (canUnlink) { TTDAssert(canUnlink == sizeof(ptrdiff_t), "We need enough space for a ptr to the meta-data."); @@ -495,18 +501,18 @@ namespace TTD uint32 desiredsize = TTD_WORD_ALIGN_ALLOC_SIZE(requestedBytes + canUnlink); //make alloc size word aligned TTDAssert((desiredsize % 4 == 0) & (desiredsize >= (requestedBytes + canUnlink)) & (desiredsize < TTD_SLAB_BLOCK_USABLE_SIZE(this->m_slabBlockSize)), "We can never allocate a block this big with the slab allocator!!"); - if(reserve) + if (reserve) { TTDAssert(this->m_reserveActiveBytes == 0, "Don't double allocate memory."); - if(this->m_currPos + desiredsize > this->m_endPos) + if (this->m_currPos + desiredsize > this->m_endPos) { this->AddNewBlock(); } res = this->m_currPos; - if(canUnlink) + if (canUnlink) { TTDAssert(canUnlink == sizeof(ptrdiff_t), "We need enough space for a ptr to the meta-data."); @@ -517,7 +523,7 @@ namespace TTD } } - if(commit) + if (commit) { this->m_currPos += desiredsize; @@ -525,18 +531,18 @@ namespace TTD this->m_totalAllocatedSize += desiredsize; #endif - if(canUnlink) + if (canUnlink) { this->m_headBlock->RefCounter++; } } - if(reserve && !commit) + if (reserve && !commit) { this->m_reserveActiveBytes = desiredsize; } - if(!reserve && commit) + if (!reserve && commit) { TTDAssert(desiredsize <= this->m_reserveActiveBytes, "We are commiting more that we reserved."); @@ -553,7 +559,7 @@ namespace TTD this->m_totalAllocatedSize += blockSize; #endif - if(this->m_largeBlockList != nullptr) + if (this->m_largeBlockList != nullptr) { this->m_largeBlockList->Next = newBlock; } @@ -583,7 +589,7 @@ namespace TTD newBlock->MetaDataSential = 0; - if(commit) + if (commit) { this->CommitLargeBlockAllocation(newBlock, desiredsize); } @@ -627,7 +633,7 @@ namespace TTD ~SlabAllocatorBase() { SlabBlock* currBlock = this->m_headBlock; - while(currBlock != nullptr) + while (currBlock != nullptr) { SlabBlock* tmp = currBlock; currBlock = currBlock->Previous; @@ -636,7 +642,7 @@ namespace TTD } LargeSlabBlock* currLargeBlock = this->m_largeBlockList; - while(currLargeBlock != nullptr) + while (currLargeBlock != nullptr) { LargeSlabBlock* tmp = currLargeBlock; currLargeBlock = currLargeBlock->Previous; @@ -644,7 +650,7 @@ namespace TTD TT_HEAP_FREE_ARRAY(byte, (byte*)tmp, tmp->TotalBlockSize); } - if(this->m_reserveActiveLargeBlock != nullptr) + if (this->m_reserveActiveLargeBlock != nullptr) { TT_HEAP_FREE_ARRAY(byte, (byte*)this->m_reserveActiveLargeBlock, this->m_reserveActiveBytes); this->m_reserveActiveLargeBlock = nullptr; @@ -658,7 +664,7 @@ namespace TTD //clone a null terminated char16* string (or nullptr) into the allocator -- currently only used for wellknown tokens const char16* CopyRawNullTerminatedStringInto(const char16* str) { - if(str == nullptr) + if (str == nullptr) { return nullptr; } @@ -698,7 +704,7 @@ namespace TTD //clone a string into the allocator void CopyNullTermStringInto(const char16* str, TTString& into) { - if(str == nullptr) + if (str == nullptr) { into.Length = 0; into.Contents = nullptr; @@ -714,12 +720,12 @@ namespace TTD { uint64 memreserved = 0; - for(SlabBlock* currBlock = this->m_headBlock; currBlock != nullptr; currBlock = currBlock->Previous) + for (SlabBlock* currBlock = this->m_headBlock; currBlock != nullptr; currBlock = currBlock->Previous) { memreserved += (uint64)this->m_slabBlockSize; } - for(LargeSlabBlock* currLargeBlock = this->m_largeBlockList; currLargeBlock != nullptr; currLargeBlock = currLargeBlock->Previous) + for (LargeSlabBlock* currLargeBlock = this->m_largeBlockList; currLargeBlock != nullptr; currLargeBlock = currLargeBlock->Previous) { memreserved += (uint64)(currLargeBlock->TotalBlockSize); } @@ -752,7 +758,7 @@ namespace TTD T* SlabAllocateArray(size_t count) { size_t size = count * sizeof(T); - if(size <= TTD_SLAB_LARGE_BLOCK_SIZE) + if (size <= TTD_SLAB_LARGE_BLOCK_SIZE) { return (T*)this->SlabAllocateRawSize(size); } @@ -769,7 +775,7 @@ namespace TTD T* res = nullptr; size_t size = count * sizeof(T); - if(size <= TTD_SLAB_LARGE_BLOCK_SIZE) + if (size <= TTD_SLAB_LARGE_BLOCK_SIZE) { res = (T*)this->SlabAllocateRawSize(size); } @@ -786,7 +792,7 @@ namespace TTD template T* SlabAllocateFixedSizeArray() { - if(count * sizeof(T) <= TTD_SLAB_LARGE_BLOCK_SIZE) + if (count * sizeof(T) <= TTD_SLAB_LARGE_BLOCK_SIZE) { return (T*)this->SlabAllocateRawSize(count * sizeof(T)); } @@ -801,7 +807,7 @@ namespace TTD T* SlabReserveArraySpace(size_t count) { size_t size = count * sizeof(T); - if(size <= TTD_SLAB_LARGE_BLOCK_SIZE) + if (size <= TTD_SLAB_LARGE_BLOCK_SIZE) { return (T*)this->SlabAllocateRawSize(size); } @@ -818,7 +824,7 @@ namespace TTD TTDAssert(this->m_reserveActiveBytes != 0, "We don't have anything reserved."); size_t reservedSize = reservedCount * sizeof(T); - if(reservedSize <= TTD_SLAB_LARGE_BLOCK_SIZE) + if (reservedSize <= TTD_SLAB_LARGE_BLOCK_SIZE) { TTDAssert(this->m_reserveActiveLargeBlock == nullptr, "We should not have a large block active!!!"); @@ -843,7 +849,7 @@ namespace TTD TTDAssert(this->m_reserveActiveBytes != 0, "We don't have anything reserved."); size_t reservedSize = reservedCount * sizeof(T); - if(reservedSize <= TTD_SLAB_LARGE_BLOCK_SIZE) + if (reservedSize <= TTD_SLAB_LARGE_BLOCK_SIZE) { TTDAssert(this->m_reserveActiveLargeBlock == nullptr, "We should not have a large block active!!!"); @@ -870,29 +876,29 @@ namespace TTD byte* realBase = ((byte*)allocation) - canUnlink; ptrdiff_t offset = *((ptrdiff_t*)realBase); - if(offset == 0) + if (offset == 0) { //it is a large allocation just free it LargeSlabBlock* largeBlock = (LargeSlabBlock*)(((byte*)allocation) - TTD_LARGE_SLAB_BLOCK_SIZE); - if(largeBlock == this->m_largeBlockList) + if (largeBlock == this->m_largeBlockList) { TTDAssert(largeBlock->Next == nullptr, "Should always have a null next at head"); this->m_largeBlockList = this->m_largeBlockList->Previous; - if(this->m_largeBlockList != nullptr) + if (this->m_largeBlockList != nullptr) { this->m_largeBlockList->Next = nullptr; } } else { - if(largeBlock->Next != nullptr) + if (largeBlock->Next != nullptr) { largeBlock->Next->Previous = largeBlock->Previous; } - if(largeBlock->Previous != nullptr) + if (largeBlock->Previous != nullptr) { largeBlock->Previous->Next = largeBlock->Next; } @@ -906,9 +912,9 @@ namespace TTD SlabBlock* block = (SlabBlock*)(realBase - offset); block->RefCounter--; - if(block->RefCounter == 0) + if (block->RefCounter == 0) { - if(block == this->m_headBlock) + if (block == this->m_headBlock) { //we always need a head block to allocate out of -- so instead of deleting just reset it this->m_currPos = this->m_headBlock->BlockData; @@ -920,12 +926,12 @@ namespace TTD } else { - if(block->Next != nullptr) + if (block->Next != nullptr) { block->Next->Previous = block->Previous; } - if(block->Previous != nullptr) + if (block->Previous != nullptr) { block->Previous->Next = block->Next; } @@ -939,7 +945,7 @@ namespace TTD //Unlink the memory used by a string void UnlinkString(const TTString& str) { - if(str.Contents != nullptr) + if (str.Contents != nullptr) { this->UnlinkAllocation(str.Contents); } @@ -1018,7 +1024,7 @@ namespace TTD TTDAssert(this->m_inlineHeadBlock.CurrPos <= this->m_inlineHeadBlock.EndPos, "We are off the end of the array"); TTDAssert((((byte*)this->m_inlineHeadBlock.CurrPos) - ((byte*)this->m_inlineHeadBlock.BlockData)) / sizeof(T) <= allocSize, "We are off the end of the array"); - if(this->m_inlineHeadBlock.CurrPos == this->m_inlineHeadBlock.EndPos) + if (this->m_inlineHeadBlock.CurrPos == this->m_inlineHeadBlock.EndPos) { this->AddArrayLink(); } @@ -1034,7 +1040,7 @@ namespace TTD TTDAssert(this->m_inlineHeadBlock.CurrPos <= this->m_inlineHeadBlock.EndPos, "We are off the end of the array"); TTDAssert((((byte*)this->m_inlineHeadBlock.CurrPos) - ((byte*)this->m_inlineHeadBlock.BlockData)) / sizeof(T) <= allocSize, "We are off the end of the array"); - if(this->m_inlineHeadBlock.CurrPos == this->m_inlineHeadBlock.EndPos) + if (this->m_inlineHeadBlock.CurrPos == this->m_inlineHeadBlock.EndPos) { this->AddArrayLink(); } @@ -1051,7 +1057,7 @@ namespace TTD size_t count = (((byte*)this->m_inlineHeadBlock.CurrPos) - ((byte*)this->m_inlineHeadBlock.BlockData)) / sizeof(T); TTDAssert(count <= allocSize, "We somehow wrote in too much data."); - for(UnorderedArrayListLink* curr = this->m_inlineHeadBlock.Next; curr != nullptr; curr = curr->Next) + for (UnorderedArrayListLink* curr = this->m_inlineHeadBlock.Next; curr != nullptr; curr = curr->Next) { size_t ncount = (((byte*)curr->CurrPos) - ((byte*)curr->BlockData)) / sizeof(T); TTDAssert(ncount <= allocSize, "We somehow wrote in too much data."); @@ -1073,7 +1079,7 @@ namespace TTD : m_currLink(head), m_currEntry(head.BlockData) { //check for empty list and invalidate the iter if it is - if(this->m_currEntry == this->m_currLink.CurrPos) + if (this->m_currEntry == this->m_currLink.CurrPos) { this->m_currEntry = nullptr; } @@ -1098,9 +1104,9 @@ namespace TTD { this->m_currEntry++; - if(this->m_currEntry == this->m_currLink.CurrPos) + if (this->m_currEntry == this->m_currLink.CurrPos) { - if(this->m_currLink.Next == nullptr) + if (this->m_currLink.Next == nullptr) { this->m_currEntry = nullptr; } @@ -1154,7 +1160,7 @@ namespace TTD //h1Prime is less than table size by construction so we dont need to re-index uint32 primaryIndex = TTD_DICTIONARY_HASH(id, this->m_h1Prime); - if(this->m_hashArray[primaryIndex].Key == searchKey) + if (this->m_hashArray[primaryIndex].Key == searchKey) { return (this->m_hashArray + primaryIndex); } @@ -1162,10 +1168,10 @@ namespace TTD //do a hash for the second offset to avoid clustering and then do linear probing uint32 offset = TTD_DICTIONARY_HASH(id, this->m_h2Prime); uint32 probeIndex = TTD_DICTIONARY_INDEX(primaryIndex + offset, this->m_capacity); - while(true) + while (true) { Entry* curr = (this->m_hashArray + probeIndex); - if(curr->Key == searchKey) + if (curr->Key == searchKey) { return curr; } @@ -1184,7 +1190,7 @@ namespace TTD public: void Unload() { - if(this->m_hashArray != nullptr) + if (this->m_hashArray != nullptr) { TT_HEAP_FREE_ARRAY(Entry, this->m_hashArray, this->m_capacity); this->m_hashArray = nullptr; @@ -1247,12 +1253,12 @@ namespace TTD //h1Prime is less than table size by construction so we dont need to re-index uint32 primaryIndex = TTD_DICTIONARY_HASH(id, this->m_h1Prime); - if(this->m_hashArray[primaryIndex].Key == id) + if (this->m_hashArray[primaryIndex].Key == id) { return true; } - if(this->m_hashArray[primaryIndex].Key == 0) + if (this->m_hashArray[primaryIndex].Key == 0) { return false; } @@ -1260,15 +1266,15 @@ namespace TTD //do a hash for the second offset to avoid clustering and then do linear probing uint32 offset = TTD_DICTIONARY_HASH(id, this->m_h2Prime); uint32 probeIndex = TTD_DICTIONARY_INDEX(primaryIndex + offset, this->m_capacity); - while(true) + while (true) { Entry* curr = (this->m_hashArray + probeIndex); - if(curr->Key == id) + if (curr->Key == id) { return true; } - if(curr->Key == 0) + if (curr->Key == 0) { return false; } @@ -1329,7 +1335,7 @@ namespace TTD { private: //The addresses and their marks - uint64* m_addrArray; + uint64 * m_addrArray; MarkTableTag* m_markArray; //Capcity and count of the table (we use capcity for fast & hashing instead of %); @@ -1351,7 +1357,7 @@ namespace TTD uint32 primaryIndex = TTD_MARK_TABLE_HASH1(addr, this->m_capcity); uint64 primaryAddr = this->m_addrArray[primaryIndex]; - if((primaryAddr == addr) | (primaryAddr == 0)) + if ((primaryAddr == addr) | (primaryAddr == 0)) { return (int32)primaryIndex; } @@ -1359,10 +1365,10 @@ namespace TTD //do a hash for the second offset to avoid clustering and then do linear probing uint32 offset = TTD_MARK_TABLE_HASH2(addr, this->m_h2Prime); uint32 probeIndex = TTD_MARK_TABLE_INDEX(primaryIndex + offset, this->m_capcity); - while(true) + while (true) { uint64 currAddr = this->m_addrArray[probeIndex]; - if((currAddr == addr) | (currAddr == 0)) + if ((currAddr == addr) | (currAddr == 0)) { return (int32)probeIndex; } @@ -1387,7 +1393,7 @@ namespace TTD this->m_addrArray = TT_HEAP_ALLOC_ARRAY_ZERO(uint64, this->m_capcity); this->m_markArray = TT_HEAP_ALLOC_ARRAY_ZERO(MarkTableTag, this->m_capcity); - for(uint32 i = 0; i < oldCapacity; ++i) + for (uint32 i = 0; i < oldCapacity; ++i) { int32 idx = this->FindIndexForKey(oldAddrArray[i]); this->m_addrArray[idx] = oldAddrArray[i]; @@ -1401,7 +1407,7 @@ namespace TTD int32 FindIndexForKeyWGrow(const void* addr) { //keep the load factor < 25% - if((this->m_capcity >> 2) < this->m_count) + if ((this->m_capcity >> 2) < this->m_count) { this->Grow(); } @@ -1424,7 +1430,7 @@ namespace TTD //we really want to do the check on m_markArray but since we know nothing has been cleared we can check the addrArray for better cache behavior bool notMarked = this->m_addrArray[idx] == 0; - if(notMarked) + if (notMarked) { this->m_addrArray[idx] = reinterpret_cast(vaddr); this->m_markArray[idx] = kindtag; @@ -1443,7 +1449,7 @@ namespace TTD { int32 idx = this->FindIndexForKey(reinterpret_cast(vaddr)); - if(this->m_markArray[idx] != MarkTableTag::Clear) + if (this->m_markArray[idx] != MarkTableTag::Clear) { this->m_markArray[idx] |= specialtag; } @@ -1468,7 +1474,7 @@ namespace TTD //return clear if no more addresses MarkTableTag GetTagValue() const { - if(this->m_iterPos >= this->m_capcity) + if (this->m_iterPos >= this->m_capcity) { return MarkTableTag::Clear; } @@ -1508,11 +1514,11 @@ namespace TTD { this->m_iterPos++; - while(this->m_iterPos < this->m_capcity) + while (this->m_iterPos < this->m_capcity) { MarkTableTag tag = this->m_markArray[this->m_iterPos]; - if((tag & MarkTableTag::AllKindMask) != MarkTableTag::Clear) + if ((tag & MarkTableTag::AllKindMask) != MarkTableTag::Clear) { return; } @@ -1525,7 +1531,7 @@ namespace TTD { this->m_iterPos = 0; - if(this->m_markArray[0] == MarkTableTag::Clear) + if (this->m_markArray[0] == MarkTableTag::Clear) { this->MoveToNextAddress(); } diff --git a/deps/chakrashim/core/lib/Runtime/Language/Arguments.h b/deps/chakrashim/core/lib/Runtime/Language/Arguments.h index f3dc9782d72..7968b6107b2 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/Arguments.h +++ b/deps/chakrashim/core/lib/Runtime/Language/Arguments.h @@ -95,13 +95,24 @@ inline int _count_args(const T1&, const T2&, const T3&, const T4&, Js::CallInfo #define MUTATE_ARRAY_OBJECT(reentrancyLock) #endif -#if ENABLE_JS_REENTRANCY_CHECK -#define JS_REENTRANCY_CHECK(threadContext, ...) \ +#if ENABLE_JS_REENTRANCY_CHECK && DBG && ENABLE_NATIVE_CODEGEN +#define CALL_FUNCTION(threadContext, function, callInfo, ...) \ (threadContext->AssertJsReentrancy(), \ - __VA_ARGS__); + CheckIsExecutable(function, function->GetEntryPoint()), \ + CALL_FUNCTION_NOASSERT(function, callInfo, ##__VA_ARGS__)); +#elif ENABLE_JS_REENTRANCY_CHECK #define CALL_FUNCTION(threadContext, function, callInfo, ...) \ (threadContext->AssertJsReentrancy(), \ CALL_FUNCTION_NOASSERT(function, callInfo, ##__VA_ARGS__)); +#else +#define CALL_FUNCTION(threadContext, function, callInfo, ...) \ + CALL_FUNCTION_NOASSERT(function, callInfo, ##__VA_ARGS__); +#endif + +#if ENABLE_JS_REENTRANCY_CHECK +#define JS_REENTRANCY_CHECK(threadContext, ...) \ + (threadContext->AssertJsReentrancy(), \ + __VA_ARGS__); #define CALL_ENTRYPOINT(threadContext, entryPoint, function, callInfo, ...) \ (threadContext->AssertJsReentrancy(), \ CALL_ENTRYPOINT_NOASSERT(entryPoint, function, callInfo, ##__VA_ARGS__)); @@ -120,8 +131,8 @@ inline int _count_args(const T1&, const T2&, const T3&, const T4&, Js::CallInfo #define JS_REENTRANCY_LOCK(reentrancyLock, threadContext) \ JsReentLock reentrancyLock(threadContext); #else -#define CALL_FUNCTION(threadContext, function, callInfo, ...) \ - CALL_FUNCTION_NOASSERT(function, callInfo, ##__VA_ARGS__); +#define JS_REENTRANCY_CHECK(threadContext, ...) \ + __VA_ARGS__; #define CALL_ENTRYPOINT(threadContext, entryPoint, function, callInfo, ...) \ CALL_ENTRYPOINT_NOASSERT(entryPoint, function, callInfo, ##__VA_ARGS__); #define JS_REENTRANT(reentrancyLock, ...) \ @@ -175,6 +186,60 @@ namespace Js return Values[idxArg]; } + bool IsDirectEvalCall() const + { + // This was recognized as an eval call at compile time. The last one or two args are internal to us. + // Argcount will be one of the following when called from global code + // - eval("...") : argcount 3 : this, evalString, frameDisplay + // - eval.call("..."): argcount 2 : this(which is string) , frameDisplay + + return (Info.Flags & (CallFlags_ExtraArg | CallFlags_NewTarget)) == CallFlags_ExtraArg; // ExtraArg == 1 && NewTarget == 0 + } + + bool HasExtraArg() const + { + return Info.HasExtraArg(); + } + + bool HasArg() const + { + return Info.Count > 0; + } + + ushort GetArgCountWithExtraArgs() const + { + return Info.GetArgCountWithExtraArgs(); + } + + uint GetLargeArgCountWithExtraArgs() const + { + return Info.GetLargeArgCountWithExtraArgs(); + } + + FrameDisplay* GetFrameDisplay() const + { + AssertOrFailFast(Info.Flags & CallFlags_ExtraArg); + + // There is an extra arg, so values should have Count + 1 members + return (FrameDisplay*)(this->Values[Info.Count]); + } + + bool IsNewCall() const + { + return (Info.Flags & CallFlags_New) == CallFlags_New; + } + + bool HasNewTarget() const + { + return Info.HasNewTarget(); + } + + // New target value is passed as an extra argument which is nto included in the Info.Count + Var GetNewTarget() const + { + return CallInfo::GetNewTarget(Info.Flags, this->Values, Info.Count); + } + // swb: Arguments is mostly used on stack and does not need write barrier. // It is recycler allocated with ES6 generators. We handle that specially. FieldNoBarrier(CallInfo) Info; @@ -201,7 +266,7 @@ namespace Js private: void AdjustArguments(CallInfo *callInfo) { - AssertMsg(!(Info.Flags & Js::CallFlags_NewTarget) || (Info.Flags & Js::CallFlags_ExtraArg), "NewTarget flag must be used together with ExtraArg."); + AssertMsg(!this->HasNewTarget() || (Info.Flags & Js::CallFlags_ExtraArg), "NewTarget flag must be used together with ExtraArg."); if (Info.Flags & Js::CallFlags_ExtraArg) { // If "calling eval" is set, then the last param is the frame display, which only @@ -213,9 +278,7 @@ namespace Js // the stack version. Both seem risky. It would be safer and more robust to just // change the stack version. Info.Flags = (CallFlags)(Info.Flags & ~Js::CallFlags_ExtraArg); - Info.Count--; callInfo->Flags = (CallFlags)(callInfo->Flags & ~Js::CallFlags_ExtraArg); - callInfo->Count--; } } }; diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJs.cpp b/deps/chakrashim/core/lib/Runtime/Language/AsmJs.cpp index 4f7d1cc9dfc..7ff5c65b5ac 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJs.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJs.cpp @@ -262,12 +262,11 @@ namespace Js return m.Fail(coercionNode, _u("Identifier not globally declared")); } - AsmJsVar * constSrc = constSymSource->Cast(); - - if (constSymSource->GetSymbolType() != AsmJsSymbol::Variable || constSrc->isMutable()) + if (!AsmJsVar::Is(constSymSource) || constSymSource->isMutable()) { return m.Fail(coercionNode, _u("Unannotated variables must be constant")); } + AsmJsVar * constSrc = AsmJsVar::FromSymbol(constSymSource); if (constSrc->GetType().isSigned()) { @@ -472,11 +471,11 @@ namespace Js { AsmJsSymbol * buffFunc = m.LookupIdentifier(ctorExpr->name()); - if (!buffFunc || buffFunc->GetSymbolType() != AsmJsSymbol::TypedArrayBuiltinFunction) + if (!AsmJsTypedArrayFunction::Is(buffFunc)) { return m.Fail(ctorExpr, _u("invalid 'new' import")); } - type = buffFunc->Cast()->GetViewType(); + type = AsmJsTypedArrayFunction::FromSymbol(buffFunc)->GetViewType(); if (type == ArrayBufferView::TYPE_COUNT) { return m.Fail(ctorExpr, _u("could not match typed array name")); @@ -955,12 +954,12 @@ namespace Js return m.FailName( node, _u("Symbol %s not recognized inside module"), name ); } - if( sym->GetSymbolType() != AsmJsSymbol::ModuleFunction ) + if (!AsmJsFunc::Is(sym)) { return m.FailName( node, _u("Symbol %s can only be a function of the module"), name ); } - AsmJsFunc* func = sym->Cast(); + AsmJsFunc* func = AsmJsFunc::FromSymbol(sym); if( !m.SetExportFunc( func ) ) { return m.FailName( node, _u("Error adding return Symbol %s"), name ); @@ -1008,12 +1007,12 @@ namespace Js return m.FailName( node, _u("Symbol %s not recognized inside module"), value->name() ); } - if( sym->GetSymbolType() != AsmJsSymbol::ModuleFunction ) + if (!AsmJsFunc::Is(sym)) { - return m.FailName( node, _u("Symbol %s can only be a function of the module"), value->name() ); + return m.FailName(node, _u("Symbol %s can only be a function of the module"), value->name()); } - AsmJsFunc* func = sym->Cast(); + AsmJsFunc* func = AsmJsFunc::FromSymbol(sym); if( !m.AddExport( field->name(), func->GetFunctionIndex() ) ) { return m.FailName( node, _u("Error adding return Symbol %s"), value->name() ); @@ -1055,12 +1054,12 @@ namespace Js else { //Check name - if(symFunctionTable->GetSymbolType() != AsmJsSymbol::FuncPtrTable ) + if(!AsmJsFunctionTable::Is(symFunctionTable)) { return m.FailName( varStmt, _u("Variable %s is already defined"), tableName ); } - AsmJsFunctionTable* table = symFunctionTable->Cast(); + AsmJsFunctionTable* table = AsmJsFunctionTable::FromSymbol(symFunctionTable); if( table->IsDefined() ) { return m.FailName( varStmt, _u("Multiple declaration of function table %s"), tableName ); @@ -1094,11 +1093,11 @@ namespace Js if( ParserWrapper::IsNameDeclaration( funcNameNode ) ) { AsmJsSymbol* sym = m.LookupIdentifier( funcNameNode->name() ); - if( !sym || sym->GetSymbolType() != AsmJsSymbol::ModuleFunction ) + if (!AsmJsFunc::Is(sym)) { return m.FailName( varStmt, _u("Element in function table %s is not a function"), tableName ); } - AsmJsFunc* func = sym->Cast(); + AsmJsFunc* func = AsmJsFunc::FromSymbol(sym); AsmJsRetType retType; if (!table->SupportsArgCall(func->GetArgCount(), func->GetArgTypeArray(), retType)) { @@ -1253,9 +1252,11 @@ namespace Js size = _vsnwprintf_s(buf, _countof(buf), _TRUNCATE, message, argptr); if (size == -1) { - size = 2048; + size = _countof(buf) - 1; // characters written, excluding the terminating null } +#ifdef ENABLE_SCRIPT_DEBUGGING scriptContext->RaiseMessageToDebugger(messageType, buf, scriptContext->GetUrl()); +#endif if (PHASE_TRACE1(AsmjsPhase) || PHASE_TESTTRACE1(AsmjsPhase)) { Output::PrintBuffer(buf, size); diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsByteCodeGenerator.cpp b/deps/chakrashim/core/lib/Runtime/Language/AsmJsByteCodeGenerator.cpp index c0a1be04589..af59a2898ac 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsByteCodeGenerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsByteCodeGenerator.cpp @@ -91,7 +91,6 @@ namespace Js , mInfo( mFunction->GetFuncInfo() ) , mCompiler( compiler ) , mByteCodeGenerator(mCompiler->GetByteCodeGenerator()) - , mNestedCallCount(0) { mWriter.Create(); @@ -149,6 +148,9 @@ namespace Js case WAsmJs::INT32: byteTable = SetConstsToTable(byteTable, 0); break; case WAsmJs::FLOAT32: byteTable = SetConstsToTable(byteTable, 0); break; case WAsmJs::FLOAT64: byteTable = SetConstsToTable(byteTable, 0); break; +#if TARGET_64 + case WAsmJs::INT64: SetConstsToTable(byteTable, 0); break; +#endif case WAsmJs::SIMD: { AsmJsSIMDValue zeroValue; @@ -244,6 +246,7 @@ namespace Js byteCodeGen->MapCacheIdsToPropertyIds( mInfo ); byteCodeGen->MapReferencedPropertyIds( mInfo ); + mWriter.SetCallSiteCount(mFunction->GetProfileIdCount()); mWriter.End(); autoCleanup.FinishCompilation(); @@ -269,20 +272,31 @@ namespace Js col = 0; } - char16 filename[_MAX_FNAME]; - char16 ext[_MAX_EXT]; - _wsplitpath_s( Configuration::Global.flags.Filename, NULL, 0, NULL, 0, filename, _MAX_FNAME, ext, _MAX_EXT ); - LPCOLESTR NoneName = _u("None"); LPCOLESTR moduleName = NoneName; - if(mCompiler->GetModuleFunctionName()) + if (mCompiler->GetModuleFunctionName()) { moduleName = mCompiler->GetModuleFunctionName()->Psz(); } - AsmJSCompiler::OutputError(mCompiler->GetScriptContext(), + char16 filename[_MAX_FNAME]; + char16 ext[_MAX_EXT]; + bool hasURL = mFunction->GetFuncBody()->GetSourceContextInfo()->url != nullptr; + Assert(hasURL || mFunction->GetFuncBody()->GetSourceContextInfo()->IsDynamic()); + if (hasURL) + { + _wsplitpath_s(mFunction->GetFuncBody()->GetSourceContextInfo()->url, NULL, 0, NULL, 0, filename, _MAX_FNAME, ext, _MAX_EXT); + } + AsmJSCompiler::OutputError( + mCompiler->GetScriptContext(), _u("\n%s%s(%d, %d)\n\tAsm.js Compilation Error function : %s::%s\n\t%s\n"), - filename, ext, line + 1, col + 1, moduleName, mFunction->GetName()->Psz(), msg); + hasURL ? filename : _u("[Dynamic code]"), + hasURL ? ext : _u(""), + line + 1, + col + 1, + moduleName, + mFunction->GetName()->Psz(), + msg); } void AsmJSByteCodeGenerator::DefineLabels() @@ -341,16 +355,15 @@ namespace Js if (decl->sxVar.pnodeInit->nop == knopName) { AsmJsSymbol * initSym = mCompiler->LookupIdentifier(decl->sxVar.pnodeInit->name(), mFunction); - if (initSym->GetSymbolType() == AsmJsSymbol::Variable) + if (AsmJsVar::Is(initSym)) { // in this case we are initializing with value of a constant var - initSource = initSym->Cast(); + initSource = AsmJsVar::FromSymbol(initSym); } else { - Assert(initSym->GetSymbolType() == AsmJsSymbol::MathConstant); Assert(initSym->GetType() == AsmJsType::Double); - AsmJsMathConst* initConst = initSym->Cast(); + AsmJsMathConst* initConst = AsmJsMathConst::FromSymbol(initSym); mWriter.AsmReg2(Js::OpCodeAsmJs::Ld_Db, var->GetLocation(), mFunction->GetConstRegister(*initConst->GetVal())); } } @@ -541,10 +554,6 @@ namespace Js return EmitLdArrayBuffer( pnode ); case knopEndCode: StartStatement(pnode); - if( mFunction->GetReturnType() == AsmJsRetType::Void ) - { - mWriter.AsmReg1( Js::OpCodeAsmJs::LdUndef, AsmJsFunctionMemory::ReturnRegister ); - } mWriter.MarkAsmJsLabel( mFunction->GetFuncInfo()->singleExit ); mWriter.EmptyAsm( OpCodeAsmJs::Ret ); EndStatement(pnode); @@ -621,8 +630,6 @@ namespace Js mWriter.AsmBr( pnode->sxJump.pnodeTarget->sxStmt.continueLabel ); EndStatement(pnode); break; - case knopLabel: - break; case knopVarDecl: throw AsmJsCompilationException( _u("Variable declaration must happen at the top of the function") ); break; @@ -773,8 +780,6 @@ namespace Js throw AsmJsCompilationException( _u("Different return type for the function") ); } retType = AsmJsRetType::Void; - // Make sure we return something - mWriter.AsmReg1(Js::OpCodeAsmJs::LdUndef, AsmJsFunctionMemory::ReturnRegister); } else { @@ -926,28 +931,116 @@ namespace Js return false; } - // First set of opcode are for External calls, second set is for internal calls - static const OpCodeAsmJs callOpCode[2][7] = + RegSlot AsmJsFunc::AcquireTmpRegisterGeneric(AsmJsRetType retType) + { + switch (retType.which()) + { + case AsmJsRetType::Signed: + return AcquireTmpRegister(); + case AsmJsRetType::Double: + return AcquireTmpRegister(); + case AsmJsRetType::Float: + return AcquireTmpRegister(); + case AsmJsRetType::Float32x4: + case AsmJsRetType::Int32x4: + case AsmJsRetType::Int16x8: + case AsmJsRetType::Int8x16: + case AsmJsRetType::Uint32x4: + case AsmJsRetType::Uint16x8: + case AsmJsRetType::Uint8x16: + case AsmJsRetType::Bool32x4: + case AsmJsRetType::Bool16x8: + case AsmJsRetType::Bool8x16: + return AcquireTmpRegister(); + case AsmJsRetType::Void: + return Js::Constants::NoRegister; + default: + Assert(UNREACHED); + return Js::Constants::NoRegister; + } + } + + bool AsmJsFunc::IsVarLocationGeneric(const EmitExpressionInfo* pnode) { + if (pnode->type.isInt()) { - OpCodeAsmJs::StartCall - , OpCodeAsmJs::Call - , OpCodeAsmJs::ArgOut_Db - , OpCodeAsmJs::ArgOut_Int - , OpCodeAsmJs::Conv_VTD - , OpCodeAsmJs::Conv_VTI - , OpCodeAsmJs::Conv_VTF - }, - { - OpCodeAsmJs::I_StartCall - , OpCodeAsmJs::I_Call - , OpCodeAsmJs::I_ArgOut_Db - , OpCodeAsmJs::I_ArgOut_Int - , OpCodeAsmJs::I_Conv_VTD - , OpCodeAsmJs::I_Conv_VTI - , OpCodeAsmJs::I_Conv_VTF + return IsVarLocation(pnode); } - }; + else if (pnode->type.isDouble()) + { + return IsVarLocation(pnode); + } + else if (pnode->type.isFloat()) + { + return IsVarLocation(pnode); + } + else if (pnode->type.isSIMDType()) + { + return IsVarLocation(pnode); + } + else + { + // Vars must have concrete type, so any "-ish" or "maybe" type + // cannot be in a var location + return false; + } + } + + RegSlot AsmJSByteCodeGenerator::EmitIndirectCallIndex(ParseNode* identifierNode, ParseNode* indexNode) + { + // check for table size annotation + if (indexNode->nop != knopAnd) + { + throw AsmJsCompilationException(_u("Function table call must be of format identifier[expr & NumericLiteral](...)")); + } + + ParseNode* tableSizeNode = ParserWrapper::GetBinaryRight(indexNode); + if (tableSizeNode->nop != knopInt) + { + throw AsmJsCompilationException(_u("Function table call must be of format identifier[expr & NumericLiteral](...)")); + } + if (tableSizeNode->sxInt.lw < 0) + { + throw AsmJsCompilationException(_u("Function table size must be positive")); + } + const uint tableSize = tableSizeNode->sxInt.lw + 1; + if (!::Math::IsPow2(tableSize)) + { + throw AsmJsCompilationException(_u("Function table size must be a power of 2")); + } + + // Check for function table identifier + if (!ParserWrapper::IsNameDeclaration(identifierNode)) + { + throw AsmJsCompilationException(_u("Function call must be of format identifier(...) or identifier[expr & size](...)")); + } + PropertyName funcName = identifierNode->name(); + AsmJsFunctionDeclaration* sym = mCompiler->LookupFunction(funcName); + if (!sym) + { + throw AsmJsCompilationException(_u("Unable to find function table %s"), funcName->Psz()); + } + else + { + if (!AsmJsFunctionTable::Is(sym)) + { + throw AsmJsCompilationException(_u("Identifier %s is not a function table"), funcName->Psz()); + } + AsmJsFunctionTable* funcTable = AsmJsFunctionTable::FromSymbol(sym); + if (funcTable->GetSize() != tableSize) + { + throw AsmJsCompilationException(_u("Trying to load from Function table %s of size [%d] with size [%d]"), funcName->Psz(), funcTable->GetSize(), tableSize); + } + } + + const EmitExpressionInfo& indexInfo = Emit(indexNode); + if (!indexInfo.type.isInt()) + { + throw AsmJsCompilationException(_u("Array Buffer View index must be type int")); + } + CheckNodeLocation(indexInfo, int); + return indexInfo.location; + } Js::EmitExpressionInfo AsmJSByteCodeGenerator::EmitCall(ParseNode * pnode, AsmJsRetType expectedType /*= AsmJsType::Void*/) { @@ -962,58 +1055,7 @@ namespace Js identifierNode = ParserWrapper::GetBinaryLeft( pnode->sxCall.pnodeTarget ); ParseNode* indexNode = ParserWrapper::GetBinaryRight( pnode->sxCall.pnodeTarget ); - // check for table size annotation - if( indexNode->nop != knopAnd ) - { - throw AsmJsCompilationException( _u("Function table call must be of format identifier[expr & NumericLiteral](...)") ); - } - - ParseNode* tableSizeNode = ParserWrapper::GetBinaryRight( indexNode ); - if( tableSizeNode->nop != knopInt ) - { - throw AsmJsCompilationException( _u("Function table call must be of format identifier[expr & NumericLiteral](...)") ); - } - if (tableSizeNode->sxInt.lw < 0) - { - throw AsmJsCompilationException(_u("Function table size must be positive")); - } - const uint tableSize = tableSizeNode->sxInt.lw+1; - if( !::Math::IsPow2(tableSize) ) - { - throw AsmJsCompilationException( _u("Function table size must be a power of 2") ); - } - - // Check for function table identifier - if( !ParserWrapper::IsNameDeclaration( identifierNode ) ) - { - throw AsmJsCompilationException( _u("Function call must be of format identifier(...) or identifier[expr & size](...)") ); - } - PropertyName funcName = identifierNode->name(); - AsmJsFunctionDeclaration* sym = mCompiler->LookupFunction( funcName ); - if( !sym ) - { - throw AsmJsCompilationException( _u("Unable to find function table %s"), funcName->Psz() ); - } - else - { - if( sym->GetSymbolType() != AsmJsSymbol::FuncPtrTable ) - { - throw AsmJsCompilationException( _u("Identifier %s is not a function table"), funcName->Psz() ); - } - AsmJsFunctionTable* funcTable = sym->Cast(); - if( funcTable->GetSize() != tableSize ) - { - throw AsmJsCompilationException( _u("Trying to load from Function table %s of size [%d] with size [%d]"), funcName->Psz(), funcTable->GetSize(), tableSize ); - } - } - - const EmitExpressionInfo& indexInfo = Emit( indexNode ); - if( !indexInfo.type.isInt() ) - { - throw AsmJsCompilationException( _u("Array Buffer View index must be type int") ); - } - CheckNodeLocation( indexInfo, int ); - funcTableIndexRegister = indexInfo.location; + funcTableIndexRegister = EmitIndirectCallIndex(identifierNode, indexNode); } if( !ParserWrapper::IsNameDeclaration( identifierNode ) ) @@ -1027,25 +1069,24 @@ namespace Js throw AsmJsCompilationException( _u("Undefined function %s"), funcName->Psz() ); } - - if (sym->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction) + if (AsmJsSIMDFunction::Is(sym)) { - AsmJsSIMDFunction *simdFun = sym->Cast(); + AsmJsSIMDFunction *simdFun = AsmJsSIMDFunction::FromSymbol(sym); if (simdFun->IsSimdLoadFunc() || simdFun->IsSimdStoreFunc()) { - return EmitSimdLoadStoreBuiltin(pnode, sym->Cast(), expectedType); + return EmitSimdLoadStoreBuiltin(pnode, AsmJsSIMDFunction::FromSymbol(sym), expectedType); } else { - return EmitSimdBuiltin(pnode, sym->Cast(), expectedType); + return EmitSimdBuiltin(pnode, AsmJsSIMDFunction::FromSymbol(sym), expectedType); } } - const bool isFFI = sym->GetSymbolType() == AsmJsSymbol::ImportFunction; - const bool isMathBuiltin = sym->GetSymbolType() == AsmJsSymbol::MathBuiltinFunction; + const bool isFFI = AsmJsImportFunction::Is(sym); + const bool isMathBuiltin = AsmJsMathFunction::Is(sym); if(isMathBuiltin) { - return EmitMathBuiltin(pnode, sym->Cast()); + return EmitMathBuiltin(pnode, AsmJsMathFunction::FromSymbol(sym)); } // math builtins have different requirements for call-site coercion @@ -1053,46 +1094,106 @@ namespace Js { throw AsmJsCompilationException(_u("Different return type found for function %s"), funcName->Psz()); } - const int StartCallIndex = 0; - const int CallIndex = 1; - const int ArgOut_DbIndex = 2; - const int ArgOut_IntIndex = 3; - const int Conv_VTDIndex = 4; - const int Conv_VTIIndex =5; - const int Conv_VTFIndex = 6; - const int funcOpCode = isFFI ? 0 : 1; - // StartCall const ArgSlot argCount = pnode->sxCall.argCount; - StartStatement(pnode); - ++mNestedCallCount; + EmitExpressionInfo * argArray = nullptr; + AsmJsType* types = nullptr; - uint startCallOffset = mWriter.GetCurrentOffset(); - auto startCallChunk = mWriter.GetCurrentChunk(); - uint startCallChunkOffset = startCallChunk->GetCurrentOffset(); + // first, evaluate function arguments + if (argCount > 0) + { + ParseNode* argNode = pnode->sxCall.pnodeArgs; + argArray = AnewArray(&mAllocator, EmitExpressionInfo, argCount); + types = AnewArray(&mAllocator, AsmJsType, argCount); + for (ArgSlot i = 0; i < argCount; i++) + { + ParseNode* arg = argNode; + if (argNode->nop == knopList) + { + arg = ParserWrapper::GetBinaryLeft(argNode); + argNode = ParserWrapper::GetBinaryRight(argNode); + } + + // Emit argument + EmitExpressionInfo argInfo = Emit(arg); + + types[i] = argInfo.type; + argArray[i].type = argInfo.type; - bool patchStartCall = sym->GetArgCount() == Constants::InvalidArgSlot; - if (patchStartCall) + if (!mFunction->IsVarLocationGeneric(&argInfo)) + { + argArray[i].location = argInfo.location; + } + else + { + // If argument is a var, another argument might change its value, so move it to a temp register + mFunction->ReleaseLocationGeneric(&argInfo); + if (argInfo.type.isInt()) + { + argArray[i].location = mFunction->AcquireTmpRegister(); + mWriter.AsmReg2(OpCodeAsmJs::Ld_Int, argArray[i].location, argInfo.location); + } + else if (argInfo.type.isFloat()) + { + argArray[i].location = mFunction->AcquireTmpRegister(); + mWriter.AsmReg2(OpCodeAsmJs::Ld_Flt, argArray[i].location, argInfo.location); + } + else if (argInfo.type.isDouble()) + { + argArray[i].location = mFunction->AcquireTmpRegister(); + mWriter.AsmReg2(OpCodeAsmJs::Ld_Db, argArray[i].location, argInfo.location); + } + else if (argInfo.type.isSIMDType()) + { + argArray[i].location = mFunction->AcquireTmpRegister(); + LoadSimd(argArray[i].location, argInfo.location, AsmJsVarType::Which(argInfo.type.GetWhich())); + } + else + { + throw AsmJsCompilationException(_u("Function %s doesn't support argument of type %s"), funcName->Psz(), argInfo.type.toChars()); + } + } + } + } + + // Check if this function supports the type of these arguments + AsmJsRetType retType; + const bool supported = sym->SupportsArgCall(argCount, types, retType); + if (!supported) { - // we will not know the types of the arguments for the first call to a deferred function, - // so we put a placeholder instr in the bytecode and then patch it with correct arg size - // once we evaluate the arguments - mWriter.AsmStartCall(callOpCode[funcOpCode][StartCallIndex], Constants::InvalidArgSlot); + throw AsmJsCompilationException(_u("Function %s doesn't support arguments"), funcName->Psz()); } - else + if (types) { - // args size + 1 pointer - const ArgSlot argByteSize = ArgSlotMath::Add(sym->GetArgByteSize(argCount), sizeof(Var)); - mWriter.AsmStartCall(callOpCode[funcOpCode][StartCallIndex], argByteSize); + AdeleteArray(&mAllocator, argCount, types); + types = nullptr; } - AutoArrayPtr types(nullptr, 0); - int maxDepthForLevel = mFunction->GetArgOutDepth(); + + // need to validate return type again because function might support arguments, + // but return a different type, i.e.: abs(int) -> int, but expecting double + // don't validate the return type for foreign import functions + if (!isFFI && retType != expectedType) + { + throw AsmJsCompilationException(_u("Function %s returns different type"), funcName->Psz()); + } + + const ArgSlot argByteSize = ArgSlotMath::Add(sym->GetArgByteSize(argCount), sizeof(Var)); + // +1 is for function object + ArgSlot runtimeArg = ArgSlotMath::Add(argCount, 1); + if (!isFFI) // for non import functions runtimeArg is calculated from argByteSize + { + runtimeArg = (ArgSlot)(::ceil((double)(argByteSize / sizeof(Var)))) + 1; + } + + StartStatement(pnode); + + mWriter.AsmStartCall(isFFI ? OpCodeAsmJs::StartCall : OpCodeAsmJs::I_StartCall, argByteSize); + if( argCount > 0 ) { ParseNode* argNode = pnode->sxCall.pnodeArgs; uint16 regSlotLocation = 1; - types.Set(HeapNewArray( AsmJsType, argCount ), argCount); for(ArgSlot i = 0; i < argCount; i++) { @@ -1103,25 +1204,21 @@ namespace Js arg = ParserWrapper::GetBinaryLeft( argNode ); argNode = ParserWrapper::GetBinaryRight( argNode ); } - - // Emit argument - const EmitExpressionInfo& argInfo = Emit( arg ); - types[i] = argInfo.type; + EmitExpressionInfo argInfo = argArray[i]; // OutParams i if( argInfo.type.isDouble() ) { CheckNodeLocation( argInfo, double ); - if (callOpCode[funcOpCode][ArgOut_DbIndex] == OpCodeAsmJs::ArgOut_Db) + if (isFFI) { - mWriter.AsmReg2(callOpCode[funcOpCode][ArgOut_DbIndex], regSlotLocation, argInfo.location); + mWriter.AsmReg2(OpCodeAsmJs::ArgOut_Db, regSlotLocation, argInfo.location); regSlotLocation++; // in case of external calls this is boxed and converted to a Var } else { - mWriter.AsmReg2(callOpCode[funcOpCode][ArgOut_DbIndex], regSlotLocation, argInfo.location); + mWriter.AsmReg2(OpCodeAsmJs::I_ArgOut_Db, regSlotLocation, argInfo.location); regSlotLocation += sizeof(double) / sizeof(Var);// in case of internal calls we will pass this arg as double } - mFunction->ReleaseLocation( &argInfo ); } else if (argInfo.type.isFloat()) { @@ -1132,14 +1229,12 @@ namespace Js } mWriter.AsmReg2(OpCodeAsmJs::I_ArgOut_Flt, regSlotLocation, argInfo.location); regSlotLocation++; - mFunction->ReleaseLocation(&argInfo); } else if (argInfo.type.isInt()) { CheckNodeLocation( argInfo, int ); - mWriter.AsmReg2(callOpCode[funcOpCode][ArgOut_IntIndex], regSlotLocation, argInfo.location); + mWriter.AsmReg2(isFFI ? OpCodeAsmJs::ArgOut_Int : OpCodeAsmJs::I_ArgOut_Int, regSlotLocation, argInfo.location); regSlotLocation++; - mFunction->ReleaseLocation( &argInfo ); } else if (argInfo.type.isSIMDType()) { @@ -1187,83 +1282,39 @@ namespace Js } mWriter.AsmReg2(opcode, regSlotLocation, argInfo.location); regSlotLocation += sizeof(AsmJsSIMDValue) / sizeof(Var); - mFunction->ReleaseLocation(&argInfo); } else { throw AsmJsCompilationException(_u("Function %s doesn't support argument of type %s"), funcName->Psz(), argInfo.type.toChars()); } - // if there are nested calls, track whichever is the deepest - if (maxDepthForLevel < mFunction->GetArgOutDepth()) - { - maxDepthForLevel = mFunction->GetArgOutDepth(); - } } - } - // Check if this function supports the type of these arguments - AsmJsRetType retType; - const bool supported = sym->SupportsArgCall( argCount, types, retType ); - if( !supported ) - { - throw AsmJsCompilationException( _u("Function %s doesn't support arguments"), funcName->Psz() ); - } - // need to validate return type again because function might support arguments, - // but return a different type, i.e.: abs(int) -> int, but expecting double - // don't validate the return type for foreign import functions - if( !isFFI && retType != expectedType ) - { - throw AsmJsCompilationException( _u("Function %s returns different type"), funcName->Psz() ); - } - - const ArgSlot argByteSize = ArgSlotMath::Add(sym->GetArgByteSize(argCount), sizeof(Var)); - // +1 is for function object - ArgSlot runtimeArg = ArgSlotMath::Add(argCount, 1); - if (funcOpCode == 1) // for non import functions runtimeArg is calculated from argByteSize - { - runtimeArg = (ArgSlot)(::ceil((double)(argByteSize / sizeof(Var)))) + 1; + for (ArgSlot i = argCount; i > 0; --i) + { + mFunction->ReleaseLocationGeneric(&argArray[i - 1]); + } + AdeleteArray(&mAllocator, argCount, argArray); + argArray = nullptr; } - // +1 is for return address - maxDepthForLevel += ArgSlotMath::Add(runtimeArg, 1); // Make sure we have enough memory allocated for OutParameters - if (mNestedCallCount > 1) - { - mFunction->SetArgOutDepth(maxDepthForLevel); - } - else - { - mFunction->SetArgOutDepth(0); - } - mFunction->UpdateMaxArgOutDepth(maxDepthForLevel); - - if (patchStartCall) - { - uint latestOffset = mWriter.GetCurrentOffset(); - auto latestChunk = mWriter.GetCurrentChunk(); - uint latestChunkOffset = latestChunk->GetCurrentOffset(); - - // now that we know the types, we can patch the StartCall instr - startCallChunk->SetCurrentOffset(startCallChunkOffset); - mWriter.SetCurrent(startCallOffset, startCallChunk); - - // args size + 1 pointer - mWriter.AsmStartCall(callOpCode[funcOpCode][StartCallIndex], argByteSize, true /* isPatching */); - - // ... and return to where we left off in the buffer like nothing ever happened - latestChunk->SetCurrentOffset(latestChunkOffset); - mWriter.SetCurrent(latestOffset, latestChunk); - } + // +1 is for return address + mFunction->UpdateMaxArgOutDepth(ArgSlotMath::Add(runtimeArg, 1)); // Load function from env + ProfileId profileId = Js::Constants::NoProfileId; + RegSlot funcReg = Js::Constants::NoRegister; switch( sym->GetSymbolType() ) { case AsmJsSymbol::ModuleFunction: - LoadModuleFunction( AsmJsFunctionMemory::FunctionRegister, sym->GetFunctionIndex() ); + funcReg = mFunction->AcquireTmpRegister(); + LoadModuleFunction(funcReg, sym->GetFunctionIndex()); + profileId = mFunction->GetNextProfileId(); break; case AsmJsSymbol::ImportFunction: - LoadModuleFFI( AsmJsFunctionMemory::FunctionRegister, sym->GetFunctionIndex() ); + funcReg = mFunction->AcquireTmpRegister(); + LoadModuleFFI(funcReg, sym->GetFunctionIndex()); break; case AsmJsSymbol::FuncPtrTable: // Make sure the user is not trying to call the function table directly @@ -1271,137 +1322,43 @@ namespace Js { throw AsmJsCompilationException(_u("Direct call to function table '%s' is not allowed"), funcName->Psz()); } - mFunction->ReleaseTmpRegister( funcTableIndexRegister ); - LoadModuleFunctionTable( AsmJsFunctionMemory::FunctionRegister, sym->GetFunctionIndex(), funcTableIndexRegister ); + mFunction->ReleaseTmpRegister(funcTableIndexRegister); + funcReg = mFunction->AcquireTmpRegister(); + LoadModuleFunctionTable(funcReg, sym->GetFunctionIndex(), funcTableIndexRegister); break; default: - Assert( false ); + throw AsmJsCompilationException(_u("Invalid function type")); } - // Call - mWriter.AsmCall( callOpCode[funcOpCode][CallIndex], AsmJsFunctionMemory::CallReturnRegister, AsmJsFunctionMemory::FunctionRegister, runtimeArg, expectedType ); // use expected type because return type could be invalid if the function is a FFI - EmitExpressionInfo info( expectedType.toType() ); - switch( expectedType.which() ) + EmitExpressionInfo info(expectedType.toType()); + mFunction->ReleaseTmpRegister(funcReg); + if (isFFI) { - case AsmJsRetType::Void: - // do nothing - break; - case AsmJsRetType::Signed: - { - RegSlot intReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2( callOpCode[funcOpCode][Conv_VTIIndex], intReg, AsmJsFunctionMemory::CallReturnRegister ); - info.location = intReg; - break; - } - case AsmJsRetType::Double: - { - RegSlot dbReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2( callOpCode[funcOpCode][Conv_VTDIndex], dbReg, AsmJsFunctionMemory::CallReturnRegister ); - info.location = dbReg; - break; - } - case AsmJsRetType::Float: - { - Assert(!isFFI); //check spec - RegSlot fltReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(callOpCode[funcOpCode][Conv_VTFIndex], fltReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = fltReg; - break; - } - case AsmJsRetType::Float32x4: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTF4, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } - case AsmJsRetType::Int32x4: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTI4, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } -#if 0 - case AsmJsRetType::Float64x2: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTD2, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } -#endif // 0 + RegSlot retReg = mFunction->AcquireTmpRegister(); + mWriter.AsmCall(OpCodeAsmJs::Call, retReg, funcReg, runtimeArg, expectedType, profileId); - case AsmJsRetType::Int16x8: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTI8, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } - case AsmJsRetType::Int8x16: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTI16, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } - case AsmJsRetType::Uint32x4: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTU4, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } - case AsmJsRetType::Uint16x8: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTU8, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } - case AsmJsRetType::Uint8x16: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTU16, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } - case AsmJsRetType::Bool32x4: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTB4, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } - case AsmJsRetType::Bool16x8: - { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTB8, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; + mFunction->ReleaseTmpRegister(retReg); + info.location = mFunction->AcquireTmpRegisterGeneric(expectedType); + + switch (expectedType.which()) + { + case AsmJsRetType::Void: + break; + case AsmJsRetType::Signed: + mWriter.AsmReg2(OpCodeAsmJs::Conv_VTI, info.location, retReg); + break; + case AsmJsRetType::Double: + mWriter.AsmReg2(OpCodeAsmJs::Conv_VTD, info.location, retReg); + break; + default: + Assert(UNREACHED); + } } - case AsmJsRetType::Bool8x16: + else { - Assert(!isFFI); - RegSlot simdReg = mFunction->AcquireTmpRegister(); - mWriter.AsmReg2(OpCodeAsmJs::Simd128_I_Conv_VTB16, simdReg, AsmJsFunctionMemory::CallReturnRegister); - info.location = simdReg; - break; - } - default: - break; + info.location = mFunction->AcquireTmpRegisterGeneric(expectedType); + mWriter.AsmCall(OpCodeAsmJs::I_Call, info.location, funcReg, runtimeArg, expectedType, profileId); } // after foreign function call, we need to make sure that the heap hasn't been detached @@ -1412,8 +1369,6 @@ namespace Js } EndStatement(pnode); - --mNestedCallCount; - Assert(mNestedCallCount >= 0); return info; } @@ -1438,9 +1393,9 @@ namespace Js arg = ParserWrapper::GetBinaryLeft(argNode); argNode = ParserWrapper::GetBinaryRight(argNode); } - if (func->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction) + if (AsmJsSIMDFunction::Is(func)) { - AsmJsSIMDFunction *simdFunc = func->Cast(); + AsmJsSIMDFunction *simdFunc = AsmJsSIMDFunction::FromSymbol(func); if (arg->nop == knopCall) { @@ -1491,7 +1446,7 @@ namespace Js throw AsmJsCompilationException(_u("Invalid call as SIMD argument. Expecting fround.")); } } - else if (argCall->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction && argCall->Cast()->GetReturnType().toType() == simdFunc->GetArgType(i)) + else if (AsmJsSIMDFunction::Is(argCall) && AsmJsSIMDFunction::FromSymbol(argCall)->GetReturnType().toType() == simdFunc->GetArgType(i)) { // any other simd operation. call arguments have to be SIMD operations of expected arg type. argInfo = EmitCall(arg, simdFunc->GetArgType(i).toRetType()); @@ -1771,11 +1726,11 @@ namespace Js PropertyName name = arrayNameNode->name(); AsmJsSymbol* sym = mCompiler->LookupIdentifier(name, mFunction); - if (!sym || sym->GetSymbolType() != AsmJsSymbol::ArrayView) + if (!AsmJsArrayView::Is(sym)) { throw AsmJsCompilationException(_u("Invalid identifier %s"), name->Psz()); } - AsmJsArrayView* arrayView = sym->Cast(); + AsmJsArrayView* arrayView = AsmJsArrayView::FromSymbol(sym); ArrayBufferView::ViewType viewType = arrayView->GetViewType(); // Arg2 - index @@ -1945,8 +1900,6 @@ namespace Js return EmitMinMax(pnode, mathFunction); } - ++mNestedCallCount; - const ArgSlot argCount = pnode->sxCall.argCount; ParseNode* argNode = pnode->sxCall.pnodeArgs; const bool isFRound = AsmJsMathFunction::IsFround(mathFunction); @@ -1977,7 +1930,6 @@ namespace Js AutoArrayPtr types(nullptr, 0); AutoArrayPtr argsInfo(nullptr, 0); - int maxDepthForLevel = mFunction->GetArgOutDepth(); if( argCount > 0 ) { types.Set(HeapNewArray(AsmJsType, argCount), argCount); @@ -2009,11 +1961,6 @@ namespace Js argsInfo[i].type = argInfo.type; argsInfo[i].location = argInfo.location; } - // if there are nested calls, track whichever is the deepest - if (maxDepthForLevel < mFunction->GetArgOutDepth()) - { - maxDepthForLevel = mFunction->GetArgOutDepth(); - } } } StartStatement(pnode); @@ -2035,19 +1982,10 @@ namespace Js const int argByteSize = mathFunction->GetArgByteSize(argCount) + sizeof(Var); // + 1 is for function object int runtimeArg = (int)(::ceil((double)(argByteSize / sizeof(Var)))) + 1; - // + 1 for return address - maxDepthForLevel += runtimeArg + 1; // Make sure we have enough memory allocated for OutParameters - if (mNestedCallCount > 1) - { - mFunction->SetArgOutDepth(maxDepthForLevel); - } - else - { - mFunction->SetArgOutDepth(0); - } - mFunction->UpdateMaxArgOutDepth(maxDepthForLevel); + // + 1 for return address + mFunction->UpdateMaxArgOutDepth(runtimeArg + 1); const bool isInt = retType.toType().isInt(); const bool isFloatish = retType.toType().isFloatish(); @@ -2098,15 +2036,12 @@ namespace Js } #endif EndStatement(pnode); - --mNestedCallCount; return emitInfo; } EmitExpressionInfo AsmJSByteCodeGenerator::EmitMinMax(ParseNode* pnode, AsmJsMathFunction* mathFunction) { Assert(mathFunction->GetArgCount() == 2); - ++mNestedCallCount; - uint16 argCount = pnode->sxCall.argCount; ParseNode* argNode = pnode->sxCall.pnodeArgs; @@ -2124,7 +2059,6 @@ namespace Js argNode = ParserWrapper::GetBinaryRight(argNode); // Emit first arg as arg0 argsInfo[0] = Emit(arg); - int maxDepthForLevel = mFunction->GetArgOutDepth(); types[0] = argsInfo[0].type; EmitExpressionInfo dstInfo; @@ -2143,12 +2077,6 @@ namespace Js argsInfo[1] = Emit(arg); types[1] = argsInfo[1].type; - // if there are nested calls, track whichever is the deepest - if (maxDepthForLevel < mFunction->GetArgOutDepth()) - { - maxDepthForLevel = mFunction->GetArgOutDepth(); - } - // Check if this function supports the type of these arguments AsmJsRetType retType; OpCodeAsmJs op; @@ -2162,19 +2090,9 @@ namespace Js // +1 is for function object int runtimeArg = (int)(::ceil((double)(argByteSize / sizeof(Var)))) + 1; // +1 is for return address - maxDepthForLevel += runtimeArg + 1; // Make sure we have enough memory allocated for OutParameters - if (mNestedCallCount > 1) - { - mFunction->SetArgOutDepth(maxDepthForLevel); - } - else - { - mFunction->SetArgOutDepth(0); - } - mFunction->UpdateMaxArgOutDepth(maxDepthForLevel); - maxDepthForLevel = 0; + mFunction->UpdateMaxArgOutDepth(runtimeArg + 1); mFunction->ReleaseLocationGeneric(&argsInfo[1]); mFunction->ReleaseLocationGeneric(&argsInfo[0]); @@ -2210,7 +2128,6 @@ namespace Js } #endif } - --mNestedCallCount; return dstInfo; } @@ -2229,7 +2146,7 @@ namespace Js { case AsmJsSymbol::Variable: { - AsmJsVar * var = sym->Cast(); + AsmJsVar * var = AsmJsVar::FromSymbol(sym); if (!var->isMutable()) { // currently const is only allowed for variables at module scope @@ -2259,7 +2176,7 @@ namespace Js case AsmJsSymbol::Argument: case AsmJsSymbol::ConstantImport: { - AsmJsVarBase* var = sym->Cast(); + AsmJsVarBase* var = AsmJsVarBase::FromSymbol(sym); if( source == AsmJsLookupSource::AsmJsFunction ) { return EmitExpressionInfo( var->GetLocation(), var->GetType() ); @@ -2298,7 +2215,7 @@ namespace Js } case AsmJsSymbol::MathConstant: { - AsmJsMathConst* mathConst = sym->Cast(); + AsmJsMathConst* mathConst = AsmJsMathConst::FromSymbol(sym); Assert(mathConst->GetType().isDouble()); RegSlot loc = mFunction->AcquireTmpRegister(); mWriter.AsmReg2( OpCodeAsmJs::Ld_Db, loc, mFunction->GetConstRegister(*mathConst->GetVal()) ); @@ -2330,9 +2247,9 @@ namespace Js if(indexNode->nop == knopName) { AsmJsSymbol * declSym = mCompiler->LookupIdentifier(indexNode->name(), mFunction); - if (declSym && !declSym->isMutable() && declSym->GetSymbolType() == AsmJsSymbol::Variable) + if (AsmJsVar::Is(declSym) && !declSym->isMutable()) { - AsmJsVar * definition = declSym->Cast(); + AsmJsVar * definition = AsmJsVar::FromSymbol(declSym); if(definition->GetVarType().isInt()) { slot = (uint32)definition->GetIntInitialiser(); @@ -2454,9 +2371,9 @@ namespace Js if (index->nop == knopName) { AsmJsSymbol * declSym = mCompiler->LookupIdentifier(index->name(), mFunction); - if (declSym && !declSym->isMutable() && declSym->GetSymbolType() == AsmJsSymbol::Variable) + if (AsmJsVar::Is(declSym) && !declSym->isMutable()) { - AsmJsVar * definition = declSym->Cast(); + AsmJsVar * definition = AsmJsVar::FromSymbol(declSym); if (definition->GetVarType().isInt()) { slot = (uint32)definition->GetIntInitialiser(); @@ -2502,11 +2419,11 @@ namespace Js PropertyName name = arrayNameNode->name(); AsmJsSymbol* sym = mCompiler->LookupIdentifier(name, mFunction); - if( !sym || sym->GetSymbolType() != AsmJsSymbol::ArrayView ) + if(!AsmJsArrayView::Is(sym)) { throw AsmJsCompilationException( _u("Invalid identifier %s"), name->Psz() ); } - AsmJsArrayView* arrayView = sym->Cast(); + AsmJsArrayView* arrayView = AsmJsArrayView::FromSymbol(sym); ArrayBufferView::ViewType viewType = arrayView->GetViewType(); OpCodeAsmJs op; @@ -2547,9 +2464,9 @@ namespace Js PropertyName name = lhs->name(); AsmJsLookupSource::Source source; AsmJsSymbol* sym = mCompiler->LookupIdentifier( name, mFunction, &source ); - if( !sym ) + if(!AsmJsVarBase::Is(sym)) { - throw AsmJsCompilationException( _u("Undefined identifier %s"), name->Psz() ); + throw AsmJsCompilationException( _u("Identifier %s is not a variable"), name->Psz() ); } if( !sym->isMutable() ) @@ -2557,10 +2474,10 @@ namespace Js throw AsmJsCompilationException( _u("Cannot assign to identifier %s"), name->Psz() ); } - AsmJsVarBase* var = sym->Cast(); + AsmJsVarBase* var = AsmJsVarBase::FromSymbol(sym); if( !var->GetType().isSuperType( rType ) ) { - throw AsmJsCompilationException( _u("Cannot assign this type to identifier %s"), name->Psz() ); + throw AsmJsCompilationException( _u("Cannot assign type %s to identifier %s"), rType.toChars(), name->Psz() ); } switch( source ) @@ -2633,12 +2550,12 @@ namespace Js PropertyName name = arrayNameNode->name(); AsmJsSymbol* sym = mCompiler->LookupIdentifier(name, mFunction); - if( !sym || sym->GetSymbolType() != AsmJsSymbol::ArrayView ) + if (!AsmJsArrayView::Is(sym)) { throw AsmJsCompilationException( _u("Invalid identifier %s"), name->Psz() ); } // must emit index expr first in case it has side effects - AsmJsArrayView* arrayView = sym->Cast(); + AsmJsArrayView* arrayView = AsmJsArrayView::FromSymbol(sym); ArrayBufferView::ViewType viewType = arrayView->GetViewType(); OpCodeAsmJs op; @@ -3353,8 +3270,11 @@ namespace Js void AsmJSByteCodeGenerator::LoadModuleFunctionTable( RegSlot dst, RegSlot FuncTableIndex, RegSlot FuncIndexLocation ) { - mWriter.AsmSlot( OpCodeAsmJs::LdSlotArr, AsmJsFunctionMemory::ModuleSlotRegister, AsmJsFunctionMemory::ModuleEnvRegister, FuncTableIndex+mCompiler->GetFuncPtrOffset() ); - mWriter.AsmSlot( OpCodeAsmJs::LdArr_Func, dst, AsmJsFunctionMemory::ModuleSlotRegister, FuncIndexLocation ); + RegSlot slotReg = mFunction->AcquireTmpRegister(); + mWriter.AsmSlot( OpCodeAsmJs::LdSlotArr, slotReg, AsmJsFunctionMemory::ModuleEnvRegister, FuncTableIndex+mCompiler->GetFuncPtrOffset() ); + mWriter.AsmSlot( OpCodeAsmJs::LdArr_Func, dst, slotReg, FuncIndexLocation ); + + mFunction->ReleaseTmpRegister(slotReg); } void AsmJSByteCodeGenerator::SetModuleInt( Js::RegSlot dst, RegSlot src ) diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsByteCodeGenerator.h b/deps/chakrashim/core/lib/Runtime/Language/AsmJsByteCodeGenerator.h index d9d9bb13f21..02cd244d9ee 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsByteCodeGenerator.h +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsByteCodeGenerator.h @@ -79,6 +79,8 @@ namespace Js LoadTypedArray, StoreTypedArray, }; + RegSlot EmitIndirectCallIndex(ParseNode* identifierNode, ParseNode* indexNode); + EmitExpressionInfo EmitTypedArrayIndex(ParseNode* indexNode, OpCodeAsmJs &op, uint32 &indexSlot, ArrayBufferView::ViewType viewType, TypedArrayEmitType emitType); EmitExpressionInfo EmitAssignment( ParseNode * pnode ); EmitExpressionInfo EmitReturn( ParseNode * pnode ); diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.cpp b/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.cpp index f424d6cc0c8..e9927914ffe 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.cpp @@ -216,12 +216,16 @@ namespace Js Js::Throw::OutOfMemory(); } - if (!GetCodeGenAllocator()->emitBufferManager.CommitBuffer(allocation, buffer, codeSize, mEncodeBuffer)) + if (!GetCodeGenAllocator()->emitBufferManager.CommitBuffer(allocation, allocation->bytesCommitted, buffer, codeSize, mEncodeBuffer)) { Js::Throw::OutOfMemory(); } - functionBody->GetScriptContext()->GetThreadContext()->SetValidCallTargetForCFG(buffer); + BYTE* callTarget = buffer; +#ifdef _M_ARM + callTarget = (BYTE*)((uintptr_t)buffer | 0x1); // We have to add the thumb bit on arm +#endif + functionBody->GetScriptContext()->GetThreadContext()->SetValidCallTargetForCFG(callTarget); // TODO: improve this once EntryPoint cleanup work is complete! #if 0 diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.h b/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.h index dbae0b5cedc..2633a8649d4 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.h +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.h @@ -67,7 +67,6 @@ namespace Js void OP_Label( const unaligned OpLayoutEmpty* playout ); - template void OP_LdUndef( const unaligned T* playout ); template void OP_Br( const unaligned T* playout ); template void OP_BrEq( const unaligned T* playout ); template void OP_BrEqConst( const unaligned T* playout ); @@ -114,9 +113,6 @@ namespace Js template void OP_I_ArgOut_Db( const unaligned T* playout ); template void OP_I_ArgOut_Int(const unaligned T* playout); template void OP_I_ArgOut_Flt(const unaligned T* playout); - template void OP_I_Conv_VTD( const unaligned T* playout ); - template void OP_I_Conv_VTI( const unaligned T* playout ); - template void OP_I_Conv_VTF( const unaligned T* playout ); template void OP_AsmJsLoopBody(const unaligned T* playout); @@ -223,10 +219,6 @@ namespace Js template void OP_Simd128_I_ArgOutF4(const unaligned T* playout); template void OP_Simd128_I_ArgOutI4(const unaligned T* playout); template void OP_Simd128_I_ArgOutD2(const unaligned T* playout); - - template void OP_Simd128_I_Conv_VTF4(const unaligned T* playout); - template void OP_Simd128_I_Conv_VTI4(const unaligned T* playout); - template void OP_Simd128_I_Conv_VTD2(const unaligned T* playout); }; } diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.inl b/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.inl index 7c5379b2bfb..ba114b26259 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.inl +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoder.inl @@ -179,12 +179,6 @@ namespace Js this->GetAsmJsFunctionInfo()->mbyteCodeTJMap->AddNew(mReader.GetCurrentOffset(), offset); } - template - void AsmJsEncoder::OP_LdUndef( const unaligned T* playout ) - { - AsmJsJitTemplate::LdUndef::ApplyTemplate( this, mPc, CalculateOffset(playout->R0) ); - } - template void AsmJsEncoder::OP_Br( const unaligned T* playout ) { @@ -440,21 +434,6 @@ namespace Js AsmJsJitTemplate::I_ArgOut_Int::ApplyTemplate( this, mPc, playout->R0, CalculateOffset(playout->I1)); } - template void Js::AsmJsEncoder::OP_I_Conv_VTD( const unaligned T* playout ) - { - AsmJsJitTemplate::I_Conv_VTD::ApplyTemplate(this, mPc, CalculateOffset(playout->D0), CalculateOffset(playout->D1)); - } - - template void Js::AsmJsEncoder::OP_I_Conv_VTF(const unaligned T* playout) - { - AsmJsJitTemplate::I_Conv_VTF::ApplyTemplate(this, mPc, CalculateOffset(playout->F0), CalculateOffset(playout->F1)); - } - - template void Js::AsmJsEncoder::OP_I_Conv_VTI( const unaligned T* playout ) - { - AsmJsJitTemplate::I_Conv_VTI::ApplyTemplate( this, mPc, CalculateOffset(playout->I0), CalculateOffset(playout->I1)); - } - template void Js::AsmJsEncoder::Op_LdArr( const unaligned T* playout ) { @@ -999,17 +978,4 @@ namespace Js { AsmJsJitTemplate::Simd128_I_ArgOut_D2::ApplyTemplate(this, mPc, playout->R0, CalculateOffset(playout->D2_1)); } - - template void Js::AsmJsEncoder::OP_Simd128_I_Conv_VTF4(const unaligned T* playout) - { - AsmJsJitTemplate::Simd128_I_Conv_VTF4::ApplyTemplate(this, mPc, CalculateOffset(playout->F4_0), CalculateOffset(playout->F4_1)); - } - template void Js::AsmJsEncoder::OP_Simd128_I_Conv_VTI4(const unaligned T* playout) - { - AsmJsJitTemplate::Simd128_I_Conv_VTI4::ApplyTemplate(this, mPc, CalculateOffset(playout->I4_0), CalculateOffset(playout->I4_1)); - } - template void Js::AsmJsEncoder::OP_Simd128_I_Conv_VTD2(const unaligned T* playout) - { - AsmJsJitTemplate::Simd128_I_Conv_VTD2::ApplyTemplate(this, mPc, CalculateOffset(playout->D2_0), CalculateOffset(playout->D2_1)); - } } diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoderHandler.inl b/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoderHandler.inl index afe329bd17c..5b773965a3e 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoderHandler.inl +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsEncoderHandler.inl @@ -62,9 +62,6 @@ EXDEF3 ( CUSTOM , InvalidOpCode , OP_Empty , Empty DEF3_WMS( CUSTOM , I_ArgOut_Db , OP_I_ArgOut_Db , Reg1Double1 ) DEF3_WMS( CUSTOM , I_ArgOut_Flt , OP_I_ArgOut_Flt , Reg1Float1 ) DEF3_WMS( CUSTOM , I_ArgOut_Int , OP_I_ArgOut_Int , Reg1Int1 ) - DEF3_WMS( CUSTOM , I_Conv_VTD , OP_I_Conv_VTD , Double2 ) - DEF3_WMS( CUSTOM , I_Conv_VTI , OP_I_Conv_VTI , Int2 ) - DEF3_WMS( CUSTOM , I_Conv_VTF , OP_I_Conv_VTF , Float2 ) DEF3 ( CUSTOM , AsmBr , OP_Br , AsmBr ) DEF3_WMS( CUSTOM , BrTrue_Int , OP_BrTrue , BrInt1 ) @@ -87,7 +84,6 @@ EXDEF3 ( CUSTOM , InvalidOpCode , OP_Empty , Empty DEF3_WMS( CUSTOM , Return_Int , OP_SetReturnInt , Int2 ) - DEF3_WMS( CUSTOM , LdUndef , OP_LdUndef , AsmReg1 ) DEF3_WMS( CUSTOM , LdSlotArr , OP_LdSlot , ElementSlot ) DEF3_WMS( CUSTOM , LdSlot , OP_LdSlot , ElementSlot ) DEF3_WMS( CUSTOM , LdSlot_Db , Op_LdSlot_Db , ElementSlot ) @@ -319,10 +315,6 @@ EXDEF3 ( CUSTOM , InvalidOpCode , OP_Empty , Empty DEF3_WMS( CUSTOM , Simd128_ReplaceLane_I4 , OP_Simd128_ReplaceLaneI4 , Int32x4_2Int2) DEF3_WMS( CUSTOM , Simd128_ReplaceLane_F4 , OP_Simd128_ReplaceLaneF4 , Float32x4_2Int1Float1) - DEF3_WMS( CUSTOM , Simd128_I_Conv_VTF4 , OP_Simd128_I_Conv_VTF4 , Float32x4_2 ) - DEF3_WMS( CUSTOM , Simd128_I_Conv_VTI4 , OP_Simd128_I_Conv_VTI4 , Int32x4_2 ) - //DEF3_WMS( CUSTOM , Simd128_I_Conv_VTD2 , OP_Simd128_I_Conv_VTD2 , Float64x2_2 ) - // help the caller to undefine all the macros #undef DEF2 #undef DEF3 diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsJitTemplate.h b/deps/chakrashim/core/lib/Runtime/Language/AsmJsJitTemplate.h index a637808abfb..35b7b65b8ce 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsJitTemplate.h +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsJitTemplate.h @@ -167,9 +167,6 @@ namespace Js CreateTemplate( I_ArgOut_Db, int argIndex, int offset); CreateTemplate( I_ArgOut_Flt, int argIndex, int offset); CreateTemplate( I_Call, int targetOffset, int funcOffset, int nbArgs, AsmJsRetType retType); - CreateTemplate( I_Conv_VTI, int targetOffset, int srcOffset); - CreateTemplate( I_Conv_VTD, int targetOffset, int srcOffset); - CreateTemplate( I_Conv_VTF, int targetOffset, int srcOffset); CreateTemplate( LdArr, int targetOffset, int slotVarIndex, ArrayBufferView::ViewType viewType); CreateTemplate( LdArrDb, int targetOffset, int slotVarIndex, ArrayBufferView::ViewType viewType); @@ -307,10 +304,6 @@ namespace Js CreateTemplate(Simd128_I_ArgOut_F4, int argIndex, int offset); CreateTemplate(Simd128_I_ArgOut_I4, int argIndex, int offset); CreateTemplate(Simd128_I_ArgOut_D2, int argIndex, int offset); - - CreateTemplate(Simd128_I_Conv_VTF4, int targetOffset, int srcOffset); - CreateTemplate(Simd128_I_Conv_VTI4, int targetOffset, int srcOffset); - CreateTemplate(Simd128_I_Conv_VTD2, int targetOffset, int srcOffset); }; }; diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsModule.cpp b/deps/chakrashim/core/lib/Runtime/Language/AsmJsModule.cpp index 6a64fcf1e36..497e4ad820b 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsModule.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsModule.cpp @@ -129,7 +129,7 @@ namespace Js ParseNodePtr nameNode = GetModuleFunctionNode()->sxFnc.pnodeName; GetByteCodeGenerator()->AssignPropertyId(nameNode->name()); // if module is a named function expression, we may need to restore this for debugger - AsmJsFunctionDeclaration* closure = Anew(&mAllocator, AsmJsFunctionDeclaration, nameNode->sxVar.pid, AsmJsSymbol::ClosureFunction, &mAllocator); + AsmJsClosureFunction* closure = Anew(&mAllocator, AsmJsClosureFunction, nameNode->sxVar.pid, AsmJsSymbol::ClosureFunction, &mAllocator); DefineIdentifier(nameNode->sxVar.pid, closure); } } @@ -210,7 +210,7 @@ namespace Js { case AsmJsSymbol::Variable: { - AsmJsVar* var = sym->Cast(); + AsmJsVar* var = AsmJsVar::FromSymbol(sym); auto& modVar = asmInfo->GetVar(iVar++); modVar.location = var->GetLocation(); modVar.type = var->GetVarType().which(); @@ -246,7 +246,7 @@ namespace Js } case AsmJsSymbol::ConstantImport: { - AsmJsConstantImport* var = sym->Cast(); + AsmJsConstantImport* var = AsmJsConstantImport::FromSymbol(sym); auto& modVar = asmInfo->GetVarImport(iVarImp++); modVar.location = var->GetLocation(); modVar.field = var->GetField()->GetPropertyId(); @@ -258,7 +258,7 @@ namespace Js } case AsmJsSymbol::ImportFunction: { - AsmJsImportFunction* func = sym->Cast(); + AsmJsImportFunction* func = AsmJsImportFunction::FromSymbol(sym); auto& modVar = asmInfo->GetFunctionImport(iFuncImp++); modVar.location = func->GetFunctionIndex(); modVar.field = func->GetField()->GetPropertyId(); @@ -268,7 +268,7 @@ namespace Js } case AsmJsSymbol::FuncPtrTable: { - AsmJsFunctionTable* funcTable = sym->Cast(); + AsmJsFunctionTable* funcTable = AsmJsFunctionTable::FromSymbol(sym); const uint size = funcTable->GetSize(); const RegSlot index = funcTable->GetFunctionIndex(); asmInfo->SetFunctionTableSize(index, size); @@ -284,7 +284,7 @@ namespace Js } case AsmJsSymbol::ModuleFunction: { - AsmJsFunc* func = sym->Cast(); + AsmJsFunc* func = AsmJsFunc::FromSymbol(sym); auto& modVar = asmInfo->GetFunction(iFunc++); modVar.location = func->GetFunctionIndex(); slot->location = modVar.location; @@ -292,38 +292,38 @@ namespace Js } case AsmJsSymbol::ArrayView: { - AsmJsArrayView * var = sym->Cast(); + AsmJsArrayView * var = AsmJsArrayView::FromSymbol(sym); slot->viewType = var->GetViewType(); break; } case AsmJsSymbol::ModuleArgument: { - AsmJsModuleArg * arg = sym->Cast(); + AsmJsModuleArg * arg = AsmJsModuleArg::FromSymbol(sym); slot->argType = arg->GetArgType(); break; } // used only for module validation case AsmJsSymbol::MathConstant: { - AsmJsMathConst * constVar = sym->Cast(); + AsmJsMathConst * constVar = AsmJsMathConst::FromSymbol(sym); slot->mathConstVal = *constVar->GetVal(); break; } case AsmJsSymbol::MathBuiltinFunction: { - AsmJsMathFunction * mathFunc = sym->Cast(); + AsmJsMathFunction * mathFunc = AsmJsMathFunction::FromSymbol(sym); slot->builtinMathFunc = mathFunc->GetMathBuiltInFunction(); break; } case AsmJsSymbol::TypedArrayBuiltinFunction: { - AsmJsTypedArrayFunction * mathFunc = sym->Cast(); + AsmJsTypedArrayFunction * mathFunc = AsmJsTypedArrayFunction::FromSymbol(sym); slot->builtinArrayFunc = mathFunc->GetArrayBuiltInFunction(); break; } case AsmJsSymbol::SIMDBuiltinFunction: { - AsmJsSIMDFunction * mathFunc = sym->Cast(); + AsmJsSIMDFunction * mathFunc = AsmJsSIMDFunction::FromSymbol(sym); slot->builtinSIMDFunc = mathFunc->GetSimdBuiltInFunction(); break; } @@ -380,15 +380,15 @@ namespace Js AsmJsSymbol * declSym = LookupIdentifier(pnode->name()); if (declSym) { - if (declSym->GetSymbolType() == AsmJsSymbol::MathConstant) + if (AsmJsMathConst::Is(declSym)) { - AsmJsMathConst * definition = declSym->Cast(); + AsmJsMathConst * definition = AsmJsMathConst::FromSymbol(declSym); Assert(definition->GetType().isDouble()); func->AddConst(*definition->GetVal()); } - else if (declSym->GetSymbolType() == AsmJsSymbol::Variable && !declSym->isMutable()) + else if (AsmJsVar::Is(declSym) && !declSym->isMutable()) { - AsmJsVar * definition = declSym->Cast(); + AsmJsVar * definition = AsmJsVar::FromSymbol(declSym); switch (definition->GetVarType().which()) { case AsmJsVarType::Double: @@ -414,7 +414,7 @@ namespace Js if (pnode->sxCall.pnodeTarget->nop == knopName) { AsmJsFunctionDeclaration* funcDecl = this->LookupFunction(pnode->sxCall.pnodeTarget->name()); - if (AsmJsMathFunction::IsFround(funcDecl)) + if (AsmJsMathFunction::IsFround(funcDecl) && pnode->sxCall.argCount > 0) { switch (pnode->sxCall.pnodeArgs->nop) { @@ -445,9 +445,9 @@ namespace Js If any of the args is a literal (DoubleLit), we need to have a copy of it in the Float reg space. Note that we may end up with redundant copies in the Double reg space, since we ASTPrepass the args (Fix later ?) */ - if (funcDecl && funcDecl->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction) + if (AsmJsSIMDFunction::Is(funcDecl)) { - AsmJsSIMDFunction* simdFunc = funcDecl->Cast(); + AsmJsSIMDFunction* simdFunc = AsmJsSIMDFunction::FromVar(funcDecl); if (simdFunc->IsFloat32x4Func()) { ParseNode *argNode, *arg; @@ -771,7 +771,7 @@ namespace Js if (!funcDecl) return Fail(rhs, _u("Cannot resolve function for argument definition, or wrong function")); - if (funcDecl->GetSymbolType() == AsmJsSymbol::MathBuiltinFunction) + if (AsmJsMathFunction::Is(funcDecl)) { if (!AsmJsMathFunction::IsFround(funcDecl)) { @@ -781,9 +781,9 @@ namespace Js var->SetLocation(func->AcquireRegister()); } #ifdef ENABLE_SIMDJS - else if (IsSimdjsEnabled() && funcDecl->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction) + else if (IsSimdjsEnabled() && AsmJsSIMDFunction::Is(funcDecl)) { - AsmJsSIMDFunction* simdFunc = funcDecl->Cast(); + AsmJsSIMDFunction* simdFunc = AsmJsSIMDFunction::FromSymbol(funcDecl); // x = f4check(x) if (!simdFunc->IsTypeCheck()) { @@ -878,7 +878,7 @@ namespace Js if (pnodeInit->nop == knopName) { declSym = LookupIdentifier(pnodeInit->name(), func); - if (!declSym || declSym->isMutable() || (declSym->GetSymbolType() != AsmJsSymbol::Variable && declSym->GetSymbolType() != AsmJsSymbol::MathConstant)) + if ((!AsmJsVar::Is(declSym) && !AsmJsMathConst::Is(declSym)) || declSym->isMutable()) { return Fail(decl, _u("Var declaration with non-constant")); } @@ -894,7 +894,7 @@ namespace Js if (!funcDecl) return Fail(pnodeInit, _u("Cannot resolve function name")); - if (funcDecl->GetSymbolType() == AsmJsSymbol::MathBuiltinFunction) + if (AsmJsMathFunction::Is(funcDecl)) { if (!AsmJsMathFunction::IsFround(funcDecl) || !ParserWrapper::IsFroundNumericLiteral(pnodeInit->sxCall.pnodeArgs)) { @@ -903,10 +903,10 @@ namespace Js isFroundInit = true; } #ifdef ENABLE_SIMDJS - else if (IsSimdjsEnabled() && funcDecl->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction) + else if (IsSimdjsEnabled() && AsmJsSIMDFunction::Is(funcDecl)) { // var x = f4(1.0, 2.0, 3.0, 4.0); - simdFunc = funcDecl->Cast(); + simdFunc = AsmJsSIMDFunction::FromSymbol(funcDecl); if (!ValidateSimdConstructor(pnodeInit, simdFunc, simdValue)) { return Fail(varNode, _u("Invalid SIMD local declaration")); @@ -974,9 +974,9 @@ namespace Js } else if (pnodeInit->nop == knopName) { - if (declSym->GetSymbolType() == AsmJsSymbol::Variable) + if (AsmJsVar::Is(declSym)) { - AsmJsVar * definition = declSym->Cast(); + AsmJsVar * definition = AsmJsVar::FromSymbol(declSym); initializerBV.Set(definition->GetName()->GetPropertyId()); switch (definition->GetVarType().which()) { @@ -1004,10 +1004,9 @@ namespace Js } else { - Assert(declSym->GetSymbolType() == AsmJsSymbol::MathConstant); Assert(declSym->GetType() == AsmJsType::Double); - AsmJsMathConst * definition = declSym->Cast(); + AsmJsMathConst * definition = AsmJsMathConst::FromSymbol(declSym); var->SetVarType(AsmJsVarType::Double); var->SetLocation(func->AcquireRegister()); @@ -1126,13 +1125,12 @@ namespace Js { return false; } - AsmJsSymbol* funcDecl = LookupIdentifier(callNode->sxCall.pnodeTarget->name()); - if (!funcDecl || funcDecl->GetSymbolType() != AsmJsSymbol::TypedArrayBuiltinFunction) + AsmJsTypedArrayFunction* arrayFunc = LookupIdentifier(callNode->sxCall.pnodeTarget->name()); + if (!arrayFunc) { return false; } - AsmJsTypedArrayFunction* arrayFunc = funcDecl->Cast(); return callNode->sxCall.argCount == 1 && !callNode->sxCall.isApplyCall && !callNode->sxCall.isEvalCall && @@ -2255,25 +2253,7 @@ namespace Js AsmJsFunctionDeclaration* AsmJsModuleCompiler::LookupFunction(PropertyName name) { - if (name) - { - AsmJsSymbol* sym = LookupIdentifier(name); - if (sym) - { - switch (sym->GetSymbolType()) - { - case AsmJsSymbol::SIMDBuiltinFunction: - case AsmJsSymbol::MathBuiltinFunction: - case AsmJsSymbol::ModuleFunction: - case AsmJsSymbol::ImportFunction: - case AsmJsSymbol::FuncPtrTable: - return sym->Cast(); - default: - break; - } - } - } - return nullptr; + return LookupIdentifier(name); } bool AsmJsModuleCompiler::AreAllFuncTableDefined() @@ -2464,30 +2444,30 @@ namespace Js void AsmJsModuleInfo::EnsureHeapAttached(ScriptFunction * func) { - FrameDisplay* frame = func->GetEnvironment(); - ArrayBuffer* moduleArrayBuffer = nullptr; #ifdef ENABLE_WASM - if (func->GetFunctionBody()->IsWasmFunction()) + if (WasmScriptFunction::Is(func)) { - WebAssemblyMemory * wasmMem = *(WebAssemblyMemory**)((Var*)frame->GetItem(0) + AsmJsModuleMemory::MemoryTableBeginOffset); - if (wasmMem != nullptr) + WasmScriptFunction* wasmFunc = WasmScriptFunction::FromVar(func); + WebAssemblyMemory * wasmMem = wasmFunc->GetWebAssemblyMemory(); + if (wasmMem && wasmMem->GetBuffer() && wasmMem->GetBuffer()->IsDetached()) { - moduleArrayBuffer = wasmMem->GetBuffer(); + Throw::OutOfMemory(); } } else #endif { - moduleArrayBuffer = *(ArrayBuffer**)((Var*)frame->GetItem(0) + AsmJsModuleMemory::MemoryTableBeginOffset); + AsmJsScriptFunction* asmFunc = AsmJsScriptFunction::FromVar(func); + ArrayBuffer* moduleArrayBuffer = asmFunc->GetAsmJsArrayBuffer(); + if (moduleArrayBuffer && moduleArrayBuffer->IsDetached()) + { + Throw::OutOfMemory(); + } } - if (moduleArrayBuffer && moduleArrayBuffer->IsDetached()) - { - Throw::OutOfMemory(); - } } - void * AsmJsModuleInfo::ConvertFrameForJavascript(void * asmMemory, ScriptFunction* func) + void * AsmJsModuleInfo::ConvertFrameForJavascript(void* env, AsmJsScriptFunction* func) { FunctionBody * body = func->GetFunctionBody(); AsmJsFunctionInfo * asmFuncInfo = body->GetAsmJsFunctionInfo(); @@ -2497,7 +2477,7 @@ namespace Js ScriptContext * scriptContext = func->GetScriptContext(); // AsmJsModuleEnvironment is all laid out here - Var * asmJsEnvironment = static_cast(func->GetEnvironment()->GetItem(0)); + Var * asmJsEnvironment = static_cast(env); Var * asmBufferPtr = asmJsEnvironment + asmModuleInfo->GetModuleMemory().mArrayBufferOffset; ArrayBuffer * asmBuffer = *asmBufferPtr ? ArrayBuffer::FromVar(*asmBufferPtr) : nullptr; @@ -2829,13 +2809,8 @@ namespace Js AsmJsSIMDFunction* AsmJsModuleCompiler::LookupSimdConstructor(PropertyName name) { - AsmJsFunctionDeclaration *func = LookupFunction(name); - if (func == nullptr || func->GetSymbolType() != AsmJsSymbol::SIMDBuiltinFunction) - { - return nullptr; - } - AsmJsSIMDFunction *simdFunc = func->Cast(); - if (simdFunc->IsConstructor()) + AsmJsSIMDFunction* simdFunc = LookupIdentifier(name); + if (simdFunc && simdFunc->IsConstructor()) { return simdFunc; } @@ -2844,13 +2819,8 @@ namespace Js AsmJsSIMDFunction* AsmJsModuleCompiler::LookupSimdTypeCheck(PropertyName name) { - AsmJsFunctionDeclaration *func = LookupFunction(name); - if (func == nullptr || func->GetSymbolType() != AsmJsSymbol::SIMDBuiltinFunction) - { - return nullptr; - } - AsmJsSIMDFunction *simdFunc = func->Cast(); - if (simdFunc->IsTypeCheck()) + AsmJsSIMDFunction* simdFunc = LookupIdentifier(name); + if (simdFunc && simdFunc->IsTypeCheck()) { return simdFunc; } @@ -2859,13 +2829,9 @@ namespace Js AsmJsSIMDFunction* AsmJsModuleCompiler::LookupSimdOperation(PropertyName name) { - AsmJsFunctionDeclaration *func = LookupFunction(name); - if (func == nullptr || func->GetSymbolType() != AsmJsSymbol::SIMDBuiltinFunction) - { - return nullptr; - } - AsmJsSIMDFunction *simdFunc = func->Cast(); - if (simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Int32x4 && + AsmJsSIMDFunction* simdFunc = LookupIdentifier(name); + if (simdFunc && + simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Int32x4 && simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Int16x8 && simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Int8x16 && simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Float32x4 && @@ -2886,7 +2852,7 @@ namespace Js bool AsmJsModuleCompiler::AddSimdValueVar(PropertyName name, ParseNode* pnode, AsmJsSIMDFunction* simdFunc) { - AssertMsg(simdFunc->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction, "Expecting SIMD builtin"); + AssertMsg(AsmJsSIMDFunction::Is(simdFunc), "Expecting SIMD builtin"); AssertMsg(simdFunc->IsConstructor(), "Expecting constructor function"); AsmJsSIMDValue value; diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsModule.h b/deps/chakrashim/core/lib/Runtime/Language/AsmJsModule.h index 7062a681af7..c789bda0deb 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsModule.h +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsModule.h @@ -101,10 +101,7 @@ namespace Js { { // Register where module slots are loaded ModuleSlotRegister = 0, - ReturnRegister = 0, - FunctionRegister = 0, - CallReturnRegister = 0, // These are created from the const table which starts after the FirstRegSlot ModuleEnvRegister = FunctionBody::FirstRegSlot, ArrayBufferRegister, @@ -262,6 +259,8 @@ namespace Js { // Lookup the name in the function environment if provided, then the module environment // indicate the origin of the symbol if specified AsmJsSymbol* LookupIdentifier( PropertyName name, AsmJsFunc* func = nullptr, AsmJsLookupSource::Source* lookupSource = nullptr ); + template + T* LookupIdentifier(PropertyName name); AsmJsFunctionDeclaration* LookupFunction( PropertyName name ); bool DefineIdentifier( PropertyName name, AsmJsSymbol* symbol ); bool AddNumericVar( PropertyName name, ParseNode* pnode, bool isFloat, bool isMutable = true); @@ -325,6 +324,20 @@ namespace Js { #endif }; + template + T* Js::AsmJsModuleCompiler::LookupIdentifier(PropertyName name) + { + if (name) + { + AsmJsSymbol* sym = LookupIdentifier(name); + if (T::Is(sym)) + { + return T::FromSymbol(sym); + } + } + return nullptr; + } + struct AsmJsSlot { Field(RegSlot) location; @@ -610,7 +623,7 @@ namespace Js { } static void EnsureHeapAttached(ScriptFunction * func); - static void * ConvertFrameForJavascript(void* asmJsMemory, ScriptFunction * func); + static void * ConvertFrameForJavascript(void* asmJsMemory, AsmJsScriptFunction * func); }; }; #endif diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsTypes.cpp b/deps/chakrashim/core/lib/Runtime/Language/AsmJsTypes.cpp index d3532bb404e..ddab5ae46fb 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsTypes.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsTypes.cpp @@ -48,6 +48,7 @@ namespace Js case Intish: return _u("intish"); case Void: return _u("void"); case Int32x4: return _u("SIMD.Int32x4"); + case Int64x2: return _u("SIMD.Int64x2"); case Bool32x4: return _u("SIMD.Bool32x4"); case Bool16x8: return _u("SIMD.Bool16x8"); case Bool8x16: return _u("SIMD.Bool8x16"); @@ -103,6 +104,10 @@ namespace Js { return which_ == Float64x2; } + bool AsmJsType::isSIMDInt64x2() const + { + return which_ == Int64x2; + } bool AsmJsType::isSIMDUint32x4() const { @@ -448,116 +453,54 @@ namespace Js } - template<> - AsmJsMathConst* Js::AsmJsSymbol::Cast() - { - Assert(mType == MathConstant); - return (AsmJsMathConst*)this; - } - - template<> - AsmJsVar* Js::AsmJsSymbol::Cast() - { - Assert(mType == Variable); - return (AsmJsVar*)this; - } - - template<> - AsmJsVarBase* Js::AsmJsSymbol::Cast() - { - Assert( mType == Argument || mType == Variable || mType == ConstantImport); - return ( AsmJsVarBase* )this; - } - - template<> - AsmJsFunctionDeclaration* Js::AsmJsSymbol::Cast() - { - Assert(mType == ModuleFunction || mType == ImportFunction || mType == MathBuiltinFunction || mType == SIMDBuiltinFunction || mType == FuncPtrTable); - return (AsmJsFunctionDeclaration*)this; - } - - template<> - AsmJsFunc* Js::AsmJsSymbol::Cast() - { - Assert(mType == ModuleFunction); - return (AsmJsFunc*)this; - } - - template<> - AsmJsImportFunction* Js::AsmJsSymbol::Cast() - { - Assert(mType == ImportFunction); - return (AsmJsImportFunction*)this; - } - - template<> - AsmJsMathFunction* Js::AsmJsSymbol::Cast() - { - Assert(mType == MathBuiltinFunction); - return (AsmJsMathFunction*)this; - } - - template<> - AsmJsSIMDFunction* Js::AsmJsSymbol::Cast() - { - Assert(mType == SIMDBuiltinFunction); - return (AsmJsSIMDFunction*) this; - } - template<> - AsmJsArrayView* Js::AsmJsSymbol::Cast() - { - Assert(mType == ArrayView); - return (AsmJsArrayView*)this; - } - - template<> - AsmJsConstantImport* Js::AsmJsSymbol::Cast() - { - Assert(mType == ConstantImport); - return (AsmJsConstantImport*)this; - } - - template<> - AsmJsFunctionTable* Js::AsmJsSymbol::Cast() + AsmJsVarBase::AsmJsVarBase(PropertyName name, AsmJsSymbol::SymbolType type, bool isMutable /*= true*/) : + AsmJsSymbol(name, type) + , mType(AsmJsVarType::Double) + , mLocation(Js::Constants::NoRegister) + , mIsMutable(isMutable) { - Assert(mType == FuncPtrTable); - return (AsmJsFunctionTable*)this; + Assert(AsmJsVarBase::Is(this)); } - template<> - AsmJsTypedArrayFunction* Js::AsmJsSymbol::Cast() + bool AsmJsVarBase::Is(AsmJsSymbol* sym) { - Assert(mType == TypedArrayBuiltinFunction); - return (AsmJsTypedArrayFunction*)this; + return AsmJsArgument::Is(sym) || AsmJsConstantImport::Is(sym) || AsmJsVar::Is(sym); } - template<> - AsmJsModuleArg* Js::AsmJsSymbol::Cast() - { - Assert(mType == ModuleArgument); - return (AsmJsModuleArg*)this; - } Js::AsmJsType AsmJsModuleArg::GetType() const { - Assert(UNREACHED); return AsmJsType::Void; } - bool AsmJsModuleArg::isMutable() const + Js::AsmJsType AsmJsMathConst::GetType() const { - Assert(UNREACHED); - return true; + return AsmJsType::Double; } - Js::AsmJsType AsmJsMathConst::GetType() const + AsmJsFunctionDeclaration::AsmJsFunctionDeclaration(PropertyName name, AsmJsSymbol::SymbolType type, ArenaAllocator* allocator) : + AsmJsSymbol(name, type) + , mAllocator(allocator) + , mReturnType(AsmJsRetType::Void) + , mArgCount(Constants::InvalidArgSlot) + , mLocation(0) + , mReturnTypeKnown(false) + , mArgumentsType(nullptr) { - return AsmJsType::Double; + Assert(AsmJsFunctionDeclaration::Is(this)); } - bool AsmJsMathConst::isMutable() const + bool AsmJsFunctionDeclaration::Is(AsmJsSymbol* sym) { - return false; + return ( + AsmJsFunc::Is(sym) || + AsmJsFunctionTable::Is(sym) || + AsmJsImportFunction::Is(sym) || + AsmJsMathFunction::Is(sym) || + AsmJsSIMDFunction::Is(sym) || + AsmJsTypedArrayFunction::Is(sym) || + AsmJsClosureFunction::Is(sym) + ); } bool AsmJsFunctionDeclaration::EnsureArgCount(ArgSlot count) @@ -592,14 +535,15 @@ namespace Js bool AsmJsFunctionDeclaration::CheckAndSetReturnType(Js::AsmJsRetType val) { - Assert((val != AsmJsRetType::Fixnum && val != AsmJsRetType::Unsigned && val != AsmJsRetType::Floatish) || - GetSymbolType() == AsmJsSymbol::MathBuiltinFunction || - GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction); + const auto IsValid = [this](Js::AsmJsRetType val) { + return AsmJsMathFunction::Is(this) || AsmJsSIMDFunction::Is(this) || ( + val != AsmJsRetType::Fixnum && val != AsmJsRetType::Unsigned && val != AsmJsRetType::Floatish + ); + }; + Assert(IsValid(val)); if (mReturnTypeKnown) { - Assert((mReturnType != AsmJsRetType::Fixnum && mReturnType != AsmJsRetType::Unsigned && mReturnType != AsmJsRetType::Floatish) || - GetSymbolType() == AsmJsSymbol::MathBuiltinFunction || - GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction); + Assert(IsValid(mReturnType)); return mReturnType.toType().isSubType(val.toType()); } mReturnType = val; @@ -612,10 +556,6 @@ namespace Js return mReturnType.toType(); } - bool AsmJsFunctionDeclaration::isMutable() const - { - return false; - } bool AsmJsFunctionDeclaration::EnsureArgType(AsmJsVarBase* arg, ArgSlot index) { if (mArgumentsType[index].GetWhich() == -1) @@ -681,7 +621,7 @@ namespace Js ArgSlot AsmJsFunctionDeclaration::GetArgByteSize(ArgSlot inArgCount) const { uint argSize = 0; - if (GetSymbolType() == AsmJsSymbol::ImportFunction) + if (AsmJsImportFunction::Is(this)) { Assert(inArgCount != Constants::InvalidArgSlot); argSize = inArgCount * MachPtr; @@ -740,7 +680,7 @@ namespace Js } AsmJsMathFunction::AsmJsMathFunction( PropertyName name, ArenaAllocator* allocator, ArgSlot argCount, AsmJSMathBuiltinFunction builtIn, OpCodeAsmJs op, AsmJsRetType retType, ... ) : - AsmJsFunctionDeclaration( name, AsmJsSymbol::MathBuiltinFunction, allocator ) + AsmJsFunctionDeclaration( name, symbolType, allocator ) , mBuiltIn( builtIn ) , mOverload( nullptr ) , mOpCode(op) @@ -805,7 +745,7 @@ namespace Js bool AsmJsMathFunction::IsFround(AsmJsFunctionDeclaration* sym) { - return sym && sym->GetSymbolType() == AsmJsSymbol::MathBuiltinFunction && sym->Cast()->GetMathBuiltInFunction() == AsmJSMathBuiltin_fround; + return AsmJsMathFunction::Is(sym) && AsmJsMathFunction::FromSymbol(sym)->GetMathBuiltInFunction() == AsmJSMathBuiltin_fround; } WAsmJs::RegisterSpace* @@ -817,6 +757,9 @@ namespace Js case WAsmJs::FLOAT32: return Anew(alloc, AsmJsRegisterSpace, alloc); case WAsmJs::FLOAT64: return Anew(alloc, AsmJsRegisterSpace, alloc); case WAsmJs::SIMD: return Anew(alloc, AsmJsRegisterSpace, alloc); +#if TARGET_64 + case WAsmJs::INT64: return Anew(alloc, AsmJsRegisterSpace, alloc); +#endif default: AssertMsg(false, "Invalid native asm.js type"); Js::Throw::InternalError(); @@ -829,20 +772,24 @@ namespace Js , mVarMap(allocator) , mBodyNode(nullptr) , mFncNode(pnodeFnc) + , mCurrentProfileId(0) , mTypedRegisterAllocator( allocator, AllocateRegisterSpace, - // Exclude int64 and simd if not enabled - 1 << WAsmJs::INT64 | ( +#if TARGET_32 + 1 << WAsmJs::INT64 | +#endif + // Exclude simd if not enabled + ( #ifdef ENABLE_SIMDJS scriptContext->GetConfig()->IsSimdjsEnabled() ? 0 : #endif - 1 << WAsmJs::SIMD) + 1 << WAsmJs::SIMD + ) ) , mFuncInfo(pnodeFnc->sxFnc.funcInfo) , mFuncBody(nullptr) , mSimdVarsList(allocator) - , mArgOutDepth(0) , mMaxArgOutDepth(0) , mDefined( false ) { @@ -880,6 +827,12 @@ namespace Js return var; } + ProfileId AsmJsFunc::GetNextProfileId() + { + ProfileId nextProfileId = mCurrentProfileId; + UInt16Math::Inc(mCurrentProfileId); + return nextProfileId; + } AsmJsVarBase* AsmJsFunc::FindVar(const PropertyName name) const { @@ -919,11 +872,6 @@ namespace Js return var; } - void AsmJsFunc::SetArgOutDepth( int outParamsCount ) - { - mArgOutDepth = outParamsCount; - } - void AsmJsFunc::UpdateMaxArgOutDepth(int outParamsCount) { if (mMaxArgOutDepth < outParamsCount) @@ -1041,12 +989,6 @@ namespace Js return AsmJsType::Intish; } - bool AsmJsArrayView::isMutable() const - { - return false; - } - - bool AsmJsImportFunction::SupportsArgCall(ArgSlot argCount, AsmJsType* args, AsmJsRetType& retType ) { for (ArgSlot i = 0; i < argCount ; i++) @@ -1060,7 +1002,7 @@ namespace Js } AsmJsImportFunction::AsmJsImportFunction(PropertyName name, PropertyName field, ArenaAllocator* allocator) : - AsmJsFunctionDeclaration(name, AsmJsSymbol::ImportFunction, allocator) + AsmJsFunctionDeclaration(name, symbolType, allocator) , mField(field) { CheckAndSetReturnType(AsmJsRetType::Void); @@ -1104,7 +1046,7 @@ namespace Js } AsmJsSIMDFunction::AsmJsSIMDFunction(PropertyName name, ArenaAllocator* allocator, ArgSlot argCount, AsmJsSIMDBuiltinFunction builtIn, OpCodeAsmJs op, AsmJsRetType retType, ...) : - AsmJsFunctionDeclaration(name, AsmJsSymbol::SIMDBuiltinFunction, allocator) + AsmJsFunctionDeclaration(name, symbolType, allocator) , mBuiltIn(builtIn) , mOverload(nullptr) , mOpCode(op) diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsTypes.h b/deps/chakrashim/core/lib/Runtime/Language/AsmJsTypes.h index 2f8ea499e77..9827cd8d029 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsTypes.h +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsTypes.h @@ -143,7 +143,8 @@ namespace Js Bool16x8, Bool8x16, Float32x4, - Float64x2 + Float64x2, + Int64x2 }; private: @@ -185,6 +186,7 @@ namespace Js bool isSIMDUint32x4() const; bool isSIMDUint16x8() const; bool isSIMDUint8x16() const; + bool isSIMDInt64x2() const; AsmJsRetType toRetType() const; }; @@ -209,6 +211,7 @@ namespace Js Bool8x16 = AsmJsType::Bool8x16, Float32x4 = AsmJsType::Float32x4, Float64x2 = AsmJsType::Float64x2, + Int64x2 = AsmJsType::Int64x2, Int16x8 = AsmJsType::Int16x8, Int8x16 = AsmJsType::Int8x16, Uint32x4 = AsmJsType::Uint32x4, @@ -271,7 +274,8 @@ namespace Js Int8x16 = AsmJsType::Int8x16, Uint32x4 = AsmJsType::Uint32x4, Uint16x8 = AsmJsType::Uint16x8, - Uint8x16 = AsmJsType::Uint8x16 + Uint8x16 = AsmJsType::Uint8x16, + Int64x2 = AsmJsType::Int64x2 }; private: @@ -358,18 +362,36 @@ namespace Js inline void SetName(PropertyName name) {mName = name;} // Returns the type of the symbol inline SymbolType GetSymbolType()const { return mType; } - // Casts the symbol to a derived class, additional test done to make sure is it the right type - template - T* Cast(); // AsmJsSymbol interface public: // retrieve the type of the symbol when it is use in an expression virtual AsmJsType GetType() const = 0; // if the symbol is mutable, it can be on the LHS of an assignment operation - virtual bool isMutable() const = 0; + virtual bool isMutable() const { return false; } +#ifdef DBG + // Will have a compiler warning if forgot to add ASMJS_SYMBOL_LEAF_CAST to new types + virtual bool IsCastImplemented() const = 0; +#endif }; +#ifdef DBG +#define ASMJS_SYMBOL_CAST_IMPLEMENTED virtual bool IsCastImplemented() const override { return true; } +#else +#define ASMJS_SYMBOL_CAST_IMPLEMENTED +#endif + +#define ASMJS_SYMBOL_LEAF_CAST(classname, symbol) \ + ASMJS_SYMBOL_CAST_IMPLEMENTED \ + static const AsmJsSymbol::SymbolType symbolType = AsmJsSymbol::symbol; \ + static bool Is(const AsmJsSymbol* sym) { return sym && sym->GetSymbolType() == symbolType; } \ + static bool Is(AsmJsSymbol* sym) { return sym && sym->GetSymbolType() == symbolType; } \ + static classname* FromSymbol(AsmJsSymbol* sym) \ + { \ + AssertOrFailFast(classname::Is(sym)); \ + return static_cast(sym); \ + } + // Symbol representing a module argument class AsmJsModuleArg : public AsmJsSymbol { @@ -383,15 +405,15 @@ namespace Js private: ArgType mArgType; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsModuleArg, ModuleArgument) // Constructor - AsmJsModuleArg(PropertyName name, ArgType type) : AsmJsSymbol(name, AsmJsSymbol::ModuleArgument), mArgType(type) { } + AsmJsModuleArg(PropertyName name, ArgType type) : AsmJsSymbol(name, symbolType), mArgType(type) { } // Accessor inline const ArgType GetArgType()const { return mArgType; } // AsmJsSymbol interface public: virtual AsmJsType GetType() const override; - virtual bool isMutable() const override; }; // Symbol representing a double constant from the standard library @@ -400,15 +422,15 @@ namespace Js // address of the constant, lifetime of this address must be for the whole execution of the program (global var) const double* mVal; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsMathConst, MathConstant) // Constructor - AsmJsMathConst(PropertyName name, const double* val) : AsmJsSymbol(name, AsmJsSymbol::MathConstant), mVal(val) { } + AsmJsMathConst(PropertyName name, const double* val) : AsmJsSymbol(name, symbolType), mVal(val) { } // Accessor inline const double* GetVal()const { return mVal; } // AsmJsSymbol interface public: virtual AsmJsType GetType() const override; - virtual bool isMutable() const override; }; // Base class defining Variables in asm.js, can be a variable of the module or a function argument @@ -421,13 +443,7 @@ namespace Js bool mIsMutable; public: // Constructor - AsmJsVarBase(PropertyName name, AsmJsSymbol::SymbolType type, bool isMutable = true) : - AsmJsSymbol(name, type) - , mType(AsmJsVarType::Double) - , mLocation(Js::Constants::NoRegister) - , mIsMutable(isMutable) - { - } + AsmJsVarBase(PropertyName name, AsmJsSymbol::SymbolType type, bool isMutable = true); // Accessors inline Js::RegSlot GetLocation() const { return mLocation; } @@ -435,6 +451,13 @@ namespace Js inline AsmJsVarType GetVarType() const { return mType; } inline void SetVarType( const AsmJsVarType& type ){ mType = type; } + static bool Is(AsmJsSymbol* sym); + static AsmJsVarBase* FromSymbol(AsmJsSymbol* sym) + { + AssertOrFailFast(AsmJsVarBase::Is(sym)); + return static_cast(sym); + } + // AsmJsSymbol interface public: virtual AsmJsType GetType() const override @@ -460,9 +483,11 @@ namespace Js AsmJsSIMDValue simdVal; }mConstInitialiser; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsVar, Variable) + // Constructors AsmJsVar( PropertyName name, bool isMutable = true) : - AsmJsVarBase(name, AsmJsSymbol::Variable, isMutable) + AsmJsVarBase(name, symbolType, isMutable) { mConstInitialiser.doubleVal = 0; } @@ -483,9 +508,10 @@ namespace Js class AsmJsArgument : public AsmJsVarBase { public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsArgument, Argument) // Constructor AsmJsArgument( PropertyName name ) : - AsmJsVarBase( name, AsmJsSymbol::Argument ) + AsmJsVarBase( name, symbolType ) { } }; @@ -497,9 +523,10 @@ namespace Js PropertyName mField; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsConstantImport, ConstantImport) // Constructor AsmJsConstantImport( PropertyName name, PropertyName field ) : - AsmJsVarBase( name, AsmJsSymbol::ConstantImport ), + AsmJsVarBase( name, symbolType ), mField( field ) { } @@ -588,18 +615,18 @@ namespace Js protected: ArenaAllocator* mAllocator; public: - AsmJsFunctionDeclaration( PropertyName name, AsmJsSymbol::SymbolType type, ArenaAllocator* allocator): - AsmJsSymbol( name, type ) - , mAllocator(allocator) - , mReturnType( AsmJsRetType::Void ) - , mArgCount(Constants::InvalidArgSlot) - , mLocation( 0 ) - , mReturnTypeKnown( false ) - , mArgumentsType(nullptr) - { } + AsmJsFunctionDeclaration( PropertyName name, AsmJsSymbol::SymbolType type, ArenaAllocator* allocator); + static bool Is(AsmJsSymbol* sym); + static AsmJsFunctionDeclaration* FromSymbol(AsmJsSymbol* sym) + { + AssertOrFailFast(AsmJsFunctionDeclaration::Is(sym)); + return static_cast(sym); + } + // returns false if the current return type is known and different virtual bool CheckAndSetReturnType( Js::AsmJsRetType val ); inline Js::AsmJsRetType GetReturnType() const{return mReturnType;} + bool EnsureArgCount(ArgSlot count); void SetArgCount(ArgSlot count ); @@ -636,9 +663,17 @@ namespace Js //AsmJsSymbol interface virtual AsmJsType GetType() const; - virtual bool isMutable() const; }; + class AsmJsClosureFunction : public AsmJsFunctionDeclaration + { + public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsClosureFunction, ClosureFunction) + AsmJsClosureFunction(PropertyName name, AsmJsSymbol::SymbolType type, ArenaAllocator* allocator) : + AsmJsFunctionDeclaration(name, type, allocator) + { + } + }; class AsmJsMathFunction : public AsmJsFunctionDeclaration { @@ -648,6 +683,7 @@ namespace Js AsmJsMathFunction* mOverload; OpCodeAsmJs mOpCode; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsMathFunction, MathBuiltinFunction) AsmJsMathFunction(PropertyName name, ArenaAllocator* allocator, ArgSlot argCount, AsmJSMathBuiltinFunction builtIn, OpCodeAsmJs op, AsmJsRetType retType, ...); void SetOverload( AsmJsMathFunction* val ); @@ -665,8 +701,9 @@ namespace Js AsmJSTypedArrayBuiltinFunction mBuiltIn; ArrayBufferView::ViewType mType; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsTypedArrayFunction, TypedArrayBuiltinFunction) AsmJsTypedArrayFunction(PropertyName name, ArenaAllocator* allocator, AsmJSTypedArrayBuiltinFunction builtIn, ArrayBufferView::ViewType type) : - AsmJsFunctionDeclaration(name, AsmJsSymbol::TypedArrayBuiltinFunction, allocator), mBuiltIn(builtIn), mType(type) { } + AsmJsFunctionDeclaration(name, symbolType, allocator), mBuiltIn(builtIn), mType(type) { } AsmJSTypedArrayBuiltinFunction GetArrayBuiltInFunction(){ return mBuiltIn; }; ArrayBufferView::ViewType GetViewType(){ return mType; }; @@ -677,6 +714,7 @@ namespace Js { PropertyName mField; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsImportFunction, ImportFunction) AsmJsImportFunction( PropertyName name, PropertyName field, ArenaAllocator* allocator ); inline Js::PropertyName GetField() const @@ -697,8 +735,9 @@ namespace Js bool mIsDefined : 1; bool mAreArgumentsKnown : 1; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsFunctionTable, FuncPtrTable) AsmJsFunctionTable( PropertyName name, ArenaAllocator* allocator ) : - AsmJsFunctionDeclaration( name, AsmJsSymbol::FuncPtrTable, allocator ) + AsmJsFunctionDeclaration( name, symbolType, allocator ) , mTable(allocator) , mSize( 0 ) , mIsDefined( false ) @@ -743,17 +782,19 @@ namespace Js FuncInfo* mFuncInfo; FunctionBody* mFuncBody; - int mArgOutDepth; int mMaxArgOutDepth; ULONG mOrigParseFlags; + ProfileId mCurrentProfileId; bool mDeferred; bool mDefined : 1; // true when compiled completely without any errors public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsFunc, ModuleFunction) AsmJsFunc( PropertyName name, ParseNode* pnodeFnc, ArenaAllocator* allocator, ScriptContext* scriptContext ); unsigned GetCompileTime() const { return mCompileTime; } void AccumulateCompileTime(unsigned ms) { mCompileTime += ms; } - + ProfileId GetNextProfileId(); + ProfileId GetProfileIdCount() const { return mCurrentProfileId; } inline ParseNode* GetFncNode() const{ return mFncNode; } inline void SetFncNode(ParseNode* fncNode) { mFncNode = fncNode; } inline FuncInfo* GetFuncInfo() const{ return mFuncInfo; } @@ -787,15 +828,15 @@ namespace Js template inline bool IsVarLocation ( const EmitExpressionInfo* pnode ){return GetRegisterSpace().IsVarLocation( pnode );} template inline bool IsValidLocation ( const EmitExpressionInfo* pnode ){return GetRegisterSpace().IsValidLocation( pnode );} void ReleaseLocationGeneric( const EmitExpressionInfo* pnode ); + RegSlot AcquireTmpRegisterGeneric(AsmJsRetType retType); + bool IsVarLocationGeneric(const EmitExpressionInfo* pnode); // Search for a var in the varMap of the function, return nullptr if not found AsmJsVarBase* FindVar( const PropertyName name ) const; // Defines a new variable int the function, return nullptr if already exists or theres an error AsmJsVarBase* DefineVar(PropertyName name, bool isArg = false, bool isMutable = true); AsmJsSymbol* LookupIdentifier( const PropertyName name, AsmJsLookupSource::Source* lookupSource = nullptr ) const; - void SetArgOutDepth(int outParamsCount); void UpdateMaxArgOutDepth(int outParamsCount); - inline int GetArgOutDepth() const{ return mArgOutDepth; } inline int GetMaxArgOutDepth() const{ return mMaxArgOutDepth; } void CommitToFunctionInfo(Js::AsmJsFunctionInfo* funcInfo, FunctionBody* body) {mTypedRegisterAllocator.CommitToFunctionInfo(funcInfo, body);} void CommitToFunctionBody(FunctionBody* body) { mTypedRegisterAllocator.CommitToFunctionBody(body); } @@ -845,15 +886,15 @@ namespace Js ArrayBufferView::ViewType mViewType; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsArrayView, ArrayView) AsmJsArrayView( PropertyName name, ArrayBufferView::ViewType viewType ) : - AsmJsSymbol( name, AsmJsSymbol::ArrayView ) + AsmJsSymbol( name, symbolType ) , mViewType( viewType ) { } virtual AsmJsType GetType() const; - virtual bool isMutable() const; inline ArrayBufferView::ViewType GetViewType() const { return mViewType; @@ -1001,6 +1042,7 @@ namespace Js AsmJsSIMDFunction* mOverload; OpCodeAsmJs mOpCode; public: + ASMJS_SYMBOL_LEAF_CAST(AsmJsSIMDFunction, SIMDBuiltinFunction) AsmJsSIMDFunction(PropertyName name, ArenaAllocator* allocator, ArgSlot argCount, AsmJsSIMDBuiltinFunction builtIn, OpCodeAsmJs op, AsmJsRetType retType, ...); PropertyId GetBuiltinPropertyId(); diff --git a/deps/chakrashim/core/lib/Runtime/Language/AsmJsUtils.cpp b/deps/chakrashim/core/lib/Runtime/Language/AsmJsUtils.cpp index d09e0c62536..7585864f41a 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/AsmJsUtils.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/AsmJsUtils.cpp @@ -628,7 +628,9 @@ namespace Js #if ENABLE_DEBUG_CONFIG_OPTIONS if (CONFIG_FLAG(WasmI64)) { - returnValue = CreateI64ReturnObject((int64)iLow | ((int64)iHigh << 32), func->GetScriptContext()); + uint64 lHigh = ((uint64)iHigh) << 32; + uint64 lLow = (uint64)(uint32)iLow; + returnValue = CreateI64ReturnObject((int64)(lHigh | lLow), func->GetScriptContext()); break; } #endif diff --git a/deps/chakrashim/core/lib/Runtime/Language/CMakeLists.txt b/deps/chakrashim/core/lib/Runtime/Language/CMakeLists.txt index 652b3edf575..a19d65de49f 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/CMakeLists.txt +++ b/deps/chakrashim/core/lib/Runtime/Language/CMakeLists.txt @@ -14,6 +14,7 @@ set(CRL_SOURCE_FILES ${CRL_SOURCE_FILES} WAsmjsUtils.cpp WebAssemblySource.cpp CacheOperators.cpp + ConstructorCache.cpp CodeGenRecyclableData.cpp DynamicProfileInfo.cpp DynamicProfileMutator.cpp @@ -26,7 +27,6 @@ set(CRL_SOURCE_FILES ${CRL_SOURCE_FILES} JavascriptExceptionObject.cpp JavascriptExceptionOperators.cpp JavascriptMathOperators.cpp - JavascriptNativeOperators.cpp JavascriptOperators.cpp JavascriptStackWalker.cpp ModuleNamespace.cpp @@ -41,6 +41,7 @@ set(CRL_SOURCE_FILES ${CRL_SOURCE_FILES} SimdBool8x16OperationX86X64.cpp SimdFloat32x4Operation.cpp SimdFloat32x4OperationX86X64.cpp + SimdInt64x2Operation.cpp SimdFloat64x2Operation.cpp SimdFloat64x2OperationX86X64.cpp SimdInt16x8Operation.cpp diff --git a/deps/chakrashim/core/lib/Runtime/Language/CacheOperators.cpp b/deps/chakrashim/core/lib/Runtime/Language/CacheOperators.cpp index 46edfeaf141..f9f8973dacc 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/CacheOperators.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/CacheOperators.cpp @@ -38,13 +38,16 @@ namespace Js (RootObjectBase::Is(objectWithProperty) && propertyIndex == RootObjectBase::FromVar(objectWithProperty)->GetRootPropertyIndex(propertyId))); Assert(DynamicType::Is(objectWithProperty->GetTypeId())); +#if ENABLE_FIXED_FIELDS // We are populating a cache guarded by the instance's type (not the type of the object with property somewhere in the prototype chain), // so we only care if the instance's property (if any) is fixed. Assert(info->IsNoCache() || !info->IsStoreFieldCacheEnabled() || info->GetInstance() != objectWithProperty || !objectWithProperty->IsFixedProperty(propertyId)); +#endif + DynamicObject * dynamicObjectWithProperty = DynamicObject::FromVar(objectWithProperty); PropertyIndex slotIndex; bool isInlineSlot; - DynamicObject::FromVar(objectWithProperty)->GetDynamicType()->GetTypeHandler()->PropertyIndexToInlineOrAuxSlotIndex(propertyIndex, &slotIndex, &isInlineSlot); + dynamicObjectWithProperty->GetDynamicType()->GetTypeHandler()->PropertyIndexToInlineOrAuxSlotIndex(propertyIndex, &slotIndex, &isInlineSlot); const bool isProto = objectWithProperty != startingObject; if(!isProto) @@ -55,7 +58,7 @@ namespace Js else if( PropertyValueInfo::PrototypeCacheDisabled((PropertyValueInfo*)info) || !RecyclableObject::Is(startingObject) || - RecyclableObject::FromVar(startingObject)->GetScriptContext() != requestContext) + RecyclableObject::UnsafeFromVar(startingObject)->GetScriptContext() != requestContext) { // Don't need to cache if the beginning property is number etc. return; @@ -75,7 +78,7 @@ namespace Js Cache( isProto, - DynamicObject::FromVar(objectWithProperty), + dynamicObjectWithProperty, isRoot, RecyclableObject::FromVar(startingObject)->GetType(), nullptr, @@ -113,9 +116,10 @@ namespace Js Assert(RecyclableObject::Is(originalInstance)); Assert(DynamicType::Is(info->GetInstance()->GetTypeId())); + DynamicObject * dynamicInstance = DynamicObject::FromVar(info->GetInstance()); PropertyIndex slotIndex; bool isInlineSlot; - DynamicObject::FromVar(info->GetInstance())->GetDynamicType()->GetTypeHandler()->PropertyIndexToInlineOrAuxSlotIndex(info->GetPropertyIndex(), &slotIndex, &isInlineSlot); + dynamicInstance->GetDynamicType()->GetTypeHandler()->PropertyIndexToInlineOrAuxSlotIndex(info->GetPropertyIndex(), &slotIndex, &isInlineSlot); const bool isProto = info->GetInstance() != originalInstance; if(isProto && @@ -141,7 +145,7 @@ namespace Js Cache( isProto, - DynamicObject::FromVar(info->GetInstance()), + dynamicInstance, false, RecyclableObject::FromVar(originalInstance)->GetType(), nullptr, @@ -202,15 +206,18 @@ namespace Js AssertMsg((info->GetFlags() & InlineCacheGetterFlag) == 0, "invalid getter for CachePropertyWrite"); RecyclableObject* instance = info->GetInstance(); + DynamicObject * dynamicInstance = DynamicObject::FromVar(instance); PropertyIndex slotIndex; bool isInlineSlot; - DynamicObject::FromVar(instance)->GetDynamicType()->GetTypeHandler()->PropertyIndexToInlineOrAuxSlotIndex(propertyIndex, &slotIndex, &isInlineSlot); + dynamicInstance->GetDynamicType()->GetTypeHandler()->PropertyIndexToInlineOrAuxSlotIndex(propertyIndex, &slotIndex, &isInlineSlot); if (!isSetter) { AssertMsg(instance == object, "invalid instance for non setter"); - Assert(DynamicType::Is(typeWithoutProperty->GetTypeId())); + Assert(DynamicType::Is(typeWithoutProperty)); +#if ENABLE_FIXED_FIELDS Assert(info->IsNoCache() || !info->IsStoreFieldCacheEnabled() || object->CanStorePropertyValueDirectly(propertyId, isRoot)); +#endif Assert(info->IsWritable()); DynamicType* newType = (DynamicType*)object->GetType(); @@ -299,7 +306,7 @@ namespace Js Cache( isProto, - DynamicObject::FromVar(instance), + dynamicInstance, false, object->GetType(), nullptr, diff --git a/deps/chakrashim/core/lib/Runtime/Language/Chakra.Runtime.Language.vcxproj b/deps/chakrashim/core/lib/Runtime/Language/Chakra.Runtime.Language.vcxproj index 57ba3da7fd0..1964cf3d244 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/Chakra.Runtime.Language.vcxproj +++ b/deps/chakrashim/core/lib/Runtime/Language/Chakra.Runtime.Language.vcxproj @@ -1,4 +1,4 @@ - + @@ -94,6 +94,7 @@ + true @@ -172,12 +173,12 @@ Create - + @@ -201,6 +202,7 @@ + true @@ -220,7 +222,6 @@ - @@ -239,6 +240,7 @@ + diff --git a/deps/chakrashim/core/lib/Runtime/Language/Chakra.Runtime.Language.vcxproj.filters b/deps/chakrashim/core/lib/Runtime/Language/Chakra.Runtime.Language.vcxproj.filters index b9d51d5e1c3..5d0b6cb97c1 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/Chakra.Runtime.Language.vcxproj.filters +++ b/deps/chakrashim/core/lib/Runtime/Language/Chakra.Runtime.Language.vcxproj.filters @@ -57,7 +57,6 @@ - @@ -77,6 +76,7 @@ + @@ -125,7 +125,6 @@ - @@ -149,6 +148,7 @@ + @@ -215,4 +215,4 @@ arm64 - \ No newline at end of file + diff --git a/deps/chakrashim/core/lib/Runtime/Language/ConstructorCache.cpp b/deps/chakrashim/core/lib/Runtime/Language/ConstructorCache.cpp new file mode 100644 index 00000000000..f9766eb8afe --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Language/ConstructorCache.cpp @@ -0,0 +1,212 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "RuntimeLanguagePch.h" + + +namespace Js +{ + ConstructorCache ConstructorCache::DefaultInstance; + + ConstructorCache::ConstructorCache() + { + this->content.type = nullptr; + this->content.scriptContext = nullptr; + this->content.slotCount = 0; + this->content.inlineSlotCount = 0; + this->content.updateAfterCtor = false; + this->content.ctorHasNoExplicitReturnValue = false; + this->content.skipDefaultNewObject = false; + this->content.isPopulated = false; + this->content.isPolymorphic = false; + this->content.typeUpdatePending = false; + this->content.typeIsFinal = false; + this->content.hasPrototypeChanged = false; + this->content.callCount = 0; + Assert(IsConsistent()); + } + + ConstructorCache::ConstructorCache(ConstructorCache const * other) + { + Assert(other != nullptr); + this->content.type = other->content.type; + this->content.scriptContext = other->content.scriptContext; + this->content.slotCount = other->content.slotCount; + this->content.inlineSlotCount = other->content.inlineSlotCount; + this->content.updateAfterCtor = other->content.updateAfterCtor; + this->content.ctorHasNoExplicitReturnValue = other->content.ctorHasNoExplicitReturnValue; + this->content.skipDefaultNewObject = other->content.skipDefaultNewObject; + this->content.isPopulated = other->content.isPopulated; + this->content.isPolymorphic = other->content.isPolymorphic; + this->content.typeUpdatePending = other->content.typeUpdatePending; + this->content.typeIsFinal = other->content.typeIsFinal; + this->content.hasPrototypeChanged = other->content.hasPrototypeChanged; + this->content.callCount = other->content.callCount; + Assert(IsConsistent()); + } + + void ConstructorCache::Populate(DynamicType* type, ScriptContext* scriptContext, bool ctorHasNoExplicitReturnValue, bool updateAfterCtor) + { + Assert(scriptContext == type->GetScriptContext()); + Assert(type->GetIsShared()); + Assert(IsConsistent()); + Assert(!this->content.isPopulated || this->content.isPolymorphic); + Assert(type->GetTypeHandler()->GetSlotCapacity() <= MaxCachedSlotCount); + this->content.isPopulated = true; + this->content.type = type; + this->content.scriptContext = scriptContext; + this->content.slotCount = type->GetTypeHandler()->GetSlotCapacity(); + this->content.inlineSlotCount = type->GetTypeHandler()->GetInlineSlotCapacity(); + this->content.ctorHasNoExplicitReturnValue = ctorHasNoExplicitReturnValue; + this->content.updateAfterCtor = updateAfterCtor; + Assert(IsConsistent()); + } + + void ConstructorCache::PopulateForSkipDefaultNewObject(ScriptContext* scriptContext) + { + Assert(IsConsistent()); + Assert(!this->content.isPopulated); + this->content.isPopulated = true; + this->guard.value = CtorCacheGuardValues::Special; + this->content.scriptContext = scriptContext; + this->content.skipDefaultNewObject = true; + Assert(IsConsistent()); + } + + bool ConstructorCache::TryUpdateAfterConstructor(DynamicType* type, ScriptContext* scriptContext) + { + Assert(scriptContext == type->GetScriptContext()); + Assert(type->GetTypeHandler()->GetMayBecomeShared()); + Assert(IsConsistent()); + Assert(this->content.isPopulated); + Assert(this->content.scriptContext == scriptContext); + Assert(!this->content.typeUpdatePending); + Assert(this->content.ctorHasNoExplicitReturnValue); + + if (type->GetTypeHandler()->GetSlotCapacity() > MaxCachedSlotCount) + { + return false; + } + + if (type->GetIsShared()) + { + this->content.type = type; + this->content.typeIsFinal = true; + this->content.pendingType = nullptr; + } + else + { + AssertMsg(false, "No one calls this part of the code?"); + this->guard.value = CtorCacheGuardValues::Special; + this->content.pendingType = type; + this->content.typeUpdatePending = true; + } + this->content.slotCount = type->GetTypeHandler()->GetSlotCapacity(); + this->content.inlineSlotCount = type->GetTypeHandler()->GetInlineSlotCapacity(); + Assert(IsConsistent()); + return true; + } + + void ConstructorCache::UpdateInlineSlotCount() + { + Assert(IsConsistent()); + Assert(this->content.isPopulated); + Assert(IsEnabled() || NeedsTypeUpdate()); + DynamicType* type = this->content.typeUpdatePending ? this->content.pendingType : this->content.type; + DynamicTypeHandler* typeHandler = type->GetTypeHandler(); + // Inline slot capacity should never grow as a result of shrinking. + Assert(typeHandler->GetInlineSlotCapacity() <= this->content.inlineSlotCount); + // Slot capacity should never grow as a result of shrinking. + Assert(typeHandler->GetSlotCapacity() <= this->content.slotCount); + this->content.slotCount = typeHandler->GetSlotCapacity(); + this->content.inlineSlotCount = typeHandler->GetInlineSlotCapacity(); + Assert(IsConsistent()); + } + + void ConstructorCache::EnableAfterTypeUpdate() + { + Assert(IsConsistent()); + Assert(this->content.isPopulated); + Assert(!IsEnabled()); + Assert(this->guard.value == CtorCacheGuardValues::Special); + Assert(this->content.typeUpdatePending); + Assert(this->content.slotCount == this->content.pendingType->GetTypeHandler()->GetSlotCapacity()); + Assert(this->content.inlineSlotCount == this->content.pendingType->GetTypeHandler()->GetInlineSlotCapacity()); + Assert(this->content.pendingType->GetIsShared()); + this->content.type = this->content.pendingType; + this->content.typeIsFinal = true; + this->content.pendingType = nullptr; + this->content.typeUpdatePending = false; + Assert(IsConsistent()); + } + + ConstructorCache* ConstructorCache::EnsureValidInstance(ConstructorCache* currentCache, ScriptContext* scriptContext) + { + Assert(currentCache != nullptr); + + ConstructorCache* newCache = currentCache; + + // If the old cache has been invalidated, we need to create a new one to avoid incorrectly re-validating + // caches that may have been hard-coded in the JIT-ed code with different prototype and type. However, if + // the cache is already polymorphic, it will not be hard-coded, and hence we don't need to allocate a new + // one - in case the prototype property changes frequently. + if (ConstructorCache::IsDefault(currentCache) || (currentCache->IsInvalidated() && !currentCache->IsPolymorphic())) + { + // Review (jedmiad): I don't think we need to zero the struct, since we initialize each field. + newCache = RecyclerNew(scriptContext->GetRecycler(), ConstructorCache); + // TODO: Consider marking the cache as polymorphic only if the prototype and type actually changed. In fact, + // if they didn't change we could reuse the same cache and simply mark it as valid. Not really true. The cache + // might have been invalidated due to a property becoming read-only. In that case we can't re-validate an old + // monomorphic cache. We must allocate a new one. + newCache->content.isPolymorphic = currentCache->content.isPopulated && currentCache->content.hasPrototypeChanged; + } + + // If we kept the old invalidated cache, it better be marked as polymorphic. + Assert(!newCache->IsInvalidated() || newCache->IsPolymorphic()); + + // If the cache was polymorphic, we shouldn't have allocated a new one. + Assert(!currentCache->IsPolymorphic() || newCache == currentCache); + + return newCache; + } + + void ConstructorCache::InvalidateOnPrototypeChange() + { + if (IsDefault(this)) + { + Assert(this->guard.value == CtorCacheGuardValues::Invalid); + Assert(!this->content.isPopulated); + } + else if (this->guard.value == CtorCacheGuardValues::Special && this->content.skipDefaultNewObject) + { + // Do nothing. If we skip the default object, changes to the prototype property don't affect + // what we'll do during object allocation. + + // Can't assert the following because we set the prototype property during library initialization. + // AssertMsg(false, "Overriding a prototype on a built-in constructor should be illegal."); + } + else + { + this->guard.value = CtorCacheGuardValues::Invalid; + this->content.hasPrototypeChanged = true; + // Make sure we don't leak the old type. + Assert(this->content.type == nullptr); + this->content.pendingType = nullptr; + Assert(this->content.pendingType == nullptr); + Assert(IsInvalidated()); + } + Assert(IsConsistent()); + } + +#if DBG_DUMP + void ConstructorCache::Dump() const + { + Output::Print(_u("guard value or type = 0x%p, script context = 0x%p, pending type = 0x%p, slots = %d, inline slots = %d, populated = %d, polymorphic = %d, update cache = %d, update type = %d, skip default = %d, no return = %d"), + this->GetRawGuardValue(), this->GetScriptContext(), this->GetPendingType(), this->GetSlotCount(), this->GetInlineSlotCount(), + this->IsPopulated(), this->IsPolymorphic(), this->GetUpdateCacheAfterCtor(), this->GetTypeUpdatePending(), + this->GetSkipDefaultNewObject(), this->GetCtorHasNoExplicitReturnValue()); + } +#endif +} \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Language/ConstructorCache.h b/deps/chakrashim/core/lib/Runtime/Language/ConstructorCache.h new file mode 100644 index 00000000000..1c9b3221556 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Language/ConstructorCache.h @@ -0,0 +1,271 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +namespace Js +{ + enum class CtorCacheGuardValues : intptr_t + { + TagFlag = 0x01, + + Invalid = 0x00, + Special = TagFlag + }; + ENUM_CLASS_HELPERS(CtorCacheGuardValues, intptr_t); + + #define MaxCachedSlotCount 65535 + + struct ConstructorCache + { + friend class JavascriptFunction; + + struct GuardStruct + { + Field(CtorCacheGuardValues) value; + }; + + struct ContentStruct + { + Field(DynamicType*) type; + Field(ScriptContext*) scriptContext; + // In a pinch we could eliminate this and store type pending sharing in the type field as long + // as the guard value flags fit below the object alignment boundary. However, this wouldn't + // keep the type alive, so it would only work if we zeroed constructor caches before GC. + Field(DynamicType*) pendingType; + + // We cache only types whose slotCount < 64K to ensure the slotCount field doesn't look like a pointer to the recycler. + Field(int) slotCount; + + // This layout (i.e. one-byte bit fields first, then the one-byte updateAfterCtor, and then the two byte inlineSlotCount) is + // chosen intentionally to make sure the whole four bytes never look like a pointer and create a false reference pinning something + // in recycler heap. The isPopulated bit is always set when the cache holds any data - even if it got invalidated. + Field(bool) isPopulated : 1; + Field(bool) isPolymorphic : 1; + Field(bool) typeUpdatePending : 1; + Field(bool) ctorHasNoExplicitReturnValue : 1; + Field(bool) skipDefaultNewObject : 1; + // This field indicates that the type stored in this cache is the final type after constructor. + Field(bool) typeIsFinal : 1; + // This field indicates that the constructor cache has been invalidated due to a constructor's prototype property change. + // We use this flag to determine if we should mark the cache as polymorphic and not attempt subsequent optimizations. + // The cache may also be invalidated due to a guard invalidation resulting from some property change (e.g. in proto chain), + // in which case we won't deem the cache polymorphic. + Field(bool) hasPrototypeChanged : 1; + + Field(uint8) callCount; + + // Separate from the bit field below for convenient compare from the JIT-ed code. Doesn't currently increase the size. + // If size becomes an issue, we could merge back into the bit field and use a TEST instead of CMP. + Field(bool) updateAfterCtor; + + Field(int16) inlineSlotCount; + }; + + union + { + Field(GuardStruct) guard; + Field(ContentStruct) content; + }; + + CompileAssert(offsetof(GuardStruct, value) == offsetof(ContentStruct, type)); + CompileAssert(sizeof(((GuardStruct*)nullptr)->value) == sizeof(((ContentStruct*)nullptr)->type)); + CompileAssert(static_cast(CtorCacheGuardValues::Invalid) == static_cast(NULL)); + + static ConstructorCache DefaultInstance; + + public: + ConstructorCache(); + ConstructorCache(ConstructorCache const * other); + + static size_t const GetOffsetOfGuardValue() { return offsetof(Js::ConstructorCache, guard.value); } + static size_t const GetSizeOfGuardValue() { return sizeof(((Js::ConstructorCache*)nullptr)->guard.value); } + + void Populate(DynamicType* type, ScriptContext* scriptContext, bool ctorHasNoExplicitReturnValue, bool updateAfterCtor); + void PopulateForSkipDefaultNewObject(ScriptContext* scriptContext); + bool TryUpdateAfterConstructor(DynamicType* type, ScriptContext* scriptContext); + void UpdateInlineSlotCount(); + void EnableAfterTypeUpdate(); + + intptr_t GetRawGuardValue() const + { + return static_cast(this->guard.value); + } + + DynamicType* GetGuardValueAsType() const + { + return reinterpret_cast(this->guard.value & ~CtorCacheGuardValues::TagFlag); + } + + DynamicType* GetType() const + { + Assert(static_cast(this->guard.value & CtorCacheGuardValues::TagFlag) == 0); + return this->content.type; + } + + DynamicType* GetPendingType() const + { + return this->content.pendingType; + } + + ScriptContext* GetScriptContext() const + { + return this->content.scriptContext; + } + + int GetSlotCount() const + { + return this->content.slotCount; + } + + int16 GetInlineSlotCount() const + { + return this->content.inlineSlotCount; + } + + static bool IsDefault(const ConstructorCache* constructorCache) + { + return constructorCache == &ConstructorCache::DefaultInstance; + } + + bool IsDefault() const + { + return IsDefault(this); + } + + bool IsPopulated() const + { + Assert(IsConsistent()); + return this->content.isPopulated; + } + + bool IsEmpty() const + { + Assert(IsConsistent()); + return !this->content.isPopulated; + } + + bool IsPolymorphic() const + { + Assert(IsConsistent()); + return this->content.isPolymorphic; + } + + bool GetSkipDefaultNewObject() const + { + return this->content.skipDefaultNewObject; + } + + bool GetCtorHasNoExplicitReturnValue() const + { + return this->content.ctorHasNoExplicitReturnValue; + } + + bool GetUpdateCacheAfterCtor() const + { + return this->content.updateAfterCtor; + } + + bool GetTypeUpdatePending() const + { + return this->content.typeUpdatePending; + } + + bool IsEnabled() const + { + return GetGuardValueAsType() != nullptr; + } + + bool IsInvalidated() const + { + return this->guard.value == CtorCacheGuardValues::Invalid && this->content.isPopulated; + } + + bool NeedsTypeUpdate() const + { + return this->guard.value == CtorCacheGuardValues::Special && this->content.typeUpdatePending; + } + + uint8 CallCount() const + { + return content.callCount; + } + + void IncCallCount() + { + ++content.callCount; + Assert(content.callCount != 0); + } + + bool NeedsUpdateAfterCtor() const + { + return this->content.updateAfterCtor; + } + + bool IsNormal() const + { + return this->guard.value != CtorCacheGuardValues::Invalid && static_cast(this->guard.value & CtorCacheGuardValues::TagFlag) == 0; + } + + bool SkipDefaultNewObject() const + { + return this->guard.value == CtorCacheGuardValues::Special && this->content.skipDefaultNewObject; + } + + bool IsSetUpForJit() const + { + return GetRawGuardValue() != NULL && !IsPolymorphic() && !NeedsUpdateAfterCtor() && (IsNormal() || SkipDefaultNewObject()); + } + + void ClearUpdateAfterCtor() + { + Assert(IsConsistent()); + Assert(this->content.isPopulated); + Assert(this->content.updateAfterCtor); + this->content.updateAfterCtor = false; + Assert(IsConsistent()); + } + + static ConstructorCache* EnsureValidInstance(ConstructorCache* currentCache, ScriptContext* scriptContext); + + const void* GetAddressOfGuardValue() const + { + return reinterpret_cast(&this->guard.value); + } + + static uint32 GetOffsetOfUpdateAfterCtor() + { + return offsetof(ConstructorCache, content.updateAfterCtor); + } + + void InvalidateAsGuard() + { + Assert(!IsDefault(this)); + this->guard.value = CtorCacheGuardValues::Invalid; + // Make sure we don't leak the types. + Assert(this->content.type == nullptr); + Assert(this->content.pendingType == nullptr); + Assert(IsInvalidated()); + Assert(IsConsistent()); + } + + #if DBG + bool IsConsistent() const + { + return this->guard.value == CtorCacheGuardValues::Invalid || + (this->content.isPopulated && ( + (this->guard.value == CtorCacheGuardValues::Special && !this->content.updateAfterCtor && this->content.skipDefaultNewObject && !this->content.typeUpdatePending && this->content.slotCount == 0 && this->content.inlineSlotCount == 0 && this->content.pendingType == nullptr) || + (this->guard.value == CtorCacheGuardValues::Special && !this->content.updateAfterCtor && this->content.typeUpdatePending && !this->content.skipDefaultNewObject && this->content.pendingType != nullptr) || + ((this->guard.value & CtorCacheGuardValues::TagFlag) == CtorCacheGuardValues::Invalid && !this->content.skipDefaultNewObject && !this->content.typeUpdatePending && this->content.pendingType == nullptr))); + } + #endif + + #if DBG_DUMP + void Dump() const; + #endif + + private: + void InvalidateOnPrototypeChange(); + }; +} \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Language/DynamicProfileInfo.cpp b/deps/chakrashim/core/lib/Runtime/Language/DynamicProfileInfo.cpp index 56c7dee5225..ad3968466ce 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/DynamicProfileInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/DynamicProfileInfo.cpp @@ -217,7 +217,11 @@ namespace Js bool DynamicProfileInfo::IsEnabled(const FunctionBody *const functionBody) { Assert(functionBody); - return IsEnabled_OptionalFunctionBody(functionBody, functionBody->GetScriptContext()); + return (IsEnabled_OptionalFunctionBody(functionBody, functionBody->GetScriptContext()) +#ifdef ENABLE_WASM + && !(PHASE_TRACE1(Js::WasmInOutPhase) && functionBody->IsWasmFunction()) +#endif + ); } bool DynamicProfileInfo::IsEnabled_OptionalFunctionBody(const FunctionBody *const functionBody, const ScriptContext *const scriptContext) @@ -248,7 +252,11 @@ namespace Js bool DynamicProfileInfo::IsEnabled(const Js::Phase phase, const FunctionBody *const functionBody) { Assert(functionBody); - return IsEnabled_OptionalFunctionBody(phase, functionBody, functionBody->GetScriptContext()); + return (IsEnabled_OptionalFunctionBody(phase, functionBody, functionBody->GetScriptContext()) +#ifdef ENABLE_WASM + && !(PHASE_TRACE1(Js::WasmInOutPhase) && functionBody->IsWasmFunction()) +#endif + ); } bool DynamicProfileInfo::IsEnabled_OptionalFunctionBody( @@ -409,6 +417,94 @@ namespace Js return callSiteInfo[callSiteId].isArgConstant; } +#ifdef ASMJS_PLAT + void DynamicProfileInfo::RecordAsmJsCallSiteInfo(FunctionBody* callerBody, ProfileId callSiteId, FunctionBody* calleeBody) + { + if (!callerBody || !callerBody->GetIsAsmjsMode() || !calleeBody || !calleeBody->GetIsAsmjsMode()) + { + AssertMsg(UNREACHED, "Call to RecordAsmJsCallSiteInfo without two asm.js/wasm FunctionBody"); + return; + } + +#if DBG_DUMP || defined(DYNAMIC_PROFILE_STORAGE) || defined(RUNTIME_DATA_COLLECTION) + // If we persistsAcrossScriptContext, the dynamic profile info may be referred to by multiple function body from + // different script context + Assert(!DynamicProfileInfo::NeedProfileInfoList() || this->persistsAcrossScriptContexts || this->functionBody == callerBody); +#endif + + bool doInline = true; + // This is a hard limit as we only use 4 bits to encode the actual count in the InlineeCallInfo + if (calleeBody->GetAsmJsFunctionInfo()->GetArgCount() > Js::InlineeCallInfo::MaxInlineeArgoutCount) + { + doInline = false; + } + + // Mark the callsite bit where caller and callee is same function + if (calleeBody == callerBody && callSiteId < 32) + { + this->m_recursiveInlineInfo = this->m_recursiveInlineInfo | (1 << callSiteId); + } + + // TODO: support polymorphic inlining in wasm + Assert(!callSiteInfo[callSiteId].isPolymorphic); + Js::SourceId oldSourceId = callSiteInfo[callSiteId].u.functionData.sourceId; + if (oldSourceId == InvalidSourceId) + { + return; + } + + Js::LocalFunctionId oldFunctionId = callSiteInfo[callSiteId].u.functionData.functionId; + + Js::SourceId sourceId = InvalidSourceId; + Js::LocalFunctionId functionId; + // We can only inline function that are from the same script context + if (callerBody->GetScriptContext() == calleeBody->GetScriptContext()) + { + if (callerBody->GetSecondaryHostSourceContext() == calleeBody->GetSecondaryHostSourceContext()) + { + if (callerBody->GetHostSourceContext() == calleeBody->GetHostSourceContext()) + { + sourceId = CurrentSourceId; // Caller and callee in same file + } + else + { + sourceId = (Js::SourceId)calleeBody->GetHostSourceContext(); // Caller and callee in different files + } + functionId = calleeBody->GetLocalFunctionId(); + } + else + { + // Pretend that we are cross context when call is crossing script file. + functionId = CallSiteCrossContext; + } + } + else + { + functionId = CallSiteCrossContext; + } + + if (oldSourceId == NoSourceId) + { + callSiteInfo[callSiteId].u.functionData.sourceId = sourceId; + callSiteInfo[callSiteId].u.functionData.functionId = functionId; + this->currentInlinerVersion++; // we don't mind if this overflows + } + else if (oldSourceId != sourceId || oldFunctionId != functionId) + { + if (oldFunctionId != CallSiteMixed) + { + this->currentInlinerVersion++; // we don't mind if this overflows + } + + callSiteInfo[callSiteId].u.functionData.functionId = CallSiteMixed; + doInline = false; + } + callSiteInfo[callSiteId].isConstructorCall = false; + callSiteInfo[callSiteId].dontInline = !doInline; + callSiteInfo[callSiteId].ldFldInlineCacheId = Js::Constants::NoInlineCacheIndex; + } +#endif + void DynamicProfileInfo::RecordCallSiteInfo(FunctionBody* functionBody, ProfileId callSiteId, FunctionInfo* calleeFunctionInfo, JavascriptFunction* calleeFunction, ArgSlot actualArgCount, bool isConstructorCall, InlineCacheIndex ldFldInlineCacheId) { #if DBG_DUMP || defined(DYNAMIC_PROFILE_STORAGE) || defined(RUNTIME_DATA_COLLECTION) @@ -477,6 +573,11 @@ namespace Js } functionId = calleeFunctionProxy->GetLocalFunctionId(); } + else if (calleeFunctionProxy->GetHostSourceContext() == Js::Constants::JsBuiltInSourceContext) + { + sourceId = JsBuiltInSourceId; + functionId = calleeFunctionProxy->GetLocalFunctionId(); + } else { // Pretend that we are cross context when call is crossing script file. @@ -672,7 +773,7 @@ namespace Js Assert(functionBody); const auto callSiteCount = functionBody->GetProfiledCallSiteCount(); Assert(callSiteId < callSiteCount); - Assert(HasCallSiteInfo(functionBody)); + Assert(functionBody->IsJsBuiltInCode() || HasCallSiteInfo(functionBody)); Assert(functionBodyArray); Assert(functionBodyArrayLength == DynamicProfileInfo::maxPolymorphicInliningSize); @@ -763,7 +864,7 @@ namespace Js Assert(functionBody); const auto callSiteCount = functionBody->GetProfiledCallSiteCount(); Assert(callSiteId < callSiteCount); - Assert(HasCallSiteInfo(functionBody)); + Assert(functionBody->IsJsBuiltInCode() || HasCallSiteInfo(functionBody)); *isConstructorCall = callSiteInfo[callSiteId].isConstructorCall; if (callSiteInfo[callSiteId].dontInline) @@ -785,6 +886,31 @@ namespace Js return inlineeProxy ? inlineeProxy->GetFunctionInfo() : nullptr; } + if (sourceId == JsBuiltInSourceId) + { + // For call across files find the function from the right source + JsUtil::List*, Recycler, false, Js::FreeListedRemovePolicy> * sourceList = functionBody->GetScriptContext()->GetSourceList(); + for (int i = 0; i < sourceList->Count(); i++) + { + if (sourceList->IsItemValid(i)) + { + Utf8SourceInfo *srcInfo = sourceList->Item(i)->Get(); + if (srcInfo && srcInfo->GetHostSourceContext() == Js::Constants::JsBuiltInSourceContext) + { + FunctionProxy *inlineeProxy = srcInfo->FindFunction(functionId); + if (inlineeProxy) + { + return inlineeProxy->GetFunctionInfo(); + } + else + { + return nullptr; + } + } + } + } + } + if (sourceId != NoSourceId && sourceId != InvalidSourceId) { // For call across files find the function from the right source @@ -815,7 +941,7 @@ namespace Js Assert(functionBody); const auto callSiteCount = functionBody->GetProfiledCallSiteCount(); Assert(callSiteId < callSiteCount); - Assert(HasCallSiteInfo(functionBody)); + Assert(functionBody->IsJsBuiltInCode() || HasCallSiteInfo(functionBody)); return callSiteInfo[callSiteId].ldFldInlineCacheId; } @@ -1755,7 +1881,6 @@ namespace Js #if DBG_DUMP writer->Log(this); #endif - FunctionBody * functionBody = this->GetFunctionBody(); Js::ArgSlot paramInfoCount = functionBody->GetProfiledInParamsCount(); if (!writer->Write(functionBody->GetLocalFunctionId()) diff --git a/deps/chakrashim/core/lib/Runtime/Language/DynamicProfileInfo.h b/deps/chakrashim/core/lib/Runtime/Language/DynamicProfileInfo.h index 1f9705507a5..51fe74de6a3 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/DynamicProfileInfo.h +++ b/deps/chakrashim/core/lib/Runtime/Language/DynamicProfileInfo.h @@ -386,6 +386,9 @@ namespace Js ValueType GetSwitchType(FunctionBody* body, ProfileId switchId) const; ValueType * GetSwitchTypeInfo() const { return switchTypeInfo; } +#ifdef ASMJS_PLAT + void RecordAsmJsCallSiteInfo(FunctionBody* callerBody, ProfileId callSiteId, FunctionBody* calleeBody); +#endif void RecordCallSiteInfo(FunctionBody* functionBody, ProfileId callSiteId, FunctionInfo * calleeFunctionInfo, JavascriptFunction* calleeFunction, ArgSlot actualArgCount, bool isConstructorCall, InlineCacheIndex ldFldInlineCacheId = Js::Constants::NoInlineCacheIndex); void RecordConstParameterAtCallSite(ProfileId callSiteId, int argNum); static bool HasCallSiteInfo(FunctionBody* functionBody); @@ -592,6 +595,7 @@ namespace Js static Js::SourceId const BuiltInSourceId = (SourceId)-2; static Js::SourceId const CurrentSourceId = (SourceId)-3; // caller and callee in the same file static Js::SourceId const InvalidSourceId = (SourceId)-4; + static Js::SourceId const JsBuiltInSourceId = (SourceId)-5; bool MatchFunctionBody(FunctionBody * functionBody); diff --git a/deps/chakrashim/core/lib/Runtime/Language/EHBailoutData.h b/deps/chakrashim/core/lib/Runtime/Language/EHBailoutData.h index c1943d725a1..68ea4923c6e 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/EHBailoutData.h +++ b/deps/chakrashim/core/lib/Runtime/Language/EHBailoutData.h @@ -33,7 +33,15 @@ namespace Js this->parent = parent; this->child = nullptr; } - + EHBailoutData(EHBailoutData * other) + { + this->nestingDepth = other->nestingDepth; + this->catchOffset = other->catchOffset; + this->finallyOffset = other->finallyOffset; + this->ht = other->ht; + this->parent = other->parent; + this->child = nullptr; + } #if ENABLE_NATIVE_CODEGEN void Fixup(NativeCodeData::DataChunk* chunkList) { diff --git a/deps/chakrashim/core/lib/Runtime/Language/ExecutionModes.h b/deps/chakrashim/core/lib/Runtime/Language/ExecutionModes.h index 28289ec716d..c5b3d5bd308 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/ExecutionModes.h +++ b/deps/chakrashim/core/lib/Runtime/Language/ExecutionModes.h @@ -5,7 +5,7 @@ // Non-profiling interpreter // - For instance, it is used for NoNative mode -// - Does not transition to other execution modes +// - Can only transition to FullJIT EXECUTION_MODE(Interpreter) // Auto-profiling interpreter diff --git a/deps/chakrashim/core/lib/Runtime/Language/InlineCache.cpp b/deps/chakrashim/core/lib/Runtime/Language/InlineCache.cpp index 8652a02e0fc..2dce6fa37c6 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InlineCache.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/InlineCache.cpp @@ -413,6 +413,7 @@ namespace Js return clone; } +#if ENABLE_FIXED_FIELDS bool InlineCache::TryGetFixedMethodFromCache(Js::FunctionBody* functionBody, uint cacheId, Js::JavascriptFunction** pFixedMethod) { Assert(pFixedMethod); @@ -441,7 +442,7 @@ namespace Js Assert(propertyOwnerType != nullptr); - if (Js::DynamicType::Is(propertyOwnerType->GetTypeId())) + if (Js::DynamicType::Is(propertyOwnerType)) { Js::DynamicTypeHandler* propertyOwnerTypeHandler = ((Js::DynamicType*)propertyOwnerType)->GetTypeHandler(); Js::PropertyId propertyId = functionBody->GetPropertyIdFromCacheId(cacheId); @@ -464,6 +465,7 @@ namespace Js return false; } +#endif void InlineCache::CopyTo(PropertyId propertyId, ScriptContext * scriptContext, InlineCache * const clone) { @@ -1140,226 +1142,6 @@ namespace Js } #endif -#if ENABLE_NATIVE_CODEGEN - - EquivalentTypeSet::EquivalentTypeSet(RecyclerJITTypeHolder * types, uint16 count) - : types(types), count(count), sortedAndDuplicatesRemoved(false) - { - } - - JITTypeHolder EquivalentTypeSet::GetType(uint16 index) const - { - Assert(this->types != nullptr && this->count > 0 && index < this->count); - return this->types[index]; - } - - JITTypeHolder EquivalentTypeSet::GetFirstType() const - { - return GetType(0); - } - - bool EquivalentTypeSet::Contains(const JITTypeHolder type, uint16* pIndex) - { - if (!this->GetSortedAndDuplicatesRemoved()) - { - this->SortAndRemoveDuplicates(); - } - for (uint16 ti = 0; ti < this->count; ti++) - { - if (this->GetType(ti) == type) - { - if (pIndex) - { - *pIndex = ti; - } - return true; - } - } - return false; - } - - bool EquivalentTypeSet::AreIdentical(EquivalentTypeSet * left, EquivalentTypeSet * right) - { - if (!left->GetSortedAndDuplicatesRemoved()) - { - left->SortAndRemoveDuplicates(); - } - if (!right->GetSortedAndDuplicatesRemoved()) - { - right->SortAndRemoveDuplicates(); - } - - Assert(left->GetSortedAndDuplicatesRemoved() && right->GetSortedAndDuplicatesRemoved()); - - if (left->count != right->count) - { - return false; - } - - // TODO: OOP JIT, optimize this (previously we had memcmp) - for (uint i = 0; i < left->count; ++i) - { - if (left->types[i] != right->types[i]) - { - return false; - } - } - return true; - } - - bool EquivalentTypeSet::IsSubsetOf(EquivalentTypeSet * left, EquivalentTypeSet * right) - { - if (!left->GetSortedAndDuplicatesRemoved()) - { - left->SortAndRemoveDuplicates(); - } - if (!right->GetSortedAndDuplicatesRemoved()) - { - right->SortAndRemoveDuplicates(); - } - - if (left->count > right->count) - { - return false; - } - - // Try to find each left type in the right set. - int j = 0; - for (int i = 0; i < left->count; i++) - { - bool found = false; - for (; j < right->count; j++) - { - if (left->types[i] < right->types[j]) - { - // Didn't find the left type. Fail. - return false; - } - if (left->types[i] == right->types[j]) - { - // Found the left type. Continue to the next left/right pair. - found = true; - j++; - break; - } - } - Assert(j <= right->count); - if (j == right->count && !found) - { - // Exhausted the right set without finding the current left type. - return false; - } - } - return true; - } - - void EquivalentTypeSet::SortAndRemoveDuplicates() - { - uint16 oldCount = this->count; - uint16 i; - - // sorting - for (i = 1; i < oldCount; i++) - { - uint16 j = i; - while (j > 0 && (this->types[j - 1] > this->types[j])) - { - JITTypeHolder tmp = this->types[j]; - this->types[j] = this->types[j - 1]; - this->types[j - 1] = tmp; - j--; - } - } - - // removing duplicate types from the sorted set - i = 0; - for (uint16 j = 1; j < oldCount; j++) - { - if (this->types[i] != this->types[j]) - { - this->types[++i] = this->types[j]; - } - } - this->count = ++i; - for (i; i < oldCount; i++) - { - this->types[i] = JITTypeHolder(nullptr); - } - - this->sortedAndDuplicatesRemoved = true; - } -#endif - - ConstructorCache ConstructorCache::DefaultInstance; - - ConstructorCache* ConstructorCache::EnsureValidInstance(ConstructorCache* currentCache, ScriptContext* scriptContext) - { - Assert(currentCache != nullptr); - - ConstructorCache* newCache = currentCache; - - // If the old cache has been invalidated, we need to create a new one to avoid incorrectly re-validating - // caches that may have been hard-coded in the JIT-ed code with different prototype and type. However, if - // the cache is already polymorphic, it will not be hard-coded, and hence we don't need to allocate a new - // one - in case the prototype property changes frequently. - if (ConstructorCache::IsDefault(currentCache) || (currentCache->IsInvalidated() && !currentCache->IsPolymorphic())) - { - // Review (jedmiad): I don't think we need to zero the struct, since we initialize each field. - newCache = RecyclerNew(scriptContext->GetRecycler(), ConstructorCache); - // TODO: Consider marking the cache as polymorphic only if the prototype and type actually changed. In fact, - // if they didn't change we could reuse the same cache and simply mark it as valid. Not really true. The cache - // might have been invalidated due to a property becoming read-only. In that case we can't re-validate an old - // monomorphic cache. We must allocate a new one. - newCache->content.isPolymorphic = currentCache->content.isPopulated && currentCache->content.hasPrototypeChanged; - } - - // If we kept the old invalidated cache, it better be marked as polymorphic. - Assert(!newCache->IsInvalidated() || newCache->IsPolymorphic()); - - // If the cache was polymorphic, we shouldn't have allocated a new one. - Assert(!currentCache->IsPolymorphic() || newCache == currentCache); - - return newCache; - } - - void ConstructorCache::InvalidateOnPrototypeChange() - { - if (IsDefault(this)) - { - Assert(this->guard.value == CtorCacheGuardValues::Invalid); - Assert(!this->content.isPopulated); - } - else if (this->guard.value == CtorCacheGuardValues::Special && this->content.skipDefaultNewObject) - { - // Do nothing. If we skip the default object, changes to the prototype property don't affect - // what we'll do during object allocation. - - // Can't assert the following because we set the prototype property during library initialization. - // AssertMsg(false, "Overriding a prototype on a built-in constructor should be illegal."); - } - else - { - this->guard.value = CtorCacheGuardValues::Invalid; - this->content.hasPrototypeChanged = true; - // Make sure we don't leak the old type. - Assert(this->content.type == nullptr); - this->content.pendingType = nullptr; - Assert(this->content.pendingType == nullptr); - Assert(IsInvalidated()); - } - Assert(IsConsistent()); - } - -#if DBG_DUMP - void ConstructorCache::Dump() const - { - Output::Print(_u("guard value or type = 0x%p, script context = 0x%p, pending type = 0x%p, slots = %d, inline slots = %d, populated = %d, polymorphic = %d, update cache = %d, update type = %d, skip default = %d, no return = %d"), - this->GetRawGuardValue(), this->GetScriptContext(), this->GetPendingType(), this->GetSlotCount(), this->GetInlineSlotCount(), - this->IsPopulated(), this->IsPolymorphic(), this->GetUpdateCacheAfterCtor(), this->GetTypeUpdatePending(), - this->GetSkipDefaultNewObject(), this->GetCtorHasNoExplicitReturnValue()); - } -#endif - void IsInstInlineCache::Set(Type * instanceType, JavascriptFunction * function, JavascriptBoolean * result) { this->type = instanceType; diff --git a/deps/chakrashim/core/lib/Runtime/Language/InlineCache.h b/deps/chakrashim/core/lib/Runtime/Language/InlineCache.h index b544ce8657f..4002c060bb9 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InlineCache.h +++ b/deps/chakrashim/core/lib/Runtime/Language/InlineCache.h @@ -11,7 +11,7 @@ #define TypeHasAuxSlotTag(_t) \ (!!(reinterpret_cast(_t) & InlineCacheAuxSlotTypeTag)) -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) #define PolymorphicInlineCacheShift 5 // On 32 bit architectures, the least 5 significant bits of a DynamicTypePointer is 0 #else #define PolymorphicInlineCacheShift 6 // On 64 bit architectures, the least 6 significant bits of a DynamicTypePointer is 0 @@ -268,14 +268,6 @@ namespace Js Type *const type, ScriptContext *const requestContext); - void CacheMissing( - DynamicObject *const missingPropertyHolder, - const PropertyId propertyId, - const PropertyIndex propertyIndex, - const bool isInlineSlot, - Type *const type, - ScriptContext *const requestContext); - void CacheAccessor( const bool isGetter, const PropertyId propertyId, @@ -322,7 +314,9 @@ namespace Js InlineCache *Clone(TAllocator *const allocator); InlineCache *Clone(Js::PropertyId propertyId, ScriptContext* scriptContext); void CopyTo(PropertyId propertyId, ScriptContext * scriptContext, InlineCache * const clone); +#if ENABLE_FIXED_FIELDS bool TryGetFixedMethodFromCache(Js::FunctionBody* functionBody, uint cacheId, Js::JavascriptFunction** pFixedMethod); +#endif bool GetGetterSetter(Type *const type, RecyclableObject **callee); bool GetCallApplyTarget(RecyclableObject* obj, RecyclableObject **callee); @@ -359,7 +353,7 @@ namespace Js #endif }; -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) CompileAssert(sizeof(InlineCache) == 0x10); #else CompileAssert(sizeof(InlineCache) == 0x20); @@ -370,6 +364,7 @@ namespace Js class PolymorphicInlineCache _ABSTRACT : public FinalizableObject { + DECLARE_RECYCLER_VERIFY_MARK_FRIEND() #ifdef INLINE_CACHE_STATS friend class Js::ScriptContext; #endif @@ -599,423 +594,6 @@ namespace Js virtual void Finalize(bool isShutdown) override; }; -#if ENABLE_NATIVE_CODEGEN - class EquivalentTypeSet - { - private: - Field(bool) sortedAndDuplicatesRemoved; - Field(uint16) count; - Field(RecyclerJITTypeHolder *) types; - - public: - EquivalentTypeSet(RecyclerJITTypeHolder * types, uint16 count); - - uint16 GetCount() const - { - return this->count; - } - - JITTypeHolder GetFirstType() const; - - JITTypeHolder GetType(uint16 index) const; - - bool GetSortedAndDuplicatesRemoved() const - { - return this->sortedAndDuplicatesRemoved; - } - bool Contains(const JITTypeHolder type, uint16 * pIndex = nullptr); - - static bool AreIdentical(EquivalentTypeSet * left, EquivalentTypeSet * right); - static bool IsSubsetOf(EquivalentTypeSet * left, EquivalentTypeSet * right); - void SortAndRemoveDuplicates(); - }; -#endif - enum class CtorCacheGuardValues : intptr_t - { - TagFlag = 0x01, - - Invalid = 0x00, - Special = TagFlag - }; - ENUM_CLASS_HELPERS(CtorCacheGuardValues, intptr_t); - -#define MaxCachedSlotCount 65535 - - struct ConstructorCache - { - friend class JavascriptFunction; - - struct GuardStruct - { - Field(CtorCacheGuardValues) value; - }; - - struct ContentStruct - { - Field(DynamicType*) type; - Field(ScriptContext*) scriptContext; - // In a pinch we could eliminate this and store type pending sharing in the type field as long - // as the guard value flags fit below the object alignment boundary. However, this wouldn't - // keep the type alive, so it would only work if we zeroed constructor caches before GC. - Field(DynamicType*) pendingType; - - // We cache only types whose slotCount < 64K to ensure the slotCount field doesn't look like a pointer to the recycler. - Field(int) slotCount; - - // This layout (i.e. one-byte bit fields first, then the one-byte updateAfterCtor, and then the two byte inlineSlotCount) is - // chosen intentionally to make sure the whole four bytes never look like a pointer and create a false reference pinning something - // in recycler heap. The isPopulated bit is always set when the cache holds any data - even if it got invalidated. - Field(bool) isPopulated : 1; - Field(bool) isPolymorphic : 1; - Field(bool) typeUpdatePending : 1; - Field(bool) ctorHasNoExplicitReturnValue : 1; - Field(bool) skipDefaultNewObject : 1; - // This field indicates that the type stored in this cache is the final type after constructor. - Field(bool) typeIsFinal : 1; - // This field indicates that the constructor cache has been invalidated due to a constructor's prototype property change. - // We use this flag to determine if we should mark the cache as polymorphic and not attempt subsequent optimizations. - // The cache may also be invalidated due to a guard invalidation resulting from some property change (e.g. in proto chain), - // in which case we won't deem the cache polymorphic. - Field(bool) hasPrototypeChanged : 1; - - Field(uint8) callCount; - - // Separate from the bit field below for convenient compare from the JIT-ed code. Doesn't currently increase the size. - // If size becomes an issue, we could merge back into the bit field and use a TEST instead of CMP. - Field(bool) updateAfterCtor; - - Field(int16) inlineSlotCount; - }; - - union - { - Field(GuardStruct) guard; - Field(ContentStruct) content; - }; - - CompileAssert(offsetof(GuardStruct, value) == offsetof(ContentStruct, type)); - CompileAssert(sizeof(((GuardStruct*)nullptr)->value) == sizeof(((ContentStruct*)nullptr)->type)); - CompileAssert(static_cast(CtorCacheGuardValues::Invalid) == static_cast(NULL)); - - static ConstructorCache DefaultInstance; - - public: - ConstructorCache() - { - this->content.type = nullptr; - this->content.scriptContext = nullptr; - this->content.slotCount = 0; - this->content.inlineSlotCount = 0; - this->content.updateAfterCtor = false; - this->content.ctorHasNoExplicitReturnValue = false; - this->content.skipDefaultNewObject = false; - this->content.isPopulated = false; - this->content.isPolymorphic = false; - this->content.typeUpdatePending = false; - this->content.typeIsFinal = false; - this->content.hasPrototypeChanged = false; - this->content.callCount = 0; - Assert(IsConsistent()); - } - - ConstructorCache(ConstructorCache const * other) - { - Assert(other != nullptr); - this->content.type = other->content.type; - this->content.scriptContext = other->content.scriptContext; - this->content.slotCount = other->content.slotCount; - this->content.inlineSlotCount = other->content.inlineSlotCount; - this->content.updateAfterCtor = other->content.updateAfterCtor; - this->content.ctorHasNoExplicitReturnValue = other->content.ctorHasNoExplicitReturnValue; - this->content.skipDefaultNewObject = other->content.skipDefaultNewObject; - this->content.isPopulated = other->content.isPopulated; - this->content.isPolymorphic = other->content.isPolymorphic; - this->content.typeUpdatePending = other->content.typeUpdatePending; - this->content.typeIsFinal = other->content.typeIsFinal; - this->content.hasPrototypeChanged = other->content.hasPrototypeChanged; - this->content.callCount = other->content.callCount; - Assert(IsConsistent()); - } - - static size_t const GetOffsetOfGuardValue() { return offsetof(Js::ConstructorCache, guard.value); } - static size_t const GetSizeOfGuardValue() { return sizeof(((Js::ConstructorCache*)nullptr)->guard.value); } - - void Populate(DynamicType* type, ScriptContext* scriptContext, bool ctorHasNoExplicitReturnValue, bool updateAfterCtor) - { - Assert(scriptContext == type->GetScriptContext()); - Assert(type->GetIsShared()); - Assert(IsConsistent()); - Assert(!this->content.isPopulated || this->content.isPolymorphic); - Assert(type->GetTypeHandler()->GetSlotCapacity() <= MaxCachedSlotCount); - this->content.isPopulated = true; - this->content.type = type; - this->content.scriptContext = scriptContext; - this->content.slotCount = type->GetTypeHandler()->GetSlotCapacity(); - this->content.inlineSlotCount = type->GetTypeHandler()->GetInlineSlotCapacity(); - this->content.ctorHasNoExplicitReturnValue = ctorHasNoExplicitReturnValue; - this->content.updateAfterCtor = updateAfterCtor; - Assert(IsConsistent()); - } - - void PopulateForSkipDefaultNewObject(ScriptContext* scriptContext) - { - Assert(IsConsistent()); - Assert(!this->content.isPopulated); - this->content.isPopulated = true; - this->guard.value = CtorCacheGuardValues::Special; - this->content.scriptContext = scriptContext; - this->content.skipDefaultNewObject = true; - Assert(IsConsistent()); - } - - bool TryUpdateAfterConstructor(DynamicType* type, ScriptContext* scriptContext) - { - Assert(scriptContext == type->GetScriptContext()); - Assert(type->GetTypeHandler()->GetMayBecomeShared()); - Assert(IsConsistent()); - Assert(this->content.isPopulated); - Assert(this->content.scriptContext == scriptContext); - Assert(!this->content.typeUpdatePending); - Assert(this->content.ctorHasNoExplicitReturnValue); - - if (type->GetTypeHandler()->GetSlotCapacity() > MaxCachedSlotCount) - { - return false; - } - - if (type->GetIsShared()) - { - this->content.type = type; - this->content.typeIsFinal = true; - this->content.pendingType = nullptr; - } - else - { - AssertMsg(false, "No one calls this part of the code?"); - this->guard.value = CtorCacheGuardValues::Special; - this->content.pendingType = type; - this->content.typeUpdatePending = true; - } - this->content.slotCount = type->GetTypeHandler()->GetSlotCapacity(); - this->content.inlineSlotCount = type->GetTypeHandler()->GetInlineSlotCapacity(); - Assert(IsConsistent()); - return true; - } - - void UpdateInlineSlotCount() - { - Assert(IsConsistent()); - Assert(this->content.isPopulated); - Assert(IsEnabled() || NeedsTypeUpdate()); - DynamicType* type = this->content.typeUpdatePending ? this->content.pendingType : this->content.type; - DynamicTypeHandler* typeHandler = type->GetTypeHandler(); - // Inline slot capacity should never grow as a result of shrinking. - Assert(typeHandler->GetInlineSlotCapacity() <= this->content.inlineSlotCount); - // Slot capacity should never grow as a result of shrinking. - Assert(typeHandler->GetSlotCapacity() <= this->content.slotCount); - this->content.slotCount = typeHandler->GetSlotCapacity(); - this->content.inlineSlotCount = typeHandler->GetInlineSlotCapacity(); - Assert(IsConsistent()); - } - - void EnableAfterTypeUpdate() - { - Assert(IsConsistent()); - Assert(this->content.isPopulated); - Assert(!IsEnabled()); - Assert(this->guard.value == CtorCacheGuardValues::Special); - Assert(this->content.typeUpdatePending); - Assert(this->content.slotCount == this->content.pendingType->GetTypeHandler()->GetSlotCapacity()); - Assert(this->content.inlineSlotCount == this->content.pendingType->GetTypeHandler()->GetInlineSlotCapacity()); - Assert(this->content.pendingType->GetIsShared()); - this->content.type = this->content.pendingType; - this->content.typeIsFinal = true; - this->content.pendingType = nullptr; - this->content.typeUpdatePending = false; - Assert(IsConsistent()); - } - - intptr_t GetRawGuardValue() const - { - return static_cast(this->guard.value); - } - - DynamicType* GetGuardValueAsType() const - { - return reinterpret_cast(this->guard.value & ~CtorCacheGuardValues::TagFlag); - } - - DynamicType* GetType() const - { - Assert(static_cast(this->guard.value & CtorCacheGuardValues::TagFlag) == 0); - return this->content.type; - } - - DynamicType* GetPendingType() const - { - return this->content.pendingType; - } - - ScriptContext* GetScriptContext() const - { - return this->content.scriptContext; - } - - int GetSlotCount() const - { - return this->content.slotCount; - } - - int16 GetInlineSlotCount() const - { - return this->content.inlineSlotCount; - } - - static bool IsDefault(const ConstructorCache* constructorCache) - { - return constructorCache == &ConstructorCache::DefaultInstance; - } - - bool IsDefault() const - { - return IsDefault(this); - } - - bool IsPopulated() const - { - Assert(IsConsistent()); - return this->content.isPopulated; - } - - bool IsEmpty() const - { - Assert(IsConsistent()); - return !this->content.isPopulated; - } - - bool IsPolymorphic() const - { - Assert(IsConsistent()); - return this->content.isPolymorphic; - } - - bool GetSkipDefaultNewObject() const - { - return this->content.skipDefaultNewObject; - } - - bool GetCtorHasNoExplicitReturnValue() const - { - return this->content.ctorHasNoExplicitReturnValue; - } - - bool GetUpdateCacheAfterCtor() const - { - return this->content.updateAfterCtor; - } - - bool GetTypeUpdatePending() const - { - return this->content.typeUpdatePending; - } - - bool IsEnabled() const - { - return GetGuardValueAsType() != nullptr; - } - - bool IsInvalidated() const - { - return this->guard.value == CtorCacheGuardValues::Invalid && this->content.isPopulated; - } - - bool NeedsTypeUpdate() const - { - return this->guard.value == CtorCacheGuardValues::Special && this->content.typeUpdatePending; - } - - uint8 CallCount() const - { - return content.callCount; - } - - void IncCallCount() - { - ++content.callCount; - Assert(content.callCount != 0); - } - - bool NeedsUpdateAfterCtor() const - { - return this->content.updateAfterCtor; - } - - bool IsNormal() const - { - return this->guard.value != CtorCacheGuardValues::Invalid && static_cast(this->guard.value & CtorCacheGuardValues::TagFlag) == 0; - } - - bool SkipDefaultNewObject() const - { - return this->guard.value == CtorCacheGuardValues::Special && this->content.skipDefaultNewObject; - } - - bool IsSetUpForJit() const - { - return GetRawGuardValue() != NULL && !IsPolymorphic() && !NeedsUpdateAfterCtor() && (IsNormal() || SkipDefaultNewObject()); - } - - void ClearUpdateAfterCtor() - { - Assert(IsConsistent()); - Assert(this->content.isPopulated); - Assert(this->content.updateAfterCtor); - this->content.updateAfterCtor = false; - Assert(IsConsistent()); - } - - static ConstructorCache* EnsureValidInstance(ConstructorCache* currentCache, ScriptContext* scriptContext); - - const void* GetAddressOfGuardValue() const - { - return reinterpret_cast(&this->guard.value); - } - - static uint32 GetOffsetOfUpdateAfterCtor() - { - return offsetof(ConstructorCache, content.updateAfterCtor); - } - - void InvalidateAsGuard() - { - Assert(!IsDefault(this)); - this->guard.value = CtorCacheGuardValues::Invalid; - // Make sure we don't leak the types. - Assert(this->content.type == nullptr); - Assert(this->content.pendingType == nullptr); - Assert(IsInvalidated()); - Assert(IsConsistent()); - } - -#if DBG - bool IsConsistent() const - { - return this->guard.value == CtorCacheGuardValues::Invalid || - (this->content.isPopulated && ( - (this->guard.value == CtorCacheGuardValues::Special && !this->content.updateAfterCtor && this->content.skipDefaultNewObject && !this->content.typeUpdatePending && this->content.slotCount == 0 && this->content.inlineSlotCount == 0 && this->content.pendingType == nullptr) || - (this->guard.value == CtorCacheGuardValues::Special && !this->content.updateAfterCtor && this->content.typeUpdatePending && !this->content.skipDefaultNewObject && this->content.pendingType != nullptr) || - ((this->guard.value & CtorCacheGuardValues::TagFlag) == CtorCacheGuardValues::Invalid && !this->content.skipDefaultNewObject && !this->content.typeUpdatePending && this->content.pendingType == nullptr))); - } -#endif - -#if DBG_DUMP - void Dump() const; -#endif - - private: - void InvalidateOnPrototypeChange(); - }; - // Caches the result of an instanceof operator over a type and a function struct IsInstInlineCache { @@ -1105,7 +683,7 @@ namespace Js } }; -#if defined(_M_IX86_OR_ARM32) +#if defined(TARGET_32) CompileAssert(sizeof(IsInstInlineCache) == 0x10); #else CompileAssert(sizeof(IsInstInlineCache) == 0x20); diff --git a/deps/chakrashim/core/lib/Runtime/Language/InlineCache.inl b/deps/chakrashim/core/lib/Runtime/Language/InlineCache.inl index b989f6830dd..404eb325684 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InlineCache.inl +++ b/deps/chakrashim/core/lib/Runtime/Language/InlineCache.inl @@ -35,7 +35,7 @@ namespace Js if (CheckLocal && type == u.local.type) { Assert(propertyObject->GetScriptContext() == requestContext); // we never cache a type from another script context - *propertyValue = DynamicObject::FromVar(propertyObject)->GetInlineSlot(u.local.slotIndex); + *propertyValue = DynamicObject::UnsafeFromVar(propertyObject)->GetInlineSlot(u.local.slotIndex); Assert(*propertyValue == JavascriptOperators::GetProperty(propertyObject, propertyId, requestContext) || (RootObjectBase::Is(propertyObject) && *propertyValue == JavascriptOperators::GetRootProperty(propertyObject, propertyId, requestContext))); if (ReturnOperationInfo) @@ -49,7 +49,7 @@ namespace Js if (CheckLocal && TypeWithAuxSlotTag(type) == u.local.type) { Assert(propertyObject->GetScriptContext() == requestContext); // we never cache a type from another script context - *propertyValue = DynamicObject::FromVar(propertyObject)->GetAuxSlot(u.local.slotIndex); + *propertyValue = DynamicObject::UnsafeFromVar(propertyObject)->GetAuxSlot(u.local.slotIndex); Assert(*propertyValue == JavascriptOperators::GetProperty(propertyObject, propertyId, requestContext) || (RootObjectBase::Is(propertyObject) && *propertyValue == JavascriptOperators::GetRootProperty(propertyObject, propertyId, requestContext))); if (ReturnOperationInfo) @@ -93,7 +93,7 @@ namespace Js Assert(propertyObject->GetScriptContext() == requestContext); // we never cache a type from another script context Assert(u.accessor.flags & InlineCacheGetterFlag); - RecyclableObject *const function = RecyclableObject::FromVar(u.accessor.object->GetInlineSlot(u.accessor.slotIndex)); + RecyclableObject *const function = RecyclableObject::UnsafeFromVar(u.accessor.object->GetInlineSlot(u.accessor.slotIndex)); *propertyValue = JavascriptOperators::CallGetter(function, instance, requestContext); @@ -114,7 +114,7 @@ namespace Js Assert(propertyObject->GetScriptContext() == requestContext); // we never cache a type from another script context Assert(u.accessor.flags & InlineCacheGetterFlag); - RecyclableObject *const function = RecyclableObject::FromVar(u.accessor.object->GetAuxSlot(u.accessor.slotIndex)); + RecyclableObject *const function = RecyclableObject::UnsafeFromVar(u.accessor.object->GetAuxSlot(u.accessor.slotIndex)); *propertyValue = JavascriptOperators::CallGetter(function, instance, requestContext); @@ -239,7 +239,7 @@ namespace Js Assert(isRoot || object->GetPropertyIndex(propertyId) == DynamicObject::FromVar(object)->GetTypeHandler()->InlineOrAuxSlotIndexToPropertyIndex(u.local.slotIndex, true)); Assert(!isRoot || RootObjectBase::FromVar(object)->GetRootPropertyIndex(propertyId) == DynamicObject::FromVar(object)->GetTypeHandler()->InlineOrAuxSlotIndexToPropertyIndex(u.local.slotIndex, true)); Assert(object->CanStorePropertyValueDirectly(propertyId, isRoot)); - DynamicObject::FromVar(object)->SetInlineSlot(SetSlotArgumentsRoot(propertyId, isRoot, u.local.slotIndex, propertyValue)); + DynamicObject::UnsafeFromVar(object)->SetInlineSlot(SetSlotArgumentsRoot(propertyId, isRoot, u.local.slotIndex, propertyValue)); if (ReturnOperationInfo) { operationInfo->cacheType = CacheType_Local; @@ -255,7 +255,7 @@ namespace Js Assert(isRoot || object->GetPropertyIndex(propertyId) == DynamicObject::FromVar(object)->GetTypeHandler()->InlineOrAuxSlotIndexToPropertyIndex(u.local.slotIndex, false)); Assert(!isRoot || RootObjectBase::FromVar(object)->GetRootPropertyIndex(propertyId) == DynamicObject::FromVar(object)->GetTypeHandler()->InlineOrAuxSlotIndexToPropertyIndex(u.local.slotIndex, false)); Assert(object->CanStorePropertyValueDirectly(propertyId, isRoot)); - DynamicObject::FromVar(object)->SetAuxSlot(SetSlotArgumentsRoot(propertyId, isRoot, u.local.slotIndex, propertyValue)); + DynamicObject::UnsafeFromVar(object)->SetAuxSlot(SetSlotArgumentsRoot(propertyId, isRoot, u.local.slotIndex, propertyValue)); if (ReturnOperationInfo) { operationInfo->cacheType = CacheType_Local; @@ -277,13 +277,13 @@ namespace Js #endif Assert(object->GetScriptContext() == requestContext); // we never cache a type from another script context Assert(typeWithProperty); - Assert(DynamicType::Is(typeWithProperty->GetTypeId())); + Assert(DynamicType::Is(typeWithProperty)); Assert(((DynamicType*)typeWithProperty)->GetIsShared()); Assert(((DynamicType*)typeWithProperty)->GetTypeHandler()->IsPathTypeHandler()); AssertMsg(!((DynamicType*)u.local.typeWithoutProperty)->GetTypeHandler()->GetIsPrototype(), "Why did we cache a property add for a prototype?"); Assert(((DynamicType*)typeWithProperty)->GetTypeHandler()->CanStorePropertyValueDirectly((const DynamicObject*)object, propertyId, isRoot)); - DynamicObject *const dynamicObject = DynamicObject::FromVar(object); + DynamicObject *const dynamicObject = DynamicObject::UnsafeFromVar(object); // If we're adding a property to an inlined slot, we should never need to adjust auxiliary slot array size. Assert(newAuxSlotCapacity == 0); @@ -314,13 +314,13 @@ namespace Js Assert(object->GetScriptContext() == requestContext); // we never cache a type from another script context Assert(typeWithProperty); - Assert(DynamicType::Is(typeWithProperty->GetTypeId())); + Assert(DynamicType::Is(typeWithProperty)); Assert(((DynamicType*)typeWithProperty)->GetIsShared()); Assert(((DynamicType*)typeWithProperty)->GetTypeHandler()->IsPathTypeHandler()); AssertMsg(!((DynamicType*)TypeWithoutAuxSlotTag(u.local.typeWithoutProperty))->GetTypeHandler()->GetIsPrototype(), "Why did we cache a property add for a prototype?"); Assert(((DynamicType*)typeWithProperty)->GetTypeHandler()->CanStorePropertyValueDirectly((const DynamicObject*)object, propertyId, isRoot)); - DynamicObject *const dynamicObject = DynamicObject::FromVar(object); + DynamicObject *const dynamicObject = DynamicObject::UnsafeFromVar(object); if (newAuxSlotCapacity > 0) { @@ -351,7 +351,7 @@ namespace Js Assert(object->GetScriptContext() == requestContext); // we never cache a type from another script context Assert(u.accessor.flags & InlineCacheSetterFlag); - RecyclableObject *const function = RecyclableObject::FromVar(u.accessor.object->GetInlineSlot(u.accessor.slotIndex)); + RecyclableObject *const function = RecyclableObject::UnsafeFromVar(u.accessor.object->GetInlineSlot(u.accessor.slotIndex)); Assert(setterValue == nullptr || setterValue == function); Js::JavascriptOperators::CallSetter(function, object, propertyValue, requestContext); @@ -369,7 +369,7 @@ namespace Js Assert(object->GetScriptContext() == requestContext); // we never cache a type from another script context Assert(u.accessor.flags & InlineCacheSetterFlag); - RecyclableObject *const function = RecyclableObject::FromVar(u.accessor.object->GetAuxSlot(u.accessor.slotIndex)); + RecyclableObject *const function = RecyclableObject::UnsafeFromVar(u.accessor.object->GetAuxSlot(u.accessor.slotIndex)); Assert(setterValue == nullptr || setterValue == function); Js::JavascriptOperators::CallSetter(function, object, propertyValue, requestContext); diff --git a/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandler.inl b/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandler.inl index ed59209dd69..d7d64388fd7 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandler.inl +++ b/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandler.inl @@ -76,23 +76,23 @@ EXDEF2 (BRPROP, BrOnHasProperty, OP_BrOnHasProper DEF2_WMS(BRBS, BrFncNeqApply, JavascriptOperators::OP_BrFncNeqApply) //Not emitted for byte code, keep it here for completeness //DEF2_WMS(BRBS, BrFncEqApply, JavascriptOperators::OP_BrFncEqApply) - DEF3_WMS(CALL_FLAGS_None, CallI, OP_CallI, CallI) - DEF3_WMS(CALL_FLAGS_None, CallIExtended, OP_CallIExtended, CallIExtended) - DEF3_WMS(CALL_FLAGS_None, CallIExtendedFlags, OP_CallIExtendedFlags, CallIExtendedFlags) - DEF3_WMS(CALL_FLAGS_None, CallIFlags, OP_CallIFlags, CallIFlags) - DEF3_WMS(CALL_FLAGS_None, ProfiledCallI, PROFILEDOP(OP_ProfiledCallI, OP_CallI), ProfiledCallI) - DEF3_WMS(CALL_FLAGS_None, ProfiledCallIExtended, PROFILEDOP(OP_ProfiledCallIExtended, OP_CallIExtended), ProfiledCallIExtended) - DEF3_WMS(CALL_FLAGS_None, ProfiledCallIExtendedFlags, PROFILEDOP(OP_ProfiledCallIExtendedFlags, OP_CallIExtendedFlags), ProfiledCallIExtendedFlags) - DEF3_WMS(CALL_FLAGS_None, ProfiledCallIWithICIndex, PROFILEDOP(OP_ProfiledCallIWithICIndex, OP_CallI), ProfiledCallIWithICIndex) - DEF3_WMS(CALL_FLAGS_Value, ProfiledCallIExtendedWithICIndex, PROFILEDOP(OP_ProfiledCallIExtendedWithICIndex, OP_CallIExtended), ProfiledCallIExtendedWithICIndex) - DEF3_WMS(CALL_FLAGS_None, ProfiledCallIExtendedFlagsWithICIndex, PROFILEDOP(OP_ProfiledCallIExtendedFlagsWithICIndex, OP_CallIExtendedFlags), ProfiledCallIExtendedFlagsWithICIndex) - DEF3_WMS(CALL_FLAGS_None, ProfiledCallIFlagsWithICIndex, PROFILEDOP(OP_ProfiledCallIFlags, OP_CallIFlags), ProfiledCallIFlagsWithICIndex) - DEF3_WMS(CALL_FLAGS_None, ProfiledCallIFlags, PROFILEDOP(OP_ProfiledCallIFlags, OP_CallIFlags), ProfiledCallIFlags) - DEF3_WMS(CALL_FLAGS_None, ProfiledReturnTypeCallI, PROFILEDOP(OP_ProfiledReturnTypeCallI, OP_CallI), ProfiledCallI) - DEF3_WMS(CALL_FLAGS_None, ProfiledReturnTypeCallIExtended, PROFILEDOP(OP_ProfiledReturnTypeCallIExtended, OP_CallIExtended), ProfiledCallIExtended) - DEF3_WMS(CALL_FLAGS_None, ProfiledReturnTypeCallIExtendedFlags, PROFILEDOP(OP_ProfiledReturnTypeCallIExtendedFlags, OP_CallIExtendedFlags), ProfiledCallIExtendedFlags) - - DEF3_WMS(CALL_FLAGS_None, ProfiledReturnTypeCallIFlags, PROFILEDOP(OP_ProfiledReturnTypeCallIFlags, OP_CallIFlags), ProfiledCallIFlags) + DEF3_WMS(CALL, CallI, OP_CallI, CallI) + DEF3_WMS(CALL, CallIFlags, OP_CallIFlags, CallIFlags) + DEF3_WMS(CALL, CallIExtended, OP_CallIExtended, CallIExtended) + DEF3_WMS(CALL, CallIExtendedFlags, OP_CallIExtendedFlags, CallIExtendedFlags) + DEF3_WMS(CALL, ProfiledCallI, PROFILEDOP(OP_ProfiledCallI, OP_CallI), ProfiledCallI) + DEF3_WMS(CALL, ProfiledCallIFlags, PROFILEDOP(OP_ProfiledCallIFlags, OP_CallIFlags), ProfiledCallIFlags) + DEF3_WMS(CALL, ProfiledCallIExtended, PROFILEDOP(OP_ProfiledCallIExtended, OP_CallIExtended), ProfiledCallIExtended) + DEF3_WMS(CALL, ProfiledCallIExtendedFlags, PROFILEDOP(OP_ProfiledCallIExtendedFlags, OP_CallIExtendedFlags), ProfiledCallIExtendedFlags) + DEF3_WMS(CALL, ProfiledCallIWithICIndex, PROFILEDOP(OP_ProfiledCallIWithICIndex, OP_CallI), ProfiledCallIWithICIndex) + DEF3_WMS(CALL, ProfiledCallIFlagsWithICIndex, PROFILEDOP(OP_ProfiledCallIFlagsWithICIndex, OP_CallIFlags), ProfiledCallIFlagsWithICIndex) + DEF3_WMS(CALL, ProfiledCallIExtendedWithICIndex, PROFILEDOP(OP_ProfiledCallIExtendedWithICIndex, OP_CallIExtended), ProfiledCallIExtendedWithICIndex) + DEF3_WMS(CALL, ProfiledCallIExtendedFlagsWithICIndex, PROFILEDOP(OP_ProfiledCallIExtendedFlagsWithICIndex, OP_CallIExtendedFlags), ProfiledCallIExtendedFlagsWithICIndex) + DEF3_WMS(CALL, ProfiledReturnTypeCallI, PROFILEDOP(OP_ProfiledReturnTypeCallI, OP_CallI), ProfiledCallI) + DEF3_WMS(CALL, ProfiledReturnTypeCallIFlags, PROFILEDOP(OP_ProfiledReturnTypeCallIFlags, OP_CallIFlags), ProfiledCallIFlags) + DEF3_WMS(CALL, ProfiledReturnTypeCallIExtended, PROFILEDOP(OP_ProfiledReturnTypeCallIExtended, OP_CallIExtended), ProfiledCallIExtended) + DEF3_WMS(CALL, ProfiledReturnTypeCallIExtendedFlags, PROFILEDOP(OP_ProfiledReturnTypeCallIExtendedFlags, OP_CallIExtendedFlags), ProfiledCallIExtendedFlags) + EXDEF2_WMS(A1toA1Mem, Conv_Str, JavascriptConversion::ToString) DEF2_WMS(A1toA1Mem, Conv_Obj, JavascriptOperators::ToObject) EXDEF2_WMS(A1toA1Mem, NewWithObject, JavascriptOperators::ToWithObject) @@ -293,6 +293,7 @@ EXDEF3_WMS(CALL, ProfiledNewScObjectSpread, PROFILEDOP(OP_Pr DEF2_WMS(XXtoA1Mem, LdInfinity, JavascriptOperators::OP_LdInfinity) DEF2_WMS(XXtoA1Mem, LdTrue, JavascriptBoolean::OP_LdTrue) DEF2_WMS(XXtoA1Mem, LdFalse, JavascriptBoolean::OP_LdFalse) + EXDEF2_WMS(XXtoA1Mem, LdChakraLib, JavascriptOperators::OP_LdChakraLib) DEF2_WMS(A1I1toA1Mem, LdThis, JavascriptOperators::OP_GetThisNoFastPath) EXDEF2_WMS(XXtoA1Mem, LdHomeObj, OP_LdHomeObj) EXDEF2_WMS(XXtoA1Mem, LdFuncObj, OP_LdFuncObj) @@ -388,7 +389,9 @@ EXDEF2 (W1, RuntimeReferenceError, JavascriptExcept EXDEF2_WMS(A1toXX, ObjectFreeze, JavascriptOperators::OP_Freeze) EXDEF3_WMS(CUSTOM, ClearAttributes, OP_ClearAttributes, ElementU) DEF3_WMS(CUSTOM, ApplyArgs, OP_ApplyArgs, Reg5) +#ifdef ENABLE_SCRIPT_DEBUGGING EXDEF3_WMS(CUSTOM, EmitTmpRegCount, OP_EmitTmpRegCount, Unsigned1) +#endif EXDEF2 (EMPTY, BeginBodyScope, OP_BeginBodyScope) #endif diff --git a/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandlerAsmJs.inl b/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandlerAsmJs.inl index c0cb346925a..3926ca9773b 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandlerAsmJs.inl +++ b/deps/chakrashim/core/lib/Runtime/Language/InterpreterHandlerAsmJs.inl @@ -15,15 +15,15 @@ EXDEF2 (NOPASMJS , InvalidOpCode, Empty DEF2 ( NOPASMJS , Label , Empty ) DEF2 ( BR_ASM , AsmBr , OP_Br ) - DEF2_WMS( FALLTHROUGH_ASM , LdSlotArr , /* Common case with LdSlot */ ) - DEF3_WMS( GET_ELEM_SLOT_ASM, LdSlot , OP_LdAsmJsSlot , ElementSlot ) - DEF2_WMS( FUNCtoA1Mem , LdUndef , JavascriptOperators::OP_LdUndef ) + DEF2_WMS( FALLTHROUGH_ASM , LdSlotArr , /* Common case with LdSlot */ ) + DEF3_WMS( CUSTOM_ASMJS , LdSlot , OP_LdAsmJsSlot , ElementSlot ) // Function Calls DEF2 ( FALLTHROUGH_ASM , I_StartCall, /* Common case with StartCall */ ) DEF3 ( CUSTOM_ASMJS , StartCall , OP_AsmStartCall , StartCall ) DEF3_WMS( CUSTOM_ASMJS , I_Call , OP_I_AsmCall , AsmCall ) + DEF3_WMS( CUSTOM_ASMJS , ProfiledI_Call, OP_ProfiledI_AsmCall , ProfiledAsmCall ) DEF3_WMS( CUSTOM_ASMJS , Call , OP_AsmCall , AsmCall ) DEF3 ( CUSTOM_ASMJS , CheckHeap , OP_EnsureHeapAttached , Empty ) DEF2_WMS( D1toR1Out , I_ArgOut_Db , OP_I_SetOutAsmDb ) // set double as internal outparam @@ -33,15 +33,11 @@ EXDEF2 (NOPASMJS , InvalidOpCode, Empty DEF2_WMS( F1toR1Out , I_ArgOut_Flt , OP_I_SetOutAsmFlt ) // set float as internal outparam DEF2_WMS( F1toR1Out , ArgOut_Flt , OP_SetOutAsmFlt ) // convert float to var and set as outparam DEF2_WMS( L1toR1Out , I_ArgOut_Long, OP_I_SetOutAsmLong ) // set int64 as internal outparam - DEF2_WMS( D1toD1Mem , I_Conv_VTD , (double) ) DEF2_WMS( R1toD1Mem , Conv_VTD , JavascriptConversion::ToNumber ) // convert var to double - DEF2_WMS( F1toF1Mem , I_Conv_VTF , (float) ) DEF2_WMS( R1toF1Mem , Conv_VTF , JavascriptConversion::ToNumber ) // convert var to float - DEF2_WMS( I1toI1Mem , I_Conv_VTI , (int) ) DEF2_WMS( R1toI1Mem , Conv_VTI , JavascriptMath::ToInt32 ) // convert var to int - DEF3_WMS( CUSTOM_ASMJS , ArgOut_Long , OP_InvalidWasmTypeConversion , Reg1Long1 ) // convert int64 to Var - DEF3_WMS( CUSTOM_ASMJS , Conv_VTL , OP_InvalidWasmTypeConversion , Long1Reg1 ) // convert var to int64 - + DEF3_WMS( CUSTOM_ASMJS , Conv_VTL , (OP_InvalidWasmTypeConversion) , Long1Reg1 ) // convert var to int64 + DEF3_WMS( CUSTOM_ASMJS , ArgOut_Long , (OP_InvalidWasmTypeConversion) , Reg1Long1 ) // convert int64 to Var DEF3_WMS( CUSTOM_ASMJS , LdArr_Func , OP_LdArrFunc , ElementSlot ) DEF3_WMS( CUSTOM_ASMJS , LdArr_WasmFunc,OP_LdArrWasmFunc , ElementSlot ) DEF3_WMS( CUSTOM_ASMJS , CheckSignature,OP_CheckSignature , Reg1IntConst1 ) @@ -95,6 +91,13 @@ EXDEF2 (NOPASMJS , InvalidOpCode, Empty DEF2_WMS( I1toI1Mem , Return_Int , (int) ) DEF2_WMS( L1toL1Mem , Return_Long , (int64) ) +// Wasm Sign Extension operators + DEF2_WMS( I1toI1Mem , I32Extend8_s , (Wasm::WasmMath::SignExtend ) ) + DEF2_WMS( I1toI1Mem , I32Extend16_s, (Wasm::WasmMath::SignExtend) ) + DEF2_WMS( L1toL1Mem , I64Extend8_s , (Wasm::WasmMath::SignExtend ) ) + DEF2_WMS( L1toL1Mem , I64Extend16_s, (Wasm::WasmMath::SignExtend) ) + DEF2_WMS( L1toL1Mem , I64Extend32_s, (Wasm::WasmMath::SignExtend) ) + DEF2_WMS( I1toI1Mem , BeginSwitch_Int, (int) ) DEF2 ( BR_ASM , EndSwitch_Int, OP_Br ) DEF2_WMS( BR_ASM_Mem , Case_Int , AsmJsMath::CmpEq ) @@ -264,6 +267,7 @@ EXDEF2_WMS( D1toL1Ctx , Conv_Check_DTL , JavascriptConversion::F64TOI64 EXDEF2_WMS( D1toL1Ctx , Conv_Check_DTUL , JavascriptConversion::F64TOU64 ) DEF2_WMS( IP_TARG_ASM , AsmJsLoopBodyStart, OP_ProfiledLoopBodyStart ) + DEF2_WMS( IP_TARG_ASM , WasmLoopBodyStart , OP_ProfiledWasmLoopBodyStart ) #if ENABLE_DEBUG_CONFIG_OPTIONS EXDEF3_WMS( CUSTOM_ASMJS, PrintFuncName , OP_WasmPrintFunc , Int2) @@ -278,6 +282,8 @@ EXDEF2_WMS( D1toD1Mem, PrintF64, WAsmJs::Tracing::PrintF64 ) #endif //unary ops +#if defined(ENABLE_SIMD_JS) || defined(ENABLE_WASM_SIMD) + EXDEF2_WMS( SIMD_F4_1toF4_1 , Simd128_Ld_F4 , (AsmJsSIMDValue) ) DEF2_WMS( SIMD_I4_1toI4_1 , Simd128_Ld_I4 , (AsmJsSIMDValue) ) EXDEF2_WMS( SIMD_B4_1toB4_1 , Simd128_Ld_B4 , (AsmJsSIMDValue) ) @@ -296,7 +302,9 @@ EXDEF4_WMS(TEMPLATE_ASMJS , Simd128_StSlot_F4 , OP_StSlotPrimitive EXDEF2_WMS( SIMD_F4_1toF4_1 , Simd128_Return_F4 , (AsmJsSIMDValue) ) DEF2_WMS( SIMD_I4_1toI4_1 , Simd128_Return_I4 , (AsmJsSIMDValue) ) +EXDEF2_WMS(SIMD_D1toD2_1 , Simd128_Splat_D2 , Js::SIMDFloat64x2Operation::OpSplat ) EXDEF2_WMS( SIMD_F1toF4_1 , Simd128_Splat_F4 ,Js::SIMDFloat32x4Operation::OpSplat ) +EXDEF2_WMS( SIMD_L1toI2_1 , Simd128_Splat_I2 ,Js::SIMDInt64x2Operation::OpSplat ) DEF2_WMS( SIMD_I1toI4_1 , Simd128_Splat_I4 ,Js::SIMDInt32x4Operation::OpSplat ) //EXDEF2_WMS( SIMD_D2_1toF4_1 , Simd128_FromFloat64x2_F4 ,SIMDFloat32x4Operation::OpFromFloat64x2 ) @@ -311,6 +319,7 @@ EXDEF2_WMS( SIMD_I4_1toF4_1 , Simd128_FromInt32x4Bits_F4 ,Js::SIMDUtils::FromS EXDEF2_WMS( SIMD_F4_1toF4_1 , Simd128_Abs_F4 ,SIMDFloat32x4Operation::OpAbs ) +EXDEF2_WMS( SIMD_I2_1toI2_1 , Simd128_Neg_I2 ,SIMDInt64x2Operation::OpNeg ) EXDEF2_WMS( SIMD_F4_1toF4_1 , Simd128_Neg_F4 ,SIMDFloat32x4Operation::OpNeg ) DEF2_WMS( SIMD_I4_1toI4_1 , Simd128_Neg_I4 ,SIMDInt32x4Operation::OpNeg ) @@ -323,21 +332,30 @@ EXDEF2_WMS( SIMD_B4_1toB4_1 , Simd128_Not_B4 , Js::SIMDInt32x4Oper EXDEF2_WMS( SIMD_B8_1toB8_1 , Simd128_Not_B8 , Js::SIMDInt32x4Operation::OpNot ) EXDEF2_WMS( SIMD_B16_1toB16_1, Simd128_Not_B16 , Js::SIMDInt32x4Operation::OpNot ) -EXDEF2_WMS( SIMD_B4_1toI1, Simd128_AllTrue_B4 , Js::SIMDBool32x4Operation::OpAllTrue ) -EXDEF2_WMS( SIMD_B8_1toI1, Simd128_AllTrue_B8 , Js::SIMDBool32x4Operation::OpAllTrue ) -EXDEF2_WMS( SIMD_B16_1toI1, Simd128_AllTrue_B16 , Js::SIMDBool32x4Operation::OpAllTrue ) +EXDEF2_WMS( SIMD_B2_1toI1, Simd128_AllTrue_B2 , Js::SIMDBool32x4Operation::OpAllTrue ) +EXDEF2_WMS( SIMD_B4_1toI1, Simd128_AllTrue_B4 , Js::SIMDBool32x4Operation::OpAllTrue ) +EXDEF2_WMS( SIMD_B8_1toI1, Simd128_AllTrue_B8 , Js::SIMDBool32x4Operation::OpAllTrue ) +EXDEF2_WMS( SIMD_B16_1toI1, Simd128_AllTrue_B16 , Js::SIMDBool32x4Operation::OpAllTrue ) -EXDEF2_WMS( SIMD_B4_1toI1, Simd128_AnyTrue_B4 , Js::SIMDBool32x4Operation::OpAnyTrue ) -EXDEF2_WMS( SIMD_B8_1toI1, Simd128_AnyTrue_B8 , Js::SIMDBool32x4Operation::OpAnyTrue ) -EXDEF2_WMS( SIMD_B16_1toI1, Simd128_AnyTrue_B16 , Js::SIMDBool32x4Operation::OpAnyTrue ) +EXDEF2_WMS( SIMD_B2_1toI1, Simd128_AnyTrue_B2 , Js::SIMDBool32x4Operation::OpAnyTrue ) +EXDEF2_WMS( SIMD_B4_1toI1, Simd128_AnyTrue_B4 , Js::SIMDBool32x4Operation::OpAnyTrue ) +EXDEF2_WMS( SIMD_B8_1toI1, Simd128_AnyTrue_B8 , Js::SIMDBool32x4Operation::OpAnyTrue ) +EXDEF2_WMS( SIMD_B16_1toI1, Simd128_AnyTrue_B16 , Js::SIMDBool32x4Operation::OpAnyTrue ) DEF2_WMS(SIMD_I4_1I1toI4_1 , Simd128_ShLtByScalar_I4 , Js::SIMDInt32x4Operation::OpShiftLeftByScalar) +EXDEF2_WMS(SIMD_I2_1I1toI2_1 , Simd128_ShLtByScalar_I2 , Js::SIMDInt64x2Operation::OpShiftLeftByScalar) DEF2_WMS(SIMD_I4_1I1toI4_1 , Simd128_ShRtByScalar_I4 , Js::SIMDInt32x4Operation::OpShiftRightByScalar) +EXDEF2_WMS(SIMD_I2_1I1toI2_1 , Simd128_ShRtByScalar_I2 , Js::SIMDInt64x2Operation::OpShiftRightByScalar) + +// ternary ops +EXDEF2_WMS( SIMD_I4_3toI4_1 , Simd128_BitSelect_I4 , SIMDUtils::SIMD128BitSelect) // binary ops +EXDEF2_WMS( SIMD_I2_2toI2_1 , Simd128_Add_I2 , Js::SIMDInt64x2Operation::OpAdd ) EXDEF2_WMS( SIMD_F4_2toF4_1 , Simd128_Add_F4 , Js::SIMDFloat32x4Operation::OpAdd ) DEF2_WMS( SIMD_I4_2toI4_1 , Simd128_Add_I4 , Js::SIMDInt32x4Operation::OpAdd ) +EXDEF2_WMS( SIMD_I2_2toI2_1 , Simd128_Sub_I2 , Js::SIMDInt64x2Operation::OpSub ) EXDEF2_WMS( SIMD_F4_2toF4_1 , Simd128_Sub_F4 , Js::SIMDFloat32x4Operation::OpSub ) DEF2_WMS( SIMD_I4_2toI4_1 , Simd128_Sub_I4 , Js::SIMDInt32x4Operation::OpSub ) @@ -390,12 +408,10 @@ EXDEF2_WMS( SIMD_B8_1U8_2toU8_1 , Simd128_Select_U8 , Js::SIMDInt32x4Opera EXDEF2_WMS( SIMD_B16_1U16_2toU16_1 , Simd128_Select_U16 , Js::SIMDInt32x4Operation::OpSelect ) // args out, copy value to outParams +EXDEF3_WMS ( CUSTOM_ASMJS , Simd128_ArgOut_F4 , (OP_InvalidWasmTypeConversion) , Reg1Float32x4_1) EXDEF2_WMS ( SIMD_F4_1toR1Mem , Simd128_I_ArgOut_F4 , OP_I_SetOutAsmSimd ) DEF2_WMS ( SIMD_I4_1toR1Mem , Simd128_I_ArgOut_I4 , OP_I_SetOutAsmSimd ) -EXDEF2_WMS ( SIMD_F4_1toF4_1 , Simd128_I_Conv_VTF4 , (AsmJsSIMDValue) ) - DEF2_WMS ( SIMD_I4_1toI4_1 , Simd128_I_Conv_VTI4 , (AsmJsSIMDValue) ) - EXDEF2_WMS ( SIMD_F4_1I4toF4_1 , Simd128_Swizzle_F4 , SIMDUtils::SIMD128InnerShuffle ) EXDEF2_WMS ( SIMD_F4_2I4toF4_1 , Simd128_Shuffle_F4 , SIMDUtils::SIMD128InnerShuffle ) @@ -452,21 +468,24 @@ EXDEF2_WMS ( SIMD_I16_2toI16_1 , Simd128_Xor_I16 , Js::SIMDInt32x4Ope EXDEF2_WMS ( SIMD_I16_1toI16_1 , Simd128_Return_I16 , (AsmJsSIMDValue) ) EXDEF2_WMS ( SIMD_I16_1toR1Mem , Simd128_I_ArgOut_I16 , OP_I_SetOutAsmSimd ) -EXDEF2_WMS ( SIMD_I16_1toI16_1 , Simd128_I_Conv_VTI16 , (AsmJsSIMDValue) ) //Lane Access EXDEF2_WMS ( SIMD_I16_1I1toI1 , Simd128_ExtractLane_I16 , SIMDUtils::SIMD128InnerExtractLaneI16 ) EXDEF2_WMS ( SIMD_I16_1I2toI16_1 , Simd128_ReplaceLane_I16 , SIMDUtils::SIMD128InnerReplaceLaneI16 ) EXDEF2_WMS ( SIMD_I4_1I1toI1 , Simd128_ExtractLane_I4 , SIMDUtils::SIMD128InnerExtractLaneI4 ) +EXDEF2_WMS ( SIMD_I2_1I1toL1 , Simd128_ExtractLane_I2 , SIMDUtils::SIMD128InnerExtractLaneI2 ) +EXDEF2_WMS ( SIMD_D2_1I1toD1 , Simd128_ExtractLane_D2 , SIMDUtils::SIMD128InnerExtractLaneD2 ) +EXDEF2_WMS ( SIMD_D2_1I1D1toD2_1 , Simd128_ReplaceLane_D2 , SIMDUtils::SIMD128InnerReplaceLaneD2 ) EXDEF2_WMS ( SIMD_F4_1I1toF1 , Simd128_ExtractLane_F4 , SIMDUtils::SIMD128InnerExtractLaneF4 ) EXDEF2_WMS ( SIMD_I8_1I1toI1 , Simd128_ExtractLane_I8 , SIMDUtils::SIMD128InnerExtractLaneI8 ) EXDEF2_WMS ( SIMD_U4_1I1toI1 , Simd128_ExtractLane_U4 , SIMDUtils::SIMD128InnerExtractLaneI4 ) EXDEF2_WMS ( SIMD_U8_1I1toI1 , Simd128_ExtractLane_U8 , SIMDUtils::SIMD128InnerExtractLaneI8 ) EXDEF2_WMS ( SIMD_U16_1I1toI1 , Simd128_ExtractLane_U16 , SIMDUtils::SIMD128InnerExtractLaneI16 ) -EXDEF2_WMS ( SIMD_B4_1I1toI1 , Simd128_ExtractLane_B4 , SIMDUtils::SIMD128InnerExtractLaneI4 ) -EXDEF2_WMS ( SIMD_B8_1I1toI1 , Simd128_ExtractLane_B8 , SIMDUtils::SIMD128InnerExtractLaneI8 ) -EXDEF2_WMS ( SIMD_B16_1I1toI1 , Simd128_ExtractLane_B16 , SIMDUtils::SIMD128InnerExtractLaneI16 ) +EXDEF2_WMS ( SIMD_B4_1I1toI1 , Simd128_ExtractLane_B4 , SIMDUtils::SIMD128InnerExtractLaneB4 ) +EXDEF2_WMS ( SIMD_B8_1I1toI1 , Simd128_ExtractLane_B8 , SIMDUtils::SIMD128InnerExtractLaneB8 ) +EXDEF2_WMS ( SIMD_B16_1I1toI1 , Simd128_ExtractLane_B16 , SIMDUtils::SIMD128InnerExtractLaneB16 ) +EXDEF2_WMS ( SIMD_I2_1I1L1toI2_1 , Simd128_ReplaceLane_I2 , SIMDUtils::SIMD128InnerReplaceLaneI2 ) EXDEF2_WMS ( SIMD_I4_1I2toI4_1 , Simd128_ReplaceLane_I4 , SIMDUtils::SIMD128InnerReplaceLaneI4 ) EXDEF2_WMS ( SIMD_F4_1I1F1toF4_1 , Simd128_ReplaceLane_F4 , SIMDUtils::SIMD128InnerReplaceLaneF4 ) EXDEF2_WMS ( SIMD_I8_1I2toI8_1 , Simd128_ReplaceLane_I8 , SIMDUtils::SIMD128InnerReplaceLaneI8 ) @@ -514,14 +533,6 @@ EXDEF2_WMS ( SIMD_B4_1toR1Mem , Simd128_I_ArgOut_B4 , OP_I_SetOutAsmSimd EXDEF2_WMS ( SIMD_B8_1toR1Mem , Simd128_I_ArgOut_B8 , OP_I_SetOutAsmSimd ) EXDEF2_WMS ( SIMD_B16_1toR1Mem , Simd128_I_ArgOut_B16 , OP_I_SetOutAsmSimd ) -EXDEF2_WMS ( SIMD_I8_1toI8_1 , Simd128_I_Conv_VTI8 , (AsmJsSIMDValue) ) -EXDEF2_WMS ( SIMD_U4_1toU4_1 , Simd128_I_Conv_VTU4 , (AsmJsSIMDValue) ) -EXDEF2_WMS ( SIMD_U8_1toU8_1 , Simd128_I_Conv_VTU8 , (AsmJsSIMDValue) ) -EXDEF2_WMS ( SIMD_U16_1toU16_1 , Simd128_I_Conv_VTU16 , (AsmJsSIMDValue) ) -EXDEF2_WMS ( SIMD_B4_1toB4_1 , Simd128_I_Conv_VTB4 , (AsmJsSIMDValue) ) -EXDEF2_WMS ( SIMD_B8_1toB8_1 , Simd128_I_Conv_VTB8 , (AsmJsSIMDValue) ) -EXDEF2_WMS ( SIMD_B16_1toB16_1 , Simd128_I_Conv_VTB16 , (AsmJsSIMDValue) ) - EXDEF2_WMS ( SIMD_I8_1toI8_1 , Simd128_Return_I8 , (AsmJsSIMDValue) ) EXDEF2_WMS ( SIMD_U4_1toU4_1 , Simd128_Return_U4 , (AsmJsSIMDValue) ) EXDEF2_WMS ( SIMD_U8_1toU8_1 , Simd128_Return_U8 , (AsmJsSIMDValue) ) @@ -590,6 +601,7 @@ EXDEF2_WMS(SIMD_I16_1I1toI16_1 , Simd128_ShRtByScalar_I16 , Js::SIMDInt8x16Op EXDEF2_WMS(SIMD_U4_1I1toU4_1 , Simd128_ShLtByScalar_U4 , Js::SIMDInt32x4Operation::OpShiftLeftByScalar ) EXDEF2_WMS(SIMD_U4_1I1toU4_1 , Simd128_ShRtByScalar_U4 , Js::SIMDUint32x4Operation::OpShiftRightByScalar ) +EXDEF2_WMS(SIMD_I2_1I1toI2_1 , Simd128_ShRtByScalar_U2 , Js::SIMDInt64x2Operation::OpShiftRightByScalarU) EXDEF2_WMS(SIMD_U8_1I1toU8_1 , Simd128_ShLtByScalar_U8 , Js::SIMDInt16x8Operation::OpShiftLeftByScalar ) EXDEF2_WMS(SIMD_U8_1I1toU8_1 , Simd128_ShRtByScalar_U8 , Js::SIMDUint16x8Operation::OpShiftRightByScalar ) @@ -636,6 +648,7 @@ EXDEF2_WMS( SIMD_U8_1toI16_1 , Simd128_FromUint16x8Bits_I16 , Js::SIMDUtils::F EXDEF2_WMS( SIMD_U16_1toI16_1, Simd128_FromUint8x16Bits_I16 , Js::SIMDUtils::FromSimdBits ) EXDEF3_WMS( CUSTOM_ASMJS , Simd128_FromFloat32x4_U4 , OP_SimdUint32x4FromFloat32x4 , Uint32x4_1Float32x4_1) +EXDEF3_WMS( CUSTOM_ASMJS , Simd128_LdC , OP_WasmSimdConst , Float32x4_IntConst4) EXDEF2_WMS( SIMD_F4_1toU4_1 , Simd128_FromFloat32x4Bits_U4 , Js::SIMDUtils::FromSimdBits ) EXDEF2_WMS( SIMD_I4_1toU4_1 , Simd128_FromInt32x4Bits_U4 , Js::SIMDUtils::FromSimdBits ) EXDEF2_WMS( SIMD_I8_1toU4_1 , Simd128_FromInt16x8Bits_U4 , Js::SIMDUtils::FromSimdBits ) @@ -696,22 +709,10 @@ EXDEF2_WMS( SIMD_U16_2toB16_1 , Simd128_Gt_U16 , Js::SIMDUint8x16Op EXDEF2_WMS( SIMD_U4_1toU4_1 , Simd128_Neg_U4 , SIMDInt32x4Operation::OpNeg ) EXDEF2_WMS( SIMD_U8_1toU8_1 , Simd128_Neg_U8 , SIMDInt16x8Operation::OpNeg ) EXDEF2_WMS( SIMD_U16_1toU16_1 , Simd128_Neg_U16 , SIMDInt8x16Operation::OpNeg ) +EXDEF3_WMS( CUSTOM_ASMJS , Simd128_Shuffle_V8X16 , OP_SimdShuffleV8X16 , AsmShuffle) -#if 0 -EXDEF2_WMS(SIMD_D2toD2_1, Simd128_DoublesToD2, SIMDFloat64x2Operation::OpFloat64x2) -EXDEF4_WMS(TEMPLATE_ASMJS, Simd128_LdSlot_D2, OP_LdSlotPrimitive, ElementSlot, AsmJsSIMDValue) -EXDEF4_WMS(TEMPLATE_ASMJS, Simd128_StSlot_D2, OP_StSlotPrimitive, ElementSlot, AsmJsSIMDValue) -EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Return_D2, (AsmJsSIMDValue)) -EXDEF2_WMS(SIMD_D1toD2_1, Simd128_Splat_D2, Js::SIMDFloat64x2Operation::OpSplat) -EXDEF2_WMS(SIMD_F4_1toD2_1, Simd128_FromFloat32x4_D2, SIMDFloat64x2Operation::OpFromFloat32x4) -EXDEF2_WMS(SIMD_F4_1toD2_1, Simd128_FromFloat32x4Bits_D2, Js::FromSimdBits) -EXDEF2_WMS(SIMD_I4_1toD2_1, Simd128_FromInt32x4_D2, SIMDFloat64x2Operation::OpFromInt32x4) -EXDEF2_WMS(SIMD_I4_1toD2_1, Simd128_FromInt32x4Bits_D2, Js::FromSimdBits) EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Abs_D2, SIMDFloat64x2Operation::OpAbs) EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Neg_D2, SIMDFloat64x2Operation::OpNeg) -EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Rcp_D2, SIMDFloat64x2Operation::OpReciprocal) -EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_RcpSqrt_D2, SIMDFloat64x2Operation::OpReciprocalSqrt) -EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Sqrt_D2, SIMDFloat64x2Operation::OpSqrt) EXDEF2_WMS(SIMD_D2_2toD2_1, Simd128_Add_D2, Js::SIMDFloat64x2Operation::OpAdd) EXDEF2_WMS(SIMD_D2_2toD2_1, Simd128_Sub_D2, Js::SIMDFloat64x2Operation::OpSub) EXDEF2_WMS(SIMD_D2_2toD2_1, Simd128_Mul_D2, Js::SIMDFloat64x2Operation::OpMul) @@ -724,11 +725,27 @@ EXDEF2_WMS(SIMD_D2_2toD2_1, Simd128_Eq_D2, Js::SIMDFloat64x2Operation::OpEqual) EXDEF2_WMS(SIMD_D2_2toD2_1, Simd128_Neq_D2, Js::SIMDFloat64x2Operation::OpNotEqual) EXDEF2_WMS(SIMD_D2_2toD2_1, Simd128_GtEq_D2, Js::SIMDFloat64x2Operation::OpGreaterThanOrEqual) EXDEF2_WMS(SIMD_D2_2toD2_1, Simd128_Gt_D2, Js::SIMDFloat64x2Operation::OpGreaterThan) +EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Sqrt_D2, SIMDFloat64x2Operation::OpSqrt) +EXDEF2_WMS(SIMD_I2_1toI2_P, Simd128_FromInt64x2_D2, SIMDFloat64x2Operation::OpConv) +EXDEF2_WMS(SIMD_I2_1toI2_P, Simd128_FromUint64x2_D2, SIMDFloat64x2Operation::OpConv) +EXDEF2_WMS(SIMD_I2_1toI2_P, Simd128_FromFloat64x2_I2, SIMDInt64x2Operation::OpTrunc) +EXDEF2_WMS(SIMD_I2_1toI2_P, Simd128_FromFloat64x2_U2, SIMDInt64x2Operation::OpTrunc) + +#if 0 +EXDEF2_WMS(SIMD_D2toD2_1, Simd128_DoublesToD2, SIMDFloat64x2Operation::OpFloat64x2) +EXDEF4_WMS(TEMPLATE_ASMJS, Simd128_LdSlot_D2, OP_LdSlotPrimitive, ElementSlot, AsmJsSIMDValue) +EXDEF4_WMS(TEMPLATE_ASMJS, Simd128_StSlot_D2, OP_StSlotPrimitive, ElementSlot, AsmJsSIMDValue) +EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Return_D2, (AsmJsSIMDValue)) +EXDEF2_WMS(SIMD_F4_1toD2_1, Simd128_FromFloat32x4_D2, SIMDFloat64x2Operation::OpFromFloat32x4) +EXDEF2_WMS(SIMD_F4_1toD2_1, Simd128_FromFloat32x4Bits_D2, Js::FromSimdBits) +EXDEF2_WMS(SIMD_I4_1toD2_1, Simd128_FromInt32x4_D2, SIMDFloat64x2Operation::OpFromInt32x4) +EXDEF2_WMS(SIMD_I4_1toD2_1, Simd128_FromInt32x4Bits_D2, Js::FromSimdBits) +EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Rcp_D2, SIMDFloat64x2Operation::OpReciprocal) +EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_RcpSqrt_D2, SIMDFloat64x2Operation::OpReciprocalSqrt) EXDEF2_WMS(SIMD_I4_1D2_2toD2_1, Simd128_Select_D2, Js::SIMDFloat64x2Operation::OpSelect) EXDEF2_WMS(SIMD_D2_3toD2_1, Simd128_Clamp_D2, Js::SIMDFloat64x2Operation::OpClamp) EXDEF2_WMS(SIMD_D2_1toI1, Simd128_LdSignMask_D2, Js::SIMDFloat64x2Operation::OpGetSignMask) EXDEF2_WMS(SIMD_D2_1toR1Mem, Simd128_I_ArgOut_D2, OP_I_SetOutAsmSimd) -EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_I_Conv_VTD2, (AsmJsSIMDValue)) EXDEF2_WMS(SIMD_D2_1toD2_1, Simd128_Ld_D2, (AsmJsSIMDValue) EXDEF2_WMS(SIMD_D2_1I2toD2_1, Simd128_Swizzle_D2, SIMD128InnerShuffle) EXDE2_WMS(SIMD_D2_2I2toD2_1, Simd128_Shuffle_D2, SIMD128InnerShuffle) @@ -737,5 +754,6 @@ EXDEF3_WMS(CUSTOM_ASMJS, Simd128_LdArr_D2, OP_SimdLdArrGeneric, AsmSimdTypedArr) EXDEF3_WMS(CUSTOM_ASMJS, Simd128_LdArrConst_D2, OP_SimdLdArrConstIndex, AsmSimdTypedArr) EXDEF3_WMS(CUSTOM_ASMJS, Simd128_StArrConst_D2, OP_SimdStArrConstIndex, AsmSimdTypedArr) #endif // 0 +#endif #endif diff --git a/deps/chakrashim/core/lib/Runtime/Language/InterpreterProcessOpCodeAsmJs.h b/deps/chakrashim/core/lib/Runtime/Language/InterpreterProcessOpCodeAsmJs.h index dd4a7942b34..d239a33ba7c 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InterpreterProcessOpCodeAsmJs.h +++ b/deps/chakrashim/core/lib/Runtime/Language/InterpreterProcessOpCodeAsmJs.h @@ -31,19 +31,6 @@ break; \ } - -#define PROCESS_GET_ELEM_SLOT_ASM_COMMON(name, func, layout, suffix) \ - case OpCodeAsmJs::name: \ - { \ - PROCESS_READ_LAYOUT_ASMJS(name, layout, suffix); \ - SetNonVarReg(playout->Value, \ - func(GetNonVarReg(playout->Instance), playout)); \ - break; \ - } - -#define PROCESS_GET_ELEM_SLOT_ASM(name, func, layout) PROCESS_GET_ELEM_SLOT_ASM_COMMON(name, func, layout,) - - #define PROCESS_FUNCtoA1Mem_COMMON(name, func, suffix) \ case OpCodeAsmJs::name: \ { \ @@ -55,7 +42,6 @@ #define PROCESS_FUNCtoA1Mem(name, func) PROCESS_FUNCtoA1Mem_COMMON(name, func,) - #define PROCESS_CUSTOM_ASMJS_COMMON(name, func, layout, suffix) \ case OpCodeAsmJs::name: \ { \ @@ -387,7 +373,7 @@ if (switchProfileMode) \ { \ PROCESS_READ_LAYOUT_ASMJS(name, Double1Reg1, suffix); \ SetRegRawDouble(playout->D0, \ - func(GetReg(playout->R1),scriptContext)); \ + func(GetRegRawPtr(playout->R1),scriptContext)); \ break; \ } @@ -398,7 +384,7 @@ if (switchProfileMode) \ { \ PROCESS_READ_LAYOUT_ASMJS(name, Float1Reg1, suffix); \ SetRegRawFloat(playout->F0, \ - (float)func(GetReg(playout->R1), scriptContext)); \ + (float)func(GetRegRawPtr(playout->R1), scriptContext)); \ break; \ } @@ -410,7 +396,7 @@ if (switchProfileMode) \ { \ PROCESS_READ_LAYOUT_ASMJS(name, Int1Reg1, suffix); \ SetRegRawInt(playout->I0, \ - func(GetReg(playout->R1),scriptContext)); \ + func(GetRegRawPtr(playout->R1),scriptContext)); \ break; \ } @@ -421,7 +407,7 @@ if (switchProfileMode) \ { \ PROCESS_READ_LAYOUT_ASMJS(name, Long1Reg1, suffix); \ SetRegRawInt64(playout->L0, \ - func(GetReg(playout->R1),scriptContext)); \ + func(GetRegRawPtr(playout->R1),scriptContext)); \ break; \ } @@ -832,6 +818,84 @@ if (switchProfileMode) \ } #define PROCESS_SIMD_I1toU16_1(name, func) PROCESS_SIMD_I1toU16_1_COMMON(name, func,) +#define PROCESS_SIMD_B2_1toI1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Int1Bool64x2_1, suffix); \ + SetRegRawInt(playout->I0, func(GetRegRawSimd(playout->I2_1))); \ + break; \ + } +#define PROCESS_SIMD_B2_1toI1(name, func) PROCESS_SIMD_B2_1toI1_COMMON(name, func,) + +#define PROCESS_SIMD_L1toI2_1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Int64x2_1Long1, suffix); \ + SetRegRawSimd(playout->I2_0, func(GetRegRawInt64(playout->L1))); \ + break; \ + } +#define PROCESS_SIMD_L1toI2_1(name, func) PROCESS_SIMD_L1toI2_1_COMMON(name, func,) + +#define PROCESS_SIMD_I2_1I1toL1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Long1Int64x2_1Int1, suffix); \ + SetRegRawInt64(playout->L0, func(GetRegRawSimd(playout->I2_1), GetRegRawInt(playout->I2))); \ + break; \ + } +#define PROCESS_SIMD_I2_1I1toL1(name, func) PROCESS_SIMD_I2_1I1toL1_COMMON(name, func,) + +#define PROCESS_SIMD_I2_1I1L1toI2_1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Int64x2_2_Int1_Long1, suffix); \ + SetRegRawSimd(playout->I2_0, func(GetRegRawSimd(playout->I2_1), GetRegRawInt(playout->I2), GetRegRawInt64(playout->L3))); \ + break; \ + } +#define PROCESS_SIMD_I2_1I1L1toI2_1(name, func) PROCESS_SIMD_I2_1I1L1toI2_1_COMMON(name, func,) + +#define PROCESS_SIMD_I2_2toI2_1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Int64x2_3, suffix); \ + SetRegRawSimd(playout->I2_0, func(GetRegRawSimd(playout->I2_1), GetRegRawSimd(playout->I2_2))); \ + break; \ + } +#define PROCESS_SIMD_I2_2toI2_1(name, func) PROCESS_SIMD_I2_2toI2_1_COMMON(name, func,) + +#define PROCESS_SIMD_I2_1toI2_1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Int64x2_2, suffix); \ + SetRegRawSimd(playout->I2_0, func(GetRegRawSimd(playout->I2_1))); \ + break; \ + } +#define PROCESS_SIMD_I2_1toI2_1 (name, func) PROCESS_SIMD_I2_1toI2_1_COMMON(name, func,) + +#define PROCESS_SIMD_I2_1toI2_P_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Int64x2_2, suffix); \ + SIMDValue result {0}; \ + SIMDValue src = GetRegRawSimd(playout->I2_1); \ + func(&result, &src); \ + SetRegRawSimd(playout->I2_0, result); \ + break; \ + } +#define PROCESS_SIMD_I2_1toI2_P(name, func) PROCESS_SIMD_I2_1toI2_P_COMMON(name, func,) + +#define PROCESS_SIMD_I2_1I1toI2_1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Int64x2_2Int1, suffix); \ + SIMDValue result {0}; \ + SIMDValue src = GetRegRawSimd(playout->I2_1); \ + func(&result, &src, GetRegRawInt(playout->I2)); \ + SetRegRawSimd(playout->I2_0, result); \ + break; \ + } +#define PROCESS_SIMD_I2_1I1toI2_1(name, func) PROCESS_SIMD_I2_1I1toI2_1_COMMON(name, func,) + #define PROCESS_SIMD_F1toF4_1_COMMON(name, func, suffix) \ case OpCodeAsmJs::name: \ { \ @@ -1425,6 +1489,15 @@ if (switchProfileMode) \ } #define PROCESS_SIMD_B16_1toI1(name, func, suffix) PROCESS_SIMD_B16_1toI1_COMMON(name, func, suffix) +#define PROCESS_SIMD_D2_1I1D1toD2_1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Float64x2_2Int1Double1, suffix); \ + SetRegRawSimd(playout->D2_0, func(GetRegRawSimd(playout->D2_1), GetRegRawInt(playout->I2), GetRegRawDouble(playout->D3))); \ + break; \ + } +#define PROCESS_SIMD_D2_1I1D1toD2_1_1(name, func) PROCESS_SIMD_D2_1I1D1toD2_1_COMMON(name, func, ) + #define PROCESS_SIMD_F4_1toF4_1_COMMON(name, func, suffix) \ case OpCodeAsmJs::name: \ { \ @@ -1544,6 +1617,15 @@ if (switchProfileMode) \ } #define PROCESS_SIMD_F4_2toB4_1(name, func) PROCESS_SIMD_F4_2toB4_1_COMMON(name, func,) +#define PROCESS_SIMD_I4_3toI4_1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Int32x4_4, suffix); \ + SetRegRawSimd(playout->I4_0, func(GetRegRawSimd(playout->I4_1), GetRegRawSimd(playout->I4_2), GetRegRawSimd(playout->I4_3))); \ + break; \ + } +#define PROCESS_SIMD_I4_3toI4_1(name, func) PROCESS_SIMD_I4_3toI4_1_COMMON(name, func,) + #define PROCESS_SIMD_I4_2toI4_1_COMMON(name, func, suffix) \ case OpCodeAsmJs::name: \ { \ @@ -2188,6 +2270,15 @@ if (switchProfileMode) \ } #define PROCESS_SIMD_I16_1I1toI16_1(name, func) PROCESS_SIMD_I16_1I1toI16_1_COMMON(name, func,) +#define PROCESS_SIMD_D2_1I1toD1_COMMON(name, func, suffix) \ + case OpCodeAsmJs::name: \ + { \ + PROCESS_READ_LAYOUT_ASMJS(name, Double1Float64x2_1Int1, suffix); \ + SetRegRawDouble(playout->D0, func(GetRegRawSimd(playout->D2_1), GetRegRawInt(playout->I2))); \ + break; \ + } +#define PROCESS_SIMD_D2_1I1toD1(name, func) PROCESS_SIMD_D2_1I1toD1_COMMON(name, func, ) + #define PROCESS_SIMD_U4_1I1toU4_1_COMMON(name, func, suffix) \ case OpCodeAsmJs::name: \ { \ diff --git a/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.cpp b/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.cpp index 2ddc0b49a45..1ea83e41a90 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.cpp @@ -14,7 +14,7 @@ #include "Language/InterpreterStackFrame.h" #include "Library/JavascriptGeneratorFunction.h" #include "Library/ForInObjectEnumerator.h" - +#include "../../WasmReader/WasmParseTree.h" ///---------------------------------------------------------------------------- /// /// macros PROCESS_INtoOUT @@ -128,24 +128,10 @@ #define PROCESS_CALL(name, func, layout) PROCESS_CALL_COMMON(name, func, layout,) -#define PROCESS_CALL_FLAGS_COMMON(name, func, layout, flags, suffix) \ - case OpCode::name: \ - { \ - PROCESS_READ_LAYOUT(name, layout, suffix); \ - func(playout, flags); \ - break; \ - } - -#define PROCESS_CALL_FLAGS(name, func, layout, regslot) PROCESS_CALL_FLAGS_COMMON(name, func, layout, regslot,) -#define PROCESS_CALL_FLAGS_None_COMMON(name, func, layout, suffix) PROCESS_CALL_FLAGS_COMMON(name, func, layout, CallFlags_None, suffix) -#define PROCESS_CALL_FLAGS_None(name, func, layout) PROCESS_CALL_FLAGS_COMMON(name, func, layout, CallFlags_None,) +#define PROCESS_CALL_FLAGS_None_COMMON(name, func, layout, suffix) PROCESS_CALL_COMMON(name, func, layout, suffix) +#define PROCESS_CALL_FLAGS_Value_COMMON(name, func, layout, suffix) PROCESS_CALL_COMMON(name, func, layout, suffix) -#define PROCESS_CALL_FLAGS_Value_COMMON(name, func, layout, suffix) PROCESS_CALL_FLAGS_COMMON(name, func, layout, CallFlags_Value, suffix) -#define PROCESS_CALL_FLAGS_Value(name, func, layout) PROCESS_CALL_FLAGS_COMMON(name, func, layout, CallFlags_Value,) - -#define PROCESS_CALL_FLAGS_CallEval_COMMON(name, func, layout, suffix) PROCESS_CALL_FLAGS_COMMON(name, func, layout, CallFlags_ExtraArg, suffix) -#define PROCESS_CALL_FLAGS_CallEval(name, func, layout) PROCESS_CALL_FLAGS_COMMON(name, func, layout, CallFlags_ExtraArg,) #define PROCESS_A1toXX_ALLOW_STACK_COMMON(name, func, suffix) \ case OpCode::name: \ @@ -1116,7 +1102,7 @@ namespace Js } InterpreterStackFrame * - InterpreterStackFrame::Setup::InitializeAllocation(__in_ecount(varAllocCount) Var * allocation, bool initParams, bool profileParams, Var loopHeaderArray, DWORD_PTR stackAddr + InterpreterStackFrame::Setup::InitializeAllocation(__in_ecount(varAllocCount) Var * allocation, bool initParams, bool profileParams, LoopHeader* loopHeaderArray, DWORD_PTR stackAddr #if DBG , Var invalidStackVar #endif @@ -1167,6 +1153,14 @@ namespace Js newInstance->localClosure = nullptr; newInstance->paramClosure = nullptr; newInstance->innerScopeArray = nullptr; + newInstance->m_asmJsBuffer = nullptr; +#ifdef ENABLE_WASM + newInstance->m_wasmMemory = nullptr; +#endif + Var* outparamsEnd = newInstance->m_outParams + this->executeFunction->GetOutParamMaxDepth(); +#if DBG + newInstance->m_outParamsEnd = outparamsEnd; +#endif bool doInterruptProbe = newInstance->scriptContext->GetThreadContext()->DoInterruptProbe(this->executeFunction); #if ENABLE_NATIVE_CODEGEN @@ -1221,7 +1215,7 @@ namespace Js // the savedLoopImplicitCallFlags is allocated at the end of the out param array newInstance->savedLoopImplicitCallFlags = nullptr; #endif - char * nextAllocBytes = (char *)(newInstance->m_outParams + this->executeFunction->GetOutParamMaxDepth()); + char * nextAllocBytes = (char *)(outparamsEnd); // If we bailed out, we will use the JIT frame's for..in enumerators if (bailedOut || this->executeFunction->GetForInLoopDepth() == 0) @@ -1556,13 +1550,6 @@ namespace Js return asmInfo->GetReturnType().which(); } - DWORD InterpreterStackFrame::GetAsmJsReturnValueOffset(AsmJsCallStackLayout* stack) - { - JavascriptFunction * func = stack->functionObject; - ScriptContext* scriptContext = func->GetScriptContext(); - return (DWORD)scriptContext + ScriptContext::GetAsmJsReturnValueOffset(); - } - #ifdef ASMJS_PLAT /* AsmInterpreterThunk @@ -1585,81 +1572,20 @@ namespace Js __declspec(naked) void InterpreterStackFrame::InterpreterAsmThunk(AsmJsCallStackLayout* layout) { - enum { - IsFloat = 1 << AsmJsRetType::Float, - IsDouble = 1 << AsmJsRetType::Double, - IsInt64 = 1 << AsmJsRetType::Int64, - IsSimd = - 1 << AsmJsRetType::Int32x4 | - 1 << AsmJsRetType::Bool32x4 | - 1 << AsmJsRetType::Bool16x8 | - 1 << AsmJsRetType::Bool8x16 | - 1 << AsmJsRetType::Float32x4 | - 1 << AsmJsRetType::Float64x2 | - 1 << AsmJsRetType::Int16x8 | - 1 << AsmJsRetType::Int8x16 | - 1 << AsmJsRetType::Uint32x4 | - 1 << AsmJsRetType::Uint16x8 | - 1 << AsmJsRetType::Uint8x16, - CannotUseEax = IsFloat | IsDouble | IsInt64 | IsSimd - }; - - //Prolog __asm { //Prologue push ebp; mov ebp, esp; - push layout; // push stack layout - call InterpreterStackFrame::AsmJsInterpreter; - push eax; // push the return value into the stack - push layout; // push arg1 - call InterpreterStackFrame::GetDynamicRetType; - // setup return type mask from enum. e.g.: 3 => 0x8 - mov ecx, eax; - mov eax, 1 - shl eax, cl; - and eax, CannotUseEax; // Keep only types that need to read from memory - jz end; // if nothing is left, that means we simply use eax as return value - - push eax; // save return type mask - push layout; // push arg1 - call InterpreterStackFrame::GetAsmJsReturnValueOffset; - pop ecx; // restore return type mask - - and ecx, ~IsFloat; // Remove float bit - jz ToXmmWord; // if nothing is left, that means the return type is float - and ecx, ~IsDouble; // Remove double bit - jz ToXmmDWord; // if nothing is left, that means the return type is double - and ecx, ~IsInt64; // Remove int64 bit - jz readHighWord; // if nothing is left, that means the return type is int64 - jmp doSimd; // Otherwise, the return type is simd - ToXmmWord: - // float - movss xmm0, [eax]; - jmp end; - ToXmmDWord: - // double - movsd xmm0, [eax]; - jmp end; - readHighWord: - // save high int64 bits into ecx - mov edx, [eax + 4]; - jmp end; - doSimd: - // simd value - movups xmm0, [eax]; - end: - push edx; // save possible int64 return value + + // Allocate space to put the return value + sub esp, 16; + and esp, -16; + + push esp; push layout; - call InterpreterStackFrame::GetAsmJsArgSize; - mov ecx, eax; - pop edx; // restore possible int64 return value - pop eax; // pop the return value from AsmJsInterpreter to eax + call InterpreterStackFrame::AsmJsInterpreter; - // Epilog, callee cleanup - mov esp, ebp; - pop ebp; // we need to move stack around in order to do callee cleanup // unfortunately, we don't really have enough registers to do this cleanly // @@ -1674,25 +1600,36 @@ namespace Js // 0x14 DynamicInterpreterThunk return address // 0x10 DynamicInterpreterThunk push ebp // 0x0C InterpreterAsmThunk return address <- stack pointer + // Read return value into possible registers + movups xmm0, [esp]; + mov edx, [esp + 4]; + mov eax, [esp]; + + mov ecx, layout; + // Epilog, callee cleanup + mov esp, ebp; + pop ebp; push eax; // save eax push edx; // save edx // we have to do +0x8 on all stack addresses because we saved 2 registers + push ecx; // ebp has been restored, we can't use parameters anymore + call InterpreterStackFrame::GetAsmJsArgSize; + mov ecx, eax; - lea eax, [esp + ecx * 1 + (0x8 + 0x8)]; // eax will be our stack destination. we need to move backwards because memory might overlap - mov edx, [esp + (0xC + 0x8)]; + lea eax, [esp + ecx * 1 + 0x8 + 0x8]; // eax will be our stack destination + mov edx, [esp + 0xC + 0x8]; mov [eax], edx; // move the dynamic interpreter thunk return location - sub eax, 0x4; - mov edx, [esp + (0x8 + 0x8)]; - mov [eax], edx; // move the dynamic interpreter thunk "push ebp" location + mov edx, [esp + 0x8 + 0x8]; + mov [eax - 0x4], edx; // move the dynamic interpreter thunk "push ebp" location // skip "push functionObject" - sub eax, 0x4; - mov edx, [esp + (0x0 + 0x8)]; - mov [eax], edx; // move the return location + mov edx, [esp + 0x0 + 0x8]; + mov [eax - 0x8], edx; // move the return location pop edx; // restore possible int64 return value pop eax; // restore return value add esp, ecx; // cleanup arguments + ret; } } @@ -1777,15 +1714,19 @@ namespace Js } #endif +#if !defined(_M_ARM64) Var InterpreterStackFrame::StaticInterpreterThunk(RecyclableObject* function, CallInfo callInfo, ...) { return InterpreterThunk((JavascriptCallStackLayout*)&function); } +#else + // Language\arm64\arm64_Thunks.asm +#endif #pragma optimize("", on) Var InterpreterStackFrame::InterpreterThunk(JavascriptCallStackLayout* layout) { - Js::ScriptFunction * function = Js::ScriptFunction::FromVar(layout->functionObject); + Js::ScriptFunction * function = Js::ScriptFunction::UnsafeFromVar(layout->functionObject); Js::ArgumentReader args(&layout->callInfo, layout->args); void* localReturnAddress = _ReturnAddress(); void* localAddressOfReturnAddress = _AddressOfReturnAddress(); @@ -1805,6 +1746,50 @@ namespace Js #pragma optimize("", on) #endif + const bool InterpreterStackFrame::ShouldDoProfile(FunctionBody* executeFunction) + { +#if ENABLE_PROFILE_INFO + const bool doProfile = executeFunction->GetInterpreterExecutionMode(false) == ExecutionMode::ProfilingInterpreter || + (executeFunction->IsInDebugMode() && DynamicProfileInfo::IsEnabled(executeFunction)); + return doProfile; +#else + return false; +#endif + } + + InterpreterStackFrame* InterpreterStackFrame::CreateInterpreterStackFrameForGenerator(ScriptFunction* function, FunctionBody* executeFunction, JavascriptGenerator* generator, bool doProfile) + { + // + // Allocate a new InterpreterStackFrame instance on the recycler heap. + // It will live with the JavascriptGenerator object. + // + ScriptContext* functionScriptContext = function->GetScriptContext(); + Arguments generatorArgs = generator->GetArguments(); + InterpreterStackFrame::Setup setup(function, generatorArgs); + size_t varAllocCount = setup.GetAllocationVarCount(); + size_t varSizeInBytes = varAllocCount * sizeof(Var); + DWORD_PTR stackAddr = reinterpret_cast(&generator); // use any stack address from this frame to ensure correct debugging functionality + LoopHeader* loopHeaderArray = executeFunction->GetHasAllocatedLoopHeaders() ? executeFunction->GetLoopHeaderArrayPtr() : nullptr; + + Var* allocation = RecyclerNewPlus(functionScriptContext->GetRecycler(), varSizeInBytes, Var); + AnalysisAssert(allocation); + InterpreterStackFrame* newInstance; +#if DBG + // Allocate invalidVar on GC instead of stack since this InterpreterStackFrame will out live the current real frame + Js::RecyclableObject* invalidVar = (Js::RecyclableObject*)RecyclerNewPlusLeaf(functionScriptContext->GetRecycler(), sizeof(Js::RecyclableObject), Var); + AnalysisAssert(invalidVar); + memset(reinterpret_cast(invalidVar), 0xFE, sizeof(Js::RecyclableObject)); + newInstance = setup.InitializeAllocation(allocation, executeFunction->GetHasImplicitArgIns(), doProfile, loopHeaderArray, stackAddr, invalidVar); +#else + newInstance = setup.InitializeAllocation(allocation, executeFunction->GetHasImplicitArgIns(), doProfile, loopHeaderArray, stackAddr); +#endif + + newInstance->m_reader.Create(executeFunction); + + generator->SetFrame(newInstance, varSizeInBytes); + return newInstance; + } + Var InterpreterStackFrame::InterpreterHelper(ScriptFunction* function, ArgumentReader args, void* returnAddress, void* addressOfReturnAddress, AsmJsReturnStruct* asmJsReturn) { const bool isAsmJs = asmJsReturn != nullptr; @@ -1836,7 +1821,7 @@ namespace Js Assert(threadContext->IsScriptActive()); Assert(threadContext->IsInScript()); - FunctionBody* executeFunction = JavascriptFunction::FromVar(function)->GetFunctionBody(); + FunctionBody* executeFunction = JavascriptFunction::UnsafeFromVar(function)->GetFunctionBody(); #ifdef ENABLE_DEBUG_CONFIG_OPTIONS if (!isAsmJs && executeFunction->IsInDebugMode() != functionScriptContext->IsScriptContextInDebugMode()) // debug mode mismatch { @@ -1882,8 +1867,7 @@ namespace Js #if ENABLE_PROFILE_INFO DynamicProfileInfo * dynamicProfileInfo = nullptr; - const bool doProfile = executeFunction->GetInterpreterExecutionMode(false) == ExecutionMode::ProfilingInterpreter || - (executeFunction->IsInDebugMode() && DynamicProfileInfo::IsEnabled(executeFunction)); + const bool doProfile = ShouldDoProfile(executeFunction); if (doProfile) { #if !DYNAMIC_INTERPRETER_THUNK @@ -1909,7 +1893,6 @@ namespace Js bool fReleaseAlloc = false; InterpreterStackFrame* newInstance = nullptr; - Var* allocation = nullptr; if (!isAsmJs && executeFunction->IsCoroutine()) { @@ -1935,32 +1918,7 @@ namespace Js } else { - // - // Allocate a new InterpreterStackFrame instance on the recycler heap. - // It will live with the JavascriptGenerator object. - // - Arguments generatorArgs = generator->GetArguments(); - InterpreterStackFrame::Setup setup(function, generatorArgs); - size_t varAllocCount = setup.GetAllocationVarCount(); - size_t varSizeInBytes = varAllocCount * sizeof(Var); - DWORD_PTR stackAddr = reinterpret_cast(&generator); // as mentioned above, use any stack address from this frame to ensure correct debugging functionality - Var loopHeaderArray = executeFunction->GetHasAllocatedLoopHeaders() ? executeFunction->GetLoopHeaderArrayPtr() : nullptr; - - allocation = RecyclerNewPlus(functionScriptContext->GetRecycler(), varSizeInBytes, Var); - AnalysisAssert(allocation); -#if DBG - // Allocate invalidVar on GC instead of stack since this InterpreterStackFrame will out live the current real frame - Js::RecyclableObject* invalidVar = (Js::RecyclableObject*)RecyclerNewPlusLeaf(functionScriptContext->GetRecycler(), sizeof(Js::RecyclableObject), Var); - AnalysisAssert(invalidVar); - memset(reinterpret_cast(invalidVar), 0xFE, sizeof(Js::RecyclableObject)); - newInstance = setup.InitializeAllocation(allocation, executeFunction->GetHasImplicitArgIns(), doProfile, loopHeaderArray, stackAddr, invalidVar); -#else - newInstance = setup.InitializeAllocation(allocation, executeFunction->GetHasImplicitArgIns(), doProfile, loopHeaderArray, stackAddr); -#endif - - newInstance->m_reader.Create(executeFunction); - - generator->SetFrame(newInstance, varSizeInBytes); + newInstance = CreateInterpreterStackFrameForGenerator(function, executeFunction, generator, doProfile); } } else @@ -1974,6 +1932,8 @@ namespace Js // DWORD_PTR stackAddr; + Var* allocation; + // If the locals area exceeds a certain limit, allocate it from a private arena rather than // this frame. The current limit is based on an old assert on the number of locals we would allow here. if (varAllocCount > InterpreterStackFrame::LocalsThreshold) @@ -2003,7 +1963,7 @@ namespace Js * it's cheaper to just copy them all into the recycler array rather than just the ones that * have been jitted. */ - Var loopHeaderArray = nullptr; + LoopHeader* loopHeaderArray = nullptr; if (executeFunction->GetHasAllocatedLoopHeaders()) { @@ -2033,7 +1993,7 @@ namespace Js TTD::TTDExceptionFramePopper exceptionFramePopper; if(SHOULD_DO_TTD_STACK_STMT_OP(functionScriptContext)) { - bool isInFinally = ((newInstance->m_flags & Js::InterpreterStackFrameFlags_WithinFinallyBlock) == Js::InterpreterStackFrameFlags_WithinFinallyBlock); + bool isInFinally = newInstance->TestFlags(Js::InterpreterStackFrameFlags_WithinFinallyBlock); threadContext->TTDExecutionInfo->PushCallEvent(function, args.Info.Count, args.Values, isInFinally); exceptionFramePopper.PushInfo(threadContext->TTDExecutionInfo, function); @@ -2043,6 +2003,7 @@ namespace Js Var aReturn = nullptr; { +#ifdef ENABLE_SCRIPT_DEBUGGING if (!isAsmJs && executeFunction->IsInDebugMode()) { #if DYNAMIC_INTERPRETER_THUNK @@ -2053,6 +2014,7 @@ namespace Js #endif } else +#endif { #if DYNAMIC_INTERPRETER_THUNK PushPopFrameHelper pushPopFrameHelper(newInstance, returnAddress, addressOfReturnAddress); @@ -2102,7 +2064,7 @@ namespace Js #ifdef ASMJS_PLAT #if _M_IX86 - int InterpreterStackFrame::AsmJsInterpreter(AsmJsCallStackLayout* stack) + void InterpreterStackFrame::AsmJsInterpreter(AsmJsCallStackLayout* stack, byte* retDst) { ScriptFunction * function = (ScriptFunction*)stack->functionObject; Var* paramsAddr = stack->args; @@ -2120,7 +2082,6 @@ namespace Js //Handle return value AsmJsRetType::Which retType = (AsmJsRetType::Which) GetRetType(function); - int retVal = 0; switch (retType) { @@ -2135,39 +2096,40 @@ namespace Js case AsmJsRetType::Uint32x4: case AsmJsRetType::Uint16x8: case AsmJsRetType::Uint8x16: -#ifdef ENABLE_SIMDJS + +#if defined(ENABLE_WASM_SIMD) || defined(ENABLE_SIMDJS) + +#ifdef ENABLE_WASM_SIMD + if (Wasm::Simd::IsEnabled()) +#elif ENABLE_SIMDJS if (function->GetScriptContext()->GetConfig()->IsSimdjsEnabled()) +#endif { - function->GetScriptContext()->asmJsReturnValue.simdVal = asmJsReturn.simd; + *(AsmJsSIMDValue*)retDst = asmJsReturn.simd; break; } #endif + Assert(UNREACHED); // double return case AsmJsRetType::Double: - function->GetScriptContext()->asmJsReturnValue.dbVal = asmJsReturn.d; + *(double*)retDst = asmJsReturn.d; break; // float return case AsmJsRetType::Float: - function->GetScriptContext()->asmJsReturnValue.floatVal = asmJsReturn.f; + *(float*)retDst = asmJsReturn.f; break; // signed or void return case AsmJsRetType::Signed: case AsmJsRetType::Void: - retVal = asmJsReturn.i; + *(int*)retDst = asmJsReturn.i; break; case AsmJsRetType::Int64: - { - function->GetScriptContext()->asmJsReturnValue.int64Val = asmJsReturn.l; - // put the lower bits into eax - // we'll read the higher bits from memory - retVal = (int)asmJsReturn.l; + *(int64*)retDst = asmJsReturn.l; break; - } default: Assume(false); } - return retVal; } #elif _M_X64 @@ -2330,13 +2292,18 @@ namespace Js *(AsmJsSIMDValue*)(&(m_outParams[outRegisterID])) = val; } - template + template void InterpreterStackFrame::OP_InvalidWasmTypeConversion(...) { - // Right now the only invalid wasm type conversion is with int64 - const char16* fromType = toJs ? _u("int64") : _u("Javascript Variable"); - const char16* toType = toJs ? _u("Javascript Variable") : _u("int64"); +#ifdef ENABLE_WASM + CompileAssert(type < Wasm::WasmTypes::Limit); + const char16* fromType = toJs ? Wasm::WasmTypes::GetTypeName(static_cast(type)) : _u("Javascript Variable"); + const char16* toType = toJs ? _u("Javascript Variable") : Wasm::WasmTypes::GetTypeName(static_cast(type)); JavascriptError::ThrowTypeErrorVar(scriptContext, WASMERR_InvalidTypeConversion, fromType, toType); +#else + Assert(UNREACHED); //shouldn't get there + JavascriptError::ThrowTypeErrorVar(scriptContext, WASMERR_InvalidTypeConversion, _u("unknown"), _u("unknown")); //throw for a release build +#endif } // This will be called in the beginning of the try_finally. @@ -2376,7 +2343,8 @@ namespace Js inline void InterpreterStackFrame::PopOut(ArgSlot argCount) { - m_outSp -= (argCount+1); + ArgSlotMath::Inc(argCount); + m_outSp -= argCount; m_outParams = (Var*)*m_outSp; AssertMsg(m_localSlots + this->m_functionBody->GetLocalsCount() <= m_outSp && @@ -2395,6 +2363,7 @@ namespace Js m_outSpCached = nullptr; } +#ifdef ENABLE_SCRIPT_DEBUGGING _NOINLINE Var InterpreterStackFrame::DebugProcessThunk(void* returnAddress, void* addressOfReturnAddress) { @@ -2464,6 +2433,7 @@ namespace Js } } } +#endif template OpCodeType InterpreterStackFrame::ReadOp(const byte *& ip) @@ -2544,10 +2514,11 @@ namespace Js return this->Process(); } + +#ifdef ASMJS_PLAT Var InterpreterStackFrame::ProcessAsmJsModule() { -#ifdef ASMJS_PLAT - Js::FunctionBody* asmJsModuleFunctionBody = GetFunctionBody(); + FunctionBody* asmJsModuleFunctionBody = GetFunctionBody(); AsmJsModuleInfo* info = asmJsModuleFunctionBody->GetAsmJsModuleInfo(); #ifdef ENABLE_DEBUG_CONFIG_OPTIONS @@ -2557,7 +2528,7 @@ namespace Js return this->ProcessLinkFailedAsmJsModule(); } #endif - if( m_inSlotsCount != info->GetArgInCount() + 1 ) + if (m_inSlotsCount != info->GetArgInCount() + 1) { // Error reparse without asm.js AsmJSCompiler::OutputError(this->scriptContext, _u("Asm.js Runtime Error : Invalid module argument count")); @@ -2575,6 +2546,7 @@ namespace Js Field(Var)* localFunctionImports = moduleMemoryPtr + moduleMemory.mFFIOffset ; Field(Var)* localModuleFunctions = moduleMemoryPtr + moduleMemory.mFuncOffset ; Field(Field(Var)*)* localFunctionTables = (Field(Field(Var)*)*)(moduleMemoryPtr + moduleMemory.mFuncPtrOffset) ; + #ifdef ENABLE_SIMDJS AsmJsSIMDValue* localSimdSlots = nullptr; @@ -2601,17 +2573,17 @@ namespace Js // don't need to print, because checkParams will do it for us goto linkFailure; } - else if(this->CheckAndResetImplicitCall(prevDisableImplicitFlags, saveImplicitcallFlags)) + else if (this->CheckAndResetImplicitCall(prevDisableImplicitFlags, saveImplicitcallFlags)) { AsmJSCompiler::OutputError(this->scriptContext, _u("Asm.js Runtime Error : Params have side effects")); - return this->ProcessLinkFailedAsmJsModule(); + return this->ProcessLinkFailedAsmJsModule(); } // Initialize Variables for (int i = 0; i < info->GetVarCount(); i++) { - const auto& var = info->GetVar( i ); + const auto& var = info->GetVar(i); const AsmJsVarType type(var.type); - if(type.isInt() ) + if (type.isInt()) { localIntSlots[var.location] = var.initialiser.intInit; } @@ -2637,12 +2609,12 @@ namespace Js } // Load constant variables - for( int i = 0; i < info->GetVarImportCount(); i++ ) + for (int i = 0; i < info->GetVarImportCount(); i++) { - const auto& import = info->GetVarImport( i ); + const auto& import = info->GetVarImport(i); const AsmJsVarType type(import.type); // this might throw, but it would anyway in non-asm.js - Var value = JavascriptOperators::OP_GetProperty( foreign, import.field, scriptContext ); + Var value = JavascriptOperators::OP_GetProperty(foreign, import.field, scriptContext); // check if there is implicit call and if there is implicit call then clear the disableimplicitcall flag if (this->CheckAndResetImplicitCall(prevDisableImplicitFlags, saveImplicitcallFlags)) { @@ -2659,9 +2631,9 @@ namespace Js } } - if(type.isInt() ) + if (type.isInt()) { - int val = JavascriptMath::ToInt32( value, scriptContext ); + int val = JavascriptMath::ToInt32(value, scriptContext); localIntSlots[import.location] = val; } else if (type.isFloat()) @@ -2671,7 +2643,7 @@ namespace Js } else if (type.isDouble()) { - double val = JavascriptConversion::ToNumber( value, scriptContext ); + double val = JavascriptConversion::ToNumber(value, scriptContext); localDoubleSlots[import.location] = val; } #ifdef ENABLE_SIMDJS @@ -2683,52 +2655,52 @@ namespace Js val.Zero(); switch (type.which()) { - case AsmJsVarType::Int32x4: - valid = JavascriptSIMDInt32x4::Is(value); - val = (valid) ? ((JavascriptSIMDInt32x4*)value)->GetValue() : val; - break; - case AsmJsVarType::Bool32x4: - valid = JavascriptSIMDBool32x4::Is(value); - val = (valid) ? ((JavascriptSIMDBool32x4*)value)->GetValue() : val; - break; - case AsmJsVarType::Bool16x8: - valid = JavascriptSIMDBool16x8::Is(value); - val = (valid) ? ((JavascriptSIMDBool16x8*)value)->GetValue() : val; - break; - case AsmJsVarType::Bool8x16: - valid = JavascriptSIMDBool8x16::Is(value); - val = (valid) ? ((JavascriptSIMDBool8x16*)value)->GetValue() : val; - break; - case AsmJsVarType::Float32x4: - valid = JavascriptSIMDFloat32x4::Is(value); - val = (valid) ? ((JavascriptSIMDFloat32x4*)value)->GetValue() : val; - break; - case AsmJsVarType::Float64x2: - valid = JavascriptSIMDFloat64x2::Is(value); - val = (valid) ? ((JavascriptSIMDFloat64x2*)value)->GetValue() : val; - break; - case AsmJsVarType::Int16x8: - valid = JavascriptSIMDInt16x8::Is(value); - val = (valid) ? ((JavascriptSIMDInt16x8*)value)->GetValue() : val; - break; - case AsmJsVarType::Int8x16: - valid = JavascriptSIMDInt8x16::Is(value); - val = ((JavascriptSIMDInt8x16*)value)->GetValue(); - break; - case AsmJsVarType::Uint32x4: - valid = JavascriptSIMDUint32x4::Is(value); - val = (valid) ? ((JavascriptSIMDUint32x4*)value)->GetValue() : val; - break; - case AsmJsVarType::Uint16x8: - valid = JavascriptSIMDUint16x8::Is(value); - val = (valid) ? ((JavascriptSIMDUint16x8*)value)->GetValue() : val; - break; - case AsmJsVarType::Uint8x16: - valid = JavascriptSIMDUint8x16::Is(value); - val = (valid) ? ((JavascriptSIMDUint8x16*)value)->GetValue() : val; - break; - default: - Assert(UNREACHED); + case AsmJsVarType::Int32x4: + valid = JavascriptSIMDInt32x4::Is(value); + val = (valid) ? ((JavascriptSIMDInt32x4*)value)->GetValue() : val; + break; + case AsmJsVarType::Bool32x4: + valid = JavascriptSIMDBool32x4::Is(value); + val = (valid) ? ((JavascriptSIMDBool32x4*)value)->GetValue() : val; + break; + case AsmJsVarType::Bool16x8: + valid = JavascriptSIMDBool16x8::Is(value); + val = (valid) ? ((JavascriptSIMDBool16x8*)value)->GetValue() : val; + break; + case AsmJsVarType::Bool8x16: + valid = JavascriptSIMDBool8x16::Is(value); + val = (valid) ? ((JavascriptSIMDBool8x16*)value)->GetValue() : val; + break; + case AsmJsVarType::Float32x4: + valid = JavascriptSIMDFloat32x4::Is(value); + val = (valid) ? ((JavascriptSIMDFloat32x4*)value)->GetValue() : val; + break; + case AsmJsVarType::Float64x2: + valid = JavascriptSIMDFloat64x2::Is(value); + val = (valid) ? ((JavascriptSIMDFloat64x2*)value)->GetValue() : val; + break; + case AsmJsVarType::Int16x8: + valid = JavascriptSIMDInt16x8::Is(value); + val = (valid) ? ((JavascriptSIMDInt16x8*)value)->GetValue() : val; + break; + case AsmJsVarType::Int8x16: + valid = JavascriptSIMDInt8x16::Is(value); + val = ((JavascriptSIMDInt8x16*)value)->GetValue(); + break; + case AsmJsVarType::Uint32x4: + valid = JavascriptSIMDUint32x4::Is(value); + val = (valid) ? ((JavascriptSIMDUint32x4*)value)->GetValue() : val; + break; + case AsmJsVarType::Uint16x8: + valid = JavascriptSIMDUint16x8::Is(value); + val = (valid) ? ((JavascriptSIMDUint16x8*)value)->GetValue() : val; + break; + case AsmJsVarType::Uint8x16: + valid = JavascriptSIMDUint8x16::Is(value); + val = (valid) ? ((JavascriptSIMDUint8x16*)value)->GetValue() : val; + break; + default: + Assert(UNREACHED); }; if (!valid) { @@ -2749,18 +2721,18 @@ namespace Js } } // Load external functions - for( int i = 0; i < info->GetFunctionImportCount(); i++ ) + for (int i = 0; i < info->GetFunctionImportCount(); i++) { - const auto& import = info->GetFunctionImport( i ); + const auto& import = info->GetFunctionImport(i); // this might throw, but it would anyway in non-asm.js - Var importFunc = JavascriptOperators::OP_GetProperty( foreign, import.field, scriptContext ); + Var importFunc = JavascriptOperators::OP_GetProperty(foreign, import.field, scriptContext); // check if there is implicit call and if there is implicit call then clear the disableimplicitcall flag if (this->CheckAndResetImplicitCall(prevDisableImplicitFlags, saveImplicitcallFlags)) { AsmJSCompiler::OutputError(this->scriptContext, _u("Asm.js Runtime Error : Accessing foreign function import %s has side effects"), this->scriptContext->GetPropertyName(import.field)->GetBuffer()); return this->ProcessLinkFailedAsmJsModule(); } - if( !JavascriptFunction::Is( importFunc ) ) + if (!JavascriptFunction::Is(importFunc)) { AsmJSCompiler::OutputError(this->scriptContext, _u("Asm.js Runtime Error : Foreign function import %s is not a function"), this->scriptContext->GetPropertyName(import.field)->GetBuffer()); goto linkFailure; @@ -2772,8 +2744,10 @@ namespace Js threadContext->SetImplicitCallFlags(saveImplicitcallFlags); // scope { - FrameDisplay* pDisplay = RecyclerNewPlus(scriptContext->GetRecycler(), sizeof(void*), FrameDisplay, 1); - pDisplay->SetItem( 0, moduleMemoryPtr ); + FrameDisplay* pDisplay = RecyclerNewPlus(scriptContext->GetRecycler(), sizeof(void*), FrameDisplay, 0); + //DynamicObject* asmModule = scriptContext->GetLibrary()->CreateObject(false, 1); + //JavascriptOperators::OP_SetProperty(asmModule, PropertyIds::module, moduleMemoryPtr, scriptContext); + //pDisplay->SetItem(0, this->function); for (int i = 0; i < info->GetFunctionCount(); i++) { const auto& modFunc = info->GetFunction(i); @@ -2791,29 +2765,29 @@ namespace Js scriptFuncObj->GetDynamicType()->SetEntryPoint(AsmJsExternalEntryPoint); scriptFuncObj->GetFunctionBody()->GetAsmJsFunctionInfo()->SetModuleFunctionBody(asmJsModuleFunctionBody); - scriptFuncObj->SetModuleMemory((Field(Var)*)moduleMemoryPtr); + scriptFuncObj->SetModuleEnvironment((Field(Var)*)moduleMemoryPtr); if (!info->IsRuntimeProcessed()) { // don't reset entrypoint upon relinking FunctionEntryPointInfo* entrypointInfo = (FunctionEntryPointInfo*)scriptFuncObj->GetEntryPointInfo(); entrypointInfo->SetIsAsmJSFunction(true); - #if DYNAMIC_INTERPRETER_THUNK +#if DYNAMIC_INTERPRETER_THUNK if (!PHASE_ON1(AsmJsJITTemplatePhase)) { entrypointInfo->jsMethod = AsmJsDefaultEntryThunk; } - #endif +#endif } } } // Initialize function table arrays - for( int i = 0; i < info->GetFunctionTableCount(); i++ ) + for (int i = 0; i < info->GetFunctionTableCount(); i++) { - const auto& modFuncTable = info->GetFunctionTable( i ); - Field(Var)* funcTableArray = RecyclerNewArray( scriptContext->GetRecycler(), Field(Var), modFuncTable.size ); - for (uint j = 0; j < modFuncTable.size ; j++) + const auto& modFuncTable = info->GetFunctionTable(i); + Field(Var)* funcTableArray = RecyclerNewArray(scriptContext->GetRecycler(), Field(Var), modFuncTable.size); + for (uint j = 0; j < modFuncTable.size; j++) { // get the module function index const RegSlot index = modFuncTable.moduleFunctionIndex[j]; @@ -2823,12 +2797,12 @@ namespace Js } localFunctionTables[i] = funcTableArray; } -// Do MTJRC/MAIC:0 check + // Do MTJRC/MAIC:0 check #if ENABLE_DEBUG_CONFIG_OPTIONS if ( (PHASE_ON1(Js::AsmJsJITTemplatePhase) && CONFIG_FLAG(MaxTemplatizedJitRunCount) == 0) || (!PHASE_ON1(Js::AsmJsJITTemplatePhase) && (CONFIG_FLAG(MaxAsmJsInterpreterRunCount) == 0 || CONFIG_FLAG(ForceNative))) - ) + ) { if (PHASE_TRACE1(AsmjsEntryPointInfoPhase)) { @@ -2851,17 +2825,17 @@ namespace Js info->SetIsRuntimeProcessed(true); // create export object - if( info->GetExportsCount() ) + if (info->GetExportsCount()) { - Var newObj = JavascriptOperators::NewScObjectLiteral( GetScriptContext(), info->GetExportsIdArray(), - this->GetFunctionBody()->GetObjectLiteralTypeRef(0)); - for( int i = 0; i < info->GetExportsCount(); i++ ) + Var newObj = JavascriptOperators::NewScObjectLiteral(GetScriptContext(), info->GetExportsIdArray(), + this->GetFunctionBody()->GetObjectLiteralTypeRef(0)); + for (int i = 0; i < info->GetExportsCount(); i++) { - auto ex = info->GetExport( i ); + auto ex = info->GetExport(i); Var func = localModuleFunctions[*ex.location]; - JavascriptOperators::OP_InitProperty( newObj, *ex.id, func ); + JavascriptOperators::OP_InitProperty(newObj, *ex.id, func); } - SetReg( (RegSlot) 0, newObj ); + SetReg((RegSlot)0, newObj); return newObj; } @@ -2936,7 +2910,6 @@ namespace Js #else InterpreterStackFrame * newInstance = newInstance = setup.InitializeAllocation(allocation, funcObj->GetFunctionBody()->GetHasImplicitArgIns(), doProfile, nullptr, stackAddr); #endif - newInstance->m_reader.Create(funcObj->GetFunctionBody()); // now that we have set up the new frame, let's interpret it! funcObj->GetFunctionBody()->BeginExecution(); @@ -2955,17 +2928,12 @@ namespace Js } return retVal; -#else - Assert(UNREACHED); - return nullptr; -#endif } #if ENABLE_DEBUG_CONFIG_OPTIONS int AsmJsCallDepth = 0; #endif -#ifdef ASMJS_PLAT // Function memory allocation should be done the same way as // T AsmJsCommunEntryPoint(Js::ScriptFunction* func, ...) (AsmJSJitTemplate.cpp) // update any changes there @@ -3035,20 +3003,20 @@ namespace Js } // Load module environment - FrameDisplay* frame = this->function->GetEnvironment(); - m_localSlots[AsmJsFunctionMemory::ModuleEnvRegister] = frame->GetItem(0); + AsmJsScriptFunction* asmJsFunc = AsmJsScriptFunction::FromVar(this->function); + m_localSlots[AsmJsFunctionMemory::ModuleEnvRegister] = asmJsFunc->GetModuleEnvironment(); + m_localSlots[AsmJsFunctionMemory::ArrayBufferRegister] = nullptr; #ifdef ENABLE_WASM - if (func->GetFunctionBody()->IsWasmFunction()) + if (WasmScriptFunction::Is(func)) { - WebAssemblyMemory * wasmMem = *(WebAssemblyMemory**)((Var*)frame->GetItem(0) + AsmJsModuleMemory::MemoryTableBeginOffset); + WasmScriptFunction* wasmFunc = WasmScriptFunction::FromVar(func); + m_wasmMemory = wasmFunc->GetWebAssemblyMemory(); m_signatures = func->GetFunctionBody()->GetAsmJsFunctionInfo()->GetWebAssemblyModule()->GetSignatures(); - m_wasmMemory = wasmMem; - m_localSlots[AsmJsFunctionMemory::ArrayBufferRegister] = nullptr; } else #endif { - m_localSlots[AsmJsFunctionMemory::ArrayBufferRegister] = (Var*)frame->GetItem(0) + AsmJsModuleMemory::MemoryTableBeginOffset; + m_asmJsBuffer = asmJsFunc->GetAsmJsArrayBuffer(); } m_localSlots[AsmJsFunctionMemory::ArraySizeRegister] = 0; // do not cache ArraySize in the interpreter @@ -3058,13 +3026,13 @@ namespace Js int64* int64Arg = m_localInt64Slots + info->GetTypedSlotInfo(WAsmJs::INT64)->constCount; double* doubleArg = m_localDoubleSlots + info->GetTypedSlotInfo(WAsmJs::FLOAT64)->constCount; float* floatArg = m_localFloatSlots + info->GetTypedSlotInfo(WAsmJs::FLOAT32)->constCount; -#if _M_X64 +#if defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) AsmJsSIMDValue* simdArg = m_localSimdSlots + info->GetTypedSlotInfo(WAsmJs::SIMD)->constCount; #endif // Move the arguments to the right location ArgSlot argCount = info->GetArgCount(); -#if _M_X64 +#if _M_X64 && _WIN32 uint homingAreaSize = 0; #endif @@ -3083,7 +3051,7 @@ namespace Js uintptr_t argAddress = (uintptr_t)m_inParams; for (ArgSlot i = 0; i < argCount; i++) { -#if _M_X64 +#if _M_X64 && _WIN32 // 3rd Argument should be at the end of the homing area. Assert(i != 3 || argAddress == (uintptr_t)m_inParams + homingAreaSize); if (i < 3) @@ -3104,12 +3072,7 @@ namespace Js // IAT xmm2 spill // IAT xmm1 spill <- floatSpillAddress for arg1 -#ifdef _WIN32 #define FLOAT_SPILL_ADDRESS_OFFSET_WORDS 15 -#else -// On Sys V x64 we have 4 words less (4 reg shadow) -#define FLOAT_SPILL_ADDRESS_OFFSET_WORDS 11 -#endif // floats are spilled as xmmwords uintptr_t floatSpillAddress = (uintptr_t)m_inParams - MachPtr * (FLOAT_SPILL_ADDRESS_OFFSET_WORDS - 2*i); @@ -3163,13 +3126,24 @@ namespace Js } else { +#if defined (ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) Assert(info->GetArgType(i).isSIMD()); *simdArg = *(AsmJsSIMDValue*)floatSpillAddress; ++simdArg; homingAreaSize += sizeof(AsmJsSIMDValue); +#else + Assert(UNREACHED); +#endif } #ifdef ENABLE_SIMDJS if (scriptContext->GetConfig()->IsSimdjsEnabled() && i == 2) // last argument ? +#endif + +#ifdef ENABLE_WASM_SIMD + if (Wasm::Simd::IsEnabled() && i == 2) // last argument ? +#endif + +#if defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) { // If we have simd arguments, the homing area in m_inParams can be larger than 3 64-bit slots. This is because SIMD values are unboxed there too. // After unboxing, the homing area is overwritten by rdx, r8 and r9, and we read/skip 64-bit slots from the homing area (argAddress += MachPtr). @@ -3235,6 +3209,13 @@ namespace Js } #ifdef ENABLE_SIMDJS else if (scriptContext->GetConfig()->IsSimdjsEnabled() && info->GetArgType(i).isSIMD()) +#endif + +#ifdef ENABLE_WASM_SIMD + else if (Wasm::Simd::IsEnabled() && info->GetArgType(i).isSIMD()) +#endif + +#if defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) { *simdArg = *(AsmJsSIMDValue*)argAddress; ++simdArg; @@ -3254,10 +3235,6 @@ namespace Js Output::Flush(); } #endif - if( info->GetReturnType() == AsmJsRetType::Void ) - { - m_localSlots[0] = JavascriptOperators::OP_LdUndef( scriptContext ); - } } #endif @@ -3303,7 +3280,7 @@ namespace Js // For now, always collect profile data when debugging, // otherwise the backend will be confused if there's no profile data. - +#ifdef ENABLE_SCRIPT_DEBUGGING #define INTERPRETERLOOPNAME ProcessWithDebugging #define PROVIDE_DEBUGGING #if ENABLE_PROFILE_INFO @@ -3315,6 +3292,7 @@ namespace Js #endif #undef PROVIDE_DEBUGGING #undef INTERPRETERLOOPNAME +#endif #if ENABLE_TTD #define PROVIDE_INTERPRETER_STMTS @@ -3361,11 +3339,11 @@ namespace Js } autoRestore(this); #endif - if (this->ehBailoutData) + if (this->ehBailoutData && !this->TestFlags(InterpreterStackFrameFlags_FromBailOutInInlinee)) { - if ((m_flags & Js::InterpreterStackFrameFlags_FromBailOut) && !(m_flags & InterpreterStackFrameFlags_ProcessingBailOutFromEHCode)) + if (this->TestFlags(Js::InterpreterStackFrameFlags_FromBailOut) && !this->TestFlags(InterpreterStackFrameFlags_ProcessingBailOutFromEHCode)) { - m_flags |= Js::InterpreterStackFrameFlags_ProcessingBailOutFromEHCode; + this->OrFlags(Js::InterpreterStackFrameFlags_ProcessingBailOutFromEHCode); EHBailoutData * topLevelEHBailoutData = this->ehBailoutData; while (topLevelEHBailoutData->parent->nestingDepth != -1) { @@ -3373,7 +3351,7 @@ namespace Js topLevelEHBailoutData = topLevelEHBailoutData->parent; } ProcessTryHandlerBailout(topLevelEHBailoutData, this->ehBailoutData->nestingDepth); - m_flags &= ~Js::InterpreterStackFrameFlags_ProcessingBailOutFromEHCode; + this->ClearFlags(Js::InterpreterStackFrameFlags_ProcessingBailOutFromEHCode); this->ehBailoutData = nullptr; } } @@ -3440,7 +3418,7 @@ namespace Js #if ENABLE_PROFILE_INFO FunctionBody *const functionBody = GetFunctionBody(); const ExecutionMode interpreterExecutionMode = - functionBody->GetInterpreterExecutionMode(!!(GetFlags() & InterpreterStackFrameFlags_FromBailOut)); + functionBody->GetInterpreterExecutionMode(TestFlags(InterpreterStackFrameFlags_FromBailOut)); if(interpreterExecutionMode == ExecutionMode::ProfilingInterpreter) { #if ENABLE_TTD @@ -3556,17 +3534,15 @@ namespace Js JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(varInstance); #endif PropertyId propertyId = GetPropertyIdFromCacheId(playout->inlineCacheIndex); - RecyclableObject* obj = NULL; - if (RecyclableObject::Is(varInstance)) + RecyclableObject* obj = JavascriptOperators::TryFromVar(varInstance); + if (obj) { - obj = RecyclableObject::FromVar(varInstance); - - if ((propertyId == PropertyIds::apply || propertyId == PropertyIds::call) && ScriptFunction::Is(obj)) + ScriptFunction *fn = JavascriptOperators::TryFromVar(obj); + if ((propertyId == PropertyIds::apply || propertyId == PropertyIds::call) && fn) { // If the property being loaded is "apply"/"call", make an optimistic assumption that apply/call is not overridden and // undefer the function right here if it was defer parsed before. This is required so that the load of "apply"/"call" // happens from the same "type". Otherwise, we will have a polymorphic cache for load of "apply"/"call". - ScriptFunction *fn = ScriptFunction::FromVar(obj); if(fn->GetType()->GetEntryPoint() == JavascriptFunction::DeferredParsingThunk) { JavascriptFunction::DeferredParse(&fn); @@ -3621,7 +3597,7 @@ namespace Js Js::Var instance = this->GetRootObject(); PropertyId propertyId = GetPropertyIdFromCacheId(playout->inlineCacheIndex); InlineCache *inlineCache = this->GetInlineCache(playout->inlineCacheIndex); - DynamicObject *obj = DynamicObject::FromVar(instance); + DynamicObject *obj = DynamicObject::UnsafeFromVar(instance); PropertyValueInfo info; PropertyValueInfo::SetCacheInfo(&info, GetFunctionBody(), inlineCache, playout->inlineCacheIndex, true); @@ -3647,7 +3623,7 @@ namespace Js GetFunctionBody(), GetInlineCache(playout->inlineCacheIndex), playout->inlineCacheIndex, - DynamicObject::FromVar(rootInstance), + DynamicObject::UnsafeFromVar(rootInstance), propertyId ); @@ -3778,32 +3754,68 @@ namespace Js } #ifdef ASMJS_PLAT -#if _M_X64 || _M_IX86 - void InterpreterStackFrame::OP_CallAsmInternal(RecyclableObject * function) - { - AsmJsFunctionInfo* asmInfo = ((ScriptFunction*)function)->GetFunctionBody()->GetAsmJsFunctionInfo(); - uint argsSize = asmInfo->GetArgByteSize(); - ScriptFunction* scriptFunc = (ScriptFunction*)function; + void InterpreterStackFrame::OP_ProfiledCallAsmInternal(RegSlot funcReg, RegSlot returnReg, ProfileId profileId) + { + Var target = GetRegRawPtr(funcReg); + ScriptFunction* function = (ScriptFunction*)OP_CallGetFunc(target); + + Js::FunctionBody * body = function->GetFunctionBody(); + DynamicProfileInfo * dynamicProfileInfo = GetFunctionBody()->GetDynamicProfileInfo(); + dynamicProfileInfo->RecordAsmJsCallSiteInfo(GetFunctionBody(), profileId, body); + return OP_CallAsmInternalCommon(function, returnReg); + } + void InterpreterStackFrame::OP_CallAsmInternal(RegSlot funcReg, RegSlot returnReg) + { + Var target = GetRegRawPtr(funcReg); + ScriptFunction* function = (ScriptFunction*)OP_CallGetFunc(target); + return OP_CallAsmInternalCommon(function, returnReg); + } + void InterpreterStackFrame::OP_CallAsmInternalCommon(ScriptFunction* function, RegSlot returnReg) + { + AsmJsScriptFunction* scriptFunc = AsmJsScriptFunction::FromVar(function); + AsmJsFunctionInfo* asmInfo = scriptFunc->GetFunctionBody()->GetAsmJsFunctionInfo(); + uint alignedArgsSize = ::Math::Align(asmInfo->GetArgByteSize(), 16); +#if _M_X64 && _WIN32 + // convention is to always allocate spill space for rcx,rdx,r8,r9 + if (alignedArgsSize < 0x20) alignedArgsSize = 0x20; + uint* argSizes = asmInfo->GetArgsSizesArray(); + Assert(asmInfo->GetArgSizeArrayLength() >= 2); + byte* curOutParams = (byte*)m_outParams + sizeof(Var); + Assert(curOutParams + argSizes[0] + argSizes[1] + 16 <= (byte*)this->m_outParamsEnd); + + // Prepare in advance the possible arguments that will need to be put in register + byte _declspec(align(16)) reg[3 * 16]; + CompileAssert((FunctionBody::MinAsmJsOutParams() * sizeof(Var)) == (sizeof(Var) * 2 + sizeof(reg))); + js_memcpy_s(reg, 16, curOutParams, 16); + js_memcpy_s(reg + 16, 16, curOutParams + argSizes[0], 16); + js_memcpy_s(reg + 32, 16, curOutParams + argSizes[0] + argSizes[1], 16); +#else + byte* reg = nullptr; +#endif + ScriptContext * scriptContext = function->GetScriptContext(); - PROBE_STACK_CALL(scriptContext, function, argsSize); + Js::FunctionEntryPointInfo* entrypointInfo = (Js::FunctionEntryPointInfo*)function->GetEntryPointInfo(); + PROBE_STACK_CALL(scriptContext, function, alignedArgsSize + Js::Constants::MinStackDefault); - Js::FunctionEntryPointInfo* entrypointInfo = (Js::FunctionEntryPointInfo*)scriptFunc->GetEntryPointInfo(); switch (asmInfo->GetReturnType().which()) { case AsmJsRetType::Void: + JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, m_outParams, alignedArgsSize, reg); + break; case AsmJsRetType::Signed: - m_localIntSlots[0] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, asmInfo->GetArgCount(), m_outParams); + + m_localIntSlots[returnReg] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, m_outParams, alignedArgsSize, reg); break; case AsmJsRetType::Int64: - m_localInt64Slots[0] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, asmInfo->GetArgCount(), m_outParams); + m_localInt64Slots[returnReg] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, m_outParams, alignedArgsSize, reg); break; case AsmJsRetType::Double: - m_localDoubleSlots[0] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, asmInfo->GetArgCount(), m_outParams); + m_localDoubleSlots[returnReg] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, m_outParams, alignedArgsSize, reg); break; case AsmJsRetType::Float: - m_localFloatSlots[0] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, asmInfo->GetArgCount(), m_outParams); + m_localFloatSlots[returnReg] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, m_outParams, alignedArgsSize, reg); break; -#ifdef ENABLE_SIMDJS +#if defined (ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD) case AsmJsRetType::Float32x4: case AsmJsRetType::Int32x4: case AsmJsRetType::Bool32x4: @@ -3815,54 +3827,55 @@ namespace Js case AsmJsRetType::Uint32x4: case AsmJsRetType::Uint16x8: case AsmJsRetType::Uint8x16: +#if _WIN32 //WASM.SIMD ToDo: Enable thunk for Xplat #if _M_X64 X86SIMDValue simdVal; - simdVal.m128_value = JavascriptFunction::CallAsmJsFunction<__m128>(function, entrypointInfo->jsMethod, asmInfo->GetArgCount(), m_outParams); - m_localSimdSlots[0] = X86SIMDValue::ToSIMDValue(simdVal); + simdVal.m128_value = JavascriptFunction::CallAsmJsFunction<__m128>(function, entrypointInfo->jsMethod, m_outParams, alignedArgsSize, reg); + m_localSimdSlots[returnReg] = X86SIMDValue::ToSIMDValue(simdVal); #else - m_localSimdSlots[0] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, asmInfo->GetArgCount(), m_outParams); + m_localSimdSlots[returnReg] = JavascriptFunction::CallAsmJsFunction(function, entrypointInfo->jsMethod, m_outParams, alignedArgsSize, reg); +#endif #endif break; #endif default: Assume(UNREACHED); } - Assert((uint)((ArgSlot)asmInfo->GetArgCount() + 1) == (uint)(asmInfo->GetArgCount() + 1)); -#ifdef ENABLE_SIMDJS -#if _M_X64 - if (scriptContext->GetConfig()->IsSimdjsEnabled()) -#endif - { - PopOut((ArgSlot)(argsSize / sizeof(Var)) + 1); - } -#if _M_X64 - else - { - PopOut((ArgSlot)asmInfo->GetArgCount() + 1); - } -#endif -#else -#if _M_X64 - PopOut((ArgSlot)asmInfo->GetArgCount() + 1); - -#else - PopOut((ArgSlot)(argsSize / sizeof(Var)) + 1); -#endif -#endif + + const ArgSlot nVarToPop = (asmInfo->GetArgByteSize() / sizeof(Var)) + 1; + PopOut(nVarToPop); + Assert(function); } -#else - void InterpreterStackFrame::OP_CallAsmInternal(RecyclableObject * function) - { - __debugbreak(); - } -#endif #endif template void InterpreterStackFrame::OP_AsmCall(const unaligned T* playout) { - OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), CallFlags_None); + Var target = GetRegRawPtr(playout->Function); + + RecyclableObject * function = OP_CallGetFunc(target); + +#if DBG + if (this->IsInDebugMode()) + { + JavascriptFunction::CheckValidDebugThunk(scriptContext, function); + } +#endif + + if (playout->Return == Js::Constants::NoRegister) + { + Arguments args(CallInfo(CallFlags_NotUsed, playout->ArgCount), m_outParams); + JavascriptFunction::CallFunction(function, function->GetEntryPoint(), args); + } + else + { + Arguments args(CallInfo(CallFlags_Value, playout->ArgCount), m_outParams); + Var retVal = JavascriptFunction::CallFunction(function, function->GetEntryPoint(), args); + SetRegRawPtr(playout->Return, retVal); + } + + PopOut(playout->ArgCount); } template @@ -3879,18 +3892,22 @@ namespace Js ThreadContext * threadContext = scriptContext->GetThreadContext(); Js::ImplicitCallFlags savedImplicitCallFlags = threadContext->GetImplicitCallFlags(); +#ifdef ENABLE_SCRIPT_DEBUGGING #if DBG if (this->IsInDebugMode()) { JavascriptFunction::CheckValidDebugThunk(scriptContext, function); } +#endif #endif + ArgSlot argCount = playout->ArgCount; if (playout->Return == Js::Constants::NoRegister) { flags |= CallFlags_NotUsed; - Arguments args(CallInfo((CallFlags)flags, playout->ArgCount), m_outParams); + Arguments args(CallInfo((CallFlags)flags, argCount), m_outParams); AssertMsg(static_cast(args.Info.Flags) == flags, "Flags don't fit into the CallInfo field?"); + argCount = args.GetArgCountWithExtraArgs(); if (spreadIndices != nullptr) { JavascriptFunction::CallSpreadFunction(function, args, spreadIndices); @@ -3903,8 +3920,9 @@ namespace Js else { flags |= CallFlags_Value; - Arguments args(CallInfo((CallFlags)flags, playout->ArgCount), m_outParams); + Arguments args(CallInfo((CallFlags)flags, argCount), m_outParams); AssertMsg(static_cast(args.Info.Flags) == flags, "Flags don't fit into the CallInfo field?"); + argCount = args.GetArgCountWithExtraArgs(); if (spreadIndices != nullptr) { SetReg((RegSlot)playout->Return, JavascriptFunction::CallSpreadFunction(function, args, spreadIndices)); @@ -3916,7 +3934,7 @@ namespace Js } threadContext->SetImplicitCallFlags(savedImplicitCallFlags); - PopOut(playout->ArgCount); + PopOut(argCount); } template @@ -3955,20 +3973,6 @@ namespace Js } #endif - template - void InterpreterStackFrame::OP_CallPutCommon(const unaligned T *playout, RecyclableObject * function) - { - Arguments args(CallInfo(CallFlags_None, playout->ArgCount), m_outParams); - SetReg((RegSlot)playout->Return, function->InvokePut(args)); - PopOut(playout->ArgCount); - } - - template - void InterpreterStackFrame::OP_CallPutCommonI(const unaligned T *playout, RecyclableObject * function) - { - OP_CallPutCommon(playout, function); - } - template void InterpreterStackFrame::OP_GetRootProperty(unaligned T* playout) { @@ -3979,7 +3983,7 @@ namespace Js InlineCache *inlineCache = this->GetInlineCache(playout->inlineCacheIndex); PropertyId propertyId = GetPropertyIdFromCacheId(playout->inlineCacheIndex); - DynamicObject * obj = DynamicObject::FromVar(instance); + DynamicObject * obj = DynamicObject::UnsafeFromVar(instance); PropertyValueInfo info; PropertyValueInfo::SetCacheInfo(&info, GetFunctionBody(), inlineCache, playout->inlineCacheIndex, true); @@ -4004,7 +4008,7 @@ namespace Js GetFunctionBody(), GetInlineCache(playout->inlineCacheIndex), playout->inlineCacheIndex, - DynamicObject::FromVar(rootInstance), + DynamicObject::UnsafeFromVar(rootInstance), propertyId ); @@ -4029,7 +4033,7 @@ namespace Js GetFunctionBody(), GetInlineCache(playout->inlineCacheIndex), playout->inlineCacheIndex, - DynamicObject::FromVar(rootInstance), + DynamicObject::UnsafeFromVar(rootInstance), propertyId ); @@ -4178,9 +4182,9 @@ namespace Js { InlineCache *inlineCache = GetInlineCache(playout->inlineCacheIndex); PropertyId propertyId = GetPropertyIdFromCacheId(playout->inlineCacheIndex); - if (RecyclableObject::Is(instance)) + RecyclableObject* obj = JavascriptOperators::TryFromVar(instance); + if (obj) { - RecyclableObject* obj = RecyclableObject::FromVar(instance); PropertyValueInfo info; PropertyValueInfo::SetCacheInfo(&info, GetFunctionBody(), inlineCache, playout->inlineCacheIndex, true); @@ -4328,7 +4332,7 @@ namespace Js int length = pScope->GetLength(); if ( 1 == length ) { - DynamicObject *obj = (DynamicObject*)pScope->GetItem(0); + RecyclableObject *obj = RecyclableObject::FromVar(pScope->GetItem(0)); PropertyValueInfo info; PropertyValueInfo::SetCacheInfo(&info, GetFunctionBody(), inlineCache, playout->inlineCacheIndex, true); Var value; @@ -4428,11 +4432,10 @@ namespace Js ScriptContext* scriptContext = GetScriptContext(); Var value = GetReg(playout->Value); - DynamicObject *obj; int length = pScope->GetLength(); if ( 1 == length ) { - obj = (DynamicObject*)pScope->GetItem(0); + RecyclableObject* obj = RecyclableObject::FromVar(pScope->GetItem(0)); PropertyValueInfo info; PropertyValueInfo::SetCacheInfo(&info, GetFunctionBody(), inlineCache, playout->inlineCacheIndex, true); if (CacheOperators::TrySetProperty( @@ -4487,18 +4490,15 @@ namespace Js } template - inline bool InterpreterStackFrame::TrySetPropertyLocalFastPath(unaligned T* playout, PropertyId pid, Var instance, InlineCache*& inlineCache, PropertyOperationFlags flags) + inline bool InterpreterStackFrame::TrySetPropertyLocalFastPath(unaligned T* playout, PropertyId pid, RecyclableObject* instance, InlineCache*& inlineCache, PropertyOperationFlags flags) { - Assert(!TaggedNumber::Is(instance)); - - RecyclableObject* obj = RecyclableObject::FromVar(instance); inlineCache = this->GetInlineCache(playout->inlineCacheIndex); PropertyValueInfo info; PropertyValueInfo::SetCacheInfo(&info, GetFunctionBody(), inlineCache, playout->inlineCacheIndex, true); return CacheOperators::TrySetProperty( - obj, + instance, !!(flags & PropertyOperation_Root), pid, GetReg(playout->Value), @@ -4517,7 +4517,7 @@ namespace Js InlineCache *inlineCache; if (!TaggedNumber::Is(instance) - && TrySetPropertyLocalFastPath(playout, propertyId, instance, inlineCache, flags)) + && TrySetPropertyLocalFastPath(playout, propertyId, RecyclableObject::UnsafeFromVar(instance), inlineCache, flags)) { if(GetJavascriptFunction()->GetConstructorCache()->NeedsUpdateAfterCtor()) { @@ -4794,7 +4794,7 @@ namespace Js Assert(!TaggedNumber::Is(instance)); PropertyId propertyId = GetPropertyIdFromCacheId(playout->inlineCacheIndex); - if (TrySetPropertyLocalFastPath(playout, propertyId, instance, inlineCache)) + if (TrySetPropertyLocalFastPath(playout, propertyId, RecyclableObject::UnsafeFromVar(instance), inlineCache)) { return; } @@ -4824,7 +4824,7 @@ namespace Js Assert(!TaggedNumber::Is(instance)); PropertyId propertyId = GetPropertyIdFromCacheId(playout->inlineCacheIndex); - if (!TrySetPropertyLocalFastPath(playout, propertyId, instance, inlineCache, flags)) + if (!TrySetPropertyLocalFastPath(playout, propertyId, RecyclableObject::UnsafeFromVar(instance), inlineCache, flags)) { JavascriptOperators::OP_InitClassMember(instance, propertyId, GetReg(playout->Value)); } @@ -4886,7 +4886,7 @@ namespace Js Assert(!TaggedNumber::Is(instance)); PropertyId propertyId = GetPropertyIdFromCacheId(playout->inlineCacheIndex); - if (!TrySetPropertyLocalFastPath(playout, propertyId, instance, inlineCache, flags)) + if (!TrySetPropertyLocalFastPath(playout, propertyId, RecyclableObject::UnsafeFromVar(instance), inlineCache, flags)) { JavascriptOperators::OP_InitLetProperty(instance, propertyId, GetReg(playout->Value)); } @@ -4900,7 +4900,7 @@ namespace Js Assert(!TaggedNumber::Is(instance)); PropertyId propertyId = GetPropertyIdFromCacheId(playout->inlineCacheIndex); - if (!TrySetPropertyLocalFastPath(playout, propertyId, instance, inlineCache, flags)) + if (!TrySetPropertyLocalFastPath(playout, propertyId, RecyclableObject::UnsafeFromVar(instance), inlineCache, flags)) { JavascriptOperators::OP_InitConstProperty(instance, propertyId, GetReg(playout->Value)); } @@ -5079,9 +5079,9 @@ namespace Js GetReg(playout->Element), m_functionBody, playout->profileId, - (m_flags & InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall) != 0)); + this->TestFlags(InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall))); - m_flags &= ~InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall; + this->ClearFlags(InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall); threadContext->CheckAndResetImplicitCallAccessorFlag(); threadContext->AddImplicitCallFlags(savedImplicitCallFlags); @@ -5106,7 +5106,7 @@ namespace Js { element = ProfilingHelpers::ProfiledLdElem_FastPath( - JavascriptArray::FromVar(instance), + JavascriptArray::UnsafeFromVar(instance), GetReg(playout->Element), GetScriptContext()); } @@ -5116,7 +5116,7 @@ namespace Js element = JavascriptOperators::OP_GetElementI(instance, GetReg(playout->Element), GetScriptContext()); } - m_flags &= ~InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall; + this->ClearFlags(InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall); threadContext->CheckAndResetImplicitCallAccessorFlag(); threadContext->AddImplicitCallFlags(savedImplicitCallFlags); @@ -5144,7 +5144,7 @@ namespace Js !JavascriptOperators::SetElementMayHaveImplicitCalls(GetScriptContext())) { ProfilingHelpers::ProfiledStElem_FastPath( - JavascriptArray::FromVar(instance), + JavascriptArray::UnsafeFromVar(instance), varIndex, value, GetScriptContext(), @@ -5156,7 +5156,7 @@ namespace Js JavascriptOperators::OP_SetElementI(instance, varIndex, value, GetScriptContext(), flags); } - m_flags &= ~InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall; + this->ClearFlags(InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall); threadContext->CheckAndResetImplicitCallAccessorFlag(); threadContext->AddImplicitCallFlags(savedImplicitCallFlags); @@ -5179,9 +5179,9 @@ namespace Js m_functionBody, playout->profileId, flags, - (m_flags & InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall) != 0); + this->TestFlags(InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall)); - m_flags &= ~InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall; + this->ClearFlags(InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall); threadContext->CheckAndResetImplicitCallAccessorFlag(); threadContext->AddImplicitCallFlags(savedImplicitCallFlags); @@ -5643,6 +5643,22 @@ namespace Js return true; } + template + const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) + { + uint32 loopId = m_reader.GetLayout>>(ip)->C1; + return OP_ProfiledLoopBodyStart(loopId); + } + +#ifdef ASMJS_PLAT + template + const byte * InterpreterStackFrame::OP_ProfiledWasmLoopBodyStart(const byte * ip) + { + uint32 loopId = m_reader.GetLayout>>(ip)->loopId; + return OP_ProfiledLoopBodyStart(loopId); + } +#endif + #if ENABLE_PROFILE_INFO void InterpreterStackFrame::OP_RecordImplicitCall(uint loopNumber) { @@ -5747,21 +5763,19 @@ namespace Js } template - const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) + const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(uint loopId) { - uint32 C1 = m_reader.GetLayout>>(ip)->C1; - - if(profiled || isAutoProfiling) + if (profiled || isAutoProfiling) { this->currentLoopCounter++; } if (profiled) { - OP_RecordImplicitCall(C1); + OP_RecordImplicitCall(loopId); } - (this->*(profiled ? opProfiledLoopBodyStart : opLoopBodyStart))(C1, layoutSize, false /* isFirstIteration */); + (this->*(profiled ? opProfiledLoopBodyStart : opLoopBodyStart))(loopId, layoutSize, false /* isFirstIteration */); return m_reader.GetIP(); } @@ -5823,17 +5837,12 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopEnd(const byte * ip) } template -const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) +const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(uint loopId) { - uint32 C1 = m_reader.GetLayout>>(ip)->C1; - Assert(!profiled); - - (this->*opLoopBodyStart)(C1, layoutSize, false /* isFirstIteration */); + (this->*opLoopBodyStart)(loopId, layoutSize, false /* isFirstIteration */); return m_reader.GetIP(); } - - #endif template @@ -5919,7 +5928,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) Assert(!this->IsInCatchOrFinallyBlock()); Js::LoopHeader *loopHeader = fn->GetLoopHeader(loopNumber); - loopHeader->isInTry = (this->m_flags & Js::InterpreterStackFrameFlags_WithinTryBlock); + loopHeader->isInTry = this->TestFlags(Js::InterpreterStackFrameFlags_WithinTryBlock); Js::LoopEntryPointInfo * entryPointInfo = loopHeader->GetCurrentEntryPointInfo(); @@ -6085,11 +6094,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) } else { - // we do not support this in asmjs, need to add support in IrBuilderAsmjs if we need this support for asmjs - if (!entryPointInfo->GetIsAsmJSFunction()) - { - this->CheckIfLoopIsHot(loopHeader->profiledLoopCounter); - } + this->CheckIfLoopIsHot(loopHeader->profiledLoopCounter); if (newOffset >= loopHeader->endOffset) { @@ -6126,6 +6131,13 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) } #if ENABLE_NATIVE_CODEGEN +#if ENABLE_OOP_NATIVE_CODEGEN + // If for some reason OOP JIT isn't connected (e.g. it crashed), don't attempt to JIT a loop body + if (JITManager::GetJITManager()->IsOOPJITEnabled() && !JITManager::GetJITManager()->IsConnected()) + { + return nullptr; + } +#endif // If the job is not scheduled then we need to schedule it now. // It is possible a job was scheduled earlier and we find ourselves looking at the same entry point // again. For example, if the function with the loop was JITed and bailed out then as we finish @@ -6516,7 +6528,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_ChkNewCallFlag() { - if (!(this->m_callFlags & CallFlags_New)) + if (!(this->m_callFlags & CallFlags_New) && !this->TestFlags(InterpreterStackFrameFlags_FromBailOutInInlinee)) { JavascriptError::ThrowTypeError(scriptContext, JSERR_ClassConstructorCannotBeCalledWithoutNew); } @@ -6557,10 +6569,11 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) { this->nestedTryDepth++; // mark the stackFrame as 'in try block' - this->m_flags |= InterpreterStackFrameFlags_WithinTryBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinTryBlock); Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { #if ENABLE_TTD @@ -6579,6 +6592,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->TrySetRetOffset(); } else +#endif { this->Process(); this->TrySetRetOffset(); @@ -6594,7 +6608,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) if (--this->nestedTryDepth == -1) { // unmark the stackFrame as 'in try block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinTryBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinTryBlock); } // Now that the stack is unwound, let's run the catch block. @@ -6633,14 +6647,14 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->nestedCatchDepth++; // mark the stackFrame as 'in catch block' - this->m_flags |= InterpreterStackFrameFlags_WithinCatchBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinCatchBlock); this->ProcessCatch(); if (--this->nestedCatchDepth == -1) { // unmark the stackFrame as 'in catch block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinCatchBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinCatchBlock); } } } @@ -6654,12 +6668,13 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->scriptContext->GetThreadContext()->TTDExecutionInfo->ProcessCatchInfoForLastExecutedStatements(); } #endif - +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { this->DebugProcess(); } else +#endif { this->Process(); } @@ -6670,11 +6685,13 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->nestedFinallyDepth++; int newOffset = 0; +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { newOffset = ::Math::PointerCastToIntegral(this->DebugProcess()); } else +#endif { newOffset = ::Math::PointerCastToIntegral(this->Process()); } @@ -6694,7 +6711,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) { this->nestedTryDepth++; // mark the stackFrame as 'in try block' - this->m_flags |= InterpreterStackFrameFlags_WithinTryBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinTryBlock); if (tryNestingDepth != 0) { @@ -6706,6 +6723,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); } +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { #if ENABLE_TTD @@ -6724,6 +6742,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->TrySetRetOffset(); } else +#endif { this->Process(); this->TrySetRetOffset(); @@ -6740,7 +6759,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) { this->nestedCatchDepth++; // mark the stackFrame as 'in catch block' - this->m_flags |= InterpreterStackFrameFlags_WithinCatchBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinCatchBlock); if (tryNestingDepth != 0) { @@ -6751,7 +6770,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) if (--this->nestedCatchDepth == -1) { // unmark the stackFrame as 'in catch block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinCatchBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinCatchBlock); } return; } @@ -6760,7 +6779,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) Assert(ehBailoutData->ht == HandlerType::HT_Finally); this->nestedFinallyDepth++; // mark the stackFrame as 'in finally block' - this->m_flags |= InterpreterStackFrameFlags_WithinFinallyBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinFinallyBlock); if (tryNestingDepth != 0) { @@ -6775,7 +6794,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) if (--this->nestedFinallyDepth == -1) { // unmark the stackFrame as 'in finally block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinFinallyBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinFinallyBlock); } // Finally exited with LeaveNull, We don't throw for early returns @@ -6794,7 +6813,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) if (--this->nestedTryDepth == -1) { // unmark the stackFrame as 'in try block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinTryBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinTryBlock); } // Now that the stack is unwound, let's run the catch block. @@ -6805,7 +6824,6 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) // Generator return scenario, so no need to go into the catch block and we must rethrow to propagate the exception to down level JavascriptExceptionOperators::DoThrow(exception, scriptContext); } - if (catchOffset != 0) { exception = exception->CloneIfStaticExceptionObject(scriptContext); @@ -6835,14 +6853,14 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->nestedCatchDepth++; // mark the stackFrame as 'in catch block' - this->m_flags |= InterpreterStackFrameFlags_WithinCatchBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinCatchBlock); this->ProcessCatch(); if (--this->nestedCatchDepth == -1) { // unmark the stackFrame as 'in catch block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinCatchBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinCatchBlock); } } else @@ -6856,7 +6874,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->nestedFinallyDepth++; // mark the stackFrame as 'in finally block' - this->m_flags |= InterpreterStackFrameFlags_WithinFinallyBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinFinallyBlock); LayoutSize layoutSize; OpCode finallyOp = m_reader.ReadOp(layoutSize); @@ -6876,7 +6894,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) if (--this->nestedFinallyDepth == -1) { // unmark the stackFrame as 'in finally block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinFinallyBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinFinallyBlock); } if (finallyEndOffset == 0) { @@ -6896,7 +6914,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->nestedFinallyDepth++; // mark the stackFrame as 'in finally block' - this->m_flags |= InterpreterStackFrameFlags_WithinFinallyBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinFinallyBlock); LayoutSize layoutSize; OpCode finallyOp = m_reader.ReadOp(layoutSize); @@ -6916,7 +6934,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) if (--this->nestedFinallyDepth == -1) { // unmark the stackFrame as 'in finally block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinFinallyBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinFinallyBlock); } if (finallyEndOffset == 0) { @@ -6928,7 +6946,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::TrySetRetOffset() { - Assert(this->m_flags & Js::InterpreterStackFrameFlags_WithinTryBlock); + Assert(this->TestFlags(Js::InterpreterStackFrameFlags_WithinTryBlock)); // It may happen that a JITted loop body returned the offset of RET. If the loop body was // called from a try, the interpreter "Process()" should also just return. if (this->retOffset != 0) @@ -6939,8 +6957,8 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) bool InterpreterStackFrame::IsInCatchOrFinallyBlock() { - return (this->m_flags & Js::InterpreterStackFrameFlags_WithinCatchBlock) || - (this->m_flags & Js::InterpreterStackFrameFlags_WithinFinallyBlock); + return this->TestFlags(Js::InterpreterStackFrameFlags_WithinCatchBlock) || + this->TestFlags(Js::InterpreterStackFrameFlags_WithinFinallyBlock); } void InterpreterStackFrame::OP_BeginBodyScope() @@ -6967,18 +6985,20 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_ResumeCatch() { - this->m_flags |= InterpreterStackFrameFlags_WithinCatchBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinCatchBlock); +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { this->DebugProcess(); } else +#endif { this->Process(); } - this->m_flags &= ~InterpreterStackFrameFlags_WithinCatchBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinCatchBlock); } /// --------------------------------------------------------------------------------------------------- @@ -6999,13 +7019,14 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) this->nestedTryDepth++; // mark the stackFrame as 'in try block' - this->m_flags |= InterpreterStackFrameFlags_WithinTryBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinTryBlock); if (shouldCacheSP) { CacheSp(); } +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { #if ENABLE_TTD @@ -7022,6 +7043,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) #endif } else +#endif { result = this->Process(); } @@ -7040,7 +7062,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) if (--this->nestedTryDepth == -1) { // unmark the stackFrame as 'in try block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinTryBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinTryBlock); } shouldCacheSP = !skipFinallyBlock; @@ -7069,6 +7091,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) pExceptionObject = pExceptionObject->CloneIfStaticExceptionObject(scriptContext); } +#ifdef ENABLE_SCRIPT_DEBUGGING if (pExceptionObject && this->IsInDebugMode() && pExceptionObject != scriptContext->GetThreadContext()->GetPendingSOErrorObject()) { @@ -7076,13 +7099,14 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) // (This appears to be the same behavior as ie8) pExceptionObject->SetDebuggerSkip(false); } +#endif // Call into the finally by setting the IP, consuming the Finally, and letting the interpreter recurse. m_reader.SetCurrentRelativeOffset(ip, jumpOffset); RestoreSp(); // mark the stackFrame as 'in finally block' - this->m_flags |= InterpreterStackFrameFlags_WithinFinallyBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinFinallyBlock); LayoutSize layoutSize; OpCode finallyOp = m_reader.ReadOp(layoutSize); @@ -7102,7 +7126,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) if (--this->nestedFinallyDepth == -1) { // unmark the stackFrame as 'in finally block' - this->m_flags &= ~InterpreterStackFrameFlags_WithinFinallyBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinFinallyBlock); } bool endOfFinallyBlock = newOffset == 0; @@ -7137,19 +7161,21 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_ResumeFinally(const byte* ip, Js::JumpOffset jumpOffset, RegSlot exceptionRegSlot, RegSlot offsetRegSlot) { - this->m_flags |= InterpreterStackFrameFlags_WithinFinallyBlock; + this->OrFlags(InterpreterStackFrameFlags_WithinFinallyBlock); int newOffset = 0; +#ifdef ENABLE_SCRIPT_DEBUGGING if (this->IsInDebugMode()) { newOffset = ::Math::PointerCastToIntegral(this->DebugProcess()); } else +#endif { newOffset = ::Math::PointerCastToIntegral(this->Process()); } - this->m_flags &= ~InterpreterStackFrameFlags_WithinFinallyBlock; + this->ClearFlags(InterpreterStackFrameFlags_WithinFinallyBlock); bool endOfFinallyBlock = newOffset == 0; if (endOfFinallyBlock) @@ -7690,11 +7716,13 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) JavascriptOperators::OP_InitClass(GetReg(playout->Constructor), playout->Extends != Js::Constants::NoRegister ? GetReg(playout->Extends) : NULL, GetScriptContext()); } +#ifdef ENABLE_SCRIPT_DEBUGGING template void InterpreterStackFrame::OP_EmitTmpRegCount(const unaligned OpLayoutT_Unsigned1 * playout) { this->scriptContext->GetDebugContext()->GetProbeContainer()->SetCurrentTmpRegCount(playout->C1); } +#endif Var InterpreterStackFrame::OP_LdHomeObj(ScriptContext * scriptContext) { @@ -7834,6 +7862,26 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) return m_localInt64Slots[localRegisterID]; } + template + void* InterpreterStackFrame::GetRegRawPtr(RegSlotType localRegisterID) const + { +#if TARGET_32 + return (void*)m_localIntSlots[localRegisterID]; +#elif TARGET_64 + return (void*)m_localInt64Slots[localRegisterID]; +#endif + } + + template + void InterpreterStackFrame::SetRegRawPtr(RegSlotType localRegisterID, void* val) + { +#if TARGET_32 + m_localIntSlots[localRegisterID] = (int32)val; +#elif TARGET_64 + m_localInt64Slots[localRegisterID] = (int64)val; +#endif + } + template void InterpreterStackFrame::SetRegRawInt64(RegSlotType localRegisterID, int64 bValue) { @@ -7939,7 +7987,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) int InterpreterStackFrame::OP_GetMemorySize() { #ifdef ENABLE_WASM - return (int)m_wasmMemory->GetCurrentMemoryPages(); + return (int)GetWebAssemblyMemory()->GetCurrentMemoryPages(); #else Assert(UNREACHED); return 0; @@ -7949,7 +7997,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) int InterpreterStackFrame::OP_GrowMemory(int32 delta) { #ifdef ENABLE_WASM - return m_wasmMemory->GrowInternal((uint32)delta); + return GetWebAssemblyMemory()->GrowInternal((uint32)delta); #else Assert(UNREACHED); return 0; @@ -8005,13 +8053,18 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_SimdLdArrGeneric(const unaligned T* playout) { Assert(playout->ViewType < Js::ArrayBufferView::TYPE_COUNT); - AssertMsg(!m_functionBody->IsWasmFunction(), "Do not use AsmJsFunctionMemory::ArrayBufferRegister for Wasm, Use WebAssemblyMemory directly instead"); - const uint64 index = (uint32)GetRegRawInt(playout->SlotIndex) & ArrayBufferView::ViewMask[playout->ViewType]; - JavascriptArrayBuffer* arr = *(JavascriptArrayBuffer**)GetNonVarReg(AsmJsFunctionMemory::ArrayBufferRegister); + const uint64 index = ((uint64)(uint32)GetRegRawInt(playout->SlotIndex) + playout->Offset /* WASM only */) & (int64)(int)ArrayBufferView::ViewMask[playout->ViewType]; + + JavascriptArrayBuffer* arr = +#ifdef ENABLE_WASM_SIMD + (m_functionBody->IsWasmFunction()) ? + m_wasmMemory->GetBuffer() : +#endif + GetAsmJsBuffer(); + BYTE* buffer = arr->GetBuffer(); uint8 dataWidth = playout->DataWidth; RegSlot dstReg = playout->Value; - if (index + dataWidth > arr->GetByteLength()) { JavascriptError::ThrowRangeError(scriptContext, JSERR_ArgumentOutOfRange, _u("Simd typed array access")); @@ -8027,9 +8080,8 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_SimdLdArrConstIndex(const unaligned T* playout) { Assert(playout->ViewType < Js::ArrayBufferView::TYPE_COUNT); - AssertMsg(!m_functionBody->IsWasmFunction(), "Do not use AsmJsFunctionMemory::ArrayBufferRegister for Wasm, Use WebAssemblyMemory directly instead"); const uint64 index = (uint32)playout->SlotIndex; - JavascriptArrayBuffer* arr = *(JavascriptArrayBuffer**)GetNonVarReg(AsmJsFunctionMemory::ArrayBufferRegister); + JavascriptArrayBuffer* arr = GetAsmJsBuffer(); BYTE* buffer = arr->GetBuffer(); uint8 dataWidth = playout->DataWidth; RegSlot dstReg = playout->Value; @@ -8049,9 +8101,15 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_SimdStArrGeneric(const unaligned T* playout) { Assert(playout->ViewType < Js::ArrayBufferView::TYPE_COUNT); - AssertMsg(!m_functionBody->IsWasmFunction(), "Do not use AsmJsFunctionMemory::ArrayBufferRegister for Wasm, Use WebAssemblyMemory directly instead"); - const uint64 index = (uint32)GetRegRawInt(playout->SlotIndex) & ArrayBufferView::ViewMask[playout->ViewType]; - JavascriptArrayBuffer* arr = *(JavascriptArrayBuffer**)GetNonVarReg(AsmJsFunctionMemory::ArrayBufferRegister); + const uint64 index = ((uint64)(uint32)GetRegRawInt(playout->SlotIndex) + playout->Offset /* WASM only */) & (int64)(int)ArrayBufferView::ViewMask[playout->ViewType]; + + JavascriptArrayBuffer* arr = +#ifdef ENABLE_WASM_SIMD + (m_functionBody->IsWasmFunction()) ? + m_wasmMemory->GetBuffer() : +#endif + GetAsmJsBuffer(); + BYTE* buffer = arr->GetBuffer(); uint8 dataWidth = playout->DataWidth; RegSlot srcReg = playout->Value; @@ -8069,9 +8127,8 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_SimdStArrConstIndex(const unaligned T* playout) { Assert(playout->ViewType < Js::ArrayBufferView::TYPE_COUNT); - AssertMsg(!m_functionBody->IsWasmFunction(), "Do not use AsmJsFunctionMemory::ArrayBufferRegister for Wasm, Use WebAssemblyMemory directly instead"); const uint64 index = (uint32)playout->SlotIndex; - JavascriptArrayBuffer* arr = *(JavascriptArrayBuffer**)GetNonVarReg(AsmJsFunctionMemory::ArrayBufferRegister); + JavascriptArrayBuffer* arr = GetAsmJsBuffer(); BYTE* buffer = arr->GetBuffer(); uint8 dataWidth = playout->DataWidth; RegSlot srcReg = playout->Value; @@ -8086,13 +8143,33 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) } + + bool InterpreterStackFrame::SIMDAnyNaN(AsmJsSIMDValue& input) + { + if (!GetFunctionBody()->IsWasmFunction()) + { + return false; + } + + AsmJsSIMDValue compResult = SIMDFloat32x4Operation::OpEqual(input, input); + return !SIMDBool32x4Operation::OpAllTrue(compResult); + } + // handler for SIMD.Int32x4.FromFloat32x4 template void InterpreterStackFrame::OP_SimdInt32x4FromFloat32x4(const unaligned T* playout) { bool throws = false; AsmJsSIMDValue input = GetRegRawSimd(playout->F4_1); - AsmJsSIMDValue result = SIMDInt32x4Operation::OpFromFloat32x4(input, throws); + AsmJsSIMDValue result{ 0 }; + +#ifdef ENABLE_WASM_SIMD + throws = SIMDAnyNaN(input); + if (!throws) +#endif + { + result = SIMDInt32x4Operation::OpFromFloat32x4(input, throws); + } // value is out of bound if (throws) @@ -8107,9 +8184,16 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) { bool throws = false; AsmJsSIMDValue input = GetRegRawSimd(playout->F4_1); - AsmJsSIMDValue result = SIMDUint32x4Operation::OpFromFloat32x4(input, throws); + AsmJsSIMDValue result{ 0 }; + +#ifdef ENABLE_WASM_SIMD + throws = SIMDAnyNaN(input); + if (!throws) +#endif + { + result = SIMDUint32x4Operation::OpFromFloat32x4(input, throws); + } - // value is out of bound if (throws) { JavascriptError::ThrowRangeError(scriptContext, JSERR_ArgumentOutOfRange, _u("SIMD.Int32x4.FromFloat32x4")); @@ -8117,6 +8201,25 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) SetRegRawSimd(playout->U4_0, result); } + template + void InterpreterStackFrame::OP_WasmSimdConst(const unaligned T* playout) + { + AsmJsSIMDValue result{ playout->C1, playout->C2, playout->C3, playout->C4 }; + SetRegRawSimd(playout->F4_0, result); + } + + template + void InterpreterStackFrame::OP_SimdShuffleV8X16(const unaligned T* playout) + { + uint32 lanes[Wasm::Simd::MAX_LANES]; + for (uint32 i = 0; i < Wasm::Simd::MAX_LANES; i++) + { + Assert(playout->INDICES[i] < Wasm::Simd::MAX_LANES * 2); + lanes[i] = playout->INDICES[i]; + } + SetRegRawSimd(playout->R0, SIMDUtils::SIMD128InnerShuffle(GetRegRawSimd(playout->R1), GetRegRawSimd(playout->R2), Wasm::Simd::MAX_LANES, lanes)); + } + template void InterpreterStackFrame::OP_SimdInt16x8(const unaligned T* playout) { @@ -8458,9 +8561,9 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) template void InterpreterStackFrame::OP_LdNewTarget(const unaligned T* playout) { - if (this->m_callFlags & CallFlags_NewTarget) + if (Js::CallInfo::HasNewTarget(this->m_callFlags)) { - SetRegAllowStackVar(playout->R0, (Js::RecyclableObject*)this->m_inParams[this->m_inSlotsCount]); + SetRegAllowStackVar(playout->R0, (Js::RecyclableObject*)Js::CallInfo::GetNewTarget(this->m_callFlags, this->m_inParams, (ArgSlot)this->m_inSlotsCount)); } else if (this->m_callFlags & CallFlags_New) { @@ -8512,8 +8615,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_StArr(uint32 index, RegSlot regSlot) { CompileAssert(Js::ArrayBufferView::TYPE_COUNT == (sizeof(InterpreterStackFrame::StArrFunc) / sizeof(InterpreterStackFrame::ArrFunc))); - AssertMsg(!m_functionBody->IsWasmFunction(), "Do not use AsmJsFunctionMemory::ArrayBufferRegister for Wasm, Use WebAssemblyMemory directly instead"); - JavascriptArrayBuffer* arr = *(JavascriptArrayBuffer**)GetNonVarReg(AsmJsFunctionMemory::ArrayBufferRegister); + JavascriptArrayBuffer* arr = GetAsmJsBuffer(); if (index < arr->GetByteLength()) { BYTE* buffer = arr->GetBuffer(); @@ -8540,16 +8642,16 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) template void InterpreterStackFrame::OP_LdArrFunc(const unaligned T* playout) { - Var* arr = (Var*)GetNonVarReg(playout->Instance); + Var* arr = (Var*)GetRegRawPtr(playout->Instance); const uint32 index = (uint32)GetRegRawInt(playout->SlotIndex); - m_localSlots[playout->Value] = arr[index]; + SetRegRawPtr(playout->Value, arr[index]); } template void InterpreterStackFrame::OP_LdArrWasmFunc(const unaligned T* playout) { #ifdef ENABLE_WASM - WebAssemblyTable * table = WebAssemblyTable::FromVar(GetNonVarReg(playout->Instance)); + WebAssemblyTable * table = WebAssemblyTable::FromVar(GetRegRawPtr(playout->Instance)); const uint32 index = (uint32)GetRegRawInt(playout->SlotIndex); if (index >= table->GetCurrentLength()) { @@ -8560,7 +8662,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) { JavascriptError::ThrowWebAssemblyRuntimeError(GetScriptContext(), WASMERR_NeedWebAssemblyFunc); } - m_localSlots[playout->Value] = func; + SetRegRawPtr(playout->Value, func); #endif } @@ -8568,7 +8670,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_CheckSignature(const unaligned T* playout) { #ifdef ENABLE_WASM - ScriptFunction * func = ScriptFunction::FromVar(GetNonVarReg(playout->R0)); + ScriptFunction * func = ScriptFunction::FromVar(GetRegRawPtr(playout->R0)); int sigIndex = playout->C1; Wasm::WasmSignature * expected = &m_signatures[sigIndex]; if (func->GetFunctionInfo()->IsDeferredParseFunction()) @@ -8594,8 +8696,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) void InterpreterStackFrame::OP_LdArr(uint32 index, RegSlot regSlot) { CompileAssert(Js::ArrayBufferView::TYPE_COUNT == (sizeof(InterpreterStackFrame::LdArrFunc) / sizeof(InterpreterStackFrame::ArrFunc))); - AssertMsg(!m_functionBody->IsWasmFunction(), "Do not use AsmJsFunctionMemory::ArrayBufferRegister for Wasm, Use WebAssemblyMemory directly instead"); - JavascriptArrayBuffer* arr = *(JavascriptArrayBuffer**)GetNonVarReg(AsmJsFunctionMemory::ArrayBufferRegister); + JavascriptArrayBuffer* arr = GetAsmJsBuffer(); BYTE* buffer = arr->GetBuffer(); ArrayType val = index < (arr->GetByteLength()) ? *(ArrayType*)(buffer + index) : GetArrayViewOverflowVal(); SetRegRaw(regSlot, (RegType)val); @@ -8610,9 +8711,10 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) } template - Var InterpreterStackFrame::OP_LdAsmJsSlot(Var instance, const unaligned T* playout) + void InterpreterStackFrame::OP_LdAsmJsSlot(const unaligned T* playout) { - return ((Var*)instance)[playout->SlotIndex]; + Var * slotArray = (Var*)GetNonVarReg(playout->Instance); + SetRegRawPtr(playout->Value, slotArray[playout->SlotIndex]); } template @@ -8636,7 +8738,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) #ifdef ENABLE_WASM Assert(playout->ViewType < Js::ArrayBufferView::TYPE_COUNT); const uint64 index = playout->Offset + (uint64)(uint32)GetRegRawInt(playout->SlotIndex); - WebAssemblyArrayBuffer* arr = m_wasmMemory->GetBuffer(); + WebAssemblyArrayBuffer* arr = GetWebAssemblyMemory()->GetBuffer(); if (index + TypeToSizeMap[playout->ViewType] > arr->GetByteLength()) { JavascriptError::ThrowWebAssemblyRuntimeError(scriptContext, WASMERR_ArrayIndexOutOfRange); @@ -8687,7 +8789,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) #ifdef ENABLE_WASM Assert(playout->ViewType < Js::ArrayBufferView::TYPE_COUNT); const uint64 index = playout->Offset + (uint64)(uint32)GetRegRawInt(playout->SlotIndex); - WebAssemblyArrayBuffer* arr = m_wasmMemory->GetBuffer(); + WebAssemblyArrayBuffer* arr = GetWebAssemblyMemory()->GetBuffer(); if (index + TypeToSizeMap[playout->ViewType] > arr->GetByteLength()) { JavascriptError::ThrowWebAssemblyRuntimeError(scriptContext, WASMERR_ArrayIndexOutOfRange); @@ -8716,7 +8818,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) #if DBG if (PHASE_TRACE(WasmMemWritesPhase, m_functionBody)) { - m_wasmMemory->TraceMemWrite(m_wasmMemory, (uint32)GetRegRawInt(playout->SlotIndex), playout->Offset, playout->ViewType, (uint32)(size_t)this->DEBUG_currentByteOffset, scriptContext); + GetWebAssemblyMemory()->TraceMemWrite(GetWebAssemblyMemory(), (uint32)GetRegRawInt(playout->SlotIndex), playout->Offset, playout->ViewType, (uint32)(size_t)this->DEBUG_currentByteOffset, scriptContext); } #endif return; @@ -8863,7 +8965,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) return JavascriptOperators::OP_LdModuleSlot(playout->SlotIndex1, playout->SlotIndex2, scriptContext); } - inline void InterpreterStackFrame::OP_StModuleSlot(Var instance, int32 slotIndex1, int32 slotIndex2, Var value) + inline void InterpreterStackFrame::OP_StModuleSlot(Var instance, uint32 slotIndex1, uint32 slotIndex2, Var value) { JavascriptOperators::OP_StModuleSlot(slotIndex1, slotIndex2, value, scriptContext); } @@ -9172,6 +9274,20 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) #endif } + JavascriptArrayBuffer* InterpreterStackFrame::GetAsmJsBuffer() const + { + AssertMsg(!m_functionBody->IsWasmFunction(), "Do not use GetAsmJsBuffer for WebAssembly, Use GetWebAssemblyMemory instead"); + return m_asmJsBuffer; + } + +#ifdef ENABLE_WASM + WebAssemblyMemory* InterpreterStackFrame::GetWebAssemblyMemory() const + { + AssertMsg(m_functionBody->IsWasmFunction(), "Do not use GetWebAssemblyMemory for Asm.js, Use GetAsmJsBuffer instead"); + return m_wasmMemory; + } +#endif + template void* Js::InterpreterStackFrame::GetReg(unsigned int) const; template void Js::InterpreterStackFrame::SetReg(unsigned int, void*); } // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.h b/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.h index 1ec9ab2384e..d936c521185 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.h +++ b/deps/chakrashim/core/lib/Runtime/Language/InterpreterStackFrame.h @@ -27,6 +27,7 @@ namespace Js InterpreterStackFrameFlags_FromBailOut = 8, InterpreterStackFrameFlags_ProcessingBailOutOnArrayAccessHelperCall = 0x10, InterpreterStackFrameFlags_ProcessingBailOutFromEHCode = 0x20, + InterpreterStackFrameFlags_FromBailOutInInlinee = 0x40, InterpreterStackFrameFlags_All = 0xFFFF, }; @@ -51,9 +52,9 @@ namespace Js InterpreterStackFrame * AllocateAndInitialize(bool doProfile, bool * releaseAlloc); #if DBG - InterpreterStackFrame * InitializeAllocation(__in_ecount(varAllocCount) Var * allocation, bool initParams, bool profileParams, Var loopHeaderArray, DWORD_PTR stackAddr, Var invalidStackVar); + InterpreterStackFrame * InitializeAllocation(__in_ecount(varAllocCount) Var * allocation, bool initParams, bool profileParams, LoopHeader* loopHeaderArray, DWORD_PTR stackAddr, Var invalidStackVar); #else - InterpreterStackFrame * InitializeAllocation(__in_ecount(varAllocCount) Var * allocation, bool initParams, bool profileParams, Var loopHeaderArray, DWORD_PTR stackAddr); + InterpreterStackFrame * InitializeAllocation(__in_ecount(varAllocCount) Var * allocation, bool initParams, bool profileParams, LoopHeader* loopHeaderArray, DWORD_PTR stackAddr); #endif uint GetLocalCount() const { return localCount; } @@ -118,7 +119,7 @@ namespace Js void * returnAddress; void * addressOfReturnAddress; // Tag this frame with stack position, used by (remote) stack walker to test partially initialized interpreter stack frame. InterpreterStackFrame *previousInterpreterFrame; - Var loopHeaderArray; // Keeps alive any JITted loop bodies while the function is being interpreted + LoopHeader* loopHeaderArray; // Keeps alive any JITted loop bodies while the function is being interpreted // 'stack address' of the frame, used for recursion detection during stepping. // For frames created via interpreter path, we use 'this', for frames created by bailout we use stack addr of actual jitted frame @@ -157,16 +158,25 @@ namespace Js #if DBG || DBG_DUMP void * DEBUG_currentByteOffset; #endif +#if DBG + Var* m_outParamsEnd; +#endif // Asm.js stack pointer int* m_localIntSlots; int64* m_localInt64Slots; double* m_localDoubleSlots; float* m_localFloatSlots; + union + { + JavascriptArrayBuffer* m_asmJsBuffer; +#ifdef ENABLE_WASM + WebAssemblyMemory * m_wasmMemory; +#endif + }; #ifdef ENABLE_WASM Wasm::WasmSignature* m_signatures; - WebAssemblyMemory * m_wasmMemory; #endif _SIMDValue* m_localSimdSlots; @@ -187,6 +197,10 @@ namespace Js //This class must have an empty ctor (otherwise it will break the code in InterpreterStackFrame::InterpreterThunk inline InterpreterStackFrame() { } + JavascriptArrayBuffer* GetAsmJsBuffer() const; +#ifdef ENABLE_WASM + WebAssemblyMemory* GetWebAssemblyMemory() const; +#endif void ProcessTryFinally(const byte* ip, Js::JumpOffset jumpOffset, Js::RegSlot regException = Js::Constants::NoRegister, Js::RegSlot regOffset = Js::Constants::NoRegister, bool hasYield = false); public: void OP_SetOutAsmInt(RegSlot outRegisterID, int val); @@ -197,7 +211,7 @@ namespace Js void OP_I_SetOutAsmFlt(RegSlot outRegisterID, float val); void OP_I_SetOutAsmLong(RegSlot outRegisterID, int64 val); void OP_I_SetOutAsmSimd(RegSlot outRegisterID, AsmJsSIMDValue val); - template + template //type is int to avoid including Wasm headers void OP_InvalidWasmTypeConversion(...); void OP_WasmPrintFunc(int index); template void OP_WasmPrintFunc(const unaligned T* playout) { OP_WasmPrintFunc((int)playout->I1); } @@ -232,6 +246,8 @@ namespace Js template void SetRegRawInt( RegSlotType localRegisterID, int bValue ); template int64 GetRegRawInt64( RegSlotType localRegisterID ) const; template void SetRegRawInt64( RegSlotType localRegisterID, int64 bValue ); + template void* GetRegRawPtr(RegSlotType localRegisterID) const; + template void SetRegRawPtr(RegSlotType localRegisterID, void* val); template double VECTORCALL GetRegRawDouble(RegSlotType localRegisterID) const; template float VECTORCALL GetRegRawFloat(RegSlotType localRegisterID) const; template void SetRegRawDouble(RegSlotType localRegisterID, double bValue); @@ -241,12 +257,16 @@ namespace Js template AsmJsSIMDValue GetRegRawSimd(RegSlotType localRegisterID) const; template void SetRegRawSimd(RegSlotType localRegisterID, AsmJsSIMDValue bValue); + template void OP_SimdLdArrGeneric(const unaligned T* playout); template void OP_SimdLdArrConstIndex(const unaligned T* playout); template void OP_SimdStArrGeneric(const unaligned T* playout); template void OP_SimdStArrConstIndex(const unaligned T* playout); + bool SIMDAnyNaN(AsmJsSIMDValue& input); template void OP_SimdInt32x4FromFloat32x4(const unaligned T* playout); template void OP_SimdUint32x4FromFloat32x4(const unaligned T* playout); + template void OP_WasmSimdConst(const unaligned T* playout); + template void OP_SimdShuffleV8X16(const unaligned T* playout); template void OP_SimdInt16x8(const unaligned T* playout); template void OP_SimdInt8x16(const unaligned T* playout); @@ -276,6 +296,8 @@ namespace Js void SetArgumentsObject(Var args) { m_arguments = args; } UINT16 GetFlags() const { return m_flags; } void OrFlags(UINT16 addTo) { m_flags |= addTo; } + void ClearFlags(UINT16 flags) { m_flags &= ~flags; } + bool TestFlags(UINT16 flags) { return (m_flags & flags) != 0; } bool IsInCatchOrFinallyBlock(); static bool IsDelayDynamicInterpreterThunk(JavascriptMethod entryPoint); @@ -321,8 +343,7 @@ namespace Js static int GetRetType(JavascriptFunction* func); static int GetAsmJsArgSize(AsmJsCallStackLayout * stack); static int GetDynamicRetType(AsmJsCallStackLayout * stack); - static DWORD GetAsmJsReturnValueOffset(AsmJsCallStackLayout * stack); - _NOINLINE static int AsmJsInterpreter(AsmJsCallStackLayout * stack); + _NOINLINE static void AsmJsInterpreter(AsmJsCallStackLayout * stack, byte* retDst); #elif _M_X64 template static T AsmJsInterpreter(AsmJsCallStackLayout* layout); @@ -347,6 +368,11 @@ namespace Js _NOINLINE static Var InterpreterThunk(RecyclableObject* function, CallInfo callInfo, ...); #endif static Var InterpreterHelper(ScriptFunction* function, ArgumentReader args, void* returnAddress, void* addressOfReturnAddress, AsmJsReturnStruct* asmReturn = nullptr); + static const bool ShouldDoProfile(FunctionBody* executeFunction); + static InterpreterStackFrame* CreateInterpreterStackFrameForGenerator(ScriptFunction* function, FunctionBody* executeFunction, JavascriptGenerator* generator, bool doProfile); + + void InitializeClosures(); + private: #if DYNAMIC_INTERPRETER_THUNK static JavascriptMethod EnsureDynamicInterpreterThunk(Js::ScriptFunction * function); @@ -403,8 +429,11 @@ namespace Js const byte* ProcessWithDebuggingExtendedLargeLayoutPrefix(const byte* ip); const byte* ProcessAsmJsExtendedLargeLayoutPrefix(const byte* ip); +#ifdef ENABLE_SCRIPT_DEBUGGING Var ProcessWithDebugging(); Var DebugProcess(); + bool IsInDebugMode() const { return this->GetFunctionBody()->IsInDebugMode(); } +#endif #if ENABLE_TTD Var ProcessWithDebugging_PreviousStmtTracking(); @@ -423,9 +452,6 @@ namespace Js const byte* ProcessUnprofiled_PreviousStmtTrackingExtendedLargeLayoutPrefix(const byte* ip); #endif #endif - - bool IsInDebugMode() const { return this->GetFunctionBody()->IsInDebugMode(); } - // This will be called for reseting outs when resume from break on error happened void ResetOut(); @@ -456,35 +482,38 @@ namespace Js void OP_StartCall( const unaligned OpLayoutStartCall * playout ); void OP_StartCall(uint outParamCount); template void OP_CallCommon(const unaligned T *playout, RecyclableObject * aFunc, unsigned flags, const Js::AuxArray *spreadIndices = nullptr); - void OP_CallAsmInternal( RecyclableObject * function); - template void OP_I_AsmCall(const unaligned T* playout) { OP_CallAsmInternal((ScriptFunction*)OP_CallGetFunc(GetRegAllowStackVar(playout->Function))); } + void OP_CallAsmInternalCommon(ScriptFunction* function, RegSlot returnReg); + void OP_CallAsmInternal(RegSlot funcReg, RegSlot returnReg); + template void OP_I_AsmCall(const unaligned T* playout) { OP_CallAsmInternal(playout->Function, playout->Return); } + void OP_ProfiledCallAsmInternal(RegSlot funcReg, RegSlot returnReg, ProfileId profileId); + template void OP_ProfiledI_AsmCall(const unaligned T* playout) { OP_ProfiledCallAsmInternal(playout->Function, playout->Return, playout->profileId); } template void OP_CallCommonI(const unaligned T *playout, RecyclableObject * aFunc, unsigned flags); template void OP_ProfileCallCommon(const unaligned T *playout, RecyclableObject * aFunc, unsigned flags, ProfileId profileId, InlineCacheIndex inlineCacheIndex = Js::Constants::NoInlineCacheIndex, const Js::AuxArray *spreadIndices = nullptr); template void OP_ProfileReturnTypeCallCommon(const unaligned T *playout, RecyclableObject * aFunc, unsigned flags, ProfileId profileId, const Js::AuxArray *spreadIndices = nullptr); - template void OP_CallPutCommon(const unaligned T *playout, RecyclableObject * aFunc); - template void OP_CallPutCommonI(const unaligned T *playout, RecyclableObject * aFunc); template void OP_AsmCall(const unaligned T* playout); template void OP_EnsureHeapAttached(const unaligned T* playout); - template void OP_CallI(const unaligned T* playout, unsigned flags) { OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags); } - template void OP_CallIExtended(const unaligned T* playout, unsigned flags) { OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_CallIExtendedFlags(const unaligned T* playout, unsigned flags) { OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags | playout->callFlags, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_CallIFlags(const unaligned T* playout, unsigned flags) { playout->callFlags == Js::CallFlags::CallFlags_NewTarget ? OP_CallPutCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function))) : OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags | playout->callFlags); } + template void OP_CallI(const unaligned T* playout) { OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), Js::CallFlags_None); } + template void OP_CallIFlags(const unaligned T* playout) { OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), playout->callFlags); } + template void OP_CallIExtended(const unaligned T* playout) { OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), Js::CallFlags_None, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } + template void OP_CallIExtendedFlags(const unaligned T* playout) { OP_CallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), playout->callFlags, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_ProfiledCallI(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags, playout->profileId); } - template void OP_ProfiledCallIExtended(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags, playout->profileId, Js::Constants::NoInlineCacheIndex, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_ProfiledCallIExtendedFlags(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags | playout->callFlags, playout->profileId, Js::Constants::NoInlineCacheIndex, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_ProfiledCallIWithICIndex(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags, playout->profileId, playout->inlineCacheIndex); } - template void OP_ProfiledCallIExtendedWithICIndex(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags, playout->profileId, playout->inlineCacheIndex, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_ProfiledCallIExtendedFlagsWithICIndex(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags | playout->callFlags, playout->profileId, playout->inlineCacheIndex, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_ProfiledCallIFlags(const unaligned T* playout, unsigned flags) { playout->callFlags == Js::CallFlags::CallFlags_NewTarget ? OP_CallPutCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function))) : OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags | playout->callFlags, playout->profileId); } + template void OP_ProfiledCallI(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), Js::CallFlags_None, playout->profileId); } + template void OP_ProfiledCallIFlags(const unaligned T* playout) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), playout->callFlags, playout->profileId); } + template void OP_ProfiledCallIExtended(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), Js::CallFlags_None, playout->profileId, Js::Constants::NoInlineCacheIndex, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } + template void OP_ProfiledCallIExtendedFlags(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), playout->callFlags, playout->profileId, Js::Constants::NoInlineCacheIndex, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_ProfiledReturnTypeCallI(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileReturnTypeCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags, playout->profileId); } - template void OP_ProfiledReturnTypeCallIExtended(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileReturnTypeCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags, playout->profileId, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_ProfiledReturnTypeCallIExtendedFlags(const unaligned OpLayoutDynamicProfile* playout, unsigned flags) { OP_ProfileReturnTypeCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags | playout->callFlags, playout->profileId, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } - template void OP_ProfiledReturnTypeCallIFlags(const unaligned T* playout, unsigned flags) { playout->callFlags == Js::CallFlags::CallFlags_NewTarget ? OP_CallPutCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function))) : OP_ProfileReturnTypeCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), flags | playout->callFlags, playout->profileId); } + template void OP_ProfiledCallIWithICIndex(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), Js::CallFlags_None, playout->profileId, playout->inlineCacheIndex); } + template void OP_ProfiledCallIFlagsWithICIndex(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), playout->callFlags, playout->profileId, playout->inlineCacheIndex); } + template void OP_ProfiledCallIExtendedWithICIndex(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), Js::CallFlags_None, playout->profileId, playout->inlineCacheIndex, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } + template void OP_ProfiledCallIExtendedFlagsWithICIndex(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), playout->callFlags, playout->profileId, playout->inlineCacheIndex, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } + + template void OP_ProfiledReturnTypeCallI(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileReturnTypeCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), Js::CallFlags_None, playout->profileId); } + template void OP_ProfiledReturnTypeCallIFlags(const unaligned T* playout) { OP_ProfileReturnTypeCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), playout->callFlags, playout->profileId); } + template void OP_ProfiledReturnTypeCallIExtended(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileReturnTypeCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), Js::CallFlags_None, playout->profileId, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } + template void OP_ProfiledReturnTypeCallIExtendedFlags(const unaligned OpLayoutDynamicProfile* playout) { OP_ProfileReturnTypeCallCommon(playout, OP_CallGetFunc(GetRegAllowStackVar(playout->Function)), playout->callFlags, playout->profileId, (playout->Options & CallIExtended_SpreadArgs) ? m_reader.ReadAuxArray(playout->SpreadAuxOffset, this->GetFunctionBody()) : nullptr); } // Patching Fastpath Operations template void OP_GetRootProperty(unaligned T* playout); @@ -572,7 +601,7 @@ namespace Js template void DoInitProperty_NoFastPath(unaligned T* playout, Var instance); template void ProfiledInitProperty(unaligned T* playout, Var instance); - template bool TrySetPropertyLocalFastPath(unaligned T* playout, PropertyId pid, Var instance, InlineCache*& inlineCache, PropertyOperationFlags flags = PropertyOperation_None); + template bool TrySetPropertyLocalFastPath(unaligned T* playout, PropertyId pid, RecyclableObject* instance, InlineCache*& inlineCache, PropertyOperationFlags flags = PropertyOperation_None); template Var ProfiledDivide(Var aLeft, Var aRight, ScriptContext* scriptContext, ProfileId profileId); template Var ProfileModulus(Var aLeft, Var aRight, ScriptContext* scriptContext, ProfileId profileId); @@ -651,7 +680,7 @@ namespace Js template inline void OP_CheckSignature(const unaligned T* playout); template T GetArrayViewOverflowVal(); template inline void OP_StArr( uint32 index, RegSlot value ); - template inline Var OP_LdAsmJsSlot(Var instance, const unaligned T* playout ); + template inline void OP_LdAsmJsSlot(const unaligned T* playout ); template inline void OP_StSlotPrimitive(const unaligned T* playout); template inline void OP_LdSlotPrimitive( const unaligned T* playout ); template inline void OP_LdArrGeneric ( const unaligned T* playout ); @@ -677,7 +706,7 @@ namespace Js template inline Var OP_LdEnvObjSlot(Var instance, const unaligned T* playout); template inline Var OP_ProfiledLdEnvObjSlot(Var instance, const unaligned T* playout); template inline Var OP_LdModuleSlot(Var instance, const unaligned T* playout); - inline void OP_StModuleSlot(Var instance, int32 slotIndex1, int32 slotIndex2, Var value); + inline void OP_StModuleSlot(Var instance, uint32 slotIndex1, uint32 slotIndex2, Var value); inline void OP_StSlot(Var instance, int32 slotIndex, Var value); inline void OP_StSlotChkUndecl(Var instance, int32 slotIndex, Var value); inline void OP_StEnvSlot(Var instance, int32 slotIndex1, int32 slotIndex2, Var value); @@ -686,7 +715,6 @@ namespace Js inline void OP_StObjSlotChkUndecl(Var instance, int32 slotIndex, Var value); inline void OP_StEnvObjSlot(Var instance, int32 slotIndex1, int32 slotIndex2, Var value); inline void OP_StEnvObjSlotChkUndecl(Var instance, int32 slotIndex1, int32 slotIndex2, Var value); - inline void OP_StModuleSlot(Var instance, int32 slotIndex1, int32 slotIndex2); inline void* OP_LdArgCnt(); template Var LdHeapArgumentsImpl(Var argsArray, ScriptContext* scriptContext); Var OP_LdHeapArguments(ScriptContext* scriptContext); @@ -745,7 +773,9 @@ namespace Js void OP_SpreadArrayLiteral(const unaligned OpLayoutReg2Aux * playout); template const byte * OP_ProfiledLoopStart(const byte *ip); template const byte * OP_ProfiledLoopEnd(const byte *ip); - template const byte * OP_ProfiledLoopBodyStart(const byte *ip); + template const byte * OP_ProfiledLoopBodyStart(const byte *ip); + template const byte * OP_ProfiledWasmLoopBodyStart(const byte *ip); + template const byte * OP_ProfiledLoopBodyStart(uint loopId); template void OP_ApplyArgs(const unaligned OpLayoutT_Reg5 * playout); template void OP_EmitTmpRegCount(const unaligned OpLayoutT_Unsigned1 * ip); Var OP_ImportCall(Var specifier, ScriptContext *scriptContext); @@ -848,7 +878,6 @@ namespace Js void SetExecutingStackFunction(ScriptFunction * scriptFunction); friend class StackScriptFunction; - void InitializeClosures(); void SetLocalFrameDisplay(FrameDisplay *frameDisplay); Var GetLocalClosure() const; void SetLocalClosure(Var closure); diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptConversion.cpp b/deps/chakrashim/core/lib/Runtime/Language/JavascriptConversion.cpp index 140e76e498e..c5e439c4071 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptConversion.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptConversion.cpp @@ -33,7 +33,7 @@ namespace Js { return false; } - JavascriptMethod entryPoint = RecyclableObject::FromVar(aValue)->GetEntryPoint(); + JavascriptMethod entryPoint = RecyclableObject::UnsafeFromVar(aValue)->GetEntryPoint(); return RecyclableObject::DefaultEntryPoint != entryPoint; } @@ -79,7 +79,7 @@ namespace Js case TypeIds_Int64Number: { int leftValue = TaggedInt::ToInt32(aLeft); - __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); + __int64 rightValue = JavascriptInt64Number::UnsafeFromVar(aRight)->GetValue(); return leftValue == rightValue; } case TypeIds_UInt64Number: @@ -95,23 +95,23 @@ namespace Js { case TypeIds_Integer: { - __int64 leftValue = JavascriptInt64Number::FromVar(aLeft)->GetValue(); + __int64 leftValue = JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); int rightValue = TaggedInt::ToInt32(aRight); return leftValue == rightValue; } case TypeIds_Number: - dblLeft = (double)JavascriptInt64Number::FromVar(aLeft)->GetValue(); + dblLeft = (double)JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); dblRight = JavascriptNumber::GetValue(aRight); goto CommonNumber; case TypeIds_Int64Number: { - __int64 leftValue = JavascriptInt64Number::FromVar(aLeft)->GetValue(); - __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); + __int64 leftValue = JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); + __int64 rightValue = JavascriptInt64Number::UnsafeFromVar(aRight)->GetValue(); return leftValue == rightValue; } case TypeIds_UInt64Number: { - __int64 leftValue = JavascriptInt64Number::FromVar(aLeft)->GetValue(); + __int64 leftValue = JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); unsigned __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); return ((unsigned __int64)leftValue == rightValue); } @@ -122,23 +122,23 @@ namespace Js { case TypeIds_Integer: { - unsigned __int64 leftValue = JavascriptUInt64Number::FromVar(aLeft)->GetValue(); + unsigned __int64 leftValue = JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); __int64 rightValue = TaggedInt::ToInt32(aRight); return (leftValue == (unsigned __int64)rightValue); } case TypeIds_Number: - dblLeft = (double)JavascriptUInt64Number::FromVar(aLeft)->GetValue(); + dblLeft = (double)JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); dblRight = JavascriptNumber::GetValue(aRight); goto CommonNumber; case TypeIds_Int64Number: { - unsigned __int64 leftValue = JavascriptUInt64Number::FromVar(aLeft)->GetValue(); - __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); + unsigned __int64 leftValue = JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); + __int64 rightValue = JavascriptInt64Number::UnsafeFromVar(aRight)->GetValue(); return (leftValue == (unsigned __int64)rightValue); } case TypeIds_UInt64Number: { - unsigned __int64 leftValue = JavascriptUInt64Number::FromVar(aLeft)->GetValue(); + unsigned __int64 leftValue = JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); unsigned __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); return leftValue == rightValue; } @@ -153,11 +153,11 @@ namespace Js goto CommonNumber; case TypeIds_Int64Number: dblLeft = JavascriptNumber::GetValue(aLeft); - dblRight = (double)JavascriptInt64Number::FromVar(aRight)->GetValue(); + dblRight = (double)JavascriptInt64Number::UnsafeFromVar(aRight)->GetValue(); goto CommonNumber; case TypeIds_UInt64Number: dblLeft = JavascriptNumber::GetValue(aLeft); - dblRight = (double)JavascriptUInt64Number::FromVar(aRight)->GetValue(); + dblRight = (double)JavascriptUInt64Number::UnsafeFromVar(aRight)->GetValue(); goto CommonNumber; case TypeIds_Number: dblLeft = JavascriptNumber::GetValue(aLeft); @@ -200,8 +200,8 @@ namespace Js { case TypeIds_Symbol: { - JavascriptSymbol* leftSymbol = JavascriptSymbol::FromVar(aLeft); - JavascriptSymbol* rightSymbol = JavascriptSymbol::FromVar(aRight); + JavascriptSymbol* leftSymbol = JavascriptSymbol::UnsafeFromVar(aLeft); + JavascriptSymbol* rightSymbol = JavascriptSymbol::UnsafeFromVar(aRight); return leftSymbol->GetValue() == rightSymbol->GetValue(); } } @@ -276,43 +276,29 @@ namespace Js // ToPropertyKey() takes a value and converts it to a property key // Implementation of ES6 7.1.14 //---------------------------------------------------------------------------- - void JavascriptConversion::ToPropertyKey(Var argument, ScriptContext* scriptContext, const PropertyRecord** propertyRecord) + void JavascriptConversion::ToPropertyKey( + Var argument, + _In_ ScriptContext* scriptContext, + _Out_ const PropertyRecord** propertyRecord, + _Out_opt_ PropertyString** propString) { Var key = JavascriptConversion::ToPrimitive(argument, JavascriptHint::HintString, scriptContext); - + PropertyString * propertyString = nullptr; if (JavascriptSymbol::Is(key)) { // If we are looking up a property keyed by a symbol, we already have the PropertyId in the symbol - *propertyRecord = JavascriptSymbol::FromVar(key)->GetValue(); + *propertyRecord = JavascriptSymbol::UnsafeFromVar(key)->GetValue(); } else { // For all other types, convert the key into a string and use that as the property name JavascriptString * propName = JavascriptConversion::ToString(key, scriptContext); + *propertyRecord = propName->GetPropertyRecord(); + } - if (VirtualTableInfo::HasVirtualTable(propName)) - { - PropertyString * propertyString = (PropertyString *)propName; - *propertyRecord = propertyString->GetPropertyRecord(); - } - else if (VirtualTableInfo::HasVirtualTable(propName)) - { - LiteralStringWithPropertyStringPtr * str = (LiteralStringWithPropertyStringPtr *)propName; - if (str->GetPropertyString()) - { - *propertyRecord = str->GetPropertyString()->GetPropertyRecord(); - } - else - { - scriptContext->GetOrAddPropertyRecord(propName, propertyRecord); - PropertyString * propStr = scriptContext->GetPropertyString((*propertyRecord)->GetPropertyId()); - str->SetPropertyString(propStr); - } - } - else - { - scriptContext->GetOrAddPropertyRecord(propName, propertyRecord); - } + if (propString) + { + *propString = propertyString; } } @@ -325,7 +311,7 @@ namespace Js // Boolean: The result equals the input argument (no conversion). // Number: The result equals the input argument (no conversion). // String: The result equals the input argument (no conversion). - // VariantDate:Returns the value for variant date by calling ToPrimitve directly. + // VariantDate:Returns the value for variant date by calling ToPrimitive directly. // Object: Return a default value for the Object. // The default value of an object is retrieved by calling the [[DefaultValue]] // internal method of the object, passing the optional hint PreferredType. @@ -348,7 +334,7 @@ namespace Js case TypeIds_VariantDate: { Var result = nullptr; - if (JavascriptVariantDate::FromVar(aValue)->ToPrimitive(hint, &result, requestContext) != TRUE) + if (JavascriptVariantDate::UnsafeFromVar(aValue)->ToPrimitive(hint, &result, requestContext) != TRUE) { result = nullptr; } @@ -357,7 +343,7 @@ namespace Js case TypeIds_StringObject: { - JavascriptStringObject * stringObject = JavascriptStringObject::FromVar(aValue); + JavascriptStringObject * stringObject = JavascriptStringObject::UnsafeFromVar(aValue); ScriptContext * objectScriptContext = stringObject->GetScriptContext(); if (objectScriptContext->optimizationOverrides.GetSideEffects() & (hint == JavascriptHint::HintString ? SideEffects_ToString : SideEffects_ValueOf)) { @@ -369,7 +355,7 @@ namespace Js case TypeIds_NumberObject: { - JavascriptNumberObject * numberObject = JavascriptNumberObject::FromVar(aValue); + JavascriptNumberObject * numberObject = JavascriptNumberObject::UnsafeFromVar(aValue); ScriptContext * objectScriptContext = numberObject->GetScriptContext(); if (hint == JavascriptHint::HintString) { @@ -393,7 +379,7 @@ namespace Js case TypeIds_SymbolObject: { - JavascriptSymbolObject* symbolObject = JavascriptSymbolObject::FromVar(aValue); + JavascriptSymbolObject* symbolObject = JavascriptSymbolObject::UnsafeFromVar(aValue); return requestContext->GetLibrary()->CreateSymbol(symbolObject->GetValue()); } @@ -401,7 +387,7 @@ namespace Js case TypeIds_Date: case TypeIds_WinRTDate: { - JavascriptDate* dateObject = JavascriptDate::FromVar(aValue); + JavascriptDate* dateObject = JavascriptDate::UnsafeFromVar(aValue); if(hint == JavascriptHint::HintNumber) { if (dateObject->GetScriptContext()->optimizationOverrides.GetSideEffects() & SideEffects_ValueOf) @@ -426,9 +412,9 @@ namespace Js // convert to JavascriptNumber case TypeIds_Int64Number: - return JavascriptInt64Number::FromVar(aValue)->ToJavascriptNumber(); + return JavascriptInt64Number::UnsafeFromVar(aValue)->ToJavascriptNumber(); case TypeIds_UInt64Number: - return JavascriptUInt64Number::FromVar(aValue)->ToJavascriptNumber(); + return JavascriptUInt64Number::UnsafeFromVar(aValue)->ToJavascriptNumber(); default: #ifdef ENABLE_SIMDJS @@ -503,7 +489,7 @@ namespace Js } // Let exoticToPrim be GetMethod(input, @@toPrimitive). - JavascriptFunction* exoticToPrim = JavascriptFunction::FromVar(varMethod); + JavascriptFunction* exoticToPrim = JavascriptFunction::UnsafeFromVar(varMethod); JavascriptString* hintString = nullptr; if (hint == JavascriptHint::HintString) @@ -520,27 +506,25 @@ namespace Js } // If exoticToPrim is not undefined, then - if (nullptr != exoticToPrim) + Assert(nullptr != exoticToPrim); + ThreadContext * threadContext = requestContext->GetThreadContext(); + result = threadContext->ExecuteImplicitCall(exoticToPrim, ImplicitCall_ToPrimitive, [=]()->Js::Var { - ThreadContext * threadContext = requestContext->GetThreadContext(); - result = threadContext->ExecuteImplicitCall(exoticToPrim, ImplicitCall_ToPrimitive, [=]()->Js::Var - { - // Stack object should have a pre-op bail on implicit call. We shouldn't see them here. - Assert(!ThreadContext::IsOnStack(recyclableObject)); + // Stack object should have a pre-op bail on implicit call. We shouldn't see them here. + Assert(!ThreadContext::IsOnStack(recyclableObject)); - // Let result be the result of calling the[[Call]] internal method of exoticToPrim, with input as thisArgument and(hint) as argumentsList. - return CALL_FUNCTION(threadContext, exoticToPrim, CallInfo(CallFlags_Value, 2), recyclableObject, hintString); - }); + // Let result be the result of calling the[[Call]] internal method of exoticToPrim, with input as thisArgument and(hint) as argumentsList. + return CALL_FUNCTION(threadContext, exoticToPrim, CallInfo(CallFlags_Value, 2), recyclableObject, hintString); + }); - if (!result) - { - // There was an implicit call and implicit calls are disabled. This would typically cause a bailout. - Assert(threadContext->IsDisableImplicitCall()); - return requestContext->GetLibrary()->GetNull(); - } - - Assert(!CrossSite::NeedMarshalVar(result, requestContext)); + if (!result) + { + // There was an implicit call and implicit calls are disabled. This would typically cause a bailout. + Assert(threadContext->IsDisableImplicitCall()); + return requestContext->GetLibrary()->GetNull(); } + + Assert(!CrossSite::NeedMarshalVar(result, requestContext)); // If result is an ECMAScript language value and Type(result) is not Object, then return result. if (TaggedInt::Is(result) || !JavascriptOperators::IsObjectType(JavascriptOperators::GetTypeId(result))) { @@ -631,14 +615,14 @@ namespace Js return scriptContext->GetIntegerString(aValue); case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue() ? scriptContext->GetLibrary()->GetTrueDisplayString() : scriptContext->GetLibrary()->GetFalseDisplayString(); + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? scriptContext->GetLibrary()->GetTrueDisplayString() : scriptContext->GetLibrary()->GetFalseDisplayString(); case TypeIds_Number: return JavascriptNumber::ToStringRadix10(JavascriptNumber::GetValue(aValue), scriptContext); case TypeIds_Int64Number: { - __int64 value = JavascriptInt64Number::FromVar(aValue)->GetValue(); + __int64 value = JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue(); if (!TaggedInt::IsOverflow(value)) { return scriptContext->GetIntegerString((int)value); @@ -651,7 +635,7 @@ namespace Js case TypeIds_UInt64Number: { - unsigned __int64 value = JavascriptUInt64Number::FromVar(aValue)->GetValue(); + unsigned __int64 value = JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue(); if (!TaggedInt::IsOverflow(value)) { return scriptContext->GetIntegerString((uint)value); @@ -664,18 +648,18 @@ namespace Js case TypeIds_String: { - ScriptContext* aValueScriptContext = Js::RecyclableObject::FromVar(aValue)->GetScriptContext(); - return JavascriptString::FromVar(CrossSite::MarshalVar(scriptContext, + ScriptContext* aValueScriptContext = Js::RecyclableObject::UnsafeFromVar(aValue)->GetScriptContext(); + return JavascriptString::UnsafeFromVar(CrossSite::MarshalVar(scriptContext, aValue, aValueScriptContext)); } case TypeIds_VariantDate: return JavascriptVariantDate::FromVar(aValue)->GetValueString(scriptContext); case TypeIds_Symbol: - return JavascriptSymbol::FromVar(aValue)->ToString(scriptContext); + return JavascriptSymbol::UnsafeFromVar(aValue)->ToString(scriptContext); case TypeIds_SymbolObject: - return JavascriptSymbol::ToString(JavascriptSymbolObject::FromVar(aValue)->GetValue(), scriptContext); + return JavascriptSymbol::ToString(JavascriptSymbolObject::UnsafeFromVar(aValue)->GetValue(), scriptContext); #ifdef ENABLE_SIMDJS case TypeIds_SIMDBool8x16: @@ -696,7 +680,7 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedSimd, _u("SIMDType.toString")); } JavascriptSIMDObject* simdObject = static_cast(obj); - return JavascriptString::FromVar(simdObject->ToString(scriptContext)); + return JavascriptString::UnsafeFromVar(simdObject->ToString(scriptContext)); } #endif @@ -733,26 +717,26 @@ namespace Js return JavascriptNumber::ToLocaleString(TaggedInt::ToInt32(aValue), scriptContext); case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue() ? scriptContext->GetLibrary()->GetTrueDisplayString() : scriptContext->GetLibrary()->GetFalseDisplayString(); + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? scriptContext->GetLibrary()->GetTrueDisplayString() : scriptContext->GetLibrary()->GetFalseDisplayString(); case TypeIds_Int64Number: - return JavascriptNumber::ToLocaleString((double)JavascriptInt64Number::FromVar(aValue)->GetValue(), scriptContext); + return JavascriptNumber::ToLocaleString((double)JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue(), scriptContext); case TypeIds_UInt64Number: - return JavascriptNumber::ToLocaleString((double)JavascriptUInt64Number::FromVar(aValue)->GetValue(), scriptContext); + return JavascriptNumber::ToLocaleString((double)JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue(), scriptContext); case TypeIds_Number: return JavascriptNumber::ToLocaleString(JavascriptNumber::GetValue(aValue), scriptContext); case TypeIds_String: - return JavascriptString::FromVar(aValue); + return JavascriptString::UnsafeFromVar(aValue); case TypeIds_VariantDate: // Legacy behavior was to create an empty object and call toLocaleString on it, which would result in this value return scriptContext->GetLibrary()->GetObjectDisplayString(); case TypeIds_Symbol: - return JavascriptSymbol::FromVar(aValue)->ToString(scriptContext); + return JavascriptSymbol::UnsafeFromVar(aValue)->ToString(scriptContext); default: { @@ -765,7 +749,7 @@ namespace Js Var aResult = CALL_FUNCTION(scriptContext->GetThreadContext(), toLocaleStringFunction, CallInfo(1), aValue); if (JavascriptString::Is(aResult)) { - return JavascriptString::FromVar(aResult); + return JavascriptString::UnsafeFromVar(aResult); } else { @@ -799,7 +783,7 @@ namespace Js AssertMsg(!TaggedInt::Is(aValue), "Should be detected"); AssertMsg(RecyclableObject::Is(aValue), "Should be handled already"); - auto type = RecyclableObject::FromVar(aValue)->GetType(); + auto type = RecyclableObject::UnsafeFromVar(aValue)->GetType(); switch (type->GetTypeId()) { @@ -812,7 +796,7 @@ namespace Js return true; case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue(); + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue(); #if !FLOATVAR case TypeIds_Number: @@ -824,19 +808,19 @@ namespace Js case TypeIds_Int64Number: { - __int64 value = JavascriptInt64Number::FromVar(aValue)->GetValue(); + __int64 value = JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue(); return value != 0; } case TypeIds_UInt64Number: { - unsigned __int64 value = JavascriptUInt64Number::FromVar(aValue)->GetValue(); + unsigned __int64 value = JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue(); return value != 0; } case TypeIds_String: { - JavascriptString * pstValue = JavascriptString::FromVar(aValue); + JavascriptString * pstValue = JavascriptString::UnsafeFromVar(aValue); return pstValue->GetLength() > 0; } @@ -915,7 +899,7 @@ namespace Js double JavascriptConversion::ToNumber_Full(Var aValue,ScriptContext* scriptContext) { AssertMsg(!TaggedInt::Is(aValue), "Should be detected"); - ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::FromVar(aValue)->GetScriptContext() : nullptr; + ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::UnsafeFromVar(aValue)->GetScriptContext() : nullptr; BOOL fPrimitiveOnly = false; while(true) { @@ -935,22 +919,22 @@ namespace Js return TaggedInt::ToDouble(aValue); case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue() ? 1 : +0; + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? 1 : +0; case TypeIds_Number: return JavascriptNumber::GetValue(aValue); case TypeIds_Int64Number: - return (double)JavascriptInt64Number::FromVar(aValue)->GetValue(); + return (double)JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue(); case TypeIds_UInt64Number: - return (double)JavascriptUInt64Number::FromVar(aValue)->GetValue(); + return (double)JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue(); case TypeIds_String: - return JavascriptString::FromVar(aValue)->ToDouble(); + return JavascriptString::UnsafeFromVar(aValue)->ToDouble(); case TypeIds_VariantDate: - return Js::DateImplementation::GetTvUtc(Js::DateImplementation::JsLocalTimeFromVarDate(JavascriptVariantDate::FromVar(aValue)->GetValue()), scriptContext); + return Js::DateImplementation::GetTvUtc(Js::DateImplementation::JsLocalTimeFromVarDate(JavascriptVariantDate::UnsafeFromVar(aValue)->GetValue()), scriptContext); #ifdef ENABLE_SIMDJS case TypeIds_SIMDFloat32x4: @@ -987,7 +971,7 @@ namespace Js double JavascriptConversion::ToInteger_Full(Var aValue,ScriptContext* scriptContext) { AssertMsg(!TaggedInt::Is(aValue), "Should be detected"); - ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::FromVar(aValue)->GetScriptContext() : nullptr; + ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::UnsafeFromVar(aValue)->GetScriptContext() : nullptr; BOOL fPrimitiveOnly = false; while(true) { @@ -1004,19 +988,18 @@ namespace Js return TaggedInt::ToInt32(aValue); case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue() ? 1 : +0; + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? 1 : +0; case TypeIds_Number: return ToInteger(JavascriptNumber::GetValue(aValue)); case TypeIds_Int64Number: - return ToInteger((double)JavascriptInt64Number::FromVar(aValue)->GetValue()); + return ToInteger((double)JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_UInt64Number: - return ToInteger((double)JavascriptUInt64Number::FromVar(aValue)->GetValue()); - + return ToInteger((double)JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_String: - return ToInteger(JavascriptString::FromVar(aValue)->ToDouble()); + return ToInteger(JavascriptString::UnsafeFromVar(aValue)->ToDouble()); case TypeIds_VariantDate: return ToInteger(ToNumber_Full(aValue, scriptContext)); @@ -1073,7 +1056,7 @@ namespace Js Assert(Js::JavascriptStackWalker::ValidateTopJitFrame(scriptContext)); AssertMsg(!TaggedInt::Is(aValue), "Should be detected"); - ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::FromVar(aValue)->GetScriptContext() : nullptr; + ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::UnsafeFromVar(aValue)->GetScriptContext() : nullptr; // This is used when TaggedInt's overflow but remain under int32 // so Number is our most critical case: @@ -1097,22 +1080,22 @@ namespace Js return TaggedInt::ToInt32(aValue); case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue() ? 1 : +0; + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? 1 : +0; case TypeIds_Int64Number: // we won't lose precision if the int64 is within 32bit boundary; otherwise we need to // treat it as double anyhow. - return JavascriptMath::ToInt32Core((double)JavascriptInt64Number::FromVar(aValue)->GetValue()); + return JavascriptMath::ToInt32Core((double)JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_UInt64Number: // we won't lose precision if the int64 is within 32bit boundary; otherwise we need to // treat it as double anyhow. - return JavascriptMath::ToInt32Core((double)JavascriptUInt64Number::FromVar(aValue)->GetValue()); + return JavascriptMath::ToInt32Core((double)JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_String: { double result; - if (JavascriptString::FromVar(aValue)->ToDouble(&result)) + if (JavascriptString::UnsafeFromVar(aValue)->ToDouble(&result)) { return JavascriptMath::ToInt32Core(result); } @@ -1156,7 +1139,7 @@ namespace Js return TaggedInt::ToInt32(aValue); case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue() ? 1 : +0; + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? 1 : +0; case TypeIds_Number: return ToInt32(JavascriptNumber::GetValue(aValue)); @@ -1164,17 +1147,17 @@ namespace Js case TypeIds_Int64Number: // we won't lose precision if the int64 is within 32bit boundary; otherwise we need to // treat it as double anyhow. - return JavascriptMath::ToInt32Core((double)JavascriptInt64Number::FromVar(aValue)->GetValue()); + return JavascriptMath::ToInt32Core((double)JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_UInt64Number: // we won't lose precision if the int64 is within 32bit boundary; otherwise we need to // treat it as double anyhow. - return JavascriptMath::ToInt32Core((double)JavascriptUInt64Number::FromVar(aValue)->GetValue()); + return JavascriptMath::ToInt32Core((double)JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_String: { double result; - if (JavascriptString::FromVar(aValue)->ToDouble(&result)) + if (JavascriptString::UnsafeFromVar(aValue)->ToDouble(&result)) { return ToInt32(result); } @@ -1194,7 +1177,7 @@ namespace Js // a strict version of ToInt32 conversion that returns false for non int32 values like, inf, NaN, undef BOOL JavascriptConversion::ToInt32Finite(Var aValue, ScriptContext* scriptContext, int32* result) { - ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::FromVar(aValue)->GetScriptContext() : nullptr; + ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::UnsafeFromVar(aValue)->GetScriptContext() : nullptr; BOOL fPrimitiveOnly = false; while(true) { @@ -1216,7 +1199,7 @@ namespace Js return true; case TypeIds_Boolean: - *result = JavascriptBoolean::FromVar(aValue)->GetValue() ? 1 : +0; + *result = JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? 1 : +0; return true; case TypeIds_Number: @@ -1225,15 +1208,15 @@ namespace Js case TypeIds_Int64Number: // we won't lose precision if the int64 is within 32bit boundary; otherwise we need to // treat it as double anyhow. - return ToInt32Finite((double)JavascriptInt64Number::FromVar(aValue)->GetValue(), result); + return ToInt32Finite((double)JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue(), result); case TypeIds_UInt64Number: // we won't lose precision if the int64 is within 32bit boundary; otherwise we need to // treat it as double anyhow. - return ToInt32Finite((double)JavascriptUInt64Number::FromVar(aValue)->GetValue(), result); + return ToInt32Finite((double)JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue(), result); case TypeIds_String: - return ToInt32Finite(JavascriptString::FromVar(aValue)->ToDouble(), result); + return ToInt32Finite(JavascriptString::UnsafeFromVar(aValue)->ToDouble(), result); case TypeIds_VariantDate: return ToInt32Finite(ToNumber_Full(aValue, scriptContext), result); @@ -1283,12 +1266,12 @@ namespace Js } case TypeIds_Int64Number: { - JavascriptInt64Number* int64Number = JavascriptInt64Number::FromVar(aValue); + JavascriptInt64Number* int64Number = JavascriptInt64Number::UnsafeFromVar(aValue); return int64Number->GetValue(); } case TypeIds_UInt64Number: { - JavascriptUInt64Number* uint64Number = JavascriptUInt64Number::FromVar(aValue); + JavascriptUInt64Number* uint64Number = JavascriptUInt64Number::UnsafeFromVar(aValue); return (__int64)uint64Number->GetValue(); } case TypeIds_Number: @@ -1308,12 +1291,12 @@ namespace Js } case TypeIds_Int64Number: { - JavascriptInt64Number* int64Number = JavascriptInt64Number::FromVar(aValue); + JavascriptInt64Number* int64Number = JavascriptInt64Number::UnsafeFromVar(aValue); return (unsigned __int64)int64Number->GetValue(); } case TypeIds_UInt64Number: { - JavascriptUInt64Number* uint64Number = JavascriptUInt64Number::FromVar(aValue); + JavascriptUInt64Number* uint64Number = JavascriptUInt64Number::UnsafeFromVar(aValue); return uint64Number->GetValue(); } case TypeIds_Number: @@ -1343,7 +1326,7 @@ namespace Js uint32 JavascriptConversion::ToUInt32_Full(Var aValue, ScriptContext* scriptContext) { AssertMsg(!TaggedInt::Is(aValue), "Should be detected"); - ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::FromVar(aValue)->GetScriptContext() : nullptr; + ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::UnsafeFromVar(aValue)->GetScriptContext() : nullptr; BOOL fPrimitiveOnly = false; while(true) { @@ -1360,7 +1343,7 @@ namespace Js return TaggedInt::ToUInt32(aValue); case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue() ? 1 : +0; + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? 1 : +0; case TypeIds_Number: return JavascriptMath::ToUInt32(JavascriptNumber::GetValue(aValue)); @@ -1368,17 +1351,17 @@ namespace Js case TypeIds_Int64Number: // we won't lose precision if the int64 is within 32bit boundary; otherwise we need to // treat it as double anyhow. - return JavascriptMath::ToUInt32((double)JavascriptInt64Number::FromVar(aValue)->GetValue()); + return JavascriptMath::ToUInt32((double)JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_UInt64Number: // we won't lose precision if the int64 is within 32bit boundary; otherwise we need to // treat it as double anyhow. - return JavascriptMath::ToUInt32((double)JavascriptUInt64Number::FromVar(aValue)->GetValue()); + return JavascriptMath::ToUInt32((double)JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_String: { double result; - if (JavascriptString::FromVar(aValue)->ToDouble(&result)) + if (JavascriptString::UnsafeFromVar(aValue)->ToDouble(&result)) { return JavascriptMath::ToUInt32(result); } @@ -1432,7 +1415,7 @@ namespace Js uint16 JavascriptConversion::ToUInt16_Full(IN Var aValue, ScriptContext* scriptContext) { AssertMsg(!TaggedInt::Is(aValue), "Should be detected"); - ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::FromVar(aValue)->GetScriptContext() : nullptr; + ScriptContext * objectScriptContext = RecyclableObject::Is(aValue) ? RecyclableObject::UnsafeFromVar(aValue)->GetScriptContext() : nullptr; BOOL fPrimitiveOnly = false; while(true) { @@ -1449,7 +1432,7 @@ namespace Js return TaggedInt::ToUInt16(aValue); case TypeIds_Boolean: - return JavascriptBoolean::FromVar(aValue)->GetValue() ? 1 : +0; + return JavascriptBoolean::UnsafeFromVar(aValue)->GetValue() ? 1 : +0; case TypeIds_Number: return ToUInt16(JavascriptNumber::GetValue(aValue)); @@ -1457,17 +1440,17 @@ namespace Js case TypeIds_Int64Number: // we won't lose precision if the int64 is within 16bit boundary; otherwise we need to // treat it as double anyhow. - return ToUInt16((double)JavascriptInt64Number::FromVar(aValue)->GetValue()); + return ToUInt16((double)JavascriptInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_UInt64Number: // we won't lose precision if the int64 is within 16bit boundary; otherwise we need to // treat it as double anyhow. - return ToUInt16((double)JavascriptUInt64Number::FromVar(aValue)->GetValue()); + return ToUInt16((double)JavascriptUInt64Number::UnsafeFromVar(aValue)->GetValue()); case TypeIds_String: { double result; - if (JavascriptString::FromVar(aValue)->ToDouble(&result)) + if (JavascriptString::UnsafeFromVar(aValue)->ToDouble(&result)) { return ToUInt16(result); } diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptConversion.h b/deps/chakrashim/core/lib/Runtime/Language/JavascriptConversion.h index 9c1c1826deb..e5adf6a3cd7 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptConversion.h +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptConversion.h @@ -14,7 +14,11 @@ namespace Js { static Var ToPrimitive(Var aValue, JavascriptHint hint, ScriptContext * scriptContext); static BOOL CanonicalNumericIndexString(JavascriptString *aValue, double *indexValue, ScriptContext * scriptContext); - static void ToPropertyKey(Var argument, ScriptContext* scriptContext, const PropertyRecord** propertyRecord); + static void ToPropertyKey( + Var argument, + _In_ ScriptContext* scriptContext, + _Out_ const PropertyRecord** propertyRecord, + _Out_opt_ PropertyString** propString); static PropertyQueryFlags BooleanToPropertyQueryFlags(BOOL val) { return val ? PropertyQueryFlags::Property_Found : PropertyQueryFlags::Property_NotFound; } static BOOL PropertyQueryFlagsToBoolean(PropertyQueryFlags val) { return val == PropertyQueryFlags::Property_Found; } diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionObject.cpp b/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionObject.cpp index f07a2a074db..75b7bf2fbf0 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionObject.cpp @@ -111,7 +111,7 @@ namespace Js { if (RecyclableObject::Is(rethrownObject)) { - if (((RecyclableObject*)rethrownObject)->GetScriptContext() != requestingScriptContext) + if (CrossSite::NeedMarshalVar(rethrownObject, requestingScriptContext)) { Assert(requestingScriptContext->GetHostScriptContext()); HRESULT hrSecurityCheck = requestingScriptContext->GetHostScriptContext()->CheckCrossDomainScriptContext(((RecyclableObject*)rethrownObject)->GetScriptContext()); diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionObject.h b/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionObject.h index 04b7b89fa19..26803947617 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionObject.h +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionObject.h @@ -17,11 +17,21 @@ namespace Js typedef Var (__stdcall *HostWrapperCreateFuncType)(Var var, ScriptContext * sourceScriptContext, ScriptContext * destScriptContext); JavascriptExceptionObject(Var object, ScriptContext * scriptContext, JavascriptExceptionContext* exceptionContextIn, bool isPendingExceptionObject = false) : - thrownObject(object), isPendingExceptionObject(isPendingExceptionObject), - scriptContext(scriptContext), tag(true), isDebuggerSkip(false), byteCodeOffsetAfterDebuggerSkip(Constants::InvalidByteCodeOffset), hasDebuggerLogged(false), - isFirstChance(false), isExceptionCaughtInNonUserCode(false), ignoreAdvanceToNextStatement(false), hostWrapperCreateFunc(nullptr), isGeneratorReturnException(false), + isPendingExceptionObject(isPendingExceptionObject), + scriptContext(scriptContext), tag(true), +#ifdef ENABLE_SCRIPT_DEBUGGING + isDebuggerSkip(false), byteCodeOffsetAfterDebuggerSkip(Constants::InvalidByteCodeOffset), hasDebuggerLogged(false), + isFirstChance(false), isExceptionCaughtInNonUserCode(false), ignoreAdvanceToNextStatement(false), +#endif + hostWrapperCreateFunc(nullptr), isGeneratorReturnException(false), next(nullptr) { + if (object && RecyclableObject::Is(object) && CrossSite::NeedMarshalVar(object, scriptContext)) + { + object = CrossSite::MarshalVar(scriptContext, object); + } + thrownObject = object; + if (exceptionContextIn) { exceptionContext = *exceptionContextIn; @@ -60,6 +70,7 @@ namespace Js void FillError(JavascriptExceptionContext& exceptionContext, ScriptContext *scriptContext, HostWrapperCreateFuncType hostWrapperCreateFunc = NULL); void ClearError(); +#ifdef ENABLE_SCRIPT_DEBUGGING void SetDebuggerSkip(bool skip) { isDebuggerSkip = skip; @@ -99,6 +110,7 @@ namespace Js { return isFirstChance; } + void SetIsExceptionCaughtInNonUserCode(bool is) { isExceptionCaughtInNonUserCode = is; @@ -109,6 +121,17 @@ namespace Js return isExceptionCaughtInNonUserCode; } + void SetIgnoreAdvanceToNextStatement(bool is) + { + ignoreAdvanceToNextStatement = is; + } + + bool IsIgnoreAdvanceToNextStatement() + { + return ignoreAdvanceToNextStatement; + } +#endif + void SetHostWrapperCreateFunc(HostWrapperCreateFuncType hostWrapperCreateFunc) { this->hostWrapperCreateFunc = hostWrapperCreateFunc; @@ -122,7 +145,7 @@ namespace Js void ReplaceThrownObject(Var object) { AssertMsg(RecyclableObject::Is(object), "Why are we replacing a non recyclable thrown object?"); - AssertMsg(this->GetScriptContext() != RecyclableObject::FromVar(object)->GetScriptContext(), "If replaced thrownObject is from same context what's the need to replace?"); + AssertMsg(this->GetScriptContext() != RecyclableObject::FromVar(object)->GetScriptContext() || this->thrownObject != object, "If replaced thrownObject is from same context what's the need to replace?"); this->thrownObject = object; } @@ -141,15 +164,6 @@ namespace Js bool IsPendingExceptionObject() const { return isPendingExceptionObject; } - void SetIgnoreAdvanceToNextStatement(bool is) - { - ignoreAdvanceToNextStatement = is; - } - - bool IsIgnoreAdvanceToNextStatement() - { - return ignoreAdvanceToNextStatement; - } void SetGeneratorReturnException(bool is) { @@ -170,18 +184,23 @@ namespace Js private: Field(Var) thrownObject; Field(ScriptContext *) scriptContext; - + +#ifdef ENABLE_SCRIPT_DEBUGGING Field(int) byteCodeOffsetAfterDebuggerSkip; +#endif + Field(const bool) tag : 1; // Tag the low bit to prevent possible GC false references Field(bool) isPendingExceptionObject : 1; Field(bool) isGeneratorReturnException : 1; +#ifdef ENABLE_SCRIPT_DEBUGGING Field(bool) isDebuggerSkip : 1; Field(bool) hasDebuggerLogged : 1; Field(bool) isFirstChance : 1; // Mentions whether the current exception is a handled exception or not Field(bool) isExceptionCaughtInNonUserCode : 1; // Mentions if in the caller chain the exception will be handled by the non-user code. Field(bool) ignoreAdvanceToNextStatement : 1; // This will be set when user had setnext while sitting on the exception // So the exception eating logic shouldn't try and advance to next statement again. +#endif FieldNoBarrier(HostWrapperCreateFuncType) hostWrapperCreateFunc; @@ -203,8 +222,10 @@ namespace Js GeneratorReturnExceptionObject(Var object, ScriptContext * scriptContext) : JavascriptExceptionObject(object, scriptContext, nullptr) { +#ifdef ENABLE_SCRIPT_DEBUGGING this->SetDebuggerSkip(true); this->SetIgnoreAdvanceToNextStatement(true); +#endif this->SetGeneratorReturnException(true); } }; diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionOperators.cpp b/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionOperators.cpp index a793ce53fa2..2f9069d423b 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionOperators.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionOperators.cpp @@ -60,6 +60,18 @@ namespace Js m_threadContext->SetIsUserCode(m_previousCatchHandlerToUserCodeStatus); } + JavascriptExceptionOperators::TryCatchFrameAddrStack::TryCatchFrameAddrStack(ScriptContext* scriptContext, void *frameAddr) + { + m_threadContext = scriptContext->GetThreadContext(); + m_prevTryCatchFrameAddr = m_threadContext->GetTryCatchFrameAddr(); + scriptContext->GetThreadContext()->SetTryCatchFrameAddr(frameAddr); + } + + JavascriptExceptionOperators::TryCatchFrameAddrStack::~TryCatchFrameAddrStack() + { + m_threadContext->SetTryCatchFrameAddr(m_prevTryCatchFrameAddr); + } + bool JavascriptExceptionOperators::CrawlStackForWER(Js::ScriptContext& scriptContext) { return Js::Configuration::Global.flags.WERExceptionSupport && !scriptContext.GetThreadContext()->HasCatchHandler(); @@ -81,21 +93,40 @@ namespace Js { void *continuation = nullptr; JavascriptExceptionObject *exception = nullptr; - + void *tryCatchFrameAddr = nullptr; PROBE_STACK(scriptContext, Constants::MinStackDefault + spillSize + argsSize); - - try - { - Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); - continuation = amd64_CallWithFakeFrame(tryAddr, frame, spillSize, argsSize); - } - catch (const Js::JavascriptException& err) { - exception = err.GetAndClear(); - } + Js::JavascriptExceptionOperators::TryCatchFrameAddrStack tryCatchFrameAddrStack(scriptContext, frame); + try + { + Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); + continuation = amd64_CallWithFakeFrame(tryAddr, frame, spillSize, argsSize); + } + catch (const Js::JavascriptException& err) + { + exception = err.GetAndClear(); + tryCatchFrameAddr = scriptContext->GetThreadContext()->GetTryCatchFrameAddr(); + Assert(frame == tryCatchFrameAddr); + } + } if (exception) { + // We need to clear callinfo on inlinee virtual frames on an exception. + // We now allow inlining of functions into callers that have try-catch/try-finally. + // When there is an exception inside the inlinee with caller having a try-catch, clear the inlinee callinfo by walking the stack. + // If not, we might have the try-catch inside a loop, and when we execute the loop next time in the interpreter on BailOnException, + // we will see inlined frames as being present even though they are not, because we depend on FrameInfo's callinfo to tell if an inlinee is on the stack, + // and we haven't cleared those bits due to the exception + // When we start inlining functions with try, we have to track the try addresses of the inlined functions as well. + +#if ENABLE_NATIVE_CODEGEN + if (exception->GetExceptionContext() && exception->GetExceptionContext()->ThrowingFunction()) + { + WalkStackForCleaningUpInlineeInfo(scriptContext, nullptr /* start stackwalk from the current frame */, tryCatchFrameAddr); + } +#endif + exception = exception->CloneIfStaticExceptionObject(scriptContext); bool hasBailedOut = *(bool*)((char*)frame + hasBailedOutOffset); // stack offsets are negative if (hasBailedOut) @@ -151,7 +182,6 @@ namespace Js // Re-throw! JavascriptExceptionOperators::DoThrow(exception, scriptContext); } - // MGTODO : We need to set the exception object, so that we can access in the interpreter, better way out ? scriptContext->GetThreadContext()->SetPendingFinallyException(exception); void *continuation = amd64_CallWithFakeFrame(finallyAddr, frame, spillSize, argsSize, exception); return continuation; @@ -209,25 +239,45 @@ namespace Js { void *continuation = nullptr; JavascriptExceptionObject *exception = nullptr; + void * tryCatchFrameAddr = nullptr; PROBE_STACK(scriptContext, Constants::MinStackDefault + argsSize); - - try { - Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); + Js::JavascriptExceptionOperators::TryCatchFrameAddrStack tryCatchFrameAddrStack(scriptContext, framePtr); + + try + { + Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); #if defined(_M_ARM) - continuation = arm_CallEhFrame(tryAddr, framePtr, localsPtr, argsSize); + continuation = arm_CallEhFrame(tryAddr, framePtr, localsPtr, argsSize); #elif defined(_M_ARM64) - continuation = arm64_CallEhFrame(tryAddr, framePtr, localsPtr, argsSize); + continuation = arm64_CallEhFrame(tryAddr, framePtr, localsPtr, argsSize); #endif - } - catch (const Js::JavascriptException& err) - { - exception = err.GetAndClear(); + } + catch (const Js::JavascriptException& err) + { + exception = err.GetAndClear(); + tryCatchFrameAddr = scriptContext->GetThreadContext()->GetTryCatchFrameAddr(); + Assert(framePtr == tryCatchFrameAddr); + } } if (exception) { + // We need to clear callinfo on inlinee virtual frames on an exception. + // We now allow inlining of functions into callers that have try-catch/try-finally. + // When there is an exception inside the inlinee with caller having a try-catch, clear the inlinee callinfo by walking the stack. + // If not, we might have the try-catch inside a loop, and when we execute the loop next time in the interpreter on BailOnException, + // we will see inlined frames as being present even though they are not, because we depend on FrameInfo's callinfo to tell if an inlinee is on the stack, + // and we haven't cleared those bits due to the exception + // When we start inlining functions with try, we have to track the try addresses of the inlined functions as well. + +#if ENABLE_NATIVE_CODEGEN + if (exception->GetExceptionContext() && exception->GetExceptionContext()->ThrowingFunction()) + { + WalkStackForCleaningUpInlineeInfo(scriptContext, nullptr /* start stackwalk from the current frame */, tryCatchFrameAddr); + } +#endif exception = exception->CloneIfStaticExceptionObject(scriptContext); bool hasBailedOut = *(bool*)((char*)localsPtr + hasBailedOutOffset); // stack offsets are sp relative if (hasBailedOut) @@ -359,77 +409,97 @@ namespace Js { void* continuationAddr = NULL; Js::JavascriptExceptionObject* pExceptionObject = NULL; + void *tryCatchFrameAddr = nullptr; PROBE_STACK(scriptContext, Constants::MinStackDefault); - - try { - Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); + Js::JavascriptExceptionOperators::TryCatchFrameAddrStack tryCatchFrameAddrStack(scriptContext, framePtr); - // Adjust the frame pointer and call into the try. - // If the try completes without raising an exception, it will pass back the continuation address. - - // Bug in compiler optimizer: try-catch can be optimized away if the try block contains __asm calls into function - // that may throw. The current workaround is to add the following dummy throw to prevent this optimization. - if (!tryAddr) + try { - Js::Throw::InternalError(); - } -#ifdef _M_IX86 - void *savedEsp; - __asm - { - // Save and restore the callee-saved registers around the call. - // TODO: track register kills by region and generate per-region prologs and epilogs - push esi - push edi - push ebx + Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); - // 8-byte align frame to improve floating point perf of our JIT'd code. - // Save ESP - mov ecx, esp - mov savedEsp, ecx - and esp, -8 + // Adjust the frame pointer and call into the try. + // If the try completes without raising an exception, it will pass back the continuation address. - // Set up the call target, save the current frame ptr, and adjust the frame to access - // locals in native code. - mov eax, tryAddr + // Bug in compiler optimizer: try-catch can be optimized away if the try block contains __asm calls into function + // that may throw. The current workaround is to add the following dummy throw to prevent this optimization. + if (!tryAddr) + { + Js::Throw::InternalError(); + } +#ifdef _M_IX86 + void *savedEsp; + __asm + { + // Save and restore the callee-saved registers around the call. + // TODO: track register kills by region and generate per-region prologs and epilogs + push esi + push edi + push ebx + + // 8-byte align frame to improve floating point perf of our JIT'd code. + // Save ESP + mov ecx, esp + mov savedEsp, ecx + and esp, -8 + + // Set up the call target, save the current frame ptr, and adjust the frame to access + // locals in native code. + mov eax, tryAddr #if 0 && defined(_CONTROL_FLOW_GUARD) - // verify that the call target is valid - mov ebx, eax ; save call target - mov ecx, eax - call [__guard_check_icall_fptr] - mov eax, ebx ; restore call target + // verify that the call target is valid + mov ebx, eax; save call target + mov ecx, eax + call[__guard_check_icall_fptr] + mov eax, ebx; restore call target #endif - push ebp - mov ebp, framePtr - call eax - pop ebp - - // The native code gives us the address where execution should continue on exit - // from the region. - mov continuationAddr, eax - - // Restore ESP - mov ecx, savedEsp - mov esp, ecx - - pop ebx - pop edi - pop esi - } + push ebp + mov ebp, framePtr + call eax + pop ebp + + // The native code gives us the address where execution should continue on exit + // from the region. + mov continuationAddr, eax + + // Restore ESP + mov ecx, savedEsp + mov esp, ecx + + pop ebx + pop edi + pop esi + } #else - AssertMsg(FALSE, "Unsupported native try-catch handler"); + AssertMsg(FALSE, "Unsupported native try-catch handler"); #endif - } - catch(const Js::JavascriptException& err) - { - pExceptionObject = err.GetAndClear(); + } + catch (const Js::JavascriptException& err) + { + pExceptionObject = err.GetAndClear(); + tryCatchFrameAddr = scriptContext->GetThreadContext()->GetTryCatchFrameAddr(); + Assert(framePtr == tryCatchFrameAddr); + } } // Let's run user catch handler code only after the stack has been unwound. if(pExceptionObject) { + // We need to clear callinfo on inlinee virtual frames on an exception. + // We now allow inlining of functions into callers that have try-catch/try-finally. + // When there is an exception inside the inlinee with caller having a try-catch, clear the inlinee callinfo by walking the stack. + // If not, we might have the try-catch inside a loop, and when we execute the loop next time in the interpreter on BailOnException, + // we will see inlined frames as being present even though they are not, because we depend on FrameInfo's callinfo to tell if an inlinee is on the stack, + // and we haven't cleared those bits due to the exception + // When we start inlining functions with try, we have to track the try addresses of the inlined functions as well. + +#if ENABLE_NATIVE_CODEGEN + if (pExceptionObject->GetExceptionContext() && pExceptionObject->GetExceptionContext()->ThrowingFunction()) + { + WalkStackForCleaningUpInlineeInfo(scriptContext, nullptr /* start stackwalk from the current frame */, tryCatchFrameAddr); + } +#endif pExceptionObject = pExceptionObject->CloneIfStaticExceptionObject(scriptContext); bool hasBailedOut = *(bool*)((char*)framePtr + hasBailedOutOffset); // stack offsets are negative if (hasBailedOut) @@ -875,7 +945,18 @@ namespace Js JavascriptExceptionOperators::ThrowExceptionObject(exceptionObject, scriptContext, /*considerPassingToDebugger=*/ true, /*returnAddress=*/ nullptr, resetStack); } +#if ENABLE_NATIVE_CODEGEN + // TODO: Add code address of throwing function on exception context, and use that for returnAddress instead of passing nullptr which starts stackwalk from the top + void JavascriptExceptionOperators::WalkStackForCleaningUpInlineeInfo(ScriptContext *scriptContext, PVOID returnAddress, PVOID tryCatchFrameAddr) + { + Assert(tryCatchFrameAddr != nullptr); + JavascriptStackWalker walker(scriptContext, /*useEERContext*/ true, returnAddress); + // We have to walk the inlinee frames and clear callinfo count on them on an exception + // At this point inlinedFrameWalker is closed, so we should build it again by calling InlinedFrameWalker::FromPhysicalFrame + walker.WalkAndClearInlineeFrameCallInfoOnException(tryCatchFrameAddr); + } +#endif void JavascriptExceptionOperators::WalkStackForExceptionContext(ScriptContext& scriptContext, JavascriptExceptionContext& exceptionContext, Var thrownObject, uint64 stackCrawlLimit, PVOID returnAddress, bool isThrownException, bool resetSatck) { @@ -1033,26 +1114,34 @@ namespace Js ThreadContext *threadContext = scriptContext ? scriptContext->GetThreadContext() : ThreadContext::GetContextForCurrentThread(); - threadContext->ClearDisableImplicitFlags(); -#if DBG - if (scriptContext) + + if (CONFIG_FLAG(EnableFatalErrorOnOOM) && !threadContext->TestThreadContextFlag(ThreadContextFlagDisableFatalOnOOM)) { - ++scriptContext->oomExceptionCount; + OutOfMemory_fatal_error(); } else { - ScriptContext* ctx = threadContext->GetScriptContextList(); - while (ctx) + threadContext->ClearDisableImplicitFlags(); +#if DBG + if (scriptContext) { - ++ctx->oomExceptionCount; - ctx = ctx->next; + ++scriptContext->oomExceptionCount; + } + else + { + ScriptContext* ctx = threadContext->GetScriptContextList(); + while (ctx) + { + ++ctx->oomExceptionCount; + ctx = ctx->next; + } } - } #endif - JavascriptExceptionObject *oom = JavascriptExceptionOperators::GetOutOfMemoryExceptionObject(scriptContext); + JavascriptExceptionObject *oom = JavascriptExceptionOperators::GetOutOfMemoryExceptionObject(scriptContext); - JavascriptExceptionOperators::ThrowExceptionObject(oom, scriptContext); + JavascriptExceptionOperators::ThrowExceptionObject(oom, scriptContext); + } } void JavascriptExceptionOperators::ThrowStackOverflow(ScriptContext *scriptContext, PVOID returnAddress) @@ -1081,6 +1170,10 @@ namespace Js { if (scriptContext) { + ThreadContext *threadContext = scriptContext->GetThreadContext(); +#if ENABLE_JS_REENTRANCY_CHECK + threadContext->SetNoJsReentrancy(false); +#endif if (fillExceptionContext) { Assert(exceptionObject); @@ -1091,22 +1184,17 @@ namespace Js exceptionObject->FillError(exceptionContext, scriptContext); AddStackTraceToObject(thrownObject, exceptionContext.GetStackTrace(), *scriptContext, /*isThrownException=*/ true, resetStack); } - Assert(!scriptContext || - // If we disabled implicit calls and we did record an implicit call, do not throw. + Assert(// If we disabled implicit calls and we did record an implicit call, do not throw. // Check your helper to see if a call recorded an implicit call that might cause an invalid value !( - scriptContext->GetThreadContext()->IsDisableImplicitCall() && - scriptContext->GetThreadContext()->GetImplicitCallFlags() & (~ImplicitCall_None) + threadContext->IsDisableImplicitCall() && + threadContext->GetImplicitCallFlags() & (~ImplicitCall_None) ) || // Make sure we didn't disable exceptions - !scriptContext->GetThreadContext()->IsDisableImplicitException() + !threadContext->IsDisableImplicitException() ); - ThreadContext *threadContext = scriptContext->GetThreadContext(); threadContext->ClearDisableImplicitFlags(); -#if ENABLE_JS_REENTRANCY_CHECK - threadContext->SetNoJsReentrancy(false); -#endif if (fillExceptionContext && considerPassingToDebugger) { @@ -1141,6 +1229,7 @@ namespace Js Assert(exceptionObject != NULL); Assert(scriptContext != NULL); +#ifdef ENABLE_SCRIPT_DEBUGGING if (scriptContext->IsScriptContextInDebugMode() && scriptContext->GetDebugContext()->GetProbeContainer()->HasAllowedForException(exceptionObject)) { @@ -1150,6 +1239,7 @@ namespace Js scriptContext->GetDebugContext()->GetProbeContainer()->DispatchExceptionBreakpoint(&haltState); } +#endif } void JavascriptExceptionOperators::ThrowExceptionObject(Js::JavascriptExceptionObject * exceptionObject, ScriptContext* scriptContext, bool considerPassingToDebugger, PVOID returnAddress, bool resetStack) @@ -1478,7 +1568,7 @@ namespace Js void JavascriptExceptionOperators::AppendExternalFrameToStackTrace(CompoundString* bs, LPCWSTR functionName, LPCWSTR fileName, ULONG lineNumber, LONG characterPosition) { - // format is equivalent to printf("\n at %s (%s:%d:%d)", functionName, filename, lineNumber, characterPosition); + // format is equivalent to wprintf("\n at %s (%s:%d:%d)", functionName, filename, lineNumber, characterPosition); const CharCount maxULongStringLength = 10; // excluding null terminator const auto ConvertULongToString = [](const ULONG value, char16 *const buffer, const CharCount charCapacity) @@ -1525,7 +1615,7 @@ namespace Js void JavascriptExceptionOperators::AppendLibraryFrameToStackTrace(CompoundString* bs, LPCWSTR functionName) { - // format is equivalent to printf("\n at %s (native code)", functionName); + // format is equivalent to wprintf("\n at %s (native code)", functionName); bs->AppendChars(_u("\n at ")); bs->AppendCharsSz(functionName); bs->AppendChars(_u(" (native code)")); diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionOperators.h b/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionOperators.h index 96922a6d5df..f32f7065dae 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionOperators.h +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptExceptionOperators.h @@ -43,6 +43,17 @@ namespace Js ~AutoCatchHandlerExists(); }; + class TryCatchFrameAddrStack + { + private: + void * m_prevTryCatchFrameAddr; + ThreadContext* m_threadContext; + + public: + TryCatchFrameAddrStack(ScriptContext* scriptContext, void *frameAddr); + ~TryCatchFrameAddrStack(); + }; + static void __declspec(noreturn) OP_Throw(Var object, ScriptContext* scriptContext); static void __declspec(noreturn) Throw(Var object, ScriptContext* scriptContext); static void __declspec(noreturn) ThrowExceptionObject(Js::JavascriptExceptionObject* exceptionObject, ScriptContext* scriptContext, bool considerPassingToDebugger = false, PVOID returnAddress = NULL, bool resetStack = false); @@ -80,6 +91,9 @@ namespace Js static Var ThrowTypeErrorRestrictedPropertyAccessor(RecyclableObject* function, CallInfo callInfo, ...); static Var StackTraceAccessor(RecyclableObject* function, CallInfo callInfo, ...); static void WalkStackForExceptionContext(ScriptContext& scriptContext, JavascriptExceptionContext& exceptionContext, Var thrownObject, uint64 stackCrawlLimit, PVOID returnAddress, bool isThrownException = true, bool resetSatck = false); +#if ENABLE_NATIVE_CODEGEN + static void WalkStackForCleaningUpInlineeInfo(ScriptContext *scriptContext, PVOID returnAddress, PVOID tryCatchFrameAddr); +#endif static void AddStackTraceToObject(Var obj, JavascriptExceptionContext::StackTrace* stackTrace, ScriptContext& scriptContext, bool isThrownException = true, bool resetSatck = false); static uint64 StackCrawlLimitOnThrow(Var thrownObject, ScriptContext& scriptContext); diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptNativeOperators.cpp b/deps/chakrashim/core/lib/Runtime/Language/JavascriptNativeOperators.cpp deleted file mode 100644 index 709c3025af5..00000000000 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptNativeOperators.cpp +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -//------------------------------------------------------------------------------------------------------- -#include "RuntimeLanguagePch.h" -#include "JavascriptNativeOperators.h" - -namespace Js -{ -#if ENABLE_NATIVE_CODEGEN - void * JavascriptNativeOperators::Op_SwitchStringLookUp(JavascriptString* str, Js::BranchDictionaryWrapper* branchTargets, uintptr_t funcStart, uintptr_t funcEnd) - { - void* defaultTarget = branchTargets->defaultTarget; - Js::BranchDictionaryWrapper::BranchDictionary& stringDictionary = branchTargets->dictionary; - void* target = stringDictionary.Lookup(str, defaultTarget); - uintptr_t utarget = (uintptr_t)target; - - if ((utarget - funcStart) > (funcEnd - funcStart)) - { - AssertMsg(false, "Switch string dictionary jump target outside of function"); - Throw::FatalInternalError(); - } - return target; - } -#endif -}; diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.cpp b/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.cpp index 3ca0681b8a9..50a4ba9fbdf 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.cpp @@ -91,52 +91,54 @@ namespace Js } else { - char16 buffer[20]; - ::_itow_s(indexInt, buffer, sizeof(buffer) / sizeof(char16), 10); - charcount_t length = JavascriptString::GetBufferLength(buffer); + char16 stringBuffer[22]; + + int pos = TaggedInt::ToBuffer(indexInt, stringBuffer, _countof(stringBuffer)); + charcount_t length = (_countof(stringBuffer) - 1) - pos; if (createIfNotFound || preferJavascriptStringOverPropertyRecord) { // When preferring JavascriptString objects, just return a PropertyRecord instead // of creating temporary JavascriptString objects for every negative integer that // comes through here. - scriptContext->GetOrAddPropertyRecord(buffer, length, propertyRecord); + scriptContext->GetOrAddPropertyRecord(stringBuffer + pos, length, propertyRecord); } else { - scriptContext->FindPropertyRecord(buffer, length, propertyRecord); + scriptContext->FindPropertyRecord(stringBuffer + pos, length, propertyRecord); } return IndexType_PropertyId; } } - else if (JavascriptSymbol::Is(indexVar)) - { - JavascriptSymbol* symbol = JavascriptSymbol::FromVar(indexVar); - - // JavascriptSymbols cannot add a new PropertyRecord - they correspond to one and only one existing PropertyRecord. - // We already know what the PropertyRecord is since it is stored in the JavascriptSymbol itself so just return it. - - *propertyRecord = symbol->GetValue(); - - return IndexType_PropertyId; - } else { - JavascriptString* indexStr = JavascriptConversion::ToString(indexVar, scriptContext); - char16 const * propertyName = indexStr->GetString(); - charcount_t const propertyLength = indexStr->GetLength(); + JavascriptSymbol * symbol = JavascriptOperators::TryFromVar(indexVar); + if (symbol) + { + // JavascriptSymbols cannot add a new PropertyRecord - they correspond to one and only one existing PropertyRecord. + // We already know what the PropertyRecord is since it is stored in the JavascriptSymbol itself so just return it. - if (!createIfNotFound && preferJavascriptStringOverPropertyRecord) + *propertyRecord = symbol->GetValue(); + return IndexType_PropertyId; + } + else { - if (JavascriptOperators::TryConvertToUInt32(propertyName, propertyLength, index) && - (*index != JavascriptArray::InvalidIndex)) + JavascriptString* indexStr = JavascriptConversion::ToString(indexVar, scriptContext); + char16 const * propertyName = indexStr->GetString(); + charcount_t const propertyLength = indexStr->GetLength(); + + if (!createIfNotFound && preferJavascriptStringOverPropertyRecord) { - return IndexType_Number; - } + if (JavascriptOperators::TryConvertToUInt32(propertyName, propertyLength, index) && + (*index != JavascriptArray::InvalidIndex)) + { + return IndexType_Number; + } - *propertyNameString = indexStr; - return IndexType_JavascriptString; + *propertyNameString = indexStr; + return IndexType_JavascriptString; + } + return GetIndexTypeFromString(propertyName, propertyLength, scriptContext, index, propertyRecord, createIfNotFound); } - return GetIndexTypeFromString(propertyName, propertyLength, scriptContext, index, propertyRecord, createIfNotFound); } } @@ -191,7 +193,7 @@ namespace Js // See Win8 bug 490489. callInfo.Flags = CallFlags_Value; - RecyclableObject *funcPtr = RecyclableObject::FromVar(func); + RecyclableObject *funcPtr = RecyclableObject::UnsafeFromVar(func); PROBE_STACK(scriptContext, Js::Constants::MinStackDefault + argCount * 4); JavascriptMethod entryPoint = funcPtr->GetEntryPoint(); @@ -413,10 +415,10 @@ namespace Js Js::JavascriptString* GetPropertyDisplayNameForError(Var prop, ScriptContext* scriptContext) { JavascriptString* str; - - if (JavascriptSymbol::Is(prop)) + JavascriptSymbol *symbol = JavascriptOperators::TryFromVar(prop); + if (symbol) { - str = JavascriptSymbol::ToString(JavascriptSymbol::FromVar(prop)->GetValue(), scriptContext); + str = JavascriptSymbol::ToString(symbol->GetValue(), scriptContext); } else { @@ -556,7 +558,7 @@ namespace Js } else { - BOOL res = RecyclableObject::FromVar(aRight)->Equals(aLeft, &result, requestContext); + BOOL res = RecyclableObject::UnsafeFromVar(aRight)->Equals(aLeft, &result, requestContext); AssertMsg(res, "Should have handled this"); return result; } @@ -573,7 +575,7 @@ namespace Js } else { - BOOL res = RecyclableObject::FromVar(aRight)->Equals(aLeft, &result, requestContext); + BOOL res = RecyclableObject::UnsafeFromVar(aRight)->Equals(aLeft, &result, requestContext); AssertMsg(res, "Should have handled this"); return result; } @@ -585,7 +587,7 @@ namespace Js } #endif - if (RecyclableObject::FromVar(aLeft)->Equals(aRight, &result, requestContext)) + if (RecyclableObject::UnsafeFromVar(aLeft)->Equals(aRight, &result, requestContext)) { return result; } @@ -678,15 +680,15 @@ namespace Js { case TypeIds_Int64Number: { - __int64 leftValue = JavascriptInt64Number::FromVar(aLeft)->GetValue(); - __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); + __int64 leftValue = JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); + __int64 rightValue = JavascriptInt64Number::UnsafeFromVar(aRight)->GetValue(); return leftValue < rightValue; } break; case TypeIds_UInt64Number: { - __int64 leftValue = JavascriptInt64Number::FromVar(aLeft)->GetValue(); - unsigned __int64 rightValue = JavascriptUInt64Number::FromVar(aRight)->GetValue(); + __int64 leftValue = JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); + unsigned __int64 rightValue = JavascriptUInt64Number::UnsafeFromVar(aRight)->GetValue(); if (rightValue <= INT_MAX && leftValue >= 0) { return leftValue < (__int64)rightValue; @@ -694,7 +696,7 @@ namespace Js } break; } - dblLeft = (double)JavascriptInt64Number::FromVar(aLeft)->GetValue(); + dblLeft = (double)JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); dblRight = JavascriptConversion::ToNumber(aRight, scriptContext); } break; @@ -708,8 +710,8 @@ namespace Js { case TypeIds_Int64Number: { - unsigned __int64 leftValue = JavascriptUInt64Number::FromVar(aLeft)->GetValue(); - __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); + unsigned __int64 leftValue = JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); + __int64 rightValue = JavascriptInt64Number::UnsafeFromVar(aRight)->GetValue(); if (leftValue < INT_MAX && rightValue >= 0) { return (__int64)leftValue < rightValue; @@ -718,13 +720,13 @@ namespace Js break; case TypeIds_UInt64Number: { - unsigned __int64 leftValue = JavascriptUInt64Number::FromVar(aLeft)->GetValue(); - unsigned __int64 rightValue = JavascriptUInt64Number::FromVar(aRight)->GetValue(); + unsigned __int64 leftValue = JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); + unsigned __int64 rightValue = JavascriptUInt64Number::UnsafeFromVar(aRight)->GetValue(); return leftValue < rightValue; } break; } - dblLeft = (double)JavascriptUInt64Number::FromVar(aLeft)->GetValue(); + dblLeft = (double)JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); dblRight = JavascriptConversion::ToNumber(aRight, scriptContext); } break; @@ -872,11 +874,14 @@ namespace Js BOOL JavascriptOperators::StrictEqualEmptyString(Var aLeft) { - TypeId leftType = JavascriptOperators::GetTypeId(aLeft); - if (leftType != TypeIds_String) + JavascriptString * string = JavascriptOperators::TryFromVar(aLeft); + if (!string) + { return false; + } - return JavascriptString::FromVar(aLeft)->GetLength() == 0; + Assert(string); + return string->GetLength() == 0; } BOOL JavascriptOperators::StrictEqual(Var aLeft, Var aRight, ScriptContext* requestContext) @@ -917,18 +922,18 @@ namespace Js { case TypeIds_Int64Number: { - __int64 leftValue = JavascriptInt64Number::FromVar(aLeft)->GetValue(); - __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); + __int64 leftValue = JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); + __int64 rightValue = JavascriptInt64Number::UnsafeFromVar(aRight)->GetValue(); return leftValue == rightValue; } case TypeIds_UInt64Number: { - __int64 leftValue = JavascriptInt64Number::FromVar(aLeft)->GetValue(); + __int64 leftValue = JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); unsigned __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); return ((unsigned __int64)leftValue == rightValue); } case TypeIds_Number: - dblLeft = (double)JavascriptInt64Number::FromVar(aLeft)->GetValue(); + dblLeft = (double)JavascriptInt64Number::UnsafeFromVar(aLeft)->GetValue(); dblRight = JavascriptNumber::GetValue(aRight); goto CommonNumber; } @@ -938,18 +943,18 @@ namespace Js { case TypeIds_Int64Number: { - unsigned __int64 leftValue = JavascriptUInt64Number::FromVar(aLeft)->GetValue(); - __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); + unsigned __int64 leftValue = JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); + __int64 rightValue = JavascriptInt64Number::UnsafeFromVar(aRight)->GetValue(); return (leftValue == (unsigned __int64)rightValue); } case TypeIds_UInt64Number: { - unsigned __int64 leftValue = JavascriptUInt64Number::FromVar(aLeft)->GetValue(); + unsigned __int64 leftValue = JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); unsigned __int64 rightValue = JavascriptInt64Number::FromVar(aRight)->GetValue(); return leftValue == rightValue; } case TypeIds_Number: - dblLeft = (double)JavascriptUInt64Number::FromVar(aLeft)->GetValue(); + dblLeft = (double)JavascriptUInt64Number::UnsafeFromVar(aLeft)->GetValue(); dblRight = JavascriptNumber::GetValue(aRight); goto CommonNumber; } @@ -968,7 +973,7 @@ namespace Js goto CommonNumber; case TypeIds_UInt64Number: dblLeft = JavascriptNumber::GetValue(aLeft); - dblRight = (double)JavascriptUInt64Number::FromVar(aRight)->GetValue(); + dblRight = (double)JavascriptUInt64Number::UnsafeFromVar(aRight)->GetValue(); goto CommonNumber; case TypeIds_Number: dblLeft = JavascriptNumber::GetValue(aLeft); @@ -999,8 +1004,8 @@ namespace Js { case TypeIds_Symbol: { - const PropertyRecord* leftValue = JavascriptSymbol::FromVar(aLeft)->GetValue(); - const PropertyRecord* rightValue = JavascriptSymbol::FromVar(aRight)->GetValue(); + const PropertyRecord* leftValue = JavascriptSymbol::UnsafeFromVar(aLeft)->GetValue(); + const PropertyRecord* rightValue = JavascriptSymbol::UnsafeFromVar(aRight)->GetValue(); return leftValue == rightValue; } } @@ -1014,7 +1019,7 @@ namespace Js case TypeIds_GlobalObject: { BOOL result; - if(RecyclableObject::FromVar(aLeft)->StrictEquals(aRight, &result, requestContext)) + if(RecyclableObject::UnsafeFromVar(aLeft)->StrictEquals(aRight, &result, requestContext)) { return result; } @@ -1067,60 +1072,61 @@ namespace Js return aLeft == aRight; } - BOOL JavascriptOperators::HasOwnProperty(Var instance, PropertyId propertyId, ScriptContext *requestContext) + BOOL JavascriptOperators::HasOwnProperty( + Var instance, + PropertyId propertyId, + _In_ ScriptContext* requestContext, + _In_opt_ PropertyString* propString) { if (TaggedNumber::Is(instance)) { return FALSE; } - else + RecyclableObject* object = RecyclableObject::UnsafeFromVar(instance); + + if (JavascriptProxy::Is(instance)) { - RecyclableObject* object = RecyclableObject::FromVar(instance); + PropertyDescriptor desc; + return GetOwnPropertyDescriptor(object, propertyId, requestContext, &desc); + } - if (JavascriptProxy::Is(instance)) + // If we have a PropertyString, attempt to shortcut the lookup by using its caches + if (propString != nullptr) + { + PropertyCacheOperationInfo info; + if (propString->GetLdElemInlineCache()->PretendTryGetProperty(object->GetType(), &info)) { - PropertyDescriptor desc; - return GetOwnPropertyDescriptor(object, propertyId, requestContext, &desc); + switch (info.cacheType) + { + case CacheType_Local: + Assert(object->HasOwnProperty(propertyId)); + return TRUE; + case CacheType_Proto: + Assert(!object->HasOwnProperty(propertyId)); + return FALSE; + default: + // We had a cache hit, but cache doesn't tell us if we have an own property + break; + } } - else + if (propString->GetStElemInlineCache()->PretendTrySetProperty(object->GetType(), object->GetType(), &info)) { - PropertyString *propString = requestContext->TryGetPropertyString(propertyId); - if (propString != nullptr) + switch (info.cacheType) { - PropertyCacheOperationInfo info; - if (propString->GetLdElemInlineCache()->PretendTryGetProperty(object->GetType(), &info)) - { - switch (info.cacheType) - { - case CacheType_Local: - Assert(object->HasOwnProperty(propertyId)); - return TRUE; - case CacheType_Proto: - Assert(!object->HasOwnProperty(propertyId)); - return FALSE; - default: - break; - } - } - if (propString->GetStElemInlineCache()->PretendTrySetProperty(object->GetType(), object->GetType(), &info)) - { - switch (info.cacheType) - { - case CacheType_Local: - Assert(object->HasOwnProperty(propertyId)); - return TRUE; - case CacheType_LocalWithoutProperty: - Assert(!object->HasOwnProperty(propertyId)); - return FALSE; - default: - break; - } - } + case CacheType_Local: + Assert(object->HasOwnProperty(propertyId)); + return TRUE; + case CacheType_LocalWithoutProperty: + Assert(!object->HasOwnProperty(propertyId)); + return FALSE; + default: + // We had a cache hit, but cache doesn't tell us if we have an own property + break; } - - return object && object->HasOwnProperty(propertyId); } } + + return object && object->HasOwnProperty(propertyId); } BOOL JavascriptOperators::GetOwnAccessors(Var instance, PropertyId propertyId, Var* getter, Var* setter, ScriptContext * requestContext) @@ -1132,7 +1138,7 @@ namespace Js } else { - RecyclableObject* object = RecyclableObject::FromVar(instance); + RecyclableObject* object = RecyclableObject::UnsafeFromVar(instance); result = object && object->GetAccessors(propertyId, getter, setter, requestContext); } return result; @@ -1141,10 +1147,9 @@ namespace Js JavascriptArray* JavascriptOperators::GetOwnPropertyNames(Var instance, ScriptContext *scriptContext) { RecyclableObject *object = RecyclableObject::FromVar(ToObject(instance, scriptContext)); - - if (JavascriptProxy::Is(instance)) + JavascriptProxy * proxy = JavascriptOperators::TryFromVar(instance); + if (proxy) { - JavascriptProxy* proxy = JavascriptProxy::FromVar(instance); return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind, scriptContext); } @@ -1156,9 +1161,9 @@ namespace Js RecyclableObject *object = RecyclableObject::FromVar(ToObject(instance, scriptContext)); CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(Object_Constructor_getOwnPropertySymbols); - if (JavascriptProxy::Is(instance)) + JavascriptProxy* proxy = JavascriptOperators::TryFromVar(instance); + if (proxy) { - JavascriptProxy* proxy = JavascriptProxy::FromVar(instance); return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertySymbolKind, scriptContext); } @@ -1169,9 +1174,9 @@ namespace Js { RecyclableObject *object = RecyclableObject::FromVar(ToObject(instance, scriptContext)); - if (JavascriptProxy::Is(instance)) + JavascriptProxy* proxy = JavascriptOperators::TryFromVar(instance); + if (proxy) { - JavascriptProxy* proxy = JavascriptProxy::FromVar(instance); return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::KeysKind, scriptContext); } @@ -1180,9 +1185,9 @@ namespace Js JavascriptArray* JavascriptOperators::GetOwnEnumerablePropertyNames(RecyclableObject* object, ScriptContext* scriptContext) { - if (JavascriptProxy::Is(object)) + JavascriptProxy* proxy = JavascriptOperators::TryFromVar(object); + if (proxy) { - JavascriptProxy* proxy = JavascriptProxy::FromVar(object); JavascriptArray* proxyResult = proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind, scriptContext); JavascriptArray* proxyResultToReturn = scriptContext->GetLibrary()->CreateArray(0); @@ -1198,7 +1203,7 @@ namespace Js Assert(!JavascriptSymbol::Is(element)); PropertyDescriptor propertyDescriptor; - JavascriptConversion::ToPropertyKey(element, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(element, scriptContext, &propertyRecord, nullptr); if (JavascriptOperators::GetOwnPropertyDescriptor(object, propertyRecord->GetPropertyId(), scriptContext, &propertyDescriptor)) { if (propertyDescriptor.IsEnumerable()) @@ -1214,15 +1219,15 @@ namespace Js JavascriptArray* JavascriptOperators::GetOwnEnumerablePropertyNamesSymbols(RecyclableObject* object, ScriptContext* scriptContext) { - if (JavascriptProxy::Is(object)) + JavascriptProxy* proxy = JavascriptOperators::TryFromVar(object); + if (proxy) { - JavascriptProxy* proxy = JavascriptProxy::FromVar(object); return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::KeysKind, scriptContext); } return JavascriptObject::CreateOwnEnumerableStringSymbolPropertiesHelper(object, scriptContext); } - BOOL JavascriptOperators::GetOwnProperty(Var instance, PropertyId propertyId, Var* value, ScriptContext* requestContext) + BOOL JavascriptOperators::GetOwnProperty(Var instance, PropertyId propertyId, Var* value, ScriptContext* requestContext, PropertyValueInfo * propertyValueInfo) { BOOL result; if (TaggedNumber::Is(instance)) @@ -1232,7 +1237,13 @@ namespace Js else { RecyclableObject* object = RecyclableObject::FromVar(instance); - result = object && object->GetProperty(object, propertyId, value, NULL, requestContext); + result = object && object->GetProperty(object, propertyId, value, propertyValueInfo, requestContext); + + if (propertyValueInfo && result) + { + // We can only update the cache in case a property was found, because if it wasn't found, we don't know if it is missing or on a prototype + CacheOperators::CachePropertyRead(instance, object, false /* isRoot */, propertyId, false /* isMissing */, propertyValueInfo, requestContext); + } } return result; } @@ -1261,7 +1272,7 @@ namespace Js if (false == JavascriptOperators::GetOwnAccessors(obj, propertyId, &getter, &setter, scriptContext)) { Var value = nullptr; - if (false == JavascriptOperators::GetOwnProperty(obj, propertyId, &value, scriptContext)) + if (false == JavascriptOperators::GetOwnProperty(obj, propertyId, &value, scriptContext, nullptr)) { return FALSE; } @@ -1314,47 +1325,82 @@ namespace Js return type->GetPrototype(); } - BOOL JavascriptOperators::IsArray(Var instanceVar) + BOOL JavascriptOperators::IsRemoteArray(RecyclableObject* instance) + { + TypeId remoteTypeId = TypeIds_Limit; + return (JavascriptOperators::GetRemoteTypeId(instance, &remoteTypeId) && + DynamicObject::IsAnyArrayTypeId(remoteTypeId)); + } + + bool JavascriptOperators::IsArray(_In_ JavascriptProxy * instance) { - if (!RecyclableObject::Is(instanceVar)) + // If it is a proxy, follow to the end of the proxy chain before checking if it is an array again. + JavascriptProxy * proxy = instance; + while (true) { - return FALSE; + RecyclableObject * targetInstance = proxy->GetTarget(); + proxy = JavascriptOperators::TryFromVar(targetInstance); + if (proxy == nullptr) + { + return DynamicObject::IsAnyArray(targetInstance) || IsRemoteArray(targetInstance); + } } - RecyclableObject* instance = RecyclableObject::FromVar(instanceVar); + } + + bool JavascriptOperators::IsArray(_In_ RecyclableObject* instance) + { if (DynamicObject::IsAnyArray(instance)) { return TRUE; } - if (JavascriptProxy::Is(instanceVar)) - { - JavascriptProxy* proxy = JavascriptProxy::FromVar(instanceVar); - return IsArray(proxy->GetTarget()); - } - TypeId remoteTypeId = TypeIds_Limit; - if (JavascriptOperators::GetRemoteTypeId(instanceVar, &remoteTypeId) && - DynamicObject::IsAnyArrayTypeId(remoteTypeId)) + + JavascriptProxy* proxy = JavascriptOperators::TryFromVar(instance); + if (proxy) { - return TRUE; + return IsArray(proxy); } - return FALSE; + + return IsRemoteArray(instance); } - BOOL JavascriptOperators::IsConstructor(Var instanceVar) + bool JavascriptOperators::IsArray(_In_ Var instanceVar) { - if (!RecyclableObject::Is(instanceVar)) - { - return FALSE; - } - if (JavascriptProxy::Is(instanceVar)) + RecyclableObject* instanceObj = TryFromVar(instanceVar); + return instanceObj && IsArray(instanceObj); + } + + bool JavascriptOperators::IsConstructor(_In_ JavascriptProxy * instance) + { + // If it is a proxy, follow to the end of the proxy chain before checking if it is a constructor again. + JavascriptProxy * proxy = instance; + while (true) { - JavascriptProxy* proxy = JavascriptProxy::FromVar(instanceVar); - return IsConstructor(proxy->GetTarget()); + RecyclableObject* targetInstance = proxy->GetTarget(); + proxy = JavascriptOperators::TryFromVar(targetInstance); + if (proxy == nullptr) + { + JavascriptFunction* function = JavascriptOperators::TryFromVar(targetInstance); + return function && function->IsConstructor(); + } } - if (!JavascriptFunction::Is(instanceVar)) + } + + bool JavascriptOperators::IsConstructor(_In_ RecyclableObject* instanceObj) + { + JavascriptProxy* proxy = JavascriptOperators::TryFromVar(instanceObj); + if (proxy) { - return FALSE; + return IsConstructor(proxy); } - return JavascriptFunction::FromVar(instanceVar)->IsConstructor(); + + JavascriptFunction* function = JavascriptOperators::TryFromVar(instanceObj); + return function && function->IsConstructor(); + } + + bool JavascriptOperators::IsConstructor(_In_ Var instanceVar) + { + RecyclableObject* instanceObj = TryFromVar(instanceVar); + return instanceObj && IsConstructor(instanceObj); } BOOL JavascriptOperators::IsConcatSpreadable(Var instanceVar) @@ -1366,7 +1412,7 @@ namespace Js return false; } - RecyclableObject* instance = RecyclableObject::FromVar(instanceVar); + RecyclableObject* instance = RecyclableObject::UnsafeFromVar(instanceVar); ScriptContext* scriptContext = instance->GetScriptContext(); if (!PHASE_OFF1(IsConcatSpreadableCachePhase)) @@ -1409,24 +1455,44 @@ namespace Js return JavascriptOperators::IsArray(instance); } + bool JavascriptOperators::IsConstructorSuperCall(Arguments args) + { + Var newTarget = args.GetNewTarget(); + return args.IsNewCall() && newTarget != nullptr + && !JavascriptOperators::IsUndefined(newTarget); + } + + bool JavascriptOperators::GetAndAssertIsConstructorSuperCall(Arguments args) + { + bool isCtorSuperCall = JavascriptOperators::IsConstructorSuperCall(args); + Assert(isCtorSuperCall || !args.IsNewCall() + || args[0] == nullptr || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + return isCtorSuperCall; + } + Var JavascriptOperators::OP_LdCustomSpreadIteratorList(Var aRight, ScriptContext* scriptContext) { #if ENABLE_COPYONACCESS_ARRAY // We know we're going to read from this array. Do the conversion before we try to perform checks on the head segment. JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(aRight); #endif + +#ifdef ENABLE_JS_BUILTINS + scriptContext->GetLibrary()->EnsureBuiltInEngineIsReady(); +#endif + RecyclableObject* function = GetIteratorFunction(aRight, scriptContext); JavascriptMethod method = function->GetEntryPoint(); if (((JavascriptArray::Is(aRight) && ( - method == JavascriptArray::EntryInfo::Values.GetOriginalEntryPoint() + JavascriptLibrary::IsDefaultArrayValuesFunction(function, scriptContext) // Verify that the head segment of the array covers all elements with no gaps. // Accessing an element on the prototype could have side-effects that would invalidate the optimization. - && JavascriptArray::FromVar(aRight)->GetHead()->next == nullptr - && JavascriptArray::FromVar(aRight)->GetHead()->left == 0 - && JavascriptArray::FromVar(aRight)->GetHead()->length == JavascriptArray::FromVar(aRight)->GetLength() - && JavascriptArray::FromVar(aRight)->HasNoMissingValues() - && !JavascriptArray::FromVar(aRight)->IsCrossSiteObject() + && JavascriptArray::UnsafeFromVar(aRight)->GetHead()->next == nullptr + && JavascriptArray::UnsafeFromVar(aRight)->GetHead()->left == 0 + && JavascriptArray::UnsafeFromVar(aRight)->GetHead()->length == JavascriptArray::FromVar(aRight)->GetLength() + && JavascriptArray::UnsafeFromVar(aRight)->HasNoMissingValues() + && !JavascriptArray::UnsafeFromVar(aRight)->IsCrossSiteObject() )) || (TypedArrayBase::Is(aRight) && method == TypedArrayBase::EntryInfo::Values.GetOriginalEntryPoint())) // We can't optimize away the iterator if the array iterator prototype is user defined. @@ -1558,7 +1624,7 @@ namespace Js RecyclableObject* object = TaggedNumber::Is(instance) ? scriptContext->GetLibrary()->GetNumberPrototype() : RecyclableObject::FromVar(instance); - BOOL result = HasOwnProperty(object, propertyId, scriptContext); + BOOL result = HasOwnProperty(object, propertyId, scriptContext, nullptr); return result; } @@ -1651,9 +1717,10 @@ namespace Js { AssertMsg(scope == scriptContext->GetLibrary()->GetNull() || JavascriptArray::Is(scope), "Invalid scope chain pointer passed - should be null or an array"); - if (JavascriptArray::Is(scope)) + + JavascriptArray* arrScope = JavascriptOperators::TryFromVar(scope); + if (arrScope) { - JavascriptArray* arrScope = JavascriptArray::FromVar(scope); Var instance = arrScope->DirectGetItem(0); return JavascriptOperators::OP_HasOwnProperty(instance, propertyId, scriptContext); } @@ -1748,7 +1815,7 @@ namespace Js if (foundProperty) { -#if DBG +#if ENABLE_FIXED_FIELDS && DBG if (DynamicObject::Is(object)) { DynamicObject* dynamicObject = (DynamicObject*)object; @@ -1788,6 +1855,7 @@ namespace Js return TRUE; } + else { #ifdef MISSING_PROPERTY_STATS @@ -1801,9 +1869,11 @@ namespace Js Output::Print(_u("MissingPropertyCaching: Missing property %d on slow path.\n"), propertyId); } - // Only cache missing property lookups for non-root field loads on objects that have PathTypeHandlers, because only these objects guarantee a type change when the property is added, - // which obviates the need to explicitly invalidate missing property inline caches. - if (!PHASE_OFF1(MissingPropertyCachePhase) && !isRoot && DynamicObject::Is(instance) && ((DynamicObject*)instance)->GetDynamicType()->GetTypeHandler()->IsPathTypeHandler()) + // Only cache missing property lookups for non-root field loads on objects that have PathTypeHandlers and DictionaryTypeHandlers, because only these types have the right behavior + // when the missing property is later added: path types guarantee a type change, and DictionaryTypeHandlerBase::AddProperty explicitly invalidates all prototype caches for the + // property. (We don't support other types only because we haven't needed to yet; we do not anticipate any difficulties in adding the cache-invalidation logic there if that changes.) + if (!PHASE_OFF1(MissingPropertyCachePhase) && !isRoot && DynamicObject::Is(instance) && + (DynamicObject::FromVar(instance)->GetDynamicType()->GetTypeHandler()->IsPathTypeHandler() || DynamicObject::FromVar(instance)->GetDynamicType()->GetTypeHandler()->IsDictionaryTypeHandler())) { #ifdef MISSING_PROPERTY_STATS if (PHASE_STATS1(MissingPropertyCachePhase)) @@ -1873,7 +1943,7 @@ namespace Js *propertyObject = scriptContext->GetLibrary()->GetNumberPrototype(); return TRUE; } - RecyclableObject* object = RecyclableObject::FromVar(instance); + RecyclableObject* object = RecyclableObject::UnsafeFromVar(instance); *propertyObject = object; if (JavascriptOperators::IsUndefinedOrNull(object)) { @@ -2104,7 +2174,8 @@ namespace Js { JavascriptError::ThrowReferenceError(requestContext, JSERR_UseBeforeDeclaration); } -#if DBG + +#if ENABLE_FIXED_FIELDS && DBG if (DynamicObject::Is(object)) { DynamicObject* dynamicObject = (DynamicObject*)object; @@ -2623,7 +2694,7 @@ namespace Js if (!TaggedNumber::Is(thisInstance)) { - return JavascriptOperators::SetProperty(RecyclableObject::FromVar(thisInstance), RecyclableObject::FromVar(instance), propertyId, newValue, info, scriptContext, flags); + return JavascriptOperators::SetProperty(RecyclableObject::UnsafeFromVar(thisInstance), RecyclableObject::UnsafeFromVar(instance), propertyId, newValue, info, scriptContext, flags); } JavascriptError::ThrowCantAssignIfStrictMode(flags, scriptContext); @@ -2852,7 +2923,7 @@ namespace Js for (uint16 i = 0; i < length; i++) { - object = RecyclableObject::FromVar(pDisplay->GetItem(i)); + object = RecyclableObject::UnsafeFromVar(pDisplay->GetItem(i)); AssertMsg(!ConsoleScopeActivationObject::Is(object) || (i == length - 1), "Invalid location for ConsoleScopeActivationObject"); @@ -2963,24 +3034,27 @@ namespace Js if ((length > 0) && ConsoleScopeActivationObject::Is(pDisplay->GetItem(length - 1))) { // CheckPrototypesForAccessorOrNonWritableProperty does not check for const in global object. We should check it here. - if ((length > 1) && GlobalObject::Is(pDisplay->GetItem(length - 2))) + if (length > 1) { - GlobalObject* globalObject = GlobalObject::FromVar(pDisplay->GetItem(length - 2)); - Var setterValue = nullptr; - - DescriptorFlags flags = JavascriptOperators::GetRootSetter(globalObject, propertyId, &setterValue, &info, scriptContext); - Assert((flags & Accessor) != Accessor); - Assert((flags & Proxy) != Proxy); - if ((flags & Data) == Data && (flags & Writable) == None) + Js::GlobalObject * globalObject = JavascriptOperators::TryFromVar(pDisplay->GetItem(length - 2)); + if (globalObject) { - if (!allowUndecInConsoleScope) + Var setterValue = nullptr; + + DescriptorFlags flags = JavascriptOperators::GetRootSetter(globalObject, propertyId, &setterValue, &info, scriptContext); + Assert((flags & Accessor) != Accessor); + Assert((flags & Proxy) != Proxy); + if ((flags & Data) == Data && (flags & Writable) == None) { - if (flags & Const) + if (!allowUndecInConsoleScope) { - JavascriptError::ThrowTypeError(scriptContext, ERRAssignmentToConst); + if (flags & Const) + { + JavascriptError::ThrowTypeError(scriptContext, ERRAssignmentToConst); + } + Assert(!isLexicalThisSlotSymbol); + return; } - Assert(!isLexicalThisSlotSymbol); - return; } } } @@ -3279,12 +3353,13 @@ namespace Js Assert(instance); Assert(expectingNativeFloatArray ^ expectingVarArray); - if (!JavascriptNativeArray::Is(instance)) + JavascriptNativeArray * nativeArr = JavascriptOperators::TryFromVar(instance); + if (!nativeArr) { return; } - ArrayCallSiteInfo *const arrayCallSiteInfo = JavascriptNativeArray::FromVar(instance)->GetArrayCallSiteInfo(); + ArrayCallSiteInfo *const arrayCallSiteInfo = nativeArr->GetArrayCallSiteInfo(); if (!arrayCallSiteInfo) { return; @@ -3322,41 +3397,16 @@ namespace Js { JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedFunction /* TODO-ERROR: get arg name - aFunc */); } - return RecyclableObject::FromVar(callee); + return RecyclableObject::UnsafeFromVar(callee); } -#if ENABLE_NATIVE_CODEGEN Var JavascriptOperators::OP_GetElementI_JIT(Var instance, Var index, ScriptContext *scriptContext) { - Assert(Js::JavascriptStackWalker::ValidateTopJitFrame(scriptContext)); - - return OP_GetElementI(instance, index, scriptContext); - } -#else - Var JavascriptOperators::OP_GetElementI_JIT(Var instance, Var index, ScriptContext *scriptContext) - { - return OP_GetElementI(instance, index, scriptContext); - } -#endif - #if ENABLE_NATIVE_CODEGEN - Var JavascriptOperators::OP_GetElementI_JIT_ExpectingNativeFloatArray(Var instance, Var index, ScriptContext *scriptContext) - { - Assert(Js::JavascriptStackWalker::ValidateTopJitFrame(scriptContext)); - - UpdateNativeArrayProfileInfoToCreateVarArray(instance, true, false); - return OP_GetElementI_JIT(instance, index, scriptContext); - } - - Var JavascriptOperators::OP_GetElementI_JIT_ExpectingVarArray(Var instance, Var index, ScriptContext *scriptContext) - { Assert(Js::JavascriptStackWalker::ValidateTopJitFrame(scriptContext)); - - - UpdateNativeArrayProfileInfoToCreateVarArray(instance, false, true); - return OP_GetElementI_JIT(instance, index, scriptContext); - } #endif + return OP_GetElementI(instance, index, scriptContext); + } Var JavascriptOperators::OP_GetElementI_UInt32(Var instance, uint32 index, ScriptContext* scriptContext) { @@ -3369,22 +3419,6 @@ namespace Js #endif } - Var JavascriptOperators::OP_GetElementI_UInt32_ExpectingNativeFloatArray(Var instance, uint32 index, ScriptContext* scriptContext) - { -#if ENABLE_PROFILE_INFO - UpdateNativeArrayProfileInfoToCreateVarArray(instance, true, false); -#endif - return OP_GetElementI_UInt32(instance, index, scriptContext); - } - - Var JavascriptOperators::OP_GetElementI_UInt32_ExpectingVarArray(Var instance, uint32 index, ScriptContext* scriptContext) - { -#if ENABLE_PROFILE_INFO - UpdateNativeArrayProfileInfoToCreateVarArray(instance, false, true); -#endif - return OP_GetElementI_UInt32(instance, index, scriptContext); - } - Var JavascriptOperators::OP_GetElementI_Int32(Var instance, int32 index, ScriptContext* scriptContext) { #if FLOATVAR @@ -3396,22 +3430,6 @@ namespace Js #endif } - Var JavascriptOperators::OP_GetElementI_Int32_ExpectingNativeFloatArray(Var instance, int32 index, ScriptContext* scriptContext) - { -#if ENABLE_PROFILE_INFO - UpdateNativeArrayProfileInfoToCreateVarArray(instance, true, false); -#endif - return OP_GetElementI_Int32(instance, index, scriptContext); - } - - Var JavascriptOperators::OP_GetElementI_Int32_ExpectingVarArray(Var instance, int32 index, ScriptContext* scriptContext) - { -#if ENABLE_PROFILE_INFO - UpdateNativeArrayProfileInfoToCreateVarArray(instance, false, true); -#endif - return OP_GetElementI_Int32(instance, index, scriptContext); - } - BOOL JavascriptOperators::GetItemFromArrayPrototype(JavascriptArray * arr, int32 indexInt, Var * result, ScriptContext * scriptContext) { // try get from Array prototype @@ -3421,7 +3439,7 @@ namespace Js return false; } - JavascriptArray* arrayPrototype = JavascriptArray::FromVar(prototype); //Prototype must be Array.prototype (unless changed through __proto__) + JavascriptArray* arrayPrototype = JavascriptArray::UnsafeFromVar(prototype); //Prototype must be Array.prototype (unless changed through __proto__) if (arrayPrototype->GetLength() && arrayPrototype->GetItem(arrayPrototype, (uint32)indexInt, result, scriptContext)) { return true; @@ -3474,7 +3492,7 @@ namespace Js Var JavascriptOperators::OP_GetElementI(Var instance, Var index, ScriptContext* scriptContext) { - JavascriptString *temp = NULL; + JavascriptString *temp = nullptr; #if ENABLE_COPYONACCESS_ARRAY JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(instance); #endif @@ -3487,7 +3505,7 @@ namespace Js case TypeIds_Array: //fast path for array { Var result; - if (OP_GetElementI_ArrayFastPath(JavascriptArray::FromVar(instance), TaggedInt::ToInt32(index), &result, scriptContext)) + if (OP_GetElementI_ArrayFastPath(JavascriptArray::UnsafeFromVar(instance), TaggedInt::ToInt32(index), &result, scriptContext)) { return result; } @@ -3496,7 +3514,7 @@ namespace Js case TypeIds_NativeIntArray: { Var result; - if (OP_GetElementI_ArrayFastPath(JavascriptNativeIntArray::FromVar(instance), TaggedInt::ToInt32(index), &result, scriptContext)) + if (OP_GetElementI_ArrayFastPath(JavascriptNativeIntArray::UnsafeFromVar(instance), TaggedInt::ToInt32(index), &result, scriptContext)) { return result; } @@ -3505,7 +3523,7 @@ namespace Js case TypeIds_NativeFloatArray: { Var result; - if (OP_GetElementI_ArrayFastPath(JavascriptNativeFloatArray::FromVar(instance), TaggedInt::ToInt32(index), &result, scriptContext)) + if (OP_GetElementI_ArrayFastPath(JavascriptNativeFloatArray::UnsafeFromVar(instance), TaggedInt::ToInt32(index), &result, scriptContext)) { return result; } @@ -3515,7 +3533,7 @@ namespace Js case TypeIds_String: // fast path for string { charcount_t indexInt = TaggedInt::ToUInt32(index); - JavascriptString* string = JavascriptString::FromVar(instance); + JavascriptString* string = JavascriptString::UnsafeFromVar(instance); Var result; if (JavascriptConversion::PropertyQueryFlagsToBoolean(string->JavascriptString::GetItemQuery(instance, indexInt, &result, scriptContext))) { @@ -3530,7 +3548,7 @@ namespace Js int32 indexInt = TaggedInt::ToInt32(index); if (VirtualTableInfo::HasVirtualTable(instance)) { - Int8VirtualArray* int8Array = Int8VirtualArray::FromVar(instance); + Int8VirtualArray* int8Array = Int8VirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return int8Array->DirectGetItem(indexInt); @@ -3538,7 +3556,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Int8Array* int8Array = Int8Array::FromVar(instance); + Int8Array* int8Array = Int8Array::UnsafeFromVar(instance); if (indexInt >= 0) { return int8Array->DirectGetItem(indexInt); @@ -3553,7 +3571,7 @@ namespace Js int32 indexInt = TaggedInt::ToInt32(index); if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint8VirtualArray* uint8Array = Uint8VirtualArray::FromVar(instance); + Uint8VirtualArray* uint8Array = Uint8VirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return uint8Array->DirectGetItem(indexInt); @@ -3561,7 +3579,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint8Array* uint8Array = Uint8Array::FromVar(instance); + Uint8Array* uint8Array = Uint8Array::UnsafeFromVar(instance); if (indexInt >= 0) { return uint8Array->DirectGetItem(indexInt); @@ -3576,7 +3594,7 @@ namespace Js int32 indexInt = TaggedInt::ToInt32(index); if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint8ClampedVirtualArray* uint8ClampedArray = Uint8ClampedVirtualArray::FromVar(instance); + Uint8ClampedVirtualArray* uint8ClampedArray = Uint8ClampedVirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return uint8ClampedArray->DirectGetItem(indexInt); @@ -3584,7 +3602,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint8ClampedArray* uint8ClampedArray = Uint8ClampedArray::FromVar(instance); + Uint8ClampedArray* uint8ClampedArray = Uint8ClampedArray::UnsafeFromVar(instance); if (indexInt >= 0) { return uint8ClampedArray->DirectGetItem(indexInt); @@ -3600,7 +3618,7 @@ namespace Js if (VirtualTableInfo::HasVirtualTable(instance)) { - Int16VirtualArray* int16Array = Int16VirtualArray::FromVar(instance); + Int16VirtualArray* int16Array = Int16VirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return int16Array->DirectGetItem(indexInt); @@ -3608,7 +3626,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Int16Array* int16Array = Int16Array::FromVar(instance); + Int16Array* int16Array = Int16Array::UnsafeFromVar(instance); if (indexInt >= 0) { return int16Array->DirectGetItem(indexInt); @@ -3624,7 +3642,7 @@ namespace Js if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint16VirtualArray* uint16Array = Uint16VirtualArray::FromVar(instance); + Uint16VirtualArray* uint16Array = Uint16VirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return uint16Array->DirectGetItem(indexInt); @@ -3632,7 +3650,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint16Array* uint16Array = Uint16Array::FromVar(instance); + Uint16Array* uint16Array = Uint16Array::UnsafeFromVar(instance); if (indexInt >= 0) { return uint16Array->DirectGetItem(indexInt); @@ -3646,7 +3664,7 @@ namespace Js int32 indexInt = TaggedInt::ToInt32(index); if (VirtualTableInfo::HasVirtualTable(instance)) { - Int32VirtualArray* int32Array = Int32VirtualArray::FromVar(instance); + Int32VirtualArray* int32Array = Int32VirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return int32Array->DirectGetItem(indexInt); @@ -3654,7 +3672,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Int32Array* int32Array = Int32Array::FromVar(instance); + Int32Array* int32Array = Int32Array::UnsafeFromVar(instance); if (indexInt >= 0) { return int32Array->DirectGetItem(indexInt); @@ -3669,7 +3687,7 @@ namespace Js int32 indexInt = TaggedInt::ToInt32(index); if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint32VirtualArray* uint32Array = Uint32VirtualArray::FromVar(instance); + Uint32VirtualArray* uint32Array = Uint32VirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return uint32Array->DirectGetItem(indexInt); @@ -3677,7 +3695,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint32Array* uint32Array = Uint32Array::FromVar(instance); + Uint32Array* uint32Array = Uint32Array::UnsafeFromVar(instance); if (indexInt >= 0) { return uint32Array->DirectGetItem(indexInt); @@ -3692,7 +3710,7 @@ namespace Js if (VirtualTableInfo::HasVirtualTable(instance)) { - Float32VirtualArray* float32Array = Float32VirtualArray::FromVar(instance); + Float32VirtualArray* float32Array = Float32VirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return float32Array->DirectGetItem(indexInt); @@ -3700,7 +3718,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Float32Array* float32Array = Float32Array::FromVar(instance); + Float32Array* float32Array = Float32Array::UnsafeFromVar(instance); if (indexInt >= 0) { return float32Array->DirectGetItem(indexInt); @@ -3714,7 +3732,7 @@ namespace Js int32 indexInt = TaggedInt::ToInt32(index); if (VirtualTableInfo::HasVirtualTable(instance)) { - Float64VirtualArray* float64Array = Float64VirtualArray::FromVar(instance); + Float64VirtualArray* float64Array = Float64VirtualArray::UnsafeFromVar(instance); if (indexInt >= 0) { return float64Array->DirectGetItem(indexInt); @@ -3722,7 +3740,7 @@ namespace Js } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Float64Array* float64Array = Float64Array::FromVar(instance); + Float64Array* float64Array = Float64Array::UnsafeFromVar(instance); if (indexInt >= 0) { return float64Array->DirectGetItem(indexInt); @@ -3745,87 +3763,75 @@ namespace Js goto TaggedIntIndex; } } - else if (JavascriptString::Is(index) && RecyclableObject::Is(instance)) // fastpath for PropertyStrings + else { - temp = JavascriptString::FromVar(index); - Assert(temp->GetScriptContext() == scriptContext); - - PropertyString * propertyString = nullptr; - if (VirtualTableInfo::HasVirtualTable(temp)) - { - propertyString = (PropertyString*)temp; - } - else if (VirtualTableInfo::HasVirtualTable(temp)) - { - LiteralStringWithPropertyStringPtr * str = (LiteralStringWithPropertyStringPtr *)temp; - propertyString = str->GetPropertyString(); - } - if(propertyString != nullptr) + temp = JavascriptOperators::TryFromVar(index); + if (temp && RecyclableObject::Is(instance)) // fastpath for PropertyStrings { - RecyclableObject* object = nullptr; - if (FALSE == JavascriptOperators::GetPropertyObject(instance, scriptContext, &object)) + PropertyString * propertyString = nullptr; + if (VirtualTableInfo::HasVirtualTable(temp)) { - JavascriptError::ThrowTypeError(scriptContext, JSERR_Property_CannotGet_NullOrUndefined, - JavascriptString::FromVar(index)->GetSz()); + propertyString = (PropertyString*)temp; } - - PropertyRecord const * propertyRecord = propertyString->GetPropertyRecord(); - const PropertyId propId = propertyRecord->GetPropertyId(); - Var value; - - if (propertyRecord->IsNumeric()) + else if (VirtualTableInfo::HasVirtualTable(temp)) { - if (JavascriptOperators::GetItem(instance, object, propertyRecord->GetNumericValue(), &value, scriptContext)) + LiteralStringWithPropertyStringPtr * strWithPtr = (LiteralStringWithPropertyStringPtr *)temp; + if (!strWithPtr->HasPropertyRecord()) { - return value; + strWithPtr->GetPropertyRecord(); // lookup-cache propertyRecord + } + else + { + propertyString = strWithPtr->GetOrAddPropertyString(); + // this is the second time this property string is used + // we already had created the propertyRecord.. + // now create the propertyString! } } - else + + if (propertyString != nullptr) { - PropertyValueInfo info; - if (propertyString->ShouldUseCache()) + RecyclableObject* object = nullptr; + if (FALSE == JavascriptOperators::GetPropertyObject(instance, scriptContext, &object)) { - PropertyValueInfo::SetCacheInfo(&info, propertyString, propertyString->GetLdElemInlineCache(), true); - if (CacheOperators::TryGetProperty( - instance, false, object, propId, &value, scriptContext, nullptr, &info)) + JavascriptError::ThrowTypeError(scriptContext, JSERR_Property_CannotGet_NullOrUndefined, + JavascriptString::FromVar(index)->GetSz()); + } + + PropertyRecord const * propertyRecord = propertyString->GetPropertyRecord(); + Var value; + + if (propertyRecord->IsNumeric()) + { + if (JavascriptOperators::GetItem(instance, object, propertyRecord->GetNumericValue(), &value, scriptContext)) { - propertyString->LogCacheHit(); -#ifdef ENABLE_DEBUG_CONFIG_OPTIONS - if (PHASE_TRACE1(PropertyStringCachePhase)) - { - Output::Print(_u("PropertyCache: GetElem cache hit for '%s': type %p\n"), propertyString->GetString(), object->GetType()); - } -#endif return value; } } - propertyString->LogCacheMiss(); -#ifdef ENABLE_DEBUG_CONFIG_OPTIONS - if (PHASE_TRACE1(PropertyStringCachePhase)) - { - Output::Print(_u("PropertyCache: GetElem cache miss for '%s': type %p, index %d\n"), - propertyString->GetString(), - object->GetType(), - propertyString->GetLdElemInlineCache()->GetInlineCacheIndexForType(object->GetType())); - propertyString->DumpCache(true); - } -#endif - if (JavascriptOperators::GetPropertyWPCache(instance, object, propertyRecord->GetPropertyId(), &value, scriptContext, &info)) + else { - return value; + PropertyValueInfo info; + if (propertyString->TryGetPropertyFromCache(instance, object, &value, scriptContext, &info)) + { + return value; + } + if (JavascriptOperators::GetPropertyWPCache(instance, object, propertyRecord->GetPropertyId(), &value, scriptContext, &info)) + { + return value; + } } + return scriptContext->GetLibrary()->GetUndefined(); } - return scriptContext->GetLibrary()->GetUndefined(); - } #ifdef ENABLE_DEBUG_CONFIG_OPTIONS - if (PHASE_TRACE1(PropertyStringCachePhase)) - { - Output::Print(_u("PropertyCache: GetElem No property string for '%s'\n"), temp->GetString()); - } + if (PHASE_TRACE1(PropertyStringCachePhase)) + { + Output::Print(_u("PropertyCache: GetElem No property string for '%s'\n"), temp->GetString()); + } #endif #if DBG_DUMP - scriptContext->forinNoCache++; + scriptContext->forinNoCache++; #endif + } } return JavascriptOperators::GetElementIHelper(instance, index, instance, scriptContext); @@ -4200,14 +4206,14 @@ namespace Js if (VirtualTableInfo::HasVirtualTable(instance)) { - Int8VirtualArray* int8Array = Int8VirtualArray::FromVar(instance); - returnValue = int8Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Int8VirtualArray* int8Array = Int8VirtualArray::UnsafeFromVar(instance); + returnValue = int8Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if( VirtualTableInfo::HasVirtualTable(instance)) { - Int8Array* int8Array = Int8Array::FromVar(instance); - returnValue = int8Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Int8Array* int8Array = Int8Array::UnsafeFromVar(instance); + returnValue = int8Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } @@ -4216,14 +4222,14 @@ namespace Js // The typed array will deal with all possible values for the index if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint8VirtualArray* uint8Array = Uint8VirtualArray::FromVar(instance); - returnValue = uint8Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Uint8VirtualArray* uint8Array = Uint8VirtualArray::UnsafeFromVar(instance); + returnValue = uint8Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint8Array* uint8Array = Uint8Array::FromVar(instance); - returnValue = uint8Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Uint8Array* uint8Array = Uint8Array::UnsafeFromVar(instance); + returnValue = uint8Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } @@ -4232,14 +4238,14 @@ namespace Js // The typed array will deal with all possible values for the index if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint8ClampedVirtualArray* uint8ClampedArray = Uint8ClampedVirtualArray::FromVar(instance); - returnValue = uint8ClampedArray->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Uint8ClampedVirtualArray* uint8ClampedArray = Uint8ClampedVirtualArray::UnsafeFromVar(instance); + returnValue = uint8ClampedArray->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if(VirtualTableInfo::HasVirtualTable(instance)) { - Uint8ClampedArray* uint8ClampedArray = Uint8ClampedArray::FromVar(instance); - returnValue = uint8ClampedArray->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Uint8ClampedArray* uint8ClampedArray = Uint8ClampedArray::UnsafeFromVar(instance); + returnValue = uint8ClampedArray->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } @@ -4248,14 +4254,14 @@ namespace Js // The type array will deal with all possible values for the index if (VirtualTableInfo::HasVirtualTable(instance)) { - Int16VirtualArray* int16Array = Int16VirtualArray::FromVar(instance); - returnValue = int16Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Int16VirtualArray* int16Array = Int16VirtualArray::UnsafeFromVar(instance); + returnValue = int16Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Int16Array* int16Array = Int16Array::FromVar(instance); - returnValue = int16Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Int16Array* int16Array = Int16Array::UnsafeFromVar(instance); + returnValue = int16Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } @@ -4265,14 +4271,14 @@ namespace Js if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint16VirtualArray* uint16Array = Uint16VirtualArray::FromVar(instance); - returnValue = uint16Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Uint16VirtualArray* uint16Array = Uint16VirtualArray::UnsafeFromVar(instance); + returnValue = uint16Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint16Array* uint16Array = Uint16Array::FromVar(instance); - returnValue = uint16Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Uint16Array* uint16Array = Uint16Array::UnsafeFromVar(instance); + returnValue = uint16Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } case TypeIds_Int32Array: @@ -4280,14 +4286,14 @@ namespace Js // The type array will deal with all possible values for the index if (VirtualTableInfo::HasVirtualTable(instance)) { - Int32VirtualArray* int32Array = Int32VirtualArray::FromVar(instance); - returnValue = int32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Int32VirtualArray* int32Array = Int32VirtualArray::UnsafeFromVar(instance); + returnValue = int32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if(VirtualTableInfo::HasVirtualTable(instance)) { - Int32Array* int32Array = Int32Array::FromVar(instance); - returnValue = int32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Int32Array* int32Array = Int32Array::UnsafeFromVar(instance); + returnValue = int32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } case TypeIds_Uint32Array: @@ -4296,14 +4302,14 @@ namespace Js if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint32VirtualArray* uint32Array = Uint32VirtualArray::FromVar(instance); - returnValue = uint32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Uint32VirtualArray* uint32Array = Uint32VirtualArray::UnsafeFromVar(instance); + returnValue = uint32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Uint32Array* uint32Array = Uint32Array::FromVar(instance); - returnValue = uint32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Uint32Array* uint32Array = Uint32Array::UnsafeFromVar(instance); + returnValue = uint32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } case TypeIds_Float32Array: @@ -4311,14 +4317,14 @@ namespace Js // The type array will deal with all possible values for the index if (VirtualTableInfo::HasVirtualTable(instance)) { - Float32VirtualArray* float32Array = Float32VirtualArray::FromVar(instance); - returnValue = float32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Float32VirtualArray* float32Array = Float32VirtualArray::UnsafeFromVar(instance); + returnValue = float32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Float32Array* float32Array = Float32Array::FromVar(instance); - returnValue = float32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Float32Array* float32Array = Float32Array::UnsafeFromVar(instance); + returnValue = float32Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } case TypeIds_Float64Array: @@ -4326,14 +4332,14 @@ namespace Js // The type array will deal with all possible values for the index if (VirtualTableInfo::HasVirtualTable(instance)) { - Float64VirtualArray* float64Array = Float64VirtualArray::FromVar(instance); - returnValue = float64Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Float64VirtualArray* float64Array = Float64VirtualArray::UnsafeFromVar(instance); + returnValue = float64Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } else if (VirtualTableInfo::HasVirtualTable(instance)) { - Float64Array* float64Array = Float64Array::FromVar(instance); - returnValue = float64Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); - } + Float64Array* float64Array = Float64Array::UnsafeFromVar(instance); + returnValue = float64Array->ValidateIndexAndDirectSetItem(index, value, &isNumericIndex); + } break; } } @@ -4358,7 +4364,7 @@ namespace Js int indexInt = TaggedInt::ToInt32(index); if (indexInt >= 0 && scriptContext->optimizationOverrides.IsEnabledArraySetElementFastPath()) { - JavascriptArray::FromVar(instance)->SetItem((uint32)indexInt, value, flags); + JavascriptArray::UnsafeFromVar(instance)->SetItem((uint32)indexInt, value, flags); return true; } break; @@ -4398,7 +4404,6 @@ namespace Js BOOL JavascriptOperators::SetElementIHelper(Var receiver, RecyclableObject* object, Var index, Var value, ScriptContext* scriptContext, PropertyOperationFlags flags) { - PropertyString * propertyString = nullptr; Js::IndexType indexType; uint32 indexVal = 0; PropertyRecord const * propertyRecord = nullptr; @@ -4419,32 +4424,35 @@ namespace Js } // fastpath for PropertyStrings only if receiver == object - if (!TaggedInt::Is(index) && JavascriptString::Is(index) && - (VirtualTableInfo::HasVirtualTable(index) || VirtualTableInfo::HasVirtualTable(index))) + PropertyString * propertyString = PropertyString::TryFromVar(index); + if (propertyString == nullptr) { - if (VirtualTableInfo::HasVirtualTable(index)) + LiteralStringWithPropertyStringPtr * strWithPtr = LiteralStringWithPropertyStringPtr::TryFromVar(index); + if (strWithPtr != nullptr) { - LiteralStringWithPropertyStringPtr * str = (LiteralStringWithPropertyStringPtr *)index; - propertyString = str->GetPropertyString(); - if (propertyString == nullptr) + propertyString = strWithPtr->GetPropertyString(); // do not force create the PropertyString, + // if it wasn't there, it won't be efficient for now. + propertyRecord = strWithPtr->GetPropertyRecord(true /* dontLookupFromDictionary */); + if (propertyRecord == nullptr) { - scriptContext->GetOrAddPropertyRecord(str, &propertyRecord); - propertyString = scriptContext->GetPropertyString(propertyRecord->GetPropertyId()); - str->SetPropertyString(propertyString); + propertyRecord = strWithPtr->GetPropertyRecord(); // lookup-cache propertyRecord + // later this call, there will be a lookup anyways! } - else + else if (propertyString == nullptr) { - propertyRecord = propertyString->GetPropertyRecord(); + propertyString = strWithPtr->GetOrAddPropertyString(); // this is the second time this property is here + // we already had created the propertyRecord.. + // now create the propertyString! } - - } - else - { - propertyString = (PropertyString*)index; - propertyRecord = propertyString->GetPropertyRecord(); } - Assert(propertyString->GetScriptContext() == scriptContext); + } + else + { + propertyRecord = propertyString->GetPropertyRecord(); + } + if (propertyRecord != nullptr) + { if (propertyRecord->IsNumeric()) { indexType = IndexType_Number; @@ -4452,49 +4460,16 @@ namespace Js } else { - if (receiver == object) + if (propertyString != nullptr && receiver == object) { - if (propertyString->ShouldUseCache()) - { - PropertyValueInfo::SetCacheInfo(&propertyValueInfo, propertyString, propertyString->GetStElemInlineCache(), true); - if (CacheOperators::TrySetProperty( - object, - false, - propertyRecord->GetPropertyId(), - value, - scriptContext, - flags, - nullptr, - &propertyValueInfo)) - { -#ifdef ENABLE_DEBUG_CONFIG_OPTIONS - if (PHASE_TRACE1(PropertyStringCachePhase)) - { - Output::Print(_u("PropertyCache: SetElem cache hit for '%s': type %p\n"), propertyString->GetString(), object->GetType()); - } -#endif - propertyString->LogCacheHit(); - return true; - } - } - propertyString->LogCacheMiss(); -#ifdef ENABLE_DEBUG_CONFIG_OPTIONS - if (PHASE_TRACE1(PropertyStringCachePhase)) + Assert(propertyString->GetScriptContext() == scriptContext); + if (propertyString->TrySetPropertyFromCache(object, value, scriptContext, flags, &propertyValueInfo)) { - Output::Print(_u("PropertyCache: SetElem cache miss for '%s': type %p, index %d\n"), - propertyString->GetString(), - object->GetType(), - propertyString->GetStElemInlineCache()->GetInlineCacheIndexForType(object->GetType())); - propertyString->DumpCache(false); + return true; } -#endif } indexType = IndexType_PropertyId; } - -#if DBG_DUMP - scriptContext->forinNoCache++; -#endif } else { @@ -4513,45 +4488,39 @@ namespace Js if (indexType == IndexType_Number) { +SetElementIHelper_INDEX_TYPE_IS_NUMBER: return JavascriptOperators::SetItem(receiver, object, indexVal, value, scriptContext, flags); } else if (indexType == IndexType_JavascriptString) { Assert(propertyNameString); - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (BuiltInPropertyRecords::NaN.Equals(propertyName)) - { - // Follow SetProperty convention for NaN - return JavascriptOperators::SetProperty(receiver, object, PropertyIds::NaN, value, scriptContext, flags); - } - else if (BuiltInPropertyRecords::Infinity.Equals(propertyName)) - { - // Follow SetProperty convention for Infinity - return JavascriptOperators::SetProperty(receiver, object, PropertyIds::Infinity, value, scriptContext, flags); - } -#ifdef ENABLE_DEBUG_CONFIG_OPTIONS - if (PHASE_TRACE1(PropertyStringCachePhase)) + // At this point, we know that the propertyNameString is neither PropertyString + // or LiteralStringWithPropertyStringPtr.. Get PropertyRecord! + // we will get it anyways otherwise. (Also, 1:1 string comparison for Builtin types will be expensive.) + + if (propertyRecord == nullptr) { - Output::Print(_u("PropertyCache: SetElem No property string for '%s'\n"), propertyNameString->GetString()); + scriptContext->GetOrAddPropertyRecord(propertyNameString, &propertyRecord); + if (propertyRecord->IsNumeric()) + { + indexVal = propertyRecord->GetNumericValue(); + goto SetElementIHelper_INDEX_TYPE_IS_NUMBER; + } } -#endif - return SetPropertyWPCache(receiver, object, propertyNameString, value, scriptContext, flags, &propertyValueInfo); } - else + + Assert(indexType == IndexType_PropertyId || indexType == IndexType_JavascriptString); + Assert(propertyRecord); + PropertyId propId = propertyRecord->GetPropertyId(); + if (propId == PropertyIds::NaN || propId == PropertyIds::Infinity) { - Assert(indexType == IndexType_PropertyId); - Assert(propertyRecord); - PropertyId propId = propertyRecord->GetPropertyId(); - if (propId == PropertyIds::NaN || propId == PropertyIds::Infinity) - { - // As we no longer convert o[x] into o.x for NaN and Infinity, we need to follow SetProperty convention for these, - // which would check for read-only properties, strict mode, etc. - // Note that "-Infinity" does not qualify as property name, so we don't have to take care of it. - return JavascriptOperators::SetProperty(receiver, object, propId, value, scriptContext, flags); - } - return SetPropertyWPCache(receiver, object, propId, value, scriptContext, flags, &propertyValueInfo); + // As we no longer convert o[x] into o.x for NaN and Infinity, we need to follow SetProperty convention for these, + // which would check for read-only properties, strict mode, etc. + // Note that "-Infinity" does not qualify as property name, so we don't have to take care of it. + return JavascriptOperators::SetProperty(receiver, object, propId, value, scriptContext, flags); } + return SetPropertyWPCache(receiver, object, propId, value, scriptContext, flags, &propertyValueInfo); } BOOL JavascriptOperators::OP_SetNativeIntElementI( @@ -4743,7 +4712,7 @@ namespace Js break; } // Upper bounds check for source array - JavascriptArray* srcArray = JavascriptArray::FromVar(srcInstance); + JavascriptArray* srcArray = JavascriptArray::UnsafeFromVar(srcInstance); JavascriptArray* dstArray = JavascriptArray::FromVar(dstInstance); if (scriptContext->optimizationOverrides.IsEnabledArraySetElementFastPath()) { @@ -4830,7 +4799,7 @@ namespace Js INT_PTR vt = VirtualTableInfoBase::GetVirtualTable(instance); if (instanceType == TypeIds_Array) { - returnValue = JavascriptArray::FromVar(instance)->DirectSetItemAtRange(start, length, value); + returnValue = JavascriptArray::UnsafeFromVar(instance)->DirectSetItemAtRange(start, length, value); } else if (instanceType == TypeIds_NativeIntArray) { @@ -4844,7 +4813,7 @@ namespace Js { return false; } - returnValue = JavascriptArray::FromVar(instance)->DirectSetItemAtRange(start, length, intValue); + returnValue = JavascriptArray::UnsafeFromVar(instance)->DirectSetItemAtRange(start, length, intValue); } else { @@ -4864,7 +4833,7 @@ namespace Js { return false; } - returnValue = JavascriptArray::FromVar(instance)->DirectSetItemAtRange(start, length, doubleValue); + returnValue = JavascriptArray::UnsafeFromVar(instance)->DirectSetItemAtRange(start, length, doubleValue); } returnValue &= vt == VirtualTableInfoBase::GetVirtualTable(instance); } @@ -5180,9 +5149,13 @@ namespace Js { return false; } - return !(instance->HasDeferredTypeHandler() && - JavascriptFunction::Is(instance) && - JavascriptFunction::FromVar(instance)->IsExternalFunction()); + + if (!(instance->HasDeferredTypeHandler())) + { + JavascriptFunction * function = JavascriptOperators::TryFromVar(instance); + return function && function->IsExternalFunction(); + } + return false; } bool JavascriptOperators::CanShortcutPrototypeChainOnUnknownPropertyName(RecyclableObject *prototype) @@ -5441,7 +5414,9 @@ namespace Js if (!newType->GetIsShared()) { +#if ENABLE_FIXED_FIELDS newType->GetTypeHandler()->SetSingletonInstanceIfNeeded(instance); +#endif } #ifdef PROFILE_OBJECT_LITERALS else @@ -5747,7 +5722,7 @@ namespace Js TypeId typeId = JavascriptOperators::GetTypeId(instance); if (typeId == TypeIds_Function) { - JavascriptFunction * function = JavascriptFunction::FromVar(instance); + JavascriptFunction * function = JavascriptFunction::UnsafeFromVar(instance); return function->GetFunctionInfo(); } if (typeId != TypeIds_HostDispatch && typeId != TypeIds_Proxy) @@ -5812,10 +5787,10 @@ namespace Js Var JavascriptOperators::NewScObjectNoArg(Var instance, ScriptContext * requestContext) { - if (JavascriptProxy::Is(instance)) + JavascriptProxy * proxy = JavascriptOperators::TryFromVar(instance); + if (proxy) { Arguments args(CallInfo(CallFlags_New, 1), &instance); - JavascriptProxy* proxy = JavascriptProxy::FromVar(instance); return proxy->ConstructorTrap(args, requestContext, 0); } @@ -5894,9 +5869,10 @@ namespace Js } ConstructorCache * constructorCache = nullptr; - if (JavascriptFunction::Is(instance)) + JavascriptFunction *function = JavascriptOperators::TryFromVar(instance); + if (function) { - constructorCache = JavascriptFunction::FromVar(instance)->GetConstructorCache(); + constructorCache = function->GetConstructorCache(); } if (constructorCache != nullptr && constructorCache->NeedsUpdateAfterCtor()) @@ -5935,7 +5911,7 @@ namespace Js if (functionInfo) { - return JavascriptOperators::NewScObjectCommon(RecyclableObject::FromVar(instance), functionInfo, requestContext, isBaseClassConstructorNewScObject); + return JavascriptOperators::NewScObjectCommon(RecyclableObject::UnsafeFromVar(instance), functionInfo, requestContext, isBaseClassConstructorNewScObject); } else { @@ -5971,7 +5947,7 @@ namespace Js // the inline cache arena to allow it to be zeroed, but retain a recycler-allocated portion to hold on to the size of // inlined slots. - JavascriptFunction* constructor = JavascriptFunction::FromVar(function); + JavascriptFunction* constructor = JavascriptFunction::UnsafeFromVar(function); if (functionInfo->IsClassConstructor() && !isBaseClassConstructorNewScObject) { // If we are calling new on a class constructor, the contract is that we pass new.target as the 'this' argument. @@ -6203,7 +6179,7 @@ namespace Js if (DynamicType::Is(RecyclableObject::FromVar(instance)->GetTypeId())) { - DynamicObject *object = DynamicObject::FromVar(instance); + DynamicObject *object = DynamicObject::UnsafeFromVar(instance); DynamicType* type = object->GetDynamicType(); DynamicTypeHandler* typeHandler = type->GetTypeHandler(); @@ -6452,6 +6428,11 @@ namespace Js return scriptContext->GetLibrary()->GetNaN(); } + Var JavascriptOperators::OP_LdChakraLib(ScriptContext* scriptContext) + { + return scriptContext->GetLibrary()->GetChakraLib(); + } + Var JavascriptOperators::OP_LdInfinity(ScriptContext* scriptContext) { return scriptContext->GetLibrary()->GetPositiveInfinite(); @@ -6609,18 +6590,23 @@ namespace Js Js::PropertyId JavascriptOperators::GetPropertyId(Var propertyName, ScriptContext* scriptContext) { PropertyRecord const * propertyRecord = nullptr; - if (JavascriptSymbol::Is(propertyName)) + JavascriptSymbol * symbol = JavascriptOperators::TryFromVar(propertyName); + if (symbol) { - propertyRecord = JavascriptSymbol::FromVar(propertyName)->GetValue(); - } - else if (JavascriptSymbolObject::Is(propertyName)) - { - propertyRecord = JavascriptSymbolObject::FromVar(propertyName)->GetValue(); + propertyRecord = symbol->GetValue(); } else { - JavascriptString * indexStr = JavascriptConversion::ToString(propertyName, scriptContext); - scriptContext->GetOrAddPropertyRecord(indexStr, &propertyRecord); + JavascriptSymbolObject * symbolObject = JavascriptOperators::TryFromVar(propertyName); + if (symbolObject) + { + propertyRecord = symbolObject->GetValue(); + } + else + { + JavascriptString * indexStr = JavascriptConversion::ToString(propertyName, scriptContext); + scriptContext->GetOrAddPropertyRecord(indexStr, &propertyRecord); + } } return propertyRecord->GetPropertyId(); @@ -6700,12 +6686,20 @@ namespace Js BOOL JavascriptOperators::IsClassConstructor(Var instance) { - return JavascriptFunction::Is(instance) && (JavascriptFunction::FromVar(instance)->GetFunctionInfo()->IsClassConstructor() || !JavascriptFunction::FromVar(instance)->IsScriptFunction()); + JavascriptFunction * function = JavascriptOperators::TryFromVar(instance); + return function && (function->GetFunctionInfo()->IsClassConstructor() || (!function->IsScriptFunction() && !function->IsExternalFunction())); + } + + BOOL JavascriptOperators::IsClassMethod(Var instance) + { + JavascriptFunction * function = JavascriptOperators::TryFromVar(instance); + return function && function->GetFunctionInfo()->IsClassMethod(); } BOOL JavascriptOperators::IsBaseConstructorKind(Var instance) { - return JavascriptFunction::Is(instance) && (JavascriptFunction::FromVar(instance)->GetFunctionInfo()->GetBaseConstructorKind()); + JavascriptFunction * function = JavascriptOperators::TryFromVar(instance); + return function && (function->GetFunctionInfo()->GetBaseConstructorKind()); } void JavascriptOperators::OP_InitGetter(Var object, PropertyId propertyId, Var getter) @@ -7238,21 +7232,21 @@ namespace Js RecyclableObject* object = RecyclableObject::FromVar(instance); BOOL result; - if( indexType == Js::IndexType_Number ) + if (indexType == Js::IndexType_Number) { - result = JavascriptOperators::HasItem( object, index ); + result = JavascriptOperators::HasItem(object, index); } else { PropertyId propertyId = propertyRecord->GetPropertyId(); - result = JavascriptOperators::HasProperty( object, propertyId ); + result = JavascriptOperators::HasProperty(object, propertyId); #ifdef TELEMETRY_JSO { Assert(indexType != Js::IndexType_JavascriptString); - if( indexType == Js::IndexType_PropertyId ) + if (indexType == Js::IndexType_PropertyId) { - scriptContext->GetTelemetry().GetOpcodeTelemetry().IsIn( instance, propertyId, result != 0 ); + scriptContext->GetTelemetry().GetOpcodeTelemetry().IsIn(instance, propertyId, result != 0); } } #endif @@ -7525,7 +7519,7 @@ namespace Js PropertyValueInfo::SetCacheInfo(&info, functionBody, inlineCache, inlineCacheIndex, !IsFromFullJit); for (uint16 i = 0; i < length; i++) { - RecyclableObject* object = RecyclableObject::FromVar(pDisplay->GetItem(i)); + RecyclableObject* object = RecyclableObject::UnsafeFromVar(pDisplay->GetItem(i)); Var value; if (CacheOperators::TryGetProperty( @@ -7984,7 +7978,7 @@ namespace Js #if ENABLE_COPYONACCESS_ARRAY JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(instance); #endif - RecyclableObject *object = RecyclableObject::FromVar(instance); + RecyclableObject *object = RecyclableObject::UnsafeFromVar(instance); PropertyValueInfo info; PropertyValueInfo::SetCacheInfo(&info, functionBody, inlineCache, inlineCacheIndex, !IsFromFullJit); @@ -8132,6 +8126,15 @@ namespace Js Type *typeWithoutProperty = object->GetType(); + if (functionBody->IsEval()) + { + if (object->InitPropertyInEval(propertyId, newValue, flags, &info)) + { + CacheOperators::CachePropertyWrite(object, false, typeWithoutProperty, propertyId, &info, scriptContext); + return; + } + } + // Ideally the lowerer would emit a call to the right flavor of PatchInitValue, so that we can ensure that we only // ever initialize to NULL in the right cases. But the backend uses the StFld opcode for initialization, and it // would be cumbersome to thread the different helper calls all the way down @@ -8150,316 +8153,20 @@ namespace Js PropertyValueInfo info; PropertyValueInfo::SetCacheInfo(&info, functionBody, inlineCache, inlineCacheIndex, true); Type *typeWithoutProperty = object->GetType(); - if (object->InitProperty(propertyId, newValue, PropertyOperation_None, &info)) - { - CacheOperators::CachePropertyWrite(object, false, typeWithoutProperty, propertyId, &info, functionBody->GetScriptContext()); - } - } - -#if ENABLE_DEBUG_CONFIG_OPTIONS - void JavascriptOperators::TracePropertyEquivalenceCheck(const JitEquivalentTypeGuard* guard, const Type* type, const Type* refType, bool isEquivalent, uint failedPropertyIndex) - { - if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) - { - uint propertyCount = guard->GetCache()->record.propertyCount; - - Output::Print(_u("EquivObjTypeSpec: checking %u properties on operation %u, (type = 0x%p, ref type = 0x%p):\n"), - propertyCount, guard->GetObjTypeSpecFldId(), type, refType); - - const Js::TypeEquivalenceRecord& record = guard->GetCache()->record; - ScriptContext* scriptContext = type->GetScriptContext(); - if (isEquivalent) - { - if (Js::Configuration::Global.flags.Verbose) - { - Output::Print(_u(" , ")); - for (uint pi = 0; pi < propertyCount; pi++) - { - const EquivalentPropertyEntry* refInfo = &record.properties[pi]; - const PropertyRecord* propertyRecord = scriptContext->GetPropertyName(refInfo->propertyId); - Output::Print(_u("%s(#%d)@%ua%dw%d, "), propertyRecord->GetBuffer(), propertyRecord->GetPropertyId(), refInfo->slotIndex, refInfo->isAuxSlot, refInfo->mustBeWritable); - } - Output::Print(_u("\n")); - } - } - else - { - const EquivalentPropertyEntry* refInfo = &record.properties[failedPropertyIndex]; - Js::PropertyEquivalenceInfo info(Constants::NoSlot, false, false); - const PropertyRecord* propertyRecord = scriptContext->GetPropertyName(refInfo->propertyId); - if (DynamicType::Is(type->GetTypeId())) - { - Js::DynamicTypeHandler* typeHandler = (static_cast(type))->GetTypeHandler(); - typeHandler->GetPropertyEquivalenceInfo(propertyRecord, info); - } - - Output::Print(_u("EquivObjTypeSpec: check failed for %s (#%d) on operation %u:\n"), - propertyRecord->GetBuffer(), propertyRecord->GetPropertyId(), guard->GetObjTypeSpecFldId()); - Output::Print(_u(" type = 0x%p, ref type = 0x%p, slot = 0x%u (%d), ref slot = 0x%u (%d), is writable = %d, required writable = %d\n"), - type, refType, info.slotIndex, refInfo->slotIndex, info.isAuxSlot, refInfo->isAuxSlot, info.isWritable, refInfo->mustBeWritable); - } - - Output::Flush(); - } - } -#endif - - bool JavascriptOperators::IsStaticTypeObjTypeSpecEquivalent(const TypeEquivalenceRecord& equivalenceRecord, uint& failedIndex) - { - uint propertyCount = equivalenceRecord.propertyCount; - Js::EquivalentPropertyEntry* properties = equivalenceRecord.properties; - for (uint pi = 0; pi < propertyCount; pi++) - { - const EquivalentPropertyEntry* refInfo = &properties[pi]; - if (!IsStaticTypeObjTypeSpecEquivalent(refInfo)) - { - failedIndex = pi; - return false; - } - } - return true; - } - - bool JavascriptOperators::IsStaticTypeObjTypeSpecEquivalent(const EquivalentPropertyEntry *entry) - { - // Objects of static types have no local properties, but they may load fields from their prototypes. - return entry->slotIndex == Constants::NoSlot && !entry->mustBeWritable; - } - - bool JavascriptOperators::CheckIfTypeIsEquivalentForFixedField(Type* type, JitEquivalentTypeGuard* guard) - { - if (guard->GetValue() == PropertyGuard::GuardValue::Invalidated_DuringSweep) - { - return false; - } - return CheckIfTypeIsEquivalent(type, guard); - } - - bool JavascriptOperators::CheckIfTypeIsEquivalent(Type* type, JitEquivalentTypeGuard* guard) - { - if (guard->GetValue() == PropertyGuard::GuardValue::Invalidated) - { - return false; - } - - AssertMsg(type && type->GetScriptContext(), "type and it's ScriptContext should be valid."); - - if (!guard->IsInvalidatedDuringSweep() && ((Js::Type*)guard->GetTypeAddr())->GetScriptContext() != type->GetScriptContext()) - { - // For valid guard value, can't cache cross-context objects - return false; - } - - // CONSIDER : Add stats on how often the cache hits, and simply force bailout if - // the efficacy is too low. - - EquivalentTypeCache* cache = guard->GetCache(); - // CONSIDER : Consider emitting o.type == equivTypes[hash(o.type)] in machine code before calling - // this helper, particularly if we want to handle polymorphism with frequently changing types. - Assert(EQUIVALENT_TYPE_CACHE_SIZE == 8); - Type** equivTypes = cache->types; - - Type* refType = equivTypes[0]; - if (refType == nullptr || refType->GetScriptContext() != type->GetScriptContext()) - { - // We could have guard that was invalidated while sweeping and now we have type coming from - // different scriptContext. Make sure that it matches the scriptContext in cachedTypes. - // If not, return false because as mentioned above, we don't cache cross-context objects. -#if DBG - if (refType == nullptr) - { - for (int i = 1;i < EQUIVALENT_TYPE_CACHE_SIZE;i++) - { - AssertMsg(equivTypes[i] == nullptr, "In equiv typed caches, if first element is nullptr, all others should be nullptr"); - } - } -#endif - return false; - } - - if (type == equivTypes[0] || type == equivTypes[1] || type == equivTypes[2] || type == equivTypes[3] || - type == equivTypes[4] || type == equivTypes[5] || type == equivTypes[6] || type == equivTypes[7]) - { -#if DBG - if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) - { - if (guard->WasReincarnated()) - { - Output::Print(_u("EquivObjTypeSpec: Guard 0x%p was reincarnated and working now \n"), guard); - Output::Flush(); - } - } -#endif - guard->SetTypeAddr((intptr_t)type); - return true; - } - - // If we didn't find the type in the cache, let's check if it's equivalent the slow way, by comparing - // each of its relevant property slots to its equivalent in one of the cached types. - // We are making a few assumption that simplify the process: - // 1. If two types have the same prototype, any properties loaded from a prototype must come from the same slot. - // If any of the prototypes in the chain was altered such that this is no longer true, the corresponding - // property guard would have been invalidated and we would bail out at the guard check (either on this - // type check or downstream, but before the property load is attempted). - // 2. For polymorphic field loads fixed fields are only supported on prototypes. Hence, if two types have the - // same prototype, any of the equivalent fixed properties will match. If any has been overwritten, the - // corresponding guard would have been invalidated and we would bail out (as above). - - if (cache->IsLoadedFromProto() && type->GetPrototype() != refType->GetPrototype()) - { - if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) - { - Output::Print(_u("EquivObjTypeSpec: failed check on operation %u (type = 0x%x, ref type = 0x%x, proto = 0x%x, ref proto = 0x%x) \n"), - guard->GetObjTypeSpecFldId(), type, refType, type->GetPrototype(), refType->GetPrototype()); - Output::Flush(); - } - - return false; - } -#pragma prefast(suppress:6011) // If type is nullptr, we would AV at the beginning of this method - if (type->GetTypeId() != refType->GetTypeId()) + if (functionBody->IsEval()) { - if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) - { - Output::Print(_u("EquivObjTypeSpec: failed check on operation %u (type = 0x%x, ref type = 0x%x, proto = 0x%x, ref proto = 0x%x) \n"), - guard->GetObjTypeSpecFldId(), type, refType, type->GetPrototype(), refType->GetPrototype()); - Output::Flush(); - } - - return false; - } - - // Review : This is quite slow. We could make it somewhat faster, by keeping slot indexes instead - // of property IDs, but that would mean we would need to look up property IDs from slot indexes when installing - // property guards, or maintain a whole separate list of equivalent slot indexes. - Assert(cache->record.propertyCount > 0); - - // Before checking for equivalence, track existing cached non-shared types - DynamicType * dynamicType = (type && DynamicType::Is(type->GetTypeId())) ? static_cast(type) : nullptr; - bool isEquivTypesCacheFull = equivTypes[EQUIVALENT_TYPE_CACHE_SIZE - 1] != nullptr; - int emptySlotIndex = -1; - int nonSharedTypeSlotIndex = -1; - for (int i = 0;i < EQUIVALENT_TYPE_CACHE_SIZE;i++) - { - // Track presence of cached non-shared type if cache is full - if (isEquivTypesCacheFull) - { - if (DynamicType::Is(equivTypes[i]->GetTypeId()) && - nonSharedTypeSlotIndex == -1 && - !(static_cast(equivTypes[i]))->GetIsShared()) - { - nonSharedTypeSlotIndex = i; - } - } - // Otherwise get the next available empty index - else if (equivTypes[i] == nullptr) + if (object->InitPropertyInEval(propertyId, newValue, PropertyOperation_None, &info)) { - emptySlotIndex = i; - break; - }; - } - - // If we get non-shared type while cache is full and we don't have any non-shared type to evict - // consider this type as non-equivalent - if (dynamicType != nullptr && - isEquivTypesCacheFull && - !dynamicType->GetIsShared() && - nonSharedTypeSlotIndex == -1) - { - return false; - } - - // CONSIDER (EquivObjTypeSpec): Impose a limit on the number of properties guarded by an equivalent type check. - // The trick is where in the glob opt to make the cut off. Perhaps in the forward pass we could track the number of - // field operations protected by a type check (keep a counter on the type's value info), and if that counter exceeds - // some threshold, simply stop optimizing any further instructions. - - bool isEquivalent; - uint failedPropertyIndex; - if (dynamicType != nullptr) - { - Js::DynamicTypeHandler* typeHandler = dynamicType->GetTypeHandler(); - isEquivalent = typeHandler->IsObjTypeSpecEquivalent(type, cache->record, failedPropertyIndex); - } - else - { - Assert(StaticType::Is(type->GetTypeId())); - isEquivalent = IsStaticTypeObjTypeSpecEquivalent(cache->record, failedPropertyIndex); - } - -#if ENABLE_DEBUG_CONFIG_OPTIONS - TracePropertyEquivalenceCheck(guard, type, refType, isEquivalent, failedPropertyIndex); -#endif - - if (!isEquivalent) - { - return false; - } - - AssertMsg(!isEquivTypesCacheFull || !dynamicType || dynamicType->GetIsShared() || nonSharedTypeSlotIndex > -1, "If equiv cache is full, then this should be sharedType or we will evict non-shared type."); - - // If cache is full, then this is definitely a sharedType, so evict non-shared type. - // Else evict next empty slot (only applicable for DynamicTypes) - emptySlotIndex = (isEquivTypesCacheFull && dynamicType) ? nonSharedTypeSlotIndex : emptySlotIndex; - - // We have some empty slots, let us use those first - if (emptySlotIndex != -1) - { - if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) - { - Output::Print(_u("EquivObjTypeSpec: Saving type in unused slot of equiv types cache. \n")); - Output::Flush(); - } - equivTypes[emptySlotIndex] = type; - } - else - { - // CONSIDER (EquivObjTypeSpec): Invent some form of least recently used eviction scheme. - uintptr_t index = (reinterpret_cast(type) >> 4) & (EQUIVALENT_TYPE_CACHE_SIZE - 1); - - if (cache->nextEvictionVictim == EQUIVALENT_TYPE_CACHE_SIZE) - { - __analysis_assume(index < EQUIVALENT_TYPE_CACHE_SIZE); - // If nextEvictionVictim was never set, set it to next element after index - cache->nextEvictionVictim = (index + 1) & (EQUIVALENT_TYPE_CACHE_SIZE - 1); - } - else - { - Assert(cache->nextEvictionVictim < EQUIVALENT_TYPE_CACHE_SIZE); - __analysis_assume(cache->nextEvictionVictim < EQUIVALENT_TYPE_CACHE_SIZE); - equivTypes[cache->nextEvictionVictim] = equivTypes[index]; - // Else, set it to next element after current nextEvictionVictim index - cache->nextEvictionVictim = (cache->nextEvictionVictim + 1) & (EQUIVALENT_TYPE_CACHE_SIZE - 1); - } - - if (PHASE_TRACE1(Js::EquivObjTypeSpecPhase)) - { - Output::Print(_u("EquivObjTypeSpec: Saving type in used slot of equiv types cache at index = %d. NextEvictionVictim = %d. \n"), index, cache->nextEvictionVictim); - Output::Flush(); + CacheOperators::CachePropertyWrite(object, false, typeWithoutProperty, propertyId, &info, functionBody->GetScriptContext()); + return; } - Assert(index < EQUIVALENT_TYPE_CACHE_SIZE); - __analysis_assume(index < EQUIVALENT_TYPE_CACHE_SIZE); - equivTypes[index] = type; } - // Fixed field checks allow us to assume a specific type ID, but the assumption is only - // valid if we lock the type. Otherwise, the type ID may change out from under us without - // evolving the type. - // We also need to lock the type in case of, for instance, adding a property to a dictionary type handler. - if (dynamicType != nullptr) + if (object->InitProperty(propertyId, newValue, PropertyOperation_None, &info)) { - if (!dynamicType->GetIsLocked()) - { - // We only need to lock the type to prevent against the type evolving after it has been cached. If the type becomes shared - // in the future, any further changes to the type will result in creating a new type handler. - dynamicType->LockTypeOnly(); - } + CacheOperators::CachePropertyWrite(object, false, typeWithoutProperty, propertyId, &info, functionBody->GetScriptContext()); } - - type->SetHasBeenCached(); - guard->SetTypeAddr((intptr_t)type); - return true; } void JavascriptOperators::GetPropertyIdForInt(uint64 value, ScriptContext* scriptContext, PropertyRecord const ** propertyRecord) @@ -8694,9 +8401,12 @@ namespace Js { if (!currentDescriptor->IsWritable()) { - if ((descriptor.WritableSpecified() && descriptor.IsWritable()) || // ES5 8.12.9.10.a.i - (descriptor.ValueSpecified() && - !JavascriptConversion::SameValue(descriptor.GetValue(), currentDescriptor->GetValue()))) // ES5 8.12.9.10.a.ii + if (descriptor.WritableSpecified() && descriptor.IsWritable()) // ES5 8.12.9.10.a.i + { + return Reject(throwOnError, scriptContext, JSERR_DefineProperty_NotConfigurable, propId); + } + else if (descriptor.ValueSpecified() && + !JavascriptConversion::SameValue(descriptor.GetValue(), currentDescriptor->GetValue())) // ES5 8.12.9.10.a.ii { return Reject(throwOnError, scriptContext, JSERR_DefineProperty_NotWritable, propId); } @@ -9149,26 +8859,6 @@ namespace Js } } - Var JavascriptOperators::OP_InvokePut(Js::ScriptContext *scriptContext, Var instance, CallInfo callInfo, ...) - { - // Handle a store to a call result: x(y) = z. - // This is not strictly permitted in JScript, but some scripts expect to be able to use - // the syntax to set properties of ActiveX objects. - // We handle this by deferring to a virtual method of type. This incurs an extra level of - // indirection but seems preferable to adding the "put" method as a member of every type - // and using the normal JScript calling mechanism. - - RUNTIME_ARGUMENTS(args, callInfo); - AssertMsg(args.Info.Count > 0, "Missing this argument in InvokePut"); - - if (TaggedNumber::Is(instance)) - { - JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedFunction /* TODO-ERROR: get arg name - aFunc */); - } - RecyclableObject* function = RecyclableObject::FromVar(instance); - return function->InvokePut(args); - } - // Conformance to: ES5 8.6.1. // Set attributes on the object as provided by property descriptor. // If force parameter is true, we force SetAttributes call even if none of the attributes are defined by the descriptor. @@ -9387,7 +9077,7 @@ namespace Js Var thisVar = RootToThisObject(object, scriptContext); - RecyclableObject* marshalledFunction = RecyclableObject::FromVar( + RecyclableObject* marshalledFunction = RecyclableObject::UnsafeFromVar( CrossSite::MarshalVar(requestContext, function, scriptContext)); Var result = CALL_ENTRYPOINT(threadContext, marshalledFunction->GetEntryPoint(), function, CallInfo(flags, 1), thisVar); @@ -9429,7 +9119,7 @@ namespace Js RecyclableObject* marshalledFunction = function; if (requestContext) { - marshalledFunction = RecyclableObject::FromVar(CrossSite::MarshalVar(requestContext, function, function->GetScriptContext())); + marshalledFunction = RecyclableObject::UnsafeFromVar(CrossSite::MarshalVar(requestContext, function, function->GetScriptContext())); } Var result = CALL_ENTRYPOINT(threadContext, marshalledFunction->GetEntryPoint(), function, CallInfo(flags, 2), thisVar, putValue); @@ -9508,7 +9198,7 @@ namespace Js return scriptContext->GetLibrary()->GetUndefined(); } - ScriptFunction *instance = ScriptFunction::FromVar(scriptFunction); + ScriptFunction *instance = ScriptFunction::UnsafeFromVar(scriptFunction); // We keep a reference to the current class rather than its super prototype // since the prototype could change. @@ -9818,11 +9508,11 @@ namespace Js case Js::TypeIds_Object: return DynamicObject::BoxStackInstance(DynamicObject::FromVar(instance)); case Js::TypeIds_Array: - return JavascriptArray::BoxStackInstance(JavascriptArray::FromVar(instance), deepCopy); + return JavascriptArray::BoxStackInstance(JavascriptArray::UnsafeFromVar(instance), deepCopy); case Js::TypeIds_NativeIntArray: - return JavascriptNativeIntArray::BoxStackInstance(JavascriptNativeIntArray::FromVar(instance), deepCopy); + return JavascriptNativeIntArray::BoxStackInstance(JavascriptNativeIntArray::UnsafeFromVar(instance), deepCopy); case Js::TypeIds_NativeFloatArray: - return JavascriptNativeFloatArray::BoxStackInstance(JavascriptNativeFloatArray::FromVar(instance), deepCopy); + return JavascriptNativeFloatArray::BoxStackInstance(JavascriptNativeFloatArray::UnsafeFromVar(instance), deepCopy); case Js::TypeIds_Function: Assert(allowStackFunction); // Stack functions are deal with not mar mark them, but by nested function escape analysis @@ -9918,7 +9608,7 @@ namespace Js Js::ScriptContext* scriptContext) { Var element; - uint64 allocSize = length * elementSize; + uint64 allocSize = UInt32Math::Mul(length, elementSize); // TODO:further fast path the call for things like IntArray convert to int, floatarray convert to float etc. // such that we don't need boxing. @@ -10051,13 +9741,13 @@ namespace Js switch (Js::JavascriptOperators::GetTypeId(arrayObject)) { case TypeIds_Array: - Js::JavascriptOperators::ObjectToNativeArray(Js::JavascriptArray::FromVar(arrayObject), valueType, length, elementSize, buffer, scriptContext); + Js::JavascriptOperators::ObjectToNativeArray(Js::JavascriptArray::UnsafeFromVar(arrayObject), valueType, length, elementSize, buffer, scriptContext); break; case TypeIds_NativeFloatArray: - Js::JavascriptOperators::ObjectToNativeArray(Js::JavascriptNativeFloatArray::FromVar(arrayObject), valueType, length, elementSize, buffer, scriptContext); + Js::JavascriptOperators::ObjectToNativeArray(Js::JavascriptNativeFloatArray::UnsafeFromVar(arrayObject), valueType, length, elementSize, buffer, scriptContext); break; case TypeIds_NativeIntArray: - Js::JavascriptOperators::ObjectToNativeArray(Js::JavascriptNativeIntArray::FromVar(arrayObject), valueType, length, elementSize, buffer, scriptContext); + Js::JavascriptOperators::ObjectToNativeArray(Js::JavascriptNativeIntArray::UnsafeFromVar(arrayObject), valueType, length, elementSize, buffer, scriptContext); break; // We can have more specialized template if needed. default: @@ -10067,7 +9757,7 @@ namespace Js } // SpeciesConstructor abstract operation as described in ES6.0 Section 7.3.20 - Var JavascriptOperators::SpeciesConstructor(RecyclableObject* object, Var defaultConstructor, ScriptContext* scriptContext) + RecyclableObject* JavascriptOperators::SpeciesConstructor(_In_ RecyclableObject* object, _In_ JavascriptFunction* defaultConstructor, _In_ ScriptContext* scriptContext) { //1.Assert: Type(O) is Object. Assert(JavascriptOperators::IsObject(object)); @@ -10101,9 +9791,10 @@ namespace Js constructor = species; } //9.If IsConstructor(S) is true, return S. - if (JavascriptOperators::IsConstructor(constructor)) + RecyclableObject* constructorObj = JavascriptOperators::TryFromVar(constructor); + if (constructorObj && JavascriptOperators::IsConstructor(constructorObj)) { - return constructor; + return constructorObj; } //10.Throw a TypeError exception. JavascriptError::ThrowTypeError(scriptContext, JSERR_NotAConstructor, _u("constructor[Symbol.species]")); @@ -10390,7 +10081,7 @@ namespace Js return Less_Full(aLeft, aRight, scriptContext); } - Var JavascriptOperators::ToObject(Var aRight, ScriptContext* scriptContext) + RecyclableObject* JavascriptOperators::ToObject(Var aRight, ScriptContext* scriptContext) { RecyclableObject* object = nullptr; if (FALSE == JavascriptConversion::ToObject(aRight, scriptContext, &object)) @@ -10419,9 +10110,14 @@ namespace Js return JavascriptNumber::ToVarNoCheck(JavascriptConversion::ToNumber_Full(aRight, scriptContext), scriptContext); } - BOOL JavascriptOperators::IsObject(Var aValue) + BOOL JavascriptOperators::IsObject(_In_ RecyclableObject* instance) { - return GetTypeId(aValue) > TypeIds_LastJavascriptPrimitiveType; + return GetTypeId(instance) > TypeIds_LastJavascriptPrimitiveType; + } + + BOOL JavascriptOperators::IsObject(_In_ Var instance) + { + return GetTypeId(instance) > TypeIds_LastJavascriptPrimitiveType; } BOOL JavascriptOperators::IsObjectType(TypeId typeId) @@ -10440,6 +10136,11 @@ namespace Js return IsObjectType(typeId) || typeId == TypeIds_Null; } + BOOL JavascriptOperators::IsUndefined(_In_ RecyclableObject* instance) + { + return JavascriptOperators::GetTypeId(instance) == TypeIds_Undefined; + } + BOOL JavascriptOperators::IsUndefined(Var instance) { return JavascriptOperators::GetTypeId(instance) == TypeIds_Undefined; @@ -10507,7 +10208,7 @@ namespace Js return instance->GetType()->GetTypeId() == TypeIds_Undefined; } - BOOL JavascriptOperators::IsUndefinedObject(Var instance, RecyclableObject* libraryUndefined) + BOOL JavascriptOperators::IsUndefinedObject(Var instance, RecyclableObject *libraryUndefined) { Assert(JavascriptOperators::IsUndefinedObject(libraryUndefined)); AssertMsg((instance == libraryUndefined) @@ -10535,13 +10236,13 @@ namespace Js // GetIterator as described in ES6.0 (draft 22) Section 7.4.1 RecyclableObject* JavascriptOperators::GetIterator(Var iterable, ScriptContext* scriptContext, bool optional) { - RecyclableObject* iterableObj = RecyclableObject::FromVar(JavascriptOperators::ToObject(iterable, scriptContext)); + RecyclableObject* iterableObj = JavascriptOperators::ToObject(iterable, scriptContext); return JavascriptOperators::GetIterator(iterableObj, scriptContext, optional); } RecyclableObject* JavascriptOperators::GetIteratorFunction(Var iterable, ScriptContext* scriptContext, bool optional) { - RecyclableObject* iterableObj = RecyclableObject::FromVar(JavascriptOperators::ToObject(iterable, scriptContext)); + RecyclableObject* iterableObj = JavascriptOperators::ToObject(iterable, scriptContext); return JavascriptOperators::GetIteratorFunction(iterableObj, scriptContext, optional); } @@ -10782,6 +10483,11 @@ namespace Js BOOL JavascriptOperators::GetItem(RecyclableObject* instance, uint64 index, Var* value, ScriptContext* requestContext) { + if (index < JavascriptArray::InvalidIndex) + { + // In case index fits in uint32, we can avoid the (slower) big-index path + return GetItem(instance, static_cast(index), value, requestContext); + } PropertyRecord const * propertyRecord = nullptr; JavascriptOperators::GetPropertyIdForInt(index, requestContext, &propertyRecord); return JavascriptOperators::GetProperty(instance, propertyRecord->GetPropertyId(), value, requestContext); @@ -10823,15 +10529,8 @@ namespace Js BOOL JavascriptOperators::CheckPrototypesForAccessorOrNonWritableProperty(RecyclableObject* instance, JavascriptString* propertyNameString, Var* setterValue, DescriptorFlags* flags, PropertyValueInfo* info, ScriptContext* scriptContext) { - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (Js::BuiltInPropertyRecords::__proto__.Equals(propertyName)) - { - return CheckPrototypesForAccessorOrNonWritablePropertyCore(instance, propertyNameString, setterValue, flags, info, scriptContext); - } - else - { - return CheckPrototypesForAccessorOrNonWritablePropertyCore(instance, propertyNameString, setterValue, flags, info, scriptContext); - } + PropertyId propertyId = propertyNameString->GetPropertyRecord()->GetPropertyId(); + return CheckPrototypesForAccessorOrNonWritableProperty(instance, propertyId, setterValue, flags, info, scriptContext); } BOOL JavascriptOperators::SetProperty(Var instance, RecyclableObject* object, PropertyId propertyId, Var newValue, ScriptContext* requestContext, PropertyOperationFlags propertyOperationFlags) diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.h b/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.h index e229173b2e9..a00919e9af1 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.h +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.h @@ -53,9 +53,8 @@ namespace Js JavascriptError::ThrowReferenceError(scriptContext, JSERR_UseBeforeDeclaration); \ } -#define BEGIN_TYPEOF_ERROR_HANDLER(scriptContext) \ - try { \ - Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); \ +#ifdef ENABLE_SCRIPT_DEBUGGING +#define BEGIN_TYPEOF_ERROR_HANDLER_DEBUGGER_THROW_IS_INTERNAL \ class AutoCleanup \ { \ private: \ @@ -76,6 +75,14 @@ namespace Js } \ } \ } autoCleanup(scriptContext); +#else +#define BEGIN_TYPEOF_ERROR_HANDLER_DEBUGGER_THROW_IS_INTERNAL +#endif + +#define BEGIN_TYPEOF_ERROR_HANDLER(scriptContext) \ + try { \ + Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); \ + BEGIN_TYPEOF_ERROR_HANDLER_DEBUGGER_THROW_IS_INTERNAL #define END_TYPEOF_ERROR_HANDLER(scriptContext, var) \ @@ -95,12 +102,16 @@ namespace Js { // Methods public: - static void FreeTemp(Var aValue); - - static BOOL IsArray(Var instanceVar); - static BOOL IsConstructor(Var instanceVar); + static bool IsArray(_In_ RecyclableObject* instanceObj); + static bool IsArray(_In_ Var instanceVar); + static bool IsArray(_In_ JavascriptProxy * proxy); + static bool IsConstructor(_In_ RecyclableObject* instanceObj); + static bool IsConstructor(_In_ Var instanceVar); + static bool IsConstructor(_In_ JavascriptProxy * proxy); static BOOL IsConcatSpreadable(Var instanceVar); - static Var ToObject(Var aRight,ScriptContext* scriptContext); + static bool IsConstructorSuperCall(Arguments args); + static bool GetAndAssertIsConstructorSuperCall(Arguments args); + static RecyclableObject* ToObject(Var aRight,ScriptContext* scriptContext); static Var ToWithObject(Var aRight, ScriptContext* scriptContext); static Var OP_LdCustomSpreadIteratorList(Var aRight, ScriptContext* scriptContext); static Var ToNumber(Var aRight,ScriptContext* scriptContext); @@ -134,21 +145,18 @@ namespace Js static BOOL Greater(Var aLeft, Var aRight,ScriptContext* scriptContext); static BOOL Greater_Full(Var aLeft, Var aRight,ScriptContext* scriptContext); static BOOL GreaterEqual(Var aLeft, Var aRight,ScriptContext* scriptContext); - static BOOL GreaterEqual_Full(Var aLeft, Var aRight,ScriptContext* scriptContext); static BOOL Less(Var aLeft, Var aRight,ScriptContext* scriptContext); static BOOL Less_Full(Var aLeft, Var aRight,ScriptContext* scriptContext); static BOOL LessEqual(Var aLeft, Var aRight,ScriptContext* scriptContext); - static BOOL LessEqual_Full(Var aLeft, Var aRight,ScriptContext* scriptContext); static BOOL NotEqual(Var aLeft, Var aRight,ScriptContext* scriptContext); - static BOOL NotEqual_Full(Var aLeft, Var aRight,ScriptContext* scriptContext); static BOOL StrictEqual(Var aLeft, Var aRight,ScriptContext* scriptContext); static BOOL StrictEqualString(Var aLeft, Var aRight); static BOOL StrictEqualEmptyString(Var aLeft); static BOOL StrictEqualSIMD(Var aLeft, Var aRight, ScriptContext* scriptContext); static BOOL NotStrictEqual(Var aLeft, Var aRight,ScriptContext* scriptContext); - static BOOL HasOwnProperty(Var instance, PropertyId propertyId, ScriptContext * requestContext); - static BOOL GetOwnProperty(Var instance, PropertyId propertyId, Var* value, ScriptContext* requestContext); + static BOOL HasOwnProperty(Var instance, PropertyId propertyId, _In_ ScriptContext * requestContext, _In_opt_ PropertyString * propString); + static BOOL GetOwnProperty(Var instance, PropertyId propertyId, Var* value, ScriptContext* requestContext, PropertyValueInfo * propertyValueInfo); static BOOL GetOwnAccessors(Var instance, PropertyId propertyId, Var* getter, Var* setter, ScriptContext * requestContext); static BOOL EnsureProperty(Var instance, PropertyId propertyId); static void OP_EnsureNoRootProperty(Var instance, PropertyId propertyId); @@ -166,13 +174,10 @@ namespace Js static BOOL GetOwnPropertyDescriptor(RecyclableObject* obj, JavascriptString* propertyKey, ScriptContext* scriptContext, PropertyDescriptor* propertyDescriptor); static BOOL IsPropertyUnscopable (Var instanceVar, PropertyId propertyId); static BOOL IsPropertyUnscopable (Var instanceVar, JavascriptString *propertyString); - template - static BOOL HasProperty_Impl(RecyclableObject* instance, PropertyId propertyId); static BOOL HasPropertyUnscopables(RecyclableObject* instance, PropertyId propertyId); static BOOL HasProperty(RecyclableObject* instance, PropertyId propertyId); static BOOL HasRootProperty(RecyclableObject* instance, PropertyId propertyId); static BOOL HasProxyOrPrototypeInlineCacheProperty(RecyclableObject* instance, PropertyId propertyId); - static BOOL HasProxyInPrototypeChain(RecyclableObject* instance); template static BOOL GetPropertyWPCache(Var instance, RecyclableObject* propertyObject, PropertyKeyType propertyKey, Var* value, ScriptContext* requestContext, _Inout_ PropertyValueInfo * info); static BOOL GetPropertyUnscopable(Var instance, RecyclableObject* propertyObject, PropertyId propertyId, Var* value, ScriptContext* requestContext, PropertyValueInfo* info=NULL); @@ -208,12 +213,25 @@ namespace Js static BOOL DeletePropertyUnscopables(RecyclableObject* instance, PropertyId propertyId, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None); template static BOOL DeleteProperty_Impl(RecyclableObject* instance, PropertyId propertyId, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None); - static TypeId GetTypeId(Var instance); + static TypeId GetTypeId(_In_ const Var instance); + static TypeId GetTypeId(_In_ RecyclableObject* instance); static TypeId GetTypeIdNoCheck(Var instance); - static BOOL IsObject(Var instance); + template + __forceinline static T* TryFromVar(_In_ RecyclableObject* value) + { + return T::Is(value) ? T::UnsafeFromVar(value) : nullptr; + } + template + __forceinline static T* TryFromVar(_In_ Var value) + { + return T::Is(value) ? T::UnsafeFromVar(value) : nullptr; + } + static BOOL IsObject(_In_ Var instance); + static BOOL IsObject(_In_ RecyclableObject* instance); static BOOL IsExposedType(TypeId typeId); static BOOL IsObjectType(TypeId typeId); static BOOL IsObjectOrNull(Var instance); + static BOOL IsUndefined(_In_ RecyclableObject* instance); static BOOL IsUndefined(Var instance); static BOOL IsUndefinedObject(RecyclableObject* instance); static BOOL IsUndefinedOrNullType(TypeId); @@ -226,6 +244,7 @@ namespace Js static BOOL IsUndefinedObject(Var instance); static BOOL IsAnyNumberValue(Var instance); static BOOL IsClassConstructor(Var instance); + static BOOL IsClassMethod(Var instance); static BOOL IsBaseConstructorKind(Var instance); // careful using the versions below. (instance's scriptContext better be === scriptContext) @@ -257,7 +276,6 @@ namespace Js static BOOL DeleteItem(RecyclableObject* instance, uint32 index, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None); static BOOL DeleteItem(RecyclableObject* instance, uint64 index, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None); - static Var Construct(RecyclableObject* constructor, const Arguments args, ScriptContext* scriptContext); static RecyclableObject* CreateFromConstructor(RecyclableObject* constructor, ScriptContext* scriptContext); static RecyclableObject* OrdinaryCreateFromConstructor(RecyclableObject* constructor, RecyclableObject* obj, DynamicObject* intrinsicProto, ScriptContext* scriptContext); @@ -316,18 +334,10 @@ namespace Js static BOOL OP_HasItem(Var instance, Var aElementIndex, ScriptContext* scriptContext); static Var OP_GetElementI(Var instance, Var aElementIndex, ScriptContext* scriptContext); - static Var OP_GetElementI_JIT(Var instance, Var index, ScriptContext *scriptContext); -#if ENABLE_NATIVE_CODEGEN - static Var OP_GetElementI_JIT_ExpectingNativeFloatArray(Var instance, Var index, ScriptContext *scriptContext); - static Var OP_GetElementI_JIT_ExpectingVarArray(Var instance, Var index, ScriptContext *scriptContext); -#endif - static Var OP_GetElementI_UInt32(Var instance, uint32 aElementIndex, ScriptContext* scriptContext); - static Var OP_GetElementI_UInt32_ExpectingNativeFloatArray(Var instance, uint32 aElementIndex, ScriptContext* scriptContext); - static Var OP_GetElementI_UInt32_ExpectingVarArray(Var instance, uint32 aElementIndex, ScriptContext* scriptContext); static Var OP_GetElementI_Int32(Var instance, int32 aElementIndex, ScriptContext* scriptContext); - static Var OP_GetElementI_Int32_ExpectingNativeFloatArray(Var instance, int32 aElementIndex, ScriptContext* scriptContext); - static Var OP_GetElementI_Int32_ExpectingVarArray(Var instance, int32 aElementIndex, ScriptContext* scriptContext); + static Var OP_GetElementI_JIT(Var instance, Var index, ScriptContext *scriptContext); + static Var GetElementIHelper(Var instance, Var index, Var receiver, ScriptContext* scriptContext); static int32 OP_GetNativeIntElementI(Var instance, Var index); static int32 OP_GetNativeIntElementI_Int32(Var instance, int32 index, ScriptContext *scriptContext); @@ -342,7 +352,7 @@ namespace Js static BOOL OP_SetElementI_JIT(Var instance, Var aElementIndex, Var aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None); static BOOL OP_SetElementI_UInt32(Var instance, uint32 aElementIndex, Var aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None); - static BOOL OP_SetElementI_Int32(Var instance, int aElementIndex, Var aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None); + static BOOL OP_SetElementI_Int32(Var instance, int32 aElementIndex, Var aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None); static BOOL SetElementIHelper(Var receiver, RecyclableObject* object, Var index, Var value, ScriptContext* scriptContext, PropertyOperationFlags flags); static BOOL OP_SetNativeIntElementI(Var instance, Var aElementIndex, int32 aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None); static BOOL OP_SetNativeIntElementI_UInt32(Var instance, uint32 aElementIndex, int32 aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None); @@ -352,7 +362,7 @@ namespace Js static BOOL OP_SetNativeFloatElementI_Int32(Var instance, int aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags flags, double value); static Var OP_DeleteElementI(Var instance, Var aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None); static Var OP_DeleteElementI_UInt32(Var instance, uint32 aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None); - static Var OP_DeleteElementI_Int32(Var instance, int aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None); + static Var OP_DeleteElementI_Int32(Var instance, int32 aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None); static BOOL OP_Memset(Var instance, int32 start, Var value, int32 length, ScriptContext* scriptContext); static BOOL OP_Memcopy(Var dstInstance, int32 dstStart, Var srcInstance, int32 srcStart, int32 length, ScriptContext* scriptContext); static Var OP_GetLength(Var instance, ScriptContext* scriptContext); @@ -419,6 +429,8 @@ namespace Js static Var NewScObjectNoArgNoCtorFull(Var instance, ScriptContext* requestContext); static Var NewScObjectNoArg(Var instance, ScriptContext* requestContext); static Var NewScObject(const Var callee, const Arguments args, ScriptContext *const scriptContext, const Js::AuxArray *spreadIndices = nullptr); + template + static Var NewObjectCreationHelper_ReentrancySafe(RecyclableObject* constructor, Var defaultConstructor, ThreadContext * threadContext, Fn newObjectCreationFunction); static Var AddVarsToArraySegment(SparseArraySegment * segment, const Js::VarArray *vars); static void AddIntsToArraySegment(SparseArraySegment * segment, const Js::AuxArray *ints); static void AddFloatsToArraySegment(SparseArraySegment * segment, const Js::AuxArray *doubles); @@ -449,6 +461,7 @@ namespace Js static Var OP_LdNull(ScriptContext* scriptContext); static Var OP_LdUndef(ScriptContext* scriptContext); static Var OP_LdNaN(ScriptContext* scriptContext); + static Var OP_LdChakraLib(ScriptContext* scriptContext); static Var OP_LdInfinity(ScriptContext* scriptContext); static FrameDisplay* OP_LdHandlerScope(Var argThis, ScriptContext* scriptContext); static FrameDisplay* OP_LdFrameDisplay(void *argHead, void *argEnv, ScriptContext* scriptContext); @@ -460,7 +473,7 @@ namespace Js static FrameDisplay* OP_LdStrictInnerFrameDisplay(void *argHead, void *argEnv, ScriptContext* scriptContext); static FrameDisplay* OP_LdStrictInnerFrameDisplayNoParent(void *argHead, ScriptContext* scriptContext); static void CheckInnerFrameDisplayArgument(void *argHead); - static Var LoadHeapArguments(JavascriptFunction *funcCallee, unsigned int count, Var *pParams, Var frameObj, Var vArray, ScriptContext* scriptContext, bool nonSimpleParamList); + static Var LoadHeapArguments(JavascriptFunction *funcCallee, uint32 count, Var *pParams, Var frameObj, Var vArray, ScriptContext* scriptContext, bool nonSimpleParamList); static Var LoadHeapArgsCached(JavascriptFunction *funcCallee, uint32 actualsCount, uint32 formalsCount, Var *pParams, Var frameObj, ScriptContext* scriptContext, bool nonSimpleParamList); static Var FillScopeObject(JavascriptFunction *funcCallee, uint32 actualsCount, uint32 formalsCount, Var frameObj, Var * paramAddr, Js::PropertyIdArray *propIds, HeapArgumentsObject * argsObj, ScriptContext * scriptContext, bool nonSimpleParamList, bool useCachedScope); static HeapArgumentsObject *CreateHeapArguments(JavascriptFunction *funcCallee, uint32 actualsCount, uint32 formalsCount, Var frameObj, ScriptContext* scriptContext); @@ -525,14 +538,6 @@ namespace Js static Var PatchGetMethodFromObject(Var instance, RecyclableObject * propertyObject, PropertyId propertyId, PropertyValueInfo * info, ScriptContext * scriptContext, bool isRootLd); -#if ENABLE_DEBUG_CONFIG_OPTIONS - static void TracePropertyEquivalenceCheck(const JitEquivalentTypeGuard* guard, const Type* type, const Type* refType, bool isEquivalent, uint failedPropertyIndex); -#endif - static bool IsStaticTypeObjTypeSpecEquivalent(const TypeEquivalenceRecord& equivalenceRecord, uint& failedIndex); - static bool IsStaticTypeObjTypeSpecEquivalent(const EquivalentPropertyEntry *entry); - static bool CheckIfTypeIsEquivalent(Type* type, JitEquivalentTypeGuard* guard); - static bool CheckIfTypeIsEquivalentForFixedField(Type* type, JitEquivalentTypeGuard* guard); - static void GetPropertyIdForInt(uint64 value, ScriptContext* scriptContext, PropertyRecord const ** propertyRecord); static void GetPropertyIdForInt(uint32 value, ScriptContext* scriptContext, PropertyRecord const ** propertyRecord); static BOOL TryConvertToUInt32(const char16* str, int length, uint32* value); @@ -555,8 +560,6 @@ namespace Js template static PropertyDescriptor FillMissingPropertyDescriptorFields(PropertyDescriptor descriptor, ScriptContext* scriptContext); - static Var OP_InvokePut(Js::ScriptContext *scriptContext, Var function, CallInfo callInfo, ...); - static Var DefaultAccessor(RecyclableObject* function, CallInfo callInfo, ...); static bool IsUndefinedAccessor(Var accessor, ScriptContext* scriptContext); @@ -622,7 +625,8 @@ namespace Js __out_bcount(length*elementSize) byte* contentBuffer, Js::ScriptContext* scriptContext); - static Var SpeciesConstructor(RecyclableObject* object, Var defaultConstructor, ScriptContext* scriptContext); + // Returns a RecyclableObject* which is either a JavascriptFunction* or a JavascriptProxy* that targets a JavascriptFunction* + static RecyclableObject* SpeciesConstructor(_In_ RecyclableObject* object, _In_ JavascriptFunction* defaultConstructor, _In_ ScriptContext* scriptContext); static Var GetSpecies(RecyclableObject* constructor, ScriptContext* scriptContext); private: @@ -691,6 +695,8 @@ namespace Js static BOOL ToPropertyDescriptorForProxyObjects(Var propertySpec, PropertyDescriptor* descriptor, ScriptContext* scriptContext); static BOOL ToPropertyDescriptorForGenericObjects(Var propertySpec, PropertyDescriptor* descriptor, ScriptContext* scriptContext); + + static BOOL IsRemoteArray(RecyclableObject* instance); }; } // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.inl b/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.inl index 4b921bcae7a..27d95f695eb 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.inl +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptOperators.inl @@ -6,7 +6,19 @@ namespace Js { - __forceinline TypeId JavascriptOperators::GetTypeId(const Var aValue) + __forceinline TypeId JavascriptOperators::GetTypeId(_In_ RecyclableObject* obj) + { + AssertMsg(obj != nullptr, "GetTypeId aValue is null"); + + auto typeId = obj->GetTypeId(); +#if DBG + auto isExternal = obj->CanHaveInterceptors(); + AssertMsg(typeId < TypeIds_Limit || isExternal, "GetTypeId aValue has invalid TypeId"); +#endif + return typeId; + } + + __forceinline TypeId JavascriptOperators::GetTypeId(_In_ const Var aValue) { AssertMsg(aValue != nullptr, "GetTypeId aValue is null"); @@ -22,12 +34,7 @@ namespace Js #endif else { - auto typeId = RecyclableObject::FromVar(aValue)->GetTypeId(); -#if DBG - auto isExternal = RecyclableObject::FromVar(aValue)->CanHaveInterceptors(); - AssertMsg(typeId < TypeIds_Limit || isExternal, "GetTypeId aValue has invalid TypeId"); -#endif - return typeId; + return JavascriptOperators::GetTypeId(RecyclableObject::UnsafeFromVar(aValue)); } } @@ -149,4 +156,20 @@ namespace Js return CheckPrototypesForAccessorOrNonWritablePropertyCore(instance, propertyKey, setterValue, flags, nullptr, scriptContext); } } + + template + Var JavascriptOperators::NewObjectCreationHelper_ReentrancySafe(RecyclableObject* constructor, Var defaultConstructor, ThreadContext * threadContext, Fn newObjectCreationFunction) + { + if (constructor != defaultConstructor) + { + return threadContext->ExecuteImplicitCall(constructor, Js::ImplicitCall_Accessor, [=]()->Js::Var + { + return newObjectCreationFunction(); + }); + } + else + { + return newObjectCreationFunction(); + } + } } diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptStackWalker.cpp b/deps/chakrashim/core/lib/Runtime/Language/JavascriptStackWalker.cpp index 1a6eb32f616..2304f1e0a03 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptStackWalker.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptStackWalker.cpp @@ -353,7 +353,7 @@ namespace Js if (pCodeAddr) { -#if defined(_M_ARM32_OR_ARM64) +#if defined(_M_ARM) // Note that DWORD_PTR is not actually a pointer type (!) but is simple unsigned long/__int64 (see BaseTsd.h). // Thus, decrement would be by 1 byte and not 4 bytes as in pointer arithmetic. That's exactly what we need. // For ARM the 'return address' is always odd and is 'next instr addr' + 1 byte, so to get to the BLX instr, we need to subtract 2 bytes from it. @@ -540,7 +540,7 @@ namespace Js #endif // We might've bailed out of an inlinee, so check if there were any inlinees. - if (this->interpreterFrame->GetFlags() & InterpreterStackFrameFlags_FromBailOut) + if (this->interpreterFrame->TestFlags(InterpreterStackFrameFlags_FromBailOut)) { previousInterpreterFrameIsFromBailout = true; @@ -628,7 +628,32 @@ namespace Js } return nullptr; } - +#if ENABLE_NATIVE_CODEGEN + void JavascriptStackWalker::WalkAndClearInlineeFrameCallInfoOnException(void *tryCatchFrameAddr) + { + // Walk the stack and when we find the first native frame, we clear the inlinee's callinfo for this frame + // It is sufficient we stop at the first native frame which had the enclosing try-catch + // TODO : Revisit when we start inlining functions with try-catch/try-finally + while (this->Walk(true)) + { + if (JavascriptFunction::IsNativeAddress(this->scriptContext, this->currentFrame.GetInstructionPointer())) + { + if (HasInlinedFramesOnStack()) + { + for (int index = inlinedFrameWalker.GetFrameCount() - 1; index >= 0; index--) + { + auto inlinedFrame = inlinedFrameWalker.GetFrameAtIndex(index); + inlinedFrame->callInfo.Clear(); + } + } + if (this->currentFrame.GetFrame() == tryCatchFrameAddr) + { + break; + } + } + } + } +#endif // Note: noinline is to make sure that when we unwind to the unwindToAddress, there is at least one frame to unwind. _NOINLINE JavascriptStackWalker::JavascriptStackWalker(ScriptContext * scriptContext, bool useEERContext, PVOID returnAddress, bool _forceFullWalk /*=false*/) : @@ -722,7 +747,7 @@ namespace Js } // If we're at the entry from a host frame, hop to the frame from which we left the script. - if (this->currentFrame.GetInstructionPointer() == this->entryExitRecord->returnAddrOfScriptEntryFunction) + if (AlignAndCheckAddressOfReturnAddressMatch(this->currentFrame.GetAddressOfInstructionPointer(), this->entryExitRecord->addrOfReturnAddrOfScriptEntryFunction)) { BOOL hasCaller = this->entryExitRecord->hasCaller || this->forceFullWalk; @@ -859,7 +884,7 @@ namespace Js return false; } - bool AlignAndCheckAddressOfReturnAddressMatch(void* addressOfReturnAddress, void* nativeLibraryEntryAddress) + bool JavascriptStackWalker::AlignAndCheckAddressOfReturnAddressMatch(void* addressOfReturnAddress, void* nativeLibraryEntryAddress) { return addressOfReturnAddress == nativeLibraryEntryAddress #if defined(_M_IX86) @@ -868,7 +893,7 @@ namespace Js // return address offset by 4, 8, or 12. || (((uint)nativeLibraryEntryAddress - (uint)addressOfReturnAddress < 0x10) && *(void**)addressOfReturnAddress == *(void**)nativeLibraryEntryAddress - ) + ) #endif ; } @@ -894,7 +919,7 @@ namespace Js void * codeAddr = this->currentFrame.GetInstructionPointer(); if (this->tempInterpreterFrame && codeAddr == this->tempInterpreterFrame->GetReturnAddress()) { - bool isBailoutInterpreter = (this->tempInterpreterFrame->GetFlags() & Js::InterpreterStackFrameFlags_FromBailOut) != 0; + bool isBailoutInterpreter = this->tempInterpreterFrame->TestFlags(Js::InterpreterStackFrameFlags_FromBailOut); // We need to skip over the first interpreter frame on the stack if it is the partially initialized frame // otherwise it is a real frame and we should continue. @@ -927,7 +952,7 @@ namespace Js // The return address of the interpreterFrame is the same as the entryPoint for a jitted loop body. // This can only ever happen when we have bailed out from a function inlined in the loop body. We // wouldn't have created a new interpreterFrame if the bailout were from the loop body itself. - Assert((this->interpreterFrame->GetFlags() & Js::InterpreterStackFrameFlags_FromBailOut) != 0); + Assert(this->interpreterFrame->TestFlags(Js::InterpreterStackFrameFlags_FromBailOut)); InlinedFrameWalker tmpFrameWalker; Assert(InlinedFrameWalker::FromPhysicalFrame(tmpFrameWalker, currentFrame, Js::ScriptFunction::FromVar(argv[JavascriptFunctionArgIndex_Function]), true /*fromBailout*/, this->tempInterpreterFrame->GetCurrentLoopNum(), this, false /*useInternalFrameInfo*/, true /*noAlloc*/, false /*deepCopy*/)); @@ -1072,7 +1097,6 @@ namespace Js if (callInfo.Flags & Js::CallFlags_ExtraArg) { callInfo.Flags = (CallFlags)(callInfo.Flags & ~Js::CallFlags_ExtraArg); - callInfo.Count--; } return callInfo; diff --git a/deps/chakrashim/core/lib/Runtime/Language/JavascriptStackWalker.h b/deps/chakrashim/core/lib/Runtime/Language/JavascriptStackWalker.h index 9dd22540f98..fad093f7372 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/JavascriptStackWalker.h +++ b/deps/chakrashim/core/lib/Runtime/Language/JavascriptStackWalker.h @@ -114,6 +114,7 @@ namespace Js uint32 GetBottomMostInlineeOffset() const; Js::JavascriptFunction *GetBottomMostFunctionObject() const; void FinalizeStackValues(__in_ecount(argCount) Js::Var args[], size_t argCount) const; + int32 GetFrameCount() { return frameCount; } private: enum { @@ -135,11 +136,13 @@ namespace Js }; - void Initialize(int32 frameCount, __in_ecount(frameCount) InlinedFrame **frames, Js::ScriptFunction *parent); + public: + InlinedFrame *const GetFrameAtIndex(signed index) const; + private: + void Initialize(int32 frameCount, __in_ecount(frameCount) InlinedFrame **frames, Js::ScriptFunction *parent); void MoveNext(); InlinedFrame *const GetCurrentFrame() const; - InlinedFrame *const GetFrameAtIndex(signed index) const; Js::ScriptFunction *parentFunction; InlinedFrame **frames; @@ -228,11 +231,13 @@ namespace Js bool GetSourcePosition(const WCHAR** sourceFileName, ULONG* line, LONG* column); static bool TryIsTopJavaScriptFrameNative(ScriptContext* scriptContext, bool* istopFrameNative, bool ignoreLibraryCode = false); + static bool AlignAndCheckAddressOfReturnAddressMatch(void* addressOfReturnAddress, void* nativeLibraryEntryAddress); #if ENABLE_NATIVE_CODEGEN void ClearCachedInternalFrameInfo(); void SetCachedInternalFrameInfo(InternalFrameType frameType, JavascriptFunction* function, bool hasInlinedFramesOnStack, bool prevIntFrameIsFromBailout); InternalFrameInfo GetCachedInternalFrameInfo() const { return this->lastInternalFrameInfo; } + void WalkAndClearInlineeFrameCallInfoOnException(void *tryCatchFrameAddr); #endif bool IsCurrentPhysicalFrameForLoopBody() const; diff --git a/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespace.cpp b/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespace.cpp index fed50bbdb3e..b198d61ed94 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespace.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespace.cpp @@ -7,7 +7,6 @@ #include "Types/PropertyIndexRanges.h" #include "Types/SimpleDictionaryPropertyDescriptor.h" #include "Types/SimpleDictionaryTypeHandler.h" -#include "Types/NullTypeHandler.h" #include "ModuleNamespace.h" #include "ModuleNamespaceEnumerator.h" diff --git a/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespace.h b/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespace.h index cd58d3c5ca9..d8a13dcf642 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespace.h +++ b/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespace.h @@ -31,7 +31,7 @@ namespace Js void Initialize(); ListForListIterator* GetSortedExportedNames() { return this->sortedExportedNames; } static bool Is(Var aValue) { return JavascriptOperators::GetTypeId(aValue) == TypeIds_ModuleNamespace; } - static ModuleNamespace* FromVar(Var obj) { Assert(JavascriptOperators::GetTypeId(obj) == TypeIds_ModuleNamespace); return static_cast(obj); } + static ModuleNamespace* FromVar(Var obj) { AssertOrFailFast(JavascriptOperators::GetTypeId(obj) == TypeIds_ModuleNamespace); return static_cast(obj); } virtual PropertyId GetPropertyId(BigPropertyIndex index) override; virtual PropertyQueryFlags HasPropertyQuery(PropertyId propertyId) override; @@ -49,7 +49,9 @@ namespace Js virtual BOOL SetPropertyWithAttributes(PropertyId propertyId, Var value, PropertyAttributes attributes, PropertyValueInfo* info, PropertyOperationFlags flags = PropertyOperation_None, SideEffects possibleSideEffects = SideEffects_Any) override { return false; } virtual BOOL DeleteProperty(PropertyId propertyId, PropertyOperationFlags flags) override; virtual BOOL DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) override; +#if ENABLE_FIXED_FIELDS virtual BOOL IsFixedProperty(PropertyId propertyId) override { return false; } +#endif virtual PropertyQueryFlags HasItemQuery(uint32 index) override { return PropertyQueryFlags::Property_NotFound; } virtual BOOL HasOwnItem(uint32 index) override { return false; } virtual PropertyQueryFlags GetItemQuery(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override { return PropertyQueryFlags::Property_NotFound; } diff --git a/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespaceEnumerator.cpp b/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespaceEnumerator.cpp index f3f3c47a97b..b9f1feef0fb 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespaceEnumerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/ModuleNamespaceEnumerator.cpp @@ -58,6 +58,7 @@ namespace Js // enumeration order: 9.4.6.10 (sorted) exports first, followed by symbols JavascriptString * ModuleNamespaceEnumerator::MoveAndGetNext(PropertyId& propertyId, PropertyAttributes* attributes) { + propertyId = Js::Constants::NoProperty; if (attributes != nullptr) { // all the attribute should have the same setting here in namespace object. diff --git a/deps/chakrashim/core/lib/Runtime/Language/ProfilingHelpers.cpp b/deps/chakrashim/core/lib/Runtime/Language/ProfilingHelpers.cpp index 0c5253a94ba..3b24f3a94eb 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/ProfilingHelpers.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/ProfilingHelpers.cpp @@ -29,7 +29,7 @@ namespace Js const bool fastPath = isJsArray; if(fastPath) { - JavascriptArray *const array = JavascriptArray::FromVar(base); + JavascriptArray *const array = JavascriptArray::UnsafeFromVar(base); ldElemInfo.arrayType = ValueType::FromArray(ObjectType::Array, array, TypeIds_Array).ToLikely(); const Var element = ProfiledLdElem_FastPath(array, varIndex, functionBody->GetScriptContext(), &ldElemInfo); @@ -76,7 +76,7 @@ namespace Js } else if(Js::RecyclableObject::Is(base)) { - ldElemInfo.arrayType = ValueType::FromObject(Js::RecyclableObject::FromVar(base)).ToLikely(); + ldElemInfo.arrayType = ValueType::FromObject(Js::RecyclableObject::UnsafeFromVar(base)).ToLikely(); break; } else @@ -223,7 +223,7 @@ namespace Js const bool fastPath = isJsArray && !JavascriptOperators::SetElementMayHaveImplicitCalls(scriptContext); if(fastPath) { - JavascriptArray *const array = JavascriptArray::FromVar(base); + JavascriptArray *const array = JavascriptArray::UnsafeFromVar(base); stElemInfo.arrayType = ValueType::FromArray(ObjectType::Array, array, TypeIds_Array).ToLikely(); stElemInfo.createdMissingValue = array->HasNoMissingValues(); @@ -239,7 +239,7 @@ namespace Js TypeId arrayTypeId; if(isJsArray) { - array = JavascriptArray::FromVar(base); + array = JavascriptArray::UnsafeFromVar(base); isObjectWithArray = false; arrayTypeId = TypeIds_Array; } @@ -278,7 +278,7 @@ namespace Js { length = headSegmentLength; bool isVirtual = (VirtualTableInfoBase::GetVirtualTable(base) == ValueType::GetVirtualTypedArrayVtable(arrayTypeId)); - stElemInfo.arrayType = ValueType::FromTypeId(arrayTypeId, isVirtual).ToLikely(); + stElemInfo.arrayType = ValueType::FromTypeId(arrayTypeId, isVirtual).ToLikely(); if (!TaggedNumber::Is(value) && !JavascriptNumber::Is_NoTaggedIntCheck(value)) { // Non-number stored to a typed array. A helper call will be needed to convert the value. @@ -473,7 +473,7 @@ namespace Js ProfiledNewScObjArray( callee, args, - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject), + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject), profileId, arrayProfileId); } @@ -489,7 +489,7 @@ namespace Js { ARGUMENTS(args, callInfo); - Js::ScriptFunction *function = ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + Js::ScriptFunction *function = ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); ScriptContext* scriptContext = function->GetScriptContext(); // GetSpreadSize ensures that spreadSize < 2^24 @@ -576,7 +576,7 @@ namespace Js args.Values[0] = nullptr; Var array; - Js::RecyclableObject* calleeObject = RecyclableObject::FromVar(callee); + Js::RecyclableObject* calleeObject = RecyclableObject::UnsafeFromVar(callee); if (arrayInfo->IsNativeIntArray()) { array = JavascriptNativeIntArray::NewInstance(calleeObject, args); @@ -639,7 +639,7 @@ namespace Js const auto calleeObject = JavascriptOperators::GetCallableObjectOrThrow(callee, scriptContext); const auto calleeFunctionInfo = calleeObject->GetTypeId() == TypeIds_Function - ? JavascriptFunction::FromVar(calleeObject)->GetFunctionInfo() + ? JavascriptFunction::UnsafeFromVar(calleeObject)->GetFunctionInfo() : nullptr; DynamicProfileInfo *profileInfo = callerFunctionBody->GetDynamicProfileInfo(); profileInfo->RecordCallSiteInfo( @@ -676,7 +676,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); return ProfiledLdFld( instance, @@ -695,7 +695,7 @@ namespace Js const Var thisInstance) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); return ProfiledLdFld( instance, @@ -713,7 +713,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); return ProfiledLdFldForTypeOf( instance, @@ -731,7 +731,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); return ProfiledLdFld( instance, @@ -749,7 +749,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); return ProfiledLdFld( instance, @@ -767,7 +767,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); return ProfiledLdFld( instance, @@ -785,7 +785,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); return ProfiledLdFldForTypeOf( instance, @@ -802,7 +802,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); return ProfiledLdFld( instance, @@ -839,15 +839,15 @@ namespace Js FldInfoFlags fldInfoFlags = FldInfo_NoInfo; if (Root || (RecyclableObject::Is(instance) && RecyclableObject::Is(thisInstance))) { - RecyclableObject *const object = RecyclableObject::FromVar(instance); - RecyclableObject *const thisObject = RecyclableObject::FromVar(thisInstance); + RecyclableObject *const object = RecyclableObject::UnsafeFromVar(instance); + RecyclableObject *const thisObject = RecyclableObject::UnsafeFromVar(thisInstance); if (!Root && Method && (propertyId == PropertyIds::apply || propertyId == PropertyIds::call) && ScriptFunction::Is(object)) { // If the property being loaded is "apply"/"call", make an optimistic assumption that apply/call is not overridden and // undefer the function right here if it was defer parsed before. This is required so that the load of "apply"/"call" // happens from the same "type". Otherwise, we will have a polymorphic cache for load of "apply"/"call". - ScriptFunction *fn = ScriptFunction::FromVar(object); + ScriptFunction *fn = ScriptFunction::UnsafeFromVar(object); if (fn->GetType()->GetEntryPoint() == JavascriptFunction::DeferredParsingThunk) { JavascriptFunction::DeferredParse(&fn); @@ -891,12 +891,6 @@ namespace Js } } - if (propertyId == Js::PropertyIds::arguments) - { - fldInfoFlags = DynamicProfileInfo::MergeFldInfoFlags(fldInfoFlags, FldInfo_FromAccessor); - scriptContext->GetThreadContext()->AddImplicitCallFlags(ImplicitCall_Accessor); - } - if (!Root && operationInfo.isPolymorphic) { fldInfoFlags = DynamicProfileInfo::MergeFldInfoFlags(fldInfoFlags, FldInfo_Polymorphic); @@ -974,7 +968,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); ProfiledStFld( instance, propertyId, @@ -995,7 +989,7 @@ namespace Js const Var thisInstance) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); ProfiledStFld( instance, propertyId, @@ -1015,7 +1009,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); ProfiledStFld( instance, propertyId, @@ -1035,7 +1029,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); ProfiledStFld( instance, propertyId, @@ -1055,7 +1049,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); ProfiledStFld( instance, propertyId, @@ -1097,8 +1091,8 @@ namespace Js FldInfoFlags fldInfoFlags = FldInfo_NoInfo; if(Root || (RecyclableObject::Is(instance) && RecyclableObject::Is(thisInstance))) { - RecyclableObject *const object = RecyclableObject::FromVar(instance); - RecyclableObject *const thisObject = RecyclableObject::FromVar(thisInstance); + RecyclableObject *const object = RecyclableObject::UnsafeFromVar(instance); + RecyclableObject *const thisObject = RecyclableObject::UnsafeFromVar(thisInstance); PropertyCacheOperationInfo operationInfo; PropertyValueInfo propertyValueInfo; PropertyValueInfo::SetCacheInfo(&propertyValueInfo, functionBody, inlineCache, inlineCacheIndex, true); @@ -1203,7 +1197,7 @@ namespace Js void *const framePointer) { ScriptFunction *const scriptFunction = - ScriptFunction::FromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); + ScriptFunction::UnsafeFromVar(JavascriptCallStackLayout::FromFramePointer(framePointer)->functionObject); ProfiledInitFld( RecyclableObject::FromVar(instance), propertyId, @@ -1313,7 +1307,7 @@ namespace Js return scriptFunction->GetHasInlineCaches() - ? ScriptFunctionWithInlineCache::FromVar(scriptFunction)->GetInlineCache(inlineCacheIndex) + ? ScriptFunctionWithInlineCache::UnsafeFromVar(scriptFunction)->GetInlineCache(inlineCacheIndex) : scriptFunction->GetFunctionBody()->GetInlineCache(inlineCacheIndex); } #endif diff --git a/deps/chakrashim/core/lib/Runtime/Language/RuntimeLanguagePch.h b/deps/chakrashim/core/lib/Runtime/Language/RuntimeLanguagePch.h index e6257f10b82..031c8c8055b 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/RuntimeLanguagePch.h +++ b/deps/chakrashim/core/lib/Runtime/Language/RuntimeLanguagePch.h @@ -5,9 +5,9 @@ #pragma once #include "Parser.h" -#include "WasmReader.h" #include "Runtime.h" +#include "WasmReader.h" #include "Language/AsmJsUtils.h" #include "Language/AsmJsLink.h" @@ -51,11 +51,13 @@ #include "Language/SimdOps.h" #include "Language/SimdUtils.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DebuggingFlags.h" #include "Debug/DiagProbe.h" #include "Debug/DebugManager.h" #include "Debug/ProbeContainer.h" #include "Debug/DebugContext.h" +#endif #ifdef ENABLE_BASIC_TELEMETRY #include "ScriptContextTelemetry.h" diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4Operation.cpp b/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4Operation.cpp index 5eeac0dbe62..40ebc13f038 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4Operation.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4Operation.cpp @@ -28,14 +28,26 @@ namespace Js } // Unary Ops - bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& simd) + template + bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& val) { + SIMDValue simd = SIMDUtils::CanonicalizeToBools(val); //copy-by-value since we need to modify the copy return simd.i32[SIMD_X] || simd.i32[SIMD_Y] || simd.i32[SIMD_Z] || simd.i32[SIMD_W]; } - bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& simd) + template + bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& val) { + SIMDValue simd = SIMDUtils::CanonicalizeToBools(val); //copy-by-value since we need to modify the copy return simd.i32[SIMD_X] && simd.i32[SIMD_Y] && simd.i32[SIMD_Z] && simd.i32[SIMD_W]; } + + template bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& val); + template bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& val); + template bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& val); + // + template bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& val); + template bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& val); + template bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& val); } #endif diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4Operation.h b/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4Operation.h index 222e8bc5d67..643ff6493cc 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4Operation.h +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4Operation.h @@ -14,7 +14,9 @@ namespace Js { // Unary Ops static SIMDValue OpNot(const SIMDValue& v); + template static bool OpAnyTrue(const SIMDValue& v); + template static bool OpAllTrue(const SIMDValue& v); // Binary Ops diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4OperationX86X64.cpp b/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4OperationX86X64.cpp index 953a3fb7901..a449c105e22 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4OperationX86X64.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdBool32x4OperationX86X64.cpp @@ -24,19 +24,33 @@ namespace Js } // Unary Ops + template bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& simd) { - X86SIMDValue x86Simd = X86SIMDValue::ToX86SIMDValue(simd); + SIMDValue canonSimd = SIMDUtils::CanonicalizeToBools(simd); //copy-by-value since we need to modify the copy + X86SIMDValue x86Simd = X86SIMDValue::ToX86SIMDValue(canonSimd); int mask_8 = _mm_movemask_epi8(x86Simd.m128i_value); //latency 3, throughput 1 return mask_8 != 0; } + template bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& simd) { - X86SIMDValue x86Simd = X86SIMDValue::ToX86SIMDValue(simd); + SIMDValue canonSimd = SIMDUtils::CanonicalizeToBools(simd); //copy-by-value since we need to modify the copy + X86SIMDValue x86Simd = X86SIMDValue::ToX86SIMDValue(canonSimd); int mask_8 = _mm_movemask_epi8(x86Simd.m128i_value); //latency 3, throughput 1 return mask_8 == 0xFFFF; } + + template bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& simd); + template bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& simd); + template bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& simd); + template bool SIMDBool32x4Operation::OpAllTrue(const SIMDValue& simd); + // + template bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& simd); + template bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& simd); + template bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& simd); + template bool SIMDBool32x4Operation::OpAnyTrue(const SIMDValue& simd); } diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdFloat64x2Operation.h b/deps/chakrashim/core/lib/Runtime/Language/SimdFloat64x2Operation.h index c6a315ae8d4..de32f63ed64 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SimdFloat64x2Operation.h +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdFloat64x2Operation.h @@ -43,6 +43,7 @@ namespace Js { static SIMDValue OpGreaterThan(const SIMDValue& aValue, const SIMDValue& bValue); static SIMDValue OpGreaterThanOrEqual(const SIMDValue& aValue, const SIMDValue& bValue); static SIMDValue OpSelect(const SIMDValue& mV, const SIMDValue& tV, const SIMDValue& fV); + template static void OpConv(SIMDValue* dst, SIMDValue* src); }; } // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdFloat64x2OperationX86X64.cpp b/deps/chakrashim/core/lib/Runtime/Language/SimdFloat64x2OperationX86X64.cpp index 25f6c48101d..79808eac9c3 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SimdFloat64x2OperationX86X64.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdFloat64x2OperationX86X64.cpp @@ -318,6 +318,16 @@ namespace Js return X86SIMDValue::ToSIMDValue(x86Result); } + template + void SIMDFloat64x2Operation::OpConv(SIMDValue* dst, SIMDValue* src) + { + dst->f64[0] = (double) (T)src->i64[0]; + dst->f64[1] = (double) (T)src->i64[1]; + } + + template void SIMDFloat64x2Operation::OpConv(SIMDValue* dst, SIMDValue* src); + template void SIMDFloat64x2Operation::OpConv(SIMDValue* dst, SIMDValue* src); + } #endif diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdInt64x2Operation.cpp b/deps/chakrashim/core/lib/Runtime/Language/SimdInt64x2Operation.cpp new file mode 100644 index 00000000000..0175291dcb8 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdInt64x2Operation.cpp @@ -0,0 +1,119 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "RuntimeLanguagePch.h" + +namespace Js +{ + SIMDValue SIMDInt64x2Operation::OpSplat(int64 val) + { + SIMDValue result; + result.i64[0] = val; + result.i64[1] = val; + return result; + } + + SIMDValue SIMDInt64x2Operation::OpAdd(const SIMDValue& a, const SIMDValue& b) + { + SIMDValue result; + result.i64[0] = a.i64[0] + b.i64[0]; + result.i64[1] = a.i64[1] + b.i64[1]; + return result; + } + + SIMDValue SIMDInt64x2Operation::OpSub(const SIMDValue& a, const SIMDValue& b) + { + SIMDValue result; + result.i64[0] = a.i64[0] - b.i64[0]; + result.i64[1] = a.i64[1] - b.i64[1]; + return result; + } + + SIMDValue SIMDInt64x2Operation::OpNeg(const SIMDValue& a) + { + SIMDValue result; + result.i64[0] = -a.i64[0]; + result.i64[1] = -a.i64[1]; + return result; + } + + static bool IsInRange(double val, uint64& out) + { + if (val != val || val <= (double)0) + { + out = 0; + return false; + } + + if (val >= (double)ULLONG_MAX) + { + out = ULLONG_MAX; + return false; + } + + return true; + } + + static bool IsInRange(double val, int64& out) + { + if (val != val) + { + out = 0; + return false; + } + + if (val <= (double)LLONG_MIN) + { + out = LLONG_MIN; + return false; + } + + if (val >= (double)LLONG_MAX) + { + out = LLONG_MAX; + return false; + } + + return true; + } + + template + void SIMDInt64x2Operation::OpTrunc(SIMDValue* dst, SIMDValue* src) + { + T convertedVal; + dst->i64[0] = IsInRange(src->f64[0], convertedVal) ? (T)src->f64[0] : convertedVal; + dst->i64[1] = IsInRange(src->f64[1], convertedVal) ? (T)src->f64[1] : convertedVal; + } + + template void SIMDInt64x2Operation::OpTrunc(SIMDValue* dst, SIMDValue* src); + template void SIMDInt64x2Operation::OpTrunc(SIMDValue* dst, SIMDValue* src); + + void SIMDInt64x2Operation::OpShiftLeftByScalar(SIMDValue* dst, SIMDValue* src, int count) + { + count = count & SIMDUtils::SIMDGetShiftAmountMask(8); + dst->i64[0] = src->i64[0] << count; + dst->i64[1] = src->i64[1] << count; + } + + void SIMDInt64x2Operation::OpShiftRightByScalar(SIMDValue* dst, SIMDValue* src, int count) + { + count = count & SIMDUtils::SIMDGetShiftAmountMask(8); + dst->i64[0] = src->i64[0] >> count; + dst->i64[1] = src->i64[1] >> count; + } + + void SIMDInt64x2Operation::OpShiftRightByScalarU(SIMDValue* dst, SIMDValue* src, int count) + { + count = count & SIMDUtils::SIMDGetShiftAmountMask(8); + dst->i64[0] = (uint64)src->i64[0] >> count; + dst->i64[1] = (uint64)src->i64[1] >> count; + } + + void SIMDInt64x2Operation::OpReplaceLane(SIMDValue* dst, SIMDValue* src, int64 val, uint index) + { + dst->SetValue(*src); + dst->i64[index] = val; + } +} diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdInt64x2Operation.h b/deps/chakrashim/core/lib/Runtime/Language/SimdInt64x2Operation.h new file mode 100644 index 00000000000..3f9b08de0cb --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdInt64x2Operation.h @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once + +namespace Js { + + struct SIMDInt64x2Operation + { + static SIMDValue OpSplat(int64 x); + static SIMDValue OpAdd(const SIMDValue& a, const SIMDValue& b); + static SIMDValue OpSub(const SIMDValue& a, const SIMDValue& b); + static SIMDValue OpNeg(const SIMDValue& a); + + //These are directly called into from JIT as of now. Pointer-based arguments are used to ensure + //that calling conventions are consistent across x86/x64 and match call sequences JIT generates. + //TODO: Change back to "const SIMDValue& a" after getting rid of the jit helpers. + template static void OpTrunc(SIMDValue* dst, SIMDValue* src); + static void OpShiftLeftByScalar(SIMDValue* dst, SIMDValue* src, int count); + static void OpShiftRightByScalar(SIMDValue* dst, SIMDValue* src, int count); + static void OpShiftRightByScalarU(SIMDValue* dst, SIMDValue* src, int count); + static void OpReplaceLane(SIMDValue* dst, SIMDValue* src, int64 val, uint index); + }; + +} // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdOps.h b/deps/chakrashim/core/lib/Runtime/Language/SimdOps.h index f5a3deff7dc..7e08fd37c17 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SimdOps.h +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdOps.h @@ -16,3 +16,4 @@ #include "Language/SimdBool32x4Operation.h" #include "Language/SimdBool16x8Operation.h" #include "Language/SimdBool8x16Operation.h" +#include "Language/SimdInt64x2Operation.h" diff --git a/deps/chakrashim/core/lib/Runtime/Language/SimdUtils.h b/deps/chakrashim/core/lib/Runtime/Language/SimdUtils.h index dc991d231a1..5ef8df84004 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SimdUtils.h +++ b/deps/chakrashim/core/lib/Runtime/Language/SimdUtils.h @@ -28,7 +28,8 @@ Field(uint16) u16[8];\ Field(uint8) u8[16];\ Field(float) f32[4];\ - Field(double) f64[2]; + Field(double) f64[2]; \ + Field(int64) i64[2]; #define SIMD_TEMP_SIZE 3 struct _SIMDValue { @@ -146,7 +147,7 @@ const _x86_SIMDValue X86_4LANES_MASKS[] = {{ 0xffffffff, 0x00000000, 0x00000 #pragma warning(pop) -#if ENABLE_NATIVE_CODEGEN && defined(ENABLE_SIMDJS) +#if ENABLE_NATIVE_CODEGEN && (defined(ENABLE_SIMDJS) || defined(ENABLE_WASM_SIMD)) // auxiliary SIMD values in memory to help JIT'ed code. E.g. used for Int8x16 shuffle. extern _x86_SIMDValue X86_TEMP_SIMD[]; #endif @@ -225,29 +226,79 @@ namespace Js { //////////////////////////////////////////// static inline SIMDValue SIMD128InnerReplaceLaneF4(SIMDValue simdVal, const uint32 lane, const float value) { + Assert(lane < 4); simdVal.f32[lane] = value; return simdVal; }; + static inline SIMDValue SIMD128InnerReplaceLaneD2(SIMDValue simdVal, const uint32 lane, const double value) + { + Assert(lane < 2); + simdVal.f64[lane] = value; + return simdVal; + }; + + static inline SIMDValue SIMD128InnerReplaceLaneI2(SIMDValue simdVal, const uint32 lane, const int64 value) + { + Assert(lane < 2); + simdVal.i64[lane] = value; + return simdVal; + }; static inline SIMDValue SIMD128InnerReplaceLaneI4(SIMDValue simdVal, const uint32 lane, const int32 value) { + Assert(lane < 4); simdVal.i32[lane] = value; return simdVal; }; static inline SIMDValue SIMD128InnerReplaceLaneI8(SIMDValue simdVal, const uint32 lane, const int16 value) { + Assert(lane < 8); simdVal.i16[lane] = value; return simdVal; }; static inline SIMDValue SIMD128InnerReplaceLaneI16(SIMDValue simdVal, const uint32 lane, const int8 value) { + Assert(lane < 16); simdVal.i8[lane] = value; return simdVal; }; - static inline float SIMD128InnerExtractLaneF4(const SIMDValue src1, const uint32 lane) { return src1.f32[lane]; }; - static inline int32 SIMD128InnerExtractLaneI4(const SIMDValue src1, const uint32 lane) { return src1.i32[lane]; }; - static inline int16 SIMD128InnerExtractLaneI8(const SIMDValue src1, const uint32 lane) { return src1.i16[lane]; }; - static inline int8 SIMD128InnerExtractLaneI16(const SIMDValue src1, const uint32 lane) { return src1.i8[lane]; }; + static inline int32 SIMD128InnerExtractLaneB4(const SIMDValue src1, const uint32 lane) + { + Assert(lane < 4); + int val = SIMD128InnerExtractLaneI4(src1, lane); + return val ? 1 : 0; + }; + + static inline int16 SIMD128InnerExtractLaneB8(const SIMDValue src1, const uint32 lane) + { + Assert(lane < 8); + int16 val = SIMD128InnerExtractLaneI8(src1, lane); + return val ? 1 : 0; + }; + + static inline int8 SIMD128InnerExtractLaneB16(const SIMDValue src1, const uint32 lane) + { + Assert(lane < 16); + int8 val = SIMD128InnerExtractLaneI16(src1, lane); + return val ? 1 : 0; + }; + + static inline double SIMD128InnerExtractLaneD2(const SIMDValue src1, const uint32 lane) { Assert(lane < 2); return src1.f64[lane]; }; + static inline float SIMD128InnerExtractLaneF4(const SIMDValue src1, const uint32 lane) { Assert(lane < 4); return src1.f32[lane]; }; + static inline int64 SIMD128InnerExtractLaneI2(const SIMDValue src1, const uint32 lane) { Assert(lane < 2); return src1.i64[lane]; }; + static inline int32 SIMD128InnerExtractLaneI4(const SIMDValue src1, const uint32 lane) { Assert(lane < 4); return src1.i32[lane]; }; + static inline int16 SIMD128InnerExtractLaneI8(const SIMDValue src1, const uint32 lane) { Assert(lane < 8); return src1.i16[lane]; }; + static inline int8 SIMD128InnerExtractLaneI16(const SIMDValue src1, const uint32 lane) { Assert(lane < 16); return src1.i8[lane]; }; + + static inline SIMDValue SIMD128BitSelect(const SIMDValue src1, const SIMDValue src2, const SIMDValue mask) + { + SIMDValue res{ 0 }; + res.i32[0] = (src1.i32[0] & mask.i32[0]) | (src2.i32[0] & ~mask.i32[0]); + res.i32[1] = (src1.i32[1] & mask.i32[1]) | (src2.i32[1] & ~mask.i32[1]); + res.i32[2] = (src1.i32[2] & mask.i32[2]) | (src2.i32[2] & ~mask.i32[2]); + res.i32[3] = (src1.i32[3] & mask.i32[3]) | (src2.i32[3] & ~mask.i32[3]); + return res; + } template static inline T SIMD128ExtractLane(const Var src, const Var lane, ScriptContext* scriptContext) @@ -311,6 +362,27 @@ namespace Js { return SIMDType::New(&result, scriptContext); } + template + static SIMDValue CanonicalizeToBools(SIMDValue val) + { +#ifdef ENABLE_WASM_SIMD + + CompileAssert(sizeof(T) <= sizeof(SIMDValue)); + CompileAssert(sizeof(SIMDValue) % sizeof(T) == 0); + T* cursor = (T*)val.i8; + const uint maxBytes = 16; + uint size = maxBytes / sizeof(T); + + for (uint i = 0; i < size; i++) + { + cursor[i] = cursor[i] ? (T) -1 : 0; + } + return val; +#else + return val; +#endif + } + template static void SIMD128TypedArrayStore(Var arg1, Var arg2, Var simdVar, uint32 dataWidth, ScriptContext *scriptContext) { diff --git a/deps/chakrashim/core/lib/Runtime/Language/SourceDynamicProfileManager.cpp b/deps/chakrashim/core/lib/Runtime/Language/SourceDynamicProfileManager.cpp index 65f1134edca..42678d60768 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SourceDynamicProfileManager.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/SourceDynamicProfileManager.cpp @@ -52,6 +52,14 @@ namespace Js dynamicProfileInfoMap.Item(functionId, dynamicProfileInfo); } + void SourceDynamicProfileManager::RemoveDynamicProfileInfo(LocalFunctionId functionId) + { + dynamicProfileInfoMap.Remove(functionId); +#ifdef DYNAMIC_PROFILE_STORAGE + dynamicProfileInfoMapSaving.Remove(functionId); +#endif + } + void SourceDynamicProfileManager::MarkAsExecuted(LocalFunctionId functionId) { Assert(startupFunctions != nullptr); diff --git a/deps/chakrashim/core/lib/Runtime/Language/SourceDynamicProfileManager.h b/deps/chakrashim/core/lib/Runtime/Language/SourceDynamicProfileManager.h index c9ce78a558e..6f40c8dcf93 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SourceDynamicProfileManager.h +++ b/deps/chakrashim/core/lib/Runtime/Language/SourceDynamicProfileManager.h @@ -33,6 +33,7 @@ namespace Js DynamicProfileInfo * GetDynamicProfileInfo(FunctionBody * functionBody); Recycler* GetRecycler() { return recycler; } void UpdateDynamicProfileInfo(LocalFunctionId functionId, DynamicProfileInfo * dynamicProfileInfo); + void RemoveDynamicProfileInfo(LocalFunctionId functionId); void MarkAsExecuted(LocalFunctionId functionId); static SourceDynamicProfileManager * LoadFromDynamicProfileStorage(SourceContextInfo* info, ScriptContext* scriptContext, IActiveScriptDataCache* profileDataCache); void EnsureStartupFunctions(uint numberOfFunctions); diff --git a/deps/chakrashim/core/lib/Runtime/Language/SourceTextModuleRecord.cpp b/deps/chakrashim/core/lib/Runtime/Language/SourceTextModuleRecord.cpp index 09a7333fdbd..682c343f978 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SourceTextModuleRecord.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/SourceTextModuleRecord.cpp @@ -31,6 +31,7 @@ namespace Js localExportMapByLocalName(nullptr), localExportIndexList(nullptr), normalizedSpecifier(nullptr), + moduleUrl(nullptr), errorObject(nullptr), hostDefined(nullptr), exportedNames(nullptr), @@ -179,7 +180,12 @@ namespace Js { if (*exceptionVar == nullptr) { - *exceptionVar = JavascriptError::CreateFromCompileScriptException(scriptContext, &se); + const WCHAR * sourceUrl = nullptr; + if (this->GetModuleUrl()) + { + sourceUrl = this->GetModuleUrlSz(); + } + *exceptionVar = JavascriptError::CreateFromCompileScriptException(scriptContext, &se, sourceUrl); } if (this->parser) { @@ -322,7 +328,7 @@ namespace Js OUTPUT_TRACE_DEBUGONLY(Js::ModulePhase, _u("\t>NotifyParentsAsNeeded\n")); NotifyParentsAsNeeded(); - if (!WasDeclarationInitialized() && isRootModule) + if (!WasDeclarationInitialized() && (isRootModule || this->promise != nullptr)) { // TODO: move this as a promise call? if parser is called from a different thread // We'll need to call the bytecode gen in the main thread as we are accessing GC. @@ -846,14 +852,21 @@ namespace Js this->rootFunction = scriptContext->GenerateRootFunction(parseTree, sourceIndex, this->parser, this->pSourceInfo->GetParseFlags(), &se, _u("module")); if (rootFunction == nullptr) { - this->errorObject = JavascriptError::CreateFromCompileScriptException(scriptContext, &se); + const WCHAR * sourceUrl = nullptr; + if (this->GetModuleUrl()) + { + sourceUrl = this->GetModuleUrlSz(); + } + this->errorObject = JavascriptError::CreateFromCompileScriptException(scriptContext, &se, sourceUrl); OUTPUT_TRACE_DEBUGONLY(Js::ModulePhase, _u("\t>NotifyParentAsNeeded rootFunction == nullptr\n")); NotifyParentsAsNeeded(); } +#ifdef ENABLE_SCRIPT_DEBUGGING else { scriptContext->GetDebugContext()->RegisterFunction(this->rootFunction->GetFunctionBody(), nullptr); } +#endif } Var SourceTextModuleRecord::ModuleEvaluation() @@ -1195,4 +1208,4 @@ namespace Js return promise; } -} \ No newline at end of file +} diff --git a/deps/chakrashim/core/lib/Runtime/Language/SourceTextModuleRecord.h b/deps/chakrashim/core/lib/Runtime/Language/SourceTextModuleRecord.h index 245343a79cf..afcccaf34e3 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/SourceTextModuleRecord.h +++ b/deps/chakrashim/core/lib/Runtime/Language/SourceTextModuleRecord.h @@ -50,6 +50,10 @@ namespace Js Var GetSpecifier() const { return normalizedSpecifier; } const char16 *GetSpecifierSz() const { return JavascriptString::FromVar(this->normalizedSpecifier)->GetSz(); } + void SetModuleUrl(Var moduleUrl) { this->moduleUrl = moduleUrl; } + Var GetModuleUrl() const { return moduleUrl;} + const char16 *GetModuleUrlSz() const { return JavascriptString::FromVar(this->moduleUrl)->GetSz(); } + Var GetErrorObject() const { return errorObject; } bool WasParsed() const { return wasParsed; } @@ -137,6 +141,7 @@ namespace Js Field(Js::JavascriptFunction*) rootFunction; Field(void*) hostDefined; + Field(Var) moduleUrl; Field(Var) normalizedSpecifier; Field(Var) errorObject; Field(Field(Var)*) localExportSlots; diff --git a/deps/chakrashim/core/lib/Runtime/Language/StackTraceArguments.cpp b/deps/chakrashim/core/lib/Runtime/Language/StackTraceArguments.cpp index a3b06192dbd..b626213bf0c 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/StackTraceArguments.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/StackTraceArguments.cpp @@ -71,12 +71,6 @@ namespace Js { const CallInfo callInfo = walker.GetCallInfo(); int64 numberOfArguments = callInfo.Count; if (numberOfArguments > 0) numberOfArguments --; // Don't consider 'this' - if (callInfo.Flags & Js::CallFlags_ExtraArg) - { - Assert(numberOfArguments > 0 ); - // skip the last FrameDisplay argument. - numberOfArguments--; - } for (int64 j = 0; j < numberOfArguments && j < MaxNumberOfDisplayedArgumentsInStack; j ++) { types |= ObjectToTypeCode(walker.GetJavascriptArgs()[j]) << 3*j; // maximal code is 7, so we can use 3 bits to store it diff --git a/deps/chakrashim/core/lib/Runtime/Language/TaggedInt.cpp b/deps/chakrashim/core/lib/Runtime/Language/TaggedInt.cpp index ee8c09a4f23..9ba83ce3ecc 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/TaggedInt.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/TaggedInt.cpp @@ -436,7 +436,7 @@ namespace Js // fills the buffer from the end and returns the start index int TaggedInt::UnsignedToString(unsigned __int64 value, char16 *buffer, int bufferSize) { - static_assert(sizeof(unsigned long) <= 8, "This method may not support the target architecture"); + static_assert(sizeof(value) <= 8, "This method may not support the target architecture"); AssertMsg(bufferSize >= 22, "Error: bufferSize is too small. value may not be represented properly"); buffer[bufferSize - 1] = char16(0); @@ -472,7 +472,7 @@ namespace Js int TaggedInt::SignedToString(__int64 value, char16 *buffer, int bufferSize) { bool neg = value < 0; - unsigned long val = (unsigned long) (neg ? -1 * value : value); + unsigned __int64 val = (unsigned __int64) (neg ? -1 * value : value); int pos = UnsignedToString(val, buffer, bufferSize); if (neg) buffer[--pos] = _u('-'); return pos; diff --git a/deps/chakrashim/core/lib/Runtime/Language/ValueType.cpp b/deps/chakrashim/core/lib/Runtime/Language/ValueType.cpp index aa90004056f..27ad1a6567b 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/ValueType.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/ValueType.cpp @@ -311,6 +311,13 @@ bool ValueType::IsFloat() const )); } +bool ValueType::IsNotFloat() const +{ + return + AnyOnExcept(Bits::Likely | Bits::Object | Bits::CanBeTaggedValue | Bits::Float | Bits::Number) || + OneOnOneOff(Bits::Object, Bits::Likely); +} + bool ValueType::IsLikelyFloat() const { return @@ -503,6 +510,15 @@ bool ValueType::IsLikelyPrimitive() const return result; } +#if DBG +bool ValueType::IsSimilar(ValueType v) const +{ + // Remove bits we don't care for comparison + ValueType left = Verify(bits & ~(Bits::NoMissingValues | Bits::CanBeTaggedValue | Bits::Likely)); + ValueType right = Verify(v.bits & ~(Bits::NoMissingValues | Bits::CanBeTaggedValue | Bits::Likely)); + return left == right; +} +#endif bool ValueType::HasBeenObject() const { @@ -760,6 +776,8 @@ bool ValueType::IsSimd128(IRType type) const return IsSimd128Uint8x16(); case TySimd128D2: return IsSimd128Float64x2(); + case TySimd128I2: + return IsSimd128Int64x2(); default: Assert(UNREACHED); return false; @@ -806,6 +824,12 @@ bool ValueType::IsSimd128Float64x2() const return IsObject() && GetObjectType() == ObjectType::Simd128Float64x2; } +bool ValueType::IsSimd128Int64x2() const +{ + return IsObject() && GetObjectType() == ObjectType::Simd128Int64x2; +} + + bool ValueType::IsLikelySimd128() const { return IsLikelyObject() && (GetObjectType() >= ObjectType::Simd128Float32x4 && GetObjectType() <= ObjectType::Simd128Float64x2); @@ -845,6 +869,11 @@ bool ValueType::IsLikelySimd128Float64x2() const { return IsLikelyObject() && GetObjectType() == ObjectType::Simd128Float64x2; } + +bool ValueType::IsLikelySimd128Int64x2() const +{ + return IsLikelyObject() && GetObjectType() == ObjectType::Simd128Int64x2; +} #endif ObjectType ValueType::GetObjectType() const @@ -1210,7 +1239,7 @@ ValueType ValueType::Merge(const Js::Var var) const ? GetInt(false) : ValueType::Float); } - return Merge(FromObject(RecyclableObject::FromVar(var))); + return Merge(FromObject(RecyclableObject::UnsafeFromVar(var))); } ValueType::Bits ValueType::TypeIdToBits[Js::TypeIds_Limit]; diff --git a/deps/chakrashim/core/lib/Runtime/Language/ValueType.h b/deps/chakrashim/core/lib/Runtime/Language/ValueType.h index 431867a9b12..cefbb059617 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/ValueType.h +++ b/deps/chakrashim/core/lib/Runtime/Language/ValueType.h @@ -126,6 +126,7 @@ class ValueType bool HasBeenFloat() const; bool IsFloat() const; + bool IsNotFloat() const; bool IsLikelyFloat() const; bool HasBeenNumber() const; @@ -167,6 +168,10 @@ class ValueType bool IsPrimitive() const; bool IsLikelyPrimitive() const; +#if DBG + bool IsSimilar(ValueType v) const; +#endif + #if ENABLE_NATIVE_CODEGEN // SIMD_JS bool IsSimd128() const; @@ -179,6 +184,7 @@ class ValueType bool IsSimd128Uint16x8() const; bool IsSimd128Uint8x16() const; bool IsSimd128Float64x2() const; + bool IsSimd128Int64x2() const; bool IsLikelySimd128() const; @@ -189,6 +195,7 @@ class ValueType bool IsLikelySimd128Uint16x8() const; bool IsLikelySimd128Uint8x16() const; bool IsLikelySimd128Float64x2() const; + bool IsLikelySimd128Int64x2() const; #endif bool HasBeenObject() const; diff --git a/deps/chakrashim/core/lib/Runtime/Language/ValueTypes.h b/deps/chakrashim/core/lib/Runtime/Language/ValueTypes.h index af7619ef16b..39ba4648f3e 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/ValueTypes.h +++ b/deps/chakrashim/core/lib/Runtime/Language/ValueTypes.h @@ -121,6 +121,7 @@ OBJECT_TYPE(Simd128Uint8x16 ) OBJECT_TYPE(Simd128Bool32x4 ) OBJECT_TYPE(Simd128Bool16x8 ) OBJECT_TYPE(Simd128Bool8x16 ) +OBJECT_TYPE(Simd128Int64x2 ) OBJECT_TYPE(Simd128Float64x2 ) // !! This is a marker for last SIMD type. Insert new SIMD types above. diff --git a/deps/chakrashim/core/lib/Runtime/Language/WAsmjsUtils.cpp b/deps/chakrashim/core/lib/Runtime/Language/WAsmjsUtils.cpp index 12861b46c7f..2f35539d4ad 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/WAsmjsUtils.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/WAsmjsUtils.cpp @@ -96,28 +96,37 @@ template<> Types RegisterSpace::GetRegisterSpaceType(){return WA bool ShouldJitFunction(Js::FunctionBody* body, uint interpretedCount) { #if ENABLE_NATIVE_CODEGEN - const bool noJit = PHASE_OFF(Js::BackEndPhase, body) || + if (PHASE_OFF(Js::BackEndPhase, body) || PHASE_OFF(Js::FullJitPhase, body) || body->GetScriptContext()->GetConfig()->IsNoNative() || - body->GetIsAsmJsFullJitScheduled(); + body->GetIsAsmJsFullJitScheduled()) + { + return false; + } +#if ENABLE_OOP_NATIVE_CODEGEN + if (JITManager::GetJITManager()->IsOOPJITEnabled() && !JITManager::GetJITManager()->IsConnected()) + { + return false; + } +#endif const bool forceNative = CONFIG_ISENABLED(Js::ForceNativeFlag); const uint minAsmJsInterpretRunCount = (uint)CONFIG_FLAG(MinAsmJsInterpreterRunCount); const uint maxAsmJsInterpretRunCount = (uint)CONFIG_FLAG(MaxAsmJsInterpreterRunCount); - return !noJit && (forceNative || interpretedCount >= minAsmJsInterpretRunCount || interpretedCount >= maxAsmJsInterpretRunCount); + return forceNative || interpretedCount >= minAsmJsInterpretRunCount || interpretedCount >= maxAsmJsInterpretRunCount; #else return false; #endif } - uint32 ConvertOffset(uint32 ptr, uint32 fromSize, uint32 toSize) + uint32 ConvertOffset(uint32 offset, uint32 fromSize, uint32 toSize) { if (fromSize == toSize) { - return ptr; + return offset; } - uint64 tmp = ptr * fromSize; + uint64 tmp = (uint64)offset * (uint64)fromSize; tmp = Math::Align(tmp, toSize); - tmp /= toSize; + tmp /= (uint64)toSize; if (tmp > (uint64)UINT32_MAX) { Math::DefaultOverflowPolicy(); @@ -283,8 +292,8 @@ template<> Types RegisterSpace::GetRegisterSpaceType(){return WA // These bytes offset already calculated the alignment, used them to determine how many Js::Var we need to do the allocation uint32 stackByteSize = offset; uint32 bytesUsedForConst = constSourcesInfo.bytesUsed; - uint32 jsVarUsedForConstsTable = ConvertToJsVarOffset(bytesUsedForConst); - uint32 totalVarsNeeded = ConvertToJsVarOffset(stackByteSize); + uint32 jsVarUsedForConstsTable = ConvertOffset(bytesUsedForConst); + uint32 totalVarsNeeded = ConvertOffset(stackByteSize); uint32 jsVarNeededForVars = totalVarsNeeded - jsVarUsedForConstsTable; if (totalVarsNeeded < jsVarUsedForConstsTable) @@ -313,7 +322,7 @@ template<> Types RegisterSpace::GetRegisterSpaceType(){return WA // this value is the number of Var slots needed to allocate all the const uint32 bytesUsedForConst = GetConstSourceInfos().bytesUsed; // Add the registers not included in the const table - uint32 nbConst = ConvertToJsVarOffset(bytesUsedForConst) + Js::FunctionBody::FirstRegSlot; + uint32 nbConst = ConvertOffset(bytesUsedForConst) + Js::FunctionBody::FirstRegSlot; body->CheckAndSetConstantCount(nbConst); } diff --git a/deps/chakrashim/core/lib/Runtime/Language/WAsmjsUtils.h b/deps/chakrashim/core/lib/Runtime/Language/WAsmjsUtils.h index 7fb2b186bda..afc5bf0f57c 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/WAsmjsUtils.h +++ b/deps/chakrashim/core/lib/Runtime/Language/WAsmjsUtils.h @@ -34,22 +34,14 @@ namespace WAsmJs typedef Js::RegSlot RegSlot; - uint32 ConvertOffset(uint32 ptr, uint32 fromSize, uint32 toSize); - template uint32 ConvertOffset(uint32 ptr, uint32 fromSize) + uint32 ConvertOffset(uint32 offset, uint32 fromSize, uint32 toSize); + template uint32 ConvertOffset(uint32 offset, uint32 fromSize) { - return ConvertOffset(ptr, fromSize, sizeof(ToType)); + return ConvertOffset(offset, fromSize, sizeof(ToType)); } - template uint32 ConvertOffset(uint32 ptr) + template uint32 ConvertOffset(uint32 offset) { - return ConvertOffset(ptr, sizeof(FromType), sizeof(ToType)); - } - template uint32 ConvertToJsVarOffset(uint32 ptr) - { - return ConvertOffset(ptr); - } - template uint32 ConvertFromJsVarOffset(uint32 ptr) - { - return ConvertOffset(ptr); + return ConvertOffset(offset, sizeof(FromType)); } struct EmitInfoBase @@ -148,6 +140,13 @@ namespace WAsmJs return mNextLocation++; } + RegSlot PeekNextTmpRegister() + { + // Make sure this function is called correctly + Assert(mNextLocation <= mRegisterCount && mNextLocation >= mFirstTmpReg); + return mNextLocation; + } + // Release a location for a temporary register, must be the last location acquired void ReleaseTmpRegister( RegSlot tmpReg ) { diff --git a/deps/chakrashim/core/lib/Runtime/Language/amd64/amd64_Thunks.S b/deps/chakrashim/core/lib/Runtime/Language/amd64/amd64_Thunks.S index f416105b9d9..e2e3e414640 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/amd64/amd64_Thunks.S +++ b/deps/chakrashim/core/lib/Runtime/Language/amd64/amd64_Thunks.S @@ -62,21 +62,7 @@ NESTED_ENTRY _ZN2Js21InterpreterStackFrame33AsmJsDelayDynamicInterpreterThunkEPN push r8 push r9 - sub rsp, 40h - - // spill potential floating point arguments to stack - movaps xmmword ptr [rsp + 00h], xmm0 - movaps xmmword ptr [rsp + 10h], xmm1 - movaps xmmword ptr [rsp + 20h], xmm2 - movaps xmmword ptr [rsp + 30h], xmm3 call C_FUNC(_ZN2Js21InterpreterStackFrame29EnsureDynamicInterpreterThunkEPNS_14ScriptFunctionE) - // restore potential floating point arguments from stack - movaps xmm0, xmmword ptr [rsp + 00h] - movaps xmm1, xmmword ptr [rsp + 10h] - movaps xmm2, xmmword ptr [rsp + 20h] - movaps xmm3, xmmword ptr [rsp + 30h] - - add rsp, 40h pop r9 pop r8 @@ -190,13 +176,6 @@ NESTED_ENTRY _ZN2Js21InterpreterStackFrame19InterpreterAsmThunkEPNS_20AsmJsCallS set_cfa_register rbp, (2*8) // Set to compute CFA as: rbp + 16 (sizeof: [rbp] [ReturnAddress]) - sub rsp, 40h - - // spill potential floating point arguments to stack - movaps xmmword ptr [rsp + 00h], xmm0 - movaps xmmword ptr [rsp + 10h], xmm1 - movaps xmmword ptr [rsp + 20h], xmm2 - movaps xmmword ptr [rsp + 30h], xmm3 // save argument registers used by custom calling convention push rdi @@ -210,7 +189,6 @@ NESTED_ENTRY _ZN2Js21InterpreterStackFrame19InterpreterAsmThunkEPNS_20AsmJsCallS call rax // call appropriate template - add rsp, 40h pop_nonvol_reg rbp ret NESTED_END _ZN2Js21InterpreterStackFrame19InterpreterAsmThunkEPNS_20AsmJsCallStackLayoutE, _TEXT @@ -260,64 +238,8 @@ NESTED_ENTRY _ZN2Js23AsmJsExternalEntryPointEPNS_16RecyclableObjectENS_8CallInfo call C_FUNC(_ZN2Js19UnboxAsmJsArgumentsEPNS_14ScriptFunctionEPPvPcNS_8CallInfoE) // rax = target function address - // move first 4 arguments into registers. - // don't know types other than arg0 (which is ScriptFunction *), so put in both xmm and general purpose registers mov rdi, r12 // arg0: func - // int GetArgsSizesArray(ScriptFunction* func) - // get args sizes of target asmjs function - // rdi has ScriptFunction* - push r13 - push rax - push rdi - sub rsp, 8h - call C_FUNC(_ZN2Js17GetArgsSizesArrayEPNS_14ScriptFunctionE) - mov r13, rax // r13: arg size - add rsp, 8h - pop rdi - pop rax - - // NOTE: Below xmm usage is non-standard. - - // Move 3 args to regs per convention. rdi already has first arg: ScriptFunction* - push r12 - // r12->unboxed args - lea r12, [rsp + 18h] // rsp + size of(r12 + r13 + ScriptFunction*) - - // r13 is arg size - cmp dword ptr [r13], 10h - je SIMDArg2 - mov rsi, [r12] // arg1 - movq xmm1, qword ptr [r12] // arg1 - add r12, 8h - jmp Arg3 - SIMDArg2: - movups xmm1, xmmword ptr[r12] - add r12, 10h - Arg3: - cmp dword ptr [r13 + 4h], 10h - je SIMDArg3 - mov rdx, [r12] // arg2 - movq xmm2, qword ptr [r12] // arg2 - add r12, 8h - jmp Arg4 - SIMDArg3: - movups xmm2, xmmword ptr[r12] - add r12, 10h - Arg4: - cmp dword ptr [r13 + 8h], 10h - je SIMDArg4 - mov rcx, [r12] // arg3 - movq xmm3, qword ptr [r12] // arg3 - jmp ArgsDone - SIMDArg4: - movups xmm3, xmmword ptr [r12] - - ArgsDone: - pop r12 // r12: func - pop r13 // r13: orig stack pointer - - // "home" arg0. other args were read from stack and already homed. mov [rsp + 00h], rdi // call entry point @@ -369,9 +291,8 @@ NESTED_ENTRY _ZN2Js11WasmLibrary30WasmDeferredParseExternalThunkEPNS_16Recyclabl push r8 push r9 - lea rdi, [rbp + 10h] mov rsi, 0 - call C_FUNC(_ZN2Js11WasmLibrary27WasmDeferredParseEntryPointEPPNS_19AsmJsScriptFunctionEi) + call C_FUNC(_ZN2Js11WasmLibrary27WasmDeferredParseEntryPointEPNS_19AsmJsScriptFunctionEi) pop r9 pop r8 @@ -404,11 +325,8 @@ NESTED_ENTRY _ZN2Js11WasmLibrary30WasmDeferredParseInternalThunkEPNS_16Recyclabl push r8 push r9 - - lea rdi, [rbp + 10h] mov rsi, 1 - call C_FUNC(_ZN2Js11WasmLibrary27WasmDeferredParseEntryPointEPPNS_19AsmJsScriptFunctionEi) - + call C_FUNC(_ZN2Js11WasmLibrary27WasmDeferredParseEntryPointEPNS_19AsmJsScriptFunctionEi) pop r9 pop r8 diff --git a/deps/chakrashim/core/lib/Runtime/Language/amd64/amd64_Thunks.asm b/deps/chakrashim/core/lib/Runtime/Language/amd64/amd64_Thunks.asm index f219bfcd8e0..bbe8e69f9a2 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/amd64/amd64_Thunks.asm +++ b/deps/chakrashim/core/lib/Runtime/Language/amd64/amd64_Thunks.asm @@ -457,7 +457,7 @@ endif ;;============================================================================================================ ;; JavascriptMethod WasmLibrary::WasmDeferredParseEntryPoint(AsmJsScriptFunction** funcPtr, int internalCall); -extrn ?WasmDeferredParseEntryPoint@WasmLibrary@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAPEAVAsmJsScriptFunction@2@H@Z : PROC +extrn ?WasmDeferredParseEntryPoint@WasmLibrary@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAVAsmJsScriptFunction@2@H@Z : PROC ;; Var WasmLibrary::WasmDeferredParseExternalThunk(RecyclableObject* function, CallInfo callInfo, ...) align 16 @@ -475,16 +475,14 @@ align 16 .endprolog sub rsp, 20h - lea rcx, [rsp + 30h] mov rdx, 0 - call ?WasmDeferredParseEntryPoint@WasmLibrary@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAPEAVAsmJsScriptFunction@2@H@Z + call ?WasmDeferredParseEntryPoint@WasmLibrary@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAVAsmJsScriptFunction@2@H@Z ifdef _CONTROL_FLOW_GUARD mov rcx, rax ; __guard_check_icall_fptr requires the call target in rcx. call [__guard_check_icall_fptr] ; verify that the call target is valid mov rax, rcx ;restore call target endif - add rsp, 20h lea rsp, [rbp] pop rbp @@ -505,7 +503,7 @@ endif ;;============================================================================================================ ;; JavascriptMethod WasmLibrary::WasmDeferredParseEntryPoint(AsmJsScriptFunction** funcPtr, int internalCall); -extrn ?WasmDeferredParseEntryPoint@WasmLibrary@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAPEAVAsmJsScriptFunction@2@H@Z : PROC +extrn ?WasmDeferredParseEntryPoint@WasmLibrary@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAVAsmJsScriptFunction@2@H@Z : PROC ;; Var WasmLibrary::WasmDeferredParseInternalThunk(RecyclableObject* function, CallInfo callInfo, ...) align 16 @@ -528,22 +526,18 @@ align 16 movaps xmmword ptr [rsp + 30h], xmm1 movaps xmmword ptr [rsp + 40h], xmm2 movaps xmmword ptr [rsp + 50h], xmm3 - - lea rcx, [rsp + 70h] mov rdx, 1 - call ?WasmDeferredParseEntryPoint@WasmLibrary@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAPEAVAsmJsScriptFunction@2@H@Z + call ?WasmDeferredParseEntryPoint@WasmLibrary@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAVAsmJsScriptFunction@2@H@Z ifdef _CONTROL_FLOW_GUARD mov rcx, rax ; __guard_check_icall_fptr requires the call target in rcx. call [__guard_check_icall_fptr] ; verify that the call target is valid mov rax, rcx ;restore call target endif - ; restore potential floating point arguments from stack movaps xmm1, xmmword ptr [rsp + 30h] movaps xmm2, xmmword ptr [rsp + 40h] movaps xmm3, xmmword ptr [rsp + 50h] - add rsp, 60h lea rsp, [rbp] pop rbp diff --git a/deps/chakrashim/core/lib/Runtime/Language/arm64/arm64_CallEhFrame.asm b/deps/chakrashim/core/lib/Runtime/Language/arm64/arm64_CallEhFrame.asm index baeb1bfea88..54bc267fe9f 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/arm64/arm64_CallEhFrame.asm +++ b/deps/chakrashim/core/lib/Runtime/Language/arm64/arm64_CallEhFrame.asm @@ -51,56 +51,67 @@ TTL Lib\Common\arm\arm64_CallEhFrame.asm - IMPORT __chkstk + IMPORT __chkstk EXPORT arm64_CallEhFrame + EXPORT arm64_CallCatch - TEXTAREA - - NESTED_ENTRY arm64_CallEhFrame + MACRO + STANDARD_PROLOG + + ; + ; Generate a prolog that will match the original function's, with all + ; parameters homed and all non-volatile registers saved: + ; + ; Size Offset + ; ---- ------ + ; 64 176 Homed parameters + ; 16 160 Saved FP/LR + ; 16 144 ArgOut / stack function list + ; 80 64 Saved x19-x28 + ; 64 0 Saved d8-d15 + ; = 240 total + ; + ; The try/catch/finally blocks will jump to the epilog code skipping + ; the instruction that deallocates the locals, in order to allow these + ; thunks to skip re-allocating locals space. + ; ; Params: ; x0 -- thunk target ; x1 -- frame pointer ; x2 -- locals pointer ; x3 -- size of stack args area + ; x4 -- exception object (for arm64_CallCatch only) + + PROLOG_SAVE_REG_PAIR d8, d9, #-240! + PROLOG_SAVE_REG_PAIR d10, d11, #16 + PROLOG_SAVE_REG_PAIR d12, d13, #32 + PROLOG_SAVE_REG_PAIR d14, d15, #48 + PROLOG_SAVE_REG_PAIR x19, x20, #64 + PROLOG_SAVE_REG_PAIR x21, x22, #80 + PROLOG_SAVE_REG_PAIR x23, x24, #96 + PROLOG_SAVE_REG_PAIR x25, x26, #112 + PROLOG_SAVE_REG_PAIR x27, x28, #128 + PROLOG_SAVE_REG_PAIR_NO_FP fp, lr, #160 + + sub x15, x1, x2 ; x15 = frame pointer minus locals pointer + sub x15, x15, #160 ; x15 -= space we already allocated + add x15, x15, x3 ; x15 += argout area = same stack allocation as original function + lsr x15, x15, #4 ; x15 /= 16 + bl __chkstk ; verify the allocation is ok + sub sp, sp, x15, lsl #4 ; allocate the stack + + MEND - ; Home params and save registers - PROLOG_SAVE_REG_PAIR fp, lr, #-80! - PROLOG_NOP stp x0, x1, [sp, #16] - PROLOG_NOP stp x2, x3, [sp, #32] - PROLOG_NOP stp x4, x5, [sp, #48] - PROLOG_NOP stp x6, x7, [sp, #64] - PROLOG_STACK_ALLOC (10*8 + 8*16 + 32) - PROLOG_NOP stp q8, q9, [sp, #(16 + 0*16)] - PROLOG_NOP stp q10, q11, [sp, #(16 + 2*16)] - PROLOG_NOP stp q12, q13, [sp, #(16 + 4*16)] - PROLOG_NOP stp q14, q15, [sp, #(16 + 6*16)] - PROLOG_SAVE_REG_PAIR x19, x20, #(16 + 8*16 + 0*8) - PROLOG_SAVE_REG_PAIR x21, x22, #(16 + 8*16 + 2*8) - PROLOG_SAVE_REG_PAIR x23, x24, #(16 + 8*16 + 4*8) - PROLOG_SAVE_REG_PAIR x25, x26, #(16 + 8*16 + 6*8) - PROLOG_SAVE_REG_PAIR x27, x28, #(16 + 8*16 + 8*8) - ; Save a pointer to the saved registers - mov x16, sp - str x16, [sp, #0] - - ; Set up the frame pointer and locals pointer - mov x28, x2 - mov fp, x1 + TEXTAREA - ; Allocate the arg out area, calling chkstk if necessary - cmp x3,#4095 - bgt chkstk_call - sub sp,sp,x3 + NESTED_ENTRY arm64_CallEhFrame - ; Thunk to the jitted code (and don't return) - br x0 + STANDARD_PROLOG -|chkstk_call| - ; Call chkstk, passing a size/16 count in x15 - lsr x15,x3,#4 - bl |__chkstk| - sub sp,sp,x15,lsl #4 + ; Set up the locals pointer and frame pointer + mov x28, x2 + mov fp, x1 ; Thunk to the jitted code (and don't return) br x0 @@ -122,44 +133,12 @@ ; x3 -- size of stack args area ; x4 -- exception object - ; Home params and save registers - PROLOG_SAVE_REG_PAIR fp, lr, #-80! - PROLOG_NOP stp x0, x1, [sp, #16] - PROLOG_NOP stp x2, x3, [sp, #32] - PROLOG_NOP stp x4, x5, [sp, #48] - PROLOG_NOP stp x6, x7, [sp, #64] - PROLOG_STACK_ALLOC (10*8 + 8*16 + 32) - PROLOG_NOP stp q8, q9, [sp, #(16 + 0*16)] - PROLOG_NOP stp q10, q11, [sp, #(16 + 2*16)] - PROLOG_NOP stp q12, q13, [sp, #(16 + 4*16)] - PROLOG_NOP stp q14, q15, [sp, #(16 + 6*16)] - PROLOG_SAVE_REG_PAIR x19, x20, #(16 + 8*16 + 0*8) - PROLOG_SAVE_REG_PAIR x21, x22, #(16 + 8*16 + 2*8) - PROLOG_SAVE_REG_PAIR x23, x24, #(16 + 8*16 + 4*8) - PROLOG_SAVE_REG_PAIR x25, x26, #(16 + 8*16 + 6*8) - PROLOG_SAVE_REG_PAIR x27, x28, #(16 + 8*16 + 8*8) - ; Save a pointer to the saved registers - mov x16, sp - str x16, [sp, #0] - - ; Set up the frame pointer and locals pointer + STANDARD_PROLOG + + ; Set up the locals pointer and frame pointer and catch object handler mov x28, x2 mov fp, x1 - - ; Allocate the arg out area, calling chkstk if necessary - cmp x3,#4095 mov x1, x4 - bgt chkstk_call - sub sp,sp,x3 - - ; Thunk to the jitted code (and don't return) - br x0 - -|chkstk_call_catch| - ; Call chkstk, passing a size/16 count in x15 - lsr x15,x3,#4 - bl |__chkstk| - sub sp,sp,x15,lsl #4 ; Thunk to the jitted code (and don't return) br x0 diff --git a/deps/chakrashim/core/lib/Runtime/Language/arm64/arm64_Thunks.asm b/deps/chakrashim/core/lib/Runtime/Language/arm64/arm64_Thunks.asm index 90b68f6b07c..8c4fed1bf53 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/arm64/arm64_Thunks.asm +++ b/deps/chakrashim/core/lib/Runtime/Language/arm64/arm64_Thunks.asm @@ -15,6 +15,8 @@ EXPORT |?EnsureDynamicProfileInfoThunk@DynamicProfileInfo@Js@@SAPEAXPEAVRecyclableObject@2@UCallInfo@2@ZZ| ; Var ScriptContext::ProfileModeDeferredParsingThunk(RecyclableObject* function, CallInfo callInfo, ...) EXPORT |?ProfileModeDeferredParsingThunk@ScriptContext@Js@@SAPEAXPEAVRecyclableObject@2@UCallInfo@2@ZZ| + ; Var InterpreterStackFrame::StaticInterpreterThunk(RecyclableObject* function, CallInfo callInfo) + EXPORT |?StaticInterpreterThunk@InterpreterStackFrame@Js@@SAPEAXPEAVRecyclableObject@2@UCallInfo@2@ZZ| ;JavascriptMethod InterpreterStackFrame::EnsureDynamicInterpreterThunk(Js::ScriptFunction * function) IMPORT |?EnsureDynamicInterpreterThunk@InterpreterStackFrame@Js@@CAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAVScriptFunction@2@@Z| @@ -24,7 +26,8 @@ IMPORT |?ProfileModeDeferredParse@ScriptContext@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAPEAVScriptFunction@2@@Z| ;JavascriptMethod ScriptContext::ProfileModeDeferredDeserialize(ScriptFunction *function) IMPORT |?ProfileModeDeferredDeserialize@ScriptContext@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAVScriptFunction@2@@Z| - + ;Var InterpreterStackFrame::InterpreterThunk(JavascriptCallStackLayout* layout) + IMPORT |?InterpreterThunk@InterpreterStackFrame@Js@@SAPEAXPEAVJavascriptCallStackLayout@2@@Z| TEXTAREA ;;============================================================================================================ @@ -88,6 +91,7 @@ stp x6, x7, [sp, #64] mov x0, sp ; Pass the address of the function at the saved x0 in case it need to be boxed + add x0, x0, #16 ; 16 is subtracted from the stack pointer when the a function is called, add it back here. bl |?ProfileModeDeferredParse@ScriptContext@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAPEAVScriptFunction@2@@Z| ; call ScriptContext::ProfileModeDeferredParse mov x16, x0 ; back up entryPoint in x16 @@ -122,6 +126,26 @@ EPILOG_RESTORE_REG_PAIR fp, lr, #80! EPILOG_NOP br x16 ; jump (tail call) to new entryPoint + NESTED_END + +;;============================================================================================================ +;; InterpreterStackFrame::StaticInterpreterThunk +;;============================================================================================================ + ;; Var InterpreterStackFrame::StaticInterpreterThunk(RecyclableObject* function, CallInfo callInfo, ...) + NESTED_ENTRY ?StaticInterpreterThunk@InterpreterStackFrame@Js@@SAPEAXPEAVRecyclableObject@2@UCallInfo@2@ZZ + + PROLOG_SAVE_REG_PAIR fp, lr, #-80! + stp x0, x1, [sp, #16] + stp x2, x3, [sp, #32] + stp x4, x5, [sp, #48] + stp x6, x7, [sp, #64] + + add x0, sp, #16 + bl |?InterpreterThunk@InterpreterStackFrame@Js@@SAPEAXPEAVJavascriptCallStackLayout@2@@Z| ; call InterpreterStackFrame::InterpreterThunk + + EPILOG_RESTORE_REG_PAIR fp, lr, #80! + EPILOG_RETURN + NESTED_END ;;============================================================================================================ END diff --git a/deps/chakrashim/core/lib/Runtime/Language/i386/AsmJsJitTemplate.cpp b/deps/chakrashim/core/lib/Runtime/Language/i386/AsmJsJitTemplate.cpp index 7de298a82ee..bd7cc673903 100644 --- a/deps/chakrashim/core/lib/Runtime/Language/i386/AsmJsJitTemplate.cpp +++ b/deps/chakrashim/core/lib/Runtime/Language/i386/AsmJsJitTemplate.cpp @@ -551,14 +551,13 @@ namespace Js AsmJsSIMDValue* simdArg; // setup stack memory - FrameDisplay* frame = func->GetEnvironment(); - Var moduleEnv = frame->GetItem(0); - Var* arrayBufferVar = (Var*)frame->GetItem(0) + AsmJsModuleMemory::MemoryTableBeginOffset; + AsmJsScriptFunction* asmJsFunc = AsmJsScriptFunction::FromVar(func); + Var moduleEnv = asmJsFunc->GetModuleEnvironment(); + JavascriptArrayBuffer* arrayBuffer = asmJsFunc->GetAsmJsArrayBuffer(); int arraySize = 0; BYTE* arrayPtr = nullptr; - if (*arrayBufferVar && JavascriptArrayBuffer::Is(*arrayBufferVar)) + if (JavascriptArrayBuffer::Is(arrayBuffer)) { - JavascriptArrayBuffer* arrayBuffer = *(JavascriptArrayBuffer**)arrayBufferVar; arrayPtr = arrayBuffer->GetBuffer(); arraySize = arrayBuffer->GetByteLength(); } @@ -3287,6 +3286,24 @@ namespace Js templateData->InternalCallDone(); size += EncodingHelpers::ReloadArrayBuffer(context, buffer); + + switch (retType.which()) + { + case AsmJsRetType::Signed: + size += EncodingHelpers::SetStackReg(buffer, templateData, targetOffset, RegEAX); + case AsmJsRetType::Double: + size += MOVSD::EncodeInstruction(buffer, InstrParamsAddrReg(RegEBP, targetOffset, RegXMM0)); + templateData->OverwriteStack(targetOffset); + break; + case AsmJsRetType::Float: + size += MOVSS::EncodeInstruction(buffer, InstrParamsAddrReg(RegEBP, targetOffset, RegXMM0)); + templateData->OverwriteStack(targetOffset); + break; + case AsmJsRetType::Void: + break; + default: + Assert(UNREACHED); + } return size; } int AsmJsLoopBody::ApplyTemplate(TemplateContext context, BYTE*& buffer, int loopNumber) @@ -3368,43 +3385,6 @@ namespace Js return size; } - int I_Conv_VTI::ApplyTemplate( TemplateContext context, BYTE*& buffer, int targetOffset, int srcOffset ) - { - X86TemplateData* templateData = GetTemplateData( context ); - int size = 0; - targetOffset -= templateData->GetBaseOffSet(); - srcOffset -= templateData->GetBaseOffSet(); - - size += EncodingHelpers::SetStackReg( buffer, templateData, targetOffset , RegEAX); - - return size; - } - int I_Conv_VTD::ApplyTemplate( TemplateContext context, BYTE*& buffer, int targetOffset, int srcOffset ) - { - X86TemplateData* templateData = GetTemplateData( context ); - int size = 0; - targetOffset -= templateData->GetBaseOffSet(); - srcOffset -= templateData->GetBaseOffSet(); - - size += MOVSD::EncodeInstruction(buffer, InstrParamsAddrReg(RegEBP, targetOffset,RegXMM0)); - templateData->OverwriteStack( targetOffset ); - - return size; - } - - int I_Conv_VTF::ApplyTemplate(TemplateContext context, BYTE*& buffer, int targetOffset, int srcOffset) - { - X86TemplateData* templateData = GetTemplateData(context); - int size = 0; - targetOffset -= templateData->GetBaseOffSet(); - srcOffset -= templateData->GetBaseOffSet(); - - size += MOVSS::EncodeInstruction(buffer, InstrParamsAddrReg(RegEBP, targetOffset, RegXMM0)); - templateData->OverwriteStack(targetOffset); - - return size; - } - int LdUndef::ApplyTemplate( TemplateContext context, BYTE*& buffer, int targetOffset ) { X86TemplateData* templateData = GetTemplateData( context ); @@ -4695,23 +4675,6 @@ namespace Js { return Simd128_I_ArgOut_F4::ApplyTemplate(context, buffer, argIndex, offset); } - - int Simd128_I_Conv_VTF4::ApplyTemplate(TemplateContext context, BYTE*& buffer, int targetOffset, int srcOffset) - { - X86TemplateData* templateData = GetTemplateData(context); - targetOffset -= templateData->GetBaseOffSet(); - srcOffset -= templateData->GetBaseOffSet(); - - return EncodingHelpers::SIMDSetStackReg(buffer, templateData, targetOffset, RegXMM0); - } - int Simd128_I_Conv_VTI4::ApplyTemplate(TemplateContext context, BYTE*& buffer, int targetOffset, int srcOffset) - { - return Simd128_I_Conv_VTF4::ApplyTemplate(context, buffer, targetOffset, srcOffset); - } - int Simd128_I_Conv_VTD2::ApplyTemplate(TemplateContext context, BYTE*& buffer, int targetOffset, int srcOffset) - { - return Simd128_I_Conv_VTF4::ApplyTemplate(context, buffer, targetOffset, srcOffset); - } }; } #endif diff --git a/deps/chakrashim/core/lib/Runtime/Library/ArgumentsObjectEnumerator.cpp b/deps/chakrashim/core/lib/Runtime/Library/ArgumentsObjectEnumerator.cpp index 31eaa11ab91..2f947573eb8 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ArgumentsObjectEnumerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ArgumentsObjectEnumerator.cpp @@ -18,13 +18,13 @@ namespace Js JavascriptString * ArgumentsObjectPrefixEnumerator::MoveAndGetNext(PropertyId& propertyId, PropertyAttributes* attributes) { + propertyId = Constants::NoProperty; if (!doneFormalArgs) { formalArgIndex = argumentsObject->GetNextFormalArgIndex(formalArgIndex, !!(flags & EnumeratorFlags::EnumNonEnumerable), attributes); if (formalArgIndex != JavascriptArray::InvalidIndex && formalArgIndex < argumentsObject->GetNumberOfArguments()) { - propertyId = Constants::NoProperty; return this->GetScriptContext()->GetIntegerString(formalArgIndex); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/ArrayBuffer.cpp b/deps/chakrashim/core/lib/Runtime/Library/ArrayBuffer.cpp index f8056f31d51..caa5168665c 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ArrayBuffer.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ArrayBuffer.cpp @@ -12,6 +12,12 @@ namespace Js } ArrayBufferBase* ArrayBufferBase::FromVar(Var value) + { + AssertOrFailFast(ArrayBufferBase::Is(value)); + return static_cast (value); + } + + ArrayBufferBase* ArrayBufferBase::UnsafeFromVar(Var value) { Assert(ArrayBufferBase::Is(value)); return static_cast (value); @@ -60,7 +66,7 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Uint8Array: @@ -76,7 +82,7 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Uint8ClampedArray: @@ -92,7 +98,7 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Int16Array: @@ -108,7 +114,7 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Uint16Array: @@ -124,7 +130,7 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Int32Array: @@ -140,7 +146,7 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Uint32Array: @@ -156,7 +162,7 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Float32Array: @@ -172,7 +178,7 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Float64Array: @@ -188,14 +194,14 @@ namespace Js VirtualTableInfo>::SetVirtualTable(parent); } } - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_Int64Array: case TypeIds_Uint64Array: case TypeIds_CharArray: case TypeIds_BoolArray: - TypedArrayBase::FromVar(parent)->ClearLengthAndBufferOnDetach(); + TypedArrayBase::UnsafeFromVar(parent)->ClearLengthAndBufferOnDetach(); break; case TypeIds_DataView: @@ -323,11 +329,10 @@ namespace Js AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); - if (!(callInfo.Flags & CallFlags_New) || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) + if (!args.IsNewCall() || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) { JavascriptError::ThrowTypeError(scriptContext, JSERR_ClassConstructorCannotBeCalledWithoutNew, _u("ArrayBuffer")); } @@ -407,8 +412,8 @@ namespace Js return library->GetFalse(); } - // ArrayBuffer.transfer as described in Luke Wagner's proposal: https://gist.github.com/lukewagner/2735af7eea411e18cf20 - Var ArrayBuffer::EntryTransfer(RecyclableObject* function, CallInfo callInfo, ...) +#if ENABLE_DEBUG_CONFIG_OPTIONS + Var ArrayBuffer::EntryDetach(RecyclableObject* function, CallInfo callInfo, ...) { ScriptContext* scriptContext = function->GetScriptContext(); @@ -416,9 +421,9 @@ namespace Js ARGUMENTS(args, callInfo); - Assert(!(callInfo.Flags & CallFlags_New)); + AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(ArrayBuffer_Constructor_transfer); + Assert(!(callInfo.Flags & CallFlags_New)); if (args.Info.Count < 2 || !ArrayBuffer::Is(args[1])) { @@ -429,23 +434,16 @@ namespace Js if (arrayBuffer->IsDetached()) { - JavascriptError::ThrowTypeError(scriptContext, JSERR_DetachedTypedArray, _u("ArrayBuffer.transfer")); + JavascriptError::ThrowTypeError(scriptContext, JSERR_DetachedTypedArray, _u("ArrayBuffer.detach")); } - uint32 newBufferLength = arrayBuffer->bufferLength; - if (args.Info.Count >= 3) - { - newBufferLength = ToIndex(args[2], JSERR_ArrayLengthConstructIncorrect, scriptContext, MaxArrayBufferLength); + // Discard the buffer + DetachedStateBase* state = arrayBuffer->DetachAndGetState(); + state->CleanUp(); - // ToIndex above can call user script (valueOf) which can detach the buffer - if (arrayBuffer->IsDetached()) - { - JavascriptError::ThrowTypeError(scriptContext, JSERR_DetachedTypedArray, _u("ArrayBuffer.transfer")); - } - } - - return arrayBuffer->TransferInternal(newBufferLength); + return scriptContext->GetLibrary()->GetUndefined(); } +#endif // ArrayBuffer.prototype.slice as described in ES6 draft #19 section 24.1.4.3. Var ArrayBuffer::EntrySlice(RecyclableObject* function, CallInfo callInfo, ...) @@ -510,9 +508,7 @@ namespace Js if (scriptContext->GetConfig()->IsES6SpeciesEnabled()) { - Var constructorVar = JavascriptOperators::SpeciesConstructor(arrayBuffer, scriptContext->GetLibrary()->GetArrayBufferConstructor(), scriptContext); - - JavascriptFunction* constructor = JavascriptFunction::FromVar(constructorVar); + RecyclableObject* constructor = JavascriptOperators::SpeciesConstructor(arrayBuffer, scriptContext->GetLibrary()->GetArrayBufferConstructor(), scriptContext); Js::Var constructorArgs[] = {constructor, JavascriptNumber::ToVar(byteLength, scriptContext)}; Js::CallInfo constructorCallInfo(Js::CallFlags_New, _countof(constructorArgs)); @@ -574,10 +570,17 @@ namespace Js } ArrayBuffer* ArrayBuffer::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "var must be an ArrayBuffer"); + + return static_cast(aValue); + } + + ArrayBuffer* ArrayBuffer::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "var must be an ArrayBuffer"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } bool ArrayBuffer::Is(Var aValue) @@ -697,22 +700,38 @@ namespace Js return result; } + template + void Js::ArrayBuffer::ArrayBufferDetachedState::DiscardState() + { + if (this->buffer != nullptr) + { + freeFunction(this->buffer); + this->buffer = nullptr; + this->recycler->ReportExternalMemoryFree(this->bufferLength); + } + this->bufferLength = 0; + } + ArrayBufferDetachedStateBase* JavascriptArrayBuffer::CreateDetachedState(BYTE* buffer, uint32 bufferLength) { + FreeFn* freeFn = nullptr; + ArrayBufferAllocationType allocationType; #if ENABLE_FAST_ARRAYBUFFER if (IsValidVirtualBufferLength(bufferLength)) { - return HeapNew(ArrayBufferDetachedState, buffer, bufferLength, FreeMemAlloc, ArrayBufferAllocationType::MemAlloc); + allocationType = ArrayBufferAllocationType::MemAlloc; + freeFn = FreeMemAlloc; } else +#endif { - return HeapNew(ArrayBufferDetachedState, buffer, bufferLength, free, ArrayBufferAllocationType::Heap); + allocationType = ArrayBufferAllocationType::Heap; + freeFn = free; } -#else - return HeapNew(ArrayBufferDetachedState, buffer, bufferLength, free, ArrayBufferAllocationType::Heap); -#endif + return HeapNew(ArrayBufferDetachedState, buffer, bufferLength, freeFn, GetScriptContext()->GetRecycler(), allocationType); } + bool JavascriptArrayBuffer::IsValidAsmJsBufferLengthAlgo(uint length, bool forceCheck) { /* @@ -743,7 +762,7 @@ namespace Js bool JavascriptArrayBuffer::IsValidVirtualBufferLength(uint length) const { #if ENABLE_FAST_ARRAYBUFFER - return !PHASE_OFF1(Js::TypedArrayVirtualPhase) && IsValidAsmJsBufferLengthAlgo(length, true); + return PHASE_FORCE1(Js::TypedArrayVirtualPhase) || (!PHASE_OFF1(Js::TypedArrayVirtualPhase) && IsValidAsmJsBufferLengthAlgo(length, true)); #else return false; #endif @@ -785,18 +804,6 @@ namespace Js /* See JavascriptArrayBuffer::Finalize */ } - // Copy memory from src to dst, truncate if dst smaller, zero extra memory - // if dst larger - static void MemCpyZero(__bcount(dstSize) BYTE* dst, size_t dstSize, - __in_bcount(count) const BYTE* src, size_t count) - { - js_memcpy_s(dst, dstSize, src, min(dstSize, count)); - if (dstSize > count) - { - ZeroMemory(dst + count, dstSize - count); - } - } - // Same as realloc but zero newly allocated portion if newSize > oldSize static BYTE* ReallocZero(BYTE* ptr, size_t oldSize, size_t newSize) { @@ -808,137 +815,6 @@ namespace Js return ptrNew; } - ArrayBuffer * JavascriptArrayBuffer::TransferInternal(uint32 newBufferLength) - { - ArrayBuffer* newArrayBuffer; - Recycler* recycler = this->GetRecycler(); - - if (this->bufferLength > 0) - { - ReportDifferentialAllocation(newBufferLength); - } - - if (newBufferLength == 0 || this->bufferLength == 0) - { - newArrayBuffer = GetLibrary()->CreateArrayBuffer(newBufferLength); - if (newBufferLength > 0 && !newArrayBuffer->GetByteLength()) - { - JavascriptError::ThrowOutOfMemoryError(GetScriptContext()); - } - } - else - { - BYTE * newBuffer = nullptr; - if (IsValidVirtualBufferLength(this->bufferLength)) - { - if (IsValidVirtualBufferLength(newBufferLength)) - { - // we are transferring between an optimized buffer using a length that can be optimized - if (newBufferLength < this->bufferLength) - { -#pragma prefast(suppress:6250, "Calling 'VirtualFree' without the MEM_RELEASE flag might free memory but not address descriptors (VADs).") - VirtualFree(this->buffer + newBufferLength, this->bufferLength - newBufferLength, MEM_DECOMMIT); - } - else if (newBufferLength > this->bufferLength) - { - LPVOID newMem = VirtualAlloc(this->buffer + this->bufferLength, newBufferLength - this->bufferLength, MEM_COMMIT, PAGE_READWRITE); - if (!newMem) - { - recycler->ReportExternalMemoryFailure(newBufferLength - this->bufferLength); - JavascriptError::ThrowOutOfMemoryError(GetScriptContext()); - } - } - newBuffer = this->buffer; - } - else - { - // we are transferring from an optimized buffer, but the new length isn't compatible, so start over and copy to new memory - newBuffer = (BYTE*)malloc(newBufferLength); - if (!newBuffer) - { - recycler->ReportExternalMemoryFailure(newBufferLength - this->bufferLength); - JavascriptError::ThrowOutOfMemoryError(GetScriptContext()); - } - MemCpyZero(newBuffer, newBufferLength, this->buffer, this->bufferLength); - } - } - else - { - if (IsValidVirtualBufferLength(newBufferLength)) - { - // we are transferring from an unoptimized buffer, but new length can be optimized, so move to that - newBuffer = (BYTE*)AsmJsVirtualAllocator(newBufferLength); - if (!newBuffer) - { - recycler->ReportExternalMemoryFailure(newBufferLength - this->bufferLength); - JavascriptError::ThrowOutOfMemoryError(GetScriptContext()); - } - MemCpyZero(newBuffer, newBufferLength, this->buffer, this->bufferLength); - } - else if (newBufferLength != this->bufferLength) - { - // both sides will just be regular ArrayBuffer, so realloc - newBuffer = ReallocZero(this->buffer, this->bufferLength, newBufferLength); - if (!newBuffer) - { - recycler->ReportExternalMemoryFailure(newBufferLength - this->bufferLength); - JavascriptError::ThrowOutOfMemoryError(GetScriptContext()); - } - } - else - { - newBuffer = this->buffer; - } - } - newArrayBuffer = GetLibrary()->CreateArrayBuffer(newBuffer, newBufferLength); - - } - AutoDiscardPTR state(DetachAndGetState()); - state->MarkAsClaimed(); - - return newArrayBuffer; - } - - - template - void Js::JavascriptArrayBuffer::ReportDifferentialAllocation(uint32 newBufferLength, Func reportFailureFn) - { - Recycler* recycler = this->GetRecycler(); - - // Report differential external memory allocation. - // If current bufferLength == 0, new ArrayBuffer creation records the allocation - // so no need to do it here. - if (newBufferLength != this->bufferLength) - { - // Expanding buffer - if (newBufferLength > this->bufferLength) - { - if (!recycler->RequestExternalMemoryAllocation(newBufferLength - this->bufferLength)) - { - recycler->CollectNow(); - if (!recycler->RequestExternalMemoryAllocation(newBufferLength - this->bufferLength)) - { - reportFailureFn(); - } - } - } - // Contracting buffer - else - { - recycler->ReportExternalMemoryFree(this->bufferLength - newBufferLength); - } - } - } - - - void JavascriptArrayBuffer::ReportDifferentialAllocation(uint32 newBufferLength) - { - ScriptContext* scriptContext = GetScriptContext(); - ReportDifferentialAllocation(newBufferLength, [scriptContext] { - JavascriptError::ThrowOutOfMemoryError(scriptContext); - }); - } - #if ENABLE_TTD TTD::NSSnapObjects::SnapObjectType JavascriptArrayBuffer::GetSnapTag_TTD() const { @@ -1038,6 +914,11 @@ namespace Js #endif } + ArrayBufferDetachedStateBase* WebAssemblyArrayBuffer::CreateDetachedState(BYTE* buffer, uint32 bufferLength) + { + JavascriptError::ThrowTypeError(GetScriptContext(), WASMERR_CantDetach); + } + WebAssemblyArrayBuffer* WebAssemblyArrayBuffer::GrowMemory(uint32 newBufferLength) { if (newBufferLength < this->bufferLength) @@ -1116,11 +997,6 @@ namespace Js } } - ArrayBuffer * WebAssemblyArrayBuffer::TransferInternal(uint32 newBufferLength) - { - JavascriptError::ThrowTypeError(GetScriptContext(), WASMERR_CantDetach); - } - ProjectionArrayBuffer::ProjectionArrayBuffer(uint32 length, DynamicType * type) : ArrayBuffer(length, type, CoTaskMemAlloc) { @@ -1152,29 +1028,6 @@ namespace Js CoTaskMemFree(buffer); } - ArrayBuffer * ProjectionArrayBuffer::TransferInternal(uint32 newBufferLength) - { - ArrayBuffer* newArrayBuffer; - if (newBufferLength == 0 || this->bufferLength == 0) - { - newArrayBuffer = GetLibrary()->CreateProjectionArraybuffer(newBufferLength); - } - else - { - BYTE * newBuffer = (BYTE*)CoTaskMemRealloc(this->buffer, newBufferLength); - if (!newBuffer) - { - JavascriptError::ThrowOutOfMemoryError(GetScriptContext()); - } - newArrayBuffer = GetLibrary()->CreateProjectionArraybuffer(newBuffer, newBufferLength); - } - - AutoDiscardPTR state(DetachAndGetState()); - state->MarkAsClaimed(); - - return newArrayBuffer; - } - ExternalArrayBuffer::ExternalArrayBuffer(byte *buffer, uint32 length, DynamicType *type) : ArrayBuffer(buffer, length, type) { diff --git a/deps/chakrashim/core/lib/Runtime/Library/ArrayBuffer.h b/deps/chakrashim/core/lib/Runtime/Library/ArrayBuffer.h index dc92dbc1f4d..5f9a1896e28 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ArrayBuffer.h +++ b/deps/chakrashim/core/lib/Runtime/Library/ArrayBuffer.h @@ -82,6 +82,7 @@ namespace Js static bool Is(Var value); static ArrayBufferBase* FromVar(Var value); + static ArrayBufferBase* UnsafeFromVar(Var value); static int GetIsDetachedOffset() { return offsetof(ArrayBufferBase, isDetached); } protected: @@ -102,9 +103,10 @@ namespace Js { public: FreeFN* freeFunction; - - ArrayBufferDetachedState(BYTE* buffer, uint32 bufferLength, FreeFN* freeFunction, ArrayBufferAllocationType allocationType) + Recycler* recycler; + ArrayBufferDetachedState(BYTE* buffer, uint32 bufferLength, FreeFN* freeFunction, Recycler* recycler, ArrayBufferAllocationType allocationType) : ArrayBufferDetachedStateBase(TypeIds_ArrayBuffer, buffer, bufferLength, allocationType), + recycler(recycler), freeFunction(freeFunction) {} @@ -113,15 +115,7 @@ namespace Js HeapDelete(this); } - virtual void DiscardState() override - { - if (this->buffer != nullptr) - { - freeFunction(this->buffer); - this->buffer = nullptr; - } - this->bufferLength = 0; - } + virtual void DiscardState() override; virtual void Discard() override { @@ -142,7 +136,9 @@ namespace Js static FunctionInfo IsView; static FunctionInfo GetterByteLength; static FunctionInfo GetterSymbolSpecies; - static FunctionInfo Transfer; +#if ENABLE_DEBUG_CONFIG_OPTIONS + static FunctionInfo Detach; +#endif }; static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...); @@ -150,11 +146,14 @@ namespace Js static Var EntryIsView(RecyclableObject* function, CallInfo callInfo, ...); static Var EntryGetterByteLength(RecyclableObject* function, CallInfo callInfo, ...); static Var EntryGetterSymbolSpecies(RecyclableObject* function, CallInfo callInfo, ...); - static Var EntryTransfer(RecyclableObject* function, CallInfo callInfo, ...); +#if ENABLE_DEBUG_CONFIG_OPTIONS + static Var EntryDetach(RecyclableObject* function, CallInfo callInfo, ...); +#endif static bool Is(Var aValue); static ArrayBuffer* NewFromDetachedState(DetachedStateBase* state, JavascriptLibrary *library); static ArrayBuffer* FromVar(Var aValue); + static ArrayBuffer* UnsafeFromVar(Var aValue); virtual BOOL GetDiagTypeString(StringBuilder* stringBuilder, ScriptContext* requestContext) override; virtual BOOL GetDiagValueString(StringBuilder* stringBuilder, ScriptContext* requestContext) override; @@ -183,15 +182,12 @@ namespace Js static uint32 ToIndex(Var value, int32 errorCode, ScriptContext *scriptContext, uint32 MaxAllowedLength, bool checkSameValueZero = true); - virtual ArrayBuffer * TransferInternal(DECLSPEC_GUARD_OVERFLOW uint32 newBufferLength) = 0; protected: void Detach(); typedef void __cdecl FreeFn(void* ptr); virtual ArrayBufferDetachedStateBase* CreateDetachedState(BYTE* buffer, DECLSPEC_GUARD_OVERFLOW uint32 bufferLength) = 0; - static uint32 GetIndexFromVar(Js::Var arg, uint32 length, ScriptContext* scriptContext); - //In most cases, the ArrayBuffer will only have one parent Field(RecyclerWeakReference*) primaryParent; @@ -259,12 +255,6 @@ namespace Js virtual bool IsValidAsmJsBufferLength(uint length, bool forceCheck = false) override; virtual bool IsValidVirtualBufferLength(uint length) const override; - virtual ArrayBuffer * TransferInternal(DECLSPEC_GUARD_OVERFLOW uint32 newBufferLength) override; - - template - void ReportDifferentialAllocation(uint32 newBufferLength, Func reportFailureFn); - void ReportDifferentialAllocation(uint32 newBufferLength); - protected: JavascriptArrayBuffer(DynamicType * type); virtual ArrayBufferDetachedStateBase* CreateDetachedState(BYTE* buffer, DECLSPEC_GUARD_OVERFLOW uint32 bufferLength) override; @@ -295,8 +285,10 @@ namespace Js WebAssemblyArrayBuffer* GrowMemory(DECLSPEC_GUARD_OVERFLOW uint32 newBufferLength); virtual bool IsValidVirtualBufferLength(uint length) const override; - virtual ArrayBuffer * TransferInternal(DECLSPEC_GUARD_OVERFLOW uint32 newBufferLength) override; virtual bool IsWebAssemblyArrayBuffer() override { return true; } + + protected: + virtual ArrayBufferDetachedStateBase* CreateDetachedState(BYTE* buffer, DECLSPEC_GUARD_OVERFLOW uint32 bufferLength) override; }; // the memory must be allocated via CoTaskMemAlloc. @@ -309,7 +301,7 @@ namespace Js typedef void __stdcall FreeFn(LPVOID ptr); virtual ArrayBufferDetachedStateBase* CreateDetachedState(BYTE* buffer, DECLSPEC_GUARD_OVERFLOW uint32 bufferLength) override { - return HeapNew(ArrayBufferDetachedState, buffer, bufferLength, CoTaskMemFree, ArrayBufferAllocationType::CoTask); + return HeapNew(ArrayBufferDetachedState, buffer, bufferLength, CoTaskMemFree, GetScriptContext()->GetRecycler(), ArrayBufferAllocationType::CoTask); } public: @@ -319,7 +311,6 @@ namespace Js static ProjectionArrayBuffer* Create(byte* buffer, DECLSPEC_GUARD_OVERFLOW uint32 length, DynamicType * type); virtual void Dispose(bool isShutdown) override; virtual void Finalize(bool isShutdown) override {}; - virtual ArrayBuffer * TransferInternal(DECLSPEC_GUARD_OVERFLOW uint32 newBufferLength) override; private: ProjectionArrayBuffer(uint32 length, DynamicType * type); ProjectionArrayBuffer(byte* buffer, uint32 length, DynamicType * type); @@ -333,7 +324,6 @@ namespace Js DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(ExternalArrayBuffer); public: ExternalArrayBuffer(byte *buffer, DECLSPEC_GUARD_OVERFLOW uint32 length, DynamicType *type); - virtual ArrayBuffer * TransferInternal(DECLSPEC_GUARD_OVERFLOW uint32 newBufferLength) override { Assert(UNREACHED); Throw::InternalError(); }; protected: virtual ArrayBufferDetachedStateBase* CreateDetachedState(BYTE* buffer, DECLSPEC_GUARD_OVERFLOW uint32 bufferLength) override { Assert(UNREACHED); Throw::InternalError(); }; diff --git a/deps/chakrashim/core/lib/Runtime/Library/AtomicsObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/AtomicsObject.cpp index c346c7fd64f..1d99fba57b4 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/AtomicsObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/AtomicsObject.cpp @@ -41,7 +41,7 @@ namespace Js } } - TypedArrayBase *typedArrayBase = TypedArrayBase::FromVar(typedArray); + TypedArrayBase *typedArrayBase = TypedArrayBase::UnsafeFromVar(typedArray); ArrayBufferBase* arrayBuffer = typedArrayBase->GetArrayBuffer(); if (arrayBuffer == nullptr || !ArrayBufferBase::Is(arrayBuffer) || !arrayBuffer->IsSharedArrayBuffer()) { diff --git a/deps/chakrashim/core/lib/Runtime/Library/BoundFunction.cpp b/deps/chakrashim/core/lib/Runtime/Library/BoundFunction.cpp index 92278454a0d..194920ba906 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/BoundFunction.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/BoundFunction.cpp @@ -31,6 +31,8 @@ namespace Js ScriptContext *scriptContext = this->GetScriptContext(); targetFunction = RecyclableObject::FromVar(args[0]); + Assert(!CrossSite::NeedMarshalVar(targetFunction, scriptContext)); + // Let proto be targetFunction.[[GetPrototypeOf]](). RecyclableObject* proto = JavascriptOperators::GetPrototype(targetFunction); if (proto != type->GetPrototype()) @@ -46,7 +48,7 @@ namespace Js // Here although we won't use value of length, this is just to make sure that we call traps involved with HasOwnProperty(Target, "length") and Get(Target, "length") if (JavascriptProxy::Is(targetFunction)) { - if (JavascriptOperators::HasOwnProperty(targetFunction, PropertyIds::length, scriptContext) == TRUE) + if (JavascriptOperators::HasOwnProperty(targetFunction, PropertyIds::length, scriptContext, nullptr) == TRUE) { int len = 0; Var varLength; @@ -150,7 +152,6 @@ namespace Js if (boundFunction->count > 0) { - BOOL isCrossSiteObject = boundFunction->IsCrossSiteObject(); // OACR thinks that this can change between here and the check in the for loop below const unsigned int argCount = args.Info.Count; @@ -176,24 +177,9 @@ namespace Js newValues[index++] = boundFunction->boundThis; } - // Copy the bound args - if (!isCrossSiteObject) + for (uint i = 0; i < boundFunction->count; i++) { - for (uint i = 0; i < boundFunction->count; i++) - { - newValues[index++] = boundFunction->boundArgs[i]; - } - } - else - { - // it is possible that the bound arguments are not marshalled yet. - for (uint i = 0; i < boundFunction->count; i++) - { - //warning C6386: Buffer overrun while writing to 'newValues': the writable size is 'boundFunction->count+argCount*8' bytes, but '40' bytes might be written. - // there's throw with args.Info.Count == 0, so here won't hit buffer overrun, and __analyze_assume(argCount>0) does not work -#pragma warning(suppress: 6386) - newValues[index++] = CrossSite::MarshalVar(scriptContext, boundFunction->boundArgs[i]); - } + newValues[index++] = boundFunction->boundArgs[i]; } // Copy the extra args @@ -214,7 +200,8 @@ namespace Js } RecyclableObject* actualFunction = RecyclableObject::FromVar(targetFunction); - Var aReturnValue = JavascriptFunction::CallFunction(actualFunction, actualFunction->GetEntryPoint(), actualArgs); + // Number of arguments are allowed to be more than Constants::MaxAllowedArgs in runtime. Need to use the larger argcount logic for this call. + Var aReturnValue = JavascriptFunction::CallFunction(actualFunction, actualFunction->GetEntryPoint(), actualArgs, /* useLargeArgCount */ true); // // [[Construct]] and call returned a non-object @@ -228,27 +215,6 @@ namespace Js return aReturnValue; } - void BoundFunction::MarshalToScriptContext(Js::ScriptContext * scriptContext) - { - Assert(this->GetScriptContext() != scriptContext); - AssertMsg(VirtualTableInfo::HasVirtualTable(this), "Derived class need to define marshal to script context"); - VirtualTableInfo>::SetVirtualTable(this); - this->targetFunction = (RecyclableObject*)CrossSite::MarshalVar(scriptContext, this->targetFunction); - this->boundThis = (RecyclableObject*)CrossSite::MarshalVar(this->GetScriptContext(), this->boundThis); - for (uint i = 0; i < count; i++) - { - this->boundArgs[i] = CrossSite::MarshalVar(this->GetScriptContext(), this->boundArgs[i]); - } - } - -#if ENABLE_TTD - void BoundFunction::MarshalCrossSite_TTDInflate() - { - AssertMsg(VirtualTableInfo::HasVirtualTable(this), "Derived class need to define marshal"); - VirtualTableInfo>::SetVirtualTable(this); - } -#endif - JavascriptFunction * BoundFunction::GetTargetFunction() const { if (targetFunction != nullptr) @@ -437,8 +403,7 @@ namespace Js BOOL BoundFunction::DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) { - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (BuiltInPropertyRecords::length.Equals(propertyName)) + if (BuiltInPropertyRecords::length.Equals(propertyNameString)) { return false; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/BoundFunction.h b/deps/chakrashim/core/lib/Runtime/Library/BoundFunction.h index 2172a552268..9a6ff0583e3 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/BoundFunction.h +++ b/deps/chakrashim/core/lib/Runtime/Library/BoundFunction.h @@ -10,11 +10,7 @@ namespace Js { protected: DEFINE_VTABLE_CTOR(BoundFunction, JavascriptFunction); - virtual void MarshalToScriptContext(Js::ScriptContext * scriptContext) override; - -#if ENABLE_TTD - virtual void MarshalCrossSite_TTDInflate() override; -#endif + DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(BoundFunction); private: bool GetPropertyBuiltIns(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext, BOOL* result); @@ -27,7 +23,7 @@ namespace Js public: static BoundFunction* New(ScriptContext* scriptContext, ArgumentReader args); - static bool Is(Var func){ return JavascriptFunction::Is(func) && JavascriptFunction::FromVar(func)->IsBoundFunction(); } + static bool Is(Var func){ return JavascriptFunction::Is(func) && JavascriptFunction::UnsafeFromVar(func)->IsBoundFunction(); } static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...); virtual JavascriptString* GetDisplayNameImpl() const override; virtual PropertyQueryFlags HasPropertyQuery(PropertyId propertyId) override; diff --git a/deps/chakrashim/core/lib/Runtime/Library/BufferStringBuilder.h b/deps/chakrashim/core/lib/Runtime/Library/BufferStringBuilder.h index 1b153fda546..d6fd111c4e0 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/BufferStringBuilder.h +++ b/deps/chakrashim/core/lib/Runtime/Library/BufferStringBuilder.h @@ -54,7 +54,6 @@ namespace Js protected: DEFINE_VTABLE_CTOR(WritableString, JavascriptString); - DECLARE_CONCRETE_STRING_CLASS; private: WritableString(StaticType * type, charcount_t length, const char16* szValue) diff --git a/deps/chakrashim/core/lib/Runtime/Library/CMakeLists.txt b/deps/chakrashim/core/lib/Runtime/Library/CMakeLists.txt index 9cd2105d7a3..831dd24a0f4 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/CMakeLists.txt +++ b/deps/chakrashim/core/lib/Runtime/Library/CMakeLists.txt @@ -45,6 +45,8 @@ set(CRLIB_SOURCE_CODES JSONScanner.cpp JSONStack.cpp JSONString.cpp + JSONStringBuilder.cpp + JSONStringifier.cpp JavascriptArray.cpp JavascriptArrayIndexEnumerator.cpp JavascriptArrayIndexEnumeratorBase.cpp @@ -101,6 +103,8 @@ set(CRLIB_SOURCE_CODES JavascriptVariantDate.cpp JavascriptWeakMap.cpp JavascriptWeakSet.cpp + JsBuiltInEngineInterfaceExtensionObject.cpp + LazyJSONString.cpp LiteralString.cpp MathLibrary.cpp ModuleRoot.cpp diff --git a/deps/chakrashim/core/lib/Runtime/Library/Chakra.Runtime.Library.vcxproj b/deps/chakrashim/core/lib/Runtime/Library/Chakra.Runtime.Library.vcxproj index d5ad6befad6..ec4ac256214 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/Chakra.Runtime.Library.vcxproj +++ b/deps/chakrashim/core/lib/Runtime/Library/Chakra.Runtime.Library.vcxproj @@ -154,6 +154,7 @@ + @@ -168,13 +169,22 @@ + + + + + + + + + @@ -192,6 +202,9 @@ + + + @@ -332,6 +345,7 @@ true + diff --git a/deps/chakrashim/core/lib/Runtime/Library/Chakra.Runtime.Library.vcxproj.filters b/deps/chakrashim/core/lib/Runtime/Library/Chakra.Runtime.Library.vcxproj.filters index 248351f4586..93133ae957a 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/Chakra.Runtime.Library.vcxproj.filters +++ b/deps/chakrashim/core/lib/Runtime/Library/Chakra.Runtime.Library.vcxproj.filters @@ -121,6 +121,9 @@ + + + @@ -258,6 +261,15 @@ + + + + + + + + + @@ -272,6 +284,7 @@ amd64 + diff --git a/deps/chakrashim/core/lib/Runtime/Library/CompoundString.cpp b/deps/chakrashim/core/lib/Runtime/Library/CompoundString.cpp index f38b260496e..2b08dd3d8c0 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/CompoundString.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/CompoundString.cpp @@ -604,6 +604,15 @@ namespace Js } CompoundString *CompoundString::FromVar(RecyclableObject *const object) + { + AssertOrFailFast(Is(object)); + + CompoundString *const cs = static_cast(object); + Assert(!cs->IsFinalized()); + return cs; + } + + CompoundString *CompoundString::UnsafeFromVar(RecyclableObject *const object) { Assert(Is(object)); @@ -617,6 +626,11 @@ namespace Js return FromVar(RecyclableObject::FromVar(var)); } + CompoundString *CompoundString::UnsafeFromVar(const Var var) + { + return UnsafeFromVar(RecyclableObject::UnsafeFromVar(var)); + } + JavascriptString *CompoundString::GetImmutableOrScriptUnreferencedString(JavascriptString *const s) { Assert(s); @@ -626,7 +640,7 @@ namespace Js // another CompoundString, for instance). If the provided string is a CompoundString, it must not be mutated by script // code after the concatenation operation. In that case, clone the string to ensure that it is not referenced by script // code. If the clone is never handed back to script code, it effectively behaves as an immutable string. - return Is(s) ? FromVar(s)->Clone(false) : s; + return Is(s) ? UnsafeFromVar(s)->Clone(false) : s; } bool CompoundString::ShouldAppendChars(const CharCount appendCharLength) @@ -717,7 +731,7 @@ namespace Js Assert(packedSubstringInfoRef); Assert(packedSubstringInfo2Ref); - #if defined(_M_X64_OR_ARM64) + #if defined(TARGET_64) // On 64-bit architectures, two nonnegative 32-bit ints fit completely in a tagged pointer *packedSubstringInfoRef = reinterpret_cast( @@ -776,7 +790,7 @@ namespace Js const uintptr_t packedSubstringInfo = reinterpret_cast(pointer); Assert(packedSubstringInfo & 1); - #if defined(_M_X64_OR_ARM64) + #if defined(TARGET_64) // On 64-bit architectures, two nonnegative 32-bit ints fit completely in a tagged pointer Assert(!pointer2); *startIndexRef = static_cast(packedSubstringInfo >> 32); @@ -1100,7 +1114,7 @@ namespace Js Assert(pointerIndex != 0); void *pointer2 = blockPointers[--pointerIndex]; JavascriptString *s; - #if defined(_M_X64_OR_ARM64) + #if defined(TARGET_64) Assert(!IsPackedInfo(pointer2)); #else if(IsPackedInfo(pointer2)) diff --git a/deps/chakrashim/core/lib/Runtime/Library/CompoundString.h b/deps/chakrashim/core/lib/Runtime/Library/CompoundString.h index 2e9620c341b..7a14b0773dc 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/CompoundString.h +++ b/deps/chakrashim/core/lib/Runtime/Library/CompoundString.h @@ -341,7 +341,9 @@ namespace Js static bool Is(RecyclableObject *const object); static bool Is(const Var var); static CompoundString *FromVar(RecyclableObject *const object); + static CompoundString *UnsafeFromVar(RecyclableObject *const object); static CompoundString *FromVar(const Var var); + static CompoundString *UnsafeFromVar(const Var var); static size_t GetOffsetOfOwnsLastBlock() { return offsetof(CompoundString, ownsLastBlock); } static size_t GetOffsetOfDirectCharLength() { return offsetof(CompoundString, directCharLength); } static size_t GetOffsetOfLastBlockInfo() { return offsetof(CompoundString, lastBlockInfo); } @@ -428,7 +430,6 @@ namespace Js protected: DEFINE_VTABLE_CTOR(CompoundString, LiteralString); - DECLARE_CONCRETE_STRING_CLASS; private: PREVENT_COPY(CompoundString); diff --git a/deps/chakrashim/core/lib/Runtime/Library/ConcatString.cpp b/deps/chakrashim/core/lib/Runtime/Library/ConcatString.cpp index 659023f3995..ac985f54ef4 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ConcatString.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ConcatString.cpp @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeLibraryPch.h" - +#include "Codex/Utf8Helper.h" namespace Js @@ -13,8 +13,113 @@ namespace Js // Note: see also: ConcatString.inl LiteralStringWithPropertyStringPtr::LiteralStringWithPropertyStringPtr(StaticType* stringType) : LiteralString(stringType), - propertyString(nullptr) + propertyString(nullptr), + propertyRecord(nullptr) + { + } + + LiteralStringWithPropertyStringPtr::LiteralStringWithPropertyStringPtr(const char16 * wString, + const CharCount stringLength, JavascriptLibrary *const library) : + LiteralString(library->GetStringTypeStatic(), wString, stringLength), + propertyString(nullptr), + propertyRecord(nullptr) + { + } + + JavascriptString * LiteralStringWithPropertyStringPtr:: + NewFromWideString(const char16 * wideString, const CharCount charCount, JavascriptLibrary *const library) + { + Assert(library != nullptr && wideString != nullptr); + + switch (charCount) + { + case 0: + { + JavascriptString * emptyString = library->GetEmptyString(); + AssertMsg(VirtualTableInfo::HasVirtualTable(emptyString), + "Library::GetEmptyString is no longer LiteralStringWithPropertyStringPtr ?"); + return emptyString; + } + case 1: + { + return library->GetCharStringCache().GetStringForChar((char16(*wideString))); + } + default: + break; + } + + Recycler * recycler = library->GetRecycler(); + ScriptContext * scriptContext = library->GetScriptContext(); + char16* destString = RecyclerNewArrayLeaf(recycler, WCHAR, charCount + 1); + + if (destString == nullptr) + { + Js::JavascriptError::ThrowOutOfMemoryError(scriptContext); + } + + js_wmemcpy_s(destString, charCount, wideString, charCount); + destString[charCount] = char16(0); + + return (JavascriptString*) RecyclerNew(library->GetRecycler(), LiteralStringWithPropertyStringPtr, destString, charCount, library); + } + + JavascriptString * LiteralStringWithPropertyStringPtr::CreateEmptyString(JavascriptLibrary *const library) + { + return (JavascriptString*) RecyclerNew(library->GetRecycler(), LiteralStringWithPropertyStringPtr, _u(""), 0, library); + } + + JavascriptString * LiteralStringWithPropertyStringPtr:: + NewFromCString(const char * cString, const CharCount charCount, JavascriptLibrary *const library) { + Assert(library != nullptr && cString != nullptr); + + switch (charCount) + { + case 0: + { + JavascriptString * emptyString = library->GetEmptyString(); + AssertMsg(VirtualTableInfo::HasVirtualTable(emptyString), + "Library::GetEmptyString is no longer LiteralStringWithPropertyStringPtr ?"); + return (LiteralStringWithPropertyStringPtr*) emptyString; + } + case 1: + { + // If the high bit of the byte is set, it cannot be a complete utf8 codepoint, so fall back to the unicode replacement char + if ((*cString & 0x80) != 0x80) + { + return library->GetCharStringCache().GetStringForChar((char16(*cString))); + } + else + { + return library->GetCharStringCache().GetStringForChar(0xFFFD); + } + } + default: + break; + } + + ScriptContext * scriptContext = library->GetScriptContext(); + size_t cbDestString = (charCount + 1) * sizeof(WCHAR); + if ((CharCount)cbDestString < charCount) // overflow + { + Js::JavascriptError::ThrowOutOfMemoryError(scriptContext); + } + + Recycler * recycler = library->GetRecycler(); + char16* destString = RecyclerNewArrayLeaf(recycler, WCHAR, cbDestString); + if (destString == nullptr) + { + Js::JavascriptError::ThrowOutOfMemoryError(scriptContext); + } + + HRESULT result = utf8::NarrowStringToWideNoAlloc(cString, charCount, destString, charCount + 1, &cbDestString); + + if (result == S_OK) + { + return (JavascriptString*) RecyclerNew(library->GetRecycler(), LiteralStringWithPropertyStringPtr, destString, (CharCount)cbDestString, library); + } + + Js::JavascriptError::ThrowOutOfMemoryError(scriptContext); } PropertyString * LiteralStringWithPropertyStringPtr::GetPropertyString() const @@ -22,9 +127,60 @@ namespace Js return this->propertyString; } + PropertyString * LiteralStringWithPropertyStringPtr::GetOrAddPropertyString() + { + if (this->propertyString != nullptr) + { + return this->propertyString; + } + + ScriptContext * scriptContext = this->GetScriptContext(); + + if (this->propertyRecord == nullptr) + { + scriptContext->GetOrAddPropertyRecord(this->GetSz(), static_cast(this->GetLength()), + (Js::PropertyRecord const **)&(this->propertyRecord)); + } + + this->propertyString = scriptContext->GetPropertyString(propertyRecord->GetPropertyId()); + return this->propertyString; + } + void LiteralStringWithPropertyStringPtr::SetPropertyString(PropertyString * propStr) { this->propertyString = propStr; + if (propStr != nullptr) + { + this->propertyRecord = propStr->GetPropertyRecord(); + } + } + + /* static */ + bool LiteralStringWithPropertyStringPtr::Is(RecyclableObject * obj) + { + return VirtualTableInfo::HasVirtualTable(obj); + } + + /* static */ + bool LiteralStringWithPropertyStringPtr::Is(Var var) + { + return RecyclableObject::Is(var) && LiteralStringWithPropertyStringPtr::Is(RecyclableObject::UnsafeFromVar(var)); + } + + Js::PropertyRecord const * LiteralStringWithPropertyStringPtr::GetPropertyRecord(bool dontLookupFromDictionary) + { + ScriptContext * scriptContext = this->GetScriptContext(); + + if (this->propertyRecord == nullptr && !dontLookupFromDictionary) + { + Js::PropertyRecord const * localPropertyRecord; + scriptContext->GetOrAddPropertyRecord(this->GetSz(), + static_cast(this->GetLength()), + &localPropertyRecord); + this->propertyRecord = localPropertyRecord; + } + + return this->propertyRecord; } /////////////////////// ConcatStringBase ////////////////////////// @@ -350,6 +506,13 @@ namespace Js ConcatStringMulti * ConcatStringMulti::FromVar(Var var) + { + AssertOrFailFast(ConcatStringMulti::Is(var)); + return static_cast(var); + } + + ConcatStringMulti * + ConcatStringMulti::UnsafeFromVar(Var var) { Assert(ConcatStringMulti::Is(var)); return static_cast(var); diff --git a/deps/chakrashim/core/lib/Runtime/Library/ConcatString.h b/deps/chakrashim/core/lib/Runtime/Library/ConcatString.h index 06dd27f1801..9790c1b49b7 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ConcatString.h +++ b/deps/chakrashim/core/lib/Runtime/Library/ConcatString.h @@ -9,20 +9,37 @@ namespace Js class LiteralStringWithPropertyStringPtr : public LiteralString { private: - Field(PropertyString *) propertyString; + Field(PropertyString*) propertyString; + Field(const Js::PropertyRecord*) propertyRecord; public: + virtual Js::PropertyRecord const * GetPropertyRecord(bool dontLookupFromDictionary = false) override; + bool HasPropertyRecord() const { return propertyRecord != nullptr; } + PropertyString * GetPropertyString() const; + PropertyString * GetOrAddPropertyString(); // Get if it's there, otherwise bring it in. void SetPropertyString(PropertyString * propStr); template static LiteralStringWithPropertyStringPtr * ConvertString(StringType * originalString); static uint GetOffsetOfPropertyString() { return offsetof(LiteralStringWithPropertyStringPtr, propertyString); } + static bool Is(Var var); + static bool Is(RecyclableObject* var); + template static LiteralStringWithPropertyStringPtr* TryFromVar(T var); + + static JavascriptString * + NewFromCString(const char * cString, const CharCount charCount, JavascriptLibrary *const library); + + static JavascriptString * + NewFromWideString(const char16 * wString, const CharCount charCount, JavascriptLibrary *const library); + + static JavascriptString * CreateEmptyString(JavascriptLibrary *const library); protected: LiteralStringWithPropertyStringPtr(StaticType* stringTypeStatic); + LiteralStringWithPropertyStringPtr(const char16 * wString, const CharCount stringLength, JavascriptLibrary *const library); + DEFINE_VTABLE_CTOR(LiteralStringWithPropertyStringPtr, LiteralString); - DECLARE_CONCRETE_STRING_CLASS; public: virtual VTableValue DummyVirtualFunctionToHinderLinkerICF() @@ -31,6 +48,18 @@ namespace Js } }; + // Templated so that the Is call dispatchs to different function depending + // on if argument is already a RecyclableObject* or only known to be a Var + // + // In case it is known to be a RecyclableObject*, the Is call skips that check + template + inline LiteralStringWithPropertyStringPtr * LiteralStringWithPropertyStringPtr::TryFromVar(T var) + { + return LiteralStringWithPropertyStringPtr::Is(var) + ? reinterpret_cast(var) + : nullptr; + } + // Base class for concat strings. // Concat string is a virtual string, or a non-leaf node in concat string tree. // It does not hold characters by itself but has one or more child nodes. @@ -80,7 +109,6 @@ namespace Js protected: ConcatStringN(StaticType* stringTypeStatic, bool doZeroSlotsAndLength = true); DEFINE_VTABLE_CTOR(ConcatStringN, ConcatStringBase); - DECLARE_CONCRETE_STRING_CLASS; virtual void CopyVirtual(_Out_writes_(m_charLength) char16 *const buffer, StringCopyInfoStack &nestedStringTreeCopyInfos, const byte recursionDepth) override { @@ -111,7 +139,6 @@ namespace Js ConcatString(JavascriptString* a, JavascriptString* b); protected: DEFINE_VTABLE_CTOR(ConcatString, ConcatStringN<2>); - DECLARE_CONCRETE_STRING_CLASS; public: static ConcatString* New(JavascriptString* a, JavascriptString* b); static const int MaxDepth = 1000; @@ -141,7 +168,6 @@ namespace Js protected: DEFINE_VTABLE_CTOR(ConcatStringBuilder, ConcatStringBase); - DECLARE_CONCRETE_STRING_CLASS; virtual void CopyVirtual(_Out_writes_(m_charLength) char16 *const buffer, StringCopyInfoStack &nestedStringTreeCopyInfos, const byte recursionDepth) override sealed; public: @@ -174,7 +200,6 @@ namespace Js protected: DEFINE_VTABLE_CTOR(ConcatStringWrapping, ConcatStringBase); - DECLARE_CONCRETE_STRING_CLASS; virtual void CopyVirtual(_Out_writes_(m_charLength) char16 *const buffer, StringCopyInfoStack &nestedStringTreeCopyInfos, const byte recursionDepth) override sealed { const_cast(this)->EnsureAllSlots(); @@ -204,7 +229,7 @@ namespace Js }; // Make sure the padding doesn't add tot he size of ConcatStringWrapping -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) CompileAssert(sizeof(ConcatStringWrapping<_u('"'), _u('"')>) == 64); #else CompileAssert(sizeof(ConcatStringWrapping<_u('"'), _u('"')>) == 32); @@ -223,7 +248,6 @@ namespace Js protected: ConcatStringMulti(uint slotCount, JavascriptString * a1, JavascriptString * a2, StaticType* stringTypeStatic); DEFINE_VTABLE_CTOR(ConcatStringMulti, ConcatStringBase); - DECLARE_CONCRETE_STRING_CLASS; virtual void CopyVirtual(_Out_writes_(m_charLength) char16 *const buffer, StringCopyInfoStack &nestedStringTreeCopyInfos, const byte recursionDepth) override { @@ -242,6 +266,7 @@ namespace Js const char16 * GetSz() override sealed; static bool Is(Var var); static ConcatStringMulti * FromVar(Var value); + static ConcatStringMulti * UnsafeFromVar(Var value); static size_t GetAllocSize(uint slotCount); void SetItem(_In_range_(0, slotCount - 1) uint index, JavascriptString* value); @@ -249,7 +274,8 @@ namespace Js static uint32 GetOffsetOfSlots() { return offsetof(ConcatStringMulti, m_slots); } protected: Field(uint) slotCount; - Field(uint) __alignment; + Field(uint) __alignment; + Field(size_t) __alignmentPTR; Field(JavascriptString*) m_slots[]; // These contain the child nodes. #if DBG @@ -264,5 +290,3 @@ namespace Js } }; } - - diff --git a/deps/chakrashim/core/lib/Runtime/Library/CustomExternalIterator.cpp b/deps/chakrashim/core/lib/Runtime/Library/CustomExternalIterator.cpp index 941f5b32004..2bfc8053629 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/CustomExternalIterator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/CustomExternalIterator.cpp @@ -147,9 +147,15 @@ namespace Js } CustomExternalIterator* CustomExternalIterator::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'ExternalIterator'"); + return static_cast(aValue); + } + + CustomExternalIterator* CustomExternalIterator::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'ExternalIterator'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var CustomExternalIterator::CreateNextFunction(JavascriptLibrary *library, JavascriptTypeId typeId) diff --git a/deps/chakrashim/core/lib/Runtime/Library/CustomExternalIterator.h b/deps/chakrashim/core/lib/Runtime/Library/CustomExternalIterator.h index 32b6179fd9e..8f1deb7715d 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/CustomExternalIterator.h +++ b/deps/chakrashim/core/lib/Runtime/Library/CustomExternalIterator.h @@ -51,6 +51,15 @@ namespace Js Field(Var) m_prototypeForIterator; friend class JavascriptLibrary; +#if ENABLE_TTD + public: + //virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override; + + virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override { + return TTD::NSSnapObjects::SnapObjectType::Invalid; + } + //virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override; +#endif }; class JavascriptExternalIteratorNextFunction : public RuntimeFunction @@ -70,6 +79,15 @@ namespace Js static JavascriptExternalIteratorNextFunction* CreateFunction(JavascriptLibrary *library, JavascriptTypeId typeId, JavascriptMethod entryPoint); friend class JavascriptLibrary; +#if ENABLE_TTD + public: + //virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override; + + virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override { + return TTD::NSSnapObjects::SnapObjectType::Invalid; + } + //virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override; +#endif }; class CustomExternalIterator : public DynamicObject @@ -88,6 +106,7 @@ namespace Js static bool Is(Var aValue); static CustomExternalIterator* FromVar(Var aValue); + static CustomExternalIterator* UnsafeFromVar(Var aValue); static Var CreateNextFunction(JavascriptLibrary *library, JavascriptTypeId typeId); static Var EntryNext(RecyclableObject* function, CallInfo callInfo, ...); }; diff --git a/deps/chakrashim/core/lib/Runtime/Library/DataView.cpp b/deps/chakrashim/core/lib/Runtime/Library/DataView.cpp index 1d87b7a32eb..487ca8fd501 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/DataView.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/DataView.cpp @@ -18,9 +18,8 @@ namespace Js AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); uint32 byteLength = 0; uint32 mappedLength; int32 offset = 0; diff --git a/deps/chakrashim/core/lib/Runtime/Library/DataView.h b/deps/chakrashim/core/lib/Runtime/Library/DataView.h index a5dad2a1f70..38e1dcb97e3 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/DataView.h +++ b/deps/chakrashim/core/lib/Runtime/Library/DataView.h @@ -44,6 +44,12 @@ namespace Js static BOOL Is(Var aValue); static inline DataView* FromVar(Var aValue) + { + AssertOrFailFast(DataView::Is(aValue)); + return static_cast(aValue); + } + + static inline DataView* UnsafeFromVar(Var aValue) { Assert(DataView::Is(aValue)); return static_cast(aValue); diff --git a/deps/chakrashim/core/lib/Runtime/Library/DateImplementation.cpp b/deps/chakrashim/core/lib/Runtime/Library/DateImplementation.cpp index ad335264f36..b5bb8620107 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/DateImplementation.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/DateImplementation.cpp @@ -402,14 +402,15 @@ namespace Js { bs->AppendChars(_u(' ')); // Add the year. - if (pymd->year > 0) + if ((pymd->year) > 0) { - bs->AppendChars(pymd->year, 10, ConvertLongToString); + bs->AppendChars(pymd->year, 10, ConvertUInt32ToString_ZeroPad_4); } else { - bs->AppendChars(1 - pymd->year, 10, ConvertLongToString); - bs->AppendChars(_u(" B.C.")); + int positiveYear = -(pymd->year); // pymd->year is negative + bs->AppendChars(_u('-')); + bs->AppendChars(positiveYear, 10, ConvertUInt32ToString_ZeroPad_4); } // Add the time. @@ -1032,6 +1033,7 @@ namespace Js { ssNil, ssMinutes, ssSeconds, + ssMillisecond, ssAddOffset, ssSubOffset, ssDate, @@ -1041,6 +1043,7 @@ namespace Js { char16 *pchBase; char16 *pch; + char16 *pchEndOfDigits = nullptr; char16 ch; char16 *pszSrc = nullptr; @@ -1052,6 +1055,7 @@ namespace Js { int32 lwMonth = lwNil; int32 lwDate = lwNil; int32 lwTime = lwNil; + int32 lwMillisecond = lwNil; int32 lwZone = lwNil; int32 lwOffset = lwNil; @@ -1159,8 +1163,8 @@ namespace Js { // military version of time zone // z = GMT // j isn't used - // a to m are -1 to -12 - // n to y are 1 to 12 + // a to m are 1 to 12 + // n to y are -1 to -12 if (lwNil != lwZone) { goto LError; @@ -1171,11 +1175,11 @@ namespace Js { { goto LError; } - lwZone = -(int32)(ch - 'a' + (ch < 'j')) * 60; + lwZone = (int32)(ch - 'a' + (ch < 'j')) * 60; } else if (ch <= 'y') { - lwZone = (int32)(ch - 'm') * 60; + lwZone = -(int32)(ch - 'm') * 60; } else if (ch == 'z') { @@ -1257,15 +1261,15 @@ namespace Js { for (lwT = ch - '0'; !FBig(*pch) && isdigit(*pch); pch++) { + // to avoid overflow + if (pch - pchBase > 6) + { + goto LError; + } lwT = lwT * 10 + *pch - '0'; } - // to avoid overflow - if (pch - pchBase > 6) - { - goto LError; - } - + pchEndOfDigits = pch; // skip to the next real character while (0 != (ch = *pch) && (ch <= ' ' || classifier->IsBiDirectionalChar(ch))) { @@ -1306,6 +1310,35 @@ namespace Js { if (lwT >= 60) goto LError; lwTime += lwT; + ss = (ch == '.') ? (pch++, ssMillisecond) : ssNil; + break; + } + case ssMillisecond: + { + AssertMsg(isNextFieldDateNegativeVersion5 == false, "isNextFieldDateNegativeVersion5 == false"); + + size_t numOfDigits = static_cast(pchEndOfDigits - pchBase); + if (numOfDigits <= 1) + { + // 1 digit only, treat it as hundreds + lwMillisecond = lwT * 100; + } + else if (numOfDigits <= 2) + { + // 2 digit only, treat it as tens + lwMillisecond = lwT * 10; + } + else if (numOfDigits <= 3) + { + // canonical 3 digit, per EcmaScript spec + lwMillisecond = lwT; + } + else + { + // ignore any digits beyond the third + lwMillisecond = (pchBase[0] - '0') * 100 + (pchBase[1] - '0') * 10 + (pchBase[2] - '0'); + } + ss = ssNil; break; } @@ -1451,7 +1484,9 @@ namespace Js { continue; } - if (lwNil == lwYear || lwNil == lwMonth || lwNil == lwDate) + if (lwNil == lwYear || + lwNil == lwMonth || lwMonth > 11 || + lwNil == lwDate || lwDate > 31) { goto LError; } @@ -1464,6 +1499,10 @@ namespace Js { lwYear = -lwYear + 1; } } + else if (lwYear < 50 && isDateNegativeVersion5 == false) + { + lwYear += 2000; + } else if (lwYear < 100 && isDateNegativeVersion5 == false) { lwYear += 1900; @@ -1504,6 +1543,11 @@ namespace Js { lwTime = 0; } + if (lwNil == lwMillisecond) + { + lwMillisecond = 0; + } + if (lwNil != lwZone) { lwTime -= lwZone * 60; @@ -1519,7 +1563,7 @@ namespace Js { } // Rebuild time. - tv = TvFromDate(lwYear, lwMonth, lwDate - 1, (double)lwTime * 1000); + tv = TvFromDate(lwYear, lwMonth, lwDate - 1, (double)lwTime * 1000 + lwMillisecond); if (!fUtc) { tv = GetTvUtc(tv, scriptContext); diff --git a/deps/chakrashim/core/lib/Runtime/Library/DateImplementation.h b/deps/chakrashim/core/lib/Runtime/Library/DateImplementation.h index ef46cb6d085..0a6f2093c28 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/DateImplementation.h +++ b/deps/chakrashim/core/lib/Runtime/Library/DateImplementation.h @@ -382,6 +382,40 @@ namespace Js { return GetDateDefaultString(&ymd, &tzd, DateTimeFlag::None, scriptContext, newStringBuilder); } + const auto ConvertUInt32ToString_ZeroPad_4 = [](const uint32 value, char16 *const buffer, const CharCount charCapacity) + { + Assert(charCapacity >= 4); + if (value < 10) + { + buffer[0] = _u('0'); + buffer[1] = _u('0'); + buffer[2] = _u('0'); + buffer[3] = static_cast(value + _u('0')); + buffer[4] = 0; + } + else if (value < 100) + { + buffer[0] = _u('0'); + buffer[1] = _u('0'); + buffer[2] = static_cast((value / 10) + _u('0')); + buffer[3] = static_cast((value % 10) + _u('0')); + buffer[4] = 0; + } + else if (value < 1000) + { + buffer[0] = _u('0'); + buffer[1] = static_cast((value / 100) + _u('0')); + buffer[2] = static_cast(((value / 10) % 10) + _u('0')); + buffer[3] = static_cast((value % 10) + _u('0')); + buffer[4] = 0; + } + else + { + const errno_t err = _ultow_s(value, buffer, charCapacity, 10); + Assert(err == 0); + } + }; + // // Get default date string, shared with hybrid debugging. // StringBuilder: A Js::StringBuilder/CompoundString like class, used to build strings. @@ -418,7 +452,16 @@ namespace Js { bs->AppendChars(_u(' ')); // year is directly after day, month, daydigit for IE11+ - bs->AppendChars(pymd->year, 10, ConvertLongToString); + if ((pymd->year) > 0) + { + bs->AppendChars(pymd->year, 10, ConvertUInt32ToString_ZeroPad_4); + } + else + { + int positiveYear = -(pymd->year); // pymd->year is negative + bs->AppendChars(_u('-')); + bs->AppendChars(positiveYear, 10, ConvertUInt32ToString_ZeroPad_4); + } if(!(noDateTime & DateTimeFlag::NoTime)) { diff --git a/deps/chakrashim/core/lib/Runtime/Library/ES5Array.cpp b/deps/chakrashim/core/lib/Runtime/Library/ES5Array.cpp index 9cd81cb5db7..acac3883d11 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ES5Array.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ES5Array.cpp @@ -19,6 +19,12 @@ namespace Js } ES5Array* ES5Array::FromVar(Var instance) + { + AssertOrFailFast(Is(instance)); + return static_cast(instance); + } + + ES5Array* ES5Array::UnsafeFromVar(Var instance) { Assert(Is(instance)); return static_cast(instance); diff --git a/deps/chakrashim/core/lib/Runtime/Library/ES5Array.h b/deps/chakrashim/core/lib/Runtime/Library/ES5Array.h index e71e4af089e..90fd7f0d857 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ES5Array.h +++ b/deps/chakrashim/core/lib/Runtime/Library/ES5Array.h @@ -41,6 +41,7 @@ namespace Js public: static bool Is(Var instance); static ES5Array* FromVar(Var instance); + static ES5Array* UnsafeFromVar(Var instance); static uint32 ToLengthValue(Var value, ScriptContext* scriptContext); bool IsLengthWritable() const; diff --git a/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObject.cpp index e169dc49be6..f9a589ff8dc 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObject.cpp @@ -4,7 +4,7 @@ //------------------------------------------------------------------------------------------------------- #include "RuntimeLibraryPch.h" -#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_PROJECTION) +#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS) || defined(ENABLE_PROJECTION) #include "errstr.h" #include "Library/EngineInterfaceObject.h" @@ -92,6 +92,12 @@ namespace Js { Assert(engineExtensions[extensionKind] == nullptr); engineExtensions[extensionKind] = extensionObject; + + // Init the extensionObject if this was already initialized + if (this->IsInitialized()) + { + extensionObject->Initialize(); + } } } @@ -101,12 +107,12 @@ namespace Js #ifndef GlobalBuiltIn #define GlobalBuiltIn(global, method) \ - NoProfileFunctionInfo EngineInterfaceObject::EntryInfo::Intl_BuiltIn_##global##_##method##(FORCE_NO_WRITE_BARRIER_TAG(global##::##method##)); \ + NoProfileFunctionInfo EngineInterfaceObject::EntryInfo::BuiltIn_##global##_##method##(FORCE_NO_WRITE_BARRIER_TAG(global##::##method##)); \ #define GlobalBuiltInConstructor(global) #define BuiltInRaiseException(exceptionType, exceptionID) \ - NoProfileFunctionInfo EngineInterfaceObject::EntryInfo::Intl_BuiltIn_raise##exceptionID(FORCE_NO_WRITE_BARRIER_TAG(EngineInterfaceObject::EntryIntl_BuiltIn_raise##exceptionID)); \ + NoProfileFunctionInfo EngineInterfaceObject::EntryInfo::BuiltIn_raise##exceptionID(FORCE_NO_WRITE_BARRIER_TAG(EngineInterfaceObject::Entry_BuiltIn_raise##exceptionID)); \ #define BuiltInRaiseException1(exceptionType, exceptionID) BuiltInRaiseException(exceptionType, exceptionID) #define BuiltInRaiseException2(exceptionType, exceptionID) BuiltInRaiseException(exceptionType, exceptionID) @@ -139,11 +145,17 @@ namespace Js EngineInterfaceObject* EngineInterfaceObject::FromVar(Var aValue) { - AssertMsg(Is(aValue), "aValue is actually an EngineInterfaceObject"); + AssertOrFailFastMsg(Is(aValue), "aValue is actually an EngineInterfaceObject"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } + EngineInterfaceObject* EngineInterfaceObject::UnsafeFromVar(Var aValue) + { + AssertMsg(Is(aValue), "aValue is actually an EngineInterfaceObject"); + + return static_cast(aValue); + } void EngineInterfaceObject::Initialize() { Recycler* recycler = this->GetRecycler(); @@ -192,17 +204,16 @@ namespace Js { typeHandler->Convert(commonNativeInterfaces, mode, 38); - ScriptContext* scriptContext = commonNativeInterfaces->GetScriptContext(); - JavascriptLibrary* library = scriptContext->GetLibrary(); + JavascriptLibrary* library = commonNativeInterfaces->GetScriptContext()->GetLibrary(); #ifndef GlobalBuiltIn #define GlobalBuiltIn(global, method) \ - library->AddFunctionToLibraryObject(commonNativeInterfaces, Js::PropertyIds::builtIn##global##method, &EngineInterfaceObject::EntryInfo::Intl_BuiltIn_##global##_##method##, 1); \ + library->AddFunctionToLibraryObject(commonNativeInterfaces, Js::PropertyIds::builtIn##global##method, &EngineInterfaceObject::EntryInfo::BuiltIn_##global##_##method##, 1); \ #define GlobalBuiltInConstructor(global) SetPropertyOn(commonNativeInterfaces, Js::PropertyIds::##global##, library->Get##global##Constructor()); #define BuiltInRaiseException(exceptionType, exceptionID) \ - library->AddFunctionToLibraryObject(commonNativeInterfaces, Js::PropertyIds::raise##exceptionID, &EngineInterfaceObject::EntryInfo::Intl_BuiltIn_raise##exceptionID, 1); \ + library->AddFunctionToLibraryObject(commonNativeInterfaces, Js::PropertyIds::raise##exceptionID, &EngineInterfaceObject::EntryInfo::BuiltIn_raise##exceptionID, 1); \ #define BuiltInRaiseException1(exceptionType, exceptionID) BuiltInRaiseException(exceptionType, exceptionID) #define BuiltInRaiseException2(exceptionType, exceptionID) BuiltInRaiseException(exceptionType, exceptionID) @@ -326,7 +337,7 @@ namespace Js #define GlobalBuiltInConstructor(global) #define BuiltInRaiseException(exceptionType, exceptionID) \ - Var EngineInterfaceObject::EntryIntl_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...) \ + Var EngineInterfaceObject::Entry_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...) \ { \ EngineInterfaceObject_CommonFunctionProlog(function, callInfo); \ \ @@ -334,7 +345,7 @@ namespace Js } #define BuiltInRaiseException1(exceptionType, exceptionID) \ - Var EngineInterfaceObject::EntryIntl_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...) \ + Var EngineInterfaceObject::Entry_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...) \ { \ EngineInterfaceObject_CommonFunctionProlog(function, callInfo); \ \ @@ -347,7 +358,7 @@ namespace Js } #define BuiltInRaiseException2(exceptionType, exceptionID) \ - Var EngineInterfaceObject::EntryIntl_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...) \ + Var EngineInterfaceObject::Entry_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...) \ { \ EngineInterfaceObject_CommonFunctionProlog(function, callInfo); \ \ @@ -360,7 +371,7 @@ namespace Js } #define BuiltInRaiseException3(exceptionType, exceptionID) \ - Var EngineInterfaceObject::EntryIntl_BuiltIn_raise##exceptionID##_3(RecyclableObject *function, CallInfo callInfo, ...) \ + Var EngineInterfaceObject::Entry_BuiltIn_raise##exceptionID##_3(RecyclableObject *function, CallInfo callInfo, ...) \ { \ EngineInterfaceObject_CommonFunctionProlog(function, callInfo); \ \ @@ -383,4 +394,4 @@ namespace Js #endif } -#endif // ENABLE_INTL_OBJECT || ENABLE_PROJECTION +#endif // ENABLE_INTL_OBJECT || ENABLE_JS_BUILTINS || ENABLE_PROJECTION diff --git a/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObject.h b/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObject.h index 92f94e07453..38640f6a2cf 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObject.h +++ b/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObject.h @@ -4,7 +4,7 @@ //------------------------------------------------------------------------------------------------------- #pragma once -#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_PROJECTION) +#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS) || defined(ENABLE_PROJECTION) namespace Js { @@ -12,8 +12,9 @@ namespace Js enum EngineInterfaceExtensionKind { - EngineInterfaceExtensionKind_Intl = 0, - EngineInterfaceExtensionKind_WinRTPromise = 1, + EngineInterfaceExtensionKind_JsBuiltIn = 0, + EngineInterfaceExtensionKind_Intl = 1, + EngineInterfaceExtensionKind_WinRTPromise = 2, MaxEngineInterfaceExtensionKind = EngineInterfaceExtensionKind_WinRTPromise }; @@ -24,10 +25,13 @@ namespace Js extensionKind(kind), scriptContext(context) { + hasBytecode = false; } EngineInterfaceExtensionKind GetExtensionKind() const { return extensionKind; } ScriptContext* GetScriptContext() const { return scriptContext; } + bool GetHasByteCode() const { return hasBytecode; } + void SetHasBytecode() { hasBytecode = true; } virtual void Initialize() = 0; #if DBG virtual void DumpByteCode() = 0; @@ -36,6 +40,7 @@ namespace Js protected: Field(EngineInterfaceExtensionKind) extensionKind; Field(ScriptContext*) scriptContext; + Field(bool) hasBytecode; }; #define EngineInterfaceObject_CommonFunctionProlog(function, callInfo) \ @@ -57,7 +62,10 @@ namespace Js Field(EngineExtensionObjectBase*) engineExtensions[MaxEngineInterfaceExtensionKind + 1]; public: - EngineInterfaceObject(DynamicType * type) : DynamicObject(type) {} + EngineInterfaceObject(DynamicType * type) + : DynamicObject(type), commonNativeInterfaces(nullptr), engineExtensions() + {} + DynamicObject* GetCommonNativeInterfaces() const { return commonNativeInterfaces; } EngineExtensionObjectBase* GetEngineExtension(EngineInterfaceExtensionKind extensionKind) const; void SetEngineExtension(EngineInterfaceExtensionKind extensionKind, EngineExtensionObjectBase* extensionObject); @@ -65,6 +73,7 @@ namespace Js static EngineInterfaceObject* New(Recycler * recycler, DynamicType * type); static bool Is(Var aValue); static EngineInterfaceObject* FromVar(Var aValue); + static EngineInterfaceObject* UnsafeFromVar(Var aValue); #if ENABLE_TTD virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override; @@ -75,6 +84,7 @@ namespace Js #endif void Initialize(); + bool IsInitialized() const { return commonNativeInterfaces != nullptr; } static bool __cdecl InitializeCommonNativeInterfaces(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); @@ -88,12 +98,12 @@ namespace Js #ifndef GlobalBuiltIn #define GlobalBuiltIn(global, method) \ - static NoProfileFunctionInfo Intl_BuiltIn_##global##_##method##; \ + static NoProfileFunctionInfo BuiltIn_##global##_##method##; \ #define GlobalBuiltInConstructor(global) #define BuiltInRaiseException(exceptionType, exceptionID) \ - static NoProfileFunctionInfo Intl_BuiltIn_raise##exceptionID; + static NoProfileFunctionInfo BuiltIn_raise##exceptionID; #define BuiltInRaiseException1(exceptionType, exceptionID) BuiltInRaiseException(exceptionType, exceptionID) #define BuiltInRaiseException2(exceptionType, exceptionID) BuiltInRaiseException(exceptionType, exceptionID) @@ -123,7 +133,7 @@ namespace Js #define GlobalBuiltInConstructor(global) #define BuiltInRaiseException(exceptionType, exceptionID) \ - static Var EntryIntl_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...); + static Var Entry_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...); #define BuiltInRaiseException1(exceptionType, exceptionID) BuiltInRaiseException(exceptionType, exceptionID) #define BuiltInRaiseException2(exceptionType, exceptionID) BuiltInRaiseException(exceptionType, exceptionID) @@ -142,4 +152,4 @@ namespace Js }; } -#endif // ENABLE_INTL_OBJECT || ENABLE_PROJECTION +#endif // ENABLE_INTL_OBJECT || ENABLE_JS_BUILTINS || ENABLE_PROJECTION diff --git a/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObjectBuiltIns.h b/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObjectBuiltIns.h index c3e75c5fc00..21022099cef 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObjectBuiltIns.h +++ b/deps/chakrashim/core/lib/Runtime/Library/EngineInterfaceObjectBuiltIns.h @@ -23,9 +23,9 @@ GlobalBuiltIn(JavascriptObject, EntryGetOwnPropertyNames) GlobalBuiltIn(JavascriptObject, EntryHasOwnProperty) GlobalBuiltIn(JavascriptArray, EntryForEach) -GlobalBuiltIn(JavascriptArray, EntryIndexOf) GlobalBuiltIn(JavascriptArray, EntryPush) GlobalBuiltIn(JavascriptArray, EntryJoin) +GlobalBuiltIn(JavascriptArray, EntryIndexOf) GlobalBuiltIn(JavascriptFunction, EntryBind) GlobalBuiltIn(JavascriptDate, EntryGetDate) diff --git a/deps/chakrashim/core/lib/Runtime/Library/ForInObjectEnumerator.cpp b/deps/chakrashim/core/lib/Runtime/Library/ForInObjectEnumerator.cpp index 6d245e6e95a..e5d15011239 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ForInObjectEnumerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ForInObjectEnumerator.cpp @@ -102,7 +102,7 @@ namespace Js } if (!DynamicType::Is(firstPrototypeWithEnumerableProperties->GetTypeId()) - || !DynamicObject::FromVar(firstPrototypeWithEnumerableProperties)->GetHasNoEnumerableProperties()) + || !DynamicObject::UnsafeFromVar(firstPrototypeWithEnumerableProperties)->GetHasNoEnumerableProperties()) { break; } @@ -152,7 +152,7 @@ namespace Js } JavascriptString * ForInObjectEnumerator::MoveAndGetNext(PropertyId& propertyId) - { + { PropertyRecord const * propRecord; PropertyAttributes attributes = PropertyNone; @@ -184,24 +184,16 @@ namespace Js // Property Id does not exist. if (propertyId == Constants::NoProperty) { - if (VirtualTableInfo::HasVirtualTable(currentIndex)) - { - // If we have a property string, it is assumed that the propertyId is being - // kept alive with the object - PropertyString * propertyString = (PropertyString *)currentIndex; - propertyId = propertyString->GetPropertyRecord()->GetPropertyId(); - } - else + propRecord = currentIndex->GetPropertyRecord(true); + if (propRecord == nullptr) { - ScriptContext* scriptContext = currentIndex->GetScriptContext(); - scriptContext->GetOrAddPropertyRecord(currentIndex, &propRecord); - propertyId = propRecord->GetPropertyId(); - + propRecord = currentIndex->GetPropertyRecord(false); // will create // We keep the track of what is enumerated using a bit vector of propertyID. // so the propertyId can't be collected until the end of the for in enumerator // Keep a list of the property string. this->shadowData->newPropertyStrings.Prepend(GetScriptContext()->GetRecycler(), propRecord); } + propertyId = propRecord->GetPropertyId(); } if (TestAndSetEnumerated(propertyId) //checks if the property is already enumerated or not @@ -220,7 +212,7 @@ namespace Js RecyclableObject * object; if (!this->enumeratingPrototype) - { + { this->enumeratingPrototype = true; object = this->shadowData->firstPrototype; this->shadowData->currentObject = object; diff --git a/deps/chakrashim/core/lib/Runtime/Library/GlobalObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/GlobalObject.cpp index 8381a0648b0..5eca5eaa267 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/GlobalObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/GlobalObject.cpp @@ -26,7 +26,9 @@ namespace Js GlobalObject* globalObject = RecyclerNewPlus(scriptContext->GetRecycler(), sizeof(Var) * InlineSlotCapacity, GlobalObject, globalType, scriptContext); +#if ENABLE_FIXED_FIELDS globalTypeHandler->SetSingletonInstanceIfNeeded(scriptContext->GetRecycler()->CreateWeakReferenceHandle(globalObject)); +#endif return globalObject; } @@ -53,10 +55,16 @@ namespace Js bool GlobalObject::Is(Var aValue) { - return RecyclableObject::Is(aValue) && (RecyclableObject::FromVar(aValue)->GetTypeId() == TypeIds_GlobalObject); + return RecyclableObject::Is(aValue) && (RecyclableObject::UnsafeFromVar(aValue)->GetTypeId() == TypeIds_GlobalObject); } GlobalObject* GlobalObject::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'GlobalObject'"); + return static_cast(aValue); + } + + GlobalObject* GlobalObject::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'GlobalObject'"); return static_cast(aValue); @@ -485,7 +493,7 @@ namespace Js } #endif /* IR_VIEWER */ - Var GlobalObject::EntryEvalHelper(ScriptContext* scriptContext, RecyclableObject* function, CallInfo callInfo, Js::Arguments& args) + Var GlobalObject::EntryEvalHelper(ScriptContext* scriptContext, RecyclableObject* function, Js::Arguments& args) { FrameDisplay* environment = (FrameDisplay*)&NullFrameDisplay; ModuleID moduleID = kmodGlobal; @@ -493,31 +501,16 @@ namespace Js // TODO: Handle call from global scope, strict mode BOOL isIndirect = FALSE; - if (Js::CallInfo::isDirectEvalCall(args.Info.Flags)) + if (args.IsDirectEvalCall()) { // This was recognized as an eval call at compile time. The last one or two args are internal to us. // Argcount will be one of the following when called from global code // - eval("...") : argcount 3 : this, evalString, frameDisplay // - eval.call("..."): argcount 2 : this(which is string) , frameDisplay - if (args.Info.Count >= 2) + if (args.Info.Count >= 1) { - environment = (FrameDisplay*)(args[args.Info.Count - 1]); - - // Check for a module root passed from the caller. If it's there, use its module ID to compile the eval. - // when called inside a module root, module root would be added before the frame display in above scenarios - - // ModuleRoot is optional - // - eval("...") : argcount 3/4 : this, evalString , [module root], frameDisplay - // - eval.call("..."): argcount 2/3 : this(which is string) , [module root], frameDisplay - + environment = args.GetFrameDisplay(); strictMode = environment->GetStrictMode(); - - if (args.Info.Count >= 3 && JavascriptOperators::GetTypeId(args[args.Info.Count - 2]) == TypeIds_ModuleRoot) - { - moduleID = ((Js::ModuleRoot*)(RecyclableObject::FromVar(args[args.Info.Count - 2])))->GetModuleID(); - args.Info.Count--; - } - args.Info.Count--; } } else @@ -545,7 +538,7 @@ namespace Js scriptContext->CheckEvalRestriction(); - return EntryEvalHelper(scriptContext, function, callInfo, args); + return EntryEvalHelper(scriptContext, function, args); } // This function is used to decipher eval function parameters and we don't want the stack arguments optimization by C++ compiler so turning off the optimization @@ -559,7 +552,7 @@ namespace Js JavascriptLibrary* library = function->GetLibrary(); ScriptContext* scriptContext = library->GetScriptContext(); - return EntryEvalHelper(scriptContext, function, callInfo, args); + return EntryEvalHelper(scriptContext, function, args); } Var GlobalObject::VEval(JavascriptLibrary* library, FrameDisplay* environment, ModuleID moduleID, bool strictMode, bool isIndirect, @@ -587,13 +580,14 @@ namespace Js return evalArg; } +#ifdef ENABLE_SCRIPT_DEBUGGING // It might happen that no script parsed on this context (scriptContext) till now, // so this Eval acts as the first source compile for scriptContext, transition to debugMode as needed scriptContext->TransitionToDebugModeIfFirstSource(/* utf8SourceInfo = */ nullptr); +#endif ScriptFunction *pfuncScript = nullptr; - ENTER_PINNED_SCOPE(JavascriptString, argString); - argString = JavascriptString::FromVar(evalArg); + JavascriptString *argString = JavascriptString::FromVar(evalArg); char16 const * sourceString = argString->GetSz(); charcount_t sourceLen = argString->GetLength(); FastEvalMapString key(sourceString, sourceLen, moduleID, strictMode, isLibraryCode); @@ -680,8 +674,6 @@ namespace Js } #endif - LEAVE_PINNED_SCOPE(); // argString - //We shouldn't be serializing eval functions; unless with -ForceSerialized flag if (CONFIG_FLAG(ForceSerialized)) { pfuncScript->GetFunctionProxy()->EnsureDeserialized(); @@ -1629,8 +1621,7 @@ namespace Js return function->GetScriptContext()->GetLibrary()->GetUndefined(); } - Js::JavascriptString* jsString = Js::JavascriptConversion::ToString(args[1], function->GetScriptContext()); - PlatformAgnostic::EventTrace::FireGenericEventTrace(jsString->GetSz()); + JS_ETW(EventWriteJSCRIPT_INTERNAL_GENERIC_EVENT(Js::JavascriptConversion::ToString(args[1], function->GetScriptContext())->GetSz())); return function->GetScriptContext()->GetLibrary()->GetUndefined(); } #endif @@ -1662,7 +1653,7 @@ namespace Js // //TODO: the host should give us a print callback which we can use here // - wprintf(_u("%ls\n"), jsString->GetSz()); + Output::Print(_u("%ls\n"), jsString->GetSz()); fflush(stdout); } @@ -1883,6 +1874,14 @@ namespace Js return DynamicObject::SetPropertyWithAttributes(propertyId, value, attributes, info, flags); } + BOOL GlobalObject::InitPropertyInEval(PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) + { + // This is var/function declared inside the 'eval' + PropertyAttributes attributes = PropertyDynamicTypeDefaults | PropertyDeclaredGlobal; + flags = static_cast(flags | PropertyOperation_ThrowIfNotExtensible); + return DynamicObject::SetPropertyWithAttributes(propertyId, value, attributes, info, flags); + } + BOOL GlobalObject::InitPropertyScoped(PropertyId propertyId, Var value) { // var x = 10; variables declared with "var" inside "eval" diff --git a/deps/chakrashim/core/lib/Runtime/Library/GlobalObject.h b/deps/chakrashim/core/lib/Runtime/Library/GlobalObject.h index 2ab054eb036..25b9e8d4c21 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/GlobalObject.h +++ b/deps/chakrashim/core/lib/Runtime/Library/GlobalObject.h @@ -123,11 +123,12 @@ namespace Js static bool Is(Var aValue); static GlobalObject* FromVar(Var aValue); + static GlobalObject* UnsafeFromVar(Var aValue); typedef ScriptFunction* (*EvalHelperType)(ScriptContext* scriptContext, const char16 *source, int sourceLength, ModuleID moduleID, uint32 grfscr, LPCOLESTR pszTitle, BOOL registerDocument, BOOL isIndirect, BOOL strictMode); FieldNoBarrier(EvalHelperType) EvalHelper; - static Var EntryEvalHelper(ScriptContext* scriptContext, RecyclableObject* function, CallInfo callInfo, Arguments& args); + static Var EntryEvalHelper(ScriptContext* scriptContext, RecyclableObject* function, Arguments& args); static Var VEval(JavascriptLibrary* library, FrameDisplay* environment, ModuleID moduleID, bool isStrictMode, bool isIndirect, Arguments& args, bool isLibraryCode, bool registerDocument, uint32 additionalGrfscr); @@ -138,6 +139,7 @@ namespace Js virtual PropertyQueryFlags GetPropertyQuery(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; virtual PropertyQueryFlags GetPropertyQuery(Var originalInstance, JavascriptString* propertyNameString, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; virtual BOOL InitProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags = PropertyOperation_None, PropertyValueInfo* info = NULL) override; + virtual BOOL InitPropertyInEval(PropertyId propertyId, Var value, PropertyOperationFlags flags = PropertyOperation_None, PropertyValueInfo* info = NULL) override; virtual BOOL InitPropertyScoped(PropertyId propertyId, Var value) override; virtual BOOL InitFuncScoped(PropertyId propertyId, Var value) override; virtual BOOL SetProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override; diff --git a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js index 48364401a97..f4f71c30178 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js +++ b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js @@ -79,6 +79,17 @@ var isFinite = platform.builtInGlobalObjectEntryIsFinite; var isNaN = platform.builtInGlobalObjectEntryIsNaN; + // Keep this "enum" in sync with IntlEngineInterfaceExtensionObject::EntryIntl_RegisterBuiltInFunction + const IntlBuiltInFunctionID = setPrototype({ + MIN: 0, + DateToLocaleString: 0, + DateToLocaleDateString: 1, + DateToLocaleTimeString: 2, + NumberToLocaleString: 3, + StringLocaleCompare: 4, + MAX: 5 + }, null); + let __defaultLocale = undefined; const GetDefaultLocale = function () { if (__defaultLocale && platform.useCaches) { @@ -97,15 +108,6 @@ return __defaultLocale; }; - let CacheNumberFormat = function (numberFormat) { - let retVal = platform.cacheNumberFormat(numberFormat); - if (retVal === null) { - // TODO (doilij): remove this fallback when implemented under ICU - numberFormat.__numberingSystem = ""; - } - // no return value - }; - let CreateDateTimeFormat = function (dateTimeFormat, condition) { let retVal = platform.createDateTimeFormat(dateTimeFormat, condition); if (retVal === null) { @@ -604,22 +606,19 @@ // which allows us to display the correct error message for each Intl type. const collator_supportedLocalesOf_name = "Intl.Collator.supportedLocalesOf"; const collator_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(collator_supportedLocalesOf_name, - function collator_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function collator_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, collator_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const numberFormat_supportedLocalesOf_name = "Intl.NumberFormat.supportedLocalesOf"; const numberFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(numberFormat_supportedLocalesOf_name, - function numberFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function numberFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, numberFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const dateTimeFormat_supportedLocalesOf_name = "Intl.DateTimeFormat.supportedLocalesOf"; const dateTimeFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(dateTimeFormat_supportedLocalesOf_name, - function dateTimeFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function dateTimeFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, dateTimeFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); @@ -866,30 +865,22 @@ var stateObject = setPrototype({}, null); InitializeCollator(stateObject, arguments[1], arguments[2]); return Number(platform.compareString(thisArg, that, stateObject.__localeForCompare, stateObject.__sensitivity, stateObject.__ignorePunctuation, stateObject.__numeric)); - }), 4); + }), IntlBuiltInFunctionID.StringLocaleCompare); if (InitType === 'Intl') { - function Collator() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function Collator(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new Collator(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("Collator"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1109,9 +1100,8 @@ try { // Cache api instance and update numbering system on the object - CacheNumberFormat(numberFormat); - } - catch (e) { + platform.cacheNumberFormat(numberFormat); + } catch (e) { throwExIfOOMOrSOE(e); // Generic message to cover the exception throw from the platform. // The platform's exception is also generic and in most if not all cases specifies that "a" argument is invalid. @@ -1119,8 +1109,7 @@ platform.raiseOptionValueOutOfRange(); } - if (!numberFormat.__numberingSystem) - { + if (!numberFormat.__numberingSystem) { numberFormat.__numberingSystem = "latn"; // assume Latin numerals by default } @@ -1139,18 +1128,10 @@ var n = Internal.ToNumber(this); // Need to special case the '-0' case to format as 0 instead of -0. return String(platform.formatNumber(n === -0 ? 0 : n, stateObject)); - }), 3); + }), IntlBuiltInFunctionID.NumberToLocaleString); if (InitType === 'Intl') { - function NumberFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - let locales = undefined; - let options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function NumberFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new NumberFormat(locales, options); } @@ -1604,66 +1585,100 @@ dateTimeFormat.__initializedDateTimeFormat = true; } - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleString", "Date"); - } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; - } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "any", "all")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 0); + // caches for objects constructed with default parameters for each method + let __DateInstanceToLocaleStringDefaultCache = [undefined, undefined, undefined]; + const __DateInstanceToLocaleStringDefaultCacheSlot = setPrototype({ + toLocaleString: 0, + toLocaleDateString: 1, + toLocaleTimeString: 2 + }, null); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleDateString", function () { + function DateInstanceToLocaleStringImplementation(name, option1, option2, cacheSlot, locales, options) { if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleDateString", "Date"); + platform.raiseNeedObjectOfType(name, "Date"); } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); + let value = callInstanceFunc(DateInstanceGetDate, new Date(this)); if (isNaN(value) || !isFinite(value)) { return "Invalid Date"; } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "date", "date")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 1); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleTimeString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleTimeString", "Date"); + let stateObject = undefined; + if (platform.useCaches && !locales && !options) { + // All default parameters (locales and options): this is the most valuable case to cache. + if (__DateInstanceToLocaleStringDefaultCache[cacheSlot]) { + // retrieve cached value + stateObject = __DateInstanceToLocaleStringDefaultCache[cacheSlot]; + } else { + // populate cache + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, undefined, ToDateTimeOptions(undefined, option1, option2)); + __DateInstanceToLocaleStringDefaultCache[cacheSlot] = stateObject; + } } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; + + if (!stateObject) { + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, locales, ToDateTimeOptions(options, option1, option2)); } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "time", "time")); + return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 2); + } - if (InitType === 'Intl') { - function DateTimeFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; + // Note: tagPublicFunction (platform.tagPublicLibraryCode) messes with declared name of the FunctionBody so that + // the functions called appear correctly in the debugger and stack traces. Thus, we we cannot call tagPublicFunction in a loop. + // Each entry point needs to have its own unique FunctionBody (which is a function as defined in the source code); + // this is why we have seemingly repeated ourselves below, instead of having one function and calling it multiple times with + // different parameters. + // + // The following invocations of `platform.registerBuiltInFunction(tagPublicFunction(name, entryPoint))` are enclosed in IIFEs. + // The IIFEs are used to group all of the meaningful differences between each entry point into the arguments to the IIFE. + // The exception to this are the different entryPoint names which are only significant for debugging (and cannot be passed in + // as arguments, as the name is intrinsic to the function declaration). + // + // The `date_toLocale*String_entryPoint` function names are placeholder names that will never be seen from user code. + // The function name property and FunctionBody declared name are overwritten by `tagPublicFunction`. + // The fact that they are declared with unique names is helpful for debugging. + // The functions *must not* be declared as anonymous functions (must be declared with a name); + // converting from an unnnamed function to a named function is not readily supported by the platform code and + // this has caused us to hit assertions in debug builds in the past. + // + // See invocations of `tagPublicFunction` on the `supportedLocalesOf` entry points for a similar pattern. + // + // The entryPoint functions will be called as `Date.prototype.toLocale*String` and thus their `this` parameters will be a Date. + // `DateInstanceToLocaleStringImplementation` is not on `Date.prototype`, so we must propagate `this` into the call by using + // `DateInstanceToLocaleStringImplementation.call(this, ...)`. + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleString", "any", "all", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleString, IntlBuiltInFunctionID.DateToLocaleString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleDateString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleDateString", "date", "date", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleDateString, IntlBuiltInFunctionID.DateToLocaleDateString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleTimeString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleTimeString", "time", "time", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleTimeString, IntlBuiltInFunctionID.DateToLocaleTimeString); + if (InitType === 'Intl') { + function DateTimeFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new DateTimeFormat(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("DateTimeFormat"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1679,23 +1694,27 @@ } tagPublicFunction("Intl.DateTimeFormat", DateTimeFormat); - function format() { + function format(date) { if (typeof this !== 'object') { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - var hiddenObject = platform.getHiddenObject(this); + let hiddenObject = platform.getHiddenObject(this); if (hiddenObject === undefined || !hiddenObject.__initializedDateTimeFormat) { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - if (arguments.length >= 1) { - if (isNaN(arguments[0]) || !isFinite(arguments[0])) { - platform.raiseInvalidDate(); - } - return String(platform.formatDateTime(Internal.ToNumber(arguments[0]), hiddenObject)); + if (date !== undefined && (isNaN(date) || !isFinite(date))) { + platform.raiseInvalidDate(); + } + + let dateValue = undefined; + if (date !== undefined) { + dateValue = Internal.ToNumber(date) + } else { + dateValue = DateNow(); } - return String(platform.formatDateTime(DateNow(), hiddenObject)); + return String(platform.formatDateTime(dateValue, hiddenObject)); } tagPublicFunction("Intl.DateTimeFormat.prototype.format", format); diff --git a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h index a9de9a43774..4a02a0feb2e 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h +++ b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h @@ -84,6 +84,17 @@ var isFinite = platform.builtInGlobalObjectEntryIsFinite; var isNaN = platform.builtInGlobalObjectEntryIsNaN; + // Keep this "enum" in sync with IntlEngineInterfaceExtensionObject::EntryIntl_RegisterBuiltInFunction + const IntlBuiltInFunctionID = setPrototype({ + MIN: 0, + DateToLocaleString: 0, + DateToLocaleDateString: 1, + DateToLocaleTimeString: 2, + NumberToLocaleString: 3, + StringLocaleCompare: 4, + MAX: 5 + }, null); + let __defaultLocale = undefined; const GetDefaultLocale = function () { if (__defaultLocale && platform.useCaches) { @@ -102,15 +113,6 @@ return __defaultLocale; }; - let CacheNumberFormat = function (numberFormat) { - let retVal = platform.cacheNumberFormat(numberFormat); - if (retVal === null) { - // TODO (doilij): remove this fallback when implemented under ICU - numberFormat.__numberingSystem = ""; - } - // no return value - }; - let CreateDateTimeFormat = function (dateTimeFormat, condition) { let retVal = platform.createDateTimeFormat(dateTimeFormat, condition); if (retVal === null) { @@ -609,22 +611,19 @@ // which allows us to display the correct error message for each Intl type. const collator_supportedLocalesOf_name = "Intl.Collator.supportedLocalesOf"; const collator_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(collator_supportedLocalesOf_name, - function collator_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function collator_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, collator_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const numberFormat_supportedLocalesOf_name = "Intl.NumberFormat.supportedLocalesOf"; const numberFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(numberFormat_supportedLocalesOf_name, - function numberFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function numberFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, numberFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const dateTimeFormat_supportedLocalesOf_name = "Intl.DateTimeFormat.supportedLocalesOf"; const dateTimeFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(dateTimeFormat_supportedLocalesOf_name, - function dateTimeFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function dateTimeFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, dateTimeFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); @@ -871,30 +870,22 @@ var stateObject = setPrototype({}, null); InitializeCollator(stateObject, arguments[1], arguments[2]); return Number(platform.compareString(thisArg, that, stateObject.__localeForCompare, stateObject.__sensitivity, stateObject.__ignorePunctuation, stateObject.__numeric)); - }), 4); + }), IntlBuiltInFunctionID.StringLocaleCompare); if (InitType === 'Intl') { - function Collator() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function Collator(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new Collator(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("Collator"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1114,9 +1105,8 @@ try { // Cache api instance and update numbering system on the object - CacheNumberFormat(numberFormat); - } - catch (e) { + platform.cacheNumberFormat(numberFormat); + } catch (e) { throwExIfOOMOrSOE(e); // Generic message to cover the exception throw from the platform. // The platform's exception is also generic and in most if not all cases specifies that "a" argument is invalid. @@ -1124,8 +1114,7 @@ platform.raiseOptionValueOutOfRange(); } - if (!numberFormat.__numberingSystem) - { + if (!numberFormat.__numberingSystem) { numberFormat.__numberingSystem = "latn"; // assume Latin numerals by default } @@ -1144,18 +1133,10 @@ var n = Internal.ToNumber(this); // Need to special case the '-0' case to format as 0 instead of -0. return String(platform.formatNumber(n === -0 ? 0 : n, stateObject)); - }), 3); + }), IntlBuiltInFunctionID.NumberToLocaleString); if (InitType === 'Intl') { - function NumberFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - let locales = undefined; - let options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function NumberFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new NumberFormat(locales, options); } @@ -1609,66 +1590,100 @@ dateTimeFormat.__initializedDateTimeFormat = true; } - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleString", "Date"); - } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; - } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "any", "all")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 0); + // caches for objects constructed with default parameters for each method + let __DateInstanceToLocaleStringDefaultCache = [undefined, undefined, undefined]; + const __DateInstanceToLocaleStringDefaultCacheSlot = setPrototype({ + toLocaleString: 0, + toLocaleDateString: 1, + toLocaleTimeString: 2 + }, null); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleDateString", function () { + function DateInstanceToLocaleStringImplementation(name, option1, option2, cacheSlot, locales, options) { if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleDateString", "Date"); + platform.raiseNeedObjectOfType(name, "Date"); } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); + let value = callInstanceFunc(DateInstanceGetDate, new Date(this)); if (isNaN(value) || !isFinite(value)) { return "Invalid Date"; } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "date", "date")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 1); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleTimeString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleTimeString", "Date"); + let stateObject = undefined; + if (platform.useCaches && !locales && !options) { + // All default parameters (locales and options): this is the most valuable case to cache. + if (__DateInstanceToLocaleStringDefaultCache[cacheSlot]) { + // retrieve cached value + stateObject = __DateInstanceToLocaleStringDefaultCache[cacheSlot]; + } else { + // populate cache + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, undefined, ToDateTimeOptions(undefined, option1, option2)); + __DateInstanceToLocaleStringDefaultCache[cacheSlot] = stateObject; + } } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; + + if (!stateObject) { + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, locales, ToDateTimeOptions(options, option1, option2)); } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "time", "time")); + return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 2); + } - if (InitType === 'Intl') { - function DateTimeFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; + // Note: tagPublicFunction (platform.tagPublicLibraryCode) messes with declared name of the FunctionBody so that + // the functions called appear correctly in the debugger and stack traces. Thus, we we cannot call tagPublicFunction in a loop. + // Each entry point needs to have its own unique FunctionBody (which is a function as defined in the source code); + // this is why we have seemingly repeated ourselves below, instead of having one function and calling it multiple times with + // different parameters. + // + // The following invocations of `platform.registerBuiltInFunction(tagPublicFunction(name, entryPoint))` are enclosed in IIFEs. + // The IIFEs are used to group all of the meaningful differences between each entry point into the arguments to the IIFE. + // The exception to this are the different entryPoint names which are only significant for debugging (and cannot be passed in + // as arguments, as the name is intrinsic to the function declaration). + // + // The `date_toLocale*String_entryPoint` function names are placeholder names that will never be seen from user code. + // The function name property and FunctionBody declared name are overwritten by `tagPublicFunction`. + // The fact that they are declared with unique names is helpful for debugging. + // The functions *must not* be declared as anonymous functions (must be declared with a name); + // converting from an unnnamed function to a named function is not readily supported by the platform code and + // this has caused us to hit assertions in debug builds in the past. + // + // See invocations of `tagPublicFunction` on the `supportedLocalesOf` entry points for a similar pattern. + // + // The entryPoint functions will be called as `Date.prototype.toLocale*String` and thus their `this` parameters will be a Date. + // `DateInstanceToLocaleStringImplementation` is not on `Date.prototype`, so we must propagate `this` into the call by using + // `DateInstanceToLocaleStringImplementation.call(this, ...)`. + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleString", "any", "all", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleString, IntlBuiltInFunctionID.DateToLocaleString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleDateString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleDateString", "date", "date", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleDateString, IntlBuiltInFunctionID.DateToLocaleDateString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleTimeString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleTimeString", "time", "time", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleTimeString, IntlBuiltInFunctionID.DateToLocaleTimeString); + if (InitType === 'Intl') { + function DateTimeFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new DateTimeFormat(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("DateTimeFormat"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1684,23 +1699,27 @@ } tagPublicFunction("Intl.DateTimeFormat", DateTimeFormat); - function format() { + function format(date) { if (typeof this !== 'object') { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - var hiddenObject = platform.getHiddenObject(this); + let hiddenObject = platform.getHiddenObject(this); if (hiddenObject === undefined || !hiddenObject.__initializedDateTimeFormat) { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - if (arguments.length >= 1) { - if (isNaN(arguments[0]) || !isFinite(arguments[0])) { - platform.raiseInvalidDate(); - } - return String(platform.formatDateTime(Internal.ToNumber(arguments[0]), hiddenObject)); + if (date !== undefined && (isNaN(date) || !isFinite(date))) { + platform.raiseInvalidDate(); + } + + let dateValue = undefined; + if (date !== undefined) { + dateValue = Internal.ToNumber(date) + } else { + dateValue = DateNow(); } - return String(platform.formatDateTime(DateNow(), hiddenObject)); + return String(platform.formatDateTime(dateValue, hiddenObject)); } tagPublicFunction("Intl.DateTimeFormat.prototype.format", format); @@ -1782,4686 +1801,3786 @@ namespace Js { const char Library_Bytecode_Intl[] = { -/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x8B, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFE, 0xD7, 0x02, 0x00, 0xFF, -/* 00000020 */ 0x94, 0x5D, 0x01, 0x00, 0xFF, 0x94, 0x5D, 0x01, 0x00, 0x39, 0x00, 0x00, 0x00, 0x40, 0x32, 0x00, -/* 00000030 */ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x69, 0x00, 0x00, 0xFE, 0x70, 0x01, 0x72, 0x07, 0x00, 0x00, -/* 00000040 */ 0x00, 0x8A, 0x07, 0x00, 0x00, 0x00, 0xA0, 0x07, 0x00, 0x00, 0x01, 0xB4, 0x07, 0x00, 0x00, 0x00, -/* 00000050 */ 0xBC, 0x07, 0x00, 0x00, 0x00, 0xC8, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0x00, 0xD8, -/* 00000060 */ 0x07, 0x00, 0x00, 0x00, 0xE8, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x00, 0x00, 0x00, 0x36, 0x08, -/* 00000070 */ 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0xCE, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00000080 */ 0x00, 0x00, 0x0A, 0x09, 0x00, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x00, 0x3C, 0x09, 0x00, 0x00, -/* 00000090 */ 0x00, 0x64, 0x09, 0x00, 0x00, 0x01, 0x70, 0x09, 0x00, 0x00, 0x01, 0x7A, 0x09, 0x00, 0x00, 0x00, -/* 000000A0 */ 0x88, 0x09, 0x00, 0x00, 0x01, 0x94, 0x09, 0x00, 0x00, 0x01, 0xA0, 0x09, 0x00, 0x00, 0x01, 0xB0, -/* 000000B0 */ 0x09, 0x00, 0x00, 0x00, 0xBE, 0x09, 0x00, 0x00, 0x01, 0xCA, 0x09, 0x00, 0x00, 0x01, 0xD8, 0x09, -/* 000000C0 */ 0x00, 0x00, 0x00, 0xE6, 0x09, 0x00, 0x00, 0x01, 0xF2, 0x09, 0x00, 0x00, 0x01, 0x04, 0x0A, 0x00, -/* 000000D0 */ 0x00, 0x00, 0x12, 0x0A, 0x00, 0x00, 0x01, 0x20, 0x0A, 0x00, 0x00, 0x00, 0x22, 0x0A, 0x00, 0x00, -/* 000000E0 */ 0x01, 0x2E, 0x0A, 0x00, 0x00, 0x01, 0x3A, 0x0A, 0x00, 0x00, 0x01, 0x46, 0x0A, 0x00, 0x00, 0x01, -/* 000000F0 */ 0x54, 0x0A, 0x00, 0x00, 0x01, 0x60, 0x0A, 0x00, 0x00, 0x00, 0x6A, 0x0A, 0x00, 0x00, 0x00, 0x7C, -/* 00000100 */ 0x0A, 0x00, 0x00, 0x00, 0x8E, 0x0A, 0x00, 0x00, 0x00, 0xA4, 0x0A, 0x00, 0x00, 0x00, 0xBE, 0x0A, -/* 00000110 */ 0x00, 0x00, 0x00, 0xD8, 0x0A, 0x00, 0x00, 0x00, 0xF6, 0x0A, 0x00, 0x00, 0x01, 0x0A, 0x0B, 0x00, -/* 00000120 */ 0x00, 0x01, 0x2E, 0x0B, 0x00, 0x00, 0x01, 0x54, 0x0B, 0x00, 0x00, 0x01, 0x68, 0x0B, 0x00, 0x00, -/* 00000130 */ 0x01, 0x88, 0x0B, 0x00, 0x00, 0x01, 0xBA, 0x0B, 0x00, 0x00, 0x01, 0xE4, 0x0B, 0x00, 0x00, 0x01, -/* 00000140 */ 0x16, 0x0C, 0x00, 0x00, 0x01, 0x44, 0x0C, 0x00, 0x00, 0x01, 0x72, 0x0C, 0x00, 0x00, 0x01, 0x84, -/* 00000150 */ 0x0C, 0x00, 0x00, 0x01, 0x9E, 0x0C, 0x00, 0x00, 0x01, 0xBC, 0x0C, 0x00, 0x00, 0x01, 0xDE, 0x0C, -/* 00000160 */ 0x00, 0x00, 0x01, 0xF6, 0x0C, 0x00, 0x00, 0x01, 0x20, 0x0D, 0x00, 0x00, 0x01, 0x46, 0x0D, 0x00, -/* 00000170 */ 0x00, 0x01, 0x7A, 0x0D, 0x00, 0x00, 0x01, 0xB4, 0x0D, 0x00, 0x00, 0x01, 0xE0, 0x0D, 0x00, 0x00, -/* 00000180 */ 0x01, 0x0A, 0x0E, 0x00, 0x00, 0x01, 0x34, 0x0E, 0x00, 0x00, 0x01, 0x5E, 0x0E, 0x00, 0x00, 0x01, -/* 00000190 */ 0x82, 0x0E, 0x00, 0x00, 0x01, 0xA6, 0x0E, 0x00, 0x00, 0x01, 0xD0, 0x0E, 0x00, 0x00, 0x01, 0xF8, -/* 000001A0 */ 0x0E, 0x00, 0x00, 0x01, 0x08, 0x0F, 0x00, 0x00, 0x01, 0x34, 0x0F, 0x00, 0x00, 0x01, 0x68, 0x0F, -/* 000001B0 */ 0x00, 0x00, 0x01, 0x9C, 0x0F, 0x00, 0x00, 0x01, 0xBE, 0x0F, 0x00, 0x00, 0x01, 0xE2, 0x0F, 0x00, -/* 000001C0 */ 0x00, 0x01, 0x06, 0x10, 0x00, 0x00, 0x01, 0x2E, 0x10, 0x00, 0x00, 0x01, 0x56, 0x10, 0x00, 0x00, -/* 000001D0 */ 0x01, 0x74, 0x10, 0x00, 0x00, 0x01, 0xA0, 0x10, 0x00, 0x00, 0x01, 0xB2, 0x10, 0x00, 0x00, 0x01, -/* 000001E0 */ 0xE6, 0x10, 0x00, 0x00, 0x01, 0x22, 0x11, 0x00, 0x00, 0x01, 0x62, 0x11, 0x00, 0x00, 0x01, 0xB0, -/* 000001F0 */ 0x11, 0x00, 0x00, 0x01, 0xD8, 0x11, 0x00, 0x00, 0x01, 0xEA, 0x11, 0x00, 0x00, 0x01, 0x10, 0x12, -/* 00000200 */ 0x00, 0x00, 0x01, 0x30, 0x12, 0x00, 0x00, 0x01, 0x52, 0x12, 0x00, 0x00, 0x01, 0x76, 0x12, 0x00, -/* 00000210 */ 0x00, 0x01, 0xA0, 0x12, 0x00, 0x00, 0x01, 0xD0, 0x12, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, -/* 00000220 */ 0x01, 0x22, 0x13, 0x00, 0x00, 0x01, 0x44, 0x13, 0x00, 0x00, 0x01, 0x64, 0x13, 0x00, 0x00, 0x01, -/* 00000230 */ 0x7C, 0x13, 0x00, 0x00, 0x01, 0xBE, 0x13, 0x00, 0x00, 0x01, 0xF6, 0x13, 0x00, 0x00, 0x01, 0x40, -/* 00000240 */ 0x14, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x00, 0x01, 0xCE, 0x14, 0x00, 0x00, 0x01, 0x12, 0x15, -/* 00000250 */ 0x00, 0x00, 0x01, 0x44, 0x15, 0x00, 0x00, 0x01, 0x70, 0x15, 0x00, 0x00, 0x00, 0x76, 0x15, 0x00, -/* 00000260 */ 0x00, 0x00, 0xD0, 0x15, 0x00, 0x00, 0x00, 0xFA, 0x15, 0x00, 0x00, 0x00, 0xFE, 0x15, 0x00, 0x00, -/* 00000270 */ 0x00, 0x26, 0x16, 0x00, 0x00, 0x00, 0x2E, 0x16, 0x00, 0x00, 0x00, 0x3C, 0x16, 0x00, 0x00, 0x00, -/* 00000280 */ 0x4C, 0x16, 0x00, 0x00, 0x00, 0x76, 0x16, 0x00, 0x00, 0x01, 0x88, 0x16, 0x00, 0x00, 0x01, 0xA8, -/* 00000290 */ 0x16, 0x00, 0x00, 0x00, 0xC4, 0x16, 0x00, 0x00, 0x00, 0xE2, 0x16, 0x00, 0x00, 0x00, 0xF0, 0x16, -/* 000002A0 */ 0x00, 0x00, 0x00, 0x04, 0x17, 0x00, 0x00, 0x01, 0x16, 0x17, 0x00, 0x00, 0x00, 0x28, 0x17, 0x00, -/* 000002B0 */ 0x00, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, 0x5C, 0x17, 0x00, 0x00, 0x00, 0x6E, 0x17, 0x00, 0x00, -/* 000002C0 */ 0x01, 0x86, 0x17, 0x00, 0x00, 0x00, 0x96, 0x17, 0x00, 0x00, 0x00, 0xA4, 0x17, 0x00, 0x00, 0x00, -/* 000002D0 */ 0xB2, 0x17, 0x00, 0x00, 0x00, 0xB8, 0x17, 0x00, 0x00, 0x00, 0xC2, 0x17, 0x00, 0x00, 0x00, 0xC8, -/* 000002E0 */ 0x17, 0x00, 0x00, 0x00, 0xDC, 0x17, 0x00, 0x00, 0x00, 0xE0, 0x17, 0x00, 0x00, 0x00, 0xE8, 0x17, -/* 000002F0 */ 0x00, 0x00, 0x00, 0xEC, 0x17, 0x00, 0x00, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00, 0x0E, 0x18, 0x00, -/* 00000300 */ 0x00, 0x00, 0x1A, 0x18, 0x00, 0x00, 0x00, 0x22, 0x18, 0x00, 0x00, 0x00, 0x26, 0x18, 0x00, 0x00, -/* 00000310 */ 0x00, 0x2A, 0x18, 0x00, 0x00, 0x00, 0xDE, 0x18, 0x00, 0x00, 0x00, 0x7A, 0x19, 0x00, 0x00, 0x00, -/* 00000320 */ 0x00, 0x1A, 0x00, 0x00, 0x00, 0x0C, 0x1A, 0x00, 0x00, 0x00, 0x14, 0x1A, 0x00, 0x00, 0x00, 0x2A, -/* 00000330 */ 0x1A, 0x00, 0x00, 0x00, 0x44, 0x1A, 0x00, 0x00, 0x00, 0x5E, 0x1A, 0x00, 0x00, 0x00, 0x68, 0x1A, -/* 00000340 */ 0x00, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x00, 0x8C, 0x1A, 0x00, 0x00, 0x00, 0x9A, 0x1A, 0x00, -/* 00000350 */ 0x00, 0x00, 0xA4, 0x1A, 0x00, 0x00, 0x00, 0xB2, 0x1A, 0x00, 0x00, 0x00, 0xC6, 0x1A, 0x00, 0x00, -/* 00000360 */ 0x00, 0xE0, 0x1A, 0x00, 0x00, 0x00, 0xEC, 0x1A, 0x00, 0x00, 0x00, 0xFA, 0x1A, 0x00, 0x00, 0x00, -/* 00000370 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x0C, 0x1B, 0x00, 0x00, 0x00, 0x14, 0x1B, 0x00, 0x00, 0x00, 0x24, -/* 00000380 */ 0x1B, 0x00, 0x00, 0x00, 0x30, 0x1B, 0x00, 0x00, 0x00, 0x3A, 0x1B, 0x00, 0x00, 0x00, 0x4A, 0x1B, -/* 00000390 */ 0x00, 0x00, 0x00, 0x56, 0x1B, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x1B, 0x00, -/* 000003A0 */ 0x00, 0x00, 0x6A, 0x1B, 0x00, 0x00, 0x01, 0x74, 0x1B, 0x00, 0x00, 0x00, 0x82, 0x1B, 0x00, 0x00, -/* 000003B0 */ 0x00, 0x90, 0x1B, 0x00, 0x00, 0x00, 0x9E, 0x1B, 0x00, 0x00, 0x01, 0xAC, 0x1B, 0x00, 0x00, 0x01, -/* 000003C0 */ 0xB8, 0x1B, 0x00, 0x00, 0x01, 0xC6, 0x1B, 0x00, 0x00, 0x01, 0xE2, 0x1B, 0x00, 0x00, 0x00, 0xF4, -/* 000003D0 */ 0x1B, 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x00, 0x8A, 0x1C, -/* 000003E0 */ 0x00, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x1D, 0x00, 0x00, 0x00, 0x72, 0x1D, 0x00, -/* 000003F0 */ 0x00, 0x01, 0x84, 0x1D, 0x00, 0x00, 0x01, 0xB6, 0x1D, 0x00, 0x00, 0x01, 0xE6, 0x1D, 0x00, 0x00, -/* 00000400 */ 0x00, 0xF0, 0x1D, 0x00, 0x00, 0x00, 0x42, 0x1E, 0x00, 0x00, 0x00, 0x60, 0x1E, 0x00, 0x00, 0x00, -/* 00000410 */ 0x98, 0x1E, 0x00, 0x00, 0x00, 0xA6, 0x1E, 0x00, 0x00, 0x00, 0xB4, 0x1E, 0x00, 0x00, 0x00, 0xF2, -/* 00000420 */ 0x1E, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x00, 0x00, 0x00, 0x4E, 0x1F, 0x00, 0x00, 0x00, 0x62, 0x1F, -/* 00000430 */ 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x00, 0x00, 0x00, 0x9A, 0x1F, 0x00, 0x00, 0x00, 0xAA, 0x1F, 0x00, -/* 00000440 */ 0x00, 0x00, 0xB2, 0x1F, 0x00, 0x00, 0x00, 0xCA, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x1F, 0x00, 0x00, -/* 00000450 */ 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x2C, 0x20, 0x00, 0x00, 0x00, 0x36, 0x20, 0x00, 0x00, 0x00, -/* 00000460 */ 0x44, 0x20, 0x00, 0x00, 0x00, 0x5C, 0x20, 0x00, 0x00, 0x00, 0x66, 0x20, 0x00, 0x00, 0x00, 0x74, -/* 00000470 */ 0x20, 0x00, 0x00, 0x00, 0x7E, 0x20, 0x00, 0x00, 0x00, 0x8E, 0x20, 0x00, 0x00, 0x00, 0xB2, 0x20, -/* 00000480 */ 0x00, 0x00, 0x01, 0xC6, 0x20, 0x00, 0x00, 0x00, 0xD2, 0x20, 0x00, 0x00, 0x00, 0xDE, 0x20, 0x00, -/* 00000490 */ 0x00, 0x00, 0xEA, 0x20, 0x00, 0x00, 0x00, 0xFA, 0x20, 0x00, 0x00, 0x00, 0x0A, 0x21, 0x00, 0x00, -/* 000004A0 */ 0x00, 0x0E, 0x21, 0x00, 0x00, 0x00, 0x12, 0x21, 0x00, 0x00, 0x00, 0x16, 0x21, 0x00, 0x00, 0x01, -/* 000004B0 */ 0x2A, 0x21, 0x00, 0x00, 0x00, 0x30, 0x21, 0x00, 0x00, 0x00, 0x36, 0x21, 0x00, 0x00, 0x00, 0x40, -/* 000004C0 */ 0x21, 0x00, 0x00, 0x00, 0x46, 0x21, 0x00, 0x00, 0x00, 0x58, 0x21, 0x00, 0x00, 0x00, 0x8E, 0x21, -/* 000004D0 */ 0x00, 0x00, 0x00, 0xD4, 0x21, 0x00, 0x00, 0x01, 0xE4, 0x21, 0x00, 0x00, 0x01, 0xF4, 0x21, 0x00, -/* 000004E0 */ 0x00, 0x01, 0x04, 0x22, 0x00, 0x00, 0x01, 0x16, 0x22, 0x00, 0x00, 0x01, 0x1E, 0x22, 0x00, 0x00, -/* 000004F0 */ 0x01, 0x2C, 0x22, 0x00, 0x00, 0x01, 0x36, 0x22, 0x00, 0x00, 0x01, 0x40, 0x22, 0x00, 0x00, 0x00, -/* 00000500 */ 0x4E, 0x22, 0x00, 0x00, 0x00, 0x8E, 0x22, 0x00, 0x00, 0x00, 0xB2, 0x22, 0x00, 0x00, 0x00, 0xF8, -/* 00000510 */ 0x22, 0x00, 0x00, 0x00, 0x18, 0x23, 0x00, 0x00, 0x00, 0x24, 0x23, 0x00, 0x00, 0x00, 0x36, 0x23, -/* 00000520 */ 0x00, 0x00, 0x00, 0x56, 0x23, 0x00, 0x00, 0x00, 0x80, 0x23, 0x00, 0x00, 0x00, 0xAC, 0x23, 0x00, -/* 00000530 */ 0x00, 0x00, 0xD8, 0x23, 0x00, 0x00, 0x00, 0x0A, 0x24, 0x00, 0x00, 0x00, 0x3C, 0x24, 0x00, 0x00, -/* 00000540 */ 0x00, 0x54, 0x24, 0x00, 0x00, 0x00, 0x62, 0x24, 0x00, 0x00, 0x00, 0x78, 0x24, 0x00, 0x00, 0x01, -/* 00000550 */ 0x9C, 0x24, 0x00, 0x00, 0x01, 0xD4, 0x24, 0x00, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x12, -/* 00000560 */ 0x25, 0x00, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x00, 0x2C, 0x25, 0x00, 0x00, 0x00, 0x3A, 0x25, -/* 00000570 */ 0x00, 0x00, 0x00, 0x40, 0x25, 0x00, 0x00, 0x00, 0x4A, 0x25, 0x00, 0x00, 0x01, 0x6A, 0x25, 0x00, -/* 00000580 */ 0x00, 0x00, 0xA6, 0x25, 0x00, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0x01, 0x0E, 0x26, 0x00, 0x00, -/* 00000590 */ 0x00, 0x14, 0x26, 0x00, 0x00, 0x00, 0x1E, 0x26, 0x00, 0x00, 0x01, 0x42, 0x26, 0x00, 0x00, 0x00, -/* 000005A0 */ 0x52, 0x26, 0x00, 0x00, 0x01, 0x70, 0x26, 0x00, 0x00, 0x00, 0x7E, 0x26, 0x00, 0x00, 0x01, 0x9A, -/* 000005B0 */ 0x26, 0x00, 0x00, 0x00, 0xAA, 0x26, 0x00, 0x00, 0x01, 0xCC, 0x26, 0x00, 0x00, 0x00, 0xDE, 0x26, -/* 000005C0 */ 0x00, 0x00, 0x01, 0xFC, 0x26, 0x00, 0x00, 0x00, 0x0A, 0x27, 0x00, 0x00, 0x01, 0x28, 0x27, 0x00, -/* 000005D0 */ 0x00, 0x00, 0x36, 0x27, 0x00, 0x00, 0x01, 0x58, 0x27, 0x00, 0x00, 0x00, 0x74, 0x27, 0x00, 0x00, -/* 000005E0 */ 0x01, 0x8E, 0x27, 0x00, 0x00, 0x00, 0x98, 0x27, 0x00, 0x00, 0x01, 0xB6, 0x27, 0x00, 0x00, 0x00, -/* 000005F0 */ 0xC4, 0x27, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x28, 0x00, 0x00, 0x00, 0x88, -/* 00000600 */ 0x28, 0x00, 0x00, 0x00, 0xB0, 0x28, 0x00, 0x00, 0x00, 0xFA, 0x28, 0x00, 0x00, 0x00, 0x00, 0x29, -/* 00000610 */ 0x00, 0x00, 0x01, 0x32, 0x29, 0x00, 0x00, 0x01, 0x56, 0x29, 0x00, 0x00, 0x01, 0x90, 0x29, 0x00, -/* 00000620 */ 0x00, 0x01, 0xBC, 0x29, 0x00, 0x00, 0x01, 0xF8, 0x29, 0x00, 0x00, 0x01, 0x46, 0x2A, 0x00, 0x00, -/* 00000630 */ 0x01, 0x70, 0x2A, 0x00, 0x00, 0x01, 0xA2, 0x2A, 0x00, 0x00, 0x00, 0xAC, 0x2A, 0x00, 0x00, 0x00, -/* 00000640 */ 0xB4, 0x2A, 0x00, 0x00, 0x00, 0xBE, 0x2A, 0x00, 0x00, 0x00, 0xC6, 0x2A, 0x00, 0x00, 0x00, 0xD0, -/* 00000650 */ 0x2A, 0x00, 0x00, 0x00, 0xDC, 0x2A, 0x00, 0x00, 0x00, 0xE4, 0x2A, 0x00, 0x00, 0x00, 0xEE, 0x2A, -/* 00000660 */ 0x00, 0x00, 0x00, 0xFC, 0x2A, 0x00, 0x00, 0x00, 0x0A, 0x2B, 0x00, 0x00, 0x00, 0x18, 0x2B, 0x00, -/* 00000670 */ 0x00, 0x00, 0x24, 0x2B, 0x00, 0x00, 0x00, 0x50, 0x2B, 0x00, 0x00, 0x00, 0x5A, 0x2B, 0x00, 0x00, -/* 00000680 */ 0x00, 0x78, 0x2B, 0x00, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0x00, 0xAA, 0x2B, 0x00, 0x00, 0x00, -/* 00000690 */ 0xBE, 0x2B, 0x00, 0x00, 0x00, 0xDA, 0x2B, 0x00, 0x00, 0x00, 0xFE, 0x2B, 0x00, 0x00, 0x00, 0x14, -/* 000006A0 */ 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x2C, 0x00, 0x00, 0x00, 0x5A, 0x2C, 0x00, 0x00, 0x00, 0x5E, 0x2C, -/* 000006B0 */ 0x00, 0x00, 0x01, 0x70, 0x2C, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x00, 0x00, 0x00, 0xC2, 0x2C, 0x00, -/* 000006C0 */ 0x00, 0x00, 0x8C, 0x2D, 0x00, 0x00, 0x00, 0xA2, 0x2D, 0x00, 0x00, 0x00, 0xE8, 0x2D, 0x00, 0x00, -/* 000006D0 */ 0x00, 0xF2, 0x2D, 0x00, 0x00, 0x00, 0xF6, 0x2D, 0x00, 0x00, 0x00, 0xFA, 0x2D, 0x00, 0x00, 0x00, -/* 000006E0 */ 0xFE, 0x2D, 0x00, 0x00, 0x00, 0x16, 0x2E, 0x00, 0x00, 0x00, 0x34, 0x2E, 0x00, 0x00, 0x00, 0x80, -/* 000006F0 */ 0x2E, 0x00, 0x00, 0x00, 0x60, 0x2F, 0x00, 0x00, 0x00, 0x7A, 0x2F, 0x00, 0x00, 0x00, 0x8A, 0x2F, -/* 00000700 */ 0x00, 0x00, 0x00, 0x9E, 0x2F, 0x00, 0x00, 0x00, 0xB2, 0x2F, 0x00, 0x00, 0x00, 0x34, 0x30, 0x00, -/* 00000710 */ 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x78, 0x30, 0x00, 0x00, 0x00, 0x8A, 0x30, 0x00, 0x00, -/* 00000720 */ 0x00, 0xC4, 0x30, 0x00, 0x00, 0x00, 0xD6, 0x30, 0x00, 0x00, 0x00, 0xE6, 0x30, 0x00, 0x00, 0x00, -/* 00000730 */ 0xEE, 0x30, 0x00, 0x00, 0x00, 0x08, 0x31, 0x00, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x00, 0x32, -/* 00000740 */ 0x31, 0x00, 0x00, 0x00, 0x3E, 0x31, 0x00, 0x00, 0x00, 0x56, 0x31, 0x00, 0x00, 0x00, 0x6E, 0x31, -/* 00000750 */ 0x00, 0x00, 0x00, 0x78, 0x31, 0x00, 0x00, 0x00, 0x92, 0x31, 0x00, 0x00, 0x00, 0xD2, 0x31, 0x00, -/* 00000760 */ 0x00, 0x00, 0x24, 0x32, 0x00, 0x00, 0x00, 0x36, 0x32, 0x00, 0x00, 0x01, 0x40, 0x32, 0x00, 0x00, -/* 00000770 */ 0x00, 0x00, 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, -/* 00000780 */ 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00000790 */ 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000007A0 */ 0x4E, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x46, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x4E, 0x00, -/* 000007B0 */ 0x44, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6C, 0x00, -/* 000007C0 */ 0x6F, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x00, 0x00, -/* 000007D0 */ 0x70, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x56, 0x00, 0x61, 0x00, -/* 000007E0 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, -/* 000007F0 */ 0x64, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, -/* 00000800 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, -/* 00000810 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000820 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000830 */ 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, -/* 00000840 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 00000850 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00000860 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00000870 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00000880 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00000890 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000008A0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000008B0 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 000008C0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 000008D0 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, -/* 000008E0 */ 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000008F0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00000900 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00000910 */ 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, -/* 00000920 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00000930 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, -/* 00000940 */ 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, -/* 00000950 */ 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00000960 */ 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x45, 0x00, 0x53, 0x00, 0x00, 0x00, -/* 00000970 */ 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, -/* 00000980 */ 0x64, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x2D, 0x00, 0x4C, 0x00, -/* 00000990 */ 0x56, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, -/* 000009A0 */ 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, 0x6B, 0x00, 0x00, 0x00, -/* 000009B0 */ 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, 0x00, 0x00, 0x6A, 0x00, -/* 000009C0 */ 0x61, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000009D0 */ 0x68, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x73, 0x00, -/* 000009E0 */ 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x54, 0x00, 0x57, 0x00, -/* 000009F0 */ 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00000A00 */ 0x63, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6E, 0x00, -/* 00000A10 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00000A20 */ 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x48, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x7A, 0x00, -/* 00000A30 */ 0x68, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, -/* 00000A40 */ 0x43, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x69, 0x00, -/* 00000A50 */ 0x6E, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x53, 0x00, 0x47, 0x00, 0x00, 0x00, -/* 00000A60 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, -/* 00000A70 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x77, 0x00, 0x72, 0x00, -/* 00000A80 */ 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, -/* 00000A90 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, -/* 00000AA0 */ 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, -/* 00000AB0 */ 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 00000AC0 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00000AD0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000AE0 */ 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 00000AF0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00000B00 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 00000B10 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, -/* 00000B20 */ 0x70, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, -/* 00000B30 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000B40 */ 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, -/* 00000B50 */ 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00000B60 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4E, 0x00, -/* 00000B70 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00000B80 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 00000B90 */ 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, 0x75, 0x00, -/* 00000BA0 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x52, 0x00, 0x65, 0x00, -/* 00000BB0 */ 0x67, 0x00, 0x45, 0x00, 0x78, 0x00, 0x70, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 00000BC0 */ 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00000BD0 */ 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x52, 0x00, 0x45, 0x00, -/* 00000BE0 */ 0x73, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00000BF0 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x43, 0x00, 0x75, 0x00, -/* 00000C00 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x43, 0x00, 0x6F, 0x00, -/* 00000C10 */ 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00000C20 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00000C30 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, -/* 00000C40 */ 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00000C50 */ 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000C60 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000C70 */ 0x00, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00000C80 */ 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00000C90 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, -/* 00000CA0 */ 0x65, 0x00, 0x74, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4C, 0x00, -/* 00000CB0 */ 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00000CC0 */ 0x6C, 0x00, 0x6C, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000CD0 */ 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x00, 0x00, 0x52, 0x00, -/* 00000CE0 */ 0x61, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x41, 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00000CF0 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000D00 */ 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 00000D10 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00000D20 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x73, 0x00, -/* 00000D30 */ 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x62, 0x00, -/* 00000D40 */ 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000D50 */ 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x50, 0x00, -/* 00000D60 */ 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x4E, 0x00, -/* 00000D70 */ 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, -/* 00000D80 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00000D90 */ 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x77, 0x00, -/* 00000DA0 */ 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, -/* 00000DB0 */ 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000DC0 */ 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, -/* 00000DD0 */ 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, -/* 00000DE0 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, -/* 00000DF0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, -/* 00000E00 */ 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00000E10 */ 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000E20 */ 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, -/* 00000E30 */ 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, -/* 00000E40 */ 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x49, 0x00, -/* 00000E50 */ 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x41, 0x00, -/* 00000E60 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, -/* 00000E70 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x73, 0x00, 0x68, 0x00, -/* 00000E80 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, -/* 00000E90 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x4A, 0x00, 0x6F, 0x00, -/* 00000EA0 */ 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, -/* 00000EB0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00000EC0 */ 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x42, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, -/* 00000ED0 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, -/* 00000EE0 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, -/* 00000EF0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000F00 */ 0x4E, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, -/* 00000F10 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000F20 */ 0x63, 0x00, 0x65, 0x00, 0x52, 0x00, 0x65, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x63, 0x00, -/* 00000F30 */ 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00000F40 */ 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, -/* 00000F50 */ 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, -/* 00000F60 */ 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, -/* 00000F70 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000F80 */ 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00000F90 */ 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, -/* 00000FA0 */ 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x49, 0x00, 0x66, 0x00, 0x50, 0x00, -/* 00000FB0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00000FC0 */ 0x68, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x45, 0x00, 0x78, 0x00, 0x49, 0x00, 0x66, 0x00, -/* 00000FD0 */ 0x4F, 0x00, 0x4F, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x53, 0x00, 0x4F, 0x00, 0x45, 0x00, -/* 00000FE0 */ 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x50, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6C, 0x00, -/* 00000FF0 */ 0x69, 0x00, 0x63, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00001000 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x45, 0x00, 0x78, 0x00, -/* 00001010 */ 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, -/* 00001020 */ 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, -/* 00001030 */ 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001040 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, -/* 00001050 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, -/* 00001060 */ 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001070 */ 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 00001080 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001090 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 000010A0 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000010B0 */ 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, -/* 000010C0 */ 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 000010D0 */ 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000010E0 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000010F0 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00001100 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, -/* 00001110 */ 0x74, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001120 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001130 */ 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00001140 */ 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00001150 */ 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001160 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00001170 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x41, 0x00, -/* 00001180 */ 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00001190 */ 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, -/* 000011A0 */ 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 000011B0 */ 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, -/* 000011C0 */ 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 000011D0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 000011E0 */ 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x50, 0x00, -/* 000011F0 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x55, 0x00, -/* 00001200 */ 0x73, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x43, 0x00, 0x55, 0x00, 0x00, 0x00, -/* 00001210 */ 0x5F, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001220 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001230 */ 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, -/* 00001240 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001250 */ 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 00001260 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 00001270 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00001280 */ 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 00001290 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000012A0 */ 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 000012B0 */ 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 000012C0 */ 0x75, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x00, 0x00, -/* 000012D0 */ 0x5F, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000012E0 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 000012F0 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001300 */ 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, -/* 00001310 */ 0x5F, 0x00, 0x43, 0x00, 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, -/* 00001320 */ 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, -/* 00001330 */ 0x47, 0x00, 0x5F, 0x00, 0x42, 0x00, 0x41, 0x00, 0x53, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, -/* 00001340 */ 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, -/* 00001350 */ 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x45, 0x00, 0x58, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x52, 0x00, -/* 00001360 */ 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, -/* 00001370 */ 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 00001380 */ 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, -/* 00001390 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, -/* 000013A0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, -/* 000013B0 */ 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, -/* 000013C0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, -/* 000013D0 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 000013E0 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 000013F0 */ 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, -/* 00001400 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, -/* 00001410 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001420 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001430 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001440 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 00001450 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00001460 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001470 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00001480 */ 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00001490 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, -/* 000014A0 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, -/* 000014B0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, -/* 000014C0 */ 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 000014D0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, -/* 000014E0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 000014F0 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, -/* 00001500 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, -/* 00001510 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, -/* 00001520 */ 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 00001530 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, -/* 00001540 */ 0x65, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 00001550 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001560 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001570 */ 0x65, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00001580 */ 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 00001590 */ 0x2E, 0x00, 0x62, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 000015A0 */ 0x2E, 0x00, 0x63, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, -/* 000015B0 */ 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x64, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 000015C0 */ 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 000015D0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 000015E0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 000015F0 */ 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x72, 0x00, -/* 00001600 */ 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001610 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, -/* 00001620 */ 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x6C, 0x00, -/* 00001630 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 00001640 */ 0x62, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001650 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, -/* 00001660 */ 0x6F, 0x00, 0x75, 0x00, 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00001670 */ 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001680 */ 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001690 */ 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, -/* 000016A0 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x3F, 0x00, -/* 000016B0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x29, 0x00, 0x3F, 0x00, -/* 000016C0 */ 0x24, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2A, 0x00, -/* 000016D0 */ 0x29, 0x00, 0x2D, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x3F, 0x00, -/* 000016E0 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 000016F0 */ 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2E, 0x00, -/* 00001700 */ 0x2A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, -/* 00001710 */ 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00001720 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 00001730 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, -/* 00001740 */ 0x6F, 0x00, 0x67, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x6F, 0x00, -/* 00001750 */ 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, -/* 00001760 */ 0x55, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 00001770 */ 0x61, 0x00, 0x73, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001780 */ 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001790 */ 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 000017A0 */ 0x67, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 000017B0 */ 0x00, 0x00, 0x5B, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, -/* 000017C0 */ 0x00, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, -/* 000017D0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, -/* 000017E0 */ 0x20, 0x00, 0x2D, 0x00, 0x20, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x5B, 0x00, -/* 000017F0 */ 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x24, 0x00, -/* 00001800 */ 0x00, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x00, -/* 00001810 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, -/* 00001820 */ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, -/* 00001830 */ 0x3F, 0x00, 0x3A, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001840 */ 0x6A, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6C, 0x00, -/* 00001850 */ 0x2D, 0x00, 0x67, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, -/* 00001860 */ 0x7C, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x7C, 0x00, -/* 00001870 */ 0x6E, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, -/* 00001880 */ 0x68, 0x00, 0x2D, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x79, 0x00, 0x75, 0x00, 0x7C, 0x00, -/* 00001890 */ 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x61, 0x00, -/* 000018A0 */ 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x7C, 0x00, -/* 000018B0 */ 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x6E, 0x00, -/* 000018C0 */ 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x78, 0x00, 0x69, 0x00, -/* 000018D0 */ 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, -/* 000018E0 */ 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x47, 0x00, -/* 000018F0 */ 0x42, 0x00, 0x2D, 0x00, 0x6F, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, -/* 00001900 */ 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6E, 0x00, -/* 00001910 */ 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, -/* 00001920 */ 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00001930 */ 0x6F, 0x00, 0x63, 0x00, 0x68, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001940 */ 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6B, 0x00, -/* 00001950 */ 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001960 */ 0x2D, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6D, 0x00, -/* 00001970 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, -/* 00001980 */ 0x6E, 0x00, 0x61, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001990 */ 0x2D, 0x00, 0x70, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, -/* 000019A0 */ 0x61, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 000019B0 */ 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x73, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x73, 0x00, -/* 000019C0 */ 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x52, 0x00, -/* 000019D0 */ 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, -/* 000019E0 */ 0x4E, 0x00, 0x4C, 0x00, 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x43, 0x00, -/* 000019F0 */ 0x48, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x45, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001A00 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00001A10 */ 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x78, 0x00, -/* 00001A20 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x2C, 0x00, -/* 00001A30 */ 0x38, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00001A40 */ 0x62, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x57, 0x00, 0x59, 0x00, -/* 00001A50 */ 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, -/* 00001A60 */ 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x38, 0x00, -/* 00001A70 */ 0x7D, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, -/* 00001A80 */ 0x35, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, -/* 00001A90 */ 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x7D, 0x00, -/* 00001AA0 */ 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x34, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001AB0 */ 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, -/* 00001AC0 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x7B, 0x00, -/* 00001AD0 */ 0x30, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001AE0 */ 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001AF0 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, -/* 00001B00 */ 0x7B, 0x00, 0x34, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001B10 */ 0x28, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, -/* 00001B20 */ 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001B30 */ 0x29, 0x00, 0x2A, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, -/* 00001B40 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00001B50 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001B60 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, -/* 00001B70 */ 0x6E, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, -/* 00001B80 */ 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001B90 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, -/* 00001BA0 */ 0x75, 0x00, 0x62, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 00001BB0 */ 0x75, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 00001BC0 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, -/* 00001BD0 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001BE0 */ 0x00, 0x00, 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, -/* 00001BF0 */ 0x74, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001C00 */ 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00001C10 */ 0x5B, 0x00, 0x27, 0x00, 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, -/* 00001C20 */ 0x69, 0x00, 0x74, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001C30 */ 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x63, 0x00, -/* 00001C40 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, -/* 00001C50 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001C60 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001C70 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, -/* 00001C80 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00001C90 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00001CA0 */ 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00001CB0 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00001CC0 */ 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00001CD0 */ 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 00001CE0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, -/* 00001CF0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 00001D00 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, -/* 00001D10 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, -/* 00001D20 */ 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, -/* 00001D30 */ 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00001D40 */ 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, -/* 00001D50 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x64, 0x00, -/* 00001D60 */ 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00001D70 */ 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x52, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00001D80 */ 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00001D90 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, -/* 00001DA0 */ 0x73, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00001DB0 */ 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001DC0 */ 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00001DD0 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, -/* 00001DE0 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, -/* 00001DF0 */ 0x2D, 0x00, 0x75, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, -/* 00001E00 */ 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, -/* 00001E10 */ 0x3F, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, -/* 00001E20 */ 0x29, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, -/* 00001E30 */ 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, -/* 00001E40 */ 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00001E50 */ 0x5F, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, -/* 00001E60 */ 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001E70 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00001E80 */ 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00001E90 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x63, 0x00, -/* 00001EA0 */ 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00001EB0 */ 0x67, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00001EC0 */ 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, -/* 00001ED0 */ 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00001EE0 */ 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00001EF0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, -/* 00001F00 */ 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 00001F10 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00001F20 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00001F30 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, -/* 00001F40 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, -/* 00001F50 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00001F60 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, -/* 00001F70 */ 0x63, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001F80 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00001F90 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, -/* 00001FA0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, -/* 00001FB0 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, -/* 00001FC0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 00001FD0 */ 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, -/* 00001FE0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00001FF0 */ 0x5F, 0x00, 0x5F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 00002000 */ 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x64, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002010 */ 0x6C, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 00002020 */ 0x75, 0x00, 0x73, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x6F, 0x00, -/* 00002030 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, -/* 00002040 */ 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 00002050 */ 0x69, 0x00, 0x76, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, -/* 00002060 */ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002070 */ 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, -/* 00002080 */ 0x61, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x69, 0x00, -/* 00002090 */ 0x67, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x6E, 0x00, -/* 000020A0 */ 0x63, 0x00, 0x74, 0x00, 0x75, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000020B0 */ 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x46, 0x00, 0x69, 0x00, 0x72, 0x00, -/* 000020C0 */ 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 000020D0 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x66, 0x00, -/* 000020E0 */ 0x61, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 000020F0 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, -/* 00002100 */ 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x41, 0x00, -/* 00002110 */ 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00002120 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00002130 */ 0x6B, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002140 */ 0x63, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 00002150 */ 0x61, 0x00, 0x72, 0x00, 0x64, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002160 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00002170 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, -/* 00002180 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, -/* 00002190 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, -/* 000021A0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000021B0 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 000021C0 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000021D0 */ 0x73, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x41, 0x00, 0x55, 0x00, 0x4C, 0x00, -/* 000021E0 */ 0x54, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x41, 0x00, -/* 000021F0 */ 0x4C, 0x00, 0x00, 0x00, 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4E, 0x00, -/* 00002200 */ 0x54, 0x00, 0x00, 0x00, 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, -/* 00002210 */ 0x43, 0x00, 0x59, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x58, 0x00, 0x00, 0x00, 0x53, 0x00, -/* 00002220 */ 0x59, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x43, 0x00, 0x4F, 0x00, -/* 00002230 */ 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4D, 0x00, 0x45, 0x00, 0x00, 0x00, -/* 00002240 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 00002250 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, -/* 00002260 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, -/* 00002270 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00002280 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 00002290 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 000022A0 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000022B0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 000022C0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000022D0 */ 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, -/* 000022E0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000022F0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 00002300 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x53, 0x00, 0x79, 0x00, 0x73, 0x00, -/* 00002310 */ 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, -/* 00002320 */ 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002330 */ 0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002340 */ 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6C, 0x00, -/* 00002350 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 00002360 */ 0x75, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, -/* 00002370 */ 0x72, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00002380 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, -/* 00002390 */ 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, -/* 000023A0 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 000023B0 */ 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, 0x72, 0x00, 0x61, 0x00, -/* 000023C0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, -/* 000023D0 */ 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000023E0 */ 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000023F0 */ 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x44, 0x00, 0x69, 0x00, -/* 00002400 */ 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, -/* 00002410 */ 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, -/* 00002420 */ 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x44, 0x00, -/* 00002430 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, -/* 00002440 */ 0x65, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002450 */ 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002460 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002470 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 00002480 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002490 */ 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 000024A0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000024B0 */ 0x61, 0x00, 0x74, 0x00, 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 000024C0 */ 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 000024D0 */ 0x79, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 000024E0 */ 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 000024F0 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002500 */ 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x63, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002510 */ 0x00, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002520 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x79, 0x00, -/* 00002530 */ 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x00, 0x00, -/* 00002540 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x6C, 0x00, -/* 00002550 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002560 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00002570 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00002580 */ 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 00002590 */ 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000025A0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, -/* 000025B0 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000025C0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000025D0 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 000025E0 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000025F0 */ 0x73, 0x00, 0x00, 0x00, 0x68, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002600 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, -/* 00002610 */ 0x5F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, -/* 00002620 */ 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00002630 */ 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002640 */ 0x00, 0x00, 0x67, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x79, 0x00, -/* 00002650 */ 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, 0x43, 0x00, -/* 00002660 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00002670 */ 0x68, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 00002680 */ 0x69, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00002690 */ 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6C, 0x00, -/* 000026A0 */ 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x61, 0x00, 0x70, 0x00, -/* 000026B0 */ 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000026C0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x61, 0x00, -/* 000026D0 */ 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4A, 0x00, -/* 000026E0 */ 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000026F0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x75, 0x00, -/* 00002700 */ 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002710 */ 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002720 */ 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002730 */ 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x41, 0x00, 0x6C, 0x00, 0x51, 0x00, -/* 00002740 */ 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002750 */ 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00002760 */ 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x69, 0x00, 0x76, 0x00, 0x69, 0x00, -/* 00002770 */ 0x6C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00002780 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002790 */ 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, 0x69, 0x00, 0x77, 0x00, -/* 000027A0 */ 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 000027B0 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x77, 0x00, 0x61, 0x00, -/* 000027C0 */ 0x6E, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, -/* 000027D0 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 000027E0 */ 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000027F0 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, -/* 00002800 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00002810 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, -/* 00002820 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, -/* 00002830 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002840 */ 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, -/* 00002850 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00002860 */ 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002870 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00002880 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, -/* 00002890 */ 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000028A0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000028B0 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000028C0 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000028D0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 000028E0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, -/* 000028F0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x00, 0x00, -/* 00002900 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 00002910 */ 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002920 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x70, 0x00, -/* 00002930 */ 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, -/* 00002940 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, -/* 00002950 */ 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x4F, 0x00, -/* 00002960 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x54, 0x00, 0x6F, 0x00, -/* 00002970 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 00002980 */ 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002990 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 000029A0 */ 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000029B0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 000029C0 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x57, 0x00, 0x65, 0x00, 0x65, 0x00, -/* 000029D0 */ 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x4D, 0x00, -/* 000029E0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 000029F0 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002A00 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x79, 0x00, 0x48, 0x00, 0x6F, 0x00, -/* 00002A10 */ 0x75, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00002A20 */ 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x4D, 0x00, 0x6F, 0x00, -/* 00002A30 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00002A40 */ 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002A50 */ 0x65, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, -/* 00002A60 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00002A70 */ 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, -/* 00002A80 */ 0x7A, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, -/* 00002A90 */ 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002AA0 */ 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00002AB0 */ 0x79, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, -/* 00002AC0 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00002AD0 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, -/* 00002AE0 */ 0x79, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002AF0 */ 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00002B00 */ 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002B10 */ 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002B20 */ 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, -/* 00002B30 */ 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, -/* 00002B40 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, -/* 00002B50 */ 0x6C, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 00002B60 */ 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x66, 0x00, -/* 00002B70 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x69, 0x00, -/* 00002B80 */ 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002B90 */ 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, -/* 00002BA0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, -/* 00002BB0 */ 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002BC0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00002BD0 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00002BE0 */ 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002BF0 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002C00 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00002C10 */ 0x6C, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, -/* 00002C20 */ 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002C30 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002C40 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, -/* 00002C50 */ 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002C60 */ 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002C70 */ 0x7B, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002C80 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00002C90 */ 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, -/* 00002CA0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 00002CB0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, -/* 00002CC0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002CD0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002CE0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002CF0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, -/* 00002D00 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, -/* 00002D10 */ 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, -/* 00002D20 */ 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2F, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002D30 */ 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00002D40 */ 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, -/* 00002D50 */ 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, -/* 00002D60 */ 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, -/* 00002D70 */ 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002D80 */ 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x0A, 0x00, -/* 00002D90 */ 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, -/* 00002DA0 */ 0x00, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00002DB0 */ 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, -/* 00002DC0 */ 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, -/* 00002DD0 */ 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, -/* 00002DE0 */ 0x3F, 0x00, 0x7D, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002DF0 */ 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x61, 0x00, -/* 00002E00 */ 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002E10 */ 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002E20 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x31, 0x00, -/* 00002E30 */ 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002E40 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002E50 */ 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00002E60 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, -/* 00002E70 */ 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 00002E80 */ 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, -/* 00002E90 */ 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002EA0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, -/* 00002EB0 */ 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002EC0 */ 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, -/* 00002ED0 */ 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x2F, 0x00, -/* 00002EE0 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2F, 0x00, 0x73, 0x00, -/* 00002EF0 */ 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2F, 0x00, 0x6D, 0x00, 0x6F, 0x00, -/* 00002F00 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 00002F10 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, -/* 00002F20 */ 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00002F30 */ 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002F40 */ 0x2E, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, -/* 00002F50 */ 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, -/* 00002F60 */ 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00002F70 */ 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002F80 */ 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002F90 */ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 00002FA0 */ 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, -/* 00002FB0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002FC0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002FD0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002FE0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, -/* 00002FF0 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, -/* 00003000 */ 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00003010 */ 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, -/* 00003020 */ 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00003030 */ 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, +/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x4D, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFF, +/* 00000020 */ 0xBE, 0x65, 0x01, 0x00, 0xFF, 0xBE, 0x65, 0x01, 0x00, 0x35, 0x00, 0x00, 0x00, 0x80, 0x35, 0x00, +/* 00000030 */ 0x00, 0x8C, 0x51, 0x00, 0x00, 0xFE, 0x81, 0x01, 0xC2, 0x07, 0x00, 0x00, 0x00, 0xDA, 0x07, 0x00, +/* 00000040 */ 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x01, 0x04, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x08, 0x00, 0x00, +/* 00000050 */ 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x01, +/* 00000060 */ 0x30, 0x08, 0x00, 0x00, 0x01, 0x56, 0x08, 0x00, 0x00, 0x01, 0x84, 0x08, 0x00, 0x00, 0x01, 0xB2, +/* 00000070 */ 0x08, 0x00, 0x00, 0x01, 0xDC, 0x08, 0x00, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x01, 0x0C, 0x09, +/* 00000080 */ 0x00, 0x00, 0x00, 0x1C, 0x09, 0x00, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x6A, 0x09, 0x00, +/* 00000090 */ 0x00, 0x00, 0xB4, 0x09, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x34, 0x0A, 0x00, 0x00, +/* 000000A0 */ 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x0A, 0x00, 0x00, 0x00, 0x70, 0x0A, 0x00, 0x00, 0x00, +/* 000000B0 */ 0x98, 0x0A, 0x00, 0x00, 0x01, 0xA4, 0x0A, 0x00, 0x00, 0x01, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0xBC, +/* 000000C0 */ 0x0A, 0x00, 0x00, 0x01, 0xC8, 0x0A, 0x00, 0x00, 0x01, 0xD4, 0x0A, 0x00, 0x00, 0x01, 0xE4, 0x0A, +/* 000000D0 */ 0x00, 0x00, 0x00, 0xF2, 0x0A, 0x00, 0x00, 0x01, 0xFE, 0x0A, 0x00, 0x00, 0x01, 0x0C, 0x0B, 0x00, +/* 000000E0 */ 0x00, 0x00, 0x1A, 0x0B, 0x00, 0x00, 0x01, 0x26, 0x0B, 0x00, 0x00, 0x01, 0x38, 0x0B, 0x00, 0x00, +/* 000000F0 */ 0x00, 0x46, 0x0B, 0x00, 0x00, 0x01, 0x54, 0x0B, 0x00, 0x00, 0x00, 0x56, 0x0B, 0x00, 0x00, 0x01, +/* 00000100 */ 0x62, 0x0B, 0x00, 0x00, 0x01, 0x6E, 0x0B, 0x00, 0x00, 0x01, 0x7A, 0x0B, 0x00, 0x00, 0x01, 0x88, +/* 00000110 */ 0x0B, 0x00, 0x00, 0x01, 0x94, 0x0B, 0x00, 0x00, 0x00, 0x9E, 0x0B, 0x00, 0x00, 0x00, 0xB0, 0x0B, +/* 00000120 */ 0x00, 0x00, 0x00, 0xC2, 0x0B, 0x00, 0x00, 0x00, 0xD8, 0x0B, 0x00, 0x00, 0x00, 0xF2, 0x0B, 0x00, +/* 00000130 */ 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x2A, 0x0C, 0x00, 0x00, 0x01, 0x3E, 0x0C, 0x00, 0x00, +/* 00000140 */ 0x01, 0x62, 0x0C, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x00, 0x00, 0x01, 0x9C, 0x0C, 0x00, 0x00, 0x01, +/* 00000150 */ 0xBC, 0x0C, 0x00, 0x00, 0x01, 0xEE, 0x0C, 0x00, 0x00, 0x01, 0x18, 0x0D, 0x00, 0x00, 0x01, 0x4A, +/* 00000160 */ 0x0D, 0x00, 0x00, 0x01, 0x78, 0x0D, 0x00, 0x00, 0x01, 0xA6, 0x0D, 0x00, 0x00, 0x01, 0xB8, 0x0D, +/* 00000170 */ 0x00, 0x00, 0x01, 0xD2, 0x0D, 0x00, 0x00, 0x01, 0xF0, 0x0D, 0x00, 0x00, 0x01, 0x12, 0x0E, 0x00, +/* 00000180 */ 0x00, 0x01, 0x2A, 0x0E, 0x00, 0x00, 0x01, 0x54, 0x0E, 0x00, 0x00, 0x01, 0x7A, 0x0E, 0x00, 0x00, +/* 00000190 */ 0x01, 0xAE, 0x0E, 0x00, 0x00, 0x01, 0xE8, 0x0E, 0x00, 0x00, 0x01, 0x14, 0x0F, 0x00, 0x00, 0x01, +/* 000001A0 */ 0x3E, 0x0F, 0x00, 0x00, 0x01, 0x68, 0x0F, 0x00, 0x00, 0x01, 0x92, 0x0F, 0x00, 0x00, 0x01, 0xB6, +/* 000001B0 */ 0x0F, 0x00, 0x00, 0x01, 0xDA, 0x0F, 0x00, 0x00, 0x01, 0x04, 0x10, 0x00, 0x00, 0x01, 0x2C, 0x10, +/* 000001C0 */ 0x00, 0x00, 0x01, 0x3C, 0x10, 0x00, 0x00, 0x01, 0x68, 0x10, 0x00, 0x00, 0x01, 0x9C, 0x10, 0x00, +/* 000001D0 */ 0x00, 0x01, 0xD0, 0x10, 0x00, 0x00, 0x01, 0xF2, 0x10, 0x00, 0x00, 0x01, 0x16, 0x11, 0x00, 0x00, +/* 000001E0 */ 0x01, 0x3A, 0x11, 0x00, 0x00, 0x01, 0x62, 0x11, 0x00, 0x00, 0x01, 0x8A, 0x11, 0x00, 0x00, 0x01, +/* 000001F0 */ 0xA8, 0x11, 0x00, 0x00, 0x01, 0xD4, 0x11, 0x00, 0x00, 0x01, 0xE6, 0x11, 0x00, 0x00, 0x01, 0x1A, +/* 00000200 */ 0x12, 0x00, 0x00, 0x01, 0x56, 0x12, 0x00, 0x00, 0x01, 0x96, 0x12, 0x00, 0x00, 0x01, 0xE4, 0x12, +/* 00000210 */ 0x00, 0x00, 0x01, 0x0C, 0x13, 0x00, 0x00, 0x01, 0x1E, 0x13, 0x00, 0x00, 0x01, 0x44, 0x13, 0x00, +/* 00000220 */ 0x00, 0x01, 0x70, 0x13, 0x00, 0x00, 0x01, 0x90, 0x13, 0x00, 0x00, 0x01, 0xB2, 0x13, 0x00, 0x00, +/* 00000230 */ 0x01, 0xDC, 0x13, 0x00, 0x00, 0x01, 0x0C, 0x14, 0x00, 0x00, 0x01, 0x3C, 0x14, 0x00, 0x00, 0x01, +/* 00000240 */ 0x5E, 0x14, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x00, 0x01, 0xA0, 0x14, 0x00, 0x00, 0x01, 0xB8, +/* 00000250 */ 0x14, 0x00, 0x00, 0x01, 0xFA, 0x14, 0x00, 0x00, 0x01, 0x32, 0x15, 0x00, 0x00, 0x01, 0x7C, 0x15, +/* 00000260 */ 0x00, 0x00, 0x01, 0xBC, 0x15, 0x00, 0x00, 0x01, 0x0A, 0x16, 0x00, 0x00, 0x01, 0x4E, 0x16, 0x00, +/* 00000270 */ 0x00, 0x01, 0x80, 0x16, 0x00, 0x00, 0x01, 0xAC, 0x16, 0x00, 0x00, 0x00, 0xB2, 0x16, 0x00, 0x00, +/* 00000280 */ 0x00, 0x0C, 0x17, 0x00, 0x00, 0x00, 0x36, 0x17, 0x00, 0x00, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, +/* 00000290 */ 0x62, 0x17, 0x00, 0x00, 0x00, 0x6A, 0x17, 0x00, 0x00, 0x00, 0x78, 0x17, 0x00, 0x00, 0x00, 0x88, +/* 000002A0 */ 0x17, 0x00, 0x00, 0x00, 0xB2, 0x17, 0x00, 0x00, 0x01, 0xC4, 0x17, 0x00, 0x00, 0x01, 0xE4, 0x17, +/* 000002B0 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x00, 0x00, 0x00, 0x2C, 0x18, 0x00, +/* 000002C0 */ 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x01, 0x52, 0x18, 0x00, 0x00, 0x00, 0x64, 0x18, 0x00, 0x00, +/* 000002D0 */ 0x00, 0x76, 0x18, 0x00, 0x00, 0x00, 0x98, 0x18, 0x00, 0x00, 0x00, 0xAA, 0x18, 0x00, 0x00, 0x01, +/* 000002E0 */ 0xC2, 0x18, 0x00, 0x00, 0x00, 0xD2, 0x18, 0x00, 0x00, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0xEE, +/* 000002F0 */ 0x18, 0x00, 0x00, 0x00, 0xF4, 0x18, 0x00, 0x00, 0x00, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x04, 0x19, +/* 00000300 */ 0x00, 0x00, 0x00, 0x18, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x19, 0x00, 0x00, 0x00, 0x24, 0x19, 0x00, +/* 00000310 */ 0x00, 0x00, 0x28, 0x19, 0x00, 0x00, 0x00, 0x3E, 0x19, 0x00, 0x00, 0x00, 0x4A, 0x19, 0x00, 0x00, +/* 00000320 */ 0x00, 0x56, 0x19, 0x00, 0x00, 0x00, 0x5E, 0x19, 0x00, 0x00, 0x00, 0x62, 0x19, 0x00, 0x00, 0x00, +/* 00000330 */ 0x66, 0x19, 0x00, 0x00, 0x00, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0x00, 0x3C, +/* 00000340 */ 0x1B, 0x00, 0x00, 0x00, 0x48, 0x1B, 0x00, 0x00, 0x00, 0x50, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x1B, +/* 00000350 */ 0x00, 0x00, 0x00, 0x80, 0x1B, 0x00, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0x00, 0xA4, 0x1B, 0x00, +/* 00000360 */ 0x00, 0x00, 0xBA, 0x1B, 0x00, 0x00, 0x00, 0xC8, 0x1B, 0x00, 0x00, 0x00, 0xD6, 0x1B, 0x00, 0x00, +/* 00000370 */ 0x00, 0xE0, 0x1B, 0x00, 0x00, 0x00, 0xEE, 0x1B, 0x00, 0x00, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x00, +/* 00000380 */ 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x28, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x3C, +/* 00000390 */ 0x1C, 0x00, 0x00, 0x00, 0x48, 0x1C, 0x00, 0x00, 0x00, 0x50, 0x1C, 0x00, 0x00, 0x00, 0x60, 0x1C, +/* 000003A0 */ 0x00, 0x00, 0x00, 0x6C, 0x1C, 0x00, 0x00, 0x00, 0x76, 0x1C, 0x00, 0x00, 0x00, 0x86, 0x1C, 0x00, +/* 000003B0 */ 0x00, 0x00, 0x92, 0x1C, 0x00, 0x00, 0x00, 0x9C, 0x1C, 0x00, 0x00, 0x00, 0xA2, 0x1C, 0x00, 0x00, +/* 000003C0 */ 0x00, 0xA6, 0x1C, 0x00, 0x00, 0x01, 0xB0, 0x1C, 0x00, 0x00, 0x00, 0xBE, 0x1C, 0x00, 0x00, 0x00, +/* 000003D0 */ 0xCC, 0x1C, 0x00, 0x00, 0x00, 0xDA, 0x1C, 0x00, 0x00, 0x01, 0xE8, 0x1C, 0x00, 0x00, 0x01, 0xF4, +/* 000003E0 */ 0x1C, 0x00, 0x00, 0x01, 0x02, 0x1D, 0x00, 0x00, 0x01, 0x1E, 0x1D, 0x00, 0x00, 0x00, 0x30, 0x1D, +/* 000003F0 */ 0x00, 0x00, 0x00, 0x4C, 0x1D, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x00, 0x00, 0x00, 0xC6, 0x1D, 0x00, +/* 00000400 */ 0x00, 0x00, 0x1A, 0x1E, 0x00, 0x00, 0x00, 0x72, 0x1E, 0x00, 0x00, 0x00, 0xAE, 0x1E, 0x00, 0x00, +/* 00000410 */ 0x01, 0xC0, 0x1E, 0x00, 0x00, 0x01, 0xF2, 0x1E, 0x00, 0x00, 0x01, 0x22, 0x1F, 0x00, 0x00, 0x00, +/* 00000420 */ 0x2C, 0x1F, 0x00, 0x00, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0x00, 0x9C, 0x1F, 0x00, 0x00, 0x00, 0xD4, +/* 00000430 */ 0x1F, 0x00, 0x00, 0x00, 0xE2, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x2E, 0x20, +/* 00000440 */ 0x00, 0x00, 0x00, 0x4A, 0x20, 0x00, 0x00, 0x00, 0x8A, 0x20, 0x00, 0x00, 0x00, 0x9E, 0x20, 0x00, +/* 00000450 */ 0x00, 0x00, 0xB6, 0x20, 0x00, 0x00, 0x00, 0xD6, 0x20, 0x00, 0x00, 0x00, 0xE6, 0x20, 0x00, 0x00, +/* 00000460 */ 0x00, 0xEE, 0x20, 0x00, 0x00, 0x00, 0x06, 0x21, 0x00, 0x00, 0x01, 0x2C, 0x21, 0x00, 0x00, 0x00, +/* 00000470 */ 0x5C, 0x21, 0x00, 0x00, 0x01, 0x68, 0x21, 0x00, 0x00, 0x00, 0x72, 0x21, 0x00, 0x00, 0x00, 0x80, +/* 00000480 */ 0x21, 0x00, 0x00, 0x00, 0x98, 0x21, 0x00, 0x00, 0x00, 0xA2, 0x21, 0x00, 0x00, 0x00, 0xB0, 0x21, +/* 00000490 */ 0x00, 0x00, 0x00, 0xBA, 0x21, 0x00, 0x00, 0x00, 0xCA, 0x21, 0x00, 0x00, 0x00, 0xEE, 0x21, 0x00, +/* 000004A0 */ 0x00, 0x01, 0x02, 0x22, 0x00, 0x00, 0x00, 0x0E, 0x22, 0x00, 0x00, 0x00, 0x1A, 0x22, 0x00, 0x00, +/* 000004B0 */ 0x00, 0x26, 0x22, 0x00, 0x00, 0x00, 0x36, 0x22, 0x00, 0x00, 0x00, 0x46, 0x22, 0x00, 0x00, 0x00, +/* 000004C0 */ 0x4A, 0x22, 0x00, 0x00, 0x00, 0x4E, 0x22, 0x00, 0x00, 0x00, 0x52, 0x22, 0x00, 0x00, 0x01, 0x66, +/* 000004D0 */ 0x22, 0x00, 0x00, 0x00, 0x6C, 0x22, 0x00, 0x00, 0x00, 0x72, 0x22, 0x00, 0x00, 0x00, 0x7C, 0x22, +/* 000004E0 */ 0x00, 0x00, 0x00, 0x82, 0x22, 0x00, 0x00, 0x00, 0x94, 0x22, 0x00, 0x00, 0x00, 0xCA, 0x22, 0x00, +/* 000004F0 */ 0x00, 0x00, 0x10, 0x23, 0x00, 0x00, 0x01, 0x20, 0x23, 0x00, 0x00, 0x01, 0x30, 0x23, 0x00, 0x00, +/* 00000500 */ 0x01, 0x40, 0x23, 0x00, 0x00, 0x01, 0x52, 0x23, 0x00, 0x00, 0x01, 0x60, 0x23, 0x00, 0x00, 0x01, +/* 00000510 */ 0x6A, 0x23, 0x00, 0x00, 0x01, 0x74, 0x23, 0x00, 0x00, 0x00, 0x82, 0x23, 0x00, 0x00, 0x00, 0xC2, +/* 00000520 */ 0x23, 0x00, 0x00, 0x00, 0xE6, 0x23, 0x00, 0x00, 0x00, 0x2C, 0x24, 0x00, 0x00, 0x00, 0x4C, 0x24, +/* 00000530 */ 0x00, 0x00, 0x00, 0x58, 0x24, 0x00, 0x00, 0x00, 0x6A, 0x24, 0x00, 0x00, 0x00, 0x8A, 0x24, 0x00, +/* 00000540 */ 0x00, 0x00, 0xB4, 0x24, 0x00, 0x00, 0x00, 0xE0, 0x24, 0x00, 0x00, 0x00, 0x0C, 0x25, 0x00, 0x00, +/* 00000550 */ 0x00, 0x3E, 0x25, 0x00, 0x00, 0x00, 0x70, 0x25, 0x00, 0x00, 0x00, 0x88, 0x25, 0x00, 0x00, 0x00, +/* 00000560 */ 0x96, 0x25, 0x00, 0x00, 0x00, 0xAC, 0x25, 0x00, 0x00, 0x01, 0xD0, 0x25, 0x00, 0x00, 0x01, 0x08, +/* 00000570 */ 0x26, 0x00, 0x00, 0x01, 0x36, 0x26, 0x00, 0x00, 0x00, 0x46, 0x26, 0x00, 0x00, 0x00, 0x56, 0x26, +/* 00000580 */ 0x00, 0x00, 0x00, 0x60, 0x26, 0x00, 0x00, 0x00, 0x6E, 0x26, 0x00, 0x00, 0x00, 0x74, 0x26, 0x00, +/* 00000590 */ 0x00, 0x00, 0x7E, 0x26, 0x00, 0x00, 0x01, 0x9E, 0x26, 0x00, 0x00, 0x00, 0xDA, 0x26, 0x00, 0x00, +/* 000005A0 */ 0x00, 0x28, 0x27, 0x00, 0x00, 0x01, 0x42, 0x27, 0x00, 0x00, 0x00, 0x48, 0x27, 0x00, 0x00, 0x00, +/* 000005B0 */ 0x52, 0x27, 0x00, 0x00, 0x01, 0x76, 0x27, 0x00, 0x00, 0x00, 0x86, 0x27, 0x00, 0x00, 0x01, 0xA4, +/* 000005C0 */ 0x27, 0x00, 0x00, 0x00, 0xB2, 0x27, 0x00, 0x00, 0x01, 0xCE, 0x27, 0x00, 0x00, 0x00, 0xDE, 0x27, +/* 000005D0 */ 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x12, 0x28, 0x00, 0x00, 0x01, 0x30, 0x28, 0x00, +/* 000005E0 */ 0x00, 0x00, 0x3E, 0x28, 0x00, 0x00, 0x01, 0x5C, 0x28, 0x00, 0x00, 0x00, 0x6A, 0x28, 0x00, 0x00, +/* 000005F0 */ 0x01, 0x8C, 0x28, 0x00, 0x00, 0x00, 0xA8, 0x28, 0x00, 0x00, 0x01, 0xC2, 0x28, 0x00, 0x00, 0x00, +/* 00000600 */ 0xCC, 0x28, 0x00, 0x00, 0x01, 0xEA, 0x28, 0x00, 0x00, 0x00, 0xF8, 0x28, 0x00, 0x00, 0x00, 0x16, +/* 00000610 */ 0x29, 0x00, 0x00, 0x00, 0x3C, 0x29, 0x00, 0x00, 0x00, 0x62, 0x29, 0x00, 0x00, 0x00, 0x9E, 0x29, +/* 00000620 */ 0x00, 0x00, 0x00, 0xA6, 0x29, 0x00, 0x00, 0x00, 0xAE, 0x29, 0x00, 0x00, 0x00, 0xF2, 0x29, 0x00, +/* 00000630 */ 0x00, 0x00, 0xFC, 0x29, 0x00, 0x00, 0x00, 0x40, 0x2A, 0x00, 0x00, 0x00, 0x4A, 0x2A, 0x00, 0x00, +/* 00000640 */ 0x00, 0x72, 0x2A, 0x00, 0x00, 0x00, 0xBC, 0x2A, 0x00, 0x00, 0x00, 0xC2, 0x2A, 0x00, 0x00, 0x01, +/* 00000650 */ 0xF4, 0x2A, 0x00, 0x00, 0x01, 0x18, 0x2B, 0x00, 0x00, 0x01, 0x52, 0x2B, 0x00, 0x00, 0x01, 0x7E, +/* 00000660 */ 0x2B, 0x00, 0x00, 0x01, 0xBA, 0x2B, 0x00, 0x00, 0x01, 0x08, 0x2C, 0x00, 0x00, 0x01, 0x32, 0x2C, +/* 00000670 */ 0x00, 0x00, 0x01, 0x64, 0x2C, 0x00, 0x00, 0x01, 0xB6, 0x2C, 0x00, 0x00, 0x01, 0x08, 0x2D, 0x00, +/* 00000680 */ 0x00, 0x00, 0x12, 0x2D, 0x00, 0x00, 0x00, 0x1E, 0x2D, 0x00, 0x00, 0x00, 0x26, 0x2D, 0x00, 0x00, +/* 00000690 */ 0x00, 0x30, 0x2D, 0x00, 0x00, 0x00, 0x3E, 0x2D, 0x00, 0x00, 0x00, 0x4C, 0x2D, 0x00, 0x00, 0x00, +/* 000006A0 */ 0x5A, 0x2D, 0x00, 0x00, 0x00, 0x66, 0x2D, 0x00, 0x00, 0x00, 0x92, 0x2D, 0x00, 0x00, 0x00, 0x9C, +/* 000006B0 */ 0x2D, 0x00, 0x00, 0x00, 0xBA, 0x2D, 0x00, 0x00, 0x00, 0xCA, 0x2D, 0x00, 0x00, 0x00, 0xEC, 0x2D, +/* 000006C0 */ 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x1C, 0x2E, 0x00, 0x00, 0x00, 0x40, 0x2E, 0x00, +/* 000006D0 */ 0x00, 0x00, 0x56, 0x2E, 0x00, 0x00, 0x00, 0x80, 0x2E, 0x00, 0x00, 0x00, 0x9C, 0x2E, 0x00, 0x00, +/* 000006E0 */ 0x00, 0xA0, 0x2E, 0x00, 0x00, 0x01, 0xB2, 0x2E, 0x00, 0x00, 0x00, 0xB8, 0x2E, 0x00, 0x00, 0x00, +/* 000006F0 */ 0x04, 0x2F, 0x00, 0x00, 0x00, 0xCE, 0x2F, 0x00, 0x00, 0x00, 0xE4, 0x2F, 0x00, 0x00, 0x00, 0x2A, +/* 00000700 */ 0x30, 0x00, 0x00, 0x00, 0x34, 0x30, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x30, +/* 00000710 */ 0x00, 0x00, 0x00, 0x40, 0x30, 0x00, 0x00, 0x00, 0x58, 0x30, 0x00, 0x00, 0x00, 0x76, 0x30, 0x00, +/* 00000720 */ 0x00, 0x00, 0xC2, 0x30, 0x00, 0x00, 0x00, 0xA2, 0x31, 0x00, 0x00, 0x00, 0xBC, 0x31, 0x00, 0x00, +/* 00000730 */ 0x00, 0xCC, 0x31, 0x00, 0x00, 0x00, 0xE0, 0x31, 0x00, 0x00, 0x00, 0xF4, 0x31, 0x00, 0x00, 0x00, +/* 00000740 */ 0x76, 0x32, 0x00, 0x00, 0x00, 0xA2, 0x32, 0x00, 0x00, 0x00, 0xBA, 0x32, 0x00, 0x00, 0x00, 0xCC, +/* 00000750 */ 0x32, 0x00, 0x00, 0x00, 0x06, 0x33, 0x00, 0x00, 0x00, 0x18, 0x33, 0x00, 0x00, 0x00, 0x28, 0x33, +/* 00000760 */ 0x00, 0x00, 0x00, 0x30, 0x33, 0x00, 0x00, 0x00, 0x4A, 0x33, 0x00, 0x00, 0x00, 0x58, 0x33, 0x00, +/* 00000770 */ 0x00, 0x00, 0x74, 0x33, 0x00, 0x00, 0x00, 0x80, 0x33, 0x00, 0x00, 0x00, 0x98, 0x33, 0x00, 0x00, +/* 00000780 */ 0x00, 0xB0, 0x33, 0x00, 0x00, 0x00, 0xBA, 0x33, 0x00, 0x00, 0x00, 0xD4, 0x33, 0x00, 0x00, 0x01, +/* 00000790 */ 0xE4, 0x33, 0x00, 0x00, 0x01, 0xF4, 0x33, 0x00, 0x00, 0x01, 0x08, 0x34, 0x00, 0x00, 0x00, 0x46, +/* 000007A0 */ 0x34, 0x00, 0x00, 0x00, 0x8C, 0x34, 0x00, 0x00, 0x00, 0xD2, 0x34, 0x00, 0x00, 0x00, 0x12, 0x35, +/* 000007B0 */ 0x00, 0x00, 0x00, 0x64, 0x35, 0x00, 0x00, 0x00, 0x76, 0x35, 0x00, 0x00, 0x01, 0x80, 0x35, 0x00, +/* 000007C0 */ 0x00, 0x00, 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, +/* 000007D0 */ 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 000007E0 */ 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 000007F0 */ 0x4E, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x46, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x4E, 0x00, +/* 00000800 */ 0x44, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6C, 0x00, +/* 00000810 */ 0x6F, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x00, 0x00, +/* 00000820 */ 0x70, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x4E, 0x00, 0x00, 0x00, +/* 00000830 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00000840 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00000850 */ 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, +/* 00000860 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, +/* 00000870 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000880 */ 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, +/* 00000890 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 000008A0 */ 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000008B0 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x54, 0x00, +/* 000008C0 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 000008D0 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 000008E0 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000008F0 */ 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00000900 */ 0x65, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x58, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00000910 */ 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x56, 0x00, 0x61, 0x00, +/* 00000920 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, +/* 00000930 */ 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00000940 */ 0x72, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00000950 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000960 */ 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00000970 */ 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00000980 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, +/* 00000990 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 000009A0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, +/* 000009B0 */ 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, +/* 000009C0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, +/* 000009D0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 000009E0 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 000009F0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00000A00 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 00000A10 */ 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, +/* 00000A20 */ 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000A30 */ 0x73, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, +/* 00000A40 */ 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00000A50 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00000A60 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, +/* 00000A70 */ 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00000A80 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00000A90 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x45, 0x00, +/* 00000AA0 */ 0x53, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, +/* 00000AB0 */ 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x76, 0x00, +/* 00000AC0 */ 0x2D, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2D, 0x00, 0x44, 0x00, +/* 00000AD0 */ 0x45, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, +/* 00000AE0 */ 0x6B, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, +/* 00000AF0 */ 0x00, 0x00, 0x6A, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x00, 0x00, 0x75, 0x00, +/* 00000B00 */ 0x6E, 0x00, 0x69, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000B10 */ 0x64, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, +/* 00000B20 */ 0x54, 0x00, 0x57, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00000B30 */ 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00000B40 */ 0x75, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00000B50 */ 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x48, 0x00, 0x4B, 0x00, +/* 00000B60 */ 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x7A, 0x00, +/* 00000B70 */ 0x68, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000B80 */ 0x79, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x53, 0x00, +/* 00000B90 */ 0x47, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x43, 0x00, +/* 00000BA0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00000BB0 */ 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000BC0 */ 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000BD0 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, +/* 00000BE0 */ 0x69, 0x00, 0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000BF0 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, +/* 00000C00 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00000C10 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00000C20 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00000C30 */ 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00000C40 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, +/* 00000C50 */ 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, +/* 00000C60 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, +/* 00000C70 */ 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00000C80 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, +/* 00000C90 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, +/* 00000CA0 */ 0x74, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x4F, 0x00, +/* 00000CB0 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00000CC0 */ 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, +/* 00000CD0 */ 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, +/* 00000CE0 */ 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x45, 0x00, 0x78, 0x00, 0x70, 0x00, 0x00, 0x00, 0x49, 0x00, +/* 00000CF0 */ 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00000D00 */ 0x65, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, +/* 00000D10 */ 0x52, 0x00, 0x45, 0x00, 0x73, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, +/* 00000D20 */ 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00000D30 */ 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, +/* 00000D40 */ 0x43, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00000D50 */ 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00000D60 */ 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, +/* 00000D70 */ 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00000D80 */ 0x75, 0x00, 0x70, 0x00, 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00000D90 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000DA0 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, +/* 00000DB0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, +/* 00000DC0 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000DD0 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000DE0 */ 0x79, 0x00, 0x4C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, +/* 00000DF0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00000E00 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00000E10 */ 0x00, 0x00, 0x52, 0x00, 0x61, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x41, 0x00, 0x73, 0x00, +/* 00000E20 */ 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000E30 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000E40 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x4F, 0x00, +/* 00000E50 */ 0x66, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00000E60 */ 0x49, 0x00, 0x73, 0x00, 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000E70 */ 0x69, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000E80 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x77, 0x00, +/* 00000E90 */ 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00000EA0 */ 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x4F, 0x00, +/* 00000EB0 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000EC0 */ 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, +/* 00000ED0 */ 0x4F, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000EE0 */ 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000EF0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000F00 */ 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00000F10 */ 0x79, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00000F20 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000F30 */ 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, +/* 00000F40 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00000F50 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, +/* 00000F60 */ 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000F70 */ 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00000F80 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00000F90 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00000FA0 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, +/* 00000FB0 */ 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00000FC0 */ 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, +/* 00000FD0 */ 0x4A, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00000FE0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000FF0 */ 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x42, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001000 */ 0x64, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00001010 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x65, 0x00, +/* 00001020 */ 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00001030 */ 0x74, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 00001040 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00001050 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x52, 0x00, 0x65, 0x00, 0x70, 0x00, 0x6C, 0x00, +/* 00001060 */ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00001070 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001080 */ 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, +/* 00001090 */ 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 000010A0 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 000010B0 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x70, 0x00, +/* 000010C0 */ 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000010D0 */ 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x49, 0x00, +/* 000010E0 */ 0x66, 0x00, 0x50, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 000010F0 */ 0x00, 0x00, 0x74, 0x00, 0x68, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x45, 0x00, 0x78, 0x00, +/* 00001100 */ 0x49, 0x00, 0x66, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x53, 0x00, +/* 00001110 */ 0x4F, 0x00, 0x45, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x50, 0x00, 0x75, 0x00, +/* 00001120 */ 0x62, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x63, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00001130 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, +/* 00001140 */ 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 00001150 */ 0x6E, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 00001160 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, +/* 00001170 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x48, 0x00, 0x65, 0x00, +/* 00001180 */ 0x6C, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001190 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000011A0 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 000011B0 */ 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, +/* 000011C0 */ 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 000011D0 */ 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, +/* 000011E0 */ 0x61, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, +/* 000011F0 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001200 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00001210 */ 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001220 */ 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00001230 */ 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, +/* 00001240 */ 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001250 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00001260 */ 0x65, 0x00, 0x73, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, +/* 00001270 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, +/* 00001280 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, +/* 00001290 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 000012A0 */ 0x73, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000012B0 */ 0x73, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 000012C0 */ 0x6E, 0x00, 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000012D0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, +/* 000012E0 */ 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 000012F0 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 00001300 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00001310 */ 0x69, 0x00, 0x74, 0x00, 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x69, 0x00, +/* 00001320 */ 0x73, 0x00, 0x50, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001330 */ 0x6D, 0x00, 0x55, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x43, 0x00, +/* 00001340 */ 0x55, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x75, 0x00, +/* 00001350 */ 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00001360 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x44, 0x00, 0x00, 0x00, +/* 00001370 */ 0x5F, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00001380 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00001390 */ 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, +/* 000013A0 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000013B0 */ 0x00, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x44, 0x00, +/* 000013C0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, +/* 000013D0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, +/* 000013E0 */ 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000013F0 */ 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x75, 0x00, 0x61, 0x00, +/* 00001400 */ 0x67, 0x00, 0x65, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, +/* 00001410 */ 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00001420 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 00001430 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x55, 0x00, +/* 00001440 */ 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, 0x5F, 0x00, 0x43, 0x00, +/* 00001450 */ 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, +/* 00001460 */ 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, +/* 00001470 */ 0x42, 0x00, 0x41, 0x00, 0x53, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, +/* 00001480 */ 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, +/* 00001490 */ 0x5F, 0x00, 0x45, 0x00, 0x58, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, +/* 000014A0 */ 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, +/* 000014B0 */ 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 000014C0 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 000014D0 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 000014E0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, +/* 000014F0 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001500 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001510 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001520 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001530 */ 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, +/* 00001540 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001550 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001560 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001570 */ 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00001580 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00001590 */ 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, +/* 000015A0 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000015B0 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 000015C0 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 000015D0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 000015E0 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 000015F0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, +/* 00001600 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001610 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001620 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001630 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001640 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, +/* 00001650 */ 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, +/* 00001660 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00001670 */ 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00001680 */ 0x5F, 0x00, 0x5F, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00001690 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 000016A0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, +/* 000016B0 */ 0x00, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, +/* 000016C0 */ 0x61, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x62, 0x00, +/* 000016D0 */ 0x7D, 0x00, 0x7B, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x63, 0x00, +/* 000016E0 */ 0x7D, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000016F0 */ 0x2E, 0x00, 0x64, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x73, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, +/* 00001700 */ 0x6E, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00001710 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001720 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x46, 0x00, +/* 00001730 */ 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001740 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001750 */ 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00001760 */ 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001770 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x54, 0x00, +/* 00001780 */ 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001790 */ 0x6C, 0x00, 0x65, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, +/* 000017A0 */ 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 000017B0 */ 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 000017C0 */ 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 000017D0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000017E0 */ 0x72, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x28, 0x00, +/* 000017F0 */ 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x24, 0x00, 0x00, 0x00, +/* 00001800 */ 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2D, 0x00, +/* 00001810 */ 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00001820 */ 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00001830 */ 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x00, 0x00, +/* 00001840 */ 0x54, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00001850 */ 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001860 */ 0x67, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, +/* 00001870 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x67, 0x00, +/* 00001880 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001890 */ 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x69, 0x00, +/* 000018A0 */ 0x6E, 0x00, 0x74, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, +/* 000018B0 */ 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, +/* 000018C0 */ 0x00, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 000018D0 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 000018E0 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5B, 0x00, +/* 000018F0 */ 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, +/* 00001900 */ 0x5D, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, +/* 00001910 */ 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x20, 0x00, 0x2D, 0x00, +/* 00001920 */ 0x20, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, +/* 00001930 */ 0x5A, 0x00, 0x5D, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x24, 0x00, 0x00, 0x00, 0x5B, 0x00, +/* 00001940 */ 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, +/* 00001950 */ 0x39, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x7C, 0x00, +/* 00001960 */ 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, +/* 00001970 */ 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6A, 0x00, 0x62, 0x00, +/* 00001980 */ 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x2D, 0x00, 0x67, 0x00, +/* 00001990 */ 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x7C, 0x00, 0x6E, 0x00, +/* 000019A0 */ 0x6F, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x6E, 0x00, 0x6F, 0x00, +/* 000019B0 */ 0x2D, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, +/* 000019C0 */ 0x67, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x79, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, +/* 000019D0 */ 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x61, 0x00, 0x7C, 0x00, 0x7A, 0x00, +/* 000019E0 */ 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, +/* 000019F0 */ 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001A00 */ 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x78, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001A10 */ 0x67, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, +/* 00001A20 */ 0x3F, 0x00, 0x3A, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x47, 0x00, 0x42, 0x00, 0x2D, 0x00, +/* 00001A30 */ 0x6F, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x61, 0x00, 0x6D, 0x00, +/* 00001A40 */ 0x69, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x7C, 0x00, +/* 00001A50 */ 0x69, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00001A60 */ 0x74, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001A70 */ 0x68, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x68, 0x00, +/* 00001A80 */ 0x61, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x69, 0x00, +/* 00001A90 */ 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6C, 0x00, +/* 00001AA0 */ 0x75, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001AB0 */ 0x67, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, +/* 00001AC0 */ 0x76, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x70, 0x00, +/* 00001AD0 */ 0x77, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6F, 0x00, +/* 00001AE0 */ 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x79, 0x00, 0x7C, 0x00, 0x69, 0x00, +/* 00001AF0 */ 0x2D, 0x00, 0x74, 0x00, 0x73, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, +/* 00001B00 */ 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x52, 0x00, 0x7C, 0x00, 0x73, 0x00, +/* 00001B10 */ 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x4E, 0x00, 0x4C, 0x00, +/* 00001B20 */ 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x48, 0x00, 0x2D, 0x00, +/* 00001B30 */ 0x44, 0x00, 0x45, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001B40 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, +/* 00001B50 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x78, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001B60 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, +/* 00001B70 */ 0x5C, 0x00, 0x62, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, +/* 00001B80 */ 0x7C, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x57, 0x00, 0x59, 0x00, 0x2D, 0x00, 0x5A, 0x00, +/* 00001B90 */ 0x5D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, +/* 00001BA0 */ 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x29, 0x00, +/* 00001BB0 */ 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x35, 0x00, 0x2C, 0x00, +/* 00001BC0 */ 0x38, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, +/* 00001BD0 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, +/* 00001BE0 */ 0x7B, 0x00, 0x34, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, +/* 00001BF0 */ 0x33, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, +/* 00001C00 */ 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x7B, 0x00, 0x30, 0x00, 0x2C, 0x00, +/* 00001C10 */ 0x32, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, +/* 00001C20 */ 0x2C, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001C30 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x34, 0x00, +/* 00001C40 */ 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x00, 0x00, +/* 00001C50 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x00, 0x00, +/* 00001C60 */ 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, +/* 00001C70 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001C80 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001C90 */ 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001CA0 */ 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x00, 0x00, +/* 00001CB0 */ 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, +/* 00001CC0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00001CD0 */ 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, +/* 00001CE0 */ 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00001CF0 */ 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00001D00 */ 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, +/* 00001D10 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x62, 0x00, +/* 00001D20 */ 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 00001D30 */ 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x61, 0x00, +/* 00001D40 */ 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x27, 0x00, +/* 00001D50 */ 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 00001D60 */ 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00001D70 */ 0x75, 0x00, 0x70, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001D80 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001D90 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001DA0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001DB0 */ 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, +/* 00001DC0 */ 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, +/* 00001DD0 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, +/* 00001DE0 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00001DF0 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001E00 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, +/* 00001E10 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001E20 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001E30 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001E40 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001E50 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, +/* 00001E60 */ 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, +/* 00001E70 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, +/* 00001E80 */ 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001E90 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 00001EA0 */ 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x74, 0x00, +/* 00001EB0 */ 0x6F, 0x00, 0x52, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, +/* 00001EC0 */ 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 00001ED0 */ 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x46, 0x00, +/* 00001EE0 */ 0x6F, 0x00, 0x72, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00001EF0 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00001F00 */ 0x64, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00001F10 */ 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001F20 */ 0x00, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, +/* 00001F30 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, +/* 00001F40 */ 0x5D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x3F, 0x00, 0x2D, 0x00, +/* 00001F50 */ 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2A, 0x00, +/* 00001F60 */ 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, +/* 00001F70 */ 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x28, 0x00, +/* 00001F80 */ 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x5F, 0x00, 0x3F, 0x00, +/* 00001F90 */ 0x28, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x63, 0x00, 0x72, 0x00, +/* 00001FA0 */ 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001FB0 */ 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001FC0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001FD0 */ 0x67, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, +/* 00001FE0 */ 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 00001FF0 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00002000 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00002010 */ 0x2E, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, +/* 00002020 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, +/* 00002030 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 00002040 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002050 */ 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002060 */ 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002070 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, +/* 00002080 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002090 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 000020A0 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 000020B0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 000020C0 */ 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 000020D0 */ 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, +/* 000020E0 */ 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x67, 0x00, +/* 000020F0 */ 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, +/* 00002100 */ 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002110 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00002120 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, +/* 00002130 */ 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, +/* 00002140 */ 0x7A, 0x00, 0x65, 0x00, 0x64, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x4F, 0x00, +/* 00002150 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, +/* 00002160 */ 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00002170 */ 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, 0x68, 0x00, 0x00, 0x00, +/* 00002180 */ 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x76, 0x00, +/* 00002190 */ 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 000021A0 */ 0x00, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 000021B0 */ 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 000021C0 */ 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, +/* 000021D0 */ 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 000021E0 */ 0x75, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 000021F0 */ 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x46, 0x00, 0x69, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00002200 */ 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00002210 */ 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x66, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002220 */ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002230 */ 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, +/* 00002240 */ 0x6C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x61, 0x00, +/* 00002250 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002260 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6E, 0x00, +/* 00002270 */ 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, +/* 00002280 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00002290 */ 0x64, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000022A0 */ 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000022B0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, +/* 000022C0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 000022D0 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, +/* 000022E0 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, +/* 000022F0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002300 */ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 00002310 */ 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x41, 0x00, 0x55, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 00002320 */ 0x44, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x4C, 0x00, 0x00, 0x00, +/* 00002330 */ 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 00002340 */ 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, +/* 00002350 */ 0x00, 0x00, 0x53, 0x00, 0x59, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x4C, 0x00, 0x00, 0x00, +/* 00002360 */ 0x43, 0x00, 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4D, 0x00, +/* 00002370 */ 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002380 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2E, 0x00, +/* 00002390 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 000023A0 */ 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000023B0 */ 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000023C0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 000023D0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000023E0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, +/* 000023F0 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00002400 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002410 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 00002420 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00002430 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x53, 0x00, +/* 00002440 */ 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00002450 */ 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00002460 */ 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, +/* 00002470 */ 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00002480 */ 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00002490 */ 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000024A0 */ 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 000024B0 */ 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, +/* 000024C0 */ 0x6D, 0x00, 0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 000024D0 */ 0x6E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 000024E0 */ 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, +/* 000024F0 */ 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, +/* 00002500 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, +/* 00002510 */ 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, +/* 00002520 */ 0x6E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002530 */ 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, +/* 00002540 */ 0x61, 0x00, 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, +/* 00002550 */ 0x67, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00002560 */ 0x74, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 00002570 */ 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00002580 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00002590 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, +/* 000025A0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 000025B0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000025C0 */ 0x61, 0x00, 0x74, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000025D0 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 000025E0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000025F0 */ 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, +/* 00002600 */ 0x6C, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 00002610 */ 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 00002620 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00002630 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x63, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00002640 */ 0x61, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, +/* 00002650 */ 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00002660 */ 0x73, 0x00, 0x79, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6E, 0x00, +/* 00002670 */ 0x75, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, +/* 00002680 */ 0x5F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, +/* 00002690 */ 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, +/* 000026A0 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 000026B0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 000026C0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, +/* 000026D0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 000026E0 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 000026F0 */ 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 00002700 */ 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, +/* 00002710 */ 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002720 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x68, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, +/* 00002730 */ 0x65, 0x00, 0x6E, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00002740 */ 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002750 */ 0x00, 0x00, 0x47, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00002760 */ 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, +/* 00002770 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x67, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, +/* 00002780 */ 0x72, 0x00, 0x79, 0x00, 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00002790 */ 0x77, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 000027A0 */ 0x72, 0x00, 0x00, 0x00, 0x68, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, +/* 000027B0 */ 0x00, 0x00, 0x48, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 000027C0 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, +/* 000027D0 */ 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x4A, 0x00, +/* 000027E0 */ 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, +/* 000027F0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002800 */ 0x6A, 0x00, 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00002810 */ 0x00, 0x00, 0x4A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, +/* 00002820 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002830 */ 0x6A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x4B, 0x00, +/* 00002840 */ 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002850 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6F, 0x00, +/* 00002860 */ 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x41, 0x00, +/* 00002870 */ 0x6C, 0x00, 0x51, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002880 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00002890 */ 0x6C, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x69, 0x00, +/* 000028A0 */ 0x76, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, +/* 000028B0 */ 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 000028C0 */ 0x00, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, +/* 000028D0 */ 0x69, 0x00, 0x77, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000028E0 */ 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, +/* 000028F0 */ 0x77, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00002900 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00002910 */ 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00002920 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 00002930 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002940 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 00002950 */ 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 00002960 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, +/* 00002970 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, +/* 00002980 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00002990 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x61, 0x00, +/* 000029A0 */ 0x6E, 0x00, 0x79, 0x00, 0x00, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x44, 0x00, +/* 000029B0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 000029C0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000029D0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 000029E0 */ 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000029F0 */ 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00002A00 */ 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002A10 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, +/* 00002A20 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00002A30 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 00002A40 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002A50 */ 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 00002A60 */ 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002A70 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00002A80 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00002A90 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002AA0 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 00002AB0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00002AC0 */ 0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002AD0 */ 0x54, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002AE0 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x61, 0x00, +/* 00002AF0 */ 0x70, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002B00 */ 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002B10 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 00002B20 */ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x54, 0x00, +/* 00002B30 */ 0x6F, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002B40 */ 0x54, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002B50 */ 0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002B60 */ 0x54, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002B70 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 00002B80 */ 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x57, 0x00, 0x65, 0x00, +/* 00002B90 */ 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00002BA0 */ 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002BB0 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00002BC0 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x79, 0x00, 0x48, 0x00, +/* 00002BD0 */ 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, +/* 00002BE0 */ 0x65, 0x00, 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x4D, 0x00, +/* 00002BF0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, +/* 00002C00 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00002C10 */ 0x74, 0x00, 0x65, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002C20 */ 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 00002C30 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002C40 */ 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, +/* 00002C50 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 00002C60 */ 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00002C70 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, +/* 00002C80 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 00002C90 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, +/* 00002CA0 */ 0x65, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002CB0 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002CC0 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00002CD0 */ 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002CE0 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x44, 0x00, +/* 00002CF0 */ 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002D00 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00002D10 */ 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, +/* 00002D20 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002D30 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, +/* 00002D40 */ 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, +/* 00002D50 */ 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6F, 0x00, +/* 00002D60 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, +/* 00002D70 */ 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, +/* 00002D80 */ 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002D90 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00002DA0 */ 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, +/* 00002DB0 */ 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x64, 0x00, +/* 00002DC0 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, +/* 00002DD0 */ 0x72, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, +/* 00002DE0 */ 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, +/* 00002DF0 */ 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, +/* 00002E00 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00002E10 */ 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, +/* 00002E20 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00002E30 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, +/* 00002E40 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, +/* 00002E50 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, +/* 00002E60 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00002E70 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, +/* 00002E80 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00002E90 */ 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +/* 00002EA0 */ 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002EB0 */ 0x00, 0x00, 0x7B, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, +/* 00002EC0 */ 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, +/* 00002ED0 */ 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, +/* 00002EE0 */ 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00002EF0 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, +/* 00002F00 */ 0x7D, 0x00, 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, +/* 00002F10 */ 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00002F20 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, +/* 00002F30 */ 0x77, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, +/* 00002F40 */ 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002F50 */ 0x20, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00002F60 */ 0x2F, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2F, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00002F70 */ 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002F80 */ 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 00002F90 */ 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, +/* 00002FA0 */ 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, +/* 00002FB0 */ 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, +/* 00002FC0 */ 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, +/* 00002FD0 */ 0x0A, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x3A, 0x00, 0x20, 0x00, +/* 00002FE0 */ 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00002FF0 */ 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00003000 */ 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5C, 0x00, +/* 00003010 */ 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, +/* 00003020 */ 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00003030 */ 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, /* 00003040 */ 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 00003050 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 00003060 */ 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, -/* 00003070 */ 0x6C, 0x00, 0x6C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00003080 */ 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7B, 0x00, 0x79, 0x00, -/* 00003090 */ 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, -/* 000030A0 */ 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 000030B0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, -/* 000030C0 */ 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, -/* 000030D0 */ 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, -/* 000030E0 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 000030F0 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x4E, 0x00, -/* 00003100 */ 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00003110 */ 0x31, 0x00, 0x32, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00003120 */ 0x74, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00003130 */ 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x31, 0x00, -/* 00003140 */ 0x32, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00003150 */ 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, -/* 00003160 */ 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x6E, 0x00, -/* 00003170 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x61, 0x00, -/* 00003180 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00003190 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000031A0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000031B0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000031C0 */ 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000031D0 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000031E0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000031F0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 00003200 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 00003210 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00003220 */ 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 00003230 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 00003240 */ 0xFE, 0xEF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x6A, -/* 00003250 */ 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x05, -/* 00003260 */ 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x70, -/* 00003270 */ 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x8F, -/* 00003280 */ 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE0, -/* 00003290 */ 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x5B, 0x02, 0x00, 0x00, 0x5B, -/* 000032A0 */ 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x7B, -/* 000032B0 */ 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xE8, 0x02, 0x00, 0x00, 0xE8, -/* 000032C0 */ 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x23, -/* 000032D0 */ 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x63, -/* 000032E0 */ 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0x97, -/* 000032F0 */ 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0xFB, -/* 00003300 */ 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x5E, 0x04, 0x00, 0x00, 0x5E, -/* 00003310 */ 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x70, -/* 00003320 */ 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x94, -/* 00003330 */ 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xDA, 0x04, 0x00, 0x00, 0xDA, -/* 00003340 */ 0x04, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x54, -/* 00003350 */ 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, 0x79, -/* 00003360 */ 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0xBD, 0x05, 0x00, 0x00, 0xBD, -/* 00003370 */ 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, -/* 00003380 */ 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x00, 0x3F, -/* 00003390 */ 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5C, 0x06, 0x00, 0x00, 0x5C, -/* 000033A0 */ 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0x89, -/* 000033B0 */ 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, 0xCD, -/* 000033C0 */ 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x00, 0x1D, -/* 000033D0 */ 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x50, -/* 000033E0 */ 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0xA5, -/* 000033F0 */ 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0x53, -/* 00003400 */ 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x25, -/* 00003410 */ 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0xAA, 0x09, 0x00, 0x00, 0xAA, -/* 00003420 */ 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0x36, 0x0A, 0x00, 0x00, 0x36, -/* 00003430 */ 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x3E, -/* 00003440 */ 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0xD6, 0x0A, 0x00, 0x00, 0xD6, -/* 00003450 */ 0x0A, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0x62, -/* 00003460 */ 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0xAF, 0x0B, 0x00, 0x00, 0xAF, -/* 00003470 */ 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0x33, 0x0C, 0x00, 0x00, 0x33, -/* 00003480 */ 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x82, 0x0C, 0x00, 0x00, 0x82, -/* 00003490 */ 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0x2E, 0x0D, 0x00, 0x00, 0x2E, -/* 000034A0 */ 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x63, 0x0D, 0x00, 0x00, 0x63, -/* 000034B0 */ 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0xA2, 0x0D, 0x00, 0x00, 0xA2, -/* 000034C0 */ 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDB, 0x0D, 0x00, 0x00, 0xDB, -/* 000034D0 */ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x2B, 0x0E, 0x00, 0x00, 0x2B, -/* 000034E0 */ 0x0E, 0x00, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x84, 0x0E, 0x00, 0x00, 0x84, -/* 000034F0 */ 0x0E, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x00, 0x8F, 0x0E, 0x00, 0x00, 0x8F, -/* 00003500 */ 0x0E, 0x00, 0x00, 0xC3, 0x0E, 0x00, 0x00, 0xC3, 0x0E, 0x00, 0x00, 0xDA, 0x0E, 0x00, 0x00, 0xDA, -/* 00003510 */ 0x0E, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0x5B, 0x0F, 0x00, 0x00, 0x5B, -/* 00003520 */ 0x0F, 0x00, 0x00, 0x7F, 0x0F, 0x00, 0x00, 0x7F, 0x0F, 0x00, 0x00, 0x90, 0x0F, 0x00, 0x00, 0x90, -/* 00003530 */ 0x0F, 0x00, 0x00, 0xB6, 0x0F, 0x00, 0x00, 0xB6, 0x0F, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0xC0, -/* 00003540 */ 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, 0xE1, 0x0F, 0x00, 0x00, 0xE1, -/* 00003550 */ 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00, 0xE9, 0x0F, 0x00, 0x00, 0xE9, -/* 00003560 */ 0x0F, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x5E, 0x10, 0x00, 0x00, 0x5E, -/* 00003570 */ 0x10, 0x00, 0x00, 0x7D, 0x10, 0x00, 0x00, 0x7D, 0x10, 0x00, 0x00, 0xCB, 0x10, 0x00, 0x00, 0xCB, -/* 00003580 */ 0x10, 0x00, 0x00, 0xFC, 0x10, 0x00, 0x00, 0xFC, 0x10, 0x00, 0x00, 0x06, 0x11, 0x00, 0x00, 0x06, -/* 00003590 */ 0x11, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x28, 0x11, 0x00, 0x00, 0x28, -/* 000035A0 */ 0x11, 0x00, 0x00, 0x29, 0x11, 0x00, 0x00, 0x29, 0x11, 0x00, 0x00, 0x6F, 0x11, 0x00, 0x00, 0x6F, -/* 000035B0 */ 0x11, 0x00, 0x00, 0xBE, 0x11, 0x00, 0x00, 0xBE, 0x11, 0x00, 0x00, 0xDD, 0x11, 0x00, 0x00, 0xDD, -/* 000035C0 */ 0x11, 0x00, 0x00, 0x2B, 0x12, 0x00, 0x00, 0x2B, 0x12, 0x00, 0x00, 0x5E, 0x12, 0x00, 0x00, 0x5E, -/* 000035D0 */ 0x12, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x00, 0xCE, 0x12, 0x00, 0x00, 0xCE, -/* 000035E0 */ 0x12, 0x00, 0x00, 0xFA, 0x12, 0x00, 0x00, 0xFA, 0x12, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, -/* 000035F0 */ 0x13, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x2D, 0x13, 0x00, 0x00, 0x2D, -/* 00003600 */ 0x13, 0x00, 0x00, 0x34, 0x13, 0x00, 0x00, 0x34, 0x13, 0x00, 0x00, 0x35, 0x13, 0x00, 0x00, 0x35, -/* 00003610 */ 0x13, 0x00, 0x00, 0x6C, 0x13, 0x00, 0x00, 0x6C, 0x13, 0x00, 0x00, 0xAC, 0x13, 0x00, 0x00, 0xAC, -/* 00003620 */ 0x13, 0x00, 0x00, 0xCB, 0x13, 0x00, 0x00, 0xCB, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0xEB, -/* 00003630 */ 0x13, 0x00, 0x00, 0x13, 0x14, 0x00, 0x00, 0x13, 0x14, 0x00, 0x00, 0x21, 0x14, 0x00, 0x00, 0x21, -/* 00003640 */ 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x87, 0x14, 0x00, 0x00, 0x87, -/* 00003650 */ 0x14, 0x00, 0x00, 0x98, 0x14, 0x00, 0x00, 0x98, 0x14, 0x00, 0x00, 0xB3, 0x14, 0x00, 0x00, 0xB3, -/* 00003660 */ 0x14, 0x00, 0x00, 0xBD, 0x14, 0x00, 0x00, 0xBD, 0x14, 0x00, 0x00, 0xC4, 0x14, 0x00, 0x00, 0xC4, -/* 00003670 */ 0x14, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, -/* 00003680 */ 0x14, 0x00, 0x00, 0x18, 0x15, 0x00, 0x00, 0x18, 0x15, 0x00, 0x00, 0x3B, 0x15, 0x00, 0x00, 0x3B, -/* 00003690 */ 0x15, 0x00, 0x00, 0x5D, 0x15, 0x00, 0x00, 0x5D, 0x15, 0x00, 0x00, 0x81, 0x15, 0x00, 0x00, 0x81, -/* 000036A0 */ 0x15, 0x00, 0x00, 0x8F, 0x15, 0x00, 0x00, 0x8F, 0x15, 0x00, 0x00, 0xA6, 0x15, 0x00, 0x00, 0xA6, -/* 000036B0 */ 0x15, 0x00, 0x00, 0xB0, 0x15, 0x00, 0x00, 0xB0, 0x15, 0x00, 0x00, 0xB7, 0x15, 0x00, 0x00, 0xB7, -/* 000036C0 */ 0x15, 0x00, 0x00, 0xB8, 0x15, 0x00, 0x00, 0xB8, 0x15, 0x00, 0x00, 0x1D, 0x16, 0x00, 0x00, 0x1D, -/* 000036D0 */ 0x16, 0x00, 0x00, 0x49, 0x16, 0x00, 0x00, 0x49, 0x16, 0x00, 0x00, 0x8F, 0x16, 0x00, 0x00, 0x8F, -/* 000036E0 */ 0x16, 0x00, 0x00, 0xA5, 0x16, 0x00, 0x00, 0xA5, 0x16, 0x00, 0x00, 0xAF, 0x16, 0x00, 0x00, 0xAF, -/* 000036F0 */ 0x16, 0x00, 0x00, 0xB6, 0x16, 0x00, 0x00, 0xB6, 0x16, 0x00, 0x00, 0xB7, 0x16, 0x00, 0x00, 0xB7, -/* 00003700 */ 0x16, 0x00, 0x00, 0xE8, 0x16, 0x00, 0x00, 0xE8, 0x16, 0x00, 0x00, 0x1F, 0x17, 0x00, 0x00, 0x1F, -/* 00003710 */ 0x17, 0x00, 0x00, 0x26, 0x17, 0x00, 0x00, 0x26, 0x17, 0x00, 0x00, 0x27, 0x17, 0x00, 0x00, 0x27, -/* 00003720 */ 0x17, 0x00, 0x00, 0x69, 0x17, 0x00, 0x00, 0x69, 0x17, 0x00, 0x00, 0xAF, 0x17, 0x00, 0x00, 0xAF, -/* 00003730 */ 0x17, 0x00, 0x00, 0xDB, 0x17, 0x00, 0x00, 0xDB, 0x17, 0x00, 0x00, 0x1F, 0x18, 0x00, 0x00, 0x1F, -/* 00003740 */ 0x18, 0x00, 0x00, 0x4A, 0x18, 0x00, 0x00, 0x4A, 0x18, 0x00, 0x00, 0x73, 0x18, 0x00, 0x00, 0x73, -/* 00003750 */ 0x18, 0x00, 0x00, 0x9F, 0x18, 0x00, 0x00, 0x9F, 0x18, 0x00, 0x00, 0xB1, 0x18, 0x00, 0x00, 0xB1, -/* 00003760 */ 0x18, 0x00, 0x00, 0x03, 0x19, 0x00, 0x00, 0x03, 0x19, 0x00, 0x00, 0x78, 0x19, 0x00, 0x00, 0x78, -/* 00003770 */ 0x19, 0x00, 0x00, 0x86, 0x19, 0x00, 0x00, 0x86, 0x19, 0x00, 0x00, 0xD1, 0x19, 0x00, 0x00, 0xD1, -/* 00003780 */ 0x19, 0x00, 0x00, 0x13, 0x1A, 0x00, 0x00, 0x13, 0x1A, 0x00, 0x00, 0x83, 0x1A, 0x00, 0x00, 0x83, -/* 00003790 */ 0x1A, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0xDE, 0x1A, 0x00, 0x00, 0xDE, -/* 000037A0 */ 0x1A, 0x00, 0x00, 0xE8, 0x1A, 0x00, 0x00, 0xE8, 0x1A, 0x00, 0x00, 0xE9, 0x1A, 0x00, 0x00, 0xE9, -/* 000037B0 */ 0x1A, 0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x34, 0x1B, 0x00, 0x00, 0x34, -/* 000037C0 */ 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0x89, 0x1B, 0x00, 0x00, 0x89, -/* 000037D0 */ 0x1B, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0xBD, 0x1B, 0x00, 0x00, 0xBD, -/* 000037E0 */ 0x1B, 0x00, 0x00, 0xC7, 0x1B, 0x00, 0x00, 0xC7, 0x1B, 0x00, 0x00, 0xCD, 0x1B, 0x00, 0x00, 0xCD, -/* 000037F0 */ 0x1B, 0x00, 0x00, 0xCE, 0x1B, 0x00, 0x00, 0xCE, 0x1B, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, -/* 00003800 */ 0x1C, 0x00, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x8D, 0x1C, 0x00, 0x00, 0x8D, -/* 00003810 */ 0x1C, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0x09, 0x1D, 0x00, 0x00, 0x09, -/* 00003820 */ 0x1D, 0x00, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x5E, 0x1D, 0x00, 0x00, 0x5E, -/* 00003830 */ 0x1D, 0x00, 0x00, 0x70, 0x1D, 0x00, 0x00, 0x70, 0x1D, 0x00, 0x00, 0xD0, 0x1D, 0x00, 0x00, 0xD0, -/* 00003840 */ 0x1D, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x00, 0x4B, 0x1E, 0x00, 0x00, 0x4B, -/* 00003850 */ 0x1E, 0x00, 0x00, 0x84, 0x1E, 0x00, 0x00, 0x84, 0x1E, 0x00, 0x00, 0xBE, 0x1E, 0x00, 0x00, 0xBE, -/* 00003860 */ 0x1E, 0x00, 0x00, 0xCC, 0x1E, 0x00, 0x00, 0xCC, 0x1E, 0x00, 0x00, 0x17, 0x1F, 0x00, 0x00, 0x17, -/* 00003870 */ 0x1F, 0x00, 0x00, 0x59, 0x1F, 0x00, 0x00, 0x59, 0x1F, 0x00, 0x00, 0xD6, 0x1F, 0x00, 0x00, 0xD6, -/* 00003880 */ 0x1F, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x31, 0x20, 0x00, 0x00, 0x31, -/* 00003890 */ 0x20, 0x00, 0x00, 0x3B, 0x20, 0x00, 0x00, 0x3B, 0x20, 0x00, 0x00, 0x5A, 0x20, 0x00, 0x00, 0x5A, -/* 000038A0 */ 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x61, -/* 000038B0 */ 0x20, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0xB3, 0x20, 0x00, 0x00, 0xB3, -/* 000038C0 */ 0x20, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0xE1, 0x20, 0x00, 0x00, 0xE1, -/* 000038D0 */ 0x20, 0x00, 0x00, 0xE2, 0x20, 0x00, 0x00, 0xE2, 0x20, 0x00, 0x00, 0x2D, 0x21, 0x00, 0x00, 0x2D, -/* 000038E0 */ 0x21, 0x00, 0x00, 0x43, 0x21, 0x00, 0x00, 0x43, 0x21, 0x00, 0x00, 0x61, 0x21, 0x00, 0x00, 0x61, -/* 000038F0 */ 0x21, 0x00, 0x00, 0x6B, 0x21, 0x00, 0x00, 0x6B, 0x21, 0x00, 0x00, 0x6C, 0x21, 0x00, 0x00, 0x6C, -/* 00003900 */ 0x21, 0x00, 0x00, 0xE1, 0x21, 0x00, 0x00, 0xE1, 0x21, 0x00, 0x00, 0x31, 0x22, 0x00, 0x00, 0x31, -/* 00003910 */ 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x00, 0x77, 0x22, 0x00, 0x00, 0x77, -/* 00003920 */ 0x22, 0x00, 0x00, 0xEA, 0x22, 0x00, 0x00, 0xEA, 0x22, 0x00, 0x00, 0x03, 0x23, 0x00, 0x00, 0x03, -/* 00003930 */ 0x23, 0x00, 0x00, 0x27, 0x23, 0x00, 0x00, 0x27, 0x23, 0x00, 0x00, 0x4B, 0x23, 0x00, 0x00, 0x4B, -/* 00003940 */ 0x23, 0x00, 0x00, 0xA3, 0x23, 0x00, 0x00, 0xA3, 0x23, 0x00, 0x00, 0xE6, 0x23, 0x00, 0x00, 0xE6, -/* 00003950 */ 0x23, 0x00, 0x00, 0x6F, 0x24, 0x00, 0x00, 0x6F, 0x24, 0x00, 0x00, 0x70, 0x24, 0x00, 0x00, 0x70, -/* 00003960 */ 0x24, 0x00, 0x00, 0x8B, 0x24, 0x00, 0x00, 0x8B, 0x24, 0x00, 0x00, 0x91, 0x24, 0x00, 0x00, 0x91, -/* 00003970 */ 0x24, 0x00, 0x00, 0x92, 0x24, 0x00, 0x00, 0x92, 0x24, 0x00, 0x00, 0xEC, 0x24, 0x00, 0x00, 0xEC, -/* 00003980 */ 0x24, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x42, 0x25, 0x00, 0x00, 0x42, -/* 00003990 */ 0x25, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x00, 0xD2, 0x25, 0x00, 0x00, 0xD2, -/* 000039A0 */ 0x25, 0x00, 0x00, 0xDC, 0x25, 0x00, 0x00, 0xDC, 0x25, 0x00, 0x00, 0xDD, 0x25, 0x00, 0x00, 0xDD, -/* 000039B0 */ 0x25, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0x44, 0x26, 0x00, 0x00, 0x44, -/* 000039C0 */ 0x26, 0x00, 0x00, 0xA0, 0x26, 0x00, 0x00, 0xA0, 0x26, 0x00, 0x00, 0xB0, 0x26, 0x00, 0x00, 0xB0, -/* 000039D0 */ 0x26, 0x00, 0x00, 0xBA, 0x26, 0x00, 0x00, 0xBA, 0x26, 0x00, 0x00, 0xBB, 0x26, 0x00, 0x00, 0xBB, -/* 000039E0 */ 0x26, 0x00, 0x00, 0x4A, 0x27, 0x00, 0x00, 0x4A, 0x27, 0x00, 0x00, 0xD0, 0x27, 0x00, 0x00, 0xD0, -/* 000039F0 */ 0x27, 0x00, 0x00, 0x4B, 0x28, 0x00, 0x00, 0x4B, 0x28, 0x00, 0x00, 0x94, 0x28, 0x00, 0x00, 0x94, -/* 00003A00 */ 0x28, 0x00, 0x00, 0xCA, 0x28, 0x00, 0x00, 0xCA, 0x28, 0x00, 0x00, 0xCB, 0x28, 0x00, 0x00, 0xCB, -/* 00003A10 */ 0x28, 0x00, 0x00, 0x17, 0x29, 0x00, 0x00, 0x17, 0x29, 0x00, 0x00, 0x36, 0x29, 0x00, 0x00, 0x36, -/* 00003A20 */ 0x29, 0x00, 0x00, 0x87, 0x29, 0x00, 0x00, 0x87, 0x29, 0x00, 0x00, 0x01, 0x2A, 0x00, 0x00, 0x01, -/* 00003A30 */ 0x2A, 0x00, 0x00, 0x25, 0x2A, 0x00, 0x00, 0x25, 0x2A, 0x00, 0x00, 0x80, 0x2A, 0x00, 0x00, 0x80, -/* 00003A40 */ 0x2A, 0x00, 0x00, 0xCB, 0x2A, 0x00, 0x00, 0xCB, 0x2A, 0x00, 0x00, 0xDD, 0x2A, 0x00, 0x00, 0xDD, -/* 00003A50 */ 0x2A, 0x00, 0x00, 0xEE, 0x2A, 0x00, 0x00, 0xEE, 0x2A, 0x00, 0x00, 0x0E, 0x2B, 0x00, 0x00, 0x0E, -/* 00003A60 */ 0x2B, 0x00, 0x00, 0x18, 0x2B, 0x00, 0x00, 0x18, 0x2B, 0x00, 0x00, 0x19, 0x2B, 0x00, 0x00, 0x19, -/* 00003A70 */ 0x2B, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0xB6, 0x2B, 0x00, 0x00, 0xB6, -/* 00003A80 */ 0x2B, 0x00, 0x00, 0xEB, 0x2B, 0x00, 0x00, 0xEB, 0x2B, 0x00, 0x00, 0x14, 0x2C, 0x00, 0x00, 0x14, -/* 00003A90 */ 0x2C, 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x00, 0x66, 0x2C, 0x00, 0x00, 0x66, -/* 00003AA0 */ 0x2C, 0x00, 0x00, 0x90, 0x2C, 0x00, 0x00, 0x90, 0x2C, 0x00, 0x00, 0xB5, 0x2C, 0x00, 0x00, 0xB5, -/* 00003AB0 */ 0x2C, 0x00, 0x00, 0xCE, 0x2C, 0x00, 0x00, 0xCE, 0x2C, 0x00, 0x00, 0xF5, 0x2C, 0x00, 0x00, 0xF5, -/* 00003AC0 */ 0x2C, 0x00, 0x00, 0x07, 0x2D, 0x00, 0x00, 0x07, 0x2D, 0x00, 0x00, 0x15, 0x2D, 0x00, 0x00, 0x15, -/* 00003AD0 */ 0x2D, 0x00, 0x00, 0x16, 0x2D, 0x00, 0x00, 0x16, 0x2D, 0x00, 0x00, 0x61, 0x2D, 0x00, 0x00, 0x61, -/* 00003AE0 */ 0x2D, 0x00, 0x00, 0x72, 0x2D, 0x00, 0x00, 0x72, 0x2D, 0x00, 0x00, 0x94, 0x2D, 0x00, 0x00, 0x94, -/* 00003AF0 */ 0x2D, 0x00, 0x00, 0x9E, 0x2D, 0x00, 0x00, 0x9E, 0x2D, 0x00, 0x00, 0x9F, 0x2D, 0x00, 0x00, 0x9F, -/* 00003B00 */ 0x2D, 0x00, 0x00, 0xBD, 0x2D, 0x00, 0x00, 0xBD, 0x2D, 0x00, 0x00, 0xDB, 0x2D, 0x00, 0x00, 0xDB, -/* 00003B10 */ 0x2D, 0x00, 0x00, 0xF9, 0x2D, 0x00, 0x00, 0xF9, 0x2D, 0x00, 0x00, 0x2A, 0x2E, 0x00, 0x00, 0x2A, -/* 00003B20 */ 0x2E, 0x00, 0x00, 0x3C, 0x2E, 0x00, 0x00, 0x3C, 0x2E, 0x00, 0x00, 0x42, 0x2E, 0x00, 0x00, 0x42, -/* 00003B30 */ 0x2E, 0x00, 0x00, 0x43, 0x2E, 0x00, 0x00, 0x43, 0x2E, 0x00, 0x00, 0xA3, 0x2E, 0x00, 0x00, 0xA3, -/* 00003B40 */ 0x2E, 0x00, 0x00, 0xFB, 0x2E, 0x00, 0x00, 0xFB, 0x2E, 0x00, 0x00, 0x2E, 0x2F, 0x00, 0x00, 0x2E, -/* 00003B50 */ 0x2F, 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x00, 0x60, 0x2F, 0x00, 0x00, 0x60, -/* 00003B60 */ 0x2F, 0x00, 0x00, 0x61, 0x2F, 0x00, 0x00, 0x61, 0x2F, 0x00, 0x00, 0x95, 0x2F, 0x00, 0x00, 0x95, -/* 00003B70 */ 0x2F, 0x00, 0x00, 0xC0, 0x2F, 0x00, 0x00, 0xC0, 0x2F, 0x00, 0x00, 0x29, 0x30, 0x00, 0x00, 0x29, -/* 00003B80 */ 0x30, 0x00, 0x00, 0x5A, 0x30, 0x00, 0x00, 0x5A, 0x30, 0x00, 0x00, 0x7B, 0x30, 0x00, 0x00, 0x7B, -/* 00003B90 */ 0x30, 0x00, 0x00, 0x89, 0x30, 0x00, 0x00, 0x89, 0x30, 0x00, 0x00, 0x93, 0x30, 0x00, 0x00, 0x93, -/* 00003BA0 */ 0x30, 0x00, 0x00, 0xE8, 0x30, 0x00, 0x00, 0xE8, 0x30, 0x00, 0x00, 0xEE, 0x30, 0x00, 0x00, 0xEE, -/* 00003BB0 */ 0x30, 0x00, 0x00, 0xEF, 0x30, 0x00, 0x00, 0xEF, 0x30, 0x00, 0x00, 0x32, 0x31, 0x00, 0x00, 0x32, -/* 00003BC0 */ 0x31, 0x00, 0x00, 0x5F, 0x31, 0x00, 0x00, 0x5F, 0x31, 0x00, 0x00, 0x8D, 0x31, 0x00, 0x00, 0x8D, -/* 00003BD0 */ 0x31, 0x00, 0x00, 0xB4, 0x31, 0x00, 0x00, 0xB4, 0x31, 0x00, 0x00, 0xE0, 0x31, 0x00, 0x00, 0xE0, -/* 00003BE0 */ 0x31, 0x00, 0x00, 0xEA, 0x31, 0x00, 0x00, 0xEA, 0x31, 0x00, 0x00, 0xEB, 0x31, 0x00, 0x00, 0xEB, -/* 00003BF0 */ 0x31, 0x00, 0x00, 0x0D, 0x32, 0x00, 0x00, 0x0D, 0x32, 0x00, 0x00, 0x32, 0x32, 0x00, 0x00, 0x32, -/* 00003C00 */ 0x32, 0x00, 0x00, 0x5A, 0x32, 0x00, 0x00, 0x5A, 0x32, 0x00, 0x00, 0x68, 0x32, 0x00, 0x00, 0x68, -/* 00003C10 */ 0x32, 0x00, 0x00, 0x69, 0x32, 0x00, 0x00, 0x69, 0x32, 0x00, 0x00, 0x95, 0x32, 0x00, 0x00, 0x95, -/* 00003C20 */ 0x32, 0x00, 0x00, 0xE2, 0x32, 0x00, 0x00, 0xE2, 0x32, 0x00, 0x00, 0xFB, 0x32, 0x00, 0x00, 0xFB, -/* 00003C30 */ 0x32, 0x00, 0x00, 0x39, 0x33, 0x00, 0x00, 0x39, 0x33, 0x00, 0x00, 0x6D, 0x33, 0x00, 0x00, 0x6D, -/* 00003C40 */ 0x33, 0x00, 0x00, 0x82, 0x33, 0x00, 0x00, 0x82, 0x33, 0x00, 0x00, 0xB1, 0x33, 0x00, 0x00, 0xB1, -/* 00003C50 */ 0x33, 0x00, 0x00, 0xBF, 0x33, 0x00, 0x00, 0xBF, 0x33, 0x00, 0x00, 0xD0, 0x33, 0x00, 0x00, 0xD0, -/* 00003C60 */ 0x33, 0x00, 0x00, 0x21, 0x34, 0x00, 0x00, 0x21, 0x34, 0x00, 0x00, 0x51, 0x34, 0x00, 0x00, 0x51, -/* 00003C70 */ 0x34, 0x00, 0x00, 0xB7, 0x34, 0x00, 0x00, 0xB7, 0x34, 0x00, 0x00, 0xC1, 0x34, 0x00, 0x00, 0xC1, -/* 00003C80 */ 0x34, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0xEA, 0x34, 0x00, 0x00, 0xEA, -/* 00003C90 */ 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF2, 0x34, 0x00, 0x00, 0xF2, -/* 00003CA0 */ 0x34, 0x00, 0x00, 0x14, 0x35, 0x00, 0x00, 0x14, 0x35, 0x00, 0x00, 0x32, 0x35, 0x00, 0x00, 0x32, -/* 00003CB0 */ 0x35, 0x00, 0x00, 0x57, 0x35, 0x00, 0x00, 0x57, 0x35, 0x00, 0x00, 0x79, 0x35, 0x00, 0x00, 0x79, -/* 00003CC0 */ 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xBB, 0x35, 0x00, 0x00, 0xBB, -/* 00003CD0 */ 0x35, 0x00, 0x00, 0xFB, 0x35, 0x00, 0x00, 0xFB, 0x35, 0x00, 0x00, 0x0A, 0x36, 0x00, 0x00, 0x0A, -/* 00003CE0 */ 0x36, 0x00, 0x00, 0x0B, 0x36, 0x00, 0x00, 0x0B, 0x36, 0x00, 0x00, 0x30, 0x36, 0x00, 0x00, 0x30, -/* 00003CF0 */ 0x36, 0x00, 0x00, 0x70, 0x36, 0x00, 0x00, 0x70, 0x36, 0x00, 0x00, 0x7F, 0x36, 0x00, 0x00, 0x7F, -/* 00003D00 */ 0x36, 0x00, 0x00, 0x80, 0x36, 0x00, 0x00, 0x80, 0x36, 0x00, 0x00, 0xA5, 0x36, 0x00, 0x00, 0xA5, -/* 00003D10 */ 0x36, 0x00, 0x00, 0xDF, 0x36, 0x00, 0x00, 0xDF, 0x36, 0x00, 0x00, 0xEE, 0x36, 0x00, 0x00, 0xEE, -/* 00003D20 */ 0x36, 0x00, 0x00, 0xEF, 0x36, 0x00, 0x00, 0xEF, 0x36, 0x00, 0x00, 0x1C, 0x37, 0x00, 0x00, 0x1C, -/* 00003D30 */ 0x37, 0x00, 0x00, 0x5D, 0x37, 0x00, 0x00, 0x5D, 0x37, 0x00, 0x00, 0x6C, 0x37, 0x00, 0x00, 0x6C, -/* 00003D40 */ 0x37, 0x00, 0x00, 0x6D, 0x37, 0x00, 0x00, 0x6D, 0x37, 0x00, 0x00, 0x92, 0x37, 0x00, 0x00, 0x92, -/* 00003D50 */ 0x37, 0x00, 0x00, 0xB7, 0x37, 0x00, 0x00, 0xB7, 0x37, 0x00, 0x00, 0xD4, 0x37, 0x00, 0x00, 0xD4, -/* 00003D60 */ 0x37, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x43, 0x38, 0x00, 0x00, 0x43, -/* 00003D70 */ 0x38, 0x00, 0x00, 0x55, 0x38, 0x00, 0x00, 0x55, 0x38, 0x00, 0x00, 0x71, 0x38, 0x00, 0x00, 0x71, -/* 00003D80 */ 0x38, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x81, 0x38, 0x00, 0x00, 0x81, -/* 00003D90 */ 0x38, 0x00, 0x00, 0xAC, 0x38, 0x00, 0x00, 0xAC, 0x38, 0x00, 0x00, 0xD8, 0x38, 0x00, 0x00, 0xD8, -/* 00003DA0 */ 0x38, 0x00, 0x00, 0xF4, 0x38, 0x00, 0x00, 0xF4, 0x38, 0x00, 0x00, 0x44, 0x39, 0x00, 0x00, 0x44, -/* 00003DB0 */ 0x39, 0x00, 0x00, 0x69, 0x39, 0x00, 0x00, 0x69, 0x39, 0x00, 0x00, 0x7F, 0x39, 0x00, 0x00, 0x7F, -/* 00003DC0 */ 0x39, 0x00, 0x00, 0xB0, 0x39, 0x00, 0x00, 0xB0, 0x39, 0x00, 0x00, 0xC2, 0x39, 0x00, 0x00, 0xC2, -/* 00003DD0 */ 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0xE1, 0x39, 0x00, 0x00, 0xE1, -/* 00003DE0 */ 0x39, 0x00, 0x00, 0xEB, 0x39, 0x00, 0x00, 0xEB, 0x39, 0x00, 0x00, 0xEC, 0x39, 0x00, 0x00, 0xEC, -/* 00003DF0 */ 0x39, 0x00, 0x00, 0x13, 0x3A, 0x00, 0x00, 0x13, 0x3A, 0x00, 0x00, 0x57, 0x3A, 0x00, 0x00, 0x57, -/* 00003E00 */ 0x3A, 0x00, 0x00, 0x7E, 0x3A, 0x00, 0x00, 0x7E, 0x3A, 0x00, 0x00, 0x7F, 0x3A, 0x00, 0x00, 0x7F, -/* 00003E10 */ 0x3A, 0x00, 0x00, 0xA2, 0x3A, 0x00, 0x00, 0xA2, 0x3A, 0x00, 0x00, 0xC7, 0x3A, 0x00, 0x00, 0xC7, -/* 00003E20 */ 0x3A, 0x00, 0x00, 0x01, 0x3B, 0x00, 0x00, 0x01, 0x3B, 0x00, 0x00, 0x0F, 0x3B, 0x00, 0x00, 0x0F, -/* 00003E30 */ 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x34, 0x3B, 0x00, 0x00, 0x34, -/* 00003E40 */ 0x3B, 0x00, 0x00, 0x66, 0x3B, 0x00, 0x00, 0x66, 0x3B, 0x00, 0x00, 0x74, 0x3B, 0x00, 0x00, 0x74, -/* 00003E50 */ 0x3B, 0x00, 0x00, 0x75, 0x3B, 0x00, 0x00, 0x75, 0x3B, 0x00, 0x00, 0x99, 0x3B, 0x00, 0x00, 0x99, -/* 00003E60 */ 0x3B, 0x00, 0x00, 0xCB, 0x3B, 0x00, 0x00, 0xCB, 0x3B, 0x00, 0x00, 0xD9, 0x3B, 0x00, 0x00, 0xD9, -/* 00003E70 */ 0x3B, 0x00, 0x00, 0xDA, 0x3B, 0x00, 0x00, 0xDA, 0x3B, 0x00, 0x00, 0x41, 0x3C, 0x00, 0x00, 0x41, -/* 00003E80 */ 0x3C, 0x00, 0x00, 0xDC, 0x3C, 0x00, 0x00, 0xDC, 0x3C, 0x00, 0x00, 0xEA, 0x3C, 0x00, 0x00, 0xEA, -/* 00003E90 */ 0x3C, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0x00, 0x05, 0x3D, 0x00, 0x00, 0x05, -/* 00003EA0 */ 0x3D, 0x00, 0x00, 0x0F, 0x3D, 0x00, 0x00, 0x0F, 0x3D, 0x00, 0x00, 0x10, 0x3D, 0x00, 0x00, 0x10, -/* 00003EB0 */ 0x3D, 0x00, 0x00, 0x29, 0x3D, 0x00, 0x00, 0x29, 0x3D, 0x00, 0x00, 0x2F, 0x3D, 0x00, 0x00, 0x2F, -/* 00003EC0 */ 0x3D, 0x00, 0x00, 0x30, 0x3D, 0x00, 0x00, 0x30, 0x3D, 0x00, 0x00, 0x7E, 0x3D, 0x00, 0x00, 0x7E, -/* 00003ED0 */ 0x3D, 0x00, 0x00, 0xAA, 0x3D, 0x00, 0x00, 0xAA, 0x3D, 0x00, 0x00, 0xAB, 0x3D, 0x00, 0x00, 0xAB, -/* 00003EE0 */ 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0x1A, 0x3E, 0x00, 0x00, 0x1A, -/* 00003EF0 */ 0x3E, 0x00, 0x00, 0x1B, 0x3E, 0x00, 0x00, 0x1B, 0x3E, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0x7C, -/* 00003F00 */ 0x3E, 0x00, 0x00, 0xFE, 0x3E, 0x00, 0x00, 0xFE, 0x3E, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x00, 0x0C, -/* 00003F10 */ 0x3F, 0x00, 0x00, 0x0D, 0x3F, 0x00, 0x00, 0x0D, 0x3F, 0x00, 0x00, 0x3C, 0x3F, 0x00, 0x00, 0x3C, -/* 00003F20 */ 0x3F, 0x00, 0x00, 0x4D, 0x3F, 0x00, 0x00, 0x4D, 0x3F, 0x00, 0x00, 0x6A, 0x3F, 0x00, 0x00, 0x6A, -/* 00003F30 */ 0x3F, 0x00, 0x00, 0x74, 0x3F, 0x00, 0x00, 0x74, 0x3F, 0x00, 0x00, 0x7A, 0x3F, 0x00, 0x00, 0x7A, -/* 00003F40 */ 0x3F, 0x00, 0x00, 0x7B, 0x3F, 0x00, 0x00, 0x7B, 0x3F, 0x00, 0x00, 0x95, 0x3F, 0x00, 0x00, 0x95, -/* 00003F50 */ 0x3F, 0x00, 0x00, 0xBF, 0x3F, 0x00, 0x00, 0xBF, 0x3F, 0x00, 0x00, 0xE9, 0x3F, 0x00, 0x00, 0xE9, -/* 00003F60 */ 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xF0, -/* 00003F70 */ 0x3F, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x74, 0x40, 0x00, 0x00, 0x74, -/* 00003F80 */ 0x40, 0x00, 0x00, 0xD2, 0x40, 0x00, 0x00, 0xD2, 0x40, 0x00, 0x00, 0xF8, 0x40, 0x00, 0x00, 0xF8, -/* 00003F90 */ 0x40, 0x00, 0x00, 0x3D, 0x41, 0x00, 0x00, 0x3D, 0x41, 0x00, 0x00, 0xA1, 0x41, 0x00, 0x00, 0xA1, -/* 00003FA0 */ 0x41, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x22, 0x42, 0x00, 0x00, 0x22, -/* 00003FB0 */ 0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0xC5, 0x42, 0x00, 0x00, 0xC5, -/* 00003FC0 */ 0x42, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x66, 0x43, 0x00, 0x00, 0x66, -/* 00003FD0 */ 0x43, 0x00, 0x00, 0xBA, 0x43, 0x00, 0x00, 0xBA, 0x43, 0x00, 0x00, 0xF2, 0x43, 0x00, 0x00, 0xF2, -/* 00003FE0 */ 0x43, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x96, 0x44, 0x00, 0x00, 0x96, -/* 00003FF0 */ 0x44, 0x00, 0x00, 0xEB, 0x44, 0x00, 0x00, 0xEB, 0x44, 0x00, 0x00, 0x57, 0x45, 0x00, 0x00, 0x57, -/* 00004000 */ 0x45, 0x00, 0x00, 0xAD, 0x45, 0x00, 0x00, 0xAD, 0x45, 0x00, 0x00, 0xAE, 0x45, 0x00, 0x00, 0xAE, -/* 00004010 */ 0x45, 0x00, 0x00, 0xCD, 0x45, 0x00, 0x00, 0xCD, 0x45, 0x00, 0x00, 0xEC, 0x45, 0x00, 0x00, 0xEC, -/* 00004020 */ 0x45, 0x00, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x1F, 0x46, 0x00, 0x00, 0x1F, -/* 00004030 */ 0x46, 0x00, 0x00, 0x96, 0x46, 0x00, 0x00, 0x96, 0x46, 0x00, 0x00, 0x03, 0x47, 0x00, 0x00, 0x03, -/* 00004040 */ 0x47, 0x00, 0x00, 0x56, 0x47, 0x00, 0x00, 0x56, 0x47, 0x00, 0x00, 0x99, 0x47, 0x00, 0x00, 0x99, -/* 00004050 */ 0x47, 0x00, 0x00, 0x9A, 0x47, 0x00, 0x00, 0x9A, 0x47, 0x00, 0x00, 0x17, 0x48, 0x00, 0x00, 0x17, -/* 00004060 */ 0x48, 0x00, 0x00, 0xAB, 0x48, 0x00, 0x00, 0xAB, 0x48, 0x00, 0x00, 0x2E, 0x49, 0x00, 0x00, 0x2E, -/* 00004070 */ 0x49, 0x00, 0x00, 0xB1, 0x49, 0x00, 0x00, 0xB1, 0x49, 0x00, 0x00, 0x24, 0x4A, 0x00, 0x00, 0x24, -/* 00004080 */ 0x4A, 0x00, 0x00, 0x25, 0x4A, 0x00, 0x00, 0x25, 0x4A, 0x00, 0x00, 0x8F, 0x4A, 0x00, 0x00, 0x8F, -/* 00004090 */ 0x4A, 0x00, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x09, 0x4B, 0x00, 0x00, 0x09, -/* 000040A0 */ 0x4B, 0x00, 0x00, 0x6C, 0x4B, 0x00, 0x00, 0x6C, 0x4B, 0x00, 0x00, 0xFB, 0x4B, 0x00, 0x00, 0xFB, -/* 000040B0 */ 0x4B, 0x00, 0x00, 0xA4, 0x4C, 0x00, 0x00, 0xA4, 0x4C, 0x00, 0x00, 0x38, 0x4D, 0x00, 0x00, 0x38, -/* 000040C0 */ 0x4D, 0x00, 0x00, 0xCF, 0x4D, 0x00, 0x00, 0xCF, 0x4D, 0x00, 0x00, 0x73, 0x4E, 0x00, 0x00, 0x73, -/* 000040D0 */ 0x4E, 0x00, 0x00, 0x87, 0x4E, 0x00, 0x00, 0x87, 0x4E, 0x00, 0x00, 0x88, 0x4E, 0x00, 0x00, 0x88, -/* 000040E0 */ 0x4E, 0x00, 0x00, 0x09, 0x4F, 0x00, 0x00, 0x09, 0x4F, 0x00, 0x00, 0x75, 0x4F, 0x00, 0x00, 0x75, -/* 000040F0 */ 0x4F, 0x00, 0x00, 0xE5, 0x4F, 0x00, 0x00, 0xE5, 0x4F, 0x00, 0x00, 0x55, 0x50, 0x00, 0x00, 0x55, -/* 00004100 */ 0x50, 0x00, 0x00, 0xC7, 0x50, 0x00, 0x00, 0xC7, 0x50, 0x00, 0x00, 0x3B, 0x51, 0x00, 0x00, 0x3B, -/* 00004110 */ 0x51, 0x00, 0x00, 0xAF, 0x51, 0x00, 0x00, 0xAF, 0x51, 0x00, 0x00, 0xF9, 0x51, 0x00, 0x00, 0xF9, -/* 00004120 */ 0x51, 0x00, 0x00, 0xFA, 0x51, 0x00, 0x00, 0xFA, 0x51, 0x00, 0x00, 0x67, 0x52, 0x00, 0x00, 0x67, -/* 00004130 */ 0x52, 0x00, 0x00, 0x68, 0x52, 0x00, 0x00, 0x68, 0x52, 0x00, 0x00, 0xCE, 0x52, 0x00, 0x00, 0xCE, -/* 00004140 */ 0x52, 0x00, 0x00, 0x59, 0x53, 0x00, 0x00, 0x59, 0x53, 0x00, 0x00, 0xCF, 0x53, 0x00, 0x00, 0xCF, -/* 00004150 */ 0x53, 0x00, 0x00, 0xD5, 0x53, 0x00, 0x00, 0xD5, 0x53, 0x00, 0x00, 0xD6, 0x53, 0x00, 0x00, 0xD6, -/* 00004160 */ 0x53, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x2C, 0x54, 0x00, 0x00, 0x2C, -/* 00004170 */ 0x54, 0x00, 0x00, 0x2D, 0x54, 0x00, 0x00, 0x2D, 0x54, 0x00, 0x00, 0x4E, 0x54, 0x00, 0x00, 0x4E, -/* 00004180 */ 0x54, 0x00, 0x00, 0x76, 0x54, 0x00, 0x00, 0x76, 0x54, 0x00, 0x00, 0x80, 0x54, 0x00, 0x00, 0x80, -/* 00004190 */ 0x54, 0x00, 0x00, 0x81, 0x54, 0x00, 0x00, 0x81, 0x54, 0x00, 0x00, 0xCD, 0x54, 0x00, 0x00, 0xCD, -/* 000041A0 */ 0x54, 0x00, 0x00, 0xD3, 0x54, 0x00, 0x00, 0xD3, 0x54, 0x00, 0x00, 0xD4, 0x54, 0x00, 0x00, 0xD4, -/* 000041B0 */ 0x54, 0x00, 0x00, 0x4B, 0x55, 0x00, 0x00, 0x4B, 0x55, 0x00, 0x00, 0x7A, 0x55, 0x00, 0x00, 0x7A, -/* 000041C0 */ 0x55, 0x00, 0x00, 0xA8, 0x55, 0x00, 0x00, 0xA8, 0x55, 0x00, 0x00, 0xBF, 0x55, 0x00, 0x00, 0xBF, -/* 000041D0 */ 0x55, 0x00, 0x00, 0xC9, 0x55, 0x00, 0x00, 0xC9, 0x55, 0x00, 0x00, 0xCA, 0x55, 0x00, 0x00, 0xCA, -/* 000041E0 */ 0x55, 0x00, 0x00, 0xF5, 0x55, 0x00, 0x00, 0xF5, 0x55, 0x00, 0x00, 0x16, 0x56, 0x00, 0x00, 0x16, -/* 000041F0 */ 0x56, 0x00, 0x00, 0x20, 0x56, 0x00, 0x00, 0x20, 0x56, 0x00, 0x00, 0x21, 0x56, 0x00, 0x00, 0x21, -/* 00004200 */ 0x56, 0x00, 0x00, 0x4F, 0x56, 0x00, 0x00, 0x4F, 0x56, 0x00, 0x00, 0x89, 0x56, 0x00, 0x00, 0x89, -/* 00004210 */ 0x56, 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0xBF, 0x56, 0x00, 0x00, 0xBF, -/* 00004220 */ 0x56, 0x00, 0x00, 0xD6, 0x56, 0x00, 0x00, 0xD6, 0x56, 0x00, 0x00, 0xD7, 0x56, 0x00, 0x00, 0xD7, -/* 00004230 */ 0x56, 0x00, 0x00, 0x15, 0x57, 0x00, 0x00, 0x15, 0x57, 0x00, 0x00, 0x76, 0x57, 0x00, 0x00, 0x76, -/* 00004240 */ 0x57, 0x00, 0x00, 0xB2, 0x57, 0x00, 0x00, 0xB2, 0x57, 0x00, 0x00, 0xC0, 0x57, 0x00, 0x00, 0xC0, -/* 00004250 */ 0x57, 0x00, 0x00, 0xC1, 0x57, 0x00, 0x00, 0xC1, 0x57, 0x00, 0x00, 0xF2, 0x57, 0x00, 0x00, 0xF2, -/* 00004260 */ 0x57, 0x00, 0x00, 0xF3, 0x57, 0x00, 0x00, 0xF3, 0x57, 0x00, 0x00, 0x24, 0x58, 0x00, 0x00, 0x24, -/* 00004270 */ 0x58, 0x00, 0x00, 0x64, 0x58, 0x00, 0x00, 0x64, 0x58, 0x00, 0x00, 0x72, 0x58, 0x00, 0x00, 0x72, -/* 00004280 */ 0x58, 0x00, 0x00, 0x73, 0x58, 0x00, 0x00, 0x73, 0x58, 0x00, 0x00, 0xA9, 0x58, 0x00, 0x00, 0xA9, -/* 00004290 */ 0x58, 0x00, 0x00, 0xAA, 0x58, 0x00, 0x00, 0xAA, 0x58, 0x00, 0x00, 0x0B, 0x59, 0x00, 0x00, 0x0B, -/* 000042A0 */ 0x59, 0x00, 0x00, 0x4B, 0x59, 0x00, 0x00, 0x4B, 0x59, 0x00, 0x00, 0x59, 0x59, 0x00, 0x00, 0x59, -/* 000042B0 */ 0x59, 0x00, 0x00, 0x65, 0x59, 0x00, 0x00, 0x65, 0x59, 0x00, 0x00, 0x66, 0x59, 0x00, 0x00, 0x66, -/* 000042C0 */ 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x81, 0x59, 0x00, 0x00, 0x81, -/* 000042D0 */ 0x59, 0x00, 0x00, 0x82, 0x59, 0x00, 0x00, 0x82, 0x59, 0x00, 0x00, 0xD1, 0x59, 0x00, 0x00, 0xD1, -/* 000042E0 */ 0x59, 0x00, 0x00, 0xEA, 0x59, 0x00, 0x00, 0xEA, 0x59, 0x00, 0x00, 0x01, 0x5A, 0x00, 0x00, 0x01, -/* 000042F0 */ 0x5A, 0x00, 0x00, 0x56, 0x5A, 0x00, 0x00, 0x56, 0x5A, 0x00, 0x00, 0x68, 0x5A, 0x00, 0x00, 0x68, -/* 00004300 */ 0x5A, 0x00, 0x00, 0xC6, 0x5A, 0x00, 0x00, 0xC6, 0x5A, 0x00, 0x00, 0xED, 0x5A, 0x00, 0x00, 0xED, -/* 00004310 */ 0x5A, 0x00, 0x00, 0x7A, 0x5B, 0x00, 0x00, 0x7A, 0x5B, 0x00, 0x00, 0xA1, 0x5B, 0x00, 0x00, 0xA1, -/* 00004320 */ 0x5B, 0x00, 0x00, 0xB3, 0x5B, 0x00, 0x00, 0xB3, 0x5B, 0x00, 0x00, 0xCE, 0x5B, 0x00, 0x00, 0xCE, -/* 00004330 */ 0x5B, 0x00, 0x00, 0xF5, 0x5B, 0x00, 0x00, 0xF5, 0x5B, 0x00, 0x00, 0x57, 0x5C, 0x00, 0x00, 0x57, -/* 00004340 */ 0x5C, 0x00, 0x00, 0x65, 0x5C, 0x00, 0x00, 0x65, 0x5C, 0x00, 0x00, 0x71, 0x5C, 0x00, 0x00, 0x71, -/* 00004350 */ 0x5C, 0x00, 0x00, 0xD9, 0x5C, 0x00, 0x00, 0xD9, 0x5C, 0x00, 0x00, 0xF0, 0x5C, 0x00, 0x00, 0xF0, -/* 00004360 */ 0x5C, 0x00, 0x00, 0xF6, 0x5C, 0x00, 0x00, 0xF6, 0x5C, 0x00, 0x00, 0xF7, 0x5C, 0x00, 0x00, 0xF7, -/* 00004370 */ 0x5C, 0x00, 0x00, 0x4D, 0x5D, 0x00, 0x00, 0x4D, 0x5D, 0x00, 0x00, 0x80, 0x5D, 0x00, 0x00, 0x80, -/* 00004380 */ 0x5D, 0x00, 0x00, 0xB9, 0x5D, 0x00, 0x00, 0xB9, 0x5D, 0x00, 0x00, 0xC3, 0x5D, 0x00, 0x00, 0xC3, -/* 00004390 */ 0x5D, 0x00, 0x00, 0xC4, 0x5D, 0x00, 0x00, 0xC4, 0x5D, 0x00, 0x00, 0xFC, 0x5D, 0x00, 0x00, 0xFC, -/* 000043A0 */ 0x5D, 0x00, 0x00, 0x37, 0x5E, 0x00, 0x00, 0x37, 0x5E, 0x00, 0x00, 0x70, 0x5E, 0x00, 0x00, 0x70, -/* 000043B0 */ 0x5E, 0x00, 0x00, 0x7A, 0x5E, 0x00, 0x00, 0x7A, 0x5E, 0x00, 0x00, 0x7B, 0x5E, 0x00, 0x00, 0x7B, -/* 000043C0 */ 0x5E, 0x00, 0x00, 0xB0, 0x5E, 0x00, 0x00, 0xB0, 0x5E, 0x00, 0x00, 0xB6, 0x5E, 0x00, 0x00, 0xB6, -/* 000043D0 */ 0x5E, 0x00, 0x00, 0xB7, 0x5E, 0x00, 0x00, 0xB7, 0x5E, 0x00, 0x00, 0x08, 0x5F, 0x00, 0x00, 0x08, -/* 000043E0 */ 0x5F, 0x00, 0x00, 0x3B, 0x5F, 0x00, 0x00, 0x3B, 0x5F, 0x00, 0x00, 0x74, 0x5F, 0x00, 0x00, 0x74, -/* 000043F0 */ 0x5F, 0x00, 0x00, 0x7E, 0x5F, 0x00, 0x00, 0x7E, 0x5F, 0x00, 0x00, 0x7F, 0x5F, 0x00, 0x00, 0x7F, -/* 00004400 */ 0x5F, 0x00, 0x00, 0xB7, 0x5F, 0x00, 0x00, 0xB7, 0x5F, 0x00, 0x00, 0xF2, 0x5F, 0x00, 0x00, 0xF2, -/* 00004410 */ 0x5F, 0x00, 0x00, 0x2B, 0x60, 0x00, 0x00, 0x2B, 0x60, 0x00, 0x00, 0x35, 0x60, 0x00, 0x00, 0x35, -/* 00004420 */ 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x66, -/* 00004430 */ 0x60, 0x00, 0x00, 0x6C, 0x60, 0x00, 0x00, 0x6C, 0x60, 0x00, 0x00, 0x6D, 0x60, 0x00, 0x00, 0x6D, -/* 00004440 */ 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0xD1, 0x60, 0x00, 0x00, 0xD1, -/* 00004450 */ 0x60, 0x00, 0x00, 0xE6, 0x60, 0x00, 0x00, 0xE6, 0x60, 0x00, 0x00, 0x19, 0x61, 0x00, 0x00, 0x19, -/* 00004460 */ 0x61, 0x00, 0x00, 0x1A, 0x61, 0x00, 0x00, 0x1A, 0x61, 0x00, 0x00, 0x48, 0x61, 0x00, 0x00, 0x48, -/* 00004470 */ 0x61, 0x00, 0x00, 0x75, 0x61, 0x00, 0x00, 0x75, 0x61, 0x00, 0x00, 0x76, 0x61, 0x00, 0x00, 0x76, -/* 00004480 */ 0x61, 0x00, 0x00, 0xA8, 0x61, 0x00, 0x00, 0xA8, 0x61, 0x00, 0x00, 0xDE, 0x61, 0x00, 0x00, 0xDE, -/* 00004490 */ 0x61, 0x00, 0x00, 0xDF, 0x61, 0x00, 0x00, 0xDF, 0x61, 0x00, 0x00, 0x25, 0x62, 0x00, 0x00, 0x25, -/* 000044A0 */ 0x62, 0x00, 0x00, 0x9C, 0x62, 0x00, 0x00, 0x9C, 0x62, 0x00, 0x00, 0xAE, 0x62, 0x00, 0x00, 0xAE, -/* 000044B0 */ 0x62, 0x00, 0x00, 0xBC, 0x62, 0x00, 0x00, 0xBC, 0x62, 0x00, 0x00, 0xC6, 0x62, 0x00, 0x00, 0xC6, -/* 000044C0 */ 0x62, 0x00, 0x00, 0xC7, 0x62, 0x00, 0x00, 0xC7, 0x62, 0x00, 0x00, 0x0F, 0x63, 0x00, 0x00, 0x0F, -/* 000044D0 */ 0x63, 0x00, 0x00, 0x91, 0x63, 0x00, 0x00, 0x91, 0x63, 0x00, 0x00, 0xA2, 0x63, 0x00, 0x00, 0xA2, -/* 000044E0 */ 0x63, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x0E, 0x64, 0x00, 0x00, 0x0E, -/* 000044F0 */ 0x64, 0x00, 0x00, 0x15, 0x64, 0x00, 0x00, 0x15, 0x64, 0x00, 0x00, 0x16, 0x64, 0x00, 0x00, 0x16, -/* 00004500 */ 0x64, 0x00, 0x00, 0x52, 0x64, 0x00, 0x00, 0x52, 0x64, 0x00, 0x00, 0xB3, 0x64, 0x00, 0x00, 0xB3, -/* 00004510 */ 0x64, 0x00, 0x00, 0xB4, 0x64, 0x00, 0x00, 0xB4, 0x64, 0x00, 0x00, 0x27, 0x65, 0x00, 0x00, 0x27, -/* 00004520 */ 0x65, 0x00, 0x00, 0x77, 0x65, 0x00, 0x00, 0x77, 0x65, 0x00, 0x00, 0xC8, 0x65, 0x00, 0x00, 0xC8, -/* 00004530 */ 0x65, 0x00, 0x00, 0x4B, 0x66, 0x00, 0x00, 0x4B, 0x66, 0x00, 0x00, 0x8D, 0x66, 0x00, 0x00, 0x8D, -/* 00004540 */ 0x66, 0x00, 0x00, 0xDA, 0x66, 0x00, 0x00, 0xDA, 0x66, 0x00, 0x00, 0x42, 0x67, 0x00, 0x00, 0x42, -/* 00004550 */ 0x67, 0x00, 0x00, 0x68, 0x67, 0x00, 0x00, 0x68, 0x67, 0x00, 0x00, 0x69, 0x67, 0x00, 0x00, 0x69, -/* 00004560 */ 0x67, 0x00, 0x00, 0xC2, 0x67, 0x00, 0x00, 0xC2, 0x67, 0x00, 0x00, 0x4D, 0x68, 0x00, 0x00, 0x4D, -/* 00004570 */ 0x68, 0x00, 0x00, 0x93, 0x68, 0x00, 0x00, 0x93, 0x68, 0x00, 0x00, 0xE0, 0x68, 0x00, 0x00, 0xE0, -/* 00004580 */ 0x68, 0x00, 0x00, 0x4C, 0x69, 0x00, 0x00, 0x4C, 0x69, 0x00, 0x00, 0x72, 0x69, 0x00, 0x00, 0x72, -/* 00004590 */ 0x69, 0x00, 0x00, 0x73, 0x69, 0x00, 0x00, 0x73, 0x69, 0x00, 0x00, 0xD0, 0x69, 0x00, 0x00, 0xD0, -/* 000045A0 */ 0x69, 0x00, 0x00, 0x5F, 0x6A, 0x00, 0x00, 0x5F, 0x6A, 0x00, 0x00, 0xA7, 0x6A, 0x00, 0x00, 0xA7, -/* 000045B0 */ 0x6A, 0x00, 0x00, 0xF4, 0x6A, 0x00, 0x00, 0xF4, 0x6A, 0x00, 0x00, 0x62, 0x6B, 0x00, 0x00, 0x62, -/* 000045C0 */ 0x6B, 0x00, 0x00, 0x88, 0x6B, 0x00, 0x00, 0x88, 0x6B, 0x00, 0x00, 0x89, 0x6B, 0x00, 0x00, 0x89, -/* 000045D0 */ 0x6B, 0x00, 0x00, 0xCA, 0x6B, 0x00, 0x00, 0xCA, 0x6B, 0x00, 0x00, 0x3D, 0x6C, 0x00, 0x00, 0x3D, -/* 000045E0 */ 0x6C, 0x00, 0x00, 0x77, 0x6C, 0x00, 0x00, 0x77, 0x6C, 0x00, 0x00, 0xD2, 0x6C, 0x00, 0x00, 0xD2, -/* 000045F0 */ 0x6C, 0x00, 0x00, 0xF8, 0x6C, 0x00, 0x00, 0xF8, 0x6C, 0x00, 0x00, 0xF9, 0x6C, 0x00, 0x00, 0xF9, -/* 00004600 */ 0x6C, 0x00, 0x00, 0x52, 0x6D, 0x00, 0x00, 0x52, 0x6D, 0x00, 0x00, 0xAC, 0x6D, 0x00, 0x00, 0xAC, -/* 00004610 */ 0x6D, 0x00, 0x00, 0xFB, 0x6D, 0x00, 0x00, 0xFB, 0x6D, 0x00, 0x00, 0x77, 0x6E, 0x00, 0x00, 0x77, -/* 00004620 */ 0x6E, 0x00, 0x00, 0xD7, 0x6E, 0x00, 0x00, 0xD7, 0x6E, 0x00, 0x00, 0x3B, 0x6F, 0x00, 0x00, 0x3B, -/* 00004630 */ 0x6F, 0x00, 0x00, 0xA1, 0x6F, 0x00, 0x00, 0xA1, 0x6F, 0x00, 0x00, 0xFA, 0x6F, 0x00, 0x00, 0xFA, -/* 00004640 */ 0x6F, 0x00, 0x00, 0xFB, 0x6F, 0x00, 0x00, 0xFB, 0x6F, 0x00, 0x00, 0x62, 0x70, 0x00, 0x00, 0x62, -/* 00004650 */ 0x70, 0x00, 0x00, 0xA7, 0x70, 0x00, 0x00, 0xA7, 0x70, 0x00, 0x00, 0xEA, 0x70, 0x00, 0x00, 0xEA, -/* 00004660 */ 0x70, 0x00, 0x00, 0x23, 0x71, 0x00, 0x00, 0x23, 0x71, 0x00, 0x00, 0x5E, 0x71, 0x00, 0x00, 0x5E, -/* 00004670 */ 0x71, 0x00, 0x00, 0x99, 0x71, 0x00, 0x00, 0x99, 0x71, 0x00, 0x00, 0xD7, 0x71, 0x00, 0x00, 0xD7, -/* 00004680 */ 0x71, 0x00, 0x00, 0x14, 0x72, 0x00, 0x00, 0x14, 0x72, 0x00, 0x00, 0x49, 0x72, 0x00, 0x00, 0x49, -/* 00004690 */ 0x72, 0x00, 0x00, 0xAA, 0x72, 0x00, 0x00, 0xAA, 0x72, 0x00, 0x00, 0xF5, 0x72, 0x00, 0x00, 0xF5, -/* 000046A0 */ 0x72, 0x00, 0x00, 0x40, 0x73, 0x00, 0x00, 0x40, 0x73, 0x00, 0x00, 0x8B, 0x73, 0x00, 0x00, 0x8B, -/* 000046B0 */ 0x73, 0x00, 0x00, 0xD5, 0x73, 0x00, 0x00, 0xD5, 0x73, 0x00, 0x00, 0xD6, 0x73, 0x00, 0x00, 0xD6, -/* 000046C0 */ 0x73, 0x00, 0x00, 0x55, 0x74, 0x00, 0x00, 0x55, 0x74, 0x00, 0x00, 0xF0, 0x74, 0x00, 0x00, 0xF0, -/* 000046D0 */ 0x74, 0x00, 0x00, 0x10, 0x75, 0x00, 0x00, 0x10, 0x75, 0x00, 0x00, 0x30, 0x75, 0x00, 0x00, 0x30, -/* 000046E0 */ 0x75, 0x00, 0x00, 0x4E, 0x75, 0x00, 0x00, 0x4E, 0x75, 0x00, 0x00, 0x5C, 0x75, 0x00, 0x00, 0x5C, -/* 000046F0 */ 0x75, 0x00, 0x00, 0x5D, 0x75, 0x00, 0x00, 0x5D, 0x75, 0x00, 0x00, 0xC0, 0x75, 0x00, 0x00, 0xC0, -/* 00004700 */ 0x75, 0x00, 0x00, 0x3B, 0x76, 0x00, 0x00, 0x3B, 0x76, 0x00, 0x00, 0x7B, 0x76, 0x00, 0x00, 0x7B, -/* 00004710 */ 0x76, 0x00, 0x00, 0xAC, 0x76, 0x00, 0x00, 0xAC, 0x76, 0x00, 0x00, 0x2B, 0x77, 0x00, 0x00, 0x2B, -/* 00004720 */ 0x77, 0x00, 0x00, 0x81, 0x77, 0x00, 0x00, 0x81, 0x77, 0x00, 0x00, 0xC5, 0x77, 0x00, 0x00, 0xC5, -/* 00004730 */ 0x77, 0x00, 0x00, 0xC6, 0x77, 0x00, 0x00, 0xC6, 0x77, 0x00, 0x00, 0x45, 0x78, 0x00, 0x00, 0x45, -/* 00004740 */ 0x78, 0x00, 0x00, 0x8D, 0x78, 0x00, 0x00, 0x8D, 0x78, 0x00, 0x00, 0xB6, 0x78, 0x00, 0x00, 0xB6, -/* 00004750 */ 0x78, 0x00, 0x00, 0xFB, 0x78, 0x00, 0x00, 0xFB, 0x78, 0x00, 0x00, 0x0D, 0x79, 0x00, 0x00, 0x0D, -/* 00004760 */ 0x79, 0x00, 0x00, 0x1D, 0x79, 0x00, 0x00, 0x1D, 0x79, 0x00, 0x00, 0x1E, 0x79, 0x00, 0x00, 0x1E, -/* 00004770 */ 0x79, 0x00, 0x00, 0x56, 0x79, 0x00, 0x00, 0x56, 0x79, 0x00, 0x00, 0x62, 0x79, 0x00, 0x00, 0x62, -/* 00004780 */ 0x79, 0x00, 0x00, 0x7B, 0x79, 0x00, 0x00, 0x7B, 0x79, 0x00, 0x00, 0x85, 0x79, 0x00, 0x00, 0x85, -/* 00004790 */ 0x79, 0x00, 0x00, 0x86, 0x79, 0x00, 0x00, 0x86, 0x79, 0x00, 0x00, 0xD7, 0x79, 0x00, 0x00, 0xD7, -/* 000047A0 */ 0x79, 0x00, 0x00, 0x05, 0x7A, 0x00, 0x00, 0x05, 0x7A, 0x00, 0x00, 0x30, 0x7A, 0x00, 0x00, 0x30, -/* 000047B0 */ 0x7A, 0x00, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x97, 0x7A, 0x00, 0x00, 0x97, -/* 000047C0 */ 0x7A, 0x00, 0x00, 0xC1, 0x7A, 0x00, 0x00, 0xC1, 0x7A, 0x00, 0x00, 0xCB, 0x7A, 0x00, 0x00, 0xCB, -/* 000047D0 */ 0x7A, 0x00, 0x00, 0xCC, 0x7A, 0x00, 0x00, 0xCC, 0x7A, 0x00, 0x00, 0xEC, 0x7A, 0x00, 0x00, 0xEC, -/* 000047E0 */ 0x7A, 0x00, 0x00, 0x0F, 0x7B, 0x00, 0x00, 0x0F, 0x7B, 0x00, 0x00, 0x31, 0x7B, 0x00, 0x00, 0x31, -/* 000047F0 */ 0x7B, 0x00, 0x00, 0x85, 0x7B, 0x00, 0x00, 0x85, 0x7B, 0x00, 0x00, 0xAE, 0x7B, 0x00, 0x00, 0xAE, -/* 00004800 */ 0x7B, 0x00, 0x00, 0x18, 0x7C, 0x00, 0x00, 0x18, 0x7C, 0x00, 0x00, 0x31, 0x7C, 0x00, 0x00, 0x31, -/* 00004810 */ 0x7C, 0x00, 0x00, 0x83, 0x7C, 0x00, 0x00, 0x83, 0x7C, 0x00, 0x00, 0xCC, 0x7C, 0x00, 0x00, 0xCC, -/* 00004820 */ 0x7C, 0x00, 0x00, 0xF2, 0x7C, 0x00, 0x00, 0xF2, 0x7C, 0x00, 0x00, 0x54, 0x7D, 0x00, 0x00, 0x54, -/* 00004830 */ 0x7D, 0x00, 0x00, 0x62, 0x7D, 0x00, 0x00, 0x62, 0x7D, 0x00, 0x00, 0x73, 0x7D, 0x00, 0x00, 0x73, -/* 00004840 */ 0x7D, 0x00, 0x00, 0xBC, 0x7D, 0x00, 0x00, 0xBC, 0x7D, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x00, 0x18, -/* 00004850 */ 0x7E, 0x00, 0x00, 0x37, 0x7E, 0x00, 0x00, 0x37, 0x7E, 0x00, 0x00, 0x59, 0x7E, 0x00, 0x00, 0x59, -/* 00004860 */ 0x7E, 0x00, 0x00, 0x63, 0x7E, 0x00, 0x00, 0x63, 0x7E, 0x00, 0x00, 0x64, 0x7E, 0x00, 0x00, 0x64, -/* 00004870 */ 0x7E, 0x00, 0x00, 0x8B, 0x7E, 0x00, 0x00, 0x8B, 0x7E, 0x00, 0x00, 0xB7, 0x7E, 0x00, 0x00, 0xB7, -/* 00004880 */ 0x7E, 0x00, 0x00, 0xE1, 0x7E, 0x00, 0x00, 0xE1, 0x7E, 0x00, 0x00, 0xEB, 0x7E, 0x00, 0x00, 0xEB, -/* 00004890 */ 0x7E, 0x00, 0x00, 0xEC, 0x7E, 0x00, 0x00, 0xEC, 0x7E, 0x00, 0x00, 0x48, 0x7F, 0x00, 0x00, 0x48, -/* 000048A0 */ 0x7F, 0x00, 0x00, 0x9D, 0x7F, 0x00, 0x00, 0x9D, 0x7F, 0x00, 0x00, 0xC3, 0x7F, 0x00, 0x00, 0xC3, -/* 000048B0 */ 0x7F, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x16, 0x80, 0x00, 0x00, 0x16, -/* 000048C0 */ 0x80, 0x00, 0x00, 0x56, 0x80, 0x00, 0x00, 0x56, 0x80, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x64, -/* 000048D0 */ 0x80, 0x00, 0x00, 0x6F, 0x80, 0x00, 0x00, 0x6F, 0x80, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x70, -/* 000048E0 */ 0x80, 0x00, 0x00, 0xC6, 0x80, 0x00, 0x00, 0xC6, 0x80, 0x00, 0x00, 0xF9, 0x80, 0x00, 0x00, 0xF9, -/* 000048F0 */ 0x80, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x9A, 0x81, 0x00, 0x00, 0x9A, -/* 00004900 */ 0x81, 0x00, 0x00, 0xC4, 0x81, 0x00, 0x00, 0xC4, 0x81, 0x00, 0x00, 0xCE, 0x81, 0x00, 0x00, 0xCE, -/* 00004910 */ 0x81, 0x00, 0x00, 0xCF, 0x81, 0x00, 0x00, 0xCF, 0x81, 0x00, 0x00, 0x11, 0x82, 0x00, 0x00, 0x11, -/* 00004920 */ 0x82, 0x00, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x98, 0x82, 0x00, 0x00, 0x98, -/* 00004930 */ 0x82, 0x00, 0x00, 0xA9, 0x82, 0x00, 0x00, 0xA9, 0x82, 0x00, 0x00, 0xFD, 0x82, 0x00, 0x00, 0xFD, -/* 00004940 */ 0x82, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x08, 0x83, 0x00, 0x00, 0x08, -/* 00004950 */ 0x83, 0x00, 0x00, 0x2E, 0x83, 0x00, 0x00, 0x2E, 0x83, 0x00, 0x00, 0x35, 0x83, 0x00, 0x00, 0x35, -/* 00004960 */ 0x83, 0x00, 0x00, 0x36, 0x83, 0x00, 0x00, 0x36, 0x83, 0x00, 0x00, 0x6B, 0x83, 0x00, 0x00, 0x6B, -/* 00004970 */ 0x83, 0x00, 0x00, 0x8D, 0x83, 0x00, 0x00, 0x8D, 0x83, 0x00, 0x00, 0x8E, 0x83, 0x00, 0x00, 0x8E, -/* 00004980 */ 0x83, 0x00, 0x00, 0xCA, 0x83, 0x00, 0x00, 0xCA, 0x83, 0x00, 0x00, 0xCB, 0x83, 0x00, 0x00, 0xCB, -/* 00004990 */ 0x83, 0x00, 0x00, 0x14, 0x84, 0x00, 0x00, 0x14, 0x84, 0x00, 0x00, 0x47, 0x84, 0x00, 0x00, 0x47, -/* 000049A0 */ 0x84, 0x00, 0x00, 0x77, 0x84, 0x00, 0x00, 0x77, 0x84, 0x00, 0x00, 0x89, 0x84, 0x00, 0x00, 0x89, -/* 000049B0 */ 0x84, 0x00, 0x00, 0x8A, 0x84, 0x00, 0x00, 0x8A, 0x84, 0x00, 0x00, 0x19, 0x85, 0x00, 0x00, 0x19, -/* 000049C0 */ 0x85, 0x00, 0x00, 0x6F, 0x85, 0x00, 0x00, 0x6F, 0x85, 0x00, 0x00, 0x81, 0x85, 0x00, 0x00, 0x81, -/* 000049D0 */ 0x85, 0x00, 0x00, 0x82, 0x85, 0x00, 0x00, 0x82, 0x85, 0x00, 0x00, 0xBB, 0x85, 0x00, 0x00, 0xBB, -/* 000049E0 */ 0x85, 0x00, 0x00, 0xBC, 0x85, 0x00, 0x00, 0xBC, 0x85, 0x00, 0x00, 0xDF, 0x85, 0x00, 0x00, 0xDF, -/* 000049F0 */ 0x85, 0x00, 0x00, 0x15, 0x86, 0x00, 0x00, 0x15, 0x86, 0x00, 0x00, 0x4B, 0x86, 0x00, 0x00, 0x4B, -/* 00004A00 */ 0x86, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x9E, 0x86, 0x00, 0x00, 0x9E, -/* 00004A10 */ 0x86, 0x00, 0x00, 0xB0, 0x86, 0x00, 0x00, 0xB0, 0x86, 0x00, 0x00, 0xB1, 0x86, 0x00, 0x00, 0xB1, -/* 00004A20 */ 0x86, 0x00, 0x00, 0x22, 0x87, 0x00, 0x00, 0x22, 0x87, 0x00, 0x00, 0x81, 0x87, 0x00, 0x00, 0x81, -/* 00004A30 */ 0x87, 0x00, 0x00, 0x02, 0x88, 0x00, 0x00, 0x02, 0x88, 0x00, 0x00, 0x70, 0x88, 0x00, 0x00, 0x70, -/* 00004A40 */ 0x88, 0x00, 0x00, 0xE3, 0x88, 0x00, 0x00, 0xE3, 0x88, 0x00, 0x00, 0x45, 0x89, 0x00, 0x00, 0x45, -/* 00004A50 */ 0x89, 0x00, 0x00, 0x46, 0x89, 0x00, 0x00, 0x46, 0x89, 0x00, 0x00, 0x7E, 0x89, 0x00, 0x00, 0x7E, -/* 00004A60 */ 0x89, 0x00, 0x00, 0xBF, 0x89, 0x00, 0x00, 0xBF, 0x89, 0x00, 0x00, 0x2D, 0x8A, 0x00, 0x00, 0x2D, -/* 00004A70 */ 0x8A, 0x00, 0x00, 0x2E, 0x8A, 0x00, 0x00, 0x2E, 0x8A, 0x00, 0x00, 0x59, 0x8A, 0x00, 0x00, 0x59, -/* 00004A80 */ 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0x07, 0x8B, 0x00, 0x00, 0x07, -/* 00004A90 */ 0x8B, 0x00, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x3A, 0x8B, 0x00, 0x00, 0x3A, -/* 00004AA0 */ 0x8B, 0x00, 0x00, 0xA5, 0x8B, 0x00, 0x00, 0xA5, 0x8B, 0x00, 0x00, 0x27, 0x8C, 0x00, 0x00, 0x27, -/* 00004AB0 */ 0x8C, 0x00, 0x00, 0x53, 0x8C, 0x00, 0x00, 0x53, 0x8C, 0x00, 0x00, 0x9F, 0x8C, 0x00, 0x00, 0x9F, -/* 00004AC0 */ 0x8C, 0x00, 0x00, 0xE6, 0x8C, 0x00, 0x00, 0xE6, 0x8C, 0x00, 0x00, 0x82, 0x8D, 0x00, 0x00, 0x82, -/* 00004AD0 */ 0x8D, 0x00, 0x00, 0xCE, 0x8D, 0x00, 0x00, 0xCE, 0x8D, 0x00, 0x00, 0x05, 0x8E, 0x00, 0x00, 0x05, -/* 00004AE0 */ 0x8E, 0x00, 0x00, 0x89, 0x8E, 0x00, 0x00, 0x89, 0x8E, 0x00, 0x00, 0xAE, 0x8E, 0x00, 0x00, 0xAE, -/* 00004AF0 */ 0x8E, 0x00, 0x00, 0xDE, 0x8E, 0x00, 0x00, 0xDE, 0x8E, 0x00, 0x00, 0xFC, 0x8E, 0x00, 0x00, 0xFC, -/* 00004B00 */ 0x8E, 0x00, 0x00, 0x9F, 0x8F, 0x00, 0x00, 0x9F, 0x8F, 0x00, 0x00, 0xFE, 0x8F, 0x00, 0x00, 0xFE, -/* 00004B10 */ 0x8F, 0x00, 0x00, 0x2D, 0x90, 0x00, 0x00, 0x2D, 0x90, 0x00, 0x00, 0x47, 0x90, 0x00, 0x00, 0x47, -/* 00004B20 */ 0x90, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x71, 0x90, 0x00, 0x00, 0x71, -/* 00004B30 */ 0x90, 0x00, 0x00, 0xA0, 0x90, 0x00, 0x00, 0xA0, 0x90, 0x00, 0x00, 0x0F, 0x91, 0x00, 0x00, 0x0F, -/* 00004B40 */ 0x91, 0x00, 0x00, 0x3E, 0x91, 0x00, 0x00, 0x3E, 0x91, 0x00, 0x00, 0xCC, 0x91, 0x00, 0x00, 0xCC, -/* 00004B50 */ 0x91, 0x00, 0x00, 0x03, 0x92, 0x00, 0x00, 0x03, 0x92, 0x00, 0x00, 0x6D, 0x92, 0x00, 0x00, 0x6D, -/* 00004B60 */ 0x92, 0x00, 0x00, 0x87, 0x92, 0x00, 0x00, 0x87, 0x92, 0x00, 0x00, 0x9D, 0x92, 0x00, 0x00, 0x9D, -/* 00004B70 */ 0x92, 0x00, 0x00, 0xB8, 0x92, 0x00, 0x00, 0xB8, 0x92, 0x00, 0x00, 0xE7, 0x92, 0x00, 0x00, 0xE7, -/* 00004B80 */ 0x92, 0x00, 0x00, 0xFD, 0x92, 0x00, 0x00, 0xFD, 0x92, 0x00, 0x00, 0x0F, 0x93, 0x00, 0x00, 0x0F, -/* 00004B90 */ 0x93, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x3F, 0x93, 0x00, 0x00, 0x3F, -/* 00004BA0 */ 0x93, 0x00, 0x00, 0x6E, 0x93, 0x00, 0x00, 0x6E, 0x93, 0x00, 0x00, 0x88, 0x93, 0x00, 0x00, 0x88, -/* 00004BB0 */ 0x93, 0x00, 0x00, 0x03, 0x94, 0x00, 0x00, 0x03, 0x94, 0x00, 0x00, 0x25, 0x94, 0x00, 0x00, 0x25, -/* 00004BC0 */ 0x94, 0x00, 0x00, 0x53, 0x94, 0x00, 0x00, 0x53, 0x94, 0x00, 0x00, 0x81, 0x94, 0x00, 0x00, 0x81, -/* 00004BD0 */ 0x94, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0xF3, 0x94, 0x00, 0x00, 0xF3, -/* 00004BE0 */ 0x94, 0x00, 0x00, 0x7C, 0x95, 0x00, 0x00, 0x7C, 0x95, 0x00, 0x00, 0xE5, 0x95, 0x00, 0x00, 0xE5, -/* 00004BF0 */ 0x95, 0x00, 0x00, 0x24, 0x96, 0x00, 0x00, 0x24, 0x96, 0x00, 0x00, 0x3A, 0x96, 0x00, 0x00, 0x3A, -/* 00004C00 */ 0x96, 0x00, 0x00, 0x3B, 0x96, 0x00, 0x00, 0x3B, 0x96, 0x00, 0x00, 0x60, 0x96, 0x00, 0x00, 0x60, -/* 00004C10 */ 0x96, 0x00, 0x00, 0x8D, 0x96, 0x00, 0x00, 0x8D, 0x96, 0x00, 0x00, 0xBA, 0x96, 0x00, 0x00, 0xBA, -/* 00004C20 */ 0x96, 0x00, 0x00, 0xE7, 0x96, 0x00, 0x00, 0xE7, 0x96, 0x00, 0x00, 0x04, 0x97, 0x00, 0x00, 0x04, -/* 00004C30 */ 0x97, 0x00, 0x00, 0x31, 0x97, 0x00, 0x00, 0x31, 0x97, 0x00, 0x00, 0x47, 0x97, 0x00, 0x00, 0x47, -/* 00004C40 */ 0x97, 0x00, 0x00, 0x59, 0x97, 0x00, 0x00, 0x59, 0x97, 0x00, 0x00, 0x5A, 0x97, 0x00, 0x00, 0x5A, -/* 00004C50 */ 0x97, 0x00, 0x00, 0x8B, 0x97, 0x00, 0x00, 0x8B, 0x97, 0x00, 0x00, 0xB8, 0x97, 0x00, 0x00, 0xB8, -/* 00004C60 */ 0x97, 0x00, 0x00, 0xCA, 0x97, 0x00, 0x00, 0xCA, 0x97, 0x00, 0x00, 0xCB, 0x97, 0x00, 0x00, 0xCB, -/* 00004C70 */ 0x97, 0x00, 0x00, 0xF8, 0x97, 0x00, 0x00, 0xF8, 0x97, 0x00, 0x00, 0x1D, 0x98, 0x00, 0x00, 0x1D, -/* 00004C80 */ 0x98, 0x00, 0x00, 0x2F, 0x98, 0x00, 0x00, 0x2F, 0x98, 0x00, 0x00, 0x30, 0x98, 0x00, 0x00, 0x30, -/* 00004C90 */ 0x98, 0x00, 0x00, 0x61, 0x98, 0x00, 0x00, 0x61, 0x98, 0x00, 0x00, 0x8F, 0x98, 0x00, 0x00, 0x8F, -/* 00004CA0 */ 0x98, 0x00, 0x00, 0xDC, 0x98, 0x00, 0x00, 0xDC, 0x98, 0x00, 0x00, 0x24, 0x99, 0x00, 0x00, 0x24, -/* 00004CB0 */ 0x99, 0x00, 0x00, 0x4E, 0x99, 0x00, 0x00, 0x4E, 0x99, 0x00, 0x00, 0x84, 0x99, 0x00, 0x00, 0x84, -/* 00004CC0 */ 0x99, 0x00, 0x00, 0xC6, 0x99, 0x00, 0x00, 0xC6, 0x99, 0x00, 0x00, 0xF8, 0x99, 0x00, 0x00, 0xF8, -/* 00004CD0 */ 0x99, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x58, 0x9A, 0x00, 0x00, 0x58, -/* 00004CE0 */ 0x9A, 0x00, 0x00, 0x8F, 0x9A, 0x00, 0x00, 0x8F, 0x9A, 0x00, 0x00, 0x9D, 0x9A, 0x00, 0x00, 0x9D, -/* 00004CF0 */ 0x9A, 0x00, 0x00, 0x9E, 0x9A, 0x00, 0x00, 0x9E, 0x9A, 0x00, 0x00, 0x0D, 0x9B, 0x00, 0x00, 0x0D, -/* 00004D00 */ 0x9B, 0x00, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x71, 0x9B, 0x00, 0x00, 0x71, -/* 00004D10 */ 0x9B, 0x00, 0x00, 0xCB, 0x9B, 0x00, 0x00, 0xCB, 0x9B, 0x00, 0x00, 0xDD, 0x9B, 0x00, 0x00, 0xDD, -/* 00004D20 */ 0x9B, 0x00, 0x00, 0x07, 0x9C, 0x00, 0x00, 0x07, 0x9C, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x00, 0x37, -/* 00004D30 */ 0x9C, 0x00, 0x00, 0x49, 0x9C, 0x00, 0x00, 0x49, 0x9C, 0x00, 0x00, 0xED, 0x9C, 0x00, 0x00, 0xED, -/* 00004D40 */ 0x9C, 0x00, 0x00, 0x19, 0x9D, 0x00, 0x00, 0x19, 0x9D, 0x00, 0x00, 0x42, 0x9D, 0x00, 0x00, 0x42, -/* 00004D50 */ 0x9D, 0x00, 0x00, 0x7C, 0x9D, 0x00, 0x00, 0x7C, 0x9D, 0x00, 0x00, 0xC9, 0x9D, 0x00, 0x00, 0xC9, -/* 00004D60 */ 0x9D, 0x00, 0x00, 0x82, 0x9E, 0x00, 0x00, 0x82, 0x9E, 0x00, 0x00, 0x96, 0x9E, 0x00, 0x00, 0x96, -/* 00004D70 */ 0x9E, 0x00, 0x00, 0x97, 0x9E, 0x00, 0x00, 0x97, 0x9E, 0x00, 0x00, 0xBE, 0x9E, 0x00, 0x00, 0xBE, -/* 00004D80 */ 0x9E, 0x00, 0x00, 0xBF, 0x9E, 0x00, 0x00, 0xBF, 0x9E, 0x00, 0x00, 0xE5, 0x9E, 0x00, 0x00, 0xE5, -/* 00004D90 */ 0x9E, 0x00, 0x00, 0x4B, 0x9F, 0x00, 0x00, 0x4B, 0x9F, 0x00, 0x00, 0xC2, 0x9F, 0x00, 0x00, 0xC2, -/* 00004DA0 */ 0x9F, 0x00, 0x00, 0x34, 0xA0, 0x00, 0x00, 0x34, 0xA0, 0x00, 0x00, 0x61, 0xA0, 0x00, 0x00, 0x61, -/* 00004DB0 */ 0xA0, 0x00, 0x00, 0x8E, 0xA0, 0x00, 0x00, 0x8E, 0xA0, 0x00, 0x00, 0xD5, 0xA0, 0x00, 0x00, 0xD5, -/* 00004DC0 */ 0xA0, 0x00, 0x00, 0x1C, 0xA1, 0x00, 0x00, 0x1C, 0xA1, 0x00, 0x00, 0x1D, 0xA1, 0x00, 0x00, 0x1D, -/* 00004DD0 */ 0xA1, 0x00, 0x00, 0x5C, 0xA1, 0x00, 0x00, 0x5C, 0xA1, 0x00, 0x00, 0x9B, 0xA1, 0x00, 0x00, 0x9B, -/* 00004DE0 */ 0xA1, 0x00, 0x00, 0xB1, 0xA1, 0x00, 0x00, 0xB1, 0xA1, 0x00, 0x00, 0xB2, 0xA1, 0x00, 0x00, 0xB2, -/* 00004DF0 */ 0xA1, 0x00, 0x00, 0xE9, 0xA1, 0x00, 0x00, 0xE9, 0xA1, 0x00, 0x00, 0x1D, 0xA2, 0x00, 0x00, 0x1D, -/* 00004E00 */ 0xA2, 0x00, 0x00, 0x66, 0xA2, 0x00, 0x00, 0x66, 0xA2, 0x00, 0x00, 0x7C, 0xA2, 0x00, 0x00, 0x7C, -/* 00004E10 */ 0xA2, 0x00, 0x00, 0x7D, 0xA2, 0x00, 0x00, 0x7D, 0xA2, 0x00, 0x00, 0xB8, 0xA2, 0x00, 0x00, 0xB8, -/* 00004E20 */ 0xA2, 0x00, 0x00, 0xFE, 0xA2, 0x00, 0x00, 0xFE, 0xA2, 0x00, 0x00, 0xFF, 0xA2, 0x00, 0x00, 0xFF, -/* 00004E30 */ 0xA2, 0x00, 0x00, 0x35, 0xA3, 0x00, 0x00, 0x35, 0xA3, 0x00, 0x00, 0x74, 0xA3, 0x00, 0x00, 0x74, -/* 00004E40 */ 0xA3, 0x00, 0x00, 0xB9, 0xA3, 0x00, 0x00, 0xB9, 0xA3, 0x00, 0x00, 0xCF, 0xA3, 0x00, 0x00, 0xCF, -/* 00004E50 */ 0xA3, 0x00, 0x00, 0xD0, 0xA3, 0x00, 0x00, 0xD0, 0xA3, 0x00, 0x00, 0x18, 0xA4, 0x00, 0x00, 0x18, -/* 00004E60 */ 0xA4, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x46, 0xA4, 0x00, 0x00, 0x46, -/* 00004E70 */ 0xA4, 0x00, 0x00, 0xAE, 0xA4, 0x00, 0x00, 0xAE, 0xA4, 0x00, 0x00, 0xEB, 0xA4, 0x00, 0x00, 0xEB, -/* 00004E80 */ 0xA4, 0x00, 0x00, 0x0B, 0xA5, 0x00, 0x00, 0x0B, 0xA5, 0x00, 0x00, 0x1D, 0xA5, 0x00, 0x00, 0x1D, -/* 00004E90 */ 0xA5, 0x00, 0x00, 0x5B, 0xA5, 0x00, 0x00, 0x5B, 0xA5, 0x00, 0x00, 0x5C, 0xA5, 0x00, 0x00, 0x5C, -/* 00004EA0 */ 0xA5, 0x00, 0x00, 0x85, 0xA5, 0x00, 0x00, 0x85, 0xA5, 0x00, 0x00, 0xB9, 0xA5, 0x00, 0x00, 0xB9, -/* 00004EB0 */ 0xA5, 0x00, 0x00, 0x1B, 0xA6, 0x00, 0x00, 0x1B, 0xA6, 0x00, 0x00, 0x31, 0xA6, 0x00, 0x00, 0x31, -/* 00004EC0 */ 0xA6, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x79, 0xA6, 0x00, 0x00, 0x79, -/* 00004ED0 */ 0xA6, 0x00, 0x00, 0xD6, 0xA6, 0x00, 0x00, 0xD6, 0xA6, 0x00, 0x00, 0x38, 0xA7, 0x00, 0x00, 0x38, -/* 00004EE0 */ 0xA7, 0x00, 0x00, 0x4E, 0xA7, 0x00, 0x00, 0x4E, 0xA7, 0x00, 0x00, 0x4F, 0xA7, 0x00, 0x00, 0x4F, -/* 00004EF0 */ 0xA7, 0x00, 0x00, 0x72, 0xA7, 0x00, 0x00, 0x72, 0xA7, 0x00, 0x00, 0x95, 0xA7, 0x00, 0x00, 0x95, -/* 00004F00 */ 0xA7, 0x00, 0x00, 0x96, 0xA7, 0x00, 0x00, 0x96, 0xA7, 0x00, 0x00, 0x4E, 0xA8, 0x00, 0x00, 0x4E, -/* 00004F10 */ 0xA8, 0x00, 0x00, 0x60, 0xA8, 0x00, 0x00, 0x60, 0xA8, 0x00, 0x00, 0xAF, 0xA8, 0x00, 0x00, 0xAF, -/* 00004F20 */ 0xA8, 0x00, 0x00, 0xB0, 0xA8, 0x00, 0x00, 0xB0, 0xA8, 0x00, 0x00, 0x42, 0xA9, 0x00, 0x00, 0x42, -/* 00004F30 */ 0xA9, 0x00, 0x00, 0x43, 0xA9, 0x00, 0x00, 0x43, 0xA9, 0x00, 0x00, 0xD4, 0xA9, 0x00, 0x00, 0xD4, -/* 00004F40 */ 0xA9, 0x00, 0x00, 0x18, 0xAA, 0x00, 0x00, 0x18, 0xAA, 0x00, 0x00, 0x19, 0xAA, 0x00, 0x00, 0x19, -/* 00004F50 */ 0xAA, 0x00, 0x00, 0xAE, 0xAA, 0x00, 0x00, 0xAE, 0xAA, 0x00, 0x00, 0xAF, 0xAA, 0x00, 0x00, 0xAF, -/* 00004F60 */ 0xAA, 0x00, 0x00, 0xFD, 0xAA, 0x00, 0x00, 0xFD, 0xAA, 0x00, 0x00, 0x35, 0xAB, 0x00, 0x00, 0x35, -/* 00004F70 */ 0xAB, 0x00, 0x00, 0x6D, 0xAB, 0x00, 0x00, 0x6D, 0xAB, 0x00, 0x00, 0xDB, 0xAB, 0x00, 0x00, 0xDB, -/* 00004F80 */ 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0x40, 0xAC, 0x00, 0x00, 0x40, -/* 00004F90 */ 0xAC, 0x00, 0x00, 0xA1, 0xAC, 0x00, 0x00, 0xA1, 0xAC, 0x00, 0x00, 0x0F, 0xAD, 0x00, 0x00, 0x0F, -/* 00004FA0 */ 0xAD, 0x00, 0x00, 0x29, 0xAD, 0x00, 0x00, 0x29, 0xAD, 0x00, 0x00, 0x2A, 0xAD, 0x00, 0x00, 0x2A, -/* 00004FB0 */ 0xAD, 0x00, 0x00, 0x4B, 0xAD, 0x00, 0x00, 0x4B, 0xAD, 0x00, 0x00, 0x86, 0xAD, 0x00, 0x00, 0x86, -/* 00004FC0 */ 0xAD, 0x00, 0x00, 0xBF, 0xAD, 0x00, 0x00, 0xBF, 0xAD, 0x00, 0x00, 0x04, 0xAE, 0x00, 0x00, 0x04, -/* 00004FD0 */ 0xAE, 0x00, 0x00, 0x55, 0xAE, 0x00, 0x00, 0x55, 0xAE, 0x00, 0x00, 0xB0, 0xAE, 0x00, 0x00, 0xB0, -/* 00004FE0 */ 0xAE, 0x00, 0x00, 0x45, 0xAF, 0x00, 0x00, 0x45, 0xAF, 0x00, 0x00, 0xDA, 0xAF, 0x00, 0x00, 0xDA, -/* 00004FF0 */ 0xAF, 0x00, 0x00, 0xF4, 0xAF, 0x00, 0x00, 0xF4, 0xAF, 0x00, 0x00, 0x41, 0xB0, 0x00, 0x00, 0x41, -/* 00005000 */ 0xB0, 0x00, 0x00, 0x55, 0xB0, 0x00, 0x00, 0x55, 0xB0, 0x00, 0x00, 0x56, 0xB0, 0x00, 0x00, 0x56, -/* 00005010 */ 0xB0, 0x00, 0x00, 0x9C, 0xB0, 0x00, 0x00, 0x9C, 0xB0, 0x00, 0x00, 0xE4, 0xB0, 0x00, 0x00, 0xE4, -/* 00005020 */ 0xB0, 0x00, 0x00, 0x1C, 0xB1, 0x00, 0x00, 0x1C, 0xB1, 0x00, 0x00, 0x82, 0xB1, 0x00, 0x00, 0x82, -/* 00005030 */ 0xB1, 0x00, 0x00, 0x9C, 0xB1, 0x00, 0x00, 0x9C, 0xB1, 0x00, 0x00, 0x9D, 0xB1, 0x00, 0x00, 0x9D, -/* 00005040 */ 0xB1, 0x00, 0x00, 0xE8, 0xB1, 0x00, 0x00, 0xE8, 0xB1, 0x00, 0x00, 0x49, 0xB2, 0x00, 0x00, 0x49, -/* 00005050 */ 0xB2, 0x00, 0x00, 0xAF, 0xB2, 0x00, 0x00, 0xAF, 0xB2, 0x00, 0x00, 0xC9, 0xB2, 0x00, 0x00, 0xC9, -/* 00005060 */ 0xB2, 0x00, 0x00, 0xCA, 0xB2, 0x00, 0x00, 0xCA, 0xB2, 0x00, 0x00, 0x06, 0xB3, 0x00, 0x00, 0x06, -/* 00005070 */ 0xB3, 0x00, 0x00, 0x44, 0xB3, 0x00, 0x00, 0x44, 0xB3, 0x00, 0x00, 0x58, 0xB3, 0x00, 0x00, 0x58, -/* 00005080 */ 0xB3, 0x00, 0x00, 0x59, 0xB3, 0x00, 0x00, 0x59, 0xB3, 0x00, 0x00, 0x7A, 0xB3, 0x00, 0x00, 0x7A, -/* 00005090 */ 0xB3, 0x00, 0x00, 0x88, 0xB3, 0x00, 0x00, 0x88, 0xB3, 0x00, 0x00, 0x92, 0xB3, 0x00, 0x00, 0x92, -/* 000050A0 */ 0xB3, 0x00, 0x00, 0xDD, 0xB3, 0x00, 0x00, 0xDD, 0xB3, 0x00, 0x00, 0xF7, 0xB3, 0x00, 0x00, 0xF7, -/* 000050B0 */ 0xB3, 0x00, 0x00, 0x01, 0xB4, 0x00, 0x00, 0x01, 0xB4, 0x00, 0x00, 0x02, 0xB4, 0x00, 0x00, 0x02, -/* 000050C0 */ 0xB4, 0x00, 0x00, 0x3C, 0xB4, 0x00, 0x00, 0x3C, 0xB4, 0x00, 0x00, 0x62, 0xB4, 0x00, 0x00, 0x62, -/* 000050D0 */ 0xB4, 0x00, 0x00, 0xB1, 0xB4, 0x00, 0x00, 0xB1, 0xB4, 0x00, 0x00, 0xE2, 0xB4, 0x00, 0x00, 0xE2, -/* 000050E0 */ 0xB4, 0x00, 0x00, 0x16, 0xB5, 0x00, 0x00, 0x16, 0xB5, 0x00, 0x00, 0x81, 0xB5, 0x00, 0x00, 0x81, -/* 000050F0 */ 0xB5, 0x00, 0x00, 0xCD, 0xB5, 0x00, 0x00, 0xCD, 0xB5, 0x00, 0x00, 0x20, 0xB6, 0x00, 0x00, 0x20, -/* 00005100 */ 0xB6, 0x00, 0x00, 0x33, 0xB6, 0x00, 0x00, 0x33, 0xB6, 0x00, 0x00, 0x45, 0xB6, 0x00, 0x00, 0x45, -/* 00005110 */ 0xB6, 0x00, 0x00, 0x80, 0xB6, 0x00, 0x00, 0x80, 0xB6, 0x00, 0x00, 0xB3, 0xB6, 0x00, 0x00, 0xB3, -/* 00005120 */ 0xB6, 0x00, 0x00, 0x42, 0xB7, 0x00, 0x00, 0x42, 0xB7, 0x00, 0x00, 0xB3, 0xB7, 0x00, 0x00, 0xB3, -/* 00005130 */ 0xB7, 0x00, 0x00, 0x2A, 0xB8, 0x00, 0x00, 0x2A, 0xB8, 0x00, 0x00, 0x3D, 0xB8, 0x00, 0x00, 0x3D, -/* 00005140 */ 0xB8, 0x00, 0x00, 0x4F, 0xB8, 0x00, 0x00, 0x4F, 0xB8, 0x00, 0x00, 0x50, 0xB8, 0x00, 0x00, 0x50, -/* 00005150 */ 0xB8, 0x00, 0x00, 0x8C, 0xB8, 0x00, 0x00, 0x8C, 0xB8, 0x00, 0x00, 0xDD, 0xB8, 0x00, 0x00, 0xDD, -/* 00005160 */ 0xB8, 0x00, 0x00, 0x14, 0xB9, 0x00, 0x00, 0x14, 0xB9, 0x00, 0x00, 0x44, 0xB9, 0x00, 0x00, 0x44, -/* 00005170 */ 0xB9, 0x00, 0x00, 0x56, 0xB9, 0x00, 0x00, 0x56, 0xB9, 0x00, 0x00, 0x57, 0xB9, 0x00, 0x00, 0x57, -/* 00005180 */ 0xB9, 0x00, 0x00, 0xEE, 0xB9, 0x00, 0x00, 0xEE, 0xB9, 0x00, 0x00, 0x4C, 0xBA, 0x00, 0x00, 0x4C, -/* 00005190 */ 0xBA, 0x00, 0x00, 0x5E, 0xBA, 0x00, 0x00, 0x5E, 0xBA, 0x00, 0x00, 0x5F, 0xBA, 0x00, 0x00, 0x5F, -/* 000051A0 */ 0xBA, 0x00, 0x00, 0x9C, 0xBA, 0x00, 0x00, 0x9C, 0xBA, 0x00, 0x00, 0x9D, 0xBA, 0x00, 0x00, 0x9D, -/* 000051B0 */ 0xBA, 0x00, 0x00, 0xC0, 0xBA, 0x00, 0x00, 0xC0, 0xBA, 0x00, 0x00, 0xF6, 0xBA, 0x00, 0x00, 0xF6, -/* 000051C0 */ 0xBA, 0x00, 0x00, 0x2C, 0xBB, 0x00, 0x00, 0x2C, 0xBB, 0x00, 0x00, 0x45, 0xBB, 0x00, 0x00, 0x45, -/* 000051D0 */ 0xBB, 0x00, 0x00, 0x7F, 0xBB, 0x00, 0x00, 0x7F, 0xBB, 0x00, 0x00, 0x91, 0xBB, 0x00, 0x00, 0x91, -/* 000051E0 */ 0xBB, 0x00, 0x00, 0x92, 0xBB, 0x00, 0x00, 0x92, 0xBB, 0x00, 0x00, 0x03, 0xBC, 0x00, 0x00, 0x03, -/* 000051F0 */ 0xBC, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x76, 0xBC, 0x00, 0x00, 0x76, -/* 00005200 */ 0xBC, 0x00, 0x00, 0xC1, 0xBC, 0x00, 0x00, 0xC1, 0xBC, 0x00, 0x00, 0xEC, 0xBC, 0x00, 0x00, 0xEC, -/* 00005210 */ 0xBC, 0x00, 0x00, 0x2C, 0xBD, 0x00, 0x00, 0x2C, 0xBD, 0x00, 0x00, 0x5F, 0xBD, 0x00, 0x00, 0x5F, -/* 00005220 */ 0xBD, 0x00, 0x00, 0xA0, 0xBD, 0x00, 0x00, 0xA0, 0xBD, 0x00, 0x00, 0xB2, 0xBD, 0x00, 0x00, 0xB2, -/* 00005230 */ 0xBD, 0x00, 0x00, 0xB3, 0xBD, 0x00, 0x00, 0xB3, 0xBD, 0x00, 0x00, 0x12, 0xBE, 0x00, 0x00, 0x12, -/* 00005240 */ 0xBE, 0x00, 0x00, 0x8F, 0xBE, 0x00, 0x00, 0x8F, 0xBE, 0x00, 0x00, 0xBF, 0xBE, 0x00, 0x00, 0xBF, -/* 00005250 */ 0xBE, 0x00, 0x00, 0xC0, 0xBE, 0x00, 0x00, 0xC0, 0xBE, 0x00, 0x00, 0x27, 0xBF, 0x00, 0x00, 0x27, -/* 00005260 */ 0xBF, 0x00, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x95, 0xBF, 0x00, 0x00, 0x95, -/* 00005270 */ 0xBF, 0x00, 0x00, 0xD3, 0xBF, 0x00, 0x00, 0xD3, 0xBF, 0x00, 0x00, 0xD4, 0xBF, 0x00, 0x00, 0xD4, -/* 00005280 */ 0xBF, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x76, 0xC0, 0x00, 0x00, 0x76, -/* 00005290 */ 0xC0, 0x00, 0x00, 0x77, 0xC0, 0x00, 0x00, 0x77, 0xC0, 0x00, 0x00, 0xF1, 0xC0, 0x00, 0x00, 0xF1, -/* 000052A0 */ 0xC0, 0x00, 0x00, 0x60, 0xC1, 0x00, 0x00, 0x60, 0xC1, 0x00, 0x00, 0xE7, 0xC1, 0x00, 0x00, 0xE7, -/* 000052B0 */ 0xC1, 0x00, 0x00, 0xF9, 0xC1, 0x00, 0x00, 0xF9, 0xC1, 0x00, 0x00, 0xFA, 0xC1, 0x00, 0x00, 0xFA, -/* 000052C0 */ 0xC1, 0x00, 0x00, 0x5B, 0xC2, 0x00, 0x00, 0x5B, 0xC2, 0x00, 0x00, 0x5C, 0xC2, 0x00, 0x00, 0x5C, -/* 000052D0 */ 0xC2, 0x00, 0x00, 0x94, 0xC2, 0x00, 0x00, 0x94, 0xC2, 0x00, 0x00, 0xD5, 0xC2, 0x00, 0x00, 0xD5, -/* 000052E0 */ 0xC2, 0x00, 0x00, 0x42, 0xC3, 0x00, 0x00, 0x42, 0xC3, 0x00, 0x00, 0x43, 0xC3, 0x00, 0x00, 0x43, -/* 000052F0 */ 0xC3, 0x00, 0x00, 0x77, 0xC3, 0x00, 0x00, 0x77, 0xC3, 0x00, 0x00, 0xD5, 0xC3, 0x00, 0x00, 0xD5, -/* 00005300 */ 0xC3, 0x00, 0x00, 0x1E, 0xC4, 0x00, 0x00, 0x1E, 0xC4, 0x00, 0x00, 0x30, 0xC4, 0x00, 0x00, 0x30, -/* 00005310 */ 0xC4, 0x00, 0x00, 0x31, 0xC4, 0x00, 0x00, 0x31, 0xC4, 0x00, 0x00, 0x5D, 0xC4, 0x00, 0x00, 0x5D, -/* 00005320 */ 0xC4, 0x00, 0x00, 0x98, 0xC4, 0x00, 0x00, 0x98, 0xC4, 0x00, 0x00, 0xD5, 0xC4, 0x00, 0x00, 0xD5, -/* 00005330 */ 0xC4, 0x00, 0x00, 0xEB, 0xC4, 0x00, 0x00, 0xEB, 0xC4, 0x00, 0x00, 0x41, 0xC5, 0x00, 0x00, 0x41, -/* 00005340 */ 0xC5, 0x00, 0x00, 0x5B, 0xC5, 0x00, 0x00, 0x5B, 0xC5, 0x00, 0x00, 0xA7, 0xC5, 0x00, 0x00, 0xA7, -/* 00005350 */ 0xC5, 0x00, 0x00, 0xC9, 0xC5, 0x00, 0x00, 0xC9, 0xC5, 0x00, 0x00, 0xF7, 0xC5, 0x00, 0x00, 0xF7, -/* 00005360 */ 0xC5, 0x00, 0x00, 0x44, 0xC6, 0x00, 0x00, 0x44, 0xC6, 0x00, 0x00, 0x5A, 0xC6, 0x00, 0x00, 0x5A, -/* 00005370 */ 0xC6, 0x00, 0x00, 0xD0, 0xC6, 0x00, 0x00, 0xD0, 0xC6, 0x00, 0x00, 0x34, 0xC7, 0x00, 0x00, 0x34, -/* 00005380 */ 0xC7, 0x00, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x77, 0xC7, 0x00, 0x00, 0x77, -/* 00005390 */ 0xC7, 0x00, 0x00, 0xA8, 0xC7, 0x00, 0x00, 0xA8, 0xC7, 0x00, 0x00, 0x11, 0xC8, 0x00, 0x00, 0x11, -/* 000053A0 */ 0xC8, 0x00, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x9B, 0xC8, 0x00, 0x00, 0x9B, -/* 000053B0 */ 0xC8, 0x00, 0x00, 0xB8, 0xC8, 0x00, 0x00, 0xB8, 0xC8, 0x00, 0x00, 0x12, 0xC9, 0x00, 0x00, 0x12, -/* 000053C0 */ 0xC9, 0x00, 0x00, 0x28, 0xC9, 0x00, 0x00, 0x28, 0xC9, 0x00, 0x00, 0x3A, 0xC9, 0x00, 0x00, 0x3A, -/* 000053D0 */ 0xC9, 0x00, 0x00, 0x3B, 0xC9, 0x00, 0x00, 0x3B, 0xC9, 0x00, 0x00, 0xCF, 0xC9, 0x00, 0x00, 0xCF, -/* 000053E0 */ 0xC9, 0x00, 0x00, 0xD0, 0xC9, 0x00, 0x00, 0xD0, 0xC9, 0x00, 0x00, 0x01, 0xCA, 0x00, 0x00, 0x01, -/* 000053F0 */ 0xCA, 0x00, 0x00, 0x39, 0xCA, 0x00, 0x00, 0x39, 0xCA, 0x00, 0x00, 0x7C, 0xCA, 0x00, 0x00, 0x7C, -/* 00005400 */ 0xCA, 0x00, 0x00, 0xAA, 0xCA, 0x00, 0x00, 0xAA, 0xCA, 0x00, 0x00, 0xAB, 0xCA, 0x00, 0x00, 0xAB, -/* 00005410 */ 0xCA, 0x00, 0x00, 0xD9, 0xCA, 0x00, 0x00, 0xD9, 0xCA, 0x00, 0x00, 0x11, 0xCB, 0x00, 0x00, 0x11, -/* 00005420 */ 0xCB, 0x00, 0x00, 0x23, 0xCB, 0x00, 0x00, 0x23, 0xCB, 0x00, 0x00, 0x24, 0xCB, 0x00, 0x00, 0x24, -/* 00005430 */ 0xCB, 0x00, 0x00, 0x59, 0xCB, 0x00, 0x00, 0x59, 0xCB, 0x00, 0x00, 0x9F, 0xCB, 0x00, 0x00, 0x9F, -/* 00005440 */ 0xCB, 0x00, 0x00, 0xFE, 0xCB, 0x00, 0x00, 0xFE, 0xCB, 0x00, 0x00, 0x36, 0xCC, 0x00, 0x00, 0x36, -/* 00005450 */ 0xCC, 0x00, 0x00, 0x98, 0xCC, 0x00, 0x00, 0x98, 0xCC, 0x00, 0x00, 0xD5, 0xCC, 0x00, 0x00, 0xD5, -/* 00005460 */ 0xCC, 0x00, 0x00, 0x35, 0xCD, 0x00, 0x00, 0x35, 0xCD, 0x00, 0x00, 0x72, 0xCD, 0x00, 0x00, 0x72, -/* 00005470 */ 0xCD, 0x00, 0x00, 0xD2, 0xCD, 0x00, 0x00, 0xD2, 0xCD, 0x00, 0x00, 0xE8, 0xCD, 0x00, 0x00, 0xE8, -/* 00005480 */ 0xCD, 0x00, 0x00, 0xFA, 0xCD, 0x00, 0x00, 0xFA, 0xCD, 0x00, 0x00, 0xFB, 0xCD, 0x00, 0x00, 0xFB, -/* 00005490 */ 0xCD, 0x00, 0x00, 0x47, 0xCE, 0x00, 0x00, 0x47, 0xCE, 0x00, 0x00, 0x95, 0xCE, 0x00, 0x00, 0x95, -/* 000054A0 */ 0xCE, 0x00, 0x00, 0xE3, 0xCE, 0x00, 0x00, 0xE3, 0xCE, 0x00, 0x00, 0xE4, 0xCE, 0x00, 0x00, 0xE4, -/* 000054B0 */ 0xCE, 0x00, 0x00, 0x22, 0xCF, 0x00, 0x00, 0x22, 0xCF, 0x00, 0x00, 0x7A, 0xCF, 0x00, 0x00, 0x7A, -/* 000054C0 */ 0xCF, 0x00, 0x00, 0xD2, 0xCF, 0x00, 0x00, 0xD2, 0xCF, 0x00, 0x00, 0xE4, 0xCF, 0x00, 0x00, 0xE4, -/* 000054D0 */ 0xCF, 0x00, 0x00, 0xE5, 0xCF, 0x00, 0x00, 0xE5, 0xCF, 0x00, 0x00, 0x25, 0xD0, 0x00, 0x00, 0x25, -/* 000054E0 */ 0xD0, 0x00, 0x00, 0x5F, 0xD0, 0x00, 0x00, 0x5F, 0xD0, 0x00, 0x00, 0x60, 0xD0, 0x00, 0x00, 0x60, -/* 000054F0 */ 0xD0, 0x00, 0x00, 0x76, 0xD0, 0x00, 0x00, 0x76, 0xD0, 0x00, 0x00, 0xCA, 0xD0, 0x00, 0x00, 0xCA, -/* 00005500 */ 0xD0, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0x11, 0xD1, 0x00, 0x00, 0x11, -/* 00005510 */ 0xD1, 0x00, 0x00, 0x2D, 0xD1, 0x00, 0x00, 0x2D, 0xD1, 0x00, 0x00, 0x57, 0xD1, 0x00, 0x00, 0x57, -/* 00005520 */ 0xD1, 0x00, 0x00, 0xAE, 0xD1, 0x00, 0x00, 0xAE, 0xD1, 0x00, 0x00, 0x33, 0xD2, 0x00, 0x00, 0x33, -/* 00005530 */ 0xD2, 0x00, 0x00, 0x98, 0xD2, 0x00, 0x00, 0x98, 0xD2, 0x00, 0x00, 0xD3, 0xD2, 0x00, 0x00, 0xD3, -/* 00005540 */ 0xD2, 0x00, 0x00, 0xE5, 0xD2, 0x00, 0x00, 0xE5, 0xD2, 0x00, 0x00, 0xE6, 0xD2, 0x00, 0x00, 0xE6, -/* 00005550 */ 0xD2, 0x00, 0x00, 0x1B, 0xD3, 0x00, 0x00, 0x1B, 0xD3, 0x00, 0x00, 0x2D, 0xD3, 0x00, 0x00, 0x2D, -/* 00005560 */ 0xD3, 0x00, 0x00, 0x8E, 0xD3, 0x00, 0x00, 0x8E, 0xD3, 0x00, 0x00, 0xA0, 0xD3, 0x00, 0x00, 0xA0, -/* 00005570 */ 0xD3, 0x00, 0x00, 0xA1, 0xD3, 0x00, 0x00, 0xA1, 0xD3, 0x00, 0x00, 0x1F, 0xD4, 0x00, 0x00, 0x1F, -/* 00005580 */ 0xD4, 0x00, 0x00, 0x5E, 0xD4, 0x00, 0x00, 0x5E, 0xD4, 0x00, 0x00, 0x6C, 0xD4, 0x00, 0x00, 0x6C, -/* 00005590 */ 0xD4, 0x00, 0x00, 0x6D, 0xD4, 0x00, 0x00, 0x6D, 0xD4, 0x00, 0x00, 0xDD, 0xD4, 0x00, 0x00, 0xDD, -/* 000055A0 */ 0xD4, 0x00, 0x00, 0x2C, 0xD5, 0x00, 0x00, 0x2C, 0xD5, 0x00, 0x00, 0x8D, 0xD5, 0x00, 0x00, 0x8D, -/* 000055B0 */ 0xD5, 0x00, 0x00, 0x9F, 0xD5, 0x00, 0x00, 0x9F, 0xD5, 0x00, 0x00, 0xA0, 0xD5, 0x00, 0x00, 0xA0, -/* 000055C0 */ 0xD5, 0x00, 0x00, 0xDA, 0xD5, 0x00, 0x00, 0xDA, 0xD5, 0x00, 0x00, 0x2B, 0xD6, 0x00, 0x00, 0x2B, -/* 000055D0 */ 0xD6, 0x00, 0x00, 0x2C, 0xD6, 0x00, 0x00, 0x2C, 0xD6, 0x00, 0x00, 0x5D, 0xD6, 0x00, 0x00, 0x5D, -/* 000055E0 */ 0xD6, 0x00, 0x00, 0xB1, 0xD6, 0x00, 0x00, 0xB1, 0xD6, 0x00, 0x00, 0x06, 0xD7, 0x00, 0x00, 0x06, -/* 000055F0 */ 0xD7, 0x00, 0x00, 0x1A, 0xD7, 0x00, 0x00, 0x1A, 0xD7, 0x00, 0x00, 0x1B, 0xD7, 0x00, 0x00, 0x1B, -/* 00005600 */ 0xD7, 0x00, 0x00, 0x42, 0xD7, 0x00, 0x00, 0x42, 0xD7, 0x00, 0x00, 0x6C, 0xD7, 0x00, 0x00, 0x6C, -/* 00005610 */ 0xD7, 0x00, 0x00, 0xD2, 0xD7, 0x00, 0x00, 0xD2, 0xD7, 0x00, 0x00, 0x49, 0xD8, 0x00, 0x00, 0x49, -/* 00005620 */ 0xD8, 0x00, 0x00, 0xBB, 0xD8, 0x00, 0x00, 0xBB, 0xD8, 0x00, 0x00, 0xE8, 0xD8, 0x00, 0x00, 0xE8, -/* 00005630 */ 0xD8, 0x00, 0x00, 0x15, 0xD9, 0x00, 0x00, 0x15, 0xD9, 0x00, 0x00, 0x5C, 0xD9, 0x00, 0x00, 0x5C, -/* 00005640 */ 0xD9, 0x00, 0x00, 0xA3, 0xD9, 0x00, 0x00, 0xA3, 0xD9, 0x00, 0x00, 0xA4, 0xD9, 0x00, 0x00, 0xA4, -/* 00005650 */ 0xD9, 0x00, 0x00, 0xE3, 0xD9, 0x00, 0x00, 0xE3, 0xD9, 0x00, 0x00, 0x26, 0xDA, 0x00, 0x00, 0x26, -/* 00005660 */ 0xDA, 0x00, 0x00, 0x3C, 0xDA, 0x00, 0x00, 0x3C, 0xDA, 0x00, 0x00, 0x3D, 0xDA, 0x00, 0x00, 0x3D, -/* 00005670 */ 0xDA, 0x00, 0x00, 0x74, 0xDA, 0x00, 0x00, 0x74, 0xDA, 0x00, 0x00, 0x75, 0xDA, 0x00, 0x00, 0x75, -/* 00005680 */ 0xDA, 0x00, 0x00, 0xA9, 0xDA, 0x00, 0x00, 0xA9, 0xDA, 0x00, 0x00, 0xF6, 0xDA, 0x00, 0x00, 0xF6, -/* 00005690 */ 0xDA, 0x00, 0x00, 0x0C, 0xDB, 0x00, 0x00, 0x0C, 0xDB, 0x00, 0x00, 0x0D, 0xDB, 0x00, 0x00, 0x0D, -/* 000056A0 */ 0xDB, 0x00, 0x00, 0x48, 0xDB, 0x00, 0x00, 0x48, 0xDB, 0x00, 0x00, 0x8E, 0xDB, 0x00, 0x00, 0x8E, -/* 000056B0 */ 0xDB, 0x00, 0x00, 0x8F, 0xDB, 0x00, 0x00, 0x8F, 0xDB, 0x00, 0x00, 0xC5, 0xDB, 0x00, 0x00, 0xC5, -/* 000056C0 */ 0xDB, 0x00, 0x00, 0x04, 0xDC, 0x00, 0x00, 0x04, 0xDC, 0x00, 0x00, 0x49, 0xDC, 0x00, 0x00, 0x49, -/* 000056D0 */ 0xDC, 0x00, 0x00, 0x5F, 0xDC, 0x00, 0x00, 0x5F, 0xDC, 0x00, 0x00, 0x60, 0xDC, 0x00, 0x00, 0x60, -/* 000056E0 */ 0xDC, 0x00, 0x00, 0xAC, 0xDC, 0x00, 0x00, 0xAC, 0xDC, 0x00, 0x00, 0xAD, 0xDC, 0x00, 0x00, 0xAD, -/* 000056F0 */ 0xDC, 0x00, 0x00, 0x12, 0xDD, 0x00, 0x00, 0x12, 0xDD, 0x00, 0x00, 0x4E, 0xDD, 0x00, 0x00, 0x4E, -/* 00005700 */ 0xDD, 0x00, 0x00, 0x4F, 0xDD, 0x00, 0x00, 0x4F, 0xDD, 0x00, 0x00, 0x6F, 0xDD, 0x00, 0x00, 0x6F, -/* 00005710 */ 0xDD, 0x00, 0x00, 0x81, 0xDD, 0x00, 0x00, 0x81, 0xDD, 0x00, 0x00, 0xC7, 0xDD, 0x00, 0x00, 0xC7, -/* 00005720 */ 0xDD, 0x00, 0x00, 0xC8, 0xDD, 0x00, 0x00, 0xC8, 0xDD, 0x00, 0x00, 0xED, 0xDD, 0x00, 0x00, 0xED, -/* 00005730 */ 0xDD, 0x00, 0x00, 0x1B, 0xDE, 0x00, 0x00, 0x1B, 0xDE, 0x00, 0x00, 0x1C, 0xDE, 0x00, 0x00, 0x1C, -/* 00005740 */ 0xDE, 0x00, 0x00, 0x50, 0xDE, 0x00, 0x00, 0x50, 0xDE, 0x00, 0x00, 0xB9, 0xDE, 0x00, 0x00, 0xB9, -/* 00005750 */ 0xDE, 0x00, 0x00, 0xCF, 0xDE, 0x00, 0x00, 0xCF, 0xDE, 0x00, 0x00, 0xD0, 0xDE, 0x00, 0x00, 0xD0, -/* 00005760 */ 0xDE, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0x78, 0xDF, 0x00, 0x00, 0x78, -/* 00005770 */ 0xDF, 0x00, 0x00, 0xE1, 0xDF, 0x00, 0x00, 0xE1, 0xDF, 0x00, 0x00, 0xF7, 0xDF, 0x00, 0x00, 0xF7, -/* 00005780 */ 0xDF, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00, 0x50, 0xE0, 0x00, 0x00, 0x50, -/* 00005790 */ 0xE0, 0x00, 0x00, 0xAA, 0xE0, 0x00, 0x00, 0xAA, 0xE0, 0x00, 0x00, 0xBC, 0xE0, 0x00, 0x00, 0xBC, -/* 000057A0 */ 0xE0, 0x00, 0x00, 0x0D, 0xE1, 0x00, 0x00, 0x0D, 0xE1, 0x00, 0x00, 0x0E, 0xE1, 0x00, 0x00, 0x0E, -/* 000057B0 */ 0xE1, 0x00, 0x00, 0xA8, 0xE1, 0x00, 0x00, 0xA8, 0xE1, 0x00, 0x00, 0xA9, 0xE1, 0x00, 0x00, 0xA9, -/* 000057C0 */ 0xE1, 0x00, 0x00, 0x25, 0xE2, 0x00, 0x00, 0x25, 0xE2, 0x00, 0x00, 0xA3, 0xE2, 0x00, 0x00, 0xA3, -/* 000057D0 */ 0xE2, 0x00, 0x00, 0xC7, 0xE2, 0x00, 0x00, 0xC7, 0xE2, 0x00, 0x00, 0xC8, 0xE2, 0x00, 0x00, 0xC8, -/* 000057E0 */ 0xE2, 0x00, 0x00, 0x61, 0xE3, 0x00, 0x00, 0x61, 0xE3, 0x00, 0x00, 0xA9, 0xE3, 0x00, 0x00, 0xA9, -/* 000057F0 */ 0xE3, 0x00, 0x00, 0x46, 0xE4, 0x00, 0x00, 0x46, 0xE4, 0x00, 0x00, 0x47, 0xE4, 0x00, 0x00, 0x47, -/* 00005800 */ 0xE4, 0x00, 0x00, 0x99, 0xE4, 0x00, 0x00, 0x99, 0xE4, 0x00, 0x00, 0xD1, 0xE4, 0x00, 0x00, 0xD1, -/* 00005810 */ 0xE4, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x7F, -/* 00005820 */ 0xE5, 0x00, 0x00, 0x99, 0xE5, 0x00, 0x00, 0x99, 0xE5, 0x00, 0x00, 0xE4, 0xE5, 0x00, 0x00, 0xE4, -/* 00005830 */ 0xE5, 0x00, 0x00, 0x49, 0xE6, 0x00, 0x00, 0x49, 0xE6, 0x00, 0x00, 0xBF, 0xE6, 0x00, 0x00, 0xBF, -/* 00005840 */ 0xE6, 0x00, 0x00, 0xD9, 0xE6, 0x00, 0x00, 0xD9, 0xE6, 0x00, 0x00, 0xDA, 0xE6, 0x00, 0x00, 0xDA, -/* 00005850 */ 0xE6, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x21, 0xE7, 0x00, 0x00, 0x21, -/* 00005860 */ 0xE7, 0x00, 0x00, 0x7D, 0xE7, 0x00, 0x00, 0x7D, 0xE7, 0x00, 0x00, 0xD3, 0xE7, 0x00, 0x00, 0xD3, -/* 00005870 */ 0xE7, 0x00, 0x00, 0x2A, 0xE8, 0x00, 0x00, 0x2A, 0xE8, 0x00, 0x00, 0x48, 0xE8, 0x00, 0x00, 0x48, -/* 00005880 */ 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, 0x65, 0xE8, 0x00, 0x00, 0x65, -/* 00005890 */ 0xE8, 0x00, 0x00, 0xA7, 0xE8, 0x00, 0x00, 0xA7, 0xE8, 0x00, 0x00, 0xF4, 0xE8, 0x00, 0x00, 0xF4, -/* 000058A0 */ 0xE8, 0x00, 0x00, 0x08, 0xE9, 0x00, 0x00, 0x08, 0xE9, 0x00, 0x00, 0x09, 0xE9, 0x00, 0x00, 0x09, -/* 000058B0 */ 0xE9, 0x00, 0x00, 0x52, 0xE9, 0x00, 0x00, 0x52, 0xE9, 0x00, 0x00, 0x99, 0xE9, 0x00, 0x00, 0x99, -/* 000058C0 */ 0xE9, 0x00, 0x00, 0xD1, 0xE9, 0x00, 0x00, 0xD1, 0xE9, 0x00, 0x00, 0x3E, 0xEA, 0x00, 0x00, 0x3E, -/* 000058D0 */ 0xEA, 0x00, 0x00, 0x58, 0xEA, 0x00, 0x00, 0x58, 0xEA, 0x00, 0x00, 0x59, 0xEA, 0x00, 0x00, 0x59, -/* 000058E0 */ 0xEA, 0x00, 0x00, 0xA4, 0xEA, 0x00, 0x00, 0xA4, 0xEA, 0x00, 0x00, 0x09, 0xEB, 0x00, 0x00, 0x09, -/* 000058F0 */ 0xEB, 0x00, 0x00, 0x76, 0xEB, 0x00, 0x00, 0x76, 0xEB, 0x00, 0x00, 0x90, 0xEB, 0x00, 0x00, 0x90, -/* 00005900 */ 0xEB, 0x00, 0x00, 0x91, 0xEB, 0x00, 0x00, 0x91, 0xEB, 0x00, 0x00, 0xCC, 0xEB, 0x00, 0x00, 0xCC, -/* 00005910 */ 0xEB, 0x00, 0x00, 0x0A, 0xEC, 0x00, 0x00, 0x0A, 0xEC, 0x00, 0x00, 0x1E, 0xEC, 0x00, 0x00, 0x1E, -/* 00005920 */ 0xEC, 0x00, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x44, 0xEC, 0x00, 0x00, 0x44, -/* 00005930 */ 0xEC, 0x00, 0x00, 0x52, 0xEC, 0x00, 0x00, 0x52, 0xEC, 0x00, 0x00, 0x5C, 0xEC, 0x00, 0x00, 0x5C, -/* 00005940 */ 0xEC, 0x00, 0x00, 0xAB, 0xEC, 0x00, 0x00, 0xAB, 0xEC, 0x00, 0x00, 0xC5, 0xEC, 0x00, 0x00, 0xC5, -/* 00005950 */ 0xEC, 0x00, 0x00, 0xCF, 0xEC, 0x00, 0x00, 0xCF, 0xEC, 0x00, 0x00, 0xD0, 0xEC, 0x00, 0x00, 0xD0, -/* 00005960 */ 0xEC, 0x00, 0x00, 0x50, 0xED, 0x00, 0x00, 0x50, 0xED, 0x00, 0x00, 0x78, 0xED, 0x00, 0x00, 0x78, -/* 00005970 */ 0xED, 0x00, 0x00, 0x79, 0xED, 0x00, 0x00, 0x79, 0xED, 0x00, 0x00, 0xB3, 0xED, 0x00, 0x00, 0xB3, -/* 00005980 */ 0xED, 0x00, 0x00, 0xF9, 0xED, 0x00, 0x00, 0xF9, 0xED, 0x00, 0x00, 0x26, 0xEE, 0x00, 0x00, 0x26, -/* 00005990 */ 0xEE, 0x00, 0x00, 0x5C, 0xEE, 0x00, 0x00, 0x5C, 0xEE, 0x00, 0x00, 0x75, 0xEE, 0x00, 0x00, 0x75, -/* 000059A0 */ 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xC1, 0xEE, 0x00, 0x00, 0xC1, -/* 000059B0 */ 0xEE, 0x00, 0x00, 0xC2, 0xEE, 0x00, 0x00, 0xC2, 0xEE, 0x00, 0x00, 0xEB, 0xEE, 0x00, 0x00, 0xEB, -/* 000059C0 */ 0xEE, 0x00, 0x00, 0x2C, 0xEF, 0x00, 0x00, 0x2C, 0xEF, 0x00, 0x00, 0xBF, 0xEF, 0x00, 0x00, 0xBF, -/* 000059D0 */ 0xEF, 0x00, 0x00, 0xED, 0xEF, 0x00, 0x00, 0xED, 0xEF, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x03, -/* 000059E0 */ 0xF0, 0x00, 0x00, 0x15, 0xF0, 0x00, 0x00, 0x15, 0xF0, 0x00, 0x00, 0x56, 0xF0, 0x00, 0x00, 0x56, -/* 000059F0 */ 0xF0, 0x00, 0x00, 0xCC, 0xF0, 0x00, 0x00, 0xCC, 0xF0, 0x00, 0x00, 0xFA, 0xF0, 0x00, 0x00, 0xFA, -/* 00005A00 */ 0xF0, 0x00, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x22, 0xF1, 0x00, 0x00, 0x22, -/* 00005A10 */ 0xF1, 0x00, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x76, 0xF1, 0x00, 0x00, 0x76, -/* 00005A20 */ 0xF1, 0x00, 0x00, 0xB2, 0xF1, 0x00, 0x00, 0xB2, 0xF1, 0x00, 0x00, 0xEC, 0xF1, 0x00, 0x00, 0xEC, -/* 00005A30 */ 0xF1, 0x00, 0x00, 0x29, 0xF2, 0x00, 0x00, 0x29, 0xF2, 0x00, 0x00, 0x41, 0xF2, 0x00, 0x00, 0x41, -/* 00005A40 */ 0xF2, 0x00, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0xB8, 0xF2, 0x00, 0x00, 0xB8, -/* 00005A50 */ 0xF2, 0x00, 0x00, 0xF5, 0xF2, 0x00, 0x00, 0xF5, 0xF2, 0x00, 0x00, 0x0D, 0xF3, 0x00, 0x00, 0x0D, -/* 00005A60 */ 0xF3, 0x00, 0x00, 0x48, 0xF3, 0x00, 0x00, 0x48, 0xF3, 0x00, 0x00, 0x82, 0xF3, 0x00, 0x00, 0x82, -/* 00005A70 */ 0xF3, 0x00, 0x00, 0xBF, 0xF3, 0x00, 0x00, 0xBF, 0xF3, 0x00, 0x00, 0xD7, 0xF3, 0x00, 0x00, 0xD7, -/* 00005A80 */ 0xF3, 0x00, 0x00, 0xE9, 0xF3, 0x00, 0x00, 0xE9, 0xF3, 0x00, 0x00, 0x3C, 0xF4, 0x00, 0x00, 0x3C, -/* 00005A90 */ 0xF4, 0x00, 0x00, 0x78, 0xF4, 0x00, 0x00, 0x78, 0xF4, 0x00, 0x00, 0xB2, 0xF4, 0x00, 0x00, 0xB2, -/* 00005AA0 */ 0xF4, 0x00, 0x00, 0xEF, 0xF4, 0x00, 0x00, 0xEF, 0xF4, 0x00, 0x00, 0x07, 0xF5, 0x00, 0x00, 0x07, -/* 00005AB0 */ 0xF5, 0x00, 0x00, 0x45, 0xF5, 0x00, 0x00, 0x45, 0xF5, 0x00, 0x00, 0x7F, 0xF5, 0x00, 0x00, 0x7F, -/* 00005AC0 */ 0xF5, 0x00, 0x00, 0xBC, 0xF5, 0x00, 0x00, 0xBC, 0xF5, 0x00, 0x00, 0xD4, 0xF5, 0x00, 0x00, 0xD4, -/* 00005AD0 */ 0xF5, 0x00, 0x00, 0x12, 0xF6, 0x00, 0x00, 0x12, 0xF6, 0x00, 0x00, 0x4C, 0xF6, 0x00, 0x00, 0x4C, -/* 00005AE0 */ 0xF6, 0x00, 0x00, 0x89, 0xF6, 0x00, 0x00, 0x89, 0xF6, 0x00, 0x00, 0xA1, 0xF6, 0x00, 0x00, 0xA1, -/* 00005AF0 */ 0xF6, 0x00, 0x00, 0xB3, 0xF6, 0x00, 0x00, 0xB3, 0xF6, 0x00, 0x00, 0xD3, 0xF6, 0x00, 0x00, 0xD3, -/* 00005B00 */ 0xF6, 0x00, 0x00, 0xE1, 0xF6, 0x00, 0x00, 0xE1, 0xF6, 0x00, 0x00, 0xE2, 0xF6, 0x00, 0x00, 0xE2, -/* 00005B10 */ 0xF6, 0x00, 0x00, 0x6C, 0xF7, 0x00, 0x00, 0x6C, 0xF7, 0x00, 0x00, 0xA9, 0xF7, 0x00, 0x00, 0xA9, -/* 00005B20 */ 0xF7, 0x00, 0x00, 0xCC, 0xF7, 0x00, 0x00, 0xCC, 0xF7, 0x00, 0x00, 0xCD, 0xF7, 0x00, 0x00, 0xCD, -/* 00005B30 */ 0xF7, 0x00, 0x00, 0xF4, 0xF7, 0x00, 0x00, 0xF4, 0xF7, 0x00, 0x00, 0x4B, 0xF8, 0x00, 0x00, 0x4B, -/* 00005B40 */ 0xF8, 0x00, 0x00, 0xAB, 0xF8, 0x00, 0x00, 0xAB, 0xF8, 0x00, 0x00, 0xE8, 0xF8, 0x00, 0x00, 0xE8, -/* 00005B50 */ 0xF8, 0x00, 0x00, 0x41, 0xF9, 0x00, 0x00, 0x41, 0xF9, 0x00, 0x00, 0x57, 0xF9, 0x00, 0x00, 0x57, -/* 00005B60 */ 0xF9, 0x00, 0x00, 0x69, 0xF9, 0x00, 0x00, 0x69, 0xF9, 0x00, 0x00, 0x6A, 0xF9, 0x00, 0x00, 0x6A, -/* 00005B70 */ 0xF9, 0x00, 0x00, 0x95, 0xF9, 0x00, 0x00, 0x95, 0xF9, 0x00, 0x00, 0xB9, 0xF9, 0x00, 0x00, 0xB9, -/* 00005B80 */ 0xF9, 0x00, 0x00, 0xEF, 0xF9, 0x00, 0x00, 0xEF, 0xF9, 0x00, 0x00, 0x4A, 0xFA, 0x00, 0x00, 0x4A, -/* 00005B90 */ 0xFA, 0x00, 0x00, 0x87, 0xFA, 0x00, 0x00, 0x87, 0xFA, 0x00, 0x00, 0xDB, 0xFA, 0x00, 0x00, 0xDB, -/* 00005BA0 */ 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0x03, 0xFB, 0x00, 0x00, 0x03, -/* 00005BB0 */ 0xFB, 0x00, 0x00, 0x04, 0xFB, 0x00, 0x00, 0x04, 0xFB, 0x00, 0x00, 0x29, 0xFB, 0x00, 0x00, 0x29, -/* 00005BC0 */ 0xFB, 0x00, 0x00, 0x7F, 0xFB, 0x00, 0x00, 0x7F, 0xFB, 0x00, 0x00, 0xD6, 0xFB, 0x00, 0x00, 0xD6, -/* 00005BD0 */ 0xFB, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x8C, 0xFC, 0x00, 0x00, 0x8C, -/* 00005BE0 */ 0xFC, 0x00, 0x00, 0xC7, 0xFC, 0x00, 0x00, 0xC7, 0xFC, 0x00, 0x00, 0x1C, 0xFD, 0x00, 0x00, 0x1C, -/* 00005BF0 */ 0xFD, 0x00, 0x00, 0x32, 0xFD, 0x00, 0x00, 0x32, 0xFD, 0x00, 0x00, 0x44, 0xFD, 0x00, 0x00, 0x44, -/* 00005C00 */ 0xFD, 0x00, 0x00, 0x45, 0xFD, 0x00, 0x00, 0x45, 0xFD, 0x00, 0x00, 0x68, 0xFD, 0x00, 0x00, 0x68, -/* 00005C10 */ 0xFD, 0x00, 0x00, 0xB2, 0xFD, 0x00, 0x00, 0xB2, 0xFD, 0x00, 0x00, 0xC4, 0xFD, 0x00, 0x00, 0xC4, -/* 00005C20 */ 0xFD, 0x00, 0x00, 0xC5, 0xFD, 0x00, 0x00, 0xC5, 0xFD, 0x00, 0x00, 0xF1, 0xFD, 0x00, 0x00, 0xF1, -/* 00005C30 */ 0xFD, 0x00, 0x00, 0x2D, 0xFE, 0x00, 0x00, 0x2D, 0xFE, 0x00, 0x00, 0x8C, 0xFE, 0x00, 0x00, 0x8C, -/* 00005C40 */ 0xFE, 0x00, 0x00, 0xCE, 0xFE, 0x00, 0x00, 0xCE, 0xFE, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x00, 0x26, -/* 00005C50 */ 0xFF, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x4E, 0xFF, 0x00, 0x00, 0x4E, -/* 00005C60 */ 0xFF, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0xB5, 0xFF, 0x00, 0x00, 0xB5, -/* 00005C70 */ 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x00, 0x00, 0x29, 0x00, 0x01, 0x00, 0x29, -/* 00005C80 */ 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x53, 0x00, 0x01, 0x00, 0x53, -/* 00005C90 */ 0x00, 0x01, 0x00, 0x54, 0x00, 0x01, 0x00, 0x54, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x01, 0x00, 0x8A, -/* 00005CA0 */ 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0E, 0x01, 0x01, 0x00, 0x0E, -/* 00005CB0 */ 0x01, 0x01, 0x00, 0x0F, 0x01, 0x01, 0x00, 0x0F, 0x01, 0x01, 0x00, 0x3C, 0x01, 0x01, 0x00, 0x3C, -/* 00005CC0 */ 0x01, 0x01, 0x00, 0x6C, 0x01, 0x01, 0x00, 0x6C, 0x01, 0x01, 0x00, 0x98, 0x01, 0x01, 0x00, 0x98, -/* 00005CD0 */ 0x01, 0x01, 0x00, 0xC4, 0x01, 0x01, 0x00, 0xC4, 0x01, 0x01, 0x00, 0xF4, 0x01, 0x01, 0x00, 0xF4, -/* 00005CE0 */ 0x01, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x4C, 0x02, 0x01, 0x00, 0x4C, -/* 00005CF0 */ 0x02, 0x01, 0x00, 0x81, 0x02, 0x01, 0x00, 0x81, 0x02, 0x01, 0x00, 0xA9, 0x02, 0x01, 0x00, 0xA9, -/* 00005D00 */ 0x02, 0x01, 0x00, 0xD4, 0x02, 0x01, 0x00, 0xD4, 0x02, 0x01, 0x00, 0xE3, 0x02, 0x01, 0x00, 0xE3, -/* 00005D10 */ 0x02, 0x01, 0x00, 0xE4, 0x02, 0x01, 0x00, 0xE4, 0x02, 0x01, 0x00, 0x1B, 0x03, 0x01, 0x00, 0x1B, -/* 00005D20 */ 0x03, 0x01, 0x00, 0x52, 0x03, 0x01, 0x00, 0x52, 0x03, 0x01, 0x00, 0x71, 0x03, 0x01, 0x00, 0x71, -/* 00005D30 */ 0x03, 0x01, 0x00, 0x83, 0x03, 0x01, 0x00, 0x83, 0x03, 0x01, 0x00, 0x84, 0x03, 0x01, 0x00, 0x84, -/* 00005D40 */ 0x03, 0x01, 0x00, 0xCC, 0x03, 0x01, 0x00, 0xCC, 0x03, 0x01, 0x00, 0xDA, 0x03, 0x01, 0x00, 0xDA, -/* 00005D50 */ 0x03, 0x01, 0x00, 0xDB, 0x03, 0x01, 0x00, 0xDB, 0x03, 0x01, 0x00, 0x4B, 0x04, 0x01, 0x00, 0x4B, -/* 00005D60 */ 0x04, 0x01, 0x00, 0xA7, 0x04, 0x01, 0x00, 0xA7, 0x04, 0x01, 0x00, 0x1D, 0x05, 0x01, 0x00, 0x1D, -/* 00005D70 */ 0x05, 0x01, 0x00, 0xAE, 0x05, 0x01, 0x00, 0xAE, 0x05, 0x01, 0x00, 0x2C, 0x06, 0x01, 0x00, 0x2C, -/* 00005D80 */ 0x06, 0x01, 0x00, 0x52, 0x06, 0x01, 0x00, 0x52, 0x06, 0x01, 0x00, 0x47, 0x07, 0x01, 0x00, 0x47, -/* 00005D90 */ 0x07, 0x01, 0x00, 0x71, 0x07, 0x01, 0x00, 0x71, 0x07, 0x01, 0x00, 0x83, 0x07, 0x01, 0x00, 0x83, -/* 00005DA0 */ 0x07, 0x01, 0x00, 0x84, 0x07, 0x01, 0x00, 0x84, 0x07, 0x01, 0x00, 0xC7, 0x07, 0x01, 0x00, 0xC7, -/* 00005DB0 */ 0x07, 0x01, 0x00, 0x49, 0x08, 0x01, 0x00, 0x49, 0x08, 0x01, 0x00, 0x7C, 0x08, 0x01, 0x00, 0x7C, -/* 00005DC0 */ 0x08, 0x01, 0x00, 0x32, 0x09, 0x01, 0x00, 0x32, 0x09, 0x01, 0x00, 0x44, 0x09, 0x01, 0x00, 0x44, -/* 00005DD0 */ 0x09, 0x01, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x78, 0x09, 0x01, 0x00, 0x78, -/* 00005DE0 */ 0x09, 0x01, 0x00, 0x79, 0x09, 0x01, 0x00, 0x79, 0x09, 0x01, 0x00, 0xDE, 0x09, 0x01, 0x00, 0xDE, -/* 00005DF0 */ 0x09, 0x01, 0x00, 0x28, 0x0A, 0x01, 0x00, 0x28, 0x0A, 0x01, 0x00, 0x9C, 0x0A, 0x01, 0x00, 0x9C, -/* 00005E00 */ 0x0A, 0x01, 0x00, 0x2D, 0x0B, 0x01, 0x00, 0x2D, 0x0B, 0x01, 0x00, 0x53, 0x0B, 0x01, 0x00, 0x53, -/* 00005E10 */ 0x0B, 0x01, 0x00, 0x53, 0x0C, 0x01, 0x00, 0x53, 0x0C, 0x01, 0x00, 0x7D, 0x0C, 0x01, 0x00, 0x7D, -/* 00005E20 */ 0x0C, 0x01, 0x00, 0x8F, 0x0C, 0x01, 0x00, 0x8F, 0x0C, 0x01, 0x00, 0x90, 0x0C, 0x01, 0x00, 0x90, -/* 00005E30 */ 0x0C, 0x01, 0x00, 0xDA, 0x0C, 0x01, 0x00, 0xDA, 0x0C, 0x01, 0x00, 0x09, 0x0D, 0x01, 0x00, 0x09, -/* 00005E40 */ 0x0D, 0x01, 0x00, 0x87, 0x0D, 0x01, 0x00, 0x87, 0x0D, 0x01, 0x00, 0xBC, 0x0D, 0x01, 0x00, 0xBC, -/* 00005E50 */ 0x0D, 0x01, 0x00, 0x37, 0x0E, 0x01, 0x00, 0x37, 0x0E, 0x01, 0x00, 0x49, 0x0E, 0x01, 0x00, 0x49, -/* 00005E60 */ 0x0E, 0x01, 0x00, 0x4A, 0x0E, 0x01, 0x00, 0x4A, 0x0E, 0x01, 0x00, 0x70, 0x0E, 0x01, 0x00, 0x70, -/* 00005E70 */ 0x0E, 0x01, 0x00, 0x7E, 0x0E, 0x01, 0x00, 0x7E, 0x0E, 0x01, 0x00, 0x7F, 0x0E, 0x01, 0x00, 0x7F, -/* 00005E80 */ 0x0E, 0x01, 0x00, 0xE1, 0x0E, 0x01, 0x00, 0xE1, 0x0E, 0x01, 0x00, 0x2C, 0x0F, 0x01, 0x00, 0x2C, -/* 00005E90 */ 0x0F, 0x01, 0x00, 0x6A, 0x0F, 0x01, 0x00, 0x6A, 0x0F, 0x01, 0x00, 0xE3, 0x0F, 0x01, 0x00, 0xE3, -/* 00005EA0 */ 0x0F, 0x01, 0x00, 0xF5, 0x0F, 0x01, 0x00, 0xF5, 0x0F, 0x01, 0x00, 0xF6, 0x0F, 0x01, 0x00, 0xF6, -/* 00005EB0 */ 0x0F, 0x01, 0x00, 0x30, 0x10, 0x01, 0x00, 0x30, 0x10, 0x01, 0x00, 0x9D, 0x10, 0x01, 0x00, 0x9D, -/* 00005EC0 */ 0x10, 0x01, 0x00, 0xFC, 0x10, 0x01, 0x00, 0xFC, 0x10, 0x01, 0x00, 0x71, 0x11, 0x01, 0x00, 0x71, -/* 00005ED0 */ 0x11, 0x01, 0x00, 0x83, 0x11, 0x01, 0x00, 0x83, 0x11, 0x01, 0x00, 0x84, 0x11, 0x01, 0x00, 0x84, -/* 00005EE0 */ 0x11, 0x01, 0x00, 0xBF, 0x11, 0x01, 0x00, 0xBF, 0x11, 0x01, 0x00, 0x2A, 0x12, 0x01, 0x00, 0x2A, -/* 00005EF0 */ 0x12, 0x01, 0x00, 0x54, 0x12, 0x01, 0x00, 0x54, 0x12, 0x01, 0x00, 0xC8, 0x12, 0x01, 0x00, 0xC8, -/* 00005F00 */ 0x12, 0x01, 0x00, 0xE5, 0x12, 0x01, 0x00, 0xE5, 0x12, 0x01, 0x00, 0x68, 0x13, 0x01, 0x00, 0x68, -/* 00005F10 */ 0x13, 0x01, 0x00, 0x7E, 0x13, 0x01, 0x00, 0x7E, 0x13, 0x01, 0x00, 0xBD, 0x13, 0x01, 0x00, 0xBD, -/* 00005F20 */ 0x13, 0x01, 0x00, 0x28, 0x14, 0x01, 0x00, 0x28, 0x14, 0x01, 0x00, 0x52, 0x14, 0x01, 0x00, 0x52, -/* 00005F30 */ 0x14, 0x01, 0x00, 0xC6, 0x14, 0x01, 0x00, 0xC6, 0x14, 0x01, 0x00, 0xE3, 0x14, 0x01, 0x00, 0xE3, -/* 00005F40 */ 0x14, 0x01, 0x00, 0x5C, 0x15, 0x01, 0x00, 0x5C, 0x15, 0x01, 0x00, 0x72, 0x15, 0x01, 0x00, 0x72, -/* 00005F50 */ 0x15, 0x01, 0x00, 0x84, 0x15, 0x01, 0x00, 0x84, 0x15, 0x01, 0x00, 0x85, 0x15, 0x01, 0x00, 0x85, -/* 00005F60 */ 0x15, 0x01, 0x00, 0x1A, 0x16, 0x01, 0x00, 0x1A, 0x16, 0x01, 0x00, 0xA6, 0x16, 0x01, 0x00, 0xA6, -/* 00005F70 */ 0x16, 0x01, 0x00, 0x19, 0x17, 0x01, 0x00, 0x19, 0x17, 0x01, 0x00, 0x5C, 0x17, 0x01, 0x00, 0x5C, -/* 00005F80 */ 0x17, 0x01, 0x00, 0xD8, 0x17, 0x01, 0x00, 0xD8, 0x17, 0x01, 0x00, 0xEA, 0x17, 0x01, 0x00, 0xEA, -/* 00005F90 */ 0x17, 0x01, 0x00, 0xEB, 0x17, 0x01, 0x00, 0xEB, 0x17, 0x01, 0x00, 0x25, 0x18, 0x01, 0x00, 0x25, -/* 00005FA0 */ 0x18, 0x01, 0x00, 0x9D, 0x18, 0x01, 0x00, 0x9D, 0x18, 0x01, 0x00, 0xAF, 0x18, 0x01, 0x00, 0xAF, -/* 00005FB0 */ 0x18, 0x01, 0x00, 0xB0, 0x18, 0x01, 0x00, 0xB0, 0x18, 0x01, 0x00, 0xEB, 0x18, 0x01, 0x00, 0xEB, -/* 00005FC0 */ 0x18, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0x77, 0x19, 0x01, 0x00, 0x77, -/* 00005FD0 */ 0x19, 0x01, 0x00, 0x78, 0x19, 0x01, 0x00, 0x78, 0x19, 0x01, 0x00, 0xB5, 0x19, 0x01, 0x00, 0xB5, -/* 00005FE0 */ 0x19, 0x01, 0x00, 0x33, 0x1A, 0x01, 0x00, 0x33, 0x1A, 0x01, 0x00, 0x45, 0x1A, 0x01, 0x00, 0x45, -/* 00005FF0 */ 0x1A, 0x01, 0x00, 0x46, 0x1A, 0x01, 0x00, 0x46, 0x1A, 0x01, 0x00, 0x83, 0x1A, 0x01, 0x00, 0x83, -/* 00006000 */ 0x1A, 0x01, 0x00, 0x01, 0x1B, 0x01, 0x00, 0x01, 0x1B, 0x01, 0x00, 0x13, 0x1B, 0x01, 0x00, 0x13, -/* 00006010 */ 0x1B, 0x01, 0x00, 0x14, 0x1B, 0x01, 0x00, 0x14, 0x1B, 0x01, 0x00, 0x57, 0x1B, 0x01, 0x00, 0x57, -/* 00006020 */ 0x1B, 0x01, 0x00, 0xD4, 0x1B, 0x01, 0x00, 0xD4, 0x1B, 0x01, 0x00, 0xE6, 0x1B, 0x01, 0x00, 0xE6, -/* 00006030 */ 0x1B, 0x01, 0x00, 0xE7, 0x1B, 0x01, 0x00, 0xE7, 0x1B, 0x01, 0x00, 0x0D, 0x1C, 0x01, 0x00, 0x0D, -/* 00006040 */ 0x1C, 0x01, 0x00, 0x1B, 0x1C, 0x01, 0x00, 0x1B, 0x1C, 0x01, 0x00, 0x1C, 0x1C, 0x01, 0x00, 0x1C, -/* 00006050 */ 0x1C, 0x01, 0x00, 0x71, 0x1C, 0x01, 0x00, 0x71, 0x1C, 0x01, 0x00, 0xAA, 0x1C, 0x01, 0x00, 0xAA, -/* 00006060 */ 0x1C, 0x01, 0x00, 0xDA, 0x1C, 0x01, 0x00, 0xDA, 0x1C, 0x01, 0x00, 0xEC, 0x1C, 0x01, 0x00, 0xEC, -/* 00006070 */ 0x1C, 0x01, 0x00, 0xED, 0x1C, 0x01, 0x00, 0xED, 0x1C, 0x01, 0x00, 0x88, 0x1D, 0x01, 0x00, 0x88, -/* 00006080 */ 0x1D, 0x01, 0x00, 0xEA, 0x1D, 0x01, 0x00, 0xEA, 0x1D, 0x01, 0x00, 0xFC, 0x1D, 0x01, 0x00, 0xFC, -/* 00006090 */ 0x1D, 0x01, 0x00, 0xFD, 0x1D, 0x01, 0x00, 0xFD, 0x1D, 0x01, 0x00, 0x3C, 0x1E, 0x01, 0x00, 0x3C, -/* 000060A0 */ 0x1E, 0x01, 0x00, 0x3D, 0x1E, 0x01, 0x00, 0x3D, 0x1E, 0x01, 0x00, 0x64, 0x1E, 0x01, 0x00, 0x64, -/* 000060B0 */ 0x1E, 0x01, 0x00, 0xA9, 0x1E, 0x01, 0x00, 0xA9, 0x1E, 0x01, 0x00, 0xAA, 0x1E, 0x01, 0x00, 0xAA, -/* 000060C0 */ 0x1E, 0x01, 0x00, 0x1B, 0x1F, 0x01, 0x00, 0x1B, 0x1F, 0x01, 0x00, 0x7A, 0x1F, 0x01, 0x00, 0x7A, -/* 000060D0 */ 0x1F, 0x01, 0x00, 0x7B, 0x1F, 0x01, 0x00, 0x7B, 0x1F, 0x01, 0x00, 0xA9, 0x1F, 0x01, 0x00, 0xA9, -/* 000060E0 */ 0x1F, 0x01, 0x00, 0xFC, 0x1F, 0x01, 0x00, 0xFC, 0x1F, 0x01, 0x00, 0x15, 0x20, 0x01, 0x00, 0x15, -/* 000060F0 */ 0x20, 0x01, 0x00, 0x53, 0x20, 0x01, 0x00, 0x53, 0x20, 0x01, 0x00, 0x65, 0x20, 0x01, 0x00, 0x65, -/* 00006100 */ 0x20, 0x01, 0x00, 0x66, 0x20, 0x01, 0x00, 0x66, 0x20, 0x01, 0x00, 0x94, 0x20, 0x01, 0x00, 0x94, -/* 00006110 */ 0x20, 0x01, 0x00, 0xCF, 0x20, 0x01, 0x00, 0xCF, 0x20, 0x01, 0x00, 0xE1, 0x20, 0x01, 0x00, 0xE1, -/* 00006120 */ 0x20, 0x01, 0x00, 0xE2, 0x20, 0x01, 0x00, 0xE2, 0x20, 0x01, 0x00, 0x04, 0x21, 0x01, 0x00, 0x04, -/* 00006130 */ 0x21, 0x01, 0x00, 0x73, 0x21, 0x01, 0x00, 0x73, 0x21, 0x01, 0x00, 0xDA, 0x21, 0x01, 0x00, 0xDA, -/* 00006140 */ 0x21, 0x01, 0x00, 0x3E, 0x22, 0x01, 0x00, 0x3E, 0x22, 0x01, 0x00, 0xBF, 0x22, 0x01, 0x00, 0xBF, -/* 00006150 */ 0x22, 0x01, 0x00, 0x21, 0x23, 0x01, 0x00, 0x21, 0x23, 0x01, 0x00, 0x85, 0x23, 0x01, 0x00, 0x85, -/* 00006160 */ 0x23, 0x01, 0x00, 0xED, 0x23, 0x01, 0x00, 0xED, 0x23, 0x01, 0x00, 0x55, 0x24, 0x01, 0x00, 0x55, -/* 00006170 */ 0x24, 0x01, 0x00, 0xC4, 0x24, 0x01, 0x00, 0xC4, 0x24, 0x01, 0x00, 0xC5, 0x24, 0x01, 0x00, 0xC5, -/* 00006180 */ 0x24, 0x01, 0x00, 0x34, 0x25, 0x01, 0x00, 0x34, 0x25, 0x01, 0x00, 0xAA, 0x25, 0x01, 0x00, 0xAA, -/* 00006190 */ 0x25, 0x01, 0x00, 0xAB, 0x25, 0x01, 0x00, 0xAB, 0x25, 0x01, 0x00, 0x1B, 0x26, 0x01, 0x00, 0x1B, -/* 000061A0 */ 0x26, 0x01, 0x00, 0x1C, 0x26, 0x01, 0x00, 0x1C, 0x26, 0x01, 0x00, 0x6D, 0x26, 0x01, 0x00, 0x6D, -/* 000061B0 */ 0x26, 0x01, 0x00, 0x93, 0x26, 0x01, 0x00, 0x93, 0x26, 0x01, 0x00, 0xB1, 0x26, 0x01, 0x00, 0xB1, -/* 000061C0 */ 0x26, 0x01, 0x00, 0xD1, 0x26, 0x01, 0x00, 0xD1, 0x26, 0x01, 0x00, 0xF3, 0x26, 0x01, 0x00, 0xF3, -/* 000061D0 */ 0x26, 0x01, 0x00, 0x11, 0x27, 0x01, 0x00, 0x11, 0x27, 0x01, 0x00, 0x31, 0x27, 0x01, 0x00, 0x31, -/* 000061E0 */ 0x27, 0x01, 0x00, 0x55, 0x27, 0x01, 0x00, 0x55, 0x27, 0x01, 0x00, 0x79, 0x27, 0x01, 0x00, 0x79, -/* 000061F0 */ 0x27, 0x01, 0x00, 0xA8, 0x27, 0x01, 0x00, 0xA8, 0x27, 0x01, 0x00, 0xC3, 0x27, 0x01, 0x00, 0xC3, -/* 00006200 */ 0x27, 0x01, 0x00, 0xC4, 0x27, 0x01, 0x00, 0xC4, 0x27, 0x01, 0x00, 0xEC, 0x27, 0x01, 0x00, 0xEC, -/* 00006210 */ 0x27, 0x01, 0x00, 0x2D, 0x28, 0x01, 0x00, 0x2D, 0x28, 0x01, 0x00, 0xA0, 0x28, 0x01, 0x00, 0xA0, -/* 00006220 */ 0x28, 0x01, 0x00, 0xA1, 0x28, 0x01, 0x00, 0xA1, 0x28, 0x01, 0x00, 0xC7, 0x28, 0x01, 0x00, 0xC7, -/* 00006230 */ 0x28, 0x01, 0x00, 0xFB, 0x28, 0x01, 0x00, 0xFB, 0x28, 0x01, 0x00, 0x31, 0x29, 0x01, 0x00, 0x31, -/* 00006240 */ 0x29, 0x01, 0x00, 0x76, 0x29, 0x01, 0x00, 0x76, 0x29, 0x01, 0x00, 0x77, 0x29, 0x01, 0x00, 0x77, -/* 00006250 */ 0x29, 0x01, 0x00, 0x99, 0x29, 0x01, 0x00, 0x99, 0x29, 0x01, 0x00, 0xCD, 0x29, 0x01, 0x00, 0xCD, -/* 00006260 */ 0x29, 0x01, 0x00, 0xF9, 0x29, 0x01, 0x00, 0xF9, 0x29, 0x01, 0x00, 0x27, 0x2A, 0x01, 0x00, 0x27, -/* 00006270 */ 0x2A, 0x01, 0x00, 0x57, 0x2A, 0x01, 0x00, 0x57, 0x2A, 0x01, 0x00, 0x83, 0x2A, 0x01, 0x00, 0x83, -/* 00006280 */ 0x2A, 0x01, 0x00, 0xB1, 0x2A, 0x01, 0x00, 0xB1, 0x2A, 0x01, 0x00, 0xE3, 0x2A, 0x01, 0x00, 0xE3, -/* 00006290 */ 0x2A, 0x01, 0x00, 0x15, 0x2B, 0x01, 0x00, 0x15, 0x2B, 0x01, 0x00, 0x53, 0x2B, 0x01, 0x00, 0x53, -/* 000062A0 */ 0x2B, 0x01, 0x00, 0x54, 0x2B, 0x01, 0x00, 0x54, 0x2B, 0x01, 0x00, 0x86, 0x2B, 0x01, 0x00, 0x86, -/* 000062B0 */ 0x2B, 0x01, 0x00, 0xC6, 0x2B, 0x01, 0x00, 0xC6, 0x2B, 0x01, 0x00, 0x04, 0x2C, 0x01, 0x00, 0x04, -/* 000062C0 */ 0x2C, 0x01, 0x00, 0x05, 0x2C, 0x01, 0x00, 0x05, 0x2C, 0x01, 0x00, 0x47, 0x2C, 0x01, 0x00, 0x47, -/* 000062D0 */ 0x2C, 0x01, 0x00, 0x48, 0x2C, 0x01, 0x00, 0x48, 0x2C, 0x01, 0x00, 0x5B, 0x2C, 0x01, 0x00, 0x5B, -/* 000062E0 */ 0x2C, 0x01, 0x00, 0x74, 0x2C, 0x01, 0x00, 0x74, 0x2C, 0x01, 0x00, 0xC9, 0x2C, 0x01, 0x00, 0xC9, -/* 000062F0 */ 0x2C, 0x01, 0x00, 0x40, 0x2D, 0x01, 0x00, 0x40, 0x2D, 0x01, 0x00, 0xE2, 0x2D, 0x01, 0x00, 0xE2, -/* 00006300 */ 0x2D, 0x01, 0x00, 0x86, 0x2E, 0x01, 0x00, 0x86, 0x2E, 0x01, 0x00, 0xEB, 0x2E, 0x01, 0x00, 0xEB, -/* 00006310 */ 0x2E, 0x01, 0x00, 0xFF, 0x2E, 0x01, 0x00, 0xFF, 0x2E, 0x01, 0x00, 0x28, 0x2F, 0x01, 0x00, 0x28, -/* 00006320 */ 0x2F, 0x01, 0x00, 0x29, 0x2F, 0x01, 0x00, 0x29, 0x2F, 0x01, 0x00, 0x3F, 0x2F, 0x01, 0x00, 0x3F, -/* 00006330 */ 0x2F, 0x01, 0x00, 0x8E, 0x2F, 0x01, 0x00, 0x8E, 0x2F, 0x01, 0x00, 0xCF, 0x2F, 0x01, 0x00, 0xCF, -/* 00006340 */ 0x2F, 0x01, 0x00, 0xED, 0x2F, 0x01, 0x00, 0xED, 0x2F, 0x01, 0x00, 0x17, 0x30, 0x01, 0x00, 0x17, -/* 00006350 */ 0x30, 0x01, 0x00, 0x41, 0x30, 0x01, 0x00, 0x41, 0x30, 0x01, 0x00, 0x42, 0x30, 0x01, 0x00, 0x42, -/* 00006360 */ 0x30, 0x01, 0x00, 0xB0, 0x30, 0x01, 0x00, 0xB0, 0x30, 0x01, 0x00, 0x06, 0x31, 0x01, 0x00, 0x06, -/* 00006370 */ 0x31, 0x01, 0x00, 0x5A, 0x31, 0x01, 0x00, 0x5A, 0x31, 0x01, 0x00, 0xC4, 0x31, 0x01, 0x00, 0xC4, -/* 00006380 */ 0x31, 0x01, 0x00, 0xEC, 0x31, 0x01, 0x00, 0xEC, 0x31, 0x01, 0x00, 0xFE, 0x31, 0x01, 0x00, 0xFE, -/* 00006390 */ 0x31, 0x01, 0x00, 0xFF, 0x31, 0x01, 0x00, 0xFF, 0x31, 0x01, 0x00, 0x23, 0x32, 0x01, 0x00, 0x23, -/* 000063A0 */ 0x32, 0x01, 0x00, 0x55, 0x32, 0x01, 0x00, 0x55, 0x32, 0x01, 0x00, 0xD5, 0x32, 0x01, 0x00, 0xD5, -/* 000063B0 */ 0x32, 0x01, 0x00, 0xE7, 0x32, 0x01, 0x00, 0xE7, 0x32, 0x01, 0x00, 0xE8, 0x32, 0x01, 0x00, 0xE8, -/* 000063C0 */ 0x32, 0x01, 0x00, 0xFE, 0x32, 0x01, 0x00, 0xFE, 0x32, 0x01, 0x00, 0x33, 0x33, 0x01, 0x00, 0x33, -/* 000063D0 */ 0x33, 0x01, 0x00, 0x73, 0x33, 0x01, 0x00, 0x73, 0x33, 0x01, 0x00, 0x91, 0x33, 0x01, 0x00, 0x91, -/* 000063E0 */ 0x33, 0x01, 0x00, 0xBB, 0x33, 0x01, 0x00, 0xBB, 0x33, 0x01, 0x00, 0xE5, 0x33, 0x01, 0x00, 0xE5, -/* 000063F0 */ 0x33, 0x01, 0x00, 0xE6, 0x33, 0x01, 0x00, 0xE6, 0x33, 0x01, 0x00, 0x48, 0x34, 0x01, 0x00, 0x48, -/* 00006400 */ 0x34, 0x01, 0x00, 0xCD, 0x34, 0x01, 0x00, 0xCD, 0x34, 0x01, 0x00, 0x32, 0x35, 0x01, 0x00, 0x32, -/* 00006410 */ 0x35, 0x01, 0x00, 0x6D, 0x35, 0x01, 0x00, 0x6D, 0x35, 0x01, 0x00, 0x7F, 0x35, 0x01, 0x00, 0x7F, -/* 00006420 */ 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0xAD, 0x35, 0x01, 0x00, 0xAD, -/* 00006430 */ 0x35, 0x01, 0x00, 0x12, 0x36, 0x01, 0x00, 0x12, 0x36, 0x01, 0x00, 0x13, 0x36, 0x01, 0x00, 0x13, -/* 00006440 */ 0x36, 0x01, 0x00, 0x95, 0x36, 0x01, 0x00, 0x95, 0x36, 0x01, 0x00, 0xD0, 0x36, 0x01, 0x00, 0xD0, -/* 00006450 */ 0x36, 0x01, 0x00, 0x2F, 0x37, 0x01, 0x00, 0x2F, 0x37, 0x01, 0x00, 0x41, 0x37, 0x01, 0x00, 0x41, -/* 00006460 */ 0x37, 0x01, 0x00, 0x84, 0x37, 0x01, 0x00, 0x84, 0x37, 0x01, 0x00, 0x92, 0x37, 0x01, 0x00, 0x92, -/* 00006470 */ 0x37, 0x01, 0x00, 0x93, 0x37, 0x01, 0x00, 0x93, 0x37, 0x01, 0x00, 0x01, 0x38, 0x01, 0x00, 0x01, -/* 00006480 */ 0x38, 0x01, 0x00, 0x4C, 0x38, 0x01, 0x00, 0x4C, 0x38, 0x01, 0x00, 0xA9, 0x38, 0x01, 0x00, 0xA9, -/* 00006490 */ 0x38, 0x01, 0x00, 0xBB, 0x38, 0x01, 0x00, 0xBB, 0x38, 0x01, 0x00, 0x0E, 0x39, 0x01, 0x00, 0x0E, -/* 000064A0 */ 0x39, 0x01, 0x00, 0x46, 0x39, 0x01, 0x00, 0x46, 0x39, 0x01, 0x00, 0x71, 0x39, 0x01, 0x00, 0x71, -/* 000064B0 */ 0x39, 0x01, 0x00, 0x83, 0x39, 0x01, 0x00, 0x83, 0x39, 0x01, 0x00, 0xBD, 0x39, 0x01, 0x00, 0xBD, -/* 000064C0 */ 0x39, 0x01, 0x00, 0x31, 0x3A, 0x01, 0x00, 0x31, 0x3A, 0x01, 0x00, 0x8F, 0x3A, 0x01, 0x00, 0x8F, -/* 000064D0 */ 0x3A, 0x01, 0x00, 0xA3, 0x3A, 0x01, 0x00, 0xA3, 0x3A, 0x01, 0x00, 0xA4, 0x3A, 0x01, 0x00, 0xA4, -/* 000064E0 */ 0x3A, 0x01, 0x00, 0x16, 0x3B, 0x01, 0x00, 0x16, 0x3B, 0x01, 0x00, 0x61, 0x3B, 0x01, 0x00, 0x61, -/* 000064F0 */ 0x3B, 0x01, 0x00, 0xC2, 0x3B, 0x01, 0x00, 0xC2, 0x3B, 0x01, 0x00, 0xD4, 0x3B, 0x01, 0x00, 0xD4, -/* 00006500 */ 0x3B, 0x01, 0x00, 0x27, 0x3C, 0x01, 0x00, 0x27, 0x3C, 0x01, 0x00, 0x5F, 0x3C, 0x01, 0x00, 0x5F, -/* 00006510 */ 0x3C, 0x01, 0x00, 0x8A, 0x3C, 0x01, 0x00, 0x8A, 0x3C, 0x01, 0x00, 0x9C, 0x3C, 0x01, 0x00, 0x9C, -/* 00006520 */ 0x3C, 0x01, 0x00, 0xD6, 0x3C, 0x01, 0x00, 0xD6, 0x3C, 0x01, 0x00, 0x4C, 0x3D, 0x01, 0x00, 0x4C, -/* 00006530 */ 0x3D, 0x01, 0x00, 0xAA, 0x3D, 0x01, 0x00, 0xAA, 0x3D, 0x01, 0x00, 0xBE, 0x3D, 0x01, 0x00, 0xBE, -/* 00006540 */ 0x3D, 0x01, 0x00, 0xBF, 0x3D, 0x01, 0x00, 0xBF, 0x3D, 0x01, 0x00, 0x31, 0x3E, 0x01, 0x00, 0x31, -/* 00006550 */ 0x3E, 0x01, 0x00, 0x7C, 0x3E, 0x01, 0x00, 0x7C, 0x3E, 0x01, 0x00, 0xDD, 0x3E, 0x01, 0x00, 0xDD, -/* 00006560 */ 0x3E, 0x01, 0x00, 0xEF, 0x3E, 0x01, 0x00, 0xEF, 0x3E, 0x01, 0x00, 0x42, 0x3F, 0x01, 0x00, 0x42, -/* 00006570 */ 0x3F, 0x01, 0x00, 0x7A, 0x3F, 0x01, 0x00, 0x7A, 0x3F, 0x01, 0x00, 0xA5, 0x3F, 0x01, 0x00, 0xA5, -/* 00006580 */ 0x3F, 0x01, 0x00, 0xB7, 0x3F, 0x01, 0x00, 0xB7, 0x3F, 0x01, 0x00, 0xF1, 0x3F, 0x01, 0x00, 0xF1, -/* 00006590 */ 0x3F, 0x01, 0x00, 0x67, 0x40, 0x01, 0x00, 0x67, 0x40, 0x01, 0x00, 0xC5, 0x40, 0x01, 0x00, 0xC5, -/* 000065A0 */ 0x40, 0x01, 0x00, 0xD9, 0x40, 0x01, 0x00, 0xD9, 0x40, 0x01, 0x00, 0xDA, 0x40, 0x01, 0x00, 0xDA, -/* 000065B0 */ 0x40, 0x01, 0x00, 0x01, 0x41, 0x01, 0x00, 0x01, 0x41, 0x01, 0x00, 0x2D, 0x41, 0x01, 0x00, 0x2D, -/* 000065C0 */ 0x41, 0x01, 0x00, 0x93, 0x41, 0x01, 0x00, 0x93, 0x41, 0x01, 0x00, 0x0A, 0x42, 0x01, 0x00, 0x0A, -/* 000065D0 */ 0x42, 0x01, 0x00, 0x7C, 0x42, 0x01, 0x00, 0x7C, 0x42, 0x01, 0x00, 0xA9, 0x42, 0x01, 0x00, 0xA9, -/* 000065E0 */ 0x42, 0x01, 0x00, 0xD6, 0x42, 0x01, 0x00, 0xD6, 0x42, 0x01, 0x00, 0x1D, 0x43, 0x01, 0x00, 0x1D, -/* 000065F0 */ 0x43, 0x01, 0x00, 0x64, 0x43, 0x01, 0x00, 0x64, 0x43, 0x01, 0x00, 0x65, 0x43, 0x01, 0x00, 0x65, -/* 00006600 */ 0x43, 0x01, 0x00, 0xA4, 0x43, 0x01, 0x00, 0xA4, 0x43, 0x01, 0x00, 0xE9, 0x43, 0x01, 0x00, 0xE9, -/* 00006610 */ 0x43, 0x01, 0x00, 0xFF, 0x43, 0x01, 0x00, 0xFF, 0x43, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, -/* 00006620 */ 0x44, 0x01, 0x00, 0x37, 0x44, 0x01, 0x00, 0x37, 0x44, 0x01, 0x00, 0x6B, 0x44, 0x01, 0x00, 0x6B, -/* 00006630 */ 0x44, 0x01, 0x00, 0xBA, 0x44, 0x01, 0x00, 0xBA, 0x44, 0x01, 0x00, 0xD0, 0x44, 0x01, 0x00, 0xD0, -/* 00006640 */ 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0x0C, 0x45, 0x01, 0x00, 0x0C, -/* 00006650 */ 0x45, 0x01, 0x00, 0x52, 0x45, 0x01, 0x00, 0x52, 0x45, 0x01, 0x00, 0x53, 0x45, 0x01, 0x00, 0x53, -/* 00006660 */ 0x45, 0x01, 0x00, 0x89, 0x45, 0x01, 0x00, 0x89, 0x45, 0x01, 0x00, 0xC8, 0x45, 0x01, 0x00, 0xC8, -/* 00006670 */ 0x45, 0x01, 0x00, 0x0D, 0x46, 0x01, 0x00, 0x0D, 0x46, 0x01, 0x00, 0x23, 0x46, 0x01, 0x00, 0x23, -/* 00006680 */ 0x46, 0x01, 0x00, 0x24, 0x46, 0x01, 0x00, 0x24, 0x46, 0x01, 0x00, 0x72, 0x46, 0x01, 0x00, 0x72, -/* 00006690 */ 0x46, 0x01, 0x00, 0x73, 0x46, 0x01, 0x00, 0x73, 0x46, 0x01, 0x00, 0xD9, 0x46, 0x01, 0x00, 0xD9, -/* 000066A0 */ 0x46, 0x01, 0x00, 0x15, 0x47, 0x01, 0x00, 0x15, 0x47, 0x01, 0x00, 0x16, 0x47, 0x01, 0x00, 0x16, -/* 000066B0 */ 0x47, 0x01, 0x00, 0x36, 0x47, 0x01, 0x00, 0x36, 0x47, 0x01, 0x00, 0x48, 0x47, 0x01, 0x00, 0x48, -/* 000066C0 */ 0x47, 0x01, 0x00, 0x92, 0x47, 0x01, 0x00, 0x92, 0x47, 0x01, 0x00, 0x93, 0x47, 0x01, 0x00, 0x93, -/* 000066D0 */ 0x47, 0x01, 0x00, 0xB7, 0x47, 0x01, 0x00, 0xB7, 0x47, 0x01, 0x00, 0xEB, 0x47, 0x01, 0x00, 0xEB, -/* 000066E0 */ 0x47, 0x01, 0x00, 0x58, 0x48, 0x01, 0x00, 0x58, 0x48, 0x01, 0x00, 0x6E, 0x48, 0x01, 0x00, 0x6E, -/* 000066F0 */ 0x48, 0x01, 0x00, 0xB5, 0x48, 0x01, 0x00, 0xB5, 0x48, 0x01, 0x00, 0x18, 0x49, 0x01, 0x00, 0x18, -/* 00006700 */ 0x49, 0x01, 0x00, 0x85, 0x49, 0x01, 0x00, 0x85, 0x49, 0x01, 0x00, 0x9B, 0x49, 0x01, 0x00, 0x9B, -/* 00006710 */ 0x49, 0x01, 0x00, 0x9C, 0x49, 0x01, 0x00, 0x9C, 0x49, 0x01, 0x00, 0xCD, 0x49, 0x01, 0x00, 0xCD, -/* 00006720 */ 0x49, 0x01, 0x00, 0x1B, 0x4A, 0x01, 0x00, 0x1B, 0x4A, 0x01, 0x00, 0x54, 0x4A, 0x01, 0x00, 0x54, -/* 00006730 */ 0x4A, 0x01, 0x00, 0x6E, 0x4A, 0x01, 0x00, 0x6E, 0x4A, 0x01, 0x00, 0xDD, 0x4A, 0x01, 0x00, 0xDD, -/* 00006740 */ 0x4A, 0x01, 0x00, 0xF3, 0x4A, 0x01, 0x00, 0xF3, 0x4A, 0x01, 0x00, 0xF4, 0x4A, 0x01, 0x00, 0xF4, -/* 00006750 */ 0x4A, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x5B, 0x4B, 0x01, 0x00, 0x5B, -/* 00006760 */ 0x4B, 0x01, 0x00, 0xAE, 0x4B, 0x01, 0x00, 0xAE, 0x4B, 0x01, 0x00, 0xAF, 0x4B, 0x01, 0x00, 0xAF, -/* 00006770 */ 0x4B, 0x01, 0x00, 0xF6, 0x4B, 0x01, 0x00, 0xF6, 0x4B, 0x01, 0x00, 0xF7, 0x4B, 0x01, 0x00, 0xF7, -/* 00006780 */ 0x4B, 0x01, 0x00, 0x94, 0x4C, 0x01, 0x00, 0x94, 0x4C, 0x01, 0x00, 0xDE, 0x4C, 0x01, 0x00, 0xDE, -/* 00006790 */ 0x4C, 0x01, 0x00, 0x7F, 0x4D, 0x01, 0x00, 0x7F, 0x4D, 0x01, 0x00, 0x80, 0x4D, 0x01, 0x00, 0x80, -/* 000067A0 */ 0x4D, 0x01, 0x00, 0xCB, 0x4D, 0x01, 0x00, 0xCB, 0x4D, 0x01, 0x00, 0x12, 0x4E, 0x01, 0x00, 0x12, -/* 000067B0 */ 0x4E, 0x01, 0x00, 0x4A, 0x4E, 0x01, 0x00, 0x4A, 0x4E, 0x01, 0x00, 0xBB, 0x4E, 0x01, 0x00, 0xBB, -/* 000067C0 */ 0x4E, 0x01, 0x00, 0xD5, 0x4E, 0x01, 0x00, 0xD5, 0x4E, 0x01, 0x00, 0xD6, 0x4E, 0x01, 0x00, 0xD6, -/* 000067D0 */ 0x4E, 0x01, 0x00, 0x21, 0x4F, 0x01, 0x00, 0x21, 0x4F, 0x01, 0x00, 0x88, 0x4F, 0x01, 0x00, 0x88, -/* 000067E0 */ 0x4F, 0x01, 0x00, 0xF9, 0x4F, 0x01, 0x00, 0xF9, 0x4F, 0x01, 0x00, 0x13, 0x50, 0x01, 0x00, 0x13, -/* 000067F0 */ 0x50, 0x01, 0x00, 0x14, 0x50, 0x01, 0x00, 0x14, 0x50, 0x01, 0x00, 0x4F, 0x50, 0x01, 0x00, 0x4F, -/* 00006800 */ 0x50, 0x01, 0x00, 0x8D, 0x50, 0x01, 0x00, 0x8D, 0x50, 0x01, 0x00, 0xA1, 0x50, 0x01, 0x00, 0xA1, -/* 00006810 */ 0x50, 0x01, 0x00, 0xA2, 0x50, 0x01, 0x00, 0xA2, 0x50, 0x01, 0x00, 0xF6, 0x50, 0x01, 0x00, 0xF6, -/* 00006820 */ 0x50, 0x01, 0x00, 0x2E, 0x51, 0x01, 0x00, 0x2E, 0x51, 0x01, 0x00, 0x66, 0x51, 0x01, 0x00, 0x66, -/* 00006830 */ 0x51, 0x01, 0x00, 0xE0, 0x51, 0x01, 0x00, 0xE0, 0x51, 0x01, 0x00, 0xFA, 0x51, 0x01, 0x00, 0xFA, -/* 00006840 */ 0x51, 0x01, 0x00, 0x45, 0x52, 0x01, 0x00, 0x45, 0x52, 0x01, 0x00, 0xAC, 0x52, 0x01, 0x00, 0xAC, -/* 00006850 */ 0x52, 0x01, 0x00, 0x26, 0x53, 0x01, 0x00, 0x26, 0x53, 0x01, 0x00, 0x40, 0x53, 0x01, 0x00, 0x40, -/* 00006860 */ 0x53, 0x01, 0x00, 0x72, 0x53, 0x01, 0x00, 0x72, 0x53, 0x01, 0x00, 0xAD, 0x53, 0x01, 0x00, 0xAD, -/* 00006870 */ 0x53, 0x01, 0x00, 0x04, 0x54, 0x01, 0x00, 0x04, 0x54, 0x01, 0x00, 0x69, 0x54, 0x01, 0x00, 0x69, -/* 00006880 */ 0x54, 0x01, 0x00, 0xA8, 0x54, 0x01, 0x00, 0xA8, 0x54, 0x01, 0x00, 0xE3, 0x54, 0x01, 0x00, 0xE3, -/* 00006890 */ 0x54, 0x01, 0x00, 0x20, 0x55, 0x01, 0x00, 0x20, 0x55, 0x01, 0x00, 0x55, 0x55, 0x01, 0x00, 0x55, -/* 000068A0 */ 0x55, 0x01, 0x00, 0x8C, 0x55, 0x01, 0x00, 0x8C, 0x55, 0x01, 0x00, 0xC5, 0x55, 0x01, 0x00, 0xC5, -/* 000068B0 */ 0x55, 0x01, 0x00, 0xFA, 0x55, 0x01, 0x00, 0xFA, 0x55, 0x01, 0x00, 0x31, 0x56, 0x01, 0x00, 0x31, -/* 000068C0 */ 0x56, 0x01, 0x00, 0x6C, 0x56, 0x01, 0x00, 0x6C, 0x56, 0x01, 0x00, 0xA7, 0x56, 0x01, 0x00, 0xA7, -/* 000068D0 */ 0x56, 0x01, 0x00, 0xED, 0x56, 0x01, 0x00, 0xED, 0x56, 0x01, 0x00, 0x0E, 0x57, 0x01, 0x00, 0x0E, -/* 000068E0 */ 0x57, 0x01, 0x00, 0x4C, 0x57, 0x01, 0x00, 0x4C, 0x57, 0x01, 0x00, 0xBE, 0x57, 0x01, 0x00, 0xBE, -/* 000068F0 */ 0x57, 0x01, 0x00, 0x60, 0x58, 0x01, 0x00, 0x60, 0x58, 0x01, 0x00, 0x9C, 0x58, 0x01, 0x00, 0x9C, -/* 00006900 */ 0x58, 0x01, 0x00, 0xBA, 0x58, 0x01, 0x00, 0xBA, 0x58, 0x01, 0x00, 0xE4, 0x58, 0x01, 0x00, 0xE4, -/* 00006910 */ 0x58, 0x01, 0x00, 0x2C, 0x59, 0x01, 0x00, 0x2C, 0x59, 0x01, 0x00, 0x79, 0x59, 0x01, 0x00, 0x79, -/* 00006920 */ 0x59, 0x01, 0x00, 0x8D, 0x59, 0x01, 0x00, 0x8D, 0x59, 0x01, 0x00, 0x8E, 0x59, 0x01, 0x00, 0x8E, -/* 00006930 */ 0x59, 0x01, 0x00, 0x2C, 0x5A, 0x01, 0x00, 0x2C, 0x5A, 0x01, 0x00, 0x2D, 0x5A, 0x01, 0x00, 0x2D, -/* 00006940 */ 0x5A, 0x01, 0x00, 0x54, 0x5A, 0x01, 0x00, 0x54, 0x5A, 0x01, 0x00, 0x62, 0x5A, 0x01, 0x00, 0x62, -/* 00006950 */ 0x5A, 0x01, 0x00, 0x6C, 0x5A, 0x01, 0x00, 0x6C, 0x5A, 0x01, 0x00, 0xBD, 0x5A, 0x01, 0x00, 0xBD, -/* 00006960 */ 0x5A, 0x01, 0x00, 0xD7, 0x5A, 0x01, 0x00, 0xD7, 0x5A, 0x01, 0x00, 0xE1, 0x5A, 0x01, 0x00, 0xE1, -/* 00006970 */ 0x5A, 0x01, 0x00, 0xE2, 0x5A, 0x01, 0x00, 0xE2, 0x5A, 0x01, 0x00, 0x13, 0x5B, 0x01, 0x00, 0x13, -/* 00006980 */ 0x5B, 0x01, 0x00, 0x32, 0x5B, 0x01, 0x00, 0x32, 0x5B, 0x01, 0x00, 0xC8, 0x5B, 0x01, 0x00, 0xC8, -/* 00006990 */ 0x5B, 0x01, 0x00, 0x5E, 0x5C, 0x01, 0x00, 0x5E, 0x5C, 0x01, 0x00, 0xF4, 0x5C, 0x01, 0x00, 0xF4, -/* 000069A0 */ 0x5C, 0x01, 0x00, 0x8A, 0x5D, 0x01, 0x00, 0x8A, 0x5D, 0x01, 0x00, 0x90, 0x5D, 0x01, 0x00, 0x90, -/* 000069B0 */ 0x5D, 0x01, 0x00, 0x94, 0x5D, 0x01, 0x00, 0x94, 0x5D, 0x01, 0x00, 0x50, 0xB9, 0xDC, 0x00, 0x00, -/* 000069C0 */ 0x00, 0xFC, 0x09, 0xFE, 0xD7, 0x02, 0xFF, 0xA8, 0x41, 0xC0, 0x00, 0x00, 0x00, 0xFE, 0x70, 0x01, -/* 000069D0 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFF, 0x24, 0x5C, 0x01, 0x00, 0xFF, 0x24, -/* 000069E0 */ 0x5C, 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000069F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xD8, 0x02, 0x07, -/* 00006A10 */ 0x0C, 0xA8, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 00006A20 */ 0x00, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6A, 0x00, 0x00, 0xBF, 0xFD, 0x20, 0x04, 0x4F, -/* 00006A30 */ 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x01, 0x00, -/* 00006A40 */ 0xFE, 0x90, 0x01, 0x22, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x90, 0x01, 0xFF, 0x01, -/* 00006A50 */ 0x5C, 0x01, 0x00, 0xFF, 0x01, 0x5C, 0x01, 0x00, 0x40, 0x4B, 0x18, 0x30, 0x44, 0x09, 0xFE, 0x3A, -/* 00006A60 */ 0x02, 0xFE, 0x34, 0x02, 0x26, 0x0F, 0x44, 0x43, 0x44, 0x44, 0x14, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A70 */ 0xFF, 0x42, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A80 */ 0xFF, 0xFF, 0x00, 0x00, 0x08, 0x02, 0x01, 0xFE, 0xD9, 0x02, 0x02, 0x01, 0xFE, 0xDA, 0x02, 0x02, -/* 00006A90 */ 0x01, 0xFE, 0xDB, 0x02, 0x02, 0x01, 0xFE, 0xDC, 0x02, 0x02, 0x01, 0xFE, 0xDD, 0x02, 0x03, 0x04, -/* 00006AA0 */ 0x02, 0x01, 0xFE, 0xDE, 0x02, 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x02, 0x00, 0xFE, 0xE0, 0x02, 0x02, -/* 00006AB0 */ 0x00, 0xFE, 0xE1, 0x02, 0x02, 0x00, 0xFE, 0xE2, 0x02, 0x02, 0x00, 0xFE, 0xE3, 0x02, 0x02, 0x01, -/* 00006AC0 */ 0xFE, 0xE4, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x00, 0xFE, -/* 00006AD0 */ 0xE7, 0x02, 0x02, 0x01, 0xFE, 0xE8, 0x02, 0x02, 0x01, 0xFE, 0xE9, 0x02, 0x02, 0x00, 0xFE, 0xEA, -/* 00006AE0 */ 0x02, 0x02, 0x01, 0xFE, 0xEB, 0x02, 0x02, 0x01, 0xFE, 0xEC, 0x02, 0x02, 0x01, 0xFE, 0xED, 0x02, -/* 00006AF0 */ 0x02, 0x00, 0xFE, 0xEE, 0x02, 0x02, 0x01, 0xFE, 0xEF, 0x02, 0x02, 0x01, 0xFE, 0xF0, 0x02, 0x02, -/* 00006B00 */ 0x00, 0xFE, 0xF1, 0x02, 0x02, 0x01, 0xFE, 0xF2, 0x02, 0x02, 0x01, 0xFE, 0xF3, 0x02, 0x02, 0x00, -/* 00006B10 */ 0xFE, 0xF4, 0x02, 0x02, 0x01, 0xFE, 0xF5, 0x02, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x01, 0xFE, -/* 00006B20 */ 0xF7, 0x02, 0x02, 0x01, 0xFE, 0xF8, 0x02, 0x02, 0x01, 0xFE, 0xF9, 0x02, 0x02, 0x01, 0xFE, 0xFA, -/* 00006B30 */ 0x02, 0x02, 0x01, 0xFE, 0xFB, 0x02, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xFD, 0x02, -/* 00006B40 */ 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, -/* 00006B50 */ 0x02, 0x01, 0xFE, 0x01, 0x03, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xFE, 0x91, 0x0B, 0x96, 0x38, 0x00, -/* 00006B60 */ 0x00, 0x00, 0x31, 0xD4, 0x0F, 0x00, 0x00, 0x00, 0x32, 0x96, 0x02, 0x00, 0x00, 0x00, 0x32, 0xD4, -/* 00006B70 */ 0x10, 0x00, 0x00, 0x00, 0x33, 0x96, 0x03, 0x00, 0x00, 0x00, 0x33, 0xD4, 0x11, 0x00, 0x00, 0x00, -/* 00006B80 */ 0x34, 0x96, 0x04, 0x00, 0x00, 0x00, 0x34, 0xD4, 0x12, 0x00, 0x00, 0x00, 0x35, 0x96, 0x05, 0x00, -/* 00006B90 */ 0x00, 0x00, 0x35, 0xD4, 0x13, 0x00, 0x00, 0x00, 0x36, 0x96, 0x06, 0x00, 0x00, 0x00, 0x36, 0xD4, -/* 00006BA0 */ 0x14, 0x00, 0x00, 0x00, 0x37, 0x96, 0x07, 0x00, 0x00, 0x00, 0x37, 0xD4, 0x15, 0x00, 0x00, 0x00, -/* 00006BB0 */ 0x38, 0x96, 0x08, 0x00, 0x00, 0x00, 0x38, 0x4F, 0x39, 0x4F, 0x3C, 0x4F, 0x3D, 0x4F, 0x44, 0x96, -/* 00006BC0 */ 0x39, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3A, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006BD0 */ 0x3B, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3C, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006BE0 */ 0x3D, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3E, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006BF0 */ 0x3F, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x40, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C00 */ 0x41, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x42, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C10 */ 0x43, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x44, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C20 */ 0x45, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x46, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C30 */ 0x47, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x48, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C40 */ 0x49, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4A, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C50 */ 0x4B, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4C, 0x00, 0x00, 0x00, 0x44, 0x62, 0x44, 0x30, -/* 00006C60 */ 0x00, 0x96, 0x09, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x77, -/* 00006C70 */ 0x02, 0x44, 0x01, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x02, 0xA8, -/* 00006C80 */ 0x45, 0x14, 0x03, 0x00, 0x44, 0x45, 0x09, 0x25, 0x00, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, -/* 00006C90 */ 0x00, 0x93, 0x09, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x62, 0x45, 0x45, 0x03, 0x07, 0x01, 0x00, -/* 00006CA0 */ 0xC4, 0x01, 0x45, 0x45, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x45, 0x44, 0x04, 0x93, 0x09, -/* 00006CB0 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x05, 0xA8, 0x45, 0x14, 0x03, 0x00, 0x44, -/* 00006CC0 */ 0x45, 0x09, 0x25, 0x00, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, -/* 00006CD0 */ 0x00, 0x45, 0x00, 0x00, 0x62, 0x45, 0x45, 0x03, 0x07, 0x01, 0x00, 0xC4, 0x01, 0x45, 0x45, 0x03, -/* 00006CE0 */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0x45, 0x44, 0x06, 0x93, 0x09, 0x00, 0x00, 0x00, 0x45, 0x00, -/* 00006CF0 */ 0x00, 0x62, 0x45, 0x45, 0x07, 0xAC, 0x44, 0x0F, 0x02, 0x00, 0x45, 0xAB, 0x44, 0x96, 0x39, 0x00, -/* 00006D00 */ 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x08, 0x47, -/* 00006D10 */ 0x39, 0x44, 0x96, 0x3A, 0x00, 0x00, 0x00, 0x03, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, -/* 00006D20 */ 0x62, 0x44, 0x44, 0x09, 0x96, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, -/* 00006D30 */ 0x00, 0x00, 0x62, 0x44, 0x44, 0x0A, 0x96, 0x0B, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, -/* 00006D40 */ 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0B, 0x96, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, -/* 00006D50 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0C, 0x96, 0x0D, 0x00, 0x00, 0x00, 0x44, -/* 00006D60 */ 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0D, 0x96, 0x0E, 0x00, 0x00, -/* 00006D70 */ 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0E, 0x96, 0x0F, -/* 00006D80 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0F, -/* 00006D90 */ 0x96, 0x10, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, -/* 00006DA0 */ 0x44, 0x10, 0x96, 0x11, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, -/* 00006DB0 */ 0x62, 0x44, 0x44, 0x11, 0x96, 0x12, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, -/* 00006DC0 */ 0x00, 0x00, 0x62, 0x44, 0x44, 0x12, 0x96, 0x13, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, -/* 00006DD0 */ 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x13, 0x47, 0x3A, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, -/* 00006DE0 */ 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x14, 0x96, 0x14, 0x00, 0x00, 0x00, 0x44, 0x93, 0x0A, 0x00, -/* 00006DF0 */ 0x00, 0x00, 0x44, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, -/* 00006E00 */ 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, -/* 00006E10 */ 0x62, 0x46, 0x46, 0x15, 0x7B, 0x46, 0x45, 0x16, 0x93, 0x09, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, -/* 00006E20 */ 0x62, 0x46, 0x46, 0x17, 0x7B, 0x46, 0x45, 0x18, 0x93, 0x09, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, -/* 00006E30 */ 0x62, 0x46, 0x46, 0x19, 0x7B, 0x46, 0x45, 0x1A, 0x93, 0x09, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, -/* 00006E40 */ 0x62, 0x46, 0x46, 0x1B, 0x7B, 0x46, 0x45, 0x1C, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x08, 0x02, 0x00, -/* 00006E50 */ 0xEE, 0x03, 0x44, 0x44, 0x02, 0x00, 0x96, 0x15, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, -/* 00006E60 */ 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x1D, 0x96, 0x16, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, -/* 00006E70 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x1E, 0x96, 0x17, 0x00, 0x00, 0x00, 0x44, -/* 00006E80 */ 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x1F, 0x96, 0x18, 0x00, 0x00, -/* 00006E90 */ 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x20, 0x96, 0x19, -/* 00006EA0 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x21, -/* 00006EB0 */ 0x96, 0x1A, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x44, 0x96, 0x1B, 0x00, 0x00, -/* 00006EC0 */ 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x22, 0x96, 0x1C, -/* 00006ED0 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x23, -/* 00006EE0 */ 0x96, 0x1D, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, -/* 00006EF0 */ 0x44, 0x24, 0x96, 0x1E, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, -/* 00006F00 */ 0x62, 0x44, 0x44, 0x25, 0x96, 0x1F, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, -/* 00006F10 */ 0x00, 0x00, 0x62, 0x44, 0x44, 0x26, 0x96, 0x20, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, -/* 00006F20 */ 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x27, 0x96, 0x21, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, -/* 00006F30 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x28, 0x96, 0x22, 0x00, 0x00, 0x00, 0x44, -/* 00006F40 */ 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x29, 0x96, 0x23, 0x00, 0x00, -/* 00006F50 */ 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x2A, 0x96, 0x24, -/* 00006F60 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x2B, -/* 00006F70 */ 0x96, 0x25, 0x00, 0x00, 0x00, 0x44, 0x93, 0x16, 0x00, 0x00, 0x00, 0x44, 0x02, 0x00, 0x07, 0x02, -/* 00006F80 */ 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x45, 0x5C, 0x01, 0x45, 0xEE, 0x02, 0x44, 0x44, 0x03, 0x00, 0x47, -/* 00006F90 */ 0x3B, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x2C, 0x96, 0x26, -/* 00006FA0 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x2D, -/* 00006FB0 */ 0x96, 0x27, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x3B, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x01, -/* 00006FC0 */ 0x00, 0x00, 0x00, 0x44, 0x96, 0x3C, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x02, 0x00, 0x00, 0x00, 0x44, -/* 00006FD0 */ 0x96, 0x3D, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x03, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3E, 0x00, 0x00, -/* 00006FE0 */ 0x00, 0x44, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3F, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x05, -/* 00006FF0 */ 0x00, 0x00, 0x00, 0x44, 0x96, 0x28, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x06, 0x00, 0x00, 0x00, 0x44, -/* 00007000 */ 0x96, 0x29, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x07, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2A, 0x00, 0x00, -/* 00007010 */ 0x00, 0x44, 0xD4, 0x08, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2B, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x09, -/* 00007020 */ 0x00, 0x00, 0x00, 0x44, 0x96, 0x2C, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0A, 0x00, 0x00, 0x00, 0x44, -/* 00007030 */ 0x96, 0x2D, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0B, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2E, 0x00, 0x00, -/* 00007040 */ 0x00, 0x44, 0xD4, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2F, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, -/* 00007050 */ 0x96, 0x40, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0D, 0x00, 0x00, 0x00, 0x44, 0x96, 0x30, 0x00, 0x00, -/* 00007060 */ 0x00, 0x44, 0xD4, 0x0E, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, -/* 00007070 */ 0x44, 0x44, 0x04, 0x00, 0x96, 0x31, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x41, 0x00, 0x00, -/* 00007080 */ 0x00, 0x44, 0xA8, 0x44, 0x96, 0x42, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x43, 0x00, 0x00, -/* 00007090 */ 0x00, 0x44, 0xA8, 0x44, 0x96, 0x44, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x16, 0x00, 0x00, 0x00, 0x44, -/* 000070A0 */ 0x96, 0x32, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x17, 0x00, 0x00, 0x00, 0x44, 0x96, 0x33, 0x00, 0x00, -/* 000070B0 */ 0x00, 0x44, 0xD4, 0x18, 0x00, 0x00, 0x00, 0x44, 0x96, 0x34, 0x00, 0x00, 0x00, 0x44, 0x93, 0x0A, -/* 000070C0 */ 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x45, 0x5C, 0x01, -/* 000070D0 */ 0x45, 0x5D, 0x02, 0x08, 0x05, 0x00, 0xEE, 0x03, 0x44, 0x44, 0x05, 0x00, 0x54, 0x3C, 0x44, 0x93, -/* 000070E0 */ 0x09, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x6D, 0x44, 0x45, 0x2E, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 000070F0 */ 0x45, 0x5C, 0x01, 0x3C, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 00007100 */ 0x00, 0x09, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, -/* 00007110 */ 0x0B, 0x47, 0x2F, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x07, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x07, -/* 00007120 */ 0x00, 0x5C, 0x02, 0x46, 0xF2, 0x03, 0xFF, 0x44, 0x2E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x96, 0x45, -/* 00007130 */ 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, -/* 00007140 */ 0x00, 0x09, 0x93, 0x20, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x5C, 0x01, 0x45, 0x93, 0x2A, 0x00, -/* 00007150 */ 0x00, 0x00, 0x45, 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x45, 0x00, 0x00, 0x00, -/* 00007160 */ 0x46, 0x06, 0x00, 0x5C, 0x01, 0x46, 0xD4, 0x19, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0xEE, -/* 00007170 */ 0x03, 0x45, 0x45, 0x09, 0x00, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0xEE, 0x04, 0x44, 0x44, 0x08, -/* 00007180 */ 0x00, 0x96, 0x46, 0x00, 0x00, 0x00, 0x44, 0x96, 0x47, 0x00, 0x00, 0x00, 0x0D, 0x93, 0x0C, 0x00, -/* 00007190 */ 0x00, 0x00, 0x44, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x00, 0x00, 0x00, -/* 000071A0 */ 0x45, 0x04, 0x00, 0x5C, 0x01, 0x45, 0x93, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x05, 0x00, 0x07, 0x03, -/* 000071B0 */ 0x00, 0x5C, 0x00, 0x09, 0x93, 0x47, 0x00, 0x00, 0x00, 0x46, 0x07, 0x00, 0x5C, 0x01, 0x46, 0xD4, -/* 000071C0 */ 0x1A, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0xEE, 0x03, 0x45, 0x45, 0x0B, 0x00, 0x5C, 0x02, -/* 000071D0 */ 0x45, 0x5C, 0x03, 0x3C, 0xEE, 0x04, 0x44, 0x44, 0x0A, 0x00, 0x96, 0x48, 0x00, 0x00, 0x00, 0x44, -/* 000071E0 */ 0x96, 0x49, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x03, 0x00, 0x07, 0x04, -/* 000071F0 */ 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x5C, 0x01, 0x45, 0x93, -/* 00007200 */ 0x2A, 0x00, 0x00, 0x00, 0x45, 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x49, 0x00, -/* 00007210 */ 0x00, 0x00, 0x46, 0x08, 0x00, 0x5C, 0x01, 0x46, 0xD4, 0x1B, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, -/* 00007220 */ 0x46, 0xEE, 0x03, 0x45, 0x45, 0x0D, 0x00, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0xEE, 0x04, 0x44, -/* 00007230 */ 0x44, 0x0C, 0x00, 0x96, 0x4A, 0x00, 0x00, 0x00, 0x44, 0x96, 0x4B, 0x00, 0x00, 0x00, 0x0F, 0x93, -/* 00007240 */ 0x0C, 0x00, 0x00, 0x00, 0x44, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x00, -/* 00007250 */ 0x00, 0x00, 0x45, 0x04, 0x00, 0x5C, 0x01, 0x45, 0x93, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x05, 0x00, -/* 00007260 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x4B, 0x00, 0x00, 0x00, 0x46, 0x09, 0x00, 0x5C, 0x01, -/* 00007270 */ 0x46, 0xD4, 0x1C, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0xEE, 0x03, 0x45, 0x45, 0x0F, 0x00, -/* 00007280 */ 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0xEE, 0x04, 0x44, 0x44, 0x0E, 0x00, 0x54, 0x3D, 0x44, 0x93, -/* 00007290 */ 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x46, 0x00, -/* 000072A0 */ 0x00, 0x00, 0x45, 0x0B, 0x00, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x10, 0x10, 0x00, 0xCC, 0x24, 0x00, -/* 000072B0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x12, 0x45, 0x30, 0x5C, 0x03, -/* 000072C0 */ 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x10, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, -/* 000072D0 */ 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x48, 0x00, 0x00, 0x00, 0x45, 0x0C, 0x00, 0x5C, 0x01, 0x45, -/* 000072E0 */ 0x5D, 0x02, 0x10, 0x11, 0x00, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x45, 0x00, -/* 000072F0 */ 0x00, 0x00, 0x7B, 0x12, 0x45, 0x30, 0x5C, 0x03, 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x11, 0x00, 0x93, -/* 00007300 */ 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x4A, 0x00, -/* 00007310 */ 0x00, 0x00, 0x45, 0x0D, 0x00, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x10, 0x12, 0x00, 0xCC, 0x3C, 0x00, -/* 00007320 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x12, 0x45, 0x30, 0x5C, 0x03, -/* 00007330 */ 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x12, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, -/* 00007340 */ 0x04, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x3D, 0x5D, 0x02, 0x10, 0x13, 0x00, 0xCC, 0x48, 0x00, -/* 00007350 */ 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x13, 0x45, 0x30, 0x5C, 0x03, -/* 00007360 */ 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x13, 0x00, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x07, -/* 00007370 */ 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x54, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x45, 0x00, -/* 00007380 */ 0x00, 0x00, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, -/* 00007390 */ 0xCC, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x16, 0x47, -/* 000073A0 */ 0x31, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x15, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x15, 0x00, 0x7B, -/* 000073B0 */ 0x46, 0x45, 0x32, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 000073C0 */ 0x09, 0xCC, 0x8C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x16, -/* 000073D0 */ 0x47, 0x31, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x16, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x16, 0x00, -/* 000073E0 */ 0x7B, 0x46, 0x45, 0x33, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 000073F0 */ 0x00, 0x09, 0xCC, 0x98, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, -/* 00007400 */ 0x1A, 0x47, 0x34, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x17, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x17, -/* 00007410 */ 0x00, 0x7B, 0x46, 0x45, 0x35, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, -/* 00007420 */ 0x5C, 0x00, 0x09, 0xCC, 0xA4, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, -/* 00007430 */ 0x7B, 0x1D, 0x47, 0x36, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x18, 0x00, 0xEE, 0x03, 0x46, 0x46, -/* 00007440 */ 0x18, 0x00, 0x7B, 0x46, 0x45, 0x37, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, -/* 00007450 */ 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, -/* 00007460 */ 0x00, 0x7B, 0x20, 0x47, 0x38, 0x7B, 0x1D, 0x47, 0x36, 0x7B, 0x22, 0x47, 0x39, 0x5C, 0x01, 0x47, -/* 00007470 */ 0x5D, 0x02, 0x08, 0x19, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x19, 0x00, 0x7B, 0x46, 0x45, 0x3A, 0x93, -/* 00007480 */ 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xC4, 0x00, -/* 00007490 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x1D, 0x47, 0x36, 0x7B, 0x22, -/* 000074A0 */ 0x47, 0x39, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x1A, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x1A, 0x00, -/* 000074B0 */ 0x7B, 0x46, 0x45, 0x3B, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 000074C0 */ 0x00, 0x09, 0xCC, 0xD4, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, -/* 000074D0 */ 0x1D, 0x47, 0x36, 0x7B, 0x22, 0x47, 0x39, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x1B, 0x00, 0xEE, -/* 000074E0 */ 0x03, 0x46, 0x46, 0x1B, 0x00, 0x7B, 0x46, 0x45, 0x3C, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, -/* 000074F0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xE4, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, -/* 00007500 */ 0x47, 0x00, 0x00, 0x00, 0x7B, 0x21, 0x47, 0x39, 0x7B, 0x22, 0x47, 0x3D, 0x5C, 0x01, 0x47, 0x5D, -/* 00007510 */ 0x02, 0x08, 0x1C, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x1C, 0x00, 0x7B, 0x46, 0x45, 0x3E, 0x93, 0x0A, -/* 00007520 */ 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xF4, 0x00, 0x00, -/* 00007530 */ 0x00, 0x0F, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x21, 0x47, 0x39, 0x7B, 0x22, 0x47, -/* 00007540 */ 0x3D, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x1D, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x1D, 0x00, 0x7B, -/* 00007550 */ 0x46, 0x45, 0x3F, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x08, 0x14, 0x00, 0xEE, 0x03, 0x44, 0x44, 0x14, -/* 00007560 */ 0x00, 0x96, 0x35, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1D, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, -/* 00007570 */ 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x44, 0x44, 0x1E, 0x00, 0x96, 0x36, 0x00, 0x00, 0x00, 0x44, 0xA8, -/* 00007580 */ 0x44, 0x96, 0x4C, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1E, 0x00, 0x00, 0x00, 0x44, 0x96, 0x37, 0x00, -/* 00007590 */ 0x00, 0x00, 0x44, 0xD4, 0x1F, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, -/* 000075A0 */ 0x01, 0x44, 0x44, 0x1F, 0x00, 0x47, 0x3E, 0x44, 0xD4, 0x20, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, -/* 000075B0 */ 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x44, 0x44, 0x20, 0x00, 0x47, 0x3F, 0x44, 0xD4, 0x21, 0x00, -/* 000075C0 */ 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x44, 0x44, 0x21, 0x00, 0x47, -/* 000075D0 */ 0x40, 0x44, 0x93, 0x38, 0x00, 0x00, 0x00, 0x44, 0x0E, 0x00, 0x14, 0x03, 0x00, 0x44, 0x28, 0x09, -/* 000075E0 */ 0x08, 0x01, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, -/* 000075F0 */ 0x6B, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x29, 0x22, 0x00, 0xCC, 0x04, -/* 00007600 */ 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x3E, 0x45, 0x30, 0x7B, -/* 00007610 */ 0x02, 0x45, 0x40, 0x7B, 0x2C, 0x45, 0x41, 0x7B, 0x02, 0x45, 0x42, 0x5C, 0x03, 0x45, 0xEE, 0x04, -/* 00007620 */ 0xFF, 0x44, 0x22, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, -/* 00007630 */ 0x00, 0x09, 0x6B, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x2E, 0x23, 0x00, -/* 00007640 */ 0xCC, 0x1C, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x3F, 0x45, -/* 00007650 */ 0x30, 0x7B, 0x02, 0x45, 0x40, 0x7B, 0x2C, 0x45, 0x41, 0x7B, 0x02, 0x45, 0x42, 0x5C, 0x03, 0x45, -/* 00007660 */ 0xEE, 0x04, 0xFF, 0x44, 0x23, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, -/* 00007670 */ 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x2F, -/* 00007680 */ 0x24, 0x00, 0xCC, 0x34, 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, -/* 00007690 */ 0x40, 0x45, 0x30, 0x7B, 0x02, 0x45, 0x40, 0x7B, 0x2C, 0x45, 0x41, 0x7B, 0x02, 0x45, 0x42, 0x5C, -/* 000076A0 */ 0x03, 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x24, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, -/* 000076B0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5D, -/* 000076C0 */ 0x02, 0x13, 0x25, 0x00, 0xCC, 0x4C, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, -/* 000076D0 */ 0x00, 0x7B, 0x3D, 0x45, 0x30, 0x7B, 0x02, 0x45, 0x40, 0x7B, 0x2C, 0x45, 0x41, 0x7B, 0x02, 0x45, -/* 000076E0 */ 0x42, 0x5C, 0x03, 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x25, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x14, 0xFE, -/* 000076F0 */ 0x64, 0x01, 0x00, 0x4C, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, -/* 00007700 */ 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x34, -/* 00007710 */ 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, -/* 00007720 */ 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x1C, 0x01, 0x00, 0x00, 0x03, -/* 00007730 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, -/* 00007740 */ 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, -/* 00007750 */ 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, -/* 00007760 */ 0x01, 0x00, 0x00, 0xF4, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, -/* 00007770 */ 0x02, 0x00, 0x00, 0xFA, 0x02, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, -/* 00007780 */ 0x00, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xFA, 0x02, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x03, -/* 00007790 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xC4, -/* 000077A0 */ 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, -/* 000077B0 */ 0x02, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, -/* 000077C0 */ 0x02, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x03, -/* 000077D0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x03, -/* 000077E0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0x02, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x03, -/* 000077F0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x03, -/* 00007800 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x03, -/* 00007810 */ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x02, 0x00, 0x00, 0xEB, 0x02, 0x00, 0x00, 0xEC, -/* 00007820 */ 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0xF7, 0x02, 0x00, 0x00, 0xF8, -/* 00007830 */ 0x02, 0x00, 0x00, 0xF9, 0x02, 0x00, 0x00, 0xFB, 0x02, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, -/* 00007840 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x03, -/* 00007850 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, -/* 00007860 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x03, -/* 00007870 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, -/* 00007880 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 00007890 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1E, -/* 000078A0 */ 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xFE, 0x03, 0x03, 0xFE, 0x04, 0x03, 0xF6, -/* 000078B0 */ 0xFE, 0x04, 0x03, 0xFE, 0x05, 0x03, 0xFE, 0x05, 0x03, 0xFE, 0xAA, 0x02, 0xFE, 0xAA, 0x02, 0xFE, -/* 000078C0 */ 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x38, 0x02, 0x84, 0xFE, 0x32, 0x01, 0xFE, 0x58, 0x01, 0xFE, -/* 000078D0 */ 0x2D, 0x01, 0xFE, 0x7A, 0x01, 0x95, 0xA7, 0xF6, 0xFE, 0x08, 0x02, 0xFE, 0x3A, 0x02, 0x17, 0xFE, -/* 000078E0 */ 0x3B, 0x02, 0x1F, 0xFE, 0x3C, 0x02, 0xFE, 0x1E, 0x01, 0xFE, 0x3D, 0x02, 0x25, 0xFE, 0x3F, 0x02, -/* 000078F0 */ 0xFE, 0x40, 0x02, 0xFE, 0x41, 0x02, 0xFE, 0x42, 0x02, 0xFE, 0x3E, 0x02, 0xFE, 0x46, 0x02, 0xFE, -/* 00007900 */ 0x47, 0x02, 0xFE, 0x48, 0x02, 0xFE, 0x49, 0x02, 0xFE, 0x4A, 0x02, 0xFE, 0x4B, 0x02, 0xFE, 0x4C, -/* 00007910 */ 0x02, 0xFE, 0x4F, 0x02, 0xFE, 0x50, 0x02, 0xFE, 0x51, 0x02, 0xFE, 0x52, 0x02, 0xFE, 0x53, 0x02, -/* 00007920 */ 0xFE, 0x34, 0x02, 0xFE, 0x61, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xE9, 0x02, 0xFE, 0xE8, 0x02, 0xFE, -/* 00007930 */ 0xEB, 0x02, 0xFE, 0xED, 0x02, 0xFE, 0xEC, 0x02, 0xFE, 0xF0, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF3, -/* 00007940 */ 0x02, 0xFE, 0xF5, 0x02, 0xFE, 0xF2, 0x02, 0xFE, 0xF7, 0x02, 0xFE, 0xF8, 0x02, 0xFE, 0xFA, 0x02, -/* 00007950 */ 0xFE, 0xF9, 0x02, 0xFE, 0xFB, 0x02, 0xFE, 0xB3, 0x01, 0xFE, 0xB1, 0x01, 0xFE, 0xB2, 0x01, 0xDB, -/* 00007960 */ 0xFE, 0x06, 0x03, 0xFE, 0x07, 0x03, 0xFE, 0x08, 0x03, 0xFE, 0x09, 0x03, 0xFE, 0x0A, 0x03, 0xFE, -/* 00007970 */ 0x0B, 0x03, 0xFE, 0x0C, 0x03, 0xFE, 0x0D, 0x03, 0xFE, 0x0E, 0x03, 0xFE, 0x0F, 0x03, 0xFE, 0x10, -/* 00007980 */ 0x03, 0x84, 0xFE, 0x32, 0x01, 0xFE, 0x58, 0x01, 0xFE, 0x2D, 0x01, 0xFE, 0x7A, 0x01, 0x95, 0xA7, -/* 00007990 */ 0xFE, 0x11, 0x03, 0xF7, 0xFE, 0x12, 0x03, 0xFE, 0x13, 0x03, 0xFE, 0x14, 0x03, 0xFE, 0x15, 0x03, -/* 000079A0 */ 0xFE, 0x16, 0x03, 0xFE, 0x17, 0x03, 0xFE, 0x18, 0x03, 0xFE, 0x19, 0x03, 0xFE, 0x1A, 0x03, 0xFE, -/* 000079B0 */ 0x1B, 0x03, 0xFE, 0x1C, 0x03, 0xFE, 0x1D, 0x03, 0xFE, 0x1E, 0x03, 0xFE, 0x1F, 0x03, 0xFE, 0x20, -/* 000079C0 */ 0x03, 0xFE, 0x21, 0x03, 0xE0, 0xE3, 0xFE, 0x22, 0x03, 0xFE, 0x23, 0x03, 0xFE, 0x24, 0x03, 0xFE, -/* 000079D0 */ 0x2A, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x25, 0x03, 0xFE, 0x26, 0x03, 0xFE, 0x27, 0x03, 0xFE, 0x28, -/* 000079E0 */ 0x03, 0xFE, 0x29, 0x03, 0xFE, 0x2A, 0x03, 0xFE, 0x2B, 0x03, 0xFE, 0x79, 0x02, 0xFE, 0x2C, 0x03, -/* 000079F0 */ 0xFE, 0x2D, 0x03, 0xFE, 0x2E, 0x03, 0xFE, 0x2F, 0x03, 0xFE, 0x30, 0x03, 0xFE, 0xD9, 0x02, 0xFE, -/* 00007A00 */ 0x31, 0x03, 0xFE, 0x32, 0x03, 0xFE, 0x33, 0x03, 0xFE, 0x34, 0x03, 0xFE, 0x35, 0x03, 0xFE, 0x36, -/* 00007A10 */ 0x03, 0xFE, 0x37, 0x03, 0xFE, 0x38, 0x03, 0xFE, 0x39, 0x03, 0xFE, 0x3A, 0x03, 0xFE, 0x3B, 0x03, -/* 00007A20 */ 0xFE, 0x3C, 0x03, 0xFE, 0x3D, 0x03, 0xFE, 0x3E, 0x03, 0xFE, 0x3F, 0x03, 0xFE, 0x40, 0x03, 0xFE, -/* 00007A30 */ 0x41, 0x03, 0xFE, 0x42, 0x03, 0x00, 0xFE, 0xBB, 0x01, 0x5B, 0x00, 0x01, 0x00, 0x00, 0x0A, 0x00, -/* 00007A40 */ 0xA4, 0x00, 0x0C, 0x00, 0x20, 0x00, 0x16, 0x00, 0x38, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x16, 0x00, -/* 00007A50 */ 0x39, 0x00, 0x25, 0x00, 0xD4, 0x00, 0x1A, 0x00, 0x30, 0x00, 0x0F, 0x00, 0x45, 0x00, 0x06, 0x00, -/* 00007A60 */ 0x35, 0x00, 0x12, 0x00, 0x35, 0x00, 0x12, 0x00, 0x39, 0x00, 0x12, 0x00, 0x42, 0x00, 0x12, 0x00, -/* 00007A70 */ 0x24, 0x00, 0x12, 0x00, 0x22, 0x00, 0x12, 0x00, 0x22, 0x00, 0x12, 0x00, 0x22, 0x00, 0x12, 0x00, -/* 00007A80 */ 0x22, 0x00, 0x12, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x20, 0x00, 0x0F, 0x00, 0x1D, 0x00, 0x12, 0x00, -/* 00007A90 */ 0x2D, 0x00, 0x6F, 0x00, 0xC8, 0x00, 0x12, 0x00, 0x54, 0x00, 0x12, 0x00, 0x50, 0x00, 0x12, 0x00, -/* 00007AA0 */ 0x5E, 0x00, 0x12, 0x00, 0x02, 0x01, 0x12, 0x00, 0x55, 0x00, 0x0C, 0x00, 0x94, 0x00, 0x12, 0x00, -/* 00007AB0 */ 0x4C, 0x00, 0x12, 0x00, 0x4C, 0x00, 0x12, 0x00, 0x46, 0x00, 0x12, 0x00, 0x47, 0x00, 0x12, 0x00, -/* 00007AC0 */ 0x4C, 0x00, 0x12, 0x00, 0x4A, 0x00, 0x12, 0x00, 0x3B, 0x00, 0x12, 0x00, 0x4E, 0x00, 0x12, 0x00, -/* 00007AD0 */ 0x56, 0x00, 0x12, 0x00, 0x57, 0x00, 0x1C, 0x00, 0x35, 0x00, 0x12, 0x00, 0x3E, 0x00, 0x12, 0x00, -/* 00007AE0 */ 0x39, 0x00, 0x08, 0x00, 0x25, 0x00, 0x0C, 0x00, 0xE9, 0x01, 0x0C, 0x00, 0x40, 0x01, 0x0C, 0x00, -/* 00007AF0 */ 0x0C, 0x02, 0x0C, 0x00, 0x90, 0x01, 0x0C, 0x00, 0x58, 0x01, 0x0C, 0x00, 0x9A, 0x00, 0x0C, 0x00, -/* 00007B00 */ 0x70, 0x00, 0x0C, 0x00, 0xA7, 0x04, 0x0C, 0x00, 0x93, 0x04, 0x0C, 0x00, 0x31, 0x04, 0x0C, 0x00, -/* 00007B10 */ 0xB1, 0x09, 0x0C, 0x00, 0xEF, 0x02, 0x08, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x93, 0x03, 0x18, 0x00, -/* 00007B20 */ 0x89, 0x0A, 0x08, 0x00, 0x75, 0x00, 0x08, 0x00, 0x38, 0x00, 0x08, 0x00, 0x4C, 0x00, 0x08, 0x00, -/* 00007B30 */ 0x83, 0x1C, 0x0C, 0x00, 0xC0, 0x01, 0x0C, 0x00, 0xDF, 0x01, 0x0C, 0x00, 0x80, 0x03, 0x21, 0x00, -/* 00007B40 */ 0x3C, 0x00, 0x4F, 0x00, 0x25, 0x01, 0x06, 0x00, 0x51, 0x00, 0x53, 0x00, 0xA1, 0x01, 0x06, 0x00, -/* 00007B50 */ 0x59, 0x00, 0x53, 0x00, 0xB1, 0x01, 0x06, 0x00, 0x5D, 0x00, 0x53, 0x00, 0xB9, 0x01, 0x06, 0x00, -/* 00007B60 */ 0x41, 0x00, 0x50, 0x00, 0xAD, 0x02, 0x38, 0x00, 0x60, 0x00, 0x38, 0x00, 0x64, 0x00, 0x38, 0x00, -/* 00007B70 */ 0x66, 0x00, 0x30, 0x00, 0x49, 0x01, 0x00, 0x02, 0x51, 0x05, 0x18, 0x00, 0xCA, 0x03, 0x08, 0x00, -/* 00007B80 */ 0x2B, 0x00, 0x0C, 0x00, 0x3B, 0x09, 0x15, 0x00, 0xD1, 0x30, 0x15, 0x00, 0x14, 0x39, 0x15, 0x00, -/* 00007B90 */ 0xC3, 0x6D, 0x10, 0x00, 0x23, 0x00, 0x42, 0x00, 0x96, 0x00, 0x42, 0x00, 0x96, 0x00, 0x42, 0x00, -/* 00007BA0 */ 0x96, 0x00, 0x44, 0x00, 0x94, 0x00, 0x00, 0xE6, 0x23, 0x01, 0x00, 0xC4, 0x22, 0x01, 0x00, 0x12, -/* 00007BB0 */ 0x22, 0x01, 0x00, 0x3C, 0x21, 0x01, 0x00, 0x03, 0x20, 0x01, 0x00, 0x42, 0x1F, 0x01, 0x00, 0xA8, -/* 00007BC0 */ 0x1E, 0x01, 0x00, 0x16, 0x1E, 0x01, 0x00, 0x9D, 0x1B, 0x01, 0x00, 0x53, 0x19, 0x01, 0x00, 0x87, -/* 00007BD0 */ 0x17, 0x01, 0x00, 0x50, 0x12, 0x01, 0x00, 0xAE, 0x10, 0x01, 0x00, 0xB1, 0x0E, 0x01, 0x00, 0x7D, -/* 00007BE0 */ 0x08, 0x01, 0x00, 0x32, 0x06, 0x01, 0x00, 0x84, 0x04, 0x01, 0x00, 0x0E, 0x04, 0x01, 0x00, 0xEC, -/* 00007BF0 */ 0xFF, 0x00, 0x00, 0xE2, 0xFE, 0x00, 0x00, 0x59, 0xFB, 0x00, 0x00, 0x3A, 0xF8, 0x00, 0x00, 0xF8, -/* 00007C00 */ 0xF6, 0x00, 0x00, 0xB9, 0xF5, 0x00, 0x00, 0x7D, 0xF3, 0x00, 0x00, 0xA5, 0xF2, 0x00, 0x00, 0xC9, -/* 00007C10 */ 0xF1, 0x00, 0x00, 0xED, 0xF0, 0x00, 0x00, 0x51, 0xF0, 0x00, 0x00, 0x60, 0xED, 0x00, 0x00, 0x50, -/* 00007C20 */ 0xE9, 0x00, 0x00, 0xAA, 0xD0, 0x00, 0x00, 0xD6, 0xB5, 0x00, 0x00, 0x2F, 0x7C, 0x00, 0x00, 0x3F, -/* 00007C30 */ 0xFD, 0x62, 0x04, 0x4F, 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE4, 0x04, 0x1A, 0xFF, -/* 00007C40 */ 0xA0, 0x41, 0xD1, 0x00, 0x3F, 0x00, 0xFE, 0x6A, 0xED, 0x0E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 00007C50 */ 0x01, 0xFE, 0x6A, 0xED, 0xFE, 0x72, 0x6D, 0xFE, 0x72, 0x6D, 0x01, 0x13, 0x2F, 0x3B, 0x09, 0xDA, -/* 00007C60 */ 0xDA, 0x01, 0x10, 0x01, 0x09, 0x11, 0x11, 0x11, 0x11, 0x06, 0x02, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00007C70 */ 0xFF, 0x39, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00007C80 */ 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x02, 0x01, 0xFE, 0xE9, 0x03, 0x02, -/* 00007C90 */ 0x00, 0xFE, 0xEA, 0x03, 0x02, 0x01, 0xFE, 0xEB, 0x03, 0x02, 0x00, 0xFE, 0xEC, 0x03, 0x02, 0x01, -/* 00007CA0 */ 0xFE, 0xED, 0x03, 0x02, 0x00, 0xFE, 0xEE, 0x03, 0x02, 0x01, 0xFE, 0xEF, 0x03, 0x02, 0x00, 0xFE, -/* 00007CB0 */ 0xF0, 0x03, 0x02, 0x01, 0xFE, 0xF1, 0x03, 0x02, 0x00, 0xFE, 0xF2, 0x03, 0x02, 0x01, 0xFE, 0xF3, -/* 00007CC0 */ 0x03, 0x02, 0x00, 0xFE, 0xF4, 0x03, 0x02, 0x01, 0xFE, 0xF5, 0x03, 0x02, 0x00, 0xFE, 0xF6, 0x03, -/* 00007CD0 */ 0x02, 0x01, 0xFE, 0xF7, 0x03, 0x02, 0x00, 0xFE, 0xF8, 0x03, 0x02, 0x01, 0xFE, 0xF9, 0x03, 0x02, -/* 00007CE0 */ 0x00, 0xFE, 0xFA, 0x03, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, -/* 00007CF0 */ 0x02, 0x00, 0xFE, 0xFC, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFD, 0x03, 0x01, -/* 00007D00 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFE, 0x03, 0x02, 0x00, 0xFE, 0xFF, 0x03, 0x02, 0x00, -/* 00007D10 */ 0xFE, 0x00, 0x04, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x02, 0x01, 0xFE, -/* 00007D20 */ 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x09, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, -/* 00007D30 */ 0x00, 0x03, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x08, 0x02, 0x01, 0xFE, 0xD8, 0x03, 0x02, 0x01, 0xFE, -/* 00007D40 */ 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xD9, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, 0x01, 0xFE, 0xE6, -/* 00007D50 */ 0x02, 0xFE, 0x06, 0x05, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0xA8, 0x32, 0xA8, 0x33, 0xA8, 0x34, -/* 00007D60 */ 0xA8, 0x35, 0xA8, 0x36, 0xA8, 0x37, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3D, -/* 00007D70 */ 0x00, 0x00, 0x14, 0x17, 0x00, 0x3D, 0x02, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, -/* 00007D80 */ 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x14, 0x03, 0x00, 0x3D, 0x03, 0x09, 0xC3, 0x04, 0xDE, 0x00, -/* 00007D90 */ 0x09, 0x01, 0xB8, 0x3D, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x3D, 0x95, 0x00, -/* 00007DA0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2F, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x30, -/* 00007DB0 */ 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x01, 0x50, 0x01, 0x02, 0x00, -/* 00007DC0 */ 0x00, 0x00, 0x31, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x01, 0x50, -/* 00007DD0 */ 0x01, 0x03, 0x00, 0x00, 0x00, 0x32, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -/* 00007DE0 */ 0x32, 0x01, 0x50, 0x01, 0x04, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x06, -/* 00007DF0 */ 0x00, 0x00, 0x00, 0x33, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, 0x00, 0x34, 0x3D, 0x95, 0x00, 0x00, -/* 00007E00 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x34, 0x01, 0x50, 0x01, 0x06, 0x00, 0x00, 0x00, 0x35, 0x3D, -/* 00007E10 */ 0x95, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x35, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00007E20 */ 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x7B, 0x05, 0x3D, 0x00, 0x7B, 0x07, 0x3D, 0x01, 0x7B, -/* 00007E30 */ 0x09, 0x3D, 0x02, 0x7B, 0x0B, 0x3D, 0x03, 0x7B, 0x0D, 0x3D, 0x04, 0x7B, 0x0F, 0x3D, 0x05, 0x7B, -/* 00007E40 */ 0x11, 0x3D, 0x06, 0x7B, 0x13, 0x3D, 0x07, 0x7B, 0x15, 0x3D, 0x08, 0x96, 0x02, 0x00, 0x00, 0x00, -/* 00007E50 */ 0x3D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, 0x01, 0x00, 0x6D, 0x3D, 0x3E, -/* 00007E60 */ 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, -/* 00007E70 */ 0x3F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5D, 0x01, 0x17, 0x01, 0x00, 0xB8, 0x41, -/* 00007E80 */ 0x00, 0x01, 0x50, 0x01, 0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0xEE, 0x03, 0x3F, -/* 00007E90 */ 0x3F, 0x01, 0x00, 0x5C, 0x01, 0x3F, 0x5D, 0x02, 0x19, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x3D, 0x09, -/* 00007EA0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, 0x01, -/* 00007EB0 */ 0x00, 0x6D, 0x3D, 0x3E, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00007EC0 */ 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5D, 0x01, 0x1A, -/* 00007ED0 */ 0x03, 0x00, 0xB8, 0x41, 0x00, 0x01, 0x50, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, -/* 00007EE0 */ 0x40, 0xEE, 0x03, 0x3F, 0x3F, 0x03, 0x00, 0x5C, 0x01, 0x3F, 0x5D, 0x02, 0x1B, 0x02, 0x00, 0xF2, -/* 00007EF0 */ 0x03, 0xFF, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00007F00 */ 0x00, 0x00, 0x3E, 0x01, 0x00, 0x6D, 0x3D, 0x3E, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8F, -/* 00007F10 */ 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00007F20 */ 0x18, 0x5D, 0x01, 0x1C, 0x05, 0x00, 0xB8, 0x41, 0x00, 0x01, 0x50, 0x01, 0x09, 0x00, 0x00, 0x00, -/* 00007F30 */ 0x40, 0x41, 0x5C, 0x02, 0x40, 0xEE, 0x03, 0x3F, 0x3F, 0x05, 0x00, 0x5C, 0x01, 0x3F, 0x5D, 0x02, -/* 00007F40 */ 0x1D, 0x04, 0x00, 0xF2, 0x03, 0xFF, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8F, 0x01, 0x00, -/* 00007F50 */ 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x14, 0x03, 0x00, 0x3D, 0x02, 0x09, 0xF0, -/* 00007F60 */ 0x02, 0xDE, 0x01, 0x04, 0x02, 0xB8, 0x3D, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x3D, 0x3D, 0x01, -/* 00007F70 */ 0x50, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x36, 0x3D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00007F80 */ 0x00, 0x36, 0x01, 0x50, 0x01, 0x0B, 0x00, 0x00, 0x00, 0x37, 0x3D, 0x95, 0x01, 0x00, 0x00, 0x00, -/* 00007F90 */ 0x03, 0x00, 0x00, 0x00, 0x37, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x02, -/* 00007FA0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5D, 0x01, 0x1E, 0x06, 0x00, 0x91, 0x01, 0x00, 0x00, -/* 00007FB0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x5C, 0x02, 0x3E, 0xEE, 0x03, 0xFF, 0x3D, 0x06, -/* 00007FC0 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x02, 0x00, 0x07, 0x03, 0x00, -/* 00007FD0 */ 0x5C, 0x00, 0x18, 0x5D, 0x01, 0x1F, 0x07, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 00007FE0 */ 0x00, 0x3E, 0x04, 0x00, 0x5C, 0x02, 0x3E, 0xEE, 0x03, 0xFF, 0x3D, 0x07, 0x00, 0x91, 0x01, 0x00, -/* 00007FF0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x03, 0x00, 0xCE, 0x3E, 0x02, 0x00, 0x00, 0xA1, 0x00, -/* 00008000 */ 0x20, 0x3E, 0xA1, 0x01, 0x21, 0x3E, 0x77, 0x3E, 0x3D, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, -/* 00008010 */ 0x00, 0x00, 0x00, 0x3D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, 0x00, -/* 00008020 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x5C, 0x01, 0x3E, 0x5D, 0x02, 0x22, 0x08, 0x00, -/* 00008030 */ 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x91, 0x01, 0x00, -/* 00008040 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x03, 0x00, 0x07, 0x01, 0x00, 0xC3, 0x01, 0x3F, 0x3F, -/* 00008050 */ 0x09, 0x00, 0x7B, 0x3F, 0x3E, 0x0B, 0x7B, 0x25, 0x3E, 0x0C, 0x7B, 0x25, 0x3E, 0x0D, 0x7B, 0x25, -/* 00008060 */ 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, 0x04, 0xFF, 0x3D, 0x08, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00008070 */ 0x0A, 0x00, 0x00, 0x00, 0x3D, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, -/* 00008080 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x62, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, -/* 00008090 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x3E, 0x07, 0x00, 0x62, 0x3E, 0x3E, 0x0F, -/* 000080A0 */ 0x5C, 0x02, 0x3E, 0xEE, 0x03, 0xFF, 0x3D, 0x0A, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, -/* 000080B0 */ 0x00, 0x00, 0x3D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, 0x00, 0x00, -/* 000080C0 */ 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x62, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5D, 0x02, -/* 000080D0 */ 0x28, 0x0B, 0x00, 0xCC, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, -/* 000080E0 */ 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x03, 0x00, 0x7B, 0x3F, 0x3E, 0x0B, -/* 000080F0 */ 0x7B, 0x29, 0x3E, 0x0C, 0x7B, 0x25, 0x3E, 0x0D, 0x7B, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, -/* 00008100 */ 0x04, 0xFF, 0x3D, 0x0B, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x05, -/* 00008110 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 00008120 */ 0x3E, 0x03, 0x00, 0x62, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5D, 0x02, 0x2A, 0x0C, 0x00, 0xCC, -/* 00008130 */ 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 00008140 */ 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5D, 0x01, -/* 00008150 */ 0x2C, 0x0D, 0x00, 0xB8, 0x41, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x41, 0x41, 0x01, 0x50, 0x01, -/* 00008160 */ 0x0C, 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0xEE, 0x03, 0x3F, 0x3F, 0x0D, 0x00, 0x7B, -/* 00008170 */ 0x3F, 0x3E, 0x10, 0x7B, 0x25, 0x3E, 0x0D, 0x7B, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, 0x04, -/* 00008180 */ 0xFF, 0x3D, 0x0C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x05, 0x00, -/* 00008190 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, -/* 000081A0 */ 0x03, 0x00, 0x62, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5D, 0x02, 0x2D, 0x0E, 0x00, 0xCC, 0x70, -/* 000081B0 */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xB8, 0x40, 0x00, 0xB7, 0x01, -/* 000081C0 */ 0x00, 0x00, 0x00, 0x40, 0x40, 0x01, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x7B, 0x3F, -/* 000081D0 */ 0x3E, 0x0B, 0x01, 0x64, 0x01, 0x3F, 0x3E, 0x7B, 0x29, 0x3E, 0x0C, 0x7B, 0x25, 0x3E, 0x0D, 0x7B, -/* 000081E0 */ 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, 0x04, 0xFF, 0x3D, 0x0E, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 000081F0 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, -/* 00008200 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x5C, 0x01, 0x3E, 0x5D, 0x02, 0x2E, -/* 00008210 */ 0x0F, 0x00, 0xCC, 0x88, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x8F, -/* 00008220 */ 0x01, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x3F, 0x08, 0x00, 0x4B, 0x3F, 0x7B, 0x3F, 0x3E, -/* 00008230 */ 0x0B, 0x7B, 0x29, 0x3E, 0x0C, 0x7B, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, 0x04, 0xFF, 0x3D, -/* 00008240 */ 0x0F, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x07, -/* 00008250 */ 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x06, 0x9C, 0x00, 0x88, 0x00, 0x00, -/* 00008260 */ 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, -/* 00008270 */ 0x00, 0xB2, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00008280 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, -/* 00008290 */ 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x01, 0x00, -/* 000082A0 */ 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, -/* 000082B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, -/* 000082C0 */ 0x00, 0xB2, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000082D0 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, -/* 000082E0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x03, 0x00, -/* 000082F0 */ 0x00, 0xEB, 0x03, 0x00, 0x00, 0xED, 0x03, 0x00, 0x00, 0xEF, 0x03, 0x00, 0x00, 0xF1, 0x03, 0x00, -/* 00008300 */ 0x00, 0xF3, 0x03, 0x00, 0x00, 0xF5, 0x03, 0x00, 0x00, 0xF7, 0x03, 0x00, 0x00, 0xF9, 0x03, 0x00, -/* 00008310 */ 0x00, 0x00, 0xFE, 0xE9, 0x03, 0xFE, 0xEB, 0x03, 0xFE, 0xED, 0x03, 0xFE, 0xEF, 0x03, 0xFE, 0xF1, -/* 00008320 */ 0x03, 0xFE, 0xF3, 0x03, 0xFE, 0xF5, 0x03, 0xFE, 0xF7, 0x03, 0xFE, 0xF9, 0x03, 0xFE, 0x32, 0x02, -/* 00008330 */ 0xFE, 0x94, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB1, 0x01, 0xFE, 0xB2, 0x01, 0xFE, -/* 00008340 */ 0x45, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0x01, 0x04, 0x02, 0x01, 0x07, 0x00, 0xFE, 0x02, 0x04, 0x01, -/* 00008350 */ 0xFE, 0x03, 0x04, 0x02, 0xFE, 0x04, 0x04, 0x03, 0xFE, 0x05, 0x04, 0x04, 0xFE, 0x06, 0x04, 0x05, -/* 00008360 */ 0xFE, 0x07, 0x04, 0x06, 0xFE, 0x08, 0x04, 0x02, 0x02, 0x00, 0xFE, 0x1B, 0x02, 0x01, 0xFE, 0x1C, -/* 00008370 */ 0x02, 0xFE, 0x81, 0xED, 0x12, 0x12, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x9A, 0x13, 0x37, 0x00, 0x84, -/* 00008380 */ 0x36, 0x54, 0x00, 0x11, 0x03, 0x54, 0x00, 0x1B, 0x03, 0x54, 0x00, 0x1B, 0x03, 0x48, 0x00, 0x72, -/* 00008390 */ 0x06, 0x2C, 0x00, 0x13, 0x04, 0x2C, 0x00, 0x54, 0x00, 0x1D, 0x00, 0x48, 0x00, 0x61, 0x00, 0x9D, -/* 000083A0 */ 0x00, 0x3E, 0x00, 0x4A, 0x00, 0x5C, 0x00, 0xA2, 0x00, 0x7F, 0x00, 0x22, 0x03, 0x68, 0x00, 0xEC, -/* 000083B0 */ 0x08, 0x56, 0x00, 0x9F, 0x00, 0x0F, 0x00, 0x88, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x6B, 0xB1, -/* 000083C0 */ 0x00, 0x00, 0x16, 0xAB, 0x00, 0x00, 0x66, 0xAA, 0x00, 0x00, 0x0D, 0xA8, 0x00, 0x00, 0xF2, 0xA5, -/* 000083D0 */ 0x00, 0x00, 0x36, 0xA1, 0x00, 0x00, 0x6A, 0x97, 0x00, 0x00, 0xDE, 0x94, 0x00, 0x00, 0x57, 0x92, -/* 000083E0 */ 0x00, 0x00, 0xD0, 0x8F, 0x00, 0x00, 0x18, 0x8D, 0x00, 0x00, 0x6B, 0x8A, 0x00, 0x00, 0x22, 0x89, -/* 000083F0 */ 0x00, 0x00, 0xF6, 0x83, 0x00, 0x00, 0x3F, 0xFD, 0x22, 0x04, 0x4F, 0xFC, 0x0F, 0xFE, 0xA2, 0x03, -/* 00008400 */ 0xFE, 0xBB, 0x06, 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, 0x4E, 0x00, 0xFF, 0x11, 0x51, 0x01, 0x00, -/* 00008410 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x11, 0x51, 0x01, 0x00, 0xFE, 0x30, 0x08, -/* 00008420 */ 0xFE, 0x30, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, 0x04, 0x08, 0x09, 0x20, 0x20, 0x20, -/* 00008430 */ 0x20, 0x01, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008440 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, -/* 00008450 */ 0x02, 0x00, 0xFE, 0x44, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, -/* 00008460 */ 0x01, 0xFE, 0x45, 0x04, 0x02, 0x01, 0xFE, 0xCE, 0x03, 0x02, 0x01, 0xFE, 0x38, 0x04, 0x02, 0x01, -/* 00008470 */ 0xFE, 0x3C, 0x04, 0x02, 0x01, 0xFE, 0x39, 0x04, 0x02, 0x01, 0xFE, 0x3A, 0x04, 0x02, 0x01, 0xFE, -/* 00008480 */ 0x0D, 0x04, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, -/* 00008490 */ 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0x02, 0x01, 0xFE, 0x3B, 0x04, -/* 000084A0 */ 0x03, 0x04, 0xFE, 0x8B, 0x02, 0x5B, 0x15, 0xB4, 0x15, 0x15, 0x2C, 0x19, 0x15, 0x15, 0x03, 0x00, -/* 000084B0 */ 0x19, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x00, -/* 000084C0 */ 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5D, 0x01, 0x03, 0x00, 0x00, -/* 000084D0 */ 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, -/* 000084E0 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x01, 0x07, -/* 000084F0 */ 0x02, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x15, 0xF2, 0x02, 0x19, 0x19, 0x01, 0x00, 0x00, 0x00, -/* 00008500 */ 0x01, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x19, 0x93, 0x02, 0x00, 0x00, 0x00, 0x19, 0x01, 0x00, -/* 00008510 */ 0xA8, 0x1A, 0x14, 0x16, 0x00, 0x19, 0x1A, 0x09, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x19, -/* 00008520 */ 0x01, 0x00, 0x62, 0x19, 0x19, 0x02, 0x0F, 0x2D, 0x00, 0x19, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, -/* 00008530 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, -/* 00008540 */ 0x5C, 0x00, 0x1A, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, -/* 00008550 */ 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 00008560 */ 0x19, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00008570 */ 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008580 */ 0x1B, 0x03, 0x7B, 0x1B, 0x1A, 0x04, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008590 */ 0x1B, 0x05, 0x7B, 0x1B, 0x1A, 0x06, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085A0 */ 0x1B, 0x07, 0x7B, 0x1B, 0x1A, 0x08, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085B0 */ 0x1B, 0x09, 0x7B, 0x1B, 0x1A, 0x0A, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085C0 */ 0x1B, 0x0B, 0x7B, 0x1B, 0x1A, 0x0C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085D0 */ 0x1B, 0x0D, 0x7B, 0x1B, 0x1A, 0x0E, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085E0 */ 0x1B, 0x0F, 0x7B, 0x1B, 0x1A, 0x10, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085F0 */ 0x1B, 0x11, 0x7B, 0x1B, 0x1A, 0x12, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008600 */ 0x1B, 0x13, 0x7B, 0x1B, 0x1A, 0x14, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008610 */ 0x1B, 0x15, 0x7B, 0x1B, 0x1A, 0x16, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008620 */ 0x1B, 0x17, 0x7B, 0x1B, 0x1A, 0x18, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008630 */ 0x1B, 0x19, 0x7B, 0x1B, 0x1A, 0x1A, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008640 */ 0x1B, 0x1B, 0x7B, 0x1B, 0x1A, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008650 */ 0x1B, 0x1D, 0x7B, 0x1B, 0x1A, 0x1E, 0x5C, 0x01, 0x1A, 0x5D, 0x02, 0x13, 0x03, 0x00, 0xEE, 0x03, -/* 00008660 */ 0x19, 0x19, 0x03, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x19, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, -/* 00008670 */ 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCB, 0x1A, 0x5C, 0x01, -/* 00008680 */ 0x1A, 0x5D, 0x02, 0x13, 0x04, 0x00, 0xEE, 0x03, 0x19, 0x19, 0x04, 0x00, 0x96, 0x04, 0x00, 0x00, -/* 00008690 */ 0x00, 0x19, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x03, 0x00, 0x07, 0x05, -/* 000086A0 */ 0x00, 0x5C, 0x00, 0x14, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1A, 0x04, 0x00, -/* 000086B0 */ 0x5C, 0x01, 0x1A, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1A, 0x05, 0x00, 0x07, -/* 000086C0 */ 0x02, 0x00, 0x5C, 0x00, 0x14, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x06, 0x00, 0x5C, 0x01, 0x1B, -/* 000086D0 */ 0xEE, 0x02, 0x1A, 0x1A, 0x06, 0x00, 0x5C, 0x02, 0x1A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x5C, -/* 000086E0 */ 0x03, 0x1A, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x00, 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0xFF, -/* 000086F0 */ 0x19, 0x05, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x07, -/* 00008700 */ 0x03, 0x00, 0x5C, 0x00, 0x14, 0x93, 0x04, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x00, 0x5C, 0x01, 0x1A, -/* 00008710 */ 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1A, 0x08, 0x00, 0x62, 0x1A, 0x1A, 0x1F, -/* 00008720 */ 0x5C, 0x02, 0x1A, 0xEE, 0x03, 0x00, 0x19, 0x07, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00008730 */ 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -/* 00008740 */ 0x02, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x85, -/* 00008750 */ 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x7D, -/* 00008760 */ 0x02, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x81, -/* 00008770 */ 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6C, -/* 00008780 */ 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x93, 0x02, 0xFE, 0x12, 0x02, -/* 00008790 */ 0xFE, 0x95, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x85, 0x02, 0xFE, -/* 000087A0 */ 0x86, 0x02, 0xFE, 0x7B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x7C, -/* 000087B0 */ 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x8B, 0x02, -/* 000087C0 */ 0xFE, 0x80, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x81, 0x02, 0xFE, -/* 000087D0 */ 0x8F, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x45, 0x01, 0xFE, 0xE6, 0x03, 0xFE, 0x46, 0x04, 0xFE, 0xFB, -/* 000087E0 */ 0x01, 0x00, 0xFF, 0x46, 0x51, 0x01, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, -/* 000087F0 */ 0x2A, 0x00, 0x90, 0x00, 0x29, 0x00, 0x4B, 0x00, 0x25, 0x00, 0x6B, 0x00, 0x2A, 0x00, 0x90, 0x00, -/* 00008800 */ 0x13, 0x01, 0xCE, 0x03, 0x28, 0x00, 0x3E, 0x00, 0x61, 0x00, 0x98, 0x01, 0x3B, 0x00, 0x44, 0x00, -/* 00008810 */ 0x00, 0x15, 0x88, 0x00, 0x00, 0xBF, 0xFC, 0x3A, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008820 */ 0xFF, 0xFE, 0xD4, 0x06, 0x60, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x4F, 0x00, 0xFF, 0xAC, 0x57, 0x01, -/* 00008830 */ 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0xAC, 0x57, 0x01, 0x00, 0xFE, 0x27, 0x01, -/* 00008840 */ 0xFE, 0x27, 0x01, 0x41, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x02, 0x01, 0x01, 0x05, 0xFF, -/* 00008850 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, -/* 00008860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00008870 */ 0x02, 0x01, 0xFE, 0x38, 0x04, 0x02, 0x00, 0xFE, 0xE7, 0x03, 0x04, 0x90, 0x8F, 0x01, 0x00, 0x00, -/* 00008880 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x08, -/* 00008890 */ 0x15, 0x0B, 0x00, 0x07, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x68, 0x00, -/* 000088A0 */ 0x8F, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, -/* 000088B0 */ 0x00, 0x04, 0x8F, 0x05, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x5C, 0x01, -/* 000088C0 */ 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x5C, 0x02, 0x08, -/* 000088D0 */ 0x2F, 0x08, 0x03, 0x05, 0x5C, 0x03, 0x08, 0xEE, 0x04, 0x07, 0x07, 0x00, 0x00, 0x0F, 0x03, 0x00, -/* 000088E0 */ 0x07, 0x09, 0x24, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, -/* 000088F0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x05, -/* 00008900 */ 0x01, 0x00, 0x9D, 0x08, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, -/* 00008910 */ 0xDA, 0x57, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0xA6, 0x00, 0x26, 0x00, 0x52, -/* 00008920 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAC, -/* 00008930 */ 0x06, 0x39, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x4D, 0x00, 0xFF, 0x04, 0x4E, 0x01, 0x00, 0xFF, 0x00, -/* 00008940 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x04, 0x4E, 0x01, 0x00, 0xFE, 0x60, 0x02, 0xFE, 0x60, 0x02, -/* 00008950 */ 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, -/* 00008960 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, -/* 00008970 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 00008980 */ 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0x43, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xAA, 0x5B, -/* 00008990 */ 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x2A, 0x00, 0x8F, -/* 000089A0 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, -/* 000089B0 */ 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, -/* 000089C0 */ 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 000089D0 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, -/* 000089E0 */ 0x01, 0x05, 0xF2, 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, -/* 000089F0 */ 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, 0x02, 0x0F, 0x2D, 0x00, -/* 00008A00 */ 0x08, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00008A10 */ 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, -/* 00008A20 */ 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, -/* 00008A30 */ 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, -/* 00008A40 */ 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x78, 0x02, 0x00, 0xFF, 0x2A, 0x4E, 0x01, 0x00, 0x07, 0x05, 0x00, -/* 00008A50 */ 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x2A, 0x00, 0x88, 0x00, 0x26, 0x00, 0x4B, 0x00, 0x15, 0x00, -/* 00008A60 */ 0x6B, 0x00, 0x2A, 0x00, 0x88, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, -/* 00008A70 */ 0xFC, 0x07, 0xFE, 0xD8, 0x03, 0xFE, 0x91, 0x06, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x4C, 0x00, -/* 00008A80 */ 0xFF, 0xA3, 0x47, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0xA3, 0x47, 0x01, -/* 00008A90 */ 0x00, 0xFE, 0xB7, 0x03, 0xFE, 0xB7, 0x03, 0x03, 0x0A, 0x09, 0x0D, 0x0A, 0x61, 0x60, 0x04, 0x03, -/* 00008AA0 */ 0x0C, 0x06, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008AB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008AC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, -/* 00008AD0 */ 0x43, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -/* 00008AE0 */ 0x00, 0x04, 0xFE, 0xEA, 0x01, 0xAE, 0x0B, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x2C, 0x0D, 0x09, 0x15, -/* 00008AF0 */ 0x03, 0x00, 0x0D, 0x03, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00008B00 */ 0x0E, 0x00, 0x00, 0x6D, 0x0D, 0x0E, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5D, 0x01, 0x04, -/* 00008B10 */ 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00008B20 */ 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x6D, 0x0D, 0x0E, -/* 00008B30 */ 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0D, 0x0D, 0x01, 0x00, -/* 00008B40 */ 0x00, 0x00, 0x01, 0x00, 0x47, 0x0A, 0x0D, 0xA8, 0x0D, 0x14, 0x0E, 0x00, 0x0A, 0x0D, 0x09, 0x00, -/* 00008B50 */ 0x00, 0x62, 0x0D, 0x0A, 0x02, 0x0F, 0x2D, 0x00, 0x0D, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, -/* 00008B60 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x6D, 0x0D, 0x0E, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 00008B70 */ 0x00, 0x0E, 0x5D, 0x01, 0x04, 0x02, 0x00, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x0D, -/* 00008B80 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x0D, 0x0B, 0x03, 0x10, 0x03, 0x00, 0x0D, 0x06, 0x09, -/* 00008B90 */ 0xDD, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x0D, 0x01, 0x00, 0x07, 0x02, -/* 00008BA0 */ 0x00, 0x5C, 0x00, 0x08, 0x98, 0x0E, 0x0B, 0x07, 0x00, 0x00, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x0D, -/* 00008BB0 */ 0x0D, 0x03, 0x00, 0x0F, 0x2B, 0x00, 0x0D, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x26, -/* 00008BC0 */ 0x00, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x98, 0x0E, 0x0B, 0x07, -/* 00008BD0 */ 0x01, 0x00, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x0D, 0x0D, 0x04, 0x00, 0x0F, 0x23, 0x00, 0x0D, 0x09, -/* 00008BE0 */ 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x6D, 0x0D, -/* 00008BF0 */ 0x0E, 0x04, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x0E, 0xF2, 0x01, 0xFF, 0x0D, 0x04, 0x00, 0x00, 0x00, -/* 00008C00 */ 0x05, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x07, 0x02, -/* 00008C10 */ 0x00, 0x5C, 0x00, 0x08, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, -/* 00008C20 */ 0x6D, 0x0E, 0x0F, 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x31, -/* 00008C30 */ 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x6D, 0x10, 0x11, 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, -/* 00008C40 */ 0x98, 0x12, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x12, 0xF2, 0x02, 0x10, 0x10, 0x06, 0x00, 0x00, -/* 00008C50 */ 0x00, 0x08, 0x00, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x0A, 0xF2, 0x03, 0x0E, 0x0E, 0x05, 0x00, 0x00, -/* 00008C60 */ 0x00, 0x07, 0x00, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x00, 0x0D, 0x06, 0x00, 0x09, 0x5E, 0x00, 0x8F, -/* 00008C70 */ 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00008C80 */ 0x08, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, -/* 00008C90 */ 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, -/* 00008CA0 */ 0x10, 0x05, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x08, 0xEE, 0x01, 0x10, 0x10, 0x0B, 0x00, 0x5C, -/* 00008CB0 */ 0x01, 0x10, 0x5C, 0x02, 0x0A, 0xF2, 0x03, 0x0E, 0x0E, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x5C, -/* 00008CC0 */ 0x01, 0x0E, 0xEE, 0x02, 0x00, 0x0D, 0x09, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 00008CD0 */ 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6C, 0x02, 0xF0, 0xFE, 0x59, 0x02, 0xFE, 0x31, -/* 00008CE0 */ 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0xCB, 0x47, 0x01, 0x00, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x0B, -/* 00008CF0 */ 0x00, 0x38, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0x26, 0x00, 0x47, 0x00, 0x15, 0x00, 0x67, 0x00, 0x2A, -/* 00008D00 */ 0x00, 0x80, 0x00, 0x0C, 0x00, 0x35, 0x00, 0x50, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4F, 0x00, 0x6D, -/* 00008D10 */ 0x00, 0x82, 0x00, 0x5E, 0x00, 0x51, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 00008D20 */ 0x02, 0x03, 0xFE, 0x6E, 0x06, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x4B, 0x00, 0xFF, 0x11, 0x41, -/* 00008D30 */ 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x11, 0x41, 0x01, 0x00, 0xFE, 0x36, -/* 00008D40 */ 0x06, 0xFE, 0x36, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x04, 0x02, 0x09, 0x09, 0x08, -/* 00008D50 */ 0x07, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008D60 */ 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008D70 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 00008D80 */ 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xFE, 0xD5, 0x01, 0xAE, 0x0A, 0x5B, -/* 00008D90 */ 0x0B, 0xB4, 0x0B, 0x0B, 0xA8, 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x62, 0x0F, -/* 00008DA0 */ 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x03, 0x09, 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x04, 0x00, 0x00, -/* 00008DB0 */ 0x47, 0x08, 0x0F, 0x62, 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x09, 0x00, 0x98, -/* 00008DC0 */ 0x0F, 0x0A, 0x03, 0x01, 0x00, 0x47, 0x09, 0x0F, 0x6B, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, -/* 00008DD0 */ 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x20, 0x00, -/* 00008DE0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x07, 0x03, -/* 00008DF0 */ 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC3, 0x03, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x60, 0x01, -/* 00008E00 */ 0x8F, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x6D, 0x0F, 0x10, 0x01, -/* 00008E10 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, -/* 00008E20 */ 0x00, 0x01, 0x00, 0x47, 0x0C, 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, -/* 00008E30 */ 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x0F, 0x0F, 0x02, -/* 00008E40 */ 0x00, 0x0F, 0x28, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00008E50 */ 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5D, 0x01, -/* 00008E60 */ 0x07, 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x00, -/* 00008E70 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, -/* 00008E80 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, -/* 00008E90 */ 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0D, 0x0F, 0x09, 0x4B, 0x00, 0x8F, 0x04, 0x00, -/* 00008EA0 */ 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x04, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, -/* 00008EB0 */ 0x10, 0x5C, 0x01, 0x10, 0x5D, 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x0F, 0x0F, 0x05, 0x00, 0x47, -/* 00008EC0 */ 0x0D, 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, -/* 00008ED0 */ 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0xF2, 0x03, -/* 00008EE0 */ 0xFF, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, -/* 00008EF0 */ 0x00, 0x0F, 0x05, 0x00, 0x4B, 0x0F, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, -/* 00008F00 */ 0x02, 0x08, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x0F, 0x07, 0x00, 0x47, 0x0F, 0x0D, 0x8F, 0x04, -/* 00008F10 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, -/* 00008F20 */ 0x8F, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x07, 0x00, 0x5C, 0x01, 0x11, 0x8F, -/* 00008F30 */ 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x5C, 0x02, 0x11, -/* 00008F40 */ 0x5C, 0x03, 0x0C, 0xEE, 0x04, 0x10, 0x10, 0x08, 0x00, 0x77, 0x10, 0x0F, 0x05, 0x62, 0x0F, 0x0D, -/* 00008F50 */ 0x06, 0x82, 0x0F, 0x0F, 0x28, 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 00008F60 */ 0x24, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, -/* 00008F70 */ 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x78, 0x02, 0xDB, 0x00, 0xFF, 0x90, 0x42, 0x01, 0x00, 0x14, 0x07, -/* 00008F80 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, -/* 00008F90 */ 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x20, -/* 00008FA0 */ 0x00, 0x58, 0x00, 0x26, 0x00, 0x37, 0x00, 0x22, 0x00, 0x38, 0x00, 0x25, 0x00, 0x9D, 0x00, 0x26, -/* 00008FB0 */ 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x25, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x58, 0x00, 0x23, -/* 00008FC0 */ 0x00, 0x4F, 0x00, 0x42, 0x00, 0x66, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, -/* 00008FD0 */ 0xBF, 0xFC, 0x2A, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x60, 0x06, 0x64, -/* 00008FE0 */ 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x4A, 0x00, 0xFF, 0x23, 0x3E, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, -/* 00008FF0 */ 0x00, 0x01, 0x01, 0xFF, 0x23, 0x3E, 0x01, 0x00, 0xFE, 0xAF, 0x02, 0xFE, 0xAF, 0x02, 0x03, 0x0A, -/* 00009000 */ 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, -/* 00009010 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, -/* 00009020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, -/* 00009030 */ 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFD, 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, -/* 00009040 */ 0x02, 0x00, 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 00009050 */ 0x00, 0xFE, 0x0B, 0x04, 0xFE, 0xC9, 0x01, 0xAE, 0x0E, 0x5B, 0x0B, 0xB4, 0x0B, 0x0B, 0x2C, 0x10, -/* 00009060 */ 0x0B, 0x15, 0x1B, 0x00, 0x10, 0x03, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, -/* 00009070 */ 0x00, 0x00, 0x10, 0x00, 0x00, 0xE1, 0x10, 0x0B, 0x10, 0x00, 0x0F, 0x2D, 0x00, 0x10, 0x09, 0x00, -/* 00009080 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x6D, 0x10, 0x11, -/* 00009090 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, 0x01, 0x04, 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, -/* 000090A0 */ 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 000090B0 */ 0x0C, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, -/* 000090C0 */ 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x03, 0x00, 0x00, -/* 000090D0 */ 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x0B, 0xC3, 0x02, -/* 000090E0 */ 0x11, 0x11, 0x02, 0x00, 0x5C, 0x02, 0x11, 0xEE, 0x03, 0x10, 0x10, 0x01, 0x00, 0x47, 0x0C, 0x10, -/* 000090F0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 00009100 */ 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x10, 0x10, 0x03, 0x00, 0x0F, 0x25, 0x00, 0x10, 0x09, -/* 00009110 */ 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x07, 0x02, -/* 00009120 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x10, 0x10, 0x04, 0x00, 0x0F, 0x09, 0x00, -/* 00009130 */ 0x10, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xE4, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, -/* 00009140 */ 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x11, 0x5C, 0x01, -/* 00009150 */ 0x11, 0x5D, 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x10, 0x10, 0x05, 0x00, 0x47, 0x0D, 0x10, 0x8F, -/* 00009160 */ 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4B, 0x10, 0x07, 0x04, 0x00, -/* 00009170 */ 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x98, 0x11, 0x0E, 0x08, 0x00, 0x00, 0x5C, 0x02, 0x11, 0x8F, -/* 00009180 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x07, 0x04, 0x00, -/* 00009190 */ 0x5C, 0x00, 0x06, 0x98, 0x12, 0x0E, 0x09, 0x01, 0x00, 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x0A, 0x07, -/* 000091A0 */ 0x00, 0x5D, 0x03, 0x0A, 0x07, 0x00, 0xEE, 0x04, 0x11, 0x11, 0x07, 0x00, 0x5C, 0x03, 0x11, 0xEE, -/* 000091B0 */ 0x04, 0xFF, 0x10, 0x06, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x09, -/* 000091C0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 000091D0 */ 0x12, 0x01, 0x00, 0x6D, 0x11, 0x12, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x8F, 0x03, 0x00, -/* 000091E0 */ 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x6D, 0x13, 0x14, 0x02, 0x07, 0x02, 0x00, -/* 000091F0 */ 0x5C, 0x00, 0x14, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x13, 0x13, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 00009200 */ 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0D, 0xF2, 0x03, 0x11, 0x11, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00009210 */ 0x5C, 0x01, 0x11, 0xEE, 0x02, 0x00, 0x10, 0x08, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00009220 */ 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0x41, 0x3E, 0x01, -/* 00009230 */ 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4F, 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x45, 0x00, -/* 00009240 */ 0x53, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x25, 0x00, 0x3A, 0x00, 0x56, 0x00, -/* 00009250 */ 0x76, 0x00, 0x69, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, -/* 00009260 */ 0xFF, 0xFF, 0xFF, 0xFE, 0x53, 0x06, 0x64, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x49, 0x00, 0xFF, 0x08, -/* 00009270 */ 0x3B, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x08, 0x3B, 0x01, 0x00, 0xFE, -/* 00009280 */ 0xAF, 0x02, 0xFE, 0xAF, 0x02, 0x03, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, -/* 00009290 */ 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000092A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000092B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFC, -/* 000092C0 */ 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, 0x02, 0x00, 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, -/* 000092D0 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x09, 0x04, 0xFE, 0xC9, 0x01, 0xAE, 0x0E, -/* 000092E0 */ 0x5B, 0x0B, 0xB4, 0x0B, 0x0B, 0x2C, 0x10, 0x0B, 0x15, 0x1B, 0x00, 0x10, 0x03, 0x09, 0x00, 0x00, -/* 000092F0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xE1, 0x10, 0x0B, 0x10, -/* 00009300 */ 0x00, 0x0F, 0x2D, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00009310 */ 0x00, 0x11, 0x01, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, 0x01, -/* 00009320 */ 0x04, 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, -/* 00009330 */ 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x07, 0x03, -/* 00009340 */ 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, -/* 00009350 */ 0x5C, 0x01, 0x11, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x07, -/* 00009360 */ 0x02, 0x00, 0x5C, 0x01, 0x0B, 0xC3, 0x02, 0x11, 0x11, 0x02, 0x00, 0x5C, 0x02, 0x11, 0xEE, 0x03, -/* 00009370 */ 0x10, 0x10, 0x01, 0x00, 0x47, 0x0C, 0x10, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, -/* 00009380 */ 0x10, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x10, 0x10, -/* 00009390 */ 0x03, 0x00, 0x0F, 0x25, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, -/* 000093A0 */ 0x00, 0x00, 0x10, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, -/* 000093B0 */ 0x10, 0x10, 0x04, 0x00, 0x0F, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xE4, -/* 000093C0 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x07, 0x03, 0x00, -/* 000093D0 */ 0x5C, 0x00, 0x06, 0xCB, 0x11, 0x5C, 0x01, 0x11, 0x5D, 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x10, -/* 000093E0 */ 0x10, 0x05, 0x00, 0x47, 0x0D, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, -/* 000093F0 */ 0x07, 0x00, 0x4B, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x98, 0x11, 0x0E, -/* 00009400 */ 0x08, 0x00, 0x00, 0x5C, 0x02, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, -/* 00009410 */ 0x08, 0x00, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x98, 0x12, 0x0E, 0x09, 0x01, 0x00, -/* 00009420 */ 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x0A, 0x07, 0x00, 0x5D, 0x03, 0x0A, 0x07, 0x00, 0xEE, 0x04, 0x11, -/* 00009430 */ 0x11, 0x07, 0x00, 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x06, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 00009440 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, -/* 00009450 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x6D, 0x11, 0x12, 0x01, 0x07, 0x03, -/* 00009460 */ 0x00, 0x5C, 0x00, 0x12, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x14, 0x0A, 0x00, -/* 00009470 */ 0x6D, 0x13, 0x14, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x14, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x13, -/* 00009480 */ 0x13, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0D, 0xF2, 0x03, 0x11, -/* 00009490 */ 0x11, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x5C, 0x01, 0x11, 0xEE, 0x02, 0x00, 0x10, 0x08, 0x00, -/* 000094A0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, -/* 000094B0 */ 0x5C, 0x02, 0x00, 0xFF, 0x26, 0x3B, 0x01, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4F, -/* 000094C0 */ 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x53, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, -/* 000094D0 */ 0x00, 0x25, 0x00, 0x3A, 0x00, 0x56, 0x00, 0x76, 0x00, 0x69, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, -/* 000094E0 */ 0x2A, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x46, 0x06, 0x60, 0xFF, 0xA0, -/* 000094F0 */ 0x41, 0xF1, 0x00, 0x48, 0x00, 0xFF, 0xF3, 0x37, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 00009500 */ 0x01, 0xFF, 0xF3, 0x37, 0x01, 0x00, 0xFE, 0xA9, 0x02, 0xFE, 0xA9, 0x02, 0x03, 0x0A, 0x0C, 0x11, -/* 00009510 */ 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00009520 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00009530 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, -/* 00009540 */ 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, 0x02, 0x00, -/* 00009550 */ 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 00009560 */ 0x0A, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0xFE, 0xC9, 0x01, 0xAE, 0x0F, 0x5B, 0x0C, 0xB4, 0x0C, -/* 00009570 */ 0x0C, 0x2C, 0x11, 0x0C, 0x15, 0x1B, 0x00, 0x11, 0x03, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 00009580 */ 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0xE1, 0x11, 0x0C, 0x11, 0x00, 0x0F, 0x2D, 0x00, -/* 00009590 */ 0x11, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, -/* 000095A0 */ 0x6D, 0x11, 0x12, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x5D, 0x01, 0x04, 0x00, 0x00, 0x5D, -/* 000095B0 */ 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, -/* 000095C0 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, -/* 000095D0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x5C, 0x01, 0x12, 0x8F, -/* 000095E0 */ 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x01, -/* 000095F0 */ 0x0C, 0xC3, 0x02, 0x12, 0x12, 0x02, 0x00, 0x5C, 0x02, 0x12, 0xEE, 0x03, 0x11, 0x11, 0x01, 0x00, -/* 00009600 */ 0x47, 0x0D, 0x11, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x07, -/* 00009610 */ 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0xEE, 0x02, 0x11, 0x11, 0x03, 0x00, 0x0F, 0x25, -/* 00009620 */ 0x00, 0x11, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x11, 0x05, -/* 00009630 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0xEE, 0x02, 0x11, 0x11, 0x04, 0x00, -/* 00009640 */ 0x0F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xE4, 0x00, 0x8F, 0x03, 0x00, -/* 00009650 */ 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x11, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, -/* 00009660 */ 0x12, 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x11, 0x11, 0x05, 0x00, 0x47, -/* 00009670 */ 0x0E, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x11, 0x07, 0x00, 0x4B, 0x11, -/* 00009680 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0E, 0x98, 0x12, 0x0F, 0x08, 0x00, 0x00, 0x5C, -/* 00009690 */ 0x02, 0x12, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x08, 0x00, 0x4B, 0x12, -/* 000096A0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x98, 0x13, 0x0F, 0x09, 0x01, 0x00, 0x5C, 0x01, 0x13, 0x5D, -/* 000096B0 */ 0x02, 0x0A, 0x07, 0x00, 0x5D, 0x03, 0x0B, 0x07, 0x00, 0xEE, 0x04, 0x12, 0x12, 0x07, 0x00, 0x5C, -/* 000096C0 */ 0x03, 0x12, 0xEE, 0x04, 0xFF, 0x11, 0x06, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, -/* 000096D0 */ 0x00, 0x11, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 000096E0 */ 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x6D, 0x12, 0x13, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x13, -/* 000096F0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x15, 0x0A, 0x00, 0x6D, 0x14, 0x15, 0x02, -/* 00009700 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x15, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x14, 0x14, 0x02, 0x00, 0x00, -/* 00009710 */ 0x00, 0x0A, 0x00, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0E, 0xF2, 0x03, 0x12, 0x12, 0x01, 0x00, 0x00, -/* 00009720 */ 0x00, 0x09, 0x00, 0x5C, 0x01, 0x12, 0xEE, 0x02, 0x00, 0x11, 0x08, 0x00, 0x09, 0x02, 0x00, 0xA8, -/* 00009730 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, -/* 00009740 */ 0x11, 0x38, 0x01, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4F, 0x00, 0x2A, 0x00, 0x6B, -/* 00009750 */ 0x00, 0x45, 0x00, 0x53, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x25, 0x00, 0x3A, -/* 00009760 */ 0x00, 0x56, 0x00, 0x74, 0x00, 0x69, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x4A, 0x06, 0x4F, 0xFD, -/* 00009770 */ 0x07, 0xFE, 0x08, 0x04, 0xFE, 0xC1, 0x05, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x47, 0x00, 0xFF, -/* 00009780 */ 0x28, 0x1C, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x28, 0x1C, 0x01, 0x00, -/* 00009790 */ 0xFE, 0x69, 0x1B, 0xFE, 0x69, 0x1B, 0x45, 0x1C, 0x29, 0x41, 0x07, 0xFE, 0xAA, 0x01, 0xFE, 0x8A, -/* 000097A0 */ 0x01, 0x03, 0x01, 0x0C, 0x22, 0x0F, 0x2A, 0x2A, 0x2A, 0x2A, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000097B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000097C0 */ 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x01, -/* 000097D0 */ 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0x08, 0x02, 0x00, 0xFE, 0x0A, 0x04, 0x02, -/* 000097E0 */ 0x01, 0xFE, 0x09, 0x04, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, -/* 000097F0 */ 0xFE, 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, 0xFE, 0x38, 0x04, 0x02, 0x01, 0xFE, -/* 00009800 */ 0x39, 0x04, 0x02, 0x00, 0xFE, 0x13, 0x04, 0x02, 0x00, 0xFE, 0x14, 0x04, 0x02, 0x00, 0xFE, 0x16, -/* 00009810 */ 0x04, 0x02, 0x01, 0xFE, 0x3A, 0x04, 0x02, 0x01, 0xFE, 0x0D, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, -/* 00009820 */ 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, -/* 00009830 */ 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0x02, 0x01, -/* 00009840 */ 0xFE, 0x3B, 0x04, 0x02, 0x01, 0xFE, 0x3C, 0x04, 0x02, 0x01, 0xFE, 0x58, 0x03, 0x02, 0x00, 0xFE, -/* 00009850 */ 0x3D, 0x04, 0x02, 0x00, 0xFE, 0x3E, 0x04, 0x02, 0x00, 0xFE, 0x3F, 0x04, 0x02, 0x00, 0xFE, 0x40, -/* 00009860 */ 0x04, 0x03, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x00, 0xFE, 0x00, 0x04, 0x09, 0x02, 0x00, 0xFE, -/* 00009870 */ 0x41, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x07, 0xA8, -/* 00009880 */ 0x3F, 0x2C, 0x42, 0x29, 0x0D, 0x03, 0x00, 0x42, 0x02, 0x09, 0x1C, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 00009890 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x00, 0x07, 0x01, 0x00, 0x5C, -/* 000098A0 */ 0x00, 0x43, 0xF6, 0x01, 0xFF, 0x42, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -/* 000098B0 */ 0x00, 0x42, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x19, -/* 000098C0 */ 0x00, 0x00, 0x00, 0x43, 0x02, 0x00, 0x5C, 0x01, 0x43, 0x5C, 0x02, 0x29, 0x5C, 0x03, 0x03, 0xF6, -/* 000098D0 */ 0x04, 0x42, 0x42, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x2D, 0x00, 0x62, 0x42, 0x29, 0x01, -/* 000098E0 */ 0x0F, 0x03, 0x00, 0x42, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 000098F0 */ 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x05, -/* 00009900 */ 0x5C, 0x02, 0x05, 0xF6, 0x03, 0xFF, 0x42, 0x02, 0x00, 0x77, 0x06, 0x29, 0x03, 0x8F, 0x01, 0x00, -/* 00009910 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x03, 0x00, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 00009920 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x08, 0xF6, 0x04, 0x42, 0x42, 0x03, 0x00, -/* 00009930 */ 0x47, 0x2B, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, -/* 00009940 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCE, 0x43, -/* 00009950 */ 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, 0x05, -/* 00009960 */ 0x0C, 0xF6, 0x06, 0x42, 0x42, 0x04, 0x00, 0x47, 0x2E, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, -/* 00009970 */ 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, -/* 00009980 */ 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xA8, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, -/* 00009990 */ 0x06, 0x42, 0x42, 0x05, 0x00, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x2F, 0x42, 0x09, -/* 000099A0 */ 0x25, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x6D, 0x42, -/* 000099B0 */ 0x43, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x2F, 0xF6, 0x02, 0x42, 0x42, 0x06, -/* 000099C0 */ 0x00, 0x47, 0x2F, 0x42, 0x09, 0x1F, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 000099D0 */ 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x05, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF6, 0x01, 0x42, -/* 000099E0 */ 0x42, 0x07, 0x00, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x14, 0x03, 0x00, 0x2F, 0x42, 0x09, 0x1C, 0x00, -/* 000099F0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x06, -/* 00009A00 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF6, 0x01, 0xFF, 0x42, 0x08, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 00009A10 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 00009A20 */ 0x2B, 0x5C, 0x02, 0x0E, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x03, 0x01, 0x00, 0xA1, 0x00, 0x0F, 0x43, -/* 00009A30 */ 0xA1, 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, -/* 00009A40 */ 0xF6, 0x06, 0x42, 0x42, 0x09, 0x00, 0x47, 0x30, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 00009A50 */ 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, -/* 00009A60 */ 0x12, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x03, 0x02, 0x00, 0xA1, 0x00, 0x0F, 0x43, 0xA1, 0x01, 0x10, -/* 00009A70 */ 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, -/* 00009A80 */ 0x42, 0x0A, 0x00, 0x47, 0x31, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, -/* 00009A90 */ 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x13, 0x5C, 0x03, -/* 00009AA0 */ 0x0A, 0xCE, 0x43, 0x02, 0x03, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, -/* 00009AB0 */ 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x0B, 0x00, 0x47, 0x32, 0x42, 0x8F, -/* 00009AC0 */ 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 00009AD0 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x16, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x05, 0x04, 0x00, 0xA1, -/* 00009AE0 */ 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0xA1, 0x02, 0x0F, 0x43, 0xA1, 0x03, 0x10, 0x43, 0xA1, -/* 00009AF0 */ 0x04, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x0C, -/* 00009B00 */ 0x00, 0x47, 0x33, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, -/* 00009B10 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0A, 0xCE, -/* 00009B20 */ 0x43, 0x02, 0x05, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, -/* 00009B30 */ 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x0D, 0x00, 0x47, 0x34, 0x42, 0x8F, 0x03, 0x00, -/* 00009B40 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 00009B50 */ 0x01, 0x2B, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x02, 0x06, 0x00, 0xA1, 0x00, 0x14, -/* 00009B60 */ 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, -/* 00009B70 */ 0x42, 0x0E, 0x00, 0x47, 0x35, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, -/* 00009B80 */ 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x19, 0x5C, 0x03, -/* 00009B90 */ 0x0A, 0xCE, 0x43, 0x02, 0x07, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, -/* 00009BA0 */ 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x0F, 0x00, 0x47, 0x36, 0x42, 0x8F, -/* 00009BB0 */ 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 00009BC0 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x02, 0x08, 0x00, 0xA1, -/* 00009BD0 */ 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, -/* 00009BE0 */ 0x06, 0x42, 0x42, 0x10, 0x00, 0x47, 0x37, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00009BF0 */ 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1B, -/* 00009C00 */ 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x02, 0x09, 0x00, 0xA1, 0x00, 0x10, 0x43, 0xA1, 0x01, 0x11, 0x43, -/* 00009C10 */ 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x11, 0x00, 0x47, 0x38, -/* 00009C20 */ 0x42, 0x0F, 0x03, 0x00, 0x35, 0x09, 0x31, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00009C30 */ 0x00, 0x43, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1C, -/* 00009C40 */ 0x5C, 0x03, 0x1D, 0xA8, 0x44, 0x5C, 0x04, 0x44, 0xA8, 0x44, 0x5C, 0x05, 0x44, 0xF6, 0x06, 0x43, -/* 00009C50 */ 0x43, 0x12, 0x00, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x39, -/* 00009C60 */ 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, -/* 00009C70 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1E, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x02, 0x0A, -/* 00009C80 */ 0x00, 0xA1, 0x00, 0x1F, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, 0x05, 0x0C, 0xF6, -/* 00009C90 */ 0x06, 0x42, 0x42, 0x13, 0x00, 0x47, 0x3A, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x39, 0x42, 0x09, -/* 00009CA0 */ 0x16, 0x00, 0x0F, 0x03, 0x00, 0x39, 0x09, 0x06, 0x00, 0x47, 0x43, 0x20, 0x09, 0x03, 0x00, 0x47, -/* 00009CB0 */ 0x43, 0x21, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x3B, 0x42, -/* 00009CC0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0x05, 0x00, 0x4B, 0x42, 0x07, 0x02, -/* 00009CD0 */ 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x43, 0x06, 0x00, -/* 00009CE0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, -/* 00009CF0 */ 0x00, 0x00, 0x00, 0x7B, 0x30, 0x44, 0x07, 0x7B, 0x31, 0x44, 0x08, 0x7B, 0x32, 0x44, 0x09, 0x7B, -/* 00009D00 */ 0x33, 0x44, 0x0A, 0x7B, 0x34, 0x44, 0x0B, 0x7B, 0x35, 0x44, 0x0C, 0x7B, 0x36, 0x44, 0x0D, 0x7B, -/* 00009D10 */ 0x37, 0x44, 0x0E, 0x7B, 0x38, 0x44, 0x0F, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x22, 0xF6, 0x03, 0x43, -/* 00009D20 */ 0x43, 0x14, 0x00, 0x5C, 0x01, 0x43, 0xF6, 0x02, 0x42, 0x42, 0x15, 0x00, 0x47, 0x3C, 0x42, 0x8F, -/* 00009D30 */ 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x42, 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00009D40 */ 0x04, 0x5C, 0x01, 0x2A, 0xF6, 0x02, 0x42, 0x42, 0x16, 0x00, 0x47, 0x2A, 0x42, 0x8F, 0x03, 0x00, -/* 00009D50 */ 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x42, 0x08, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 00009D60 */ 0x01, 0x2A, 0x5C, 0x02, 0x2E, 0xCE, 0x43, 0x02, 0x0B, 0x00, 0xA1, 0x00, 0x23, 0x43, 0xA1, 0x01, -/* 00009D70 */ 0x24, 0x43, 0x5C, 0x03, 0x43, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x43, 0x09, -/* 00009D80 */ 0x00, 0x5C, 0x04, 0x43, 0xF6, 0x05, 0x42, 0x42, 0x17, 0x00, 0x47, 0x3D, 0x42, 0x77, 0x2E, 0x29, -/* 00009D90 */ 0x10, 0x77, 0x2F, 0x29, 0x11, 0x62, 0x42, 0x3D, 0x12, 0x77, 0x42, 0x29, 0x13, 0x77, 0x30, 0x29, -/* 00009DA0 */ 0x14, 0x77, 0x31, 0x29, 0x15, 0x77, 0x32, 0x29, 0x16, 0x77, 0x33, 0x29, 0x17, 0x77, 0x34, 0x29, -/* 00009DB0 */ 0x18, 0x77, 0x35, 0x29, 0x19, 0x77, 0x36, 0x29, 0x1A, 0x77, 0x37, 0x29, 0x1B, 0x77, 0x38, 0x29, -/* 00009DC0 */ 0x1C, 0x77, 0x39, 0x29, 0x1D, 0x77, 0x3A, 0x29, 0x1E, 0x77, 0x3B, 0x29, 0x1F, 0x77, 0x3C, 0x29, -/* 00009DD0 */ 0x20, 0x47, 0x3E, 0x25, 0xE5, 0x24, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, -/* 00009DE0 */ 0x42, 0x0A, 0x00, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, -/* 00009DF0 */ 0x25, 0xF6, 0x03, 0xFF, 0x42, 0x18, 0x00, 0xE9, 0x09, 0x6F, 0x00, 0xE7, 0x2C, 0x06, 0x8F, 0x03, -/* 00009E00 */ 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x42, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, -/* 00009E10 */ 0x5C, 0x01, 0x2C, 0xF6, 0x02, 0xFF, 0x42, 0x19, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 00009E20 */ 0x00, 0x00, 0x42, 0x03, 0x00, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, -/* 00009E30 */ 0x5C, 0x02, 0x26, 0x5C, 0x03, 0x27, 0xF6, 0x04, 0x42, 0x42, 0x1A, 0x00, 0x47, 0x3F, 0x42, 0x47, -/* 00009E40 */ 0x42, 0x29, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x43, 0x05, 0x00, 0x4B, 0x43, -/* 00009E50 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x22, 0xF6, 0x03, 0x43, 0x43, -/* 00009E60 */ 0x1B, 0x00, 0x77, 0x43, 0x42, 0x21, 0x47, 0x3E, 0x06, 0xE9, 0x0F, 0x34, 0x00, 0x3E, 0x09, 0x00, -/* 00009E70 */ 0x00, 0x47, 0x42, 0x29, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x43, 0x0C, 0x00, -/* 00009E80 */ 0x4B, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x62, 0x44, 0x29, 0x22, 0x98, 0x44, 0x44, 0x28, -/* 00009E90 */ 0x00, 0x00, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x29, 0xF6, 0x03, 0x43, 0x43, 0x1C, 0x00, 0x77, 0x43, -/* 00009EA0 */ 0x42, 0x21, 0xE5, 0x24, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x42, 0x0A, -/* 00009EB0 */ 0x00, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, 0x06, 0xF6, -/* 00009EC0 */ 0x03, 0xFF, 0x42, 0x1D, 0x00, 0xE9, 0x09, 0x3B, 0x00, 0xE7, 0x2D, 0x06, 0x8F, 0x03, 0x00, 0x00, -/* 00009ED0 */ 0x00, 0x29, 0x00, 0x00, 0x00, 0x42, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 00009EE0 */ 0x2D, 0xF6, 0x02, 0xFF, 0x42, 0x1E, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00009EF0 */ 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF6, 0x01, 0xFF, -/* 00009F00 */ 0x42, 0x1F, 0x00, 0xE9, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x42, 0x0D, 0x00, -/* 00009F10 */ 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x62, 0x43, 0x29, 0x23, 0x5C, 0x01, 0x43, 0xF6, -/* 00009F20 */ 0x02, 0x42, 0x42, 0x20, 0x00, 0x77, 0x42, 0x29, 0x24, 0x47, 0x42, 0x29, 0x8F, 0x03, 0x00, 0x00, -/* 00009F30 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x43, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, -/* 00009F40 */ 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x44, 0x0E, 0x00, 0x5C, 0x01, 0x44, 0x62, 0x44, 0x29, -/* 00009F50 */ 0x25, 0x5C, 0x02, 0x44, 0xF6, 0x03, 0x43, 0x43, 0x21, 0x00, 0x77, 0x43, 0x42, 0x26, 0x62, 0x42, -/* 00009F60 */ 0x29, 0x27, 0xA8, 0x43, 0x15, 0x03, 0x00, 0x42, 0x43, 0x09, 0x0C, 0x00, 0x62, 0x42, 0x29, 0x28, -/* 00009F70 */ 0x43, 0x42, 0x42, 0x20, 0x77, 0x42, 0x29, 0x1D, 0x77, 0x06, 0x29, 0x29, 0xA8, 0x00, 0x24, 0x00, -/* 00009F80 */ 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, -/* 00009F90 */ 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x7E, -/* 00009FA0 */ 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x84, -/* 00009FB0 */ 0x02, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, 0x02, -/* 00009FC0 */ 0xFE, 0x63, 0x02, 0xFE, 0x64, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x7B, 0x02, 0xFE, 0x82, 0x02, 0xFE, -/* 00009FD0 */ 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x81, -/* 00009FE0 */ 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x17, 0x02, -/* 00009FF0 */ 0xFE, 0x86, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x89, 0x02, 0xFE, -/* 0000A000 */ 0x8B, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x91, -/* 0000A010 */ 0x02, 0xFE, 0x23, 0x02, 0xFE, 0x18, 0x02, 0xFE, 0x18, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x24, 0x02, -/* 0000A020 */ 0xFE, 0x92, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x23, 0x02, 0xFE, -/* 0000A030 */ 0x6C, 0x02, 0x00, 0xFF, 0x81, 0x1C, 0x01, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, -/* 0000A040 */ 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x9F, 0x00, 0x22, 0x00, 0x71, 0x00, 0x04, 0x00, 0x67, -/* 0000A050 */ 0x00, 0x26, 0x00, 0x46, 0x00, 0x37, 0x00, 0x71, 0x00, 0x2E, 0x00, 0x60, 0x00, 0x0A, 0x00, 0x32, -/* 0000A060 */ 0x00, 0x25, 0x00, 0x6C, 0x00, 0x1F, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x1C, 0x00, 0x6C, -/* 0000A070 */ 0x00, 0x3D, 0x00, 0x6F, 0x00, 0x3D, 0x00, 0x67, 0x00, 0x39, 0x00, 0x64, 0x00, 0x45, 0x00, 0x81, -/* 0000A080 */ 0x00, 0x39, 0x00, 0x62, 0x00, 0x39, 0x00, 0x64, 0x00, 0x39, 0x00, 0x68, 0x00, 0x39, 0x00, 0x68, -/* 0000A090 */ 0x00, 0x39, 0x00, 0x70, 0x00, 0x40, 0x00, 0x6F, 0x00, 0x37, 0x00, 0x77, 0x00, 0x28, 0x00, 0x71, -/* 0000A0A0 */ 0x00, 0x6F, 0x00, 0xD0, 0x01, 0x1E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x9A, 0x00, 0x04, 0x00, 0x34, -/* 0000A0B0 */ 0x00, 0x04, 0x00, 0x36, 0x00, 0x08, 0x00, 0x68, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x2C, -/* 0000A0C0 */ 0x00, 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x30, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, -/* 0000A0D0 */ 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x32, -/* 0000A0E0 */ 0x00, 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0xFA, 0x02, 0x06, 0x00, 0x93, -/* 0000A0F0 */ 0x00, 0x26, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x1B, 0x00, 0xEF, 0x00, 0x26, 0x00, 0x54, -/* 0000A100 */ 0x00, 0x27, 0x00, 0x6A, 0x00, 0x04, 0x00, 0x37, 0x00, 0x07, 0x00, 0x5A, 0x00, 0x34, 0x00, 0xDE, -/* 0000A110 */ 0x00, 0x26, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x1B, 0x00, 0x77, 0x01, 0x1D, 0x00, 0x77, -/* 0000A120 */ 0x00, 0x25, 0x00, 0x66, 0x00, 0x35, 0x00, 0x82, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x0C, 0x00, 0x6D, -/* 0000A130 */ 0x00, 0x06, 0x00, 0x3F, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x8F, 0xFC, 0x07, 0xFE, 0x07, 0x04, -/* 0000A140 */ 0xFE, 0x88, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x46, 0x00, 0xFF, 0xED, 0x0E, 0x01, 0x00, -/* 0000A150 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFF, 0xED, 0x0E, 0x01, 0x00, 0xFE, 0x2D, 0x0D, 0xFE, -/* 0000A160 */ 0x2D, 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, 0xC8, 0xBB, 0x03, 0x02, 0x10, 0x07, 0x0A, 0x0A, 0x0A, -/* 0000A170 */ 0x0A, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A180 */ 0xFF, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A190 */ 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x32, 0x04, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x03, 0x02, -/* 0000A1A0 */ 0x00, 0xFE, 0x33, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x34, 0x04, 0x02, 0x00, -/* 0000A1B0 */ 0xFE, 0x27, 0x04, 0x02, 0x00, 0xFE, 0x35, 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, -/* 0000A1C0 */ 0x0E, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, -/* 0000A1D0 */ 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0x02, 0x00, 0xFE, 0x36, 0x04, 0xFE, 0x6E, 0x03, 0xA8, 0x14, -/* 0000A1E0 */ 0x62, 0x16, 0x13, 0x00, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, -/* 0000A1F0 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, -/* 0000A200 */ 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x00, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x02, 0x00, -/* 0000A210 */ 0x00, 0xEE, 0x04, 0x16, 0x16, 0x00, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x01, 0xA8, 0x17, -/* 0000A220 */ 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x00, 0x00, 0x62, 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, 0x16, -/* 0000A230 */ 0x04, 0x09, 0xAA, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, -/* 0000A240 */ 0x6D, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x00, -/* 0000A250 */ 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x14, 0x16, -/* 0000A260 */ 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x38, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, -/* 0000A270 */ 0x00, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x13, -/* 0000A280 */ 0x00, 0x00, 0x00, 0x17, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x06, 0x03, 0x00, 0xC3, 0x02, -/* 0000A290 */ 0x17, 0x17, 0x03, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0xFF, 0x16, 0x02, 0x00, 0x09, 0x3B, 0x00, -/* 0000A2A0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, -/* 0000A2B0 */ 0x00, 0x03, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x05, 0x00, 0x5C, 0x01, -/* 0000A2C0 */ 0x17, 0x5C, 0x02, 0x12, 0x98, 0x17, 0x14, 0x07, 0x00, 0x00, 0x5C, 0x03, 0x17, 0x5D, 0x04, 0x08, -/* 0000A2D0 */ 0x04, 0x00, 0xEE, 0x05, 0x16, 0x16, 0x04, 0x00, 0x47, 0x12, 0x16, 0x09, 0xB3, 0x00, 0x62, 0x16, -/* 0000A2E0 */ 0x13, 0x02, 0x14, 0x03, 0x00, 0x16, 0x09, 0x09, 0xA7, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 0000A2F0 */ 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, 0x6D, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, -/* 0000A300 */ 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x01, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x03, 0x00, 0x00, -/* 0000A310 */ 0x00, 0x05, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x38, 0x00, 0x8F, 0x03, -/* 0000A320 */ 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, -/* 0000A330 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5D, -/* 0000A340 */ 0x01, 0x06, 0x07, 0x00, 0xC3, 0x02, 0x17, 0x17, 0x07, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0xFF, -/* 0000A350 */ 0x16, 0x06, 0x00, 0x09, 0x3B, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, -/* 0000A360 */ 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, -/* 0000A370 */ 0x00, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x12, 0x98, 0x17, 0x14, 0x07, 0x01, 0x00, -/* 0000A380 */ 0x5C, 0x03, 0x17, 0x5D, 0x04, 0x0A, 0x08, 0x00, 0xEE, 0x05, 0x16, 0x16, 0x08, 0x00, 0x47, 0x12, -/* 0000A390 */ 0x16, 0x62, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x47, 0x00, 0x62, -/* 0000A3A0 */ 0x16, 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x04, 0x09, 0x3B, 0x00, 0x62, 0x16, 0x13, 0x04, 0x15, -/* 0000A3B0 */ 0x03, 0x00, 0x16, 0x0B, 0x09, 0x2F, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -/* 0000A3C0 */ 0x16, 0x00, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, -/* 0000A3D0 */ 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0C, 0x09, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x09, 0x00, -/* 0000A3E0 */ 0x47, 0x12, 0x16, 0x09, 0x3A, 0x00, 0x62, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, -/* 0000A3F0 */ 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, -/* 0000A400 */ 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x04, 0x5C, -/* 0000A410 */ 0x02, 0x17, 0x5D, 0x03, 0x0C, 0x0A, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0A, 0x00, 0x47, 0x12, 0x16, -/* 0000A420 */ 0x62, 0x16, 0x13, 0x05, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, -/* 0000A430 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, -/* 0000A440 */ 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x05, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0D, 0x0B, -/* 0000A450 */ 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0B, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x06, 0xA8, 0x17, -/* 0000A460 */ 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, -/* 0000A470 */ 0x00, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, -/* 0000A480 */ 0x17, 0x13, 0x06, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0E, 0x0C, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0C, -/* 0000A490 */ 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x07, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, -/* 0000A4A0 */ 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, 0x4B, 0x16, -/* 0000A4B0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x07, 0x5C, 0x02, 0x17, -/* 0000A4C0 */ 0x5D, 0x03, 0x0F, 0x0D, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0D, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, -/* 0000A4D0 */ 0x13, 0x08, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 0000A4E0 */ 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, -/* 0000A4F0 */ 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x08, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x10, 0x0E, 0x00, 0xEE, -/* 0000A500 */ 0x04, 0x16, 0x16, 0x0E, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x09, 0xA8, 0x17, 0x15, 0x03, -/* 0000A510 */ 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, -/* 0000A520 */ 0x00, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, -/* 0000A530 */ 0x09, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x11, 0x0F, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0F, 0x00, 0x47, -/* 0000A540 */ 0x12, 0x16, 0x47, 0x00, 0x12, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x86, -/* 0000A550 */ 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x89, 0x02, -/* 0000A560 */ 0xFE, 0x8B, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8F, 0x02, 0x00, 0x1C, 0xFE, 0x37, -/* 0000A570 */ 0x04, 0x00, 0x1C, 0xFE, 0x37, 0x04, 0x00, 0xFF, 0x3C, 0x0F, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, -/* 0000A580 */ 0x00, 0x0E, 0x00, 0x42, 0x00, 0x2C, 0x00, 0x88, 0x00, 0x0E, 0x00, 0x8E, 0x01, 0x0C, 0x00, 0x3F, -/* 0000A590 */ 0x00, 0x2C, 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x91, 0x00, 0x3E, 0x00, 0x98, -/* 0000A5A0 */ 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x2C, 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x91, -/* 0000A5B0 */ 0x00, 0x3B, 0x00, 0x2F, 0x01, 0x26, 0x00, 0x90, 0x00, 0x2F, 0x00, 0x76, 0x00, 0x0E, 0x00, 0x40, -/* 0000A5C0 */ 0x00, 0x2C, 0x00, 0x8B, 0x00, 0x0E, 0x00, 0x3E, 0x00, 0x2C, 0x00, 0x87, 0x00, 0x0E, 0x00, 0x3F, -/* 0000A5D0 */ 0x00, 0x2C, 0x00, 0x89, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x2C, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x41, -/* 0000A5E0 */ 0x00, 0x2C, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x47, 0x00, 0x2C, 0x00, 0x8C, 0x00, 0x08, 0x00, 0x22, -/* 0000A5F0 */ 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x06, 0x04, 0xFE, 0x74, 0x05, 0x0C, -/* 0000A600 */ 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x45, 0x00, 0xFF, 0x85, 0x09, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, -/* 0000A610 */ 0x00, 0x04, 0x04, 0xFF, 0x85, 0x09, 0x01, 0x00, 0xFE, 0xF8, 0x04, 0xFE, 0xF8, 0x04, 0x01, 0x09, -/* 0000A620 */ 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, -/* 0000A630 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, 0xFF, 0xFF, -/* 0000A640 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, -/* 0000A650 */ 0xFE, 0x22, 0x04, 0x02, 0x00, 0xFE, 0x2D, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, 0x2E, 0x04, 0x02, -/* 0000A660 */ 0x00, 0xFE, 0x25, 0x04, 0x02, 0x00, 0xFE, 0x26, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x01, 0x00, -/* 0000A670 */ 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x28, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 0000A680 */ 0x2F, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x30, 0x04, 0x02, 0x00, 0xFE, 0x31, -/* 0000A690 */ 0x04, 0xFE, 0x44, 0x01, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, -/* 0000A6A0 */ 0x6D, 0x16, 0x17, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x11, 0x8F, 0x03, 0x00, -/* 0000A6B0 */ 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, -/* 0000A6C0 */ 0x19, 0x02, 0x13, 0x03, 0x5C, 0x01, 0x19, 0xEE, 0x02, 0x18, 0x18, 0x01, 0x00, 0x5C, 0x02, 0x18, -/* 0000A6D0 */ 0xF2, 0x03, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, -/* 0000A6E0 */ 0x14, 0x05, 0x09, 0x48, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x02, -/* 0000A6F0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, -/* 0000A700 */ 0x17, 0x03, 0x00, 0x07, 0x02, 0x00, 0xFC, 0x18, 0x06, 0x11, 0x06, 0xFE, 0x18, 0x07, 0x02, 0x02, -/* 0000A710 */ 0xFE, 0x18, 0x13, 0x08, 0x04, 0x5C, 0x01, 0x18, 0xC3, 0x02, 0x17, 0x17, 0x03, 0x00, 0x5C, 0x01, -/* 0000A720 */ 0x17, 0xEE, 0x02, 0xFF, 0x16, 0x02, 0x00, 0x47, 0x00, 0x11, 0x09, 0xA9, 0x00, 0x14, 0x03, 0x00, -/* 0000A730 */ 0x12, 0x09, 0x09, 0x47, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x04, -/* 0000A740 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, -/* 0000A750 */ 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x98, 0x17, 0x14, 0x0A, 0x00, 0x00, 0x5C, -/* 0000A760 */ 0x03, 0x17, 0x98, 0x17, 0x14, 0x0C, 0x01, 0x00, 0xFB, 0x17, 0x0B, 0x17, 0x0D, 0x5C, 0x04, 0x17, -/* 0000A770 */ 0xEE, 0x05, 0x00, 0x16, 0x04, 0x00, 0x09, 0x5D, 0x00, 0x09, 0x52, 0x00, 0x98, 0x16, 0x14, 0x0E, -/* 0000A780 */ 0x02, 0x00, 0x15, 0x03, 0x00, 0x16, 0x0F, 0x09, 0x44, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, -/* 0000A790 */ 0x00, 0x00, 0x00, 0x16, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, -/* 0000A7A0 */ 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x98, 0x17, -/* 0000A7B0 */ 0x14, 0x0A, 0x03, 0x00, 0x5C, 0x03, 0x17, 0x98, 0x17, 0x14, 0x0C, 0x04, 0x00, 0xFB, 0x17, 0x0B, -/* 0000A7C0 */ 0x17, 0x10, 0x5C, 0x04, 0x17, 0xEE, 0x05, 0x00, 0x16, 0x05, 0x00, 0x09, 0x08, 0x00, 0x47, 0x00, -/* 0000A7D0 */ 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, 0xFF, 0xAC, -/* 0000A7E0 */ 0x0A, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x91, 0x00, 0x08, 0x00, 0x2A, 0x00, -/* 0000A7F0 */ 0x42, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x08, 0x00, 0x33, 0x00, 0x47, 0x00, 0x81, 0x00, -/* 0000A800 */ 0x0E, 0x00, 0x32, 0x00, 0x44, 0x00, 0x8A, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0xFC, 0x2A, -/* 0000A810 */ 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x05, 0x04, 0xFE, 0x63, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, -/* 0000A820 */ 0x44, 0x00, 0xFF, 0x57, 0x04, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x57, -/* 0000A830 */ 0x04, 0x01, 0x00, 0xFE, 0x20, 0x05, 0xFE, 0x20, 0x05, 0x01, 0x09, 0x14, 0x19, 0x07, 0x50, 0x4B, -/* 0000A840 */ 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A850 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x22, 0x04, 0x02, 0x00, -/* 0000A870 */ 0xFE, 0x23, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, 0x24, 0x04, 0x02, 0x00, 0xFE, 0x25, 0x04, 0x02, -/* 0000A880 */ 0x00, 0xFE, 0x26, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x27, 0x04, 0x02, 0x00, -/* 0000A890 */ 0xFE, 0x16, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x28, 0x04, 0x01, 0x01, 0x00, -/* 0000A8A0 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x29, 0x04, 0x02, 0x01, 0xFE, 0x2A, 0x04, 0x02, 0x00, 0xFE, 0x14, -/* 0000A8B0 */ 0x04, 0x02, 0x00, 0xFE, 0x2B, 0x04, 0x02, 0x00, 0xFE, 0x2C, 0x04, 0xFE, 0x73, 0x01, 0x8F, 0x03, -/* 0000A8C0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, -/* 0000A8D0 */ 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x14, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, -/* 0000A8E0 */ 0x1B, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, 0x1C, 0x02, 0x16, 0x03, 0x5C, 0x01, -/* 0000A8F0 */ 0x1C, 0xEE, 0x02, 0x1B, 0x1B, 0x01, 0x00, 0x5C, 0x02, 0x1B, 0xF2, 0x03, 0x19, 0x19, 0x00, 0x00, -/* 0000A900 */ 0x00, 0x00, 0x00, 0x00, 0x47, 0x17, 0x19, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x48, 0x00, 0x8F, -/* 0000A910 */ 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000A920 */ 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x1A, 0x03, 0x00, 0x07, 0x02, 0x00, -/* 0000A930 */ 0xFC, 0x1B, 0x06, 0x14, 0x06, 0xFE, 0x1B, 0x07, 0x02, 0x02, 0xFE, 0x1B, 0x16, 0x08, 0x04, 0x5C, -/* 0000A940 */ 0x01, 0x1B, 0xC3, 0x02, 0x1A, 0x1A, 0x03, 0x00, 0x5C, 0x01, 0x1A, 0xEE, 0x02, 0xFF, 0x19, 0x02, -/* 0000A950 */ 0x00, 0x47, 0x00, 0x14, 0x09, 0xD8, 0x00, 0x98, 0x19, 0x17, 0x09, 0x00, 0x00, 0x15, 0x03, 0x00, -/* 0000A960 */ 0x19, 0x0A, 0x09, 0x5A, 0x00, 0x14, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x52, 0x00, 0x8F, 0x03, 0x00, -/* 0000A970 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, -/* 0000A980 */ 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1A, 0x05, 0x00, 0x5C, 0x01, 0x1A, 0x5C, 0x02, -/* 0000A990 */ 0x14, 0x98, 0x1A, 0x17, 0x0C, 0x01, 0x00, 0x5C, 0x03, 0x1A, 0x98, 0x1A, 0x17, 0x0E, 0x02, 0x00, -/* 0000A9A0 */ 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, 0x2F, 0x1A, 0x1A, 0x0A, 0x2F, 0x1A, 0x1A, 0x10, -/* 0000A9B0 */ 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0x00, 0x19, 0x04, 0x00, 0x09, 0x73, 0x00, 0x09, 0x68, 0x00, 0x15, -/* 0000A9C0 */ 0x03, 0x00, 0x15, 0x0B, 0x09, 0x60, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000A9D0 */ 0x19, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, -/* 0000A9E0 */ 0x00, 0x00, 0x1A, 0x05, 0x00, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x98, 0x1A, 0x17, 0x0C, 0x03, -/* 0000A9F0 */ 0x00, 0x5C, 0x03, 0x1A, 0x98, 0x1A, 0x17, 0x0E, 0x04, 0x00, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, -/* 0000AA00 */ 0x1A, 0x0F, 0x14, 0x03, 0x00, 0x15, 0x11, 0x09, 0x06, 0x00, 0x47, 0x1B, 0x12, 0x09, 0x03, 0x00, -/* 0000AA10 */ 0x47, 0x1B, 0x13, 0x2F, 0x1A, 0x1A, 0x1B, 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0xEE, 0x05, -/* 0000AA20 */ 0x00, 0x19, 0x05, 0x00, 0x09, 0x08, 0x00, 0x47, 0x00, 0x14, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000AA30 */ 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, 0xFF, 0x2D, 0x05, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000AA40 */ 0x00, 0x49, 0x00, 0x0F, 0x01, 0x08, 0x00, 0x2A, 0x00, 0x42, 0x00, 0xF5, 0x00, 0x06, 0x00, 0x39, -/* 0000AA50 */ 0x00, 0x16, 0x00, 0x47, 0x00, 0x52, 0x00, 0x85, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC4, -/* 0000AA60 */ 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0xDC, 0x0A, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x04, 0x04, -/* 0000AA70 */ 0xFE, 0x5A, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x43, 0x00, 0xFF, 0xF0, 0x02, 0x01, 0x00, -/* 0000AA80 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0xF0, 0x02, 0x01, 0x00, 0xE9, 0xE9, 0x01, 0x03, -/* 0000AA90 */ 0x05, 0x07, 0x0E, 0x0B, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AAA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AAB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, 0x01, 0xFE, -/* 0000AAC0 */ 0xF6, 0x02, 0x02, 0x00, 0xFE, 0xEA, 0x03, 0x34, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, -/* 0000AAD0 */ 0x09, 0x06, 0x00, 0x47, 0x00, 0x03, 0x09, 0x21, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000AAE0 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0x47, 0x00, 0x07, 0x0F, 0x03, -/* 0000AAF0 */ 0x00, 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, -/* 0000AB00 */ 0x2B, 0x03, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x06, 0x00, 0x2E, -/* 0000AB10 */ 0x00, 0x21, 0x00, 0x44, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0x03, 0x04, -/* 0000AB20 */ 0xFE, 0x1A, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x41, 0x00, 0xFE, 0x78, 0xF7, 0x01, 0xFF, -/* 0000AB30 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x78, 0xF7, 0xFE, 0x95, 0x09, 0xFE, 0x95, 0x09, 0x02, -/* 0000AB40 */ 0x06, 0x17, 0x1B, 0x05, 0xCC, 0xCA, 0x03, 0x0D, 0x02, 0x07, 0x05, 0x05, 0x05, 0x05, 0x18, 0xFF, -/* 0000AB50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AB60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x13, 0x04, 0x02, 0x00, 0xFE, 0x14, -/* 0000AB70 */ 0x04, 0x02, 0x00, 0xFE, 0x15, 0x04, 0x04, 0x02, 0x00, 0xFE, 0x16, 0x04, 0x02, 0x00, 0xFE, 0x17, -/* 0000AB80 */ 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x02, 0x00, 0xFE, 0x19, 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, -/* 0000AB90 */ 0x02, 0x00, 0xFE, 0x1A, 0x04, 0x02, 0x00, 0xFE, 0x1B, 0x04, 0x02, 0x00, 0xFE, 0x1C, 0x04, 0x02, -/* 0000ABA0 */ 0x00, 0xFE, 0x1D, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x00, 0xFE, 0x1E, 0x04, 0x02, 0x00, -/* 0000ABB0 */ 0xFE, 0x1F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, -/* 0000ABC0 */ 0x12, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x20, 0x04, 0xFE, 0x4D, 0x04, 0x96, -/* 0000ABD0 */ 0x03, 0x00, 0x00, 0x00, 0x17, 0xCE, 0x1B, 0x00, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x1B, -/* 0000ABE0 */ 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x00, 0x0F, 0x03, 0x00, 0x1B, -/* 0000ABF0 */ 0x09, 0xAD, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x00, 0x14, -/* 0000AC00 */ 0x17, 0x00, 0x1B, 0x02, 0x09, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, -/* 0000AC10 */ 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x3A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000AC20 */ 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, -/* 0000AC30 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, -/* 0000AC40 */ 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x04, 0x00, 0x00, 0xEE, 0x04, 0xFF, 0x1B, -/* 0000AC50 */ 0x00, 0x00, 0x09, 0x4B, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, -/* 0000AC60 */ 0x00, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x37, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000AC70 */ 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000AC80 */ 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, -/* 0000AC90 */ 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x07, 0x01, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x01, 0x00, -/* 0000ACA0 */ 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x0F, 0x03, 0x00, 0x1B, -/* 0000ACB0 */ 0x09, 0x99, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x14, -/* 0000ACC0 */ 0x03, 0x00, 0x1B, 0x08, 0x09, 0x3A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000ACD0 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000ACE0 */ 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, -/* 0000ACF0 */ 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x09, 0x02, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x02, 0x00, 0x09, 0x4B, -/* 0000AD00 */ 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, -/* 0000AD10 */ 0x1B, 0x0A, 0x09, 0x37, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, -/* 0000AD20 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, -/* 0000AD30 */ 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, -/* 0000AD40 */ 0x1C, 0x5D, 0x03, 0x0B, 0x03, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x03, 0x00, 0x93, 0x03, 0x00, 0x00, -/* 0000AD50 */ 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x0F, 0x01, 0x93, -/* 0000AD60 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x17, 0x00, 0x1B, 0x08, -/* 0000AD70 */ 0x09, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, -/* 0000AD80 */ 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x3A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000AD90 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000ADA0 */ 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, -/* 0000ADB0 */ 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0C, 0x04, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x04, 0x00, 0x09, 0xAD, -/* 0000ADC0 */ 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x17, 0x00, -/* 0000ADD0 */ 0x1B, 0x03, 0x09, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, -/* 0000ADE0 */ 0x02, 0x14, 0x03, 0x00, 0x1B, 0x02, 0x09, 0x3A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000ADF0 */ 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000AE00 */ 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, -/* 0000AE10 */ 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0D, 0x05, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x05, 0x00, -/* 0000AE20 */ 0x09, 0x4B, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, -/* 0000AE30 */ 0x03, 0x00, 0x1B, 0x06, 0x09, 0x37, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000AE40 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000AE50 */ 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, -/* 0000AE60 */ 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0E, 0x06, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x06, 0x00, 0x93, 0x03, -/* 0000AE70 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x03, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x37, -/* 0000AE80 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, -/* 0000AE90 */ 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, -/* 0000AEA0 */ 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0F, -/* 0000AEB0 */ 0x07, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x07, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000AEC0 */ 0x62, 0x1B, 0x1B, 0x04, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x99, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, -/* 0000AED0 */ 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x3A, 0x00, 0x8F, -/* 0000AEE0 */ 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000AEF0 */ 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, -/* 0000AF00 */ 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x10, 0x08, 0x00, -/* 0000AF10 */ 0xEE, 0x04, 0xFF, 0x1B, 0x08, 0x00, 0x09, 0x4B, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, -/* 0000AF20 */ 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x37, 0x00, 0x8F, 0x03, 0x00, -/* 0000AF30 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, -/* 0000AF40 */ 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, -/* 0000AF50 */ 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x11, 0x09, 0x00, 0xEE, 0x04, -/* 0000AF60 */ 0xFF, 0x1B, 0x09, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, -/* 0000AF70 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, -/* 0000AF80 */ 0x04, 0x00, 0x5C, 0x01, 0x1C, 0xCE, 0x1C, 0x03, 0x01, 0x00, 0xA1, 0x00, 0x12, 0x1C, 0xA1, 0x01, -/* 0000AF90 */ 0x13, 0x1C, 0xA1, 0x02, 0x14, 0x1C, 0x5C, 0x02, 0x1C, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x5C, -/* 0000AFA0 */ 0x03, 0x1C, 0xEE, 0x04, 0xFF, 0x1B, 0x0A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, -/* 0000AFB0 */ 0x00, 0x1B, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, -/* 0000AFC0 */ 0x03, 0x00, 0x5C, 0x01, 0x1C, 0xEE, 0x02, 0x1B, 0x1B, 0x0B, 0x00, 0x11, 0x03, 0x00, 0x1B, 0x15, -/* 0000AFD0 */ 0x09, 0x3D, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, -/* 0000AFE0 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x06, -/* 0000AFF0 */ 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, -/* 0000B000 */ 0x03, 0x16, 0x0C, 0x00, 0xEE, 0x04, 0x1B, 0x1B, 0x0C, 0x00, 0x47, 0x00, 0x1B, 0x09, 0x05, 0x00, -/* 0000B010 */ 0xA8, 0x1B, 0x47, 0x00, 0x1B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x7B, -/* 0000B020 */ 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x21, 0x04, -/* 0000B030 */ 0xFE, 0xFB, 0x01, 0x00, 0xFE, 0xB9, 0xF7, 0x1C, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x24, 0x00, -/* 0000B040 */ 0x13, 0x00, 0x2B, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x3A, 0x00, 0x63, 0x00, 0x14, 0x00, 0x3A, 0x00, -/* 0000B050 */ 0x37, 0x00, 0xA5, 0x00, 0x13, 0x00, 0x28, 0x00, 0x14, 0x00, 0x3A, 0x00, 0x3A, 0x00, 0x5E, 0x00, -/* 0000B060 */ 0x14, 0x00, 0x3A, 0x00, 0x37, 0x00, 0x75, 0x00, 0x13, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5A, 0x00, -/* 0000B070 */ 0x3A, 0x00, 0x5A, 0x00, 0x28, 0x00, 0x57, 0x00, 0x3A, 0x00, 0x5F, 0x00, 0x14, 0x00, 0x38, 0x00, -/* 0000B080 */ 0x37, 0x00, 0x76, 0x00, 0x13, 0x00, 0x27, 0x00, 0x37, 0x00, 0x59, 0x00, 0x13, 0x00, 0x30, 0x00, -/* 0000B090 */ 0x14, 0x00, 0x40, 0x00, 0x3A, 0x00, 0x62, 0x00, 0x14, 0x00, 0x3F, 0x00, 0x37, 0x00, 0x79, 0x00, -/* 0000B0A0 */ 0x44, 0x00, 0x3B, 0x01, 0x72, 0x00, 0x72, 0x00, 0x00, 0xAD, 0xB0, 0x00, 0x00, 0xBF, 0xFC, 0x2A, -/* 0000B0B0 */ 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x44, 0x05, 0x55, 0xFF, 0xA2, 0x41, -/* 0000B0C0 */ 0xD1, 0x00, 0x42, 0x00, 0xFE, 0xA4, 0xFF, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA4, -/* 0000B0D0 */ 0xFF, 0xAC, 0xAC, 0x41, 0x04, 0x03, 0x05, 0x05, 0x10, 0x10, 0x04, 0x01, 0x01, 0x04, 0xFF, 0xFF, -/* 0000B0E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, -/* 0000B0F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, -/* 0000B100 */ 0x56, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x98, 0x05, 0x05, -/* 0000B110 */ 0x03, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x39, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0C, -/* 0000B120 */ 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x04, 0x00, 0x00, -/* 0000B130 */ 0x00, 0x1E, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x5C, 0x01, 0x06, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000B140 */ 0x02, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0xEE, 0x04, 0xFF, -/* 0000B150 */ 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC9, 0xFF, 0x03, 0x00, 0x00, -/* 0000B160 */ 0x00, 0x00, 0x19, 0x00, 0x2C, 0x00, 0x3B, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x4F, -/* 0000B170 */ 0xFC, 0x07, 0xFE, 0x02, 0x04, 0xFE, 0xE7, 0x04, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x40, 0x00, -/* 0000B180 */ 0xFE, 0xBF, 0xED, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xBF, 0xED, 0xFE, 0x21, 0x09, -/* 0000B190 */ 0xFE, 0x21, 0x09, 0x01, 0x07, 0x15, 0x1A, 0x05, 0x93, 0x8D, 0x03, 0x08, 0x03, 0x0C, 0x0C, 0x0C, -/* 0000B1A0 */ 0x0C, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B1B0 */ 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B1C0 */ 0xFF, 0x00, 0x00, 0x03, 0x04, 0x08, 0x02, 0x01, 0xFE, 0x09, 0x04, 0x02, 0x00, 0xFE, 0x0A, 0x04, -/* 0000B1D0 */ 0x09, 0x02, 0x00, 0xFE, 0x0B, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0x02, 0x01, 0xFE, 0x0D, 0x04, -/* 0000B1E0 */ 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x02, -/* 0000B1F0 */ 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, -/* 0000B200 */ 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, -/* 0000B210 */ 0x12, 0x04, 0xFE, 0x9B, 0x02, 0xA8, 0x1A, 0x14, 0x03, 0x00, 0x15, 0x1A, 0x09, 0x28, 0x00, 0x8F, -/* 0000B220 */ 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000B230 */ 0x03, 0xCB, 0x1B, 0x5C, 0x01, 0x1B, 0x5D, 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, 0x1A, 0x1A, 0x00, -/* 0000B240 */ 0x00, 0x47, 0x15, 0x1A, 0x09, 0x26, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, -/* 0000B250 */ 0x1B, 0x01, 0x00, 0x6D, 0x1A, 0x1B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, -/* 0000B260 */ 0xF2, 0x02, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x15, 0x1A, 0x47, 0x18, 0x04, -/* 0000B270 */ 0x14, 0x0B, 0x00, 0x16, 0x05, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x3B, 0x00, -/* 0000B280 */ 0x62, 0x1A, 0x15, 0x01, 0xA8, 0x1B, 0x15, 0x2D, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, -/* 0000B290 */ 0x15, 0x02, 0xA8, 0x1B, 0x15, 0x1F, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x03, -/* 0000B2A0 */ 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x04, 0xA8, 0x1B, -/* 0000B2B0 */ 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, 0x00, 0x47, 0x18, 0x07, 0x14, 0x0B, 0x00, 0x16, 0x08, -/* 0000B2C0 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x2D, 0x00, 0x62, 0x1A, 0x15, 0x05, 0xA8, -/* 0000B2D0 */ 0x1B, 0x15, 0x1F, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x06, 0xA8, 0x1B, 0x15, -/* 0000B2E0 */ 0x11, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x07, 0xA8, 0x1B, 0x15, 0x03, 0x00, -/* 0000B2F0 */ 0x1A, 0x1B, 0x09, 0x03, 0x00, 0x47, 0x18, 0x07, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xD0, 0x00, 0x14, -/* 0000B300 */ 0x0B, 0x00, 0x17, 0x05, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xC0, 0x00, 0x8F, -/* 0000B310 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000B320 */ 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x0A, 0x02, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B330 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, -/* 0000B340 */ 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x02, 0x00, 0x8F, -/* 0000B350 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000B360 */ 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x10, 0x03, 0x00, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, -/* 0000B370 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, -/* 0000B380 */ 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x03, 0x00, 0x8F, -/* 0000B390 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000B3A0 */ 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x11, 0x04, 0x00, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000B3B0 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, -/* 0000B3C0 */ 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x04, 0x00, 0x0F, -/* 0000B3D0 */ 0x03, 0x00, 0x18, 0x09, 0xD0, 0x00, 0x14, 0x0B, 0x00, 0x17, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, -/* 0000B3E0 */ 0x00, 0x17, 0x09, 0x09, 0xC0, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, -/* 0000B3F0 */ 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x12, 0x05, 0x00, -/* 0000B400 */ 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, -/* 0000B410 */ 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, -/* 0000B420 */ 0xEE, 0x04, 0xFF, 0x1A, 0x05, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, -/* 0000B430 */ 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x13, 0x06, 0x00, -/* 0000B440 */ 0xCC, 0x60, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, -/* 0000B450 */ 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, -/* 0000B460 */ 0xEE, 0x04, 0xFF, 0x1A, 0x06, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, -/* 0000B470 */ 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x14, 0x07, 0x00, -/* 0000B480 */ 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, -/* 0000B490 */ 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, -/* 0000B4A0 */ 0xEE, 0x04, 0xFF, 0x1A, 0x07, 0x00, 0x47, 0x00, 0x15, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 0000B4B0 */ 0x06, 0x90, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, -/* 0000B4C0 */ 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x60, -/* 0000B4D0 */ 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, -/* 0000B4E0 */ 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, -/* 0000B4F0 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, -/* 0000B500 */ 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, -/* 0000B510 */ 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, -/* 0000B520 */ 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, -/* 0000B530 */ 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, -/* 0000B540 */ 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, -/* 0000B550 */ 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x52, 0x03, 0xFE, -/* 0000B560 */ 0x7B, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x7F, -/* 0000B570 */ 0x02, 0xFE, 0x81, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB1, 0x01, 0xFE, 0xB2, 0x01, -/* 0000B580 */ 0x00, 0xFE, 0x09, 0xEE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x28, 0x00, 0x4F, -/* 0000B590 */ 0x00, 0x26, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x10, 0x00, 0x45, 0x00, 0x38, 0x00, 0x97, -/* 0000B5A0 */ 0x00, 0x03, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x45, 0x00, 0x2A, 0x00, 0x7A, 0x00, 0x03, 0x00, 0x4F, -/* 0000B5B0 */ 0x00, 0x17, 0x00, 0x57, 0x00, 0x40, 0x00, 0xCB, 0x00, 0x40, 0x00, 0xCC, 0x00, 0x40, 0x00, 0xD8, -/* 0000B5C0 */ 0x00, 0x17, 0x00, 0x57, 0x00, 0x40, 0x00, 0xCB, 0x00, 0x40, 0x00, 0xCD, 0x00, 0x40, 0x00, 0xDB, -/* 0000B5D0 */ 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x04, 0x4F, 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, -/* 0000B5E0 */ 0xFF, 0xFF, 0xFE, 0xD0, 0x03, 0x18, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x37, 0x00, 0xFE, 0x54, 0xB4, -/* 0000B5F0 */ 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x54, 0xB4, 0xFE, 0x76, 0x38, 0xFE, 0x76, -/* 0000B600 */ 0x38, 0x03, 0x0D, 0x2D, 0x33, 0x09, 0xC5, 0xC5, 0x01, 0x0E, 0x01, 0x09, 0x0F, 0x0F, 0x0F, 0x0F, -/* 0000B610 */ 0x07, 0x02, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x33, -/* 0000B620 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC2, 0x03, 0x01, 0x00, 0x00, 0x00, -/* 0000B630 */ 0x00, 0x02, 0x01, 0xFE, 0xC3, 0x03, 0x02, 0x01, 0xFE, 0xC4, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 0000B640 */ 0x02, 0x01, 0xFE, 0xC5, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC6, 0x03, 0x01, -/* 0000B650 */ 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x01, 0xFE, 0xC7, 0x03, 0x02, 0x01, 0xFE, 0xC8, 0x03, -/* 0000B660 */ 0x02, 0x01, 0xFE, 0xC9, 0x03, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xCA, 0x03, 0x02, -/* 0000B670 */ 0x00, 0xFE, 0xCB, 0x03, 0x02, 0x00, 0xFE, 0xCC, 0x03, 0x02, 0x00, 0xFE, 0xCD, 0x03, 0x02, 0x01, -/* 0000B680 */ 0xFE, 0xE6, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x08, 0x02, 0x01, -/* 0000B690 */ 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0xCE, 0x03, 0x02, 0x00, 0xFE, -/* 0000B6A0 */ 0xCF, 0x03, 0x02, 0x00, 0xFE, 0xD0, 0x03, 0x02, 0x00, 0xFE, 0xD1, 0x03, 0x02, 0x00, 0xFE, 0xD2, -/* 0000B6B0 */ 0x03, 0x02, 0x00, 0xFE, 0xD3, 0x03, 0x02, 0x00, 0xFE, 0xD4, 0x03, 0x02, 0x01, 0xFE, 0xD5, 0x03, -/* 0000B6C0 */ 0x02, 0x01, 0xFE, 0xD6, 0x03, 0x02, 0x00, 0xFE, 0xD7, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x09, -/* 0000B6D0 */ 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, -/* 0000B6E0 */ 0x01, 0xFE, 0xD8, 0x03, 0x02, 0x01, 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xD9, 0x03, 0xFE, 0x61, -/* 0000B6F0 */ 0x04, 0xA8, 0x2D, 0xA8, 0x2E, 0xA8, 0x2F, 0x4F, 0x35, 0x96, 0x03, 0x00, 0x00, 0x00, 0x35, 0x4F, -/* 0000B700 */ 0x35, 0x96, 0x04, 0x00, 0x00, 0x00, 0x35, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000B710 */ 0x35, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B720 */ 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7B, 0x03, 0x36, 0x00, 0x7B, 0x03, 0x36, 0x01, 0x7B, 0x06, -/* 0000B730 */ 0x36, 0x02, 0x7B, 0x08, 0x36, 0x03, 0x7B, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x0B, -/* 0000B740 */ 0x00, 0x00, 0xEE, 0x03, 0x35, 0x35, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x35, 0x8F, 0x01, -/* 0000B750 */ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, -/* 0000B760 */ 0xCC, 0x1C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7B, 0x03, 0x36, -/* 0000B770 */ 0x00, 0x7B, 0x03, 0x36, 0x05, 0x7B, 0x06, 0x36, 0x06, 0x7B, 0x08, 0x36, 0x07, 0x7B, 0x0A, 0x36, -/* 0000B780 */ 0x04, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x0B, 0x01, 0x00, 0xEE, 0x03, 0x35, 0x35, 0x01, 0x00, 0x96, -/* 0000B790 */ 0x04, 0x00, 0x00, 0x00, 0x35, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x35, 0x01, -/* 0000B7A0 */ 0x00, 0x14, 0x17, 0x00, 0x35, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, -/* 0000B7B0 */ 0x00, 0x00, 0x35, 0x01, 0x00, 0x14, 0x03, 0x00, 0x35, 0x11, 0x09, 0x8C, 0x03, 0xDE, 0x00, 0x03, -/* 0000B7C0 */ 0x02, 0xB8, 0x35, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x35, 0x95, 0x00, 0x00, -/* 0000B7D0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000B7E0 */ 0x36, 0x02, 0x00, 0x6D, 0x35, 0x36, 0x08, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x36, 0x8F, 0x01, 0x00, -/* 0000B7F0 */ 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x37, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, -/* 0000B800 */ 0x01, 0x12, 0x03, 0x00, 0xB8, 0x39, 0x00, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x38, 0x39, -/* 0000B810 */ 0x5C, 0x02, 0x38, 0xEE, 0x03, 0x37, 0x37, 0x03, 0x00, 0x5C, 0x01, 0x37, 0x5D, 0x02, 0x0A, 0x02, -/* 0000B820 */ 0x00, 0xF2, 0x03, 0xFF, 0x35, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000B830 */ 0x38, 0x00, 0x00, 0x00, 0x35, 0x01, 0x00, 0x14, 0x03, 0x00, 0x35, 0x10, 0x09, 0x0A, 0x03, 0xDE, -/* 0000B840 */ 0x01, 0x04, 0x03, 0xB8, 0x35, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x35, 0x35, 0x01, 0x50, 0x01, -/* 0000B850 */ 0x02, 0x00, 0x00, 0x00, 0x2E, 0x35, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2E, -/* 0000B860 */ 0x01, 0x50, 0x01, 0x03, 0x00, 0x00, 0x00, 0x2F, 0x35, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, -/* 0000B870 */ 0x00, 0x00, 0x2F, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x07, -/* 0000B880 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x13, 0x04, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B890 */ 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x5C, 0x02, 0x36, 0xEE, 0x03, 0xFF, 0x35, 0x04, 0x00, 0x8F, -/* 0000B8A0 */ 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000B8B0 */ 0x0C, 0x5D, 0x01, 0x14, 0x05, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, -/* 0000B8C0 */ 0x05, 0x00, 0x5C, 0x02, 0x36, 0xEE, 0x03, 0xFF, 0x35, 0x05, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000B8D0 */ 0x1B, 0x00, 0x00, 0x00, 0x35, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, -/* 0000B8E0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x15, 0x06, -/* 0000B8F0 */ 0x00, 0xCC, 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8F, 0x01, -/* 0000B900 */ 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x37, 0x07, 0x00, 0x4B, 0x37, 0x7B, 0x37, 0x36, 0x09, -/* 0000B910 */ 0x7B, 0x18, 0x36, 0x0A, 0x7B, 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x06, -/* 0000B920 */ 0x00, 0xCE, 0x35, 0x0B, 0x00, 0x00, 0xA1, 0x00, 0x1A, 0x35, 0xA1, 0x01, 0x1B, 0x35, 0xA1, 0x02, -/* 0000B930 */ 0x1C, 0x35, 0xA1, 0x03, 0x1D, 0x35, 0xA1, 0x04, 0x1E, 0x35, 0xA1, 0x05, 0x1F, 0x35, 0xA1, 0x06, -/* 0000B940 */ 0x20, 0x35, 0xA1, 0x07, 0x21, 0x35, 0xA1, 0x08, 0x22, 0x35, 0xA1, 0x09, 0x23, 0x35, 0xA1, 0x0A, -/* 0000B950 */ 0x24, 0x35, 0x96, 0x02, 0x00, 0x00, 0x00, 0x35, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000B960 */ 0x00, 0x35, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B970 */ 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x25, 0x07, 0x00, 0xCC, 0x4C, -/* 0000B980 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, -/* 0000B990 */ 0x02, 0x00, 0x00, 0x00, 0x37, 0x04, 0x00, 0x07, 0x01, 0x00, 0xC3, 0x01, 0x37, 0x37, 0x08, 0x00, -/* 0000B9A0 */ 0x7B, 0x37, 0x36, 0x09, 0x7B, 0x26, 0x36, 0x0A, 0x7B, 0x26, 0x36, 0x0C, 0x7B, 0x26, 0x36, 0x0B, -/* 0000B9B0 */ 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x07, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 0000B9C0 */ 0x00, 0x00, 0x35, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, 0x00, 0x00, -/* 0000B9D0 */ 0x02, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x8F, 0x01, -/* 0000B9E0 */ 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x36, 0x08, 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x02, -/* 0000B9F0 */ 0x36, 0xEE, 0x03, 0xFF, 0x35, 0x09, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, -/* 0000BA00 */ 0x35, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000BA10 */ 0x00, 0x00, 0x36, 0x04, 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x28, 0x0A, -/* 0000BA20 */ 0x00, 0xCC, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x91, 0x01, -/* 0000BA30 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x37, 0x04, 0x00, 0x7B, 0x37, 0x36, 0x09, 0x7B, 0x18, -/* 0000BA40 */ 0x36, 0x0A, 0x7B, 0x26, 0x36, 0x0C, 0x7B, 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, -/* 0000BA50 */ 0x35, 0x0A, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x35, 0x06, 0x00, 0x07, -/* 0000BA60 */ 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x04, -/* 0000BA70 */ 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x29, 0x0B, 0x00, 0xCC, 0x7C, 0x00, -/* 0000BA80 */ 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xB8, 0x38, 0x00, 0xB7, 0x01, 0x00, -/* 0000BA90 */ 0x00, 0x00, 0x38, 0x38, 0x01, 0x50, 0x01, 0x04, 0x00, 0x00, 0x00, 0x37, 0x38, 0x7B, 0x37, 0x36, -/* 0000BAA0 */ 0x09, 0x01, 0x64, 0x01, 0x37, 0x36, 0x7B, 0x18, 0x36, 0x0A, 0x7B, 0x26, 0x36, 0x0C, 0x7B, 0x18, -/* 0000BAB0 */ 0x36, 0x0B, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x0B, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000BAC0 */ 0x1B, 0x00, 0x00, 0x00, 0x35, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, -/* 0000BAD0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, -/* 0000BAE0 */ 0x5D, 0x02, 0x2A, 0x0C, 0x00, 0xCC, 0x94, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, -/* 0000BAF0 */ 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x37, 0x03, 0x00, 0x07, 0x03, -/* 0000BB00 */ 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x2C, 0x0D, 0x00, 0xB8, 0x39, 0x00, 0xB7, 0x01, 0x00, 0x00, -/* 0000BB10 */ 0x00, 0x39, 0x39, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, 0x00, 0x38, 0x39, 0x5C, 0x02, 0x38, 0xEE, -/* 0000BB20 */ 0x03, 0x37, 0x37, 0x0D, 0x00, 0x7B, 0x37, 0x36, 0x0E, 0x7B, 0x26, 0x36, 0x0C, 0x7B, 0x18, 0x36, -/* 0000BB30 */ 0x0B, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x0C, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000BB40 */ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 0000BB50 */ 0x24, 0x00, 0x07, 0xA8, 0x00, 0x94, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000BB60 */ 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, -/* 0000BB70 */ 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, -/* 0000BB80 */ 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, -/* 0000BB90 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, -/* 0000BBA0 */ 0x00, 0xB2, 0x01, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000BBB0 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, -/* 0000BBC0 */ 0x00, 0x38, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, -/* 0000BBD0 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, -/* 0000BBE0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00, 0x00, 0xC7, 0x03, 0x00, 0x00, 0xC8, 0x03, 0x00, -/* 0000BBF0 */ 0x00, 0xC9, 0x03, 0x00, 0x00, 0xC6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, -/* 0000BC00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00, 0x00, 0xC3, 0x03, 0x00, 0x00, 0xC4, 0x03, 0x00, -/* 0000BC10 */ 0x00, 0xC5, 0x03, 0x00, 0x00, 0xC6, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xC2, 0x03, 0xFE, 0xC3, 0x03, -/* 0000BC20 */ 0xFE, 0xC4, 0x03, 0xFE, 0xC5, 0x03, 0xFE, 0xC6, 0x03, 0xFE, 0xC7, 0x03, 0xFE, 0xC8, 0x03, 0xFE, -/* 0000BC30 */ 0xC9, 0x03, 0xFE, 0x32, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, -/* 0000BC40 */ 0x01, 0xFE, 0x45, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xFB, 0x01, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, -/* 0000BC50 */ 0x02, 0x02, 0x01, 0x00, 0xFE, 0xDC, 0x03, 0x03, 0x02, 0x00, 0xFE, 0x1A, 0x02, 0x01, 0xFE, 0x1C, -/* 0000BC60 */ 0x02, 0xFE, 0xB9, 0xB4, 0x11, 0x16, 0x00, 0x00, 0x00, 0x47, 0x00, 0x94, 0x01, 0x47, 0x00, 0x0B, -/* 0000BC70 */ 0x02, 0x42, 0x00, 0x21, 0x1C, 0x54, 0x00, 0xAE, 0x02, 0x48, 0x00, 0x6A, 0x06, 0x2C, 0x00, 0x3B, -/* 0000BC80 */ 0x03, 0x2C, 0x00, 0x52, 0x00, 0x56, 0x00, 0x9B, 0x00, 0x37, 0x00, 0x1F, 0x01, 0x61, 0x00, 0x99, -/* 0000BC90 */ 0x00, 0x3E, 0x00, 0x48, 0x00, 0x5C, 0x00, 0x9E, 0x00, 0x68, 0x00, 0xC2, 0x04, 0x7F, 0x00, 0x16, -/* 0000BCA0 */ 0x03, 0x0F, 0x00, 0x84, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0xF9, 0xC6, 0x00, 0x00, 0x29, 0xC5, -/* 0000BCB0 */ 0x00, 0x00, 0x6F, 0xC2, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x00, 0x05, 0xBE, 0x00, 0x00, 0xC2, 0xBC, -/* 0000BCC0 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCE, -/* 0000BCD0 */ 0x04, 0x39, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x3E, 0x00, 0xFE, 0x8B, 0xE9, 0xFF, 0x00, 0x10, 0x01, -/* 0000BCE0 */ 0x00, 0x01, 0x01, 0xFE, 0x8B, 0xE9, 0xFE, 0x56, 0x02, 0xFE, 0x56, 0x02, 0x01, 0x05, 0x05, 0x08, -/* 0000BCF0 */ 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BD00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BD10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, -/* 0000BD20 */ 0x02, 0x00, 0xFE, 0xE4, 0x03, 0x02, 0x01, 0xFE, 0x01, 0x03, 0xAA, 0x5B, 0x05, 0xB4, 0x05, 0x05, -/* 0000BD30 */ 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, -/* 0000BD40 */ 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000BD50 */ 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, -/* 0000BD60 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000BD70 */ 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0xF2, 0x02, -/* 0000BD80 */ 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, -/* 0000BD90 */ 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, 0x02, 0x0F, 0x2D, 0x00, 0x08, 0x09, 0x00, 0x00, -/* 0000BDA0 */ 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, -/* 0000BDB0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, -/* 0000BDC0 */ 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, 0x09, 0x02, -/* 0000BDD0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, -/* 0000BDE0 */ 0xFE, 0x78, 0x02, 0x00, 0xFE, 0xB1, 0xE9, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, -/* 0000BDF0 */ 0x2A, 0x00, 0x84, 0x00, 0x26, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x69, 0x00, 0x2A, 0x00, 0x84, 0x00, -/* 0000BE00 */ 0x09, 0x00, 0x37, 0x00, 0x00, 0x3F, 0xFD, 0x22, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0xA2, 0x03, 0xFE, -/* 0000BE10 */ 0xB8, 0x04, 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, 0x3C, 0x00, 0xFE, 0xB4, 0xE4, 0x01, 0xFF, 0x00, -/* 0000BE20 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xB4, 0xE4, 0xFE, 0x08, 0x04, 0xFE, 0x08, 0x04, 0x02, 0x06, -/* 0000BE30 */ 0x07, 0x0B, 0x05, 0x40, 0x40, 0x04, 0x06, 0x07, 0x03, 0x03, 0x03, 0x03, 0x08, 0xFF, 0xFF, 0xFF, -/* 0000BE40 */ 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BE50 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xE5, 0x03, 0x02, -/* 0000BE60 */ 0x01, 0xFE, 0x01, 0x03, 0x03, 0x04, 0xFE, 0x48, 0x01, 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x2C, 0x0B, -/* 0000BE70 */ 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000BE80 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, -/* 0000BE90 */ 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, -/* 0000BEA0 */ 0x00, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, -/* 0000BEB0 */ 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, -/* 0000BEC0 */ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x93, 0x02, 0x00, 0x00, -/* 0000BED0 */ 0x00, 0x0B, 0x01, 0x00, 0xA8, 0x0C, 0x14, 0x16, 0x00, 0x0B, 0x0C, 0x09, 0x00, 0x00, 0x93, 0x02, -/* 0000BEE0 */ 0x00, 0x00, 0x00, 0x0B, 0x01, 0x00, 0x62, 0x0B, 0x0B, 0x02, 0x0F, 0x2D, 0x00, 0x0B, 0x09, 0x00, -/* 0000BEF0 */ 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, -/* 0000BF00 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, -/* 0000BF10 */ 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, -/* 0000BF20 */ 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0C, 0x5C, -/* 0000BF30 */ 0x01, 0x0C, 0x5D, 0x02, 0x05, 0x03, 0x00, 0xEE, 0x03, 0x0B, 0x0B, 0x03, 0x00, 0x96, 0x03, 0x00, -/* 0000BF40 */ 0x00, 0x00, 0x0B, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x03, 0x00, 0x07, -/* 0000BF50 */ 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0C, 0x04, -/* 0000BF60 */ 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x05, 0x00, -/* 0000BF70 */ 0x5C, 0x02, 0x0C, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x03, 0x0C, 0xEE, 0x04, 0xFF, 0x0B, -/* 0000BF80 */ 0x04, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x07, 0x03, -/* 0000BF90 */ 0x00, 0x5C, 0x00, 0x06, 0x93, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x06, 0x00, 0x5C, 0x01, 0x0C, 0xCB, -/* 0000BFA0 */ 0x0C, 0x5C, 0x02, 0x0C, 0xEE, 0x03, 0x00, 0x0B, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000BFB0 */ 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0xE6, 0x03, 0xFE, -/* 0000BFC0 */ 0x1D, 0x02, 0x00, 0xFE, 0xE9, 0xE4, 0x09, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x2A, -/* 0000BFD0 */ 0x00, 0x8C, 0x00, 0x29, 0x00, 0x4B, 0x00, 0x25, 0x00, 0x69, 0x00, 0x2A, 0x00, 0x8D, 0x00, 0x28, -/* 0000BFE0 */ 0x00, 0x47, 0x00, 0x3F, 0x00, 0x44, 0x01, 0x2D, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0xBF, 0x00, 0x00, -/* 0000BFF0 */ 0xBF, 0xDC, 0x1A, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xC3, 0x04, 0x48, -/* 0000C000 */ 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x3D, 0x00, 0xFE, 0x69, 0xE7, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 0000C010 */ 0x02, 0xFE, 0x69, 0xE7, 0xF8, 0xF8, 0x41, 0x05, 0x04, 0x06, 0x0D, 0x0D, 0x05, 0x01, 0x01, 0x02, -/* 0000C020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, -/* 0000C030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000C040 */ 0x00, 0x02, 0x00, 0xFE, 0xE7, 0x03, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x48, 0x8F, 0x01, 0x00, 0x00, -/* 0000C050 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x2F, 0x07, 0x02, 0x04, 0x2D, 0x06, 0x06, 0x07, -/* 0000C060 */ 0x15, 0x03, 0x00, 0x06, 0x03, 0x09, 0x28, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 0000C070 */ 0x00, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, -/* 0000C080 */ 0x2F, 0x08, 0x02, 0x04, 0x98, 0x07, 0x07, 0x08, 0x00, 0x00, 0x9D, 0x07, 0x06, 0x04, 0x00, 0x00, -/* 0000C090 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x99, 0xE7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1C, -/* 0000C0A0 */ 0x00, 0x5A, 0x00, 0x2A, 0x00, 0x6D, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 0000C0B0 */ 0xD8, 0x03, 0xFE, 0x9C, 0x04, 0x10, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x3B, 0x00, 0xFE, 0xD8, 0xDD, -/* 0000C0C0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xD8, 0xDD, 0xFE, 0xE3, 0x02, 0xFE, 0xE3, 0x02, -/* 0000C0D0 */ 0x01, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, 0x06, 0x03, 0x05, 0x05, 0x05, 0x05, 0xFF, 0xFF, -/* 0000C0E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, -/* 0000C0F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 0000C100 */ 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xE4, 0x03, 0x02, 0x01, 0xFE, 0x01, 0x03, 0x01, 0x00, -/* 0000C110 */ 0x00, 0x00, 0x00, 0x04, 0xFE, 0x21, 0x01, 0x5B, 0x08, 0xB4, 0x08, 0x08, 0x8F, 0x04, 0x00, 0x00, -/* 0000C120 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000C130 */ 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, -/* 0000C140 */ 0x07, 0x0B, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, -/* 0000C150 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, -/* 0000C160 */ 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x01, 0x00, 0x5D, 0x02, 0x04, 0x01, 0x00, 0xF2, 0x03, 0xFF, -/* 0000C170 */ 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000C180 */ 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, -/* 0000C190 */ 0xF2, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, -/* 0000C1A0 */ 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x62, 0x0B, 0x09, 0x03, 0x0F, 0x2D, 0x00, 0x0B, 0x09, -/* 0000C1B0 */ 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x6D, 0x0B, -/* 0000C1C0 */ 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x03, 0x00, 0x5D, 0x02, 0x04, -/* 0000C1D0 */ 0x03, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x00, 0x00, -/* 0000C1E0 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x04, -/* 0000C1F0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x01, 0x00, 0x6D, 0x0C, 0x0D, 0x04, 0x07, 0x03, -/* 0000C200 */ 0x00, 0x5C, 0x00, 0x0D, 0x2A, 0x0E, 0x05, 0x14, 0x03, 0x00, 0x07, 0x0E, 0x09, 0x06, 0x00, 0x47, -/* 0000C210 */ 0x0E, 0x05, 0x09, 0x03, 0x00, 0x47, 0x0E, 0x07, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x09, 0xF2, 0x03, -/* 0000C220 */ 0x0C, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x04, -/* 0000C230 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x67, 0x02, -/* 0000C240 */ 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x2D, 0x02, 0x00, 0xFE, 0x01, 0xDE, 0x08, 0x05, 0x00, -/* 0000C250 */ 0x00, 0x00, 0x26, 0x00, 0x2F, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x2A, 0x00, 0x7C, 0x00, 0x26, 0x00, -/* 0000C260 */ 0x47, 0x00, 0x15, 0x00, 0x65, 0x00, 0x2A, 0x00, 0xD4, 0x00, 0x5A, 0x00, 0x56, 0x00, 0x00, 0xBF, -/* 0000C270 */ 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x01, 0x03, 0xFE, 0x78, 0x04, 0x10, 0xFF, 0xA1, 0x41, -/* 0000C280 */ 0xE1, 0x00, 0x3A, 0x00, 0xFE, 0x52, 0xD7, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x52, -/* 0000C290 */ 0xD7, 0xFE, 0x2E, 0x06, 0xFE, 0x2E, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x6B, 0x62, 0x04, 0x02, -/* 0000C2A0 */ 0x09, 0x09, 0x08, 0x07, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C2B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C2C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -/* 0000C2D0 */ 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x01, 0x03, 0xFE, 0xDD, 0x01, -/* 0000C2E0 */ 0xAE, 0x0A, 0x5B, 0x0B, 0xB4, 0x0B, 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x4F, 0x0C, 0x4F, 0x0D, 0xA8, -/* 0000C2F0 */ 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x62, 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, -/* 0000C300 */ 0x0F, 0x03, 0x09, 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x04, 0x00, 0x00, 0x47, 0x08, 0x0F, 0x62, 0x0F, -/* 0000C310 */ 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x03, 0x01, 0x00, -/* 0000C320 */ 0x47, 0x09, 0x0F, 0x6B, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, -/* 0000C330 */ 0x00, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000C340 */ 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, -/* 0000C350 */ 0x02, 0x09, 0xC3, 0x03, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x60, 0x01, 0x8F, 0x04, 0x00, 0x00, 0x00, -/* 0000C360 */ 0x31, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x6D, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000C370 */ 0x10, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0C, -/* 0000C380 */ 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x07, 0x02, 0x00, -/* 0000C390 */ 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x0F, 0x0F, 0x02, 0x00, 0x0F, 0x28, 0x00, 0x0F, -/* 0000C3A0 */ 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, -/* 0000C3B0 */ 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5D, 0x01, 0x07, 0x03, 0x00, 0xF2, 0x02, -/* 0000C3C0 */ 0xFF, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000C3D0 */ 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, -/* 0000C3E0 */ 0x0C, 0xF2, 0x02, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, -/* 0000C3F0 */ 0x14, 0x03, 0x00, 0x0D, 0x0F, 0x09, 0x4B, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, -/* 0000C400 */ 0x00, 0x0F, 0x04, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5D, -/* 0000C410 */ 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x0F, 0x0F, 0x05, 0x00, 0x47, 0x0D, 0x0F, 0x8F, 0x04, 0x00, -/* 0000C420 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, -/* 0000C430 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0xF2, 0x03, 0xFF, 0x0F, 0x04, 0x00, 0x00, -/* 0000C440 */ 0x00, 0x06, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x05, 0x00, 0x4B, -/* 0000C450 */ 0x0F, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, -/* 0000C460 */ 0xEE, 0x04, 0xFF, 0x0F, 0x07, 0x00, 0x47, 0x0F, 0x0D, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000C470 */ 0x00, 0x00, 0x10, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x04, 0x00, 0x00, 0x00, -/* 0000C480 */ 0x20, 0x00, 0x00, 0x00, 0x11, 0x07, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, -/* 0000C490 */ 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0C, 0xEE, 0x04, -/* 0000C4A0 */ 0x10, 0x10, 0x08, 0x00, 0x77, 0x10, 0x0F, 0x05, 0x62, 0x0F, 0x0D, 0x06, 0x82, 0x0F, 0x0F, 0x28, -/* 0000C4B0 */ 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, -/* 0000C4C0 */ 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x78, 0x02, 0xFE, -/* 0000C4D0 */ 0x78, 0x02, 0xDB, 0x00, 0xFE, 0xCF, 0xD8, 0x14, 0x0F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0x00, -/* 0000C4E0 */ 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, 0x00, -/* 0000C4F0 */ 0x09, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x20, 0x00, 0x56, 0x00, 0x26, 0x00, 0x38, 0x00, -/* 0000C500 */ 0x22, 0x00, 0x38, 0x00, 0x25, 0x00, 0x9B, 0x00, 0x26, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, -/* 0000C510 */ 0x25, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x58, 0x00, 0x23, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x65, 0x00, -/* 0000C520 */ 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x1F, 0xFC, 0x07, -/* 0000C530 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x6A, 0x04, 0x62, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x39, 0x00, -/* 0000C540 */ 0xFE, 0xCF, 0xD4, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xCF, 0xD4, 0xFE, 0x44, 0x02, -/* 0000C550 */ 0xFE, 0x44, 0x02, 0x03, 0x09, 0x09, 0x0E, 0x07, 0x40, 0x3C, 0x03, 0x02, 0x06, 0x06, 0x03, 0x03, -/* 0000C560 */ 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C570 */ 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C580 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x5A, 0x03, 0x02, 0x00, 0xFE, 0xCB, 0x03, 0x02, -/* 0000C590 */ 0x01, 0xFE, 0xCA, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFE, -/* 0000C5A0 */ 0x2A, 0x01, 0xAE, 0x0B, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x2C, 0x0E, 0x09, 0x15, 0x03, 0x00, 0x0E, -/* 0000C5B0 */ 0x03, 0x09, 0x42, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, -/* 0000C5C0 */ 0xE1, 0x0E, 0x09, 0x0E, 0x00, 0x0F, 0x2D, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 0000C5D0 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x00, 0x6D, 0x0E, 0x0F, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 0000C5E0 */ 0x00, 0x0F, 0x5D, 0x01, 0x04, 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x0E, -/* 0000C5F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0E, -/* 0000C600 */ 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5D, 0x02, 0x02, -/* 0000C610 */ 0x01, 0x00, 0xEE, 0x03, 0x0E, 0x0E, 0x01, 0x00, 0x47, 0x0A, 0x0E, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000C620 */ 0x02, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, -/* 0000C630 */ 0x01, 0x0A, 0x98, 0x0F, 0x0B, 0x07, 0x00, 0x00, 0x5C, 0x02, 0x0F, 0x98, 0x0F, 0x0B, 0x08, 0x01, -/* 0000C640 */ 0x00, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0xFF, 0x0E, 0x02, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, -/* 0000C650 */ 0x00, 0x00, 0x00, 0x0F, 0x04, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, -/* 0000C660 */ 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0C, 0x0E, -/* 0000C670 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0E, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000C680 */ 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x6D, 0x0F, -/* 0000C690 */ 0x10, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x2A, 0x11, 0x07, 0x14, 0x03, 0x00, 0x0C, 0x11, -/* 0000C6A0 */ 0x09, 0x06, 0x00, 0x47, 0x11, 0x07, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0C, 0x5C, 0x01, 0x11, 0x5C, -/* 0000C6B0 */ 0x02, 0x0A, 0xF2, 0x03, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5C, 0x01, 0x0F, 0xEE, -/* 0000C6C0 */ 0x02, 0x00, 0x0E, 0x04, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, -/* 0000C6D0 */ 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x2D, 0x02, 0x00, 0xFE, 0xED, 0xD4, 0x07, 0x07, 0x00, 0x00, 0x00, -/* 0000C6E0 */ 0x23, 0x00, 0x53, 0x00, 0x2A, 0x00, 0x70, 0x00, 0x25, 0x00, 0x3A, 0x00, 0x2F, 0x00, 0x52, 0x00, -/* 0000C6F0 */ 0x26, 0x00, 0x85, 0x00, 0x5A, 0x00, 0x51, 0x00, 0x00, 0xBF, 0xFC, 0x42, 0x06, 0x0F, 0xFD, 0x07, -/* 0000C700 */ 0xFE, 0xDC, 0x03, 0xFE, 0xE2, 0x03, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x38, 0x00, 0xFE, 0x98, -/* 0000C710 */ 0xB8, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x98, 0xB8, 0xFE, 0xD3, 0x1B, 0xFE, 0xD3, -/* 0000C720 */ 0x1B, 0x45, 0x18, 0x23, 0x37, 0x07, 0xFE, 0x9B, 0x01, 0xFE, 0x7B, 0x01, 0x03, 0x04, 0x22, 0x13, -/* 0000C730 */ 0x25, 0x25, 0x25, 0x25, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C740 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x36, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C750 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, -/* 0000C760 */ 0x01, 0x03, 0x08, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x01, -/* 0000C770 */ 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x00, 0xFE, -/* 0000C780 */ 0xCF, 0x03, 0x02, 0x00, 0xFE, 0xDD, 0x03, 0x02, 0x00, 0xFE, 0xDE, 0x03, 0x02, 0x00, 0xFE, 0xD0, -/* 0000C790 */ 0x03, 0x02, 0x00, 0xFE, 0xD1, 0x03, 0x02, 0x00, 0xFE, 0xDF, 0x03, 0x02, 0x01, 0xFE, 0xE0, 0x03, -/* 0000C7A0 */ 0x02, 0x01, 0xFE, 0xE4, 0x02, 0x02, 0x00, 0xFE, 0xD2, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, -/* 0000C7B0 */ 0x15, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xD5, 0x03, 0x02, 0x01, 0xFE, 0xD6, 0x03, 0x02, 0x00, -/* 0000C7C0 */ 0xFE, 0xD7, 0x03, 0x02, 0x01, 0xFE, 0x58, 0x03, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x00, 0xFE, -/* 0000C7D0 */ 0xD3, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, -/* 0000C7E0 */ 0x00, 0x02, 0x00, 0xFE, 0xD4, 0x03, 0x02, 0x00, 0xFE, 0xE2, 0x03, 0xFE, 0x05, 0x07, 0x2C, 0x38, -/* 0000C7F0 */ 0x23, 0x0D, 0x03, 0x00, 0x38, 0x02, 0x09, 0x1C, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000C800 */ 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF6, -/* 0000C810 */ 0x01, 0xFF, 0x38, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x38, 0x01, -/* 0000C820 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, -/* 0000C830 */ 0x39, 0x02, 0x00, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x23, 0x5C, 0x03, 0x03, 0xF6, 0x04, 0x38, 0x38, -/* 0000C840 */ 0x01, 0x00, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x2D, 0x00, 0x62, 0x38, 0x23, 0x01, 0x0F, 0x03, 0x00, -/* 0000C850 */ 0x38, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, -/* 0000C860 */ 0x6D, 0x38, 0x39, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, -/* 0000C870 */ 0xF6, 0x03, 0xFF, 0x38, 0x02, 0x00, 0x77, 0x06, 0x23, 0x03, 0x2C, 0x38, 0x25, 0x14, 0x03, 0x00, -/* 0000C880 */ 0x38, 0x07, 0x09, 0x26, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x38, 0x03, -/* 0000C890 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x39, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x08, 0xF6, -/* 0000C8A0 */ 0x03, 0x38, 0x38, 0x03, 0x00, 0x47, 0x25, 0x38, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000C8B0 */ 0x31, 0x00, 0x00, 0x00, 0x39, 0x04, 0x00, 0x6D, 0x38, 0x39, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000C8C0 */ 0x39, 0x5C, 0x01, 0x25, 0xF6, 0x02, 0x38, 0x38, 0x04, 0x00, 0x47, 0x25, 0x38, 0x8F, 0x03, 0x00, -/* 0000C8D0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000C8E0 */ 0x01, 0x25, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCE, 0x39, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, -/* 0000C8F0 */ 0x39, 0xA1, 0x01, 0x0C, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0C, 0xF6, 0x06, 0x38, 0x38, 0x05, -/* 0000C900 */ 0x00, 0x47, 0x28, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, -/* 0000C910 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCE, -/* 0000C920 */ 0x39, 0x03, 0x01, 0x00, 0xA1, 0x00, 0x0E, 0x39, 0xA1, 0x01, 0x0F, 0x39, 0xA1, 0x02, 0x10, 0x39, -/* 0000C930 */ 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0E, 0xF6, 0x06, 0x38, 0x38, 0x06, 0x00, 0x47, 0x29, 0x38, 0x8F, -/* 0000C940 */ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, -/* 0000C950 */ 0x05, 0x47, 0x2A, 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, 0x09, 0x18, 0x00, 0x8F, 0x02, 0x00, 0x00, -/* 0000C960 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x06, 0x47, 0x2A, -/* 0000C970 */ 0x38, 0x09, 0x1D, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x15, 0x00, 0x8F, 0x02, 0x00, 0x00, -/* 0000C980 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x07, 0x47, 0x2A, -/* 0000C990 */ 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, -/* 0000C9A0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xA8, 0x39, 0x5C, 0x04, -/* 0000C9B0 */ 0x39, 0xA8, 0x39, 0x5C, 0x05, 0x39, 0xF6, 0x06, 0x38, 0x38, 0x07, 0x00, 0x47, 0x2B, 0x38, 0x8F, -/* 0000C9C0 */ 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000C9D0 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0A, 0xCE, 0x39, 0x03, 0x02, 0x00, 0xA1, -/* 0000C9E0 */ 0x00, 0x12, 0x39, 0xA1, 0x01, 0x13, 0x39, 0xA1, 0x02, 0x14, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, -/* 0000C9F0 */ 0x13, 0xF6, 0x06, 0x38, 0x38, 0x08, 0x00, 0x47, 0x2C, 0x38, 0xA8, 0x38, 0x47, 0x2D, 0x38, 0x8F, -/* 0000CA00 */ 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000CA10 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, -/* 0000CA20 */ 0xF6, 0x06, 0x38, 0x38, 0x09, 0x00, 0x47, 0x2E, 0x38, 0xA8, 0x38, 0x47, 0x2F, 0x38, 0xA8, 0x38, -/* 0000CA30 */ 0x47, 0x30, 0x38, 0xA8, 0x38, 0x47, 0x31, 0x38, 0x62, 0x38, 0x25, 0x08, 0x47, 0x32, 0x38, 0x62, -/* 0000CA40 */ 0x38, 0x25, 0x09, 0x47, 0x33, 0x38, 0x2C, 0x38, 0x32, 0x15, 0x0E, 0x00, 0x38, 0x07, 0x09, 0x00, -/* 0000CA50 */ 0x00, 0x2C, 0x38, 0x33, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x54, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 0000CA60 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000CA70 */ 0x25, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0xF6, 0x06, 0x38, -/* 0000CA80 */ 0x38, 0x0A, 0x00, 0x47, 0x32, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, -/* 0000CA90 */ 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x19, 0x5C, 0x03, -/* 0000CAA0 */ 0x32, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x17, 0xF6, 0x06, 0x38, 0x38, 0x0B, 0x00, 0x47, 0x33, 0x38, -/* 0000CAB0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, -/* 0000CAC0 */ 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x1B, 0xA8, 0x39, 0x5C, 0x04, 0x39, -/* 0000CAD0 */ 0x5C, 0x05, 0x06, 0xF6, 0x06, 0x38, 0x38, 0x0C, 0x00, 0x47, 0x34, 0x38, 0x8F, 0x03, 0x00, 0x00, -/* 0000CAE0 */ 0x00, 0x07, 0x00, 0x00, 0x00, 0x38, 0x08, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000CAF0 */ 0x24, 0xF6, 0x02, 0x38, 0x38, 0x0D, 0x00, 0x47, 0x24, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x2F, -/* 0000CB00 */ 0x00, 0x00, 0x00, 0x38, 0x09, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0x5C, -/* 0000CB10 */ 0x02, 0x28, 0xCE, 0x39, 0x01, 0x03, 0x00, 0xA1, 0x00, 0x1C, 0x39, 0x5C, 0x03, 0x39, 0x8F, 0x03, -/* 0000CB20 */ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x39, 0x0A, 0x00, 0x5C, 0x04, 0x39, 0xF6, 0x05, 0x38, -/* 0000CB30 */ 0x38, 0x0E, 0x00, 0x47, 0x35, 0x38, 0x2C, 0x38, 0x2B, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x5C, -/* 0000CB40 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x38, 0x0B, 0x00, 0x07, 0x02, 0x00, -/* 0000CB50 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xF6, 0x02, 0x38, 0x38, 0x0F, 0x00, 0x0F, 0x3D, 0x00, 0x38, -/* 0000CB60 */ 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, -/* 0000CB70 */ 0x38, 0x39, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 0000CB80 */ 0x00, 0x00, 0x3A, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xF6, 0x02, -/* 0000CB90 */ 0x3A, 0x3A, 0x10, 0x00, 0x5C, 0x01, 0x3A, 0xF6, 0x02, 0xFF, 0x38, 0x11, 0x00, 0x14, 0x03, 0x00, -/* 0000CBA0 */ 0x29, 0x10, 0x09, 0x28, 0x01, 0x2C, 0x38, 0x2B, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x1C, 0x00, -/* 0000CBB0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0B, -/* 0000CBC0 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF6, 0x01, 0xFF, 0x38, 0x12, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 0000CBD0 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x38, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, -/* 0000CBE0 */ 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x39, 0x0D, 0x00, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x2B, -/* 0000CBF0 */ 0xF6, 0x03, 0x38, 0x38, 0x13, 0x00, 0x47, 0x2B, 0x38, 0xE5, 0x26, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 0000CC00 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0C, 0x07, 0x02, 0x00, 0x5C, -/* 0000CC10 */ 0x00, 0x39, 0x5C, 0x01, 0x2B, 0xF6, 0x02, 0x38, 0x38, 0x14, 0x00, 0x47, 0x2D, 0x38, 0xE9, 0x09, -/* 0000CC20 */ 0x59, 0x00, 0xE7, 0x26, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x38, 0x0E, -/* 0000CC30 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0xF6, 0x02, 0xFF, 0x38, 0x15, 0x00, -/* 0000CC40 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0A, -/* 0000CC50 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3A, -/* 0000CC60 */ 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xF6, 0x02, 0x3A, 0x3A, 0x16, -/* 0000CC70 */ 0x00, 0x5C, 0x01, 0x3A, 0xF6, 0x02, 0xFF, 0x38, 0x17, 0x00, 0xE9, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000CC80 */ 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, -/* 0000CC90 */ 0x5C, 0x02, 0x1D, 0x5C, 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x2D, 0xF6, 0x06, 0x38, 0x38, -/* 0000CCA0 */ 0x18, 0x00, 0x47, 0x2F, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x39, 0x0F, -/* 0000CCB0 */ 0x00, 0x6D, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2D, 0x5C, 0x02, -/* 0000CCC0 */ 0x2F, 0xF6, 0x03, 0x38, 0x38, 0x19, 0x00, 0x47, 0x31, 0x38, 0x09, 0x89, 0x00, 0xA8, 0x38, 0x47, -/* 0000CCD0 */ 0x2B, 0x38, 0xA8, 0x38, 0x47, 0x2C, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000CCE0 */ 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, -/* 0000CCF0 */ 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x1E, 0xF6, 0x06, 0x38, 0x38, 0x1A, 0x00, 0x47, 0x2F, -/* 0000CD00 */ 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, 0x09, 0x28, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, -/* 0000CD10 */ 0x00, 0x00, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, -/* 0000CD20 */ 0x01, 0x2F, 0x5C, 0x02, 0x1E, 0xF6, 0x03, 0x38, 0x38, 0x1B, 0x00, 0x47, 0x31, 0x38, 0x09, 0x25, -/* 0000CD30 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, -/* 0000CD40 */ 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, 0x20, 0xF6, 0x03, 0x38, -/* 0000CD50 */ 0x38, 0x1C, 0x00, 0x47, 0x31, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, -/* 0000CD60 */ 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x21, 0x5C, 0x03, -/* 0000CD70 */ 0x2F, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x31, 0xF6, 0x06, 0x38, 0x38, 0x1D, 0x00, 0x47, 0x30, 0x38, -/* 0000CD80 */ 0x77, 0x28, 0x23, 0x0E, 0x62, 0x38, 0x35, 0x0F, 0x77, 0x38, 0x23, 0x10, 0x77, 0x29, 0x23, 0x11, -/* 0000CD90 */ 0xA8, 0x38, 0x15, 0x03, 0x00, 0x2B, 0x38, 0x09, 0x04, 0x00, 0x77, 0x2B, 0x23, 0x12, 0xA8, 0x38, -/* 0000CDA0 */ 0x15, 0x03, 0x00, 0x2C, 0x38, 0x09, 0x7A, 0x00, 0x77, 0x2C, 0x23, 0x13, 0x8F, 0x02, 0x00, 0x00, -/* 0000CDB0 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x14, 0x77, 0x38, -/* 0000CDC0 */ 0x23, 0x15, 0x14, 0x03, 0x00, 0x2C, 0x13, 0x09, 0x19, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x04, -/* 0000CDD0 */ 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x16, 0x77, 0x38, 0x23, 0x15, -/* 0000CDE0 */ 0x09, 0x3F, 0x00, 0x14, 0x03, 0x00, 0x2C, 0x12, 0x09, 0x19, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000CDF0 */ 0x04, 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x17, 0x77, 0x38, 0x23, -/* 0000CE00 */ 0x15, 0x09, 0x1E, 0x00, 0x14, 0x03, 0x00, 0x2C, 0x14, 0x09, 0x16, 0x00, 0x8F, 0x02, 0x00, 0x00, -/* 0000CE10 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x18, 0x77, 0x38, -/* 0000CE20 */ 0x23, 0x15, 0x77, 0x2E, 0x23, 0x19, 0x77, 0x2F, 0x23, 0x1A, 0x77, 0x30, 0x23, 0x1B, 0xA8, 0x38, -/* 0000CE30 */ 0x15, 0x03, 0x00, 0x33, 0x38, 0x09, 0x08, 0x00, 0x77, 0x32, 0x23, 0x1C, 0x77, 0x33, 0x23, 0x1D, -/* 0000CE40 */ 0x77, 0x2A, 0x23, 0x1E, 0x77, 0x34, 0x23, 0x1F, 0xE5, 0x21, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000CE50 */ 0x3D, 0x00, 0x00, 0x00, 0x38, 0x11, 0x00, 0x4B, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000CE60 */ 0x01, 0x23, 0xF6, 0x02, 0xFF, 0x38, 0x1E, 0x00, 0xE9, 0x09, 0x3B, 0x00, 0xE7, 0x27, 0x06, 0x8F, -/* 0000CE70 */ 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x38, 0x0E, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000CE80 */ 0x04, 0x5C, 0x01, 0x27, 0xF6, 0x02, 0xFF, 0x38, 0x1F, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 0000CE90 */ 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x20, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, -/* 0000CEA0 */ 0xF6, 0x01, 0xFF, 0x38, 0x20, 0x00, 0xE9, 0x62, 0x38, 0x23, 0x21, 0x0F, 0x07, 0x00, 0x38, 0x09, -/* 0000CEB0 */ 0x00, 0x00, 0x77, 0x22, 0x23, 0x22, 0x47, 0x38, 0x23, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000CEC0 */ 0x00, 0x00, 0x39, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000CED0 */ 0x24, 0x00, 0x00, 0x00, 0x3A, 0x12, 0x00, 0x5C, 0x01, 0x3A, 0x62, 0x3A, 0x23, 0x21, 0x5C, 0x02, -/* 0000CEE0 */ 0x3A, 0xF6, 0x03, 0x39, 0x39, 0x21, 0x00, 0x77, 0x39, 0x38, 0x23, 0x77, 0x06, 0x23, 0x24, 0xA8, -/* 0000CEF0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, -/* 0000CF00 */ 0x02, 0xFE, 0x52, 0x03, 0xFE, 0xC3, 0x03, 0xFE, 0xC4, 0x03, 0xFE, 0xC5, 0x03, 0xFE, 0x0E, 0x02, -/* 0000CF10 */ 0xFE, 0x0F, 0x02, 0xFE, 0x68, 0x02, 0xFE, 0x69, 0x02, 0xFE, 0x30, 0x02, 0xFE, 0x1E, 0x01, 0xFE, -/* 0000CF20 */ 0xE3, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x15, -/* 0000CF30 */ 0x02, 0xFE, 0xC2, 0x03, 0xFE, 0x16, 0x02, 0xFE, 0xC7, 0x03, 0xFE, 0xC8, 0x03, 0xFE, 0xC9, 0x03, -/* 0000CF40 */ 0xFE, 0x0B, 0x02, 0xFE, 0x09, 0x02, 0xFE, 0x0A, 0x02, 0xFE, 0x0C, 0x02, 0xFE, 0x0D, 0x02, 0xFE, -/* 0000CF50 */ 0x13, 0x02, 0xFE, 0x11, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x12, -/* 0000CF60 */ 0x02, 0xFE, 0x6B, 0x02, 0x00, 0xFE, 0xED, 0xB8, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, -/* 0000CF70 */ 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x9B, 0x00, 0x22, 0x00, 0x6D, 0x00, 0x04, 0x00, 0x61, -/* 0000CF80 */ 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x26, 0x00, 0x4F, 0x00, 0x22, 0x00, 0x49, 0x00, 0x37, 0x00, 0x71, -/* 0000CF90 */ 0x00, 0x3B, 0x00, 0x73, 0x00, 0x15, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x18, 0x00, 0x43, -/* 0000CFA0 */ 0x00, 0x08, 0x00, 0x30, 0x00, 0x15, 0x00, 0x50, 0x00, 0x2E, 0x00, 0x5F, 0x00, 0x3B, 0x00, 0x7D, -/* 0000CFB0 */ 0x00, 0x05, 0x00, 0x31, 0x00, 0x2A, 0x00, 0x67, 0x00, 0x05, 0x00, 0x37, 0x00, 0x05, 0x00, 0x37, -/* 0000CFC0 */ 0x00, 0x05, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x51, 0x00, 0x07, 0x00, 0x52, 0x00, 0x16, 0x00, 0x7E, -/* 0000CFD0 */ 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x2A, 0x00, 0x96, 0x00, 0x2C, 0x00, 0x9A, 0x00, 0x1E, 0x00, 0x41, -/* 0000CFE0 */ 0x00, 0x3C, 0x00, 0xA2, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x3A, 0x00, 0x58, 0x00, 0x08, 0x00, 0x30, -/* 0000CFF0 */ 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x1C, 0x00, 0x4F, 0x00, 0x30, 0x00, 0x74, 0x00, 0x28, 0x00, 0x4A, -/* 0000D000 */ 0x00, 0x01, 0x00, 0x24, 0x00, 0x1B, 0x00, 0x2E, 0x00, 0x3B, 0x00, 0x5F, 0x00, 0x2A, 0x00, 0x76, -/* 0000D010 */ 0x00, 0x28, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x2A, 0x00, 0x05, 0x00, 0x31, 0x00, 0x2A, 0x00, 0x69, -/* 0000D020 */ 0x00, 0x08, 0x00, 0x33, 0x00, 0x28, 0x00, 0x78, 0x00, 0x25, 0x00, 0x7B, 0x00, 0x2A, 0x00, 0xC6, -/* 0000D030 */ 0x00, 0x04, 0x00, 0x38, 0x00, 0x08, 0x00, 0x43, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x0A, 0x00, 0x32, -/* 0000D040 */ 0x00, 0x04, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x04, 0x00, 0x46, 0x00, 0x16, 0x00, 0x5F, -/* 0000D050 */ 0x00, 0x08, 0x00, 0x3C, 0x00, 0x19, 0x00, 0x65, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x19, 0x00, 0x63, -/* 0000D060 */ 0x00, 0x08, 0x00, 0x3A, 0x00, 0x16, 0x00, 0x81, 0x00, 0x04, 0x00, 0x4C, 0x00, 0x04, 0x00, 0x4E, -/* 0000D070 */ 0x00, 0x04, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x04, 0x00, 0x58, 0x00, 0x04, 0x00, 0x67, -/* 0000D080 */ 0x00, 0x04, 0x00, 0x40, 0x00, 0x07, 0x00, 0xA9, 0x00, 0x23, 0x00, 0x43, 0x00, 0x01, 0x00, 0x20, -/* 0000D090 */ 0x00, 0x1B, 0x00, 0x6B, 0x01, 0x1D, 0x00, 0x4A, 0x00, 0x0B, 0x00, 0x4B, 0x00, 0x04, 0x00, 0x70, -/* 0000D0A0 */ 0x00, 0x35, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x00, 0x3F, 0xFC, 0x22, 0x04, 0x4F, 0xFD, -/* 0000D0B0 */ 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE5, 0x02, 0x14, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x2F, -/* 0000D0C0 */ 0x00, 0xFE, 0x7F, 0x83, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x7F, 0x83, 0xFE, -/* 0000D0D0 */ 0x7D, 0x30, 0xFE, 0x7D, 0x30, 0x0B, 0x17, 0x1B, 0x09, 0x9A, 0x9A, 0x01, 0x0C, 0x09, 0x07, 0x07, -/* 0000D0E0 */ 0x07, 0x07, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D0F0 */ 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000D100 */ 0x00, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0x9C, 0x03, 0x02, 0x00, 0xFE, 0x9D, 0x03, -/* 0000D110 */ 0x04, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x9E, 0x03, 0x02, 0x00, 0xFE, 0x9F, 0x03, -/* 0000D120 */ 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x08, -/* 0000D130 */ 0x02, 0x01, 0xFE, 0x00, 0x03, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x09, 0x02, 0x01, 0xFE, 0xFF, -/* 0000D140 */ 0x02, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, 0x01, 0xFE, 0xA3, 0x03, -/* 0000D150 */ 0x02, 0x01, 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xA5, 0x03, 0xFE, 0x8C, 0x03, 0xA8, 0x17, 0xA8, -/* 0000D160 */ 0x18, 0xA8, 0x19, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x14, -/* 0000D170 */ 0x17, 0x00, 0x1D, 0x02, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, -/* 0000D180 */ 0x1D, 0x00, 0x00, 0x14, 0x03, 0x00, 0x1D, 0x03, 0x09, 0x55, 0x03, 0xDE, 0x00, 0x03, 0x01, 0xB8, -/* 0000D190 */ 0x1D, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x17, 0x1D, 0x95, 0x00, 0x00, 0x00, 0x00, -/* 0000D1A0 */ 0x02, 0x00, 0x00, 0x00, 0x17, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x01, -/* 0000D1B0 */ 0x00, 0x6D, 0x1D, 0x1E, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1E, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000D1C0 */ 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x04, -/* 0000D1D0 */ 0x01, 0x00, 0xB8, 0x21, 0x00, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x21, 0x5C, 0x02, -/* 0000D1E0 */ 0x20, 0xEE, 0x03, 0x1F, 0x1F, 0x01, 0x00, 0x5C, 0x01, 0x1F, 0x5D, 0x02, 0x06, 0x00, 0x00, 0xF2, -/* 0000D1F0 */ 0x03, 0xFF, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, -/* 0000D200 */ 0x00, 0x00, 0x1D, 0x00, 0x00, 0x14, 0x03, 0x00, 0x1D, 0x02, 0x09, 0xD3, 0x02, 0xDE, 0x01, 0x04, -/* 0000D210 */ 0x02, 0xB8, 0x1D, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x1D, 0x1D, 0x01, 0x50, 0x01, 0x02, 0x00, -/* 0000D220 */ 0x00, 0x00, 0x18, 0x1D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x01, 0x50, -/* 0000D230 */ 0x01, 0x03, 0x00, 0x00, 0x00, 0x19, 0x1D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000D240 */ 0x19, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1D, 0x02, 0x00, 0x07, 0x03, 0x00, -/* 0000D250 */ 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x07, 0x02, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000D260 */ 0x00, 0x1E, 0x03, 0x00, 0x5C, 0x02, 0x1E, 0xEE, 0x03, 0xFF, 0x1D, 0x02, 0x00, 0x8F, 0x01, 0x00, -/* 0000D270 */ 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1D, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5D, -/* 0000D280 */ 0x01, 0x08, 0x03, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x04, 0x00, -/* 0000D290 */ 0x5C, 0x02, 0x1E, 0xEE, 0x03, 0xFF, 0x1D, 0x03, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, -/* 0000D2A0 */ 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x00, 0x00, 0x00, -/* 0000D2B0 */ 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x5C, 0x01, 0x1E, 0x5D, 0x02, 0x09, 0x04, 0x00, 0xCC, -/* 0000D2C0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 0000D2D0 */ 0x00, 0x46, 0x00, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x4B, 0x1F, 0x7B, 0x1F, 0x1E, 0x01, 0x7B, 0x0C, -/* 0000D2E0 */ 0x1E, 0x02, 0x7B, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, 0x04, 0x00, 0x8F, -/* 0000D2F0 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000D300 */ 0x05, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x5C, 0x01, 0x1E, -/* 0000D310 */ 0x5D, 0x02, 0x0F, 0x05, 0x00, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000D320 */ 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x03, 0x00, 0x07, 0x01, -/* 0000D330 */ 0x00, 0xC3, 0x01, 0x1F, 0x1F, 0x06, 0x00, 0x7B, 0x1F, 0x1E, 0x01, 0x7B, 0x10, 0x1E, 0x02, 0x7B, -/* 0000D340 */ 0x10, 0x1E, 0x04, 0x7B, 0x10, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, 0x05, 0x00, -/* 0000D350 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 0000D360 */ 0x00, 0x05, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x62, 0x1E, -/* 0000D370 */ 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1E, 0x08, -/* 0000D380 */ 0x00, 0x62, 0x1E, 0x1E, 0x05, 0x5C, 0x02, 0x1E, 0xEE, 0x03, 0xFF, 0x1D, 0x07, 0x00, 0x8F, 0x01, -/* 0000D390 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, -/* 0000D3A0 */ 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x62, 0x1E, 0x1E, 0x05, -/* 0000D3B0 */ 0x5C, 0x01, 0x1E, 0x5D, 0x02, 0x12, 0x08, 0x00, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000D3C0 */ 0x00, 0x1E, 0x00, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x03, -/* 0000D3D0 */ 0x00, 0x7B, 0x1F, 0x1E, 0x01, 0x7B, 0x0C, 0x1E, 0x02, 0x7B, 0x10, 0x1E, 0x04, 0x7B, 0x0C, 0x1E, -/* 0000D3E0 */ 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, 0x08, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, -/* 0000D3F0 */ 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x00, 0x00, -/* 0000D400 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x62, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x5D, -/* 0000D410 */ 0x02, 0x13, 0x09, 0x00, 0xCC, 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, -/* 0000D420 */ 0x00, 0xB8, 0x20, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x20, 0x20, 0x01, 0x50, 0x01, 0x04, 0x00, -/* 0000D430 */ 0x00, 0x00, 0x1F, 0x20, 0x7B, 0x1F, 0x1E, 0x01, 0x01, 0x64, 0x01, 0x1F, 0x1E, 0x7B, 0x0C, 0x1E, -/* 0000D440 */ 0x02, 0x7B, 0x10, 0x1E, 0x04, 0x7B, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, -/* 0000D450 */ 0x09, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, -/* 0000D460 */ 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, -/* 0000D470 */ 0x62, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x5D, 0x02, 0x14, 0x0A, 0x00, 0xCC, 0x5C, 0x00, 0x00, -/* 0000D480 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, -/* 0000D490 */ 0x00, 0x00, 0x1F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x16, 0x0B, 0x00, -/* 0000D4A0 */ 0xB8, 0x21, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x21, 0x21, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, -/* 0000D4B0 */ 0x00, 0x20, 0x21, 0x5C, 0x02, 0x20, 0xEE, 0x03, 0x1F, 0x1F, 0x0B, 0x00, 0x7B, 0x1F, 0x1E, 0x06, -/* 0000D4C0 */ 0x7B, 0x10, 0x1E, 0x04, 0x7B, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, 0x0A, -/* 0000D4D0 */ 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x07, 0x00, -/* 0000D4E0 */ 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x05, 0x70, 0x00, 0x5C, 0x00, 0x00, 0x00, -/* 0000D4F0 */ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, -/* 0000D500 */ 0xB2, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000D510 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000D520 */ 0x2C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, -/* 0000D530 */ 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, -/* 0000D540 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 0000D550 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, -/* 0000D560 */ 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000D570 */ 0x00, 0xFE, 0x32, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, -/* 0000D580 */ 0xFE, 0x45, 0x01, 0xFE, 0xB5, 0x01, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xA6, 0x03, 0x02, 0x02, 0x00, -/* 0000D590 */ 0xFE, 0x19, 0x02, 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x96, 0x83, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x42, -/* 0000D5A0 */ 0x00, 0x14, 0x17, 0x54, 0x00, 0xF9, 0x03, 0x48, 0x00, 0x8A, 0x06, 0x2C, 0x00, 0x43, 0x03, 0x2C, -/* 0000D5B0 */ 0x00, 0x50, 0x00, 0x56, 0x00, 0x93, 0x00, 0x61, 0x00, 0x91, 0x00, 0x3E, 0x00, 0x45, 0x00, 0x5C, -/* 0000D5C0 */ 0x00, 0x96, 0x00, 0x68, 0x00, 0xA7, 0x05, 0x7F, 0x00, 0x03, 0x03, 0x0F, 0x00, 0x7C, 0x00, 0x07, -/* 0000D5D0 */ 0x00, 0x16, 0x00, 0x00, 0xE8, 0xDF, 0x00, 0x00, 0xC6, 0xDD, 0x00, 0x00, 0x14, 0xDB, 0x00, 0x00, -/* 0000D5E0 */ 0x27, 0xD9, 0x00, 0x00, 0x2F, 0xD7, 0x00, 0x00, 0xEC, 0xD5, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, -/* 0000D5F0 */ 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0x03, 0x3A, 0xFF, 0xA0, 0x41, 0xD1, -/* 0000D600 */ 0x00, 0x36, 0x00, 0xFE, 0xD6, 0xB0, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD6, 0xB0, -/* 0000D610 */ 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x03, 0x03, 0x01, -/* 0000D620 */ 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D630 */ 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D640 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC0, 0x03, 0x02, -/* 0000D650 */ 0x01, 0xFE, 0xFD, 0x02, 0xAA, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, -/* 0000D660 */ 0x08, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000D670 */ 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, -/* 0000D680 */ 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, -/* 0000D690 */ 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, -/* 0000D6A0 */ 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, -/* 0000D6B0 */ 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, -/* 0000D6C0 */ 0x08, 0x06, 0x02, 0x0F, 0x2D, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 0000D6D0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, -/* 0000D6E0 */ 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, -/* 0000D6F0 */ 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000D700 */ 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x77, 0x02, 0x00, 0xFE, 0xFC, -/* 0000D710 */ 0xB0, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x2A, 0x00, 0x7D, 0x00, 0x26, 0x00, -/* 0000D720 */ 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x2A, 0x00, 0x7D, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, -/* 0000D730 */ 0xFC, 0x22, 0x04, 0x4F, 0xFC, 0x07, 0xFE, 0xA2, 0x03, 0xFE, 0xA4, 0x03, 0x1B, 0xFF, 0xA0, 0x41, -/* 0000D740 */ 0xC3, 0x00, 0x35, 0x00, 0xFE, 0x18, 0xAB, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x18, -/* 0000D750 */ 0xAB, 0xFE, 0xF1, 0x04, 0xFE, 0xF1, 0x04, 0x01, 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, 0x03, 0x03, -/* 0000D760 */ 0x01, 0x11, 0x11, 0x11, 0x11, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D770 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D780 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC1, -/* 0000D790 */ 0x03, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0xA8, 0x03, -/* 0000D7A0 */ 0x02, 0x01, 0xFE, 0xAB, 0x03, 0x02, 0x01, 0xFE, 0xB0, 0x03, 0x02, 0x01, 0xFE, 0xBA, 0x03, 0x02, -/* 0000D7B0 */ 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0xB1, 0x03, 0x03, 0xEB, 0x5B, 0x0D, 0xB4, 0x0D, 0x0D, -/* 0000D7C0 */ 0x2C, 0x10, 0x0D, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000D7D0 */ 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000D7E0 */ 0x11, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, -/* 0000D7F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 0000D800 */ 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0xF2, 0x02, -/* 0000D810 */ 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0E, 0x10, 0xA8, 0x10, 0x14, 0x0E, 0x00, -/* 0000D820 */ 0x0E, 0x10, 0x09, 0x00, 0x00, 0x62, 0x10, 0x0E, 0x02, 0x0F, 0x2D, 0x00, 0x10, 0x09, 0x00, 0x00, -/* 0000D830 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, -/* 0000D840 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, -/* 0000D850 */ 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000D860 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x10, 0x0E, 0x03, 0x7B, 0x10, 0x00, 0x04, 0x62, -/* 0000D870 */ 0x10, 0x0E, 0x05, 0x7B, 0x10, 0x00, 0x06, 0x62, 0x10, 0x0E, 0x07, 0x7B, 0x10, 0x00, 0x08, 0x62, -/* 0000D880 */ 0x10, 0x0E, 0x09, 0x7B, 0x10, 0x00, 0x0A, 0x62, 0x10, 0x0E, 0x0B, 0x7B, 0x10, 0x00, 0x0C, 0x62, -/* 0000D890 */ 0x10, 0x0E, 0x0D, 0x7B, 0x10, 0x00, 0x0E, 0x62, 0x10, 0x0E, 0x0F, 0x7B, 0x10, 0x00, 0x10, 0x09, -/* 0000D8A0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, -/* 0000D8B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0xA8, 0x03, 0x00, 0x00, 0x20, 0x02, 0x00, -/* 0000D8C0 */ 0x00, 0x22, 0x02, 0x00, 0x00, 0xBA, 0x03, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0xB1, 0x03, 0x00, -/* 0000D8D0 */ 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x1F, -/* 0000D8E0 */ 0x02, 0xFE, 0x70, 0x02, 0xFE, 0xA8, 0x03, 0xFE, 0x71, 0x02, 0xFE, 0x20, 0x02, 0xFE, 0x72, 0x02, -/* 0000D8F0 */ 0xFE, 0x22, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0xBA, 0x03, 0xFE, 0x74, 0x02, 0xFE, 0x21, 0x02, 0xFE, -/* 0000D900 */ 0x73, 0x02, 0xFE, 0xB1, 0x03, 0x00, 0xFE, 0x4D, 0xAB, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 0000D910 */ 0x3C, 0x00, 0x2A, 0x00, 0x84, 0x00, 0x26, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x2A, 0x00, -/* 0000D920 */ 0x85, 0x00, 0x4A, 0x00, 0xC6, 0x02, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xA3, -/* 0000D930 */ 0x03, 0xFE, 0x8B, 0x03, 0x10, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x34, 0x00, 0xFE, 0x6C, 0xA5, 0xFF, -/* 0000D940 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x6C, 0xA5, 0xFE, 0xF3, 0x02, 0xFE, 0xF3, 0x02, 0x01, -/* 0000D950 */ 0x09, 0x06, 0x0B, 0x0B, 0x44, 0x41, 0x03, 0x07, 0x03, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, -/* 0000D960 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, -/* 0000D970 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, -/* 0000D980 */ 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC0, 0x03, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x04, 0xFE, 0x3F, -/* 0000D990 */ 0x01, 0x5B, 0x08, 0xB4, 0x08, 0x08, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x2A, -/* 0000D9A0 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, -/* 0000D9B0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, -/* 0000D9C0 */ 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000D9D0 */ 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000D9E0 */ 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x09, -/* 0000D9F0 */ 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x62, 0x0B, 0x09, 0x02, 0x0F, -/* 0000DA00 */ 0x2D, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, -/* 0000DA10 */ 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, -/* 0000DA20 */ 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000DA30 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000DA40 */ 0x00, 0x05, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x47, 0x06, 0x0B, 0x8F, 0x03, -/* 0000DA50 */ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, -/* 0000DA60 */ 0x5C, 0x01, 0x07, 0xEE, 0x02, 0x0B, 0x0B, 0x04, 0x00, 0x47, 0x07, 0x0B, 0x8F, 0x03, 0x00, 0x00, -/* 0000DA70 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, -/* 0000DA80 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x6D, 0x0C, 0x0D, 0x03, 0x07, 0x07, -/* 0000DA90 */ 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x07, 0x62, 0x0E, 0x09, 0x04, 0x5C, 0x03, -/* 0000DAA0 */ 0x0E, 0x62, 0x0E, 0x09, 0x05, 0x5C, 0x04, 0x0E, 0x62, 0x0E, 0x09, 0x06, 0x5C, 0x05, 0x0E, 0x62, -/* 0000DAB0 */ 0x0E, 0x09, 0x07, 0x5C, 0x06, 0x0E, 0xF2, 0x07, 0x0C, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, -/* 0000DAC0 */ 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 0000DAD0 */ 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x6F, -/* 0000DAE0 */ 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x74, 0x02, 0x00, 0xFE, 0x99, 0xA5, 0x09, 0x05, -/* 0000DAF0 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x2A, 0x00, 0x75, 0x00, 0x26, 0x00, 0x47, 0x00, 0x15, -/* 0000DB00 */ 0x00, 0x61, 0x00, 0x2A, 0x00, 0x75, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x62, -/* 0000DB10 */ 0x00, 0xB4, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xFD, 0x02, 0xFE, 0x68, -/* 0000DB20 */ 0x03, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x33, 0x00, 0xFE, 0xCF, 0x9E, 0xFF, 0x00, 0x10, 0x01, -/* 0000DB30 */ 0x00, 0x01, 0x01, 0xFE, 0xCF, 0x9E, 0xFE, 0x4D, 0x06, 0xFE, 0x4D, 0x06, 0x03, 0x0A, 0x08, 0x0F, -/* 0000DB40 */ 0x05, 0x67, 0x5E, 0x03, 0x02, 0x09, 0x09, 0x08, 0x07, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DB50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DB60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, -/* 0000DB70 */ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, -/* 0000DB80 */ 0xFD, 0x02, 0xFE, 0xD5, 0x01, 0xAE, 0x0A, 0x5B, 0x0B, 0xB4, 0x0B, 0x0B, 0xA8, 0x0F, 0x47, 0x08, -/* 0000DB90 */ 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x62, 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x03, 0x09, -/* 0000DBA0 */ 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x04, 0x00, 0x00, 0x47, 0x08, 0x0F, 0x62, 0x0F, 0x0A, 0x00, 0x10, -/* 0000DBB0 */ 0x03, 0x00, 0x0F, 0x05, 0x09, 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x03, 0x01, 0x00, 0x47, 0x09, 0x0F, -/* 0000DBC0 */ 0x6B, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, 0xA8, 0x0F, -/* 0000DBD0 */ 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000DBE0 */ 0x00, 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC3, -/* 0000DBF0 */ 0x03, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x60, 0x01, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, -/* 0000DC00 */ 0x00, 0x10, 0x01, 0x00, 0x6D, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, -/* 0000DC10 */ 0x0B, 0xF2, 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0C, 0x0F, 0x8F, 0x03, -/* 0000DC20 */ 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, -/* 0000DC30 */ 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x0F, 0x0F, 0x02, 0x00, 0x0F, 0x28, 0x00, 0x0F, 0x09, 0x00, 0x00, -/* 0000DC40 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x02, -/* 0000DC50 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5D, 0x01, 0x07, 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0F, 0x02, -/* 0000DC60 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, -/* 0000DC70 */ 0x00, 0x6D, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0xF2, 0x02, -/* 0000DC80 */ 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, -/* 0000DC90 */ 0x0D, 0x0F, 0x09, 0x4B, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x04, -/* 0000DCA0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5D, 0x02, 0x02, 0x05, -/* 0000DCB0 */ 0x00, 0xEE, 0x03, 0x0F, 0x0F, 0x05, 0x00, 0x47, 0x0D, 0x0F, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 0000DCC0 */ 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, -/* 0000DCD0 */ 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0xF2, 0x03, 0xFF, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, -/* 0000DCE0 */ 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x05, 0x00, 0x4B, 0x0F, 0x07, 0x04, -/* 0000DCF0 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, -/* 0000DD00 */ 0x0F, 0x07, 0x00, 0x47, 0x0F, 0x0D, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, -/* 0000DD10 */ 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, -/* 0000DD20 */ 0x00, 0x11, 0x07, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000DD30 */ 0x11, 0x08, 0x00, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0C, 0xEE, 0x04, 0x10, 0x10, 0x08, -/* 0000DD40 */ 0x00, 0x77, 0x10, 0x0F, 0x05, 0x62, 0x0F, 0x0D, 0x06, 0x82, 0x0F, 0x0F, 0x28, 0x01, 0xFA, 0x0F, -/* 0000DD50 */ 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x52, 0x03, -/* 0000DD60 */ 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x77, 0x02, 0xFE, 0x77, 0x02, 0xDB, -/* 0000DD70 */ 0x00, 0xFE, 0x48, 0xA0, 0x14, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x05, 0x00, 0x2D, -/* 0000DD80 */ 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2D, -/* 0000DD90 */ 0x00, 0x18, 0x00, 0x43, 0x00, 0x20, 0x00, 0x52, 0x00, 0x26, 0x00, 0x37, 0x00, 0x22, 0x00, 0x38, -/* 0000DDA0 */ 0x00, 0x25, 0x00, 0x97, 0x00, 0x26, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x25, 0x00, 0x3F, -/* 0000DDB0 */ 0x00, 0x26, 0x00, 0x58, 0x00, 0x23, 0x00, 0x76, 0x00, 0x42, 0x00, 0x68, 0x00, 0x0B, 0x00, 0x3D, -/* 0000DDC0 */ 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, -/* 0000DDD0 */ 0xFF, 0xFF, 0xFE, 0x56, 0x03, 0x61, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x32, 0x00, 0xFE, 0xFF, 0x9A, -/* 0000DDE0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xFF, 0x9A, 0xFE, 0x90, 0x03, 0xFE, 0x90, 0x03, -/* 0000DDF0 */ 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4E, 0x4A, 0x02, 0x03, 0x08, 0x05, 0x07, 0x07, 0x07, 0x07, 0xFF, -/* 0000DE00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, -/* 0000DE10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000DE20 */ 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x9D, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, -/* 0000DE30 */ 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x66, 0x01, 0xAE, 0x08, 0x5B, 0x0A, 0xB4, 0x0A, 0x0A, -/* 0000DE40 */ 0x98, 0x0E, 0x08, 0x03, 0x00, 0x00, 0x47, 0x09, 0x0E, 0xA8, 0x0E, 0x14, 0x0B, 0x00, 0x0A, 0x0E, -/* 0000DE50 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x28, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000DE60 */ 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000DE70 */ 0x0F, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xF2, 0x02, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000DE80 */ 0x09, 0x28, 0x00, 0x14, 0x03, 0x00, 0x09, 0x02, 0x09, 0x20, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000DE90 */ 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 0000DEA0 */ 0x0F, 0xF2, 0x01, 0xFF, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000DEB0 */ 0x11, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0A, -/* 0000DEC0 */ 0xEE, 0x02, 0x0E, 0x0E, 0x02, 0x00, 0x47, 0x0B, 0x0E, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 0000DED0 */ 0x00, 0x00, 0x0E, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0xEE, 0x02, -/* 0000DEE0 */ 0x0E, 0x0E, 0x03, 0x00, 0x47, 0x09, 0x0E, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000DEF0 */ 0x0E, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5D, 0x02, -/* 0000DF00 */ 0x02, 0x04, 0x00, 0xEE, 0x03, 0x0E, 0x0E, 0x04, 0x00, 0x47, 0x0C, 0x0E, 0x8F, 0x01, 0x00, 0x00, -/* 0000DF10 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, -/* 0000DF20 */ 0x5C, 0x01, 0x0C, 0x98, 0x0F, 0x08, 0x06, 0x01, 0x00, 0x5C, 0x02, 0x0F, 0x98, 0x0F, 0x08, 0x07, -/* 0000DF30 */ 0x02, 0x00, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0xFF, 0x0E, 0x05, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000DF40 */ 0x10, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x02, 0x00, -/* 0000DF50 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x07, 0x00, -/* 0000DF60 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x5C, 0x02, 0x09, 0x62, 0x11, 0x0C, 0x03, 0x5C, 0x03, 0x11, -/* 0000DF70 */ 0x62, 0x11, 0x0C, 0x04, 0x5C, 0x04, 0x11, 0x62, 0x11, 0x0C, 0x05, 0x5C, 0x05, 0x11, 0x62, 0x11, -/* 0000DF80 */ 0x0C, 0x06, 0x5C, 0x06, 0x11, 0xF2, 0x07, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5C, -/* 0000DF90 */ 0x01, 0x0F, 0xEE, 0x02, 0x00, 0x0E, 0x06, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000DFA0 */ 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x55, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x71, 0x02, -/* 0000DFB0 */ 0xFE, 0x72, 0x02, 0xFE, 0x74, 0x02, 0x00, 0xFE, 0x1D, 0x9B, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x09, -/* 0000DFC0 */ 0x00, 0x29, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x6D, 0x00, 0x08, 0x00, 0x29, 0x00, 0x20, -/* 0000DFD0 */ 0x00, 0xE2, 0x00, 0x1E, 0x00, 0x2C, 0x00, 0x1E, 0x00, 0x29, 0x00, 0x25, 0x00, 0x3A, 0x00, 0x2F, -/* 0000DFE0 */ 0x00, 0x4D, 0x00, 0x62, 0x00, 0xB5, 0x00, 0x00, 0xBF, 0xFD, 0x4A, 0x06, 0x0F, 0xFD, 0x0F, 0xFE, -/* 0000DFF0 */ 0xA6, 0x03, 0xFE, 0xE9, 0x02, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x30, 0x00, 0xFE, 0xD7, 0x83, -/* 0000E000 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xD7, 0x83, 0xFE, 0xC5, 0x16, 0xFE, 0xC5, -/* 0000E010 */ 0x16, 0x44, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, 0x0A, 0x01, 0xF9, 0x02, 0x02, 0x05, 0x12, 0x10, -/* 0000E020 */ 0x13, 0x13, 0x13, 0x13, 0x01, 0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x34, 0xFF, 0xFF, 0xFF, -/* 0000E030 */ 0xFF, 0xFF, 0x35, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, -/* 0000E040 */ 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x08, 0x02, 0x01, 0xFE, 0x5E, 0x03, -/* 0000E050 */ 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, -/* 0000E060 */ 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, 0xFE, 0xA8, 0x03, 0x02, 0x01, 0xFE, 0xA9, 0x03, 0x02, -/* 0000E070 */ 0x01, 0xFE, 0xAA, 0x03, 0x02, 0x01, 0xFE, 0xAB, 0x03, 0x02, 0x00, 0xFE, 0xAC, 0x03, 0x02, 0x00, -/* 0000E080 */ 0xFE, 0xAD, 0x03, 0x02, 0x00, 0xFE, 0xAE, 0x03, 0x02, 0x00, 0xFE, 0xAF, 0x03, 0x02, 0x01, 0xFE, -/* 0000E090 */ 0xB0, 0x03, 0x02, 0x01, 0xFE, 0x58, 0x03, 0x09, 0x02, 0x01, 0xFE, 0xB1, 0x03, 0x02, 0x00, 0xFE, -/* 0000E0A0 */ 0xB2, 0x03, 0x02, 0x00, 0xFE, 0xB3, 0x03, 0x02, 0x01, 0xFE, 0xB4, 0x03, 0x02, 0x01, 0xFE, 0xB5, -/* 0000E0B0 */ 0x03, 0x02, 0x01, 0xFE, 0xB6, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x01, 0xFE, 0xB7, 0x03, -/* 0000E0C0 */ 0x02, 0x01, 0xFE, 0xB8, 0x03, 0x02, 0x01, 0xFE, 0xB9, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0000E0D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x88, 0x04, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0x2C, 0x36, 0x24, -/* 0000E0E0 */ 0x0D, 0x03, 0x00, 0x36, 0x02, 0x09, 0x1C, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000E0F0 */ 0x00, 0x37, 0x00, 0x00, 0x6D, 0x36, 0x37, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x37, 0xF6, 0x01, -/* 0000E100 */ 0xFF, 0x36, 0x00, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, -/* 0000E110 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x37, -/* 0000E120 */ 0x02, 0x00, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x24, 0x5C, 0x03, 0x03, 0xF6, 0x04, 0x36, 0x36, 0x01, -/* 0000E130 */ 0x00, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x2D, 0x00, 0x62, 0x36, 0x24, 0x01, 0x0F, 0x03, 0x00, 0x36, -/* 0000E140 */ 0x09, 0x22, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x6D, -/* 0000E150 */ 0x36, 0x37, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0xF6, -/* 0000E160 */ 0x03, 0xFF, 0x36, 0x02, 0x00, 0x77, 0x06, 0x24, 0x03, 0x2C, 0x36, 0x26, 0x14, 0x03, 0x00, 0x36, -/* 0000E170 */ 0x07, 0x09, 0x26, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x36, 0x03, 0x00, -/* 0000E180 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x08, 0xF6, 0x03, -/* 0000E190 */ 0x36, 0x36, 0x03, 0x00, 0x47, 0x26, 0x36, 0x09, 0x22, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x31, -/* 0000E1A0 */ 0x00, 0x00, 0x00, 0x37, 0x04, 0x00, 0x6D, 0x36, 0x37, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x37, -/* 0000E1B0 */ 0x5C, 0x01, 0x26, 0xF6, 0x02, 0x36, 0x36, 0x04, 0x00, 0x47, 0x26, 0x36, 0x8F, 0x02, 0x00, 0x00, -/* 0000E1C0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000E1D0 */ 0x26, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCE, 0x37, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x37, -/* 0000E1E0 */ 0xA1, 0x01, 0x0C, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x0C, 0xF6, 0x06, 0x36, 0x36, 0x05, 0x00, -/* 0000E1F0 */ 0x47, 0x28, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x07, -/* 0000E200 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCE, 0x37, -/* 0000E210 */ 0x02, 0x01, 0x00, 0xA1, 0x00, 0x0E, 0x37, 0xA1, 0x01, 0x0F, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, -/* 0000E220 */ 0x0E, 0xF6, 0x06, 0x36, 0x36, 0x06, 0x00, 0x47, 0x29, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, -/* 0000E230 */ 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, -/* 0000E240 */ 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xCE, 0x37, 0x04, 0x02, 0x00, 0xA1, 0x00, 0x11, 0x37, 0xA1, 0x01, -/* 0000E250 */ 0x12, 0x37, 0xA1, 0x02, 0x13, 0x37, 0xA1, 0x03, 0x14, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, -/* 0000E260 */ 0x05, 0x37, 0xF6, 0x06, 0x36, 0x36, 0x07, 0x00, 0x47, 0x2A, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000E270 */ 0x02, 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, -/* 0000E280 */ 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, 0xA8, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x17, 0xF6, 0x06, -/* 0000E290 */ 0x36, 0x36, 0x08, 0x00, 0x47, 0x2B, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000E2A0 */ 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x18, 0x5C, -/* 0000E2B0 */ 0x03, 0x0A, 0xCE, 0x37, 0x03, 0x03, 0x00, 0xA1, 0x00, 0x19, 0x37, 0xA1, 0x01, 0x1A, 0x37, 0xA1, -/* 0000E2C0 */ 0x02, 0x1B, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, 0xF6, 0x06, 0x36, 0x36, 0x09, -/* 0000E2D0 */ 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000E2E0 */ 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x1C, 0x5C, -/* 0000E2F0 */ 0x03, 0x16, 0xCE, 0x37, 0x02, 0x04, 0x00, 0xA1, 0x00, 0x06, 0x37, 0xA1, 0x01, 0x17, 0x37, 0x5C, -/* 0000E300 */ 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, 0xF6, 0x06, 0x36, 0x36, 0x0A, 0x00, 0x96, 0x03, 0x00, -/* 0000E310 */ 0x00, 0x00, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x36, 0x06, 0x00, 0x07, -/* 0000E320 */ 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0xF6, 0x02, 0x36, 0x36, 0x0B, 0x00, 0x47, 0x25, -/* 0000E330 */ 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x36, 0x07, 0x00, 0x07, 0x05, 0x00, -/* 0000E340 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x28, 0xA8, 0x37, 0x5C, 0x03, 0x37, 0x8F, 0x02, -/* 0000E350 */ 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x37, 0x08, 0x00, 0x5C, 0x04, 0x37, 0xF6, 0x05, 0x36, -/* 0000E360 */ 0x36, 0x0C, 0x00, 0x47, 0x2C, 0x36, 0x96, 0x04, 0x00, 0x00, 0x00, 0x1D, 0x8F, 0x02, 0x00, 0x00, -/* 0000E370 */ 0x00, 0x2C, 0x00, 0x00, 0x00, 0x36, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x62, 0x37, -/* 0000E380 */ 0x2C, 0x05, 0x5C, 0x01, 0x37, 0xF6, 0x02, 0x36, 0x36, 0x0D, 0x00, 0x47, 0x2D, 0x36, 0x47, 0x2E, -/* 0000E390 */ 0x2D, 0x62, 0x36, 0x2C, 0x06, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x37, 0x00, 0x8F, 0x02, 0x00, 0x00, -/* 0000E3A0 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x02, -/* 0000E3B0 */ 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x37, 0x0A, 0x00, 0x5C, 0x01, 0x37, 0x62, 0x37, 0x2C, -/* 0000E3C0 */ 0x06, 0x5C, 0x02, 0x37, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x37, 0x5C, 0x03, 0x37, 0xF6, 0x04, 0xFF, -/* 0000E3D0 */ 0x36, 0x0E, 0x00, 0x93, 0x04, 0x00, 0x00, 0x00, 0x36, 0x0B, 0x00, 0x15, 0x03, 0x00, 0x36, 0x1D, -/* 0000E3E0 */ 0x09, 0x5C, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x36, 0x0C, 0x00, 0x98, -/* 0000E3F0 */ 0x36, 0x36, 0x2E, 0x00, 0x00, 0x47, 0x2F, 0x36, 0x47, 0x30, 0x1E, 0xA8, 0x36, 0x15, 0x03, 0x00, -/* 0000E400 */ 0x2F, 0x36, 0x09, 0x34, 0x00, 0x93, 0x04, 0x00, 0x00, 0x00, 0x37, 0x0B, 0x00, 0x98, 0x37, 0x2F, -/* 0000E410 */ 0x37, 0x01, 0x00, 0x47, 0x30, 0x37, 0x47, 0x36, 0x37, 0xA8, 0x37, 0x15, 0x03, 0x00, 0x36, 0x37, -/* 0000E420 */ 0x09, 0x16, 0x00, 0x15, 0x03, 0x00, 0x30, 0x1E, 0x09, 0x0B, 0x00, 0x2F, 0x36, 0x2E, 0x1F, 0x2F, -/* 0000E430 */ 0x36, 0x36, 0x30, 0x47, 0x2E, 0x36, 0x09, 0x06, 0x00, 0x96, 0x04, 0x00, 0x00, 0x00, 0x1D, 0x93, -/* 0000E440 */ 0x02, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x00, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0xA1, -/* 0000E450 */ 0x00, 0xE5, 0x3B, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, -/* 0000E460 */ 0x6D, 0x36, 0x37, 0x07, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x20, 0x5C, 0x02, 0x21, -/* 0000E470 */ 0x5C, 0x03, 0x2D, 0xA8, 0x38, 0x5C, 0x04, 0x38, 0xA8, 0x38, 0x5C, 0x05, 0x38, 0xA8, 0x38, 0x5C, -/* 0000E480 */ 0x06, 0x38, 0xF6, 0x07, 0x36, 0x36, 0x0F, 0x00, 0x47, 0x31, 0x36, 0xE9, 0x09, 0x3B, 0x00, 0xE7, -/* 0000E490 */ 0x27, 0x06, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x36, 0x0E, 0x00, 0x07, 0x02, -/* 0000E4A0 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x27, 0xF6, 0x02, 0xFF, 0x36, 0x10, 0x00, 0x8F, 0x02, 0x00, -/* 0000E4B0 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x6D, 0x36, 0x37, 0x08, 0x07, 0x01, 0x00, -/* 0000E4C0 */ 0x5C, 0x00, 0x37, 0xF6, 0x01, 0xFF, 0x36, 0x11, 0x00, 0xE9, 0x14, 0x03, 0x00, 0x31, 0x22, 0x09, -/* 0000E4D0 */ 0x09, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x09, 0x17, 0x00, 0x14, 0x03, 0x00, 0x31, 0x23, -/* 0000E4E0 */ 0x09, 0x09, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x19, 0x09, 0x06, 0x00, 0x96, 0x02, 0x00, 0x00, -/* 0000E4F0 */ 0x00, 0x1A, 0xA8, 0x36, 0x14, 0x03, 0x00, 0x2A, 0x36, 0x09, 0x03, 0x00, 0x47, 0x2A, 0x14, 0x93, -/* 0000E500 */ 0x03, 0x00, 0x00, 0x00, 0x36, 0x0F, 0x00, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x06, -/* 0000E510 */ 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x17, 0x77, 0x28, 0x24, 0x09, 0x62, 0x36, 0x2C, 0x05, 0x77, -/* 0000E520 */ 0x36, 0x24, 0x0A, 0x77, 0x2E, 0x24, 0x0B, 0x77, 0x29, 0x24, 0x0C, 0x77, 0x2A, 0x24, 0x0D, 0x77, -/* 0000E530 */ 0x2B, 0x24, 0x0E, 0x93, 0x02, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x00, 0x77, 0x36, 0x24, 0x0F, 0x93, -/* 0000E540 */ 0x03, 0x00, 0x00, 0x00, 0x36, 0x0F, 0x00, 0x77, 0x36, 0x24, 0x10, 0x93, 0x04, 0x00, 0x00, 0x00, -/* 0000E550 */ 0x36, 0x0B, 0x00, 0x77, 0x36, 0x24, 0x11, 0x77, 0x06, 0x24, 0x12, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000E560 */ 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x52, 0x03, -/* 0000E570 */ 0xFE, 0x6D, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x6E, 0x02, 0xFE, -/* 0000E580 */ 0x17, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x73, -/* 0000E590 */ 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0xB1, 0x03, 0xFE, 0x21, 0x02, -/* 0000E5A0 */ 0xFE, 0xBA, 0x03, 0x00, 0xFE, 0x24, 0x84, 0x35, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x37, 0x00, -/* 0000E5B0 */ 0x1C, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x93, 0x00, 0x22, 0x00, 0x65, 0x00, 0x04, 0x00, 0x5D, 0x00, -/* 0000E5C0 */ 0x0B, 0x00, 0x3A, 0x00, 0x26, 0x00, 0x4F, 0x00, 0x22, 0x00, 0x49, 0x00, 0x37, 0x00, 0x71, 0x00, -/* 0000E5D0 */ 0x37, 0x00, 0x5F, 0x00, 0x41, 0x00, 0x81, 0x00, 0x2C, 0x00, 0x6E, 0x00, 0x40, 0x00, 0x73, 0x00, -/* 0000E5E0 */ 0x3C, 0x00, 0x9B, 0x00, 0x1E, 0x00, 0x41, 0x00, 0x35, 0x00, 0x6F, 0x00, 0x06, 0x00, 0x2B, 0x00, -/* 0000E5F0 */ 0x22, 0x00, 0x69, 0x00, 0x03, 0x00, 0x46, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x37, 0x00, 0x33, 0x05, -/* 0000E600 */ 0x10, 0x00, 0x33, 0x00, 0x15, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x2F, 0x00, 0x28, 0x00, 0x92, 0x00, -/* 0000E610 */ 0x08, 0x00, 0x3B, 0x00, 0x0E, 0x00, 0xB1, 0x00, 0x06, 0x00, 0x7F, 0x00, 0x15, 0x00, 0x51, 0x00, -/* 0000E620 */ 0x3D, 0x00, 0x79, 0x00, 0x01, 0x00, 0x52, 0x00, 0x1B, 0x00, 0x92, 0x01, 0x1D, 0x00, 0x52, 0x00, -/* 0000E630 */ 0x08, 0x00, 0x29, 0x00, 0x09, 0x00, 0x30, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x09, 0x00, 0x4A, 0x00, -/* 0000E640 */ 0x06, 0x00, 0x4E, 0x00, 0x0A, 0x00, 0x35, 0x00, 0x03, 0x00, 0x3C, 0x00, 0x12, 0x00, 0x31, 0x00, -/* 0000E650 */ 0x06, 0x00, 0x65, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x48, 0x00, -/* 0000E660 */ 0x04, 0x00, 0x2A, 0x00, 0x04, 0x00, 0x36, 0x00, 0x04, 0x00, 0x42, 0x00, 0x0C, 0x00, 0x32, 0x00, -/* 0000E670 */ 0x0C, 0x00, 0x2E, 0x00, 0x0C, 0x00, 0x32, 0x00, 0x06, 0x00, 0x33, 0x00, 0x00, 0x81, 0xE6, 0x00, -/* 0000E680 */ 0x00, 0xBF, 0xFC, 0x6A, 0x04, 0xCF, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0B, 0x03, -/* 0000E690 */ 0x57, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x31, 0x00, 0xFE, 0x91, 0x8B, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000E6A0 */ 0x02, 0x02, 0xFE, 0x91, 0x8B, 0xFE, 0xCB, 0x04, 0xFE, 0xCB, 0x04, 0x41, 0x09, 0x15, 0x1A, 0x0B, -/* 0000E6B0 */ 0x5E, 0x59, 0x03, 0x03, 0x05, 0x01, 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, -/* 0000E6C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, -/* 0000E6D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, -/* 0000E6E0 */ 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, -/* 0000E6F0 */ 0xBB, 0x03, 0x02, 0x01, 0xFE, 0xB1, 0x03, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, -/* 0000E700 */ 0xFE, 0xB2, 0x03, 0x02, 0x00, 0xFE, 0xB3, 0x03, 0x02, 0x01, 0xFE, 0xB4, 0x03, 0x02, 0x00, 0xFE, -/* 0000E710 */ 0xBC, 0x03, 0x02, 0x01, 0xFE, 0xBD, 0x03, 0x08, 0x02, 0x00, 0xFE, 0xBE, 0x03, 0x02, 0x01, 0xFE, -/* 0000E720 */ 0xB6, 0x03, 0x02, 0x01, 0xFE, 0xAA, 0x03, 0x02, 0x01, 0xFE, 0xA9, 0x03, 0x02, 0x00, 0xFE, 0xBF, -/* 0000E730 */ 0x03, 0xFE, 0xC4, 0x01, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000E740 */ 0x6D, 0x1A, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, 0xE0, 0x1C, 0x00, -/* 0000E750 */ 0x5C, 0x02, 0x1C, 0xF2, 0x03, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x16, 0x1A, -/* 0000E760 */ 0x98, 0x1A, 0x16, 0x02, 0x00, 0x00, 0x47, 0x17, 0x1A, 0x98, 0x1A, 0x16, 0x03, 0x01, 0x00, 0x14, -/* 0000E770 */ 0x03, 0x00, 0x1A, 0x04, 0x09, 0x08, 0x00, 0xA8, 0x1B, 0x47, 0x1A, 0x1B, 0x09, 0x09, 0x00, 0x98, -/* 0000E780 */ 0x1B, 0x16, 0x03, 0x02, 0x00, 0x47, 0x1A, 0x1B, 0x47, 0x18, 0x1A, 0x14, 0x03, 0x00, 0x17, 0x05, -/* 0000E790 */ 0x09, 0x92, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x00, 0xA8, -/* 0000E7A0 */ 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x7C, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000E7B0 */ 0x00, 0x00, 0x1A, 0x02, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x08, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000E7C0 */ 0x0A, 0x00, 0x00, 0x00, 0x1B, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x08, 0xCC, 0x00, 0x00, -/* 0000E7D0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7B, 0x18, 0x1C, 0x01, 0x5C, 0x01, -/* 0000E7E0 */ 0x1C, 0x5D, 0x02, 0x07, 0x02, 0x00, 0xEE, 0x03, 0x1B, 0x1B, 0x02, 0x00, 0x5C, 0x01, 0x1B, 0x5D, -/* 0000E7F0 */ 0x02, 0x06, 0x01, 0x00, 0x5D, 0x03, 0x09, 0x01, 0x00, 0xCE, 0x1B, 0x03, 0x00, 0x00, 0xA1, 0x00, -/* 0000E800 */ 0x0A, 0x1B, 0xA1, 0x01, 0x0B, 0x1B, 0xA1, 0x02, 0x0C, 0x1B, 0x5C, 0x04, 0x1B, 0xA8, 0x1B, 0x5C, -/* 0000E810 */ 0x05, 0x1B, 0xEE, 0x06, 0x1A, 0x1A, 0x01, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000E820 */ 0x00, 0x1A, 0x09, 0xCF, 0x00, 0x14, 0x03, 0x00, 0x17, 0x0D, 0x09, 0x8B, 0x00, 0x8F, 0x01, 0x00, -/* 0000E830 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1A, 0x04, 0x00, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, -/* 0000E840 */ 0x09, 0x75, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, 0x1A, 0x09, 0x5E, 0x00, 0x8F, 0x03, 0x00, -/* 0000E850 */ 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x1B, 0x05, 0x00, 0x6D, 0x1A, 0x1B, 0x02, 0x07, 0x02, 0x00, -/* 0000E860 */ 0x5C, 0x00, 0x1B, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x06, 0x00, 0x07, -/* 0000E870 */ 0x03, 0x00, 0x5C, 0x00, 0x08, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1D, 0x07, -/* 0000E880 */ 0x00, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x18, 0xEE, 0x03, 0x1C, 0x1C, 0x04, 0x00, 0x43, 0x1C, 0x1C, -/* 0000E890 */ 0x0E, 0x5C, 0x01, 0x1C, 0xF2, 0x02, 0x1A, 0x1A, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x94, 0x01, -/* 0000E8A0 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1A, 0x09, 0x0A, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, -/* 0000E8B0 */ 0x03, 0x00, 0x00, 0x00, 0x0F, 0x09, 0x3C, 0x00, 0x14, 0x03, 0x00, 0x17, 0x10, 0x09, 0x34, 0x00, -/* 0000E8C0 */ 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, 0x1A, 0x09, 0x2A, 0x00, 0x15, 0x03, 0x00, 0x18, 0x11, 0x09, -/* 0000E8D0 */ 0x22, 0x00, 0x15, 0x03, 0x00, 0x18, 0x12, 0x09, 0x1A, 0x00, 0x15, 0x03, 0x00, 0x18, 0x13, 0x09, -/* 0000E8E0 */ 0x12, 0x00, 0x15, 0x03, 0x00, 0x18, 0x14, 0x09, 0x0A, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x04, -/* 0000E8F0 */ 0x00, 0x00, 0x00, 0x18, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0000E900 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0xFE, -/* 0000E910 */ 0xB1, 0x03, 0xFE, 0x5A, 0x02, 0x00, 0x0E, 0xFE, 0x4F, 0x03, 0x00, 0xFE, 0xBD, 0x8B, 0x0C, 0x00, -/* 0000E920 */ 0x00, 0x00, 0x00, 0x2C, 0x00, 0x82, 0x00, 0x09, 0x00, 0x2C, 0x00, 0x22, 0x00, 0x4C, 0x00, 0x1E, -/* 0000E930 */ 0x00, 0x4B, 0x00, 0x7C, 0x00, 0x9F, 0x00, 0x1E, 0x00, 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x5E, -/* 0000E940 */ 0x00, 0xA9, 0x00, 0x0D, 0x00, 0x4D, 0x00, 0x32, 0x00, 0xFF, 0x00, 0x0C, 0x00, 0x41, 0x00, 0x00, -/* 0000E950 */ 0xBF, 0xFC, 0x2A, 0x04, 0x8F, 0xFD, 0x0F, 0xFE, 0x2E, 0x03, 0xFE, 0xAD, 0x02, 0x1E, 0xFF, 0xA0, -/* 0000E960 */ 0x41, 0xC1, 0x00, 0x2D, 0x00, 0xFE, 0x4E, 0x7A, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 0000E970 */ 0xFE, 0x4E, 0x7A, 0xFE, 0xE5, 0x08, 0xFE, 0xE5, 0x08, 0x01, 0x0C, 0x07, 0x0F, 0x06, 0x7E, 0x76, -/* 0000E980 */ 0x01, 0x05, 0x08, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E990 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, -/* 0000E9A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 0000E9B0 */ 0x97, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x48, 0x02, 0x4F, -/* 0000E9C0 */ 0x07, 0x4F, 0x08, 0x4F, 0x0B, 0x4F, 0x0C, 0x4F, 0x0D, 0x4F, 0x09, 0x4F, 0x0A, 0x8F, 0x01, 0x00, -/* 0000E9D0 */ 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, -/* 0000E9E0 */ 0x28, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x62, 0x10, -/* 0000E9F0 */ 0x10, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x11, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, -/* 0000EA00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xFB, 0x01, 0xA8, 0x10, 0x47, 0x07, 0x10, 0xA8, -/* 0000EA10 */ 0x10, 0x47, 0x08, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, -/* 0000EA20 */ 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0xA1, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, -/* 0000EA30 */ 0x00, 0x00, 0x10, 0x03, 0x00, 0x4B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x10, -/* 0000EA40 */ 0x10, 0x00, 0x00, 0x47, 0x07, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, -/* 0000EA50 */ 0x01, 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x07, 0xE0, -/* 0000EA60 */ 0x12, 0x00, 0x5C, 0x02, 0x12, 0xF2, 0x03, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, -/* 0000EA70 */ 0x09, 0x10, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x4E, 0x00, 0x98, 0x10, 0x09, 0x03, 0x00, 0x00, 0x47, -/* 0000EA80 */ 0x08, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x07, 0x05, -/* 0000EA90 */ 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x11, 0x05, 0x00, -/* 0000EAA0 */ 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x07, 0x47, 0x11, 0x04, 0x01, 0x04, 0x01, 0x12, 0x08, 0x2F, 0x11, -/* 0000EAB0 */ 0x11, 0x12, 0x2F, 0x11, 0x11, 0x05, 0x5C, 0x03, 0x11, 0x5D, 0x04, 0x05, 0x02, 0x00, 0xEE, 0x05, -/* 0000EAC0 */ 0x10, 0x10, 0x02, 0x00, 0x47, 0x07, 0x10, 0x09, 0x58, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 0000EAD0 */ 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, -/* 0000EAE0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x4B, 0x12, 0x07, 0x01, -/* 0000EAF0 */ 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x12, 0x12, 0x04, 0x00, 0x5C, 0x01, 0x12, 0xE0, 0x12, 0x01, -/* 0000EB00 */ 0x5C, 0x02, 0x12, 0xF2, 0x03, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x54, 0x0A, 0x10, -/* 0000EB10 */ 0x98, 0x10, 0x0A, 0x03, 0x01, 0x00, 0x47, 0x07, 0x10, 0x98, 0x10, 0x0A, 0x06, 0x02, 0x00, 0x47, -/* 0000EB20 */ 0x08, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x08, 0x10, 0x09, 0x1D, 0x00, 0x01, 0x32, 0x01, 0x01, -/* 0000EB30 */ 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x07, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, -/* 0000EB40 */ 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xBC, 0x00, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x10, 0x54, -/* 0000EB50 */ 0x0B, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x98, 0x10, -/* 0000EB60 */ 0x10, 0x07, 0x03, 0x00, 0x54, 0x0C, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0C, 0x10, 0x09, 0x2F, -/* 0000EB70 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0xEE, 0x03, 0x10, -/* 0000EB80 */ 0x0B, 0x05, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x8F, -/* 0000EB90 */ 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x65, 0x00, -/* 0000EBA0 */ 0x98, 0x10, 0x0C, 0x08, 0x04, 0x00, 0x54, 0x0D, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0D, 0x10, -/* 0000EBB0 */ 0x09, 0x21, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x0D, 0xEE, -/* 0000EBC0 */ 0x03, 0x10, 0x0B, 0x06, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, -/* 0000EBD0 */ 0x10, 0x09, 0x1E, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, -/* 0000EBE0 */ 0xEE, 0x03, 0x10, 0x0B, 0x07, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, -/* 0000EBF0 */ 0x00, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, -/* 0000EC00 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x03, 0xFE, 0x37, 0x02, 0x00, -/* 0000EC10 */ 0x28, 0xFE, 0x98, 0x03, 0x00, 0x0E, 0xFE, 0x99, 0x03, 0x00, 0xFE, 0x64, 0x7A, 0x1B, 0x0E, 0x00, -/* 0000EC20 */ 0x00, 0x00, 0x2C, 0x00, 0x3F, 0x00, 0x11, 0x00, 0x31, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, -/* 0000EC30 */ 0x23, 0x00, 0x15, 0x00, 0x7A, 0x00, 0x1D, 0x00, 0x29, 0x00, 0x2C, 0x00, 0x6A, 0x00, 0x07, 0x00, -/* 0000EC40 */ 0xB8, 0x00, 0x09, 0x00, 0x26, 0x00, 0x48, 0x00, 0xC6, 0x00, 0x46, 0x00, 0x5C, 0x00, 0x09, 0x00, -/* 0000EC50 */ 0x1F, 0x00, 0x09, 0x00, 0x29, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x0C, 0x00, 0x2C, 0x00, 0x11, 0x00, -/* 0000EC60 */ 0x8D, 0x00, 0x09, 0x00, 0x28, 0x01, 0x15, 0x00, 0x56, 0x00, 0x0A, 0x00, 0x84, 0x00, 0x1E, 0x00, -/* 0000EC70 */ 0x54, 0x00, 0x11, 0x00, 0x31, 0x00, 0x09, 0x00, 0x42, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x21, 0x00, -/* 0000EC80 */ 0x6B, 0x00, 0x1E, 0x00, 0x5B, 0x00, 0x13, 0x00, 0x22, 0x00, 0x00, 0x8F, 0xEC, 0x00, 0x00, 0xBF, -/* 0000EC90 */ 0xDC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x9A, 0x03, 0xFE, 0xCB, 0x02, 0x2C, 0xFF, 0xA2, 0x41, -/* 0000ECA0 */ 0xC1, 0x00, 0x2E, 0x00, 0xFE, 0x74, 0x7F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x74, -/* 0000ECB0 */ 0x7F, 0xF9, 0xF9, 0x01, 0x04, 0x05, 0x08, 0x18, 0x16, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ECC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ECD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, -/* 0000ECE0 */ 0x02, 0x02, 0x00, 0xFE, 0x97, 0x03, 0x02, 0x00, 0xFE, 0x9B, 0x03, 0x5C, 0x8F, 0x01, 0x00, 0x00, -/* 0000ECF0 */ 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4B, 0x08, 0x0F, 0x03, 0x00, 0x08, 0x09, 0x23, -/* 0000ED00 */ 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, -/* 0000ED10 */ 0x03, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, 0x09, 0x25, -/* 0000ED20 */ 0x00, 0x09, 0x20, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, -/* 0000ED30 */ 0x2F, 0x00, 0x00, 0x04, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, -/* 0000ED40 */ 0x02, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xA9, 0x7F, 0x04, 0x00, -/* 0000ED50 */ 0x00, 0x00, 0x00, 0x15, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x53, 0x00, 0x22, 0x00, 0x46, 0x00, 0x00, -/* 0000ED60 */ 0x3F, 0xFD, 0x22, 0x04, 0x00, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x98, 0x02, 0x32, -/* 0000ED70 */ 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x2A, 0x00, 0xFE, 0x6D, 0x76, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000ED80 */ 0x01, 0x01, 0xFE, 0x6D, 0x76, 0xFE, 0x13, 0x03, 0xFE, 0x13, 0x03, 0x01, 0x06, 0x04, 0x07, 0x08, -/* 0000ED90 */ 0x1E, 0x1E, 0x01, 0x03, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0xFF, 0xFF, 0xFF, -/* 0000EDA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, -/* 0000EDB0 */ 0x99, 0x4F, 0x07, 0x96, 0x02, 0x00, 0x00, 0x00, 0x07, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 0000EDC0 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x08, 0x5C, 0x01, 0x08, -/* 0000EDD0 */ 0x5D, 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, 0x07, 0x07, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, -/* 0000EDE0 */ 0x07, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x07, 0x04, 0x00, -/* 0000EDF0 */ 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x5C, -/* 0000EE00 */ 0x01, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x07, 0x02, -/* 0000EE10 */ 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, -/* 0000EE20 */ 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x08, 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0xD4, 0x00, 0x00, 0x00, -/* 0000EE30 */ 0x00, 0x08, 0x5C, 0x03, 0x08, 0xEE, 0x04, 0xFF, 0x07, 0x01, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, -/* 0000EE40 */ 0x00, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x94, 0x03, 0x00, -/* 0000EE50 */ 0xFE, 0x83, 0x76, 0x04, 0x08, 0x00, 0x00, 0x00, 0x28, 0x00, 0x31, 0x00, 0x5A, 0x00, 0xB6, 0x02, -/* 0000EE60 */ 0x0D, 0x00, 0x15, 0x00, 0x00, 0x69, 0xEE, 0x00, 0x00, 0xBF, 0xFD, 0x3A, 0x04, 0x00, 0xFC, 0x0F, -/* 0000EE70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9A, 0x02, 0x6B, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x2B, 0x00, -/* 0000EE80 */ 0xFE, 0x17, 0x77, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x17, 0x77, 0xFE, 0x48, -/* 0000EE90 */ 0x02, 0xFE, 0x48, 0x02, 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x25, 0x25, 0x02, 0x01, 0x01, 0x03, -/* 0000EEA0 */ 0x08, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EEB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0xC6, 0x4F, 0x08, 0x96, -/* 0000EEC0 */ 0x02, 0x00, 0x00, 0x00, 0x08, 0x4F, 0x08, 0x96, 0x03, 0x00, 0x00, 0x00, 0x08, 0x8F, 0x02, 0x00, -/* 0000EED0 */ 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x04, 0x00, 0x00, 0x96, -/* 0000EEE0 */ 0x02, 0x00, 0x00, 0x00, 0x08, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, 0x01, -/* 0000EEF0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x09, 0x5C, 0x01, 0x09, 0x5D, 0x02, 0x02, 0x00, -/* 0000EF00 */ 0x00, 0xEE, 0x03, 0x08, 0x08, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x08, 0x8F, 0x02, 0x00, -/* 0000EF10 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, -/* 0000EF20 */ 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x5C, 0x01, 0x09, 0x8F, 0x02, -/* 0000EF30 */ 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, -/* 0000EF40 */ 0x93, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0x09, 0x09, 0x02, -/* 0000EF50 */ 0x00, 0x5C, 0x02, 0x09, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x09, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, -/* 0000EF60 */ 0x08, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x4B, -/* 0000EF70 */ 0x08, 0x93, 0x03, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x9D, 0x09, 0x08, 0x04, 0x00, 0x00, 0xA8, -/* 0000EF80 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x95, 0x03, 0xFE, 0x96, 0x03, 0x00, 0xFE, 0x37, 0x77, 0x05, -/* 0000EF90 */ 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x56, 0x00, 0x28, 0x00, 0x45, 0x00, 0x56, 0x00, 0x58, 0x01, -/* 0000EFA0 */ 0x1E, 0x00, 0x34, 0x00, 0x00, 0xA9, 0xEF, 0x00, 0x00, 0xBF, 0xDC, 0x1A, 0x04, 0x00, 0xFC, 0x07, -/* 0000EFB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9E, 0x02, 0x68, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x2C, 0x00, -/* 0000EFC0 */ 0xFE, 0x2E, 0x78, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x2E, 0x78, 0xEC, 0xEC, 0x41, -/* 0000EFD0 */ 0x04, 0x03, 0x06, 0x0D, 0x0D, 0x03, 0x01, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EFE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EFF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x39, -/* 0000F000 */ 0x4F, 0x04, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x4B, 0x06, -/* 0000F010 */ 0x98, 0x06, 0x06, 0x03, 0x00, 0x00, 0x54, 0x04, 0x06, 0x15, 0x03, 0x00, 0x04, 0x02, 0x09, 0x14, -/* 0000F020 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x4B, 0x06, 0x9D, -/* 0000F030 */ 0x03, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x78, 0x04, -/* 0000F040 */ 0x02, 0x00, 0x00, 0x00, 0x17, 0x00, 0x48, 0x00, 0x08, 0x00, 0x2D, 0x00, 0x16, 0x00, 0x4F, 0x00, -/* 0000F050 */ 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x93, 0x03, 0xFE, 0x73, 0x02, 0x08, 0xFF, -/* 0000F060 */ 0xA2, 0x41, 0xC3, 0x00, 0x29, 0x00, 0xFE, 0x45, 0x6C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 0000F070 */ 0xFE, 0x45, 0x6C, 0x96, 0x96, 0x01, 0x05, 0x03, 0x06, 0x05, 0x0F, 0x0F, 0x01, 0x01, 0x02, 0xFF, -/* 0000F080 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, -/* 0000F090 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000F0A0 */ 0x04, 0x3B, 0x5B, 0x04, 0xB4, 0x04, 0x04, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, -/* 0000F0B0 */ 0x06, 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x00, 0x00, -/* 0000F0C0 */ 0x00, 0x4B, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x4B, 0x07, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x03, -/* 0000F0D0 */ 0xEE, 0x04, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 0000F0E0 */ 0xFE, 0x83, 0x6C, 0x02, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x57, 0x00, 0x00, 0xBF, 0xFC, 0x2A, -/* 0000F0F0 */ 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x92, 0x03, 0xFE, 0x6C, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xA3, 0x00, -/* 0000F100 */ 0x28, 0x00, 0xFE, 0x67, 0x6A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x67, 0x6A, 0xFE, -/* 0000F110 */ 0x04, 0x01, 0xFE, 0x04, 0x01, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, 0x01, 0x01, 0x02, -/* 0000F120 */ 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F130 */ 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F140 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 0000F150 */ 0x04, 0x62, 0xAE, 0x07, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x4F, 0x08, 0x62, 0x0B, 0x07, 0x00, 0x12, -/* 0000F160 */ 0x03, 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x09, 0x00, 0x98, -/* 0000F170 */ 0x0C, 0x07, 0x04, 0x00, 0x00, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000F180 */ 0x32, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, -/* 0000F190 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x4B, 0x0C, 0x5C, 0x02, -/* 0000F1A0 */ 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, -/* 0000F1B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFE, 0xB3, 0x6A, 0x03, 0x09, 0x00, 0x00, 0x00, -/* 0000F1C0 */ 0x20, 0x00, 0x4D, 0x00, 0x37, 0x00, 0x6A, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, -/* 0000F1D0 */ 0xFE, 0x91, 0x03, 0xFE, 0x65, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xA3, 0x00, 0x27, 0x00, 0xFE, 0x55, -/* 0000F1E0 */ 0x68, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x55, 0x68, 0xFE, 0x00, 0x01, 0xFE, 0x00, -/* 0000F1F0 */ 0x01, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, -/* 0000F200 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, -/* 0000F210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000F220 */ 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x62, 0xAE, 0x07, -/* 0000F230 */ 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x4F, 0x08, 0x62, 0x0B, 0x07, 0x00, 0x12, 0x03, 0x00, 0x0B, 0x03, -/* 0000F240 */ 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x09, 0x00, 0x98, 0x0C, 0x07, 0x04, 0x00, -/* 0000F250 */ 0x00, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, -/* 0000F260 */ 0x0B, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, -/* 0000F270 */ 0x00, 0x47, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, -/* 0000F280 */ 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 0000F290 */ 0x00, 0x00, 0xF0, 0x00, 0xFE, 0x9F, 0x68, 0x03, 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x4D, 0x00, -/* 0000F2A0 */ 0x37, 0x00, 0x68, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x90, 0x03, 0xFE, -/* 0000F2B0 */ 0x5E, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xA3, 0x00, 0x26, 0x00, 0xFE, 0x53, 0x66, 0xFF, 0x00, 0x10, -/* 0000F2C0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x53, 0x66, 0xF8, 0xF8, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, -/* 0000F2D0 */ 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F2E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F2F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, -/* 0000F300 */ 0x01, 0x00, 0x00, 0x00, 0x04, 0x62, 0xAE, 0x07, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x4F, 0x08, 0x62, -/* 0000F310 */ 0x0B, 0x07, 0x00, 0x12, 0x03, 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, -/* 0000F320 */ 0x09, 0x09, 0x00, 0x98, 0x0C, 0x07, 0x04, 0x00, 0x00, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8F, -/* 0000F330 */ 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, -/* 0000F340 */ 0x05, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, -/* 0000F350 */ 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, -/* 0000F360 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFE, 0x99, 0x66, 0x03, -/* 0000F370 */ 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x37, 0x00, 0x64, 0x00, 0x00, 0xBF, 0xFC, 0x22, -/* 0000F380 */ 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xE6, 0x02, 0xFE, 0x40, 0x02, 0x1D, 0xFF, 0xA2, 0x41, 0xC1, 0x00, -/* 0000F390 */ 0x25, 0x00, 0xFE, 0xB3, 0x60, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xB3, 0x60, 0xFE, -/* 0000F3A0 */ 0x60, 0x03, 0xFE, 0x60, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, 0x50, 0x4D, 0x01, 0x09, 0x08, 0x04, -/* 0000F3B0 */ 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F3C0 */ 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F3D0 */ 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x02, -/* 0000F3E0 */ 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x00, 0xFE, 0x8F, 0x03, 0xFE, 0x88, -/* 0000F3F0 */ 0x01, 0xA8, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, -/* 0000F400 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0xEE, 0x02, 0x0C, 0x0C, 0x00, 0x00, 0x47, 0x08, -/* 0000F410 */ 0x0C, 0x2C, 0x0C, 0x09, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x90, 0x00, 0x62, 0x0C, 0x09, 0x00, -/* 0000F420 */ 0x47, 0x0A, 0x0C, 0x2C, 0x0C, 0x0A, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x7E, 0x00, 0x8F, 0x01, -/* 0000F430 */ 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0D, 0x01, 0x00, 0x6D, 0x0C, 0x0D, 0x01, 0x07, 0x02, -/* 0000F440 */ 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, 0x0A, 0xF2, 0x02, 0x0C, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x01, -/* 0000F450 */ 0x00, 0x47, 0x0A, 0x0C, 0x15, 0x03, 0x00, 0x0A, 0x04, 0x09, 0x50, 0x00, 0x15, 0x03, 0x00, 0x0A, -/* 0000F460 */ 0x05, 0x09, 0x48, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x02, 0x00, -/* 0000F470 */ 0x6D, 0x0C, 0x0D, 0x02, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, -/* 0000F480 */ 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0A, 0xEE, -/* 0000F490 */ 0x02, 0x0E, 0x0E, 0x03, 0x00, 0x5C, 0x01, 0x0E, 0x5D, 0x02, 0x06, 0x02, 0x00, 0x5D, 0x03, 0x07, -/* 0000F4A0 */ 0x02, 0x00, 0xF2, 0x04, 0xFF, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2C, 0x0C, 0x0A, 0x14, -/* 0000F4B0 */ 0x0B, 0x00, 0x0C, 0x03, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x6E, 0x00, 0x8F, -/* 0000F4C0 */ 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000F4D0 */ 0x02, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x0D, 0x05, 0x00, -/* 0000F4E0 */ 0x5C, 0x02, 0x0D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x6D, -/* 0000F4F0 */ 0x0D, 0x0E, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, -/* 0000F500 */ 0x00, 0x00, 0x0F, 0x06, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0F, 0x0F, 0x06, -/* 0000F510 */ 0x00, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x0D, 0x0D, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5C, 0x03, -/* 0000F520 */ 0x0D, 0xEE, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x09, 0x4D, 0x00, 0x09, 0x48, 0x00, 0x8F, 0x01, 0x00, -/* 0000F530 */ 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, -/* 0000F540 */ 0x01, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x00, 0x5C, 0x02, -/* 0000F550 */ 0x0D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x07, 0x01, 0x00, -/* 0000F560 */ 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0D, 0x0D, 0x08, 0x00, 0x5C, 0x03, 0x0D, 0xEE, 0x04, 0x00, 0x0C, -/* 0000F570 */ 0x07, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x62, 0x02, 0xFE, 0x5B, -/* 0000F580 */ 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x27, 0x02, 0x00, 0xFE, 0xEE, 0x60, 0x0B, 0x02, 0x00, 0x00, 0x00, -/* 0000F590 */ 0x1E, 0x00, 0x34, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0B, 0x00, 0x36, 0x00, -/* 0000F5A0 */ 0x26, 0x00, 0x37, 0x00, 0x10, 0x00, 0x4A, 0x00, 0x48, 0x00, 0x96, 0x00, 0x13, 0x00, 0x4C, 0x00, -/* 0000F5B0 */ 0x6E, 0x00, 0x93, 0x00, 0x4A, 0x00, 0x64, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, -/* 0000F5C0 */ 0xFE, 0x2B, 0x03, 0xFE, 0x32, 0x02, 0x28, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x24, 0x00, 0xFE, 0xDF, -/* 0000F5D0 */ 0x5E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xDF, 0x5E, 0xFE, 0x8C, 0x01, 0xFE, 0x8C, -/* 0000F5E0 */ 0x01, 0x01, 0x07, 0x05, 0x0A, 0x03, 0x26, 0x25, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, -/* 0000F5F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, -/* 0000F600 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000F610 */ 0x03, 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x04, 0xB3, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, -/* 0000F620 */ 0xA8, 0x0A, 0x14, 0x03, 0x00, 0x05, 0x0A, 0x09, 0x23, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 0000F630 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, -/* 0000F640 */ 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, -/* 0000F650 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, -/* 0000F660 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, -/* 0000F670 */ 0x47, 0x08, 0x0A, 0x0F, 0x03, 0x00, 0x08, 0x09, 0x0C, 0x00, 0x62, 0x0A, 0x08, 0x02, 0x15, 0x03, -/* 0000F680 */ 0x00, 0x0A, 0x03, 0x09, 0x23, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, -/* 0000F690 */ 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0xF2, -/* 0000F6A0 */ 0x02, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, -/* 0000F6B0 */ 0x00, 0x00, 0x0A, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0xEE, 0x02, -/* 0000F6C0 */ 0x00, 0x0A, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x58, 0x02, -/* 0000F6D0 */ 0xFE, 0x33, 0x02, 0xFE, 0x61, 0x02, 0x00, 0xFE, 0x10, 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, -/* 0000F6E0 */ 0x00, 0x37, 0x00, 0x23, 0x00, 0x40, 0x00, 0x26, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x23, -/* 0000F6F0 */ 0x00, 0x40, 0x00, 0x20, 0x00, 0x2C, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 0000F700 */ 0x2A, 0x03, 0xFE, 0x25, 0x02, 0x24, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x23, 0x00, 0xFE, 0x1B, 0x5D, -/* 0000F710 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x1B, 0x5D, 0xFE, 0x9A, 0x01, 0xFE, 0x9A, 0x01, -/* 0000F720 */ 0x01, 0x08, 0x05, 0x0B, 0x04, 0x27, 0x26, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, -/* 0000F730 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, -/* 0000F740 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, -/* 0000F750 */ 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x04, 0xB6, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, -/* 0000F760 */ 0x0B, 0x14, 0x03, 0x00, 0x05, 0x0B, 0x09, 0x23, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000F770 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, -/* 0000F780 */ 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 0000F790 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, -/* 0000F7A0 */ 0x00, 0x0C, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, -/* 0000F7B0 */ 0x09, 0x0B, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0C, 0x00, 0x62, 0x0B, 0x09, 0x02, 0x15, 0x03, 0x00, -/* 0000F7C0 */ 0x0B, 0x03, 0x09, 0x23, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000F7D0 */ 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0xF2, 0x02, -/* 0000F7E0 */ 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, -/* 0000F7F0 */ 0x00, 0x0B, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, -/* 0000F800 */ 0xEE, 0x03, 0x00, 0x0B, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 0000F810 */ 0x58, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x61, 0x02, 0x00, 0xFE, 0x55, 0x5D, 0x07, 0x00, 0x00, 0x00, -/* 0000F820 */ 0x00, 0x12, 0x00, 0x37, 0x00, 0x23, 0x00, 0x40, 0x00, 0x26, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, -/* 0000F830 */ 0x00, 0x23, 0x00, 0x40, 0x00, 0x23, 0x00, 0x31, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x04, 0x4F, 0xFC, -/* 0000F840 */ 0x0F, 0xFE, 0x0C, 0x03, 0xFE, 0x12, 0x02, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x21, 0x00, 0xFE, -/* 0000F850 */ 0x86, 0x59, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x86, 0x59, 0xFE, 0x6F, 0x03, -/* 0000F860 */ 0xFE, 0x6F, 0x03, 0x04, 0x09, 0x0A, 0x10, 0x05, 0x20, 0x20, 0x01, 0x02, 0x01, 0x05, 0x03, 0x03, -/* 0000F870 */ 0x03, 0x03, 0x01, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F880 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -/* 0000F890 */ 0x00, 0x04, 0x02, 0x01, 0xFE, 0x88, 0x03, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, -/* 0000F8A0 */ 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x03, 0xAB, 0x96, 0x04, 0x00, 0x00, 0x00, 0x0B, 0x96, -/* 0000F8B0 */ 0x05, 0x00, 0x00, 0x00, 0x0C, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x10, -/* 0000F8C0 */ 0x96, 0x03, 0x00, 0x00, 0x00, 0x02, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, -/* 0000F8D0 */ 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, -/* 0000F8E0 */ 0x00, 0x11, 0x01, 0x00, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x11, -/* 0000F8F0 */ 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, -/* 0000F900 */ 0x00, 0x00, 0x10, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x02, 0x00, 0x00, 0x00, -/* 0000F910 */ 0x11, 0x03, 0x00, 0x5C, 0x01, 0x11, 0x5D, 0x02, 0x04, 0x01, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, -/* 0000F920 */ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, -/* 0000F930 */ 0x7B, 0x12, 0x11, 0x00, 0x7B, 0x07, 0x11, 0x01, 0x7B, 0x07, 0x11, 0x02, 0x5C, 0x03, 0x11, 0xEE, -/* 0000F940 */ 0x04, 0xFF, 0x10, 0x01, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x02, 0x00, -/* 0000F950 */ 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, -/* 0000F960 */ 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, -/* 0000F970 */ 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0x89, 0x03, 0xFE, 0x8A, 0x03, 0xFE, -/* 0000F980 */ 0x8B, 0x03, 0xFE, 0x8C, 0x03, 0x00, 0xFE, 0xD9, 0x59, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 0000F990 */ 0x19, 0x00, 0x06, 0x00, 0x17, 0x00, 0x33, 0x00, 0x70, 0x02, 0x4C, 0x00, 0x68, 0x00, 0x0D, 0x00, -/* 0000F9A0 */ 0x13, 0x00, 0x00, 0xA7, 0xF9, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x06, 0x4F, 0xFD, 0x07, 0xFF, 0xFF, -/* 0000F9B0 */ 0xFF, 0xFF, 0xFF, 0xFE, 0x15, 0x02, 0x41, 0xFF, 0xB2, 0x41, 0xD1, 0x00, 0x22, 0x00, 0xFE, 0x42, -/* 0000F9C0 */ 0x5A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x42, 0x5A, 0xFE, 0x2C, 0x02, 0xFE, 0x2C, -/* 0000F9D0 */ 0x02, 0x45, 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x03, 0x07, 0x05, 0x05, 0x05, 0x05, 0x01, -/* 0000F9E0 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F9F0 */ 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, -/* 0000FA00 */ 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, -/* 0000FA10 */ 0x01, 0xFE, 0xFF, 0x02, 0x08, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0xEC, 0xA8, 0x0D, 0xE5, 0xC4, -/* 0000FA20 */ 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x07, 0x05, 0x00, -/* 0000FA30 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0B, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, -/* 0000FA40 */ 0x01, 0x00, 0x5C, 0x02, 0x11, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, -/* 0000FA50 */ 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x5C, 0x04, 0x11, 0xF6, 0x05, 0x10, 0x10, 0x00, 0x00, 0x47, -/* 0000FA60 */ 0x0D, 0x10, 0x62, 0x10, 0x0D, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x74, 0x00, 0x8F, 0x02, 0x00, -/* 0000FA70 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8F, -/* 0000FA80 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x01, -/* 0000FA90 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x05, 0x00, 0x5C, 0x02, 0x11, 0xCC, 0x00, 0x00, -/* 0000FAA0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x62, 0x12, 0x0D, 0x00, 0x7B, 0x12, -/* 0000FAB0 */ 0x11, 0x01, 0x7B, 0x05, 0x11, 0x02, 0x7B, 0x05, 0x11, 0x03, 0x7B, 0x08, 0x11, 0x04, 0x5C, 0x03, -/* 0000FAC0 */ 0x11, 0xF6, 0x04, 0xFF, 0x10, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000FAD0 */ 0x10, 0x05, 0x00, 0x2F, 0x10, 0x10, 0x0A, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000FAE0 */ 0x10, 0xE9, 0x09, 0x1F, 0x00, 0xE7, 0x0C, 0x06, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, -/* 0000FAF0 */ 0x00, 0x10, 0x06, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0C, 0xF6, 0x02, 0xFF, -/* 0000FB00 */ 0x10, 0x02, 0x00, 0xE9, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0000FB10 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, -/* 0000FB20 */ 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, -/* 0000FB30 */ 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, 0x00, 0xFE, 0x78, 0x5A, 0x07, 0x05, 0x00, 0x00, 0x00, -/* 0000FB40 */ 0x41, 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x5A, 0x00, 0x8D, 0x00, 0x20, 0x00, 0x33, 0x00, -/* 0000FB50 */ 0x01, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x8F, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x04, 0x0F, 0xFC, 0x0F, -/* 0000FB60 */ 0xFE, 0x0B, 0x03, 0xFE, 0xEE, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1F, 0x00, 0xFE, 0x4F, -/* 0000FB70 */ 0x55, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x4F, 0x55, 0xFE, 0x31, 0x04, 0xFE, -/* 0000FB80 */ 0x31, 0x04, 0x01, 0x08, 0x05, 0x0A, 0x05, 0x2C, 0x2A, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, -/* 0000FB90 */ 0x03, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FBA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, -/* 0000FBB0 */ 0x01, 0xFE, 0x59, 0x03, 0x04, 0xC5, 0x4F, 0x06, 0x4F, 0x0A, 0x96, 0x02, 0x00, 0x00, 0x00, 0x0A, -/* 0000FBC0 */ 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x08, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, -/* 0000FBD0 */ 0x09, 0xA6, 0x00, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x0C, 0x00, 0xCE, 0x0A, -/* 0000FBE0 */ 0x01, 0x01, 0x00, 0xA1, 0x00, 0x05, 0x0A, 0x47, 0x05, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, -/* 0000FBF0 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, -/* 0000FC00 */ 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x05, 0x0A, -/* 0000FC10 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, -/* 0000FC20 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x62, 0x0C, 0x05, 0x02, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x0A, -/* 0000FC30 */ 0x0A, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x06, 0x0A, 0xCE, 0x0A, 0x00, 0x02, 0x00, 0x96, -/* 0000FC40 */ 0x02, 0x00, 0x00, 0x00, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0A, 0x01, -/* 0000FC50 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xD4, 0x00, 0x00, -/* 0000FC60 */ 0x00, 0x00, 0x0B, 0x5C, 0x03, 0x0B, 0xEE, 0x04, 0xFF, 0x0A, 0x02, 0x00, 0x93, 0x02, 0x00, 0x00, -/* 0000FC70 */ 0x00, 0x00, 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x52, 0x03, -/* 0000FC80 */ 0xFE, 0x5F, 0x02, 0xF0, 0xFE, 0x85, 0x03, 0x00, 0xFE, 0x82, 0x55, 0x0A, 0x0A, 0x00, 0x00, 0x00, -/* 0000FC90 */ 0x0B, 0x00, 0x32, 0x00, 0x08, 0x00, 0x1E, 0x00, 0x0B, 0x00, 0x2F, 0x00, 0x0C, 0x00, 0x28, 0x00, -/* 0000FCA0 */ 0x26, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x70, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x27, 0x00, 0x8F, 0x02, -/* 0000FCB0 */ 0x0D, 0x00, 0x11, 0x00, 0x00, 0xB9, 0xFC, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, -/* 0000FCC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0x01, 0x2A, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x20, 0x00, -/* 0000FCD0 */ 0xFE, 0x01, 0x57, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x01, 0x57, 0xFE, 0x61, 0x02, -/* 0000FCE0 */ 0xFE, 0x61, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x4C, 0x4A, 0x02, 0x08, 0x08, 0x04, 0x04, 0x04, -/* 0000FCF0 */ 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FD00 */ 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FD10 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x03, 0x02, 0x00, 0xFE, -/* 0000FD20 */ 0x87, 0x03, 0x04, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0x01, 0x4F, 0x09, 0x2C, 0x0B, 0x08, -/* 0000FD30 */ 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x0B, 0x00, 0x2C, 0x0B, 0x08, 0x15, 0x0B, 0x00, 0x0B, 0x03, -/* 0000FD40 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x08, 0x04, 0x09, 0x25, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000FD50 */ 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000FD60 */ 0x0C, 0x5D, 0x01, 0x05, 0x00, 0x00, 0xF2, 0x02, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000FD70 */ 0x8F, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x01, -/* 0000FD80 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, -/* 0000FD90 */ 0x00, 0x01, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x0B, -/* 0000FDA0 */ 0x02, 0x00, 0x4B, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x0B, -/* 0000FDB0 */ 0x0B, 0x02, 0x00, 0x0F, 0x41, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, -/* 0000FDC0 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, -/* 0000FDD0 */ 0x8F, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000FDE0 */ 0x00, 0x06, 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x0D, 0x0D, 0x04, 0x00, 0x5C, 0x01, 0x0D, 0xF2, 0x02, -/* 0000FDF0 */ 0xFF, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000FE00 */ 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, -/* 0000FE10 */ 0x09, 0xF2, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, -/* 0000FE20 */ 0x15, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x7E, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -/* 0000FE30 */ 0x00, 0x0B, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x1D, -/* 0000FE40 */ 0x00, 0x00, 0x00, 0x0C, 0x05, 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000FE50 */ 0x00, 0x00, 0x0C, 0x06, 0x00, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0x0B, -/* 0000FE60 */ 0x0B, 0x06, 0x00, 0x14, 0x03, 0x00, 0x0B, 0x07, 0x09, 0x3B, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000FE70 */ 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x02, 0x00, -/* 0000FE80 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0C, 0x07, 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x01, 0x00, 0x00, -/* 0000FE90 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x06, 0x00, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x09, -/* 0000FEA0 */ 0xEE, 0x04, 0xFF, 0x0B, 0x07, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x56, 0x02, 0xFE, -/* 0000FEB0 */ 0x5B, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x27, 0x02, 0x00, 0xFE, 0x21, 0x57, 0x09, 0x02, 0x00, 0x00, -/* 0000FEC0 */ 0x00, 0x1E, 0x00, 0x65, 0x00, 0x25, 0x00, 0x47, 0x00, 0x26, 0x00, 0x32, 0x00, 0x24, 0x00, 0x35, -/* 0000FED0 */ 0x00, 0x3E, 0x00, 0x4B, 0x00, 0x26, 0x00, 0x37, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x3D, 0x00, 0x46, -/* 0000FEE0 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x0A, 0x03, 0xFE, 0xE3, 0x01, 0x04, -/* 0000FEF0 */ 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1E, 0x00, 0xFE, 0xDA, 0x53, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 0000FF00 */ 0x02, 0xFE, 0xDA, 0x53, 0xF8, 0xF8, 0x01, 0x05, 0x04, 0x06, 0x04, 0x1D, 0x1C, 0x01, 0x03, 0x04, -/* 0000FF10 */ 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FF20 */ 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FF30 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x03, 0x92, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, -/* 0000FF40 */ 0x00, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, -/* 0000FF50 */ 0x04, 0xF2, 0x02, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x04, 0x06, 0x8F, 0x01, -/* 0000FF60 */ 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x4B, 0x06, 0x0F, 0x1B, 0x00, 0x06, -/* 0000FF70 */ 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x07, -/* 0000FF80 */ 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000FF90 */ 0x09, 0x00, 0x00, 0x00, 0x07, 0x03, 0x00, 0x6D, 0x06, 0x07, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000FFA0 */ 0x07, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, -/* 0000FFB0 */ 0x4B, 0x08, 0x5C, 0x02, 0x08, 0xF2, 0x03, 0x06, 0x06, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x44, -/* 0000FFC0 */ 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5B, 0x02, 0xFE, -/* 0000FFD0 */ 0x37, 0x02, 0x00, 0xFE, 0x0C, 0x54, 0x05, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x29, 0x00, 0x15, -/* 0000FFE0 */ 0x00, 0x25, 0x00, 0x18, 0x00, 0x2F, 0x00, 0x3D, 0x00, 0x48, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, -/* 0000FFF0 */ 0x00, 0xFC, 0x07, 0xFE, 0x09, 0x03, 0xFE, 0xA8, 0x01, 0x04, 0xFF, 0xA1, 0x41, 0xC1, 0x00, 0x1D, -/* 00010000 */ 0x00, 0xFE, 0xD6, 0x40, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD6, 0x40, 0xFE, 0xFE, -/* 00010010 */ 0x12, 0xFE, 0xFE, 0x12, 0x41, 0x17, 0x25, 0x38, 0x04, 0xAF, 0x9B, 0x01, 0x03, 0x01, 0xFF, 0xFF, -/* 00010020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, -/* 00010030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 00010040 */ 0x00, 0xFE, 0x63, 0x03, 0x02, 0x00, 0xFE, 0x64, 0x03, 0x02, 0x00, 0xFE, 0x65, 0x03, 0x02, 0x01, -/* 00010050 */ 0xFE, 0x66, 0x03, 0x02, 0x01, 0xFE, 0x67, 0x03, 0x02, 0x00, 0xFE, 0x68, 0x03, 0x02, 0x00, 0xFE, -/* 00010060 */ 0x69, 0x03, 0x02, 0x00, 0xFE, 0x6A, 0x03, 0x02, 0x00, 0xFE, 0x6B, 0x03, 0x02, 0x00, 0xFE, 0x6C, -/* 00010070 */ 0x03, 0x02, 0x00, 0xFE, 0x6D, 0x03, 0x02, 0x00, 0xFE, 0x6E, 0x03, 0x02, 0x00, 0xFE, 0x6F, 0x03, -/* 00010080 */ 0x02, 0x00, 0xFE, 0x70, 0x03, 0x02, 0x00, 0xFE, 0x71, 0x03, 0x02, 0x00, 0xFE, 0x72, 0x03, 0x02, -/* 00010090 */ 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x73, 0x03, 0x02, 0x00, 0xFE, 0x74, 0x03, 0x02, 0x00, -/* 000100A0 */ 0xFE, 0x75, 0x03, 0x02, 0x00, 0xFE, 0x76, 0x03, 0x02, 0x00, 0xFE, 0x77, 0x03, 0x02, 0x00, 0xFE, -/* 000100B0 */ 0x78, 0x03, 0x02, 0x00, 0xFE, 0x79, 0x03, 0x02, 0x00, 0xFE, 0x7A, 0x03, 0x02, 0x00, 0xFE, 0x7B, -/* 000100C0 */ 0x03, 0x02, 0x00, 0xFE, 0x7C, 0x03, 0x02, 0x00, 0xFE, 0x7D, 0x03, 0x02, 0x00, 0xFE, 0x7E, 0x03, -/* 000100D0 */ 0x02, 0x00, 0xFE, 0x7F, 0x03, 0x02, 0x00, 0xFE, 0x80, 0x03, 0x02, 0x00, 0xFE, 0x81, 0x03, 0x02, -/* 000100E0 */ 0x00, 0xFE, 0x82, 0x03, 0x02, 0x00, 0xFE, 0x83, 0x03, 0x02, 0x01, 0xFE, 0x84, 0x03, 0xFE, 0xBD, -/* 000100F0 */ 0x02, 0x4F, 0x25, 0x4F, 0x26, 0x4F, 0x27, 0x4F, 0x28, 0x4F, 0x29, 0x4F, 0x2A, 0x4F, 0x2B, 0x4F, -/* 00010100 */ 0x2C, 0x4F, 0x2D, 0x4F, 0x2E, 0x4F, 0x2F, 0x4F, 0x30, 0x4F, 0x31, 0x4F, 0x32, 0x4F, 0x33, 0x4F, -/* 00010110 */ 0x34, 0x4F, 0x35, 0x4F, 0x36, 0x54, 0x25, 0x02, 0x54, 0x26, 0x03, 0x47, 0x38, 0x04, 0x01, 0x04, -/* 00010120 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 00010130 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x06, 0x54, 0x27, 0x38, 0x54, 0x28, 0x07, 0x2F, 0x38, -/* 00010140 */ 0x08, 0x09, 0x54, 0x29, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x28, 0x2F, 0x38, 0x38, -/* 00010150 */ 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x29, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, -/* 00010160 */ 0x38, 0x0B, 0x54, 0x2A, 0x38, 0x47, 0x38, 0x0C, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, -/* 00010170 */ 0x39, 0x2F, 0x38, 0x38, 0x0D, 0x54, 0x2B, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 00010180 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0E, 0x54, 0x2C, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 00010190 */ 0x01, 0x39, 0x2C, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0F, 0x01, 0x04, 0x01, 0x39, 0x27, -/* 000101A0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x10, 0x54, 0x2D, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 000101B0 */ 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x11, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 000101C0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x12, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, -/* 000101D0 */ 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2E, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 000101E0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x14, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, -/* 000101F0 */ 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2F, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 00010200 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x15, 0x54, 0x30, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 00010210 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x16, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 00010220 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x17, 0x54, 0x31, 0x38, 0x47, 0x39, 0x12, 0x01, 0x04, -/* 00010230 */ 0x01, 0x3A, 0x25, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x18, 0xFC, 0x38, 0x0A, 0x39, 0x05, -/* 00010240 */ 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x31, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1A, -/* 00010250 */ 0x47, 0x3A, 0x05, 0x01, 0x04, 0x01, 0x3B, 0x25, 0x2F, 0x3A, 0x3A, 0x3B, 0x2F, 0x3A, 0x3A, 0x1B, -/* 00010260 */ 0xFE, 0x38, 0x39, 0x3A, 0x02, 0xFD, 0x38, 0x0B, 0x04, 0x54, 0x32, 0x38, 0x47, 0x38, 0x1C, 0x01, -/* 00010270 */ 0x04, 0x01, 0x39, 0x32, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x47, 0x39, 0x1D, 0x01, -/* 00010280 */ 0x04, 0x01, 0x3A, 0x30, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, -/* 00010290 */ 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x2F, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, -/* 000102A0 */ 0x2F, 0x38, 0x38, 0x39, 0x54, 0x33, 0x38, 0x47, 0x38, 0x19, 0x01, 0x04, 0x01, 0x39, 0x2E, 0x2F, -/* 000102B0 */ 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x1F, 0x47, 0x39, 0x20, 0x01, 0x04, 0x01, 0x3A, 0x2D, 0x2F, -/* 000102C0 */ 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x21, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x19, 0x01, 0x04, -/* 000102D0 */ 0x01, 0x3A, 0x2B, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x22, 0x2F, 0x38, 0x38, 0x39, 0x54, -/* 000102E0 */ 0x34, 0x38, 0x47, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x33, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, -/* 000102F0 */ 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x34, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x23, 0x54, -/* 00010300 */ 0x35, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x35, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, -/* 00010310 */ 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, -/* 00010320 */ 0x04, 0x01, 0x39, 0x2A, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x36, 0x38, 0x8F, -/* 00010330 */ 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x01, -/* 00010340 */ 0x33, 0x5D, 0x02, 0x24, 0x00, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, -/* 00010350 */ 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x38, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, -/* 00010360 */ 0x00, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x34, 0x5D, 0x02, 0x24, 0x01, 0x00, 0xC3, -/* 00010370 */ 0x03, 0x38, 0x38, 0x01, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, -/* 00010380 */ 0x38, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, -/* 00010390 */ 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x24, 0x02, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x02, 0x00, 0x01, 0x32, -/* 000103A0 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 000103B0 */ 0x00, 0xFE, 0xB6, 0x45, 0x16, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x1F, -/* 000103C0 */ 0x00, 0x20, 0x00, 0x33, 0x00, 0x03, 0x00, 0x77, 0x00, 0x07, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x44, -/* 000103D0 */ 0x00, 0x13, 0x00, 0x7D, 0x00, 0x13, 0x00, 0x94, 0x00, 0x20, 0x00, 0x83, 0x00, 0x2D, 0x00, 0x83, -/* 000103E0 */ 0x00, 0x20, 0x00, 0x74, 0x00, 0x13, 0x00, 0x6A, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x41, 0x00, 0x00, -/* 000103F0 */ 0x04, 0x3B, 0x00, 0x4C, 0x01, 0x3B, 0x00, 0x5A, 0x01, 0x20, 0x00, 0x4B, 0x00, 0x2D, 0x00, 0x6E, -/* 00010400 */ 0x00, 0x29, 0x00, 0x66, 0x00, 0x29, 0x00, 0x8B, 0x00, 0x2B, 0x00, 0x72, 0x00, 0x00, 0xBF, 0xDC, -/* 00010410 */ 0x02, 0x00, 0x80, 0xFC, 0x07, 0xFE, 0x08, 0x03, 0xFE, 0xA1, 0x01, 0x04, 0xFF, 0xA1, 0x41, 0xC1, -/* 00010420 */ 0x00, 0x1C, 0x00, 0xFE, 0x99, 0x3F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x99, 0x3F, -/* 00010430 */ 0x55, 0x55, 0x41, 0x02, 0x02, 0x03, 0x05, 0x05, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010440 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010450 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x13, 0xE0, 0x03, 0x00, 0x01, -/* 00010460 */ 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x03, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 00010470 */ 0x00, 0x00, 0x0A, 0xFE, 0x62, 0x03, 0x01, 0xFE, 0xC7, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x11, -/* 00010480 */ 0x00, 0x26, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x07, 0x03, 0xFE, 0x90, -/* 00010490 */ 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1B, 0x00, 0xFE, 0x34, 0x3D, 0xFF, 0x00, 0x10, 0x01, -/* 000104A0 */ 0x00, 0x06, 0x06, 0xFE, 0x34, 0x3D, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x0C, 0x07, 0x0F, -/* 000104B0 */ 0x08, 0x3C, 0x3B, 0x01, 0x01, 0x06, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000104C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000104D0 */ 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x04, 0x02, -/* 000104E0 */ 0x01, 0xFE, 0x5F, 0x03, 0x02, 0x00, 0xFE, 0x60, 0x03, 0x02, 0x01, 0xFE, 0x61, 0x03, 0xFE, 0x12, -/* 000104F0 */ 0x01, 0x4F, 0x0C, 0x4F, 0x0D, 0x98, 0x10, 0x07, 0x08, 0x00, 0x00, 0x54, 0x0C, 0x10, 0x2C, 0x10, -/* 00010500 */ 0x0C, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0xF0, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, -/* 00010510 */ 0x00, 0x00, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, -/* 00010520 */ 0x01, 0x0C, 0xF2, 0x02, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0D, 0x10, 0x8F, -/* 00010530 */ 0x01, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00010540 */ 0x03, 0x5C, 0x01, 0x0D, 0xEE, 0x02, 0x10, 0x10, 0x01, 0x00, 0x0F, 0x13, 0x00, 0x10, 0x09, 0x00, -/* 00010550 */ 0x00, 0x12, 0x0B, 0x00, 0x0D, 0x09, 0x09, 0x00, 0x00, 0x11, 0x03, 0x00, 0x0D, 0x0A, 0x09, 0x6F, -/* 00010560 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x6D, 0x10, 0x11, -/* 00010570 */ 0x01, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, -/* 00010580 */ 0x12, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x12, 0x12, -/* 00010590 */ 0x03, 0x00, 0x5C, 0x01, 0x12, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x03, -/* 000105A0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x08, 0xEE, 0x02, 0x12, 0x12, 0x04, 0x00, -/* 000105B0 */ 0x5C, 0x02, 0x12, 0x2F, 0x12, 0x04, 0x09, 0x2F, 0x12, 0x12, 0x05, 0x2F, 0x12, 0x12, 0x0A, 0x2F, -/* 000105C0 */ 0x12, 0x12, 0x06, 0x5C, 0x03, 0x12, 0xF2, 0x04, 0xFF, 0x10, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 000105D0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x6D, 0x10, 0x11, 0x02, -/* 000105E0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, -/* 000105F0 */ 0x00, 0x05, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, -/* 00010600 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, 0x02, 0x1F, 0x00, 0xFE, 0x86, 0x3D, -/* 00010610 */ 0x08, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x33, 0x00, 0x26, 0x00, 0x41, -/* 00010620 */ 0x00, 0x32, 0x00, 0x65, 0x00, 0x6F, 0x00, 0x8D, 0x00, 0x29, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1F, -/* 00010630 */ 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x06, 0x03, 0xFE, 0x76, 0x01, 0x04, -/* 00010640 */ 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1A, 0x00, 0xFE, 0x17, 0x3A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, -/* 00010650 */ 0x06, 0xFE, 0x17, 0x3A, 0xFE, 0x17, 0x03, 0xFE, 0x17, 0x03, 0x01, 0x0B, 0x0A, 0x11, 0x0A, 0x51, -/* 00010660 */ 0x4B, 0x01, 0x01, 0x08, 0x06, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010670 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010680 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x58, 0x03, 0x02, -/* 00010690 */ 0x01, 0xFE, 0x59, 0x03, 0x02, 0x01, 0xFE, 0x5A, 0x03, 0x04, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, -/* 000106A0 */ 0x00, 0xFE, 0x5B, 0x03, 0x02, 0x00, 0xFE, 0x5C, 0x03, 0x02, 0x00, 0xFE, 0x5D, 0x03, 0xFE, 0x84, -/* 000106B0 */ 0x01, 0x4F, 0x0F, 0x98, 0x11, 0x0A, 0x0B, 0x00, 0x00, 0x47, 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, -/* 000106C0 */ 0x00, 0x0F, 0x11, 0x09, 0x65, 0x01, 0x0C, 0x03, 0x00, 0x0C, 0x02, 0x09, 0x26, 0x00, 0x8F, 0x01, -/* 000106D0 */ 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x00, 0x07, 0x02, -/* 000106E0 */ 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000106F0 */ 0x00, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 00010700 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x01, 0x07, 0x02, 0x00, 0x5C, -/* 00010710 */ 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, -/* 00010720 */ 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x04, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, -/* 00010730 */ 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, -/* 00010740 */ 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x0F, 0x11, -/* 00010750 */ 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0D, 0x11, 0x09, 0xCB, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, -/* 00010760 */ 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x01, 0x00, 0x00, -/* 00010770 */ 0x00, 0x1D, 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x0D, 0x5C, 0x03, -/* 00010780 */ 0x0F, 0xEE, 0x04, 0x11, 0x11, 0x03, 0x00, 0x0C, 0x03, 0x00, 0x11, 0x06, 0x09, 0x96, 0x00, 0x8F, -/* 00010790 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x6D, 0x11, 0x12, 0x03, 0x07, -/* 000107A0 */ 0x04, 0x00, 0x5C, 0x00, 0x12, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x04, -/* 000107B0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x13, 0x13, 0x05, 0x00, -/* 000107C0 */ 0x5C, 0x01, 0x13, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x04, 0x00, 0x07, -/* 000107D0 */ 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0B, 0xEE, 0x02, 0x13, 0x13, 0x06, 0x00, 0x5C, 0x02, -/* 000107E0 */ 0x13, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x07, 0x04, 0x00, -/* 000107F0 */ 0x5C, 0x00, 0x05, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x14, 0x05, 0x00, 0x5C, -/* 00010800 */ 0x01, 0x14, 0x5C, 0x02, 0x0D, 0x5D, 0x03, 0x08, 0x07, 0x00, 0xEE, 0x04, 0x13, 0x13, 0x07, 0x00, -/* 00010810 */ 0x2F, 0x13, 0x07, 0x13, 0x2F, 0x13, 0x13, 0x09, 0x5C, 0x03, 0x13, 0xF2, 0x04, 0xFF, 0x11, 0x03, -/* 00010820 */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x00, 0x0F, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0x09, 0x02, -/* 00010830 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5A, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x5C, 0x02, -/* 00010840 */ 0xFE, 0x5D, 0x02, 0x00, 0xFE, 0x5F, 0x3A, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x28, 0x00, -/* 00010850 */ 0x0A, 0x00, 0x27, 0x00, 0x08, 0x00, 0x29, 0x00, 0x26, 0x00, 0x45, 0x00, 0x08, 0x00, 0x28, 0x00, -/* 00010860 */ 0x26, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x28, 0x00, 0x26, 0x00, 0x3D, 0x00, 0x3F, 0x00, 0x6B, 0x00, -/* 00010870 */ 0x96, 0x00, 0xA6, 0x00, 0x06, 0x00, 0x21, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x3F, 0xFC, 0x22, -/* 00010880 */ 0x04, 0x4F, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x4B, 0x01, 0x14, 0xFF, 0xA0, 0x41, -/* 00010890 */ 0xD1, 0x00, 0x13, 0x00, 0xFE, 0x06, 0x35, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, -/* 000108A0 */ 0x06, 0x35, 0xFE, 0xE0, 0x04, 0xFE, 0xE0, 0x04, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, 0x01, 0x01, -/* 000108B0 */ 0x01, 0x06, 0x06, 0x06, 0x06, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000108C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000108D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x52, 0x03, 0x02, 0x01, 0xFE, 0x53, -/* 000108E0 */ 0x03, 0x02, 0x01, 0xFE, 0x54, 0x03, 0x02, 0x01, 0xFE, 0x55, 0x03, 0x02, 0x01, 0xFE, 0x56, 0x03, -/* 000108F0 */ 0x02, 0x01, 0xFE, 0x57, 0x03, 0x03, 0x04, 0x8E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, -/* 00010900 */ 0x00, 0x0B, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00010910 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, -/* 00010920 */ 0x00, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x01, -/* 00010930 */ 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x02, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x02, 0x01, -/* 00010940 */ 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x03, 0x01, 0x64, -/* 00010950 */ 0x01, 0x0D, 0x0C, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x04, 0x01, 0x64, 0x01, -/* 00010960 */ 0x0D, 0x0C, 0xD4, 0x05, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x05, 0x01, 0x64, 0x01, 0x0D, -/* 00010970 */ 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x08, 0x00, 0x00, 0xEE, 0x03, 0x00, 0x0B, 0x00, 0x00, 0x09, -/* 00010980 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, -/* 00010990 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x5B, 0x02, 0x00, 0x00, 0x5C, 0x02, 0x00, -/* 000109A0 */ 0x00, 0x5A, 0x02, 0x00, 0x00, 0x5F, 0x02, 0x00, 0x00, 0x57, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x52, -/* 000109B0 */ 0x03, 0xFE, 0x5B, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x5A, 0x02, 0xFE, 0x5F, 0x02, 0xFE, 0x57, 0x03, -/* 000109C0 */ 0x00, 0xFE, 0x1C, 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0xC9, 0x04, 0x00, 0xE1, 0x0D, -/* 000109D0 */ 0x01, 0x00, 0x49, 0x0D, 0x01, 0x00, 0xB1, 0x0C, 0x01, 0x00, 0x19, 0x0C, 0x01, 0x00, 0xCA, 0x0A, -/* 000109E0 */ 0x01, 0x00, 0xE6, 0x09, 0x01, 0x00, 0xBF, 0xFC, 0x23, 0x0C, 0x00, 0xFC, 0x07, 0xFE, 0x57, 0x03, -/* 000109F0 */ 0xFE, 0x69, 0x01, 0x19, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x19, 0x00, 0xFE, 0x9A, 0x38, 0xFF, 0x00, -/* 00010A00 */ 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x9A, 0x38, 0xFE, 0x35, 0x01, 0xFE, 0x35, 0x01, 0x01, 0x05, -/* 00010A10 */ 0x04, 0x07, 0x05, 0x1C, 0x1A, 0x19, 0x01, 0x02, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010A20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010A30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x6A, 0x00, 0x04, 0x08, 0x6E, -/* 00010A40 */ 0xEB, 0x00, 0xEC, 0x00, 0x0F, 0x03, 0x00, 0x04, 0x09, 0x5D, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00010A50 */ 0x0C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x01, 0x00, -/* 00010A60 */ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x04, 0x5C, -/* 00010A70 */ 0x03, 0x05, 0xEE, 0x04, 0x07, 0x07, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x08, 0x00, 0x47, -/* 00010A80 */ 0x00, 0x03, 0xED, 0x00, 0x09, 0x25, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, -/* 00010A90 */ 0x07, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0xEE, 0x02, 0x07, 0x07, -/* 00010AA0 */ 0x01, 0x00, 0x47, 0x04, 0x07, 0x09, 0x9A, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 00010AB0 */ 0x00, 0xFE, 0xEF, 0x38, 0x05, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x19, 0x00, 0x34, 0x00, 0x54, -/* 00010AC0 */ 0x00, 0x08, 0x00, 0x37, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x00, 0xBF, 0xFC, 0xA2, 0x04, 0x0F, 0xFC, -/* 00010AD0 */ 0x07, 0xFE, 0x56, 0x03, 0xFE, 0x60, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x18, 0x00, 0xFE, -/* 00010AE0 */ 0x83, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x83, 0x37, 0xFB, 0xFB, 0x01, 0x09, -/* 00010AF0 */ 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x05, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, -/* 00010B00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, -/* 00010B10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, -/* 00010B20 */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xC8, 0x8F, -/* 00010B30 */ 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00010B40 */ 0x02, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x47, 0x07, 0x0A, 0x47, 0x08, 0x03, -/* 00010B50 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 00010B60 */ 0x00, 0x02, 0x5C, 0x01, 0x07, 0xEE, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x0F, 0x7E, 0x00, 0x0A, 0x09, -/* 00010B70 */ 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x07, 0x02, -/* 00010B80 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0xEE, 0x02, 0x0A, 0x0A, 0x02, 0x00, 0x0F, 0x03, 0x00, -/* 00010B90 */ 0x0A, 0x09, 0x59, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x0B, 0x03, 0x00, -/* 00010BA0 */ 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x47, 0x0C, 0x07, 0x8F, 0x01, 0x00, -/* 00010BB0 */ 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x6D, 0x0D, 0x0E, 0x01, 0x07, 0x03, 0x00, -/* 00010BC0 */ 0x5C, 0x00, 0x0E, 0x5D, 0x01, 0x04, 0x04, 0x00, 0x5D, 0x02, 0x05, 0x04, 0x00, 0xF2, 0x03, 0x0D, -/* 00010BD0 */ 0x0D, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x34, 0x0C, 0x0C, 0x0D, 0x00, 0x00, 0x5C, 0x01, 0x0C, -/* 00010BE0 */ 0xF2, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x08, 0x0A, 0x47, 0x00, 0x08, -/* 00010BF0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x17, 0x25, 0x00, 0xFE, 0xA2, 0x37, 0x06, -/* 00010C00 */ 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x29, 0x00, 0x03, 0x00, 0x19, 0x00, 0x44, 0x00, 0x38, 0x00, -/* 00010C10 */ 0x59, 0x00, 0x49, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFC, 0x07, -/* 00010C20 */ 0xFE, 0x55, 0x03, 0xFE, 0x5C, 0x01, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x17, 0x00, 0xFE, 0x0D, -/* 00010C30 */ 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0D, 0x37, 0x5D, 0x5D, 0x01, 0x03, 0x03, -/* 00010C40 */ 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010C50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010C60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, -/* 00010C70 */ 0x05, 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -/* 00010C80 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, -/* 00010C90 */ 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 00010CA0 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x2C, 0x37, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x3D, 0x00, -/* 00010CB0 */ 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x54, 0x03, 0xFE, 0x58, 0x01, 0x16, 0xFF, -/* 00010CC0 */ 0xA2, 0x41, 0xC1, 0x00, 0x16, 0x00, 0xFE, 0x96, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00010CD0 */ 0xFE, 0x96, 0x36, 0x56, 0x56, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, -/* 00010CE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, -/* 00010CF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00010D00 */ 0x04, 0x37, 0xA8, 0x05, 0x14, 0x03, 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, 0x47, 0x00, -/* 00010D10 */ 0x05, 0x09, 0x1E, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -/* 00010D20 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, -/* 00010D30 */ 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xB5, 0x36, 0x02, -/* 00010D40 */ 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x36, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFC, 0x07, -/* 00010D50 */ 0xFE, 0x53, 0x03, 0xFE, 0x54, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x15, 0x00, 0xFE, 0x21, -/* 00010D60 */ 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x21, 0x36, 0x5C, 0x5C, 0x01, 0x03, 0x03, -/* 00010D70 */ 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010D80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010D90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, -/* 00010DA0 */ 0x05, 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -/* 00010DB0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, -/* 00010DC0 */ 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 00010DD0 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x40, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x3C, 0x00, -/* 00010DE0 */ 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x52, 0x03, 0xFE, 0x4D, 0x01, 0x16, 0xFF, -/* 00010DF0 */ 0xA2, 0x41, 0xC1, 0x00, 0x14, 0x00, 0xFE, 0x48, 0x35, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00010E00 */ 0xFE, 0x48, 0x35, 0xC0, 0xC0, 0x01, 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x02, 0x01, -/* 00010E10 */ 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010E20 */ 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010E30 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x5F, 0x14, 0x03, 0x00, 0x04, 0x02, 0x09, 0x20, 0x00, 0x8F, -/* 00010E40 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, 0x00, 0x07, -/* 00010E50 */ 0x01, 0x00, 0x5C, 0x00, 0x07, 0xF2, 0x01, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, -/* 00010E60 */ 0x06, 0x15, 0x03, 0x00, 0x04, 0x06, 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, -/* 00010E70 */ 0x00, 0x00, 0x06, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0xEE, 0x02, -/* 00010E80 */ 0x06, 0x06, 0x01, 0x00, 0x47, 0x00, 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, 0x06, 0x09, -/* 00010E90 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0x00, 0xFE, 0x67, 0x35, 0x04, -/* 00010EA0 */ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x26, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x35, 0x00, 0x3C, 0x00, -/* 00010EB0 */ 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x8F, 0xFD, 0x07, 0xFE, 0x28, 0x03, 0xFE, 0x30, 0x01, 0x20, 0xFF, -/* 00010EC0 */ 0xA0, 0x41, 0xC1, 0x00, 0x12, 0x00, 0xFE, 0x7F, 0x31, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 00010ED0 */ 0xFE, 0x7F, 0x31, 0xFE, 0x70, 0x03, 0xFE, 0x70, 0x03, 0x01, 0x07, 0x05, 0x08, 0x06, 0x41, 0x41, -/* 00010EE0 */ 0x01, 0x02, 0x05, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010EF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, -/* 00010F00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, -/* 00010F10 */ 0x00, 0x00, 0xFE, 0x55, 0x01, 0x4F, 0x05, 0x4F, 0x06, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, -/* 00010F20 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x11, 0x00, 0x8F, 0x01, -/* 00010F30 */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x29, 0x01, 0x8F, -/* 00010F40 */ 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x4B, 0x09, 0x0F, 0x03, 0x00, -/* 00010F50 */ 0x09, 0x09, 0xAC, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, -/* 00010F60 */ 0x4B, 0x09, 0x0F, 0x1B, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, -/* 00010F70 */ 0x00, 0x00, 0x09, 0x03, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x09, 0x00, -/* 00010F80 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x4B, 0x09, 0x07, -/* 00010F90 */ 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x09, 0x09, 0x01, 0x00, 0x54, 0x05, 0x09, 0x8F, 0x01, -/* 00010FA0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, -/* 00010FB0 */ 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, -/* 00010FC0 */ 0x0B, 0x02, 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, -/* 00010FD0 */ 0x02, 0x00, 0x54, 0x06, 0x09, 0x0F, 0x03, 0x00, 0x06, 0x09, 0x15, 0x00, 0x98, 0x09, 0x06, 0x03, -/* 00010FE0 */ 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x09, 0x0C, -/* 00010FF0 */ 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x05, 0x09, 0x55, 0x00, -/* 00011000 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x6D, 0x09, 0x0A, 0x00, -/* 00011010 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x0B, -/* 00011020 */ 0x04, 0x00, 0x4B, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0B, 0x0B, 0x04, 0x00, -/* 00011030 */ 0x5C, 0x01, 0x0B, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, -/* 00011040 */ 0x00, 0x03, 0x00, 0x98, 0x09, 0x09, 0x04, 0x01, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 00011050 */ 0x40, 0x00, 0x00, 0x00, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00011060 */ 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, -/* 00011070 */ 0x09, 0xFE, 0x51, 0x03, 0x00, 0xFE, 0x95, 0x31, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x15, 0x00, 0x2B, -/* 00011080 */ 0x00, 0x11, 0x00, 0x33, 0x00, 0x15, 0x00, 0x26, 0x00, 0x15, 0x00, 0x29, 0x00, 0x18, 0x00, 0x33, -/* 00011090 */ 0x00, 0x1D, 0x00, 0x2C, 0x00, 0x37, 0x00, 0x4D, 0x00, 0x07, 0x00, 0x5B, 0x00, 0x15, 0x00, 0x49, -/* 000110A0 */ 0x00, 0x0F, 0x00, 0xCB, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x13, 0x00, 0x24, 0x00, 0x00, 0xBF, 0xFC, -/* 000110B0 */ 0x2B, 0x0C, 0x0F, 0xFC, 0x07, 0xFE, 0x27, 0x03, 0xFE, 0x1E, 0x01, 0x19, 0xFF, 0xA2, 0x41, 0xC1, -/* 000110C0 */ 0x00, 0x11, 0x00, 0xFE, 0x5C, 0x2E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x5C, 0x2E, -/* 000110D0 */ 0xFE, 0x91, 0x02, 0xFE, 0x91, 0x02, 0x01, 0x0C, 0x06, 0x10, 0x06, 0x41, 0x36, 0x18, 0x01, 0x01, -/* 000110E0 */ 0x04, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000110F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011100 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x76, 0xCD, 0x00, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x04, -/* 00011110 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFA, 0xA8, 0x0D, 0xA8, 0x0E, 0x14, -/* 00011120 */ 0x03, 0x00, 0x07, 0x02, 0x09, 0x12, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, -/* 00011130 */ 0x11, 0x00, 0x00, 0x47, 0x10, 0x11, 0x09, 0x0F, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2B, 0x00, -/* 00011140 */ 0x00, 0x00, 0x11, 0x01, 0x00, 0x47, 0x10, 0x11, 0x47, 0x0A, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00011150 */ 0x0B, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, -/* 00011160 */ 0xEE, 0x02, 0x10, 0x10, 0x00, 0x00, 0x47, 0x0B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0xEE, -/* 00011170 */ 0x01, 0x10, 0x09, 0x01, 0x00, 0x47, 0x0C, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0B, 0x10, 0x09, -/* 00011180 */ 0x06, 0x00, 0x47, 0x10, 0x0B, 0x09, 0x03, 0x00, 0x47, 0x10, 0x04, 0x47, 0x0B, 0x10, 0x47, 0x0D, -/* 00011190 */ 0x04, 0xEB, 0x00, 0xEC, 0x00, 0x12, 0x03, 0x00, 0x0D, 0x0B, 0x09, 0x49, 0x00, 0x8F, 0x01, 0x00, -/* 000111A0 */ 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x98, -/* 000111B0 */ 0x11, 0x06, 0x0D, 0x00, 0x00, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x08, 0x5C, 0x04, -/* 000111C0 */ 0x0C, 0xEE, 0x05, 0x10, 0x10, 0x02, 0x00, 0x47, 0x0E, 0x10, 0x62, 0x10, 0x0E, 0x00, 0xA8, 0x11, -/* 000111D0 */ 0x15, 0x03, 0x00, 0x10, 0x11, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0xED, 0x00, 0x09, 0x33, 0x00, -/* 000111E0 */ 0x28, 0x0D, 0x0D, 0x09, 0xAD, 0xFF, 0xED, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, -/* 000111F0 */ 0x00, 0x10, 0x03, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0A, -/* 00011200 */ 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x5C, 0x04, 0x0C, 0xEE, 0x05, 0x00, 0x10, 0x03, 0x00, 0x09, 0x02, -/* 00011210 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x02, 0x00, 0xFE, 0xAB, 0x2E, 0x0C, 0x04, -/* 00011220 */ 0x00, 0x00, 0x00, 0x2C, 0x00, 0x58, 0x00, 0x1E, 0x00, 0x34, 0x00, 0x0F, 0x00, 0x32, 0x00, 0x16, -/* 00011230 */ 0x00, 0x39, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x2D, 0x00, 0x69, 0x00, 0x0E, -/* 00011240 */ 0x00, 0x35, 0x00, 0x08, 0x00, 0x4F, 0xFF, 0x08, 0x00, 0xE2, 0x00, 0x2B, 0x00, 0x51, 0x00, 0x00, -/* 00011250 */ 0x3F, 0xFD, 0x6A, 0x04, 0xCF, 0xFD, 0x0F, 0xFE, 0x26, 0x03, 0xE6, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, -/* 00011260 */ 0x00, 0x0E, 0x00, 0xFE, 0xB0, 0x24, 0x02, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0xB0, -/* 00011270 */ 0x24, 0xFE, 0x91, 0x09, 0xFE, 0x91, 0x09, 0x03, 0x0E, 0x0B, 0x15, 0x05, 0x71, 0x6A, 0x01, 0x01, -/* 00011280 */ 0x09, 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011290 */ 0x13, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, -/* 000112A0 */ 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, -/* 000112B0 */ 0x02, 0x00, 0xFE, 0x48, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0x4A, 0x03, 0x02, -/* 000112C0 */ 0x01, 0xFE, 0x4B, 0x03, 0xFE, 0x2E, 0x02, 0x96, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x96, 0x04, 0x00, -/* 000112D0 */ 0x00, 0x00, 0x0D, 0x4F, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x00, -/* 000112E0 */ 0x00, 0x6D, 0x16, 0x17, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x17, 0x93, 0x03, 0x00, 0x00, 0x00, -/* 000112F0 */ 0x18, 0x01, 0x00, 0x5C, 0x01, 0x18, 0xF2, 0x02, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00011300 */ 0x47, 0x0F, 0x16, 0x14, 0x03, 0x00, 0x0F, 0x02, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00011310 */ 0x2D, 0x00, 0x00, 0x00, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x03, 0x00, -/* 00011320 */ 0x00, 0x00, 0x17, 0x01, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0x16, 0x16, 0x01, 0x00, 0x47, 0x0F, -/* 00011330 */ 0x16, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x33, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -/* 00011340 */ 0x00, 0x16, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1C, -/* 00011350 */ 0x00, 0x00, 0x00, 0x17, 0x04, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x00, 0x00, 0x00, -/* 00011360 */ 0x00, 0x17, 0x5C, 0x03, 0x17, 0xEE, 0x04, 0xFF, 0x16, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00011370 */ 0x09, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x6D, 0x16, 0x17, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00011380 */ 0x17, 0x93, 0x03, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x5C, 0x01, 0x18, 0xE0, 0x18, 0x00, 0x5C, -/* 00011390 */ 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x98, 0x16, 0x16, 0x04, -/* 000113A0 */ 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x03, -/* 000113B0 */ 0x00, 0x00, 0x00, 0x16, 0x01, 0x00, 0x5C, 0x01, 0x16, 0x5C, 0x02, 0x0E, 0xEE, 0x03, 0x16, 0x0C, -/* 000113C0 */ 0x04, 0x00, 0x47, 0x10, 0x16, 0x93, 0x04, 0x00, 0x00, 0x00, 0x16, 0x05, 0x00, 0xA8, 0x17, 0x15, -/* 000113D0 */ 0x03, 0x00, 0x16, 0x17, 0x09, 0x49, 0x00, 0xCE, 0x16, 0x00, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, -/* 000113E0 */ 0x00, 0x16, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x03, 0x00, 0x07, 0x04, -/* 000113F0 */ 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x17, 0x04, 0x00, -/* 00011400 */ 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x01, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x03, 0x17, 0xEE, -/* 00011410 */ 0x04, 0xFF, 0x16, 0x05, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, 0x47, 0x0F, 0x16, -/* 00011420 */ 0x54, 0x11, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x86, 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x43, -/* 00011430 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x16, 0x07, 0x00, 0x07, 0x02, 0x00, -/* 00011440 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x16, 0x16, 0x06, 0x00, 0x11, 0x03, 0x00, 0x16, -/* 00011450 */ 0x05, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x16, 0x08, 0x00, -/* 00011460 */ 0x4B, 0x16, 0x0F, 0x03, 0x00, 0x16, 0x09, 0x07, 0x00, 0x2F, 0x10, 0x10, 0x06, 0x09, 0x04, 0x00, -/* 00011470 */ 0x2F, 0x10, 0x10, 0x07, 0x47, 0x16, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 00011480 */ 0x17, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x00, -/* 00011490 */ 0x00, 0x00, 0x18, 0x09, 0x00, 0x5C, 0x01, 0x18, 0x5C, 0x02, 0x0F, 0x5D, 0x03, 0x06, 0x07, 0x00, -/* 000114A0 */ 0xEE, 0x04, 0x17, 0x17, 0x07, 0x00, 0x2F, 0x16, 0x16, 0x17, 0x47, 0x10, 0x16, 0x09, 0x05, 0x00, -/* 000114B0 */ 0xA8, 0x16, 0x47, 0x10, 0x16, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x16, 0x0A, -/* 000114C0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000114D0 */ 0x17, 0x00, 0x00, 0x00, 0x7B, 0x10, 0x17, 0x02, 0x7B, 0x0F, 0x17, 0x03, 0x7B, 0x11, 0x17, 0x04, -/* 000114E0 */ 0x5C, 0x01, 0x17, 0x5D, 0x02, 0x02, 0x08, 0x00, 0xEE, 0x03, 0x00, 0x16, 0x08, 0x00, 0x09, 0x02, -/* 000114F0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, -/* 00011500 */ 0x00, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x6D, 0x02, 0x00, 0x00, -/* 00011510 */ 0x00, 0xFE, 0x2C, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x6D, 0x02, -/* 00011520 */ 0xFE, 0x4C, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x4D, 0x03, 0x00, 0x0D, 0xFE, 0x4E, 0x03, 0x00, 0xFE, -/* 00011530 */ 0xF4, 0x24, 0x15, 0x0E, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x36, 0x00, 0x08, 0x00, 0x81, 0x00, 0x26, -/* 00011540 */ 0x00, 0x3A, 0x00, 0x07, 0x00, 0x1B, 0x00, 0x33, 0x00, 0x53, 0x02, 0x3D, 0x00, 0x49, 0x00, 0x1D, -/* 00011550 */ 0x00, 0x37, 0x00, 0x12, 0x00, 0x50, 0x00, 0x0B, 0x00, 0x1F, 0x00, 0x33, 0x00, 0xB8, 0x01, 0x0B, -/* 00011560 */ 0x00, 0xF9, 0x00, 0x03, 0x00, 0x29, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x3E, 0x00, 0x15, -/* 00011570 */ 0x00, 0x2E, 0x00, 0x07, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x5C, 0x00, 0x05, -/* 00011580 */ 0x00, 0x29, 0x00, 0x3E, 0x00, 0x99, 0x00, 0x00, 0xCC, 0x16, 0x01, 0x00, 0x90, 0x15, 0x01, 0x00, -/* 00011590 */ 0xBF, 0xFC, 0x2A, 0x04, 0x8F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x3D, 0xFF, 0xA2, -/* 000115A0 */ 0x41, 0xD1, 0x00, 0x10, 0x00, 0xFE, 0x73, 0x29, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 000115B0 */ 0x73, 0x29, 0xFE, 0x77, 0x01, 0xFE, 0x77, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, 0x02, -/* 000115C0 */ 0x01, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000115D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000115E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x01, -/* 000115F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 00011600 */ 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0xE0, 0x0B, -/* 00011610 */ 0x00, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x06, -/* 00011620 */ 0x09, 0x98, 0x09, 0x06, 0x02, 0x00, 0x00, 0x47, 0x07, 0x09, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0C, -/* 00011630 */ 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, 0x00, 0x00, -/* 00011640 */ 0x00, 0x1D, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x5C, 0x01, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00011650 */ 0x04, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x07, 0xEE, 0x04, 0x09, -/* 00011660 */ 0x09, 0x01, 0x00, 0x15, 0x03, 0x00, 0x09, 0x04, 0x09, 0x39, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 00011670 */ 0x0C, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, 0x00, -/* 00011680 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x5C, 0x01, 0x0A, 0x8F, 0x01, 0x00, 0x00, -/* 00011690 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x05, 0xEE, 0x04, -/* 000116A0 */ 0xFF, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, 0x0E, 0xFE, -/* 000116B0 */ 0x4F, 0x03, 0x00, 0xFE, 0x97, 0x29, 0x05, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x7A, 0x00, 0x09, -/* 000116C0 */ 0x00, 0x24, 0x00, 0x41, 0x00, 0x5F, 0x00, 0x3B, 0x00, 0x55, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, -/* 000116D0 */ 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x3C, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x0F, -/* 000116E0 */ 0x00, 0xFE, 0x30, 0x26, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x30, 0x26, 0x7D, 0x7D, -/* 000116F0 */ 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011700 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011710 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, -/* 00011720 */ 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x04, 0x50, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 00011730 */ 0x07, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, -/* 00011740 */ 0x00, 0x00, 0x08, 0x01, 0x00, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 00011750 */ 0x00, 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, 0x5D, 0x04, -/* 00011760 */ 0x03, 0x00, 0x00, 0xEE, 0x05, 0x07, 0x07, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, -/* 00011770 */ 0x00, 0x00, 0x07, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x54, 0x26, 0x02, 0x00, 0x00, -/* 00011780 */ 0x00, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x00, 0x3F, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0x25, -/* 00011790 */ 0x03, 0xCD, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0C, 0x00, 0xFE, 0x7F, 0x20, 0x01, 0xFF, 0x00, -/* 000117A0 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x7F, 0x20, 0xFE, 0x11, 0x04, 0xFE, 0x11, 0x04, 0x07, 0x05, -/* 000117B0 */ 0x09, 0x04, 0x2A, 0x29, 0x01, 0x01, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000117C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000117D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, 0x00, -/* 000117E0 */ 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0xBD, 0x4F, 0x06, 0x4F, 0x07, 0x8F, 0x01, 0x00, -/* 000117F0 */ 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x4B, 0x09, 0x0F, 0x1B, 0x00, 0x09, 0x09, -/* 00011800 */ 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x07, 0x01, -/* 00011810 */ 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 00011820 */ 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, -/* 00011830 */ 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x4B, -/* 00011840 */ 0x0B, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x06, -/* 00011850 */ 0x09, 0x0F, 0x08, 0x00, 0x06, 0x09, 0x00, 0x00, 0xA8, 0x00, 0x09, 0x47, 0x00, 0x98, 0x0B, 0x06, -/* 00011860 */ 0x03, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5D, 0x01, 0x04, -/* 00011870 */ 0x02, 0x00, 0xF2, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6D, 0x09, 0x0A, 0x02, -/* 00011880 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x5C, 0x01, 0x0B, 0xF2, -/* 00011890 */ 0x02, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x54, 0x07, 0x09, 0x47, 0x00, 0x07, 0x09, -/* 000118A0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0xFE, 0x75, 0x01, 0xAF, 0x00, -/* 000118B0 */ 0xFE, 0x9B, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0x15, 0x00, 0x24, 0x00, 0x18, 0x00, 0x2B, 0x00, -/* 000118C0 */ 0x37, 0x00, 0x4B, 0x00, 0x07, 0x00, 0x1A, 0x00, 0x05, 0x00, 0x5C, 0x02, 0x3F, 0x00, 0xCD, 0x00, -/* 000118D0 */ 0x08, 0x00, 0x17, 0x00, 0x00, 0xD9, 0x18, 0x01, 0x00, 0xBF, 0xDC, 0x02, 0x00, 0x00, 0xFC, 0x07, -/* 000118E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x36, 0xFF, 0xA2, 0x41, 0xD0, 0x00, 0x0D, 0xFE, 0x01, 0x10, -/* 000118F0 */ 0xFE, 0xD9, 0x23, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xD9, 0x23, 0x0A, 0x0A, 0x01, -/* 00011900 */ 0x02, 0x02, 0x03, 0x0A, 0x0A, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011910 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011920 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x17, 0xAC, 0x03, 0x0F, 0x02, -/* 00011930 */ 0x00, 0x02, 0xAB, 0x03, 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x03, 0xAB, 0x00, 0x09, 0x02, 0x00, 0xA8, -/* 00011940 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xE0, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, -/* 00011950 */ 0x03, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x47, 0x03, 0xB6, 0x1E, 0xFF, -/* 00011960 */ 0xA2, 0x41, 0xC1, 0x00, 0x0B, 0x00, 0xFE, 0xEC, 0x1B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00011970 */ 0xFE, 0xEC, 0x1B, 0xFE, 0x73, 0x04, 0xFE, 0x73, 0x04, 0x01, 0x09, 0x09, 0x0D, 0x04, 0x58, 0x4C, -/* 00011980 */ 0x01, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011990 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, -/* 000119A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, -/* 000119B0 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x01, 0x03, 0x00, 0x00, -/* 000119C0 */ 0x00, 0xFE, 0x8E, 0x01, 0x4F, 0x0A, 0x4F, 0x0B, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 000119D0 */ 0x00, 0x0F, 0x00, 0x00, 0x62, 0x0F, 0x0F, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, -/* 000119E0 */ 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, -/* 000119F0 */ 0x0A, 0x0E, 0xA8, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0x31, 0x01, 0x8F, 0x01, 0x00, 0x00, -/* 00011A00 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x02, 0x07, 0x02, 0x00, 0x5C, -/* 00011A10 */ 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, -/* 00011A20 */ 0x0A, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0xB5, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, -/* 00011A30 */ 0x00, 0x00, 0x00, 0x0E, 0x01, 0x00, 0x4B, 0x0E, 0x0F, 0x1B, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8F, -/* 00011A40 */ 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 00011A50 */ 0x03, 0xEE, 0x01, 0xFF, 0x0E, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00011A60 */ 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, -/* 00011A70 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x4B, 0x10, 0x5C, 0x02, -/* 00011A80 */ 0x10, 0xF2, 0x03, 0x0E, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0B, 0x0E, 0x98, 0x0E, -/* 00011A90 */ 0x0B, 0x04, 0x00, 0x00, 0x98, 0x0F, 0x0B, 0x05, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x10, -/* 00011AA0 */ 0x00, 0x98, 0x10, 0x0B, 0x05, 0x02, 0x00, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, -/* 00011AB0 */ 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x98, 0x0F, 0x0B, 0x08, 0x03, 0x00, 0x0F, 0x03, -/* 00011AC0 */ 0x00, 0x0F, 0x09, 0x10, 0x00, 0x98, 0x10, 0x0B, 0x08, 0x04, 0x00, 0x2F, 0x10, 0x06, 0x10, 0x47, -/* 00011AD0 */ 0x0F, 0x10, 0x09, 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x47, 0x0A, 0x0E, 0x8F, -/* 00011AE0 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x62, 0x0F, 0x0F, 0x00, 0x6D, -/* 00011AF0 */ 0x0E, 0x0F, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xA8, 0x10, 0x14, 0x03, -/* 00011B00 */ 0x00, 0x0A, 0x10, 0x09, 0x14, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x11, -/* 00011B10 */ 0x03, 0x00, 0x4B, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x0A, 0x5C, 0x02, 0x10, -/* 00011B20 */ 0xF2, 0x03, 0xFF, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x00, -/* 00011B30 */ 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, -/* 00011B40 */ 0x09, 0x05, 0x00, 0xA8, 0x0E, 0x47, 0x0A, 0x0E, 0x47, 0x00, 0x0A, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 00011B50 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x04, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0x29, 0x02, 0xFE, 0x37, 0x02, -/* 00011B60 */ 0xFE, 0xB8, 0x01, 0x00, 0xFE, 0x16, 0x1C, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x53, 0x00, -/* 00011B70 */ 0x0A, 0x00, 0x30, 0x00, 0x26, 0x00, 0x51, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x15, 0x00, 0x2D, 0x00, -/* 00011B80 */ 0x18, 0x00, 0x3A, 0x00, 0x37, 0x00, 0xB1, 0x00, 0x51, 0x00, 0x34, 0x01, 0x4E, 0x00, 0x80, 0x00, -/* 00011B90 */ 0x16, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x1B, 0x00, 0x00, 0xBF, 0xFC, 0x2A, -/* 00011BA0 */ 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x45, 0x03, 0x9B, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0A, 0x00, -/* 00011BB0 */ 0xFE, 0x46, 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x46, 0x17, 0xFE, 0x86, 0x04, -/* 00011BC0 */ 0xFE, 0x86, 0x04, 0x01, 0x0A, 0x09, 0x0E, 0x04, 0x61, 0x54, 0x01, 0x05, 0x05, 0x04, 0x05, 0x05, -/* 00011BD0 */ 0x05, 0x05, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011BE0 */ 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00011BF0 */ 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, -/* 00011C00 */ 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xAD, 0x01, 0x4F, 0x0C, -/* 00011C10 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x62, 0x10, 0x10, 0x00, -/* 00011C20 */ 0x6D, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0F, -/* 00011C30 */ 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0B, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, -/* 00011C40 */ 0x0F, 0x09, 0x31, 0x01, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, -/* 00011C50 */ 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0F, -/* 00011C60 */ 0x0F, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x02, 0x09, -/* 00011C70 */ 0xB5, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x00, 0x4B, 0x0F, -/* 00011C80 */ 0x0F, 0x1B, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -/* 00011C90 */ 0x0F, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0xEE, 0x01, 0xFF, 0x0F, 0x02, 0x00, 0x8F, -/* 00011CA0 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x03, 0x07, -/* 00011CB0 */ 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, -/* 00011CC0 */ 0x00, 0x11, 0x01, 0x00, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0xF2, 0x03, 0x0F, 0x0F, 0x03, 0x00, 0x00, -/* 00011CD0 */ 0x00, 0x03, 0x00, 0x47, 0x0C, 0x0F, 0x98, 0x0F, 0x0C, 0x04, 0x00, 0x00, 0x98, 0x10, 0x0C, 0x05, -/* 00011CE0 */ 0x01, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x10, 0x00, 0x98, 0x11, 0x0C, 0x05, 0x02, 0x00, 0x2F, -/* 00011CF0 */ 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, -/* 00011D00 */ 0x98, 0x10, 0x0C, 0x08, 0x03, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x10, 0x00, 0x98, 0x11, 0x0C, -/* 00011D10 */ 0x08, 0x04, 0x00, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, -/* 00011D20 */ 0x2F, 0x0F, 0x0F, 0x10, 0x47, 0x0B, 0x0F, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00011D30 */ 0x10, 0x00, 0x00, 0x62, 0x10, 0x10, 0x00, 0x6D, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00011D40 */ 0x10, 0x5C, 0x01, 0x09, 0xA8, 0x11, 0x14, 0x03, 0x00, 0x0B, 0x11, 0x09, 0x14, 0x00, 0x8F, 0x01, -/* 00011D50 */ 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x4B, 0x12, 0x47, 0x11, 0x12, 0x09, -/* 00011D60 */ 0x03, 0x00, 0x47, 0x11, 0x0B, 0x5C, 0x02, 0x11, 0xF2, 0x03, 0xFF, 0x0F, 0x04, 0x00, 0x00, 0x00, -/* 00011D70 */ 0x04, 0x00, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0F, 0x03, -/* 00011D80 */ 0x00, 0x4B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x05, 0x00, 0xA8, 0x0F, 0x47, 0x0B, 0x0F, -/* 00011D90 */ 0x14, 0x03, 0x00, 0x0A, 0x09, 0x09, 0x09, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x1B, 0x00, 0x09, 0x16, -/* 00011DA0 */ 0x00, 0x14, 0x03, 0x00, 0x0A, 0x0B, 0x09, 0x08, 0x00, 0xA8, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, -/* 00011DB0 */ 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x05, 0x03, -/* 00011DC0 */ 0xFE, 0xB5, 0x01, 0xFE, 0x2A, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0xB8, 0x01, 0x00, 0xFE, 0x71, 0x17, -/* 00011DD0 */ 0x11, 0x02, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x46, 0x00, 0x0A, 0x00, 0x30, 0x00, 0x26, 0x00, 0x44, -/* 00011DE0 */ 0x00, 0x08, 0x00, 0x2F, 0x00, 0x15, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x3A, 0x00, 0x37, 0x00, 0x52, -/* 00011DF0 */ 0x00, 0x51, 0x00, 0x0C, 0x01, 0x4E, 0x00, 0x73, 0x00, 0x16, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2F, -/* 00011E00 */ 0x00, 0x08, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x26, 0x00, 0x08, 0x00, 0x34, 0x00, 0x08, 0x00, 0x2F, -/* 00011E10 */ 0x00, 0x08, 0x00, 0x25, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x24, 0x03, -/* 00011E20 */ 0x97, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x09, 0x00, 0xFE, 0xD3, 0x16, 0xFF, 0x00, 0x10, 0x01, -/* 00011E30 */ 0x00, 0x03, 0x03, 0xFE, 0xD3, 0x16, 0x51, 0x51, 0x01, 0x05, 0x02, 0x05, 0x04, 0x0B, 0x0B, 0x01, -/* 00011E40 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011E50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011E60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x2D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00011E70 */ 0x00, 0x06, 0x00, 0x00, 0x6D, 0x05, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, -/* 00011E80 */ 0x03, 0x5C, 0x02, 0x02, 0xF2, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, -/* 00011E90 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0xA5, 0x02, 0x00, 0xFE, 0xF0, 0x16, 0x02, 0x00, -/* 00011EA0 */ 0x00, 0x00, 0x00, 0x2B, 0x00, 0x33, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x00, 0x0F, 0xFC, 0x07, 0xFE, -/* 00011EB0 */ 0x23, 0x03, 0x91, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x08, 0x00, 0xFE, 0x39, 0x16, 0xFF, 0x00, -/* 00011EC0 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x39, 0x16, 0x7B, 0x7B, 0x41, 0x02, 0x04, 0x05, 0x0A, 0x0A, -/* 00011ED0 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011EE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011EF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xF9, 0x7F, -/* 00011F00 */ 0xFD, 0xDF, 0xC1, 0x05, 0x00, 0x00, 0x40, 0xFE, 0x7F, 0xFD, 0xDF, 0xC1, 0x1E, 0x62, 0x05, 0x04, -/* 00011F10 */ 0x00, 0x14, 0x0F, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0x62, 0x05, 0x04, 0x00, 0x14, 0x03, 0x00, -/* 00011F20 */ 0x05, 0x03, 0x09, 0x02, 0x00, 0x23, 0x04, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2E, 0x01, -/* 00011F30 */ 0x00, 0xFE, 0x51, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x4A, 0x00, 0x04, 0x00, 0x18, -/* 00011F40 */ 0x00, 0x00, 0xBF, 0xFC, 0x2B, 0x08, 0x00, 0xFC, 0x07, 0xFE, 0x22, 0x03, 0x86, 0x1B, 0xFF, 0xA2, -/* 00011F50 */ 0x41, 0xC1, 0x00, 0x07, 0x00, 0xFE, 0xE0, 0x14, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, -/* 00011F60 */ 0xE0, 0x14, 0xD5, 0xD5, 0x41, 0x06, 0x05, 0x09, 0x03, 0x15, 0x13, 0x10, 0x01, 0x01, 0x01, 0x01, -/* 00011F70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011F80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011F90 */ 0xFF, 0xFF, 0xFF, 0x01, 0x05, 0x3C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01, 0x00, -/* 00011FA0 */ 0x00, 0x00, 0x40, 0x4F, 0x08, 0x47, 0x08, 0x02, 0xEB, 0x00, 0xEC, 0x00, 0x12, 0x03, 0x00, 0x08, -/* 00011FB0 */ 0x06, 0x09, 0x29, 0x00, 0xBA, 0x09, 0x08, 0x05, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x18, 0x00, 0x47, -/* 00011FC0 */ 0x09, 0x07, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x98, 0x0A, 0x05, 0x08, 0x00, 0x00, 0x5C, 0x01, -/* 00011FD0 */ 0x0A, 0xEE, 0x02, 0xFF, 0x09, 0x00, 0x00, 0x28, 0x08, 0x08, 0x09, 0xCD, 0xFF, 0xED, 0x00, 0xA8, -/* 00011FE0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x15, 0x06, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, -/* 00011FF0 */ 0x20, 0x00, 0x08, 0x00, 0x20, 0x00, 0x0B, 0x00, 0x26, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x0A, 0x00, -/* 00012000 */ 0x19, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x35, 0x03, 0x79, 0x22, 0xFF, -/* 00012010 */ 0xA2, 0x41, 0xC1, 0x00, 0x06, 0x00, 0xFE, 0x57, 0x13, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00012020 */ 0xFE, 0x57, 0x13, 0xFE, 0x6B, 0x01, 0xFE, 0x6B, 0x01, 0x01, 0x08, 0x04, 0x08, 0x04, 0x2A, 0x27, -/* 00012030 */ 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012040 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, -/* 00012050 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0xB6, 0x4F, 0x05, 0x4F, 0x06, 0x8F, 0x01, 0x00, 0x00, -/* 00012060 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 00012070 */ 0x00, 0x0A, 0x5C, 0x01, 0x04, 0xF2, 0x02, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, -/* 00012080 */ 0x05, 0x09, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x7A, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x44, -/* 00012090 */ 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x4B, 0x09, 0x0F, 0x1B, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8F, -/* 000120A0 */ 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 000120B0 */ 0x03, 0xEE, 0x01, 0xFF, 0x09, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 000120C0 */ 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, -/* 000120D0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x00, 0x4B, 0x0B, 0x5C, 0x02, -/* 000120E0 */ 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x06, 0x09, 0xAC, 0x09, -/* 000120F0 */ 0x0F, 0x02, 0x00, 0x06, 0xAB, 0x09, 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x09, 0xAB, 0x00, 0x09, 0x0B, -/* 00012100 */ 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 00012110 */ 0xFE, 0x26, 0x02, 0xFE, 0x37, 0x02, 0x00, 0xFE, 0x74, 0x13, 0x08, 0x04, 0x00, 0x00, 0x00, 0x26, -/* 00012120 */ 0x00, 0x40, 0x00, 0x08, 0x00, 0x23, 0x00, 0x15, 0x00, 0x24, 0x00, 0x18, 0x00, 0x32, 0x00, 0x37, -/* 00012130 */ 0x00, 0x4A, 0x00, 0x16, 0x00, 0x2D, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, 0xFC, 0x62, 0x04, -/* 00012140 */ 0x0F, 0xFC, 0x07, 0xFE, 0x34, 0x03, 0x6C, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x05, 0x00, 0xFE, -/* 00012150 */ 0x48, 0x11, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x48, 0x11, 0xFE, 0xEA, 0x01, 0xFE, -/* 00012160 */ 0xEA, 0x01, 0x41, 0x06, 0x05, 0x09, 0x04, 0x14, 0x12, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, -/* 00012170 */ 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012180 */ 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012190 */ 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x44, 0x03, 0x4F, 0x4F, 0x07, -/* 000121A0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, -/* 000121B0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xF2, 0x03, 0x09, 0x09, -/* 000121C0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0x09, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x18, -/* 000121D0 */ 0x00, 0x77, 0x03, 0x05, 0x01, 0x47, 0x09, 0x05, 0xCE, 0x0A, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x04, -/* 000121E0 */ 0x0A, 0xA1, 0x01, 0x03, 0x0A, 0x77, 0x0A, 0x09, 0x02, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 000121F0 */ 0x2F, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x25, 0x02, 0x00, 0xFE, 0x77, 0x11, 0x05, 0x02, 0x00, 0x00, -/* 00012200 */ 0x00, 0x29, 0x00, 0x4F, 0x00, 0x08, 0x00, 0x71, 0x00, 0x04, 0x00, 0x33, 0x00, 0x16, 0x00, 0xC7, -/* 00012210 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x33, 0x03, 0x63, 0x1C, 0xFF, 0xA2, -/* 00012220 */ 0x41, 0xC1, 0x00, 0x04, 0x00, 0xFE, 0x05, 0x10, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 00012230 */ 0x05, 0x10, 0xFE, 0x21, 0x01, 0xFE, 0x21, 0x01, 0x41, 0x05, 0x04, 0x07, 0x03, 0x0E, 0x0D, 0x01, -/* 00012240 */ 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012250 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012260 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x38, 0x4F, 0x05, -/* 00012270 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x6D, 0x07, 0x08, 0x00, -/* 00012280 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x04, 0xF2, 0x02, 0x07, 0x07, 0x00, 0x00, 0x00, -/* 00012290 */ 0x00, 0x00, 0x00, 0x47, 0x05, 0x07, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x04, 0x00, 0x77, 0x03, -/* 000122A0 */ 0x04, 0x01, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2E, 0x02, 0xFE, 0x12, 0x02, 0x00, 0xFE, -/* 000122B0 */ 0x27, 0x10, 0x04, 0x02, 0x00, 0x00, 0x00, 0x26, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x71, 0x00, 0x06, -/* 000122C0 */ 0x00, 0x4E, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x32, 0x03, 0x52, 0x1D, -/* 000122D0 */ 0xFF, 0xA0, 0x41, 0xC1, 0x00, 0x03, 0x00, 0xFE, 0x1D, 0x0E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 000122E0 */ 0x01, 0xFE, 0x1D, 0x0E, 0xFE, 0xC9, 0x01, 0xFE, 0xC9, 0x01, 0x01, 0x04, 0x03, 0x05, 0x02, 0x1D, -/* 000122F0 */ 0x1D, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012300 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012310 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x43, 0x03, 0x99, 0x4F, -/* 00012320 */ 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x4B, 0x05, 0x0F, -/* 00012330 */ 0x03, 0x00, 0x05, 0x09, 0x28, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x05, -/* 00012340 */ 0x01, 0x00, 0x62, 0x05, 0x05, 0x00, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x11, 0x00, 0x8F, 0x01, 0x00, -/* 00012350 */ 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x58, 0x00, 0x8F, 0x01, -/* 00012360 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x6D, 0x05, 0x06, 0x01, 0x07, 0x01, -/* 00012370 */ 0x00, 0x5C, 0x00, 0x06, 0xF2, 0x01, 0x05, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x03, -/* 00012380 */ 0x05, 0x0F, 0x12, 0x00, 0x03, 0x09, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3B, -/* 00012390 */ 0x00, 0x00, 0x00, 0x02, 0x09, 0x0C, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, -/* 000123A0 */ 0x00, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, -/* 000123B0 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x03, 0xFE, 0x2B, 0x02, -/* 000123C0 */ 0x00, 0xFE, 0x33, 0x0E, 0x08, 0x02, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x39, 0x00, 0x11, 0x00, 0x2B, -/* 000123D0 */ 0x00, 0x23, 0x00, 0x34, 0x00, 0x07, 0x00, 0x9C, 0x00, 0x0F, 0x00, 0x35, 0x00, 0x0C, 0x00, 0x2D, -/* 000123E0 */ 0x00, 0x13, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x17, 0x03, -/* 000123F0 */ 0x3B, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x02, 0x00, 0xFE, 0xC9, 0x09, 0xFF, 0x00, 0x10, 0x01, -/* 00012400 */ 0x00, 0x04, 0x04, 0xFE, 0xC9, 0x09, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, -/* 00012410 */ 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012420 */ 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012430 */ 0xFF, 0x00, 0x00, 0x03, 0x04, 0x45, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x08, -/* 00012440 */ 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8F, 0x01, -/* 00012450 */ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, -/* 00012460 */ 0x5C, 0x01, 0x06, 0x5D, 0x02, 0x02, 0x01, 0x00, 0xEE, 0x03, 0x09, 0x09, 0x01, 0x00, 0x5C, 0x03, -/* 00012470 */ 0x09, 0xEE, 0x04, 0xFF, 0x08, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xF4, -/* 00012480 */ 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x46, 0x00, 0x00}; +/* 00003050 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00003060 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, +/* 00003070 */ 0x31, 0x00, 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, +/* 00003080 */ 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, +/* 00003090 */ 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, +/* 000030A0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, +/* 000030B0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, +/* 000030C0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, +/* 000030D0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000030E0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, +/* 000030F0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, +/* 00003100 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, +/* 00003110 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, +/* 00003120 */ 0x2F, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2F, 0x00, +/* 00003130 */ 0x73, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2F, 0x00, 0x6D, 0x00, +/* 00003140 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00003150 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00003160 */ 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, +/* 00003170 */ 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00003180 */ 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, +/* 00003190 */ 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, +/* 000031A0 */ 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 000031B0 */ 0x72, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 000031C0 */ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, +/* 000031D0 */ 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, +/* 000031E0 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, +/* 000031F0 */ 0x6B, 0x00, 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, +/* 00003200 */ 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00003210 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, +/* 00003220 */ 0x77, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, +/* 00003230 */ 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00003240 */ 0x20, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, +/* 00003250 */ 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, +/* 00003260 */ 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00003270 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00003280 */ 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, +/* 00003290 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, +/* 000032A0 */ 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 000032B0 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 000032C0 */ 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7B, 0x00, +/* 000032D0 */ 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x5B, 0x00, 0x61, 0x00, +/* 000032E0 */ 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 000032F0 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, +/* 00003300 */ 0x5C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, +/* 00003310 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, +/* 00003320 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, +/* 00003330 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00003340 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, +/* 00003350 */ 0x72, 0x00, 0x31, 0x00, 0x32, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00003360 */ 0x61, 0x00, 0x74, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, +/* 00003370 */ 0x72, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, +/* 00003380 */ 0x31, 0x00, 0x32, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, +/* 00003390 */ 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x48, 0x00, 0x6F, 0x00, +/* 000033A0 */ 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, +/* 000033B0 */ 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x76, 0x00, +/* 000033C0 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000033D0 */ 0x65, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 000033E0 */ 0x31, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 000033F0 */ 0x32, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 00003400 */ 0x6C, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00003410 */ 0x5F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00003420 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, +/* 00003430 */ 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, +/* 00003440 */ 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x5F, 0x00, +/* 00003450 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00003460 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00003470 */ 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, +/* 00003480 */ 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00003490 */ 0x74, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 000034A0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 000034B0 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x65, 0x00, 0x6E, 0x00, +/* 000034C0 */ 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 000034D0 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 000034E0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, +/* 000034F0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 00003500 */ 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00003510 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00003520 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, +/* 00003530 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 00003540 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, +/* 00003550 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00003560 */ 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, +/* 00003570 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x00, 0x00, +/* 00003580 */ 0xFE, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, +/* 00003590 */ 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x8F, +/* 000035A0 */ 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x5B, +/* 000035B0 */ 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xE8, +/* 000035C0 */ 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x63, +/* 000035D0 */ 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xFB, +/* 000035E0 */ 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x5E, 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x70, +/* 000035F0 */ 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xDA, +/* 00003600 */ 0x04, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x79, +/* 00003610 */ 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0xBD, 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0x01, +/* 00003620 */ 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5C, +/* 00003630 */ 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xCD, +/* 00003640 */ 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x50, +/* 00003650 */ 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x53, +/* 00003660 */ 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0xAA, +/* 00003670 */ 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0x36, 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3E, +/* 00003680 */ 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0xD6, 0x0A, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x62, +/* 00003690 */ 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0xAF, 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0x33, +/* 000036A0 */ 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x82, 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0x2E, +/* 000036B0 */ 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x63, 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0xA2, +/* 000036C0 */ 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDB, 0x0D, 0x00, 0x00, 0x46, 0x0E, 0x00, 0x00, 0x77, +/* 000036D0 */ 0x0E, 0x00, 0x00, 0x87, 0x0E, 0x00, 0x00, 0xA6, 0x0E, 0x00, 0x00, 0xC9, 0x0E, 0x00, 0x00, 0xEC, +/* 000036E0 */ 0x0E, 0x00, 0x00, 0x0D, 0x0F, 0x00, 0x00, 0x2D, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x4A, +/* 000036F0 */ 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x00, 0x9B, 0x0F, 0x00, 0x00, 0xD0, +/* 00003700 */ 0x0F, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x33, +/* 00003710 */ 0x10, 0x00, 0x00, 0x4A, 0x10, 0x00, 0x00, 0x99, 0x10, 0x00, 0x00, 0xCB, 0x10, 0x00, 0x00, 0xEF, +/* 00003720 */ 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x26, 0x11, 0x00, 0x00, 0x30, 0x11, 0x00, 0x00, 0x31, +/* 00003730 */ 0x11, 0x00, 0x00, 0x51, 0x11, 0x00, 0x00, 0x58, 0x11, 0x00, 0x00, 0x59, 0x11, 0x00, 0x00, 0x9F, +/* 00003740 */ 0x11, 0x00, 0x00, 0xEE, 0x11, 0x00, 0x00, 0x0D, 0x12, 0x00, 0x00, 0x5B, 0x12, 0x00, 0x00, 0x8E, +/* 00003750 */ 0x12, 0x00, 0x00, 0xBE, 0x12, 0x00, 0x00, 0xFE, 0x12, 0x00, 0x00, 0x2A, 0x13, 0x00, 0x00, 0x38, +/* 00003760 */ 0x13, 0x00, 0x00, 0x42, 0x13, 0x00, 0x00, 0x5D, 0x13, 0x00, 0x00, 0x64, 0x13, 0x00, 0x00, 0x65, +/* 00003770 */ 0x13, 0x00, 0x00, 0x9C, 0x13, 0x00, 0x00, 0xDC, 0x13, 0x00, 0x00, 0xFB, 0x13, 0x00, 0x00, 0x1B, +/* 00003780 */ 0x14, 0x00, 0x00, 0x43, 0x14, 0x00, 0x00, 0x51, 0x14, 0x00, 0x00, 0x9B, 0x14, 0x00, 0x00, 0xB7, +/* 00003790 */ 0x14, 0x00, 0x00, 0xC8, 0x14, 0x00, 0x00, 0xE3, 0x14, 0x00, 0x00, 0xED, 0x14, 0x00, 0x00, 0xF4, +/* 000037A0 */ 0x14, 0x00, 0x00, 0xF5, 0x14, 0x00, 0x00, 0x2F, 0x15, 0x00, 0x00, 0x48, 0x15, 0x00, 0x00, 0x6B, +/* 000037B0 */ 0x15, 0x00, 0x00, 0x8D, 0x15, 0x00, 0x00, 0xB1, 0x15, 0x00, 0x00, 0xBF, 0x15, 0x00, 0x00, 0xD6, +/* 000037C0 */ 0x15, 0x00, 0x00, 0xE0, 0x15, 0x00, 0x00, 0xE7, 0x15, 0x00, 0x00, 0xE8, 0x15, 0x00, 0x00, 0x4D, +/* 000037D0 */ 0x16, 0x00, 0x00, 0x79, 0x16, 0x00, 0x00, 0xBF, 0x16, 0x00, 0x00, 0xD5, 0x16, 0x00, 0x00, 0xDF, +/* 000037E0 */ 0x16, 0x00, 0x00, 0xE6, 0x16, 0x00, 0x00, 0xE7, 0x16, 0x00, 0x00, 0x18, 0x17, 0x00, 0x00, 0x4F, +/* 000037F0 */ 0x17, 0x00, 0x00, 0x56, 0x17, 0x00, 0x00, 0x57, 0x17, 0x00, 0x00, 0x99, 0x17, 0x00, 0x00, 0xDF, +/* 00003800 */ 0x17, 0x00, 0x00, 0x0B, 0x18, 0x00, 0x00, 0x4F, 0x18, 0x00, 0x00, 0x7A, 0x18, 0x00, 0x00, 0xA3, +/* 00003810 */ 0x18, 0x00, 0x00, 0xCF, 0x18, 0x00, 0x00, 0xE1, 0x18, 0x00, 0x00, 0x33, 0x19, 0x00, 0x00, 0xA8, +/* 00003820 */ 0x19, 0x00, 0x00, 0xB6, 0x19, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x00, 0x43, 0x1A, 0x00, 0x00, 0xB3, +/* 00003830 */ 0x1A, 0x00, 0x00, 0xE6, 0x1A, 0x00, 0x00, 0x0E, 0x1B, 0x00, 0x00, 0x18, 0x1B, 0x00, 0x00, 0x19, +/* 00003840 */ 0x1B, 0x00, 0x00, 0x41, 0x1B, 0x00, 0x00, 0x64, 0x1B, 0x00, 0x00, 0x9B, 0x1B, 0x00, 0x00, 0xB9, +/* 00003850 */ 0x1B, 0x00, 0x00, 0xCA, 0x1B, 0x00, 0x00, 0xED, 0x1B, 0x00, 0x00, 0xF7, 0x1B, 0x00, 0x00, 0xFD, +/* 00003860 */ 0x1B, 0x00, 0x00, 0xFE, 0x1B, 0x00, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x91, 0x1C, 0x00, 0x00, 0xBD, +/* 00003870 */ 0x1C, 0x00, 0x00, 0x0E, 0x1D, 0x00, 0x00, 0x39, 0x1D, 0x00, 0x00, 0x62, 0x1D, 0x00, 0x00, 0x8E, +/* 00003880 */ 0x1D, 0x00, 0x00, 0xA0, 0x1D, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x51, 0x1E, 0x00, 0x00, 0x7B, +/* 00003890 */ 0x1E, 0x00, 0x00, 0xB4, 0x1E, 0x00, 0x00, 0xEE, 0x1E, 0x00, 0x00, 0xFC, 0x1E, 0x00, 0x00, 0x47, +/* 000038A0 */ 0x1F, 0x00, 0x00, 0x89, 0x1F, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00, 0x61, +/* 000038B0 */ 0x20, 0x00, 0x00, 0x6B, 0x20, 0x00, 0x00, 0x8A, 0x20, 0x00, 0x00, 0x90, 0x20, 0x00, 0x00, 0x91, +/* 000038C0 */ 0x20, 0x00, 0x00, 0xC3, 0x20, 0x00, 0x00, 0xE3, 0x20, 0x00, 0x00, 0x07, 0x21, 0x00, 0x00, 0x11, +/* 000038D0 */ 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x00, 0x5D, 0x21, 0x00, 0x00, 0x73, 0x21, 0x00, 0x00, 0x91, +/* 000038E0 */ 0x21, 0x00, 0x00, 0x9B, 0x21, 0x00, 0x00, 0x9C, 0x21, 0x00, 0x00, 0x11, 0x22, 0x00, 0x00, 0x61, +/* 000038F0 */ 0x22, 0x00, 0x00, 0xA6, 0x22, 0x00, 0x00, 0xA7, 0x22, 0x00, 0x00, 0x1A, 0x23, 0x00, 0x00, 0x33, +/* 00003900 */ 0x23, 0x00, 0x00, 0x57, 0x23, 0x00, 0x00, 0x7B, 0x23, 0x00, 0x00, 0xD3, 0x23, 0x00, 0x00, 0x16, +/* 00003910 */ 0x24, 0x00, 0x00, 0x9F, 0x24, 0x00, 0x00, 0xA0, 0x24, 0x00, 0x00, 0xBB, 0x24, 0x00, 0x00, 0xC1, +/* 00003920 */ 0x24, 0x00, 0x00, 0xC2, 0x24, 0x00, 0x00, 0x1C, 0x25, 0x00, 0x00, 0x52, 0x25, 0x00, 0x00, 0x72, +/* 00003930 */ 0x25, 0x00, 0x00, 0xCF, 0x25, 0x00, 0x00, 0x02, 0x26, 0x00, 0x00, 0x0C, 0x26, 0x00, 0x00, 0x0D, +/* 00003940 */ 0x26, 0x00, 0x00, 0x24, 0x26, 0x00, 0x00, 0x74, 0x26, 0x00, 0x00, 0xD0, 0x26, 0x00, 0x00, 0xE0, +/* 00003950 */ 0x26, 0x00, 0x00, 0xEA, 0x26, 0x00, 0x00, 0xEB, 0x26, 0x00, 0x00, 0x7A, 0x27, 0x00, 0x00, 0x00, +/* 00003960 */ 0x28, 0x00, 0x00, 0x7B, 0x28, 0x00, 0x00, 0xC4, 0x28, 0x00, 0x00, 0xFA, 0x28, 0x00, 0x00, 0xFB, +/* 00003970 */ 0x28, 0x00, 0x00, 0x47, 0x29, 0x00, 0x00, 0x66, 0x29, 0x00, 0x00, 0xB7, 0x29, 0x00, 0x00, 0x31, +/* 00003980 */ 0x2A, 0x00, 0x00, 0x55, 0x2A, 0x00, 0x00, 0xB0, 0x2A, 0x00, 0x00, 0xFB, 0x2A, 0x00, 0x00, 0x0D, +/* 00003990 */ 0x2B, 0x00, 0x00, 0x1E, 0x2B, 0x00, 0x00, 0x3E, 0x2B, 0x00, 0x00, 0x48, 0x2B, 0x00, 0x00, 0x49, +/* 000039A0 */ 0x2B, 0x00, 0x00, 0xB8, 0x2B, 0x00, 0x00, 0xE6, 0x2B, 0x00, 0x00, 0x1B, 0x2C, 0x00, 0x00, 0x44, +/* 000039B0 */ 0x2C, 0x00, 0x00, 0x5C, 0x2C, 0x00, 0x00, 0x96, 0x2C, 0x00, 0x00, 0xC0, 0x2C, 0x00, 0x00, 0xE5, +/* 000039C0 */ 0x2C, 0x00, 0x00, 0xFE, 0x2C, 0x00, 0x00, 0x25, 0x2D, 0x00, 0x00, 0x37, 0x2D, 0x00, 0x00, 0x45, +/* 000039D0 */ 0x2D, 0x00, 0x00, 0x46, 0x2D, 0x00, 0x00, 0x91, 0x2D, 0x00, 0x00, 0xA2, 0x2D, 0x00, 0x00, 0xC4, +/* 000039E0 */ 0x2D, 0x00, 0x00, 0xCE, 0x2D, 0x00, 0x00, 0xCF, 0x2D, 0x00, 0x00, 0xED, 0x2D, 0x00, 0x00, 0x0B, +/* 000039F0 */ 0x2E, 0x00, 0x00, 0x29, 0x2E, 0x00, 0x00, 0x5A, 0x2E, 0x00, 0x00, 0x6C, 0x2E, 0x00, 0x00, 0x72, +/* 00003A00 */ 0x2E, 0x00, 0x00, 0x73, 0x2E, 0x00, 0x00, 0xD3, 0x2E, 0x00, 0x00, 0x2B, 0x2F, 0x00, 0x00, 0x5E, +/* 00003A10 */ 0x2F, 0x00, 0x00, 0x5F, 0x2F, 0x00, 0x00, 0x90, 0x2F, 0x00, 0x00, 0x91, 0x2F, 0x00, 0x00, 0xC5, +/* 00003A20 */ 0x2F, 0x00, 0x00, 0xF0, 0x2F, 0x00, 0x00, 0x59, 0x30, 0x00, 0x00, 0x8A, 0x30, 0x00, 0x00, 0xAB, +/* 00003A30 */ 0x30, 0x00, 0x00, 0xB9, 0x30, 0x00, 0x00, 0xC3, 0x30, 0x00, 0x00, 0x18, 0x31, 0x00, 0x00, 0x1E, +/* 00003A40 */ 0x31, 0x00, 0x00, 0x1F, 0x31, 0x00, 0x00, 0x62, 0x31, 0x00, 0x00, 0x8F, 0x31, 0x00, 0x00, 0xBD, +/* 00003A50 */ 0x31, 0x00, 0x00, 0xE4, 0x31, 0x00, 0x00, 0x10, 0x32, 0x00, 0x00, 0x1A, 0x32, 0x00, 0x00, 0x1B, +/* 00003A60 */ 0x32, 0x00, 0x00, 0x3D, 0x32, 0x00, 0x00, 0x62, 0x32, 0x00, 0x00, 0x8A, 0x32, 0x00, 0x00, 0x98, +/* 00003A70 */ 0x32, 0x00, 0x00, 0x99, 0x32, 0x00, 0x00, 0xC5, 0x32, 0x00, 0x00, 0x12, 0x33, 0x00, 0x00, 0x2B, +/* 00003A80 */ 0x33, 0x00, 0x00, 0x69, 0x33, 0x00, 0x00, 0x9D, 0x33, 0x00, 0x00, 0xB2, 0x33, 0x00, 0x00, 0xE1, +/* 00003A90 */ 0x33, 0x00, 0x00, 0xEF, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x51, 0x34, 0x00, 0x00, 0x81, +/* 00003AA0 */ 0x34, 0x00, 0x00, 0xE7, 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF2, 0x34, 0x00, 0x00, 0x1A, +/* 00003AB0 */ 0x35, 0x00, 0x00, 0x21, 0x35, 0x00, 0x00, 0x22, 0x35, 0x00, 0x00, 0x44, 0x35, 0x00, 0x00, 0x62, +/* 00003AC0 */ 0x35, 0x00, 0x00, 0x87, 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xD9, 0x35, 0x00, 0x00, 0xEB, +/* 00003AD0 */ 0x35, 0x00, 0x00, 0x2B, 0x36, 0x00, 0x00, 0x3A, 0x36, 0x00, 0x00, 0x3B, 0x36, 0x00, 0x00, 0x60, +/* 00003AE0 */ 0x36, 0x00, 0x00, 0xA0, 0x36, 0x00, 0x00, 0xAF, 0x36, 0x00, 0x00, 0xB0, 0x36, 0x00, 0x00, 0xD5, +/* 00003AF0 */ 0x36, 0x00, 0x00, 0x0F, 0x37, 0x00, 0x00, 0x1E, 0x37, 0x00, 0x00, 0x1F, 0x37, 0x00, 0x00, 0x4C, +/* 00003B00 */ 0x37, 0x00, 0x00, 0x8D, 0x37, 0x00, 0x00, 0x9C, 0x37, 0x00, 0x00, 0x9D, 0x37, 0x00, 0x00, 0xC2, +/* 00003B10 */ 0x37, 0x00, 0x00, 0xE7, 0x37, 0x00, 0x00, 0x04, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x73, +/* 00003B20 */ 0x38, 0x00, 0x00, 0x85, 0x38, 0x00, 0x00, 0xA1, 0x38, 0x00, 0x00, 0xB0, 0x38, 0x00, 0x00, 0xB1, +/* 00003B30 */ 0x38, 0x00, 0x00, 0xDC, 0x38, 0x00, 0x00, 0x08, 0x39, 0x00, 0x00, 0x24, 0x39, 0x00, 0x00, 0x74, +/* 00003B40 */ 0x39, 0x00, 0x00, 0x99, 0x39, 0x00, 0x00, 0xAF, 0x39, 0x00, 0x00, 0xE0, 0x39, 0x00, 0x00, 0xF2, +/* 00003B50 */ 0x39, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x11, 0x3A, 0x00, 0x00, 0x1B, 0x3A, 0x00, 0x00, 0x1C, +/* 00003B60 */ 0x3A, 0x00, 0x00, 0x43, 0x3A, 0x00, 0x00, 0x87, 0x3A, 0x00, 0x00, 0xAE, 0x3A, 0x00, 0x00, 0xAF, +/* 00003B70 */ 0x3A, 0x00, 0x00, 0xD2, 0x3A, 0x00, 0x00, 0xF7, 0x3A, 0x00, 0x00, 0x31, 0x3B, 0x00, 0x00, 0x3F, +/* 00003B80 */ 0x3B, 0x00, 0x00, 0x40, 0x3B, 0x00, 0x00, 0x64, 0x3B, 0x00, 0x00, 0x96, 0x3B, 0x00, 0x00, 0xA4, +/* 00003B90 */ 0x3B, 0x00, 0x00, 0xA5, 0x3B, 0x00, 0x00, 0xC9, 0x3B, 0x00, 0x00, 0xFB, 0x3B, 0x00, 0x00, 0x09, +/* 00003BA0 */ 0x3C, 0x00, 0x00, 0x0A, 0x3C, 0x00, 0x00, 0x71, 0x3C, 0x00, 0x00, 0x0C, 0x3D, 0x00, 0x00, 0x1A, +/* 00003BB0 */ 0x3D, 0x00, 0x00, 0x1B, 0x3D, 0x00, 0x00, 0x35, 0x3D, 0x00, 0x00, 0x3F, 0x3D, 0x00, 0x00, 0x40, +/* 00003BC0 */ 0x3D, 0x00, 0x00, 0x59, 0x3D, 0x00, 0x00, 0x5F, 0x3D, 0x00, 0x00, 0x60, 0x3D, 0x00, 0x00, 0xAE, +/* 00003BD0 */ 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0xDB, 0x3D, 0x00, 0x00, 0x0A, 0x3E, 0x00, 0x00, 0x4A, +/* 00003BE0 */ 0x3E, 0x00, 0x00, 0x4B, 0x3E, 0x00, 0x00, 0xAC, 0x3E, 0x00, 0x00, 0x2E, 0x3F, 0x00, 0x00, 0x3C, +/* 00003BF0 */ 0x3F, 0x00, 0x00, 0x3D, 0x3F, 0x00, 0x00, 0x6C, 0x3F, 0x00, 0x00, 0x7D, 0x3F, 0x00, 0x00, 0x9A, +/* 00003C00 */ 0x3F, 0x00, 0x00, 0xA4, 0x3F, 0x00, 0x00, 0xAA, 0x3F, 0x00, 0x00, 0xAB, 0x3F, 0x00, 0x00, 0xC5, +/* 00003C10 */ 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0x19, 0x40, 0x00, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x20, +/* 00003C20 */ 0x40, 0x00, 0x00, 0x58, 0x40, 0x00, 0x00, 0xA4, 0x40, 0x00, 0x00, 0x02, 0x41, 0x00, 0x00, 0x28, +/* 00003C30 */ 0x41, 0x00, 0x00, 0x6D, 0x41, 0x00, 0x00, 0xD1, 0x41, 0x00, 0x00, 0x51, 0x42, 0x00, 0x00, 0x52, +/* 00003C40 */ 0x42, 0x00, 0x00, 0xC4, 0x42, 0x00, 0x00, 0xF5, 0x42, 0x00, 0x00, 0x44, 0x43, 0x00, 0x00, 0x96, +/* 00003C50 */ 0x43, 0x00, 0x00, 0xEA, 0x43, 0x00, 0x00, 0x22, 0x44, 0x00, 0x00, 0x74, 0x44, 0x00, 0x00, 0xC6, +/* 00003C60 */ 0x44, 0x00, 0x00, 0x1B, 0x45, 0x00, 0x00, 0x87, 0x45, 0x00, 0x00, 0xDD, 0x45, 0x00, 0x00, 0xDE, +/* 00003C70 */ 0x45, 0x00, 0x00, 0xFD, 0x45, 0x00, 0x00, 0x1C, 0x46, 0x00, 0x00, 0x4E, 0x46, 0x00, 0x00, 0x4F, +/* 00003C80 */ 0x46, 0x00, 0x00, 0xC6, 0x46, 0x00, 0x00, 0x33, 0x47, 0x00, 0x00, 0x86, 0x47, 0x00, 0x00, 0xC9, +/* 00003C90 */ 0x47, 0x00, 0x00, 0xCA, 0x47, 0x00, 0x00, 0x47, 0x48, 0x00, 0x00, 0xDB, 0x48, 0x00, 0x00, 0x5E, +/* 00003CA0 */ 0x49, 0x00, 0x00, 0xE1, 0x49, 0x00, 0x00, 0x54, 0x4A, 0x00, 0x00, 0x55, 0x4A, 0x00, 0x00, 0xBF, +/* 00003CB0 */ 0x4A, 0x00, 0x00, 0x38, 0x4B, 0x00, 0x00, 0x39, 0x4B, 0x00, 0x00, 0x9C, 0x4B, 0x00, 0x00, 0x2B, +/* 00003CC0 */ 0x4C, 0x00, 0x00, 0xD4, 0x4C, 0x00, 0x00, 0x68, 0x4D, 0x00, 0x00, 0xFF, 0x4D, 0x00, 0x00, 0xA3, +/* 00003CD0 */ 0x4E, 0x00, 0x00, 0xB7, 0x4E, 0x00, 0x00, 0xB8, 0x4E, 0x00, 0x00, 0x39, 0x4F, 0x00, 0x00, 0xA5, +/* 00003CE0 */ 0x4F, 0x00, 0x00, 0x15, 0x50, 0x00, 0x00, 0x85, 0x50, 0x00, 0x00, 0xF7, 0x50, 0x00, 0x00, 0x6B, +/* 00003CF0 */ 0x51, 0x00, 0x00, 0xDF, 0x51, 0x00, 0x00, 0x29, 0x52, 0x00, 0x00, 0x2A, 0x52, 0x00, 0x00, 0x97, +/* 00003D00 */ 0x52, 0x00, 0x00, 0x98, 0x52, 0x00, 0x00, 0xFE, 0x52, 0x00, 0x00, 0x89, 0x53, 0x00, 0x00, 0xFF, +/* 00003D10 */ 0x53, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x06, 0x54, 0x00, 0x00, 0x34, 0x54, 0x00, 0x00, 0x5C, +/* 00003D20 */ 0x54, 0x00, 0x00, 0x5D, 0x54, 0x00, 0x00, 0x7E, 0x54, 0x00, 0x00, 0xA6, 0x54, 0x00, 0x00, 0xB0, +/* 00003D30 */ 0x54, 0x00, 0x00, 0xB1, 0x54, 0x00, 0x00, 0xFD, 0x54, 0x00, 0x00, 0x03, 0x55, 0x00, 0x00, 0x04, +/* 00003D40 */ 0x55, 0x00, 0x00, 0x7B, 0x55, 0x00, 0x00, 0xAA, 0x55, 0x00, 0x00, 0xD8, 0x55, 0x00, 0x00, 0xEF, +/* 00003D50 */ 0x55, 0x00, 0x00, 0xF9, 0x55, 0x00, 0x00, 0xFA, 0x55, 0x00, 0x00, 0x25, 0x56, 0x00, 0x00, 0x46, +/* 00003D60 */ 0x56, 0x00, 0x00, 0x50, 0x56, 0x00, 0x00, 0x51, 0x56, 0x00, 0x00, 0x7F, 0x56, 0x00, 0x00, 0xB9, +/* 00003D70 */ 0x56, 0x00, 0x00, 0xBA, 0x56, 0x00, 0x00, 0xEF, 0x56, 0x00, 0x00, 0x06, 0x57, 0x00, 0x00, 0x07, +/* 00003D80 */ 0x57, 0x00, 0x00, 0x45, 0x57, 0x00, 0x00, 0xA6, 0x57, 0x00, 0x00, 0xE2, 0x57, 0x00, 0x00, 0xF0, +/* 00003D90 */ 0x57, 0x00, 0x00, 0xF1, 0x57, 0x00, 0x00, 0x22, 0x58, 0x00, 0x00, 0x23, 0x58, 0x00, 0x00, 0x54, +/* 00003DA0 */ 0x58, 0x00, 0x00, 0x94, 0x58, 0x00, 0x00, 0xA2, 0x58, 0x00, 0x00, 0xA3, 0x58, 0x00, 0x00, 0xD9, +/* 00003DB0 */ 0x58, 0x00, 0x00, 0xDA, 0x58, 0x00, 0x00, 0x3B, 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x89, +/* 00003DC0 */ 0x59, 0x00, 0x00, 0x95, 0x59, 0x00, 0x00, 0x96, 0x59, 0x00, 0x00, 0xAB, 0x59, 0x00, 0x00, 0xB1, +/* 00003DD0 */ 0x59, 0x00, 0x00, 0xB2, 0x59, 0x00, 0x00, 0x01, 0x5A, 0x00, 0x00, 0x1A, 0x5A, 0x00, 0x00, 0x31, +/* 00003DE0 */ 0x5A, 0x00, 0x00, 0x86, 0x5A, 0x00, 0x00, 0x98, 0x5A, 0x00, 0x00, 0xF6, 0x5A, 0x00, 0x00, 0x1D, +/* 00003DF0 */ 0x5B, 0x00, 0x00, 0xAA, 0x5B, 0x00, 0x00, 0xD1, 0x5B, 0x00, 0x00, 0xE3, 0x5B, 0x00, 0x00, 0xFE, +/* 00003E00 */ 0x5B, 0x00, 0x00, 0x25, 0x5C, 0x00, 0x00, 0x87, 0x5C, 0x00, 0x00, 0x95, 0x5C, 0x00, 0x00, 0xA1, +/* 00003E10 */ 0x5C, 0x00, 0x00, 0x09, 0x5D, 0x00, 0x00, 0x20, 0x5D, 0x00, 0x00, 0x26, 0x5D, 0x00, 0x00, 0x27, +/* 00003E20 */ 0x5D, 0x00, 0x00, 0x7D, 0x5D, 0x00, 0x00, 0xB0, 0x5D, 0x00, 0x00, 0xE9, 0x5D, 0x00, 0x00, 0xF3, +/* 00003E30 */ 0x5D, 0x00, 0x00, 0xF4, 0x5D, 0x00, 0x00, 0x2C, 0x5E, 0x00, 0x00, 0x67, 0x5E, 0x00, 0x00, 0xA0, +/* 00003E40 */ 0x5E, 0x00, 0x00, 0xAA, 0x5E, 0x00, 0x00, 0xAB, 0x5E, 0x00, 0x00, 0xE0, 0x5E, 0x00, 0x00, 0xE6, +/* 00003E50 */ 0x5E, 0x00, 0x00, 0xE7, 0x5E, 0x00, 0x00, 0x38, 0x5F, 0x00, 0x00, 0x6B, 0x5F, 0x00, 0x00, 0xA4, +/* 00003E60 */ 0x5F, 0x00, 0x00, 0xAE, 0x5F, 0x00, 0x00, 0xAF, 0x5F, 0x00, 0x00, 0xE7, 0x5F, 0x00, 0x00, 0x22, +/* 00003E70 */ 0x60, 0x00, 0x00, 0x5B, 0x60, 0x00, 0x00, 0x65, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x96, +/* 00003E80 */ 0x60, 0x00, 0x00, 0x9C, 0x60, 0x00, 0x00, 0x9D, 0x60, 0x00, 0x00, 0xC6, 0x60, 0x00, 0x00, 0x01, +/* 00003E90 */ 0x61, 0x00, 0x00, 0x16, 0x61, 0x00, 0x00, 0x49, 0x61, 0x00, 0x00, 0x4A, 0x61, 0x00, 0x00, 0x78, +/* 00003EA0 */ 0x61, 0x00, 0x00, 0xA5, 0x61, 0x00, 0x00, 0xA6, 0x61, 0x00, 0x00, 0xD8, 0x61, 0x00, 0x00, 0x0E, +/* 00003EB0 */ 0x62, 0x00, 0x00, 0x0F, 0x62, 0x00, 0x00, 0x55, 0x62, 0x00, 0x00, 0xCC, 0x62, 0x00, 0x00, 0xDE, +/* 00003EC0 */ 0x62, 0x00, 0x00, 0xEC, 0x62, 0x00, 0x00, 0xF6, 0x62, 0x00, 0x00, 0xF7, 0x62, 0x00, 0x00, 0x3F, +/* 00003ED0 */ 0x63, 0x00, 0x00, 0xC1, 0x63, 0x00, 0x00, 0xD2, 0x63, 0x00, 0x00, 0x34, 0x64, 0x00, 0x00, 0x3E, +/* 00003EE0 */ 0x64, 0x00, 0x00, 0x45, 0x64, 0x00, 0x00, 0x46, 0x64, 0x00, 0x00, 0x82, 0x64, 0x00, 0x00, 0xE3, +/* 00003EF0 */ 0x64, 0x00, 0x00, 0xE4, 0x64, 0x00, 0x00, 0x57, 0x65, 0x00, 0x00, 0xA7, 0x65, 0x00, 0x00, 0xF8, +/* 00003F00 */ 0x65, 0x00, 0x00, 0x7B, 0x66, 0x00, 0x00, 0xD2, 0x66, 0x00, 0x00, 0x3A, 0x67, 0x00, 0x00, 0x60, +/* 00003F10 */ 0x67, 0x00, 0x00, 0x61, 0x67, 0x00, 0x00, 0xBA, 0x67, 0x00, 0x00, 0x45, 0x68, 0x00, 0x00, 0xA0, +/* 00003F20 */ 0x68, 0x00, 0x00, 0x0C, 0x69, 0x00, 0x00, 0x32, 0x69, 0x00, 0x00, 0x33, 0x69, 0x00, 0x00, 0x90, +/* 00003F30 */ 0x69, 0x00, 0x00, 0x1F, 0x6A, 0x00, 0x00, 0x7C, 0x6A, 0x00, 0x00, 0xEA, 0x6A, 0x00, 0x00, 0x10, +/* 00003F40 */ 0x6B, 0x00, 0x00, 0x11, 0x6B, 0x00, 0x00, 0x52, 0x6B, 0x00, 0x00, 0xC5, 0x6B, 0x00, 0x00, 0xFF, +/* 00003F50 */ 0x6B, 0x00, 0x00, 0x5A, 0x6C, 0x00, 0x00, 0x80, 0x6C, 0x00, 0x00, 0x81, 0x6C, 0x00, 0x00, 0xDA, +/* 00003F60 */ 0x6C, 0x00, 0x00, 0x34, 0x6D, 0x00, 0x00, 0x83, 0x6D, 0x00, 0x00, 0xFF, 0x6D, 0x00, 0x00, 0x5F, +/* 00003F70 */ 0x6E, 0x00, 0x00, 0xC3, 0x6E, 0x00, 0x00, 0x29, 0x6F, 0x00, 0x00, 0x82, 0x6F, 0x00, 0x00, 0x83, +/* 00003F80 */ 0x6F, 0x00, 0x00, 0xEA, 0x6F, 0x00, 0x00, 0x2F, 0x70, 0x00, 0x00, 0x72, 0x70, 0x00, 0x00, 0xAB, +/* 00003F90 */ 0x70, 0x00, 0x00, 0xE6, 0x70, 0x00, 0x00, 0x21, 0x71, 0x00, 0x00, 0x5F, 0x71, 0x00, 0x00, 0x9C, +/* 00003FA0 */ 0x71, 0x00, 0x00, 0xD1, 0x71, 0x00, 0x00, 0x32, 0x72, 0x00, 0x00, 0x7D, 0x72, 0x00, 0x00, 0xC8, +/* 00003FB0 */ 0x72, 0x00, 0x00, 0x13, 0x73, 0x00, 0x00, 0x5D, 0x73, 0x00, 0x00, 0x5E, 0x73, 0x00, 0x00, 0xDD, +/* 00003FC0 */ 0x73, 0x00, 0x00, 0x78, 0x74, 0x00, 0x00, 0x98, 0x74, 0x00, 0x00, 0xB8, 0x74, 0x00, 0x00, 0xD6, +/* 00003FD0 */ 0x74, 0x00, 0x00, 0xE4, 0x74, 0x00, 0x00, 0xE5, 0x74, 0x00, 0x00, 0x48, 0x75, 0x00, 0x00, 0xC3, +/* 00003FE0 */ 0x75, 0x00, 0x00, 0x03, 0x76, 0x00, 0x00, 0x34, 0x76, 0x00, 0x00, 0xB3, 0x76, 0x00, 0x00, 0x09, +/* 00003FF0 */ 0x77, 0x00, 0x00, 0x4D, 0x77, 0x00, 0x00, 0x4E, 0x77, 0x00, 0x00, 0xCD, 0x77, 0x00, 0x00, 0x15, +/* 00004000 */ 0x78, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x83, 0x78, 0x00, 0x00, 0x95, 0x78, 0x00, 0x00, 0xA5, +/* 00004010 */ 0x78, 0x00, 0x00, 0xA6, 0x78, 0x00, 0x00, 0xDE, 0x78, 0x00, 0x00, 0xEA, 0x78, 0x00, 0x00, 0x03, +/* 00004020 */ 0x79, 0x00, 0x00, 0x0D, 0x79, 0x00, 0x00, 0x0E, 0x79, 0x00, 0x00, 0x5F, 0x79, 0x00, 0x00, 0x8D, +/* 00004030 */ 0x79, 0x00, 0x00, 0xB8, 0x79, 0x00, 0x00, 0xE4, 0x79, 0x00, 0x00, 0x1F, 0x7A, 0x00, 0x00, 0x49, +/* 00004040 */ 0x7A, 0x00, 0x00, 0x53, 0x7A, 0x00, 0x00, 0x54, 0x7A, 0x00, 0x00, 0x74, 0x7A, 0x00, 0x00, 0x97, +/* 00004050 */ 0x7A, 0x00, 0x00, 0xB9, 0x7A, 0x00, 0x00, 0x0D, 0x7B, 0x00, 0x00, 0x36, 0x7B, 0x00, 0x00, 0xA0, +/* 00004060 */ 0x7B, 0x00, 0x00, 0xB9, 0x7B, 0x00, 0x00, 0x0B, 0x7C, 0x00, 0x00, 0x54, 0x7C, 0x00, 0x00, 0x7A, +/* 00004070 */ 0x7C, 0x00, 0x00, 0xDC, 0x7C, 0x00, 0x00, 0xEA, 0x7C, 0x00, 0x00, 0xFB, 0x7C, 0x00, 0x00, 0x44, +/* 00004080 */ 0x7D, 0x00, 0x00, 0xA0, 0x7D, 0x00, 0x00, 0xBF, 0x7D, 0x00, 0x00, 0xE1, 0x7D, 0x00, 0x00, 0xEB, +/* 00004090 */ 0x7D, 0x00, 0x00, 0xEC, 0x7D, 0x00, 0x00, 0x13, 0x7E, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x69, +/* 000040A0 */ 0x7E, 0x00, 0x00, 0x73, 0x7E, 0x00, 0x00, 0x74, 0x7E, 0x00, 0x00, 0xD0, 0x7E, 0x00, 0x00, 0x25, +/* 000040B0 */ 0x7F, 0x00, 0x00, 0x4B, 0x7F, 0x00, 0x00, 0x89, 0x7F, 0x00, 0x00, 0x9E, 0x7F, 0x00, 0x00, 0xDE, +/* 000040C0 */ 0x7F, 0x00, 0x00, 0xEC, 0x7F, 0x00, 0x00, 0xF7, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x4E, +/* 000040D0 */ 0x80, 0x00, 0x00, 0x81, 0x80, 0x00, 0x00, 0xCE, 0x80, 0x00, 0x00, 0x22, 0x81, 0x00, 0x00, 0x4C, +/* 000040E0 */ 0x81, 0x00, 0x00, 0x56, 0x81, 0x00, 0x00, 0x57, 0x81, 0x00, 0x00, 0x99, 0x81, 0x00, 0x00, 0xC6, +/* 000040F0 */ 0x81, 0x00, 0x00, 0x20, 0x82, 0x00, 0x00, 0x31, 0x82, 0x00, 0x00, 0x85, 0x82, 0x00, 0x00, 0x8F, +/* 00004100 */ 0x82, 0x00, 0x00, 0x90, 0x82, 0x00, 0x00, 0xB6, 0x82, 0x00, 0x00, 0xBD, 0x82, 0x00, 0x00, 0xBE, +/* 00004110 */ 0x82, 0x00, 0x00, 0xF3, 0x82, 0x00, 0x00, 0x15, 0x83, 0x00, 0x00, 0x16, 0x83, 0x00, 0x00, 0x52, +/* 00004120 */ 0x83, 0x00, 0x00, 0x53, 0x83, 0x00, 0x00, 0x9C, 0x83, 0x00, 0x00, 0xCF, 0x83, 0x00, 0x00, 0xFF, +/* 00004130 */ 0x83, 0x00, 0x00, 0x11, 0x84, 0x00, 0x00, 0x12, 0x84, 0x00, 0x00, 0xA1, 0x84, 0x00, 0x00, 0xF7, +/* 00004140 */ 0x84, 0x00, 0x00, 0x09, 0x85, 0x00, 0x00, 0x0A, 0x85, 0x00, 0x00, 0x43, 0x85, 0x00, 0x00, 0x44, +/* 00004150 */ 0x85, 0x00, 0x00, 0x67, 0x85, 0x00, 0x00, 0x9D, 0x85, 0x00, 0x00, 0xD3, 0x85, 0x00, 0x00, 0xEC, +/* 00004160 */ 0x85, 0x00, 0x00, 0x26, 0x86, 0x00, 0x00, 0x38, 0x86, 0x00, 0x00, 0x39, 0x86, 0x00, 0x00, 0xAA, +/* 00004170 */ 0x86, 0x00, 0x00, 0x09, 0x87, 0x00, 0x00, 0x8A, 0x87, 0x00, 0x00, 0xF8, 0x87, 0x00, 0x00, 0x6B, +/* 00004180 */ 0x88, 0x00, 0x00, 0xCD, 0x88, 0x00, 0x00, 0xCE, 0x88, 0x00, 0x00, 0x06, 0x89, 0x00, 0x00, 0x47, +/* 00004190 */ 0x89, 0x00, 0x00, 0xB5, 0x89, 0x00, 0x00, 0xB6, 0x89, 0x00, 0x00, 0xE1, 0x89, 0x00, 0x00, 0x4A, +/* 000041A0 */ 0x8A, 0x00, 0x00, 0x8F, 0x8A, 0x00, 0x00, 0x90, 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0x2D, +/* 000041B0 */ 0x8B, 0x00, 0x00, 0xAF, 0x8B, 0x00, 0x00, 0xDB, 0x8B, 0x00, 0x00, 0x27, 0x8C, 0x00, 0x00, 0x6E, +/* 000041C0 */ 0x8C, 0x00, 0x00, 0x0A, 0x8D, 0x00, 0x00, 0x56, 0x8D, 0x00, 0x00, 0x8D, 0x8D, 0x00, 0x00, 0x11, +/* 000041D0 */ 0x8E, 0x00, 0x00, 0x36, 0x8E, 0x00, 0x00, 0x66, 0x8E, 0x00, 0x00, 0x84, 0x8E, 0x00, 0x00, 0x27, +/* 000041E0 */ 0x8F, 0x00, 0x00, 0x86, 0x8F, 0x00, 0x00, 0xB5, 0x8F, 0x00, 0x00, 0xCF, 0x8F, 0x00, 0x00, 0xE7, +/* 000041F0 */ 0x8F, 0x00, 0x00, 0xF9, 0x8F, 0x00, 0x00, 0x28, 0x90, 0x00, 0x00, 0x97, 0x90, 0x00, 0x00, 0xC6, +/* 00004200 */ 0x90, 0x00, 0x00, 0x54, 0x91, 0x00, 0x00, 0x8B, 0x91, 0x00, 0x00, 0xF5, 0x91, 0x00, 0x00, 0x0F, +/* 00004210 */ 0x92, 0x00, 0x00, 0x25, 0x92, 0x00, 0x00, 0x40, 0x92, 0x00, 0x00, 0x6F, 0x92, 0x00, 0x00, 0x85, +/* 00004220 */ 0x92, 0x00, 0x00, 0x97, 0x92, 0x00, 0x00, 0x98, 0x92, 0x00, 0x00, 0xC7, 0x92, 0x00, 0x00, 0xF6, +/* 00004230 */ 0x92, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x8B, 0x93, 0x00, 0x00, 0xAD, 0x93, 0x00, 0x00, 0xDB, +/* 00004240 */ 0x93, 0x00, 0x00, 0x09, 0x94, 0x00, 0x00, 0x0A, 0x94, 0x00, 0x00, 0x7B, 0x94, 0x00, 0x00, 0x04, +/* 00004250 */ 0x95, 0x00, 0x00, 0x6D, 0x95, 0x00, 0x00, 0xAC, 0x95, 0x00, 0x00, 0xC2, 0x95, 0x00, 0x00, 0xC3, +/* 00004260 */ 0x95, 0x00, 0x00, 0xE8, 0x95, 0x00, 0x00, 0x15, 0x96, 0x00, 0x00, 0x42, 0x96, 0x00, 0x00, 0x6F, +/* 00004270 */ 0x96, 0x00, 0x00, 0x8C, 0x96, 0x00, 0x00, 0xB9, 0x96, 0x00, 0x00, 0xCF, 0x96, 0x00, 0x00, 0xE1, +/* 00004280 */ 0x96, 0x00, 0x00, 0xE2, 0x96, 0x00, 0x00, 0x13, 0x97, 0x00, 0x00, 0x40, 0x97, 0x00, 0x00, 0x52, +/* 00004290 */ 0x97, 0x00, 0x00, 0x53, 0x97, 0x00, 0x00, 0x80, 0x97, 0x00, 0x00, 0xA5, 0x97, 0x00, 0x00, 0xB7, +/* 000042A0 */ 0x97, 0x00, 0x00, 0xB8, 0x97, 0x00, 0x00, 0xE9, 0x97, 0x00, 0x00, 0x17, 0x98, 0x00, 0x00, 0x64, +/* 000042B0 */ 0x98, 0x00, 0x00, 0xAC, 0x98, 0x00, 0x00, 0xD6, 0x98, 0x00, 0x00, 0x0C, 0x99, 0x00, 0x00, 0x4E, +/* 000042C0 */ 0x99, 0x00, 0x00, 0x80, 0x99, 0x00, 0x00, 0xAE, 0x99, 0x00, 0x00, 0xE0, 0x99, 0x00, 0x00, 0x17, +/* 000042D0 */ 0x9A, 0x00, 0x00, 0x25, 0x9A, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x95, 0x9A, 0x00, 0x00, 0xBE, +/* 000042E0 */ 0x9A, 0x00, 0x00, 0xF9, 0x9A, 0x00, 0x00, 0x53, 0x9B, 0x00, 0x00, 0x65, 0x9B, 0x00, 0x00, 0x8F, +/* 000042F0 */ 0x9B, 0x00, 0x00, 0xBF, 0x9B, 0x00, 0x00, 0xD1, 0x9B, 0x00, 0x00, 0x75, 0x9C, 0x00, 0x00, 0xA1, +/* 00004300 */ 0x9C, 0x00, 0x00, 0xCA, 0x9C, 0x00, 0x00, 0x04, 0x9D, 0x00, 0x00, 0x51, 0x9D, 0x00, 0x00, 0x0A, +/* 00004310 */ 0x9E, 0x00, 0x00, 0x46, 0x9E, 0x00, 0x00, 0x47, 0x9E, 0x00, 0x00, 0x6E, 0x9E, 0x00, 0x00, 0x6F, +/* 00004320 */ 0x9E, 0x00, 0x00, 0xBD, 0x9E, 0x00, 0x00, 0xFC, 0x9E, 0x00, 0x00, 0x3B, 0x9F, 0x00, 0x00, 0x51, +/* 00004330 */ 0x9F, 0x00, 0x00, 0x52, 0x9F, 0x00, 0x00, 0x89, 0x9F, 0x00, 0x00, 0xBD, 0x9F, 0x00, 0x00, 0x06, +/* 00004340 */ 0xA0, 0x00, 0x00, 0x1C, 0xA0, 0x00, 0x00, 0x1D, 0xA0, 0x00, 0x00, 0x58, 0xA0, 0x00, 0x00, 0x9E, +/* 00004350 */ 0xA0, 0x00, 0x00, 0x9F, 0xA0, 0x00, 0x00, 0xD5, 0xA0, 0x00, 0x00, 0x14, 0xA1, 0x00, 0x00, 0x59, +/* 00004360 */ 0xA1, 0x00, 0x00, 0x6F, 0xA1, 0x00, 0x00, 0x70, 0xA1, 0x00, 0x00, 0xB8, 0xA1, 0x00, 0x00, 0xB9, +/* 00004370 */ 0xA1, 0x00, 0x00, 0xE6, 0xA1, 0x00, 0x00, 0x4E, 0xA2, 0x00, 0x00, 0x8B, 0xA2, 0x00, 0x00, 0xAB, +/* 00004380 */ 0xA2, 0x00, 0x00, 0xBD, 0xA2, 0x00, 0x00, 0xFB, 0xA2, 0x00, 0x00, 0xFC, 0xA2, 0x00, 0x00, 0x25, +/* 00004390 */ 0xA3, 0x00, 0x00, 0x59, 0xA3, 0x00, 0x00, 0xBB, 0xA3, 0x00, 0x00, 0xD1, 0xA3, 0x00, 0x00, 0xD2, +/* 000043A0 */ 0xA3, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x76, 0xA4, 0x00, 0x00, 0xD8, 0xA4, 0x00, 0x00, 0xEE, +/* 000043B0 */ 0xA4, 0x00, 0x00, 0xEF, 0xA4, 0x00, 0x00, 0x12, 0xA5, 0x00, 0x00, 0x35, 0xA5, 0x00, 0x00, 0x36, +/* 000043C0 */ 0xA5, 0x00, 0x00, 0xEE, 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x4F, 0xA6, 0x00, 0x00, 0x50, +/* 000043D0 */ 0xA6, 0x00, 0x00, 0xE2, 0xA6, 0x00, 0x00, 0xE3, 0xA6, 0x00, 0x00, 0x74, 0xA7, 0x00, 0x00, 0xB8, +/* 000043E0 */ 0xA7, 0x00, 0x00, 0xB9, 0xA7, 0x00, 0x00, 0x4E, 0xA8, 0x00, 0x00, 0x4F, 0xA8, 0x00, 0x00, 0x9D, +/* 000043F0 */ 0xA8, 0x00, 0x00, 0xD5, 0xA8, 0x00, 0x00, 0x0D, 0xA9, 0x00, 0x00, 0x7B, 0xA9, 0x00, 0x00, 0x95, +/* 00004400 */ 0xA9, 0x00, 0x00, 0xE0, 0xA9, 0x00, 0x00, 0x41, 0xAA, 0x00, 0x00, 0xAF, 0xAA, 0x00, 0x00, 0xC9, +/* 00004410 */ 0xAA, 0x00, 0x00, 0xCA, 0xAA, 0x00, 0x00, 0xEB, 0xAA, 0x00, 0x00, 0x26, 0xAB, 0x00, 0x00, 0x5F, +/* 00004420 */ 0xAB, 0x00, 0x00, 0xA4, 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0x50, 0xAC, 0x00, 0x00, 0xE5, +/* 00004430 */ 0xAC, 0x00, 0x00, 0x7A, 0xAD, 0x00, 0x00, 0x94, 0xAD, 0x00, 0x00, 0xE1, 0xAD, 0x00, 0x00, 0xF5, +/* 00004440 */ 0xAD, 0x00, 0x00, 0xF6, 0xAD, 0x00, 0x00, 0x3C, 0xAE, 0x00, 0x00, 0x84, 0xAE, 0x00, 0x00, 0xBC, +/* 00004450 */ 0xAE, 0x00, 0x00, 0x22, 0xAF, 0x00, 0x00, 0x3C, 0xAF, 0x00, 0x00, 0x3D, 0xAF, 0x00, 0x00, 0x88, +/* 00004460 */ 0xAF, 0x00, 0x00, 0xE9, 0xAF, 0x00, 0x00, 0x4F, 0xB0, 0x00, 0x00, 0x69, 0xB0, 0x00, 0x00, 0x6A, +/* 00004470 */ 0xB0, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x00, 0xE4, 0xB0, 0x00, 0x00, 0xF8, 0xB0, 0x00, 0x00, 0xF9, +/* 00004480 */ 0xB0, 0x00, 0x00, 0x1A, 0xB1, 0x00, 0x00, 0x28, 0xB1, 0x00, 0x00, 0x32, 0xB1, 0x00, 0x00, 0x7D, +/* 00004490 */ 0xB1, 0x00, 0x00, 0x97, 0xB1, 0x00, 0x00, 0xA1, 0xB1, 0x00, 0x00, 0xA2, 0xB1, 0x00, 0x00, 0xDC, +/* 000044A0 */ 0xB1, 0x00, 0x00, 0x02, 0xB2, 0x00, 0x00, 0x51, 0xB2, 0x00, 0x00, 0x82, 0xB2, 0x00, 0x00, 0xB6, +/* 000044B0 */ 0xB2, 0x00, 0x00, 0x21, 0xB3, 0x00, 0x00, 0x6D, 0xB3, 0x00, 0x00, 0xC0, 0xB3, 0x00, 0x00, 0xD3, +/* 000044C0 */ 0xB3, 0x00, 0x00, 0xE5, 0xB3, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x53, 0xB4, 0x00, 0x00, 0xE2, +/* 000044D0 */ 0xB4, 0x00, 0x00, 0x53, 0xB5, 0x00, 0x00, 0xCA, 0xB5, 0x00, 0x00, 0xDD, 0xB5, 0x00, 0x00, 0xEF, +/* 000044E0 */ 0xB5, 0x00, 0x00, 0xF0, 0xB5, 0x00, 0x00, 0x2C, 0xB6, 0x00, 0x00, 0x7D, 0xB6, 0x00, 0x00, 0xB4, +/* 000044F0 */ 0xB6, 0x00, 0x00, 0xE4, 0xB6, 0x00, 0x00, 0xF6, 0xB6, 0x00, 0x00, 0xF7, 0xB6, 0x00, 0x00, 0x8E, +/* 00004500 */ 0xB7, 0x00, 0x00, 0xEC, 0xB7, 0x00, 0x00, 0xFE, 0xB7, 0x00, 0x00, 0xFF, 0xB7, 0x00, 0x00, 0x3C, +/* 00004510 */ 0xB8, 0x00, 0x00, 0x3D, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x96, 0xB8, 0x00, 0x00, 0xCC, +/* 00004520 */ 0xB8, 0x00, 0x00, 0xE5, 0xB8, 0x00, 0x00, 0x1F, 0xB9, 0x00, 0x00, 0x31, 0xB9, 0x00, 0x00, 0x32, +/* 00004530 */ 0xB9, 0x00, 0x00, 0xA3, 0xB9, 0x00, 0x00, 0x15, 0xBA, 0x00, 0x00, 0x16, 0xBA, 0x00, 0x00, 0x61, +/* 00004540 */ 0xBA, 0x00, 0x00, 0x8C, 0xBA, 0x00, 0x00, 0xCC, 0xBA, 0x00, 0x00, 0xFF, 0xBA, 0x00, 0x00, 0x40, +/* 00004550 */ 0xBB, 0x00, 0x00, 0x52, 0xBB, 0x00, 0x00, 0x53, 0xBB, 0x00, 0x00, 0xB2, 0xBB, 0x00, 0x00, 0x2F, +/* 00004560 */ 0xBC, 0x00, 0x00, 0x5F, 0xBC, 0x00, 0x00, 0x60, 0xBC, 0x00, 0x00, 0xC7, 0xBC, 0x00, 0x00, 0xFE, +/* 00004570 */ 0xBC, 0x00, 0x00, 0x35, 0xBD, 0x00, 0x00, 0x73, 0xBD, 0x00, 0x00, 0x74, 0xBD, 0x00, 0x00, 0xC5, +/* 00004580 */ 0xBD, 0x00, 0x00, 0x16, 0xBE, 0x00, 0x00, 0x17, 0xBE, 0x00, 0x00, 0x91, 0xBE, 0x00, 0x00, 0x00, +/* 00004590 */ 0xBF, 0x00, 0x00, 0x87, 0xBF, 0x00, 0x00, 0x99, 0xBF, 0x00, 0x00, 0x9A, 0xBF, 0x00, 0x00, 0xFB, +/* 000045A0 */ 0xBF, 0x00, 0x00, 0xFC, 0xBF, 0x00, 0x00, 0x34, 0xC0, 0x00, 0x00, 0x75, 0xC0, 0x00, 0x00, 0xE2, +/* 000045B0 */ 0xC0, 0x00, 0x00, 0xE3, 0xC0, 0x00, 0x00, 0x17, 0xC1, 0x00, 0x00, 0x75, 0xC1, 0x00, 0x00, 0xBE, +/* 000045C0 */ 0xC1, 0x00, 0x00, 0xD0, 0xC1, 0x00, 0x00, 0xD1, 0xC1, 0x00, 0x00, 0xFD, 0xC1, 0x00, 0x00, 0x38, +/* 000045D0 */ 0xC2, 0x00, 0x00, 0x75, 0xC2, 0x00, 0x00, 0x8B, 0xC2, 0x00, 0x00, 0xE1, 0xC2, 0x00, 0x00, 0xFB, +/* 000045E0 */ 0xC2, 0x00, 0x00, 0x47, 0xC3, 0x00, 0x00, 0x69, 0xC3, 0x00, 0x00, 0x97, 0xC3, 0x00, 0x00, 0xE4, +/* 000045F0 */ 0xC3, 0x00, 0x00, 0xFA, 0xC3, 0x00, 0x00, 0x70, 0xC4, 0x00, 0x00, 0xD4, 0xC4, 0x00, 0x00, 0xED, +/* 00004600 */ 0xC4, 0x00, 0x00, 0x17, 0xC5, 0x00, 0x00, 0x48, 0xC5, 0x00, 0x00, 0xB1, 0xC5, 0x00, 0x00, 0xE0, +/* 00004610 */ 0xC5, 0x00, 0x00, 0x3B, 0xC6, 0x00, 0x00, 0x58, 0xC6, 0x00, 0x00, 0xB2, 0xC6, 0x00, 0x00, 0xC8, +/* 00004620 */ 0xC6, 0x00, 0x00, 0xDA, 0xC6, 0x00, 0x00, 0xDB, 0xC6, 0x00, 0x00, 0x6F, 0xC7, 0x00, 0x00, 0x70, +/* 00004630 */ 0xC7, 0x00, 0x00, 0xA1, 0xC7, 0x00, 0x00, 0xD9, 0xC7, 0x00, 0x00, 0x1C, 0xC8, 0x00, 0x00, 0x4A, +/* 00004640 */ 0xC8, 0x00, 0x00, 0x4B, 0xC8, 0x00, 0x00, 0x79, 0xC8, 0x00, 0x00, 0xB1, 0xC8, 0x00, 0x00, 0xC3, +/* 00004650 */ 0xC8, 0x00, 0x00, 0xC4, 0xC8, 0x00, 0x00, 0xF9, 0xC8, 0x00, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x9E, +/* 00004660 */ 0xC9, 0x00, 0x00, 0xD6, 0xC9, 0x00, 0x00, 0x38, 0xCA, 0x00, 0x00, 0x75, 0xCA, 0x00, 0x00, 0xD5, +/* 00004670 */ 0xCA, 0x00, 0x00, 0x12, 0xCB, 0x00, 0x00, 0x72, 0xCB, 0x00, 0x00, 0x88, 0xCB, 0x00, 0x00, 0x9A, +/* 00004680 */ 0xCB, 0x00, 0x00, 0x9B, 0xCB, 0x00, 0x00, 0xE7, 0xCB, 0x00, 0x00, 0x35, 0xCC, 0x00, 0x00, 0x83, +/* 00004690 */ 0xCC, 0x00, 0x00, 0x84, 0xCC, 0x00, 0x00, 0xC2, 0xCC, 0x00, 0x00, 0x1A, 0xCD, 0x00, 0x00, 0x72, +/* 000046A0 */ 0xCD, 0x00, 0x00, 0x84, 0xCD, 0x00, 0x00, 0x85, 0xCD, 0x00, 0x00, 0xC5, 0xCD, 0x00, 0x00, 0xFF, +/* 000046B0 */ 0xCD, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x16, 0xCE, 0x00, 0x00, 0x6A, 0xCE, 0x00, 0x00, 0xA8, +/* 000046C0 */ 0xCE, 0x00, 0x00, 0xC6, 0xCE, 0x00, 0x00, 0xF0, 0xCE, 0x00, 0x00, 0x47, 0xCF, 0x00, 0x00, 0xCC, +/* 000046D0 */ 0xCF, 0x00, 0x00, 0x31, 0xD0, 0x00, 0x00, 0x6C, 0xD0, 0x00, 0x00, 0x7E, 0xD0, 0x00, 0x00, 0x7F, +/* 000046E0 */ 0xD0, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x00, 0x17, 0xD1, 0x00, 0x00, 0x29, 0xD1, 0x00, 0x00, 0x2A, +/* 000046F0 */ 0xD1, 0x00, 0x00, 0xA8, 0xD1, 0x00, 0x00, 0xE7, 0xD1, 0x00, 0x00, 0xF5, 0xD1, 0x00, 0x00, 0xF6, +/* 00004700 */ 0xD1, 0x00, 0x00, 0x66, 0xD2, 0x00, 0x00, 0xB5, 0xD2, 0x00, 0x00, 0x16, 0xD3, 0x00, 0x00, 0x28, +/* 00004710 */ 0xD3, 0x00, 0x00, 0x29, 0xD3, 0x00, 0x00, 0x63, 0xD3, 0x00, 0x00, 0xB4, 0xD3, 0x00, 0x00, 0xB5, +/* 00004720 */ 0xD3, 0x00, 0x00, 0xE6, 0xD3, 0x00, 0x00, 0x3A, 0xD4, 0x00, 0x00, 0x8F, 0xD4, 0x00, 0x00, 0xCC, +/* 00004730 */ 0xD4, 0x00, 0x00, 0xCD, 0xD4, 0x00, 0x00, 0xF4, 0xD4, 0x00, 0x00, 0x46, 0xD5, 0x00, 0x00, 0x85, +/* 00004740 */ 0xD5, 0x00, 0x00, 0xC8, 0xD5, 0x00, 0x00, 0xDE, 0xD5, 0x00, 0x00, 0xDF, 0xD5, 0x00, 0x00, 0x16, +/* 00004750 */ 0xD6, 0x00, 0x00, 0x17, 0xD6, 0x00, 0x00, 0x4B, 0xD6, 0x00, 0x00, 0x98, 0xD6, 0x00, 0x00, 0xAE, +/* 00004760 */ 0xD6, 0x00, 0x00, 0xAF, 0xD6, 0x00, 0x00, 0xEA, 0xD6, 0x00, 0x00, 0x30, 0xD7, 0x00, 0x00, 0x31, +/* 00004770 */ 0xD7, 0x00, 0x00, 0x67, 0xD7, 0x00, 0x00, 0xA6, 0xD7, 0x00, 0x00, 0xEB, 0xD7, 0x00, 0x00, 0x01, +/* 00004780 */ 0xD8, 0x00, 0x00, 0x02, 0xD8, 0x00, 0x00, 0x4E, 0xD8, 0x00, 0x00, 0x4F, 0xD8, 0x00, 0x00, 0xB4, +/* 00004790 */ 0xD8, 0x00, 0x00, 0xF0, 0xD8, 0x00, 0x00, 0xF1, 0xD8, 0x00, 0x00, 0x11, 0xD9, 0x00, 0x00, 0x23, +/* 000047A0 */ 0xD9, 0x00, 0x00, 0x69, 0xD9, 0x00, 0x00, 0x6A, 0xD9, 0x00, 0x00, 0x8F, 0xD9, 0x00, 0x00, 0xBD, +/* 000047B0 */ 0xD9, 0x00, 0x00, 0xBE, 0xD9, 0x00, 0x00, 0xF2, 0xD9, 0x00, 0x00, 0x5B, 0xDA, 0x00, 0x00, 0x71, +/* 000047C0 */ 0xDA, 0x00, 0x00, 0x72, 0xDA, 0x00, 0x00, 0xB9, 0xDA, 0x00, 0x00, 0x1A, 0xDB, 0x00, 0x00, 0x83, +/* 000047D0 */ 0xDB, 0x00, 0x00, 0x99, 0xDB, 0x00, 0x00, 0x9A, 0xDB, 0x00, 0x00, 0xF2, 0xDB, 0x00, 0x00, 0x4C, +/* 000047E0 */ 0xDC, 0x00, 0x00, 0x5E, 0xDC, 0x00, 0x00, 0xAF, 0xDC, 0x00, 0x00, 0xB0, 0xDC, 0x00, 0x00, 0x4A, +/* 000047F0 */ 0xDD, 0x00, 0x00, 0x4B, 0xDD, 0x00, 0x00, 0xC7, 0xDD, 0x00, 0x00, 0x45, 0xDE, 0x00, 0x00, 0x69, +/* 00004800 */ 0xDE, 0x00, 0x00, 0x6A, 0xDE, 0x00, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x4B, 0xDF, 0x00, 0x00, 0xE8, +/* 00004810 */ 0xDF, 0x00, 0x00, 0xE9, 0xDF, 0x00, 0x00, 0x3B, 0xE0, 0x00, 0x00, 0x73, 0xE0, 0x00, 0x00, 0xAB, +/* 00004820 */ 0xE0, 0x00, 0x00, 0x21, 0xE1, 0x00, 0x00, 0x3B, 0xE1, 0x00, 0x00, 0x86, 0xE1, 0x00, 0x00, 0xEB, +/* 00004830 */ 0xE1, 0x00, 0x00, 0x61, 0xE2, 0x00, 0x00, 0x7B, 0xE2, 0x00, 0x00, 0x7C, 0xE2, 0x00, 0x00, 0xC2, +/* 00004840 */ 0xE2, 0x00, 0x00, 0xC3, 0xE2, 0x00, 0x00, 0x1F, 0xE3, 0x00, 0x00, 0x75, 0xE3, 0x00, 0x00, 0xCC, +/* 00004850 */ 0xE3, 0x00, 0x00, 0xEA, 0xE3, 0x00, 0x00, 0x06, 0xE4, 0x00, 0x00, 0x07, 0xE4, 0x00, 0x00, 0x49, +/* 00004860 */ 0xE4, 0x00, 0x00, 0x96, 0xE4, 0x00, 0x00, 0xAA, 0xE4, 0x00, 0x00, 0xAB, 0xE4, 0x00, 0x00, 0xF4, +/* 00004870 */ 0xE4, 0x00, 0x00, 0x3B, 0xE5, 0x00, 0x00, 0x73, 0xE5, 0x00, 0x00, 0xE0, 0xE5, 0x00, 0x00, 0xFA, +/* 00004880 */ 0xE5, 0x00, 0x00, 0xFB, 0xE5, 0x00, 0x00, 0x46, 0xE6, 0x00, 0x00, 0xAB, 0xE6, 0x00, 0x00, 0x18, +/* 00004890 */ 0xE7, 0x00, 0x00, 0x32, 0xE7, 0x00, 0x00, 0x33, 0xE7, 0x00, 0x00, 0x6E, 0xE7, 0x00, 0x00, 0xAC, +/* 000048A0 */ 0xE7, 0x00, 0x00, 0xC0, 0xE7, 0x00, 0x00, 0xC1, 0xE7, 0x00, 0x00, 0xE6, 0xE7, 0x00, 0x00, 0xF4, +/* 000048B0 */ 0xE7, 0x00, 0x00, 0xFE, 0xE7, 0x00, 0x00, 0x4D, 0xE8, 0x00, 0x00, 0x67, 0xE8, 0x00, 0x00, 0x71, +/* 000048C0 */ 0xE8, 0x00, 0x00, 0x72, 0xE8, 0x00, 0x00, 0xF2, 0xE8, 0x00, 0x00, 0x1A, 0xE9, 0x00, 0x00, 0x1B, +/* 000048D0 */ 0xE9, 0x00, 0x00, 0x55, 0xE9, 0x00, 0x00, 0x9B, 0xE9, 0x00, 0x00, 0xC8, 0xE9, 0x00, 0x00, 0xFE, +/* 000048E0 */ 0xE9, 0x00, 0x00, 0x17, 0xEA, 0x00, 0x00, 0x51, 0xEA, 0x00, 0x00, 0x63, 0xEA, 0x00, 0x00, 0x64, +/* 000048F0 */ 0xEA, 0x00, 0x00, 0x8D, 0xEA, 0x00, 0x00, 0xCE, 0xEA, 0x00, 0x00, 0x61, 0xEB, 0x00, 0x00, 0x8F, +/* 00004900 */ 0xEB, 0x00, 0x00, 0xA5, 0xEB, 0x00, 0x00, 0xB7, 0xEB, 0x00, 0x00, 0xF8, 0xEB, 0x00, 0x00, 0x6E, +/* 00004910 */ 0xEC, 0x00, 0x00, 0x9C, 0xEC, 0x00, 0x00, 0xB2, 0xEC, 0x00, 0x00, 0xC4, 0xEC, 0x00, 0x00, 0xC5, +/* 00004920 */ 0xEC, 0x00, 0x00, 0x18, 0xED, 0x00, 0x00, 0x54, 0xED, 0x00, 0x00, 0x8E, 0xED, 0x00, 0x00, 0xCB, +/* 00004930 */ 0xED, 0x00, 0x00, 0xE3, 0xED, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x5A, 0xEE, 0x00, 0x00, 0x97, +/* 00004940 */ 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xEA, 0xEE, 0x00, 0x00, 0x24, 0xEF, 0x00, 0x00, 0x61, +/* 00004950 */ 0xEF, 0x00, 0x00, 0x79, 0xEF, 0x00, 0x00, 0x8B, 0xEF, 0x00, 0x00, 0xDE, 0xEF, 0x00, 0x00, 0x1A, +/* 00004960 */ 0xF0, 0x00, 0x00, 0x54, 0xF0, 0x00, 0x00, 0x91, 0xF0, 0x00, 0x00, 0xA9, 0xF0, 0x00, 0x00, 0xE7, +/* 00004970 */ 0xF0, 0x00, 0x00, 0x21, 0xF1, 0x00, 0x00, 0x5E, 0xF1, 0x00, 0x00, 0x76, 0xF1, 0x00, 0x00, 0xB4, +/* 00004980 */ 0xF1, 0x00, 0x00, 0xEE, 0xF1, 0x00, 0x00, 0x2B, 0xF2, 0x00, 0x00, 0x43, 0xF2, 0x00, 0x00, 0x55, +/* 00004990 */ 0xF2, 0x00, 0x00, 0x75, 0xF2, 0x00, 0x00, 0x83, 0xF2, 0x00, 0x00, 0x84, 0xF2, 0x00, 0x00, 0x0E, +/* 000049A0 */ 0xF3, 0x00, 0x00, 0x4B, 0xF3, 0x00, 0x00, 0x6E, 0xF3, 0x00, 0x00, 0x6F, 0xF3, 0x00, 0x00, 0x96, +/* 000049B0 */ 0xF3, 0x00, 0x00, 0xED, 0xF3, 0x00, 0x00, 0x4D, 0xF4, 0x00, 0x00, 0x8A, 0xF4, 0x00, 0x00, 0xE3, +/* 000049C0 */ 0xF4, 0x00, 0x00, 0xF9, 0xF4, 0x00, 0x00, 0x0B, 0xF5, 0x00, 0x00, 0x0C, 0xF5, 0x00, 0x00, 0x37, +/* 000049D0 */ 0xF5, 0x00, 0x00, 0x5B, 0xF5, 0x00, 0x00, 0x91, 0xF5, 0x00, 0x00, 0xEC, 0xF5, 0x00, 0x00, 0x29, +/* 000049E0 */ 0xF6, 0x00, 0x00, 0x7D, 0xF6, 0x00, 0x00, 0x93, 0xF6, 0x00, 0x00, 0xA5, 0xF6, 0x00, 0x00, 0xA6, +/* 000049F0 */ 0xF6, 0x00, 0x00, 0xCB, 0xF6, 0x00, 0x00, 0x21, 0xF7, 0x00, 0x00, 0x78, 0xF7, 0x00, 0x00, 0xD2, +/* 00004A00 */ 0xF7, 0x00, 0x00, 0x2E, 0xF8, 0x00, 0x00, 0x69, 0xF8, 0x00, 0x00, 0xBE, 0xF8, 0x00, 0x00, 0xD4, +/* 00004A10 */ 0xF8, 0x00, 0x00, 0xE6, 0xF8, 0x00, 0x00, 0xE7, 0xF8, 0x00, 0x00, 0x0A, 0xF9, 0x00, 0x00, 0x54, +/* 00004A20 */ 0xF9, 0x00, 0x00, 0x66, 0xF9, 0x00, 0x00, 0x67, 0xF9, 0x00, 0x00, 0x93, 0xF9, 0x00, 0x00, 0xCF, +/* 00004A30 */ 0xF9, 0x00, 0x00, 0x2E, 0xFA, 0x00, 0x00, 0x70, 0xFA, 0x00, 0x00, 0xC8, 0xFA, 0x00, 0x00, 0xDE, +/* 00004A40 */ 0xFA, 0x00, 0x00, 0xF0, 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0x57, 0xFB, 0x00, 0x00, 0x7F, +/* 00004A50 */ 0xFB, 0x00, 0x00, 0xCB, 0xFB, 0x00, 0x00, 0xE1, 0xFB, 0x00, 0x00, 0xF5, 0xFB, 0x00, 0x00, 0xF6, +/* 00004A60 */ 0xFB, 0x00, 0x00, 0x2C, 0xFC, 0x00, 0x00, 0xA2, 0xFC, 0x00, 0x00, 0xB0, 0xFC, 0x00, 0x00, 0xB1, +/* 00004A70 */ 0xFC, 0x00, 0x00, 0xDE, 0xFC, 0x00, 0x00, 0x0E, 0xFD, 0x00, 0x00, 0x3A, 0xFD, 0x00, 0x00, 0x66, +/* 00004A80 */ 0xFD, 0x00, 0x00, 0x96, 0xFD, 0x00, 0x00, 0xC2, 0xFD, 0x00, 0x00, 0xEE, 0xFD, 0x00, 0x00, 0x23, +/* 00004A90 */ 0xFE, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x00, 0x76, 0xFE, 0x00, 0x00, 0x85, 0xFE, 0x00, 0x00, 0x86, +/* 00004AA0 */ 0xFE, 0x00, 0x00, 0xBD, 0xFE, 0x00, 0x00, 0xF4, 0xFE, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x25, +/* 00004AB0 */ 0xFF, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x00, 0x6E, 0xFF, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x7D, +/* 00004AC0 */ 0xFF, 0x00, 0x00, 0xED, 0xFF, 0x00, 0x00, 0x49, 0x00, 0x01, 0x00, 0xBF, 0x00, 0x01, 0x00, 0x50, +/* 00004AD0 */ 0x01, 0x01, 0x00, 0xCE, 0x01, 0x01, 0x00, 0xF4, 0x01, 0x01, 0x00, 0xE9, 0x02, 0x01, 0x00, 0x13, +/* 00004AE0 */ 0x03, 0x01, 0x00, 0x25, 0x03, 0x01, 0x00, 0x26, 0x03, 0x01, 0x00, 0x69, 0x03, 0x01, 0x00, 0xEB, +/* 00004AF0 */ 0x03, 0x01, 0x00, 0x1E, 0x04, 0x01, 0x00, 0xD4, 0x04, 0x01, 0x00, 0xE6, 0x04, 0x01, 0x00, 0x0C, +/* 00004B00 */ 0x05, 0x01, 0x00, 0x1A, 0x05, 0x01, 0x00, 0x1B, 0x05, 0x01, 0x00, 0x80, 0x05, 0x01, 0x00, 0xCA, +/* 00004B10 */ 0x05, 0x01, 0x00, 0x3E, 0x06, 0x01, 0x00, 0xCF, 0x06, 0x01, 0x00, 0xF5, 0x06, 0x01, 0x00, 0xF5, +/* 00004B20 */ 0x07, 0x01, 0x00, 0x1F, 0x08, 0x01, 0x00, 0x31, 0x08, 0x01, 0x00, 0x32, 0x08, 0x01, 0x00, 0x7C, +/* 00004B30 */ 0x08, 0x01, 0x00, 0xAB, 0x08, 0x01, 0x00, 0x29, 0x09, 0x01, 0x00, 0x5E, 0x09, 0x01, 0x00, 0xD9, +/* 00004B40 */ 0x09, 0x01, 0x00, 0xEB, 0x09, 0x01, 0x00, 0xEC, 0x09, 0x01, 0x00, 0x12, 0x0A, 0x01, 0x00, 0x20, +/* 00004B50 */ 0x0A, 0x01, 0x00, 0x21, 0x0A, 0x01, 0x00, 0x83, 0x0A, 0x01, 0x00, 0xCE, 0x0A, 0x01, 0x00, 0x0C, +/* 00004B60 */ 0x0B, 0x01, 0x00, 0x85, 0x0B, 0x01, 0x00, 0x97, 0x0B, 0x01, 0x00, 0x98, 0x0B, 0x01, 0x00, 0xD2, +/* 00004B70 */ 0x0B, 0x01, 0x00, 0x3F, 0x0C, 0x01, 0x00, 0x9E, 0x0C, 0x01, 0x00, 0x13, 0x0D, 0x01, 0x00, 0x25, +/* 00004B80 */ 0x0D, 0x01, 0x00, 0x26, 0x0D, 0x01, 0x00, 0x61, 0x0D, 0x01, 0x00, 0xCC, 0x0D, 0x01, 0x00, 0xF6, +/* 00004B90 */ 0x0D, 0x01, 0x00, 0x6A, 0x0E, 0x01, 0x00, 0x87, 0x0E, 0x01, 0x00, 0x0A, 0x0F, 0x01, 0x00, 0x20, +/* 00004BA0 */ 0x0F, 0x01, 0x00, 0x5F, 0x0F, 0x01, 0x00, 0xCA, 0x0F, 0x01, 0x00, 0xF4, 0x0F, 0x01, 0x00, 0x68, +/* 00004BB0 */ 0x10, 0x01, 0x00, 0x85, 0x10, 0x01, 0x00, 0xFE, 0x10, 0x01, 0x00, 0x14, 0x11, 0x01, 0x00, 0x26, +/* 00004BC0 */ 0x11, 0x01, 0x00, 0x27, 0x11, 0x01, 0x00, 0xBC, 0x11, 0x01, 0x00, 0x48, 0x12, 0x01, 0x00, 0xBB, +/* 00004BD0 */ 0x12, 0x01, 0x00, 0xFE, 0x12, 0x01, 0x00, 0x7A, 0x13, 0x01, 0x00, 0x8C, 0x13, 0x01, 0x00, 0x8D, +/* 00004BE0 */ 0x13, 0x01, 0x00, 0xC7, 0x13, 0x01, 0x00, 0x3F, 0x14, 0x01, 0x00, 0x51, 0x14, 0x01, 0x00, 0x52, +/* 00004BF0 */ 0x14, 0x01, 0x00, 0x8D, 0x14, 0x01, 0x00, 0x07, 0x15, 0x01, 0x00, 0x19, 0x15, 0x01, 0x00, 0x1A, +/* 00004C00 */ 0x15, 0x01, 0x00, 0x57, 0x15, 0x01, 0x00, 0xD5, 0x15, 0x01, 0x00, 0xE7, 0x15, 0x01, 0x00, 0xE8, +/* 00004C10 */ 0x15, 0x01, 0x00, 0x25, 0x16, 0x01, 0x00, 0xA3, 0x16, 0x01, 0x00, 0xB5, 0x16, 0x01, 0x00, 0xB6, +/* 00004C20 */ 0x16, 0x01, 0x00, 0xF9, 0x16, 0x01, 0x00, 0x76, 0x17, 0x01, 0x00, 0x88, 0x17, 0x01, 0x00, 0x89, +/* 00004C30 */ 0x17, 0x01, 0x00, 0xAF, 0x17, 0x01, 0x00, 0xBD, 0x17, 0x01, 0x00, 0xBE, 0x17, 0x01, 0x00, 0x13, +/* 00004C40 */ 0x18, 0x01, 0x00, 0x4C, 0x18, 0x01, 0x00, 0x7C, 0x18, 0x01, 0x00, 0x8E, 0x18, 0x01, 0x00, 0x8F, +/* 00004C50 */ 0x18, 0x01, 0x00, 0x2A, 0x19, 0x01, 0x00, 0x8C, 0x19, 0x01, 0x00, 0x9E, 0x19, 0x01, 0x00, 0x9F, +/* 00004C60 */ 0x19, 0x01, 0x00, 0xDE, 0x19, 0x01, 0x00, 0xDF, 0x19, 0x01, 0x00, 0x06, 0x1A, 0x01, 0x00, 0x4B, +/* 00004C70 */ 0x1A, 0x01, 0x00, 0x4C, 0x1A, 0x01, 0x00, 0xBD, 0x1A, 0x01, 0x00, 0x1C, 0x1B, 0x01, 0x00, 0x1D, +/* 00004C80 */ 0x1B, 0x01, 0x00, 0x4B, 0x1B, 0x01, 0x00, 0x9E, 0x1B, 0x01, 0x00, 0xB7, 0x1B, 0x01, 0x00, 0xF5, +/* 00004C90 */ 0x1B, 0x01, 0x00, 0x07, 0x1C, 0x01, 0x00, 0x08, 0x1C, 0x01, 0x00, 0x36, 0x1C, 0x01, 0x00, 0x71, +/* 00004CA0 */ 0x1C, 0x01, 0x00, 0x83, 0x1C, 0x01, 0x00, 0x84, 0x1C, 0x01, 0x00, 0xA6, 0x1C, 0x01, 0x00, 0x15, +/* 00004CB0 */ 0x1D, 0x01, 0x00, 0x7C, 0x1D, 0x01, 0x00, 0xE0, 0x1D, 0x01, 0x00, 0x61, 0x1E, 0x01, 0x00, 0xC3, +/* 00004CC0 */ 0x1E, 0x01, 0x00, 0x27, 0x1F, 0x01, 0x00, 0x8F, 0x1F, 0x01, 0x00, 0xF7, 0x1F, 0x01, 0x00, 0x66, +/* 00004CD0 */ 0x20, 0x01, 0x00, 0x67, 0x20, 0x01, 0x00, 0xD6, 0x20, 0x01, 0x00, 0x4C, 0x21, 0x01, 0x00, 0x4D, +/* 00004CE0 */ 0x21, 0x01, 0x00, 0xBD, 0x21, 0x01, 0x00, 0xBE, 0x21, 0x01, 0x00, 0x0F, 0x22, 0x01, 0x00, 0x35, +/* 00004CF0 */ 0x22, 0x01, 0x00, 0x53, 0x22, 0x01, 0x00, 0x73, 0x22, 0x01, 0x00, 0x95, 0x22, 0x01, 0x00, 0xB3, +/* 00004D00 */ 0x22, 0x01, 0x00, 0xD3, 0x22, 0x01, 0x00, 0xF7, 0x22, 0x01, 0x00, 0x1B, 0x23, 0x01, 0x00, 0x4A, +/* 00004D10 */ 0x23, 0x01, 0x00, 0x65, 0x23, 0x01, 0x00, 0x66, 0x23, 0x01, 0x00, 0x8E, 0x23, 0x01, 0x00, 0xCF, +/* 00004D20 */ 0x23, 0x01, 0x00, 0x42, 0x24, 0x01, 0x00, 0x43, 0x24, 0x01, 0x00, 0x69, 0x24, 0x01, 0x00, 0x9D, +/* 00004D30 */ 0x24, 0x01, 0x00, 0xD3, 0x24, 0x01, 0x00, 0x18, 0x25, 0x01, 0x00, 0x19, 0x25, 0x01, 0x00, 0x3B, +/* 00004D40 */ 0x25, 0x01, 0x00, 0x6F, 0x25, 0x01, 0x00, 0x9B, 0x25, 0x01, 0x00, 0xC9, 0x25, 0x01, 0x00, 0xF9, +/* 00004D50 */ 0x25, 0x01, 0x00, 0x25, 0x26, 0x01, 0x00, 0x53, 0x26, 0x01, 0x00, 0x85, 0x26, 0x01, 0x00, 0xB7, +/* 00004D60 */ 0x26, 0x01, 0x00, 0xF5, 0x26, 0x01, 0x00, 0xF6, 0x26, 0x01, 0x00, 0x28, 0x27, 0x01, 0x00, 0x68, +/* 00004D70 */ 0x27, 0x01, 0x00, 0xA6, 0x27, 0x01, 0x00, 0xA7, 0x27, 0x01, 0x00, 0xE9, 0x27, 0x01, 0x00, 0xEA, +/* 00004D80 */ 0x27, 0x01, 0x00, 0xFD, 0x27, 0x01, 0x00, 0x16, 0x28, 0x01, 0x00, 0x6B, 0x28, 0x01, 0x00, 0xE2, +/* 00004D90 */ 0x28, 0x01, 0x00, 0x84, 0x29, 0x01, 0x00, 0x28, 0x2A, 0x01, 0x00, 0x8D, 0x2A, 0x01, 0x00, 0xA1, +/* 00004DA0 */ 0x2A, 0x01, 0x00, 0xCA, 0x2A, 0x01, 0x00, 0xCB, 0x2A, 0x01, 0x00, 0xE1, 0x2A, 0x01, 0x00, 0x30, +/* 00004DB0 */ 0x2B, 0x01, 0x00, 0x71, 0x2B, 0x01, 0x00, 0x8F, 0x2B, 0x01, 0x00, 0xB9, 0x2B, 0x01, 0x00, 0xE3, +/* 00004DC0 */ 0x2B, 0x01, 0x00, 0xE4, 0x2B, 0x01, 0x00, 0x52, 0x2C, 0x01, 0x00, 0xA8, 0x2C, 0x01, 0x00, 0xFC, +/* 00004DD0 */ 0x2C, 0x01, 0x00, 0x66, 0x2D, 0x01, 0x00, 0x8E, 0x2D, 0x01, 0x00, 0xA0, 0x2D, 0x01, 0x00, 0xA1, +/* 00004DE0 */ 0x2D, 0x01, 0x00, 0xC5, 0x2D, 0x01, 0x00, 0xF7, 0x2D, 0x01, 0x00, 0x77, 0x2E, 0x01, 0x00, 0x89, +/* 00004DF0 */ 0x2E, 0x01, 0x00, 0x8A, 0x2E, 0x01, 0x00, 0xA0, 0x2E, 0x01, 0x00, 0xD5, 0x2E, 0x01, 0x00, 0x15, +/* 00004E00 */ 0x2F, 0x01, 0x00, 0x33, 0x2F, 0x01, 0x00, 0x5D, 0x2F, 0x01, 0x00, 0x87, 0x2F, 0x01, 0x00, 0x88, +/* 00004E10 */ 0x2F, 0x01, 0x00, 0xEA, 0x2F, 0x01, 0x00, 0x6F, 0x30, 0x01, 0x00, 0xD4, 0x30, 0x01, 0x00, 0x0F, +/* 00004E20 */ 0x31, 0x01, 0x00, 0x21, 0x31, 0x01, 0x00, 0x22, 0x31, 0x01, 0x00, 0x4F, 0x31, 0x01, 0x00, 0xB4, +/* 00004E30 */ 0x31, 0x01, 0x00, 0xB5, 0x31, 0x01, 0x00, 0x37, 0x32, 0x01, 0x00, 0x72, 0x32, 0x01, 0x00, 0xD1, +/* 00004E40 */ 0x32, 0x01, 0x00, 0xE3, 0x32, 0x01, 0x00, 0x26, 0x33, 0x01, 0x00, 0x34, 0x33, 0x01, 0x00, 0x35, +/* 00004E50 */ 0x33, 0x01, 0x00, 0x8B, 0x33, 0x01, 0x00, 0xE9, 0x33, 0x01, 0x00, 0x39, 0x34, 0x01, 0x00, 0x5C, +/* 00004E60 */ 0x34, 0x01, 0x00, 0x83, 0x34, 0x01, 0x00, 0xA9, 0x34, 0x01, 0x00, 0xBF, 0x34, 0x01, 0x00, 0xC0, +/* 00004E70 */ 0x34, 0x01, 0x00, 0x35, 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0xC2, 0x35, 0x01, 0x00, 0xD4, +/* 00004E80 */ 0x35, 0x01, 0x00, 0x27, 0x36, 0x01, 0x00, 0x5F, 0x36, 0x01, 0x00, 0x8A, 0x36, 0x01, 0x00, 0x9C, +/* 00004E90 */ 0x36, 0x01, 0x00, 0x9D, 0x36, 0x01, 0x00, 0xCA, 0x36, 0x01, 0x00, 0x0C, 0x37, 0x01, 0x00, 0x7A, +/* 00004EA0 */ 0x37, 0x01, 0x00, 0xC9, 0x37, 0x01, 0x00, 0xFA, 0x37, 0x01, 0x00, 0x55, 0x38, 0x01, 0x00, 0x72, +/* 00004EB0 */ 0x38, 0x01, 0x00, 0x9C, 0x38, 0x01, 0x00, 0xDA, 0x38, 0x01, 0x00, 0x54, 0x39, 0x01, 0x00, 0xAF, +/* 00004EC0 */ 0x39, 0x01, 0x00, 0xC5, 0x39, 0x01, 0x00, 0xD7, 0x39, 0x01, 0x00, 0xD8, 0x39, 0x01, 0x00, 0xFC, +/* 00004ED0 */ 0x39, 0x01, 0x00, 0x36, 0x3A, 0x01, 0x00, 0xA8, 0x3A, 0x01, 0x00, 0xBA, 0x3A, 0x01, 0x00, 0xBB, +/* 00004EE0 */ 0x3A, 0x01, 0x00, 0x19, 0x3B, 0x01, 0x00, 0x27, 0x3B, 0x01, 0x00, 0x28, 0x3B, 0x01, 0x00, 0xA5, +/* 00004EF0 */ 0x3B, 0x01, 0x00, 0x31, 0x3C, 0x01, 0x00, 0xB0, 0x3C, 0x01, 0x00, 0x39, 0x3D, 0x01, 0x00, 0x5E, +/* 00004F00 */ 0x3D, 0x01, 0x00, 0x6D, 0x3D, 0x01, 0x00, 0xF8, 0x3D, 0x01, 0x00, 0x7E, 0x3E, 0x01, 0x00, 0x08, +/* 00004F10 */ 0x3F, 0x01, 0x00, 0x5C, 0x3F, 0x01, 0x00, 0x6B, 0x3F, 0x01, 0x00, 0xED, 0x3F, 0x01, 0x00, 0x5E, +/* 00004F20 */ 0x40, 0x01, 0x00, 0xB9, 0x40, 0x01, 0x00, 0x24, 0x41, 0x01, 0x00, 0x9E, 0x41, 0x01, 0x00, 0xEF, +/* 00004F30 */ 0x41, 0x01, 0x00, 0xFE, 0x41, 0x01, 0x00, 0x74, 0x42, 0x01, 0x00, 0x83, 0x42, 0x01, 0x00, 0x0F, +/* 00004F40 */ 0x43, 0x01, 0x00, 0x98, 0x43, 0x01, 0x00, 0xE3, 0x43, 0x01, 0x00, 0xE4, 0x43, 0x01, 0x00, 0x34, +/* 00004F50 */ 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0x56, 0x45, 0x01, 0x00, 0x7F, 0x45, 0x01, 0x00, 0x25, +/* 00004F60 */ 0x46, 0x01, 0x00, 0x26, 0x46, 0x01, 0x00, 0x76, 0x46, 0x01, 0x00, 0x17, 0x47, 0x01, 0x00, 0x9C, +/* 00004F70 */ 0x47, 0x01, 0x00, 0xC5, 0x47, 0x01, 0x00, 0x79, 0x48, 0x01, 0x00, 0x7A, 0x48, 0x01, 0x00, 0xCA, +/* 00004F80 */ 0x48, 0x01, 0x00, 0x6B, 0x49, 0x01, 0x00, 0xF0, 0x49, 0x01, 0x00, 0x19, 0x4A, 0x01, 0x00, 0xCD, +/* 00004F90 */ 0x4A, 0x01, 0x00, 0xCE, 0x4A, 0x01, 0x00, 0xF5, 0x4A, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x88, +/* 00004FA0 */ 0x4B, 0x01, 0x00, 0xCD, 0x4B, 0x01, 0x00, 0xE3, 0x4B, 0x01, 0x00, 0xE4, 0x4B, 0x01, 0x00, 0x1B, +/* 00004FB0 */ 0x4C, 0x01, 0x00, 0x4F, 0x4C, 0x01, 0x00, 0x9E, 0x4C, 0x01, 0x00, 0xB4, 0x4C, 0x01, 0x00, 0xB5, +/* 00004FC0 */ 0x4C, 0x01, 0x00, 0xF0, 0x4C, 0x01, 0x00, 0x36, 0x4D, 0x01, 0x00, 0x37, 0x4D, 0x01, 0x00, 0x6D, +/* 00004FD0 */ 0x4D, 0x01, 0x00, 0xAC, 0x4D, 0x01, 0x00, 0xF1, 0x4D, 0x01, 0x00, 0x07, 0x4E, 0x01, 0x00, 0x08, +/* 00004FE0 */ 0x4E, 0x01, 0x00, 0x56, 0x4E, 0x01, 0x00, 0x57, 0x4E, 0x01, 0x00, 0xBD, 0x4E, 0x01, 0x00, 0xF9, +/* 00004FF0 */ 0x4E, 0x01, 0x00, 0xFA, 0x4E, 0x01, 0x00, 0x1A, 0x4F, 0x01, 0x00, 0x2C, 0x4F, 0x01, 0x00, 0x76, +/* 00005000 */ 0x4F, 0x01, 0x00, 0x77, 0x4F, 0x01, 0x00, 0x9F, 0x4F, 0x01, 0x00, 0xD3, 0x4F, 0x01, 0x00, 0x40, +/* 00005010 */ 0x50, 0x01, 0x00, 0x56, 0x50, 0x01, 0x00, 0x9D, 0x50, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x6D, +/* 00005020 */ 0x51, 0x01, 0x00, 0x83, 0x51, 0x01, 0x00, 0x84, 0x51, 0x01, 0x00, 0xD6, 0x51, 0x01, 0x00, 0x0B, +/* 00005030 */ 0x52, 0x01, 0x00, 0x21, 0x52, 0x01, 0x00, 0x22, 0x52, 0x01, 0x00, 0x51, 0x52, 0x01, 0x00, 0x7F, +/* 00005040 */ 0x52, 0x01, 0x00, 0xBB, 0x52, 0x01, 0x00, 0xD8, 0x52, 0x01, 0x00, 0x07, 0x53, 0x01, 0x00, 0x1D, +/* 00005050 */ 0x53, 0x01, 0x00, 0x1E, 0x53, 0x01, 0x00, 0x73, 0x53, 0x01, 0x00, 0x85, 0x53, 0x01, 0x00, 0xD8, +/* 00005060 */ 0x53, 0x01, 0x00, 0xD9, 0x53, 0x01, 0x00, 0x20, 0x54, 0x01, 0x00, 0x21, 0x54, 0x01, 0x00, 0xBE, +/* 00005070 */ 0x54, 0x01, 0x00, 0x08, 0x55, 0x01, 0x00, 0xA9, 0x55, 0x01, 0x00, 0xAA, 0x55, 0x01, 0x00, 0xF5, +/* 00005080 */ 0x55, 0x01, 0x00, 0x3C, 0x56, 0x01, 0x00, 0x74, 0x56, 0x01, 0x00, 0xE5, 0x56, 0x01, 0x00, 0xFF, +/* 00005090 */ 0x56, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x4B, 0x57, 0x01, 0x00, 0xB2, 0x57, 0x01, 0x00, 0x23, +/* 000050A0 */ 0x58, 0x01, 0x00, 0x3D, 0x58, 0x01, 0x00, 0x3E, 0x58, 0x01, 0x00, 0x79, 0x58, 0x01, 0x00, 0xB7, +/* 000050B0 */ 0x58, 0x01, 0x00, 0xCB, 0x58, 0x01, 0x00, 0xCC, 0x58, 0x01, 0x00, 0x20, 0x59, 0x01, 0x00, 0x58, +/* 000050C0 */ 0x59, 0x01, 0x00, 0x90, 0x59, 0x01, 0x00, 0x0A, 0x5A, 0x01, 0x00, 0x24, 0x5A, 0x01, 0x00, 0x6F, +/* 000050D0 */ 0x5A, 0x01, 0x00, 0xD6, 0x5A, 0x01, 0x00, 0x50, 0x5B, 0x01, 0x00, 0x6A, 0x5B, 0x01, 0x00, 0x9C, +/* 000050E0 */ 0x5B, 0x01, 0x00, 0xD7, 0x5B, 0x01, 0x00, 0x2E, 0x5C, 0x01, 0x00, 0x93, 0x5C, 0x01, 0x00, 0xD2, +/* 000050F0 */ 0x5C, 0x01, 0x00, 0x0D, 0x5D, 0x01, 0x00, 0x4A, 0x5D, 0x01, 0x00, 0x7F, 0x5D, 0x01, 0x00, 0xB6, +/* 00005100 */ 0x5D, 0x01, 0x00, 0xEF, 0x5D, 0x01, 0x00, 0x24, 0x5E, 0x01, 0x00, 0x5B, 0x5E, 0x01, 0x00, 0x96, +/* 00005110 */ 0x5E, 0x01, 0x00, 0xD1, 0x5E, 0x01, 0x00, 0x17, 0x5F, 0x01, 0x00, 0x38, 0x5F, 0x01, 0x00, 0x76, +/* 00005120 */ 0x5F, 0x01, 0x00, 0xE8, 0x5F, 0x01, 0x00, 0x8A, 0x60, 0x01, 0x00, 0xC6, 0x60, 0x01, 0x00, 0xE4, +/* 00005130 */ 0x60, 0x01, 0x00, 0x0E, 0x61, 0x01, 0x00, 0x56, 0x61, 0x01, 0x00, 0xA3, 0x61, 0x01, 0x00, 0xB7, +/* 00005140 */ 0x61, 0x01, 0x00, 0xB8, 0x61, 0x01, 0x00, 0x56, 0x62, 0x01, 0x00, 0x57, 0x62, 0x01, 0x00, 0x7E, +/* 00005150 */ 0x62, 0x01, 0x00, 0x8C, 0x62, 0x01, 0x00, 0x96, 0x62, 0x01, 0x00, 0xE7, 0x62, 0x01, 0x00, 0x01, +/* 00005160 */ 0x63, 0x01, 0x00, 0x0B, 0x63, 0x01, 0x00, 0x0C, 0x63, 0x01, 0x00, 0x3D, 0x63, 0x01, 0x00, 0x5C, +/* 00005170 */ 0x63, 0x01, 0x00, 0xF2, 0x63, 0x01, 0x00, 0x88, 0x64, 0x01, 0x00, 0x1E, 0x65, 0x01, 0x00, 0xB4, +/* 00005180 */ 0x65, 0x01, 0x00, 0xBA, 0x65, 0x01, 0x00, 0xBE, 0x65, 0x01, 0x00, 0x00, 0x53, 0xB9, 0x0C, 0x00, +/* 00005190 */ 0x00, 0x00, 0x04, 0x02, 0xA8, 0x41, 0xC0, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, 0x70, 0x01, 0x01, +/* 000051A0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFF, 0x4E, 0x64, 0x01, 0x00, 0xFF, 0x4E, 0x64, +/* 000051B0 */ 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x0A, 0x09, 0xA8, +/* 000051C0 */ 0x00, 0xD4, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0xD3, +/* 000051D0 */ 0x51, 0x00, 0x00, 0xBF, 0x1D, 0x84, 0xE0, 0x89, 0xC6, 0x12, 0x07, 0x01, 0xA2, 0x41, 0xD1, 0x00, +/* 000051E0 */ 0x01, 0xFE, 0x90, 0x01, 0x21, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x90, 0x01, 0xFF, +/* 000051F0 */ 0x2B, 0x64, 0x01, 0x00, 0xFF, 0x2B, 0x64, 0x01, 0x00, 0x40, 0x4B, 0x18, 0x3D, 0x51, 0x09, 0xFE, +/* 00005200 */ 0x47, 0x02, 0xFE, 0x41, 0x02, 0x27, 0x0F, 0x4B, 0x4A, 0x4B, 0x4B, 0x15, 0x4E, 0x4F, 0x50, 0x0B, +/* 00005210 */ 0x06, 0xFE, 0xE6, 0x02, 0x06, 0xFE, 0xE7, 0x02, 0x06, 0xFE, 0xE8, 0x02, 0x06, 0xFE, 0xE9, 0x02, +/* 00005220 */ 0x06, 0xFE, 0xEA, 0x02, 0x07, 0x08, 0x06, 0xFE, 0xEB, 0x02, 0x01, 0x00, 0x06, 0xFE, 0xEC, 0x02, +/* 00005230 */ 0x06, 0xFE, 0xED, 0x02, 0x01, 0x01, 0x06, 0xFE, 0xEE, 0x02, 0x01, 0x02, 0x06, 0xFE, 0xEF, 0x02, +/* 00005240 */ 0x01, 0x03, 0x06, 0xFE, 0xF0, 0x02, 0x01, 0x04, 0x06, 0xFE, 0xF1, 0x02, 0x01, 0x05, 0x06, 0xFE, +/* 00005250 */ 0xF2, 0x02, 0x05, 0xFE, 0xF3, 0x02, 0x05, 0xFE, 0xF4, 0x02, 0x05, 0xFE, 0xF5, 0x02, 0x05, 0xFE, +/* 00005260 */ 0xF6, 0x02, 0x05, 0xFE, 0xF7, 0x02, 0x06, 0xFE, 0xF8, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, +/* 00005270 */ 0xFA, 0x02, 0x05, 0xFE, 0xFB, 0x02, 0x06, 0xFE, 0xFC, 0x02, 0x06, 0xFE, 0xFD, 0x02, 0x05, 0xFE, +/* 00005280 */ 0xFE, 0x02, 0x06, 0xFE, 0xFF, 0x02, 0x06, 0xFE, 0x00, 0x03, 0x06, 0xFE, 0x01, 0x03, 0x05, 0xFE, +/* 00005290 */ 0x02, 0x03, 0x06, 0xFE, 0x03, 0x03, 0x06, 0xFE, 0x04, 0x03, 0x05, 0xFE, 0x05, 0x03, 0x06, 0xFE, +/* 000052A0 */ 0x06, 0x03, 0x06, 0xFE, 0x07, 0x03, 0x05, 0xFE, 0x08, 0x03, 0x06, 0xFE, 0x09, 0x03, 0x06, 0xFE, +/* 000052B0 */ 0x0A, 0x03, 0x06, 0xFE, 0x0B, 0x03, 0x06, 0xFE, 0x0C, 0x03, 0x06, 0xFE, 0x0D, 0x03, 0x06, 0xFE, +/* 000052C0 */ 0x0E, 0x03, 0x06, 0xFE, 0x0F, 0x03, 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x06, 0xFE, +/* 000052D0 */ 0x12, 0x03, 0x06, 0xFE, 0x13, 0x03, 0x0C, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x06, +/* 000052E0 */ 0xFE, 0x16, 0x03, 0xFE, 0x4E, 0x09, 0x96, 0x38, 0x3E, 0xD4, 0x0E, 0x3F, 0x96, 0x02, 0x3F, 0xD4, +/* 000052F0 */ 0x0F, 0x40, 0x96, 0x03, 0x40, 0xD4, 0x10, 0x41, 0x96, 0x04, 0x41, 0xD4, 0x11, 0x42, 0x96, 0x05, +/* 00005300 */ 0x42, 0xD4, 0x12, 0x43, 0x96, 0x06, 0x43, 0xD4, 0x13, 0x44, 0x96, 0x07, 0x44, 0xD4, 0x14, 0x45, +/* 00005310 */ 0x96, 0x08, 0x45, 0x4F, 0x46, 0x4F, 0x49, 0x4F, 0x4A, 0x4F, 0x51, 0x96, 0x39, 0x51, 0x4F, 0x51, +/* 00005320 */ 0x96, 0x3A, 0x51, 0x4F, 0x51, 0x96, 0x3B, 0x51, 0x4F, 0x51, 0x96, 0x3C, 0x51, 0x4F, 0x51, 0x96, +/* 00005330 */ 0x3D, 0x51, 0x4F, 0x51, 0x96, 0x3E, 0x51, 0x4F, 0x51, 0x96, 0x3F, 0x51, 0x4F, 0x51, 0x96, 0x40, +/* 00005340 */ 0x51, 0x4F, 0x51, 0x96, 0x41, 0x51, 0x4F, 0x51, 0x96, 0x42, 0x51, 0x4F, 0x51, 0x96, 0x43, 0x51, +/* 00005350 */ 0x4F, 0x51, 0x96, 0x44, 0x51, 0x4F, 0x51, 0x96, 0x45, 0x51, 0x4F, 0x51, 0x96, 0x46, 0x51, 0x4F, +/* 00005360 */ 0x51, 0x96, 0x47, 0x51, 0x4F, 0x51, 0x96, 0x48, 0x51, 0x4F, 0x51, 0x96, 0x49, 0x51, 0x4F, 0x51, +/* 00005370 */ 0x96, 0x4A, 0x51, 0x4F, 0x51, 0x96, 0x4B, 0x51, 0x4F, 0x51, 0x96, 0x4C, 0x51, 0x62, 0x51, 0x3D, +/* 00005380 */ 0x00, 0x96, 0x09, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x77, 0x02, 0x51, 0x01, 0x93, 0x09, 0x51, +/* 00005390 */ 0x00, 0x00, 0x62, 0x51, 0x51, 0x02, 0xA8, 0x52, 0x14, 0x03, 0x00, 0x51, 0x52, 0x09, 0x1F, 0x00, +/* 000053A0 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x93, 0x09, 0x52, 0x00, 0x00, 0x62, 0x52, 0x52, 0x03, 0x07, 0x01, +/* 000053B0 */ 0x00, 0xC4, 0x01, 0x52, 0x52, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x52, 0x51, 0x04, 0x93, +/* 000053C0 */ 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x05, 0xA8, 0x52, 0x14, 0x03, 0x00, 0x51, 0x52, 0x09, +/* 000053D0 */ 0x1F, 0x00, 0x93, 0x09, 0x51, 0x00, 0x00, 0x93, 0x09, 0x52, 0x00, 0x00, 0x62, 0x52, 0x52, 0x03, +/* 000053E0 */ 0x07, 0x01, 0x00, 0xC4, 0x01, 0x52, 0x52, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0x52, 0x51, +/* 000053F0 */ 0x06, 0x93, 0x09, 0x52, 0x00, 0x00, 0x62, 0x52, 0x52, 0x07, 0xAC, 0x51, 0x0F, 0x02, 0x00, 0x52, +/* 00005400 */ 0xAB, 0x51, 0x96, 0x39, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x08, 0x47, 0x46, +/* 00005410 */ 0x51, 0x96, 0x3A, 0x03, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x09, 0x96, 0x0A, 0x51, +/* 00005420 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x0A, 0x96, 0x0B, 0x51, 0x93, 0x09, 0x51, 0x00, +/* 00005430 */ 0x00, 0x62, 0x51, 0x51, 0x0B, 0x96, 0x0C, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, +/* 00005440 */ 0x0C, 0x96, 0x0D, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x0D, 0x96, 0x0E, 0x51, +/* 00005450 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x0E, 0x96, 0x0F, 0x51, 0x93, 0x09, 0x51, 0x00, +/* 00005460 */ 0x00, 0x62, 0x51, 0x51, 0x0F, 0x96, 0x10, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, +/* 00005470 */ 0x10, 0x96, 0x11, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x11, 0x96, 0x12, 0x51, +/* 00005480 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x12, 0x96, 0x13, 0x51, 0x93, 0x09, 0x51, 0x00, +/* 00005490 */ 0x00, 0x62, 0x51, 0x51, 0x13, 0x47, 0x47, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, +/* 000054A0 */ 0x14, 0x96, 0x14, 0x51, 0x93, 0x0A, 0x51, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 000054B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x93, 0x09, 0x53, 0x00, +/* 000054C0 */ 0x00, 0x62, 0x53, 0x53, 0x15, 0x7B, 0x53, 0x52, 0x16, 0x93, 0x09, 0x53, 0x00, 0x00, 0x62, 0x53, +/* 000054D0 */ 0x53, 0x17, 0x7B, 0x53, 0x52, 0x18, 0x93, 0x09, 0x53, 0x00, 0x00, 0x62, 0x53, 0x53, 0x19, 0x7B, +/* 000054E0 */ 0x53, 0x52, 0x1A, 0x93, 0x09, 0x53, 0x00, 0x00, 0x62, 0x53, 0x53, 0x1B, 0x7B, 0x53, 0x52, 0x1C, +/* 000054F0 */ 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x08, 0x02, 0x00, 0xEE, 0x03, 0x51, 0x51, 0x02, 0x00, 0x96, 0x15, +/* 00005500 */ 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x1D, 0x96, 0x16, 0x51, 0x93, 0x09, 0x51, +/* 00005510 */ 0x00, 0x00, 0x62, 0x51, 0x51, 0x1E, 0x96, 0x17, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, +/* 00005520 */ 0x51, 0x1F, 0x96, 0x18, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x20, 0x96, 0x19, +/* 00005530 */ 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x21, 0x96, 0x1A, 0x51, 0xD4, 0x00, 0x51, +/* 00005540 */ 0x96, 0x1B, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x22, 0x96, 0x1C, 0x51, 0x93, +/* 00005550 */ 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x23, 0x96, 0x1D, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, +/* 00005560 */ 0x62, 0x51, 0x51, 0x24, 0x96, 0x1E, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x25, +/* 00005570 */ 0x96, 0x1F, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x26, 0x96, 0x20, 0x51, 0x93, +/* 00005580 */ 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x27, 0x96, 0x21, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, +/* 00005590 */ 0x62, 0x51, 0x51, 0x28, 0x96, 0x22, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x29, +/* 000055A0 */ 0x96, 0x23, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x2A, 0x96, 0x24, 0x51, 0x93, +/* 000055B0 */ 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x2B, 0x96, 0x25, 0x51, 0x93, 0x16, 0x51, 0x02, 0x00, +/* 000055C0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x52, 0x5C, 0x01, 0x52, 0xEE, 0x02, 0x51, 0x51, 0x03, +/* 000055D0 */ 0x00, 0x47, 0x48, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x2C, 0x96, 0x26, 0x51, +/* 000055E0 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x2D, 0x96, 0x27, 0x51, 0x93, 0x0A, 0x51, 0x01, +/* 000055F0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +/* 00005600 */ 0x52, 0x00, 0x00, 0x00, 0x7B, 0x0B, 0x52, 0x2E, 0x7B, 0x0B, 0x52, 0x2F, 0x7B, 0x0E, 0x52, 0x30, +/* 00005610 */ 0x7B, 0x10, 0x52, 0x31, 0x7B, 0x12, 0x52, 0x32, 0x7B, 0x14, 0x52, 0x33, 0x7B, 0x16, 0x52, 0x34, +/* 00005620 */ 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x08, 0x04, 0x00, 0xEE, 0x03, 0x51, 0x51, 0x04, 0x00, 0x96, 0x3B, +/* 00005630 */ 0x51, 0xA8, 0x51, 0x96, 0x3C, 0x51, 0xD4, 0x01, 0x51, 0x96, 0x3D, 0x51, 0xD4, 0x02, 0x51, 0x96, +/* 00005640 */ 0x3E, 0x51, 0xD4, 0x03, 0x51, 0x96, 0x3F, 0x51, 0xD4, 0x04, 0x51, 0x96, 0x28, 0x51, 0xD4, 0x05, +/* 00005650 */ 0x51, 0x96, 0x29, 0x51, 0xD4, 0x06, 0x51, 0x96, 0x2A, 0x51, 0xD4, 0x07, 0x51, 0x96, 0x2B, 0x51, +/* 00005660 */ 0xD4, 0x08, 0x51, 0x96, 0x2C, 0x51, 0xD4, 0x09, 0x51, 0x96, 0x2D, 0x51, 0xD4, 0x0A, 0x51, 0x96, +/* 00005670 */ 0x2E, 0x51, 0xD4, 0x0B, 0x51, 0x96, 0x2F, 0x51, 0xA8, 0x51, 0x96, 0x40, 0x51, 0xD4, 0x0C, 0x51, +/* 00005680 */ 0x96, 0x30, 0x51, 0xD4, 0x0D, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x51, 0x51, +/* 00005690 */ 0x05, 0x00, 0x96, 0x31, 0x51, 0xA8, 0x51, 0x96, 0x41, 0x51, 0xA8, 0x51, 0x96, 0x42, 0x51, 0xA8, +/* 000056A0 */ 0x51, 0x96, 0x43, 0x51, 0xA8, 0x51, 0x96, 0x44, 0x51, 0xD4, 0x15, 0x51, 0x96, 0x32, 0x51, 0xD4, +/* 000056B0 */ 0x16, 0x51, 0x96, 0x33, 0x51, 0xD4, 0x17, 0x51, 0x96, 0x34, 0x51, 0x93, 0x0A, 0x51, 0x01, 0x00, +/* 000056C0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x08, 0x06, 0x00, +/* 000056D0 */ 0xEE, 0x03, 0x51, 0x51, 0x06, 0x00, 0x54, 0x49, 0x51, 0x93, 0x09, 0x52, 0x00, 0x00, 0x6D, 0x51, +/* 000056E0 */ 0x52, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x52, 0x5C, 0x01, 0x49, 0x93, 0x0A, 0x53, 0x01, 0x00, +/* 000056F0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x3C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x54, +/* 00005700 */ 0x00, 0x00, 0x00, 0x7B, 0x18, 0x54, 0x36, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x08, 0x00, 0xEE, +/* 00005710 */ 0x03, 0x53, 0x53, 0x08, 0x00, 0x5C, 0x02, 0x53, 0xF2, 0x03, 0xFF, 0x51, 0x35, 0x00, 0x00, 0x00, +/* 00005720 */ 0x07, 0x00, 0x96, 0x45, 0x19, 0x93, 0x0C, 0x51, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, +/* 00005730 */ 0x93, 0x20, 0x52, 0x04, 0x00, 0x5C, 0x01, 0x52, 0x93, 0x2A, 0x52, 0x05, 0x00, 0x07, 0x03, 0x00, +/* 00005740 */ 0x5C, 0x00, 0x09, 0x93, 0x45, 0x53, 0x06, 0x00, 0x5C, 0x01, 0x53, 0xD4, 0x18, 0x53, 0x5C, 0x02, +/* 00005750 */ 0x53, 0xEE, 0x03, 0x52, 0x52, 0x0A, 0x00, 0x5C, 0x02, 0x52, 0x5C, 0x03, 0x49, 0xEE, 0x04, 0x51, +/* 00005760 */ 0x51, 0x09, 0x00, 0x96, 0x46, 0x51, 0x96, 0x47, 0x1A, 0x93, 0x0C, 0x51, 0x03, 0x00, 0x07, 0x04, +/* 00005770 */ 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x52, 0x04, 0x00, 0x5C, 0x01, 0x52, 0x93, 0x2A, 0x52, 0x05, +/* 00005780 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x47, 0x53, 0x07, 0x00, 0x5C, 0x01, 0x53, 0xD4, +/* 00005790 */ 0x19, 0x53, 0x5C, 0x02, 0x53, 0xEE, 0x03, 0x52, 0x52, 0x0C, 0x00, 0x5C, 0x02, 0x52, 0x5C, 0x03, +/* 000057A0 */ 0x49, 0xEE, 0x04, 0x51, 0x51, 0x0B, 0x00, 0x96, 0x48, 0x51, 0x96, 0x49, 0x1B, 0x93, 0x0C, 0x51, +/* 000057B0 */ 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x52, 0x04, 0x00, 0x5C, 0x01, 0x52, +/* 000057C0 */ 0x93, 0x2A, 0x52, 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x49, 0x53, 0x08, 0x00, +/* 000057D0 */ 0x5C, 0x01, 0x53, 0xD4, 0x1A, 0x53, 0x5C, 0x02, 0x53, 0xEE, 0x03, 0x52, 0x52, 0x0E, 0x00, 0x5C, +/* 000057E0 */ 0x02, 0x52, 0x5C, 0x03, 0x49, 0xEE, 0x04, 0x51, 0x51, 0x0D, 0x00, 0x96, 0x4A, 0x51, 0x96, 0x4B, +/* 000057F0 */ 0x1C, 0x93, 0x0C, 0x51, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x52, 0x04, +/* 00005800 */ 0x00, 0x5C, 0x01, 0x52, 0x93, 0x2A, 0x52, 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, +/* 00005810 */ 0x4B, 0x53, 0x09, 0x00, 0x5C, 0x01, 0x53, 0xD4, 0x1B, 0x53, 0x5C, 0x02, 0x53, 0xEE, 0x03, 0x52, +/* 00005820 */ 0x52, 0x10, 0x00, 0x5C, 0x02, 0x52, 0x5C, 0x03, 0x49, 0xEE, 0x04, 0x51, 0x51, 0x0F, 0x00, 0x54, +/* 00005830 */ 0x4A, 0x51, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x46, 0x52, +/* 00005840 */ 0x0B, 0x00, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x1D, 0x11, 0x00, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, +/* 00005850 */ 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x1F, 0x52, 0x37, 0x5C, 0x03, 0x52, 0xEE, 0x04, +/* 00005860 */ 0xFF, 0x51, 0x11, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, +/* 00005870 */ 0x48, 0x52, 0x0C, 0x00, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x1D, 0x12, 0x00, 0xCC, 0x54, 0x00, 0x00, +/* 00005880 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x1F, 0x52, 0x37, 0x5C, 0x03, 0x52, +/* 00005890 */ 0xEE, 0x04, 0xFF, 0x51, 0x12, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 000058A0 */ 0x09, 0x93, 0x4A, 0x52, 0x0D, 0x00, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x1D, 0x13, 0x00, 0xCC, 0x60, +/* 000058B0 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x1F, 0x52, 0x37, 0x5C, +/* 000058C0 */ 0x03, 0x52, 0xEE, 0x04, 0xFF, 0x51, 0x13, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, +/* 000058D0 */ 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x4A, 0x5D, 0x02, 0x1D, 0x14, 0x00, 0xCC, 0x6C, 0x00, 0x00, 0x00, +/* 000058E0 */ 0x06, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x20, 0x52, 0x37, 0x5C, 0x03, 0x52, 0xEE, +/* 000058F0 */ 0x04, 0xFF, 0x51, 0x14, 0x00, 0x93, 0x0A, 0x51, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 00005900 */ 0xCC, 0x78, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x93, 0x0A, 0x53, +/* 00005910 */ 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xA4, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +/* 00005920 */ 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x23, 0x54, 0x38, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x16, +/* 00005930 */ 0x00, 0xEE, 0x03, 0x53, 0x53, 0x16, 0x00, 0x7B, 0x53, 0x52, 0x39, 0x93, 0x0A, 0x53, 0x01, 0x00, +/* 00005940 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x54, +/* 00005950 */ 0x00, 0x00, 0x00, 0x7B, 0x23, 0x54, 0x38, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x17, 0x00, 0xEE, +/* 00005960 */ 0x03, 0x53, 0x53, 0x17, 0x00, 0x7B, 0x53, 0x52, 0x3A, 0x93, 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, +/* 00005970 */ 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xBC, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, +/* 00005980 */ 0x00, 0x7B, 0x27, 0x54, 0x3B, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x18, 0x00, 0xEE, 0x03, 0x53, +/* 00005990 */ 0x53, 0x18, 0x00, 0x7B, 0x53, 0x52, 0x3C, 0x93, 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 000059A0 */ 0x00, 0x09, 0xCC, 0xC8, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, +/* 000059B0 */ 0x2A, 0x54, 0x3D, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x19, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x19, +/* 000059C0 */ 0x00, 0x7B, 0x53, 0x52, 0x3E, 0x93, 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 000059D0 */ 0xCC, 0xD4, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x2D, 0x54, +/* 000059E0 */ 0x3F, 0x7B, 0x2A, 0x54, 0x3D, 0x7B, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x1A, +/* 000059F0 */ 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1A, 0x00, 0x7B, 0x53, 0x52, 0x41, 0x93, 0x0A, 0x53, 0x01, 0x00, +/* 00005A00 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xE8, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x54, +/* 00005A10 */ 0x00, 0x00, 0x00, 0x7B, 0x2A, 0x54, 0x3D, 0x7B, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, 0x5D, 0x02, +/* 00005A20 */ 0x08, 0x1B, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1B, 0x00, 0x7B, 0x53, 0x52, 0x42, 0x93, 0x0A, 0x53, +/* 00005A30 */ 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xF8, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, +/* 00005A40 */ 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x2A, 0x54, 0x3D, 0x7B, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, +/* 00005A50 */ 0x5D, 0x02, 0x08, 0x1C, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1C, 0x00, 0x7B, 0x53, 0x52, 0x43, 0x93, +/* 00005A60 */ 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x08, 0x01, 0x00, 0x00, 0x0F, +/* 00005A70 */ 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x2E, 0x54, 0x40, 0x7B, 0x2F, 0x54, 0x44, 0x5C, +/* 00005A80 */ 0x01, 0x54, 0x5D, 0x02, 0x08, 0x1D, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1D, 0x00, 0x7B, 0x53, 0x52, +/* 00005A90 */ 0x45, 0x93, 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x01, 0x00, +/* 00005AA0 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x2E, 0x54, 0x40, 0x7B, 0x2F, 0x54, +/* 00005AB0 */ 0x44, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x1E, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1E, 0x00, 0x7B, +/* 00005AC0 */ 0x53, 0x52, 0x46, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x08, 0x15, 0x00, 0xEE, 0x03, 0x51, 0x51, 0x15, +/* 00005AD0 */ 0x00, 0x96, 0x35, 0x51, 0xD4, 0x1C, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x51, +/* 00005AE0 */ 0x51, 0x1F, 0x00, 0x96, 0x36, 0x51, 0xA8, 0x51, 0x96, 0x4C, 0x51, 0xD4, 0x1D, 0x51, 0x96, 0x37, +/* 00005AF0 */ 0x51, 0xD4, 0x1E, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x51, 0x51, 0x20, 0x00, +/* 00005B00 */ 0x47, 0x4B, 0x51, 0xD4, 0x1F, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x51, 0x51, +/* 00005B10 */ 0x21, 0x00, 0x47, 0x4C, 0x51, 0xD4, 0x20, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, +/* 00005B20 */ 0x51, 0x51, 0x22, 0x00, 0x47, 0x4D, 0x51, 0x93, 0x38, 0x51, 0x0E, 0x00, 0x14, 0x03, 0x00, 0x51, +/* 00005B30 */ 0x35, 0x09, 0xFC, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, +/* 00005B40 */ 0x4A, 0x00, 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x36, 0x23, 0x00, 0xCC, 0x28, 0x01, +/* 00005B50 */ 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x4B, 0x52, 0x37, 0x7B, 0x02, +/* 00005B60 */ 0x52, 0x47, 0x7B, 0x39, 0x52, 0x48, 0x7B, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0xEE, 0x04, 0xFF, +/* 00005B70 */ 0x51, 0x23, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x4A, +/* 00005B80 */ 0x00, 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x3B, 0x24, 0x00, 0xCC, 0x40, 0x01, 0x00, +/* 00005B90 */ 0x00, 0x12, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x4C, 0x52, 0x37, 0x7B, 0x02, 0x52, +/* 00005BA0 */ 0x47, 0x7B, 0x39, 0x52, 0x48, 0x7B, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0xEE, 0x04, 0xFF, 0x51, +/* 00005BB0 */ 0x24, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x4A, 0x00, +/* 00005BC0 */ 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x3C, 0x25, 0x00, 0xCC, 0x58, 0x01, 0x00, 0x00, +/* 00005BD0 */ 0x13, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x4D, 0x52, 0x37, 0x7B, 0x02, 0x52, 0x47, +/* 00005BE0 */ 0x7B, 0x39, 0x52, 0x48, 0x7B, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0xEE, 0x04, 0xFF, 0x51, 0x25, +/* 00005BF0 */ 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x4A, 0x00, 0x00, +/* 00005C00 */ 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x20, 0x26, 0x00, 0xCC, 0x70, 0x01, 0x00, 0x00, 0x14, +/* 00005C10 */ 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x4A, 0x52, 0x37, 0x7B, 0x02, 0x52, 0x47, 0x7B, +/* 00005C20 */ 0x39, 0x52, 0x48, 0x7B, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0xEE, 0x04, 0xFF, 0x51, 0x26, 0x00, +/* 00005C30 */ 0xA8, 0x00, 0x24, 0x00, 0x15, 0xFE, 0x88, 0x01, 0x00, 0x70, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, +/* 00005C40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, +/* 00005C50 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00005C60 */ 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, +/* 00005C70 */ 0x00, 0x40, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005C80 */ 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, +/* 00005C90 */ 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, +/* 00005CA0 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x03, 0x02, 0x00, +/* 00005CB0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0x08, 0x01, 0x00, +/* 00005CC0 */ 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0E, 0x03, 0x00, +/* 00005CD0 */ 0x00, 0xF8, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, +/* 00005CE0 */ 0x00, 0x09, 0x03, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00005CF0 */ 0x00, 0x04, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, +/* 00005D00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, +/* 00005D10 */ 0x00, 0xC8, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, +/* 00005D20 */ 0x00, 0xBC, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, +/* 00005D30 */ 0x00, 0xB0, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, +/* 00005D40 */ 0x00, 0xA4, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, +/* 00005D50 */ 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x00, +/* 00005D60 */ 0x00, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, +/* 00005D70 */ 0x00, 0x0B, 0x03, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x00, 0x0F, 0x03, 0x00, +/* 00005D80 */ 0x00, 0x6C, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005D90 */ 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005DA0 */ 0x00, 0x54, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005DB0 */ 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005DC0 */ 0x00, 0x3C, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, +/* 00005DD0 */ 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x02, 0x00, +/* 00005DE0 */ 0x00, 0xEC, 0x02, 0x00, 0x00, 0xED, 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, +/* 00005DF0 */ 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, +/* 00005E00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, +/* 00005E10 */ 0x00, 0x25, 0x00, 0x00, 0x00, 0xDD, 0xFE, 0x17, 0x03, 0xFE, 0x18, 0x03, 0xF9, 0xFE, 0x18, 0x03, +/* 00005E20 */ 0xFE, 0x19, 0x03, 0xFE, 0x19, 0x03, 0xFE, 0xAC, 0x02, 0xFE, 0xAC, 0x02, 0xFE, 0x37, 0x02, 0xFE, +/* 00005E30 */ 0x38, 0x02, 0xFE, 0x3A, 0x02, 0x84, 0xFE, 0x35, 0x01, 0xFE, 0x5B, 0x01, 0xFE, 0x30, 0x01, 0xFE, +/* 00005E40 */ 0x7D, 0x01, 0x96, 0xA9, 0xF9, 0xFE, 0x0A, 0x02, 0xFE, 0x3C, 0x02, 0x17, 0xFE, 0x3D, 0x02, 0x1F, +/* 00005E50 */ 0xFE, 0x3E, 0x02, 0xFE, 0x21, 0x01, 0xFE, 0x3F, 0x02, 0x25, 0xFE, 0x41, 0x02, 0xFE, 0x42, 0x02, +/* 00005E60 */ 0xFE, 0x43, 0x02, 0xFE, 0x44, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x48, 0x02, 0xFE, 0x49, 0x02, 0xFE, +/* 00005E70 */ 0x4A, 0x02, 0xFE, 0x4B, 0x02, 0xFE, 0x4C, 0x02, 0xFE, 0x4D, 0x02, 0xFE, 0x4E, 0x02, 0xFE, 0x51, +/* 00005E80 */ 0x02, 0xFE, 0x52, 0x02, 0xFE, 0x53, 0x02, 0xFE, 0x54, 0x02, 0xFE, 0x55, 0x02, 0xFE, 0xEB, 0x02, +/* 00005E90 */ 0xFE, 0xEC, 0x02, 0xFE, 0xED, 0x02, 0xFE, 0xEE, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF0, 0x02, 0xFE, +/* 00005EA0 */ 0xF1, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xFD, 0x02, 0xFE, 0xFC, +/* 00005EB0 */ 0x02, 0xFE, 0xFF, 0x02, 0xFE, 0x01, 0x03, 0xFE, 0x00, 0x03, 0xFE, 0x04, 0x03, 0xFE, 0x03, 0x03, +/* 00005EC0 */ 0xFE, 0x07, 0x03, 0xFE, 0x09, 0x03, 0xFE, 0x06, 0x03, 0xFE, 0x0B, 0x03, 0xFE, 0x0C, 0x03, 0xFE, +/* 00005ED0 */ 0x0E, 0x03, 0xFE, 0x0D, 0x03, 0xFE, 0x0F, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, +/* 00005EE0 */ 0x01, 0xDD, 0xFE, 0x1A, 0x03, 0xFE, 0x1B, 0x03, 0xFE, 0x1C, 0x03, 0xFE, 0x1D, 0x03, 0xFE, 0x1E, +/* 00005EF0 */ 0x03, 0xFE, 0x1F, 0x03, 0xFE, 0x20, 0x03, 0xFE, 0x21, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x23, 0x03, +/* 00005F00 */ 0xFE, 0x24, 0x03, 0x84, 0xFE, 0x35, 0x01, 0xFE, 0x5B, 0x01, 0xFE, 0x30, 0x01, 0xFE, 0x7D, 0x01, +/* 00005F10 */ 0x96, 0xA9, 0xFE, 0x25, 0x03, 0xFA, 0xFE, 0x26, 0x03, 0xFE, 0x27, 0x03, 0xFE, 0x28, 0x03, 0xFE, +/* 00005F20 */ 0x29, 0x03, 0xFE, 0x2A, 0x03, 0xFE, 0x2B, 0x03, 0xFE, 0x2C, 0x03, 0xFE, 0x2D, 0x03, 0xFE, 0x2E, +/* 00005F30 */ 0x03, 0xFE, 0x2F, 0x03, 0xFE, 0x30, 0x03, 0xFE, 0x31, 0x03, 0xFE, 0x32, 0x03, 0xFE, 0x33, 0x03, +/* 00005F40 */ 0xFE, 0x34, 0x03, 0xFE, 0x35, 0x03, 0xE3, 0xE6, 0xFE, 0x36, 0x03, 0xFE, 0x37, 0x03, 0xFE, 0x38, +/* 00005F50 */ 0x03, 0xFE, 0x2C, 0x02, 0xFE, 0x2B, 0x02, 0xFE, 0x39, 0x03, 0xFE, 0x3A, 0x03, 0xFE, 0x3B, 0x03, +/* 00005F60 */ 0xFE, 0x3C, 0x03, 0xFE, 0x3D, 0x03, 0xFE, 0x3E, 0x03, 0xFE, 0x3F, 0x03, 0xFE, 0x7B, 0x02, 0xFE, +/* 00005F70 */ 0x40, 0x03, 0xFE, 0x41, 0x03, 0xFE, 0x42, 0x03, 0xFE, 0x43, 0x03, 0xFE, 0x44, 0x03, 0xFE, 0xE6, +/* 00005F80 */ 0x02, 0xFE, 0x45, 0x03, 0xFE, 0x46, 0x03, 0xFE, 0x47, 0x03, 0xFE, 0x48, 0x03, 0xFE, 0x49, 0x03, +/* 00005F90 */ 0xFE, 0x4A, 0x03, 0xFE, 0x4B, 0x03, 0xFE, 0x4C, 0x03, 0xFE, 0x4D, 0x03, 0xFE, 0x4E, 0x03, 0xFE, +/* 00005FA0 */ 0x4F, 0x03, 0xFE, 0x50, 0x03, 0xFE, 0x51, 0x03, 0xFE, 0x52, 0x03, 0xFE, 0x53, 0x03, 0xFE, 0x54, +/* 00005FB0 */ 0x03, 0xFE, 0x55, 0x03, 0xFE, 0x56, 0x03, 0xFE, 0xBB, 0x01, 0x5B, 0x97, 0x00, 0x00, 0x00, 0x07, +/* 00005FC0 */ 0x00, 0xA4, 0x00, 0x09, 0x00, 0x20, 0x00, 0x13, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x3B, 0x00, 0x13, +/* 00005FD0 */ 0x00, 0x39, 0x00, 0x1F, 0x00, 0xD4, 0x00, 0x14, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x45, 0x00, 0x03, +/* 00005FE0 */ 0x00, 0x35, 0x00, 0x0C, 0x00, 0x35, 0x00, 0x0C, 0x00, 0x39, 0x00, 0x0C, 0x00, 0x42, 0x00, 0x0C, +/* 00005FF0 */ 0x00, 0x24, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x0C, +/* 00006000 */ 0x00, 0x22, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x20, 0x00, 0x0C, 0x00, 0x1D, 0x00, 0x0C, +/* 00006010 */ 0x00, 0x2D, 0x00, 0x5D, 0x00, 0xC8, 0x00, 0x0C, 0x00, 0x54, 0x00, 0x0C, 0x00, 0x50, 0x00, 0x0C, +/* 00006020 */ 0x00, 0x5E, 0x00, 0x0C, 0x00, 0x02, 0x01, 0x0C, 0x00, 0x55, 0x00, 0x06, 0x00, 0x94, 0x00, 0x0C, +/* 00006030 */ 0x00, 0x4C, 0x00, 0x0C, 0x00, 0x4C, 0x00, 0x0C, 0x00, 0x46, 0x00, 0x0C, 0x00, 0x47, 0x00, 0x0C, +/* 00006040 */ 0x00, 0x4C, 0x00, 0x0C, 0x00, 0x4A, 0x00, 0x0C, 0x00, 0x3B, 0x00, 0x0C, 0x00, 0x4E, 0x00, 0x0C, +/* 00006050 */ 0x00, 0x56, 0x00, 0x0C, 0x00, 0x57, 0x00, 0x19, 0x00, 0x35, 0x00, 0x0C, 0x00, 0x3E, 0x00, 0x0C, +/* 00006060 */ 0x00, 0xA4, 0x00, 0x45, 0x00, 0x05, 0x01, 0x05, 0x00, 0x25, 0x00, 0x06, 0x00, 0xE9, 0x01, 0x06, +/* 00006070 */ 0x00, 0x0C, 0x02, 0x06, 0x00, 0x90, 0x01, 0x06, 0x00, 0x58, 0x01, 0x06, 0x00, 0x9A, 0x00, 0x06, +/* 00006080 */ 0x00, 0x70, 0x00, 0x06, 0x00, 0xA7, 0x04, 0x06, 0x00, 0x93, 0x04, 0x06, 0x00, 0x31, 0x04, 0x06, +/* 00006090 */ 0x00, 0xB1, 0x09, 0x06, 0x00, 0xEF, 0x02, 0x05, 0x00, 0x2D, 0x00, 0x06, 0x00, 0x93, 0x03, 0x12, +/* 000060A0 */ 0x00, 0x89, 0x0A, 0x05, 0x00, 0x75, 0x00, 0x05, 0x00, 0x38, 0x00, 0x05, 0x00, 0x4C, 0x00, 0x05, +/* 000060B0 */ 0x00, 0x83, 0x1C, 0x06, 0x00, 0xC0, 0x01, 0x06, 0x00, 0xDF, 0x01, 0x06, 0x00, 0x80, 0x03, 0x1E, +/* 000060C0 */ 0x00, 0x3C, 0x00, 0x49, 0x00, 0x25, 0x01, 0x03, 0x00, 0x51, 0x00, 0x41, 0x00, 0x69, 0x01, 0x03, +/* 000060D0 */ 0x00, 0x59, 0x00, 0x41, 0x00, 0x79, 0x01, 0x03, 0x00, 0x5D, 0x00, 0x41, 0x00, 0x81, 0x01, 0x03, +/* 000060E0 */ 0x00, 0x41, 0x00, 0x41, 0x00, 0xAD, 0x02, 0x32, 0x00, 0x60, 0x00, 0x32, 0x00, 0x64, 0x00, 0x32, +/* 000060F0 */ 0x00, 0x66, 0x00, 0x2D, 0x00, 0x49, 0x01, 0xDF, 0x01, 0x51, 0x05, 0x12, 0x00, 0xCA, 0x03, 0x05, +/* 00006100 */ 0x00, 0x2B, 0x00, 0x06, 0x00, 0x3B, 0x09, 0x12, 0x00, 0xE9, 0x2E, 0x12, 0x00, 0x16, 0x37, 0x12, +/* 00006110 */ 0x00, 0x4B, 0x7A, 0x0D, 0x00, 0x23, 0x00, 0x3F, 0x00, 0x96, 0x00, 0x3F, 0x00, 0x96, 0x00, 0x3F, +/* 00006120 */ 0x00, 0x96, 0x00, 0x41, 0x00, 0x94, 0x00, 0x00, 0xD9, 0xEB, 0x00, 0x00, 0x07, 0xEB, 0x00, 0x00, +/* 00006130 */ 0x5E, 0xEA, 0x00, 0x00, 0x63, 0xE9, 0x00, 0x00, 0xD2, 0xE8, 0x00, 0x00, 0x62, 0xE8, 0x00, 0x00, +/* 00006140 */ 0xFB, 0xE7, 0x00, 0x00, 0xE3, 0xE5, 0x00, 0x00, 0xFA, 0xE3, 0x00, 0x00, 0xA0, 0xE2, 0x00, 0x00, +/* 00006150 */ 0x93, 0xDE, 0x00, 0x00, 0x3B, 0xDD, 0x00, 0x00, 0xB8, 0xDB, 0x00, 0x00, 0x00, 0xD7, 0x00, 0x00, +/* 00006160 */ 0x1F, 0xD5, 0x00, 0x00, 0xBB, 0xD3, 0x00, 0x00, 0x70, 0xD3, 0x00, 0x00, 0xBA, 0xCF, 0x00, 0x00, +/* 00006170 */ 0xF3, 0xCE, 0x00, 0x00, 0x1D, 0xCC, 0x00, 0x00, 0xAA, 0xC9, 0x00, 0x00, 0xA6, 0xC8, 0x00, 0x00, +/* 00006180 */ 0xA5, 0xC7, 0x00, 0x00, 0xD5, 0xC5, 0x00, 0x00, 0x59, 0xC5, 0x00, 0x00, 0xDD, 0xC4, 0x00, 0x00, +/* 00006190 */ 0x61, 0xC4, 0x00, 0x00, 0xF6, 0xC3, 0x00, 0x00, 0xDF, 0xC1, 0x00, 0x00, 0x94, 0xBE, 0x00, 0x00, +/* 000061A0 */ 0xEA, 0xA9, 0x00, 0x00, 0x39, 0x93, 0x00, 0x00, 0xAC, 0x61, 0x00, 0x00, 0x3F, 0x5D, 0x8C, 0xE0, +/* 000061B0 */ 0xA9, 0xD6, 0x92, 0xFE, 0xD1, 0x04, 0x1A, 0xA0, 0x41, 0xD1, 0x00, 0x3E, 0xFE, 0x0C, 0xE9, 0x0F, +/* 000061C0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x0C, 0xE9, 0xFE, 0xFA, 0x79, 0xFE, 0xFA, 0x79, +/* 000061D0 */ 0x01, 0x15, 0x36, 0x44, 0x09, 0xF0, 0xF0, 0x01, 0x0E, 0x02, 0x09, 0x19, 0x19, 0x19, 0x19, 0x07, +/* 000061E0 */ 0x02, 0x41, 0x42, 0x43, 0x44, 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xFB, 0x03, 0x06, 0xFE, 0xFC, +/* 000061F0 */ 0x03, 0x05, 0xFE, 0xFD, 0x03, 0x06, 0xFE, 0xFE, 0x03, 0x05, 0xFE, 0xFF, 0x03, 0x06, 0xFE, 0x00, +/* 00006200 */ 0x04, 0x05, 0xFE, 0x01, 0x04, 0x06, 0xFE, 0x02, 0x04, 0x05, 0xFE, 0x03, 0x04, 0x06, 0xFE, 0x04, +/* 00006210 */ 0x04, 0x05, 0xFE, 0x05, 0x04, 0x06, 0xFE, 0x06, 0x04, 0x05, 0xFE, 0x07, 0x04, 0x06, 0xFE, 0x08, +/* 00006220 */ 0x04, 0x05, 0xFE, 0x09, 0x04, 0x06, 0xFE, 0x0A, 0x04, 0x05, 0xFE, 0x0B, 0x04, 0x06, 0xFE, 0x0C, +/* 00006230 */ 0x04, 0x05, 0xFE, 0x0D, 0x04, 0x07, 0x06, 0xFE, 0x0E, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x0F, 0x04, +/* 00006240 */ 0x01, 0x01, 0x06, 0xFE, 0x10, 0x04, 0x01, 0x02, 0x08, 0x05, 0xFE, 0x11, 0x04, 0x05, 0xFE, 0x12, +/* 00006250 */ 0x04, 0x06, 0xFE, 0x13, 0x04, 0x05, 0xFE, 0x14, 0x04, 0x06, 0xFE, 0x15, 0x04, 0x05, 0xFE, 0x16, +/* 00006260 */ 0x04, 0x05, 0xFE, 0x17, 0x04, 0x05, 0xFE, 0x18, 0x04, 0x05, 0xFE, 0x19, 0x04, 0x05, 0xFE, 0x1A, +/* 00006270 */ 0x04, 0x05, 0xFE, 0xF4, 0x03, 0x06, 0xFE, 0xB4, 0x03, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, +/* 00006280 */ 0x03, 0x0C, 0x06, 0xFE, 0x13, 0x03, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0xB5, 0x03, 0x0B, 0x06, +/* 00006290 */ 0xFE, 0xEB, 0x03, 0x06, 0xFE, 0xB8, 0x03, 0x05, 0xFE, 0xEC, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, +/* 000062A0 */ 0xFE, 0xFA, 0x02, 0xFE, 0x27, 0x04, 0x4F, 0x40, 0xA8, 0x36, 0xA8, 0x37, 0xA8, 0x38, 0xA8, 0x39, +/* 000062B0 */ 0xA8, 0x3A, 0xA8, 0x3B, 0xA8, 0x3C, 0xA8, 0x3D, 0xA8, 0x3E, 0xA8, 0x3F, 0x8F, 0x01, 0x38, 0x46, +/* 000062C0 */ 0x00, 0x00, 0x14, 0x11, 0x00, 0x46, 0x02, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x38, 0x46, 0x00, 0x00, +/* 000062D0 */ 0x14, 0x03, 0x00, 0x46, 0x03, 0x09, 0xEC, 0x03, 0xDE, 0x00, 0x0B, 0x01, 0xB8, 0x46, 0x00, 0x01, +/* 000062E0 */ 0x51, 0x01, 0x00, 0x36, 0x46, 0x95, 0x00, 0x02, 0x36, 0x01, 0x51, 0x01, 0x01, 0x37, 0x46, 0x95, +/* 000062F0 */ 0x00, 0x03, 0x37, 0x01, 0x51, 0x01, 0x02, 0x38, 0x46, 0x95, 0x00, 0x04, 0x38, 0x01, 0x51, 0x01, +/* 00006300 */ 0x03, 0x39, 0x46, 0x95, 0x00, 0x05, 0x39, 0x01, 0x51, 0x01, 0x04, 0x3A, 0x46, 0x95, 0x00, 0x06, +/* 00006310 */ 0x3A, 0x01, 0x51, 0x01, 0x05, 0x3B, 0x46, 0x95, 0x00, 0x07, 0x3B, 0x01, 0x51, 0x01, 0x06, 0x3C, +/* 00006320 */ 0x46, 0x95, 0x00, 0x08, 0x3C, 0x01, 0x51, 0x01, 0x07, 0x3D, 0x46, 0x95, 0x00, 0x09, 0x3D, 0x4F, +/* 00006330 */ 0x46, 0x95, 0x00, 0x0A, 0x46, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, +/* 00006340 */ 0x00, 0x00, 0x7B, 0x05, 0x46, 0x00, 0x7B, 0x07, 0x46, 0x01, 0x7B, 0x09, 0x46, 0x02, 0x7B, 0x0B, +/* 00006350 */ 0x46, 0x03, 0x7B, 0x0D, 0x46, 0x04, 0x7B, 0x0F, 0x46, 0x05, 0x7B, 0x11, 0x46, 0x06, 0x7B, 0x13, +/* 00006360 */ 0x46, 0x07, 0x7B, 0x15, 0x46, 0x08, 0x96, 0x02, 0x46, 0xCE, 0x46, 0x03, 0x00, 0x00, 0xA8, 0x47, +/* 00006370 */ 0xA1, 0x00, 0x47, 0x46, 0xA8, 0x47, 0xA1, 0x01, 0x47, 0x46, 0xA8, 0x47, 0xA1, 0x02, 0x47, 0x46, +/* 00006380 */ 0x95, 0x00, 0x0A, 0x46, 0x8F, 0x01, 0x0A, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, +/* 00006390 */ 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x18, 0x47, +/* 000063A0 */ 0x09, 0x7B, 0x1A, 0x47, 0x0A, 0x7B, 0x1C, 0x47, 0x0B, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x16, 0x00, +/* 000063B0 */ 0x00, 0xEE, 0x03, 0x46, 0x46, 0x00, 0x00, 0x54, 0x40, 0x46, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, +/* 000063C0 */ 0x08, 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x1E, 0x01, 0x00, 0x5D, 0x02, +/* 000063D0 */ 0x1F, 0x01, 0x00, 0x5D, 0x03, 0x20, 0x01, 0x00, 0x62, 0x47, 0x40, 0x0C, 0x5C, 0x04, 0x47, 0x8F, +/* 000063E0 */ 0x01, 0x3B, 0x47, 0x02, 0x00, 0x4B, 0x47, 0x62, 0x47, 0x47, 0x0D, 0x5C, 0x05, 0x47, 0xEE, 0x06, +/* 000063F0 */ 0xFF, 0x46, 0x01, 0x00, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, 0x09, 0x46, 0x47, 0x07, 0x06, 0x00, +/* 00006400 */ 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x21, 0x02, 0x00, 0x5D, 0x02, 0x22, 0x02, 0x00, 0x5D, 0x03, 0x22, +/* 00006410 */ 0x02, 0x00, 0x62, 0x47, 0x40, 0x0E, 0x5C, 0x04, 0x47, 0x8F, 0x01, 0x3B, 0x47, 0x02, 0x00, 0x4B, +/* 00006420 */ 0x47, 0x62, 0x47, 0x47, 0x0F, 0x5C, 0x05, 0x47, 0xEE, 0x06, 0xFF, 0x46, 0x02, 0x00, 0xB8, 0x47, +/* 00006430 */ 0x00, 0x01, 0x51, 0x01, 0x0A, 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x23, +/* 00006440 */ 0x03, 0x00, 0x5D, 0x02, 0x24, 0x03, 0x00, 0x5D, 0x03, 0x24, 0x03, 0x00, 0x62, 0x47, 0x40, 0x10, +/* 00006450 */ 0x5C, 0x04, 0x47, 0x8F, 0x01, 0x3B, 0x47, 0x02, 0x00, 0x4B, 0x47, 0x62, 0x47, 0x47, 0x11, 0x5C, +/* 00006460 */ 0x05, 0x47, 0xEE, 0x06, 0xFF, 0x46, 0x03, 0x00, 0x8F, 0x01, 0x38, 0x46, 0x00, 0x00, 0x14, 0x03, +/* 00006470 */ 0x00, 0x46, 0x02, 0x09, 0x4E, 0x02, 0xDE, 0x01, 0x04, 0x03, 0xB8, 0x46, 0x00, 0xB7, 0x01, 0x00, +/* 00006480 */ 0x00, 0x00, 0x46, 0x46, 0x01, 0x51, 0x01, 0x0B, 0x3E, 0x46, 0x95, 0x01, 0x02, 0x3E, 0x01, 0x51, +/* 00006490 */ 0x01, 0x0C, 0x3F, 0x46, 0x95, 0x01, 0x03, 0x3F, 0x8F, 0x01, 0x2A, 0x46, 0x03, 0x00, 0x07, 0x03, +/* 000064A0 */ 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x25, 0x04, 0x00, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, 0x5C, +/* 000064B0 */ 0x02, 0x47, 0xEE, 0x03, 0xFF, 0x46, 0x04, 0x00, 0x8F, 0x01, 0x2A, 0x46, 0x03, 0x00, 0x07, 0x03, +/* 000064C0 */ 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x26, 0x05, 0x00, 0x91, 0x01, 0x03, 0x47, 0x05, 0x00, 0x5C, +/* 000064D0 */ 0x02, 0x47, 0xEE, 0x03, 0xFF, 0x46, 0x05, 0x00, 0x91, 0x01, 0x02, 0x46, 0x04, 0x00, 0xCE, 0x47, +/* 000064E0 */ 0x02, 0x01, 0x00, 0xA1, 0x00, 0x27, 0x47, 0xA1, 0x01, 0x28, 0x47, 0x77, 0x47, 0x46, 0x12, 0x8F, +/* 000064F0 */ 0x01, 0x1B, 0x46, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, +/* 00006500 */ 0x00, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x29, 0x06, 0x00, 0xCC, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 00006510 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x48, 0x04, 0x00, 0x07, 0x01, 0x00, 0xC3, +/* 00006520 */ 0x01, 0x48, 0x48, 0x07, 0x00, 0x7B, 0x48, 0x47, 0x13, 0x7B, 0x2C, 0x47, 0x14, 0x7B, 0x2C, 0x47, +/* 00006530 */ 0x15, 0x7B, 0x2C, 0x47, 0x16, 0x5C, 0x03, 0x47, 0xEE, 0x04, 0xFF, 0x46, 0x06, 0x00, 0x8F, 0x01, +/* 00006540 */ 0x0A, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, +/* 00006550 */ 0x62, 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x8F, 0x01, 0x0E, 0x47, 0x07, 0x00, 0x62, 0x47, 0x47, +/* 00006560 */ 0x17, 0x5C, 0x02, 0x47, 0xEE, 0x03, 0xFF, 0x46, 0x08, 0x00, 0x8F, 0x01, 0x1B, 0x46, 0x06, 0x00, +/* 00006570 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, 0x62, 0x47, 0x47, 0x17, +/* 00006580 */ 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x2F, 0x09, 0x00, 0xCC, 0x58, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +/* 00006590 */ 0x00, 0x47, 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x48, 0x04, 0x00, 0x7B, 0x48, 0x47, 0x13, 0x7B, +/* 000065A0 */ 0x30, 0x47, 0x14, 0x7B, 0x2C, 0x47, 0x15, 0x7B, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0xEE, 0x04, +/* 000065B0 */ 0xFF, 0x46, 0x09, 0x00, 0x8F, 0x01, 0x1B, 0x46, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, +/* 000065C0 */ 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, 0x62, 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x31, +/* 000065D0 */ 0x0A, 0x00, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x8F, +/* 000065E0 */ 0x01, 0x2A, 0x48, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x33, 0x0B, 0x00, +/* 000065F0 */ 0xB8, 0x4A, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x4A, 0x4A, 0x01, 0x51, 0x01, 0x0D, 0x49, 0x4A, +/* 00006600 */ 0x5C, 0x02, 0x49, 0xEE, 0x03, 0x48, 0x48, 0x0B, 0x00, 0x7B, 0x48, 0x47, 0x18, 0x7B, 0x2C, 0x47, +/* 00006610 */ 0x15, 0x7B, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0xEE, 0x04, 0xFF, 0x46, 0x0A, 0x00, 0x8F, 0x01, +/* 00006620 */ 0x1B, 0x46, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, +/* 00006630 */ 0x62, 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x34, 0x0C, 0x00, 0xCC, 0x84, 0x00, 0x00, +/* 00006640 */ 0x00, 0x05, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0xB8, 0x49, 0x00, 0xB7, 0x01, 0x00, 0x00, +/* 00006650 */ 0x00, 0x49, 0x49, 0x01, 0x51, 0x01, 0x0E, 0x48, 0x49, 0x7B, 0x48, 0x47, 0x13, 0x01, 0x65, 0x01, +/* 00006660 */ 0x48, 0x47, 0x7B, 0x30, 0x47, 0x14, 0x7B, 0x2C, 0x47, 0x15, 0x7B, 0x30, 0x47, 0x16, 0x5C, 0x03, +/* 00006670 */ 0x47, 0xEE, 0x04, 0xFF, 0x46, 0x0C, 0x00, 0x8F, 0x01, 0x1B, 0x46, 0x06, 0x00, 0x07, 0x04, 0x00, +/* 00006680 */ 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x35, 0x0D, +/* 00006690 */ 0x00, 0xCC, 0x9C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x8F, 0x01, +/* 000066A0 */ 0x4A, 0x48, 0x08, 0x00, 0x4B, 0x48, 0x7B, 0x48, 0x47, 0x13, 0x7B, 0x30, 0x47, 0x14, 0x7B, 0x30, +/* 000066B0 */ 0x47, 0x16, 0x5C, 0x03, 0x47, 0xEE, 0x04, 0xFF, 0x46, 0x0D, 0x00, 0x91, 0x01, 0x02, 0x00, 0x04, +/* 000066C0 */ 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x07, 0xB0, 0x00, +/* 000066D0 */ 0x9C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, +/* 000066E0 */ 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 000066F0 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 00006700 */ 0xB4, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00006710 */ 0xB7, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, +/* 00006720 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, +/* 00006730 */ 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 00006740 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 00006750 */ 0xB4, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00006760 */ 0x93, 0x01, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00006770 */ 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, +/* 00006780 */ 0x00, 0x04, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, +/* 00006790 */ 0x08, 0x04, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x00, 0xFE, 0xFC, 0x03, 0xFE, +/* 000067A0 */ 0xFE, 0x03, 0xFE, 0x00, 0x04, 0xFE, 0x02, 0x04, 0xFE, 0x04, 0x04, 0xFE, 0x06, 0x04, 0xFE, 0x08, +/* 000067B0 */ 0x04, 0xFE, 0x0A, 0x04, 0xFE, 0x0C, 0x04, 0xFE, 0x93, 0x01, 0xFE, 0x91, 0x01, 0xFE, 0x94, 0x01, +/* 000067C0 */ 0xFE, 0x93, 0x01, 0xFE, 0xEC, 0x02, 0xFE, 0x91, 0x01, 0xFE, 0xED, 0x02, 0xFE, 0x94, 0x01, 0xFE, +/* 000067D0 */ 0xEE, 0x02, 0xFE, 0x96, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, +/* 000067E0 */ 0x01, 0xFE, 0x48, 0x01, 0xFE, 0xB7, 0x01, 0xFE, 0x1B, 0x04, 0x02, 0x01, 0x09, 0x00, 0xFE, 0x1C, +/* 000067F0 */ 0x04, 0x01, 0xFE, 0x1D, 0x04, 0x02, 0xFE, 0x1E, 0x04, 0x03, 0xFE, 0x1F, 0x04, 0x04, 0xFE, 0x20, +/* 00006800 */ 0x04, 0x05, 0xFE, 0x21, 0x04, 0x06, 0xFE, 0x22, 0x04, 0x07, 0xFE, 0x23, 0x04, 0x08, 0xFE, 0x24, +/* 00006810 */ 0x04, 0x03, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x23, 0xE9, 0x14, 0x16, +/* 00006820 */ 0x00, 0x00, 0x00, 0x79, 0x00, 0x9A, 0x13, 0x34, 0x00, 0xDA, 0x36, 0x1B, 0x00, 0x5E, 0x00, 0x36, +/* 00006830 */ 0x00, 0xFC, 0x0F, 0x3A, 0x00, 0x42, 0x02, 0x3A, 0x00, 0x54, 0x02, 0x3A, 0x00, 0x53, 0x02, 0x30, +/* 00006840 */ 0x00, 0x62, 0x04, 0x20, 0x00, 0x59, 0x04, 0x20, 0x00, 0x54, 0x00, 0x17, 0x00, 0x48, 0x00, 0x4F, +/* 00006850 */ 0x00, 0x9D, 0x00, 0x2C, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0xA2, 0x00, 0x6A, 0x00, 0x22, 0x03, 0x59, +/* 00006860 */ 0x00, 0xEC, 0x08, 0x44, 0x00, 0x9F, 0x00, 0x09, 0x00, 0x88, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, +/* 00006870 */ 0x31, 0x8F, 0x00, 0x00, 0x45, 0x8A, 0x00, 0x00, 0xC9, 0x89, 0x00, 0x00, 0xDF, 0x87, 0x00, 0x00, +/* 00006880 */ 0x2C, 0x86, 0x00, 0x00, 0x11, 0x82, 0x00, 0x00, 0x01, 0x79, 0x00, 0x00, 0x33, 0x76, 0x00, 0x00, +/* 00006890 */ 0xCD, 0x74, 0x00, 0x00, 0x67, 0x73, 0x00, 0x00, 0x01, 0x72, 0x00, 0x00, 0xEC, 0x6F, 0x00, 0x00, +/* 000068A0 */ 0xE6, 0x6D, 0x00, 0x00, 0xDC, 0x6C, 0x00, 0x00, 0xAC, 0x68, 0x00, 0x00, 0x3F, 0x5D, 0x84, 0xE0, +/* 000068B0 */ 0x89, 0xC6, 0x12, 0xFE, 0xCE, 0x06, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x51, 0xFF, +/* 000068C0 */ 0x3B, 0x59, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x3B, 0x59, 0x01, +/* 000068D0 */ 0x00, 0xFE, 0x30, 0x08, 0xFE, 0x30, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, 0x04, 0x08, +/* 000068E0 */ 0x09, 0x20, 0x20, 0x20, 0x20, 0x01, 0x16, 0x17, 0x18, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x62, +/* 000068F0 */ 0x04, 0x06, 0xFE, 0x16, 0x03, 0x06, 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0x63, 0x04, 0x06, 0xFE, 0xE1, +/* 00006900 */ 0x03, 0x06, 0xFE, 0x50, 0x04, 0x06, 0xFE, 0x54, 0x04, 0x06, 0xFE, 0x51, 0x04, 0x06, 0xFE, 0x52, +/* 00006910 */ 0x04, 0x06, 0xFE, 0x25, 0x04, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, +/* 00006920 */ 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x06, 0xFE, 0x53, 0x04, 0x07, 0x08, 0xFE, +/* 00006930 */ 0x0A, 0x02, 0x5B, 0x15, 0xB4, 0x15, 0x15, 0x2C, 0x19, 0x15, 0x15, 0x03, 0x00, 0x19, 0x02, 0x09, +/* 00006940 */ 0x24, 0x00, 0x8F, 0x04, 0x09, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00006950 */ 0x00, 0x1A, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x19, +/* 00006960 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x01, +/* 00006970 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x15, 0xF2, 0x02, 0x19, 0x19, 0x01, 0x00, 0x00, +/* 00006980 */ 0x00, 0x01, 0x00, 0x96, 0x02, 0x19, 0x93, 0x02, 0x19, 0x01, 0x00, 0xA8, 0x1A, 0x14, 0x13, 0x00, +/* 00006990 */ 0x19, 0x1A, 0x09, 0x00, 0x00, 0x93, 0x02, 0x19, 0x01, 0x00, 0x62, 0x19, 0x19, 0x02, 0x0F, 0x27, +/* 000069A0 */ 0x00, 0x19, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, +/* 000069B0 */ 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, +/* 000069C0 */ 0x03, 0xFF, 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x04, 0x0A, 0x19, 0x02, 0x00, 0x07, +/* 000069D0 */ 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, +/* 000069E0 */ 0x00, 0x00, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x03, 0x7B, 0x1B, 0x1A, 0x04, 0x93, +/* 000069F0 */ 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x05, 0x7B, 0x1B, 0x1A, 0x06, 0x93, 0x02, 0x1B, 0x01, +/* 00006A00 */ 0x00, 0x62, 0x1B, 0x1B, 0x07, 0x7B, 0x1B, 0x1A, 0x08, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, +/* 00006A10 */ 0x1B, 0x09, 0x7B, 0x1B, 0x1A, 0x0A, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x0B, 0x7B, +/* 00006A20 */ 0x1B, 0x1A, 0x0C, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x0D, 0x7B, 0x1B, 0x1A, 0x0E, +/* 00006A30 */ 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x0F, 0x7B, 0x1B, 0x1A, 0x10, 0x93, 0x02, 0x1B, +/* 00006A40 */ 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x11, 0x7B, 0x1B, 0x1A, 0x12, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, +/* 00006A50 */ 0x1B, 0x1B, 0x13, 0x7B, 0x1B, 0x1A, 0x14, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x15, +/* 00006A60 */ 0x7B, 0x1B, 0x1A, 0x16, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x17, 0x7B, 0x1B, 0x1A, +/* 00006A70 */ 0x18, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x19, 0x7B, 0x1B, 0x1A, 0x1A, 0x93, 0x02, +/* 00006A80 */ 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x1B, 0x7B, 0x1B, 0x1A, 0x1C, 0x93, 0x02, 0x1B, 0x01, 0x00, +/* 00006A90 */ 0x62, 0x1B, 0x1B, 0x1D, 0x7B, 0x1B, 0x1A, 0x1E, 0x5C, 0x01, 0x1A, 0x5D, 0x02, 0x13, 0x03, 0x00, +/* 00006AA0 */ 0xEE, 0x03, 0x19, 0x19, 0x03, 0x00, 0x96, 0x03, 0x19, 0x8F, 0x04, 0x0A, 0x19, 0x02, 0x00, 0x07, +/* 00006AB0 */ 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCB, 0x1A, 0x5C, 0x01, 0x1A, 0x5D, 0x02, 0x13, 0x04, 0x00, 0xEE, +/* 00006AC0 */ 0x03, 0x19, 0x19, 0x04, 0x00, 0x96, 0x04, 0x19, 0x8F, 0x04, 0x0C, 0x19, 0x03, 0x00, 0x07, 0x05, +/* 00006AD0 */ 0x00, 0x5C, 0x00, 0x14, 0x8F, 0x04, 0x1C, 0x1A, 0x04, 0x00, 0x5C, 0x01, 0x1A, 0x8F, 0x04, 0x18, +/* 00006AE0 */ 0x1A, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x14, 0x93, 0x03, 0x1B, 0x06, 0x00, 0x5C, 0x01, +/* 00006AF0 */ 0x1B, 0xEE, 0x02, 0x1A, 0x1A, 0x06, 0x00, 0x5C, 0x02, 0x1A, 0xD4, 0x00, 0x1A, 0x5C, 0x03, 0x1A, +/* 00006B00 */ 0x93, 0x02, 0x1A, 0x01, 0x00, 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0xFF, 0x19, 0x05, 0x00, 0x8F, 0x04, +/* 00006B10 */ 0x0A, 0x19, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0x93, 0x04, 0x1A, 0x07, 0x00, 0x5C, +/* 00006B20 */ 0x01, 0x1A, 0x8F, 0x04, 0x0E, 0x1A, 0x08, 0x00, 0x62, 0x1A, 0x1A, 0x1F, 0x5C, 0x02, 0x1A, 0xEE, +/* 00006B30 */ 0x03, 0x00, 0x19, 0x07, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x40, 0x00, 0x00, +/* 00006B40 */ 0x00, 0x00, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x95, +/* 00006B50 */ 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x87, 0x02, 0x00, 0x00, 0x7D, +/* 00006B60 */ 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x80, +/* 00006B70 */ 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x86, +/* 00006B80 */ 0x02, 0x00, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x19, 0x02, 0xFE, +/* 00006B90 */ 0x21, 0x02, 0xFE, 0x94, 0x02, 0xFE, 0x95, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x97, 0x02, 0xFE, 0x90, +/* 00006BA0 */ 0x02, 0xFE, 0x85, 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x7D, 0x02, +/* 00006BB0 */ 0xFE, 0x8F, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x8A, 0x02, 0xFE, +/* 00006BC0 */ 0x7F, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x8C, +/* 00006BD0 */ 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x91, 0x02, 0xFE, 0x86, 0x02, +/* 00006BE0 */ 0xFE, 0x48, 0x01, 0xFE, 0xF9, 0x03, 0xFE, 0x64, 0x04, 0xFE, 0xFD, 0x01, 0xFF, 0x70, 0x59, 0x01, +/* 00006BF0 */ 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x90, 0x00, 0x20, 0x00, +/* 00006C00 */ 0x4B, 0x00, 0x1F, 0x00, 0x6B, 0x00, 0x24, 0x00, 0x90, 0x00, 0xE0, 0x00, 0xCE, 0x03, 0x1F, 0x00, +/* 00006C10 */ 0x3E, 0x00, 0x46, 0x00, 0x98, 0x01, 0x2C, 0x00, 0x44, 0x00, 0x00, 0x1F, 0x6C, 0x00, 0x00, 0xBF, +/* 00006C20 */ 0x5C, 0x87, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xE7, 0x06, 0x60, 0xA2, 0x41, 0xD1, 0x00, 0x52, 0xFF, +/* 00006C30 */ 0xD6, 0x5F, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0xD6, 0x5F, 0x01, 0x00, +/* 00006C40 */ 0xFE, 0x27, 0x01, 0xFE, 0x27, 0x01, 0x41, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x02, 0x01, +/* 00006C50 */ 0x01, 0x05, 0x06, 0x06, 0xFE, 0x50, 0x04, 0x05, 0xFE, 0xFA, 0x03, 0x08, 0x6C, 0x8F, 0x01, 0x03, +/* 00006C60 */ 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x08, 0x15, 0x0B, 0x00, 0x07, 0x08, +/* 00006C70 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x4A, 0x00, 0x8F, 0x05, 0x0C, 0x07, 0x01, +/* 00006C80 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x05, 0x19, 0x08, 0x02, 0x00, 0x5C, 0x01, 0x08, +/* 00006C90 */ 0x8F, 0x01, 0x02, 0x08, 0x03, 0x00, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x03, 0x05, 0x5C, 0x03, 0x08, +/* 00006CA0 */ 0xEE, 0x04, 0x07, 0x07, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x18, 0x00, 0x8F, 0x01, 0x04, +/* 00006CB0 */ 0x07, 0x04, 0x00, 0x8F, 0x01, 0x03, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x05, 0x01, 0x00, 0x9D, +/* 00006CC0 */ 0x08, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFF, 0x04, 0x60, 0x01, 0x00, 0x03, 0x00, +/* 00006CD0 */ 0x00, 0x00, 0x00, 0x50, 0x00, 0xA6, 0x00, 0x1A, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, +/* 00006CE0 */ 0x01, 0xC4, 0x00, 0xFE, 0xBF, 0x06, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x50, 0xFF, 0x2E, 0x56, 0x01, +/* 00006CF0 */ 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x2E, 0x56, 0x01, 0x00, 0xFE, 0x60, 0x02, +/* 00006D00 */ 0xFE, 0x60, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, +/* 00006D10 */ 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x61, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x98, 0x5B, +/* 00006D20 */ 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x24, 0x00, 0x8F, +/* 00006D30 */ 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, +/* 00006D40 */ 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, +/* 00006D50 */ 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, +/* 00006D60 */ 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +/* 00006D70 */ 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, +/* 00006D80 */ 0x02, 0x0F, 0x27, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, +/* 00006D90 */ 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, +/* 00006DA0 */ 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, +/* 00006DB0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, +/* 00006DC0 */ 0xFE, 0x7A, 0x02, 0xFF, 0x54, 0x56, 0x01, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, +/* 00006DD0 */ 0x00, 0x24, 0x00, 0x88, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x6B, 0x00, 0x24, 0x00, 0x88, +/* 00006DE0 */ 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xA0, 0x06, +/* 00006DF0 */ 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0xEB, 0x03, 0x4F, 0xFF, 0x87, 0x4F, 0x01, 0x00, 0xFF, 0x00, +/* 00006E00 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0x87, 0x4F, 0x01, 0x00, 0xFE, 0xFD, 0x03, 0xFE, 0xFD, 0x03, +/* 00006E10 */ 0x01, 0x08, 0x06, 0x0B, 0x07, 0x5A, 0x56, 0x04, 0x0A, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0A, 0x06, +/* 00006E20 */ 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x61, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x08, 0xFE, 0x70, 0x01, 0x5B, +/* 00006E30 */ 0x07, 0xB4, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x2C, 0x0B, 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, +/* 00006E40 */ 0x09, 0x24, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, +/* 00006E50 */ 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, +/* 00006E60 */ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, +/* 00006E70 */ 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, +/* 00006E80 */ 0x00, 0x00, 0x01, 0x00, 0x47, 0x08, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x08, 0x0B, 0x09, 0x00, +/* 00006E90 */ 0x00, 0x62, 0x0B, 0x08, 0x02, 0x0F, 0x27, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, +/* 00006EA0 */ 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, +/* 00006EB0 */ 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 00006EC0 */ 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x06, 0x0B, 0x09, 0x52, 0x00, 0x8F, 0x04, 0x27, 0x0B, 0x01, 0x00, +/* 00006ED0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x0F, +/* 00006EE0 */ 0x1F, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x26, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 00006EF0 */ 0x00, 0x05, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0B, 0x0B, 0x04, 0x00, 0x0F, 0x1D, 0x00, 0x0B, 0x09, +/* 00006F00 */ 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x03, 0x07, 0x01, 0x00, 0x5C, +/* 00006F10 */ 0x00, 0x0C, 0xF2, 0x01, 0xFF, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0xA8, 0x0B, 0x47, 0x09, +/* 00006F20 */ 0x0B, 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x06, 0x0B, 0x09, 0x23, 0x00, 0x8F, 0x04, 0x31, 0x0C, 0x03, +/* 00006F30 */ 0x00, 0x6D, 0x0B, 0x0C, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0xF2, 0x02, +/* 00006F40 */ 0x0B, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x47, 0x09, 0x0B, 0x09, 0x15, 0x00, 0x8F, 0x04, +/* 00006F50 */ 0x22, 0x0B, 0x04, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x05, 0xEE, 0x01, 0x0B, 0x0B, 0x07, 0x00, +/* 00006F60 */ 0x47, 0x09, 0x0B, 0x8F, 0x04, 0x11, 0x0B, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, +/* 00006F70 */ 0x04, 0x09, 0x0D, 0x00, 0x00, 0x6D, 0x0C, 0x0D, 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0D, 0x5C, +/* 00006F80 */ 0x01, 0x09, 0x5C, 0x02, 0x08, 0xF2, 0x03, 0x0C, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0x5C, +/* 00006F90 */ 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x08, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 00006FA0 */ 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x33, +/* 00006FB0 */ 0x02, 0xFF, 0xB3, 0x4F, 0x01, 0x00, 0x0D, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x24, +/* 00006FC0 */ 0x00, 0x7F, 0x00, 0x20, 0x00, 0x47, 0x00, 0x15, 0x00, 0x67, 0x00, 0x24, 0x00, 0x80, 0x00, 0x42, +/* 00006FD0 */ 0x00, 0x56, 0x00, 0x1A, 0x00, 0x48, 0x00, 0x05, 0x00, 0x2F, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x23, +/* 00006FE0 */ 0x00, 0x59, 0x00, 0x15, 0x00, 0x42, 0x00, 0x3A, 0x00, 0x51, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, +/* 00006FF0 */ 0x01, 0xC4, 0x00, 0xFE, 0x85, 0x06, 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x16, 0x03, 0x4E, 0xFF, +/* 00007000 */ 0x05, 0x4B, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x05, 0x4B, 0x01, 0x00, +/* 00007010 */ 0xFE, 0x26, 0x04, 0xFE, 0x26, 0x04, 0x01, 0x09, 0x05, 0x0B, 0x05, 0x62, 0x5B, 0x04, 0x09, 0x09, +/* 00007020 */ 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x16, 0x03, 0x07, 0xFE, 0x79, 0x01, 0x5B, 0x07, +/* 00007030 */ 0xB4, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, 0x05, 0x02, 0xA8, 0x0B, 0x47, 0x05, +/* 00007040 */ 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x6B, +/* 00007050 */ 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, +/* 00007060 */ 0x03, 0x00, 0x07, 0x0B, 0x09, 0x1A, 0x00, 0x8F, 0x01, 0x02, 0x0B, 0x00, 0x00, 0x4B, 0x0B, 0x07, +/* 00007070 */ 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC3, 0x03, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x24, +/* 00007080 */ 0x01, 0x8F, 0x04, 0x31, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00007090 */ 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x08, +/* 000070A0 */ 0x0B, 0x8F, 0x04, 0x17, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, +/* 000070B0 */ 0xEE, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x0F, 0x22, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, +/* 000070C0 */ 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, +/* 000070D0 */ 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x09, 0x0C, +/* 000070E0 */ 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, +/* 000070F0 */ 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x03, +/* 00007100 */ 0x00, 0x09, 0x0B, 0x09, 0x3F, 0x00, 0x8F, 0x04, 0x0A, 0x0B, 0x04, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00007110 */ 0x00, 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x04, 0x05, 0x00, 0xEE, 0x03, 0x0B, 0x0B, +/* 00007120 */ 0x05, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x04, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x03, 0x07, +/* 00007130 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xF2, 0x03, 0xFF, 0x0B, 0x03, +/* 00007140 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x8F, 0x02, 0x08, 0x0B, 0x05, 0x00, 0x4B, 0x0B, 0x07, 0x04, 0x00, +/* 00007150 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, 0xEE, 0x04, 0xFF, 0x0B, +/* 00007160 */ 0x07, 0x00, 0x47, 0x0B, 0x09, 0x8F, 0x04, 0x0C, 0x0C, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00007170 */ 0x02, 0x8F, 0x04, 0x20, 0x0D, 0x07, 0x00, 0x5C, 0x01, 0x0D, 0x8F, 0x01, 0x03, 0x0D, 0x08, 0x00, +/* 00007180 */ 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, 0xEE, 0x04, 0x0C, 0x0C, 0x08, 0x00, 0x77, 0x0C, +/* 00007190 */ 0x0B, 0x04, 0x62, 0x0B, 0x09, 0x05, 0x82, 0x0B, 0x0B, 0x2B, 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, +/* 000071A0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, +/* 000071B0 */ 0xFE, 0x36, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x7A, 0x02, 0xDD, 0xFF, 0x1D, 0x4B, 0x01, 0x00, 0x10, +/* 000071C0 */ 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x18, 0x00, 0x43, 0x00, +/* 000071D0 */ 0x1A, 0x00, 0x58, 0x00, 0x20, 0x00, 0x37, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x9D, 0x00, +/* 000071E0 */ 0x20, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x58, 0x00, +/* 000071F0 */ 0x1D, 0x00, 0x4F, 0x00, 0x30, 0x00, 0x66, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, +/* 00007200 */ 0x00, 0xBF, 0x5D, 0x84, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x7E, 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, +/* 00007210 */ 0x4C, 0xFF, 0x87, 0x48, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFF, 0x87, +/* 00007220 */ 0x48, 0x01, 0x00, 0xFE, 0x9F, 0x01, 0xFE, 0x9F, 0x01, 0x40, 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, +/* 00007230 */ 0x16, 0x03, 0x02, 0x03, 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, 0x0A, 0x08, 0x50, 0x96, 0x02, 0x03, +/* 00007240 */ 0x96, 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, 0x05, 0x06, 0x8F, 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, +/* 00007250 */ 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8F, 0x03, 0x2A, 0x0D, 0x01, 0x00, 0x07, +/* 00007260 */ 0x03, 0x00, 0x5C, 0x00, 0x02, 0x93, 0x02, 0x0E, 0x02, 0x00, 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, +/* 00007270 */ 0x5C, 0x02, 0x0E, 0xEE, 0x03, 0x0D, 0x0D, 0x01, 0x00, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, 0xF2, +/* 00007280 */ 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, +/* 00007290 */ 0xFE, 0x2B, 0x01, 0xFE, 0x5B, 0x04, 0xFE, 0x5C, 0x04, 0xFE, 0x5D, 0x04, 0xFF, 0xDA, 0x48, 0x01, +/* 000072A0 */ 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x42, 0x00, 0x4B, 0x01, 0x00, 0xAF, 0x72, 0x00, 0x00, 0xBF, +/* 000072B0 */ 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x7F, 0x06, 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x60, +/* 000072C0 */ 0x04, 0x4D, 0xFF, 0x13, 0x49, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x13, +/* 000072D0 */ 0x49, 0x01, 0x00, 0xEE, 0xEE, 0x01, 0x07, 0x03, 0x07, 0x09, 0x1D, 0x1B, 0x04, 0x01, 0x05, 0x01, +/* 000072E0 */ 0x01, 0x01, 0x01, 0x06, 0x08, 0x69, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, +/* 000072F0 */ 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, +/* 00007300 */ 0x02, 0x09, 0x08, 0x00, 0x00, 0x4B, 0x08, 0x6D, 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, +/* 00007310 */ 0x08, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x02, 0x09, 0x01, 0x00, 0x5C, 0x02, 0x09, 0x8F, 0x01, 0x03, +/* 00007320 */ 0x09, 0x02, 0x00, 0x5C, 0x03, 0x09, 0x8F, 0x01, 0x04, 0x09, 0x03, 0x00, 0x5C, 0x04, 0x09, 0x8F, +/* 00007330 */ 0x01, 0x05, 0x09, 0x04, 0x00, 0x5C, 0x05, 0x09, 0x5C, 0x06, 0x03, 0x5C, 0x07, 0x04, 0xF2, 0x08, +/* 00007340 */ 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, +/* 00007350 */ 0xFF, 0x3F, 0x49, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, +/* 00007360 */ 0x2B, 0x00, 0x4E, 0x00, 0x81, 0x00, 0x00, 0xBF, 0x5D, 0x84, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x78, +/* 00007370 */ 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, 0x4A, 0xFF, 0x33, 0x46, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, +/* 00007380 */ 0x01, 0x00, 0x06, 0x06, 0xFF, 0x33, 0x46, 0x01, 0x00, 0xFE, 0x9F, 0x01, 0xFE, 0x9F, 0x01, 0x40, +/* 00007390 */ 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, 0x16, 0x03, 0x02, 0x03, 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, +/* 000073A0 */ 0x0A, 0x08, 0x50, 0x96, 0x02, 0x03, 0x96, 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, 0x05, 0x06, 0x8F, +/* 000073B0 */ 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8F, +/* 000073C0 */ 0x03, 0x2A, 0x0D, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x93, 0x02, 0x0E, 0x02, 0x00, +/* 000073D0 */ 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, 0x5C, 0x02, 0x0E, 0xEE, 0x03, 0x0D, 0x0D, 0x01, 0x00, 0x5C, +/* 000073E0 */ 0x01, 0x0D, 0x5C, 0x02, 0x07, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, +/* 000073F0 */ 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0x2B, 0x01, 0xFE, 0x5B, 0x04, 0xFE, 0x5C, 0x04, 0xFE, +/* 00007400 */ 0x5D, 0x04, 0xFF, 0x86, 0x46, 0x01, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x42, 0x00, 0x4B, 0x01, +/* 00007410 */ 0x00, 0x15, 0x74, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x79, 0x06, 0x49, +/* 00007420 */ 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x5F, 0x04, 0x4B, 0xFF, 0xBF, 0x46, 0x01, 0x00, 0xFF, 0x00, 0x10, +/* 00007430 */ 0x01, 0x00, 0x03, 0x01, 0xFF, 0xBF, 0x46, 0x01, 0x00, 0xEE, 0xEE, 0x01, 0x07, 0x03, 0x07, 0x09, +/* 00007440 */ 0x1D, 0x1B, 0x04, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x06, 0x08, 0x69, 0x5B, 0x05, 0xB4, 0x05, +/* 00007450 */ 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, +/* 00007460 */ 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, 0x02, 0x09, 0x08, 0x00, 0x00, 0x4B, 0x08, 0x6D, 0x07, 0x08, +/* 00007470 */ 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x02, 0x09, 0x01, 0x00, +/* 00007480 */ 0x5C, 0x02, 0x09, 0x8F, 0x01, 0x03, 0x09, 0x02, 0x00, 0x5C, 0x03, 0x09, 0x8F, 0x01, 0x04, 0x09, +/* 00007490 */ 0x03, 0x00, 0x5C, 0x04, 0x09, 0x8F, 0x01, 0x05, 0x09, 0x04, 0x00, 0x5C, 0x05, 0x09, 0x5C, 0x06, +/* 000074A0 */ 0x03, 0x5C, 0x07, 0x04, 0xF2, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, +/* 000074B0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, 0xFF, 0xEB, 0x46, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, +/* 000074C0 */ 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x4E, 0x00, 0x81, 0x00, 0x00, 0xBF, 0x5D, 0x84, +/* 000074D0 */ 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x72, 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, 0x48, 0xFF, 0xF1, 0x43, +/* 000074E0 */ 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFF, 0xF1, 0x43, 0x01, 0x00, 0xFE, +/* 000074F0 */ 0x9B, 0x01, 0xFE, 0x9B, 0x01, 0x40, 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, 0x16, 0x03, 0x02, 0x03, +/* 00007500 */ 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, 0x0A, 0x08, 0x50, 0x96, 0x02, 0x03, 0x96, 0x03, 0x04, 0x96, +/* 00007510 */ 0x04, 0x05, 0x96, 0x05, 0x06, 0x8F, 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, +/* 00007520 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8F, 0x03, 0x2A, 0x0D, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00007530 */ 0x02, 0x93, 0x02, 0x0E, 0x02, 0x00, 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, 0x5C, 0x02, 0x0E, 0xEE, +/* 00007540 */ 0x03, 0x0D, 0x0D, 0x01, 0x00, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, 0xF2, 0x03, 0xFF, 0x0B, 0x00, +/* 00007550 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0x2B, 0x01, 0xFE, +/* 00007560 */ 0x5B, 0x04, 0xFE, 0x5C, 0x04, 0xFE, 0x5D, 0x04, 0xFF, 0x44, 0x44, 0x01, 0x00, 0x02, 0x0C, 0x00, +/* 00007570 */ 0x00, 0x00, 0x42, 0x00, 0x47, 0x01, 0x00, 0x7B, 0x75, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, +/* 00007580 */ 0xC4, 0x00, 0xFE, 0x73, 0x06, 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x5E, 0x04, 0x49, 0xFF, 0x7D, +/* 00007590 */ 0x44, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x7D, 0x44, 0x01, 0x00, 0xEA, +/* 000075A0 */ 0xEA, 0x01, 0x07, 0x03, 0x07, 0x09, 0x1D, 0x1B, 0x04, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x06, +/* 000075B0 */ 0x08, 0x69, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, 0xA8, 0x07, 0x47, 0x03, +/* 000075C0 */ 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, 0x02, 0x09, 0x08, 0x00, +/* 000075D0 */ 0x00, 0x4B, 0x08, 0x6D, 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x05, +/* 000075E0 */ 0x8F, 0x01, 0x02, 0x09, 0x01, 0x00, 0x5C, 0x02, 0x09, 0x8F, 0x01, 0x03, 0x09, 0x02, 0x00, 0x5C, +/* 000075F0 */ 0x03, 0x09, 0x8F, 0x01, 0x04, 0x09, 0x03, 0x00, 0x5C, 0x04, 0x09, 0x8F, 0x01, 0x05, 0x09, 0x04, +/* 00007600 */ 0x00, 0x5C, 0x05, 0x09, 0x5C, 0x06, 0x03, 0x5C, 0x07, 0x04, 0xF2, 0x08, 0x00, 0x07, 0x00, 0x00, +/* 00007610 */ 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, 0xFF, 0xA5, 0x44, 0x01, +/* 00007620 */ 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x4E, 0x00, +/* 00007630 */ 0x81, 0x00, 0x00, 0xBF, 0x5C, 0x87, 0xE0, 0x03, 0xC4, 0x00, 0xFE, 0x3B, 0x06, 0x0C, 0xA3, 0x41, +/* 00007640 */ 0xC1, 0x00, 0xFE, 0x23, 0x04, 0x47, 0xFF, 0xCC, 0x34, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00007650 */ 0x07, 0x07, 0xFF, 0xCC, 0x34, 0x01, 0x00, 0xFE, 0x5A, 0x06, 0xFE, 0x5A, 0x06, 0x01, 0x0F, 0x07, +/* 00007660 */ 0x11, 0x0A, 0x8F, 0x89, 0x03, 0x02, 0x01, 0x0E, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x01, 0x10, 0x06, +/* 00007670 */ 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xFB, 0x03, 0x08, 0x05, 0xFE, 0x5A, 0x04, 0x07, 0xFE, 0x2A, 0x02, +/* 00007680 */ 0x5B, 0x0D, 0xB4, 0x0D, 0x0D, 0x4F, 0x0E, 0x4F, 0x0F, 0x2C, 0x11, 0x0D, 0x15, 0x15, 0x00, 0x11, +/* 00007690 */ 0x02, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x12, 0x11, 0x00, 0x00, 0xE1, 0x11, 0x0D, 0x11, 0x00, 0x0F, +/* 000076A0 */ 0x25, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x12, 0x01, 0x00, 0x6D, 0x11, 0x12, 0x00, +/* 000076B0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x07, 0x5D, 0x02, 0x03, 0x00, 0x00, 0xF2, 0x03, +/* 000076C0 */ 0xFF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x0C, 0x11, 0x02, 0x00, 0x07, 0x03, +/* 000076D0 */ 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x21, 0x12, 0x03, 0x00, 0x5C, 0x01, 0x12, 0x8F, 0x03, 0x12, +/* 000076E0 */ 0x12, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x0D, 0xC3, 0x02, 0x12, 0x12, 0x02, 0x00, 0x5C, +/* 000076F0 */ 0x02, 0x12, 0xEE, 0x03, 0x11, 0x11, 0x01, 0x00, 0x47, 0x0E, 0x11, 0x8F, 0x03, 0x27, 0x11, 0x04, +/* 00007700 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x11, 0x11, 0x03, 0x00, +/* 00007710 */ 0x0F, 0x1F, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x26, 0x11, 0x05, 0x00, 0x07, 0x02, 0x00, +/* 00007720 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x11, 0x11, 0x04, 0x00, 0x0F, 0x09, 0x00, 0x11, +/* 00007730 */ 0x09, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, 0x6F, 0x01, 0xA8, 0x11, 0x47, 0x0F, 0x11, 0x8F, 0x03, +/* 00007740 */ 0x09, 0x11, 0x01, 0x00, 0x62, 0x11, 0x11, 0x01, 0x0F, 0x03, 0x00, 0x11, 0x09, 0xA2, 0x00, 0x0F, +/* 00007750 */ 0x9E, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x0F, 0x97, 0x00, 0x0C, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x0A, +/* 00007760 */ 0x11, 0x06, 0x00, 0x4B, 0x11, 0x98, 0x11, 0x11, 0x0A, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x11, 0x09, +/* 00007770 */ 0x14, 0x00, 0x8F, 0x01, 0x0A, 0x11, 0x06, 0x00, 0x4B, 0x11, 0x98, 0x11, 0x11, 0x0A, 0x01, 0x00, +/* 00007780 */ 0x47, 0x0F, 0x11, 0x09, 0x6B, 0x00, 0x8F, 0x03, 0x0A, 0x11, 0x07, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00007790 */ 0x00, 0x04, 0xCB, 0x12, 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x06, 0x05, 0x00, 0xEE, 0x03, 0x11, 0x11, +/* 000077A0 */ 0x05, 0x00, 0x47, 0x0F, 0x11, 0x8F, 0x01, 0x08, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x07, 0x04, 0x00, +/* 000077B0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0F, 0xA8, 0x12, 0x5C, 0x02, 0x12, 0x8F, 0x01, 0x02, 0x12, 0x09, +/* 000077C0 */ 0x00, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0xA8, 0x13, 0x5C, 0x01, 0x13, 0x5C, 0x02, +/* 000077D0 */ 0x08, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0x12, 0x12, 0x07, 0x00, 0x5C, 0x03, 0x12, 0xEE, 0x04, 0xFF, +/* 000077E0 */ 0x11, 0x06, 0x00, 0x8F, 0x01, 0x0A, 0x11, 0x06, 0x00, 0x4B, 0x11, 0x9D, 0x0F, 0x11, 0x0A, 0x00, +/* 000077F0 */ 0x00, 0x0F, 0x5C, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x0A, 0x11, 0x07, 0x00, 0x07, 0x03, +/* 00007800 */ 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x12, 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x06, 0x08, 0x00, 0xEE, 0x03, +/* 00007810 */ 0x11, 0x11, 0x08, 0x00, 0x47, 0x0F, 0x11, 0x8F, 0x01, 0x08, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x07, +/* 00007820 */ 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0F, 0x5C, 0x02, 0x0B, 0x8F, 0x01, 0x02, 0x12, 0x09, +/* 00007830 */ 0x00, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x08, 0x5C, +/* 00007840 */ 0x03, 0x09, 0xEE, 0x04, 0x12, 0x12, 0x0A, 0x00, 0x5C, 0x03, 0x12, 0xEE, 0x04, 0xFF, 0x11, 0x09, +/* 00007850 */ 0x00, 0x8F, 0x03, 0x11, 0x11, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x09, +/* 00007860 */ 0x13, 0x01, 0x00, 0x6D, 0x12, 0x13, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x13, 0x8F, 0x03, 0x31, +/* 00007870 */ 0x15, 0x0B, 0x00, 0x6D, 0x14, 0x15, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x15, 0x5C, 0x01, 0x0D, +/* 00007880 */ 0xF2, 0x02, 0x14, 0x14, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0F, +/* 00007890 */ 0xF2, 0x03, 0x12, 0x12, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x5C, 0x01, 0x12, 0xEE, 0x02, 0x00, +/* 000078A0 */ 0x11, 0x0B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x17, 0x03, +/* 000078B0 */ 0xFE, 0x33, 0x02, 0xFE, 0x5E, 0x02, 0xFF, 0x45, 0x35, 0x01, 0x00, 0x11, 0x09, 0x00, 0x00, 0x00, +/* 000078C0 */ 0x1D, 0x00, 0x4F, 0x00, 0x22, 0x00, 0x50, 0x00, 0x33, 0x00, 0x53, 0x00, 0x38, 0x00, 0x3C, 0x00, +/* 000078D0 */ 0x06, 0x00, 0x3A, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x1F, 0x00, 0xB4, 0x00, 0x15, 0x00, 0x84, 0x00, +/* 000078E0 */ 0x14, 0x00, 0xA2, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7A, 0x00, 0x0E, 0x00, 0x7C, 0x00, +/* 000078F0 */ 0x07, 0x00, 0x28, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x3A, 0x00, 0x81, 0x00, 0x57, 0x00, 0x5A, 0x00, +/* 00007900 */ 0x00, 0xBF, 0x5C, 0x8D, 0xE0, 0x29, 0xD4, 0x10, 0xFE, 0xAE, 0x05, 0x0C, 0xB3, 0x41, 0xC1, 0x00, +/* 00007910 */ 0xFE, 0x22, 0x04, 0x46, 0xFF, 0xCA, 0x17, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, +/* 00007920 */ 0xFF, 0xCA, 0x17, 0x01, 0x00, 0xFE, 0x69, 0x1B, 0xFE, 0x69, 0x1B, 0x45, 0x1C, 0x29, 0x41, 0x07, +/* 00007930 */ 0xFE, 0xAA, 0x01, 0xFE, 0x8A, 0x01, 0x03, 0x01, 0x22, 0x0C, 0x0F, 0x2A, 0x2A, 0x2A, 0x2A, 0x01, +/* 00007940 */ 0x01, 0x40, 0x41, 0x06, 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, 0x08, 0x06, 0xFE, 0x16, 0x03, +/* 00007950 */ 0x0B, 0x05, 0xFE, 0x12, 0x04, 0x06, 0xFE, 0x15, 0x04, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, +/* 00007960 */ 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x06, 0xFE, 0x50, 0x04, 0x06, 0xFE, 0x51, +/* 00007970 */ 0x04, 0x05, 0xFE, 0x2B, 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x2E, 0x04, 0x06, 0xFE, 0x52, +/* 00007980 */ 0x04, 0x06, 0xFE, 0x25, 0x04, 0x05, 0xFE, 0x30, 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x26, +/* 00007990 */ 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, +/* 000079A0 */ 0x04, 0x06, 0xFE, 0x53, 0x04, 0x06, 0xFE, 0x54, 0x04, 0x06, 0xFE, 0x6C, 0x03, 0x05, 0xFE, 0x55, +/* 000079B0 */ 0x04, 0x05, 0xFE, 0x56, 0x04, 0x05, 0xFE, 0x57, 0x04, 0x05, 0xFE, 0x58, 0x04, 0x07, 0x05, 0xFE, +/* 000079C0 */ 0xF4, 0x03, 0x05, 0xFE, 0x1A, 0x04, 0x0C, 0x05, 0xFE, 0x59, 0x04, 0x06, 0xFE, 0x13, 0x04, 0x01, +/* 000079D0 */ 0x00, 0xFE, 0x89, 0x06, 0xA8, 0x3F, 0x2C, 0x42, 0x29, 0x0D, 0x03, 0x00, 0x42, 0x02, 0x09, 0x1A, +/* 000079E0 */ 0x00, 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 000079F0 */ 0x43, 0xF2, 0x01, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x0C, 0x42, 0x01, +/* 00007A00 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x19, 0x43, 0x02, 0x00, 0x5C, 0x01, 0x43, +/* 00007A10 */ 0x5C, 0x02, 0x29, 0x5D, 0x03, 0x03, 0x01, 0x00, 0xEE, 0x04, 0x42, 0x42, 0x01, 0x00, 0x0F, 0x03, +/* 00007A20 */ 0x00, 0x42, 0x09, 0x2F, 0x00, 0x62, 0x42, 0x29, 0x01, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x24, 0x00, +/* 00007A30 */ 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x43, +/* 00007A40 */ 0x5D, 0x01, 0x05, 0x02, 0x00, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x42, 0x02, 0x00, +/* 00007A50 */ 0x00, 0x00, 0x02, 0x00, 0x77, 0x06, 0x29, 0x03, 0x8F, 0x01, 0x02, 0x42, 0x03, 0x00, 0x4B, 0x42, +/* 00007A60 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x07, 0x03, 0x00, 0x5D, 0x03, +/* 00007A70 */ 0x08, 0x03, 0x00, 0xEE, 0x04, 0x42, 0x42, 0x03, 0x00, 0x47, 0x2B, 0x42, 0x8F, 0x03, 0x02, 0x42, +/* 00007A80 */ 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x09, 0x04, 0x00, +/* 00007A90 */ 0x5D, 0x03, 0x0A, 0x04, 0x00, 0xCE, 0x43, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x43, 0xA1, 0x01, +/* 00007AA0 */ 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5D, 0x05, 0x0C, 0x04, 0x00, 0xEE, 0x06, 0x42, 0x42, 0x04, 0x00, +/* 00007AB0 */ 0x47, 0x2E, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007AC0 */ 0x01, 0x2B, 0x5D, 0x02, 0x0D, 0x05, 0x00, 0x5D, 0x03, 0x0A, 0x05, 0x00, 0xA8, 0x43, 0x5C, 0x04, +/* 00007AD0 */ 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x05, 0x00, 0x47, 0x2F, 0x42, 0xA8, +/* 00007AE0 */ 0x42, 0x15, 0x03, 0x00, 0x2F, 0x42, 0x09, 0x23, 0x00, 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, +/* 00007AF0 */ 0x42, 0x43, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x2F, 0xF2, 0x02, 0x42, 0x42, +/* 00007B00 */ 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x47, 0x2F, 0x42, 0x09, 0x1D, 0x00, 0x8F, 0x03, 0x09, 0x43, +/* 00007B10 */ 0x00, 0x00, 0x6D, 0x42, 0x43, 0x05, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF2, 0x01, 0x42, 0x42, +/* 00007B20 */ 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x14, 0x03, 0x00, 0x2F, 0x42, +/* 00007B30 */ 0x09, 0x1A, 0x00, 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x06, 0x07, 0x01, 0x00, +/* 00007B40 */ 0x5C, 0x00, 0x43, 0xF2, 0x01, 0xFF, 0x42, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x8F, 0x03, 0x02, +/* 00007B50 */ 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x0E, 0x09, +/* 00007B60 */ 0x00, 0x5D, 0x03, 0x0A, 0x09, 0x00, 0xCE, 0x43, 0x03, 0x01, 0x00, 0xA1, 0x00, 0x0F, 0x43, 0xA1, +/* 00007B70 */ 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, +/* 00007B80 */ 0x06, 0x42, 0x42, 0x09, 0x00, 0x47, 0x30, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, +/* 00007B90 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x12, 0x0A, 0x00, 0x5D, 0x03, 0x0A, 0x0A, +/* 00007BA0 */ 0x00, 0xCE, 0x43, 0x03, 0x02, 0x00, 0xA1, 0x00, 0x0F, 0x43, 0xA1, 0x01, 0x10, 0x43, 0xA1, 0x02, +/* 00007BB0 */ 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0A, 0x00, +/* 00007BC0 */ 0x47, 0x31, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007BD0 */ 0x01, 0x2B, 0x5D, 0x02, 0x13, 0x0B, 0x00, 0x5D, 0x03, 0x0A, 0x0B, 0x00, 0xCE, 0x43, 0x02, 0x03, +/* 00007BE0 */ 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, +/* 00007BF0 */ 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0B, 0x00, 0x47, 0x32, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, +/* 00007C00 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x16, 0x0C, 0x00, 0x5D, 0x03, +/* 00007C10 */ 0x0A, 0x0C, 0x00, 0xCE, 0x43, 0x05, 0x04, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, +/* 00007C20 */ 0xA1, 0x02, 0x0F, 0x43, 0xA1, 0x03, 0x10, 0x43, 0xA1, 0x04, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, +/* 00007C30 */ 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0C, 0x00, 0x47, 0x33, 0x42, 0x8F, 0x03, 0x02, +/* 00007C40 */ 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x17, 0x0D, +/* 00007C50 */ 0x00, 0x5D, 0x03, 0x0A, 0x0D, 0x00, 0xCE, 0x43, 0x02, 0x05, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, +/* 00007C60 */ 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0D, +/* 00007C70 */ 0x00, 0x47, 0x34, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 00007C80 */ 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x18, 0x0E, 0x00, 0x5D, 0x03, 0x0A, 0x0E, 0x00, 0xCE, 0x43, 0x02, +/* 00007C90 */ 0x06, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, +/* 00007CA0 */ 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0E, 0x00, 0x47, 0x35, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, +/* 00007CB0 */ 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x19, 0x0F, 0x00, 0x5D, +/* 00007CC0 */ 0x03, 0x0A, 0x0F, 0x00, 0xCE, 0x43, 0x02, 0x07, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, +/* 00007CD0 */ 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0F, 0x00, 0x47, +/* 00007CE0 */ 0x36, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007CF0 */ 0x2B, 0x5D, 0x02, 0x1A, 0x10, 0x00, 0x5D, 0x03, 0x0A, 0x10, 0x00, 0xCE, 0x43, 0x02, 0x08, 0x00, +/* 00007D00 */ 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, +/* 00007D10 */ 0xEE, 0x06, 0x42, 0x42, 0x10, 0x00, 0x47, 0x37, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, +/* 00007D20 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x1B, 0x11, 0x00, 0x5D, 0x03, 0x0A, +/* 00007D30 */ 0x11, 0x00, 0xCE, 0x43, 0x02, 0x09, 0x00, 0xA1, 0x00, 0x10, 0x43, 0xA1, 0x01, 0x11, 0x43, 0x5C, +/* 00007D40 */ 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x11, 0x00, 0x47, 0x38, 0x42, +/* 00007D50 */ 0x0F, 0x03, 0x00, 0x35, 0x09, 0x2F, 0x00, 0x8F, 0x03, 0x02, 0x43, 0x04, 0x00, 0x07, 0x06, 0x00, +/* 00007D60 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x1C, 0x12, 0x00, 0x5D, 0x03, 0x1D, 0x12, 0x00, +/* 00007D70 */ 0xA8, 0x44, 0x5C, 0x04, 0x44, 0xA8, 0x44, 0x5C, 0x05, 0x44, 0xEE, 0x06, 0x43, 0x43, 0x12, 0x00, +/* 00007D80 */ 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x39, 0x42, 0x8F, 0x03, +/* 00007D90 */ 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x1E, +/* 00007DA0 */ 0x13, 0x00, 0x5D, 0x03, 0x0A, 0x13, 0x00, 0xCE, 0x43, 0x02, 0x0A, 0x00, 0xA1, 0x00, 0x1F, 0x43, +/* 00007DB0 */ 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5D, 0x05, 0x0C, 0x13, 0x00, 0xEE, 0x06, 0x42, 0x42, +/* 00007DC0 */ 0x13, 0x00, 0x47, 0x3A, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x39, 0x42, 0x09, 0x16, 0x00, 0x0F, +/* 00007DD0 */ 0x03, 0x00, 0x39, 0x09, 0x06, 0x00, 0x47, 0x43, 0x20, 0x09, 0x03, 0x00, 0x47, 0x43, 0x21, 0x47, +/* 00007DE0 */ 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x3B, 0x42, 0x8F, 0x01, 0x03, +/* 00007DF0 */ 0x42, 0x05, 0x00, 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x0A, 0x43, 0x06, +/* 00007E00 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00007E10 */ 0x44, 0x00, 0x00, 0x00, 0x7B, 0x30, 0x44, 0x07, 0x7B, 0x31, 0x44, 0x08, 0x7B, 0x32, 0x44, 0x09, +/* 00007E20 */ 0x7B, 0x33, 0x44, 0x0A, 0x7B, 0x34, 0x44, 0x0B, 0x7B, 0x35, 0x44, 0x0C, 0x7B, 0x36, 0x44, 0x0D, +/* 00007E30 */ 0x7B, 0x37, 0x44, 0x0E, 0x7B, 0x38, 0x44, 0x0F, 0x5C, 0x01, 0x44, 0x5D, 0x02, 0x22, 0x15, 0x00, +/* 00007E40 */ 0xEE, 0x03, 0x43, 0x43, 0x15, 0x00, 0x5C, 0x01, 0x43, 0xEE, 0x02, 0x42, 0x42, 0x14, 0x00, 0x47, +/* 00007E50 */ 0x3C, 0x42, 0x8F, 0x03, 0x07, 0x42, 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007E60 */ 0x2A, 0xEE, 0x02, 0x42, 0x42, 0x16, 0x00, 0x47, 0x2A, 0x42, 0x8F, 0x03, 0x2F, 0x42, 0x08, 0x00, +/* 00007E70 */ 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2A, 0x5C, 0x02, 0x2E, 0xCE, 0x43, 0x02, 0x0B, +/* 00007E80 */ 0x00, 0xA1, 0x00, 0x23, 0x43, 0xA1, 0x01, 0x24, 0x43, 0x5C, 0x03, 0x43, 0x8F, 0x03, 0x30, 0x43, +/* 00007E90 */ 0x09, 0x00, 0x5C, 0x04, 0x43, 0xEE, 0x05, 0x42, 0x42, 0x17, 0x00, 0x47, 0x3D, 0x42, 0x77, 0x2E, +/* 00007EA0 */ 0x29, 0x10, 0x77, 0x2F, 0x29, 0x11, 0x62, 0x42, 0x3D, 0x12, 0x77, 0x42, 0x29, 0x13, 0x77, 0x30, +/* 00007EB0 */ 0x29, 0x14, 0x77, 0x31, 0x29, 0x15, 0x77, 0x32, 0x29, 0x16, 0x77, 0x33, 0x29, 0x17, 0x77, 0x34, +/* 00007EC0 */ 0x29, 0x18, 0x77, 0x35, 0x29, 0x19, 0x77, 0x36, 0x29, 0x1A, 0x77, 0x37, 0x29, 0x1B, 0x77, 0x38, +/* 00007ED0 */ 0x29, 0x1C, 0x77, 0x39, 0x29, 0x1D, 0x77, 0x3A, 0x29, 0x1E, 0x77, 0x3B, 0x29, 0x1F, 0x77, 0x3C, +/* 00007EE0 */ 0x29, 0x20, 0x47, 0x3E, 0x25, 0xE5, 0x20, 0x00, 0x8F, 0x03, 0x3E, 0x42, 0x0A, 0x00, 0x4B, 0x42, +/* 00007EF0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5D, 0x02, 0x25, 0x18, 0x00, 0xEE, 0x03, +/* 00007F00 */ 0xFF, 0x42, 0x18, 0x00, 0xE9, 0x09, 0x63, 0x00, 0xE7, 0x2C, 0x06, 0x8F, 0x03, 0x29, 0x42, 0x0B, +/* 00007F10 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2C, 0xEE, 0x02, 0xFF, 0x42, 0x19, 0x00, +/* 00007F20 */ 0x8F, 0x01, 0x02, 0x42, 0x03, 0x00, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007F30 */ 0x2B, 0x5D, 0x02, 0x26, 0x1A, 0x00, 0x5D, 0x03, 0x27, 0x1A, 0x00, 0xEE, 0x04, 0x42, 0x42, 0x1A, +/* 00007F40 */ 0x00, 0x47, 0x3F, 0x42, 0x47, 0x42, 0x29, 0x8F, 0x01, 0x03, 0x43, 0x05, 0x00, 0x4B, 0x43, 0x07, +/* 00007F50 */ 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x3F, 0x5D, 0x02, 0x22, 0x1B, 0x00, 0xEE, 0x03, 0x43, +/* 00007F60 */ 0x43, 0x1B, 0x00, 0x77, 0x43, 0x42, 0x21, 0x47, 0x3E, 0x06, 0xE9, 0x0F, 0x2E, 0x00, 0x3E, 0x09, +/* 00007F70 */ 0x00, 0x00, 0x47, 0x42, 0x29, 0x8F, 0x01, 0x07, 0x43, 0x0C, 0x00, 0x4B, 0x43, 0x07, 0x03, 0x00, +/* 00007F80 */ 0x5C, 0x00, 0x04, 0x62, 0x44, 0x29, 0x22, 0x98, 0x44, 0x44, 0x28, 0x00, 0x00, 0x5C, 0x01, 0x44, +/* 00007F90 */ 0x5C, 0x02, 0x29, 0xEE, 0x03, 0x43, 0x43, 0x1C, 0x00, 0x77, 0x43, 0x42, 0x21, 0xE5, 0x20, 0x00, +/* 00007FA0 */ 0x8F, 0x03, 0x3E, 0x42, 0x0A, 0x00, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007FB0 */ 0x29, 0x5D, 0x02, 0x06, 0x1D, 0x00, 0xEE, 0x03, 0xFF, 0x42, 0x1D, 0x00, 0xE9, 0x09, 0x33, 0x00, +/* 00007FC0 */ 0xE7, 0x2D, 0x06, 0x8F, 0x03, 0x29, 0x42, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007FD0 */ 0x01, 0x2D, 0xEE, 0x02, 0xFF, 0x42, 0x1E, 0x00, 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, 0x42, +/* 00007FE0 */ 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF2, 0x01, 0xFF, 0x42, 0x06, 0x00, 0x00, 0x00, +/* 00007FF0 */ 0x1F, 0x00, 0xE9, 0x8F, 0x01, 0x04, 0x42, 0x0D, 0x00, 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00008000 */ 0x04, 0x62, 0x43, 0x29, 0x23, 0x5C, 0x01, 0x43, 0xEE, 0x02, 0x42, 0x42, 0x20, 0x00, 0x77, 0x42, +/* 00008010 */ 0x29, 0x24, 0x47, 0x42, 0x29, 0x8F, 0x03, 0x0C, 0x43, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00008020 */ 0x04, 0x8F, 0x03, 0x24, 0x44, 0x0E, 0x00, 0x5C, 0x01, 0x44, 0x62, 0x44, 0x29, 0x25, 0x5C, 0x02, +/* 00008030 */ 0x44, 0xEE, 0x03, 0x43, 0x43, 0x21, 0x00, 0x77, 0x43, 0x42, 0x26, 0x62, 0x42, 0x29, 0x27, 0xA8, +/* 00008040 */ 0x43, 0x15, 0x03, 0x00, 0x42, 0x43, 0x09, 0x0C, 0x00, 0x62, 0x42, 0x29, 0x28, 0x43, 0x42, 0x42, +/* 00008050 */ 0x20, 0x77, 0x42, 0x29, 0x1D, 0x77, 0x06, 0x29, 0x29, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x2C, 0x00, +/* 00008060 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, +/* 00008070 */ 0x84, 0x02, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, +/* 00008080 */ 0x82, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, +/* 00008090 */ 0xFE, 0x57, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x65, 0x02, 0xFE, +/* 000080A0 */ 0x66, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, +/* 000080B0 */ 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x86, 0x02, +/* 000080C0 */ 0xFE, 0x70, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x88, 0x02, 0xFE, +/* 000080D0 */ 0x8F, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x8C, +/* 000080E0 */ 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x91, 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x93, 0x02, 0xFE, 0x25, 0x02, +/* 000080F0 */ 0xFE, 0x1A, 0x02, 0xFE, 0x1A, 0x02, 0xFE, 0x27, 0x02, 0xFE, 0x26, 0x02, 0xFE, 0x94, 0x02, 0xFE, +/* 00008100 */ 0x14, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x6E, 0x02, 0xFF, 0x23, +/* 00008110 */ 0x18, 0x01, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x1A, 0x00, 0x3F, 0x00, +/* 00008120 */ 0x35, 0x00, 0x9F, 0x00, 0x24, 0x00, 0x71, 0x00, 0x04, 0x00, 0x67, 0x00, 0x24, 0x00, 0x46, 0x00, +/* 00008130 */ 0x37, 0x00, 0x71, 0x00, 0x2C, 0x00, 0x60, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x23, 0x00, 0x6C, 0x00, +/* 00008140 */ 0x1D, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x1A, 0x00, 0x6C, 0x00, 0x3B, 0x00, 0x6F, 0x00, +/* 00008150 */ 0x3B, 0x00, 0x67, 0x00, 0x37, 0x00, 0x64, 0x00, 0x43, 0x00, 0x81, 0x00, 0x37, 0x00, 0x62, 0x00, +/* 00008160 */ 0x37, 0x00, 0x64, 0x00, 0x37, 0x00, 0x68, 0x00, 0x37, 0x00, 0x68, 0x00, 0x37, 0x00, 0x70, 0x00, +/* 00008170 */ 0x3E, 0x00, 0x6F, 0x00, 0x37, 0x00, 0x77, 0x00, 0x28, 0x00, 0x71, 0x00, 0x65, 0x00, 0xD0, 0x01, +/* 00008180 */ 0x18, 0x00, 0x41, 0x00, 0x34, 0x00, 0x9A, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x36, 0x00, +/* 00008190 */ 0x08, 0x00, 0x68, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, +/* 000081A0 */ 0x04, 0x00, 0x30, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x32, 0x00, +/* 000081B0 */ 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x40, 0x00, +/* 000081C0 */ 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0xFA, 0x02, 0x06, 0x00, 0x93, 0x00, 0x22, 0x00, 0x3F, 0x00, +/* 000081D0 */ 0x01, 0x00, 0x4A, 0x00, 0x15, 0x00, 0xEF, 0x00, 0x24, 0x00, 0x54, 0x00, 0x23, 0x00, 0x6A, 0x00, +/* 000081E0 */ 0x04, 0x00, 0x37, 0x00, 0x07, 0x00, 0x5A, 0x00, 0x2E, 0x00, 0xDE, 0x00, 0x22, 0x00, 0x3E, 0x00, +/* 000081F0 */ 0x01, 0x00, 0x4A, 0x00, 0x15, 0x00, 0x77, 0x01, 0x1B, 0x00, 0x77, 0x00, 0x1F, 0x00, 0x66, 0x00, +/* 00008200 */ 0x29, 0x00, 0x82, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x0C, 0x00, 0x6D, 0x00, 0x06, 0x00, 0x3F, 0x00, +/* 00008210 */ 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x11, 0xC4, 0x00, 0xFE, 0x75, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, +/* 00008220 */ 0xFE, 0x21, 0x04, 0x45, 0xFF, 0x8F, 0x0A, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, +/* 00008230 */ 0xFF, 0x8F, 0x0A, 0x01, 0x00, 0xFE, 0x2D, 0x0D, 0xFE, 0x2D, 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, +/* 00008240 */ 0xC8, 0xBB, 0x03, 0x02, 0x10, 0x07, 0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0x15, 0x05, 0xFE, 0x4A, 0x04, +/* 00008250 */ 0x08, 0x05, 0xFE, 0x30, 0x04, 0x07, 0x05, 0xFE, 0x4B, 0x04, 0x01, 0x00, 0x05, 0xFE, 0x4C, 0x04, +/* 00008260 */ 0x05, 0xFE, 0x3F, 0x04, 0x05, 0xFE, 0x4D, 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x26, 0x04, +/* 00008270 */ 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, +/* 00008280 */ 0x05, 0xFE, 0x4E, 0x04, 0xFE, 0x02, 0x03, 0xA8, 0x14, 0x62, 0x16, 0x13, 0x00, 0xA8, 0x17, 0x15, +/* 00008290 */ 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x05, 0x16, 0x00, 0x00, 0x4B, 0x16, 0x07, +/* 000082A0 */ 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x00, 0x5C, 0x02, 0x17, 0x5D, +/* 000082B0 */ 0x03, 0x02, 0x00, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x00, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, +/* 000082C0 */ 0x01, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x00, 0x00, 0x62, 0x16, 0x13, 0x02, 0x14, +/* 000082D0 */ 0x03, 0x00, 0x16, 0x04, 0x09, 0x8C, 0x00, 0x8F, 0x03, 0x09, 0x17, 0x01, 0x00, 0x6D, 0x16, 0x17, +/* 000082E0 */ 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, +/* 000082F0 */ 0xF2, 0x03, 0x16, 0x16, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, +/* 00008300 */ 0x14, 0x05, 0x09, 0x2C, 0x00, 0x8F, 0x03, 0x14, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00008310 */ 0x03, 0x8F, 0x03, 0x13, 0x17, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x06, 0x03, 0x00, 0xC3, +/* 00008320 */ 0x02, 0x17, 0x17, 0x03, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0xFF, 0x16, 0x02, 0x00, 0x09, 0x2F, +/* 00008330 */ 0x00, 0x8F, 0x03, 0x0C, 0x16, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x23, +/* 00008340 */ 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x12, 0x98, 0x17, 0x14, 0x07, 0x00, 0x00, 0x5C, +/* 00008350 */ 0x03, 0x17, 0x5D, 0x04, 0x08, 0x04, 0x00, 0xEE, 0x05, 0x16, 0x16, 0x04, 0x00, 0x47, 0x12, 0x16, +/* 00008360 */ 0x09, 0x95, 0x00, 0x62, 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, 0x16, 0x09, 0x09, 0x89, 0x00, 0x8F, +/* 00008370 */ 0x03, 0x09, 0x17, 0x01, 0x00, 0x6D, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, +/* 00008380 */ 0x01, 0x12, 0xE0, 0x18, 0x01, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x03, 0x00, 0x00, 0x00, +/* 00008390 */ 0x05, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x2C, 0x00, 0x8F, 0x03, 0x14, +/* 000083A0 */ 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x13, 0x17, 0x03, 0x00, 0x07, +/* 000083B0 */ 0x02, 0x00, 0x5D, 0x01, 0x06, 0x07, 0x00, 0xC3, 0x02, 0x17, 0x17, 0x07, 0x00, 0x5C, 0x01, 0x17, +/* 000083C0 */ 0xEE, 0x02, 0xFF, 0x16, 0x06, 0x00, 0x09, 0x2F, 0x00, 0x8F, 0x03, 0x0C, 0x16, 0x04, 0x00, 0x07, +/* 000083D0 */ 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x23, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, +/* 000083E0 */ 0x12, 0x98, 0x17, 0x14, 0x07, 0x01, 0x00, 0x5C, 0x03, 0x17, 0x5D, 0x04, 0x0A, 0x08, 0x00, 0xEE, +/* 000083F0 */ 0x05, 0x16, 0x16, 0x08, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, +/* 00008400 */ 0x00, 0x16, 0x17, 0x09, 0x41, 0x00, 0x62, 0x16, 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x04, 0x09, +/* 00008410 */ 0x35, 0x00, 0x62, 0x16, 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x0B, 0x09, 0x29, 0x00, 0x8F, 0x01, +/* 00008420 */ 0x05, 0x16, 0x00, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, +/* 00008430 */ 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0C, 0x09, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x09, +/* 00008440 */ 0x00, 0x47, 0x12, 0x16, 0x09, 0x34, 0x00, 0x62, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, +/* 00008450 */ 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x06, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, +/* 00008460 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0C, +/* 00008470 */ 0x0A, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0A, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x05, 0xA8, +/* 00008480 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x06, 0x16, 0x06, 0x00, 0x4B, +/* 00008490 */ 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x05, 0x5C, 0x02, +/* 000084A0 */ 0x17, 0x5D, 0x03, 0x0D, 0x0B, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0B, 0x00, 0x47, 0x12, 0x16, 0x62, +/* 000084B0 */ 0x16, 0x13, 0x06, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x06, +/* 000084C0 */ 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, +/* 000084D0 */ 0x13, 0x06, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0E, 0x0C, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0C, 0x00, +/* 000084E0 */ 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x07, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, +/* 000084F0 */ 0x00, 0x8F, 0x01, 0x06, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 00008500 */ 0x01, 0x12, 0x62, 0x17, 0x13, 0x07, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0F, 0x0D, 0x00, 0xEE, 0x04, +/* 00008510 */ 0x16, 0x16, 0x0D, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x08, 0xA8, 0x17, 0x15, 0x03, 0x00, +/* 00008520 */ 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x06, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, +/* 00008530 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x08, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x10, +/* 00008540 */ 0x0E, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0E, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x09, 0xA8, +/* 00008550 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x05, 0x16, 0x00, 0x00, 0x4B, +/* 00008560 */ 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x09, 0x5C, 0x02, +/* 00008570 */ 0x17, 0x5D, 0x03, 0x11, 0x0F, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0F, 0x00, 0x47, 0x12, 0x16, 0x47, +/* 00008580 */ 0x00, 0x12, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x88, 0x02, 0xFE, 0x8F, 0x02, 0xFE, +/* 00008590 */ 0x89, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x8C, +/* 000085A0 */ 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x91, 0x02, 0x1C, 0xFE, 0x4F, 0x04, 0x00, 0x1C, 0xFE, 0x4F, 0x04, +/* 000085B0 */ 0x00, 0xFF, 0xDE, 0x0A, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x26, +/* 000085C0 */ 0x00, 0x88, 0x00, 0x0E, 0x00, 0x8E, 0x01, 0x0C, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x6B, 0x00, 0x08, +/* 000085D0 */ 0x00, 0x2E, 0x00, 0x2C, 0x00, 0x91, 0x00, 0x32, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x26, +/* 000085E0 */ 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x2C, 0x00, 0x91, 0x00, 0x2F, 0x00, 0x2F, 0x01, 0x26, +/* 000085F0 */ 0x00, 0x90, 0x00, 0x29, 0x00, 0x76, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x26, 0x00, 0x8B, 0x00, 0x0E, +/* 00008600 */ 0x00, 0x3E, 0x00, 0x26, 0x00, 0x87, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x89, 0x00, 0x0E, +/* 00008610 */ 0x00, 0x41, 0x00, 0x26, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x26, 0x00, 0x8D, 0x00, 0x0E, +/* 00008620 */ 0x00, 0x47, 0x00, 0x26, 0x00, 0x8C, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, +/* 00008630 */ 0x01, 0xC4, 0x00, 0xFE, 0x61, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x20, 0x04, 0x44, 0xFF, +/* 00008640 */ 0x27, 0x05, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x27, 0x05, 0x01, 0x00, +/* 00008650 */ 0xFE, 0xF8, 0x04, 0xFE, 0xF8, 0x04, 0x01, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x05, 0x06, +/* 00008660 */ 0x06, 0x01, 0x01, 0x01, 0x01, 0x15, 0x05, 0xFE, 0x3A, 0x04, 0x05, 0xFE, 0x45, 0x04, 0x08, 0x07, +/* 00008670 */ 0x05, 0xFE, 0x46, 0x04, 0x05, 0xFE, 0x3D, 0x04, 0x05, 0xFE, 0x3E, 0x04, 0x05, 0xFE, 0x30, 0x04, +/* 00008680 */ 0x01, 0x00, 0x06, 0xFE, 0x40, 0x04, 0x01, 0x01, 0x05, 0xFE, 0x47, 0x04, 0x01, 0x02, 0x05, 0xFE, +/* 00008690 */ 0x48, 0x04, 0x05, 0xFE, 0x49, 0x04, 0xFE, 0x14, 0x01, 0x8F, 0x03, 0x09, 0x17, 0x00, 0x00, 0x6D, +/* 000086A0 */ 0x16, 0x17, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x11, 0x8F, 0x03, 0x0F, 0x18, +/* 000086B0 */ 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, 0x19, 0x02, 0x13, 0x03, 0x5C, 0x01, 0x19, +/* 000086C0 */ 0xEE, 0x02, 0x18, 0x18, 0x01, 0x00, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x00, 0x00, 0x00, +/* 000086D0 */ 0x00, 0x00, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x3C, 0x00, 0x8F, 0x03, +/* 000086E0 */ 0x14, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x13, 0x17, 0x03, 0x00, +/* 000086F0 */ 0x07, 0x02, 0x00, 0xFC, 0x18, 0x06, 0x11, 0x06, 0xFE, 0x18, 0x07, 0x02, 0x02, 0xFE, 0x18, 0x13, +/* 00008700 */ 0x08, 0x04, 0x5C, 0x01, 0x18, 0xC3, 0x02, 0x17, 0x17, 0x03, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, +/* 00008710 */ 0xFF, 0x16, 0x02, 0x00, 0x47, 0x00, 0x11, 0x09, 0x91, 0x00, 0x14, 0x03, 0x00, 0x12, 0x09, 0x09, +/* 00008720 */ 0x3B, 0x00, 0x8F, 0x03, 0x0C, 0x16, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, +/* 00008730 */ 0x23, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x98, 0x17, 0x14, 0x0A, 0x00, 0x00, +/* 00008740 */ 0x5C, 0x03, 0x17, 0x98, 0x17, 0x14, 0x0C, 0x01, 0x00, 0xFB, 0x17, 0x0B, 0x17, 0x0D, 0x5C, 0x04, +/* 00008750 */ 0x17, 0xEE, 0x05, 0x00, 0x16, 0x04, 0x00, 0x09, 0x51, 0x00, 0x09, 0x46, 0x00, 0x98, 0x16, 0x14, +/* 00008760 */ 0x0E, 0x02, 0x00, 0x15, 0x03, 0x00, 0x16, 0x0F, 0x09, 0x38, 0x00, 0x8F, 0x03, 0x0C, 0x16, 0x04, +/* 00008770 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x23, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, +/* 00008780 */ 0x5C, 0x02, 0x11, 0x98, 0x17, 0x14, 0x0A, 0x03, 0x00, 0x5C, 0x03, 0x17, 0x98, 0x17, 0x14, 0x0C, +/* 00008790 */ 0x04, 0x00, 0xFB, 0x17, 0x0B, 0x17, 0x10, 0x5C, 0x04, 0x17, 0xEE, 0x05, 0x00, 0x16, 0x05, 0x00, +/* 000087A0 */ 0x09, 0x08, 0x00, 0x47, 0x00, 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, +/* 000087B0 */ 0xFF, 0x4E, 0x06, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x91, 0x00, 0x08, 0x00, +/* 000087C0 */ 0x2A, 0x00, 0x36, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x08, 0x00, 0x33, 0x00, 0x3B, 0x00, +/* 000087D0 */ 0x81, 0x00, 0x0E, 0x00, 0x32, 0x00, 0x38, 0x00, 0x8A, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, +/* 000087E0 */ 0x5C, 0x85, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x50, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1F, +/* 000087F0 */ 0x04, 0x43, 0xFE, 0xF9, 0xFF, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xF9, 0xFF, 0xFE, +/* 00008800 */ 0x20, 0x05, 0xFE, 0x20, 0x05, 0x01, 0x09, 0x14, 0x19, 0x07, 0x50, 0x4B, 0x03, 0x05, 0x06, 0x06, +/* 00008810 */ 0x01, 0x01, 0x01, 0x01, 0x18, 0x05, 0xFE, 0x3A, 0x04, 0x05, 0xFE, 0x3B, 0x04, 0x08, 0x07, 0x05, +/* 00008820 */ 0xFE, 0x3C, 0x04, 0x05, 0xFE, 0x3D, 0x04, 0x05, 0xFE, 0x3E, 0x04, 0x01, 0x02, 0x05, 0xFE, 0x3F, +/* 00008830 */ 0x04, 0x05, 0xFE, 0x2E, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x40, 0x04, 0x01, 0x01, 0x06, 0xFE, 0x41, +/* 00008840 */ 0x04, 0x06, 0xFE, 0x42, 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x43, 0x04, 0x05, 0xFE, 0x44, +/* 00008850 */ 0x04, 0xFE, 0x43, 0x01, 0x8F, 0x03, 0x09, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, +/* 00008860 */ 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x14, 0x8F, 0x03, 0x0F, 0x1B, 0x01, 0x00, 0x07, 0x02, 0x00, +/* 00008870 */ 0x5C, 0x00, 0x04, 0xFB, 0x1C, 0x02, 0x16, 0x03, 0x5C, 0x01, 0x1C, 0xEE, 0x02, 0x1B, 0x1B, 0x01, +/* 00008880 */ 0x00, 0x5C, 0x02, 0x1B, 0xF2, 0x03, 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x17, +/* 00008890 */ 0x19, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x3C, 0x00, 0x8F, 0x03, 0x14, 0x19, 0x02, 0x00, 0x07, +/* 000088A0 */ 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x13, 0x1A, 0x03, 0x00, 0x07, 0x02, 0x00, 0xFC, 0x1B, +/* 000088B0 */ 0x06, 0x14, 0x06, 0xFE, 0x1B, 0x07, 0x02, 0x02, 0xFE, 0x1B, 0x16, 0x08, 0x04, 0x5C, 0x01, 0x1B, +/* 000088C0 */ 0xC3, 0x02, 0x1A, 0x1A, 0x03, 0x00, 0x5C, 0x01, 0x1A, 0xEE, 0x02, 0xFF, 0x19, 0x02, 0x00, 0x47, +/* 000088D0 */ 0x00, 0x14, 0x09, 0xC0, 0x00, 0x98, 0x19, 0x17, 0x09, 0x00, 0x00, 0x15, 0x03, 0x00, 0x19, 0x0A, +/* 000088E0 */ 0x09, 0x4E, 0x00, 0x14, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x46, 0x00, 0x8F, 0x03, 0x0C, 0x19, 0x04, +/* 000088F0 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x23, 0x1A, 0x05, 0x00, 0x5C, 0x01, 0x1A, +/* 00008900 */ 0x5C, 0x02, 0x14, 0x98, 0x1A, 0x17, 0x0C, 0x01, 0x00, 0x5C, 0x03, 0x1A, 0x98, 0x1A, 0x17, 0x0E, +/* 00008910 */ 0x02, 0x00, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, 0x2F, 0x1A, 0x1A, 0x0A, 0x2F, 0x1A, +/* 00008920 */ 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0x00, 0x19, 0x04, 0x00, 0x09, 0x67, 0x00, 0x09, 0x5C, +/* 00008930 */ 0x00, 0x15, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x54, 0x00, 0x8F, 0x03, 0x0C, 0x19, 0x04, 0x00, 0x07, +/* 00008940 */ 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x23, 0x1A, 0x05, 0x00, 0x5C, 0x01, 0x1A, 0x5C, 0x02, +/* 00008950 */ 0x14, 0x98, 0x1A, 0x17, 0x0C, 0x03, 0x00, 0x5C, 0x03, 0x1A, 0x98, 0x1A, 0x17, 0x0E, 0x04, 0x00, +/* 00008960 */ 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, 0x14, 0x03, 0x00, 0x15, 0x11, 0x09, 0x06, 0x00, +/* 00008970 */ 0x47, 0x1B, 0x12, 0x09, 0x03, 0x00, 0x47, 0x1B, 0x13, 0x2F, 0x1A, 0x1A, 0x1B, 0x2F, 0x1A, 0x1A, +/* 00008980 */ 0x10, 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0x00, 0x19, 0x05, 0x00, 0x09, 0x08, 0x00, 0x47, 0x00, 0x14, +/* 00008990 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0xFF, 0xCF, 0x00, 0x01, 0x00, 0x0A, +/* 000089A0 */ 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x0F, 0x01, 0x08, 0x00, 0x2A, 0x00, 0x36, 0x00, 0xF5, 0x00, +/* 000089B0 */ 0x06, 0x00, 0x39, 0x00, 0x16, 0x00, 0x47, 0x00, 0x46, 0x00, 0x85, 0x00, 0x08, 0x00, 0x30, 0x00, +/* 000089C0 */ 0x54, 0x00, 0xC4, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0x4C, 0x81, 0x00, 0x00, 0xC4, 0x00, +/* 000089D0 */ 0xFE, 0x47, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1E, 0x04, 0x42, 0xFE, 0x92, 0xFE, 0xFF, +/* 000089E0 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x92, 0xFE, 0xE9, 0xE9, 0x01, 0x03, 0x05, 0x07, 0x0E, +/* 000089F0 */ 0x0B, 0x03, 0x01, 0x01, 0x06, 0x06, 0xFE, 0x72, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xFD, +/* 00008A00 */ 0x03, 0x2E, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x06, 0x00, 0x47, 0x00, 0x03, +/* 00008A10 */ 0x09, 0x1B, 0x00, 0x8F, 0x02, 0x02, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0x47, +/* 00008A20 */ 0x00, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 00008A30 */ 0xFE, 0xCD, 0xFE, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x06, 0x00, 0x2E, 0x00, +/* 00008A40 */ 0x1B, 0x00, 0x44, 0x00, 0x00, 0x3F, 0x5D, 0x8C, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x07, 0x05, 0x0C, +/* 00008A50 */ 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1D, 0x04, 0x40, 0xFE, 0x1A, 0xF3, 0x01, 0xFF, 0x00, 0x10, 0x01, +/* 00008A60 */ 0x00, 0x02, 0x02, 0xFE, 0x1A, 0xF3, 0xFE, 0x95, 0x09, 0xFE, 0x95, 0x09, 0x02, 0x06, 0x17, 0x1B, +/* 00008A70 */ 0x05, 0xCC, 0xCA, 0x03, 0x0D, 0x02, 0x07, 0x05, 0x05, 0x05, 0x05, 0x18, 0x19, 0x1A, 0x05, 0xFE, +/* 00008A80 */ 0x2B, 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x2D, 0x04, 0x08, 0x05, 0xFE, 0x2E, 0x04, 0x05, +/* 00008A90 */ 0xFE, 0x2F, 0x04, 0x05, 0xFE, 0x30, 0x04, 0x05, 0xFE, 0x31, 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x05, +/* 00008AA0 */ 0xFE, 0x32, 0x04, 0x05, 0xFE, 0x33, 0x04, 0x05, 0xFE, 0x34, 0x04, 0x05, 0xFE, 0x35, 0x04, 0x06, +/* 00008AB0 */ 0xFE, 0x27, 0x04, 0x05, 0xFE, 0x36, 0x04, 0x05, 0xFE, 0x37, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, +/* 00008AC0 */ 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x38, 0x04, 0xFE, 0x57, 0x03, +/* 00008AD0 */ 0x96, 0x03, 0x17, 0xCE, 0x1B, 0x00, 0x00, 0x00, 0x96, 0x02, 0x1B, 0x93, 0x03, 0x1B, 0x00, 0x00, +/* 00008AE0 */ 0x62, 0x1B, 0x1B, 0x00, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x86, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, +/* 00008AF0 */ 0x62, 0x1B, 0x1B, 0x00, 0x14, 0x14, 0x00, 0x1B, 0x02, 0x09, 0x00, 0x00, 0x93, 0x03, 0x1B, 0x00, +/* 00008B00 */ 0x00, 0x62, 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x2B, 0x00, 0x8F, 0x03, 0x0C, +/* 00008B10 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, +/* 00008B20 */ 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x04, 0x00, 0x00, 0xEE, +/* 00008B30 */ 0x04, 0xFF, 0x1B, 0x00, 0x00, 0x09, 0x39, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, +/* 00008B40 */ 0x00, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x28, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, +/* 00008B50 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, +/* 00008B60 */ 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x07, 0x01, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x01, +/* 00008B70 */ 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x75, +/* 00008B80 */ 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x08, 0x09, +/* 00008B90 */ 0x2B, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, +/* 00008BA0 */ 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, +/* 00008BB0 */ 0x03, 0x09, 0x02, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x02, 0x00, 0x09, 0x39, 0x00, 0x93, 0x03, 0x1B, +/* 00008BC0 */ 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x28, 0x00, 0x8F, 0x03, +/* 00008BD0 */ 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, +/* 00008BE0 */ 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0B, 0x03, 0x00, +/* 00008BF0 */ 0xEE, 0x04, 0xFF, 0x1B, 0x03, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x0F, +/* 00008C00 */ 0x03, 0x00, 0x1B, 0x09, 0xD3, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, +/* 00008C10 */ 0x14, 0x00, 0x1B, 0x08, 0x09, 0x00, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, +/* 00008C20 */ 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x2B, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, +/* 00008C30 */ 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, +/* 00008C40 */ 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0C, 0x04, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x04, 0x00, +/* 00008C50 */ 0x09, 0x86, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x14, 0x00, 0x1B, +/* 00008C60 */ 0x03, 0x09, 0x00, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, +/* 00008C70 */ 0x1B, 0x02, 0x09, 0x2B, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00008C80 */ 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, +/* 00008C90 */ 0x02, 0x1C, 0x5D, 0x03, 0x0D, 0x05, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x05, 0x00, 0x09, 0x39, 0x00, +/* 00008CA0 */ 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x28, +/* 00008CB0 */ 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, +/* 00008CC0 */ 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, +/* 00008CD0 */ 0x0E, 0x06, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x06, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, +/* 00008CE0 */ 0x1B, 0x03, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x28, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, +/* 00008CF0 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, +/* 00008D00 */ 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0F, 0x07, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x07, +/* 00008D10 */ 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x75, +/* 00008D20 */ 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, +/* 00008D30 */ 0x2B, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, +/* 00008D40 */ 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, +/* 00008D50 */ 0x03, 0x10, 0x08, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x08, 0x00, 0x09, 0x39, 0x00, 0x93, 0x03, 0x1B, +/* 00008D60 */ 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x28, 0x00, 0x8F, 0x03, +/* 00008D70 */ 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, +/* 00008D80 */ 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x11, 0x09, 0x00, +/* 00008D90 */ 0xEE, 0x04, 0xFF, 0x1B, 0x09, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, +/* 00008DA0 */ 0x00, 0x05, 0x8F, 0x03, 0x1C, 0x1C, 0x04, 0x00, 0x5C, 0x01, 0x1C, 0xCE, 0x1C, 0x03, 0x01, 0x00, +/* 00008DB0 */ 0xA1, 0x00, 0x12, 0x1C, 0xA1, 0x01, 0x13, 0x1C, 0xA1, 0x02, 0x14, 0x1C, 0x5C, 0x02, 0x1C, 0xD4, +/* 00008DC0 */ 0x00, 0x1C, 0x5C, 0x03, 0x1C, 0xEE, 0x04, 0xFF, 0x1B, 0x0A, 0x00, 0x8F, 0x03, 0x0B, 0x1B, 0x05, +/* 00008DD0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x01, 0x1C, 0xEE, +/* 00008DE0 */ 0x02, 0x1B, 0x1B, 0x0B, 0x00, 0x11, 0x03, 0x00, 0x1B, 0x15, 0x09, 0x2E, 0x00, 0x8F, 0x03, 0x0C, +/* 00008DF0 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1F, 0x1C, 0x06, 0x00, 0x5C, +/* 00008E00 */ 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x16, 0x0C, 0x00, 0xEE, +/* 00008E10 */ 0x04, 0x1B, 0x1B, 0x0C, 0x00, 0x47, 0x00, 0x1B, 0x09, 0x05, 0x00, 0xA8, 0x1B, 0x47, 0x00, 0x1B, +/* 00008E20 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, +/* 00008E30 */ 0xFE, 0x80, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x39, 0x04, 0xFE, 0xFD, 0x01, 0xFE, 0x5B, 0xF3, 0x1C, +/* 00008E40 */ 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x24, 0x00, 0x10, 0x00, 0x2B, 0x00, 0x22, 0x00, 0x5B, 0x00, +/* 00008E50 */ 0x2B, 0x00, 0x63, 0x00, 0x11, 0x00, 0x3A, 0x00, 0x28, 0x00, 0xA5, 0x00, 0x10, 0x00, 0x28, 0x00, +/* 00008E60 */ 0x11, 0x00, 0x3A, 0x00, 0x2B, 0x00, 0x5E, 0x00, 0x11, 0x00, 0x3A, 0x00, 0x28, 0x00, 0x75, 0x00, +/* 00008E70 */ 0x10, 0x00, 0x29, 0x00, 0x22, 0x00, 0x5A, 0x00, 0x2B, 0x00, 0x5A, 0x00, 0x22, 0x00, 0x57, 0x00, +/* 00008E80 */ 0x2B, 0x00, 0x5F, 0x00, 0x11, 0x00, 0x38, 0x00, 0x28, 0x00, 0x76, 0x00, 0x10, 0x00, 0x27, 0x00, +/* 00008E90 */ 0x28, 0x00, 0x59, 0x00, 0x10, 0x00, 0x30, 0x00, 0x11, 0x00, 0x40, 0x00, 0x2B, 0x00, 0x62, 0x00, +/* 00008EA0 */ 0x11, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x79, 0x00, 0x35, 0x00, 0x3B, 0x01, 0x5A, 0x00, 0x72, 0x00, +/* 00008EB0 */ 0x00, 0xB5, 0x8E, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x31, 0x05, 0x55, +/* 00008EC0 */ 0xA2, 0x41, 0xD1, 0x00, 0x41, 0xFE, 0x46, 0xFB, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 00008ED0 */ 0x46, 0xFB, 0xAC, 0xAC, 0x41, 0x04, 0x03, 0x05, 0x05, 0x10, 0x10, 0x04, 0x01, 0x01, 0x04, 0x04, +/* 00008EE0 */ 0x08, 0x3E, 0x8F, 0x01, 0x03, 0x05, 0x00, 0x00, 0x98, 0x05, 0x05, 0x03, 0x00, 0x00, 0x0F, 0x03, +/* 00008EF0 */ 0x00, 0x05, 0x09, 0x27, 0x00, 0x8F, 0x04, 0x0C, 0x05, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00008F00 */ 0x02, 0x8F, 0x04, 0x1E, 0x06, 0x02, 0x00, 0x5C, 0x01, 0x06, 0x8F, 0x01, 0x02, 0x06, 0x03, 0x00, +/* 00008F10 */ 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0xEE, 0x04, 0xFF, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 00008F20 */ 0xFE, 0x6B, 0xFB, 0x03, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x2C, 0x00, 0x29, 0x00, 0x5A, 0x00, +/* 00008F30 */ 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x09, 0xC4, 0x10, 0xFE, 0xD4, 0x04, 0x0C, 0xA3, 0x41, 0xC1, 0x00, +/* 00008F40 */ 0xFE, 0x1C, 0x04, 0x3F, 0xFE, 0x61, 0xE9, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x61, +/* 00008F50 */ 0xE9, 0xFE, 0x21, 0x09, 0xFE, 0x21, 0x09, 0x01, 0x07, 0x15, 0x1A, 0x05, 0x93, 0x8D, 0x03, 0x08, +/* 00008F60 */ 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x19, 0x07, 0x08, 0x0B, 0x06, 0xFE, 0x15, 0x04, 0x05, 0xFE, +/* 00008F70 */ 0x12, 0x04, 0x0C, 0x05, 0xFE, 0x17, 0x04, 0x06, 0xFE, 0x13, 0x04, 0x06, 0xFE, 0x25, 0x04, 0x06, +/* 00008F80 */ 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x12, 0x03, 0x06, 0xFE, 0x13, 0x03, 0x06, +/* 00008F90 */ 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, +/* 00008FA0 */ 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0xFE, 0x6B, 0x02, 0xA8, 0x1A, 0x14, 0x03, 0x00, 0x15, +/* 00008FB0 */ 0x1A, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x0A, 0x1A, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, +/* 00008FC0 */ 0xCB, 0x1B, 0x5C, 0x01, 0x1B, 0x5D, 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, 0x1A, 0x1A, 0x00, 0x00, +/* 00008FD0 */ 0x47, 0x15, 0x1A, 0x09, 0x20, 0x00, 0x8F, 0x03, 0x31, 0x1B, 0x01, 0x00, 0x6D, 0x1A, 0x1B, 0x00, +/* 00008FE0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, 0xF2, 0x02, 0x1A, 0x1A, 0x00, 0x00, 0x00, +/* 00008FF0 */ 0x00, 0x01, 0x00, 0x47, 0x15, 0x1A, 0x47, 0x18, 0x04, 0x14, 0x0B, 0x00, 0x16, 0x05, 0x09, 0x00, +/* 00009000 */ 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x3B, 0x00, 0x62, 0x1A, 0x15, 0x01, 0xA8, 0x1B, 0x15, +/* 00009010 */ 0x2D, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x02, 0xA8, 0x1B, 0x15, 0x1F, 0x00, +/* 00009020 */ 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x03, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, +/* 00009030 */ 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x04, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, +/* 00009040 */ 0x00, 0x47, 0x18, 0x07, 0x14, 0x0B, 0x00, 0x16, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, +/* 00009050 */ 0x06, 0x09, 0x2D, 0x00, 0x62, 0x1A, 0x15, 0x05, 0xA8, 0x1B, 0x15, 0x1F, 0x00, 0x1A, 0x1B, 0x09, +/* 00009060 */ 0x00, 0x00, 0x62, 0x1A, 0x15, 0x06, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, +/* 00009070 */ 0x62, 0x1A, 0x15, 0x07, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, 0x00, 0x47, 0x18, +/* 00009080 */ 0x07, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xBE, 0x00, 0x14, 0x0B, 0x00, 0x17, 0x05, 0x09, 0x00, 0x00, +/* 00009090 */ 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xAE, 0x00, 0x8F, 0x03, 0x1B, 0x1A, 0x02, 0x00, 0x07, 0x04, +/* 000090A0 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x0A, 0x02, 0x00, 0xCC, 0x00, 0x00, 0x00, +/* 000090B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, +/* 000090C0 */ 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, +/* 000090D0 */ 0x02, 0x00, 0x8F, 0x03, 0x1B, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, +/* 000090E0 */ 0x15, 0x5D, 0x02, 0x10, 0x03, 0x00, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1B, +/* 000090F0 */ 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, +/* 00009100 */ 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x03, 0x00, 0x8F, 0x03, 0x1B, 0x1A, +/* 00009110 */ 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x11, 0x04, 0x00, +/* 00009120 */ 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, +/* 00009130 */ 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, +/* 00009140 */ 0xEE, 0x04, 0xFF, 0x1A, 0x04, 0x00, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xBE, 0x00, 0x14, 0x0B, 0x00, +/* 00009150 */ 0x17, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xAE, 0x00, 0x8F, 0x03, 0x1B, +/* 00009160 */ 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x12, 0x05, +/* 00009170 */ 0x00, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, +/* 00009180 */ 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, +/* 00009190 */ 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x05, 0x00, 0x8F, 0x03, 0x1B, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, +/* 000091A0 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x13, 0x06, 0x00, 0xCC, 0x60, 0x00, 0x00, 0x00, +/* 000091B0 */ 0x04, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, +/* 000091C0 */ 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x06, +/* 000091D0 */ 0x00, 0x8F, 0x03, 0x1B, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, +/* 000091E0 */ 0x5D, 0x02, 0x14, 0x07, 0x00, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1B, 0x00, +/* 000091F0 */ 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, +/* 00009200 */ 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x07, 0x00, 0x47, 0x00, 0x15, 0x09, 0x02, +/* 00009210 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x06, 0x90, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 00009220 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 00009230 */ 0xB4, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00009240 */ 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, +/* 00009250 */ 0x48, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, +/* 00009260 */ 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, +/* 00009270 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, +/* 00009280 */ 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 00009290 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 000092A0 */ 0xB4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 000092B0 */ 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, +/* 000092C0 */ 0xFE, 0x66, 0x03, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x80, 0x02, 0xFE, +/* 000092D0 */ 0x82, 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, +/* 000092E0 */ 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xAB, 0xE9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x31, 0x00, +/* 000092F0 */ 0x22, 0x00, 0x4F, 0x00, 0x20, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x10, 0x00, 0x45, 0x00, +/* 00009300 */ 0x38, 0x00, 0x97, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x45, 0x00, 0x2A, 0x00, 0x7A, 0x00, +/* 00009310 */ 0x03, 0x00, 0x4F, 0x00, 0x17, 0x00, 0x57, 0x00, 0x3A, 0x00, 0xCB, 0x00, 0x3A, 0x00, 0xCC, 0x00, +/* 00009320 */ 0x3A, 0x00, 0xD8, 0x00, 0x17, 0x00, 0x57, 0x00, 0x3A, 0x00, 0xCB, 0x00, 0x3A, 0x00, 0xCD, 0x00, +/* 00009330 */ 0x3A, 0x00, 0xDB, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x5D, 0x8C, 0xE0, 0xA9, 0xD6, 0x92, +/* 00009340 */ 0xFE, 0xC7, 0x03, 0x18, 0xA0, 0x41, 0xD1, 0x00, 0x36, 0xFE, 0xF4, 0xB1, 0x06, 0xFF, 0x00, 0x10, +/* 00009350 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0xF4, 0xB1, 0xFE, 0x78, 0x36, 0xFE, 0x78, 0x36, 0x03, 0x0D, 0x2D, +/* 00009360 */ 0x33, 0x09, 0xC8, 0xC8, 0x01, 0x0E, 0x01, 0x0A, 0x10, 0x10, 0x10, 0x10, 0x07, 0x02, 0x30, 0x31, +/* 00009370 */ 0x32, 0x33, 0x06, 0xFE, 0xD6, 0x03, 0x01, 0x00, 0x06, 0xFE, 0xD7, 0x03, 0x06, 0xFE, 0xD8, 0x03, +/* 00009380 */ 0x01, 0x01, 0x06, 0xFE, 0xD9, 0x03, 0x01, 0x02, 0x06, 0xFE, 0xF1, 0x02, 0x01, 0x03, 0x07, 0x08, +/* 00009390 */ 0x06, 0xFE, 0xDA, 0x03, 0x06, 0xFE, 0xDB, 0x03, 0x06, 0xFE, 0xDC, 0x03, 0x06, 0xFE, 0x10, 0x03, +/* 000093A0 */ 0x06, 0xFE, 0xDD, 0x03, 0x05, 0xFE, 0xDE, 0x03, 0x05, 0xFE, 0xDF, 0x03, 0x05, 0xFE, 0xE0, 0x03, +/* 000093B0 */ 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0B, 0x06, 0xFE, 0x14, +/* 000093C0 */ 0x03, 0x06, 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0xE1, 0x03, 0x05, 0xFE, 0xE2, 0x03, 0x05, 0xFE, 0xE3, +/* 000093D0 */ 0x03, 0x05, 0xFE, 0xE4, 0x03, 0x05, 0xFE, 0xE5, 0x03, 0x05, 0xFE, 0xE6, 0x03, 0x05, 0xFE, 0xE7, +/* 000093E0 */ 0x03, 0x06, 0xFE, 0xE8, 0x03, 0x06, 0xFE, 0xE9, 0x03, 0x05, 0xFE, 0xEA, 0x03, 0x06, 0xFE, 0xB4, +/* 000093F0 */ 0x03, 0x0C, 0x06, 0xFE, 0x13, 0x03, 0x06, 0xFE, 0xB5, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, +/* 00009400 */ 0xEB, 0x03, 0x06, 0xFE, 0xB8, 0x03, 0x05, 0xFE, 0xEC, 0x03, 0xFE, 0x8A, 0x03, 0xA8, 0x2D, 0xA8, +/* 00009410 */ 0x2E, 0xA8, 0x2F, 0x4F, 0x35, 0x96, 0x03, 0x35, 0x4F, 0x35, 0x96, 0x04, 0x35, 0x8F, 0x01, 0x0A, +/* 00009420 */ 0x35, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00009430 */ 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7B, 0x03, 0x36, 0x00, 0x7B, 0x03, 0x36, 0x01, 0x7B, 0x06, +/* 00009440 */ 0x36, 0x02, 0x7B, 0x08, 0x36, 0x03, 0x7B, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x0B, +/* 00009450 */ 0x00, 0x00, 0xEE, 0x03, 0x35, 0x35, 0x00, 0x00, 0x96, 0x03, 0x35, 0x8F, 0x01, 0x0A, 0x35, 0x00, +/* 00009460 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x1C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +/* 00009470 */ 0x36, 0x00, 0x00, 0x00, 0x7B, 0x03, 0x36, 0x00, 0x7B, 0x03, 0x36, 0x05, 0x7B, 0x06, 0x36, 0x06, +/* 00009480 */ 0x7B, 0x08, 0x36, 0x07, 0x7B, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x0B, 0x01, 0x00, +/* 00009490 */ 0xEE, 0x03, 0x35, 0x35, 0x01, 0x00, 0x96, 0x04, 0x35, 0x8F, 0x01, 0x38, 0x35, 0x01, 0x00, 0x14, +/* 000094A0 */ 0x11, 0x00, 0x35, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x38, 0x35, 0x01, 0x00, 0x14, 0x03, 0x00, +/* 000094B0 */ 0x35, 0x11, 0x09, 0xD9, 0x02, 0xDE, 0x00, 0x03, 0x02, 0xB8, 0x35, 0x00, 0x01, 0x51, 0x01, 0x00, +/* 000094C0 */ 0x2D, 0x35, 0x95, 0x00, 0x02, 0x2D, 0x8F, 0x01, 0x09, 0x36, 0x02, 0x00, 0x6D, 0x35, 0x36, 0x08, +/* 000094D0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x36, 0x8F, 0x01, 0x2A, 0x37, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 000094E0 */ 0x00, 0x0C, 0x5D, 0x01, 0x12, 0x03, 0x00, 0xB8, 0x39, 0x00, 0x01, 0x51, 0x01, 0x01, 0x38, 0x39, +/* 000094F0 */ 0x5C, 0x02, 0x38, 0xEE, 0x03, 0x37, 0x37, 0x03, 0x00, 0x5C, 0x01, 0x37, 0x8F, 0x01, 0x3B, 0x37, +/* 00009500 */ 0x04, 0x00, 0x4B, 0x37, 0x62, 0x37, 0x37, 0x09, 0x5C, 0x02, 0x37, 0xF2, 0x03, 0xFF, 0x35, 0x08, +/* 00009510 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x38, 0x35, 0x01, 0x00, 0x14, 0x03, 0x00, 0x35, 0x10, +/* 00009520 */ 0x09, 0x6B, 0x02, 0xDE, 0x01, 0x04, 0x03, 0xB8, 0x35, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x35, +/* 00009530 */ 0x35, 0x01, 0x51, 0x01, 0x02, 0x2E, 0x35, 0x95, 0x01, 0x02, 0x2E, 0x01, 0x51, 0x01, 0x03, 0x2F, +/* 00009540 */ 0x35, 0x95, 0x01, 0x03, 0x2F, 0x8F, 0x01, 0x2A, 0x35, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00009550 */ 0x0C, 0x5D, 0x01, 0x13, 0x04, 0x00, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x5C, 0x02, 0x36, 0xEE, +/* 00009560 */ 0x03, 0xFF, 0x35, 0x04, 0x00, 0x8F, 0x01, 0x2A, 0x35, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00009570 */ 0x0C, 0x5D, 0x01, 0x14, 0x05, 0x00, 0x91, 0x01, 0x03, 0x36, 0x06, 0x00, 0x5C, 0x02, 0x36, 0xEE, +/* 00009580 */ 0x03, 0xFF, 0x35, 0x05, 0x00, 0x8F, 0x01, 0x1B, 0x35, 0x07, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00009590 */ 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x15, 0x06, 0x00, 0xCC, +/* 000095A0 */ 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x48, 0x37, +/* 000095B0 */ 0x08, 0x00, 0x4B, 0x37, 0x7B, 0x37, 0x36, 0x0A, 0x7B, 0x18, 0x36, 0x0B, 0x7B, 0x18, 0x36, 0x0C, +/* 000095C0 */ 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x06, 0x00, 0xCE, 0x35, 0x0B, 0x00, 0x00, 0xA1, 0x00, +/* 000095D0 */ 0x1A, 0x35, 0xA1, 0x01, 0x1B, 0x35, 0xA1, 0x02, 0x1C, 0x35, 0xA1, 0x03, 0x1D, 0x35, 0xA1, 0x04, +/* 000095E0 */ 0x1E, 0x35, 0xA1, 0x05, 0x1F, 0x35, 0xA1, 0x06, 0x20, 0x35, 0xA1, 0x07, 0x21, 0x35, 0xA1, 0x08, +/* 000095F0 */ 0x22, 0x35, 0xA1, 0x09, 0x23, 0x35, 0xA1, 0x0A, 0x24, 0x35, 0x96, 0x02, 0x35, 0x8F, 0x01, 0x1B, +/* 00009600 */ 0x35, 0x07, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x5C, +/* 00009610 */ 0x01, 0x36, 0x5D, 0x02, 0x25, 0x07, 0x00, 0xCC, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +/* 00009620 */ 0x36, 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x37, 0x05, 0x00, 0x07, 0x01, 0x00, 0xC3, 0x01, 0x37, +/* 00009630 */ 0x37, 0x08, 0x00, 0x7B, 0x37, 0x36, 0x0A, 0x7B, 0x26, 0x36, 0x0B, 0x7B, 0x26, 0x36, 0x0D, 0x7B, +/* 00009640 */ 0x26, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x07, 0x00, 0x8F, 0x01, 0x0A, 0x35, +/* 00009650 */ 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x62, 0x36, +/* 00009660 */ 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x8F, 0x01, 0x0E, 0x36, 0x09, 0x00, 0x62, 0x36, 0x36, 0x0E, 0x5C, +/* 00009670 */ 0x02, 0x36, 0xEE, 0x03, 0xFF, 0x35, 0x09, 0x00, 0x8F, 0x01, 0x1B, 0x35, 0x07, 0x00, 0x07, 0x04, +/* 00009680 */ 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x62, 0x36, 0x36, 0x0E, 0x5C, 0x01, +/* 00009690 */ 0x36, 0x5D, 0x02, 0x28, 0x0A, 0x00, 0xCC, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, +/* 000096A0 */ 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x37, 0x05, 0x00, 0x7B, 0x37, 0x36, 0x0A, 0x7B, 0x18, 0x36, +/* 000096B0 */ 0x0B, 0x7B, 0x26, 0x36, 0x0D, 0x7B, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, +/* 000096C0 */ 0x0A, 0x00, 0x8F, 0x01, 0x1B, 0x35, 0x07, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, +/* 000096D0 */ 0x02, 0x36, 0x05, 0x00, 0x62, 0x36, 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x29, 0x0B, 0x00, +/* 000096E0 */ 0xCC, 0x7C, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xB8, 0x38, 0x00, +/* 000096F0 */ 0xB7, 0x01, 0x00, 0x00, 0x00, 0x38, 0x38, 0x01, 0x51, 0x01, 0x04, 0x37, 0x38, 0x7B, 0x37, 0x36, +/* 00009700 */ 0x0A, 0x01, 0x65, 0x01, 0x37, 0x36, 0x7B, 0x18, 0x36, 0x0B, 0x7B, 0x26, 0x36, 0x0D, 0x7B, 0x18, +/* 00009710 */ 0x36, 0x0C, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x0B, 0x00, 0x8F, 0x01, 0x1B, 0x35, 0x07, +/* 00009720 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x62, 0x36, 0x36, +/* 00009730 */ 0x0E, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x2A, 0x0C, 0x00, 0xCC, 0x94, 0x00, 0x00, 0x00, 0x06, 0x00, +/* 00009740 */ 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x2A, 0x37, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00009750 */ 0x00, 0x0C, 0x5D, 0x01, 0x2C, 0x0D, 0x00, 0xB8, 0x39, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x39, +/* 00009760 */ 0x39, 0x01, 0x51, 0x01, 0x05, 0x38, 0x39, 0x5C, 0x02, 0x38, 0xEE, 0x03, 0x37, 0x37, 0x0D, 0x00, +/* 00009770 */ 0x7B, 0x37, 0x36, 0x0F, 0x7B, 0x26, 0x36, 0x0D, 0x7B, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0xEE, +/* 00009780 */ 0x04, 0xFF, 0x35, 0x0C, 0x00, 0x91, 0x01, 0x02, 0x00, 0x05, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, +/* 00009790 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x07, 0xA8, 0x00, 0x94, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 000097A0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 000097B0 */ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 000097C0 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x64, 0x00, +/* 000097D0 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 000097E0 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 000097F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00009800 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, +/* 00009810 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x1C, 0x00, +/* 00009820 */ 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xDA, 0x03, +/* 00009830 */ 0x00, 0x00, 0xDB, 0x03, 0x00, 0x00, 0xDC, 0x03, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x00, 0x00, +/* 00009840 */ 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xD7, 0x03, +/* 00009850 */ 0x00, 0x00, 0xD8, 0x03, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0xFE, 0xD6, +/* 00009860 */ 0x03, 0xFE, 0xD7, 0x03, 0xFE, 0xD8, 0x03, 0xFE, 0xD9, 0x03, 0xFE, 0xF1, 0x02, 0xFE, 0xDA, 0x03, +/* 00009870 */ 0xFE, 0xDB, 0x03, 0xFE, 0xDC, 0x03, 0xFE, 0x34, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xB6, 0x01, 0xFE, +/* 00009880 */ 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0x48, 0x01, 0xFE, 0xB7, 0x01, 0xFE, 0xFD, +/* 00009890 */ 0x01, 0xFE, 0xED, 0x03, 0xFE, 0xEE, 0x03, 0x02, 0x02, 0x01, 0x00, 0xFE, 0xEF, 0x03, 0x03, 0x02, +/* 000098A0 */ 0x00, 0xFE, 0x1C, 0x02, 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x59, 0xB2, 0x11, 0x10, 0x00, 0x00, 0x00, +/* 000098B0 */ 0x3E, 0x00, 0x94, 0x01, 0x3E, 0x00, 0x0B, 0x02, 0x2D, 0x00, 0x0A, 0x1C, 0x4F, 0x00, 0xD7, 0x02, +/* 000098C0 */ 0x30, 0x00, 0x5A, 0x04, 0x20, 0x00, 0x3B, 0x03, 0x20, 0x00, 0x52, 0x00, 0x44, 0x00, 0x9B, 0x00, +/* 000098D0 */ 0x34, 0x00, 0x1F, 0x01, 0x4F, 0x00, 0x99, 0x00, 0x2C, 0x00, 0x48, 0x00, 0x4A, 0x00, 0x9E, 0x00, +/* 000098E0 */ 0x59, 0x00, 0xC2, 0x04, 0x6A, 0x00, 0x16, 0x03, 0x09, 0x00, 0x84, 0x00, 0x07, 0x00, 0x16, 0x00, +/* 000098F0 */ 0x00, 0x0A, 0xA1, 0x00, 0x00, 0x97, 0x9F, 0x00, 0x00, 0x88, 0x9D, 0x00, 0x00, 0x12, 0x9C, 0x00, +/* 00009900 */ 0x00, 0x0D, 0x9A, 0x00, 0x00, 0x09, 0x99, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, +/* 00009910 */ 0xFE, 0xBB, 0x04, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x3D, 0xFE, 0x2D, 0xE5, 0xFF, 0x00, 0x10, 0x01, +/* 00009920 */ 0x00, 0x01, 0x01, 0xFE, 0x2D, 0xE5, 0xFE, 0x56, 0x02, 0xFE, 0x56, 0x02, 0x01, 0x05, 0x05, 0x08, +/* 00009930 */ 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, +/* 00009940 */ 0xFE, 0xF7, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x98, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, +/* 00009950 */ 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, +/* 00009960 */ 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, +/* 00009970 */ 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x09, +/* 00009980 */ 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0xF2, +/* 00009990 */ 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, +/* 000099A0 */ 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, 0x02, 0x0F, 0x27, 0x00, 0x08, 0x09, 0x00, +/* 000099B0 */ 0x00, 0x8F, 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 000099C0 */ 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, +/* 000099D0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 000099E0 */ 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x53, 0xE5, 0x07, +/* 000099F0 */ 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x84, 0x00, 0x20, 0x00, 0x4B, 0x00, +/* 00009A00 */ 0x15, 0x00, 0x69, 0x00, 0x24, 0x00, 0x84, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0x3F, 0x5D, 0x84, +/* 00009A10 */ 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0xA5, 0x04, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x3B, +/* 00009A20 */ 0xFE, 0x56, 0xE0, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x56, 0xE0, 0xFE, 0x08, +/* 00009A30 */ 0x04, 0xFE, 0x08, 0x04, 0x02, 0x06, 0x07, 0x0B, 0x05, 0x40, 0x40, 0x04, 0x06, 0x07, 0x03, 0x03, +/* 00009A40 */ 0x03, 0x03, 0x08, 0x09, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xF8, 0x03, 0x06, 0xFE, 0x15, +/* 00009A50 */ 0x03, 0x07, 0x08, 0xFE, 0x06, 0x01, 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x2C, 0x0B, 0x07, 0x15, 0x03, +/* 00009A60 */ 0x00, 0x0B, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, +/* 00009A70 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, +/* 00009A80 */ 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, +/* 00009A90 */ 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, +/* 00009AA0 */ 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x96, 0x02, 0x0B, 0x93, 0x02, 0x0B, 0x01, 0x00, 0xA8, +/* 00009AB0 */ 0x0C, 0x14, 0x13, 0x00, 0x0B, 0x0C, 0x09, 0x00, 0x00, 0x93, 0x02, 0x0B, 0x01, 0x00, 0x62, 0x0B, +/* 00009AC0 */ 0x0B, 0x02, 0x0F, 0x27, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, +/* 00009AD0 */ 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, +/* 00009AE0 */ 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x04, 0x0A, +/* 00009AF0 */ 0x0B, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, +/* 00009B00 */ 0x05, 0x03, 0x00, 0xEE, 0x03, 0x0B, 0x0B, 0x03, 0x00, 0x96, 0x03, 0x0B, 0x8F, 0x04, 0x0C, 0x0B, +/* 00009B10 */ 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x04, 0x1C, 0x0C, 0x04, 0x00, 0x5C, 0x01, +/* 00009B20 */ 0x0C, 0x8F, 0x03, 0x02, 0x0C, 0x05, 0x00, 0x5C, 0x02, 0x0C, 0xD4, 0x00, 0x0C, 0x5C, 0x03, 0x0C, +/* 00009B30 */ 0xEE, 0x04, 0xFF, 0x0B, 0x04, 0x00, 0x8F, 0x04, 0x0A, 0x0B, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00009B40 */ 0x00, 0x06, 0x93, 0x03, 0x0C, 0x06, 0x00, 0x5C, 0x01, 0x0C, 0xCB, 0x0C, 0x5C, 0x02, 0x0C, 0xEE, +/* 00009B50 */ 0x03, 0x00, 0x0B, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, +/* 00009B60 */ 0x35, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0xF9, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x8B, 0xE0, 0x09, 0x05, +/* 00009B70 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x8C, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x1F, +/* 00009B80 */ 0x00, 0x69, 0x00, 0x24, 0x00, 0x8D, 0x00, 0x1F, 0x00, 0x47, 0x00, 0x2A, 0x00, 0x44, 0x01, 0x24, +/* 00009B90 */ 0x00, 0x3E, 0x00, 0x00, 0x98, 0x9B, 0x00, 0x00, 0xBF, 0x4C, 0x83, 0x00, 0x00, 0xC4, 0x00, 0xFE, +/* 00009BA0 */ 0xB0, 0x04, 0x48, 0xA2, 0x41, 0xD1, 0x00, 0x3C, 0xFE, 0x0B, 0xE3, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00009BB0 */ 0x02, 0x02, 0xFE, 0x0B, 0xE3, 0xF8, 0xF8, 0x41, 0x05, 0x04, 0x06, 0x0D, 0x0D, 0x05, 0x01, 0x01, +/* 00009BC0 */ 0x02, 0x05, 0x05, 0xFE, 0xFA, 0x03, 0x06, 0xFE, 0x72, 0x03, 0x36, 0x8F, 0x01, 0x02, 0x06, 0x00, +/* 00009BD0 */ 0x00, 0x2F, 0x07, 0x02, 0x04, 0x2D, 0x06, 0x06, 0x07, 0x15, 0x03, 0x00, 0x06, 0x03, 0x09, 0x1C, +/* 00009BE0 */ 0x00, 0x8F, 0x01, 0x03, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x02, 0x07, 0x00, 0x00, 0x2F, 0x08, 0x02, +/* 00009BF0 */ 0x04, 0x98, 0x07, 0x07, 0x08, 0x00, 0x00, 0x9D, 0x07, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, +/* 00009C00 */ 0x00, 0xFE, 0x3B, 0xE3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x5A, 0x00, 0x1E, 0x00, 0x6D, +/* 00009C10 */ 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x89, 0x04, 0x10, 0xA3, 0x41, 0xC1, +/* 00009C20 */ 0x00, 0xFE, 0xEB, 0x03, 0x3A, 0xFE, 0x7A, 0xD9, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 00009C30 */ 0x7A, 0xD9, 0xFE, 0xE3, 0x02, 0xFE, 0xE3, 0x02, 0x01, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, +/* 00009C40 */ 0x06, 0x03, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xF7, 0x03, 0x06, +/* 00009C50 */ 0xFE, 0x15, 0x03, 0x01, 0x00, 0x08, 0xFD, 0x5B, 0x08, 0xB4, 0x08, 0x08, 0x8F, 0x04, 0x31, 0x0C, +/* 00009C60 */ 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, +/* 00009C70 */ 0x02, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0x0B, 0x2C, 0x0B, 0x08, 0x15, +/* 00009C80 */ 0x03, 0x00, 0x0B, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, +/* 00009C90 */ 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x01, 0x00, 0x5D, 0x02, 0x04, 0x01, +/* 00009CA0 */ 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x01, +/* 00009CB0 */ 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, +/* 00009CC0 */ 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, +/* 00009CD0 */ 0x09, 0x0B, 0x09, 0x00, 0x00, 0x62, 0x0B, 0x09, 0x03, 0x0F, 0x27, 0x00, 0x0B, 0x09, 0x00, 0x00, +/* 00009CE0 */ 0x8F, 0x04, 0x09, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, +/* 00009CF0 */ 0x5D, 0x01, 0x03, 0x03, 0x00, 0x5D, 0x02, 0x04, 0x03, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x01, 0x00, +/* 00009D00 */ 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x11, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, +/* 00009D10 */ 0x8F, 0x04, 0x09, 0x0D, 0x01, 0x00, 0x6D, 0x0C, 0x0D, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0D, +/* 00009D20 */ 0x2A, 0x0E, 0x05, 0x14, 0x03, 0x00, 0x07, 0x0E, 0x09, 0x06, 0x00, 0x47, 0x0E, 0x05, 0x09, 0x03, +/* 00009D30 */ 0x00, 0x47, 0x0E, 0x07, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x09, 0xF2, 0x03, 0x0C, 0x0C, 0x04, 0x00, +/* 00009D40 */ 0x00, 0x00, 0x05, 0x00, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x04, 0x00, 0x09, 0x02, 0x00, +/* 00009D50 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5E, 0x02, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, 0x02, +/* 00009D60 */ 0xFE, 0x2F, 0x02, 0xFE, 0xA3, 0xD9, 0x08, 0x05, 0x00, 0x00, 0x00, 0x20, 0x00, 0x2F, 0x00, 0x0B, +/* 00009D70 */ 0x00, 0x38, 0x00, 0x24, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x47, 0x00, 0x15, 0x00, 0x65, 0x00, 0x24, +/* 00009D80 */ 0x00, 0xD4, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, +/* 00009D90 */ 0x6D, 0x04, 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x15, 0x03, 0x39, 0xFE, 0x04, 0xD5, 0xFF, 0x00, +/* 00009DA0 */ 0x10, 0x01, 0x00, 0x03, 0x01, 0xFE, 0x04, 0xD5, 0xFE, 0x1E, 0x04, 0xFE, 0x1E, 0x04, 0x01, 0x09, +/* 00009DB0 */ 0x05, 0x0B, 0x05, 0x62, 0x5B, 0x04, 0x09, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, +/* 00009DC0 */ 0x15, 0x03, 0x07, 0xFE, 0x79, 0x01, 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, +/* 00009DD0 */ 0x05, 0x00, 0x05, 0x02, 0xA8, 0x0B, 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, +/* 00009DE0 */ 0x47, 0x06, 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x6B, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, +/* 00009DF0 */ 0x07, 0x0B, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x1A, 0x00, 0x8F, +/* 00009E00 */ 0x01, 0x02, 0x0B, 0x00, 0x00, 0x4B, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, +/* 00009E10 */ 0xC3, 0x03, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x24, 0x01, 0x8F, 0x04, 0x31, 0x0C, 0x01, 0x00, 0x6D, +/* 00009E20 */ 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, +/* 00009E30 */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x08, 0x0B, 0x8F, 0x04, 0x17, 0x0B, 0x02, 0x00, 0x07, +/* 00009E40 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0xEE, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x0F, 0x22, +/* 00009E50 */ 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, +/* 00009E60 */ 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0B, 0x01, 0x00, +/* 00009E70 */ 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, +/* 00009E80 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x04, +/* 00009E90 */ 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x3F, 0x00, 0x8F, 0x04, +/* 00009EA0 */ 0x0A, 0x0B, 0x04, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, +/* 00009EB0 */ 0x02, 0x04, 0x05, 0x00, 0xEE, 0x03, 0x0B, 0x0B, 0x05, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x04, 0x09, +/* 00009EC0 */ 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, +/* 00009ED0 */ 0x5C, 0x02, 0x09, 0xF2, 0x03, 0xFF, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x8F, 0x02, 0x02, +/* 00009EE0 */ 0x0B, 0x05, 0x00, 0x4B, 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, +/* 00009EF0 */ 0x05, 0x5C, 0x03, 0x06, 0xEE, 0x04, 0xFF, 0x0B, 0x07, 0x00, 0x47, 0x0B, 0x09, 0x8F, 0x04, 0x0C, +/* 00009F00 */ 0x0C, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x04, 0x20, 0x0D, 0x07, 0x00, 0x5C, +/* 00009F10 */ 0x01, 0x0D, 0x8F, 0x01, 0x03, 0x0D, 0x08, 0x00, 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, +/* 00009F20 */ 0xEE, 0x04, 0x0C, 0x0C, 0x08, 0x00, 0x77, 0x0C, 0x0B, 0x04, 0x62, 0x0B, 0x09, 0x05, 0x82, 0x0B, +/* 00009F30 */ 0x0B, 0x2B, 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 00009F40 */ 0x66, 0x03, 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x7A, +/* 00009F50 */ 0x02, 0xDD, 0xFE, 0x1A, 0xD5, 0x10, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, +/* 00009F60 */ 0x2B, 0x00, 0x18, 0x00, 0x43, 0x00, 0x1A, 0x00, 0x56, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, +/* 00009F70 */ 0x38, 0x00, 0x1F, 0x00, 0x9B, 0x00, 0x20, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x1F, 0x00, +/* 00009F80 */ 0x3F, 0x00, 0x20, 0x00, 0x58, 0x00, 0x1D, 0x00, 0x4D, 0x00, 0x30, 0x00, 0x65, 0x00, 0x0B, 0x00, +/* 00009F90 */ 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x03, 0xC4, 0x00, 0xFE, 0x5F, +/* 00009FA0 */ 0x04, 0x62, 0xA0, 0x41, 0xF1, 0x00, 0x38, 0xFE, 0x58, 0xD2, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, +/* 00009FB0 */ 0x01, 0xFE, 0x58, 0xD2, 0xFE, 0x44, 0x02, 0xFE, 0x44, 0x02, 0x03, 0x09, 0x09, 0x0E, 0x07, 0x40, +/* 00009FC0 */ 0x3C, 0x03, 0x02, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0x0D, 0x07, 0x06, 0xFE, 0x6E, 0x03, +/* 00009FD0 */ 0x05, 0xFE, 0xDE, 0x03, 0x06, 0xFE, 0xDD, 0x03, 0x08, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x00, 0x01, +/* 00009FE0 */ 0xAE, 0x0B, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x2C, 0x0E, 0x09, 0x15, 0x03, 0x00, 0x0E, 0x03, 0x09, +/* 00009FF0 */ 0x36, 0x00, 0x8F, 0x03, 0x10, 0x0E, 0x00, 0x00, 0xE1, 0x0E, 0x09, 0x0E, 0x00, 0x0F, 0x27, 0x00, +/* 0000A000 */ 0x0E, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x0F, 0x01, 0x00, 0x6D, 0x0E, 0x0F, 0x00, 0x07, 0x03, +/* 0000A010 */ 0x00, 0x5C, 0x00, 0x0F, 0x5D, 0x01, 0x04, 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, +/* 0000A020 */ 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x0A, 0x0E, 0x02, 0x00, 0x07, 0x03, +/* 0000A030 */ 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5D, 0x02, 0x02, 0x01, 0x00, 0xEE, 0x03, +/* 0000A040 */ 0x0E, 0x0E, 0x01, 0x00, 0x47, 0x0A, 0x0E, 0x8F, 0x01, 0x02, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x07, +/* 0000A050 */ 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0A, 0x98, 0x0F, 0x0B, 0x07, 0x00, 0x00, 0x5C, 0x02, +/* 0000A060 */ 0x0F, 0x98, 0x0F, 0x0B, 0x08, 0x01, 0x00, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0xFF, 0x0E, 0x02, 0x00, +/* 0000A070 */ 0x8F, 0x03, 0x31, 0x0F, 0x04, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, +/* 0000A080 */ 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0C, 0x0E, +/* 0000A090 */ 0x8F, 0x03, 0x11, 0x0E, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x09, 0x10, +/* 0000A0A0 */ 0x01, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x2A, 0x11, 0x07, 0x14, +/* 0000A0B0 */ 0x03, 0x00, 0x0C, 0x11, 0x09, 0x06, 0x00, 0x47, 0x11, 0x07, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0C, +/* 0000A0C0 */ 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0xF2, 0x03, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, +/* 0000A0D0 */ 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x00, 0x0E, 0x04, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000A0E0 */ 0xFE, 0x69, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x2F, 0x02, 0xFE, 0x76, 0xD2, 0x07, 0x07, 0x00, 0x00, +/* 0000A0F0 */ 0x00, 0x1D, 0x00, 0x53, 0x00, 0x24, 0x00, 0x70, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x29, 0x00, 0x52, +/* 0000A100 */ 0x00, 0x20, 0x00, 0x85, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x00, 0xBF, 0x5C, 0x8C, 0xE0, 0x21, 0xD4, +/* 0000A110 */ 0x00, 0xFE, 0xD9, 0x03, 0x0C, 0xB3, 0x41, 0xC1, 0x00, 0xFE, 0xEF, 0x03, 0x37, 0xFE, 0x38, 0xB6, +/* 0000A120 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x38, 0xB6, 0xFE, 0xBC, 0x1B, 0xFE, 0xBC, 0x1B, +/* 0000A130 */ 0x45, 0x18, 0x23, 0x37, 0x07, 0xFE, 0x9B, 0x01, 0xFE, 0x7B, 0x01, 0x03, 0x22, 0x04, 0x12, 0x26, +/* 0000A140 */ 0x26, 0x26, 0x26, 0x01, 0x36, 0x37, 0x06, 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, 0x08, 0x06, +/* 0000A150 */ 0xFE, 0x15, 0x03, 0x0B, 0x06, 0xFE, 0x72, 0x03, 0x07, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, +/* 0000A160 */ 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x05, 0xFE, 0xE2, 0x03, 0x05, 0xFE, 0xF0, +/* 0000A170 */ 0x03, 0x05, 0xFE, 0xF1, 0x03, 0x05, 0xFE, 0xE3, 0x03, 0x05, 0xFE, 0xE4, 0x03, 0x05, 0xFE, 0xF2, +/* 0000A180 */ 0x03, 0x06, 0xFE, 0xF3, 0x03, 0x06, 0xFE, 0xF8, 0x02, 0x05, 0xFE, 0xE5, 0x03, 0x01, 0x01, 0x01, +/* 0000A190 */ 0x15, 0x06, 0xFE, 0xE8, 0x03, 0x06, 0xFE, 0xE9, 0x03, 0x05, 0xFE, 0xEA, 0x03, 0x06, 0xFE, 0x6C, +/* 0000A1A0 */ 0x03, 0x05, 0xFE, 0xF4, 0x03, 0x05, 0xFE, 0xE6, 0x03, 0x01, 0x00, 0x01, 0x14, 0x01, 0x03, 0x05, +/* 0000A1B0 */ 0xFE, 0xE7, 0x03, 0x05, 0xFE, 0xF5, 0x03, 0xFE, 0x79, 0x06, 0x2C, 0x38, 0x23, 0x0D, 0x03, 0x00, +/* 0000A1C0 */ 0x38, 0x02, 0x09, 0x1A, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x00, 0x07, +/* 0000A1D0 */ 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF2, 0x01, 0xFF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, +/* 0000A1E0 */ 0x03, 0x0C, 0x38, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x19, 0x39, 0x02, +/* 0000A1F0 */ 0x00, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x23, 0x5D, 0x03, 0x03, 0x01, 0x00, 0xEE, 0x04, 0x38, 0x38, +/* 0000A200 */ 0x01, 0x00, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x2F, 0x00, 0x62, 0x38, 0x23, 0x01, 0x0F, 0x03, 0x00, +/* 0000A210 */ 0x38, 0x09, 0x24, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x02, 0x07, 0x03, +/* 0000A220 */ 0x00, 0x5C, 0x00, 0x39, 0x5D, 0x01, 0x05, 0x02, 0x00, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, +/* 0000A230 */ 0xFF, 0x38, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x77, 0x06, 0x23, 0x03, 0x2C, 0x38, 0x25, 0x14, +/* 0000A240 */ 0x03, 0x00, 0x38, 0x07, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x0A, 0x38, 0x03, 0x00, 0x07, 0x03, 0x00, +/* 0000A250 */ 0x5C, 0x00, 0x04, 0xCB, 0x39, 0x5C, 0x01, 0x39, 0x5D, 0x02, 0x08, 0x03, 0x00, 0xEE, 0x03, 0x38, +/* 0000A260 */ 0x38, 0x03, 0x00, 0x47, 0x25, 0x38, 0x09, 0x20, 0x00, 0x8F, 0x03, 0x31, 0x39, 0x04, 0x00, 0x6D, +/* 0000A270 */ 0x38, 0x39, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x25, 0xF2, 0x02, 0x38, 0x38, +/* 0000A280 */ 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x25, 0x38, 0x8F, 0x03, 0x02, 0x38, 0x05, 0x00, 0x07, +/* 0000A290 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x09, 0x05, 0x00, 0x5D, 0x03, 0x0A, +/* 0000A2A0 */ 0x05, 0x00, 0xCE, 0x39, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x39, 0xA1, 0x01, 0x0C, 0x39, 0x5C, +/* 0000A2B0 */ 0x04, 0x39, 0x5D, 0x05, 0x0C, 0x05, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x05, 0x00, 0x47, 0x28, 0x38, +/* 0000A2C0 */ 0x8F, 0x03, 0x02, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, +/* 0000A2D0 */ 0x02, 0x0D, 0x06, 0x00, 0x5D, 0x03, 0x0A, 0x06, 0x00, 0xCE, 0x39, 0x03, 0x01, 0x00, 0xA1, 0x00, +/* 0000A2E0 */ 0x0E, 0x39, 0xA1, 0x01, 0x0F, 0x39, 0xA1, 0x02, 0x10, 0x39, 0x5C, 0x04, 0x39, 0x5D, 0x05, 0x0E, +/* 0000A2F0 */ 0x06, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x06, 0x00, 0x47, 0x29, 0x38, 0x8F, 0x02, 0x03, 0x38, 0x06, +/* 0000A300 */ 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x05, 0x47, 0x2A, 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, 0x09, +/* 0000A310 */ 0x12, 0x00, 0x8F, 0x02, 0x03, 0x38, 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x06, 0x47, 0x2A, +/* 0000A320 */ 0x38, 0x09, 0x17, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x0F, 0x00, 0x8F, 0x02, 0x03, 0x38, +/* 0000A330 */ 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x07, 0x47, 0x2A, 0x38, 0x8F, 0x03, 0x02, 0x38, 0x05, +/* 0000A340 */ 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x10, 0x07, 0x00, 0x5D, +/* 0000A350 */ 0x03, 0x0A, 0x07, 0x00, 0xA8, 0x39, 0x5C, 0x04, 0x39, 0xA8, 0x39, 0x5C, 0x05, 0x39, 0xEE, 0x06, +/* 0000A360 */ 0x38, 0x38, 0x07, 0x00, 0x47, 0x2B, 0x38, 0x8F, 0x03, 0x02, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, +/* 0000A370 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x11, 0x08, 0x00, 0x5D, 0x03, 0x0A, 0x08, 0x00, +/* 0000A380 */ 0xCE, 0x39, 0x03, 0x02, 0x00, 0xA1, 0x00, 0x12, 0x39, 0xA1, 0x01, 0x13, 0x39, 0xA1, 0x02, 0x14, +/* 0000A390 */ 0x39, 0x5C, 0x04, 0x39, 0x5D, 0x05, 0x13, 0x08, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x08, 0x00, 0x47, +/* 0000A3A0 */ 0x2C, 0x38, 0xA8, 0x38, 0x47, 0x2D, 0x38, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, +/* 0000A3B0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x15, 0x09, 0x00, 0x5D, 0x03, 0x16, 0x09, 0x00, +/* 0000A3C0 */ 0x5D, 0x04, 0x17, 0x09, 0x00, 0x5D, 0x05, 0x16, 0x09, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x09, 0x00, +/* 0000A3D0 */ 0x47, 0x2E, 0x38, 0xA8, 0x38, 0x47, 0x2F, 0x38, 0xA8, 0x38, 0x47, 0x30, 0x38, 0xA8, 0x38, 0x47, +/* 0000A3E0 */ 0x31, 0x38, 0x62, 0x38, 0x25, 0x08, 0x47, 0x32, 0x38, 0x62, 0x38, 0x25, 0x09, 0x47, 0x33, 0x38, +/* 0000A3F0 */ 0x2C, 0x38, 0x32, 0x15, 0x0E, 0x00, 0x38, 0x07, 0x09, 0x00, 0x00, 0x2C, 0x38, 0x33, 0x15, 0x03, +/* 0000A400 */ 0x00, 0x38, 0x07, 0x09, 0x56, 0x00, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, +/* 0000A410 */ 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x18, 0x0A, 0x00, 0x5D, 0x03, 0x16, 0x0A, 0x00, 0x5D, +/* 0000A420 */ 0x04, 0x17, 0x0A, 0x00, 0x5D, 0x05, 0x16, 0x0A, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x0A, 0x00, 0x47, +/* 0000A430 */ 0x32, 0x38, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 0000A440 */ 0x25, 0x5D, 0x02, 0x19, 0x0B, 0x00, 0x5C, 0x03, 0x32, 0x5D, 0x04, 0x17, 0x0B, 0x00, 0x5D, 0x05, +/* 0000A450 */ 0x17, 0x0B, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x0B, 0x00, 0x47, 0x33, 0x38, 0x8F, 0x03, 0x02, 0x38, +/* 0000A460 */ 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x1A, 0x0C, 0x00, +/* 0000A470 */ 0x5D, 0x03, 0x1B, 0x0C, 0x00, 0xA8, 0x39, 0x5C, 0x04, 0x39, 0x5D, 0x05, 0x06, 0x0C, 0x00, 0xEE, +/* 0000A480 */ 0x06, 0x38, 0x38, 0x0C, 0x00, 0x47, 0x34, 0x38, 0x8F, 0x03, 0x07, 0x38, 0x08, 0x00, 0x07, 0x02, +/* 0000A490 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0xEE, 0x02, 0x38, 0x38, 0x0D, 0x00, 0x47, 0x24, 0x38, +/* 0000A4A0 */ 0x8F, 0x03, 0x2F, 0x38, 0x09, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0x5C, +/* 0000A4B0 */ 0x02, 0x28, 0xCE, 0x39, 0x01, 0x03, 0x00, 0xA1, 0x00, 0x1C, 0x39, 0x5C, 0x03, 0x39, 0x8F, 0x03, +/* 0000A4C0 */ 0x30, 0x39, 0x0A, 0x00, 0x5C, 0x04, 0x39, 0xEE, 0x05, 0x38, 0x38, 0x0E, 0x00, 0x47, 0x35, 0x38, +/* 0000A4D0 */ 0x2C, 0x38, 0x2B, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x4E, 0x00, 0x8F, 0x03, 0x06, 0x38, 0x0B, +/* 0000A4E0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xEE, 0x02, 0x38, 0x38, 0x0F, 0x00, +/* 0000A4F0 */ 0x0F, 0x35, 0x00, 0x38, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, +/* 0000A500 */ 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8F, 0x03, 0x11, 0x3A, 0x0C, 0x00, 0x07, 0x02, 0x00, +/* 0000A510 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xEE, 0x02, 0x3A, 0x3A, 0x11, 0x00, 0x5C, 0x01, 0x3A, 0xF2, +/* 0000A520 */ 0x02, 0xFF, 0x38, 0x0A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x08, +/* 0000A530 */ 0x01, 0x2C, 0x38, 0x2B, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x1A, 0x00, 0x8F, 0x03, 0x09, 0x39, +/* 0000A540 */ 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF2, 0x01, 0xFF, 0x38, +/* 0000A550 */ 0x0B, 0x00, 0x00, 0x00, 0x12, 0x00, 0x8F, 0x03, 0x0C, 0x38, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 0000A560 */ 0x00, 0x04, 0x8F, 0x03, 0x25, 0x39, 0x0D, 0x00, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x2B, 0xEE, 0x03, +/* 0000A570 */ 0x38, 0x38, 0x13, 0x00, 0x47, 0x2B, 0x38, 0xE5, 0x24, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, +/* 0000A580 */ 0x6D, 0x38, 0x39, 0x0C, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2B, 0xF2, 0x02, 0x38, +/* 0000A590 */ 0x38, 0x0C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x47, 0x2D, 0x38, 0xE9, 0x09, 0x4B, 0x00, 0xE7, 0x26, +/* 0000A5A0 */ 0x06, 0x8F, 0x03, 0x29, 0x38, 0x0E, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, +/* 0000A5B0 */ 0xEE, 0x02, 0xFF, 0x38, 0x15, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0A, +/* 0000A5C0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8F, 0x03, 0x11, 0x3A, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 0000A5D0 */ 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xEE, 0x02, 0x3A, 0x3A, 0x17, 0x00, 0x5C, 0x01, 0x3A, 0xF2, 0x02, +/* 0000A5E0 */ 0xFF, 0x38, 0x0A, 0x00, 0x00, 0x00, 0x16, 0x00, 0xE9, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, +/* 0000A5F0 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x1D, 0x18, 0x00, 0x5D, 0x03, 0x1E, +/* 0000A600 */ 0x18, 0x00, 0x5D, 0x04, 0x1F, 0x18, 0x00, 0x5C, 0x05, 0x2D, 0xEE, 0x06, 0x38, 0x38, 0x18, 0x00, +/* 0000A610 */ 0x47, 0x2F, 0x38, 0x8F, 0x03, 0x15, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, +/* 0000A620 */ 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2D, 0x5C, 0x02, 0x2F, 0xF2, 0x03, 0x38, 0x38, 0x0D, 0x00, 0x00, +/* 0000A630 */ 0x00, 0x19, 0x00, 0x47, 0x31, 0x38, 0x09, 0x8B, 0x00, 0xA8, 0x38, 0x47, 0x2B, 0x38, 0xA8, 0x38, +/* 0000A640 */ 0x47, 0x2C, 0x38, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 0000A650 */ 0x01, 0x25, 0x5D, 0x02, 0x1D, 0x1A, 0x00, 0x5D, 0x03, 0x1E, 0x1A, 0x00, 0x5D, 0x04, 0x1F, 0x1A, +/* 0000A660 */ 0x00, 0x5D, 0x05, 0x1E, 0x1A, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x1A, 0x00, 0x47, 0x2F, 0x38, 0x14, +/* 0000A670 */ 0x03, 0x00, 0x29, 0x0F, 0x09, 0x28, 0x00, 0x8F, 0x03, 0x15, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, +/* 0000A680 */ 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5D, 0x02, 0x1E, 0x1B, 0x00, 0xF2, +/* 0000A690 */ 0x03, 0x38, 0x38, 0x0D, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x47, 0x31, 0x38, 0x09, 0x25, 0x00, 0x8F, +/* 0000A6A0 */ 0x03, 0x15, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, +/* 0000A6B0 */ 0x01, 0x2F, 0x5D, 0x02, 0x20, 0x1C, 0x00, 0xF2, 0x03, 0x38, 0x38, 0x0D, 0x00, 0x00, 0x00, 0x1C, +/* 0000A6C0 */ 0x00, 0x47, 0x31, 0x38, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 0000A6D0 */ 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x21, 0x1D, 0x00, 0x5C, 0x03, 0x2F, 0x5D, 0x04, 0x1F, 0x1D, 0x00, +/* 0000A6E0 */ 0x5C, 0x05, 0x31, 0xEE, 0x06, 0x38, 0x38, 0x1D, 0x00, 0x47, 0x30, 0x38, 0x77, 0x28, 0x23, 0x0E, +/* 0000A6F0 */ 0x62, 0x38, 0x35, 0x0F, 0x77, 0x38, 0x23, 0x10, 0x77, 0x29, 0x23, 0x11, 0xA8, 0x38, 0x15, 0x03, +/* 0000A700 */ 0x00, 0x2B, 0x38, 0x09, 0x04, 0x00, 0x77, 0x2B, 0x23, 0x12, 0xA8, 0x38, 0x15, 0x03, 0x00, 0x2C, +/* 0000A710 */ 0x38, 0x09, 0x62, 0x00, 0x77, 0x2C, 0x23, 0x13, 0x8F, 0x02, 0x04, 0x38, 0x10, 0x00, 0x4B, 0x38, +/* 0000A720 */ 0x62, 0x38, 0x38, 0x14, 0x77, 0x38, 0x23, 0x15, 0x14, 0x03, 0x00, 0x2C, 0x13, 0x09, 0x13, 0x00, +/* 0000A730 */ 0x8F, 0x02, 0x04, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x16, 0x77, 0x38, 0x23, 0x15, +/* 0000A740 */ 0x09, 0x33, 0x00, 0x14, 0x03, 0x00, 0x2C, 0x12, 0x09, 0x13, 0x00, 0x8F, 0x02, 0x04, 0x38, 0x10, +/* 0000A750 */ 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x17, 0x77, 0x38, 0x23, 0x15, 0x09, 0x18, 0x00, 0x14, 0x03, +/* 0000A760 */ 0x00, 0x2C, 0x14, 0x09, 0x10, 0x00, 0x8F, 0x02, 0x04, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, +/* 0000A770 */ 0x38, 0x18, 0x77, 0x38, 0x23, 0x15, 0x77, 0x2E, 0x23, 0x19, 0x77, 0x2F, 0x23, 0x1A, 0x77, 0x30, +/* 0000A780 */ 0x23, 0x1B, 0xA8, 0x38, 0x15, 0x03, 0x00, 0x33, 0x38, 0x09, 0x08, 0x00, 0x77, 0x32, 0x23, 0x1C, +/* 0000A790 */ 0x77, 0x33, 0x23, 0x1D, 0x77, 0x2A, 0x23, 0x1E, 0x77, 0x34, 0x23, 0x1F, 0xE5, 0x21, 0x00, 0x8F, +/* 0000A7A0 */ 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x20, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, +/* 0000A7B0 */ 0x01, 0x23, 0xF2, 0x02, 0xFF, 0x38, 0x20, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xE9, 0x09, 0x33, 0x00, +/* 0000A7C0 */ 0xE7, 0x27, 0x06, 0x8F, 0x03, 0x29, 0x38, 0x0E, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 0000A7D0 */ 0x01, 0x27, 0xEE, 0x02, 0xFF, 0x38, 0x1F, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, +/* 0000A7E0 */ 0x39, 0x21, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF2, 0x01, 0xFF, 0x38, 0x21, 0x00, 0x00, 0x00, +/* 0000A7F0 */ 0x20, 0x00, 0xE9, 0x62, 0x38, 0x23, 0x22, 0x0F, 0x07, 0x00, 0x38, 0x09, 0x00, 0x00, 0x77, 0x22, +/* 0000A800 */ 0x23, 0x23, 0x47, 0x38, 0x23, 0x8F, 0x03, 0x0C, 0x39, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000A810 */ 0x04, 0x8F, 0x03, 0x24, 0x3A, 0x11, 0x00, 0x5C, 0x01, 0x3A, 0x62, 0x3A, 0x23, 0x22, 0x5C, 0x02, +/* 0000A820 */ 0x3A, 0xEE, 0x03, 0x39, 0x39, 0x21, 0x00, 0x77, 0x39, 0x38, 0x24, 0x77, 0x06, 0x23, 0x25, 0xA8, +/* 0000A830 */ 0x00, 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, +/* 0000A840 */ 0x66, 0x03, 0xFE, 0xD7, 0x03, 0xFE, 0xD8, 0x03, 0xFE, 0xD9, 0x03, 0xFE, 0x10, 0x02, 0xFE, 0x11, +/* 0000A850 */ 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x32, 0x02, 0xFE, 0x21, 0x01, 0xFE, 0xF6, 0x03, +/* 0000A860 */ 0xFE, 0x21, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x16, 0x02, 0xFE, 0x17, 0x02, 0xFE, +/* 0000A870 */ 0xD6, 0x03, 0xFE, 0x18, 0x02, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, 0xFE, 0xDC, 0x03, 0xFE, 0x0D, +/* 0000A880 */ 0x02, 0xFE, 0x0B, 0x02, 0xFE, 0x0C, 0x02, 0xFE, 0x0E, 0x02, 0xFE, 0x0F, 0x02, 0xFE, 0x15, 0x02, +/* 0000A890 */ 0xFE, 0x13, 0x02, 0xFE, 0x30, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x14, 0x02, 0xFE, +/* 0000A8A0 */ 0x14, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0x8D, 0xB6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, +/* 0000A8B0 */ 0x00, 0x1A, 0x00, 0x3F, 0x00, 0x35, 0x00, 0x9B, 0x00, 0x24, 0x00, 0x6D, 0x00, 0x04, 0x00, 0x61, +/* 0000A8C0 */ 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x4F, 0x00, 0x20, 0x00, 0x49, 0x00, 0x37, 0x00, 0x71, +/* 0000A8D0 */ 0x00, 0x3B, 0x00, 0x73, 0x00, 0x0F, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x12, 0x00, 0x43, +/* 0000A8E0 */ 0x00, 0x08, 0x00, 0x30, 0x00, 0x0F, 0x00, 0x50, 0x00, 0x2C, 0x00, 0x5F, 0x00, 0x3B, 0x00, 0x7D, +/* 0000A8F0 */ 0x00, 0x05, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x67, 0x00, 0x05, 0x00, 0x37, 0x00, 0x05, 0x00, 0x37, +/* 0000A900 */ 0x00, 0x05, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x51, 0x00, 0x07, 0x00, 0x52, 0x00, 0x16, 0x00, 0x7E, +/* 0000A910 */ 0x00, 0x2C, 0x00, 0x6F, 0x00, 0x2A, 0x00, 0x96, 0x00, 0x2C, 0x00, 0x9A, 0x00, 0x18, 0x00, 0x41, +/* 0000A920 */ 0x00, 0x30, 0x00, 0xA2, 0x00, 0x27, 0x00, 0x62, 0x00, 0x32, 0x00, 0x58, 0x00, 0x08, 0x00, 0x30, +/* 0000A930 */ 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x1A, 0x00, 0x4F, 0x00, 0x24, 0x00, 0x74, 0x00, 0x26, 0x00, 0x4A, +/* 0000A940 */ 0x00, 0x01, 0x00, 0x24, 0x00, 0x15, 0x00, 0x2E, 0x00, 0x33, 0x00, 0x5F, 0x00, 0x2A, 0x00, 0x76, +/* 0000A950 */ 0x00, 0x26, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x2A, 0x00, 0x05, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x69, +/* 0000A960 */ 0x00, 0x08, 0x00, 0x33, 0x00, 0x28, 0x00, 0x78, 0x00, 0x25, 0x00, 0x7B, 0x00, 0x28, 0x00, 0xC6, +/* 0000A970 */ 0x00, 0x04, 0x00, 0x38, 0x00, 0x08, 0x00, 0x43, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x0A, 0x00, 0x32, +/* 0000A980 */ 0x00, 0x04, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x04, 0x00, 0x46, 0x00, 0x10, 0x00, 0x5F, +/* 0000A990 */ 0x00, 0x08, 0x00, 0x3C, 0x00, 0x13, 0x00, 0x65, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x13, 0x00, 0x63, +/* 0000A9A0 */ 0x00, 0x08, 0x00, 0x3A, 0x00, 0x10, 0x00, 0x81, 0x00, 0x04, 0x00, 0x4C, 0x00, 0x04, 0x00, 0x4E, +/* 0000A9B0 */ 0x00, 0x04, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x04, 0x00, 0x58, 0x00, 0x04, 0x00, 0x67, +/* 0000A9C0 */ 0x00, 0x04, 0x00, 0x40, 0x00, 0x07, 0x00, 0xA9, 0x00, 0x23, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x20, +/* 0000A9D0 */ 0x00, 0x15, 0x00, 0x6B, 0x01, 0x1B, 0x00, 0x4A, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x70, +/* 0000A9E0 */ 0x00, 0x29, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x00, 0x3F, 0x5C, 0x84, 0xE0, 0x29, 0xD4, +/* 0000A9F0 */ 0x92, 0xFE, 0xE4, 0x02, 0x14, 0xA0, 0x41, 0xD1, 0x00, 0x2E, 0xFE, 0x07, 0x83, 0x06, 0xFF, 0x00, +/* 0000AA00 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x07, 0x83, 0xFE, 0x95, 0x2E, 0xFE, 0x95, 0x2E, 0x0B, 0x16, +/* 0000AA10 */ 0x1A, 0x09, 0x9D, 0x9D, 0x01, 0x0C, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x05, 0x02, 0x19, 0x1A, 0x06, +/* 0000AA20 */ 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xB0, 0x03, 0x05, 0xFE, 0xB1, 0x03, 0x08, 0x05, 0xFE, 0xB2, 0x03, +/* 0000AA30 */ 0x05, 0xFE, 0xB3, 0x03, 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, +/* 0000AA40 */ 0x0B, 0x06, 0xFE, 0x14, 0x03, 0x07, 0x06, 0xFE, 0xB4, 0x03, 0x0C, 0x06, 0xFE, 0x13, 0x03, 0x06, +/* 0000AA50 */ 0xFE, 0xB5, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, 0xB7, 0x03, 0x06, 0xFE, 0xB8, 0x03, 0x05, +/* 0000AA60 */ 0xFE, 0xB9, 0x03, 0xFE, 0xD0, 0x02, 0xA8, 0x16, 0xA8, 0x17, 0xA8, 0x18, 0x8F, 0x01, 0x38, 0x1C, +/* 0000AA70 */ 0x00, 0x00, 0x14, 0x11, 0x00, 0x1C, 0x02, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x38, 0x1C, 0x00, 0x00, +/* 0000AA80 */ 0x14, 0x03, 0x00, 0x1C, 0x03, 0x09, 0xA5, 0x02, 0xDE, 0x00, 0x03, 0x01, 0xB8, 0x1C, 0x00, 0x01, +/* 0000AA90 */ 0x51, 0x01, 0x00, 0x16, 0x1C, 0x95, 0x00, 0x02, 0x16, 0x8F, 0x01, 0x09, 0x1D, 0x01, 0x00, 0x6D, +/* 0000AAA0 */ 0x1C, 0x1D, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x8F, 0x01, 0x2A, 0x1E, 0x02, 0x00, 0x07, +/* 0000AAB0 */ 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x04, 0x01, 0x00, 0xB8, 0x20, 0x00, 0x01, 0x51, 0x01, +/* 0000AAC0 */ 0x01, 0x1F, 0x20, 0x5C, 0x02, 0x1F, 0xEE, 0x03, 0x1E, 0x1E, 0x01, 0x00, 0x5C, 0x01, 0x1E, 0x8F, +/* 0000AAD0 */ 0x01, 0x3B, 0x1E, 0x03, 0x00, 0x4B, 0x1E, 0x62, 0x1E, 0x1E, 0x01, 0x5C, 0x02, 0x1E, 0xF2, 0x03, +/* 0000AAE0 */ 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x38, 0x1C, 0x00, 0x00, 0x14, 0x03, +/* 0000AAF0 */ 0x00, 0x1C, 0x02, 0x09, 0x37, 0x02, 0xDE, 0x01, 0x04, 0x02, 0xB8, 0x1C, 0x00, 0xB7, 0x01, 0x00, +/* 0000AB00 */ 0x00, 0x00, 0x1C, 0x1C, 0x01, 0x51, 0x01, 0x02, 0x17, 0x1C, 0x95, 0x01, 0x02, 0x17, 0x01, 0x51, +/* 0000AB10 */ 0x01, 0x03, 0x18, 0x1C, 0x95, 0x01, 0x03, 0x18, 0x8F, 0x01, 0x2A, 0x1C, 0x02, 0x00, 0x07, 0x03, +/* 0000AB20 */ 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x06, 0x02, 0x00, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x5C, +/* 0000AB30 */ 0x02, 0x1D, 0xEE, 0x03, 0xFF, 0x1C, 0x02, 0x00, 0x8F, 0x01, 0x2A, 0x1C, 0x02, 0x00, 0x07, 0x03, +/* 0000AB40 */ 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x07, 0x03, 0x00, 0x91, 0x01, 0x03, 0x1D, 0x05, 0x00, 0x5C, +/* 0000AB50 */ 0x02, 0x1D, 0xEE, 0x03, 0xFF, 0x1C, 0x03, 0x00, 0x8F, 0x01, 0x1B, 0x1C, 0x06, 0x00, 0x07, 0x04, +/* 0000AB60 */ 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x5C, 0x01, 0x1D, 0x5D, 0x02, 0x08, +/* 0000AB70 */ 0x04, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x8F, +/* 0000AB80 */ 0x01, 0x46, 0x1E, 0x07, 0x00, 0x4B, 0x1E, 0x7B, 0x1E, 0x1D, 0x02, 0x7B, 0x0B, 0x1D, 0x03, 0x7B, +/* 0000AB90 */ 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, 0xFF, 0x1C, 0x04, 0x00, 0x8F, 0x01, 0x1B, 0x1C, +/* 0000ABA0 */ 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x5C, 0x01, +/* 0000ABB0 */ 0x1D, 0x5D, 0x02, 0x0E, 0x05, 0x00, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1D, +/* 0000ABC0 */ 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x1E, 0x04, 0x00, 0x07, 0x01, 0x00, 0xC3, 0x01, 0x1E, 0x1E, +/* 0000ABD0 */ 0x06, 0x00, 0x7B, 0x1E, 0x1D, 0x02, 0x7B, 0x0F, 0x1D, 0x03, 0x7B, 0x0F, 0x1D, 0x05, 0x7B, 0x0F, +/* 0000ABE0 */ 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, 0xFF, 0x1C, 0x05, 0x00, 0x8F, 0x01, 0x0A, 0x1C, 0x08, +/* 0000ABF0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x62, 0x1D, 0x1D, +/* 0000AC00 */ 0x06, 0x5C, 0x01, 0x1D, 0x8F, 0x01, 0x0E, 0x1D, 0x09, 0x00, 0x62, 0x1D, 0x1D, 0x06, 0x5C, 0x02, +/* 0000AC10 */ 0x1D, 0xEE, 0x03, 0xFF, 0x1C, 0x07, 0x00, 0x8F, 0x01, 0x1B, 0x1C, 0x06, 0x00, 0x07, 0x04, 0x00, +/* 0000AC20 */ 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x62, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, +/* 0000AC30 */ 0x5D, 0x02, 0x11, 0x08, 0x00, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, +/* 0000AC40 */ 0x00, 0x00, 0x91, 0x01, 0x02, 0x1E, 0x04, 0x00, 0x7B, 0x1E, 0x1D, 0x02, 0x7B, 0x0B, 0x1D, 0x03, +/* 0000AC50 */ 0x7B, 0x0F, 0x1D, 0x05, 0x7B, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, 0xFF, 0x1C, 0x08, +/* 0000AC60 */ 0x00, 0x8F, 0x01, 0x1B, 0x1C, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, +/* 0000AC70 */ 0x1D, 0x04, 0x00, 0x62, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x5D, 0x02, 0x12, 0x09, 0x00, 0xCC, +/* 0000AC80 */ 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0xB8, 0x1F, 0x00, 0xB7, +/* 0000AC90 */ 0x01, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x01, 0x51, 0x01, 0x04, 0x1E, 0x1F, 0x7B, 0x1E, 0x1D, 0x02, +/* 0000ACA0 */ 0x01, 0x65, 0x01, 0x1E, 0x1D, 0x7B, 0x0B, 0x1D, 0x03, 0x7B, 0x0F, 0x1D, 0x05, 0x7B, 0x0B, 0x1D, +/* 0000ACB0 */ 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, 0xFF, 0x1C, 0x09, 0x00, 0x8F, 0x01, 0x1B, 0x1C, 0x06, 0x00, +/* 0000ACC0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x62, 0x1D, 0x1D, 0x06, +/* 0000ACD0 */ 0x5C, 0x01, 0x1D, 0x5D, 0x02, 0x13, 0x0A, 0x00, 0xCC, 0x5C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +/* 0000ACE0 */ 0x00, 0x1D, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x2A, 0x1E, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000ACF0 */ 0x05, 0x5D, 0x01, 0x15, 0x0B, 0x00, 0xB8, 0x20, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x20, 0x20, +/* 0000AD00 */ 0x01, 0x51, 0x01, 0x05, 0x1F, 0x20, 0x5C, 0x02, 0x1F, 0xEE, 0x03, 0x1E, 0x1E, 0x0B, 0x00, 0x7B, +/* 0000AD10 */ 0x1E, 0x1D, 0x07, 0x7B, 0x0F, 0x1D, 0x05, 0x7B, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, +/* 0000AD20 */ 0xFF, 0x1C, 0x0A, 0x00, 0x91, 0x01, 0x02, 0x00, 0x04, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, +/* 0000AD30 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x05, 0x70, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, +/* 0000AD40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, +/* 0000AD50 */ 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 0000AD60 */ 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, +/* 0000AD70 */ 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, +/* 0000AD80 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, +/* 0000AD90 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, +/* 0000ADA0 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000ADB0 */ 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0x34, 0x02, +/* 0000ADC0 */ 0xFE, 0xF0, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, +/* 0000ADD0 */ 0x48, 0x01, 0xFE, 0xB7, 0x01, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xBA, 0x03, 0x02, 0x02, 0x00, 0xFE, +/* 0000ADE0 */ 0x1B, 0x02, 0x01, 0xFE, 0x20, 0x02, 0xFE, 0x1E, 0x83, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x2D, 0x00, +/* 0000ADF0 */ 0x14, 0x17, 0x4F, 0x00, 0x21, 0x04, 0x30, 0x00, 0x7A, 0x04, 0x20, 0x00, 0x43, 0x03, 0x20, 0x00, +/* 0000AE00 */ 0x50, 0x00, 0x44, 0x00, 0x93, 0x00, 0x4F, 0x00, 0x91, 0x00, 0x2C, 0x00, 0x45, 0x00, 0x4A, 0x00, +/* 0000AE10 */ 0x96, 0x00, 0x59, 0x00, 0xA7, 0x05, 0x6A, 0x00, 0x03, 0x03, 0x09, 0x00, 0x7C, 0x00, 0x07, 0x00, +/* 0000AE20 */ 0x16, 0x00, 0x00, 0x5F, 0xB6, 0x00, 0x00, 0xA1, 0xB4, 0x00, 0x00, 0x92, 0xB2, 0x00, 0x00, 0xF7, +/* 0000AE30 */ 0xB0, 0x00, 0x00, 0x3F, 0xAF, 0x00, 0x00, 0x3B, 0xAE, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, +/* 0000AE40 */ 0xC4, 0x00, 0xFE, 0xB1, 0x03, 0x3A, 0xA0, 0x41, 0xD1, 0x00, 0x35, 0xFE, 0x76, 0xAE, 0xFF, 0x00, +/* 0000AE50 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x76, 0xAE, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x05, +/* 0000AE60 */ 0x05, 0x08, 0x04, 0x25, 0x24, 0x03, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0x07, 0x06, 0xFE, 0x9A, +/* 0000AE70 */ 0x03, 0x05, 0xFE, 0xD4, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x98, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, +/* 0000AE80 */ 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x03, 0x09, 0x09, 0x00, 0x00, +/* 0000AE90 */ 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, +/* 0000AEA0 */ 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, +/* 0000AEB0 */ 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, +/* 0000AEC0 */ 0x05, 0xF2, 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, 0x08, +/* 0000AED0 */ 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, 0x02, 0x0F, 0x27, 0x00, 0x08, +/* 0000AEE0 */ 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, +/* 0000AEF0 */ 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, +/* 0000AF00 */ 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000AF10 */ 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x79, 0x02, 0xFE, 0x9C, +/* 0000AF20 */ 0xAE, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x7D, 0x00, 0x20, 0x00, +/* 0000AF30 */ 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x24, 0x00, 0x7D, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, +/* 0000AF40 */ 0x5C, 0x84, 0xE0, 0x09, 0xC4, 0x10, 0xFE, 0x9B, 0x03, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, +/* 0000AF50 */ 0x03, 0x34, 0xFE, 0xB8, 0xA8, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xB8, 0xA8, 0xFE, +/* 0000AF60 */ 0xF1, 0x04, 0xFE, 0xF1, 0x04, 0x01, 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, 0x03, 0x03, 0x01, 0x11, +/* 0000AF70 */ 0x11, 0x11, 0x11, 0x01, 0x0F, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xD5, 0x03, 0x06, 0xFE, 0x11, +/* 0000AF80 */ 0x03, 0x06, 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0xBC, 0x03, 0x06, 0xFE, 0xBF, 0x03, 0x06, 0xFE, 0xC4, +/* 0000AF90 */ 0x03, 0x06, 0xFE, 0xCE, 0x03, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0xC5, 0x03, 0x07, 0xD9, 0x5B, +/* 0000AFA0 */ 0x0D, 0xB4, 0x0D, 0x0D, 0x2C, 0x10, 0x0D, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0x24, 0x00, 0x8F, +/* 0000AFB0 */ 0x03, 0x09, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, +/* 0000AFC0 */ 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, +/* 0000AFD0 */ 0x00, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x02, 0x00, +/* 0000AFE0 */ 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +/* 0000AFF0 */ 0x47, 0x0E, 0x10, 0xA8, 0x10, 0x14, 0x0E, 0x00, 0x0E, 0x10, 0x09, 0x00, 0x00, 0x62, 0x10, 0x0E, +/* 0000B000 */ 0x02, 0x0F, 0x27, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x11, 0x00, 0x00, 0x6D, 0x10, +/* 0000B010 */ 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, +/* 0000B020 */ 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xCC, 0x00, 0x00, 0x00, +/* 0000B030 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x10, 0x0E, 0x03, 0x7B, 0x10, 0x00, +/* 0000B040 */ 0x04, 0x62, 0x10, 0x0E, 0x05, 0x7B, 0x10, 0x00, 0x06, 0x62, 0x10, 0x0E, 0x07, 0x7B, 0x10, 0x00, +/* 0000B050 */ 0x08, 0x62, 0x10, 0x0E, 0x09, 0x7B, 0x10, 0x00, 0x0A, 0x62, 0x10, 0x0E, 0x0B, 0x7B, 0x10, 0x00, +/* 0000B060 */ 0x0C, 0x62, 0x10, 0x0E, 0x0D, 0x7B, 0x10, 0x00, 0x0E, 0x62, 0x10, 0x0E, 0x0F, 0x7B, 0x10, 0x00, +/* 0000B070 */ 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0000B080 */ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0xBC, 0x03, 0x00, 0x00, 0x22, +/* 0000B090 */ 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0xCE, 0x03, 0x00, 0x00, 0x23, 0x02, 0x00, 0x00, 0xC5, +/* 0000B0A0 */ 0x03, 0x00, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x19, 0x02, 0xFE, +/* 0000B0B0 */ 0x21, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0xBC, 0x03, 0xFE, 0x73, 0x02, 0xFE, 0x22, 0x02, 0xFE, 0x74, +/* 0000B0C0 */ 0x02, 0xFE, 0x24, 0x02, 0xFE, 0x77, 0x02, 0xFE, 0xCE, 0x03, 0xFE, 0x76, 0x02, 0xFE, 0x23, 0x02, +/* 0000B0D0 */ 0xFE, 0x75, 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0xED, 0xA8, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, +/* 0000B0E0 */ 0x3C, 0x00, 0x24, 0x00, 0x84, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x24, 0x00, +/* 0000B0F0 */ 0x85, 0x00, 0x4A, 0x00, 0xC6, 0x02, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x82, +/* 0000B100 */ 0x03, 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0xB7, 0x03, 0x33, 0xFE, 0x0C, 0xA3, 0xFF, 0x00, 0x10, +/* 0000B110 */ 0x01, 0x00, 0x03, 0x03, 0xFE, 0x0C, 0xA3, 0xFE, 0xF3, 0x02, 0xFE, 0xF3, 0x02, 0x01, 0x09, 0x06, +/* 0000B120 */ 0x0B, 0x0B, 0x44, 0x41, 0x03, 0x07, 0x03, 0x08, 0x08, 0x08, 0x08, 0x0A, 0x06, 0xFE, 0x9A, 0x03, +/* 0000B130 */ 0x05, 0xFE, 0xD4, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x08, 0xFE, 0x15, 0x01, 0x5B, 0x08, 0xB4, 0x08, +/* 0000B140 */ 0x08, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x03, 0x09, 0x0C, +/* 0000B150 */ 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x00, +/* 0000B160 */ 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000B170 */ 0x8F, 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, +/* 0000B180 */ 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x09, 0x0B, +/* 0000B190 */ 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x62, 0x0B, 0x09, 0x02, 0x0F, 0x27, +/* 0000B1A0 */ 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, +/* 0000B1B0 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, +/* 0000B1C0 */ 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x03, 0x11, 0x0B, 0x01, 0x00, 0x07, +/* 0000B1D0 */ 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x47, 0x06, +/* 0000B1E0 */ 0x0B, 0x8F, 0x03, 0x11, 0x0B, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x07, +/* 0000B1F0 */ 0xEE, 0x02, 0x0B, 0x0B, 0x04, 0x00, 0x47, 0x07, 0x0B, 0x8F, 0x03, 0x10, 0x0B, 0x02, 0x00, 0x07, +/* 0000B200 */ 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x09, 0x0D, 0x00, 0x00, 0x6D, 0x0C, 0x0D, 0x03, 0x07, +/* 0000B210 */ 0x07, 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x07, 0x62, 0x0E, 0x09, 0x04, 0x5C, +/* 0000B220 */ 0x03, 0x0E, 0x62, 0x0E, 0x09, 0x05, 0x5C, 0x04, 0x0E, 0x62, 0x0E, 0x09, 0x06, 0x5C, 0x05, 0x0E, +/* 0000B230 */ 0x62, 0x0E, 0x09, 0x07, 0x5C, 0x06, 0x0E, 0xF2, 0x07, 0x0C, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x06, +/* 0000B240 */ 0x00, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000B250 */ 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x2A, 0x02, 0xFE, 0x71, 0x02, +/* 0000B260 */ 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x39, 0xA3, 0x09, 0x05, 0x00, 0x00, +/* 0000B270 */ 0x00, 0x0B, 0x00, 0x38, 0x00, 0x24, 0x00, 0x75, 0x00, 0x20, 0x00, 0x47, 0x00, 0x15, 0x00, 0x61, +/* 0000B280 */ 0x00, 0x24, 0x00, 0x75, 0x00, 0x18, 0x00, 0x23, 0x00, 0x18, 0x00, 0x24, 0x00, 0x56, 0x00, 0xB4, +/* 0000B290 */ 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x67, 0x03, 0x10, 0xA3, 0x41, 0xC1, +/* 0000B2A0 */ 0x00, 0xFE, 0x11, 0x03, 0x32, 0xFE, 0x7F, 0x9E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFE, +/* 0000B2B0 */ 0x7F, 0x9E, 0xFE, 0x3D, 0x04, 0xFE, 0x3D, 0x04, 0x01, 0x09, 0x05, 0x0B, 0x05, 0x62, 0x5B, 0x03, +/* 0000B2C0 */ 0x09, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x11, 0x03, 0x07, 0xFE, 0x79, 0x01, +/* 0000B2D0 */ 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, 0x05, 0x02, 0xA8, 0x0B, +/* 0000B2E0 */ 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, 0x0B, 0x4F, 0x08, 0x4F, +/* 0000B2F0 */ 0x09, 0x6B, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, 0x09, 0x00, 0x00, 0xA8, +/* 0000B300 */ 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x1A, 0x00, 0x8F, 0x01, 0x02, 0x0B, 0x00, 0x00, 0x4B, +/* 0000B310 */ 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC3, 0x03, 0x00, 0x0B, 0x00, 0x00, +/* 0000B320 */ 0x09, 0x24, 0x01, 0x8F, 0x03, 0x31, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, +/* 0000B330 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +/* 0000B340 */ 0x47, 0x08, 0x0B, 0x8F, 0x03, 0x17, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, +/* 0000B350 */ 0x01, 0x08, 0xEE, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x0F, 0x22, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, +/* 0000B360 */ 0x03, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5D, +/* 0000B370 */ 0x01, 0x03, 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x03, +/* 0000B380 */ 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, +/* 0000B390 */ 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, +/* 0000B3A0 */ 0x14, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x3F, 0x00, 0x8F, 0x03, 0x0A, 0x0B, 0x04, 0x00, 0x07, 0x03, +/* 0000B3B0 */ 0x00, 0x5C, 0x00, 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x04, 0x05, 0x00, 0xEE, 0x03, +/* 0000B3C0 */ 0x0B, 0x0B, 0x05, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x03, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, +/* 0000B3D0 */ 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xF2, 0x03, 0xFF, +/* 0000B3E0 */ 0x0B, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x8F, 0x02, 0x02, 0x0B, 0x05, 0x00, 0x4B, 0x0B, 0x07, +/* 0000B3F0 */ 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, 0xEE, 0x04, +/* 0000B400 */ 0xFF, 0x0B, 0x07, 0x00, 0x47, 0x0B, 0x09, 0x8F, 0x03, 0x0C, 0x0C, 0x06, 0x00, 0x07, 0x04, 0x00, +/* 0000B410 */ 0x5C, 0x00, 0x02, 0x8F, 0x03, 0x20, 0x0D, 0x07, 0x00, 0x5C, 0x01, 0x0D, 0x8F, 0x01, 0x03, 0x0D, +/* 0000B420 */ 0x08, 0x00, 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, 0xEE, 0x04, 0x0C, 0x0C, 0x08, 0x00, +/* 0000B430 */ 0x77, 0x0C, 0x0B, 0x04, 0x62, 0x0B, 0x09, 0x05, 0x82, 0x0B, 0x0B, 0x2B, 0x01, 0xFA, 0x0B, 0x47, +/* 0000B440 */ 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x68, 0x02, 0xFE, +/* 0000B450 */ 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x79, 0x02, 0xFE, 0x79, 0x02, 0xDD, 0xFE, 0x91, 0x9E, 0x10, +/* 0000B460 */ 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x18, 0x00, 0x43, 0x00, +/* 0000B470 */ 0x1A, 0x00, 0x52, 0x00, 0x20, 0x00, 0x37, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x97, 0x00, +/* 0000B480 */ 0x20, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x58, 0x00, +/* 0000B490 */ 0x1D, 0x00, 0x76, 0x00, 0x30, 0x00, 0x68, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, +/* 0000B4A0 */ 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x55, 0x03, 0x61, 0xA0, 0x41, 0xF1, 0x00, +/* 0000B4B0 */ 0x31, 0xFE, 0x87, 0x9A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x87, 0x9A, 0xFE, 0x90, +/* 0000B4C0 */ 0x03, 0xFE, 0x90, 0x03, 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4E, 0x4A, 0x02, 0x03, 0x08, 0x05, 0x07, +/* 0000B4D0 */ 0x07, 0x07, 0x07, 0x0D, 0x07, 0x01, 0x00, 0x05, 0xFE, 0xB1, 0x03, 0x08, 0x01, 0x01, 0x01, 0x02, +/* 0000B4E0 */ 0xFE, 0x36, 0x01, 0xAE, 0x08, 0x5B, 0x0A, 0xB4, 0x0A, 0x0A, 0x98, 0x0E, 0x08, 0x03, 0x00, 0x00, +/* 0000B4F0 */ 0x47, 0x09, 0x0E, 0xA8, 0x0E, 0x14, 0x0B, 0x00, 0x0A, 0x0E, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, +/* 0000B500 */ 0x0A, 0x02, 0x09, 0x22, 0x00, 0x8F, 0x02, 0x09, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x00, 0x07, +/* 0000B510 */ 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xF2, 0x02, 0xFF, 0x0E, 0x00, 0x00, +/* 0000B520 */ 0x00, 0x00, 0x00, 0x00, 0x09, 0x22, 0x00, 0x14, 0x03, 0x00, 0x09, 0x02, 0x09, 0x1A, 0x00, 0x8F, +/* 0000B530 */ 0x02, 0x09, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x0F, 0xF2, +/* 0000B540 */ 0x01, 0xFF, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8F, 0x02, 0x11, 0x0E, 0x01, 0x00, 0x07, +/* 0000B550 */ 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0x0E, 0x0E, 0x02, 0x00, 0x47, 0x0B, +/* 0000B560 */ 0x0E, 0x8F, 0x02, 0x11, 0x0E, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, +/* 0000B570 */ 0xEE, 0x02, 0x0E, 0x0E, 0x03, 0x00, 0x47, 0x09, 0x0E, 0x8F, 0x02, 0x0A, 0x0E, 0x02, 0x00, 0x07, +/* 0000B580 */ 0x03, 0x00, 0x5C, 0x00, 0x05, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5D, 0x02, 0x02, 0x04, 0x00, 0xEE, +/* 0000B590 */ 0x03, 0x0E, 0x0E, 0x04, 0x00, 0x47, 0x0C, 0x0E, 0x8F, 0x01, 0x02, 0x0E, 0x03, 0x00, 0x4B, 0x0E, +/* 0000B5A0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0C, 0x98, 0x0F, 0x08, 0x06, 0x01, 0x00, 0x5C, +/* 0000B5B0 */ 0x02, 0x0F, 0x98, 0x0F, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0xFF, 0x0E, 0x05, +/* 0000B5C0 */ 0x00, 0x8F, 0x02, 0x10, 0x0E, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x02, 0x09, +/* 0000B5D0 */ 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, +/* 0000B5E0 */ 0x5C, 0x02, 0x09, 0x62, 0x11, 0x0C, 0x03, 0x5C, 0x03, 0x11, 0x62, 0x11, 0x0C, 0x04, 0x5C, 0x04, +/* 0000B5F0 */ 0x11, 0x62, 0x11, 0x0C, 0x05, 0x5C, 0x05, 0x11, 0x62, 0x11, 0x0C, 0x06, 0x5C, 0x06, 0x11, 0xF2, +/* 0000B600 */ 0x07, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x00, 0x0E, +/* 0000B610 */ 0x06, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x59, 0x02, 0xFE, 0x57, 0x02, 0xFE, +/* 0000B620 */ 0x2A, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0xA5, +/* 0000B630 */ 0x9A, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x29, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x22, 0x00, +/* 0000B640 */ 0x6D, 0x00, 0x08, 0x00, 0x29, 0x00, 0x1A, 0x00, 0xE2, 0x00, 0x18, 0x00, 0x2C, 0x00, 0x18, 0x00, +/* 0000B650 */ 0x29, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x29, 0x00, 0x4D, 0x00, 0x56, 0x00, 0xB5, 0x00, 0x00, 0xBF, +/* 0000B660 */ 0x5D, 0x8D, 0xE0, 0xA1, 0xD6, 0x02, 0xFE, 0xE8, 0x02, 0x0C, 0xB3, 0x41, 0xC1, 0x00, 0xFE, 0xBA, +/* 0000B670 */ 0x03, 0x2F, 0xFE, 0x5F, 0x83, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x5F, 0x83, +/* 0000B680 */ 0xFE, 0xC5, 0x16, 0xFE, 0xC5, 0x16, 0x44, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, 0x0A, 0x01, 0xF9, +/* 0000B690 */ 0x02, 0x02, 0x12, 0x05, 0x10, 0x13, 0x13, 0x13, 0x13, 0x01, 0x32, 0x33, 0x34, 0x35, 0x06, 0xFE, +/* 0000B6A0 */ 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, 0x08, 0x06, 0xFE, 0x11, 0x03, 0x0B, 0x06, 0xFE, 0x72, 0x03, +/* 0000B6B0 */ 0x07, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, +/* 0000B6C0 */ 0x03, 0x06, 0xFE, 0xBC, 0x03, 0x06, 0xFE, 0xBD, 0x03, 0x06, 0xFE, 0xBE, 0x03, 0x06, 0xFE, 0xBF, +/* 0000B6D0 */ 0x03, 0x05, 0xFE, 0xC0, 0x03, 0x05, 0xFE, 0xC1, 0x03, 0x05, 0xFE, 0xC2, 0x03, 0x05, 0xFE, 0xC3, +/* 0000B6E0 */ 0x03, 0x06, 0xFE, 0xC4, 0x03, 0x06, 0xFE, 0x6C, 0x03, 0x0C, 0x06, 0xFE, 0xC5, 0x03, 0x05, 0xFE, +/* 0000B6F0 */ 0xC6, 0x03, 0x05, 0xFE, 0xC7, 0x03, 0x06, 0xFE, 0xC8, 0x03, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, +/* 0000B700 */ 0xCA, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x06, 0xFE, 0xCB, 0x03, 0x06, 0xFE, 0xCC, 0x03, 0x06, 0xFE, +/* 0000B710 */ 0xCD, 0x03, 0x01, 0x00, 0x01, 0xFF, 0xFE, 0x12, 0x04, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0x2C, +/* 0000B720 */ 0x36, 0x24, 0x0D, 0x03, 0x00, 0x36, 0x02, 0x09, 0x1A, 0x00, 0x8F, 0x02, 0x09, 0x37, 0x00, 0x00, +/* 0000B730 */ 0x6D, 0x36, 0x37, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x37, 0xF2, 0x01, 0xFF, 0x36, 0x00, 0x00, +/* 0000B740 */ 0x00, 0x00, 0x00, 0x00, 0x8F, 0x02, 0x0C, 0x36, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, +/* 0000B750 */ 0x8F, 0x02, 0x19, 0x37, 0x02, 0x00, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x24, 0x5D, 0x03, 0x03, 0x01, +/* 0000B760 */ 0x00, 0xEE, 0x04, 0x36, 0x36, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x2F, 0x00, 0x62, 0x36, +/* 0000B770 */ 0x24, 0x01, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x24, 0x00, 0x8F, 0x02, 0x09, 0x37, 0x00, 0x00, 0x6D, +/* 0000B780 */ 0x36, 0x37, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x37, 0x5D, 0x01, 0x05, 0x02, 0x00, 0x5D, 0x02, +/* 0000B790 */ 0x05, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x36, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x77, 0x06, 0x24, +/* 0000B7A0 */ 0x03, 0x2C, 0x36, 0x26, 0x14, 0x03, 0x00, 0x36, 0x07, 0x09, 0x22, 0x00, 0x8F, 0x02, 0x0A, 0x36, +/* 0000B7B0 */ 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x37, 0x5C, 0x01, 0x37, 0x5D, 0x02, 0x08, +/* 0000B7C0 */ 0x03, 0x00, 0xEE, 0x03, 0x36, 0x36, 0x03, 0x00, 0x47, 0x26, 0x36, 0x09, 0x20, 0x00, 0x8F, 0x02, +/* 0000B7D0 */ 0x31, 0x37, 0x04, 0x00, 0x6D, 0x36, 0x37, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, +/* 0000B7E0 */ 0x26, 0xF2, 0x02, 0x36, 0x36, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x26, 0x36, 0x8F, 0x02, +/* 0000B7F0 */ 0x02, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x09, +/* 0000B800 */ 0x05, 0x00, 0x5D, 0x03, 0x0A, 0x05, 0x00, 0xCE, 0x37, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x37, +/* 0000B810 */ 0xA1, 0x01, 0x0C, 0x37, 0x5C, 0x04, 0x37, 0x5D, 0x05, 0x0C, 0x05, 0x00, 0xEE, 0x06, 0x36, 0x36, +/* 0000B820 */ 0x05, 0x00, 0x47, 0x28, 0x36, 0x8F, 0x02, 0x02, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 0000B830 */ 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x0D, 0x06, 0x00, 0x5D, 0x03, 0x0A, 0x06, 0x00, 0xCE, 0x37, +/* 0000B840 */ 0x02, 0x01, 0x00, 0xA1, 0x00, 0x0E, 0x37, 0xA1, 0x01, 0x0F, 0x37, 0x5C, 0x04, 0x37, 0x5D, 0x05, +/* 0000B850 */ 0x0E, 0x06, 0x00, 0xEE, 0x06, 0x36, 0x36, 0x06, 0x00, 0x47, 0x29, 0x36, 0x8F, 0x02, 0x02, 0x36, +/* 0000B860 */ 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x10, 0x07, 0x00, +/* 0000B870 */ 0x5D, 0x03, 0x0A, 0x07, 0x00, 0xCE, 0x37, 0x04, 0x02, 0x00, 0xA1, 0x00, 0x11, 0x37, 0xA1, 0x01, +/* 0000B880 */ 0x12, 0x37, 0xA1, 0x02, 0x13, 0x37, 0xA1, 0x03, 0x14, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, +/* 0000B890 */ 0x05, 0x37, 0xEE, 0x06, 0x36, 0x36, 0x07, 0x00, 0x47, 0x2A, 0x36, 0x8F, 0x02, 0x02, 0x36, 0x05, +/* 0000B8A0 */ 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x15, 0x08, 0x00, 0x5D, +/* 0000B8B0 */ 0x03, 0x16, 0x08, 0x00, 0xA8, 0x37, 0x5C, 0x04, 0x37, 0x5D, 0x05, 0x17, 0x08, 0x00, 0xEE, 0x06, +/* 0000B8C0 */ 0x36, 0x36, 0x08, 0x00, 0x47, 0x2B, 0x36, 0x8F, 0x02, 0x02, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, +/* 0000B8D0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x18, 0x09, 0x00, 0x5D, 0x03, 0x0A, 0x09, 0x00, +/* 0000B8E0 */ 0xCE, 0x37, 0x03, 0x03, 0x00, 0xA1, 0x00, 0x19, 0x37, 0xA1, 0x01, 0x1A, 0x37, 0xA1, 0x02, 0x1B, +/* 0000B8F0 */ 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, 0xEE, 0x06, 0x36, 0x36, 0x09, 0x00, 0x96, +/* 0000B900 */ 0x02, 0x36, 0x8F, 0x02, 0x02, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 0000B910 */ 0x26, 0x5D, 0x02, 0x1C, 0x0A, 0x00, 0x5D, 0x03, 0x16, 0x0A, 0x00, 0xCE, 0x37, 0x02, 0x04, 0x00, +/* 0000B920 */ 0xA1, 0x00, 0x06, 0x37, 0xA1, 0x01, 0x17, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, +/* 0000B930 */ 0xEE, 0x06, 0x36, 0x36, 0x0A, 0x00, 0x96, 0x03, 0x36, 0x8F, 0x02, 0x07, 0x36, 0x06, 0x00, 0x07, +/* 0000B940 */ 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0xEE, 0x02, 0x36, 0x36, 0x0B, 0x00, 0x47, 0x25, +/* 0000B950 */ 0x36, 0x8F, 0x02, 0x2F, 0x36, 0x07, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, +/* 0000B960 */ 0x5C, 0x02, 0x28, 0xA8, 0x37, 0x5C, 0x03, 0x37, 0x8F, 0x02, 0x37, 0x37, 0x08, 0x00, 0x5C, 0x04, +/* 0000B970 */ 0x37, 0xEE, 0x05, 0x36, 0x36, 0x0C, 0x00, 0x47, 0x2C, 0x36, 0x96, 0x04, 0x1D, 0x8F, 0x02, 0x2C, +/* 0000B980 */ 0x36, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x62, 0x37, 0x2C, 0x05, 0x5C, 0x01, 0x37, +/* 0000B990 */ 0xEE, 0x02, 0x36, 0x36, 0x0D, 0x00, 0x47, 0x2D, 0x36, 0x47, 0x2E, 0x2D, 0x62, 0x36, 0x2C, 0x06, +/* 0000B9A0 */ 0x0F, 0x03, 0x00, 0x36, 0x09, 0x28, 0x00, 0x8F, 0x02, 0x0C, 0x36, 0x01, 0x00, 0x07, 0x04, 0x00, +/* 0000B9B0 */ 0x5C, 0x00, 0x04, 0x8F, 0x02, 0x1C, 0x37, 0x0A, 0x00, 0x5C, 0x01, 0x37, 0x62, 0x37, 0x2C, 0x06, +/* 0000B9C0 */ 0x5C, 0x02, 0x37, 0xD4, 0x00, 0x37, 0x5C, 0x03, 0x37, 0xEE, 0x04, 0xFF, 0x36, 0x0E, 0x00, 0x93, +/* 0000B9D0 */ 0x04, 0x36, 0x0B, 0x00, 0x15, 0x03, 0x00, 0x36, 0x1D, 0x09, 0x50, 0x00, 0x8F, 0x02, 0x35, 0x36, +/* 0000B9E0 */ 0x0C, 0x00, 0x98, 0x36, 0x36, 0x2E, 0x00, 0x00, 0x47, 0x2F, 0x36, 0x47, 0x30, 0x1E, 0xA8, 0x36, +/* 0000B9F0 */ 0x15, 0x03, 0x00, 0x2F, 0x36, 0x09, 0x31, 0x00, 0x93, 0x04, 0x37, 0x0B, 0x00, 0x98, 0x37, 0x2F, +/* 0000BA00 */ 0x37, 0x01, 0x00, 0x47, 0x30, 0x37, 0x47, 0x36, 0x37, 0xA8, 0x37, 0x15, 0x03, 0x00, 0x36, 0x37, +/* 0000BA10 */ 0x09, 0x16, 0x00, 0x15, 0x03, 0x00, 0x30, 0x1E, 0x09, 0x0B, 0x00, 0x2F, 0x36, 0x2E, 0x1F, 0x2F, +/* 0000BA20 */ 0x36, 0x36, 0x30, 0x47, 0x2E, 0x36, 0x09, 0x03, 0x00, 0x96, 0x04, 0x1D, 0x93, 0x02, 0x36, 0x0D, +/* 0000BA30 */ 0x00, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x92, 0x00, 0xE5, 0x3D, 0x00, 0x8F, 0x02, +/* 0000BA40 */ 0x09, 0x37, 0x00, 0x00, 0x6D, 0x36, 0x37, 0x07, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x37, 0x5D, 0x01, +/* 0000BA50 */ 0x20, 0x0F, 0x00, 0x5D, 0x02, 0x21, 0x0F, 0x00, 0x5C, 0x03, 0x2D, 0xA8, 0x38, 0x5C, 0x04, 0x38, +/* 0000BA60 */ 0xA8, 0x38, 0x5C, 0x05, 0x38, 0xA8, 0x38, 0x5C, 0x06, 0x38, 0xF2, 0x07, 0x36, 0x36, 0x07, 0x00, +/* 0000BA70 */ 0x00, 0x00, 0x0F, 0x00, 0x47, 0x31, 0x36, 0xE9, 0x09, 0x33, 0x00, 0xE7, 0x27, 0x06, 0x8F, 0x02, +/* 0000BA80 */ 0x29, 0x36, 0x0E, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x27, 0xEE, 0x02, 0xFF, +/* 0000BA90 */ 0x36, 0x10, 0x00, 0x8F, 0x02, 0x09, 0x37, 0x00, 0x00, 0x6D, 0x36, 0x37, 0x08, 0x07, 0x01, 0x00, +/* 0000BAA0 */ 0x5C, 0x00, 0x37, 0xF2, 0x01, 0xFF, 0x36, 0x08, 0x00, 0x00, 0x00, 0x11, 0x00, 0xE9, 0x14, 0x03, +/* 0000BAB0 */ 0x00, 0x31, 0x22, 0x09, 0x06, 0x00, 0x96, 0x02, 0x1B, 0x09, 0x11, 0x00, 0x14, 0x03, 0x00, 0x31, +/* 0000BAC0 */ 0x23, 0x09, 0x06, 0x00, 0x96, 0x02, 0x19, 0x09, 0x03, 0x00, 0x96, 0x02, 0x1A, 0xA8, 0x36, 0x14, +/* 0000BAD0 */ 0x03, 0x00, 0x2A, 0x36, 0x09, 0x03, 0x00, 0x47, 0x2A, 0x14, 0x93, 0x03, 0x36, 0x0F, 0x00, 0xA8, +/* 0000BAE0 */ 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x03, 0x00, 0x96, 0x03, 0x17, 0x77, 0x28, 0x24, 0x09, +/* 0000BAF0 */ 0x62, 0x36, 0x2C, 0x05, 0x77, 0x36, 0x24, 0x0A, 0x77, 0x2E, 0x24, 0x0B, 0x77, 0x29, 0x24, 0x0C, +/* 0000BB00 */ 0x77, 0x2A, 0x24, 0x0D, 0x77, 0x2B, 0x24, 0x0E, 0x93, 0x02, 0x36, 0x0D, 0x00, 0x77, 0x36, 0x24, +/* 0000BB10 */ 0x0F, 0x93, 0x03, 0x36, 0x0F, 0x00, 0x77, 0x36, 0x24, 0x10, 0x93, 0x04, 0x36, 0x0B, 0x00, 0x77, +/* 0000BB20 */ 0x36, 0x24, 0x11, 0x77, 0x06, 0x24, 0x12, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, +/* 0000BB30 */ 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x66, 0x03, 0xFE, 0x6F, 0x02, 0xFE, 0x3B, 0x02, +/* 0000BB40 */ 0xFE, 0x2A, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x71, 0x02, 0xFE, +/* 0000BB50 */ 0x72, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x77, +/* 0000BB60 */ 0x02, 0xFE, 0x78, 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0x23, 0x02, 0xFE, 0xCE, 0x03, 0xFE, 0xAC, 0x83, +/* 0000BB70 */ 0x35, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x37, 0x00, 0x1A, 0x00, 0x3F, 0x00, 0x35, 0x00, 0x93, +/* 0000BB80 */ 0x00, 0x24, 0x00, 0x65, 0x00, 0x04, 0x00, 0x5D, 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x4F, +/* 0000BB90 */ 0x00, 0x20, 0x00, 0x49, 0x00, 0x37, 0x00, 0x71, 0x00, 0x37, 0x00, 0x5F, 0x00, 0x3F, 0x00, 0x81, +/* 0000BBA0 */ 0x00, 0x2C, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x73, 0x00, 0x37, 0x00, 0x9B, 0x00, 0x18, 0x00, 0x41, +/* 0000BBB0 */ 0x00, 0x29, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x2B, 0x00, 0x1C, 0x00, 0x69, 0x00, 0x03, 0x00, 0x46, +/* 0000BBC0 */ 0x00, 0x0B, 0x00, 0x36, 0x00, 0x28, 0x00, 0x33, 0x05, 0x0D, 0x00, 0x33, 0x00, 0x0F, 0x00, 0x6F, +/* 0000BBD0 */ 0x00, 0x03, 0x00, 0x2F, 0x00, 0x25, 0x00, 0x92, 0x00, 0x08, 0x00, 0x3B, 0x00, 0x0E, 0x00, 0xB1, +/* 0000BBE0 */ 0x00, 0x03, 0x00, 0x7F, 0x00, 0x12, 0x00, 0x51, 0x00, 0x3F, 0x00, 0x79, 0x00, 0x01, 0x00, 0x52, +/* 0000BBF0 */ 0x00, 0x15, 0x00, 0x92, 0x01, 0x1B, 0x00, 0x52, 0x00, 0x08, 0x00, 0x29, 0x00, 0x06, 0x00, 0x30, +/* 0000BC00 */ 0x00, 0x08, 0x00, 0x2A, 0x00, 0x06, 0x00, 0x4A, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x0A, 0x00, 0x35, +/* 0000BC10 */ 0x00, 0x03, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x31, 0x00, 0x03, 0x00, 0x65, 0x00, 0x04, 0x00, 0x2E, +/* 0000BC20 */ 0x00, 0x08, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x48, 0x00, 0x04, 0x00, 0x2A, 0x00, 0x04, 0x00, 0x36, +/* 0000BC30 */ 0x00, 0x04, 0x00, 0x42, 0x00, 0x09, 0x00, 0x32, 0x00, 0x09, 0x00, 0x2E, 0x00, 0x09, 0x00, 0x32, +/* 0000BC40 */ 0x00, 0x06, 0x00, 0x33, 0x00, 0x00, 0x4A, 0xBC, 0x00, 0x00, 0xBF, 0x5C, 0x8D, 0xE0, 0x19, 0xC4, +/* 0000BC50 */ 0x10, 0xFE, 0x0A, 0x03, 0x57, 0xA2, 0x41, 0xD1, 0x00, 0x30, 0xFE, 0x19, 0x8B, 0xFF, 0x00, 0x10, +/* 0000BC60 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x19, 0x8B, 0xFE, 0xCB, 0x04, 0xFE, 0xCB, 0x04, 0x41, 0x09, 0x15, +/* 0000BC70 */ 0x1A, 0x0B, 0x5E, 0x59, 0x03, 0x03, 0x05, 0x01, 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x19, +/* 0000BC80 */ 0x01, 0x01, 0x01, 0x02, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xCF, 0x03, 0x06, 0xFE, 0xC5, 0x03, +/* 0000BC90 */ 0x07, 0x08, 0x06, 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0xC6, 0x03, 0x05, 0xFE, 0xC7, 0x03, 0x06, 0xFE, +/* 0000BCA0 */ 0xC8, 0x03, 0x05, 0xFE, 0xD0, 0x03, 0x06, 0xFE, 0xD1, 0x03, 0x0B, 0x05, 0xFE, 0xD2, 0x03, 0x06, +/* 0000BCB0 */ 0xFE, 0xCA, 0x03, 0x06, 0xFE, 0xBE, 0x03, 0x06, 0xFE, 0xBD, 0x03, 0x05, 0xFE, 0xD3, 0x03, 0xFE, +/* 0000BCC0 */ 0x7C, 0x01, 0x8F, 0x03, 0x09, 0x1B, 0x00, 0x00, 0x6D, 0x1A, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 0000BCD0 */ 0x00, 0x1B, 0x5C, 0x01, 0x15, 0xE0, 0x1C, 0x00, 0x5C, 0x02, 0x1C, 0xF2, 0x03, 0x1A, 0x1A, 0x00, +/* 0000BCE0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x16, 0x1A, 0x98, 0x1A, 0x16, 0x02, 0x00, 0x00, 0x47, 0x17, +/* 0000BCF0 */ 0x1A, 0x98, 0x1A, 0x16, 0x03, 0x01, 0x00, 0x14, 0x03, 0x00, 0x1A, 0x04, 0x09, 0x08, 0x00, 0xA8, +/* 0000BD00 */ 0x1B, 0x47, 0x1A, 0x1B, 0x09, 0x09, 0x00, 0x98, 0x1B, 0x16, 0x03, 0x02, 0x00, 0x47, 0x1A, 0x1B, +/* 0000BD10 */ 0x47, 0x18, 0x1A, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x7A, 0x00, 0x8F, 0x01, 0x02, 0x1A, 0x01, +/* 0000BD20 */ 0x00, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x6A, 0x00, 0x8F, 0x03, 0x02, 0x1A, 0x02, +/* 0000BD30 */ 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x08, 0x8F, 0x03, 0x0A, 0x1B, 0x03, 0x00, 0x07, 0x03, 0x00, +/* 0000BD40 */ 0x5C, 0x00, 0x08, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, +/* 0000BD50 */ 0x7B, 0x18, 0x1C, 0x01, 0x5C, 0x01, 0x1C, 0x5D, 0x02, 0x07, 0x02, 0x00, 0xEE, 0x03, 0x1B, 0x1B, +/* 0000BD60 */ 0x02, 0x00, 0x5C, 0x01, 0x1B, 0x5D, 0x02, 0x06, 0x01, 0x00, 0x5D, 0x03, 0x09, 0x01, 0x00, 0xCE, +/* 0000BD70 */ 0x1B, 0x03, 0x00, 0x00, 0xA1, 0x00, 0x0A, 0x1B, 0xA1, 0x01, 0x0B, 0x1B, 0xA1, 0x02, 0x0C, 0x1B, +/* 0000BD80 */ 0x5C, 0x04, 0x1B, 0xA8, 0x1B, 0x5C, 0x05, 0x1B, 0xEE, 0x06, 0x1A, 0x1A, 0x01, 0x00, 0x94, 0x01, +/* 0000BD90 */ 0x02, 0x1A, 0x09, 0xA5, 0x00, 0x14, 0x03, 0x00, 0x17, 0x0D, 0x09, 0x67, 0x00, 0x8F, 0x01, 0x03, +/* 0000BDA0 */ 0x1A, 0x04, 0x00, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x57, 0x00, 0xA8, 0x1A, 0x15, +/* 0000BDB0 */ 0x03, 0x00, 0x18, 0x1A, 0x09, 0x46, 0x00, 0x8F, 0x03, 0x31, 0x1B, 0x05, 0x00, 0x6D, 0x1A, 0x1B, +/* 0000BDC0 */ 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x8F, 0x03, 0x0C, 0x1C, 0x06, 0x00, 0x07, 0x03, 0x00, +/* 0000BDD0 */ 0x5C, 0x00, 0x08, 0x8F, 0x03, 0x24, 0x1D, 0x07, 0x00, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x18, 0xEE, +/* 0000BDE0 */ 0x03, 0x1C, 0x1C, 0x04, 0x00, 0x43, 0x1C, 0x1C, 0x0E, 0x5C, 0x01, 0x1C, 0xF2, 0x02, 0x1A, 0x1A, +/* 0000BDF0 */ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x94, 0x01, 0x03, 0x1A, 0x09, 0x04, 0x00, 0x94, 0x01, 0x03, +/* 0000BE00 */ 0x0F, 0x09, 0x36, 0x00, 0x14, 0x03, 0x00, 0x17, 0x10, 0x09, 0x2E, 0x00, 0xA8, 0x1A, 0x15, 0x03, +/* 0000BE10 */ 0x00, 0x18, 0x1A, 0x09, 0x24, 0x00, 0x15, 0x03, 0x00, 0x18, 0x11, 0x09, 0x1C, 0x00, 0x15, 0x03, +/* 0000BE20 */ 0x00, 0x18, 0x12, 0x09, 0x14, 0x00, 0x15, 0x03, 0x00, 0x18, 0x13, 0x09, 0x0C, 0x00, 0x15, 0x03, +/* 0000BE30 */ 0x00, 0x18, 0x14, 0x09, 0x04, 0x00, 0x94, 0x01, 0x04, 0x18, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x0C, +/* 0000BE40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x03, 0x00, +/* 0000BE50 */ 0x00, 0xFE, 0x39, 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0x5C, 0x02, 0x0E, 0xFE, 0x63, 0x03, 0x00, 0xFE, +/* 0000BE60 */ 0x45, 0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x82, 0x00, 0x09, 0x00, 0x2C, 0x00, 0x22, +/* 0000BE70 */ 0x00, 0x4C, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x6A, 0x00, 0x9F, 0x00, 0x18, 0x00, 0x49, 0x00, 0x0A, +/* 0000BE80 */ 0x00, 0x3B, 0x00, 0x46, 0x00, 0xA9, 0x00, 0x07, 0x00, 0x4D, 0x00, 0x32, 0x00, 0xFF, 0x00, 0x06, +/* 0000BE90 */ 0x00, 0x41, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x31, 0xD4, 0x02, 0xFE, 0xAC, 0x02, 0x1E, 0xA0, +/* 0000BEA0 */ 0x41, 0xC1, 0x00, 0xFE, 0x42, 0x03, 0x2C, 0xFE, 0xD6, 0x79, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000BEB0 */ 0x01, 0x01, 0xFE, 0xD6, 0x79, 0xFE, 0xE5, 0x08, 0xFE, 0xE5, 0x08, 0x01, 0x0C, 0x07, 0x0F, 0x06, +/* 0000BEC0 */ 0x7E, 0x76, 0x01, 0x05, 0x08, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x0E, 0x0F, 0x08, 0x01, +/* 0000BED0 */ 0x01, 0x05, 0xFE, 0xAB, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x02, 0xFE, 0xD9, 0x01, 0x4F, 0x07, +/* 0000BEE0 */ 0x4F, 0x08, 0x4F, 0x0B, 0x4F, 0x0C, 0x4F, 0x0D, 0x4F, 0x09, 0x4F, 0x0A, 0x8F, 0x01, 0x4C, 0x10, +/* 0000BEF0 */ 0x00, 0x00, 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x1C, 0x00, 0x8F, 0x01, 0x09, 0x10, 0x01, +/* 0000BF00 */ 0x00, 0x62, 0x10, 0x10, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x0B, 0x00, 0x8F, 0x01, 0x4C, 0x00, +/* 0000BF10 */ 0x00, 0x00, 0x4B, 0x00, 0x09, 0x9E, 0x01, 0xA8, 0x10, 0x47, 0x07, 0x10, 0xA8, 0x10, 0x47, 0x08, +/* 0000BF20 */ 0x10, 0x8F, 0x01, 0x39, 0x10, 0x02, 0x00, 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x89, 0x00, +/* 0000BF30 */ 0x8F, 0x01, 0x3D, 0x10, 0x03, 0x00, 0x4B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, +/* 0000BF40 */ 0x10, 0x10, 0x00, 0x00, 0x47, 0x07, 0x10, 0x8F, 0x01, 0x09, 0x11, 0x01, 0x00, 0x6D, 0x10, 0x11, +/* 0000BF50 */ 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x07, 0xE0, 0x12, 0x00, 0x5C, 0x02, 0x12, +/* 0000BF60 */ 0xF2, 0x03, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x09, 0x10, 0x0F, 0x03, 0x00, +/* 0000BF70 */ 0x09, 0x09, 0x42, 0x00, 0x98, 0x10, 0x09, 0x03, 0x00, 0x00, 0x47, 0x08, 0x10, 0x8F, 0x01, 0x0C, +/* 0000BF80 */ 0x10, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x01, 0x23, 0x11, 0x05, 0x00, 0x5C, +/* 0000BF90 */ 0x01, 0x11, 0x5C, 0x02, 0x07, 0x47, 0x11, 0x04, 0x01, 0x04, 0x01, 0x12, 0x08, 0x2F, 0x11, 0x11, +/* 0000BFA0 */ 0x12, 0x2F, 0x11, 0x11, 0x05, 0x5C, 0x03, 0x11, 0x5D, 0x04, 0x05, 0x02, 0x00, 0xEE, 0x05, 0x10, +/* 0000BFB0 */ 0x10, 0x02, 0x00, 0x47, 0x07, 0x10, 0x09, 0x4C, 0x00, 0x8F, 0x01, 0x09, 0x11, 0x01, 0x00, 0x6D, +/* 0000BFC0 */ 0x10, 0x11, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x8F, 0x01, 0x3D, 0x12, 0x03, 0x00, 0x4B, +/* 0000BFD0 */ 0x12, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x12, 0x12, 0x04, 0x00, 0x5C, 0x01, 0x12, +/* 0000BFE0 */ 0xE0, 0x12, 0x01, 0x5C, 0x02, 0x12, 0xF2, 0x03, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, +/* 0000BFF0 */ 0x54, 0x0A, 0x10, 0x98, 0x10, 0x0A, 0x03, 0x01, 0x00, 0x47, 0x07, 0x10, 0x98, 0x10, 0x0A, 0x06, +/* 0000C000 */ 0x02, 0x00, 0x47, 0x08, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x08, 0x10, 0x09, 0x11, 0x00, 0x01, +/* 0000C010 */ 0x32, 0x01, 0x01, 0x4C, 0x07, 0x8F, 0x01, 0x4C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x95, 0x00, +/* 0000C020 */ 0xD6, 0x00, 0x10, 0x54, 0x0B, 0x10, 0x8F, 0x01, 0x36, 0x10, 0x06, 0x00, 0x98, 0x10, 0x10, 0x07, +/* 0000C030 */ 0x03, 0x00, 0x54, 0x0C, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0C, 0x10, 0x09, 0x23, 0x00, 0x07, +/* 0000C040 */ 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0xEE, 0x03, 0x10, 0x0B, 0x05, +/* 0000C050 */ 0x00, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x8F, 0x01, 0x4C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, +/* 0000C060 */ 0x53, 0x00, 0x98, 0x10, 0x0C, 0x08, 0x04, 0x00, 0x54, 0x0D, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, +/* 0000C070 */ 0x0D, 0x10, 0x09, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, +/* 0000C080 */ 0x0D, 0xEE, 0x03, 0x10, 0x0B, 0x06, 0x00, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x09, 0x18, 0x00, +/* 0000C090 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0xEE, 0x03, 0x10, 0x0B, +/* 0000C0A0 */ 0x07, 0x00, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x8F, 0x01, 0x4C, 0x00, 0x00, 0x00, 0x4B, 0x00, +/* 0000C0B0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x17, 0x03, 0xFE, 0x39, 0x02, 0x28, 0xFE, 0xAC, +/* 0000C0C0 */ 0x03, 0x00, 0x0E, 0xFE, 0xAD, 0x03, 0x00, 0xFE, 0xEC, 0x79, 0x1B, 0x0E, 0x00, 0x00, 0x00, 0x20, +/* 0000C0D0 */ 0x00, 0x3F, 0x00, 0x0B, 0x00, 0x31, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, 0x23, 0x00, 0x0F, +/* 0000C0E0 */ 0x00, 0x7A, 0x00, 0x17, 0x00, 0x29, 0x00, 0x26, 0x00, 0x6A, 0x00, 0x07, 0x00, 0xB8, 0x00, 0x09, +/* 0000C0F0 */ 0x00, 0x26, 0x00, 0x3C, 0x00, 0xC6, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x09, 0x00, 0x1F, 0x00, 0x09, +/* 0000C100 */ 0x00, 0x29, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x06, 0x00, 0x2C, 0x00, 0x0B, 0x00, 0x8D, 0x00, 0x06, +/* 0000C110 */ 0x00, 0x28, 0x01, 0x0F, 0x00, 0x56, 0x00, 0x0A, 0x00, 0x84, 0x00, 0x18, 0x00, 0x54, 0x00, 0x0B, +/* 0000C120 */ 0x00, 0x31, 0x00, 0x09, 0x00, 0x42, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x1B, 0x00, 0x6B, 0x00, 0x18, +/* 0000C130 */ 0x00, 0x5B, 0x00, 0x0D, 0x00, 0x22, 0x00, 0x00, 0x3C, 0xC1, 0x00, 0x00, 0xBF, 0x4C, 0x80, 0x00, +/* 0000C140 */ 0x00, 0xC4, 0x00, 0xFE, 0xCA, 0x02, 0x2C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xAE, 0x03, 0x2D, 0xFE, +/* 0000C150 */ 0xFC, 0x7E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xFC, 0x7E, 0xF9, 0xF9, 0x01, 0x04, +/* 0000C160 */ 0x05, 0x08, 0x18, 0x16, 0x01, 0x01, 0x07, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xAB, 0x03, 0x05, +/* 0000C170 */ 0xFE, 0xAF, 0x03, 0x56, 0x8F, 0x01, 0x39, 0x08, 0x00, 0x00, 0x4B, 0x08, 0x0F, 0x03, 0x00, 0x08, +/* 0000C180 */ 0x09, 0x23, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, +/* 0000C190 */ 0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, +/* 0000C1A0 */ 0x09, 0x25, 0x00, 0x09, 0x20, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, +/* 0000C1B0 */ 0x00, 0x08, 0x2F, 0x00, 0x00, 0x04, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, +/* 0000C1C0 */ 0x00, 0x00, 0x02, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x31, 0x7F, 0x04, 0x00, 0x00, +/* 0000C1D0 */ 0x00, 0x00, 0x0F, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x53, 0x00, 0x22, 0x00, 0x46, 0x00, 0x00, 0x3F, +/* 0000C1E0 */ 0x5D, 0x84, 0x00, 0x80, 0xC6, 0x02, 0xFE, 0x97, 0x02, 0x32, 0xA0, 0x41, 0xD1, 0x00, 0x29, 0xFE, +/* 0000C1F0 */ 0xF5, 0x75, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xF5, 0x75, 0xFE, 0x13, 0x03, +/* 0000C200 */ 0xFE, 0x13, 0x03, 0x01, 0x06, 0x04, 0x07, 0x08, 0x1E, 0x1E, 0x01, 0x03, 0x06, 0x04, 0x05, 0x06, +/* 0000C210 */ 0x07, 0x08, 0x6F, 0x4F, 0x07, 0x96, 0x02, 0x07, 0x8F, 0x01, 0x0A, 0x07, 0x00, 0x00, 0x07, 0x03, +/* 0000C220 */ 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x08, 0x5C, 0x01, 0x08, 0x5D, 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, +/* 0000C230 */ 0x07, 0x07, 0x00, 0x00, 0x96, 0x02, 0x07, 0x8F, 0x01, 0x0C, 0x07, 0x01, 0x00, 0x07, 0x04, 0x00, +/* 0000C240 */ 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x1C, 0x08, 0x02, 0x00, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x18, 0x08, +/* 0000C250 */ 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x35, 0x09, 0x04, 0x00, 0x5C, 0x01, +/* 0000C260 */ 0x09, 0xEE, 0x02, 0x08, 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0xD4, 0x00, 0x08, 0x5C, 0x03, 0x08, +/* 0000C270 */ 0xEE, 0x04, 0xFF, 0x07, 0x01, 0x00, 0x93, 0x02, 0x00, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000C280 */ 0x24, 0x00, 0xFE, 0xA8, 0x03, 0xFE, 0x0B, 0x76, 0x04, 0x05, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x31, +/* 0000C290 */ 0x00, 0x3F, 0x00, 0xB6, 0x02, 0x0A, 0x00, 0x15, 0x00, 0x00, 0x9E, 0xC2, 0x00, 0x00, 0xBF, 0x5D, +/* 0000C2A0 */ 0x87, 0x00, 0x80, 0xC6, 0x02, 0xFE, 0x99, 0x02, 0x6B, 0xA2, 0x41, 0xD1, 0x00, 0x2A, 0xFE, 0x9F, +/* 0000C2B0 */ 0x76, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x9F, 0x76, 0xFE, 0x48, 0x02, 0xFE, +/* 0000C2C0 */ 0x48, 0x02, 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x25, 0x25, 0x02, 0x01, 0x01, 0x03, 0x08, 0x05, +/* 0000C2D0 */ 0x06, 0x07, 0x07, 0x08, 0x8D, 0x4F, 0x08, 0x96, 0x02, 0x08, 0x4F, 0x08, 0x96, 0x03, 0x08, 0x8F, +/* 0000C2E0 */ 0x02, 0x35, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x04, 0x00, 0x00, 0x96, 0x02, 0x08, 0x8F, 0x02, +/* 0000C2F0 */ 0x0A, 0x08, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x09, 0x5C, 0x01, 0x09, 0x5D, +/* 0000C300 */ 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, 0x08, 0x08, 0x00, 0x00, 0x96, 0x03, 0x08, 0x8F, 0x02, 0x0C, +/* 0000C310 */ 0x08, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, 0x1C, 0x09, 0x03, 0x00, 0x5C, +/* 0000C320 */ 0x01, 0x09, 0x8F, 0x02, 0x18, 0x09, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x02, +/* 0000C330 */ 0x0A, 0x05, 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0x09, 0x09, 0x02, 0x00, 0x5C, 0x02, 0x09, 0xD4, +/* 0000C340 */ 0x00, 0x09, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x08, 0x01, 0x00, 0x8F, 0x01, 0x02, 0x08, 0x06, +/* 0000C350 */ 0x00, 0x4B, 0x08, 0x93, 0x03, 0x09, 0x07, 0x00, 0x9D, 0x09, 0x08, 0x04, 0x00, 0x00, 0xA8, 0x00, +/* 0000C360 */ 0x24, 0x00, 0xFE, 0xA9, 0x03, 0xFE, 0xAA, 0x03, 0xFE, 0xBF, 0x76, 0x05, 0x0A, 0x00, 0x00, 0x00, +/* 0000C370 */ 0x0F, 0x00, 0x56, 0x00, 0x1F, 0x00, 0x45, 0x00, 0x3E, 0x00, 0x58, 0x01, 0x15, 0x00, 0x34, 0x00, +/* 0000C380 */ 0x00, 0x85, 0xC3, 0x00, 0x00, 0xBF, 0x4C, 0x83, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x9D, 0x02, 0x68, +/* 0000C390 */ 0xA2, 0x41, 0xD1, 0x00, 0x2B, 0xFE, 0xB6, 0x77, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 0000C3A0 */ 0xB6, 0x77, 0xEC, 0xEC, 0x41, 0x04, 0x03, 0x06, 0x0D, 0x0D, 0x03, 0x01, 0x01, 0x02, 0x05, 0x06, +/* 0000C3B0 */ 0xFE, 0x0A, 0x03, 0x2D, 0x4F, 0x04, 0x8F, 0x01, 0x02, 0x06, 0x00, 0x00, 0x4B, 0x06, 0x98, 0x06, +/* 0000C3C0 */ 0x06, 0x03, 0x00, 0x00, 0x54, 0x04, 0x06, 0x15, 0x03, 0x00, 0x04, 0x02, 0x09, 0x0E, 0x00, 0x8F, +/* 0000C3D0 */ 0x01, 0x03, 0x06, 0x01, 0x00, 0x4B, 0x06, 0x9D, 0x03, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, +/* 0000C3E0 */ 0x00, 0xFE, 0xDD, 0x77, 0x04, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x48, 0x00, 0x08, 0x00, 0x2D, +/* 0000C3F0 */ 0x00, 0x10, 0x00, 0x4F, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x72, 0x02, +/* 0000C400 */ 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA7, 0x03, 0x28, 0xFE, 0xCD, 0x6B, 0xFF, 0x00, 0x10, 0x01, +/* 0000C410 */ 0x00, 0x02, 0x02, 0xFE, 0xCD, 0x6B, 0x96, 0x96, 0x01, 0x05, 0x03, 0x06, 0x05, 0x0F, 0x0F, 0x01, +/* 0000C420 */ 0x01, 0x02, 0x05, 0x08, 0x2F, 0x5B, 0x04, 0xB4, 0x04, 0x04, 0x8F, 0x01, 0x33, 0x06, 0x00, 0x00, +/* 0000C430 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x4B, 0x07, 0x01, 0x00, 0x4B, +/* 0000C440 */ 0x07, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x03, 0xEE, 0x04, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x00, +/* 0000C450 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x0B, 0x6C, 0x02, 0x05, 0x00, 0x00, 0x00, 0x28, 0x00, 0x57, 0x00, +/* 0000C460 */ 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x6C, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, +/* 0000C470 */ 0xFE, 0xA6, 0x03, 0x27, 0xFE, 0x27, 0x6A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x27, +/* 0000C480 */ 0x6A, 0xCC, 0xCC, 0x01, 0x06, 0x03, 0x07, 0x06, 0x13, 0x12, 0x01, 0x01, 0x02, 0x06, 0x08, 0x3C, +/* 0000C490 */ 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, +/* 0000C4A0 */ 0x01, 0x32, 0x07, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8F, 0x01, +/* 0000C4B0 */ 0x49, 0x08, 0x01, 0x00, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0xEE, +/* 0000C4C0 */ 0x05, 0x00, 0x07, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x65, 0x6A, 0x03, +/* 0000C4D0 */ 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x23, 0x00, 0x2B, 0x00, 0x6A, 0x00, 0x00, 0xBF, 0x5C, 0x84, +/* 0000C4E0 */ 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x66, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA5, 0x03, 0x26, +/* 0000C4F0 */ 0xFE, 0x4D, 0x68, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x4D, 0x68, 0xC8, 0xC8, 0x01, +/* 0000C500 */ 0x06, 0x03, 0x07, 0x06, 0x13, 0x12, 0x01, 0x01, 0x02, 0x06, 0x08, 0x3C, 0x5B, 0x05, 0xB4, 0x05, +/* 0000C510 */ 0x05, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, 0x01, 0x32, 0x07, 0x00, +/* 0000C520 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x47, 0x08, 0x01, 0x00, +/* 0000C530 */ 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0xEE, 0x05, 0x00, 0x07, 0x00, +/* 0000C540 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x89, 0x68, 0x03, 0x05, 0x00, 0x00, 0x00, +/* 0000C550 */ 0x0A, 0x00, 0x23, 0x00, 0x2B, 0x00, 0x68, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, +/* 0000C560 */ 0xFE, 0x60, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA4, 0x03, 0x25, 0xFE, 0x83, 0x66, 0xFF, +/* 0000C570 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x83, 0x66, 0xC0, 0xC0, 0x01, 0x06, 0x03, 0x07, 0x06, +/* 0000C580 */ 0x13, 0x12, 0x01, 0x01, 0x02, 0x06, 0x08, 0x3C, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x15, 0x05, 0x00, +/* 0000C590 */ 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, 0x01, 0x32, 0x07, 0x00, 0x00, 0x07, 0x05, 0x00, +/* 0000C5A0 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x45, 0x08, 0x01, 0x00, 0x4B, 0x08, 0x5C, 0x02, +/* 0000C5B0 */ 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0xEE, 0x05, 0x00, 0x07, 0x00, 0x00, 0x09, 0x02, 0x00, +/* 0000C5C0 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xBB, 0x66, 0x03, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x23, 0x00, +/* 0000C5D0 */ 0x2B, 0x00, 0x64, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x42, 0x02, 0x1D, +/* 0000C5E0 */ 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xFA, 0x02, 0x24, 0xFE, 0xE3, 0x60, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000C5F0 */ 0x03, 0x03, 0xFE, 0xE3, 0x60, 0xFE, 0x60, 0x03, 0xFE, 0x60, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, +/* 0000C600 */ 0x50, 0x4D, 0x01, 0x09, 0x08, 0x04, 0x04, 0x04, 0x04, 0x0B, 0x08, 0x06, 0xFE, 0x72, 0x03, 0x05, +/* 0000C610 */ 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x06, 0xFE, 0xA2, 0x03, 0x05, 0xFE, 0xA3, 0x03, 0xFE, +/* 0000C620 */ 0x46, 0x01, 0xA8, 0x0A, 0x8F, 0x01, 0x07, 0x0C, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000C630 */ 0x5C, 0x01, 0x08, 0xEE, 0x02, 0x0C, 0x0C, 0x00, 0x00, 0x47, 0x08, 0x0C, 0x2C, 0x0C, 0x09, 0x15, +/* 0000C640 */ 0x03, 0x00, 0x0C, 0x03, 0x09, 0x7E, 0x00, 0x62, 0x0C, 0x09, 0x00, 0x47, 0x0A, 0x0C, 0x2C, 0x0C, +/* 0000C650 */ 0x0A, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x6C, 0x00, 0x8F, 0x01, 0x31, 0x0D, 0x01, 0x00, 0x6D, +/* 0000C660 */ 0x0C, 0x0D, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, 0x0A, 0xF2, 0x02, 0x0C, 0x0C, +/* 0000C670 */ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0A, 0x0C, 0x15, 0x03, 0x00, 0x0A, 0x04, 0x09, 0x44, +/* 0000C680 */ 0x00, 0x15, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x3C, 0x00, 0x8F, 0x01, 0x09, 0x0D, 0x02, 0x00, 0x6D, +/* 0000C690 */ 0x0C, 0x0D, 0x02, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0D, 0x8F, 0x01, 0x11, 0x0E, 0x03, 0x00, 0x07, +/* 0000C6A0 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0x0E, 0x0E, 0x03, 0x00, 0x5C, 0x01, +/* 0000C6B0 */ 0x0E, 0x5D, 0x02, 0x06, 0x02, 0x00, 0x5D, 0x03, 0x07, 0x02, 0x00, 0xF2, 0x04, 0xFF, 0x0C, 0x02, +/* 0000C6C0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x2C, 0x0C, 0x0A, 0x14, 0x0B, 0x00, 0x0C, 0x03, 0x09, 0x00, 0x00, +/* 0000C6D0 */ 0x14, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x56, 0x00, 0x8F, 0x01, 0x08, 0x0C, 0x04, 0x00, 0x07, 0x04, +/* 0000C6E0 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x2B, 0x0D, 0x05, 0x00, 0x5C, 0x02, 0x0D, +/* 0000C6F0 */ 0x8F, 0x01, 0x09, 0x0E, 0x02, 0x00, 0x6D, 0x0D, 0x0E, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, +/* 0000C700 */ 0x8F, 0x01, 0x30, 0x0F, 0x06, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0F, 0x0F, +/* 0000C710 */ 0x06, 0x00, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x0D, 0x0D, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5C, +/* 0000C720 */ 0x03, 0x0D, 0xEE, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x09, 0x3B, 0x00, 0x09, 0x36, 0x00, 0x8F, 0x01, +/* 0000C730 */ 0x08, 0x0C, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x2C, +/* 0000C740 */ 0x0D, 0x07, 0x00, 0x5C, 0x02, 0x0D, 0x8F, 0x01, 0x30, 0x0D, 0x06, 0x00, 0x07, 0x01, 0x00, 0x5C, +/* 0000C750 */ 0x00, 0x02, 0xEE, 0x01, 0x0D, 0x0D, 0x08, 0x00, 0x5C, 0x03, 0x0D, 0xEE, 0x04, 0x00, 0x0C, 0x07, +/* 0000C760 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x64, 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x5F, +/* 0000C770 */ 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x1E, 0x61, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x34, 0x00, +/* 0000C780 */ 0x0B, 0x00, 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x20, 0x00, 0x37, 0x00, +/* 0000C790 */ 0x10, 0x00, 0x4A, 0x00, 0x3C, 0x00, 0x96, 0x00, 0x13, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x93, 0x00, +/* 0000C7A0 */ 0x38, 0x00, 0x64, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x34, 0x02, 0x28, +/* 0000C7B0 */ 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3F, 0x03, 0x23, 0xFE, 0x0F, 0x5F, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000C7C0 */ 0x04, 0x04, 0xFE, 0x0F, 0x5F, 0xFE, 0x8C, 0x01, 0xFE, 0x8C, 0x01, 0x01, 0x07, 0x05, 0x0A, 0x03, +/* 0000C7D0 */ 0x26, 0x25, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0x09, 0x07, 0x05, 0xFE, 0xF3, 0x02, 0x08, +/* 0000C7E0 */ 0x9B, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0A, 0x14, 0x03, 0x00, 0x05, 0x0A, +/* 0000C7F0 */ 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x09, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, +/* 0000C800 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000C810 */ 0x8F, 0x01, 0x09, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, +/* 0000C820 */ 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x08, 0x0A, +/* 0000C830 */ 0x0F, 0x03, 0x00, 0x08, 0x09, 0x0C, 0x00, 0x62, 0x0A, 0x08, 0x02, 0x15, 0x03, 0x00, 0x0A, 0x03, +/* 0000C840 */ 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x09, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, +/* 0000C850 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 0000C860 */ 0x8F, 0x01, 0x07, 0x0A, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0xEE, +/* 0000C870 */ 0x02, 0x00, 0x0A, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5A, 0x02, 0xFE, +/* 0000C880 */ 0x35, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0x40, 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, +/* 0000C890 */ 0x00, 0x1D, 0x00, 0x40, 0x00, 0x20, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x1D, 0x00, 0x40, +/* 0000C8A0 */ 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x27, 0x02, +/* 0000C8B0 */ 0x24, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3E, 0x03, 0x22, 0xFE, 0x4B, 0x5D, 0xFF, 0x00, 0x10, 0x01, +/* 0000C8C0 */ 0x00, 0x05, 0x05, 0xFE, 0x4B, 0x5D, 0xFE, 0x9A, 0x01, 0xFE, 0x9A, 0x01, 0x01, 0x08, 0x05, 0x0B, +/* 0000C8D0 */ 0x04, 0x27, 0x26, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0x0A, 0x07, 0x05, 0xFE, 0xF3, 0x02, +/* 0000C8E0 */ 0x08, 0x9E, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x05, +/* 0000C8F0 */ 0x0B, 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, +/* 0000C900 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000C910 */ 0x00, 0x8F, 0x01, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000C920 */ 0x0C, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x09, +/* 0000C930 */ 0x0B, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0C, 0x00, 0x62, 0x0B, 0x09, 0x02, 0x15, 0x03, 0x00, 0x0B, +/* 0000C940 */ 0x03, 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, +/* 0000C950 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, +/* 0000C960 */ 0x00, 0x8F, 0x01, 0x34, 0x0B, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, +/* 0000C970 */ 0x5C, 0x02, 0x08, 0xEE, 0x03, 0x00, 0x0B, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000C980 */ 0xFE, 0x5A, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0x85, 0x5D, 0x07, 0x00, 0x00, 0x00, +/* 0000C990 */ 0x00, 0x12, 0x00, 0x37, 0x00, 0x1D, 0x00, 0x40, 0x00, 0x20, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, +/* 0000C9A0 */ 0x00, 0x1D, 0x00, 0x40, 0x00, 0x1D, 0x00, 0x31, 0x00, 0x00, 0x3F, 0x5D, 0x8C, 0xE0, 0x89, 0xC6, +/* 0000C9B0 */ 0x12, 0xFE, 0x14, 0x02, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x20, 0x03, 0x20, 0xFE, 0xB6, 0x59, +/* 0000C9C0 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xB6, 0x59, 0xFE, 0x6F, 0x03, 0xFE, 0x6F, +/* 0000C9D0 */ 0x03, 0x04, 0x09, 0x0A, 0x10, 0x05, 0x20, 0x20, 0x01, 0x02, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, +/* 0000C9E0 */ 0x01, 0x0D, 0x0E, 0x0F, 0x01, 0x00, 0x08, 0x06, 0xFE, 0x9C, 0x03, 0x06, 0xFE, 0xF9, 0x02, 0x06, +/* 0000C9F0 */ 0xFE, 0x12, 0x03, 0x0C, 0x06, 0xFE, 0x14, 0x03, 0x07, 0x81, 0x96, 0x04, 0x0B, 0x96, 0x05, 0x0C, +/* 0000CA00 */ 0xCE, 0x10, 0x00, 0x00, 0x00, 0x96, 0x02, 0x10, 0x96, 0x03, 0x02, 0x8F, 0x01, 0x0C, 0x10, 0x00, +/* 0000CA10 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x1C, 0x11, 0x01, 0x00, 0x5C, 0x01, 0x11, +/* 0000CA20 */ 0x5C, 0x02, 0x0A, 0xD4, 0x00, 0x11, 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x00, 0x00, 0x8F, +/* 0000CA30 */ 0x01, 0x1B, 0x10, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x02, 0x11, 0x03, 0x00, +/* 0000CA40 */ 0x5C, 0x01, 0x11, 0x5D, 0x02, 0x04, 0x01, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000CA50 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x93, 0x03, 0x12, 0x04, 0x00, 0x7B, 0x12, 0x11, 0x00, 0x7B, 0x07, +/* 0000CA60 */ 0x11, 0x01, 0x7B, 0x07, 0x11, 0x02, 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x01, 0x00, 0x93, +/* 0000CA70 */ 0x02, 0x00, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, +/* 0000CA80 */ 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 0000CA90 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, +/* 0000CAA0 */ 0x9D, 0x03, 0xFE, 0x9E, 0x03, 0xFE, 0x9F, 0x03, 0xFE, 0xA0, 0x03, 0xFE, 0x09, 0x5A, 0x06, 0x06, +/* 0000CAB0 */ 0x00, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x03, 0x00, 0x17, 0x00, 0x24, 0x00, 0x70, 0x02, 0x40, +/* 0000CAC0 */ 0x00, 0x68, 0x00, 0x0A, 0x00, 0x13, 0x00, 0x00, 0xCC, 0xCA, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, +/* 0000CAD0 */ 0x29, 0xD4, 0x10, 0xFE, 0x17, 0x02, 0x41, 0xB2, 0x41, 0xD1, 0x00, 0x21, 0xFE, 0x72, 0x5A, 0xFF, +/* 0000CAE0 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x72, 0x5A, 0xFE, 0x2C, 0x02, 0xFE, 0x2C, 0x02, 0x45, +/* 0000CAF0 */ 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x03, 0x07, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x0E, +/* 0000CB00 */ 0x0F, 0x08, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0C, 0x06, 0xFE, 0x14, 0x03, 0x06, +/* 0000CB10 */ 0xFE, 0x13, 0x03, 0x0B, 0x07, 0x01, 0x01, 0xB6, 0xA8, 0x0D, 0xE5, 0x94, 0x00, 0x8F, 0x02, 0x2E, +/* 0000CB20 */ 0x10, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0B, 0x8F, 0x01, 0x04, 0x11, +/* 0000CB30 */ 0x01, 0x00, 0x5C, 0x02, 0x11, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x8F, 0x01, 0x05, 0x11, 0x02, 0x00, +/* 0000CB40 */ 0x5C, 0x04, 0x11, 0xEE, 0x05, 0x10, 0x10, 0x00, 0x00, 0x47, 0x0D, 0x10, 0x62, 0x10, 0x0D, 0x00, +/* 0000CB50 */ 0x0F, 0x03, 0x00, 0x10, 0x09, 0x56, 0x00, 0x8F, 0x02, 0x1B, 0x10, 0x03, 0x00, 0x07, 0x04, 0x00, +/* 0000CB60 */ 0x5C, 0x00, 0x02, 0x8F, 0x01, 0x02, 0x11, 0x04, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x01, 0x03, 0x11, +/* 0000CB70 */ 0x05, 0x00, 0x5C, 0x02, 0x11, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, +/* 0000CB80 */ 0x00, 0x00, 0x62, 0x12, 0x0D, 0x00, 0x7B, 0x12, 0x11, 0x01, 0x7B, 0x05, 0x11, 0x02, 0x7B, 0x05, +/* 0000CB90 */ 0x11, 0x03, 0x7B, 0x08, 0x11, 0x04, 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x01, 0x00, 0x8F, +/* 0000CBA0 */ 0x01, 0x03, 0x10, 0x05, 0x00, 0x2F, 0x10, 0x10, 0x0A, 0x94, 0x01, 0x03, 0x10, 0xE9, 0x09, 0x19, +/* 0000CBB0 */ 0x00, 0xE7, 0x0C, 0x06, 0x8F, 0x02, 0x29, 0x10, 0x06, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000CBC0 */ 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0xFF, 0x10, 0x02, 0x00, 0xE9, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x18, +/* 0000CBD0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 0000CBE0 */ 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xFE, 0x21, 0x02, +/* 0000CBF0 */ 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xA8, 0x5A, 0x07, +/* 0000CC00 */ 0x05, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x48, 0x00, 0x8D, 0x00, +/* 0000CC10 */ 0x14, 0x00, 0x33, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x18, 0x00, 0x8F, 0x00, 0x00, 0x3F, 0x5D, 0x8C, +/* 0000CC20 */ 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0xF0, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1F, 0x03, 0x1E, +/* 0000CC30 */ 0xFE, 0x7F, 0x55, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x7F, 0x55, 0xFE, 0x31, +/* 0000CC40 */ 0x04, 0xFE, 0x31, 0x04, 0x01, 0x08, 0x05, 0x0A, 0x05, 0x2C, 0x2A, 0x01, 0x03, 0x03, 0x03, 0x03, +/* 0000CC50 */ 0x03, 0x03, 0x03, 0x07, 0x08, 0x09, 0x06, 0xFE, 0x72, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x08, 0xA7, +/* 0000CC60 */ 0x4F, 0x06, 0x4F, 0x0A, 0x96, 0x02, 0x0A, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, +/* 0000CC70 */ 0x08, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x09, 0x8B, 0x00, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, +/* 0000CC80 */ 0x0A, 0x03, 0x09, 0x0C, 0x00, 0xCE, 0x0A, 0x01, 0x01, 0x00, 0xA1, 0x00, 0x05, 0x0A, 0x47, 0x05, +/* 0000CC90 */ 0x0A, 0x8F, 0x01, 0x31, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000CCA0 */ 0x0B, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x05, +/* 0000CCB0 */ 0x0A, 0x8F, 0x01, 0x31, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000CCC0 */ 0x0B, 0x62, 0x0C, 0x05, 0x02, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, +/* 0000CCD0 */ 0x01, 0x00, 0x54, 0x06, 0x0A, 0xCE, 0x0A, 0x00, 0x02, 0x00, 0x96, 0x02, 0x0A, 0x8F, 0x01, 0x28, +/* 0000CCE0 */ 0x0A, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xD4, +/* 0000CCF0 */ 0x00, 0x0B, 0x5C, 0x03, 0x0B, 0xEE, 0x04, 0xFF, 0x0A, 0x02, 0x00, 0x93, 0x02, 0x00, 0x02, 0x00, +/* 0000CD00 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x61, 0x02, 0xF3, 0xFE, 0x99, +/* 0000CD10 */ 0x03, 0xFE, 0xB2, 0x55, 0x0A, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x08, 0x00, 0x1E, +/* 0000CD20 */ 0x00, 0x0B, 0x00, 0x2F, 0x00, 0x0C, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x24, 0x00, 0x70, +/* 0000CD30 */ 0x00, 0x08, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x8F, 0x02, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x42, 0xCD, +/* 0000CD40 */ 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xFF, 0x01, 0x2A, 0xA2, 0x41, 0xD1, +/* 0000CD50 */ 0x00, 0x1F, 0xFE, 0x31, 0x57, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x31, 0x57, 0xFE, +/* 0000CD60 */ 0x61, 0x02, 0xFE, 0x61, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x4C, 0x4A, 0x02, 0x08, 0x08, 0x04, +/* 0000CD70 */ 0x04, 0x04, 0x04, 0x0A, 0x06, 0xFE, 0x6D, 0x03, 0x06, 0xFE, 0x9A, 0x03, 0x07, 0x05, 0xFE, 0x9B, +/* 0000CD80 */ 0x03, 0x08, 0x01, 0xFF, 0xFE, 0x37, 0x01, 0x4F, 0x09, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, +/* 0000CD90 */ 0x02, 0x09, 0x0B, 0x00, 0x2C, 0x0B, 0x08, 0x15, 0x0B, 0x00, 0x0B, 0x03, 0x09, 0x00, 0x00, 0x14, +/* 0000CDA0 */ 0x03, 0x00, 0x08, 0x04, 0x09, 0x1F, 0x00, 0x8F, 0x02, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, +/* 0000CDB0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x05, 0x00, 0x00, 0xF2, 0x02, 0xFF, 0x0B, +/* 0000CDC0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x02, 0x31, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x01, +/* 0000CDD0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, +/* 0000CDE0 */ 0x00, 0x01, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x02, 0x3F, 0x0B, 0x02, 0x00, 0x4B, 0x0B, 0x07, 0x02, +/* 0000CDF0 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x0F, 0x35, 0x00, +/* 0000CE00 */ 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x02, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, +/* 0000CE10 */ 0x00, 0x5C, 0x00, 0x0C, 0x8F, 0x02, 0x11, 0x0D, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, +/* 0000CE20 */ 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x0D, 0x0D, 0x04, 0x00, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0xFF, 0x0B, +/* 0000CE30 */ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x02, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x03, +/* 0000CE40 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x00, +/* 0000CE50 */ 0x00, 0x05, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x5A, 0x00, +/* 0000CE60 */ 0x8F, 0x02, 0x0C, 0x0B, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x02, 0x1D, 0x0C, +/* 0000CE70 */ 0x05, 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x01, 0x02, 0x0C, 0x06, 0x00, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, +/* 0000CE80 */ 0x5C, 0x03, 0x09, 0xEE, 0x04, 0x0B, 0x0B, 0x06, 0x00, 0x14, 0x03, 0x00, 0x0B, 0x07, 0x09, 0x29, +/* 0000CE90 */ 0x00, 0x8F, 0x02, 0x0C, 0x0B, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x02, 0x1E, +/* 0000CEA0 */ 0x0C, 0x07, 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x01, 0x02, 0x0C, 0x06, 0x00, 0x4B, 0x0C, 0x5C, 0x02, +/* 0000CEB0 */ 0x0C, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x0B, 0x07, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x58, +/* 0000CEC0 */ 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x62, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x51, 0x57, 0x09, 0x02, 0x00, +/* 0000CED0 */ 0x00, 0x00, 0x1E, 0x00, 0x65, 0x00, 0x1F, 0x00, 0x47, 0x00, 0x20, 0x00, 0x32, 0x00, 0x1E, 0x00, +/* 0000CEE0 */ 0x35, 0x00, 0x32, 0x00, 0x4B, 0x00, 0x20, 0x00, 0x37, 0x00, 0x3B, 0x00, 0x65, 0x00, 0x2B, 0x00, +/* 0000CEF0 */ 0x46, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xE5, 0x01, 0x04, 0xA3, 0x41, +/* 0000CF00 */ 0xC1, 0x00, 0xFE, 0x1E, 0x03, 0x1D, 0xFE, 0x0A, 0x54, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, +/* 0000CF10 */ 0xFE, 0x0A, 0x54, 0xF8, 0xF8, 0x01, 0x05, 0x04, 0x06, 0x04, 0x1D, 0x1C, 0x01, 0x03, 0x04, 0x02, +/* 0000CF20 */ 0x02, 0x02, 0x02, 0x05, 0x08, 0x07, 0x74, 0x8F, 0x01, 0x31, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, +/* 0000CF30 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0xF2, 0x02, 0x06, 0x06, 0x00, 0x00, +/* 0000CF40 */ 0x00, 0x00, 0x00, 0x00, 0x47, 0x04, 0x06, 0x8F, 0x01, 0x41, 0x06, 0x01, 0x00, 0x4B, 0x06, 0x0F, +/* 0000CF50 */ 0x15, 0x00, 0x06, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x04, 0x06, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, +/* 0000CF60 */ 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x09, 0x07, 0x03, 0x00, 0x6D, 0x06, +/* 0000CF70 */ 0x07, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x41, 0x08, 0x01, +/* 0000CF80 */ 0x00, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0xF2, 0x03, 0x06, 0x06, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 0000CF90 */ 0x44, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5D, 0x02, 0xFE, 0x39, +/* 0000CFA0 */ 0x02, 0xFE, 0x3C, 0x54, 0x05, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x29, 0x00, 0x0F, 0x00, 0x25, +/* 0000CFB0 */ 0x00, 0x12, 0x00, 0x2F, 0x00, 0x31, 0x00, 0x48, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, +/* 0000CFC0 */ 0x00, 0xFE, 0xAA, 0x01, 0x04, 0xA1, 0x41, 0xC1, 0x00, 0xFE, 0x1D, 0x03, 0x1C, 0xFE, 0x06, 0x41, +/* 0000CFD0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x06, 0x41, 0xFE, 0xFE, 0x12, 0xFE, 0xFE, 0x12, +/* 0000CFE0 */ 0x41, 0x17, 0x25, 0x38, 0x04, 0xAF, 0x9B, 0x01, 0x03, 0x01, 0x37, 0x05, 0xFE, 0x77, 0x03, 0x05, +/* 0000CFF0 */ 0xFE, 0x78, 0x03, 0x05, 0xFE, 0x79, 0x03, 0x06, 0xFE, 0x7A, 0x03, 0x06, 0xFE, 0x7B, 0x03, 0x05, +/* 0000D000 */ 0xFE, 0x7C, 0x03, 0x05, 0xFE, 0x7D, 0x03, 0x05, 0xFE, 0x7E, 0x03, 0x05, 0xFE, 0x7F, 0x03, 0x05, +/* 0000D010 */ 0xFE, 0x80, 0x03, 0x05, 0xFE, 0x81, 0x03, 0x05, 0xFE, 0x82, 0x03, 0x05, 0xFE, 0x83, 0x03, 0x05, +/* 0000D020 */ 0xFE, 0x84, 0x03, 0x05, 0xFE, 0x85, 0x03, 0x05, 0xFE, 0x86, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x05, +/* 0000D030 */ 0xFE, 0x87, 0x03, 0x05, 0xFE, 0x88, 0x03, 0x05, 0xFE, 0x89, 0x03, 0x05, 0xFE, 0x8A, 0x03, 0x05, +/* 0000D040 */ 0xFE, 0x8B, 0x03, 0x05, 0xFE, 0x8C, 0x03, 0x05, 0xFE, 0x8D, 0x03, 0x05, 0xFE, 0x8E, 0x03, 0x05, +/* 0000D050 */ 0xFE, 0x8F, 0x03, 0x05, 0xFE, 0x90, 0x03, 0x05, 0xFE, 0x91, 0x03, 0x05, 0xFE, 0x92, 0x03, 0x05, +/* 0000D060 */ 0xFE, 0x93, 0x03, 0x05, 0xFE, 0x94, 0x03, 0x05, 0xFE, 0x95, 0x03, 0x05, 0xFE, 0x96, 0x03, 0x05, +/* 0000D070 */ 0xFE, 0x97, 0x03, 0x06, 0xFE, 0x98, 0x03, 0xFE, 0x99, 0x02, 0x4F, 0x25, 0x4F, 0x26, 0x4F, 0x27, +/* 0000D080 */ 0x4F, 0x28, 0x4F, 0x29, 0x4F, 0x2A, 0x4F, 0x2B, 0x4F, 0x2C, 0x4F, 0x2D, 0x4F, 0x2E, 0x4F, 0x2F, +/* 0000D090 */ 0x4F, 0x30, 0x4F, 0x31, 0x4F, 0x32, 0x4F, 0x33, 0x4F, 0x34, 0x4F, 0x35, 0x4F, 0x36, 0x54, 0x25, +/* 0000D0A0 */ 0x02, 0x54, 0x26, 0x03, 0x47, 0x38, 0x04, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, +/* 0000D0B0 */ 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D0C0 */ 0x06, 0x54, 0x27, 0x38, 0x54, 0x28, 0x07, 0x2F, 0x38, 0x08, 0x09, 0x54, 0x29, 0x38, 0x47, 0x38, +/* 0000D0D0 */ 0x0A, 0x01, 0x04, 0x01, 0x39, 0x28, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, +/* 0000D0E0 */ 0x01, 0x39, 0x29, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x2A, 0x38, 0x47, 0x38, +/* 0000D0F0 */ 0x0C, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0D, 0x54, 0x2B, +/* 0000D100 */ 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D110 */ 0x0E, 0x54, 0x2C, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x2C, 0x2F, 0x38, 0x38, 0x39, +/* 0000D120 */ 0x2F, 0x38, 0x38, 0x0F, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D130 */ 0x10, 0x54, 0x2D, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, +/* 0000D140 */ 0x2F, 0x38, 0x38, 0x11, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D150 */ 0x12, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2E, +/* 0000D160 */ 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D170 */ 0x14, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2F, +/* 0000D180 */ 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D190 */ 0x15, 0x54, 0x30, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, +/* 0000D1A0 */ 0x2F, 0x38, 0x38, 0x16, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D1B0 */ 0x17, 0x54, 0x31, 0x38, 0x47, 0x39, 0x12, 0x01, 0x04, 0x01, 0x3A, 0x25, 0x2F, 0x39, 0x39, 0x3A, +/* 0000D1C0 */ 0x2F, 0x39, 0x39, 0x18, 0xFC, 0x38, 0x0A, 0x39, 0x05, 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, +/* 0000D1D0 */ 0x31, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1A, 0x47, 0x3A, 0x05, 0x01, 0x04, 0x01, 0x3B, +/* 0000D1E0 */ 0x25, 0x2F, 0x3A, 0x3A, 0x3B, 0x2F, 0x3A, 0x3A, 0x1B, 0xFE, 0x38, 0x39, 0x3A, 0x02, 0xFD, 0x38, +/* 0000D1F0 */ 0x0B, 0x04, 0x54, 0x32, 0x38, 0x47, 0x38, 0x1C, 0x01, 0x04, 0x01, 0x39, 0x32, 0x2F, 0x38, 0x38, +/* 0000D200 */ 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x30, 0x2F, 0x39, 0x39, +/* 0000D210 */ 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, +/* 0000D220 */ 0x2F, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x54, 0x33, 0x38, +/* 0000D230 */ 0x47, 0x38, 0x19, 0x01, 0x04, 0x01, 0x39, 0x2E, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x1F, +/* 0000D240 */ 0x47, 0x39, 0x20, 0x01, 0x04, 0x01, 0x3A, 0x2D, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x21, +/* 0000D250 */ 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x2B, 0x2F, 0x39, 0x39, 0x3A, +/* 0000D260 */ 0x2F, 0x39, 0x39, 0x22, 0x2F, 0x38, 0x38, 0x39, 0x54, 0x34, 0x38, 0x47, 0x38, 0x23, 0x01, 0x04, +/* 0000D270 */ 0x01, 0x39, 0x33, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x34, +/* 0000D280 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x23, 0x54, 0x35, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, +/* 0000D290 */ 0x01, 0x39, 0x35, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2B, +/* 0000D2A0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2A, 0x2F, 0x38, 0x38, +/* 0000D2B0 */ 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x36, 0x38, 0x8F, 0x01, 0x0F, 0x38, 0x00, 0x00, 0x07, 0x03, +/* 0000D2C0 */ 0x00, 0x5C, 0x01, 0x33, 0x5D, 0x02, 0x24, 0x00, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x00, 0x00, 0x01, +/* 0000D2D0 */ 0x32, 0x01, 0x01, 0x42, 0x38, 0x8F, 0x01, 0x0F, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x01, +/* 0000D2E0 */ 0x34, 0x5D, 0x02, 0x24, 0x01, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x01, 0x00, 0x01, 0x32, 0x01, 0x01, +/* 0000D2F0 */ 0x43, 0x38, 0x8F, 0x01, 0x0F, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x36, 0x5D, 0x02, +/* 0000D300 */ 0x24, 0x02, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x02, 0x00, 0x01, 0x32, 0x01, 0x01, 0x44, 0x38, 0xA8, +/* 0000D310 */ 0x00, 0x24, 0x00, 0xFE, 0xE6, 0x45, 0x16, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x03, +/* 0000D320 */ 0x00, 0x1F, 0x00, 0x20, 0x00, 0x33, 0x00, 0x03, 0x00, 0x77, 0x00, 0x07, 0x00, 0xC0, 0x00, 0x20, +/* 0000D330 */ 0x00, 0x44, 0x00, 0x13, 0x00, 0x7D, 0x00, 0x13, 0x00, 0x94, 0x00, 0x20, 0x00, 0x83, 0x00, 0x2D, +/* 0000D340 */ 0x00, 0x83, 0x00, 0x20, 0x00, 0x74, 0x00, 0x13, 0x00, 0x6A, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x41, +/* 0000D350 */ 0x00, 0x00, 0x04, 0x3B, 0x00, 0x4C, 0x01, 0x3B, 0x00, 0x5A, 0x01, 0x20, 0x00, 0x4B, 0x00, 0x2D, +/* 0000D360 */ 0x00, 0x6E, 0x00, 0x1D, 0x00, 0x66, 0x00, 0x1D, 0x00, 0x8B, 0x00, 0x1F, 0x00, 0x72, 0x00, 0x00, +/* 0000D370 */ 0xBF, 0x4C, 0x00, 0x00, 0x10, 0xC4, 0x00, 0xFE, 0xA3, 0x01, 0x04, 0xA1, 0x41, 0xC1, 0x00, 0xFE, +/* 0000D380 */ 0x1C, 0x03, 0x1B, 0xFE, 0xC9, 0x3F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xC9, 0x3F, +/* 0000D390 */ 0x55, 0x55, 0x41, 0x02, 0x02, 0x03, 0x05, 0x05, 0x01, 0x01, 0x02, 0x0D, 0xE0, 0x03, 0x00, 0x01, +/* 0000D3A0 */ 0x32, 0x01, 0x01, 0x41, 0x03, 0xA8, 0x00, 0x24, 0x00, 0x0A, 0xFE, 0x76, 0x03, 0x01, 0xFE, 0xF7, +/* 0000D3B0 */ 0x3F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x26, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x21, +/* 0000D3C0 */ 0xD4, 0x00, 0xFE, 0x92, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1B, 0x03, 0x1A, 0xFE, 0x64, +/* 0000D3D0 */ 0x3D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x64, 0x3D, 0xFE, 0x45, 0x02, 0xFE, 0x45, +/* 0000D3E0 */ 0x02, 0x01, 0x0C, 0x07, 0x0F, 0x08, 0x3C, 0x3B, 0x01, 0x01, 0x06, 0x05, 0x03, 0x03, 0x03, 0x03, +/* 0000D3F0 */ 0x01, 0x0E, 0x0F, 0x06, 0xFE, 0x72, 0x03, 0x08, 0x06, 0xFE, 0x73, 0x03, 0x05, 0xFE, 0x74, 0x03, +/* 0000D400 */ 0x06, 0xFE, 0x75, 0x03, 0xEE, 0x4F, 0x0C, 0x4F, 0x0D, 0x98, 0x10, 0x07, 0x08, 0x00, 0x00, 0x54, +/* 0000D410 */ 0x0C, 0x10, 0x2C, 0x10, 0x0C, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0xCC, 0x00, 0x8F, 0x01, 0x31, +/* 0000D420 */ 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0C, +/* 0000D430 */ 0xF2, 0x02, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0D, 0x10, 0x8F, 0x01, 0x27, +/* 0000D440 */ 0x10, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0D, 0xEE, 0x02, 0x10, 0x10, +/* 0000D450 */ 0x01, 0x00, 0x0F, 0x13, 0x00, 0x10, 0x09, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x0D, 0x09, 0x09, 0x00, +/* 0000D460 */ 0x00, 0x11, 0x03, 0x00, 0x0D, 0x0A, 0x09, 0x5D, 0x00, 0x8F, 0x01, 0x09, 0x11, 0x02, 0x00, 0x6D, +/* 0000D470 */ 0x10, 0x11, 0x01, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x11, 0x8F, 0x01, 0x11, 0x12, 0x03, 0x00, 0x07, +/* 0000D480 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x12, 0x12, 0x03, 0x00, 0x5C, 0x01, +/* 0000D490 */ 0x12, 0x8F, 0x01, 0x11, 0x12, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x08, +/* 0000D4A0 */ 0xEE, 0x02, 0x12, 0x12, 0x04, 0x00, 0x5C, 0x02, 0x12, 0x2F, 0x12, 0x04, 0x09, 0x2F, 0x12, 0x12, +/* 0000D4B0 */ 0x05, 0x2F, 0x12, 0x12, 0x0A, 0x2F, 0x12, 0x12, 0x06, 0x5C, 0x03, 0x12, 0xF2, 0x04, 0xFF, 0x10, +/* 0000D4C0 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x15, 0x11, 0x04, 0x00, 0x6D, 0x10, 0x11, 0x02, +/* 0000D4D0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, +/* 0000D4E0 */ 0x00, 0x05, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, +/* 0000D4F0 */ 0x00, 0x24, 0x00, 0xFE, 0x5E, 0x02, 0xFE, 0x5F, 0x02, 0x1F, 0xFE, 0xB6, 0x3D, 0x08, 0x04, 0x00, +/* 0000D500 */ 0x00, 0x00, 0x09, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x33, 0x00, 0x20, 0x00, 0x41, 0x00, 0x2C, 0x00, +/* 0000D510 */ 0x65, 0x00, 0x5D, 0x00, 0x8D, 0x00, 0x23, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x00, 0xBF, +/* 0000D520 */ 0x5C, 0x85, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x78, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1A, +/* 0000D530 */ 0x03, 0x19, 0xFE, 0x47, 0x3A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x47, 0x3A, 0xFE, +/* 0000D540 */ 0x17, 0x03, 0xFE, 0x17, 0x03, 0x01, 0x0B, 0x0A, 0x11, 0x0A, 0x51, 0x4B, 0x01, 0x01, 0x08, 0x06, +/* 0000D550 */ 0x04, 0x04, 0x04, 0x04, 0x10, 0x06, 0xFE, 0x6C, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x06, 0xFE, 0x6E, +/* 0000D560 */ 0x03, 0x08, 0x01, 0xFF, 0x05, 0xFE, 0x6F, 0x03, 0x05, 0xFE, 0x70, 0x03, 0x05, 0xFE, 0x71, 0x03, +/* 0000D570 */ 0xFE, 0x48, 0x01, 0x4F, 0x0F, 0x98, 0x11, 0x0A, 0x0B, 0x00, 0x00, 0x47, 0x0F, 0x11, 0xA8, 0x11, +/* 0000D580 */ 0x15, 0x03, 0x00, 0x0F, 0x11, 0x09, 0x29, 0x01, 0x0C, 0x03, 0x00, 0x0C, 0x02, 0x09, 0x20, 0x00, +/* 0000D590 */ 0x8F, 0x01, 0x31, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, +/* 0000D5A0 */ 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0F, 0x11, +/* 0000D5B0 */ 0x0C, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x31, 0x12, 0x00, 0x00, 0x6D, 0x11, +/* 0000D5C0 */ 0x12, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x01, +/* 0000D5D0 */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x04, 0x09, 0x20, 0x00, +/* 0000D5E0 */ 0x8F, 0x01, 0x31, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, +/* 0000D5F0 */ 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x0F, 0x11, +/* 0000D600 */ 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0D, 0x11, 0x09, 0xA1, 0x00, 0x8F, 0x01, 0x0C, 0x11, 0x01, 0x00, +/* 0000D610 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x01, 0x1D, 0x12, 0x02, 0x00, 0x5C, 0x01, 0x12, 0x5C, +/* 0000D620 */ 0x02, 0x0D, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0x11, 0x11, 0x03, 0x00, 0x0C, 0x03, 0x00, 0x11, 0x06, +/* 0000D630 */ 0x09, 0x78, 0x00, 0x8F, 0x01, 0x09, 0x12, 0x03, 0x00, 0x6D, 0x11, 0x12, 0x03, 0x07, 0x04, 0x00, +/* 0000D640 */ 0x5C, 0x00, 0x12, 0x8F, 0x01, 0x11, 0x13, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, +/* 0000D650 */ 0x01, 0x0F, 0xEE, 0x02, 0x13, 0x13, 0x05, 0x00, 0x5C, 0x01, 0x13, 0x8F, 0x01, 0x11, 0x13, 0x04, +/* 0000D660 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0B, 0xEE, 0x02, 0x13, 0x13, 0x06, 0x00, +/* 0000D670 */ 0x5C, 0x02, 0x13, 0x8F, 0x01, 0x0C, 0x13, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, +/* 0000D680 */ 0x01, 0x1F, 0x14, 0x05, 0x00, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0D, 0x5D, 0x03, 0x08, 0x07, 0x00, +/* 0000D690 */ 0xEE, 0x04, 0x13, 0x13, 0x07, 0x00, 0x2F, 0x13, 0x07, 0x13, 0x2F, 0x13, 0x13, 0x09, 0x5C, 0x03, +/* 0000D6A0 */ 0x13, 0xF2, 0x04, 0xFF, 0x11, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x00, 0x0F, 0x09, 0x08, +/* 0000D6B0 */ 0x00, 0x47, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, +/* 0000D6C0 */ 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x5F, 0x02, 0xFE, 0x8F, 0x3A, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x09, +/* 0000D6D0 */ 0x00, 0x28, 0x00, 0x0A, 0x00, 0x27, 0x00, 0x08, 0x00, 0x29, 0x00, 0x20, 0x00, 0x45, 0x00, 0x08, +/* 0000D6E0 */ 0x00, 0x28, 0x00, 0x20, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x28, 0x00, 0x20, 0x00, 0x3D, 0x00, 0x33, +/* 0000D6F0 */ 0x00, 0x6B, 0x00, 0x78, 0x00, 0xA6, 0x00, 0x06, 0x00, 0x21, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, +/* 0000D700 */ 0x3F, 0x5C, 0x84, 0xE0, 0x09, 0xC4, 0x12, 0xFE, 0x4D, 0x01, 0x14, 0xA0, 0x41, 0xD1, 0x00, 0x12, +/* 0000D710 */ 0xFE, 0x36, 0x35, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x36, 0x35, 0xFE, 0xE0, +/* 0000D720 */ 0x04, 0xFE, 0xE0, 0x04, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, 0x01, 0x01, 0x01, 0x06, 0x06, 0x06, +/* 0000D730 */ 0x06, 0x01, 0x0A, 0x06, 0xFE, 0x66, 0x03, 0x06, 0xFE, 0x67, 0x03, 0x06, 0xFE, 0x68, 0x03, 0x06, +/* 0000D740 */ 0xFE, 0x69, 0x03, 0x06, 0xFE, 0x6A, 0x03, 0x06, 0xFE, 0x6B, 0x03, 0x07, 0x08, 0x76, 0x8F, 0x01, +/* 0000D750 */ 0x0A, 0x0B, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000D760 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x00, 0x01, 0x65, +/* 0000D770 */ 0x01, 0x0D, 0x0C, 0xD4, 0x01, 0x0D, 0x7B, 0x0D, 0x0C, 0x01, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, +/* 0000D780 */ 0x02, 0x0D, 0x7B, 0x0D, 0x0C, 0x02, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x03, 0x0D, 0x7B, 0x0D, +/* 0000D790 */ 0x0C, 0x03, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x04, 0x0D, 0x7B, 0x0D, 0x0C, 0x04, 0x01, 0x65, +/* 0000D7A0 */ 0x01, 0x0D, 0x0C, 0xD4, 0x05, 0x0D, 0x7B, 0x0D, 0x0C, 0x05, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0x5C, +/* 0000D7B0 */ 0x01, 0x0C, 0x5D, 0x02, 0x08, 0x00, 0x00, 0xEE, 0x03, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, +/* 0000D7C0 */ 0xA8, 0x00, 0x24, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, +/* 0000D7D0 */ 0x00, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x00, 0x00, 0x5E, 0x02, 0x00, 0x00, 0x5C, +/* 0000D7E0 */ 0x02, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x6B, 0x03, 0x00, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x5D, +/* 0000D7F0 */ 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x61, 0x02, 0xFE, 0x6B, 0x03, 0xFE, 0x4C, 0x35, +/* 0000D800 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0xC9, 0x04, 0x00, 0x19, 0xDB, 0x00, 0x00, 0xAC, 0xDA, +/* 0000D810 */ 0x00, 0x00, 0x3F, 0xDA, 0x00, 0x00, 0xD2, 0xD9, 0x00, 0x00, 0xCF, 0xD8, 0x00, 0x00, 0x22, 0xD8, +/* 0000D820 */ 0x00, 0x00, 0xBF, 0x7C, 0x84, 0x01, 0x00, 0xC4, 0x04, 0xFE, 0x6B, 0x01, 0x19, 0xA2, 0x41, 0xC1, +/* 0000D830 */ 0x00, 0xFE, 0x6B, 0x03, 0x18, 0xFE, 0xCA, 0x38, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, +/* 0000D840 */ 0xCA, 0x38, 0xFE, 0x35, 0x01, 0xFE, 0x35, 0x01, 0x01, 0x05, 0x04, 0x07, 0x05, 0x1C, 0x1A, 0x19, +/* 0000D850 */ 0x01, 0x02, 0x03, 0x01, 0x06, 0x00, 0x58, 0x08, 0x0B, 0x5C, 0xEB, 0x00, 0xEC, 0x00, 0x0F, 0x03, +/* 0000D860 */ 0x00, 0x04, 0x09, 0x4B, 0x00, 0x8F, 0x01, 0x0C, 0x07, 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 0000D870 */ 0x02, 0x8F, 0x01, 0x19, 0x08, 0x01, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x04, 0x5C, 0x03, 0x05, +/* 0000D880 */ 0xEE, 0x04, 0x07, 0x07, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x08, 0x00, 0x47, 0x00, 0x03, +/* 0000D890 */ 0xED, 0x00, 0x09, 0x1F, 0x00, 0x8F, 0x01, 0x16, 0x07, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000D8A0 */ 0x02, 0x5C, 0x01, 0x04, 0xEE, 0x02, 0x07, 0x07, 0x01, 0x00, 0x47, 0x04, 0x07, 0x09, 0xAC, 0xFF, +/* 0000D8B0 */ 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x1F, 0x39, 0x05, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, +/* 0000D8C0 */ 0x19, 0x00, 0x28, 0x00, 0x54, 0x00, 0x08, 0x00, 0x37, 0x00, 0x1F, 0x00, 0x3B, 0x00, 0x00, 0xBF, +/* 0000D8D0 */ 0x5C, 0x94, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x62, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x6A, +/* 0000D8E0 */ 0x03, 0x17, 0xFE, 0xB3, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xB3, 0x37, 0xFB, +/* 0000D8F0 */ 0xFB, 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x05, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, +/* 0000D900 */ 0x09, 0x08, 0x01, 0x00, 0x01, 0x02, 0x01, 0x20, 0xAA, 0x8F, 0x01, 0x10, 0x0A, 0x00, 0x00, 0x07, +/* 0000D910 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x47, 0x07, +/* 0000D920 */ 0x0A, 0x47, 0x08, 0x03, 0x8F, 0x01, 0x27, 0x0A, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000D930 */ 0x5C, 0x01, 0x07, 0xEE, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x0F, 0x6C, 0x00, 0x0A, 0x09, 0x00, 0x00, +/* 0000D940 */ 0x8F, 0x01, 0x26, 0x0A, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0xEE, +/* 0000D950 */ 0x02, 0x0A, 0x0A, 0x02, 0x00, 0x0F, 0x03, 0x00, 0x0A, 0x09, 0x4D, 0x00, 0x8F, 0x01, 0x15, 0x0B, +/* 0000D960 */ 0x03, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x47, 0x0C, 0x07, 0x8F, +/* 0000D970 */ 0x01, 0x15, 0x0E, 0x03, 0x00, 0x6D, 0x0D, 0x0E, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5D, +/* 0000D980 */ 0x01, 0x04, 0x04, 0x00, 0x5D, 0x02, 0x05, 0x04, 0x00, 0xF2, 0x03, 0x0D, 0x0D, 0x01, 0x00, 0x00, +/* 0000D990 */ 0x00, 0x04, 0x00, 0x34, 0x0C, 0x0C, 0x0D, 0x00, 0x00, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x0A, 0x0A, +/* 0000D9A0 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x08, 0x0A, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, +/* 0000D9B0 */ 0x00, 0x24, 0x00, 0x17, 0x25, 0xFE, 0xD2, 0x37, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x29, +/* 0000D9C0 */ 0x00, 0x03, 0x00, 0x19, 0x00, 0x38, 0x00, 0x38, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x08, 0x00, 0x18, +/* 0000D9D0 */ 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x5E, 0x01, 0x1E, 0xA2, 0x41, 0xC1, +/* 0000D9E0 */ 0x00, 0xFE, 0x69, 0x03, 0x16, 0xFE, 0x3D, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 0000D9F0 */ 0x3D, 0x37, 0x5D, 0x5D, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x04, 0x08, +/* 0000DA00 */ 0x31, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, 0x05, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x0D, 0x05, 0x00, +/* 0000DA10 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, +/* 0000DA20 */ 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000DA30 */ 0x24, 0x00, 0xFE, 0x5C, 0x37, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x3D, 0x00, 0x00, 0xBF, +/* 0000DA40 */ 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x5A, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x68, +/* 0000DA50 */ 0x03, 0x15, 0xFE, 0xC6, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xC6, 0x36, 0x56, +/* 0000DA60 */ 0x56, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x04, 0x08, 0x31, 0xA8, 0x05, +/* 0000DA70 */ 0x14, 0x03, 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, 0x47, 0x00, 0x05, 0x09, 0x18, 0x00, +/* 0000DA80 */ 0x8F, 0x01, 0x10, 0x05, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, +/* 0000DA90 */ 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 0000DAA0 */ 0xE5, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x36, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, +/* 0000DAB0 */ 0x00, 0xC4, 0x00, 0xFE, 0x56, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x67, 0x03, 0x14, 0xFE, +/* 0000DAC0 */ 0x51, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x51, 0x36, 0x5C, 0x5C, 0x01, 0x03, +/* 0000DAD0 */ 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x04, 0x08, 0x31, 0xA8, 0x05, 0x15, 0x03, 0x00, +/* 0000DAE0 */ 0x03, 0x05, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x11, 0x05, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000DAF0 */ 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, +/* 0000DB00 */ 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x70, 0x36, 0x02, +/* 0000DB10 */ 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x3C, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, +/* 0000DB20 */ 0xFE, 0x4F, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x66, 0x03, 0x13, 0xFE, 0x78, 0x35, 0xFF, +/* 0000DB30 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x78, 0x35, 0xC0, 0xC0, 0x01, 0x04, 0x04, 0x06, 0x03, +/* 0000DB40 */ 0x17, 0x15, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x07, 0x08, 0x53, 0x14, 0x03, 0x00, +/* 0000DB50 */ 0x04, 0x02, 0x09, 0x1A, 0x00, 0x8F, 0x01, 0x09, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, 0x00, 0x07, +/* 0000DB60 */ 0x01, 0x00, 0x5C, 0x00, 0x07, 0xF2, 0x01, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, +/* 0000DB70 */ 0x06, 0x15, 0x03, 0x00, 0x04, 0x06, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x0E, 0x06, 0x01, 0x00, 0x07, +/* 0000DB80 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0xEE, 0x02, 0x06, 0x06, 0x01, 0x00, 0x47, 0x00, +/* 0000DB90 */ 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000DBA0 */ 0xFE, 0x57, 0x02, 0xFE, 0x97, 0x35, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x26, 0x00, 0x1A, +/* 0000DBB0 */ 0x00, 0x3E, 0x00, 0x2F, 0x00, 0x3C, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x31, 0xD4, 0x00, 0xFE, +/* 0000DBC0 */ 0x32, 0x01, 0x20, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0x3C, 0x03, 0x11, 0xFE, 0xAF, 0x31, 0xFF, 0x00, +/* 0000DBD0 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xAF, 0x31, 0xFE, 0x70, 0x03, 0xFE, 0x70, 0x03, 0x01, 0x07, +/* 0000DBE0 */ 0x05, 0x08, 0x06, 0x41, 0x41, 0x01, 0x02, 0x05, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, +/* 0000DBF0 */ 0x08, 0x08, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x01, 0x01, 0x4F, 0x05, 0x4F, 0x06, 0x8F, 0x01, 0x40, +/* 0000DC00 */ 0x09, 0x00, 0x00, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0B, 0x00, 0x8F, 0x01, 0x40, 0x00, +/* 0000DC10 */ 0x00, 0x00, 0x4B, 0x00, 0x09, 0xE1, 0x00, 0x8F, 0x01, 0x39, 0x09, 0x01, 0x00, 0x4B, 0x09, 0x0F, +/* 0000DC20 */ 0x03, 0x00, 0x09, 0x09, 0x82, 0x00, 0x8F, 0x01, 0x42, 0x09, 0x02, 0x00, 0x4B, 0x09, 0x0F, 0x15, +/* 0000DC30 */ 0x00, 0x09, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x05, 0x09, 0x03, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 0000DC40 */ 0x02, 0xEE, 0x01, 0xFF, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x3D, 0x09, 0x04, 0x00, 0x4B, 0x09, 0x07, +/* 0000DC50 */ 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x09, 0x09, 0x01, 0x00, 0x54, 0x05, 0x09, 0x8F, 0x01, +/* 0000DC60 */ 0x09, 0x0A, 0x05, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, +/* 0000DC70 */ 0x05, 0x8F, 0x01, 0x42, 0x0B, 0x02, 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, +/* 0000DC80 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x06, 0x09, 0x0F, 0x03, 0x00, 0x06, 0x09, 0x0F, 0x00, +/* 0000DC90 */ 0x98, 0x09, 0x06, 0x03, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x40, 0x09, 0x09, 0x06, 0x00, 0x01, +/* 0000DCA0 */ 0x32, 0x01, 0x01, 0x40, 0x05, 0x09, 0x43, 0x00, 0x8F, 0x01, 0x09, 0x0A, 0x05, 0x00, 0x6D, 0x09, +/* 0000DCB0 */ 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x8F, 0x01, 0x3D, 0x0B, 0x04, 0x00, 0x4B, 0x0B, +/* 0000DCC0 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0B, 0x0B, 0x04, 0x00, 0x5C, 0x01, 0x0B, 0xE0, +/* 0000DCD0 */ 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x98, +/* 0000DCE0 */ 0x09, 0x09, 0x04, 0x01, 0x00, 0x01, 0x32, 0x01, 0x01, 0x40, 0x09, 0x8F, 0x01, 0x40, 0x00, 0x00, +/* 0000DCF0 */ 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0x09, 0xFE, 0x65, +/* 0000DD00 */ 0x03, 0x00, 0xFE, 0xC5, 0x31, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x2B, 0x00, 0x0B, 0x00, +/* 0000DD10 */ 0x33, 0x00, 0x0F, 0x00, 0x26, 0x00, 0x0F, 0x00, 0x29, 0x00, 0x12, 0x00, 0x33, 0x00, 0x17, 0x00, +/* 0000DD20 */ 0x2C, 0x00, 0x2B, 0x00, 0x4D, 0x00, 0x07, 0x00, 0x5B, 0x00, 0x0F, 0x00, 0x49, 0x00, 0x09, 0x00, +/* 0000DD30 */ 0xCB, 0x00, 0x43, 0x00, 0x6D, 0x00, 0x0D, 0x00, 0x24, 0x00, 0x00, 0xBF, 0x7C, 0x85, 0xE1, 0x01, +/* 0000DD40 */ 0xC4, 0x04, 0xFE, 0x20, 0x01, 0x19, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3B, 0x03, 0x10, 0xFE, 0x8C, +/* 0000DD50 */ 0x2E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x8C, 0x2E, 0xFE, 0x91, 0x02, 0xFE, 0x91, +/* 0000DD60 */ 0x02, 0x01, 0x0C, 0x06, 0x10, 0x06, 0x41, 0x36, 0x18, 0x01, 0x01, 0x04, 0x04, 0x01, 0x01, 0x01, +/* 0000DD70 */ 0x01, 0x01, 0x0F, 0x64, 0xB5, 0x05, 0xFE, 0x64, 0x03, 0x08, 0x01, 0x00, 0x01, 0x01, 0xDC, 0xA8, +/* 0000DD80 */ 0x0D, 0xA8, 0x0E, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x0C, 0x00, 0x8F, 0x01, 0x2C, 0x11, 0x00, +/* 0000DD90 */ 0x00, 0x47, 0x10, 0x11, 0x09, 0x09, 0x00, 0x8F, 0x01, 0x2B, 0x11, 0x01, 0x00, 0x47, 0x10, 0x11, +/* 0000DDA0 */ 0x47, 0x0A, 0x10, 0x8F, 0x01, 0x0B, 0x10, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 0000DDB0 */ 0x01, 0x06, 0xEE, 0x02, 0x10, 0x10, 0x00, 0x00, 0x47, 0x0B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 0000DDC0 */ 0x03, 0xEE, 0x01, 0x10, 0x09, 0x01, 0x00, 0x47, 0x0C, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0B, +/* 0000DDD0 */ 0x10, 0x09, 0x06, 0x00, 0x47, 0x10, 0x0B, 0x09, 0x03, 0x00, 0x47, 0x10, 0x04, 0x47, 0x0B, 0x10, +/* 0000DDE0 */ 0x47, 0x0D, 0x04, 0xEB, 0x00, 0xEC, 0x00, 0x12, 0x03, 0x00, 0x0D, 0x0B, 0x09, 0x43, 0x00, 0x8F, +/* 0000DDF0 */ 0x01, 0x2E, 0x10, 0x03, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x98, 0x11, 0x06, 0x0D, 0x00, +/* 0000DE00 */ 0x00, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x08, 0x5C, 0x04, 0x0C, 0xEE, 0x05, 0x10, +/* 0000DE10 */ 0x10, 0x02, 0x00, 0x47, 0x0E, 0x10, 0x62, 0x10, 0x0E, 0x00, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x10, +/* 0000DE20 */ 0x11, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0xED, 0x00, 0x09, 0x2D, 0x00, 0x28, 0x0D, 0x0D, 0x09, +/* 0000DE30 */ 0xB3, 0xFF, 0xED, 0x00, 0x8F, 0x01, 0x2E, 0x10, 0x03, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, +/* 0000DE40 */ 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0A, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x5C, 0x04, 0x0C, 0xEE, 0x05, +/* 0000DE50 */ 0x00, 0x10, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x21, 0x02, 0xFE, 0xDB, +/* 0000DE60 */ 0x2E, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x58, 0x00, 0x18, 0x00, 0x34, 0x00, 0x0F, 0x00, +/* 0000DE70 */ 0x32, 0x00, 0x16, 0x00, 0x39, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x27, 0x00, +/* 0000DE80 */ 0x69, 0x00, 0x0E, 0x00, 0x35, 0x00, 0x08, 0x00, 0x4F, 0xFF, 0x08, 0x00, 0xE2, 0x00, 0x25, 0x00, +/* 0000DE90 */ 0x51, 0x00, 0x00, 0x3F, 0x5D, 0x8D, 0xE0, 0xB9, 0xD6, 0x12, 0xE8, 0x1E, 0xA2, 0x41, 0xC1, 0x00, +/* 0000DEA0 */ 0xFE, 0x3A, 0x03, 0x0D, 0xFE, 0xE0, 0x24, 0x02, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, +/* 0000DEB0 */ 0xE0, 0x24, 0xFE, 0x91, 0x09, 0xFE, 0x91, 0x09, 0x03, 0x0E, 0x0B, 0x15, 0x05, 0x71, 0x6A, 0x01, +/* 0000DEC0 */ 0x01, 0x09, 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, 0x13, 0x14, 0x15, 0x07, +/* 0000DED0 */ 0x08, 0x01, 0x01, 0x01, 0x00, 0x06, 0xFE, 0x5A, 0x03, 0x05, 0xFE, 0x5C, 0x03, 0x06, 0xFE, 0x5D, +/* 0000DEE0 */ 0x03, 0x06, 0xFE, 0x5E, 0x03, 0x06, 0xFE, 0x5F, 0x03, 0xFE, 0xC2, 0x01, 0x96, 0x03, 0x0B, 0x96, +/* 0000DEF0 */ 0x04, 0x0D, 0x4F, 0x11, 0x8F, 0x01, 0x09, 0x17, 0x00, 0x00, 0x6D, 0x16, 0x17, 0x00, 0x07, 0x02, +/* 0000DF00 */ 0x00, 0x5C, 0x00, 0x17, 0x93, 0x03, 0x18, 0x01, 0x00, 0x5C, 0x01, 0x18, 0xF2, 0x02, 0x16, 0x16, +/* 0000DF10 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0F, 0x16, 0x14, 0x03, 0x00, 0x0F, 0x02, 0x09, 0x1D, +/* 0000DF20 */ 0x00, 0x8F, 0x01, 0x2D, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x03, 0x17, +/* 0000DF30 */ 0x01, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0x16, 0x16, 0x01, 0x00, 0x47, 0x0F, 0x16, 0x0F, 0x03, +/* 0000DF40 */ 0x00, 0x0F, 0x09, 0x24, 0x00, 0x8F, 0x01, 0x0C, 0x16, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 0000DF50 */ 0x03, 0x8F, 0x01, 0x1C, 0x17, 0x04, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x00, 0x17, +/* 0000DF60 */ 0x5C, 0x03, 0x17, 0xEE, 0x04, 0xFF, 0x16, 0x02, 0x00, 0x8F, 0x01, 0x09, 0x17, 0x00, 0x00, 0x6D, +/* 0000DF70 */ 0x16, 0x17, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x93, 0x03, 0x18, 0x01, 0x00, 0x5C, 0x01, +/* 0000DF80 */ 0x18, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x01, 0x00, 0x00, 0x00, 0x03, +/* 0000DF90 */ 0x00, 0x98, 0x16, 0x16, 0x04, 0x00, 0x00, 0x96, 0x03, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, +/* 0000DFA0 */ 0x93, 0x03, 0x16, 0x01, 0x00, 0x5C, 0x01, 0x16, 0x5C, 0x02, 0x0E, 0xEE, 0x03, 0x16, 0x0C, 0x04, +/* 0000DFB0 */ 0x00, 0x47, 0x10, 0x16, 0x93, 0x04, 0x16, 0x05, 0x00, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, +/* 0000DFC0 */ 0x09, 0x34, 0x00, 0xCE, 0x16, 0x00, 0x00, 0x00, 0x96, 0x02, 0x16, 0x8F, 0x01, 0x0C, 0x16, 0x03, +/* 0000DFD0 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x1C, 0x17, 0x04, 0x00, 0x5C, 0x01, 0x17, +/* 0000DFE0 */ 0x5C, 0x02, 0x0F, 0xD4, 0x01, 0x17, 0x5C, 0x03, 0x17, 0xEE, 0x04, 0xFF, 0x16, 0x05, 0x00, 0x93, +/* 0000DFF0 */ 0x02, 0x16, 0x06, 0x00, 0x47, 0x0F, 0x16, 0x54, 0x11, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x6E, +/* 0000E000 */ 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x37, 0x00, 0x8F, 0x01, 0x0B, 0x16, 0x07, 0x00, 0x07, 0x02, +/* 0000E010 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x16, 0x16, 0x06, 0x00, 0x11, 0x03, 0x00, +/* 0000E020 */ 0x16, 0x05, 0x09, 0x1A, 0x00, 0x8F, 0x01, 0x39, 0x16, 0x08, 0x00, 0x4B, 0x16, 0x0F, 0x03, 0x00, +/* 0000E030 */ 0x16, 0x09, 0x07, 0x00, 0x2F, 0x10, 0x10, 0x06, 0x09, 0x04, 0x00, 0x2F, 0x10, 0x10, 0x07, 0x47, +/* 0000E040 */ 0x16, 0x10, 0x8F, 0x01, 0x0C, 0x17, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, +/* 0000E050 */ 0x1F, 0x18, 0x09, 0x00, 0x5C, 0x01, 0x18, 0x5C, 0x02, 0x0F, 0x5D, 0x03, 0x06, 0x07, 0x00, 0xEE, +/* 0000E060 */ 0x04, 0x17, 0x17, 0x07, 0x00, 0x2F, 0x16, 0x16, 0x17, 0x47, 0x10, 0x16, 0x09, 0x05, 0x00, 0xA8, +/* 0000E070 */ 0x16, 0x47, 0x10, 0x16, 0x8F, 0x01, 0x0A, 0x16, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, +/* 0000E080 */ 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x7B, 0x10, 0x17, +/* 0000E090 */ 0x02, 0x7B, 0x0F, 0x17, 0x03, 0x7B, 0x11, 0x17, 0x04, 0x5C, 0x01, 0x17, 0x5D, 0x02, 0x02, 0x08, +/* 0000E0A0 */ 0x00, 0xEE, 0x03, 0x00, 0x16, 0x08, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, +/* 0000E0B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, +/* 0000E0C0 */ 0x00, 0x3B, 0x02, 0x00, 0x00, 0x6F, 0x02, 0x00, 0x00, 0xFE, 0x2E, 0x02, 0xFE, 0x39, 0x02, 0xFE, +/* 0000E0D0 */ 0x21, 0x02, 0xFE, 0x3B, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x60, 0x03, 0xFE, 0x21, 0x02, 0xFE, 0x61, +/* 0000E0E0 */ 0x03, 0x0D, 0xFE, 0x62, 0x03, 0x00, 0xFE, 0x24, 0x25, 0x15, 0x08, 0x00, 0x00, 0x00, 0x25, 0x00, +/* 0000E0F0 */ 0x36, 0x00, 0x08, 0x00, 0x81, 0x00, 0x1D, 0x00, 0x3A, 0x00, 0x07, 0x00, 0x1B, 0x00, 0x24, 0x00, +/* 0000E100 */ 0x53, 0x02, 0x31, 0x00, 0x49, 0x00, 0x1A, 0x00, 0x37, 0x00, 0x0F, 0x00, 0x50, 0x00, 0x08, 0x00, +/* 0000E110 */ 0x1F, 0x00, 0x24, 0x00, 0xB8, 0x01, 0x08, 0x00, 0xF9, 0x00, 0x03, 0x00, 0x29, 0x00, 0x07, 0x00, +/* 0000E120 */ 0x1C, 0x00, 0x24, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x2E, 0x00, 0x07, 0x00, 0x3E, 0x00, 0x04, 0x00, +/* 0000E130 */ 0x40, 0x00, 0x30, 0x00, 0x5C, 0x00, 0x05, 0x00, 0x29, 0x00, 0x38, 0x00, 0x99, 0x00, 0x00, 0x29, +/* 0000E140 */ 0xE2, 0x00, 0x00, 0x47, 0xE1, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x11, 0xC4, 0x00, 0xFD, 0x3D, +/* 0000E150 */ 0xA2, 0x41, 0xD1, 0x00, 0x0F, 0xFE, 0xA3, 0x29, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 0000E160 */ 0xA3, 0x29, 0xFE, 0x77, 0x01, 0xFE, 0x77, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, 0x02, +/* 0000E170 */ 0x01, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x08, 0x01, 0xFF, 0x89, 0x8F, +/* 0000E180 */ 0x02, 0x09, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, +/* 0000E190 */ 0x01, 0x05, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, +/* 0000E1A0 */ 0x00, 0x00, 0x47, 0x06, 0x09, 0x98, 0x09, 0x06, 0x02, 0x00, 0x00, 0x47, 0x07, 0x09, 0x8F, 0x02, +/* 0000E1B0 */ 0x0C, 0x09, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, 0x1D, 0x0A, 0x02, 0x00, +/* 0000E1C0 */ 0x5C, 0x01, 0x0A, 0x8F, 0x01, 0x04, 0x0A, 0x03, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x07, 0xEE, +/* 0000E1D0 */ 0x04, 0x09, 0x09, 0x01, 0x00, 0x15, 0x03, 0x00, 0x09, 0x04, 0x09, 0x27, 0x00, 0x8F, 0x02, 0x0C, +/* 0000E1E0 */ 0x09, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, 0x1E, 0x0A, 0x04, 0x00, 0x5C, +/* 0000E1F0 */ 0x01, 0x0A, 0x8F, 0x01, 0x02, 0x0A, 0x05, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x05, 0xEE, 0x04, +/* 0000E200 */ 0xFF, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0x0E, 0xFE, 0x63, 0x03, 0x00, +/* 0000E210 */ 0xFE, 0xC7, 0x29, 0x05, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x7A, 0x00, 0x09, 0x00, 0x24, 0x00, +/* 0000E220 */ 0x2F, 0x00, 0x5F, 0x00, 0x29, 0x00, 0x55, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, +/* 0000E230 */ 0xF0, 0x3C, 0xA2, 0x41, 0xD1, 0x00, 0x0E, 0xFE, 0x60, 0x26, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, +/* 0000E240 */ 0x02, 0xFE, 0x60, 0x26, 0x7D, 0x7D, 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x01, 0x03, +/* 0000E250 */ 0x06, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x08, 0x38, 0x8F, 0x02, 0x0C, 0x07, 0x00, +/* 0000E260 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x02, 0x23, 0x08, 0x01, 0x00, 0x5C, 0x01, 0x08, +/* 0000E270 */ 0x8F, 0x01, 0x03, 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, +/* 0000E280 */ 0x5D, 0x04, 0x03, 0x00, 0x00, 0xEE, 0x05, 0x07, 0x07, 0x00, 0x00, 0x94, 0x01, 0x03, 0x07, 0xA8, +/* 0000E290 */ 0x00, 0x24, 0x00, 0xFE, 0x84, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x58, 0x00, 0x00, +/* 0000E2A0 */ 0x3F, 0x5C, 0x85, 0xE0, 0x01, 0xC4, 0x02, 0xCF, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x39, 0x03, +/* 0000E2B0 */ 0x0B, 0xFE, 0xAF, 0x20, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xAF, 0x20, 0xFE, +/* 0000E2C0 */ 0x11, 0x04, 0xFE, 0x11, 0x04, 0x07, 0x05, 0x09, 0x04, 0x2A, 0x29, 0x01, 0x01, 0x04, 0x03, 0x03, +/* 0000E2D0 */ 0x03, 0x03, 0x03, 0x08, 0x08, 0x01, 0x00, 0x06, 0xFE, 0x5A, 0x03, 0xA2, 0x4F, 0x06, 0x4F, 0x07, +/* 0000E2E0 */ 0x8F, 0x01, 0x43, 0x09, 0x00, 0x00, 0x4B, 0x09, 0x0F, 0x15, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8F, +/* 0000E2F0 */ 0x01, 0x05, 0x09, 0x01, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x09, 0x00, +/* 0000E300 */ 0x00, 0x8F, 0x01, 0x09, 0x0A, 0x02, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000E310 */ 0x0A, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x43, 0x0B, 0x00, 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0xF2, +/* 0000E320 */ 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x06, 0x09, 0x0F, 0x08, 0x00, 0x06, +/* 0000E330 */ 0x09, 0x00, 0x00, 0xA8, 0x00, 0x09, 0x44, 0x00, 0x98, 0x0B, 0x06, 0x03, 0x00, 0x00, 0x6D, 0x0A, +/* 0000E340 */ 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5D, 0x01, 0x04, 0x02, 0x00, 0xF2, 0x02, 0x0A, +/* 0000E350 */ 0x0A, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6D, 0x09, 0x0A, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000E360 */ 0x0A, 0xD4, 0x00, 0x0B, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x03, +/* 0000E370 */ 0x00, 0x54, 0x07, 0x09, 0x47, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, +/* 0000E380 */ 0x02, 0xFE, 0x78, 0x01, 0xB1, 0xFE, 0xCB, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x24, +/* 0000E390 */ 0x00, 0x12, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x4B, 0x00, 0x07, 0x00, 0x1A, 0x00, 0x05, 0x00, 0x5C, +/* 0000E3A0 */ 0x02, 0x3C, 0x00, 0xCD, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0xAE, 0xE3, 0x00, 0x00, 0xBF, 0x4C, +/* 0000E3B0 */ 0x00, 0x00, 0x00, 0xC0, 0x01, 0xE2, 0x36, 0xA2, 0x41, 0xD0, 0x00, 0x0C, 0xFE, 0x01, 0x10, 0xFE, +/* 0000E3C0 */ 0x09, 0x24, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x09, 0x24, 0x0A, 0x0A, 0x01, 0x02, +/* 0000E3D0 */ 0x02, 0x03, 0x0A, 0x0A, 0x01, 0x17, 0xAC, 0x03, 0x0F, 0x02, 0x00, 0x02, 0xAB, 0x03, 0xAC, 0x00, +/* 0000E3E0 */ 0x0F, 0x02, 0x00, 0x03, 0xAB, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x10, 0x24, +/* 0000E3F0 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x21, 0xD4, +/* 0000E400 */ 0x00, 0xB8, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x5B, 0x03, 0x0A, 0xFE, 0x1C, 0x1C, 0xFF, 0x00, +/* 0000E410 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x1C, 0x1C, 0xFE, 0x73, 0x04, 0xFE, 0x73, 0x04, 0x01, 0x09, +/* 0000E420 */ 0x09, 0x0D, 0x04, 0x58, 0x4C, 0x01, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0x0C, 0x0D, +/* 0000E430 */ 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x03, +/* 0000E440 */ 0xFE, 0x58, 0x01, 0x4F, 0x0A, 0x4F, 0x0B, 0x8F, 0x01, 0x09, 0x0F, 0x00, 0x00, 0x62, 0x0F, 0x0F, +/* 0000E450 */ 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xF2, 0x02, +/* 0000E460 */ 0x0E, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0A, 0x0E, 0xA8, 0x0E, 0x14, 0x03, 0x00, +/* 0000E470 */ 0x0A, 0x0E, 0x09, 0x07, 0x01, 0x8F, 0x01, 0x09, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x02, 0x07, +/* 0000E480 */ 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x02, 0x00, 0x00, 0x00, +/* 0000E490 */ 0x01, 0x00, 0x47, 0x0A, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x9D, 0x00, 0x8F, 0x01, 0x42, +/* 0000E4A0 */ 0x0E, 0x01, 0x00, 0x4B, 0x0E, 0x0F, 0x15, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x05, 0x0E, +/* 0000E4B0 */ 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0xEE, 0x01, 0xFF, 0x0E, 0x02, 0x00, 0x8F, 0x01, +/* 0000E4C0 */ 0x09, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, +/* 0000E4D0 */ 0x09, 0x8F, 0x01, 0x42, 0x10, 0x01, 0x00, 0x4B, 0x10, 0x5C, 0x02, 0x10, 0xF2, 0x03, 0x0E, 0x0E, +/* 0000E4E0 */ 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0B, 0x0E, 0x98, 0x0E, 0x0B, 0x04, 0x00, 0x00, 0x98, +/* 0000E4F0 */ 0x0F, 0x0B, 0x05, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x10, 0x00, 0x98, 0x10, 0x0B, 0x05, +/* 0000E500 */ 0x02, 0x00, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, +/* 0000E510 */ 0x0E, 0x0E, 0x0F, 0x98, 0x0F, 0x0B, 0x08, 0x03, 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x10, 0x00, +/* 0000E520 */ 0x98, 0x10, 0x0B, 0x08, 0x04, 0x00, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, 0x00, +/* 0000E530 */ 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x47, 0x0A, 0x0E, 0x8F, 0x01, 0x09, 0x0F, 0x00, 0x00, +/* 0000E540 */ 0x62, 0x0F, 0x0F, 0x00, 0x6D, 0x0E, 0x0F, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, +/* 0000E550 */ 0x09, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0A, 0x10, 0x09, 0x0E, 0x00, 0x8F, 0x01, 0x3A, 0x11, 0x03, +/* 0000E560 */ 0x00, 0x4B, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x0A, 0x5C, 0x02, 0x10, 0xF2, +/* 0000E570 */ 0x03, 0xFF, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x15, 0x00, 0x8F, 0x01, 0x3A, 0x0E, +/* 0000E580 */ 0x03, 0x00, 0x4B, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0x05, 0x00, 0xA8, 0x0E, 0x47, 0x0A, +/* 0000E590 */ 0x0E, 0x47, 0x00, 0x0A, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x18, 0x03, 0xFE, 0xB7, +/* 0000E5A0 */ 0x01, 0xFE, 0x2B, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0xBA, 0x01, 0xFE, 0x46, 0x1C, 0x0D, 0x04, 0x00, +/* 0000E5B0 */ 0x00, 0x00, 0x24, 0x00, 0x53, 0x00, 0x0A, 0x00, 0x30, 0x00, 0x20, 0x00, 0x51, 0x00, 0x08, 0x00, +/* 0000E5C0 */ 0x2F, 0x00, 0x0F, 0x00, 0x2D, 0x00, 0x12, 0x00, 0x3A, 0x00, 0x2B, 0x00, 0xB1, 0x00, 0x51, 0x00, +/* 0000E5D0 */ 0x34, 0x01, 0x42, 0x00, 0x80, 0x00, 0x10, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2E, 0x00, 0x08, 0x00, +/* 0000E5E0 */ 0x1B, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x21, 0xD4, 0x00, 0x9D, 0x1F, 0xA2, 0x41, 0xC1, 0x00, +/* 0000E5F0 */ 0xFE, 0x59, 0x03, 0x09, 0xFE, 0x76, 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x76, +/* 0000E600 */ 0x17, 0xFE, 0x86, 0x04, 0xFE, 0x86, 0x04, 0x01, 0x0A, 0x09, 0x0E, 0x04, 0x61, 0x54, 0x01, 0x05, +/* 0000E610 */ 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0x0D, 0x0E, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, 0x06, +/* 0000E620 */ 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x03, 0xFE, 0x77, 0x01, 0x4F, 0x0C, 0x8F, 0x01, +/* 0000E630 */ 0x09, 0x10, 0x00, 0x00, 0x62, 0x10, 0x10, 0x00, 0x6D, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, +/* 0000E640 */ 0x00, 0x10, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, +/* 0000E650 */ 0x0B, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x07, 0x01, 0x8F, 0x01, 0x09, 0x10, +/* 0000E660 */ 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xF2, +/* 0000E670 */ 0x02, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0B, +/* 0000E680 */ 0x02, 0x09, 0x9D, 0x00, 0x8F, 0x01, 0x42, 0x0F, 0x01, 0x00, 0x4B, 0x0F, 0x0F, 0x15, 0x00, 0x0F, +/* 0000E690 */ 0x09, 0x00, 0x00, 0x8F, 0x01, 0x05, 0x0F, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0xEE, +/* 0000E6A0 */ 0x01, 0xFF, 0x0F, 0x02, 0x00, 0x8F, 0x01, 0x09, 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x03, 0x07, +/* 0000E6B0 */ 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x42, 0x11, 0x01, 0x00, 0x4B, 0x11, +/* 0000E6C0 */ 0x5C, 0x02, 0x11, 0xF2, 0x03, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0C, 0x0F, +/* 0000E6D0 */ 0x98, 0x0F, 0x0C, 0x04, 0x00, 0x00, 0x98, 0x10, 0x0C, 0x05, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x10, +/* 0000E6E0 */ 0x09, 0x10, 0x00, 0x98, 0x11, 0x0C, 0x05, 0x02, 0x00, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, +/* 0000E6F0 */ 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x98, 0x10, 0x0C, 0x08, 0x03, 0x00, +/* 0000E700 */ 0x0F, 0x03, 0x00, 0x10, 0x09, 0x10, 0x00, 0x98, 0x11, 0x0C, 0x08, 0x04, 0x00, 0x2F, 0x11, 0x06, +/* 0000E710 */ 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x47, 0x0B, +/* 0000E720 */ 0x0F, 0x8F, 0x01, 0x09, 0x10, 0x00, 0x00, 0x62, 0x10, 0x10, 0x00, 0x6D, 0x0F, 0x10, 0x04, 0x07, +/* 0000E730 */ 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xA8, 0x11, 0x14, 0x03, 0x00, 0x0B, 0x11, 0x09, +/* 0000E740 */ 0x0E, 0x00, 0x8F, 0x01, 0x3A, 0x12, 0x03, 0x00, 0x4B, 0x12, 0x47, 0x11, 0x12, 0x09, 0x03, 0x00, +/* 0000E750 */ 0x47, 0x11, 0x0B, 0x5C, 0x02, 0x11, 0xF2, 0x03, 0xFF, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, +/* 0000E760 */ 0x09, 0x15, 0x00, 0x8F, 0x01, 0x3A, 0x0F, 0x03, 0x00, 0x4B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, +/* 0000E770 */ 0x09, 0x05, 0x00, 0xA8, 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0A, 0x09, 0x09, 0x09, 0x00, +/* 0000E780 */ 0x47, 0x00, 0x0B, 0x09, 0x1B, 0x00, 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x0B, 0x09, 0x08, +/* 0000E790 */ 0x00, 0xA8, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, +/* 0000E7A0 */ 0x00, 0x24, 0x00, 0xFE, 0x19, 0x03, 0xFE, 0xB7, 0x01, 0xFE, 0x2C, 0x02, 0xFE, 0x39, 0x02, 0xFE, +/* 0000E7B0 */ 0xBA, 0x01, 0xFE, 0xA1, 0x17, 0x11, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x46, 0x00, 0x0A, 0x00, +/* 0000E7C0 */ 0x30, 0x00, 0x20, 0x00, 0x44, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x0F, 0x00, 0x2D, 0x00, 0x12, 0x00, +/* 0000E7D0 */ 0x3A, 0x00, 0x2B, 0x00, 0x52, 0x00, 0x51, 0x00, 0x0C, 0x01, 0x42, 0x00, 0x73, 0x00, 0x10, 0x00, +/* 0000E7E0 */ 0x30, 0x00, 0x05, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x26, 0x00, 0x08, 0x00, +/* 0000E7F0 */ 0x34, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x25, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, +/* 0000E800 */ 0xC4, 0x00, 0x99, 0x1C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x38, 0x03, 0x08, 0xFE, 0x03, 0x17, 0xFF, +/* 0000E810 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x03, 0x17, 0x51, 0x51, 0x01, 0x05, 0x02, 0x05, 0x04, +/* 0000E820 */ 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x27, 0x8F, 0x01, 0x09, 0x06, 0x00, +/* 0000E830 */ 0x00, 0x6D, 0x05, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x03, 0x5C, 0x02, +/* 0000E840 */ 0x02, 0xF2, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000E850 */ 0x24, 0x00, 0xFE, 0xA7, 0x02, 0xFE, 0x20, 0x17, 0x02, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x33, +/* 0000E860 */ 0x00, 0x00, 0xBF, 0x4C, 0x00, 0xE0, 0x01, 0xC0, 0x00, 0x93, 0x1C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, +/* 0000E870 */ 0x37, 0x03, 0x07, 0xFE, 0x69, 0x16, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x69, 0x16, +/* 0000E880 */ 0x7B, 0x7B, 0x41, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, 0x00, +/* 0000E890 */ 0x00, 0xF9, 0x7F, 0xFD, 0xDF, 0xC1, 0x04, 0x00, 0x00, 0x40, 0xFE, 0x7F, 0xFD, 0xDF, 0xC1, 0x1E, +/* 0000E8A0 */ 0x62, 0x05, 0x04, 0x00, 0x14, 0x0F, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0x62, 0x05, 0x04, 0x00, +/* 0000E8B0 */ 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, 0x02, 0x00, 0x23, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x31, +/* 0000E8C0 */ 0x01, 0xFE, 0x81, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x4A, 0x00, 0x04, 0x00, 0x18, +/* 0000E8D0 */ 0x00, 0x00, 0xBF, 0x7C, 0x05, 0x01, 0x00, 0xC0, 0x04, 0x88, 0x1B, 0xA2, 0x41, 0xC1, 0x00, 0xFE, +/* 0000E8E0 */ 0x36, 0x03, 0x06, 0xFE, 0x10, 0x15, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x10, 0x15, +/* 0000E8F0 */ 0xD5, 0xD5, 0x41, 0x06, 0x05, 0x09, 0x03, 0x15, 0x13, 0x10, 0x01, 0x01, 0x01, 0x01, 0x05, 0x3C, +/* 0000E900 */ 0x01, 0x00, 0x08, 0x01, 0x01, 0x40, 0x4F, 0x08, 0x47, 0x08, 0x02, 0xEB, 0x00, 0xEC, 0x00, 0x12, +/* 0000E910 */ 0x03, 0x00, 0x08, 0x06, 0x09, 0x29, 0x00, 0xBA, 0x09, 0x08, 0x05, 0x0F, 0x03, 0x00, 0x09, 0x09, +/* 0000E920 */ 0x18, 0x00, 0x47, 0x09, 0x07, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x98, 0x0A, 0x05, 0x08, 0x00, +/* 0000E930 */ 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0xFF, 0x09, 0x00, 0x00, 0x28, 0x08, 0x08, 0x09, 0xCD, 0xFF, +/* 0000E940 */ 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x37, 0x15, 0x06, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, +/* 0000E950 */ 0x20, 0x00, 0x08, 0x00, 0x20, 0x00, 0x0B, 0x00, 0x26, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x0A, 0x00, +/* 0000E960 */ 0x19, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x21, 0xD4, 0x00, 0x7B, 0x22, 0xA2, 0x41, 0xC1, 0x00, +/* 0000E970 */ 0xFE, 0x49, 0x03, 0x05, 0xFE, 0x87, 0x13, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x87, +/* 0000E980 */ 0x13, 0xFE, 0x6B, 0x01, 0xFE, 0x6B, 0x01, 0x01, 0x08, 0x04, 0x08, 0x04, 0x2A, 0x27, 0x01, 0x03, +/* 0000E990 */ 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x07, 0x08, 0x07, 0x08, 0x98, 0x4F, 0x05, 0x4F, 0x06, 0x8F, +/* 0000E9A0 */ 0x01, 0x09, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0x5C, +/* 0000E9B0 */ 0x01, 0x04, 0xF2, 0x02, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x05, 0x09, 0x14, +/* 0000E9C0 */ 0x03, 0x00, 0x05, 0x02, 0x09, 0x62, 0x00, 0x8F, 0x01, 0x44, 0x09, 0x01, 0x00, 0x4B, 0x09, 0x0F, +/* 0000E9D0 */ 0x15, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x05, 0x09, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, +/* 0000E9E0 */ 0x00, 0x03, 0xEE, 0x01, 0xFF, 0x09, 0x01, 0x00, 0x8F, 0x01, 0x09, 0x0A, 0x00, 0x00, 0x6D, 0x09, +/* 0000E9F0 */ 0x0A, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x44, 0x0B, 0x01, +/* 0000EA00 */ 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 0000EA10 */ 0x47, 0x06, 0x09, 0xAC, 0x09, 0x0F, 0x02, 0x00, 0x06, 0xAB, 0x09, 0xAC, 0x00, 0x0F, 0x02, 0x00, +/* 0000EA20 */ 0x09, 0xAB, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, +/* 0000EA30 */ 0x00, 0x24, 0x00, 0xFE, 0x28, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0xA4, 0x13, 0x08, 0x04, 0x00, 0x00, +/* 0000EA40 */ 0x00, 0x20, 0x00, 0x40, 0x00, 0x08, 0x00, 0x23, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x12, 0x00, 0x32, +/* 0000EA50 */ 0x00, 0x2B, 0x00, 0x4A, 0x00, 0x16, 0x00, 0x2D, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, 0x5C, +/* 0000EA60 */ 0x8C, 0xE0, 0x01, 0xC4, 0x00, 0x6E, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x48, 0x03, 0x04, 0xFE, +/* 0000EA70 */ 0x78, 0x11, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x78, 0x11, 0xFE, 0xEA, 0x01, 0xFE, +/* 0000EA80 */ 0xEA, 0x01, 0x41, 0x06, 0x05, 0x09, 0x04, 0x14, 0x12, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, +/* 0000EA90 */ 0x03, 0x08, 0x07, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0x58, 0x03, 0x49, 0x4F, 0x07, 0x8F, 0x01, +/* 0000EAA0 */ 0x09, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, +/* 0000EAB0 */ 0x05, 0x5C, 0x02, 0x06, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, +/* 0000EAC0 */ 0x09, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x18, 0x00, 0x77, 0x03, 0x05, 0x01, 0x47, 0x09, 0x05, +/* 0000EAD0 */ 0xCE, 0x0A, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x04, 0x0A, 0xA1, 0x01, 0x03, 0x0A, 0x77, 0x0A, 0x09, +/* 0000EAE0 */ 0x02, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x27, 0x02, 0xFE, 0xA7, +/* 0000EAF0 */ 0x11, 0x05, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4F, 0x00, 0x08, 0x00, 0x71, 0x00, 0x04, 0x00, +/* 0000EB00 */ 0x33, 0x00, 0x16, 0x00, 0xC7, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0x5D, 0x1D, +/* 0000EB10 */ 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0x47, 0x03, 0x03, 0xFE, 0x8D, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000EB20 */ 0x01, 0x01, 0xFE, 0x8D, 0x0F, 0xFE, 0xC9, 0x01, 0xFE, 0xC9, 0x01, 0x01, 0x04, 0x03, 0x05, 0x02, +/* 0000EB30 */ 0x1D, 0x1D, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x05, 0xFE, 0x57, 0x03, 0x6F, 0x4F, +/* 0000EB40 */ 0x03, 0x8F, 0x01, 0x3C, 0x05, 0x00, 0x00, 0x4B, 0x05, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x1C, 0x00, +/* 0000EB50 */ 0x8F, 0x01, 0x09, 0x05, 0x01, 0x00, 0x62, 0x05, 0x05, 0x00, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x0B, +/* 0000EB60 */ 0x00, 0x8F, 0x01, 0x3C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x40, 0x00, 0x8F, 0x01, 0x09, 0x06, +/* 0000EB70 */ 0x01, 0x00, 0x6D, 0x05, 0x06, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x06, 0xF2, 0x01, 0x05, 0x05, +/* 0000EB80 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x03, 0x05, 0x0F, 0x0C, 0x00, 0x03, 0x09, 0x00, 0x00, +/* 0000EB90 */ 0x01, 0x32, 0x01, 0x01, 0x3C, 0x02, 0x09, 0x06, 0x00, 0x01, 0x32, 0x01, 0x01, 0x3C, 0x03, 0x8F, +/* 0000EBA0 */ 0x01, 0x3C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x17, +/* 0000EBB0 */ 0x03, 0xFE, 0x2D, 0x02, 0xFE, 0xA3, 0x0F, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x39, 0x00, +/* 0000EBC0 */ 0x0B, 0x00, 0x2B, 0x00, 0x1D, 0x00, 0x34, 0x00, 0x07, 0x00, 0x9C, 0x00, 0x09, 0x00, 0x35, 0x00, +/* 0000EBD0 */ 0x06, 0x00, 0x2D, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, +/* 0000EBE0 */ 0x3B, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x2B, 0x03, 0x02, 0xFE, 0xC9, 0x09, 0xFF, 0x00, 0x10, +/* 0000EBF0 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xC9, 0x09, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, +/* 0000EC00 */ 0x01, 0x02, 0x02, 0x07, 0x07, 0x08, 0x39, 0x8F, 0x01, 0x1A, 0x08, 0x00, 0x00, 0x07, 0x04, 0x00, +/* 0000EC10 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8F, 0x01, 0x0A, 0x09, 0x01, 0x00, 0x07, +/* 0000EC20 */ 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x5D, 0x02, 0x02, 0x01, 0x00, 0xEE, 0x03, 0x09, +/* 0000EC30 */ 0x09, 0x01, 0x00, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x08, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000EC40 */ 0xFE, 0xF4, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x46, 0x00, 0x00}; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h index 3fe355af6fe..f2000f59e18 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h +++ b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h @@ -84,6 +84,17 @@ var isFinite = platform.builtInGlobalObjectEntryIsFinite; var isNaN = platform.builtInGlobalObjectEntryIsNaN; + // Keep this "enum" in sync with IntlEngineInterfaceExtensionObject::EntryIntl_RegisterBuiltInFunction + const IntlBuiltInFunctionID = setPrototype({ + MIN: 0, + DateToLocaleString: 0, + DateToLocaleDateString: 1, + DateToLocaleTimeString: 2, + NumberToLocaleString: 3, + StringLocaleCompare: 4, + MAX: 5 + }, null); + let __defaultLocale = undefined; const GetDefaultLocale = function () { if (__defaultLocale && platform.useCaches) { @@ -102,15 +113,6 @@ return __defaultLocale; }; - let CacheNumberFormat = function (numberFormat) { - let retVal = platform.cacheNumberFormat(numberFormat); - if (retVal === null) { - // TODO (doilij): remove this fallback when implemented under ICU - numberFormat.__numberingSystem = ""; - } - // no return value - }; - let CreateDateTimeFormat = function (dateTimeFormat, condition) { let retVal = platform.createDateTimeFormat(dateTimeFormat, condition); if (retVal === null) { @@ -609,22 +611,19 @@ // which allows us to display the correct error message for each Intl type. const collator_supportedLocalesOf_name = "Intl.Collator.supportedLocalesOf"; const collator_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(collator_supportedLocalesOf_name, - function collator_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function collator_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, collator_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const numberFormat_supportedLocalesOf_name = "Intl.NumberFormat.supportedLocalesOf"; const numberFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(numberFormat_supportedLocalesOf_name, - function numberFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function numberFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, numberFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const dateTimeFormat_supportedLocalesOf_name = "Intl.DateTimeFormat.supportedLocalesOf"; const dateTimeFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(dateTimeFormat_supportedLocalesOf_name, - function dateTimeFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function dateTimeFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, dateTimeFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); @@ -871,30 +870,22 @@ var stateObject = setPrototype({}, null); InitializeCollator(stateObject, arguments[1], arguments[2]); return Number(platform.compareString(thisArg, that, stateObject.__localeForCompare, stateObject.__sensitivity, stateObject.__ignorePunctuation, stateObject.__numeric)); - }), 4); + }), IntlBuiltInFunctionID.StringLocaleCompare); if (InitType === 'Intl') { - function Collator() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function Collator(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new Collator(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("Collator"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1114,9 +1105,8 @@ try { // Cache api instance and update numbering system on the object - CacheNumberFormat(numberFormat); - } - catch (e) { + platform.cacheNumberFormat(numberFormat); + } catch (e) { throwExIfOOMOrSOE(e); // Generic message to cover the exception throw from the platform. // The platform's exception is also generic and in most if not all cases specifies that "a" argument is invalid. @@ -1124,8 +1114,7 @@ platform.raiseOptionValueOutOfRange(); } - if (!numberFormat.__numberingSystem) - { + if (!numberFormat.__numberingSystem) { numberFormat.__numberingSystem = "latn"; // assume Latin numerals by default } @@ -1144,18 +1133,10 @@ var n = Internal.ToNumber(this); // Need to special case the '-0' case to format as 0 instead of -0. return String(platform.formatNumber(n === -0 ? 0 : n, stateObject)); - }), 3); + }), IntlBuiltInFunctionID.NumberToLocaleString); if (InitType === 'Intl') { - function NumberFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - let locales = undefined; - let options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function NumberFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new NumberFormat(locales, options); } @@ -1609,66 +1590,100 @@ dateTimeFormat.__initializedDateTimeFormat = true; } - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleString", "Date"); - } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; - } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "any", "all")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 0); + // caches for objects constructed with default parameters for each method + let __DateInstanceToLocaleStringDefaultCache = [undefined, undefined, undefined]; + const __DateInstanceToLocaleStringDefaultCacheSlot = setPrototype({ + toLocaleString: 0, + toLocaleDateString: 1, + toLocaleTimeString: 2 + }, null); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleDateString", function () { + function DateInstanceToLocaleStringImplementation(name, option1, option2, cacheSlot, locales, options) { if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleDateString", "Date"); + platform.raiseNeedObjectOfType(name, "Date"); } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); + let value = callInstanceFunc(DateInstanceGetDate, new Date(this)); if (isNaN(value) || !isFinite(value)) { return "Invalid Date"; } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "date", "date")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 1); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleTimeString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleTimeString", "Date"); + let stateObject = undefined; + if (platform.useCaches && !locales && !options) { + // All default parameters (locales and options): this is the most valuable case to cache. + if (__DateInstanceToLocaleStringDefaultCache[cacheSlot]) { + // retrieve cached value + stateObject = __DateInstanceToLocaleStringDefaultCache[cacheSlot]; + } else { + // populate cache + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, undefined, ToDateTimeOptions(undefined, option1, option2)); + __DateInstanceToLocaleStringDefaultCache[cacheSlot] = stateObject; + } } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; + + if (!stateObject) { + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, locales, ToDateTimeOptions(options, option1, option2)); } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "time", "time")); + return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 2); + } - if (InitType === 'Intl') { - function DateTimeFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; + // Note: tagPublicFunction (platform.tagPublicLibraryCode) messes with declared name of the FunctionBody so that + // the functions called appear correctly in the debugger and stack traces. Thus, we we cannot call tagPublicFunction in a loop. + // Each entry point needs to have its own unique FunctionBody (which is a function as defined in the source code); + // this is why we have seemingly repeated ourselves below, instead of having one function and calling it multiple times with + // different parameters. + // + // The following invocations of `platform.registerBuiltInFunction(tagPublicFunction(name, entryPoint))` are enclosed in IIFEs. + // The IIFEs are used to group all of the meaningful differences between each entry point into the arguments to the IIFE. + // The exception to this are the different entryPoint names which are only significant for debugging (and cannot be passed in + // as arguments, as the name is intrinsic to the function declaration). + // + // The `date_toLocale*String_entryPoint` function names are placeholder names that will never be seen from user code. + // The function name property and FunctionBody declared name are overwritten by `tagPublicFunction`. + // The fact that they are declared with unique names is helpful for debugging. + // The functions *must not* be declared as anonymous functions (must be declared with a name); + // converting from an unnnamed function to a named function is not readily supported by the platform code and + // this has caused us to hit assertions in debug builds in the past. + // + // See invocations of `tagPublicFunction` on the `supportedLocalesOf` entry points for a similar pattern. + // + // The entryPoint functions will be called as `Date.prototype.toLocale*String` and thus their `this` parameters will be a Date. + // `DateInstanceToLocaleStringImplementation` is not on `Date.prototype`, so we must propagate `this` into the call by using + // `DateInstanceToLocaleStringImplementation.call(this, ...)`. + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleString", "any", "all", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleString, IntlBuiltInFunctionID.DateToLocaleString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleDateString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleDateString", "date", "date", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleDateString, IntlBuiltInFunctionID.DateToLocaleDateString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleTimeString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleTimeString", "time", "time", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleTimeString, IntlBuiltInFunctionID.DateToLocaleTimeString); + if (InitType === 'Intl') { + function DateTimeFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new DateTimeFormat(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("DateTimeFormat"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1684,23 +1699,27 @@ } tagPublicFunction("Intl.DateTimeFormat", DateTimeFormat); - function format() { + function format(date) { if (typeof this !== 'object') { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - var hiddenObject = platform.getHiddenObject(this); + let hiddenObject = platform.getHiddenObject(this); if (hiddenObject === undefined || !hiddenObject.__initializedDateTimeFormat) { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - if (arguments.length >= 1) { - if (isNaN(arguments[0]) || !isFinite(arguments[0])) { - platform.raiseInvalidDate(); - } - return String(platform.formatDateTime(Internal.ToNumber(arguments[0]), hiddenObject)); + if (date !== undefined && (isNaN(date) || !isFinite(date))) { + platform.raiseInvalidDate(); + } + + let dateValue = undefined; + if (date !== undefined) { + dateValue = Internal.ToNumber(date) + } else { + dateValue = DateNow(); } - return String(platform.formatDateTime(DateNow(), hiddenObject)); + return String(platform.formatDateTime(dateValue, hiddenObject)); } tagPublicFunction("Intl.DateTimeFormat.prototype.format", format); @@ -1782,4686 +1801,3786 @@ namespace Js { const char Library_Bytecode_Intl[] = { -/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x85, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFE, 0xD7, 0x02, 0x00, 0xFF, -/* 00000020 */ 0x94, 0x5D, 0x01, 0x00, 0xFF, 0x94, 0x5D, 0x01, 0x00, 0x39, 0x00, 0x00, 0x00, 0x40, 0x32, 0x00, -/* 00000030 */ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x69, 0x00, 0x00, 0xFE, 0x70, 0x01, 0x72, 0x07, 0x00, 0x00, -/* 00000040 */ 0x00, 0x8A, 0x07, 0x00, 0x00, 0x00, 0xA0, 0x07, 0x00, 0x00, 0x01, 0xB4, 0x07, 0x00, 0x00, 0x00, -/* 00000050 */ 0xBC, 0x07, 0x00, 0x00, 0x00, 0xC8, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0x00, 0xD8, -/* 00000060 */ 0x07, 0x00, 0x00, 0x00, 0xE8, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x00, 0x00, 0x00, 0x36, 0x08, -/* 00000070 */ 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0xCE, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00000080 */ 0x00, 0x00, 0x0A, 0x09, 0x00, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x00, 0x3C, 0x09, 0x00, 0x00, -/* 00000090 */ 0x00, 0x64, 0x09, 0x00, 0x00, 0x01, 0x70, 0x09, 0x00, 0x00, 0x01, 0x7A, 0x09, 0x00, 0x00, 0x00, -/* 000000A0 */ 0x88, 0x09, 0x00, 0x00, 0x01, 0x94, 0x09, 0x00, 0x00, 0x01, 0xA0, 0x09, 0x00, 0x00, 0x01, 0xB0, -/* 000000B0 */ 0x09, 0x00, 0x00, 0x00, 0xBE, 0x09, 0x00, 0x00, 0x01, 0xCA, 0x09, 0x00, 0x00, 0x01, 0xD8, 0x09, -/* 000000C0 */ 0x00, 0x00, 0x00, 0xE6, 0x09, 0x00, 0x00, 0x01, 0xF2, 0x09, 0x00, 0x00, 0x01, 0x04, 0x0A, 0x00, -/* 000000D0 */ 0x00, 0x00, 0x12, 0x0A, 0x00, 0x00, 0x01, 0x20, 0x0A, 0x00, 0x00, 0x00, 0x22, 0x0A, 0x00, 0x00, -/* 000000E0 */ 0x01, 0x2E, 0x0A, 0x00, 0x00, 0x01, 0x3A, 0x0A, 0x00, 0x00, 0x01, 0x46, 0x0A, 0x00, 0x00, 0x01, -/* 000000F0 */ 0x54, 0x0A, 0x00, 0x00, 0x01, 0x60, 0x0A, 0x00, 0x00, 0x00, 0x6A, 0x0A, 0x00, 0x00, 0x00, 0x7C, -/* 00000100 */ 0x0A, 0x00, 0x00, 0x00, 0x8E, 0x0A, 0x00, 0x00, 0x00, 0xA4, 0x0A, 0x00, 0x00, 0x00, 0xBE, 0x0A, -/* 00000110 */ 0x00, 0x00, 0x00, 0xD8, 0x0A, 0x00, 0x00, 0x00, 0xF6, 0x0A, 0x00, 0x00, 0x01, 0x0A, 0x0B, 0x00, -/* 00000120 */ 0x00, 0x01, 0x2E, 0x0B, 0x00, 0x00, 0x01, 0x54, 0x0B, 0x00, 0x00, 0x01, 0x68, 0x0B, 0x00, 0x00, -/* 00000130 */ 0x01, 0x88, 0x0B, 0x00, 0x00, 0x01, 0xBA, 0x0B, 0x00, 0x00, 0x01, 0xE4, 0x0B, 0x00, 0x00, 0x01, -/* 00000140 */ 0x16, 0x0C, 0x00, 0x00, 0x01, 0x44, 0x0C, 0x00, 0x00, 0x01, 0x72, 0x0C, 0x00, 0x00, 0x01, 0x84, -/* 00000150 */ 0x0C, 0x00, 0x00, 0x01, 0x9E, 0x0C, 0x00, 0x00, 0x01, 0xBC, 0x0C, 0x00, 0x00, 0x01, 0xDE, 0x0C, -/* 00000160 */ 0x00, 0x00, 0x01, 0xF6, 0x0C, 0x00, 0x00, 0x01, 0x20, 0x0D, 0x00, 0x00, 0x01, 0x46, 0x0D, 0x00, -/* 00000170 */ 0x00, 0x01, 0x7A, 0x0D, 0x00, 0x00, 0x01, 0xB4, 0x0D, 0x00, 0x00, 0x01, 0xE0, 0x0D, 0x00, 0x00, -/* 00000180 */ 0x01, 0x0A, 0x0E, 0x00, 0x00, 0x01, 0x34, 0x0E, 0x00, 0x00, 0x01, 0x5E, 0x0E, 0x00, 0x00, 0x01, -/* 00000190 */ 0x82, 0x0E, 0x00, 0x00, 0x01, 0xA6, 0x0E, 0x00, 0x00, 0x01, 0xD0, 0x0E, 0x00, 0x00, 0x01, 0xF8, -/* 000001A0 */ 0x0E, 0x00, 0x00, 0x01, 0x08, 0x0F, 0x00, 0x00, 0x01, 0x34, 0x0F, 0x00, 0x00, 0x01, 0x68, 0x0F, -/* 000001B0 */ 0x00, 0x00, 0x01, 0x9C, 0x0F, 0x00, 0x00, 0x01, 0xBE, 0x0F, 0x00, 0x00, 0x01, 0xE2, 0x0F, 0x00, -/* 000001C0 */ 0x00, 0x01, 0x06, 0x10, 0x00, 0x00, 0x01, 0x2E, 0x10, 0x00, 0x00, 0x01, 0x56, 0x10, 0x00, 0x00, -/* 000001D0 */ 0x01, 0x74, 0x10, 0x00, 0x00, 0x01, 0xA0, 0x10, 0x00, 0x00, 0x01, 0xB2, 0x10, 0x00, 0x00, 0x01, -/* 000001E0 */ 0xE6, 0x10, 0x00, 0x00, 0x01, 0x22, 0x11, 0x00, 0x00, 0x01, 0x62, 0x11, 0x00, 0x00, 0x01, 0xB0, -/* 000001F0 */ 0x11, 0x00, 0x00, 0x01, 0xD8, 0x11, 0x00, 0x00, 0x01, 0xEA, 0x11, 0x00, 0x00, 0x01, 0x10, 0x12, -/* 00000200 */ 0x00, 0x00, 0x01, 0x30, 0x12, 0x00, 0x00, 0x01, 0x52, 0x12, 0x00, 0x00, 0x01, 0x76, 0x12, 0x00, -/* 00000210 */ 0x00, 0x01, 0xA0, 0x12, 0x00, 0x00, 0x01, 0xD0, 0x12, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, -/* 00000220 */ 0x01, 0x22, 0x13, 0x00, 0x00, 0x01, 0x44, 0x13, 0x00, 0x00, 0x01, 0x64, 0x13, 0x00, 0x00, 0x01, -/* 00000230 */ 0x7C, 0x13, 0x00, 0x00, 0x01, 0xBE, 0x13, 0x00, 0x00, 0x01, 0xF6, 0x13, 0x00, 0x00, 0x01, 0x40, -/* 00000240 */ 0x14, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x00, 0x01, 0xCE, 0x14, 0x00, 0x00, 0x01, 0x12, 0x15, -/* 00000250 */ 0x00, 0x00, 0x01, 0x44, 0x15, 0x00, 0x00, 0x01, 0x70, 0x15, 0x00, 0x00, 0x00, 0x76, 0x15, 0x00, -/* 00000260 */ 0x00, 0x00, 0xD0, 0x15, 0x00, 0x00, 0x00, 0xFA, 0x15, 0x00, 0x00, 0x00, 0xFE, 0x15, 0x00, 0x00, -/* 00000270 */ 0x00, 0x26, 0x16, 0x00, 0x00, 0x00, 0x2E, 0x16, 0x00, 0x00, 0x00, 0x3C, 0x16, 0x00, 0x00, 0x00, -/* 00000280 */ 0x4C, 0x16, 0x00, 0x00, 0x00, 0x76, 0x16, 0x00, 0x00, 0x01, 0x88, 0x16, 0x00, 0x00, 0x01, 0xA8, -/* 00000290 */ 0x16, 0x00, 0x00, 0x00, 0xC4, 0x16, 0x00, 0x00, 0x00, 0xE2, 0x16, 0x00, 0x00, 0x00, 0xF0, 0x16, -/* 000002A0 */ 0x00, 0x00, 0x00, 0x04, 0x17, 0x00, 0x00, 0x01, 0x16, 0x17, 0x00, 0x00, 0x00, 0x28, 0x17, 0x00, -/* 000002B0 */ 0x00, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, 0x5C, 0x17, 0x00, 0x00, 0x00, 0x6E, 0x17, 0x00, 0x00, -/* 000002C0 */ 0x01, 0x86, 0x17, 0x00, 0x00, 0x00, 0x96, 0x17, 0x00, 0x00, 0x00, 0xA4, 0x17, 0x00, 0x00, 0x00, -/* 000002D0 */ 0xB2, 0x17, 0x00, 0x00, 0x00, 0xB8, 0x17, 0x00, 0x00, 0x00, 0xC2, 0x17, 0x00, 0x00, 0x00, 0xC8, -/* 000002E0 */ 0x17, 0x00, 0x00, 0x00, 0xDC, 0x17, 0x00, 0x00, 0x00, 0xE0, 0x17, 0x00, 0x00, 0x00, 0xE8, 0x17, -/* 000002F0 */ 0x00, 0x00, 0x00, 0xEC, 0x17, 0x00, 0x00, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00, 0x0E, 0x18, 0x00, -/* 00000300 */ 0x00, 0x00, 0x1A, 0x18, 0x00, 0x00, 0x00, 0x22, 0x18, 0x00, 0x00, 0x00, 0x26, 0x18, 0x00, 0x00, -/* 00000310 */ 0x00, 0x2A, 0x18, 0x00, 0x00, 0x00, 0xDE, 0x18, 0x00, 0x00, 0x00, 0x7A, 0x19, 0x00, 0x00, 0x00, -/* 00000320 */ 0x00, 0x1A, 0x00, 0x00, 0x00, 0x0C, 0x1A, 0x00, 0x00, 0x00, 0x14, 0x1A, 0x00, 0x00, 0x00, 0x2A, -/* 00000330 */ 0x1A, 0x00, 0x00, 0x00, 0x44, 0x1A, 0x00, 0x00, 0x00, 0x5E, 0x1A, 0x00, 0x00, 0x00, 0x68, 0x1A, -/* 00000340 */ 0x00, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x00, 0x8C, 0x1A, 0x00, 0x00, 0x00, 0x9A, 0x1A, 0x00, -/* 00000350 */ 0x00, 0x00, 0xA4, 0x1A, 0x00, 0x00, 0x00, 0xB2, 0x1A, 0x00, 0x00, 0x00, 0xC6, 0x1A, 0x00, 0x00, -/* 00000360 */ 0x00, 0xE0, 0x1A, 0x00, 0x00, 0x00, 0xEC, 0x1A, 0x00, 0x00, 0x00, 0xFA, 0x1A, 0x00, 0x00, 0x00, -/* 00000370 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x0C, 0x1B, 0x00, 0x00, 0x00, 0x14, 0x1B, 0x00, 0x00, 0x00, 0x24, -/* 00000380 */ 0x1B, 0x00, 0x00, 0x00, 0x30, 0x1B, 0x00, 0x00, 0x00, 0x3A, 0x1B, 0x00, 0x00, 0x00, 0x4A, 0x1B, -/* 00000390 */ 0x00, 0x00, 0x00, 0x56, 0x1B, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x1B, 0x00, -/* 000003A0 */ 0x00, 0x00, 0x6A, 0x1B, 0x00, 0x00, 0x01, 0x74, 0x1B, 0x00, 0x00, 0x00, 0x82, 0x1B, 0x00, 0x00, -/* 000003B0 */ 0x00, 0x90, 0x1B, 0x00, 0x00, 0x00, 0x9E, 0x1B, 0x00, 0x00, 0x01, 0xAC, 0x1B, 0x00, 0x00, 0x01, -/* 000003C0 */ 0xB8, 0x1B, 0x00, 0x00, 0x01, 0xC6, 0x1B, 0x00, 0x00, 0x01, 0xE2, 0x1B, 0x00, 0x00, 0x00, 0xF4, -/* 000003D0 */ 0x1B, 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x00, 0x8A, 0x1C, -/* 000003E0 */ 0x00, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x1D, 0x00, 0x00, 0x00, 0x72, 0x1D, 0x00, -/* 000003F0 */ 0x00, 0x01, 0x84, 0x1D, 0x00, 0x00, 0x01, 0xB6, 0x1D, 0x00, 0x00, 0x01, 0xE6, 0x1D, 0x00, 0x00, -/* 00000400 */ 0x00, 0xF0, 0x1D, 0x00, 0x00, 0x00, 0x42, 0x1E, 0x00, 0x00, 0x00, 0x60, 0x1E, 0x00, 0x00, 0x00, -/* 00000410 */ 0x98, 0x1E, 0x00, 0x00, 0x00, 0xA6, 0x1E, 0x00, 0x00, 0x00, 0xB4, 0x1E, 0x00, 0x00, 0x00, 0xF2, -/* 00000420 */ 0x1E, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x00, 0x00, 0x00, 0x4E, 0x1F, 0x00, 0x00, 0x00, 0x62, 0x1F, -/* 00000430 */ 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x00, 0x00, 0x00, 0x9A, 0x1F, 0x00, 0x00, 0x00, 0xAA, 0x1F, 0x00, -/* 00000440 */ 0x00, 0x00, 0xB2, 0x1F, 0x00, 0x00, 0x00, 0xCA, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x1F, 0x00, 0x00, -/* 00000450 */ 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x2C, 0x20, 0x00, 0x00, 0x00, 0x36, 0x20, 0x00, 0x00, 0x00, -/* 00000460 */ 0x44, 0x20, 0x00, 0x00, 0x00, 0x5C, 0x20, 0x00, 0x00, 0x00, 0x66, 0x20, 0x00, 0x00, 0x00, 0x74, -/* 00000470 */ 0x20, 0x00, 0x00, 0x00, 0x7E, 0x20, 0x00, 0x00, 0x00, 0x8E, 0x20, 0x00, 0x00, 0x00, 0xB2, 0x20, -/* 00000480 */ 0x00, 0x00, 0x01, 0xC6, 0x20, 0x00, 0x00, 0x00, 0xD2, 0x20, 0x00, 0x00, 0x00, 0xDE, 0x20, 0x00, -/* 00000490 */ 0x00, 0x00, 0xEA, 0x20, 0x00, 0x00, 0x00, 0xFA, 0x20, 0x00, 0x00, 0x00, 0x0A, 0x21, 0x00, 0x00, -/* 000004A0 */ 0x00, 0x0E, 0x21, 0x00, 0x00, 0x00, 0x12, 0x21, 0x00, 0x00, 0x00, 0x16, 0x21, 0x00, 0x00, 0x01, -/* 000004B0 */ 0x2A, 0x21, 0x00, 0x00, 0x00, 0x30, 0x21, 0x00, 0x00, 0x00, 0x36, 0x21, 0x00, 0x00, 0x00, 0x40, -/* 000004C0 */ 0x21, 0x00, 0x00, 0x00, 0x46, 0x21, 0x00, 0x00, 0x00, 0x58, 0x21, 0x00, 0x00, 0x00, 0x8E, 0x21, -/* 000004D0 */ 0x00, 0x00, 0x00, 0xD4, 0x21, 0x00, 0x00, 0x01, 0xE4, 0x21, 0x00, 0x00, 0x01, 0xF4, 0x21, 0x00, -/* 000004E0 */ 0x00, 0x01, 0x04, 0x22, 0x00, 0x00, 0x01, 0x16, 0x22, 0x00, 0x00, 0x01, 0x1E, 0x22, 0x00, 0x00, -/* 000004F0 */ 0x01, 0x2C, 0x22, 0x00, 0x00, 0x01, 0x36, 0x22, 0x00, 0x00, 0x01, 0x40, 0x22, 0x00, 0x00, 0x00, -/* 00000500 */ 0x4E, 0x22, 0x00, 0x00, 0x00, 0x8E, 0x22, 0x00, 0x00, 0x00, 0xB2, 0x22, 0x00, 0x00, 0x00, 0xF8, -/* 00000510 */ 0x22, 0x00, 0x00, 0x00, 0x18, 0x23, 0x00, 0x00, 0x00, 0x24, 0x23, 0x00, 0x00, 0x00, 0x36, 0x23, -/* 00000520 */ 0x00, 0x00, 0x00, 0x56, 0x23, 0x00, 0x00, 0x00, 0x80, 0x23, 0x00, 0x00, 0x00, 0xAC, 0x23, 0x00, -/* 00000530 */ 0x00, 0x00, 0xD8, 0x23, 0x00, 0x00, 0x00, 0x0A, 0x24, 0x00, 0x00, 0x00, 0x3C, 0x24, 0x00, 0x00, -/* 00000540 */ 0x00, 0x54, 0x24, 0x00, 0x00, 0x00, 0x62, 0x24, 0x00, 0x00, 0x00, 0x78, 0x24, 0x00, 0x00, 0x01, -/* 00000550 */ 0x9C, 0x24, 0x00, 0x00, 0x01, 0xD4, 0x24, 0x00, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x12, -/* 00000560 */ 0x25, 0x00, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x00, 0x2C, 0x25, 0x00, 0x00, 0x00, 0x3A, 0x25, -/* 00000570 */ 0x00, 0x00, 0x00, 0x40, 0x25, 0x00, 0x00, 0x00, 0x4A, 0x25, 0x00, 0x00, 0x01, 0x6A, 0x25, 0x00, -/* 00000580 */ 0x00, 0x00, 0xA6, 0x25, 0x00, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0x01, 0x0E, 0x26, 0x00, 0x00, -/* 00000590 */ 0x00, 0x14, 0x26, 0x00, 0x00, 0x00, 0x1E, 0x26, 0x00, 0x00, 0x01, 0x42, 0x26, 0x00, 0x00, 0x00, -/* 000005A0 */ 0x52, 0x26, 0x00, 0x00, 0x01, 0x70, 0x26, 0x00, 0x00, 0x00, 0x7E, 0x26, 0x00, 0x00, 0x01, 0x9A, -/* 000005B0 */ 0x26, 0x00, 0x00, 0x00, 0xAA, 0x26, 0x00, 0x00, 0x01, 0xCC, 0x26, 0x00, 0x00, 0x00, 0xDE, 0x26, -/* 000005C0 */ 0x00, 0x00, 0x01, 0xFC, 0x26, 0x00, 0x00, 0x00, 0x0A, 0x27, 0x00, 0x00, 0x01, 0x28, 0x27, 0x00, -/* 000005D0 */ 0x00, 0x00, 0x36, 0x27, 0x00, 0x00, 0x01, 0x58, 0x27, 0x00, 0x00, 0x00, 0x74, 0x27, 0x00, 0x00, -/* 000005E0 */ 0x01, 0x8E, 0x27, 0x00, 0x00, 0x00, 0x98, 0x27, 0x00, 0x00, 0x01, 0xB6, 0x27, 0x00, 0x00, 0x00, -/* 000005F0 */ 0xC4, 0x27, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x28, 0x00, 0x00, 0x00, 0x88, -/* 00000600 */ 0x28, 0x00, 0x00, 0x00, 0xB0, 0x28, 0x00, 0x00, 0x00, 0xFA, 0x28, 0x00, 0x00, 0x00, 0x00, 0x29, -/* 00000610 */ 0x00, 0x00, 0x01, 0x32, 0x29, 0x00, 0x00, 0x01, 0x56, 0x29, 0x00, 0x00, 0x01, 0x90, 0x29, 0x00, -/* 00000620 */ 0x00, 0x01, 0xBC, 0x29, 0x00, 0x00, 0x01, 0xF8, 0x29, 0x00, 0x00, 0x01, 0x46, 0x2A, 0x00, 0x00, -/* 00000630 */ 0x01, 0x70, 0x2A, 0x00, 0x00, 0x01, 0xA2, 0x2A, 0x00, 0x00, 0x00, 0xAC, 0x2A, 0x00, 0x00, 0x00, -/* 00000640 */ 0xB4, 0x2A, 0x00, 0x00, 0x00, 0xBE, 0x2A, 0x00, 0x00, 0x00, 0xC6, 0x2A, 0x00, 0x00, 0x00, 0xD0, -/* 00000650 */ 0x2A, 0x00, 0x00, 0x00, 0xDC, 0x2A, 0x00, 0x00, 0x00, 0xE4, 0x2A, 0x00, 0x00, 0x00, 0xEE, 0x2A, -/* 00000660 */ 0x00, 0x00, 0x00, 0xFC, 0x2A, 0x00, 0x00, 0x00, 0x0A, 0x2B, 0x00, 0x00, 0x00, 0x18, 0x2B, 0x00, -/* 00000670 */ 0x00, 0x00, 0x24, 0x2B, 0x00, 0x00, 0x00, 0x50, 0x2B, 0x00, 0x00, 0x00, 0x5A, 0x2B, 0x00, 0x00, -/* 00000680 */ 0x00, 0x78, 0x2B, 0x00, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0x00, 0xAA, 0x2B, 0x00, 0x00, 0x00, -/* 00000690 */ 0xBE, 0x2B, 0x00, 0x00, 0x00, 0xDA, 0x2B, 0x00, 0x00, 0x00, 0xFE, 0x2B, 0x00, 0x00, 0x00, 0x14, -/* 000006A0 */ 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x2C, 0x00, 0x00, 0x00, 0x5A, 0x2C, 0x00, 0x00, 0x00, 0x5E, 0x2C, -/* 000006B0 */ 0x00, 0x00, 0x01, 0x70, 0x2C, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x00, 0x00, 0x00, 0xC2, 0x2C, 0x00, -/* 000006C0 */ 0x00, 0x00, 0x8C, 0x2D, 0x00, 0x00, 0x00, 0xA2, 0x2D, 0x00, 0x00, 0x00, 0xE8, 0x2D, 0x00, 0x00, -/* 000006D0 */ 0x00, 0xF2, 0x2D, 0x00, 0x00, 0x00, 0xF6, 0x2D, 0x00, 0x00, 0x00, 0xFA, 0x2D, 0x00, 0x00, 0x00, -/* 000006E0 */ 0xFE, 0x2D, 0x00, 0x00, 0x00, 0x16, 0x2E, 0x00, 0x00, 0x00, 0x34, 0x2E, 0x00, 0x00, 0x00, 0x80, -/* 000006F0 */ 0x2E, 0x00, 0x00, 0x00, 0x60, 0x2F, 0x00, 0x00, 0x00, 0x7A, 0x2F, 0x00, 0x00, 0x00, 0x8A, 0x2F, -/* 00000700 */ 0x00, 0x00, 0x00, 0x9E, 0x2F, 0x00, 0x00, 0x00, 0xB2, 0x2F, 0x00, 0x00, 0x00, 0x34, 0x30, 0x00, -/* 00000710 */ 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x78, 0x30, 0x00, 0x00, 0x00, 0x8A, 0x30, 0x00, 0x00, -/* 00000720 */ 0x00, 0xC4, 0x30, 0x00, 0x00, 0x00, 0xD6, 0x30, 0x00, 0x00, 0x00, 0xE6, 0x30, 0x00, 0x00, 0x00, -/* 00000730 */ 0xEE, 0x30, 0x00, 0x00, 0x00, 0x08, 0x31, 0x00, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x00, 0x32, -/* 00000740 */ 0x31, 0x00, 0x00, 0x00, 0x3E, 0x31, 0x00, 0x00, 0x00, 0x56, 0x31, 0x00, 0x00, 0x00, 0x6E, 0x31, -/* 00000750 */ 0x00, 0x00, 0x00, 0x78, 0x31, 0x00, 0x00, 0x00, 0x92, 0x31, 0x00, 0x00, 0x00, 0xD2, 0x31, 0x00, -/* 00000760 */ 0x00, 0x00, 0x24, 0x32, 0x00, 0x00, 0x00, 0x36, 0x32, 0x00, 0x00, 0x01, 0x40, 0x32, 0x00, 0x00, -/* 00000770 */ 0x00, 0x00, 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, -/* 00000780 */ 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00000790 */ 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000007A0 */ 0x4E, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x46, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x4E, 0x00, -/* 000007B0 */ 0x44, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6C, 0x00, -/* 000007C0 */ 0x6F, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x00, 0x00, -/* 000007D0 */ 0x70, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x56, 0x00, 0x61, 0x00, -/* 000007E0 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, -/* 000007F0 */ 0x64, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, -/* 00000800 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, -/* 00000810 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000820 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000830 */ 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, -/* 00000840 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 00000850 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00000860 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00000870 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00000880 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00000890 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000008A0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000008B0 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 000008C0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 000008D0 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, -/* 000008E0 */ 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000008F0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00000900 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00000910 */ 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, -/* 00000920 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00000930 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, -/* 00000940 */ 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, -/* 00000950 */ 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00000960 */ 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x45, 0x00, 0x53, 0x00, 0x00, 0x00, -/* 00000970 */ 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, -/* 00000980 */ 0x64, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x2D, 0x00, 0x4C, 0x00, -/* 00000990 */ 0x56, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, -/* 000009A0 */ 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, 0x6B, 0x00, 0x00, 0x00, -/* 000009B0 */ 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, 0x00, 0x00, 0x6A, 0x00, -/* 000009C0 */ 0x61, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000009D0 */ 0x68, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x73, 0x00, -/* 000009E0 */ 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x54, 0x00, 0x57, 0x00, -/* 000009F0 */ 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00000A00 */ 0x63, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6E, 0x00, -/* 00000A10 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00000A20 */ 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x48, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x7A, 0x00, -/* 00000A30 */ 0x68, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, -/* 00000A40 */ 0x43, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x69, 0x00, -/* 00000A50 */ 0x6E, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x53, 0x00, 0x47, 0x00, 0x00, 0x00, -/* 00000A60 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, -/* 00000A70 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x77, 0x00, 0x72, 0x00, -/* 00000A80 */ 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, -/* 00000A90 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, -/* 00000AA0 */ 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, -/* 00000AB0 */ 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 00000AC0 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00000AD0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000AE0 */ 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 00000AF0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00000B00 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 00000B10 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, -/* 00000B20 */ 0x70, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, -/* 00000B30 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000B40 */ 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, -/* 00000B50 */ 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00000B60 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4E, 0x00, -/* 00000B70 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00000B80 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 00000B90 */ 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, 0x75, 0x00, -/* 00000BA0 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x52, 0x00, 0x65, 0x00, -/* 00000BB0 */ 0x67, 0x00, 0x45, 0x00, 0x78, 0x00, 0x70, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 00000BC0 */ 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00000BD0 */ 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x52, 0x00, 0x45, 0x00, -/* 00000BE0 */ 0x73, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00000BF0 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x43, 0x00, 0x75, 0x00, -/* 00000C00 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x43, 0x00, 0x6F, 0x00, -/* 00000C10 */ 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00000C20 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00000C30 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, -/* 00000C40 */ 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00000C50 */ 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000C60 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000C70 */ 0x00, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00000C80 */ 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00000C90 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, -/* 00000CA0 */ 0x65, 0x00, 0x74, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4C, 0x00, -/* 00000CB0 */ 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00000CC0 */ 0x6C, 0x00, 0x6C, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000CD0 */ 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x00, 0x00, 0x52, 0x00, -/* 00000CE0 */ 0x61, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x41, 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00000CF0 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000D00 */ 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 00000D10 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00000D20 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x73, 0x00, -/* 00000D30 */ 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x62, 0x00, -/* 00000D40 */ 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000D50 */ 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x50, 0x00, -/* 00000D60 */ 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x4E, 0x00, -/* 00000D70 */ 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, -/* 00000D80 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00000D90 */ 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x77, 0x00, -/* 00000DA0 */ 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, -/* 00000DB0 */ 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000DC0 */ 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, -/* 00000DD0 */ 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, -/* 00000DE0 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, -/* 00000DF0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, -/* 00000E00 */ 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00000E10 */ 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000E20 */ 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, -/* 00000E30 */ 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, -/* 00000E40 */ 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x49, 0x00, -/* 00000E50 */ 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x41, 0x00, -/* 00000E60 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, -/* 00000E70 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x73, 0x00, 0x68, 0x00, -/* 00000E80 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, -/* 00000E90 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x4A, 0x00, 0x6F, 0x00, -/* 00000EA0 */ 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, -/* 00000EB0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00000EC0 */ 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x42, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, -/* 00000ED0 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, -/* 00000EE0 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, -/* 00000EF0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000F00 */ 0x4E, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, -/* 00000F10 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000F20 */ 0x63, 0x00, 0x65, 0x00, 0x52, 0x00, 0x65, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x63, 0x00, -/* 00000F30 */ 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00000F40 */ 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, -/* 00000F50 */ 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, -/* 00000F60 */ 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, -/* 00000F70 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000F80 */ 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00000F90 */ 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, -/* 00000FA0 */ 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x49, 0x00, 0x66, 0x00, 0x50, 0x00, -/* 00000FB0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00000FC0 */ 0x68, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x45, 0x00, 0x78, 0x00, 0x49, 0x00, 0x66, 0x00, -/* 00000FD0 */ 0x4F, 0x00, 0x4F, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x53, 0x00, 0x4F, 0x00, 0x45, 0x00, -/* 00000FE0 */ 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x50, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6C, 0x00, -/* 00000FF0 */ 0x69, 0x00, 0x63, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00001000 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x45, 0x00, 0x78, 0x00, -/* 00001010 */ 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, -/* 00001020 */ 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, -/* 00001030 */ 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001040 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, -/* 00001050 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, -/* 00001060 */ 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001070 */ 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 00001080 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001090 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 000010A0 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000010B0 */ 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, -/* 000010C0 */ 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 000010D0 */ 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000010E0 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000010F0 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00001100 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, -/* 00001110 */ 0x74, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001120 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001130 */ 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00001140 */ 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00001150 */ 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001160 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00001170 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x41, 0x00, -/* 00001180 */ 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00001190 */ 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, -/* 000011A0 */ 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 000011B0 */ 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, -/* 000011C0 */ 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 000011D0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 000011E0 */ 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x50, 0x00, -/* 000011F0 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x55, 0x00, -/* 00001200 */ 0x73, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x43, 0x00, 0x55, 0x00, 0x00, 0x00, -/* 00001210 */ 0x5F, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001220 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001230 */ 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, -/* 00001240 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001250 */ 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 00001260 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 00001270 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00001280 */ 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 00001290 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000012A0 */ 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 000012B0 */ 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 000012C0 */ 0x75, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x00, 0x00, -/* 000012D0 */ 0x5F, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000012E0 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 000012F0 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001300 */ 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, -/* 00001310 */ 0x5F, 0x00, 0x43, 0x00, 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, -/* 00001320 */ 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, -/* 00001330 */ 0x47, 0x00, 0x5F, 0x00, 0x42, 0x00, 0x41, 0x00, 0x53, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, -/* 00001340 */ 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, -/* 00001350 */ 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x45, 0x00, 0x58, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x52, 0x00, -/* 00001360 */ 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, -/* 00001370 */ 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 00001380 */ 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, -/* 00001390 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, -/* 000013A0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, -/* 000013B0 */ 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, -/* 000013C0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, -/* 000013D0 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 000013E0 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 000013F0 */ 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, -/* 00001400 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, -/* 00001410 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001420 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001430 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001440 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 00001450 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00001460 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001470 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00001480 */ 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00001490 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, -/* 000014A0 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, -/* 000014B0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, -/* 000014C0 */ 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 000014D0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, -/* 000014E0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 000014F0 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, -/* 00001500 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, -/* 00001510 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, -/* 00001520 */ 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 00001530 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, -/* 00001540 */ 0x65, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 00001550 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001560 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001570 */ 0x65, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00001580 */ 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 00001590 */ 0x2E, 0x00, 0x62, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 000015A0 */ 0x2E, 0x00, 0x63, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, -/* 000015B0 */ 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x64, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 000015C0 */ 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 000015D0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 000015E0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 000015F0 */ 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x72, 0x00, -/* 00001600 */ 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001610 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, -/* 00001620 */ 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x6C, 0x00, -/* 00001630 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 00001640 */ 0x62, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001650 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, -/* 00001660 */ 0x6F, 0x00, 0x75, 0x00, 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00001670 */ 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001680 */ 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001690 */ 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, -/* 000016A0 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x3F, 0x00, -/* 000016B0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x29, 0x00, 0x3F, 0x00, -/* 000016C0 */ 0x24, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2A, 0x00, -/* 000016D0 */ 0x29, 0x00, 0x2D, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x3F, 0x00, -/* 000016E0 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 000016F0 */ 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2E, 0x00, -/* 00001700 */ 0x2A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, -/* 00001710 */ 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00001720 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 00001730 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, -/* 00001740 */ 0x6F, 0x00, 0x67, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x6F, 0x00, -/* 00001750 */ 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, -/* 00001760 */ 0x55, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 00001770 */ 0x61, 0x00, 0x73, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001780 */ 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001790 */ 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 000017A0 */ 0x67, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 000017B0 */ 0x00, 0x00, 0x5B, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, -/* 000017C0 */ 0x00, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, -/* 000017D0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, -/* 000017E0 */ 0x20, 0x00, 0x2D, 0x00, 0x20, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x5B, 0x00, -/* 000017F0 */ 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x24, 0x00, -/* 00001800 */ 0x00, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x00, -/* 00001810 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, -/* 00001820 */ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, -/* 00001830 */ 0x3F, 0x00, 0x3A, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001840 */ 0x6A, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6C, 0x00, -/* 00001850 */ 0x2D, 0x00, 0x67, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, -/* 00001860 */ 0x7C, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x7C, 0x00, -/* 00001870 */ 0x6E, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, -/* 00001880 */ 0x68, 0x00, 0x2D, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x79, 0x00, 0x75, 0x00, 0x7C, 0x00, -/* 00001890 */ 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x61, 0x00, -/* 000018A0 */ 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x7C, 0x00, -/* 000018B0 */ 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x6E, 0x00, -/* 000018C0 */ 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x78, 0x00, 0x69, 0x00, -/* 000018D0 */ 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, -/* 000018E0 */ 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x47, 0x00, -/* 000018F0 */ 0x42, 0x00, 0x2D, 0x00, 0x6F, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, -/* 00001900 */ 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6E, 0x00, -/* 00001910 */ 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, -/* 00001920 */ 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00001930 */ 0x6F, 0x00, 0x63, 0x00, 0x68, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001940 */ 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6B, 0x00, -/* 00001950 */ 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001960 */ 0x2D, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6D, 0x00, -/* 00001970 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, -/* 00001980 */ 0x6E, 0x00, 0x61, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001990 */ 0x2D, 0x00, 0x70, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, -/* 000019A0 */ 0x61, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 000019B0 */ 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x73, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x73, 0x00, -/* 000019C0 */ 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x52, 0x00, -/* 000019D0 */ 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, -/* 000019E0 */ 0x4E, 0x00, 0x4C, 0x00, 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x43, 0x00, -/* 000019F0 */ 0x48, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x45, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001A00 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00001A10 */ 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x78, 0x00, -/* 00001A20 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x2C, 0x00, -/* 00001A30 */ 0x38, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00001A40 */ 0x62, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x57, 0x00, 0x59, 0x00, -/* 00001A50 */ 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, -/* 00001A60 */ 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x38, 0x00, -/* 00001A70 */ 0x7D, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, -/* 00001A80 */ 0x35, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, -/* 00001A90 */ 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x7D, 0x00, -/* 00001AA0 */ 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x34, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001AB0 */ 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, -/* 00001AC0 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x7B, 0x00, -/* 00001AD0 */ 0x30, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001AE0 */ 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001AF0 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, -/* 00001B00 */ 0x7B, 0x00, 0x34, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001B10 */ 0x28, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, -/* 00001B20 */ 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001B30 */ 0x29, 0x00, 0x2A, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, -/* 00001B40 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00001B50 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001B60 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, -/* 00001B70 */ 0x6E, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, -/* 00001B80 */ 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001B90 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, -/* 00001BA0 */ 0x75, 0x00, 0x62, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 00001BB0 */ 0x75, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 00001BC0 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, -/* 00001BD0 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001BE0 */ 0x00, 0x00, 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, -/* 00001BF0 */ 0x74, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001C00 */ 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00001C10 */ 0x5B, 0x00, 0x27, 0x00, 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, -/* 00001C20 */ 0x69, 0x00, 0x74, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001C30 */ 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x63, 0x00, -/* 00001C40 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, -/* 00001C50 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001C60 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001C70 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, -/* 00001C80 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00001C90 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00001CA0 */ 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00001CB0 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00001CC0 */ 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00001CD0 */ 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 00001CE0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, -/* 00001CF0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 00001D00 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, -/* 00001D10 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, -/* 00001D20 */ 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, -/* 00001D30 */ 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00001D40 */ 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, -/* 00001D50 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x64, 0x00, -/* 00001D60 */ 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00001D70 */ 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x52, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00001D80 */ 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00001D90 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, -/* 00001DA0 */ 0x73, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00001DB0 */ 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001DC0 */ 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00001DD0 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, -/* 00001DE0 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, -/* 00001DF0 */ 0x2D, 0x00, 0x75, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, -/* 00001E00 */ 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, -/* 00001E10 */ 0x3F, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, -/* 00001E20 */ 0x29, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, -/* 00001E30 */ 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, -/* 00001E40 */ 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00001E50 */ 0x5F, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, -/* 00001E60 */ 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001E70 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00001E80 */ 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00001E90 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x63, 0x00, -/* 00001EA0 */ 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00001EB0 */ 0x67, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00001EC0 */ 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, -/* 00001ED0 */ 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00001EE0 */ 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00001EF0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, -/* 00001F00 */ 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 00001F10 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00001F20 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00001F30 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, -/* 00001F40 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, -/* 00001F50 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00001F60 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, -/* 00001F70 */ 0x63, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001F80 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00001F90 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, -/* 00001FA0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, -/* 00001FB0 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, -/* 00001FC0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 00001FD0 */ 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, -/* 00001FE0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00001FF0 */ 0x5F, 0x00, 0x5F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 00002000 */ 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x64, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002010 */ 0x6C, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 00002020 */ 0x75, 0x00, 0x73, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x6F, 0x00, -/* 00002030 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, -/* 00002040 */ 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 00002050 */ 0x69, 0x00, 0x76, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, -/* 00002060 */ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002070 */ 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, -/* 00002080 */ 0x61, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x69, 0x00, -/* 00002090 */ 0x67, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x6E, 0x00, -/* 000020A0 */ 0x63, 0x00, 0x74, 0x00, 0x75, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000020B0 */ 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x46, 0x00, 0x69, 0x00, 0x72, 0x00, -/* 000020C0 */ 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 000020D0 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x66, 0x00, -/* 000020E0 */ 0x61, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 000020F0 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, -/* 00002100 */ 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x41, 0x00, -/* 00002110 */ 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00002120 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00002130 */ 0x6B, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002140 */ 0x63, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 00002150 */ 0x61, 0x00, 0x72, 0x00, 0x64, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002160 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00002170 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, -/* 00002180 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, -/* 00002190 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, -/* 000021A0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000021B0 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 000021C0 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000021D0 */ 0x73, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x41, 0x00, 0x55, 0x00, 0x4C, 0x00, -/* 000021E0 */ 0x54, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x41, 0x00, -/* 000021F0 */ 0x4C, 0x00, 0x00, 0x00, 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4E, 0x00, -/* 00002200 */ 0x54, 0x00, 0x00, 0x00, 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, -/* 00002210 */ 0x43, 0x00, 0x59, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x58, 0x00, 0x00, 0x00, 0x53, 0x00, -/* 00002220 */ 0x59, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x43, 0x00, 0x4F, 0x00, -/* 00002230 */ 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4D, 0x00, 0x45, 0x00, 0x00, 0x00, -/* 00002240 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 00002250 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, -/* 00002260 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, -/* 00002270 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00002280 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 00002290 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 000022A0 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000022B0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 000022C0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000022D0 */ 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, -/* 000022E0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000022F0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 00002300 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x53, 0x00, 0x79, 0x00, 0x73, 0x00, -/* 00002310 */ 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, -/* 00002320 */ 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002330 */ 0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002340 */ 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6C, 0x00, -/* 00002350 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 00002360 */ 0x75, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, -/* 00002370 */ 0x72, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00002380 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, -/* 00002390 */ 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, -/* 000023A0 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 000023B0 */ 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, 0x72, 0x00, 0x61, 0x00, -/* 000023C0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, -/* 000023D0 */ 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000023E0 */ 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000023F0 */ 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x44, 0x00, 0x69, 0x00, -/* 00002400 */ 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, -/* 00002410 */ 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, -/* 00002420 */ 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x44, 0x00, -/* 00002430 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, -/* 00002440 */ 0x65, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002450 */ 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002460 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002470 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 00002480 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002490 */ 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 000024A0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000024B0 */ 0x61, 0x00, 0x74, 0x00, 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 000024C0 */ 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 000024D0 */ 0x79, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 000024E0 */ 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 000024F0 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002500 */ 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x63, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002510 */ 0x00, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002520 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x79, 0x00, -/* 00002530 */ 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x00, 0x00, -/* 00002540 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x6C, 0x00, -/* 00002550 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002560 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00002570 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00002580 */ 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 00002590 */ 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000025A0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, -/* 000025B0 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000025C0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000025D0 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 000025E0 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000025F0 */ 0x73, 0x00, 0x00, 0x00, 0x68, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002600 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, -/* 00002610 */ 0x5F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, -/* 00002620 */ 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00002630 */ 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002640 */ 0x00, 0x00, 0x67, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x79, 0x00, -/* 00002650 */ 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, 0x43, 0x00, -/* 00002660 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00002670 */ 0x68, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 00002680 */ 0x69, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00002690 */ 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6C, 0x00, -/* 000026A0 */ 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x61, 0x00, 0x70, 0x00, -/* 000026B0 */ 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000026C0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x61, 0x00, -/* 000026D0 */ 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4A, 0x00, -/* 000026E0 */ 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000026F0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x75, 0x00, -/* 00002700 */ 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002710 */ 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002720 */ 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002730 */ 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x41, 0x00, 0x6C, 0x00, 0x51, 0x00, -/* 00002740 */ 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002750 */ 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00002760 */ 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x69, 0x00, 0x76, 0x00, 0x69, 0x00, -/* 00002770 */ 0x6C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00002780 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002790 */ 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, 0x69, 0x00, 0x77, 0x00, -/* 000027A0 */ 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 000027B0 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x77, 0x00, 0x61, 0x00, -/* 000027C0 */ 0x6E, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, -/* 000027D0 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 000027E0 */ 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000027F0 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, -/* 00002800 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00002810 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, -/* 00002820 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, -/* 00002830 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002840 */ 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, -/* 00002850 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00002860 */ 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002870 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00002880 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, -/* 00002890 */ 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000028A0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000028B0 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000028C0 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000028D0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 000028E0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, -/* 000028F0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x00, 0x00, -/* 00002900 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 00002910 */ 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002920 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x70, 0x00, -/* 00002930 */ 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, -/* 00002940 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, -/* 00002950 */ 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x4F, 0x00, -/* 00002960 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x54, 0x00, 0x6F, 0x00, -/* 00002970 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 00002980 */ 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002990 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 000029A0 */ 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000029B0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 000029C0 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x57, 0x00, 0x65, 0x00, 0x65, 0x00, -/* 000029D0 */ 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x4D, 0x00, -/* 000029E0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 000029F0 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002A00 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x79, 0x00, 0x48, 0x00, 0x6F, 0x00, -/* 00002A10 */ 0x75, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00002A20 */ 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x4D, 0x00, 0x6F, 0x00, -/* 00002A30 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00002A40 */ 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002A50 */ 0x65, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, -/* 00002A60 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00002A70 */ 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, -/* 00002A80 */ 0x7A, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, -/* 00002A90 */ 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002AA0 */ 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00002AB0 */ 0x79, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, -/* 00002AC0 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00002AD0 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, -/* 00002AE0 */ 0x79, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002AF0 */ 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00002B00 */ 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002B10 */ 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002B20 */ 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, -/* 00002B30 */ 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, -/* 00002B40 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, -/* 00002B50 */ 0x6C, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 00002B60 */ 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x66, 0x00, -/* 00002B70 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x69, 0x00, -/* 00002B80 */ 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002B90 */ 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, -/* 00002BA0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, -/* 00002BB0 */ 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002BC0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00002BD0 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00002BE0 */ 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002BF0 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002C00 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00002C10 */ 0x6C, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, -/* 00002C20 */ 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002C30 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002C40 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, -/* 00002C50 */ 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002C60 */ 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002C70 */ 0x7B, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002C80 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00002C90 */ 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, -/* 00002CA0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 00002CB0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, -/* 00002CC0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002CD0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002CE0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002CF0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, -/* 00002D00 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, -/* 00002D10 */ 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, -/* 00002D20 */ 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2F, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002D30 */ 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00002D40 */ 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, -/* 00002D50 */ 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, -/* 00002D60 */ 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, -/* 00002D70 */ 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002D80 */ 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x0A, 0x00, -/* 00002D90 */ 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, -/* 00002DA0 */ 0x00, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00002DB0 */ 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, -/* 00002DC0 */ 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, -/* 00002DD0 */ 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, -/* 00002DE0 */ 0x3F, 0x00, 0x7D, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002DF0 */ 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x61, 0x00, -/* 00002E00 */ 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002E10 */ 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002E20 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x31, 0x00, -/* 00002E30 */ 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002E40 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002E50 */ 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00002E60 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, -/* 00002E70 */ 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 00002E80 */ 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, -/* 00002E90 */ 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002EA0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, -/* 00002EB0 */ 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002EC0 */ 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, -/* 00002ED0 */ 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x2F, 0x00, -/* 00002EE0 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2F, 0x00, 0x73, 0x00, -/* 00002EF0 */ 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2F, 0x00, 0x6D, 0x00, 0x6F, 0x00, -/* 00002F00 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 00002F10 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, -/* 00002F20 */ 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00002F30 */ 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002F40 */ 0x2E, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, -/* 00002F50 */ 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, -/* 00002F60 */ 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00002F70 */ 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002F80 */ 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002F90 */ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 00002FA0 */ 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, -/* 00002FB0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002FC0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002FD0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002FE0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, -/* 00002FF0 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, -/* 00003000 */ 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00003010 */ 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, -/* 00003020 */ 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00003030 */ 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, +/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x47, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFF, +/* 00000020 */ 0xBE, 0x65, 0x01, 0x00, 0xFF, 0xBE, 0x65, 0x01, 0x00, 0x35, 0x00, 0x00, 0x00, 0x80, 0x35, 0x00, +/* 00000030 */ 0x00, 0x8C, 0x51, 0x00, 0x00, 0xFE, 0x81, 0x01, 0xC2, 0x07, 0x00, 0x00, 0x00, 0xDA, 0x07, 0x00, +/* 00000040 */ 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x01, 0x04, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x08, 0x00, 0x00, +/* 00000050 */ 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x01, +/* 00000060 */ 0x30, 0x08, 0x00, 0x00, 0x01, 0x56, 0x08, 0x00, 0x00, 0x01, 0x84, 0x08, 0x00, 0x00, 0x01, 0xB2, +/* 00000070 */ 0x08, 0x00, 0x00, 0x01, 0xDC, 0x08, 0x00, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x01, 0x0C, 0x09, +/* 00000080 */ 0x00, 0x00, 0x00, 0x1C, 0x09, 0x00, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x6A, 0x09, 0x00, +/* 00000090 */ 0x00, 0x00, 0xB4, 0x09, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x34, 0x0A, 0x00, 0x00, +/* 000000A0 */ 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x0A, 0x00, 0x00, 0x00, 0x70, 0x0A, 0x00, 0x00, 0x00, +/* 000000B0 */ 0x98, 0x0A, 0x00, 0x00, 0x01, 0xA4, 0x0A, 0x00, 0x00, 0x01, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0xBC, +/* 000000C0 */ 0x0A, 0x00, 0x00, 0x01, 0xC8, 0x0A, 0x00, 0x00, 0x01, 0xD4, 0x0A, 0x00, 0x00, 0x01, 0xE4, 0x0A, +/* 000000D0 */ 0x00, 0x00, 0x00, 0xF2, 0x0A, 0x00, 0x00, 0x01, 0xFE, 0x0A, 0x00, 0x00, 0x01, 0x0C, 0x0B, 0x00, +/* 000000E0 */ 0x00, 0x00, 0x1A, 0x0B, 0x00, 0x00, 0x01, 0x26, 0x0B, 0x00, 0x00, 0x01, 0x38, 0x0B, 0x00, 0x00, +/* 000000F0 */ 0x00, 0x46, 0x0B, 0x00, 0x00, 0x01, 0x54, 0x0B, 0x00, 0x00, 0x00, 0x56, 0x0B, 0x00, 0x00, 0x01, +/* 00000100 */ 0x62, 0x0B, 0x00, 0x00, 0x01, 0x6E, 0x0B, 0x00, 0x00, 0x01, 0x7A, 0x0B, 0x00, 0x00, 0x01, 0x88, +/* 00000110 */ 0x0B, 0x00, 0x00, 0x01, 0x94, 0x0B, 0x00, 0x00, 0x00, 0x9E, 0x0B, 0x00, 0x00, 0x00, 0xB0, 0x0B, +/* 00000120 */ 0x00, 0x00, 0x00, 0xC2, 0x0B, 0x00, 0x00, 0x00, 0xD8, 0x0B, 0x00, 0x00, 0x00, 0xF2, 0x0B, 0x00, +/* 00000130 */ 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x2A, 0x0C, 0x00, 0x00, 0x01, 0x3E, 0x0C, 0x00, 0x00, +/* 00000140 */ 0x01, 0x62, 0x0C, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x00, 0x00, 0x01, 0x9C, 0x0C, 0x00, 0x00, 0x01, +/* 00000150 */ 0xBC, 0x0C, 0x00, 0x00, 0x01, 0xEE, 0x0C, 0x00, 0x00, 0x01, 0x18, 0x0D, 0x00, 0x00, 0x01, 0x4A, +/* 00000160 */ 0x0D, 0x00, 0x00, 0x01, 0x78, 0x0D, 0x00, 0x00, 0x01, 0xA6, 0x0D, 0x00, 0x00, 0x01, 0xB8, 0x0D, +/* 00000170 */ 0x00, 0x00, 0x01, 0xD2, 0x0D, 0x00, 0x00, 0x01, 0xF0, 0x0D, 0x00, 0x00, 0x01, 0x12, 0x0E, 0x00, +/* 00000180 */ 0x00, 0x01, 0x2A, 0x0E, 0x00, 0x00, 0x01, 0x54, 0x0E, 0x00, 0x00, 0x01, 0x7A, 0x0E, 0x00, 0x00, +/* 00000190 */ 0x01, 0xAE, 0x0E, 0x00, 0x00, 0x01, 0xE8, 0x0E, 0x00, 0x00, 0x01, 0x14, 0x0F, 0x00, 0x00, 0x01, +/* 000001A0 */ 0x3E, 0x0F, 0x00, 0x00, 0x01, 0x68, 0x0F, 0x00, 0x00, 0x01, 0x92, 0x0F, 0x00, 0x00, 0x01, 0xB6, +/* 000001B0 */ 0x0F, 0x00, 0x00, 0x01, 0xDA, 0x0F, 0x00, 0x00, 0x01, 0x04, 0x10, 0x00, 0x00, 0x01, 0x2C, 0x10, +/* 000001C0 */ 0x00, 0x00, 0x01, 0x3C, 0x10, 0x00, 0x00, 0x01, 0x68, 0x10, 0x00, 0x00, 0x01, 0x9C, 0x10, 0x00, +/* 000001D0 */ 0x00, 0x01, 0xD0, 0x10, 0x00, 0x00, 0x01, 0xF2, 0x10, 0x00, 0x00, 0x01, 0x16, 0x11, 0x00, 0x00, +/* 000001E0 */ 0x01, 0x3A, 0x11, 0x00, 0x00, 0x01, 0x62, 0x11, 0x00, 0x00, 0x01, 0x8A, 0x11, 0x00, 0x00, 0x01, +/* 000001F0 */ 0xA8, 0x11, 0x00, 0x00, 0x01, 0xD4, 0x11, 0x00, 0x00, 0x01, 0xE6, 0x11, 0x00, 0x00, 0x01, 0x1A, +/* 00000200 */ 0x12, 0x00, 0x00, 0x01, 0x56, 0x12, 0x00, 0x00, 0x01, 0x96, 0x12, 0x00, 0x00, 0x01, 0xE4, 0x12, +/* 00000210 */ 0x00, 0x00, 0x01, 0x0C, 0x13, 0x00, 0x00, 0x01, 0x1E, 0x13, 0x00, 0x00, 0x01, 0x44, 0x13, 0x00, +/* 00000220 */ 0x00, 0x01, 0x70, 0x13, 0x00, 0x00, 0x01, 0x90, 0x13, 0x00, 0x00, 0x01, 0xB2, 0x13, 0x00, 0x00, +/* 00000230 */ 0x01, 0xDC, 0x13, 0x00, 0x00, 0x01, 0x0C, 0x14, 0x00, 0x00, 0x01, 0x3C, 0x14, 0x00, 0x00, 0x01, +/* 00000240 */ 0x5E, 0x14, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x00, 0x01, 0xA0, 0x14, 0x00, 0x00, 0x01, 0xB8, +/* 00000250 */ 0x14, 0x00, 0x00, 0x01, 0xFA, 0x14, 0x00, 0x00, 0x01, 0x32, 0x15, 0x00, 0x00, 0x01, 0x7C, 0x15, +/* 00000260 */ 0x00, 0x00, 0x01, 0xBC, 0x15, 0x00, 0x00, 0x01, 0x0A, 0x16, 0x00, 0x00, 0x01, 0x4E, 0x16, 0x00, +/* 00000270 */ 0x00, 0x01, 0x80, 0x16, 0x00, 0x00, 0x01, 0xAC, 0x16, 0x00, 0x00, 0x00, 0xB2, 0x16, 0x00, 0x00, +/* 00000280 */ 0x00, 0x0C, 0x17, 0x00, 0x00, 0x00, 0x36, 0x17, 0x00, 0x00, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, +/* 00000290 */ 0x62, 0x17, 0x00, 0x00, 0x00, 0x6A, 0x17, 0x00, 0x00, 0x00, 0x78, 0x17, 0x00, 0x00, 0x00, 0x88, +/* 000002A0 */ 0x17, 0x00, 0x00, 0x00, 0xB2, 0x17, 0x00, 0x00, 0x01, 0xC4, 0x17, 0x00, 0x00, 0x01, 0xE4, 0x17, +/* 000002B0 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x00, 0x00, 0x00, 0x2C, 0x18, 0x00, +/* 000002C0 */ 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x01, 0x52, 0x18, 0x00, 0x00, 0x00, 0x64, 0x18, 0x00, 0x00, +/* 000002D0 */ 0x00, 0x76, 0x18, 0x00, 0x00, 0x00, 0x98, 0x18, 0x00, 0x00, 0x00, 0xAA, 0x18, 0x00, 0x00, 0x01, +/* 000002E0 */ 0xC2, 0x18, 0x00, 0x00, 0x00, 0xD2, 0x18, 0x00, 0x00, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0xEE, +/* 000002F0 */ 0x18, 0x00, 0x00, 0x00, 0xF4, 0x18, 0x00, 0x00, 0x00, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x04, 0x19, +/* 00000300 */ 0x00, 0x00, 0x00, 0x18, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x19, 0x00, 0x00, 0x00, 0x24, 0x19, 0x00, +/* 00000310 */ 0x00, 0x00, 0x28, 0x19, 0x00, 0x00, 0x00, 0x3E, 0x19, 0x00, 0x00, 0x00, 0x4A, 0x19, 0x00, 0x00, +/* 00000320 */ 0x00, 0x56, 0x19, 0x00, 0x00, 0x00, 0x5E, 0x19, 0x00, 0x00, 0x00, 0x62, 0x19, 0x00, 0x00, 0x00, +/* 00000330 */ 0x66, 0x19, 0x00, 0x00, 0x00, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0x00, 0x3C, +/* 00000340 */ 0x1B, 0x00, 0x00, 0x00, 0x48, 0x1B, 0x00, 0x00, 0x00, 0x50, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x1B, +/* 00000350 */ 0x00, 0x00, 0x00, 0x80, 0x1B, 0x00, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0x00, 0xA4, 0x1B, 0x00, +/* 00000360 */ 0x00, 0x00, 0xBA, 0x1B, 0x00, 0x00, 0x00, 0xC8, 0x1B, 0x00, 0x00, 0x00, 0xD6, 0x1B, 0x00, 0x00, +/* 00000370 */ 0x00, 0xE0, 0x1B, 0x00, 0x00, 0x00, 0xEE, 0x1B, 0x00, 0x00, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x00, +/* 00000380 */ 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x28, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x3C, +/* 00000390 */ 0x1C, 0x00, 0x00, 0x00, 0x48, 0x1C, 0x00, 0x00, 0x00, 0x50, 0x1C, 0x00, 0x00, 0x00, 0x60, 0x1C, +/* 000003A0 */ 0x00, 0x00, 0x00, 0x6C, 0x1C, 0x00, 0x00, 0x00, 0x76, 0x1C, 0x00, 0x00, 0x00, 0x86, 0x1C, 0x00, +/* 000003B0 */ 0x00, 0x00, 0x92, 0x1C, 0x00, 0x00, 0x00, 0x9C, 0x1C, 0x00, 0x00, 0x00, 0xA2, 0x1C, 0x00, 0x00, +/* 000003C0 */ 0x00, 0xA6, 0x1C, 0x00, 0x00, 0x01, 0xB0, 0x1C, 0x00, 0x00, 0x00, 0xBE, 0x1C, 0x00, 0x00, 0x00, +/* 000003D0 */ 0xCC, 0x1C, 0x00, 0x00, 0x00, 0xDA, 0x1C, 0x00, 0x00, 0x01, 0xE8, 0x1C, 0x00, 0x00, 0x01, 0xF4, +/* 000003E0 */ 0x1C, 0x00, 0x00, 0x01, 0x02, 0x1D, 0x00, 0x00, 0x01, 0x1E, 0x1D, 0x00, 0x00, 0x00, 0x30, 0x1D, +/* 000003F0 */ 0x00, 0x00, 0x00, 0x4C, 0x1D, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x00, 0x00, 0x00, 0xC6, 0x1D, 0x00, +/* 00000400 */ 0x00, 0x00, 0x1A, 0x1E, 0x00, 0x00, 0x00, 0x72, 0x1E, 0x00, 0x00, 0x00, 0xAE, 0x1E, 0x00, 0x00, +/* 00000410 */ 0x01, 0xC0, 0x1E, 0x00, 0x00, 0x01, 0xF2, 0x1E, 0x00, 0x00, 0x01, 0x22, 0x1F, 0x00, 0x00, 0x00, +/* 00000420 */ 0x2C, 0x1F, 0x00, 0x00, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0x00, 0x9C, 0x1F, 0x00, 0x00, 0x00, 0xD4, +/* 00000430 */ 0x1F, 0x00, 0x00, 0x00, 0xE2, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x2E, 0x20, +/* 00000440 */ 0x00, 0x00, 0x00, 0x4A, 0x20, 0x00, 0x00, 0x00, 0x8A, 0x20, 0x00, 0x00, 0x00, 0x9E, 0x20, 0x00, +/* 00000450 */ 0x00, 0x00, 0xB6, 0x20, 0x00, 0x00, 0x00, 0xD6, 0x20, 0x00, 0x00, 0x00, 0xE6, 0x20, 0x00, 0x00, +/* 00000460 */ 0x00, 0xEE, 0x20, 0x00, 0x00, 0x00, 0x06, 0x21, 0x00, 0x00, 0x01, 0x2C, 0x21, 0x00, 0x00, 0x00, +/* 00000470 */ 0x5C, 0x21, 0x00, 0x00, 0x01, 0x68, 0x21, 0x00, 0x00, 0x00, 0x72, 0x21, 0x00, 0x00, 0x00, 0x80, +/* 00000480 */ 0x21, 0x00, 0x00, 0x00, 0x98, 0x21, 0x00, 0x00, 0x00, 0xA2, 0x21, 0x00, 0x00, 0x00, 0xB0, 0x21, +/* 00000490 */ 0x00, 0x00, 0x00, 0xBA, 0x21, 0x00, 0x00, 0x00, 0xCA, 0x21, 0x00, 0x00, 0x00, 0xEE, 0x21, 0x00, +/* 000004A0 */ 0x00, 0x01, 0x02, 0x22, 0x00, 0x00, 0x00, 0x0E, 0x22, 0x00, 0x00, 0x00, 0x1A, 0x22, 0x00, 0x00, +/* 000004B0 */ 0x00, 0x26, 0x22, 0x00, 0x00, 0x00, 0x36, 0x22, 0x00, 0x00, 0x00, 0x46, 0x22, 0x00, 0x00, 0x00, +/* 000004C0 */ 0x4A, 0x22, 0x00, 0x00, 0x00, 0x4E, 0x22, 0x00, 0x00, 0x00, 0x52, 0x22, 0x00, 0x00, 0x01, 0x66, +/* 000004D0 */ 0x22, 0x00, 0x00, 0x00, 0x6C, 0x22, 0x00, 0x00, 0x00, 0x72, 0x22, 0x00, 0x00, 0x00, 0x7C, 0x22, +/* 000004E0 */ 0x00, 0x00, 0x00, 0x82, 0x22, 0x00, 0x00, 0x00, 0x94, 0x22, 0x00, 0x00, 0x00, 0xCA, 0x22, 0x00, +/* 000004F0 */ 0x00, 0x00, 0x10, 0x23, 0x00, 0x00, 0x01, 0x20, 0x23, 0x00, 0x00, 0x01, 0x30, 0x23, 0x00, 0x00, +/* 00000500 */ 0x01, 0x40, 0x23, 0x00, 0x00, 0x01, 0x52, 0x23, 0x00, 0x00, 0x01, 0x60, 0x23, 0x00, 0x00, 0x01, +/* 00000510 */ 0x6A, 0x23, 0x00, 0x00, 0x01, 0x74, 0x23, 0x00, 0x00, 0x00, 0x82, 0x23, 0x00, 0x00, 0x00, 0xC2, +/* 00000520 */ 0x23, 0x00, 0x00, 0x00, 0xE6, 0x23, 0x00, 0x00, 0x00, 0x2C, 0x24, 0x00, 0x00, 0x00, 0x4C, 0x24, +/* 00000530 */ 0x00, 0x00, 0x00, 0x58, 0x24, 0x00, 0x00, 0x00, 0x6A, 0x24, 0x00, 0x00, 0x00, 0x8A, 0x24, 0x00, +/* 00000540 */ 0x00, 0x00, 0xB4, 0x24, 0x00, 0x00, 0x00, 0xE0, 0x24, 0x00, 0x00, 0x00, 0x0C, 0x25, 0x00, 0x00, +/* 00000550 */ 0x00, 0x3E, 0x25, 0x00, 0x00, 0x00, 0x70, 0x25, 0x00, 0x00, 0x00, 0x88, 0x25, 0x00, 0x00, 0x00, +/* 00000560 */ 0x96, 0x25, 0x00, 0x00, 0x00, 0xAC, 0x25, 0x00, 0x00, 0x01, 0xD0, 0x25, 0x00, 0x00, 0x01, 0x08, +/* 00000570 */ 0x26, 0x00, 0x00, 0x01, 0x36, 0x26, 0x00, 0x00, 0x00, 0x46, 0x26, 0x00, 0x00, 0x00, 0x56, 0x26, +/* 00000580 */ 0x00, 0x00, 0x00, 0x60, 0x26, 0x00, 0x00, 0x00, 0x6E, 0x26, 0x00, 0x00, 0x00, 0x74, 0x26, 0x00, +/* 00000590 */ 0x00, 0x00, 0x7E, 0x26, 0x00, 0x00, 0x01, 0x9E, 0x26, 0x00, 0x00, 0x00, 0xDA, 0x26, 0x00, 0x00, +/* 000005A0 */ 0x00, 0x28, 0x27, 0x00, 0x00, 0x01, 0x42, 0x27, 0x00, 0x00, 0x00, 0x48, 0x27, 0x00, 0x00, 0x00, +/* 000005B0 */ 0x52, 0x27, 0x00, 0x00, 0x01, 0x76, 0x27, 0x00, 0x00, 0x00, 0x86, 0x27, 0x00, 0x00, 0x01, 0xA4, +/* 000005C0 */ 0x27, 0x00, 0x00, 0x00, 0xB2, 0x27, 0x00, 0x00, 0x01, 0xCE, 0x27, 0x00, 0x00, 0x00, 0xDE, 0x27, +/* 000005D0 */ 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x12, 0x28, 0x00, 0x00, 0x01, 0x30, 0x28, 0x00, +/* 000005E0 */ 0x00, 0x00, 0x3E, 0x28, 0x00, 0x00, 0x01, 0x5C, 0x28, 0x00, 0x00, 0x00, 0x6A, 0x28, 0x00, 0x00, +/* 000005F0 */ 0x01, 0x8C, 0x28, 0x00, 0x00, 0x00, 0xA8, 0x28, 0x00, 0x00, 0x01, 0xC2, 0x28, 0x00, 0x00, 0x00, +/* 00000600 */ 0xCC, 0x28, 0x00, 0x00, 0x01, 0xEA, 0x28, 0x00, 0x00, 0x00, 0xF8, 0x28, 0x00, 0x00, 0x00, 0x16, +/* 00000610 */ 0x29, 0x00, 0x00, 0x00, 0x3C, 0x29, 0x00, 0x00, 0x00, 0x62, 0x29, 0x00, 0x00, 0x00, 0x9E, 0x29, +/* 00000620 */ 0x00, 0x00, 0x00, 0xA6, 0x29, 0x00, 0x00, 0x00, 0xAE, 0x29, 0x00, 0x00, 0x00, 0xF2, 0x29, 0x00, +/* 00000630 */ 0x00, 0x00, 0xFC, 0x29, 0x00, 0x00, 0x00, 0x40, 0x2A, 0x00, 0x00, 0x00, 0x4A, 0x2A, 0x00, 0x00, +/* 00000640 */ 0x00, 0x72, 0x2A, 0x00, 0x00, 0x00, 0xBC, 0x2A, 0x00, 0x00, 0x00, 0xC2, 0x2A, 0x00, 0x00, 0x01, +/* 00000650 */ 0xF4, 0x2A, 0x00, 0x00, 0x01, 0x18, 0x2B, 0x00, 0x00, 0x01, 0x52, 0x2B, 0x00, 0x00, 0x01, 0x7E, +/* 00000660 */ 0x2B, 0x00, 0x00, 0x01, 0xBA, 0x2B, 0x00, 0x00, 0x01, 0x08, 0x2C, 0x00, 0x00, 0x01, 0x32, 0x2C, +/* 00000670 */ 0x00, 0x00, 0x01, 0x64, 0x2C, 0x00, 0x00, 0x01, 0xB6, 0x2C, 0x00, 0x00, 0x01, 0x08, 0x2D, 0x00, +/* 00000680 */ 0x00, 0x00, 0x12, 0x2D, 0x00, 0x00, 0x00, 0x1E, 0x2D, 0x00, 0x00, 0x00, 0x26, 0x2D, 0x00, 0x00, +/* 00000690 */ 0x00, 0x30, 0x2D, 0x00, 0x00, 0x00, 0x3E, 0x2D, 0x00, 0x00, 0x00, 0x4C, 0x2D, 0x00, 0x00, 0x00, +/* 000006A0 */ 0x5A, 0x2D, 0x00, 0x00, 0x00, 0x66, 0x2D, 0x00, 0x00, 0x00, 0x92, 0x2D, 0x00, 0x00, 0x00, 0x9C, +/* 000006B0 */ 0x2D, 0x00, 0x00, 0x00, 0xBA, 0x2D, 0x00, 0x00, 0x00, 0xCA, 0x2D, 0x00, 0x00, 0x00, 0xEC, 0x2D, +/* 000006C0 */ 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x1C, 0x2E, 0x00, 0x00, 0x00, 0x40, 0x2E, 0x00, +/* 000006D0 */ 0x00, 0x00, 0x56, 0x2E, 0x00, 0x00, 0x00, 0x80, 0x2E, 0x00, 0x00, 0x00, 0x9C, 0x2E, 0x00, 0x00, +/* 000006E0 */ 0x00, 0xA0, 0x2E, 0x00, 0x00, 0x01, 0xB2, 0x2E, 0x00, 0x00, 0x00, 0xB8, 0x2E, 0x00, 0x00, 0x00, +/* 000006F0 */ 0x04, 0x2F, 0x00, 0x00, 0x00, 0xCE, 0x2F, 0x00, 0x00, 0x00, 0xE4, 0x2F, 0x00, 0x00, 0x00, 0x2A, +/* 00000700 */ 0x30, 0x00, 0x00, 0x00, 0x34, 0x30, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x30, +/* 00000710 */ 0x00, 0x00, 0x00, 0x40, 0x30, 0x00, 0x00, 0x00, 0x58, 0x30, 0x00, 0x00, 0x00, 0x76, 0x30, 0x00, +/* 00000720 */ 0x00, 0x00, 0xC2, 0x30, 0x00, 0x00, 0x00, 0xA2, 0x31, 0x00, 0x00, 0x00, 0xBC, 0x31, 0x00, 0x00, +/* 00000730 */ 0x00, 0xCC, 0x31, 0x00, 0x00, 0x00, 0xE0, 0x31, 0x00, 0x00, 0x00, 0xF4, 0x31, 0x00, 0x00, 0x00, +/* 00000740 */ 0x76, 0x32, 0x00, 0x00, 0x00, 0xA2, 0x32, 0x00, 0x00, 0x00, 0xBA, 0x32, 0x00, 0x00, 0x00, 0xCC, +/* 00000750 */ 0x32, 0x00, 0x00, 0x00, 0x06, 0x33, 0x00, 0x00, 0x00, 0x18, 0x33, 0x00, 0x00, 0x00, 0x28, 0x33, +/* 00000760 */ 0x00, 0x00, 0x00, 0x30, 0x33, 0x00, 0x00, 0x00, 0x4A, 0x33, 0x00, 0x00, 0x00, 0x58, 0x33, 0x00, +/* 00000770 */ 0x00, 0x00, 0x74, 0x33, 0x00, 0x00, 0x00, 0x80, 0x33, 0x00, 0x00, 0x00, 0x98, 0x33, 0x00, 0x00, +/* 00000780 */ 0x00, 0xB0, 0x33, 0x00, 0x00, 0x00, 0xBA, 0x33, 0x00, 0x00, 0x00, 0xD4, 0x33, 0x00, 0x00, 0x01, +/* 00000790 */ 0xE4, 0x33, 0x00, 0x00, 0x01, 0xF4, 0x33, 0x00, 0x00, 0x01, 0x08, 0x34, 0x00, 0x00, 0x00, 0x46, +/* 000007A0 */ 0x34, 0x00, 0x00, 0x00, 0x8C, 0x34, 0x00, 0x00, 0x00, 0xD2, 0x34, 0x00, 0x00, 0x00, 0x12, 0x35, +/* 000007B0 */ 0x00, 0x00, 0x00, 0x64, 0x35, 0x00, 0x00, 0x00, 0x76, 0x35, 0x00, 0x00, 0x01, 0x80, 0x35, 0x00, +/* 000007C0 */ 0x00, 0x00, 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, +/* 000007D0 */ 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 000007E0 */ 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 000007F0 */ 0x4E, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x46, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x4E, 0x00, +/* 00000800 */ 0x44, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6C, 0x00, +/* 00000810 */ 0x6F, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x00, 0x00, +/* 00000820 */ 0x70, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x4E, 0x00, 0x00, 0x00, +/* 00000830 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00000840 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00000850 */ 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, +/* 00000860 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, +/* 00000870 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000880 */ 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, +/* 00000890 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 000008A0 */ 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000008B0 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x54, 0x00, +/* 000008C0 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 000008D0 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 000008E0 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000008F0 */ 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00000900 */ 0x65, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x58, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00000910 */ 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x56, 0x00, 0x61, 0x00, +/* 00000920 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, +/* 00000930 */ 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00000940 */ 0x72, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00000950 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000960 */ 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00000970 */ 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00000980 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, +/* 00000990 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 000009A0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, +/* 000009B0 */ 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, +/* 000009C0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, +/* 000009D0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 000009E0 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 000009F0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00000A00 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 00000A10 */ 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, +/* 00000A20 */ 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000A30 */ 0x73, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, +/* 00000A40 */ 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00000A50 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00000A60 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, +/* 00000A70 */ 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00000A80 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00000A90 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x45, 0x00, +/* 00000AA0 */ 0x53, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, +/* 00000AB0 */ 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x76, 0x00, +/* 00000AC0 */ 0x2D, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2D, 0x00, 0x44, 0x00, +/* 00000AD0 */ 0x45, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, +/* 00000AE0 */ 0x6B, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, +/* 00000AF0 */ 0x00, 0x00, 0x6A, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x00, 0x00, 0x75, 0x00, +/* 00000B00 */ 0x6E, 0x00, 0x69, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000B10 */ 0x64, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, +/* 00000B20 */ 0x54, 0x00, 0x57, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00000B30 */ 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00000B40 */ 0x75, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00000B50 */ 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x48, 0x00, 0x4B, 0x00, +/* 00000B60 */ 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x7A, 0x00, +/* 00000B70 */ 0x68, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000B80 */ 0x79, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x53, 0x00, +/* 00000B90 */ 0x47, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x43, 0x00, +/* 00000BA0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00000BB0 */ 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000BC0 */ 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000BD0 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, +/* 00000BE0 */ 0x69, 0x00, 0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000BF0 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, +/* 00000C00 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00000C10 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00000C20 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00000C30 */ 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00000C40 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, +/* 00000C50 */ 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, +/* 00000C60 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, +/* 00000C70 */ 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00000C80 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, +/* 00000C90 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, +/* 00000CA0 */ 0x74, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x4F, 0x00, +/* 00000CB0 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00000CC0 */ 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, +/* 00000CD0 */ 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, +/* 00000CE0 */ 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x45, 0x00, 0x78, 0x00, 0x70, 0x00, 0x00, 0x00, 0x49, 0x00, +/* 00000CF0 */ 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00000D00 */ 0x65, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, +/* 00000D10 */ 0x52, 0x00, 0x45, 0x00, 0x73, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, +/* 00000D20 */ 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00000D30 */ 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, +/* 00000D40 */ 0x43, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00000D50 */ 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00000D60 */ 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, +/* 00000D70 */ 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00000D80 */ 0x75, 0x00, 0x70, 0x00, 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00000D90 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000DA0 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, +/* 00000DB0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, +/* 00000DC0 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000DD0 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000DE0 */ 0x79, 0x00, 0x4C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, +/* 00000DF0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00000E00 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00000E10 */ 0x00, 0x00, 0x52, 0x00, 0x61, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x41, 0x00, 0x73, 0x00, +/* 00000E20 */ 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000E30 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000E40 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x4F, 0x00, +/* 00000E50 */ 0x66, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00000E60 */ 0x49, 0x00, 0x73, 0x00, 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000E70 */ 0x69, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000E80 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x77, 0x00, +/* 00000E90 */ 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00000EA0 */ 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x4F, 0x00, +/* 00000EB0 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000EC0 */ 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, +/* 00000ED0 */ 0x4F, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000EE0 */ 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000EF0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000F00 */ 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00000F10 */ 0x79, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00000F20 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000F30 */ 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, +/* 00000F40 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00000F50 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, +/* 00000F60 */ 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000F70 */ 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00000F80 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00000F90 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00000FA0 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, +/* 00000FB0 */ 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00000FC0 */ 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, +/* 00000FD0 */ 0x4A, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00000FE0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000FF0 */ 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x42, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001000 */ 0x64, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00001010 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x65, 0x00, +/* 00001020 */ 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00001030 */ 0x74, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 00001040 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00001050 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x52, 0x00, 0x65, 0x00, 0x70, 0x00, 0x6C, 0x00, +/* 00001060 */ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00001070 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001080 */ 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, +/* 00001090 */ 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 000010A0 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 000010B0 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x70, 0x00, +/* 000010C0 */ 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000010D0 */ 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x49, 0x00, +/* 000010E0 */ 0x66, 0x00, 0x50, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 000010F0 */ 0x00, 0x00, 0x74, 0x00, 0x68, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x45, 0x00, 0x78, 0x00, +/* 00001100 */ 0x49, 0x00, 0x66, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x53, 0x00, +/* 00001110 */ 0x4F, 0x00, 0x45, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x50, 0x00, 0x75, 0x00, +/* 00001120 */ 0x62, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x63, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00001130 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, +/* 00001140 */ 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 00001150 */ 0x6E, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 00001160 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, +/* 00001170 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x48, 0x00, 0x65, 0x00, +/* 00001180 */ 0x6C, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001190 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000011A0 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 000011B0 */ 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, +/* 000011C0 */ 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 000011D0 */ 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, +/* 000011E0 */ 0x61, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, +/* 000011F0 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001200 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00001210 */ 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001220 */ 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00001230 */ 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, +/* 00001240 */ 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001250 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00001260 */ 0x65, 0x00, 0x73, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, +/* 00001270 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, +/* 00001280 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, +/* 00001290 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 000012A0 */ 0x73, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000012B0 */ 0x73, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 000012C0 */ 0x6E, 0x00, 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000012D0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, +/* 000012E0 */ 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 000012F0 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 00001300 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00001310 */ 0x69, 0x00, 0x74, 0x00, 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x69, 0x00, +/* 00001320 */ 0x73, 0x00, 0x50, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001330 */ 0x6D, 0x00, 0x55, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x43, 0x00, +/* 00001340 */ 0x55, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x75, 0x00, +/* 00001350 */ 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00001360 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x44, 0x00, 0x00, 0x00, +/* 00001370 */ 0x5F, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00001380 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00001390 */ 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, +/* 000013A0 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000013B0 */ 0x00, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x44, 0x00, +/* 000013C0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, +/* 000013D0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, +/* 000013E0 */ 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000013F0 */ 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x75, 0x00, 0x61, 0x00, +/* 00001400 */ 0x67, 0x00, 0x65, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, +/* 00001410 */ 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00001420 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 00001430 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x55, 0x00, +/* 00001440 */ 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, 0x5F, 0x00, 0x43, 0x00, +/* 00001450 */ 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, +/* 00001460 */ 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, +/* 00001470 */ 0x42, 0x00, 0x41, 0x00, 0x53, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, +/* 00001480 */ 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, +/* 00001490 */ 0x5F, 0x00, 0x45, 0x00, 0x58, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, +/* 000014A0 */ 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, +/* 000014B0 */ 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 000014C0 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 000014D0 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 000014E0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, +/* 000014F0 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001500 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001510 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001520 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001530 */ 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, +/* 00001540 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001550 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001560 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001570 */ 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00001580 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00001590 */ 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, +/* 000015A0 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000015B0 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 000015C0 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 000015D0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 000015E0 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 000015F0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, +/* 00001600 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001610 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001620 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001630 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001640 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, +/* 00001650 */ 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, +/* 00001660 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00001670 */ 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00001680 */ 0x5F, 0x00, 0x5F, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00001690 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 000016A0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, +/* 000016B0 */ 0x00, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, +/* 000016C0 */ 0x61, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x62, 0x00, +/* 000016D0 */ 0x7D, 0x00, 0x7B, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x63, 0x00, +/* 000016E0 */ 0x7D, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000016F0 */ 0x2E, 0x00, 0x64, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x73, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, +/* 00001700 */ 0x6E, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00001710 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001720 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x46, 0x00, +/* 00001730 */ 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001740 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001750 */ 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00001760 */ 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001770 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x54, 0x00, +/* 00001780 */ 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001790 */ 0x6C, 0x00, 0x65, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, +/* 000017A0 */ 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 000017B0 */ 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 000017C0 */ 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 000017D0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000017E0 */ 0x72, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x28, 0x00, +/* 000017F0 */ 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x24, 0x00, 0x00, 0x00, +/* 00001800 */ 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2D, 0x00, +/* 00001810 */ 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00001820 */ 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00001830 */ 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x00, 0x00, +/* 00001840 */ 0x54, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00001850 */ 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001860 */ 0x67, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, +/* 00001870 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x67, 0x00, +/* 00001880 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001890 */ 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x69, 0x00, +/* 000018A0 */ 0x6E, 0x00, 0x74, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, +/* 000018B0 */ 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, +/* 000018C0 */ 0x00, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 000018D0 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 000018E0 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5B, 0x00, +/* 000018F0 */ 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, +/* 00001900 */ 0x5D, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, +/* 00001910 */ 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x20, 0x00, 0x2D, 0x00, +/* 00001920 */ 0x20, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, +/* 00001930 */ 0x5A, 0x00, 0x5D, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x24, 0x00, 0x00, 0x00, 0x5B, 0x00, +/* 00001940 */ 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, +/* 00001950 */ 0x39, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x7C, 0x00, +/* 00001960 */ 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, +/* 00001970 */ 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6A, 0x00, 0x62, 0x00, +/* 00001980 */ 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x2D, 0x00, 0x67, 0x00, +/* 00001990 */ 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x7C, 0x00, 0x6E, 0x00, +/* 000019A0 */ 0x6F, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x6E, 0x00, 0x6F, 0x00, +/* 000019B0 */ 0x2D, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, +/* 000019C0 */ 0x67, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x79, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, +/* 000019D0 */ 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x61, 0x00, 0x7C, 0x00, 0x7A, 0x00, +/* 000019E0 */ 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, +/* 000019F0 */ 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001A00 */ 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x78, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001A10 */ 0x67, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, +/* 00001A20 */ 0x3F, 0x00, 0x3A, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x47, 0x00, 0x42, 0x00, 0x2D, 0x00, +/* 00001A30 */ 0x6F, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x61, 0x00, 0x6D, 0x00, +/* 00001A40 */ 0x69, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x7C, 0x00, +/* 00001A50 */ 0x69, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00001A60 */ 0x74, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001A70 */ 0x68, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x68, 0x00, +/* 00001A80 */ 0x61, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x69, 0x00, +/* 00001A90 */ 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6C, 0x00, +/* 00001AA0 */ 0x75, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001AB0 */ 0x67, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, +/* 00001AC0 */ 0x76, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x70, 0x00, +/* 00001AD0 */ 0x77, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6F, 0x00, +/* 00001AE0 */ 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x79, 0x00, 0x7C, 0x00, 0x69, 0x00, +/* 00001AF0 */ 0x2D, 0x00, 0x74, 0x00, 0x73, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, +/* 00001B00 */ 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x52, 0x00, 0x7C, 0x00, 0x73, 0x00, +/* 00001B10 */ 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x4E, 0x00, 0x4C, 0x00, +/* 00001B20 */ 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x48, 0x00, 0x2D, 0x00, +/* 00001B30 */ 0x44, 0x00, 0x45, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001B40 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, +/* 00001B50 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x78, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001B60 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, +/* 00001B70 */ 0x5C, 0x00, 0x62, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, +/* 00001B80 */ 0x7C, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x57, 0x00, 0x59, 0x00, 0x2D, 0x00, 0x5A, 0x00, +/* 00001B90 */ 0x5D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, +/* 00001BA0 */ 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x29, 0x00, +/* 00001BB0 */ 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x35, 0x00, 0x2C, 0x00, +/* 00001BC0 */ 0x38, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, +/* 00001BD0 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, +/* 00001BE0 */ 0x7B, 0x00, 0x34, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, +/* 00001BF0 */ 0x33, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, +/* 00001C00 */ 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x7B, 0x00, 0x30, 0x00, 0x2C, 0x00, +/* 00001C10 */ 0x32, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, +/* 00001C20 */ 0x2C, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001C30 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x34, 0x00, +/* 00001C40 */ 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x00, 0x00, +/* 00001C50 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x00, 0x00, +/* 00001C60 */ 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, +/* 00001C70 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001C80 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001C90 */ 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001CA0 */ 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x00, 0x00, +/* 00001CB0 */ 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, +/* 00001CC0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00001CD0 */ 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, +/* 00001CE0 */ 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00001CF0 */ 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00001D00 */ 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, +/* 00001D10 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x62, 0x00, +/* 00001D20 */ 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 00001D30 */ 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x61, 0x00, +/* 00001D40 */ 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x27, 0x00, +/* 00001D50 */ 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 00001D60 */ 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00001D70 */ 0x75, 0x00, 0x70, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001D80 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001D90 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001DA0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001DB0 */ 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, +/* 00001DC0 */ 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, +/* 00001DD0 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, +/* 00001DE0 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00001DF0 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001E00 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, +/* 00001E10 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001E20 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001E30 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001E40 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001E50 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, +/* 00001E60 */ 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, +/* 00001E70 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, +/* 00001E80 */ 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001E90 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 00001EA0 */ 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x74, 0x00, +/* 00001EB0 */ 0x6F, 0x00, 0x52, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, +/* 00001EC0 */ 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 00001ED0 */ 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x46, 0x00, +/* 00001EE0 */ 0x6F, 0x00, 0x72, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00001EF0 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00001F00 */ 0x64, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00001F10 */ 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001F20 */ 0x00, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, +/* 00001F30 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, +/* 00001F40 */ 0x5D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x3F, 0x00, 0x2D, 0x00, +/* 00001F50 */ 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2A, 0x00, +/* 00001F60 */ 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, +/* 00001F70 */ 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x28, 0x00, +/* 00001F80 */ 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x5F, 0x00, 0x3F, 0x00, +/* 00001F90 */ 0x28, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x63, 0x00, 0x72, 0x00, +/* 00001FA0 */ 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001FB0 */ 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001FC0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001FD0 */ 0x67, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, +/* 00001FE0 */ 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 00001FF0 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00002000 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00002010 */ 0x2E, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, +/* 00002020 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, +/* 00002030 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 00002040 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002050 */ 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002060 */ 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002070 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, +/* 00002080 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002090 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 000020A0 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 000020B0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 000020C0 */ 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 000020D0 */ 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, +/* 000020E0 */ 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x67, 0x00, +/* 000020F0 */ 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, +/* 00002100 */ 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002110 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00002120 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, +/* 00002130 */ 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, +/* 00002140 */ 0x7A, 0x00, 0x65, 0x00, 0x64, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x4F, 0x00, +/* 00002150 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, +/* 00002160 */ 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00002170 */ 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, 0x68, 0x00, 0x00, 0x00, +/* 00002180 */ 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x76, 0x00, +/* 00002190 */ 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 000021A0 */ 0x00, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 000021B0 */ 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 000021C0 */ 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, +/* 000021D0 */ 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 000021E0 */ 0x75, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 000021F0 */ 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x46, 0x00, 0x69, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00002200 */ 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00002210 */ 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x66, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002220 */ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002230 */ 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, +/* 00002240 */ 0x6C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x61, 0x00, +/* 00002250 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002260 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6E, 0x00, +/* 00002270 */ 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, +/* 00002280 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00002290 */ 0x64, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000022A0 */ 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000022B0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, +/* 000022C0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 000022D0 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, +/* 000022E0 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, +/* 000022F0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002300 */ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 00002310 */ 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x41, 0x00, 0x55, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 00002320 */ 0x44, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x4C, 0x00, 0x00, 0x00, +/* 00002330 */ 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 00002340 */ 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, +/* 00002350 */ 0x00, 0x00, 0x53, 0x00, 0x59, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x4C, 0x00, 0x00, 0x00, +/* 00002360 */ 0x43, 0x00, 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4D, 0x00, +/* 00002370 */ 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002380 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2E, 0x00, +/* 00002390 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 000023A0 */ 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000023B0 */ 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000023C0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 000023D0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000023E0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, +/* 000023F0 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00002400 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002410 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 00002420 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00002430 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x53, 0x00, +/* 00002440 */ 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00002450 */ 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00002460 */ 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, +/* 00002470 */ 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00002480 */ 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00002490 */ 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000024A0 */ 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 000024B0 */ 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, +/* 000024C0 */ 0x6D, 0x00, 0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 000024D0 */ 0x6E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 000024E0 */ 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, +/* 000024F0 */ 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, +/* 00002500 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, +/* 00002510 */ 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, +/* 00002520 */ 0x6E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002530 */ 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, +/* 00002540 */ 0x61, 0x00, 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, +/* 00002550 */ 0x67, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00002560 */ 0x74, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 00002570 */ 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00002580 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00002590 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, +/* 000025A0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 000025B0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000025C0 */ 0x61, 0x00, 0x74, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000025D0 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 000025E0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000025F0 */ 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, +/* 00002600 */ 0x6C, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 00002610 */ 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 00002620 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00002630 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x63, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00002640 */ 0x61, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, +/* 00002650 */ 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00002660 */ 0x73, 0x00, 0x79, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6E, 0x00, +/* 00002670 */ 0x75, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, +/* 00002680 */ 0x5F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, +/* 00002690 */ 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, +/* 000026A0 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 000026B0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 000026C0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, +/* 000026D0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 000026E0 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 000026F0 */ 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 00002700 */ 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, +/* 00002710 */ 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002720 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x68, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, +/* 00002730 */ 0x65, 0x00, 0x6E, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00002740 */ 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002750 */ 0x00, 0x00, 0x47, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00002760 */ 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, +/* 00002770 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x67, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, +/* 00002780 */ 0x72, 0x00, 0x79, 0x00, 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00002790 */ 0x77, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 000027A0 */ 0x72, 0x00, 0x00, 0x00, 0x68, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, +/* 000027B0 */ 0x00, 0x00, 0x48, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 000027C0 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, +/* 000027D0 */ 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x4A, 0x00, +/* 000027E0 */ 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, +/* 000027F0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002800 */ 0x6A, 0x00, 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00002810 */ 0x00, 0x00, 0x4A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, +/* 00002820 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002830 */ 0x6A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x4B, 0x00, +/* 00002840 */ 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002850 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6F, 0x00, +/* 00002860 */ 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x41, 0x00, +/* 00002870 */ 0x6C, 0x00, 0x51, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002880 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00002890 */ 0x6C, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x69, 0x00, +/* 000028A0 */ 0x76, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, +/* 000028B0 */ 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 000028C0 */ 0x00, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, +/* 000028D0 */ 0x69, 0x00, 0x77, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000028E0 */ 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, +/* 000028F0 */ 0x77, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00002900 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00002910 */ 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00002920 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 00002930 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002940 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 00002950 */ 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 00002960 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, +/* 00002970 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, +/* 00002980 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00002990 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x61, 0x00, +/* 000029A0 */ 0x6E, 0x00, 0x79, 0x00, 0x00, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x44, 0x00, +/* 000029B0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 000029C0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000029D0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 000029E0 */ 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000029F0 */ 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00002A00 */ 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002A10 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, +/* 00002A20 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00002A30 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 00002A40 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002A50 */ 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 00002A60 */ 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002A70 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00002A80 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00002A90 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002AA0 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 00002AB0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00002AC0 */ 0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002AD0 */ 0x54, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002AE0 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x61, 0x00, +/* 00002AF0 */ 0x70, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002B00 */ 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002B10 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 00002B20 */ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x54, 0x00, +/* 00002B30 */ 0x6F, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002B40 */ 0x54, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002B50 */ 0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002B60 */ 0x54, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002B70 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 00002B80 */ 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x57, 0x00, 0x65, 0x00, +/* 00002B90 */ 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00002BA0 */ 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002BB0 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00002BC0 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x79, 0x00, 0x48, 0x00, +/* 00002BD0 */ 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, +/* 00002BE0 */ 0x65, 0x00, 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x4D, 0x00, +/* 00002BF0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, +/* 00002C00 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00002C10 */ 0x74, 0x00, 0x65, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002C20 */ 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 00002C30 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002C40 */ 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, +/* 00002C50 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 00002C60 */ 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00002C70 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, +/* 00002C80 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 00002C90 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, +/* 00002CA0 */ 0x65, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002CB0 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002CC0 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00002CD0 */ 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002CE0 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x44, 0x00, +/* 00002CF0 */ 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002D00 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00002D10 */ 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, +/* 00002D20 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002D30 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, +/* 00002D40 */ 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, +/* 00002D50 */ 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6F, 0x00, +/* 00002D60 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, +/* 00002D70 */ 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, +/* 00002D80 */ 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002D90 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00002DA0 */ 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, +/* 00002DB0 */ 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x64, 0x00, +/* 00002DC0 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, +/* 00002DD0 */ 0x72, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, +/* 00002DE0 */ 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, +/* 00002DF0 */ 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, +/* 00002E00 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00002E10 */ 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, +/* 00002E20 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00002E30 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, +/* 00002E40 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, +/* 00002E50 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, +/* 00002E60 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00002E70 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, +/* 00002E80 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00002E90 */ 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +/* 00002EA0 */ 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002EB0 */ 0x00, 0x00, 0x7B, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, +/* 00002EC0 */ 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, +/* 00002ED0 */ 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, +/* 00002EE0 */ 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00002EF0 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, +/* 00002F00 */ 0x7D, 0x00, 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, +/* 00002F10 */ 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00002F20 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, +/* 00002F30 */ 0x77, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, +/* 00002F40 */ 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002F50 */ 0x20, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00002F60 */ 0x2F, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2F, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00002F70 */ 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002F80 */ 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 00002F90 */ 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, +/* 00002FA0 */ 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, +/* 00002FB0 */ 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, +/* 00002FC0 */ 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, +/* 00002FD0 */ 0x0A, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x3A, 0x00, 0x20, 0x00, +/* 00002FE0 */ 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00002FF0 */ 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00003000 */ 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5C, 0x00, +/* 00003010 */ 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, +/* 00003020 */ 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00003030 */ 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, /* 00003040 */ 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 00003050 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 00003060 */ 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, -/* 00003070 */ 0x6C, 0x00, 0x6C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00003080 */ 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7B, 0x00, 0x79, 0x00, -/* 00003090 */ 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, -/* 000030A0 */ 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 000030B0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, -/* 000030C0 */ 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, -/* 000030D0 */ 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, -/* 000030E0 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 000030F0 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x4E, 0x00, -/* 00003100 */ 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00003110 */ 0x31, 0x00, 0x32, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00003120 */ 0x74, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00003130 */ 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x31, 0x00, -/* 00003140 */ 0x32, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00003150 */ 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, -/* 00003160 */ 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x6E, 0x00, -/* 00003170 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x61, 0x00, -/* 00003180 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00003190 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000031A0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000031B0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000031C0 */ 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000031D0 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000031E0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000031F0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 00003200 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 00003210 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00003220 */ 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 00003230 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 00003240 */ 0xFE, 0xEF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x6A, -/* 00003250 */ 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x05, -/* 00003260 */ 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x70, -/* 00003270 */ 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x8F, -/* 00003280 */ 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE0, -/* 00003290 */ 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x5B, 0x02, 0x00, 0x00, 0x5B, -/* 000032A0 */ 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x7B, -/* 000032B0 */ 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xE8, 0x02, 0x00, 0x00, 0xE8, -/* 000032C0 */ 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x23, -/* 000032D0 */ 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x63, -/* 000032E0 */ 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0x97, -/* 000032F0 */ 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0xFB, -/* 00003300 */ 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x5E, 0x04, 0x00, 0x00, 0x5E, -/* 00003310 */ 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x70, -/* 00003320 */ 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x94, -/* 00003330 */ 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xDA, 0x04, 0x00, 0x00, 0xDA, -/* 00003340 */ 0x04, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x54, -/* 00003350 */ 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, 0x79, -/* 00003360 */ 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0xBD, 0x05, 0x00, 0x00, 0xBD, -/* 00003370 */ 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, -/* 00003380 */ 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x00, 0x3F, -/* 00003390 */ 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5C, 0x06, 0x00, 0x00, 0x5C, -/* 000033A0 */ 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0x89, -/* 000033B0 */ 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, 0xCD, -/* 000033C0 */ 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x00, 0x1D, -/* 000033D0 */ 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x50, -/* 000033E0 */ 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0xA5, -/* 000033F0 */ 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0x53, -/* 00003400 */ 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x25, -/* 00003410 */ 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0xAA, 0x09, 0x00, 0x00, 0xAA, -/* 00003420 */ 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0x36, 0x0A, 0x00, 0x00, 0x36, -/* 00003430 */ 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x3E, -/* 00003440 */ 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0xD6, 0x0A, 0x00, 0x00, 0xD6, -/* 00003450 */ 0x0A, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0x62, -/* 00003460 */ 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0xAF, 0x0B, 0x00, 0x00, 0xAF, -/* 00003470 */ 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0x33, 0x0C, 0x00, 0x00, 0x33, -/* 00003480 */ 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x82, 0x0C, 0x00, 0x00, 0x82, -/* 00003490 */ 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0x2E, 0x0D, 0x00, 0x00, 0x2E, -/* 000034A0 */ 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x63, 0x0D, 0x00, 0x00, 0x63, -/* 000034B0 */ 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0xA2, 0x0D, 0x00, 0x00, 0xA2, -/* 000034C0 */ 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDB, 0x0D, 0x00, 0x00, 0xDB, -/* 000034D0 */ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x2B, 0x0E, 0x00, 0x00, 0x2B, -/* 000034E0 */ 0x0E, 0x00, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x84, 0x0E, 0x00, 0x00, 0x84, -/* 000034F0 */ 0x0E, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x00, 0x8F, 0x0E, 0x00, 0x00, 0x8F, -/* 00003500 */ 0x0E, 0x00, 0x00, 0xC3, 0x0E, 0x00, 0x00, 0xC3, 0x0E, 0x00, 0x00, 0xDA, 0x0E, 0x00, 0x00, 0xDA, -/* 00003510 */ 0x0E, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0x5B, 0x0F, 0x00, 0x00, 0x5B, -/* 00003520 */ 0x0F, 0x00, 0x00, 0x7F, 0x0F, 0x00, 0x00, 0x7F, 0x0F, 0x00, 0x00, 0x90, 0x0F, 0x00, 0x00, 0x90, -/* 00003530 */ 0x0F, 0x00, 0x00, 0xB6, 0x0F, 0x00, 0x00, 0xB6, 0x0F, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0xC0, -/* 00003540 */ 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, 0xE1, 0x0F, 0x00, 0x00, 0xE1, -/* 00003550 */ 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00, 0xE9, 0x0F, 0x00, 0x00, 0xE9, -/* 00003560 */ 0x0F, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x5E, 0x10, 0x00, 0x00, 0x5E, -/* 00003570 */ 0x10, 0x00, 0x00, 0x7D, 0x10, 0x00, 0x00, 0x7D, 0x10, 0x00, 0x00, 0xCB, 0x10, 0x00, 0x00, 0xCB, -/* 00003580 */ 0x10, 0x00, 0x00, 0xFC, 0x10, 0x00, 0x00, 0xFC, 0x10, 0x00, 0x00, 0x06, 0x11, 0x00, 0x00, 0x06, -/* 00003590 */ 0x11, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x28, 0x11, 0x00, 0x00, 0x28, -/* 000035A0 */ 0x11, 0x00, 0x00, 0x29, 0x11, 0x00, 0x00, 0x29, 0x11, 0x00, 0x00, 0x6F, 0x11, 0x00, 0x00, 0x6F, -/* 000035B0 */ 0x11, 0x00, 0x00, 0xBE, 0x11, 0x00, 0x00, 0xBE, 0x11, 0x00, 0x00, 0xDD, 0x11, 0x00, 0x00, 0xDD, -/* 000035C0 */ 0x11, 0x00, 0x00, 0x2B, 0x12, 0x00, 0x00, 0x2B, 0x12, 0x00, 0x00, 0x5E, 0x12, 0x00, 0x00, 0x5E, -/* 000035D0 */ 0x12, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x00, 0xCE, 0x12, 0x00, 0x00, 0xCE, -/* 000035E0 */ 0x12, 0x00, 0x00, 0xFA, 0x12, 0x00, 0x00, 0xFA, 0x12, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, -/* 000035F0 */ 0x13, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x2D, 0x13, 0x00, 0x00, 0x2D, -/* 00003600 */ 0x13, 0x00, 0x00, 0x34, 0x13, 0x00, 0x00, 0x34, 0x13, 0x00, 0x00, 0x35, 0x13, 0x00, 0x00, 0x35, -/* 00003610 */ 0x13, 0x00, 0x00, 0x6C, 0x13, 0x00, 0x00, 0x6C, 0x13, 0x00, 0x00, 0xAC, 0x13, 0x00, 0x00, 0xAC, -/* 00003620 */ 0x13, 0x00, 0x00, 0xCB, 0x13, 0x00, 0x00, 0xCB, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0xEB, -/* 00003630 */ 0x13, 0x00, 0x00, 0x13, 0x14, 0x00, 0x00, 0x13, 0x14, 0x00, 0x00, 0x21, 0x14, 0x00, 0x00, 0x21, -/* 00003640 */ 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x87, 0x14, 0x00, 0x00, 0x87, -/* 00003650 */ 0x14, 0x00, 0x00, 0x98, 0x14, 0x00, 0x00, 0x98, 0x14, 0x00, 0x00, 0xB3, 0x14, 0x00, 0x00, 0xB3, -/* 00003660 */ 0x14, 0x00, 0x00, 0xBD, 0x14, 0x00, 0x00, 0xBD, 0x14, 0x00, 0x00, 0xC4, 0x14, 0x00, 0x00, 0xC4, -/* 00003670 */ 0x14, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, -/* 00003680 */ 0x14, 0x00, 0x00, 0x18, 0x15, 0x00, 0x00, 0x18, 0x15, 0x00, 0x00, 0x3B, 0x15, 0x00, 0x00, 0x3B, -/* 00003690 */ 0x15, 0x00, 0x00, 0x5D, 0x15, 0x00, 0x00, 0x5D, 0x15, 0x00, 0x00, 0x81, 0x15, 0x00, 0x00, 0x81, -/* 000036A0 */ 0x15, 0x00, 0x00, 0x8F, 0x15, 0x00, 0x00, 0x8F, 0x15, 0x00, 0x00, 0xA6, 0x15, 0x00, 0x00, 0xA6, -/* 000036B0 */ 0x15, 0x00, 0x00, 0xB0, 0x15, 0x00, 0x00, 0xB0, 0x15, 0x00, 0x00, 0xB7, 0x15, 0x00, 0x00, 0xB7, -/* 000036C0 */ 0x15, 0x00, 0x00, 0xB8, 0x15, 0x00, 0x00, 0xB8, 0x15, 0x00, 0x00, 0x1D, 0x16, 0x00, 0x00, 0x1D, -/* 000036D0 */ 0x16, 0x00, 0x00, 0x49, 0x16, 0x00, 0x00, 0x49, 0x16, 0x00, 0x00, 0x8F, 0x16, 0x00, 0x00, 0x8F, -/* 000036E0 */ 0x16, 0x00, 0x00, 0xA5, 0x16, 0x00, 0x00, 0xA5, 0x16, 0x00, 0x00, 0xAF, 0x16, 0x00, 0x00, 0xAF, -/* 000036F0 */ 0x16, 0x00, 0x00, 0xB6, 0x16, 0x00, 0x00, 0xB6, 0x16, 0x00, 0x00, 0xB7, 0x16, 0x00, 0x00, 0xB7, -/* 00003700 */ 0x16, 0x00, 0x00, 0xE8, 0x16, 0x00, 0x00, 0xE8, 0x16, 0x00, 0x00, 0x1F, 0x17, 0x00, 0x00, 0x1F, -/* 00003710 */ 0x17, 0x00, 0x00, 0x26, 0x17, 0x00, 0x00, 0x26, 0x17, 0x00, 0x00, 0x27, 0x17, 0x00, 0x00, 0x27, -/* 00003720 */ 0x17, 0x00, 0x00, 0x69, 0x17, 0x00, 0x00, 0x69, 0x17, 0x00, 0x00, 0xAF, 0x17, 0x00, 0x00, 0xAF, -/* 00003730 */ 0x17, 0x00, 0x00, 0xDB, 0x17, 0x00, 0x00, 0xDB, 0x17, 0x00, 0x00, 0x1F, 0x18, 0x00, 0x00, 0x1F, -/* 00003740 */ 0x18, 0x00, 0x00, 0x4A, 0x18, 0x00, 0x00, 0x4A, 0x18, 0x00, 0x00, 0x73, 0x18, 0x00, 0x00, 0x73, -/* 00003750 */ 0x18, 0x00, 0x00, 0x9F, 0x18, 0x00, 0x00, 0x9F, 0x18, 0x00, 0x00, 0xB1, 0x18, 0x00, 0x00, 0xB1, -/* 00003760 */ 0x18, 0x00, 0x00, 0x03, 0x19, 0x00, 0x00, 0x03, 0x19, 0x00, 0x00, 0x78, 0x19, 0x00, 0x00, 0x78, -/* 00003770 */ 0x19, 0x00, 0x00, 0x86, 0x19, 0x00, 0x00, 0x86, 0x19, 0x00, 0x00, 0xD1, 0x19, 0x00, 0x00, 0xD1, -/* 00003780 */ 0x19, 0x00, 0x00, 0x13, 0x1A, 0x00, 0x00, 0x13, 0x1A, 0x00, 0x00, 0x83, 0x1A, 0x00, 0x00, 0x83, -/* 00003790 */ 0x1A, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0xDE, 0x1A, 0x00, 0x00, 0xDE, -/* 000037A0 */ 0x1A, 0x00, 0x00, 0xE8, 0x1A, 0x00, 0x00, 0xE8, 0x1A, 0x00, 0x00, 0xE9, 0x1A, 0x00, 0x00, 0xE9, -/* 000037B0 */ 0x1A, 0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x34, 0x1B, 0x00, 0x00, 0x34, -/* 000037C0 */ 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0x89, 0x1B, 0x00, 0x00, 0x89, -/* 000037D0 */ 0x1B, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0xBD, 0x1B, 0x00, 0x00, 0xBD, -/* 000037E0 */ 0x1B, 0x00, 0x00, 0xC7, 0x1B, 0x00, 0x00, 0xC7, 0x1B, 0x00, 0x00, 0xCD, 0x1B, 0x00, 0x00, 0xCD, -/* 000037F0 */ 0x1B, 0x00, 0x00, 0xCE, 0x1B, 0x00, 0x00, 0xCE, 0x1B, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, -/* 00003800 */ 0x1C, 0x00, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x8D, 0x1C, 0x00, 0x00, 0x8D, -/* 00003810 */ 0x1C, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0x09, 0x1D, 0x00, 0x00, 0x09, -/* 00003820 */ 0x1D, 0x00, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x5E, 0x1D, 0x00, 0x00, 0x5E, -/* 00003830 */ 0x1D, 0x00, 0x00, 0x70, 0x1D, 0x00, 0x00, 0x70, 0x1D, 0x00, 0x00, 0xD0, 0x1D, 0x00, 0x00, 0xD0, -/* 00003840 */ 0x1D, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x00, 0x4B, 0x1E, 0x00, 0x00, 0x4B, -/* 00003850 */ 0x1E, 0x00, 0x00, 0x84, 0x1E, 0x00, 0x00, 0x84, 0x1E, 0x00, 0x00, 0xBE, 0x1E, 0x00, 0x00, 0xBE, -/* 00003860 */ 0x1E, 0x00, 0x00, 0xCC, 0x1E, 0x00, 0x00, 0xCC, 0x1E, 0x00, 0x00, 0x17, 0x1F, 0x00, 0x00, 0x17, -/* 00003870 */ 0x1F, 0x00, 0x00, 0x59, 0x1F, 0x00, 0x00, 0x59, 0x1F, 0x00, 0x00, 0xD6, 0x1F, 0x00, 0x00, 0xD6, -/* 00003880 */ 0x1F, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x31, 0x20, 0x00, 0x00, 0x31, -/* 00003890 */ 0x20, 0x00, 0x00, 0x3B, 0x20, 0x00, 0x00, 0x3B, 0x20, 0x00, 0x00, 0x5A, 0x20, 0x00, 0x00, 0x5A, -/* 000038A0 */ 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x61, -/* 000038B0 */ 0x20, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0xB3, 0x20, 0x00, 0x00, 0xB3, -/* 000038C0 */ 0x20, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0xE1, 0x20, 0x00, 0x00, 0xE1, -/* 000038D0 */ 0x20, 0x00, 0x00, 0xE2, 0x20, 0x00, 0x00, 0xE2, 0x20, 0x00, 0x00, 0x2D, 0x21, 0x00, 0x00, 0x2D, -/* 000038E0 */ 0x21, 0x00, 0x00, 0x43, 0x21, 0x00, 0x00, 0x43, 0x21, 0x00, 0x00, 0x61, 0x21, 0x00, 0x00, 0x61, -/* 000038F0 */ 0x21, 0x00, 0x00, 0x6B, 0x21, 0x00, 0x00, 0x6B, 0x21, 0x00, 0x00, 0x6C, 0x21, 0x00, 0x00, 0x6C, -/* 00003900 */ 0x21, 0x00, 0x00, 0xE1, 0x21, 0x00, 0x00, 0xE1, 0x21, 0x00, 0x00, 0x31, 0x22, 0x00, 0x00, 0x31, -/* 00003910 */ 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x00, 0x77, 0x22, 0x00, 0x00, 0x77, -/* 00003920 */ 0x22, 0x00, 0x00, 0xEA, 0x22, 0x00, 0x00, 0xEA, 0x22, 0x00, 0x00, 0x03, 0x23, 0x00, 0x00, 0x03, -/* 00003930 */ 0x23, 0x00, 0x00, 0x27, 0x23, 0x00, 0x00, 0x27, 0x23, 0x00, 0x00, 0x4B, 0x23, 0x00, 0x00, 0x4B, -/* 00003940 */ 0x23, 0x00, 0x00, 0xA3, 0x23, 0x00, 0x00, 0xA3, 0x23, 0x00, 0x00, 0xE6, 0x23, 0x00, 0x00, 0xE6, -/* 00003950 */ 0x23, 0x00, 0x00, 0x6F, 0x24, 0x00, 0x00, 0x6F, 0x24, 0x00, 0x00, 0x70, 0x24, 0x00, 0x00, 0x70, -/* 00003960 */ 0x24, 0x00, 0x00, 0x8B, 0x24, 0x00, 0x00, 0x8B, 0x24, 0x00, 0x00, 0x91, 0x24, 0x00, 0x00, 0x91, -/* 00003970 */ 0x24, 0x00, 0x00, 0x92, 0x24, 0x00, 0x00, 0x92, 0x24, 0x00, 0x00, 0xEC, 0x24, 0x00, 0x00, 0xEC, -/* 00003980 */ 0x24, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x42, 0x25, 0x00, 0x00, 0x42, -/* 00003990 */ 0x25, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x00, 0xD2, 0x25, 0x00, 0x00, 0xD2, -/* 000039A0 */ 0x25, 0x00, 0x00, 0xDC, 0x25, 0x00, 0x00, 0xDC, 0x25, 0x00, 0x00, 0xDD, 0x25, 0x00, 0x00, 0xDD, -/* 000039B0 */ 0x25, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0x44, 0x26, 0x00, 0x00, 0x44, -/* 000039C0 */ 0x26, 0x00, 0x00, 0xA0, 0x26, 0x00, 0x00, 0xA0, 0x26, 0x00, 0x00, 0xB0, 0x26, 0x00, 0x00, 0xB0, -/* 000039D0 */ 0x26, 0x00, 0x00, 0xBA, 0x26, 0x00, 0x00, 0xBA, 0x26, 0x00, 0x00, 0xBB, 0x26, 0x00, 0x00, 0xBB, -/* 000039E0 */ 0x26, 0x00, 0x00, 0x4A, 0x27, 0x00, 0x00, 0x4A, 0x27, 0x00, 0x00, 0xD0, 0x27, 0x00, 0x00, 0xD0, -/* 000039F0 */ 0x27, 0x00, 0x00, 0x4B, 0x28, 0x00, 0x00, 0x4B, 0x28, 0x00, 0x00, 0x94, 0x28, 0x00, 0x00, 0x94, -/* 00003A00 */ 0x28, 0x00, 0x00, 0xCA, 0x28, 0x00, 0x00, 0xCA, 0x28, 0x00, 0x00, 0xCB, 0x28, 0x00, 0x00, 0xCB, -/* 00003A10 */ 0x28, 0x00, 0x00, 0x17, 0x29, 0x00, 0x00, 0x17, 0x29, 0x00, 0x00, 0x36, 0x29, 0x00, 0x00, 0x36, -/* 00003A20 */ 0x29, 0x00, 0x00, 0x87, 0x29, 0x00, 0x00, 0x87, 0x29, 0x00, 0x00, 0x01, 0x2A, 0x00, 0x00, 0x01, -/* 00003A30 */ 0x2A, 0x00, 0x00, 0x25, 0x2A, 0x00, 0x00, 0x25, 0x2A, 0x00, 0x00, 0x80, 0x2A, 0x00, 0x00, 0x80, -/* 00003A40 */ 0x2A, 0x00, 0x00, 0xCB, 0x2A, 0x00, 0x00, 0xCB, 0x2A, 0x00, 0x00, 0xDD, 0x2A, 0x00, 0x00, 0xDD, -/* 00003A50 */ 0x2A, 0x00, 0x00, 0xEE, 0x2A, 0x00, 0x00, 0xEE, 0x2A, 0x00, 0x00, 0x0E, 0x2B, 0x00, 0x00, 0x0E, -/* 00003A60 */ 0x2B, 0x00, 0x00, 0x18, 0x2B, 0x00, 0x00, 0x18, 0x2B, 0x00, 0x00, 0x19, 0x2B, 0x00, 0x00, 0x19, -/* 00003A70 */ 0x2B, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0xB6, 0x2B, 0x00, 0x00, 0xB6, -/* 00003A80 */ 0x2B, 0x00, 0x00, 0xEB, 0x2B, 0x00, 0x00, 0xEB, 0x2B, 0x00, 0x00, 0x14, 0x2C, 0x00, 0x00, 0x14, -/* 00003A90 */ 0x2C, 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x00, 0x66, 0x2C, 0x00, 0x00, 0x66, -/* 00003AA0 */ 0x2C, 0x00, 0x00, 0x90, 0x2C, 0x00, 0x00, 0x90, 0x2C, 0x00, 0x00, 0xB5, 0x2C, 0x00, 0x00, 0xB5, -/* 00003AB0 */ 0x2C, 0x00, 0x00, 0xCE, 0x2C, 0x00, 0x00, 0xCE, 0x2C, 0x00, 0x00, 0xF5, 0x2C, 0x00, 0x00, 0xF5, -/* 00003AC0 */ 0x2C, 0x00, 0x00, 0x07, 0x2D, 0x00, 0x00, 0x07, 0x2D, 0x00, 0x00, 0x15, 0x2D, 0x00, 0x00, 0x15, -/* 00003AD0 */ 0x2D, 0x00, 0x00, 0x16, 0x2D, 0x00, 0x00, 0x16, 0x2D, 0x00, 0x00, 0x61, 0x2D, 0x00, 0x00, 0x61, -/* 00003AE0 */ 0x2D, 0x00, 0x00, 0x72, 0x2D, 0x00, 0x00, 0x72, 0x2D, 0x00, 0x00, 0x94, 0x2D, 0x00, 0x00, 0x94, -/* 00003AF0 */ 0x2D, 0x00, 0x00, 0x9E, 0x2D, 0x00, 0x00, 0x9E, 0x2D, 0x00, 0x00, 0x9F, 0x2D, 0x00, 0x00, 0x9F, -/* 00003B00 */ 0x2D, 0x00, 0x00, 0xBD, 0x2D, 0x00, 0x00, 0xBD, 0x2D, 0x00, 0x00, 0xDB, 0x2D, 0x00, 0x00, 0xDB, -/* 00003B10 */ 0x2D, 0x00, 0x00, 0xF9, 0x2D, 0x00, 0x00, 0xF9, 0x2D, 0x00, 0x00, 0x2A, 0x2E, 0x00, 0x00, 0x2A, -/* 00003B20 */ 0x2E, 0x00, 0x00, 0x3C, 0x2E, 0x00, 0x00, 0x3C, 0x2E, 0x00, 0x00, 0x42, 0x2E, 0x00, 0x00, 0x42, -/* 00003B30 */ 0x2E, 0x00, 0x00, 0x43, 0x2E, 0x00, 0x00, 0x43, 0x2E, 0x00, 0x00, 0xA3, 0x2E, 0x00, 0x00, 0xA3, -/* 00003B40 */ 0x2E, 0x00, 0x00, 0xFB, 0x2E, 0x00, 0x00, 0xFB, 0x2E, 0x00, 0x00, 0x2E, 0x2F, 0x00, 0x00, 0x2E, -/* 00003B50 */ 0x2F, 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x00, 0x60, 0x2F, 0x00, 0x00, 0x60, -/* 00003B60 */ 0x2F, 0x00, 0x00, 0x61, 0x2F, 0x00, 0x00, 0x61, 0x2F, 0x00, 0x00, 0x95, 0x2F, 0x00, 0x00, 0x95, -/* 00003B70 */ 0x2F, 0x00, 0x00, 0xC0, 0x2F, 0x00, 0x00, 0xC0, 0x2F, 0x00, 0x00, 0x29, 0x30, 0x00, 0x00, 0x29, -/* 00003B80 */ 0x30, 0x00, 0x00, 0x5A, 0x30, 0x00, 0x00, 0x5A, 0x30, 0x00, 0x00, 0x7B, 0x30, 0x00, 0x00, 0x7B, -/* 00003B90 */ 0x30, 0x00, 0x00, 0x89, 0x30, 0x00, 0x00, 0x89, 0x30, 0x00, 0x00, 0x93, 0x30, 0x00, 0x00, 0x93, -/* 00003BA0 */ 0x30, 0x00, 0x00, 0xE8, 0x30, 0x00, 0x00, 0xE8, 0x30, 0x00, 0x00, 0xEE, 0x30, 0x00, 0x00, 0xEE, -/* 00003BB0 */ 0x30, 0x00, 0x00, 0xEF, 0x30, 0x00, 0x00, 0xEF, 0x30, 0x00, 0x00, 0x32, 0x31, 0x00, 0x00, 0x32, -/* 00003BC0 */ 0x31, 0x00, 0x00, 0x5F, 0x31, 0x00, 0x00, 0x5F, 0x31, 0x00, 0x00, 0x8D, 0x31, 0x00, 0x00, 0x8D, -/* 00003BD0 */ 0x31, 0x00, 0x00, 0xB4, 0x31, 0x00, 0x00, 0xB4, 0x31, 0x00, 0x00, 0xE0, 0x31, 0x00, 0x00, 0xE0, -/* 00003BE0 */ 0x31, 0x00, 0x00, 0xEA, 0x31, 0x00, 0x00, 0xEA, 0x31, 0x00, 0x00, 0xEB, 0x31, 0x00, 0x00, 0xEB, -/* 00003BF0 */ 0x31, 0x00, 0x00, 0x0D, 0x32, 0x00, 0x00, 0x0D, 0x32, 0x00, 0x00, 0x32, 0x32, 0x00, 0x00, 0x32, -/* 00003C00 */ 0x32, 0x00, 0x00, 0x5A, 0x32, 0x00, 0x00, 0x5A, 0x32, 0x00, 0x00, 0x68, 0x32, 0x00, 0x00, 0x68, -/* 00003C10 */ 0x32, 0x00, 0x00, 0x69, 0x32, 0x00, 0x00, 0x69, 0x32, 0x00, 0x00, 0x95, 0x32, 0x00, 0x00, 0x95, -/* 00003C20 */ 0x32, 0x00, 0x00, 0xE2, 0x32, 0x00, 0x00, 0xE2, 0x32, 0x00, 0x00, 0xFB, 0x32, 0x00, 0x00, 0xFB, -/* 00003C30 */ 0x32, 0x00, 0x00, 0x39, 0x33, 0x00, 0x00, 0x39, 0x33, 0x00, 0x00, 0x6D, 0x33, 0x00, 0x00, 0x6D, -/* 00003C40 */ 0x33, 0x00, 0x00, 0x82, 0x33, 0x00, 0x00, 0x82, 0x33, 0x00, 0x00, 0xB1, 0x33, 0x00, 0x00, 0xB1, -/* 00003C50 */ 0x33, 0x00, 0x00, 0xBF, 0x33, 0x00, 0x00, 0xBF, 0x33, 0x00, 0x00, 0xD0, 0x33, 0x00, 0x00, 0xD0, -/* 00003C60 */ 0x33, 0x00, 0x00, 0x21, 0x34, 0x00, 0x00, 0x21, 0x34, 0x00, 0x00, 0x51, 0x34, 0x00, 0x00, 0x51, -/* 00003C70 */ 0x34, 0x00, 0x00, 0xB7, 0x34, 0x00, 0x00, 0xB7, 0x34, 0x00, 0x00, 0xC1, 0x34, 0x00, 0x00, 0xC1, -/* 00003C80 */ 0x34, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0xEA, 0x34, 0x00, 0x00, 0xEA, -/* 00003C90 */ 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF2, 0x34, 0x00, 0x00, 0xF2, -/* 00003CA0 */ 0x34, 0x00, 0x00, 0x14, 0x35, 0x00, 0x00, 0x14, 0x35, 0x00, 0x00, 0x32, 0x35, 0x00, 0x00, 0x32, -/* 00003CB0 */ 0x35, 0x00, 0x00, 0x57, 0x35, 0x00, 0x00, 0x57, 0x35, 0x00, 0x00, 0x79, 0x35, 0x00, 0x00, 0x79, -/* 00003CC0 */ 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xBB, 0x35, 0x00, 0x00, 0xBB, -/* 00003CD0 */ 0x35, 0x00, 0x00, 0xFB, 0x35, 0x00, 0x00, 0xFB, 0x35, 0x00, 0x00, 0x0A, 0x36, 0x00, 0x00, 0x0A, -/* 00003CE0 */ 0x36, 0x00, 0x00, 0x0B, 0x36, 0x00, 0x00, 0x0B, 0x36, 0x00, 0x00, 0x30, 0x36, 0x00, 0x00, 0x30, -/* 00003CF0 */ 0x36, 0x00, 0x00, 0x70, 0x36, 0x00, 0x00, 0x70, 0x36, 0x00, 0x00, 0x7F, 0x36, 0x00, 0x00, 0x7F, -/* 00003D00 */ 0x36, 0x00, 0x00, 0x80, 0x36, 0x00, 0x00, 0x80, 0x36, 0x00, 0x00, 0xA5, 0x36, 0x00, 0x00, 0xA5, -/* 00003D10 */ 0x36, 0x00, 0x00, 0xDF, 0x36, 0x00, 0x00, 0xDF, 0x36, 0x00, 0x00, 0xEE, 0x36, 0x00, 0x00, 0xEE, -/* 00003D20 */ 0x36, 0x00, 0x00, 0xEF, 0x36, 0x00, 0x00, 0xEF, 0x36, 0x00, 0x00, 0x1C, 0x37, 0x00, 0x00, 0x1C, -/* 00003D30 */ 0x37, 0x00, 0x00, 0x5D, 0x37, 0x00, 0x00, 0x5D, 0x37, 0x00, 0x00, 0x6C, 0x37, 0x00, 0x00, 0x6C, -/* 00003D40 */ 0x37, 0x00, 0x00, 0x6D, 0x37, 0x00, 0x00, 0x6D, 0x37, 0x00, 0x00, 0x92, 0x37, 0x00, 0x00, 0x92, -/* 00003D50 */ 0x37, 0x00, 0x00, 0xB7, 0x37, 0x00, 0x00, 0xB7, 0x37, 0x00, 0x00, 0xD4, 0x37, 0x00, 0x00, 0xD4, -/* 00003D60 */ 0x37, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x43, 0x38, 0x00, 0x00, 0x43, -/* 00003D70 */ 0x38, 0x00, 0x00, 0x55, 0x38, 0x00, 0x00, 0x55, 0x38, 0x00, 0x00, 0x71, 0x38, 0x00, 0x00, 0x71, -/* 00003D80 */ 0x38, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x81, 0x38, 0x00, 0x00, 0x81, -/* 00003D90 */ 0x38, 0x00, 0x00, 0xAC, 0x38, 0x00, 0x00, 0xAC, 0x38, 0x00, 0x00, 0xD8, 0x38, 0x00, 0x00, 0xD8, -/* 00003DA0 */ 0x38, 0x00, 0x00, 0xF4, 0x38, 0x00, 0x00, 0xF4, 0x38, 0x00, 0x00, 0x44, 0x39, 0x00, 0x00, 0x44, -/* 00003DB0 */ 0x39, 0x00, 0x00, 0x69, 0x39, 0x00, 0x00, 0x69, 0x39, 0x00, 0x00, 0x7F, 0x39, 0x00, 0x00, 0x7F, -/* 00003DC0 */ 0x39, 0x00, 0x00, 0xB0, 0x39, 0x00, 0x00, 0xB0, 0x39, 0x00, 0x00, 0xC2, 0x39, 0x00, 0x00, 0xC2, -/* 00003DD0 */ 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0xE1, 0x39, 0x00, 0x00, 0xE1, -/* 00003DE0 */ 0x39, 0x00, 0x00, 0xEB, 0x39, 0x00, 0x00, 0xEB, 0x39, 0x00, 0x00, 0xEC, 0x39, 0x00, 0x00, 0xEC, -/* 00003DF0 */ 0x39, 0x00, 0x00, 0x13, 0x3A, 0x00, 0x00, 0x13, 0x3A, 0x00, 0x00, 0x57, 0x3A, 0x00, 0x00, 0x57, -/* 00003E00 */ 0x3A, 0x00, 0x00, 0x7E, 0x3A, 0x00, 0x00, 0x7E, 0x3A, 0x00, 0x00, 0x7F, 0x3A, 0x00, 0x00, 0x7F, -/* 00003E10 */ 0x3A, 0x00, 0x00, 0xA2, 0x3A, 0x00, 0x00, 0xA2, 0x3A, 0x00, 0x00, 0xC7, 0x3A, 0x00, 0x00, 0xC7, -/* 00003E20 */ 0x3A, 0x00, 0x00, 0x01, 0x3B, 0x00, 0x00, 0x01, 0x3B, 0x00, 0x00, 0x0F, 0x3B, 0x00, 0x00, 0x0F, -/* 00003E30 */ 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x34, 0x3B, 0x00, 0x00, 0x34, -/* 00003E40 */ 0x3B, 0x00, 0x00, 0x66, 0x3B, 0x00, 0x00, 0x66, 0x3B, 0x00, 0x00, 0x74, 0x3B, 0x00, 0x00, 0x74, -/* 00003E50 */ 0x3B, 0x00, 0x00, 0x75, 0x3B, 0x00, 0x00, 0x75, 0x3B, 0x00, 0x00, 0x99, 0x3B, 0x00, 0x00, 0x99, -/* 00003E60 */ 0x3B, 0x00, 0x00, 0xCB, 0x3B, 0x00, 0x00, 0xCB, 0x3B, 0x00, 0x00, 0xD9, 0x3B, 0x00, 0x00, 0xD9, -/* 00003E70 */ 0x3B, 0x00, 0x00, 0xDA, 0x3B, 0x00, 0x00, 0xDA, 0x3B, 0x00, 0x00, 0x41, 0x3C, 0x00, 0x00, 0x41, -/* 00003E80 */ 0x3C, 0x00, 0x00, 0xDC, 0x3C, 0x00, 0x00, 0xDC, 0x3C, 0x00, 0x00, 0xEA, 0x3C, 0x00, 0x00, 0xEA, -/* 00003E90 */ 0x3C, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0x00, 0x05, 0x3D, 0x00, 0x00, 0x05, -/* 00003EA0 */ 0x3D, 0x00, 0x00, 0x0F, 0x3D, 0x00, 0x00, 0x0F, 0x3D, 0x00, 0x00, 0x10, 0x3D, 0x00, 0x00, 0x10, -/* 00003EB0 */ 0x3D, 0x00, 0x00, 0x29, 0x3D, 0x00, 0x00, 0x29, 0x3D, 0x00, 0x00, 0x2F, 0x3D, 0x00, 0x00, 0x2F, -/* 00003EC0 */ 0x3D, 0x00, 0x00, 0x30, 0x3D, 0x00, 0x00, 0x30, 0x3D, 0x00, 0x00, 0x7E, 0x3D, 0x00, 0x00, 0x7E, -/* 00003ED0 */ 0x3D, 0x00, 0x00, 0xAA, 0x3D, 0x00, 0x00, 0xAA, 0x3D, 0x00, 0x00, 0xAB, 0x3D, 0x00, 0x00, 0xAB, -/* 00003EE0 */ 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0x1A, 0x3E, 0x00, 0x00, 0x1A, -/* 00003EF0 */ 0x3E, 0x00, 0x00, 0x1B, 0x3E, 0x00, 0x00, 0x1B, 0x3E, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0x7C, -/* 00003F00 */ 0x3E, 0x00, 0x00, 0xFE, 0x3E, 0x00, 0x00, 0xFE, 0x3E, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x00, 0x0C, -/* 00003F10 */ 0x3F, 0x00, 0x00, 0x0D, 0x3F, 0x00, 0x00, 0x0D, 0x3F, 0x00, 0x00, 0x3C, 0x3F, 0x00, 0x00, 0x3C, -/* 00003F20 */ 0x3F, 0x00, 0x00, 0x4D, 0x3F, 0x00, 0x00, 0x4D, 0x3F, 0x00, 0x00, 0x6A, 0x3F, 0x00, 0x00, 0x6A, -/* 00003F30 */ 0x3F, 0x00, 0x00, 0x74, 0x3F, 0x00, 0x00, 0x74, 0x3F, 0x00, 0x00, 0x7A, 0x3F, 0x00, 0x00, 0x7A, -/* 00003F40 */ 0x3F, 0x00, 0x00, 0x7B, 0x3F, 0x00, 0x00, 0x7B, 0x3F, 0x00, 0x00, 0x95, 0x3F, 0x00, 0x00, 0x95, -/* 00003F50 */ 0x3F, 0x00, 0x00, 0xBF, 0x3F, 0x00, 0x00, 0xBF, 0x3F, 0x00, 0x00, 0xE9, 0x3F, 0x00, 0x00, 0xE9, -/* 00003F60 */ 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xF0, -/* 00003F70 */ 0x3F, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x74, 0x40, 0x00, 0x00, 0x74, -/* 00003F80 */ 0x40, 0x00, 0x00, 0xD2, 0x40, 0x00, 0x00, 0xD2, 0x40, 0x00, 0x00, 0xF8, 0x40, 0x00, 0x00, 0xF8, -/* 00003F90 */ 0x40, 0x00, 0x00, 0x3D, 0x41, 0x00, 0x00, 0x3D, 0x41, 0x00, 0x00, 0xA1, 0x41, 0x00, 0x00, 0xA1, -/* 00003FA0 */ 0x41, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x22, 0x42, 0x00, 0x00, 0x22, -/* 00003FB0 */ 0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0xC5, 0x42, 0x00, 0x00, 0xC5, -/* 00003FC0 */ 0x42, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x66, 0x43, 0x00, 0x00, 0x66, -/* 00003FD0 */ 0x43, 0x00, 0x00, 0xBA, 0x43, 0x00, 0x00, 0xBA, 0x43, 0x00, 0x00, 0xF2, 0x43, 0x00, 0x00, 0xF2, -/* 00003FE0 */ 0x43, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x96, 0x44, 0x00, 0x00, 0x96, -/* 00003FF0 */ 0x44, 0x00, 0x00, 0xEB, 0x44, 0x00, 0x00, 0xEB, 0x44, 0x00, 0x00, 0x57, 0x45, 0x00, 0x00, 0x57, -/* 00004000 */ 0x45, 0x00, 0x00, 0xAD, 0x45, 0x00, 0x00, 0xAD, 0x45, 0x00, 0x00, 0xAE, 0x45, 0x00, 0x00, 0xAE, -/* 00004010 */ 0x45, 0x00, 0x00, 0xCD, 0x45, 0x00, 0x00, 0xCD, 0x45, 0x00, 0x00, 0xEC, 0x45, 0x00, 0x00, 0xEC, -/* 00004020 */ 0x45, 0x00, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x1F, 0x46, 0x00, 0x00, 0x1F, -/* 00004030 */ 0x46, 0x00, 0x00, 0x96, 0x46, 0x00, 0x00, 0x96, 0x46, 0x00, 0x00, 0x03, 0x47, 0x00, 0x00, 0x03, -/* 00004040 */ 0x47, 0x00, 0x00, 0x56, 0x47, 0x00, 0x00, 0x56, 0x47, 0x00, 0x00, 0x99, 0x47, 0x00, 0x00, 0x99, -/* 00004050 */ 0x47, 0x00, 0x00, 0x9A, 0x47, 0x00, 0x00, 0x9A, 0x47, 0x00, 0x00, 0x17, 0x48, 0x00, 0x00, 0x17, -/* 00004060 */ 0x48, 0x00, 0x00, 0xAB, 0x48, 0x00, 0x00, 0xAB, 0x48, 0x00, 0x00, 0x2E, 0x49, 0x00, 0x00, 0x2E, -/* 00004070 */ 0x49, 0x00, 0x00, 0xB1, 0x49, 0x00, 0x00, 0xB1, 0x49, 0x00, 0x00, 0x24, 0x4A, 0x00, 0x00, 0x24, -/* 00004080 */ 0x4A, 0x00, 0x00, 0x25, 0x4A, 0x00, 0x00, 0x25, 0x4A, 0x00, 0x00, 0x8F, 0x4A, 0x00, 0x00, 0x8F, -/* 00004090 */ 0x4A, 0x00, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x09, 0x4B, 0x00, 0x00, 0x09, -/* 000040A0 */ 0x4B, 0x00, 0x00, 0x6C, 0x4B, 0x00, 0x00, 0x6C, 0x4B, 0x00, 0x00, 0xFB, 0x4B, 0x00, 0x00, 0xFB, -/* 000040B0 */ 0x4B, 0x00, 0x00, 0xA4, 0x4C, 0x00, 0x00, 0xA4, 0x4C, 0x00, 0x00, 0x38, 0x4D, 0x00, 0x00, 0x38, -/* 000040C0 */ 0x4D, 0x00, 0x00, 0xCF, 0x4D, 0x00, 0x00, 0xCF, 0x4D, 0x00, 0x00, 0x73, 0x4E, 0x00, 0x00, 0x73, -/* 000040D0 */ 0x4E, 0x00, 0x00, 0x87, 0x4E, 0x00, 0x00, 0x87, 0x4E, 0x00, 0x00, 0x88, 0x4E, 0x00, 0x00, 0x88, -/* 000040E0 */ 0x4E, 0x00, 0x00, 0x09, 0x4F, 0x00, 0x00, 0x09, 0x4F, 0x00, 0x00, 0x75, 0x4F, 0x00, 0x00, 0x75, -/* 000040F0 */ 0x4F, 0x00, 0x00, 0xE5, 0x4F, 0x00, 0x00, 0xE5, 0x4F, 0x00, 0x00, 0x55, 0x50, 0x00, 0x00, 0x55, -/* 00004100 */ 0x50, 0x00, 0x00, 0xC7, 0x50, 0x00, 0x00, 0xC7, 0x50, 0x00, 0x00, 0x3B, 0x51, 0x00, 0x00, 0x3B, -/* 00004110 */ 0x51, 0x00, 0x00, 0xAF, 0x51, 0x00, 0x00, 0xAF, 0x51, 0x00, 0x00, 0xF9, 0x51, 0x00, 0x00, 0xF9, -/* 00004120 */ 0x51, 0x00, 0x00, 0xFA, 0x51, 0x00, 0x00, 0xFA, 0x51, 0x00, 0x00, 0x67, 0x52, 0x00, 0x00, 0x67, -/* 00004130 */ 0x52, 0x00, 0x00, 0x68, 0x52, 0x00, 0x00, 0x68, 0x52, 0x00, 0x00, 0xCE, 0x52, 0x00, 0x00, 0xCE, -/* 00004140 */ 0x52, 0x00, 0x00, 0x59, 0x53, 0x00, 0x00, 0x59, 0x53, 0x00, 0x00, 0xCF, 0x53, 0x00, 0x00, 0xCF, -/* 00004150 */ 0x53, 0x00, 0x00, 0xD5, 0x53, 0x00, 0x00, 0xD5, 0x53, 0x00, 0x00, 0xD6, 0x53, 0x00, 0x00, 0xD6, -/* 00004160 */ 0x53, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x2C, 0x54, 0x00, 0x00, 0x2C, -/* 00004170 */ 0x54, 0x00, 0x00, 0x2D, 0x54, 0x00, 0x00, 0x2D, 0x54, 0x00, 0x00, 0x4E, 0x54, 0x00, 0x00, 0x4E, -/* 00004180 */ 0x54, 0x00, 0x00, 0x76, 0x54, 0x00, 0x00, 0x76, 0x54, 0x00, 0x00, 0x80, 0x54, 0x00, 0x00, 0x80, -/* 00004190 */ 0x54, 0x00, 0x00, 0x81, 0x54, 0x00, 0x00, 0x81, 0x54, 0x00, 0x00, 0xCD, 0x54, 0x00, 0x00, 0xCD, -/* 000041A0 */ 0x54, 0x00, 0x00, 0xD3, 0x54, 0x00, 0x00, 0xD3, 0x54, 0x00, 0x00, 0xD4, 0x54, 0x00, 0x00, 0xD4, -/* 000041B0 */ 0x54, 0x00, 0x00, 0x4B, 0x55, 0x00, 0x00, 0x4B, 0x55, 0x00, 0x00, 0x7A, 0x55, 0x00, 0x00, 0x7A, -/* 000041C0 */ 0x55, 0x00, 0x00, 0xA8, 0x55, 0x00, 0x00, 0xA8, 0x55, 0x00, 0x00, 0xBF, 0x55, 0x00, 0x00, 0xBF, -/* 000041D0 */ 0x55, 0x00, 0x00, 0xC9, 0x55, 0x00, 0x00, 0xC9, 0x55, 0x00, 0x00, 0xCA, 0x55, 0x00, 0x00, 0xCA, -/* 000041E0 */ 0x55, 0x00, 0x00, 0xF5, 0x55, 0x00, 0x00, 0xF5, 0x55, 0x00, 0x00, 0x16, 0x56, 0x00, 0x00, 0x16, -/* 000041F0 */ 0x56, 0x00, 0x00, 0x20, 0x56, 0x00, 0x00, 0x20, 0x56, 0x00, 0x00, 0x21, 0x56, 0x00, 0x00, 0x21, -/* 00004200 */ 0x56, 0x00, 0x00, 0x4F, 0x56, 0x00, 0x00, 0x4F, 0x56, 0x00, 0x00, 0x89, 0x56, 0x00, 0x00, 0x89, -/* 00004210 */ 0x56, 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0xBF, 0x56, 0x00, 0x00, 0xBF, -/* 00004220 */ 0x56, 0x00, 0x00, 0xD6, 0x56, 0x00, 0x00, 0xD6, 0x56, 0x00, 0x00, 0xD7, 0x56, 0x00, 0x00, 0xD7, -/* 00004230 */ 0x56, 0x00, 0x00, 0x15, 0x57, 0x00, 0x00, 0x15, 0x57, 0x00, 0x00, 0x76, 0x57, 0x00, 0x00, 0x76, -/* 00004240 */ 0x57, 0x00, 0x00, 0xB2, 0x57, 0x00, 0x00, 0xB2, 0x57, 0x00, 0x00, 0xC0, 0x57, 0x00, 0x00, 0xC0, -/* 00004250 */ 0x57, 0x00, 0x00, 0xC1, 0x57, 0x00, 0x00, 0xC1, 0x57, 0x00, 0x00, 0xF2, 0x57, 0x00, 0x00, 0xF2, -/* 00004260 */ 0x57, 0x00, 0x00, 0xF3, 0x57, 0x00, 0x00, 0xF3, 0x57, 0x00, 0x00, 0x24, 0x58, 0x00, 0x00, 0x24, -/* 00004270 */ 0x58, 0x00, 0x00, 0x64, 0x58, 0x00, 0x00, 0x64, 0x58, 0x00, 0x00, 0x72, 0x58, 0x00, 0x00, 0x72, -/* 00004280 */ 0x58, 0x00, 0x00, 0x73, 0x58, 0x00, 0x00, 0x73, 0x58, 0x00, 0x00, 0xA9, 0x58, 0x00, 0x00, 0xA9, -/* 00004290 */ 0x58, 0x00, 0x00, 0xAA, 0x58, 0x00, 0x00, 0xAA, 0x58, 0x00, 0x00, 0x0B, 0x59, 0x00, 0x00, 0x0B, -/* 000042A0 */ 0x59, 0x00, 0x00, 0x4B, 0x59, 0x00, 0x00, 0x4B, 0x59, 0x00, 0x00, 0x59, 0x59, 0x00, 0x00, 0x59, -/* 000042B0 */ 0x59, 0x00, 0x00, 0x65, 0x59, 0x00, 0x00, 0x65, 0x59, 0x00, 0x00, 0x66, 0x59, 0x00, 0x00, 0x66, -/* 000042C0 */ 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x81, 0x59, 0x00, 0x00, 0x81, -/* 000042D0 */ 0x59, 0x00, 0x00, 0x82, 0x59, 0x00, 0x00, 0x82, 0x59, 0x00, 0x00, 0xD1, 0x59, 0x00, 0x00, 0xD1, -/* 000042E0 */ 0x59, 0x00, 0x00, 0xEA, 0x59, 0x00, 0x00, 0xEA, 0x59, 0x00, 0x00, 0x01, 0x5A, 0x00, 0x00, 0x01, -/* 000042F0 */ 0x5A, 0x00, 0x00, 0x56, 0x5A, 0x00, 0x00, 0x56, 0x5A, 0x00, 0x00, 0x68, 0x5A, 0x00, 0x00, 0x68, -/* 00004300 */ 0x5A, 0x00, 0x00, 0xC6, 0x5A, 0x00, 0x00, 0xC6, 0x5A, 0x00, 0x00, 0xED, 0x5A, 0x00, 0x00, 0xED, -/* 00004310 */ 0x5A, 0x00, 0x00, 0x7A, 0x5B, 0x00, 0x00, 0x7A, 0x5B, 0x00, 0x00, 0xA1, 0x5B, 0x00, 0x00, 0xA1, -/* 00004320 */ 0x5B, 0x00, 0x00, 0xB3, 0x5B, 0x00, 0x00, 0xB3, 0x5B, 0x00, 0x00, 0xCE, 0x5B, 0x00, 0x00, 0xCE, -/* 00004330 */ 0x5B, 0x00, 0x00, 0xF5, 0x5B, 0x00, 0x00, 0xF5, 0x5B, 0x00, 0x00, 0x57, 0x5C, 0x00, 0x00, 0x57, -/* 00004340 */ 0x5C, 0x00, 0x00, 0x65, 0x5C, 0x00, 0x00, 0x65, 0x5C, 0x00, 0x00, 0x71, 0x5C, 0x00, 0x00, 0x71, -/* 00004350 */ 0x5C, 0x00, 0x00, 0xD9, 0x5C, 0x00, 0x00, 0xD9, 0x5C, 0x00, 0x00, 0xF0, 0x5C, 0x00, 0x00, 0xF0, -/* 00004360 */ 0x5C, 0x00, 0x00, 0xF6, 0x5C, 0x00, 0x00, 0xF6, 0x5C, 0x00, 0x00, 0xF7, 0x5C, 0x00, 0x00, 0xF7, -/* 00004370 */ 0x5C, 0x00, 0x00, 0x4D, 0x5D, 0x00, 0x00, 0x4D, 0x5D, 0x00, 0x00, 0x80, 0x5D, 0x00, 0x00, 0x80, -/* 00004380 */ 0x5D, 0x00, 0x00, 0xB9, 0x5D, 0x00, 0x00, 0xB9, 0x5D, 0x00, 0x00, 0xC3, 0x5D, 0x00, 0x00, 0xC3, -/* 00004390 */ 0x5D, 0x00, 0x00, 0xC4, 0x5D, 0x00, 0x00, 0xC4, 0x5D, 0x00, 0x00, 0xFC, 0x5D, 0x00, 0x00, 0xFC, -/* 000043A0 */ 0x5D, 0x00, 0x00, 0x37, 0x5E, 0x00, 0x00, 0x37, 0x5E, 0x00, 0x00, 0x70, 0x5E, 0x00, 0x00, 0x70, -/* 000043B0 */ 0x5E, 0x00, 0x00, 0x7A, 0x5E, 0x00, 0x00, 0x7A, 0x5E, 0x00, 0x00, 0x7B, 0x5E, 0x00, 0x00, 0x7B, -/* 000043C0 */ 0x5E, 0x00, 0x00, 0xB0, 0x5E, 0x00, 0x00, 0xB0, 0x5E, 0x00, 0x00, 0xB6, 0x5E, 0x00, 0x00, 0xB6, -/* 000043D0 */ 0x5E, 0x00, 0x00, 0xB7, 0x5E, 0x00, 0x00, 0xB7, 0x5E, 0x00, 0x00, 0x08, 0x5F, 0x00, 0x00, 0x08, -/* 000043E0 */ 0x5F, 0x00, 0x00, 0x3B, 0x5F, 0x00, 0x00, 0x3B, 0x5F, 0x00, 0x00, 0x74, 0x5F, 0x00, 0x00, 0x74, -/* 000043F0 */ 0x5F, 0x00, 0x00, 0x7E, 0x5F, 0x00, 0x00, 0x7E, 0x5F, 0x00, 0x00, 0x7F, 0x5F, 0x00, 0x00, 0x7F, -/* 00004400 */ 0x5F, 0x00, 0x00, 0xB7, 0x5F, 0x00, 0x00, 0xB7, 0x5F, 0x00, 0x00, 0xF2, 0x5F, 0x00, 0x00, 0xF2, -/* 00004410 */ 0x5F, 0x00, 0x00, 0x2B, 0x60, 0x00, 0x00, 0x2B, 0x60, 0x00, 0x00, 0x35, 0x60, 0x00, 0x00, 0x35, -/* 00004420 */ 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x66, -/* 00004430 */ 0x60, 0x00, 0x00, 0x6C, 0x60, 0x00, 0x00, 0x6C, 0x60, 0x00, 0x00, 0x6D, 0x60, 0x00, 0x00, 0x6D, -/* 00004440 */ 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0xD1, 0x60, 0x00, 0x00, 0xD1, -/* 00004450 */ 0x60, 0x00, 0x00, 0xE6, 0x60, 0x00, 0x00, 0xE6, 0x60, 0x00, 0x00, 0x19, 0x61, 0x00, 0x00, 0x19, -/* 00004460 */ 0x61, 0x00, 0x00, 0x1A, 0x61, 0x00, 0x00, 0x1A, 0x61, 0x00, 0x00, 0x48, 0x61, 0x00, 0x00, 0x48, -/* 00004470 */ 0x61, 0x00, 0x00, 0x75, 0x61, 0x00, 0x00, 0x75, 0x61, 0x00, 0x00, 0x76, 0x61, 0x00, 0x00, 0x76, -/* 00004480 */ 0x61, 0x00, 0x00, 0xA8, 0x61, 0x00, 0x00, 0xA8, 0x61, 0x00, 0x00, 0xDE, 0x61, 0x00, 0x00, 0xDE, -/* 00004490 */ 0x61, 0x00, 0x00, 0xDF, 0x61, 0x00, 0x00, 0xDF, 0x61, 0x00, 0x00, 0x25, 0x62, 0x00, 0x00, 0x25, -/* 000044A0 */ 0x62, 0x00, 0x00, 0x9C, 0x62, 0x00, 0x00, 0x9C, 0x62, 0x00, 0x00, 0xAE, 0x62, 0x00, 0x00, 0xAE, -/* 000044B0 */ 0x62, 0x00, 0x00, 0xBC, 0x62, 0x00, 0x00, 0xBC, 0x62, 0x00, 0x00, 0xC6, 0x62, 0x00, 0x00, 0xC6, -/* 000044C0 */ 0x62, 0x00, 0x00, 0xC7, 0x62, 0x00, 0x00, 0xC7, 0x62, 0x00, 0x00, 0x0F, 0x63, 0x00, 0x00, 0x0F, -/* 000044D0 */ 0x63, 0x00, 0x00, 0x91, 0x63, 0x00, 0x00, 0x91, 0x63, 0x00, 0x00, 0xA2, 0x63, 0x00, 0x00, 0xA2, -/* 000044E0 */ 0x63, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x0E, 0x64, 0x00, 0x00, 0x0E, -/* 000044F0 */ 0x64, 0x00, 0x00, 0x15, 0x64, 0x00, 0x00, 0x15, 0x64, 0x00, 0x00, 0x16, 0x64, 0x00, 0x00, 0x16, -/* 00004500 */ 0x64, 0x00, 0x00, 0x52, 0x64, 0x00, 0x00, 0x52, 0x64, 0x00, 0x00, 0xB3, 0x64, 0x00, 0x00, 0xB3, -/* 00004510 */ 0x64, 0x00, 0x00, 0xB4, 0x64, 0x00, 0x00, 0xB4, 0x64, 0x00, 0x00, 0x27, 0x65, 0x00, 0x00, 0x27, -/* 00004520 */ 0x65, 0x00, 0x00, 0x77, 0x65, 0x00, 0x00, 0x77, 0x65, 0x00, 0x00, 0xC8, 0x65, 0x00, 0x00, 0xC8, -/* 00004530 */ 0x65, 0x00, 0x00, 0x4B, 0x66, 0x00, 0x00, 0x4B, 0x66, 0x00, 0x00, 0x8D, 0x66, 0x00, 0x00, 0x8D, -/* 00004540 */ 0x66, 0x00, 0x00, 0xDA, 0x66, 0x00, 0x00, 0xDA, 0x66, 0x00, 0x00, 0x42, 0x67, 0x00, 0x00, 0x42, -/* 00004550 */ 0x67, 0x00, 0x00, 0x68, 0x67, 0x00, 0x00, 0x68, 0x67, 0x00, 0x00, 0x69, 0x67, 0x00, 0x00, 0x69, -/* 00004560 */ 0x67, 0x00, 0x00, 0xC2, 0x67, 0x00, 0x00, 0xC2, 0x67, 0x00, 0x00, 0x4D, 0x68, 0x00, 0x00, 0x4D, -/* 00004570 */ 0x68, 0x00, 0x00, 0x93, 0x68, 0x00, 0x00, 0x93, 0x68, 0x00, 0x00, 0xE0, 0x68, 0x00, 0x00, 0xE0, -/* 00004580 */ 0x68, 0x00, 0x00, 0x4C, 0x69, 0x00, 0x00, 0x4C, 0x69, 0x00, 0x00, 0x72, 0x69, 0x00, 0x00, 0x72, -/* 00004590 */ 0x69, 0x00, 0x00, 0x73, 0x69, 0x00, 0x00, 0x73, 0x69, 0x00, 0x00, 0xD0, 0x69, 0x00, 0x00, 0xD0, -/* 000045A0 */ 0x69, 0x00, 0x00, 0x5F, 0x6A, 0x00, 0x00, 0x5F, 0x6A, 0x00, 0x00, 0xA7, 0x6A, 0x00, 0x00, 0xA7, -/* 000045B0 */ 0x6A, 0x00, 0x00, 0xF4, 0x6A, 0x00, 0x00, 0xF4, 0x6A, 0x00, 0x00, 0x62, 0x6B, 0x00, 0x00, 0x62, -/* 000045C0 */ 0x6B, 0x00, 0x00, 0x88, 0x6B, 0x00, 0x00, 0x88, 0x6B, 0x00, 0x00, 0x89, 0x6B, 0x00, 0x00, 0x89, -/* 000045D0 */ 0x6B, 0x00, 0x00, 0xCA, 0x6B, 0x00, 0x00, 0xCA, 0x6B, 0x00, 0x00, 0x3D, 0x6C, 0x00, 0x00, 0x3D, -/* 000045E0 */ 0x6C, 0x00, 0x00, 0x77, 0x6C, 0x00, 0x00, 0x77, 0x6C, 0x00, 0x00, 0xD2, 0x6C, 0x00, 0x00, 0xD2, -/* 000045F0 */ 0x6C, 0x00, 0x00, 0xF8, 0x6C, 0x00, 0x00, 0xF8, 0x6C, 0x00, 0x00, 0xF9, 0x6C, 0x00, 0x00, 0xF9, -/* 00004600 */ 0x6C, 0x00, 0x00, 0x52, 0x6D, 0x00, 0x00, 0x52, 0x6D, 0x00, 0x00, 0xAC, 0x6D, 0x00, 0x00, 0xAC, -/* 00004610 */ 0x6D, 0x00, 0x00, 0xFB, 0x6D, 0x00, 0x00, 0xFB, 0x6D, 0x00, 0x00, 0x77, 0x6E, 0x00, 0x00, 0x77, -/* 00004620 */ 0x6E, 0x00, 0x00, 0xD7, 0x6E, 0x00, 0x00, 0xD7, 0x6E, 0x00, 0x00, 0x3B, 0x6F, 0x00, 0x00, 0x3B, -/* 00004630 */ 0x6F, 0x00, 0x00, 0xA1, 0x6F, 0x00, 0x00, 0xA1, 0x6F, 0x00, 0x00, 0xFA, 0x6F, 0x00, 0x00, 0xFA, -/* 00004640 */ 0x6F, 0x00, 0x00, 0xFB, 0x6F, 0x00, 0x00, 0xFB, 0x6F, 0x00, 0x00, 0x62, 0x70, 0x00, 0x00, 0x62, -/* 00004650 */ 0x70, 0x00, 0x00, 0xA7, 0x70, 0x00, 0x00, 0xA7, 0x70, 0x00, 0x00, 0xEA, 0x70, 0x00, 0x00, 0xEA, -/* 00004660 */ 0x70, 0x00, 0x00, 0x23, 0x71, 0x00, 0x00, 0x23, 0x71, 0x00, 0x00, 0x5E, 0x71, 0x00, 0x00, 0x5E, -/* 00004670 */ 0x71, 0x00, 0x00, 0x99, 0x71, 0x00, 0x00, 0x99, 0x71, 0x00, 0x00, 0xD7, 0x71, 0x00, 0x00, 0xD7, -/* 00004680 */ 0x71, 0x00, 0x00, 0x14, 0x72, 0x00, 0x00, 0x14, 0x72, 0x00, 0x00, 0x49, 0x72, 0x00, 0x00, 0x49, -/* 00004690 */ 0x72, 0x00, 0x00, 0xAA, 0x72, 0x00, 0x00, 0xAA, 0x72, 0x00, 0x00, 0xF5, 0x72, 0x00, 0x00, 0xF5, -/* 000046A0 */ 0x72, 0x00, 0x00, 0x40, 0x73, 0x00, 0x00, 0x40, 0x73, 0x00, 0x00, 0x8B, 0x73, 0x00, 0x00, 0x8B, -/* 000046B0 */ 0x73, 0x00, 0x00, 0xD5, 0x73, 0x00, 0x00, 0xD5, 0x73, 0x00, 0x00, 0xD6, 0x73, 0x00, 0x00, 0xD6, -/* 000046C0 */ 0x73, 0x00, 0x00, 0x55, 0x74, 0x00, 0x00, 0x55, 0x74, 0x00, 0x00, 0xF0, 0x74, 0x00, 0x00, 0xF0, -/* 000046D0 */ 0x74, 0x00, 0x00, 0x10, 0x75, 0x00, 0x00, 0x10, 0x75, 0x00, 0x00, 0x30, 0x75, 0x00, 0x00, 0x30, -/* 000046E0 */ 0x75, 0x00, 0x00, 0x4E, 0x75, 0x00, 0x00, 0x4E, 0x75, 0x00, 0x00, 0x5C, 0x75, 0x00, 0x00, 0x5C, -/* 000046F0 */ 0x75, 0x00, 0x00, 0x5D, 0x75, 0x00, 0x00, 0x5D, 0x75, 0x00, 0x00, 0xC0, 0x75, 0x00, 0x00, 0xC0, -/* 00004700 */ 0x75, 0x00, 0x00, 0x3B, 0x76, 0x00, 0x00, 0x3B, 0x76, 0x00, 0x00, 0x7B, 0x76, 0x00, 0x00, 0x7B, -/* 00004710 */ 0x76, 0x00, 0x00, 0xAC, 0x76, 0x00, 0x00, 0xAC, 0x76, 0x00, 0x00, 0x2B, 0x77, 0x00, 0x00, 0x2B, -/* 00004720 */ 0x77, 0x00, 0x00, 0x81, 0x77, 0x00, 0x00, 0x81, 0x77, 0x00, 0x00, 0xC5, 0x77, 0x00, 0x00, 0xC5, -/* 00004730 */ 0x77, 0x00, 0x00, 0xC6, 0x77, 0x00, 0x00, 0xC6, 0x77, 0x00, 0x00, 0x45, 0x78, 0x00, 0x00, 0x45, -/* 00004740 */ 0x78, 0x00, 0x00, 0x8D, 0x78, 0x00, 0x00, 0x8D, 0x78, 0x00, 0x00, 0xB6, 0x78, 0x00, 0x00, 0xB6, -/* 00004750 */ 0x78, 0x00, 0x00, 0xFB, 0x78, 0x00, 0x00, 0xFB, 0x78, 0x00, 0x00, 0x0D, 0x79, 0x00, 0x00, 0x0D, -/* 00004760 */ 0x79, 0x00, 0x00, 0x1D, 0x79, 0x00, 0x00, 0x1D, 0x79, 0x00, 0x00, 0x1E, 0x79, 0x00, 0x00, 0x1E, -/* 00004770 */ 0x79, 0x00, 0x00, 0x56, 0x79, 0x00, 0x00, 0x56, 0x79, 0x00, 0x00, 0x62, 0x79, 0x00, 0x00, 0x62, -/* 00004780 */ 0x79, 0x00, 0x00, 0x7B, 0x79, 0x00, 0x00, 0x7B, 0x79, 0x00, 0x00, 0x85, 0x79, 0x00, 0x00, 0x85, -/* 00004790 */ 0x79, 0x00, 0x00, 0x86, 0x79, 0x00, 0x00, 0x86, 0x79, 0x00, 0x00, 0xD7, 0x79, 0x00, 0x00, 0xD7, -/* 000047A0 */ 0x79, 0x00, 0x00, 0x05, 0x7A, 0x00, 0x00, 0x05, 0x7A, 0x00, 0x00, 0x30, 0x7A, 0x00, 0x00, 0x30, -/* 000047B0 */ 0x7A, 0x00, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x97, 0x7A, 0x00, 0x00, 0x97, -/* 000047C0 */ 0x7A, 0x00, 0x00, 0xC1, 0x7A, 0x00, 0x00, 0xC1, 0x7A, 0x00, 0x00, 0xCB, 0x7A, 0x00, 0x00, 0xCB, -/* 000047D0 */ 0x7A, 0x00, 0x00, 0xCC, 0x7A, 0x00, 0x00, 0xCC, 0x7A, 0x00, 0x00, 0xEC, 0x7A, 0x00, 0x00, 0xEC, -/* 000047E0 */ 0x7A, 0x00, 0x00, 0x0F, 0x7B, 0x00, 0x00, 0x0F, 0x7B, 0x00, 0x00, 0x31, 0x7B, 0x00, 0x00, 0x31, -/* 000047F0 */ 0x7B, 0x00, 0x00, 0x85, 0x7B, 0x00, 0x00, 0x85, 0x7B, 0x00, 0x00, 0xAE, 0x7B, 0x00, 0x00, 0xAE, -/* 00004800 */ 0x7B, 0x00, 0x00, 0x18, 0x7C, 0x00, 0x00, 0x18, 0x7C, 0x00, 0x00, 0x31, 0x7C, 0x00, 0x00, 0x31, -/* 00004810 */ 0x7C, 0x00, 0x00, 0x83, 0x7C, 0x00, 0x00, 0x83, 0x7C, 0x00, 0x00, 0xCC, 0x7C, 0x00, 0x00, 0xCC, -/* 00004820 */ 0x7C, 0x00, 0x00, 0xF2, 0x7C, 0x00, 0x00, 0xF2, 0x7C, 0x00, 0x00, 0x54, 0x7D, 0x00, 0x00, 0x54, -/* 00004830 */ 0x7D, 0x00, 0x00, 0x62, 0x7D, 0x00, 0x00, 0x62, 0x7D, 0x00, 0x00, 0x73, 0x7D, 0x00, 0x00, 0x73, -/* 00004840 */ 0x7D, 0x00, 0x00, 0xBC, 0x7D, 0x00, 0x00, 0xBC, 0x7D, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x00, 0x18, -/* 00004850 */ 0x7E, 0x00, 0x00, 0x37, 0x7E, 0x00, 0x00, 0x37, 0x7E, 0x00, 0x00, 0x59, 0x7E, 0x00, 0x00, 0x59, -/* 00004860 */ 0x7E, 0x00, 0x00, 0x63, 0x7E, 0x00, 0x00, 0x63, 0x7E, 0x00, 0x00, 0x64, 0x7E, 0x00, 0x00, 0x64, -/* 00004870 */ 0x7E, 0x00, 0x00, 0x8B, 0x7E, 0x00, 0x00, 0x8B, 0x7E, 0x00, 0x00, 0xB7, 0x7E, 0x00, 0x00, 0xB7, -/* 00004880 */ 0x7E, 0x00, 0x00, 0xE1, 0x7E, 0x00, 0x00, 0xE1, 0x7E, 0x00, 0x00, 0xEB, 0x7E, 0x00, 0x00, 0xEB, -/* 00004890 */ 0x7E, 0x00, 0x00, 0xEC, 0x7E, 0x00, 0x00, 0xEC, 0x7E, 0x00, 0x00, 0x48, 0x7F, 0x00, 0x00, 0x48, -/* 000048A0 */ 0x7F, 0x00, 0x00, 0x9D, 0x7F, 0x00, 0x00, 0x9D, 0x7F, 0x00, 0x00, 0xC3, 0x7F, 0x00, 0x00, 0xC3, -/* 000048B0 */ 0x7F, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x16, 0x80, 0x00, 0x00, 0x16, -/* 000048C0 */ 0x80, 0x00, 0x00, 0x56, 0x80, 0x00, 0x00, 0x56, 0x80, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x64, -/* 000048D0 */ 0x80, 0x00, 0x00, 0x6F, 0x80, 0x00, 0x00, 0x6F, 0x80, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x70, -/* 000048E0 */ 0x80, 0x00, 0x00, 0xC6, 0x80, 0x00, 0x00, 0xC6, 0x80, 0x00, 0x00, 0xF9, 0x80, 0x00, 0x00, 0xF9, -/* 000048F0 */ 0x80, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x9A, 0x81, 0x00, 0x00, 0x9A, -/* 00004900 */ 0x81, 0x00, 0x00, 0xC4, 0x81, 0x00, 0x00, 0xC4, 0x81, 0x00, 0x00, 0xCE, 0x81, 0x00, 0x00, 0xCE, -/* 00004910 */ 0x81, 0x00, 0x00, 0xCF, 0x81, 0x00, 0x00, 0xCF, 0x81, 0x00, 0x00, 0x11, 0x82, 0x00, 0x00, 0x11, -/* 00004920 */ 0x82, 0x00, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x98, 0x82, 0x00, 0x00, 0x98, -/* 00004930 */ 0x82, 0x00, 0x00, 0xA9, 0x82, 0x00, 0x00, 0xA9, 0x82, 0x00, 0x00, 0xFD, 0x82, 0x00, 0x00, 0xFD, -/* 00004940 */ 0x82, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x08, 0x83, 0x00, 0x00, 0x08, -/* 00004950 */ 0x83, 0x00, 0x00, 0x2E, 0x83, 0x00, 0x00, 0x2E, 0x83, 0x00, 0x00, 0x35, 0x83, 0x00, 0x00, 0x35, -/* 00004960 */ 0x83, 0x00, 0x00, 0x36, 0x83, 0x00, 0x00, 0x36, 0x83, 0x00, 0x00, 0x6B, 0x83, 0x00, 0x00, 0x6B, -/* 00004970 */ 0x83, 0x00, 0x00, 0x8D, 0x83, 0x00, 0x00, 0x8D, 0x83, 0x00, 0x00, 0x8E, 0x83, 0x00, 0x00, 0x8E, -/* 00004980 */ 0x83, 0x00, 0x00, 0xCA, 0x83, 0x00, 0x00, 0xCA, 0x83, 0x00, 0x00, 0xCB, 0x83, 0x00, 0x00, 0xCB, -/* 00004990 */ 0x83, 0x00, 0x00, 0x14, 0x84, 0x00, 0x00, 0x14, 0x84, 0x00, 0x00, 0x47, 0x84, 0x00, 0x00, 0x47, -/* 000049A0 */ 0x84, 0x00, 0x00, 0x77, 0x84, 0x00, 0x00, 0x77, 0x84, 0x00, 0x00, 0x89, 0x84, 0x00, 0x00, 0x89, -/* 000049B0 */ 0x84, 0x00, 0x00, 0x8A, 0x84, 0x00, 0x00, 0x8A, 0x84, 0x00, 0x00, 0x19, 0x85, 0x00, 0x00, 0x19, -/* 000049C0 */ 0x85, 0x00, 0x00, 0x6F, 0x85, 0x00, 0x00, 0x6F, 0x85, 0x00, 0x00, 0x81, 0x85, 0x00, 0x00, 0x81, -/* 000049D0 */ 0x85, 0x00, 0x00, 0x82, 0x85, 0x00, 0x00, 0x82, 0x85, 0x00, 0x00, 0xBB, 0x85, 0x00, 0x00, 0xBB, -/* 000049E0 */ 0x85, 0x00, 0x00, 0xBC, 0x85, 0x00, 0x00, 0xBC, 0x85, 0x00, 0x00, 0xDF, 0x85, 0x00, 0x00, 0xDF, -/* 000049F0 */ 0x85, 0x00, 0x00, 0x15, 0x86, 0x00, 0x00, 0x15, 0x86, 0x00, 0x00, 0x4B, 0x86, 0x00, 0x00, 0x4B, -/* 00004A00 */ 0x86, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x9E, 0x86, 0x00, 0x00, 0x9E, -/* 00004A10 */ 0x86, 0x00, 0x00, 0xB0, 0x86, 0x00, 0x00, 0xB0, 0x86, 0x00, 0x00, 0xB1, 0x86, 0x00, 0x00, 0xB1, -/* 00004A20 */ 0x86, 0x00, 0x00, 0x22, 0x87, 0x00, 0x00, 0x22, 0x87, 0x00, 0x00, 0x81, 0x87, 0x00, 0x00, 0x81, -/* 00004A30 */ 0x87, 0x00, 0x00, 0x02, 0x88, 0x00, 0x00, 0x02, 0x88, 0x00, 0x00, 0x70, 0x88, 0x00, 0x00, 0x70, -/* 00004A40 */ 0x88, 0x00, 0x00, 0xE3, 0x88, 0x00, 0x00, 0xE3, 0x88, 0x00, 0x00, 0x45, 0x89, 0x00, 0x00, 0x45, -/* 00004A50 */ 0x89, 0x00, 0x00, 0x46, 0x89, 0x00, 0x00, 0x46, 0x89, 0x00, 0x00, 0x7E, 0x89, 0x00, 0x00, 0x7E, -/* 00004A60 */ 0x89, 0x00, 0x00, 0xBF, 0x89, 0x00, 0x00, 0xBF, 0x89, 0x00, 0x00, 0x2D, 0x8A, 0x00, 0x00, 0x2D, -/* 00004A70 */ 0x8A, 0x00, 0x00, 0x2E, 0x8A, 0x00, 0x00, 0x2E, 0x8A, 0x00, 0x00, 0x59, 0x8A, 0x00, 0x00, 0x59, -/* 00004A80 */ 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0x07, 0x8B, 0x00, 0x00, 0x07, -/* 00004A90 */ 0x8B, 0x00, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x3A, 0x8B, 0x00, 0x00, 0x3A, -/* 00004AA0 */ 0x8B, 0x00, 0x00, 0xA5, 0x8B, 0x00, 0x00, 0xA5, 0x8B, 0x00, 0x00, 0x27, 0x8C, 0x00, 0x00, 0x27, -/* 00004AB0 */ 0x8C, 0x00, 0x00, 0x53, 0x8C, 0x00, 0x00, 0x53, 0x8C, 0x00, 0x00, 0x9F, 0x8C, 0x00, 0x00, 0x9F, -/* 00004AC0 */ 0x8C, 0x00, 0x00, 0xE6, 0x8C, 0x00, 0x00, 0xE6, 0x8C, 0x00, 0x00, 0x82, 0x8D, 0x00, 0x00, 0x82, -/* 00004AD0 */ 0x8D, 0x00, 0x00, 0xCE, 0x8D, 0x00, 0x00, 0xCE, 0x8D, 0x00, 0x00, 0x05, 0x8E, 0x00, 0x00, 0x05, -/* 00004AE0 */ 0x8E, 0x00, 0x00, 0x89, 0x8E, 0x00, 0x00, 0x89, 0x8E, 0x00, 0x00, 0xAE, 0x8E, 0x00, 0x00, 0xAE, -/* 00004AF0 */ 0x8E, 0x00, 0x00, 0xDE, 0x8E, 0x00, 0x00, 0xDE, 0x8E, 0x00, 0x00, 0xFC, 0x8E, 0x00, 0x00, 0xFC, -/* 00004B00 */ 0x8E, 0x00, 0x00, 0x9F, 0x8F, 0x00, 0x00, 0x9F, 0x8F, 0x00, 0x00, 0xFE, 0x8F, 0x00, 0x00, 0xFE, -/* 00004B10 */ 0x8F, 0x00, 0x00, 0x2D, 0x90, 0x00, 0x00, 0x2D, 0x90, 0x00, 0x00, 0x47, 0x90, 0x00, 0x00, 0x47, -/* 00004B20 */ 0x90, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x71, 0x90, 0x00, 0x00, 0x71, -/* 00004B30 */ 0x90, 0x00, 0x00, 0xA0, 0x90, 0x00, 0x00, 0xA0, 0x90, 0x00, 0x00, 0x0F, 0x91, 0x00, 0x00, 0x0F, -/* 00004B40 */ 0x91, 0x00, 0x00, 0x3E, 0x91, 0x00, 0x00, 0x3E, 0x91, 0x00, 0x00, 0xCC, 0x91, 0x00, 0x00, 0xCC, -/* 00004B50 */ 0x91, 0x00, 0x00, 0x03, 0x92, 0x00, 0x00, 0x03, 0x92, 0x00, 0x00, 0x6D, 0x92, 0x00, 0x00, 0x6D, -/* 00004B60 */ 0x92, 0x00, 0x00, 0x87, 0x92, 0x00, 0x00, 0x87, 0x92, 0x00, 0x00, 0x9D, 0x92, 0x00, 0x00, 0x9D, -/* 00004B70 */ 0x92, 0x00, 0x00, 0xB8, 0x92, 0x00, 0x00, 0xB8, 0x92, 0x00, 0x00, 0xE7, 0x92, 0x00, 0x00, 0xE7, -/* 00004B80 */ 0x92, 0x00, 0x00, 0xFD, 0x92, 0x00, 0x00, 0xFD, 0x92, 0x00, 0x00, 0x0F, 0x93, 0x00, 0x00, 0x0F, -/* 00004B90 */ 0x93, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x3F, 0x93, 0x00, 0x00, 0x3F, -/* 00004BA0 */ 0x93, 0x00, 0x00, 0x6E, 0x93, 0x00, 0x00, 0x6E, 0x93, 0x00, 0x00, 0x88, 0x93, 0x00, 0x00, 0x88, -/* 00004BB0 */ 0x93, 0x00, 0x00, 0x03, 0x94, 0x00, 0x00, 0x03, 0x94, 0x00, 0x00, 0x25, 0x94, 0x00, 0x00, 0x25, -/* 00004BC0 */ 0x94, 0x00, 0x00, 0x53, 0x94, 0x00, 0x00, 0x53, 0x94, 0x00, 0x00, 0x81, 0x94, 0x00, 0x00, 0x81, -/* 00004BD0 */ 0x94, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0xF3, 0x94, 0x00, 0x00, 0xF3, -/* 00004BE0 */ 0x94, 0x00, 0x00, 0x7C, 0x95, 0x00, 0x00, 0x7C, 0x95, 0x00, 0x00, 0xE5, 0x95, 0x00, 0x00, 0xE5, -/* 00004BF0 */ 0x95, 0x00, 0x00, 0x24, 0x96, 0x00, 0x00, 0x24, 0x96, 0x00, 0x00, 0x3A, 0x96, 0x00, 0x00, 0x3A, -/* 00004C00 */ 0x96, 0x00, 0x00, 0x3B, 0x96, 0x00, 0x00, 0x3B, 0x96, 0x00, 0x00, 0x60, 0x96, 0x00, 0x00, 0x60, -/* 00004C10 */ 0x96, 0x00, 0x00, 0x8D, 0x96, 0x00, 0x00, 0x8D, 0x96, 0x00, 0x00, 0xBA, 0x96, 0x00, 0x00, 0xBA, -/* 00004C20 */ 0x96, 0x00, 0x00, 0xE7, 0x96, 0x00, 0x00, 0xE7, 0x96, 0x00, 0x00, 0x04, 0x97, 0x00, 0x00, 0x04, -/* 00004C30 */ 0x97, 0x00, 0x00, 0x31, 0x97, 0x00, 0x00, 0x31, 0x97, 0x00, 0x00, 0x47, 0x97, 0x00, 0x00, 0x47, -/* 00004C40 */ 0x97, 0x00, 0x00, 0x59, 0x97, 0x00, 0x00, 0x59, 0x97, 0x00, 0x00, 0x5A, 0x97, 0x00, 0x00, 0x5A, -/* 00004C50 */ 0x97, 0x00, 0x00, 0x8B, 0x97, 0x00, 0x00, 0x8B, 0x97, 0x00, 0x00, 0xB8, 0x97, 0x00, 0x00, 0xB8, -/* 00004C60 */ 0x97, 0x00, 0x00, 0xCA, 0x97, 0x00, 0x00, 0xCA, 0x97, 0x00, 0x00, 0xCB, 0x97, 0x00, 0x00, 0xCB, -/* 00004C70 */ 0x97, 0x00, 0x00, 0xF8, 0x97, 0x00, 0x00, 0xF8, 0x97, 0x00, 0x00, 0x1D, 0x98, 0x00, 0x00, 0x1D, -/* 00004C80 */ 0x98, 0x00, 0x00, 0x2F, 0x98, 0x00, 0x00, 0x2F, 0x98, 0x00, 0x00, 0x30, 0x98, 0x00, 0x00, 0x30, -/* 00004C90 */ 0x98, 0x00, 0x00, 0x61, 0x98, 0x00, 0x00, 0x61, 0x98, 0x00, 0x00, 0x8F, 0x98, 0x00, 0x00, 0x8F, -/* 00004CA0 */ 0x98, 0x00, 0x00, 0xDC, 0x98, 0x00, 0x00, 0xDC, 0x98, 0x00, 0x00, 0x24, 0x99, 0x00, 0x00, 0x24, -/* 00004CB0 */ 0x99, 0x00, 0x00, 0x4E, 0x99, 0x00, 0x00, 0x4E, 0x99, 0x00, 0x00, 0x84, 0x99, 0x00, 0x00, 0x84, -/* 00004CC0 */ 0x99, 0x00, 0x00, 0xC6, 0x99, 0x00, 0x00, 0xC6, 0x99, 0x00, 0x00, 0xF8, 0x99, 0x00, 0x00, 0xF8, -/* 00004CD0 */ 0x99, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x58, 0x9A, 0x00, 0x00, 0x58, -/* 00004CE0 */ 0x9A, 0x00, 0x00, 0x8F, 0x9A, 0x00, 0x00, 0x8F, 0x9A, 0x00, 0x00, 0x9D, 0x9A, 0x00, 0x00, 0x9D, -/* 00004CF0 */ 0x9A, 0x00, 0x00, 0x9E, 0x9A, 0x00, 0x00, 0x9E, 0x9A, 0x00, 0x00, 0x0D, 0x9B, 0x00, 0x00, 0x0D, -/* 00004D00 */ 0x9B, 0x00, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x71, 0x9B, 0x00, 0x00, 0x71, -/* 00004D10 */ 0x9B, 0x00, 0x00, 0xCB, 0x9B, 0x00, 0x00, 0xCB, 0x9B, 0x00, 0x00, 0xDD, 0x9B, 0x00, 0x00, 0xDD, -/* 00004D20 */ 0x9B, 0x00, 0x00, 0x07, 0x9C, 0x00, 0x00, 0x07, 0x9C, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x00, 0x37, -/* 00004D30 */ 0x9C, 0x00, 0x00, 0x49, 0x9C, 0x00, 0x00, 0x49, 0x9C, 0x00, 0x00, 0xED, 0x9C, 0x00, 0x00, 0xED, -/* 00004D40 */ 0x9C, 0x00, 0x00, 0x19, 0x9D, 0x00, 0x00, 0x19, 0x9D, 0x00, 0x00, 0x42, 0x9D, 0x00, 0x00, 0x42, -/* 00004D50 */ 0x9D, 0x00, 0x00, 0x7C, 0x9D, 0x00, 0x00, 0x7C, 0x9D, 0x00, 0x00, 0xC9, 0x9D, 0x00, 0x00, 0xC9, -/* 00004D60 */ 0x9D, 0x00, 0x00, 0x82, 0x9E, 0x00, 0x00, 0x82, 0x9E, 0x00, 0x00, 0x96, 0x9E, 0x00, 0x00, 0x96, -/* 00004D70 */ 0x9E, 0x00, 0x00, 0x97, 0x9E, 0x00, 0x00, 0x97, 0x9E, 0x00, 0x00, 0xBE, 0x9E, 0x00, 0x00, 0xBE, -/* 00004D80 */ 0x9E, 0x00, 0x00, 0xBF, 0x9E, 0x00, 0x00, 0xBF, 0x9E, 0x00, 0x00, 0xE5, 0x9E, 0x00, 0x00, 0xE5, -/* 00004D90 */ 0x9E, 0x00, 0x00, 0x4B, 0x9F, 0x00, 0x00, 0x4B, 0x9F, 0x00, 0x00, 0xC2, 0x9F, 0x00, 0x00, 0xC2, -/* 00004DA0 */ 0x9F, 0x00, 0x00, 0x34, 0xA0, 0x00, 0x00, 0x34, 0xA0, 0x00, 0x00, 0x61, 0xA0, 0x00, 0x00, 0x61, -/* 00004DB0 */ 0xA0, 0x00, 0x00, 0x8E, 0xA0, 0x00, 0x00, 0x8E, 0xA0, 0x00, 0x00, 0xD5, 0xA0, 0x00, 0x00, 0xD5, -/* 00004DC0 */ 0xA0, 0x00, 0x00, 0x1C, 0xA1, 0x00, 0x00, 0x1C, 0xA1, 0x00, 0x00, 0x1D, 0xA1, 0x00, 0x00, 0x1D, -/* 00004DD0 */ 0xA1, 0x00, 0x00, 0x5C, 0xA1, 0x00, 0x00, 0x5C, 0xA1, 0x00, 0x00, 0x9B, 0xA1, 0x00, 0x00, 0x9B, -/* 00004DE0 */ 0xA1, 0x00, 0x00, 0xB1, 0xA1, 0x00, 0x00, 0xB1, 0xA1, 0x00, 0x00, 0xB2, 0xA1, 0x00, 0x00, 0xB2, -/* 00004DF0 */ 0xA1, 0x00, 0x00, 0xE9, 0xA1, 0x00, 0x00, 0xE9, 0xA1, 0x00, 0x00, 0x1D, 0xA2, 0x00, 0x00, 0x1D, -/* 00004E00 */ 0xA2, 0x00, 0x00, 0x66, 0xA2, 0x00, 0x00, 0x66, 0xA2, 0x00, 0x00, 0x7C, 0xA2, 0x00, 0x00, 0x7C, -/* 00004E10 */ 0xA2, 0x00, 0x00, 0x7D, 0xA2, 0x00, 0x00, 0x7D, 0xA2, 0x00, 0x00, 0xB8, 0xA2, 0x00, 0x00, 0xB8, -/* 00004E20 */ 0xA2, 0x00, 0x00, 0xFE, 0xA2, 0x00, 0x00, 0xFE, 0xA2, 0x00, 0x00, 0xFF, 0xA2, 0x00, 0x00, 0xFF, -/* 00004E30 */ 0xA2, 0x00, 0x00, 0x35, 0xA3, 0x00, 0x00, 0x35, 0xA3, 0x00, 0x00, 0x74, 0xA3, 0x00, 0x00, 0x74, -/* 00004E40 */ 0xA3, 0x00, 0x00, 0xB9, 0xA3, 0x00, 0x00, 0xB9, 0xA3, 0x00, 0x00, 0xCF, 0xA3, 0x00, 0x00, 0xCF, -/* 00004E50 */ 0xA3, 0x00, 0x00, 0xD0, 0xA3, 0x00, 0x00, 0xD0, 0xA3, 0x00, 0x00, 0x18, 0xA4, 0x00, 0x00, 0x18, -/* 00004E60 */ 0xA4, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x46, 0xA4, 0x00, 0x00, 0x46, -/* 00004E70 */ 0xA4, 0x00, 0x00, 0xAE, 0xA4, 0x00, 0x00, 0xAE, 0xA4, 0x00, 0x00, 0xEB, 0xA4, 0x00, 0x00, 0xEB, -/* 00004E80 */ 0xA4, 0x00, 0x00, 0x0B, 0xA5, 0x00, 0x00, 0x0B, 0xA5, 0x00, 0x00, 0x1D, 0xA5, 0x00, 0x00, 0x1D, -/* 00004E90 */ 0xA5, 0x00, 0x00, 0x5B, 0xA5, 0x00, 0x00, 0x5B, 0xA5, 0x00, 0x00, 0x5C, 0xA5, 0x00, 0x00, 0x5C, -/* 00004EA0 */ 0xA5, 0x00, 0x00, 0x85, 0xA5, 0x00, 0x00, 0x85, 0xA5, 0x00, 0x00, 0xB9, 0xA5, 0x00, 0x00, 0xB9, -/* 00004EB0 */ 0xA5, 0x00, 0x00, 0x1B, 0xA6, 0x00, 0x00, 0x1B, 0xA6, 0x00, 0x00, 0x31, 0xA6, 0x00, 0x00, 0x31, -/* 00004EC0 */ 0xA6, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x79, 0xA6, 0x00, 0x00, 0x79, -/* 00004ED0 */ 0xA6, 0x00, 0x00, 0xD6, 0xA6, 0x00, 0x00, 0xD6, 0xA6, 0x00, 0x00, 0x38, 0xA7, 0x00, 0x00, 0x38, -/* 00004EE0 */ 0xA7, 0x00, 0x00, 0x4E, 0xA7, 0x00, 0x00, 0x4E, 0xA7, 0x00, 0x00, 0x4F, 0xA7, 0x00, 0x00, 0x4F, -/* 00004EF0 */ 0xA7, 0x00, 0x00, 0x72, 0xA7, 0x00, 0x00, 0x72, 0xA7, 0x00, 0x00, 0x95, 0xA7, 0x00, 0x00, 0x95, -/* 00004F00 */ 0xA7, 0x00, 0x00, 0x96, 0xA7, 0x00, 0x00, 0x96, 0xA7, 0x00, 0x00, 0x4E, 0xA8, 0x00, 0x00, 0x4E, -/* 00004F10 */ 0xA8, 0x00, 0x00, 0x60, 0xA8, 0x00, 0x00, 0x60, 0xA8, 0x00, 0x00, 0xAF, 0xA8, 0x00, 0x00, 0xAF, -/* 00004F20 */ 0xA8, 0x00, 0x00, 0xB0, 0xA8, 0x00, 0x00, 0xB0, 0xA8, 0x00, 0x00, 0x42, 0xA9, 0x00, 0x00, 0x42, -/* 00004F30 */ 0xA9, 0x00, 0x00, 0x43, 0xA9, 0x00, 0x00, 0x43, 0xA9, 0x00, 0x00, 0xD4, 0xA9, 0x00, 0x00, 0xD4, -/* 00004F40 */ 0xA9, 0x00, 0x00, 0x18, 0xAA, 0x00, 0x00, 0x18, 0xAA, 0x00, 0x00, 0x19, 0xAA, 0x00, 0x00, 0x19, -/* 00004F50 */ 0xAA, 0x00, 0x00, 0xAE, 0xAA, 0x00, 0x00, 0xAE, 0xAA, 0x00, 0x00, 0xAF, 0xAA, 0x00, 0x00, 0xAF, -/* 00004F60 */ 0xAA, 0x00, 0x00, 0xFD, 0xAA, 0x00, 0x00, 0xFD, 0xAA, 0x00, 0x00, 0x35, 0xAB, 0x00, 0x00, 0x35, -/* 00004F70 */ 0xAB, 0x00, 0x00, 0x6D, 0xAB, 0x00, 0x00, 0x6D, 0xAB, 0x00, 0x00, 0xDB, 0xAB, 0x00, 0x00, 0xDB, -/* 00004F80 */ 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0x40, 0xAC, 0x00, 0x00, 0x40, -/* 00004F90 */ 0xAC, 0x00, 0x00, 0xA1, 0xAC, 0x00, 0x00, 0xA1, 0xAC, 0x00, 0x00, 0x0F, 0xAD, 0x00, 0x00, 0x0F, -/* 00004FA0 */ 0xAD, 0x00, 0x00, 0x29, 0xAD, 0x00, 0x00, 0x29, 0xAD, 0x00, 0x00, 0x2A, 0xAD, 0x00, 0x00, 0x2A, -/* 00004FB0 */ 0xAD, 0x00, 0x00, 0x4B, 0xAD, 0x00, 0x00, 0x4B, 0xAD, 0x00, 0x00, 0x86, 0xAD, 0x00, 0x00, 0x86, -/* 00004FC0 */ 0xAD, 0x00, 0x00, 0xBF, 0xAD, 0x00, 0x00, 0xBF, 0xAD, 0x00, 0x00, 0x04, 0xAE, 0x00, 0x00, 0x04, -/* 00004FD0 */ 0xAE, 0x00, 0x00, 0x55, 0xAE, 0x00, 0x00, 0x55, 0xAE, 0x00, 0x00, 0xB0, 0xAE, 0x00, 0x00, 0xB0, -/* 00004FE0 */ 0xAE, 0x00, 0x00, 0x45, 0xAF, 0x00, 0x00, 0x45, 0xAF, 0x00, 0x00, 0xDA, 0xAF, 0x00, 0x00, 0xDA, -/* 00004FF0 */ 0xAF, 0x00, 0x00, 0xF4, 0xAF, 0x00, 0x00, 0xF4, 0xAF, 0x00, 0x00, 0x41, 0xB0, 0x00, 0x00, 0x41, -/* 00005000 */ 0xB0, 0x00, 0x00, 0x55, 0xB0, 0x00, 0x00, 0x55, 0xB0, 0x00, 0x00, 0x56, 0xB0, 0x00, 0x00, 0x56, -/* 00005010 */ 0xB0, 0x00, 0x00, 0x9C, 0xB0, 0x00, 0x00, 0x9C, 0xB0, 0x00, 0x00, 0xE4, 0xB0, 0x00, 0x00, 0xE4, -/* 00005020 */ 0xB0, 0x00, 0x00, 0x1C, 0xB1, 0x00, 0x00, 0x1C, 0xB1, 0x00, 0x00, 0x82, 0xB1, 0x00, 0x00, 0x82, -/* 00005030 */ 0xB1, 0x00, 0x00, 0x9C, 0xB1, 0x00, 0x00, 0x9C, 0xB1, 0x00, 0x00, 0x9D, 0xB1, 0x00, 0x00, 0x9D, -/* 00005040 */ 0xB1, 0x00, 0x00, 0xE8, 0xB1, 0x00, 0x00, 0xE8, 0xB1, 0x00, 0x00, 0x49, 0xB2, 0x00, 0x00, 0x49, -/* 00005050 */ 0xB2, 0x00, 0x00, 0xAF, 0xB2, 0x00, 0x00, 0xAF, 0xB2, 0x00, 0x00, 0xC9, 0xB2, 0x00, 0x00, 0xC9, -/* 00005060 */ 0xB2, 0x00, 0x00, 0xCA, 0xB2, 0x00, 0x00, 0xCA, 0xB2, 0x00, 0x00, 0x06, 0xB3, 0x00, 0x00, 0x06, -/* 00005070 */ 0xB3, 0x00, 0x00, 0x44, 0xB3, 0x00, 0x00, 0x44, 0xB3, 0x00, 0x00, 0x58, 0xB3, 0x00, 0x00, 0x58, -/* 00005080 */ 0xB3, 0x00, 0x00, 0x59, 0xB3, 0x00, 0x00, 0x59, 0xB3, 0x00, 0x00, 0x7A, 0xB3, 0x00, 0x00, 0x7A, -/* 00005090 */ 0xB3, 0x00, 0x00, 0x88, 0xB3, 0x00, 0x00, 0x88, 0xB3, 0x00, 0x00, 0x92, 0xB3, 0x00, 0x00, 0x92, -/* 000050A0 */ 0xB3, 0x00, 0x00, 0xDD, 0xB3, 0x00, 0x00, 0xDD, 0xB3, 0x00, 0x00, 0xF7, 0xB3, 0x00, 0x00, 0xF7, -/* 000050B0 */ 0xB3, 0x00, 0x00, 0x01, 0xB4, 0x00, 0x00, 0x01, 0xB4, 0x00, 0x00, 0x02, 0xB4, 0x00, 0x00, 0x02, -/* 000050C0 */ 0xB4, 0x00, 0x00, 0x3C, 0xB4, 0x00, 0x00, 0x3C, 0xB4, 0x00, 0x00, 0x62, 0xB4, 0x00, 0x00, 0x62, -/* 000050D0 */ 0xB4, 0x00, 0x00, 0xB1, 0xB4, 0x00, 0x00, 0xB1, 0xB4, 0x00, 0x00, 0xE2, 0xB4, 0x00, 0x00, 0xE2, -/* 000050E0 */ 0xB4, 0x00, 0x00, 0x16, 0xB5, 0x00, 0x00, 0x16, 0xB5, 0x00, 0x00, 0x81, 0xB5, 0x00, 0x00, 0x81, -/* 000050F0 */ 0xB5, 0x00, 0x00, 0xCD, 0xB5, 0x00, 0x00, 0xCD, 0xB5, 0x00, 0x00, 0x20, 0xB6, 0x00, 0x00, 0x20, -/* 00005100 */ 0xB6, 0x00, 0x00, 0x33, 0xB6, 0x00, 0x00, 0x33, 0xB6, 0x00, 0x00, 0x45, 0xB6, 0x00, 0x00, 0x45, -/* 00005110 */ 0xB6, 0x00, 0x00, 0x80, 0xB6, 0x00, 0x00, 0x80, 0xB6, 0x00, 0x00, 0xB3, 0xB6, 0x00, 0x00, 0xB3, -/* 00005120 */ 0xB6, 0x00, 0x00, 0x42, 0xB7, 0x00, 0x00, 0x42, 0xB7, 0x00, 0x00, 0xB3, 0xB7, 0x00, 0x00, 0xB3, -/* 00005130 */ 0xB7, 0x00, 0x00, 0x2A, 0xB8, 0x00, 0x00, 0x2A, 0xB8, 0x00, 0x00, 0x3D, 0xB8, 0x00, 0x00, 0x3D, -/* 00005140 */ 0xB8, 0x00, 0x00, 0x4F, 0xB8, 0x00, 0x00, 0x4F, 0xB8, 0x00, 0x00, 0x50, 0xB8, 0x00, 0x00, 0x50, -/* 00005150 */ 0xB8, 0x00, 0x00, 0x8C, 0xB8, 0x00, 0x00, 0x8C, 0xB8, 0x00, 0x00, 0xDD, 0xB8, 0x00, 0x00, 0xDD, -/* 00005160 */ 0xB8, 0x00, 0x00, 0x14, 0xB9, 0x00, 0x00, 0x14, 0xB9, 0x00, 0x00, 0x44, 0xB9, 0x00, 0x00, 0x44, -/* 00005170 */ 0xB9, 0x00, 0x00, 0x56, 0xB9, 0x00, 0x00, 0x56, 0xB9, 0x00, 0x00, 0x57, 0xB9, 0x00, 0x00, 0x57, -/* 00005180 */ 0xB9, 0x00, 0x00, 0xEE, 0xB9, 0x00, 0x00, 0xEE, 0xB9, 0x00, 0x00, 0x4C, 0xBA, 0x00, 0x00, 0x4C, -/* 00005190 */ 0xBA, 0x00, 0x00, 0x5E, 0xBA, 0x00, 0x00, 0x5E, 0xBA, 0x00, 0x00, 0x5F, 0xBA, 0x00, 0x00, 0x5F, -/* 000051A0 */ 0xBA, 0x00, 0x00, 0x9C, 0xBA, 0x00, 0x00, 0x9C, 0xBA, 0x00, 0x00, 0x9D, 0xBA, 0x00, 0x00, 0x9D, -/* 000051B0 */ 0xBA, 0x00, 0x00, 0xC0, 0xBA, 0x00, 0x00, 0xC0, 0xBA, 0x00, 0x00, 0xF6, 0xBA, 0x00, 0x00, 0xF6, -/* 000051C0 */ 0xBA, 0x00, 0x00, 0x2C, 0xBB, 0x00, 0x00, 0x2C, 0xBB, 0x00, 0x00, 0x45, 0xBB, 0x00, 0x00, 0x45, -/* 000051D0 */ 0xBB, 0x00, 0x00, 0x7F, 0xBB, 0x00, 0x00, 0x7F, 0xBB, 0x00, 0x00, 0x91, 0xBB, 0x00, 0x00, 0x91, -/* 000051E0 */ 0xBB, 0x00, 0x00, 0x92, 0xBB, 0x00, 0x00, 0x92, 0xBB, 0x00, 0x00, 0x03, 0xBC, 0x00, 0x00, 0x03, -/* 000051F0 */ 0xBC, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x76, 0xBC, 0x00, 0x00, 0x76, -/* 00005200 */ 0xBC, 0x00, 0x00, 0xC1, 0xBC, 0x00, 0x00, 0xC1, 0xBC, 0x00, 0x00, 0xEC, 0xBC, 0x00, 0x00, 0xEC, -/* 00005210 */ 0xBC, 0x00, 0x00, 0x2C, 0xBD, 0x00, 0x00, 0x2C, 0xBD, 0x00, 0x00, 0x5F, 0xBD, 0x00, 0x00, 0x5F, -/* 00005220 */ 0xBD, 0x00, 0x00, 0xA0, 0xBD, 0x00, 0x00, 0xA0, 0xBD, 0x00, 0x00, 0xB2, 0xBD, 0x00, 0x00, 0xB2, -/* 00005230 */ 0xBD, 0x00, 0x00, 0xB3, 0xBD, 0x00, 0x00, 0xB3, 0xBD, 0x00, 0x00, 0x12, 0xBE, 0x00, 0x00, 0x12, -/* 00005240 */ 0xBE, 0x00, 0x00, 0x8F, 0xBE, 0x00, 0x00, 0x8F, 0xBE, 0x00, 0x00, 0xBF, 0xBE, 0x00, 0x00, 0xBF, -/* 00005250 */ 0xBE, 0x00, 0x00, 0xC0, 0xBE, 0x00, 0x00, 0xC0, 0xBE, 0x00, 0x00, 0x27, 0xBF, 0x00, 0x00, 0x27, -/* 00005260 */ 0xBF, 0x00, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x95, 0xBF, 0x00, 0x00, 0x95, -/* 00005270 */ 0xBF, 0x00, 0x00, 0xD3, 0xBF, 0x00, 0x00, 0xD3, 0xBF, 0x00, 0x00, 0xD4, 0xBF, 0x00, 0x00, 0xD4, -/* 00005280 */ 0xBF, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x76, 0xC0, 0x00, 0x00, 0x76, -/* 00005290 */ 0xC0, 0x00, 0x00, 0x77, 0xC0, 0x00, 0x00, 0x77, 0xC0, 0x00, 0x00, 0xF1, 0xC0, 0x00, 0x00, 0xF1, -/* 000052A0 */ 0xC0, 0x00, 0x00, 0x60, 0xC1, 0x00, 0x00, 0x60, 0xC1, 0x00, 0x00, 0xE7, 0xC1, 0x00, 0x00, 0xE7, -/* 000052B0 */ 0xC1, 0x00, 0x00, 0xF9, 0xC1, 0x00, 0x00, 0xF9, 0xC1, 0x00, 0x00, 0xFA, 0xC1, 0x00, 0x00, 0xFA, -/* 000052C0 */ 0xC1, 0x00, 0x00, 0x5B, 0xC2, 0x00, 0x00, 0x5B, 0xC2, 0x00, 0x00, 0x5C, 0xC2, 0x00, 0x00, 0x5C, -/* 000052D0 */ 0xC2, 0x00, 0x00, 0x94, 0xC2, 0x00, 0x00, 0x94, 0xC2, 0x00, 0x00, 0xD5, 0xC2, 0x00, 0x00, 0xD5, -/* 000052E0 */ 0xC2, 0x00, 0x00, 0x42, 0xC3, 0x00, 0x00, 0x42, 0xC3, 0x00, 0x00, 0x43, 0xC3, 0x00, 0x00, 0x43, -/* 000052F0 */ 0xC3, 0x00, 0x00, 0x77, 0xC3, 0x00, 0x00, 0x77, 0xC3, 0x00, 0x00, 0xD5, 0xC3, 0x00, 0x00, 0xD5, -/* 00005300 */ 0xC3, 0x00, 0x00, 0x1E, 0xC4, 0x00, 0x00, 0x1E, 0xC4, 0x00, 0x00, 0x30, 0xC4, 0x00, 0x00, 0x30, -/* 00005310 */ 0xC4, 0x00, 0x00, 0x31, 0xC4, 0x00, 0x00, 0x31, 0xC4, 0x00, 0x00, 0x5D, 0xC4, 0x00, 0x00, 0x5D, -/* 00005320 */ 0xC4, 0x00, 0x00, 0x98, 0xC4, 0x00, 0x00, 0x98, 0xC4, 0x00, 0x00, 0xD5, 0xC4, 0x00, 0x00, 0xD5, -/* 00005330 */ 0xC4, 0x00, 0x00, 0xEB, 0xC4, 0x00, 0x00, 0xEB, 0xC4, 0x00, 0x00, 0x41, 0xC5, 0x00, 0x00, 0x41, -/* 00005340 */ 0xC5, 0x00, 0x00, 0x5B, 0xC5, 0x00, 0x00, 0x5B, 0xC5, 0x00, 0x00, 0xA7, 0xC5, 0x00, 0x00, 0xA7, -/* 00005350 */ 0xC5, 0x00, 0x00, 0xC9, 0xC5, 0x00, 0x00, 0xC9, 0xC5, 0x00, 0x00, 0xF7, 0xC5, 0x00, 0x00, 0xF7, -/* 00005360 */ 0xC5, 0x00, 0x00, 0x44, 0xC6, 0x00, 0x00, 0x44, 0xC6, 0x00, 0x00, 0x5A, 0xC6, 0x00, 0x00, 0x5A, -/* 00005370 */ 0xC6, 0x00, 0x00, 0xD0, 0xC6, 0x00, 0x00, 0xD0, 0xC6, 0x00, 0x00, 0x34, 0xC7, 0x00, 0x00, 0x34, -/* 00005380 */ 0xC7, 0x00, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x77, 0xC7, 0x00, 0x00, 0x77, -/* 00005390 */ 0xC7, 0x00, 0x00, 0xA8, 0xC7, 0x00, 0x00, 0xA8, 0xC7, 0x00, 0x00, 0x11, 0xC8, 0x00, 0x00, 0x11, -/* 000053A0 */ 0xC8, 0x00, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x9B, 0xC8, 0x00, 0x00, 0x9B, -/* 000053B0 */ 0xC8, 0x00, 0x00, 0xB8, 0xC8, 0x00, 0x00, 0xB8, 0xC8, 0x00, 0x00, 0x12, 0xC9, 0x00, 0x00, 0x12, -/* 000053C0 */ 0xC9, 0x00, 0x00, 0x28, 0xC9, 0x00, 0x00, 0x28, 0xC9, 0x00, 0x00, 0x3A, 0xC9, 0x00, 0x00, 0x3A, -/* 000053D0 */ 0xC9, 0x00, 0x00, 0x3B, 0xC9, 0x00, 0x00, 0x3B, 0xC9, 0x00, 0x00, 0xCF, 0xC9, 0x00, 0x00, 0xCF, -/* 000053E0 */ 0xC9, 0x00, 0x00, 0xD0, 0xC9, 0x00, 0x00, 0xD0, 0xC9, 0x00, 0x00, 0x01, 0xCA, 0x00, 0x00, 0x01, -/* 000053F0 */ 0xCA, 0x00, 0x00, 0x39, 0xCA, 0x00, 0x00, 0x39, 0xCA, 0x00, 0x00, 0x7C, 0xCA, 0x00, 0x00, 0x7C, -/* 00005400 */ 0xCA, 0x00, 0x00, 0xAA, 0xCA, 0x00, 0x00, 0xAA, 0xCA, 0x00, 0x00, 0xAB, 0xCA, 0x00, 0x00, 0xAB, -/* 00005410 */ 0xCA, 0x00, 0x00, 0xD9, 0xCA, 0x00, 0x00, 0xD9, 0xCA, 0x00, 0x00, 0x11, 0xCB, 0x00, 0x00, 0x11, -/* 00005420 */ 0xCB, 0x00, 0x00, 0x23, 0xCB, 0x00, 0x00, 0x23, 0xCB, 0x00, 0x00, 0x24, 0xCB, 0x00, 0x00, 0x24, -/* 00005430 */ 0xCB, 0x00, 0x00, 0x59, 0xCB, 0x00, 0x00, 0x59, 0xCB, 0x00, 0x00, 0x9F, 0xCB, 0x00, 0x00, 0x9F, -/* 00005440 */ 0xCB, 0x00, 0x00, 0xFE, 0xCB, 0x00, 0x00, 0xFE, 0xCB, 0x00, 0x00, 0x36, 0xCC, 0x00, 0x00, 0x36, -/* 00005450 */ 0xCC, 0x00, 0x00, 0x98, 0xCC, 0x00, 0x00, 0x98, 0xCC, 0x00, 0x00, 0xD5, 0xCC, 0x00, 0x00, 0xD5, -/* 00005460 */ 0xCC, 0x00, 0x00, 0x35, 0xCD, 0x00, 0x00, 0x35, 0xCD, 0x00, 0x00, 0x72, 0xCD, 0x00, 0x00, 0x72, -/* 00005470 */ 0xCD, 0x00, 0x00, 0xD2, 0xCD, 0x00, 0x00, 0xD2, 0xCD, 0x00, 0x00, 0xE8, 0xCD, 0x00, 0x00, 0xE8, -/* 00005480 */ 0xCD, 0x00, 0x00, 0xFA, 0xCD, 0x00, 0x00, 0xFA, 0xCD, 0x00, 0x00, 0xFB, 0xCD, 0x00, 0x00, 0xFB, -/* 00005490 */ 0xCD, 0x00, 0x00, 0x47, 0xCE, 0x00, 0x00, 0x47, 0xCE, 0x00, 0x00, 0x95, 0xCE, 0x00, 0x00, 0x95, -/* 000054A0 */ 0xCE, 0x00, 0x00, 0xE3, 0xCE, 0x00, 0x00, 0xE3, 0xCE, 0x00, 0x00, 0xE4, 0xCE, 0x00, 0x00, 0xE4, -/* 000054B0 */ 0xCE, 0x00, 0x00, 0x22, 0xCF, 0x00, 0x00, 0x22, 0xCF, 0x00, 0x00, 0x7A, 0xCF, 0x00, 0x00, 0x7A, -/* 000054C0 */ 0xCF, 0x00, 0x00, 0xD2, 0xCF, 0x00, 0x00, 0xD2, 0xCF, 0x00, 0x00, 0xE4, 0xCF, 0x00, 0x00, 0xE4, -/* 000054D0 */ 0xCF, 0x00, 0x00, 0xE5, 0xCF, 0x00, 0x00, 0xE5, 0xCF, 0x00, 0x00, 0x25, 0xD0, 0x00, 0x00, 0x25, -/* 000054E0 */ 0xD0, 0x00, 0x00, 0x5F, 0xD0, 0x00, 0x00, 0x5F, 0xD0, 0x00, 0x00, 0x60, 0xD0, 0x00, 0x00, 0x60, -/* 000054F0 */ 0xD0, 0x00, 0x00, 0x76, 0xD0, 0x00, 0x00, 0x76, 0xD0, 0x00, 0x00, 0xCA, 0xD0, 0x00, 0x00, 0xCA, -/* 00005500 */ 0xD0, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0x11, 0xD1, 0x00, 0x00, 0x11, -/* 00005510 */ 0xD1, 0x00, 0x00, 0x2D, 0xD1, 0x00, 0x00, 0x2D, 0xD1, 0x00, 0x00, 0x57, 0xD1, 0x00, 0x00, 0x57, -/* 00005520 */ 0xD1, 0x00, 0x00, 0xAE, 0xD1, 0x00, 0x00, 0xAE, 0xD1, 0x00, 0x00, 0x33, 0xD2, 0x00, 0x00, 0x33, -/* 00005530 */ 0xD2, 0x00, 0x00, 0x98, 0xD2, 0x00, 0x00, 0x98, 0xD2, 0x00, 0x00, 0xD3, 0xD2, 0x00, 0x00, 0xD3, -/* 00005540 */ 0xD2, 0x00, 0x00, 0xE5, 0xD2, 0x00, 0x00, 0xE5, 0xD2, 0x00, 0x00, 0xE6, 0xD2, 0x00, 0x00, 0xE6, -/* 00005550 */ 0xD2, 0x00, 0x00, 0x1B, 0xD3, 0x00, 0x00, 0x1B, 0xD3, 0x00, 0x00, 0x2D, 0xD3, 0x00, 0x00, 0x2D, -/* 00005560 */ 0xD3, 0x00, 0x00, 0x8E, 0xD3, 0x00, 0x00, 0x8E, 0xD3, 0x00, 0x00, 0xA0, 0xD3, 0x00, 0x00, 0xA0, -/* 00005570 */ 0xD3, 0x00, 0x00, 0xA1, 0xD3, 0x00, 0x00, 0xA1, 0xD3, 0x00, 0x00, 0x1F, 0xD4, 0x00, 0x00, 0x1F, -/* 00005580 */ 0xD4, 0x00, 0x00, 0x5E, 0xD4, 0x00, 0x00, 0x5E, 0xD4, 0x00, 0x00, 0x6C, 0xD4, 0x00, 0x00, 0x6C, -/* 00005590 */ 0xD4, 0x00, 0x00, 0x6D, 0xD4, 0x00, 0x00, 0x6D, 0xD4, 0x00, 0x00, 0xDD, 0xD4, 0x00, 0x00, 0xDD, -/* 000055A0 */ 0xD4, 0x00, 0x00, 0x2C, 0xD5, 0x00, 0x00, 0x2C, 0xD5, 0x00, 0x00, 0x8D, 0xD5, 0x00, 0x00, 0x8D, -/* 000055B0 */ 0xD5, 0x00, 0x00, 0x9F, 0xD5, 0x00, 0x00, 0x9F, 0xD5, 0x00, 0x00, 0xA0, 0xD5, 0x00, 0x00, 0xA0, -/* 000055C0 */ 0xD5, 0x00, 0x00, 0xDA, 0xD5, 0x00, 0x00, 0xDA, 0xD5, 0x00, 0x00, 0x2B, 0xD6, 0x00, 0x00, 0x2B, -/* 000055D0 */ 0xD6, 0x00, 0x00, 0x2C, 0xD6, 0x00, 0x00, 0x2C, 0xD6, 0x00, 0x00, 0x5D, 0xD6, 0x00, 0x00, 0x5D, -/* 000055E0 */ 0xD6, 0x00, 0x00, 0xB1, 0xD6, 0x00, 0x00, 0xB1, 0xD6, 0x00, 0x00, 0x06, 0xD7, 0x00, 0x00, 0x06, -/* 000055F0 */ 0xD7, 0x00, 0x00, 0x1A, 0xD7, 0x00, 0x00, 0x1A, 0xD7, 0x00, 0x00, 0x1B, 0xD7, 0x00, 0x00, 0x1B, -/* 00005600 */ 0xD7, 0x00, 0x00, 0x42, 0xD7, 0x00, 0x00, 0x42, 0xD7, 0x00, 0x00, 0x6C, 0xD7, 0x00, 0x00, 0x6C, -/* 00005610 */ 0xD7, 0x00, 0x00, 0xD2, 0xD7, 0x00, 0x00, 0xD2, 0xD7, 0x00, 0x00, 0x49, 0xD8, 0x00, 0x00, 0x49, -/* 00005620 */ 0xD8, 0x00, 0x00, 0xBB, 0xD8, 0x00, 0x00, 0xBB, 0xD8, 0x00, 0x00, 0xE8, 0xD8, 0x00, 0x00, 0xE8, -/* 00005630 */ 0xD8, 0x00, 0x00, 0x15, 0xD9, 0x00, 0x00, 0x15, 0xD9, 0x00, 0x00, 0x5C, 0xD9, 0x00, 0x00, 0x5C, -/* 00005640 */ 0xD9, 0x00, 0x00, 0xA3, 0xD9, 0x00, 0x00, 0xA3, 0xD9, 0x00, 0x00, 0xA4, 0xD9, 0x00, 0x00, 0xA4, -/* 00005650 */ 0xD9, 0x00, 0x00, 0xE3, 0xD9, 0x00, 0x00, 0xE3, 0xD9, 0x00, 0x00, 0x26, 0xDA, 0x00, 0x00, 0x26, -/* 00005660 */ 0xDA, 0x00, 0x00, 0x3C, 0xDA, 0x00, 0x00, 0x3C, 0xDA, 0x00, 0x00, 0x3D, 0xDA, 0x00, 0x00, 0x3D, -/* 00005670 */ 0xDA, 0x00, 0x00, 0x74, 0xDA, 0x00, 0x00, 0x74, 0xDA, 0x00, 0x00, 0x75, 0xDA, 0x00, 0x00, 0x75, -/* 00005680 */ 0xDA, 0x00, 0x00, 0xA9, 0xDA, 0x00, 0x00, 0xA9, 0xDA, 0x00, 0x00, 0xF6, 0xDA, 0x00, 0x00, 0xF6, -/* 00005690 */ 0xDA, 0x00, 0x00, 0x0C, 0xDB, 0x00, 0x00, 0x0C, 0xDB, 0x00, 0x00, 0x0D, 0xDB, 0x00, 0x00, 0x0D, -/* 000056A0 */ 0xDB, 0x00, 0x00, 0x48, 0xDB, 0x00, 0x00, 0x48, 0xDB, 0x00, 0x00, 0x8E, 0xDB, 0x00, 0x00, 0x8E, -/* 000056B0 */ 0xDB, 0x00, 0x00, 0x8F, 0xDB, 0x00, 0x00, 0x8F, 0xDB, 0x00, 0x00, 0xC5, 0xDB, 0x00, 0x00, 0xC5, -/* 000056C0 */ 0xDB, 0x00, 0x00, 0x04, 0xDC, 0x00, 0x00, 0x04, 0xDC, 0x00, 0x00, 0x49, 0xDC, 0x00, 0x00, 0x49, -/* 000056D0 */ 0xDC, 0x00, 0x00, 0x5F, 0xDC, 0x00, 0x00, 0x5F, 0xDC, 0x00, 0x00, 0x60, 0xDC, 0x00, 0x00, 0x60, -/* 000056E0 */ 0xDC, 0x00, 0x00, 0xAC, 0xDC, 0x00, 0x00, 0xAC, 0xDC, 0x00, 0x00, 0xAD, 0xDC, 0x00, 0x00, 0xAD, -/* 000056F0 */ 0xDC, 0x00, 0x00, 0x12, 0xDD, 0x00, 0x00, 0x12, 0xDD, 0x00, 0x00, 0x4E, 0xDD, 0x00, 0x00, 0x4E, -/* 00005700 */ 0xDD, 0x00, 0x00, 0x4F, 0xDD, 0x00, 0x00, 0x4F, 0xDD, 0x00, 0x00, 0x6F, 0xDD, 0x00, 0x00, 0x6F, -/* 00005710 */ 0xDD, 0x00, 0x00, 0x81, 0xDD, 0x00, 0x00, 0x81, 0xDD, 0x00, 0x00, 0xC7, 0xDD, 0x00, 0x00, 0xC7, -/* 00005720 */ 0xDD, 0x00, 0x00, 0xC8, 0xDD, 0x00, 0x00, 0xC8, 0xDD, 0x00, 0x00, 0xED, 0xDD, 0x00, 0x00, 0xED, -/* 00005730 */ 0xDD, 0x00, 0x00, 0x1B, 0xDE, 0x00, 0x00, 0x1B, 0xDE, 0x00, 0x00, 0x1C, 0xDE, 0x00, 0x00, 0x1C, -/* 00005740 */ 0xDE, 0x00, 0x00, 0x50, 0xDE, 0x00, 0x00, 0x50, 0xDE, 0x00, 0x00, 0xB9, 0xDE, 0x00, 0x00, 0xB9, -/* 00005750 */ 0xDE, 0x00, 0x00, 0xCF, 0xDE, 0x00, 0x00, 0xCF, 0xDE, 0x00, 0x00, 0xD0, 0xDE, 0x00, 0x00, 0xD0, -/* 00005760 */ 0xDE, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0x78, 0xDF, 0x00, 0x00, 0x78, -/* 00005770 */ 0xDF, 0x00, 0x00, 0xE1, 0xDF, 0x00, 0x00, 0xE1, 0xDF, 0x00, 0x00, 0xF7, 0xDF, 0x00, 0x00, 0xF7, -/* 00005780 */ 0xDF, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00, 0x50, 0xE0, 0x00, 0x00, 0x50, -/* 00005790 */ 0xE0, 0x00, 0x00, 0xAA, 0xE0, 0x00, 0x00, 0xAA, 0xE0, 0x00, 0x00, 0xBC, 0xE0, 0x00, 0x00, 0xBC, -/* 000057A0 */ 0xE0, 0x00, 0x00, 0x0D, 0xE1, 0x00, 0x00, 0x0D, 0xE1, 0x00, 0x00, 0x0E, 0xE1, 0x00, 0x00, 0x0E, -/* 000057B0 */ 0xE1, 0x00, 0x00, 0xA8, 0xE1, 0x00, 0x00, 0xA8, 0xE1, 0x00, 0x00, 0xA9, 0xE1, 0x00, 0x00, 0xA9, -/* 000057C0 */ 0xE1, 0x00, 0x00, 0x25, 0xE2, 0x00, 0x00, 0x25, 0xE2, 0x00, 0x00, 0xA3, 0xE2, 0x00, 0x00, 0xA3, -/* 000057D0 */ 0xE2, 0x00, 0x00, 0xC7, 0xE2, 0x00, 0x00, 0xC7, 0xE2, 0x00, 0x00, 0xC8, 0xE2, 0x00, 0x00, 0xC8, -/* 000057E0 */ 0xE2, 0x00, 0x00, 0x61, 0xE3, 0x00, 0x00, 0x61, 0xE3, 0x00, 0x00, 0xA9, 0xE3, 0x00, 0x00, 0xA9, -/* 000057F0 */ 0xE3, 0x00, 0x00, 0x46, 0xE4, 0x00, 0x00, 0x46, 0xE4, 0x00, 0x00, 0x47, 0xE4, 0x00, 0x00, 0x47, -/* 00005800 */ 0xE4, 0x00, 0x00, 0x99, 0xE4, 0x00, 0x00, 0x99, 0xE4, 0x00, 0x00, 0xD1, 0xE4, 0x00, 0x00, 0xD1, -/* 00005810 */ 0xE4, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x7F, -/* 00005820 */ 0xE5, 0x00, 0x00, 0x99, 0xE5, 0x00, 0x00, 0x99, 0xE5, 0x00, 0x00, 0xE4, 0xE5, 0x00, 0x00, 0xE4, -/* 00005830 */ 0xE5, 0x00, 0x00, 0x49, 0xE6, 0x00, 0x00, 0x49, 0xE6, 0x00, 0x00, 0xBF, 0xE6, 0x00, 0x00, 0xBF, -/* 00005840 */ 0xE6, 0x00, 0x00, 0xD9, 0xE6, 0x00, 0x00, 0xD9, 0xE6, 0x00, 0x00, 0xDA, 0xE6, 0x00, 0x00, 0xDA, -/* 00005850 */ 0xE6, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x21, 0xE7, 0x00, 0x00, 0x21, -/* 00005860 */ 0xE7, 0x00, 0x00, 0x7D, 0xE7, 0x00, 0x00, 0x7D, 0xE7, 0x00, 0x00, 0xD3, 0xE7, 0x00, 0x00, 0xD3, -/* 00005870 */ 0xE7, 0x00, 0x00, 0x2A, 0xE8, 0x00, 0x00, 0x2A, 0xE8, 0x00, 0x00, 0x48, 0xE8, 0x00, 0x00, 0x48, -/* 00005880 */ 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, 0x65, 0xE8, 0x00, 0x00, 0x65, -/* 00005890 */ 0xE8, 0x00, 0x00, 0xA7, 0xE8, 0x00, 0x00, 0xA7, 0xE8, 0x00, 0x00, 0xF4, 0xE8, 0x00, 0x00, 0xF4, -/* 000058A0 */ 0xE8, 0x00, 0x00, 0x08, 0xE9, 0x00, 0x00, 0x08, 0xE9, 0x00, 0x00, 0x09, 0xE9, 0x00, 0x00, 0x09, -/* 000058B0 */ 0xE9, 0x00, 0x00, 0x52, 0xE9, 0x00, 0x00, 0x52, 0xE9, 0x00, 0x00, 0x99, 0xE9, 0x00, 0x00, 0x99, -/* 000058C0 */ 0xE9, 0x00, 0x00, 0xD1, 0xE9, 0x00, 0x00, 0xD1, 0xE9, 0x00, 0x00, 0x3E, 0xEA, 0x00, 0x00, 0x3E, -/* 000058D0 */ 0xEA, 0x00, 0x00, 0x58, 0xEA, 0x00, 0x00, 0x58, 0xEA, 0x00, 0x00, 0x59, 0xEA, 0x00, 0x00, 0x59, -/* 000058E0 */ 0xEA, 0x00, 0x00, 0xA4, 0xEA, 0x00, 0x00, 0xA4, 0xEA, 0x00, 0x00, 0x09, 0xEB, 0x00, 0x00, 0x09, -/* 000058F0 */ 0xEB, 0x00, 0x00, 0x76, 0xEB, 0x00, 0x00, 0x76, 0xEB, 0x00, 0x00, 0x90, 0xEB, 0x00, 0x00, 0x90, -/* 00005900 */ 0xEB, 0x00, 0x00, 0x91, 0xEB, 0x00, 0x00, 0x91, 0xEB, 0x00, 0x00, 0xCC, 0xEB, 0x00, 0x00, 0xCC, -/* 00005910 */ 0xEB, 0x00, 0x00, 0x0A, 0xEC, 0x00, 0x00, 0x0A, 0xEC, 0x00, 0x00, 0x1E, 0xEC, 0x00, 0x00, 0x1E, -/* 00005920 */ 0xEC, 0x00, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x44, 0xEC, 0x00, 0x00, 0x44, -/* 00005930 */ 0xEC, 0x00, 0x00, 0x52, 0xEC, 0x00, 0x00, 0x52, 0xEC, 0x00, 0x00, 0x5C, 0xEC, 0x00, 0x00, 0x5C, -/* 00005940 */ 0xEC, 0x00, 0x00, 0xAB, 0xEC, 0x00, 0x00, 0xAB, 0xEC, 0x00, 0x00, 0xC5, 0xEC, 0x00, 0x00, 0xC5, -/* 00005950 */ 0xEC, 0x00, 0x00, 0xCF, 0xEC, 0x00, 0x00, 0xCF, 0xEC, 0x00, 0x00, 0xD0, 0xEC, 0x00, 0x00, 0xD0, -/* 00005960 */ 0xEC, 0x00, 0x00, 0x50, 0xED, 0x00, 0x00, 0x50, 0xED, 0x00, 0x00, 0x78, 0xED, 0x00, 0x00, 0x78, -/* 00005970 */ 0xED, 0x00, 0x00, 0x79, 0xED, 0x00, 0x00, 0x79, 0xED, 0x00, 0x00, 0xB3, 0xED, 0x00, 0x00, 0xB3, -/* 00005980 */ 0xED, 0x00, 0x00, 0xF9, 0xED, 0x00, 0x00, 0xF9, 0xED, 0x00, 0x00, 0x26, 0xEE, 0x00, 0x00, 0x26, -/* 00005990 */ 0xEE, 0x00, 0x00, 0x5C, 0xEE, 0x00, 0x00, 0x5C, 0xEE, 0x00, 0x00, 0x75, 0xEE, 0x00, 0x00, 0x75, -/* 000059A0 */ 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xC1, 0xEE, 0x00, 0x00, 0xC1, -/* 000059B0 */ 0xEE, 0x00, 0x00, 0xC2, 0xEE, 0x00, 0x00, 0xC2, 0xEE, 0x00, 0x00, 0xEB, 0xEE, 0x00, 0x00, 0xEB, -/* 000059C0 */ 0xEE, 0x00, 0x00, 0x2C, 0xEF, 0x00, 0x00, 0x2C, 0xEF, 0x00, 0x00, 0xBF, 0xEF, 0x00, 0x00, 0xBF, -/* 000059D0 */ 0xEF, 0x00, 0x00, 0xED, 0xEF, 0x00, 0x00, 0xED, 0xEF, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x03, -/* 000059E0 */ 0xF0, 0x00, 0x00, 0x15, 0xF0, 0x00, 0x00, 0x15, 0xF0, 0x00, 0x00, 0x56, 0xF0, 0x00, 0x00, 0x56, -/* 000059F0 */ 0xF0, 0x00, 0x00, 0xCC, 0xF0, 0x00, 0x00, 0xCC, 0xF0, 0x00, 0x00, 0xFA, 0xF0, 0x00, 0x00, 0xFA, -/* 00005A00 */ 0xF0, 0x00, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x22, 0xF1, 0x00, 0x00, 0x22, -/* 00005A10 */ 0xF1, 0x00, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x76, 0xF1, 0x00, 0x00, 0x76, -/* 00005A20 */ 0xF1, 0x00, 0x00, 0xB2, 0xF1, 0x00, 0x00, 0xB2, 0xF1, 0x00, 0x00, 0xEC, 0xF1, 0x00, 0x00, 0xEC, -/* 00005A30 */ 0xF1, 0x00, 0x00, 0x29, 0xF2, 0x00, 0x00, 0x29, 0xF2, 0x00, 0x00, 0x41, 0xF2, 0x00, 0x00, 0x41, -/* 00005A40 */ 0xF2, 0x00, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0xB8, 0xF2, 0x00, 0x00, 0xB8, -/* 00005A50 */ 0xF2, 0x00, 0x00, 0xF5, 0xF2, 0x00, 0x00, 0xF5, 0xF2, 0x00, 0x00, 0x0D, 0xF3, 0x00, 0x00, 0x0D, -/* 00005A60 */ 0xF3, 0x00, 0x00, 0x48, 0xF3, 0x00, 0x00, 0x48, 0xF3, 0x00, 0x00, 0x82, 0xF3, 0x00, 0x00, 0x82, -/* 00005A70 */ 0xF3, 0x00, 0x00, 0xBF, 0xF3, 0x00, 0x00, 0xBF, 0xF3, 0x00, 0x00, 0xD7, 0xF3, 0x00, 0x00, 0xD7, -/* 00005A80 */ 0xF3, 0x00, 0x00, 0xE9, 0xF3, 0x00, 0x00, 0xE9, 0xF3, 0x00, 0x00, 0x3C, 0xF4, 0x00, 0x00, 0x3C, -/* 00005A90 */ 0xF4, 0x00, 0x00, 0x78, 0xF4, 0x00, 0x00, 0x78, 0xF4, 0x00, 0x00, 0xB2, 0xF4, 0x00, 0x00, 0xB2, -/* 00005AA0 */ 0xF4, 0x00, 0x00, 0xEF, 0xF4, 0x00, 0x00, 0xEF, 0xF4, 0x00, 0x00, 0x07, 0xF5, 0x00, 0x00, 0x07, -/* 00005AB0 */ 0xF5, 0x00, 0x00, 0x45, 0xF5, 0x00, 0x00, 0x45, 0xF5, 0x00, 0x00, 0x7F, 0xF5, 0x00, 0x00, 0x7F, -/* 00005AC0 */ 0xF5, 0x00, 0x00, 0xBC, 0xF5, 0x00, 0x00, 0xBC, 0xF5, 0x00, 0x00, 0xD4, 0xF5, 0x00, 0x00, 0xD4, -/* 00005AD0 */ 0xF5, 0x00, 0x00, 0x12, 0xF6, 0x00, 0x00, 0x12, 0xF6, 0x00, 0x00, 0x4C, 0xF6, 0x00, 0x00, 0x4C, -/* 00005AE0 */ 0xF6, 0x00, 0x00, 0x89, 0xF6, 0x00, 0x00, 0x89, 0xF6, 0x00, 0x00, 0xA1, 0xF6, 0x00, 0x00, 0xA1, -/* 00005AF0 */ 0xF6, 0x00, 0x00, 0xB3, 0xF6, 0x00, 0x00, 0xB3, 0xF6, 0x00, 0x00, 0xD3, 0xF6, 0x00, 0x00, 0xD3, -/* 00005B00 */ 0xF6, 0x00, 0x00, 0xE1, 0xF6, 0x00, 0x00, 0xE1, 0xF6, 0x00, 0x00, 0xE2, 0xF6, 0x00, 0x00, 0xE2, -/* 00005B10 */ 0xF6, 0x00, 0x00, 0x6C, 0xF7, 0x00, 0x00, 0x6C, 0xF7, 0x00, 0x00, 0xA9, 0xF7, 0x00, 0x00, 0xA9, -/* 00005B20 */ 0xF7, 0x00, 0x00, 0xCC, 0xF7, 0x00, 0x00, 0xCC, 0xF7, 0x00, 0x00, 0xCD, 0xF7, 0x00, 0x00, 0xCD, -/* 00005B30 */ 0xF7, 0x00, 0x00, 0xF4, 0xF7, 0x00, 0x00, 0xF4, 0xF7, 0x00, 0x00, 0x4B, 0xF8, 0x00, 0x00, 0x4B, -/* 00005B40 */ 0xF8, 0x00, 0x00, 0xAB, 0xF8, 0x00, 0x00, 0xAB, 0xF8, 0x00, 0x00, 0xE8, 0xF8, 0x00, 0x00, 0xE8, -/* 00005B50 */ 0xF8, 0x00, 0x00, 0x41, 0xF9, 0x00, 0x00, 0x41, 0xF9, 0x00, 0x00, 0x57, 0xF9, 0x00, 0x00, 0x57, -/* 00005B60 */ 0xF9, 0x00, 0x00, 0x69, 0xF9, 0x00, 0x00, 0x69, 0xF9, 0x00, 0x00, 0x6A, 0xF9, 0x00, 0x00, 0x6A, -/* 00005B70 */ 0xF9, 0x00, 0x00, 0x95, 0xF9, 0x00, 0x00, 0x95, 0xF9, 0x00, 0x00, 0xB9, 0xF9, 0x00, 0x00, 0xB9, -/* 00005B80 */ 0xF9, 0x00, 0x00, 0xEF, 0xF9, 0x00, 0x00, 0xEF, 0xF9, 0x00, 0x00, 0x4A, 0xFA, 0x00, 0x00, 0x4A, -/* 00005B90 */ 0xFA, 0x00, 0x00, 0x87, 0xFA, 0x00, 0x00, 0x87, 0xFA, 0x00, 0x00, 0xDB, 0xFA, 0x00, 0x00, 0xDB, -/* 00005BA0 */ 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0x03, 0xFB, 0x00, 0x00, 0x03, -/* 00005BB0 */ 0xFB, 0x00, 0x00, 0x04, 0xFB, 0x00, 0x00, 0x04, 0xFB, 0x00, 0x00, 0x29, 0xFB, 0x00, 0x00, 0x29, -/* 00005BC0 */ 0xFB, 0x00, 0x00, 0x7F, 0xFB, 0x00, 0x00, 0x7F, 0xFB, 0x00, 0x00, 0xD6, 0xFB, 0x00, 0x00, 0xD6, -/* 00005BD0 */ 0xFB, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x8C, 0xFC, 0x00, 0x00, 0x8C, -/* 00005BE0 */ 0xFC, 0x00, 0x00, 0xC7, 0xFC, 0x00, 0x00, 0xC7, 0xFC, 0x00, 0x00, 0x1C, 0xFD, 0x00, 0x00, 0x1C, -/* 00005BF0 */ 0xFD, 0x00, 0x00, 0x32, 0xFD, 0x00, 0x00, 0x32, 0xFD, 0x00, 0x00, 0x44, 0xFD, 0x00, 0x00, 0x44, -/* 00005C00 */ 0xFD, 0x00, 0x00, 0x45, 0xFD, 0x00, 0x00, 0x45, 0xFD, 0x00, 0x00, 0x68, 0xFD, 0x00, 0x00, 0x68, -/* 00005C10 */ 0xFD, 0x00, 0x00, 0xB2, 0xFD, 0x00, 0x00, 0xB2, 0xFD, 0x00, 0x00, 0xC4, 0xFD, 0x00, 0x00, 0xC4, -/* 00005C20 */ 0xFD, 0x00, 0x00, 0xC5, 0xFD, 0x00, 0x00, 0xC5, 0xFD, 0x00, 0x00, 0xF1, 0xFD, 0x00, 0x00, 0xF1, -/* 00005C30 */ 0xFD, 0x00, 0x00, 0x2D, 0xFE, 0x00, 0x00, 0x2D, 0xFE, 0x00, 0x00, 0x8C, 0xFE, 0x00, 0x00, 0x8C, -/* 00005C40 */ 0xFE, 0x00, 0x00, 0xCE, 0xFE, 0x00, 0x00, 0xCE, 0xFE, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x00, 0x26, -/* 00005C50 */ 0xFF, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x4E, 0xFF, 0x00, 0x00, 0x4E, -/* 00005C60 */ 0xFF, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0xB5, 0xFF, 0x00, 0x00, 0xB5, -/* 00005C70 */ 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x00, 0x00, 0x29, 0x00, 0x01, 0x00, 0x29, -/* 00005C80 */ 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x53, 0x00, 0x01, 0x00, 0x53, -/* 00005C90 */ 0x00, 0x01, 0x00, 0x54, 0x00, 0x01, 0x00, 0x54, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x01, 0x00, 0x8A, -/* 00005CA0 */ 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0E, 0x01, 0x01, 0x00, 0x0E, -/* 00005CB0 */ 0x01, 0x01, 0x00, 0x0F, 0x01, 0x01, 0x00, 0x0F, 0x01, 0x01, 0x00, 0x3C, 0x01, 0x01, 0x00, 0x3C, -/* 00005CC0 */ 0x01, 0x01, 0x00, 0x6C, 0x01, 0x01, 0x00, 0x6C, 0x01, 0x01, 0x00, 0x98, 0x01, 0x01, 0x00, 0x98, -/* 00005CD0 */ 0x01, 0x01, 0x00, 0xC4, 0x01, 0x01, 0x00, 0xC4, 0x01, 0x01, 0x00, 0xF4, 0x01, 0x01, 0x00, 0xF4, -/* 00005CE0 */ 0x01, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x4C, 0x02, 0x01, 0x00, 0x4C, -/* 00005CF0 */ 0x02, 0x01, 0x00, 0x81, 0x02, 0x01, 0x00, 0x81, 0x02, 0x01, 0x00, 0xA9, 0x02, 0x01, 0x00, 0xA9, -/* 00005D00 */ 0x02, 0x01, 0x00, 0xD4, 0x02, 0x01, 0x00, 0xD4, 0x02, 0x01, 0x00, 0xE3, 0x02, 0x01, 0x00, 0xE3, -/* 00005D10 */ 0x02, 0x01, 0x00, 0xE4, 0x02, 0x01, 0x00, 0xE4, 0x02, 0x01, 0x00, 0x1B, 0x03, 0x01, 0x00, 0x1B, -/* 00005D20 */ 0x03, 0x01, 0x00, 0x52, 0x03, 0x01, 0x00, 0x52, 0x03, 0x01, 0x00, 0x71, 0x03, 0x01, 0x00, 0x71, -/* 00005D30 */ 0x03, 0x01, 0x00, 0x83, 0x03, 0x01, 0x00, 0x83, 0x03, 0x01, 0x00, 0x84, 0x03, 0x01, 0x00, 0x84, -/* 00005D40 */ 0x03, 0x01, 0x00, 0xCC, 0x03, 0x01, 0x00, 0xCC, 0x03, 0x01, 0x00, 0xDA, 0x03, 0x01, 0x00, 0xDA, -/* 00005D50 */ 0x03, 0x01, 0x00, 0xDB, 0x03, 0x01, 0x00, 0xDB, 0x03, 0x01, 0x00, 0x4B, 0x04, 0x01, 0x00, 0x4B, -/* 00005D60 */ 0x04, 0x01, 0x00, 0xA7, 0x04, 0x01, 0x00, 0xA7, 0x04, 0x01, 0x00, 0x1D, 0x05, 0x01, 0x00, 0x1D, -/* 00005D70 */ 0x05, 0x01, 0x00, 0xAE, 0x05, 0x01, 0x00, 0xAE, 0x05, 0x01, 0x00, 0x2C, 0x06, 0x01, 0x00, 0x2C, -/* 00005D80 */ 0x06, 0x01, 0x00, 0x52, 0x06, 0x01, 0x00, 0x52, 0x06, 0x01, 0x00, 0x47, 0x07, 0x01, 0x00, 0x47, -/* 00005D90 */ 0x07, 0x01, 0x00, 0x71, 0x07, 0x01, 0x00, 0x71, 0x07, 0x01, 0x00, 0x83, 0x07, 0x01, 0x00, 0x83, -/* 00005DA0 */ 0x07, 0x01, 0x00, 0x84, 0x07, 0x01, 0x00, 0x84, 0x07, 0x01, 0x00, 0xC7, 0x07, 0x01, 0x00, 0xC7, -/* 00005DB0 */ 0x07, 0x01, 0x00, 0x49, 0x08, 0x01, 0x00, 0x49, 0x08, 0x01, 0x00, 0x7C, 0x08, 0x01, 0x00, 0x7C, -/* 00005DC0 */ 0x08, 0x01, 0x00, 0x32, 0x09, 0x01, 0x00, 0x32, 0x09, 0x01, 0x00, 0x44, 0x09, 0x01, 0x00, 0x44, -/* 00005DD0 */ 0x09, 0x01, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x78, 0x09, 0x01, 0x00, 0x78, -/* 00005DE0 */ 0x09, 0x01, 0x00, 0x79, 0x09, 0x01, 0x00, 0x79, 0x09, 0x01, 0x00, 0xDE, 0x09, 0x01, 0x00, 0xDE, -/* 00005DF0 */ 0x09, 0x01, 0x00, 0x28, 0x0A, 0x01, 0x00, 0x28, 0x0A, 0x01, 0x00, 0x9C, 0x0A, 0x01, 0x00, 0x9C, -/* 00005E00 */ 0x0A, 0x01, 0x00, 0x2D, 0x0B, 0x01, 0x00, 0x2D, 0x0B, 0x01, 0x00, 0x53, 0x0B, 0x01, 0x00, 0x53, -/* 00005E10 */ 0x0B, 0x01, 0x00, 0x53, 0x0C, 0x01, 0x00, 0x53, 0x0C, 0x01, 0x00, 0x7D, 0x0C, 0x01, 0x00, 0x7D, -/* 00005E20 */ 0x0C, 0x01, 0x00, 0x8F, 0x0C, 0x01, 0x00, 0x8F, 0x0C, 0x01, 0x00, 0x90, 0x0C, 0x01, 0x00, 0x90, -/* 00005E30 */ 0x0C, 0x01, 0x00, 0xDA, 0x0C, 0x01, 0x00, 0xDA, 0x0C, 0x01, 0x00, 0x09, 0x0D, 0x01, 0x00, 0x09, -/* 00005E40 */ 0x0D, 0x01, 0x00, 0x87, 0x0D, 0x01, 0x00, 0x87, 0x0D, 0x01, 0x00, 0xBC, 0x0D, 0x01, 0x00, 0xBC, -/* 00005E50 */ 0x0D, 0x01, 0x00, 0x37, 0x0E, 0x01, 0x00, 0x37, 0x0E, 0x01, 0x00, 0x49, 0x0E, 0x01, 0x00, 0x49, -/* 00005E60 */ 0x0E, 0x01, 0x00, 0x4A, 0x0E, 0x01, 0x00, 0x4A, 0x0E, 0x01, 0x00, 0x70, 0x0E, 0x01, 0x00, 0x70, -/* 00005E70 */ 0x0E, 0x01, 0x00, 0x7E, 0x0E, 0x01, 0x00, 0x7E, 0x0E, 0x01, 0x00, 0x7F, 0x0E, 0x01, 0x00, 0x7F, -/* 00005E80 */ 0x0E, 0x01, 0x00, 0xE1, 0x0E, 0x01, 0x00, 0xE1, 0x0E, 0x01, 0x00, 0x2C, 0x0F, 0x01, 0x00, 0x2C, -/* 00005E90 */ 0x0F, 0x01, 0x00, 0x6A, 0x0F, 0x01, 0x00, 0x6A, 0x0F, 0x01, 0x00, 0xE3, 0x0F, 0x01, 0x00, 0xE3, -/* 00005EA0 */ 0x0F, 0x01, 0x00, 0xF5, 0x0F, 0x01, 0x00, 0xF5, 0x0F, 0x01, 0x00, 0xF6, 0x0F, 0x01, 0x00, 0xF6, -/* 00005EB0 */ 0x0F, 0x01, 0x00, 0x30, 0x10, 0x01, 0x00, 0x30, 0x10, 0x01, 0x00, 0x9D, 0x10, 0x01, 0x00, 0x9D, -/* 00005EC0 */ 0x10, 0x01, 0x00, 0xFC, 0x10, 0x01, 0x00, 0xFC, 0x10, 0x01, 0x00, 0x71, 0x11, 0x01, 0x00, 0x71, -/* 00005ED0 */ 0x11, 0x01, 0x00, 0x83, 0x11, 0x01, 0x00, 0x83, 0x11, 0x01, 0x00, 0x84, 0x11, 0x01, 0x00, 0x84, -/* 00005EE0 */ 0x11, 0x01, 0x00, 0xBF, 0x11, 0x01, 0x00, 0xBF, 0x11, 0x01, 0x00, 0x2A, 0x12, 0x01, 0x00, 0x2A, -/* 00005EF0 */ 0x12, 0x01, 0x00, 0x54, 0x12, 0x01, 0x00, 0x54, 0x12, 0x01, 0x00, 0xC8, 0x12, 0x01, 0x00, 0xC8, -/* 00005F00 */ 0x12, 0x01, 0x00, 0xE5, 0x12, 0x01, 0x00, 0xE5, 0x12, 0x01, 0x00, 0x68, 0x13, 0x01, 0x00, 0x68, -/* 00005F10 */ 0x13, 0x01, 0x00, 0x7E, 0x13, 0x01, 0x00, 0x7E, 0x13, 0x01, 0x00, 0xBD, 0x13, 0x01, 0x00, 0xBD, -/* 00005F20 */ 0x13, 0x01, 0x00, 0x28, 0x14, 0x01, 0x00, 0x28, 0x14, 0x01, 0x00, 0x52, 0x14, 0x01, 0x00, 0x52, -/* 00005F30 */ 0x14, 0x01, 0x00, 0xC6, 0x14, 0x01, 0x00, 0xC6, 0x14, 0x01, 0x00, 0xE3, 0x14, 0x01, 0x00, 0xE3, -/* 00005F40 */ 0x14, 0x01, 0x00, 0x5C, 0x15, 0x01, 0x00, 0x5C, 0x15, 0x01, 0x00, 0x72, 0x15, 0x01, 0x00, 0x72, -/* 00005F50 */ 0x15, 0x01, 0x00, 0x84, 0x15, 0x01, 0x00, 0x84, 0x15, 0x01, 0x00, 0x85, 0x15, 0x01, 0x00, 0x85, -/* 00005F60 */ 0x15, 0x01, 0x00, 0x1A, 0x16, 0x01, 0x00, 0x1A, 0x16, 0x01, 0x00, 0xA6, 0x16, 0x01, 0x00, 0xA6, -/* 00005F70 */ 0x16, 0x01, 0x00, 0x19, 0x17, 0x01, 0x00, 0x19, 0x17, 0x01, 0x00, 0x5C, 0x17, 0x01, 0x00, 0x5C, -/* 00005F80 */ 0x17, 0x01, 0x00, 0xD8, 0x17, 0x01, 0x00, 0xD8, 0x17, 0x01, 0x00, 0xEA, 0x17, 0x01, 0x00, 0xEA, -/* 00005F90 */ 0x17, 0x01, 0x00, 0xEB, 0x17, 0x01, 0x00, 0xEB, 0x17, 0x01, 0x00, 0x25, 0x18, 0x01, 0x00, 0x25, -/* 00005FA0 */ 0x18, 0x01, 0x00, 0x9D, 0x18, 0x01, 0x00, 0x9D, 0x18, 0x01, 0x00, 0xAF, 0x18, 0x01, 0x00, 0xAF, -/* 00005FB0 */ 0x18, 0x01, 0x00, 0xB0, 0x18, 0x01, 0x00, 0xB0, 0x18, 0x01, 0x00, 0xEB, 0x18, 0x01, 0x00, 0xEB, -/* 00005FC0 */ 0x18, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0x77, 0x19, 0x01, 0x00, 0x77, -/* 00005FD0 */ 0x19, 0x01, 0x00, 0x78, 0x19, 0x01, 0x00, 0x78, 0x19, 0x01, 0x00, 0xB5, 0x19, 0x01, 0x00, 0xB5, -/* 00005FE0 */ 0x19, 0x01, 0x00, 0x33, 0x1A, 0x01, 0x00, 0x33, 0x1A, 0x01, 0x00, 0x45, 0x1A, 0x01, 0x00, 0x45, -/* 00005FF0 */ 0x1A, 0x01, 0x00, 0x46, 0x1A, 0x01, 0x00, 0x46, 0x1A, 0x01, 0x00, 0x83, 0x1A, 0x01, 0x00, 0x83, -/* 00006000 */ 0x1A, 0x01, 0x00, 0x01, 0x1B, 0x01, 0x00, 0x01, 0x1B, 0x01, 0x00, 0x13, 0x1B, 0x01, 0x00, 0x13, -/* 00006010 */ 0x1B, 0x01, 0x00, 0x14, 0x1B, 0x01, 0x00, 0x14, 0x1B, 0x01, 0x00, 0x57, 0x1B, 0x01, 0x00, 0x57, -/* 00006020 */ 0x1B, 0x01, 0x00, 0xD4, 0x1B, 0x01, 0x00, 0xD4, 0x1B, 0x01, 0x00, 0xE6, 0x1B, 0x01, 0x00, 0xE6, -/* 00006030 */ 0x1B, 0x01, 0x00, 0xE7, 0x1B, 0x01, 0x00, 0xE7, 0x1B, 0x01, 0x00, 0x0D, 0x1C, 0x01, 0x00, 0x0D, -/* 00006040 */ 0x1C, 0x01, 0x00, 0x1B, 0x1C, 0x01, 0x00, 0x1B, 0x1C, 0x01, 0x00, 0x1C, 0x1C, 0x01, 0x00, 0x1C, -/* 00006050 */ 0x1C, 0x01, 0x00, 0x71, 0x1C, 0x01, 0x00, 0x71, 0x1C, 0x01, 0x00, 0xAA, 0x1C, 0x01, 0x00, 0xAA, -/* 00006060 */ 0x1C, 0x01, 0x00, 0xDA, 0x1C, 0x01, 0x00, 0xDA, 0x1C, 0x01, 0x00, 0xEC, 0x1C, 0x01, 0x00, 0xEC, -/* 00006070 */ 0x1C, 0x01, 0x00, 0xED, 0x1C, 0x01, 0x00, 0xED, 0x1C, 0x01, 0x00, 0x88, 0x1D, 0x01, 0x00, 0x88, -/* 00006080 */ 0x1D, 0x01, 0x00, 0xEA, 0x1D, 0x01, 0x00, 0xEA, 0x1D, 0x01, 0x00, 0xFC, 0x1D, 0x01, 0x00, 0xFC, -/* 00006090 */ 0x1D, 0x01, 0x00, 0xFD, 0x1D, 0x01, 0x00, 0xFD, 0x1D, 0x01, 0x00, 0x3C, 0x1E, 0x01, 0x00, 0x3C, -/* 000060A0 */ 0x1E, 0x01, 0x00, 0x3D, 0x1E, 0x01, 0x00, 0x3D, 0x1E, 0x01, 0x00, 0x64, 0x1E, 0x01, 0x00, 0x64, -/* 000060B0 */ 0x1E, 0x01, 0x00, 0xA9, 0x1E, 0x01, 0x00, 0xA9, 0x1E, 0x01, 0x00, 0xAA, 0x1E, 0x01, 0x00, 0xAA, -/* 000060C0 */ 0x1E, 0x01, 0x00, 0x1B, 0x1F, 0x01, 0x00, 0x1B, 0x1F, 0x01, 0x00, 0x7A, 0x1F, 0x01, 0x00, 0x7A, -/* 000060D0 */ 0x1F, 0x01, 0x00, 0x7B, 0x1F, 0x01, 0x00, 0x7B, 0x1F, 0x01, 0x00, 0xA9, 0x1F, 0x01, 0x00, 0xA9, -/* 000060E0 */ 0x1F, 0x01, 0x00, 0xFC, 0x1F, 0x01, 0x00, 0xFC, 0x1F, 0x01, 0x00, 0x15, 0x20, 0x01, 0x00, 0x15, -/* 000060F0 */ 0x20, 0x01, 0x00, 0x53, 0x20, 0x01, 0x00, 0x53, 0x20, 0x01, 0x00, 0x65, 0x20, 0x01, 0x00, 0x65, -/* 00006100 */ 0x20, 0x01, 0x00, 0x66, 0x20, 0x01, 0x00, 0x66, 0x20, 0x01, 0x00, 0x94, 0x20, 0x01, 0x00, 0x94, -/* 00006110 */ 0x20, 0x01, 0x00, 0xCF, 0x20, 0x01, 0x00, 0xCF, 0x20, 0x01, 0x00, 0xE1, 0x20, 0x01, 0x00, 0xE1, -/* 00006120 */ 0x20, 0x01, 0x00, 0xE2, 0x20, 0x01, 0x00, 0xE2, 0x20, 0x01, 0x00, 0x04, 0x21, 0x01, 0x00, 0x04, -/* 00006130 */ 0x21, 0x01, 0x00, 0x73, 0x21, 0x01, 0x00, 0x73, 0x21, 0x01, 0x00, 0xDA, 0x21, 0x01, 0x00, 0xDA, -/* 00006140 */ 0x21, 0x01, 0x00, 0x3E, 0x22, 0x01, 0x00, 0x3E, 0x22, 0x01, 0x00, 0xBF, 0x22, 0x01, 0x00, 0xBF, -/* 00006150 */ 0x22, 0x01, 0x00, 0x21, 0x23, 0x01, 0x00, 0x21, 0x23, 0x01, 0x00, 0x85, 0x23, 0x01, 0x00, 0x85, -/* 00006160 */ 0x23, 0x01, 0x00, 0xED, 0x23, 0x01, 0x00, 0xED, 0x23, 0x01, 0x00, 0x55, 0x24, 0x01, 0x00, 0x55, -/* 00006170 */ 0x24, 0x01, 0x00, 0xC4, 0x24, 0x01, 0x00, 0xC4, 0x24, 0x01, 0x00, 0xC5, 0x24, 0x01, 0x00, 0xC5, -/* 00006180 */ 0x24, 0x01, 0x00, 0x34, 0x25, 0x01, 0x00, 0x34, 0x25, 0x01, 0x00, 0xAA, 0x25, 0x01, 0x00, 0xAA, -/* 00006190 */ 0x25, 0x01, 0x00, 0xAB, 0x25, 0x01, 0x00, 0xAB, 0x25, 0x01, 0x00, 0x1B, 0x26, 0x01, 0x00, 0x1B, -/* 000061A0 */ 0x26, 0x01, 0x00, 0x1C, 0x26, 0x01, 0x00, 0x1C, 0x26, 0x01, 0x00, 0x6D, 0x26, 0x01, 0x00, 0x6D, -/* 000061B0 */ 0x26, 0x01, 0x00, 0x93, 0x26, 0x01, 0x00, 0x93, 0x26, 0x01, 0x00, 0xB1, 0x26, 0x01, 0x00, 0xB1, -/* 000061C0 */ 0x26, 0x01, 0x00, 0xD1, 0x26, 0x01, 0x00, 0xD1, 0x26, 0x01, 0x00, 0xF3, 0x26, 0x01, 0x00, 0xF3, -/* 000061D0 */ 0x26, 0x01, 0x00, 0x11, 0x27, 0x01, 0x00, 0x11, 0x27, 0x01, 0x00, 0x31, 0x27, 0x01, 0x00, 0x31, -/* 000061E0 */ 0x27, 0x01, 0x00, 0x55, 0x27, 0x01, 0x00, 0x55, 0x27, 0x01, 0x00, 0x79, 0x27, 0x01, 0x00, 0x79, -/* 000061F0 */ 0x27, 0x01, 0x00, 0xA8, 0x27, 0x01, 0x00, 0xA8, 0x27, 0x01, 0x00, 0xC3, 0x27, 0x01, 0x00, 0xC3, -/* 00006200 */ 0x27, 0x01, 0x00, 0xC4, 0x27, 0x01, 0x00, 0xC4, 0x27, 0x01, 0x00, 0xEC, 0x27, 0x01, 0x00, 0xEC, -/* 00006210 */ 0x27, 0x01, 0x00, 0x2D, 0x28, 0x01, 0x00, 0x2D, 0x28, 0x01, 0x00, 0xA0, 0x28, 0x01, 0x00, 0xA0, -/* 00006220 */ 0x28, 0x01, 0x00, 0xA1, 0x28, 0x01, 0x00, 0xA1, 0x28, 0x01, 0x00, 0xC7, 0x28, 0x01, 0x00, 0xC7, -/* 00006230 */ 0x28, 0x01, 0x00, 0xFB, 0x28, 0x01, 0x00, 0xFB, 0x28, 0x01, 0x00, 0x31, 0x29, 0x01, 0x00, 0x31, -/* 00006240 */ 0x29, 0x01, 0x00, 0x76, 0x29, 0x01, 0x00, 0x76, 0x29, 0x01, 0x00, 0x77, 0x29, 0x01, 0x00, 0x77, -/* 00006250 */ 0x29, 0x01, 0x00, 0x99, 0x29, 0x01, 0x00, 0x99, 0x29, 0x01, 0x00, 0xCD, 0x29, 0x01, 0x00, 0xCD, -/* 00006260 */ 0x29, 0x01, 0x00, 0xF9, 0x29, 0x01, 0x00, 0xF9, 0x29, 0x01, 0x00, 0x27, 0x2A, 0x01, 0x00, 0x27, -/* 00006270 */ 0x2A, 0x01, 0x00, 0x57, 0x2A, 0x01, 0x00, 0x57, 0x2A, 0x01, 0x00, 0x83, 0x2A, 0x01, 0x00, 0x83, -/* 00006280 */ 0x2A, 0x01, 0x00, 0xB1, 0x2A, 0x01, 0x00, 0xB1, 0x2A, 0x01, 0x00, 0xE3, 0x2A, 0x01, 0x00, 0xE3, -/* 00006290 */ 0x2A, 0x01, 0x00, 0x15, 0x2B, 0x01, 0x00, 0x15, 0x2B, 0x01, 0x00, 0x53, 0x2B, 0x01, 0x00, 0x53, -/* 000062A0 */ 0x2B, 0x01, 0x00, 0x54, 0x2B, 0x01, 0x00, 0x54, 0x2B, 0x01, 0x00, 0x86, 0x2B, 0x01, 0x00, 0x86, -/* 000062B0 */ 0x2B, 0x01, 0x00, 0xC6, 0x2B, 0x01, 0x00, 0xC6, 0x2B, 0x01, 0x00, 0x04, 0x2C, 0x01, 0x00, 0x04, -/* 000062C0 */ 0x2C, 0x01, 0x00, 0x05, 0x2C, 0x01, 0x00, 0x05, 0x2C, 0x01, 0x00, 0x47, 0x2C, 0x01, 0x00, 0x47, -/* 000062D0 */ 0x2C, 0x01, 0x00, 0x48, 0x2C, 0x01, 0x00, 0x48, 0x2C, 0x01, 0x00, 0x5B, 0x2C, 0x01, 0x00, 0x5B, -/* 000062E0 */ 0x2C, 0x01, 0x00, 0x74, 0x2C, 0x01, 0x00, 0x74, 0x2C, 0x01, 0x00, 0xC9, 0x2C, 0x01, 0x00, 0xC9, -/* 000062F0 */ 0x2C, 0x01, 0x00, 0x40, 0x2D, 0x01, 0x00, 0x40, 0x2D, 0x01, 0x00, 0xE2, 0x2D, 0x01, 0x00, 0xE2, -/* 00006300 */ 0x2D, 0x01, 0x00, 0x86, 0x2E, 0x01, 0x00, 0x86, 0x2E, 0x01, 0x00, 0xEB, 0x2E, 0x01, 0x00, 0xEB, -/* 00006310 */ 0x2E, 0x01, 0x00, 0xFF, 0x2E, 0x01, 0x00, 0xFF, 0x2E, 0x01, 0x00, 0x28, 0x2F, 0x01, 0x00, 0x28, -/* 00006320 */ 0x2F, 0x01, 0x00, 0x29, 0x2F, 0x01, 0x00, 0x29, 0x2F, 0x01, 0x00, 0x3F, 0x2F, 0x01, 0x00, 0x3F, -/* 00006330 */ 0x2F, 0x01, 0x00, 0x8E, 0x2F, 0x01, 0x00, 0x8E, 0x2F, 0x01, 0x00, 0xCF, 0x2F, 0x01, 0x00, 0xCF, -/* 00006340 */ 0x2F, 0x01, 0x00, 0xED, 0x2F, 0x01, 0x00, 0xED, 0x2F, 0x01, 0x00, 0x17, 0x30, 0x01, 0x00, 0x17, -/* 00006350 */ 0x30, 0x01, 0x00, 0x41, 0x30, 0x01, 0x00, 0x41, 0x30, 0x01, 0x00, 0x42, 0x30, 0x01, 0x00, 0x42, -/* 00006360 */ 0x30, 0x01, 0x00, 0xB0, 0x30, 0x01, 0x00, 0xB0, 0x30, 0x01, 0x00, 0x06, 0x31, 0x01, 0x00, 0x06, -/* 00006370 */ 0x31, 0x01, 0x00, 0x5A, 0x31, 0x01, 0x00, 0x5A, 0x31, 0x01, 0x00, 0xC4, 0x31, 0x01, 0x00, 0xC4, -/* 00006380 */ 0x31, 0x01, 0x00, 0xEC, 0x31, 0x01, 0x00, 0xEC, 0x31, 0x01, 0x00, 0xFE, 0x31, 0x01, 0x00, 0xFE, -/* 00006390 */ 0x31, 0x01, 0x00, 0xFF, 0x31, 0x01, 0x00, 0xFF, 0x31, 0x01, 0x00, 0x23, 0x32, 0x01, 0x00, 0x23, -/* 000063A0 */ 0x32, 0x01, 0x00, 0x55, 0x32, 0x01, 0x00, 0x55, 0x32, 0x01, 0x00, 0xD5, 0x32, 0x01, 0x00, 0xD5, -/* 000063B0 */ 0x32, 0x01, 0x00, 0xE7, 0x32, 0x01, 0x00, 0xE7, 0x32, 0x01, 0x00, 0xE8, 0x32, 0x01, 0x00, 0xE8, -/* 000063C0 */ 0x32, 0x01, 0x00, 0xFE, 0x32, 0x01, 0x00, 0xFE, 0x32, 0x01, 0x00, 0x33, 0x33, 0x01, 0x00, 0x33, -/* 000063D0 */ 0x33, 0x01, 0x00, 0x73, 0x33, 0x01, 0x00, 0x73, 0x33, 0x01, 0x00, 0x91, 0x33, 0x01, 0x00, 0x91, -/* 000063E0 */ 0x33, 0x01, 0x00, 0xBB, 0x33, 0x01, 0x00, 0xBB, 0x33, 0x01, 0x00, 0xE5, 0x33, 0x01, 0x00, 0xE5, -/* 000063F0 */ 0x33, 0x01, 0x00, 0xE6, 0x33, 0x01, 0x00, 0xE6, 0x33, 0x01, 0x00, 0x48, 0x34, 0x01, 0x00, 0x48, -/* 00006400 */ 0x34, 0x01, 0x00, 0xCD, 0x34, 0x01, 0x00, 0xCD, 0x34, 0x01, 0x00, 0x32, 0x35, 0x01, 0x00, 0x32, -/* 00006410 */ 0x35, 0x01, 0x00, 0x6D, 0x35, 0x01, 0x00, 0x6D, 0x35, 0x01, 0x00, 0x7F, 0x35, 0x01, 0x00, 0x7F, -/* 00006420 */ 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0xAD, 0x35, 0x01, 0x00, 0xAD, -/* 00006430 */ 0x35, 0x01, 0x00, 0x12, 0x36, 0x01, 0x00, 0x12, 0x36, 0x01, 0x00, 0x13, 0x36, 0x01, 0x00, 0x13, -/* 00006440 */ 0x36, 0x01, 0x00, 0x95, 0x36, 0x01, 0x00, 0x95, 0x36, 0x01, 0x00, 0xD0, 0x36, 0x01, 0x00, 0xD0, -/* 00006450 */ 0x36, 0x01, 0x00, 0x2F, 0x37, 0x01, 0x00, 0x2F, 0x37, 0x01, 0x00, 0x41, 0x37, 0x01, 0x00, 0x41, -/* 00006460 */ 0x37, 0x01, 0x00, 0x84, 0x37, 0x01, 0x00, 0x84, 0x37, 0x01, 0x00, 0x92, 0x37, 0x01, 0x00, 0x92, -/* 00006470 */ 0x37, 0x01, 0x00, 0x93, 0x37, 0x01, 0x00, 0x93, 0x37, 0x01, 0x00, 0x01, 0x38, 0x01, 0x00, 0x01, -/* 00006480 */ 0x38, 0x01, 0x00, 0x4C, 0x38, 0x01, 0x00, 0x4C, 0x38, 0x01, 0x00, 0xA9, 0x38, 0x01, 0x00, 0xA9, -/* 00006490 */ 0x38, 0x01, 0x00, 0xBB, 0x38, 0x01, 0x00, 0xBB, 0x38, 0x01, 0x00, 0x0E, 0x39, 0x01, 0x00, 0x0E, -/* 000064A0 */ 0x39, 0x01, 0x00, 0x46, 0x39, 0x01, 0x00, 0x46, 0x39, 0x01, 0x00, 0x71, 0x39, 0x01, 0x00, 0x71, -/* 000064B0 */ 0x39, 0x01, 0x00, 0x83, 0x39, 0x01, 0x00, 0x83, 0x39, 0x01, 0x00, 0xBD, 0x39, 0x01, 0x00, 0xBD, -/* 000064C0 */ 0x39, 0x01, 0x00, 0x31, 0x3A, 0x01, 0x00, 0x31, 0x3A, 0x01, 0x00, 0x8F, 0x3A, 0x01, 0x00, 0x8F, -/* 000064D0 */ 0x3A, 0x01, 0x00, 0xA3, 0x3A, 0x01, 0x00, 0xA3, 0x3A, 0x01, 0x00, 0xA4, 0x3A, 0x01, 0x00, 0xA4, -/* 000064E0 */ 0x3A, 0x01, 0x00, 0x16, 0x3B, 0x01, 0x00, 0x16, 0x3B, 0x01, 0x00, 0x61, 0x3B, 0x01, 0x00, 0x61, -/* 000064F0 */ 0x3B, 0x01, 0x00, 0xC2, 0x3B, 0x01, 0x00, 0xC2, 0x3B, 0x01, 0x00, 0xD4, 0x3B, 0x01, 0x00, 0xD4, -/* 00006500 */ 0x3B, 0x01, 0x00, 0x27, 0x3C, 0x01, 0x00, 0x27, 0x3C, 0x01, 0x00, 0x5F, 0x3C, 0x01, 0x00, 0x5F, -/* 00006510 */ 0x3C, 0x01, 0x00, 0x8A, 0x3C, 0x01, 0x00, 0x8A, 0x3C, 0x01, 0x00, 0x9C, 0x3C, 0x01, 0x00, 0x9C, -/* 00006520 */ 0x3C, 0x01, 0x00, 0xD6, 0x3C, 0x01, 0x00, 0xD6, 0x3C, 0x01, 0x00, 0x4C, 0x3D, 0x01, 0x00, 0x4C, -/* 00006530 */ 0x3D, 0x01, 0x00, 0xAA, 0x3D, 0x01, 0x00, 0xAA, 0x3D, 0x01, 0x00, 0xBE, 0x3D, 0x01, 0x00, 0xBE, -/* 00006540 */ 0x3D, 0x01, 0x00, 0xBF, 0x3D, 0x01, 0x00, 0xBF, 0x3D, 0x01, 0x00, 0x31, 0x3E, 0x01, 0x00, 0x31, -/* 00006550 */ 0x3E, 0x01, 0x00, 0x7C, 0x3E, 0x01, 0x00, 0x7C, 0x3E, 0x01, 0x00, 0xDD, 0x3E, 0x01, 0x00, 0xDD, -/* 00006560 */ 0x3E, 0x01, 0x00, 0xEF, 0x3E, 0x01, 0x00, 0xEF, 0x3E, 0x01, 0x00, 0x42, 0x3F, 0x01, 0x00, 0x42, -/* 00006570 */ 0x3F, 0x01, 0x00, 0x7A, 0x3F, 0x01, 0x00, 0x7A, 0x3F, 0x01, 0x00, 0xA5, 0x3F, 0x01, 0x00, 0xA5, -/* 00006580 */ 0x3F, 0x01, 0x00, 0xB7, 0x3F, 0x01, 0x00, 0xB7, 0x3F, 0x01, 0x00, 0xF1, 0x3F, 0x01, 0x00, 0xF1, -/* 00006590 */ 0x3F, 0x01, 0x00, 0x67, 0x40, 0x01, 0x00, 0x67, 0x40, 0x01, 0x00, 0xC5, 0x40, 0x01, 0x00, 0xC5, -/* 000065A0 */ 0x40, 0x01, 0x00, 0xD9, 0x40, 0x01, 0x00, 0xD9, 0x40, 0x01, 0x00, 0xDA, 0x40, 0x01, 0x00, 0xDA, -/* 000065B0 */ 0x40, 0x01, 0x00, 0x01, 0x41, 0x01, 0x00, 0x01, 0x41, 0x01, 0x00, 0x2D, 0x41, 0x01, 0x00, 0x2D, -/* 000065C0 */ 0x41, 0x01, 0x00, 0x93, 0x41, 0x01, 0x00, 0x93, 0x41, 0x01, 0x00, 0x0A, 0x42, 0x01, 0x00, 0x0A, -/* 000065D0 */ 0x42, 0x01, 0x00, 0x7C, 0x42, 0x01, 0x00, 0x7C, 0x42, 0x01, 0x00, 0xA9, 0x42, 0x01, 0x00, 0xA9, -/* 000065E0 */ 0x42, 0x01, 0x00, 0xD6, 0x42, 0x01, 0x00, 0xD6, 0x42, 0x01, 0x00, 0x1D, 0x43, 0x01, 0x00, 0x1D, -/* 000065F0 */ 0x43, 0x01, 0x00, 0x64, 0x43, 0x01, 0x00, 0x64, 0x43, 0x01, 0x00, 0x65, 0x43, 0x01, 0x00, 0x65, -/* 00006600 */ 0x43, 0x01, 0x00, 0xA4, 0x43, 0x01, 0x00, 0xA4, 0x43, 0x01, 0x00, 0xE9, 0x43, 0x01, 0x00, 0xE9, -/* 00006610 */ 0x43, 0x01, 0x00, 0xFF, 0x43, 0x01, 0x00, 0xFF, 0x43, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, -/* 00006620 */ 0x44, 0x01, 0x00, 0x37, 0x44, 0x01, 0x00, 0x37, 0x44, 0x01, 0x00, 0x6B, 0x44, 0x01, 0x00, 0x6B, -/* 00006630 */ 0x44, 0x01, 0x00, 0xBA, 0x44, 0x01, 0x00, 0xBA, 0x44, 0x01, 0x00, 0xD0, 0x44, 0x01, 0x00, 0xD0, -/* 00006640 */ 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0x0C, 0x45, 0x01, 0x00, 0x0C, -/* 00006650 */ 0x45, 0x01, 0x00, 0x52, 0x45, 0x01, 0x00, 0x52, 0x45, 0x01, 0x00, 0x53, 0x45, 0x01, 0x00, 0x53, -/* 00006660 */ 0x45, 0x01, 0x00, 0x89, 0x45, 0x01, 0x00, 0x89, 0x45, 0x01, 0x00, 0xC8, 0x45, 0x01, 0x00, 0xC8, -/* 00006670 */ 0x45, 0x01, 0x00, 0x0D, 0x46, 0x01, 0x00, 0x0D, 0x46, 0x01, 0x00, 0x23, 0x46, 0x01, 0x00, 0x23, -/* 00006680 */ 0x46, 0x01, 0x00, 0x24, 0x46, 0x01, 0x00, 0x24, 0x46, 0x01, 0x00, 0x72, 0x46, 0x01, 0x00, 0x72, -/* 00006690 */ 0x46, 0x01, 0x00, 0x73, 0x46, 0x01, 0x00, 0x73, 0x46, 0x01, 0x00, 0xD9, 0x46, 0x01, 0x00, 0xD9, -/* 000066A0 */ 0x46, 0x01, 0x00, 0x15, 0x47, 0x01, 0x00, 0x15, 0x47, 0x01, 0x00, 0x16, 0x47, 0x01, 0x00, 0x16, -/* 000066B0 */ 0x47, 0x01, 0x00, 0x36, 0x47, 0x01, 0x00, 0x36, 0x47, 0x01, 0x00, 0x48, 0x47, 0x01, 0x00, 0x48, -/* 000066C0 */ 0x47, 0x01, 0x00, 0x92, 0x47, 0x01, 0x00, 0x92, 0x47, 0x01, 0x00, 0x93, 0x47, 0x01, 0x00, 0x93, -/* 000066D0 */ 0x47, 0x01, 0x00, 0xB7, 0x47, 0x01, 0x00, 0xB7, 0x47, 0x01, 0x00, 0xEB, 0x47, 0x01, 0x00, 0xEB, -/* 000066E0 */ 0x47, 0x01, 0x00, 0x58, 0x48, 0x01, 0x00, 0x58, 0x48, 0x01, 0x00, 0x6E, 0x48, 0x01, 0x00, 0x6E, -/* 000066F0 */ 0x48, 0x01, 0x00, 0xB5, 0x48, 0x01, 0x00, 0xB5, 0x48, 0x01, 0x00, 0x18, 0x49, 0x01, 0x00, 0x18, -/* 00006700 */ 0x49, 0x01, 0x00, 0x85, 0x49, 0x01, 0x00, 0x85, 0x49, 0x01, 0x00, 0x9B, 0x49, 0x01, 0x00, 0x9B, -/* 00006710 */ 0x49, 0x01, 0x00, 0x9C, 0x49, 0x01, 0x00, 0x9C, 0x49, 0x01, 0x00, 0xCD, 0x49, 0x01, 0x00, 0xCD, -/* 00006720 */ 0x49, 0x01, 0x00, 0x1B, 0x4A, 0x01, 0x00, 0x1B, 0x4A, 0x01, 0x00, 0x54, 0x4A, 0x01, 0x00, 0x54, -/* 00006730 */ 0x4A, 0x01, 0x00, 0x6E, 0x4A, 0x01, 0x00, 0x6E, 0x4A, 0x01, 0x00, 0xDD, 0x4A, 0x01, 0x00, 0xDD, -/* 00006740 */ 0x4A, 0x01, 0x00, 0xF3, 0x4A, 0x01, 0x00, 0xF3, 0x4A, 0x01, 0x00, 0xF4, 0x4A, 0x01, 0x00, 0xF4, -/* 00006750 */ 0x4A, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x5B, 0x4B, 0x01, 0x00, 0x5B, -/* 00006760 */ 0x4B, 0x01, 0x00, 0xAE, 0x4B, 0x01, 0x00, 0xAE, 0x4B, 0x01, 0x00, 0xAF, 0x4B, 0x01, 0x00, 0xAF, -/* 00006770 */ 0x4B, 0x01, 0x00, 0xF6, 0x4B, 0x01, 0x00, 0xF6, 0x4B, 0x01, 0x00, 0xF7, 0x4B, 0x01, 0x00, 0xF7, -/* 00006780 */ 0x4B, 0x01, 0x00, 0x94, 0x4C, 0x01, 0x00, 0x94, 0x4C, 0x01, 0x00, 0xDE, 0x4C, 0x01, 0x00, 0xDE, -/* 00006790 */ 0x4C, 0x01, 0x00, 0x7F, 0x4D, 0x01, 0x00, 0x7F, 0x4D, 0x01, 0x00, 0x80, 0x4D, 0x01, 0x00, 0x80, -/* 000067A0 */ 0x4D, 0x01, 0x00, 0xCB, 0x4D, 0x01, 0x00, 0xCB, 0x4D, 0x01, 0x00, 0x12, 0x4E, 0x01, 0x00, 0x12, -/* 000067B0 */ 0x4E, 0x01, 0x00, 0x4A, 0x4E, 0x01, 0x00, 0x4A, 0x4E, 0x01, 0x00, 0xBB, 0x4E, 0x01, 0x00, 0xBB, -/* 000067C0 */ 0x4E, 0x01, 0x00, 0xD5, 0x4E, 0x01, 0x00, 0xD5, 0x4E, 0x01, 0x00, 0xD6, 0x4E, 0x01, 0x00, 0xD6, -/* 000067D0 */ 0x4E, 0x01, 0x00, 0x21, 0x4F, 0x01, 0x00, 0x21, 0x4F, 0x01, 0x00, 0x88, 0x4F, 0x01, 0x00, 0x88, -/* 000067E0 */ 0x4F, 0x01, 0x00, 0xF9, 0x4F, 0x01, 0x00, 0xF9, 0x4F, 0x01, 0x00, 0x13, 0x50, 0x01, 0x00, 0x13, -/* 000067F0 */ 0x50, 0x01, 0x00, 0x14, 0x50, 0x01, 0x00, 0x14, 0x50, 0x01, 0x00, 0x4F, 0x50, 0x01, 0x00, 0x4F, -/* 00006800 */ 0x50, 0x01, 0x00, 0x8D, 0x50, 0x01, 0x00, 0x8D, 0x50, 0x01, 0x00, 0xA1, 0x50, 0x01, 0x00, 0xA1, -/* 00006810 */ 0x50, 0x01, 0x00, 0xA2, 0x50, 0x01, 0x00, 0xA2, 0x50, 0x01, 0x00, 0xF6, 0x50, 0x01, 0x00, 0xF6, -/* 00006820 */ 0x50, 0x01, 0x00, 0x2E, 0x51, 0x01, 0x00, 0x2E, 0x51, 0x01, 0x00, 0x66, 0x51, 0x01, 0x00, 0x66, -/* 00006830 */ 0x51, 0x01, 0x00, 0xE0, 0x51, 0x01, 0x00, 0xE0, 0x51, 0x01, 0x00, 0xFA, 0x51, 0x01, 0x00, 0xFA, -/* 00006840 */ 0x51, 0x01, 0x00, 0x45, 0x52, 0x01, 0x00, 0x45, 0x52, 0x01, 0x00, 0xAC, 0x52, 0x01, 0x00, 0xAC, -/* 00006850 */ 0x52, 0x01, 0x00, 0x26, 0x53, 0x01, 0x00, 0x26, 0x53, 0x01, 0x00, 0x40, 0x53, 0x01, 0x00, 0x40, -/* 00006860 */ 0x53, 0x01, 0x00, 0x72, 0x53, 0x01, 0x00, 0x72, 0x53, 0x01, 0x00, 0xAD, 0x53, 0x01, 0x00, 0xAD, -/* 00006870 */ 0x53, 0x01, 0x00, 0x04, 0x54, 0x01, 0x00, 0x04, 0x54, 0x01, 0x00, 0x69, 0x54, 0x01, 0x00, 0x69, -/* 00006880 */ 0x54, 0x01, 0x00, 0xA8, 0x54, 0x01, 0x00, 0xA8, 0x54, 0x01, 0x00, 0xE3, 0x54, 0x01, 0x00, 0xE3, -/* 00006890 */ 0x54, 0x01, 0x00, 0x20, 0x55, 0x01, 0x00, 0x20, 0x55, 0x01, 0x00, 0x55, 0x55, 0x01, 0x00, 0x55, -/* 000068A0 */ 0x55, 0x01, 0x00, 0x8C, 0x55, 0x01, 0x00, 0x8C, 0x55, 0x01, 0x00, 0xC5, 0x55, 0x01, 0x00, 0xC5, -/* 000068B0 */ 0x55, 0x01, 0x00, 0xFA, 0x55, 0x01, 0x00, 0xFA, 0x55, 0x01, 0x00, 0x31, 0x56, 0x01, 0x00, 0x31, -/* 000068C0 */ 0x56, 0x01, 0x00, 0x6C, 0x56, 0x01, 0x00, 0x6C, 0x56, 0x01, 0x00, 0xA7, 0x56, 0x01, 0x00, 0xA7, -/* 000068D0 */ 0x56, 0x01, 0x00, 0xED, 0x56, 0x01, 0x00, 0xED, 0x56, 0x01, 0x00, 0x0E, 0x57, 0x01, 0x00, 0x0E, -/* 000068E0 */ 0x57, 0x01, 0x00, 0x4C, 0x57, 0x01, 0x00, 0x4C, 0x57, 0x01, 0x00, 0xBE, 0x57, 0x01, 0x00, 0xBE, -/* 000068F0 */ 0x57, 0x01, 0x00, 0x60, 0x58, 0x01, 0x00, 0x60, 0x58, 0x01, 0x00, 0x9C, 0x58, 0x01, 0x00, 0x9C, -/* 00006900 */ 0x58, 0x01, 0x00, 0xBA, 0x58, 0x01, 0x00, 0xBA, 0x58, 0x01, 0x00, 0xE4, 0x58, 0x01, 0x00, 0xE4, -/* 00006910 */ 0x58, 0x01, 0x00, 0x2C, 0x59, 0x01, 0x00, 0x2C, 0x59, 0x01, 0x00, 0x79, 0x59, 0x01, 0x00, 0x79, -/* 00006920 */ 0x59, 0x01, 0x00, 0x8D, 0x59, 0x01, 0x00, 0x8D, 0x59, 0x01, 0x00, 0x8E, 0x59, 0x01, 0x00, 0x8E, -/* 00006930 */ 0x59, 0x01, 0x00, 0x2C, 0x5A, 0x01, 0x00, 0x2C, 0x5A, 0x01, 0x00, 0x2D, 0x5A, 0x01, 0x00, 0x2D, -/* 00006940 */ 0x5A, 0x01, 0x00, 0x54, 0x5A, 0x01, 0x00, 0x54, 0x5A, 0x01, 0x00, 0x62, 0x5A, 0x01, 0x00, 0x62, -/* 00006950 */ 0x5A, 0x01, 0x00, 0x6C, 0x5A, 0x01, 0x00, 0x6C, 0x5A, 0x01, 0x00, 0xBD, 0x5A, 0x01, 0x00, 0xBD, -/* 00006960 */ 0x5A, 0x01, 0x00, 0xD7, 0x5A, 0x01, 0x00, 0xD7, 0x5A, 0x01, 0x00, 0xE1, 0x5A, 0x01, 0x00, 0xE1, -/* 00006970 */ 0x5A, 0x01, 0x00, 0xE2, 0x5A, 0x01, 0x00, 0xE2, 0x5A, 0x01, 0x00, 0x13, 0x5B, 0x01, 0x00, 0x13, -/* 00006980 */ 0x5B, 0x01, 0x00, 0x32, 0x5B, 0x01, 0x00, 0x32, 0x5B, 0x01, 0x00, 0xC8, 0x5B, 0x01, 0x00, 0xC8, -/* 00006990 */ 0x5B, 0x01, 0x00, 0x5E, 0x5C, 0x01, 0x00, 0x5E, 0x5C, 0x01, 0x00, 0xF4, 0x5C, 0x01, 0x00, 0xF4, -/* 000069A0 */ 0x5C, 0x01, 0x00, 0x8A, 0x5D, 0x01, 0x00, 0x8A, 0x5D, 0x01, 0x00, 0x90, 0x5D, 0x01, 0x00, 0x90, -/* 000069B0 */ 0x5D, 0x01, 0x00, 0x94, 0x5D, 0x01, 0x00, 0x94, 0x5D, 0x01, 0x00, 0x50, 0xB9, 0xDC, 0x00, 0x00, -/* 000069C0 */ 0x00, 0xFC, 0x09, 0xFE, 0xD7, 0x02, 0xFF, 0xA8, 0x41, 0xC0, 0x00, 0x00, 0x00, 0xFE, 0x70, 0x01, -/* 000069D0 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFF, 0x24, 0x5C, 0x01, 0x00, 0xFF, 0x24, -/* 000069E0 */ 0x5C, 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000069F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xD8, 0x02, 0x07, -/* 00006A10 */ 0x0C, 0xA8, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 00006A20 */ 0x00, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6A, 0x00, 0x00, 0xBF, 0xFD, 0x20, 0x04, 0x4F, -/* 00006A30 */ 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x01, 0x00, -/* 00006A40 */ 0xFE, 0x90, 0x01, 0x22, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x90, 0x01, 0xFF, 0x01, -/* 00006A50 */ 0x5C, 0x01, 0x00, 0xFF, 0x01, 0x5C, 0x01, 0x00, 0x40, 0x4B, 0x18, 0x30, 0x44, 0x09, 0xFE, 0x3A, -/* 00006A60 */ 0x02, 0xFE, 0x34, 0x02, 0x26, 0x0F, 0x44, 0x43, 0x44, 0x44, 0x14, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A70 */ 0xFF, 0x42, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A80 */ 0xFF, 0xFF, 0x00, 0x00, 0x08, 0x02, 0x01, 0xFE, 0xD9, 0x02, 0x02, 0x01, 0xFE, 0xDA, 0x02, 0x02, -/* 00006A90 */ 0x01, 0xFE, 0xDB, 0x02, 0x02, 0x01, 0xFE, 0xDC, 0x02, 0x02, 0x01, 0xFE, 0xDD, 0x02, 0x03, 0x04, -/* 00006AA0 */ 0x02, 0x01, 0xFE, 0xDE, 0x02, 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x02, 0x00, 0xFE, 0xE0, 0x02, 0x02, -/* 00006AB0 */ 0x00, 0xFE, 0xE1, 0x02, 0x02, 0x00, 0xFE, 0xE2, 0x02, 0x02, 0x00, 0xFE, 0xE3, 0x02, 0x02, 0x01, -/* 00006AC0 */ 0xFE, 0xE4, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x00, 0xFE, -/* 00006AD0 */ 0xE7, 0x02, 0x02, 0x01, 0xFE, 0xE8, 0x02, 0x02, 0x01, 0xFE, 0xE9, 0x02, 0x02, 0x00, 0xFE, 0xEA, -/* 00006AE0 */ 0x02, 0x02, 0x01, 0xFE, 0xEB, 0x02, 0x02, 0x01, 0xFE, 0xEC, 0x02, 0x02, 0x01, 0xFE, 0xED, 0x02, -/* 00006AF0 */ 0x02, 0x00, 0xFE, 0xEE, 0x02, 0x02, 0x01, 0xFE, 0xEF, 0x02, 0x02, 0x01, 0xFE, 0xF0, 0x02, 0x02, -/* 00006B00 */ 0x00, 0xFE, 0xF1, 0x02, 0x02, 0x01, 0xFE, 0xF2, 0x02, 0x02, 0x01, 0xFE, 0xF3, 0x02, 0x02, 0x00, -/* 00006B10 */ 0xFE, 0xF4, 0x02, 0x02, 0x01, 0xFE, 0xF5, 0x02, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x01, 0xFE, -/* 00006B20 */ 0xF7, 0x02, 0x02, 0x01, 0xFE, 0xF8, 0x02, 0x02, 0x01, 0xFE, 0xF9, 0x02, 0x02, 0x01, 0xFE, 0xFA, -/* 00006B30 */ 0x02, 0x02, 0x01, 0xFE, 0xFB, 0x02, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xFD, 0x02, -/* 00006B40 */ 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, -/* 00006B50 */ 0x02, 0x01, 0xFE, 0x01, 0x03, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xFE, 0x91, 0x0B, 0x96, 0x38, 0x00, -/* 00006B60 */ 0x00, 0x00, 0x31, 0xD4, 0x0F, 0x00, 0x00, 0x00, 0x32, 0x96, 0x02, 0x00, 0x00, 0x00, 0x32, 0xD4, -/* 00006B70 */ 0x10, 0x00, 0x00, 0x00, 0x33, 0x96, 0x03, 0x00, 0x00, 0x00, 0x33, 0xD4, 0x11, 0x00, 0x00, 0x00, -/* 00006B80 */ 0x34, 0x96, 0x04, 0x00, 0x00, 0x00, 0x34, 0xD4, 0x12, 0x00, 0x00, 0x00, 0x35, 0x96, 0x05, 0x00, -/* 00006B90 */ 0x00, 0x00, 0x35, 0xD4, 0x13, 0x00, 0x00, 0x00, 0x36, 0x96, 0x06, 0x00, 0x00, 0x00, 0x36, 0xD4, -/* 00006BA0 */ 0x14, 0x00, 0x00, 0x00, 0x37, 0x96, 0x07, 0x00, 0x00, 0x00, 0x37, 0xD4, 0x15, 0x00, 0x00, 0x00, -/* 00006BB0 */ 0x38, 0x96, 0x08, 0x00, 0x00, 0x00, 0x38, 0x4F, 0x39, 0x4F, 0x3C, 0x4F, 0x3D, 0x4F, 0x44, 0x96, -/* 00006BC0 */ 0x39, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3A, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006BD0 */ 0x3B, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3C, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006BE0 */ 0x3D, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3E, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006BF0 */ 0x3F, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x40, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C00 */ 0x41, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x42, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C10 */ 0x43, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x44, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C20 */ 0x45, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x46, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C30 */ 0x47, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x48, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C40 */ 0x49, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4A, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, -/* 00006C50 */ 0x4B, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4C, 0x00, 0x00, 0x00, 0x44, 0x62, 0x44, 0x30, -/* 00006C60 */ 0x00, 0x96, 0x09, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x77, -/* 00006C70 */ 0x02, 0x44, 0x01, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x02, 0xA8, -/* 00006C80 */ 0x45, 0x14, 0x03, 0x00, 0x44, 0x45, 0x09, 0x25, 0x00, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, -/* 00006C90 */ 0x00, 0x93, 0x09, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x62, 0x45, 0x45, 0x03, 0x07, 0x01, 0x00, -/* 00006CA0 */ 0xC4, 0x01, 0x45, 0x45, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x45, 0x44, 0x04, 0x93, 0x09, -/* 00006CB0 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x05, 0xA8, 0x45, 0x14, 0x03, 0x00, 0x44, -/* 00006CC0 */ 0x45, 0x09, 0x25, 0x00, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, -/* 00006CD0 */ 0x00, 0x45, 0x00, 0x00, 0x62, 0x45, 0x45, 0x03, 0x07, 0x01, 0x00, 0xC4, 0x01, 0x45, 0x45, 0x03, -/* 00006CE0 */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0x45, 0x44, 0x06, 0x93, 0x09, 0x00, 0x00, 0x00, 0x45, 0x00, -/* 00006CF0 */ 0x00, 0x62, 0x45, 0x45, 0x07, 0xAC, 0x44, 0x0F, 0x02, 0x00, 0x45, 0xAB, 0x44, 0x96, 0x39, 0x00, -/* 00006D00 */ 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x08, 0x47, -/* 00006D10 */ 0x39, 0x44, 0x96, 0x3A, 0x00, 0x00, 0x00, 0x03, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, -/* 00006D20 */ 0x62, 0x44, 0x44, 0x09, 0x96, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, -/* 00006D30 */ 0x00, 0x00, 0x62, 0x44, 0x44, 0x0A, 0x96, 0x0B, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, -/* 00006D40 */ 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0B, 0x96, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, -/* 00006D50 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0C, 0x96, 0x0D, 0x00, 0x00, 0x00, 0x44, -/* 00006D60 */ 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0D, 0x96, 0x0E, 0x00, 0x00, -/* 00006D70 */ 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0E, 0x96, 0x0F, -/* 00006D80 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x0F, -/* 00006D90 */ 0x96, 0x10, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, -/* 00006DA0 */ 0x44, 0x10, 0x96, 0x11, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, -/* 00006DB0 */ 0x62, 0x44, 0x44, 0x11, 0x96, 0x12, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, -/* 00006DC0 */ 0x00, 0x00, 0x62, 0x44, 0x44, 0x12, 0x96, 0x13, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, -/* 00006DD0 */ 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x13, 0x47, 0x3A, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, -/* 00006DE0 */ 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x14, 0x96, 0x14, 0x00, 0x00, 0x00, 0x44, 0x93, 0x0A, 0x00, -/* 00006DF0 */ 0x00, 0x00, 0x44, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, -/* 00006E00 */ 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, -/* 00006E10 */ 0x62, 0x46, 0x46, 0x15, 0x7B, 0x46, 0x45, 0x16, 0x93, 0x09, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, -/* 00006E20 */ 0x62, 0x46, 0x46, 0x17, 0x7B, 0x46, 0x45, 0x18, 0x93, 0x09, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, -/* 00006E30 */ 0x62, 0x46, 0x46, 0x19, 0x7B, 0x46, 0x45, 0x1A, 0x93, 0x09, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, -/* 00006E40 */ 0x62, 0x46, 0x46, 0x1B, 0x7B, 0x46, 0x45, 0x1C, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x08, 0x02, 0x00, -/* 00006E50 */ 0xEE, 0x03, 0x44, 0x44, 0x02, 0x00, 0x96, 0x15, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, -/* 00006E60 */ 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x1D, 0x96, 0x16, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, -/* 00006E70 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x1E, 0x96, 0x17, 0x00, 0x00, 0x00, 0x44, -/* 00006E80 */ 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x1F, 0x96, 0x18, 0x00, 0x00, -/* 00006E90 */ 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x20, 0x96, 0x19, -/* 00006EA0 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x21, -/* 00006EB0 */ 0x96, 0x1A, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x44, 0x96, 0x1B, 0x00, 0x00, -/* 00006EC0 */ 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x22, 0x96, 0x1C, -/* 00006ED0 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x23, -/* 00006EE0 */ 0x96, 0x1D, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, -/* 00006EF0 */ 0x44, 0x24, 0x96, 0x1E, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, -/* 00006F00 */ 0x62, 0x44, 0x44, 0x25, 0x96, 0x1F, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, -/* 00006F10 */ 0x00, 0x00, 0x62, 0x44, 0x44, 0x26, 0x96, 0x20, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, -/* 00006F20 */ 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x27, 0x96, 0x21, 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, -/* 00006F30 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x28, 0x96, 0x22, 0x00, 0x00, 0x00, 0x44, -/* 00006F40 */ 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x29, 0x96, 0x23, 0x00, 0x00, -/* 00006F50 */ 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x2A, 0x96, 0x24, -/* 00006F60 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x2B, -/* 00006F70 */ 0x96, 0x25, 0x00, 0x00, 0x00, 0x44, 0x93, 0x16, 0x00, 0x00, 0x00, 0x44, 0x02, 0x00, 0x07, 0x02, -/* 00006F80 */ 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x45, 0x5C, 0x01, 0x45, 0xEE, 0x02, 0x44, 0x44, 0x03, 0x00, 0x47, -/* 00006F90 */ 0x3B, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x2C, 0x96, 0x26, -/* 00006FA0 */ 0x00, 0x00, 0x00, 0x44, 0x93, 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x62, 0x44, 0x44, 0x2D, -/* 00006FB0 */ 0x96, 0x27, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x3B, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x01, -/* 00006FC0 */ 0x00, 0x00, 0x00, 0x44, 0x96, 0x3C, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x02, 0x00, 0x00, 0x00, 0x44, -/* 00006FD0 */ 0x96, 0x3D, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x03, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3E, 0x00, 0x00, -/* 00006FE0 */ 0x00, 0x44, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3F, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x05, -/* 00006FF0 */ 0x00, 0x00, 0x00, 0x44, 0x96, 0x28, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x06, 0x00, 0x00, 0x00, 0x44, -/* 00007000 */ 0x96, 0x29, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x07, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2A, 0x00, 0x00, -/* 00007010 */ 0x00, 0x44, 0xD4, 0x08, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2B, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x09, -/* 00007020 */ 0x00, 0x00, 0x00, 0x44, 0x96, 0x2C, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0A, 0x00, 0x00, 0x00, 0x44, -/* 00007030 */ 0x96, 0x2D, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0B, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2E, 0x00, 0x00, -/* 00007040 */ 0x00, 0x44, 0xD4, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2F, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, -/* 00007050 */ 0x96, 0x40, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0D, 0x00, 0x00, 0x00, 0x44, 0x96, 0x30, 0x00, 0x00, -/* 00007060 */ 0x00, 0x44, 0xD4, 0x0E, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, -/* 00007070 */ 0x44, 0x44, 0x04, 0x00, 0x96, 0x31, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x41, 0x00, 0x00, -/* 00007080 */ 0x00, 0x44, 0xA8, 0x44, 0x96, 0x42, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x43, 0x00, 0x00, -/* 00007090 */ 0x00, 0x44, 0xA8, 0x44, 0x96, 0x44, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x16, 0x00, 0x00, 0x00, 0x44, -/* 000070A0 */ 0x96, 0x32, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x17, 0x00, 0x00, 0x00, 0x44, 0x96, 0x33, 0x00, 0x00, -/* 000070B0 */ 0x00, 0x44, 0xD4, 0x18, 0x00, 0x00, 0x00, 0x44, 0x96, 0x34, 0x00, 0x00, 0x00, 0x44, 0x93, 0x0A, -/* 000070C0 */ 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x45, 0x5C, 0x01, -/* 000070D0 */ 0x45, 0x5D, 0x02, 0x08, 0x05, 0x00, 0xEE, 0x03, 0x44, 0x44, 0x05, 0x00, 0x54, 0x3C, 0x44, 0x93, -/* 000070E0 */ 0x09, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x6D, 0x44, 0x45, 0x2E, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 000070F0 */ 0x45, 0x5C, 0x01, 0x3C, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 00007100 */ 0x00, 0x09, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, -/* 00007110 */ 0x0B, 0x47, 0x2F, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x07, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x07, -/* 00007120 */ 0x00, 0x5C, 0x02, 0x46, 0xF2, 0x03, 0xFF, 0x44, 0x2E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x96, 0x45, -/* 00007130 */ 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, -/* 00007140 */ 0x00, 0x09, 0x93, 0x20, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x5C, 0x01, 0x45, 0x93, 0x2A, 0x00, -/* 00007150 */ 0x00, 0x00, 0x45, 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x45, 0x00, 0x00, 0x00, -/* 00007160 */ 0x46, 0x06, 0x00, 0x5C, 0x01, 0x46, 0xD4, 0x19, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0xEE, -/* 00007170 */ 0x03, 0x45, 0x45, 0x09, 0x00, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0xEE, 0x04, 0x44, 0x44, 0x08, -/* 00007180 */ 0x00, 0x96, 0x46, 0x00, 0x00, 0x00, 0x44, 0x96, 0x47, 0x00, 0x00, 0x00, 0x0D, 0x93, 0x0C, 0x00, -/* 00007190 */ 0x00, 0x00, 0x44, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x00, 0x00, 0x00, -/* 000071A0 */ 0x45, 0x04, 0x00, 0x5C, 0x01, 0x45, 0x93, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x05, 0x00, 0x07, 0x03, -/* 000071B0 */ 0x00, 0x5C, 0x00, 0x09, 0x93, 0x47, 0x00, 0x00, 0x00, 0x46, 0x07, 0x00, 0x5C, 0x01, 0x46, 0xD4, -/* 000071C0 */ 0x1A, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0xEE, 0x03, 0x45, 0x45, 0x0B, 0x00, 0x5C, 0x02, -/* 000071D0 */ 0x45, 0x5C, 0x03, 0x3C, 0xEE, 0x04, 0x44, 0x44, 0x0A, 0x00, 0x96, 0x48, 0x00, 0x00, 0x00, 0x44, -/* 000071E0 */ 0x96, 0x49, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x03, 0x00, 0x07, 0x04, -/* 000071F0 */ 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x5C, 0x01, 0x45, 0x93, -/* 00007200 */ 0x2A, 0x00, 0x00, 0x00, 0x45, 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x49, 0x00, -/* 00007210 */ 0x00, 0x00, 0x46, 0x08, 0x00, 0x5C, 0x01, 0x46, 0xD4, 0x1B, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, -/* 00007220 */ 0x46, 0xEE, 0x03, 0x45, 0x45, 0x0D, 0x00, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0xEE, 0x04, 0x44, -/* 00007230 */ 0x44, 0x0C, 0x00, 0x96, 0x4A, 0x00, 0x00, 0x00, 0x44, 0x96, 0x4B, 0x00, 0x00, 0x00, 0x0F, 0x93, -/* 00007240 */ 0x0C, 0x00, 0x00, 0x00, 0x44, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x00, -/* 00007250 */ 0x00, 0x00, 0x45, 0x04, 0x00, 0x5C, 0x01, 0x45, 0x93, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x05, 0x00, -/* 00007260 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x4B, 0x00, 0x00, 0x00, 0x46, 0x09, 0x00, 0x5C, 0x01, -/* 00007270 */ 0x46, 0xD4, 0x1C, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0xEE, 0x03, 0x45, 0x45, 0x0F, 0x00, -/* 00007280 */ 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0xEE, 0x04, 0x44, 0x44, 0x0E, 0x00, 0x54, 0x3D, 0x44, 0x93, -/* 00007290 */ 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x46, 0x00, -/* 000072A0 */ 0x00, 0x00, 0x45, 0x0B, 0x00, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x10, 0x10, 0x00, 0xCC, 0x24, 0x00, -/* 000072B0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x12, 0x45, 0x30, 0x5C, 0x03, -/* 000072C0 */ 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x10, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, -/* 000072D0 */ 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x48, 0x00, 0x00, 0x00, 0x45, 0x0C, 0x00, 0x5C, 0x01, 0x45, -/* 000072E0 */ 0x5D, 0x02, 0x10, 0x11, 0x00, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x45, 0x00, -/* 000072F0 */ 0x00, 0x00, 0x7B, 0x12, 0x45, 0x30, 0x5C, 0x03, 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x11, 0x00, 0x93, -/* 00007300 */ 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x4A, 0x00, -/* 00007310 */ 0x00, 0x00, 0x45, 0x0D, 0x00, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x10, 0x12, 0x00, 0xCC, 0x3C, 0x00, -/* 00007320 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x12, 0x45, 0x30, 0x5C, 0x03, -/* 00007330 */ 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x12, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, -/* 00007340 */ 0x04, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x3D, 0x5D, 0x02, 0x10, 0x13, 0x00, 0xCC, 0x48, 0x00, -/* 00007350 */ 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x13, 0x45, 0x30, 0x5C, 0x03, -/* 00007360 */ 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x13, 0x00, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x07, -/* 00007370 */ 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x54, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x45, 0x00, -/* 00007380 */ 0x00, 0x00, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, -/* 00007390 */ 0xCC, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x16, 0x47, -/* 000073A0 */ 0x31, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x15, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x15, 0x00, 0x7B, -/* 000073B0 */ 0x46, 0x45, 0x32, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 000073C0 */ 0x09, 0xCC, 0x8C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x16, -/* 000073D0 */ 0x47, 0x31, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x16, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x16, 0x00, -/* 000073E0 */ 0x7B, 0x46, 0x45, 0x33, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 000073F0 */ 0x00, 0x09, 0xCC, 0x98, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, -/* 00007400 */ 0x1A, 0x47, 0x34, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x17, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x17, -/* 00007410 */ 0x00, 0x7B, 0x46, 0x45, 0x35, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, -/* 00007420 */ 0x5C, 0x00, 0x09, 0xCC, 0xA4, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, -/* 00007430 */ 0x7B, 0x1D, 0x47, 0x36, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x18, 0x00, 0xEE, 0x03, 0x46, 0x46, -/* 00007440 */ 0x18, 0x00, 0x7B, 0x46, 0x45, 0x37, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, -/* 00007450 */ 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, -/* 00007460 */ 0x00, 0x7B, 0x20, 0x47, 0x38, 0x7B, 0x1D, 0x47, 0x36, 0x7B, 0x22, 0x47, 0x39, 0x5C, 0x01, 0x47, -/* 00007470 */ 0x5D, 0x02, 0x08, 0x19, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x19, 0x00, 0x7B, 0x46, 0x45, 0x3A, 0x93, -/* 00007480 */ 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xC4, 0x00, -/* 00007490 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x1D, 0x47, 0x36, 0x7B, 0x22, -/* 000074A0 */ 0x47, 0x39, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x1A, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x1A, 0x00, -/* 000074B0 */ 0x7B, 0x46, 0x45, 0x3B, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 000074C0 */ 0x00, 0x09, 0xCC, 0xD4, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, -/* 000074D0 */ 0x1D, 0x47, 0x36, 0x7B, 0x22, 0x47, 0x39, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x1B, 0x00, 0xEE, -/* 000074E0 */ 0x03, 0x46, 0x46, 0x1B, 0x00, 0x7B, 0x46, 0x45, 0x3C, 0x93, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x01, -/* 000074F0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xE4, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, -/* 00007500 */ 0x47, 0x00, 0x00, 0x00, 0x7B, 0x21, 0x47, 0x39, 0x7B, 0x22, 0x47, 0x3D, 0x5C, 0x01, 0x47, 0x5D, -/* 00007510 */ 0x02, 0x08, 0x1C, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x1C, 0x00, 0x7B, 0x46, 0x45, 0x3E, 0x93, 0x0A, -/* 00007520 */ 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xF4, 0x00, 0x00, -/* 00007530 */ 0x00, 0x0F, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x21, 0x47, 0x39, 0x7B, 0x22, 0x47, -/* 00007540 */ 0x3D, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x08, 0x1D, 0x00, 0xEE, 0x03, 0x46, 0x46, 0x1D, 0x00, 0x7B, -/* 00007550 */ 0x46, 0x45, 0x3F, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x08, 0x14, 0x00, 0xEE, 0x03, 0x44, 0x44, 0x14, -/* 00007560 */ 0x00, 0x96, 0x35, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1D, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, -/* 00007570 */ 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x44, 0x44, 0x1E, 0x00, 0x96, 0x36, 0x00, 0x00, 0x00, 0x44, 0xA8, -/* 00007580 */ 0x44, 0x96, 0x4C, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1E, 0x00, 0x00, 0x00, 0x44, 0x96, 0x37, 0x00, -/* 00007590 */ 0x00, 0x00, 0x44, 0xD4, 0x1F, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, -/* 000075A0 */ 0x01, 0x44, 0x44, 0x1F, 0x00, 0x47, 0x3E, 0x44, 0xD4, 0x20, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, -/* 000075B0 */ 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x44, 0x44, 0x20, 0x00, 0x47, 0x3F, 0x44, 0xD4, 0x21, 0x00, -/* 000075C0 */ 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x44, 0x44, 0x21, 0x00, 0x47, -/* 000075D0 */ 0x40, 0x44, 0x93, 0x38, 0x00, 0x00, 0x00, 0x44, 0x0E, 0x00, 0x14, 0x03, 0x00, 0x44, 0x28, 0x09, -/* 000075E0 */ 0x08, 0x01, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, -/* 000075F0 */ 0x6B, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x29, 0x22, 0x00, 0xCC, 0x04, -/* 00007600 */ 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x3E, 0x45, 0x30, 0x7B, -/* 00007610 */ 0x02, 0x45, 0x40, 0x7B, 0x2C, 0x45, 0x41, 0x7B, 0x02, 0x45, 0x42, 0x5C, 0x03, 0x45, 0xEE, 0x04, -/* 00007620 */ 0xFF, 0x44, 0x22, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, -/* 00007630 */ 0x00, 0x09, 0x6B, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x2E, 0x23, 0x00, -/* 00007640 */ 0xCC, 0x1C, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, 0x3F, 0x45, -/* 00007650 */ 0x30, 0x7B, 0x02, 0x45, 0x40, 0x7B, 0x2C, 0x45, 0x41, 0x7B, 0x02, 0x45, 0x42, 0x5C, 0x03, 0x45, -/* 00007660 */ 0xEE, 0x04, 0xFF, 0x44, 0x23, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, 0x07, 0x04, -/* 00007670 */ 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5D, 0x02, 0x2F, -/* 00007680 */ 0x24, 0x00, 0xCC, 0x34, 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7B, -/* 00007690 */ 0x40, 0x45, 0x30, 0x7B, 0x02, 0x45, 0x40, 0x7B, 0x2C, 0x45, 0x41, 0x7B, 0x02, 0x45, 0x42, 0x5C, -/* 000076A0 */ 0x03, 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x24, 0x00, 0x93, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x0A, 0x00, -/* 000076B0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5D, -/* 000076C0 */ 0x02, 0x13, 0x25, 0x00, 0xCC, 0x4C, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, -/* 000076D0 */ 0x00, 0x7B, 0x3D, 0x45, 0x30, 0x7B, 0x02, 0x45, 0x40, 0x7B, 0x2C, 0x45, 0x41, 0x7B, 0x02, 0x45, -/* 000076E0 */ 0x42, 0x5C, 0x03, 0x45, 0xEE, 0x04, 0xFF, 0x44, 0x25, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x14, 0xFE, -/* 000076F0 */ 0x64, 0x01, 0x00, 0x4C, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, -/* 00007700 */ 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x34, -/* 00007710 */ 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, -/* 00007720 */ 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x1C, 0x01, 0x00, 0x00, 0x03, -/* 00007730 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, -/* 00007740 */ 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, -/* 00007750 */ 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, -/* 00007760 */ 0x01, 0x00, 0x00, 0xF4, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, -/* 00007770 */ 0x02, 0x00, 0x00, 0xFA, 0x02, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, -/* 00007780 */ 0x00, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xFA, 0x02, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x03, -/* 00007790 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xC4, -/* 000077A0 */ 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, -/* 000077B0 */ 0x02, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, -/* 000077C0 */ 0x02, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x03, -/* 000077D0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x03, -/* 000077E0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0x02, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x03, -/* 000077F0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x03, -/* 00007800 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x03, -/* 00007810 */ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x02, 0x00, 0x00, 0xEB, 0x02, 0x00, 0x00, 0xEC, -/* 00007820 */ 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0xF7, 0x02, 0x00, 0x00, 0xF8, -/* 00007830 */ 0x02, 0x00, 0x00, 0xF9, 0x02, 0x00, 0x00, 0xFB, 0x02, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, -/* 00007840 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x03, -/* 00007850 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, -/* 00007860 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x03, -/* 00007870 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, -/* 00007880 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 00007890 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1E, -/* 000078A0 */ 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xFE, 0x03, 0x03, 0xFE, 0x04, 0x03, 0xF6, -/* 000078B0 */ 0xFE, 0x04, 0x03, 0xFE, 0x05, 0x03, 0xFE, 0x05, 0x03, 0xFE, 0xAA, 0x02, 0xFE, 0xAA, 0x02, 0xFE, -/* 000078C0 */ 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x38, 0x02, 0x84, 0xFE, 0x32, 0x01, 0xFE, 0x58, 0x01, 0xFE, -/* 000078D0 */ 0x2D, 0x01, 0xFE, 0x7A, 0x01, 0x95, 0xA7, 0xF6, 0xFE, 0x08, 0x02, 0xFE, 0x3A, 0x02, 0x17, 0xFE, -/* 000078E0 */ 0x3B, 0x02, 0x1F, 0xFE, 0x3C, 0x02, 0xFE, 0x1E, 0x01, 0xFE, 0x3D, 0x02, 0x25, 0xFE, 0x3F, 0x02, -/* 000078F0 */ 0xFE, 0x40, 0x02, 0xFE, 0x41, 0x02, 0xFE, 0x42, 0x02, 0xFE, 0x3E, 0x02, 0xFE, 0x46, 0x02, 0xFE, -/* 00007900 */ 0x47, 0x02, 0xFE, 0x48, 0x02, 0xFE, 0x49, 0x02, 0xFE, 0x4A, 0x02, 0xFE, 0x4B, 0x02, 0xFE, 0x4C, -/* 00007910 */ 0x02, 0xFE, 0x4F, 0x02, 0xFE, 0x50, 0x02, 0xFE, 0x51, 0x02, 0xFE, 0x52, 0x02, 0xFE, 0x53, 0x02, -/* 00007920 */ 0xFE, 0x34, 0x02, 0xFE, 0x61, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xE9, 0x02, 0xFE, 0xE8, 0x02, 0xFE, -/* 00007930 */ 0xEB, 0x02, 0xFE, 0xED, 0x02, 0xFE, 0xEC, 0x02, 0xFE, 0xF0, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF3, -/* 00007940 */ 0x02, 0xFE, 0xF5, 0x02, 0xFE, 0xF2, 0x02, 0xFE, 0xF7, 0x02, 0xFE, 0xF8, 0x02, 0xFE, 0xFA, 0x02, -/* 00007950 */ 0xFE, 0xF9, 0x02, 0xFE, 0xFB, 0x02, 0xFE, 0xB3, 0x01, 0xFE, 0xB1, 0x01, 0xFE, 0xB2, 0x01, 0xDB, -/* 00007960 */ 0xFE, 0x06, 0x03, 0xFE, 0x07, 0x03, 0xFE, 0x08, 0x03, 0xFE, 0x09, 0x03, 0xFE, 0x0A, 0x03, 0xFE, -/* 00007970 */ 0x0B, 0x03, 0xFE, 0x0C, 0x03, 0xFE, 0x0D, 0x03, 0xFE, 0x0E, 0x03, 0xFE, 0x0F, 0x03, 0xFE, 0x10, -/* 00007980 */ 0x03, 0x84, 0xFE, 0x32, 0x01, 0xFE, 0x58, 0x01, 0xFE, 0x2D, 0x01, 0xFE, 0x7A, 0x01, 0x95, 0xA7, -/* 00007990 */ 0xFE, 0x11, 0x03, 0xF7, 0xFE, 0x12, 0x03, 0xFE, 0x13, 0x03, 0xFE, 0x14, 0x03, 0xFE, 0x15, 0x03, -/* 000079A0 */ 0xFE, 0x16, 0x03, 0xFE, 0x17, 0x03, 0xFE, 0x18, 0x03, 0xFE, 0x19, 0x03, 0xFE, 0x1A, 0x03, 0xFE, -/* 000079B0 */ 0x1B, 0x03, 0xFE, 0x1C, 0x03, 0xFE, 0x1D, 0x03, 0xFE, 0x1E, 0x03, 0xFE, 0x1F, 0x03, 0xFE, 0x20, -/* 000079C0 */ 0x03, 0xFE, 0x21, 0x03, 0xE0, 0xE3, 0xFE, 0x22, 0x03, 0xFE, 0x23, 0x03, 0xFE, 0x24, 0x03, 0xFE, -/* 000079D0 */ 0x2A, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x25, 0x03, 0xFE, 0x26, 0x03, 0xFE, 0x27, 0x03, 0xFE, 0x28, -/* 000079E0 */ 0x03, 0xFE, 0x29, 0x03, 0xFE, 0x2A, 0x03, 0xFE, 0x2B, 0x03, 0xFE, 0x79, 0x02, 0xFE, 0x2C, 0x03, -/* 000079F0 */ 0xFE, 0x2D, 0x03, 0xFE, 0x2E, 0x03, 0xFE, 0x2F, 0x03, 0xFE, 0x30, 0x03, 0xFE, 0xD9, 0x02, 0xFE, -/* 00007A00 */ 0x31, 0x03, 0xFE, 0x32, 0x03, 0xFE, 0x33, 0x03, 0xFE, 0x34, 0x03, 0xFE, 0x35, 0x03, 0xFE, 0x36, -/* 00007A10 */ 0x03, 0xFE, 0x37, 0x03, 0xFE, 0x38, 0x03, 0xFE, 0x39, 0x03, 0xFE, 0x3A, 0x03, 0xFE, 0x3B, 0x03, -/* 00007A20 */ 0xFE, 0x3C, 0x03, 0xFE, 0x3D, 0x03, 0xFE, 0x3E, 0x03, 0xFE, 0x3F, 0x03, 0xFE, 0x40, 0x03, 0xFE, -/* 00007A30 */ 0x41, 0x03, 0xFE, 0x42, 0x03, 0x00, 0xFE, 0xBB, 0x01, 0x5B, 0x00, 0x01, 0x00, 0x00, 0x0A, 0x00, -/* 00007A40 */ 0xA4, 0x00, 0x0C, 0x00, 0x20, 0x00, 0x16, 0x00, 0x38, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x16, 0x00, -/* 00007A50 */ 0x39, 0x00, 0x25, 0x00, 0xD4, 0x00, 0x1A, 0x00, 0x30, 0x00, 0x0F, 0x00, 0x45, 0x00, 0x06, 0x00, -/* 00007A60 */ 0x35, 0x00, 0x12, 0x00, 0x35, 0x00, 0x12, 0x00, 0x39, 0x00, 0x12, 0x00, 0x42, 0x00, 0x12, 0x00, -/* 00007A70 */ 0x24, 0x00, 0x12, 0x00, 0x22, 0x00, 0x12, 0x00, 0x22, 0x00, 0x12, 0x00, 0x22, 0x00, 0x12, 0x00, -/* 00007A80 */ 0x22, 0x00, 0x12, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x20, 0x00, 0x0F, 0x00, 0x1D, 0x00, 0x12, 0x00, -/* 00007A90 */ 0x2D, 0x00, 0x6F, 0x00, 0xC8, 0x00, 0x12, 0x00, 0x54, 0x00, 0x12, 0x00, 0x50, 0x00, 0x12, 0x00, -/* 00007AA0 */ 0x5E, 0x00, 0x12, 0x00, 0x02, 0x01, 0x12, 0x00, 0x55, 0x00, 0x0C, 0x00, 0x94, 0x00, 0x12, 0x00, -/* 00007AB0 */ 0x4C, 0x00, 0x12, 0x00, 0x4C, 0x00, 0x12, 0x00, 0x46, 0x00, 0x12, 0x00, 0x47, 0x00, 0x12, 0x00, -/* 00007AC0 */ 0x4C, 0x00, 0x12, 0x00, 0x4A, 0x00, 0x12, 0x00, 0x3B, 0x00, 0x12, 0x00, 0x4E, 0x00, 0x12, 0x00, -/* 00007AD0 */ 0x56, 0x00, 0x12, 0x00, 0x57, 0x00, 0x1C, 0x00, 0x35, 0x00, 0x12, 0x00, 0x3E, 0x00, 0x12, 0x00, -/* 00007AE0 */ 0x39, 0x00, 0x08, 0x00, 0x25, 0x00, 0x0C, 0x00, 0xE9, 0x01, 0x0C, 0x00, 0x40, 0x01, 0x0C, 0x00, -/* 00007AF0 */ 0x0C, 0x02, 0x0C, 0x00, 0x90, 0x01, 0x0C, 0x00, 0x58, 0x01, 0x0C, 0x00, 0x9A, 0x00, 0x0C, 0x00, -/* 00007B00 */ 0x70, 0x00, 0x0C, 0x00, 0xA7, 0x04, 0x0C, 0x00, 0x93, 0x04, 0x0C, 0x00, 0x31, 0x04, 0x0C, 0x00, -/* 00007B10 */ 0xB1, 0x09, 0x0C, 0x00, 0xEF, 0x02, 0x08, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x93, 0x03, 0x18, 0x00, -/* 00007B20 */ 0x89, 0x0A, 0x08, 0x00, 0x75, 0x00, 0x08, 0x00, 0x38, 0x00, 0x08, 0x00, 0x4C, 0x00, 0x08, 0x00, -/* 00007B30 */ 0x83, 0x1C, 0x0C, 0x00, 0xC0, 0x01, 0x0C, 0x00, 0xDF, 0x01, 0x0C, 0x00, 0x80, 0x03, 0x21, 0x00, -/* 00007B40 */ 0x3C, 0x00, 0x4F, 0x00, 0x25, 0x01, 0x06, 0x00, 0x51, 0x00, 0x53, 0x00, 0xA1, 0x01, 0x06, 0x00, -/* 00007B50 */ 0x59, 0x00, 0x53, 0x00, 0xB1, 0x01, 0x06, 0x00, 0x5D, 0x00, 0x53, 0x00, 0xB9, 0x01, 0x06, 0x00, -/* 00007B60 */ 0x41, 0x00, 0x50, 0x00, 0xAD, 0x02, 0x38, 0x00, 0x60, 0x00, 0x38, 0x00, 0x64, 0x00, 0x38, 0x00, -/* 00007B70 */ 0x66, 0x00, 0x30, 0x00, 0x49, 0x01, 0x00, 0x02, 0x51, 0x05, 0x18, 0x00, 0xCA, 0x03, 0x08, 0x00, -/* 00007B80 */ 0x2B, 0x00, 0x0C, 0x00, 0x3B, 0x09, 0x15, 0x00, 0xD1, 0x30, 0x15, 0x00, 0x14, 0x39, 0x15, 0x00, -/* 00007B90 */ 0xC3, 0x6D, 0x10, 0x00, 0x23, 0x00, 0x42, 0x00, 0x96, 0x00, 0x42, 0x00, 0x96, 0x00, 0x42, 0x00, -/* 00007BA0 */ 0x96, 0x00, 0x44, 0x00, 0x94, 0x00, 0x00, 0xE0, 0x23, 0x01, 0x00, 0xBE, 0x22, 0x01, 0x00, 0x0C, -/* 00007BB0 */ 0x22, 0x01, 0x00, 0x36, 0x21, 0x01, 0x00, 0xFD, 0x1F, 0x01, 0x00, 0x3C, 0x1F, 0x01, 0x00, 0xAA, -/* 00007BC0 */ 0x1E, 0x01, 0x00, 0x18, 0x1E, 0x01, 0x00, 0x9F, 0x1B, 0x01, 0x00, 0x55, 0x19, 0x01, 0x00, 0x89, -/* 00007BD0 */ 0x17, 0x01, 0x00, 0x52, 0x12, 0x01, 0x00, 0xB0, 0x10, 0x01, 0x00, 0xB3, 0x0E, 0x01, 0x00, 0x7F, -/* 00007BE0 */ 0x08, 0x01, 0x00, 0x34, 0x06, 0x01, 0x00, 0x86, 0x04, 0x01, 0x00, 0x10, 0x04, 0x01, 0x00, 0xEC, -/* 00007BF0 */ 0xFF, 0x00, 0x00, 0xE2, 0xFE, 0x00, 0x00, 0x59, 0xFB, 0x00, 0x00, 0x3A, 0xF8, 0x00, 0x00, 0xF8, -/* 00007C00 */ 0xF6, 0x00, 0x00, 0xB9, 0xF5, 0x00, 0x00, 0x7D, 0xF3, 0x00, 0x00, 0xA5, 0xF2, 0x00, 0x00, 0xC9, -/* 00007C10 */ 0xF1, 0x00, 0x00, 0xED, 0xF0, 0x00, 0x00, 0x51, 0xF0, 0x00, 0x00, 0x60, 0xED, 0x00, 0x00, 0x50, -/* 00007C20 */ 0xE9, 0x00, 0x00, 0xAA, 0xD0, 0x00, 0x00, 0xD6, 0xB5, 0x00, 0x00, 0x2F, 0x7C, 0x00, 0x00, 0x3F, -/* 00007C30 */ 0xFD, 0x62, 0x04, 0x4F, 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE4, 0x04, 0x1A, 0xFF, -/* 00007C40 */ 0xA0, 0x41, 0xD1, 0x00, 0x3F, 0x00, 0xFE, 0x6A, 0xED, 0x0E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 00007C50 */ 0x01, 0xFE, 0x6A, 0xED, 0xFE, 0x72, 0x6D, 0xFE, 0x72, 0x6D, 0x01, 0x13, 0x2F, 0x3B, 0x09, 0xDA, -/* 00007C60 */ 0xDA, 0x01, 0x10, 0x01, 0x09, 0x11, 0x11, 0x11, 0x11, 0x06, 0x02, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00007C70 */ 0xFF, 0x39, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00007C80 */ 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x02, 0x01, 0xFE, 0xE9, 0x03, 0x02, -/* 00007C90 */ 0x00, 0xFE, 0xEA, 0x03, 0x02, 0x01, 0xFE, 0xEB, 0x03, 0x02, 0x00, 0xFE, 0xEC, 0x03, 0x02, 0x01, -/* 00007CA0 */ 0xFE, 0xED, 0x03, 0x02, 0x00, 0xFE, 0xEE, 0x03, 0x02, 0x01, 0xFE, 0xEF, 0x03, 0x02, 0x00, 0xFE, -/* 00007CB0 */ 0xF0, 0x03, 0x02, 0x01, 0xFE, 0xF1, 0x03, 0x02, 0x00, 0xFE, 0xF2, 0x03, 0x02, 0x01, 0xFE, 0xF3, -/* 00007CC0 */ 0x03, 0x02, 0x00, 0xFE, 0xF4, 0x03, 0x02, 0x01, 0xFE, 0xF5, 0x03, 0x02, 0x00, 0xFE, 0xF6, 0x03, -/* 00007CD0 */ 0x02, 0x01, 0xFE, 0xF7, 0x03, 0x02, 0x00, 0xFE, 0xF8, 0x03, 0x02, 0x01, 0xFE, 0xF9, 0x03, 0x02, -/* 00007CE0 */ 0x00, 0xFE, 0xFA, 0x03, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, -/* 00007CF0 */ 0x02, 0x00, 0xFE, 0xFC, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFD, 0x03, 0x01, -/* 00007D00 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFE, 0x03, 0x02, 0x00, 0xFE, 0xFF, 0x03, 0x02, 0x00, -/* 00007D10 */ 0xFE, 0x00, 0x04, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x02, 0x01, 0xFE, -/* 00007D20 */ 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x09, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, -/* 00007D30 */ 0x00, 0x03, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x08, 0x02, 0x01, 0xFE, 0xD8, 0x03, 0x02, 0x01, 0xFE, -/* 00007D40 */ 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xD9, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, 0x01, 0xFE, 0xE6, -/* 00007D50 */ 0x02, 0xFE, 0x06, 0x05, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0xA8, 0x32, 0xA8, 0x33, 0xA8, 0x34, -/* 00007D60 */ 0xA8, 0x35, 0xA8, 0x36, 0xA8, 0x37, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3D, -/* 00007D70 */ 0x00, 0x00, 0x14, 0x17, 0x00, 0x3D, 0x02, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, -/* 00007D80 */ 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x14, 0x03, 0x00, 0x3D, 0x03, 0x09, 0xC3, 0x04, 0xDE, 0x00, -/* 00007D90 */ 0x09, 0x01, 0xB8, 0x3D, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x3D, 0x95, 0x00, -/* 00007DA0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2F, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x30, -/* 00007DB0 */ 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x01, 0x50, 0x01, 0x02, 0x00, -/* 00007DC0 */ 0x00, 0x00, 0x31, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x01, 0x50, -/* 00007DD0 */ 0x01, 0x03, 0x00, 0x00, 0x00, 0x32, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -/* 00007DE0 */ 0x32, 0x01, 0x50, 0x01, 0x04, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x06, -/* 00007DF0 */ 0x00, 0x00, 0x00, 0x33, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, 0x00, 0x34, 0x3D, 0x95, 0x00, 0x00, -/* 00007E00 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x34, 0x01, 0x50, 0x01, 0x06, 0x00, 0x00, 0x00, 0x35, 0x3D, -/* 00007E10 */ 0x95, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x35, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00007E20 */ 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x7B, 0x05, 0x3D, 0x00, 0x7B, 0x07, 0x3D, 0x01, 0x7B, -/* 00007E30 */ 0x09, 0x3D, 0x02, 0x7B, 0x0B, 0x3D, 0x03, 0x7B, 0x0D, 0x3D, 0x04, 0x7B, 0x0F, 0x3D, 0x05, 0x7B, -/* 00007E40 */ 0x11, 0x3D, 0x06, 0x7B, 0x13, 0x3D, 0x07, 0x7B, 0x15, 0x3D, 0x08, 0x96, 0x02, 0x00, 0x00, 0x00, -/* 00007E50 */ 0x3D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, 0x01, 0x00, 0x6D, 0x3D, 0x3E, -/* 00007E60 */ 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, -/* 00007E70 */ 0x3F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5D, 0x01, 0x17, 0x01, 0x00, 0xB8, 0x41, -/* 00007E80 */ 0x00, 0x01, 0x50, 0x01, 0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0xEE, 0x03, 0x3F, -/* 00007E90 */ 0x3F, 0x01, 0x00, 0x5C, 0x01, 0x3F, 0x5D, 0x02, 0x19, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x3D, 0x09, -/* 00007EA0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, 0x01, -/* 00007EB0 */ 0x00, 0x6D, 0x3D, 0x3E, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00007EC0 */ 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5D, 0x01, 0x1A, -/* 00007ED0 */ 0x03, 0x00, 0xB8, 0x41, 0x00, 0x01, 0x50, 0x01, 0x08, 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, -/* 00007EE0 */ 0x40, 0xEE, 0x03, 0x3F, 0x3F, 0x03, 0x00, 0x5C, 0x01, 0x3F, 0x5D, 0x02, 0x1B, 0x02, 0x00, 0xF2, -/* 00007EF0 */ 0x03, 0xFF, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00007F00 */ 0x00, 0x00, 0x3E, 0x01, 0x00, 0x6D, 0x3D, 0x3E, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8F, -/* 00007F10 */ 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00007F20 */ 0x18, 0x5D, 0x01, 0x1C, 0x05, 0x00, 0xB8, 0x41, 0x00, 0x01, 0x50, 0x01, 0x09, 0x00, 0x00, 0x00, -/* 00007F30 */ 0x40, 0x41, 0x5C, 0x02, 0x40, 0xEE, 0x03, 0x3F, 0x3F, 0x05, 0x00, 0x5C, 0x01, 0x3F, 0x5D, 0x02, -/* 00007F40 */ 0x1D, 0x04, 0x00, 0xF2, 0x03, 0xFF, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8F, 0x01, 0x00, -/* 00007F50 */ 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x14, 0x03, 0x00, 0x3D, 0x02, 0x09, 0xF0, -/* 00007F60 */ 0x02, 0xDE, 0x01, 0x04, 0x02, 0xB8, 0x3D, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x3D, 0x3D, 0x01, -/* 00007F70 */ 0x50, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x36, 0x3D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00007F80 */ 0x00, 0x36, 0x01, 0x50, 0x01, 0x0B, 0x00, 0x00, 0x00, 0x37, 0x3D, 0x95, 0x01, 0x00, 0x00, 0x00, -/* 00007F90 */ 0x03, 0x00, 0x00, 0x00, 0x37, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x02, -/* 00007FA0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5D, 0x01, 0x1E, 0x06, 0x00, 0x91, 0x01, 0x00, 0x00, -/* 00007FB0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x5C, 0x02, 0x3E, 0xEE, 0x03, 0xFF, 0x3D, 0x06, -/* 00007FC0 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x02, 0x00, 0x07, 0x03, 0x00, -/* 00007FD0 */ 0x5C, 0x00, 0x18, 0x5D, 0x01, 0x1F, 0x07, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 00007FE0 */ 0x00, 0x3E, 0x04, 0x00, 0x5C, 0x02, 0x3E, 0xEE, 0x03, 0xFF, 0x3D, 0x07, 0x00, 0x91, 0x01, 0x00, -/* 00007FF0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x03, 0x00, 0xCE, 0x3E, 0x02, 0x00, 0x00, 0xA1, 0x00, -/* 00008000 */ 0x20, 0x3E, 0xA1, 0x01, 0x21, 0x3E, 0x77, 0x3E, 0x3D, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, -/* 00008010 */ 0x00, 0x00, 0x00, 0x3D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, 0x00, -/* 00008020 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x5C, 0x01, 0x3E, 0x5D, 0x02, 0x22, 0x08, 0x00, -/* 00008030 */ 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x91, 0x01, 0x00, -/* 00008040 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x03, 0x00, 0x07, 0x01, 0x00, 0xC3, 0x01, 0x3F, 0x3F, -/* 00008050 */ 0x09, 0x00, 0x7B, 0x3F, 0x3E, 0x0B, 0x7B, 0x25, 0x3E, 0x0C, 0x7B, 0x25, 0x3E, 0x0D, 0x7B, 0x25, -/* 00008060 */ 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, 0x04, 0xFF, 0x3D, 0x08, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00008070 */ 0x0A, 0x00, 0x00, 0x00, 0x3D, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, -/* 00008080 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x62, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, -/* 00008090 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x3E, 0x07, 0x00, 0x62, 0x3E, 0x3E, 0x0F, -/* 000080A0 */ 0x5C, 0x02, 0x3E, 0xEE, 0x03, 0xFF, 0x3D, 0x0A, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, -/* 000080B0 */ 0x00, 0x00, 0x3D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, 0x00, 0x00, -/* 000080C0 */ 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x62, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5D, 0x02, -/* 000080D0 */ 0x28, 0x0B, 0x00, 0xCC, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, -/* 000080E0 */ 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x03, 0x00, 0x7B, 0x3F, 0x3E, 0x0B, -/* 000080F0 */ 0x7B, 0x29, 0x3E, 0x0C, 0x7B, 0x25, 0x3E, 0x0D, 0x7B, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, -/* 00008100 */ 0x04, 0xFF, 0x3D, 0x0B, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x05, -/* 00008110 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 00008120 */ 0x3E, 0x03, 0x00, 0x62, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5D, 0x02, 0x2A, 0x0C, 0x00, 0xCC, -/* 00008130 */ 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 00008140 */ 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5D, 0x01, -/* 00008150 */ 0x2C, 0x0D, 0x00, 0xB8, 0x41, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x41, 0x41, 0x01, 0x50, 0x01, -/* 00008160 */ 0x0C, 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0xEE, 0x03, 0x3F, 0x3F, 0x0D, 0x00, 0x7B, -/* 00008170 */ 0x3F, 0x3E, 0x10, 0x7B, 0x25, 0x3E, 0x0D, 0x7B, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, 0x04, -/* 00008180 */ 0xFF, 0x3D, 0x0C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x05, 0x00, -/* 00008190 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, -/* 000081A0 */ 0x03, 0x00, 0x62, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5D, 0x02, 0x2D, 0x0E, 0x00, 0xCC, 0x70, -/* 000081B0 */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xB8, 0x40, 0x00, 0xB7, 0x01, -/* 000081C0 */ 0x00, 0x00, 0x00, 0x40, 0x40, 0x01, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x7B, 0x3F, -/* 000081D0 */ 0x3E, 0x0B, 0x01, 0x64, 0x01, 0x3F, 0x3E, 0x7B, 0x29, 0x3E, 0x0C, 0x7B, 0x25, 0x3E, 0x0D, 0x7B, -/* 000081E0 */ 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, 0x04, 0xFF, 0x3D, 0x0E, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 000081F0 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x91, 0x01, -/* 00008200 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x03, 0x00, 0x5C, 0x01, 0x3E, 0x5D, 0x02, 0x2E, -/* 00008210 */ 0x0F, 0x00, 0xCC, 0x88, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x8F, -/* 00008220 */ 0x01, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x3F, 0x08, 0x00, 0x4B, 0x3F, 0x7B, 0x3F, 0x3E, -/* 00008230 */ 0x0B, 0x7B, 0x29, 0x3E, 0x0C, 0x7B, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0xEE, 0x04, 0xFF, 0x3D, -/* 00008240 */ 0x0F, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x07, -/* 00008250 */ 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x06, 0x9C, 0x00, 0x88, 0x00, 0x00, -/* 00008260 */ 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, -/* 00008270 */ 0x00, 0xB2, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00008280 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, -/* 00008290 */ 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x01, 0x00, -/* 000082A0 */ 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, -/* 000082B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, -/* 000082C0 */ 0x00, 0xB2, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000082D0 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, -/* 000082E0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x03, 0x00, -/* 000082F0 */ 0x00, 0xEB, 0x03, 0x00, 0x00, 0xED, 0x03, 0x00, 0x00, 0xEF, 0x03, 0x00, 0x00, 0xF1, 0x03, 0x00, -/* 00008300 */ 0x00, 0xF3, 0x03, 0x00, 0x00, 0xF5, 0x03, 0x00, 0x00, 0xF7, 0x03, 0x00, 0x00, 0xF9, 0x03, 0x00, -/* 00008310 */ 0x00, 0x00, 0xFE, 0xE9, 0x03, 0xFE, 0xEB, 0x03, 0xFE, 0xED, 0x03, 0xFE, 0xEF, 0x03, 0xFE, 0xF1, -/* 00008320 */ 0x03, 0xFE, 0xF3, 0x03, 0xFE, 0xF5, 0x03, 0xFE, 0xF7, 0x03, 0xFE, 0xF9, 0x03, 0xFE, 0x32, 0x02, -/* 00008330 */ 0xFE, 0x94, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB1, 0x01, 0xFE, 0xB2, 0x01, 0xFE, -/* 00008340 */ 0x45, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0x01, 0x04, 0x02, 0x01, 0x07, 0x00, 0xFE, 0x02, 0x04, 0x01, -/* 00008350 */ 0xFE, 0x03, 0x04, 0x02, 0xFE, 0x04, 0x04, 0x03, 0xFE, 0x05, 0x04, 0x04, 0xFE, 0x06, 0x04, 0x05, -/* 00008360 */ 0xFE, 0x07, 0x04, 0x06, 0xFE, 0x08, 0x04, 0x02, 0x02, 0x00, 0xFE, 0x1B, 0x02, 0x01, 0xFE, 0x1C, -/* 00008370 */ 0x02, 0xFE, 0x81, 0xED, 0x12, 0x12, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x9A, 0x13, 0x37, 0x00, 0x84, -/* 00008380 */ 0x36, 0x54, 0x00, 0x11, 0x03, 0x54, 0x00, 0x1B, 0x03, 0x54, 0x00, 0x1B, 0x03, 0x48, 0x00, 0x72, -/* 00008390 */ 0x06, 0x2C, 0x00, 0x13, 0x04, 0x2C, 0x00, 0x54, 0x00, 0x1D, 0x00, 0x48, 0x00, 0x61, 0x00, 0x9D, -/* 000083A0 */ 0x00, 0x3E, 0x00, 0x4A, 0x00, 0x5C, 0x00, 0xA2, 0x00, 0x7F, 0x00, 0x22, 0x03, 0x68, 0x00, 0xEC, -/* 000083B0 */ 0x08, 0x56, 0x00, 0x9F, 0x00, 0x0F, 0x00, 0x88, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x6B, 0xB1, -/* 000083C0 */ 0x00, 0x00, 0x16, 0xAB, 0x00, 0x00, 0x66, 0xAA, 0x00, 0x00, 0x0D, 0xA8, 0x00, 0x00, 0xF2, 0xA5, -/* 000083D0 */ 0x00, 0x00, 0x36, 0xA1, 0x00, 0x00, 0x6A, 0x97, 0x00, 0x00, 0xDE, 0x94, 0x00, 0x00, 0x57, 0x92, -/* 000083E0 */ 0x00, 0x00, 0xD0, 0x8F, 0x00, 0x00, 0x18, 0x8D, 0x00, 0x00, 0x6B, 0x8A, 0x00, 0x00, 0x22, 0x89, -/* 000083F0 */ 0x00, 0x00, 0xF6, 0x83, 0x00, 0x00, 0x3F, 0xFD, 0x22, 0x04, 0x4F, 0xFC, 0x0F, 0xFE, 0xA2, 0x03, -/* 00008400 */ 0xFE, 0xBB, 0x06, 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, 0x4E, 0x00, 0xFF, 0x11, 0x51, 0x01, 0x00, -/* 00008410 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x11, 0x51, 0x01, 0x00, 0xFE, 0x30, 0x08, -/* 00008420 */ 0xFE, 0x30, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, 0x04, 0x08, 0x09, 0x20, 0x20, 0x20, -/* 00008430 */ 0x20, 0x01, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008440 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, -/* 00008450 */ 0x02, 0x00, 0xFE, 0x44, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, -/* 00008460 */ 0x01, 0xFE, 0x45, 0x04, 0x02, 0x01, 0xFE, 0xCE, 0x03, 0x02, 0x01, 0xFE, 0x38, 0x04, 0x02, 0x01, -/* 00008470 */ 0xFE, 0x3C, 0x04, 0x02, 0x01, 0xFE, 0x39, 0x04, 0x02, 0x01, 0xFE, 0x3A, 0x04, 0x02, 0x01, 0xFE, -/* 00008480 */ 0x0D, 0x04, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, -/* 00008490 */ 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0x02, 0x01, 0xFE, 0x3B, 0x04, -/* 000084A0 */ 0x03, 0x04, 0xFE, 0x8B, 0x02, 0x5B, 0x15, 0xB4, 0x15, 0x15, 0x2C, 0x19, 0x15, 0x15, 0x03, 0x00, -/* 000084B0 */ 0x19, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x00, -/* 000084C0 */ 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5D, 0x01, 0x03, 0x00, 0x00, -/* 000084D0 */ 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, -/* 000084E0 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x01, 0x07, -/* 000084F0 */ 0x02, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x15, 0xF2, 0x02, 0x19, 0x19, 0x01, 0x00, 0x00, 0x00, -/* 00008500 */ 0x01, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x19, 0x93, 0x02, 0x00, 0x00, 0x00, 0x19, 0x01, 0x00, -/* 00008510 */ 0xA8, 0x1A, 0x14, 0x16, 0x00, 0x19, 0x1A, 0x09, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x19, -/* 00008520 */ 0x01, 0x00, 0x62, 0x19, 0x19, 0x02, 0x0F, 0x2D, 0x00, 0x19, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, -/* 00008530 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, -/* 00008540 */ 0x5C, 0x00, 0x1A, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, -/* 00008550 */ 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 00008560 */ 0x19, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00008570 */ 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008580 */ 0x1B, 0x03, 0x7B, 0x1B, 0x1A, 0x04, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008590 */ 0x1B, 0x05, 0x7B, 0x1B, 0x1A, 0x06, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085A0 */ 0x1B, 0x07, 0x7B, 0x1B, 0x1A, 0x08, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085B0 */ 0x1B, 0x09, 0x7B, 0x1B, 0x1A, 0x0A, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085C0 */ 0x1B, 0x0B, 0x7B, 0x1B, 0x1A, 0x0C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085D0 */ 0x1B, 0x0D, 0x7B, 0x1B, 0x1A, 0x0E, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085E0 */ 0x1B, 0x0F, 0x7B, 0x1B, 0x1A, 0x10, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 000085F0 */ 0x1B, 0x11, 0x7B, 0x1B, 0x1A, 0x12, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008600 */ 0x1B, 0x13, 0x7B, 0x1B, 0x1A, 0x14, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008610 */ 0x1B, 0x15, 0x7B, 0x1B, 0x1A, 0x16, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008620 */ 0x1B, 0x17, 0x7B, 0x1B, 0x1A, 0x18, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008630 */ 0x1B, 0x19, 0x7B, 0x1B, 0x1A, 0x1A, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008640 */ 0x1B, 0x1B, 0x7B, 0x1B, 0x1A, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x62, 0x1B, -/* 00008650 */ 0x1B, 0x1D, 0x7B, 0x1B, 0x1A, 0x1E, 0x5C, 0x01, 0x1A, 0x5D, 0x02, 0x13, 0x03, 0x00, 0xEE, 0x03, -/* 00008660 */ 0x19, 0x19, 0x03, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x19, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, -/* 00008670 */ 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCB, 0x1A, 0x5C, 0x01, -/* 00008680 */ 0x1A, 0x5D, 0x02, 0x13, 0x04, 0x00, 0xEE, 0x03, 0x19, 0x19, 0x04, 0x00, 0x96, 0x04, 0x00, 0x00, -/* 00008690 */ 0x00, 0x19, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x03, 0x00, 0x07, 0x05, -/* 000086A0 */ 0x00, 0x5C, 0x00, 0x14, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1A, 0x04, 0x00, -/* 000086B0 */ 0x5C, 0x01, 0x1A, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1A, 0x05, 0x00, 0x07, -/* 000086C0 */ 0x02, 0x00, 0x5C, 0x00, 0x14, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x06, 0x00, 0x5C, 0x01, 0x1B, -/* 000086D0 */ 0xEE, 0x02, 0x1A, 0x1A, 0x06, 0x00, 0x5C, 0x02, 0x1A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x5C, -/* 000086E0 */ 0x03, 0x1A, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x00, 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0xFF, -/* 000086F0 */ 0x19, 0x05, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x07, -/* 00008700 */ 0x03, 0x00, 0x5C, 0x00, 0x14, 0x93, 0x04, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x00, 0x5C, 0x01, 0x1A, -/* 00008710 */ 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1A, 0x08, 0x00, 0x62, 0x1A, 0x1A, 0x1F, -/* 00008720 */ 0x5C, 0x02, 0x1A, 0xEE, 0x03, 0x00, 0x19, 0x07, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00008730 */ 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -/* 00008740 */ 0x02, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x85, -/* 00008750 */ 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x7D, -/* 00008760 */ 0x02, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x81, -/* 00008770 */ 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6C, -/* 00008780 */ 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x93, 0x02, 0xFE, 0x12, 0x02, -/* 00008790 */ 0xFE, 0x95, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x85, 0x02, 0xFE, -/* 000087A0 */ 0x86, 0x02, 0xFE, 0x7B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x7C, -/* 000087B0 */ 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x8B, 0x02, -/* 000087C0 */ 0xFE, 0x80, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x81, 0x02, 0xFE, -/* 000087D0 */ 0x8F, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x45, 0x01, 0xFE, 0xE6, 0x03, 0xFE, 0x46, 0x04, 0xFE, 0xFB, -/* 000087E0 */ 0x01, 0x00, 0xFF, 0x46, 0x51, 0x01, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, -/* 000087F0 */ 0x2A, 0x00, 0x90, 0x00, 0x29, 0x00, 0x4B, 0x00, 0x25, 0x00, 0x6B, 0x00, 0x2A, 0x00, 0x90, 0x00, -/* 00008800 */ 0x13, 0x01, 0xCE, 0x03, 0x28, 0x00, 0x3E, 0x00, 0x61, 0x00, 0x98, 0x01, 0x3B, 0x00, 0x44, 0x00, -/* 00008810 */ 0x00, 0x15, 0x88, 0x00, 0x00, 0xBF, 0xFC, 0x3A, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008820 */ 0xFF, 0xFE, 0xD4, 0x06, 0x60, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x4F, 0x00, 0xFF, 0xAC, 0x57, 0x01, -/* 00008830 */ 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0xAC, 0x57, 0x01, 0x00, 0xFE, 0x27, 0x01, -/* 00008840 */ 0xFE, 0x27, 0x01, 0x41, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x02, 0x01, 0x01, 0x05, 0xFF, -/* 00008850 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, -/* 00008860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00008870 */ 0x02, 0x01, 0xFE, 0x38, 0x04, 0x02, 0x00, 0xFE, 0xE7, 0x03, 0x04, 0x90, 0x8F, 0x01, 0x00, 0x00, -/* 00008880 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x08, -/* 00008890 */ 0x15, 0x0B, 0x00, 0x07, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x68, 0x00, -/* 000088A0 */ 0x8F, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, -/* 000088B0 */ 0x00, 0x04, 0x8F, 0x05, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x5C, 0x01, -/* 000088C0 */ 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x5C, 0x02, 0x08, -/* 000088D0 */ 0x2F, 0x08, 0x03, 0x05, 0x5C, 0x03, 0x08, 0xEE, 0x04, 0x07, 0x07, 0x00, 0x00, 0x0F, 0x03, 0x00, -/* 000088E0 */ 0x07, 0x09, 0x24, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, -/* 000088F0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x05, -/* 00008900 */ 0x01, 0x00, 0x9D, 0x08, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, -/* 00008910 */ 0xDA, 0x57, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0xA6, 0x00, 0x26, 0x00, 0x52, -/* 00008920 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAC, -/* 00008930 */ 0x06, 0x39, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x4D, 0x00, 0xFF, 0x04, 0x4E, 0x01, 0x00, 0xFF, 0x00, -/* 00008940 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x04, 0x4E, 0x01, 0x00, 0xFE, 0x60, 0x02, 0xFE, 0x60, 0x02, -/* 00008950 */ 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, -/* 00008960 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, -/* 00008970 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 00008980 */ 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0x43, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xAA, 0x5B, -/* 00008990 */ 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x2A, 0x00, 0x8F, -/* 000089A0 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, -/* 000089B0 */ 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, -/* 000089C0 */ 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 000089D0 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, -/* 000089E0 */ 0x01, 0x05, 0xF2, 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, -/* 000089F0 */ 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, 0x02, 0x0F, 0x2D, 0x00, -/* 00008A00 */ 0x08, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00008A10 */ 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, -/* 00008A20 */ 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, -/* 00008A30 */ 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, -/* 00008A40 */ 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x78, 0x02, 0x00, 0xFF, 0x2A, 0x4E, 0x01, 0x00, 0x07, 0x05, 0x00, -/* 00008A50 */ 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x2A, 0x00, 0x88, 0x00, 0x26, 0x00, 0x4B, 0x00, 0x15, 0x00, -/* 00008A60 */ 0x6B, 0x00, 0x2A, 0x00, 0x88, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, -/* 00008A70 */ 0xFC, 0x07, 0xFE, 0xD8, 0x03, 0xFE, 0x91, 0x06, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x4C, 0x00, -/* 00008A80 */ 0xFF, 0xA3, 0x47, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0xA3, 0x47, 0x01, -/* 00008A90 */ 0x00, 0xFE, 0xB7, 0x03, 0xFE, 0xB7, 0x03, 0x03, 0x0A, 0x09, 0x0D, 0x0A, 0x61, 0x60, 0x04, 0x03, -/* 00008AA0 */ 0x0C, 0x06, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008AB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008AC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, -/* 00008AD0 */ 0x43, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -/* 00008AE0 */ 0x00, 0x04, 0xFE, 0xEA, 0x01, 0xAE, 0x0B, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x2C, 0x0D, 0x09, 0x15, -/* 00008AF0 */ 0x03, 0x00, 0x0D, 0x03, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00008B00 */ 0x0E, 0x00, 0x00, 0x6D, 0x0D, 0x0E, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5D, 0x01, 0x04, -/* 00008B10 */ 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00008B20 */ 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x6D, 0x0D, 0x0E, -/* 00008B30 */ 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0D, 0x0D, 0x01, 0x00, -/* 00008B40 */ 0x00, 0x00, 0x01, 0x00, 0x47, 0x0A, 0x0D, 0xA8, 0x0D, 0x14, 0x0E, 0x00, 0x0A, 0x0D, 0x09, 0x00, -/* 00008B50 */ 0x00, 0x62, 0x0D, 0x0A, 0x02, 0x0F, 0x2D, 0x00, 0x0D, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, -/* 00008B60 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x6D, 0x0D, 0x0E, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 00008B70 */ 0x00, 0x0E, 0x5D, 0x01, 0x04, 0x02, 0x00, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x0D, -/* 00008B80 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x0D, 0x0B, 0x03, 0x10, 0x03, 0x00, 0x0D, 0x06, 0x09, -/* 00008B90 */ 0xDD, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x0D, 0x01, 0x00, 0x07, 0x02, -/* 00008BA0 */ 0x00, 0x5C, 0x00, 0x08, 0x98, 0x0E, 0x0B, 0x07, 0x00, 0x00, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x0D, -/* 00008BB0 */ 0x0D, 0x03, 0x00, 0x0F, 0x2B, 0x00, 0x0D, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x26, -/* 00008BC0 */ 0x00, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x98, 0x0E, 0x0B, 0x07, -/* 00008BD0 */ 0x01, 0x00, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x0D, 0x0D, 0x04, 0x00, 0x0F, 0x23, 0x00, 0x0D, 0x09, -/* 00008BE0 */ 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x6D, 0x0D, -/* 00008BF0 */ 0x0E, 0x04, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x0E, 0xF2, 0x01, 0xFF, 0x0D, 0x04, 0x00, 0x00, 0x00, -/* 00008C00 */ 0x05, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x07, 0x02, -/* 00008C10 */ 0x00, 0x5C, 0x00, 0x08, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, -/* 00008C20 */ 0x6D, 0x0E, 0x0F, 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x31, -/* 00008C30 */ 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x6D, 0x10, 0x11, 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, -/* 00008C40 */ 0x98, 0x12, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x12, 0xF2, 0x02, 0x10, 0x10, 0x06, 0x00, 0x00, -/* 00008C50 */ 0x00, 0x08, 0x00, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x0A, 0xF2, 0x03, 0x0E, 0x0E, 0x05, 0x00, 0x00, -/* 00008C60 */ 0x00, 0x07, 0x00, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x00, 0x0D, 0x06, 0x00, 0x09, 0x5E, 0x00, 0x8F, -/* 00008C70 */ 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00008C80 */ 0x08, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, -/* 00008C90 */ 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, -/* 00008CA0 */ 0x10, 0x05, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x08, 0xEE, 0x01, 0x10, 0x10, 0x0B, 0x00, 0x5C, -/* 00008CB0 */ 0x01, 0x10, 0x5C, 0x02, 0x0A, 0xF2, 0x03, 0x0E, 0x0E, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x5C, -/* 00008CC0 */ 0x01, 0x0E, 0xEE, 0x02, 0x00, 0x0D, 0x09, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 00008CD0 */ 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6C, 0x02, 0xF0, 0xFE, 0x59, 0x02, 0xFE, 0x31, -/* 00008CE0 */ 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0xCB, 0x47, 0x01, 0x00, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x0B, -/* 00008CF0 */ 0x00, 0x38, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0x26, 0x00, 0x47, 0x00, 0x15, 0x00, 0x67, 0x00, 0x2A, -/* 00008D00 */ 0x00, 0x80, 0x00, 0x0C, 0x00, 0x35, 0x00, 0x50, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4F, 0x00, 0x6D, -/* 00008D10 */ 0x00, 0x82, 0x00, 0x5E, 0x00, 0x51, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 00008D20 */ 0x02, 0x03, 0xFE, 0x6E, 0x06, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x4B, 0x00, 0xFF, 0x11, 0x41, -/* 00008D30 */ 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x11, 0x41, 0x01, 0x00, 0xFE, 0x36, -/* 00008D40 */ 0x06, 0xFE, 0x36, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x04, 0x02, 0x09, 0x09, 0x08, -/* 00008D50 */ 0x07, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008D60 */ 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008D70 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 00008D80 */ 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xFE, 0xD5, 0x01, 0xAE, 0x0A, 0x5B, -/* 00008D90 */ 0x0B, 0xB4, 0x0B, 0x0B, 0xA8, 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x62, 0x0F, -/* 00008DA0 */ 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x03, 0x09, 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x04, 0x00, 0x00, -/* 00008DB0 */ 0x47, 0x08, 0x0F, 0x62, 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x09, 0x00, 0x98, -/* 00008DC0 */ 0x0F, 0x0A, 0x03, 0x01, 0x00, 0x47, 0x09, 0x0F, 0x6B, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, -/* 00008DD0 */ 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x20, 0x00, -/* 00008DE0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x07, 0x03, -/* 00008DF0 */ 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC3, 0x03, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x60, 0x01, -/* 00008E00 */ 0x8F, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x6D, 0x0F, 0x10, 0x01, -/* 00008E10 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, -/* 00008E20 */ 0x00, 0x01, 0x00, 0x47, 0x0C, 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, -/* 00008E30 */ 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x0F, 0x0F, 0x02, -/* 00008E40 */ 0x00, 0x0F, 0x28, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00008E50 */ 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5D, 0x01, -/* 00008E60 */ 0x07, 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x00, -/* 00008E70 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, -/* 00008E80 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, -/* 00008E90 */ 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0D, 0x0F, 0x09, 0x4B, 0x00, 0x8F, 0x04, 0x00, -/* 00008EA0 */ 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x04, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, -/* 00008EB0 */ 0x10, 0x5C, 0x01, 0x10, 0x5D, 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x0F, 0x0F, 0x05, 0x00, 0x47, -/* 00008EC0 */ 0x0D, 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, -/* 00008ED0 */ 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0xF2, 0x03, -/* 00008EE0 */ 0xFF, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, -/* 00008EF0 */ 0x00, 0x0F, 0x05, 0x00, 0x4B, 0x0F, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, -/* 00008F00 */ 0x02, 0x08, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x0F, 0x07, 0x00, 0x47, 0x0F, 0x0D, 0x8F, 0x04, -/* 00008F10 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, -/* 00008F20 */ 0x8F, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x07, 0x00, 0x5C, 0x01, 0x11, 0x8F, -/* 00008F30 */ 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x5C, 0x02, 0x11, -/* 00008F40 */ 0x5C, 0x03, 0x0C, 0xEE, 0x04, 0x10, 0x10, 0x08, 0x00, 0x77, 0x10, 0x0F, 0x05, 0x62, 0x0F, 0x0D, -/* 00008F50 */ 0x06, 0x82, 0x0F, 0x0F, 0x28, 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 00008F60 */ 0x24, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, -/* 00008F70 */ 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x78, 0x02, 0xDB, 0x00, 0xFF, 0x90, 0x42, 0x01, 0x00, 0x14, 0x07, -/* 00008F80 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, -/* 00008F90 */ 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x20, -/* 00008FA0 */ 0x00, 0x58, 0x00, 0x26, 0x00, 0x37, 0x00, 0x22, 0x00, 0x38, 0x00, 0x25, 0x00, 0x9D, 0x00, 0x26, -/* 00008FB0 */ 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x25, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x58, 0x00, 0x23, -/* 00008FC0 */ 0x00, 0x4F, 0x00, 0x42, 0x00, 0x66, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, -/* 00008FD0 */ 0xBF, 0xFC, 0x2A, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x60, 0x06, 0x64, -/* 00008FE0 */ 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x4A, 0x00, 0xFF, 0x23, 0x3E, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, -/* 00008FF0 */ 0x00, 0x01, 0x01, 0xFF, 0x23, 0x3E, 0x01, 0x00, 0xFE, 0xAF, 0x02, 0xFE, 0xAF, 0x02, 0x03, 0x0A, -/* 00009000 */ 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, -/* 00009010 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, -/* 00009020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, -/* 00009030 */ 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFD, 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, -/* 00009040 */ 0x02, 0x00, 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 00009050 */ 0x00, 0xFE, 0x0B, 0x04, 0xFE, 0xC9, 0x01, 0xAE, 0x0E, 0x5B, 0x0B, 0xB4, 0x0B, 0x0B, 0x2C, 0x10, -/* 00009060 */ 0x0B, 0x15, 0x1B, 0x00, 0x10, 0x03, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, -/* 00009070 */ 0x00, 0x00, 0x10, 0x00, 0x00, 0xE1, 0x10, 0x0B, 0x10, 0x00, 0x0F, 0x2D, 0x00, 0x10, 0x09, 0x00, -/* 00009080 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x6D, 0x10, 0x11, -/* 00009090 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, 0x01, 0x04, 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, -/* 000090A0 */ 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 000090B0 */ 0x0C, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, -/* 000090C0 */ 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x03, 0x00, 0x00, -/* 000090D0 */ 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x0B, 0xC3, 0x02, -/* 000090E0 */ 0x11, 0x11, 0x02, 0x00, 0x5C, 0x02, 0x11, 0xEE, 0x03, 0x10, 0x10, 0x01, 0x00, 0x47, 0x0C, 0x10, -/* 000090F0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 00009100 */ 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x10, 0x10, 0x03, 0x00, 0x0F, 0x25, 0x00, 0x10, 0x09, -/* 00009110 */ 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x07, 0x02, -/* 00009120 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x10, 0x10, 0x04, 0x00, 0x0F, 0x09, 0x00, -/* 00009130 */ 0x10, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xE4, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, -/* 00009140 */ 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x11, 0x5C, 0x01, -/* 00009150 */ 0x11, 0x5D, 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x10, 0x10, 0x05, 0x00, 0x47, 0x0D, 0x10, 0x8F, -/* 00009160 */ 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4B, 0x10, 0x07, 0x04, 0x00, -/* 00009170 */ 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x98, 0x11, 0x0E, 0x08, 0x00, 0x00, 0x5C, 0x02, 0x11, 0x8F, -/* 00009180 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x07, 0x04, 0x00, -/* 00009190 */ 0x5C, 0x00, 0x06, 0x98, 0x12, 0x0E, 0x09, 0x01, 0x00, 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x0A, 0x07, -/* 000091A0 */ 0x00, 0x5D, 0x03, 0x0A, 0x07, 0x00, 0xEE, 0x04, 0x11, 0x11, 0x07, 0x00, 0x5C, 0x03, 0x11, 0xEE, -/* 000091B0 */ 0x04, 0xFF, 0x10, 0x06, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x09, -/* 000091C0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 000091D0 */ 0x12, 0x01, 0x00, 0x6D, 0x11, 0x12, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x8F, 0x03, 0x00, -/* 000091E0 */ 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x6D, 0x13, 0x14, 0x02, 0x07, 0x02, 0x00, -/* 000091F0 */ 0x5C, 0x00, 0x14, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x13, 0x13, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 00009200 */ 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0D, 0xF2, 0x03, 0x11, 0x11, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00009210 */ 0x5C, 0x01, 0x11, 0xEE, 0x02, 0x00, 0x10, 0x08, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00009220 */ 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0x41, 0x3E, 0x01, -/* 00009230 */ 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4F, 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x45, 0x00, -/* 00009240 */ 0x53, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x25, 0x00, 0x3A, 0x00, 0x56, 0x00, -/* 00009250 */ 0x76, 0x00, 0x69, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, -/* 00009260 */ 0xFF, 0xFF, 0xFF, 0xFE, 0x53, 0x06, 0x64, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x49, 0x00, 0xFF, 0x08, -/* 00009270 */ 0x3B, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x08, 0x3B, 0x01, 0x00, 0xFE, -/* 00009280 */ 0xAF, 0x02, 0xFE, 0xAF, 0x02, 0x03, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, -/* 00009290 */ 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000092A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000092B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFC, -/* 000092C0 */ 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, 0x02, 0x00, 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, -/* 000092D0 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x09, 0x04, 0xFE, 0xC9, 0x01, 0xAE, 0x0E, -/* 000092E0 */ 0x5B, 0x0B, 0xB4, 0x0B, 0x0B, 0x2C, 0x10, 0x0B, 0x15, 0x1B, 0x00, 0x10, 0x03, 0x09, 0x00, 0x00, -/* 000092F0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xE1, 0x10, 0x0B, 0x10, -/* 00009300 */ 0x00, 0x0F, 0x2D, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00009310 */ 0x00, 0x11, 0x01, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, 0x01, -/* 00009320 */ 0x04, 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, -/* 00009330 */ 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x07, 0x03, -/* 00009340 */ 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, -/* 00009350 */ 0x5C, 0x01, 0x11, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x07, -/* 00009360 */ 0x02, 0x00, 0x5C, 0x01, 0x0B, 0xC3, 0x02, 0x11, 0x11, 0x02, 0x00, 0x5C, 0x02, 0x11, 0xEE, 0x03, -/* 00009370 */ 0x10, 0x10, 0x01, 0x00, 0x47, 0x0C, 0x10, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, -/* 00009380 */ 0x10, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x10, 0x10, -/* 00009390 */ 0x03, 0x00, 0x0F, 0x25, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, -/* 000093A0 */ 0x00, 0x00, 0x10, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, -/* 000093B0 */ 0x10, 0x10, 0x04, 0x00, 0x0F, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xE4, -/* 000093C0 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x07, 0x03, 0x00, -/* 000093D0 */ 0x5C, 0x00, 0x06, 0xCB, 0x11, 0x5C, 0x01, 0x11, 0x5D, 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x10, -/* 000093E0 */ 0x10, 0x05, 0x00, 0x47, 0x0D, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, -/* 000093F0 */ 0x07, 0x00, 0x4B, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x98, 0x11, 0x0E, -/* 00009400 */ 0x08, 0x00, 0x00, 0x5C, 0x02, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, -/* 00009410 */ 0x08, 0x00, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x98, 0x12, 0x0E, 0x09, 0x01, 0x00, -/* 00009420 */ 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x0A, 0x07, 0x00, 0x5D, 0x03, 0x0A, 0x07, 0x00, 0xEE, 0x04, 0x11, -/* 00009430 */ 0x11, 0x07, 0x00, 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x06, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 00009440 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, -/* 00009450 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x6D, 0x11, 0x12, 0x01, 0x07, 0x03, -/* 00009460 */ 0x00, 0x5C, 0x00, 0x12, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x14, 0x0A, 0x00, -/* 00009470 */ 0x6D, 0x13, 0x14, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x14, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x13, -/* 00009480 */ 0x13, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0D, 0xF2, 0x03, 0x11, -/* 00009490 */ 0x11, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x5C, 0x01, 0x11, 0xEE, 0x02, 0x00, 0x10, 0x08, 0x00, -/* 000094A0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, -/* 000094B0 */ 0x5C, 0x02, 0x00, 0xFF, 0x26, 0x3B, 0x01, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4F, -/* 000094C0 */ 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x53, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, -/* 000094D0 */ 0x00, 0x25, 0x00, 0x3A, 0x00, 0x56, 0x00, 0x76, 0x00, 0x69, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, -/* 000094E0 */ 0x2A, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x46, 0x06, 0x60, 0xFF, 0xA0, -/* 000094F0 */ 0x41, 0xF1, 0x00, 0x48, 0x00, 0xFF, 0xF3, 0x37, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 00009500 */ 0x01, 0xFF, 0xF3, 0x37, 0x01, 0x00, 0xFE, 0xA9, 0x02, 0xFE, 0xA9, 0x02, 0x03, 0x0A, 0x0C, 0x11, -/* 00009510 */ 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00009520 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00009530 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, -/* 00009540 */ 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, 0x02, 0x00, -/* 00009550 */ 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 00009560 */ 0x0A, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0xFE, 0xC9, 0x01, 0xAE, 0x0F, 0x5B, 0x0C, 0xB4, 0x0C, -/* 00009570 */ 0x0C, 0x2C, 0x11, 0x0C, 0x15, 0x1B, 0x00, 0x11, 0x03, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 00009580 */ 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0xE1, 0x11, 0x0C, 0x11, 0x00, 0x0F, 0x2D, 0x00, -/* 00009590 */ 0x11, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, -/* 000095A0 */ 0x6D, 0x11, 0x12, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x5D, 0x01, 0x04, 0x00, 0x00, 0x5D, -/* 000095B0 */ 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, -/* 000095C0 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, -/* 000095D0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x5C, 0x01, 0x12, 0x8F, -/* 000095E0 */ 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x01, -/* 000095F0 */ 0x0C, 0xC3, 0x02, 0x12, 0x12, 0x02, 0x00, 0x5C, 0x02, 0x12, 0xEE, 0x03, 0x11, 0x11, 0x01, 0x00, -/* 00009600 */ 0x47, 0x0D, 0x11, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x07, -/* 00009610 */ 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0xEE, 0x02, 0x11, 0x11, 0x03, 0x00, 0x0F, 0x25, -/* 00009620 */ 0x00, 0x11, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x11, 0x05, -/* 00009630 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0xEE, 0x02, 0x11, 0x11, 0x04, 0x00, -/* 00009640 */ 0x0F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xE4, 0x00, 0x8F, 0x03, 0x00, -/* 00009650 */ 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x11, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, -/* 00009660 */ 0x12, 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x11, 0x11, 0x05, 0x00, 0x47, -/* 00009670 */ 0x0E, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x11, 0x07, 0x00, 0x4B, 0x11, -/* 00009680 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0E, 0x98, 0x12, 0x0F, 0x08, 0x00, 0x00, 0x5C, -/* 00009690 */ 0x02, 0x12, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x08, 0x00, 0x4B, 0x12, -/* 000096A0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x98, 0x13, 0x0F, 0x09, 0x01, 0x00, 0x5C, 0x01, 0x13, 0x5D, -/* 000096B0 */ 0x02, 0x0A, 0x07, 0x00, 0x5D, 0x03, 0x0B, 0x07, 0x00, 0xEE, 0x04, 0x12, 0x12, 0x07, 0x00, 0x5C, -/* 000096C0 */ 0x03, 0x12, 0xEE, 0x04, 0xFF, 0x11, 0x06, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, -/* 000096D0 */ 0x00, 0x11, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 000096E0 */ 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x6D, 0x12, 0x13, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x13, -/* 000096F0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x15, 0x0A, 0x00, 0x6D, 0x14, 0x15, 0x02, -/* 00009700 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x15, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x14, 0x14, 0x02, 0x00, 0x00, -/* 00009710 */ 0x00, 0x0A, 0x00, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0E, 0xF2, 0x03, 0x12, 0x12, 0x01, 0x00, 0x00, -/* 00009720 */ 0x00, 0x09, 0x00, 0x5C, 0x01, 0x12, 0xEE, 0x02, 0x00, 0x11, 0x08, 0x00, 0x09, 0x02, 0x00, 0xA8, -/* 00009730 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, -/* 00009740 */ 0x11, 0x38, 0x01, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4F, 0x00, 0x2A, 0x00, 0x6B, -/* 00009750 */ 0x00, 0x45, 0x00, 0x53, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x25, 0x00, 0x3A, -/* 00009760 */ 0x00, 0x56, 0x00, 0x74, 0x00, 0x69, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x4A, 0x06, 0x4F, 0xFD, -/* 00009770 */ 0x07, 0xFE, 0x08, 0x04, 0xFE, 0xC1, 0x05, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x47, 0x00, 0xFF, -/* 00009780 */ 0x28, 0x1C, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x28, 0x1C, 0x01, 0x00, -/* 00009790 */ 0xFE, 0x69, 0x1B, 0xFE, 0x69, 0x1B, 0x45, 0x1C, 0x29, 0x41, 0x07, 0xFE, 0xAA, 0x01, 0xFE, 0x8A, -/* 000097A0 */ 0x01, 0x03, 0x01, 0x0C, 0x22, 0x0F, 0x2A, 0x2A, 0x2A, 0x2A, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000097B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000097C0 */ 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x01, -/* 000097D0 */ 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0x08, 0x02, 0x00, 0xFE, 0x0A, 0x04, 0x02, -/* 000097E0 */ 0x01, 0xFE, 0x09, 0x04, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, -/* 000097F0 */ 0xFE, 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, 0xFE, 0x38, 0x04, 0x02, 0x01, 0xFE, -/* 00009800 */ 0x39, 0x04, 0x02, 0x00, 0xFE, 0x13, 0x04, 0x02, 0x00, 0xFE, 0x14, 0x04, 0x02, 0x00, 0xFE, 0x16, -/* 00009810 */ 0x04, 0x02, 0x01, 0xFE, 0x3A, 0x04, 0x02, 0x01, 0xFE, 0x0D, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, -/* 00009820 */ 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, -/* 00009830 */ 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0x02, 0x01, -/* 00009840 */ 0xFE, 0x3B, 0x04, 0x02, 0x01, 0xFE, 0x3C, 0x04, 0x02, 0x01, 0xFE, 0x58, 0x03, 0x02, 0x00, 0xFE, -/* 00009850 */ 0x3D, 0x04, 0x02, 0x00, 0xFE, 0x3E, 0x04, 0x02, 0x00, 0xFE, 0x3F, 0x04, 0x02, 0x00, 0xFE, 0x40, -/* 00009860 */ 0x04, 0x03, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x00, 0xFE, 0x00, 0x04, 0x09, 0x02, 0x00, 0xFE, -/* 00009870 */ 0x41, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x07, 0xA8, -/* 00009880 */ 0x3F, 0x2C, 0x42, 0x29, 0x0D, 0x03, 0x00, 0x42, 0x02, 0x09, 0x1C, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 00009890 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x00, 0x07, 0x01, 0x00, 0x5C, -/* 000098A0 */ 0x00, 0x43, 0xF6, 0x01, 0xFF, 0x42, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -/* 000098B0 */ 0x00, 0x42, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x19, -/* 000098C0 */ 0x00, 0x00, 0x00, 0x43, 0x02, 0x00, 0x5C, 0x01, 0x43, 0x5C, 0x02, 0x29, 0x5C, 0x03, 0x03, 0xF6, -/* 000098D0 */ 0x04, 0x42, 0x42, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x2D, 0x00, 0x62, 0x42, 0x29, 0x01, -/* 000098E0 */ 0x0F, 0x03, 0x00, 0x42, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 000098F0 */ 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x05, -/* 00009900 */ 0x5C, 0x02, 0x05, 0xF6, 0x03, 0xFF, 0x42, 0x02, 0x00, 0x77, 0x06, 0x29, 0x03, 0x8F, 0x01, 0x00, -/* 00009910 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x03, 0x00, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 00009920 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x08, 0xF6, 0x04, 0x42, 0x42, 0x03, 0x00, -/* 00009930 */ 0x47, 0x2B, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, -/* 00009940 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCE, 0x43, -/* 00009950 */ 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, 0x05, -/* 00009960 */ 0x0C, 0xF6, 0x06, 0x42, 0x42, 0x04, 0x00, 0x47, 0x2E, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, -/* 00009970 */ 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, -/* 00009980 */ 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xA8, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, -/* 00009990 */ 0x06, 0x42, 0x42, 0x05, 0x00, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x2F, 0x42, 0x09, -/* 000099A0 */ 0x25, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x6D, 0x42, -/* 000099B0 */ 0x43, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x2F, 0xF6, 0x02, 0x42, 0x42, 0x06, -/* 000099C0 */ 0x00, 0x47, 0x2F, 0x42, 0x09, 0x1F, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 000099D0 */ 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x05, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF6, 0x01, 0x42, -/* 000099E0 */ 0x42, 0x07, 0x00, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x14, 0x03, 0x00, 0x2F, 0x42, 0x09, 0x1C, 0x00, -/* 000099F0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x06, -/* 00009A00 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF6, 0x01, 0xFF, 0x42, 0x08, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 00009A10 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 00009A20 */ 0x2B, 0x5C, 0x02, 0x0E, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x03, 0x01, 0x00, 0xA1, 0x00, 0x0F, 0x43, -/* 00009A30 */ 0xA1, 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, -/* 00009A40 */ 0xF6, 0x06, 0x42, 0x42, 0x09, 0x00, 0x47, 0x30, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 00009A50 */ 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, -/* 00009A60 */ 0x12, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x03, 0x02, 0x00, 0xA1, 0x00, 0x0F, 0x43, 0xA1, 0x01, 0x10, -/* 00009A70 */ 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, -/* 00009A80 */ 0x42, 0x0A, 0x00, 0x47, 0x31, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, -/* 00009A90 */ 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x13, 0x5C, 0x03, -/* 00009AA0 */ 0x0A, 0xCE, 0x43, 0x02, 0x03, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, -/* 00009AB0 */ 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x0B, 0x00, 0x47, 0x32, 0x42, 0x8F, -/* 00009AC0 */ 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 00009AD0 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x16, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x05, 0x04, 0x00, 0xA1, -/* 00009AE0 */ 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0xA1, 0x02, 0x0F, 0x43, 0xA1, 0x03, 0x10, 0x43, 0xA1, -/* 00009AF0 */ 0x04, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x0C, -/* 00009B00 */ 0x00, 0x47, 0x33, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, -/* 00009B10 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0A, 0xCE, -/* 00009B20 */ 0x43, 0x02, 0x05, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, -/* 00009B30 */ 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x0D, 0x00, 0x47, 0x34, 0x42, 0x8F, 0x03, 0x00, -/* 00009B40 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 00009B50 */ 0x01, 0x2B, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x02, 0x06, 0x00, 0xA1, 0x00, 0x14, -/* 00009B60 */ 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, -/* 00009B70 */ 0x42, 0x0E, 0x00, 0x47, 0x35, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, -/* 00009B80 */ 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x19, 0x5C, 0x03, -/* 00009B90 */ 0x0A, 0xCE, 0x43, 0x02, 0x07, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, -/* 00009BA0 */ 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x0F, 0x00, 0x47, 0x36, 0x42, 0x8F, -/* 00009BB0 */ 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 00009BC0 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x02, 0x08, 0x00, 0xA1, -/* 00009BD0 */ 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, -/* 00009BE0 */ 0x06, 0x42, 0x42, 0x10, 0x00, 0x47, 0x37, 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00009BF0 */ 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1B, -/* 00009C00 */ 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x02, 0x09, 0x00, 0xA1, 0x00, 0x10, 0x43, 0xA1, 0x01, 0x11, 0x43, -/* 00009C10 */ 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xF6, 0x06, 0x42, 0x42, 0x11, 0x00, 0x47, 0x38, -/* 00009C20 */ 0x42, 0x0F, 0x03, 0x00, 0x35, 0x09, 0x31, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00009C30 */ 0x00, 0x43, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1C, -/* 00009C40 */ 0x5C, 0x03, 0x1D, 0xA8, 0x44, 0x5C, 0x04, 0x44, 0xA8, 0x44, 0x5C, 0x05, 0x44, 0xF6, 0x06, 0x43, -/* 00009C50 */ 0x43, 0x12, 0x00, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x39, -/* 00009C60 */ 0x42, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, -/* 00009C70 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1E, 0x5C, 0x03, 0x0A, 0xCE, 0x43, 0x02, 0x0A, -/* 00009C80 */ 0x00, 0xA1, 0x00, 0x1F, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, 0x05, 0x0C, 0xF6, -/* 00009C90 */ 0x06, 0x42, 0x42, 0x13, 0x00, 0x47, 0x3A, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x39, 0x42, 0x09, -/* 00009CA0 */ 0x16, 0x00, 0x0F, 0x03, 0x00, 0x39, 0x09, 0x06, 0x00, 0x47, 0x43, 0x20, 0x09, 0x03, 0x00, 0x47, -/* 00009CB0 */ 0x43, 0x21, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x3B, 0x42, -/* 00009CC0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0x05, 0x00, 0x4B, 0x42, 0x07, 0x02, -/* 00009CD0 */ 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x43, 0x06, 0x00, -/* 00009CE0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, -/* 00009CF0 */ 0x00, 0x00, 0x00, 0x7B, 0x30, 0x44, 0x07, 0x7B, 0x31, 0x44, 0x08, 0x7B, 0x32, 0x44, 0x09, 0x7B, -/* 00009D00 */ 0x33, 0x44, 0x0A, 0x7B, 0x34, 0x44, 0x0B, 0x7B, 0x35, 0x44, 0x0C, 0x7B, 0x36, 0x44, 0x0D, 0x7B, -/* 00009D10 */ 0x37, 0x44, 0x0E, 0x7B, 0x38, 0x44, 0x0F, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x22, 0xF6, 0x03, 0x43, -/* 00009D20 */ 0x43, 0x14, 0x00, 0x5C, 0x01, 0x43, 0xF6, 0x02, 0x42, 0x42, 0x15, 0x00, 0x47, 0x3C, 0x42, 0x8F, -/* 00009D30 */ 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x42, 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00009D40 */ 0x04, 0x5C, 0x01, 0x2A, 0xF6, 0x02, 0x42, 0x42, 0x16, 0x00, 0x47, 0x2A, 0x42, 0x8F, 0x03, 0x00, -/* 00009D50 */ 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x42, 0x08, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 00009D60 */ 0x01, 0x2A, 0x5C, 0x02, 0x2E, 0xCE, 0x43, 0x02, 0x0B, 0x00, 0xA1, 0x00, 0x23, 0x43, 0xA1, 0x01, -/* 00009D70 */ 0x24, 0x43, 0x5C, 0x03, 0x43, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x43, 0x09, -/* 00009D80 */ 0x00, 0x5C, 0x04, 0x43, 0xF6, 0x05, 0x42, 0x42, 0x17, 0x00, 0x47, 0x3D, 0x42, 0x77, 0x2E, 0x29, -/* 00009D90 */ 0x10, 0x77, 0x2F, 0x29, 0x11, 0x62, 0x42, 0x3D, 0x12, 0x77, 0x42, 0x29, 0x13, 0x77, 0x30, 0x29, -/* 00009DA0 */ 0x14, 0x77, 0x31, 0x29, 0x15, 0x77, 0x32, 0x29, 0x16, 0x77, 0x33, 0x29, 0x17, 0x77, 0x34, 0x29, -/* 00009DB0 */ 0x18, 0x77, 0x35, 0x29, 0x19, 0x77, 0x36, 0x29, 0x1A, 0x77, 0x37, 0x29, 0x1B, 0x77, 0x38, 0x29, -/* 00009DC0 */ 0x1C, 0x77, 0x39, 0x29, 0x1D, 0x77, 0x3A, 0x29, 0x1E, 0x77, 0x3B, 0x29, 0x1F, 0x77, 0x3C, 0x29, -/* 00009DD0 */ 0x20, 0x47, 0x3E, 0x25, 0xE5, 0x24, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, -/* 00009DE0 */ 0x42, 0x0A, 0x00, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, -/* 00009DF0 */ 0x25, 0xF6, 0x03, 0xFF, 0x42, 0x18, 0x00, 0xE9, 0x09, 0x6F, 0x00, 0xE7, 0x2C, 0x06, 0x8F, 0x03, -/* 00009E00 */ 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x42, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, -/* 00009E10 */ 0x5C, 0x01, 0x2C, 0xF6, 0x02, 0xFF, 0x42, 0x19, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 00009E20 */ 0x00, 0x00, 0x42, 0x03, 0x00, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, -/* 00009E30 */ 0x5C, 0x02, 0x26, 0x5C, 0x03, 0x27, 0xF6, 0x04, 0x42, 0x42, 0x1A, 0x00, 0x47, 0x3F, 0x42, 0x47, -/* 00009E40 */ 0x42, 0x29, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x43, 0x05, 0x00, 0x4B, 0x43, -/* 00009E50 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x22, 0xF6, 0x03, 0x43, 0x43, -/* 00009E60 */ 0x1B, 0x00, 0x77, 0x43, 0x42, 0x21, 0x47, 0x3E, 0x06, 0xE9, 0x0F, 0x34, 0x00, 0x3E, 0x09, 0x00, -/* 00009E70 */ 0x00, 0x47, 0x42, 0x29, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x43, 0x0C, 0x00, -/* 00009E80 */ 0x4B, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x62, 0x44, 0x29, 0x22, 0x98, 0x44, 0x44, 0x28, -/* 00009E90 */ 0x00, 0x00, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x29, 0xF6, 0x03, 0x43, 0x43, 0x1C, 0x00, 0x77, 0x43, -/* 00009EA0 */ 0x42, 0x21, 0xE5, 0x24, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x42, 0x0A, -/* 00009EB0 */ 0x00, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, 0x06, 0xF6, -/* 00009EC0 */ 0x03, 0xFF, 0x42, 0x1D, 0x00, 0xE9, 0x09, 0x3B, 0x00, 0xE7, 0x2D, 0x06, 0x8F, 0x03, 0x00, 0x00, -/* 00009ED0 */ 0x00, 0x29, 0x00, 0x00, 0x00, 0x42, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 00009EE0 */ 0x2D, 0xF6, 0x02, 0xFF, 0x42, 0x1E, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00009EF0 */ 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF6, 0x01, 0xFF, -/* 00009F00 */ 0x42, 0x1F, 0x00, 0xE9, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x42, 0x0D, 0x00, -/* 00009F10 */ 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x62, 0x43, 0x29, 0x23, 0x5C, 0x01, 0x43, 0xF6, -/* 00009F20 */ 0x02, 0x42, 0x42, 0x20, 0x00, 0x77, 0x42, 0x29, 0x24, 0x47, 0x42, 0x29, 0x8F, 0x03, 0x00, 0x00, -/* 00009F30 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x43, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, -/* 00009F40 */ 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x44, 0x0E, 0x00, 0x5C, 0x01, 0x44, 0x62, 0x44, 0x29, -/* 00009F50 */ 0x25, 0x5C, 0x02, 0x44, 0xF6, 0x03, 0x43, 0x43, 0x21, 0x00, 0x77, 0x43, 0x42, 0x26, 0x62, 0x42, -/* 00009F60 */ 0x29, 0x27, 0xA8, 0x43, 0x15, 0x03, 0x00, 0x42, 0x43, 0x09, 0x0C, 0x00, 0x62, 0x42, 0x29, 0x28, -/* 00009F70 */ 0x43, 0x42, 0x42, 0x20, 0x77, 0x42, 0x29, 0x1D, 0x77, 0x06, 0x29, 0x29, 0xA8, 0x00, 0x24, 0x00, -/* 00009F80 */ 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, -/* 00009F90 */ 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x7E, -/* 00009FA0 */ 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x84, -/* 00009FB0 */ 0x02, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, 0x02, -/* 00009FC0 */ 0xFE, 0x63, 0x02, 0xFE, 0x64, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x7B, 0x02, 0xFE, 0x82, 0x02, 0xFE, -/* 00009FD0 */ 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x81, -/* 00009FE0 */ 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x17, 0x02, -/* 00009FF0 */ 0xFE, 0x86, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x89, 0x02, 0xFE, -/* 0000A000 */ 0x8B, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x91, -/* 0000A010 */ 0x02, 0xFE, 0x23, 0x02, 0xFE, 0x18, 0x02, 0xFE, 0x18, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x24, 0x02, -/* 0000A020 */ 0xFE, 0x92, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x23, 0x02, 0xFE, -/* 0000A030 */ 0x6C, 0x02, 0x00, 0xFF, 0x81, 0x1C, 0x01, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, -/* 0000A040 */ 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x9F, 0x00, 0x22, 0x00, 0x71, 0x00, 0x04, 0x00, 0x67, -/* 0000A050 */ 0x00, 0x26, 0x00, 0x46, 0x00, 0x37, 0x00, 0x71, 0x00, 0x2E, 0x00, 0x60, 0x00, 0x0A, 0x00, 0x32, -/* 0000A060 */ 0x00, 0x25, 0x00, 0x6C, 0x00, 0x1F, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x1C, 0x00, 0x6C, -/* 0000A070 */ 0x00, 0x3D, 0x00, 0x6F, 0x00, 0x3D, 0x00, 0x67, 0x00, 0x39, 0x00, 0x64, 0x00, 0x45, 0x00, 0x81, -/* 0000A080 */ 0x00, 0x39, 0x00, 0x62, 0x00, 0x39, 0x00, 0x64, 0x00, 0x39, 0x00, 0x68, 0x00, 0x39, 0x00, 0x68, -/* 0000A090 */ 0x00, 0x39, 0x00, 0x70, 0x00, 0x40, 0x00, 0x6F, 0x00, 0x37, 0x00, 0x77, 0x00, 0x28, 0x00, 0x71, -/* 0000A0A0 */ 0x00, 0x6F, 0x00, 0xD0, 0x01, 0x1E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x9A, 0x00, 0x04, 0x00, 0x34, -/* 0000A0B0 */ 0x00, 0x04, 0x00, 0x36, 0x00, 0x08, 0x00, 0x68, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x2C, -/* 0000A0C0 */ 0x00, 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x30, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, -/* 0000A0D0 */ 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x32, -/* 0000A0E0 */ 0x00, 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0xFA, 0x02, 0x06, 0x00, 0x93, -/* 0000A0F0 */ 0x00, 0x26, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x1B, 0x00, 0xEF, 0x00, 0x26, 0x00, 0x54, -/* 0000A100 */ 0x00, 0x27, 0x00, 0x6A, 0x00, 0x04, 0x00, 0x37, 0x00, 0x07, 0x00, 0x5A, 0x00, 0x34, 0x00, 0xDE, -/* 0000A110 */ 0x00, 0x26, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x1B, 0x00, 0x77, 0x01, 0x1D, 0x00, 0x77, -/* 0000A120 */ 0x00, 0x25, 0x00, 0x66, 0x00, 0x35, 0x00, 0x82, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x0C, 0x00, 0x6D, -/* 0000A130 */ 0x00, 0x06, 0x00, 0x3F, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x8F, 0xFC, 0x07, 0xFE, 0x07, 0x04, -/* 0000A140 */ 0xFE, 0x88, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x46, 0x00, 0xFF, 0xED, 0x0E, 0x01, 0x00, -/* 0000A150 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFF, 0xED, 0x0E, 0x01, 0x00, 0xFE, 0x2D, 0x0D, 0xFE, -/* 0000A160 */ 0x2D, 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, 0xC8, 0xBB, 0x03, 0x02, 0x10, 0x07, 0x0A, 0x0A, 0x0A, -/* 0000A170 */ 0x0A, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A180 */ 0xFF, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A190 */ 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x32, 0x04, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x03, 0x02, -/* 0000A1A0 */ 0x00, 0xFE, 0x33, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x34, 0x04, 0x02, 0x00, -/* 0000A1B0 */ 0xFE, 0x27, 0x04, 0x02, 0x00, 0xFE, 0x35, 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, -/* 0000A1C0 */ 0x0E, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, -/* 0000A1D0 */ 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0x02, 0x00, 0xFE, 0x36, 0x04, 0xFE, 0x6E, 0x03, 0xA8, 0x14, -/* 0000A1E0 */ 0x62, 0x16, 0x13, 0x00, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, -/* 0000A1F0 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, -/* 0000A200 */ 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x00, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x02, 0x00, -/* 0000A210 */ 0x00, 0xEE, 0x04, 0x16, 0x16, 0x00, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x01, 0xA8, 0x17, -/* 0000A220 */ 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x00, 0x00, 0x62, 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, 0x16, -/* 0000A230 */ 0x04, 0x09, 0xAA, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, -/* 0000A240 */ 0x6D, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x00, -/* 0000A250 */ 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x14, 0x16, -/* 0000A260 */ 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x38, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, -/* 0000A270 */ 0x00, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x13, -/* 0000A280 */ 0x00, 0x00, 0x00, 0x17, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x06, 0x03, 0x00, 0xC3, 0x02, -/* 0000A290 */ 0x17, 0x17, 0x03, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0xFF, 0x16, 0x02, 0x00, 0x09, 0x3B, 0x00, -/* 0000A2A0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, -/* 0000A2B0 */ 0x00, 0x03, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x05, 0x00, 0x5C, 0x01, -/* 0000A2C0 */ 0x17, 0x5C, 0x02, 0x12, 0x98, 0x17, 0x14, 0x07, 0x00, 0x00, 0x5C, 0x03, 0x17, 0x5D, 0x04, 0x08, -/* 0000A2D0 */ 0x04, 0x00, 0xEE, 0x05, 0x16, 0x16, 0x04, 0x00, 0x47, 0x12, 0x16, 0x09, 0xB3, 0x00, 0x62, 0x16, -/* 0000A2E0 */ 0x13, 0x02, 0x14, 0x03, 0x00, 0x16, 0x09, 0x09, 0xA7, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 0000A2F0 */ 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, 0x6D, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, -/* 0000A300 */ 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x01, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x03, 0x00, 0x00, -/* 0000A310 */ 0x00, 0x05, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x38, 0x00, 0x8F, 0x03, -/* 0000A320 */ 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, -/* 0000A330 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5D, -/* 0000A340 */ 0x01, 0x06, 0x07, 0x00, 0xC3, 0x02, 0x17, 0x17, 0x07, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0xFF, -/* 0000A350 */ 0x16, 0x06, 0x00, 0x09, 0x3B, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, -/* 0000A360 */ 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, -/* 0000A370 */ 0x00, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x12, 0x98, 0x17, 0x14, 0x07, 0x01, 0x00, -/* 0000A380 */ 0x5C, 0x03, 0x17, 0x5D, 0x04, 0x0A, 0x08, 0x00, 0xEE, 0x05, 0x16, 0x16, 0x08, 0x00, 0x47, 0x12, -/* 0000A390 */ 0x16, 0x62, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x47, 0x00, 0x62, -/* 0000A3A0 */ 0x16, 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x04, 0x09, 0x3B, 0x00, 0x62, 0x16, 0x13, 0x04, 0x15, -/* 0000A3B0 */ 0x03, 0x00, 0x16, 0x0B, 0x09, 0x2F, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -/* 0000A3C0 */ 0x16, 0x00, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, -/* 0000A3D0 */ 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0C, 0x09, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x09, 0x00, -/* 0000A3E0 */ 0x47, 0x12, 0x16, 0x09, 0x3A, 0x00, 0x62, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, -/* 0000A3F0 */ 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, -/* 0000A400 */ 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x04, 0x5C, -/* 0000A410 */ 0x02, 0x17, 0x5D, 0x03, 0x0C, 0x0A, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0A, 0x00, 0x47, 0x12, 0x16, -/* 0000A420 */ 0x62, 0x16, 0x13, 0x05, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, -/* 0000A430 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, -/* 0000A440 */ 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x05, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0D, 0x0B, -/* 0000A450 */ 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0B, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x06, 0xA8, 0x17, -/* 0000A460 */ 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, -/* 0000A470 */ 0x00, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, -/* 0000A480 */ 0x17, 0x13, 0x06, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0E, 0x0C, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0C, -/* 0000A490 */ 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x07, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, -/* 0000A4A0 */ 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, 0x4B, 0x16, -/* 0000A4B0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x07, 0x5C, 0x02, 0x17, -/* 0000A4C0 */ 0x5D, 0x03, 0x0F, 0x0D, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0D, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, -/* 0000A4D0 */ 0x13, 0x08, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 0000A4E0 */ 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, -/* 0000A4F0 */ 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x08, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x10, 0x0E, 0x00, 0xEE, -/* 0000A500 */ 0x04, 0x16, 0x16, 0x0E, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x09, 0xA8, 0x17, 0x15, 0x03, -/* 0000A510 */ 0x00, 0x16, 0x17, 0x09, 0x2C, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, -/* 0000A520 */ 0x00, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, -/* 0000A530 */ 0x09, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x11, 0x0F, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0F, 0x00, 0x47, -/* 0000A540 */ 0x12, 0x16, 0x47, 0x00, 0x12, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x86, -/* 0000A550 */ 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x89, 0x02, -/* 0000A560 */ 0xFE, 0x8B, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8F, 0x02, 0x00, 0x1C, 0xFE, 0x37, -/* 0000A570 */ 0x04, 0x00, 0x1C, 0xFE, 0x37, 0x04, 0x00, 0xFF, 0x3C, 0x0F, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, -/* 0000A580 */ 0x00, 0x0E, 0x00, 0x42, 0x00, 0x2C, 0x00, 0x88, 0x00, 0x0E, 0x00, 0x8E, 0x01, 0x0C, 0x00, 0x3F, -/* 0000A590 */ 0x00, 0x2C, 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x91, 0x00, 0x3E, 0x00, 0x98, -/* 0000A5A0 */ 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x2C, 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x91, -/* 0000A5B0 */ 0x00, 0x3B, 0x00, 0x2F, 0x01, 0x26, 0x00, 0x90, 0x00, 0x2F, 0x00, 0x76, 0x00, 0x0E, 0x00, 0x40, -/* 0000A5C0 */ 0x00, 0x2C, 0x00, 0x8B, 0x00, 0x0E, 0x00, 0x3E, 0x00, 0x2C, 0x00, 0x87, 0x00, 0x0E, 0x00, 0x3F, -/* 0000A5D0 */ 0x00, 0x2C, 0x00, 0x89, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x2C, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x41, -/* 0000A5E0 */ 0x00, 0x2C, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x47, 0x00, 0x2C, 0x00, 0x8C, 0x00, 0x08, 0x00, 0x22, -/* 0000A5F0 */ 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x06, 0x04, 0xFE, 0x74, 0x05, 0x0C, -/* 0000A600 */ 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x45, 0x00, 0xFF, 0x85, 0x09, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, -/* 0000A610 */ 0x00, 0x04, 0x04, 0xFF, 0x85, 0x09, 0x01, 0x00, 0xFE, 0xF8, 0x04, 0xFE, 0xF8, 0x04, 0x01, 0x09, -/* 0000A620 */ 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, -/* 0000A630 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, 0xFF, 0xFF, -/* 0000A640 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, -/* 0000A650 */ 0xFE, 0x22, 0x04, 0x02, 0x00, 0xFE, 0x2D, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, 0x2E, 0x04, 0x02, -/* 0000A660 */ 0x00, 0xFE, 0x25, 0x04, 0x02, 0x00, 0xFE, 0x26, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x01, 0x00, -/* 0000A670 */ 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x28, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 0000A680 */ 0x2F, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x30, 0x04, 0x02, 0x00, 0xFE, 0x31, -/* 0000A690 */ 0x04, 0xFE, 0x44, 0x01, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, -/* 0000A6A0 */ 0x6D, 0x16, 0x17, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x11, 0x8F, 0x03, 0x00, -/* 0000A6B0 */ 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, -/* 0000A6C0 */ 0x19, 0x02, 0x13, 0x03, 0x5C, 0x01, 0x19, 0xEE, 0x02, 0x18, 0x18, 0x01, 0x00, 0x5C, 0x02, 0x18, -/* 0000A6D0 */ 0xF2, 0x03, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, -/* 0000A6E0 */ 0x14, 0x05, 0x09, 0x48, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x02, -/* 0000A6F0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, -/* 0000A700 */ 0x17, 0x03, 0x00, 0x07, 0x02, 0x00, 0xFC, 0x18, 0x06, 0x11, 0x06, 0xFE, 0x18, 0x07, 0x02, 0x02, -/* 0000A710 */ 0xFE, 0x18, 0x13, 0x08, 0x04, 0x5C, 0x01, 0x18, 0xC3, 0x02, 0x17, 0x17, 0x03, 0x00, 0x5C, 0x01, -/* 0000A720 */ 0x17, 0xEE, 0x02, 0xFF, 0x16, 0x02, 0x00, 0x47, 0x00, 0x11, 0x09, 0xA9, 0x00, 0x14, 0x03, 0x00, -/* 0000A730 */ 0x12, 0x09, 0x09, 0x47, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x04, -/* 0000A740 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, -/* 0000A750 */ 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x98, 0x17, 0x14, 0x0A, 0x00, 0x00, 0x5C, -/* 0000A760 */ 0x03, 0x17, 0x98, 0x17, 0x14, 0x0C, 0x01, 0x00, 0xFB, 0x17, 0x0B, 0x17, 0x0D, 0x5C, 0x04, 0x17, -/* 0000A770 */ 0xEE, 0x05, 0x00, 0x16, 0x04, 0x00, 0x09, 0x5D, 0x00, 0x09, 0x52, 0x00, 0x98, 0x16, 0x14, 0x0E, -/* 0000A780 */ 0x02, 0x00, 0x15, 0x03, 0x00, 0x16, 0x0F, 0x09, 0x44, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, -/* 0000A790 */ 0x00, 0x00, 0x00, 0x16, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, -/* 0000A7A0 */ 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x98, 0x17, -/* 0000A7B0 */ 0x14, 0x0A, 0x03, 0x00, 0x5C, 0x03, 0x17, 0x98, 0x17, 0x14, 0x0C, 0x04, 0x00, 0xFB, 0x17, 0x0B, -/* 0000A7C0 */ 0x17, 0x10, 0x5C, 0x04, 0x17, 0xEE, 0x05, 0x00, 0x16, 0x05, 0x00, 0x09, 0x08, 0x00, 0x47, 0x00, -/* 0000A7D0 */ 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, 0xFF, 0xAC, -/* 0000A7E0 */ 0x0A, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x91, 0x00, 0x08, 0x00, 0x2A, 0x00, -/* 0000A7F0 */ 0x42, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x08, 0x00, 0x33, 0x00, 0x47, 0x00, 0x81, 0x00, -/* 0000A800 */ 0x0E, 0x00, 0x32, 0x00, 0x44, 0x00, 0x8A, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0xFC, 0x2A, -/* 0000A810 */ 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x05, 0x04, 0xFE, 0x63, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, -/* 0000A820 */ 0x44, 0x00, 0xFF, 0x57, 0x04, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x57, -/* 0000A830 */ 0x04, 0x01, 0x00, 0xFE, 0x20, 0x05, 0xFE, 0x20, 0x05, 0x01, 0x09, 0x14, 0x19, 0x07, 0x50, 0x4B, -/* 0000A840 */ 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A850 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x22, 0x04, 0x02, 0x00, -/* 0000A870 */ 0xFE, 0x23, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, 0x24, 0x04, 0x02, 0x00, 0xFE, 0x25, 0x04, 0x02, -/* 0000A880 */ 0x00, 0xFE, 0x26, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x27, 0x04, 0x02, 0x00, -/* 0000A890 */ 0xFE, 0x16, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x28, 0x04, 0x01, 0x01, 0x00, -/* 0000A8A0 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x29, 0x04, 0x02, 0x01, 0xFE, 0x2A, 0x04, 0x02, 0x00, 0xFE, 0x14, -/* 0000A8B0 */ 0x04, 0x02, 0x00, 0xFE, 0x2B, 0x04, 0x02, 0x00, 0xFE, 0x2C, 0x04, 0xFE, 0x73, 0x01, 0x8F, 0x03, -/* 0000A8C0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, -/* 0000A8D0 */ 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x14, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, -/* 0000A8E0 */ 0x1B, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, 0x1C, 0x02, 0x16, 0x03, 0x5C, 0x01, -/* 0000A8F0 */ 0x1C, 0xEE, 0x02, 0x1B, 0x1B, 0x01, 0x00, 0x5C, 0x02, 0x1B, 0xF2, 0x03, 0x19, 0x19, 0x00, 0x00, -/* 0000A900 */ 0x00, 0x00, 0x00, 0x00, 0x47, 0x17, 0x19, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x48, 0x00, 0x8F, -/* 0000A910 */ 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000A920 */ 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x1A, 0x03, 0x00, 0x07, 0x02, 0x00, -/* 0000A930 */ 0xFC, 0x1B, 0x06, 0x14, 0x06, 0xFE, 0x1B, 0x07, 0x02, 0x02, 0xFE, 0x1B, 0x16, 0x08, 0x04, 0x5C, -/* 0000A940 */ 0x01, 0x1B, 0xC3, 0x02, 0x1A, 0x1A, 0x03, 0x00, 0x5C, 0x01, 0x1A, 0xEE, 0x02, 0xFF, 0x19, 0x02, -/* 0000A950 */ 0x00, 0x47, 0x00, 0x14, 0x09, 0xD8, 0x00, 0x98, 0x19, 0x17, 0x09, 0x00, 0x00, 0x15, 0x03, 0x00, -/* 0000A960 */ 0x19, 0x0A, 0x09, 0x5A, 0x00, 0x14, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x52, 0x00, 0x8F, 0x03, 0x00, -/* 0000A970 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, -/* 0000A980 */ 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1A, 0x05, 0x00, 0x5C, 0x01, 0x1A, 0x5C, 0x02, -/* 0000A990 */ 0x14, 0x98, 0x1A, 0x17, 0x0C, 0x01, 0x00, 0x5C, 0x03, 0x1A, 0x98, 0x1A, 0x17, 0x0E, 0x02, 0x00, -/* 0000A9A0 */ 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, 0x2F, 0x1A, 0x1A, 0x0A, 0x2F, 0x1A, 0x1A, 0x10, -/* 0000A9B0 */ 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0x00, 0x19, 0x04, 0x00, 0x09, 0x73, 0x00, 0x09, 0x68, 0x00, 0x15, -/* 0000A9C0 */ 0x03, 0x00, 0x15, 0x0B, 0x09, 0x60, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000A9D0 */ 0x19, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, -/* 0000A9E0 */ 0x00, 0x00, 0x1A, 0x05, 0x00, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x98, 0x1A, 0x17, 0x0C, 0x03, -/* 0000A9F0 */ 0x00, 0x5C, 0x03, 0x1A, 0x98, 0x1A, 0x17, 0x0E, 0x04, 0x00, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, -/* 0000AA00 */ 0x1A, 0x0F, 0x14, 0x03, 0x00, 0x15, 0x11, 0x09, 0x06, 0x00, 0x47, 0x1B, 0x12, 0x09, 0x03, 0x00, -/* 0000AA10 */ 0x47, 0x1B, 0x13, 0x2F, 0x1A, 0x1A, 0x1B, 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0xEE, 0x05, -/* 0000AA20 */ 0x00, 0x19, 0x05, 0x00, 0x09, 0x08, 0x00, 0x47, 0x00, 0x14, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000AA30 */ 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, 0xFF, 0x2D, 0x05, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000AA40 */ 0x00, 0x49, 0x00, 0x0F, 0x01, 0x08, 0x00, 0x2A, 0x00, 0x42, 0x00, 0xF5, 0x00, 0x06, 0x00, 0x39, -/* 0000AA50 */ 0x00, 0x16, 0x00, 0x47, 0x00, 0x52, 0x00, 0x85, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC4, -/* 0000AA60 */ 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0xDC, 0x0A, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x04, 0x04, -/* 0000AA70 */ 0xFE, 0x5A, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x43, 0x00, 0xFF, 0xF0, 0x02, 0x01, 0x00, -/* 0000AA80 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0xF0, 0x02, 0x01, 0x00, 0xE9, 0xE9, 0x01, 0x03, -/* 0000AA90 */ 0x05, 0x07, 0x0E, 0x0B, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AAA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AAB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, 0x01, 0xFE, -/* 0000AAC0 */ 0xF6, 0x02, 0x02, 0x00, 0xFE, 0xEA, 0x03, 0x34, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, -/* 0000AAD0 */ 0x09, 0x06, 0x00, 0x47, 0x00, 0x03, 0x09, 0x21, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000AAE0 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0x47, 0x00, 0x07, 0x0F, 0x03, -/* 0000AAF0 */ 0x00, 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, -/* 0000AB00 */ 0x2B, 0x03, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x06, 0x00, 0x2E, -/* 0000AB10 */ 0x00, 0x21, 0x00, 0x44, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0x03, 0x04, -/* 0000AB20 */ 0xFE, 0x1A, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x41, 0x00, 0xFE, 0x78, 0xF7, 0x01, 0xFF, -/* 0000AB30 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x78, 0xF7, 0xFE, 0x95, 0x09, 0xFE, 0x95, 0x09, 0x02, -/* 0000AB40 */ 0x06, 0x17, 0x1B, 0x05, 0xCC, 0xCA, 0x03, 0x0D, 0x02, 0x07, 0x05, 0x05, 0x05, 0x05, 0x18, 0xFF, -/* 0000AB50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AB60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x13, 0x04, 0x02, 0x00, 0xFE, 0x14, -/* 0000AB70 */ 0x04, 0x02, 0x00, 0xFE, 0x15, 0x04, 0x04, 0x02, 0x00, 0xFE, 0x16, 0x04, 0x02, 0x00, 0xFE, 0x17, -/* 0000AB80 */ 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x02, 0x00, 0xFE, 0x19, 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, -/* 0000AB90 */ 0x02, 0x00, 0xFE, 0x1A, 0x04, 0x02, 0x00, 0xFE, 0x1B, 0x04, 0x02, 0x00, 0xFE, 0x1C, 0x04, 0x02, -/* 0000ABA0 */ 0x00, 0xFE, 0x1D, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x00, 0xFE, 0x1E, 0x04, 0x02, 0x00, -/* 0000ABB0 */ 0xFE, 0x1F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, -/* 0000ABC0 */ 0x12, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x20, 0x04, 0xFE, 0x4D, 0x04, 0x96, -/* 0000ABD0 */ 0x03, 0x00, 0x00, 0x00, 0x17, 0xCE, 0x1B, 0x00, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x1B, -/* 0000ABE0 */ 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x00, 0x0F, 0x03, 0x00, 0x1B, -/* 0000ABF0 */ 0x09, 0xAD, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x00, 0x14, -/* 0000AC00 */ 0x17, 0x00, 0x1B, 0x02, 0x09, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, -/* 0000AC10 */ 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x3A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000AC20 */ 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, -/* 0000AC30 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, -/* 0000AC40 */ 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x04, 0x00, 0x00, 0xEE, 0x04, 0xFF, 0x1B, -/* 0000AC50 */ 0x00, 0x00, 0x09, 0x4B, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, -/* 0000AC60 */ 0x00, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x37, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000AC70 */ 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000AC80 */ 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, -/* 0000AC90 */ 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x07, 0x01, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x01, 0x00, -/* 0000ACA0 */ 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x0F, 0x03, 0x00, 0x1B, -/* 0000ACB0 */ 0x09, 0x99, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x14, -/* 0000ACC0 */ 0x03, 0x00, 0x1B, 0x08, 0x09, 0x3A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000ACD0 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000ACE0 */ 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, -/* 0000ACF0 */ 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x09, 0x02, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x02, 0x00, 0x09, 0x4B, -/* 0000AD00 */ 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, -/* 0000AD10 */ 0x1B, 0x0A, 0x09, 0x37, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, -/* 0000AD20 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, -/* 0000AD30 */ 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, -/* 0000AD40 */ 0x1C, 0x5D, 0x03, 0x0B, 0x03, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x03, 0x00, 0x93, 0x03, 0x00, 0x00, -/* 0000AD50 */ 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x0F, 0x01, 0x93, -/* 0000AD60 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x17, 0x00, 0x1B, 0x08, -/* 0000AD70 */ 0x09, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, -/* 0000AD80 */ 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x3A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000AD90 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000ADA0 */ 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, -/* 0000ADB0 */ 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0C, 0x04, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x04, 0x00, 0x09, 0xAD, -/* 0000ADC0 */ 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x17, 0x00, -/* 0000ADD0 */ 0x1B, 0x03, 0x09, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, -/* 0000ADE0 */ 0x02, 0x14, 0x03, 0x00, 0x1B, 0x02, 0x09, 0x3A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000ADF0 */ 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000AE00 */ 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, -/* 0000AE10 */ 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0D, 0x05, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x05, 0x00, -/* 0000AE20 */ 0x09, 0x4B, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, -/* 0000AE30 */ 0x03, 0x00, 0x1B, 0x06, 0x09, 0x37, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000AE40 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000AE50 */ 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, -/* 0000AE60 */ 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0E, 0x06, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x06, 0x00, 0x93, 0x03, -/* 0000AE70 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x03, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x37, -/* 0000AE80 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, -/* 0000AE90 */ 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, -/* 0000AEA0 */ 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0F, -/* 0000AEB0 */ 0x07, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x07, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000AEC0 */ 0x62, 0x1B, 0x1B, 0x04, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x99, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, -/* 0000AED0 */ 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x3A, 0x00, 0x8F, -/* 0000AEE0 */ 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000AEF0 */ 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, -/* 0000AF00 */ 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x10, 0x08, 0x00, -/* 0000AF10 */ 0xEE, 0x04, 0xFF, 0x1B, 0x08, 0x00, 0x09, 0x4B, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, -/* 0000AF20 */ 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x37, 0x00, 0x8F, 0x03, 0x00, -/* 0000AF30 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, -/* 0000AF40 */ 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, -/* 0000AF50 */ 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x11, 0x09, 0x00, 0xEE, 0x04, -/* 0000AF60 */ 0xFF, 0x1B, 0x09, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, -/* 0000AF70 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, -/* 0000AF80 */ 0x04, 0x00, 0x5C, 0x01, 0x1C, 0xCE, 0x1C, 0x03, 0x01, 0x00, 0xA1, 0x00, 0x12, 0x1C, 0xA1, 0x01, -/* 0000AF90 */ 0x13, 0x1C, 0xA1, 0x02, 0x14, 0x1C, 0x5C, 0x02, 0x1C, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x5C, -/* 0000AFA0 */ 0x03, 0x1C, 0xEE, 0x04, 0xFF, 0x1B, 0x0A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, -/* 0000AFB0 */ 0x00, 0x1B, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, -/* 0000AFC0 */ 0x03, 0x00, 0x5C, 0x01, 0x1C, 0xEE, 0x02, 0x1B, 0x1B, 0x0B, 0x00, 0x11, 0x03, 0x00, 0x1B, 0x15, -/* 0000AFD0 */ 0x09, 0x3D, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x07, -/* 0000AFE0 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x06, -/* 0000AFF0 */ 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, -/* 0000B000 */ 0x03, 0x16, 0x0C, 0x00, 0xEE, 0x04, 0x1B, 0x1B, 0x0C, 0x00, 0x47, 0x00, 0x1B, 0x09, 0x05, 0x00, -/* 0000B010 */ 0xA8, 0x1B, 0x47, 0x00, 0x1B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x7B, -/* 0000B020 */ 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x21, 0x04, -/* 0000B030 */ 0xFE, 0xFB, 0x01, 0x00, 0xFE, 0xB9, 0xF7, 0x1C, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x24, 0x00, -/* 0000B040 */ 0x13, 0x00, 0x2B, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x3A, 0x00, 0x63, 0x00, 0x14, 0x00, 0x3A, 0x00, -/* 0000B050 */ 0x37, 0x00, 0xA5, 0x00, 0x13, 0x00, 0x28, 0x00, 0x14, 0x00, 0x3A, 0x00, 0x3A, 0x00, 0x5E, 0x00, -/* 0000B060 */ 0x14, 0x00, 0x3A, 0x00, 0x37, 0x00, 0x75, 0x00, 0x13, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5A, 0x00, -/* 0000B070 */ 0x3A, 0x00, 0x5A, 0x00, 0x28, 0x00, 0x57, 0x00, 0x3A, 0x00, 0x5F, 0x00, 0x14, 0x00, 0x38, 0x00, -/* 0000B080 */ 0x37, 0x00, 0x76, 0x00, 0x13, 0x00, 0x27, 0x00, 0x37, 0x00, 0x59, 0x00, 0x13, 0x00, 0x30, 0x00, -/* 0000B090 */ 0x14, 0x00, 0x40, 0x00, 0x3A, 0x00, 0x62, 0x00, 0x14, 0x00, 0x3F, 0x00, 0x37, 0x00, 0x79, 0x00, -/* 0000B0A0 */ 0x44, 0x00, 0x3B, 0x01, 0x72, 0x00, 0x72, 0x00, 0x00, 0xAD, 0xB0, 0x00, 0x00, 0xBF, 0xFC, 0x2A, -/* 0000B0B0 */ 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x44, 0x05, 0x55, 0xFF, 0xA2, 0x41, -/* 0000B0C0 */ 0xD1, 0x00, 0x42, 0x00, 0xFE, 0xA4, 0xFF, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA4, -/* 0000B0D0 */ 0xFF, 0xAC, 0xAC, 0x41, 0x04, 0x03, 0x05, 0x05, 0x10, 0x10, 0x04, 0x01, 0x01, 0x04, 0xFF, 0xFF, -/* 0000B0E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, -/* 0000B0F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, -/* 0000B100 */ 0x56, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x98, 0x05, 0x05, -/* 0000B110 */ 0x03, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x39, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0C, -/* 0000B120 */ 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x04, 0x00, 0x00, -/* 0000B130 */ 0x00, 0x1E, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x5C, 0x01, 0x06, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000B140 */ 0x02, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0xEE, 0x04, 0xFF, -/* 0000B150 */ 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC9, 0xFF, 0x03, 0x00, 0x00, -/* 0000B160 */ 0x00, 0x00, 0x19, 0x00, 0x2C, 0x00, 0x3B, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x4F, -/* 0000B170 */ 0xFC, 0x07, 0xFE, 0x02, 0x04, 0xFE, 0xE7, 0x04, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x40, 0x00, -/* 0000B180 */ 0xFE, 0xBF, 0xED, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xBF, 0xED, 0xFE, 0x21, 0x09, -/* 0000B190 */ 0xFE, 0x21, 0x09, 0x01, 0x07, 0x15, 0x1A, 0x05, 0x93, 0x8D, 0x03, 0x08, 0x03, 0x0C, 0x0C, 0x0C, -/* 0000B1A0 */ 0x0C, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B1B0 */ 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B1C0 */ 0xFF, 0x00, 0x00, 0x03, 0x04, 0x08, 0x02, 0x01, 0xFE, 0x09, 0x04, 0x02, 0x00, 0xFE, 0x0A, 0x04, -/* 0000B1D0 */ 0x09, 0x02, 0x00, 0xFE, 0x0B, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0x02, 0x01, 0xFE, 0x0D, 0x04, -/* 0000B1E0 */ 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x02, -/* 0000B1F0 */ 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, -/* 0000B200 */ 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, -/* 0000B210 */ 0x12, 0x04, 0xFE, 0x9B, 0x02, 0xA8, 0x1A, 0x14, 0x03, 0x00, 0x15, 0x1A, 0x09, 0x28, 0x00, 0x8F, -/* 0000B220 */ 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000B230 */ 0x03, 0xCB, 0x1B, 0x5C, 0x01, 0x1B, 0x5D, 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, 0x1A, 0x1A, 0x00, -/* 0000B240 */ 0x00, 0x47, 0x15, 0x1A, 0x09, 0x26, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, -/* 0000B250 */ 0x1B, 0x01, 0x00, 0x6D, 0x1A, 0x1B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, -/* 0000B260 */ 0xF2, 0x02, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x15, 0x1A, 0x47, 0x18, 0x04, -/* 0000B270 */ 0x14, 0x0B, 0x00, 0x16, 0x05, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x3B, 0x00, -/* 0000B280 */ 0x62, 0x1A, 0x15, 0x01, 0xA8, 0x1B, 0x15, 0x2D, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, -/* 0000B290 */ 0x15, 0x02, 0xA8, 0x1B, 0x15, 0x1F, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x03, -/* 0000B2A0 */ 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x04, 0xA8, 0x1B, -/* 0000B2B0 */ 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, 0x00, 0x47, 0x18, 0x07, 0x14, 0x0B, 0x00, 0x16, 0x08, -/* 0000B2C0 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x2D, 0x00, 0x62, 0x1A, 0x15, 0x05, 0xA8, -/* 0000B2D0 */ 0x1B, 0x15, 0x1F, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x06, 0xA8, 0x1B, 0x15, -/* 0000B2E0 */ 0x11, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x07, 0xA8, 0x1B, 0x15, 0x03, 0x00, -/* 0000B2F0 */ 0x1A, 0x1B, 0x09, 0x03, 0x00, 0x47, 0x18, 0x07, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xD0, 0x00, 0x14, -/* 0000B300 */ 0x0B, 0x00, 0x17, 0x05, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xC0, 0x00, 0x8F, -/* 0000B310 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000B320 */ 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x0A, 0x02, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B330 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, -/* 0000B340 */ 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x02, 0x00, 0x8F, -/* 0000B350 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000B360 */ 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x10, 0x03, 0x00, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, -/* 0000B370 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, -/* 0000B380 */ 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x03, 0x00, 0x8F, -/* 0000B390 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000B3A0 */ 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x11, 0x04, 0x00, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000B3B0 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, -/* 0000B3C0 */ 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x04, 0x00, 0x0F, -/* 0000B3D0 */ 0x03, 0x00, 0x18, 0x09, 0xD0, 0x00, 0x14, 0x0B, 0x00, 0x17, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, -/* 0000B3E0 */ 0x00, 0x17, 0x09, 0x09, 0xC0, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, -/* 0000B3F0 */ 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x12, 0x05, 0x00, -/* 0000B400 */ 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, -/* 0000B410 */ 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, -/* 0000B420 */ 0xEE, 0x04, 0xFF, 0x1A, 0x05, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, -/* 0000B430 */ 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x13, 0x06, 0x00, -/* 0000B440 */ 0xCC, 0x60, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, -/* 0000B450 */ 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, -/* 0000B460 */ 0xEE, 0x04, 0xFF, 0x1A, 0x06, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, -/* 0000B470 */ 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x14, 0x07, 0x00, -/* 0000B480 */ 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, -/* 0000B490 */ 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, -/* 0000B4A0 */ 0xEE, 0x04, 0xFF, 0x1A, 0x07, 0x00, 0x47, 0x00, 0x15, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 0000B4B0 */ 0x06, 0x90, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, -/* 0000B4C0 */ 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x60, -/* 0000B4D0 */ 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, -/* 0000B4E0 */ 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, -/* 0000B4F0 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, -/* 0000B500 */ 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, -/* 0000B510 */ 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, -/* 0000B520 */ 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, -/* 0000B530 */ 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, -/* 0000B540 */ 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, -/* 0000B550 */ 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x52, 0x03, 0xFE, -/* 0000B560 */ 0x7B, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x7F, -/* 0000B570 */ 0x02, 0xFE, 0x81, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB1, 0x01, 0xFE, 0xB2, 0x01, -/* 0000B580 */ 0x00, 0xFE, 0x09, 0xEE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x28, 0x00, 0x4F, -/* 0000B590 */ 0x00, 0x26, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x10, 0x00, 0x45, 0x00, 0x38, 0x00, 0x97, -/* 0000B5A0 */ 0x00, 0x03, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x45, 0x00, 0x2A, 0x00, 0x7A, 0x00, 0x03, 0x00, 0x4F, -/* 0000B5B0 */ 0x00, 0x17, 0x00, 0x57, 0x00, 0x40, 0x00, 0xCB, 0x00, 0x40, 0x00, 0xCC, 0x00, 0x40, 0x00, 0xD8, -/* 0000B5C0 */ 0x00, 0x17, 0x00, 0x57, 0x00, 0x40, 0x00, 0xCB, 0x00, 0x40, 0x00, 0xCD, 0x00, 0x40, 0x00, 0xDB, -/* 0000B5D0 */ 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x04, 0x4F, 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, -/* 0000B5E0 */ 0xFF, 0xFF, 0xFE, 0xD0, 0x03, 0x18, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x37, 0x00, 0xFE, 0x54, 0xB4, -/* 0000B5F0 */ 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x54, 0xB4, 0xFE, 0x76, 0x38, 0xFE, 0x76, -/* 0000B600 */ 0x38, 0x03, 0x0D, 0x2D, 0x33, 0x09, 0xC5, 0xC5, 0x01, 0x0E, 0x01, 0x09, 0x0F, 0x0F, 0x0F, 0x0F, -/* 0000B610 */ 0x07, 0x02, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x33, -/* 0000B620 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC2, 0x03, 0x01, 0x00, 0x00, 0x00, -/* 0000B630 */ 0x00, 0x02, 0x01, 0xFE, 0xC3, 0x03, 0x02, 0x01, 0xFE, 0xC4, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 0000B640 */ 0x02, 0x01, 0xFE, 0xC5, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC6, 0x03, 0x01, -/* 0000B650 */ 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x01, 0xFE, 0xC7, 0x03, 0x02, 0x01, 0xFE, 0xC8, 0x03, -/* 0000B660 */ 0x02, 0x01, 0xFE, 0xC9, 0x03, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xCA, 0x03, 0x02, -/* 0000B670 */ 0x00, 0xFE, 0xCB, 0x03, 0x02, 0x00, 0xFE, 0xCC, 0x03, 0x02, 0x00, 0xFE, 0xCD, 0x03, 0x02, 0x01, -/* 0000B680 */ 0xFE, 0xE6, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x08, 0x02, 0x01, -/* 0000B690 */ 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0xCE, 0x03, 0x02, 0x00, 0xFE, -/* 0000B6A0 */ 0xCF, 0x03, 0x02, 0x00, 0xFE, 0xD0, 0x03, 0x02, 0x00, 0xFE, 0xD1, 0x03, 0x02, 0x00, 0xFE, 0xD2, -/* 0000B6B0 */ 0x03, 0x02, 0x00, 0xFE, 0xD3, 0x03, 0x02, 0x00, 0xFE, 0xD4, 0x03, 0x02, 0x01, 0xFE, 0xD5, 0x03, -/* 0000B6C0 */ 0x02, 0x01, 0xFE, 0xD6, 0x03, 0x02, 0x00, 0xFE, 0xD7, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x09, -/* 0000B6D0 */ 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, -/* 0000B6E0 */ 0x01, 0xFE, 0xD8, 0x03, 0x02, 0x01, 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xD9, 0x03, 0xFE, 0x61, -/* 0000B6F0 */ 0x04, 0xA8, 0x2D, 0xA8, 0x2E, 0xA8, 0x2F, 0x4F, 0x35, 0x96, 0x03, 0x00, 0x00, 0x00, 0x35, 0x4F, -/* 0000B700 */ 0x35, 0x96, 0x04, 0x00, 0x00, 0x00, 0x35, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000B710 */ 0x35, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B720 */ 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7B, 0x03, 0x36, 0x00, 0x7B, 0x03, 0x36, 0x01, 0x7B, 0x06, -/* 0000B730 */ 0x36, 0x02, 0x7B, 0x08, 0x36, 0x03, 0x7B, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x0B, -/* 0000B740 */ 0x00, 0x00, 0xEE, 0x03, 0x35, 0x35, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x35, 0x8F, 0x01, -/* 0000B750 */ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, -/* 0000B760 */ 0xCC, 0x1C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7B, 0x03, 0x36, -/* 0000B770 */ 0x00, 0x7B, 0x03, 0x36, 0x05, 0x7B, 0x06, 0x36, 0x06, 0x7B, 0x08, 0x36, 0x07, 0x7B, 0x0A, 0x36, -/* 0000B780 */ 0x04, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x0B, 0x01, 0x00, 0xEE, 0x03, 0x35, 0x35, 0x01, 0x00, 0x96, -/* 0000B790 */ 0x04, 0x00, 0x00, 0x00, 0x35, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x35, 0x01, -/* 0000B7A0 */ 0x00, 0x14, 0x17, 0x00, 0x35, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, -/* 0000B7B0 */ 0x00, 0x00, 0x35, 0x01, 0x00, 0x14, 0x03, 0x00, 0x35, 0x11, 0x09, 0x8C, 0x03, 0xDE, 0x00, 0x03, -/* 0000B7C0 */ 0x02, 0xB8, 0x35, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x35, 0x95, 0x00, 0x00, -/* 0000B7D0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000B7E0 */ 0x36, 0x02, 0x00, 0x6D, 0x35, 0x36, 0x08, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x36, 0x8F, 0x01, 0x00, -/* 0000B7F0 */ 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x37, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, -/* 0000B800 */ 0x01, 0x12, 0x03, 0x00, 0xB8, 0x39, 0x00, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x38, 0x39, -/* 0000B810 */ 0x5C, 0x02, 0x38, 0xEE, 0x03, 0x37, 0x37, 0x03, 0x00, 0x5C, 0x01, 0x37, 0x5D, 0x02, 0x0A, 0x02, -/* 0000B820 */ 0x00, 0xF2, 0x03, 0xFF, 0x35, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000B830 */ 0x38, 0x00, 0x00, 0x00, 0x35, 0x01, 0x00, 0x14, 0x03, 0x00, 0x35, 0x10, 0x09, 0x0A, 0x03, 0xDE, -/* 0000B840 */ 0x01, 0x04, 0x03, 0xB8, 0x35, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x35, 0x35, 0x01, 0x50, 0x01, -/* 0000B850 */ 0x02, 0x00, 0x00, 0x00, 0x2E, 0x35, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2E, -/* 0000B860 */ 0x01, 0x50, 0x01, 0x03, 0x00, 0x00, 0x00, 0x2F, 0x35, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, -/* 0000B870 */ 0x00, 0x00, 0x2F, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x07, -/* 0000B880 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x13, 0x04, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B890 */ 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x5C, 0x02, 0x36, 0xEE, 0x03, 0xFF, 0x35, 0x04, 0x00, 0x8F, -/* 0000B8A0 */ 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x35, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000B8B0 */ 0x0C, 0x5D, 0x01, 0x14, 0x05, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, -/* 0000B8C0 */ 0x05, 0x00, 0x5C, 0x02, 0x36, 0xEE, 0x03, 0xFF, 0x35, 0x05, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000B8D0 */ 0x1B, 0x00, 0x00, 0x00, 0x35, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, -/* 0000B8E0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x15, 0x06, -/* 0000B8F0 */ 0x00, 0xCC, 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8F, 0x01, -/* 0000B900 */ 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x37, 0x07, 0x00, 0x4B, 0x37, 0x7B, 0x37, 0x36, 0x09, -/* 0000B910 */ 0x7B, 0x18, 0x36, 0x0A, 0x7B, 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x06, -/* 0000B920 */ 0x00, 0xCE, 0x35, 0x0B, 0x00, 0x00, 0xA1, 0x00, 0x1A, 0x35, 0xA1, 0x01, 0x1B, 0x35, 0xA1, 0x02, -/* 0000B930 */ 0x1C, 0x35, 0xA1, 0x03, 0x1D, 0x35, 0xA1, 0x04, 0x1E, 0x35, 0xA1, 0x05, 0x1F, 0x35, 0xA1, 0x06, -/* 0000B940 */ 0x20, 0x35, 0xA1, 0x07, 0x21, 0x35, 0xA1, 0x08, 0x22, 0x35, 0xA1, 0x09, 0x23, 0x35, 0xA1, 0x0A, -/* 0000B950 */ 0x24, 0x35, 0x96, 0x02, 0x00, 0x00, 0x00, 0x35, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000B960 */ 0x00, 0x35, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B970 */ 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x25, 0x07, 0x00, 0xCC, 0x4C, -/* 0000B980 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, -/* 0000B990 */ 0x02, 0x00, 0x00, 0x00, 0x37, 0x04, 0x00, 0x07, 0x01, 0x00, 0xC3, 0x01, 0x37, 0x37, 0x08, 0x00, -/* 0000B9A0 */ 0x7B, 0x37, 0x36, 0x09, 0x7B, 0x26, 0x36, 0x0A, 0x7B, 0x26, 0x36, 0x0C, 0x7B, 0x26, 0x36, 0x0B, -/* 0000B9B0 */ 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x07, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 0000B9C0 */ 0x00, 0x00, 0x35, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, 0x00, 0x00, -/* 0000B9D0 */ 0x02, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x8F, 0x01, -/* 0000B9E0 */ 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x36, 0x08, 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x02, -/* 0000B9F0 */ 0x36, 0xEE, 0x03, 0xFF, 0x35, 0x09, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, -/* 0000BA00 */ 0x35, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000BA10 */ 0x00, 0x00, 0x36, 0x04, 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x28, 0x0A, -/* 0000BA20 */ 0x00, 0xCC, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x91, 0x01, -/* 0000BA30 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x37, 0x04, 0x00, 0x7B, 0x37, 0x36, 0x09, 0x7B, 0x18, -/* 0000BA40 */ 0x36, 0x0A, 0x7B, 0x26, 0x36, 0x0C, 0x7B, 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, -/* 0000BA50 */ 0x35, 0x0A, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x35, 0x06, 0x00, 0x07, -/* 0000BA60 */ 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x04, -/* 0000BA70 */ 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x29, 0x0B, 0x00, 0xCC, 0x7C, 0x00, -/* 0000BA80 */ 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xB8, 0x38, 0x00, 0xB7, 0x01, 0x00, -/* 0000BA90 */ 0x00, 0x00, 0x38, 0x38, 0x01, 0x50, 0x01, 0x04, 0x00, 0x00, 0x00, 0x37, 0x38, 0x7B, 0x37, 0x36, -/* 0000BAA0 */ 0x09, 0x01, 0x64, 0x01, 0x37, 0x36, 0x7B, 0x18, 0x36, 0x0A, 0x7B, 0x26, 0x36, 0x0C, 0x7B, 0x18, -/* 0000BAB0 */ 0x36, 0x0B, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x0B, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000BAC0 */ 0x1B, 0x00, 0x00, 0x00, 0x35, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x00, -/* 0000BAD0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x62, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, -/* 0000BAE0 */ 0x5D, 0x02, 0x2A, 0x0C, 0x00, 0xCC, 0x94, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, -/* 0000BAF0 */ 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x37, 0x03, 0x00, 0x07, 0x03, -/* 0000BB00 */ 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x2C, 0x0D, 0x00, 0xB8, 0x39, 0x00, 0xB7, 0x01, 0x00, 0x00, -/* 0000BB10 */ 0x00, 0x39, 0x39, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, 0x00, 0x38, 0x39, 0x5C, 0x02, 0x38, 0xEE, -/* 0000BB20 */ 0x03, 0x37, 0x37, 0x0D, 0x00, 0x7B, 0x37, 0x36, 0x0E, 0x7B, 0x26, 0x36, 0x0C, 0x7B, 0x18, 0x36, -/* 0000BB30 */ 0x0B, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x0C, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000BB40 */ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 0000BB50 */ 0x24, 0x00, 0x07, 0xA8, 0x00, 0x94, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000BB60 */ 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, -/* 0000BB70 */ 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, -/* 0000BB80 */ 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, -/* 0000BB90 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, -/* 0000BBA0 */ 0x00, 0xB2, 0x01, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000BBB0 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, -/* 0000BBC0 */ 0x00, 0x38, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, -/* 0000BBD0 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, -/* 0000BBE0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00, 0x00, 0xC7, 0x03, 0x00, 0x00, 0xC8, 0x03, 0x00, -/* 0000BBF0 */ 0x00, 0xC9, 0x03, 0x00, 0x00, 0xC6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, -/* 0000BC00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00, 0x00, 0xC3, 0x03, 0x00, 0x00, 0xC4, 0x03, 0x00, -/* 0000BC10 */ 0x00, 0xC5, 0x03, 0x00, 0x00, 0xC6, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xC2, 0x03, 0xFE, 0xC3, 0x03, -/* 0000BC20 */ 0xFE, 0xC4, 0x03, 0xFE, 0xC5, 0x03, 0xFE, 0xC6, 0x03, 0xFE, 0xC7, 0x03, 0xFE, 0xC8, 0x03, 0xFE, -/* 0000BC30 */ 0xC9, 0x03, 0xFE, 0x32, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, -/* 0000BC40 */ 0x01, 0xFE, 0x45, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xFB, 0x01, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, -/* 0000BC50 */ 0x02, 0x02, 0x01, 0x00, 0xFE, 0xDC, 0x03, 0x03, 0x02, 0x00, 0xFE, 0x1A, 0x02, 0x01, 0xFE, 0x1C, -/* 0000BC60 */ 0x02, 0xFE, 0xB9, 0xB4, 0x11, 0x16, 0x00, 0x00, 0x00, 0x47, 0x00, 0x94, 0x01, 0x47, 0x00, 0x0B, -/* 0000BC70 */ 0x02, 0x42, 0x00, 0x21, 0x1C, 0x54, 0x00, 0xAE, 0x02, 0x48, 0x00, 0x6A, 0x06, 0x2C, 0x00, 0x3B, -/* 0000BC80 */ 0x03, 0x2C, 0x00, 0x52, 0x00, 0x56, 0x00, 0x9B, 0x00, 0x37, 0x00, 0x1F, 0x01, 0x61, 0x00, 0x99, -/* 0000BC90 */ 0x00, 0x3E, 0x00, 0x48, 0x00, 0x5C, 0x00, 0x9E, 0x00, 0x68, 0x00, 0xC2, 0x04, 0x7F, 0x00, 0x16, -/* 0000BCA0 */ 0x03, 0x0F, 0x00, 0x84, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0xF9, 0xC6, 0x00, 0x00, 0x29, 0xC5, -/* 0000BCB0 */ 0x00, 0x00, 0x6F, 0xC2, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x00, 0x05, 0xBE, 0x00, 0x00, 0xC2, 0xBC, -/* 0000BCC0 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCE, -/* 0000BCD0 */ 0x04, 0x39, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x3E, 0x00, 0xFE, 0x8B, 0xE9, 0xFF, 0x00, 0x10, 0x01, -/* 0000BCE0 */ 0x00, 0x01, 0x01, 0xFE, 0x8B, 0xE9, 0xFE, 0x56, 0x02, 0xFE, 0x56, 0x02, 0x01, 0x05, 0x05, 0x08, -/* 0000BCF0 */ 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BD00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BD10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, -/* 0000BD20 */ 0x02, 0x00, 0xFE, 0xE4, 0x03, 0x02, 0x01, 0xFE, 0x01, 0x03, 0xAA, 0x5B, 0x05, 0xB4, 0x05, 0x05, -/* 0000BD30 */ 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, -/* 0000BD40 */ 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000BD50 */ 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, -/* 0000BD60 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000BD70 */ 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0xF2, 0x02, -/* 0000BD80 */ 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, -/* 0000BD90 */ 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, 0x02, 0x0F, 0x2D, 0x00, 0x08, 0x09, 0x00, 0x00, -/* 0000BDA0 */ 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, -/* 0000BDB0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, -/* 0000BDC0 */ 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, 0x09, 0x02, -/* 0000BDD0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, -/* 0000BDE0 */ 0xFE, 0x78, 0x02, 0x00, 0xFE, 0xB1, 0xE9, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, -/* 0000BDF0 */ 0x2A, 0x00, 0x84, 0x00, 0x26, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x69, 0x00, 0x2A, 0x00, 0x84, 0x00, -/* 0000BE00 */ 0x09, 0x00, 0x37, 0x00, 0x00, 0x3F, 0xFD, 0x22, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0xA2, 0x03, 0xFE, -/* 0000BE10 */ 0xB8, 0x04, 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, 0x3C, 0x00, 0xFE, 0xB4, 0xE4, 0x01, 0xFF, 0x00, -/* 0000BE20 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xB4, 0xE4, 0xFE, 0x08, 0x04, 0xFE, 0x08, 0x04, 0x02, 0x06, -/* 0000BE30 */ 0x07, 0x0B, 0x05, 0x40, 0x40, 0x04, 0x06, 0x07, 0x03, 0x03, 0x03, 0x03, 0x08, 0xFF, 0xFF, 0xFF, -/* 0000BE40 */ 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BE50 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xE5, 0x03, 0x02, -/* 0000BE60 */ 0x01, 0xFE, 0x01, 0x03, 0x03, 0x04, 0xFE, 0x48, 0x01, 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x2C, 0x0B, -/* 0000BE70 */ 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000BE80 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, -/* 0000BE90 */ 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, -/* 0000BEA0 */ 0x00, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, -/* 0000BEB0 */ 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, -/* 0000BEC0 */ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x93, 0x02, 0x00, 0x00, -/* 0000BED0 */ 0x00, 0x0B, 0x01, 0x00, 0xA8, 0x0C, 0x14, 0x16, 0x00, 0x0B, 0x0C, 0x09, 0x00, 0x00, 0x93, 0x02, -/* 0000BEE0 */ 0x00, 0x00, 0x00, 0x0B, 0x01, 0x00, 0x62, 0x0B, 0x0B, 0x02, 0x0F, 0x2D, 0x00, 0x0B, 0x09, 0x00, -/* 0000BEF0 */ 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, -/* 0000BF00 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, -/* 0000BF10 */ 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, -/* 0000BF20 */ 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0C, 0x5C, -/* 0000BF30 */ 0x01, 0x0C, 0x5D, 0x02, 0x05, 0x03, 0x00, 0xEE, 0x03, 0x0B, 0x0B, 0x03, 0x00, 0x96, 0x03, 0x00, -/* 0000BF40 */ 0x00, 0x00, 0x0B, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x03, 0x00, 0x07, -/* 0000BF50 */ 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0C, 0x04, -/* 0000BF60 */ 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x05, 0x00, -/* 0000BF70 */ 0x5C, 0x02, 0x0C, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x03, 0x0C, 0xEE, 0x04, 0xFF, 0x0B, -/* 0000BF80 */ 0x04, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x07, 0x03, -/* 0000BF90 */ 0x00, 0x5C, 0x00, 0x06, 0x93, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x06, 0x00, 0x5C, 0x01, 0x0C, 0xCB, -/* 0000BFA0 */ 0x0C, 0x5C, 0x02, 0x0C, 0xEE, 0x03, 0x00, 0x0B, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000BFB0 */ 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0xE6, 0x03, 0xFE, -/* 0000BFC0 */ 0x1D, 0x02, 0x00, 0xFE, 0xE9, 0xE4, 0x09, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x2A, -/* 0000BFD0 */ 0x00, 0x8C, 0x00, 0x29, 0x00, 0x4B, 0x00, 0x25, 0x00, 0x69, 0x00, 0x2A, 0x00, 0x8D, 0x00, 0x28, -/* 0000BFE0 */ 0x00, 0x47, 0x00, 0x3F, 0x00, 0x44, 0x01, 0x2D, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0xBF, 0x00, 0x00, -/* 0000BFF0 */ 0xBF, 0xDC, 0x1A, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xC3, 0x04, 0x48, -/* 0000C000 */ 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x3D, 0x00, 0xFE, 0x69, 0xE7, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 0000C010 */ 0x02, 0xFE, 0x69, 0xE7, 0xF8, 0xF8, 0x41, 0x05, 0x04, 0x06, 0x0D, 0x0D, 0x05, 0x01, 0x01, 0x02, -/* 0000C020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, -/* 0000C030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000C040 */ 0x00, 0x02, 0x00, 0xFE, 0xE7, 0x03, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x48, 0x8F, 0x01, 0x00, 0x00, -/* 0000C050 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x2F, 0x07, 0x02, 0x04, 0x2D, 0x06, 0x06, 0x07, -/* 0000C060 */ 0x15, 0x03, 0x00, 0x06, 0x03, 0x09, 0x28, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 0000C070 */ 0x00, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, -/* 0000C080 */ 0x2F, 0x08, 0x02, 0x04, 0x98, 0x07, 0x07, 0x08, 0x00, 0x00, 0x9D, 0x07, 0x06, 0x04, 0x00, 0x00, -/* 0000C090 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x99, 0xE7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1C, -/* 0000C0A0 */ 0x00, 0x5A, 0x00, 0x2A, 0x00, 0x6D, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 0000C0B0 */ 0xD8, 0x03, 0xFE, 0x9C, 0x04, 0x10, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x3B, 0x00, 0xFE, 0xD8, 0xDD, -/* 0000C0C0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xD8, 0xDD, 0xFE, 0xE3, 0x02, 0xFE, 0xE3, 0x02, -/* 0000C0D0 */ 0x01, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, 0x06, 0x03, 0x05, 0x05, 0x05, 0x05, 0xFF, 0xFF, -/* 0000C0E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, -/* 0000C0F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 0000C100 */ 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xE4, 0x03, 0x02, 0x01, 0xFE, 0x01, 0x03, 0x01, 0x00, -/* 0000C110 */ 0x00, 0x00, 0x00, 0x04, 0xFE, 0x21, 0x01, 0x5B, 0x08, 0xB4, 0x08, 0x08, 0x8F, 0x04, 0x00, 0x00, -/* 0000C120 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000C130 */ 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, -/* 0000C140 */ 0x07, 0x0B, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x04, 0x00, -/* 0000C150 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, -/* 0000C160 */ 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x01, 0x00, 0x5D, 0x02, 0x04, 0x01, 0x00, 0xF2, 0x03, 0xFF, -/* 0000C170 */ 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000C180 */ 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, -/* 0000C190 */ 0xF2, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, -/* 0000C1A0 */ 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x62, 0x0B, 0x09, 0x03, 0x0F, 0x2D, 0x00, 0x0B, 0x09, -/* 0000C1B0 */ 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x6D, 0x0B, -/* 0000C1C0 */ 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x03, 0x00, 0x5D, 0x02, 0x04, -/* 0000C1D0 */ 0x03, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x00, 0x00, -/* 0000C1E0 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x04, -/* 0000C1F0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x01, 0x00, 0x6D, 0x0C, 0x0D, 0x04, 0x07, 0x03, -/* 0000C200 */ 0x00, 0x5C, 0x00, 0x0D, 0x2A, 0x0E, 0x05, 0x14, 0x03, 0x00, 0x07, 0x0E, 0x09, 0x06, 0x00, 0x47, -/* 0000C210 */ 0x0E, 0x05, 0x09, 0x03, 0x00, 0x47, 0x0E, 0x07, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x09, 0xF2, 0x03, -/* 0000C220 */ 0x0C, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x04, -/* 0000C230 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x67, 0x02, -/* 0000C240 */ 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x2D, 0x02, 0x00, 0xFE, 0x01, 0xDE, 0x08, 0x05, 0x00, -/* 0000C250 */ 0x00, 0x00, 0x26, 0x00, 0x2F, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x2A, 0x00, 0x7C, 0x00, 0x26, 0x00, -/* 0000C260 */ 0x47, 0x00, 0x15, 0x00, 0x65, 0x00, 0x2A, 0x00, 0xD4, 0x00, 0x5A, 0x00, 0x56, 0x00, 0x00, 0xBF, -/* 0000C270 */ 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x01, 0x03, 0xFE, 0x78, 0x04, 0x10, 0xFF, 0xA1, 0x41, -/* 0000C280 */ 0xE1, 0x00, 0x3A, 0x00, 0xFE, 0x52, 0xD7, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x52, -/* 0000C290 */ 0xD7, 0xFE, 0x2E, 0x06, 0xFE, 0x2E, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x6B, 0x62, 0x04, 0x02, -/* 0000C2A0 */ 0x09, 0x09, 0x08, 0x07, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C2B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C2C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -/* 0000C2D0 */ 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x01, 0x03, 0xFE, 0xDD, 0x01, -/* 0000C2E0 */ 0xAE, 0x0A, 0x5B, 0x0B, 0xB4, 0x0B, 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x4F, 0x0C, 0x4F, 0x0D, 0xA8, -/* 0000C2F0 */ 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x62, 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, -/* 0000C300 */ 0x0F, 0x03, 0x09, 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x04, 0x00, 0x00, 0x47, 0x08, 0x0F, 0x62, 0x0F, -/* 0000C310 */ 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x03, 0x01, 0x00, -/* 0000C320 */ 0x47, 0x09, 0x0F, 0x6B, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, -/* 0000C330 */ 0x00, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000C340 */ 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, -/* 0000C350 */ 0x02, 0x09, 0xC3, 0x03, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x60, 0x01, 0x8F, 0x04, 0x00, 0x00, 0x00, -/* 0000C360 */ 0x31, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x6D, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000C370 */ 0x10, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0C, -/* 0000C380 */ 0x0F, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x07, 0x02, 0x00, -/* 0000C390 */ 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x0F, 0x0F, 0x02, 0x00, 0x0F, 0x28, 0x00, 0x0F, -/* 0000C3A0 */ 0x09, 0x00, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, -/* 0000C3B0 */ 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5D, 0x01, 0x07, 0x03, 0x00, 0xF2, 0x02, -/* 0000C3C0 */ 0xFF, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000C3D0 */ 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, -/* 0000C3E0 */ 0x0C, 0xF2, 0x02, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, -/* 0000C3F0 */ 0x14, 0x03, 0x00, 0x0D, 0x0F, 0x09, 0x4B, 0x00, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, -/* 0000C400 */ 0x00, 0x0F, 0x04, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5D, -/* 0000C410 */ 0x02, 0x02, 0x05, 0x00, 0xEE, 0x03, 0x0F, 0x0F, 0x05, 0x00, 0x47, 0x0D, 0x0F, 0x8F, 0x04, 0x00, -/* 0000C420 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, -/* 0000C430 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0xF2, 0x03, 0xFF, 0x0F, 0x04, 0x00, 0x00, -/* 0000C440 */ 0x00, 0x06, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x05, 0x00, 0x4B, -/* 0000C450 */ 0x0F, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, -/* 0000C460 */ 0xEE, 0x04, 0xFF, 0x0F, 0x07, 0x00, 0x47, 0x0F, 0x0D, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000C470 */ 0x00, 0x00, 0x10, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x04, 0x00, 0x00, 0x00, -/* 0000C480 */ 0x20, 0x00, 0x00, 0x00, 0x11, 0x07, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, -/* 0000C490 */ 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0C, 0xEE, 0x04, -/* 0000C4A0 */ 0x10, 0x10, 0x08, 0x00, 0x77, 0x10, 0x0F, 0x05, 0x62, 0x0F, 0x0D, 0x06, 0x82, 0x0F, 0x0F, 0x28, -/* 0000C4B0 */ 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, -/* 0000C4C0 */ 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x78, 0x02, 0xFE, -/* 0000C4D0 */ 0x78, 0x02, 0xDB, 0x00, 0xFE, 0xCF, 0xD8, 0x14, 0x0F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0x00, -/* 0000C4E0 */ 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, 0x00, -/* 0000C4F0 */ 0x09, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x20, 0x00, 0x56, 0x00, 0x26, 0x00, 0x38, 0x00, -/* 0000C500 */ 0x22, 0x00, 0x38, 0x00, 0x25, 0x00, 0x9B, 0x00, 0x26, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, -/* 0000C510 */ 0x25, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x58, 0x00, 0x23, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x65, 0x00, -/* 0000C520 */ 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x1F, 0xFC, 0x07, -/* 0000C530 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x6A, 0x04, 0x62, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x39, 0x00, -/* 0000C540 */ 0xFE, 0xCF, 0xD4, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xCF, 0xD4, 0xFE, 0x44, 0x02, -/* 0000C550 */ 0xFE, 0x44, 0x02, 0x03, 0x09, 0x09, 0x0E, 0x07, 0x40, 0x3C, 0x03, 0x02, 0x06, 0x06, 0x03, 0x03, -/* 0000C560 */ 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C570 */ 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C580 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x5A, 0x03, 0x02, 0x00, 0xFE, 0xCB, 0x03, 0x02, -/* 0000C590 */ 0x01, 0xFE, 0xCA, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFE, -/* 0000C5A0 */ 0x2A, 0x01, 0xAE, 0x0B, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x2C, 0x0E, 0x09, 0x15, 0x03, 0x00, 0x0E, -/* 0000C5B0 */ 0x03, 0x09, 0x42, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, -/* 0000C5C0 */ 0xE1, 0x0E, 0x09, 0x0E, 0x00, 0x0F, 0x2D, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 0000C5D0 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x00, 0x6D, 0x0E, 0x0F, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 0000C5E0 */ 0x00, 0x0F, 0x5D, 0x01, 0x04, 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x0E, -/* 0000C5F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0E, -/* 0000C600 */ 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5D, 0x02, 0x02, -/* 0000C610 */ 0x01, 0x00, 0xEE, 0x03, 0x0E, 0x0E, 0x01, 0x00, 0x47, 0x0A, 0x0E, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000C620 */ 0x02, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, -/* 0000C630 */ 0x01, 0x0A, 0x98, 0x0F, 0x0B, 0x07, 0x00, 0x00, 0x5C, 0x02, 0x0F, 0x98, 0x0F, 0x0B, 0x08, 0x01, -/* 0000C640 */ 0x00, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0xFF, 0x0E, 0x02, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, -/* 0000C650 */ 0x00, 0x00, 0x00, 0x0F, 0x04, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, -/* 0000C660 */ 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0C, 0x0E, -/* 0000C670 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0E, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000C680 */ 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x6D, 0x0F, -/* 0000C690 */ 0x10, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x2A, 0x11, 0x07, 0x14, 0x03, 0x00, 0x0C, 0x11, -/* 0000C6A0 */ 0x09, 0x06, 0x00, 0x47, 0x11, 0x07, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0C, 0x5C, 0x01, 0x11, 0x5C, -/* 0000C6B0 */ 0x02, 0x0A, 0xF2, 0x03, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5C, 0x01, 0x0F, 0xEE, -/* 0000C6C0 */ 0x02, 0x00, 0x0E, 0x04, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, -/* 0000C6D0 */ 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x2D, 0x02, 0x00, 0xFE, 0xED, 0xD4, 0x07, 0x07, 0x00, 0x00, 0x00, -/* 0000C6E0 */ 0x23, 0x00, 0x53, 0x00, 0x2A, 0x00, 0x70, 0x00, 0x25, 0x00, 0x3A, 0x00, 0x2F, 0x00, 0x52, 0x00, -/* 0000C6F0 */ 0x26, 0x00, 0x85, 0x00, 0x5A, 0x00, 0x51, 0x00, 0x00, 0xBF, 0xFC, 0x42, 0x06, 0x0F, 0xFD, 0x07, -/* 0000C700 */ 0xFE, 0xDC, 0x03, 0xFE, 0xE2, 0x03, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x38, 0x00, 0xFE, 0x98, -/* 0000C710 */ 0xB8, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x98, 0xB8, 0xFE, 0xD3, 0x1B, 0xFE, 0xD3, -/* 0000C720 */ 0x1B, 0x45, 0x18, 0x23, 0x37, 0x07, 0xFE, 0x9B, 0x01, 0xFE, 0x7B, 0x01, 0x03, 0x04, 0x22, 0x13, -/* 0000C730 */ 0x25, 0x25, 0x25, 0x25, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C740 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x36, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C750 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, -/* 0000C760 */ 0x01, 0x03, 0x08, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x01, -/* 0000C770 */ 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x00, 0xFE, -/* 0000C780 */ 0xCF, 0x03, 0x02, 0x00, 0xFE, 0xDD, 0x03, 0x02, 0x00, 0xFE, 0xDE, 0x03, 0x02, 0x00, 0xFE, 0xD0, -/* 0000C790 */ 0x03, 0x02, 0x00, 0xFE, 0xD1, 0x03, 0x02, 0x00, 0xFE, 0xDF, 0x03, 0x02, 0x01, 0xFE, 0xE0, 0x03, -/* 0000C7A0 */ 0x02, 0x01, 0xFE, 0xE4, 0x02, 0x02, 0x00, 0xFE, 0xD2, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, -/* 0000C7B0 */ 0x15, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xD5, 0x03, 0x02, 0x01, 0xFE, 0xD6, 0x03, 0x02, 0x00, -/* 0000C7C0 */ 0xFE, 0xD7, 0x03, 0x02, 0x01, 0xFE, 0x58, 0x03, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x00, 0xFE, -/* 0000C7D0 */ 0xD3, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, -/* 0000C7E0 */ 0x00, 0x02, 0x00, 0xFE, 0xD4, 0x03, 0x02, 0x00, 0xFE, 0xE2, 0x03, 0xFE, 0x05, 0x07, 0x2C, 0x38, -/* 0000C7F0 */ 0x23, 0x0D, 0x03, 0x00, 0x38, 0x02, 0x09, 0x1C, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000C800 */ 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF6, -/* 0000C810 */ 0x01, 0xFF, 0x38, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x38, 0x01, -/* 0000C820 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, -/* 0000C830 */ 0x39, 0x02, 0x00, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x23, 0x5C, 0x03, 0x03, 0xF6, 0x04, 0x38, 0x38, -/* 0000C840 */ 0x01, 0x00, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x2D, 0x00, 0x62, 0x38, 0x23, 0x01, 0x0F, 0x03, 0x00, -/* 0000C850 */ 0x38, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, -/* 0000C860 */ 0x6D, 0x38, 0x39, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, -/* 0000C870 */ 0xF6, 0x03, 0xFF, 0x38, 0x02, 0x00, 0x77, 0x06, 0x23, 0x03, 0x2C, 0x38, 0x25, 0x14, 0x03, 0x00, -/* 0000C880 */ 0x38, 0x07, 0x09, 0x26, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x38, 0x03, -/* 0000C890 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x39, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x08, 0xF6, -/* 0000C8A0 */ 0x03, 0x38, 0x38, 0x03, 0x00, 0x47, 0x25, 0x38, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000C8B0 */ 0x31, 0x00, 0x00, 0x00, 0x39, 0x04, 0x00, 0x6D, 0x38, 0x39, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000C8C0 */ 0x39, 0x5C, 0x01, 0x25, 0xF6, 0x02, 0x38, 0x38, 0x04, 0x00, 0x47, 0x25, 0x38, 0x8F, 0x03, 0x00, -/* 0000C8D0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000C8E0 */ 0x01, 0x25, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCE, 0x39, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, -/* 0000C8F0 */ 0x39, 0xA1, 0x01, 0x0C, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0C, 0xF6, 0x06, 0x38, 0x38, 0x05, -/* 0000C900 */ 0x00, 0x47, 0x28, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, -/* 0000C910 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCE, -/* 0000C920 */ 0x39, 0x03, 0x01, 0x00, 0xA1, 0x00, 0x0E, 0x39, 0xA1, 0x01, 0x0F, 0x39, 0xA1, 0x02, 0x10, 0x39, -/* 0000C930 */ 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0E, 0xF6, 0x06, 0x38, 0x38, 0x06, 0x00, 0x47, 0x29, 0x38, 0x8F, -/* 0000C940 */ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, -/* 0000C950 */ 0x05, 0x47, 0x2A, 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, 0x09, 0x18, 0x00, 0x8F, 0x02, 0x00, 0x00, -/* 0000C960 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x06, 0x47, 0x2A, -/* 0000C970 */ 0x38, 0x09, 0x1D, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x15, 0x00, 0x8F, 0x02, 0x00, 0x00, -/* 0000C980 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x07, 0x47, 0x2A, -/* 0000C990 */ 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, -/* 0000C9A0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xA8, 0x39, 0x5C, 0x04, -/* 0000C9B0 */ 0x39, 0xA8, 0x39, 0x5C, 0x05, 0x39, 0xF6, 0x06, 0x38, 0x38, 0x07, 0x00, 0x47, 0x2B, 0x38, 0x8F, -/* 0000C9C0 */ 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000C9D0 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0A, 0xCE, 0x39, 0x03, 0x02, 0x00, 0xA1, -/* 0000C9E0 */ 0x00, 0x12, 0x39, 0xA1, 0x01, 0x13, 0x39, 0xA1, 0x02, 0x14, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, -/* 0000C9F0 */ 0x13, 0xF6, 0x06, 0x38, 0x38, 0x08, 0x00, 0x47, 0x2C, 0x38, 0xA8, 0x38, 0x47, 0x2D, 0x38, 0x8F, -/* 0000CA00 */ 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000CA10 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, -/* 0000CA20 */ 0xF6, 0x06, 0x38, 0x38, 0x09, 0x00, 0x47, 0x2E, 0x38, 0xA8, 0x38, 0x47, 0x2F, 0x38, 0xA8, 0x38, -/* 0000CA30 */ 0x47, 0x30, 0x38, 0xA8, 0x38, 0x47, 0x31, 0x38, 0x62, 0x38, 0x25, 0x08, 0x47, 0x32, 0x38, 0x62, -/* 0000CA40 */ 0x38, 0x25, 0x09, 0x47, 0x33, 0x38, 0x2C, 0x38, 0x32, 0x15, 0x0E, 0x00, 0x38, 0x07, 0x09, 0x00, -/* 0000CA50 */ 0x00, 0x2C, 0x38, 0x33, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x54, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 0000CA60 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000CA70 */ 0x25, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0xF6, 0x06, 0x38, -/* 0000CA80 */ 0x38, 0x0A, 0x00, 0x47, 0x32, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, -/* 0000CA90 */ 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x19, 0x5C, 0x03, -/* 0000CAA0 */ 0x32, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x17, 0xF6, 0x06, 0x38, 0x38, 0x0B, 0x00, 0x47, 0x33, 0x38, -/* 0000CAB0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, -/* 0000CAC0 */ 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x1B, 0xA8, 0x39, 0x5C, 0x04, 0x39, -/* 0000CAD0 */ 0x5C, 0x05, 0x06, 0xF6, 0x06, 0x38, 0x38, 0x0C, 0x00, 0x47, 0x34, 0x38, 0x8F, 0x03, 0x00, 0x00, -/* 0000CAE0 */ 0x00, 0x07, 0x00, 0x00, 0x00, 0x38, 0x08, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000CAF0 */ 0x24, 0xF6, 0x02, 0x38, 0x38, 0x0D, 0x00, 0x47, 0x24, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x2F, -/* 0000CB00 */ 0x00, 0x00, 0x00, 0x38, 0x09, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0x5C, -/* 0000CB10 */ 0x02, 0x28, 0xCE, 0x39, 0x01, 0x03, 0x00, 0xA1, 0x00, 0x1C, 0x39, 0x5C, 0x03, 0x39, 0x8F, 0x03, -/* 0000CB20 */ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x39, 0x0A, 0x00, 0x5C, 0x04, 0x39, 0xF6, 0x05, 0x38, -/* 0000CB30 */ 0x38, 0x0E, 0x00, 0x47, 0x35, 0x38, 0x2C, 0x38, 0x2B, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x5C, -/* 0000CB40 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x38, 0x0B, 0x00, 0x07, 0x02, 0x00, -/* 0000CB50 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xF6, 0x02, 0x38, 0x38, 0x0F, 0x00, 0x0F, 0x3D, 0x00, 0x38, -/* 0000CB60 */ 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, -/* 0000CB70 */ 0x38, 0x39, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 0000CB80 */ 0x00, 0x00, 0x3A, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xF6, 0x02, -/* 0000CB90 */ 0x3A, 0x3A, 0x10, 0x00, 0x5C, 0x01, 0x3A, 0xF6, 0x02, 0xFF, 0x38, 0x11, 0x00, 0x14, 0x03, 0x00, -/* 0000CBA0 */ 0x29, 0x10, 0x09, 0x28, 0x01, 0x2C, 0x38, 0x2B, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x1C, 0x00, -/* 0000CBB0 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0B, -/* 0000CBC0 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF6, 0x01, 0xFF, 0x38, 0x12, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 0000CBD0 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x38, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, -/* 0000CBE0 */ 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x39, 0x0D, 0x00, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x2B, -/* 0000CBF0 */ 0xF6, 0x03, 0x38, 0x38, 0x13, 0x00, 0x47, 0x2B, 0x38, 0xE5, 0x26, 0x00, 0x8F, 0x03, 0x00, 0x00, -/* 0000CC00 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0C, 0x07, 0x02, 0x00, 0x5C, -/* 0000CC10 */ 0x00, 0x39, 0x5C, 0x01, 0x2B, 0xF6, 0x02, 0x38, 0x38, 0x14, 0x00, 0x47, 0x2D, 0x38, 0xE9, 0x09, -/* 0000CC20 */ 0x59, 0x00, 0xE7, 0x26, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x38, 0x0E, -/* 0000CC30 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0xF6, 0x02, 0xFF, 0x38, 0x15, 0x00, -/* 0000CC40 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0A, -/* 0000CC50 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3A, -/* 0000CC60 */ 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xF6, 0x02, 0x3A, 0x3A, 0x16, -/* 0000CC70 */ 0x00, 0x5C, 0x01, 0x3A, 0xF6, 0x02, 0xFF, 0x38, 0x17, 0x00, 0xE9, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000CC80 */ 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, -/* 0000CC90 */ 0x5C, 0x02, 0x1D, 0x5C, 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x2D, 0xF6, 0x06, 0x38, 0x38, -/* 0000CCA0 */ 0x18, 0x00, 0x47, 0x2F, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x39, 0x0F, -/* 0000CCB0 */ 0x00, 0x6D, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2D, 0x5C, 0x02, -/* 0000CCC0 */ 0x2F, 0xF6, 0x03, 0x38, 0x38, 0x19, 0x00, 0x47, 0x31, 0x38, 0x09, 0x89, 0x00, 0xA8, 0x38, 0x47, -/* 0000CCD0 */ 0x2B, 0x38, 0xA8, 0x38, 0x47, 0x2C, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000CCE0 */ 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, -/* 0000CCF0 */ 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x1E, 0xF6, 0x06, 0x38, 0x38, 0x1A, 0x00, 0x47, 0x2F, -/* 0000CD00 */ 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, 0x09, 0x28, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, -/* 0000CD10 */ 0x00, 0x00, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, -/* 0000CD20 */ 0x01, 0x2F, 0x5C, 0x02, 0x1E, 0xF6, 0x03, 0x38, 0x38, 0x1B, 0x00, 0x47, 0x31, 0x38, 0x09, 0x25, -/* 0000CD30 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, -/* 0000CD40 */ 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, 0x20, 0xF6, 0x03, 0x38, -/* 0000CD50 */ 0x38, 0x1C, 0x00, 0x47, 0x31, 0x38, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, -/* 0000CD60 */ 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x21, 0x5C, 0x03, -/* 0000CD70 */ 0x2F, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x31, 0xF6, 0x06, 0x38, 0x38, 0x1D, 0x00, 0x47, 0x30, 0x38, -/* 0000CD80 */ 0x77, 0x28, 0x23, 0x0E, 0x62, 0x38, 0x35, 0x0F, 0x77, 0x38, 0x23, 0x10, 0x77, 0x29, 0x23, 0x11, -/* 0000CD90 */ 0xA8, 0x38, 0x15, 0x03, 0x00, 0x2B, 0x38, 0x09, 0x04, 0x00, 0x77, 0x2B, 0x23, 0x12, 0xA8, 0x38, -/* 0000CDA0 */ 0x15, 0x03, 0x00, 0x2C, 0x38, 0x09, 0x7A, 0x00, 0x77, 0x2C, 0x23, 0x13, 0x8F, 0x02, 0x00, 0x00, -/* 0000CDB0 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x14, 0x77, 0x38, -/* 0000CDC0 */ 0x23, 0x15, 0x14, 0x03, 0x00, 0x2C, 0x13, 0x09, 0x19, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x04, -/* 0000CDD0 */ 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x16, 0x77, 0x38, 0x23, 0x15, -/* 0000CDE0 */ 0x09, 0x3F, 0x00, 0x14, 0x03, 0x00, 0x2C, 0x12, 0x09, 0x19, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000CDF0 */ 0x04, 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x17, 0x77, 0x38, 0x23, -/* 0000CE00 */ 0x15, 0x09, 0x1E, 0x00, 0x14, 0x03, 0x00, 0x2C, 0x14, 0x09, 0x16, 0x00, 0x8F, 0x02, 0x00, 0x00, -/* 0000CE10 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x18, 0x77, 0x38, -/* 0000CE20 */ 0x23, 0x15, 0x77, 0x2E, 0x23, 0x19, 0x77, 0x2F, 0x23, 0x1A, 0x77, 0x30, 0x23, 0x1B, 0xA8, 0x38, -/* 0000CE30 */ 0x15, 0x03, 0x00, 0x33, 0x38, 0x09, 0x08, 0x00, 0x77, 0x32, 0x23, 0x1C, 0x77, 0x33, 0x23, 0x1D, -/* 0000CE40 */ 0x77, 0x2A, 0x23, 0x1E, 0x77, 0x34, 0x23, 0x1F, 0xE5, 0x21, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000CE50 */ 0x3D, 0x00, 0x00, 0x00, 0x38, 0x11, 0x00, 0x4B, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000CE60 */ 0x01, 0x23, 0xF6, 0x02, 0xFF, 0x38, 0x1E, 0x00, 0xE9, 0x09, 0x3B, 0x00, 0xE7, 0x27, 0x06, 0x8F, -/* 0000CE70 */ 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x38, 0x0E, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000CE80 */ 0x04, 0x5C, 0x01, 0x27, 0xF6, 0x02, 0xFF, 0x38, 0x1F, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 0000CE90 */ 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x20, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, -/* 0000CEA0 */ 0xF6, 0x01, 0xFF, 0x38, 0x20, 0x00, 0xE9, 0x62, 0x38, 0x23, 0x21, 0x0F, 0x07, 0x00, 0x38, 0x09, -/* 0000CEB0 */ 0x00, 0x00, 0x77, 0x22, 0x23, 0x22, 0x47, 0x38, 0x23, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000CEC0 */ 0x00, 0x00, 0x39, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000CED0 */ 0x24, 0x00, 0x00, 0x00, 0x3A, 0x12, 0x00, 0x5C, 0x01, 0x3A, 0x62, 0x3A, 0x23, 0x21, 0x5C, 0x02, -/* 0000CEE0 */ 0x3A, 0xF6, 0x03, 0x39, 0x39, 0x21, 0x00, 0x77, 0x39, 0x38, 0x23, 0x77, 0x06, 0x23, 0x24, 0xA8, -/* 0000CEF0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, -/* 0000CF00 */ 0x02, 0xFE, 0x52, 0x03, 0xFE, 0xC3, 0x03, 0xFE, 0xC4, 0x03, 0xFE, 0xC5, 0x03, 0xFE, 0x0E, 0x02, -/* 0000CF10 */ 0xFE, 0x0F, 0x02, 0xFE, 0x68, 0x02, 0xFE, 0x69, 0x02, 0xFE, 0x30, 0x02, 0xFE, 0x1E, 0x01, 0xFE, -/* 0000CF20 */ 0xE3, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x15, -/* 0000CF30 */ 0x02, 0xFE, 0xC2, 0x03, 0xFE, 0x16, 0x02, 0xFE, 0xC7, 0x03, 0xFE, 0xC8, 0x03, 0xFE, 0xC9, 0x03, -/* 0000CF40 */ 0xFE, 0x0B, 0x02, 0xFE, 0x09, 0x02, 0xFE, 0x0A, 0x02, 0xFE, 0x0C, 0x02, 0xFE, 0x0D, 0x02, 0xFE, -/* 0000CF50 */ 0x13, 0x02, 0xFE, 0x11, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x12, -/* 0000CF60 */ 0x02, 0xFE, 0x6B, 0x02, 0x00, 0xFE, 0xED, 0xB8, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, -/* 0000CF70 */ 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x9B, 0x00, 0x22, 0x00, 0x6D, 0x00, 0x04, 0x00, 0x61, -/* 0000CF80 */ 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x26, 0x00, 0x4F, 0x00, 0x22, 0x00, 0x49, 0x00, 0x37, 0x00, 0x71, -/* 0000CF90 */ 0x00, 0x3B, 0x00, 0x73, 0x00, 0x15, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x18, 0x00, 0x43, -/* 0000CFA0 */ 0x00, 0x08, 0x00, 0x30, 0x00, 0x15, 0x00, 0x50, 0x00, 0x2E, 0x00, 0x5F, 0x00, 0x3B, 0x00, 0x7D, -/* 0000CFB0 */ 0x00, 0x05, 0x00, 0x31, 0x00, 0x2A, 0x00, 0x67, 0x00, 0x05, 0x00, 0x37, 0x00, 0x05, 0x00, 0x37, -/* 0000CFC0 */ 0x00, 0x05, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x51, 0x00, 0x07, 0x00, 0x52, 0x00, 0x16, 0x00, 0x7E, -/* 0000CFD0 */ 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x2A, 0x00, 0x96, 0x00, 0x2C, 0x00, 0x9A, 0x00, 0x1E, 0x00, 0x41, -/* 0000CFE0 */ 0x00, 0x3C, 0x00, 0xA2, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x3A, 0x00, 0x58, 0x00, 0x08, 0x00, 0x30, -/* 0000CFF0 */ 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x1C, 0x00, 0x4F, 0x00, 0x30, 0x00, 0x74, 0x00, 0x28, 0x00, 0x4A, -/* 0000D000 */ 0x00, 0x01, 0x00, 0x24, 0x00, 0x1B, 0x00, 0x2E, 0x00, 0x3B, 0x00, 0x5F, 0x00, 0x2A, 0x00, 0x76, -/* 0000D010 */ 0x00, 0x28, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x2A, 0x00, 0x05, 0x00, 0x31, 0x00, 0x2A, 0x00, 0x69, -/* 0000D020 */ 0x00, 0x08, 0x00, 0x33, 0x00, 0x28, 0x00, 0x78, 0x00, 0x25, 0x00, 0x7B, 0x00, 0x2A, 0x00, 0xC6, -/* 0000D030 */ 0x00, 0x04, 0x00, 0x38, 0x00, 0x08, 0x00, 0x43, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x0A, 0x00, 0x32, -/* 0000D040 */ 0x00, 0x04, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x04, 0x00, 0x46, 0x00, 0x16, 0x00, 0x5F, -/* 0000D050 */ 0x00, 0x08, 0x00, 0x3C, 0x00, 0x19, 0x00, 0x65, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x19, 0x00, 0x63, -/* 0000D060 */ 0x00, 0x08, 0x00, 0x3A, 0x00, 0x16, 0x00, 0x81, 0x00, 0x04, 0x00, 0x4C, 0x00, 0x04, 0x00, 0x4E, -/* 0000D070 */ 0x00, 0x04, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x04, 0x00, 0x58, 0x00, 0x04, 0x00, 0x67, -/* 0000D080 */ 0x00, 0x04, 0x00, 0x40, 0x00, 0x07, 0x00, 0xA9, 0x00, 0x23, 0x00, 0x43, 0x00, 0x01, 0x00, 0x20, -/* 0000D090 */ 0x00, 0x1B, 0x00, 0x6B, 0x01, 0x1D, 0x00, 0x4A, 0x00, 0x0B, 0x00, 0x4B, 0x00, 0x04, 0x00, 0x70, -/* 0000D0A0 */ 0x00, 0x35, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x00, 0x3F, 0xFC, 0x22, 0x04, 0x4F, 0xFD, -/* 0000D0B0 */ 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE5, 0x02, 0x14, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x2F, -/* 0000D0C0 */ 0x00, 0xFE, 0x7F, 0x83, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x7F, 0x83, 0xFE, -/* 0000D0D0 */ 0x7D, 0x30, 0xFE, 0x7D, 0x30, 0x0B, 0x17, 0x1B, 0x09, 0x9A, 0x9A, 0x01, 0x0C, 0x09, 0x07, 0x07, -/* 0000D0E0 */ 0x07, 0x07, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D0F0 */ 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000D100 */ 0x00, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0x9C, 0x03, 0x02, 0x00, 0xFE, 0x9D, 0x03, -/* 0000D110 */ 0x04, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x9E, 0x03, 0x02, 0x00, 0xFE, 0x9F, 0x03, -/* 0000D120 */ 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x08, -/* 0000D130 */ 0x02, 0x01, 0xFE, 0x00, 0x03, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x09, 0x02, 0x01, 0xFE, 0xFF, -/* 0000D140 */ 0x02, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, 0x01, 0xFE, 0xA3, 0x03, -/* 0000D150 */ 0x02, 0x01, 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xA5, 0x03, 0xFE, 0x8C, 0x03, 0xA8, 0x17, 0xA8, -/* 0000D160 */ 0x18, 0xA8, 0x19, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x14, -/* 0000D170 */ 0x17, 0x00, 0x1D, 0x02, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, -/* 0000D180 */ 0x1D, 0x00, 0x00, 0x14, 0x03, 0x00, 0x1D, 0x03, 0x09, 0x55, 0x03, 0xDE, 0x00, 0x03, 0x01, 0xB8, -/* 0000D190 */ 0x1D, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x17, 0x1D, 0x95, 0x00, 0x00, 0x00, 0x00, -/* 0000D1A0 */ 0x02, 0x00, 0x00, 0x00, 0x17, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x01, -/* 0000D1B0 */ 0x00, 0x6D, 0x1D, 0x1E, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1E, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000D1C0 */ 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x04, -/* 0000D1D0 */ 0x01, 0x00, 0xB8, 0x21, 0x00, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x21, 0x5C, 0x02, -/* 0000D1E0 */ 0x20, 0xEE, 0x03, 0x1F, 0x1F, 0x01, 0x00, 0x5C, 0x01, 0x1F, 0x5D, 0x02, 0x06, 0x00, 0x00, 0xF2, -/* 0000D1F0 */ 0x03, 0xFF, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, -/* 0000D200 */ 0x00, 0x00, 0x1D, 0x00, 0x00, 0x14, 0x03, 0x00, 0x1D, 0x02, 0x09, 0xD3, 0x02, 0xDE, 0x01, 0x04, -/* 0000D210 */ 0x02, 0xB8, 0x1D, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x1D, 0x1D, 0x01, 0x50, 0x01, 0x02, 0x00, -/* 0000D220 */ 0x00, 0x00, 0x18, 0x1D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x01, 0x50, -/* 0000D230 */ 0x01, 0x03, 0x00, 0x00, 0x00, 0x19, 0x1D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000D240 */ 0x19, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1D, 0x02, 0x00, 0x07, 0x03, 0x00, -/* 0000D250 */ 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x07, 0x02, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000D260 */ 0x00, 0x1E, 0x03, 0x00, 0x5C, 0x02, 0x1E, 0xEE, 0x03, 0xFF, 0x1D, 0x02, 0x00, 0x8F, 0x01, 0x00, -/* 0000D270 */ 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1D, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5D, -/* 0000D280 */ 0x01, 0x08, 0x03, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x04, 0x00, -/* 0000D290 */ 0x5C, 0x02, 0x1E, 0xEE, 0x03, 0xFF, 0x1D, 0x03, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, -/* 0000D2A0 */ 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x00, 0x00, 0x00, -/* 0000D2B0 */ 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x5C, 0x01, 0x1E, 0x5D, 0x02, 0x09, 0x04, 0x00, 0xCC, -/* 0000D2C0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 0000D2D0 */ 0x00, 0x46, 0x00, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x4B, 0x1F, 0x7B, 0x1F, 0x1E, 0x01, 0x7B, 0x0C, -/* 0000D2E0 */ 0x1E, 0x02, 0x7B, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, 0x04, 0x00, 0x8F, -/* 0000D2F0 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000D300 */ 0x05, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x5C, 0x01, 0x1E, -/* 0000D310 */ 0x5D, 0x02, 0x0F, 0x05, 0x00, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000D320 */ 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x03, 0x00, 0x07, 0x01, -/* 0000D330 */ 0x00, 0xC3, 0x01, 0x1F, 0x1F, 0x06, 0x00, 0x7B, 0x1F, 0x1E, 0x01, 0x7B, 0x10, 0x1E, 0x02, 0x7B, -/* 0000D340 */ 0x10, 0x1E, 0x04, 0x7B, 0x10, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, 0x05, 0x00, -/* 0000D350 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 0000D360 */ 0x00, 0x05, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x62, 0x1E, -/* 0000D370 */ 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1E, 0x08, -/* 0000D380 */ 0x00, 0x62, 0x1E, 0x1E, 0x05, 0x5C, 0x02, 0x1E, 0xEE, 0x03, 0xFF, 0x1D, 0x07, 0x00, 0x8F, 0x01, -/* 0000D390 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, -/* 0000D3A0 */ 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x62, 0x1E, 0x1E, 0x05, -/* 0000D3B0 */ 0x5C, 0x01, 0x1E, 0x5D, 0x02, 0x12, 0x08, 0x00, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000D3C0 */ 0x00, 0x1E, 0x00, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x03, -/* 0000D3D0 */ 0x00, 0x7B, 0x1F, 0x1E, 0x01, 0x7B, 0x0C, 0x1E, 0x02, 0x7B, 0x10, 0x1E, 0x04, 0x7B, 0x0C, 0x1E, -/* 0000D3E0 */ 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, 0x08, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, -/* 0000D3F0 */ 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x00, 0x00, -/* 0000D400 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x62, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x5D, -/* 0000D410 */ 0x02, 0x13, 0x09, 0x00, 0xCC, 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, -/* 0000D420 */ 0x00, 0xB8, 0x20, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x20, 0x20, 0x01, 0x50, 0x01, 0x04, 0x00, -/* 0000D430 */ 0x00, 0x00, 0x1F, 0x20, 0x7B, 0x1F, 0x1E, 0x01, 0x01, 0x64, 0x01, 0x1F, 0x1E, 0x7B, 0x0C, 0x1E, -/* 0000D440 */ 0x02, 0x7B, 0x10, 0x1E, 0x04, 0x7B, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, -/* 0000D450 */ 0x09, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x07, 0x04, -/* 0000D460 */ 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, -/* 0000D470 */ 0x62, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x5D, 0x02, 0x14, 0x0A, 0x00, 0xCC, 0x5C, 0x00, 0x00, -/* 0000D480 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, -/* 0000D490 */ 0x00, 0x00, 0x1F, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x16, 0x0B, 0x00, -/* 0000D4A0 */ 0xB8, 0x21, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x21, 0x21, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, -/* 0000D4B0 */ 0x00, 0x20, 0x21, 0x5C, 0x02, 0x20, 0xEE, 0x03, 0x1F, 0x1F, 0x0B, 0x00, 0x7B, 0x1F, 0x1E, 0x06, -/* 0000D4C0 */ 0x7B, 0x10, 0x1E, 0x04, 0x7B, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0xEE, 0x04, 0xFF, 0x1D, 0x0A, -/* 0000D4D0 */ 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x07, 0x00, -/* 0000D4E0 */ 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x05, 0x70, 0x00, 0x5C, 0x00, 0x00, 0x00, -/* 0000D4F0 */ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, -/* 0000D500 */ 0xB2, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000D510 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000D520 */ 0x2C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, -/* 0000D530 */ 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, -/* 0000D540 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 0000D550 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, -/* 0000D560 */ 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000D570 */ 0x00, 0xFE, 0x32, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, -/* 0000D580 */ 0xFE, 0x45, 0x01, 0xFE, 0xB5, 0x01, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xA6, 0x03, 0x02, 0x02, 0x00, -/* 0000D590 */ 0xFE, 0x19, 0x02, 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x96, 0x83, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x42, -/* 0000D5A0 */ 0x00, 0x14, 0x17, 0x54, 0x00, 0xF9, 0x03, 0x48, 0x00, 0x8A, 0x06, 0x2C, 0x00, 0x43, 0x03, 0x2C, -/* 0000D5B0 */ 0x00, 0x50, 0x00, 0x56, 0x00, 0x93, 0x00, 0x61, 0x00, 0x91, 0x00, 0x3E, 0x00, 0x45, 0x00, 0x5C, -/* 0000D5C0 */ 0x00, 0x96, 0x00, 0x68, 0x00, 0xA7, 0x05, 0x7F, 0x00, 0x03, 0x03, 0x0F, 0x00, 0x7C, 0x00, 0x07, -/* 0000D5D0 */ 0x00, 0x16, 0x00, 0x00, 0xE8, 0xDF, 0x00, 0x00, 0xC6, 0xDD, 0x00, 0x00, 0x14, 0xDB, 0x00, 0x00, -/* 0000D5E0 */ 0x27, 0xD9, 0x00, 0x00, 0x2F, 0xD7, 0x00, 0x00, 0xEC, 0xD5, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, -/* 0000D5F0 */ 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0x03, 0x3A, 0xFF, 0xA0, 0x41, 0xD1, -/* 0000D600 */ 0x00, 0x36, 0x00, 0xFE, 0xD6, 0xB0, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD6, 0xB0, -/* 0000D610 */ 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x03, 0x03, 0x01, -/* 0000D620 */ 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D630 */ 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D640 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC0, 0x03, 0x02, -/* 0000D650 */ 0x01, 0xFE, 0xFD, 0x02, 0xAA, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, -/* 0000D660 */ 0x08, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000D670 */ 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, -/* 0000D680 */ 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, -/* 0000D690 */ 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, -/* 0000D6A0 */ 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, -/* 0000D6B0 */ 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, -/* 0000D6C0 */ 0x08, 0x06, 0x02, 0x0F, 0x2D, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 0000D6D0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, -/* 0000D6E0 */ 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, -/* 0000D6F0 */ 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000D700 */ 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x77, 0x02, 0x00, 0xFE, 0xFC, -/* 0000D710 */ 0xB0, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x2A, 0x00, 0x7D, 0x00, 0x26, 0x00, -/* 0000D720 */ 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x2A, 0x00, 0x7D, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, -/* 0000D730 */ 0xFC, 0x22, 0x04, 0x4F, 0xFC, 0x07, 0xFE, 0xA2, 0x03, 0xFE, 0xA4, 0x03, 0x1B, 0xFF, 0xA0, 0x41, -/* 0000D740 */ 0xC3, 0x00, 0x35, 0x00, 0xFE, 0x18, 0xAB, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x18, -/* 0000D750 */ 0xAB, 0xFE, 0xF1, 0x04, 0xFE, 0xF1, 0x04, 0x01, 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, 0x03, 0x03, -/* 0000D760 */ 0x01, 0x11, 0x11, 0x11, 0x11, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D770 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D780 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC1, -/* 0000D790 */ 0x03, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0xA8, 0x03, -/* 0000D7A0 */ 0x02, 0x01, 0xFE, 0xAB, 0x03, 0x02, 0x01, 0xFE, 0xB0, 0x03, 0x02, 0x01, 0xFE, 0xBA, 0x03, 0x02, -/* 0000D7B0 */ 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0xB1, 0x03, 0x03, 0xEB, 0x5B, 0x0D, 0xB4, 0x0D, 0x0D, -/* 0000D7C0 */ 0x2C, 0x10, 0x0D, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0x2A, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000D7D0 */ 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000D7E0 */ 0x11, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, -/* 0000D7F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 0000D800 */ 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0xF2, 0x02, -/* 0000D810 */ 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0E, 0x10, 0xA8, 0x10, 0x14, 0x0E, 0x00, -/* 0000D820 */ 0x0E, 0x10, 0x09, 0x00, 0x00, 0x62, 0x10, 0x0E, 0x02, 0x0F, 0x2D, 0x00, 0x10, 0x09, 0x00, 0x00, -/* 0000D830 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, -/* 0000D840 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, -/* 0000D850 */ 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000D860 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x10, 0x0E, 0x03, 0x7B, 0x10, 0x00, 0x04, 0x62, -/* 0000D870 */ 0x10, 0x0E, 0x05, 0x7B, 0x10, 0x00, 0x06, 0x62, 0x10, 0x0E, 0x07, 0x7B, 0x10, 0x00, 0x08, 0x62, -/* 0000D880 */ 0x10, 0x0E, 0x09, 0x7B, 0x10, 0x00, 0x0A, 0x62, 0x10, 0x0E, 0x0B, 0x7B, 0x10, 0x00, 0x0C, 0x62, -/* 0000D890 */ 0x10, 0x0E, 0x0D, 0x7B, 0x10, 0x00, 0x0E, 0x62, 0x10, 0x0E, 0x0F, 0x7B, 0x10, 0x00, 0x10, 0x09, -/* 0000D8A0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, -/* 0000D8B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0xA8, 0x03, 0x00, 0x00, 0x20, 0x02, 0x00, -/* 0000D8C0 */ 0x00, 0x22, 0x02, 0x00, 0x00, 0xBA, 0x03, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0xB1, 0x03, 0x00, -/* 0000D8D0 */ 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x1F, -/* 0000D8E0 */ 0x02, 0xFE, 0x70, 0x02, 0xFE, 0xA8, 0x03, 0xFE, 0x71, 0x02, 0xFE, 0x20, 0x02, 0xFE, 0x72, 0x02, -/* 0000D8F0 */ 0xFE, 0x22, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0xBA, 0x03, 0xFE, 0x74, 0x02, 0xFE, 0x21, 0x02, 0xFE, -/* 0000D900 */ 0x73, 0x02, 0xFE, 0xB1, 0x03, 0x00, 0xFE, 0x4D, 0xAB, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 0000D910 */ 0x3C, 0x00, 0x2A, 0x00, 0x84, 0x00, 0x26, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x2A, 0x00, -/* 0000D920 */ 0x85, 0x00, 0x4A, 0x00, 0xC6, 0x02, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xA3, -/* 0000D930 */ 0x03, 0xFE, 0x8B, 0x03, 0x10, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x34, 0x00, 0xFE, 0x6C, 0xA5, 0xFF, -/* 0000D940 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x6C, 0xA5, 0xFE, 0xF3, 0x02, 0xFE, 0xF3, 0x02, 0x01, -/* 0000D950 */ 0x09, 0x06, 0x0B, 0x0B, 0x44, 0x41, 0x03, 0x07, 0x03, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, -/* 0000D960 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, -/* 0000D970 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, -/* 0000D980 */ 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC0, 0x03, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x04, 0xFE, 0x3F, -/* 0000D990 */ 0x01, 0x5B, 0x08, 0xB4, 0x08, 0x08, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x2A, -/* 0000D9A0 */ 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, -/* 0000D9B0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, -/* 0000D9C0 */ 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000D9D0 */ 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000D9E0 */ 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x09, -/* 0000D9F0 */ 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x62, 0x0B, 0x09, 0x02, 0x0F, -/* 0000DA00 */ 0x2D, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, -/* 0000DA10 */ 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, -/* 0000DA20 */ 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000DA30 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000DA40 */ 0x00, 0x05, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x47, 0x06, 0x0B, 0x8F, 0x03, -/* 0000DA50 */ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, -/* 0000DA60 */ 0x5C, 0x01, 0x07, 0xEE, 0x02, 0x0B, 0x0B, 0x04, 0x00, 0x47, 0x07, 0x0B, 0x8F, 0x03, 0x00, 0x00, -/* 0000DA70 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, -/* 0000DA80 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x6D, 0x0C, 0x0D, 0x03, 0x07, 0x07, -/* 0000DA90 */ 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x07, 0x62, 0x0E, 0x09, 0x04, 0x5C, 0x03, -/* 0000DAA0 */ 0x0E, 0x62, 0x0E, 0x09, 0x05, 0x5C, 0x04, 0x0E, 0x62, 0x0E, 0x09, 0x06, 0x5C, 0x05, 0x0E, 0x62, -/* 0000DAB0 */ 0x0E, 0x09, 0x07, 0x5C, 0x06, 0x0E, 0xF2, 0x07, 0x0C, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, -/* 0000DAC0 */ 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 0000DAD0 */ 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x6F, -/* 0000DAE0 */ 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x74, 0x02, 0x00, 0xFE, 0x99, 0xA5, 0x09, 0x05, -/* 0000DAF0 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x2A, 0x00, 0x75, 0x00, 0x26, 0x00, 0x47, 0x00, 0x15, -/* 0000DB00 */ 0x00, 0x61, 0x00, 0x2A, 0x00, 0x75, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x62, -/* 0000DB10 */ 0x00, 0xB4, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xFD, 0x02, 0xFE, 0x68, -/* 0000DB20 */ 0x03, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x33, 0x00, 0xFE, 0xCF, 0x9E, 0xFF, 0x00, 0x10, 0x01, -/* 0000DB30 */ 0x00, 0x01, 0x01, 0xFE, 0xCF, 0x9E, 0xFE, 0x4D, 0x06, 0xFE, 0x4D, 0x06, 0x03, 0x0A, 0x08, 0x0F, -/* 0000DB40 */ 0x05, 0x67, 0x5E, 0x03, 0x02, 0x09, 0x09, 0x08, 0x07, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DB50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DB60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, -/* 0000DB70 */ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, -/* 0000DB80 */ 0xFD, 0x02, 0xFE, 0xD5, 0x01, 0xAE, 0x0A, 0x5B, 0x0B, 0xB4, 0x0B, 0x0B, 0xA8, 0x0F, 0x47, 0x08, -/* 0000DB90 */ 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x62, 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x03, 0x09, -/* 0000DBA0 */ 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x04, 0x00, 0x00, 0x47, 0x08, 0x0F, 0x62, 0x0F, 0x0A, 0x00, 0x10, -/* 0000DBB0 */ 0x03, 0x00, 0x0F, 0x05, 0x09, 0x09, 0x00, 0x98, 0x0F, 0x0A, 0x03, 0x01, 0x00, 0x47, 0x09, 0x0F, -/* 0000DBC0 */ 0x6B, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, 0xA8, 0x0F, -/* 0000DBD0 */ 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000DBE0 */ 0x00, 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC3, -/* 0000DBF0 */ 0x03, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x60, 0x01, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, -/* 0000DC00 */ 0x00, 0x10, 0x01, 0x00, 0x6D, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, -/* 0000DC10 */ 0x0B, 0xF2, 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0C, 0x0F, 0x8F, 0x03, -/* 0000DC20 */ 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, -/* 0000DC30 */ 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x0F, 0x0F, 0x02, 0x00, 0x0F, 0x28, 0x00, 0x0F, 0x09, 0x00, 0x00, -/* 0000DC40 */ 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x02, -/* 0000DC50 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5D, 0x01, 0x07, 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0F, 0x02, -/* 0000DC60 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, -/* 0000DC70 */ 0x00, 0x6D, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0xF2, 0x02, -/* 0000DC80 */ 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, -/* 0000DC90 */ 0x0D, 0x0F, 0x09, 0x4B, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x04, -/* 0000DCA0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5D, 0x02, 0x02, 0x05, -/* 0000DCB0 */ 0x00, 0xEE, 0x03, 0x0F, 0x0F, 0x05, 0x00, 0x47, 0x0D, 0x0F, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, -/* 0000DCC0 */ 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x6D, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, -/* 0000DCD0 */ 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0xF2, 0x03, 0xFF, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, -/* 0000DCE0 */ 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x05, 0x00, 0x4B, 0x0F, 0x07, 0x04, -/* 0000DCF0 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, -/* 0000DD00 */ 0x0F, 0x07, 0x00, 0x47, 0x0F, 0x0D, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, -/* 0000DD10 */ 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, -/* 0000DD20 */ 0x00, 0x11, 0x07, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000DD30 */ 0x11, 0x08, 0x00, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0C, 0xEE, 0x04, 0x10, 0x10, 0x08, -/* 0000DD40 */ 0x00, 0x77, 0x10, 0x0F, 0x05, 0x62, 0x0F, 0x0D, 0x06, 0x82, 0x0F, 0x0F, 0x28, 0x01, 0xFA, 0x0F, -/* 0000DD50 */ 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x52, 0x03, -/* 0000DD60 */ 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x77, 0x02, 0xFE, 0x77, 0x02, 0xDB, -/* 0000DD70 */ 0x00, 0xFE, 0x48, 0xA0, 0x14, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x05, 0x00, 0x2D, -/* 0000DD80 */ 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2D, -/* 0000DD90 */ 0x00, 0x18, 0x00, 0x43, 0x00, 0x20, 0x00, 0x52, 0x00, 0x26, 0x00, 0x37, 0x00, 0x22, 0x00, 0x38, -/* 0000DDA0 */ 0x00, 0x25, 0x00, 0x97, 0x00, 0x26, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x25, 0x00, 0x3F, -/* 0000DDB0 */ 0x00, 0x26, 0x00, 0x58, 0x00, 0x23, 0x00, 0x76, 0x00, 0x42, 0x00, 0x68, 0x00, 0x0B, 0x00, 0x3D, -/* 0000DDC0 */ 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, -/* 0000DDD0 */ 0xFF, 0xFF, 0xFE, 0x56, 0x03, 0x61, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x32, 0x00, 0xFE, 0xFF, 0x9A, -/* 0000DDE0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xFF, 0x9A, 0xFE, 0x90, 0x03, 0xFE, 0x90, 0x03, -/* 0000DDF0 */ 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4E, 0x4A, 0x02, 0x03, 0x08, 0x05, 0x07, 0x07, 0x07, 0x07, 0xFF, -/* 0000DE00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, -/* 0000DE10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000DE20 */ 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x9D, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, -/* 0000DE30 */ 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x66, 0x01, 0xAE, 0x08, 0x5B, 0x0A, 0xB4, 0x0A, 0x0A, -/* 0000DE40 */ 0x98, 0x0E, 0x08, 0x03, 0x00, 0x00, 0x47, 0x09, 0x0E, 0xA8, 0x0E, 0x14, 0x0B, 0x00, 0x0A, 0x0E, -/* 0000DE50 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x28, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000DE60 */ 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000DE70 */ 0x0F, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xF2, 0x02, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000DE80 */ 0x09, 0x28, 0x00, 0x14, 0x03, 0x00, 0x09, 0x02, 0x09, 0x20, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000DE90 */ 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 0000DEA0 */ 0x0F, 0xF2, 0x01, 0xFF, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000DEB0 */ 0x11, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0A, -/* 0000DEC0 */ 0xEE, 0x02, 0x0E, 0x0E, 0x02, 0x00, 0x47, 0x0B, 0x0E, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 0000DED0 */ 0x00, 0x00, 0x0E, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0xEE, 0x02, -/* 0000DEE0 */ 0x0E, 0x0E, 0x03, 0x00, 0x47, 0x09, 0x0E, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000DEF0 */ 0x0E, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5D, 0x02, -/* 0000DF00 */ 0x02, 0x04, 0x00, 0xEE, 0x03, 0x0E, 0x0E, 0x04, 0x00, 0x47, 0x0C, 0x0E, 0x8F, 0x01, 0x00, 0x00, -/* 0000DF10 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, -/* 0000DF20 */ 0x5C, 0x01, 0x0C, 0x98, 0x0F, 0x08, 0x06, 0x01, 0x00, 0x5C, 0x02, 0x0F, 0x98, 0x0F, 0x08, 0x07, -/* 0000DF30 */ 0x02, 0x00, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0xFF, 0x0E, 0x05, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000DF40 */ 0x10, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x02, 0x00, -/* 0000DF50 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x07, 0x00, -/* 0000DF60 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x5C, 0x02, 0x09, 0x62, 0x11, 0x0C, 0x03, 0x5C, 0x03, 0x11, -/* 0000DF70 */ 0x62, 0x11, 0x0C, 0x04, 0x5C, 0x04, 0x11, 0x62, 0x11, 0x0C, 0x05, 0x5C, 0x05, 0x11, 0x62, 0x11, -/* 0000DF80 */ 0x0C, 0x06, 0x5C, 0x06, 0x11, 0xF2, 0x07, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5C, -/* 0000DF90 */ 0x01, 0x0F, 0xEE, 0x02, 0x00, 0x0E, 0x06, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000DFA0 */ 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x55, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x71, 0x02, -/* 0000DFB0 */ 0xFE, 0x72, 0x02, 0xFE, 0x74, 0x02, 0x00, 0xFE, 0x1D, 0x9B, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x09, -/* 0000DFC0 */ 0x00, 0x29, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x6D, 0x00, 0x08, 0x00, 0x29, 0x00, 0x20, -/* 0000DFD0 */ 0x00, 0xE2, 0x00, 0x1E, 0x00, 0x2C, 0x00, 0x1E, 0x00, 0x29, 0x00, 0x25, 0x00, 0x3A, 0x00, 0x2F, -/* 0000DFE0 */ 0x00, 0x4D, 0x00, 0x62, 0x00, 0xB5, 0x00, 0x00, 0xBF, 0xFD, 0x4A, 0x06, 0x0F, 0xFD, 0x0F, 0xFE, -/* 0000DFF0 */ 0xA6, 0x03, 0xFE, 0xE9, 0x02, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x30, 0x00, 0xFE, 0xD7, 0x83, -/* 0000E000 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xD7, 0x83, 0xFE, 0xC5, 0x16, 0xFE, 0xC5, -/* 0000E010 */ 0x16, 0x44, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, 0x0A, 0x01, 0xF9, 0x02, 0x02, 0x05, 0x12, 0x10, -/* 0000E020 */ 0x13, 0x13, 0x13, 0x13, 0x01, 0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x34, 0xFF, 0xFF, 0xFF, -/* 0000E030 */ 0xFF, 0xFF, 0x35, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, -/* 0000E040 */ 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x08, 0x02, 0x01, 0xFE, 0x5E, 0x03, -/* 0000E050 */ 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, -/* 0000E060 */ 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, 0xFE, 0xA8, 0x03, 0x02, 0x01, 0xFE, 0xA9, 0x03, 0x02, -/* 0000E070 */ 0x01, 0xFE, 0xAA, 0x03, 0x02, 0x01, 0xFE, 0xAB, 0x03, 0x02, 0x00, 0xFE, 0xAC, 0x03, 0x02, 0x00, -/* 0000E080 */ 0xFE, 0xAD, 0x03, 0x02, 0x00, 0xFE, 0xAE, 0x03, 0x02, 0x00, 0xFE, 0xAF, 0x03, 0x02, 0x01, 0xFE, -/* 0000E090 */ 0xB0, 0x03, 0x02, 0x01, 0xFE, 0x58, 0x03, 0x09, 0x02, 0x01, 0xFE, 0xB1, 0x03, 0x02, 0x00, 0xFE, -/* 0000E0A0 */ 0xB2, 0x03, 0x02, 0x00, 0xFE, 0xB3, 0x03, 0x02, 0x01, 0xFE, 0xB4, 0x03, 0x02, 0x01, 0xFE, 0xB5, -/* 0000E0B0 */ 0x03, 0x02, 0x01, 0xFE, 0xB6, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x01, 0xFE, 0xB7, 0x03, -/* 0000E0C0 */ 0x02, 0x01, 0xFE, 0xB8, 0x03, 0x02, 0x01, 0xFE, 0xB9, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0000E0D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x88, 0x04, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0x2C, 0x36, 0x24, -/* 0000E0E0 */ 0x0D, 0x03, 0x00, 0x36, 0x02, 0x09, 0x1C, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000E0F0 */ 0x00, 0x37, 0x00, 0x00, 0x6D, 0x36, 0x37, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x37, 0xF6, 0x01, -/* 0000E100 */ 0xFF, 0x36, 0x00, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, -/* 0000E110 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x37, -/* 0000E120 */ 0x02, 0x00, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x24, 0x5C, 0x03, 0x03, 0xF6, 0x04, 0x36, 0x36, 0x01, -/* 0000E130 */ 0x00, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x2D, 0x00, 0x62, 0x36, 0x24, 0x01, 0x0F, 0x03, 0x00, 0x36, -/* 0000E140 */ 0x09, 0x22, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x6D, -/* 0000E150 */ 0x36, 0x37, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0xF6, -/* 0000E160 */ 0x03, 0xFF, 0x36, 0x02, 0x00, 0x77, 0x06, 0x24, 0x03, 0x2C, 0x36, 0x26, 0x14, 0x03, 0x00, 0x36, -/* 0000E170 */ 0x07, 0x09, 0x26, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x36, 0x03, 0x00, -/* 0000E180 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x08, 0xF6, 0x03, -/* 0000E190 */ 0x36, 0x36, 0x03, 0x00, 0x47, 0x26, 0x36, 0x09, 0x22, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x31, -/* 0000E1A0 */ 0x00, 0x00, 0x00, 0x37, 0x04, 0x00, 0x6D, 0x36, 0x37, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x37, -/* 0000E1B0 */ 0x5C, 0x01, 0x26, 0xF6, 0x02, 0x36, 0x36, 0x04, 0x00, 0x47, 0x26, 0x36, 0x8F, 0x02, 0x00, 0x00, -/* 0000E1C0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000E1D0 */ 0x26, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCE, 0x37, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x37, -/* 0000E1E0 */ 0xA1, 0x01, 0x0C, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x0C, 0xF6, 0x06, 0x36, 0x36, 0x05, 0x00, -/* 0000E1F0 */ 0x47, 0x28, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x07, -/* 0000E200 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCE, 0x37, -/* 0000E210 */ 0x02, 0x01, 0x00, 0xA1, 0x00, 0x0E, 0x37, 0xA1, 0x01, 0x0F, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, -/* 0000E220 */ 0x0E, 0xF6, 0x06, 0x36, 0x36, 0x06, 0x00, 0x47, 0x29, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, -/* 0000E230 */ 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, -/* 0000E240 */ 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xCE, 0x37, 0x04, 0x02, 0x00, 0xA1, 0x00, 0x11, 0x37, 0xA1, 0x01, -/* 0000E250 */ 0x12, 0x37, 0xA1, 0x02, 0x13, 0x37, 0xA1, 0x03, 0x14, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, -/* 0000E260 */ 0x05, 0x37, 0xF6, 0x06, 0x36, 0x36, 0x07, 0x00, 0x47, 0x2A, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000E270 */ 0x02, 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, -/* 0000E280 */ 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, 0xA8, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x17, 0xF6, 0x06, -/* 0000E290 */ 0x36, 0x36, 0x08, 0x00, 0x47, 0x2B, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000E2A0 */ 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x18, 0x5C, -/* 0000E2B0 */ 0x03, 0x0A, 0xCE, 0x37, 0x03, 0x03, 0x00, 0xA1, 0x00, 0x19, 0x37, 0xA1, 0x01, 0x1A, 0x37, 0xA1, -/* 0000E2C0 */ 0x02, 0x1B, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, 0xF6, 0x06, 0x36, 0x36, 0x09, -/* 0000E2D0 */ 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000E2E0 */ 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x1C, 0x5C, -/* 0000E2F0 */ 0x03, 0x16, 0xCE, 0x37, 0x02, 0x04, 0x00, 0xA1, 0x00, 0x06, 0x37, 0xA1, 0x01, 0x17, 0x37, 0x5C, -/* 0000E300 */ 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, 0xF6, 0x06, 0x36, 0x36, 0x0A, 0x00, 0x96, 0x03, 0x00, -/* 0000E310 */ 0x00, 0x00, 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x36, 0x06, 0x00, 0x07, -/* 0000E320 */ 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0xF6, 0x02, 0x36, 0x36, 0x0B, 0x00, 0x47, 0x25, -/* 0000E330 */ 0x36, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x36, 0x07, 0x00, 0x07, 0x05, 0x00, -/* 0000E340 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x28, 0xA8, 0x37, 0x5C, 0x03, 0x37, 0x8F, 0x02, -/* 0000E350 */ 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x37, 0x08, 0x00, 0x5C, 0x04, 0x37, 0xF6, 0x05, 0x36, -/* 0000E360 */ 0x36, 0x0C, 0x00, 0x47, 0x2C, 0x36, 0x96, 0x04, 0x00, 0x00, 0x00, 0x1D, 0x8F, 0x02, 0x00, 0x00, -/* 0000E370 */ 0x00, 0x2C, 0x00, 0x00, 0x00, 0x36, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x62, 0x37, -/* 0000E380 */ 0x2C, 0x05, 0x5C, 0x01, 0x37, 0xF6, 0x02, 0x36, 0x36, 0x0D, 0x00, 0x47, 0x2D, 0x36, 0x47, 0x2E, -/* 0000E390 */ 0x2D, 0x62, 0x36, 0x2C, 0x06, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x37, 0x00, 0x8F, 0x02, 0x00, 0x00, -/* 0000E3A0 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x02, -/* 0000E3B0 */ 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x37, 0x0A, 0x00, 0x5C, 0x01, 0x37, 0x62, 0x37, 0x2C, -/* 0000E3C0 */ 0x06, 0x5C, 0x02, 0x37, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x37, 0x5C, 0x03, 0x37, 0xF6, 0x04, 0xFF, -/* 0000E3D0 */ 0x36, 0x0E, 0x00, 0x93, 0x04, 0x00, 0x00, 0x00, 0x36, 0x0B, 0x00, 0x15, 0x03, 0x00, 0x36, 0x1D, -/* 0000E3E0 */ 0x09, 0x5C, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x36, 0x0C, 0x00, 0x98, -/* 0000E3F0 */ 0x36, 0x36, 0x2E, 0x00, 0x00, 0x47, 0x2F, 0x36, 0x47, 0x30, 0x1E, 0xA8, 0x36, 0x15, 0x03, 0x00, -/* 0000E400 */ 0x2F, 0x36, 0x09, 0x34, 0x00, 0x93, 0x04, 0x00, 0x00, 0x00, 0x37, 0x0B, 0x00, 0x98, 0x37, 0x2F, -/* 0000E410 */ 0x37, 0x01, 0x00, 0x47, 0x30, 0x37, 0x47, 0x36, 0x37, 0xA8, 0x37, 0x15, 0x03, 0x00, 0x36, 0x37, -/* 0000E420 */ 0x09, 0x16, 0x00, 0x15, 0x03, 0x00, 0x30, 0x1E, 0x09, 0x0B, 0x00, 0x2F, 0x36, 0x2E, 0x1F, 0x2F, -/* 0000E430 */ 0x36, 0x36, 0x30, 0x47, 0x2E, 0x36, 0x09, 0x06, 0x00, 0x96, 0x04, 0x00, 0x00, 0x00, 0x1D, 0x93, -/* 0000E440 */ 0x02, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x00, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0xA1, -/* 0000E450 */ 0x00, 0xE5, 0x3B, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, -/* 0000E460 */ 0x6D, 0x36, 0x37, 0x07, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x20, 0x5C, 0x02, 0x21, -/* 0000E470 */ 0x5C, 0x03, 0x2D, 0xA8, 0x38, 0x5C, 0x04, 0x38, 0xA8, 0x38, 0x5C, 0x05, 0x38, 0xA8, 0x38, 0x5C, -/* 0000E480 */ 0x06, 0x38, 0xF6, 0x07, 0x36, 0x36, 0x0F, 0x00, 0x47, 0x31, 0x36, 0xE9, 0x09, 0x3B, 0x00, 0xE7, -/* 0000E490 */ 0x27, 0x06, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x36, 0x0E, 0x00, 0x07, 0x02, -/* 0000E4A0 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x27, 0xF6, 0x02, 0xFF, 0x36, 0x10, 0x00, 0x8F, 0x02, 0x00, -/* 0000E4B0 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x6D, 0x36, 0x37, 0x08, 0x07, 0x01, 0x00, -/* 0000E4C0 */ 0x5C, 0x00, 0x37, 0xF6, 0x01, 0xFF, 0x36, 0x11, 0x00, 0xE9, 0x14, 0x03, 0x00, 0x31, 0x22, 0x09, -/* 0000E4D0 */ 0x09, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x09, 0x17, 0x00, 0x14, 0x03, 0x00, 0x31, 0x23, -/* 0000E4E0 */ 0x09, 0x09, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x19, 0x09, 0x06, 0x00, 0x96, 0x02, 0x00, 0x00, -/* 0000E4F0 */ 0x00, 0x1A, 0xA8, 0x36, 0x14, 0x03, 0x00, 0x2A, 0x36, 0x09, 0x03, 0x00, 0x47, 0x2A, 0x14, 0x93, -/* 0000E500 */ 0x03, 0x00, 0x00, 0x00, 0x36, 0x0F, 0x00, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x06, -/* 0000E510 */ 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x17, 0x77, 0x28, 0x24, 0x09, 0x62, 0x36, 0x2C, 0x05, 0x77, -/* 0000E520 */ 0x36, 0x24, 0x0A, 0x77, 0x2E, 0x24, 0x0B, 0x77, 0x29, 0x24, 0x0C, 0x77, 0x2A, 0x24, 0x0D, 0x77, -/* 0000E530 */ 0x2B, 0x24, 0x0E, 0x93, 0x02, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x00, 0x77, 0x36, 0x24, 0x0F, 0x93, -/* 0000E540 */ 0x03, 0x00, 0x00, 0x00, 0x36, 0x0F, 0x00, 0x77, 0x36, 0x24, 0x10, 0x93, 0x04, 0x00, 0x00, 0x00, -/* 0000E550 */ 0x36, 0x0B, 0x00, 0x77, 0x36, 0x24, 0x11, 0x77, 0x06, 0x24, 0x12, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000E560 */ 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x52, 0x03, -/* 0000E570 */ 0xFE, 0x6D, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x6E, 0x02, 0xFE, -/* 0000E580 */ 0x17, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x73, -/* 0000E590 */ 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0xB1, 0x03, 0xFE, 0x21, 0x02, -/* 0000E5A0 */ 0xFE, 0xBA, 0x03, 0x00, 0xFE, 0x24, 0x84, 0x35, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x37, 0x00, -/* 0000E5B0 */ 0x1C, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x93, 0x00, 0x22, 0x00, 0x65, 0x00, 0x04, 0x00, 0x5D, 0x00, -/* 0000E5C0 */ 0x0B, 0x00, 0x3A, 0x00, 0x26, 0x00, 0x4F, 0x00, 0x22, 0x00, 0x49, 0x00, 0x37, 0x00, 0x71, 0x00, -/* 0000E5D0 */ 0x37, 0x00, 0x5F, 0x00, 0x41, 0x00, 0x81, 0x00, 0x2C, 0x00, 0x6E, 0x00, 0x40, 0x00, 0x73, 0x00, -/* 0000E5E0 */ 0x3C, 0x00, 0x9B, 0x00, 0x1E, 0x00, 0x41, 0x00, 0x35, 0x00, 0x6F, 0x00, 0x06, 0x00, 0x2B, 0x00, -/* 0000E5F0 */ 0x22, 0x00, 0x69, 0x00, 0x03, 0x00, 0x46, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x37, 0x00, 0x33, 0x05, -/* 0000E600 */ 0x10, 0x00, 0x33, 0x00, 0x15, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x2F, 0x00, 0x28, 0x00, 0x92, 0x00, -/* 0000E610 */ 0x08, 0x00, 0x3B, 0x00, 0x0E, 0x00, 0xB1, 0x00, 0x06, 0x00, 0x7F, 0x00, 0x15, 0x00, 0x51, 0x00, -/* 0000E620 */ 0x3D, 0x00, 0x79, 0x00, 0x01, 0x00, 0x52, 0x00, 0x1B, 0x00, 0x92, 0x01, 0x1D, 0x00, 0x52, 0x00, -/* 0000E630 */ 0x08, 0x00, 0x29, 0x00, 0x09, 0x00, 0x30, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x09, 0x00, 0x4A, 0x00, -/* 0000E640 */ 0x06, 0x00, 0x4E, 0x00, 0x0A, 0x00, 0x35, 0x00, 0x03, 0x00, 0x3C, 0x00, 0x12, 0x00, 0x31, 0x00, -/* 0000E650 */ 0x06, 0x00, 0x65, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x48, 0x00, -/* 0000E660 */ 0x04, 0x00, 0x2A, 0x00, 0x04, 0x00, 0x36, 0x00, 0x04, 0x00, 0x42, 0x00, 0x0C, 0x00, 0x32, 0x00, -/* 0000E670 */ 0x0C, 0x00, 0x2E, 0x00, 0x0C, 0x00, 0x32, 0x00, 0x06, 0x00, 0x33, 0x00, 0x00, 0x81, 0xE6, 0x00, -/* 0000E680 */ 0x00, 0xBF, 0xFC, 0x6A, 0x04, 0xCF, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0B, 0x03, -/* 0000E690 */ 0x57, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x31, 0x00, 0xFE, 0x91, 0x8B, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000E6A0 */ 0x02, 0x02, 0xFE, 0x91, 0x8B, 0xFE, 0xCB, 0x04, 0xFE, 0xCB, 0x04, 0x41, 0x09, 0x15, 0x1A, 0x0B, -/* 0000E6B0 */ 0x5E, 0x59, 0x03, 0x03, 0x05, 0x01, 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, -/* 0000E6C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, -/* 0000E6D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, -/* 0000E6E0 */ 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, -/* 0000E6F0 */ 0xBB, 0x03, 0x02, 0x01, 0xFE, 0xB1, 0x03, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, -/* 0000E700 */ 0xFE, 0xB2, 0x03, 0x02, 0x00, 0xFE, 0xB3, 0x03, 0x02, 0x01, 0xFE, 0xB4, 0x03, 0x02, 0x00, 0xFE, -/* 0000E710 */ 0xBC, 0x03, 0x02, 0x01, 0xFE, 0xBD, 0x03, 0x08, 0x02, 0x00, 0xFE, 0xBE, 0x03, 0x02, 0x01, 0xFE, -/* 0000E720 */ 0xB6, 0x03, 0x02, 0x01, 0xFE, 0xAA, 0x03, 0x02, 0x01, 0xFE, 0xA9, 0x03, 0x02, 0x00, 0xFE, 0xBF, -/* 0000E730 */ 0x03, 0xFE, 0xC4, 0x01, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000E740 */ 0x6D, 0x1A, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, 0xE0, 0x1C, 0x00, -/* 0000E750 */ 0x5C, 0x02, 0x1C, 0xF2, 0x03, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x16, 0x1A, -/* 0000E760 */ 0x98, 0x1A, 0x16, 0x02, 0x00, 0x00, 0x47, 0x17, 0x1A, 0x98, 0x1A, 0x16, 0x03, 0x01, 0x00, 0x14, -/* 0000E770 */ 0x03, 0x00, 0x1A, 0x04, 0x09, 0x08, 0x00, 0xA8, 0x1B, 0x47, 0x1A, 0x1B, 0x09, 0x09, 0x00, 0x98, -/* 0000E780 */ 0x1B, 0x16, 0x03, 0x02, 0x00, 0x47, 0x1A, 0x1B, 0x47, 0x18, 0x1A, 0x14, 0x03, 0x00, 0x17, 0x05, -/* 0000E790 */ 0x09, 0x92, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x00, 0xA8, -/* 0000E7A0 */ 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x7C, 0x00, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000E7B0 */ 0x00, 0x00, 0x1A, 0x02, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x08, 0x8F, 0x03, 0x00, 0x00, 0x00, -/* 0000E7C0 */ 0x0A, 0x00, 0x00, 0x00, 0x1B, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x08, 0xCC, 0x00, 0x00, -/* 0000E7D0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7B, 0x18, 0x1C, 0x01, 0x5C, 0x01, -/* 0000E7E0 */ 0x1C, 0x5D, 0x02, 0x07, 0x02, 0x00, 0xEE, 0x03, 0x1B, 0x1B, 0x02, 0x00, 0x5C, 0x01, 0x1B, 0x5D, -/* 0000E7F0 */ 0x02, 0x06, 0x01, 0x00, 0x5D, 0x03, 0x09, 0x01, 0x00, 0xCE, 0x1B, 0x03, 0x00, 0x00, 0xA1, 0x00, -/* 0000E800 */ 0x0A, 0x1B, 0xA1, 0x01, 0x0B, 0x1B, 0xA1, 0x02, 0x0C, 0x1B, 0x5C, 0x04, 0x1B, 0xA8, 0x1B, 0x5C, -/* 0000E810 */ 0x05, 0x1B, 0xEE, 0x06, 0x1A, 0x1A, 0x01, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000E820 */ 0x00, 0x1A, 0x09, 0xCF, 0x00, 0x14, 0x03, 0x00, 0x17, 0x0D, 0x09, 0x8B, 0x00, 0x8F, 0x01, 0x00, -/* 0000E830 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1A, 0x04, 0x00, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, -/* 0000E840 */ 0x09, 0x75, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, 0x1A, 0x09, 0x5E, 0x00, 0x8F, 0x03, 0x00, -/* 0000E850 */ 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x1B, 0x05, 0x00, 0x6D, 0x1A, 0x1B, 0x02, 0x07, 0x02, 0x00, -/* 0000E860 */ 0x5C, 0x00, 0x1B, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x06, 0x00, 0x07, -/* 0000E870 */ 0x03, 0x00, 0x5C, 0x00, 0x08, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1D, 0x07, -/* 0000E880 */ 0x00, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x18, 0xEE, 0x03, 0x1C, 0x1C, 0x04, 0x00, 0x43, 0x1C, 0x1C, -/* 0000E890 */ 0x0E, 0x5C, 0x01, 0x1C, 0xF2, 0x02, 0x1A, 0x1A, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x94, 0x01, -/* 0000E8A0 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1A, 0x09, 0x0A, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, -/* 0000E8B0 */ 0x03, 0x00, 0x00, 0x00, 0x0F, 0x09, 0x3C, 0x00, 0x14, 0x03, 0x00, 0x17, 0x10, 0x09, 0x34, 0x00, -/* 0000E8C0 */ 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, 0x1A, 0x09, 0x2A, 0x00, 0x15, 0x03, 0x00, 0x18, 0x11, 0x09, -/* 0000E8D0 */ 0x22, 0x00, 0x15, 0x03, 0x00, 0x18, 0x12, 0x09, 0x1A, 0x00, 0x15, 0x03, 0x00, 0x18, 0x13, 0x09, -/* 0000E8E0 */ 0x12, 0x00, 0x15, 0x03, 0x00, 0x18, 0x14, 0x09, 0x0A, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x04, -/* 0000E8F0 */ 0x00, 0x00, 0x00, 0x18, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0000E900 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0xFE, -/* 0000E910 */ 0xB1, 0x03, 0xFE, 0x5A, 0x02, 0x00, 0x0E, 0xFE, 0x4F, 0x03, 0x00, 0xFE, 0xBD, 0x8B, 0x0C, 0x00, -/* 0000E920 */ 0x00, 0x00, 0x00, 0x2C, 0x00, 0x82, 0x00, 0x09, 0x00, 0x2C, 0x00, 0x22, 0x00, 0x4C, 0x00, 0x1E, -/* 0000E930 */ 0x00, 0x4B, 0x00, 0x7C, 0x00, 0x9F, 0x00, 0x1E, 0x00, 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x5E, -/* 0000E940 */ 0x00, 0xA9, 0x00, 0x0D, 0x00, 0x4D, 0x00, 0x32, 0x00, 0xFF, 0x00, 0x0C, 0x00, 0x41, 0x00, 0x00, -/* 0000E950 */ 0xBF, 0xFC, 0x2A, 0x04, 0x8F, 0xFD, 0x0F, 0xFE, 0x2E, 0x03, 0xFE, 0xAD, 0x02, 0x1E, 0xFF, 0xA0, -/* 0000E960 */ 0x41, 0xC1, 0x00, 0x2D, 0x00, 0xFE, 0x4E, 0x7A, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 0000E970 */ 0xFE, 0x4E, 0x7A, 0xFE, 0xE5, 0x08, 0xFE, 0xE5, 0x08, 0x01, 0x0C, 0x07, 0x0F, 0x06, 0x7E, 0x76, -/* 0000E980 */ 0x01, 0x05, 0x08, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E990 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, -/* 0000E9A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 0000E9B0 */ 0x97, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x48, 0x02, 0x4F, -/* 0000E9C0 */ 0x07, 0x4F, 0x08, 0x4F, 0x0B, 0x4F, 0x0C, 0x4F, 0x0D, 0x4F, 0x09, 0x4F, 0x0A, 0x8F, 0x01, 0x00, -/* 0000E9D0 */ 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, -/* 0000E9E0 */ 0x28, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x62, 0x10, -/* 0000E9F0 */ 0x10, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x11, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, -/* 0000EA00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xFB, 0x01, 0xA8, 0x10, 0x47, 0x07, 0x10, 0xA8, -/* 0000EA10 */ 0x10, 0x47, 0x08, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, -/* 0000EA20 */ 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0xA1, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, -/* 0000EA30 */ 0x00, 0x00, 0x10, 0x03, 0x00, 0x4B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x10, -/* 0000EA40 */ 0x10, 0x00, 0x00, 0x47, 0x07, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, -/* 0000EA50 */ 0x01, 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x07, 0xE0, -/* 0000EA60 */ 0x12, 0x00, 0x5C, 0x02, 0x12, 0xF2, 0x03, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, -/* 0000EA70 */ 0x09, 0x10, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x4E, 0x00, 0x98, 0x10, 0x09, 0x03, 0x00, 0x00, 0x47, -/* 0000EA80 */ 0x08, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x07, 0x05, -/* 0000EA90 */ 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x11, 0x05, 0x00, -/* 0000EAA0 */ 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x07, 0x47, 0x11, 0x04, 0x01, 0x04, 0x01, 0x12, 0x08, 0x2F, 0x11, -/* 0000EAB0 */ 0x11, 0x12, 0x2F, 0x11, 0x11, 0x05, 0x5C, 0x03, 0x11, 0x5D, 0x04, 0x05, 0x02, 0x00, 0xEE, 0x05, -/* 0000EAC0 */ 0x10, 0x10, 0x02, 0x00, 0x47, 0x07, 0x10, 0x09, 0x58, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 0000EAD0 */ 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, -/* 0000EAE0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x4B, 0x12, 0x07, 0x01, -/* 0000EAF0 */ 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x12, 0x12, 0x04, 0x00, 0x5C, 0x01, 0x12, 0xE0, 0x12, 0x01, -/* 0000EB00 */ 0x5C, 0x02, 0x12, 0xF2, 0x03, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x54, 0x0A, 0x10, -/* 0000EB10 */ 0x98, 0x10, 0x0A, 0x03, 0x01, 0x00, 0x47, 0x07, 0x10, 0x98, 0x10, 0x0A, 0x06, 0x02, 0x00, 0x47, -/* 0000EB20 */ 0x08, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x08, 0x10, 0x09, 0x1D, 0x00, 0x01, 0x32, 0x01, 0x01, -/* 0000EB30 */ 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x07, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, -/* 0000EB40 */ 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xBC, 0x00, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x10, 0x54, -/* 0000EB50 */ 0x0B, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x98, 0x10, -/* 0000EB60 */ 0x10, 0x07, 0x03, 0x00, 0x54, 0x0C, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0C, 0x10, 0x09, 0x2F, -/* 0000EB70 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0xEE, 0x03, 0x10, -/* 0000EB80 */ 0x0B, 0x05, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x8F, -/* 0000EB90 */ 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x65, 0x00, -/* 0000EBA0 */ 0x98, 0x10, 0x0C, 0x08, 0x04, 0x00, 0x54, 0x0D, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0D, 0x10, -/* 0000EBB0 */ 0x09, 0x21, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x0D, 0xEE, -/* 0000EBC0 */ 0x03, 0x10, 0x0B, 0x06, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, -/* 0000EBD0 */ 0x10, 0x09, 0x1E, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, -/* 0000EBE0 */ 0xEE, 0x03, 0x10, 0x0B, 0x07, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, -/* 0000EBF0 */ 0x00, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, -/* 0000EC00 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x03, 0xFE, 0x37, 0x02, 0x00, -/* 0000EC10 */ 0x28, 0xFE, 0x98, 0x03, 0x00, 0x0E, 0xFE, 0x99, 0x03, 0x00, 0xFE, 0x64, 0x7A, 0x1B, 0x0E, 0x00, -/* 0000EC20 */ 0x00, 0x00, 0x2C, 0x00, 0x3F, 0x00, 0x11, 0x00, 0x31, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, -/* 0000EC30 */ 0x23, 0x00, 0x15, 0x00, 0x7A, 0x00, 0x1D, 0x00, 0x29, 0x00, 0x2C, 0x00, 0x6A, 0x00, 0x07, 0x00, -/* 0000EC40 */ 0xB8, 0x00, 0x09, 0x00, 0x26, 0x00, 0x48, 0x00, 0xC6, 0x00, 0x46, 0x00, 0x5C, 0x00, 0x09, 0x00, -/* 0000EC50 */ 0x1F, 0x00, 0x09, 0x00, 0x29, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x0C, 0x00, 0x2C, 0x00, 0x11, 0x00, -/* 0000EC60 */ 0x8D, 0x00, 0x09, 0x00, 0x28, 0x01, 0x15, 0x00, 0x56, 0x00, 0x0A, 0x00, 0x84, 0x00, 0x1E, 0x00, -/* 0000EC70 */ 0x54, 0x00, 0x11, 0x00, 0x31, 0x00, 0x09, 0x00, 0x42, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x21, 0x00, -/* 0000EC80 */ 0x6B, 0x00, 0x1E, 0x00, 0x5B, 0x00, 0x13, 0x00, 0x22, 0x00, 0x00, 0x8F, 0xEC, 0x00, 0x00, 0xBF, -/* 0000EC90 */ 0xDC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x9A, 0x03, 0xFE, 0xCB, 0x02, 0x2C, 0xFF, 0xA2, 0x41, -/* 0000ECA0 */ 0xC1, 0x00, 0x2E, 0x00, 0xFE, 0x74, 0x7F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x74, -/* 0000ECB0 */ 0x7F, 0xF9, 0xF9, 0x01, 0x04, 0x05, 0x08, 0x18, 0x16, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ECC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ECD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, -/* 0000ECE0 */ 0x02, 0x02, 0x00, 0xFE, 0x97, 0x03, 0x02, 0x00, 0xFE, 0x9B, 0x03, 0x5C, 0x8F, 0x01, 0x00, 0x00, -/* 0000ECF0 */ 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4B, 0x08, 0x0F, 0x03, 0x00, 0x08, 0x09, 0x23, -/* 0000ED00 */ 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, -/* 0000ED10 */ 0x03, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, 0x09, 0x25, -/* 0000ED20 */ 0x00, 0x09, 0x20, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, -/* 0000ED30 */ 0x2F, 0x00, 0x00, 0x04, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, -/* 0000ED40 */ 0x02, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xA9, 0x7F, 0x04, 0x00, -/* 0000ED50 */ 0x00, 0x00, 0x00, 0x15, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x53, 0x00, 0x22, 0x00, 0x46, 0x00, 0x00, -/* 0000ED60 */ 0x3F, 0xFD, 0x22, 0x04, 0x00, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x98, 0x02, 0x32, -/* 0000ED70 */ 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x2A, 0x00, 0xFE, 0x6D, 0x76, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000ED80 */ 0x01, 0x01, 0xFE, 0x6D, 0x76, 0xFE, 0x13, 0x03, 0xFE, 0x13, 0x03, 0x01, 0x06, 0x04, 0x07, 0x08, -/* 0000ED90 */ 0x1E, 0x1E, 0x01, 0x03, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0xFF, 0xFF, 0xFF, -/* 0000EDA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, -/* 0000EDB0 */ 0x99, 0x4F, 0x07, 0x96, 0x02, 0x00, 0x00, 0x00, 0x07, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 0000EDC0 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x08, 0x5C, 0x01, 0x08, -/* 0000EDD0 */ 0x5D, 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, 0x07, 0x07, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, -/* 0000EDE0 */ 0x07, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x07, 0x04, 0x00, -/* 0000EDF0 */ 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x5C, -/* 0000EE00 */ 0x01, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x07, 0x02, -/* 0000EE10 */ 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, -/* 0000EE20 */ 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x08, 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0xD4, 0x00, 0x00, 0x00, -/* 0000EE30 */ 0x00, 0x08, 0x5C, 0x03, 0x08, 0xEE, 0x04, 0xFF, 0x07, 0x01, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, -/* 0000EE40 */ 0x00, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x94, 0x03, 0x00, -/* 0000EE50 */ 0xFE, 0x83, 0x76, 0x04, 0x08, 0x00, 0x00, 0x00, 0x28, 0x00, 0x31, 0x00, 0x5A, 0x00, 0xB6, 0x02, -/* 0000EE60 */ 0x0D, 0x00, 0x15, 0x00, 0x00, 0x69, 0xEE, 0x00, 0x00, 0xBF, 0xFD, 0x3A, 0x04, 0x00, 0xFC, 0x0F, -/* 0000EE70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9A, 0x02, 0x6B, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x2B, 0x00, -/* 0000EE80 */ 0xFE, 0x17, 0x77, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x17, 0x77, 0xFE, 0x48, -/* 0000EE90 */ 0x02, 0xFE, 0x48, 0x02, 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x25, 0x25, 0x02, 0x01, 0x01, 0x03, -/* 0000EEA0 */ 0x08, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EEB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0xC6, 0x4F, 0x08, 0x96, -/* 0000EEC0 */ 0x02, 0x00, 0x00, 0x00, 0x08, 0x4F, 0x08, 0x96, 0x03, 0x00, 0x00, 0x00, 0x08, 0x8F, 0x02, 0x00, -/* 0000EED0 */ 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x04, 0x00, 0x00, 0x96, -/* 0000EEE0 */ 0x02, 0x00, 0x00, 0x00, 0x08, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, 0x01, -/* 0000EEF0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x09, 0x5C, 0x01, 0x09, 0x5D, 0x02, 0x02, 0x00, -/* 0000EF00 */ 0x00, 0xEE, 0x03, 0x08, 0x08, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x08, 0x8F, 0x02, 0x00, -/* 0000EF10 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, -/* 0000EF20 */ 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x5C, 0x01, 0x09, 0x8F, 0x02, -/* 0000EF30 */ 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, -/* 0000EF40 */ 0x93, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0x09, 0x09, 0x02, -/* 0000EF50 */ 0x00, 0x5C, 0x02, 0x09, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x09, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, -/* 0000EF60 */ 0x08, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x4B, -/* 0000EF70 */ 0x08, 0x93, 0x03, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x9D, 0x09, 0x08, 0x04, 0x00, 0x00, 0xA8, -/* 0000EF80 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x95, 0x03, 0xFE, 0x96, 0x03, 0x00, 0xFE, 0x37, 0x77, 0x05, -/* 0000EF90 */ 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x56, 0x00, 0x28, 0x00, 0x45, 0x00, 0x56, 0x00, 0x58, 0x01, -/* 0000EFA0 */ 0x1E, 0x00, 0x34, 0x00, 0x00, 0xA9, 0xEF, 0x00, 0x00, 0xBF, 0xDC, 0x1A, 0x04, 0x00, 0xFC, 0x07, -/* 0000EFB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9E, 0x02, 0x68, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x2C, 0x00, -/* 0000EFC0 */ 0xFE, 0x2E, 0x78, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x2E, 0x78, 0xEC, 0xEC, 0x41, -/* 0000EFD0 */ 0x04, 0x03, 0x06, 0x0D, 0x0D, 0x03, 0x01, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EFE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EFF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x39, -/* 0000F000 */ 0x4F, 0x04, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x4B, 0x06, -/* 0000F010 */ 0x98, 0x06, 0x06, 0x03, 0x00, 0x00, 0x54, 0x04, 0x06, 0x15, 0x03, 0x00, 0x04, 0x02, 0x09, 0x14, -/* 0000F020 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x4B, 0x06, 0x9D, -/* 0000F030 */ 0x03, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x78, 0x04, -/* 0000F040 */ 0x02, 0x00, 0x00, 0x00, 0x17, 0x00, 0x48, 0x00, 0x08, 0x00, 0x2D, 0x00, 0x16, 0x00, 0x4F, 0x00, -/* 0000F050 */ 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x93, 0x03, 0xFE, 0x73, 0x02, 0x08, 0xFF, -/* 0000F060 */ 0xA2, 0x41, 0xC3, 0x00, 0x29, 0x00, 0xFE, 0x45, 0x6C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 0000F070 */ 0xFE, 0x45, 0x6C, 0x96, 0x96, 0x01, 0x05, 0x03, 0x06, 0x05, 0x0F, 0x0F, 0x01, 0x01, 0x02, 0xFF, -/* 0000F080 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, -/* 0000F090 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000F0A0 */ 0x04, 0x3B, 0x5B, 0x04, 0xB4, 0x04, 0x04, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, -/* 0000F0B0 */ 0x06, 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x00, 0x00, -/* 0000F0C0 */ 0x00, 0x4B, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x4B, 0x07, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x03, -/* 0000F0D0 */ 0xEE, 0x04, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 0000F0E0 */ 0xFE, 0x83, 0x6C, 0x02, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x57, 0x00, 0x00, 0xBF, 0xFC, 0x2A, -/* 0000F0F0 */ 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x92, 0x03, 0xFE, 0x6C, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xA3, 0x00, -/* 0000F100 */ 0x28, 0x00, 0xFE, 0x67, 0x6A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x67, 0x6A, 0xFE, -/* 0000F110 */ 0x04, 0x01, 0xFE, 0x04, 0x01, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, 0x01, 0x01, 0x02, -/* 0000F120 */ 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F130 */ 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F140 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 0000F150 */ 0x04, 0x62, 0xAE, 0x07, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x4F, 0x08, 0x62, 0x0B, 0x07, 0x00, 0x12, -/* 0000F160 */ 0x03, 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x09, 0x00, 0x98, -/* 0000F170 */ 0x0C, 0x07, 0x04, 0x00, 0x00, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000F180 */ 0x32, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, -/* 0000F190 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x4B, 0x0C, 0x5C, 0x02, -/* 0000F1A0 */ 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, -/* 0000F1B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFE, 0xB3, 0x6A, 0x03, 0x09, 0x00, 0x00, 0x00, -/* 0000F1C0 */ 0x20, 0x00, 0x4D, 0x00, 0x37, 0x00, 0x6A, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, -/* 0000F1D0 */ 0xFE, 0x91, 0x03, 0xFE, 0x65, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xA3, 0x00, 0x27, 0x00, 0xFE, 0x55, -/* 0000F1E0 */ 0x68, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x55, 0x68, 0xFE, 0x00, 0x01, 0xFE, 0x00, -/* 0000F1F0 */ 0x01, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, -/* 0000F200 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, -/* 0000F210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000F220 */ 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x62, 0xAE, 0x07, -/* 0000F230 */ 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x4F, 0x08, 0x62, 0x0B, 0x07, 0x00, 0x12, 0x03, 0x00, 0x0B, 0x03, -/* 0000F240 */ 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x09, 0x00, 0x98, 0x0C, 0x07, 0x04, 0x00, -/* 0000F250 */ 0x00, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, -/* 0000F260 */ 0x0B, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, -/* 0000F270 */ 0x00, 0x47, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, -/* 0000F280 */ 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 0000F290 */ 0x00, 0x00, 0xF0, 0x00, 0xFE, 0x9F, 0x68, 0x03, 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x4D, 0x00, -/* 0000F2A0 */ 0x37, 0x00, 0x68, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x90, 0x03, 0xFE, -/* 0000F2B0 */ 0x5E, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xA3, 0x00, 0x26, 0x00, 0xFE, 0x53, 0x66, 0xFF, 0x00, 0x10, -/* 0000F2C0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x53, 0x66, 0xF8, 0xF8, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, -/* 0000F2D0 */ 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F2E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F2F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, -/* 0000F300 */ 0x01, 0x00, 0x00, 0x00, 0x04, 0x62, 0xAE, 0x07, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x4F, 0x08, 0x62, -/* 0000F310 */ 0x0B, 0x07, 0x00, 0x12, 0x03, 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, -/* 0000F320 */ 0x09, 0x09, 0x00, 0x98, 0x0C, 0x07, 0x04, 0x00, 0x00, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8F, -/* 0000F330 */ 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, -/* 0000F340 */ 0x05, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, -/* 0000F350 */ 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, -/* 0000F360 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFE, 0x99, 0x66, 0x03, -/* 0000F370 */ 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x37, 0x00, 0x64, 0x00, 0x00, 0xBF, 0xFC, 0x22, -/* 0000F380 */ 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xE6, 0x02, 0xFE, 0x40, 0x02, 0x1D, 0xFF, 0xA2, 0x41, 0xC1, 0x00, -/* 0000F390 */ 0x25, 0x00, 0xFE, 0xB3, 0x60, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xB3, 0x60, 0xFE, -/* 0000F3A0 */ 0x60, 0x03, 0xFE, 0x60, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, 0x50, 0x4D, 0x01, 0x09, 0x08, 0x04, -/* 0000F3B0 */ 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F3C0 */ 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F3D0 */ 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x02, -/* 0000F3E0 */ 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x00, 0xFE, 0x8F, 0x03, 0xFE, 0x88, -/* 0000F3F0 */ 0x01, 0xA8, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, -/* 0000F400 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0xEE, 0x02, 0x0C, 0x0C, 0x00, 0x00, 0x47, 0x08, -/* 0000F410 */ 0x0C, 0x2C, 0x0C, 0x09, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x90, 0x00, 0x62, 0x0C, 0x09, 0x00, -/* 0000F420 */ 0x47, 0x0A, 0x0C, 0x2C, 0x0C, 0x0A, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x7E, 0x00, 0x8F, 0x01, -/* 0000F430 */ 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0D, 0x01, 0x00, 0x6D, 0x0C, 0x0D, 0x01, 0x07, 0x02, -/* 0000F440 */ 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, 0x0A, 0xF2, 0x02, 0x0C, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x01, -/* 0000F450 */ 0x00, 0x47, 0x0A, 0x0C, 0x15, 0x03, 0x00, 0x0A, 0x04, 0x09, 0x50, 0x00, 0x15, 0x03, 0x00, 0x0A, -/* 0000F460 */ 0x05, 0x09, 0x48, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x02, 0x00, -/* 0000F470 */ 0x6D, 0x0C, 0x0D, 0x02, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, -/* 0000F480 */ 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0A, 0xEE, -/* 0000F490 */ 0x02, 0x0E, 0x0E, 0x03, 0x00, 0x5C, 0x01, 0x0E, 0x5D, 0x02, 0x06, 0x02, 0x00, 0x5D, 0x03, 0x07, -/* 0000F4A0 */ 0x02, 0x00, 0xF2, 0x04, 0xFF, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2C, 0x0C, 0x0A, 0x14, -/* 0000F4B0 */ 0x0B, 0x00, 0x0C, 0x03, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x6E, 0x00, 0x8F, -/* 0000F4C0 */ 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000F4D0 */ 0x02, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x0D, 0x05, 0x00, -/* 0000F4E0 */ 0x5C, 0x02, 0x0D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x6D, -/* 0000F4F0 */ 0x0D, 0x0E, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, -/* 0000F500 */ 0x00, 0x00, 0x0F, 0x06, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0F, 0x0F, 0x06, -/* 0000F510 */ 0x00, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x0D, 0x0D, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5C, 0x03, -/* 0000F520 */ 0x0D, 0xEE, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x09, 0x4D, 0x00, 0x09, 0x48, 0x00, 0x8F, 0x01, 0x00, -/* 0000F530 */ 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, -/* 0000F540 */ 0x01, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x00, 0x5C, 0x02, -/* 0000F550 */ 0x0D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x07, 0x01, 0x00, -/* 0000F560 */ 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0D, 0x0D, 0x08, 0x00, 0x5C, 0x03, 0x0D, 0xEE, 0x04, 0x00, 0x0C, -/* 0000F570 */ 0x07, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x62, 0x02, 0xFE, 0x5B, -/* 0000F580 */ 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x27, 0x02, 0x00, 0xFE, 0xEE, 0x60, 0x0B, 0x02, 0x00, 0x00, 0x00, -/* 0000F590 */ 0x1E, 0x00, 0x34, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0B, 0x00, 0x36, 0x00, -/* 0000F5A0 */ 0x26, 0x00, 0x37, 0x00, 0x10, 0x00, 0x4A, 0x00, 0x48, 0x00, 0x96, 0x00, 0x13, 0x00, 0x4C, 0x00, -/* 0000F5B0 */ 0x6E, 0x00, 0x93, 0x00, 0x4A, 0x00, 0x64, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, -/* 0000F5C0 */ 0xFE, 0x2B, 0x03, 0xFE, 0x32, 0x02, 0x28, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x24, 0x00, 0xFE, 0xDF, -/* 0000F5D0 */ 0x5E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xDF, 0x5E, 0xFE, 0x8C, 0x01, 0xFE, 0x8C, -/* 0000F5E0 */ 0x01, 0x01, 0x07, 0x05, 0x0A, 0x03, 0x26, 0x25, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, -/* 0000F5F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, -/* 0000F600 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000F610 */ 0x03, 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x04, 0xB3, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, -/* 0000F620 */ 0xA8, 0x0A, 0x14, 0x03, 0x00, 0x05, 0x0A, 0x09, 0x23, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 0000F630 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, -/* 0000F640 */ 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, -/* 0000F650 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, -/* 0000F660 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, -/* 0000F670 */ 0x47, 0x08, 0x0A, 0x0F, 0x03, 0x00, 0x08, 0x09, 0x0C, 0x00, 0x62, 0x0A, 0x08, 0x02, 0x15, 0x03, -/* 0000F680 */ 0x00, 0x0A, 0x03, 0x09, 0x23, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, -/* 0000F690 */ 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0xF2, -/* 0000F6A0 */ 0x02, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, -/* 0000F6B0 */ 0x00, 0x00, 0x0A, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0xEE, 0x02, -/* 0000F6C0 */ 0x00, 0x0A, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x58, 0x02, -/* 0000F6D0 */ 0xFE, 0x33, 0x02, 0xFE, 0x61, 0x02, 0x00, 0xFE, 0x10, 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, -/* 0000F6E0 */ 0x00, 0x37, 0x00, 0x23, 0x00, 0x40, 0x00, 0x26, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x23, -/* 0000F6F0 */ 0x00, 0x40, 0x00, 0x20, 0x00, 0x2C, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 0000F700 */ 0x2A, 0x03, 0xFE, 0x25, 0x02, 0x24, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x23, 0x00, 0xFE, 0x1B, 0x5D, -/* 0000F710 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x1B, 0x5D, 0xFE, 0x9A, 0x01, 0xFE, 0x9A, 0x01, -/* 0000F720 */ 0x01, 0x08, 0x05, 0x0B, 0x04, 0x27, 0x26, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, -/* 0000F730 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, -/* 0000F740 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, -/* 0000F750 */ 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x04, 0xB6, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, -/* 0000F760 */ 0x0B, 0x14, 0x03, 0x00, 0x05, 0x0B, 0x09, 0x23, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000F770 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, -/* 0000F780 */ 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 0000F790 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, -/* 0000F7A0 */ 0x00, 0x0C, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, -/* 0000F7B0 */ 0x09, 0x0B, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0C, 0x00, 0x62, 0x0B, 0x09, 0x02, 0x15, 0x03, 0x00, -/* 0000F7C0 */ 0x0B, 0x03, 0x09, 0x23, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000F7D0 */ 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0xF2, 0x02, -/* 0000F7E0 */ 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, -/* 0000F7F0 */ 0x00, 0x0B, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, -/* 0000F800 */ 0xEE, 0x03, 0x00, 0x0B, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 0000F810 */ 0x58, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x61, 0x02, 0x00, 0xFE, 0x55, 0x5D, 0x07, 0x00, 0x00, 0x00, -/* 0000F820 */ 0x00, 0x12, 0x00, 0x37, 0x00, 0x23, 0x00, 0x40, 0x00, 0x26, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, -/* 0000F830 */ 0x00, 0x23, 0x00, 0x40, 0x00, 0x23, 0x00, 0x31, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x04, 0x4F, 0xFC, -/* 0000F840 */ 0x0F, 0xFE, 0x0C, 0x03, 0xFE, 0x12, 0x02, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x21, 0x00, 0xFE, -/* 0000F850 */ 0x86, 0x59, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x86, 0x59, 0xFE, 0x6F, 0x03, -/* 0000F860 */ 0xFE, 0x6F, 0x03, 0x04, 0x09, 0x0A, 0x10, 0x05, 0x20, 0x20, 0x01, 0x02, 0x01, 0x05, 0x03, 0x03, -/* 0000F870 */ 0x03, 0x03, 0x01, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F880 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -/* 0000F890 */ 0x00, 0x04, 0x02, 0x01, 0xFE, 0x88, 0x03, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, -/* 0000F8A0 */ 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x03, 0xAB, 0x96, 0x04, 0x00, 0x00, 0x00, 0x0B, 0x96, -/* 0000F8B0 */ 0x05, 0x00, 0x00, 0x00, 0x0C, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x10, -/* 0000F8C0 */ 0x96, 0x03, 0x00, 0x00, 0x00, 0x02, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, -/* 0000F8D0 */ 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, -/* 0000F8E0 */ 0x00, 0x11, 0x01, 0x00, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x11, -/* 0000F8F0 */ 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, -/* 0000F900 */ 0x00, 0x00, 0x10, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x02, 0x00, 0x00, 0x00, -/* 0000F910 */ 0x11, 0x03, 0x00, 0x5C, 0x01, 0x11, 0x5D, 0x02, 0x04, 0x01, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, -/* 0000F920 */ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, -/* 0000F930 */ 0x7B, 0x12, 0x11, 0x00, 0x7B, 0x07, 0x11, 0x01, 0x7B, 0x07, 0x11, 0x02, 0x5C, 0x03, 0x11, 0xEE, -/* 0000F940 */ 0x04, 0xFF, 0x10, 0x01, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x02, 0x00, -/* 0000F950 */ 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, -/* 0000F960 */ 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, -/* 0000F970 */ 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0x89, 0x03, 0xFE, 0x8A, 0x03, 0xFE, -/* 0000F980 */ 0x8B, 0x03, 0xFE, 0x8C, 0x03, 0x00, 0xFE, 0xD9, 0x59, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 0000F990 */ 0x19, 0x00, 0x06, 0x00, 0x17, 0x00, 0x33, 0x00, 0x70, 0x02, 0x4C, 0x00, 0x68, 0x00, 0x0D, 0x00, -/* 0000F9A0 */ 0x13, 0x00, 0x00, 0xA7, 0xF9, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x06, 0x4F, 0xFD, 0x07, 0xFF, 0xFF, -/* 0000F9B0 */ 0xFF, 0xFF, 0xFF, 0xFE, 0x15, 0x02, 0x41, 0xFF, 0xB2, 0x41, 0xD1, 0x00, 0x22, 0x00, 0xFE, 0x42, -/* 0000F9C0 */ 0x5A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x42, 0x5A, 0xFE, 0x2C, 0x02, 0xFE, 0x2C, -/* 0000F9D0 */ 0x02, 0x45, 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x03, 0x07, 0x05, 0x05, 0x05, 0x05, 0x01, -/* 0000F9E0 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F9F0 */ 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, -/* 0000FA00 */ 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, -/* 0000FA10 */ 0x01, 0xFE, 0xFF, 0x02, 0x08, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0xEC, 0xA8, 0x0D, 0xE5, 0xC4, -/* 0000FA20 */ 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x07, 0x05, 0x00, -/* 0000FA30 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0B, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, -/* 0000FA40 */ 0x01, 0x00, 0x5C, 0x02, 0x11, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, -/* 0000FA50 */ 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x5C, 0x04, 0x11, 0xF6, 0x05, 0x10, 0x10, 0x00, 0x00, 0x47, -/* 0000FA60 */ 0x0D, 0x10, 0x62, 0x10, 0x0D, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x74, 0x00, 0x8F, 0x02, 0x00, -/* 0000FA70 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8F, -/* 0000FA80 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x01, -/* 0000FA90 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x05, 0x00, 0x5C, 0x02, 0x11, 0xCC, 0x00, 0x00, -/* 0000FAA0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x62, 0x12, 0x0D, 0x00, 0x7B, 0x12, -/* 0000FAB0 */ 0x11, 0x01, 0x7B, 0x05, 0x11, 0x02, 0x7B, 0x05, 0x11, 0x03, 0x7B, 0x08, 0x11, 0x04, 0x5C, 0x03, -/* 0000FAC0 */ 0x11, 0xF6, 0x04, 0xFF, 0x10, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000FAD0 */ 0x10, 0x05, 0x00, 0x2F, 0x10, 0x10, 0x0A, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000FAE0 */ 0x10, 0xE9, 0x09, 0x1F, 0x00, 0xE7, 0x0C, 0x06, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, -/* 0000FAF0 */ 0x00, 0x10, 0x06, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0C, 0xF6, 0x02, 0xFF, -/* 0000FB00 */ 0x10, 0x02, 0x00, 0xE9, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0000FB10 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, -/* 0000FB20 */ 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, -/* 0000FB30 */ 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, 0x00, 0xFE, 0x78, 0x5A, 0x07, 0x05, 0x00, 0x00, 0x00, -/* 0000FB40 */ 0x41, 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x5A, 0x00, 0x8D, 0x00, 0x20, 0x00, 0x33, 0x00, -/* 0000FB50 */ 0x01, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x8F, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x04, 0x0F, 0xFC, 0x0F, -/* 0000FB60 */ 0xFE, 0x0B, 0x03, 0xFE, 0xEE, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1F, 0x00, 0xFE, 0x4F, -/* 0000FB70 */ 0x55, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x4F, 0x55, 0xFE, 0x31, 0x04, 0xFE, -/* 0000FB80 */ 0x31, 0x04, 0x01, 0x08, 0x05, 0x0A, 0x05, 0x2C, 0x2A, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, -/* 0000FB90 */ 0x03, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FBA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, -/* 0000FBB0 */ 0x01, 0xFE, 0x59, 0x03, 0x04, 0xC5, 0x4F, 0x06, 0x4F, 0x0A, 0x96, 0x02, 0x00, 0x00, 0x00, 0x0A, -/* 0000FBC0 */ 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x08, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, -/* 0000FBD0 */ 0x09, 0xA6, 0x00, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x0C, 0x00, 0xCE, 0x0A, -/* 0000FBE0 */ 0x01, 0x01, 0x00, 0xA1, 0x00, 0x05, 0x0A, 0x47, 0x05, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, -/* 0000FBF0 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, -/* 0000FC00 */ 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x05, 0x0A, -/* 0000FC10 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, -/* 0000FC20 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x62, 0x0C, 0x05, 0x02, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x0A, -/* 0000FC30 */ 0x0A, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x06, 0x0A, 0xCE, 0x0A, 0x00, 0x02, 0x00, 0x96, -/* 0000FC40 */ 0x02, 0x00, 0x00, 0x00, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0A, 0x01, -/* 0000FC50 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xD4, 0x00, 0x00, -/* 0000FC60 */ 0x00, 0x00, 0x0B, 0x5C, 0x03, 0x0B, 0xEE, 0x04, 0xFF, 0x0A, 0x02, 0x00, 0x93, 0x02, 0x00, 0x00, -/* 0000FC70 */ 0x00, 0x00, 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x52, 0x03, -/* 0000FC80 */ 0xFE, 0x5F, 0x02, 0xF0, 0xFE, 0x85, 0x03, 0x00, 0xFE, 0x82, 0x55, 0x0A, 0x0A, 0x00, 0x00, 0x00, -/* 0000FC90 */ 0x0B, 0x00, 0x32, 0x00, 0x08, 0x00, 0x1E, 0x00, 0x0B, 0x00, 0x2F, 0x00, 0x0C, 0x00, 0x28, 0x00, -/* 0000FCA0 */ 0x26, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x70, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x27, 0x00, 0x8F, 0x02, -/* 0000FCB0 */ 0x0D, 0x00, 0x11, 0x00, 0x00, 0xB9, 0xFC, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, -/* 0000FCC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0x01, 0x2A, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x20, 0x00, -/* 0000FCD0 */ 0xFE, 0x01, 0x57, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x01, 0x57, 0xFE, 0x61, 0x02, -/* 0000FCE0 */ 0xFE, 0x61, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x4C, 0x4A, 0x02, 0x08, 0x08, 0x04, 0x04, 0x04, -/* 0000FCF0 */ 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FD00 */ 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FD10 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x03, 0x02, 0x00, 0xFE, -/* 0000FD20 */ 0x87, 0x03, 0x04, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0x01, 0x4F, 0x09, 0x2C, 0x0B, 0x08, -/* 0000FD30 */ 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x0B, 0x00, 0x2C, 0x0B, 0x08, 0x15, 0x0B, 0x00, 0x0B, 0x03, -/* 0000FD40 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x08, 0x04, 0x09, 0x25, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000FD50 */ 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000FD60 */ 0x0C, 0x5D, 0x01, 0x05, 0x00, 0x00, 0xF2, 0x02, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000FD70 */ 0x8F, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x01, -/* 0000FD80 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, -/* 0000FD90 */ 0x00, 0x01, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x0B, -/* 0000FDA0 */ 0x02, 0x00, 0x4B, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x0B, -/* 0000FDB0 */ 0x0B, 0x02, 0x00, 0x0F, 0x41, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, -/* 0000FDC0 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, -/* 0000FDD0 */ 0x8F, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000FDE0 */ 0x00, 0x06, 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x0D, 0x0D, 0x04, 0x00, 0x5C, 0x01, 0x0D, 0xF2, 0x02, -/* 0000FDF0 */ 0xFF, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000FE00 */ 0x00, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, -/* 0000FE10 */ 0x09, 0xF2, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, -/* 0000FE20 */ 0x15, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x7E, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -/* 0000FE30 */ 0x00, 0x0B, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x1D, -/* 0000FE40 */ 0x00, 0x00, 0x00, 0x0C, 0x05, 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000FE50 */ 0x00, 0x00, 0x0C, 0x06, 0x00, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0x0B, -/* 0000FE60 */ 0x0B, 0x06, 0x00, 0x14, 0x03, 0x00, 0x0B, 0x07, 0x09, 0x3B, 0x00, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 0000FE70 */ 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x02, 0x00, -/* 0000FE80 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0C, 0x07, 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x01, 0x00, 0x00, -/* 0000FE90 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x06, 0x00, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x09, -/* 0000FEA0 */ 0xEE, 0x04, 0xFF, 0x0B, 0x07, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x56, 0x02, 0xFE, -/* 0000FEB0 */ 0x5B, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x27, 0x02, 0x00, 0xFE, 0x21, 0x57, 0x09, 0x02, 0x00, 0x00, -/* 0000FEC0 */ 0x00, 0x1E, 0x00, 0x65, 0x00, 0x25, 0x00, 0x47, 0x00, 0x26, 0x00, 0x32, 0x00, 0x24, 0x00, 0x35, -/* 0000FED0 */ 0x00, 0x3E, 0x00, 0x4B, 0x00, 0x26, 0x00, 0x37, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x3D, 0x00, 0x46, -/* 0000FEE0 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x0A, 0x03, 0xFE, 0xE3, 0x01, 0x04, -/* 0000FEF0 */ 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1E, 0x00, 0xFE, 0xDA, 0x53, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 0000FF00 */ 0x02, 0xFE, 0xDA, 0x53, 0xF8, 0xF8, 0x01, 0x05, 0x04, 0x06, 0x04, 0x1D, 0x1C, 0x01, 0x03, 0x04, -/* 0000FF10 */ 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FF20 */ 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FF30 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x03, 0x92, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, -/* 0000FF40 */ 0x00, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, -/* 0000FF50 */ 0x04, 0xF2, 0x02, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x04, 0x06, 0x8F, 0x01, -/* 0000FF60 */ 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x4B, 0x06, 0x0F, 0x1B, 0x00, 0x06, -/* 0000FF70 */ 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x07, -/* 0000FF80 */ 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 0000FF90 */ 0x09, 0x00, 0x00, 0x00, 0x07, 0x03, 0x00, 0x6D, 0x06, 0x07, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000FFA0 */ 0x07, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, -/* 0000FFB0 */ 0x4B, 0x08, 0x5C, 0x02, 0x08, 0xF2, 0x03, 0x06, 0x06, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x44, -/* 0000FFC0 */ 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5B, 0x02, 0xFE, -/* 0000FFD0 */ 0x37, 0x02, 0x00, 0xFE, 0x0C, 0x54, 0x05, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x29, 0x00, 0x15, -/* 0000FFE0 */ 0x00, 0x25, 0x00, 0x18, 0x00, 0x2F, 0x00, 0x3D, 0x00, 0x48, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, -/* 0000FFF0 */ 0x00, 0xFC, 0x07, 0xFE, 0x09, 0x03, 0xFE, 0xA8, 0x01, 0x04, 0xFF, 0xA1, 0x41, 0xC1, 0x00, 0x1D, -/* 00010000 */ 0x00, 0xFE, 0xD6, 0x40, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD6, 0x40, 0xFE, 0xFE, -/* 00010010 */ 0x12, 0xFE, 0xFE, 0x12, 0x41, 0x16, 0x25, 0x38, 0x04, 0xB0, 0x9C, 0x01, 0x03, 0x01, 0xFF, 0xFF, -/* 00010020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, -/* 00010030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 00010040 */ 0x00, 0xFE, 0x63, 0x03, 0x02, 0x00, 0xFE, 0x64, 0x03, 0x02, 0x00, 0xFE, 0x65, 0x03, 0x02, 0x01, -/* 00010050 */ 0xFE, 0x66, 0x03, 0x02, 0x01, 0xFE, 0x67, 0x03, 0x02, 0x00, 0xFE, 0x68, 0x03, 0x02, 0x00, 0xFE, -/* 00010060 */ 0x69, 0x03, 0x02, 0x00, 0xFE, 0x6A, 0x03, 0x02, 0x00, 0xFE, 0x6B, 0x03, 0x02, 0x00, 0xFE, 0x6C, -/* 00010070 */ 0x03, 0x02, 0x00, 0xFE, 0x6D, 0x03, 0x02, 0x00, 0xFE, 0x6E, 0x03, 0x02, 0x00, 0xFE, 0x6F, 0x03, -/* 00010080 */ 0x02, 0x00, 0xFE, 0x70, 0x03, 0x02, 0x00, 0xFE, 0x71, 0x03, 0x02, 0x00, 0xFE, 0x72, 0x03, 0x02, -/* 00010090 */ 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x73, 0x03, 0x02, 0x00, 0xFE, 0x74, 0x03, 0x02, 0x00, -/* 000100A0 */ 0xFE, 0x75, 0x03, 0x02, 0x00, 0xFE, 0x76, 0x03, 0x02, 0x00, 0xFE, 0x77, 0x03, 0x02, 0x00, 0xFE, -/* 000100B0 */ 0x78, 0x03, 0x02, 0x00, 0xFE, 0x79, 0x03, 0x02, 0x00, 0xFE, 0x7A, 0x03, 0x02, 0x00, 0xFE, 0x7B, -/* 000100C0 */ 0x03, 0x02, 0x00, 0xFE, 0x7C, 0x03, 0x02, 0x00, 0xFE, 0x7D, 0x03, 0x02, 0x00, 0xFE, 0x7E, 0x03, -/* 000100D0 */ 0x02, 0x00, 0xFE, 0x7F, 0x03, 0x02, 0x00, 0xFE, 0x80, 0x03, 0x02, 0x00, 0xFE, 0x81, 0x03, 0x02, -/* 000100E0 */ 0x00, 0xFE, 0x82, 0x03, 0x02, 0x00, 0xFE, 0x83, 0x03, 0x02, 0x01, 0xFE, 0x84, 0x03, 0xFE, 0xBF, -/* 000100F0 */ 0x02, 0x4F, 0x25, 0x4F, 0x26, 0x4F, 0x27, 0x4F, 0x28, 0x4F, 0x29, 0x4F, 0x2A, 0x4F, 0x2B, 0x4F, -/* 00010100 */ 0x2C, 0x4F, 0x2D, 0x4F, 0x2E, 0x4F, 0x2F, 0x4F, 0x30, 0x4F, 0x31, 0x4F, 0x32, 0x4F, 0x33, 0x4F, -/* 00010110 */ 0x34, 0x4F, 0x35, 0x4F, 0x36, 0x54, 0x25, 0x02, 0x54, 0x26, 0x03, 0x47, 0x38, 0x04, 0x01, 0x04, -/* 00010120 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 00010130 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x06, 0x54, 0x27, 0x38, 0x54, 0x28, 0x07, 0x2F, 0x38, -/* 00010140 */ 0x08, 0x09, 0x54, 0x29, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x28, 0x2F, 0x38, 0x38, -/* 00010150 */ 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x29, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, -/* 00010160 */ 0x38, 0x0B, 0x54, 0x2A, 0x38, 0x47, 0x38, 0x0C, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, -/* 00010170 */ 0x39, 0x2F, 0x38, 0x38, 0x0D, 0x54, 0x2B, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 00010180 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0E, 0x54, 0x2C, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 00010190 */ 0x01, 0x39, 0x2C, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0F, 0x01, 0x04, 0x01, 0x39, 0x27, -/* 000101A0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x10, 0x54, 0x2D, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 000101B0 */ 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x11, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 000101C0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x12, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, -/* 000101D0 */ 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2E, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 000101E0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x14, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, -/* 000101F0 */ 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2F, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 00010200 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x15, 0x54, 0x30, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 00010210 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x16, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 00010220 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x17, 0x54, 0x31, 0x38, 0x47, 0x38, 0x12, 0x01, 0x04, -/* 00010230 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x18, 0x2F, 0x38, 0x0A, 0x38, 0x47, -/* 00010240 */ 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x31, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1A, 0x2F, -/* 00010250 */ 0x38, 0x38, 0x39, 0x47, 0x39, 0x05, 0x01, 0x04, 0x01, 0x3A, 0x25, 0x2F, 0x39, 0x39, 0x3A, 0x2F, -/* 00010260 */ 0x39, 0x39, 0x1B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x32, 0x38, 0x47, 0x38, -/* 00010270 */ 0x1C, 0x01, 0x04, 0x01, 0x39, 0x32, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x47, 0x39, -/* 00010280 */ 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x30, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, -/* 00010290 */ 0x38, 0x39, 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x2F, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, -/* 000102A0 */ 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x54, 0x33, 0x38, 0x47, 0x38, 0x19, 0x01, 0x04, 0x01, 0x39, -/* 000102B0 */ 0x2E, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x1F, 0x47, 0x39, 0x20, 0x01, 0x04, 0x01, 0x3A, -/* 000102C0 */ 0x2D, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x21, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x19, -/* 000102D0 */ 0x01, 0x04, 0x01, 0x3A, 0x2B, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x22, 0x2F, 0x38, 0x38, -/* 000102E0 */ 0x39, 0x54, 0x34, 0x38, 0x47, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x33, 0x2F, 0x38, 0x38, 0x39, -/* 000102F0 */ 0x2F, 0x38, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x34, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, -/* 00010300 */ 0x23, 0x54, 0x35, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x35, 0x2F, 0x38, 0x38, 0x39, -/* 00010310 */ 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, -/* 00010320 */ 0x05, 0x01, 0x04, 0x01, 0x39, 0x2A, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x36, -/* 00010330 */ 0x38, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, -/* 00010340 */ 0x5C, 0x01, 0x33, 0x5D, 0x02, 0x24, 0x00, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x00, 0x00, 0x01, 0x32, -/* 00010350 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x38, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0F, -/* 00010360 */ 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x34, 0x5D, 0x02, 0x24, 0x01, -/* 00010370 */ 0x00, 0xC3, 0x03, 0x38, 0x38, 0x01, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, -/* 00010380 */ 0x00, 0x00, 0x38, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, -/* 00010390 */ 0x03, 0x00, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x24, 0x02, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x02, 0x00, -/* 000103A0 */ 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0xA8, 0x00, 0x24, 0x00, -/* 000103B0 */ 0x00, 0x00, 0x00, 0xFE, 0xB6, 0x45, 0x16, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x03, -/* 000103C0 */ 0x00, 0x1F, 0x00, 0x20, 0x00, 0x33, 0x00, 0x03, 0x00, 0x77, 0x00, 0x07, 0x00, 0xC0, 0x00, 0x20, -/* 000103D0 */ 0x00, 0x44, 0x00, 0x13, 0x00, 0x7D, 0x00, 0x13, 0x00, 0x94, 0x00, 0x20, 0x00, 0x83, 0x00, 0x2D, -/* 000103E0 */ 0x00, 0x83, 0x00, 0x20, 0x00, 0x74, 0x00, 0x13, 0x00, 0x6A, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x43, -/* 000103F0 */ 0x00, 0x00, 0x04, 0x3B, 0x00, 0x4C, 0x01, 0x3B, 0x00, 0x5A, 0x01, 0x20, 0x00, 0x4B, 0x00, 0x2D, -/* 00010400 */ 0x00, 0x6E, 0x00, 0x29, 0x00, 0x66, 0x00, 0x29, 0x00, 0x8B, 0x00, 0x2B, 0x00, 0x72, 0x00, 0x00, -/* 00010410 */ 0xBF, 0xDC, 0x02, 0x00, 0x80, 0xFC, 0x07, 0xFE, 0x08, 0x03, 0xFE, 0xA1, 0x01, 0x04, 0xFF, 0xA1, -/* 00010420 */ 0x41, 0xC1, 0x00, 0x1C, 0x00, 0xFE, 0x99, 0x3F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, -/* 00010430 */ 0x99, 0x3F, 0x55, 0x55, 0x41, 0x02, 0x02, 0x03, 0x05, 0x05, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010440 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010450 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x13, 0xE0, 0x03, -/* 00010460 */ 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x03, 0xA8, 0x00, 0x24, -/* 00010470 */ 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFE, 0x62, 0x03, 0x01, 0xFE, 0xC7, 0x3F, 0x02, 0x00, 0x00, 0x00, -/* 00010480 */ 0x00, 0x11, 0x00, 0x26, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x07, 0x03, -/* 00010490 */ 0xFE, 0x90, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1B, 0x00, 0xFE, 0x34, 0x3D, 0xFF, 0x00, -/* 000104A0 */ 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x34, 0x3D, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x0C, -/* 000104B0 */ 0x07, 0x0F, 0x08, 0x3C, 0x3B, 0x01, 0x01, 0x06, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, -/* 000104C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, -/* 000104D0 */ 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, -/* 000104E0 */ 0x04, 0x02, 0x01, 0xFE, 0x5F, 0x03, 0x02, 0x00, 0xFE, 0x60, 0x03, 0x02, 0x01, 0xFE, 0x61, 0x03, -/* 000104F0 */ 0xFE, 0x12, 0x01, 0x4F, 0x0C, 0x4F, 0x0D, 0x98, 0x10, 0x07, 0x08, 0x00, 0x00, 0x54, 0x0C, 0x10, -/* 00010500 */ 0x2C, 0x10, 0x0C, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0xF0, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00010510 */ 0x31, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00010520 */ 0x11, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0D, -/* 00010530 */ 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x07, 0x02, 0x00, -/* 00010540 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0D, 0xEE, 0x02, 0x10, 0x10, 0x01, 0x00, 0x0F, 0x13, 0x00, 0x10, -/* 00010550 */ 0x09, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x0D, 0x09, 0x09, 0x00, 0x00, 0x11, 0x03, 0x00, 0x0D, 0x0A, -/* 00010560 */ 0x09, 0x6F, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x6D, -/* 00010570 */ 0x10, 0x11, 0x01, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 00010580 */ 0x00, 0x00, 0x12, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0xEE, 0x02, -/* 00010590 */ 0x12, 0x12, 0x03, 0x00, 0x5C, 0x01, 0x12, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, -/* 000105A0 */ 0x12, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x08, 0xEE, 0x02, 0x12, 0x12, -/* 000105B0 */ 0x04, 0x00, 0x5C, 0x02, 0x12, 0x2F, 0x12, 0x04, 0x09, 0x2F, 0x12, 0x12, 0x05, 0x2F, 0x12, 0x12, -/* 000105C0 */ 0x0A, 0x2F, 0x12, 0x12, 0x06, 0x5C, 0x03, 0x12, 0xF2, 0x04, 0xFF, 0x10, 0x01, 0x00, 0x00, 0x00, -/* 000105D0 */ 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x6D, 0x10, -/* 000105E0 */ 0x11, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0x00, 0x10, 0x02, -/* 000105F0 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, -/* 00010600 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, 0x02, 0x1F, 0x00, 0xFE, -/* 00010610 */ 0x86, 0x3D, 0x08, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x33, 0x00, 0x26, -/* 00010620 */ 0x00, 0x41, 0x00, 0x32, 0x00, 0x65, 0x00, 0x6F, 0x00, 0x8D, 0x00, 0x29, 0x00, 0x40, 0x00, 0x08, -/* 00010630 */ 0x00, 0x1F, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x06, 0x03, 0xFE, 0x76, -/* 00010640 */ 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1A, 0x00, 0xFE, 0x17, 0x3A, 0xFF, 0x00, 0x10, 0x01, -/* 00010650 */ 0x00, 0x06, 0x06, 0xFE, 0x17, 0x3A, 0xFE, 0x17, 0x03, 0xFE, 0x17, 0x03, 0x01, 0x0B, 0x0A, 0x11, -/* 00010660 */ 0x0A, 0x51, 0x4B, 0x01, 0x01, 0x08, 0x06, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010670 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010680 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x58, -/* 00010690 */ 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x01, 0xFE, 0x5A, 0x03, 0x04, 0x01, 0xFF, 0xFF, 0xFF, -/* 000106A0 */ 0xFF, 0x02, 0x00, 0xFE, 0x5B, 0x03, 0x02, 0x00, 0xFE, 0x5C, 0x03, 0x02, 0x00, 0xFE, 0x5D, 0x03, -/* 000106B0 */ 0xFE, 0x84, 0x01, 0x4F, 0x0F, 0x98, 0x11, 0x0A, 0x0B, 0x00, 0x00, 0x47, 0x0F, 0x11, 0xA8, 0x11, -/* 000106C0 */ 0x15, 0x03, 0x00, 0x0F, 0x11, 0x09, 0x65, 0x01, 0x0C, 0x03, 0x00, 0x0C, 0x02, 0x09, 0x26, 0x00, -/* 000106D0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x00, -/* 000106E0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x00, 0x00, 0x00, -/* 000106F0 */ 0x00, 0x00, 0x00, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x26, 0x00, 0x8F, 0x01, -/* 00010700 */ 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x01, 0x07, 0x02, -/* 00010710 */ 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x01, 0x00, 0x00, 0x00, 0x01, -/* 00010720 */ 0x00, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x04, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 00010730 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x02, 0x07, 0x02, 0x00, 0x5C, -/* 00010740 */ 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, -/* 00010750 */ 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0D, 0x11, 0x09, 0xCB, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 00010760 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x01, -/* 00010770 */ 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x0D, -/* 00010780 */ 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0x11, 0x11, 0x03, 0x00, 0x0C, 0x03, 0x00, 0x11, 0x06, 0x09, 0x96, -/* 00010790 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x6D, 0x11, 0x12, -/* 000107A0 */ 0x03, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x12, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, -/* 000107B0 */ 0x13, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x13, 0x13, -/* 000107C0 */ 0x05, 0x00, 0x5C, 0x01, 0x13, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x04, -/* 000107D0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0B, 0xEE, 0x02, 0x13, 0x13, 0x06, 0x00, -/* 000107E0 */ 0x5C, 0x02, 0x13, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x07, -/* 000107F0 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x14, 0x05, -/* 00010800 */ 0x00, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0D, 0x5D, 0x03, 0x08, 0x07, 0x00, 0xEE, 0x04, 0x13, 0x13, -/* 00010810 */ 0x07, 0x00, 0x2F, 0x13, 0x07, 0x13, 0x2F, 0x13, 0x13, 0x09, 0x5C, 0x03, 0x13, 0xF2, 0x04, 0xFF, -/* 00010820 */ 0x11, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x00, 0x0F, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, -/* 00010830 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5A, 0x02, 0xFE, 0x5B, 0x02, 0xFE, -/* 00010840 */ 0x5C, 0x02, 0xFE, 0x5D, 0x02, 0x00, 0xFE, 0x5F, 0x3A, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00010850 */ 0x28, 0x00, 0x0A, 0x00, 0x27, 0x00, 0x08, 0x00, 0x29, 0x00, 0x26, 0x00, 0x45, 0x00, 0x08, 0x00, -/* 00010860 */ 0x28, 0x00, 0x26, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x28, 0x00, 0x26, 0x00, 0x3D, 0x00, 0x3F, 0x00, -/* 00010870 */ 0x6B, 0x00, 0x96, 0x00, 0xA6, 0x00, 0x06, 0x00, 0x21, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x3F, -/* 00010880 */ 0xFC, 0x22, 0x04, 0x4F, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x4B, 0x01, 0x14, 0xFF, -/* 00010890 */ 0xA0, 0x41, 0xD1, 0x00, 0x13, 0x00, 0xFE, 0x06, 0x35, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 000108A0 */ 0x01, 0xFE, 0x06, 0x35, 0xFE, 0xE0, 0x04, 0xFE, 0xE0, 0x04, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, -/* 000108B0 */ 0x01, 0x01, 0x01, 0x06, 0x06, 0x06, 0x06, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000108C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000108D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x52, 0x03, 0x02, 0x01, -/* 000108E0 */ 0xFE, 0x53, 0x03, 0x02, 0x01, 0xFE, 0x54, 0x03, 0x02, 0x01, 0xFE, 0x55, 0x03, 0x02, 0x01, 0xFE, -/* 000108F0 */ 0x56, 0x03, 0x02, 0x01, 0xFE, 0x57, 0x03, 0x03, 0x04, 0x8E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, -/* 00010900 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, -/* 00010910 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7B, -/* 00010920 */ 0x0D, 0x0C, 0x00, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, -/* 00010930 */ 0x0C, 0x01, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x02, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, -/* 00010940 */ 0x02, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x03, -/* 00010950 */ 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x04, 0x01, -/* 00010960 */ 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x05, 0x00, 0x00, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x05, 0x01, 0x64, -/* 00010970 */ 0x01, 0x0D, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x08, 0x00, 0x00, 0xEE, 0x03, 0x00, 0x0B, 0x00, -/* 00010980 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 00010990 */ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x5B, 0x02, 0x00, 0x00, 0x5C, -/* 000109A0 */ 0x02, 0x00, 0x00, 0x5A, 0x02, 0x00, 0x00, 0x5F, 0x02, 0x00, 0x00, 0x57, 0x03, 0x00, 0x00, 0x00, -/* 000109B0 */ 0xFE, 0x52, 0x03, 0xFE, 0x5B, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x5A, 0x02, 0xFE, 0x5F, 0x02, 0xFE, -/* 000109C0 */ 0x57, 0x03, 0x00, 0xFE, 0x1C, 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0xC9, 0x04, 0x00, -/* 000109D0 */ 0xE3, 0x0D, 0x01, 0x00, 0x4B, 0x0D, 0x01, 0x00, 0xB3, 0x0C, 0x01, 0x00, 0x1B, 0x0C, 0x01, 0x00, -/* 000109E0 */ 0xCC, 0x0A, 0x01, 0x00, 0xE8, 0x09, 0x01, 0x00, 0xBF, 0xFC, 0x23, 0x0C, 0x00, 0xFC, 0x07, 0xFE, -/* 000109F0 */ 0x57, 0x03, 0xFE, 0x69, 0x01, 0x19, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x19, 0x00, 0xFE, 0x9A, 0x38, -/* 00010A00 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x9A, 0x38, 0xFE, 0x35, 0x01, 0xFE, 0x35, 0x01, -/* 00010A10 */ 0x01, 0x05, 0x04, 0x07, 0x05, 0x1C, 0x1A, 0x19, 0x01, 0x02, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010A20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010A30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x6A, 0x00, 0x04, -/* 00010A40 */ 0x08, 0x6E, 0xEB, 0x00, 0xEC, 0x00, 0x0F, 0x03, 0x00, 0x04, 0x09, 0x5D, 0x00, 0x8F, 0x01, 0x00, -/* 00010A50 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8F, -/* 00010A60 */ 0x01, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, -/* 00010A70 */ 0x04, 0x5C, 0x03, 0x05, 0xEE, 0x04, 0x07, 0x07, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x08, -/* 00010A80 */ 0x00, 0x47, 0x00, 0x03, 0xED, 0x00, 0x09, 0x25, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, -/* 00010A90 */ 0x00, 0x00, 0x07, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0xEE, 0x02, -/* 00010AA0 */ 0x07, 0x07, 0x01, 0x00, 0x47, 0x04, 0x07, 0x09, 0x9A, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00010AB0 */ 0x00, 0x00, 0x00, 0xFE, 0xEF, 0x38, 0x05, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x19, 0x00, 0x34, -/* 00010AC0 */ 0x00, 0x54, 0x00, 0x08, 0x00, 0x37, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x00, 0xBF, 0xFC, 0xA2, 0x04, -/* 00010AD0 */ 0x0F, 0xFC, 0x07, 0xFE, 0x56, 0x03, 0xFE, 0x60, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x18, -/* 00010AE0 */ 0x00, 0xFE, 0x83, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x83, 0x37, 0xFB, 0xFB, -/* 00010AF0 */ 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x05, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0xFF, -/* 00010B00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, -/* 00010B10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00010B20 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, -/* 00010B30 */ 0xC8, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x07, 0x02, 0x00, -/* 00010B40 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x47, 0x07, 0x0A, 0x47, -/* 00010B50 */ 0x08, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x00, 0x07, 0x02, -/* 00010B60 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0xEE, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x0F, 0x7E, 0x00, -/* 00010B70 */ 0x0A, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, -/* 00010B80 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0xEE, 0x02, 0x0A, 0x0A, 0x02, 0x00, 0x0F, -/* 00010B90 */ 0x03, 0x00, 0x0A, 0x09, 0x59, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x0B, -/* 00010BA0 */ 0x03, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x47, 0x0C, 0x07, 0x8F, -/* 00010BB0 */ 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x6D, 0x0D, 0x0E, 0x01, 0x07, -/* 00010BC0 */ 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5D, 0x01, 0x04, 0x04, 0x00, 0x5D, 0x02, 0x05, 0x04, 0x00, 0xF2, -/* 00010BD0 */ 0x03, 0x0D, 0x0D, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x34, 0x0C, 0x0C, 0x0D, 0x00, 0x00, 0x5C, -/* 00010BE0 */ 0x01, 0x0C, 0xF2, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x08, 0x0A, 0x47, -/* 00010BF0 */ 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x17, 0x25, 0x00, 0xFE, 0xA2, -/* 00010C00 */ 0x37, 0x06, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x29, 0x00, 0x03, 0x00, 0x19, 0x00, 0x44, 0x00, -/* 00010C10 */ 0x38, 0x00, 0x59, 0x00, 0x49, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, -/* 00010C20 */ 0xFC, 0x07, 0xFE, 0x55, 0x03, 0xFE, 0x5C, 0x01, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x17, 0x00, -/* 00010C30 */ 0xFE, 0x0D, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0D, 0x37, 0x5D, 0x5D, 0x01, -/* 00010C40 */ 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010C50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010C60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x15, 0x03, -/* 00010C70 */ 0x00, 0x03, 0x05, 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x05, -/* 00010C80 */ 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, -/* 00010C90 */ 0x00, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, -/* 00010CA0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x2C, 0x37, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, -/* 00010CB0 */ 0x3D, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x54, 0x03, 0xFE, 0x58, 0x01, -/* 00010CC0 */ 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x16, 0x00, 0xFE, 0x96, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 00010CD0 */ 0x02, 0x02, 0xFE, 0x96, 0x36, 0x56, 0x56, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, -/* 00010CE0 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010CF0 */ 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010D00 */ 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x14, 0x03, 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, -/* 00010D10 */ 0x47, 0x00, 0x05, 0x09, 0x1E, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, -/* 00010D20 */ 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, -/* 00010D30 */ 0x00, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xB5, -/* 00010D40 */ 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x36, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, -/* 00010D50 */ 0xFC, 0x07, 0xFE, 0x53, 0x03, 0xFE, 0x54, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x15, 0x00, -/* 00010D60 */ 0xFE, 0x21, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x21, 0x36, 0x5C, 0x5C, 0x01, -/* 00010D70 */ 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010D80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010D90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x15, 0x03, -/* 00010DA0 */ 0x00, 0x03, 0x05, 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x05, -/* 00010DB0 */ 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, -/* 00010DC0 */ 0x00, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, -/* 00010DD0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x40, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, -/* 00010DE0 */ 0x3C, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x52, 0x03, 0xFE, 0x4D, 0x01, -/* 00010DF0 */ 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x14, 0x00, 0xFE, 0x48, 0x35, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 00010E00 */ 0x02, 0x02, 0xFE, 0x48, 0x35, 0xC0, 0xC0, 0x01, 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, -/* 00010E10 */ 0x02, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010E20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010E30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x5F, 0x14, 0x03, 0x00, 0x04, 0x02, 0x09, 0x20, -/* 00010E40 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, -/* 00010E50 */ 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x07, 0xF2, 0x01, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00010E60 */ 0x00, 0xA8, 0x06, 0x15, 0x03, 0x00, 0x04, 0x06, 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00010E70 */ 0x0E, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, -/* 00010E80 */ 0xEE, 0x02, 0x06, 0x06, 0x01, 0x00, 0x47, 0x00, 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, -/* 00010E90 */ 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0x00, 0xFE, 0x67, -/* 00010EA0 */ 0x35, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x26, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x35, 0x00, -/* 00010EB0 */ 0x3C, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x8F, 0xFD, 0x07, 0xFE, 0x28, 0x03, 0xFE, 0x30, 0x01, -/* 00010EC0 */ 0x20, 0xFF, 0xA0, 0x41, 0xC1, 0x00, 0x12, 0x00, 0xFE, 0x7F, 0x31, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 00010ED0 */ 0x01, 0x01, 0xFE, 0x7F, 0x31, 0xFE, 0x70, 0x03, 0xFE, 0x70, 0x03, 0x01, 0x07, 0x05, 0x08, 0x06, -/* 00010EE0 */ 0x41, 0x41, 0x01, 0x02, 0x05, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010EF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010F00 */ 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 00010F10 */ 0x01, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x01, 0x4F, 0x05, 0x4F, 0x06, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00010F20 */ 0x40, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x11, 0x00, -/* 00010F30 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x29, -/* 00010F40 */ 0x01, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x4B, 0x09, 0x0F, -/* 00010F50 */ 0x03, 0x00, 0x09, 0x09, 0xAC, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x09, -/* 00010F60 */ 0x02, 0x00, 0x4B, 0x09, 0x0F, 0x1B, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00010F70 */ 0x05, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, -/* 00010F80 */ 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x4B, -/* 00010F90 */ 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x09, 0x09, 0x01, 0x00, 0x54, 0x05, 0x09, -/* 00010FA0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x6D, 0x09, 0x0A, 0x00, -/* 00010FB0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, -/* 00010FC0 */ 0x00, 0x00, 0x0B, 0x02, 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, -/* 00010FD0 */ 0x00, 0x00, 0x02, 0x00, 0x54, 0x06, 0x09, 0x0F, 0x03, 0x00, 0x06, 0x09, 0x15, 0x00, 0x98, 0x09, -/* 00010FE0 */ 0x06, 0x03, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, -/* 00010FF0 */ 0x09, 0x0C, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x05, 0x09, -/* 00011000 */ 0x55, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x6D, 0x09, -/* 00011010 */ 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, -/* 00011020 */ 0x00, 0x0B, 0x04, 0x00, 0x4B, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0B, 0x0B, -/* 00011030 */ 0x04, 0x00, 0x5C, 0x01, 0x0B, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, -/* 00011040 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x98, 0x09, 0x09, 0x04, 0x01, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, -/* 00011050 */ 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, -/* 00011060 */ 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, -/* 00011070 */ 0x02, 0x00, 0x09, 0xFE, 0x51, 0x03, 0x00, 0xFE, 0x95, 0x31, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x15, -/* 00011080 */ 0x00, 0x2B, 0x00, 0x11, 0x00, 0x33, 0x00, 0x15, 0x00, 0x26, 0x00, 0x15, 0x00, 0x29, 0x00, 0x18, -/* 00011090 */ 0x00, 0x33, 0x00, 0x1D, 0x00, 0x2C, 0x00, 0x37, 0x00, 0x4D, 0x00, 0x07, 0x00, 0x5B, 0x00, 0x15, -/* 000110A0 */ 0x00, 0x49, 0x00, 0x0F, 0x00, 0xCB, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x13, 0x00, 0x24, 0x00, 0x00, -/* 000110B0 */ 0xBF, 0xFC, 0x2B, 0x0C, 0x0F, 0xFC, 0x07, 0xFE, 0x27, 0x03, 0xFE, 0x1E, 0x01, 0x19, 0xFF, 0xA2, -/* 000110C0 */ 0x41, 0xC1, 0x00, 0x11, 0x00, 0xFE, 0x5C, 0x2E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, -/* 000110D0 */ 0x5C, 0x2E, 0xFE, 0x91, 0x02, 0xFE, 0x91, 0x02, 0x01, 0x0C, 0x06, 0x10, 0x06, 0x41, 0x36, 0x18, -/* 000110E0 */ 0x01, 0x01, 0x04, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000110F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011100 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x76, 0xCD, 0x00, 0x02, 0x00, 0xFE, 0x50, -/* 00011110 */ 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFA, 0xA8, 0x0D, 0xA8, -/* 00011120 */ 0x0E, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x12, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2C, 0x00, -/* 00011130 */ 0x00, 0x00, 0x11, 0x00, 0x00, 0x47, 0x10, 0x11, 0x09, 0x0F, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00011140 */ 0x2B, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x47, 0x10, 0x11, 0x47, 0x0A, 0x10, 0x8F, 0x01, 0x00, -/* 00011150 */ 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, -/* 00011160 */ 0x01, 0x06, 0xEE, 0x02, 0x10, 0x10, 0x00, 0x00, 0x47, 0x0B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 00011170 */ 0x03, 0xEE, 0x01, 0x10, 0x09, 0x01, 0x00, 0x47, 0x0C, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0B, -/* 00011180 */ 0x10, 0x09, 0x06, 0x00, 0x47, 0x10, 0x0B, 0x09, 0x03, 0x00, 0x47, 0x10, 0x04, 0x47, 0x0B, 0x10, -/* 00011190 */ 0x47, 0x0D, 0x04, 0xEB, 0x00, 0xEC, 0x00, 0x12, 0x03, 0x00, 0x0D, 0x0B, 0x09, 0x49, 0x00, 0x8F, -/* 000111A0 */ 0x01, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, -/* 000111B0 */ 0x03, 0x98, 0x11, 0x06, 0x0D, 0x00, 0x00, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x08, -/* 000111C0 */ 0x5C, 0x04, 0x0C, 0xEE, 0x05, 0x10, 0x10, 0x02, 0x00, 0x47, 0x0E, 0x10, 0x62, 0x10, 0x0E, 0x00, -/* 000111D0 */ 0xA8, 0x11, 0x15, 0x03, 0x00, 0x10, 0x11, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0xED, 0x00, 0x09, -/* 000111E0 */ 0x33, 0x00, 0x28, 0x0D, 0x0D, 0x09, 0xAD, 0xFF, 0xED, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2E, -/* 000111F0 */ 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x5C, -/* 00011200 */ 0x02, 0x0A, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x5C, 0x04, 0x0C, 0xEE, 0x05, 0x00, 0x10, 0x03, 0x00, -/* 00011210 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x02, 0x00, 0xFE, 0xAB, 0x2E, -/* 00011220 */ 0x0C, 0x04, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x58, 0x00, 0x1E, 0x00, 0x34, 0x00, 0x0F, 0x00, 0x32, -/* 00011230 */ 0x00, 0x16, 0x00, 0x39, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x2D, 0x00, 0x69, -/* 00011240 */ 0x00, 0x0E, 0x00, 0x35, 0x00, 0x08, 0x00, 0x4F, 0xFF, 0x08, 0x00, 0xE2, 0x00, 0x2B, 0x00, 0x51, -/* 00011250 */ 0x00, 0x00, 0x3F, 0xFD, 0x6A, 0x04, 0xCF, 0xFD, 0x0F, 0xFE, 0x26, 0x03, 0xE6, 0x1E, 0xFF, 0xA2, -/* 00011260 */ 0x41, 0xC1, 0x00, 0x0E, 0x00, 0xFE, 0xB0, 0x24, 0x02, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, -/* 00011270 */ 0xFE, 0xB0, 0x24, 0xFE, 0x91, 0x09, 0xFE, 0x91, 0x09, 0x03, 0x0E, 0x0B, 0x15, 0x05, 0x71, 0x6A, -/* 00011280 */ 0x01, 0x01, 0x09, 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, 0xFF, 0xFF, 0xFF, -/* 00011290 */ 0xFF, 0xFF, 0x13, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 000112A0 */ 0x00, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, -/* 000112B0 */ 0x46, 0x03, 0x02, 0x00, 0xFE, 0x48, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0x4A, -/* 000112C0 */ 0x03, 0x02, 0x01, 0xFE, 0x4B, 0x03, 0xFE, 0x2E, 0x02, 0x96, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x96, -/* 000112D0 */ 0x04, 0x00, 0x00, 0x00, 0x0D, 0x4F, 0x11, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 000112E0 */ 0x17, 0x00, 0x00, 0x6D, 0x16, 0x17, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x17, 0x93, 0x03, 0x00, -/* 000112F0 */ 0x00, 0x00, 0x18, 0x01, 0x00, 0x5C, 0x01, 0x18, 0xF2, 0x02, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, -/* 00011300 */ 0x00, 0x00, 0x47, 0x0F, 0x16, 0x14, 0x03, 0x00, 0x0F, 0x02, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x00, -/* 00011310 */ 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x93, -/* 00011320 */ 0x03, 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0x16, 0x16, 0x01, 0x00, -/* 00011330 */ 0x47, 0x0F, 0x16, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x33, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, -/* 00011340 */ 0x00, 0x00, 0x00, 0x16, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, -/* 00011350 */ 0x00, 0x1C, 0x00, 0x00, 0x00, 0x17, 0x04, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x00, -/* 00011360 */ 0x00, 0x00, 0x00, 0x17, 0x5C, 0x03, 0x17, 0xEE, 0x04, 0xFF, 0x16, 0x02, 0x00, 0x8F, 0x01, 0x00, -/* 00011370 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x6D, 0x16, 0x17, 0x01, 0x07, 0x03, 0x00, -/* 00011380 */ 0x5C, 0x00, 0x17, 0x93, 0x03, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x5C, 0x01, 0x18, 0xE0, 0x18, -/* 00011390 */ 0x00, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x98, 0x16, -/* 000113A0 */ 0x16, 0x04, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, -/* 000113B0 */ 0x93, 0x03, 0x00, 0x00, 0x00, 0x16, 0x01, 0x00, 0x5C, 0x01, 0x16, 0x5C, 0x02, 0x0E, 0xEE, 0x03, -/* 000113C0 */ 0x16, 0x0C, 0x04, 0x00, 0x47, 0x10, 0x16, 0x93, 0x04, 0x00, 0x00, 0x00, 0x16, 0x05, 0x00, 0xA8, -/* 000113D0 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x49, 0x00, 0xCE, 0x16, 0x00, 0x00, 0x00, 0x96, 0x02, -/* 000113E0 */ 0x00, 0x00, 0x00, 0x16, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x03, 0x00, -/* 000113F0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x17, -/* 00011400 */ 0x04, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x01, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x03, -/* 00011410 */ 0x17, 0xEE, 0x04, 0xFF, 0x16, 0x05, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x16, 0x06, 0x00, 0x47, -/* 00011420 */ 0x0F, 0x16, 0x54, 0x11, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x86, 0x00, 0x0F, 0x03, 0x00, 0x0F, -/* 00011430 */ 0x09, 0x43, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x16, 0x07, 0x00, 0x07, -/* 00011440 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x16, 0x16, 0x06, 0x00, 0x11, 0x03, -/* 00011450 */ 0x00, 0x16, 0x05, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x16, -/* 00011460 */ 0x08, 0x00, 0x4B, 0x16, 0x0F, 0x03, 0x00, 0x16, 0x09, 0x07, 0x00, 0x2F, 0x10, 0x10, 0x06, 0x09, -/* 00011470 */ 0x04, 0x00, 0x2F, 0x10, 0x10, 0x07, 0x47, 0x16, 0x10, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 00011480 */ 0x00, 0x00, 0x17, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00011490 */ 0x1F, 0x00, 0x00, 0x00, 0x18, 0x09, 0x00, 0x5C, 0x01, 0x18, 0x5C, 0x02, 0x0F, 0x5D, 0x03, 0x06, -/* 000114A0 */ 0x07, 0x00, 0xEE, 0x04, 0x17, 0x17, 0x07, 0x00, 0x2F, 0x16, 0x16, 0x17, 0x47, 0x10, 0x16, 0x09, -/* 000114B0 */ 0x05, 0x00, 0xA8, 0x16, 0x47, 0x10, 0x16, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 000114C0 */ 0x16, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000114D0 */ 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x7B, 0x10, 0x17, 0x02, 0x7B, 0x0F, 0x17, 0x03, 0x7B, 0x11, -/* 000114E0 */ 0x17, 0x04, 0x5C, 0x01, 0x17, 0x5D, 0x02, 0x02, 0x08, 0x00, 0xEE, 0x03, 0x00, 0x16, 0x08, 0x00, -/* 000114F0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 00011500 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x6D, 0x02, -/* 00011510 */ 0x00, 0x00, 0x00, 0xFE, 0x2C, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x39, 0x02, 0xFE, -/* 00011520 */ 0x6D, 0x02, 0xFE, 0x4C, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x4D, 0x03, 0x00, 0x0D, 0xFE, 0x4E, 0x03, -/* 00011530 */ 0x00, 0xFE, 0xF4, 0x24, 0x15, 0x0E, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x36, 0x00, 0x08, 0x00, 0x81, -/* 00011540 */ 0x00, 0x26, 0x00, 0x3A, 0x00, 0x07, 0x00, 0x1B, 0x00, 0x33, 0x00, 0x53, 0x02, 0x3D, 0x00, 0x49, -/* 00011550 */ 0x00, 0x1D, 0x00, 0x37, 0x00, 0x12, 0x00, 0x50, 0x00, 0x0B, 0x00, 0x1F, 0x00, 0x33, 0x00, 0xB8, -/* 00011560 */ 0x01, 0x0B, 0x00, 0xF9, 0x00, 0x03, 0x00, 0x29, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x3E, -/* 00011570 */ 0x00, 0x15, 0x00, 0x2E, 0x00, 0x07, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x5C, -/* 00011580 */ 0x00, 0x05, 0x00, 0x29, 0x00, 0x3E, 0x00, 0x99, 0x00, 0x00, 0xCE, 0x16, 0x01, 0x00, 0x92, 0x15, -/* 00011590 */ 0x01, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x8F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x3D, -/* 000115A0 */ 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x10, 0x00, 0xFE, 0x73, 0x29, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 000115B0 */ 0x02, 0xFE, 0x73, 0x29, 0xFE, 0x77, 0x01, 0xFE, 0x77, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, -/* 000115C0 */ 0x20, 0x02, 0x01, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000115D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000115E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 000115F0 */ 0x04, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00011600 */ 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, -/* 00011610 */ 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00011620 */ 0x47, 0x06, 0x09, 0x98, 0x09, 0x06, 0x02, 0x00, 0x00, 0x47, 0x07, 0x09, 0x8F, 0x02, 0x00, 0x00, -/* 00011630 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, -/* 00011640 */ 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x5C, 0x01, 0x0A, 0x8F, 0x01, 0x00, -/* 00011650 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x07, 0xEE, -/* 00011660 */ 0x04, 0x09, 0x09, 0x01, 0x00, 0x15, 0x03, 0x00, 0x09, 0x04, 0x09, 0x39, 0x00, 0x8F, 0x02, 0x00, -/* 00011670 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, -/* 00011680 */ 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x5C, 0x01, 0x0A, 0x8F, 0x01, -/* 00011690 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x05, -/* 000116A0 */ 0xEE, 0x04, 0xFF, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, -/* 000116B0 */ 0x0E, 0xFE, 0x4F, 0x03, 0x00, 0xFE, 0x97, 0x29, 0x05, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x7A, -/* 000116C0 */ 0x00, 0x09, 0x00, 0x24, 0x00, 0x41, 0x00, 0x5F, 0x00, 0x3B, 0x00, 0x55, 0x00, 0x00, 0xBF, 0xFC, -/* 000116D0 */ 0x22, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x3C, 0xFF, 0xA2, 0x41, 0xD1, -/* 000116E0 */ 0x00, 0x0F, 0x00, 0xFE, 0x30, 0x26, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x30, 0x26, -/* 000116F0 */ 0x7D, 0x7D, 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011700 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011710 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, -/* 00011720 */ 0x46, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x04, 0x50, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 00011730 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x02, 0x00, 0x00, 0x00, -/* 00011740 */ 0x23, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, -/* 00011750 */ 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, -/* 00011760 */ 0x5D, 0x04, 0x03, 0x00, 0x00, 0xEE, 0x05, 0x07, 0x07, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, -/* 00011770 */ 0x03, 0x00, 0x00, 0x00, 0x07, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x54, 0x26, 0x02, -/* 00011780 */ 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x00, 0x3F, 0xFC, 0x2A, 0x04, 0x0F, 0xFC, 0x0F, -/* 00011790 */ 0xFE, 0x25, 0x03, 0xCD, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0C, 0x00, 0xFE, 0x7F, 0x20, 0x01, -/* 000117A0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x7F, 0x20, 0xFE, 0x11, 0x04, 0xFE, 0x11, 0x04, -/* 000117B0 */ 0x07, 0x05, 0x09, 0x04, 0x2A, 0x29, 0x01, 0x01, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, -/* 000117C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, -/* 000117D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, -/* 000117E0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0xBD, 0x4F, 0x06, 0x4F, 0x07, 0x8F, -/* 000117F0 */ 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x4B, 0x09, 0x0F, 0x1B, 0x00, -/* 00011800 */ 0x09, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, -/* 00011810 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 00011820 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 00011830 */ 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 00011840 */ 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, -/* 00011850 */ 0x54, 0x06, 0x09, 0x0F, 0x08, 0x00, 0x06, 0x09, 0x00, 0x00, 0xA8, 0x00, 0x09, 0x47, 0x00, 0x98, -/* 00011860 */ 0x0B, 0x06, 0x03, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5D, -/* 00011870 */ 0x01, 0x04, 0x02, 0x00, 0xF2, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6D, 0x09, -/* 00011880 */ 0x0A, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x5C, 0x01, -/* 00011890 */ 0x0B, 0xF2, 0x02, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x54, 0x07, 0x09, 0x47, 0x00, -/* 000118A0 */ 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0xFE, 0x75, 0x01, -/* 000118B0 */ 0xAF, 0x00, 0xFE, 0x9B, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0x15, 0x00, 0x24, 0x00, 0x18, 0x00, -/* 000118C0 */ 0x2B, 0x00, 0x37, 0x00, 0x4B, 0x00, 0x07, 0x00, 0x1A, 0x00, 0x05, 0x00, 0x5C, 0x02, 0x3F, 0x00, -/* 000118D0 */ 0xCD, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0xDB, 0x18, 0x01, 0x00, 0xBF, 0xDC, 0x02, 0x00, 0x00, -/* 000118E0 */ 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x36, 0xFF, 0xA2, 0x41, 0xD0, 0x00, 0x0D, 0xFE, -/* 000118F0 */ 0x01, 0x10, 0xFE, 0xD9, 0x23, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xD9, 0x23, 0x0A, -/* 00011900 */ 0x0A, 0x01, 0x02, 0x02, 0x03, 0x0A, 0x0A, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011910 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011920 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x17, 0xAC, 0x03, -/* 00011930 */ 0x0F, 0x02, 0x00, 0x02, 0xAB, 0x03, 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x03, 0xAB, 0x00, 0x09, 0x02, -/* 00011940 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xE0, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, -/* 00011950 */ 0x15, 0x00, 0x03, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x47, 0x03, 0xB6, -/* 00011960 */ 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0B, 0x00, 0xFE, 0xEC, 0x1B, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 00011970 */ 0x02, 0x02, 0xFE, 0xEC, 0x1B, 0xFE, 0x73, 0x04, 0xFE, 0x73, 0x04, 0x01, 0x09, 0x09, 0x0D, 0x04, -/* 00011980 */ 0x58, 0x4C, 0x01, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011990 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000119A0 */ 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, -/* 000119B0 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x01, 0x03, -/* 000119C0 */ 0x00, 0x00, 0x00, 0xFE, 0x8E, 0x01, 0x4F, 0x0A, 0x4F, 0x0B, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 000119D0 */ 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x62, 0x0F, 0x0F, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x02, -/* 000119E0 */ 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, -/* 000119F0 */ 0x00, 0x47, 0x0A, 0x0E, 0xA8, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0x31, 0x01, 0x8F, 0x01, -/* 00011A00 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x02, 0x07, 0x02, -/* 00011A10 */ 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x01, -/* 00011A20 */ 0x00, 0x47, 0x0A, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0xB5, 0x00, 0x8F, 0x01, 0x00, 0x00, -/* 00011A30 */ 0x00, 0x42, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x00, 0x4B, 0x0E, 0x0F, 0x1B, 0x00, 0x0E, 0x09, 0x00, -/* 00011A40 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x07, 0x01, 0x00, -/* 00011A50 */ 0x5C, 0x00, 0x03, 0xEE, 0x01, 0xFF, 0x0E, 0x02, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00011A60 */ 0x00, 0x00, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, -/* 00011A70 */ 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x4B, 0x10, -/* 00011A80 */ 0x5C, 0x02, 0x10, 0xF2, 0x03, 0x0E, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0B, 0x0E, -/* 00011A90 */ 0x98, 0x0E, 0x0B, 0x04, 0x00, 0x00, 0x98, 0x0F, 0x0B, 0x05, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x0F, -/* 00011AA0 */ 0x09, 0x10, 0x00, 0x98, 0x10, 0x0B, 0x05, 0x02, 0x00, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, -/* 00011AB0 */ 0x09, 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x98, 0x0F, 0x0B, 0x08, 0x03, 0x00, -/* 00011AC0 */ 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x10, 0x00, 0x98, 0x10, 0x0B, 0x08, 0x04, 0x00, 0x2F, 0x10, 0x06, -/* 00011AD0 */ 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x47, 0x0A, -/* 00011AE0 */ 0x0E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x62, 0x0F, 0x0F, -/* 00011AF0 */ 0x00, 0x6D, 0x0E, 0x0F, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xA8, 0x10, -/* 00011B00 */ 0x14, 0x03, 0x00, 0x0A, 0x10, 0x09, 0x14, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, -/* 00011B10 */ 0x00, 0x11, 0x03, 0x00, 0x4B, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x0A, 0x5C, -/* 00011B20 */ 0x02, 0x10, 0xF2, 0x03, 0xFF, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x1B, 0x00, 0x8F, -/* 00011B30 */ 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x14, 0x03, 0x00, -/* 00011B40 */ 0x0A, 0x0E, 0x09, 0x05, 0x00, 0xA8, 0x0E, 0x47, 0x0A, 0x0E, 0x47, 0x00, 0x0A, 0x09, 0x02, 0x00, -/* 00011B50 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x04, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0x29, 0x02, 0xFE, -/* 00011B60 */ 0x37, 0x02, 0xFE, 0xB8, 0x01, 0x00, 0xFE, 0x16, 0x1C, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x2A, 0x00, -/* 00011B70 */ 0x53, 0x00, 0x0A, 0x00, 0x30, 0x00, 0x26, 0x00, 0x51, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x15, 0x00, -/* 00011B80 */ 0x2D, 0x00, 0x18, 0x00, 0x3A, 0x00, 0x37, 0x00, 0xB1, 0x00, 0x51, 0x00, 0x34, 0x01, 0x4E, 0x00, -/* 00011B90 */ 0x80, 0x00, 0x16, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x1B, 0x00, 0x00, 0xBF, -/* 00011BA0 */ 0xFC, 0x2A, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x45, 0x03, 0x9B, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, -/* 00011BB0 */ 0x0A, 0x00, 0xFE, 0x46, 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x46, 0x17, 0xFE, -/* 00011BC0 */ 0x86, 0x04, 0xFE, 0x86, 0x04, 0x01, 0x0A, 0x09, 0x0E, 0x04, 0x61, 0x54, 0x01, 0x05, 0x05, 0x04, -/* 00011BD0 */ 0x05, 0x05, 0x05, 0x05, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011BE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011BF0 */ 0x00, 0x00, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, -/* 00011C00 */ 0xFE, 0x46, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xAD, 0x01, -/* 00011C10 */ 0x4F, 0x0C, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x62, 0x10, -/* 00011C20 */ 0x10, 0x00, 0x6D, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xF2, -/* 00011C30 */ 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0B, 0x0F, 0xA8, 0x0F, 0x14, 0x03, -/* 00011C40 */ 0x00, 0x0B, 0x0F, 0x09, 0x31, 0x01, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, -/* 00011C50 */ 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xF2, -/* 00011C60 */ 0x02, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0B, -/* 00011C70 */ 0x02, 0x09, 0xB5, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x00, -/* 00011C80 */ 0x4B, 0x0F, 0x0F, 0x1B, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, -/* 00011C90 */ 0x00, 0x00, 0x0F, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0xEE, 0x01, 0xFF, 0x0F, 0x02, -/* 00011CA0 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, -/* 00011CB0 */ 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x42, -/* 00011CC0 */ 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0xF2, 0x03, 0x0F, 0x0F, 0x03, -/* 00011CD0 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0C, 0x0F, 0x98, 0x0F, 0x0C, 0x04, 0x00, 0x00, 0x98, 0x10, -/* 00011CE0 */ 0x0C, 0x05, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x10, 0x00, 0x98, 0x11, 0x0C, 0x05, 0x02, -/* 00011CF0 */ 0x00, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, -/* 00011D00 */ 0x0F, 0x10, 0x98, 0x10, 0x0C, 0x08, 0x03, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x10, 0x00, 0x98, -/* 00011D10 */ 0x11, 0x0C, 0x08, 0x04, 0x00, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, -/* 00011D20 */ 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x47, 0x0B, 0x0F, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00011D30 */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x62, 0x10, 0x10, 0x00, 0x6D, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, -/* 00011D40 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xA8, 0x11, 0x14, 0x03, 0x00, 0x0B, 0x11, 0x09, 0x14, 0x00, -/* 00011D50 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x4B, 0x12, 0x47, 0x11, -/* 00011D60 */ 0x12, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0B, 0x5C, 0x02, 0x11, 0xF2, 0x03, 0xFF, 0x0F, 0x04, 0x00, -/* 00011D70 */ 0x00, 0x00, 0x04, 0x00, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, -/* 00011D80 */ 0x0F, 0x03, 0x00, 0x4B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x05, 0x00, 0xA8, 0x0F, 0x47, -/* 00011D90 */ 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0A, 0x09, 0x09, 0x09, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x1B, 0x00, -/* 00011DA0 */ 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x0B, 0x09, 0x08, 0x00, 0xA8, 0x00, 0x09, 0x0B, 0x00, -/* 00011DB0 */ 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 00011DC0 */ 0x05, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0x2A, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0xB8, 0x01, 0x00, 0xFE, -/* 00011DD0 */ 0x71, 0x17, 0x11, 0x02, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x46, 0x00, 0x0A, 0x00, 0x30, 0x00, 0x26, -/* 00011DE0 */ 0x00, 0x44, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x15, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x3A, 0x00, 0x37, -/* 00011DF0 */ 0x00, 0x52, 0x00, 0x51, 0x00, 0x0C, 0x01, 0x4E, 0x00, 0x73, 0x00, 0x16, 0x00, 0x30, 0x00, 0x05, -/* 00011E00 */ 0x00, 0x2F, 0x00, 0x08, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x26, 0x00, 0x08, 0x00, 0x34, 0x00, 0x08, -/* 00011E10 */ 0x00, 0x2F, 0x00, 0x08, 0x00, 0x25, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 00011E20 */ 0x24, 0x03, 0x97, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x09, 0x00, 0xFE, 0xD3, 0x16, 0xFF, 0x00, -/* 00011E30 */ 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xD3, 0x16, 0x51, 0x51, 0x01, 0x05, 0x02, 0x05, 0x04, 0x0B, -/* 00011E40 */ 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011E50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011E60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x2D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 00011E70 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x6D, 0x05, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, -/* 00011E80 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x02, 0xF2, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00011E90 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0xA5, 0x02, 0x00, 0xFE, 0xF0, 0x16, -/* 00011EA0 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x33, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x00, 0x0F, 0xFC, -/* 00011EB0 */ 0x07, 0xFE, 0x23, 0x03, 0x91, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x08, 0x00, 0xFE, 0x39, 0x16, -/* 00011EC0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x39, 0x16, 0x7B, 0x7B, 0x41, 0x02, 0x04, 0x05, -/* 00011ED0 */ 0x0A, 0x0A, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011EE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011EF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x0A, -/* 00011F00 */ 0x80, 0x01, 0x07, 0x00, 0x0A, 0x80, 0x1E, 0x62, 0x05, 0x04, 0x00, 0x14, 0x0F, 0x00, 0x05, 0x02, -/* 00011F10 */ 0x09, 0x00, 0x00, 0x62, 0x05, 0x04, 0x00, 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, 0x02, 0x00, 0x23, -/* 00011F20 */ 0x04, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2E, 0x01, 0x00, 0xFE, 0x51, 0x16, 0x03, 0x00, -/* 00011F30 */ 0x00, 0x00, 0x00, 0x18, 0x00, 0x4A, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0xBF, 0xFC, 0x2B, 0x08, -/* 00011F40 */ 0x00, 0xFC, 0x07, 0xFE, 0x22, 0x03, 0x86, 0x1B, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x07, 0x00, 0xFE, -/* 00011F50 */ 0xE0, 0x14, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xE0, 0x14, 0xD5, 0xD5, 0x41, 0x06, -/* 00011F60 */ 0x05, 0x09, 0x03, 0x15, 0x13, 0x10, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011F70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011F80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x05, 0x3C, -/* 00011F90 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x4F, 0x08, 0x47, -/* 00011FA0 */ 0x08, 0x02, 0xEB, 0x00, 0xEC, 0x00, 0x12, 0x03, 0x00, 0x08, 0x06, 0x09, 0x29, 0x00, 0xBA, 0x09, -/* 00011FB0 */ 0x08, 0x05, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x18, 0x00, 0x47, 0x09, 0x07, 0x07, 0x02, 0x00, 0x5C, -/* 00011FC0 */ 0x00, 0x03, 0x98, 0x0A, 0x05, 0x08, 0x00, 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0xFF, 0x09, 0x00, -/* 00011FD0 */ 0x00, 0x28, 0x08, 0x08, 0x09, 0xCD, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 00011FE0 */ 0xFE, 0x07, 0x15, 0x06, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, 0x00, -/* 00011FF0 */ 0x0B, 0x00, 0x26, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x0A, 0x00, 0x19, 0x00, 0x00, 0xBF, 0xFC, 0x22, -/* 00012000 */ 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x35, 0x03, 0x79, 0x22, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x06, 0x00, -/* 00012010 */ 0xFE, 0x57, 0x13, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x57, 0x13, 0xFE, 0x6B, 0x01, -/* 00012020 */ 0xFE, 0x6B, 0x01, 0x01, 0x08, 0x04, 0x08, 0x04, 0x2A, 0x27, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, -/* 00012030 */ 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012040 */ 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, -/* 00012050 */ 0x04, 0xB6, 0x4F, 0x05, 0x4F, 0x06, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, -/* 00012060 */ 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0xF2, -/* 00012070 */ 0x02, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x05, 0x09, 0x14, 0x03, 0x00, 0x05, -/* 00012080 */ 0x02, 0x09, 0x7A, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, -/* 00012090 */ 0x4B, 0x09, 0x0F, 0x1B, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, -/* 000120A0 */ 0x00, 0x00, 0x09, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0xEE, 0x01, 0xFF, 0x09, 0x01, -/* 000120B0 */ 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, -/* 000120C0 */ 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x44, -/* 000120D0 */ 0x00, 0x00, 0x00, 0x0B, 0x01, 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x01, -/* 000120E0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x06, 0x09, 0xAC, 0x09, 0x0F, 0x02, 0x00, 0x06, 0xAB, 0x09, -/* 000120F0 */ 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x09, 0xAB, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, -/* 00012100 */ 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x26, 0x02, 0xFE, 0x37, 0x02, -/* 00012110 */ 0x00, 0xFE, 0x74, 0x13, 0x08, 0x04, 0x00, 0x00, 0x00, 0x26, 0x00, 0x40, 0x00, 0x08, 0x00, 0x23, -/* 00012120 */ 0x00, 0x15, 0x00, 0x24, 0x00, 0x18, 0x00, 0x32, 0x00, 0x37, 0x00, 0x4A, 0x00, 0x16, 0x00, 0x2D, -/* 00012130 */ 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, 0xFC, 0x62, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x34, 0x03, -/* 00012140 */ 0x6C, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x05, 0x00, 0xFE, 0x48, 0x11, 0xFF, 0x00, 0x10, 0x01, -/* 00012150 */ 0x00, 0x03, 0x03, 0xFE, 0x48, 0x11, 0xFE, 0xEA, 0x01, 0xFE, 0xEA, 0x01, 0x41, 0x06, 0x05, 0x09, -/* 00012160 */ 0x04, 0x14, 0x12, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012170 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012180 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, -/* 00012190 */ 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x44, 0x03, 0x4F, 0x4F, 0x07, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 000121A0 */ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, -/* 000121B0 */ 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000121C0 */ 0x47, 0x07, 0x09, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x18, 0x00, 0x77, 0x03, 0x05, 0x01, 0x47, -/* 000121D0 */ 0x09, 0x05, 0xCE, 0x0A, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x04, 0x0A, 0xA1, 0x01, 0x03, 0x0A, 0x77, -/* 000121E0 */ 0x0A, 0x09, 0x02, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2F, 0x02, 0xFE, 0x12, 0x02, 0xFE, -/* 000121F0 */ 0x25, 0x02, 0x00, 0xFE, 0x77, 0x11, 0x05, 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x4F, 0x00, 0x08, -/* 00012200 */ 0x00, 0x71, 0x00, 0x04, 0x00, 0x33, 0x00, 0x16, 0x00, 0xC7, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, -/* 00012210 */ 0x0F, 0xFC, 0x07, 0xFE, 0x33, 0x03, 0x63, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x04, 0x00, 0xFE, -/* 00012220 */ 0x05, 0x10, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x05, 0x10, 0xFE, 0x21, 0x01, 0xFE, -/* 00012230 */ 0x21, 0x01, 0x41, 0x05, 0x04, 0x07, 0x03, 0x0E, 0x0D, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, -/* 00012240 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, -/* 00012250 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00012260 */ 0x00, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x38, 0x4F, 0x05, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 00012270 */ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x6D, 0x07, 0x08, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, -/* 00012280 */ 0x5C, 0x01, 0x04, 0xF2, 0x02, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x05, 0x07, -/* 00012290 */ 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x04, 0x00, 0x77, 0x03, 0x04, 0x01, 0xA8, 0x00, 0x24, 0x00, -/* 000122A0 */ 0x00, 0x00, 0xFE, 0x2E, 0x02, 0xFE, 0x12, 0x02, 0x00, 0xFE, 0x27, 0x10, 0x04, 0x02, 0x00, 0x00, -/* 000122B0 */ 0x00, 0x26, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x71, 0x00, 0x06, 0x00, 0x4E, 0x00, 0x00, 0xBF, 0xFC, -/* 000122C0 */ 0x22, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x32, 0x03, 0x52, 0x1D, 0xFF, 0xA0, 0x41, 0xC1, 0x00, 0x03, -/* 000122D0 */ 0x00, 0xFE, 0x1D, 0x0E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x1D, 0x0E, 0xFE, 0xC9, -/* 000122E0 */ 0x01, 0xFE, 0xC9, 0x01, 0x01, 0x04, 0x03, 0x05, 0x02, 0x1D, 0x1D, 0x01, 0x01, 0x02, 0x02, 0x02, -/* 000122F0 */ 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012300 */ 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012310 */ 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x43, 0x03, 0x99, 0x4F, 0x03, 0x8F, 0x01, 0x00, 0x00, 0x00, -/* 00012320 */ 0x3B, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x4B, 0x05, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x28, 0x00, -/* 00012330 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x62, 0x05, 0x05, 0x00, -/* 00012340 */ 0x0F, 0x03, 0x00, 0x05, 0x09, 0x11, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, -/* 00012350 */ 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x58, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00012360 */ 0x00, 0x06, 0x01, 0x00, 0x6D, 0x05, 0x06, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x06, 0xF2, 0x01, -/* 00012370 */ 0x05, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x03, 0x05, 0x0F, 0x12, 0x00, 0x03, 0x09, -/* 00012380 */ 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x02, 0x09, 0x0C, -/* 00012390 */ 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x03, 0x8F, 0x01, 0x00, -/* 000123A0 */ 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 000123B0 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x03, 0xFE, 0x2B, 0x02, 0x00, 0xFE, 0x33, 0x0E, 0x08, 0x02, -/* 000123C0 */ 0x00, 0x00, 0x00, 0x2C, 0x00, 0x39, 0x00, 0x11, 0x00, 0x2B, 0x00, 0x23, 0x00, 0x34, 0x00, 0x07, -/* 000123D0 */ 0x00, 0x9C, 0x00, 0x0F, 0x00, 0x35, 0x00, 0x0C, 0x00, 0x2D, 0x00, 0x13, 0x00, 0x1C, 0x00, 0x00, -/* 000123E0 */ 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x17, 0x03, 0x3B, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, -/* 000123F0 */ 0x00, 0x02, 0x00, 0xFE, 0xC9, 0x09, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xC9, 0x09, -/* 00012400 */ 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012410 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00012420 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x45, -/* 00012430 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, -/* 00012440 */ 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, -/* 00012450 */ 0x00, 0x09, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x5D, 0x02, 0x02, -/* 00012460 */ 0x01, 0x00, 0xEE, 0x03, 0x09, 0x09, 0x01, 0x00, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x08, 0x00, -/* 00012470 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xF4, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, -/* 00012480 */ 0x43, 0x00, 0x46, 0x00, 0x00}; +/* 00003050 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00003060 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, +/* 00003070 */ 0x31, 0x00, 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, +/* 00003080 */ 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, +/* 00003090 */ 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, +/* 000030A0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, +/* 000030B0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, +/* 000030C0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, +/* 000030D0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000030E0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, +/* 000030F0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, +/* 00003100 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, +/* 00003110 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, +/* 00003120 */ 0x2F, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2F, 0x00, +/* 00003130 */ 0x73, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2F, 0x00, 0x6D, 0x00, +/* 00003140 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00003150 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00003160 */ 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, +/* 00003170 */ 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00003180 */ 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, +/* 00003190 */ 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, +/* 000031A0 */ 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 000031B0 */ 0x72, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 000031C0 */ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, +/* 000031D0 */ 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, +/* 000031E0 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, +/* 000031F0 */ 0x6B, 0x00, 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, +/* 00003200 */ 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00003210 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, +/* 00003220 */ 0x77, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, +/* 00003230 */ 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00003240 */ 0x20, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, +/* 00003250 */ 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, +/* 00003260 */ 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00003270 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00003280 */ 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, +/* 00003290 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, +/* 000032A0 */ 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 000032B0 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 000032C0 */ 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7B, 0x00, +/* 000032D0 */ 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x5B, 0x00, 0x61, 0x00, +/* 000032E0 */ 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 000032F0 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, +/* 00003300 */ 0x5C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, +/* 00003310 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, +/* 00003320 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, +/* 00003330 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00003340 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, +/* 00003350 */ 0x72, 0x00, 0x31, 0x00, 0x32, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00003360 */ 0x61, 0x00, 0x74, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, +/* 00003370 */ 0x72, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, +/* 00003380 */ 0x31, 0x00, 0x32, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, +/* 00003390 */ 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x48, 0x00, 0x6F, 0x00, +/* 000033A0 */ 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, +/* 000033B0 */ 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x76, 0x00, +/* 000033C0 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000033D0 */ 0x65, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 000033E0 */ 0x31, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 000033F0 */ 0x32, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 00003400 */ 0x6C, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00003410 */ 0x5F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00003420 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, +/* 00003430 */ 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, +/* 00003440 */ 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x5F, 0x00, +/* 00003450 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00003460 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00003470 */ 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, +/* 00003480 */ 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00003490 */ 0x74, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 000034A0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 000034B0 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x65, 0x00, 0x6E, 0x00, +/* 000034C0 */ 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 000034D0 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 000034E0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, +/* 000034F0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 00003500 */ 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00003510 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00003520 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, +/* 00003530 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 00003540 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, +/* 00003550 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00003560 */ 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, +/* 00003570 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x00, 0x00, +/* 00003580 */ 0xFE, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, +/* 00003590 */ 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x8F, +/* 000035A0 */ 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x5B, +/* 000035B0 */ 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xE8, +/* 000035C0 */ 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x63, +/* 000035D0 */ 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xFB, +/* 000035E0 */ 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x5E, 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x70, +/* 000035F0 */ 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xDA, +/* 00003600 */ 0x04, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x79, +/* 00003610 */ 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0xBD, 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0x01, +/* 00003620 */ 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5C, +/* 00003630 */ 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xCD, +/* 00003640 */ 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x50, +/* 00003650 */ 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x53, +/* 00003660 */ 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0xAA, +/* 00003670 */ 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0x36, 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3E, +/* 00003680 */ 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0xD6, 0x0A, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x62, +/* 00003690 */ 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0xAF, 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0x33, +/* 000036A0 */ 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x82, 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0x2E, +/* 000036B0 */ 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x63, 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0xA2, +/* 000036C0 */ 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDB, 0x0D, 0x00, 0x00, 0x46, 0x0E, 0x00, 0x00, 0x77, +/* 000036D0 */ 0x0E, 0x00, 0x00, 0x87, 0x0E, 0x00, 0x00, 0xA6, 0x0E, 0x00, 0x00, 0xC9, 0x0E, 0x00, 0x00, 0xEC, +/* 000036E0 */ 0x0E, 0x00, 0x00, 0x0D, 0x0F, 0x00, 0x00, 0x2D, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x4A, +/* 000036F0 */ 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x00, 0x9B, 0x0F, 0x00, 0x00, 0xD0, +/* 00003700 */ 0x0F, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x33, +/* 00003710 */ 0x10, 0x00, 0x00, 0x4A, 0x10, 0x00, 0x00, 0x99, 0x10, 0x00, 0x00, 0xCB, 0x10, 0x00, 0x00, 0xEF, +/* 00003720 */ 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x26, 0x11, 0x00, 0x00, 0x30, 0x11, 0x00, 0x00, 0x31, +/* 00003730 */ 0x11, 0x00, 0x00, 0x51, 0x11, 0x00, 0x00, 0x58, 0x11, 0x00, 0x00, 0x59, 0x11, 0x00, 0x00, 0x9F, +/* 00003740 */ 0x11, 0x00, 0x00, 0xEE, 0x11, 0x00, 0x00, 0x0D, 0x12, 0x00, 0x00, 0x5B, 0x12, 0x00, 0x00, 0x8E, +/* 00003750 */ 0x12, 0x00, 0x00, 0xBE, 0x12, 0x00, 0x00, 0xFE, 0x12, 0x00, 0x00, 0x2A, 0x13, 0x00, 0x00, 0x38, +/* 00003760 */ 0x13, 0x00, 0x00, 0x42, 0x13, 0x00, 0x00, 0x5D, 0x13, 0x00, 0x00, 0x64, 0x13, 0x00, 0x00, 0x65, +/* 00003770 */ 0x13, 0x00, 0x00, 0x9C, 0x13, 0x00, 0x00, 0xDC, 0x13, 0x00, 0x00, 0xFB, 0x13, 0x00, 0x00, 0x1B, +/* 00003780 */ 0x14, 0x00, 0x00, 0x43, 0x14, 0x00, 0x00, 0x51, 0x14, 0x00, 0x00, 0x9B, 0x14, 0x00, 0x00, 0xB7, +/* 00003790 */ 0x14, 0x00, 0x00, 0xC8, 0x14, 0x00, 0x00, 0xE3, 0x14, 0x00, 0x00, 0xED, 0x14, 0x00, 0x00, 0xF4, +/* 000037A0 */ 0x14, 0x00, 0x00, 0xF5, 0x14, 0x00, 0x00, 0x2F, 0x15, 0x00, 0x00, 0x48, 0x15, 0x00, 0x00, 0x6B, +/* 000037B0 */ 0x15, 0x00, 0x00, 0x8D, 0x15, 0x00, 0x00, 0xB1, 0x15, 0x00, 0x00, 0xBF, 0x15, 0x00, 0x00, 0xD6, +/* 000037C0 */ 0x15, 0x00, 0x00, 0xE0, 0x15, 0x00, 0x00, 0xE7, 0x15, 0x00, 0x00, 0xE8, 0x15, 0x00, 0x00, 0x4D, +/* 000037D0 */ 0x16, 0x00, 0x00, 0x79, 0x16, 0x00, 0x00, 0xBF, 0x16, 0x00, 0x00, 0xD5, 0x16, 0x00, 0x00, 0xDF, +/* 000037E0 */ 0x16, 0x00, 0x00, 0xE6, 0x16, 0x00, 0x00, 0xE7, 0x16, 0x00, 0x00, 0x18, 0x17, 0x00, 0x00, 0x4F, +/* 000037F0 */ 0x17, 0x00, 0x00, 0x56, 0x17, 0x00, 0x00, 0x57, 0x17, 0x00, 0x00, 0x99, 0x17, 0x00, 0x00, 0xDF, +/* 00003800 */ 0x17, 0x00, 0x00, 0x0B, 0x18, 0x00, 0x00, 0x4F, 0x18, 0x00, 0x00, 0x7A, 0x18, 0x00, 0x00, 0xA3, +/* 00003810 */ 0x18, 0x00, 0x00, 0xCF, 0x18, 0x00, 0x00, 0xE1, 0x18, 0x00, 0x00, 0x33, 0x19, 0x00, 0x00, 0xA8, +/* 00003820 */ 0x19, 0x00, 0x00, 0xB6, 0x19, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x00, 0x43, 0x1A, 0x00, 0x00, 0xB3, +/* 00003830 */ 0x1A, 0x00, 0x00, 0xE6, 0x1A, 0x00, 0x00, 0x0E, 0x1B, 0x00, 0x00, 0x18, 0x1B, 0x00, 0x00, 0x19, +/* 00003840 */ 0x1B, 0x00, 0x00, 0x41, 0x1B, 0x00, 0x00, 0x64, 0x1B, 0x00, 0x00, 0x9B, 0x1B, 0x00, 0x00, 0xB9, +/* 00003850 */ 0x1B, 0x00, 0x00, 0xCA, 0x1B, 0x00, 0x00, 0xED, 0x1B, 0x00, 0x00, 0xF7, 0x1B, 0x00, 0x00, 0xFD, +/* 00003860 */ 0x1B, 0x00, 0x00, 0xFE, 0x1B, 0x00, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x91, 0x1C, 0x00, 0x00, 0xBD, +/* 00003870 */ 0x1C, 0x00, 0x00, 0x0E, 0x1D, 0x00, 0x00, 0x39, 0x1D, 0x00, 0x00, 0x62, 0x1D, 0x00, 0x00, 0x8E, +/* 00003880 */ 0x1D, 0x00, 0x00, 0xA0, 0x1D, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x51, 0x1E, 0x00, 0x00, 0x7B, +/* 00003890 */ 0x1E, 0x00, 0x00, 0xB4, 0x1E, 0x00, 0x00, 0xEE, 0x1E, 0x00, 0x00, 0xFC, 0x1E, 0x00, 0x00, 0x47, +/* 000038A0 */ 0x1F, 0x00, 0x00, 0x89, 0x1F, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00, 0x61, +/* 000038B0 */ 0x20, 0x00, 0x00, 0x6B, 0x20, 0x00, 0x00, 0x8A, 0x20, 0x00, 0x00, 0x90, 0x20, 0x00, 0x00, 0x91, +/* 000038C0 */ 0x20, 0x00, 0x00, 0xC3, 0x20, 0x00, 0x00, 0xE3, 0x20, 0x00, 0x00, 0x07, 0x21, 0x00, 0x00, 0x11, +/* 000038D0 */ 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x00, 0x5D, 0x21, 0x00, 0x00, 0x73, 0x21, 0x00, 0x00, 0x91, +/* 000038E0 */ 0x21, 0x00, 0x00, 0x9B, 0x21, 0x00, 0x00, 0x9C, 0x21, 0x00, 0x00, 0x11, 0x22, 0x00, 0x00, 0x61, +/* 000038F0 */ 0x22, 0x00, 0x00, 0xA6, 0x22, 0x00, 0x00, 0xA7, 0x22, 0x00, 0x00, 0x1A, 0x23, 0x00, 0x00, 0x33, +/* 00003900 */ 0x23, 0x00, 0x00, 0x57, 0x23, 0x00, 0x00, 0x7B, 0x23, 0x00, 0x00, 0xD3, 0x23, 0x00, 0x00, 0x16, +/* 00003910 */ 0x24, 0x00, 0x00, 0x9F, 0x24, 0x00, 0x00, 0xA0, 0x24, 0x00, 0x00, 0xBB, 0x24, 0x00, 0x00, 0xC1, +/* 00003920 */ 0x24, 0x00, 0x00, 0xC2, 0x24, 0x00, 0x00, 0x1C, 0x25, 0x00, 0x00, 0x52, 0x25, 0x00, 0x00, 0x72, +/* 00003930 */ 0x25, 0x00, 0x00, 0xCF, 0x25, 0x00, 0x00, 0x02, 0x26, 0x00, 0x00, 0x0C, 0x26, 0x00, 0x00, 0x0D, +/* 00003940 */ 0x26, 0x00, 0x00, 0x24, 0x26, 0x00, 0x00, 0x74, 0x26, 0x00, 0x00, 0xD0, 0x26, 0x00, 0x00, 0xE0, +/* 00003950 */ 0x26, 0x00, 0x00, 0xEA, 0x26, 0x00, 0x00, 0xEB, 0x26, 0x00, 0x00, 0x7A, 0x27, 0x00, 0x00, 0x00, +/* 00003960 */ 0x28, 0x00, 0x00, 0x7B, 0x28, 0x00, 0x00, 0xC4, 0x28, 0x00, 0x00, 0xFA, 0x28, 0x00, 0x00, 0xFB, +/* 00003970 */ 0x28, 0x00, 0x00, 0x47, 0x29, 0x00, 0x00, 0x66, 0x29, 0x00, 0x00, 0xB7, 0x29, 0x00, 0x00, 0x31, +/* 00003980 */ 0x2A, 0x00, 0x00, 0x55, 0x2A, 0x00, 0x00, 0xB0, 0x2A, 0x00, 0x00, 0xFB, 0x2A, 0x00, 0x00, 0x0D, +/* 00003990 */ 0x2B, 0x00, 0x00, 0x1E, 0x2B, 0x00, 0x00, 0x3E, 0x2B, 0x00, 0x00, 0x48, 0x2B, 0x00, 0x00, 0x49, +/* 000039A0 */ 0x2B, 0x00, 0x00, 0xB8, 0x2B, 0x00, 0x00, 0xE6, 0x2B, 0x00, 0x00, 0x1B, 0x2C, 0x00, 0x00, 0x44, +/* 000039B0 */ 0x2C, 0x00, 0x00, 0x5C, 0x2C, 0x00, 0x00, 0x96, 0x2C, 0x00, 0x00, 0xC0, 0x2C, 0x00, 0x00, 0xE5, +/* 000039C0 */ 0x2C, 0x00, 0x00, 0xFE, 0x2C, 0x00, 0x00, 0x25, 0x2D, 0x00, 0x00, 0x37, 0x2D, 0x00, 0x00, 0x45, +/* 000039D0 */ 0x2D, 0x00, 0x00, 0x46, 0x2D, 0x00, 0x00, 0x91, 0x2D, 0x00, 0x00, 0xA2, 0x2D, 0x00, 0x00, 0xC4, +/* 000039E0 */ 0x2D, 0x00, 0x00, 0xCE, 0x2D, 0x00, 0x00, 0xCF, 0x2D, 0x00, 0x00, 0xED, 0x2D, 0x00, 0x00, 0x0B, +/* 000039F0 */ 0x2E, 0x00, 0x00, 0x29, 0x2E, 0x00, 0x00, 0x5A, 0x2E, 0x00, 0x00, 0x6C, 0x2E, 0x00, 0x00, 0x72, +/* 00003A00 */ 0x2E, 0x00, 0x00, 0x73, 0x2E, 0x00, 0x00, 0xD3, 0x2E, 0x00, 0x00, 0x2B, 0x2F, 0x00, 0x00, 0x5E, +/* 00003A10 */ 0x2F, 0x00, 0x00, 0x5F, 0x2F, 0x00, 0x00, 0x90, 0x2F, 0x00, 0x00, 0x91, 0x2F, 0x00, 0x00, 0xC5, +/* 00003A20 */ 0x2F, 0x00, 0x00, 0xF0, 0x2F, 0x00, 0x00, 0x59, 0x30, 0x00, 0x00, 0x8A, 0x30, 0x00, 0x00, 0xAB, +/* 00003A30 */ 0x30, 0x00, 0x00, 0xB9, 0x30, 0x00, 0x00, 0xC3, 0x30, 0x00, 0x00, 0x18, 0x31, 0x00, 0x00, 0x1E, +/* 00003A40 */ 0x31, 0x00, 0x00, 0x1F, 0x31, 0x00, 0x00, 0x62, 0x31, 0x00, 0x00, 0x8F, 0x31, 0x00, 0x00, 0xBD, +/* 00003A50 */ 0x31, 0x00, 0x00, 0xE4, 0x31, 0x00, 0x00, 0x10, 0x32, 0x00, 0x00, 0x1A, 0x32, 0x00, 0x00, 0x1B, +/* 00003A60 */ 0x32, 0x00, 0x00, 0x3D, 0x32, 0x00, 0x00, 0x62, 0x32, 0x00, 0x00, 0x8A, 0x32, 0x00, 0x00, 0x98, +/* 00003A70 */ 0x32, 0x00, 0x00, 0x99, 0x32, 0x00, 0x00, 0xC5, 0x32, 0x00, 0x00, 0x12, 0x33, 0x00, 0x00, 0x2B, +/* 00003A80 */ 0x33, 0x00, 0x00, 0x69, 0x33, 0x00, 0x00, 0x9D, 0x33, 0x00, 0x00, 0xB2, 0x33, 0x00, 0x00, 0xE1, +/* 00003A90 */ 0x33, 0x00, 0x00, 0xEF, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x51, 0x34, 0x00, 0x00, 0x81, +/* 00003AA0 */ 0x34, 0x00, 0x00, 0xE7, 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF2, 0x34, 0x00, 0x00, 0x1A, +/* 00003AB0 */ 0x35, 0x00, 0x00, 0x21, 0x35, 0x00, 0x00, 0x22, 0x35, 0x00, 0x00, 0x44, 0x35, 0x00, 0x00, 0x62, +/* 00003AC0 */ 0x35, 0x00, 0x00, 0x87, 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xD9, 0x35, 0x00, 0x00, 0xEB, +/* 00003AD0 */ 0x35, 0x00, 0x00, 0x2B, 0x36, 0x00, 0x00, 0x3A, 0x36, 0x00, 0x00, 0x3B, 0x36, 0x00, 0x00, 0x60, +/* 00003AE0 */ 0x36, 0x00, 0x00, 0xA0, 0x36, 0x00, 0x00, 0xAF, 0x36, 0x00, 0x00, 0xB0, 0x36, 0x00, 0x00, 0xD5, +/* 00003AF0 */ 0x36, 0x00, 0x00, 0x0F, 0x37, 0x00, 0x00, 0x1E, 0x37, 0x00, 0x00, 0x1F, 0x37, 0x00, 0x00, 0x4C, +/* 00003B00 */ 0x37, 0x00, 0x00, 0x8D, 0x37, 0x00, 0x00, 0x9C, 0x37, 0x00, 0x00, 0x9D, 0x37, 0x00, 0x00, 0xC2, +/* 00003B10 */ 0x37, 0x00, 0x00, 0xE7, 0x37, 0x00, 0x00, 0x04, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x73, +/* 00003B20 */ 0x38, 0x00, 0x00, 0x85, 0x38, 0x00, 0x00, 0xA1, 0x38, 0x00, 0x00, 0xB0, 0x38, 0x00, 0x00, 0xB1, +/* 00003B30 */ 0x38, 0x00, 0x00, 0xDC, 0x38, 0x00, 0x00, 0x08, 0x39, 0x00, 0x00, 0x24, 0x39, 0x00, 0x00, 0x74, +/* 00003B40 */ 0x39, 0x00, 0x00, 0x99, 0x39, 0x00, 0x00, 0xAF, 0x39, 0x00, 0x00, 0xE0, 0x39, 0x00, 0x00, 0xF2, +/* 00003B50 */ 0x39, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x11, 0x3A, 0x00, 0x00, 0x1B, 0x3A, 0x00, 0x00, 0x1C, +/* 00003B60 */ 0x3A, 0x00, 0x00, 0x43, 0x3A, 0x00, 0x00, 0x87, 0x3A, 0x00, 0x00, 0xAE, 0x3A, 0x00, 0x00, 0xAF, +/* 00003B70 */ 0x3A, 0x00, 0x00, 0xD2, 0x3A, 0x00, 0x00, 0xF7, 0x3A, 0x00, 0x00, 0x31, 0x3B, 0x00, 0x00, 0x3F, +/* 00003B80 */ 0x3B, 0x00, 0x00, 0x40, 0x3B, 0x00, 0x00, 0x64, 0x3B, 0x00, 0x00, 0x96, 0x3B, 0x00, 0x00, 0xA4, +/* 00003B90 */ 0x3B, 0x00, 0x00, 0xA5, 0x3B, 0x00, 0x00, 0xC9, 0x3B, 0x00, 0x00, 0xFB, 0x3B, 0x00, 0x00, 0x09, +/* 00003BA0 */ 0x3C, 0x00, 0x00, 0x0A, 0x3C, 0x00, 0x00, 0x71, 0x3C, 0x00, 0x00, 0x0C, 0x3D, 0x00, 0x00, 0x1A, +/* 00003BB0 */ 0x3D, 0x00, 0x00, 0x1B, 0x3D, 0x00, 0x00, 0x35, 0x3D, 0x00, 0x00, 0x3F, 0x3D, 0x00, 0x00, 0x40, +/* 00003BC0 */ 0x3D, 0x00, 0x00, 0x59, 0x3D, 0x00, 0x00, 0x5F, 0x3D, 0x00, 0x00, 0x60, 0x3D, 0x00, 0x00, 0xAE, +/* 00003BD0 */ 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0xDB, 0x3D, 0x00, 0x00, 0x0A, 0x3E, 0x00, 0x00, 0x4A, +/* 00003BE0 */ 0x3E, 0x00, 0x00, 0x4B, 0x3E, 0x00, 0x00, 0xAC, 0x3E, 0x00, 0x00, 0x2E, 0x3F, 0x00, 0x00, 0x3C, +/* 00003BF0 */ 0x3F, 0x00, 0x00, 0x3D, 0x3F, 0x00, 0x00, 0x6C, 0x3F, 0x00, 0x00, 0x7D, 0x3F, 0x00, 0x00, 0x9A, +/* 00003C00 */ 0x3F, 0x00, 0x00, 0xA4, 0x3F, 0x00, 0x00, 0xAA, 0x3F, 0x00, 0x00, 0xAB, 0x3F, 0x00, 0x00, 0xC5, +/* 00003C10 */ 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0x19, 0x40, 0x00, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x20, +/* 00003C20 */ 0x40, 0x00, 0x00, 0x58, 0x40, 0x00, 0x00, 0xA4, 0x40, 0x00, 0x00, 0x02, 0x41, 0x00, 0x00, 0x28, +/* 00003C30 */ 0x41, 0x00, 0x00, 0x6D, 0x41, 0x00, 0x00, 0xD1, 0x41, 0x00, 0x00, 0x51, 0x42, 0x00, 0x00, 0x52, +/* 00003C40 */ 0x42, 0x00, 0x00, 0xC4, 0x42, 0x00, 0x00, 0xF5, 0x42, 0x00, 0x00, 0x44, 0x43, 0x00, 0x00, 0x96, +/* 00003C50 */ 0x43, 0x00, 0x00, 0xEA, 0x43, 0x00, 0x00, 0x22, 0x44, 0x00, 0x00, 0x74, 0x44, 0x00, 0x00, 0xC6, +/* 00003C60 */ 0x44, 0x00, 0x00, 0x1B, 0x45, 0x00, 0x00, 0x87, 0x45, 0x00, 0x00, 0xDD, 0x45, 0x00, 0x00, 0xDE, +/* 00003C70 */ 0x45, 0x00, 0x00, 0xFD, 0x45, 0x00, 0x00, 0x1C, 0x46, 0x00, 0x00, 0x4E, 0x46, 0x00, 0x00, 0x4F, +/* 00003C80 */ 0x46, 0x00, 0x00, 0xC6, 0x46, 0x00, 0x00, 0x33, 0x47, 0x00, 0x00, 0x86, 0x47, 0x00, 0x00, 0xC9, +/* 00003C90 */ 0x47, 0x00, 0x00, 0xCA, 0x47, 0x00, 0x00, 0x47, 0x48, 0x00, 0x00, 0xDB, 0x48, 0x00, 0x00, 0x5E, +/* 00003CA0 */ 0x49, 0x00, 0x00, 0xE1, 0x49, 0x00, 0x00, 0x54, 0x4A, 0x00, 0x00, 0x55, 0x4A, 0x00, 0x00, 0xBF, +/* 00003CB0 */ 0x4A, 0x00, 0x00, 0x38, 0x4B, 0x00, 0x00, 0x39, 0x4B, 0x00, 0x00, 0x9C, 0x4B, 0x00, 0x00, 0x2B, +/* 00003CC0 */ 0x4C, 0x00, 0x00, 0xD4, 0x4C, 0x00, 0x00, 0x68, 0x4D, 0x00, 0x00, 0xFF, 0x4D, 0x00, 0x00, 0xA3, +/* 00003CD0 */ 0x4E, 0x00, 0x00, 0xB7, 0x4E, 0x00, 0x00, 0xB8, 0x4E, 0x00, 0x00, 0x39, 0x4F, 0x00, 0x00, 0xA5, +/* 00003CE0 */ 0x4F, 0x00, 0x00, 0x15, 0x50, 0x00, 0x00, 0x85, 0x50, 0x00, 0x00, 0xF7, 0x50, 0x00, 0x00, 0x6B, +/* 00003CF0 */ 0x51, 0x00, 0x00, 0xDF, 0x51, 0x00, 0x00, 0x29, 0x52, 0x00, 0x00, 0x2A, 0x52, 0x00, 0x00, 0x97, +/* 00003D00 */ 0x52, 0x00, 0x00, 0x98, 0x52, 0x00, 0x00, 0xFE, 0x52, 0x00, 0x00, 0x89, 0x53, 0x00, 0x00, 0xFF, +/* 00003D10 */ 0x53, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x06, 0x54, 0x00, 0x00, 0x34, 0x54, 0x00, 0x00, 0x5C, +/* 00003D20 */ 0x54, 0x00, 0x00, 0x5D, 0x54, 0x00, 0x00, 0x7E, 0x54, 0x00, 0x00, 0xA6, 0x54, 0x00, 0x00, 0xB0, +/* 00003D30 */ 0x54, 0x00, 0x00, 0xB1, 0x54, 0x00, 0x00, 0xFD, 0x54, 0x00, 0x00, 0x03, 0x55, 0x00, 0x00, 0x04, +/* 00003D40 */ 0x55, 0x00, 0x00, 0x7B, 0x55, 0x00, 0x00, 0xAA, 0x55, 0x00, 0x00, 0xD8, 0x55, 0x00, 0x00, 0xEF, +/* 00003D50 */ 0x55, 0x00, 0x00, 0xF9, 0x55, 0x00, 0x00, 0xFA, 0x55, 0x00, 0x00, 0x25, 0x56, 0x00, 0x00, 0x46, +/* 00003D60 */ 0x56, 0x00, 0x00, 0x50, 0x56, 0x00, 0x00, 0x51, 0x56, 0x00, 0x00, 0x7F, 0x56, 0x00, 0x00, 0xB9, +/* 00003D70 */ 0x56, 0x00, 0x00, 0xBA, 0x56, 0x00, 0x00, 0xEF, 0x56, 0x00, 0x00, 0x06, 0x57, 0x00, 0x00, 0x07, +/* 00003D80 */ 0x57, 0x00, 0x00, 0x45, 0x57, 0x00, 0x00, 0xA6, 0x57, 0x00, 0x00, 0xE2, 0x57, 0x00, 0x00, 0xF0, +/* 00003D90 */ 0x57, 0x00, 0x00, 0xF1, 0x57, 0x00, 0x00, 0x22, 0x58, 0x00, 0x00, 0x23, 0x58, 0x00, 0x00, 0x54, +/* 00003DA0 */ 0x58, 0x00, 0x00, 0x94, 0x58, 0x00, 0x00, 0xA2, 0x58, 0x00, 0x00, 0xA3, 0x58, 0x00, 0x00, 0xD9, +/* 00003DB0 */ 0x58, 0x00, 0x00, 0xDA, 0x58, 0x00, 0x00, 0x3B, 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x89, +/* 00003DC0 */ 0x59, 0x00, 0x00, 0x95, 0x59, 0x00, 0x00, 0x96, 0x59, 0x00, 0x00, 0xAB, 0x59, 0x00, 0x00, 0xB1, +/* 00003DD0 */ 0x59, 0x00, 0x00, 0xB2, 0x59, 0x00, 0x00, 0x01, 0x5A, 0x00, 0x00, 0x1A, 0x5A, 0x00, 0x00, 0x31, +/* 00003DE0 */ 0x5A, 0x00, 0x00, 0x86, 0x5A, 0x00, 0x00, 0x98, 0x5A, 0x00, 0x00, 0xF6, 0x5A, 0x00, 0x00, 0x1D, +/* 00003DF0 */ 0x5B, 0x00, 0x00, 0xAA, 0x5B, 0x00, 0x00, 0xD1, 0x5B, 0x00, 0x00, 0xE3, 0x5B, 0x00, 0x00, 0xFE, +/* 00003E00 */ 0x5B, 0x00, 0x00, 0x25, 0x5C, 0x00, 0x00, 0x87, 0x5C, 0x00, 0x00, 0x95, 0x5C, 0x00, 0x00, 0xA1, +/* 00003E10 */ 0x5C, 0x00, 0x00, 0x09, 0x5D, 0x00, 0x00, 0x20, 0x5D, 0x00, 0x00, 0x26, 0x5D, 0x00, 0x00, 0x27, +/* 00003E20 */ 0x5D, 0x00, 0x00, 0x7D, 0x5D, 0x00, 0x00, 0xB0, 0x5D, 0x00, 0x00, 0xE9, 0x5D, 0x00, 0x00, 0xF3, +/* 00003E30 */ 0x5D, 0x00, 0x00, 0xF4, 0x5D, 0x00, 0x00, 0x2C, 0x5E, 0x00, 0x00, 0x67, 0x5E, 0x00, 0x00, 0xA0, +/* 00003E40 */ 0x5E, 0x00, 0x00, 0xAA, 0x5E, 0x00, 0x00, 0xAB, 0x5E, 0x00, 0x00, 0xE0, 0x5E, 0x00, 0x00, 0xE6, +/* 00003E50 */ 0x5E, 0x00, 0x00, 0xE7, 0x5E, 0x00, 0x00, 0x38, 0x5F, 0x00, 0x00, 0x6B, 0x5F, 0x00, 0x00, 0xA4, +/* 00003E60 */ 0x5F, 0x00, 0x00, 0xAE, 0x5F, 0x00, 0x00, 0xAF, 0x5F, 0x00, 0x00, 0xE7, 0x5F, 0x00, 0x00, 0x22, +/* 00003E70 */ 0x60, 0x00, 0x00, 0x5B, 0x60, 0x00, 0x00, 0x65, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x96, +/* 00003E80 */ 0x60, 0x00, 0x00, 0x9C, 0x60, 0x00, 0x00, 0x9D, 0x60, 0x00, 0x00, 0xC6, 0x60, 0x00, 0x00, 0x01, +/* 00003E90 */ 0x61, 0x00, 0x00, 0x16, 0x61, 0x00, 0x00, 0x49, 0x61, 0x00, 0x00, 0x4A, 0x61, 0x00, 0x00, 0x78, +/* 00003EA0 */ 0x61, 0x00, 0x00, 0xA5, 0x61, 0x00, 0x00, 0xA6, 0x61, 0x00, 0x00, 0xD8, 0x61, 0x00, 0x00, 0x0E, +/* 00003EB0 */ 0x62, 0x00, 0x00, 0x0F, 0x62, 0x00, 0x00, 0x55, 0x62, 0x00, 0x00, 0xCC, 0x62, 0x00, 0x00, 0xDE, +/* 00003EC0 */ 0x62, 0x00, 0x00, 0xEC, 0x62, 0x00, 0x00, 0xF6, 0x62, 0x00, 0x00, 0xF7, 0x62, 0x00, 0x00, 0x3F, +/* 00003ED0 */ 0x63, 0x00, 0x00, 0xC1, 0x63, 0x00, 0x00, 0xD2, 0x63, 0x00, 0x00, 0x34, 0x64, 0x00, 0x00, 0x3E, +/* 00003EE0 */ 0x64, 0x00, 0x00, 0x45, 0x64, 0x00, 0x00, 0x46, 0x64, 0x00, 0x00, 0x82, 0x64, 0x00, 0x00, 0xE3, +/* 00003EF0 */ 0x64, 0x00, 0x00, 0xE4, 0x64, 0x00, 0x00, 0x57, 0x65, 0x00, 0x00, 0xA7, 0x65, 0x00, 0x00, 0xF8, +/* 00003F00 */ 0x65, 0x00, 0x00, 0x7B, 0x66, 0x00, 0x00, 0xD2, 0x66, 0x00, 0x00, 0x3A, 0x67, 0x00, 0x00, 0x60, +/* 00003F10 */ 0x67, 0x00, 0x00, 0x61, 0x67, 0x00, 0x00, 0xBA, 0x67, 0x00, 0x00, 0x45, 0x68, 0x00, 0x00, 0xA0, +/* 00003F20 */ 0x68, 0x00, 0x00, 0x0C, 0x69, 0x00, 0x00, 0x32, 0x69, 0x00, 0x00, 0x33, 0x69, 0x00, 0x00, 0x90, +/* 00003F30 */ 0x69, 0x00, 0x00, 0x1F, 0x6A, 0x00, 0x00, 0x7C, 0x6A, 0x00, 0x00, 0xEA, 0x6A, 0x00, 0x00, 0x10, +/* 00003F40 */ 0x6B, 0x00, 0x00, 0x11, 0x6B, 0x00, 0x00, 0x52, 0x6B, 0x00, 0x00, 0xC5, 0x6B, 0x00, 0x00, 0xFF, +/* 00003F50 */ 0x6B, 0x00, 0x00, 0x5A, 0x6C, 0x00, 0x00, 0x80, 0x6C, 0x00, 0x00, 0x81, 0x6C, 0x00, 0x00, 0xDA, +/* 00003F60 */ 0x6C, 0x00, 0x00, 0x34, 0x6D, 0x00, 0x00, 0x83, 0x6D, 0x00, 0x00, 0xFF, 0x6D, 0x00, 0x00, 0x5F, +/* 00003F70 */ 0x6E, 0x00, 0x00, 0xC3, 0x6E, 0x00, 0x00, 0x29, 0x6F, 0x00, 0x00, 0x82, 0x6F, 0x00, 0x00, 0x83, +/* 00003F80 */ 0x6F, 0x00, 0x00, 0xEA, 0x6F, 0x00, 0x00, 0x2F, 0x70, 0x00, 0x00, 0x72, 0x70, 0x00, 0x00, 0xAB, +/* 00003F90 */ 0x70, 0x00, 0x00, 0xE6, 0x70, 0x00, 0x00, 0x21, 0x71, 0x00, 0x00, 0x5F, 0x71, 0x00, 0x00, 0x9C, +/* 00003FA0 */ 0x71, 0x00, 0x00, 0xD1, 0x71, 0x00, 0x00, 0x32, 0x72, 0x00, 0x00, 0x7D, 0x72, 0x00, 0x00, 0xC8, +/* 00003FB0 */ 0x72, 0x00, 0x00, 0x13, 0x73, 0x00, 0x00, 0x5D, 0x73, 0x00, 0x00, 0x5E, 0x73, 0x00, 0x00, 0xDD, +/* 00003FC0 */ 0x73, 0x00, 0x00, 0x78, 0x74, 0x00, 0x00, 0x98, 0x74, 0x00, 0x00, 0xB8, 0x74, 0x00, 0x00, 0xD6, +/* 00003FD0 */ 0x74, 0x00, 0x00, 0xE4, 0x74, 0x00, 0x00, 0xE5, 0x74, 0x00, 0x00, 0x48, 0x75, 0x00, 0x00, 0xC3, +/* 00003FE0 */ 0x75, 0x00, 0x00, 0x03, 0x76, 0x00, 0x00, 0x34, 0x76, 0x00, 0x00, 0xB3, 0x76, 0x00, 0x00, 0x09, +/* 00003FF0 */ 0x77, 0x00, 0x00, 0x4D, 0x77, 0x00, 0x00, 0x4E, 0x77, 0x00, 0x00, 0xCD, 0x77, 0x00, 0x00, 0x15, +/* 00004000 */ 0x78, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x83, 0x78, 0x00, 0x00, 0x95, 0x78, 0x00, 0x00, 0xA5, +/* 00004010 */ 0x78, 0x00, 0x00, 0xA6, 0x78, 0x00, 0x00, 0xDE, 0x78, 0x00, 0x00, 0xEA, 0x78, 0x00, 0x00, 0x03, +/* 00004020 */ 0x79, 0x00, 0x00, 0x0D, 0x79, 0x00, 0x00, 0x0E, 0x79, 0x00, 0x00, 0x5F, 0x79, 0x00, 0x00, 0x8D, +/* 00004030 */ 0x79, 0x00, 0x00, 0xB8, 0x79, 0x00, 0x00, 0xE4, 0x79, 0x00, 0x00, 0x1F, 0x7A, 0x00, 0x00, 0x49, +/* 00004040 */ 0x7A, 0x00, 0x00, 0x53, 0x7A, 0x00, 0x00, 0x54, 0x7A, 0x00, 0x00, 0x74, 0x7A, 0x00, 0x00, 0x97, +/* 00004050 */ 0x7A, 0x00, 0x00, 0xB9, 0x7A, 0x00, 0x00, 0x0D, 0x7B, 0x00, 0x00, 0x36, 0x7B, 0x00, 0x00, 0xA0, +/* 00004060 */ 0x7B, 0x00, 0x00, 0xB9, 0x7B, 0x00, 0x00, 0x0B, 0x7C, 0x00, 0x00, 0x54, 0x7C, 0x00, 0x00, 0x7A, +/* 00004070 */ 0x7C, 0x00, 0x00, 0xDC, 0x7C, 0x00, 0x00, 0xEA, 0x7C, 0x00, 0x00, 0xFB, 0x7C, 0x00, 0x00, 0x44, +/* 00004080 */ 0x7D, 0x00, 0x00, 0xA0, 0x7D, 0x00, 0x00, 0xBF, 0x7D, 0x00, 0x00, 0xE1, 0x7D, 0x00, 0x00, 0xEB, +/* 00004090 */ 0x7D, 0x00, 0x00, 0xEC, 0x7D, 0x00, 0x00, 0x13, 0x7E, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x69, +/* 000040A0 */ 0x7E, 0x00, 0x00, 0x73, 0x7E, 0x00, 0x00, 0x74, 0x7E, 0x00, 0x00, 0xD0, 0x7E, 0x00, 0x00, 0x25, +/* 000040B0 */ 0x7F, 0x00, 0x00, 0x4B, 0x7F, 0x00, 0x00, 0x89, 0x7F, 0x00, 0x00, 0x9E, 0x7F, 0x00, 0x00, 0xDE, +/* 000040C0 */ 0x7F, 0x00, 0x00, 0xEC, 0x7F, 0x00, 0x00, 0xF7, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x4E, +/* 000040D0 */ 0x80, 0x00, 0x00, 0x81, 0x80, 0x00, 0x00, 0xCE, 0x80, 0x00, 0x00, 0x22, 0x81, 0x00, 0x00, 0x4C, +/* 000040E0 */ 0x81, 0x00, 0x00, 0x56, 0x81, 0x00, 0x00, 0x57, 0x81, 0x00, 0x00, 0x99, 0x81, 0x00, 0x00, 0xC6, +/* 000040F0 */ 0x81, 0x00, 0x00, 0x20, 0x82, 0x00, 0x00, 0x31, 0x82, 0x00, 0x00, 0x85, 0x82, 0x00, 0x00, 0x8F, +/* 00004100 */ 0x82, 0x00, 0x00, 0x90, 0x82, 0x00, 0x00, 0xB6, 0x82, 0x00, 0x00, 0xBD, 0x82, 0x00, 0x00, 0xBE, +/* 00004110 */ 0x82, 0x00, 0x00, 0xF3, 0x82, 0x00, 0x00, 0x15, 0x83, 0x00, 0x00, 0x16, 0x83, 0x00, 0x00, 0x52, +/* 00004120 */ 0x83, 0x00, 0x00, 0x53, 0x83, 0x00, 0x00, 0x9C, 0x83, 0x00, 0x00, 0xCF, 0x83, 0x00, 0x00, 0xFF, +/* 00004130 */ 0x83, 0x00, 0x00, 0x11, 0x84, 0x00, 0x00, 0x12, 0x84, 0x00, 0x00, 0xA1, 0x84, 0x00, 0x00, 0xF7, +/* 00004140 */ 0x84, 0x00, 0x00, 0x09, 0x85, 0x00, 0x00, 0x0A, 0x85, 0x00, 0x00, 0x43, 0x85, 0x00, 0x00, 0x44, +/* 00004150 */ 0x85, 0x00, 0x00, 0x67, 0x85, 0x00, 0x00, 0x9D, 0x85, 0x00, 0x00, 0xD3, 0x85, 0x00, 0x00, 0xEC, +/* 00004160 */ 0x85, 0x00, 0x00, 0x26, 0x86, 0x00, 0x00, 0x38, 0x86, 0x00, 0x00, 0x39, 0x86, 0x00, 0x00, 0xAA, +/* 00004170 */ 0x86, 0x00, 0x00, 0x09, 0x87, 0x00, 0x00, 0x8A, 0x87, 0x00, 0x00, 0xF8, 0x87, 0x00, 0x00, 0x6B, +/* 00004180 */ 0x88, 0x00, 0x00, 0xCD, 0x88, 0x00, 0x00, 0xCE, 0x88, 0x00, 0x00, 0x06, 0x89, 0x00, 0x00, 0x47, +/* 00004190 */ 0x89, 0x00, 0x00, 0xB5, 0x89, 0x00, 0x00, 0xB6, 0x89, 0x00, 0x00, 0xE1, 0x89, 0x00, 0x00, 0x4A, +/* 000041A0 */ 0x8A, 0x00, 0x00, 0x8F, 0x8A, 0x00, 0x00, 0x90, 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0x2D, +/* 000041B0 */ 0x8B, 0x00, 0x00, 0xAF, 0x8B, 0x00, 0x00, 0xDB, 0x8B, 0x00, 0x00, 0x27, 0x8C, 0x00, 0x00, 0x6E, +/* 000041C0 */ 0x8C, 0x00, 0x00, 0x0A, 0x8D, 0x00, 0x00, 0x56, 0x8D, 0x00, 0x00, 0x8D, 0x8D, 0x00, 0x00, 0x11, +/* 000041D0 */ 0x8E, 0x00, 0x00, 0x36, 0x8E, 0x00, 0x00, 0x66, 0x8E, 0x00, 0x00, 0x84, 0x8E, 0x00, 0x00, 0x27, +/* 000041E0 */ 0x8F, 0x00, 0x00, 0x86, 0x8F, 0x00, 0x00, 0xB5, 0x8F, 0x00, 0x00, 0xCF, 0x8F, 0x00, 0x00, 0xE7, +/* 000041F0 */ 0x8F, 0x00, 0x00, 0xF9, 0x8F, 0x00, 0x00, 0x28, 0x90, 0x00, 0x00, 0x97, 0x90, 0x00, 0x00, 0xC6, +/* 00004200 */ 0x90, 0x00, 0x00, 0x54, 0x91, 0x00, 0x00, 0x8B, 0x91, 0x00, 0x00, 0xF5, 0x91, 0x00, 0x00, 0x0F, +/* 00004210 */ 0x92, 0x00, 0x00, 0x25, 0x92, 0x00, 0x00, 0x40, 0x92, 0x00, 0x00, 0x6F, 0x92, 0x00, 0x00, 0x85, +/* 00004220 */ 0x92, 0x00, 0x00, 0x97, 0x92, 0x00, 0x00, 0x98, 0x92, 0x00, 0x00, 0xC7, 0x92, 0x00, 0x00, 0xF6, +/* 00004230 */ 0x92, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x8B, 0x93, 0x00, 0x00, 0xAD, 0x93, 0x00, 0x00, 0xDB, +/* 00004240 */ 0x93, 0x00, 0x00, 0x09, 0x94, 0x00, 0x00, 0x0A, 0x94, 0x00, 0x00, 0x7B, 0x94, 0x00, 0x00, 0x04, +/* 00004250 */ 0x95, 0x00, 0x00, 0x6D, 0x95, 0x00, 0x00, 0xAC, 0x95, 0x00, 0x00, 0xC2, 0x95, 0x00, 0x00, 0xC3, +/* 00004260 */ 0x95, 0x00, 0x00, 0xE8, 0x95, 0x00, 0x00, 0x15, 0x96, 0x00, 0x00, 0x42, 0x96, 0x00, 0x00, 0x6F, +/* 00004270 */ 0x96, 0x00, 0x00, 0x8C, 0x96, 0x00, 0x00, 0xB9, 0x96, 0x00, 0x00, 0xCF, 0x96, 0x00, 0x00, 0xE1, +/* 00004280 */ 0x96, 0x00, 0x00, 0xE2, 0x96, 0x00, 0x00, 0x13, 0x97, 0x00, 0x00, 0x40, 0x97, 0x00, 0x00, 0x52, +/* 00004290 */ 0x97, 0x00, 0x00, 0x53, 0x97, 0x00, 0x00, 0x80, 0x97, 0x00, 0x00, 0xA5, 0x97, 0x00, 0x00, 0xB7, +/* 000042A0 */ 0x97, 0x00, 0x00, 0xB8, 0x97, 0x00, 0x00, 0xE9, 0x97, 0x00, 0x00, 0x17, 0x98, 0x00, 0x00, 0x64, +/* 000042B0 */ 0x98, 0x00, 0x00, 0xAC, 0x98, 0x00, 0x00, 0xD6, 0x98, 0x00, 0x00, 0x0C, 0x99, 0x00, 0x00, 0x4E, +/* 000042C0 */ 0x99, 0x00, 0x00, 0x80, 0x99, 0x00, 0x00, 0xAE, 0x99, 0x00, 0x00, 0xE0, 0x99, 0x00, 0x00, 0x17, +/* 000042D0 */ 0x9A, 0x00, 0x00, 0x25, 0x9A, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x95, 0x9A, 0x00, 0x00, 0xBE, +/* 000042E0 */ 0x9A, 0x00, 0x00, 0xF9, 0x9A, 0x00, 0x00, 0x53, 0x9B, 0x00, 0x00, 0x65, 0x9B, 0x00, 0x00, 0x8F, +/* 000042F0 */ 0x9B, 0x00, 0x00, 0xBF, 0x9B, 0x00, 0x00, 0xD1, 0x9B, 0x00, 0x00, 0x75, 0x9C, 0x00, 0x00, 0xA1, +/* 00004300 */ 0x9C, 0x00, 0x00, 0xCA, 0x9C, 0x00, 0x00, 0x04, 0x9D, 0x00, 0x00, 0x51, 0x9D, 0x00, 0x00, 0x0A, +/* 00004310 */ 0x9E, 0x00, 0x00, 0x46, 0x9E, 0x00, 0x00, 0x47, 0x9E, 0x00, 0x00, 0x6E, 0x9E, 0x00, 0x00, 0x6F, +/* 00004320 */ 0x9E, 0x00, 0x00, 0xBD, 0x9E, 0x00, 0x00, 0xFC, 0x9E, 0x00, 0x00, 0x3B, 0x9F, 0x00, 0x00, 0x51, +/* 00004330 */ 0x9F, 0x00, 0x00, 0x52, 0x9F, 0x00, 0x00, 0x89, 0x9F, 0x00, 0x00, 0xBD, 0x9F, 0x00, 0x00, 0x06, +/* 00004340 */ 0xA0, 0x00, 0x00, 0x1C, 0xA0, 0x00, 0x00, 0x1D, 0xA0, 0x00, 0x00, 0x58, 0xA0, 0x00, 0x00, 0x9E, +/* 00004350 */ 0xA0, 0x00, 0x00, 0x9F, 0xA0, 0x00, 0x00, 0xD5, 0xA0, 0x00, 0x00, 0x14, 0xA1, 0x00, 0x00, 0x59, +/* 00004360 */ 0xA1, 0x00, 0x00, 0x6F, 0xA1, 0x00, 0x00, 0x70, 0xA1, 0x00, 0x00, 0xB8, 0xA1, 0x00, 0x00, 0xB9, +/* 00004370 */ 0xA1, 0x00, 0x00, 0xE6, 0xA1, 0x00, 0x00, 0x4E, 0xA2, 0x00, 0x00, 0x8B, 0xA2, 0x00, 0x00, 0xAB, +/* 00004380 */ 0xA2, 0x00, 0x00, 0xBD, 0xA2, 0x00, 0x00, 0xFB, 0xA2, 0x00, 0x00, 0xFC, 0xA2, 0x00, 0x00, 0x25, +/* 00004390 */ 0xA3, 0x00, 0x00, 0x59, 0xA3, 0x00, 0x00, 0xBB, 0xA3, 0x00, 0x00, 0xD1, 0xA3, 0x00, 0x00, 0xD2, +/* 000043A0 */ 0xA3, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x76, 0xA4, 0x00, 0x00, 0xD8, 0xA4, 0x00, 0x00, 0xEE, +/* 000043B0 */ 0xA4, 0x00, 0x00, 0xEF, 0xA4, 0x00, 0x00, 0x12, 0xA5, 0x00, 0x00, 0x35, 0xA5, 0x00, 0x00, 0x36, +/* 000043C0 */ 0xA5, 0x00, 0x00, 0xEE, 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x4F, 0xA6, 0x00, 0x00, 0x50, +/* 000043D0 */ 0xA6, 0x00, 0x00, 0xE2, 0xA6, 0x00, 0x00, 0xE3, 0xA6, 0x00, 0x00, 0x74, 0xA7, 0x00, 0x00, 0xB8, +/* 000043E0 */ 0xA7, 0x00, 0x00, 0xB9, 0xA7, 0x00, 0x00, 0x4E, 0xA8, 0x00, 0x00, 0x4F, 0xA8, 0x00, 0x00, 0x9D, +/* 000043F0 */ 0xA8, 0x00, 0x00, 0xD5, 0xA8, 0x00, 0x00, 0x0D, 0xA9, 0x00, 0x00, 0x7B, 0xA9, 0x00, 0x00, 0x95, +/* 00004400 */ 0xA9, 0x00, 0x00, 0xE0, 0xA9, 0x00, 0x00, 0x41, 0xAA, 0x00, 0x00, 0xAF, 0xAA, 0x00, 0x00, 0xC9, +/* 00004410 */ 0xAA, 0x00, 0x00, 0xCA, 0xAA, 0x00, 0x00, 0xEB, 0xAA, 0x00, 0x00, 0x26, 0xAB, 0x00, 0x00, 0x5F, +/* 00004420 */ 0xAB, 0x00, 0x00, 0xA4, 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0x50, 0xAC, 0x00, 0x00, 0xE5, +/* 00004430 */ 0xAC, 0x00, 0x00, 0x7A, 0xAD, 0x00, 0x00, 0x94, 0xAD, 0x00, 0x00, 0xE1, 0xAD, 0x00, 0x00, 0xF5, +/* 00004440 */ 0xAD, 0x00, 0x00, 0xF6, 0xAD, 0x00, 0x00, 0x3C, 0xAE, 0x00, 0x00, 0x84, 0xAE, 0x00, 0x00, 0xBC, +/* 00004450 */ 0xAE, 0x00, 0x00, 0x22, 0xAF, 0x00, 0x00, 0x3C, 0xAF, 0x00, 0x00, 0x3D, 0xAF, 0x00, 0x00, 0x88, +/* 00004460 */ 0xAF, 0x00, 0x00, 0xE9, 0xAF, 0x00, 0x00, 0x4F, 0xB0, 0x00, 0x00, 0x69, 0xB0, 0x00, 0x00, 0x6A, +/* 00004470 */ 0xB0, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x00, 0xE4, 0xB0, 0x00, 0x00, 0xF8, 0xB0, 0x00, 0x00, 0xF9, +/* 00004480 */ 0xB0, 0x00, 0x00, 0x1A, 0xB1, 0x00, 0x00, 0x28, 0xB1, 0x00, 0x00, 0x32, 0xB1, 0x00, 0x00, 0x7D, +/* 00004490 */ 0xB1, 0x00, 0x00, 0x97, 0xB1, 0x00, 0x00, 0xA1, 0xB1, 0x00, 0x00, 0xA2, 0xB1, 0x00, 0x00, 0xDC, +/* 000044A0 */ 0xB1, 0x00, 0x00, 0x02, 0xB2, 0x00, 0x00, 0x51, 0xB2, 0x00, 0x00, 0x82, 0xB2, 0x00, 0x00, 0xB6, +/* 000044B0 */ 0xB2, 0x00, 0x00, 0x21, 0xB3, 0x00, 0x00, 0x6D, 0xB3, 0x00, 0x00, 0xC0, 0xB3, 0x00, 0x00, 0xD3, +/* 000044C0 */ 0xB3, 0x00, 0x00, 0xE5, 0xB3, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x53, 0xB4, 0x00, 0x00, 0xE2, +/* 000044D0 */ 0xB4, 0x00, 0x00, 0x53, 0xB5, 0x00, 0x00, 0xCA, 0xB5, 0x00, 0x00, 0xDD, 0xB5, 0x00, 0x00, 0xEF, +/* 000044E0 */ 0xB5, 0x00, 0x00, 0xF0, 0xB5, 0x00, 0x00, 0x2C, 0xB6, 0x00, 0x00, 0x7D, 0xB6, 0x00, 0x00, 0xB4, +/* 000044F0 */ 0xB6, 0x00, 0x00, 0xE4, 0xB6, 0x00, 0x00, 0xF6, 0xB6, 0x00, 0x00, 0xF7, 0xB6, 0x00, 0x00, 0x8E, +/* 00004500 */ 0xB7, 0x00, 0x00, 0xEC, 0xB7, 0x00, 0x00, 0xFE, 0xB7, 0x00, 0x00, 0xFF, 0xB7, 0x00, 0x00, 0x3C, +/* 00004510 */ 0xB8, 0x00, 0x00, 0x3D, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x96, 0xB8, 0x00, 0x00, 0xCC, +/* 00004520 */ 0xB8, 0x00, 0x00, 0xE5, 0xB8, 0x00, 0x00, 0x1F, 0xB9, 0x00, 0x00, 0x31, 0xB9, 0x00, 0x00, 0x32, +/* 00004530 */ 0xB9, 0x00, 0x00, 0xA3, 0xB9, 0x00, 0x00, 0x15, 0xBA, 0x00, 0x00, 0x16, 0xBA, 0x00, 0x00, 0x61, +/* 00004540 */ 0xBA, 0x00, 0x00, 0x8C, 0xBA, 0x00, 0x00, 0xCC, 0xBA, 0x00, 0x00, 0xFF, 0xBA, 0x00, 0x00, 0x40, +/* 00004550 */ 0xBB, 0x00, 0x00, 0x52, 0xBB, 0x00, 0x00, 0x53, 0xBB, 0x00, 0x00, 0xB2, 0xBB, 0x00, 0x00, 0x2F, +/* 00004560 */ 0xBC, 0x00, 0x00, 0x5F, 0xBC, 0x00, 0x00, 0x60, 0xBC, 0x00, 0x00, 0xC7, 0xBC, 0x00, 0x00, 0xFE, +/* 00004570 */ 0xBC, 0x00, 0x00, 0x35, 0xBD, 0x00, 0x00, 0x73, 0xBD, 0x00, 0x00, 0x74, 0xBD, 0x00, 0x00, 0xC5, +/* 00004580 */ 0xBD, 0x00, 0x00, 0x16, 0xBE, 0x00, 0x00, 0x17, 0xBE, 0x00, 0x00, 0x91, 0xBE, 0x00, 0x00, 0x00, +/* 00004590 */ 0xBF, 0x00, 0x00, 0x87, 0xBF, 0x00, 0x00, 0x99, 0xBF, 0x00, 0x00, 0x9A, 0xBF, 0x00, 0x00, 0xFB, +/* 000045A0 */ 0xBF, 0x00, 0x00, 0xFC, 0xBF, 0x00, 0x00, 0x34, 0xC0, 0x00, 0x00, 0x75, 0xC0, 0x00, 0x00, 0xE2, +/* 000045B0 */ 0xC0, 0x00, 0x00, 0xE3, 0xC0, 0x00, 0x00, 0x17, 0xC1, 0x00, 0x00, 0x75, 0xC1, 0x00, 0x00, 0xBE, +/* 000045C0 */ 0xC1, 0x00, 0x00, 0xD0, 0xC1, 0x00, 0x00, 0xD1, 0xC1, 0x00, 0x00, 0xFD, 0xC1, 0x00, 0x00, 0x38, +/* 000045D0 */ 0xC2, 0x00, 0x00, 0x75, 0xC2, 0x00, 0x00, 0x8B, 0xC2, 0x00, 0x00, 0xE1, 0xC2, 0x00, 0x00, 0xFB, +/* 000045E0 */ 0xC2, 0x00, 0x00, 0x47, 0xC3, 0x00, 0x00, 0x69, 0xC3, 0x00, 0x00, 0x97, 0xC3, 0x00, 0x00, 0xE4, +/* 000045F0 */ 0xC3, 0x00, 0x00, 0xFA, 0xC3, 0x00, 0x00, 0x70, 0xC4, 0x00, 0x00, 0xD4, 0xC4, 0x00, 0x00, 0xED, +/* 00004600 */ 0xC4, 0x00, 0x00, 0x17, 0xC5, 0x00, 0x00, 0x48, 0xC5, 0x00, 0x00, 0xB1, 0xC5, 0x00, 0x00, 0xE0, +/* 00004610 */ 0xC5, 0x00, 0x00, 0x3B, 0xC6, 0x00, 0x00, 0x58, 0xC6, 0x00, 0x00, 0xB2, 0xC6, 0x00, 0x00, 0xC8, +/* 00004620 */ 0xC6, 0x00, 0x00, 0xDA, 0xC6, 0x00, 0x00, 0xDB, 0xC6, 0x00, 0x00, 0x6F, 0xC7, 0x00, 0x00, 0x70, +/* 00004630 */ 0xC7, 0x00, 0x00, 0xA1, 0xC7, 0x00, 0x00, 0xD9, 0xC7, 0x00, 0x00, 0x1C, 0xC8, 0x00, 0x00, 0x4A, +/* 00004640 */ 0xC8, 0x00, 0x00, 0x4B, 0xC8, 0x00, 0x00, 0x79, 0xC8, 0x00, 0x00, 0xB1, 0xC8, 0x00, 0x00, 0xC3, +/* 00004650 */ 0xC8, 0x00, 0x00, 0xC4, 0xC8, 0x00, 0x00, 0xF9, 0xC8, 0x00, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x9E, +/* 00004660 */ 0xC9, 0x00, 0x00, 0xD6, 0xC9, 0x00, 0x00, 0x38, 0xCA, 0x00, 0x00, 0x75, 0xCA, 0x00, 0x00, 0xD5, +/* 00004670 */ 0xCA, 0x00, 0x00, 0x12, 0xCB, 0x00, 0x00, 0x72, 0xCB, 0x00, 0x00, 0x88, 0xCB, 0x00, 0x00, 0x9A, +/* 00004680 */ 0xCB, 0x00, 0x00, 0x9B, 0xCB, 0x00, 0x00, 0xE7, 0xCB, 0x00, 0x00, 0x35, 0xCC, 0x00, 0x00, 0x83, +/* 00004690 */ 0xCC, 0x00, 0x00, 0x84, 0xCC, 0x00, 0x00, 0xC2, 0xCC, 0x00, 0x00, 0x1A, 0xCD, 0x00, 0x00, 0x72, +/* 000046A0 */ 0xCD, 0x00, 0x00, 0x84, 0xCD, 0x00, 0x00, 0x85, 0xCD, 0x00, 0x00, 0xC5, 0xCD, 0x00, 0x00, 0xFF, +/* 000046B0 */ 0xCD, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x16, 0xCE, 0x00, 0x00, 0x6A, 0xCE, 0x00, 0x00, 0xA8, +/* 000046C0 */ 0xCE, 0x00, 0x00, 0xC6, 0xCE, 0x00, 0x00, 0xF0, 0xCE, 0x00, 0x00, 0x47, 0xCF, 0x00, 0x00, 0xCC, +/* 000046D0 */ 0xCF, 0x00, 0x00, 0x31, 0xD0, 0x00, 0x00, 0x6C, 0xD0, 0x00, 0x00, 0x7E, 0xD0, 0x00, 0x00, 0x7F, +/* 000046E0 */ 0xD0, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x00, 0x17, 0xD1, 0x00, 0x00, 0x29, 0xD1, 0x00, 0x00, 0x2A, +/* 000046F0 */ 0xD1, 0x00, 0x00, 0xA8, 0xD1, 0x00, 0x00, 0xE7, 0xD1, 0x00, 0x00, 0xF5, 0xD1, 0x00, 0x00, 0xF6, +/* 00004700 */ 0xD1, 0x00, 0x00, 0x66, 0xD2, 0x00, 0x00, 0xB5, 0xD2, 0x00, 0x00, 0x16, 0xD3, 0x00, 0x00, 0x28, +/* 00004710 */ 0xD3, 0x00, 0x00, 0x29, 0xD3, 0x00, 0x00, 0x63, 0xD3, 0x00, 0x00, 0xB4, 0xD3, 0x00, 0x00, 0xB5, +/* 00004720 */ 0xD3, 0x00, 0x00, 0xE6, 0xD3, 0x00, 0x00, 0x3A, 0xD4, 0x00, 0x00, 0x8F, 0xD4, 0x00, 0x00, 0xCC, +/* 00004730 */ 0xD4, 0x00, 0x00, 0xCD, 0xD4, 0x00, 0x00, 0xF4, 0xD4, 0x00, 0x00, 0x46, 0xD5, 0x00, 0x00, 0x85, +/* 00004740 */ 0xD5, 0x00, 0x00, 0xC8, 0xD5, 0x00, 0x00, 0xDE, 0xD5, 0x00, 0x00, 0xDF, 0xD5, 0x00, 0x00, 0x16, +/* 00004750 */ 0xD6, 0x00, 0x00, 0x17, 0xD6, 0x00, 0x00, 0x4B, 0xD6, 0x00, 0x00, 0x98, 0xD6, 0x00, 0x00, 0xAE, +/* 00004760 */ 0xD6, 0x00, 0x00, 0xAF, 0xD6, 0x00, 0x00, 0xEA, 0xD6, 0x00, 0x00, 0x30, 0xD7, 0x00, 0x00, 0x31, +/* 00004770 */ 0xD7, 0x00, 0x00, 0x67, 0xD7, 0x00, 0x00, 0xA6, 0xD7, 0x00, 0x00, 0xEB, 0xD7, 0x00, 0x00, 0x01, +/* 00004780 */ 0xD8, 0x00, 0x00, 0x02, 0xD8, 0x00, 0x00, 0x4E, 0xD8, 0x00, 0x00, 0x4F, 0xD8, 0x00, 0x00, 0xB4, +/* 00004790 */ 0xD8, 0x00, 0x00, 0xF0, 0xD8, 0x00, 0x00, 0xF1, 0xD8, 0x00, 0x00, 0x11, 0xD9, 0x00, 0x00, 0x23, +/* 000047A0 */ 0xD9, 0x00, 0x00, 0x69, 0xD9, 0x00, 0x00, 0x6A, 0xD9, 0x00, 0x00, 0x8F, 0xD9, 0x00, 0x00, 0xBD, +/* 000047B0 */ 0xD9, 0x00, 0x00, 0xBE, 0xD9, 0x00, 0x00, 0xF2, 0xD9, 0x00, 0x00, 0x5B, 0xDA, 0x00, 0x00, 0x71, +/* 000047C0 */ 0xDA, 0x00, 0x00, 0x72, 0xDA, 0x00, 0x00, 0xB9, 0xDA, 0x00, 0x00, 0x1A, 0xDB, 0x00, 0x00, 0x83, +/* 000047D0 */ 0xDB, 0x00, 0x00, 0x99, 0xDB, 0x00, 0x00, 0x9A, 0xDB, 0x00, 0x00, 0xF2, 0xDB, 0x00, 0x00, 0x4C, +/* 000047E0 */ 0xDC, 0x00, 0x00, 0x5E, 0xDC, 0x00, 0x00, 0xAF, 0xDC, 0x00, 0x00, 0xB0, 0xDC, 0x00, 0x00, 0x4A, +/* 000047F0 */ 0xDD, 0x00, 0x00, 0x4B, 0xDD, 0x00, 0x00, 0xC7, 0xDD, 0x00, 0x00, 0x45, 0xDE, 0x00, 0x00, 0x69, +/* 00004800 */ 0xDE, 0x00, 0x00, 0x6A, 0xDE, 0x00, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x4B, 0xDF, 0x00, 0x00, 0xE8, +/* 00004810 */ 0xDF, 0x00, 0x00, 0xE9, 0xDF, 0x00, 0x00, 0x3B, 0xE0, 0x00, 0x00, 0x73, 0xE0, 0x00, 0x00, 0xAB, +/* 00004820 */ 0xE0, 0x00, 0x00, 0x21, 0xE1, 0x00, 0x00, 0x3B, 0xE1, 0x00, 0x00, 0x86, 0xE1, 0x00, 0x00, 0xEB, +/* 00004830 */ 0xE1, 0x00, 0x00, 0x61, 0xE2, 0x00, 0x00, 0x7B, 0xE2, 0x00, 0x00, 0x7C, 0xE2, 0x00, 0x00, 0xC2, +/* 00004840 */ 0xE2, 0x00, 0x00, 0xC3, 0xE2, 0x00, 0x00, 0x1F, 0xE3, 0x00, 0x00, 0x75, 0xE3, 0x00, 0x00, 0xCC, +/* 00004850 */ 0xE3, 0x00, 0x00, 0xEA, 0xE3, 0x00, 0x00, 0x06, 0xE4, 0x00, 0x00, 0x07, 0xE4, 0x00, 0x00, 0x49, +/* 00004860 */ 0xE4, 0x00, 0x00, 0x96, 0xE4, 0x00, 0x00, 0xAA, 0xE4, 0x00, 0x00, 0xAB, 0xE4, 0x00, 0x00, 0xF4, +/* 00004870 */ 0xE4, 0x00, 0x00, 0x3B, 0xE5, 0x00, 0x00, 0x73, 0xE5, 0x00, 0x00, 0xE0, 0xE5, 0x00, 0x00, 0xFA, +/* 00004880 */ 0xE5, 0x00, 0x00, 0xFB, 0xE5, 0x00, 0x00, 0x46, 0xE6, 0x00, 0x00, 0xAB, 0xE6, 0x00, 0x00, 0x18, +/* 00004890 */ 0xE7, 0x00, 0x00, 0x32, 0xE7, 0x00, 0x00, 0x33, 0xE7, 0x00, 0x00, 0x6E, 0xE7, 0x00, 0x00, 0xAC, +/* 000048A0 */ 0xE7, 0x00, 0x00, 0xC0, 0xE7, 0x00, 0x00, 0xC1, 0xE7, 0x00, 0x00, 0xE6, 0xE7, 0x00, 0x00, 0xF4, +/* 000048B0 */ 0xE7, 0x00, 0x00, 0xFE, 0xE7, 0x00, 0x00, 0x4D, 0xE8, 0x00, 0x00, 0x67, 0xE8, 0x00, 0x00, 0x71, +/* 000048C0 */ 0xE8, 0x00, 0x00, 0x72, 0xE8, 0x00, 0x00, 0xF2, 0xE8, 0x00, 0x00, 0x1A, 0xE9, 0x00, 0x00, 0x1B, +/* 000048D0 */ 0xE9, 0x00, 0x00, 0x55, 0xE9, 0x00, 0x00, 0x9B, 0xE9, 0x00, 0x00, 0xC8, 0xE9, 0x00, 0x00, 0xFE, +/* 000048E0 */ 0xE9, 0x00, 0x00, 0x17, 0xEA, 0x00, 0x00, 0x51, 0xEA, 0x00, 0x00, 0x63, 0xEA, 0x00, 0x00, 0x64, +/* 000048F0 */ 0xEA, 0x00, 0x00, 0x8D, 0xEA, 0x00, 0x00, 0xCE, 0xEA, 0x00, 0x00, 0x61, 0xEB, 0x00, 0x00, 0x8F, +/* 00004900 */ 0xEB, 0x00, 0x00, 0xA5, 0xEB, 0x00, 0x00, 0xB7, 0xEB, 0x00, 0x00, 0xF8, 0xEB, 0x00, 0x00, 0x6E, +/* 00004910 */ 0xEC, 0x00, 0x00, 0x9C, 0xEC, 0x00, 0x00, 0xB2, 0xEC, 0x00, 0x00, 0xC4, 0xEC, 0x00, 0x00, 0xC5, +/* 00004920 */ 0xEC, 0x00, 0x00, 0x18, 0xED, 0x00, 0x00, 0x54, 0xED, 0x00, 0x00, 0x8E, 0xED, 0x00, 0x00, 0xCB, +/* 00004930 */ 0xED, 0x00, 0x00, 0xE3, 0xED, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x5A, 0xEE, 0x00, 0x00, 0x97, +/* 00004940 */ 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xEA, 0xEE, 0x00, 0x00, 0x24, 0xEF, 0x00, 0x00, 0x61, +/* 00004950 */ 0xEF, 0x00, 0x00, 0x79, 0xEF, 0x00, 0x00, 0x8B, 0xEF, 0x00, 0x00, 0xDE, 0xEF, 0x00, 0x00, 0x1A, +/* 00004960 */ 0xF0, 0x00, 0x00, 0x54, 0xF0, 0x00, 0x00, 0x91, 0xF0, 0x00, 0x00, 0xA9, 0xF0, 0x00, 0x00, 0xE7, +/* 00004970 */ 0xF0, 0x00, 0x00, 0x21, 0xF1, 0x00, 0x00, 0x5E, 0xF1, 0x00, 0x00, 0x76, 0xF1, 0x00, 0x00, 0xB4, +/* 00004980 */ 0xF1, 0x00, 0x00, 0xEE, 0xF1, 0x00, 0x00, 0x2B, 0xF2, 0x00, 0x00, 0x43, 0xF2, 0x00, 0x00, 0x55, +/* 00004990 */ 0xF2, 0x00, 0x00, 0x75, 0xF2, 0x00, 0x00, 0x83, 0xF2, 0x00, 0x00, 0x84, 0xF2, 0x00, 0x00, 0x0E, +/* 000049A0 */ 0xF3, 0x00, 0x00, 0x4B, 0xF3, 0x00, 0x00, 0x6E, 0xF3, 0x00, 0x00, 0x6F, 0xF3, 0x00, 0x00, 0x96, +/* 000049B0 */ 0xF3, 0x00, 0x00, 0xED, 0xF3, 0x00, 0x00, 0x4D, 0xF4, 0x00, 0x00, 0x8A, 0xF4, 0x00, 0x00, 0xE3, +/* 000049C0 */ 0xF4, 0x00, 0x00, 0xF9, 0xF4, 0x00, 0x00, 0x0B, 0xF5, 0x00, 0x00, 0x0C, 0xF5, 0x00, 0x00, 0x37, +/* 000049D0 */ 0xF5, 0x00, 0x00, 0x5B, 0xF5, 0x00, 0x00, 0x91, 0xF5, 0x00, 0x00, 0xEC, 0xF5, 0x00, 0x00, 0x29, +/* 000049E0 */ 0xF6, 0x00, 0x00, 0x7D, 0xF6, 0x00, 0x00, 0x93, 0xF6, 0x00, 0x00, 0xA5, 0xF6, 0x00, 0x00, 0xA6, +/* 000049F0 */ 0xF6, 0x00, 0x00, 0xCB, 0xF6, 0x00, 0x00, 0x21, 0xF7, 0x00, 0x00, 0x78, 0xF7, 0x00, 0x00, 0xD2, +/* 00004A00 */ 0xF7, 0x00, 0x00, 0x2E, 0xF8, 0x00, 0x00, 0x69, 0xF8, 0x00, 0x00, 0xBE, 0xF8, 0x00, 0x00, 0xD4, +/* 00004A10 */ 0xF8, 0x00, 0x00, 0xE6, 0xF8, 0x00, 0x00, 0xE7, 0xF8, 0x00, 0x00, 0x0A, 0xF9, 0x00, 0x00, 0x54, +/* 00004A20 */ 0xF9, 0x00, 0x00, 0x66, 0xF9, 0x00, 0x00, 0x67, 0xF9, 0x00, 0x00, 0x93, 0xF9, 0x00, 0x00, 0xCF, +/* 00004A30 */ 0xF9, 0x00, 0x00, 0x2E, 0xFA, 0x00, 0x00, 0x70, 0xFA, 0x00, 0x00, 0xC8, 0xFA, 0x00, 0x00, 0xDE, +/* 00004A40 */ 0xFA, 0x00, 0x00, 0xF0, 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0x57, 0xFB, 0x00, 0x00, 0x7F, +/* 00004A50 */ 0xFB, 0x00, 0x00, 0xCB, 0xFB, 0x00, 0x00, 0xE1, 0xFB, 0x00, 0x00, 0xF5, 0xFB, 0x00, 0x00, 0xF6, +/* 00004A60 */ 0xFB, 0x00, 0x00, 0x2C, 0xFC, 0x00, 0x00, 0xA2, 0xFC, 0x00, 0x00, 0xB0, 0xFC, 0x00, 0x00, 0xB1, +/* 00004A70 */ 0xFC, 0x00, 0x00, 0xDE, 0xFC, 0x00, 0x00, 0x0E, 0xFD, 0x00, 0x00, 0x3A, 0xFD, 0x00, 0x00, 0x66, +/* 00004A80 */ 0xFD, 0x00, 0x00, 0x96, 0xFD, 0x00, 0x00, 0xC2, 0xFD, 0x00, 0x00, 0xEE, 0xFD, 0x00, 0x00, 0x23, +/* 00004A90 */ 0xFE, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x00, 0x76, 0xFE, 0x00, 0x00, 0x85, 0xFE, 0x00, 0x00, 0x86, +/* 00004AA0 */ 0xFE, 0x00, 0x00, 0xBD, 0xFE, 0x00, 0x00, 0xF4, 0xFE, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x25, +/* 00004AB0 */ 0xFF, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x00, 0x6E, 0xFF, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x7D, +/* 00004AC0 */ 0xFF, 0x00, 0x00, 0xED, 0xFF, 0x00, 0x00, 0x49, 0x00, 0x01, 0x00, 0xBF, 0x00, 0x01, 0x00, 0x50, +/* 00004AD0 */ 0x01, 0x01, 0x00, 0xCE, 0x01, 0x01, 0x00, 0xF4, 0x01, 0x01, 0x00, 0xE9, 0x02, 0x01, 0x00, 0x13, +/* 00004AE0 */ 0x03, 0x01, 0x00, 0x25, 0x03, 0x01, 0x00, 0x26, 0x03, 0x01, 0x00, 0x69, 0x03, 0x01, 0x00, 0xEB, +/* 00004AF0 */ 0x03, 0x01, 0x00, 0x1E, 0x04, 0x01, 0x00, 0xD4, 0x04, 0x01, 0x00, 0xE6, 0x04, 0x01, 0x00, 0x0C, +/* 00004B00 */ 0x05, 0x01, 0x00, 0x1A, 0x05, 0x01, 0x00, 0x1B, 0x05, 0x01, 0x00, 0x80, 0x05, 0x01, 0x00, 0xCA, +/* 00004B10 */ 0x05, 0x01, 0x00, 0x3E, 0x06, 0x01, 0x00, 0xCF, 0x06, 0x01, 0x00, 0xF5, 0x06, 0x01, 0x00, 0xF5, +/* 00004B20 */ 0x07, 0x01, 0x00, 0x1F, 0x08, 0x01, 0x00, 0x31, 0x08, 0x01, 0x00, 0x32, 0x08, 0x01, 0x00, 0x7C, +/* 00004B30 */ 0x08, 0x01, 0x00, 0xAB, 0x08, 0x01, 0x00, 0x29, 0x09, 0x01, 0x00, 0x5E, 0x09, 0x01, 0x00, 0xD9, +/* 00004B40 */ 0x09, 0x01, 0x00, 0xEB, 0x09, 0x01, 0x00, 0xEC, 0x09, 0x01, 0x00, 0x12, 0x0A, 0x01, 0x00, 0x20, +/* 00004B50 */ 0x0A, 0x01, 0x00, 0x21, 0x0A, 0x01, 0x00, 0x83, 0x0A, 0x01, 0x00, 0xCE, 0x0A, 0x01, 0x00, 0x0C, +/* 00004B60 */ 0x0B, 0x01, 0x00, 0x85, 0x0B, 0x01, 0x00, 0x97, 0x0B, 0x01, 0x00, 0x98, 0x0B, 0x01, 0x00, 0xD2, +/* 00004B70 */ 0x0B, 0x01, 0x00, 0x3F, 0x0C, 0x01, 0x00, 0x9E, 0x0C, 0x01, 0x00, 0x13, 0x0D, 0x01, 0x00, 0x25, +/* 00004B80 */ 0x0D, 0x01, 0x00, 0x26, 0x0D, 0x01, 0x00, 0x61, 0x0D, 0x01, 0x00, 0xCC, 0x0D, 0x01, 0x00, 0xF6, +/* 00004B90 */ 0x0D, 0x01, 0x00, 0x6A, 0x0E, 0x01, 0x00, 0x87, 0x0E, 0x01, 0x00, 0x0A, 0x0F, 0x01, 0x00, 0x20, +/* 00004BA0 */ 0x0F, 0x01, 0x00, 0x5F, 0x0F, 0x01, 0x00, 0xCA, 0x0F, 0x01, 0x00, 0xF4, 0x0F, 0x01, 0x00, 0x68, +/* 00004BB0 */ 0x10, 0x01, 0x00, 0x85, 0x10, 0x01, 0x00, 0xFE, 0x10, 0x01, 0x00, 0x14, 0x11, 0x01, 0x00, 0x26, +/* 00004BC0 */ 0x11, 0x01, 0x00, 0x27, 0x11, 0x01, 0x00, 0xBC, 0x11, 0x01, 0x00, 0x48, 0x12, 0x01, 0x00, 0xBB, +/* 00004BD0 */ 0x12, 0x01, 0x00, 0xFE, 0x12, 0x01, 0x00, 0x7A, 0x13, 0x01, 0x00, 0x8C, 0x13, 0x01, 0x00, 0x8D, +/* 00004BE0 */ 0x13, 0x01, 0x00, 0xC7, 0x13, 0x01, 0x00, 0x3F, 0x14, 0x01, 0x00, 0x51, 0x14, 0x01, 0x00, 0x52, +/* 00004BF0 */ 0x14, 0x01, 0x00, 0x8D, 0x14, 0x01, 0x00, 0x07, 0x15, 0x01, 0x00, 0x19, 0x15, 0x01, 0x00, 0x1A, +/* 00004C00 */ 0x15, 0x01, 0x00, 0x57, 0x15, 0x01, 0x00, 0xD5, 0x15, 0x01, 0x00, 0xE7, 0x15, 0x01, 0x00, 0xE8, +/* 00004C10 */ 0x15, 0x01, 0x00, 0x25, 0x16, 0x01, 0x00, 0xA3, 0x16, 0x01, 0x00, 0xB5, 0x16, 0x01, 0x00, 0xB6, +/* 00004C20 */ 0x16, 0x01, 0x00, 0xF9, 0x16, 0x01, 0x00, 0x76, 0x17, 0x01, 0x00, 0x88, 0x17, 0x01, 0x00, 0x89, +/* 00004C30 */ 0x17, 0x01, 0x00, 0xAF, 0x17, 0x01, 0x00, 0xBD, 0x17, 0x01, 0x00, 0xBE, 0x17, 0x01, 0x00, 0x13, +/* 00004C40 */ 0x18, 0x01, 0x00, 0x4C, 0x18, 0x01, 0x00, 0x7C, 0x18, 0x01, 0x00, 0x8E, 0x18, 0x01, 0x00, 0x8F, +/* 00004C50 */ 0x18, 0x01, 0x00, 0x2A, 0x19, 0x01, 0x00, 0x8C, 0x19, 0x01, 0x00, 0x9E, 0x19, 0x01, 0x00, 0x9F, +/* 00004C60 */ 0x19, 0x01, 0x00, 0xDE, 0x19, 0x01, 0x00, 0xDF, 0x19, 0x01, 0x00, 0x06, 0x1A, 0x01, 0x00, 0x4B, +/* 00004C70 */ 0x1A, 0x01, 0x00, 0x4C, 0x1A, 0x01, 0x00, 0xBD, 0x1A, 0x01, 0x00, 0x1C, 0x1B, 0x01, 0x00, 0x1D, +/* 00004C80 */ 0x1B, 0x01, 0x00, 0x4B, 0x1B, 0x01, 0x00, 0x9E, 0x1B, 0x01, 0x00, 0xB7, 0x1B, 0x01, 0x00, 0xF5, +/* 00004C90 */ 0x1B, 0x01, 0x00, 0x07, 0x1C, 0x01, 0x00, 0x08, 0x1C, 0x01, 0x00, 0x36, 0x1C, 0x01, 0x00, 0x71, +/* 00004CA0 */ 0x1C, 0x01, 0x00, 0x83, 0x1C, 0x01, 0x00, 0x84, 0x1C, 0x01, 0x00, 0xA6, 0x1C, 0x01, 0x00, 0x15, +/* 00004CB0 */ 0x1D, 0x01, 0x00, 0x7C, 0x1D, 0x01, 0x00, 0xE0, 0x1D, 0x01, 0x00, 0x61, 0x1E, 0x01, 0x00, 0xC3, +/* 00004CC0 */ 0x1E, 0x01, 0x00, 0x27, 0x1F, 0x01, 0x00, 0x8F, 0x1F, 0x01, 0x00, 0xF7, 0x1F, 0x01, 0x00, 0x66, +/* 00004CD0 */ 0x20, 0x01, 0x00, 0x67, 0x20, 0x01, 0x00, 0xD6, 0x20, 0x01, 0x00, 0x4C, 0x21, 0x01, 0x00, 0x4D, +/* 00004CE0 */ 0x21, 0x01, 0x00, 0xBD, 0x21, 0x01, 0x00, 0xBE, 0x21, 0x01, 0x00, 0x0F, 0x22, 0x01, 0x00, 0x35, +/* 00004CF0 */ 0x22, 0x01, 0x00, 0x53, 0x22, 0x01, 0x00, 0x73, 0x22, 0x01, 0x00, 0x95, 0x22, 0x01, 0x00, 0xB3, +/* 00004D00 */ 0x22, 0x01, 0x00, 0xD3, 0x22, 0x01, 0x00, 0xF7, 0x22, 0x01, 0x00, 0x1B, 0x23, 0x01, 0x00, 0x4A, +/* 00004D10 */ 0x23, 0x01, 0x00, 0x65, 0x23, 0x01, 0x00, 0x66, 0x23, 0x01, 0x00, 0x8E, 0x23, 0x01, 0x00, 0xCF, +/* 00004D20 */ 0x23, 0x01, 0x00, 0x42, 0x24, 0x01, 0x00, 0x43, 0x24, 0x01, 0x00, 0x69, 0x24, 0x01, 0x00, 0x9D, +/* 00004D30 */ 0x24, 0x01, 0x00, 0xD3, 0x24, 0x01, 0x00, 0x18, 0x25, 0x01, 0x00, 0x19, 0x25, 0x01, 0x00, 0x3B, +/* 00004D40 */ 0x25, 0x01, 0x00, 0x6F, 0x25, 0x01, 0x00, 0x9B, 0x25, 0x01, 0x00, 0xC9, 0x25, 0x01, 0x00, 0xF9, +/* 00004D50 */ 0x25, 0x01, 0x00, 0x25, 0x26, 0x01, 0x00, 0x53, 0x26, 0x01, 0x00, 0x85, 0x26, 0x01, 0x00, 0xB7, +/* 00004D60 */ 0x26, 0x01, 0x00, 0xF5, 0x26, 0x01, 0x00, 0xF6, 0x26, 0x01, 0x00, 0x28, 0x27, 0x01, 0x00, 0x68, +/* 00004D70 */ 0x27, 0x01, 0x00, 0xA6, 0x27, 0x01, 0x00, 0xA7, 0x27, 0x01, 0x00, 0xE9, 0x27, 0x01, 0x00, 0xEA, +/* 00004D80 */ 0x27, 0x01, 0x00, 0xFD, 0x27, 0x01, 0x00, 0x16, 0x28, 0x01, 0x00, 0x6B, 0x28, 0x01, 0x00, 0xE2, +/* 00004D90 */ 0x28, 0x01, 0x00, 0x84, 0x29, 0x01, 0x00, 0x28, 0x2A, 0x01, 0x00, 0x8D, 0x2A, 0x01, 0x00, 0xA1, +/* 00004DA0 */ 0x2A, 0x01, 0x00, 0xCA, 0x2A, 0x01, 0x00, 0xCB, 0x2A, 0x01, 0x00, 0xE1, 0x2A, 0x01, 0x00, 0x30, +/* 00004DB0 */ 0x2B, 0x01, 0x00, 0x71, 0x2B, 0x01, 0x00, 0x8F, 0x2B, 0x01, 0x00, 0xB9, 0x2B, 0x01, 0x00, 0xE3, +/* 00004DC0 */ 0x2B, 0x01, 0x00, 0xE4, 0x2B, 0x01, 0x00, 0x52, 0x2C, 0x01, 0x00, 0xA8, 0x2C, 0x01, 0x00, 0xFC, +/* 00004DD0 */ 0x2C, 0x01, 0x00, 0x66, 0x2D, 0x01, 0x00, 0x8E, 0x2D, 0x01, 0x00, 0xA0, 0x2D, 0x01, 0x00, 0xA1, +/* 00004DE0 */ 0x2D, 0x01, 0x00, 0xC5, 0x2D, 0x01, 0x00, 0xF7, 0x2D, 0x01, 0x00, 0x77, 0x2E, 0x01, 0x00, 0x89, +/* 00004DF0 */ 0x2E, 0x01, 0x00, 0x8A, 0x2E, 0x01, 0x00, 0xA0, 0x2E, 0x01, 0x00, 0xD5, 0x2E, 0x01, 0x00, 0x15, +/* 00004E00 */ 0x2F, 0x01, 0x00, 0x33, 0x2F, 0x01, 0x00, 0x5D, 0x2F, 0x01, 0x00, 0x87, 0x2F, 0x01, 0x00, 0x88, +/* 00004E10 */ 0x2F, 0x01, 0x00, 0xEA, 0x2F, 0x01, 0x00, 0x6F, 0x30, 0x01, 0x00, 0xD4, 0x30, 0x01, 0x00, 0x0F, +/* 00004E20 */ 0x31, 0x01, 0x00, 0x21, 0x31, 0x01, 0x00, 0x22, 0x31, 0x01, 0x00, 0x4F, 0x31, 0x01, 0x00, 0xB4, +/* 00004E30 */ 0x31, 0x01, 0x00, 0xB5, 0x31, 0x01, 0x00, 0x37, 0x32, 0x01, 0x00, 0x72, 0x32, 0x01, 0x00, 0xD1, +/* 00004E40 */ 0x32, 0x01, 0x00, 0xE3, 0x32, 0x01, 0x00, 0x26, 0x33, 0x01, 0x00, 0x34, 0x33, 0x01, 0x00, 0x35, +/* 00004E50 */ 0x33, 0x01, 0x00, 0x8B, 0x33, 0x01, 0x00, 0xE9, 0x33, 0x01, 0x00, 0x39, 0x34, 0x01, 0x00, 0x5C, +/* 00004E60 */ 0x34, 0x01, 0x00, 0x83, 0x34, 0x01, 0x00, 0xA9, 0x34, 0x01, 0x00, 0xBF, 0x34, 0x01, 0x00, 0xC0, +/* 00004E70 */ 0x34, 0x01, 0x00, 0x35, 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0xC2, 0x35, 0x01, 0x00, 0xD4, +/* 00004E80 */ 0x35, 0x01, 0x00, 0x27, 0x36, 0x01, 0x00, 0x5F, 0x36, 0x01, 0x00, 0x8A, 0x36, 0x01, 0x00, 0x9C, +/* 00004E90 */ 0x36, 0x01, 0x00, 0x9D, 0x36, 0x01, 0x00, 0xCA, 0x36, 0x01, 0x00, 0x0C, 0x37, 0x01, 0x00, 0x7A, +/* 00004EA0 */ 0x37, 0x01, 0x00, 0xC9, 0x37, 0x01, 0x00, 0xFA, 0x37, 0x01, 0x00, 0x55, 0x38, 0x01, 0x00, 0x72, +/* 00004EB0 */ 0x38, 0x01, 0x00, 0x9C, 0x38, 0x01, 0x00, 0xDA, 0x38, 0x01, 0x00, 0x54, 0x39, 0x01, 0x00, 0xAF, +/* 00004EC0 */ 0x39, 0x01, 0x00, 0xC5, 0x39, 0x01, 0x00, 0xD7, 0x39, 0x01, 0x00, 0xD8, 0x39, 0x01, 0x00, 0xFC, +/* 00004ED0 */ 0x39, 0x01, 0x00, 0x36, 0x3A, 0x01, 0x00, 0xA8, 0x3A, 0x01, 0x00, 0xBA, 0x3A, 0x01, 0x00, 0xBB, +/* 00004EE0 */ 0x3A, 0x01, 0x00, 0x19, 0x3B, 0x01, 0x00, 0x27, 0x3B, 0x01, 0x00, 0x28, 0x3B, 0x01, 0x00, 0xA5, +/* 00004EF0 */ 0x3B, 0x01, 0x00, 0x31, 0x3C, 0x01, 0x00, 0xB0, 0x3C, 0x01, 0x00, 0x39, 0x3D, 0x01, 0x00, 0x5E, +/* 00004F00 */ 0x3D, 0x01, 0x00, 0x6D, 0x3D, 0x01, 0x00, 0xF8, 0x3D, 0x01, 0x00, 0x7E, 0x3E, 0x01, 0x00, 0x08, +/* 00004F10 */ 0x3F, 0x01, 0x00, 0x5C, 0x3F, 0x01, 0x00, 0x6B, 0x3F, 0x01, 0x00, 0xED, 0x3F, 0x01, 0x00, 0x5E, +/* 00004F20 */ 0x40, 0x01, 0x00, 0xB9, 0x40, 0x01, 0x00, 0x24, 0x41, 0x01, 0x00, 0x9E, 0x41, 0x01, 0x00, 0xEF, +/* 00004F30 */ 0x41, 0x01, 0x00, 0xFE, 0x41, 0x01, 0x00, 0x74, 0x42, 0x01, 0x00, 0x83, 0x42, 0x01, 0x00, 0x0F, +/* 00004F40 */ 0x43, 0x01, 0x00, 0x98, 0x43, 0x01, 0x00, 0xE3, 0x43, 0x01, 0x00, 0xE4, 0x43, 0x01, 0x00, 0x34, +/* 00004F50 */ 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0x56, 0x45, 0x01, 0x00, 0x7F, 0x45, 0x01, 0x00, 0x25, +/* 00004F60 */ 0x46, 0x01, 0x00, 0x26, 0x46, 0x01, 0x00, 0x76, 0x46, 0x01, 0x00, 0x17, 0x47, 0x01, 0x00, 0x9C, +/* 00004F70 */ 0x47, 0x01, 0x00, 0xC5, 0x47, 0x01, 0x00, 0x79, 0x48, 0x01, 0x00, 0x7A, 0x48, 0x01, 0x00, 0xCA, +/* 00004F80 */ 0x48, 0x01, 0x00, 0x6B, 0x49, 0x01, 0x00, 0xF0, 0x49, 0x01, 0x00, 0x19, 0x4A, 0x01, 0x00, 0xCD, +/* 00004F90 */ 0x4A, 0x01, 0x00, 0xCE, 0x4A, 0x01, 0x00, 0xF5, 0x4A, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x88, +/* 00004FA0 */ 0x4B, 0x01, 0x00, 0xCD, 0x4B, 0x01, 0x00, 0xE3, 0x4B, 0x01, 0x00, 0xE4, 0x4B, 0x01, 0x00, 0x1B, +/* 00004FB0 */ 0x4C, 0x01, 0x00, 0x4F, 0x4C, 0x01, 0x00, 0x9E, 0x4C, 0x01, 0x00, 0xB4, 0x4C, 0x01, 0x00, 0xB5, +/* 00004FC0 */ 0x4C, 0x01, 0x00, 0xF0, 0x4C, 0x01, 0x00, 0x36, 0x4D, 0x01, 0x00, 0x37, 0x4D, 0x01, 0x00, 0x6D, +/* 00004FD0 */ 0x4D, 0x01, 0x00, 0xAC, 0x4D, 0x01, 0x00, 0xF1, 0x4D, 0x01, 0x00, 0x07, 0x4E, 0x01, 0x00, 0x08, +/* 00004FE0 */ 0x4E, 0x01, 0x00, 0x56, 0x4E, 0x01, 0x00, 0x57, 0x4E, 0x01, 0x00, 0xBD, 0x4E, 0x01, 0x00, 0xF9, +/* 00004FF0 */ 0x4E, 0x01, 0x00, 0xFA, 0x4E, 0x01, 0x00, 0x1A, 0x4F, 0x01, 0x00, 0x2C, 0x4F, 0x01, 0x00, 0x76, +/* 00005000 */ 0x4F, 0x01, 0x00, 0x77, 0x4F, 0x01, 0x00, 0x9F, 0x4F, 0x01, 0x00, 0xD3, 0x4F, 0x01, 0x00, 0x40, +/* 00005010 */ 0x50, 0x01, 0x00, 0x56, 0x50, 0x01, 0x00, 0x9D, 0x50, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x6D, +/* 00005020 */ 0x51, 0x01, 0x00, 0x83, 0x51, 0x01, 0x00, 0x84, 0x51, 0x01, 0x00, 0xD6, 0x51, 0x01, 0x00, 0x0B, +/* 00005030 */ 0x52, 0x01, 0x00, 0x21, 0x52, 0x01, 0x00, 0x22, 0x52, 0x01, 0x00, 0x51, 0x52, 0x01, 0x00, 0x7F, +/* 00005040 */ 0x52, 0x01, 0x00, 0xBB, 0x52, 0x01, 0x00, 0xD8, 0x52, 0x01, 0x00, 0x07, 0x53, 0x01, 0x00, 0x1D, +/* 00005050 */ 0x53, 0x01, 0x00, 0x1E, 0x53, 0x01, 0x00, 0x73, 0x53, 0x01, 0x00, 0x85, 0x53, 0x01, 0x00, 0xD8, +/* 00005060 */ 0x53, 0x01, 0x00, 0xD9, 0x53, 0x01, 0x00, 0x20, 0x54, 0x01, 0x00, 0x21, 0x54, 0x01, 0x00, 0xBE, +/* 00005070 */ 0x54, 0x01, 0x00, 0x08, 0x55, 0x01, 0x00, 0xA9, 0x55, 0x01, 0x00, 0xAA, 0x55, 0x01, 0x00, 0xF5, +/* 00005080 */ 0x55, 0x01, 0x00, 0x3C, 0x56, 0x01, 0x00, 0x74, 0x56, 0x01, 0x00, 0xE5, 0x56, 0x01, 0x00, 0xFF, +/* 00005090 */ 0x56, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x4B, 0x57, 0x01, 0x00, 0xB2, 0x57, 0x01, 0x00, 0x23, +/* 000050A0 */ 0x58, 0x01, 0x00, 0x3D, 0x58, 0x01, 0x00, 0x3E, 0x58, 0x01, 0x00, 0x79, 0x58, 0x01, 0x00, 0xB7, +/* 000050B0 */ 0x58, 0x01, 0x00, 0xCB, 0x58, 0x01, 0x00, 0xCC, 0x58, 0x01, 0x00, 0x20, 0x59, 0x01, 0x00, 0x58, +/* 000050C0 */ 0x59, 0x01, 0x00, 0x90, 0x59, 0x01, 0x00, 0x0A, 0x5A, 0x01, 0x00, 0x24, 0x5A, 0x01, 0x00, 0x6F, +/* 000050D0 */ 0x5A, 0x01, 0x00, 0xD6, 0x5A, 0x01, 0x00, 0x50, 0x5B, 0x01, 0x00, 0x6A, 0x5B, 0x01, 0x00, 0x9C, +/* 000050E0 */ 0x5B, 0x01, 0x00, 0xD7, 0x5B, 0x01, 0x00, 0x2E, 0x5C, 0x01, 0x00, 0x93, 0x5C, 0x01, 0x00, 0xD2, +/* 000050F0 */ 0x5C, 0x01, 0x00, 0x0D, 0x5D, 0x01, 0x00, 0x4A, 0x5D, 0x01, 0x00, 0x7F, 0x5D, 0x01, 0x00, 0xB6, +/* 00005100 */ 0x5D, 0x01, 0x00, 0xEF, 0x5D, 0x01, 0x00, 0x24, 0x5E, 0x01, 0x00, 0x5B, 0x5E, 0x01, 0x00, 0x96, +/* 00005110 */ 0x5E, 0x01, 0x00, 0xD1, 0x5E, 0x01, 0x00, 0x17, 0x5F, 0x01, 0x00, 0x38, 0x5F, 0x01, 0x00, 0x76, +/* 00005120 */ 0x5F, 0x01, 0x00, 0xE8, 0x5F, 0x01, 0x00, 0x8A, 0x60, 0x01, 0x00, 0xC6, 0x60, 0x01, 0x00, 0xE4, +/* 00005130 */ 0x60, 0x01, 0x00, 0x0E, 0x61, 0x01, 0x00, 0x56, 0x61, 0x01, 0x00, 0xA3, 0x61, 0x01, 0x00, 0xB7, +/* 00005140 */ 0x61, 0x01, 0x00, 0xB8, 0x61, 0x01, 0x00, 0x56, 0x62, 0x01, 0x00, 0x57, 0x62, 0x01, 0x00, 0x7E, +/* 00005150 */ 0x62, 0x01, 0x00, 0x8C, 0x62, 0x01, 0x00, 0x96, 0x62, 0x01, 0x00, 0xE7, 0x62, 0x01, 0x00, 0x01, +/* 00005160 */ 0x63, 0x01, 0x00, 0x0B, 0x63, 0x01, 0x00, 0x0C, 0x63, 0x01, 0x00, 0x3D, 0x63, 0x01, 0x00, 0x5C, +/* 00005170 */ 0x63, 0x01, 0x00, 0xF2, 0x63, 0x01, 0x00, 0x88, 0x64, 0x01, 0x00, 0x1E, 0x65, 0x01, 0x00, 0xB4, +/* 00005180 */ 0x65, 0x01, 0x00, 0xBA, 0x65, 0x01, 0x00, 0xBE, 0x65, 0x01, 0x00, 0x00, 0x53, 0xB9, 0x0C, 0x00, +/* 00005190 */ 0x00, 0x00, 0x04, 0x02, 0xA8, 0x41, 0xC0, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, 0x70, 0x01, 0x01, +/* 000051A0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFF, 0x4E, 0x64, 0x01, 0x00, 0xFF, 0x4E, 0x64, +/* 000051B0 */ 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x0A, 0x09, 0xA8, +/* 000051C0 */ 0x00, 0xD4, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0xD3, +/* 000051D0 */ 0x51, 0x00, 0x00, 0xBF, 0x1D, 0x84, 0xE0, 0x89, 0xC6, 0x12, 0x07, 0x01, 0xA2, 0x41, 0xD1, 0x00, +/* 000051E0 */ 0x01, 0xFE, 0x90, 0x01, 0x21, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x90, 0x01, 0xFF, +/* 000051F0 */ 0x2B, 0x64, 0x01, 0x00, 0xFF, 0x2B, 0x64, 0x01, 0x00, 0x40, 0x4B, 0x18, 0x3D, 0x51, 0x09, 0xFE, +/* 00005200 */ 0x47, 0x02, 0xFE, 0x41, 0x02, 0x27, 0x0F, 0x4B, 0x4A, 0x4B, 0x4B, 0x15, 0x4E, 0x4F, 0x50, 0x0B, +/* 00005210 */ 0x06, 0xFE, 0xE6, 0x02, 0x06, 0xFE, 0xE7, 0x02, 0x06, 0xFE, 0xE8, 0x02, 0x06, 0xFE, 0xE9, 0x02, +/* 00005220 */ 0x06, 0xFE, 0xEA, 0x02, 0x07, 0x08, 0x06, 0xFE, 0xEB, 0x02, 0x01, 0x00, 0x06, 0xFE, 0xEC, 0x02, +/* 00005230 */ 0x06, 0xFE, 0xED, 0x02, 0x01, 0x01, 0x06, 0xFE, 0xEE, 0x02, 0x01, 0x02, 0x06, 0xFE, 0xEF, 0x02, +/* 00005240 */ 0x01, 0x03, 0x06, 0xFE, 0xF0, 0x02, 0x01, 0x04, 0x06, 0xFE, 0xF1, 0x02, 0x01, 0x05, 0x06, 0xFE, +/* 00005250 */ 0xF2, 0x02, 0x05, 0xFE, 0xF3, 0x02, 0x05, 0xFE, 0xF4, 0x02, 0x05, 0xFE, 0xF5, 0x02, 0x05, 0xFE, +/* 00005260 */ 0xF6, 0x02, 0x05, 0xFE, 0xF7, 0x02, 0x06, 0xFE, 0xF8, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, +/* 00005270 */ 0xFA, 0x02, 0x05, 0xFE, 0xFB, 0x02, 0x06, 0xFE, 0xFC, 0x02, 0x06, 0xFE, 0xFD, 0x02, 0x05, 0xFE, +/* 00005280 */ 0xFE, 0x02, 0x06, 0xFE, 0xFF, 0x02, 0x06, 0xFE, 0x00, 0x03, 0x06, 0xFE, 0x01, 0x03, 0x05, 0xFE, +/* 00005290 */ 0x02, 0x03, 0x06, 0xFE, 0x03, 0x03, 0x06, 0xFE, 0x04, 0x03, 0x05, 0xFE, 0x05, 0x03, 0x06, 0xFE, +/* 000052A0 */ 0x06, 0x03, 0x06, 0xFE, 0x07, 0x03, 0x05, 0xFE, 0x08, 0x03, 0x06, 0xFE, 0x09, 0x03, 0x06, 0xFE, +/* 000052B0 */ 0x0A, 0x03, 0x06, 0xFE, 0x0B, 0x03, 0x06, 0xFE, 0x0C, 0x03, 0x06, 0xFE, 0x0D, 0x03, 0x06, 0xFE, +/* 000052C0 */ 0x0E, 0x03, 0x06, 0xFE, 0x0F, 0x03, 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x06, 0xFE, +/* 000052D0 */ 0x12, 0x03, 0x06, 0xFE, 0x13, 0x03, 0x0C, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x06, +/* 000052E0 */ 0xFE, 0x16, 0x03, 0xFE, 0x4E, 0x09, 0x96, 0x38, 0x3E, 0xD4, 0x0E, 0x3F, 0x96, 0x02, 0x3F, 0xD4, +/* 000052F0 */ 0x0F, 0x40, 0x96, 0x03, 0x40, 0xD4, 0x10, 0x41, 0x96, 0x04, 0x41, 0xD4, 0x11, 0x42, 0x96, 0x05, +/* 00005300 */ 0x42, 0xD4, 0x12, 0x43, 0x96, 0x06, 0x43, 0xD4, 0x13, 0x44, 0x96, 0x07, 0x44, 0xD4, 0x14, 0x45, +/* 00005310 */ 0x96, 0x08, 0x45, 0x4F, 0x46, 0x4F, 0x49, 0x4F, 0x4A, 0x4F, 0x51, 0x96, 0x39, 0x51, 0x4F, 0x51, +/* 00005320 */ 0x96, 0x3A, 0x51, 0x4F, 0x51, 0x96, 0x3B, 0x51, 0x4F, 0x51, 0x96, 0x3C, 0x51, 0x4F, 0x51, 0x96, +/* 00005330 */ 0x3D, 0x51, 0x4F, 0x51, 0x96, 0x3E, 0x51, 0x4F, 0x51, 0x96, 0x3F, 0x51, 0x4F, 0x51, 0x96, 0x40, +/* 00005340 */ 0x51, 0x4F, 0x51, 0x96, 0x41, 0x51, 0x4F, 0x51, 0x96, 0x42, 0x51, 0x4F, 0x51, 0x96, 0x43, 0x51, +/* 00005350 */ 0x4F, 0x51, 0x96, 0x44, 0x51, 0x4F, 0x51, 0x96, 0x45, 0x51, 0x4F, 0x51, 0x96, 0x46, 0x51, 0x4F, +/* 00005360 */ 0x51, 0x96, 0x47, 0x51, 0x4F, 0x51, 0x96, 0x48, 0x51, 0x4F, 0x51, 0x96, 0x49, 0x51, 0x4F, 0x51, +/* 00005370 */ 0x96, 0x4A, 0x51, 0x4F, 0x51, 0x96, 0x4B, 0x51, 0x4F, 0x51, 0x96, 0x4C, 0x51, 0x62, 0x51, 0x3D, +/* 00005380 */ 0x00, 0x96, 0x09, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x77, 0x02, 0x51, 0x01, 0x93, 0x09, 0x51, +/* 00005390 */ 0x00, 0x00, 0x62, 0x51, 0x51, 0x02, 0xA8, 0x52, 0x14, 0x03, 0x00, 0x51, 0x52, 0x09, 0x1F, 0x00, +/* 000053A0 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x93, 0x09, 0x52, 0x00, 0x00, 0x62, 0x52, 0x52, 0x03, 0x07, 0x01, +/* 000053B0 */ 0x00, 0xC4, 0x01, 0x52, 0x52, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x52, 0x51, 0x04, 0x93, +/* 000053C0 */ 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x05, 0xA8, 0x52, 0x14, 0x03, 0x00, 0x51, 0x52, 0x09, +/* 000053D0 */ 0x1F, 0x00, 0x93, 0x09, 0x51, 0x00, 0x00, 0x93, 0x09, 0x52, 0x00, 0x00, 0x62, 0x52, 0x52, 0x03, +/* 000053E0 */ 0x07, 0x01, 0x00, 0xC4, 0x01, 0x52, 0x52, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0x52, 0x51, +/* 000053F0 */ 0x06, 0x93, 0x09, 0x52, 0x00, 0x00, 0x62, 0x52, 0x52, 0x07, 0xAC, 0x51, 0x0F, 0x02, 0x00, 0x52, +/* 00005400 */ 0xAB, 0x51, 0x96, 0x39, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x08, 0x47, 0x46, +/* 00005410 */ 0x51, 0x96, 0x3A, 0x03, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x09, 0x96, 0x0A, 0x51, +/* 00005420 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x0A, 0x96, 0x0B, 0x51, 0x93, 0x09, 0x51, 0x00, +/* 00005430 */ 0x00, 0x62, 0x51, 0x51, 0x0B, 0x96, 0x0C, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, +/* 00005440 */ 0x0C, 0x96, 0x0D, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x0D, 0x96, 0x0E, 0x51, +/* 00005450 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x0E, 0x96, 0x0F, 0x51, 0x93, 0x09, 0x51, 0x00, +/* 00005460 */ 0x00, 0x62, 0x51, 0x51, 0x0F, 0x96, 0x10, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, +/* 00005470 */ 0x10, 0x96, 0x11, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x11, 0x96, 0x12, 0x51, +/* 00005480 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x12, 0x96, 0x13, 0x51, 0x93, 0x09, 0x51, 0x00, +/* 00005490 */ 0x00, 0x62, 0x51, 0x51, 0x13, 0x47, 0x47, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, +/* 000054A0 */ 0x14, 0x96, 0x14, 0x51, 0x93, 0x0A, 0x51, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 000054B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x93, 0x09, 0x53, 0x00, +/* 000054C0 */ 0x00, 0x62, 0x53, 0x53, 0x15, 0x7B, 0x53, 0x52, 0x16, 0x93, 0x09, 0x53, 0x00, 0x00, 0x62, 0x53, +/* 000054D0 */ 0x53, 0x17, 0x7B, 0x53, 0x52, 0x18, 0x93, 0x09, 0x53, 0x00, 0x00, 0x62, 0x53, 0x53, 0x19, 0x7B, +/* 000054E0 */ 0x53, 0x52, 0x1A, 0x93, 0x09, 0x53, 0x00, 0x00, 0x62, 0x53, 0x53, 0x1B, 0x7B, 0x53, 0x52, 0x1C, +/* 000054F0 */ 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x08, 0x02, 0x00, 0xEE, 0x03, 0x51, 0x51, 0x02, 0x00, 0x96, 0x15, +/* 00005500 */ 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x1D, 0x96, 0x16, 0x51, 0x93, 0x09, 0x51, +/* 00005510 */ 0x00, 0x00, 0x62, 0x51, 0x51, 0x1E, 0x96, 0x17, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, +/* 00005520 */ 0x51, 0x1F, 0x96, 0x18, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x20, 0x96, 0x19, +/* 00005530 */ 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x21, 0x96, 0x1A, 0x51, 0xD4, 0x00, 0x51, +/* 00005540 */ 0x96, 0x1B, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x22, 0x96, 0x1C, 0x51, 0x93, +/* 00005550 */ 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x23, 0x96, 0x1D, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, +/* 00005560 */ 0x62, 0x51, 0x51, 0x24, 0x96, 0x1E, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x25, +/* 00005570 */ 0x96, 0x1F, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x26, 0x96, 0x20, 0x51, 0x93, +/* 00005580 */ 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x27, 0x96, 0x21, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, +/* 00005590 */ 0x62, 0x51, 0x51, 0x28, 0x96, 0x22, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x29, +/* 000055A0 */ 0x96, 0x23, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x2A, 0x96, 0x24, 0x51, 0x93, +/* 000055B0 */ 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x2B, 0x96, 0x25, 0x51, 0x93, 0x16, 0x51, 0x02, 0x00, +/* 000055C0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x52, 0x5C, 0x01, 0x52, 0xEE, 0x02, 0x51, 0x51, 0x03, +/* 000055D0 */ 0x00, 0x47, 0x48, 0x51, 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x2C, 0x96, 0x26, 0x51, +/* 000055E0 */ 0x93, 0x09, 0x51, 0x00, 0x00, 0x62, 0x51, 0x51, 0x2D, 0x96, 0x27, 0x51, 0x93, 0x0A, 0x51, 0x01, +/* 000055F0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +/* 00005600 */ 0x52, 0x00, 0x00, 0x00, 0x7B, 0x0B, 0x52, 0x2E, 0x7B, 0x0B, 0x52, 0x2F, 0x7B, 0x0E, 0x52, 0x30, +/* 00005610 */ 0x7B, 0x10, 0x52, 0x31, 0x7B, 0x12, 0x52, 0x32, 0x7B, 0x14, 0x52, 0x33, 0x7B, 0x16, 0x52, 0x34, +/* 00005620 */ 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x08, 0x04, 0x00, 0xEE, 0x03, 0x51, 0x51, 0x04, 0x00, 0x96, 0x3B, +/* 00005630 */ 0x51, 0xA8, 0x51, 0x96, 0x3C, 0x51, 0xD4, 0x01, 0x51, 0x96, 0x3D, 0x51, 0xD4, 0x02, 0x51, 0x96, +/* 00005640 */ 0x3E, 0x51, 0xD4, 0x03, 0x51, 0x96, 0x3F, 0x51, 0xD4, 0x04, 0x51, 0x96, 0x28, 0x51, 0xD4, 0x05, +/* 00005650 */ 0x51, 0x96, 0x29, 0x51, 0xD4, 0x06, 0x51, 0x96, 0x2A, 0x51, 0xD4, 0x07, 0x51, 0x96, 0x2B, 0x51, +/* 00005660 */ 0xD4, 0x08, 0x51, 0x96, 0x2C, 0x51, 0xD4, 0x09, 0x51, 0x96, 0x2D, 0x51, 0xD4, 0x0A, 0x51, 0x96, +/* 00005670 */ 0x2E, 0x51, 0xD4, 0x0B, 0x51, 0x96, 0x2F, 0x51, 0xA8, 0x51, 0x96, 0x40, 0x51, 0xD4, 0x0C, 0x51, +/* 00005680 */ 0x96, 0x30, 0x51, 0xD4, 0x0D, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x51, 0x51, +/* 00005690 */ 0x05, 0x00, 0x96, 0x31, 0x51, 0xA8, 0x51, 0x96, 0x41, 0x51, 0xA8, 0x51, 0x96, 0x42, 0x51, 0xA8, +/* 000056A0 */ 0x51, 0x96, 0x43, 0x51, 0xA8, 0x51, 0x96, 0x44, 0x51, 0xD4, 0x15, 0x51, 0x96, 0x32, 0x51, 0xD4, +/* 000056B0 */ 0x16, 0x51, 0x96, 0x33, 0x51, 0xD4, 0x17, 0x51, 0x96, 0x34, 0x51, 0x93, 0x0A, 0x51, 0x01, 0x00, +/* 000056C0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x08, 0x06, 0x00, +/* 000056D0 */ 0xEE, 0x03, 0x51, 0x51, 0x06, 0x00, 0x54, 0x49, 0x51, 0x93, 0x09, 0x52, 0x00, 0x00, 0x6D, 0x51, +/* 000056E0 */ 0x52, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x52, 0x5C, 0x01, 0x49, 0x93, 0x0A, 0x53, 0x01, 0x00, +/* 000056F0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x3C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x54, +/* 00005700 */ 0x00, 0x00, 0x00, 0x7B, 0x18, 0x54, 0x36, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x08, 0x00, 0xEE, +/* 00005710 */ 0x03, 0x53, 0x53, 0x08, 0x00, 0x5C, 0x02, 0x53, 0xF2, 0x03, 0xFF, 0x51, 0x35, 0x00, 0x00, 0x00, +/* 00005720 */ 0x07, 0x00, 0x96, 0x45, 0x19, 0x93, 0x0C, 0x51, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, +/* 00005730 */ 0x93, 0x20, 0x52, 0x04, 0x00, 0x5C, 0x01, 0x52, 0x93, 0x2A, 0x52, 0x05, 0x00, 0x07, 0x03, 0x00, +/* 00005740 */ 0x5C, 0x00, 0x09, 0x93, 0x45, 0x53, 0x06, 0x00, 0x5C, 0x01, 0x53, 0xD4, 0x18, 0x53, 0x5C, 0x02, +/* 00005750 */ 0x53, 0xEE, 0x03, 0x52, 0x52, 0x0A, 0x00, 0x5C, 0x02, 0x52, 0x5C, 0x03, 0x49, 0xEE, 0x04, 0x51, +/* 00005760 */ 0x51, 0x09, 0x00, 0x96, 0x46, 0x51, 0x96, 0x47, 0x1A, 0x93, 0x0C, 0x51, 0x03, 0x00, 0x07, 0x04, +/* 00005770 */ 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x52, 0x04, 0x00, 0x5C, 0x01, 0x52, 0x93, 0x2A, 0x52, 0x05, +/* 00005780 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x47, 0x53, 0x07, 0x00, 0x5C, 0x01, 0x53, 0xD4, +/* 00005790 */ 0x19, 0x53, 0x5C, 0x02, 0x53, 0xEE, 0x03, 0x52, 0x52, 0x0C, 0x00, 0x5C, 0x02, 0x52, 0x5C, 0x03, +/* 000057A0 */ 0x49, 0xEE, 0x04, 0x51, 0x51, 0x0B, 0x00, 0x96, 0x48, 0x51, 0x96, 0x49, 0x1B, 0x93, 0x0C, 0x51, +/* 000057B0 */ 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x52, 0x04, 0x00, 0x5C, 0x01, 0x52, +/* 000057C0 */ 0x93, 0x2A, 0x52, 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x49, 0x53, 0x08, 0x00, +/* 000057D0 */ 0x5C, 0x01, 0x53, 0xD4, 0x1A, 0x53, 0x5C, 0x02, 0x53, 0xEE, 0x03, 0x52, 0x52, 0x0E, 0x00, 0x5C, +/* 000057E0 */ 0x02, 0x52, 0x5C, 0x03, 0x49, 0xEE, 0x04, 0x51, 0x51, 0x0D, 0x00, 0x96, 0x4A, 0x51, 0x96, 0x4B, +/* 000057F0 */ 0x1C, 0x93, 0x0C, 0x51, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x20, 0x52, 0x04, +/* 00005800 */ 0x00, 0x5C, 0x01, 0x52, 0x93, 0x2A, 0x52, 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x93, +/* 00005810 */ 0x4B, 0x53, 0x09, 0x00, 0x5C, 0x01, 0x53, 0xD4, 0x1B, 0x53, 0x5C, 0x02, 0x53, 0xEE, 0x03, 0x52, +/* 00005820 */ 0x52, 0x10, 0x00, 0x5C, 0x02, 0x52, 0x5C, 0x03, 0x49, 0xEE, 0x04, 0x51, 0x51, 0x0F, 0x00, 0x54, +/* 00005830 */ 0x4A, 0x51, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, 0x46, 0x52, +/* 00005840 */ 0x0B, 0x00, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x1D, 0x11, 0x00, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, +/* 00005850 */ 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x1F, 0x52, 0x37, 0x5C, 0x03, 0x52, 0xEE, 0x04, +/* 00005860 */ 0xFF, 0x51, 0x11, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x93, +/* 00005870 */ 0x48, 0x52, 0x0C, 0x00, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x1D, 0x12, 0x00, 0xCC, 0x54, 0x00, 0x00, +/* 00005880 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x1F, 0x52, 0x37, 0x5C, 0x03, 0x52, +/* 00005890 */ 0xEE, 0x04, 0xFF, 0x51, 0x12, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 000058A0 */ 0x09, 0x93, 0x4A, 0x52, 0x0D, 0x00, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x1D, 0x13, 0x00, 0xCC, 0x60, +/* 000058B0 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x1F, 0x52, 0x37, 0x5C, +/* 000058C0 */ 0x03, 0x52, 0xEE, 0x04, 0xFF, 0x51, 0x13, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, +/* 000058D0 */ 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x4A, 0x5D, 0x02, 0x1D, 0x14, 0x00, 0xCC, 0x6C, 0x00, 0x00, 0x00, +/* 000058E0 */ 0x06, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x20, 0x52, 0x37, 0x5C, 0x03, 0x52, 0xEE, +/* 000058F0 */ 0x04, 0xFF, 0x51, 0x14, 0x00, 0x93, 0x0A, 0x51, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 00005900 */ 0xCC, 0x78, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x93, 0x0A, 0x53, +/* 00005910 */ 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xA4, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +/* 00005920 */ 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x23, 0x54, 0x38, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x16, +/* 00005930 */ 0x00, 0xEE, 0x03, 0x53, 0x53, 0x16, 0x00, 0x7B, 0x53, 0x52, 0x39, 0x93, 0x0A, 0x53, 0x01, 0x00, +/* 00005940 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x54, +/* 00005950 */ 0x00, 0x00, 0x00, 0x7B, 0x23, 0x54, 0x38, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x17, 0x00, 0xEE, +/* 00005960 */ 0x03, 0x53, 0x53, 0x17, 0x00, 0x7B, 0x53, 0x52, 0x3A, 0x93, 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, +/* 00005970 */ 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xBC, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, +/* 00005980 */ 0x00, 0x7B, 0x27, 0x54, 0x3B, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x18, 0x00, 0xEE, 0x03, 0x53, +/* 00005990 */ 0x53, 0x18, 0x00, 0x7B, 0x53, 0x52, 0x3C, 0x93, 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 000059A0 */ 0x00, 0x09, 0xCC, 0xC8, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, +/* 000059B0 */ 0x2A, 0x54, 0x3D, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x19, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x19, +/* 000059C0 */ 0x00, 0x7B, 0x53, 0x52, 0x3E, 0x93, 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 000059D0 */ 0xCC, 0xD4, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x2D, 0x54, +/* 000059E0 */ 0x3F, 0x7B, 0x2A, 0x54, 0x3D, 0x7B, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x1A, +/* 000059F0 */ 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1A, 0x00, 0x7B, 0x53, 0x52, 0x41, 0x93, 0x0A, 0x53, 0x01, 0x00, +/* 00005A00 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xE8, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x54, +/* 00005A10 */ 0x00, 0x00, 0x00, 0x7B, 0x2A, 0x54, 0x3D, 0x7B, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, 0x5D, 0x02, +/* 00005A20 */ 0x08, 0x1B, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1B, 0x00, 0x7B, 0x53, 0x52, 0x42, 0x93, 0x0A, 0x53, +/* 00005A30 */ 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xF8, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, +/* 00005A40 */ 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x2A, 0x54, 0x3D, 0x7B, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, +/* 00005A50 */ 0x5D, 0x02, 0x08, 0x1C, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1C, 0x00, 0x7B, 0x53, 0x52, 0x43, 0x93, +/* 00005A60 */ 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x08, 0x01, 0x00, 0x00, 0x0F, +/* 00005A70 */ 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x2E, 0x54, 0x40, 0x7B, 0x2F, 0x54, 0x44, 0x5C, +/* 00005A80 */ 0x01, 0x54, 0x5D, 0x02, 0x08, 0x1D, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1D, 0x00, 0x7B, 0x53, 0x52, +/* 00005A90 */ 0x45, 0x93, 0x0A, 0x53, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x01, 0x00, +/* 00005AA0 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7B, 0x2E, 0x54, 0x40, 0x7B, 0x2F, 0x54, +/* 00005AB0 */ 0x44, 0x5C, 0x01, 0x54, 0x5D, 0x02, 0x08, 0x1E, 0x00, 0xEE, 0x03, 0x53, 0x53, 0x1E, 0x00, 0x7B, +/* 00005AC0 */ 0x53, 0x52, 0x46, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x08, 0x15, 0x00, 0xEE, 0x03, 0x51, 0x51, 0x15, +/* 00005AD0 */ 0x00, 0x96, 0x35, 0x51, 0xD4, 0x1C, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x51, +/* 00005AE0 */ 0x51, 0x1F, 0x00, 0x96, 0x36, 0x51, 0xA8, 0x51, 0x96, 0x4C, 0x51, 0xD4, 0x1D, 0x51, 0x96, 0x37, +/* 00005AF0 */ 0x51, 0xD4, 0x1E, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x51, 0x51, 0x20, 0x00, +/* 00005B00 */ 0x47, 0x4B, 0x51, 0xD4, 0x1F, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, 0x51, 0x51, +/* 00005B10 */ 0x21, 0x00, 0x47, 0x4C, 0x51, 0xD4, 0x20, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0xEE, 0x01, +/* 00005B20 */ 0x51, 0x51, 0x22, 0x00, 0x47, 0x4D, 0x51, 0x93, 0x38, 0x51, 0x0E, 0x00, 0x14, 0x03, 0x00, 0x51, +/* 00005B30 */ 0x35, 0x09, 0xFC, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, +/* 00005B40 */ 0x4A, 0x00, 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x36, 0x23, 0x00, 0xCC, 0x28, 0x01, +/* 00005B50 */ 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x4B, 0x52, 0x37, 0x7B, 0x02, +/* 00005B60 */ 0x52, 0x47, 0x7B, 0x39, 0x52, 0x48, 0x7B, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0xEE, 0x04, 0xFF, +/* 00005B70 */ 0x51, 0x23, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x4A, +/* 00005B80 */ 0x00, 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x3B, 0x24, 0x00, 0xCC, 0x40, 0x01, 0x00, +/* 00005B90 */ 0x00, 0x12, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x4C, 0x52, 0x37, 0x7B, 0x02, 0x52, +/* 00005BA0 */ 0x47, 0x7B, 0x39, 0x52, 0x48, 0x7B, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0xEE, 0x04, 0xFF, 0x51, +/* 00005BB0 */ 0x24, 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x4A, 0x00, +/* 00005BC0 */ 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x3C, 0x25, 0x00, 0xCC, 0x58, 0x01, 0x00, 0x00, +/* 00005BD0 */ 0x13, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x4D, 0x52, 0x37, 0x7B, 0x02, 0x52, 0x47, +/* 00005BE0 */ 0x7B, 0x39, 0x52, 0x48, 0x7B, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0xEE, 0x04, 0xFF, 0x51, 0x25, +/* 00005BF0 */ 0x00, 0x93, 0x1B, 0x51, 0x0A, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6B, 0x4A, 0x00, 0x00, +/* 00005C00 */ 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5D, 0x02, 0x20, 0x26, 0x00, 0xCC, 0x70, 0x01, 0x00, 0x00, 0x14, +/* 00005C10 */ 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7B, 0x4A, 0x52, 0x37, 0x7B, 0x02, 0x52, 0x47, 0x7B, +/* 00005C20 */ 0x39, 0x52, 0x48, 0x7B, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0xEE, 0x04, 0xFF, 0x51, 0x26, 0x00, +/* 00005C30 */ 0xA8, 0x00, 0x24, 0x00, 0x15, 0xFE, 0x88, 0x01, 0x00, 0x70, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, +/* 00005C40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, +/* 00005C50 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00005C60 */ 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, +/* 00005C70 */ 0x00, 0x40, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005C80 */ 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, +/* 00005C90 */ 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, +/* 00005CA0 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x03, 0x02, 0x00, +/* 00005CB0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0x08, 0x01, 0x00, +/* 00005CC0 */ 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0E, 0x03, 0x00, +/* 00005CD0 */ 0x00, 0xF8, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, +/* 00005CE0 */ 0x00, 0x09, 0x03, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00005CF0 */ 0x00, 0x04, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, +/* 00005D00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, +/* 00005D10 */ 0x00, 0xC8, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, +/* 00005D20 */ 0x00, 0xBC, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, +/* 00005D30 */ 0x00, 0xB0, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, +/* 00005D40 */ 0x00, 0xA4, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, +/* 00005D50 */ 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x00, +/* 00005D60 */ 0x00, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, +/* 00005D70 */ 0x00, 0x0B, 0x03, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x00, 0x0F, 0x03, 0x00, +/* 00005D80 */ 0x00, 0x6C, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005D90 */ 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005DA0 */ 0x00, 0x54, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005DB0 */ 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 00005DC0 */ 0x00, 0x3C, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, +/* 00005DD0 */ 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x02, 0x00, +/* 00005DE0 */ 0x00, 0xEC, 0x02, 0x00, 0x00, 0xED, 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, +/* 00005DF0 */ 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, +/* 00005E00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, +/* 00005E10 */ 0x00, 0x25, 0x00, 0x00, 0x00, 0xDD, 0xFE, 0x17, 0x03, 0xFE, 0x18, 0x03, 0xF9, 0xFE, 0x18, 0x03, +/* 00005E20 */ 0xFE, 0x19, 0x03, 0xFE, 0x19, 0x03, 0xFE, 0xAC, 0x02, 0xFE, 0xAC, 0x02, 0xFE, 0x37, 0x02, 0xFE, +/* 00005E30 */ 0x38, 0x02, 0xFE, 0x3A, 0x02, 0x84, 0xFE, 0x35, 0x01, 0xFE, 0x5B, 0x01, 0xFE, 0x30, 0x01, 0xFE, +/* 00005E40 */ 0x7D, 0x01, 0x96, 0xA9, 0xF9, 0xFE, 0x0A, 0x02, 0xFE, 0x3C, 0x02, 0x17, 0xFE, 0x3D, 0x02, 0x1F, +/* 00005E50 */ 0xFE, 0x3E, 0x02, 0xFE, 0x21, 0x01, 0xFE, 0x3F, 0x02, 0x25, 0xFE, 0x41, 0x02, 0xFE, 0x42, 0x02, +/* 00005E60 */ 0xFE, 0x43, 0x02, 0xFE, 0x44, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x48, 0x02, 0xFE, 0x49, 0x02, 0xFE, +/* 00005E70 */ 0x4A, 0x02, 0xFE, 0x4B, 0x02, 0xFE, 0x4C, 0x02, 0xFE, 0x4D, 0x02, 0xFE, 0x4E, 0x02, 0xFE, 0x51, +/* 00005E80 */ 0x02, 0xFE, 0x52, 0x02, 0xFE, 0x53, 0x02, 0xFE, 0x54, 0x02, 0xFE, 0x55, 0x02, 0xFE, 0xEB, 0x02, +/* 00005E90 */ 0xFE, 0xEC, 0x02, 0xFE, 0xED, 0x02, 0xFE, 0xEE, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF0, 0x02, 0xFE, +/* 00005EA0 */ 0xF1, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xFD, 0x02, 0xFE, 0xFC, +/* 00005EB0 */ 0x02, 0xFE, 0xFF, 0x02, 0xFE, 0x01, 0x03, 0xFE, 0x00, 0x03, 0xFE, 0x04, 0x03, 0xFE, 0x03, 0x03, +/* 00005EC0 */ 0xFE, 0x07, 0x03, 0xFE, 0x09, 0x03, 0xFE, 0x06, 0x03, 0xFE, 0x0B, 0x03, 0xFE, 0x0C, 0x03, 0xFE, +/* 00005ED0 */ 0x0E, 0x03, 0xFE, 0x0D, 0x03, 0xFE, 0x0F, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, +/* 00005EE0 */ 0x01, 0xDD, 0xFE, 0x1A, 0x03, 0xFE, 0x1B, 0x03, 0xFE, 0x1C, 0x03, 0xFE, 0x1D, 0x03, 0xFE, 0x1E, +/* 00005EF0 */ 0x03, 0xFE, 0x1F, 0x03, 0xFE, 0x20, 0x03, 0xFE, 0x21, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x23, 0x03, +/* 00005F00 */ 0xFE, 0x24, 0x03, 0x84, 0xFE, 0x35, 0x01, 0xFE, 0x5B, 0x01, 0xFE, 0x30, 0x01, 0xFE, 0x7D, 0x01, +/* 00005F10 */ 0x96, 0xA9, 0xFE, 0x25, 0x03, 0xFA, 0xFE, 0x26, 0x03, 0xFE, 0x27, 0x03, 0xFE, 0x28, 0x03, 0xFE, +/* 00005F20 */ 0x29, 0x03, 0xFE, 0x2A, 0x03, 0xFE, 0x2B, 0x03, 0xFE, 0x2C, 0x03, 0xFE, 0x2D, 0x03, 0xFE, 0x2E, +/* 00005F30 */ 0x03, 0xFE, 0x2F, 0x03, 0xFE, 0x30, 0x03, 0xFE, 0x31, 0x03, 0xFE, 0x32, 0x03, 0xFE, 0x33, 0x03, +/* 00005F40 */ 0xFE, 0x34, 0x03, 0xFE, 0x35, 0x03, 0xE3, 0xE6, 0xFE, 0x36, 0x03, 0xFE, 0x37, 0x03, 0xFE, 0x38, +/* 00005F50 */ 0x03, 0xFE, 0x2C, 0x02, 0xFE, 0x2B, 0x02, 0xFE, 0x39, 0x03, 0xFE, 0x3A, 0x03, 0xFE, 0x3B, 0x03, +/* 00005F60 */ 0xFE, 0x3C, 0x03, 0xFE, 0x3D, 0x03, 0xFE, 0x3E, 0x03, 0xFE, 0x3F, 0x03, 0xFE, 0x7B, 0x02, 0xFE, +/* 00005F70 */ 0x40, 0x03, 0xFE, 0x41, 0x03, 0xFE, 0x42, 0x03, 0xFE, 0x43, 0x03, 0xFE, 0x44, 0x03, 0xFE, 0xE6, +/* 00005F80 */ 0x02, 0xFE, 0x45, 0x03, 0xFE, 0x46, 0x03, 0xFE, 0x47, 0x03, 0xFE, 0x48, 0x03, 0xFE, 0x49, 0x03, +/* 00005F90 */ 0xFE, 0x4A, 0x03, 0xFE, 0x4B, 0x03, 0xFE, 0x4C, 0x03, 0xFE, 0x4D, 0x03, 0xFE, 0x4E, 0x03, 0xFE, +/* 00005FA0 */ 0x4F, 0x03, 0xFE, 0x50, 0x03, 0xFE, 0x51, 0x03, 0xFE, 0x52, 0x03, 0xFE, 0x53, 0x03, 0xFE, 0x54, +/* 00005FB0 */ 0x03, 0xFE, 0x55, 0x03, 0xFE, 0x56, 0x03, 0xFE, 0xBB, 0x01, 0x5B, 0x97, 0x00, 0x00, 0x00, 0x07, +/* 00005FC0 */ 0x00, 0xA4, 0x00, 0x09, 0x00, 0x20, 0x00, 0x13, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x3B, 0x00, 0x13, +/* 00005FD0 */ 0x00, 0x39, 0x00, 0x1F, 0x00, 0xD4, 0x00, 0x14, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x45, 0x00, 0x03, +/* 00005FE0 */ 0x00, 0x35, 0x00, 0x0C, 0x00, 0x35, 0x00, 0x0C, 0x00, 0x39, 0x00, 0x0C, 0x00, 0x42, 0x00, 0x0C, +/* 00005FF0 */ 0x00, 0x24, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x0C, +/* 00006000 */ 0x00, 0x22, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x20, 0x00, 0x0C, 0x00, 0x1D, 0x00, 0x0C, +/* 00006010 */ 0x00, 0x2D, 0x00, 0x5D, 0x00, 0xC8, 0x00, 0x0C, 0x00, 0x54, 0x00, 0x0C, 0x00, 0x50, 0x00, 0x0C, +/* 00006020 */ 0x00, 0x5E, 0x00, 0x0C, 0x00, 0x02, 0x01, 0x0C, 0x00, 0x55, 0x00, 0x06, 0x00, 0x94, 0x00, 0x0C, +/* 00006030 */ 0x00, 0x4C, 0x00, 0x0C, 0x00, 0x4C, 0x00, 0x0C, 0x00, 0x46, 0x00, 0x0C, 0x00, 0x47, 0x00, 0x0C, +/* 00006040 */ 0x00, 0x4C, 0x00, 0x0C, 0x00, 0x4A, 0x00, 0x0C, 0x00, 0x3B, 0x00, 0x0C, 0x00, 0x4E, 0x00, 0x0C, +/* 00006050 */ 0x00, 0x56, 0x00, 0x0C, 0x00, 0x57, 0x00, 0x19, 0x00, 0x35, 0x00, 0x0C, 0x00, 0x3E, 0x00, 0x0C, +/* 00006060 */ 0x00, 0xA4, 0x00, 0x45, 0x00, 0x05, 0x01, 0x05, 0x00, 0x25, 0x00, 0x06, 0x00, 0xE9, 0x01, 0x06, +/* 00006070 */ 0x00, 0x0C, 0x02, 0x06, 0x00, 0x90, 0x01, 0x06, 0x00, 0x58, 0x01, 0x06, 0x00, 0x9A, 0x00, 0x06, +/* 00006080 */ 0x00, 0x70, 0x00, 0x06, 0x00, 0xA7, 0x04, 0x06, 0x00, 0x93, 0x04, 0x06, 0x00, 0x31, 0x04, 0x06, +/* 00006090 */ 0x00, 0xB1, 0x09, 0x06, 0x00, 0xEF, 0x02, 0x05, 0x00, 0x2D, 0x00, 0x06, 0x00, 0x93, 0x03, 0x12, +/* 000060A0 */ 0x00, 0x89, 0x0A, 0x05, 0x00, 0x75, 0x00, 0x05, 0x00, 0x38, 0x00, 0x05, 0x00, 0x4C, 0x00, 0x05, +/* 000060B0 */ 0x00, 0x83, 0x1C, 0x06, 0x00, 0xC0, 0x01, 0x06, 0x00, 0xDF, 0x01, 0x06, 0x00, 0x80, 0x03, 0x1E, +/* 000060C0 */ 0x00, 0x3C, 0x00, 0x49, 0x00, 0x25, 0x01, 0x03, 0x00, 0x51, 0x00, 0x41, 0x00, 0x69, 0x01, 0x03, +/* 000060D0 */ 0x00, 0x59, 0x00, 0x41, 0x00, 0x79, 0x01, 0x03, 0x00, 0x5D, 0x00, 0x41, 0x00, 0x81, 0x01, 0x03, +/* 000060E0 */ 0x00, 0x41, 0x00, 0x41, 0x00, 0xAD, 0x02, 0x32, 0x00, 0x60, 0x00, 0x32, 0x00, 0x64, 0x00, 0x32, +/* 000060F0 */ 0x00, 0x66, 0x00, 0x2D, 0x00, 0x49, 0x01, 0xDF, 0x01, 0x51, 0x05, 0x12, 0x00, 0xCA, 0x03, 0x05, +/* 00006100 */ 0x00, 0x2B, 0x00, 0x06, 0x00, 0x3B, 0x09, 0x12, 0x00, 0xE9, 0x2E, 0x12, 0x00, 0x16, 0x37, 0x12, +/* 00006110 */ 0x00, 0x4B, 0x7A, 0x0D, 0x00, 0x23, 0x00, 0x3F, 0x00, 0x96, 0x00, 0x3F, 0x00, 0x96, 0x00, 0x3F, +/* 00006120 */ 0x00, 0x96, 0x00, 0x41, 0x00, 0x94, 0x00, 0x00, 0xD3, 0xEB, 0x00, 0x00, 0x01, 0xEB, 0x00, 0x00, +/* 00006130 */ 0x58, 0xEA, 0x00, 0x00, 0x5D, 0xE9, 0x00, 0x00, 0xCC, 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, +/* 00006140 */ 0xFD, 0xE7, 0x00, 0x00, 0xE5, 0xE5, 0x00, 0x00, 0xFC, 0xE3, 0x00, 0x00, 0xA2, 0xE2, 0x00, 0x00, +/* 00006150 */ 0x95, 0xDE, 0x00, 0x00, 0x3D, 0xDD, 0x00, 0x00, 0xBA, 0xDB, 0x00, 0x00, 0x02, 0xD7, 0x00, 0x00, +/* 00006160 */ 0x21, 0xD5, 0x00, 0x00, 0xBD, 0xD3, 0x00, 0x00, 0x72, 0xD3, 0x00, 0x00, 0xBA, 0xCF, 0x00, 0x00, +/* 00006170 */ 0xF3, 0xCE, 0x00, 0x00, 0x1D, 0xCC, 0x00, 0x00, 0xAA, 0xC9, 0x00, 0x00, 0xA6, 0xC8, 0x00, 0x00, +/* 00006180 */ 0xA5, 0xC7, 0x00, 0x00, 0xD5, 0xC5, 0x00, 0x00, 0x59, 0xC5, 0x00, 0x00, 0xDD, 0xC4, 0x00, 0x00, +/* 00006190 */ 0x61, 0xC4, 0x00, 0x00, 0xF6, 0xC3, 0x00, 0x00, 0xDF, 0xC1, 0x00, 0x00, 0x94, 0xBE, 0x00, 0x00, +/* 000061A0 */ 0xEA, 0xA9, 0x00, 0x00, 0x39, 0x93, 0x00, 0x00, 0xAC, 0x61, 0x00, 0x00, 0x3F, 0x5D, 0x8C, 0xE0, +/* 000061B0 */ 0xA9, 0xD6, 0x92, 0xFE, 0xD1, 0x04, 0x1A, 0xA0, 0x41, 0xD1, 0x00, 0x3E, 0xFE, 0x0C, 0xE9, 0x0F, +/* 000061C0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x0C, 0xE9, 0xFE, 0xFA, 0x79, 0xFE, 0xFA, 0x79, +/* 000061D0 */ 0x01, 0x15, 0x36, 0x44, 0x09, 0xF0, 0xF0, 0x01, 0x0E, 0x02, 0x09, 0x19, 0x19, 0x19, 0x19, 0x07, +/* 000061E0 */ 0x02, 0x41, 0x42, 0x43, 0x44, 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xFB, 0x03, 0x06, 0xFE, 0xFC, +/* 000061F0 */ 0x03, 0x05, 0xFE, 0xFD, 0x03, 0x06, 0xFE, 0xFE, 0x03, 0x05, 0xFE, 0xFF, 0x03, 0x06, 0xFE, 0x00, +/* 00006200 */ 0x04, 0x05, 0xFE, 0x01, 0x04, 0x06, 0xFE, 0x02, 0x04, 0x05, 0xFE, 0x03, 0x04, 0x06, 0xFE, 0x04, +/* 00006210 */ 0x04, 0x05, 0xFE, 0x05, 0x04, 0x06, 0xFE, 0x06, 0x04, 0x05, 0xFE, 0x07, 0x04, 0x06, 0xFE, 0x08, +/* 00006220 */ 0x04, 0x05, 0xFE, 0x09, 0x04, 0x06, 0xFE, 0x0A, 0x04, 0x05, 0xFE, 0x0B, 0x04, 0x06, 0xFE, 0x0C, +/* 00006230 */ 0x04, 0x05, 0xFE, 0x0D, 0x04, 0x07, 0x06, 0xFE, 0x0E, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x0F, 0x04, +/* 00006240 */ 0x01, 0x01, 0x06, 0xFE, 0x10, 0x04, 0x01, 0x02, 0x08, 0x05, 0xFE, 0x11, 0x04, 0x05, 0xFE, 0x12, +/* 00006250 */ 0x04, 0x06, 0xFE, 0x13, 0x04, 0x05, 0xFE, 0x14, 0x04, 0x06, 0xFE, 0x15, 0x04, 0x05, 0xFE, 0x16, +/* 00006260 */ 0x04, 0x05, 0xFE, 0x17, 0x04, 0x05, 0xFE, 0x18, 0x04, 0x05, 0xFE, 0x19, 0x04, 0x05, 0xFE, 0x1A, +/* 00006270 */ 0x04, 0x05, 0xFE, 0xF4, 0x03, 0x06, 0xFE, 0xB4, 0x03, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, +/* 00006280 */ 0x03, 0x0C, 0x06, 0xFE, 0x13, 0x03, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0xB5, 0x03, 0x0B, 0x06, +/* 00006290 */ 0xFE, 0xEB, 0x03, 0x06, 0xFE, 0xB8, 0x03, 0x05, 0xFE, 0xEC, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, +/* 000062A0 */ 0xFE, 0xFA, 0x02, 0xFE, 0x27, 0x04, 0x4F, 0x40, 0xA8, 0x36, 0xA8, 0x37, 0xA8, 0x38, 0xA8, 0x39, +/* 000062B0 */ 0xA8, 0x3A, 0xA8, 0x3B, 0xA8, 0x3C, 0xA8, 0x3D, 0xA8, 0x3E, 0xA8, 0x3F, 0x8F, 0x01, 0x38, 0x46, +/* 000062C0 */ 0x00, 0x00, 0x14, 0x11, 0x00, 0x46, 0x02, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x38, 0x46, 0x00, 0x00, +/* 000062D0 */ 0x14, 0x03, 0x00, 0x46, 0x03, 0x09, 0xEC, 0x03, 0xDE, 0x00, 0x0B, 0x01, 0xB8, 0x46, 0x00, 0x01, +/* 000062E0 */ 0x51, 0x01, 0x00, 0x36, 0x46, 0x95, 0x00, 0x02, 0x36, 0x01, 0x51, 0x01, 0x01, 0x37, 0x46, 0x95, +/* 000062F0 */ 0x00, 0x03, 0x37, 0x01, 0x51, 0x01, 0x02, 0x38, 0x46, 0x95, 0x00, 0x04, 0x38, 0x01, 0x51, 0x01, +/* 00006300 */ 0x03, 0x39, 0x46, 0x95, 0x00, 0x05, 0x39, 0x01, 0x51, 0x01, 0x04, 0x3A, 0x46, 0x95, 0x00, 0x06, +/* 00006310 */ 0x3A, 0x01, 0x51, 0x01, 0x05, 0x3B, 0x46, 0x95, 0x00, 0x07, 0x3B, 0x01, 0x51, 0x01, 0x06, 0x3C, +/* 00006320 */ 0x46, 0x95, 0x00, 0x08, 0x3C, 0x01, 0x51, 0x01, 0x07, 0x3D, 0x46, 0x95, 0x00, 0x09, 0x3D, 0x4F, +/* 00006330 */ 0x46, 0x95, 0x00, 0x0A, 0x46, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, +/* 00006340 */ 0x00, 0x00, 0x7B, 0x05, 0x46, 0x00, 0x7B, 0x07, 0x46, 0x01, 0x7B, 0x09, 0x46, 0x02, 0x7B, 0x0B, +/* 00006350 */ 0x46, 0x03, 0x7B, 0x0D, 0x46, 0x04, 0x7B, 0x0F, 0x46, 0x05, 0x7B, 0x11, 0x46, 0x06, 0x7B, 0x13, +/* 00006360 */ 0x46, 0x07, 0x7B, 0x15, 0x46, 0x08, 0x96, 0x02, 0x46, 0xCE, 0x46, 0x03, 0x00, 0x00, 0xA8, 0x47, +/* 00006370 */ 0xA1, 0x00, 0x47, 0x46, 0xA8, 0x47, 0xA1, 0x01, 0x47, 0x46, 0xA8, 0x47, 0xA1, 0x02, 0x47, 0x46, +/* 00006380 */ 0x95, 0x00, 0x0A, 0x46, 0x8F, 0x01, 0x0A, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, +/* 00006390 */ 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7B, 0x18, 0x47, +/* 000063A0 */ 0x09, 0x7B, 0x1A, 0x47, 0x0A, 0x7B, 0x1C, 0x47, 0x0B, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x16, 0x00, +/* 000063B0 */ 0x00, 0xEE, 0x03, 0x46, 0x46, 0x00, 0x00, 0x54, 0x40, 0x46, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, +/* 000063C0 */ 0x08, 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x1E, 0x01, 0x00, 0x5D, 0x02, +/* 000063D0 */ 0x1F, 0x01, 0x00, 0x5D, 0x03, 0x20, 0x01, 0x00, 0x62, 0x47, 0x40, 0x0C, 0x5C, 0x04, 0x47, 0x8F, +/* 000063E0 */ 0x01, 0x3B, 0x47, 0x02, 0x00, 0x4B, 0x47, 0x62, 0x47, 0x47, 0x0D, 0x5C, 0x05, 0x47, 0xEE, 0x06, +/* 000063F0 */ 0xFF, 0x46, 0x01, 0x00, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, 0x09, 0x46, 0x47, 0x07, 0x06, 0x00, +/* 00006400 */ 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x21, 0x02, 0x00, 0x5D, 0x02, 0x22, 0x02, 0x00, 0x5D, 0x03, 0x22, +/* 00006410 */ 0x02, 0x00, 0x62, 0x47, 0x40, 0x0E, 0x5C, 0x04, 0x47, 0x8F, 0x01, 0x3B, 0x47, 0x02, 0x00, 0x4B, +/* 00006420 */ 0x47, 0x62, 0x47, 0x47, 0x0F, 0x5C, 0x05, 0x47, 0xEE, 0x06, 0xFF, 0x46, 0x02, 0x00, 0xB8, 0x47, +/* 00006430 */ 0x00, 0x01, 0x51, 0x01, 0x0A, 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x23, +/* 00006440 */ 0x03, 0x00, 0x5D, 0x02, 0x24, 0x03, 0x00, 0x5D, 0x03, 0x24, 0x03, 0x00, 0x62, 0x47, 0x40, 0x10, +/* 00006450 */ 0x5C, 0x04, 0x47, 0x8F, 0x01, 0x3B, 0x47, 0x02, 0x00, 0x4B, 0x47, 0x62, 0x47, 0x47, 0x11, 0x5C, +/* 00006460 */ 0x05, 0x47, 0xEE, 0x06, 0xFF, 0x46, 0x03, 0x00, 0x8F, 0x01, 0x38, 0x46, 0x00, 0x00, 0x14, 0x03, +/* 00006470 */ 0x00, 0x46, 0x02, 0x09, 0x4E, 0x02, 0xDE, 0x01, 0x04, 0x03, 0xB8, 0x46, 0x00, 0xB7, 0x01, 0x00, +/* 00006480 */ 0x00, 0x00, 0x46, 0x46, 0x01, 0x51, 0x01, 0x0B, 0x3E, 0x46, 0x95, 0x01, 0x02, 0x3E, 0x01, 0x51, +/* 00006490 */ 0x01, 0x0C, 0x3F, 0x46, 0x95, 0x01, 0x03, 0x3F, 0x8F, 0x01, 0x2A, 0x46, 0x03, 0x00, 0x07, 0x03, +/* 000064A0 */ 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x25, 0x04, 0x00, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, 0x5C, +/* 000064B0 */ 0x02, 0x47, 0xEE, 0x03, 0xFF, 0x46, 0x04, 0x00, 0x8F, 0x01, 0x2A, 0x46, 0x03, 0x00, 0x07, 0x03, +/* 000064C0 */ 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x26, 0x05, 0x00, 0x91, 0x01, 0x03, 0x47, 0x05, 0x00, 0x5C, +/* 000064D0 */ 0x02, 0x47, 0xEE, 0x03, 0xFF, 0x46, 0x05, 0x00, 0x91, 0x01, 0x02, 0x46, 0x04, 0x00, 0xCE, 0x47, +/* 000064E0 */ 0x02, 0x01, 0x00, 0xA1, 0x00, 0x27, 0x47, 0xA1, 0x01, 0x28, 0x47, 0x77, 0x47, 0x46, 0x12, 0x8F, +/* 000064F0 */ 0x01, 0x1B, 0x46, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, +/* 00006500 */ 0x00, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x29, 0x06, 0x00, 0xCC, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 00006510 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x48, 0x04, 0x00, 0x07, 0x01, 0x00, 0xC3, +/* 00006520 */ 0x01, 0x48, 0x48, 0x07, 0x00, 0x7B, 0x48, 0x47, 0x13, 0x7B, 0x2C, 0x47, 0x14, 0x7B, 0x2C, 0x47, +/* 00006530 */ 0x15, 0x7B, 0x2C, 0x47, 0x16, 0x5C, 0x03, 0x47, 0xEE, 0x04, 0xFF, 0x46, 0x06, 0x00, 0x8F, 0x01, +/* 00006540 */ 0x0A, 0x46, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, +/* 00006550 */ 0x62, 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x8F, 0x01, 0x0E, 0x47, 0x07, 0x00, 0x62, 0x47, 0x47, +/* 00006560 */ 0x17, 0x5C, 0x02, 0x47, 0xEE, 0x03, 0xFF, 0x46, 0x08, 0x00, 0x8F, 0x01, 0x1B, 0x46, 0x06, 0x00, +/* 00006570 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, 0x62, 0x47, 0x47, 0x17, +/* 00006580 */ 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x2F, 0x09, 0x00, 0xCC, 0x58, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +/* 00006590 */ 0x00, 0x47, 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x48, 0x04, 0x00, 0x7B, 0x48, 0x47, 0x13, 0x7B, +/* 000065A0 */ 0x30, 0x47, 0x14, 0x7B, 0x2C, 0x47, 0x15, 0x7B, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0xEE, 0x04, +/* 000065B0 */ 0xFF, 0x46, 0x09, 0x00, 0x8F, 0x01, 0x1B, 0x46, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, +/* 000065C0 */ 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, 0x62, 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x31, +/* 000065D0 */ 0x0A, 0x00, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x8F, +/* 000065E0 */ 0x01, 0x2A, 0x48, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x5D, 0x01, 0x33, 0x0B, 0x00, +/* 000065F0 */ 0xB8, 0x4A, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x4A, 0x4A, 0x01, 0x51, 0x01, 0x0D, 0x49, 0x4A, +/* 00006600 */ 0x5C, 0x02, 0x49, 0xEE, 0x03, 0x48, 0x48, 0x0B, 0x00, 0x7B, 0x48, 0x47, 0x18, 0x7B, 0x2C, 0x47, +/* 00006610 */ 0x15, 0x7B, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0xEE, 0x04, 0xFF, 0x46, 0x0A, 0x00, 0x8F, 0x01, +/* 00006620 */ 0x1B, 0x46, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, +/* 00006630 */ 0x62, 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x34, 0x0C, 0x00, 0xCC, 0x84, 0x00, 0x00, +/* 00006640 */ 0x00, 0x05, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0xB8, 0x49, 0x00, 0xB7, 0x01, 0x00, 0x00, +/* 00006650 */ 0x00, 0x49, 0x49, 0x01, 0x51, 0x01, 0x0E, 0x48, 0x49, 0x7B, 0x48, 0x47, 0x13, 0x01, 0x65, 0x01, +/* 00006660 */ 0x48, 0x47, 0x7B, 0x30, 0x47, 0x14, 0x7B, 0x2C, 0x47, 0x15, 0x7B, 0x30, 0x47, 0x16, 0x5C, 0x03, +/* 00006670 */ 0x47, 0xEE, 0x04, 0xFF, 0x46, 0x0C, 0x00, 0x8F, 0x01, 0x1B, 0x46, 0x06, 0x00, 0x07, 0x04, 0x00, +/* 00006680 */ 0x5C, 0x00, 0x1D, 0x91, 0x01, 0x02, 0x47, 0x04, 0x00, 0x5C, 0x01, 0x47, 0x5D, 0x02, 0x35, 0x0D, +/* 00006690 */ 0x00, 0xCC, 0x9C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x8F, 0x01, +/* 000066A0 */ 0x4A, 0x48, 0x08, 0x00, 0x4B, 0x48, 0x7B, 0x48, 0x47, 0x13, 0x7B, 0x30, 0x47, 0x14, 0x7B, 0x30, +/* 000066B0 */ 0x47, 0x16, 0x5C, 0x03, 0x47, 0xEE, 0x04, 0xFF, 0x46, 0x0D, 0x00, 0x91, 0x01, 0x02, 0x00, 0x04, +/* 000066C0 */ 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x07, 0xB0, 0x00, +/* 000066D0 */ 0x9C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, +/* 000066E0 */ 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 000066F0 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 00006700 */ 0xB4, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00006710 */ 0xB7, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, +/* 00006720 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, +/* 00006730 */ 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 00006740 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 00006750 */ 0xB4, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00006760 */ 0x93, 0x01, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00006770 */ 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, +/* 00006780 */ 0x00, 0x04, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, +/* 00006790 */ 0x08, 0x04, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x00, 0xFE, 0xFC, 0x03, 0xFE, +/* 000067A0 */ 0xFE, 0x03, 0xFE, 0x00, 0x04, 0xFE, 0x02, 0x04, 0xFE, 0x04, 0x04, 0xFE, 0x06, 0x04, 0xFE, 0x08, +/* 000067B0 */ 0x04, 0xFE, 0x0A, 0x04, 0xFE, 0x0C, 0x04, 0xFE, 0x93, 0x01, 0xFE, 0x91, 0x01, 0xFE, 0x94, 0x01, +/* 000067C0 */ 0xFE, 0x93, 0x01, 0xFE, 0xEC, 0x02, 0xFE, 0x91, 0x01, 0xFE, 0xED, 0x02, 0xFE, 0x94, 0x01, 0xFE, +/* 000067D0 */ 0xEE, 0x02, 0xFE, 0x96, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, +/* 000067E0 */ 0x01, 0xFE, 0x48, 0x01, 0xFE, 0xB7, 0x01, 0xFE, 0x1B, 0x04, 0x02, 0x01, 0x09, 0x00, 0xFE, 0x1C, +/* 000067F0 */ 0x04, 0x01, 0xFE, 0x1D, 0x04, 0x02, 0xFE, 0x1E, 0x04, 0x03, 0xFE, 0x1F, 0x04, 0x04, 0xFE, 0x20, +/* 00006800 */ 0x04, 0x05, 0xFE, 0x21, 0x04, 0x06, 0xFE, 0x22, 0x04, 0x07, 0xFE, 0x23, 0x04, 0x08, 0xFE, 0x24, +/* 00006810 */ 0x04, 0x03, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x23, 0xE9, 0x14, 0x16, +/* 00006820 */ 0x00, 0x00, 0x00, 0x79, 0x00, 0x9A, 0x13, 0x34, 0x00, 0xDA, 0x36, 0x1B, 0x00, 0x5E, 0x00, 0x36, +/* 00006830 */ 0x00, 0xFC, 0x0F, 0x3A, 0x00, 0x42, 0x02, 0x3A, 0x00, 0x54, 0x02, 0x3A, 0x00, 0x53, 0x02, 0x30, +/* 00006840 */ 0x00, 0x62, 0x04, 0x20, 0x00, 0x59, 0x04, 0x20, 0x00, 0x54, 0x00, 0x17, 0x00, 0x48, 0x00, 0x4F, +/* 00006850 */ 0x00, 0x9D, 0x00, 0x2C, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0xA2, 0x00, 0x6A, 0x00, 0x22, 0x03, 0x59, +/* 00006860 */ 0x00, 0xEC, 0x08, 0x44, 0x00, 0x9F, 0x00, 0x09, 0x00, 0x88, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, +/* 00006870 */ 0x31, 0x8F, 0x00, 0x00, 0x45, 0x8A, 0x00, 0x00, 0xC9, 0x89, 0x00, 0x00, 0xDF, 0x87, 0x00, 0x00, +/* 00006880 */ 0x2C, 0x86, 0x00, 0x00, 0x11, 0x82, 0x00, 0x00, 0x01, 0x79, 0x00, 0x00, 0x33, 0x76, 0x00, 0x00, +/* 00006890 */ 0xCD, 0x74, 0x00, 0x00, 0x67, 0x73, 0x00, 0x00, 0x01, 0x72, 0x00, 0x00, 0xEC, 0x6F, 0x00, 0x00, +/* 000068A0 */ 0xE6, 0x6D, 0x00, 0x00, 0xDC, 0x6C, 0x00, 0x00, 0xAC, 0x68, 0x00, 0x00, 0x3F, 0x5D, 0x84, 0xE0, +/* 000068B0 */ 0x89, 0xC6, 0x12, 0xFE, 0xCE, 0x06, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x51, 0xFF, +/* 000068C0 */ 0x3B, 0x59, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x3B, 0x59, 0x01, +/* 000068D0 */ 0x00, 0xFE, 0x30, 0x08, 0xFE, 0x30, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, 0x04, 0x08, +/* 000068E0 */ 0x09, 0x20, 0x20, 0x20, 0x20, 0x01, 0x16, 0x17, 0x18, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x62, +/* 000068F0 */ 0x04, 0x06, 0xFE, 0x16, 0x03, 0x06, 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0x63, 0x04, 0x06, 0xFE, 0xE1, +/* 00006900 */ 0x03, 0x06, 0xFE, 0x50, 0x04, 0x06, 0xFE, 0x54, 0x04, 0x06, 0xFE, 0x51, 0x04, 0x06, 0xFE, 0x52, +/* 00006910 */ 0x04, 0x06, 0xFE, 0x25, 0x04, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, +/* 00006920 */ 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x06, 0xFE, 0x53, 0x04, 0x07, 0x08, 0xFE, +/* 00006930 */ 0x0A, 0x02, 0x5B, 0x15, 0xB4, 0x15, 0x15, 0x2C, 0x19, 0x15, 0x15, 0x03, 0x00, 0x19, 0x02, 0x09, +/* 00006940 */ 0x24, 0x00, 0x8F, 0x04, 0x09, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00006950 */ 0x00, 0x1A, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x19, +/* 00006960 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x01, +/* 00006970 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x15, 0xF2, 0x02, 0x19, 0x19, 0x01, 0x00, 0x00, +/* 00006980 */ 0x00, 0x01, 0x00, 0x96, 0x02, 0x19, 0x93, 0x02, 0x19, 0x01, 0x00, 0xA8, 0x1A, 0x14, 0x13, 0x00, +/* 00006990 */ 0x19, 0x1A, 0x09, 0x00, 0x00, 0x93, 0x02, 0x19, 0x01, 0x00, 0x62, 0x19, 0x19, 0x02, 0x0F, 0x27, +/* 000069A0 */ 0x00, 0x19, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, +/* 000069B0 */ 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, +/* 000069C0 */ 0x03, 0xFF, 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x04, 0x0A, 0x19, 0x02, 0x00, 0x07, +/* 000069D0 */ 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, +/* 000069E0 */ 0x00, 0x00, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x03, 0x7B, 0x1B, 0x1A, 0x04, 0x93, +/* 000069F0 */ 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x05, 0x7B, 0x1B, 0x1A, 0x06, 0x93, 0x02, 0x1B, 0x01, +/* 00006A00 */ 0x00, 0x62, 0x1B, 0x1B, 0x07, 0x7B, 0x1B, 0x1A, 0x08, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, +/* 00006A10 */ 0x1B, 0x09, 0x7B, 0x1B, 0x1A, 0x0A, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x0B, 0x7B, +/* 00006A20 */ 0x1B, 0x1A, 0x0C, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x0D, 0x7B, 0x1B, 0x1A, 0x0E, +/* 00006A30 */ 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x0F, 0x7B, 0x1B, 0x1A, 0x10, 0x93, 0x02, 0x1B, +/* 00006A40 */ 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x11, 0x7B, 0x1B, 0x1A, 0x12, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, +/* 00006A50 */ 0x1B, 0x1B, 0x13, 0x7B, 0x1B, 0x1A, 0x14, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x15, +/* 00006A60 */ 0x7B, 0x1B, 0x1A, 0x16, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x17, 0x7B, 0x1B, 0x1A, +/* 00006A70 */ 0x18, 0x93, 0x02, 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x19, 0x7B, 0x1B, 0x1A, 0x1A, 0x93, 0x02, +/* 00006A80 */ 0x1B, 0x01, 0x00, 0x62, 0x1B, 0x1B, 0x1B, 0x7B, 0x1B, 0x1A, 0x1C, 0x93, 0x02, 0x1B, 0x01, 0x00, +/* 00006A90 */ 0x62, 0x1B, 0x1B, 0x1D, 0x7B, 0x1B, 0x1A, 0x1E, 0x5C, 0x01, 0x1A, 0x5D, 0x02, 0x13, 0x03, 0x00, +/* 00006AA0 */ 0xEE, 0x03, 0x19, 0x19, 0x03, 0x00, 0x96, 0x03, 0x19, 0x8F, 0x04, 0x0A, 0x19, 0x02, 0x00, 0x07, +/* 00006AB0 */ 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCB, 0x1A, 0x5C, 0x01, 0x1A, 0x5D, 0x02, 0x13, 0x04, 0x00, 0xEE, +/* 00006AC0 */ 0x03, 0x19, 0x19, 0x04, 0x00, 0x96, 0x04, 0x19, 0x8F, 0x04, 0x0C, 0x19, 0x03, 0x00, 0x07, 0x05, +/* 00006AD0 */ 0x00, 0x5C, 0x00, 0x14, 0x8F, 0x04, 0x1C, 0x1A, 0x04, 0x00, 0x5C, 0x01, 0x1A, 0x8F, 0x04, 0x18, +/* 00006AE0 */ 0x1A, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x14, 0x93, 0x03, 0x1B, 0x06, 0x00, 0x5C, 0x01, +/* 00006AF0 */ 0x1B, 0xEE, 0x02, 0x1A, 0x1A, 0x06, 0x00, 0x5C, 0x02, 0x1A, 0xD4, 0x00, 0x1A, 0x5C, 0x03, 0x1A, +/* 00006B00 */ 0x93, 0x02, 0x1A, 0x01, 0x00, 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0xFF, 0x19, 0x05, 0x00, 0x8F, 0x04, +/* 00006B10 */ 0x0A, 0x19, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0x93, 0x04, 0x1A, 0x07, 0x00, 0x5C, +/* 00006B20 */ 0x01, 0x1A, 0x8F, 0x04, 0x0E, 0x1A, 0x08, 0x00, 0x62, 0x1A, 0x1A, 0x1F, 0x5C, 0x02, 0x1A, 0xEE, +/* 00006B30 */ 0x03, 0x00, 0x19, 0x07, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x40, 0x00, 0x00, +/* 00006B40 */ 0x00, 0x00, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x95, +/* 00006B50 */ 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x87, 0x02, 0x00, 0x00, 0x7D, +/* 00006B60 */ 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x80, +/* 00006B70 */ 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x86, +/* 00006B80 */ 0x02, 0x00, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x19, 0x02, 0xFE, +/* 00006B90 */ 0x21, 0x02, 0xFE, 0x94, 0x02, 0xFE, 0x95, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x97, 0x02, 0xFE, 0x90, +/* 00006BA0 */ 0x02, 0xFE, 0x85, 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x7D, 0x02, +/* 00006BB0 */ 0xFE, 0x8F, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x8A, 0x02, 0xFE, +/* 00006BC0 */ 0x7F, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x8C, +/* 00006BD0 */ 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x91, 0x02, 0xFE, 0x86, 0x02, +/* 00006BE0 */ 0xFE, 0x48, 0x01, 0xFE, 0xF9, 0x03, 0xFE, 0x64, 0x04, 0xFE, 0xFD, 0x01, 0xFF, 0x70, 0x59, 0x01, +/* 00006BF0 */ 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x90, 0x00, 0x20, 0x00, +/* 00006C00 */ 0x4B, 0x00, 0x1F, 0x00, 0x6B, 0x00, 0x24, 0x00, 0x90, 0x00, 0xE0, 0x00, 0xCE, 0x03, 0x1F, 0x00, +/* 00006C10 */ 0x3E, 0x00, 0x46, 0x00, 0x98, 0x01, 0x2C, 0x00, 0x44, 0x00, 0x00, 0x1F, 0x6C, 0x00, 0x00, 0xBF, +/* 00006C20 */ 0x5C, 0x87, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xE7, 0x06, 0x60, 0xA2, 0x41, 0xD1, 0x00, 0x52, 0xFF, +/* 00006C30 */ 0xD6, 0x5F, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0xD6, 0x5F, 0x01, 0x00, +/* 00006C40 */ 0xFE, 0x27, 0x01, 0xFE, 0x27, 0x01, 0x41, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x02, 0x01, +/* 00006C50 */ 0x01, 0x05, 0x06, 0x06, 0xFE, 0x50, 0x04, 0x05, 0xFE, 0xFA, 0x03, 0x08, 0x6C, 0x8F, 0x01, 0x03, +/* 00006C60 */ 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x08, 0x15, 0x0B, 0x00, 0x07, 0x08, +/* 00006C70 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x4A, 0x00, 0x8F, 0x05, 0x0C, 0x07, 0x01, +/* 00006C80 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x05, 0x19, 0x08, 0x02, 0x00, 0x5C, 0x01, 0x08, +/* 00006C90 */ 0x8F, 0x01, 0x02, 0x08, 0x03, 0x00, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x03, 0x05, 0x5C, 0x03, 0x08, +/* 00006CA0 */ 0xEE, 0x04, 0x07, 0x07, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x18, 0x00, 0x8F, 0x01, 0x04, +/* 00006CB0 */ 0x07, 0x04, 0x00, 0x8F, 0x01, 0x03, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x05, 0x01, 0x00, 0x9D, +/* 00006CC0 */ 0x08, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFF, 0x04, 0x60, 0x01, 0x00, 0x03, 0x00, +/* 00006CD0 */ 0x00, 0x00, 0x00, 0x50, 0x00, 0xA6, 0x00, 0x1A, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, +/* 00006CE0 */ 0x01, 0xC4, 0x00, 0xFE, 0xBF, 0x06, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x50, 0xFF, 0x2E, 0x56, 0x01, +/* 00006CF0 */ 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x2E, 0x56, 0x01, 0x00, 0xFE, 0x60, 0x02, +/* 00006D00 */ 0xFE, 0x60, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, +/* 00006D10 */ 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x61, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x98, 0x5B, +/* 00006D20 */ 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x24, 0x00, 0x8F, +/* 00006D30 */ 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, +/* 00006D40 */ 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, +/* 00006D50 */ 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, +/* 00006D60 */ 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +/* 00006D70 */ 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, +/* 00006D80 */ 0x02, 0x0F, 0x27, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, +/* 00006D90 */ 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, +/* 00006DA0 */ 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, +/* 00006DB0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, +/* 00006DC0 */ 0xFE, 0x7A, 0x02, 0xFF, 0x54, 0x56, 0x01, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, +/* 00006DD0 */ 0x00, 0x24, 0x00, 0x88, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x6B, 0x00, 0x24, 0x00, 0x88, +/* 00006DE0 */ 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xA0, 0x06, +/* 00006DF0 */ 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0xEB, 0x03, 0x4F, 0xFF, 0x87, 0x4F, 0x01, 0x00, 0xFF, 0x00, +/* 00006E00 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0x87, 0x4F, 0x01, 0x00, 0xFE, 0xFD, 0x03, 0xFE, 0xFD, 0x03, +/* 00006E10 */ 0x01, 0x08, 0x06, 0x0B, 0x07, 0x5A, 0x56, 0x04, 0x0A, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0A, 0x06, +/* 00006E20 */ 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x61, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x08, 0xFE, 0x70, 0x01, 0x5B, +/* 00006E30 */ 0x07, 0xB4, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x2C, 0x0B, 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, +/* 00006E40 */ 0x09, 0x24, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, +/* 00006E50 */ 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, +/* 00006E60 */ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, +/* 00006E70 */ 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, +/* 00006E80 */ 0x00, 0x00, 0x01, 0x00, 0x47, 0x08, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x08, 0x0B, 0x09, 0x00, +/* 00006E90 */ 0x00, 0x62, 0x0B, 0x08, 0x02, 0x0F, 0x27, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, +/* 00006EA0 */ 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, +/* 00006EB0 */ 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 00006EC0 */ 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x06, 0x0B, 0x09, 0x52, 0x00, 0x8F, 0x04, 0x27, 0x0B, 0x01, 0x00, +/* 00006ED0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x0F, +/* 00006EE0 */ 0x1F, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x26, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 00006EF0 */ 0x00, 0x05, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0B, 0x0B, 0x04, 0x00, 0x0F, 0x1D, 0x00, 0x0B, 0x09, +/* 00006F00 */ 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x03, 0x07, 0x01, 0x00, 0x5C, +/* 00006F10 */ 0x00, 0x0C, 0xF2, 0x01, 0xFF, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0xA8, 0x0B, 0x47, 0x09, +/* 00006F20 */ 0x0B, 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x06, 0x0B, 0x09, 0x23, 0x00, 0x8F, 0x04, 0x31, 0x0C, 0x03, +/* 00006F30 */ 0x00, 0x6D, 0x0B, 0x0C, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0xF2, 0x02, +/* 00006F40 */ 0x0B, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x47, 0x09, 0x0B, 0x09, 0x15, 0x00, 0x8F, 0x04, +/* 00006F50 */ 0x22, 0x0B, 0x04, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x05, 0xEE, 0x01, 0x0B, 0x0B, 0x07, 0x00, +/* 00006F60 */ 0x47, 0x09, 0x0B, 0x8F, 0x04, 0x11, 0x0B, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, +/* 00006F70 */ 0x04, 0x09, 0x0D, 0x00, 0x00, 0x6D, 0x0C, 0x0D, 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0D, 0x5C, +/* 00006F80 */ 0x01, 0x09, 0x5C, 0x02, 0x08, 0xF2, 0x03, 0x0C, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0x5C, +/* 00006F90 */ 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x08, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 00006FA0 */ 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x33, +/* 00006FB0 */ 0x02, 0xFF, 0xB3, 0x4F, 0x01, 0x00, 0x0D, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x24, +/* 00006FC0 */ 0x00, 0x7F, 0x00, 0x20, 0x00, 0x47, 0x00, 0x15, 0x00, 0x67, 0x00, 0x24, 0x00, 0x80, 0x00, 0x42, +/* 00006FD0 */ 0x00, 0x56, 0x00, 0x1A, 0x00, 0x48, 0x00, 0x05, 0x00, 0x2F, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x23, +/* 00006FE0 */ 0x00, 0x59, 0x00, 0x15, 0x00, 0x42, 0x00, 0x3A, 0x00, 0x51, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, +/* 00006FF0 */ 0x01, 0xC4, 0x00, 0xFE, 0x85, 0x06, 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x16, 0x03, 0x4E, 0xFF, +/* 00007000 */ 0x05, 0x4B, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x05, 0x4B, 0x01, 0x00, +/* 00007010 */ 0xFE, 0x26, 0x04, 0xFE, 0x26, 0x04, 0x01, 0x09, 0x05, 0x0B, 0x05, 0x62, 0x5B, 0x04, 0x09, 0x09, +/* 00007020 */ 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x16, 0x03, 0x07, 0xFE, 0x79, 0x01, 0x5B, 0x07, +/* 00007030 */ 0xB4, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, 0x05, 0x02, 0xA8, 0x0B, 0x47, 0x05, +/* 00007040 */ 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x6B, +/* 00007050 */ 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, +/* 00007060 */ 0x03, 0x00, 0x07, 0x0B, 0x09, 0x1A, 0x00, 0x8F, 0x01, 0x02, 0x0B, 0x00, 0x00, 0x4B, 0x0B, 0x07, +/* 00007070 */ 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC3, 0x03, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x24, +/* 00007080 */ 0x01, 0x8F, 0x04, 0x31, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00007090 */ 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x08, +/* 000070A0 */ 0x0B, 0x8F, 0x04, 0x17, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, +/* 000070B0 */ 0xEE, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x0F, 0x22, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, +/* 000070C0 */ 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, +/* 000070D0 */ 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x09, 0x0C, +/* 000070E0 */ 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, +/* 000070F0 */ 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x03, +/* 00007100 */ 0x00, 0x09, 0x0B, 0x09, 0x3F, 0x00, 0x8F, 0x04, 0x0A, 0x0B, 0x04, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00007110 */ 0x00, 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x04, 0x05, 0x00, 0xEE, 0x03, 0x0B, 0x0B, +/* 00007120 */ 0x05, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x04, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x03, 0x07, +/* 00007130 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xF2, 0x03, 0xFF, 0x0B, 0x03, +/* 00007140 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x8F, 0x02, 0x08, 0x0B, 0x05, 0x00, 0x4B, 0x0B, 0x07, 0x04, 0x00, +/* 00007150 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, 0xEE, 0x04, 0xFF, 0x0B, +/* 00007160 */ 0x07, 0x00, 0x47, 0x0B, 0x09, 0x8F, 0x04, 0x0C, 0x0C, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00007170 */ 0x02, 0x8F, 0x04, 0x20, 0x0D, 0x07, 0x00, 0x5C, 0x01, 0x0D, 0x8F, 0x01, 0x03, 0x0D, 0x08, 0x00, +/* 00007180 */ 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, 0xEE, 0x04, 0x0C, 0x0C, 0x08, 0x00, 0x77, 0x0C, +/* 00007190 */ 0x0B, 0x04, 0x62, 0x0B, 0x09, 0x05, 0x82, 0x0B, 0x0B, 0x2B, 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, +/* 000071A0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, +/* 000071B0 */ 0xFE, 0x36, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x7A, 0x02, 0xDD, 0xFF, 0x1D, 0x4B, 0x01, 0x00, 0x10, +/* 000071C0 */ 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x18, 0x00, 0x43, 0x00, +/* 000071D0 */ 0x1A, 0x00, 0x58, 0x00, 0x20, 0x00, 0x37, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x9D, 0x00, +/* 000071E0 */ 0x20, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x58, 0x00, +/* 000071F0 */ 0x1D, 0x00, 0x4F, 0x00, 0x30, 0x00, 0x66, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, +/* 00007200 */ 0x00, 0xBF, 0x5D, 0x84, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x7E, 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, +/* 00007210 */ 0x4C, 0xFF, 0x87, 0x48, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFF, 0x87, +/* 00007220 */ 0x48, 0x01, 0x00, 0xFE, 0x9F, 0x01, 0xFE, 0x9F, 0x01, 0x40, 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, +/* 00007230 */ 0x16, 0x03, 0x02, 0x03, 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, 0x0A, 0x08, 0x50, 0x96, 0x02, 0x03, +/* 00007240 */ 0x96, 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, 0x05, 0x06, 0x8F, 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, +/* 00007250 */ 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8F, 0x03, 0x2A, 0x0D, 0x01, 0x00, 0x07, +/* 00007260 */ 0x03, 0x00, 0x5C, 0x00, 0x02, 0x93, 0x02, 0x0E, 0x02, 0x00, 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, +/* 00007270 */ 0x5C, 0x02, 0x0E, 0xEE, 0x03, 0x0D, 0x0D, 0x01, 0x00, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, 0xF2, +/* 00007280 */ 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, +/* 00007290 */ 0xFE, 0x2B, 0x01, 0xFE, 0x5B, 0x04, 0xFE, 0x5C, 0x04, 0xFE, 0x5D, 0x04, 0xFF, 0xDA, 0x48, 0x01, +/* 000072A0 */ 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x42, 0x00, 0x4B, 0x01, 0x00, 0xAF, 0x72, 0x00, 0x00, 0xBF, +/* 000072B0 */ 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x7F, 0x06, 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x60, +/* 000072C0 */ 0x04, 0x4D, 0xFF, 0x13, 0x49, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x13, +/* 000072D0 */ 0x49, 0x01, 0x00, 0xEE, 0xEE, 0x01, 0x07, 0x03, 0x07, 0x09, 0x1D, 0x1B, 0x04, 0x01, 0x05, 0x01, +/* 000072E0 */ 0x01, 0x01, 0x01, 0x06, 0x08, 0x69, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, +/* 000072F0 */ 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, +/* 00007300 */ 0x02, 0x09, 0x08, 0x00, 0x00, 0x4B, 0x08, 0x6D, 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, +/* 00007310 */ 0x08, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x02, 0x09, 0x01, 0x00, 0x5C, 0x02, 0x09, 0x8F, 0x01, 0x03, +/* 00007320 */ 0x09, 0x02, 0x00, 0x5C, 0x03, 0x09, 0x8F, 0x01, 0x04, 0x09, 0x03, 0x00, 0x5C, 0x04, 0x09, 0x8F, +/* 00007330 */ 0x01, 0x05, 0x09, 0x04, 0x00, 0x5C, 0x05, 0x09, 0x5C, 0x06, 0x03, 0x5C, 0x07, 0x04, 0xF2, 0x08, +/* 00007340 */ 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, +/* 00007350 */ 0xFF, 0x3F, 0x49, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, +/* 00007360 */ 0x2B, 0x00, 0x4E, 0x00, 0x81, 0x00, 0x00, 0xBF, 0x5D, 0x84, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x78, +/* 00007370 */ 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, 0x4A, 0xFF, 0x33, 0x46, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, +/* 00007380 */ 0x01, 0x00, 0x06, 0x06, 0xFF, 0x33, 0x46, 0x01, 0x00, 0xFE, 0x9F, 0x01, 0xFE, 0x9F, 0x01, 0x40, +/* 00007390 */ 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, 0x16, 0x03, 0x02, 0x03, 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, +/* 000073A0 */ 0x0A, 0x08, 0x50, 0x96, 0x02, 0x03, 0x96, 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, 0x05, 0x06, 0x8F, +/* 000073B0 */ 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8F, +/* 000073C0 */ 0x03, 0x2A, 0x0D, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x93, 0x02, 0x0E, 0x02, 0x00, +/* 000073D0 */ 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, 0x5C, 0x02, 0x0E, 0xEE, 0x03, 0x0D, 0x0D, 0x01, 0x00, 0x5C, +/* 000073E0 */ 0x01, 0x0D, 0x5C, 0x02, 0x07, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, +/* 000073F0 */ 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0x2B, 0x01, 0xFE, 0x5B, 0x04, 0xFE, 0x5C, 0x04, 0xFE, +/* 00007400 */ 0x5D, 0x04, 0xFF, 0x86, 0x46, 0x01, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x42, 0x00, 0x4B, 0x01, +/* 00007410 */ 0x00, 0x15, 0x74, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x79, 0x06, 0x49, +/* 00007420 */ 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x5F, 0x04, 0x4B, 0xFF, 0xBF, 0x46, 0x01, 0x00, 0xFF, 0x00, 0x10, +/* 00007430 */ 0x01, 0x00, 0x03, 0x01, 0xFF, 0xBF, 0x46, 0x01, 0x00, 0xEE, 0xEE, 0x01, 0x07, 0x03, 0x07, 0x09, +/* 00007440 */ 0x1D, 0x1B, 0x04, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x06, 0x08, 0x69, 0x5B, 0x05, 0xB4, 0x05, +/* 00007450 */ 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, +/* 00007460 */ 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, 0x02, 0x09, 0x08, 0x00, 0x00, 0x4B, 0x08, 0x6D, 0x07, 0x08, +/* 00007470 */ 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x02, 0x09, 0x01, 0x00, +/* 00007480 */ 0x5C, 0x02, 0x09, 0x8F, 0x01, 0x03, 0x09, 0x02, 0x00, 0x5C, 0x03, 0x09, 0x8F, 0x01, 0x04, 0x09, +/* 00007490 */ 0x03, 0x00, 0x5C, 0x04, 0x09, 0x8F, 0x01, 0x05, 0x09, 0x04, 0x00, 0x5C, 0x05, 0x09, 0x5C, 0x06, +/* 000074A0 */ 0x03, 0x5C, 0x07, 0x04, 0xF2, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, +/* 000074B0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, 0xFF, 0xEB, 0x46, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, +/* 000074C0 */ 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x4E, 0x00, 0x81, 0x00, 0x00, 0xBF, 0x5D, 0x84, +/* 000074D0 */ 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x72, 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, 0x48, 0xFF, 0xF1, 0x43, +/* 000074E0 */ 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFF, 0xF1, 0x43, 0x01, 0x00, 0xFE, +/* 000074F0 */ 0x9B, 0x01, 0xFE, 0x9B, 0x01, 0x40, 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, 0x16, 0x03, 0x02, 0x03, +/* 00007500 */ 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, 0x0A, 0x08, 0x50, 0x96, 0x02, 0x03, 0x96, 0x03, 0x04, 0x96, +/* 00007510 */ 0x04, 0x05, 0x96, 0x05, 0x06, 0x8F, 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, +/* 00007520 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8F, 0x03, 0x2A, 0x0D, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00007530 */ 0x02, 0x93, 0x02, 0x0E, 0x02, 0x00, 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, 0x5C, 0x02, 0x0E, 0xEE, +/* 00007540 */ 0x03, 0x0D, 0x0D, 0x01, 0x00, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, 0xF2, 0x03, 0xFF, 0x0B, 0x00, +/* 00007550 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0x2B, 0x01, 0xFE, +/* 00007560 */ 0x5B, 0x04, 0xFE, 0x5C, 0x04, 0xFE, 0x5D, 0x04, 0xFF, 0x44, 0x44, 0x01, 0x00, 0x02, 0x0C, 0x00, +/* 00007570 */ 0x00, 0x00, 0x42, 0x00, 0x47, 0x01, 0x00, 0x7B, 0x75, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, +/* 00007580 */ 0xC4, 0x00, 0xFE, 0x73, 0x06, 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x5E, 0x04, 0x49, 0xFF, 0x7D, +/* 00007590 */ 0x44, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x7D, 0x44, 0x01, 0x00, 0xEA, +/* 000075A0 */ 0xEA, 0x01, 0x07, 0x03, 0x07, 0x09, 0x1D, 0x1B, 0x04, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x06, +/* 000075B0 */ 0x08, 0x69, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, 0xA8, 0x07, 0x47, 0x03, +/* 000075C0 */ 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, 0x02, 0x09, 0x08, 0x00, +/* 000075D0 */ 0x00, 0x4B, 0x08, 0x6D, 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x05, +/* 000075E0 */ 0x8F, 0x01, 0x02, 0x09, 0x01, 0x00, 0x5C, 0x02, 0x09, 0x8F, 0x01, 0x03, 0x09, 0x02, 0x00, 0x5C, +/* 000075F0 */ 0x03, 0x09, 0x8F, 0x01, 0x04, 0x09, 0x03, 0x00, 0x5C, 0x04, 0x09, 0x8F, 0x01, 0x05, 0x09, 0x04, +/* 00007600 */ 0x00, 0x5C, 0x05, 0x09, 0x5C, 0x06, 0x03, 0x5C, 0x07, 0x04, 0xF2, 0x08, 0x00, 0x07, 0x00, 0x00, +/* 00007610 */ 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, 0xFF, 0xA5, 0x44, 0x01, +/* 00007620 */ 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x4E, 0x00, +/* 00007630 */ 0x81, 0x00, 0x00, 0xBF, 0x5C, 0x87, 0xE0, 0x03, 0xC4, 0x00, 0xFE, 0x3B, 0x06, 0x0C, 0xA3, 0x41, +/* 00007640 */ 0xC1, 0x00, 0xFE, 0x23, 0x04, 0x47, 0xFF, 0xCC, 0x34, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00007650 */ 0x07, 0x07, 0xFF, 0xCC, 0x34, 0x01, 0x00, 0xFE, 0x5A, 0x06, 0xFE, 0x5A, 0x06, 0x01, 0x0F, 0x07, +/* 00007660 */ 0x11, 0x0A, 0x8F, 0x89, 0x03, 0x02, 0x01, 0x0E, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x01, 0x10, 0x06, +/* 00007670 */ 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xFB, 0x03, 0x08, 0x05, 0xFE, 0x5A, 0x04, 0x07, 0xFE, 0x2A, 0x02, +/* 00007680 */ 0x5B, 0x0D, 0xB4, 0x0D, 0x0D, 0x4F, 0x0E, 0x4F, 0x0F, 0x2C, 0x11, 0x0D, 0x15, 0x15, 0x00, 0x11, +/* 00007690 */ 0x02, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x12, 0x11, 0x00, 0x00, 0xE1, 0x11, 0x0D, 0x11, 0x00, 0x0F, +/* 000076A0 */ 0x25, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x12, 0x01, 0x00, 0x6D, 0x11, 0x12, 0x00, +/* 000076B0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x07, 0x5D, 0x02, 0x03, 0x00, 0x00, 0xF2, 0x03, +/* 000076C0 */ 0xFF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x0C, 0x11, 0x02, 0x00, 0x07, 0x03, +/* 000076D0 */ 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x21, 0x12, 0x03, 0x00, 0x5C, 0x01, 0x12, 0x8F, 0x03, 0x12, +/* 000076E0 */ 0x12, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x0D, 0xC3, 0x02, 0x12, 0x12, 0x02, 0x00, 0x5C, +/* 000076F0 */ 0x02, 0x12, 0xEE, 0x03, 0x11, 0x11, 0x01, 0x00, 0x47, 0x0E, 0x11, 0x8F, 0x03, 0x27, 0x11, 0x04, +/* 00007700 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x11, 0x11, 0x03, 0x00, +/* 00007710 */ 0x0F, 0x1F, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x26, 0x11, 0x05, 0x00, 0x07, 0x02, 0x00, +/* 00007720 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0E, 0xEE, 0x02, 0x11, 0x11, 0x04, 0x00, 0x0F, 0x09, 0x00, 0x11, +/* 00007730 */ 0x09, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, 0x6F, 0x01, 0xA8, 0x11, 0x47, 0x0F, 0x11, 0x8F, 0x03, +/* 00007740 */ 0x09, 0x11, 0x01, 0x00, 0x62, 0x11, 0x11, 0x01, 0x0F, 0x03, 0x00, 0x11, 0x09, 0xA2, 0x00, 0x0F, +/* 00007750 */ 0x9E, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x0F, 0x97, 0x00, 0x0C, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x0A, +/* 00007760 */ 0x11, 0x06, 0x00, 0x4B, 0x11, 0x98, 0x11, 0x11, 0x0A, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x11, 0x09, +/* 00007770 */ 0x14, 0x00, 0x8F, 0x01, 0x0A, 0x11, 0x06, 0x00, 0x4B, 0x11, 0x98, 0x11, 0x11, 0x0A, 0x01, 0x00, +/* 00007780 */ 0x47, 0x0F, 0x11, 0x09, 0x6B, 0x00, 0x8F, 0x03, 0x0A, 0x11, 0x07, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00007790 */ 0x00, 0x04, 0xCB, 0x12, 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x06, 0x05, 0x00, 0xEE, 0x03, 0x11, 0x11, +/* 000077A0 */ 0x05, 0x00, 0x47, 0x0F, 0x11, 0x8F, 0x01, 0x08, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x07, 0x04, 0x00, +/* 000077B0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0F, 0xA8, 0x12, 0x5C, 0x02, 0x12, 0x8F, 0x01, 0x02, 0x12, 0x09, +/* 000077C0 */ 0x00, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0xA8, 0x13, 0x5C, 0x01, 0x13, 0x5C, 0x02, +/* 000077D0 */ 0x08, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0x12, 0x12, 0x07, 0x00, 0x5C, 0x03, 0x12, 0xEE, 0x04, 0xFF, +/* 000077E0 */ 0x11, 0x06, 0x00, 0x8F, 0x01, 0x0A, 0x11, 0x06, 0x00, 0x4B, 0x11, 0x9D, 0x0F, 0x11, 0x0A, 0x00, +/* 000077F0 */ 0x00, 0x0F, 0x5C, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x0A, 0x11, 0x07, 0x00, 0x07, 0x03, +/* 00007800 */ 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x12, 0x5C, 0x01, 0x12, 0x5D, 0x02, 0x06, 0x08, 0x00, 0xEE, 0x03, +/* 00007810 */ 0x11, 0x11, 0x08, 0x00, 0x47, 0x0F, 0x11, 0x8F, 0x01, 0x08, 0x11, 0x08, 0x00, 0x4B, 0x11, 0x07, +/* 00007820 */ 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0F, 0x5C, 0x02, 0x0B, 0x8F, 0x01, 0x02, 0x12, 0x09, +/* 00007830 */ 0x00, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x08, 0x5C, +/* 00007840 */ 0x03, 0x09, 0xEE, 0x04, 0x12, 0x12, 0x0A, 0x00, 0x5C, 0x03, 0x12, 0xEE, 0x04, 0xFF, 0x11, 0x09, +/* 00007850 */ 0x00, 0x8F, 0x03, 0x11, 0x11, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x09, +/* 00007860 */ 0x13, 0x01, 0x00, 0x6D, 0x12, 0x13, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x13, 0x8F, 0x03, 0x31, +/* 00007870 */ 0x15, 0x0B, 0x00, 0x6D, 0x14, 0x15, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x15, 0x5C, 0x01, 0x0D, +/* 00007880 */ 0xF2, 0x02, 0x14, 0x14, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0F, +/* 00007890 */ 0xF2, 0x03, 0x12, 0x12, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x5C, 0x01, 0x12, 0xEE, 0x02, 0x00, +/* 000078A0 */ 0x11, 0x0B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x17, 0x03, +/* 000078B0 */ 0xFE, 0x33, 0x02, 0xFE, 0x5E, 0x02, 0xFF, 0x45, 0x35, 0x01, 0x00, 0x11, 0x09, 0x00, 0x00, 0x00, +/* 000078C0 */ 0x1D, 0x00, 0x4F, 0x00, 0x22, 0x00, 0x50, 0x00, 0x33, 0x00, 0x53, 0x00, 0x38, 0x00, 0x3C, 0x00, +/* 000078D0 */ 0x06, 0x00, 0x3A, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x1F, 0x00, 0xB4, 0x00, 0x15, 0x00, 0x84, 0x00, +/* 000078E0 */ 0x14, 0x00, 0xA2, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7A, 0x00, 0x0E, 0x00, 0x7C, 0x00, +/* 000078F0 */ 0x07, 0x00, 0x28, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x3A, 0x00, 0x81, 0x00, 0x57, 0x00, 0x5A, 0x00, +/* 00007900 */ 0x00, 0xBF, 0x5C, 0x8D, 0xE0, 0x29, 0xD4, 0x10, 0xFE, 0xAE, 0x05, 0x0C, 0xB3, 0x41, 0xC1, 0x00, +/* 00007910 */ 0xFE, 0x22, 0x04, 0x46, 0xFF, 0xCA, 0x17, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, +/* 00007920 */ 0xFF, 0xCA, 0x17, 0x01, 0x00, 0xFE, 0x69, 0x1B, 0xFE, 0x69, 0x1B, 0x45, 0x1C, 0x29, 0x41, 0x07, +/* 00007930 */ 0xFE, 0xAA, 0x01, 0xFE, 0x8A, 0x01, 0x03, 0x01, 0x22, 0x0C, 0x0F, 0x2A, 0x2A, 0x2A, 0x2A, 0x01, +/* 00007940 */ 0x01, 0x40, 0x41, 0x06, 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, 0x08, 0x06, 0xFE, 0x16, 0x03, +/* 00007950 */ 0x0B, 0x05, 0xFE, 0x12, 0x04, 0x06, 0xFE, 0x15, 0x04, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, +/* 00007960 */ 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x06, 0xFE, 0x50, 0x04, 0x06, 0xFE, 0x51, +/* 00007970 */ 0x04, 0x05, 0xFE, 0x2B, 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x2E, 0x04, 0x06, 0xFE, 0x52, +/* 00007980 */ 0x04, 0x06, 0xFE, 0x25, 0x04, 0x05, 0xFE, 0x30, 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x26, +/* 00007990 */ 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, +/* 000079A0 */ 0x04, 0x06, 0xFE, 0x53, 0x04, 0x06, 0xFE, 0x54, 0x04, 0x06, 0xFE, 0x6C, 0x03, 0x05, 0xFE, 0x55, +/* 000079B0 */ 0x04, 0x05, 0xFE, 0x56, 0x04, 0x05, 0xFE, 0x57, 0x04, 0x05, 0xFE, 0x58, 0x04, 0x07, 0x05, 0xFE, +/* 000079C0 */ 0xF4, 0x03, 0x05, 0xFE, 0x1A, 0x04, 0x0C, 0x05, 0xFE, 0x59, 0x04, 0x06, 0xFE, 0x13, 0x04, 0x01, +/* 000079D0 */ 0x00, 0xFE, 0x89, 0x06, 0xA8, 0x3F, 0x2C, 0x42, 0x29, 0x0D, 0x03, 0x00, 0x42, 0x02, 0x09, 0x1A, +/* 000079E0 */ 0x00, 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 000079F0 */ 0x43, 0xF2, 0x01, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x0C, 0x42, 0x01, +/* 00007A00 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x19, 0x43, 0x02, 0x00, 0x5C, 0x01, 0x43, +/* 00007A10 */ 0x5C, 0x02, 0x29, 0x5D, 0x03, 0x03, 0x01, 0x00, 0xEE, 0x04, 0x42, 0x42, 0x01, 0x00, 0x0F, 0x03, +/* 00007A20 */ 0x00, 0x42, 0x09, 0x2F, 0x00, 0x62, 0x42, 0x29, 0x01, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x24, 0x00, +/* 00007A30 */ 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x43, +/* 00007A40 */ 0x5D, 0x01, 0x05, 0x02, 0x00, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x42, 0x02, 0x00, +/* 00007A50 */ 0x00, 0x00, 0x02, 0x00, 0x77, 0x06, 0x29, 0x03, 0x8F, 0x01, 0x02, 0x42, 0x03, 0x00, 0x4B, 0x42, +/* 00007A60 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x07, 0x03, 0x00, 0x5D, 0x03, +/* 00007A70 */ 0x08, 0x03, 0x00, 0xEE, 0x04, 0x42, 0x42, 0x03, 0x00, 0x47, 0x2B, 0x42, 0x8F, 0x03, 0x02, 0x42, +/* 00007A80 */ 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x09, 0x04, 0x00, +/* 00007A90 */ 0x5D, 0x03, 0x0A, 0x04, 0x00, 0xCE, 0x43, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x43, 0xA1, 0x01, +/* 00007AA0 */ 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5D, 0x05, 0x0C, 0x04, 0x00, 0xEE, 0x06, 0x42, 0x42, 0x04, 0x00, +/* 00007AB0 */ 0x47, 0x2E, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007AC0 */ 0x01, 0x2B, 0x5D, 0x02, 0x0D, 0x05, 0x00, 0x5D, 0x03, 0x0A, 0x05, 0x00, 0xA8, 0x43, 0x5C, 0x04, +/* 00007AD0 */ 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x05, 0x00, 0x47, 0x2F, 0x42, 0xA8, +/* 00007AE0 */ 0x42, 0x15, 0x03, 0x00, 0x2F, 0x42, 0x09, 0x23, 0x00, 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, +/* 00007AF0 */ 0x42, 0x43, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x2F, 0xF2, 0x02, 0x42, 0x42, +/* 00007B00 */ 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x47, 0x2F, 0x42, 0x09, 0x1D, 0x00, 0x8F, 0x03, 0x09, 0x43, +/* 00007B10 */ 0x00, 0x00, 0x6D, 0x42, 0x43, 0x05, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF2, 0x01, 0x42, 0x42, +/* 00007B20 */ 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x14, 0x03, 0x00, 0x2F, 0x42, +/* 00007B30 */ 0x09, 0x1A, 0x00, 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, 0x42, 0x43, 0x06, 0x07, 0x01, 0x00, +/* 00007B40 */ 0x5C, 0x00, 0x43, 0xF2, 0x01, 0xFF, 0x42, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x8F, 0x03, 0x02, +/* 00007B50 */ 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x0E, 0x09, +/* 00007B60 */ 0x00, 0x5D, 0x03, 0x0A, 0x09, 0x00, 0xCE, 0x43, 0x03, 0x01, 0x00, 0xA1, 0x00, 0x0F, 0x43, 0xA1, +/* 00007B70 */ 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, +/* 00007B80 */ 0x06, 0x42, 0x42, 0x09, 0x00, 0x47, 0x30, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, +/* 00007B90 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x12, 0x0A, 0x00, 0x5D, 0x03, 0x0A, 0x0A, +/* 00007BA0 */ 0x00, 0xCE, 0x43, 0x03, 0x02, 0x00, 0xA1, 0x00, 0x0F, 0x43, 0xA1, 0x01, 0x10, 0x43, 0xA1, 0x02, +/* 00007BB0 */ 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0A, 0x00, +/* 00007BC0 */ 0x47, 0x31, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007BD0 */ 0x01, 0x2B, 0x5D, 0x02, 0x13, 0x0B, 0x00, 0x5D, 0x03, 0x0A, 0x0B, 0x00, 0xCE, 0x43, 0x02, 0x03, +/* 00007BE0 */ 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, +/* 00007BF0 */ 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0B, 0x00, 0x47, 0x32, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, +/* 00007C00 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x16, 0x0C, 0x00, 0x5D, 0x03, +/* 00007C10 */ 0x0A, 0x0C, 0x00, 0xCE, 0x43, 0x05, 0x04, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, +/* 00007C20 */ 0xA1, 0x02, 0x0F, 0x43, 0xA1, 0x03, 0x10, 0x43, 0xA1, 0x04, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, +/* 00007C30 */ 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0C, 0x00, 0x47, 0x33, 0x42, 0x8F, 0x03, 0x02, +/* 00007C40 */ 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x17, 0x0D, +/* 00007C50 */ 0x00, 0x5D, 0x03, 0x0A, 0x0D, 0x00, 0xCE, 0x43, 0x02, 0x05, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, +/* 00007C60 */ 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0D, +/* 00007C70 */ 0x00, 0x47, 0x34, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 00007C80 */ 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x18, 0x0E, 0x00, 0x5D, 0x03, 0x0A, 0x0E, 0x00, 0xCE, 0x43, 0x02, +/* 00007C90 */ 0x06, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, +/* 00007CA0 */ 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0E, 0x00, 0x47, 0x35, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, +/* 00007CB0 */ 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x19, 0x0F, 0x00, 0x5D, +/* 00007CC0 */ 0x03, 0x0A, 0x0F, 0x00, 0xCE, 0x43, 0x02, 0x07, 0x00, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, +/* 00007CD0 */ 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x0F, 0x00, 0x47, +/* 00007CE0 */ 0x36, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007CF0 */ 0x2B, 0x5D, 0x02, 0x1A, 0x10, 0x00, 0x5D, 0x03, 0x0A, 0x10, 0x00, 0xCE, 0x43, 0x02, 0x08, 0x00, +/* 00007D00 */ 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, +/* 00007D10 */ 0xEE, 0x06, 0x42, 0x42, 0x10, 0x00, 0x47, 0x37, 0x42, 0x8F, 0x03, 0x02, 0x42, 0x04, 0x00, 0x07, +/* 00007D20 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x1B, 0x11, 0x00, 0x5D, 0x03, 0x0A, +/* 00007D30 */ 0x11, 0x00, 0xCE, 0x43, 0x02, 0x09, 0x00, 0xA1, 0x00, 0x10, 0x43, 0xA1, 0x01, 0x11, 0x43, 0x5C, +/* 00007D40 */ 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0xEE, 0x06, 0x42, 0x42, 0x11, 0x00, 0x47, 0x38, 0x42, +/* 00007D50 */ 0x0F, 0x03, 0x00, 0x35, 0x09, 0x2F, 0x00, 0x8F, 0x03, 0x02, 0x43, 0x04, 0x00, 0x07, 0x06, 0x00, +/* 00007D60 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x1C, 0x12, 0x00, 0x5D, 0x03, 0x1D, 0x12, 0x00, +/* 00007D70 */ 0xA8, 0x44, 0x5C, 0x04, 0x44, 0xA8, 0x44, 0x5C, 0x05, 0x44, 0xEE, 0x06, 0x43, 0x43, 0x12, 0x00, +/* 00007D80 */ 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x39, 0x42, 0x8F, 0x03, +/* 00007D90 */ 0x02, 0x42, 0x04, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5D, 0x02, 0x1E, +/* 00007DA0 */ 0x13, 0x00, 0x5D, 0x03, 0x0A, 0x13, 0x00, 0xCE, 0x43, 0x02, 0x0A, 0x00, 0xA1, 0x00, 0x1F, 0x43, +/* 00007DB0 */ 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5D, 0x05, 0x0C, 0x13, 0x00, 0xEE, 0x06, 0x42, 0x42, +/* 00007DC0 */ 0x13, 0x00, 0x47, 0x3A, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x39, 0x42, 0x09, 0x16, 0x00, 0x0F, +/* 00007DD0 */ 0x03, 0x00, 0x39, 0x09, 0x06, 0x00, 0x47, 0x43, 0x20, 0x09, 0x03, 0x00, 0x47, 0x43, 0x21, 0x47, +/* 00007DE0 */ 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x3B, 0x42, 0x8F, 0x01, 0x03, +/* 00007DF0 */ 0x42, 0x05, 0x00, 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x0A, 0x43, 0x06, +/* 00007E00 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00007E10 */ 0x44, 0x00, 0x00, 0x00, 0x7B, 0x30, 0x44, 0x07, 0x7B, 0x31, 0x44, 0x08, 0x7B, 0x32, 0x44, 0x09, +/* 00007E20 */ 0x7B, 0x33, 0x44, 0x0A, 0x7B, 0x34, 0x44, 0x0B, 0x7B, 0x35, 0x44, 0x0C, 0x7B, 0x36, 0x44, 0x0D, +/* 00007E30 */ 0x7B, 0x37, 0x44, 0x0E, 0x7B, 0x38, 0x44, 0x0F, 0x5C, 0x01, 0x44, 0x5D, 0x02, 0x22, 0x15, 0x00, +/* 00007E40 */ 0xEE, 0x03, 0x43, 0x43, 0x15, 0x00, 0x5C, 0x01, 0x43, 0xEE, 0x02, 0x42, 0x42, 0x14, 0x00, 0x47, +/* 00007E50 */ 0x3C, 0x42, 0x8F, 0x03, 0x07, 0x42, 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007E60 */ 0x2A, 0xEE, 0x02, 0x42, 0x42, 0x16, 0x00, 0x47, 0x2A, 0x42, 0x8F, 0x03, 0x2F, 0x42, 0x08, 0x00, +/* 00007E70 */ 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2A, 0x5C, 0x02, 0x2E, 0xCE, 0x43, 0x02, 0x0B, +/* 00007E80 */ 0x00, 0xA1, 0x00, 0x23, 0x43, 0xA1, 0x01, 0x24, 0x43, 0x5C, 0x03, 0x43, 0x8F, 0x03, 0x30, 0x43, +/* 00007E90 */ 0x09, 0x00, 0x5C, 0x04, 0x43, 0xEE, 0x05, 0x42, 0x42, 0x17, 0x00, 0x47, 0x3D, 0x42, 0x77, 0x2E, +/* 00007EA0 */ 0x29, 0x10, 0x77, 0x2F, 0x29, 0x11, 0x62, 0x42, 0x3D, 0x12, 0x77, 0x42, 0x29, 0x13, 0x77, 0x30, +/* 00007EB0 */ 0x29, 0x14, 0x77, 0x31, 0x29, 0x15, 0x77, 0x32, 0x29, 0x16, 0x77, 0x33, 0x29, 0x17, 0x77, 0x34, +/* 00007EC0 */ 0x29, 0x18, 0x77, 0x35, 0x29, 0x19, 0x77, 0x36, 0x29, 0x1A, 0x77, 0x37, 0x29, 0x1B, 0x77, 0x38, +/* 00007ED0 */ 0x29, 0x1C, 0x77, 0x39, 0x29, 0x1D, 0x77, 0x3A, 0x29, 0x1E, 0x77, 0x3B, 0x29, 0x1F, 0x77, 0x3C, +/* 00007EE0 */ 0x29, 0x20, 0x47, 0x3E, 0x25, 0xE5, 0x20, 0x00, 0x8F, 0x03, 0x3E, 0x42, 0x0A, 0x00, 0x4B, 0x42, +/* 00007EF0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5D, 0x02, 0x25, 0x18, 0x00, 0xEE, 0x03, +/* 00007F00 */ 0xFF, 0x42, 0x18, 0x00, 0xE9, 0x09, 0x63, 0x00, 0xE7, 0x2C, 0x06, 0x8F, 0x03, 0x29, 0x42, 0x0B, +/* 00007F10 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2C, 0xEE, 0x02, 0xFF, 0x42, 0x19, 0x00, +/* 00007F20 */ 0x8F, 0x01, 0x02, 0x42, 0x03, 0x00, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007F30 */ 0x2B, 0x5D, 0x02, 0x26, 0x1A, 0x00, 0x5D, 0x03, 0x27, 0x1A, 0x00, 0xEE, 0x04, 0x42, 0x42, 0x1A, +/* 00007F40 */ 0x00, 0x47, 0x3F, 0x42, 0x47, 0x42, 0x29, 0x8F, 0x01, 0x03, 0x43, 0x05, 0x00, 0x4B, 0x43, 0x07, +/* 00007F50 */ 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x3F, 0x5D, 0x02, 0x22, 0x1B, 0x00, 0xEE, 0x03, 0x43, +/* 00007F60 */ 0x43, 0x1B, 0x00, 0x77, 0x43, 0x42, 0x21, 0x47, 0x3E, 0x06, 0xE9, 0x0F, 0x2E, 0x00, 0x3E, 0x09, +/* 00007F70 */ 0x00, 0x00, 0x47, 0x42, 0x29, 0x8F, 0x01, 0x07, 0x43, 0x0C, 0x00, 0x4B, 0x43, 0x07, 0x03, 0x00, +/* 00007F80 */ 0x5C, 0x00, 0x04, 0x62, 0x44, 0x29, 0x22, 0x98, 0x44, 0x44, 0x28, 0x00, 0x00, 0x5C, 0x01, 0x44, +/* 00007F90 */ 0x5C, 0x02, 0x29, 0xEE, 0x03, 0x43, 0x43, 0x1C, 0x00, 0x77, 0x43, 0x42, 0x21, 0xE5, 0x20, 0x00, +/* 00007FA0 */ 0x8F, 0x03, 0x3E, 0x42, 0x0A, 0x00, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007FB0 */ 0x29, 0x5D, 0x02, 0x06, 0x1D, 0x00, 0xEE, 0x03, 0xFF, 0x42, 0x1D, 0x00, 0xE9, 0x09, 0x33, 0x00, +/* 00007FC0 */ 0xE7, 0x2D, 0x06, 0x8F, 0x03, 0x29, 0x42, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007FD0 */ 0x01, 0x2D, 0xEE, 0x02, 0xFF, 0x42, 0x1E, 0x00, 0x8F, 0x03, 0x09, 0x43, 0x00, 0x00, 0x6D, 0x42, +/* 00007FE0 */ 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0xF2, 0x01, 0xFF, 0x42, 0x06, 0x00, 0x00, 0x00, +/* 00007FF0 */ 0x1F, 0x00, 0xE9, 0x8F, 0x01, 0x04, 0x42, 0x0D, 0x00, 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00008000 */ 0x04, 0x62, 0x43, 0x29, 0x23, 0x5C, 0x01, 0x43, 0xEE, 0x02, 0x42, 0x42, 0x20, 0x00, 0x77, 0x42, +/* 00008010 */ 0x29, 0x24, 0x47, 0x42, 0x29, 0x8F, 0x03, 0x0C, 0x43, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00008020 */ 0x04, 0x8F, 0x03, 0x24, 0x44, 0x0E, 0x00, 0x5C, 0x01, 0x44, 0x62, 0x44, 0x29, 0x25, 0x5C, 0x02, +/* 00008030 */ 0x44, 0xEE, 0x03, 0x43, 0x43, 0x21, 0x00, 0x77, 0x43, 0x42, 0x26, 0x62, 0x42, 0x29, 0x27, 0xA8, +/* 00008040 */ 0x43, 0x15, 0x03, 0x00, 0x42, 0x43, 0x09, 0x0C, 0x00, 0x62, 0x42, 0x29, 0x28, 0x43, 0x42, 0x42, +/* 00008050 */ 0x20, 0x77, 0x42, 0x29, 0x1D, 0x77, 0x06, 0x29, 0x29, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x2C, 0x00, +/* 00008060 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, +/* 00008070 */ 0x84, 0x02, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, +/* 00008080 */ 0x82, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, +/* 00008090 */ 0xFE, 0x57, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x65, 0x02, 0xFE, +/* 000080A0 */ 0x66, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, +/* 000080B0 */ 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x86, 0x02, +/* 000080C0 */ 0xFE, 0x70, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x88, 0x02, 0xFE, +/* 000080D0 */ 0x8F, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x8C, +/* 000080E0 */ 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x91, 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x93, 0x02, 0xFE, 0x25, 0x02, +/* 000080F0 */ 0xFE, 0x1A, 0x02, 0xFE, 0x1A, 0x02, 0xFE, 0x27, 0x02, 0xFE, 0x26, 0x02, 0xFE, 0x94, 0x02, 0xFE, +/* 00008100 */ 0x14, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x6E, 0x02, 0xFF, 0x23, +/* 00008110 */ 0x18, 0x01, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x1A, 0x00, 0x3F, 0x00, +/* 00008120 */ 0x35, 0x00, 0x9F, 0x00, 0x24, 0x00, 0x71, 0x00, 0x04, 0x00, 0x67, 0x00, 0x24, 0x00, 0x46, 0x00, +/* 00008130 */ 0x37, 0x00, 0x71, 0x00, 0x2C, 0x00, 0x60, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x23, 0x00, 0x6C, 0x00, +/* 00008140 */ 0x1D, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x1A, 0x00, 0x6C, 0x00, 0x3B, 0x00, 0x6F, 0x00, +/* 00008150 */ 0x3B, 0x00, 0x67, 0x00, 0x37, 0x00, 0x64, 0x00, 0x43, 0x00, 0x81, 0x00, 0x37, 0x00, 0x62, 0x00, +/* 00008160 */ 0x37, 0x00, 0x64, 0x00, 0x37, 0x00, 0x68, 0x00, 0x37, 0x00, 0x68, 0x00, 0x37, 0x00, 0x70, 0x00, +/* 00008170 */ 0x3E, 0x00, 0x6F, 0x00, 0x37, 0x00, 0x77, 0x00, 0x28, 0x00, 0x71, 0x00, 0x65, 0x00, 0xD0, 0x01, +/* 00008180 */ 0x18, 0x00, 0x41, 0x00, 0x34, 0x00, 0x9A, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x36, 0x00, +/* 00008190 */ 0x08, 0x00, 0x68, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, +/* 000081A0 */ 0x04, 0x00, 0x30, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x32, 0x00, +/* 000081B0 */ 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x40, 0x00, +/* 000081C0 */ 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0xFA, 0x02, 0x06, 0x00, 0x93, 0x00, 0x22, 0x00, 0x3F, 0x00, +/* 000081D0 */ 0x01, 0x00, 0x4A, 0x00, 0x15, 0x00, 0xEF, 0x00, 0x24, 0x00, 0x54, 0x00, 0x23, 0x00, 0x6A, 0x00, +/* 000081E0 */ 0x04, 0x00, 0x37, 0x00, 0x07, 0x00, 0x5A, 0x00, 0x2E, 0x00, 0xDE, 0x00, 0x22, 0x00, 0x3E, 0x00, +/* 000081F0 */ 0x01, 0x00, 0x4A, 0x00, 0x15, 0x00, 0x77, 0x01, 0x1B, 0x00, 0x77, 0x00, 0x1F, 0x00, 0x66, 0x00, +/* 00008200 */ 0x29, 0x00, 0x82, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x0C, 0x00, 0x6D, 0x00, 0x06, 0x00, 0x3F, 0x00, +/* 00008210 */ 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x11, 0xC4, 0x00, 0xFE, 0x75, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, +/* 00008220 */ 0xFE, 0x21, 0x04, 0x45, 0xFF, 0x8F, 0x0A, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, +/* 00008230 */ 0xFF, 0x8F, 0x0A, 0x01, 0x00, 0xFE, 0x2D, 0x0D, 0xFE, 0x2D, 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, +/* 00008240 */ 0xC8, 0xBB, 0x03, 0x02, 0x10, 0x07, 0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0x15, 0x05, 0xFE, 0x4A, 0x04, +/* 00008250 */ 0x08, 0x05, 0xFE, 0x30, 0x04, 0x07, 0x05, 0xFE, 0x4B, 0x04, 0x01, 0x00, 0x05, 0xFE, 0x4C, 0x04, +/* 00008260 */ 0x05, 0xFE, 0x3F, 0x04, 0x05, 0xFE, 0x4D, 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x26, 0x04, +/* 00008270 */ 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, +/* 00008280 */ 0x05, 0xFE, 0x4E, 0x04, 0xFE, 0x02, 0x03, 0xA8, 0x14, 0x62, 0x16, 0x13, 0x00, 0xA8, 0x17, 0x15, +/* 00008290 */ 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x05, 0x16, 0x00, 0x00, 0x4B, 0x16, 0x07, +/* 000082A0 */ 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x00, 0x5C, 0x02, 0x17, 0x5D, +/* 000082B0 */ 0x03, 0x02, 0x00, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x00, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, +/* 000082C0 */ 0x01, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x00, 0x00, 0x62, 0x16, 0x13, 0x02, 0x14, +/* 000082D0 */ 0x03, 0x00, 0x16, 0x04, 0x09, 0x8C, 0x00, 0x8F, 0x03, 0x09, 0x17, 0x01, 0x00, 0x6D, 0x16, 0x17, +/* 000082E0 */ 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, +/* 000082F0 */ 0xF2, 0x03, 0x16, 0x16, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, +/* 00008300 */ 0x14, 0x05, 0x09, 0x2C, 0x00, 0x8F, 0x03, 0x14, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00008310 */ 0x03, 0x8F, 0x03, 0x13, 0x17, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x06, 0x03, 0x00, 0xC3, +/* 00008320 */ 0x02, 0x17, 0x17, 0x03, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0xFF, 0x16, 0x02, 0x00, 0x09, 0x2F, +/* 00008330 */ 0x00, 0x8F, 0x03, 0x0C, 0x16, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x23, +/* 00008340 */ 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x12, 0x98, 0x17, 0x14, 0x07, 0x00, 0x00, 0x5C, +/* 00008350 */ 0x03, 0x17, 0x5D, 0x04, 0x08, 0x04, 0x00, 0xEE, 0x05, 0x16, 0x16, 0x04, 0x00, 0x47, 0x12, 0x16, +/* 00008360 */ 0x09, 0x95, 0x00, 0x62, 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, 0x16, 0x09, 0x09, 0x89, 0x00, 0x8F, +/* 00008370 */ 0x03, 0x09, 0x17, 0x01, 0x00, 0x6D, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, +/* 00008380 */ 0x01, 0x12, 0xE0, 0x18, 0x01, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x03, 0x00, 0x00, 0x00, +/* 00008390 */ 0x05, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x2C, 0x00, 0x8F, 0x03, 0x14, +/* 000083A0 */ 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x13, 0x17, 0x03, 0x00, 0x07, +/* 000083B0 */ 0x02, 0x00, 0x5D, 0x01, 0x06, 0x07, 0x00, 0xC3, 0x02, 0x17, 0x17, 0x07, 0x00, 0x5C, 0x01, 0x17, +/* 000083C0 */ 0xEE, 0x02, 0xFF, 0x16, 0x06, 0x00, 0x09, 0x2F, 0x00, 0x8F, 0x03, 0x0C, 0x16, 0x04, 0x00, 0x07, +/* 000083D0 */ 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x03, 0x23, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, +/* 000083E0 */ 0x12, 0x98, 0x17, 0x14, 0x07, 0x01, 0x00, 0x5C, 0x03, 0x17, 0x5D, 0x04, 0x0A, 0x08, 0x00, 0xEE, +/* 000083F0 */ 0x05, 0x16, 0x16, 0x08, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, +/* 00008400 */ 0x00, 0x16, 0x17, 0x09, 0x41, 0x00, 0x62, 0x16, 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x04, 0x09, +/* 00008410 */ 0x35, 0x00, 0x62, 0x16, 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x0B, 0x09, 0x29, 0x00, 0x8F, 0x01, +/* 00008420 */ 0x05, 0x16, 0x00, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, +/* 00008430 */ 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0C, 0x09, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x09, +/* 00008440 */ 0x00, 0x47, 0x12, 0x16, 0x09, 0x34, 0x00, 0x62, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, +/* 00008450 */ 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x06, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, +/* 00008460 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0C, +/* 00008470 */ 0x0A, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0A, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x05, 0xA8, +/* 00008480 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x06, 0x16, 0x06, 0x00, 0x4B, +/* 00008490 */ 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x05, 0x5C, 0x02, +/* 000084A0 */ 0x17, 0x5D, 0x03, 0x0D, 0x0B, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0B, 0x00, 0x47, 0x12, 0x16, 0x62, +/* 000084B0 */ 0x16, 0x13, 0x06, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x06, +/* 000084C0 */ 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, +/* 000084D0 */ 0x13, 0x06, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0E, 0x0C, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0C, 0x00, +/* 000084E0 */ 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x07, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, +/* 000084F0 */ 0x00, 0x8F, 0x01, 0x06, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 00008500 */ 0x01, 0x12, 0x62, 0x17, 0x13, 0x07, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x0F, 0x0D, 0x00, 0xEE, 0x04, +/* 00008510 */ 0x16, 0x16, 0x0D, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x08, 0xA8, 0x17, 0x15, 0x03, 0x00, +/* 00008520 */ 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x06, 0x16, 0x06, 0x00, 0x4B, 0x16, 0x07, 0x04, 0x00, +/* 00008530 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x08, 0x5C, 0x02, 0x17, 0x5D, 0x03, 0x10, +/* 00008540 */ 0x0E, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0E, 0x00, 0x47, 0x12, 0x16, 0x62, 0x16, 0x13, 0x09, 0xA8, +/* 00008550 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8F, 0x01, 0x05, 0x16, 0x00, 0x00, 0x4B, +/* 00008560 */ 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x62, 0x17, 0x13, 0x09, 0x5C, 0x02, +/* 00008570 */ 0x17, 0x5D, 0x03, 0x11, 0x0F, 0x00, 0xEE, 0x04, 0x16, 0x16, 0x0F, 0x00, 0x47, 0x12, 0x16, 0x47, +/* 00008580 */ 0x00, 0x12, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x88, 0x02, 0xFE, 0x8F, 0x02, 0xFE, +/* 00008590 */ 0x89, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x8C, +/* 000085A0 */ 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x91, 0x02, 0x1C, 0xFE, 0x4F, 0x04, 0x00, 0x1C, 0xFE, 0x4F, 0x04, +/* 000085B0 */ 0x00, 0xFF, 0xDE, 0x0A, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x26, +/* 000085C0 */ 0x00, 0x88, 0x00, 0x0E, 0x00, 0x8E, 0x01, 0x0C, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x6B, 0x00, 0x08, +/* 000085D0 */ 0x00, 0x2E, 0x00, 0x2C, 0x00, 0x91, 0x00, 0x32, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x26, +/* 000085E0 */ 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x2C, 0x00, 0x91, 0x00, 0x2F, 0x00, 0x2F, 0x01, 0x26, +/* 000085F0 */ 0x00, 0x90, 0x00, 0x29, 0x00, 0x76, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x26, 0x00, 0x8B, 0x00, 0x0E, +/* 00008600 */ 0x00, 0x3E, 0x00, 0x26, 0x00, 0x87, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x89, 0x00, 0x0E, +/* 00008610 */ 0x00, 0x41, 0x00, 0x26, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x26, 0x00, 0x8D, 0x00, 0x0E, +/* 00008620 */ 0x00, 0x47, 0x00, 0x26, 0x00, 0x8C, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, +/* 00008630 */ 0x01, 0xC4, 0x00, 0xFE, 0x61, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x20, 0x04, 0x44, 0xFF, +/* 00008640 */ 0x27, 0x05, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x27, 0x05, 0x01, 0x00, +/* 00008650 */ 0xFE, 0xF8, 0x04, 0xFE, 0xF8, 0x04, 0x01, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x05, 0x06, +/* 00008660 */ 0x06, 0x01, 0x01, 0x01, 0x01, 0x15, 0x05, 0xFE, 0x3A, 0x04, 0x05, 0xFE, 0x45, 0x04, 0x08, 0x07, +/* 00008670 */ 0x05, 0xFE, 0x46, 0x04, 0x05, 0xFE, 0x3D, 0x04, 0x05, 0xFE, 0x3E, 0x04, 0x05, 0xFE, 0x30, 0x04, +/* 00008680 */ 0x01, 0x00, 0x06, 0xFE, 0x40, 0x04, 0x01, 0x01, 0x05, 0xFE, 0x47, 0x04, 0x01, 0x02, 0x05, 0xFE, +/* 00008690 */ 0x48, 0x04, 0x05, 0xFE, 0x49, 0x04, 0xFE, 0x14, 0x01, 0x8F, 0x03, 0x09, 0x17, 0x00, 0x00, 0x6D, +/* 000086A0 */ 0x16, 0x17, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x11, 0x8F, 0x03, 0x0F, 0x18, +/* 000086B0 */ 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, 0x19, 0x02, 0x13, 0x03, 0x5C, 0x01, 0x19, +/* 000086C0 */ 0xEE, 0x02, 0x18, 0x18, 0x01, 0x00, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x00, 0x00, 0x00, +/* 000086D0 */ 0x00, 0x00, 0x00, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x3C, 0x00, 0x8F, 0x03, +/* 000086E0 */ 0x14, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x13, 0x17, 0x03, 0x00, +/* 000086F0 */ 0x07, 0x02, 0x00, 0xFC, 0x18, 0x06, 0x11, 0x06, 0xFE, 0x18, 0x07, 0x02, 0x02, 0xFE, 0x18, 0x13, +/* 00008700 */ 0x08, 0x04, 0x5C, 0x01, 0x18, 0xC3, 0x02, 0x17, 0x17, 0x03, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, +/* 00008710 */ 0xFF, 0x16, 0x02, 0x00, 0x47, 0x00, 0x11, 0x09, 0x91, 0x00, 0x14, 0x03, 0x00, 0x12, 0x09, 0x09, +/* 00008720 */ 0x3B, 0x00, 0x8F, 0x03, 0x0C, 0x16, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, +/* 00008730 */ 0x23, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x98, 0x17, 0x14, 0x0A, 0x00, 0x00, +/* 00008740 */ 0x5C, 0x03, 0x17, 0x98, 0x17, 0x14, 0x0C, 0x01, 0x00, 0xFB, 0x17, 0x0B, 0x17, 0x0D, 0x5C, 0x04, +/* 00008750 */ 0x17, 0xEE, 0x05, 0x00, 0x16, 0x04, 0x00, 0x09, 0x51, 0x00, 0x09, 0x46, 0x00, 0x98, 0x16, 0x14, +/* 00008760 */ 0x0E, 0x02, 0x00, 0x15, 0x03, 0x00, 0x16, 0x0F, 0x09, 0x38, 0x00, 0x8F, 0x03, 0x0C, 0x16, 0x04, +/* 00008770 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x23, 0x17, 0x05, 0x00, 0x5C, 0x01, 0x17, +/* 00008780 */ 0x5C, 0x02, 0x11, 0x98, 0x17, 0x14, 0x0A, 0x03, 0x00, 0x5C, 0x03, 0x17, 0x98, 0x17, 0x14, 0x0C, +/* 00008790 */ 0x04, 0x00, 0xFB, 0x17, 0x0B, 0x17, 0x10, 0x5C, 0x04, 0x17, 0xEE, 0x05, 0x00, 0x16, 0x05, 0x00, +/* 000087A0 */ 0x09, 0x08, 0x00, 0x47, 0x00, 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, +/* 000087B0 */ 0xFF, 0x4E, 0x06, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x91, 0x00, 0x08, 0x00, +/* 000087C0 */ 0x2A, 0x00, 0x36, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x08, 0x00, 0x33, 0x00, 0x3B, 0x00, +/* 000087D0 */ 0x81, 0x00, 0x0E, 0x00, 0x32, 0x00, 0x38, 0x00, 0x8A, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, +/* 000087E0 */ 0x5C, 0x85, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x50, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1F, +/* 000087F0 */ 0x04, 0x43, 0xFE, 0xF9, 0xFF, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xF9, 0xFF, 0xFE, +/* 00008800 */ 0x20, 0x05, 0xFE, 0x20, 0x05, 0x01, 0x09, 0x14, 0x19, 0x07, 0x50, 0x4B, 0x03, 0x05, 0x06, 0x06, +/* 00008810 */ 0x01, 0x01, 0x01, 0x01, 0x18, 0x05, 0xFE, 0x3A, 0x04, 0x05, 0xFE, 0x3B, 0x04, 0x08, 0x07, 0x05, +/* 00008820 */ 0xFE, 0x3C, 0x04, 0x05, 0xFE, 0x3D, 0x04, 0x05, 0xFE, 0x3E, 0x04, 0x01, 0x02, 0x05, 0xFE, 0x3F, +/* 00008830 */ 0x04, 0x05, 0xFE, 0x2E, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x40, 0x04, 0x01, 0x01, 0x06, 0xFE, 0x41, +/* 00008840 */ 0x04, 0x06, 0xFE, 0x42, 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x43, 0x04, 0x05, 0xFE, 0x44, +/* 00008850 */ 0x04, 0xFE, 0x43, 0x01, 0x8F, 0x03, 0x09, 0x1A, 0x00, 0x00, 0x6D, 0x19, 0x1A, 0x00, 0x07, 0x03, +/* 00008860 */ 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x14, 0x8F, 0x03, 0x0F, 0x1B, 0x01, 0x00, 0x07, 0x02, 0x00, +/* 00008870 */ 0x5C, 0x00, 0x04, 0xFB, 0x1C, 0x02, 0x16, 0x03, 0x5C, 0x01, 0x1C, 0xEE, 0x02, 0x1B, 0x1B, 0x01, +/* 00008880 */ 0x00, 0x5C, 0x02, 0x1B, 0xF2, 0x03, 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x17, +/* 00008890 */ 0x19, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x3C, 0x00, 0x8F, 0x03, 0x14, 0x19, 0x02, 0x00, 0x07, +/* 000088A0 */ 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x13, 0x1A, 0x03, 0x00, 0x07, 0x02, 0x00, 0xFC, 0x1B, +/* 000088B0 */ 0x06, 0x14, 0x06, 0xFE, 0x1B, 0x07, 0x02, 0x02, 0xFE, 0x1B, 0x16, 0x08, 0x04, 0x5C, 0x01, 0x1B, +/* 000088C0 */ 0xC3, 0x02, 0x1A, 0x1A, 0x03, 0x00, 0x5C, 0x01, 0x1A, 0xEE, 0x02, 0xFF, 0x19, 0x02, 0x00, 0x47, +/* 000088D0 */ 0x00, 0x14, 0x09, 0xC0, 0x00, 0x98, 0x19, 0x17, 0x09, 0x00, 0x00, 0x15, 0x03, 0x00, 0x19, 0x0A, +/* 000088E0 */ 0x09, 0x4E, 0x00, 0x14, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x46, 0x00, 0x8F, 0x03, 0x0C, 0x19, 0x04, +/* 000088F0 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x23, 0x1A, 0x05, 0x00, 0x5C, 0x01, 0x1A, +/* 00008900 */ 0x5C, 0x02, 0x14, 0x98, 0x1A, 0x17, 0x0C, 0x01, 0x00, 0x5C, 0x03, 0x1A, 0x98, 0x1A, 0x17, 0x0E, +/* 00008910 */ 0x02, 0x00, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, 0x2F, 0x1A, 0x1A, 0x0A, 0x2F, 0x1A, +/* 00008920 */ 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0x00, 0x19, 0x04, 0x00, 0x09, 0x67, 0x00, 0x09, 0x5C, +/* 00008930 */ 0x00, 0x15, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x54, 0x00, 0x8F, 0x03, 0x0C, 0x19, 0x04, 0x00, 0x07, +/* 00008940 */ 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x23, 0x1A, 0x05, 0x00, 0x5C, 0x01, 0x1A, 0x5C, 0x02, +/* 00008950 */ 0x14, 0x98, 0x1A, 0x17, 0x0C, 0x03, 0x00, 0x5C, 0x03, 0x1A, 0x98, 0x1A, 0x17, 0x0E, 0x04, 0x00, +/* 00008960 */ 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, 0x14, 0x03, 0x00, 0x15, 0x11, 0x09, 0x06, 0x00, +/* 00008970 */ 0x47, 0x1B, 0x12, 0x09, 0x03, 0x00, 0x47, 0x1B, 0x13, 0x2F, 0x1A, 0x1A, 0x1B, 0x2F, 0x1A, 0x1A, +/* 00008980 */ 0x10, 0x5C, 0x04, 0x1A, 0xEE, 0x05, 0x00, 0x19, 0x05, 0x00, 0x09, 0x08, 0x00, 0x47, 0x00, 0x14, +/* 00008990 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0xFF, 0xCF, 0x00, 0x01, 0x00, 0x0A, +/* 000089A0 */ 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x0F, 0x01, 0x08, 0x00, 0x2A, 0x00, 0x36, 0x00, 0xF5, 0x00, +/* 000089B0 */ 0x06, 0x00, 0x39, 0x00, 0x16, 0x00, 0x47, 0x00, 0x46, 0x00, 0x85, 0x00, 0x08, 0x00, 0x30, 0x00, +/* 000089C0 */ 0x54, 0x00, 0xC4, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0x4C, 0x81, 0x00, 0x00, 0xC4, 0x00, +/* 000089D0 */ 0xFE, 0x47, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1E, 0x04, 0x42, 0xFE, 0x92, 0xFE, 0xFF, +/* 000089E0 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x92, 0xFE, 0xE9, 0xE9, 0x01, 0x03, 0x05, 0x07, 0x0E, +/* 000089F0 */ 0x0B, 0x03, 0x01, 0x01, 0x06, 0x06, 0xFE, 0x72, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xFD, +/* 00008A00 */ 0x03, 0x2E, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x06, 0x00, 0x47, 0x00, 0x03, +/* 00008A10 */ 0x09, 0x1B, 0x00, 0x8F, 0x02, 0x02, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0x47, +/* 00008A20 */ 0x00, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 00008A30 */ 0xFE, 0xCD, 0xFE, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x06, 0x00, 0x2E, 0x00, +/* 00008A40 */ 0x1B, 0x00, 0x44, 0x00, 0x00, 0x3F, 0x5D, 0x8C, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x07, 0x05, 0x0C, +/* 00008A50 */ 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1D, 0x04, 0x40, 0xFE, 0x1A, 0xF3, 0x01, 0xFF, 0x00, 0x10, 0x01, +/* 00008A60 */ 0x00, 0x02, 0x02, 0xFE, 0x1A, 0xF3, 0xFE, 0x95, 0x09, 0xFE, 0x95, 0x09, 0x02, 0x06, 0x17, 0x1B, +/* 00008A70 */ 0x05, 0xCC, 0xCA, 0x03, 0x0D, 0x02, 0x07, 0x05, 0x05, 0x05, 0x05, 0x18, 0x19, 0x1A, 0x05, 0xFE, +/* 00008A80 */ 0x2B, 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x2D, 0x04, 0x08, 0x05, 0xFE, 0x2E, 0x04, 0x05, +/* 00008A90 */ 0xFE, 0x2F, 0x04, 0x05, 0xFE, 0x30, 0x04, 0x05, 0xFE, 0x31, 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x05, +/* 00008AA0 */ 0xFE, 0x32, 0x04, 0x05, 0xFE, 0x33, 0x04, 0x05, 0xFE, 0x34, 0x04, 0x05, 0xFE, 0x35, 0x04, 0x06, +/* 00008AB0 */ 0xFE, 0x27, 0x04, 0x05, 0xFE, 0x36, 0x04, 0x05, 0xFE, 0x37, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, +/* 00008AC0 */ 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x38, 0x04, 0xFE, 0x57, 0x03, +/* 00008AD0 */ 0x96, 0x03, 0x17, 0xCE, 0x1B, 0x00, 0x00, 0x00, 0x96, 0x02, 0x1B, 0x93, 0x03, 0x1B, 0x00, 0x00, +/* 00008AE0 */ 0x62, 0x1B, 0x1B, 0x00, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x86, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, +/* 00008AF0 */ 0x62, 0x1B, 0x1B, 0x00, 0x14, 0x14, 0x00, 0x1B, 0x02, 0x09, 0x00, 0x00, 0x93, 0x03, 0x1B, 0x00, +/* 00008B00 */ 0x00, 0x62, 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x2B, 0x00, 0x8F, 0x03, 0x0C, +/* 00008B10 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, +/* 00008B20 */ 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x04, 0x00, 0x00, 0xEE, +/* 00008B30 */ 0x04, 0xFF, 0x1B, 0x00, 0x00, 0x09, 0x39, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, +/* 00008B40 */ 0x00, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x28, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, +/* 00008B50 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, +/* 00008B60 */ 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x07, 0x01, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x01, +/* 00008B70 */ 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x75, +/* 00008B80 */ 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x08, 0x09, +/* 00008B90 */ 0x2B, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, +/* 00008BA0 */ 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, +/* 00008BB0 */ 0x03, 0x09, 0x02, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x02, 0x00, 0x09, 0x39, 0x00, 0x93, 0x03, 0x1B, +/* 00008BC0 */ 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x28, 0x00, 0x8F, 0x03, +/* 00008BD0 */ 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, +/* 00008BE0 */ 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0B, 0x03, 0x00, +/* 00008BF0 */ 0xEE, 0x04, 0xFF, 0x1B, 0x03, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x0F, +/* 00008C00 */ 0x03, 0x00, 0x1B, 0x09, 0xD3, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, +/* 00008C10 */ 0x14, 0x00, 0x1B, 0x08, 0x09, 0x00, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, +/* 00008C20 */ 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x2B, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, +/* 00008C30 */ 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, +/* 00008C40 */ 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0C, 0x04, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x04, 0x00, +/* 00008C50 */ 0x09, 0x86, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x14, 0x00, 0x1B, +/* 00008C60 */ 0x03, 0x09, 0x00, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, +/* 00008C70 */ 0x1B, 0x02, 0x09, 0x2B, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00008C80 */ 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, +/* 00008C90 */ 0x02, 0x1C, 0x5D, 0x03, 0x0D, 0x05, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x05, 0x00, 0x09, 0x39, 0x00, +/* 00008CA0 */ 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x28, +/* 00008CB0 */ 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, +/* 00008CC0 */ 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, +/* 00008CD0 */ 0x0E, 0x06, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x06, 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, +/* 00008CE0 */ 0x1B, 0x03, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x28, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, +/* 00008CF0 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, +/* 00008D00 */ 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x0F, 0x07, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x07, +/* 00008D10 */ 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x75, +/* 00008D20 */ 0x00, 0x93, 0x03, 0x1B, 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, +/* 00008D30 */ 0x2B, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, +/* 00008D40 */ 0x1E, 0x1C, 0x02, 0x00, 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, +/* 00008D50 */ 0x03, 0x10, 0x08, 0x00, 0xEE, 0x04, 0xFF, 0x1B, 0x08, 0x00, 0x09, 0x39, 0x00, 0x93, 0x03, 0x1B, +/* 00008D60 */ 0x00, 0x00, 0x62, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x28, 0x00, 0x8F, 0x03, +/* 00008D70 */ 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1E, 0x1C, 0x02, 0x00, +/* 00008D80 */ 0x5C, 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x11, 0x09, 0x00, +/* 00008D90 */ 0xEE, 0x04, 0xFF, 0x1B, 0x09, 0x00, 0x8F, 0x03, 0x0C, 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, +/* 00008DA0 */ 0x00, 0x05, 0x8F, 0x03, 0x1C, 0x1C, 0x04, 0x00, 0x5C, 0x01, 0x1C, 0xCE, 0x1C, 0x03, 0x01, 0x00, +/* 00008DB0 */ 0xA1, 0x00, 0x12, 0x1C, 0xA1, 0x01, 0x13, 0x1C, 0xA1, 0x02, 0x14, 0x1C, 0x5C, 0x02, 0x1C, 0xD4, +/* 00008DC0 */ 0x00, 0x1C, 0x5C, 0x03, 0x1C, 0xEE, 0x04, 0xFF, 0x1B, 0x0A, 0x00, 0x8F, 0x03, 0x0B, 0x1B, 0x05, +/* 00008DD0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x01, 0x1C, 0xEE, +/* 00008DE0 */ 0x02, 0x1B, 0x1B, 0x0B, 0x00, 0x11, 0x03, 0x00, 0x1B, 0x15, 0x09, 0x2E, 0x00, 0x8F, 0x03, 0x0C, +/* 00008DF0 */ 0x1B, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x1F, 0x1C, 0x06, 0x00, 0x5C, +/* 00008E00 */ 0x01, 0x1C, 0x93, 0x02, 0x1C, 0x03, 0x00, 0x5C, 0x02, 0x1C, 0x5D, 0x03, 0x16, 0x0C, 0x00, 0xEE, +/* 00008E10 */ 0x04, 0x1B, 0x1B, 0x0C, 0x00, 0x47, 0x00, 0x1B, 0x09, 0x05, 0x00, 0xA8, 0x1B, 0x47, 0x00, 0x1B, +/* 00008E20 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, +/* 00008E30 */ 0xFE, 0x80, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x39, 0x04, 0xFE, 0xFD, 0x01, 0xFE, 0x5B, 0xF3, 0x1C, +/* 00008E40 */ 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x24, 0x00, 0x10, 0x00, 0x2B, 0x00, 0x22, 0x00, 0x5B, 0x00, +/* 00008E50 */ 0x2B, 0x00, 0x63, 0x00, 0x11, 0x00, 0x3A, 0x00, 0x28, 0x00, 0xA5, 0x00, 0x10, 0x00, 0x28, 0x00, +/* 00008E60 */ 0x11, 0x00, 0x3A, 0x00, 0x2B, 0x00, 0x5E, 0x00, 0x11, 0x00, 0x3A, 0x00, 0x28, 0x00, 0x75, 0x00, +/* 00008E70 */ 0x10, 0x00, 0x29, 0x00, 0x22, 0x00, 0x5A, 0x00, 0x2B, 0x00, 0x5A, 0x00, 0x22, 0x00, 0x57, 0x00, +/* 00008E80 */ 0x2B, 0x00, 0x5F, 0x00, 0x11, 0x00, 0x38, 0x00, 0x28, 0x00, 0x76, 0x00, 0x10, 0x00, 0x27, 0x00, +/* 00008E90 */ 0x28, 0x00, 0x59, 0x00, 0x10, 0x00, 0x30, 0x00, 0x11, 0x00, 0x40, 0x00, 0x2B, 0x00, 0x62, 0x00, +/* 00008EA0 */ 0x11, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x79, 0x00, 0x35, 0x00, 0x3B, 0x01, 0x5A, 0x00, 0x72, 0x00, +/* 00008EB0 */ 0x00, 0xB5, 0x8E, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x31, 0x05, 0x55, +/* 00008EC0 */ 0xA2, 0x41, 0xD1, 0x00, 0x41, 0xFE, 0x46, 0xFB, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 00008ED0 */ 0x46, 0xFB, 0xAC, 0xAC, 0x41, 0x04, 0x03, 0x05, 0x05, 0x10, 0x10, 0x04, 0x01, 0x01, 0x04, 0x04, +/* 00008EE0 */ 0x08, 0x3E, 0x8F, 0x01, 0x03, 0x05, 0x00, 0x00, 0x98, 0x05, 0x05, 0x03, 0x00, 0x00, 0x0F, 0x03, +/* 00008EF0 */ 0x00, 0x05, 0x09, 0x27, 0x00, 0x8F, 0x04, 0x0C, 0x05, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00008F00 */ 0x02, 0x8F, 0x04, 0x1E, 0x06, 0x02, 0x00, 0x5C, 0x01, 0x06, 0x8F, 0x01, 0x02, 0x06, 0x03, 0x00, +/* 00008F10 */ 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0xEE, 0x04, 0xFF, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 00008F20 */ 0xFE, 0x6B, 0xFB, 0x03, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x2C, 0x00, 0x29, 0x00, 0x5A, 0x00, +/* 00008F30 */ 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x09, 0xC4, 0x10, 0xFE, 0xD4, 0x04, 0x0C, 0xA3, 0x41, 0xC1, 0x00, +/* 00008F40 */ 0xFE, 0x1C, 0x04, 0x3F, 0xFE, 0x61, 0xE9, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x61, +/* 00008F50 */ 0xE9, 0xFE, 0x21, 0x09, 0xFE, 0x21, 0x09, 0x01, 0x07, 0x15, 0x1A, 0x05, 0x93, 0x8D, 0x03, 0x08, +/* 00008F60 */ 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x19, 0x07, 0x08, 0x0B, 0x06, 0xFE, 0x15, 0x04, 0x05, 0xFE, +/* 00008F70 */ 0x12, 0x04, 0x0C, 0x05, 0xFE, 0x17, 0x04, 0x06, 0xFE, 0x13, 0x04, 0x06, 0xFE, 0x25, 0x04, 0x06, +/* 00008F80 */ 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x12, 0x03, 0x06, 0xFE, 0x13, 0x03, 0x06, +/* 00008F90 */ 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, +/* 00008FA0 */ 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0xFE, 0x6B, 0x02, 0xA8, 0x1A, 0x14, 0x03, 0x00, 0x15, +/* 00008FB0 */ 0x1A, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x0A, 0x1A, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, +/* 00008FC0 */ 0xCB, 0x1B, 0x5C, 0x01, 0x1B, 0x5D, 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, 0x1A, 0x1A, 0x00, 0x00, +/* 00008FD0 */ 0x47, 0x15, 0x1A, 0x09, 0x20, 0x00, 0x8F, 0x03, 0x31, 0x1B, 0x01, 0x00, 0x6D, 0x1A, 0x1B, 0x00, +/* 00008FE0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, 0xF2, 0x02, 0x1A, 0x1A, 0x00, 0x00, 0x00, +/* 00008FF0 */ 0x00, 0x01, 0x00, 0x47, 0x15, 0x1A, 0x47, 0x18, 0x04, 0x14, 0x0B, 0x00, 0x16, 0x05, 0x09, 0x00, +/* 00009000 */ 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x3B, 0x00, 0x62, 0x1A, 0x15, 0x01, 0xA8, 0x1B, 0x15, +/* 00009010 */ 0x2D, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x02, 0xA8, 0x1B, 0x15, 0x1F, 0x00, +/* 00009020 */ 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x03, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, +/* 00009030 */ 0x09, 0x00, 0x00, 0x62, 0x1A, 0x15, 0x04, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, +/* 00009040 */ 0x00, 0x47, 0x18, 0x07, 0x14, 0x0B, 0x00, 0x16, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, +/* 00009050 */ 0x06, 0x09, 0x2D, 0x00, 0x62, 0x1A, 0x15, 0x05, 0xA8, 0x1B, 0x15, 0x1F, 0x00, 0x1A, 0x1B, 0x09, +/* 00009060 */ 0x00, 0x00, 0x62, 0x1A, 0x15, 0x06, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, +/* 00009070 */ 0x62, 0x1A, 0x15, 0x07, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, 0x00, 0x47, 0x18, +/* 00009080 */ 0x07, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xBE, 0x00, 0x14, 0x0B, 0x00, 0x17, 0x05, 0x09, 0x00, 0x00, +/* 00009090 */ 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xAE, 0x00, 0x8F, 0x03, 0x1B, 0x1A, 0x02, 0x00, 0x07, 0x04, +/* 000090A0 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x0A, 0x02, 0x00, 0xCC, 0x00, 0x00, 0x00, +/* 000090B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, +/* 000090C0 */ 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, +/* 000090D0 */ 0x02, 0x00, 0x8F, 0x03, 0x1B, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, +/* 000090E0 */ 0x15, 0x5D, 0x02, 0x10, 0x03, 0x00, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1B, +/* 000090F0 */ 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, +/* 00009100 */ 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x03, 0x00, 0x8F, 0x03, 0x1B, 0x1A, +/* 00009110 */ 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x11, 0x04, 0x00, +/* 00009120 */ 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, +/* 00009130 */ 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, +/* 00009140 */ 0xEE, 0x04, 0xFF, 0x1A, 0x04, 0x00, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xBE, 0x00, 0x14, 0x0B, 0x00, +/* 00009150 */ 0x17, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xAE, 0x00, 0x8F, 0x03, 0x1B, +/* 00009160 */ 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x12, 0x05, +/* 00009170 */ 0x00, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, +/* 00009180 */ 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, +/* 00009190 */ 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x05, 0x00, 0x8F, 0x03, 0x1B, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, +/* 000091A0 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5D, 0x02, 0x13, 0x06, 0x00, 0xCC, 0x60, 0x00, 0x00, 0x00, +/* 000091B0 */ 0x04, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, +/* 000091C0 */ 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x06, +/* 000091D0 */ 0x00, 0x8F, 0x03, 0x1B, 0x1A, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, +/* 000091E0 */ 0x5D, 0x02, 0x14, 0x07, 0x00, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1B, 0x00, +/* 000091F0 */ 0x00, 0x00, 0x7B, 0x0C, 0x1B, 0x08, 0x7B, 0x04, 0x1B, 0x09, 0x7B, 0x04, 0x1B, 0x0A, 0x7B, 0x04, +/* 00009200 */ 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0xEE, 0x04, 0xFF, 0x1A, 0x07, 0x00, 0x47, 0x00, 0x15, 0x09, 0x02, +/* 00009210 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x06, 0x90, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 00009220 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 00009230 */ 0xB4, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00009240 */ 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, +/* 00009250 */ 0x48, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, +/* 00009260 */ 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, +/* 00009270 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, +/* 00009280 */ 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 00009290 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 000092A0 */ 0xB4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 000092B0 */ 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, +/* 000092C0 */ 0xFE, 0x66, 0x03, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x80, 0x02, 0xFE, +/* 000092D0 */ 0x82, 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, +/* 000092E0 */ 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xAB, 0xE9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x31, 0x00, +/* 000092F0 */ 0x22, 0x00, 0x4F, 0x00, 0x20, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x10, 0x00, 0x45, 0x00, +/* 00009300 */ 0x38, 0x00, 0x97, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x45, 0x00, 0x2A, 0x00, 0x7A, 0x00, +/* 00009310 */ 0x03, 0x00, 0x4F, 0x00, 0x17, 0x00, 0x57, 0x00, 0x3A, 0x00, 0xCB, 0x00, 0x3A, 0x00, 0xCC, 0x00, +/* 00009320 */ 0x3A, 0x00, 0xD8, 0x00, 0x17, 0x00, 0x57, 0x00, 0x3A, 0x00, 0xCB, 0x00, 0x3A, 0x00, 0xCD, 0x00, +/* 00009330 */ 0x3A, 0x00, 0xDB, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x5D, 0x8C, 0xE0, 0xA9, 0xD6, 0x92, +/* 00009340 */ 0xFE, 0xC7, 0x03, 0x18, 0xA0, 0x41, 0xD1, 0x00, 0x36, 0xFE, 0xF4, 0xB1, 0x06, 0xFF, 0x00, 0x10, +/* 00009350 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0xF4, 0xB1, 0xFE, 0x78, 0x36, 0xFE, 0x78, 0x36, 0x03, 0x0D, 0x2D, +/* 00009360 */ 0x33, 0x09, 0xC8, 0xC8, 0x01, 0x0E, 0x01, 0x0A, 0x10, 0x10, 0x10, 0x10, 0x07, 0x02, 0x30, 0x31, +/* 00009370 */ 0x32, 0x33, 0x06, 0xFE, 0xD6, 0x03, 0x01, 0x00, 0x06, 0xFE, 0xD7, 0x03, 0x06, 0xFE, 0xD8, 0x03, +/* 00009380 */ 0x01, 0x01, 0x06, 0xFE, 0xD9, 0x03, 0x01, 0x02, 0x06, 0xFE, 0xF1, 0x02, 0x01, 0x03, 0x07, 0x08, +/* 00009390 */ 0x06, 0xFE, 0xDA, 0x03, 0x06, 0xFE, 0xDB, 0x03, 0x06, 0xFE, 0xDC, 0x03, 0x06, 0xFE, 0x10, 0x03, +/* 000093A0 */ 0x06, 0xFE, 0xDD, 0x03, 0x05, 0xFE, 0xDE, 0x03, 0x05, 0xFE, 0xDF, 0x03, 0x05, 0xFE, 0xE0, 0x03, +/* 000093B0 */ 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0B, 0x06, 0xFE, 0x14, +/* 000093C0 */ 0x03, 0x06, 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0xE1, 0x03, 0x05, 0xFE, 0xE2, 0x03, 0x05, 0xFE, 0xE3, +/* 000093D0 */ 0x03, 0x05, 0xFE, 0xE4, 0x03, 0x05, 0xFE, 0xE5, 0x03, 0x05, 0xFE, 0xE6, 0x03, 0x05, 0xFE, 0xE7, +/* 000093E0 */ 0x03, 0x06, 0xFE, 0xE8, 0x03, 0x06, 0xFE, 0xE9, 0x03, 0x05, 0xFE, 0xEA, 0x03, 0x06, 0xFE, 0xB4, +/* 000093F0 */ 0x03, 0x0C, 0x06, 0xFE, 0x13, 0x03, 0x06, 0xFE, 0xB5, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, +/* 00009400 */ 0xEB, 0x03, 0x06, 0xFE, 0xB8, 0x03, 0x05, 0xFE, 0xEC, 0x03, 0xFE, 0x8A, 0x03, 0xA8, 0x2D, 0xA8, +/* 00009410 */ 0x2E, 0xA8, 0x2F, 0x4F, 0x35, 0x96, 0x03, 0x35, 0x4F, 0x35, 0x96, 0x04, 0x35, 0x8F, 0x01, 0x0A, +/* 00009420 */ 0x35, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00009430 */ 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7B, 0x03, 0x36, 0x00, 0x7B, 0x03, 0x36, 0x01, 0x7B, 0x06, +/* 00009440 */ 0x36, 0x02, 0x7B, 0x08, 0x36, 0x03, 0x7B, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x0B, +/* 00009450 */ 0x00, 0x00, 0xEE, 0x03, 0x35, 0x35, 0x00, 0x00, 0x96, 0x03, 0x35, 0x8F, 0x01, 0x0A, 0x35, 0x00, +/* 00009460 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x1C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +/* 00009470 */ 0x36, 0x00, 0x00, 0x00, 0x7B, 0x03, 0x36, 0x00, 0x7B, 0x03, 0x36, 0x05, 0x7B, 0x06, 0x36, 0x06, +/* 00009480 */ 0x7B, 0x08, 0x36, 0x07, 0x7B, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x0B, 0x01, 0x00, +/* 00009490 */ 0xEE, 0x03, 0x35, 0x35, 0x01, 0x00, 0x96, 0x04, 0x35, 0x8F, 0x01, 0x38, 0x35, 0x01, 0x00, 0x14, +/* 000094A0 */ 0x11, 0x00, 0x35, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x38, 0x35, 0x01, 0x00, 0x14, 0x03, 0x00, +/* 000094B0 */ 0x35, 0x11, 0x09, 0xD9, 0x02, 0xDE, 0x00, 0x03, 0x02, 0xB8, 0x35, 0x00, 0x01, 0x51, 0x01, 0x00, +/* 000094C0 */ 0x2D, 0x35, 0x95, 0x00, 0x02, 0x2D, 0x8F, 0x01, 0x09, 0x36, 0x02, 0x00, 0x6D, 0x35, 0x36, 0x08, +/* 000094D0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x36, 0x8F, 0x01, 0x2A, 0x37, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 000094E0 */ 0x00, 0x0C, 0x5D, 0x01, 0x12, 0x03, 0x00, 0xB8, 0x39, 0x00, 0x01, 0x51, 0x01, 0x01, 0x38, 0x39, +/* 000094F0 */ 0x5C, 0x02, 0x38, 0xEE, 0x03, 0x37, 0x37, 0x03, 0x00, 0x5C, 0x01, 0x37, 0x8F, 0x01, 0x3B, 0x37, +/* 00009500 */ 0x04, 0x00, 0x4B, 0x37, 0x62, 0x37, 0x37, 0x09, 0x5C, 0x02, 0x37, 0xF2, 0x03, 0xFF, 0x35, 0x08, +/* 00009510 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x38, 0x35, 0x01, 0x00, 0x14, 0x03, 0x00, 0x35, 0x10, +/* 00009520 */ 0x09, 0x6B, 0x02, 0xDE, 0x01, 0x04, 0x03, 0xB8, 0x35, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x35, +/* 00009530 */ 0x35, 0x01, 0x51, 0x01, 0x02, 0x2E, 0x35, 0x95, 0x01, 0x02, 0x2E, 0x01, 0x51, 0x01, 0x03, 0x2F, +/* 00009540 */ 0x35, 0x95, 0x01, 0x03, 0x2F, 0x8F, 0x01, 0x2A, 0x35, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00009550 */ 0x0C, 0x5D, 0x01, 0x13, 0x04, 0x00, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x5C, 0x02, 0x36, 0xEE, +/* 00009560 */ 0x03, 0xFF, 0x35, 0x04, 0x00, 0x8F, 0x01, 0x2A, 0x35, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00009570 */ 0x0C, 0x5D, 0x01, 0x14, 0x05, 0x00, 0x91, 0x01, 0x03, 0x36, 0x06, 0x00, 0x5C, 0x02, 0x36, 0xEE, +/* 00009580 */ 0x03, 0xFF, 0x35, 0x05, 0x00, 0x8F, 0x01, 0x1B, 0x35, 0x07, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00009590 */ 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x15, 0x06, 0x00, 0xCC, +/* 000095A0 */ 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x48, 0x37, +/* 000095B0 */ 0x08, 0x00, 0x4B, 0x37, 0x7B, 0x37, 0x36, 0x0A, 0x7B, 0x18, 0x36, 0x0B, 0x7B, 0x18, 0x36, 0x0C, +/* 000095C0 */ 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x06, 0x00, 0xCE, 0x35, 0x0B, 0x00, 0x00, 0xA1, 0x00, +/* 000095D0 */ 0x1A, 0x35, 0xA1, 0x01, 0x1B, 0x35, 0xA1, 0x02, 0x1C, 0x35, 0xA1, 0x03, 0x1D, 0x35, 0xA1, 0x04, +/* 000095E0 */ 0x1E, 0x35, 0xA1, 0x05, 0x1F, 0x35, 0xA1, 0x06, 0x20, 0x35, 0xA1, 0x07, 0x21, 0x35, 0xA1, 0x08, +/* 000095F0 */ 0x22, 0x35, 0xA1, 0x09, 0x23, 0x35, 0xA1, 0x0A, 0x24, 0x35, 0x96, 0x02, 0x35, 0x8F, 0x01, 0x1B, +/* 00009600 */ 0x35, 0x07, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x5C, +/* 00009610 */ 0x01, 0x36, 0x5D, 0x02, 0x25, 0x07, 0x00, 0xCC, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +/* 00009620 */ 0x36, 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x37, 0x05, 0x00, 0x07, 0x01, 0x00, 0xC3, 0x01, 0x37, +/* 00009630 */ 0x37, 0x08, 0x00, 0x7B, 0x37, 0x36, 0x0A, 0x7B, 0x26, 0x36, 0x0B, 0x7B, 0x26, 0x36, 0x0D, 0x7B, +/* 00009640 */ 0x26, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x07, 0x00, 0x8F, 0x01, 0x0A, 0x35, +/* 00009650 */ 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x62, 0x36, +/* 00009660 */ 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x8F, 0x01, 0x0E, 0x36, 0x09, 0x00, 0x62, 0x36, 0x36, 0x0E, 0x5C, +/* 00009670 */ 0x02, 0x36, 0xEE, 0x03, 0xFF, 0x35, 0x09, 0x00, 0x8F, 0x01, 0x1B, 0x35, 0x07, 0x00, 0x07, 0x04, +/* 00009680 */ 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x62, 0x36, 0x36, 0x0E, 0x5C, 0x01, +/* 00009690 */ 0x36, 0x5D, 0x02, 0x28, 0x0A, 0x00, 0xCC, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, +/* 000096A0 */ 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x37, 0x05, 0x00, 0x7B, 0x37, 0x36, 0x0A, 0x7B, 0x18, 0x36, +/* 000096B0 */ 0x0B, 0x7B, 0x26, 0x36, 0x0D, 0x7B, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, +/* 000096C0 */ 0x0A, 0x00, 0x8F, 0x01, 0x1B, 0x35, 0x07, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, +/* 000096D0 */ 0x02, 0x36, 0x05, 0x00, 0x62, 0x36, 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x29, 0x0B, 0x00, +/* 000096E0 */ 0xCC, 0x7C, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xB8, 0x38, 0x00, +/* 000096F0 */ 0xB7, 0x01, 0x00, 0x00, 0x00, 0x38, 0x38, 0x01, 0x51, 0x01, 0x04, 0x37, 0x38, 0x7B, 0x37, 0x36, +/* 00009700 */ 0x0A, 0x01, 0x65, 0x01, 0x37, 0x36, 0x7B, 0x18, 0x36, 0x0B, 0x7B, 0x26, 0x36, 0x0D, 0x7B, 0x18, +/* 00009710 */ 0x36, 0x0C, 0x5C, 0x03, 0x36, 0xEE, 0x04, 0xFF, 0x35, 0x0B, 0x00, 0x8F, 0x01, 0x1B, 0x35, 0x07, +/* 00009720 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x91, 0x01, 0x02, 0x36, 0x05, 0x00, 0x62, 0x36, 0x36, +/* 00009730 */ 0x0E, 0x5C, 0x01, 0x36, 0x5D, 0x02, 0x2A, 0x0C, 0x00, 0xCC, 0x94, 0x00, 0x00, 0x00, 0x06, 0x00, +/* 00009740 */ 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x2A, 0x37, 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00009750 */ 0x00, 0x0C, 0x5D, 0x01, 0x2C, 0x0D, 0x00, 0xB8, 0x39, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x39, +/* 00009760 */ 0x39, 0x01, 0x51, 0x01, 0x05, 0x38, 0x39, 0x5C, 0x02, 0x38, 0xEE, 0x03, 0x37, 0x37, 0x0D, 0x00, +/* 00009770 */ 0x7B, 0x37, 0x36, 0x0F, 0x7B, 0x26, 0x36, 0x0D, 0x7B, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0xEE, +/* 00009780 */ 0x04, 0xFF, 0x35, 0x0C, 0x00, 0x91, 0x01, 0x02, 0x00, 0x05, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, +/* 00009790 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x07, 0xA8, 0x00, 0x94, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 000097A0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 000097B0 */ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 000097C0 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x64, 0x00, +/* 000097D0 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 000097E0 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 000097F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00009800 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, +/* 00009810 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x1C, 0x00, +/* 00009820 */ 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xDA, 0x03, +/* 00009830 */ 0x00, 0x00, 0xDB, 0x03, 0x00, 0x00, 0xDC, 0x03, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x00, 0x00, +/* 00009840 */ 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xD7, 0x03, +/* 00009850 */ 0x00, 0x00, 0xD8, 0x03, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0xFE, 0xD6, +/* 00009860 */ 0x03, 0xFE, 0xD7, 0x03, 0xFE, 0xD8, 0x03, 0xFE, 0xD9, 0x03, 0xFE, 0xF1, 0x02, 0xFE, 0xDA, 0x03, +/* 00009870 */ 0xFE, 0xDB, 0x03, 0xFE, 0xDC, 0x03, 0xFE, 0x34, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xB6, 0x01, 0xFE, +/* 00009880 */ 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0x48, 0x01, 0xFE, 0xB7, 0x01, 0xFE, 0xFD, +/* 00009890 */ 0x01, 0xFE, 0xED, 0x03, 0xFE, 0xEE, 0x03, 0x02, 0x02, 0x01, 0x00, 0xFE, 0xEF, 0x03, 0x03, 0x02, +/* 000098A0 */ 0x00, 0xFE, 0x1C, 0x02, 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x59, 0xB2, 0x11, 0x10, 0x00, 0x00, 0x00, +/* 000098B0 */ 0x3E, 0x00, 0x94, 0x01, 0x3E, 0x00, 0x0B, 0x02, 0x2D, 0x00, 0x0A, 0x1C, 0x4F, 0x00, 0xD7, 0x02, +/* 000098C0 */ 0x30, 0x00, 0x5A, 0x04, 0x20, 0x00, 0x3B, 0x03, 0x20, 0x00, 0x52, 0x00, 0x44, 0x00, 0x9B, 0x00, +/* 000098D0 */ 0x34, 0x00, 0x1F, 0x01, 0x4F, 0x00, 0x99, 0x00, 0x2C, 0x00, 0x48, 0x00, 0x4A, 0x00, 0x9E, 0x00, +/* 000098E0 */ 0x59, 0x00, 0xC2, 0x04, 0x6A, 0x00, 0x16, 0x03, 0x09, 0x00, 0x84, 0x00, 0x07, 0x00, 0x16, 0x00, +/* 000098F0 */ 0x00, 0x0A, 0xA1, 0x00, 0x00, 0x97, 0x9F, 0x00, 0x00, 0x88, 0x9D, 0x00, 0x00, 0x12, 0x9C, 0x00, +/* 00009900 */ 0x00, 0x0D, 0x9A, 0x00, 0x00, 0x09, 0x99, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, +/* 00009910 */ 0xFE, 0xBB, 0x04, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x3D, 0xFE, 0x2D, 0xE5, 0xFF, 0x00, 0x10, 0x01, +/* 00009920 */ 0x00, 0x01, 0x01, 0xFE, 0x2D, 0xE5, 0xFE, 0x56, 0x02, 0xFE, 0x56, 0x02, 0x01, 0x05, 0x05, 0x08, +/* 00009930 */ 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, +/* 00009940 */ 0xFE, 0xF7, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x98, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, +/* 00009950 */ 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, +/* 00009960 */ 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, +/* 00009970 */ 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x09, +/* 00009980 */ 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0xF2, +/* 00009990 */ 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, +/* 000099A0 */ 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, 0x02, 0x0F, 0x27, 0x00, 0x08, 0x09, 0x00, +/* 000099B0 */ 0x00, 0x8F, 0x04, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 000099C0 */ 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, +/* 000099D0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 000099E0 */ 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x53, 0xE5, 0x07, +/* 000099F0 */ 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x84, 0x00, 0x20, 0x00, 0x4B, 0x00, +/* 00009A00 */ 0x15, 0x00, 0x69, 0x00, 0x24, 0x00, 0x84, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0x3F, 0x5D, 0x84, +/* 00009A10 */ 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0xA5, 0x04, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x3B, +/* 00009A20 */ 0xFE, 0x56, 0xE0, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x56, 0xE0, 0xFE, 0x08, +/* 00009A30 */ 0x04, 0xFE, 0x08, 0x04, 0x02, 0x06, 0x07, 0x0B, 0x05, 0x40, 0x40, 0x04, 0x06, 0x07, 0x03, 0x03, +/* 00009A40 */ 0x03, 0x03, 0x08, 0x09, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xF8, 0x03, 0x06, 0xFE, 0x15, +/* 00009A50 */ 0x03, 0x07, 0x08, 0xFE, 0x06, 0x01, 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x2C, 0x0B, 0x07, 0x15, 0x03, +/* 00009A60 */ 0x00, 0x0B, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, +/* 00009A70 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, +/* 00009A80 */ 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, +/* 00009A90 */ 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, +/* 00009AA0 */ 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x96, 0x02, 0x0B, 0x93, 0x02, 0x0B, 0x01, 0x00, 0xA8, +/* 00009AB0 */ 0x0C, 0x14, 0x13, 0x00, 0x0B, 0x0C, 0x09, 0x00, 0x00, 0x93, 0x02, 0x0B, 0x01, 0x00, 0x62, 0x0B, +/* 00009AC0 */ 0x0B, 0x02, 0x0F, 0x27, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x00, 0x00, 0x6D, +/* 00009AD0 */ 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, +/* 00009AE0 */ 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x04, 0x0A, +/* 00009AF0 */ 0x0B, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, +/* 00009B00 */ 0x05, 0x03, 0x00, 0xEE, 0x03, 0x0B, 0x0B, 0x03, 0x00, 0x96, 0x03, 0x0B, 0x8F, 0x04, 0x0C, 0x0B, +/* 00009B10 */ 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x04, 0x1C, 0x0C, 0x04, 0x00, 0x5C, 0x01, +/* 00009B20 */ 0x0C, 0x8F, 0x03, 0x02, 0x0C, 0x05, 0x00, 0x5C, 0x02, 0x0C, 0xD4, 0x00, 0x0C, 0x5C, 0x03, 0x0C, +/* 00009B30 */ 0xEE, 0x04, 0xFF, 0x0B, 0x04, 0x00, 0x8F, 0x04, 0x0A, 0x0B, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00009B40 */ 0x00, 0x06, 0x93, 0x03, 0x0C, 0x06, 0x00, 0x5C, 0x01, 0x0C, 0xCB, 0x0C, 0x5C, 0x02, 0x0C, 0xEE, +/* 00009B50 */ 0x03, 0x00, 0x0B, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, +/* 00009B60 */ 0x35, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0xF9, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x8B, 0xE0, 0x09, 0x05, +/* 00009B70 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x8C, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x1F, +/* 00009B80 */ 0x00, 0x69, 0x00, 0x24, 0x00, 0x8D, 0x00, 0x1F, 0x00, 0x47, 0x00, 0x2A, 0x00, 0x44, 0x01, 0x24, +/* 00009B90 */ 0x00, 0x3E, 0x00, 0x00, 0x98, 0x9B, 0x00, 0x00, 0xBF, 0x4C, 0x83, 0x00, 0x00, 0xC4, 0x00, 0xFE, +/* 00009BA0 */ 0xB0, 0x04, 0x48, 0xA2, 0x41, 0xD1, 0x00, 0x3C, 0xFE, 0x0B, 0xE3, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00009BB0 */ 0x02, 0x02, 0xFE, 0x0B, 0xE3, 0xF8, 0xF8, 0x41, 0x05, 0x04, 0x06, 0x0D, 0x0D, 0x05, 0x01, 0x01, +/* 00009BC0 */ 0x02, 0x05, 0x05, 0xFE, 0xFA, 0x03, 0x06, 0xFE, 0x72, 0x03, 0x36, 0x8F, 0x01, 0x02, 0x06, 0x00, +/* 00009BD0 */ 0x00, 0x2F, 0x07, 0x02, 0x04, 0x2D, 0x06, 0x06, 0x07, 0x15, 0x03, 0x00, 0x06, 0x03, 0x09, 0x1C, +/* 00009BE0 */ 0x00, 0x8F, 0x01, 0x03, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x02, 0x07, 0x00, 0x00, 0x2F, 0x08, 0x02, +/* 00009BF0 */ 0x04, 0x98, 0x07, 0x07, 0x08, 0x00, 0x00, 0x9D, 0x07, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, +/* 00009C00 */ 0x00, 0xFE, 0x3B, 0xE3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x5A, 0x00, 0x1E, 0x00, 0x6D, +/* 00009C10 */ 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x89, 0x04, 0x10, 0xA3, 0x41, 0xC1, +/* 00009C20 */ 0x00, 0xFE, 0xEB, 0x03, 0x3A, 0xFE, 0x7A, 0xD9, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 00009C30 */ 0x7A, 0xD9, 0xFE, 0xE3, 0x02, 0xFE, 0xE3, 0x02, 0x01, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, +/* 00009C40 */ 0x06, 0x03, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xF7, 0x03, 0x06, +/* 00009C50 */ 0xFE, 0x15, 0x03, 0x01, 0x00, 0x08, 0xFD, 0x5B, 0x08, 0xB4, 0x08, 0x08, 0x8F, 0x04, 0x31, 0x0C, +/* 00009C60 */ 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, +/* 00009C70 */ 0x02, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0x0B, 0x2C, 0x0B, 0x08, 0x15, +/* 00009C80 */ 0x03, 0x00, 0x0B, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, +/* 00009C90 */ 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x01, 0x00, 0x5D, 0x02, 0x04, 0x01, +/* 00009CA0 */ 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x01, +/* 00009CB0 */ 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, +/* 00009CC0 */ 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, +/* 00009CD0 */ 0x09, 0x0B, 0x09, 0x00, 0x00, 0x62, 0x0B, 0x09, 0x03, 0x0F, 0x27, 0x00, 0x0B, 0x09, 0x00, 0x00, +/* 00009CE0 */ 0x8F, 0x04, 0x09, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, +/* 00009CF0 */ 0x5D, 0x01, 0x03, 0x03, 0x00, 0x5D, 0x02, 0x04, 0x03, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x01, 0x00, +/* 00009D00 */ 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x11, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, +/* 00009D10 */ 0x8F, 0x04, 0x09, 0x0D, 0x01, 0x00, 0x6D, 0x0C, 0x0D, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0D, +/* 00009D20 */ 0x2A, 0x0E, 0x05, 0x14, 0x03, 0x00, 0x07, 0x0E, 0x09, 0x06, 0x00, 0x47, 0x0E, 0x05, 0x09, 0x03, +/* 00009D30 */ 0x00, 0x47, 0x0E, 0x07, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x09, 0xF2, 0x03, 0x0C, 0x0C, 0x04, 0x00, +/* 00009D40 */ 0x00, 0x00, 0x05, 0x00, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x04, 0x00, 0x09, 0x02, 0x00, +/* 00009D50 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5E, 0x02, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, 0x02, +/* 00009D60 */ 0xFE, 0x2F, 0x02, 0xFE, 0xA3, 0xD9, 0x08, 0x05, 0x00, 0x00, 0x00, 0x20, 0x00, 0x2F, 0x00, 0x0B, +/* 00009D70 */ 0x00, 0x38, 0x00, 0x24, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x47, 0x00, 0x15, 0x00, 0x65, 0x00, 0x24, +/* 00009D80 */ 0x00, 0xD4, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, +/* 00009D90 */ 0x6D, 0x04, 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x15, 0x03, 0x39, 0xFE, 0x04, 0xD5, 0xFF, 0x00, +/* 00009DA0 */ 0x10, 0x01, 0x00, 0x03, 0x01, 0xFE, 0x04, 0xD5, 0xFE, 0x1E, 0x04, 0xFE, 0x1E, 0x04, 0x01, 0x09, +/* 00009DB0 */ 0x05, 0x0B, 0x05, 0x62, 0x5B, 0x04, 0x09, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, +/* 00009DC0 */ 0x15, 0x03, 0x07, 0xFE, 0x79, 0x01, 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, +/* 00009DD0 */ 0x05, 0x00, 0x05, 0x02, 0xA8, 0x0B, 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, +/* 00009DE0 */ 0x47, 0x06, 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x6B, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, +/* 00009DF0 */ 0x07, 0x0B, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x1A, 0x00, 0x8F, +/* 00009E00 */ 0x01, 0x02, 0x0B, 0x00, 0x00, 0x4B, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, +/* 00009E10 */ 0xC3, 0x03, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x24, 0x01, 0x8F, 0x04, 0x31, 0x0C, 0x01, 0x00, 0x6D, +/* 00009E20 */ 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, +/* 00009E30 */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x08, 0x0B, 0x8F, 0x04, 0x17, 0x0B, 0x02, 0x00, 0x07, +/* 00009E40 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0xEE, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x0F, 0x22, +/* 00009E50 */ 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, +/* 00009E60 */ 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0B, 0x01, 0x00, +/* 00009E70 */ 0x00, 0x00, 0x03, 0x00, 0x8F, 0x04, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, +/* 00009E80 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x04, +/* 00009E90 */ 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x3F, 0x00, 0x8F, 0x04, +/* 00009EA0 */ 0x0A, 0x0B, 0x04, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, +/* 00009EB0 */ 0x02, 0x04, 0x05, 0x00, 0xEE, 0x03, 0x0B, 0x0B, 0x05, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x04, 0x09, +/* 00009EC0 */ 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, +/* 00009ED0 */ 0x5C, 0x02, 0x09, 0xF2, 0x03, 0xFF, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x8F, 0x02, 0x02, +/* 00009EE0 */ 0x0B, 0x05, 0x00, 0x4B, 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, +/* 00009EF0 */ 0x05, 0x5C, 0x03, 0x06, 0xEE, 0x04, 0xFF, 0x0B, 0x07, 0x00, 0x47, 0x0B, 0x09, 0x8F, 0x04, 0x0C, +/* 00009F00 */ 0x0C, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x04, 0x20, 0x0D, 0x07, 0x00, 0x5C, +/* 00009F10 */ 0x01, 0x0D, 0x8F, 0x01, 0x03, 0x0D, 0x08, 0x00, 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, +/* 00009F20 */ 0xEE, 0x04, 0x0C, 0x0C, 0x08, 0x00, 0x77, 0x0C, 0x0B, 0x04, 0x62, 0x0B, 0x09, 0x05, 0x82, 0x0B, +/* 00009F30 */ 0x0B, 0x2B, 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 00009F40 */ 0x66, 0x03, 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x7A, +/* 00009F50 */ 0x02, 0xDD, 0xFE, 0x1A, 0xD5, 0x10, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, +/* 00009F60 */ 0x2B, 0x00, 0x18, 0x00, 0x43, 0x00, 0x1A, 0x00, 0x56, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, +/* 00009F70 */ 0x38, 0x00, 0x1F, 0x00, 0x9B, 0x00, 0x20, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x1F, 0x00, +/* 00009F80 */ 0x3F, 0x00, 0x20, 0x00, 0x58, 0x00, 0x1D, 0x00, 0x4D, 0x00, 0x30, 0x00, 0x65, 0x00, 0x0B, 0x00, +/* 00009F90 */ 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x03, 0xC4, 0x00, 0xFE, 0x5F, +/* 00009FA0 */ 0x04, 0x62, 0xA0, 0x41, 0xF1, 0x00, 0x38, 0xFE, 0x58, 0xD2, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, +/* 00009FB0 */ 0x01, 0xFE, 0x58, 0xD2, 0xFE, 0x44, 0x02, 0xFE, 0x44, 0x02, 0x03, 0x09, 0x09, 0x0E, 0x07, 0x40, +/* 00009FC0 */ 0x3C, 0x03, 0x02, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0x0D, 0x07, 0x06, 0xFE, 0x6E, 0x03, +/* 00009FD0 */ 0x05, 0xFE, 0xDE, 0x03, 0x06, 0xFE, 0xDD, 0x03, 0x08, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x00, 0x01, +/* 00009FE0 */ 0xAE, 0x0B, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0x2C, 0x0E, 0x09, 0x15, 0x03, 0x00, 0x0E, 0x03, 0x09, +/* 00009FF0 */ 0x36, 0x00, 0x8F, 0x03, 0x10, 0x0E, 0x00, 0x00, 0xE1, 0x0E, 0x09, 0x0E, 0x00, 0x0F, 0x27, 0x00, +/* 0000A000 */ 0x0E, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x0F, 0x01, 0x00, 0x6D, 0x0E, 0x0F, 0x00, 0x07, 0x03, +/* 0000A010 */ 0x00, 0x5C, 0x00, 0x0F, 0x5D, 0x01, 0x04, 0x00, 0x00, 0x5D, 0x02, 0x05, 0x00, 0x00, 0xF2, 0x03, +/* 0000A020 */ 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x0A, 0x0E, 0x02, 0x00, 0x07, 0x03, +/* 0000A030 */ 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5D, 0x02, 0x02, 0x01, 0x00, 0xEE, 0x03, +/* 0000A040 */ 0x0E, 0x0E, 0x01, 0x00, 0x47, 0x0A, 0x0E, 0x8F, 0x01, 0x02, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x07, +/* 0000A050 */ 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0A, 0x98, 0x0F, 0x0B, 0x07, 0x00, 0x00, 0x5C, 0x02, +/* 0000A060 */ 0x0F, 0x98, 0x0F, 0x0B, 0x08, 0x01, 0x00, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0xFF, 0x0E, 0x02, 0x00, +/* 0000A070 */ 0x8F, 0x03, 0x31, 0x0F, 0x04, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, +/* 0000A080 */ 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0C, 0x0E, +/* 0000A090 */ 0x8F, 0x03, 0x11, 0x0E, 0x05, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x03, 0x09, 0x10, +/* 0000A0A0 */ 0x01, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x2A, 0x11, 0x07, 0x14, +/* 0000A0B0 */ 0x03, 0x00, 0x0C, 0x11, 0x09, 0x06, 0x00, 0x47, 0x11, 0x07, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0C, +/* 0000A0C0 */ 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0xF2, 0x03, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, +/* 0000A0D0 */ 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x00, 0x0E, 0x04, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000A0E0 */ 0xFE, 0x69, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x2F, 0x02, 0xFE, 0x76, 0xD2, 0x07, 0x07, 0x00, 0x00, +/* 0000A0F0 */ 0x00, 0x1D, 0x00, 0x53, 0x00, 0x24, 0x00, 0x70, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x29, 0x00, 0x52, +/* 0000A100 */ 0x00, 0x20, 0x00, 0x85, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x00, 0xBF, 0x5C, 0x8C, 0xE0, 0x21, 0xD4, +/* 0000A110 */ 0x00, 0xFE, 0xD9, 0x03, 0x0C, 0xB3, 0x41, 0xC1, 0x00, 0xFE, 0xEF, 0x03, 0x37, 0xFE, 0x38, 0xB6, +/* 0000A120 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x38, 0xB6, 0xFE, 0xBC, 0x1B, 0xFE, 0xBC, 0x1B, +/* 0000A130 */ 0x45, 0x18, 0x23, 0x37, 0x07, 0xFE, 0x9B, 0x01, 0xFE, 0x7B, 0x01, 0x03, 0x22, 0x04, 0x12, 0x26, +/* 0000A140 */ 0x26, 0x26, 0x26, 0x01, 0x36, 0x37, 0x06, 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, 0x08, 0x06, +/* 0000A150 */ 0xFE, 0x15, 0x03, 0x0B, 0x06, 0xFE, 0x72, 0x03, 0x07, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, +/* 0000A160 */ 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x05, 0xFE, 0xE2, 0x03, 0x05, 0xFE, 0xF0, +/* 0000A170 */ 0x03, 0x05, 0xFE, 0xF1, 0x03, 0x05, 0xFE, 0xE3, 0x03, 0x05, 0xFE, 0xE4, 0x03, 0x05, 0xFE, 0xF2, +/* 0000A180 */ 0x03, 0x06, 0xFE, 0xF3, 0x03, 0x06, 0xFE, 0xF8, 0x02, 0x05, 0xFE, 0xE5, 0x03, 0x01, 0x01, 0x01, +/* 0000A190 */ 0x15, 0x06, 0xFE, 0xE8, 0x03, 0x06, 0xFE, 0xE9, 0x03, 0x05, 0xFE, 0xEA, 0x03, 0x06, 0xFE, 0x6C, +/* 0000A1A0 */ 0x03, 0x05, 0xFE, 0xF4, 0x03, 0x05, 0xFE, 0xE6, 0x03, 0x01, 0x00, 0x01, 0x14, 0x01, 0x03, 0x05, +/* 0000A1B0 */ 0xFE, 0xE7, 0x03, 0x05, 0xFE, 0xF5, 0x03, 0xFE, 0x79, 0x06, 0x2C, 0x38, 0x23, 0x0D, 0x03, 0x00, +/* 0000A1C0 */ 0x38, 0x02, 0x09, 0x1A, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x00, 0x07, +/* 0000A1D0 */ 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF2, 0x01, 0xFF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, +/* 0000A1E0 */ 0x03, 0x0C, 0x38, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x03, 0x19, 0x39, 0x02, +/* 0000A1F0 */ 0x00, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x23, 0x5D, 0x03, 0x03, 0x01, 0x00, 0xEE, 0x04, 0x38, 0x38, +/* 0000A200 */ 0x01, 0x00, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x2F, 0x00, 0x62, 0x38, 0x23, 0x01, 0x0F, 0x03, 0x00, +/* 0000A210 */ 0x38, 0x09, 0x24, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x02, 0x07, 0x03, +/* 0000A220 */ 0x00, 0x5C, 0x00, 0x39, 0x5D, 0x01, 0x05, 0x02, 0x00, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, +/* 0000A230 */ 0xFF, 0x38, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x77, 0x06, 0x23, 0x03, 0x2C, 0x38, 0x25, 0x14, +/* 0000A240 */ 0x03, 0x00, 0x38, 0x07, 0x09, 0x22, 0x00, 0x8F, 0x03, 0x0A, 0x38, 0x03, 0x00, 0x07, 0x03, 0x00, +/* 0000A250 */ 0x5C, 0x00, 0x04, 0xCB, 0x39, 0x5C, 0x01, 0x39, 0x5D, 0x02, 0x08, 0x03, 0x00, 0xEE, 0x03, 0x38, +/* 0000A260 */ 0x38, 0x03, 0x00, 0x47, 0x25, 0x38, 0x09, 0x20, 0x00, 0x8F, 0x03, 0x31, 0x39, 0x04, 0x00, 0x6D, +/* 0000A270 */ 0x38, 0x39, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x25, 0xF2, 0x02, 0x38, 0x38, +/* 0000A280 */ 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x25, 0x38, 0x8F, 0x03, 0x02, 0x38, 0x05, 0x00, 0x07, +/* 0000A290 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x09, 0x05, 0x00, 0x5D, 0x03, 0x0A, +/* 0000A2A0 */ 0x05, 0x00, 0xCE, 0x39, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x39, 0xA1, 0x01, 0x0C, 0x39, 0x5C, +/* 0000A2B0 */ 0x04, 0x39, 0x5D, 0x05, 0x0C, 0x05, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x05, 0x00, 0x47, 0x28, 0x38, +/* 0000A2C0 */ 0x8F, 0x03, 0x02, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, +/* 0000A2D0 */ 0x02, 0x0D, 0x06, 0x00, 0x5D, 0x03, 0x0A, 0x06, 0x00, 0xCE, 0x39, 0x03, 0x01, 0x00, 0xA1, 0x00, +/* 0000A2E0 */ 0x0E, 0x39, 0xA1, 0x01, 0x0F, 0x39, 0xA1, 0x02, 0x10, 0x39, 0x5C, 0x04, 0x39, 0x5D, 0x05, 0x0E, +/* 0000A2F0 */ 0x06, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x06, 0x00, 0x47, 0x29, 0x38, 0x8F, 0x02, 0x03, 0x38, 0x06, +/* 0000A300 */ 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x05, 0x47, 0x2A, 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, 0x09, +/* 0000A310 */ 0x12, 0x00, 0x8F, 0x02, 0x03, 0x38, 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x06, 0x47, 0x2A, +/* 0000A320 */ 0x38, 0x09, 0x17, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x0F, 0x00, 0x8F, 0x02, 0x03, 0x38, +/* 0000A330 */ 0x06, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x07, 0x47, 0x2A, 0x38, 0x8F, 0x03, 0x02, 0x38, 0x05, +/* 0000A340 */ 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x10, 0x07, 0x00, 0x5D, +/* 0000A350 */ 0x03, 0x0A, 0x07, 0x00, 0xA8, 0x39, 0x5C, 0x04, 0x39, 0xA8, 0x39, 0x5C, 0x05, 0x39, 0xEE, 0x06, +/* 0000A360 */ 0x38, 0x38, 0x07, 0x00, 0x47, 0x2B, 0x38, 0x8F, 0x03, 0x02, 0x38, 0x05, 0x00, 0x07, 0x06, 0x00, +/* 0000A370 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x11, 0x08, 0x00, 0x5D, 0x03, 0x0A, 0x08, 0x00, +/* 0000A380 */ 0xCE, 0x39, 0x03, 0x02, 0x00, 0xA1, 0x00, 0x12, 0x39, 0xA1, 0x01, 0x13, 0x39, 0xA1, 0x02, 0x14, +/* 0000A390 */ 0x39, 0x5C, 0x04, 0x39, 0x5D, 0x05, 0x13, 0x08, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x08, 0x00, 0x47, +/* 0000A3A0 */ 0x2C, 0x38, 0xA8, 0x38, 0x47, 0x2D, 0x38, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, +/* 0000A3B0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x15, 0x09, 0x00, 0x5D, 0x03, 0x16, 0x09, 0x00, +/* 0000A3C0 */ 0x5D, 0x04, 0x17, 0x09, 0x00, 0x5D, 0x05, 0x16, 0x09, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x09, 0x00, +/* 0000A3D0 */ 0x47, 0x2E, 0x38, 0xA8, 0x38, 0x47, 0x2F, 0x38, 0xA8, 0x38, 0x47, 0x30, 0x38, 0xA8, 0x38, 0x47, +/* 0000A3E0 */ 0x31, 0x38, 0x62, 0x38, 0x25, 0x08, 0x47, 0x32, 0x38, 0x62, 0x38, 0x25, 0x09, 0x47, 0x33, 0x38, +/* 0000A3F0 */ 0x2C, 0x38, 0x32, 0x15, 0x0E, 0x00, 0x38, 0x07, 0x09, 0x00, 0x00, 0x2C, 0x38, 0x33, 0x15, 0x03, +/* 0000A400 */ 0x00, 0x38, 0x07, 0x09, 0x56, 0x00, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, +/* 0000A410 */ 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x18, 0x0A, 0x00, 0x5D, 0x03, 0x16, 0x0A, 0x00, 0x5D, +/* 0000A420 */ 0x04, 0x17, 0x0A, 0x00, 0x5D, 0x05, 0x16, 0x0A, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x0A, 0x00, 0x47, +/* 0000A430 */ 0x32, 0x38, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 0000A440 */ 0x25, 0x5D, 0x02, 0x19, 0x0B, 0x00, 0x5C, 0x03, 0x32, 0x5D, 0x04, 0x17, 0x0B, 0x00, 0x5D, 0x05, +/* 0000A450 */ 0x17, 0x0B, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x0B, 0x00, 0x47, 0x33, 0x38, 0x8F, 0x03, 0x02, 0x38, +/* 0000A460 */ 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x1A, 0x0C, 0x00, +/* 0000A470 */ 0x5D, 0x03, 0x1B, 0x0C, 0x00, 0xA8, 0x39, 0x5C, 0x04, 0x39, 0x5D, 0x05, 0x06, 0x0C, 0x00, 0xEE, +/* 0000A480 */ 0x06, 0x38, 0x38, 0x0C, 0x00, 0x47, 0x34, 0x38, 0x8F, 0x03, 0x07, 0x38, 0x08, 0x00, 0x07, 0x02, +/* 0000A490 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0xEE, 0x02, 0x38, 0x38, 0x0D, 0x00, 0x47, 0x24, 0x38, +/* 0000A4A0 */ 0x8F, 0x03, 0x2F, 0x38, 0x09, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0x5C, +/* 0000A4B0 */ 0x02, 0x28, 0xCE, 0x39, 0x01, 0x03, 0x00, 0xA1, 0x00, 0x1C, 0x39, 0x5C, 0x03, 0x39, 0x8F, 0x03, +/* 0000A4C0 */ 0x30, 0x39, 0x0A, 0x00, 0x5C, 0x04, 0x39, 0xEE, 0x05, 0x38, 0x38, 0x0E, 0x00, 0x47, 0x35, 0x38, +/* 0000A4D0 */ 0x2C, 0x38, 0x2B, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x4E, 0x00, 0x8F, 0x03, 0x06, 0x38, 0x0B, +/* 0000A4E0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xEE, 0x02, 0x38, 0x38, 0x0F, 0x00, +/* 0000A4F0 */ 0x0F, 0x35, 0x00, 0x38, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, +/* 0000A500 */ 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8F, 0x03, 0x11, 0x3A, 0x0C, 0x00, 0x07, 0x02, 0x00, +/* 0000A510 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xEE, 0x02, 0x3A, 0x3A, 0x11, 0x00, 0x5C, 0x01, 0x3A, 0xF2, +/* 0000A520 */ 0x02, 0xFF, 0x38, 0x0A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x08, +/* 0000A530 */ 0x01, 0x2C, 0x38, 0x2B, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x1A, 0x00, 0x8F, 0x03, 0x09, 0x39, +/* 0000A540 */ 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF2, 0x01, 0xFF, 0x38, +/* 0000A550 */ 0x0B, 0x00, 0x00, 0x00, 0x12, 0x00, 0x8F, 0x03, 0x0C, 0x38, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 0000A560 */ 0x00, 0x04, 0x8F, 0x03, 0x25, 0x39, 0x0D, 0x00, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x2B, 0xEE, 0x03, +/* 0000A570 */ 0x38, 0x38, 0x13, 0x00, 0x47, 0x2B, 0x38, 0xE5, 0x24, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, +/* 0000A580 */ 0x6D, 0x38, 0x39, 0x0C, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2B, 0xF2, 0x02, 0x38, +/* 0000A590 */ 0x38, 0x0C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x47, 0x2D, 0x38, 0xE9, 0x09, 0x4B, 0x00, 0xE7, 0x26, +/* 0000A5A0 */ 0x06, 0x8F, 0x03, 0x29, 0x38, 0x0E, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, +/* 0000A5B0 */ 0xEE, 0x02, 0xFF, 0x38, 0x15, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x0A, +/* 0000A5C0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8F, 0x03, 0x11, 0x3A, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 0000A5D0 */ 0x00, 0x04, 0x5C, 0x01, 0x2B, 0xEE, 0x02, 0x3A, 0x3A, 0x17, 0x00, 0x5C, 0x01, 0x3A, 0xF2, 0x02, +/* 0000A5E0 */ 0xFF, 0x38, 0x0A, 0x00, 0x00, 0x00, 0x16, 0x00, 0xE9, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, +/* 0000A5F0 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x1D, 0x18, 0x00, 0x5D, 0x03, 0x1E, +/* 0000A600 */ 0x18, 0x00, 0x5D, 0x04, 0x1F, 0x18, 0x00, 0x5C, 0x05, 0x2D, 0xEE, 0x06, 0x38, 0x38, 0x18, 0x00, +/* 0000A610 */ 0x47, 0x2F, 0x38, 0x8F, 0x03, 0x15, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, +/* 0000A620 */ 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2D, 0x5C, 0x02, 0x2F, 0xF2, 0x03, 0x38, 0x38, 0x0D, 0x00, 0x00, +/* 0000A630 */ 0x00, 0x19, 0x00, 0x47, 0x31, 0x38, 0x09, 0x8B, 0x00, 0xA8, 0x38, 0x47, 0x2B, 0x38, 0xA8, 0x38, +/* 0000A640 */ 0x47, 0x2C, 0x38, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 0000A650 */ 0x01, 0x25, 0x5D, 0x02, 0x1D, 0x1A, 0x00, 0x5D, 0x03, 0x1E, 0x1A, 0x00, 0x5D, 0x04, 0x1F, 0x1A, +/* 0000A660 */ 0x00, 0x5D, 0x05, 0x1E, 0x1A, 0x00, 0xEE, 0x06, 0x38, 0x38, 0x1A, 0x00, 0x47, 0x2F, 0x38, 0x14, +/* 0000A670 */ 0x03, 0x00, 0x29, 0x0F, 0x09, 0x28, 0x00, 0x8F, 0x03, 0x15, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, +/* 0000A680 */ 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5D, 0x02, 0x1E, 0x1B, 0x00, 0xF2, +/* 0000A690 */ 0x03, 0x38, 0x38, 0x0D, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x47, 0x31, 0x38, 0x09, 0x25, 0x00, 0x8F, +/* 0000A6A0 */ 0x03, 0x15, 0x39, 0x0F, 0x00, 0x6D, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, +/* 0000A6B0 */ 0x01, 0x2F, 0x5D, 0x02, 0x20, 0x1C, 0x00, 0xF2, 0x03, 0x38, 0x38, 0x0D, 0x00, 0x00, 0x00, 0x1C, +/* 0000A6C0 */ 0x00, 0x47, 0x31, 0x38, 0x8F, 0x03, 0x03, 0x38, 0x07, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 0000A6D0 */ 0x5C, 0x01, 0x25, 0x5D, 0x02, 0x21, 0x1D, 0x00, 0x5C, 0x03, 0x2F, 0x5D, 0x04, 0x1F, 0x1D, 0x00, +/* 0000A6E0 */ 0x5C, 0x05, 0x31, 0xEE, 0x06, 0x38, 0x38, 0x1D, 0x00, 0x47, 0x30, 0x38, 0x77, 0x28, 0x23, 0x0E, +/* 0000A6F0 */ 0x62, 0x38, 0x35, 0x0F, 0x77, 0x38, 0x23, 0x10, 0x77, 0x29, 0x23, 0x11, 0xA8, 0x38, 0x15, 0x03, +/* 0000A700 */ 0x00, 0x2B, 0x38, 0x09, 0x04, 0x00, 0x77, 0x2B, 0x23, 0x12, 0xA8, 0x38, 0x15, 0x03, 0x00, 0x2C, +/* 0000A710 */ 0x38, 0x09, 0x62, 0x00, 0x77, 0x2C, 0x23, 0x13, 0x8F, 0x02, 0x04, 0x38, 0x10, 0x00, 0x4B, 0x38, +/* 0000A720 */ 0x62, 0x38, 0x38, 0x14, 0x77, 0x38, 0x23, 0x15, 0x14, 0x03, 0x00, 0x2C, 0x13, 0x09, 0x13, 0x00, +/* 0000A730 */ 0x8F, 0x02, 0x04, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x16, 0x77, 0x38, 0x23, 0x15, +/* 0000A740 */ 0x09, 0x33, 0x00, 0x14, 0x03, 0x00, 0x2C, 0x12, 0x09, 0x13, 0x00, 0x8F, 0x02, 0x04, 0x38, 0x10, +/* 0000A750 */ 0x00, 0x4B, 0x38, 0x62, 0x38, 0x38, 0x17, 0x77, 0x38, 0x23, 0x15, 0x09, 0x18, 0x00, 0x14, 0x03, +/* 0000A760 */ 0x00, 0x2C, 0x14, 0x09, 0x10, 0x00, 0x8F, 0x02, 0x04, 0x38, 0x10, 0x00, 0x4B, 0x38, 0x62, 0x38, +/* 0000A770 */ 0x38, 0x18, 0x77, 0x38, 0x23, 0x15, 0x77, 0x2E, 0x23, 0x19, 0x77, 0x2F, 0x23, 0x1A, 0x77, 0x30, +/* 0000A780 */ 0x23, 0x1B, 0xA8, 0x38, 0x15, 0x03, 0x00, 0x33, 0x38, 0x09, 0x08, 0x00, 0x77, 0x32, 0x23, 0x1C, +/* 0000A790 */ 0x77, 0x33, 0x23, 0x1D, 0x77, 0x2A, 0x23, 0x1E, 0x77, 0x34, 0x23, 0x1F, 0xE5, 0x21, 0x00, 0x8F, +/* 0000A7A0 */ 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, 0x39, 0x20, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, +/* 0000A7B0 */ 0x01, 0x23, 0xF2, 0x02, 0xFF, 0x38, 0x20, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xE9, 0x09, 0x33, 0x00, +/* 0000A7C0 */ 0xE7, 0x27, 0x06, 0x8F, 0x03, 0x29, 0x38, 0x0E, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 0000A7D0 */ 0x01, 0x27, 0xEE, 0x02, 0xFF, 0x38, 0x1F, 0x00, 0x8F, 0x03, 0x09, 0x39, 0x00, 0x00, 0x6D, 0x38, +/* 0000A7E0 */ 0x39, 0x21, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0xF2, 0x01, 0xFF, 0x38, 0x21, 0x00, 0x00, 0x00, +/* 0000A7F0 */ 0x20, 0x00, 0xE9, 0x62, 0x38, 0x23, 0x22, 0x0F, 0x07, 0x00, 0x38, 0x09, 0x00, 0x00, 0x77, 0x22, +/* 0000A800 */ 0x23, 0x23, 0x47, 0x38, 0x23, 0x8F, 0x03, 0x0C, 0x39, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000A810 */ 0x04, 0x8F, 0x03, 0x24, 0x3A, 0x11, 0x00, 0x5C, 0x01, 0x3A, 0x62, 0x3A, 0x23, 0x22, 0x5C, 0x02, +/* 0000A820 */ 0x3A, 0xEE, 0x03, 0x39, 0x39, 0x21, 0x00, 0x77, 0x39, 0x38, 0x24, 0x77, 0x06, 0x23, 0x25, 0xA8, +/* 0000A830 */ 0x00, 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, +/* 0000A840 */ 0x66, 0x03, 0xFE, 0xD7, 0x03, 0xFE, 0xD8, 0x03, 0xFE, 0xD9, 0x03, 0xFE, 0x10, 0x02, 0xFE, 0x11, +/* 0000A850 */ 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x32, 0x02, 0xFE, 0x21, 0x01, 0xFE, 0xF6, 0x03, +/* 0000A860 */ 0xFE, 0x21, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x16, 0x02, 0xFE, 0x17, 0x02, 0xFE, +/* 0000A870 */ 0xD6, 0x03, 0xFE, 0x18, 0x02, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, 0xFE, 0xDC, 0x03, 0xFE, 0x0D, +/* 0000A880 */ 0x02, 0xFE, 0x0B, 0x02, 0xFE, 0x0C, 0x02, 0xFE, 0x0E, 0x02, 0xFE, 0x0F, 0x02, 0xFE, 0x15, 0x02, +/* 0000A890 */ 0xFE, 0x13, 0x02, 0xFE, 0x30, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x14, 0x02, 0xFE, +/* 0000A8A0 */ 0x14, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0x8D, 0xB6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, +/* 0000A8B0 */ 0x00, 0x1A, 0x00, 0x3F, 0x00, 0x35, 0x00, 0x9B, 0x00, 0x24, 0x00, 0x6D, 0x00, 0x04, 0x00, 0x61, +/* 0000A8C0 */ 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x4F, 0x00, 0x20, 0x00, 0x49, 0x00, 0x37, 0x00, 0x71, +/* 0000A8D0 */ 0x00, 0x3B, 0x00, 0x73, 0x00, 0x0F, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x12, 0x00, 0x43, +/* 0000A8E0 */ 0x00, 0x08, 0x00, 0x30, 0x00, 0x0F, 0x00, 0x50, 0x00, 0x2C, 0x00, 0x5F, 0x00, 0x3B, 0x00, 0x7D, +/* 0000A8F0 */ 0x00, 0x05, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x67, 0x00, 0x05, 0x00, 0x37, 0x00, 0x05, 0x00, 0x37, +/* 0000A900 */ 0x00, 0x05, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x51, 0x00, 0x07, 0x00, 0x52, 0x00, 0x16, 0x00, 0x7E, +/* 0000A910 */ 0x00, 0x2C, 0x00, 0x6F, 0x00, 0x2A, 0x00, 0x96, 0x00, 0x2C, 0x00, 0x9A, 0x00, 0x18, 0x00, 0x41, +/* 0000A920 */ 0x00, 0x30, 0x00, 0xA2, 0x00, 0x27, 0x00, 0x62, 0x00, 0x32, 0x00, 0x58, 0x00, 0x08, 0x00, 0x30, +/* 0000A930 */ 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x1A, 0x00, 0x4F, 0x00, 0x24, 0x00, 0x74, 0x00, 0x26, 0x00, 0x4A, +/* 0000A940 */ 0x00, 0x01, 0x00, 0x24, 0x00, 0x15, 0x00, 0x2E, 0x00, 0x33, 0x00, 0x5F, 0x00, 0x2A, 0x00, 0x76, +/* 0000A950 */ 0x00, 0x26, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x2A, 0x00, 0x05, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x69, +/* 0000A960 */ 0x00, 0x08, 0x00, 0x33, 0x00, 0x28, 0x00, 0x78, 0x00, 0x25, 0x00, 0x7B, 0x00, 0x28, 0x00, 0xC6, +/* 0000A970 */ 0x00, 0x04, 0x00, 0x38, 0x00, 0x08, 0x00, 0x43, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x0A, 0x00, 0x32, +/* 0000A980 */ 0x00, 0x04, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x04, 0x00, 0x46, 0x00, 0x10, 0x00, 0x5F, +/* 0000A990 */ 0x00, 0x08, 0x00, 0x3C, 0x00, 0x13, 0x00, 0x65, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x13, 0x00, 0x63, +/* 0000A9A0 */ 0x00, 0x08, 0x00, 0x3A, 0x00, 0x10, 0x00, 0x81, 0x00, 0x04, 0x00, 0x4C, 0x00, 0x04, 0x00, 0x4E, +/* 0000A9B0 */ 0x00, 0x04, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x04, 0x00, 0x58, 0x00, 0x04, 0x00, 0x67, +/* 0000A9C0 */ 0x00, 0x04, 0x00, 0x40, 0x00, 0x07, 0x00, 0xA9, 0x00, 0x23, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x20, +/* 0000A9D0 */ 0x00, 0x15, 0x00, 0x6B, 0x01, 0x1B, 0x00, 0x4A, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x70, +/* 0000A9E0 */ 0x00, 0x29, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x00, 0x3F, 0x5C, 0x84, 0xE0, 0x29, 0xD4, +/* 0000A9F0 */ 0x92, 0xFE, 0xE4, 0x02, 0x14, 0xA0, 0x41, 0xD1, 0x00, 0x2E, 0xFE, 0x07, 0x83, 0x06, 0xFF, 0x00, +/* 0000AA00 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x07, 0x83, 0xFE, 0x95, 0x2E, 0xFE, 0x95, 0x2E, 0x0B, 0x16, +/* 0000AA10 */ 0x1A, 0x09, 0x9D, 0x9D, 0x01, 0x0C, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x05, 0x02, 0x19, 0x1A, 0x06, +/* 0000AA20 */ 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xB0, 0x03, 0x05, 0xFE, 0xB1, 0x03, 0x08, 0x05, 0xFE, 0xB2, 0x03, +/* 0000AA30 */ 0x05, 0xFE, 0xB3, 0x03, 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, +/* 0000AA40 */ 0x0B, 0x06, 0xFE, 0x14, 0x03, 0x07, 0x06, 0xFE, 0xB4, 0x03, 0x0C, 0x06, 0xFE, 0x13, 0x03, 0x06, +/* 0000AA50 */ 0xFE, 0xB5, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, 0xB7, 0x03, 0x06, 0xFE, 0xB8, 0x03, 0x05, +/* 0000AA60 */ 0xFE, 0xB9, 0x03, 0xFE, 0xD0, 0x02, 0xA8, 0x16, 0xA8, 0x17, 0xA8, 0x18, 0x8F, 0x01, 0x38, 0x1C, +/* 0000AA70 */ 0x00, 0x00, 0x14, 0x11, 0x00, 0x1C, 0x02, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x38, 0x1C, 0x00, 0x00, +/* 0000AA80 */ 0x14, 0x03, 0x00, 0x1C, 0x03, 0x09, 0xA5, 0x02, 0xDE, 0x00, 0x03, 0x01, 0xB8, 0x1C, 0x00, 0x01, +/* 0000AA90 */ 0x51, 0x01, 0x00, 0x16, 0x1C, 0x95, 0x00, 0x02, 0x16, 0x8F, 0x01, 0x09, 0x1D, 0x01, 0x00, 0x6D, +/* 0000AAA0 */ 0x1C, 0x1D, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x8F, 0x01, 0x2A, 0x1E, 0x02, 0x00, 0x07, +/* 0000AAB0 */ 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x04, 0x01, 0x00, 0xB8, 0x20, 0x00, 0x01, 0x51, 0x01, +/* 0000AAC0 */ 0x01, 0x1F, 0x20, 0x5C, 0x02, 0x1F, 0xEE, 0x03, 0x1E, 0x1E, 0x01, 0x00, 0x5C, 0x01, 0x1E, 0x8F, +/* 0000AAD0 */ 0x01, 0x3B, 0x1E, 0x03, 0x00, 0x4B, 0x1E, 0x62, 0x1E, 0x1E, 0x01, 0x5C, 0x02, 0x1E, 0xF2, 0x03, +/* 0000AAE0 */ 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x38, 0x1C, 0x00, 0x00, 0x14, 0x03, +/* 0000AAF0 */ 0x00, 0x1C, 0x02, 0x09, 0x37, 0x02, 0xDE, 0x01, 0x04, 0x02, 0xB8, 0x1C, 0x00, 0xB7, 0x01, 0x00, +/* 0000AB00 */ 0x00, 0x00, 0x1C, 0x1C, 0x01, 0x51, 0x01, 0x02, 0x17, 0x1C, 0x95, 0x01, 0x02, 0x17, 0x01, 0x51, +/* 0000AB10 */ 0x01, 0x03, 0x18, 0x1C, 0x95, 0x01, 0x03, 0x18, 0x8F, 0x01, 0x2A, 0x1C, 0x02, 0x00, 0x07, 0x03, +/* 0000AB20 */ 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x06, 0x02, 0x00, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x5C, +/* 0000AB30 */ 0x02, 0x1D, 0xEE, 0x03, 0xFF, 0x1C, 0x02, 0x00, 0x8F, 0x01, 0x2A, 0x1C, 0x02, 0x00, 0x07, 0x03, +/* 0000AB40 */ 0x00, 0x5C, 0x00, 0x05, 0x5D, 0x01, 0x07, 0x03, 0x00, 0x91, 0x01, 0x03, 0x1D, 0x05, 0x00, 0x5C, +/* 0000AB50 */ 0x02, 0x1D, 0xEE, 0x03, 0xFF, 0x1C, 0x03, 0x00, 0x8F, 0x01, 0x1B, 0x1C, 0x06, 0x00, 0x07, 0x04, +/* 0000AB60 */ 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x5C, 0x01, 0x1D, 0x5D, 0x02, 0x08, +/* 0000AB70 */ 0x04, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x8F, +/* 0000AB80 */ 0x01, 0x46, 0x1E, 0x07, 0x00, 0x4B, 0x1E, 0x7B, 0x1E, 0x1D, 0x02, 0x7B, 0x0B, 0x1D, 0x03, 0x7B, +/* 0000AB90 */ 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, 0xFF, 0x1C, 0x04, 0x00, 0x8F, 0x01, 0x1B, 0x1C, +/* 0000ABA0 */ 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x5C, 0x01, +/* 0000ABB0 */ 0x1D, 0x5D, 0x02, 0x0E, 0x05, 0x00, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1D, +/* 0000ABC0 */ 0x00, 0x00, 0x00, 0x91, 0x01, 0x02, 0x1E, 0x04, 0x00, 0x07, 0x01, 0x00, 0xC3, 0x01, 0x1E, 0x1E, +/* 0000ABD0 */ 0x06, 0x00, 0x7B, 0x1E, 0x1D, 0x02, 0x7B, 0x0F, 0x1D, 0x03, 0x7B, 0x0F, 0x1D, 0x05, 0x7B, 0x0F, +/* 0000ABE0 */ 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, 0xFF, 0x1C, 0x05, 0x00, 0x8F, 0x01, 0x0A, 0x1C, 0x08, +/* 0000ABF0 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x62, 0x1D, 0x1D, +/* 0000AC00 */ 0x06, 0x5C, 0x01, 0x1D, 0x8F, 0x01, 0x0E, 0x1D, 0x09, 0x00, 0x62, 0x1D, 0x1D, 0x06, 0x5C, 0x02, +/* 0000AC10 */ 0x1D, 0xEE, 0x03, 0xFF, 0x1C, 0x07, 0x00, 0x8F, 0x01, 0x1B, 0x1C, 0x06, 0x00, 0x07, 0x04, 0x00, +/* 0000AC20 */ 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x62, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, +/* 0000AC30 */ 0x5D, 0x02, 0x11, 0x08, 0x00, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, +/* 0000AC40 */ 0x00, 0x00, 0x91, 0x01, 0x02, 0x1E, 0x04, 0x00, 0x7B, 0x1E, 0x1D, 0x02, 0x7B, 0x0B, 0x1D, 0x03, +/* 0000AC50 */ 0x7B, 0x0F, 0x1D, 0x05, 0x7B, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, 0xFF, 0x1C, 0x08, +/* 0000AC60 */ 0x00, 0x8F, 0x01, 0x1B, 0x1C, 0x06, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, +/* 0000AC70 */ 0x1D, 0x04, 0x00, 0x62, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x5D, 0x02, 0x12, 0x09, 0x00, 0xCC, +/* 0000AC80 */ 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0xB8, 0x1F, 0x00, 0xB7, +/* 0000AC90 */ 0x01, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x01, 0x51, 0x01, 0x04, 0x1E, 0x1F, 0x7B, 0x1E, 0x1D, 0x02, +/* 0000ACA0 */ 0x01, 0x65, 0x01, 0x1E, 0x1D, 0x7B, 0x0B, 0x1D, 0x03, 0x7B, 0x0F, 0x1D, 0x05, 0x7B, 0x0B, 0x1D, +/* 0000ACB0 */ 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, 0xFF, 0x1C, 0x09, 0x00, 0x8F, 0x01, 0x1B, 0x1C, 0x06, 0x00, +/* 0000ACC0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x91, 0x01, 0x02, 0x1D, 0x04, 0x00, 0x62, 0x1D, 0x1D, 0x06, +/* 0000ACD0 */ 0x5C, 0x01, 0x1D, 0x5D, 0x02, 0x13, 0x0A, 0x00, 0xCC, 0x5C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +/* 0000ACE0 */ 0x00, 0x1D, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x2A, 0x1E, 0x02, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000ACF0 */ 0x05, 0x5D, 0x01, 0x15, 0x0B, 0x00, 0xB8, 0x20, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x20, 0x20, +/* 0000AD00 */ 0x01, 0x51, 0x01, 0x05, 0x1F, 0x20, 0x5C, 0x02, 0x1F, 0xEE, 0x03, 0x1E, 0x1E, 0x0B, 0x00, 0x7B, +/* 0000AD10 */ 0x1E, 0x1D, 0x07, 0x7B, 0x0F, 0x1D, 0x05, 0x7B, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0xEE, 0x04, +/* 0000AD20 */ 0xFF, 0x1C, 0x0A, 0x00, 0x91, 0x01, 0x02, 0x00, 0x04, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, +/* 0000AD30 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x05, 0x70, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, +/* 0000AD40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, +/* 0000AD50 */ 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 0000AD60 */ 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, +/* 0000AD70 */ 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, +/* 0000AD80 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, +/* 0000AD90 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, +/* 0000ADA0 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000ADB0 */ 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0x34, 0x02, +/* 0000ADC0 */ 0xFE, 0xF0, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, +/* 0000ADD0 */ 0x48, 0x01, 0xFE, 0xB7, 0x01, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xBA, 0x03, 0x02, 0x02, 0x00, 0xFE, +/* 0000ADE0 */ 0x1B, 0x02, 0x01, 0xFE, 0x20, 0x02, 0xFE, 0x1E, 0x83, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x2D, 0x00, +/* 0000ADF0 */ 0x14, 0x17, 0x4F, 0x00, 0x21, 0x04, 0x30, 0x00, 0x7A, 0x04, 0x20, 0x00, 0x43, 0x03, 0x20, 0x00, +/* 0000AE00 */ 0x50, 0x00, 0x44, 0x00, 0x93, 0x00, 0x4F, 0x00, 0x91, 0x00, 0x2C, 0x00, 0x45, 0x00, 0x4A, 0x00, +/* 0000AE10 */ 0x96, 0x00, 0x59, 0x00, 0xA7, 0x05, 0x6A, 0x00, 0x03, 0x03, 0x09, 0x00, 0x7C, 0x00, 0x07, 0x00, +/* 0000AE20 */ 0x16, 0x00, 0x00, 0x5F, 0xB6, 0x00, 0x00, 0xA1, 0xB4, 0x00, 0x00, 0x92, 0xB2, 0x00, 0x00, 0xF7, +/* 0000AE30 */ 0xB0, 0x00, 0x00, 0x3F, 0xAF, 0x00, 0x00, 0x3B, 0xAE, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, +/* 0000AE40 */ 0xC4, 0x00, 0xFE, 0xB1, 0x03, 0x3A, 0xA0, 0x41, 0xD1, 0x00, 0x35, 0xFE, 0x76, 0xAE, 0xFF, 0x00, +/* 0000AE50 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x76, 0xAE, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x05, +/* 0000AE60 */ 0x05, 0x08, 0x04, 0x25, 0x24, 0x03, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0x07, 0x06, 0xFE, 0x9A, +/* 0000AE70 */ 0x03, 0x05, 0xFE, 0xD4, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x98, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, +/* 0000AE80 */ 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x03, 0x09, 0x09, 0x00, 0x00, +/* 0000AE90 */ 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x00, 0x00, 0x5D, +/* 0000AEA0 */ 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x03, +/* 0000AEB0 */ 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, +/* 0000AEC0 */ 0x05, 0xF2, 0x02, 0x08, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x06, 0x08, 0xA8, 0x08, +/* 0000AED0 */ 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x62, 0x08, 0x06, 0x02, 0x0F, 0x27, 0x00, 0x08, +/* 0000AEE0 */ 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x09, 0x00, 0x00, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, +/* 0000AEF0 */ 0x5C, 0x00, 0x09, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, 0x03, 0xFF, +/* 0000AF00 */ 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000AF10 */ 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x79, 0x02, 0xFE, 0x9C, +/* 0000AF20 */ 0xAE, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x7D, 0x00, 0x20, 0x00, +/* 0000AF30 */ 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x24, 0x00, 0x7D, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, +/* 0000AF40 */ 0x5C, 0x84, 0xE0, 0x09, 0xC4, 0x10, 0xFE, 0x9B, 0x03, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, +/* 0000AF50 */ 0x03, 0x34, 0xFE, 0xB8, 0xA8, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xB8, 0xA8, 0xFE, +/* 0000AF60 */ 0xF1, 0x04, 0xFE, 0xF1, 0x04, 0x01, 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, 0x03, 0x03, 0x01, 0x11, +/* 0000AF70 */ 0x11, 0x11, 0x11, 0x01, 0x0F, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xD5, 0x03, 0x06, 0xFE, 0x11, +/* 0000AF80 */ 0x03, 0x06, 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0xBC, 0x03, 0x06, 0xFE, 0xBF, 0x03, 0x06, 0xFE, 0xC4, +/* 0000AF90 */ 0x03, 0x06, 0xFE, 0xCE, 0x03, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0xC5, 0x03, 0x07, 0xD9, 0x5B, +/* 0000AFA0 */ 0x0D, 0xB4, 0x0D, 0x0D, 0x2C, 0x10, 0x0D, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0x24, 0x00, 0x8F, +/* 0000AFB0 */ 0x03, 0x09, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, +/* 0000AFC0 */ 0x01, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, +/* 0000AFD0 */ 0x00, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x02, 0x00, +/* 0000AFE0 */ 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +/* 0000AFF0 */ 0x47, 0x0E, 0x10, 0xA8, 0x10, 0x14, 0x0E, 0x00, 0x0E, 0x10, 0x09, 0x00, 0x00, 0x62, 0x10, 0x0E, +/* 0000B000 */ 0x02, 0x0F, 0x27, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x11, 0x00, 0x00, 0x6D, 0x10, +/* 0000B010 */ 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, +/* 0000B020 */ 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xCC, 0x00, 0x00, 0x00, +/* 0000B030 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x10, 0x0E, 0x03, 0x7B, 0x10, 0x00, +/* 0000B040 */ 0x04, 0x62, 0x10, 0x0E, 0x05, 0x7B, 0x10, 0x00, 0x06, 0x62, 0x10, 0x0E, 0x07, 0x7B, 0x10, 0x00, +/* 0000B050 */ 0x08, 0x62, 0x10, 0x0E, 0x09, 0x7B, 0x10, 0x00, 0x0A, 0x62, 0x10, 0x0E, 0x0B, 0x7B, 0x10, 0x00, +/* 0000B060 */ 0x0C, 0x62, 0x10, 0x0E, 0x0D, 0x7B, 0x10, 0x00, 0x0E, 0x62, 0x10, 0x0E, 0x0F, 0x7B, 0x10, 0x00, +/* 0000B070 */ 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0000B080 */ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0xBC, 0x03, 0x00, 0x00, 0x22, +/* 0000B090 */ 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0xCE, 0x03, 0x00, 0x00, 0x23, 0x02, 0x00, 0x00, 0xC5, +/* 0000B0A0 */ 0x03, 0x00, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x19, 0x02, 0xFE, +/* 0000B0B0 */ 0x21, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0xBC, 0x03, 0xFE, 0x73, 0x02, 0xFE, 0x22, 0x02, 0xFE, 0x74, +/* 0000B0C0 */ 0x02, 0xFE, 0x24, 0x02, 0xFE, 0x77, 0x02, 0xFE, 0xCE, 0x03, 0xFE, 0x76, 0x02, 0xFE, 0x23, 0x02, +/* 0000B0D0 */ 0xFE, 0x75, 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0xED, 0xA8, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, +/* 0000B0E0 */ 0x3C, 0x00, 0x24, 0x00, 0x84, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x24, 0x00, +/* 0000B0F0 */ 0x85, 0x00, 0x4A, 0x00, 0xC6, 0x02, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x82, +/* 0000B100 */ 0x03, 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0xB7, 0x03, 0x33, 0xFE, 0x0C, 0xA3, 0xFF, 0x00, 0x10, +/* 0000B110 */ 0x01, 0x00, 0x03, 0x03, 0xFE, 0x0C, 0xA3, 0xFE, 0xF3, 0x02, 0xFE, 0xF3, 0x02, 0x01, 0x09, 0x06, +/* 0000B120 */ 0x0B, 0x0B, 0x44, 0x41, 0x03, 0x07, 0x03, 0x08, 0x08, 0x08, 0x08, 0x0A, 0x06, 0xFE, 0x9A, 0x03, +/* 0000B130 */ 0x05, 0xFE, 0xD4, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x08, 0xFE, 0x15, 0x01, 0x5B, 0x08, 0xB4, 0x08, +/* 0000B140 */ 0x08, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x24, 0x00, 0x8F, 0x03, 0x09, 0x0C, +/* 0000B150 */ 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x00, +/* 0000B160 */ 0x00, 0x5D, 0x02, 0x04, 0x00, 0x00, 0xF2, 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000B170 */ 0x8F, 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, +/* 0000B180 */ 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x09, 0x0B, +/* 0000B190 */ 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x62, 0x0B, 0x09, 0x02, 0x0F, 0x27, +/* 0000B1A0 */ 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x03, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, +/* 0000B1B0 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x03, 0x02, 0x00, 0x5D, 0x02, 0x04, 0x02, 0x00, 0xF2, +/* 0000B1C0 */ 0x03, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x03, 0x11, 0x0B, 0x01, 0x00, 0x07, +/* 0000B1D0 */ 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x47, 0x06, +/* 0000B1E0 */ 0x0B, 0x8F, 0x03, 0x11, 0x0B, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x07, +/* 0000B1F0 */ 0xEE, 0x02, 0x0B, 0x0B, 0x04, 0x00, 0x47, 0x07, 0x0B, 0x8F, 0x03, 0x10, 0x0B, 0x02, 0x00, 0x07, +/* 0000B200 */ 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x03, 0x09, 0x0D, 0x00, 0x00, 0x6D, 0x0C, 0x0D, 0x03, 0x07, +/* 0000B210 */ 0x07, 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x07, 0x62, 0x0E, 0x09, 0x04, 0x5C, +/* 0000B220 */ 0x03, 0x0E, 0x62, 0x0E, 0x09, 0x05, 0x5C, 0x04, 0x0E, 0x62, 0x0E, 0x09, 0x06, 0x5C, 0x05, 0x0E, +/* 0000B230 */ 0x62, 0x0E, 0x09, 0x07, 0x5C, 0x06, 0x0E, 0xF2, 0x07, 0x0C, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x06, +/* 0000B240 */ 0x00, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x00, 0x0B, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000B250 */ 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x2A, 0x02, 0xFE, 0x71, 0x02, +/* 0000B260 */ 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x39, 0xA3, 0x09, 0x05, 0x00, 0x00, +/* 0000B270 */ 0x00, 0x0B, 0x00, 0x38, 0x00, 0x24, 0x00, 0x75, 0x00, 0x20, 0x00, 0x47, 0x00, 0x15, 0x00, 0x61, +/* 0000B280 */ 0x00, 0x24, 0x00, 0x75, 0x00, 0x18, 0x00, 0x23, 0x00, 0x18, 0x00, 0x24, 0x00, 0x56, 0x00, 0xB4, +/* 0000B290 */ 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x67, 0x03, 0x10, 0xA3, 0x41, 0xC1, +/* 0000B2A0 */ 0x00, 0xFE, 0x11, 0x03, 0x32, 0xFE, 0x7F, 0x9E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFE, +/* 0000B2B0 */ 0x7F, 0x9E, 0xFE, 0x3D, 0x04, 0xFE, 0x3D, 0x04, 0x01, 0x09, 0x05, 0x0B, 0x05, 0x62, 0x5B, 0x03, +/* 0000B2C0 */ 0x09, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x11, 0x03, 0x07, 0xFE, 0x79, 0x01, +/* 0000B2D0 */ 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, 0x05, 0x02, 0xA8, 0x0B, +/* 0000B2E0 */ 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, 0x0B, 0x4F, 0x08, 0x4F, +/* 0000B2F0 */ 0x09, 0x6B, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, 0x09, 0x00, 0x00, 0xA8, +/* 0000B300 */ 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x1A, 0x00, 0x8F, 0x01, 0x02, 0x0B, 0x00, 0x00, 0x4B, +/* 0000B310 */ 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC3, 0x03, 0x00, 0x0B, 0x00, 0x00, +/* 0000B320 */ 0x09, 0x24, 0x01, 0x8F, 0x03, 0x31, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, +/* 0000B330 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0xF2, 0x02, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +/* 0000B340 */ 0x47, 0x08, 0x0B, 0x8F, 0x03, 0x17, 0x0B, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, +/* 0000B350 */ 0x01, 0x08, 0xEE, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x0F, 0x22, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8F, +/* 0000B360 */ 0x03, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5D, +/* 0000B370 */ 0x01, 0x03, 0x03, 0x00, 0xF2, 0x02, 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x03, +/* 0000B380 */ 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, +/* 0000B390 */ 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, +/* 0000B3A0 */ 0x14, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x3F, 0x00, 0x8F, 0x03, 0x0A, 0x0B, 0x04, 0x00, 0x07, 0x03, +/* 0000B3B0 */ 0x00, 0x5C, 0x00, 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x04, 0x05, 0x00, 0xEE, 0x03, +/* 0000B3C0 */ 0x0B, 0x0B, 0x05, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x03, 0x09, 0x0C, 0x03, 0x00, 0x6D, 0x0B, 0x0C, +/* 0000B3D0 */ 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xF2, 0x03, 0xFF, +/* 0000B3E0 */ 0x0B, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x8F, 0x02, 0x02, 0x0B, 0x05, 0x00, 0x4B, 0x0B, 0x07, +/* 0000B3F0 */ 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, 0xEE, 0x04, +/* 0000B400 */ 0xFF, 0x0B, 0x07, 0x00, 0x47, 0x0B, 0x09, 0x8F, 0x03, 0x0C, 0x0C, 0x06, 0x00, 0x07, 0x04, 0x00, +/* 0000B410 */ 0x5C, 0x00, 0x02, 0x8F, 0x03, 0x20, 0x0D, 0x07, 0x00, 0x5C, 0x01, 0x0D, 0x8F, 0x01, 0x03, 0x0D, +/* 0000B420 */ 0x08, 0x00, 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, 0xEE, 0x04, 0x0C, 0x0C, 0x08, 0x00, +/* 0000B430 */ 0x77, 0x0C, 0x0B, 0x04, 0x62, 0x0B, 0x09, 0x05, 0x82, 0x0B, 0x0B, 0x2B, 0x01, 0xFA, 0x0B, 0x47, +/* 0000B440 */ 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x68, 0x02, 0xFE, +/* 0000B450 */ 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x79, 0x02, 0xFE, 0x79, 0x02, 0xDD, 0xFE, 0x91, 0x9E, 0x10, +/* 0000B460 */ 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x18, 0x00, 0x43, 0x00, +/* 0000B470 */ 0x1A, 0x00, 0x52, 0x00, 0x20, 0x00, 0x37, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x97, 0x00, +/* 0000B480 */ 0x20, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x58, 0x00, +/* 0000B490 */ 0x1D, 0x00, 0x76, 0x00, 0x30, 0x00, 0x68, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, +/* 0000B4A0 */ 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x55, 0x03, 0x61, 0xA0, 0x41, 0xF1, 0x00, +/* 0000B4B0 */ 0x31, 0xFE, 0x87, 0x9A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x87, 0x9A, 0xFE, 0x90, +/* 0000B4C0 */ 0x03, 0xFE, 0x90, 0x03, 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4E, 0x4A, 0x02, 0x03, 0x08, 0x05, 0x07, +/* 0000B4D0 */ 0x07, 0x07, 0x07, 0x0D, 0x07, 0x01, 0x00, 0x05, 0xFE, 0xB1, 0x03, 0x08, 0x01, 0x01, 0x01, 0x02, +/* 0000B4E0 */ 0xFE, 0x36, 0x01, 0xAE, 0x08, 0x5B, 0x0A, 0xB4, 0x0A, 0x0A, 0x98, 0x0E, 0x08, 0x03, 0x00, 0x00, +/* 0000B4F0 */ 0x47, 0x09, 0x0E, 0xA8, 0x0E, 0x14, 0x0B, 0x00, 0x0A, 0x0E, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, +/* 0000B500 */ 0x0A, 0x02, 0x09, 0x22, 0x00, 0x8F, 0x02, 0x09, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x00, 0x07, +/* 0000B510 */ 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xF2, 0x02, 0xFF, 0x0E, 0x00, 0x00, +/* 0000B520 */ 0x00, 0x00, 0x00, 0x00, 0x09, 0x22, 0x00, 0x14, 0x03, 0x00, 0x09, 0x02, 0x09, 0x1A, 0x00, 0x8F, +/* 0000B530 */ 0x02, 0x09, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x0F, 0xF2, +/* 0000B540 */ 0x01, 0xFF, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8F, 0x02, 0x11, 0x0E, 0x01, 0x00, 0x07, +/* 0000B550 */ 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0x0E, 0x0E, 0x02, 0x00, 0x47, 0x0B, +/* 0000B560 */ 0x0E, 0x8F, 0x02, 0x11, 0x0E, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, +/* 0000B570 */ 0xEE, 0x02, 0x0E, 0x0E, 0x03, 0x00, 0x47, 0x09, 0x0E, 0x8F, 0x02, 0x0A, 0x0E, 0x02, 0x00, 0x07, +/* 0000B580 */ 0x03, 0x00, 0x5C, 0x00, 0x05, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5D, 0x02, 0x02, 0x04, 0x00, 0xEE, +/* 0000B590 */ 0x03, 0x0E, 0x0E, 0x04, 0x00, 0x47, 0x0C, 0x0E, 0x8F, 0x01, 0x02, 0x0E, 0x03, 0x00, 0x4B, 0x0E, +/* 0000B5A0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0C, 0x98, 0x0F, 0x08, 0x06, 0x01, 0x00, 0x5C, +/* 0000B5B0 */ 0x02, 0x0F, 0x98, 0x0F, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0xFF, 0x0E, 0x05, +/* 0000B5C0 */ 0x00, 0x8F, 0x02, 0x10, 0x0E, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x02, 0x09, +/* 0000B5D0 */ 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, +/* 0000B5E0 */ 0x5C, 0x02, 0x09, 0x62, 0x11, 0x0C, 0x03, 0x5C, 0x03, 0x11, 0x62, 0x11, 0x0C, 0x04, 0x5C, 0x04, +/* 0000B5F0 */ 0x11, 0x62, 0x11, 0x0C, 0x05, 0x5C, 0x05, 0x11, 0x62, 0x11, 0x0C, 0x06, 0x5C, 0x06, 0x11, 0xF2, +/* 0000B600 */ 0x07, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x00, 0x0E, +/* 0000B610 */ 0x06, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x59, 0x02, 0xFE, 0x57, 0x02, 0xFE, +/* 0000B620 */ 0x2A, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0xA5, +/* 0000B630 */ 0x9A, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x29, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x22, 0x00, +/* 0000B640 */ 0x6D, 0x00, 0x08, 0x00, 0x29, 0x00, 0x1A, 0x00, 0xE2, 0x00, 0x18, 0x00, 0x2C, 0x00, 0x18, 0x00, +/* 0000B650 */ 0x29, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x29, 0x00, 0x4D, 0x00, 0x56, 0x00, 0xB5, 0x00, 0x00, 0xBF, +/* 0000B660 */ 0x5D, 0x8D, 0xE0, 0xA1, 0xD6, 0x02, 0xFE, 0xE8, 0x02, 0x0C, 0xB3, 0x41, 0xC1, 0x00, 0xFE, 0xBA, +/* 0000B670 */ 0x03, 0x2F, 0xFE, 0x5F, 0x83, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x5F, 0x83, +/* 0000B680 */ 0xFE, 0xC5, 0x16, 0xFE, 0xC5, 0x16, 0x44, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, 0x0A, 0x01, 0xF9, +/* 0000B690 */ 0x02, 0x02, 0x12, 0x05, 0x10, 0x13, 0x13, 0x13, 0x13, 0x01, 0x32, 0x33, 0x34, 0x35, 0x06, 0xFE, +/* 0000B6A0 */ 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, 0x08, 0x06, 0xFE, 0x11, 0x03, 0x0B, 0x06, 0xFE, 0x72, 0x03, +/* 0000B6B0 */ 0x07, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, +/* 0000B6C0 */ 0x03, 0x06, 0xFE, 0xBC, 0x03, 0x06, 0xFE, 0xBD, 0x03, 0x06, 0xFE, 0xBE, 0x03, 0x06, 0xFE, 0xBF, +/* 0000B6D0 */ 0x03, 0x05, 0xFE, 0xC0, 0x03, 0x05, 0xFE, 0xC1, 0x03, 0x05, 0xFE, 0xC2, 0x03, 0x05, 0xFE, 0xC3, +/* 0000B6E0 */ 0x03, 0x06, 0xFE, 0xC4, 0x03, 0x06, 0xFE, 0x6C, 0x03, 0x0C, 0x06, 0xFE, 0xC5, 0x03, 0x05, 0xFE, +/* 0000B6F0 */ 0xC6, 0x03, 0x05, 0xFE, 0xC7, 0x03, 0x06, 0xFE, 0xC8, 0x03, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, +/* 0000B700 */ 0xCA, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x06, 0xFE, 0xCB, 0x03, 0x06, 0xFE, 0xCC, 0x03, 0x06, 0xFE, +/* 0000B710 */ 0xCD, 0x03, 0x01, 0x00, 0x01, 0xFF, 0xFE, 0x12, 0x04, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0x2C, +/* 0000B720 */ 0x36, 0x24, 0x0D, 0x03, 0x00, 0x36, 0x02, 0x09, 0x1A, 0x00, 0x8F, 0x02, 0x09, 0x37, 0x00, 0x00, +/* 0000B730 */ 0x6D, 0x36, 0x37, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x37, 0xF2, 0x01, 0xFF, 0x36, 0x00, 0x00, +/* 0000B740 */ 0x00, 0x00, 0x00, 0x00, 0x8F, 0x02, 0x0C, 0x36, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, +/* 0000B750 */ 0x8F, 0x02, 0x19, 0x37, 0x02, 0x00, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x24, 0x5D, 0x03, 0x03, 0x01, +/* 0000B760 */ 0x00, 0xEE, 0x04, 0x36, 0x36, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x2F, 0x00, 0x62, 0x36, +/* 0000B770 */ 0x24, 0x01, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x24, 0x00, 0x8F, 0x02, 0x09, 0x37, 0x00, 0x00, 0x6D, +/* 0000B780 */ 0x36, 0x37, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x37, 0x5D, 0x01, 0x05, 0x02, 0x00, 0x5D, 0x02, +/* 0000B790 */ 0x05, 0x02, 0x00, 0xF2, 0x03, 0xFF, 0x36, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x77, 0x06, 0x24, +/* 0000B7A0 */ 0x03, 0x2C, 0x36, 0x26, 0x14, 0x03, 0x00, 0x36, 0x07, 0x09, 0x22, 0x00, 0x8F, 0x02, 0x0A, 0x36, +/* 0000B7B0 */ 0x03, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x37, 0x5C, 0x01, 0x37, 0x5D, 0x02, 0x08, +/* 0000B7C0 */ 0x03, 0x00, 0xEE, 0x03, 0x36, 0x36, 0x03, 0x00, 0x47, 0x26, 0x36, 0x09, 0x20, 0x00, 0x8F, 0x02, +/* 0000B7D0 */ 0x31, 0x37, 0x04, 0x00, 0x6D, 0x36, 0x37, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, +/* 0000B7E0 */ 0x26, 0xF2, 0x02, 0x36, 0x36, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x26, 0x36, 0x8F, 0x02, +/* 0000B7F0 */ 0x02, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x09, +/* 0000B800 */ 0x05, 0x00, 0x5D, 0x03, 0x0A, 0x05, 0x00, 0xCE, 0x37, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x0B, 0x37, +/* 0000B810 */ 0xA1, 0x01, 0x0C, 0x37, 0x5C, 0x04, 0x37, 0x5D, 0x05, 0x0C, 0x05, 0x00, 0xEE, 0x06, 0x36, 0x36, +/* 0000B820 */ 0x05, 0x00, 0x47, 0x28, 0x36, 0x8F, 0x02, 0x02, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 0000B830 */ 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x0D, 0x06, 0x00, 0x5D, 0x03, 0x0A, 0x06, 0x00, 0xCE, 0x37, +/* 0000B840 */ 0x02, 0x01, 0x00, 0xA1, 0x00, 0x0E, 0x37, 0xA1, 0x01, 0x0F, 0x37, 0x5C, 0x04, 0x37, 0x5D, 0x05, +/* 0000B850 */ 0x0E, 0x06, 0x00, 0xEE, 0x06, 0x36, 0x36, 0x06, 0x00, 0x47, 0x29, 0x36, 0x8F, 0x02, 0x02, 0x36, +/* 0000B860 */ 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x10, 0x07, 0x00, +/* 0000B870 */ 0x5D, 0x03, 0x0A, 0x07, 0x00, 0xCE, 0x37, 0x04, 0x02, 0x00, 0xA1, 0x00, 0x11, 0x37, 0xA1, 0x01, +/* 0000B880 */ 0x12, 0x37, 0xA1, 0x02, 0x13, 0x37, 0xA1, 0x03, 0x14, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, +/* 0000B890 */ 0x05, 0x37, 0xEE, 0x06, 0x36, 0x36, 0x07, 0x00, 0x47, 0x2A, 0x36, 0x8F, 0x02, 0x02, 0x36, 0x05, +/* 0000B8A0 */ 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x15, 0x08, 0x00, 0x5D, +/* 0000B8B0 */ 0x03, 0x16, 0x08, 0x00, 0xA8, 0x37, 0x5C, 0x04, 0x37, 0x5D, 0x05, 0x17, 0x08, 0x00, 0xEE, 0x06, +/* 0000B8C0 */ 0x36, 0x36, 0x08, 0x00, 0x47, 0x2B, 0x36, 0x8F, 0x02, 0x02, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, +/* 0000B8D0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5D, 0x02, 0x18, 0x09, 0x00, 0x5D, 0x03, 0x0A, 0x09, 0x00, +/* 0000B8E0 */ 0xCE, 0x37, 0x03, 0x03, 0x00, 0xA1, 0x00, 0x19, 0x37, 0xA1, 0x01, 0x1A, 0x37, 0xA1, 0x02, 0x1B, +/* 0000B8F0 */ 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, 0xEE, 0x06, 0x36, 0x36, 0x09, 0x00, 0x96, +/* 0000B900 */ 0x02, 0x36, 0x8F, 0x02, 0x02, 0x36, 0x05, 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 0000B910 */ 0x26, 0x5D, 0x02, 0x1C, 0x0A, 0x00, 0x5D, 0x03, 0x16, 0x0A, 0x00, 0xCE, 0x37, 0x02, 0x04, 0x00, +/* 0000B920 */ 0xA1, 0x00, 0x06, 0x37, 0xA1, 0x01, 0x17, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, +/* 0000B930 */ 0xEE, 0x06, 0x36, 0x36, 0x0A, 0x00, 0x96, 0x03, 0x36, 0x8F, 0x02, 0x07, 0x36, 0x06, 0x00, 0x07, +/* 0000B940 */ 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0xEE, 0x02, 0x36, 0x36, 0x0B, 0x00, 0x47, 0x25, +/* 0000B950 */ 0x36, 0x8F, 0x02, 0x2F, 0x36, 0x07, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, +/* 0000B960 */ 0x5C, 0x02, 0x28, 0xA8, 0x37, 0x5C, 0x03, 0x37, 0x8F, 0x02, 0x37, 0x37, 0x08, 0x00, 0x5C, 0x04, +/* 0000B970 */ 0x37, 0xEE, 0x05, 0x36, 0x36, 0x0C, 0x00, 0x47, 0x2C, 0x36, 0x96, 0x04, 0x1D, 0x8F, 0x02, 0x2C, +/* 0000B980 */ 0x36, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x62, 0x37, 0x2C, 0x05, 0x5C, 0x01, 0x37, +/* 0000B990 */ 0xEE, 0x02, 0x36, 0x36, 0x0D, 0x00, 0x47, 0x2D, 0x36, 0x47, 0x2E, 0x2D, 0x62, 0x36, 0x2C, 0x06, +/* 0000B9A0 */ 0x0F, 0x03, 0x00, 0x36, 0x09, 0x28, 0x00, 0x8F, 0x02, 0x0C, 0x36, 0x01, 0x00, 0x07, 0x04, 0x00, +/* 0000B9B0 */ 0x5C, 0x00, 0x04, 0x8F, 0x02, 0x1C, 0x37, 0x0A, 0x00, 0x5C, 0x01, 0x37, 0x62, 0x37, 0x2C, 0x06, +/* 0000B9C0 */ 0x5C, 0x02, 0x37, 0xD4, 0x00, 0x37, 0x5C, 0x03, 0x37, 0xEE, 0x04, 0xFF, 0x36, 0x0E, 0x00, 0x93, +/* 0000B9D0 */ 0x04, 0x36, 0x0B, 0x00, 0x15, 0x03, 0x00, 0x36, 0x1D, 0x09, 0x50, 0x00, 0x8F, 0x02, 0x35, 0x36, +/* 0000B9E0 */ 0x0C, 0x00, 0x98, 0x36, 0x36, 0x2E, 0x00, 0x00, 0x47, 0x2F, 0x36, 0x47, 0x30, 0x1E, 0xA8, 0x36, +/* 0000B9F0 */ 0x15, 0x03, 0x00, 0x2F, 0x36, 0x09, 0x31, 0x00, 0x93, 0x04, 0x37, 0x0B, 0x00, 0x98, 0x37, 0x2F, +/* 0000BA00 */ 0x37, 0x01, 0x00, 0x47, 0x30, 0x37, 0x47, 0x36, 0x37, 0xA8, 0x37, 0x15, 0x03, 0x00, 0x36, 0x37, +/* 0000BA10 */ 0x09, 0x16, 0x00, 0x15, 0x03, 0x00, 0x30, 0x1E, 0x09, 0x0B, 0x00, 0x2F, 0x36, 0x2E, 0x1F, 0x2F, +/* 0000BA20 */ 0x36, 0x36, 0x30, 0x47, 0x2E, 0x36, 0x09, 0x03, 0x00, 0x96, 0x04, 0x1D, 0x93, 0x02, 0x36, 0x0D, +/* 0000BA30 */ 0x00, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x92, 0x00, 0xE5, 0x3D, 0x00, 0x8F, 0x02, +/* 0000BA40 */ 0x09, 0x37, 0x00, 0x00, 0x6D, 0x36, 0x37, 0x07, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x37, 0x5D, 0x01, +/* 0000BA50 */ 0x20, 0x0F, 0x00, 0x5D, 0x02, 0x21, 0x0F, 0x00, 0x5C, 0x03, 0x2D, 0xA8, 0x38, 0x5C, 0x04, 0x38, +/* 0000BA60 */ 0xA8, 0x38, 0x5C, 0x05, 0x38, 0xA8, 0x38, 0x5C, 0x06, 0x38, 0xF2, 0x07, 0x36, 0x36, 0x07, 0x00, +/* 0000BA70 */ 0x00, 0x00, 0x0F, 0x00, 0x47, 0x31, 0x36, 0xE9, 0x09, 0x33, 0x00, 0xE7, 0x27, 0x06, 0x8F, 0x02, +/* 0000BA80 */ 0x29, 0x36, 0x0E, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x27, 0xEE, 0x02, 0xFF, +/* 0000BA90 */ 0x36, 0x10, 0x00, 0x8F, 0x02, 0x09, 0x37, 0x00, 0x00, 0x6D, 0x36, 0x37, 0x08, 0x07, 0x01, 0x00, +/* 0000BAA0 */ 0x5C, 0x00, 0x37, 0xF2, 0x01, 0xFF, 0x36, 0x08, 0x00, 0x00, 0x00, 0x11, 0x00, 0xE9, 0x14, 0x03, +/* 0000BAB0 */ 0x00, 0x31, 0x22, 0x09, 0x06, 0x00, 0x96, 0x02, 0x1B, 0x09, 0x11, 0x00, 0x14, 0x03, 0x00, 0x31, +/* 0000BAC0 */ 0x23, 0x09, 0x06, 0x00, 0x96, 0x02, 0x19, 0x09, 0x03, 0x00, 0x96, 0x02, 0x1A, 0xA8, 0x36, 0x14, +/* 0000BAD0 */ 0x03, 0x00, 0x2A, 0x36, 0x09, 0x03, 0x00, 0x47, 0x2A, 0x14, 0x93, 0x03, 0x36, 0x0F, 0x00, 0xA8, +/* 0000BAE0 */ 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x03, 0x00, 0x96, 0x03, 0x17, 0x77, 0x28, 0x24, 0x09, +/* 0000BAF0 */ 0x62, 0x36, 0x2C, 0x05, 0x77, 0x36, 0x24, 0x0A, 0x77, 0x2E, 0x24, 0x0B, 0x77, 0x29, 0x24, 0x0C, +/* 0000BB00 */ 0x77, 0x2A, 0x24, 0x0D, 0x77, 0x2B, 0x24, 0x0E, 0x93, 0x02, 0x36, 0x0D, 0x00, 0x77, 0x36, 0x24, +/* 0000BB10 */ 0x0F, 0x93, 0x03, 0x36, 0x0F, 0x00, 0x77, 0x36, 0x24, 0x10, 0x93, 0x04, 0x36, 0x0B, 0x00, 0x77, +/* 0000BB20 */ 0x36, 0x24, 0x11, 0x77, 0x06, 0x24, 0x12, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, +/* 0000BB30 */ 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x66, 0x03, 0xFE, 0x6F, 0x02, 0xFE, 0x3B, 0x02, +/* 0000BB40 */ 0xFE, 0x2A, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x71, 0x02, 0xFE, +/* 0000BB50 */ 0x72, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x77, +/* 0000BB60 */ 0x02, 0xFE, 0x78, 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0x23, 0x02, 0xFE, 0xCE, 0x03, 0xFE, 0xAC, 0x83, +/* 0000BB70 */ 0x35, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x37, 0x00, 0x1A, 0x00, 0x3F, 0x00, 0x35, 0x00, 0x93, +/* 0000BB80 */ 0x00, 0x24, 0x00, 0x65, 0x00, 0x04, 0x00, 0x5D, 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x4F, +/* 0000BB90 */ 0x00, 0x20, 0x00, 0x49, 0x00, 0x37, 0x00, 0x71, 0x00, 0x37, 0x00, 0x5F, 0x00, 0x3F, 0x00, 0x81, +/* 0000BBA0 */ 0x00, 0x2C, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x73, 0x00, 0x37, 0x00, 0x9B, 0x00, 0x18, 0x00, 0x41, +/* 0000BBB0 */ 0x00, 0x29, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x2B, 0x00, 0x1C, 0x00, 0x69, 0x00, 0x03, 0x00, 0x46, +/* 0000BBC0 */ 0x00, 0x0B, 0x00, 0x36, 0x00, 0x28, 0x00, 0x33, 0x05, 0x0D, 0x00, 0x33, 0x00, 0x0F, 0x00, 0x6F, +/* 0000BBD0 */ 0x00, 0x03, 0x00, 0x2F, 0x00, 0x25, 0x00, 0x92, 0x00, 0x08, 0x00, 0x3B, 0x00, 0x0E, 0x00, 0xB1, +/* 0000BBE0 */ 0x00, 0x03, 0x00, 0x7F, 0x00, 0x12, 0x00, 0x51, 0x00, 0x3F, 0x00, 0x79, 0x00, 0x01, 0x00, 0x52, +/* 0000BBF0 */ 0x00, 0x15, 0x00, 0x92, 0x01, 0x1B, 0x00, 0x52, 0x00, 0x08, 0x00, 0x29, 0x00, 0x06, 0x00, 0x30, +/* 0000BC00 */ 0x00, 0x08, 0x00, 0x2A, 0x00, 0x06, 0x00, 0x4A, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x0A, 0x00, 0x35, +/* 0000BC10 */ 0x00, 0x03, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x31, 0x00, 0x03, 0x00, 0x65, 0x00, 0x04, 0x00, 0x2E, +/* 0000BC20 */ 0x00, 0x08, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x48, 0x00, 0x04, 0x00, 0x2A, 0x00, 0x04, 0x00, 0x36, +/* 0000BC30 */ 0x00, 0x04, 0x00, 0x42, 0x00, 0x09, 0x00, 0x32, 0x00, 0x09, 0x00, 0x2E, 0x00, 0x09, 0x00, 0x32, +/* 0000BC40 */ 0x00, 0x06, 0x00, 0x33, 0x00, 0x00, 0x4A, 0xBC, 0x00, 0x00, 0xBF, 0x5C, 0x8D, 0xE0, 0x19, 0xC4, +/* 0000BC50 */ 0x10, 0xFE, 0x0A, 0x03, 0x57, 0xA2, 0x41, 0xD1, 0x00, 0x30, 0xFE, 0x19, 0x8B, 0xFF, 0x00, 0x10, +/* 0000BC60 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x19, 0x8B, 0xFE, 0xCB, 0x04, 0xFE, 0xCB, 0x04, 0x41, 0x09, 0x15, +/* 0000BC70 */ 0x1A, 0x0B, 0x5E, 0x59, 0x03, 0x03, 0x05, 0x01, 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x19, +/* 0000BC80 */ 0x01, 0x01, 0x01, 0x02, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xCF, 0x03, 0x06, 0xFE, 0xC5, 0x03, +/* 0000BC90 */ 0x07, 0x08, 0x06, 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0xC6, 0x03, 0x05, 0xFE, 0xC7, 0x03, 0x06, 0xFE, +/* 0000BCA0 */ 0xC8, 0x03, 0x05, 0xFE, 0xD0, 0x03, 0x06, 0xFE, 0xD1, 0x03, 0x0B, 0x05, 0xFE, 0xD2, 0x03, 0x06, +/* 0000BCB0 */ 0xFE, 0xCA, 0x03, 0x06, 0xFE, 0xBE, 0x03, 0x06, 0xFE, 0xBD, 0x03, 0x05, 0xFE, 0xD3, 0x03, 0xFE, +/* 0000BCC0 */ 0x7C, 0x01, 0x8F, 0x03, 0x09, 0x1B, 0x00, 0x00, 0x6D, 0x1A, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 0000BCD0 */ 0x00, 0x1B, 0x5C, 0x01, 0x15, 0xE0, 0x1C, 0x00, 0x5C, 0x02, 0x1C, 0xF2, 0x03, 0x1A, 0x1A, 0x00, +/* 0000BCE0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x16, 0x1A, 0x98, 0x1A, 0x16, 0x02, 0x00, 0x00, 0x47, 0x17, +/* 0000BCF0 */ 0x1A, 0x98, 0x1A, 0x16, 0x03, 0x01, 0x00, 0x14, 0x03, 0x00, 0x1A, 0x04, 0x09, 0x08, 0x00, 0xA8, +/* 0000BD00 */ 0x1B, 0x47, 0x1A, 0x1B, 0x09, 0x09, 0x00, 0x98, 0x1B, 0x16, 0x03, 0x02, 0x00, 0x47, 0x1A, 0x1B, +/* 0000BD10 */ 0x47, 0x18, 0x1A, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x7A, 0x00, 0x8F, 0x01, 0x02, 0x1A, 0x01, +/* 0000BD20 */ 0x00, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x6A, 0x00, 0x8F, 0x03, 0x02, 0x1A, 0x02, +/* 0000BD30 */ 0x00, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x08, 0x8F, 0x03, 0x0A, 0x1B, 0x03, 0x00, 0x07, 0x03, 0x00, +/* 0000BD40 */ 0x5C, 0x00, 0x08, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, +/* 0000BD50 */ 0x7B, 0x18, 0x1C, 0x01, 0x5C, 0x01, 0x1C, 0x5D, 0x02, 0x07, 0x02, 0x00, 0xEE, 0x03, 0x1B, 0x1B, +/* 0000BD60 */ 0x02, 0x00, 0x5C, 0x01, 0x1B, 0x5D, 0x02, 0x06, 0x01, 0x00, 0x5D, 0x03, 0x09, 0x01, 0x00, 0xCE, +/* 0000BD70 */ 0x1B, 0x03, 0x00, 0x00, 0xA1, 0x00, 0x0A, 0x1B, 0xA1, 0x01, 0x0B, 0x1B, 0xA1, 0x02, 0x0C, 0x1B, +/* 0000BD80 */ 0x5C, 0x04, 0x1B, 0xA8, 0x1B, 0x5C, 0x05, 0x1B, 0xEE, 0x06, 0x1A, 0x1A, 0x01, 0x00, 0x94, 0x01, +/* 0000BD90 */ 0x02, 0x1A, 0x09, 0xA5, 0x00, 0x14, 0x03, 0x00, 0x17, 0x0D, 0x09, 0x67, 0x00, 0x8F, 0x01, 0x03, +/* 0000BDA0 */ 0x1A, 0x04, 0x00, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x57, 0x00, 0xA8, 0x1A, 0x15, +/* 0000BDB0 */ 0x03, 0x00, 0x18, 0x1A, 0x09, 0x46, 0x00, 0x8F, 0x03, 0x31, 0x1B, 0x05, 0x00, 0x6D, 0x1A, 0x1B, +/* 0000BDC0 */ 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x8F, 0x03, 0x0C, 0x1C, 0x06, 0x00, 0x07, 0x03, 0x00, +/* 0000BDD0 */ 0x5C, 0x00, 0x08, 0x8F, 0x03, 0x24, 0x1D, 0x07, 0x00, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x18, 0xEE, +/* 0000BDE0 */ 0x03, 0x1C, 0x1C, 0x04, 0x00, 0x43, 0x1C, 0x1C, 0x0E, 0x5C, 0x01, 0x1C, 0xF2, 0x02, 0x1A, 0x1A, +/* 0000BDF0 */ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x94, 0x01, 0x03, 0x1A, 0x09, 0x04, 0x00, 0x94, 0x01, 0x03, +/* 0000BE00 */ 0x0F, 0x09, 0x36, 0x00, 0x14, 0x03, 0x00, 0x17, 0x10, 0x09, 0x2E, 0x00, 0xA8, 0x1A, 0x15, 0x03, +/* 0000BE10 */ 0x00, 0x18, 0x1A, 0x09, 0x24, 0x00, 0x15, 0x03, 0x00, 0x18, 0x11, 0x09, 0x1C, 0x00, 0x15, 0x03, +/* 0000BE20 */ 0x00, 0x18, 0x12, 0x09, 0x14, 0x00, 0x15, 0x03, 0x00, 0x18, 0x13, 0x09, 0x0C, 0x00, 0x15, 0x03, +/* 0000BE30 */ 0x00, 0x18, 0x14, 0x09, 0x04, 0x00, 0x94, 0x01, 0x04, 0x18, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x0C, +/* 0000BE40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x03, 0x00, +/* 0000BE50 */ 0x00, 0xFE, 0x39, 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0x5C, 0x02, 0x0E, 0xFE, 0x63, 0x03, 0x00, 0xFE, +/* 0000BE60 */ 0x45, 0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x82, 0x00, 0x09, 0x00, 0x2C, 0x00, 0x22, +/* 0000BE70 */ 0x00, 0x4C, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x6A, 0x00, 0x9F, 0x00, 0x18, 0x00, 0x49, 0x00, 0x0A, +/* 0000BE80 */ 0x00, 0x3B, 0x00, 0x46, 0x00, 0xA9, 0x00, 0x07, 0x00, 0x4D, 0x00, 0x32, 0x00, 0xFF, 0x00, 0x06, +/* 0000BE90 */ 0x00, 0x41, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x31, 0xD4, 0x02, 0xFE, 0xAC, 0x02, 0x1E, 0xA0, +/* 0000BEA0 */ 0x41, 0xC1, 0x00, 0xFE, 0x42, 0x03, 0x2C, 0xFE, 0xD6, 0x79, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000BEB0 */ 0x01, 0x01, 0xFE, 0xD6, 0x79, 0xFE, 0xE5, 0x08, 0xFE, 0xE5, 0x08, 0x01, 0x0C, 0x07, 0x0F, 0x06, +/* 0000BEC0 */ 0x7E, 0x76, 0x01, 0x05, 0x08, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x0E, 0x0F, 0x08, 0x01, +/* 0000BED0 */ 0x01, 0x05, 0xFE, 0xAB, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x02, 0xFE, 0xD9, 0x01, 0x4F, 0x07, +/* 0000BEE0 */ 0x4F, 0x08, 0x4F, 0x0B, 0x4F, 0x0C, 0x4F, 0x0D, 0x4F, 0x09, 0x4F, 0x0A, 0x8F, 0x01, 0x4C, 0x10, +/* 0000BEF0 */ 0x00, 0x00, 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x1C, 0x00, 0x8F, 0x01, 0x09, 0x10, 0x01, +/* 0000BF00 */ 0x00, 0x62, 0x10, 0x10, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x0B, 0x00, 0x8F, 0x01, 0x4C, 0x00, +/* 0000BF10 */ 0x00, 0x00, 0x4B, 0x00, 0x09, 0x9E, 0x01, 0xA8, 0x10, 0x47, 0x07, 0x10, 0xA8, 0x10, 0x47, 0x08, +/* 0000BF20 */ 0x10, 0x8F, 0x01, 0x39, 0x10, 0x02, 0x00, 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x89, 0x00, +/* 0000BF30 */ 0x8F, 0x01, 0x3D, 0x10, 0x03, 0x00, 0x4B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, +/* 0000BF40 */ 0x10, 0x10, 0x00, 0x00, 0x47, 0x07, 0x10, 0x8F, 0x01, 0x09, 0x11, 0x01, 0x00, 0x6D, 0x10, 0x11, +/* 0000BF50 */ 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x07, 0xE0, 0x12, 0x00, 0x5C, 0x02, 0x12, +/* 0000BF60 */ 0xF2, 0x03, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x09, 0x10, 0x0F, 0x03, 0x00, +/* 0000BF70 */ 0x09, 0x09, 0x42, 0x00, 0x98, 0x10, 0x09, 0x03, 0x00, 0x00, 0x47, 0x08, 0x10, 0x8F, 0x01, 0x0C, +/* 0000BF80 */ 0x10, 0x04, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x8F, 0x01, 0x23, 0x11, 0x05, 0x00, 0x5C, +/* 0000BF90 */ 0x01, 0x11, 0x5C, 0x02, 0x07, 0x47, 0x11, 0x04, 0x01, 0x04, 0x01, 0x12, 0x08, 0x2F, 0x11, 0x11, +/* 0000BFA0 */ 0x12, 0x2F, 0x11, 0x11, 0x05, 0x5C, 0x03, 0x11, 0x5D, 0x04, 0x05, 0x02, 0x00, 0xEE, 0x05, 0x10, +/* 0000BFB0 */ 0x10, 0x02, 0x00, 0x47, 0x07, 0x10, 0x09, 0x4C, 0x00, 0x8F, 0x01, 0x09, 0x11, 0x01, 0x00, 0x6D, +/* 0000BFC0 */ 0x10, 0x11, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x8F, 0x01, 0x3D, 0x12, 0x03, 0x00, 0x4B, +/* 0000BFD0 */ 0x12, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x12, 0x12, 0x04, 0x00, 0x5C, 0x01, 0x12, +/* 0000BFE0 */ 0xE0, 0x12, 0x01, 0x5C, 0x02, 0x12, 0xF2, 0x03, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, +/* 0000BFF0 */ 0x54, 0x0A, 0x10, 0x98, 0x10, 0x0A, 0x03, 0x01, 0x00, 0x47, 0x07, 0x10, 0x98, 0x10, 0x0A, 0x06, +/* 0000C000 */ 0x02, 0x00, 0x47, 0x08, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x08, 0x10, 0x09, 0x11, 0x00, 0x01, +/* 0000C010 */ 0x32, 0x01, 0x01, 0x4C, 0x07, 0x8F, 0x01, 0x4C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x95, 0x00, +/* 0000C020 */ 0xD6, 0x00, 0x10, 0x54, 0x0B, 0x10, 0x8F, 0x01, 0x36, 0x10, 0x06, 0x00, 0x98, 0x10, 0x10, 0x07, +/* 0000C030 */ 0x03, 0x00, 0x54, 0x0C, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0C, 0x10, 0x09, 0x23, 0x00, 0x07, +/* 0000C040 */ 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0xEE, 0x03, 0x10, 0x0B, 0x05, +/* 0000C050 */ 0x00, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x8F, 0x01, 0x4C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, +/* 0000C060 */ 0x53, 0x00, 0x98, 0x10, 0x0C, 0x08, 0x04, 0x00, 0x54, 0x0D, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, +/* 0000C070 */ 0x0D, 0x10, 0x09, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, +/* 0000C080 */ 0x0D, 0xEE, 0x03, 0x10, 0x0B, 0x06, 0x00, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x09, 0x18, 0x00, +/* 0000C090 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0xEE, 0x03, 0x10, 0x0B, +/* 0000C0A0 */ 0x07, 0x00, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x8F, 0x01, 0x4C, 0x00, 0x00, 0x00, 0x4B, 0x00, +/* 0000C0B0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x17, 0x03, 0xFE, 0x39, 0x02, 0x28, 0xFE, 0xAC, +/* 0000C0C0 */ 0x03, 0x00, 0x0E, 0xFE, 0xAD, 0x03, 0x00, 0xFE, 0xEC, 0x79, 0x1B, 0x0E, 0x00, 0x00, 0x00, 0x20, +/* 0000C0D0 */ 0x00, 0x3F, 0x00, 0x0B, 0x00, 0x31, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, 0x23, 0x00, 0x0F, +/* 0000C0E0 */ 0x00, 0x7A, 0x00, 0x17, 0x00, 0x29, 0x00, 0x26, 0x00, 0x6A, 0x00, 0x07, 0x00, 0xB8, 0x00, 0x09, +/* 0000C0F0 */ 0x00, 0x26, 0x00, 0x3C, 0x00, 0xC6, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x09, 0x00, 0x1F, 0x00, 0x09, +/* 0000C100 */ 0x00, 0x29, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x06, 0x00, 0x2C, 0x00, 0x0B, 0x00, 0x8D, 0x00, 0x06, +/* 0000C110 */ 0x00, 0x28, 0x01, 0x0F, 0x00, 0x56, 0x00, 0x0A, 0x00, 0x84, 0x00, 0x18, 0x00, 0x54, 0x00, 0x0B, +/* 0000C120 */ 0x00, 0x31, 0x00, 0x09, 0x00, 0x42, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x1B, 0x00, 0x6B, 0x00, 0x18, +/* 0000C130 */ 0x00, 0x5B, 0x00, 0x0D, 0x00, 0x22, 0x00, 0x00, 0x3C, 0xC1, 0x00, 0x00, 0xBF, 0x4C, 0x80, 0x00, +/* 0000C140 */ 0x00, 0xC4, 0x00, 0xFE, 0xCA, 0x02, 0x2C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xAE, 0x03, 0x2D, 0xFE, +/* 0000C150 */ 0xFC, 0x7E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xFC, 0x7E, 0xF9, 0xF9, 0x01, 0x04, +/* 0000C160 */ 0x05, 0x08, 0x18, 0x16, 0x01, 0x01, 0x07, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xAB, 0x03, 0x05, +/* 0000C170 */ 0xFE, 0xAF, 0x03, 0x56, 0x8F, 0x01, 0x39, 0x08, 0x00, 0x00, 0x4B, 0x08, 0x0F, 0x03, 0x00, 0x08, +/* 0000C180 */ 0x09, 0x23, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, +/* 0000C190 */ 0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, +/* 0000C1A0 */ 0x09, 0x25, 0x00, 0x09, 0x20, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, +/* 0000C1B0 */ 0x00, 0x08, 0x2F, 0x00, 0x00, 0x04, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, +/* 0000C1C0 */ 0x00, 0x00, 0x02, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x31, 0x7F, 0x04, 0x00, 0x00, +/* 0000C1D0 */ 0x00, 0x00, 0x0F, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x53, 0x00, 0x22, 0x00, 0x46, 0x00, 0x00, 0x3F, +/* 0000C1E0 */ 0x5D, 0x84, 0x00, 0x80, 0xC6, 0x02, 0xFE, 0x97, 0x02, 0x32, 0xA0, 0x41, 0xD1, 0x00, 0x29, 0xFE, +/* 0000C1F0 */ 0xF5, 0x75, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xF5, 0x75, 0xFE, 0x13, 0x03, +/* 0000C200 */ 0xFE, 0x13, 0x03, 0x01, 0x06, 0x04, 0x07, 0x08, 0x1E, 0x1E, 0x01, 0x03, 0x06, 0x04, 0x05, 0x06, +/* 0000C210 */ 0x07, 0x08, 0x6F, 0x4F, 0x07, 0x96, 0x02, 0x07, 0x8F, 0x01, 0x0A, 0x07, 0x00, 0x00, 0x07, 0x03, +/* 0000C220 */ 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x08, 0x5C, 0x01, 0x08, 0x5D, 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, +/* 0000C230 */ 0x07, 0x07, 0x00, 0x00, 0x96, 0x02, 0x07, 0x8F, 0x01, 0x0C, 0x07, 0x01, 0x00, 0x07, 0x04, 0x00, +/* 0000C240 */ 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x1C, 0x08, 0x02, 0x00, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x18, 0x08, +/* 0000C250 */ 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x35, 0x09, 0x04, 0x00, 0x5C, 0x01, +/* 0000C260 */ 0x09, 0xEE, 0x02, 0x08, 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0xD4, 0x00, 0x08, 0x5C, 0x03, 0x08, +/* 0000C270 */ 0xEE, 0x04, 0xFF, 0x07, 0x01, 0x00, 0x93, 0x02, 0x00, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000C280 */ 0x24, 0x00, 0xFE, 0xA8, 0x03, 0xFE, 0x0B, 0x76, 0x04, 0x05, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x31, +/* 0000C290 */ 0x00, 0x3F, 0x00, 0xB6, 0x02, 0x0A, 0x00, 0x15, 0x00, 0x00, 0x9E, 0xC2, 0x00, 0x00, 0xBF, 0x5D, +/* 0000C2A0 */ 0x87, 0x00, 0x80, 0xC6, 0x02, 0xFE, 0x99, 0x02, 0x6B, 0xA2, 0x41, 0xD1, 0x00, 0x2A, 0xFE, 0x9F, +/* 0000C2B0 */ 0x76, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x9F, 0x76, 0xFE, 0x48, 0x02, 0xFE, +/* 0000C2C0 */ 0x48, 0x02, 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x25, 0x25, 0x02, 0x01, 0x01, 0x03, 0x08, 0x05, +/* 0000C2D0 */ 0x06, 0x07, 0x07, 0x08, 0x8D, 0x4F, 0x08, 0x96, 0x02, 0x08, 0x4F, 0x08, 0x96, 0x03, 0x08, 0x8F, +/* 0000C2E0 */ 0x02, 0x35, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x04, 0x00, 0x00, 0x96, 0x02, 0x08, 0x8F, 0x02, +/* 0000C2F0 */ 0x0A, 0x08, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x09, 0x5C, 0x01, 0x09, 0x5D, +/* 0000C300 */ 0x02, 0x02, 0x00, 0x00, 0xEE, 0x03, 0x08, 0x08, 0x00, 0x00, 0x96, 0x03, 0x08, 0x8F, 0x02, 0x0C, +/* 0000C310 */ 0x08, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, 0x1C, 0x09, 0x03, 0x00, 0x5C, +/* 0000C320 */ 0x01, 0x09, 0x8F, 0x02, 0x18, 0x09, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x02, +/* 0000C330 */ 0x0A, 0x05, 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0x09, 0x09, 0x02, 0x00, 0x5C, 0x02, 0x09, 0xD4, +/* 0000C340 */ 0x00, 0x09, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x08, 0x01, 0x00, 0x8F, 0x01, 0x02, 0x08, 0x06, +/* 0000C350 */ 0x00, 0x4B, 0x08, 0x93, 0x03, 0x09, 0x07, 0x00, 0x9D, 0x09, 0x08, 0x04, 0x00, 0x00, 0xA8, 0x00, +/* 0000C360 */ 0x24, 0x00, 0xFE, 0xA9, 0x03, 0xFE, 0xAA, 0x03, 0xFE, 0xBF, 0x76, 0x05, 0x0A, 0x00, 0x00, 0x00, +/* 0000C370 */ 0x0F, 0x00, 0x56, 0x00, 0x1F, 0x00, 0x45, 0x00, 0x3E, 0x00, 0x58, 0x01, 0x15, 0x00, 0x34, 0x00, +/* 0000C380 */ 0x00, 0x85, 0xC3, 0x00, 0x00, 0xBF, 0x4C, 0x83, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x9D, 0x02, 0x68, +/* 0000C390 */ 0xA2, 0x41, 0xD1, 0x00, 0x2B, 0xFE, 0xB6, 0x77, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 0000C3A0 */ 0xB6, 0x77, 0xEC, 0xEC, 0x41, 0x04, 0x03, 0x06, 0x0D, 0x0D, 0x03, 0x01, 0x01, 0x02, 0x05, 0x06, +/* 0000C3B0 */ 0xFE, 0x0A, 0x03, 0x2D, 0x4F, 0x04, 0x8F, 0x01, 0x02, 0x06, 0x00, 0x00, 0x4B, 0x06, 0x98, 0x06, +/* 0000C3C0 */ 0x06, 0x03, 0x00, 0x00, 0x54, 0x04, 0x06, 0x15, 0x03, 0x00, 0x04, 0x02, 0x09, 0x0E, 0x00, 0x8F, +/* 0000C3D0 */ 0x01, 0x03, 0x06, 0x01, 0x00, 0x4B, 0x06, 0x9D, 0x03, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, +/* 0000C3E0 */ 0x00, 0xFE, 0xDD, 0x77, 0x04, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x48, 0x00, 0x08, 0x00, 0x2D, +/* 0000C3F0 */ 0x00, 0x10, 0x00, 0x4F, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x72, 0x02, +/* 0000C400 */ 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA7, 0x03, 0x28, 0xFE, 0xCD, 0x6B, 0xFF, 0x00, 0x10, 0x01, +/* 0000C410 */ 0x00, 0x02, 0x02, 0xFE, 0xCD, 0x6B, 0x96, 0x96, 0x01, 0x05, 0x03, 0x06, 0x05, 0x0F, 0x0F, 0x01, +/* 0000C420 */ 0x01, 0x02, 0x05, 0x08, 0x2F, 0x5B, 0x04, 0xB4, 0x04, 0x04, 0x8F, 0x01, 0x33, 0x06, 0x00, 0x00, +/* 0000C430 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x4B, 0x07, 0x01, 0x00, 0x4B, +/* 0000C440 */ 0x07, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x03, 0xEE, 0x04, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x00, +/* 0000C450 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x0B, 0x6C, 0x02, 0x05, 0x00, 0x00, 0x00, 0x28, 0x00, 0x57, 0x00, +/* 0000C460 */ 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x6C, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, +/* 0000C470 */ 0xFE, 0xA6, 0x03, 0x27, 0xFE, 0x27, 0x6A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x27, +/* 0000C480 */ 0x6A, 0xCC, 0xCC, 0x01, 0x06, 0x03, 0x07, 0x06, 0x13, 0x12, 0x01, 0x01, 0x02, 0x06, 0x08, 0x3C, +/* 0000C490 */ 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, +/* 0000C4A0 */ 0x01, 0x32, 0x07, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8F, 0x01, +/* 0000C4B0 */ 0x49, 0x08, 0x01, 0x00, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0xEE, +/* 0000C4C0 */ 0x05, 0x00, 0x07, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x65, 0x6A, 0x03, +/* 0000C4D0 */ 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x23, 0x00, 0x2B, 0x00, 0x6A, 0x00, 0x00, 0xBF, 0x5C, 0x84, +/* 0000C4E0 */ 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x66, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA5, 0x03, 0x26, +/* 0000C4F0 */ 0xFE, 0x4D, 0x68, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x4D, 0x68, 0xC8, 0xC8, 0x01, +/* 0000C500 */ 0x06, 0x03, 0x07, 0x06, 0x13, 0x12, 0x01, 0x01, 0x02, 0x06, 0x08, 0x3C, 0x5B, 0x05, 0xB4, 0x05, +/* 0000C510 */ 0x05, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, 0x01, 0x32, 0x07, 0x00, +/* 0000C520 */ 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x47, 0x08, 0x01, 0x00, +/* 0000C530 */ 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0xEE, 0x05, 0x00, 0x07, 0x00, +/* 0000C540 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x89, 0x68, 0x03, 0x05, 0x00, 0x00, 0x00, +/* 0000C550 */ 0x0A, 0x00, 0x23, 0x00, 0x2B, 0x00, 0x68, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, +/* 0000C560 */ 0xFE, 0x60, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA4, 0x03, 0x25, 0xFE, 0x83, 0x66, 0xFF, +/* 0000C570 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x83, 0x66, 0xC0, 0xC0, 0x01, 0x06, 0x03, 0x07, 0x06, +/* 0000C580 */ 0x13, 0x12, 0x01, 0x01, 0x02, 0x06, 0x08, 0x3C, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x15, 0x05, 0x00, +/* 0000C590 */ 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8F, 0x01, 0x32, 0x07, 0x00, 0x00, 0x07, 0x05, 0x00, +/* 0000C5A0 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x45, 0x08, 0x01, 0x00, 0x4B, 0x08, 0x5C, 0x02, +/* 0000C5B0 */ 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0xEE, 0x05, 0x00, 0x07, 0x00, 0x00, 0x09, 0x02, 0x00, +/* 0000C5C0 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xBB, 0x66, 0x03, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x23, 0x00, +/* 0000C5D0 */ 0x2B, 0x00, 0x64, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x42, 0x02, 0x1D, +/* 0000C5E0 */ 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xFA, 0x02, 0x24, 0xFE, 0xE3, 0x60, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000C5F0 */ 0x03, 0x03, 0xFE, 0xE3, 0x60, 0xFE, 0x60, 0x03, 0xFE, 0x60, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, +/* 0000C600 */ 0x50, 0x4D, 0x01, 0x09, 0x08, 0x04, 0x04, 0x04, 0x04, 0x0B, 0x08, 0x06, 0xFE, 0x72, 0x03, 0x05, +/* 0000C610 */ 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x06, 0xFE, 0xA2, 0x03, 0x05, 0xFE, 0xA3, 0x03, 0xFE, +/* 0000C620 */ 0x46, 0x01, 0xA8, 0x0A, 0x8F, 0x01, 0x07, 0x0C, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000C630 */ 0x5C, 0x01, 0x08, 0xEE, 0x02, 0x0C, 0x0C, 0x00, 0x00, 0x47, 0x08, 0x0C, 0x2C, 0x0C, 0x09, 0x15, +/* 0000C640 */ 0x03, 0x00, 0x0C, 0x03, 0x09, 0x7E, 0x00, 0x62, 0x0C, 0x09, 0x00, 0x47, 0x0A, 0x0C, 0x2C, 0x0C, +/* 0000C650 */ 0x0A, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x6C, 0x00, 0x8F, 0x01, 0x31, 0x0D, 0x01, 0x00, 0x6D, +/* 0000C660 */ 0x0C, 0x0D, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, 0x0A, 0xF2, 0x02, 0x0C, 0x0C, +/* 0000C670 */ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0A, 0x0C, 0x15, 0x03, 0x00, 0x0A, 0x04, 0x09, 0x44, +/* 0000C680 */ 0x00, 0x15, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x3C, 0x00, 0x8F, 0x01, 0x09, 0x0D, 0x02, 0x00, 0x6D, +/* 0000C690 */ 0x0C, 0x0D, 0x02, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0D, 0x8F, 0x01, 0x11, 0x0E, 0x03, 0x00, 0x07, +/* 0000C6A0 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0x0E, 0x0E, 0x03, 0x00, 0x5C, 0x01, +/* 0000C6B0 */ 0x0E, 0x5D, 0x02, 0x06, 0x02, 0x00, 0x5D, 0x03, 0x07, 0x02, 0x00, 0xF2, 0x04, 0xFF, 0x0C, 0x02, +/* 0000C6C0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x2C, 0x0C, 0x0A, 0x14, 0x0B, 0x00, 0x0C, 0x03, 0x09, 0x00, 0x00, +/* 0000C6D0 */ 0x14, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x56, 0x00, 0x8F, 0x01, 0x08, 0x0C, 0x04, 0x00, 0x07, 0x04, +/* 0000C6E0 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x2B, 0x0D, 0x05, 0x00, 0x5C, 0x02, 0x0D, +/* 0000C6F0 */ 0x8F, 0x01, 0x09, 0x0E, 0x02, 0x00, 0x6D, 0x0D, 0x0E, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, +/* 0000C700 */ 0x8F, 0x01, 0x30, 0x0F, 0x06, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0F, 0x0F, +/* 0000C710 */ 0x06, 0x00, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x0D, 0x0D, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5C, +/* 0000C720 */ 0x03, 0x0D, 0xEE, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x09, 0x3B, 0x00, 0x09, 0x36, 0x00, 0x8F, 0x01, +/* 0000C730 */ 0x08, 0x0C, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8F, 0x01, 0x2C, +/* 0000C740 */ 0x0D, 0x07, 0x00, 0x5C, 0x02, 0x0D, 0x8F, 0x01, 0x30, 0x0D, 0x06, 0x00, 0x07, 0x01, 0x00, 0x5C, +/* 0000C750 */ 0x00, 0x02, 0xEE, 0x01, 0x0D, 0x0D, 0x08, 0x00, 0x5C, 0x03, 0x0D, 0xEE, 0x04, 0x00, 0x0C, 0x07, +/* 0000C760 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x64, 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x5F, +/* 0000C770 */ 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x1E, 0x61, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x34, 0x00, +/* 0000C780 */ 0x0B, 0x00, 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x20, 0x00, 0x37, 0x00, +/* 0000C790 */ 0x10, 0x00, 0x4A, 0x00, 0x3C, 0x00, 0x96, 0x00, 0x13, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x93, 0x00, +/* 0000C7A0 */ 0x38, 0x00, 0x64, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x34, 0x02, 0x28, +/* 0000C7B0 */ 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3F, 0x03, 0x23, 0xFE, 0x0F, 0x5F, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000C7C0 */ 0x04, 0x04, 0xFE, 0x0F, 0x5F, 0xFE, 0x8C, 0x01, 0xFE, 0x8C, 0x01, 0x01, 0x07, 0x05, 0x0A, 0x03, +/* 0000C7D0 */ 0x26, 0x25, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0x09, 0x07, 0x05, 0xFE, 0xF3, 0x02, 0x08, +/* 0000C7E0 */ 0x9B, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0A, 0x14, 0x03, 0x00, 0x05, 0x0A, +/* 0000C7F0 */ 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x09, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, +/* 0000C800 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000C810 */ 0x8F, 0x01, 0x09, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, +/* 0000C820 */ 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x08, 0x0A, +/* 0000C830 */ 0x0F, 0x03, 0x00, 0x08, 0x09, 0x0C, 0x00, 0x62, 0x0A, 0x08, 0x02, 0x15, 0x03, 0x00, 0x0A, 0x03, +/* 0000C840 */ 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x09, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, +/* 0000C850 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 0000C860 */ 0x8F, 0x01, 0x07, 0x0A, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0xEE, +/* 0000C870 */ 0x02, 0x00, 0x0A, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5A, 0x02, 0xFE, +/* 0000C880 */ 0x35, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0x40, 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, +/* 0000C890 */ 0x00, 0x1D, 0x00, 0x40, 0x00, 0x20, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x1D, 0x00, 0x40, +/* 0000C8A0 */ 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x27, 0x02, +/* 0000C8B0 */ 0x24, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3E, 0x03, 0x22, 0xFE, 0x4B, 0x5D, 0xFF, 0x00, 0x10, 0x01, +/* 0000C8C0 */ 0x00, 0x05, 0x05, 0xFE, 0x4B, 0x5D, 0xFE, 0x9A, 0x01, 0xFE, 0x9A, 0x01, 0x01, 0x08, 0x05, 0x0B, +/* 0000C8D0 */ 0x04, 0x27, 0x26, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0x0A, 0x07, 0x05, 0xFE, 0xF3, 0x02, +/* 0000C8E0 */ 0x08, 0x9E, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x05, +/* 0000C8F0 */ 0x0B, 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, +/* 0000C900 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000C910 */ 0x00, 0x8F, 0x01, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000C920 */ 0x0C, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x09, +/* 0000C930 */ 0x0B, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0C, 0x00, 0x62, 0x0B, 0x09, 0x02, 0x15, 0x03, 0x00, 0x0B, +/* 0000C940 */ 0x03, 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x00, 0x07, 0x02, +/* 0000C950 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x02, +/* 0000C960 */ 0x00, 0x8F, 0x01, 0x34, 0x0B, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, +/* 0000C970 */ 0x5C, 0x02, 0x08, 0xEE, 0x03, 0x00, 0x0B, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000C980 */ 0xFE, 0x5A, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0x85, 0x5D, 0x07, 0x00, 0x00, 0x00, +/* 0000C990 */ 0x00, 0x12, 0x00, 0x37, 0x00, 0x1D, 0x00, 0x40, 0x00, 0x20, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, +/* 0000C9A0 */ 0x00, 0x1D, 0x00, 0x40, 0x00, 0x1D, 0x00, 0x31, 0x00, 0x00, 0x3F, 0x5D, 0x8C, 0xE0, 0x89, 0xC6, +/* 0000C9B0 */ 0x12, 0xFE, 0x14, 0x02, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x20, 0x03, 0x20, 0xFE, 0xB6, 0x59, +/* 0000C9C0 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xB6, 0x59, 0xFE, 0x6F, 0x03, 0xFE, 0x6F, +/* 0000C9D0 */ 0x03, 0x04, 0x09, 0x0A, 0x10, 0x05, 0x20, 0x20, 0x01, 0x02, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, +/* 0000C9E0 */ 0x01, 0x0D, 0x0E, 0x0F, 0x01, 0x00, 0x08, 0x06, 0xFE, 0x9C, 0x03, 0x06, 0xFE, 0xF9, 0x02, 0x06, +/* 0000C9F0 */ 0xFE, 0x12, 0x03, 0x0C, 0x06, 0xFE, 0x14, 0x03, 0x07, 0x81, 0x96, 0x04, 0x0B, 0x96, 0x05, 0x0C, +/* 0000CA00 */ 0xCE, 0x10, 0x00, 0x00, 0x00, 0x96, 0x02, 0x10, 0x96, 0x03, 0x02, 0x8F, 0x01, 0x0C, 0x10, 0x00, +/* 0000CA10 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x1C, 0x11, 0x01, 0x00, 0x5C, 0x01, 0x11, +/* 0000CA20 */ 0x5C, 0x02, 0x0A, 0xD4, 0x00, 0x11, 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x00, 0x00, 0x8F, +/* 0000CA30 */ 0x01, 0x1B, 0x10, 0x02, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x93, 0x02, 0x11, 0x03, 0x00, +/* 0000CA40 */ 0x5C, 0x01, 0x11, 0x5D, 0x02, 0x04, 0x01, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000CA50 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x93, 0x03, 0x12, 0x04, 0x00, 0x7B, 0x12, 0x11, 0x00, 0x7B, 0x07, +/* 0000CA60 */ 0x11, 0x01, 0x7B, 0x07, 0x11, 0x02, 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x01, 0x00, 0x93, +/* 0000CA70 */ 0x02, 0x00, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, +/* 0000CA80 */ 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 0000CA90 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, +/* 0000CAA0 */ 0x9D, 0x03, 0xFE, 0x9E, 0x03, 0xFE, 0x9F, 0x03, 0xFE, 0xA0, 0x03, 0xFE, 0x09, 0x5A, 0x06, 0x06, +/* 0000CAB0 */ 0x00, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x03, 0x00, 0x17, 0x00, 0x24, 0x00, 0x70, 0x02, 0x40, +/* 0000CAC0 */ 0x00, 0x68, 0x00, 0x0A, 0x00, 0x13, 0x00, 0x00, 0xCC, 0xCA, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, +/* 0000CAD0 */ 0x29, 0xD4, 0x10, 0xFE, 0x17, 0x02, 0x41, 0xB2, 0x41, 0xD1, 0x00, 0x21, 0xFE, 0x72, 0x5A, 0xFF, +/* 0000CAE0 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x72, 0x5A, 0xFE, 0x2C, 0x02, 0xFE, 0x2C, 0x02, 0x45, +/* 0000CAF0 */ 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x03, 0x07, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x0E, +/* 0000CB00 */ 0x0F, 0x08, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0C, 0x06, 0xFE, 0x14, 0x03, 0x06, +/* 0000CB10 */ 0xFE, 0x13, 0x03, 0x0B, 0x07, 0x01, 0x01, 0xB6, 0xA8, 0x0D, 0xE5, 0x94, 0x00, 0x8F, 0x02, 0x2E, +/* 0000CB20 */ 0x10, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0B, 0x8F, 0x01, 0x04, 0x11, +/* 0000CB30 */ 0x01, 0x00, 0x5C, 0x02, 0x11, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x8F, 0x01, 0x05, 0x11, 0x02, 0x00, +/* 0000CB40 */ 0x5C, 0x04, 0x11, 0xEE, 0x05, 0x10, 0x10, 0x00, 0x00, 0x47, 0x0D, 0x10, 0x62, 0x10, 0x0D, 0x00, +/* 0000CB50 */ 0x0F, 0x03, 0x00, 0x10, 0x09, 0x56, 0x00, 0x8F, 0x02, 0x1B, 0x10, 0x03, 0x00, 0x07, 0x04, 0x00, +/* 0000CB60 */ 0x5C, 0x00, 0x02, 0x8F, 0x01, 0x02, 0x11, 0x04, 0x00, 0x5C, 0x01, 0x11, 0x8F, 0x01, 0x03, 0x11, +/* 0000CB70 */ 0x05, 0x00, 0x5C, 0x02, 0x11, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, +/* 0000CB80 */ 0x00, 0x00, 0x62, 0x12, 0x0D, 0x00, 0x7B, 0x12, 0x11, 0x01, 0x7B, 0x05, 0x11, 0x02, 0x7B, 0x05, +/* 0000CB90 */ 0x11, 0x03, 0x7B, 0x08, 0x11, 0x04, 0x5C, 0x03, 0x11, 0xEE, 0x04, 0xFF, 0x10, 0x01, 0x00, 0x8F, +/* 0000CBA0 */ 0x01, 0x03, 0x10, 0x05, 0x00, 0x2F, 0x10, 0x10, 0x0A, 0x94, 0x01, 0x03, 0x10, 0xE9, 0x09, 0x19, +/* 0000CBB0 */ 0x00, 0xE7, 0x0C, 0x06, 0x8F, 0x02, 0x29, 0x10, 0x06, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000CBC0 */ 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0xFF, 0x10, 0x02, 0x00, 0xE9, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x18, +/* 0000CBD0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 0000CBE0 */ 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xFE, 0x21, 0x02, +/* 0000CBF0 */ 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xA8, 0x5A, 0x07, +/* 0000CC00 */ 0x05, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x48, 0x00, 0x8D, 0x00, +/* 0000CC10 */ 0x14, 0x00, 0x33, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x18, 0x00, 0x8F, 0x00, 0x00, 0x3F, 0x5D, 0x8C, +/* 0000CC20 */ 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0xF0, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1F, 0x03, 0x1E, +/* 0000CC30 */ 0xFE, 0x7F, 0x55, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x7F, 0x55, 0xFE, 0x31, +/* 0000CC40 */ 0x04, 0xFE, 0x31, 0x04, 0x01, 0x08, 0x05, 0x0A, 0x05, 0x2C, 0x2A, 0x01, 0x03, 0x03, 0x03, 0x03, +/* 0000CC50 */ 0x03, 0x03, 0x03, 0x07, 0x08, 0x09, 0x06, 0xFE, 0x72, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x08, 0xA7, +/* 0000CC60 */ 0x4F, 0x06, 0x4F, 0x0A, 0x96, 0x02, 0x0A, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, +/* 0000CC70 */ 0x08, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x09, 0x8B, 0x00, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, +/* 0000CC80 */ 0x0A, 0x03, 0x09, 0x0C, 0x00, 0xCE, 0x0A, 0x01, 0x01, 0x00, 0xA1, 0x00, 0x05, 0x0A, 0x47, 0x05, +/* 0000CC90 */ 0x0A, 0x8F, 0x01, 0x31, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000CCA0 */ 0x0B, 0x5C, 0x01, 0x05, 0xF2, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x05, +/* 0000CCB0 */ 0x0A, 0x8F, 0x01, 0x31, 0x0B, 0x00, 0x00, 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000CCC0 */ 0x0B, 0x62, 0x0C, 0x05, 0x02, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, +/* 0000CCD0 */ 0x01, 0x00, 0x54, 0x06, 0x0A, 0xCE, 0x0A, 0x00, 0x02, 0x00, 0x96, 0x02, 0x0A, 0x8F, 0x01, 0x28, +/* 0000CCE0 */ 0x0A, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xD4, +/* 0000CCF0 */ 0x00, 0x0B, 0x5C, 0x03, 0x0B, 0xEE, 0x04, 0xFF, 0x0A, 0x02, 0x00, 0x93, 0x02, 0x00, 0x02, 0x00, +/* 0000CD00 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x61, 0x02, 0xF3, 0xFE, 0x99, +/* 0000CD10 */ 0x03, 0xFE, 0xB2, 0x55, 0x0A, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x08, 0x00, 0x1E, +/* 0000CD20 */ 0x00, 0x0B, 0x00, 0x2F, 0x00, 0x0C, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x24, 0x00, 0x70, +/* 0000CD30 */ 0x00, 0x08, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x8F, 0x02, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x42, 0xCD, +/* 0000CD40 */ 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xFF, 0x01, 0x2A, 0xA2, 0x41, 0xD1, +/* 0000CD50 */ 0x00, 0x1F, 0xFE, 0x31, 0x57, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x31, 0x57, 0xFE, +/* 0000CD60 */ 0x61, 0x02, 0xFE, 0x61, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x4C, 0x4A, 0x02, 0x08, 0x08, 0x04, +/* 0000CD70 */ 0x04, 0x04, 0x04, 0x0A, 0x06, 0xFE, 0x6D, 0x03, 0x06, 0xFE, 0x9A, 0x03, 0x07, 0x05, 0xFE, 0x9B, +/* 0000CD80 */ 0x03, 0x08, 0x01, 0xFF, 0xFE, 0x37, 0x01, 0x4F, 0x09, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, +/* 0000CD90 */ 0x02, 0x09, 0x0B, 0x00, 0x2C, 0x0B, 0x08, 0x15, 0x0B, 0x00, 0x0B, 0x03, 0x09, 0x00, 0x00, 0x14, +/* 0000CDA0 */ 0x03, 0x00, 0x08, 0x04, 0x09, 0x1F, 0x00, 0x8F, 0x02, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, +/* 0000CDB0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5D, 0x01, 0x05, 0x00, 0x00, 0xF2, 0x02, 0xFF, 0x0B, +/* 0000CDC0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x02, 0x31, 0x0C, 0x01, 0x00, 0x6D, 0x0B, 0x0C, 0x01, +/* 0000CDD0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0xF2, 0x02, 0x0B, 0x0B, 0x01, 0x00, 0x00, +/* 0000CDE0 */ 0x00, 0x01, 0x00, 0x47, 0x09, 0x0B, 0x8F, 0x02, 0x3F, 0x0B, 0x02, 0x00, 0x4B, 0x0B, 0x07, 0x02, +/* 0000CDF0 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x0B, 0x0B, 0x02, 0x00, 0x0F, 0x35, 0x00, +/* 0000CE00 */ 0x0B, 0x09, 0x00, 0x00, 0x8F, 0x02, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x02, 0x07, 0x02, +/* 0000CE10 */ 0x00, 0x5C, 0x00, 0x0C, 0x8F, 0x02, 0x11, 0x0D, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, +/* 0000CE20 */ 0x5C, 0x01, 0x09, 0xEE, 0x02, 0x0D, 0x0D, 0x04, 0x00, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0xFF, 0x0B, +/* 0000CE30 */ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8F, 0x02, 0x09, 0x0C, 0x00, 0x00, 0x6D, 0x0B, 0x0C, 0x03, +/* 0000CE40 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0B, 0x0B, 0x03, 0x00, 0x00, +/* 0000CE50 */ 0x00, 0x05, 0x00, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x5A, 0x00, +/* 0000CE60 */ 0x8F, 0x02, 0x0C, 0x0B, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x02, 0x1D, 0x0C, +/* 0000CE70 */ 0x05, 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x01, 0x02, 0x0C, 0x06, 0x00, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, +/* 0000CE80 */ 0x5C, 0x03, 0x09, 0xEE, 0x04, 0x0B, 0x0B, 0x06, 0x00, 0x14, 0x03, 0x00, 0x0B, 0x07, 0x09, 0x29, +/* 0000CE90 */ 0x00, 0x8F, 0x02, 0x0C, 0x0B, 0x04, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8F, 0x02, 0x1E, +/* 0000CEA0 */ 0x0C, 0x07, 0x00, 0x5C, 0x01, 0x0C, 0x8F, 0x01, 0x02, 0x0C, 0x06, 0x00, 0x4B, 0x0C, 0x5C, 0x02, +/* 0000CEB0 */ 0x0C, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x0B, 0x07, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x58, +/* 0000CEC0 */ 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x62, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x51, 0x57, 0x09, 0x02, 0x00, +/* 0000CED0 */ 0x00, 0x00, 0x1E, 0x00, 0x65, 0x00, 0x1F, 0x00, 0x47, 0x00, 0x20, 0x00, 0x32, 0x00, 0x1E, 0x00, +/* 0000CEE0 */ 0x35, 0x00, 0x32, 0x00, 0x4B, 0x00, 0x20, 0x00, 0x37, 0x00, 0x3B, 0x00, 0x65, 0x00, 0x2B, 0x00, +/* 0000CEF0 */ 0x46, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xE5, 0x01, 0x04, 0xA3, 0x41, +/* 0000CF00 */ 0xC1, 0x00, 0xFE, 0x1E, 0x03, 0x1D, 0xFE, 0x0A, 0x54, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, +/* 0000CF10 */ 0xFE, 0x0A, 0x54, 0xF8, 0xF8, 0x01, 0x05, 0x04, 0x06, 0x04, 0x1D, 0x1C, 0x01, 0x03, 0x04, 0x02, +/* 0000CF20 */ 0x02, 0x02, 0x02, 0x05, 0x08, 0x07, 0x74, 0x8F, 0x01, 0x31, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, +/* 0000CF30 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0xF2, 0x02, 0x06, 0x06, 0x00, 0x00, +/* 0000CF40 */ 0x00, 0x00, 0x00, 0x00, 0x47, 0x04, 0x06, 0x8F, 0x01, 0x41, 0x06, 0x01, 0x00, 0x4B, 0x06, 0x0F, +/* 0000CF50 */ 0x15, 0x00, 0x06, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x04, 0x06, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, +/* 0000CF60 */ 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x09, 0x07, 0x03, 0x00, 0x6D, 0x06, +/* 0000CF70 */ 0x07, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x41, 0x08, 0x01, +/* 0000CF80 */ 0x00, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0xF2, 0x03, 0x06, 0x06, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 0000CF90 */ 0x44, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5D, 0x02, 0xFE, 0x39, +/* 0000CFA0 */ 0x02, 0xFE, 0x3C, 0x54, 0x05, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x29, 0x00, 0x0F, 0x00, 0x25, +/* 0000CFB0 */ 0x00, 0x12, 0x00, 0x2F, 0x00, 0x31, 0x00, 0x48, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, +/* 0000CFC0 */ 0x00, 0xFE, 0xAA, 0x01, 0x04, 0xA1, 0x41, 0xC1, 0x00, 0xFE, 0x1D, 0x03, 0x1C, 0xFE, 0x06, 0x41, +/* 0000CFD0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x06, 0x41, 0xFE, 0xFE, 0x12, 0xFE, 0xFE, 0x12, +/* 0000CFE0 */ 0x41, 0x16, 0x25, 0x38, 0x04, 0xB0, 0x9C, 0x01, 0x03, 0x01, 0x37, 0x05, 0xFE, 0x77, 0x03, 0x05, +/* 0000CFF0 */ 0xFE, 0x78, 0x03, 0x05, 0xFE, 0x79, 0x03, 0x06, 0xFE, 0x7A, 0x03, 0x06, 0xFE, 0x7B, 0x03, 0x05, +/* 0000D000 */ 0xFE, 0x7C, 0x03, 0x05, 0xFE, 0x7D, 0x03, 0x05, 0xFE, 0x7E, 0x03, 0x05, 0xFE, 0x7F, 0x03, 0x05, +/* 0000D010 */ 0xFE, 0x80, 0x03, 0x05, 0xFE, 0x81, 0x03, 0x05, 0xFE, 0x82, 0x03, 0x05, 0xFE, 0x83, 0x03, 0x05, +/* 0000D020 */ 0xFE, 0x84, 0x03, 0x05, 0xFE, 0x85, 0x03, 0x05, 0xFE, 0x86, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x05, +/* 0000D030 */ 0xFE, 0x87, 0x03, 0x05, 0xFE, 0x88, 0x03, 0x05, 0xFE, 0x89, 0x03, 0x05, 0xFE, 0x8A, 0x03, 0x05, +/* 0000D040 */ 0xFE, 0x8B, 0x03, 0x05, 0xFE, 0x8C, 0x03, 0x05, 0xFE, 0x8D, 0x03, 0x05, 0xFE, 0x8E, 0x03, 0x05, +/* 0000D050 */ 0xFE, 0x8F, 0x03, 0x05, 0xFE, 0x90, 0x03, 0x05, 0xFE, 0x91, 0x03, 0x05, 0xFE, 0x92, 0x03, 0x05, +/* 0000D060 */ 0xFE, 0x93, 0x03, 0x05, 0xFE, 0x94, 0x03, 0x05, 0xFE, 0x95, 0x03, 0x05, 0xFE, 0x96, 0x03, 0x05, +/* 0000D070 */ 0xFE, 0x97, 0x03, 0x06, 0xFE, 0x98, 0x03, 0xFE, 0x9B, 0x02, 0x4F, 0x25, 0x4F, 0x26, 0x4F, 0x27, +/* 0000D080 */ 0x4F, 0x28, 0x4F, 0x29, 0x4F, 0x2A, 0x4F, 0x2B, 0x4F, 0x2C, 0x4F, 0x2D, 0x4F, 0x2E, 0x4F, 0x2F, +/* 0000D090 */ 0x4F, 0x30, 0x4F, 0x31, 0x4F, 0x32, 0x4F, 0x33, 0x4F, 0x34, 0x4F, 0x35, 0x4F, 0x36, 0x54, 0x25, +/* 0000D0A0 */ 0x02, 0x54, 0x26, 0x03, 0x47, 0x38, 0x04, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, +/* 0000D0B0 */ 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D0C0 */ 0x06, 0x54, 0x27, 0x38, 0x54, 0x28, 0x07, 0x2F, 0x38, 0x08, 0x09, 0x54, 0x29, 0x38, 0x47, 0x38, +/* 0000D0D0 */ 0x0A, 0x01, 0x04, 0x01, 0x39, 0x28, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, +/* 0000D0E0 */ 0x01, 0x39, 0x29, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x2A, 0x38, 0x47, 0x38, +/* 0000D0F0 */ 0x0C, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0D, 0x54, 0x2B, +/* 0000D100 */ 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D110 */ 0x0E, 0x54, 0x2C, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x2C, 0x2F, 0x38, 0x38, 0x39, +/* 0000D120 */ 0x2F, 0x38, 0x38, 0x0F, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D130 */ 0x10, 0x54, 0x2D, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, +/* 0000D140 */ 0x2F, 0x38, 0x38, 0x11, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D150 */ 0x12, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2E, +/* 0000D160 */ 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D170 */ 0x14, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2F, +/* 0000D180 */ 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D190 */ 0x15, 0x54, 0x30, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, +/* 0000D1A0 */ 0x2F, 0x38, 0x38, 0x16, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000D1B0 */ 0x17, 0x54, 0x31, 0x38, 0x47, 0x38, 0x12, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, +/* 0000D1C0 */ 0x2F, 0x38, 0x38, 0x18, 0x2F, 0x38, 0x0A, 0x38, 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x31, +/* 0000D1D0 */ 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1A, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x05, 0x01, +/* 0000D1E0 */ 0x04, 0x01, 0x3A, 0x25, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1B, 0x2F, 0x38, 0x38, 0x39, +/* 0000D1F0 */ 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x32, 0x38, 0x47, 0x38, 0x1C, 0x01, 0x04, 0x01, 0x39, 0x32, 0x2F, +/* 0000D200 */ 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x30, 0x2F, +/* 0000D210 */ 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x1D, 0x01, 0x04, +/* 0000D220 */ 0x01, 0x3A, 0x2F, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x54, +/* 0000D230 */ 0x33, 0x38, 0x47, 0x38, 0x19, 0x01, 0x04, 0x01, 0x39, 0x2E, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, +/* 0000D240 */ 0x38, 0x1F, 0x47, 0x39, 0x20, 0x01, 0x04, 0x01, 0x3A, 0x2D, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, +/* 0000D250 */ 0x39, 0x21, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x2B, 0x2F, 0x39, +/* 0000D260 */ 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x22, 0x2F, 0x38, 0x38, 0x39, 0x54, 0x34, 0x38, 0x47, 0x38, 0x23, +/* 0000D270 */ 0x01, 0x04, 0x01, 0x39, 0x33, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x23, 0x01, 0x04, 0x01, +/* 0000D280 */ 0x39, 0x34, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x23, 0x54, 0x35, 0x38, 0x47, 0x38, 0x0A, +/* 0000D290 */ 0x01, 0x04, 0x01, 0x39, 0x35, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, +/* 0000D2A0 */ 0x39, 0x2B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2A, 0x2F, +/* 0000D2B0 */ 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x36, 0x38, 0x8F, 0x01, 0x0F, 0x38, 0x00, 0x00, +/* 0000D2C0 */ 0x07, 0x03, 0x00, 0x5C, 0x01, 0x33, 0x5D, 0x02, 0x24, 0x00, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x00, +/* 0000D2D0 */ 0x00, 0x01, 0x32, 0x01, 0x01, 0x42, 0x38, 0x8F, 0x01, 0x0F, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, +/* 0000D2E0 */ 0x5C, 0x01, 0x34, 0x5D, 0x02, 0x24, 0x01, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x01, 0x00, 0x01, 0x32, +/* 0000D2F0 */ 0x01, 0x01, 0x43, 0x38, 0x8F, 0x01, 0x0F, 0x38, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x36, +/* 0000D300 */ 0x5D, 0x02, 0x24, 0x02, 0x00, 0xC3, 0x03, 0x38, 0x38, 0x02, 0x00, 0x01, 0x32, 0x01, 0x01, 0x44, +/* 0000D310 */ 0x38, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xE6, 0x45, 0x16, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, +/* 0000D320 */ 0x00, 0x03, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x33, 0x00, 0x03, 0x00, 0x77, 0x00, 0x07, 0x00, 0xC0, +/* 0000D330 */ 0x00, 0x20, 0x00, 0x44, 0x00, 0x13, 0x00, 0x7D, 0x00, 0x13, 0x00, 0x94, 0x00, 0x20, 0x00, 0x83, +/* 0000D340 */ 0x00, 0x2D, 0x00, 0x83, 0x00, 0x20, 0x00, 0x74, 0x00, 0x13, 0x00, 0x6A, 0x00, 0x20, 0x00, 0x7A, +/* 0000D350 */ 0x00, 0x43, 0x00, 0x00, 0x04, 0x3B, 0x00, 0x4C, 0x01, 0x3B, 0x00, 0x5A, 0x01, 0x20, 0x00, 0x4B, +/* 0000D360 */ 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x1D, 0x00, 0x66, 0x00, 0x1D, 0x00, 0x8B, 0x00, 0x1F, 0x00, 0x72, +/* 0000D370 */ 0x00, 0x00, 0xBF, 0x4C, 0x00, 0x00, 0x10, 0xC4, 0x00, 0xFE, 0xA3, 0x01, 0x04, 0xA1, 0x41, 0xC1, +/* 0000D380 */ 0x00, 0xFE, 0x1C, 0x03, 0x1B, 0xFE, 0xC9, 0x3F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, +/* 0000D390 */ 0xC9, 0x3F, 0x55, 0x55, 0x41, 0x02, 0x02, 0x03, 0x05, 0x05, 0x01, 0x01, 0x02, 0x0D, 0xE0, 0x03, +/* 0000D3A0 */ 0x00, 0x01, 0x32, 0x01, 0x01, 0x41, 0x03, 0xA8, 0x00, 0x24, 0x00, 0x0A, 0xFE, 0x76, 0x03, 0x01, +/* 0000D3B0 */ 0xFE, 0xF7, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x26, 0x00, 0x00, 0xBF, 0x5C, 0x85, +/* 0000D3C0 */ 0xE0, 0x21, 0xD4, 0x00, 0xFE, 0x92, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1B, 0x03, 0x1A, +/* 0000D3D0 */ 0xFE, 0x64, 0x3D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x64, 0x3D, 0xFE, 0x45, 0x02, +/* 0000D3E0 */ 0xFE, 0x45, 0x02, 0x01, 0x0C, 0x07, 0x0F, 0x08, 0x3C, 0x3B, 0x01, 0x01, 0x06, 0x05, 0x03, 0x03, +/* 0000D3F0 */ 0x03, 0x03, 0x01, 0x0E, 0x0F, 0x06, 0xFE, 0x72, 0x03, 0x08, 0x06, 0xFE, 0x73, 0x03, 0x05, 0xFE, +/* 0000D400 */ 0x74, 0x03, 0x06, 0xFE, 0x75, 0x03, 0xEE, 0x4F, 0x0C, 0x4F, 0x0D, 0x98, 0x10, 0x07, 0x08, 0x00, +/* 0000D410 */ 0x00, 0x54, 0x0C, 0x10, 0x2C, 0x10, 0x0C, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0xCC, 0x00, 0x8F, +/* 0000D420 */ 0x01, 0x31, 0x11, 0x00, 0x00, 0x6D, 0x10, 0x11, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, +/* 0000D430 */ 0x01, 0x0C, 0xF2, 0x02, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0D, 0x10, 0x8F, +/* 0000D440 */ 0x01, 0x27, 0x10, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0D, 0xEE, 0x02, +/* 0000D450 */ 0x10, 0x10, 0x01, 0x00, 0x0F, 0x13, 0x00, 0x10, 0x09, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x0D, 0x09, +/* 0000D460 */ 0x09, 0x00, 0x00, 0x11, 0x03, 0x00, 0x0D, 0x0A, 0x09, 0x5D, 0x00, 0x8F, 0x01, 0x09, 0x11, 0x02, +/* 0000D470 */ 0x00, 0x6D, 0x10, 0x11, 0x01, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x11, 0x8F, 0x01, 0x11, 0x12, 0x03, +/* 0000D480 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0xEE, 0x02, 0x12, 0x12, 0x03, 0x00, +/* 0000D490 */ 0x5C, 0x01, 0x12, 0x8F, 0x01, 0x11, 0x12, 0x03, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 0000D4A0 */ 0x01, 0x08, 0xEE, 0x02, 0x12, 0x12, 0x04, 0x00, 0x5C, 0x02, 0x12, 0x2F, 0x12, 0x04, 0x09, 0x2F, +/* 0000D4B0 */ 0x12, 0x12, 0x05, 0x2F, 0x12, 0x12, 0x0A, 0x2F, 0x12, 0x12, 0x06, 0x5C, 0x03, 0x12, 0xF2, 0x04, +/* 0000D4C0 */ 0xFF, 0x10, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8F, 0x01, 0x15, 0x11, 0x04, 0x00, 0x6D, 0x10, +/* 0000D4D0 */ 0x11, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0x00, 0x10, 0x02, +/* 0000D4E0 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, +/* 0000D4F0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5E, 0x02, 0xFE, 0x5F, 0x02, 0x1F, 0xFE, 0xB6, 0x3D, 0x08, +/* 0000D500 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x33, 0x00, 0x20, 0x00, 0x41, 0x00, +/* 0000D510 */ 0x2C, 0x00, 0x65, 0x00, 0x5D, 0x00, 0x8D, 0x00, 0x23, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1F, 0x00, +/* 0000D520 */ 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x78, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, +/* 0000D530 */ 0xFE, 0x1A, 0x03, 0x19, 0xFE, 0x47, 0x3A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x47, +/* 0000D540 */ 0x3A, 0xFE, 0x17, 0x03, 0xFE, 0x17, 0x03, 0x01, 0x0B, 0x0A, 0x11, 0x0A, 0x51, 0x4B, 0x01, 0x01, +/* 0000D550 */ 0x08, 0x06, 0x04, 0x04, 0x04, 0x04, 0x10, 0x06, 0xFE, 0x6C, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x06, +/* 0000D560 */ 0xFE, 0x6E, 0x03, 0x08, 0x01, 0xFF, 0x05, 0xFE, 0x6F, 0x03, 0x05, 0xFE, 0x70, 0x03, 0x05, 0xFE, +/* 0000D570 */ 0x71, 0x03, 0xFE, 0x48, 0x01, 0x4F, 0x0F, 0x98, 0x11, 0x0A, 0x0B, 0x00, 0x00, 0x47, 0x0F, 0x11, +/* 0000D580 */ 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0F, 0x11, 0x09, 0x29, 0x01, 0x0C, 0x03, 0x00, 0x0C, 0x02, 0x09, +/* 0000D590 */ 0x20, 0x00, 0x8F, 0x01, 0x31, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 0000D5A0 */ 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, +/* 0000D5B0 */ 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x31, 0x12, 0x00, 0x00, +/* 0000D5C0 */ 0x6D, 0x11, 0x12, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, +/* 0000D5D0 */ 0x11, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x04, 0x09, +/* 0000D5E0 */ 0x20, 0x00, 0x8F, 0x01, 0x31, 0x12, 0x00, 0x00, 0x6D, 0x11, 0x12, 0x02, 0x07, 0x02, 0x00, 0x5C, +/* 0000D5F0 */ 0x00, 0x12, 0x5C, 0x01, 0x0F, 0xF2, 0x02, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, +/* 0000D600 */ 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0D, 0x11, 0x09, 0xA1, 0x00, 0x8F, 0x01, 0x0C, 0x11, +/* 0000D610 */ 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8F, 0x01, 0x1D, 0x12, 0x02, 0x00, 0x5C, 0x01, +/* 0000D620 */ 0x12, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0F, 0xEE, 0x04, 0x11, 0x11, 0x03, 0x00, 0x0C, 0x03, 0x00, +/* 0000D630 */ 0x11, 0x06, 0x09, 0x78, 0x00, 0x8F, 0x01, 0x09, 0x12, 0x03, 0x00, 0x6D, 0x11, 0x12, 0x03, 0x07, +/* 0000D640 */ 0x04, 0x00, 0x5C, 0x00, 0x12, 0x8F, 0x01, 0x11, 0x13, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000D650 */ 0x05, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x13, 0x13, 0x05, 0x00, 0x5C, 0x01, 0x13, 0x8F, 0x01, 0x11, +/* 0000D660 */ 0x13, 0x04, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0B, 0xEE, 0x02, 0x13, 0x13, +/* 0000D670 */ 0x06, 0x00, 0x5C, 0x02, 0x13, 0x8F, 0x01, 0x0C, 0x13, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 0000D680 */ 0x05, 0x8F, 0x01, 0x1F, 0x14, 0x05, 0x00, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0D, 0x5D, 0x03, 0x08, +/* 0000D690 */ 0x07, 0x00, 0xEE, 0x04, 0x13, 0x13, 0x07, 0x00, 0x2F, 0x13, 0x07, 0x13, 0x2F, 0x13, 0x13, 0x09, +/* 0000D6A0 */ 0x5C, 0x03, 0x13, 0xF2, 0x04, 0xFF, 0x11, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x47, 0x00, 0x0F, +/* 0000D6B0 */ 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5C, 0x02, +/* 0000D6C0 */ 0xFE, 0x5D, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x5F, 0x02, 0xFE, 0x8F, 0x3A, 0x0D, 0x02, 0x00, 0x00, +/* 0000D6D0 */ 0x00, 0x09, 0x00, 0x28, 0x00, 0x0A, 0x00, 0x27, 0x00, 0x08, 0x00, 0x29, 0x00, 0x20, 0x00, 0x45, +/* 0000D6E0 */ 0x00, 0x08, 0x00, 0x28, 0x00, 0x20, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x28, 0x00, 0x20, 0x00, 0x3D, +/* 0000D6F0 */ 0x00, 0x33, 0x00, 0x6B, 0x00, 0x78, 0x00, 0xA6, 0x00, 0x06, 0x00, 0x21, 0x00, 0x08, 0x00, 0x15, +/* 0000D700 */ 0x00, 0x00, 0x3F, 0x5C, 0x84, 0xE0, 0x09, 0xC4, 0x12, 0xFE, 0x4D, 0x01, 0x14, 0xA0, 0x41, 0xD1, +/* 0000D710 */ 0x00, 0x12, 0xFE, 0x36, 0x35, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x36, 0x35, +/* 0000D720 */ 0xFE, 0xE0, 0x04, 0xFE, 0xE0, 0x04, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, 0x01, 0x01, 0x01, 0x06, +/* 0000D730 */ 0x06, 0x06, 0x06, 0x01, 0x0A, 0x06, 0xFE, 0x66, 0x03, 0x06, 0xFE, 0x67, 0x03, 0x06, 0xFE, 0x68, +/* 0000D740 */ 0x03, 0x06, 0xFE, 0x69, 0x03, 0x06, 0xFE, 0x6A, 0x03, 0x06, 0xFE, 0x6B, 0x03, 0x07, 0x08, 0x76, +/* 0000D750 */ 0x8F, 0x01, 0x0A, 0x0B, 0x00, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, +/* 0000D760 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x0D, 0x7B, 0x0D, 0x0C, 0x00, +/* 0000D770 */ 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x01, 0x0D, 0x7B, 0x0D, 0x0C, 0x01, 0x01, 0x65, 0x01, 0x0D, +/* 0000D780 */ 0x0C, 0xD4, 0x02, 0x0D, 0x7B, 0x0D, 0x0C, 0x02, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x03, 0x0D, +/* 0000D790 */ 0x7B, 0x0D, 0x0C, 0x03, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x04, 0x0D, 0x7B, 0x0D, 0x0C, 0x04, +/* 0000D7A0 */ 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x05, 0x0D, 0x7B, 0x0D, 0x0C, 0x05, 0x01, 0x65, 0x01, 0x0D, +/* 0000D7B0 */ 0x0C, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x08, 0x00, 0x00, 0xEE, 0x03, 0x00, 0x0B, 0x00, 0x00, 0x09, +/* 0000D7C0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, +/* 0000D7D0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x00, 0x00, 0x5E, 0x02, 0x00, +/* 0000D7E0 */ 0x00, 0x5C, 0x02, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x6B, 0x03, 0x00, 0x00, 0xFE, 0x66, 0x03, +/* 0000D7F0 */ 0xFE, 0x5D, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x61, 0x02, 0xFE, 0x6B, 0x03, 0xFE, +/* 0000D800 */ 0x4C, 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0xC9, 0x04, 0x00, 0x1B, 0xDB, 0x00, 0x00, +/* 0000D810 */ 0xAE, 0xDA, 0x00, 0x00, 0x41, 0xDA, 0x00, 0x00, 0xD4, 0xD9, 0x00, 0x00, 0xD1, 0xD8, 0x00, 0x00, +/* 0000D820 */ 0x24, 0xD8, 0x00, 0x00, 0xBF, 0x7C, 0x84, 0x01, 0x00, 0xC4, 0x04, 0xFE, 0x6B, 0x01, 0x19, 0xA2, +/* 0000D830 */ 0x41, 0xC1, 0x00, 0xFE, 0x6B, 0x03, 0x18, 0xFE, 0xCA, 0x38, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 0000D840 */ 0x03, 0xFE, 0xCA, 0x38, 0xFE, 0x35, 0x01, 0xFE, 0x35, 0x01, 0x01, 0x05, 0x04, 0x07, 0x05, 0x1C, +/* 0000D850 */ 0x1A, 0x19, 0x01, 0x02, 0x03, 0x01, 0x06, 0x00, 0x58, 0x08, 0x0B, 0x5C, 0xEB, 0x00, 0xEC, 0x00, +/* 0000D860 */ 0x0F, 0x03, 0x00, 0x04, 0x09, 0x4B, 0x00, 0x8F, 0x01, 0x0C, 0x07, 0x00, 0x00, 0x07, 0x04, 0x00, +/* 0000D870 */ 0x5C, 0x00, 0x02, 0x8F, 0x01, 0x19, 0x08, 0x01, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x04, 0x5C, +/* 0000D880 */ 0x03, 0x05, 0xEE, 0x04, 0x07, 0x07, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x08, 0x00, 0x47, +/* 0000D890 */ 0x00, 0x03, 0xED, 0x00, 0x09, 0x1F, 0x00, 0x8F, 0x01, 0x16, 0x07, 0x02, 0x00, 0x07, 0x02, 0x00, +/* 0000D8A0 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0xEE, 0x02, 0x07, 0x07, 0x01, 0x00, 0x47, 0x04, 0x07, 0x09, +/* 0000D8B0 */ 0xAC, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x1F, 0x39, 0x05, 0x04, 0x00, 0x00, 0x00, +/* 0000D8C0 */ 0x07, 0x00, 0x19, 0x00, 0x28, 0x00, 0x54, 0x00, 0x08, 0x00, 0x37, 0x00, 0x1F, 0x00, 0x3B, 0x00, +/* 0000D8D0 */ 0x00, 0xBF, 0x5C, 0x94, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x62, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, +/* 0000D8E0 */ 0xFE, 0x6A, 0x03, 0x17, 0xFE, 0xB3, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xB3, +/* 0000D8F0 */ 0x37, 0xFB, 0xFB, 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x05, 0x01, 0x04, 0x02, 0x02, +/* 0000D900 */ 0x02, 0x02, 0x09, 0x08, 0x01, 0x00, 0x01, 0x02, 0x01, 0x20, 0xAA, 0x8F, 0x01, 0x10, 0x0A, 0x00, +/* 0000D910 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x0A, 0x0A, 0x00, 0x00, +/* 0000D920 */ 0x47, 0x07, 0x0A, 0x47, 0x08, 0x03, 0x8F, 0x01, 0x27, 0x0A, 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 0000D930 */ 0x00, 0x02, 0x5C, 0x01, 0x07, 0xEE, 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x0F, 0x6C, 0x00, 0x0A, 0x09, +/* 0000D940 */ 0x00, 0x00, 0x8F, 0x01, 0x26, 0x0A, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, +/* 0000D950 */ 0x07, 0xEE, 0x02, 0x0A, 0x0A, 0x02, 0x00, 0x0F, 0x03, 0x00, 0x0A, 0x09, 0x4D, 0x00, 0x8F, 0x01, +/* 0000D960 */ 0x15, 0x0B, 0x03, 0x00, 0x6D, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x47, 0x0C, +/* 0000D970 */ 0x07, 0x8F, 0x01, 0x15, 0x0E, 0x03, 0x00, 0x6D, 0x0D, 0x0E, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000D980 */ 0x0E, 0x5D, 0x01, 0x04, 0x04, 0x00, 0x5D, 0x02, 0x05, 0x04, 0x00, 0xF2, 0x03, 0x0D, 0x0D, 0x01, +/* 0000D990 */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x34, 0x0C, 0x0C, 0x0D, 0x00, 0x00, 0x5C, 0x01, 0x0C, 0xF2, 0x02, +/* 0000D9A0 */ 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x08, 0x0A, 0x47, 0x00, 0x08, 0x09, 0x02, +/* 0000D9B0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x17, 0x25, 0xFE, 0xD2, 0x37, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, +/* 0000D9C0 */ 0x00, 0x29, 0x00, 0x03, 0x00, 0x19, 0x00, 0x38, 0x00, 0x38, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x08, +/* 0000D9D0 */ 0x00, 0x18, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x5E, 0x01, 0x1E, 0xA2, +/* 0000D9E0 */ 0x41, 0xC1, 0x00, 0xFE, 0x69, 0x03, 0x16, 0xFE, 0x3D, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, +/* 0000D9F0 */ 0x02, 0xFE, 0x3D, 0x37, 0x5D, 0x5D, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, +/* 0000DA00 */ 0x04, 0x08, 0x31, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, 0x05, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x0D, +/* 0000DA10 */ 0x05, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, +/* 0000DA20 */ 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, +/* 0000DA30 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5C, 0x37, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x3D, 0x00, +/* 0000DA40 */ 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x5A, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, +/* 0000DA50 */ 0xFE, 0x68, 0x03, 0x15, 0xFE, 0xC6, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xC6, +/* 0000DA60 */ 0x36, 0x56, 0x56, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x04, 0x08, 0x31, +/* 0000DA70 */ 0xA8, 0x05, 0x14, 0x03, 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, 0x47, 0x00, 0x05, 0x09, +/* 0000DA80 */ 0x18, 0x00, 0x8F, 0x01, 0x10, 0x05, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, +/* 0000DA90 */ 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000DAA0 */ 0x00, 0xFE, 0xE5, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x36, 0x00, 0x00, 0xBF, 0x5C, +/* 0000DAB0 */ 0x84, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x56, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x67, 0x03, +/* 0000DAC0 */ 0x14, 0xFE, 0x51, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x51, 0x36, 0x5C, 0x5C, +/* 0000DAD0 */ 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x04, 0x08, 0x31, 0xA8, 0x05, 0x15, +/* 0000DAE0 */ 0x03, 0x00, 0x03, 0x05, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x11, 0x05, 0x00, 0x00, 0x07, 0x02, 0x00, +/* 0000DAF0 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, +/* 0000DB00 */ 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x70, +/* 0000DB10 */ 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x3C, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, +/* 0000DB20 */ 0xC4, 0x00, 0xFE, 0x4F, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x66, 0x03, 0x13, 0xFE, 0x78, +/* 0000DB30 */ 0x35, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x78, 0x35, 0xC0, 0xC0, 0x01, 0x04, 0x04, +/* 0000DB40 */ 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x07, 0x08, 0x53, 0x14, +/* 0000DB50 */ 0x03, 0x00, 0x04, 0x02, 0x09, 0x1A, 0x00, 0x8F, 0x01, 0x09, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, +/* 0000DB60 */ 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x07, 0xF2, 0x01, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000DB70 */ 0x00, 0xA8, 0x06, 0x15, 0x03, 0x00, 0x04, 0x06, 0x09, 0x1B, 0x00, 0x8F, 0x01, 0x0E, 0x06, 0x01, +/* 0000DB80 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0xEE, 0x02, 0x06, 0x06, 0x01, 0x00, +/* 0000DB90 */ 0x47, 0x00, 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000DBA0 */ 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x97, 0x35, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x26, +/* 0000DBB0 */ 0x00, 0x1A, 0x00, 0x3E, 0x00, 0x2F, 0x00, 0x3C, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x31, 0xD4, +/* 0000DBC0 */ 0x00, 0xFE, 0x32, 0x01, 0x20, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0x3C, 0x03, 0x11, 0xFE, 0xAF, 0x31, +/* 0000DBD0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xAF, 0x31, 0xFE, 0x70, 0x03, 0xFE, 0x70, 0x03, +/* 0000DBE0 */ 0x01, 0x07, 0x05, 0x08, 0x06, 0x41, 0x41, 0x01, 0x02, 0x05, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, +/* 0000DBF0 */ 0x01, 0x07, 0x08, 0x08, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x01, 0x01, 0x4F, 0x05, 0x4F, 0x06, 0x8F, +/* 0000DC00 */ 0x01, 0x40, 0x09, 0x00, 0x00, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0B, 0x00, 0x8F, 0x01, +/* 0000DC10 */ 0x40, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xE1, 0x00, 0x8F, 0x01, 0x39, 0x09, 0x01, 0x00, 0x4B, +/* 0000DC20 */ 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x82, 0x00, 0x8F, 0x01, 0x42, 0x09, 0x02, 0x00, 0x4B, 0x09, +/* 0000DC30 */ 0x0F, 0x15, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x05, 0x09, 0x03, 0x00, 0x07, 0x01, 0x00, +/* 0000DC40 */ 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x3D, 0x09, 0x04, 0x00, 0x4B, +/* 0000DC50 */ 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x09, 0x09, 0x01, 0x00, 0x54, 0x05, 0x09, +/* 0000DC60 */ 0x8F, 0x01, 0x09, 0x0A, 0x05, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, +/* 0000DC70 */ 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x42, 0x0B, 0x02, 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0xF2, 0x03, +/* 0000DC80 */ 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x06, 0x09, 0x0F, 0x03, 0x00, 0x06, 0x09, +/* 0000DC90 */ 0x0F, 0x00, 0x98, 0x09, 0x06, 0x03, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x40, 0x09, 0x09, 0x06, +/* 0000DCA0 */ 0x00, 0x01, 0x32, 0x01, 0x01, 0x40, 0x05, 0x09, 0x43, 0x00, 0x8F, 0x01, 0x09, 0x0A, 0x05, 0x00, +/* 0000DCB0 */ 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x8F, 0x01, 0x3D, 0x0B, 0x04, 0x00, +/* 0000DCC0 */ 0x4B, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0x0B, 0x0B, 0x04, 0x00, 0x5C, 0x01, +/* 0000DCD0 */ 0x0B, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0000DCE0 */ 0x00, 0x98, 0x09, 0x09, 0x04, 0x01, 0x00, 0x01, 0x32, 0x01, 0x01, 0x40, 0x09, 0x8F, 0x01, 0x40, +/* 0000DCF0 */ 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0x09, +/* 0000DD00 */ 0xFE, 0x65, 0x03, 0x00, 0xFE, 0xC5, 0x31, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x2B, 0x00, +/* 0000DD10 */ 0x0B, 0x00, 0x33, 0x00, 0x0F, 0x00, 0x26, 0x00, 0x0F, 0x00, 0x29, 0x00, 0x12, 0x00, 0x33, 0x00, +/* 0000DD20 */ 0x17, 0x00, 0x2C, 0x00, 0x2B, 0x00, 0x4D, 0x00, 0x07, 0x00, 0x5B, 0x00, 0x0F, 0x00, 0x49, 0x00, +/* 0000DD30 */ 0x09, 0x00, 0xCB, 0x00, 0x43, 0x00, 0x6D, 0x00, 0x0D, 0x00, 0x24, 0x00, 0x00, 0xBF, 0x7C, 0x85, +/* 0000DD40 */ 0xE1, 0x01, 0xC4, 0x04, 0xFE, 0x20, 0x01, 0x19, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3B, 0x03, 0x10, +/* 0000DD50 */ 0xFE, 0x8C, 0x2E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x8C, 0x2E, 0xFE, 0x91, 0x02, +/* 0000DD60 */ 0xFE, 0x91, 0x02, 0x01, 0x0C, 0x06, 0x10, 0x06, 0x41, 0x36, 0x18, 0x01, 0x01, 0x04, 0x04, 0x01, +/* 0000DD70 */ 0x01, 0x01, 0x01, 0x01, 0x0F, 0x64, 0xB5, 0x05, 0xFE, 0x64, 0x03, 0x08, 0x01, 0x00, 0x01, 0x01, +/* 0000DD80 */ 0xDC, 0xA8, 0x0D, 0xA8, 0x0E, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x0C, 0x00, 0x8F, 0x01, 0x2C, +/* 0000DD90 */ 0x11, 0x00, 0x00, 0x47, 0x10, 0x11, 0x09, 0x09, 0x00, 0x8F, 0x01, 0x2B, 0x11, 0x01, 0x00, 0x47, +/* 0000DDA0 */ 0x10, 0x11, 0x47, 0x0A, 0x10, 0x8F, 0x01, 0x0B, 0x10, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000DDB0 */ 0x03, 0x5C, 0x01, 0x06, 0xEE, 0x02, 0x10, 0x10, 0x00, 0x00, 0x47, 0x0B, 0x10, 0x07, 0x01, 0x00, +/* 0000DDC0 */ 0x5C, 0x00, 0x03, 0xEE, 0x01, 0x10, 0x09, 0x01, 0x00, 0x47, 0x0C, 0x10, 0xA8, 0x10, 0x15, 0x03, +/* 0000DDD0 */ 0x00, 0x0B, 0x10, 0x09, 0x06, 0x00, 0x47, 0x10, 0x0B, 0x09, 0x03, 0x00, 0x47, 0x10, 0x04, 0x47, +/* 0000DDE0 */ 0x0B, 0x10, 0x47, 0x0D, 0x04, 0xEB, 0x00, 0xEC, 0x00, 0x12, 0x03, 0x00, 0x0D, 0x0B, 0x09, 0x43, +/* 0000DDF0 */ 0x00, 0x8F, 0x01, 0x2E, 0x10, 0x03, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x98, 0x11, 0x06, +/* 0000DE00 */ 0x0D, 0x00, 0x00, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x08, 0x5C, 0x04, 0x0C, 0xEE, +/* 0000DE10 */ 0x05, 0x10, 0x10, 0x02, 0x00, 0x47, 0x0E, 0x10, 0x62, 0x10, 0x0E, 0x00, 0xA8, 0x11, 0x15, 0x03, +/* 0000DE20 */ 0x00, 0x10, 0x11, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0xED, 0x00, 0x09, 0x2D, 0x00, 0x28, 0x0D, +/* 0000DE30 */ 0x0D, 0x09, 0xB3, 0xFF, 0xED, 0x00, 0x8F, 0x01, 0x2E, 0x10, 0x03, 0x00, 0x07, 0x05, 0x00, 0x5C, +/* 0000DE40 */ 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0A, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x5C, 0x04, 0x0C, +/* 0000DE50 */ 0xEE, 0x05, 0x00, 0x10, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x21, 0x02, +/* 0000DE60 */ 0xFE, 0xDB, 0x2E, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x58, 0x00, 0x18, 0x00, 0x34, 0x00, +/* 0000DE70 */ 0x0F, 0x00, 0x32, 0x00, 0x16, 0x00, 0x39, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x1F, 0x00, +/* 0000DE80 */ 0x27, 0x00, 0x69, 0x00, 0x0E, 0x00, 0x35, 0x00, 0x08, 0x00, 0x4F, 0xFF, 0x08, 0x00, 0xE2, 0x00, +/* 0000DE90 */ 0x25, 0x00, 0x51, 0x00, 0x00, 0x3F, 0x5D, 0x8D, 0xE0, 0xB9, 0xD6, 0x12, 0xE8, 0x1E, 0xA2, 0x41, +/* 0000DEA0 */ 0xC1, 0x00, 0xFE, 0x3A, 0x03, 0x0D, 0xFE, 0xE0, 0x24, 0x02, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, +/* 0000DEB0 */ 0x05, 0xFE, 0xE0, 0x24, 0xFE, 0x91, 0x09, 0xFE, 0x91, 0x09, 0x03, 0x0E, 0x0B, 0x15, 0x05, 0x71, +/* 0000DEC0 */ 0x6A, 0x01, 0x01, 0x09, 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, 0x13, 0x14, +/* 0000DED0 */ 0x15, 0x07, 0x08, 0x01, 0x01, 0x01, 0x00, 0x06, 0xFE, 0x5A, 0x03, 0x05, 0xFE, 0x5C, 0x03, 0x06, +/* 0000DEE0 */ 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0x5E, 0x03, 0x06, 0xFE, 0x5F, 0x03, 0xFE, 0xC2, 0x01, 0x96, 0x03, +/* 0000DEF0 */ 0x0B, 0x96, 0x04, 0x0D, 0x4F, 0x11, 0x8F, 0x01, 0x09, 0x17, 0x00, 0x00, 0x6D, 0x16, 0x17, 0x00, +/* 0000DF00 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x17, 0x93, 0x03, 0x18, 0x01, 0x00, 0x5C, 0x01, 0x18, 0xF2, 0x02, +/* 0000DF10 */ 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0F, 0x16, 0x14, 0x03, 0x00, 0x0F, 0x02, +/* 0000DF20 */ 0x09, 0x1D, 0x00, 0x8F, 0x01, 0x2D, 0x16, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x93, +/* 0000DF30 */ 0x03, 0x17, 0x01, 0x00, 0x5C, 0x01, 0x17, 0xEE, 0x02, 0x16, 0x16, 0x01, 0x00, 0x47, 0x0F, 0x16, +/* 0000DF40 */ 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x24, 0x00, 0x8F, 0x01, 0x0C, 0x16, 0x03, 0x00, 0x07, 0x04, 0x00, +/* 0000DF50 */ 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x1C, 0x17, 0x04, 0x00, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, +/* 0000DF60 */ 0x00, 0x17, 0x5C, 0x03, 0x17, 0xEE, 0x04, 0xFF, 0x16, 0x02, 0x00, 0x8F, 0x01, 0x09, 0x17, 0x00, +/* 0000DF70 */ 0x00, 0x6D, 0x16, 0x17, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x93, 0x03, 0x18, 0x01, 0x00, +/* 0000DF80 */ 0x5C, 0x01, 0x18, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, 0xF2, 0x03, 0x16, 0x16, 0x01, 0x00, 0x00, +/* 0000DF90 */ 0x00, 0x03, 0x00, 0x98, 0x16, 0x16, 0x04, 0x00, 0x00, 0x96, 0x03, 0x16, 0x07, 0x03, 0x00, 0x5C, +/* 0000DFA0 */ 0x00, 0x03, 0x93, 0x03, 0x16, 0x01, 0x00, 0x5C, 0x01, 0x16, 0x5C, 0x02, 0x0E, 0xEE, 0x03, 0x16, +/* 0000DFB0 */ 0x0C, 0x04, 0x00, 0x47, 0x10, 0x16, 0x93, 0x04, 0x16, 0x05, 0x00, 0xA8, 0x17, 0x15, 0x03, 0x00, +/* 0000DFC0 */ 0x16, 0x17, 0x09, 0x34, 0x00, 0xCE, 0x16, 0x00, 0x00, 0x00, 0x96, 0x02, 0x16, 0x8F, 0x01, 0x0C, +/* 0000DFD0 */ 0x16, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x01, 0x1C, 0x17, 0x04, 0x00, 0x5C, +/* 0000DFE0 */ 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x01, 0x17, 0x5C, 0x03, 0x17, 0xEE, 0x04, 0xFF, 0x16, 0x05, +/* 0000DFF0 */ 0x00, 0x93, 0x02, 0x16, 0x06, 0x00, 0x47, 0x0F, 0x16, 0x54, 0x11, 0x10, 0x0F, 0x03, 0x00, 0x10, +/* 0000E000 */ 0x09, 0x6E, 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x37, 0x00, 0x8F, 0x01, 0x0B, 0x16, 0x07, 0x00, +/* 0000E010 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0F, 0xEE, 0x02, 0x16, 0x16, 0x06, 0x00, 0x11, +/* 0000E020 */ 0x03, 0x00, 0x16, 0x05, 0x09, 0x1A, 0x00, 0x8F, 0x01, 0x39, 0x16, 0x08, 0x00, 0x4B, 0x16, 0x0F, +/* 0000E030 */ 0x03, 0x00, 0x16, 0x09, 0x07, 0x00, 0x2F, 0x10, 0x10, 0x06, 0x09, 0x04, 0x00, 0x2F, 0x10, 0x10, +/* 0000E040 */ 0x07, 0x47, 0x16, 0x10, 0x8F, 0x01, 0x0C, 0x17, 0x03, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, +/* 0000E050 */ 0x8F, 0x01, 0x1F, 0x18, 0x09, 0x00, 0x5C, 0x01, 0x18, 0x5C, 0x02, 0x0F, 0x5D, 0x03, 0x06, 0x07, +/* 0000E060 */ 0x00, 0xEE, 0x04, 0x17, 0x17, 0x07, 0x00, 0x2F, 0x16, 0x16, 0x17, 0x47, 0x10, 0x16, 0x09, 0x05, +/* 0000E070 */ 0x00, 0xA8, 0x16, 0x47, 0x10, 0x16, 0x8F, 0x01, 0x0A, 0x16, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 0000E080 */ 0x00, 0x03, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x7B, +/* 0000E090 */ 0x10, 0x17, 0x02, 0x7B, 0x0F, 0x17, 0x03, 0x7B, 0x11, 0x17, 0x04, 0x5C, 0x01, 0x17, 0x5D, 0x02, +/* 0000E0A0 */ 0x02, 0x08, 0x00, 0xEE, 0x03, 0x00, 0x16, 0x08, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000E0B0 */ 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, +/* 0000E0C0 */ 0x02, 0x00, 0x00, 0x3B, 0x02, 0x00, 0x00, 0x6F, 0x02, 0x00, 0x00, 0xFE, 0x2E, 0x02, 0xFE, 0x39, +/* 0000E0D0 */ 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x3B, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x60, 0x03, 0xFE, 0x21, 0x02, +/* 0000E0E0 */ 0xFE, 0x61, 0x03, 0x0D, 0xFE, 0x62, 0x03, 0x00, 0xFE, 0x24, 0x25, 0x15, 0x08, 0x00, 0x00, 0x00, +/* 0000E0F0 */ 0x25, 0x00, 0x36, 0x00, 0x08, 0x00, 0x81, 0x00, 0x1D, 0x00, 0x3A, 0x00, 0x07, 0x00, 0x1B, 0x00, +/* 0000E100 */ 0x24, 0x00, 0x53, 0x02, 0x31, 0x00, 0x49, 0x00, 0x1A, 0x00, 0x37, 0x00, 0x0F, 0x00, 0x50, 0x00, +/* 0000E110 */ 0x08, 0x00, 0x1F, 0x00, 0x24, 0x00, 0xB8, 0x01, 0x08, 0x00, 0xF9, 0x00, 0x03, 0x00, 0x29, 0x00, +/* 0000E120 */ 0x07, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x2E, 0x00, 0x07, 0x00, 0x3E, 0x00, +/* 0000E130 */ 0x04, 0x00, 0x40, 0x00, 0x30, 0x00, 0x5C, 0x00, 0x05, 0x00, 0x29, 0x00, 0x38, 0x00, 0x99, 0x00, +/* 0000E140 */ 0x00, 0x2B, 0xE2, 0x00, 0x00, 0x49, 0xE1, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x11, 0xC4, 0x00, +/* 0000E150 */ 0xFD, 0x3D, 0xA2, 0x41, 0xD1, 0x00, 0x0F, 0xFE, 0xA3, 0x29, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, +/* 0000E160 */ 0x02, 0xFE, 0xA3, 0x29, 0xFE, 0x77, 0x01, 0xFE, 0x77, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, +/* 0000E170 */ 0x20, 0x02, 0x01, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x08, 0x01, 0xFF, +/* 0000E180 */ 0x89, 0x8F, 0x02, 0x09, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000E190 */ 0x0A, 0x5C, 0x01, 0x05, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, +/* 0000E1A0 */ 0x00, 0x00, 0x00, 0x00, 0x47, 0x06, 0x09, 0x98, 0x09, 0x06, 0x02, 0x00, 0x00, 0x47, 0x07, 0x09, +/* 0000E1B0 */ 0x8F, 0x02, 0x0C, 0x09, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, 0x1D, 0x0A, +/* 0000E1C0 */ 0x02, 0x00, 0x5C, 0x01, 0x0A, 0x8F, 0x01, 0x04, 0x0A, 0x03, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, +/* 0000E1D0 */ 0x07, 0xEE, 0x04, 0x09, 0x09, 0x01, 0x00, 0x15, 0x03, 0x00, 0x09, 0x04, 0x09, 0x27, 0x00, 0x8F, +/* 0000E1E0 */ 0x02, 0x0C, 0x09, 0x01, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8F, 0x02, 0x1E, 0x0A, 0x04, +/* 0000E1F0 */ 0x00, 0x5C, 0x01, 0x0A, 0x8F, 0x01, 0x02, 0x0A, 0x05, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x05, +/* 0000E200 */ 0xEE, 0x04, 0xFF, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0x0E, 0xFE, 0x63, +/* 0000E210 */ 0x03, 0x00, 0xFE, 0xC7, 0x29, 0x05, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x7A, 0x00, 0x09, 0x00, +/* 0000E220 */ 0x24, 0x00, 0x2F, 0x00, 0x5F, 0x00, 0x29, 0x00, 0x55, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, +/* 0000E230 */ 0xC4, 0x00, 0xF0, 0x3C, 0xA2, 0x41, 0xD1, 0x00, 0x0E, 0xFE, 0x60, 0x26, 0xFF, 0x00, 0x10, 0x01, +/* 0000E240 */ 0x00, 0x02, 0x02, 0xFE, 0x60, 0x26, 0x7D, 0x7D, 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, +/* 0000E250 */ 0x01, 0x03, 0x06, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x08, 0x38, 0x8F, 0x02, 0x0C, +/* 0000E260 */ 0x07, 0x00, 0x00, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8F, 0x02, 0x23, 0x08, 0x01, 0x00, 0x5C, +/* 0000E270 */ 0x01, 0x08, 0x8F, 0x01, 0x03, 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, +/* 0000E280 */ 0x03, 0x08, 0x5D, 0x04, 0x03, 0x00, 0x00, 0xEE, 0x05, 0x07, 0x07, 0x00, 0x00, 0x94, 0x01, 0x03, +/* 0000E290 */ 0x07, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x84, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x58, +/* 0000E2A0 */ 0x00, 0x00, 0x3F, 0x5C, 0x85, 0xE0, 0x01, 0xC4, 0x02, 0xCF, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, +/* 0000E2B0 */ 0x39, 0x03, 0x0B, 0xFE, 0xAF, 0x20, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xAF, +/* 0000E2C0 */ 0x20, 0xFE, 0x11, 0x04, 0xFE, 0x11, 0x04, 0x07, 0x05, 0x09, 0x04, 0x2A, 0x29, 0x01, 0x01, 0x04, +/* 0000E2D0 */ 0x03, 0x03, 0x03, 0x03, 0x03, 0x08, 0x08, 0x01, 0x00, 0x06, 0xFE, 0x5A, 0x03, 0xA2, 0x4F, 0x06, +/* 0000E2E0 */ 0x4F, 0x07, 0x8F, 0x01, 0x43, 0x09, 0x00, 0x00, 0x4B, 0x09, 0x0F, 0x15, 0x00, 0x09, 0x09, 0x00, +/* 0000E2F0 */ 0x00, 0x8F, 0x01, 0x05, 0x09, 0x01, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0xEE, 0x01, 0xFF, +/* 0000E300 */ 0x09, 0x00, 0x00, 0x8F, 0x01, 0x09, 0x0A, 0x02, 0x00, 0x6D, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, +/* 0000E310 */ 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8F, 0x01, 0x43, 0x0B, 0x00, 0x00, 0x4B, 0x0B, 0x5C, 0x02, +/* 0000E320 */ 0x0B, 0xF2, 0x03, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x06, 0x09, 0x0F, 0x08, +/* 0000E330 */ 0x00, 0x06, 0x09, 0x00, 0x00, 0xA8, 0x00, 0x09, 0x44, 0x00, 0x98, 0x0B, 0x06, 0x03, 0x00, 0x00, +/* 0000E340 */ 0x6D, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5D, 0x01, 0x04, 0x02, 0x00, 0xF2, +/* 0000E350 */ 0x02, 0x0A, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6D, 0x09, 0x0A, 0x02, 0x07, 0x02, 0x00, +/* 0000E360 */ 0x5C, 0x00, 0x0A, 0xD4, 0x00, 0x0B, 0x5C, 0x01, 0x0B, 0xF2, 0x02, 0x09, 0x09, 0x02, 0x00, 0x00, +/* 0000E370 */ 0x00, 0x03, 0x00, 0x54, 0x07, 0x09, 0x47, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000E380 */ 0xFE, 0x39, 0x02, 0xFE, 0x78, 0x01, 0xB1, 0xFE, 0xCB, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0x0F, +/* 0000E390 */ 0x00, 0x24, 0x00, 0x12, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x4B, 0x00, 0x07, 0x00, 0x1A, 0x00, 0x05, +/* 0000E3A0 */ 0x00, 0x5C, 0x02, 0x3C, 0x00, 0xCD, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0xB0, 0xE3, 0x00, 0x00, +/* 0000E3B0 */ 0xBF, 0x4C, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xE2, 0x36, 0xA2, 0x41, 0xD0, 0x00, 0x0C, 0xFE, 0x01, +/* 0000E3C0 */ 0x10, 0xFE, 0x09, 0x24, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x09, 0x24, 0x0A, 0x0A, +/* 0000E3D0 */ 0x01, 0x02, 0x02, 0x03, 0x0A, 0x0A, 0x01, 0x17, 0xAC, 0x03, 0x0F, 0x02, 0x00, 0x02, 0xAB, 0x03, +/* 0000E3E0 */ 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x03, 0xAB, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 0000E3F0 */ 0x10, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, +/* 0000E400 */ 0x21, 0xD4, 0x00, 0xB8, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x5B, 0x03, 0x0A, 0xFE, 0x1C, 0x1C, +/* 0000E410 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x1C, 0x1C, 0xFE, 0x73, 0x04, 0xFE, 0x73, 0x04, +/* 0000E420 */ 0x01, 0x09, 0x09, 0x0D, 0x04, 0x58, 0x4C, 0x01, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, +/* 0000E430 */ 0x0C, 0x0D, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, +/* 0000E440 */ 0x01, 0x03, 0xFE, 0x58, 0x01, 0x4F, 0x0A, 0x4F, 0x0B, 0x8F, 0x01, 0x09, 0x0F, 0x00, 0x00, 0x62, +/* 0000E450 */ 0x0F, 0x0F, 0x00, 0x6D, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, +/* 0000E460 */ 0xF2, 0x02, 0x0E, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x0A, 0x0E, 0xA8, 0x0E, 0x14, +/* 0000E470 */ 0x03, 0x00, 0x0A, 0x0E, 0x09, 0x07, 0x01, 0x8F, 0x01, 0x09, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, +/* 0000E480 */ 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0E, 0x0E, 0x02, 0x00, +/* 0000E490 */ 0x00, 0x00, 0x01, 0x00, 0x47, 0x0A, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x9D, 0x00, 0x8F, +/* 0000E4A0 */ 0x01, 0x42, 0x0E, 0x01, 0x00, 0x4B, 0x0E, 0x0F, 0x15, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8F, 0x01, +/* 0000E4B0 */ 0x05, 0x0E, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0xEE, 0x01, 0xFF, 0x0E, 0x02, 0x00, +/* 0000E4C0 */ 0x8F, 0x01, 0x09, 0x0F, 0x00, 0x00, 0x6D, 0x0E, 0x0F, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, +/* 0000E4D0 */ 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x42, 0x10, 0x01, 0x00, 0x4B, 0x10, 0x5C, 0x02, 0x10, 0xF2, 0x03, +/* 0000E4E0 */ 0x0E, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x0B, 0x0E, 0x98, 0x0E, 0x0B, 0x04, 0x00, +/* 0000E4F0 */ 0x00, 0x98, 0x0F, 0x0B, 0x05, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x10, 0x00, 0x98, 0x10, +/* 0000E500 */ 0x0B, 0x05, 0x02, 0x00, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, 0x00, 0x47, 0x0F, +/* 0000E510 */ 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x98, 0x0F, 0x0B, 0x08, 0x03, 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x09, +/* 0000E520 */ 0x10, 0x00, 0x98, 0x10, 0x0B, 0x08, 0x04, 0x00, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, +/* 0000E530 */ 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x47, 0x0A, 0x0E, 0x8F, 0x01, 0x09, 0x0F, +/* 0000E540 */ 0x00, 0x00, 0x62, 0x0F, 0x0F, 0x00, 0x6D, 0x0E, 0x0F, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, +/* 0000E550 */ 0x5C, 0x01, 0x09, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0A, 0x10, 0x09, 0x0E, 0x00, 0x8F, 0x01, 0x3A, +/* 0000E560 */ 0x11, 0x03, 0x00, 0x4B, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x0A, 0x5C, 0x02, +/* 0000E570 */ 0x10, 0xF2, 0x03, 0xFF, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x15, 0x00, 0x8F, 0x01, +/* 0000E580 */ 0x3A, 0x0E, 0x03, 0x00, 0x4B, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0x05, 0x00, 0xA8, 0x0E, +/* 0000E590 */ 0x47, 0x0A, 0x0E, 0x47, 0x00, 0x0A, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x18, 0x03, +/* 0000E5A0 */ 0xFE, 0xB7, 0x01, 0xFE, 0x2B, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0xBA, 0x01, 0xFE, 0x46, 0x1C, 0x0D, +/* 0000E5B0 */ 0x04, 0x00, 0x00, 0x00, 0x24, 0x00, 0x53, 0x00, 0x0A, 0x00, 0x30, 0x00, 0x20, 0x00, 0x51, 0x00, +/* 0000E5C0 */ 0x08, 0x00, 0x2F, 0x00, 0x0F, 0x00, 0x2D, 0x00, 0x12, 0x00, 0x3A, 0x00, 0x2B, 0x00, 0xB1, 0x00, +/* 0000E5D0 */ 0x51, 0x00, 0x34, 0x01, 0x42, 0x00, 0x80, 0x00, 0x10, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2E, 0x00, +/* 0000E5E0 */ 0x08, 0x00, 0x1B, 0x00, 0x00, 0xBF, 0x5C, 0x85, 0xE0, 0x21, 0xD4, 0x00, 0x9D, 0x1F, 0xA2, 0x41, +/* 0000E5F0 */ 0xC1, 0x00, 0xFE, 0x59, 0x03, 0x09, 0xFE, 0x76, 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, +/* 0000E600 */ 0xFE, 0x76, 0x17, 0xFE, 0x86, 0x04, 0xFE, 0x86, 0x04, 0x01, 0x0A, 0x09, 0x0E, 0x04, 0x61, 0x54, +/* 0000E610 */ 0x01, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0x0D, 0x0E, 0x07, 0x08, 0x01, 0x01, 0x01, +/* 0000E620 */ 0x02, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x03, 0xFE, 0x77, 0x01, 0x4F, 0x0C, +/* 0000E630 */ 0x8F, 0x01, 0x09, 0x10, 0x00, 0x00, 0x62, 0x10, 0x10, 0x00, 0x6D, 0x0F, 0x10, 0x01, 0x07, 0x02, +/* 0000E640 */ 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xF2, 0x02, 0x0F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, +/* 0000E650 */ 0x00, 0x47, 0x0B, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x07, 0x01, 0x8F, 0x01, +/* 0000E660 */ 0x09, 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, +/* 0000E670 */ 0x09, 0xF2, 0x02, 0x0F, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x0B, 0x0F, 0x14, 0x03, +/* 0000E680 */ 0x00, 0x0B, 0x02, 0x09, 0x9D, 0x00, 0x8F, 0x01, 0x42, 0x0F, 0x01, 0x00, 0x4B, 0x0F, 0x0F, 0x15, +/* 0000E690 */ 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8F, 0x01, 0x05, 0x0F, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 0000E6A0 */ 0x03, 0xEE, 0x01, 0xFF, 0x0F, 0x02, 0x00, 0x8F, 0x01, 0x09, 0x10, 0x00, 0x00, 0x6D, 0x0F, 0x10, +/* 0000E6B0 */ 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x42, 0x11, 0x01, 0x00, +/* 0000E6C0 */ 0x4B, 0x11, 0x5C, 0x02, 0x11, 0xF2, 0x03, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, +/* 0000E6D0 */ 0x0C, 0x0F, 0x98, 0x0F, 0x0C, 0x04, 0x00, 0x00, 0x98, 0x10, 0x0C, 0x05, 0x01, 0x00, 0x0F, 0x03, +/* 0000E6E0 */ 0x00, 0x10, 0x09, 0x10, 0x00, 0x98, 0x11, 0x0C, 0x05, 0x02, 0x00, 0x2F, 0x11, 0x06, 0x11, 0x47, +/* 0000E6F0 */ 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x98, 0x10, 0x0C, 0x08, +/* 0000E700 */ 0x03, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x10, 0x00, 0x98, 0x11, 0x0C, 0x08, 0x04, 0x00, 0x2F, +/* 0000E710 */ 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, +/* 0000E720 */ 0x47, 0x0B, 0x0F, 0x8F, 0x01, 0x09, 0x10, 0x00, 0x00, 0x62, 0x10, 0x10, 0x00, 0x6D, 0x0F, 0x10, +/* 0000E730 */ 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xA8, 0x11, 0x14, 0x03, 0x00, 0x0B, +/* 0000E740 */ 0x11, 0x09, 0x0E, 0x00, 0x8F, 0x01, 0x3A, 0x12, 0x03, 0x00, 0x4B, 0x12, 0x47, 0x11, 0x12, 0x09, +/* 0000E750 */ 0x03, 0x00, 0x47, 0x11, 0x0B, 0x5C, 0x02, 0x11, 0xF2, 0x03, 0xFF, 0x0F, 0x04, 0x00, 0x00, 0x00, +/* 0000E760 */ 0x04, 0x00, 0x09, 0x15, 0x00, 0x8F, 0x01, 0x3A, 0x0F, 0x03, 0x00, 0x4B, 0x0F, 0x14, 0x03, 0x00, +/* 0000E770 */ 0x0B, 0x0F, 0x09, 0x05, 0x00, 0xA8, 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0A, 0x09, 0x09, +/* 0000E780 */ 0x09, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x1B, 0x00, 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x0B, +/* 0000E790 */ 0x09, 0x08, 0x00, 0xA8, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, +/* 0000E7A0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x19, 0x03, 0xFE, 0xB7, 0x01, 0xFE, 0x2C, 0x02, 0xFE, 0x39, +/* 0000E7B0 */ 0x02, 0xFE, 0xBA, 0x01, 0xFE, 0xA1, 0x17, 0x11, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x46, 0x00, +/* 0000E7C0 */ 0x0A, 0x00, 0x30, 0x00, 0x20, 0x00, 0x44, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x0F, 0x00, 0x2D, 0x00, +/* 0000E7D0 */ 0x12, 0x00, 0x3A, 0x00, 0x2B, 0x00, 0x52, 0x00, 0x51, 0x00, 0x0C, 0x01, 0x42, 0x00, 0x73, 0x00, +/* 0000E7E0 */ 0x10, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x26, 0x00, +/* 0000E7F0 */ 0x08, 0x00, 0x34, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x25, 0x00, 0x00, 0xBF, 0x5C, 0x84, +/* 0000E800 */ 0xE0, 0x01, 0xC4, 0x00, 0x99, 0x1C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x38, 0x03, 0x08, 0xFE, 0x03, +/* 0000E810 */ 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x03, 0x17, 0x51, 0x51, 0x01, 0x05, 0x02, +/* 0000E820 */ 0x05, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x27, 0x8F, 0x01, 0x09, +/* 0000E830 */ 0x06, 0x00, 0x00, 0x6D, 0x05, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x03, +/* 0000E840 */ 0x5C, 0x02, 0x02, 0xF2, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, +/* 0000E850 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xA7, 0x02, 0xFE, 0x20, 0x17, 0x02, 0x00, 0x00, 0x00, 0x00, 0x25, +/* 0000E860 */ 0x00, 0x33, 0x00, 0x00, 0xBF, 0x4C, 0x00, 0xE0, 0x01, 0xC0, 0x00, 0x93, 0x1C, 0xA2, 0x41, 0xC1, +/* 0000E870 */ 0x00, 0xFE, 0x37, 0x03, 0x07, 0xFE, 0x69, 0x16, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 0000E880 */ 0x69, 0x16, 0x7B, 0x7B, 0x41, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, +/* 0000E890 */ 0x1C, 0x00, 0x0A, 0x80, 0x03, 0x07, 0x00, 0x0A, 0x80, 0x1E, 0x62, 0x05, 0x04, 0x00, 0x14, 0x0F, +/* 0000E8A0 */ 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0x62, 0x05, 0x04, 0x00, 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, +/* 0000E8B0 */ 0x02, 0x00, 0x23, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x31, 0x01, 0xFE, 0x81, 0x16, 0x03, 0x00, +/* 0000E8C0 */ 0x00, 0x00, 0x00, 0x18, 0x00, 0x4A, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0xBF, 0x7C, 0x05, 0x01, +/* 0000E8D0 */ 0x00, 0xC0, 0x04, 0x88, 0x1B, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x36, 0x03, 0x06, 0xFE, 0x10, 0x15, +/* 0000E8E0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x10, 0x15, 0xD5, 0xD5, 0x41, 0x06, 0x05, 0x09, +/* 0000E8F0 */ 0x03, 0x15, 0x13, 0x10, 0x01, 0x01, 0x01, 0x01, 0x05, 0x3C, 0x01, 0x00, 0x08, 0x01, 0x01, 0x40, +/* 0000E900 */ 0x4F, 0x08, 0x47, 0x08, 0x02, 0xEB, 0x00, 0xEC, 0x00, 0x12, 0x03, 0x00, 0x08, 0x06, 0x09, 0x29, +/* 0000E910 */ 0x00, 0xBA, 0x09, 0x08, 0x05, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x18, 0x00, 0x47, 0x09, 0x07, 0x07, +/* 0000E920 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x98, 0x0A, 0x05, 0x08, 0x00, 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, +/* 0000E930 */ 0xFF, 0x09, 0x00, 0x00, 0x28, 0x08, 0x08, 0x09, 0xCD, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000E940 */ 0xFE, 0x37, 0x15, 0x06, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, 0x00, +/* 0000E950 */ 0x0B, 0x00, 0x26, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x0A, 0x00, 0x19, 0x00, 0x00, 0xBF, 0x5C, 0x84, +/* 0000E960 */ 0xE0, 0x21, 0xD4, 0x00, 0x7B, 0x22, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x49, 0x03, 0x05, 0xFE, 0x87, +/* 0000E970 */ 0x13, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x87, 0x13, 0xFE, 0x6B, 0x01, 0xFE, 0x6B, +/* 0000E980 */ 0x01, 0x01, 0x08, 0x04, 0x08, 0x04, 0x2A, 0x27, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, +/* 0000E990 */ 0x07, 0x08, 0x07, 0x08, 0x98, 0x4F, 0x05, 0x4F, 0x06, 0x8F, 0x01, 0x09, 0x0A, 0x00, 0x00, 0x6D, +/* 0000E9A0 */ 0x09, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0xF2, 0x02, 0x09, 0x09, +/* 0000E9B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x05, 0x09, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x62, +/* 0000E9C0 */ 0x00, 0x8F, 0x01, 0x44, 0x09, 0x01, 0x00, 0x4B, 0x09, 0x0F, 0x15, 0x00, 0x09, 0x09, 0x00, 0x00, +/* 0000E9D0 */ 0x8F, 0x01, 0x05, 0x09, 0x02, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0xEE, 0x01, 0xFF, 0x09, +/* 0000E9E0 */ 0x01, 0x00, 0x8F, 0x01, 0x09, 0x0A, 0x00, 0x00, 0x6D, 0x09, 0x0A, 0x01, 0x07, 0x03, 0x00, 0x5C, +/* 0000E9F0 */ 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x8F, 0x01, 0x44, 0x0B, 0x01, 0x00, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, +/* 0000EA00 */ 0xF2, 0x03, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x06, 0x09, 0xAC, 0x09, 0x0F, +/* 0000EA10 */ 0x02, 0x00, 0x06, 0xAB, 0x09, 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x09, 0xAB, 0x00, 0x09, 0x0B, 0x00, +/* 0000EA20 */ 0x09, 0x06, 0x00, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x28, 0x02, +/* 0000EA30 */ 0xFE, 0x39, 0x02, 0xFE, 0xA4, 0x13, 0x08, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x08, +/* 0000EA40 */ 0x00, 0x23, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x12, 0x00, 0x32, 0x00, 0x2B, 0x00, 0x4A, 0x00, 0x16, +/* 0000EA50 */ 0x00, 0x2D, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, 0x5C, 0x8C, 0xE0, 0x01, 0xC4, 0x00, 0x6E, +/* 0000EA60 */ 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x48, 0x03, 0x04, 0xFE, 0x78, 0x11, 0xFF, 0x00, 0x10, 0x01, +/* 0000EA70 */ 0x00, 0x03, 0x03, 0xFE, 0x78, 0x11, 0xFE, 0xEA, 0x01, 0xFE, 0xEA, 0x01, 0x41, 0x06, 0x05, 0x09, +/* 0000EA80 */ 0x04, 0x14, 0x12, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x08, 0x07, 0x06, 0xFE, 0x0A, +/* 0000EA90 */ 0x03, 0x05, 0xFE, 0x58, 0x03, 0x49, 0x4F, 0x07, 0x8F, 0x01, 0x09, 0x0A, 0x00, 0x00, 0x6D, 0x09, +/* 0000EAA0 */ 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xF2, 0x03, +/* 0000EAB0 */ 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0x09, 0x14, 0x03, 0x00, 0x07, 0x02, +/* 0000EAC0 */ 0x09, 0x18, 0x00, 0x77, 0x03, 0x05, 0x01, 0x47, 0x09, 0x05, 0xCE, 0x0A, 0x02, 0x00, 0x00, 0xA1, +/* 0000EAD0 */ 0x00, 0x04, 0x0A, 0xA1, 0x01, 0x03, 0x0A, 0x77, 0x0A, 0x09, 0x02, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 0000EAE0 */ 0x31, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x27, 0x02, 0xFE, 0xA7, 0x11, 0x05, 0x02, 0x00, 0x00, 0x00, +/* 0000EAF0 */ 0x23, 0x00, 0x4F, 0x00, 0x08, 0x00, 0x71, 0x00, 0x04, 0x00, 0x33, 0x00, 0x16, 0x00, 0xC7, 0x00, +/* 0000EB00 */ 0x00, 0xBF, 0x5C, 0x84, 0xE0, 0x01, 0xC4, 0x00, 0x5D, 0x1D, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0x47, +/* 0000EB10 */ 0x03, 0x03, 0xFE, 0x8D, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x8D, 0x0F, 0xFE, +/* 0000EB20 */ 0xC9, 0x01, 0xFE, 0xC9, 0x01, 0x01, 0x04, 0x03, 0x05, 0x02, 0x1D, 0x1D, 0x01, 0x01, 0x02, 0x02, +/* 0000EB30 */ 0x02, 0x02, 0x02, 0x04, 0x05, 0xFE, 0x57, 0x03, 0x6F, 0x4F, 0x03, 0x8F, 0x01, 0x3C, 0x05, 0x00, +/* 0000EB40 */ 0x00, 0x4B, 0x05, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x1C, 0x00, 0x8F, 0x01, 0x09, 0x05, 0x01, 0x00, +/* 0000EB50 */ 0x62, 0x05, 0x05, 0x00, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x0B, 0x00, 0x8F, 0x01, 0x3C, 0x00, 0x00, +/* 0000EB60 */ 0x00, 0x4B, 0x00, 0x09, 0x40, 0x00, 0x8F, 0x01, 0x09, 0x06, 0x01, 0x00, 0x6D, 0x05, 0x06, 0x01, +/* 0000EB70 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x06, 0xF2, 0x01, 0x05, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000EB80 */ 0x54, 0x03, 0x05, 0x0F, 0x0C, 0x00, 0x03, 0x09, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x3C, 0x02, +/* 0000EB90 */ 0x09, 0x06, 0x00, 0x01, 0x32, 0x01, 0x01, 0x3C, 0x03, 0x8F, 0x01, 0x3C, 0x00, 0x00, 0x00, 0x4B, +/* 0000EBA0 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x17, 0x03, 0xFE, 0x2D, 0x02, 0xFE, 0xA3, +/* 0000EBB0 */ 0x0F, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x39, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x1D, 0x00, +/* 0000EBC0 */ 0x34, 0x00, 0x07, 0x00, 0x9C, 0x00, 0x09, 0x00, 0x35, 0x00, 0x06, 0x00, 0x2D, 0x00, 0x0D, 0x00, +/* 0000EBD0 */ 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, 0x00, 0x3B, 0x1F, 0xA2, 0x41, 0xC1, 0x00, +/* 0000EBE0 */ 0xFE, 0x2B, 0x03, 0x02, 0xFE, 0xC9, 0x09, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xC9, +/* 0000EBF0 */ 0x09, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, 0x02, 0x02, 0x07, 0x07, 0x08, +/* 0000EC00 */ 0x39, 0x8F, 0x01, 0x1A, 0x08, 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, +/* 0000EC10 */ 0x5C, 0x02, 0x05, 0x8F, 0x01, 0x0A, 0x09, 0x01, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 0000EC20 */ 0x01, 0x06, 0x5D, 0x02, 0x02, 0x01, 0x00, 0xEE, 0x03, 0x09, 0x09, 0x01, 0x00, 0x5C, 0x03, 0x09, +/* 0000EC30 */ 0xEE, 0x04, 0xFF, 0x08, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xF4, 0x09, 0x02, 0x00, 0x00, +/* 0000EC40 */ 0x00, 0x00, 0x37, 0x00, 0x46, 0x00, 0x00}; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.32b.h b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.32b.h index 693260e10ea..9ff0268b0f7 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.32b.h +++ b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.32b.h @@ -84,6 +84,17 @@ var isFinite = platform.builtInGlobalObjectEntryIsFinite; var isNaN = platform.builtInGlobalObjectEntryIsNaN; + // Keep this "enum" in sync with IntlEngineInterfaceExtensionObject::EntryIntl_RegisterBuiltInFunction + const IntlBuiltInFunctionID = setPrototype({ + MIN: 0, + DateToLocaleString: 0, + DateToLocaleDateString: 1, + DateToLocaleTimeString: 2, + NumberToLocaleString: 3, + StringLocaleCompare: 4, + MAX: 5 + }, null); + let __defaultLocale = undefined; const GetDefaultLocale = function () { if (__defaultLocale && platform.useCaches) { @@ -102,15 +113,6 @@ return __defaultLocale; }; - let CacheNumberFormat = function (numberFormat) { - let retVal = platform.cacheNumberFormat(numberFormat); - if (retVal === null) { - // TODO (doilij): remove this fallback when implemented under ICU - numberFormat.__numberingSystem = ""; - } - // no return value - }; - let CreateDateTimeFormat = function (dateTimeFormat, condition) { let retVal = platform.createDateTimeFormat(dateTimeFormat, condition); if (retVal === null) { @@ -609,22 +611,19 @@ // which allows us to display the correct error message for each Intl type. const collator_supportedLocalesOf_name = "Intl.Collator.supportedLocalesOf"; const collator_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(collator_supportedLocalesOf_name, - function collator_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function collator_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, collator_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const numberFormat_supportedLocalesOf_name = "Intl.NumberFormat.supportedLocalesOf"; const numberFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(numberFormat_supportedLocalesOf_name, - function numberFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function numberFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, numberFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const dateTimeFormat_supportedLocalesOf_name = "Intl.DateTimeFormat.supportedLocalesOf"; const dateTimeFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(dateTimeFormat_supportedLocalesOf_name, - function dateTimeFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function dateTimeFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, dateTimeFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); @@ -871,30 +870,22 @@ var stateObject = setPrototype({}, null); InitializeCollator(stateObject, arguments[1], arguments[2]); return Number(platform.compareString(thisArg, that, stateObject.__localeForCompare, stateObject.__sensitivity, stateObject.__ignorePunctuation, stateObject.__numeric)); - }), 4); + }), IntlBuiltInFunctionID.StringLocaleCompare); if (InitType === 'Intl') { - function Collator() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function Collator(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new Collator(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("Collator"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1114,9 +1105,8 @@ try { // Cache api instance and update numbering system on the object - CacheNumberFormat(numberFormat); - } - catch (e) { + platform.cacheNumberFormat(numberFormat); + } catch (e) { throwExIfOOMOrSOE(e); // Generic message to cover the exception throw from the platform. // The platform's exception is also generic and in most if not all cases specifies that "a" argument is invalid. @@ -1124,8 +1114,7 @@ platform.raiseOptionValueOutOfRange(); } - if (!numberFormat.__numberingSystem) - { + if (!numberFormat.__numberingSystem) { numberFormat.__numberingSystem = "latn"; // assume Latin numerals by default } @@ -1144,18 +1133,10 @@ var n = Internal.ToNumber(this); // Need to special case the '-0' case to format as 0 instead of -0. return String(platform.formatNumber(n === -0 ? 0 : n, stateObject)); - }), 3); + }), IntlBuiltInFunctionID.NumberToLocaleString); if (InitType === 'Intl') { - function NumberFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - let locales = undefined; - let options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function NumberFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new NumberFormat(locales, options); } @@ -1609,66 +1590,100 @@ dateTimeFormat.__initializedDateTimeFormat = true; } - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleString", "Date"); - } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; - } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "any", "all")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 0); + // caches for objects constructed with default parameters for each method + let __DateInstanceToLocaleStringDefaultCache = [undefined, undefined, undefined]; + const __DateInstanceToLocaleStringDefaultCacheSlot = setPrototype({ + toLocaleString: 0, + toLocaleDateString: 1, + toLocaleTimeString: 2 + }, null); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleDateString", function () { + function DateInstanceToLocaleStringImplementation(name, option1, option2, cacheSlot, locales, options) { if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleDateString", "Date"); + platform.raiseNeedObjectOfType(name, "Date"); } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); + let value = callInstanceFunc(DateInstanceGetDate, new Date(this)); if (isNaN(value) || !isFinite(value)) { return "Invalid Date"; } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "date", "date")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 1); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleTimeString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleTimeString", "Date"); + let stateObject = undefined; + if (platform.useCaches && !locales && !options) { + // All default parameters (locales and options): this is the most valuable case to cache. + if (__DateInstanceToLocaleStringDefaultCache[cacheSlot]) { + // retrieve cached value + stateObject = __DateInstanceToLocaleStringDefaultCache[cacheSlot]; + } else { + // populate cache + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, undefined, ToDateTimeOptions(undefined, option1, option2)); + __DateInstanceToLocaleStringDefaultCache[cacheSlot] = stateObject; + } } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; + + if (!stateObject) { + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, locales, ToDateTimeOptions(options, option1, option2)); } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "time", "time")); + return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 2); + } - if (InitType === 'Intl') { - function DateTimeFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; + // Note: tagPublicFunction (platform.tagPublicLibraryCode) messes with declared name of the FunctionBody so that + // the functions called appear correctly in the debugger and stack traces. Thus, we we cannot call tagPublicFunction in a loop. + // Each entry point needs to have its own unique FunctionBody (which is a function as defined in the source code); + // this is why we have seemingly repeated ourselves below, instead of having one function and calling it multiple times with + // different parameters. + // + // The following invocations of `platform.registerBuiltInFunction(tagPublicFunction(name, entryPoint))` are enclosed in IIFEs. + // The IIFEs are used to group all of the meaningful differences between each entry point into the arguments to the IIFE. + // The exception to this are the different entryPoint names which are only significant for debugging (and cannot be passed in + // as arguments, as the name is intrinsic to the function declaration). + // + // The `date_toLocale*String_entryPoint` function names are placeholder names that will never be seen from user code. + // The function name property and FunctionBody declared name are overwritten by `tagPublicFunction`. + // The fact that they are declared with unique names is helpful for debugging. + // The functions *must not* be declared as anonymous functions (must be declared with a name); + // converting from an unnnamed function to a named function is not readily supported by the platform code and + // this has caused us to hit assertions in debug builds in the past. + // + // See invocations of `tagPublicFunction` on the `supportedLocalesOf` entry points for a similar pattern. + // + // The entryPoint functions will be called as `Date.prototype.toLocale*String` and thus their `this` parameters will be a Date. + // `DateInstanceToLocaleStringImplementation` is not on `Date.prototype`, so we must propagate `this` into the call by using + // `DateInstanceToLocaleStringImplementation.call(this, ...)`. + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleString", "any", "all", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleString, IntlBuiltInFunctionID.DateToLocaleString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleDateString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleDateString", "date", "date", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleDateString, IntlBuiltInFunctionID.DateToLocaleDateString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleTimeString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleTimeString", "time", "time", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleTimeString, IntlBuiltInFunctionID.DateToLocaleTimeString); + if (InitType === 'Intl') { + function DateTimeFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new DateTimeFormat(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("DateTimeFormat"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1684,23 +1699,27 @@ } tagPublicFunction("Intl.DateTimeFormat", DateTimeFormat); - function format() { + function format(date) { if (typeof this !== 'object') { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - var hiddenObject = platform.getHiddenObject(this); + let hiddenObject = platform.getHiddenObject(this); if (hiddenObject === undefined || !hiddenObject.__initializedDateTimeFormat) { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - if (arguments.length >= 1) { - if (isNaN(arguments[0]) || !isFinite(arguments[0])) { - platform.raiseInvalidDate(); - } - return String(platform.formatDateTime(Internal.ToNumber(arguments[0]), hiddenObject)); + if (date !== undefined && (isNaN(date) || !isFinite(date))) { + platform.raiseInvalidDate(); + } + + let dateValue = undefined; + if (date !== undefined) { + dateValue = Internal.ToNumber(date) + } else { + dateValue = DateNow(); } - return String(platform.formatDateTime(DateNow(), hiddenObject)); + return String(platform.formatDateTime(dateValue, hiddenObject)); } tagPublicFunction("Intl.DateTimeFormat.prototype.format", format); @@ -1782,4454 +1801,3541 @@ namespace Js { const char Library_Bytecode_Intl[] = { -/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x04, 0x16, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFE, 0xD7, 0x02, 0x00, 0xFF, -/* 00000020 */ 0x94, 0x5D, 0x01, 0x00, 0xFF, 0x94, 0x5D, 0x01, 0x00, 0x39, 0x00, 0x00, 0x00, 0x40, 0x32, 0x00, -/* 00000030 */ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x69, 0x00, 0x00, 0xFE, 0x70, 0x01, 0x72, 0x07, 0x00, 0x00, -/* 00000040 */ 0x00, 0x8A, 0x07, 0x00, 0x00, 0x00, 0xA0, 0x07, 0x00, 0x00, 0x01, 0xB4, 0x07, 0x00, 0x00, 0x00, -/* 00000050 */ 0xBC, 0x07, 0x00, 0x00, 0x00, 0xC8, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0x00, 0xD8, -/* 00000060 */ 0x07, 0x00, 0x00, 0x00, 0xE8, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x00, 0x00, 0x00, 0x36, 0x08, -/* 00000070 */ 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0xCE, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00000080 */ 0x00, 0x00, 0x0A, 0x09, 0x00, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x00, 0x3C, 0x09, 0x00, 0x00, -/* 00000090 */ 0x00, 0x64, 0x09, 0x00, 0x00, 0x01, 0x70, 0x09, 0x00, 0x00, 0x01, 0x7A, 0x09, 0x00, 0x00, 0x00, -/* 000000A0 */ 0x88, 0x09, 0x00, 0x00, 0x01, 0x94, 0x09, 0x00, 0x00, 0x01, 0xA0, 0x09, 0x00, 0x00, 0x01, 0xB0, -/* 000000B0 */ 0x09, 0x00, 0x00, 0x00, 0xBE, 0x09, 0x00, 0x00, 0x01, 0xCA, 0x09, 0x00, 0x00, 0x01, 0xD8, 0x09, -/* 000000C0 */ 0x00, 0x00, 0x00, 0xE6, 0x09, 0x00, 0x00, 0x01, 0xF2, 0x09, 0x00, 0x00, 0x01, 0x04, 0x0A, 0x00, -/* 000000D0 */ 0x00, 0x00, 0x12, 0x0A, 0x00, 0x00, 0x01, 0x20, 0x0A, 0x00, 0x00, 0x00, 0x22, 0x0A, 0x00, 0x00, -/* 000000E0 */ 0x01, 0x2E, 0x0A, 0x00, 0x00, 0x01, 0x3A, 0x0A, 0x00, 0x00, 0x01, 0x46, 0x0A, 0x00, 0x00, 0x01, -/* 000000F0 */ 0x54, 0x0A, 0x00, 0x00, 0x01, 0x60, 0x0A, 0x00, 0x00, 0x00, 0x6A, 0x0A, 0x00, 0x00, 0x00, 0x7C, -/* 00000100 */ 0x0A, 0x00, 0x00, 0x00, 0x8E, 0x0A, 0x00, 0x00, 0x00, 0xA4, 0x0A, 0x00, 0x00, 0x00, 0xBE, 0x0A, -/* 00000110 */ 0x00, 0x00, 0x00, 0xD8, 0x0A, 0x00, 0x00, 0x00, 0xF6, 0x0A, 0x00, 0x00, 0x01, 0x0A, 0x0B, 0x00, -/* 00000120 */ 0x00, 0x01, 0x2E, 0x0B, 0x00, 0x00, 0x01, 0x54, 0x0B, 0x00, 0x00, 0x01, 0x68, 0x0B, 0x00, 0x00, -/* 00000130 */ 0x01, 0x88, 0x0B, 0x00, 0x00, 0x01, 0xBA, 0x0B, 0x00, 0x00, 0x01, 0xE4, 0x0B, 0x00, 0x00, 0x01, -/* 00000140 */ 0x16, 0x0C, 0x00, 0x00, 0x01, 0x44, 0x0C, 0x00, 0x00, 0x01, 0x72, 0x0C, 0x00, 0x00, 0x01, 0x84, -/* 00000150 */ 0x0C, 0x00, 0x00, 0x01, 0x9E, 0x0C, 0x00, 0x00, 0x01, 0xBC, 0x0C, 0x00, 0x00, 0x01, 0xDE, 0x0C, -/* 00000160 */ 0x00, 0x00, 0x01, 0xF6, 0x0C, 0x00, 0x00, 0x01, 0x20, 0x0D, 0x00, 0x00, 0x01, 0x46, 0x0D, 0x00, -/* 00000170 */ 0x00, 0x01, 0x7A, 0x0D, 0x00, 0x00, 0x01, 0xB4, 0x0D, 0x00, 0x00, 0x01, 0xE0, 0x0D, 0x00, 0x00, -/* 00000180 */ 0x01, 0x0A, 0x0E, 0x00, 0x00, 0x01, 0x34, 0x0E, 0x00, 0x00, 0x01, 0x5E, 0x0E, 0x00, 0x00, 0x01, -/* 00000190 */ 0x82, 0x0E, 0x00, 0x00, 0x01, 0xA6, 0x0E, 0x00, 0x00, 0x01, 0xD0, 0x0E, 0x00, 0x00, 0x01, 0xF8, -/* 000001A0 */ 0x0E, 0x00, 0x00, 0x01, 0x08, 0x0F, 0x00, 0x00, 0x01, 0x34, 0x0F, 0x00, 0x00, 0x01, 0x68, 0x0F, -/* 000001B0 */ 0x00, 0x00, 0x01, 0x9C, 0x0F, 0x00, 0x00, 0x01, 0xBE, 0x0F, 0x00, 0x00, 0x01, 0xE2, 0x0F, 0x00, -/* 000001C0 */ 0x00, 0x01, 0x06, 0x10, 0x00, 0x00, 0x01, 0x2E, 0x10, 0x00, 0x00, 0x01, 0x56, 0x10, 0x00, 0x00, -/* 000001D0 */ 0x01, 0x74, 0x10, 0x00, 0x00, 0x01, 0xA0, 0x10, 0x00, 0x00, 0x01, 0xB2, 0x10, 0x00, 0x00, 0x01, -/* 000001E0 */ 0xE6, 0x10, 0x00, 0x00, 0x01, 0x22, 0x11, 0x00, 0x00, 0x01, 0x62, 0x11, 0x00, 0x00, 0x01, 0xB0, -/* 000001F0 */ 0x11, 0x00, 0x00, 0x01, 0xD8, 0x11, 0x00, 0x00, 0x01, 0xEA, 0x11, 0x00, 0x00, 0x01, 0x10, 0x12, -/* 00000200 */ 0x00, 0x00, 0x01, 0x30, 0x12, 0x00, 0x00, 0x01, 0x52, 0x12, 0x00, 0x00, 0x01, 0x76, 0x12, 0x00, -/* 00000210 */ 0x00, 0x01, 0xA0, 0x12, 0x00, 0x00, 0x01, 0xD0, 0x12, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, -/* 00000220 */ 0x01, 0x22, 0x13, 0x00, 0x00, 0x01, 0x44, 0x13, 0x00, 0x00, 0x01, 0x64, 0x13, 0x00, 0x00, 0x01, -/* 00000230 */ 0x7C, 0x13, 0x00, 0x00, 0x01, 0xBE, 0x13, 0x00, 0x00, 0x01, 0xF6, 0x13, 0x00, 0x00, 0x01, 0x40, -/* 00000240 */ 0x14, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x00, 0x01, 0xCE, 0x14, 0x00, 0x00, 0x01, 0x12, 0x15, -/* 00000250 */ 0x00, 0x00, 0x01, 0x44, 0x15, 0x00, 0x00, 0x01, 0x70, 0x15, 0x00, 0x00, 0x00, 0x76, 0x15, 0x00, -/* 00000260 */ 0x00, 0x00, 0xD0, 0x15, 0x00, 0x00, 0x00, 0xFA, 0x15, 0x00, 0x00, 0x00, 0xFE, 0x15, 0x00, 0x00, -/* 00000270 */ 0x00, 0x26, 0x16, 0x00, 0x00, 0x00, 0x2E, 0x16, 0x00, 0x00, 0x00, 0x3C, 0x16, 0x00, 0x00, 0x00, -/* 00000280 */ 0x4C, 0x16, 0x00, 0x00, 0x00, 0x76, 0x16, 0x00, 0x00, 0x01, 0x88, 0x16, 0x00, 0x00, 0x01, 0xA8, -/* 00000290 */ 0x16, 0x00, 0x00, 0x00, 0xC4, 0x16, 0x00, 0x00, 0x00, 0xE2, 0x16, 0x00, 0x00, 0x00, 0xF0, 0x16, -/* 000002A0 */ 0x00, 0x00, 0x00, 0x04, 0x17, 0x00, 0x00, 0x01, 0x16, 0x17, 0x00, 0x00, 0x00, 0x28, 0x17, 0x00, -/* 000002B0 */ 0x00, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, 0x5C, 0x17, 0x00, 0x00, 0x00, 0x6E, 0x17, 0x00, 0x00, -/* 000002C0 */ 0x01, 0x86, 0x17, 0x00, 0x00, 0x00, 0x96, 0x17, 0x00, 0x00, 0x00, 0xA4, 0x17, 0x00, 0x00, 0x00, -/* 000002D0 */ 0xB2, 0x17, 0x00, 0x00, 0x00, 0xB8, 0x17, 0x00, 0x00, 0x00, 0xC2, 0x17, 0x00, 0x00, 0x00, 0xC8, -/* 000002E0 */ 0x17, 0x00, 0x00, 0x00, 0xDC, 0x17, 0x00, 0x00, 0x00, 0xE0, 0x17, 0x00, 0x00, 0x00, 0xE8, 0x17, -/* 000002F0 */ 0x00, 0x00, 0x00, 0xEC, 0x17, 0x00, 0x00, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00, 0x0E, 0x18, 0x00, -/* 00000300 */ 0x00, 0x00, 0x1A, 0x18, 0x00, 0x00, 0x00, 0x22, 0x18, 0x00, 0x00, 0x00, 0x26, 0x18, 0x00, 0x00, -/* 00000310 */ 0x00, 0x2A, 0x18, 0x00, 0x00, 0x00, 0xDE, 0x18, 0x00, 0x00, 0x00, 0x7A, 0x19, 0x00, 0x00, 0x00, -/* 00000320 */ 0x00, 0x1A, 0x00, 0x00, 0x00, 0x0C, 0x1A, 0x00, 0x00, 0x00, 0x14, 0x1A, 0x00, 0x00, 0x00, 0x2A, -/* 00000330 */ 0x1A, 0x00, 0x00, 0x00, 0x44, 0x1A, 0x00, 0x00, 0x00, 0x5E, 0x1A, 0x00, 0x00, 0x00, 0x68, 0x1A, -/* 00000340 */ 0x00, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x00, 0x8C, 0x1A, 0x00, 0x00, 0x00, 0x9A, 0x1A, 0x00, -/* 00000350 */ 0x00, 0x00, 0xA4, 0x1A, 0x00, 0x00, 0x00, 0xB2, 0x1A, 0x00, 0x00, 0x00, 0xC6, 0x1A, 0x00, 0x00, -/* 00000360 */ 0x00, 0xE0, 0x1A, 0x00, 0x00, 0x00, 0xEC, 0x1A, 0x00, 0x00, 0x00, 0xFA, 0x1A, 0x00, 0x00, 0x00, -/* 00000370 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x0C, 0x1B, 0x00, 0x00, 0x00, 0x14, 0x1B, 0x00, 0x00, 0x00, 0x24, -/* 00000380 */ 0x1B, 0x00, 0x00, 0x00, 0x30, 0x1B, 0x00, 0x00, 0x00, 0x3A, 0x1B, 0x00, 0x00, 0x00, 0x4A, 0x1B, -/* 00000390 */ 0x00, 0x00, 0x00, 0x56, 0x1B, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x1B, 0x00, -/* 000003A0 */ 0x00, 0x00, 0x6A, 0x1B, 0x00, 0x00, 0x01, 0x74, 0x1B, 0x00, 0x00, 0x00, 0x82, 0x1B, 0x00, 0x00, -/* 000003B0 */ 0x00, 0x90, 0x1B, 0x00, 0x00, 0x00, 0x9E, 0x1B, 0x00, 0x00, 0x01, 0xAC, 0x1B, 0x00, 0x00, 0x01, -/* 000003C0 */ 0xB8, 0x1B, 0x00, 0x00, 0x01, 0xC6, 0x1B, 0x00, 0x00, 0x01, 0xE2, 0x1B, 0x00, 0x00, 0x00, 0xF4, -/* 000003D0 */ 0x1B, 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x00, 0x8A, 0x1C, -/* 000003E0 */ 0x00, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x1D, 0x00, 0x00, 0x00, 0x72, 0x1D, 0x00, -/* 000003F0 */ 0x00, 0x01, 0x84, 0x1D, 0x00, 0x00, 0x01, 0xB6, 0x1D, 0x00, 0x00, 0x01, 0xE6, 0x1D, 0x00, 0x00, -/* 00000400 */ 0x00, 0xF0, 0x1D, 0x00, 0x00, 0x00, 0x42, 0x1E, 0x00, 0x00, 0x00, 0x60, 0x1E, 0x00, 0x00, 0x00, -/* 00000410 */ 0x98, 0x1E, 0x00, 0x00, 0x00, 0xA6, 0x1E, 0x00, 0x00, 0x00, 0xB4, 0x1E, 0x00, 0x00, 0x00, 0xF2, -/* 00000420 */ 0x1E, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x00, 0x00, 0x00, 0x4E, 0x1F, 0x00, 0x00, 0x00, 0x62, 0x1F, -/* 00000430 */ 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x00, 0x00, 0x00, 0x9A, 0x1F, 0x00, 0x00, 0x00, 0xAA, 0x1F, 0x00, -/* 00000440 */ 0x00, 0x00, 0xB2, 0x1F, 0x00, 0x00, 0x00, 0xCA, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x1F, 0x00, 0x00, -/* 00000450 */ 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x2C, 0x20, 0x00, 0x00, 0x00, 0x36, 0x20, 0x00, 0x00, 0x00, -/* 00000460 */ 0x44, 0x20, 0x00, 0x00, 0x00, 0x5C, 0x20, 0x00, 0x00, 0x00, 0x66, 0x20, 0x00, 0x00, 0x00, 0x74, -/* 00000470 */ 0x20, 0x00, 0x00, 0x00, 0x7E, 0x20, 0x00, 0x00, 0x00, 0x8E, 0x20, 0x00, 0x00, 0x00, 0xB2, 0x20, -/* 00000480 */ 0x00, 0x00, 0x01, 0xC6, 0x20, 0x00, 0x00, 0x00, 0xD2, 0x20, 0x00, 0x00, 0x00, 0xDE, 0x20, 0x00, -/* 00000490 */ 0x00, 0x00, 0xEA, 0x20, 0x00, 0x00, 0x00, 0xFA, 0x20, 0x00, 0x00, 0x00, 0x0A, 0x21, 0x00, 0x00, -/* 000004A0 */ 0x00, 0x0E, 0x21, 0x00, 0x00, 0x00, 0x12, 0x21, 0x00, 0x00, 0x00, 0x16, 0x21, 0x00, 0x00, 0x01, -/* 000004B0 */ 0x2A, 0x21, 0x00, 0x00, 0x00, 0x30, 0x21, 0x00, 0x00, 0x00, 0x36, 0x21, 0x00, 0x00, 0x00, 0x40, -/* 000004C0 */ 0x21, 0x00, 0x00, 0x00, 0x46, 0x21, 0x00, 0x00, 0x00, 0x58, 0x21, 0x00, 0x00, 0x00, 0x8E, 0x21, -/* 000004D0 */ 0x00, 0x00, 0x00, 0xD4, 0x21, 0x00, 0x00, 0x01, 0xE4, 0x21, 0x00, 0x00, 0x01, 0xF4, 0x21, 0x00, -/* 000004E0 */ 0x00, 0x01, 0x04, 0x22, 0x00, 0x00, 0x01, 0x16, 0x22, 0x00, 0x00, 0x01, 0x1E, 0x22, 0x00, 0x00, -/* 000004F0 */ 0x01, 0x2C, 0x22, 0x00, 0x00, 0x01, 0x36, 0x22, 0x00, 0x00, 0x01, 0x40, 0x22, 0x00, 0x00, 0x00, -/* 00000500 */ 0x4E, 0x22, 0x00, 0x00, 0x00, 0x8E, 0x22, 0x00, 0x00, 0x00, 0xB2, 0x22, 0x00, 0x00, 0x00, 0xF8, -/* 00000510 */ 0x22, 0x00, 0x00, 0x00, 0x18, 0x23, 0x00, 0x00, 0x00, 0x24, 0x23, 0x00, 0x00, 0x00, 0x36, 0x23, -/* 00000520 */ 0x00, 0x00, 0x00, 0x56, 0x23, 0x00, 0x00, 0x00, 0x80, 0x23, 0x00, 0x00, 0x00, 0xAC, 0x23, 0x00, -/* 00000530 */ 0x00, 0x00, 0xD8, 0x23, 0x00, 0x00, 0x00, 0x0A, 0x24, 0x00, 0x00, 0x00, 0x3C, 0x24, 0x00, 0x00, -/* 00000540 */ 0x00, 0x54, 0x24, 0x00, 0x00, 0x00, 0x62, 0x24, 0x00, 0x00, 0x00, 0x78, 0x24, 0x00, 0x00, 0x01, -/* 00000550 */ 0x9C, 0x24, 0x00, 0x00, 0x01, 0xD4, 0x24, 0x00, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x12, -/* 00000560 */ 0x25, 0x00, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x00, 0x2C, 0x25, 0x00, 0x00, 0x00, 0x3A, 0x25, -/* 00000570 */ 0x00, 0x00, 0x00, 0x40, 0x25, 0x00, 0x00, 0x00, 0x4A, 0x25, 0x00, 0x00, 0x01, 0x6A, 0x25, 0x00, -/* 00000580 */ 0x00, 0x00, 0xA6, 0x25, 0x00, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0x01, 0x0E, 0x26, 0x00, 0x00, -/* 00000590 */ 0x00, 0x14, 0x26, 0x00, 0x00, 0x00, 0x1E, 0x26, 0x00, 0x00, 0x01, 0x42, 0x26, 0x00, 0x00, 0x00, -/* 000005A0 */ 0x52, 0x26, 0x00, 0x00, 0x01, 0x70, 0x26, 0x00, 0x00, 0x00, 0x7E, 0x26, 0x00, 0x00, 0x01, 0x9A, -/* 000005B0 */ 0x26, 0x00, 0x00, 0x00, 0xAA, 0x26, 0x00, 0x00, 0x01, 0xCC, 0x26, 0x00, 0x00, 0x00, 0xDE, 0x26, -/* 000005C0 */ 0x00, 0x00, 0x01, 0xFC, 0x26, 0x00, 0x00, 0x00, 0x0A, 0x27, 0x00, 0x00, 0x01, 0x28, 0x27, 0x00, -/* 000005D0 */ 0x00, 0x00, 0x36, 0x27, 0x00, 0x00, 0x01, 0x58, 0x27, 0x00, 0x00, 0x00, 0x74, 0x27, 0x00, 0x00, -/* 000005E0 */ 0x01, 0x8E, 0x27, 0x00, 0x00, 0x00, 0x98, 0x27, 0x00, 0x00, 0x01, 0xB6, 0x27, 0x00, 0x00, 0x00, -/* 000005F0 */ 0xC4, 0x27, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x28, 0x00, 0x00, 0x00, 0x88, -/* 00000600 */ 0x28, 0x00, 0x00, 0x00, 0xB0, 0x28, 0x00, 0x00, 0x00, 0xFA, 0x28, 0x00, 0x00, 0x00, 0x00, 0x29, -/* 00000610 */ 0x00, 0x00, 0x01, 0x32, 0x29, 0x00, 0x00, 0x01, 0x56, 0x29, 0x00, 0x00, 0x01, 0x90, 0x29, 0x00, -/* 00000620 */ 0x00, 0x01, 0xBC, 0x29, 0x00, 0x00, 0x01, 0xF8, 0x29, 0x00, 0x00, 0x01, 0x46, 0x2A, 0x00, 0x00, -/* 00000630 */ 0x01, 0x70, 0x2A, 0x00, 0x00, 0x01, 0xA2, 0x2A, 0x00, 0x00, 0x00, 0xAC, 0x2A, 0x00, 0x00, 0x00, -/* 00000640 */ 0xB4, 0x2A, 0x00, 0x00, 0x00, 0xBE, 0x2A, 0x00, 0x00, 0x00, 0xC6, 0x2A, 0x00, 0x00, 0x00, 0xD0, -/* 00000650 */ 0x2A, 0x00, 0x00, 0x00, 0xDC, 0x2A, 0x00, 0x00, 0x00, 0xE4, 0x2A, 0x00, 0x00, 0x00, 0xEE, 0x2A, -/* 00000660 */ 0x00, 0x00, 0x00, 0xFC, 0x2A, 0x00, 0x00, 0x00, 0x0A, 0x2B, 0x00, 0x00, 0x00, 0x18, 0x2B, 0x00, -/* 00000670 */ 0x00, 0x00, 0x24, 0x2B, 0x00, 0x00, 0x00, 0x50, 0x2B, 0x00, 0x00, 0x00, 0x5A, 0x2B, 0x00, 0x00, -/* 00000680 */ 0x00, 0x78, 0x2B, 0x00, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0x00, 0xAA, 0x2B, 0x00, 0x00, 0x00, -/* 00000690 */ 0xBE, 0x2B, 0x00, 0x00, 0x00, 0xDA, 0x2B, 0x00, 0x00, 0x00, 0xFE, 0x2B, 0x00, 0x00, 0x00, 0x14, -/* 000006A0 */ 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x2C, 0x00, 0x00, 0x00, 0x5A, 0x2C, 0x00, 0x00, 0x00, 0x5E, 0x2C, -/* 000006B0 */ 0x00, 0x00, 0x01, 0x70, 0x2C, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x00, 0x00, 0x00, 0xC2, 0x2C, 0x00, -/* 000006C0 */ 0x00, 0x00, 0x8C, 0x2D, 0x00, 0x00, 0x00, 0xA2, 0x2D, 0x00, 0x00, 0x00, 0xE8, 0x2D, 0x00, 0x00, -/* 000006D0 */ 0x00, 0xF2, 0x2D, 0x00, 0x00, 0x00, 0xF6, 0x2D, 0x00, 0x00, 0x00, 0xFA, 0x2D, 0x00, 0x00, 0x00, -/* 000006E0 */ 0xFE, 0x2D, 0x00, 0x00, 0x00, 0x16, 0x2E, 0x00, 0x00, 0x00, 0x34, 0x2E, 0x00, 0x00, 0x00, 0x80, -/* 000006F0 */ 0x2E, 0x00, 0x00, 0x00, 0x60, 0x2F, 0x00, 0x00, 0x00, 0x7A, 0x2F, 0x00, 0x00, 0x00, 0x8A, 0x2F, -/* 00000700 */ 0x00, 0x00, 0x00, 0x9E, 0x2F, 0x00, 0x00, 0x00, 0xB2, 0x2F, 0x00, 0x00, 0x00, 0x34, 0x30, 0x00, -/* 00000710 */ 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x78, 0x30, 0x00, 0x00, 0x00, 0x8A, 0x30, 0x00, 0x00, -/* 00000720 */ 0x00, 0xC4, 0x30, 0x00, 0x00, 0x00, 0xD6, 0x30, 0x00, 0x00, 0x00, 0xE6, 0x30, 0x00, 0x00, 0x00, -/* 00000730 */ 0xEE, 0x30, 0x00, 0x00, 0x00, 0x08, 0x31, 0x00, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x00, 0x32, -/* 00000740 */ 0x31, 0x00, 0x00, 0x00, 0x3E, 0x31, 0x00, 0x00, 0x00, 0x56, 0x31, 0x00, 0x00, 0x00, 0x6E, 0x31, -/* 00000750 */ 0x00, 0x00, 0x00, 0x78, 0x31, 0x00, 0x00, 0x00, 0x92, 0x31, 0x00, 0x00, 0x00, 0xD2, 0x31, 0x00, -/* 00000760 */ 0x00, 0x00, 0x24, 0x32, 0x00, 0x00, 0x00, 0x36, 0x32, 0x00, 0x00, 0x01, 0x40, 0x32, 0x00, 0x00, -/* 00000770 */ 0x00, 0x00, 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, -/* 00000780 */ 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00000790 */ 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000007A0 */ 0x4E, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x46, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x4E, 0x00, -/* 000007B0 */ 0x44, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6C, 0x00, -/* 000007C0 */ 0x6F, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x00, 0x00, -/* 000007D0 */ 0x70, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x56, 0x00, 0x61, 0x00, -/* 000007E0 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, -/* 000007F0 */ 0x64, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, -/* 00000800 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, -/* 00000810 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000820 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000830 */ 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, -/* 00000840 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 00000850 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00000860 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00000870 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00000880 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00000890 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000008A0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000008B0 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 000008C0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 000008D0 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, -/* 000008E0 */ 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000008F0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00000900 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00000910 */ 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, -/* 00000920 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00000930 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, -/* 00000940 */ 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, -/* 00000950 */ 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00000960 */ 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x45, 0x00, 0x53, 0x00, 0x00, 0x00, -/* 00000970 */ 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, -/* 00000980 */ 0x64, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x2D, 0x00, 0x4C, 0x00, -/* 00000990 */ 0x56, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, -/* 000009A0 */ 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, 0x6B, 0x00, 0x00, 0x00, -/* 000009B0 */ 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, 0x00, 0x00, 0x6A, 0x00, -/* 000009C0 */ 0x61, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000009D0 */ 0x68, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x73, 0x00, -/* 000009E0 */ 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x54, 0x00, 0x57, 0x00, -/* 000009F0 */ 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00000A00 */ 0x63, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6E, 0x00, -/* 00000A10 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00000A20 */ 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x48, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x7A, 0x00, -/* 00000A30 */ 0x68, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, -/* 00000A40 */ 0x43, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x69, 0x00, -/* 00000A50 */ 0x6E, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x53, 0x00, 0x47, 0x00, 0x00, 0x00, -/* 00000A60 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, -/* 00000A70 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x77, 0x00, 0x72, 0x00, -/* 00000A80 */ 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, -/* 00000A90 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, -/* 00000AA0 */ 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, -/* 00000AB0 */ 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 00000AC0 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00000AD0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000AE0 */ 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 00000AF0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00000B00 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 00000B10 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, -/* 00000B20 */ 0x70, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, -/* 00000B30 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000B40 */ 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, -/* 00000B50 */ 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00000B60 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4E, 0x00, -/* 00000B70 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00000B80 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 00000B90 */ 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, 0x75, 0x00, -/* 00000BA0 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x52, 0x00, 0x65, 0x00, -/* 00000BB0 */ 0x67, 0x00, 0x45, 0x00, 0x78, 0x00, 0x70, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 00000BC0 */ 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00000BD0 */ 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x52, 0x00, 0x45, 0x00, -/* 00000BE0 */ 0x73, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00000BF0 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x43, 0x00, 0x75, 0x00, -/* 00000C00 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x43, 0x00, 0x6F, 0x00, -/* 00000C10 */ 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00000C20 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00000C30 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, -/* 00000C40 */ 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00000C50 */ 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000C60 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000C70 */ 0x00, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00000C80 */ 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00000C90 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, -/* 00000CA0 */ 0x65, 0x00, 0x74, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4C, 0x00, -/* 00000CB0 */ 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00000CC0 */ 0x6C, 0x00, 0x6C, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000CD0 */ 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x00, 0x00, 0x52, 0x00, -/* 00000CE0 */ 0x61, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x41, 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00000CF0 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000D00 */ 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 00000D10 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00000D20 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x73, 0x00, -/* 00000D30 */ 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x62, 0x00, -/* 00000D40 */ 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000D50 */ 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x50, 0x00, -/* 00000D60 */ 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x4E, 0x00, -/* 00000D70 */ 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, -/* 00000D80 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00000D90 */ 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x77, 0x00, -/* 00000DA0 */ 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, -/* 00000DB0 */ 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000DC0 */ 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, -/* 00000DD0 */ 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, -/* 00000DE0 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, -/* 00000DF0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, -/* 00000E00 */ 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00000E10 */ 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000E20 */ 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, -/* 00000E30 */ 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, -/* 00000E40 */ 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x49, 0x00, -/* 00000E50 */ 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x41, 0x00, -/* 00000E60 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, -/* 00000E70 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x73, 0x00, 0x68, 0x00, -/* 00000E80 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, -/* 00000E90 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x4A, 0x00, 0x6F, 0x00, -/* 00000EA0 */ 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, -/* 00000EB0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00000EC0 */ 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x42, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, -/* 00000ED0 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, -/* 00000EE0 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, -/* 00000EF0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000F00 */ 0x4E, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, -/* 00000F10 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000F20 */ 0x63, 0x00, 0x65, 0x00, 0x52, 0x00, 0x65, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x63, 0x00, -/* 00000F30 */ 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00000F40 */ 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, -/* 00000F50 */ 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, -/* 00000F60 */ 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, -/* 00000F70 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000F80 */ 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00000F90 */ 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, -/* 00000FA0 */ 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x49, 0x00, 0x66, 0x00, 0x50, 0x00, -/* 00000FB0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00000FC0 */ 0x68, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x45, 0x00, 0x78, 0x00, 0x49, 0x00, 0x66, 0x00, -/* 00000FD0 */ 0x4F, 0x00, 0x4F, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x53, 0x00, 0x4F, 0x00, 0x45, 0x00, -/* 00000FE0 */ 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x50, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6C, 0x00, -/* 00000FF0 */ 0x69, 0x00, 0x63, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00001000 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x45, 0x00, 0x78, 0x00, -/* 00001010 */ 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, -/* 00001020 */ 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, -/* 00001030 */ 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001040 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, -/* 00001050 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, -/* 00001060 */ 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001070 */ 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 00001080 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001090 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 000010A0 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000010B0 */ 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, -/* 000010C0 */ 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 000010D0 */ 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000010E0 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000010F0 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00001100 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, -/* 00001110 */ 0x74, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001120 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001130 */ 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00001140 */ 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00001150 */ 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001160 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00001170 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x41, 0x00, -/* 00001180 */ 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00001190 */ 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, -/* 000011A0 */ 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 000011B0 */ 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, -/* 000011C0 */ 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 000011D0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 000011E0 */ 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x50, 0x00, -/* 000011F0 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x55, 0x00, -/* 00001200 */ 0x73, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x43, 0x00, 0x55, 0x00, 0x00, 0x00, -/* 00001210 */ 0x5F, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001220 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001230 */ 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, -/* 00001240 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001250 */ 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 00001260 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 00001270 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00001280 */ 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 00001290 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000012A0 */ 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 000012B0 */ 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 000012C0 */ 0x75, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x00, 0x00, -/* 000012D0 */ 0x5F, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000012E0 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 000012F0 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001300 */ 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, -/* 00001310 */ 0x5F, 0x00, 0x43, 0x00, 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, -/* 00001320 */ 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, -/* 00001330 */ 0x47, 0x00, 0x5F, 0x00, 0x42, 0x00, 0x41, 0x00, 0x53, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, -/* 00001340 */ 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, -/* 00001350 */ 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x45, 0x00, 0x58, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x52, 0x00, -/* 00001360 */ 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, -/* 00001370 */ 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 00001380 */ 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, -/* 00001390 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, -/* 000013A0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, -/* 000013B0 */ 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, -/* 000013C0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, -/* 000013D0 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 000013E0 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 000013F0 */ 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, -/* 00001400 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, -/* 00001410 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001420 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001430 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001440 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 00001450 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00001460 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001470 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00001480 */ 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00001490 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, -/* 000014A0 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, -/* 000014B0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, -/* 000014C0 */ 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 000014D0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, -/* 000014E0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 000014F0 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, -/* 00001500 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, -/* 00001510 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, -/* 00001520 */ 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 00001530 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, -/* 00001540 */ 0x65, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 00001550 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001560 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001570 */ 0x65, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00001580 */ 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 00001590 */ 0x2E, 0x00, 0x62, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 000015A0 */ 0x2E, 0x00, 0x63, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, -/* 000015B0 */ 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x64, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 000015C0 */ 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 000015D0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 000015E0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 000015F0 */ 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x72, 0x00, -/* 00001600 */ 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001610 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, -/* 00001620 */ 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x6C, 0x00, -/* 00001630 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 00001640 */ 0x62, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001650 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, -/* 00001660 */ 0x6F, 0x00, 0x75, 0x00, 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00001670 */ 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001680 */ 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001690 */ 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, -/* 000016A0 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x3F, 0x00, -/* 000016B0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x29, 0x00, 0x3F, 0x00, -/* 000016C0 */ 0x24, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2A, 0x00, -/* 000016D0 */ 0x29, 0x00, 0x2D, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x3F, 0x00, -/* 000016E0 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 000016F0 */ 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2E, 0x00, -/* 00001700 */ 0x2A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, -/* 00001710 */ 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00001720 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 00001730 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, -/* 00001740 */ 0x6F, 0x00, 0x67, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x6F, 0x00, -/* 00001750 */ 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, -/* 00001760 */ 0x55, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 00001770 */ 0x61, 0x00, 0x73, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001780 */ 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001790 */ 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 000017A0 */ 0x67, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 000017B0 */ 0x00, 0x00, 0x5B, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, -/* 000017C0 */ 0x00, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, -/* 000017D0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, -/* 000017E0 */ 0x20, 0x00, 0x2D, 0x00, 0x20, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x5B, 0x00, -/* 000017F0 */ 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x24, 0x00, -/* 00001800 */ 0x00, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x00, -/* 00001810 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, -/* 00001820 */ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, -/* 00001830 */ 0x3F, 0x00, 0x3A, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001840 */ 0x6A, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6C, 0x00, -/* 00001850 */ 0x2D, 0x00, 0x67, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, -/* 00001860 */ 0x7C, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x7C, 0x00, -/* 00001870 */ 0x6E, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, -/* 00001880 */ 0x68, 0x00, 0x2D, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x79, 0x00, 0x75, 0x00, 0x7C, 0x00, -/* 00001890 */ 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x61, 0x00, -/* 000018A0 */ 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x7C, 0x00, -/* 000018B0 */ 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x6E, 0x00, -/* 000018C0 */ 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x78, 0x00, 0x69, 0x00, -/* 000018D0 */ 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, -/* 000018E0 */ 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x47, 0x00, -/* 000018F0 */ 0x42, 0x00, 0x2D, 0x00, 0x6F, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, -/* 00001900 */ 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6E, 0x00, -/* 00001910 */ 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, -/* 00001920 */ 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00001930 */ 0x6F, 0x00, 0x63, 0x00, 0x68, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001940 */ 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6B, 0x00, -/* 00001950 */ 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001960 */ 0x2D, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6D, 0x00, -/* 00001970 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, -/* 00001980 */ 0x6E, 0x00, 0x61, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001990 */ 0x2D, 0x00, 0x70, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, -/* 000019A0 */ 0x61, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 000019B0 */ 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x73, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x73, 0x00, -/* 000019C0 */ 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x52, 0x00, -/* 000019D0 */ 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, -/* 000019E0 */ 0x4E, 0x00, 0x4C, 0x00, 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x43, 0x00, -/* 000019F0 */ 0x48, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x45, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001A00 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00001A10 */ 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x78, 0x00, -/* 00001A20 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x2C, 0x00, -/* 00001A30 */ 0x38, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00001A40 */ 0x62, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x57, 0x00, 0x59, 0x00, -/* 00001A50 */ 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, -/* 00001A60 */ 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x38, 0x00, -/* 00001A70 */ 0x7D, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, -/* 00001A80 */ 0x35, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, -/* 00001A90 */ 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x7D, 0x00, -/* 00001AA0 */ 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x34, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001AB0 */ 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, -/* 00001AC0 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x7B, 0x00, -/* 00001AD0 */ 0x30, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001AE0 */ 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001AF0 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, -/* 00001B00 */ 0x7B, 0x00, 0x34, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001B10 */ 0x28, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, -/* 00001B20 */ 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001B30 */ 0x29, 0x00, 0x2A, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, -/* 00001B40 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00001B50 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001B60 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, -/* 00001B70 */ 0x6E, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, -/* 00001B80 */ 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001B90 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, -/* 00001BA0 */ 0x75, 0x00, 0x62, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 00001BB0 */ 0x75, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 00001BC0 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, -/* 00001BD0 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001BE0 */ 0x00, 0x00, 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, -/* 00001BF0 */ 0x74, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001C00 */ 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00001C10 */ 0x5B, 0x00, 0x27, 0x00, 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, -/* 00001C20 */ 0x69, 0x00, 0x74, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001C30 */ 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x63, 0x00, -/* 00001C40 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, -/* 00001C50 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001C60 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001C70 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, -/* 00001C80 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00001C90 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00001CA0 */ 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00001CB0 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00001CC0 */ 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00001CD0 */ 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 00001CE0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, -/* 00001CF0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 00001D00 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, -/* 00001D10 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, -/* 00001D20 */ 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, -/* 00001D30 */ 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00001D40 */ 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, -/* 00001D50 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x64, 0x00, -/* 00001D60 */ 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00001D70 */ 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x52, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00001D80 */ 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00001D90 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, -/* 00001DA0 */ 0x73, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00001DB0 */ 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001DC0 */ 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00001DD0 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, -/* 00001DE0 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, -/* 00001DF0 */ 0x2D, 0x00, 0x75, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, -/* 00001E00 */ 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, -/* 00001E10 */ 0x3F, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, -/* 00001E20 */ 0x29, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, -/* 00001E30 */ 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, -/* 00001E40 */ 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00001E50 */ 0x5F, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, -/* 00001E60 */ 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001E70 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00001E80 */ 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00001E90 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x63, 0x00, -/* 00001EA0 */ 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00001EB0 */ 0x67, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00001EC0 */ 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, -/* 00001ED0 */ 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00001EE0 */ 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00001EF0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, -/* 00001F00 */ 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 00001F10 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00001F20 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00001F30 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, -/* 00001F40 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, -/* 00001F50 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00001F60 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, -/* 00001F70 */ 0x63, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001F80 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00001F90 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, -/* 00001FA0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, -/* 00001FB0 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, -/* 00001FC0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 00001FD0 */ 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, -/* 00001FE0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00001FF0 */ 0x5F, 0x00, 0x5F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 00002000 */ 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x64, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002010 */ 0x6C, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 00002020 */ 0x75, 0x00, 0x73, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x6F, 0x00, -/* 00002030 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, -/* 00002040 */ 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 00002050 */ 0x69, 0x00, 0x76, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, -/* 00002060 */ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002070 */ 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, -/* 00002080 */ 0x61, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x69, 0x00, -/* 00002090 */ 0x67, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x6E, 0x00, -/* 000020A0 */ 0x63, 0x00, 0x74, 0x00, 0x75, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000020B0 */ 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x46, 0x00, 0x69, 0x00, 0x72, 0x00, -/* 000020C0 */ 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 000020D0 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x66, 0x00, -/* 000020E0 */ 0x61, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 000020F0 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, -/* 00002100 */ 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x41, 0x00, -/* 00002110 */ 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00002120 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00002130 */ 0x6B, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002140 */ 0x63, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 00002150 */ 0x61, 0x00, 0x72, 0x00, 0x64, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002160 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00002170 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, -/* 00002180 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, -/* 00002190 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, -/* 000021A0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000021B0 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 000021C0 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000021D0 */ 0x73, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x41, 0x00, 0x55, 0x00, 0x4C, 0x00, -/* 000021E0 */ 0x54, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x41, 0x00, -/* 000021F0 */ 0x4C, 0x00, 0x00, 0x00, 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4E, 0x00, -/* 00002200 */ 0x54, 0x00, 0x00, 0x00, 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, -/* 00002210 */ 0x43, 0x00, 0x59, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x58, 0x00, 0x00, 0x00, 0x53, 0x00, -/* 00002220 */ 0x59, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x43, 0x00, 0x4F, 0x00, -/* 00002230 */ 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4D, 0x00, 0x45, 0x00, 0x00, 0x00, -/* 00002240 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 00002250 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, -/* 00002260 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, -/* 00002270 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00002280 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 00002290 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 000022A0 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000022B0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 000022C0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000022D0 */ 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, -/* 000022E0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000022F0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 00002300 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x53, 0x00, 0x79, 0x00, 0x73, 0x00, -/* 00002310 */ 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, -/* 00002320 */ 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002330 */ 0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002340 */ 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6C, 0x00, -/* 00002350 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 00002360 */ 0x75, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, -/* 00002370 */ 0x72, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00002380 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, -/* 00002390 */ 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, -/* 000023A0 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 000023B0 */ 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, 0x72, 0x00, 0x61, 0x00, -/* 000023C0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, -/* 000023D0 */ 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000023E0 */ 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000023F0 */ 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x44, 0x00, 0x69, 0x00, -/* 00002400 */ 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, -/* 00002410 */ 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, -/* 00002420 */ 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x44, 0x00, -/* 00002430 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, -/* 00002440 */ 0x65, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002450 */ 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002460 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002470 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 00002480 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002490 */ 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 000024A0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000024B0 */ 0x61, 0x00, 0x74, 0x00, 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 000024C0 */ 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 000024D0 */ 0x79, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 000024E0 */ 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 000024F0 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002500 */ 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x63, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002510 */ 0x00, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002520 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x79, 0x00, -/* 00002530 */ 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x00, 0x00, -/* 00002540 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x6C, 0x00, -/* 00002550 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002560 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00002570 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00002580 */ 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 00002590 */ 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000025A0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, -/* 000025B0 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000025C0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000025D0 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 000025E0 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000025F0 */ 0x73, 0x00, 0x00, 0x00, 0x68, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002600 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, -/* 00002610 */ 0x5F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, -/* 00002620 */ 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00002630 */ 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002640 */ 0x00, 0x00, 0x67, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x79, 0x00, -/* 00002650 */ 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, 0x43, 0x00, -/* 00002660 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00002670 */ 0x68, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 00002680 */ 0x69, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00002690 */ 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6C, 0x00, -/* 000026A0 */ 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x61, 0x00, 0x70, 0x00, -/* 000026B0 */ 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000026C0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x61, 0x00, -/* 000026D0 */ 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4A, 0x00, -/* 000026E0 */ 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000026F0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x75, 0x00, -/* 00002700 */ 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002710 */ 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002720 */ 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002730 */ 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x41, 0x00, 0x6C, 0x00, 0x51, 0x00, -/* 00002740 */ 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002750 */ 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00002760 */ 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x69, 0x00, 0x76, 0x00, 0x69, 0x00, -/* 00002770 */ 0x6C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00002780 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002790 */ 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, 0x69, 0x00, 0x77, 0x00, -/* 000027A0 */ 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 000027B0 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x77, 0x00, 0x61, 0x00, -/* 000027C0 */ 0x6E, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, -/* 000027D0 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 000027E0 */ 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000027F0 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, -/* 00002800 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00002810 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, -/* 00002820 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, -/* 00002830 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002840 */ 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, -/* 00002850 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00002860 */ 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002870 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00002880 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, -/* 00002890 */ 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000028A0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000028B0 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000028C0 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000028D0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 000028E0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, -/* 000028F0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x00, 0x00, -/* 00002900 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 00002910 */ 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002920 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x70, 0x00, -/* 00002930 */ 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, -/* 00002940 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, -/* 00002950 */ 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x4F, 0x00, -/* 00002960 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x54, 0x00, 0x6F, 0x00, -/* 00002970 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 00002980 */ 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002990 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 000029A0 */ 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000029B0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 000029C0 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x57, 0x00, 0x65, 0x00, 0x65, 0x00, -/* 000029D0 */ 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x4D, 0x00, -/* 000029E0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 000029F0 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002A00 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x79, 0x00, 0x48, 0x00, 0x6F, 0x00, -/* 00002A10 */ 0x75, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00002A20 */ 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x4D, 0x00, 0x6F, 0x00, -/* 00002A30 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00002A40 */ 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002A50 */ 0x65, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, -/* 00002A60 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00002A70 */ 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, -/* 00002A80 */ 0x7A, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, -/* 00002A90 */ 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002AA0 */ 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00002AB0 */ 0x79, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, -/* 00002AC0 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00002AD0 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, -/* 00002AE0 */ 0x79, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002AF0 */ 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00002B00 */ 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002B10 */ 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002B20 */ 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, -/* 00002B30 */ 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, -/* 00002B40 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, -/* 00002B50 */ 0x6C, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 00002B60 */ 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x66, 0x00, -/* 00002B70 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x69, 0x00, -/* 00002B80 */ 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002B90 */ 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, -/* 00002BA0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, -/* 00002BB0 */ 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002BC0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00002BD0 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00002BE0 */ 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002BF0 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002C00 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00002C10 */ 0x6C, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, -/* 00002C20 */ 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002C30 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002C40 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, -/* 00002C50 */ 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002C60 */ 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002C70 */ 0x7B, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002C80 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00002C90 */ 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, -/* 00002CA0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 00002CB0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, -/* 00002CC0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002CD0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002CE0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002CF0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, -/* 00002D00 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, -/* 00002D10 */ 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, -/* 00002D20 */ 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2F, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002D30 */ 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00002D40 */ 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, -/* 00002D50 */ 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, -/* 00002D60 */ 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, -/* 00002D70 */ 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002D80 */ 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x0A, 0x00, -/* 00002D90 */ 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, -/* 00002DA0 */ 0x00, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00002DB0 */ 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, -/* 00002DC0 */ 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, -/* 00002DD0 */ 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, -/* 00002DE0 */ 0x3F, 0x00, 0x7D, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002DF0 */ 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x61, 0x00, -/* 00002E00 */ 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002E10 */ 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002E20 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x31, 0x00, -/* 00002E30 */ 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002E40 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002E50 */ 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00002E60 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, -/* 00002E70 */ 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 00002E80 */ 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, -/* 00002E90 */ 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002EA0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, -/* 00002EB0 */ 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002EC0 */ 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, -/* 00002ED0 */ 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x2F, 0x00, -/* 00002EE0 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2F, 0x00, 0x73, 0x00, -/* 00002EF0 */ 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2F, 0x00, 0x6D, 0x00, 0x6F, 0x00, -/* 00002F00 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 00002F10 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, -/* 00002F20 */ 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00002F30 */ 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002F40 */ 0x2E, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, -/* 00002F50 */ 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, -/* 00002F60 */ 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00002F70 */ 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002F80 */ 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002F90 */ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 00002FA0 */ 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, -/* 00002FB0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002FC0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002FD0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002FE0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, -/* 00002FF0 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, -/* 00003000 */ 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00003010 */ 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, -/* 00003020 */ 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00003030 */ 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, +/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0xF9, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFF, +/* 00000020 */ 0xBE, 0x65, 0x01, 0x00, 0xFF, 0xBE, 0x65, 0x01, 0x00, 0x35, 0x00, 0x00, 0x00, 0x80, 0x35, 0x00, +/* 00000030 */ 0x00, 0x8C, 0x51, 0x00, 0x00, 0xFE, 0x81, 0x01, 0xC2, 0x07, 0x00, 0x00, 0x00, 0xDA, 0x07, 0x00, +/* 00000040 */ 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x01, 0x04, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x08, 0x00, 0x00, +/* 00000050 */ 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x01, +/* 00000060 */ 0x30, 0x08, 0x00, 0x00, 0x01, 0x56, 0x08, 0x00, 0x00, 0x01, 0x84, 0x08, 0x00, 0x00, 0x01, 0xB2, +/* 00000070 */ 0x08, 0x00, 0x00, 0x01, 0xDC, 0x08, 0x00, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x01, 0x0C, 0x09, +/* 00000080 */ 0x00, 0x00, 0x00, 0x1C, 0x09, 0x00, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x6A, 0x09, 0x00, +/* 00000090 */ 0x00, 0x00, 0xB4, 0x09, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x34, 0x0A, 0x00, 0x00, +/* 000000A0 */ 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x0A, 0x00, 0x00, 0x00, 0x70, 0x0A, 0x00, 0x00, 0x00, +/* 000000B0 */ 0x98, 0x0A, 0x00, 0x00, 0x01, 0xA4, 0x0A, 0x00, 0x00, 0x01, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0xBC, +/* 000000C0 */ 0x0A, 0x00, 0x00, 0x01, 0xC8, 0x0A, 0x00, 0x00, 0x01, 0xD4, 0x0A, 0x00, 0x00, 0x01, 0xE4, 0x0A, +/* 000000D0 */ 0x00, 0x00, 0x00, 0xF2, 0x0A, 0x00, 0x00, 0x01, 0xFE, 0x0A, 0x00, 0x00, 0x01, 0x0C, 0x0B, 0x00, +/* 000000E0 */ 0x00, 0x00, 0x1A, 0x0B, 0x00, 0x00, 0x01, 0x26, 0x0B, 0x00, 0x00, 0x01, 0x38, 0x0B, 0x00, 0x00, +/* 000000F0 */ 0x00, 0x46, 0x0B, 0x00, 0x00, 0x01, 0x54, 0x0B, 0x00, 0x00, 0x00, 0x56, 0x0B, 0x00, 0x00, 0x01, +/* 00000100 */ 0x62, 0x0B, 0x00, 0x00, 0x01, 0x6E, 0x0B, 0x00, 0x00, 0x01, 0x7A, 0x0B, 0x00, 0x00, 0x01, 0x88, +/* 00000110 */ 0x0B, 0x00, 0x00, 0x01, 0x94, 0x0B, 0x00, 0x00, 0x00, 0x9E, 0x0B, 0x00, 0x00, 0x00, 0xB0, 0x0B, +/* 00000120 */ 0x00, 0x00, 0x00, 0xC2, 0x0B, 0x00, 0x00, 0x00, 0xD8, 0x0B, 0x00, 0x00, 0x00, 0xF2, 0x0B, 0x00, +/* 00000130 */ 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x2A, 0x0C, 0x00, 0x00, 0x01, 0x3E, 0x0C, 0x00, 0x00, +/* 00000140 */ 0x01, 0x62, 0x0C, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x00, 0x00, 0x01, 0x9C, 0x0C, 0x00, 0x00, 0x01, +/* 00000150 */ 0xBC, 0x0C, 0x00, 0x00, 0x01, 0xEE, 0x0C, 0x00, 0x00, 0x01, 0x18, 0x0D, 0x00, 0x00, 0x01, 0x4A, +/* 00000160 */ 0x0D, 0x00, 0x00, 0x01, 0x78, 0x0D, 0x00, 0x00, 0x01, 0xA6, 0x0D, 0x00, 0x00, 0x01, 0xB8, 0x0D, +/* 00000170 */ 0x00, 0x00, 0x01, 0xD2, 0x0D, 0x00, 0x00, 0x01, 0xF0, 0x0D, 0x00, 0x00, 0x01, 0x12, 0x0E, 0x00, +/* 00000180 */ 0x00, 0x01, 0x2A, 0x0E, 0x00, 0x00, 0x01, 0x54, 0x0E, 0x00, 0x00, 0x01, 0x7A, 0x0E, 0x00, 0x00, +/* 00000190 */ 0x01, 0xAE, 0x0E, 0x00, 0x00, 0x01, 0xE8, 0x0E, 0x00, 0x00, 0x01, 0x14, 0x0F, 0x00, 0x00, 0x01, +/* 000001A0 */ 0x3E, 0x0F, 0x00, 0x00, 0x01, 0x68, 0x0F, 0x00, 0x00, 0x01, 0x92, 0x0F, 0x00, 0x00, 0x01, 0xB6, +/* 000001B0 */ 0x0F, 0x00, 0x00, 0x01, 0xDA, 0x0F, 0x00, 0x00, 0x01, 0x04, 0x10, 0x00, 0x00, 0x01, 0x2C, 0x10, +/* 000001C0 */ 0x00, 0x00, 0x01, 0x3C, 0x10, 0x00, 0x00, 0x01, 0x68, 0x10, 0x00, 0x00, 0x01, 0x9C, 0x10, 0x00, +/* 000001D0 */ 0x00, 0x01, 0xD0, 0x10, 0x00, 0x00, 0x01, 0xF2, 0x10, 0x00, 0x00, 0x01, 0x16, 0x11, 0x00, 0x00, +/* 000001E0 */ 0x01, 0x3A, 0x11, 0x00, 0x00, 0x01, 0x62, 0x11, 0x00, 0x00, 0x01, 0x8A, 0x11, 0x00, 0x00, 0x01, +/* 000001F0 */ 0xA8, 0x11, 0x00, 0x00, 0x01, 0xD4, 0x11, 0x00, 0x00, 0x01, 0xE6, 0x11, 0x00, 0x00, 0x01, 0x1A, +/* 00000200 */ 0x12, 0x00, 0x00, 0x01, 0x56, 0x12, 0x00, 0x00, 0x01, 0x96, 0x12, 0x00, 0x00, 0x01, 0xE4, 0x12, +/* 00000210 */ 0x00, 0x00, 0x01, 0x0C, 0x13, 0x00, 0x00, 0x01, 0x1E, 0x13, 0x00, 0x00, 0x01, 0x44, 0x13, 0x00, +/* 00000220 */ 0x00, 0x01, 0x70, 0x13, 0x00, 0x00, 0x01, 0x90, 0x13, 0x00, 0x00, 0x01, 0xB2, 0x13, 0x00, 0x00, +/* 00000230 */ 0x01, 0xDC, 0x13, 0x00, 0x00, 0x01, 0x0C, 0x14, 0x00, 0x00, 0x01, 0x3C, 0x14, 0x00, 0x00, 0x01, +/* 00000240 */ 0x5E, 0x14, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x00, 0x01, 0xA0, 0x14, 0x00, 0x00, 0x01, 0xB8, +/* 00000250 */ 0x14, 0x00, 0x00, 0x01, 0xFA, 0x14, 0x00, 0x00, 0x01, 0x32, 0x15, 0x00, 0x00, 0x01, 0x7C, 0x15, +/* 00000260 */ 0x00, 0x00, 0x01, 0xBC, 0x15, 0x00, 0x00, 0x01, 0x0A, 0x16, 0x00, 0x00, 0x01, 0x4E, 0x16, 0x00, +/* 00000270 */ 0x00, 0x01, 0x80, 0x16, 0x00, 0x00, 0x01, 0xAC, 0x16, 0x00, 0x00, 0x00, 0xB2, 0x16, 0x00, 0x00, +/* 00000280 */ 0x00, 0x0C, 0x17, 0x00, 0x00, 0x00, 0x36, 0x17, 0x00, 0x00, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, +/* 00000290 */ 0x62, 0x17, 0x00, 0x00, 0x00, 0x6A, 0x17, 0x00, 0x00, 0x00, 0x78, 0x17, 0x00, 0x00, 0x00, 0x88, +/* 000002A0 */ 0x17, 0x00, 0x00, 0x00, 0xB2, 0x17, 0x00, 0x00, 0x01, 0xC4, 0x17, 0x00, 0x00, 0x01, 0xE4, 0x17, +/* 000002B0 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x00, 0x00, 0x00, 0x2C, 0x18, 0x00, +/* 000002C0 */ 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x01, 0x52, 0x18, 0x00, 0x00, 0x00, 0x64, 0x18, 0x00, 0x00, +/* 000002D0 */ 0x00, 0x76, 0x18, 0x00, 0x00, 0x00, 0x98, 0x18, 0x00, 0x00, 0x00, 0xAA, 0x18, 0x00, 0x00, 0x01, +/* 000002E0 */ 0xC2, 0x18, 0x00, 0x00, 0x00, 0xD2, 0x18, 0x00, 0x00, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0xEE, +/* 000002F0 */ 0x18, 0x00, 0x00, 0x00, 0xF4, 0x18, 0x00, 0x00, 0x00, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x04, 0x19, +/* 00000300 */ 0x00, 0x00, 0x00, 0x18, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x19, 0x00, 0x00, 0x00, 0x24, 0x19, 0x00, +/* 00000310 */ 0x00, 0x00, 0x28, 0x19, 0x00, 0x00, 0x00, 0x3E, 0x19, 0x00, 0x00, 0x00, 0x4A, 0x19, 0x00, 0x00, +/* 00000320 */ 0x00, 0x56, 0x19, 0x00, 0x00, 0x00, 0x5E, 0x19, 0x00, 0x00, 0x00, 0x62, 0x19, 0x00, 0x00, 0x00, +/* 00000330 */ 0x66, 0x19, 0x00, 0x00, 0x00, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0x00, 0x3C, +/* 00000340 */ 0x1B, 0x00, 0x00, 0x00, 0x48, 0x1B, 0x00, 0x00, 0x00, 0x50, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x1B, +/* 00000350 */ 0x00, 0x00, 0x00, 0x80, 0x1B, 0x00, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0x00, 0xA4, 0x1B, 0x00, +/* 00000360 */ 0x00, 0x00, 0xBA, 0x1B, 0x00, 0x00, 0x00, 0xC8, 0x1B, 0x00, 0x00, 0x00, 0xD6, 0x1B, 0x00, 0x00, +/* 00000370 */ 0x00, 0xE0, 0x1B, 0x00, 0x00, 0x00, 0xEE, 0x1B, 0x00, 0x00, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x00, +/* 00000380 */ 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x28, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x3C, +/* 00000390 */ 0x1C, 0x00, 0x00, 0x00, 0x48, 0x1C, 0x00, 0x00, 0x00, 0x50, 0x1C, 0x00, 0x00, 0x00, 0x60, 0x1C, +/* 000003A0 */ 0x00, 0x00, 0x00, 0x6C, 0x1C, 0x00, 0x00, 0x00, 0x76, 0x1C, 0x00, 0x00, 0x00, 0x86, 0x1C, 0x00, +/* 000003B0 */ 0x00, 0x00, 0x92, 0x1C, 0x00, 0x00, 0x00, 0x9C, 0x1C, 0x00, 0x00, 0x00, 0xA2, 0x1C, 0x00, 0x00, +/* 000003C0 */ 0x00, 0xA6, 0x1C, 0x00, 0x00, 0x01, 0xB0, 0x1C, 0x00, 0x00, 0x00, 0xBE, 0x1C, 0x00, 0x00, 0x00, +/* 000003D0 */ 0xCC, 0x1C, 0x00, 0x00, 0x00, 0xDA, 0x1C, 0x00, 0x00, 0x01, 0xE8, 0x1C, 0x00, 0x00, 0x01, 0xF4, +/* 000003E0 */ 0x1C, 0x00, 0x00, 0x01, 0x02, 0x1D, 0x00, 0x00, 0x01, 0x1E, 0x1D, 0x00, 0x00, 0x00, 0x30, 0x1D, +/* 000003F0 */ 0x00, 0x00, 0x00, 0x4C, 0x1D, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x00, 0x00, 0x00, 0xC6, 0x1D, 0x00, +/* 00000400 */ 0x00, 0x00, 0x1A, 0x1E, 0x00, 0x00, 0x00, 0x72, 0x1E, 0x00, 0x00, 0x00, 0xAE, 0x1E, 0x00, 0x00, +/* 00000410 */ 0x01, 0xC0, 0x1E, 0x00, 0x00, 0x01, 0xF2, 0x1E, 0x00, 0x00, 0x01, 0x22, 0x1F, 0x00, 0x00, 0x00, +/* 00000420 */ 0x2C, 0x1F, 0x00, 0x00, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0x00, 0x9C, 0x1F, 0x00, 0x00, 0x00, 0xD4, +/* 00000430 */ 0x1F, 0x00, 0x00, 0x00, 0xE2, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x2E, 0x20, +/* 00000440 */ 0x00, 0x00, 0x00, 0x4A, 0x20, 0x00, 0x00, 0x00, 0x8A, 0x20, 0x00, 0x00, 0x00, 0x9E, 0x20, 0x00, +/* 00000450 */ 0x00, 0x00, 0xB6, 0x20, 0x00, 0x00, 0x00, 0xD6, 0x20, 0x00, 0x00, 0x00, 0xE6, 0x20, 0x00, 0x00, +/* 00000460 */ 0x00, 0xEE, 0x20, 0x00, 0x00, 0x00, 0x06, 0x21, 0x00, 0x00, 0x01, 0x2C, 0x21, 0x00, 0x00, 0x00, +/* 00000470 */ 0x5C, 0x21, 0x00, 0x00, 0x01, 0x68, 0x21, 0x00, 0x00, 0x00, 0x72, 0x21, 0x00, 0x00, 0x00, 0x80, +/* 00000480 */ 0x21, 0x00, 0x00, 0x00, 0x98, 0x21, 0x00, 0x00, 0x00, 0xA2, 0x21, 0x00, 0x00, 0x00, 0xB0, 0x21, +/* 00000490 */ 0x00, 0x00, 0x00, 0xBA, 0x21, 0x00, 0x00, 0x00, 0xCA, 0x21, 0x00, 0x00, 0x00, 0xEE, 0x21, 0x00, +/* 000004A0 */ 0x00, 0x01, 0x02, 0x22, 0x00, 0x00, 0x00, 0x0E, 0x22, 0x00, 0x00, 0x00, 0x1A, 0x22, 0x00, 0x00, +/* 000004B0 */ 0x00, 0x26, 0x22, 0x00, 0x00, 0x00, 0x36, 0x22, 0x00, 0x00, 0x00, 0x46, 0x22, 0x00, 0x00, 0x00, +/* 000004C0 */ 0x4A, 0x22, 0x00, 0x00, 0x00, 0x4E, 0x22, 0x00, 0x00, 0x00, 0x52, 0x22, 0x00, 0x00, 0x01, 0x66, +/* 000004D0 */ 0x22, 0x00, 0x00, 0x00, 0x6C, 0x22, 0x00, 0x00, 0x00, 0x72, 0x22, 0x00, 0x00, 0x00, 0x7C, 0x22, +/* 000004E0 */ 0x00, 0x00, 0x00, 0x82, 0x22, 0x00, 0x00, 0x00, 0x94, 0x22, 0x00, 0x00, 0x00, 0xCA, 0x22, 0x00, +/* 000004F0 */ 0x00, 0x00, 0x10, 0x23, 0x00, 0x00, 0x01, 0x20, 0x23, 0x00, 0x00, 0x01, 0x30, 0x23, 0x00, 0x00, +/* 00000500 */ 0x01, 0x40, 0x23, 0x00, 0x00, 0x01, 0x52, 0x23, 0x00, 0x00, 0x01, 0x60, 0x23, 0x00, 0x00, 0x01, +/* 00000510 */ 0x6A, 0x23, 0x00, 0x00, 0x01, 0x74, 0x23, 0x00, 0x00, 0x00, 0x82, 0x23, 0x00, 0x00, 0x00, 0xC2, +/* 00000520 */ 0x23, 0x00, 0x00, 0x00, 0xE6, 0x23, 0x00, 0x00, 0x00, 0x2C, 0x24, 0x00, 0x00, 0x00, 0x4C, 0x24, +/* 00000530 */ 0x00, 0x00, 0x00, 0x58, 0x24, 0x00, 0x00, 0x00, 0x6A, 0x24, 0x00, 0x00, 0x00, 0x8A, 0x24, 0x00, +/* 00000540 */ 0x00, 0x00, 0xB4, 0x24, 0x00, 0x00, 0x00, 0xE0, 0x24, 0x00, 0x00, 0x00, 0x0C, 0x25, 0x00, 0x00, +/* 00000550 */ 0x00, 0x3E, 0x25, 0x00, 0x00, 0x00, 0x70, 0x25, 0x00, 0x00, 0x00, 0x88, 0x25, 0x00, 0x00, 0x00, +/* 00000560 */ 0x96, 0x25, 0x00, 0x00, 0x00, 0xAC, 0x25, 0x00, 0x00, 0x01, 0xD0, 0x25, 0x00, 0x00, 0x01, 0x08, +/* 00000570 */ 0x26, 0x00, 0x00, 0x01, 0x36, 0x26, 0x00, 0x00, 0x00, 0x46, 0x26, 0x00, 0x00, 0x00, 0x56, 0x26, +/* 00000580 */ 0x00, 0x00, 0x00, 0x60, 0x26, 0x00, 0x00, 0x00, 0x6E, 0x26, 0x00, 0x00, 0x00, 0x74, 0x26, 0x00, +/* 00000590 */ 0x00, 0x00, 0x7E, 0x26, 0x00, 0x00, 0x01, 0x9E, 0x26, 0x00, 0x00, 0x00, 0xDA, 0x26, 0x00, 0x00, +/* 000005A0 */ 0x00, 0x28, 0x27, 0x00, 0x00, 0x01, 0x42, 0x27, 0x00, 0x00, 0x00, 0x48, 0x27, 0x00, 0x00, 0x00, +/* 000005B0 */ 0x52, 0x27, 0x00, 0x00, 0x01, 0x76, 0x27, 0x00, 0x00, 0x00, 0x86, 0x27, 0x00, 0x00, 0x01, 0xA4, +/* 000005C0 */ 0x27, 0x00, 0x00, 0x00, 0xB2, 0x27, 0x00, 0x00, 0x01, 0xCE, 0x27, 0x00, 0x00, 0x00, 0xDE, 0x27, +/* 000005D0 */ 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x12, 0x28, 0x00, 0x00, 0x01, 0x30, 0x28, 0x00, +/* 000005E0 */ 0x00, 0x00, 0x3E, 0x28, 0x00, 0x00, 0x01, 0x5C, 0x28, 0x00, 0x00, 0x00, 0x6A, 0x28, 0x00, 0x00, +/* 000005F0 */ 0x01, 0x8C, 0x28, 0x00, 0x00, 0x00, 0xA8, 0x28, 0x00, 0x00, 0x01, 0xC2, 0x28, 0x00, 0x00, 0x00, +/* 00000600 */ 0xCC, 0x28, 0x00, 0x00, 0x01, 0xEA, 0x28, 0x00, 0x00, 0x00, 0xF8, 0x28, 0x00, 0x00, 0x00, 0x16, +/* 00000610 */ 0x29, 0x00, 0x00, 0x00, 0x3C, 0x29, 0x00, 0x00, 0x00, 0x62, 0x29, 0x00, 0x00, 0x00, 0x9E, 0x29, +/* 00000620 */ 0x00, 0x00, 0x00, 0xA6, 0x29, 0x00, 0x00, 0x00, 0xAE, 0x29, 0x00, 0x00, 0x00, 0xF2, 0x29, 0x00, +/* 00000630 */ 0x00, 0x00, 0xFC, 0x29, 0x00, 0x00, 0x00, 0x40, 0x2A, 0x00, 0x00, 0x00, 0x4A, 0x2A, 0x00, 0x00, +/* 00000640 */ 0x00, 0x72, 0x2A, 0x00, 0x00, 0x00, 0xBC, 0x2A, 0x00, 0x00, 0x00, 0xC2, 0x2A, 0x00, 0x00, 0x01, +/* 00000650 */ 0xF4, 0x2A, 0x00, 0x00, 0x01, 0x18, 0x2B, 0x00, 0x00, 0x01, 0x52, 0x2B, 0x00, 0x00, 0x01, 0x7E, +/* 00000660 */ 0x2B, 0x00, 0x00, 0x01, 0xBA, 0x2B, 0x00, 0x00, 0x01, 0x08, 0x2C, 0x00, 0x00, 0x01, 0x32, 0x2C, +/* 00000670 */ 0x00, 0x00, 0x01, 0x64, 0x2C, 0x00, 0x00, 0x01, 0xB6, 0x2C, 0x00, 0x00, 0x01, 0x08, 0x2D, 0x00, +/* 00000680 */ 0x00, 0x00, 0x12, 0x2D, 0x00, 0x00, 0x00, 0x1E, 0x2D, 0x00, 0x00, 0x00, 0x26, 0x2D, 0x00, 0x00, +/* 00000690 */ 0x00, 0x30, 0x2D, 0x00, 0x00, 0x00, 0x3E, 0x2D, 0x00, 0x00, 0x00, 0x4C, 0x2D, 0x00, 0x00, 0x00, +/* 000006A0 */ 0x5A, 0x2D, 0x00, 0x00, 0x00, 0x66, 0x2D, 0x00, 0x00, 0x00, 0x92, 0x2D, 0x00, 0x00, 0x00, 0x9C, +/* 000006B0 */ 0x2D, 0x00, 0x00, 0x00, 0xBA, 0x2D, 0x00, 0x00, 0x00, 0xCA, 0x2D, 0x00, 0x00, 0x00, 0xEC, 0x2D, +/* 000006C0 */ 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x1C, 0x2E, 0x00, 0x00, 0x00, 0x40, 0x2E, 0x00, +/* 000006D0 */ 0x00, 0x00, 0x56, 0x2E, 0x00, 0x00, 0x00, 0x80, 0x2E, 0x00, 0x00, 0x00, 0x9C, 0x2E, 0x00, 0x00, +/* 000006E0 */ 0x00, 0xA0, 0x2E, 0x00, 0x00, 0x01, 0xB2, 0x2E, 0x00, 0x00, 0x00, 0xB8, 0x2E, 0x00, 0x00, 0x00, +/* 000006F0 */ 0x04, 0x2F, 0x00, 0x00, 0x00, 0xCE, 0x2F, 0x00, 0x00, 0x00, 0xE4, 0x2F, 0x00, 0x00, 0x00, 0x2A, +/* 00000700 */ 0x30, 0x00, 0x00, 0x00, 0x34, 0x30, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x30, +/* 00000710 */ 0x00, 0x00, 0x00, 0x40, 0x30, 0x00, 0x00, 0x00, 0x58, 0x30, 0x00, 0x00, 0x00, 0x76, 0x30, 0x00, +/* 00000720 */ 0x00, 0x00, 0xC2, 0x30, 0x00, 0x00, 0x00, 0xA2, 0x31, 0x00, 0x00, 0x00, 0xBC, 0x31, 0x00, 0x00, +/* 00000730 */ 0x00, 0xCC, 0x31, 0x00, 0x00, 0x00, 0xE0, 0x31, 0x00, 0x00, 0x00, 0xF4, 0x31, 0x00, 0x00, 0x00, +/* 00000740 */ 0x76, 0x32, 0x00, 0x00, 0x00, 0xA2, 0x32, 0x00, 0x00, 0x00, 0xBA, 0x32, 0x00, 0x00, 0x00, 0xCC, +/* 00000750 */ 0x32, 0x00, 0x00, 0x00, 0x06, 0x33, 0x00, 0x00, 0x00, 0x18, 0x33, 0x00, 0x00, 0x00, 0x28, 0x33, +/* 00000760 */ 0x00, 0x00, 0x00, 0x30, 0x33, 0x00, 0x00, 0x00, 0x4A, 0x33, 0x00, 0x00, 0x00, 0x58, 0x33, 0x00, +/* 00000770 */ 0x00, 0x00, 0x74, 0x33, 0x00, 0x00, 0x00, 0x80, 0x33, 0x00, 0x00, 0x00, 0x98, 0x33, 0x00, 0x00, +/* 00000780 */ 0x00, 0xB0, 0x33, 0x00, 0x00, 0x00, 0xBA, 0x33, 0x00, 0x00, 0x00, 0xD4, 0x33, 0x00, 0x00, 0x01, +/* 00000790 */ 0xE4, 0x33, 0x00, 0x00, 0x01, 0xF4, 0x33, 0x00, 0x00, 0x01, 0x08, 0x34, 0x00, 0x00, 0x00, 0x46, +/* 000007A0 */ 0x34, 0x00, 0x00, 0x00, 0x8C, 0x34, 0x00, 0x00, 0x00, 0xD2, 0x34, 0x00, 0x00, 0x00, 0x12, 0x35, +/* 000007B0 */ 0x00, 0x00, 0x00, 0x64, 0x35, 0x00, 0x00, 0x00, 0x76, 0x35, 0x00, 0x00, 0x01, 0x80, 0x35, 0x00, +/* 000007C0 */ 0x00, 0x00, 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, +/* 000007D0 */ 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 000007E0 */ 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 000007F0 */ 0x4E, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x46, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x4E, 0x00, +/* 00000800 */ 0x44, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6C, 0x00, +/* 00000810 */ 0x6F, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x00, 0x00, +/* 00000820 */ 0x70, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x4E, 0x00, 0x00, 0x00, +/* 00000830 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00000840 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00000850 */ 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, +/* 00000860 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, +/* 00000870 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000880 */ 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, +/* 00000890 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 000008A0 */ 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000008B0 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x54, 0x00, +/* 000008C0 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 000008D0 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 000008E0 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000008F0 */ 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00000900 */ 0x65, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x58, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00000910 */ 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x56, 0x00, 0x61, 0x00, +/* 00000920 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, +/* 00000930 */ 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00000940 */ 0x72, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00000950 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000960 */ 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00000970 */ 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00000980 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, +/* 00000990 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 000009A0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, +/* 000009B0 */ 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, +/* 000009C0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, +/* 000009D0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 000009E0 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 000009F0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00000A00 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 00000A10 */ 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, +/* 00000A20 */ 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000A30 */ 0x73, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, +/* 00000A40 */ 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00000A50 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00000A60 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, +/* 00000A70 */ 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00000A80 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00000A90 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x45, 0x00, +/* 00000AA0 */ 0x53, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, +/* 00000AB0 */ 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x76, 0x00, +/* 00000AC0 */ 0x2D, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2D, 0x00, 0x44, 0x00, +/* 00000AD0 */ 0x45, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, +/* 00000AE0 */ 0x6B, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, +/* 00000AF0 */ 0x00, 0x00, 0x6A, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x00, 0x00, 0x75, 0x00, +/* 00000B00 */ 0x6E, 0x00, 0x69, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000B10 */ 0x64, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, +/* 00000B20 */ 0x54, 0x00, 0x57, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00000B30 */ 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00000B40 */ 0x75, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00000B50 */ 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x48, 0x00, 0x4B, 0x00, +/* 00000B60 */ 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x7A, 0x00, +/* 00000B70 */ 0x68, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000B80 */ 0x79, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x53, 0x00, +/* 00000B90 */ 0x47, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x43, 0x00, +/* 00000BA0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00000BB0 */ 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000BC0 */ 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000BD0 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, +/* 00000BE0 */ 0x69, 0x00, 0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000BF0 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, +/* 00000C00 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00000C10 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00000C20 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00000C30 */ 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00000C40 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, +/* 00000C50 */ 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, +/* 00000C60 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, +/* 00000C70 */ 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00000C80 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, +/* 00000C90 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, +/* 00000CA0 */ 0x74, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x4F, 0x00, +/* 00000CB0 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00000CC0 */ 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, +/* 00000CD0 */ 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, +/* 00000CE0 */ 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x45, 0x00, 0x78, 0x00, 0x70, 0x00, 0x00, 0x00, 0x49, 0x00, +/* 00000CF0 */ 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00000D00 */ 0x65, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, +/* 00000D10 */ 0x52, 0x00, 0x45, 0x00, 0x73, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, +/* 00000D20 */ 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00000D30 */ 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, +/* 00000D40 */ 0x43, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00000D50 */ 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00000D60 */ 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, +/* 00000D70 */ 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00000D80 */ 0x75, 0x00, 0x70, 0x00, 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00000D90 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000DA0 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, +/* 00000DB0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, +/* 00000DC0 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000DD0 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000DE0 */ 0x79, 0x00, 0x4C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, +/* 00000DF0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00000E00 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00000E10 */ 0x00, 0x00, 0x52, 0x00, 0x61, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x41, 0x00, 0x73, 0x00, +/* 00000E20 */ 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000E30 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000E40 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x4F, 0x00, +/* 00000E50 */ 0x66, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00000E60 */ 0x49, 0x00, 0x73, 0x00, 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000E70 */ 0x69, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000E80 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x77, 0x00, +/* 00000E90 */ 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00000EA0 */ 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x4F, 0x00, +/* 00000EB0 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000EC0 */ 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, +/* 00000ED0 */ 0x4F, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000EE0 */ 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000EF0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000F00 */ 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00000F10 */ 0x79, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00000F20 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000F30 */ 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, +/* 00000F40 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00000F50 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, +/* 00000F60 */ 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000F70 */ 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00000F80 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00000F90 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00000FA0 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, +/* 00000FB0 */ 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00000FC0 */ 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, +/* 00000FD0 */ 0x4A, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00000FE0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000FF0 */ 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x42, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001000 */ 0x64, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00001010 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x65, 0x00, +/* 00001020 */ 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00001030 */ 0x74, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 00001040 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00001050 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x52, 0x00, 0x65, 0x00, 0x70, 0x00, 0x6C, 0x00, +/* 00001060 */ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00001070 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001080 */ 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, +/* 00001090 */ 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 000010A0 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 000010B0 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x70, 0x00, +/* 000010C0 */ 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000010D0 */ 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x49, 0x00, +/* 000010E0 */ 0x66, 0x00, 0x50, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 000010F0 */ 0x00, 0x00, 0x74, 0x00, 0x68, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x45, 0x00, 0x78, 0x00, +/* 00001100 */ 0x49, 0x00, 0x66, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x53, 0x00, +/* 00001110 */ 0x4F, 0x00, 0x45, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x50, 0x00, 0x75, 0x00, +/* 00001120 */ 0x62, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x63, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00001130 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, +/* 00001140 */ 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 00001150 */ 0x6E, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 00001160 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, +/* 00001170 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x48, 0x00, 0x65, 0x00, +/* 00001180 */ 0x6C, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001190 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000011A0 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 000011B0 */ 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, +/* 000011C0 */ 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 000011D0 */ 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, +/* 000011E0 */ 0x61, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, +/* 000011F0 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001200 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00001210 */ 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001220 */ 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00001230 */ 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, +/* 00001240 */ 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001250 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00001260 */ 0x65, 0x00, 0x73, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, +/* 00001270 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, +/* 00001280 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, +/* 00001290 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 000012A0 */ 0x73, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000012B0 */ 0x73, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 000012C0 */ 0x6E, 0x00, 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000012D0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, +/* 000012E0 */ 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 000012F0 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 00001300 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00001310 */ 0x69, 0x00, 0x74, 0x00, 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x69, 0x00, +/* 00001320 */ 0x73, 0x00, 0x50, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001330 */ 0x6D, 0x00, 0x55, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x43, 0x00, +/* 00001340 */ 0x55, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x75, 0x00, +/* 00001350 */ 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00001360 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x44, 0x00, 0x00, 0x00, +/* 00001370 */ 0x5F, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00001380 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00001390 */ 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, +/* 000013A0 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000013B0 */ 0x00, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x44, 0x00, +/* 000013C0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, +/* 000013D0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, +/* 000013E0 */ 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000013F0 */ 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x75, 0x00, 0x61, 0x00, +/* 00001400 */ 0x67, 0x00, 0x65, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, +/* 00001410 */ 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00001420 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 00001430 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x55, 0x00, +/* 00001440 */ 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, 0x5F, 0x00, 0x43, 0x00, +/* 00001450 */ 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, +/* 00001460 */ 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, +/* 00001470 */ 0x42, 0x00, 0x41, 0x00, 0x53, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, +/* 00001480 */ 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, +/* 00001490 */ 0x5F, 0x00, 0x45, 0x00, 0x58, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, +/* 000014A0 */ 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, +/* 000014B0 */ 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 000014C0 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 000014D0 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 000014E0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, +/* 000014F0 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001500 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001510 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001520 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001530 */ 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, +/* 00001540 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001550 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001560 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001570 */ 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00001580 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00001590 */ 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, +/* 000015A0 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000015B0 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 000015C0 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 000015D0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 000015E0 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 000015F0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, +/* 00001600 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001610 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001620 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001630 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001640 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, +/* 00001650 */ 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, +/* 00001660 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00001670 */ 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00001680 */ 0x5F, 0x00, 0x5F, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00001690 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 000016A0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, +/* 000016B0 */ 0x00, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, +/* 000016C0 */ 0x61, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x62, 0x00, +/* 000016D0 */ 0x7D, 0x00, 0x7B, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x63, 0x00, +/* 000016E0 */ 0x7D, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000016F0 */ 0x2E, 0x00, 0x64, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x73, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, +/* 00001700 */ 0x6E, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00001710 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001720 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x46, 0x00, +/* 00001730 */ 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001740 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001750 */ 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00001760 */ 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001770 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x54, 0x00, +/* 00001780 */ 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001790 */ 0x6C, 0x00, 0x65, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, +/* 000017A0 */ 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 000017B0 */ 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 000017C0 */ 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 000017D0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000017E0 */ 0x72, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x28, 0x00, +/* 000017F0 */ 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x24, 0x00, 0x00, 0x00, +/* 00001800 */ 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2D, 0x00, +/* 00001810 */ 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00001820 */ 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00001830 */ 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x00, 0x00, +/* 00001840 */ 0x54, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00001850 */ 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001860 */ 0x67, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, +/* 00001870 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x67, 0x00, +/* 00001880 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001890 */ 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x69, 0x00, +/* 000018A0 */ 0x6E, 0x00, 0x74, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, +/* 000018B0 */ 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, +/* 000018C0 */ 0x00, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 000018D0 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 000018E0 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5B, 0x00, +/* 000018F0 */ 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, +/* 00001900 */ 0x5D, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, +/* 00001910 */ 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x20, 0x00, 0x2D, 0x00, +/* 00001920 */ 0x20, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, +/* 00001930 */ 0x5A, 0x00, 0x5D, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x24, 0x00, 0x00, 0x00, 0x5B, 0x00, +/* 00001940 */ 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, +/* 00001950 */ 0x39, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x7C, 0x00, +/* 00001960 */ 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, +/* 00001970 */ 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6A, 0x00, 0x62, 0x00, +/* 00001980 */ 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x2D, 0x00, 0x67, 0x00, +/* 00001990 */ 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x7C, 0x00, 0x6E, 0x00, +/* 000019A0 */ 0x6F, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x6E, 0x00, 0x6F, 0x00, +/* 000019B0 */ 0x2D, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, +/* 000019C0 */ 0x67, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x79, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, +/* 000019D0 */ 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x61, 0x00, 0x7C, 0x00, 0x7A, 0x00, +/* 000019E0 */ 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, +/* 000019F0 */ 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001A00 */ 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x78, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001A10 */ 0x67, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, +/* 00001A20 */ 0x3F, 0x00, 0x3A, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x47, 0x00, 0x42, 0x00, 0x2D, 0x00, +/* 00001A30 */ 0x6F, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x61, 0x00, 0x6D, 0x00, +/* 00001A40 */ 0x69, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x7C, 0x00, +/* 00001A50 */ 0x69, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00001A60 */ 0x74, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001A70 */ 0x68, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x68, 0x00, +/* 00001A80 */ 0x61, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x69, 0x00, +/* 00001A90 */ 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6C, 0x00, +/* 00001AA0 */ 0x75, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001AB0 */ 0x67, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, +/* 00001AC0 */ 0x76, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x70, 0x00, +/* 00001AD0 */ 0x77, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6F, 0x00, +/* 00001AE0 */ 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x79, 0x00, 0x7C, 0x00, 0x69, 0x00, +/* 00001AF0 */ 0x2D, 0x00, 0x74, 0x00, 0x73, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, +/* 00001B00 */ 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x52, 0x00, 0x7C, 0x00, 0x73, 0x00, +/* 00001B10 */ 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x4E, 0x00, 0x4C, 0x00, +/* 00001B20 */ 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x48, 0x00, 0x2D, 0x00, +/* 00001B30 */ 0x44, 0x00, 0x45, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001B40 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, +/* 00001B50 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x78, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001B60 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, +/* 00001B70 */ 0x5C, 0x00, 0x62, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, +/* 00001B80 */ 0x7C, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x57, 0x00, 0x59, 0x00, 0x2D, 0x00, 0x5A, 0x00, +/* 00001B90 */ 0x5D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, +/* 00001BA0 */ 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x29, 0x00, +/* 00001BB0 */ 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x35, 0x00, 0x2C, 0x00, +/* 00001BC0 */ 0x38, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, +/* 00001BD0 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, +/* 00001BE0 */ 0x7B, 0x00, 0x34, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, +/* 00001BF0 */ 0x33, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, +/* 00001C00 */ 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x7B, 0x00, 0x30, 0x00, 0x2C, 0x00, +/* 00001C10 */ 0x32, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, +/* 00001C20 */ 0x2C, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001C30 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x34, 0x00, +/* 00001C40 */ 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x00, 0x00, +/* 00001C50 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x00, 0x00, +/* 00001C60 */ 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, +/* 00001C70 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001C80 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001C90 */ 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001CA0 */ 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x00, 0x00, +/* 00001CB0 */ 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, +/* 00001CC0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00001CD0 */ 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, +/* 00001CE0 */ 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00001CF0 */ 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00001D00 */ 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, +/* 00001D10 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x62, 0x00, +/* 00001D20 */ 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 00001D30 */ 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x61, 0x00, +/* 00001D40 */ 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x27, 0x00, +/* 00001D50 */ 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 00001D60 */ 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00001D70 */ 0x75, 0x00, 0x70, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001D80 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001D90 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001DA0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001DB0 */ 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, +/* 00001DC0 */ 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, +/* 00001DD0 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, +/* 00001DE0 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00001DF0 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001E00 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, +/* 00001E10 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001E20 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001E30 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001E40 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001E50 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, +/* 00001E60 */ 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, +/* 00001E70 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, +/* 00001E80 */ 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001E90 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 00001EA0 */ 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x74, 0x00, +/* 00001EB0 */ 0x6F, 0x00, 0x52, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, +/* 00001EC0 */ 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 00001ED0 */ 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x46, 0x00, +/* 00001EE0 */ 0x6F, 0x00, 0x72, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00001EF0 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00001F00 */ 0x64, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00001F10 */ 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001F20 */ 0x00, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, +/* 00001F30 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, +/* 00001F40 */ 0x5D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x3F, 0x00, 0x2D, 0x00, +/* 00001F50 */ 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2A, 0x00, +/* 00001F60 */ 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, +/* 00001F70 */ 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x28, 0x00, +/* 00001F80 */ 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x5F, 0x00, 0x3F, 0x00, +/* 00001F90 */ 0x28, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x63, 0x00, 0x72, 0x00, +/* 00001FA0 */ 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001FB0 */ 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001FC0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001FD0 */ 0x67, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, +/* 00001FE0 */ 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 00001FF0 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00002000 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00002010 */ 0x2E, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, +/* 00002020 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, +/* 00002030 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 00002040 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002050 */ 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002060 */ 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002070 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, +/* 00002080 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002090 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 000020A0 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 000020B0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 000020C0 */ 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 000020D0 */ 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, +/* 000020E0 */ 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x67, 0x00, +/* 000020F0 */ 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, +/* 00002100 */ 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002110 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00002120 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, +/* 00002130 */ 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, +/* 00002140 */ 0x7A, 0x00, 0x65, 0x00, 0x64, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x4F, 0x00, +/* 00002150 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, +/* 00002160 */ 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00002170 */ 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, 0x68, 0x00, 0x00, 0x00, +/* 00002180 */ 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x76, 0x00, +/* 00002190 */ 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 000021A0 */ 0x00, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 000021B0 */ 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 000021C0 */ 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, +/* 000021D0 */ 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 000021E0 */ 0x75, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 000021F0 */ 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x46, 0x00, 0x69, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00002200 */ 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00002210 */ 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x66, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002220 */ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002230 */ 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, +/* 00002240 */ 0x6C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x61, 0x00, +/* 00002250 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002260 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6E, 0x00, +/* 00002270 */ 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, +/* 00002280 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00002290 */ 0x64, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000022A0 */ 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000022B0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, +/* 000022C0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 000022D0 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, +/* 000022E0 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, +/* 000022F0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002300 */ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 00002310 */ 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x41, 0x00, 0x55, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 00002320 */ 0x44, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x4C, 0x00, 0x00, 0x00, +/* 00002330 */ 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 00002340 */ 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, +/* 00002350 */ 0x00, 0x00, 0x53, 0x00, 0x59, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x4C, 0x00, 0x00, 0x00, +/* 00002360 */ 0x43, 0x00, 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4D, 0x00, +/* 00002370 */ 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002380 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2E, 0x00, +/* 00002390 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 000023A0 */ 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000023B0 */ 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000023C0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 000023D0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000023E0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, +/* 000023F0 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00002400 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002410 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 00002420 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00002430 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x53, 0x00, +/* 00002440 */ 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00002450 */ 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00002460 */ 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, +/* 00002470 */ 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00002480 */ 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00002490 */ 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000024A0 */ 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 000024B0 */ 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, +/* 000024C0 */ 0x6D, 0x00, 0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 000024D0 */ 0x6E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 000024E0 */ 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, +/* 000024F0 */ 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, +/* 00002500 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, +/* 00002510 */ 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, +/* 00002520 */ 0x6E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002530 */ 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, +/* 00002540 */ 0x61, 0x00, 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, +/* 00002550 */ 0x67, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00002560 */ 0x74, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 00002570 */ 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00002580 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00002590 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, +/* 000025A0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 000025B0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000025C0 */ 0x61, 0x00, 0x74, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000025D0 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 000025E0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000025F0 */ 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, +/* 00002600 */ 0x6C, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 00002610 */ 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 00002620 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00002630 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x63, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00002640 */ 0x61, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, +/* 00002650 */ 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00002660 */ 0x73, 0x00, 0x79, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6E, 0x00, +/* 00002670 */ 0x75, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, +/* 00002680 */ 0x5F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, +/* 00002690 */ 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, +/* 000026A0 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 000026B0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 000026C0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, +/* 000026D0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 000026E0 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 000026F0 */ 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 00002700 */ 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, +/* 00002710 */ 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002720 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x68, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, +/* 00002730 */ 0x65, 0x00, 0x6E, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00002740 */ 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002750 */ 0x00, 0x00, 0x47, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00002760 */ 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, +/* 00002770 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x67, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, +/* 00002780 */ 0x72, 0x00, 0x79, 0x00, 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00002790 */ 0x77, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 000027A0 */ 0x72, 0x00, 0x00, 0x00, 0x68, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, +/* 000027B0 */ 0x00, 0x00, 0x48, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 000027C0 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, +/* 000027D0 */ 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x4A, 0x00, +/* 000027E0 */ 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, +/* 000027F0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002800 */ 0x6A, 0x00, 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00002810 */ 0x00, 0x00, 0x4A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, +/* 00002820 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002830 */ 0x6A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x4B, 0x00, +/* 00002840 */ 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002850 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6F, 0x00, +/* 00002860 */ 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x41, 0x00, +/* 00002870 */ 0x6C, 0x00, 0x51, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002880 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00002890 */ 0x6C, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x69, 0x00, +/* 000028A0 */ 0x76, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, +/* 000028B0 */ 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 000028C0 */ 0x00, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, +/* 000028D0 */ 0x69, 0x00, 0x77, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000028E0 */ 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, +/* 000028F0 */ 0x77, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00002900 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00002910 */ 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00002920 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 00002930 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002940 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 00002950 */ 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 00002960 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, +/* 00002970 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, +/* 00002980 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00002990 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x61, 0x00, +/* 000029A0 */ 0x6E, 0x00, 0x79, 0x00, 0x00, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x44, 0x00, +/* 000029B0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 000029C0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000029D0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 000029E0 */ 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000029F0 */ 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00002A00 */ 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002A10 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, +/* 00002A20 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00002A30 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 00002A40 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002A50 */ 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 00002A60 */ 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002A70 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00002A80 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00002A90 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002AA0 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 00002AB0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00002AC0 */ 0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002AD0 */ 0x54, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002AE0 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x61, 0x00, +/* 00002AF0 */ 0x70, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002B00 */ 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002B10 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 00002B20 */ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x54, 0x00, +/* 00002B30 */ 0x6F, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002B40 */ 0x54, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002B50 */ 0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002B60 */ 0x54, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002B70 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 00002B80 */ 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x57, 0x00, 0x65, 0x00, +/* 00002B90 */ 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00002BA0 */ 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002BB0 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00002BC0 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x79, 0x00, 0x48, 0x00, +/* 00002BD0 */ 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, +/* 00002BE0 */ 0x65, 0x00, 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x4D, 0x00, +/* 00002BF0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, +/* 00002C00 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00002C10 */ 0x74, 0x00, 0x65, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002C20 */ 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 00002C30 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002C40 */ 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, +/* 00002C50 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 00002C60 */ 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00002C70 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, +/* 00002C80 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 00002C90 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, +/* 00002CA0 */ 0x65, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002CB0 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002CC0 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00002CD0 */ 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002CE0 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x44, 0x00, +/* 00002CF0 */ 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002D00 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00002D10 */ 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, +/* 00002D20 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002D30 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, +/* 00002D40 */ 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, +/* 00002D50 */ 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6F, 0x00, +/* 00002D60 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, +/* 00002D70 */ 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, +/* 00002D80 */ 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002D90 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00002DA0 */ 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, +/* 00002DB0 */ 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x64, 0x00, +/* 00002DC0 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, +/* 00002DD0 */ 0x72, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, +/* 00002DE0 */ 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, +/* 00002DF0 */ 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, +/* 00002E00 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00002E10 */ 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, +/* 00002E20 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00002E30 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, +/* 00002E40 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, +/* 00002E50 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, +/* 00002E60 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00002E70 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, +/* 00002E80 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00002E90 */ 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +/* 00002EA0 */ 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002EB0 */ 0x00, 0x00, 0x7B, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, +/* 00002EC0 */ 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, +/* 00002ED0 */ 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, +/* 00002EE0 */ 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00002EF0 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, +/* 00002F00 */ 0x7D, 0x00, 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, +/* 00002F10 */ 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00002F20 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, +/* 00002F30 */ 0x77, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, +/* 00002F40 */ 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002F50 */ 0x20, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00002F60 */ 0x2F, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2F, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00002F70 */ 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002F80 */ 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 00002F90 */ 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, +/* 00002FA0 */ 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, +/* 00002FB0 */ 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, +/* 00002FC0 */ 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, +/* 00002FD0 */ 0x0A, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x3A, 0x00, 0x20, 0x00, +/* 00002FE0 */ 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00002FF0 */ 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00003000 */ 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5C, 0x00, +/* 00003010 */ 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, +/* 00003020 */ 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00003030 */ 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, /* 00003040 */ 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 00003050 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 00003060 */ 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, -/* 00003070 */ 0x6C, 0x00, 0x6C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00003080 */ 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7B, 0x00, 0x79, 0x00, -/* 00003090 */ 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, -/* 000030A0 */ 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 000030B0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, -/* 000030C0 */ 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, -/* 000030D0 */ 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, -/* 000030E0 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 000030F0 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x4E, 0x00, -/* 00003100 */ 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00003110 */ 0x31, 0x00, 0x32, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00003120 */ 0x74, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00003130 */ 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x31, 0x00, -/* 00003140 */ 0x32, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00003150 */ 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, -/* 00003160 */ 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x6E, 0x00, -/* 00003170 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x61, 0x00, -/* 00003180 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00003190 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000031A0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000031B0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000031C0 */ 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000031D0 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000031E0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000031F0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 00003200 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 00003210 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00003220 */ 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 00003230 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 00003240 */ 0xFE, 0xEF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x6A, -/* 00003250 */ 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x05, -/* 00003260 */ 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x70, -/* 00003270 */ 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x8F, -/* 00003280 */ 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE0, -/* 00003290 */ 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x5B, 0x02, 0x00, 0x00, 0x5B, -/* 000032A0 */ 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x7B, -/* 000032B0 */ 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xE8, 0x02, 0x00, 0x00, 0xE8, -/* 000032C0 */ 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x23, -/* 000032D0 */ 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x63, -/* 000032E0 */ 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0x97, -/* 000032F0 */ 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0xFB, -/* 00003300 */ 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x5E, 0x04, 0x00, 0x00, 0x5E, -/* 00003310 */ 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x70, -/* 00003320 */ 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x94, -/* 00003330 */ 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xDA, 0x04, 0x00, 0x00, 0xDA, -/* 00003340 */ 0x04, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x54, -/* 00003350 */ 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, 0x79, -/* 00003360 */ 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0xBD, 0x05, 0x00, 0x00, 0xBD, -/* 00003370 */ 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, -/* 00003380 */ 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x00, 0x3F, -/* 00003390 */ 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5C, 0x06, 0x00, 0x00, 0x5C, -/* 000033A0 */ 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0x89, -/* 000033B0 */ 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, 0xCD, -/* 000033C0 */ 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x00, 0x1D, -/* 000033D0 */ 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x50, -/* 000033E0 */ 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0xA5, -/* 000033F0 */ 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0x53, -/* 00003400 */ 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x25, -/* 00003410 */ 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0xAA, 0x09, 0x00, 0x00, 0xAA, -/* 00003420 */ 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0x36, 0x0A, 0x00, 0x00, 0x36, -/* 00003430 */ 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x3E, -/* 00003440 */ 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0xD6, 0x0A, 0x00, 0x00, 0xD6, -/* 00003450 */ 0x0A, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0x62, -/* 00003460 */ 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0xAF, 0x0B, 0x00, 0x00, 0xAF, -/* 00003470 */ 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0x33, 0x0C, 0x00, 0x00, 0x33, -/* 00003480 */ 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x82, 0x0C, 0x00, 0x00, 0x82, -/* 00003490 */ 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0x2E, 0x0D, 0x00, 0x00, 0x2E, -/* 000034A0 */ 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x63, 0x0D, 0x00, 0x00, 0x63, -/* 000034B0 */ 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0xA2, 0x0D, 0x00, 0x00, 0xA2, -/* 000034C0 */ 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDB, 0x0D, 0x00, 0x00, 0xDB, -/* 000034D0 */ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x2B, 0x0E, 0x00, 0x00, 0x2B, -/* 000034E0 */ 0x0E, 0x00, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x84, 0x0E, 0x00, 0x00, 0x84, -/* 000034F0 */ 0x0E, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x00, 0x8F, 0x0E, 0x00, 0x00, 0x8F, -/* 00003500 */ 0x0E, 0x00, 0x00, 0xC3, 0x0E, 0x00, 0x00, 0xC3, 0x0E, 0x00, 0x00, 0xDA, 0x0E, 0x00, 0x00, 0xDA, -/* 00003510 */ 0x0E, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0x5B, 0x0F, 0x00, 0x00, 0x5B, -/* 00003520 */ 0x0F, 0x00, 0x00, 0x7F, 0x0F, 0x00, 0x00, 0x7F, 0x0F, 0x00, 0x00, 0x90, 0x0F, 0x00, 0x00, 0x90, -/* 00003530 */ 0x0F, 0x00, 0x00, 0xB6, 0x0F, 0x00, 0x00, 0xB6, 0x0F, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0xC0, -/* 00003540 */ 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, 0xE1, 0x0F, 0x00, 0x00, 0xE1, -/* 00003550 */ 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00, 0xE9, 0x0F, 0x00, 0x00, 0xE9, -/* 00003560 */ 0x0F, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x5E, 0x10, 0x00, 0x00, 0x5E, -/* 00003570 */ 0x10, 0x00, 0x00, 0x7D, 0x10, 0x00, 0x00, 0x7D, 0x10, 0x00, 0x00, 0xCB, 0x10, 0x00, 0x00, 0xCB, -/* 00003580 */ 0x10, 0x00, 0x00, 0xFC, 0x10, 0x00, 0x00, 0xFC, 0x10, 0x00, 0x00, 0x06, 0x11, 0x00, 0x00, 0x06, -/* 00003590 */ 0x11, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x28, 0x11, 0x00, 0x00, 0x28, -/* 000035A0 */ 0x11, 0x00, 0x00, 0x29, 0x11, 0x00, 0x00, 0x29, 0x11, 0x00, 0x00, 0x6F, 0x11, 0x00, 0x00, 0x6F, -/* 000035B0 */ 0x11, 0x00, 0x00, 0xBE, 0x11, 0x00, 0x00, 0xBE, 0x11, 0x00, 0x00, 0xDD, 0x11, 0x00, 0x00, 0xDD, -/* 000035C0 */ 0x11, 0x00, 0x00, 0x2B, 0x12, 0x00, 0x00, 0x2B, 0x12, 0x00, 0x00, 0x5E, 0x12, 0x00, 0x00, 0x5E, -/* 000035D0 */ 0x12, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x00, 0xCE, 0x12, 0x00, 0x00, 0xCE, -/* 000035E0 */ 0x12, 0x00, 0x00, 0xFA, 0x12, 0x00, 0x00, 0xFA, 0x12, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, -/* 000035F0 */ 0x13, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x2D, 0x13, 0x00, 0x00, 0x2D, -/* 00003600 */ 0x13, 0x00, 0x00, 0x34, 0x13, 0x00, 0x00, 0x34, 0x13, 0x00, 0x00, 0x35, 0x13, 0x00, 0x00, 0x35, -/* 00003610 */ 0x13, 0x00, 0x00, 0x6C, 0x13, 0x00, 0x00, 0x6C, 0x13, 0x00, 0x00, 0xAC, 0x13, 0x00, 0x00, 0xAC, -/* 00003620 */ 0x13, 0x00, 0x00, 0xCB, 0x13, 0x00, 0x00, 0xCB, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0xEB, -/* 00003630 */ 0x13, 0x00, 0x00, 0x13, 0x14, 0x00, 0x00, 0x13, 0x14, 0x00, 0x00, 0x21, 0x14, 0x00, 0x00, 0x21, -/* 00003640 */ 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x87, 0x14, 0x00, 0x00, 0x87, -/* 00003650 */ 0x14, 0x00, 0x00, 0x98, 0x14, 0x00, 0x00, 0x98, 0x14, 0x00, 0x00, 0xB3, 0x14, 0x00, 0x00, 0xB3, -/* 00003660 */ 0x14, 0x00, 0x00, 0xBD, 0x14, 0x00, 0x00, 0xBD, 0x14, 0x00, 0x00, 0xC4, 0x14, 0x00, 0x00, 0xC4, -/* 00003670 */ 0x14, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, -/* 00003680 */ 0x14, 0x00, 0x00, 0x18, 0x15, 0x00, 0x00, 0x18, 0x15, 0x00, 0x00, 0x3B, 0x15, 0x00, 0x00, 0x3B, -/* 00003690 */ 0x15, 0x00, 0x00, 0x5D, 0x15, 0x00, 0x00, 0x5D, 0x15, 0x00, 0x00, 0x81, 0x15, 0x00, 0x00, 0x81, -/* 000036A0 */ 0x15, 0x00, 0x00, 0x8F, 0x15, 0x00, 0x00, 0x8F, 0x15, 0x00, 0x00, 0xA6, 0x15, 0x00, 0x00, 0xA6, -/* 000036B0 */ 0x15, 0x00, 0x00, 0xB0, 0x15, 0x00, 0x00, 0xB0, 0x15, 0x00, 0x00, 0xB7, 0x15, 0x00, 0x00, 0xB7, -/* 000036C0 */ 0x15, 0x00, 0x00, 0xB8, 0x15, 0x00, 0x00, 0xB8, 0x15, 0x00, 0x00, 0x1D, 0x16, 0x00, 0x00, 0x1D, -/* 000036D0 */ 0x16, 0x00, 0x00, 0x49, 0x16, 0x00, 0x00, 0x49, 0x16, 0x00, 0x00, 0x8F, 0x16, 0x00, 0x00, 0x8F, -/* 000036E0 */ 0x16, 0x00, 0x00, 0xA5, 0x16, 0x00, 0x00, 0xA5, 0x16, 0x00, 0x00, 0xAF, 0x16, 0x00, 0x00, 0xAF, -/* 000036F0 */ 0x16, 0x00, 0x00, 0xB6, 0x16, 0x00, 0x00, 0xB6, 0x16, 0x00, 0x00, 0xB7, 0x16, 0x00, 0x00, 0xB7, -/* 00003700 */ 0x16, 0x00, 0x00, 0xE8, 0x16, 0x00, 0x00, 0xE8, 0x16, 0x00, 0x00, 0x1F, 0x17, 0x00, 0x00, 0x1F, -/* 00003710 */ 0x17, 0x00, 0x00, 0x26, 0x17, 0x00, 0x00, 0x26, 0x17, 0x00, 0x00, 0x27, 0x17, 0x00, 0x00, 0x27, -/* 00003720 */ 0x17, 0x00, 0x00, 0x69, 0x17, 0x00, 0x00, 0x69, 0x17, 0x00, 0x00, 0xAF, 0x17, 0x00, 0x00, 0xAF, -/* 00003730 */ 0x17, 0x00, 0x00, 0xDB, 0x17, 0x00, 0x00, 0xDB, 0x17, 0x00, 0x00, 0x1F, 0x18, 0x00, 0x00, 0x1F, -/* 00003740 */ 0x18, 0x00, 0x00, 0x4A, 0x18, 0x00, 0x00, 0x4A, 0x18, 0x00, 0x00, 0x73, 0x18, 0x00, 0x00, 0x73, -/* 00003750 */ 0x18, 0x00, 0x00, 0x9F, 0x18, 0x00, 0x00, 0x9F, 0x18, 0x00, 0x00, 0xB1, 0x18, 0x00, 0x00, 0xB1, -/* 00003760 */ 0x18, 0x00, 0x00, 0x03, 0x19, 0x00, 0x00, 0x03, 0x19, 0x00, 0x00, 0x78, 0x19, 0x00, 0x00, 0x78, -/* 00003770 */ 0x19, 0x00, 0x00, 0x86, 0x19, 0x00, 0x00, 0x86, 0x19, 0x00, 0x00, 0xD1, 0x19, 0x00, 0x00, 0xD1, -/* 00003780 */ 0x19, 0x00, 0x00, 0x13, 0x1A, 0x00, 0x00, 0x13, 0x1A, 0x00, 0x00, 0x83, 0x1A, 0x00, 0x00, 0x83, -/* 00003790 */ 0x1A, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0xDE, 0x1A, 0x00, 0x00, 0xDE, -/* 000037A0 */ 0x1A, 0x00, 0x00, 0xE8, 0x1A, 0x00, 0x00, 0xE8, 0x1A, 0x00, 0x00, 0xE9, 0x1A, 0x00, 0x00, 0xE9, -/* 000037B0 */ 0x1A, 0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x34, 0x1B, 0x00, 0x00, 0x34, -/* 000037C0 */ 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0x89, 0x1B, 0x00, 0x00, 0x89, -/* 000037D0 */ 0x1B, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0xBD, 0x1B, 0x00, 0x00, 0xBD, -/* 000037E0 */ 0x1B, 0x00, 0x00, 0xC7, 0x1B, 0x00, 0x00, 0xC7, 0x1B, 0x00, 0x00, 0xCD, 0x1B, 0x00, 0x00, 0xCD, -/* 000037F0 */ 0x1B, 0x00, 0x00, 0xCE, 0x1B, 0x00, 0x00, 0xCE, 0x1B, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, -/* 00003800 */ 0x1C, 0x00, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x8D, 0x1C, 0x00, 0x00, 0x8D, -/* 00003810 */ 0x1C, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0x09, 0x1D, 0x00, 0x00, 0x09, -/* 00003820 */ 0x1D, 0x00, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x5E, 0x1D, 0x00, 0x00, 0x5E, -/* 00003830 */ 0x1D, 0x00, 0x00, 0x70, 0x1D, 0x00, 0x00, 0x70, 0x1D, 0x00, 0x00, 0xD0, 0x1D, 0x00, 0x00, 0xD0, -/* 00003840 */ 0x1D, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x00, 0x4B, 0x1E, 0x00, 0x00, 0x4B, -/* 00003850 */ 0x1E, 0x00, 0x00, 0x84, 0x1E, 0x00, 0x00, 0x84, 0x1E, 0x00, 0x00, 0xBE, 0x1E, 0x00, 0x00, 0xBE, -/* 00003860 */ 0x1E, 0x00, 0x00, 0xCC, 0x1E, 0x00, 0x00, 0xCC, 0x1E, 0x00, 0x00, 0x17, 0x1F, 0x00, 0x00, 0x17, -/* 00003870 */ 0x1F, 0x00, 0x00, 0x59, 0x1F, 0x00, 0x00, 0x59, 0x1F, 0x00, 0x00, 0xD6, 0x1F, 0x00, 0x00, 0xD6, -/* 00003880 */ 0x1F, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x31, 0x20, 0x00, 0x00, 0x31, -/* 00003890 */ 0x20, 0x00, 0x00, 0x3B, 0x20, 0x00, 0x00, 0x3B, 0x20, 0x00, 0x00, 0x5A, 0x20, 0x00, 0x00, 0x5A, -/* 000038A0 */ 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x61, -/* 000038B0 */ 0x20, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0xB3, 0x20, 0x00, 0x00, 0xB3, -/* 000038C0 */ 0x20, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0xE1, 0x20, 0x00, 0x00, 0xE1, -/* 000038D0 */ 0x20, 0x00, 0x00, 0xE2, 0x20, 0x00, 0x00, 0xE2, 0x20, 0x00, 0x00, 0x2D, 0x21, 0x00, 0x00, 0x2D, -/* 000038E0 */ 0x21, 0x00, 0x00, 0x43, 0x21, 0x00, 0x00, 0x43, 0x21, 0x00, 0x00, 0x61, 0x21, 0x00, 0x00, 0x61, -/* 000038F0 */ 0x21, 0x00, 0x00, 0x6B, 0x21, 0x00, 0x00, 0x6B, 0x21, 0x00, 0x00, 0x6C, 0x21, 0x00, 0x00, 0x6C, -/* 00003900 */ 0x21, 0x00, 0x00, 0xE1, 0x21, 0x00, 0x00, 0xE1, 0x21, 0x00, 0x00, 0x31, 0x22, 0x00, 0x00, 0x31, -/* 00003910 */ 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x00, 0x77, 0x22, 0x00, 0x00, 0x77, -/* 00003920 */ 0x22, 0x00, 0x00, 0xEA, 0x22, 0x00, 0x00, 0xEA, 0x22, 0x00, 0x00, 0x03, 0x23, 0x00, 0x00, 0x03, -/* 00003930 */ 0x23, 0x00, 0x00, 0x27, 0x23, 0x00, 0x00, 0x27, 0x23, 0x00, 0x00, 0x4B, 0x23, 0x00, 0x00, 0x4B, -/* 00003940 */ 0x23, 0x00, 0x00, 0xA3, 0x23, 0x00, 0x00, 0xA3, 0x23, 0x00, 0x00, 0xE6, 0x23, 0x00, 0x00, 0xE6, -/* 00003950 */ 0x23, 0x00, 0x00, 0x6F, 0x24, 0x00, 0x00, 0x6F, 0x24, 0x00, 0x00, 0x70, 0x24, 0x00, 0x00, 0x70, -/* 00003960 */ 0x24, 0x00, 0x00, 0x8B, 0x24, 0x00, 0x00, 0x8B, 0x24, 0x00, 0x00, 0x91, 0x24, 0x00, 0x00, 0x91, -/* 00003970 */ 0x24, 0x00, 0x00, 0x92, 0x24, 0x00, 0x00, 0x92, 0x24, 0x00, 0x00, 0xEC, 0x24, 0x00, 0x00, 0xEC, -/* 00003980 */ 0x24, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x42, 0x25, 0x00, 0x00, 0x42, -/* 00003990 */ 0x25, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x00, 0xD2, 0x25, 0x00, 0x00, 0xD2, -/* 000039A0 */ 0x25, 0x00, 0x00, 0xDC, 0x25, 0x00, 0x00, 0xDC, 0x25, 0x00, 0x00, 0xDD, 0x25, 0x00, 0x00, 0xDD, -/* 000039B0 */ 0x25, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0x44, 0x26, 0x00, 0x00, 0x44, -/* 000039C0 */ 0x26, 0x00, 0x00, 0xA0, 0x26, 0x00, 0x00, 0xA0, 0x26, 0x00, 0x00, 0xB0, 0x26, 0x00, 0x00, 0xB0, -/* 000039D0 */ 0x26, 0x00, 0x00, 0xBA, 0x26, 0x00, 0x00, 0xBA, 0x26, 0x00, 0x00, 0xBB, 0x26, 0x00, 0x00, 0xBB, -/* 000039E0 */ 0x26, 0x00, 0x00, 0x4A, 0x27, 0x00, 0x00, 0x4A, 0x27, 0x00, 0x00, 0xD0, 0x27, 0x00, 0x00, 0xD0, -/* 000039F0 */ 0x27, 0x00, 0x00, 0x4B, 0x28, 0x00, 0x00, 0x4B, 0x28, 0x00, 0x00, 0x94, 0x28, 0x00, 0x00, 0x94, -/* 00003A00 */ 0x28, 0x00, 0x00, 0xCA, 0x28, 0x00, 0x00, 0xCA, 0x28, 0x00, 0x00, 0xCB, 0x28, 0x00, 0x00, 0xCB, -/* 00003A10 */ 0x28, 0x00, 0x00, 0x17, 0x29, 0x00, 0x00, 0x17, 0x29, 0x00, 0x00, 0x36, 0x29, 0x00, 0x00, 0x36, -/* 00003A20 */ 0x29, 0x00, 0x00, 0x87, 0x29, 0x00, 0x00, 0x87, 0x29, 0x00, 0x00, 0x01, 0x2A, 0x00, 0x00, 0x01, -/* 00003A30 */ 0x2A, 0x00, 0x00, 0x25, 0x2A, 0x00, 0x00, 0x25, 0x2A, 0x00, 0x00, 0x80, 0x2A, 0x00, 0x00, 0x80, -/* 00003A40 */ 0x2A, 0x00, 0x00, 0xCB, 0x2A, 0x00, 0x00, 0xCB, 0x2A, 0x00, 0x00, 0xDD, 0x2A, 0x00, 0x00, 0xDD, -/* 00003A50 */ 0x2A, 0x00, 0x00, 0xEE, 0x2A, 0x00, 0x00, 0xEE, 0x2A, 0x00, 0x00, 0x0E, 0x2B, 0x00, 0x00, 0x0E, -/* 00003A60 */ 0x2B, 0x00, 0x00, 0x18, 0x2B, 0x00, 0x00, 0x18, 0x2B, 0x00, 0x00, 0x19, 0x2B, 0x00, 0x00, 0x19, -/* 00003A70 */ 0x2B, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0xB6, 0x2B, 0x00, 0x00, 0xB6, -/* 00003A80 */ 0x2B, 0x00, 0x00, 0xEB, 0x2B, 0x00, 0x00, 0xEB, 0x2B, 0x00, 0x00, 0x14, 0x2C, 0x00, 0x00, 0x14, -/* 00003A90 */ 0x2C, 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x00, 0x66, 0x2C, 0x00, 0x00, 0x66, -/* 00003AA0 */ 0x2C, 0x00, 0x00, 0x90, 0x2C, 0x00, 0x00, 0x90, 0x2C, 0x00, 0x00, 0xB5, 0x2C, 0x00, 0x00, 0xB5, -/* 00003AB0 */ 0x2C, 0x00, 0x00, 0xCE, 0x2C, 0x00, 0x00, 0xCE, 0x2C, 0x00, 0x00, 0xF5, 0x2C, 0x00, 0x00, 0xF5, -/* 00003AC0 */ 0x2C, 0x00, 0x00, 0x07, 0x2D, 0x00, 0x00, 0x07, 0x2D, 0x00, 0x00, 0x15, 0x2D, 0x00, 0x00, 0x15, -/* 00003AD0 */ 0x2D, 0x00, 0x00, 0x16, 0x2D, 0x00, 0x00, 0x16, 0x2D, 0x00, 0x00, 0x61, 0x2D, 0x00, 0x00, 0x61, -/* 00003AE0 */ 0x2D, 0x00, 0x00, 0x72, 0x2D, 0x00, 0x00, 0x72, 0x2D, 0x00, 0x00, 0x94, 0x2D, 0x00, 0x00, 0x94, -/* 00003AF0 */ 0x2D, 0x00, 0x00, 0x9E, 0x2D, 0x00, 0x00, 0x9E, 0x2D, 0x00, 0x00, 0x9F, 0x2D, 0x00, 0x00, 0x9F, -/* 00003B00 */ 0x2D, 0x00, 0x00, 0xBD, 0x2D, 0x00, 0x00, 0xBD, 0x2D, 0x00, 0x00, 0xDB, 0x2D, 0x00, 0x00, 0xDB, -/* 00003B10 */ 0x2D, 0x00, 0x00, 0xF9, 0x2D, 0x00, 0x00, 0xF9, 0x2D, 0x00, 0x00, 0x2A, 0x2E, 0x00, 0x00, 0x2A, -/* 00003B20 */ 0x2E, 0x00, 0x00, 0x3C, 0x2E, 0x00, 0x00, 0x3C, 0x2E, 0x00, 0x00, 0x42, 0x2E, 0x00, 0x00, 0x42, -/* 00003B30 */ 0x2E, 0x00, 0x00, 0x43, 0x2E, 0x00, 0x00, 0x43, 0x2E, 0x00, 0x00, 0xA3, 0x2E, 0x00, 0x00, 0xA3, -/* 00003B40 */ 0x2E, 0x00, 0x00, 0xFB, 0x2E, 0x00, 0x00, 0xFB, 0x2E, 0x00, 0x00, 0x2E, 0x2F, 0x00, 0x00, 0x2E, -/* 00003B50 */ 0x2F, 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x00, 0x60, 0x2F, 0x00, 0x00, 0x60, -/* 00003B60 */ 0x2F, 0x00, 0x00, 0x61, 0x2F, 0x00, 0x00, 0x61, 0x2F, 0x00, 0x00, 0x95, 0x2F, 0x00, 0x00, 0x95, -/* 00003B70 */ 0x2F, 0x00, 0x00, 0xC0, 0x2F, 0x00, 0x00, 0xC0, 0x2F, 0x00, 0x00, 0x29, 0x30, 0x00, 0x00, 0x29, -/* 00003B80 */ 0x30, 0x00, 0x00, 0x5A, 0x30, 0x00, 0x00, 0x5A, 0x30, 0x00, 0x00, 0x7B, 0x30, 0x00, 0x00, 0x7B, -/* 00003B90 */ 0x30, 0x00, 0x00, 0x89, 0x30, 0x00, 0x00, 0x89, 0x30, 0x00, 0x00, 0x93, 0x30, 0x00, 0x00, 0x93, -/* 00003BA0 */ 0x30, 0x00, 0x00, 0xE8, 0x30, 0x00, 0x00, 0xE8, 0x30, 0x00, 0x00, 0xEE, 0x30, 0x00, 0x00, 0xEE, -/* 00003BB0 */ 0x30, 0x00, 0x00, 0xEF, 0x30, 0x00, 0x00, 0xEF, 0x30, 0x00, 0x00, 0x32, 0x31, 0x00, 0x00, 0x32, -/* 00003BC0 */ 0x31, 0x00, 0x00, 0x5F, 0x31, 0x00, 0x00, 0x5F, 0x31, 0x00, 0x00, 0x8D, 0x31, 0x00, 0x00, 0x8D, -/* 00003BD0 */ 0x31, 0x00, 0x00, 0xB4, 0x31, 0x00, 0x00, 0xB4, 0x31, 0x00, 0x00, 0xE0, 0x31, 0x00, 0x00, 0xE0, -/* 00003BE0 */ 0x31, 0x00, 0x00, 0xEA, 0x31, 0x00, 0x00, 0xEA, 0x31, 0x00, 0x00, 0xEB, 0x31, 0x00, 0x00, 0xEB, -/* 00003BF0 */ 0x31, 0x00, 0x00, 0x0D, 0x32, 0x00, 0x00, 0x0D, 0x32, 0x00, 0x00, 0x32, 0x32, 0x00, 0x00, 0x32, -/* 00003C00 */ 0x32, 0x00, 0x00, 0x5A, 0x32, 0x00, 0x00, 0x5A, 0x32, 0x00, 0x00, 0x68, 0x32, 0x00, 0x00, 0x68, -/* 00003C10 */ 0x32, 0x00, 0x00, 0x69, 0x32, 0x00, 0x00, 0x69, 0x32, 0x00, 0x00, 0x95, 0x32, 0x00, 0x00, 0x95, -/* 00003C20 */ 0x32, 0x00, 0x00, 0xE2, 0x32, 0x00, 0x00, 0xE2, 0x32, 0x00, 0x00, 0xFB, 0x32, 0x00, 0x00, 0xFB, -/* 00003C30 */ 0x32, 0x00, 0x00, 0x39, 0x33, 0x00, 0x00, 0x39, 0x33, 0x00, 0x00, 0x6D, 0x33, 0x00, 0x00, 0x6D, -/* 00003C40 */ 0x33, 0x00, 0x00, 0x82, 0x33, 0x00, 0x00, 0x82, 0x33, 0x00, 0x00, 0xB1, 0x33, 0x00, 0x00, 0xB1, -/* 00003C50 */ 0x33, 0x00, 0x00, 0xBF, 0x33, 0x00, 0x00, 0xBF, 0x33, 0x00, 0x00, 0xD0, 0x33, 0x00, 0x00, 0xD0, -/* 00003C60 */ 0x33, 0x00, 0x00, 0x21, 0x34, 0x00, 0x00, 0x21, 0x34, 0x00, 0x00, 0x51, 0x34, 0x00, 0x00, 0x51, -/* 00003C70 */ 0x34, 0x00, 0x00, 0xB7, 0x34, 0x00, 0x00, 0xB7, 0x34, 0x00, 0x00, 0xC1, 0x34, 0x00, 0x00, 0xC1, -/* 00003C80 */ 0x34, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0xEA, 0x34, 0x00, 0x00, 0xEA, -/* 00003C90 */ 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF2, 0x34, 0x00, 0x00, 0xF2, -/* 00003CA0 */ 0x34, 0x00, 0x00, 0x14, 0x35, 0x00, 0x00, 0x14, 0x35, 0x00, 0x00, 0x32, 0x35, 0x00, 0x00, 0x32, -/* 00003CB0 */ 0x35, 0x00, 0x00, 0x57, 0x35, 0x00, 0x00, 0x57, 0x35, 0x00, 0x00, 0x79, 0x35, 0x00, 0x00, 0x79, -/* 00003CC0 */ 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xBB, 0x35, 0x00, 0x00, 0xBB, -/* 00003CD0 */ 0x35, 0x00, 0x00, 0xFB, 0x35, 0x00, 0x00, 0xFB, 0x35, 0x00, 0x00, 0x0A, 0x36, 0x00, 0x00, 0x0A, -/* 00003CE0 */ 0x36, 0x00, 0x00, 0x0B, 0x36, 0x00, 0x00, 0x0B, 0x36, 0x00, 0x00, 0x30, 0x36, 0x00, 0x00, 0x30, -/* 00003CF0 */ 0x36, 0x00, 0x00, 0x70, 0x36, 0x00, 0x00, 0x70, 0x36, 0x00, 0x00, 0x7F, 0x36, 0x00, 0x00, 0x7F, -/* 00003D00 */ 0x36, 0x00, 0x00, 0x80, 0x36, 0x00, 0x00, 0x80, 0x36, 0x00, 0x00, 0xA5, 0x36, 0x00, 0x00, 0xA5, -/* 00003D10 */ 0x36, 0x00, 0x00, 0xDF, 0x36, 0x00, 0x00, 0xDF, 0x36, 0x00, 0x00, 0xEE, 0x36, 0x00, 0x00, 0xEE, -/* 00003D20 */ 0x36, 0x00, 0x00, 0xEF, 0x36, 0x00, 0x00, 0xEF, 0x36, 0x00, 0x00, 0x1C, 0x37, 0x00, 0x00, 0x1C, -/* 00003D30 */ 0x37, 0x00, 0x00, 0x5D, 0x37, 0x00, 0x00, 0x5D, 0x37, 0x00, 0x00, 0x6C, 0x37, 0x00, 0x00, 0x6C, -/* 00003D40 */ 0x37, 0x00, 0x00, 0x6D, 0x37, 0x00, 0x00, 0x6D, 0x37, 0x00, 0x00, 0x92, 0x37, 0x00, 0x00, 0x92, -/* 00003D50 */ 0x37, 0x00, 0x00, 0xB7, 0x37, 0x00, 0x00, 0xB7, 0x37, 0x00, 0x00, 0xD4, 0x37, 0x00, 0x00, 0xD4, -/* 00003D60 */ 0x37, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x43, 0x38, 0x00, 0x00, 0x43, -/* 00003D70 */ 0x38, 0x00, 0x00, 0x55, 0x38, 0x00, 0x00, 0x55, 0x38, 0x00, 0x00, 0x71, 0x38, 0x00, 0x00, 0x71, -/* 00003D80 */ 0x38, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x81, 0x38, 0x00, 0x00, 0x81, -/* 00003D90 */ 0x38, 0x00, 0x00, 0xAC, 0x38, 0x00, 0x00, 0xAC, 0x38, 0x00, 0x00, 0xD8, 0x38, 0x00, 0x00, 0xD8, -/* 00003DA0 */ 0x38, 0x00, 0x00, 0xF4, 0x38, 0x00, 0x00, 0xF4, 0x38, 0x00, 0x00, 0x44, 0x39, 0x00, 0x00, 0x44, -/* 00003DB0 */ 0x39, 0x00, 0x00, 0x69, 0x39, 0x00, 0x00, 0x69, 0x39, 0x00, 0x00, 0x7F, 0x39, 0x00, 0x00, 0x7F, -/* 00003DC0 */ 0x39, 0x00, 0x00, 0xB0, 0x39, 0x00, 0x00, 0xB0, 0x39, 0x00, 0x00, 0xC2, 0x39, 0x00, 0x00, 0xC2, -/* 00003DD0 */ 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0xE1, 0x39, 0x00, 0x00, 0xE1, -/* 00003DE0 */ 0x39, 0x00, 0x00, 0xEB, 0x39, 0x00, 0x00, 0xEB, 0x39, 0x00, 0x00, 0xEC, 0x39, 0x00, 0x00, 0xEC, -/* 00003DF0 */ 0x39, 0x00, 0x00, 0x13, 0x3A, 0x00, 0x00, 0x13, 0x3A, 0x00, 0x00, 0x57, 0x3A, 0x00, 0x00, 0x57, -/* 00003E00 */ 0x3A, 0x00, 0x00, 0x7E, 0x3A, 0x00, 0x00, 0x7E, 0x3A, 0x00, 0x00, 0x7F, 0x3A, 0x00, 0x00, 0x7F, -/* 00003E10 */ 0x3A, 0x00, 0x00, 0xA2, 0x3A, 0x00, 0x00, 0xA2, 0x3A, 0x00, 0x00, 0xC7, 0x3A, 0x00, 0x00, 0xC7, -/* 00003E20 */ 0x3A, 0x00, 0x00, 0x01, 0x3B, 0x00, 0x00, 0x01, 0x3B, 0x00, 0x00, 0x0F, 0x3B, 0x00, 0x00, 0x0F, -/* 00003E30 */ 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x34, 0x3B, 0x00, 0x00, 0x34, -/* 00003E40 */ 0x3B, 0x00, 0x00, 0x66, 0x3B, 0x00, 0x00, 0x66, 0x3B, 0x00, 0x00, 0x74, 0x3B, 0x00, 0x00, 0x74, -/* 00003E50 */ 0x3B, 0x00, 0x00, 0x75, 0x3B, 0x00, 0x00, 0x75, 0x3B, 0x00, 0x00, 0x99, 0x3B, 0x00, 0x00, 0x99, -/* 00003E60 */ 0x3B, 0x00, 0x00, 0xCB, 0x3B, 0x00, 0x00, 0xCB, 0x3B, 0x00, 0x00, 0xD9, 0x3B, 0x00, 0x00, 0xD9, -/* 00003E70 */ 0x3B, 0x00, 0x00, 0xDA, 0x3B, 0x00, 0x00, 0xDA, 0x3B, 0x00, 0x00, 0x41, 0x3C, 0x00, 0x00, 0x41, -/* 00003E80 */ 0x3C, 0x00, 0x00, 0xDC, 0x3C, 0x00, 0x00, 0xDC, 0x3C, 0x00, 0x00, 0xEA, 0x3C, 0x00, 0x00, 0xEA, -/* 00003E90 */ 0x3C, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0x00, 0x05, 0x3D, 0x00, 0x00, 0x05, -/* 00003EA0 */ 0x3D, 0x00, 0x00, 0x0F, 0x3D, 0x00, 0x00, 0x0F, 0x3D, 0x00, 0x00, 0x10, 0x3D, 0x00, 0x00, 0x10, -/* 00003EB0 */ 0x3D, 0x00, 0x00, 0x29, 0x3D, 0x00, 0x00, 0x29, 0x3D, 0x00, 0x00, 0x2F, 0x3D, 0x00, 0x00, 0x2F, -/* 00003EC0 */ 0x3D, 0x00, 0x00, 0x30, 0x3D, 0x00, 0x00, 0x30, 0x3D, 0x00, 0x00, 0x7E, 0x3D, 0x00, 0x00, 0x7E, -/* 00003ED0 */ 0x3D, 0x00, 0x00, 0xAA, 0x3D, 0x00, 0x00, 0xAA, 0x3D, 0x00, 0x00, 0xAB, 0x3D, 0x00, 0x00, 0xAB, -/* 00003EE0 */ 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0x1A, 0x3E, 0x00, 0x00, 0x1A, -/* 00003EF0 */ 0x3E, 0x00, 0x00, 0x1B, 0x3E, 0x00, 0x00, 0x1B, 0x3E, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0x7C, -/* 00003F00 */ 0x3E, 0x00, 0x00, 0xFE, 0x3E, 0x00, 0x00, 0xFE, 0x3E, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x00, 0x0C, -/* 00003F10 */ 0x3F, 0x00, 0x00, 0x0D, 0x3F, 0x00, 0x00, 0x0D, 0x3F, 0x00, 0x00, 0x3C, 0x3F, 0x00, 0x00, 0x3C, -/* 00003F20 */ 0x3F, 0x00, 0x00, 0x4D, 0x3F, 0x00, 0x00, 0x4D, 0x3F, 0x00, 0x00, 0x6A, 0x3F, 0x00, 0x00, 0x6A, -/* 00003F30 */ 0x3F, 0x00, 0x00, 0x74, 0x3F, 0x00, 0x00, 0x74, 0x3F, 0x00, 0x00, 0x7A, 0x3F, 0x00, 0x00, 0x7A, -/* 00003F40 */ 0x3F, 0x00, 0x00, 0x7B, 0x3F, 0x00, 0x00, 0x7B, 0x3F, 0x00, 0x00, 0x95, 0x3F, 0x00, 0x00, 0x95, -/* 00003F50 */ 0x3F, 0x00, 0x00, 0xBF, 0x3F, 0x00, 0x00, 0xBF, 0x3F, 0x00, 0x00, 0xE9, 0x3F, 0x00, 0x00, 0xE9, -/* 00003F60 */ 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xF0, -/* 00003F70 */ 0x3F, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x74, 0x40, 0x00, 0x00, 0x74, -/* 00003F80 */ 0x40, 0x00, 0x00, 0xD2, 0x40, 0x00, 0x00, 0xD2, 0x40, 0x00, 0x00, 0xF8, 0x40, 0x00, 0x00, 0xF8, -/* 00003F90 */ 0x40, 0x00, 0x00, 0x3D, 0x41, 0x00, 0x00, 0x3D, 0x41, 0x00, 0x00, 0xA1, 0x41, 0x00, 0x00, 0xA1, -/* 00003FA0 */ 0x41, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x22, 0x42, 0x00, 0x00, 0x22, -/* 00003FB0 */ 0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0xC5, 0x42, 0x00, 0x00, 0xC5, -/* 00003FC0 */ 0x42, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x66, 0x43, 0x00, 0x00, 0x66, -/* 00003FD0 */ 0x43, 0x00, 0x00, 0xBA, 0x43, 0x00, 0x00, 0xBA, 0x43, 0x00, 0x00, 0xF2, 0x43, 0x00, 0x00, 0xF2, -/* 00003FE0 */ 0x43, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x96, 0x44, 0x00, 0x00, 0x96, -/* 00003FF0 */ 0x44, 0x00, 0x00, 0xEB, 0x44, 0x00, 0x00, 0xEB, 0x44, 0x00, 0x00, 0x57, 0x45, 0x00, 0x00, 0x57, -/* 00004000 */ 0x45, 0x00, 0x00, 0xAD, 0x45, 0x00, 0x00, 0xAD, 0x45, 0x00, 0x00, 0xAE, 0x45, 0x00, 0x00, 0xAE, -/* 00004010 */ 0x45, 0x00, 0x00, 0xCD, 0x45, 0x00, 0x00, 0xCD, 0x45, 0x00, 0x00, 0xEC, 0x45, 0x00, 0x00, 0xEC, -/* 00004020 */ 0x45, 0x00, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x1F, 0x46, 0x00, 0x00, 0x1F, -/* 00004030 */ 0x46, 0x00, 0x00, 0x96, 0x46, 0x00, 0x00, 0x96, 0x46, 0x00, 0x00, 0x03, 0x47, 0x00, 0x00, 0x03, -/* 00004040 */ 0x47, 0x00, 0x00, 0x56, 0x47, 0x00, 0x00, 0x56, 0x47, 0x00, 0x00, 0x99, 0x47, 0x00, 0x00, 0x99, -/* 00004050 */ 0x47, 0x00, 0x00, 0x9A, 0x47, 0x00, 0x00, 0x9A, 0x47, 0x00, 0x00, 0x17, 0x48, 0x00, 0x00, 0x17, -/* 00004060 */ 0x48, 0x00, 0x00, 0xAB, 0x48, 0x00, 0x00, 0xAB, 0x48, 0x00, 0x00, 0x2E, 0x49, 0x00, 0x00, 0x2E, -/* 00004070 */ 0x49, 0x00, 0x00, 0xB1, 0x49, 0x00, 0x00, 0xB1, 0x49, 0x00, 0x00, 0x24, 0x4A, 0x00, 0x00, 0x24, -/* 00004080 */ 0x4A, 0x00, 0x00, 0x25, 0x4A, 0x00, 0x00, 0x25, 0x4A, 0x00, 0x00, 0x8F, 0x4A, 0x00, 0x00, 0x8F, -/* 00004090 */ 0x4A, 0x00, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x09, 0x4B, 0x00, 0x00, 0x09, -/* 000040A0 */ 0x4B, 0x00, 0x00, 0x6C, 0x4B, 0x00, 0x00, 0x6C, 0x4B, 0x00, 0x00, 0xFB, 0x4B, 0x00, 0x00, 0xFB, -/* 000040B0 */ 0x4B, 0x00, 0x00, 0xA4, 0x4C, 0x00, 0x00, 0xA4, 0x4C, 0x00, 0x00, 0x38, 0x4D, 0x00, 0x00, 0x38, -/* 000040C0 */ 0x4D, 0x00, 0x00, 0xCF, 0x4D, 0x00, 0x00, 0xCF, 0x4D, 0x00, 0x00, 0x73, 0x4E, 0x00, 0x00, 0x73, -/* 000040D0 */ 0x4E, 0x00, 0x00, 0x87, 0x4E, 0x00, 0x00, 0x87, 0x4E, 0x00, 0x00, 0x88, 0x4E, 0x00, 0x00, 0x88, -/* 000040E0 */ 0x4E, 0x00, 0x00, 0x09, 0x4F, 0x00, 0x00, 0x09, 0x4F, 0x00, 0x00, 0x75, 0x4F, 0x00, 0x00, 0x75, -/* 000040F0 */ 0x4F, 0x00, 0x00, 0xE5, 0x4F, 0x00, 0x00, 0xE5, 0x4F, 0x00, 0x00, 0x55, 0x50, 0x00, 0x00, 0x55, -/* 00004100 */ 0x50, 0x00, 0x00, 0xC7, 0x50, 0x00, 0x00, 0xC7, 0x50, 0x00, 0x00, 0x3B, 0x51, 0x00, 0x00, 0x3B, -/* 00004110 */ 0x51, 0x00, 0x00, 0xAF, 0x51, 0x00, 0x00, 0xAF, 0x51, 0x00, 0x00, 0xF9, 0x51, 0x00, 0x00, 0xF9, -/* 00004120 */ 0x51, 0x00, 0x00, 0xFA, 0x51, 0x00, 0x00, 0xFA, 0x51, 0x00, 0x00, 0x67, 0x52, 0x00, 0x00, 0x67, -/* 00004130 */ 0x52, 0x00, 0x00, 0x68, 0x52, 0x00, 0x00, 0x68, 0x52, 0x00, 0x00, 0xCE, 0x52, 0x00, 0x00, 0xCE, -/* 00004140 */ 0x52, 0x00, 0x00, 0x59, 0x53, 0x00, 0x00, 0x59, 0x53, 0x00, 0x00, 0xCF, 0x53, 0x00, 0x00, 0xCF, -/* 00004150 */ 0x53, 0x00, 0x00, 0xD5, 0x53, 0x00, 0x00, 0xD5, 0x53, 0x00, 0x00, 0xD6, 0x53, 0x00, 0x00, 0xD6, -/* 00004160 */ 0x53, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x2C, 0x54, 0x00, 0x00, 0x2C, -/* 00004170 */ 0x54, 0x00, 0x00, 0x2D, 0x54, 0x00, 0x00, 0x2D, 0x54, 0x00, 0x00, 0x4E, 0x54, 0x00, 0x00, 0x4E, -/* 00004180 */ 0x54, 0x00, 0x00, 0x76, 0x54, 0x00, 0x00, 0x76, 0x54, 0x00, 0x00, 0x80, 0x54, 0x00, 0x00, 0x80, -/* 00004190 */ 0x54, 0x00, 0x00, 0x81, 0x54, 0x00, 0x00, 0x81, 0x54, 0x00, 0x00, 0xCD, 0x54, 0x00, 0x00, 0xCD, -/* 000041A0 */ 0x54, 0x00, 0x00, 0xD3, 0x54, 0x00, 0x00, 0xD3, 0x54, 0x00, 0x00, 0xD4, 0x54, 0x00, 0x00, 0xD4, -/* 000041B0 */ 0x54, 0x00, 0x00, 0x4B, 0x55, 0x00, 0x00, 0x4B, 0x55, 0x00, 0x00, 0x7A, 0x55, 0x00, 0x00, 0x7A, -/* 000041C0 */ 0x55, 0x00, 0x00, 0xA8, 0x55, 0x00, 0x00, 0xA8, 0x55, 0x00, 0x00, 0xBF, 0x55, 0x00, 0x00, 0xBF, -/* 000041D0 */ 0x55, 0x00, 0x00, 0xC9, 0x55, 0x00, 0x00, 0xC9, 0x55, 0x00, 0x00, 0xCA, 0x55, 0x00, 0x00, 0xCA, -/* 000041E0 */ 0x55, 0x00, 0x00, 0xF5, 0x55, 0x00, 0x00, 0xF5, 0x55, 0x00, 0x00, 0x16, 0x56, 0x00, 0x00, 0x16, -/* 000041F0 */ 0x56, 0x00, 0x00, 0x20, 0x56, 0x00, 0x00, 0x20, 0x56, 0x00, 0x00, 0x21, 0x56, 0x00, 0x00, 0x21, -/* 00004200 */ 0x56, 0x00, 0x00, 0x4F, 0x56, 0x00, 0x00, 0x4F, 0x56, 0x00, 0x00, 0x89, 0x56, 0x00, 0x00, 0x89, -/* 00004210 */ 0x56, 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0xBF, 0x56, 0x00, 0x00, 0xBF, -/* 00004220 */ 0x56, 0x00, 0x00, 0xD6, 0x56, 0x00, 0x00, 0xD6, 0x56, 0x00, 0x00, 0xD7, 0x56, 0x00, 0x00, 0xD7, -/* 00004230 */ 0x56, 0x00, 0x00, 0x15, 0x57, 0x00, 0x00, 0x15, 0x57, 0x00, 0x00, 0x76, 0x57, 0x00, 0x00, 0x76, -/* 00004240 */ 0x57, 0x00, 0x00, 0xB2, 0x57, 0x00, 0x00, 0xB2, 0x57, 0x00, 0x00, 0xC0, 0x57, 0x00, 0x00, 0xC0, -/* 00004250 */ 0x57, 0x00, 0x00, 0xC1, 0x57, 0x00, 0x00, 0xC1, 0x57, 0x00, 0x00, 0xF2, 0x57, 0x00, 0x00, 0xF2, -/* 00004260 */ 0x57, 0x00, 0x00, 0xF3, 0x57, 0x00, 0x00, 0xF3, 0x57, 0x00, 0x00, 0x24, 0x58, 0x00, 0x00, 0x24, -/* 00004270 */ 0x58, 0x00, 0x00, 0x64, 0x58, 0x00, 0x00, 0x64, 0x58, 0x00, 0x00, 0x72, 0x58, 0x00, 0x00, 0x72, -/* 00004280 */ 0x58, 0x00, 0x00, 0x73, 0x58, 0x00, 0x00, 0x73, 0x58, 0x00, 0x00, 0xA9, 0x58, 0x00, 0x00, 0xA9, -/* 00004290 */ 0x58, 0x00, 0x00, 0xAA, 0x58, 0x00, 0x00, 0xAA, 0x58, 0x00, 0x00, 0x0B, 0x59, 0x00, 0x00, 0x0B, -/* 000042A0 */ 0x59, 0x00, 0x00, 0x4B, 0x59, 0x00, 0x00, 0x4B, 0x59, 0x00, 0x00, 0x59, 0x59, 0x00, 0x00, 0x59, -/* 000042B0 */ 0x59, 0x00, 0x00, 0x65, 0x59, 0x00, 0x00, 0x65, 0x59, 0x00, 0x00, 0x66, 0x59, 0x00, 0x00, 0x66, -/* 000042C0 */ 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x81, 0x59, 0x00, 0x00, 0x81, -/* 000042D0 */ 0x59, 0x00, 0x00, 0x82, 0x59, 0x00, 0x00, 0x82, 0x59, 0x00, 0x00, 0xD1, 0x59, 0x00, 0x00, 0xD1, -/* 000042E0 */ 0x59, 0x00, 0x00, 0xEA, 0x59, 0x00, 0x00, 0xEA, 0x59, 0x00, 0x00, 0x01, 0x5A, 0x00, 0x00, 0x01, -/* 000042F0 */ 0x5A, 0x00, 0x00, 0x56, 0x5A, 0x00, 0x00, 0x56, 0x5A, 0x00, 0x00, 0x68, 0x5A, 0x00, 0x00, 0x68, -/* 00004300 */ 0x5A, 0x00, 0x00, 0xC6, 0x5A, 0x00, 0x00, 0xC6, 0x5A, 0x00, 0x00, 0xED, 0x5A, 0x00, 0x00, 0xED, -/* 00004310 */ 0x5A, 0x00, 0x00, 0x7A, 0x5B, 0x00, 0x00, 0x7A, 0x5B, 0x00, 0x00, 0xA1, 0x5B, 0x00, 0x00, 0xA1, -/* 00004320 */ 0x5B, 0x00, 0x00, 0xB3, 0x5B, 0x00, 0x00, 0xB3, 0x5B, 0x00, 0x00, 0xCE, 0x5B, 0x00, 0x00, 0xCE, -/* 00004330 */ 0x5B, 0x00, 0x00, 0xF5, 0x5B, 0x00, 0x00, 0xF5, 0x5B, 0x00, 0x00, 0x57, 0x5C, 0x00, 0x00, 0x57, -/* 00004340 */ 0x5C, 0x00, 0x00, 0x65, 0x5C, 0x00, 0x00, 0x65, 0x5C, 0x00, 0x00, 0x71, 0x5C, 0x00, 0x00, 0x71, -/* 00004350 */ 0x5C, 0x00, 0x00, 0xD9, 0x5C, 0x00, 0x00, 0xD9, 0x5C, 0x00, 0x00, 0xF0, 0x5C, 0x00, 0x00, 0xF0, -/* 00004360 */ 0x5C, 0x00, 0x00, 0xF6, 0x5C, 0x00, 0x00, 0xF6, 0x5C, 0x00, 0x00, 0xF7, 0x5C, 0x00, 0x00, 0xF7, -/* 00004370 */ 0x5C, 0x00, 0x00, 0x4D, 0x5D, 0x00, 0x00, 0x4D, 0x5D, 0x00, 0x00, 0x80, 0x5D, 0x00, 0x00, 0x80, -/* 00004380 */ 0x5D, 0x00, 0x00, 0xB9, 0x5D, 0x00, 0x00, 0xB9, 0x5D, 0x00, 0x00, 0xC3, 0x5D, 0x00, 0x00, 0xC3, -/* 00004390 */ 0x5D, 0x00, 0x00, 0xC4, 0x5D, 0x00, 0x00, 0xC4, 0x5D, 0x00, 0x00, 0xFC, 0x5D, 0x00, 0x00, 0xFC, -/* 000043A0 */ 0x5D, 0x00, 0x00, 0x37, 0x5E, 0x00, 0x00, 0x37, 0x5E, 0x00, 0x00, 0x70, 0x5E, 0x00, 0x00, 0x70, -/* 000043B0 */ 0x5E, 0x00, 0x00, 0x7A, 0x5E, 0x00, 0x00, 0x7A, 0x5E, 0x00, 0x00, 0x7B, 0x5E, 0x00, 0x00, 0x7B, -/* 000043C0 */ 0x5E, 0x00, 0x00, 0xB0, 0x5E, 0x00, 0x00, 0xB0, 0x5E, 0x00, 0x00, 0xB6, 0x5E, 0x00, 0x00, 0xB6, -/* 000043D0 */ 0x5E, 0x00, 0x00, 0xB7, 0x5E, 0x00, 0x00, 0xB7, 0x5E, 0x00, 0x00, 0x08, 0x5F, 0x00, 0x00, 0x08, -/* 000043E0 */ 0x5F, 0x00, 0x00, 0x3B, 0x5F, 0x00, 0x00, 0x3B, 0x5F, 0x00, 0x00, 0x74, 0x5F, 0x00, 0x00, 0x74, -/* 000043F0 */ 0x5F, 0x00, 0x00, 0x7E, 0x5F, 0x00, 0x00, 0x7E, 0x5F, 0x00, 0x00, 0x7F, 0x5F, 0x00, 0x00, 0x7F, -/* 00004400 */ 0x5F, 0x00, 0x00, 0xB7, 0x5F, 0x00, 0x00, 0xB7, 0x5F, 0x00, 0x00, 0xF2, 0x5F, 0x00, 0x00, 0xF2, -/* 00004410 */ 0x5F, 0x00, 0x00, 0x2B, 0x60, 0x00, 0x00, 0x2B, 0x60, 0x00, 0x00, 0x35, 0x60, 0x00, 0x00, 0x35, -/* 00004420 */ 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x66, -/* 00004430 */ 0x60, 0x00, 0x00, 0x6C, 0x60, 0x00, 0x00, 0x6C, 0x60, 0x00, 0x00, 0x6D, 0x60, 0x00, 0x00, 0x6D, -/* 00004440 */ 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0xD1, 0x60, 0x00, 0x00, 0xD1, -/* 00004450 */ 0x60, 0x00, 0x00, 0xE6, 0x60, 0x00, 0x00, 0xE6, 0x60, 0x00, 0x00, 0x19, 0x61, 0x00, 0x00, 0x19, -/* 00004460 */ 0x61, 0x00, 0x00, 0x1A, 0x61, 0x00, 0x00, 0x1A, 0x61, 0x00, 0x00, 0x48, 0x61, 0x00, 0x00, 0x48, -/* 00004470 */ 0x61, 0x00, 0x00, 0x75, 0x61, 0x00, 0x00, 0x75, 0x61, 0x00, 0x00, 0x76, 0x61, 0x00, 0x00, 0x76, -/* 00004480 */ 0x61, 0x00, 0x00, 0xA8, 0x61, 0x00, 0x00, 0xA8, 0x61, 0x00, 0x00, 0xDE, 0x61, 0x00, 0x00, 0xDE, -/* 00004490 */ 0x61, 0x00, 0x00, 0xDF, 0x61, 0x00, 0x00, 0xDF, 0x61, 0x00, 0x00, 0x25, 0x62, 0x00, 0x00, 0x25, -/* 000044A0 */ 0x62, 0x00, 0x00, 0x9C, 0x62, 0x00, 0x00, 0x9C, 0x62, 0x00, 0x00, 0xAE, 0x62, 0x00, 0x00, 0xAE, -/* 000044B0 */ 0x62, 0x00, 0x00, 0xBC, 0x62, 0x00, 0x00, 0xBC, 0x62, 0x00, 0x00, 0xC6, 0x62, 0x00, 0x00, 0xC6, -/* 000044C0 */ 0x62, 0x00, 0x00, 0xC7, 0x62, 0x00, 0x00, 0xC7, 0x62, 0x00, 0x00, 0x0F, 0x63, 0x00, 0x00, 0x0F, -/* 000044D0 */ 0x63, 0x00, 0x00, 0x91, 0x63, 0x00, 0x00, 0x91, 0x63, 0x00, 0x00, 0xA2, 0x63, 0x00, 0x00, 0xA2, -/* 000044E0 */ 0x63, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x0E, 0x64, 0x00, 0x00, 0x0E, -/* 000044F0 */ 0x64, 0x00, 0x00, 0x15, 0x64, 0x00, 0x00, 0x15, 0x64, 0x00, 0x00, 0x16, 0x64, 0x00, 0x00, 0x16, -/* 00004500 */ 0x64, 0x00, 0x00, 0x52, 0x64, 0x00, 0x00, 0x52, 0x64, 0x00, 0x00, 0xB3, 0x64, 0x00, 0x00, 0xB3, -/* 00004510 */ 0x64, 0x00, 0x00, 0xB4, 0x64, 0x00, 0x00, 0xB4, 0x64, 0x00, 0x00, 0x27, 0x65, 0x00, 0x00, 0x27, -/* 00004520 */ 0x65, 0x00, 0x00, 0x77, 0x65, 0x00, 0x00, 0x77, 0x65, 0x00, 0x00, 0xC8, 0x65, 0x00, 0x00, 0xC8, -/* 00004530 */ 0x65, 0x00, 0x00, 0x4B, 0x66, 0x00, 0x00, 0x4B, 0x66, 0x00, 0x00, 0x8D, 0x66, 0x00, 0x00, 0x8D, -/* 00004540 */ 0x66, 0x00, 0x00, 0xDA, 0x66, 0x00, 0x00, 0xDA, 0x66, 0x00, 0x00, 0x42, 0x67, 0x00, 0x00, 0x42, -/* 00004550 */ 0x67, 0x00, 0x00, 0x68, 0x67, 0x00, 0x00, 0x68, 0x67, 0x00, 0x00, 0x69, 0x67, 0x00, 0x00, 0x69, -/* 00004560 */ 0x67, 0x00, 0x00, 0xC2, 0x67, 0x00, 0x00, 0xC2, 0x67, 0x00, 0x00, 0x4D, 0x68, 0x00, 0x00, 0x4D, -/* 00004570 */ 0x68, 0x00, 0x00, 0x93, 0x68, 0x00, 0x00, 0x93, 0x68, 0x00, 0x00, 0xE0, 0x68, 0x00, 0x00, 0xE0, -/* 00004580 */ 0x68, 0x00, 0x00, 0x4C, 0x69, 0x00, 0x00, 0x4C, 0x69, 0x00, 0x00, 0x72, 0x69, 0x00, 0x00, 0x72, -/* 00004590 */ 0x69, 0x00, 0x00, 0x73, 0x69, 0x00, 0x00, 0x73, 0x69, 0x00, 0x00, 0xD0, 0x69, 0x00, 0x00, 0xD0, -/* 000045A0 */ 0x69, 0x00, 0x00, 0x5F, 0x6A, 0x00, 0x00, 0x5F, 0x6A, 0x00, 0x00, 0xA7, 0x6A, 0x00, 0x00, 0xA7, -/* 000045B0 */ 0x6A, 0x00, 0x00, 0xF4, 0x6A, 0x00, 0x00, 0xF4, 0x6A, 0x00, 0x00, 0x62, 0x6B, 0x00, 0x00, 0x62, -/* 000045C0 */ 0x6B, 0x00, 0x00, 0x88, 0x6B, 0x00, 0x00, 0x88, 0x6B, 0x00, 0x00, 0x89, 0x6B, 0x00, 0x00, 0x89, -/* 000045D0 */ 0x6B, 0x00, 0x00, 0xCA, 0x6B, 0x00, 0x00, 0xCA, 0x6B, 0x00, 0x00, 0x3D, 0x6C, 0x00, 0x00, 0x3D, -/* 000045E0 */ 0x6C, 0x00, 0x00, 0x77, 0x6C, 0x00, 0x00, 0x77, 0x6C, 0x00, 0x00, 0xD2, 0x6C, 0x00, 0x00, 0xD2, -/* 000045F0 */ 0x6C, 0x00, 0x00, 0xF8, 0x6C, 0x00, 0x00, 0xF8, 0x6C, 0x00, 0x00, 0xF9, 0x6C, 0x00, 0x00, 0xF9, -/* 00004600 */ 0x6C, 0x00, 0x00, 0x52, 0x6D, 0x00, 0x00, 0x52, 0x6D, 0x00, 0x00, 0xAC, 0x6D, 0x00, 0x00, 0xAC, -/* 00004610 */ 0x6D, 0x00, 0x00, 0xFB, 0x6D, 0x00, 0x00, 0xFB, 0x6D, 0x00, 0x00, 0x77, 0x6E, 0x00, 0x00, 0x77, -/* 00004620 */ 0x6E, 0x00, 0x00, 0xD7, 0x6E, 0x00, 0x00, 0xD7, 0x6E, 0x00, 0x00, 0x3B, 0x6F, 0x00, 0x00, 0x3B, -/* 00004630 */ 0x6F, 0x00, 0x00, 0xA1, 0x6F, 0x00, 0x00, 0xA1, 0x6F, 0x00, 0x00, 0xFA, 0x6F, 0x00, 0x00, 0xFA, -/* 00004640 */ 0x6F, 0x00, 0x00, 0xFB, 0x6F, 0x00, 0x00, 0xFB, 0x6F, 0x00, 0x00, 0x62, 0x70, 0x00, 0x00, 0x62, -/* 00004650 */ 0x70, 0x00, 0x00, 0xA7, 0x70, 0x00, 0x00, 0xA7, 0x70, 0x00, 0x00, 0xEA, 0x70, 0x00, 0x00, 0xEA, -/* 00004660 */ 0x70, 0x00, 0x00, 0x23, 0x71, 0x00, 0x00, 0x23, 0x71, 0x00, 0x00, 0x5E, 0x71, 0x00, 0x00, 0x5E, -/* 00004670 */ 0x71, 0x00, 0x00, 0x99, 0x71, 0x00, 0x00, 0x99, 0x71, 0x00, 0x00, 0xD7, 0x71, 0x00, 0x00, 0xD7, -/* 00004680 */ 0x71, 0x00, 0x00, 0x14, 0x72, 0x00, 0x00, 0x14, 0x72, 0x00, 0x00, 0x49, 0x72, 0x00, 0x00, 0x49, -/* 00004690 */ 0x72, 0x00, 0x00, 0xAA, 0x72, 0x00, 0x00, 0xAA, 0x72, 0x00, 0x00, 0xF5, 0x72, 0x00, 0x00, 0xF5, -/* 000046A0 */ 0x72, 0x00, 0x00, 0x40, 0x73, 0x00, 0x00, 0x40, 0x73, 0x00, 0x00, 0x8B, 0x73, 0x00, 0x00, 0x8B, -/* 000046B0 */ 0x73, 0x00, 0x00, 0xD5, 0x73, 0x00, 0x00, 0xD5, 0x73, 0x00, 0x00, 0xD6, 0x73, 0x00, 0x00, 0xD6, -/* 000046C0 */ 0x73, 0x00, 0x00, 0x55, 0x74, 0x00, 0x00, 0x55, 0x74, 0x00, 0x00, 0xF0, 0x74, 0x00, 0x00, 0xF0, -/* 000046D0 */ 0x74, 0x00, 0x00, 0x10, 0x75, 0x00, 0x00, 0x10, 0x75, 0x00, 0x00, 0x30, 0x75, 0x00, 0x00, 0x30, -/* 000046E0 */ 0x75, 0x00, 0x00, 0x4E, 0x75, 0x00, 0x00, 0x4E, 0x75, 0x00, 0x00, 0x5C, 0x75, 0x00, 0x00, 0x5C, -/* 000046F0 */ 0x75, 0x00, 0x00, 0x5D, 0x75, 0x00, 0x00, 0x5D, 0x75, 0x00, 0x00, 0xC0, 0x75, 0x00, 0x00, 0xC0, -/* 00004700 */ 0x75, 0x00, 0x00, 0x3B, 0x76, 0x00, 0x00, 0x3B, 0x76, 0x00, 0x00, 0x7B, 0x76, 0x00, 0x00, 0x7B, -/* 00004710 */ 0x76, 0x00, 0x00, 0xAC, 0x76, 0x00, 0x00, 0xAC, 0x76, 0x00, 0x00, 0x2B, 0x77, 0x00, 0x00, 0x2B, -/* 00004720 */ 0x77, 0x00, 0x00, 0x81, 0x77, 0x00, 0x00, 0x81, 0x77, 0x00, 0x00, 0xC5, 0x77, 0x00, 0x00, 0xC5, -/* 00004730 */ 0x77, 0x00, 0x00, 0xC6, 0x77, 0x00, 0x00, 0xC6, 0x77, 0x00, 0x00, 0x45, 0x78, 0x00, 0x00, 0x45, -/* 00004740 */ 0x78, 0x00, 0x00, 0x8D, 0x78, 0x00, 0x00, 0x8D, 0x78, 0x00, 0x00, 0xB6, 0x78, 0x00, 0x00, 0xB6, -/* 00004750 */ 0x78, 0x00, 0x00, 0xFB, 0x78, 0x00, 0x00, 0xFB, 0x78, 0x00, 0x00, 0x0D, 0x79, 0x00, 0x00, 0x0D, -/* 00004760 */ 0x79, 0x00, 0x00, 0x1D, 0x79, 0x00, 0x00, 0x1D, 0x79, 0x00, 0x00, 0x1E, 0x79, 0x00, 0x00, 0x1E, -/* 00004770 */ 0x79, 0x00, 0x00, 0x56, 0x79, 0x00, 0x00, 0x56, 0x79, 0x00, 0x00, 0x62, 0x79, 0x00, 0x00, 0x62, -/* 00004780 */ 0x79, 0x00, 0x00, 0x7B, 0x79, 0x00, 0x00, 0x7B, 0x79, 0x00, 0x00, 0x85, 0x79, 0x00, 0x00, 0x85, -/* 00004790 */ 0x79, 0x00, 0x00, 0x86, 0x79, 0x00, 0x00, 0x86, 0x79, 0x00, 0x00, 0xD7, 0x79, 0x00, 0x00, 0xD7, -/* 000047A0 */ 0x79, 0x00, 0x00, 0x05, 0x7A, 0x00, 0x00, 0x05, 0x7A, 0x00, 0x00, 0x30, 0x7A, 0x00, 0x00, 0x30, -/* 000047B0 */ 0x7A, 0x00, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x97, 0x7A, 0x00, 0x00, 0x97, -/* 000047C0 */ 0x7A, 0x00, 0x00, 0xC1, 0x7A, 0x00, 0x00, 0xC1, 0x7A, 0x00, 0x00, 0xCB, 0x7A, 0x00, 0x00, 0xCB, -/* 000047D0 */ 0x7A, 0x00, 0x00, 0xCC, 0x7A, 0x00, 0x00, 0xCC, 0x7A, 0x00, 0x00, 0xEC, 0x7A, 0x00, 0x00, 0xEC, -/* 000047E0 */ 0x7A, 0x00, 0x00, 0x0F, 0x7B, 0x00, 0x00, 0x0F, 0x7B, 0x00, 0x00, 0x31, 0x7B, 0x00, 0x00, 0x31, -/* 000047F0 */ 0x7B, 0x00, 0x00, 0x85, 0x7B, 0x00, 0x00, 0x85, 0x7B, 0x00, 0x00, 0xAE, 0x7B, 0x00, 0x00, 0xAE, -/* 00004800 */ 0x7B, 0x00, 0x00, 0x18, 0x7C, 0x00, 0x00, 0x18, 0x7C, 0x00, 0x00, 0x31, 0x7C, 0x00, 0x00, 0x31, -/* 00004810 */ 0x7C, 0x00, 0x00, 0x83, 0x7C, 0x00, 0x00, 0x83, 0x7C, 0x00, 0x00, 0xCC, 0x7C, 0x00, 0x00, 0xCC, -/* 00004820 */ 0x7C, 0x00, 0x00, 0xF2, 0x7C, 0x00, 0x00, 0xF2, 0x7C, 0x00, 0x00, 0x54, 0x7D, 0x00, 0x00, 0x54, -/* 00004830 */ 0x7D, 0x00, 0x00, 0x62, 0x7D, 0x00, 0x00, 0x62, 0x7D, 0x00, 0x00, 0x73, 0x7D, 0x00, 0x00, 0x73, -/* 00004840 */ 0x7D, 0x00, 0x00, 0xBC, 0x7D, 0x00, 0x00, 0xBC, 0x7D, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x00, 0x18, -/* 00004850 */ 0x7E, 0x00, 0x00, 0x37, 0x7E, 0x00, 0x00, 0x37, 0x7E, 0x00, 0x00, 0x59, 0x7E, 0x00, 0x00, 0x59, -/* 00004860 */ 0x7E, 0x00, 0x00, 0x63, 0x7E, 0x00, 0x00, 0x63, 0x7E, 0x00, 0x00, 0x64, 0x7E, 0x00, 0x00, 0x64, -/* 00004870 */ 0x7E, 0x00, 0x00, 0x8B, 0x7E, 0x00, 0x00, 0x8B, 0x7E, 0x00, 0x00, 0xB7, 0x7E, 0x00, 0x00, 0xB7, -/* 00004880 */ 0x7E, 0x00, 0x00, 0xE1, 0x7E, 0x00, 0x00, 0xE1, 0x7E, 0x00, 0x00, 0xEB, 0x7E, 0x00, 0x00, 0xEB, -/* 00004890 */ 0x7E, 0x00, 0x00, 0xEC, 0x7E, 0x00, 0x00, 0xEC, 0x7E, 0x00, 0x00, 0x48, 0x7F, 0x00, 0x00, 0x48, -/* 000048A0 */ 0x7F, 0x00, 0x00, 0x9D, 0x7F, 0x00, 0x00, 0x9D, 0x7F, 0x00, 0x00, 0xC3, 0x7F, 0x00, 0x00, 0xC3, -/* 000048B0 */ 0x7F, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x16, 0x80, 0x00, 0x00, 0x16, -/* 000048C0 */ 0x80, 0x00, 0x00, 0x56, 0x80, 0x00, 0x00, 0x56, 0x80, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x64, -/* 000048D0 */ 0x80, 0x00, 0x00, 0x6F, 0x80, 0x00, 0x00, 0x6F, 0x80, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x70, -/* 000048E0 */ 0x80, 0x00, 0x00, 0xC6, 0x80, 0x00, 0x00, 0xC6, 0x80, 0x00, 0x00, 0xF9, 0x80, 0x00, 0x00, 0xF9, -/* 000048F0 */ 0x80, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x9A, 0x81, 0x00, 0x00, 0x9A, -/* 00004900 */ 0x81, 0x00, 0x00, 0xC4, 0x81, 0x00, 0x00, 0xC4, 0x81, 0x00, 0x00, 0xCE, 0x81, 0x00, 0x00, 0xCE, -/* 00004910 */ 0x81, 0x00, 0x00, 0xCF, 0x81, 0x00, 0x00, 0xCF, 0x81, 0x00, 0x00, 0x11, 0x82, 0x00, 0x00, 0x11, -/* 00004920 */ 0x82, 0x00, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x98, 0x82, 0x00, 0x00, 0x98, -/* 00004930 */ 0x82, 0x00, 0x00, 0xA9, 0x82, 0x00, 0x00, 0xA9, 0x82, 0x00, 0x00, 0xFD, 0x82, 0x00, 0x00, 0xFD, -/* 00004940 */ 0x82, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x08, 0x83, 0x00, 0x00, 0x08, -/* 00004950 */ 0x83, 0x00, 0x00, 0x2E, 0x83, 0x00, 0x00, 0x2E, 0x83, 0x00, 0x00, 0x35, 0x83, 0x00, 0x00, 0x35, -/* 00004960 */ 0x83, 0x00, 0x00, 0x36, 0x83, 0x00, 0x00, 0x36, 0x83, 0x00, 0x00, 0x6B, 0x83, 0x00, 0x00, 0x6B, -/* 00004970 */ 0x83, 0x00, 0x00, 0x8D, 0x83, 0x00, 0x00, 0x8D, 0x83, 0x00, 0x00, 0x8E, 0x83, 0x00, 0x00, 0x8E, -/* 00004980 */ 0x83, 0x00, 0x00, 0xCA, 0x83, 0x00, 0x00, 0xCA, 0x83, 0x00, 0x00, 0xCB, 0x83, 0x00, 0x00, 0xCB, -/* 00004990 */ 0x83, 0x00, 0x00, 0x14, 0x84, 0x00, 0x00, 0x14, 0x84, 0x00, 0x00, 0x47, 0x84, 0x00, 0x00, 0x47, -/* 000049A0 */ 0x84, 0x00, 0x00, 0x77, 0x84, 0x00, 0x00, 0x77, 0x84, 0x00, 0x00, 0x89, 0x84, 0x00, 0x00, 0x89, -/* 000049B0 */ 0x84, 0x00, 0x00, 0x8A, 0x84, 0x00, 0x00, 0x8A, 0x84, 0x00, 0x00, 0x19, 0x85, 0x00, 0x00, 0x19, -/* 000049C0 */ 0x85, 0x00, 0x00, 0x6F, 0x85, 0x00, 0x00, 0x6F, 0x85, 0x00, 0x00, 0x81, 0x85, 0x00, 0x00, 0x81, -/* 000049D0 */ 0x85, 0x00, 0x00, 0x82, 0x85, 0x00, 0x00, 0x82, 0x85, 0x00, 0x00, 0xBB, 0x85, 0x00, 0x00, 0xBB, -/* 000049E0 */ 0x85, 0x00, 0x00, 0xBC, 0x85, 0x00, 0x00, 0xBC, 0x85, 0x00, 0x00, 0xDF, 0x85, 0x00, 0x00, 0xDF, -/* 000049F0 */ 0x85, 0x00, 0x00, 0x15, 0x86, 0x00, 0x00, 0x15, 0x86, 0x00, 0x00, 0x4B, 0x86, 0x00, 0x00, 0x4B, -/* 00004A00 */ 0x86, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x9E, 0x86, 0x00, 0x00, 0x9E, -/* 00004A10 */ 0x86, 0x00, 0x00, 0xB0, 0x86, 0x00, 0x00, 0xB0, 0x86, 0x00, 0x00, 0xB1, 0x86, 0x00, 0x00, 0xB1, -/* 00004A20 */ 0x86, 0x00, 0x00, 0x22, 0x87, 0x00, 0x00, 0x22, 0x87, 0x00, 0x00, 0x81, 0x87, 0x00, 0x00, 0x81, -/* 00004A30 */ 0x87, 0x00, 0x00, 0x02, 0x88, 0x00, 0x00, 0x02, 0x88, 0x00, 0x00, 0x70, 0x88, 0x00, 0x00, 0x70, -/* 00004A40 */ 0x88, 0x00, 0x00, 0xE3, 0x88, 0x00, 0x00, 0xE3, 0x88, 0x00, 0x00, 0x45, 0x89, 0x00, 0x00, 0x45, -/* 00004A50 */ 0x89, 0x00, 0x00, 0x46, 0x89, 0x00, 0x00, 0x46, 0x89, 0x00, 0x00, 0x7E, 0x89, 0x00, 0x00, 0x7E, -/* 00004A60 */ 0x89, 0x00, 0x00, 0xBF, 0x89, 0x00, 0x00, 0xBF, 0x89, 0x00, 0x00, 0x2D, 0x8A, 0x00, 0x00, 0x2D, -/* 00004A70 */ 0x8A, 0x00, 0x00, 0x2E, 0x8A, 0x00, 0x00, 0x2E, 0x8A, 0x00, 0x00, 0x59, 0x8A, 0x00, 0x00, 0x59, -/* 00004A80 */ 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0x07, 0x8B, 0x00, 0x00, 0x07, -/* 00004A90 */ 0x8B, 0x00, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x3A, 0x8B, 0x00, 0x00, 0x3A, -/* 00004AA0 */ 0x8B, 0x00, 0x00, 0xA5, 0x8B, 0x00, 0x00, 0xA5, 0x8B, 0x00, 0x00, 0x27, 0x8C, 0x00, 0x00, 0x27, -/* 00004AB0 */ 0x8C, 0x00, 0x00, 0x53, 0x8C, 0x00, 0x00, 0x53, 0x8C, 0x00, 0x00, 0x9F, 0x8C, 0x00, 0x00, 0x9F, -/* 00004AC0 */ 0x8C, 0x00, 0x00, 0xE6, 0x8C, 0x00, 0x00, 0xE6, 0x8C, 0x00, 0x00, 0x82, 0x8D, 0x00, 0x00, 0x82, -/* 00004AD0 */ 0x8D, 0x00, 0x00, 0xCE, 0x8D, 0x00, 0x00, 0xCE, 0x8D, 0x00, 0x00, 0x05, 0x8E, 0x00, 0x00, 0x05, -/* 00004AE0 */ 0x8E, 0x00, 0x00, 0x89, 0x8E, 0x00, 0x00, 0x89, 0x8E, 0x00, 0x00, 0xAE, 0x8E, 0x00, 0x00, 0xAE, -/* 00004AF0 */ 0x8E, 0x00, 0x00, 0xDE, 0x8E, 0x00, 0x00, 0xDE, 0x8E, 0x00, 0x00, 0xFC, 0x8E, 0x00, 0x00, 0xFC, -/* 00004B00 */ 0x8E, 0x00, 0x00, 0x9F, 0x8F, 0x00, 0x00, 0x9F, 0x8F, 0x00, 0x00, 0xFE, 0x8F, 0x00, 0x00, 0xFE, -/* 00004B10 */ 0x8F, 0x00, 0x00, 0x2D, 0x90, 0x00, 0x00, 0x2D, 0x90, 0x00, 0x00, 0x47, 0x90, 0x00, 0x00, 0x47, -/* 00004B20 */ 0x90, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x71, 0x90, 0x00, 0x00, 0x71, -/* 00004B30 */ 0x90, 0x00, 0x00, 0xA0, 0x90, 0x00, 0x00, 0xA0, 0x90, 0x00, 0x00, 0x0F, 0x91, 0x00, 0x00, 0x0F, -/* 00004B40 */ 0x91, 0x00, 0x00, 0x3E, 0x91, 0x00, 0x00, 0x3E, 0x91, 0x00, 0x00, 0xCC, 0x91, 0x00, 0x00, 0xCC, -/* 00004B50 */ 0x91, 0x00, 0x00, 0x03, 0x92, 0x00, 0x00, 0x03, 0x92, 0x00, 0x00, 0x6D, 0x92, 0x00, 0x00, 0x6D, -/* 00004B60 */ 0x92, 0x00, 0x00, 0x87, 0x92, 0x00, 0x00, 0x87, 0x92, 0x00, 0x00, 0x9D, 0x92, 0x00, 0x00, 0x9D, -/* 00004B70 */ 0x92, 0x00, 0x00, 0xB8, 0x92, 0x00, 0x00, 0xB8, 0x92, 0x00, 0x00, 0xE7, 0x92, 0x00, 0x00, 0xE7, -/* 00004B80 */ 0x92, 0x00, 0x00, 0xFD, 0x92, 0x00, 0x00, 0xFD, 0x92, 0x00, 0x00, 0x0F, 0x93, 0x00, 0x00, 0x0F, -/* 00004B90 */ 0x93, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x3F, 0x93, 0x00, 0x00, 0x3F, -/* 00004BA0 */ 0x93, 0x00, 0x00, 0x6E, 0x93, 0x00, 0x00, 0x6E, 0x93, 0x00, 0x00, 0x88, 0x93, 0x00, 0x00, 0x88, -/* 00004BB0 */ 0x93, 0x00, 0x00, 0x03, 0x94, 0x00, 0x00, 0x03, 0x94, 0x00, 0x00, 0x25, 0x94, 0x00, 0x00, 0x25, -/* 00004BC0 */ 0x94, 0x00, 0x00, 0x53, 0x94, 0x00, 0x00, 0x53, 0x94, 0x00, 0x00, 0x81, 0x94, 0x00, 0x00, 0x81, -/* 00004BD0 */ 0x94, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0xF3, 0x94, 0x00, 0x00, 0xF3, -/* 00004BE0 */ 0x94, 0x00, 0x00, 0x7C, 0x95, 0x00, 0x00, 0x7C, 0x95, 0x00, 0x00, 0xE5, 0x95, 0x00, 0x00, 0xE5, -/* 00004BF0 */ 0x95, 0x00, 0x00, 0x24, 0x96, 0x00, 0x00, 0x24, 0x96, 0x00, 0x00, 0x3A, 0x96, 0x00, 0x00, 0x3A, -/* 00004C00 */ 0x96, 0x00, 0x00, 0x3B, 0x96, 0x00, 0x00, 0x3B, 0x96, 0x00, 0x00, 0x60, 0x96, 0x00, 0x00, 0x60, -/* 00004C10 */ 0x96, 0x00, 0x00, 0x8D, 0x96, 0x00, 0x00, 0x8D, 0x96, 0x00, 0x00, 0xBA, 0x96, 0x00, 0x00, 0xBA, -/* 00004C20 */ 0x96, 0x00, 0x00, 0xE7, 0x96, 0x00, 0x00, 0xE7, 0x96, 0x00, 0x00, 0x04, 0x97, 0x00, 0x00, 0x04, -/* 00004C30 */ 0x97, 0x00, 0x00, 0x31, 0x97, 0x00, 0x00, 0x31, 0x97, 0x00, 0x00, 0x47, 0x97, 0x00, 0x00, 0x47, -/* 00004C40 */ 0x97, 0x00, 0x00, 0x59, 0x97, 0x00, 0x00, 0x59, 0x97, 0x00, 0x00, 0x5A, 0x97, 0x00, 0x00, 0x5A, -/* 00004C50 */ 0x97, 0x00, 0x00, 0x8B, 0x97, 0x00, 0x00, 0x8B, 0x97, 0x00, 0x00, 0xB8, 0x97, 0x00, 0x00, 0xB8, -/* 00004C60 */ 0x97, 0x00, 0x00, 0xCA, 0x97, 0x00, 0x00, 0xCA, 0x97, 0x00, 0x00, 0xCB, 0x97, 0x00, 0x00, 0xCB, -/* 00004C70 */ 0x97, 0x00, 0x00, 0xF8, 0x97, 0x00, 0x00, 0xF8, 0x97, 0x00, 0x00, 0x1D, 0x98, 0x00, 0x00, 0x1D, -/* 00004C80 */ 0x98, 0x00, 0x00, 0x2F, 0x98, 0x00, 0x00, 0x2F, 0x98, 0x00, 0x00, 0x30, 0x98, 0x00, 0x00, 0x30, -/* 00004C90 */ 0x98, 0x00, 0x00, 0x61, 0x98, 0x00, 0x00, 0x61, 0x98, 0x00, 0x00, 0x8F, 0x98, 0x00, 0x00, 0x8F, -/* 00004CA0 */ 0x98, 0x00, 0x00, 0xDC, 0x98, 0x00, 0x00, 0xDC, 0x98, 0x00, 0x00, 0x24, 0x99, 0x00, 0x00, 0x24, -/* 00004CB0 */ 0x99, 0x00, 0x00, 0x4E, 0x99, 0x00, 0x00, 0x4E, 0x99, 0x00, 0x00, 0x84, 0x99, 0x00, 0x00, 0x84, -/* 00004CC0 */ 0x99, 0x00, 0x00, 0xC6, 0x99, 0x00, 0x00, 0xC6, 0x99, 0x00, 0x00, 0xF8, 0x99, 0x00, 0x00, 0xF8, -/* 00004CD0 */ 0x99, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x58, 0x9A, 0x00, 0x00, 0x58, -/* 00004CE0 */ 0x9A, 0x00, 0x00, 0x8F, 0x9A, 0x00, 0x00, 0x8F, 0x9A, 0x00, 0x00, 0x9D, 0x9A, 0x00, 0x00, 0x9D, -/* 00004CF0 */ 0x9A, 0x00, 0x00, 0x9E, 0x9A, 0x00, 0x00, 0x9E, 0x9A, 0x00, 0x00, 0x0D, 0x9B, 0x00, 0x00, 0x0D, -/* 00004D00 */ 0x9B, 0x00, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x71, 0x9B, 0x00, 0x00, 0x71, -/* 00004D10 */ 0x9B, 0x00, 0x00, 0xCB, 0x9B, 0x00, 0x00, 0xCB, 0x9B, 0x00, 0x00, 0xDD, 0x9B, 0x00, 0x00, 0xDD, -/* 00004D20 */ 0x9B, 0x00, 0x00, 0x07, 0x9C, 0x00, 0x00, 0x07, 0x9C, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x00, 0x37, -/* 00004D30 */ 0x9C, 0x00, 0x00, 0x49, 0x9C, 0x00, 0x00, 0x49, 0x9C, 0x00, 0x00, 0xED, 0x9C, 0x00, 0x00, 0xED, -/* 00004D40 */ 0x9C, 0x00, 0x00, 0x19, 0x9D, 0x00, 0x00, 0x19, 0x9D, 0x00, 0x00, 0x42, 0x9D, 0x00, 0x00, 0x42, -/* 00004D50 */ 0x9D, 0x00, 0x00, 0x7C, 0x9D, 0x00, 0x00, 0x7C, 0x9D, 0x00, 0x00, 0xC9, 0x9D, 0x00, 0x00, 0xC9, -/* 00004D60 */ 0x9D, 0x00, 0x00, 0x82, 0x9E, 0x00, 0x00, 0x82, 0x9E, 0x00, 0x00, 0x96, 0x9E, 0x00, 0x00, 0x96, -/* 00004D70 */ 0x9E, 0x00, 0x00, 0x97, 0x9E, 0x00, 0x00, 0x97, 0x9E, 0x00, 0x00, 0xBE, 0x9E, 0x00, 0x00, 0xBE, -/* 00004D80 */ 0x9E, 0x00, 0x00, 0xBF, 0x9E, 0x00, 0x00, 0xBF, 0x9E, 0x00, 0x00, 0xE5, 0x9E, 0x00, 0x00, 0xE5, -/* 00004D90 */ 0x9E, 0x00, 0x00, 0x4B, 0x9F, 0x00, 0x00, 0x4B, 0x9F, 0x00, 0x00, 0xC2, 0x9F, 0x00, 0x00, 0xC2, -/* 00004DA0 */ 0x9F, 0x00, 0x00, 0x34, 0xA0, 0x00, 0x00, 0x34, 0xA0, 0x00, 0x00, 0x61, 0xA0, 0x00, 0x00, 0x61, -/* 00004DB0 */ 0xA0, 0x00, 0x00, 0x8E, 0xA0, 0x00, 0x00, 0x8E, 0xA0, 0x00, 0x00, 0xD5, 0xA0, 0x00, 0x00, 0xD5, -/* 00004DC0 */ 0xA0, 0x00, 0x00, 0x1C, 0xA1, 0x00, 0x00, 0x1C, 0xA1, 0x00, 0x00, 0x1D, 0xA1, 0x00, 0x00, 0x1D, -/* 00004DD0 */ 0xA1, 0x00, 0x00, 0x5C, 0xA1, 0x00, 0x00, 0x5C, 0xA1, 0x00, 0x00, 0x9B, 0xA1, 0x00, 0x00, 0x9B, -/* 00004DE0 */ 0xA1, 0x00, 0x00, 0xB1, 0xA1, 0x00, 0x00, 0xB1, 0xA1, 0x00, 0x00, 0xB2, 0xA1, 0x00, 0x00, 0xB2, -/* 00004DF0 */ 0xA1, 0x00, 0x00, 0xE9, 0xA1, 0x00, 0x00, 0xE9, 0xA1, 0x00, 0x00, 0x1D, 0xA2, 0x00, 0x00, 0x1D, -/* 00004E00 */ 0xA2, 0x00, 0x00, 0x66, 0xA2, 0x00, 0x00, 0x66, 0xA2, 0x00, 0x00, 0x7C, 0xA2, 0x00, 0x00, 0x7C, -/* 00004E10 */ 0xA2, 0x00, 0x00, 0x7D, 0xA2, 0x00, 0x00, 0x7D, 0xA2, 0x00, 0x00, 0xB8, 0xA2, 0x00, 0x00, 0xB8, -/* 00004E20 */ 0xA2, 0x00, 0x00, 0xFE, 0xA2, 0x00, 0x00, 0xFE, 0xA2, 0x00, 0x00, 0xFF, 0xA2, 0x00, 0x00, 0xFF, -/* 00004E30 */ 0xA2, 0x00, 0x00, 0x35, 0xA3, 0x00, 0x00, 0x35, 0xA3, 0x00, 0x00, 0x74, 0xA3, 0x00, 0x00, 0x74, -/* 00004E40 */ 0xA3, 0x00, 0x00, 0xB9, 0xA3, 0x00, 0x00, 0xB9, 0xA3, 0x00, 0x00, 0xCF, 0xA3, 0x00, 0x00, 0xCF, -/* 00004E50 */ 0xA3, 0x00, 0x00, 0xD0, 0xA3, 0x00, 0x00, 0xD0, 0xA3, 0x00, 0x00, 0x18, 0xA4, 0x00, 0x00, 0x18, -/* 00004E60 */ 0xA4, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x46, 0xA4, 0x00, 0x00, 0x46, -/* 00004E70 */ 0xA4, 0x00, 0x00, 0xAE, 0xA4, 0x00, 0x00, 0xAE, 0xA4, 0x00, 0x00, 0xEB, 0xA4, 0x00, 0x00, 0xEB, -/* 00004E80 */ 0xA4, 0x00, 0x00, 0x0B, 0xA5, 0x00, 0x00, 0x0B, 0xA5, 0x00, 0x00, 0x1D, 0xA5, 0x00, 0x00, 0x1D, -/* 00004E90 */ 0xA5, 0x00, 0x00, 0x5B, 0xA5, 0x00, 0x00, 0x5B, 0xA5, 0x00, 0x00, 0x5C, 0xA5, 0x00, 0x00, 0x5C, -/* 00004EA0 */ 0xA5, 0x00, 0x00, 0x85, 0xA5, 0x00, 0x00, 0x85, 0xA5, 0x00, 0x00, 0xB9, 0xA5, 0x00, 0x00, 0xB9, -/* 00004EB0 */ 0xA5, 0x00, 0x00, 0x1B, 0xA6, 0x00, 0x00, 0x1B, 0xA6, 0x00, 0x00, 0x31, 0xA6, 0x00, 0x00, 0x31, -/* 00004EC0 */ 0xA6, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x79, 0xA6, 0x00, 0x00, 0x79, -/* 00004ED0 */ 0xA6, 0x00, 0x00, 0xD6, 0xA6, 0x00, 0x00, 0xD6, 0xA6, 0x00, 0x00, 0x38, 0xA7, 0x00, 0x00, 0x38, -/* 00004EE0 */ 0xA7, 0x00, 0x00, 0x4E, 0xA7, 0x00, 0x00, 0x4E, 0xA7, 0x00, 0x00, 0x4F, 0xA7, 0x00, 0x00, 0x4F, -/* 00004EF0 */ 0xA7, 0x00, 0x00, 0x72, 0xA7, 0x00, 0x00, 0x72, 0xA7, 0x00, 0x00, 0x95, 0xA7, 0x00, 0x00, 0x95, -/* 00004F00 */ 0xA7, 0x00, 0x00, 0x96, 0xA7, 0x00, 0x00, 0x96, 0xA7, 0x00, 0x00, 0x4E, 0xA8, 0x00, 0x00, 0x4E, -/* 00004F10 */ 0xA8, 0x00, 0x00, 0x60, 0xA8, 0x00, 0x00, 0x60, 0xA8, 0x00, 0x00, 0xAF, 0xA8, 0x00, 0x00, 0xAF, -/* 00004F20 */ 0xA8, 0x00, 0x00, 0xB0, 0xA8, 0x00, 0x00, 0xB0, 0xA8, 0x00, 0x00, 0x42, 0xA9, 0x00, 0x00, 0x42, -/* 00004F30 */ 0xA9, 0x00, 0x00, 0x43, 0xA9, 0x00, 0x00, 0x43, 0xA9, 0x00, 0x00, 0xD4, 0xA9, 0x00, 0x00, 0xD4, -/* 00004F40 */ 0xA9, 0x00, 0x00, 0x18, 0xAA, 0x00, 0x00, 0x18, 0xAA, 0x00, 0x00, 0x19, 0xAA, 0x00, 0x00, 0x19, -/* 00004F50 */ 0xAA, 0x00, 0x00, 0xAE, 0xAA, 0x00, 0x00, 0xAE, 0xAA, 0x00, 0x00, 0xAF, 0xAA, 0x00, 0x00, 0xAF, -/* 00004F60 */ 0xAA, 0x00, 0x00, 0xFD, 0xAA, 0x00, 0x00, 0xFD, 0xAA, 0x00, 0x00, 0x35, 0xAB, 0x00, 0x00, 0x35, -/* 00004F70 */ 0xAB, 0x00, 0x00, 0x6D, 0xAB, 0x00, 0x00, 0x6D, 0xAB, 0x00, 0x00, 0xDB, 0xAB, 0x00, 0x00, 0xDB, -/* 00004F80 */ 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0x40, 0xAC, 0x00, 0x00, 0x40, -/* 00004F90 */ 0xAC, 0x00, 0x00, 0xA1, 0xAC, 0x00, 0x00, 0xA1, 0xAC, 0x00, 0x00, 0x0F, 0xAD, 0x00, 0x00, 0x0F, -/* 00004FA0 */ 0xAD, 0x00, 0x00, 0x29, 0xAD, 0x00, 0x00, 0x29, 0xAD, 0x00, 0x00, 0x2A, 0xAD, 0x00, 0x00, 0x2A, -/* 00004FB0 */ 0xAD, 0x00, 0x00, 0x4B, 0xAD, 0x00, 0x00, 0x4B, 0xAD, 0x00, 0x00, 0x86, 0xAD, 0x00, 0x00, 0x86, -/* 00004FC0 */ 0xAD, 0x00, 0x00, 0xBF, 0xAD, 0x00, 0x00, 0xBF, 0xAD, 0x00, 0x00, 0x04, 0xAE, 0x00, 0x00, 0x04, -/* 00004FD0 */ 0xAE, 0x00, 0x00, 0x55, 0xAE, 0x00, 0x00, 0x55, 0xAE, 0x00, 0x00, 0xB0, 0xAE, 0x00, 0x00, 0xB0, -/* 00004FE0 */ 0xAE, 0x00, 0x00, 0x45, 0xAF, 0x00, 0x00, 0x45, 0xAF, 0x00, 0x00, 0xDA, 0xAF, 0x00, 0x00, 0xDA, -/* 00004FF0 */ 0xAF, 0x00, 0x00, 0xF4, 0xAF, 0x00, 0x00, 0xF4, 0xAF, 0x00, 0x00, 0x41, 0xB0, 0x00, 0x00, 0x41, -/* 00005000 */ 0xB0, 0x00, 0x00, 0x55, 0xB0, 0x00, 0x00, 0x55, 0xB0, 0x00, 0x00, 0x56, 0xB0, 0x00, 0x00, 0x56, -/* 00005010 */ 0xB0, 0x00, 0x00, 0x9C, 0xB0, 0x00, 0x00, 0x9C, 0xB0, 0x00, 0x00, 0xE4, 0xB0, 0x00, 0x00, 0xE4, -/* 00005020 */ 0xB0, 0x00, 0x00, 0x1C, 0xB1, 0x00, 0x00, 0x1C, 0xB1, 0x00, 0x00, 0x82, 0xB1, 0x00, 0x00, 0x82, -/* 00005030 */ 0xB1, 0x00, 0x00, 0x9C, 0xB1, 0x00, 0x00, 0x9C, 0xB1, 0x00, 0x00, 0x9D, 0xB1, 0x00, 0x00, 0x9D, -/* 00005040 */ 0xB1, 0x00, 0x00, 0xE8, 0xB1, 0x00, 0x00, 0xE8, 0xB1, 0x00, 0x00, 0x49, 0xB2, 0x00, 0x00, 0x49, -/* 00005050 */ 0xB2, 0x00, 0x00, 0xAF, 0xB2, 0x00, 0x00, 0xAF, 0xB2, 0x00, 0x00, 0xC9, 0xB2, 0x00, 0x00, 0xC9, -/* 00005060 */ 0xB2, 0x00, 0x00, 0xCA, 0xB2, 0x00, 0x00, 0xCA, 0xB2, 0x00, 0x00, 0x06, 0xB3, 0x00, 0x00, 0x06, -/* 00005070 */ 0xB3, 0x00, 0x00, 0x44, 0xB3, 0x00, 0x00, 0x44, 0xB3, 0x00, 0x00, 0x58, 0xB3, 0x00, 0x00, 0x58, -/* 00005080 */ 0xB3, 0x00, 0x00, 0x59, 0xB3, 0x00, 0x00, 0x59, 0xB3, 0x00, 0x00, 0x7A, 0xB3, 0x00, 0x00, 0x7A, -/* 00005090 */ 0xB3, 0x00, 0x00, 0x88, 0xB3, 0x00, 0x00, 0x88, 0xB3, 0x00, 0x00, 0x92, 0xB3, 0x00, 0x00, 0x92, -/* 000050A0 */ 0xB3, 0x00, 0x00, 0xDD, 0xB3, 0x00, 0x00, 0xDD, 0xB3, 0x00, 0x00, 0xF7, 0xB3, 0x00, 0x00, 0xF7, -/* 000050B0 */ 0xB3, 0x00, 0x00, 0x01, 0xB4, 0x00, 0x00, 0x01, 0xB4, 0x00, 0x00, 0x02, 0xB4, 0x00, 0x00, 0x02, -/* 000050C0 */ 0xB4, 0x00, 0x00, 0x3C, 0xB4, 0x00, 0x00, 0x3C, 0xB4, 0x00, 0x00, 0x62, 0xB4, 0x00, 0x00, 0x62, -/* 000050D0 */ 0xB4, 0x00, 0x00, 0xB1, 0xB4, 0x00, 0x00, 0xB1, 0xB4, 0x00, 0x00, 0xE2, 0xB4, 0x00, 0x00, 0xE2, -/* 000050E0 */ 0xB4, 0x00, 0x00, 0x16, 0xB5, 0x00, 0x00, 0x16, 0xB5, 0x00, 0x00, 0x81, 0xB5, 0x00, 0x00, 0x81, -/* 000050F0 */ 0xB5, 0x00, 0x00, 0xCD, 0xB5, 0x00, 0x00, 0xCD, 0xB5, 0x00, 0x00, 0x20, 0xB6, 0x00, 0x00, 0x20, -/* 00005100 */ 0xB6, 0x00, 0x00, 0x33, 0xB6, 0x00, 0x00, 0x33, 0xB6, 0x00, 0x00, 0x45, 0xB6, 0x00, 0x00, 0x45, -/* 00005110 */ 0xB6, 0x00, 0x00, 0x80, 0xB6, 0x00, 0x00, 0x80, 0xB6, 0x00, 0x00, 0xB3, 0xB6, 0x00, 0x00, 0xB3, -/* 00005120 */ 0xB6, 0x00, 0x00, 0x42, 0xB7, 0x00, 0x00, 0x42, 0xB7, 0x00, 0x00, 0xB3, 0xB7, 0x00, 0x00, 0xB3, -/* 00005130 */ 0xB7, 0x00, 0x00, 0x2A, 0xB8, 0x00, 0x00, 0x2A, 0xB8, 0x00, 0x00, 0x3D, 0xB8, 0x00, 0x00, 0x3D, -/* 00005140 */ 0xB8, 0x00, 0x00, 0x4F, 0xB8, 0x00, 0x00, 0x4F, 0xB8, 0x00, 0x00, 0x50, 0xB8, 0x00, 0x00, 0x50, -/* 00005150 */ 0xB8, 0x00, 0x00, 0x8C, 0xB8, 0x00, 0x00, 0x8C, 0xB8, 0x00, 0x00, 0xDD, 0xB8, 0x00, 0x00, 0xDD, -/* 00005160 */ 0xB8, 0x00, 0x00, 0x14, 0xB9, 0x00, 0x00, 0x14, 0xB9, 0x00, 0x00, 0x44, 0xB9, 0x00, 0x00, 0x44, -/* 00005170 */ 0xB9, 0x00, 0x00, 0x56, 0xB9, 0x00, 0x00, 0x56, 0xB9, 0x00, 0x00, 0x57, 0xB9, 0x00, 0x00, 0x57, -/* 00005180 */ 0xB9, 0x00, 0x00, 0xEE, 0xB9, 0x00, 0x00, 0xEE, 0xB9, 0x00, 0x00, 0x4C, 0xBA, 0x00, 0x00, 0x4C, -/* 00005190 */ 0xBA, 0x00, 0x00, 0x5E, 0xBA, 0x00, 0x00, 0x5E, 0xBA, 0x00, 0x00, 0x5F, 0xBA, 0x00, 0x00, 0x5F, -/* 000051A0 */ 0xBA, 0x00, 0x00, 0x9C, 0xBA, 0x00, 0x00, 0x9C, 0xBA, 0x00, 0x00, 0x9D, 0xBA, 0x00, 0x00, 0x9D, -/* 000051B0 */ 0xBA, 0x00, 0x00, 0xC0, 0xBA, 0x00, 0x00, 0xC0, 0xBA, 0x00, 0x00, 0xF6, 0xBA, 0x00, 0x00, 0xF6, -/* 000051C0 */ 0xBA, 0x00, 0x00, 0x2C, 0xBB, 0x00, 0x00, 0x2C, 0xBB, 0x00, 0x00, 0x45, 0xBB, 0x00, 0x00, 0x45, -/* 000051D0 */ 0xBB, 0x00, 0x00, 0x7F, 0xBB, 0x00, 0x00, 0x7F, 0xBB, 0x00, 0x00, 0x91, 0xBB, 0x00, 0x00, 0x91, -/* 000051E0 */ 0xBB, 0x00, 0x00, 0x92, 0xBB, 0x00, 0x00, 0x92, 0xBB, 0x00, 0x00, 0x03, 0xBC, 0x00, 0x00, 0x03, -/* 000051F0 */ 0xBC, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x76, 0xBC, 0x00, 0x00, 0x76, -/* 00005200 */ 0xBC, 0x00, 0x00, 0xC1, 0xBC, 0x00, 0x00, 0xC1, 0xBC, 0x00, 0x00, 0xEC, 0xBC, 0x00, 0x00, 0xEC, -/* 00005210 */ 0xBC, 0x00, 0x00, 0x2C, 0xBD, 0x00, 0x00, 0x2C, 0xBD, 0x00, 0x00, 0x5F, 0xBD, 0x00, 0x00, 0x5F, -/* 00005220 */ 0xBD, 0x00, 0x00, 0xA0, 0xBD, 0x00, 0x00, 0xA0, 0xBD, 0x00, 0x00, 0xB2, 0xBD, 0x00, 0x00, 0xB2, -/* 00005230 */ 0xBD, 0x00, 0x00, 0xB3, 0xBD, 0x00, 0x00, 0xB3, 0xBD, 0x00, 0x00, 0x12, 0xBE, 0x00, 0x00, 0x12, -/* 00005240 */ 0xBE, 0x00, 0x00, 0x8F, 0xBE, 0x00, 0x00, 0x8F, 0xBE, 0x00, 0x00, 0xBF, 0xBE, 0x00, 0x00, 0xBF, -/* 00005250 */ 0xBE, 0x00, 0x00, 0xC0, 0xBE, 0x00, 0x00, 0xC0, 0xBE, 0x00, 0x00, 0x27, 0xBF, 0x00, 0x00, 0x27, -/* 00005260 */ 0xBF, 0x00, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x95, 0xBF, 0x00, 0x00, 0x95, -/* 00005270 */ 0xBF, 0x00, 0x00, 0xD3, 0xBF, 0x00, 0x00, 0xD3, 0xBF, 0x00, 0x00, 0xD4, 0xBF, 0x00, 0x00, 0xD4, -/* 00005280 */ 0xBF, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x76, 0xC0, 0x00, 0x00, 0x76, -/* 00005290 */ 0xC0, 0x00, 0x00, 0x77, 0xC0, 0x00, 0x00, 0x77, 0xC0, 0x00, 0x00, 0xF1, 0xC0, 0x00, 0x00, 0xF1, -/* 000052A0 */ 0xC0, 0x00, 0x00, 0x60, 0xC1, 0x00, 0x00, 0x60, 0xC1, 0x00, 0x00, 0xE7, 0xC1, 0x00, 0x00, 0xE7, -/* 000052B0 */ 0xC1, 0x00, 0x00, 0xF9, 0xC1, 0x00, 0x00, 0xF9, 0xC1, 0x00, 0x00, 0xFA, 0xC1, 0x00, 0x00, 0xFA, -/* 000052C0 */ 0xC1, 0x00, 0x00, 0x5B, 0xC2, 0x00, 0x00, 0x5B, 0xC2, 0x00, 0x00, 0x5C, 0xC2, 0x00, 0x00, 0x5C, -/* 000052D0 */ 0xC2, 0x00, 0x00, 0x94, 0xC2, 0x00, 0x00, 0x94, 0xC2, 0x00, 0x00, 0xD5, 0xC2, 0x00, 0x00, 0xD5, -/* 000052E0 */ 0xC2, 0x00, 0x00, 0x42, 0xC3, 0x00, 0x00, 0x42, 0xC3, 0x00, 0x00, 0x43, 0xC3, 0x00, 0x00, 0x43, -/* 000052F0 */ 0xC3, 0x00, 0x00, 0x77, 0xC3, 0x00, 0x00, 0x77, 0xC3, 0x00, 0x00, 0xD5, 0xC3, 0x00, 0x00, 0xD5, -/* 00005300 */ 0xC3, 0x00, 0x00, 0x1E, 0xC4, 0x00, 0x00, 0x1E, 0xC4, 0x00, 0x00, 0x30, 0xC4, 0x00, 0x00, 0x30, -/* 00005310 */ 0xC4, 0x00, 0x00, 0x31, 0xC4, 0x00, 0x00, 0x31, 0xC4, 0x00, 0x00, 0x5D, 0xC4, 0x00, 0x00, 0x5D, -/* 00005320 */ 0xC4, 0x00, 0x00, 0x98, 0xC4, 0x00, 0x00, 0x98, 0xC4, 0x00, 0x00, 0xD5, 0xC4, 0x00, 0x00, 0xD5, -/* 00005330 */ 0xC4, 0x00, 0x00, 0xEB, 0xC4, 0x00, 0x00, 0xEB, 0xC4, 0x00, 0x00, 0x41, 0xC5, 0x00, 0x00, 0x41, -/* 00005340 */ 0xC5, 0x00, 0x00, 0x5B, 0xC5, 0x00, 0x00, 0x5B, 0xC5, 0x00, 0x00, 0xA7, 0xC5, 0x00, 0x00, 0xA7, -/* 00005350 */ 0xC5, 0x00, 0x00, 0xC9, 0xC5, 0x00, 0x00, 0xC9, 0xC5, 0x00, 0x00, 0xF7, 0xC5, 0x00, 0x00, 0xF7, -/* 00005360 */ 0xC5, 0x00, 0x00, 0x44, 0xC6, 0x00, 0x00, 0x44, 0xC6, 0x00, 0x00, 0x5A, 0xC6, 0x00, 0x00, 0x5A, -/* 00005370 */ 0xC6, 0x00, 0x00, 0xD0, 0xC6, 0x00, 0x00, 0xD0, 0xC6, 0x00, 0x00, 0x34, 0xC7, 0x00, 0x00, 0x34, -/* 00005380 */ 0xC7, 0x00, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x77, 0xC7, 0x00, 0x00, 0x77, -/* 00005390 */ 0xC7, 0x00, 0x00, 0xA8, 0xC7, 0x00, 0x00, 0xA8, 0xC7, 0x00, 0x00, 0x11, 0xC8, 0x00, 0x00, 0x11, -/* 000053A0 */ 0xC8, 0x00, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x9B, 0xC8, 0x00, 0x00, 0x9B, -/* 000053B0 */ 0xC8, 0x00, 0x00, 0xB8, 0xC8, 0x00, 0x00, 0xB8, 0xC8, 0x00, 0x00, 0x12, 0xC9, 0x00, 0x00, 0x12, -/* 000053C0 */ 0xC9, 0x00, 0x00, 0x28, 0xC9, 0x00, 0x00, 0x28, 0xC9, 0x00, 0x00, 0x3A, 0xC9, 0x00, 0x00, 0x3A, -/* 000053D0 */ 0xC9, 0x00, 0x00, 0x3B, 0xC9, 0x00, 0x00, 0x3B, 0xC9, 0x00, 0x00, 0xCF, 0xC9, 0x00, 0x00, 0xCF, -/* 000053E0 */ 0xC9, 0x00, 0x00, 0xD0, 0xC9, 0x00, 0x00, 0xD0, 0xC9, 0x00, 0x00, 0x01, 0xCA, 0x00, 0x00, 0x01, -/* 000053F0 */ 0xCA, 0x00, 0x00, 0x39, 0xCA, 0x00, 0x00, 0x39, 0xCA, 0x00, 0x00, 0x7C, 0xCA, 0x00, 0x00, 0x7C, -/* 00005400 */ 0xCA, 0x00, 0x00, 0xAA, 0xCA, 0x00, 0x00, 0xAA, 0xCA, 0x00, 0x00, 0xAB, 0xCA, 0x00, 0x00, 0xAB, -/* 00005410 */ 0xCA, 0x00, 0x00, 0xD9, 0xCA, 0x00, 0x00, 0xD9, 0xCA, 0x00, 0x00, 0x11, 0xCB, 0x00, 0x00, 0x11, -/* 00005420 */ 0xCB, 0x00, 0x00, 0x23, 0xCB, 0x00, 0x00, 0x23, 0xCB, 0x00, 0x00, 0x24, 0xCB, 0x00, 0x00, 0x24, -/* 00005430 */ 0xCB, 0x00, 0x00, 0x59, 0xCB, 0x00, 0x00, 0x59, 0xCB, 0x00, 0x00, 0x9F, 0xCB, 0x00, 0x00, 0x9F, -/* 00005440 */ 0xCB, 0x00, 0x00, 0xFE, 0xCB, 0x00, 0x00, 0xFE, 0xCB, 0x00, 0x00, 0x36, 0xCC, 0x00, 0x00, 0x36, -/* 00005450 */ 0xCC, 0x00, 0x00, 0x98, 0xCC, 0x00, 0x00, 0x98, 0xCC, 0x00, 0x00, 0xD5, 0xCC, 0x00, 0x00, 0xD5, -/* 00005460 */ 0xCC, 0x00, 0x00, 0x35, 0xCD, 0x00, 0x00, 0x35, 0xCD, 0x00, 0x00, 0x72, 0xCD, 0x00, 0x00, 0x72, -/* 00005470 */ 0xCD, 0x00, 0x00, 0xD2, 0xCD, 0x00, 0x00, 0xD2, 0xCD, 0x00, 0x00, 0xE8, 0xCD, 0x00, 0x00, 0xE8, -/* 00005480 */ 0xCD, 0x00, 0x00, 0xFA, 0xCD, 0x00, 0x00, 0xFA, 0xCD, 0x00, 0x00, 0xFB, 0xCD, 0x00, 0x00, 0xFB, -/* 00005490 */ 0xCD, 0x00, 0x00, 0x47, 0xCE, 0x00, 0x00, 0x47, 0xCE, 0x00, 0x00, 0x95, 0xCE, 0x00, 0x00, 0x95, -/* 000054A0 */ 0xCE, 0x00, 0x00, 0xE3, 0xCE, 0x00, 0x00, 0xE3, 0xCE, 0x00, 0x00, 0xE4, 0xCE, 0x00, 0x00, 0xE4, -/* 000054B0 */ 0xCE, 0x00, 0x00, 0x22, 0xCF, 0x00, 0x00, 0x22, 0xCF, 0x00, 0x00, 0x7A, 0xCF, 0x00, 0x00, 0x7A, -/* 000054C0 */ 0xCF, 0x00, 0x00, 0xD2, 0xCF, 0x00, 0x00, 0xD2, 0xCF, 0x00, 0x00, 0xE4, 0xCF, 0x00, 0x00, 0xE4, -/* 000054D0 */ 0xCF, 0x00, 0x00, 0xE5, 0xCF, 0x00, 0x00, 0xE5, 0xCF, 0x00, 0x00, 0x25, 0xD0, 0x00, 0x00, 0x25, -/* 000054E0 */ 0xD0, 0x00, 0x00, 0x5F, 0xD0, 0x00, 0x00, 0x5F, 0xD0, 0x00, 0x00, 0x60, 0xD0, 0x00, 0x00, 0x60, -/* 000054F0 */ 0xD0, 0x00, 0x00, 0x76, 0xD0, 0x00, 0x00, 0x76, 0xD0, 0x00, 0x00, 0xCA, 0xD0, 0x00, 0x00, 0xCA, -/* 00005500 */ 0xD0, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0x11, 0xD1, 0x00, 0x00, 0x11, -/* 00005510 */ 0xD1, 0x00, 0x00, 0x2D, 0xD1, 0x00, 0x00, 0x2D, 0xD1, 0x00, 0x00, 0x57, 0xD1, 0x00, 0x00, 0x57, -/* 00005520 */ 0xD1, 0x00, 0x00, 0xAE, 0xD1, 0x00, 0x00, 0xAE, 0xD1, 0x00, 0x00, 0x33, 0xD2, 0x00, 0x00, 0x33, -/* 00005530 */ 0xD2, 0x00, 0x00, 0x98, 0xD2, 0x00, 0x00, 0x98, 0xD2, 0x00, 0x00, 0xD3, 0xD2, 0x00, 0x00, 0xD3, -/* 00005540 */ 0xD2, 0x00, 0x00, 0xE5, 0xD2, 0x00, 0x00, 0xE5, 0xD2, 0x00, 0x00, 0xE6, 0xD2, 0x00, 0x00, 0xE6, -/* 00005550 */ 0xD2, 0x00, 0x00, 0x1B, 0xD3, 0x00, 0x00, 0x1B, 0xD3, 0x00, 0x00, 0x2D, 0xD3, 0x00, 0x00, 0x2D, -/* 00005560 */ 0xD3, 0x00, 0x00, 0x8E, 0xD3, 0x00, 0x00, 0x8E, 0xD3, 0x00, 0x00, 0xA0, 0xD3, 0x00, 0x00, 0xA0, -/* 00005570 */ 0xD3, 0x00, 0x00, 0xA1, 0xD3, 0x00, 0x00, 0xA1, 0xD3, 0x00, 0x00, 0x1F, 0xD4, 0x00, 0x00, 0x1F, -/* 00005580 */ 0xD4, 0x00, 0x00, 0x5E, 0xD4, 0x00, 0x00, 0x5E, 0xD4, 0x00, 0x00, 0x6C, 0xD4, 0x00, 0x00, 0x6C, -/* 00005590 */ 0xD4, 0x00, 0x00, 0x6D, 0xD4, 0x00, 0x00, 0x6D, 0xD4, 0x00, 0x00, 0xDD, 0xD4, 0x00, 0x00, 0xDD, -/* 000055A0 */ 0xD4, 0x00, 0x00, 0x2C, 0xD5, 0x00, 0x00, 0x2C, 0xD5, 0x00, 0x00, 0x8D, 0xD5, 0x00, 0x00, 0x8D, -/* 000055B0 */ 0xD5, 0x00, 0x00, 0x9F, 0xD5, 0x00, 0x00, 0x9F, 0xD5, 0x00, 0x00, 0xA0, 0xD5, 0x00, 0x00, 0xA0, -/* 000055C0 */ 0xD5, 0x00, 0x00, 0xDA, 0xD5, 0x00, 0x00, 0xDA, 0xD5, 0x00, 0x00, 0x2B, 0xD6, 0x00, 0x00, 0x2B, -/* 000055D0 */ 0xD6, 0x00, 0x00, 0x2C, 0xD6, 0x00, 0x00, 0x2C, 0xD6, 0x00, 0x00, 0x5D, 0xD6, 0x00, 0x00, 0x5D, -/* 000055E0 */ 0xD6, 0x00, 0x00, 0xB1, 0xD6, 0x00, 0x00, 0xB1, 0xD6, 0x00, 0x00, 0x06, 0xD7, 0x00, 0x00, 0x06, -/* 000055F0 */ 0xD7, 0x00, 0x00, 0x1A, 0xD7, 0x00, 0x00, 0x1A, 0xD7, 0x00, 0x00, 0x1B, 0xD7, 0x00, 0x00, 0x1B, -/* 00005600 */ 0xD7, 0x00, 0x00, 0x42, 0xD7, 0x00, 0x00, 0x42, 0xD7, 0x00, 0x00, 0x6C, 0xD7, 0x00, 0x00, 0x6C, -/* 00005610 */ 0xD7, 0x00, 0x00, 0xD2, 0xD7, 0x00, 0x00, 0xD2, 0xD7, 0x00, 0x00, 0x49, 0xD8, 0x00, 0x00, 0x49, -/* 00005620 */ 0xD8, 0x00, 0x00, 0xBB, 0xD8, 0x00, 0x00, 0xBB, 0xD8, 0x00, 0x00, 0xE8, 0xD8, 0x00, 0x00, 0xE8, -/* 00005630 */ 0xD8, 0x00, 0x00, 0x15, 0xD9, 0x00, 0x00, 0x15, 0xD9, 0x00, 0x00, 0x5C, 0xD9, 0x00, 0x00, 0x5C, -/* 00005640 */ 0xD9, 0x00, 0x00, 0xA3, 0xD9, 0x00, 0x00, 0xA3, 0xD9, 0x00, 0x00, 0xA4, 0xD9, 0x00, 0x00, 0xA4, -/* 00005650 */ 0xD9, 0x00, 0x00, 0xE3, 0xD9, 0x00, 0x00, 0xE3, 0xD9, 0x00, 0x00, 0x26, 0xDA, 0x00, 0x00, 0x26, -/* 00005660 */ 0xDA, 0x00, 0x00, 0x3C, 0xDA, 0x00, 0x00, 0x3C, 0xDA, 0x00, 0x00, 0x3D, 0xDA, 0x00, 0x00, 0x3D, -/* 00005670 */ 0xDA, 0x00, 0x00, 0x74, 0xDA, 0x00, 0x00, 0x74, 0xDA, 0x00, 0x00, 0x75, 0xDA, 0x00, 0x00, 0x75, -/* 00005680 */ 0xDA, 0x00, 0x00, 0xA9, 0xDA, 0x00, 0x00, 0xA9, 0xDA, 0x00, 0x00, 0xF6, 0xDA, 0x00, 0x00, 0xF6, -/* 00005690 */ 0xDA, 0x00, 0x00, 0x0C, 0xDB, 0x00, 0x00, 0x0C, 0xDB, 0x00, 0x00, 0x0D, 0xDB, 0x00, 0x00, 0x0D, -/* 000056A0 */ 0xDB, 0x00, 0x00, 0x48, 0xDB, 0x00, 0x00, 0x48, 0xDB, 0x00, 0x00, 0x8E, 0xDB, 0x00, 0x00, 0x8E, -/* 000056B0 */ 0xDB, 0x00, 0x00, 0x8F, 0xDB, 0x00, 0x00, 0x8F, 0xDB, 0x00, 0x00, 0xC5, 0xDB, 0x00, 0x00, 0xC5, -/* 000056C0 */ 0xDB, 0x00, 0x00, 0x04, 0xDC, 0x00, 0x00, 0x04, 0xDC, 0x00, 0x00, 0x49, 0xDC, 0x00, 0x00, 0x49, -/* 000056D0 */ 0xDC, 0x00, 0x00, 0x5F, 0xDC, 0x00, 0x00, 0x5F, 0xDC, 0x00, 0x00, 0x60, 0xDC, 0x00, 0x00, 0x60, -/* 000056E0 */ 0xDC, 0x00, 0x00, 0xAC, 0xDC, 0x00, 0x00, 0xAC, 0xDC, 0x00, 0x00, 0xAD, 0xDC, 0x00, 0x00, 0xAD, -/* 000056F0 */ 0xDC, 0x00, 0x00, 0x12, 0xDD, 0x00, 0x00, 0x12, 0xDD, 0x00, 0x00, 0x4E, 0xDD, 0x00, 0x00, 0x4E, -/* 00005700 */ 0xDD, 0x00, 0x00, 0x4F, 0xDD, 0x00, 0x00, 0x4F, 0xDD, 0x00, 0x00, 0x6F, 0xDD, 0x00, 0x00, 0x6F, -/* 00005710 */ 0xDD, 0x00, 0x00, 0x81, 0xDD, 0x00, 0x00, 0x81, 0xDD, 0x00, 0x00, 0xC7, 0xDD, 0x00, 0x00, 0xC7, -/* 00005720 */ 0xDD, 0x00, 0x00, 0xC8, 0xDD, 0x00, 0x00, 0xC8, 0xDD, 0x00, 0x00, 0xED, 0xDD, 0x00, 0x00, 0xED, -/* 00005730 */ 0xDD, 0x00, 0x00, 0x1B, 0xDE, 0x00, 0x00, 0x1B, 0xDE, 0x00, 0x00, 0x1C, 0xDE, 0x00, 0x00, 0x1C, -/* 00005740 */ 0xDE, 0x00, 0x00, 0x50, 0xDE, 0x00, 0x00, 0x50, 0xDE, 0x00, 0x00, 0xB9, 0xDE, 0x00, 0x00, 0xB9, -/* 00005750 */ 0xDE, 0x00, 0x00, 0xCF, 0xDE, 0x00, 0x00, 0xCF, 0xDE, 0x00, 0x00, 0xD0, 0xDE, 0x00, 0x00, 0xD0, -/* 00005760 */ 0xDE, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0x78, 0xDF, 0x00, 0x00, 0x78, -/* 00005770 */ 0xDF, 0x00, 0x00, 0xE1, 0xDF, 0x00, 0x00, 0xE1, 0xDF, 0x00, 0x00, 0xF7, 0xDF, 0x00, 0x00, 0xF7, -/* 00005780 */ 0xDF, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00, 0x50, 0xE0, 0x00, 0x00, 0x50, -/* 00005790 */ 0xE0, 0x00, 0x00, 0xAA, 0xE0, 0x00, 0x00, 0xAA, 0xE0, 0x00, 0x00, 0xBC, 0xE0, 0x00, 0x00, 0xBC, -/* 000057A0 */ 0xE0, 0x00, 0x00, 0x0D, 0xE1, 0x00, 0x00, 0x0D, 0xE1, 0x00, 0x00, 0x0E, 0xE1, 0x00, 0x00, 0x0E, -/* 000057B0 */ 0xE1, 0x00, 0x00, 0xA8, 0xE1, 0x00, 0x00, 0xA8, 0xE1, 0x00, 0x00, 0xA9, 0xE1, 0x00, 0x00, 0xA9, -/* 000057C0 */ 0xE1, 0x00, 0x00, 0x25, 0xE2, 0x00, 0x00, 0x25, 0xE2, 0x00, 0x00, 0xA3, 0xE2, 0x00, 0x00, 0xA3, -/* 000057D0 */ 0xE2, 0x00, 0x00, 0xC7, 0xE2, 0x00, 0x00, 0xC7, 0xE2, 0x00, 0x00, 0xC8, 0xE2, 0x00, 0x00, 0xC8, -/* 000057E0 */ 0xE2, 0x00, 0x00, 0x61, 0xE3, 0x00, 0x00, 0x61, 0xE3, 0x00, 0x00, 0xA9, 0xE3, 0x00, 0x00, 0xA9, -/* 000057F0 */ 0xE3, 0x00, 0x00, 0x46, 0xE4, 0x00, 0x00, 0x46, 0xE4, 0x00, 0x00, 0x47, 0xE4, 0x00, 0x00, 0x47, -/* 00005800 */ 0xE4, 0x00, 0x00, 0x99, 0xE4, 0x00, 0x00, 0x99, 0xE4, 0x00, 0x00, 0xD1, 0xE4, 0x00, 0x00, 0xD1, -/* 00005810 */ 0xE4, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x7F, -/* 00005820 */ 0xE5, 0x00, 0x00, 0x99, 0xE5, 0x00, 0x00, 0x99, 0xE5, 0x00, 0x00, 0xE4, 0xE5, 0x00, 0x00, 0xE4, -/* 00005830 */ 0xE5, 0x00, 0x00, 0x49, 0xE6, 0x00, 0x00, 0x49, 0xE6, 0x00, 0x00, 0xBF, 0xE6, 0x00, 0x00, 0xBF, -/* 00005840 */ 0xE6, 0x00, 0x00, 0xD9, 0xE6, 0x00, 0x00, 0xD9, 0xE6, 0x00, 0x00, 0xDA, 0xE6, 0x00, 0x00, 0xDA, -/* 00005850 */ 0xE6, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x21, 0xE7, 0x00, 0x00, 0x21, -/* 00005860 */ 0xE7, 0x00, 0x00, 0x7D, 0xE7, 0x00, 0x00, 0x7D, 0xE7, 0x00, 0x00, 0xD3, 0xE7, 0x00, 0x00, 0xD3, -/* 00005870 */ 0xE7, 0x00, 0x00, 0x2A, 0xE8, 0x00, 0x00, 0x2A, 0xE8, 0x00, 0x00, 0x48, 0xE8, 0x00, 0x00, 0x48, -/* 00005880 */ 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, 0x65, 0xE8, 0x00, 0x00, 0x65, -/* 00005890 */ 0xE8, 0x00, 0x00, 0xA7, 0xE8, 0x00, 0x00, 0xA7, 0xE8, 0x00, 0x00, 0xF4, 0xE8, 0x00, 0x00, 0xF4, -/* 000058A0 */ 0xE8, 0x00, 0x00, 0x08, 0xE9, 0x00, 0x00, 0x08, 0xE9, 0x00, 0x00, 0x09, 0xE9, 0x00, 0x00, 0x09, -/* 000058B0 */ 0xE9, 0x00, 0x00, 0x52, 0xE9, 0x00, 0x00, 0x52, 0xE9, 0x00, 0x00, 0x99, 0xE9, 0x00, 0x00, 0x99, -/* 000058C0 */ 0xE9, 0x00, 0x00, 0xD1, 0xE9, 0x00, 0x00, 0xD1, 0xE9, 0x00, 0x00, 0x3E, 0xEA, 0x00, 0x00, 0x3E, -/* 000058D0 */ 0xEA, 0x00, 0x00, 0x58, 0xEA, 0x00, 0x00, 0x58, 0xEA, 0x00, 0x00, 0x59, 0xEA, 0x00, 0x00, 0x59, -/* 000058E0 */ 0xEA, 0x00, 0x00, 0xA4, 0xEA, 0x00, 0x00, 0xA4, 0xEA, 0x00, 0x00, 0x09, 0xEB, 0x00, 0x00, 0x09, -/* 000058F0 */ 0xEB, 0x00, 0x00, 0x76, 0xEB, 0x00, 0x00, 0x76, 0xEB, 0x00, 0x00, 0x90, 0xEB, 0x00, 0x00, 0x90, -/* 00005900 */ 0xEB, 0x00, 0x00, 0x91, 0xEB, 0x00, 0x00, 0x91, 0xEB, 0x00, 0x00, 0xCC, 0xEB, 0x00, 0x00, 0xCC, -/* 00005910 */ 0xEB, 0x00, 0x00, 0x0A, 0xEC, 0x00, 0x00, 0x0A, 0xEC, 0x00, 0x00, 0x1E, 0xEC, 0x00, 0x00, 0x1E, -/* 00005920 */ 0xEC, 0x00, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x44, 0xEC, 0x00, 0x00, 0x44, -/* 00005930 */ 0xEC, 0x00, 0x00, 0x52, 0xEC, 0x00, 0x00, 0x52, 0xEC, 0x00, 0x00, 0x5C, 0xEC, 0x00, 0x00, 0x5C, -/* 00005940 */ 0xEC, 0x00, 0x00, 0xAB, 0xEC, 0x00, 0x00, 0xAB, 0xEC, 0x00, 0x00, 0xC5, 0xEC, 0x00, 0x00, 0xC5, -/* 00005950 */ 0xEC, 0x00, 0x00, 0xCF, 0xEC, 0x00, 0x00, 0xCF, 0xEC, 0x00, 0x00, 0xD0, 0xEC, 0x00, 0x00, 0xD0, -/* 00005960 */ 0xEC, 0x00, 0x00, 0x50, 0xED, 0x00, 0x00, 0x50, 0xED, 0x00, 0x00, 0x78, 0xED, 0x00, 0x00, 0x78, -/* 00005970 */ 0xED, 0x00, 0x00, 0x79, 0xED, 0x00, 0x00, 0x79, 0xED, 0x00, 0x00, 0xB3, 0xED, 0x00, 0x00, 0xB3, -/* 00005980 */ 0xED, 0x00, 0x00, 0xF9, 0xED, 0x00, 0x00, 0xF9, 0xED, 0x00, 0x00, 0x26, 0xEE, 0x00, 0x00, 0x26, -/* 00005990 */ 0xEE, 0x00, 0x00, 0x5C, 0xEE, 0x00, 0x00, 0x5C, 0xEE, 0x00, 0x00, 0x75, 0xEE, 0x00, 0x00, 0x75, -/* 000059A0 */ 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xC1, 0xEE, 0x00, 0x00, 0xC1, -/* 000059B0 */ 0xEE, 0x00, 0x00, 0xC2, 0xEE, 0x00, 0x00, 0xC2, 0xEE, 0x00, 0x00, 0xEB, 0xEE, 0x00, 0x00, 0xEB, -/* 000059C0 */ 0xEE, 0x00, 0x00, 0x2C, 0xEF, 0x00, 0x00, 0x2C, 0xEF, 0x00, 0x00, 0xBF, 0xEF, 0x00, 0x00, 0xBF, -/* 000059D0 */ 0xEF, 0x00, 0x00, 0xED, 0xEF, 0x00, 0x00, 0xED, 0xEF, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x03, -/* 000059E0 */ 0xF0, 0x00, 0x00, 0x15, 0xF0, 0x00, 0x00, 0x15, 0xF0, 0x00, 0x00, 0x56, 0xF0, 0x00, 0x00, 0x56, -/* 000059F0 */ 0xF0, 0x00, 0x00, 0xCC, 0xF0, 0x00, 0x00, 0xCC, 0xF0, 0x00, 0x00, 0xFA, 0xF0, 0x00, 0x00, 0xFA, -/* 00005A00 */ 0xF0, 0x00, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x22, 0xF1, 0x00, 0x00, 0x22, -/* 00005A10 */ 0xF1, 0x00, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x76, 0xF1, 0x00, 0x00, 0x76, -/* 00005A20 */ 0xF1, 0x00, 0x00, 0xB2, 0xF1, 0x00, 0x00, 0xB2, 0xF1, 0x00, 0x00, 0xEC, 0xF1, 0x00, 0x00, 0xEC, -/* 00005A30 */ 0xF1, 0x00, 0x00, 0x29, 0xF2, 0x00, 0x00, 0x29, 0xF2, 0x00, 0x00, 0x41, 0xF2, 0x00, 0x00, 0x41, -/* 00005A40 */ 0xF2, 0x00, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0xB8, 0xF2, 0x00, 0x00, 0xB8, -/* 00005A50 */ 0xF2, 0x00, 0x00, 0xF5, 0xF2, 0x00, 0x00, 0xF5, 0xF2, 0x00, 0x00, 0x0D, 0xF3, 0x00, 0x00, 0x0D, -/* 00005A60 */ 0xF3, 0x00, 0x00, 0x48, 0xF3, 0x00, 0x00, 0x48, 0xF3, 0x00, 0x00, 0x82, 0xF3, 0x00, 0x00, 0x82, -/* 00005A70 */ 0xF3, 0x00, 0x00, 0xBF, 0xF3, 0x00, 0x00, 0xBF, 0xF3, 0x00, 0x00, 0xD7, 0xF3, 0x00, 0x00, 0xD7, -/* 00005A80 */ 0xF3, 0x00, 0x00, 0xE9, 0xF3, 0x00, 0x00, 0xE9, 0xF3, 0x00, 0x00, 0x3C, 0xF4, 0x00, 0x00, 0x3C, -/* 00005A90 */ 0xF4, 0x00, 0x00, 0x78, 0xF4, 0x00, 0x00, 0x78, 0xF4, 0x00, 0x00, 0xB2, 0xF4, 0x00, 0x00, 0xB2, -/* 00005AA0 */ 0xF4, 0x00, 0x00, 0xEF, 0xF4, 0x00, 0x00, 0xEF, 0xF4, 0x00, 0x00, 0x07, 0xF5, 0x00, 0x00, 0x07, -/* 00005AB0 */ 0xF5, 0x00, 0x00, 0x45, 0xF5, 0x00, 0x00, 0x45, 0xF5, 0x00, 0x00, 0x7F, 0xF5, 0x00, 0x00, 0x7F, -/* 00005AC0 */ 0xF5, 0x00, 0x00, 0xBC, 0xF5, 0x00, 0x00, 0xBC, 0xF5, 0x00, 0x00, 0xD4, 0xF5, 0x00, 0x00, 0xD4, -/* 00005AD0 */ 0xF5, 0x00, 0x00, 0x12, 0xF6, 0x00, 0x00, 0x12, 0xF6, 0x00, 0x00, 0x4C, 0xF6, 0x00, 0x00, 0x4C, -/* 00005AE0 */ 0xF6, 0x00, 0x00, 0x89, 0xF6, 0x00, 0x00, 0x89, 0xF6, 0x00, 0x00, 0xA1, 0xF6, 0x00, 0x00, 0xA1, -/* 00005AF0 */ 0xF6, 0x00, 0x00, 0xB3, 0xF6, 0x00, 0x00, 0xB3, 0xF6, 0x00, 0x00, 0xD3, 0xF6, 0x00, 0x00, 0xD3, -/* 00005B00 */ 0xF6, 0x00, 0x00, 0xE1, 0xF6, 0x00, 0x00, 0xE1, 0xF6, 0x00, 0x00, 0xE2, 0xF6, 0x00, 0x00, 0xE2, -/* 00005B10 */ 0xF6, 0x00, 0x00, 0x6C, 0xF7, 0x00, 0x00, 0x6C, 0xF7, 0x00, 0x00, 0xA9, 0xF7, 0x00, 0x00, 0xA9, -/* 00005B20 */ 0xF7, 0x00, 0x00, 0xCC, 0xF7, 0x00, 0x00, 0xCC, 0xF7, 0x00, 0x00, 0xCD, 0xF7, 0x00, 0x00, 0xCD, -/* 00005B30 */ 0xF7, 0x00, 0x00, 0xF4, 0xF7, 0x00, 0x00, 0xF4, 0xF7, 0x00, 0x00, 0x4B, 0xF8, 0x00, 0x00, 0x4B, -/* 00005B40 */ 0xF8, 0x00, 0x00, 0xAB, 0xF8, 0x00, 0x00, 0xAB, 0xF8, 0x00, 0x00, 0xE8, 0xF8, 0x00, 0x00, 0xE8, -/* 00005B50 */ 0xF8, 0x00, 0x00, 0x41, 0xF9, 0x00, 0x00, 0x41, 0xF9, 0x00, 0x00, 0x57, 0xF9, 0x00, 0x00, 0x57, -/* 00005B60 */ 0xF9, 0x00, 0x00, 0x69, 0xF9, 0x00, 0x00, 0x69, 0xF9, 0x00, 0x00, 0x6A, 0xF9, 0x00, 0x00, 0x6A, -/* 00005B70 */ 0xF9, 0x00, 0x00, 0x95, 0xF9, 0x00, 0x00, 0x95, 0xF9, 0x00, 0x00, 0xB9, 0xF9, 0x00, 0x00, 0xB9, -/* 00005B80 */ 0xF9, 0x00, 0x00, 0xEF, 0xF9, 0x00, 0x00, 0xEF, 0xF9, 0x00, 0x00, 0x4A, 0xFA, 0x00, 0x00, 0x4A, -/* 00005B90 */ 0xFA, 0x00, 0x00, 0x87, 0xFA, 0x00, 0x00, 0x87, 0xFA, 0x00, 0x00, 0xDB, 0xFA, 0x00, 0x00, 0xDB, -/* 00005BA0 */ 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0x03, 0xFB, 0x00, 0x00, 0x03, -/* 00005BB0 */ 0xFB, 0x00, 0x00, 0x04, 0xFB, 0x00, 0x00, 0x04, 0xFB, 0x00, 0x00, 0x29, 0xFB, 0x00, 0x00, 0x29, -/* 00005BC0 */ 0xFB, 0x00, 0x00, 0x7F, 0xFB, 0x00, 0x00, 0x7F, 0xFB, 0x00, 0x00, 0xD6, 0xFB, 0x00, 0x00, 0xD6, -/* 00005BD0 */ 0xFB, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x8C, 0xFC, 0x00, 0x00, 0x8C, -/* 00005BE0 */ 0xFC, 0x00, 0x00, 0xC7, 0xFC, 0x00, 0x00, 0xC7, 0xFC, 0x00, 0x00, 0x1C, 0xFD, 0x00, 0x00, 0x1C, -/* 00005BF0 */ 0xFD, 0x00, 0x00, 0x32, 0xFD, 0x00, 0x00, 0x32, 0xFD, 0x00, 0x00, 0x44, 0xFD, 0x00, 0x00, 0x44, -/* 00005C00 */ 0xFD, 0x00, 0x00, 0x45, 0xFD, 0x00, 0x00, 0x45, 0xFD, 0x00, 0x00, 0x68, 0xFD, 0x00, 0x00, 0x68, -/* 00005C10 */ 0xFD, 0x00, 0x00, 0xB2, 0xFD, 0x00, 0x00, 0xB2, 0xFD, 0x00, 0x00, 0xC4, 0xFD, 0x00, 0x00, 0xC4, -/* 00005C20 */ 0xFD, 0x00, 0x00, 0xC5, 0xFD, 0x00, 0x00, 0xC5, 0xFD, 0x00, 0x00, 0xF1, 0xFD, 0x00, 0x00, 0xF1, -/* 00005C30 */ 0xFD, 0x00, 0x00, 0x2D, 0xFE, 0x00, 0x00, 0x2D, 0xFE, 0x00, 0x00, 0x8C, 0xFE, 0x00, 0x00, 0x8C, -/* 00005C40 */ 0xFE, 0x00, 0x00, 0xCE, 0xFE, 0x00, 0x00, 0xCE, 0xFE, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x00, 0x26, -/* 00005C50 */ 0xFF, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x4E, 0xFF, 0x00, 0x00, 0x4E, -/* 00005C60 */ 0xFF, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0xB5, 0xFF, 0x00, 0x00, 0xB5, -/* 00005C70 */ 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x00, 0x00, 0x29, 0x00, 0x01, 0x00, 0x29, -/* 00005C80 */ 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x53, 0x00, 0x01, 0x00, 0x53, -/* 00005C90 */ 0x00, 0x01, 0x00, 0x54, 0x00, 0x01, 0x00, 0x54, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x01, 0x00, 0x8A, -/* 00005CA0 */ 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0E, 0x01, 0x01, 0x00, 0x0E, -/* 00005CB0 */ 0x01, 0x01, 0x00, 0x0F, 0x01, 0x01, 0x00, 0x0F, 0x01, 0x01, 0x00, 0x3C, 0x01, 0x01, 0x00, 0x3C, -/* 00005CC0 */ 0x01, 0x01, 0x00, 0x6C, 0x01, 0x01, 0x00, 0x6C, 0x01, 0x01, 0x00, 0x98, 0x01, 0x01, 0x00, 0x98, -/* 00005CD0 */ 0x01, 0x01, 0x00, 0xC4, 0x01, 0x01, 0x00, 0xC4, 0x01, 0x01, 0x00, 0xF4, 0x01, 0x01, 0x00, 0xF4, -/* 00005CE0 */ 0x01, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x4C, 0x02, 0x01, 0x00, 0x4C, -/* 00005CF0 */ 0x02, 0x01, 0x00, 0x81, 0x02, 0x01, 0x00, 0x81, 0x02, 0x01, 0x00, 0xA9, 0x02, 0x01, 0x00, 0xA9, -/* 00005D00 */ 0x02, 0x01, 0x00, 0xD4, 0x02, 0x01, 0x00, 0xD4, 0x02, 0x01, 0x00, 0xE3, 0x02, 0x01, 0x00, 0xE3, -/* 00005D10 */ 0x02, 0x01, 0x00, 0xE4, 0x02, 0x01, 0x00, 0xE4, 0x02, 0x01, 0x00, 0x1B, 0x03, 0x01, 0x00, 0x1B, -/* 00005D20 */ 0x03, 0x01, 0x00, 0x52, 0x03, 0x01, 0x00, 0x52, 0x03, 0x01, 0x00, 0x71, 0x03, 0x01, 0x00, 0x71, -/* 00005D30 */ 0x03, 0x01, 0x00, 0x83, 0x03, 0x01, 0x00, 0x83, 0x03, 0x01, 0x00, 0x84, 0x03, 0x01, 0x00, 0x84, -/* 00005D40 */ 0x03, 0x01, 0x00, 0xCC, 0x03, 0x01, 0x00, 0xCC, 0x03, 0x01, 0x00, 0xDA, 0x03, 0x01, 0x00, 0xDA, -/* 00005D50 */ 0x03, 0x01, 0x00, 0xDB, 0x03, 0x01, 0x00, 0xDB, 0x03, 0x01, 0x00, 0x4B, 0x04, 0x01, 0x00, 0x4B, -/* 00005D60 */ 0x04, 0x01, 0x00, 0xA7, 0x04, 0x01, 0x00, 0xA7, 0x04, 0x01, 0x00, 0x1D, 0x05, 0x01, 0x00, 0x1D, -/* 00005D70 */ 0x05, 0x01, 0x00, 0xAE, 0x05, 0x01, 0x00, 0xAE, 0x05, 0x01, 0x00, 0x2C, 0x06, 0x01, 0x00, 0x2C, -/* 00005D80 */ 0x06, 0x01, 0x00, 0x52, 0x06, 0x01, 0x00, 0x52, 0x06, 0x01, 0x00, 0x47, 0x07, 0x01, 0x00, 0x47, -/* 00005D90 */ 0x07, 0x01, 0x00, 0x71, 0x07, 0x01, 0x00, 0x71, 0x07, 0x01, 0x00, 0x83, 0x07, 0x01, 0x00, 0x83, -/* 00005DA0 */ 0x07, 0x01, 0x00, 0x84, 0x07, 0x01, 0x00, 0x84, 0x07, 0x01, 0x00, 0xC7, 0x07, 0x01, 0x00, 0xC7, -/* 00005DB0 */ 0x07, 0x01, 0x00, 0x49, 0x08, 0x01, 0x00, 0x49, 0x08, 0x01, 0x00, 0x7C, 0x08, 0x01, 0x00, 0x7C, -/* 00005DC0 */ 0x08, 0x01, 0x00, 0x32, 0x09, 0x01, 0x00, 0x32, 0x09, 0x01, 0x00, 0x44, 0x09, 0x01, 0x00, 0x44, -/* 00005DD0 */ 0x09, 0x01, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x78, 0x09, 0x01, 0x00, 0x78, -/* 00005DE0 */ 0x09, 0x01, 0x00, 0x79, 0x09, 0x01, 0x00, 0x79, 0x09, 0x01, 0x00, 0xDE, 0x09, 0x01, 0x00, 0xDE, -/* 00005DF0 */ 0x09, 0x01, 0x00, 0x28, 0x0A, 0x01, 0x00, 0x28, 0x0A, 0x01, 0x00, 0x9C, 0x0A, 0x01, 0x00, 0x9C, -/* 00005E00 */ 0x0A, 0x01, 0x00, 0x2D, 0x0B, 0x01, 0x00, 0x2D, 0x0B, 0x01, 0x00, 0x53, 0x0B, 0x01, 0x00, 0x53, -/* 00005E10 */ 0x0B, 0x01, 0x00, 0x53, 0x0C, 0x01, 0x00, 0x53, 0x0C, 0x01, 0x00, 0x7D, 0x0C, 0x01, 0x00, 0x7D, -/* 00005E20 */ 0x0C, 0x01, 0x00, 0x8F, 0x0C, 0x01, 0x00, 0x8F, 0x0C, 0x01, 0x00, 0x90, 0x0C, 0x01, 0x00, 0x90, -/* 00005E30 */ 0x0C, 0x01, 0x00, 0xDA, 0x0C, 0x01, 0x00, 0xDA, 0x0C, 0x01, 0x00, 0x09, 0x0D, 0x01, 0x00, 0x09, -/* 00005E40 */ 0x0D, 0x01, 0x00, 0x87, 0x0D, 0x01, 0x00, 0x87, 0x0D, 0x01, 0x00, 0xBC, 0x0D, 0x01, 0x00, 0xBC, -/* 00005E50 */ 0x0D, 0x01, 0x00, 0x37, 0x0E, 0x01, 0x00, 0x37, 0x0E, 0x01, 0x00, 0x49, 0x0E, 0x01, 0x00, 0x49, -/* 00005E60 */ 0x0E, 0x01, 0x00, 0x4A, 0x0E, 0x01, 0x00, 0x4A, 0x0E, 0x01, 0x00, 0x70, 0x0E, 0x01, 0x00, 0x70, -/* 00005E70 */ 0x0E, 0x01, 0x00, 0x7E, 0x0E, 0x01, 0x00, 0x7E, 0x0E, 0x01, 0x00, 0x7F, 0x0E, 0x01, 0x00, 0x7F, -/* 00005E80 */ 0x0E, 0x01, 0x00, 0xE1, 0x0E, 0x01, 0x00, 0xE1, 0x0E, 0x01, 0x00, 0x2C, 0x0F, 0x01, 0x00, 0x2C, -/* 00005E90 */ 0x0F, 0x01, 0x00, 0x6A, 0x0F, 0x01, 0x00, 0x6A, 0x0F, 0x01, 0x00, 0xE3, 0x0F, 0x01, 0x00, 0xE3, -/* 00005EA0 */ 0x0F, 0x01, 0x00, 0xF5, 0x0F, 0x01, 0x00, 0xF5, 0x0F, 0x01, 0x00, 0xF6, 0x0F, 0x01, 0x00, 0xF6, -/* 00005EB0 */ 0x0F, 0x01, 0x00, 0x30, 0x10, 0x01, 0x00, 0x30, 0x10, 0x01, 0x00, 0x9D, 0x10, 0x01, 0x00, 0x9D, -/* 00005EC0 */ 0x10, 0x01, 0x00, 0xFC, 0x10, 0x01, 0x00, 0xFC, 0x10, 0x01, 0x00, 0x71, 0x11, 0x01, 0x00, 0x71, -/* 00005ED0 */ 0x11, 0x01, 0x00, 0x83, 0x11, 0x01, 0x00, 0x83, 0x11, 0x01, 0x00, 0x84, 0x11, 0x01, 0x00, 0x84, -/* 00005EE0 */ 0x11, 0x01, 0x00, 0xBF, 0x11, 0x01, 0x00, 0xBF, 0x11, 0x01, 0x00, 0x2A, 0x12, 0x01, 0x00, 0x2A, -/* 00005EF0 */ 0x12, 0x01, 0x00, 0x54, 0x12, 0x01, 0x00, 0x54, 0x12, 0x01, 0x00, 0xC8, 0x12, 0x01, 0x00, 0xC8, -/* 00005F00 */ 0x12, 0x01, 0x00, 0xE5, 0x12, 0x01, 0x00, 0xE5, 0x12, 0x01, 0x00, 0x68, 0x13, 0x01, 0x00, 0x68, -/* 00005F10 */ 0x13, 0x01, 0x00, 0x7E, 0x13, 0x01, 0x00, 0x7E, 0x13, 0x01, 0x00, 0xBD, 0x13, 0x01, 0x00, 0xBD, -/* 00005F20 */ 0x13, 0x01, 0x00, 0x28, 0x14, 0x01, 0x00, 0x28, 0x14, 0x01, 0x00, 0x52, 0x14, 0x01, 0x00, 0x52, -/* 00005F30 */ 0x14, 0x01, 0x00, 0xC6, 0x14, 0x01, 0x00, 0xC6, 0x14, 0x01, 0x00, 0xE3, 0x14, 0x01, 0x00, 0xE3, -/* 00005F40 */ 0x14, 0x01, 0x00, 0x5C, 0x15, 0x01, 0x00, 0x5C, 0x15, 0x01, 0x00, 0x72, 0x15, 0x01, 0x00, 0x72, -/* 00005F50 */ 0x15, 0x01, 0x00, 0x84, 0x15, 0x01, 0x00, 0x84, 0x15, 0x01, 0x00, 0x85, 0x15, 0x01, 0x00, 0x85, -/* 00005F60 */ 0x15, 0x01, 0x00, 0x1A, 0x16, 0x01, 0x00, 0x1A, 0x16, 0x01, 0x00, 0xA6, 0x16, 0x01, 0x00, 0xA6, -/* 00005F70 */ 0x16, 0x01, 0x00, 0x19, 0x17, 0x01, 0x00, 0x19, 0x17, 0x01, 0x00, 0x5C, 0x17, 0x01, 0x00, 0x5C, -/* 00005F80 */ 0x17, 0x01, 0x00, 0xD8, 0x17, 0x01, 0x00, 0xD8, 0x17, 0x01, 0x00, 0xEA, 0x17, 0x01, 0x00, 0xEA, -/* 00005F90 */ 0x17, 0x01, 0x00, 0xEB, 0x17, 0x01, 0x00, 0xEB, 0x17, 0x01, 0x00, 0x25, 0x18, 0x01, 0x00, 0x25, -/* 00005FA0 */ 0x18, 0x01, 0x00, 0x9D, 0x18, 0x01, 0x00, 0x9D, 0x18, 0x01, 0x00, 0xAF, 0x18, 0x01, 0x00, 0xAF, -/* 00005FB0 */ 0x18, 0x01, 0x00, 0xB0, 0x18, 0x01, 0x00, 0xB0, 0x18, 0x01, 0x00, 0xEB, 0x18, 0x01, 0x00, 0xEB, -/* 00005FC0 */ 0x18, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0x77, 0x19, 0x01, 0x00, 0x77, -/* 00005FD0 */ 0x19, 0x01, 0x00, 0x78, 0x19, 0x01, 0x00, 0x78, 0x19, 0x01, 0x00, 0xB5, 0x19, 0x01, 0x00, 0xB5, -/* 00005FE0 */ 0x19, 0x01, 0x00, 0x33, 0x1A, 0x01, 0x00, 0x33, 0x1A, 0x01, 0x00, 0x45, 0x1A, 0x01, 0x00, 0x45, -/* 00005FF0 */ 0x1A, 0x01, 0x00, 0x46, 0x1A, 0x01, 0x00, 0x46, 0x1A, 0x01, 0x00, 0x83, 0x1A, 0x01, 0x00, 0x83, -/* 00006000 */ 0x1A, 0x01, 0x00, 0x01, 0x1B, 0x01, 0x00, 0x01, 0x1B, 0x01, 0x00, 0x13, 0x1B, 0x01, 0x00, 0x13, -/* 00006010 */ 0x1B, 0x01, 0x00, 0x14, 0x1B, 0x01, 0x00, 0x14, 0x1B, 0x01, 0x00, 0x57, 0x1B, 0x01, 0x00, 0x57, -/* 00006020 */ 0x1B, 0x01, 0x00, 0xD4, 0x1B, 0x01, 0x00, 0xD4, 0x1B, 0x01, 0x00, 0xE6, 0x1B, 0x01, 0x00, 0xE6, -/* 00006030 */ 0x1B, 0x01, 0x00, 0xE7, 0x1B, 0x01, 0x00, 0xE7, 0x1B, 0x01, 0x00, 0x0D, 0x1C, 0x01, 0x00, 0x0D, -/* 00006040 */ 0x1C, 0x01, 0x00, 0x1B, 0x1C, 0x01, 0x00, 0x1B, 0x1C, 0x01, 0x00, 0x1C, 0x1C, 0x01, 0x00, 0x1C, -/* 00006050 */ 0x1C, 0x01, 0x00, 0x71, 0x1C, 0x01, 0x00, 0x71, 0x1C, 0x01, 0x00, 0xAA, 0x1C, 0x01, 0x00, 0xAA, -/* 00006060 */ 0x1C, 0x01, 0x00, 0xDA, 0x1C, 0x01, 0x00, 0xDA, 0x1C, 0x01, 0x00, 0xEC, 0x1C, 0x01, 0x00, 0xEC, -/* 00006070 */ 0x1C, 0x01, 0x00, 0xED, 0x1C, 0x01, 0x00, 0xED, 0x1C, 0x01, 0x00, 0x88, 0x1D, 0x01, 0x00, 0x88, -/* 00006080 */ 0x1D, 0x01, 0x00, 0xEA, 0x1D, 0x01, 0x00, 0xEA, 0x1D, 0x01, 0x00, 0xFC, 0x1D, 0x01, 0x00, 0xFC, -/* 00006090 */ 0x1D, 0x01, 0x00, 0xFD, 0x1D, 0x01, 0x00, 0xFD, 0x1D, 0x01, 0x00, 0x3C, 0x1E, 0x01, 0x00, 0x3C, -/* 000060A0 */ 0x1E, 0x01, 0x00, 0x3D, 0x1E, 0x01, 0x00, 0x3D, 0x1E, 0x01, 0x00, 0x64, 0x1E, 0x01, 0x00, 0x64, -/* 000060B0 */ 0x1E, 0x01, 0x00, 0xA9, 0x1E, 0x01, 0x00, 0xA9, 0x1E, 0x01, 0x00, 0xAA, 0x1E, 0x01, 0x00, 0xAA, -/* 000060C0 */ 0x1E, 0x01, 0x00, 0x1B, 0x1F, 0x01, 0x00, 0x1B, 0x1F, 0x01, 0x00, 0x7A, 0x1F, 0x01, 0x00, 0x7A, -/* 000060D0 */ 0x1F, 0x01, 0x00, 0x7B, 0x1F, 0x01, 0x00, 0x7B, 0x1F, 0x01, 0x00, 0xA9, 0x1F, 0x01, 0x00, 0xA9, -/* 000060E0 */ 0x1F, 0x01, 0x00, 0xFC, 0x1F, 0x01, 0x00, 0xFC, 0x1F, 0x01, 0x00, 0x15, 0x20, 0x01, 0x00, 0x15, -/* 000060F0 */ 0x20, 0x01, 0x00, 0x53, 0x20, 0x01, 0x00, 0x53, 0x20, 0x01, 0x00, 0x65, 0x20, 0x01, 0x00, 0x65, -/* 00006100 */ 0x20, 0x01, 0x00, 0x66, 0x20, 0x01, 0x00, 0x66, 0x20, 0x01, 0x00, 0x94, 0x20, 0x01, 0x00, 0x94, -/* 00006110 */ 0x20, 0x01, 0x00, 0xCF, 0x20, 0x01, 0x00, 0xCF, 0x20, 0x01, 0x00, 0xE1, 0x20, 0x01, 0x00, 0xE1, -/* 00006120 */ 0x20, 0x01, 0x00, 0xE2, 0x20, 0x01, 0x00, 0xE2, 0x20, 0x01, 0x00, 0x04, 0x21, 0x01, 0x00, 0x04, -/* 00006130 */ 0x21, 0x01, 0x00, 0x73, 0x21, 0x01, 0x00, 0x73, 0x21, 0x01, 0x00, 0xDA, 0x21, 0x01, 0x00, 0xDA, -/* 00006140 */ 0x21, 0x01, 0x00, 0x3E, 0x22, 0x01, 0x00, 0x3E, 0x22, 0x01, 0x00, 0xBF, 0x22, 0x01, 0x00, 0xBF, -/* 00006150 */ 0x22, 0x01, 0x00, 0x21, 0x23, 0x01, 0x00, 0x21, 0x23, 0x01, 0x00, 0x85, 0x23, 0x01, 0x00, 0x85, -/* 00006160 */ 0x23, 0x01, 0x00, 0xED, 0x23, 0x01, 0x00, 0xED, 0x23, 0x01, 0x00, 0x55, 0x24, 0x01, 0x00, 0x55, -/* 00006170 */ 0x24, 0x01, 0x00, 0xC4, 0x24, 0x01, 0x00, 0xC4, 0x24, 0x01, 0x00, 0xC5, 0x24, 0x01, 0x00, 0xC5, -/* 00006180 */ 0x24, 0x01, 0x00, 0x34, 0x25, 0x01, 0x00, 0x34, 0x25, 0x01, 0x00, 0xAA, 0x25, 0x01, 0x00, 0xAA, -/* 00006190 */ 0x25, 0x01, 0x00, 0xAB, 0x25, 0x01, 0x00, 0xAB, 0x25, 0x01, 0x00, 0x1B, 0x26, 0x01, 0x00, 0x1B, -/* 000061A0 */ 0x26, 0x01, 0x00, 0x1C, 0x26, 0x01, 0x00, 0x1C, 0x26, 0x01, 0x00, 0x6D, 0x26, 0x01, 0x00, 0x6D, -/* 000061B0 */ 0x26, 0x01, 0x00, 0x93, 0x26, 0x01, 0x00, 0x93, 0x26, 0x01, 0x00, 0xB1, 0x26, 0x01, 0x00, 0xB1, -/* 000061C0 */ 0x26, 0x01, 0x00, 0xD1, 0x26, 0x01, 0x00, 0xD1, 0x26, 0x01, 0x00, 0xF3, 0x26, 0x01, 0x00, 0xF3, -/* 000061D0 */ 0x26, 0x01, 0x00, 0x11, 0x27, 0x01, 0x00, 0x11, 0x27, 0x01, 0x00, 0x31, 0x27, 0x01, 0x00, 0x31, -/* 000061E0 */ 0x27, 0x01, 0x00, 0x55, 0x27, 0x01, 0x00, 0x55, 0x27, 0x01, 0x00, 0x79, 0x27, 0x01, 0x00, 0x79, -/* 000061F0 */ 0x27, 0x01, 0x00, 0xA8, 0x27, 0x01, 0x00, 0xA8, 0x27, 0x01, 0x00, 0xC3, 0x27, 0x01, 0x00, 0xC3, -/* 00006200 */ 0x27, 0x01, 0x00, 0xC4, 0x27, 0x01, 0x00, 0xC4, 0x27, 0x01, 0x00, 0xEC, 0x27, 0x01, 0x00, 0xEC, -/* 00006210 */ 0x27, 0x01, 0x00, 0x2D, 0x28, 0x01, 0x00, 0x2D, 0x28, 0x01, 0x00, 0xA0, 0x28, 0x01, 0x00, 0xA0, -/* 00006220 */ 0x28, 0x01, 0x00, 0xA1, 0x28, 0x01, 0x00, 0xA1, 0x28, 0x01, 0x00, 0xC7, 0x28, 0x01, 0x00, 0xC7, -/* 00006230 */ 0x28, 0x01, 0x00, 0xFB, 0x28, 0x01, 0x00, 0xFB, 0x28, 0x01, 0x00, 0x31, 0x29, 0x01, 0x00, 0x31, -/* 00006240 */ 0x29, 0x01, 0x00, 0x76, 0x29, 0x01, 0x00, 0x76, 0x29, 0x01, 0x00, 0x77, 0x29, 0x01, 0x00, 0x77, -/* 00006250 */ 0x29, 0x01, 0x00, 0x99, 0x29, 0x01, 0x00, 0x99, 0x29, 0x01, 0x00, 0xCD, 0x29, 0x01, 0x00, 0xCD, -/* 00006260 */ 0x29, 0x01, 0x00, 0xF9, 0x29, 0x01, 0x00, 0xF9, 0x29, 0x01, 0x00, 0x27, 0x2A, 0x01, 0x00, 0x27, -/* 00006270 */ 0x2A, 0x01, 0x00, 0x57, 0x2A, 0x01, 0x00, 0x57, 0x2A, 0x01, 0x00, 0x83, 0x2A, 0x01, 0x00, 0x83, -/* 00006280 */ 0x2A, 0x01, 0x00, 0xB1, 0x2A, 0x01, 0x00, 0xB1, 0x2A, 0x01, 0x00, 0xE3, 0x2A, 0x01, 0x00, 0xE3, -/* 00006290 */ 0x2A, 0x01, 0x00, 0x15, 0x2B, 0x01, 0x00, 0x15, 0x2B, 0x01, 0x00, 0x53, 0x2B, 0x01, 0x00, 0x53, -/* 000062A0 */ 0x2B, 0x01, 0x00, 0x54, 0x2B, 0x01, 0x00, 0x54, 0x2B, 0x01, 0x00, 0x86, 0x2B, 0x01, 0x00, 0x86, -/* 000062B0 */ 0x2B, 0x01, 0x00, 0xC6, 0x2B, 0x01, 0x00, 0xC6, 0x2B, 0x01, 0x00, 0x04, 0x2C, 0x01, 0x00, 0x04, -/* 000062C0 */ 0x2C, 0x01, 0x00, 0x05, 0x2C, 0x01, 0x00, 0x05, 0x2C, 0x01, 0x00, 0x47, 0x2C, 0x01, 0x00, 0x47, -/* 000062D0 */ 0x2C, 0x01, 0x00, 0x48, 0x2C, 0x01, 0x00, 0x48, 0x2C, 0x01, 0x00, 0x5B, 0x2C, 0x01, 0x00, 0x5B, -/* 000062E0 */ 0x2C, 0x01, 0x00, 0x74, 0x2C, 0x01, 0x00, 0x74, 0x2C, 0x01, 0x00, 0xC9, 0x2C, 0x01, 0x00, 0xC9, -/* 000062F0 */ 0x2C, 0x01, 0x00, 0x40, 0x2D, 0x01, 0x00, 0x40, 0x2D, 0x01, 0x00, 0xE2, 0x2D, 0x01, 0x00, 0xE2, -/* 00006300 */ 0x2D, 0x01, 0x00, 0x86, 0x2E, 0x01, 0x00, 0x86, 0x2E, 0x01, 0x00, 0xEB, 0x2E, 0x01, 0x00, 0xEB, -/* 00006310 */ 0x2E, 0x01, 0x00, 0xFF, 0x2E, 0x01, 0x00, 0xFF, 0x2E, 0x01, 0x00, 0x28, 0x2F, 0x01, 0x00, 0x28, -/* 00006320 */ 0x2F, 0x01, 0x00, 0x29, 0x2F, 0x01, 0x00, 0x29, 0x2F, 0x01, 0x00, 0x3F, 0x2F, 0x01, 0x00, 0x3F, -/* 00006330 */ 0x2F, 0x01, 0x00, 0x8E, 0x2F, 0x01, 0x00, 0x8E, 0x2F, 0x01, 0x00, 0xCF, 0x2F, 0x01, 0x00, 0xCF, -/* 00006340 */ 0x2F, 0x01, 0x00, 0xED, 0x2F, 0x01, 0x00, 0xED, 0x2F, 0x01, 0x00, 0x17, 0x30, 0x01, 0x00, 0x17, -/* 00006350 */ 0x30, 0x01, 0x00, 0x41, 0x30, 0x01, 0x00, 0x41, 0x30, 0x01, 0x00, 0x42, 0x30, 0x01, 0x00, 0x42, -/* 00006360 */ 0x30, 0x01, 0x00, 0xB0, 0x30, 0x01, 0x00, 0xB0, 0x30, 0x01, 0x00, 0x06, 0x31, 0x01, 0x00, 0x06, -/* 00006370 */ 0x31, 0x01, 0x00, 0x5A, 0x31, 0x01, 0x00, 0x5A, 0x31, 0x01, 0x00, 0xC4, 0x31, 0x01, 0x00, 0xC4, -/* 00006380 */ 0x31, 0x01, 0x00, 0xEC, 0x31, 0x01, 0x00, 0xEC, 0x31, 0x01, 0x00, 0xFE, 0x31, 0x01, 0x00, 0xFE, -/* 00006390 */ 0x31, 0x01, 0x00, 0xFF, 0x31, 0x01, 0x00, 0xFF, 0x31, 0x01, 0x00, 0x23, 0x32, 0x01, 0x00, 0x23, -/* 000063A0 */ 0x32, 0x01, 0x00, 0x55, 0x32, 0x01, 0x00, 0x55, 0x32, 0x01, 0x00, 0xD5, 0x32, 0x01, 0x00, 0xD5, -/* 000063B0 */ 0x32, 0x01, 0x00, 0xE7, 0x32, 0x01, 0x00, 0xE7, 0x32, 0x01, 0x00, 0xE8, 0x32, 0x01, 0x00, 0xE8, -/* 000063C0 */ 0x32, 0x01, 0x00, 0xFE, 0x32, 0x01, 0x00, 0xFE, 0x32, 0x01, 0x00, 0x33, 0x33, 0x01, 0x00, 0x33, -/* 000063D0 */ 0x33, 0x01, 0x00, 0x73, 0x33, 0x01, 0x00, 0x73, 0x33, 0x01, 0x00, 0x91, 0x33, 0x01, 0x00, 0x91, -/* 000063E0 */ 0x33, 0x01, 0x00, 0xBB, 0x33, 0x01, 0x00, 0xBB, 0x33, 0x01, 0x00, 0xE5, 0x33, 0x01, 0x00, 0xE5, -/* 000063F0 */ 0x33, 0x01, 0x00, 0xE6, 0x33, 0x01, 0x00, 0xE6, 0x33, 0x01, 0x00, 0x48, 0x34, 0x01, 0x00, 0x48, -/* 00006400 */ 0x34, 0x01, 0x00, 0xCD, 0x34, 0x01, 0x00, 0xCD, 0x34, 0x01, 0x00, 0x32, 0x35, 0x01, 0x00, 0x32, -/* 00006410 */ 0x35, 0x01, 0x00, 0x6D, 0x35, 0x01, 0x00, 0x6D, 0x35, 0x01, 0x00, 0x7F, 0x35, 0x01, 0x00, 0x7F, -/* 00006420 */ 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0xAD, 0x35, 0x01, 0x00, 0xAD, -/* 00006430 */ 0x35, 0x01, 0x00, 0x12, 0x36, 0x01, 0x00, 0x12, 0x36, 0x01, 0x00, 0x13, 0x36, 0x01, 0x00, 0x13, -/* 00006440 */ 0x36, 0x01, 0x00, 0x95, 0x36, 0x01, 0x00, 0x95, 0x36, 0x01, 0x00, 0xD0, 0x36, 0x01, 0x00, 0xD0, -/* 00006450 */ 0x36, 0x01, 0x00, 0x2F, 0x37, 0x01, 0x00, 0x2F, 0x37, 0x01, 0x00, 0x41, 0x37, 0x01, 0x00, 0x41, -/* 00006460 */ 0x37, 0x01, 0x00, 0x84, 0x37, 0x01, 0x00, 0x84, 0x37, 0x01, 0x00, 0x92, 0x37, 0x01, 0x00, 0x92, -/* 00006470 */ 0x37, 0x01, 0x00, 0x93, 0x37, 0x01, 0x00, 0x93, 0x37, 0x01, 0x00, 0x01, 0x38, 0x01, 0x00, 0x01, -/* 00006480 */ 0x38, 0x01, 0x00, 0x4C, 0x38, 0x01, 0x00, 0x4C, 0x38, 0x01, 0x00, 0xA9, 0x38, 0x01, 0x00, 0xA9, -/* 00006490 */ 0x38, 0x01, 0x00, 0xBB, 0x38, 0x01, 0x00, 0xBB, 0x38, 0x01, 0x00, 0x0E, 0x39, 0x01, 0x00, 0x0E, -/* 000064A0 */ 0x39, 0x01, 0x00, 0x46, 0x39, 0x01, 0x00, 0x46, 0x39, 0x01, 0x00, 0x71, 0x39, 0x01, 0x00, 0x71, -/* 000064B0 */ 0x39, 0x01, 0x00, 0x83, 0x39, 0x01, 0x00, 0x83, 0x39, 0x01, 0x00, 0xBD, 0x39, 0x01, 0x00, 0xBD, -/* 000064C0 */ 0x39, 0x01, 0x00, 0x31, 0x3A, 0x01, 0x00, 0x31, 0x3A, 0x01, 0x00, 0x8F, 0x3A, 0x01, 0x00, 0x8F, -/* 000064D0 */ 0x3A, 0x01, 0x00, 0xA3, 0x3A, 0x01, 0x00, 0xA3, 0x3A, 0x01, 0x00, 0xA4, 0x3A, 0x01, 0x00, 0xA4, -/* 000064E0 */ 0x3A, 0x01, 0x00, 0x16, 0x3B, 0x01, 0x00, 0x16, 0x3B, 0x01, 0x00, 0x61, 0x3B, 0x01, 0x00, 0x61, -/* 000064F0 */ 0x3B, 0x01, 0x00, 0xC2, 0x3B, 0x01, 0x00, 0xC2, 0x3B, 0x01, 0x00, 0xD4, 0x3B, 0x01, 0x00, 0xD4, -/* 00006500 */ 0x3B, 0x01, 0x00, 0x27, 0x3C, 0x01, 0x00, 0x27, 0x3C, 0x01, 0x00, 0x5F, 0x3C, 0x01, 0x00, 0x5F, -/* 00006510 */ 0x3C, 0x01, 0x00, 0x8A, 0x3C, 0x01, 0x00, 0x8A, 0x3C, 0x01, 0x00, 0x9C, 0x3C, 0x01, 0x00, 0x9C, -/* 00006520 */ 0x3C, 0x01, 0x00, 0xD6, 0x3C, 0x01, 0x00, 0xD6, 0x3C, 0x01, 0x00, 0x4C, 0x3D, 0x01, 0x00, 0x4C, -/* 00006530 */ 0x3D, 0x01, 0x00, 0xAA, 0x3D, 0x01, 0x00, 0xAA, 0x3D, 0x01, 0x00, 0xBE, 0x3D, 0x01, 0x00, 0xBE, -/* 00006540 */ 0x3D, 0x01, 0x00, 0xBF, 0x3D, 0x01, 0x00, 0xBF, 0x3D, 0x01, 0x00, 0x31, 0x3E, 0x01, 0x00, 0x31, -/* 00006550 */ 0x3E, 0x01, 0x00, 0x7C, 0x3E, 0x01, 0x00, 0x7C, 0x3E, 0x01, 0x00, 0xDD, 0x3E, 0x01, 0x00, 0xDD, -/* 00006560 */ 0x3E, 0x01, 0x00, 0xEF, 0x3E, 0x01, 0x00, 0xEF, 0x3E, 0x01, 0x00, 0x42, 0x3F, 0x01, 0x00, 0x42, -/* 00006570 */ 0x3F, 0x01, 0x00, 0x7A, 0x3F, 0x01, 0x00, 0x7A, 0x3F, 0x01, 0x00, 0xA5, 0x3F, 0x01, 0x00, 0xA5, -/* 00006580 */ 0x3F, 0x01, 0x00, 0xB7, 0x3F, 0x01, 0x00, 0xB7, 0x3F, 0x01, 0x00, 0xF1, 0x3F, 0x01, 0x00, 0xF1, -/* 00006590 */ 0x3F, 0x01, 0x00, 0x67, 0x40, 0x01, 0x00, 0x67, 0x40, 0x01, 0x00, 0xC5, 0x40, 0x01, 0x00, 0xC5, -/* 000065A0 */ 0x40, 0x01, 0x00, 0xD9, 0x40, 0x01, 0x00, 0xD9, 0x40, 0x01, 0x00, 0xDA, 0x40, 0x01, 0x00, 0xDA, -/* 000065B0 */ 0x40, 0x01, 0x00, 0x01, 0x41, 0x01, 0x00, 0x01, 0x41, 0x01, 0x00, 0x2D, 0x41, 0x01, 0x00, 0x2D, -/* 000065C0 */ 0x41, 0x01, 0x00, 0x93, 0x41, 0x01, 0x00, 0x93, 0x41, 0x01, 0x00, 0x0A, 0x42, 0x01, 0x00, 0x0A, -/* 000065D0 */ 0x42, 0x01, 0x00, 0x7C, 0x42, 0x01, 0x00, 0x7C, 0x42, 0x01, 0x00, 0xA9, 0x42, 0x01, 0x00, 0xA9, -/* 000065E0 */ 0x42, 0x01, 0x00, 0xD6, 0x42, 0x01, 0x00, 0xD6, 0x42, 0x01, 0x00, 0x1D, 0x43, 0x01, 0x00, 0x1D, -/* 000065F0 */ 0x43, 0x01, 0x00, 0x64, 0x43, 0x01, 0x00, 0x64, 0x43, 0x01, 0x00, 0x65, 0x43, 0x01, 0x00, 0x65, -/* 00006600 */ 0x43, 0x01, 0x00, 0xA4, 0x43, 0x01, 0x00, 0xA4, 0x43, 0x01, 0x00, 0xE9, 0x43, 0x01, 0x00, 0xE9, -/* 00006610 */ 0x43, 0x01, 0x00, 0xFF, 0x43, 0x01, 0x00, 0xFF, 0x43, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, -/* 00006620 */ 0x44, 0x01, 0x00, 0x37, 0x44, 0x01, 0x00, 0x37, 0x44, 0x01, 0x00, 0x6B, 0x44, 0x01, 0x00, 0x6B, -/* 00006630 */ 0x44, 0x01, 0x00, 0xBA, 0x44, 0x01, 0x00, 0xBA, 0x44, 0x01, 0x00, 0xD0, 0x44, 0x01, 0x00, 0xD0, -/* 00006640 */ 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0x0C, 0x45, 0x01, 0x00, 0x0C, -/* 00006650 */ 0x45, 0x01, 0x00, 0x52, 0x45, 0x01, 0x00, 0x52, 0x45, 0x01, 0x00, 0x53, 0x45, 0x01, 0x00, 0x53, -/* 00006660 */ 0x45, 0x01, 0x00, 0x89, 0x45, 0x01, 0x00, 0x89, 0x45, 0x01, 0x00, 0xC8, 0x45, 0x01, 0x00, 0xC8, -/* 00006670 */ 0x45, 0x01, 0x00, 0x0D, 0x46, 0x01, 0x00, 0x0D, 0x46, 0x01, 0x00, 0x23, 0x46, 0x01, 0x00, 0x23, -/* 00006680 */ 0x46, 0x01, 0x00, 0x24, 0x46, 0x01, 0x00, 0x24, 0x46, 0x01, 0x00, 0x72, 0x46, 0x01, 0x00, 0x72, -/* 00006690 */ 0x46, 0x01, 0x00, 0x73, 0x46, 0x01, 0x00, 0x73, 0x46, 0x01, 0x00, 0xD9, 0x46, 0x01, 0x00, 0xD9, -/* 000066A0 */ 0x46, 0x01, 0x00, 0x15, 0x47, 0x01, 0x00, 0x15, 0x47, 0x01, 0x00, 0x16, 0x47, 0x01, 0x00, 0x16, -/* 000066B0 */ 0x47, 0x01, 0x00, 0x36, 0x47, 0x01, 0x00, 0x36, 0x47, 0x01, 0x00, 0x48, 0x47, 0x01, 0x00, 0x48, -/* 000066C0 */ 0x47, 0x01, 0x00, 0x92, 0x47, 0x01, 0x00, 0x92, 0x47, 0x01, 0x00, 0x93, 0x47, 0x01, 0x00, 0x93, -/* 000066D0 */ 0x47, 0x01, 0x00, 0xB7, 0x47, 0x01, 0x00, 0xB7, 0x47, 0x01, 0x00, 0xEB, 0x47, 0x01, 0x00, 0xEB, -/* 000066E0 */ 0x47, 0x01, 0x00, 0x58, 0x48, 0x01, 0x00, 0x58, 0x48, 0x01, 0x00, 0x6E, 0x48, 0x01, 0x00, 0x6E, -/* 000066F0 */ 0x48, 0x01, 0x00, 0xB5, 0x48, 0x01, 0x00, 0xB5, 0x48, 0x01, 0x00, 0x18, 0x49, 0x01, 0x00, 0x18, -/* 00006700 */ 0x49, 0x01, 0x00, 0x85, 0x49, 0x01, 0x00, 0x85, 0x49, 0x01, 0x00, 0x9B, 0x49, 0x01, 0x00, 0x9B, -/* 00006710 */ 0x49, 0x01, 0x00, 0x9C, 0x49, 0x01, 0x00, 0x9C, 0x49, 0x01, 0x00, 0xCD, 0x49, 0x01, 0x00, 0xCD, -/* 00006720 */ 0x49, 0x01, 0x00, 0x1B, 0x4A, 0x01, 0x00, 0x1B, 0x4A, 0x01, 0x00, 0x54, 0x4A, 0x01, 0x00, 0x54, -/* 00006730 */ 0x4A, 0x01, 0x00, 0x6E, 0x4A, 0x01, 0x00, 0x6E, 0x4A, 0x01, 0x00, 0xDD, 0x4A, 0x01, 0x00, 0xDD, -/* 00006740 */ 0x4A, 0x01, 0x00, 0xF3, 0x4A, 0x01, 0x00, 0xF3, 0x4A, 0x01, 0x00, 0xF4, 0x4A, 0x01, 0x00, 0xF4, -/* 00006750 */ 0x4A, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x5B, 0x4B, 0x01, 0x00, 0x5B, -/* 00006760 */ 0x4B, 0x01, 0x00, 0xAE, 0x4B, 0x01, 0x00, 0xAE, 0x4B, 0x01, 0x00, 0xAF, 0x4B, 0x01, 0x00, 0xAF, -/* 00006770 */ 0x4B, 0x01, 0x00, 0xF6, 0x4B, 0x01, 0x00, 0xF6, 0x4B, 0x01, 0x00, 0xF7, 0x4B, 0x01, 0x00, 0xF7, -/* 00006780 */ 0x4B, 0x01, 0x00, 0x94, 0x4C, 0x01, 0x00, 0x94, 0x4C, 0x01, 0x00, 0xDE, 0x4C, 0x01, 0x00, 0xDE, -/* 00006790 */ 0x4C, 0x01, 0x00, 0x7F, 0x4D, 0x01, 0x00, 0x7F, 0x4D, 0x01, 0x00, 0x80, 0x4D, 0x01, 0x00, 0x80, -/* 000067A0 */ 0x4D, 0x01, 0x00, 0xCB, 0x4D, 0x01, 0x00, 0xCB, 0x4D, 0x01, 0x00, 0x12, 0x4E, 0x01, 0x00, 0x12, -/* 000067B0 */ 0x4E, 0x01, 0x00, 0x4A, 0x4E, 0x01, 0x00, 0x4A, 0x4E, 0x01, 0x00, 0xBB, 0x4E, 0x01, 0x00, 0xBB, -/* 000067C0 */ 0x4E, 0x01, 0x00, 0xD5, 0x4E, 0x01, 0x00, 0xD5, 0x4E, 0x01, 0x00, 0xD6, 0x4E, 0x01, 0x00, 0xD6, -/* 000067D0 */ 0x4E, 0x01, 0x00, 0x21, 0x4F, 0x01, 0x00, 0x21, 0x4F, 0x01, 0x00, 0x88, 0x4F, 0x01, 0x00, 0x88, -/* 000067E0 */ 0x4F, 0x01, 0x00, 0xF9, 0x4F, 0x01, 0x00, 0xF9, 0x4F, 0x01, 0x00, 0x13, 0x50, 0x01, 0x00, 0x13, -/* 000067F0 */ 0x50, 0x01, 0x00, 0x14, 0x50, 0x01, 0x00, 0x14, 0x50, 0x01, 0x00, 0x4F, 0x50, 0x01, 0x00, 0x4F, -/* 00006800 */ 0x50, 0x01, 0x00, 0x8D, 0x50, 0x01, 0x00, 0x8D, 0x50, 0x01, 0x00, 0xA1, 0x50, 0x01, 0x00, 0xA1, -/* 00006810 */ 0x50, 0x01, 0x00, 0xA2, 0x50, 0x01, 0x00, 0xA2, 0x50, 0x01, 0x00, 0xF6, 0x50, 0x01, 0x00, 0xF6, -/* 00006820 */ 0x50, 0x01, 0x00, 0x2E, 0x51, 0x01, 0x00, 0x2E, 0x51, 0x01, 0x00, 0x66, 0x51, 0x01, 0x00, 0x66, -/* 00006830 */ 0x51, 0x01, 0x00, 0xE0, 0x51, 0x01, 0x00, 0xE0, 0x51, 0x01, 0x00, 0xFA, 0x51, 0x01, 0x00, 0xFA, -/* 00006840 */ 0x51, 0x01, 0x00, 0x45, 0x52, 0x01, 0x00, 0x45, 0x52, 0x01, 0x00, 0xAC, 0x52, 0x01, 0x00, 0xAC, -/* 00006850 */ 0x52, 0x01, 0x00, 0x26, 0x53, 0x01, 0x00, 0x26, 0x53, 0x01, 0x00, 0x40, 0x53, 0x01, 0x00, 0x40, -/* 00006860 */ 0x53, 0x01, 0x00, 0x72, 0x53, 0x01, 0x00, 0x72, 0x53, 0x01, 0x00, 0xAD, 0x53, 0x01, 0x00, 0xAD, -/* 00006870 */ 0x53, 0x01, 0x00, 0x04, 0x54, 0x01, 0x00, 0x04, 0x54, 0x01, 0x00, 0x69, 0x54, 0x01, 0x00, 0x69, -/* 00006880 */ 0x54, 0x01, 0x00, 0xA8, 0x54, 0x01, 0x00, 0xA8, 0x54, 0x01, 0x00, 0xE3, 0x54, 0x01, 0x00, 0xE3, -/* 00006890 */ 0x54, 0x01, 0x00, 0x20, 0x55, 0x01, 0x00, 0x20, 0x55, 0x01, 0x00, 0x55, 0x55, 0x01, 0x00, 0x55, -/* 000068A0 */ 0x55, 0x01, 0x00, 0x8C, 0x55, 0x01, 0x00, 0x8C, 0x55, 0x01, 0x00, 0xC5, 0x55, 0x01, 0x00, 0xC5, -/* 000068B0 */ 0x55, 0x01, 0x00, 0xFA, 0x55, 0x01, 0x00, 0xFA, 0x55, 0x01, 0x00, 0x31, 0x56, 0x01, 0x00, 0x31, -/* 000068C0 */ 0x56, 0x01, 0x00, 0x6C, 0x56, 0x01, 0x00, 0x6C, 0x56, 0x01, 0x00, 0xA7, 0x56, 0x01, 0x00, 0xA7, -/* 000068D0 */ 0x56, 0x01, 0x00, 0xED, 0x56, 0x01, 0x00, 0xED, 0x56, 0x01, 0x00, 0x0E, 0x57, 0x01, 0x00, 0x0E, -/* 000068E0 */ 0x57, 0x01, 0x00, 0x4C, 0x57, 0x01, 0x00, 0x4C, 0x57, 0x01, 0x00, 0xBE, 0x57, 0x01, 0x00, 0xBE, -/* 000068F0 */ 0x57, 0x01, 0x00, 0x60, 0x58, 0x01, 0x00, 0x60, 0x58, 0x01, 0x00, 0x9C, 0x58, 0x01, 0x00, 0x9C, -/* 00006900 */ 0x58, 0x01, 0x00, 0xBA, 0x58, 0x01, 0x00, 0xBA, 0x58, 0x01, 0x00, 0xE4, 0x58, 0x01, 0x00, 0xE4, -/* 00006910 */ 0x58, 0x01, 0x00, 0x2C, 0x59, 0x01, 0x00, 0x2C, 0x59, 0x01, 0x00, 0x79, 0x59, 0x01, 0x00, 0x79, -/* 00006920 */ 0x59, 0x01, 0x00, 0x8D, 0x59, 0x01, 0x00, 0x8D, 0x59, 0x01, 0x00, 0x8E, 0x59, 0x01, 0x00, 0x8E, -/* 00006930 */ 0x59, 0x01, 0x00, 0x2C, 0x5A, 0x01, 0x00, 0x2C, 0x5A, 0x01, 0x00, 0x2D, 0x5A, 0x01, 0x00, 0x2D, -/* 00006940 */ 0x5A, 0x01, 0x00, 0x54, 0x5A, 0x01, 0x00, 0x54, 0x5A, 0x01, 0x00, 0x62, 0x5A, 0x01, 0x00, 0x62, -/* 00006950 */ 0x5A, 0x01, 0x00, 0x6C, 0x5A, 0x01, 0x00, 0x6C, 0x5A, 0x01, 0x00, 0xBD, 0x5A, 0x01, 0x00, 0xBD, -/* 00006960 */ 0x5A, 0x01, 0x00, 0xD7, 0x5A, 0x01, 0x00, 0xD7, 0x5A, 0x01, 0x00, 0xE1, 0x5A, 0x01, 0x00, 0xE1, -/* 00006970 */ 0x5A, 0x01, 0x00, 0xE2, 0x5A, 0x01, 0x00, 0xE2, 0x5A, 0x01, 0x00, 0x13, 0x5B, 0x01, 0x00, 0x13, -/* 00006980 */ 0x5B, 0x01, 0x00, 0x32, 0x5B, 0x01, 0x00, 0x32, 0x5B, 0x01, 0x00, 0xC8, 0x5B, 0x01, 0x00, 0xC8, -/* 00006990 */ 0x5B, 0x01, 0x00, 0x5E, 0x5C, 0x01, 0x00, 0x5E, 0x5C, 0x01, 0x00, 0xF4, 0x5C, 0x01, 0x00, 0xF4, -/* 000069A0 */ 0x5C, 0x01, 0x00, 0x8A, 0x5D, 0x01, 0x00, 0x8A, 0x5D, 0x01, 0x00, 0x90, 0x5D, 0x01, 0x00, 0x90, -/* 000069B0 */ 0x5D, 0x01, 0x00, 0x94, 0x5D, 0x01, 0x00, 0x94, 0x5D, 0x01, 0x00, 0x50, 0xB9, 0xDC, 0x00, 0x00, -/* 000069C0 */ 0x00, 0xFC, 0x09, 0xFE, 0xD7, 0x02, 0xFF, 0xA8, 0x41, 0xC0, 0x00, 0x00, 0x00, 0xFE, 0x70, 0x01, -/* 000069D0 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFF, 0x24, 0x5C, 0x01, 0x00, 0xFF, 0x24, -/* 000069E0 */ 0x5C, 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000069F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xD8, 0x02, 0x07, -/* 00006A10 */ 0x0C, 0xA8, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 00006A20 */ 0x00, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6A, 0x00, 0x00, 0xBF, 0xFD, 0x00, 0x04, 0x4F, -/* 00006A30 */ 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x01, 0x00, -/* 00006A40 */ 0xFE, 0x90, 0x01, 0x22, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x90, 0x01, 0xFF, 0x01, -/* 00006A50 */ 0x5C, 0x01, 0x00, 0xFF, 0x01, 0x5C, 0x01, 0x00, 0x40, 0x4B, 0x18, 0x30, 0x44, 0x09, 0xFE, 0x3A, -/* 00006A60 */ 0x02, 0xFE, 0x34, 0x02, 0x0F, 0x44, 0x43, 0x44, 0x44, 0x14, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A70 */ 0x42, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A80 */ 0xFF, 0x00, 0x00, 0x08, 0x02, 0x01, 0xFE, 0xD9, 0x02, 0x02, 0x01, 0xFE, 0xDA, 0x02, 0x02, 0x01, -/* 00006A90 */ 0xFE, 0xDB, 0x02, 0x02, 0x01, 0xFE, 0xDC, 0x02, 0x02, 0x01, 0xFE, 0xDD, 0x02, 0x03, 0x04, 0x02, -/* 00006AA0 */ 0x01, 0xFE, 0xDE, 0x02, 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x02, 0x00, 0xFE, 0xE0, 0x02, 0x02, 0x00, -/* 00006AB0 */ 0xFE, 0xE1, 0x02, 0x02, 0x00, 0xFE, 0xE2, 0x02, 0x02, 0x00, 0xFE, 0xE3, 0x02, 0x02, 0x01, 0xFE, -/* 00006AC0 */ 0xE4, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x00, 0xFE, 0xE7, -/* 00006AD0 */ 0x02, 0x02, 0x01, 0xFE, 0xE8, 0x02, 0x02, 0x01, 0xFE, 0xE9, 0x02, 0x02, 0x00, 0xFE, 0xEA, 0x02, -/* 00006AE0 */ 0x02, 0x01, 0xFE, 0xEB, 0x02, 0x02, 0x01, 0xFE, 0xEC, 0x02, 0x02, 0x01, 0xFE, 0xED, 0x02, 0x02, -/* 00006AF0 */ 0x00, 0xFE, 0xEE, 0x02, 0x02, 0x01, 0xFE, 0xEF, 0x02, 0x02, 0x01, 0xFE, 0xF0, 0x02, 0x02, 0x00, -/* 00006B00 */ 0xFE, 0xF1, 0x02, 0x02, 0x01, 0xFE, 0xF2, 0x02, 0x02, 0x01, 0xFE, 0xF3, 0x02, 0x02, 0x00, 0xFE, -/* 00006B10 */ 0xF4, 0x02, 0x02, 0x01, 0xFE, 0xF5, 0x02, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x01, 0xFE, 0xF7, -/* 00006B20 */ 0x02, 0x02, 0x01, 0xFE, 0xF8, 0x02, 0x02, 0x01, 0xFE, 0xF9, 0x02, 0x02, 0x01, 0xFE, 0xFA, 0x02, -/* 00006B30 */ 0x02, 0x01, 0xFE, 0xFB, 0x02, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x02, -/* 00006B40 */ 0x01, 0xFE, 0xFE, 0x02, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, -/* 00006B50 */ 0x01, 0xFE, 0x01, 0x03, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xFE, 0x65, 0x0A, 0x96, 0x38, 0x00, 0x00, -/* 00006B60 */ 0x00, 0x31, 0xD4, 0x0F, 0x00, 0x00, 0x00, 0x32, 0x96, 0x02, 0x00, 0x00, 0x00, 0x32, 0xD4, 0x10, -/* 00006B70 */ 0x00, 0x00, 0x00, 0x33, 0x96, 0x03, 0x00, 0x00, 0x00, 0x33, 0xD4, 0x11, 0x00, 0x00, 0x00, 0x34, -/* 00006B80 */ 0x96, 0x04, 0x00, 0x00, 0x00, 0x34, 0xD4, 0x12, 0x00, 0x00, 0x00, 0x35, 0x96, 0x05, 0x00, 0x00, -/* 00006B90 */ 0x00, 0x35, 0xD4, 0x13, 0x00, 0x00, 0x00, 0x36, 0x96, 0x06, 0x00, 0x00, 0x00, 0x36, 0xD4, 0x14, -/* 00006BA0 */ 0x00, 0x00, 0x00, 0x37, 0x96, 0x07, 0x00, 0x00, 0x00, 0x37, 0xD4, 0x15, 0x00, 0x00, 0x00, 0x38, -/* 00006BB0 */ 0x96, 0x08, 0x00, 0x00, 0x00, 0x38, 0x4F, 0x39, 0x4F, 0x3C, 0x4F, 0x3D, 0x4F, 0x44, 0x96, 0x39, -/* 00006BC0 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3A, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3B, -/* 00006BD0 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3C, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3D, -/* 00006BE0 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3E, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3F, -/* 00006BF0 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x40, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x41, -/* 00006C00 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x42, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x43, -/* 00006C10 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x44, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x45, -/* 00006C20 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x46, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x47, -/* 00006C30 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x48, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x49, -/* 00006C40 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4A, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4B, -/* 00006C50 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4C, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x30, 0x00, -/* 00006C60 */ 0x96, 0x09, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x76, 0x02, 0x44, 0x01, -/* 00006C70 */ 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x02, 0xA8, 0x45, 0x14, 0x03, 0x00, 0x44, -/* 00006C80 */ 0x45, 0x09, 0x1B, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x45, -/* 00006C90 */ 0x61, 0x45, 0x45, 0x03, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x45, 0x45, 0x76, 0x45, 0x44, 0x04, 0x92, -/* 00006CA0 */ 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x05, 0xA8, 0x45, 0x14, 0x03, 0x00, 0x44, 0x45, -/* 00006CB0 */ 0x09, 0x1B, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x45, 0x61, -/* 00006CC0 */ 0x45, 0x45, 0x03, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x45, 0x45, 0x76, 0x45, 0x44, 0x06, 0x92, 0x09, -/* 00006CD0 */ 0x00, 0x00, 0x00, 0x45, 0x61, 0x45, 0x45, 0x07, 0xAC, 0x44, 0x0F, 0x02, 0x00, 0x45, 0xAB, 0x44, -/* 00006CE0 */ 0x96, 0x39, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x08, -/* 00006CF0 */ 0x47, 0x39, 0x44, 0x96, 0x3A, 0x00, 0x00, 0x00, 0x03, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D00 */ 0x44, 0x44, 0x09, 0x96, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D10 */ 0x44, 0x44, 0x0A, 0x96, 0x0B, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D20 */ 0x44, 0x44, 0x0B, 0x96, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D30 */ 0x44, 0x44, 0x0C, 0x96, 0x0D, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D40 */ 0x44, 0x44, 0x0D, 0x96, 0x0E, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D50 */ 0x44, 0x44, 0x0E, 0x96, 0x0F, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D60 */ 0x44, 0x44, 0x0F, 0x96, 0x10, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D70 */ 0x44, 0x44, 0x10, 0x96, 0x11, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D80 */ 0x44, 0x44, 0x11, 0x96, 0x12, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D90 */ 0x44, 0x44, 0x12, 0x96, 0x13, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006DA0 */ 0x44, 0x44, 0x13, 0x47, 0x3A, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x14, -/* 00006DB0 */ 0x96, 0x14, 0x00, 0x00, 0x00, 0x44, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x07, 0x03, 0x00, 0x5C, -/* 00006DC0 */ 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x92, -/* 00006DD0 */ 0x09, 0x00, 0x00, 0x00, 0x46, 0x61, 0x46, 0x46, 0x15, 0x7A, 0x46, 0x45, 0x16, 0x92, 0x09, 0x00, -/* 00006DE0 */ 0x00, 0x00, 0x46, 0x61, 0x46, 0x46, 0x17, 0x7A, 0x46, 0x45, 0x18, 0x92, 0x09, 0x00, 0x00, 0x00, -/* 00006DF0 */ 0x46, 0x61, 0x46, 0x46, 0x19, 0x7A, 0x46, 0x45, 0x1A, 0x92, 0x09, 0x00, 0x00, 0x00, 0x46, 0x61, -/* 00006E00 */ 0x46, 0x46, 0x1B, 0x7A, 0x46, 0x45, 0x1C, 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x44, -/* 00006E10 */ 0x44, 0x96, 0x15, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E20 */ 0x1D, 0x96, 0x16, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E30 */ 0x1E, 0x96, 0x17, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E40 */ 0x1F, 0x96, 0x18, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E50 */ 0x20, 0x96, 0x19, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E60 */ 0x21, 0x96, 0x1A, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x44, 0x96, 0x1B, 0x00, -/* 00006E70 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x22, 0x96, 0x1C, 0x00, -/* 00006E80 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x23, 0x96, 0x1D, 0x00, -/* 00006E90 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x24, 0x96, 0x1E, 0x00, -/* 00006EA0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x25, 0x96, 0x1F, 0x00, -/* 00006EB0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x26, 0x96, 0x20, 0x00, -/* 00006EC0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x27, 0x96, 0x21, 0x00, -/* 00006ED0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x28, 0x96, 0x22, 0x00, -/* 00006EE0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x29, 0x96, 0x23, 0x00, -/* 00006EF0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x2A, 0x96, 0x24, 0x00, -/* 00006F00 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x2B, 0x96, 0x25, 0x00, -/* 00006F10 */ 0x00, 0x00, 0x44, 0x92, 0x16, 0x00, 0x00, 0x00, 0x44, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0xCB, -/* 00006F20 */ 0x45, 0x5C, 0x01, 0x45, 0x1F, 0x02, 0x44, 0x44, 0x47, 0x3B, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, -/* 00006F30 */ 0x44, 0x61, 0x44, 0x44, 0x2C, 0x96, 0x26, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, -/* 00006F40 */ 0x44, 0x61, 0x44, 0x44, 0x2D, 0x96, 0x27, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x3B, 0x00, -/* 00006F50 */ 0x00, 0x00, 0x44, 0xD4, 0x01, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3C, 0x00, 0x00, 0x00, 0x44, 0xD4, -/* 00006F60 */ 0x02, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3D, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x03, 0x00, 0x00, 0x00, -/* 00006F70 */ 0x44, 0x96, 0x3E, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3F, 0x00, -/* 00006F80 */ 0x00, 0x00, 0x44, 0xD4, 0x05, 0x00, 0x00, 0x00, 0x44, 0x96, 0x28, 0x00, 0x00, 0x00, 0x44, 0xD4, -/* 00006F90 */ 0x06, 0x00, 0x00, 0x00, 0x44, 0x96, 0x29, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x07, 0x00, 0x00, 0x00, -/* 00006FA0 */ 0x44, 0x96, 0x2A, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x08, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2B, 0x00, -/* 00006FB0 */ 0x00, 0x00, 0x44, 0xD4, 0x09, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2C, 0x00, 0x00, 0x00, 0x44, 0xD4, -/* 00006FC0 */ 0x0A, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2D, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0B, 0x00, 0x00, 0x00, -/* 00006FD0 */ 0x44, 0x96, 0x2E, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2F, 0x00, -/* 00006FE0 */ 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x40, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0D, 0x00, 0x00, 0x00, -/* 00006FF0 */ 0x44, 0x96, 0x30, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0E, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, -/* 00007000 */ 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x96, 0x31, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, -/* 00007010 */ 0x41, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x42, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, -/* 00007020 */ 0x43, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x44, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x16, 0x00, -/* 00007030 */ 0x00, 0x00, 0x44, 0x96, 0x32, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x17, 0x00, 0x00, 0x00, 0x44, 0x96, -/* 00007040 */ 0x33, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x18, 0x00, 0x00, 0x00, 0x44, 0x96, 0x34, 0x00, 0x00, 0x00, -/* 00007050 */ 0x44, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x45, 0x5C, -/* 00007060 */ 0x01, 0x45, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x44, 0x44, 0x54, 0x3C, 0x44, 0x92, 0x09, 0x00, 0x00, -/* 00007070 */ 0x00, 0x45, 0x6C, 0x44, 0x45, 0x2E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x45, 0x5C, 0x01, 0x3C, 0x92, -/* 00007080 */ 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x00, 0x00, 0x00, -/* 00007090 */ 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x0B, 0x47, 0x2F, 0x5C, 0x01, 0x47, 0x5C, -/* 000070A0 */ 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x5C, 0x02, 0x46, 0x1F, 0x03, 0xFF, 0x44, 0x96, 0x45, 0x00, -/* 000070B0 */ 0x00, 0x00, 0x0C, 0x92, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, -/* 000070C0 */ 0x20, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x92, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x07, 0x03, -/* 000070D0 */ 0x00, 0x5C, 0x00, 0x09, 0x92, 0x45, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x01, 0x46, 0xD4, 0x19, 0x00, -/* 000070E0 */ 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0x1F, 0x03, 0x45, 0x45, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, -/* 000070F0 */ 0x1F, 0x04, 0x44, 0x44, 0x96, 0x46, 0x00, 0x00, 0x00, 0x44, 0x96, 0x47, 0x00, 0x00, 0x00, 0x0D, -/* 00007100 */ 0x92, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x00, 0x00, -/* 00007110 */ 0x00, 0x45, 0x5C, 0x01, 0x45, 0x92, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00007120 */ 0x09, 0x92, 0x47, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x01, 0x46, 0xD4, 0x1A, 0x00, 0x00, 0x00, 0x46, -/* 00007130 */ 0x5C, 0x02, 0x46, 0x1F, 0x03, 0x45, 0x45, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0x1F, 0x04, 0x44, -/* 00007140 */ 0x44, 0x96, 0x48, 0x00, 0x00, 0x00, 0x44, 0x96, 0x49, 0x00, 0x00, 0x00, 0x0E, 0x92, 0x0C, 0x00, -/* 00007150 */ 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x00, 0x00, 0x00, 0x45, 0x5C, -/* 00007160 */ 0x01, 0x45, 0x92, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x49, -/* 00007170 */ 0x00, 0x00, 0x00, 0x46, 0x5C, 0x01, 0x46, 0xD4, 0x1B, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, -/* 00007180 */ 0x1F, 0x03, 0x45, 0x45, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0x1F, 0x04, 0x44, 0x44, 0x96, 0x4A, -/* 00007190 */ 0x00, 0x00, 0x00, 0x44, 0x96, 0x4B, 0x00, 0x00, 0x00, 0x0F, 0x92, 0x0C, 0x00, 0x00, 0x00, 0x44, -/* 000071A0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x92, -/* 000071B0 */ 0x2A, 0x00, 0x00, 0x00, 0x45, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x4B, 0x00, 0x00, 0x00, -/* 000071C0 */ 0x46, 0x5C, 0x01, 0x46, 0xD4, 0x1C, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0x1F, 0x03, 0x45, -/* 000071D0 */ 0x45, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0x1F, 0x04, 0x44, 0x44, 0x54, 0x3D, 0x44, 0x92, 0x1B, -/* 000071E0 */ 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x46, 0x00, 0x00, 0x00, 0x45, -/* 000071F0 */ 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x10, 0xCC, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x45, -/* 00007200 */ 0x00, 0x00, 0x00, 0x7A, 0x12, 0x45, 0x30, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, -/* 00007210 */ 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x48, 0x00, 0x00, 0x00, 0x45, -/* 00007220 */ 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x10, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x45, -/* 00007230 */ 0x00, 0x00, 0x00, 0x7A, 0x12, 0x45, 0x30, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, -/* 00007240 */ 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x4A, 0x00, 0x00, 0x00, 0x45, -/* 00007250 */ 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x10, 0xCC, 0x3C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x45, -/* 00007260 */ 0x00, 0x00, 0x00, 0x7A, 0x12, 0x45, 0x30, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, -/* 00007270 */ 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x3D, 0x5C, 0x02, 0x10, -/* 00007280 */ 0xCC, 0x48, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7A, 0x13, 0x45, -/* 00007290 */ 0x30, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x07, 0x03, -/* 000072A0 */ 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x54, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, -/* 000072B0 */ 0x00, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x80, 0x00, -/* 000072C0 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x16, 0x47, 0x31, 0x5C, 0x01, -/* 000072D0 */ 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x32, 0x92, 0x0A, 0x00, 0x00, -/* 000072E0 */ 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x8C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, -/* 000072F0 */ 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x16, 0x47, 0x31, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, -/* 00007300 */ 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x33, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, -/* 00007310 */ 0x5C, 0x00, 0x09, 0xCC, 0x98, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, -/* 00007320 */ 0x7A, 0x1A, 0x47, 0x34, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, -/* 00007330 */ 0x45, 0x35, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xA4, -/* 00007340 */ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x47, 0x36, 0x5C, -/* 00007350 */ 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x37, 0x92, 0x0A, 0x00, -/* 00007360 */ 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 00007370 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x20, 0x47, 0x38, 0x7A, 0x1D, 0x47, 0x36, 0x7A, 0x22, -/* 00007380 */ 0x47, 0x39, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3A, -/* 00007390 */ 0x92, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xC4, 0x00, 0x00, -/* 000073A0 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x47, 0x36, 0x7A, 0x22, 0x47, -/* 000073B0 */ 0x39, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3B, 0x92, -/* 000073C0 */ 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xD4, 0x00, 0x00, 0x00, -/* 000073D0 */ 0x0D, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x47, 0x36, 0x7A, 0x22, 0x47, 0x39, -/* 000073E0 */ 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3C, 0x92, 0x0A, -/* 000073F0 */ 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xE4, 0x00, 0x00, 0x00, 0x0E, -/* 00007400 */ 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x21, 0x47, 0x39, 0x7A, 0x22, 0x47, 0x3D, 0x5C, -/* 00007410 */ 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3E, 0x92, 0x0A, 0x00, -/* 00007420 */ 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xF4, 0x00, 0x00, 0x00, 0x0F, 0x00, -/* 00007430 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x21, 0x47, 0x39, 0x7A, 0x22, 0x47, 0x3D, 0x5C, 0x01, -/* 00007440 */ 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3F, 0x5C, 0x01, 0x45, 0x5C, -/* 00007450 */ 0x02, 0x08, 0x1F, 0x03, 0x44, 0x44, 0x96, 0x35, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1D, 0x00, 0x00, -/* 00007460 */ 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x96, 0x36, 0x00, 0x00, -/* 00007470 */ 0x00, 0x44, 0xA8, 0x44, 0x96, 0x4C, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1E, 0x00, 0x00, 0x00, 0x44, -/* 00007480 */ 0x96, 0x37, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1F, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, -/* 00007490 */ 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x47, 0x3E, 0x44, 0xD4, 0x20, 0x00, 0x00, 0x00, 0x44, 0x07, -/* 000074A0 */ 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x47, 0x3F, 0x44, 0xD4, 0x21, 0x00, 0x00, -/* 000074B0 */ 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x47, 0x40, 0x44, 0x92, -/* 000074C0 */ 0x38, 0x00, 0x00, 0x00, 0x44, 0x14, 0x03, 0x00, 0x44, 0x28, 0x09, 0xF0, 0x00, 0x92, 0x1B, 0x00, -/* 000074D0 */ 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, -/* 000074E0 */ 0x01, 0x45, 0x5C, 0x02, 0x29, 0xCC, 0x04, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, -/* 000074F0 */ 0x00, 0x00, 0x7A, 0x3E, 0x45, 0x30, 0x7A, 0x02, 0x45, 0x40, 0x7A, 0x2C, 0x45, 0x41, 0x7A, 0x02, -/* 00007500 */ 0x45, 0x42, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x07, -/* 00007510 */ 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5C, 0x02, -/* 00007520 */ 0x2E, 0xCC, 0x1C, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7A, 0x3F, -/* 00007530 */ 0x45, 0x30, 0x7A, 0x02, 0x45, 0x40, 0x7A, 0x2C, 0x45, 0x41, 0x7A, 0x02, 0x45, 0x42, 0x5C, 0x03, -/* 00007540 */ 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 00007550 */ 0x09, 0x6A, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x2F, 0xCC, 0x34, 0x01, -/* 00007560 */ 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7A, 0x40, 0x45, 0x30, 0x7A, 0x02, -/* 00007570 */ 0x45, 0x40, 0x7A, 0x2C, 0x45, 0x41, 0x7A, 0x02, 0x45, 0x42, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, -/* 00007580 */ 0x44, 0x92, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x43, 0x00, -/* 00007590 */ 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x13, 0xCC, 0x4C, 0x01, 0x00, 0x00, 0x13, 0x00, -/* 000075A0 */ 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7A, 0x3D, 0x45, 0x30, 0x7A, 0x02, 0x45, 0x40, 0x7A, 0x2C, -/* 000075B0 */ 0x45, 0x41, 0x7A, 0x02, 0x45, 0x42, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0xA8, 0x00, 0x24, -/* 000075C0 */ 0x00, 0x14, 0xFE, 0x64, 0x01, 0x00, 0x4C, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, -/* 000075D0 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, -/* 000075E0 */ 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, -/* 000075F0 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x1C, 0x01, -/* 00007600 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, -/* 00007610 */ 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x03, 0x04, -/* 00007620 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, -/* 00007630 */ 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0xF4, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, -/* 00007640 */ 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xFA, 0x02, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x03, 0x02, -/* 00007650 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xFA, 0x02, 0x00, 0x00, 0xD4, 0x00, -/* 00007660 */ 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, 0x02, -/* 00007670 */ 0x00, 0x00, 0xC4, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, -/* 00007680 */ 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, -/* 00007690 */ 0x00, 0x00, 0xF3, 0x02, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xA4, 0x00, -/* 000076A0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x98, 0x00, -/* 000076B0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0x02, 0x00, 0x00, 0x8C, 0x00, -/* 000076C0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x00, 0x80, 0x00, -/* 000076D0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x00, 0x54, 0x00, -/* 000076E0 */ 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x02, 0x00, 0x00, 0xEB, 0x02, -/* 000076F0 */ 0x00, 0x00, 0xEC, 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0xF7, 0x02, -/* 00007700 */ 0x00, 0x00, 0xF8, 0x02, 0x00, 0x00, 0xF9, 0x02, 0x00, 0x00, 0xFB, 0x02, 0x00, 0x00, 0x48, 0x00, -/* 00007710 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x3C, 0x00, -/* 00007720 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x30, 0x00, -/* 00007730 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x24, 0x00, -/* 00007740 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x00, -/* 00007750 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x00, 0x00, -/* 00007760 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1F, 0x00, -/* 00007770 */ 0x00, 0x00, 0x1E, 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xFE, 0x03, 0x03, 0xFE, -/* 00007780 */ 0x04, 0x03, 0xF6, 0xFE, 0x04, 0x03, 0xFE, 0x05, 0x03, 0xFE, 0x05, 0x03, 0xFE, 0xAA, 0x02, 0xFE, -/* 00007790 */ 0xAA, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x38, 0x02, 0x84, 0xFE, 0x32, 0x01, 0xFE, -/* 000077A0 */ 0x58, 0x01, 0xFE, 0x2D, 0x01, 0xFE, 0x7A, 0x01, 0x95, 0xA7, 0xF6, 0xFE, 0x08, 0x02, 0xFE, 0x3A, -/* 000077B0 */ 0x02, 0x17, 0xFE, 0x3B, 0x02, 0x1F, 0xFE, 0x3C, 0x02, 0xFE, 0x1E, 0x01, 0xFE, 0x3D, 0x02, 0x25, -/* 000077C0 */ 0xFE, 0x3F, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x41, 0x02, 0xFE, 0x42, 0x02, 0xFE, 0x3E, 0x02, 0xFE, -/* 000077D0 */ 0x46, 0x02, 0xFE, 0x47, 0x02, 0xFE, 0x48, 0x02, 0xFE, 0x49, 0x02, 0xFE, 0x4A, 0x02, 0xFE, 0x4B, -/* 000077E0 */ 0x02, 0xFE, 0x4C, 0x02, 0xFE, 0x4F, 0x02, 0xFE, 0x50, 0x02, 0xFE, 0x51, 0x02, 0xFE, 0x52, 0x02, -/* 000077F0 */ 0xFE, 0x53, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x61, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xE9, 0x02, 0xFE, -/* 00007800 */ 0xE8, 0x02, 0xFE, 0xEB, 0x02, 0xFE, 0xED, 0x02, 0xFE, 0xEC, 0x02, 0xFE, 0xF0, 0x02, 0xFE, 0xEF, -/* 00007810 */ 0x02, 0xFE, 0xF3, 0x02, 0xFE, 0xF5, 0x02, 0xFE, 0xF2, 0x02, 0xFE, 0xF7, 0x02, 0xFE, 0xF8, 0x02, -/* 00007820 */ 0xFE, 0xFA, 0x02, 0xFE, 0xF9, 0x02, 0xFE, 0xFB, 0x02, 0xFE, 0xB3, 0x01, 0xFE, 0xB1, 0x01, 0xFE, -/* 00007830 */ 0xB2, 0x01, 0xDB, 0xFE, 0x06, 0x03, 0xFE, 0x07, 0x03, 0xFE, 0x08, 0x03, 0xFE, 0x09, 0x03, 0xFE, -/* 00007840 */ 0x0A, 0x03, 0xFE, 0x0B, 0x03, 0xFE, 0x0C, 0x03, 0xFE, 0x0D, 0x03, 0xFE, 0x0E, 0x03, 0xFE, 0x0F, -/* 00007850 */ 0x03, 0xFE, 0x10, 0x03, 0x84, 0xFE, 0x32, 0x01, 0xFE, 0x58, 0x01, 0xFE, 0x2D, 0x01, 0xFE, 0x7A, -/* 00007860 */ 0x01, 0x95, 0xA7, 0xFE, 0x11, 0x03, 0xF7, 0xFE, 0x12, 0x03, 0xFE, 0x13, 0x03, 0xFE, 0x14, 0x03, -/* 00007870 */ 0xFE, 0x15, 0x03, 0xFE, 0x16, 0x03, 0xFE, 0x17, 0x03, 0xFE, 0x18, 0x03, 0xFE, 0x19, 0x03, 0xFE, -/* 00007880 */ 0x1A, 0x03, 0xFE, 0x1B, 0x03, 0xFE, 0x1C, 0x03, 0xFE, 0x1D, 0x03, 0xFE, 0x1E, 0x03, 0xFE, 0x1F, -/* 00007890 */ 0x03, 0xFE, 0x20, 0x03, 0xFE, 0x21, 0x03, 0xE0, 0xE3, 0xFE, 0x22, 0x03, 0xFE, 0x23, 0x03, 0xFE, -/* 000078A0 */ 0x24, 0x03, 0xFE, 0x2A, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x25, 0x03, 0xFE, 0x26, 0x03, 0xFE, 0x27, -/* 000078B0 */ 0x03, 0xFE, 0x28, 0x03, 0xFE, 0x29, 0x03, 0xFE, 0x2A, 0x03, 0xFE, 0x2B, 0x03, 0xFE, 0x79, 0x02, -/* 000078C0 */ 0xFE, 0x2C, 0x03, 0xFE, 0x2D, 0x03, 0xFE, 0x2E, 0x03, 0xFE, 0x2F, 0x03, 0xFE, 0x30, 0x03, 0xFE, -/* 000078D0 */ 0xD9, 0x02, 0xFE, 0x31, 0x03, 0xFE, 0x32, 0x03, 0xFE, 0x33, 0x03, 0xFE, 0x34, 0x03, 0xFE, 0x35, -/* 000078E0 */ 0x03, 0xFE, 0x36, 0x03, 0xFE, 0x37, 0x03, 0xFE, 0x38, 0x03, 0xFE, 0x39, 0x03, 0xFE, 0x3A, 0x03, -/* 000078F0 */ 0xFE, 0x3B, 0x03, 0xFE, 0x3C, 0x03, 0xFE, 0x3D, 0x03, 0xFE, 0x3E, 0x03, 0xFE, 0x3F, 0x03, 0xFE, -/* 00007900 */ 0x40, 0x03, 0xFE, 0x41, 0x03, 0xFE, 0x42, 0x03, 0x00, 0xFE, 0xBB, 0x01, 0x5B, 0x00, 0x01, 0x00, -/* 00007910 */ 0x00, 0x0A, 0x00, 0xA4, 0x00, 0x0A, 0x00, 0x20, 0x00, 0x14, 0x00, 0x38, 0x00, 0x1B, 0x00, 0x3B, -/* 00007920 */ 0x00, 0x14, 0x00, 0x39, 0x00, 0x1B, 0x00, 0xD4, 0x00, 0x18, 0x00, 0x30, 0x00, 0x0D, 0x00, 0x45, -/* 00007930 */ 0x00, 0x06, 0x00, 0x35, 0x00, 0x10, 0x00, 0x35, 0x00, 0x10, 0x00, 0x39, 0x00, 0x10, 0x00, 0x42, -/* 00007940 */ 0x00, 0x10, 0x00, 0x24, 0x00, 0x10, 0x00, 0x22, 0x00, 0x10, 0x00, 0x22, 0x00, 0x10, 0x00, 0x22, -/* 00007950 */ 0x00, 0x10, 0x00, 0x22, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x20, 0x00, 0x0D, 0x00, 0x1D, -/* 00007960 */ 0x00, 0x10, 0x00, 0x2D, 0x00, 0x61, 0x00, 0xC8, 0x00, 0x10, 0x00, 0x54, 0x00, 0x10, 0x00, 0x50, -/* 00007970 */ 0x00, 0x10, 0x00, 0x5E, 0x00, 0x10, 0x00, 0x02, 0x01, 0x10, 0x00, 0x55, 0x00, 0x0C, 0x00, 0x94, -/* 00007980 */ 0x00, 0x10, 0x00, 0x4C, 0x00, 0x10, 0x00, 0x4C, 0x00, 0x10, 0x00, 0x46, 0x00, 0x10, 0x00, 0x47, -/* 00007990 */ 0x00, 0x10, 0x00, 0x4C, 0x00, 0x10, 0x00, 0x4A, 0x00, 0x10, 0x00, 0x3B, 0x00, 0x10, 0x00, 0x4E, -/* 000079A0 */ 0x00, 0x10, 0x00, 0x56, 0x00, 0x10, 0x00, 0x57, 0x00, 0x18, 0x00, 0x35, 0x00, 0x10, 0x00, 0x3E, -/* 000079B0 */ 0x00, 0x10, 0x00, 0x39, 0x00, 0x08, 0x00, 0x25, 0x00, 0x0C, 0x00, 0xE9, 0x01, 0x0C, 0x00, 0x40, -/* 000079C0 */ 0x01, 0x0C, 0x00, 0x0C, 0x02, 0x0C, 0x00, 0x90, 0x01, 0x0C, 0x00, 0x58, 0x01, 0x0C, 0x00, 0x9A, -/* 000079D0 */ 0x00, 0x0C, 0x00, 0x70, 0x00, 0x0C, 0x00, 0xA7, 0x04, 0x0C, 0x00, 0x93, 0x04, 0x0C, 0x00, 0x31, -/* 000079E0 */ 0x04, 0x0C, 0x00, 0xB1, 0x09, 0x0C, 0x00, 0xEF, 0x02, 0x08, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x93, -/* 000079F0 */ 0x03, 0x16, 0x00, 0x89, 0x0A, 0x08, 0x00, 0x75, 0x00, 0x08, 0x00, 0x38, 0x00, 0x08, 0x00, 0x4C, -/* 00007A00 */ 0x00, 0x08, 0x00, 0x83, 0x1C, 0x0C, 0x00, 0xC0, 0x01, 0x0C, 0x00, 0xDF, 0x01, 0x0C, 0x00, 0x80, -/* 00007A10 */ 0x03, 0x1B, 0x00, 0x3C, 0x00, 0x41, 0x00, 0x25, 0x01, 0x06, 0x00, 0x51, 0x00, 0x47, 0x00, 0xA1, -/* 00007A20 */ 0x01, 0x06, 0x00, 0x59, 0x00, 0x47, 0x00, 0xB1, 0x01, 0x06, 0x00, 0x5D, 0x00, 0x47, 0x00, 0xB9, -/* 00007A30 */ 0x01, 0x06, 0x00, 0x41, 0x00, 0x44, 0x00, 0xAD, 0x02, 0x30, 0x00, 0x60, 0x00, 0x30, 0x00, 0x64, -/* 00007A40 */ 0x00, 0x30, 0x00, 0x66, 0x00, 0x2A, 0x00, 0x49, 0x01, 0xC4, 0x01, 0x51, 0x05, 0x16, 0x00, 0xCA, -/* 00007A50 */ 0x03, 0x08, 0x00, 0x2B, 0x00, 0x0C, 0x00, 0x3B, 0x09, 0x13, 0x00, 0xD1, 0x30, 0x13, 0x00, 0x14, -/* 00007A60 */ 0x39, 0x13, 0x00, 0xC3, 0x6D, 0x0E, 0x00, 0x23, 0x00, 0x3C, 0x00, 0x96, 0x00, 0x3C, 0x00, 0x96, -/* 00007A70 */ 0x00, 0x3C, 0x00, 0x96, 0x00, 0x3E, 0x00, 0x94, 0x00, 0x00, 0x6A, 0x15, 0x01, 0x00, 0x59, 0x14, -/* 00007A80 */ 0x01, 0x00, 0xB0, 0x13, 0x01, 0x00, 0xE6, 0x12, 0x01, 0x00, 0xC6, 0x11, 0x01, 0x00, 0x0F, 0x11, -/* 00007A90 */ 0x01, 0x00, 0x75, 0x10, 0x01, 0x00, 0xEC, 0x0F, 0x01, 0x00, 0xAB, 0x0D, 0x01, 0x00, 0x99, 0x0B, -/* 00007AA0 */ 0x01, 0x00, 0xEF, 0x09, 0x01, 0x00, 0x28, 0x05, 0x01, 0x00, 0xA2, 0x03, 0x01, 0x00, 0xD3, 0x01, -/* 00007AB0 */ 0x01, 0x00, 0xF7, 0xFB, 0x00, 0x00, 0xE6, 0xF9, 0x00, 0x00, 0x62, 0xF8, 0x00, 0x00, 0xEC, 0xF7, -/* 00007AC0 */ 0x00, 0x00, 0xDD, 0xF3, 0x00, 0x00, 0xEC, 0xF2, 0x00, 0x00, 0xBC, 0xEF, 0x00, 0x00, 0xCA, 0xEC, -/* 00007AD0 */ 0x00, 0x00, 0xA5, 0xEB, 0x00, 0x00, 0x83, 0xEA, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0xB2, 0xE7, -/* 00007AE0 */ 0x00, 0x00, 0xE0, 0xE6, 0x00, 0x00, 0x0E, 0xE6, 0x00, 0x00, 0x79, 0xE5, 0x00, 0x00, 0xC6, 0xE2, -/* 00007AF0 */ 0x00, 0x00, 0xFA, 0xDE, 0x00, 0x00, 0x4E, 0xC8, 0x00, 0x00, 0xAB, 0xAF, 0x00, 0x00, 0x02, 0x7B, -/* 00007B00 */ 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x4F, 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE4, -/* 00007B10 */ 0x04, 0x1A, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x3F, 0x00, 0xFE, 0x6A, 0xED, 0x0E, 0xFF, 0x00, 0x10, -/* 00007B20 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0x6A, 0xED, 0xFE, 0x72, 0x6D, 0xFE, 0x72, 0x6D, 0x01, 0x13, 0x2F, -/* 00007B30 */ 0x3B, 0x09, 0xDA, 0xDA, 0x01, 0x09, 0x11, 0x11, 0x11, 0x11, 0x06, 0x02, 0x38, 0xFF, 0xFF, 0xFF, -/* 00007B40 */ 0xFF, 0xFF, 0x39, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00007B50 */ 0x00, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x02, 0x01, 0xFE, 0xE9, 0x03, -/* 00007B60 */ 0x02, 0x00, 0xFE, 0xEA, 0x03, 0x02, 0x01, 0xFE, 0xEB, 0x03, 0x02, 0x00, 0xFE, 0xEC, 0x03, 0x02, -/* 00007B70 */ 0x01, 0xFE, 0xED, 0x03, 0x02, 0x00, 0xFE, 0xEE, 0x03, 0x02, 0x01, 0xFE, 0xEF, 0x03, 0x02, 0x00, -/* 00007B80 */ 0xFE, 0xF0, 0x03, 0x02, 0x01, 0xFE, 0xF1, 0x03, 0x02, 0x00, 0xFE, 0xF2, 0x03, 0x02, 0x01, 0xFE, -/* 00007B90 */ 0xF3, 0x03, 0x02, 0x00, 0xFE, 0xF4, 0x03, 0x02, 0x01, 0xFE, 0xF5, 0x03, 0x02, 0x00, 0xFE, 0xF6, -/* 00007BA0 */ 0x03, 0x02, 0x01, 0xFE, 0xF7, 0x03, 0x02, 0x00, 0xFE, 0xF8, 0x03, 0x02, 0x01, 0xFE, 0xF9, 0x03, -/* 00007BB0 */ 0x02, 0x00, 0xFE, 0xFA, 0x03, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, -/* 00007BC0 */ 0x00, 0x02, 0x00, 0xFE, 0xFC, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFD, 0x03, -/* 00007BD0 */ 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFE, 0x03, 0x02, 0x00, 0xFE, 0xFF, 0x03, 0x02, -/* 00007BE0 */ 0x00, 0xFE, 0x00, 0x04, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x02, 0x01, -/* 00007BF0 */ 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x09, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, -/* 00007C00 */ 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x08, 0x02, 0x01, 0xFE, 0xD8, 0x03, 0x02, 0x01, -/* 00007C10 */ 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xD9, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, 0x01, 0xFE, -/* 00007C20 */ 0xE6, 0x02, 0xFE, 0x7C, 0x04, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0xA8, 0x32, 0xA8, 0x33, 0xA8, -/* 00007C30 */ 0x34, 0xA8, 0x35, 0xA8, 0x36, 0xA8, 0x37, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, -/* 00007C40 */ 0x3D, 0x14, 0x15, 0x00, 0x3D, 0x02, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, -/* 00007C50 */ 0x00, 0x00, 0x3D, 0x14, 0x03, 0x00, 0x3D, 0x03, 0x09, 0x3D, 0x04, 0xDE, 0x00, 0x09, 0x01, 0xB8, -/* 00007C60 */ 0x3D, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, -/* 00007C70 */ 0x02, 0x00, 0x00, 0x00, 0x2F, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x30, 0x3D, 0x95, 0x00, -/* 00007C80 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x01, 0x50, 0x01, 0x02, 0x00, 0x00, 0x00, 0x31, -/* 00007C90 */ 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x01, 0x50, 0x01, 0x03, 0x00, -/* 00007CA0 */ 0x00, 0x00, 0x32, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x32, 0x01, 0x50, -/* 00007CB0 */ 0x01, 0x04, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, -/* 00007CC0 */ 0x33, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, 0x00, 0x34, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 00007CD0 */ 0x00, 0x00, 0x00, 0x34, 0x01, 0x50, 0x01, 0x06, 0x00, 0x00, 0x00, 0x35, 0x3D, 0x95, 0x00, 0x00, -/* 00007CE0 */ 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x35, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00007CF0 */ 0x3D, 0x00, 0x00, 0x00, 0x7A, 0x05, 0x3D, 0x00, 0x7A, 0x07, 0x3D, 0x01, 0x7A, 0x09, 0x3D, 0x02, -/* 00007D00 */ 0x7A, 0x0B, 0x3D, 0x03, 0x7A, 0x0D, 0x3D, 0x04, 0x7A, 0x0F, 0x3D, 0x05, 0x7A, 0x11, 0x3D, 0x06, -/* 00007D10 */ 0x7A, 0x13, 0x3D, 0x07, 0x7A, 0x15, 0x3D, 0x08, 0x96, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x8E, 0x01, -/* 00007D20 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, 0x6C, 0x3D, 0x3E, 0x09, 0x07, 0x03, 0x00, 0x5C, -/* 00007D30 */ 0x00, 0x3E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x07, 0x03, 0x00, 0x5C, -/* 00007D40 */ 0x00, 0x18, 0x5C, 0x01, 0x17, 0xB8, 0x41, 0x00, 0x01, 0x50, 0x01, 0x07, 0x00, 0x00, 0x00, 0x40, -/* 00007D50 */ 0x41, 0x5C, 0x02, 0x40, 0x1F, 0x03, 0x3F, 0x3F, 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x19, 0x1F, 0x03, -/* 00007D60 */ 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, 0x6C, 0x3D, 0x3E, 0x09, -/* 00007D70 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, -/* 00007D80 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5C, 0x01, 0x1A, 0xB8, 0x41, 0x00, 0x01, 0x50, 0x01, 0x08, -/* 00007D90 */ 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0x1F, 0x03, 0x3F, 0x3F, 0x5C, 0x01, 0x3F, 0x5C, -/* 00007DA0 */ 0x02, 0x1B, 0x1F, 0x03, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, -/* 00007DB0 */ 0x6C, 0x3D, 0x3E, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, -/* 00007DC0 */ 0x00, 0x00, 0x00, 0x3F, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5C, 0x01, 0x1C, 0xB8, 0x41, 0x00, -/* 00007DD0 */ 0x01, 0x50, 0x01, 0x09, 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0x1F, 0x03, 0x3F, 0x3F, -/* 00007DE0 */ 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x1D, 0x1F, 0x03, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, -/* 00007DF0 */ 0x00, 0x00, 0x00, 0x3D, 0x14, 0x03, 0x00, 0x3D, 0x02, 0x09, 0x9C, 0x02, 0xDE, 0x01, 0x04, 0x02, -/* 00007E00 */ 0xB8, 0x3D, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x3D, 0x3D, 0x01, 0x50, 0x01, 0x0A, 0x00, 0x00, -/* 00007E10 */ 0x00, 0x36, 0x3D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x01, 0x50, 0x01, -/* 00007E20 */ 0x0B, 0x00, 0x00, 0x00, 0x37, 0x3D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x37, -/* 00007E30 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, -/* 00007E40 */ 0x5C, 0x01, 0x1E, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x5C, 0x02, 0x3E, -/* 00007E50 */ 0x1F, 0x03, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x03, -/* 00007E60 */ 0x00, 0x5C, 0x00, 0x18, 0x5C, 0x01, 0x1F, 0x90, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 00007E70 */ 0x3E, 0x5C, 0x02, 0x3E, 0x1F, 0x03, 0xFF, 0x3D, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00007E80 */ 0x00, 0x3D, 0xCD, 0x3E, 0x02, 0xA1, 0x00, 0x20, 0x3E, 0xA1, 0x01, 0x21, 0x3E, 0x76, 0x3E, 0x3D, -/* 00007E90 */ 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 00007EA0 */ 0x18, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x5C, 0x01, 0x3E, 0x5C, 0x02, -/* 00007EB0 */ 0x22, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x90, 0x01, -/* 00007EC0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x3F, 0x3F, 0x7A, -/* 00007ED0 */ 0x3F, 0x3E, 0x0B, 0x7A, 0x25, 0x3E, 0x0C, 0x7A, 0x25, 0x3E, 0x0D, 0x7A, 0x25, 0x3E, 0x0E, 0x5C, -/* 00007EE0 */ 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x3D, -/* 00007EF0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, -/* 00007F00 */ 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, -/* 00007F10 */ 0x3E, 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x02, 0x3E, 0x1F, 0x03, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, -/* 00007F20 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x90, 0x01, 0x00, 0x00, -/* 00007F30 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5C, 0x02, 0x28, -/* 00007F40 */ 0xCC, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, -/* 00007F50 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x7A, 0x3F, 0x3E, 0x0B, 0x7A, 0x29, 0x3E, 0x0C, 0x7A, -/* 00007F60 */ 0x25, 0x3E, 0x0D, 0x7A, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x8E, 0x01, -/* 00007F70 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x90, 0x01, -/* 00007F80 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5C, -/* 00007F90 */ 0x02, 0x2A, 0xCC, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x8E, -/* 00007FA0 */ 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5C, -/* 00007FB0 */ 0x01, 0x2C, 0xB8, 0x41, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x41, 0x41, 0x01, 0x50, 0x01, 0x0C, -/* 00007FC0 */ 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0x1F, 0x03, 0x3F, 0x3F, 0x7A, 0x3F, 0x3E, 0x10, -/* 00007FD0 */ 0x7A, 0x25, 0x3E, 0x0D, 0x7A, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x8E, -/* 00007FE0 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x90, -/* 00007FF0 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, -/* 00008000 */ 0x5C, 0x02, 0x2D, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, -/* 00008010 */ 0xB8, 0x40, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x01, 0x50, 0x01, 0x0D, 0x00, 0x00, -/* 00008020 */ 0x00, 0x3F, 0x40, 0x7A, 0x3F, 0x3E, 0x0B, 0x01, 0x64, 0x01, 0x3F, 0x3E, 0x7A, 0x29, 0x3E, 0x0C, -/* 00008030 */ 0x7A, 0x25, 0x3E, 0x0D, 0x7A, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x8E, -/* 00008040 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x90, -/* 00008050 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x5C, 0x01, 0x3E, 0x5C, 0x02, 0x2E, 0xCC, -/* 00008060 */ 0x88, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 00008070 */ 0x00, 0x4A, 0x00, 0x00, 0x00, 0x3F, 0x4B, 0x3F, 0x7A, 0x3F, 0x3E, 0x0B, 0x7A, 0x29, 0x3E, 0x0C, -/* 00008080 */ 0x7A, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x90, 0x01, 0x00, 0x00, 0x00, -/* 00008090 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 000080A0 */ 0x00, 0x06, 0x9C, 0x00, 0x88, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000080B0 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 000080C0 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 000080D0 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, -/* 000080E0 */ 0x00, 0x00, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 000080F0 */ 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, -/* 00008100 */ 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, -/* 00008110 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 00008120 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, -/* 00008130 */ 0x00, 0x00, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, 0xEB, 0x03, 0x00, 0x00, 0xED, 0x03, 0x00, 0x00, -/* 00008140 */ 0xEF, 0x03, 0x00, 0x00, 0xF1, 0x03, 0x00, 0x00, 0xF3, 0x03, 0x00, 0x00, 0xF5, 0x03, 0x00, 0x00, -/* 00008150 */ 0xF7, 0x03, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xE9, 0x03, 0xFE, 0xEB, 0x03, 0xFE, -/* 00008160 */ 0xED, 0x03, 0xFE, 0xEF, 0x03, 0xFE, 0xF1, 0x03, 0xFE, 0xF3, 0x03, 0xFE, 0xF5, 0x03, 0xFE, 0xF7, -/* 00008170 */ 0x03, 0xFE, 0xF9, 0x03, 0xFE, 0x32, 0x02, 0xFE, 0x94, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, -/* 00008180 */ 0xFE, 0xB1, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0x45, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0x01, 0x04, 0x02, -/* 00008190 */ 0x01, 0x07, 0x00, 0xFE, 0x02, 0x04, 0x01, 0xFE, 0x03, 0x04, 0x02, 0xFE, 0x04, 0x04, 0x03, 0xFE, -/* 000081A0 */ 0x05, 0x04, 0x04, 0xFE, 0x06, 0x04, 0x05, 0xFE, 0x07, 0x04, 0x06, 0xFE, 0x08, 0x04, 0x02, 0x02, -/* 000081B0 */ 0x00, 0xFE, 0x1B, 0x02, 0x01, 0xFE, 0x1C, 0x02, 0xFE, 0x81, 0xED, 0x12, 0x12, 0x00, 0x00, 0x00, -/* 000081C0 */ 0xB0, 0x00, 0x9A, 0x13, 0x37, 0x00, 0x84, 0x36, 0x44, 0x00, 0x11, 0x03, 0x44, 0x00, 0x1B, 0x03, -/* 000081D0 */ 0x44, 0x00, 0x1B, 0x03, 0x46, 0x00, 0x72, 0x06, 0x24, 0x00, 0x13, 0x04, 0x24, 0x00, 0x54, 0x00, -/* 000081E0 */ 0x19, 0x00, 0x48, 0x00, 0x55, 0x00, 0x9D, 0x00, 0x36, 0x00, 0x4A, 0x00, 0x52, 0x00, 0xA2, 0x00, -/* 000081F0 */ 0x71, 0x00, 0x22, 0x03, 0x60, 0x00, 0xEC, 0x08, 0x4C, 0x00, 0x9F, 0x00, 0x0D, 0x00, 0x88, 0x00, -/* 00008200 */ 0x07, 0x00, 0x16, 0x00, 0x00, 0x73, 0xAB, 0x00, 0x00, 0xCE, 0xA5, 0x00, 0x00, 0x23, 0xA5, 0x00, -/* 00008210 */ 0x00, 0xF6, 0xA2, 0x00, 0x00, 0x07, 0xA1, 0x00, 0x00, 0xB5, 0x9C, 0x00, 0x00, 0x94, 0x93, 0x00, -/* 00008220 */ 0x00, 0x54, 0x91, 0x00, 0x00, 0x19, 0x8F, 0x00, 0x00, 0xDE, 0x8C, 0x00, 0x00, 0x68, 0x8A, 0x00, -/* 00008230 */ 0x00, 0x17, 0x88, 0x00, 0x00, 0xEF, 0x86, 0x00, 0x00, 0x3D, 0x82, 0x00, 0x00, 0x3F, 0xFD, 0x02, -/* 00008240 */ 0x04, 0x4F, 0xFC, 0x0F, 0xFE, 0xA2, 0x03, 0xFE, 0xBB, 0x06, 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, -/* 00008250 */ 0x4E, 0x00, 0xFF, 0x11, 0x51, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, -/* 00008260 */ 0x11, 0x51, 0x01, 0x00, 0xFE, 0x30, 0x08, 0xFE, 0x30, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, -/* 00008270 */ 0x7A, 0x04, 0x09, 0x20, 0x20, 0x20, 0x20, 0x01, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0x18, -/* 00008280 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00008290 */ 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0x44, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, -/* 000082A0 */ 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0x45, 0x04, 0x02, 0x01, 0xFE, 0xCE, 0x03, 0x02, -/* 000082B0 */ 0x01, 0xFE, 0x38, 0x04, 0x02, 0x01, 0xFE, 0x3C, 0x04, 0x02, 0x01, 0xFE, 0x39, 0x04, 0x02, 0x01, -/* 000082C0 */ 0xFE, 0x3A, 0x04, 0x02, 0x01, 0xFE, 0x0D, 0x04, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, 0xFE, -/* 000082D0 */ 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, -/* 000082E0 */ 0x04, 0x02, 0x01, 0xFE, 0x3B, 0x04, 0x03, 0x04, 0xFE, 0x29, 0x02, 0x5B, 0x15, 0xB3, 0x15, 0x15, -/* 000082F0 */ 0x2C, 0x19, 0x15, 0x15, 0x03, 0x00, 0x19, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, -/* 00008300 */ 0x09, 0x00, 0x00, 0x00, 0x1A, 0x6C, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, -/* 00008310 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x19, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00008320 */ 0x00, 0x00, 0x1A, 0x6C, 0x19, 0x1A, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x15, -/* 00008330 */ 0x1F, 0x02, 0x19, 0x19, 0x96, 0x02, 0x00, 0x00, 0x00, 0x19, 0x92, 0x02, 0x00, 0x00, 0x00, 0x19, -/* 00008340 */ 0xA8, 0x1A, 0x14, 0x14, 0x00, 0x19, 0x1A, 0x09, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x00, 0x19, -/* 00008350 */ 0x61, 0x19, 0x19, 0x02, 0x0F, 0x21, 0x00, 0x19, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, -/* 00008360 */ 0x09, 0x00, 0x00, 0x00, 0x1A, 0x6C, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, -/* 00008370 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x19, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 00008380 */ 0x00, 0x00, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00008390 */ 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x03, -/* 000083A0 */ 0x7A, 0x1B, 0x1A, 0x04, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x05, 0x7A, 0x1B, -/* 000083B0 */ 0x1A, 0x06, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x07, 0x7A, 0x1B, 0x1A, 0x08, -/* 000083C0 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x09, 0x7A, 0x1B, 0x1A, 0x0A, 0x92, 0x02, -/* 000083D0 */ 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x0B, 0x7A, 0x1B, 0x1A, 0x0C, 0x92, 0x02, 0x00, 0x00, -/* 000083E0 */ 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x0D, 0x7A, 0x1B, 0x1A, 0x0E, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, -/* 000083F0 */ 0x61, 0x1B, 0x1B, 0x0F, 0x7A, 0x1B, 0x1A, 0x10, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, -/* 00008400 */ 0x1B, 0x11, 0x7A, 0x1B, 0x1A, 0x12, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x13, -/* 00008410 */ 0x7A, 0x1B, 0x1A, 0x14, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x15, 0x7A, 0x1B, -/* 00008420 */ 0x1A, 0x16, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x17, 0x7A, 0x1B, 0x1A, 0x18, -/* 00008430 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x19, 0x7A, 0x1B, 0x1A, 0x1A, 0x92, 0x02, -/* 00008440 */ 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x1B, 0x7A, 0x1B, 0x1A, 0x1C, 0x92, 0x02, 0x00, 0x00, -/* 00008450 */ 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x1D, 0x7A, 0x1B, 0x1A, 0x1E, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x13, -/* 00008460 */ 0x1F, 0x03, 0x19, 0x19, 0x96, 0x03, 0x00, 0x00, 0x00, 0x19, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, -/* 00008470 */ 0x00, 0x00, 0x00, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCB, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, -/* 00008480 */ 0x02, 0x13, 0x1F, 0x03, 0x19, 0x19, 0x96, 0x04, 0x00, 0x00, 0x00, 0x19, 0x8E, 0x04, 0x00, 0x00, -/* 00008490 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x14, 0x8E, 0x04, 0x00, 0x00, -/* 000084A0 */ 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x01, 0x1A, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, -/* 000084B0 */ 0x00, 0x00, 0x1A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x14, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x5C, -/* 000084C0 */ 0x01, 0x1B, 0x1F, 0x02, 0x1A, 0x1A, 0x5C, 0x02, 0x1A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x5C, -/* 000084D0 */ 0x03, 0x1A, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0xFF, 0x19, 0x8E, -/* 000084E0 */ 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0x92, -/* 000084F0 */ 0x04, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x01, 0x1A, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, -/* 00008500 */ 0x00, 0x1A, 0x61, 0x1A, 0x1A, 0x1F, 0x5C, 0x02, 0x1A, 0x1F, 0x03, 0x00, 0x19, 0x09, 0x02, 0x00, -/* 00008510 */ 0xA8, 0x00, 0x24, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, -/* 00008520 */ 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x83, -/* 00008530 */ 0x02, 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7C, -/* 00008540 */ 0x02, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7F, -/* 00008550 */ 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, -/* 00008560 */ 0x33, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x93, -/* 00008570 */ 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x95, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x90, 0x02, -/* 00008580 */ 0xFE, 0x85, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x7B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x82, 0x02, 0xFE, -/* 00008590 */ 0x87, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x7E, -/* 000085A0 */ 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x8C, 0x02, -/* 000085B0 */ 0xFE, 0x81, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x45, 0x01, 0xFE, 0xE6, 0x03, 0xFE, -/* 000085C0 */ 0x46, 0x04, 0xFE, 0xFB, 0x01, 0x00, 0xFF, 0x46, 0x51, 0x01, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, -/* 000085D0 */ 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x90, 0x00, 0x21, 0x00, 0x4B, 0x00, 0x21, 0x00, 0x6B, 0x00, -/* 000085E0 */ 0x1E, 0x00, 0x90, 0x00, 0xF1, 0x00, 0xCE, 0x03, 0x22, 0x00, 0x3E, 0x00, 0x53, 0x00, 0x98, 0x01, -/* 000085F0 */ 0x33, 0x00, 0x44, 0x00, 0x00, 0xF9, 0x85, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, -/* 00008600 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xD4, 0x06, 0x60, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x4F, 0x00, -/* 00008610 */ 0xFF, 0xAC, 0x57, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0xAC, 0x57, 0x01, -/* 00008620 */ 0x00, 0xFE, 0x27, 0x01, 0xFE, 0x27, 0x01, 0x41, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x05, -/* 00008630 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, -/* 00008640 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00008650 */ 0x00, 0x02, 0x01, 0xFE, 0x38, 0x04, 0x02, 0x00, 0xFE, 0xE7, 0x03, 0x04, 0x7C, 0x8E, 0x01, 0x00, -/* 00008660 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x97, 0x07, 0x07, 0x05, 0xA8, 0x08, 0x15, 0x0B, 0x00, -/* 00008670 */ 0x07, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x58, 0x00, 0x8E, 0x05, 0x00, -/* 00008680 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x05, 0x00, -/* 00008690 */ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 000086A0 */ 0x00, 0x00, 0x00, 0x08, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x03, 0x05, 0x5C, 0x03, 0x08, 0x1F, 0x04, -/* 000086B0 */ 0x07, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x1C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, -/* 000086C0 */ 0x00, 0x00, 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x97, 0x08, 0x08, -/* 000086D0 */ 0x05, 0x9C, 0x08, 0x07, 0x05, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x57, 0x01, -/* 000086E0 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0xA6, 0x00, 0x1E, 0x00, 0x52, 0x00, 0x00, 0xBF, -/* 000086F0 */ 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAC, 0x06, 0x39, 0xFF, -/* 00008700 */ 0xA0, 0x41, 0xD1, 0x00, 0x4D, 0x00, 0xFF, 0x04, 0x4E, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 00008710 */ 0x01, 0x01, 0xFF, 0x04, 0x4E, 0x01, 0x00, 0xFE, 0x60, 0x02, 0xFE, 0x60, 0x02, 0x01, 0x05, 0x05, -/* 00008720 */ 0x08, 0x04, 0x25, 0x24, 0x04, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008730 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008740 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, -/* 00008750 */ 0x02, 0x00, 0xFE, 0x43, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0x8A, 0x5B, 0x05, 0xB3, 0x05, 0x05, -/* 00008760 */ 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, -/* 00008770 */ 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, -/* 00008780 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00008790 */ 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, -/* 000087A0 */ 0x1F, 0x02, 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, -/* 000087B0 */ 0x00, 0x61, 0x08, 0x06, 0x02, 0x0F, 0x21, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, -/* 000087C0 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, -/* 000087D0 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x61, 0x00, 0x06, 0x03, 0x09, 0x02, -/* 000087E0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6C, 0x02, -/* 000087F0 */ 0xFE, 0x78, 0x02, 0x00, 0xFF, 0x2A, 0x4E, 0x01, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 00008800 */ 0x3C, 0x00, 0x1E, 0x00, 0x88, 0x00, 0x1E, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x6B, 0x00, 0x1E, 0x00, -/* 00008810 */ 0x88, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xD8, -/* 00008820 */ 0x03, 0xFE, 0x91, 0x06, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x4C, 0x00, 0xFF, 0xA3, 0x47, 0x01, -/* 00008830 */ 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0xA3, 0x47, 0x01, 0x00, 0xFE, 0xB7, 0x03, -/* 00008840 */ 0xFE, 0xB7, 0x03, 0x03, 0x0A, 0x09, 0x0D, 0x0A, 0x61, 0x60, 0x04, 0x06, 0x07, 0x07, 0x07, 0x07, -/* 00008850 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, -/* 00008860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00008870 */ 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0x43, 0x04, 0x02, 0x01, 0xFE, 0x02, -/* 00008880 */ 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFE, 0x90, 0x01, 0xAE, -/* 00008890 */ 0x0B, 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x2C, 0x0D, 0x09, 0x15, 0x03, 0x00, 0x0D, 0x03, 0x09, 0x1E, -/* 000088A0 */ 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x00, 0x07, -/* 000088B0 */ 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x0D, 0x8E, -/* 000088C0 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x01, 0x07, 0x02, 0x00, -/* 000088D0 */ 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0D, 0x0D, 0x47, 0x0A, 0x0D, 0xA8, 0x0D, 0x14, -/* 000088E0 */ 0x0E, 0x00, 0x0A, 0x0D, 0x09, 0x00, 0x00, 0x61, 0x0D, 0x0A, 0x02, 0x0F, 0x21, 0x00, 0x0D, 0x09, -/* 000088F0 */ 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x00, -/* 00008900 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x0D, -/* 00008910 */ 0x61, 0x0D, 0x0B, 0x03, 0x10, 0x03, 0x00, 0x0D, 0x06, 0x09, 0xB3, 0x00, 0x8E, 0x04, 0x00, 0x00, -/* 00008920 */ 0x00, 0x27, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x97, 0x0E, 0x0B, 0x07, -/* 00008930 */ 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x0D, 0x0D, 0x0F, 0x25, 0x00, 0x0D, 0x09, 0x00, 0x00, 0x8E, 0x04, -/* 00008940 */ 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x97, 0x0E, -/* 00008950 */ 0x0B, 0x07, 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x0D, 0x0D, 0x0F, 0x1B, 0x00, 0x0D, 0x09, 0x00, 0x00, -/* 00008960 */ 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x04, 0x07, 0x01, -/* 00008970 */ 0x00, 0x5C, 0x00, 0x0E, 0x1F, 0x01, 0xFF, 0x0D, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, -/* 00008980 */ 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00008990 */ 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x8E, 0x04, 0x00, 0x00, -/* 000089A0 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, -/* 000089B0 */ 0x97, 0x12, 0x0B, 0x07, 0x5C, 0x01, 0x12, 0x1F, 0x02, 0x10, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, -/* 000089C0 */ 0x0A, 0x1F, 0x03, 0x0E, 0x0E, 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x00, 0x0D, 0x09, 0x4E, 0x00, 0x8E, -/* 000089D0 */ 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x8E, -/* 000089E0 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x05, 0x07, 0x03, 0x00, -/* 000089F0 */ 0x5C, 0x00, 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x10, 0x07, 0x01, 0x00, -/* 00008A00 */ 0x5C, 0x00, 0x08, 0x1F, 0x01, 0x10, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x0A, 0x1F, 0x03, 0x0E, -/* 00008A10 */ 0x0E, 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x00, 0x0D, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 00008A20 */ 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6C, 0x02, 0xF0, 0xFE, 0x59, 0x02, 0xFE, 0x31, -/* 00008A30 */ 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0xCB, 0x47, 0x01, 0x00, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x0B, -/* 00008A40 */ 0x00, 0x38, 0x00, 0x1E, 0x00, 0x7F, 0x00, 0x1E, 0x00, 0x47, 0x00, 0x15, 0x00, 0x67, 0x00, 0x1E, -/* 00008A50 */ 0x00, 0x80, 0x00, 0x0C, 0x00, 0x35, 0x00, 0x44, 0x00, 0x52, 0x00, 0x18, 0x00, 0x4F, 0x00, 0x57, -/* 00008A60 */ 0x00, 0x82, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 00008A70 */ 0x02, 0x03, 0xFE, 0x6E, 0x06, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x4B, 0x00, 0xFF, 0x11, 0x41, -/* 00008A80 */ 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x11, 0x41, 0x01, 0x00, 0xFE, 0x36, -/* 00008A90 */ 0x06, 0xFE, 0x36, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x04, 0x09, 0x08, 0x07, 0x08, -/* 00008AA0 */ 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008AB0 */ 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008AC0 */ 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, -/* 00008AD0 */ 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xFE, 0x95, 0x01, 0xAE, 0x0A, 0x5B, 0x0B, 0xB3, -/* 00008AE0 */ 0x0B, 0x0B, 0xA8, 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x61, 0x0F, 0x0A, 0x00, -/* 00008AF0 */ 0x10, 0x03, 0x00, 0x0F, 0x03, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x04, 0x47, 0x08, 0x0F, 0x61, -/* 00008B00 */ 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x03, 0x47, -/* 00008B10 */ 0x09, 0x0F, 0x6A, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, -/* 00008B20 */ 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x1C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 00008B30 */ 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC2, -/* 00008B40 */ 0x03, 0x00, 0x0F, 0x09, 0x28, 0x01, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, -/* 00008B50 */ 0x6C, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x0F, -/* 00008B60 */ 0x0F, 0x47, 0x0C, 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x02, -/* 00008B70 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x0F, 0x1E, 0x00, 0x0F, 0x09, -/* 00008B80 */ 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, -/* 00008B90 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0xFF, 0x0F, 0x8E, 0x04, 0x00, -/* 00008BA0 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00008BB0 */ 0x10, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, -/* 00008BC0 */ 0x0D, 0x0F, 0x09, 0x3D, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x07, -/* 00008BD0 */ 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0F, -/* 00008BE0 */ 0x0F, 0x47, 0x0D, 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, -/* 00008BF0 */ 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0x1F, 0x03, -/* 00008C00 */ 0xFF, 0x0F, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x04, -/* 00008C10 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, -/* 00008C20 */ 0x0F, 0x47, 0x0F, 0x0D, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, -/* 00008C30 */ 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, -/* 00008C40 */ 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, -/* 00008C50 */ 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0x10, 0x10, 0x76, 0x10, 0x0F, 0x05, 0x61, 0x0F, 0x0D, 0x06, 0x82, -/* 00008C60 */ 0x0F, 0x0F, 0x28, 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00008C70 */ 0x00, 0x00, 0xF0, 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, -/* 00008C80 */ 0x78, 0x02, 0xFE, 0x78, 0x02, 0xDB, 0x00, 0xFF, 0x90, 0x42, 0x01, 0x00, 0x14, 0x07, 0x00, 0x00, -/* 00008C90 */ 0x00, 0x05, 0x00, 0x2D, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x2C, -/* 00008CA0 */ 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x1C, 0x00, 0x58, -/* 00008CB0 */ 0x00, 0x1E, 0x00, 0x37, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x1B, 0x00, 0x9D, 0x00, 0x1E, 0x00, 0x47, -/* 00008CC0 */ 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x58, 0x00, 0x1F, 0x00, 0x4F, -/* 00008CD0 */ 0x00, 0x3A, 0x00, 0x66, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, -/* 00008CE0 */ 0x02, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x60, 0x06, 0x64, 0xFF, 0xA0, -/* 00008CF0 */ 0x41, 0xF1, 0x00, 0x4A, 0x00, 0xFF, 0x23, 0x3E, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 00008D00 */ 0x01, 0xFF, 0x23, 0x3E, 0x01, 0x00, 0xFE, 0xAF, 0x02, 0xFE, 0xAF, 0x02, 0x03, 0x0A, 0x0B, 0x10, -/* 00008D10 */ 0x0A, 0x5D, 0x5A, 0x03, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008D20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008D30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, -/* 00008D40 */ 0x03, 0x02, 0x00, 0xFE, 0xFD, 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, 0x02, 0x00, 0xFE, 0x42, -/* 00008D50 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x0B, 0x04, -/* 00008D60 */ 0xFE, 0x7F, 0x01, 0xAE, 0x0E, 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, 0x2C, 0x10, 0x0B, 0x15, 0x19, 0x00, -/* 00008D70 */ 0x10, 0x03, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0xE1, -/* 00008D80 */ 0x10, 0x0B, 0x10, 0x00, 0x0F, 0x21, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00008D90 */ 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, -/* 00008DA0 */ 0x01, 0x04, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 00008DB0 */ 0x00, 0x00, 0x10, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, -/* 00008DC0 */ 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, -/* 00008DD0 */ 0x07, 0x02, 0x00, 0x5C, 0x01, 0x0B, 0xC2, 0x02, 0x11, 0x11, 0x5C, 0x02, 0x11, 0x1F, 0x03, 0x10, -/* 00008DE0 */ 0x10, 0x47, 0x0C, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, -/* 00008DF0 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x21, 0x00, 0x10, 0x09, -/* 00008E00 */ 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, -/* 00008E10 */ 0x00, 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, -/* 00008E20 */ 0x47, 0x00, 0x07, 0x09, 0xBA, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, -/* 00008E30 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x11, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x02, 0x1F, 0x03, -/* 00008E40 */ 0x10, 0x10, 0x47, 0x0D, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x4B, -/* 00008E50 */ 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x97, 0x11, 0x0E, 0x08, 0x5C, 0x02, -/* 00008E60 */ 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, -/* 00008E70 */ 0x5C, 0x00, 0x06, 0x97, 0x12, 0x0E, 0x09, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x0A, -/* 00008E80 */ 0x1F, 0x04, 0x11, 0x11, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00008E90 */ 0x11, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00008EA0 */ 0x09, 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, 0x12, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x8E, -/* 00008EB0 */ 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x14, 0x6C, 0x13, 0x14, 0x02, 0x07, 0x02, 0x00, -/* 00008EC0 */ 0x5C, 0x00, 0x14, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0D, -/* 00008ED0 */ 0x1F, 0x03, 0x11, 0x11, 0x5C, 0x01, 0x11, 0x1F, 0x02, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 00008EE0 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0x41, -/* 00008EF0 */ 0x3E, 0x01, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x6F, 0x00, -/* 00008F00 */ 0x3B, 0x00, 0x53, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x1F, 0x00, 0x3A, 0x00, -/* 00008F10 */ 0x46, 0x00, 0x76, 0x00, 0x55, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x1F, 0xFC, 0x07, -/* 00008F20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x53, 0x06, 0x64, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x49, 0x00, -/* 00008F30 */ 0xFF, 0x08, 0x3B, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x08, 0x3B, 0x01, -/* 00008F40 */ 0x00, 0xFE, 0xAF, 0x02, 0xFE, 0xAF, 0x02, 0x03, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x0B, -/* 00008F50 */ 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008F60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008F70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFC, -/* 00008F80 */ 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, 0x02, 0x00, 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, -/* 00008F90 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x09, 0x04, 0xFE, 0x7F, 0x01, 0xAE, 0x0E, -/* 00008FA0 */ 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, 0x2C, 0x10, 0x0B, 0x15, 0x19, 0x00, 0x10, 0x03, 0x09, 0x00, 0x00, -/* 00008FB0 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0xE1, 0x10, 0x0B, 0x10, 0x00, 0x0F, -/* 00008FC0 */ 0x21, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, -/* 00008FD0 */ 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, -/* 00008FE0 */ 0x1F, 0x03, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x03, -/* 00008FF0 */ 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, -/* 00009000 */ 0x11, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x01, -/* 00009010 */ 0x0B, 0xC2, 0x02, 0x11, 0x11, 0x5C, 0x02, 0x11, 0x1F, 0x03, 0x10, 0x10, 0x47, 0x0C, 0x10, 0x8E, -/* 00009020 */ 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, -/* 00009030 */ 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x21, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, -/* 00009040 */ 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, -/* 00009050 */ 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xBA, -/* 00009060 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00009070 */ 0x06, 0xCB, 0x11, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x10, 0x10, 0x47, 0x0D, 0x10, -/* 00009080 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x4B, 0x10, 0x07, 0x04, 0x00, 0x5C, -/* 00009090 */ 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x97, 0x11, 0x0E, 0x08, 0x5C, 0x02, 0x11, 0x8E, 0x01, 0x00, 0x00, -/* 000090A0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x97, 0x12, -/* 000090B0 */ 0x0E, 0x09, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x0A, 0x1F, 0x04, 0x11, 0x11, 0x5C, -/* 000090C0 */ 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, -/* 000090D0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, -/* 000090E0 */ 0x6C, 0x11, 0x12, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, -/* 000090F0 */ 0x00, 0x00, 0x00, 0x14, 0x6C, 0x13, 0x14, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x14, 0x5C, 0x01, -/* 00009100 */ 0x0B, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0D, 0x1F, 0x03, 0x11, 0x11, 0x5C, -/* 00009110 */ 0x01, 0x11, 0x1F, 0x02, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 00009120 */ 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0x26, 0x3B, 0x01, 0x00, 0x09, 0x07, -/* 00009130 */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x6F, 0x00, 0x3B, 0x00, 0x53, 0x00, 0x3C, -/* 00009140 */ 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x76, 0x00, 0x55, -/* 00009150 */ 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00009160 */ 0xFE, 0x46, 0x06, 0x60, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x48, 0x00, 0xFF, 0xF3, 0x37, 0x01, 0x00, -/* 00009170 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0xF3, 0x37, 0x01, 0x00, 0xFE, 0xA9, 0x02, 0xFE, -/* 00009180 */ 0xA9, 0x02, 0x03, 0x0A, 0x0C, 0x11, 0x0A, 0x5D, 0x5A, 0x03, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, -/* 00009190 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, -/* 000091A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 000091B0 */ 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0x03, 0x02, 0x01, 0xFE, 0xE8, -/* 000091C0 */ 0x03, 0x04, 0x02, 0x00, 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -/* 000091D0 */ 0x00, 0x02, 0x00, 0xFE, 0x0A, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0xFE, 0x7F, 0x01, 0xAE, 0x0F, -/* 000091E0 */ 0x5B, 0x0C, 0xB3, 0x0C, 0x0C, 0x2C, 0x11, 0x0C, 0x15, 0x19, 0x00, 0x11, 0x03, 0x09, 0x00, 0x00, -/* 000091F0 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0xE1, 0x11, 0x0C, 0x11, 0x00, 0x0F, -/* 00009200 */ 0x21, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, -/* 00009210 */ 0x6C, 0x11, 0x12, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, -/* 00009220 */ 0x1F, 0x03, 0xFF, 0x11, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x11, 0x07, 0x03, -/* 00009230 */ 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x12, 0x5C, 0x01, -/* 00009240 */ 0x12, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x01, -/* 00009250 */ 0x0C, 0xC2, 0x02, 0x12, 0x12, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0D, 0x11, 0x8E, -/* 00009260 */ 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, -/* 00009270 */ 0x01, 0x0D, 0x1F, 0x02, 0x11, 0x11, 0x0F, 0x21, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, -/* 00009280 */ 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, -/* 00009290 */ 0x1F, 0x02, 0x11, 0x11, 0x0F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xBA, -/* 000092A0 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x11, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 000092B0 */ 0x06, 0xCB, 0x12, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0E, 0x11, -/* 000092C0 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, -/* 000092D0 */ 0x00, 0x06, 0x5C, 0x01, 0x0E, 0x97, 0x12, 0x0F, 0x08, 0x5C, 0x02, 0x12, 0x8E, 0x01, 0x00, 0x00, -/* 000092E0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x97, 0x13, -/* 000092F0 */ 0x0F, 0x09, 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x0B, 0x1F, 0x04, 0x12, 0x12, 0x5C, -/* 00009300 */ 0x03, 0x12, 0x1F, 0x04, 0xFF, 0x11, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, -/* 00009310 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, -/* 00009320 */ 0x6C, 0x12, 0x13, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x13, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, -/* 00009330 */ 0x00, 0x00, 0x00, 0x15, 0x6C, 0x14, 0x15, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x15, 0x5C, 0x01, -/* 00009340 */ 0x0C, 0x1F, 0x02, 0x14, 0x14, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x12, 0x12, 0x5C, -/* 00009350 */ 0x01, 0x12, 0x1F, 0x02, 0x00, 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 00009360 */ 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0x11, 0x38, 0x01, 0x00, 0x09, 0x07, -/* 00009370 */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x6B, 0x00, 0x3B, 0x00, 0x53, 0x00, 0x3C, -/* 00009380 */ 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x74, 0x00, 0x55, -/* 00009390 */ 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x4F, 0xFD, 0x07, 0xFE, 0x08, 0x04, 0xFE, 0xC1, -/* 000093A0 */ 0x05, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x47, 0x00, 0xFF, 0x28, 0x1C, 0x01, 0x00, 0xFF, 0x00, -/* 000093B0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x28, 0x1C, 0x01, 0x00, 0xFE, 0x69, 0x1B, 0xFE, 0x69, 0x1B, -/* 000093C0 */ 0x45, 0x1C, 0x29, 0x41, 0x07, 0xFE, 0xAA, 0x01, 0xFE, 0x8A, 0x01, 0x03, 0x0F, 0x2A, 0x2A, 0x2A, -/* 000093D0 */ 0x2A, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000093E0 */ 0xFF, 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 000093F0 */ 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, -/* 00009400 */ 0x08, 0x02, 0x00, 0xFE, 0x0A, 0x04, 0x02, 0x01, 0xFE, 0x09, 0x04, 0x02, 0x01, 0xFE, 0x8E, 0x03, -/* 00009410 */ 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, -/* 00009420 */ 0x01, 0xFE, 0x38, 0x04, 0x02, 0x01, 0xFE, 0x39, 0x04, 0x02, 0x00, 0xFE, 0x13, 0x04, 0x02, 0x00, -/* 00009430 */ 0xFE, 0x14, 0x04, 0x02, 0x00, 0xFE, 0x16, 0x04, 0x02, 0x01, 0xFE, 0x3A, 0x04, 0x02, 0x01, 0xFE, -/* 00009440 */ 0x0D, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0x0E, -/* 00009450 */ 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, -/* 00009460 */ 0x02, 0x01, 0xFE, 0x12, 0x04, 0x02, 0x01, 0xFE, 0x3B, 0x04, 0x02, 0x01, 0xFE, 0x3C, 0x04, 0x02, -/* 00009470 */ 0x01, 0xFE, 0x58, 0x03, 0x02, 0x00, 0xFE, 0x3D, 0x04, 0x02, 0x00, 0xFE, 0x3E, 0x04, 0x02, 0x00, -/* 00009480 */ 0xFE, 0x3F, 0x04, 0x02, 0x00, 0xFE, 0x40, 0x04, 0x03, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x00, -/* 00009490 */ 0xFE, 0x00, 0x04, 0x09, 0x02, 0x00, 0xFE, 0x41, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0x01, 0x00, -/* 000094A0 */ 0x00, 0x00, 0x00, 0xFE, 0x59, 0x06, 0xA8, 0x3F, 0x2C, 0x42, 0x29, 0x0D, 0x03, 0x00, 0x42, 0x02, -/* 000094B0 */ 0x09, 0x18, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, 0x43, -/* 000094C0 */ 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 000094D0 */ 0x0C, 0x00, 0x00, 0x00, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 000094E0 */ 0x19, 0x00, 0x00, 0x00, 0x43, 0x5C, 0x01, 0x43, 0x5C, 0x02, 0x29, 0x5C, 0x03, 0x03, 0x1F, 0x04, -/* 000094F0 */ 0x42, 0x42, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x29, 0x00, 0x61, 0x42, 0x29, 0x01, 0x0F, 0x03, 0x00, -/* 00009500 */ 0x42, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, -/* 00009510 */ 0x43, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, -/* 00009520 */ 0xFF, 0x42, 0x76, 0x06, 0x29, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, -/* 00009530 */ 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x07, 0x5C, 0x03, -/* 00009540 */ 0x08, 0x1F, 0x04, 0x42, 0x42, 0x47, 0x2B, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00009550 */ 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x09, 0x5C, 0x03, -/* 00009560 */ 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x0B, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, -/* 00009570 */ 0x05, 0x0C, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x2E, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 00009580 */ 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x0D, 0x5C, -/* 00009590 */ 0x03, 0x0A, 0xA8, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, -/* 000095A0 */ 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x2F, 0x42, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x00, -/* 000095B0 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, 0x43, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 000095C0 */ 0x43, 0x5C, 0x01, 0x2F, 0x1F, 0x02, 0x42, 0x42, 0x47, 0x2F, 0x42, 0x09, 0x1B, 0x00, 0x8E, 0x03, -/* 000095D0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, 0x43, 0x05, 0x07, 0x01, 0x00, 0x5C, -/* 000095E0 */ 0x00, 0x43, 0x1F, 0x01, 0x42, 0x42, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x14, 0x03, 0x00, 0x2F, 0x42, -/* 000095F0 */ 0x09, 0x18, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, 0x43, -/* 00009600 */ 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00009610 */ 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, -/* 00009620 */ 0x0E, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x03, 0xA1, 0x00, 0x0F, 0x43, 0xA1, 0x01, 0x10, 0x43, 0xA1, -/* 00009630 */ 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, -/* 00009640 */ 0x30, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, -/* 00009650 */ 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x12, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x03, 0xA1, 0x00, -/* 00009660 */ 0x0F, 0x43, 0xA1, 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, -/* 00009670 */ 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x31, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 00009680 */ 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x13, 0x5C, -/* 00009690 */ 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, -/* 000096A0 */ 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x32, 0x42, 0x8E, 0x03, 0x00, 0x00, -/* 000096B0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, -/* 000096C0 */ 0x02, 0x16, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x05, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, -/* 000096D0 */ 0xA1, 0x02, 0x0F, 0x43, 0xA1, 0x03, 0x10, 0x43, 0xA1, 0x04, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, -/* 000096E0 */ 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x33, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 000096F0 */ 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, -/* 00009700 */ 0x17, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, -/* 00009710 */ 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x34, 0x42, 0x8E, 0x03, -/* 00009720 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 00009730 */ 0x2B, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, -/* 00009740 */ 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x35, -/* 00009750 */ 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 00009760 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x19, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, -/* 00009770 */ 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, -/* 00009780 */ 0x42, 0x47, 0x36, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, -/* 00009790 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, -/* 000097A0 */ 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, -/* 000097B0 */ 0x1F, 0x06, 0x42, 0x42, 0x47, 0x37, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 000097C0 */ 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1B, 0x5C, 0x03, 0x0A, -/* 000097D0 */ 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x10, 0x43, 0xA1, 0x01, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, -/* 000097E0 */ 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x38, 0x42, 0x0F, 0x03, 0x00, 0x35, 0x09, 0x2D, -/* 000097F0 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x43, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 00009800 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x1D, 0xA8, 0x44, 0x5C, 0x04, 0x44, 0xA8, -/* 00009810 */ 0x44, 0x5C, 0x05, 0x44, 0x1F, 0x06, 0x43, 0x43, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, -/* 00009820 */ 0x47, 0x42, 0x43, 0x47, 0x39, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, -/* 00009830 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1E, 0x5C, 0x03, 0x0A, 0xCD, -/* 00009840 */ 0x43, 0x02, 0xA1, 0x00, 0x1F, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, 0x05, 0x0C, -/* 00009850 */ 0x1F, 0x06, 0x42, 0x42, 0x47, 0x3A, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x39, 0x42, 0x09, 0x16, -/* 00009860 */ 0x00, 0x0F, 0x03, 0x00, 0x39, 0x09, 0x06, 0x00, 0x47, 0x43, 0x20, 0x09, 0x03, 0x00, 0x47, 0x43, -/* 00009870 */ 0x21, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x3B, 0x42, 0x8E, -/* 00009880 */ 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00009890 */ 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 000098A0 */ 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x7A, 0x30, -/* 000098B0 */ 0x44, 0x07, 0x7A, 0x31, 0x44, 0x08, 0x7A, 0x32, 0x44, 0x09, 0x7A, 0x33, 0x44, 0x0A, 0x7A, 0x34, -/* 000098C0 */ 0x44, 0x0B, 0x7A, 0x35, 0x44, 0x0C, 0x7A, 0x36, 0x44, 0x0D, 0x7A, 0x37, 0x44, 0x0E, 0x7A, 0x38, -/* 000098D0 */ 0x44, 0x0F, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x22, 0x1F, 0x03, 0x43, 0x43, 0x5C, 0x01, 0x43, 0x1F, -/* 000098E0 */ 0x02, 0x42, 0x42, 0x47, 0x3C, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x42, -/* 000098F0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2A, 0x1F, 0x02, 0x42, 0x42, 0x47, 0x2A, 0x42, -/* 00009900 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x42, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, -/* 00009910 */ 0x5C, 0x01, 0x2A, 0x5C, 0x02, 0x2E, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x23, 0x43, 0xA1, 0x01, 0x24, -/* 00009920 */ 0x43, 0x5C, 0x03, 0x43, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x43, 0x5C, 0x04, -/* 00009930 */ 0x43, 0x1F, 0x05, 0x42, 0x42, 0x47, 0x3D, 0x42, 0x76, 0x2E, 0x29, 0x10, 0x76, 0x2F, 0x29, 0x11, -/* 00009940 */ 0x61, 0x42, 0x3D, 0x12, 0x76, 0x42, 0x29, 0x13, 0x76, 0x30, 0x29, 0x14, 0x76, 0x31, 0x29, 0x15, -/* 00009950 */ 0x76, 0x32, 0x29, 0x16, 0x76, 0x33, 0x29, 0x17, 0x76, 0x34, 0x29, 0x18, 0x76, 0x35, 0x29, 0x19, -/* 00009960 */ 0x76, 0x36, 0x29, 0x1A, 0x76, 0x37, 0x29, 0x1B, 0x76, 0x38, 0x29, 0x1C, 0x76, 0x39, 0x29, 0x1D, -/* 00009970 */ 0x76, 0x3A, 0x29, 0x1E, 0x76, 0x3B, 0x29, 0x1F, 0x76, 0x3C, 0x29, 0x20, 0x47, 0x3E, 0x25, 0xE5, -/* 00009980 */ 0x20, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x03, -/* 00009990 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, 0x25, 0x1F, 0x03, 0xFF, 0x42, 0xE9, 0x09, -/* 000099A0 */ 0x63, 0x00, 0xE7, 0x2C, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x42, 0x07, -/* 000099B0 */ 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2C, 0x1F, 0x02, 0xFF, 0x42, 0x8E, 0x01, 0x00, 0x00, -/* 000099C0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 000099D0 */ 0x2B, 0x5C, 0x02, 0x26, 0x5C, 0x03, 0x27, 0x1F, 0x04, 0x42, 0x42, 0x47, 0x3F, 0x42, 0x47, 0x42, -/* 000099E0 */ 0x29, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x43, 0x4B, 0x43, 0x07, 0x03, 0x00, -/* 000099F0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x22, 0x1F, 0x03, 0x43, 0x43, 0x76, 0x43, 0x42, -/* 00009A00 */ 0x21, 0x47, 0x3E, 0x06, 0xE9, 0x0F, 0x2E, 0x00, 0x3E, 0x09, 0x00, 0x00, 0x47, 0x42, 0x29, 0x8E, -/* 00009A10 */ 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x43, 0x4B, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00009A20 */ 0x04, 0x61, 0x44, 0x29, 0x22, 0x97, 0x44, 0x44, 0x28, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x29, 0x1F, -/* 00009A30 */ 0x03, 0x43, 0x43, 0x76, 0x43, 0x42, 0x21, 0xE5, 0x20, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x3E, -/* 00009A40 */ 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, -/* 00009A50 */ 0x02, 0x06, 0x1F, 0x03, 0xFF, 0x42, 0xE9, 0x09, 0x33, 0x00, 0xE7, 0x2D, 0x06, 0x8E, 0x03, 0x00, -/* 00009A60 */ 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2D, -/* 00009A70 */ 0x1F, 0x02, 0xFF, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, -/* 00009A80 */ 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0xE9, 0x8E, 0x01, 0x00, -/* 00009A90 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x61, -/* 00009AA0 */ 0x43, 0x29, 0x23, 0x5C, 0x01, 0x43, 0x1F, 0x02, 0x42, 0x42, 0x76, 0x42, 0x29, 0x24, 0x47, 0x42, -/* 00009AB0 */ 0x29, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00009AC0 */ 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x44, 0x5C, 0x01, 0x44, 0x61, 0x44, -/* 00009AD0 */ 0x29, 0x25, 0x5C, 0x02, 0x44, 0x1F, 0x03, 0x43, 0x43, 0x76, 0x43, 0x42, 0x26, 0x61, 0x42, 0x29, -/* 00009AE0 */ 0x27, 0xA8, 0x43, 0x15, 0x03, 0x00, 0x42, 0x43, 0x09, 0x0C, 0x00, 0x61, 0x42, 0x29, 0x28, 0x43, -/* 00009AF0 */ 0x42, 0x42, 0x20, 0x76, 0x42, 0x29, 0x1D, 0x76, 0x06, 0x29, 0x29, 0xA8, 0x00, 0x24, 0x00, 0x01, -/* 00009B00 */ 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x02, -/* 00009B10 */ 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x7E, 0x02, -/* 00009B20 */ 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x84, 0x02, -/* 00009B30 */ 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, 0x02, 0xFE, -/* 00009B40 */ 0x63, 0x02, 0xFE, 0x64, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x7B, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x7C, -/* 00009B50 */ 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x81, 0x02, -/* 00009B60 */ 0xFE, 0x84, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x17, 0x02, 0xFE, -/* 00009B70 */ 0x86, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x8B, -/* 00009B80 */ 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x91, 0x02, -/* 00009B90 */ 0xFE, 0x23, 0x02, 0xFE, 0x18, 0x02, 0xFE, 0x18, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x24, 0x02, 0xFE, -/* 00009BA0 */ 0x92, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x23, 0x02, 0xFE, 0x6C, -/* 00009BB0 */ 0x02, 0x00, 0xFF, 0x81, 0x1C, 0x01, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, -/* 00009BC0 */ 0x18, 0x00, 0x3F, 0x00, 0x39, 0x00, 0x9F, 0x00, 0x1E, 0x00, 0x71, 0x00, 0x04, 0x00, 0x67, 0x00, -/* 00009BD0 */ 0x22, 0x00, 0x46, 0x00, 0x31, 0x00, 0x71, 0x00, 0x2A, 0x00, 0x60, 0x00, 0x0A, 0x00, 0x32, 0x00, -/* 00009BE0 */ 0x21, 0x00, 0x6C, 0x00, 0x1B, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x18, 0x00, 0x6C, 0x00, -/* 00009BF0 */ 0x37, 0x00, 0x6F, 0x00, 0x37, 0x00, 0x67, 0x00, 0x33, 0x00, 0x64, 0x00, 0x3F, 0x00, 0x81, 0x00, -/* 00009C00 */ 0x33, 0x00, 0x62, 0x00, 0x33, 0x00, 0x64, 0x00, 0x33, 0x00, 0x68, 0x00, 0x33, 0x00, 0x68, 0x00, -/* 00009C10 */ 0x33, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x6F, 0x00, 0x31, 0x00, 0x77, 0x00, 0x28, 0x00, 0x71, 0x00, -/* 00009C20 */ 0x67, 0x00, 0xD0, 0x01, 0x1A, 0x00, 0x41, 0x00, 0x38, 0x00, 0x9A, 0x00, 0x04, 0x00, 0x34, 0x00, -/* 00009C30 */ 0x04, 0x00, 0x36, 0x00, 0x08, 0x00, 0x68, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x2C, 0x00, -/* 00009C40 */ 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x30, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, -/* 00009C50 */ 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x32, 0x00, -/* 00009C60 */ 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0xFA, 0x02, 0x06, 0x00, 0x93, 0x00, -/* 00009C70 */ 0x22, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x17, 0x00, 0xEF, 0x00, 0x22, 0x00, 0x54, 0x00, -/* 00009C80 */ 0x23, 0x00, 0x6A, 0x00, 0x04, 0x00, 0x37, 0x00, 0x07, 0x00, 0x5A, 0x00, 0x2E, 0x00, 0xDE, 0x00, -/* 00009C90 */ 0x22, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x17, 0x00, 0x77, 0x01, 0x19, 0x00, 0x77, 0x00, -/* 00009CA0 */ 0x21, 0x00, 0x66, 0x00, 0x2F, 0x00, 0x82, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x0C, 0x00, 0x6D, 0x00, -/* 00009CB0 */ 0x06, 0x00, 0x3F, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x8F, 0xFC, 0x07, 0xFE, 0x07, 0x04, 0xFE, -/* 00009CC0 */ 0x88, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x46, 0x00, 0xFF, 0xED, 0x0E, 0x01, 0x00, 0xFF, -/* 00009CD0 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFF, 0xED, 0x0E, 0x01, 0x00, 0xFE, 0x2D, 0x0D, 0xFE, 0x2D, -/* 00009CE0 */ 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, 0xC8, 0xBB, 0x03, 0x07, 0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0xFF, -/* 00009CF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, -/* 00009D00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00009D10 */ 0x02, 0x00, 0xFE, 0x32, 0x04, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x03, 0x02, 0x00, 0xFE, 0x33, -/* 00009D20 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x34, 0x04, 0x02, 0x00, 0xFE, 0x27, 0x04, -/* 00009D30 */ 0x02, 0x00, 0xFE, 0x35, 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, -/* 00009D40 */ 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, -/* 00009D50 */ 0xFE, 0x12, 0x04, 0x02, 0x00, 0xFE, 0x36, 0x04, 0xFE, 0x06, 0x03, 0xA8, 0x14, 0x61, 0x16, 0x13, -/* 00009D60 */ 0x00, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00009D70 */ 0x05, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, -/* 00009D80 */ 0x61, 0x17, 0x13, 0x00, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x02, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, -/* 00009D90 */ 0x16, 0x61, 0x16, 0x13, 0x01, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x00, 0x00, 0x61, -/* 00009DA0 */ 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, 0x16, 0x04, 0x09, 0x8E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00009DB0 */ 0x09, 0x00, 0x00, 0x00, 0x17, 0x6C, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, -/* 00009DC0 */ 0x01, 0x12, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x16, 0x16, 0x47, 0x14, 0x16, 0x14, -/* 00009DD0 */ 0x03, 0x00, 0x14, 0x05, 0x09, 0x2E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, -/* 00009DE0 */ 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, -/* 00009DF0 */ 0x17, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x06, 0xC2, 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, -/* 00009E00 */ 0xFF, 0x16, 0x09, 0x31, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, -/* 00009E10 */ 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x5C, -/* 00009E20 */ 0x01, 0x17, 0x5C, 0x02, 0x12, 0x97, 0x17, 0x14, 0x07, 0x5C, 0x03, 0x17, 0x5C, 0x04, 0x08, 0x1F, -/* 00009E30 */ 0x05, 0x16, 0x16, 0x47, 0x12, 0x16, 0x09, 0x97, 0x00, 0x61, 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, -/* 00009E40 */ 0x16, 0x09, 0x09, 0x8B, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x6C, -/* 00009E50 */ 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x01, 0x5C, -/* 00009E60 */ 0x02, 0x18, 0x1F, 0x03, 0x16, 0x16, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x2E, -/* 00009E70 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00009E80 */ 0x03, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, 0x07, 0x02, 0x00, 0x5C, 0x01, -/* 00009E90 */ 0x06, 0xC2, 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x09, 0x31, 0x00, 0x8E, -/* 00009EA0 */ 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8E, -/* 00009EB0 */ 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x12, 0x97, -/* 00009EC0 */ 0x17, 0x14, 0x07, 0x5C, 0x03, 0x17, 0x5C, 0x04, 0x0A, 0x1F, 0x05, 0x16, 0x16, 0x47, 0x12, 0x16, -/* 00009ED0 */ 0x61, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x41, 0x00, 0x61, 0x16, -/* 00009EE0 */ 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x04, 0x09, 0x35, 0x00, 0x61, 0x16, 0x13, 0x04, 0x15, 0x03, -/* 00009EF0 */ 0x00, 0x16, 0x0B, 0x09, 0x29, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, -/* 00009F00 */ 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x04, 0x5C, -/* 00009F10 */ 0x02, 0x17, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x09, 0x34, 0x00, 0x61, -/* 00009F20 */ 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, -/* 00009F30 */ 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, -/* 00009F40 */ 0x01, 0x12, 0x61, 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0x16, 0x16, -/* 00009F50 */ 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x05, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, -/* 00009F60 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, -/* 00009F70 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x05, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0D, -/* 00009F80 */ 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x06, 0xA8, 0x17, 0x15, 0x03, 0x00, -/* 00009F90 */ 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4B, -/* 00009FA0 */ 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x06, 0x5C, 0x02, -/* 00009FB0 */ 0x17, 0x5C, 0x03, 0x0E, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x07, 0xA8, -/* 00009FC0 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, -/* 00009FD0 */ 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, -/* 00009FE0 */ 0x13, 0x07, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, -/* 00009FF0 */ 0x16, 0x13, 0x08, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, -/* 0000A000 */ 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, -/* 0000A010 */ 0x01, 0x12, 0x61, 0x17, 0x13, 0x08, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x10, 0x1F, 0x04, 0x16, 0x16, -/* 0000A020 */ 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x09, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, -/* 0000A030 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, -/* 0000A040 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x09, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x11, -/* 0000A050 */ 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x47, 0x00, 0x12, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000A060 */ 0x00, 0x00, 0x00, 0xFE, 0x86, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x37, 0x02, 0xFE, -/* 0000A070 */ 0x88, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8F, -/* 0000A080 */ 0x02, 0x00, 0x1C, 0xFE, 0x37, 0x04, 0x00, 0x1C, 0xFE, 0x37, 0x04, 0x00, 0xFF, 0x3C, 0x0F, 0x01, -/* 0000A090 */ 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x26, 0x00, 0x88, 0x00, 0x0E, 0x00, -/* 0000A0A0 */ 0x8E, 0x01, 0x0C, 0x00, 0x3F, 0x00, 0x24, 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x2E, 0x00, -/* 0000A0B0 */ 0x91, 0x00, 0x34, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x6B, 0x00, 0x08, 0x00, -/* 0000A0C0 */ 0x2E, 0x00, 0x2E, 0x00, 0x91, 0x00, 0x31, 0x00, 0x2F, 0x01, 0x26, 0x00, 0x90, 0x00, 0x29, 0x00, -/* 0000A0D0 */ 0x76, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x26, 0x00, 0x8B, 0x00, 0x0E, 0x00, 0x3E, 0x00, 0x26, 0x00, -/* 0000A0E0 */ 0x87, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x89, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x26, 0x00, -/* 0000A0F0 */ 0x8D, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x26, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x47, 0x00, 0x26, 0x00, -/* 0000A100 */ 0x8C, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x06, -/* 0000A110 */ 0x04, 0xFE, 0x74, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x45, 0x00, 0xFF, 0x85, 0x09, 0x01, -/* 0000A120 */ 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x85, 0x09, 0x01, 0x00, 0xFE, 0xF8, 0x04, -/* 0000A130 */ 0xFE, 0xF8, 0x04, 0x01, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, -/* 0000A140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, -/* 0000A150 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000A160 */ 0x00, 0x02, 0x00, 0xFE, 0x22, 0x04, 0x02, 0x00, 0xFE, 0x2D, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, -/* 0000A170 */ 0x2E, 0x04, 0x02, 0x00, 0xFE, 0x25, 0x04, 0x02, 0x00, 0xFE, 0x26, 0x04, 0x02, 0x00, 0xFE, 0x18, -/* 0000A180 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x28, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 0000A190 */ 0x02, 0x00, 0xFE, 0x2F, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x30, 0x04, 0x02, -/* 0000A1A0 */ 0x00, 0xFE, 0x31, 0x04, 0xFE, 0x1A, 0x01, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000A1B0 */ 0x17, 0x6C, 0x16, 0x17, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x11, 0x8E, 0x03, -/* 0000A1C0 */ 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x18, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, 0x19, -/* 0000A1D0 */ 0x02, 0x13, 0x03, 0x5C, 0x01, 0x19, 0x1F, 0x02, 0x18, 0x18, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x16, -/* 0000A1E0 */ 0x16, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x40, 0x00, 0x8E, 0x03, 0x00, 0x00, -/* 0000A1F0 */ 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, -/* 0000A200 */ 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, 0x07, 0x02, 0x00, 0xFC, 0x18, 0x06, 0x11, 0x06, 0xFE, 0x18, -/* 0000A210 */ 0x07, 0x02, 0x02, 0xFE, 0x18, 0x13, 0x08, 0x04, 0x5C, 0x01, 0x18, 0xC2, 0x02, 0x17, 0x17, 0x5C, -/* 0000A220 */ 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x47, 0x00, 0x11, 0x09, 0x93, 0x00, 0x14, 0x03, 0x00, 0x12, -/* 0000A230 */ 0x09, 0x09, 0x3D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x05, -/* 0000A240 */ 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, -/* 0000A250 */ 0x17, 0x5C, 0x02, 0x11, 0x97, 0x17, 0x14, 0x0A, 0x5C, 0x03, 0x17, 0x97, 0x17, 0x14, 0x0C, 0xFB, -/* 0000A260 */ 0x17, 0x0B, 0x17, 0x0D, 0x5C, 0x04, 0x17, 0x1F, 0x05, 0x00, 0x16, 0x09, 0x51, 0x00, 0x09, 0x46, -/* 0000A270 */ 0x00, 0x97, 0x16, 0x14, 0x0E, 0x15, 0x03, 0x00, 0x16, 0x0F, 0x09, 0x3A, 0x00, 0x8E, 0x03, 0x00, -/* 0000A280 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, -/* 0000A290 */ 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x97, 0x17, 0x14, -/* 0000A2A0 */ 0x0A, 0x5C, 0x03, 0x17, 0x97, 0x17, 0x14, 0x0C, 0xFB, 0x17, 0x0B, 0x17, 0x10, 0x5C, 0x04, 0x17, -/* 0000A2B0 */ 0x1F, 0x05, 0x00, 0x16, 0x09, 0x08, 0x00, 0x47, 0x00, 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000A2C0 */ 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, 0xFF, 0xAC, 0x0A, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000A2D0 */ 0x00, 0x3D, 0x00, 0x91, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x3A, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, -/* 0000A2E0 */ 0x00, 0x08, 0x00, 0x33, 0x00, 0x3D, 0x00, 0x81, 0x00, 0x0C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x8A, -/* 0000A2F0 */ 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x05, 0x04, -/* 0000A300 */ 0xFE, 0x63, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x44, 0x00, 0xFF, 0x57, 0x04, 0x01, 0x00, -/* 0000A310 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x57, 0x04, 0x01, 0x00, 0xFE, 0x20, 0x05, 0xFE, -/* 0000A320 */ 0x20, 0x05, 0x01, 0x09, 0x14, 0x19, 0x07, 0x50, 0x4B, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, 0xFF, -/* 0000A330 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0xFF, -/* 0000A340 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000A350 */ 0x02, 0x00, 0xFE, 0x22, 0x04, 0x02, 0x00, 0xFE, 0x23, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, 0x24, -/* 0000A360 */ 0x04, 0x02, 0x00, 0xFE, 0x25, 0x04, 0x02, 0x00, 0xFE, 0x26, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, -/* 0000A370 */ 0x02, 0x00, 0xFE, 0x27, 0x04, 0x02, 0x00, 0xFE, 0x16, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, -/* 0000A380 */ 0x01, 0xFE, 0x28, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x29, 0x04, 0x02, 0x01, -/* 0000A390 */ 0xFE, 0x2A, 0x04, 0x02, 0x00, 0xFE, 0x14, 0x04, 0x02, 0x00, 0xFE, 0x2B, 0x04, 0x02, 0x00, 0xFE, -/* 0000A3A0 */ 0x2C, 0x04, 0xFE, 0x49, 0x01, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x6C, -/* 0000A3B0 */ 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x14, 0x8E, 0x03, 0x00, 0x00, -/* 0000A3C0 */ 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, 0x1C, 0x02, 0x16, -/* 0000A3D0 */ 0x03, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1B, 0x1B, 0x5C, 0x02, 0x1B, 0x1F, 0x03, 0x19, 0x19, 0x47, -/* 0000A3E0 */ 0x17, 0x19, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x40, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x14, -/* 0000A3F0 */ 0x00, 0x00, 0x00, 0x19, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x13, -/* 0000A400 */ 0x00, 0x00, 0x00, 0x1A, 0x07, 0x02, 0x00, 0xFC, 0x1B, 0x06, 0x14, 0x06, 0xFE, 0x1B, 0x07, 0x02, -/* 0000A410 */ 0x02, 0xFE, 0x1B, 0x16, 0x08, 0x04, 0x5C, 0x01, 0x1B, 0xC2, 0x02, 0x1A, 0x1A, 0x5C, 0x01, 0x1A, -/* 0000A420 */ 0x1F, 0x02, 0xFF, 0x19, 0x47, 0x00, 0x14, 0x09, 0xC2, 0x00, 0x97, 0x19, 0x17, 0x09, 0x15, 0x03, -/* 0000A430 */ 0x00, 0x19, 0x0A, 0x09, 0x50, 0x00, 0x14, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x48, 0x00, 0x8E, 0x03, -/* 0000A440 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, -/* 0000A450 */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x97, 0x1A, -/* 0000A460 */ 0x17, 0x0C, 0x5C, 0x03, 0x1A, 0x97, 0x1A, 0x17, 0x0E, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, -/* 0000A470 */ 0x0F, 0x2F, 0x1A, 0x1A, 0x0A, 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0x00, 0x19, -/* 0000A480 */ 0x09, 0x69, 0x00, 0x09, 0x5E, 0x00, 0x15, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x56, 0x00, 0x8E, 0x03, -/* 0000A490 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, -/* 0000A4A0 */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x97, 0x1A, -/* 0000A4B0 */ 0x17, 0x0C, 0x5C, 0x03, 0x1A, 0x97, 0x1A, 0x17, 0x0E, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, -/* 0000A4C0 */ 0x0F, 0x14, 0x03, 0x00, 0x15, 0x11, 0x09, 0x06, 0x00, 0x47, 0x1B, 0x12, 0x09, 0x03, 0x00, 0x47, -/* 0000A4D0 */ 0x1B, 0x13, 0x2F, 0x1A, 0x1A, 0x1B, 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0x00, -/* 0000A4E0 */ 0x19, 0x09, 0x08, 0x00, 0x47, 0x00, 0x14, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000A4F0 */ 0xFE, 0x37, 0x02, 0x00, 0xFF, 0x2D, 0x05, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, -/* 0000A500 */ 0x0F, 0x01, 0x08, 0x00, 0x2A, 0x00, 0x3A, 0x00, 0xF5, 0x00, 0x06, 0x00, 0x39, 0x00, 0x14, 0x00, -/* 0000A510 */ 0x47, 0x00, 0x48, 0x00, 0x85, 0x00, 0x08, 0x00, 0x30, 0x00, 0x56, 0x00, 0xC4, 0x00, 0x08, 0x00, -/* 0000A520 */ 0x22, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x04, 0x04, 0xFE, 0x5A, 0x05, -/* 0000A530 */ 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x43, 0x00, 0xFF, 0xF0, 0x02, 0x01, 0x00, 0xFF, 0x00, 0x10, -/* 0000A540 */ 0x01, 0x00, 0x02, 0x02, 0xFF, 0xF0, 0x02, 0x01, 0x00, 0xE9, 0xE9, 0x01, 0x03, 0x05, 0x07, 0x0E, -/* 0000A550 */ 0x0B, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A560 */ 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A570 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, -/* 0000A580 */ 0xFE, 0xEA, 0x03, 0x30, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x06, 0x00, 0x47, -/* 0000A590 */ 0x00, 0x03, 0x09, 0x1D, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x97, -/* 0000A5A0 */ 0x07, 0x07, 0x05, 0x47, 0x00, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, -/* 0000A5B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x2B, 0x03, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, -/* 0000A5C0 */ 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x06, 0x00, 0x2E, 0x00, 0x1D, 0x00, 0x44, 0x00, 0x00, 0x3F, 0xFD, -/* 0000A5D0 */ 0x02, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0x03, 0x04, 0xFE, 0x1A, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, -/* 0000A5E0 */ 0x00, 0x41, 0x00, 0xFE, 0x78, 0xF7, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x78, -/* 0000A5F0 */ 0xF7, 0xFE, 0x95, 0x09, 0xFE, 0x95, 0x09, 0x02, 0x06, 0x17, 0x1B, 0x05, 0xCC, 0xCA, 0x03, 0x07, -/* 0000A600 */ 0x05, 0x05, 0x05, 0x05, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A610 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 0000A620 */ 0x13, 0x04, 0x02, 0x00, 0xFE, 0x14, 0x04, 0x02, 0x00, 0xFE, 0x15, 0x04, 0x04, 0x02, 0x00, 0xFE, -/* 0000A630 */ 0x16, 0x04, 0x02, 0x00, 0xFE, 0x17, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x02, 0x00, 0xFE, 0x19, -/* 0000A640 */ 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x00, 0xFE, 0x1A, 0x04, 0x02, 0x00, 0xFE, 0x1B, 0x04, -/* 0000A650 */ 0x02, 0x00, 0xFE, 0x1C, 0x04, 0x02, 0x00, 0xFE, 0x1D, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, -/* 0000A660 */ 0x00, 0xFE, 0x1E, 0x04, 0x02, 0x00, 0xFE, 0x1F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, -/* 0000A670 */ 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, -/* 0000A680 */ 0x20, 0x04, 0xFE, 0xAD, 0x03, 0x96, 0x03, 0x00, 0x00, 0x00, 0x17, 0xCD, 0x1B, 0x00, 0x96, 0x02, -/* 0000A690 */ 0x00, 0x00, 0x00, 0x1B, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x0F, 0x03, -/* 0000A6A0 */ 0x00, 0x1B, 0x09, 0x93, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x14, -/* 0000A6B0 */ 0x15, 0x00, 0x1B, 0x02, 0x09, 0x00, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, -/* 0000A6C0 */ 0x00, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x30, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000A6D0 */ 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000A6E0 */ 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, -/* 0000A6F0 */ 0x03, 0x04, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x3F, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, -/* 0000A700 */ 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000A710 */ 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000A720 */ 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, -/* 0000A730 */ 0x1C, 0x5C, 0x03, 0x07, 0x1F, 0x04, 0xFF, 0x1B, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, -/* 0000A740 */ 0x1B, 0x01, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x81, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, -/* 0000A750 */ 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x08, 0x09, 0x30, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000A760 */ 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000A770 */ 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, -/* 0000A780 */ 0x1C, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x3F, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, -/* 0000A790 */ 0x1B, 0x61, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, -/* 0000A7A0 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, -/* 0000A7B0 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, -/* 0000A7C0 */ 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0B, 0x1F, 0x04, 0xFF, 0x1B, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, -/* 0000A7D0 */ 0x61, 0x1B, 0x1B, 0x02, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0xE7, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, -/* 0000A7E0 */ 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x15, 0x00, 0x1B, 0x08, 0x09, 0x00, 0x00, 0x92, 0x03, 0x00, -/* 0000A7F0 */ 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x30, 0x00, 0x8E, -/* 0000A800 */ 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, -/* 0000A810 */ 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, -/* 0000A820 */ 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x93, 0x00, 0x92, -/* 0000A830 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x15, 0x00, 0x1B, 0x03, 0x09, 0x00, -/* 0000A840 */ 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, 0x1B, 0x02, -/* 0000A850 */ 0x09, 0x30, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, -/* 0000A860 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, -/* 0000A870 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0xFF, 0x1B, -/* 0000A880 */ 0x09, 0x3F, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, -/* 0000A890 */ 0x1B, 0x06, 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, -/* 0000A8A0 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, -/* 0000A8B0 */ 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0E, 0x1F, 0x04, -/* 0000A8C0 */ 0xFF, 0x1B, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x03, 0x0F, 0x03, 0x00, 0x1B, -/* 0000A8D0 */ 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, -/* 0000A8E0 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, -/* 0000A8F0 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0xFF, 0x1B, -/* 0000A900 */ 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x81, -/* 0000A910 */ 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x03, -/* 0000A920 */ 0x09, 0x30, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, -/* 0000A930 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, -/* 0000A940 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x10, 0x1F, 0x04, 0xFF, 0x1B, -/* 0000A950 */ 0x09, 0x3F, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, -/* 0000A960 */ 0x1B, 0x06, 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, -/* 0000A970 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, -/* 0000A980 */ 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x11, 0x1F, 0x04, -/* 0000A990 */ 0xFF, 0x1B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, -/* 0000A9A0 */ 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0xCD, -/* 0000A9B0 */ 0x1C, 0x03, 0xA1, 0x00, 0x12, 0x1C, 0xA1, 0x01, 0x13, 0x1C, 0xA1, 0x02, 0x14, 0x1C, 0x5C, 0x02, -/* 0000A9C0 */ 0x1C, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x03, 0x1C, 0x1F, 0x04, 0xFF, 0x1B, 0x8E, 0x03, -/* 0000A9D0 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x92, 0x02, -/* 0000A9E0 */ 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1B, 0x1B, 0x11, 0x03, 0x00, 0x1B, 0x15, -/* 0000A9F0 */ 0x09, 0x33, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, -/* 0000AA00 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, -/* 0000AA10 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x16, 0x1F, 0x04, 0x1B, 0x1B, -/* 0000AA20 */ 0x47, 0x00, 0x1B, 0x09, 0x05, 0x00, 0xA8, 0x1B, 0x47, 0x00, 0x1B, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 0000AA30 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x7B, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, -/* 0000AA40 */ 0xFE, 0x84, 0x02, 0xFE, 0x21, 0x04, 0xFE, 0xFB, 0x01, 0x00, 0xFE, 0xB9, 0xF7, 0x1C, 0x06, 0x00, -/* 0000AA50 */ 0x00, 0x00, 0x09, 0x00, 0x24, 0x00, 0x11, 0x00, 0x2B, 0x00, 0x24, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 0000AA60 */ 0x63, 0x00, 0x12, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0xA5, 0x00, 0x11, 0x00, 0x28, 0x00, 0x12, 0x00, -/* 0000AA70 */ 0x3A, 0x00, 0x30, 0x00, 0x5E, 0x00, 0x12, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x11, 0x00, -/* 0000AA80 */ 0x29, 0x00, 0x24, 0x00, 0x5A, 0x00, 0x30, 0x00, 0x5A, 0x00, 0x24, 0x00, 0x57, 0x00, 0x30, 0x00, -/* 0000AA90 */ 0x5F, 0x00, 0x12, 0x00, 0x38, 0x00, 0x2D, 0x00, 0x76, 0x00, 0x11, 0x00, 0x27, 0x00, 0x2D, 0x00, -/* 0000AAA0 */ 0x59, 0x00, 0x11, 0x00, 0x30, 0x00, 0x12, 0x00, 0x40, 0x00, 0x30, 0x00, 0x62, 0x00, 0x12, 0x00, -/* 0000AAB0 */ 0x3F, 0x00, 0x2D, 0x00, 0x79, 0x00, 0x3C, 0x00, 0x3B, 0x01, 0x62, 0x00, 0x72, 0x00, 0x00, 0xC3, -/* 0000AAC0 */ 0xAA, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, -/* 0000AAD0 */ 0x44, 0x05, 0x55, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x42, 0x00, 0xFE, 0xA4, 0xFF, 0xFF, 0x00, 0x10, -/* 0000AAE0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA4, 0xFF, 0xAC, 0xAC, 0x41, 0x04, 0x03, 0x05, 0x05, 0x10, 0x10, -/* 0000AAF0 */ 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AB00 */ 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AB10 */ 0xFF, 0x00, 0x00, 0x04, 0x4A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x97, -/* 0000AB20 */ 0x05, 0x05, 0x03, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x31, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0C, -/* 0000AB30 */ 0x00, 0x00, 0x00, 0x05, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x1E, -/* 0000AB40 */ 0x00, 0x00, 0x00, 0x06, 0x5C, 0x01, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000AB50 */ 0x06, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0xFF, 0x05, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000AB60 */ 0x00, 0x00, 0xFE, 0xC9, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x2C, 0x00, 0x33, 0x00, -/* 0000AB70 */ 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x4F, 0xFC, 0x07, 0xFE, 0x02, 0x04, 0xFE, 0xE7, 0x04, -/* 0000AB80 */ 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x40, 0x00, 0xFE, 0xBF, 0xED, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000AB90 */ 0x04, 0x04, 0xFE, 0xBF, 0xED, 0xFE, 0x21, 0x09, 0xFE, 0x21, 0x09, 0x01, 0x07, 0x15, 0x1A, 0x05, -/* 0000ABA0 */ 0x93, 0x8D, 0x03, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ABB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ABC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x08, 0x02, 0x01, 0xFE, -/* 0000ABD0 */ 0x09, 0x04, 0x02, 0x00, 0xFE, 0x0A, 0x04, 0x09, 0x02, 0x00, 0xFE, 0x0B, 0x04, 0x02, 0x01, 0xFE, -/* 0000ABE0 */ 0x0C, 0x04, 0x02, 0x01, 0xFE, 0x0D, 0x04, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xB5, -/* 0000ABF0 */ 0x03, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x03, -/* 0000AC00 */ 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, -/* 0000AC10 */ 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0xFE, 0x69, 0x02, 0xA8, 0x1A, 0x14, 0x03, -/* 0000AC20 */ 0x00, 0x15, 0x1A, 0x09, 0x22, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x1A, -/* 0000AC30 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x1B, 0x5C, 0x01, 0x1B, 0x5C, 0x02, 0x02, 0x1F, 0x03, -/* 0000AC40 */ 0x1A, 0x1A, 0x47, 0x15, 0x1A, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, -/* 0000AC50 */ 0x00, 0x1B, 0x6C, 0x1A, 0x1B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, 0x1F, -/* 0000AC60 */ 0x02, 0x1A, 0x1A, 0x47, 0x15, 0x1A, 0x47, 0x18, 0x04, 0x14, 0x0B, 0x00, 0x16, 0x05, 0x09, 0x00, -/* 0000AC70 */ 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x3B, 0x00, 0x61, 0x1A, 0x15, 0x01, 0xA8, 0x1B, 0x15, -/* 0000AC80 */ 0x2D, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x02, 0xA8, 0x1B, 0x15, 0x1F, 0x00, -/* 0000AC90 */ 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x03, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, -/* 0000ACA0 */ 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x04, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, -/* 0000ACB0 */ 0x00, 0x47, 0x18, 0x07, 0x14, 0x0B, 0x00, 0x16, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, -/* 0000ACC0 */ 0x06, 0x09, 0x2D, 0x00, 0x61, 0x1A, 0x15, 0x05, 0xA8, 0x1B, 0x15, 0x1F, 0x00, 0x1A, 0x1B, 0x09, -/* 0000ACD0 */ 0x00, 0x00, 0x61, 0x1A, 0x15, 0x06, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, -/* 0000ACE0 */ 0x61, 0x1A, 0x15, 0x07, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, 0x00, 0x47, 0x18, -/* 0000ACF0 */ 0x07, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xBE, 0x00, 0x14, 0x0B, 0x00, 0x17, 0x05, 0x09, 0x00, 0x00, -/* 0000AD00 */ 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xAE, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000AD10 */ 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x0A, 0xCC, 0x00, -/* 0000AD20 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, -/* 0000AD30 */ 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, -/* 0000AD40 */ 0xFF, 0x1A, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, -/* 0000AD50 */ 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x10, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -/* 0000AD60 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, -/* 0000AD70 */ 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x8E, 0x03, 0x00, 0x00, -/* 0000AD80 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, -/* 0000AD90 */ 0x02, 0x11, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, -/* 0000ADA0 */ 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, -/* 0000ADB0 */ 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xBE, 0x00, 0x14, 0x0B, 0x00, -/* 0000ADC0 */ 0x17, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xAE, 0x00, 0x8E, 0x03, 0x00, -/* 0000ADD0 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, -/* 0000ADE0 */ 0x5C, 0x02, 0x12, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, -/* 0000ADF0 */ 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, -/* 0000AE00 */ 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, -/* 0000AE10 */ 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x13, 0xCC, 0x60, 0x00, -/* 0000AE20 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, -/* 0000AE30 */ 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, -/* 0000AE40 */ 0x1A, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000AE50 */ 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x14, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -/* 0000AE60 */ 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, -/* 0000AE70 */ 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x47, 0x00, 0x15, 0x09, 0x02, -/* 0000AE80 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x06, 0x90, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, -/* 0000AE90 */ 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, -/* 0000AEA0 */ 0xB2, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000AEB0 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000AEC0 */ 0x48, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, -/* 0000AED0 */ 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, -/* 0000AEE0 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 0000AEF0 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, -/* 0000AF00 */ 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, -/* 0000AF10 */ 0xB2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000AF20 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000AF30 */ 0x00, 0xFE, 0x52, 0x03, 0xFE, 0x7B, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, -/* 0000AF40 */ 0xFE, 0x80, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x81, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, -/* 0000AF50 */ 0xB1, 0x01, 0xFE, 0xB2, 0x01, 0x00, 0xFE, 0x09, 0xEE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 0000AF60 */ 0x31, 0x00, 0x22, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x10, 0x00, -/* 0000AF70 */ 0x45, 0x00, 0x38, 0x00, 0x97, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x45, 0x00, 0x2A, 0x00, -/* 0000AF80 */ 0x7A, 0x00, 0x03, 0x00, 0x4F, 0x00, 0x17, 0x00, 0x57, 0x00, 0x3A, 0x00, 0xCB, 0x00, 0x3A, 0x00, -/* 0000AF90 */ 0xCC, 0x00, 0x3A, 0x00, 0xD8, 0x00, 0x17, 0x00, 0x57, 0x00, 0x3A, 0x00, 0xCB, 0x00, 0x3A, 0x00, -/* 0000AFA0 */ 0xCD, 0x00, 0x3A, 0x00, 0xDB, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x4F, -/* 0000AFB0 */ 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xD0, 0x03, 0x18, 0xFF, 0xA0, 0x41, 0xD1, 0x00, -/* 0000AFC0 */ 0x37, 0x00, 0xFE, 0x54, 0xB4, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x54, 0xB4, -/* 0000AFD0 */ 0xFE, 0x76, 0x38, 0xFE, 0x76, 0x38, 0x03, 0x0D, 0x2D, 0x33, 0x09, 0xC5, 0xC5, 0x01, 0x09, 0x0F, -/* 0000AFE0 */ 0x0F, 0x0F, 0x0F, 0x07, 0x02, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x32, 0xFF, 0xFF, 0xFF, -/* 0000AFF0 */ 0xFF, 0xFF, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC2, 0x03, 0x01, -/* 0000B000 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC3, 0x03, 0x02, 0x01, 0xFE, 0xC4, 0x03, 0x01, 0x01, -/* 0000B010 */ 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC5, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, -/* 0000B020 */ 0xC6, 0x03, 0x01, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x01, 0xFE, 0xC7, 0x03, 0x02, 0x01, -/* 0000B030 */ 0xFE, 0xC8, 0x03, 0x02, 0x01, 0xFE, 0xC9, 0x03, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, -/* 0000B040 */ 0xCA, 0x03, 0x02, 0x00, 0xFE, 0xCB, 0x03, 0x02, 0x00, 0xFE, 0xCC, 0x03, 0x02, 0x00, 0xFE, 0xCD, -/* 0000B050 */ 0x03, 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, -/* 0000B060 */ 0x08, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0xCE, 0x03, -/* 0000B070 */ 0x02, 0x00, 0xFE, 0xCF, 0x03, 0x02, 0x00, 0xFE, 0xD0, 0x03, 0x02, 0x00, 0xFE, 0xD1, 0x03, 0x02, -/* 0000B080 */ 0x00, 0xFE, 0xD2, 0x03, 0x02, 0x00, 0xFE, 0xD3, 0x03, 0x02, 0x00, 0xFE, 0xD4, 0x03, 0x02, 0x01, -/* 0000B090 */ 0xFE, 0xD5, 0x03, 0x02, 0x01, 0xFE, 0xD6, 0x03, 0x02, 0x00, 0xFE, 0xD7, 0x03, 0x02, 0x01, 0xFE, -/* 0000B0A0 */ 0xA0, 0x03, 0x09, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x02, 0x01, 0xFE, -/* 0000B0B0 */ 0xA2, 0x03, 0x02, 0x01, 0xFE, 0xD8, 0x03, 0x02, 0x01, 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xD9, -/* 0000B0C0 */ 0x03, 0xFE, 0xED, 0x03, 0xA8, 0x2D, 0xA8, 0x2E, 0xA8, 0x2F, 0x4F, 0x35, 0x96, 0x03, 0x00, 0x00, -/* 0000B0D0 */ 0x00, 0x35, 0x4F, 0x35, 0x96, 0x04, 0x00, 0x00, 0x00, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, -/* 0000B0E0 */ 0x00, 0x00, 0x00, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B0F0 */ 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7A, 0x03, 0x36, 0x00, 0x7A, 0x03, 0x36, 0x01, 0x7A, -/* 0000B100 */ 0x06, 0x36, 0x02, 0x7A, 0x08, 0x36, 0x03, 0x7A, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5C, 0x02, -/* 0000B110 */ 0x0B, 0x1F, 0x03, 0x35, 0x35, 0x96, 0x03, 0x00, 0x00, 0x00, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000B120 */ 0x0A, 0x00, 0x00, 0x00, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x1C, 0x00, 0x00, 0x00, -/* 0000B130 */ 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7A, 0x03, 0x36, 0x00, 0x7A, 0x03, 0x36, 0x05, -/* 0000B140 */ 0x7A, 0x06, 0x36, 0x06, 0x7A, 0x08, 0x36, 0x07, 0x7A, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5C, -/* 0000B150 */ 0x02, 0x0B, 0x1F, 0x03, 0x35, 0x35, 0x96, 0x04, 0x00, 0x00, 0x00, 0x35, 0x8E, 0x01, 0x00, 0x00, -/* 0000B160 */ 0x00, 0x38, 0x00, 0x00, 0x00, 0x35, 0x14, 0x15, 0x00, 0x35, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x01, -/* 0000B170 */ 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x35, 0x14, 0x03, 0x00, 0x35, 0x11, 0x09, 0x28, 0x03, -/* 0000B180 */ 0xDE, 0x00, 0x03, 0x02, 0xB8, 0x35, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x35, -/* 0000B190 */ 0x95, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 0000B1A0 */ 0x00, 0x00, 0x00, 0x36, 0x6C, 0x35, 0x36, 0x08, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x36, 0x8E, 0x01, -/* 0000B1B0 */ 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x37, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, -/* 0000B1C0 */ 0x12, 0xB8, 0x39, 0x00, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x38, 0x39, 0x5C, 0x02, 0x38, -/* 0000B1D0 */ 0x1F, 0x03, 0x37, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x0A, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, -/* 0000B1E0 */ 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x35, 0x14, 0x03, 0x00, 0x35, 0x10, 0x09, 0xB8, 0x02, -/* 0000B1F0 */ 0xDE, 0x01, 0x04, 0x03, 0xB8, 0x35, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x35, 0x35, 0x01, 0x50, -/* 0000B200 */ 0x01, 0x02, 0x00, 0x00, 0x00, 0x2E, 0x35, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000B210 */ 0x2E, 0x01, 0x50, 0x01, 0x03, 0x00, 0x00, 0x00, 0x2F, 0x35, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, -/* 0000B220 */ 0x00, 0x00, 0x00, 0x2F, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x35, 0x07, 0x03, -/* 0000B230 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x13, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000B240 */ 0x36, 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, -/* 0000B250 */ 0x00, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x14, 0x90, 0x01, 0x00, 0x00, 0x00, -/* 0000B260 */ 0x03, 0x00, 0x00, 0x00, 0x36, 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, -/* 0000B270 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, -/* 0000B280 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x15, 0xCC, 0x38, 0x00, 0x00, -/* 0000B290 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 0000B2A0 */ 0x00, 0x00, 0x37, 0x4B, 0x37, 0x7A, 0x37, 0x36, 0x09, 0x7A, 0x18, 0x36, 0x0A, 0x7A, 0x18, 0x36, -/* 0000B2B0 */ 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0xCD, 0x35, 0x0B, 0xA1, 0x00, 0x1A, 0x35, 0xA1, -/* 0000B2C0 */ 0x01, 0x1B, 0x35, 0xA1, 0x02, 0x1C, 0x35, 0xA1, 0x03, 0x1D, 0x35, 0xA1, 0x04, 0x1E, 0x35, 0xA1, -/* 0000B2D0 */ 0x05, 0x1F, 0x35, 0xA1, 0x06, 0x20, 0x35, 0xA1, 0x07, 0x21, 0x35, 0xA1, 0x08, 0x22, 0x35, 0xA1, -/* 0000B2E0 */ 0x09, 0x23, 0x35, 0xA1, 0x0A, 0x24, 0x35, 0x96, 0x02, 0x00, 0x00, 0x00, 0x35, 0x8E, 0x01, 0x00, -/* 0000B2F0 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, -/* 0000B300 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x25, 0xCC, 0x4C, 0x00, -/* 0000B310 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B320 */ 0x00, 0x00, 0x00, 0x37, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x37, 0x37, 0x7A, 0x37, 0x36, 0x09, 0x7A, -/* 0000B330 */ 0x26, 0x36, 0x0A, 0x7A, 0x26, 0x36, 0x0C, 0x7A, 0x26, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, -/* 0000B340 */ 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x35, 0x07, 0x03, 0x00, 0x5C, -/* 0000B350 */ 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x61, 0x36, 0x36, 0x0D, -/* 0000B360 */ 0x5C, 0x01, 0x36, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x36, 0x61, 0x36, 0x36, -/* 0000B370 */ 0x0D, 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000B380 */ 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000B390 */ 0x00, 0x36, 0x61, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x28, 0xCC, 0x64, 0x00, 0x00, -/* 0000B3A0 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000B3B0 */ 0x00, 0x00, 0x37, 0x7A, 0x37, 0x36, 0x09, 0x7A, 0x18, 0x36, 0x0A, 0x7A, 0x26, 0x36, 0x0C, 0x7A, -/* 0000B3C0 */ 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, -/* 0000B3D0 */ 0x00, 0x00, 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B3E0 */ 0x00, 0x00, 0x00, 0x36, 0x61, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x29, 0xCC, 0x7C, -/* 0000B3F0 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xB8, 0x38, 0x00, 0xB7, 0x01, -/* 0000B400 */ 0x00, 0x00, 0x00, 0x38, 0x38, 0x01, 0x50, 0x01, 0x04, 0x00, 0x00, 0x00, 0x37, 0x38, 0x7A, 0x37, -/* 0000B410 */ 0x36, 0x09, 0x01, 0x64, 0x01, 0x37, 0x36, 0x7A, 0x18, 0x36, 0x0A, 0x7A, 0x26, 0x36, 0x0C, 0x7A, -/* 0000B420 */ 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, -/* 0000B430 */ 0x00, 0x00, 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B440 */ 0x00, 0x00, 0x00, 0x36, 0x61, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x2A, 0xCC, 0x94, -/* 0000B450 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000B460 */ 0x2A, 0x00, 0x00, 0x00, 0x37, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x2C, 0xB8, 0x39, -/* 0000B470 */ 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x39, 0x39, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, 0x00, 0x38, -/* 0000B480 */ 0x39, 0x5C, 0x02, 0x38, 0x1F, 0x03, 0x37, 0x37, 0x7A, 0x37, 0x36, 0x0E, 0x7A, 0x26, 0x36, 0x0C, -/* 0000B490 */ 0x7A, 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x90, 0x01, 0x00, 0x00, 0x00, -/* 0000B4A0 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000B4B0 */ 0x00, 0x07, 0xA8, 0x00, 0x94, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B4C0 */ 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, -/* 0000B4D0 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 0000B4E0 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, -/* 0000B4F0 */ 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, -/* 0000B500 */ 0xB2, 0x01, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B510 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000B520 */ 0x38, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, -/* 0000B530 */ 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, -/* 0000B540 */ 0x00, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00, 0x00, 0xC7, 0x03, 0x00, 0x00, 0xC8, 0x03, 0x00, 0x00, -/* 0000B550 */ 0xC9, 0x03, 0x00, 0x00, 0xC6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, -/* 0000B560 */ 0x00, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00, 0x00, 0xC3, 0x03, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x00, -/* 0000B570 */ 0xC5, 0x03, 0x00, 0x00, 0xC6, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xC2, 0x03, 0xFE, 0xC3, 0x03, 0xFE, -/* 0000B580 */ 0xC4, 0x03, 0xFE, 0xC5, 0x03, 0xFE, 0xC6, 0x03, 0xFE, 0xC7, 0x03, 0xFE, 0xC8, 0x03, 0xFE, 0xC9, -/* 0000B590 */ 0x03, 0xFE, 0x32, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, -/* 0000B5A0 */ 0xFE, 0x45, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xFB, 0x01, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, 0x02, -/* 0000B5B0 */ 0x02, 0x01, 0x00, 0xFE, 0xDC, 0x03, 0x03, 0x02, 0x00, 0xFE, 0x1A, 0x02, 0x01, 0xFE, 0x1C, 0x02, -/* 0000B5C0 */ 0xFE, 0xB9, 0xB4, 0x11, 0x16, 0x00, 0x00, 0x00, 0x41, 0x00, 0x94, 0x01, 0x41, 0x00, 0x0B, 0x02, -/* 0000B5D0 */ 0x3E, 0x00, 0x21, 0x1C, 0x44, 0x00, 0xAE, 0x02, 0x46, 0x00, 0x6A, 0x06, 0x24, 0x00, 0x3B, 0x03, -/* 0000B5E0 */ 0x24, 0x00, 0x52, 0x00, 0x4C, 0x00, 0x9B, 0x00, 0x35, 0x00, 0x1F, 0x01, 0x55, 0x00, 0x99, 0x00, -/* 0000B5F0 */ 0x36, 0x00, 0x48, 0x00, 0x52, 0x00, 0x9E, 0x00, 0x60, 0x00, 0xC2, 0x04, 0x71, 0x00, 0x16, 0x03, -/* 0000B600 */ 0x0D, 0x00, 0x84, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x45, 0xBF, 0x00, 0x00, 0xA9, 0xBD, 0x00, -/* 0000B610 */ 0x00, 0x31, 0xBB, 0x00, 0x00, 0xA1, 0xB9, 0x00, 0x00, 0x43, 0xB7, 0x00, 0x00, 0x21, 0xB6, 0x00, -/* 0000B620 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCE, 0x04, -/* 0000B630 */ 0x39, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x3E, 0x00, 0xFE, 0x8B, 0xE9, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000B640 */ 0x01, 0x01, 0xFE, 0x8B, 0xE9, 0xFE, 0x56, 0x02, 0xFE, 0x56, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, -/* 0000B650 */ 0x25, 0x24, 0x04, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B660 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B670 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, -/* 0000B680 */ 0xFE, 0xE4, 0x03, 0x02, 0x01, 0xFE, 0x01, 0x03, 0x8A, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, -/* 0000B690 */ 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000B6A0 */ 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, -/* 0000B6B0 */ 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000B6C0 */ 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, -/* 0000B6D0 */ 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, -/* 0000B6E0 */ 0x08, 0x06, 0x02, 0x0F, 0x21, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, -/* 0000B6F0 */ 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, -/* 0000B700 */ 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x61, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, -/* 0000B710 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x78, -/* 0000B720 */ 0x02, 0x00, 0xFE, 0xB1, 0xE9, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, -/* 0000B730 */ 0x84, 0x00, 0x1E, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x69, 0x00, 0x1E, 0x00, 0x84, 0x00, 0x09, 0x00, -/* 0000B740 */ 0x37, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0xA2, 0x03, 0xFE, 0xB8, 0x04, -/* 0000B750 */ 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, 0x3C, 0x00, 0xFE, 0xB4, 0xE4, 0x01, 0xFF, 0x00, 0x10, 0x01, -/* 0000B760 */ 0x00, 0x01, 0x01, 0xFE, 0xB4, 0xE4, 0xFE, 0x08, 0x04, 0xFE, 0x08, 0x04, 0x02, 0x06, 0x07, 0x0B, -/* 0000B770 */ 0x05, 0x40, 0x40, 0x04, 0x07, 0x03, 0x03, 0x03, 0x03, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, -/* 0000B780 */ 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B790 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xE5, 0x03, 0x02, 0x01, 0xFE, 0x01, -/* 0000B7A0 */ 0x03, 0x03, 0x04, 0xFE, 0x10, 0x01, 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x2C, 0x0B, 0x07, 0x15, 0x03, -/* 0000B7B0 */ 0x00, 0x0B, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, -/* 0000B7C0 */ 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, -/* 0000B7D0 */ 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, -/* 0000B7E0 */ 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x96, -/* 0000B7F0 */ 0x02, 0x00, 0x00, 0x00, 0x0B, 0x92, 0x02, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0x0C, 0x14, 0x14, 0x00, -/* 0000B800 */ 0x0B, 0x0C, 0x09, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x61, 0x0B, 0x0B, 0x02, 0x0F, -/* 0000B810 */ 0x21, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, -/* 0000B820 */ 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, -/* 0000B830 */ 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x03, -/* 0000B840 */ 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0x0B, 0x0B, -/* 0000B850 */ 0x96, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, -/* 0000B860 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0C, -/* 0000B870 */ 0x5C, 0x01, 0x0C, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x02, 0x0C, -/* 0000B880 */ 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0xFF, 0x0B, 0x8E, 0x04, 0x00, -/* 0000B890 */ 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x92, 0x03, 0x00, -/* 0000B8A0 */ 0x00, 0x00, 0x0C, 0x5C, 0x01, 0x0C, 0xCB, 0x0C, 0x5C, 0x02, 0x0C, 0x1F, 0x03, 0x00, 0x0B, 0x09, -/* 0000B8B0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, -/* 0000B8C0 */ 0x02, 0xFE, 0xE6, 0x03, 0xFE, 0x1D, 0x02, 0x00, 0xFE, 0xE9, 0xE4, 0x09, 0x05, 0x00, 0x00, 0x00, -/* 0000B8D0 */ 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x8C, 0x00, 0x21, 0x00, 0x4B, 0x00, 0x21, 0x00, 0x69, 0x00, -/* 0000B8E0 */ 0x1E, 0x00, 0x8D, 0x00, 0x22, 0x00, 0x47, 0x00, 0x37, 0x00, 0x44, 0x01, 0x27, 0x00, 0x3E, 0x00, -/* 0000B8F0 */ 0x00, 0xF5, 0xB8, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B900 */ 0xFF, 0xFE, 0xC3, 0x04, 0x48, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x3D, 0x00, 0xFE, 0x69, 0xE7, 0xFF, -/* 0000B910 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x69, 0xE7, 0xF8, 0xF8, 0x41, 0x05, 0x04, 0x06, 0x0D, -/* 0000B920 */ 0x0D, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B930 */ 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B940 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xE7, 0x03, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x3E, 0x8E, -/* 0000B950 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x2F, 0x07, 0x02, 0x04, 0x2D, 0x06, 0x06, -/* 0000B960 */ 0x07, 0x15, 0x03, 0x00, 0x06, 0x03, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, -/* 0000B970 */ 0x00, 0x00, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x2F, 0x08, 0x02, -/* 0000B980 */ 0x04, 0x97, 0x07, 0x07, 0x08, 0x9C, 0x07, 0x06, 0x04, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 0000B990 */ 0xFE, 0x99, 0xE7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x5A, 0x00, 0x22, 0x00, 0x6D, 0x00, -/* 0000B9A0 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xD8, 0x03, 0xFE, 0x9C, 0x04, 0x10, 0xFF, -/* 0000B9B0 */ 0xA3, 0x41, 0xC1, 0x00, 0x3B, 0x00, 0xFE, 0xD8, 0xDD, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 0000B9C0 */ 0xFE, 0xD8, 0xDD, 0xFE, 0xE3, 0x02, 0xFE, 0xE3, 0x02, 0x01, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, -/* 0000B9D0 */ 0x04, 0x03, 0x05, 0x05, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B9E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B9F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xE4, -/* 0000BA00 */ 0x03, 0x02, 0x01, 0xFE, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0xED, 0x5B, 0x08, 0xB3, -/* 0000BA10 */ 0x08, 0x08, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, -/* 0000BA20 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x07, 0x0B, -/* 0000BA30 */ 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, -/* 0000BA40 */ 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, -/* 0000BA50 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000BA60 */ 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, -/* 0000BA70 */ 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, -/* 0000BA80 */ 0x00, 0x61, 0x0B, 0x09, 0x03, 0x0F, 0x21, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, -/* 0000BA90 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, -/* 0000BAA0 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x11, -/* 0000BAB0 */ 0x00, 0x00, 0x00, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, -/* 0000BAC0 */ 0x00, 0x00, 0x00, 0x0D, 0x6C, 0x0C, 0x0D, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0D, 0x2A, 0x0E, -/* 0000BAD0 */ 0x05, 0x14, 0x03, 0x00, 0x07, 0x0E, 0x09, 0x06, 0x00, 0x47, 0x0E, 0x05, 0x09, 0x03, 0x00, 0x47, -/* 0000BAE0 */ 0x0E, 0x07, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x09, 0x1F, 0x03, 0x0C, 0x0C, 0x5C, 0x01, 0x0C, 0x1F, -/* 0000BAF0 */ 0x02, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5C, 0x02, 0xFE, -/* 0000BB00 */ 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x2D, 0x02, 0x00, 0xFE, 0x01, 0xDE, 0x08, -/* 0000BB10 */ 0x05, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x2F, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x7C, 0x00, -/* 0000BB20 */ 0x1E, 0x00, 0x47, 0x00, 0x15, 0x00, 0x65, 0x00, 0x1E, 0x00, 0xD4, 0x00, 0x4E, 0x00, 0x56, 0x00, -/* 0000BB30 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x01, 0x03, 0xFE, 0x78, 0x04, 0x10, 0xFF, -/* 0000BB40 */ 0xA1, 0x41, 0xE1, 0x00, 0x3A, 0x00, 0xFE, 0x52, 0xD7, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 0000BB50 */ 0xFE, 0x52, 0xD7, 0xFE, 0x2E, 0x06, 0xFE, 0x2E, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x6B, 0x62, -/* 0000BB60 */ 0x04, 0x09, 0x08, 0x07, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BB70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BB80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -/* 0000BB90 */ 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x01, 0x03, 0xFE, 0x9D, 0x01, -/* 0000BBA0 */ 0xAE, 0x0A, 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x4F, 0x0C, 0x4F, 0x0D, 0xA8, -/* 0000BBB0 */ 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x61, 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, -/* 0000BBC0 */ 0x0F, 0x03, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x04, 0x47, 0x08, 0x0F, 0x61, 0x0F, 0x0A, 0x00, -/* 0000BBD0 */ 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x03, 0x47, 0x09, 0x0F, 0x6A, -/* 0000BBE0 */ 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, 0xA8, 0x0F, 0x14, -/* 0000BBF0 */ 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x1C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000BC00 */ 0x0F, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC2, 0x03, 0x00, 0x0F, -/* 0000BC10 */ 0x09, 0x28, 0x01, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, -/* 0000BC20 */ 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0C, -/* 0000BC30 */ 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000BC40 */ 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x0F, 0x1E, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8E, -/* 0000BC50 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, -/* 0000BC60 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0xFF, 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, -/* 0000BC70 */ 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, -/* 0000BC80 */ 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0D, 0x0F, 0x09, -/* 0000BC90 */ 0x3D, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x03, 0x00, 0x5C, -/* 0000BCA0 */ 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0F, 0x0F, 0x47, 0x0D, -/* 0000BCB0 */ 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x04, 0x07, -/* 0000BCC0 */ 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0x1F, 0x03, 0xFF, 0x0F, 0x8E, -/* 0000BCD0 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000BCE0 */ 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x0F, 0x47, 0x0F, -/* 0000BCF0 */ 0x0D, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000BD00 */ 0x06, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x8E, 0x01, -/* 0000BD10 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0C, -/* 0000BD20 */ 0x1F, 0x04, 0x10, 0x10, 0x76, 0x10, 0x0F, 0x05, 0x61, 0x0F, 0x0D, 0x06, 0x82, 0x0F, 0x0F, 0x28, -/* 0000BD30 */ 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, -/* 0000BD40 */ 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x78, 0x02, 0xFE, -/* 0000BD50 */ 0x78, 0x02, 0xDB, 0x00, 0xFE, 0xCF, 0xD8, 0x14, 0x0F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0x00, -/* 0000BD60 */ 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, 0x00, -/* 0000BD70 */ 0x07, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x1C, 0x00, 0x56, 0x00, 0x1E, 0x00, 0x38, 0x00, -/* 0000BD80 */ 0x1E, 0x00, 0x38, 0x00, 0x1B, 0x00, 0x9B, 0x00, 0x1E, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, -/* 0000BD90 */ 0x1F, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x58, 0x00, 0x1F, 0x00, 0x4D, 0x00, 0x3A, 0x00, 0x65, 0x00, -/* 0000BDA0 */ 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x1F, 0xFC, 0x07, -/* 0000BDB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x6A, 0x04, 0x62, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x39, 0x00, -/* 0000BDC0 */ 0xFE, 0xCF, 0xD4, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xCF, 0xD4, 0xFE, 0x44, 0x02, -/* 0000BDD0 */ 0xFE, 0x44, 0x02, 0x03, 0x09, 0x09, 0x0E, 0x07, 0x40, 0x3C, 0x03, 0x06, 0x03, 0x03, 0x03, 0x03, -/* 0000BDE0 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BDF0 */ 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BE00 */ 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x5A, 0x03, 0x02, 0x00, 0xFE, 0xCB, 0x03, 0x02, 0x01, 0xFE, -/* 0000BE10 */ 0xCA, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFA, 0xAE, 0x0B, -/* 0000BE20 */ 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x2C, 0x0E, 0x09, 0x15, 0x03, 0x00, 0x0E, 0x03, 0x09, 0x34, 0x00, -/* 0000BE30 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, 0xE1, 0x0E, 0x09, 0x0E, 0x00, 0x0F, -/* 0000BE40 */ 0x21, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, -/* 0000BE50 */ 0x6C, 0x0E, 0x0F, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, -/* 0000BE60 */ 0x1F, 0x03, 0xFF, 0x0E, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x03, -/* 0000BE70 */ 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0E, 0x0E, -/* 0000BE80 */ 0x47, 0x0A, 0x0E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x4B, 0x0E, 0x07, -/* 0000BE90 */ 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0A, 0x97, 0x0F, 0x0B, 0x07, 0x5C, 0x02, 0x0F, 0x97, -/* 0000BEA0 */ 0x0F, 0x0B, 0x08, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0xFF, 0x0E, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, -/* 0000BEB0 */ 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, -/* 0000BEC0 */ 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x0C, 0x0E, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, -/* 0000BED0 */ 0x00, 0x0E, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000BEE0 */ 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x2A, 0x11, 0x07, 0x14, -/* 0000BEF0 */ 0x03, 0x00, 0x0C, 0x11, 0x09, 0x06, 0x00, 0x47, 0x11, 0x07, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0C, -/* 0000BF00 */ 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x1F, 0x03, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x00, -/* 0000BF10 */ 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x5C, 0x02, -/* 0000BF20 */ 0xFE, 0x2D, 0x02, 0x00, 0xFE, 0xED, 0xD4, 0x07, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x53, 0x00, -/* 0000BF30 */ 0x1E, 0x00, 0x70, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x27, 0x00, 0x52, 0x00, 0x1E, 0x00, 0x85, 0x00, -/* 0000BF40 */ 0x4E, 0x00, 0x51, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0xDC, 0x03, 0xFE, -/* 0000BF50 */ 0xE2, 0x03, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x38, 0x00, 0xFE, 0x98, 0xB8, 0xFF, 0x00, 0x10, -/* 0000BF60 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0x98, 0xB8, 0xFE, 0xD3, 0x1B, 0xFE, 0xD3, 0x1B, 0x45, 0x18, 0x23, -/* 0000BF70 */ 0x37, 0x07, 0xFE, 0x9B, 0x01, 0xFE, 0x7B, 0x01, 0x03, 0x13, 0x25, 0x25, 0x25, 0x25, 0x01, 0xFF, -/* 0000BF80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x36, 0xFF, -/* 0000BF90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, -/* 0000BFA0 */ 0x03, 0x02, 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x01, 0x03, 0x08, 0x02, 0x01, 0xFE, -/* 0000BFB0 */ 0x5E, 0x03, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, -/* 0000BFC0 */ 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x00, 0xFE, 0xCF, 0x03, 0x02, 0x00, 0xFE, 0xDD, -/* 0000BFD0 */ 0x03, 0x02, 0x00, 0xFE, 0xDE, 0x03, 0x02, 0x00, 0xFE, 0xD0, 0x03, 0x02, 0x00, 0xFE, 0xD1, 0x03, -/* 0000BFE0 */ 0x02, 0x00, 0xFE, 0xDF, 0x03, 0x02, 0x01, 0xFE, 0xE0, 0x03, 0x02, 0x01, 0xFE, 0xE4, 0x02, 0x02, -/* 0000BFF0 */ 0x00, 0xFE, 0xD2, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x15, 0x00, 0x00, 0x00, 0x02, 0x01, -/* 0000C000 */ 0xFE, 0xD5, 0x03, 0x02, 0x01, 0xFE, 0xD6, 0x03, 0x02, 0x00, 0xFE, 0xD7, 0x03, 0x02, 0x01, 0xFE, -/* 0000C010 */ 0x58, 0x03, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x00, 0xFE, 0xD3, 0x03, 0x01, 0x00, 0x00, 0x00, -/* 0000C020 */ 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xD4, 0x03, -/* 0000C030 */ 0x02, 0x00, 0xFE, 0xE2, 0x03, 0xFE, 0x5F, 0x06, 0x2C, 0x38, 0x23, 0x0D, 0x03, 0x00, 0x38, 0x02, -/* 0000C040 */ 0x09, 0x18, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, -/* 0000C050 */ 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000C060 */ 0x0C, 0x00, 0x00, 0x00, 0x38, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000C070 */ 0x19, 0x00, 0x00, 0x00, 0x39, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x23, 0x5C, 0x03, 0x03, 0x1F, 0x04, -/* 0000C080 */ 0x38, 0x38, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x29, 0x00, 0x61, 0x38, 0x23, 0x01, 0x0F, 0x03, 0x00, -/* 0000C090 */ 0x38, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, -/* 0000C0A0 */ 0x39, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, -/* 0000C0B0 */ 0xFF, 0x38, 0x76, 0x06, 0x23, 0x03, 0x2C, 0x38, 0x25, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x22, -/* 0000C0C0 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000C0D0 */ 0x04, 0xCB, 0x39, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x25, 0x38, -/* 0000C0E0 */ 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, -/* 0000C0F0 */ 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x25, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x25, -/* 0000C100 */ 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000C110 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x02, 0xA1, 0x00, 0x0B, -/* 0000C120 */ 0x39, 0xA1, 0x01, 0x0C, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x38, 0x38, 0x47, -/* 0000C130 */ 0x28, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, -/* 0000C140 */ 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x03, 0xA1, 0x00, -/* 0000C150 */ 0x0E, 0x39, 0xA1, 0x01, 0x0F, 0x39, 0xA1, 0x02, 0x10, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0E, -/* 0000C160 */ 0x1F, 0x06, 0x38, 0x38, 0x47, 0x29, 0x38, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000C170 */ 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x05, 0x47, 0x2A, 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, 0x09, -/* 0000C180 */ 0x16, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, 0x61, 0x38, -/* 0000C190 */ 0x38, 0x06, 0x47, 0x2A, 0x38, 0x09, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x13, 0x00, -/* 0000C1A0 */ 0x8E, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x07, -/* 0000C1B0 */ 0x47, 0x2A, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, -/* 0000C1C0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xA8, 0x39, 0x5C, 0x04, -/* 0000C1D0 */ 0x39, 0xA8, 0x39, 0x5C, 0x05, 0x39, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2B, 0x38, 0x8E, 0x03, 0x00, -/* 0000C1E0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, -/* 0000C1F0 */ 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x03, 0xA1, 0x00, 0x12, 0x39, 0xA1, 0x01, 0x13, -/* 0000C200 */ 0x39, 0xA1, 0x02, 0x14, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x13, 0x1F, 0x06, 0x38, 0x38, 0x47, -/* 0000C210 */ 0x2C, 0x38, 0xA8, 0x38, 0x47, 0x2D, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000C220 */ 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, -/* 0000C230 */ 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2E, 0x38, 0xA8, 0x38, 0x47, -/* 0000C240 */ 0x2F, 0x38, 0xA8, 0x38, 0x47, 0x30, 0x38, 0xA8, 0x38, 0x47, 0x31, 0x38, 0x61, 0x38, 0x25, 0x08, -/* 0000C250 */ 0x47, 0x32, 0x38, 0x61, 0x38, 0x25, 0x09, 0x47, 0x33, 0x38, 0x2C, 0x38, 0x32, 0x15, 0x0E, 0x00, -/* 0000C260 */ 0x38, 0x07, 0x09, 0x00, 0x00, 0x2C, 0x38, 0x33, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x4C, 0x00, -/* 0000C270 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, -/* 0000C280 */ 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0x1F, -/* 0000C290 */ 0x06, 0x38, 0x38, 0x47, 0x32, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, -/* 0000C2A0 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x19, 0x5C, 0x03, 0x32, 0x5C, -/* 0000C2B0 */ 0x04, 0x17, 0x5C, 0x05, 0x17, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x33, 0x38, 0x8E, 0x03, 0x00, 0x00, -/* 0000C2C0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, -/* 0000C2D0 */ 0x02, 0x1A, 0x5C, 0x03, 0x1B, 0xA8, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x06, 0x1F, 0x06, 0x38, -/* 0000C2E0 */ 0x38, 0x47, 0x34, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, -/* 0000C2F0 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x24, 0x38, 0x8E, 0x03, -/* 0000C300 */ 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x38, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000C310 */ 0x24, 0x5C, 0x02, 0x28, 0xCD, 0x39, 0x01, 0xA1, 0x00, 0x1C, 0x39, 0x5C, 0x03, 0x39, 0x8E, 0x03, -/* 0000C320 */ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x39, 0x5C, 0x04, 0x39, 0x1F, 0x05, 0x38, 0x38, 0x47, -/* 0000C330 */ 0x35, 0x38, 0x2C, 0x38, 0x2B, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x50, 0x00, 0x8E, 0x03, 0x00, -/* 0000C340 */ 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, -/* 0000C350 */ 0x1F, 0x02, 0x38, 0x38, 0x0F, 0x35, 0x00, 0x38, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000C360 */ 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8E, -/* 0000C370 */ 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000C380 */ 0x01, 0x2B, 0x1F, 0x02, 0x3A, 0x3A, 0x5C, 0x01, 0x3A, 0x1F, 0x02, 0xFF, 0x38, 0x14, 0x03, 0x00, -/* 0000C390 */ 0x29, 0x10, 0x09, 0x06, 0x01, 0x2C, 0x38, 0x2B, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x18, 0x00, -/* 0000C3A0 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, 0x0B, 0x07, 0x01, -/* 0000C3B0 */ 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -/* 0000C3C0 */ 0x00, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, -/* 0000C3D0 */ 0x00, 0x39, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x2B, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x2B, 0x38, 0xE5, -/* 0000C3E0 */ 0x22, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, 0x0C, -/* 0000C3F0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2B, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x2D, 0x38, -/* 0000C400 */ 0xE9, 0x09, 0x4D, 0x00, 0xE7, 0x26, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, -/* 0000C410 */ 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x1F, 0x02, 0xFF, 0x38, 0x8E, 0x03, -/* 0000C420 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, 0x0A, 0x07, 0x02, 0x00, 0x5C, -/* 0000C430 */ 0x00, 0x39, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3A, 0x07, 0x02, 0x00, 0x5C, -/* 0000C440 */ 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x1F, 0x02, 0x3A, 0x3A, 0x5C, 0x01, 0x3A, 0x1F, 0x02, 0xFF, 0x38, -/* 0000C450 */ 0xE9, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000C460 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x2D, -/* 0000C470 */ 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2F, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, -/* 0000C480 */ 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2D, 0x5C, 0x02, -/* 0000C490 */ 0x2F, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x31, 0x38, 0x09, 0x7D, 0x00, 0xA8, 0x38, 0x47, 0x2B, 0x38, -/* 0000C4A0 */ 0xA8, 0x38, 0x47, 0x2C, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, -/* 0000C4B0 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, 0x03, 0x1E, 0x5C, 0x04, -/* 0000C4C0 */ 0x1F, 0x5C, 0x05, 0x1E, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2F, 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, -/* 0000C4D0 */ 0x09, 0x24, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, -/* 0000C4E0 */ 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, 0x1E, 0x1F, 0x03, 0x38, -/* 0000C4F0 */ 0x38, 0x47, 0x31, 0x38, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, -/* 0000C500 */ 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, -/* 0000C510 */ 0x20, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x31, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 0000C520 */ 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x21, 0x5C, 0x03, -/* 0000C530 */ 0x2F, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x31, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x30, 0x38, 0x76, 0x28, -/* 0000C540 */ 0x23, 0x0E, 0x61, 0x38, 0x35, 0x0F, 0x76, 0x38, 0x23, 0x10, 0x76, 0x29, 0x23, 0x11, 0xA8, 0x38, -/* 0000C550 */ 0x15, 0x03, 0x00, 0x2B, 0x38, 0x09, 0x04, 0x00, 0x76, 0x2B, 0x23, 0x12, 0xA8, 0x38, 0x15, 0x03, -/* 0000C560 */ 0x00, 0x2C, 0x38, 0x09, 0x72, 0x00, 0x76, 0x2C, 0x23, 0x13, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x04, -/* 0000C570 */ 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x14, 0x76, 0x38, 0x23, 0x15, 0x14, 0x03, -/* 0000C580 */ 0x00, 0x2C, 0x13, 0x09, 0x17, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, -/* 0000C590 */ 0x4B, 0x38, 0x61, 0x38, 0x38, 0x16, 0x76, 0x38, 0x23, 0x15, 0x09, 0x3B, 0x00, 0x14, 0x03, 0x00, -/* 0000C5A0 */ 0x2C, 0x12, 0x09, 0x17, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x4B, -/* 0000C5B0 */ 0x38, 0x61, 0x38, 0x38, 0x17, 0x76, 0x38, 0x23, 0x15, 0x09, 0x1C, 0x00, 0x14, 0x03, 0x00, 0x2C, -/* 0000C5C0 */ 0x14, 0x09, 0x14, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, -/* 0000C5D0 */ 0x61, 0x38, 0x38, 0x18, 0x76, 0x38, 0x23, 0x15, 0x76, 0x2E, 0x23, 0x19, 0x76, 0x2F, 0x23, 0x1A, -/* 0000C5E0 */ 0x76, 0x30, 0x23, 0x1B, 0xA8, 0x38, 0x15, 0x03, 0x00, 0x33, 0x38, 0x09, 0x08, 0x00, 0x76, 0x32, -/* 0000C5F0 */ 0x23, 0x1C, 0x76, 0x33, 0x23, 0x1D, 0x76, 0x2A, 0x23, 0x1E, 0x76, 0x34, 0x23, 0x1F, 0xE5, 0x1D, -/* 0000C600 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, 0x07, 0x02, 0x00, -/* 0000C610 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x23, 0x1F, 0x02, 0xFF, 0x38, 0xE9, 0x09, 0x33, 0x00, 0xE7, 0x27, -/* 0000C620 */ 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000C630 */ 0x04, 0x5C, 0x01, 0x27, 0x1F, 0x02, 0xFF, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000C640 */ 0x00, 0x39, 0x6C, 0x38, 0x39, 0x20, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, -/* 0000C650 */ 0xE9, 0x61, 0x38, 0x23, 0x21, 0x0F, 0x07, 0x00, 0x38, 0x09, 0x00, 0x00, 0x76, 0x22, 0x23, 0x22, -/* 0000C660 */ 0x47, 0x38, 0x23, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x39, 0x07, 0x03, 0x00, -/* 0000C670 */ 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x3A, 0x5C, 0x01, 0x3A, -/* 0000C680 */ 0x61, 0x3A, 0x23, 0x21, 0x5C, 0x02, 0x3A, 0x1F, 0x03, 0x39, 0x39, 0x76, 0x39, 0x38, 0x23, 0x76, -/* 0000C690 */ 0x06, 0x23, 0x24, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, -/* 0000C6A0 */ 0x65, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x52, 0x03, 0xFE, 0xC3, 0x03, 0xFE, 0xC4, 0x03, 0xFE, 0xC5, -/* 0000C6B0 */ 0x03, 0xFE, 0x0E, 0x02, 0xFE, 0x0F, 0x02, 0xFE, 0x68, 0x02, 0xFE, 0x69, 0x02, 0xFE, 0x30, 0x02, -/* 0000C6C0 */ 0xFE, 0x1E, 0x01, 0xFE, 0xE3, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x7A, 0x02, 0xFE, -/* 0000C6D0 */ 0x14, 0x02, 0xFE, 0x15, 0x02, 0xFE, 0xC2, 0x03, 0xFE, 0x16, 0x02, 0xFE, 0xC7, 0x03, 0xFE, 0xC8, -/* 0000C6E0 */ 0x03, 0xFE, 0xC9, 0x03, 0xFE, 0x0B, 0x02, 0xFE, 0x09, 0x02, 0xFE, 0x0A, 0x02, 0xFE, 0x0C, 0x02, -/* 0000C6F0 */ 0xFE, 0x0D, 0x02, 0xFE, 0x13, 0x02, 0xFE, 0x11, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x12, 0x02, 0xFE, -/* 0000C700 */ 0x12, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x6B, 0x02, 0x00, 0xFE, 0xED, 0xB8, 0x50, 0x00, 0x00, 0x00, -/* 0000C710 */ 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x18, 0x00, 0x3F, 0x00, 0x39, 0x00, 0x9B, 0x00, 0x1E, 0x00, 0x6D, -/* 0000C720 */ 0x00, 0x04, 0x00, 0x61, 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x49, -/* 0000C730 */ 0x00, 0x31, 0x00, 0x71, 0x00, 0x35, 0x00, 0x73, 0x00, 0x13, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x2F, -/* 0000C740 */ 0x00, 0x16, 0x00, 0x43, 0x00, 0x08, 0x00, 0x30, 0x00, 0x13, 0x00, 0x50, 0x00, 0x2A, 0x00, 0x5F, -/* 0000C750 */ 0x00, 0x35, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x31, 0x00, 0x26, 0x00, 0x67, 0x00, 0x05, 0x00, 0x37, -/* 0000C760 */ 0x00, 0x05, 0x00, 0x37, 0x00, 0x05, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x51, 0x00, 0x07, 0x00, 0x52, -/* 0000C770 */ 0x00, 0x16, 0x00, 0x7E, 0x00, 0x26, 0x00, 0x6F, 0x00, 0x26, 0x00, 0x96, 0x00, 0x28, 0x00, 0x9A, -/* 0000C780 */ 0x00, 0x1A, 0x00, 0x41, 0x00, 0x34, 0x00, 0xA2, 0x00, 0x29, 0x00, 0x62, 0x00, 0x32, 0x00, 0x58, -/* 0000C790 */ 0x00, 0x08, 0x00, 0x30, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x18, 0x00, 0x4F, 0x00, 0x2A, 0x00, 0x74, -/* 0000C7A0 */ 0x00, 0x24, 0x00, 0x4A, 0x00, 0x01, 0x00, 0x24, 0x00, 0x17, 0x00, 0x2E, 0x00, 0x33, 0x00, 0x5F, -/* 0000C7B0 */ 0x00, 0x26, 0x00, 0x76, 0x00, 0x24, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x2A, 0x00, 0x05, 0x00, 0x31, -/* 0000C7C0 */ 0x00, 0x26, 0x00, 0x69, 0x00, 0x08, 0x00, 0x33, 0x00, 0x24, 0x00, 0x78, 0x00, 0x21, 0x00, 0x7B, -/* 0000C7D0 */ 0x00, 0x26, 0x00, 0xC6, 0x00, 0x04, 0x00, 0x38, 0x00, 0x08, 0x00, 0x43, 0x00, 0x04, 0x00, 0x2F, -/* 0000C7E0 */ 0x00, 0x0A, 0x00, 0x32, 0x00, 0x04, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x04, 0x00, 0x46, -/* 0000C7F0 */ 0x00, 0x14, 0x00, 0x5F, 0x00, 0x08, 0x00, 0x3C, 0x00, 0x17, 0x00, 0x65, 0x00, 0x08, 0x00, 0x3A, -/* 0000C800 */ 0x00, 0x17, 0x00, 0x63, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x14, 0x00, 0x81, 0x00, 0x04, 0x00, 0x4C, -/* 0000C810 */ 0x00, 0x04, 0x00, 0x4E, 0x00, 0x04, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x04, 0x00, 0x58, -/* 0000C820 */ 0x00, 0x04, 0x00, 0x67, 0x00, 0x04, 0x00, 0x40, 0x00, 0x07, 0x00, 0xA9, 0x00, 0x1F, 0x00, 0x43, -/* 0000C830 */ 0x00, 0x01, 0x00, 0x20, 0x00, 0x17, 0x00, 0x6B, 0x01, 0x19, 0x00, 0x4A, 0x00, 0x0B, 0x00, 0x4B, -/* 0000C840 */ 0x00, 0x04, 0x00, 0x70, 0x00, 0x2F, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x00, 0x3F, 0xFC, -/* 0000C850 */ 0x02, 0x04, 0x4F, 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE5, 0x02, 0x14, 0xFF, 0xA0, -/* 0000C860 */ 0x41, 0xD1, 0x00, 0x2F, 0x00, 0xFE, 0x7F, 0x83, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 0000C870 */ 0xFE, 0x7F, 0x83, 0xFE, 0x7D, 0x30, 0xFE, 0x7D, 0x30, 0x0B, 0x17, 0x1B, 0x09, 0x9A, 0x9A, 0x01, -/* 0000C880 */ 0x09, 0x07, 0x07, 0x07, 0x07, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C890 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0xFF, 0xFF, 0xFF, -/* 0000C8A0 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0x9C, 0x03, 0x02, 0x00, -/* 0000C8B0 */ 0xFE, 0x9D, 0x03, 0x04, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x9E, 0x03, 0x02, 0x00, -/* 0000C8C0 */ 0xFE, 0x9F, 0x03, 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, -/* 0000C8D0 */ 0xFE, 0x02, 0x08, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x09, 0x02, -/* 0000C8E0 */ 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, 0x01, -/* 0000C8F0 */ 0xFE, 0xA3, 0x03, 0x02, 0x01, 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xA5, 0x03, 0xFE, 0x26, 0x03, -/* 0000C900 */ 0xA8, 0x17, 0xA8, 0x18, 0xA8, 0x19, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1D, -/* 0000C910 */ 0x14, 0x15, 0x00, 0x1D, 0x02, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, -/* 0000C920 */ 0x00, 0x1D, 0x14, 0x03, 0x00, 0x1D, 0x03, 0x09, 0xF3, 0x02, 0xDE, 0x00, 0x03, 0x01, 0xB8, 0x1D, -/* 0000C930 */ 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x17, 0x1D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x02, -/* 0000C940 */ 0x00, 0x00, 0x00, 0x17, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x6C, 0x1D, -/* 0000C950 */ 0x1E, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, -/* 0000C960 */ 0x00, 0x1F, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x04, 0xB8, 0x21, 0x00, 0x01, 0x50, -/* 0000C970 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x21, 0x5C, 0x02, 0x20, 0x1F, 0x03, 0x1F, 0x1F, 0x5C, 0x01, -/* 0000C980 */ 0x1F, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, -/* 0000C990 */ 0x00, 0x1D, 0x14, 0x03, 0x00, 0x1D, 0x02, 0x09, 0x83, 0x02, 0xDE, 0x01, 0x04, 0x02, 0xB8, 0x1D, -/* 0000C9A0 */ 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x1D, 0x1D, 0x01, 0x50, 0x01, 0x02, 0x00, 0x00, 0x00, 0x18, -/* 0000C9B0 */ 0x1D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x01, 0x50, 0x01, 0x03, 0x00, -/* 0000C9C0 */ 0x00, 0x00, 0x19, 0x1D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x19, 0x8E, 0x01, -/* 0000C9D0 */ 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, -/* 0000C9E0 */ 0x07, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x5C, 0x02, 0x1E, 0x1F, 0x03, -/* 0000C9F0 */ 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x03, 0x00, 0x5C, -/* 0000CA00 */ 0x00, 0x05, 0x5C, 0x01, 0x08, 0x90, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x5C, -/* 0000CA10 */ 0x02, 0x1E, 0x1F, 0x03, 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, -/* 0000CA20 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, -/* 0000CA30 */ 0x5C, 0x01, 0x1E, 0x5C, 0x02, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, -/* 0000CA40 */ 0x00, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x1F, 0x4B, 0x1F, 0x7A, -/* 0000CA50 */ 0x1F, 0x1E, 0x01, 0x7A, 0x0C, 0x1E, 0x02, 0x7A, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0x1F, 0x04, -/* 0000CA60 */ 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x04, 0x00, 0x5C, -/* 0000CA70 */ 0x00, 0x05, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x5C, 0x01, 0x1E, 0x5C, -/* 0000CA80 */ 0x02, 0x0F, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x90, -/* 0000CA90 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x1F, 0x1F, -/* 0000CAA0 */ 0x7A, 0x1F, 0x1E, 0x01, 0x7A, 0x10, 0x1E, 0x02, 0x7A, 0x10, 0x1E, 0x04, 0x7A, 0x10, 0x1E, 0x03, -/* 0000CAB0 */ 0x5C, 0x03, 0x1E, 0x1F, 0x04, 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000CAC0 */ 0x1D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000CAD0 */ 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, -/* 0000CAE0 */ 0x00, 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x02, 0x1E, 0x1F, 0x03, 0xFF, 0x1D, 0x8E, 0x01, 0x00, -/* 0000CAF0 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x00, -/* 0000CB00 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x5C, 0x02, -/* 0000CB10 */ 0x12, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x90, 0x01, -/* 0000CB20 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x7A, 0x1F, 0x1E, 0x01, 0x7A, 0x0C, 0x1E, 0x02, -/* 0000CB30 */ 0x7A, 0x10, 0x1E, 0x04, 0x7A, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0x1F, 0x04, 0xFF, 0x1D, 0x8E, -/* 0000CB40 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, -/* 0000CB50 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, -/* 0000CB60 */ 0x5C, 0x02, 0x13, 0xCC, 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, -/* 0000CB70 */ 0xB8, 0x20, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x20, 0x20, 0x01, 0x50, 0x01, 0x04, 0x00, 0x00, -/* 0000CB80 */ 0x00, 0x1F, 0x20, 0x7A, 0x1F, 0x1E, 0x01, 0x01, 0x64, 0x01, 0x1F, 0x1E, 0x7A, 0x0C, 0x1E, 0x02, -/* 0000CB90 */ 0x7A, 0x10, 0x1E, 0x04, 0x7A, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0x1F, 0x04, 0xFF, 0x1D, 0x8E, -/* 0000CBA0 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, -/* 0000CBB0 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, -/* 0000CBC0 */ 0x5C, 0x02, 0x14, 0xCC, 0x5C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, -/* 0000CBD0 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, -/* 0000CBE0 */ 0x5C, 0x01, 0x16, 0xB8, 0x21, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x21, 0x21, 0x01, 0x50, 0x01, -/* 0000CBF0 */ 0x05, 0x00, 0x00, 0x00, 0x20, 0x21, 0x5C, 0x02, 0x20, 0x1F, 0x03, 0x1F, 0x1F, 0x7A, 0x1F, 0x1E, -/* 0000CC00 */ 0x06, 0x7A, 0x10, 0x1E, 0x04, 0x7A, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0x1F, 0x04, 0xFF, 0x1D, -/* 0000CC10 */ 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, -/* 0000CC20 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x05, 0x70, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, -/* 0000CC30 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, -/* 0000CC40 */ 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, -/* 0000CC50 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, -/* 0000CC60 */ 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, -/* 0000CC70 */ 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, -/* 0000CC80 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, -/* 0000CC90 */ 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000CCA0 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x32, -/* 0000CCB0 */ 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, 0xFE, 0x45, 0x01, -/* 0000CCC0 */ 0xFE, 0xB5, 0x01, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xA6, 0x03, 0x02, 0x02, 0x00, 0xFE, 0x19, 0x02, -/* 0000CCD0 */ 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x96, 0x83, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x14, 0x17, -/* 0000CCE0 */ 0x44, 0x00, 0xF9, 0x03, 0x46, 0x00, 0x8A, 0x06, 0x24, 0x00, 0x43, 0x03, 0x24, 0x00, 0x50, 0x00, -/* 0000CCF0 */ 0x4C, 0x00, 0x93, 0x00, 0x55, 0x00, 0x91, 0x00, 0x36, 0x00, 0x45, 0x00, 0x52, 0x00, 0x96, 0x00, -/* 0000CD00 */ 0x60, 0x00, 0xA7, 0x05, 0x71, 0x00, 0x03, 0x03, 0x0D, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x16, 0x00, -/* 0000CD10 */ 0x00, 0x34, 0xD6, 0x00, 0x00, 0x4A, 0xD4, 0x00, 0x00, 0xDA, 0xD1, 0x00, 0x00, 0x22, 0xD0, 0x00, -/* 0000CD20 */ 0x00, 0x4B, 0xCE, 0x00, 0x00, 0x29, 0xCD, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, -/* 0000CD30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0x03, 0x3A, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x36, 0x00, -/* 0000CD40 */ 0xFE, 0xD6, 0xB0, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD6, 0xB0, 0xFE, 0x45, 0x02, -/* 0000CD50 */ 0xFE, 0x45, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, -/* 0000CD60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, -/* 0000CD70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000CD80 */ 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC0, 0x03, 0x02, 0x01, 0xFE, 0xFD, 0x02, -/* 0000CD90 */ 0x8A, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x1E, -/* 0000CDA0 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, -/* 0000CDB0 */ 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, -/* 0000CDC0 */ 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, -/* 0000CDD0 */ 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, -/* 0000CDE0 */ 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, 0x08, 0x06, 0x02, 0x0F, 0x21, 0x00, 0x08, 0x09, -/* 0000CDF0 */ 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, -/* 0000CE00 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, -/* 0000CE10 */ 0x61, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, -/* 0000CE20 */ 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x77, 0x02, 0x00, 0xFE, 0xFC, 0xB0, 0x07, 0x05, 0x00, -/* 0000CE30 */ 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x1E, 0x00, 0x4B, 0x00, 0x15, 0x00, -/* 0000CE40 */ 0x65, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x4F, -/* 0000CE50 */ 0xFC, 0x07, 0xFE, 0xA2, 0x03, 0xFE, 0xA4, 0x03, 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, 0x35, 0x00, -/* 0000CE60 */ 0xFE, 0x18, 0xAB, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x18, 0xAB, 0xFE, 0xF1, 0x04, -/* 0000CE70 */ 0xFE, 0xF1, 0x04, 0x01, 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, 0x03, 0x01, 0x11, 0x11, 0x11, 0x11, -/* 0000CE80 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000CE90 */ 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000CEA0 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC1, 0x03, 0x02, 0x01, 0xFE, 0xFD, -/* 0000CEB0 */ 0x02, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0xA8, 0x03, 0x02, 0x01, 0xFE, 0xAB, 0x03, -/* 0000CEC0 */ 0x02, 0x01, 0xFE, 0xB0, 0x03, 0x02, 0x01, 0xFE, 0xBA, 0x03, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, -/* 0000CED0 */ 0x01, 0xFE, 0xB1, 0x03, 0x03, 0xCB, 0x5B, 0x0D, 0xB3, 0x0D, 0x0D, 0x2C, 0x10, 0x0D, 0x15, 0x03, -/* 0000CEE0 */ 0x00, 0x10, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, -/* 0000CEF0 */ 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, -/* 0000CF00 */ 0x1F, 0x03, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, -/* 0000CF10 */ 0x11, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x10, 0x10, 0x47, -/* 0000CF20 */ 0x0E, 0x10, 0xA8, 0x10, 0x14, 0x0E, 0x00, 0x0E, 0x10, 0x09, 0x00, 0x00, 0x61, 0x10, 0x0E, 0x02, -/* 0000CF30 */ 0x0F, 0x21, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000CF40 */ 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x03, 0x5C, 0x02, -/* 0000CF50 */ 0x04, 0x1F, 0x03, 0xFF, 0x10, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000CF60 */ 0x00, 0x00, 0x61, 0x10, 0x0E, 0x03, 0x7A, 0x10, 0x00, 0x04, 0x61, 0x10, 0x0E, 0x05, 0x7A, 0x10, -/* 0000CF70 */ 0x00, 0x06, 0x61, 0x10, 0x0E, 0x07, 0x7A, 0x10, 0x00, 0x08, 0x61, 0x10, 0x0E, 0x09, 0x7A, 0x10, -/* 0000CF80 */ 0x00, 0x0A, 0x61, 0x10, 0x0E, 0x0B, 0x7A, 0x10, 0x00, 0x0C, 0x61, 0x10, 0x0E, 0x0D, 0x7A, 0x10, -/* 0000CF90 */ 0x00, 0x0E, 0x61, 0x10, 0x0E, 0x0F, 0x7A, 0x10, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000CFA0 */ 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000CFB0 */ 0x1F, 0x02, 0x00, 0x00, 0xA8, 0x03, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, -/* 0000CFC0 */ 0xBA, 0x03, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, -/* 0000CFD0 */ 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x70, 0x02, 0xFE, -/* 0000CFE0 */ 0xA8, 0x03, 0xFE, 0x71, 0x02, 0xFE, 0x20, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x22, 0x02, 0xFE, 0x75, -/* 0000CFF0 */ 0x02, 0xFE, 0xBA, 0x03, 0xFE, 0x74, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0xB1, 0x03, -/* 0000D000 */ 0x00, 0xFE, 0x4D, 0xAB, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x84, -/* 0000D010 */ 0x00, 0x1E, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x1E, 0x00, 0x85, 0x00, 0x4A, 0x00, 0xC6, -/* 0000D020 */ 0x02, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xA3, 0x03, 0xFE, 0x8B, 0x03, 0x10, -/* 0000D030 */ 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x34, 0x00, 0xFE, 0x6C, 0xA5, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, -/* 0000D040 */ 0x03, 0xFE, 0x6C, 0xA5, 0xFE, 0xF3, 0x02, 0xFE, 0xF3, 0x02, 0x01, 0x09, 0x06, 0x0B, 0x0B, 0x44, -/* 0000D050 */ 0x41, 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D060 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D070 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, -/* 0000D080 */ 0xC0, 0x03, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x04, 0xFE, 0x0B, 0x01, 0x5B, 0x08, 0xB3, 0x08, 0x08, -/* 0000D090 */ 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000D0A0 */ 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, -/* 0000D0B0 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000D0C0 */ 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, -/* 0000D0D0 */ 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, -/* 0000D0E0 */ 0x00, 0x61, 0x0B, 0x09, 0x02, 0x0F, 0x21, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, -/* 0000D0F0 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, -/* 0000D100 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, -/* 0000D110 */ 0x00, 0x00, 0x00, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0B, -/* 0000D120 */ 0x0B, 0x47, 0x06, 0x0B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x02, -/* 0000D130 */ 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x07, 0x0B, 0x8E, 0x03, -/* 0000D140 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, -/* 0000D150 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x6C, 0x0C, 0x0D, 0x03, 0x07, 0x07, 0x00, 0x5C, -/* 0000D160 */ 0x00, 0x0D, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x07, 0x61, 0x0E, 0x09, 0x04, 0x5C, 0x03, 0x0E, 0x61, -/* 0000D170 */ 0x0E, 0x09, 0x05, 0x5C, 0x04, 0x0E, 0x61, 0x0E, 0x09, 0x06, 0x5C, 0x05, 0x0E, 0x61, 0x0E, 0x09, -/* 0000D180 */ 0x07, 0x5C, 0x06, 0x0E, 0x1F, 0x07, 0x0C, 0x0C, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x00, 0x0B, 0x09, -/* 0000D190 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x76, -/* 0000D1A0 */ 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x74, 0x02, -/* 0000D1B0 */ 0x00, 0xFE, 0x99, 0xA5, 0x09, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x75, -/* 0000D1C0 */ 0x00, 0x1E, 0x00, 0x47, 0x00, 0x15, 0x00, 0x61, 0x00, 0x1E, 0x00, 0x75, 0x00, 0x1A, 0x00, 0x23, -/* 0000D1D0 */ 0x00, 0x1A, 0x00, 0x24, 0x00, 0x56, 0x00, 0xB4, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, -/* 0000D1E0 */ 0x07, 0xFE, 0xFD, 0x02, 0xFE, 0x68, 0x03, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x33, 0x00, 0xFE, -/* 0000D1F0 */ 0xCF, 0x9E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xCF, 0x9E, 0xFE, 0x4D, 0x06, 0xFE, -/* 0000D200 */ 0x4D, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x03, 0x09, 0x08, 0x07, 0x08, 0x08, 0xFF, -/* 0000D210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, -/* 0000D220 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000D230 */ 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, -/* 0000D240 */ 0x04, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0xFE, 0x95, 0x01, 0xAE, 0x0A, 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, -/* 0000D250 */ 0xA8, 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x61, 0x0F, 0x0A, 0x00, 0x10, 0x03, -/* 0000D260 */ 0x00, 0x0F, 0x03, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x04, 0x47, 0x08, 0x0F, 0x61, 0x0F, 0x0A, -/* 0000D270 */ 0x00, 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x03, 0x47, 0x09, 0x0F, -/* 0000D280 */ 0x6A, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, 0xA8, 0x0F, -/* 0000D290 */ 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x1C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000D2A0 */ 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC2, 0x03, 0x00, -/* 0000D2B0 */ 0x0F, 0x09, 0x28, 0x01, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, -/* 0000D2C0 */ 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x0F, 0x0F, 0x47, -/* 0000D2D0 */ 0x0C, 0x0F, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x02, 0x00, 0x5C, -/* 0000D2E0 */ 0x00, 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x0F, 0x1E, 0x00, 0x0F, 0x09, 0x00, 0x00, -/* 0000D2F0 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x02, -/* 0000D300 */ 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0xFF, 0x0F, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000D310 */ 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, -/* 0000D320 */ 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0D, 0x0F, -/* 0000D330 */ 0x09, 0x3D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x03, 0x00, -/* 0000D340 */ 0x5C, 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0F, 0x0F, 0x47, -/* 0000D350 */ 0x0D, 0x0F, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x04, -/* 0000D360 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0x1F, 0x03, 0xFF, 0x0F, -/* 0000D370 */ 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x04, 0x00, 0x5C, -/* 0000D380 */ 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x0F, 0x47, -/* 0000D390 */ 0x0F, 0x0D, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, -/* 0000D3A0 */ 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x8E, -/* 0000D3B0 */ 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x5C, 0x03, -/* 0000D3C0 */ 0x0C, 0x1F, 0x04, 0x10, 0x10, 0x76, 0x10, 0x0F, 0x05, 0x61, 0x0F, 0x0D, 0x06, 0x82, 0x0F, 0x0F, -/* 0000D3D0 */ 0x28, 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000D3E0 */ 0xF0, 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x77, 0x02, -/* 0000D3F0 */ 0xFE, 0x77, 0x02, 0xDB, 0x00, 0xFE, 0x48, 0xA0, 0x14, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, -/* 0000D400 */ 0x00, 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, -/* 0000D410 */ 0x00, 0x07, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x1C, 0x00, 0x52, 0x00, 0x1E, 0x00, 0x37, -/* 0000D420 */ 0x00, 0x1E, 0x00, 0x38, 0x00, 0x1B, 0x00, 0x97, 0x00, 0x1E, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, -/* 0000D430 */ 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x58, 0x00, 0x1F, 0x00, 0x76, 0x00, 0x3A, 0x00, 0x68, -/* 0000D440 */ 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, -/* 0000D450 */ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x56, 0x03, 0x61, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x32, -/* 0000D460 */ 0x00, 0xFE, 0xFF, 0x9A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xFF, 0x9A, 0xFE, 0x90, -/* 0000D470 */ 0x03, 0xFE, 0x90, 0x03, 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4E, 0x4A, 0x02, 0x05, 0x07, 0x07, 0x07, -/* 0000D480 */ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D490 */ 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D4A0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x9D, 0x03, 0x04, 0x01, 0x01, -/* 0000D4B0 */ 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x30, 0x01, 0xAE, 0x08, 0x5B, 0x0A, 0xB3, -/* 0000D4C0 */ 0x0A, 0x0A, 0x97, 0x0E, 0x08, 0x03, 0x47, 0x09, 0x0E, 0xA8, 0x0E, 0x14, 0x0B, 0x00, 0x0A, 0x0E, -/* 0000D4D0 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, -/* 0000D4E0 */ 0x09, 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, -/* 0000D4F0 */ 0x01, 0x04, 0x1F, 0x02, 0xFF, 0x0E, 0x09, 0x20, 0x00, 0x14, 0x03, 0x00, 0x09, 0x02, 0x09, 0x18, -/* 0000D500 */ 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x01, 0x07, -/* 0000D510 */ 0x01, 0x00, 0x5C, 0x00, 0x0F, 0x1F, 0x01, 0xFF, 0x0E, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 0000D520 */ 0x00, 0x00, 0x0E, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0E, 0x0E, -/* 0000D530 */ 0x47, 0x0B, 0x0E, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x02, 0x00, -/* 0000D540 */ 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x09, 0x0E, 0x8E, 0x02, 0x00, -/* 0000D550 */ 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0xCB, 0x0F, 0x5C, -/* 0000D560 */ 0x01, 0x0F, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0E, 0x0E, 0x47, 0x0C, 0x0E, 0x8E, 0x01, 0x00, 0x00, -/* 0000D570 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x4B, 0x0E, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, -/* 0000D580 */ 0x0C, 0x97, 0x0F, 0x08, 0x06, 0x5C, 0x02, 0x0F, 0x97, 0x0F, 0x08, 0x07, 0x5C, 0x03, 0x0F, 0x1F, -/* 0000D590 */ 0x04, 0xFF, 0x0E, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x02, 0x00, -/* 0000D5A0 */ 0x5C, 0x00, 0x05, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, -/* 0000D5B0 */ 0x02, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x5C, 0x02, 0x09, 0x61, 0x11, 0x0C, -/* 0000D5C0 */ 0x03, 0x5C, 0x03, 0x11, 0x61, 0x11, 0x0C, 0x04, 0x5C, 0x04, 0x11, 0x61, 0x11, 0x0C, 0x05, 0x5C, -/* 0000D5D0 */ 0x05, 0x11, 0x61, 0x11, 0x0C, 0x06, 0x5C, 0x06, 0x11, 0x1F, 0x07, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, -/* 0000D5E0 */ 0x1F, 0x02, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x57, 0x02, -/* 0000D5F0 */ 0xFE, 0x55, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, -/* 0000D600 */ 0x74, 0x02, 0x00, 0xFE, 0x1D, 0x9B, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x29, 0x00, 0x12, -/* 0000D610 */ 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x6D, 0x00, 0x08, 0x00, 0x29, 0x00, 0x18, 0x00, 0xE2, 0x00, 0x1A, -/* 0000D620 */ 0x00, 0x2C, 0x00, 0x1A, 0x00, 0x29, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x27, 0x00, 0x4D, 0x00, 0x56, -/* 0000D630 */ 0x00, 0xB5, 0x00, 0x00, 0xBF, 0xFD, 0x02, 0x04, 0x0F, 0xFD, 0x0F, 0xFE, 0xA6, 0x03, 0xFE, 0xE9, -/* 0000D640 */ 0x02, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x30, 0x00, 0xFE, 0xD7, 0x83, 0x01, 0xFF, 0x00, 0x10, -/* 0000D650 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xD7, 0x83, 0xFE, 0xC5, 0x16, 0xFE, 0xC5, 0x16, 0x44, 0x03, 0x15, -/* 0000D660 */ 0x24, 0x35, 0x08, 0xFE, 0x0A, 0x01, 0xF9, 0x02, 0x10, 0x13, 0x13, 0x13, 0x13, 0x01, 0x32, 0xFF, -/* 0000D670 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x35, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D680 */ 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, -/* 0000D690 */ 0xFE, 0xFD, 0x02, 0x08, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, -/* 0000D6A0 */ 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, -/* 0000D6B0 */ 0xFE, 0xA8, 0x03, 0x02, 0x01, 0xFE, 0xA9, 0x03, 0x02, 0x01, 0xFE, 0xAA, 0x03, 0x02, 0x01, 0xFE, -/* 0000D6C0 */ 0xAB, 0x03, 0x02, 0x00, 0xFE, 0xAC, 0x03, 0x02, 0x00, 0xFE, 0xAD, 0x03, 0x02, 0x00, 0xFE, 0xAE, -/* 0000D6D0 */ 0x03, 0x02, 0x00, 0xFE, 0xAF, 0x03, 0x02, 0x01, 0xFE, 0xB0, 0x03, 0x02, 0x01, 0xFE, 0x58, 0x03, -/* 0000D6E0 */ 0x09, 0x02, 0x01, 0xFE, 0xB1, 0x03, 0x02, 0x00, 0xFE, 0xB2, 0x03, 0x02, 0x00, 0xFE, 0xB3, 0x03, -/* 0000D6F0 */ 0x02, 0x01, 0xFE, 0xB4, 0x03, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0xB6, 0x03, 0x02, -/* 0000D700 */ 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x01, 0xFE, 0xB7, 0x03, 0x02, 0x01, 0xFE, 0xB8, 0x03, 0x02, 0x01, -/* 0000D710 */ 0xFE, 0xB9, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1C, 0x04, -/* 0000D720 */ 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0x2C, 0x36, 0x24, 0x0D, 0x03, 0x00, 0x36, 0x02, 0x09, 0x18, -/* 0000D730 */ 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x6C, 0x36, 0x37, 0x00, 0x07, -/* 0000D740 */ 0x01, 0x00, 0x5C, 0x00, 0x37, 0x1F, 0x01, 0xFF, 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000D750 */ 0x00, 0x00, 0x36, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x19, 0x00, -/* 0000D760 */ 0x00, 0x00, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x24, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x36, 0x36, -/* 0000D770 */ 0x0F, 0x03, 0x00, 0x36, 0x09, 0x29, 0x00, 0x61, 0x36, 0x24, 0x01, 0x0F, 0x03, 0x00, 0x36, 0x09, -/* 0000D780 */ 0x1E, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x6C, 0x36, 0x37, 0x02, -/* 0000D790 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x36, -/* 0000D7A0 */ 0x76, 0x06, 0x24, 0x03, 0x2C, 0x36, 0x26, 0x14, 0x03, 0x00, 0x36, 0x07, 0x09, 0x22, 0x00, 0x8E, -/* 0000D7B0 */ 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x36, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, -/* 0000D7C0 */ 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x36, 0x36, 0x47, 0x26, 0x36, 0x09, 0x1E, -/* 0000D7D0 */ 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x37, 0x6C, 0x36, 0x37, 0x04, 0x07, -/* 0000D7E0 */ 0x02, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x26, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x26, 0x36, 0x8E, -/* 0000D7F0 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000D800 */ 0x01, 0x26, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x02, 0xA1, 0x00, 0x0B, 0x37, 0xA1, -/* 0000D810 */ 0x01, 0x0C, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x28, 0x36, -/* 0000D820 */ 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, -/* 0000D830 */ 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x02, 0xA1, 0x00, 0x0E, 0x37, -/* 0000D840 */ 0xA1, 0x01, 0x0F, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x0E, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x29, -/* 0000D850 */ 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000D860 */ 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x04, 0xA1, 0x00, 0x11, -/* 0000D870 */ 0x37, 0xA1, 0x01, 0x12, 0x37, 0xA1, 0x02, 0x13, 0x37, 0xA1, 0x03, 0x14, 0x37, 0x5C, 0x04, 0x37, -/* 0000D880 */ 0xA8, 0x37, 0x5C, 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x2A, 0x36, 0x8E, 0x02, 0x00, 0x00, -/* 0000D890 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, -/* 0000D8A0 */ 0x02, 0x15, 0x5C, 0x03, 0x16, 0xA8, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x17, 0x1F, 0x06, 0x36, -/* 0000D8B0 */ 0x36, 0x47, 0x2B, 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, -/* 0000D8C0 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x03, -/* 0000D8D0 */ 0xA1, 0x00, 0x19, 0x37, 0xA1, 0x01, 0x1A, 0x37, 0xA1, 0x02, 0x1B, 0x37, 0x5C, 0x04, 0x37, 0xA8, -/* 0000D8E0 */ 0x37, 0x5C, 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x96, 0x02, 0x00, 0x00, 0x00, 0x36, 0x8E, 0x02, -/* 0000D8F0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000D900 */ 0x26, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x16, 0xCD, 0x37, 0x02, 0xA1, 0x00, 0x06, 0x37, 0xA1, 0x01, -/* 0000D910 */ 0x17, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x96, 0x03, -/* 0000D920 */ 0x00, 0x00, 0x00, 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x36, 0x07, 0x02, -/* 0000D930 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x25, 0x36, 0x8E, 0x02, -/* 0000D940 */ 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x36, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000D950 */ 0x25, 0x5C, 0x02, 0x28, 0xA8, 0x37, 0x5C, 0x03, 0x37, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x37, 0x00, -/* 0000D960 */ 0x00, 0x00, 0x37, 0x5C, 0x04, 0x37, 0x1F, 0x05, 0x36, 0x36, 0x47, 0x2C, 0x36, 0x96, 0x04, 0x00, -/* 0000D970 */ 0x00, 0x00, 0x1D, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x36, 0x07, 0x02, 0x00, -/* 0000D980 */ 0x5C, 0x00, 0x04, 0x61, 0x37, 0x2C, 0x05, 0x5C, 0x01, 0x37, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x2D, -/* 0000D990 */ 0x36, 0x47, 0x2E, 0x2D, 0x61, 0x36, 0x2C, 0x06, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x31, 0x00, 0x8E, -/* 0000D9A0 */ 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x36, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, -/* 0000D9B0 */ 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x37, 0x5C, 0x01, 0x37, 0x61, 0x37, 0x2C, 0x06, -/* 0000D9C0 */ 0x5C, 0x02, 0x37, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x37, 0x5C, 0x03, 0x37, 0x1F, 0x04, 0xFF, 0x36, -/* 0000D9D0 */ 0x92, 0x04, 0x00, 0x00, 0x00, 0x36, 0x15, 0x03, 0x00, 0x36, 0x1D, 0x09, 0x54, 0x00, 0x8E, 0x02, -/* 0000D9E0 */ 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x36, 0x97, 0x36, 0x36, 0x2E, 0x47, 0x2F, 0x36, 0x47, -/* 0000D9F0 */ 0x30, 0x1E, 0xA8, 0x36, 0x15, 0x03, 0x00, 0x2F, 0x36, 0x09, 0x30, 0x00, 0x92, 0x04, 0x00, 0x00, -/* 0000DA00 */ 0x00, 0x37, 0x97, 0x37, 0x2F, 0x37, 0x47, 0x30, 0x37, 0x47, 0x36, 0x37, 0xA8, 0x37, 0x15, 0x03, -/* 0000DA10 */ 0x00, 0x36, 0x37, 0x09, 0x16, 0x00, 0x15, 0x03, 0x00, 0x30, 0x1E, 0x09, 0x0B, 0x00, 0x2F, 0x36, -/* 0000DA20 */ 0x2E, 0x1F, 0x2F, 0x36, 0x36, 0x30, 0x47, 0x2E, 0x36, 0x09, 0x06, 0x00, 0x96, 0x04, 0x00, 0x00, -/* 0000DA30 */ 0x00, 0x1D, 0x92, 0x02, 0x00, 0x00, 0x00, 0x36, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, -/* 0000DA40 */ 0x95, 0x00, 0xE5, 0x37, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x6C, -/* 0000DA50 */ 0x36, 0x37, 0x07, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x20, 0x5C, 0x02, 0x21, 0x5C, -/* 0000DA60 */ 0x03, 0x2D, 0xA8, 0x38, 0x5C, 0x04, 0x38, 0xA8, 0x38, 0x5C, 0x05, 0x38, 0xA8, 0x38, 0x5C, 0x06, -/* 0000DA70 */ 0x38, 0x1F, 0x07, 0x36, 0x36, 0x47, 0x31, 0x36, 0xE9, 0x09, 0x33, 0x00, 0xE7, 0x27, 0x06, 0x8E, -/* 0000DA80 */ 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x36, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000DA90 */ 0x01, 0x27, 0x1F, 0x02, 0xFF, 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, -/* 0000DAA0 */ 0x6C, 0x36, 0x37, 0x08, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x37, 0x1F, 0x01, 0xFF, 0x36, 0xE9, 0x14, -/* 0000DAB0 */ 0x03, 0x00, 0x31, 0x22, 0x09, 0x09, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x09, 0x17, 0x00, -/* 0000DAC0 */ 0x14, 0x03, 0x00, 0x31, 0x23, 0x09, 0x09, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x19, 0x09, 0x06, -/* 0000DAD0 */ 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x1A, 0xA8, 0x36, 0x14, 0x03, 0x00, 0x2A, 0x36, 0x09, 0x03, -/* 0000DAE0 */ 0x00, 0x47, 0x2A, 0x14, 0x92, 0x03, 0x00, 0x00, 0x00, 0x36, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, -/* 0000DAF0 */ 0x37, 0x09, 0x06, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x17, 0x76, 0x28, 0x24, 0x09, 0x61, 0x36, -/* 0000DB00 */ 0x2C, 0x05, 0x76, 0x36, 0x24, 0x0A, 0x76, 0x2E, 0x24, 0x0B, 0x76, 0x29, 0x24, 0x0C, 0x76, 0x2A, -/* 0000DB10 */ 0x24, 0x0D, 0x76, 0x2B, 0x24, 0x0E, 0x92, 0x02, 0x00, 0x00, 0x00, 0x36, 0x76, 0x36, 0x24, 0x0F, -/* 0000DB20 */ 0x92, 0x03, 0x00, 0x00, 0x00, 0x36, 0x76, 0x36, 0x24, 0x10, 0x92, 0x04, 0x00, 0x00, 0x00, 0x36, -/* 0000DB30 */ 0x76, 0x36, 0x24, 0x11, 0x76, 0x06, 0x24, 0x12, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, -/* 0000DB40 */ 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x52, 0x03, 0xFE, 0x6D, 0x02, -/* 0000DB50 */ 0xFE, 0x39, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x17, 0x02, 0xFE, -/* 0000DB60 */ 0x6F, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, -/* 0000DB70 */ 0x02, 0xFE, 0x75, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0xB1, 0x03, 0xFE, 0x21, 0x02, 0xFE, 0xBA, 0x03, -/* 0000DB80 */ 0x00, 0xFE, 0x24, 0x84, 0x35, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x37, 0x00, 0x18, 0x00, 0x3F, -/* 0000DB90 */ 0x00, 0x39, 0x00, 0x93, 0x00, 0x1E, 0x00, 0x65, 0x00, 0x04, 0x00, 0x5D, 0x00, 0x0B, 0x00, 0x3A, -/* 0000DBA0 */ 0x00, 0x22, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x49, 0x00, 0x31, 0x00, 0x71, 0x00, 0x31, 0x00, 0x5F, -/* 0000DBB0 */ 0x00, 0x3B, 0x00, 0x81, 0x00, 0x28, 0x00, 0x6E, 0x00, 0x3A, 0x00, 0x73, 0x00, 0x36, 0x00, 0x9B, -/* 0000DBC0 */ 0x00, 0x1A, 0x00, 0x41, 0x00, 0x2F, 0x00, 0x6F, 0x00, 0x06, 0x00, 0x2B, 0x00, 0x1E, 0x00, 0x69, -/* 0000DBD0 */ 0x00, 0x03, 0x00, 0x46, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x31, 0x00, 0x33, 0x05, 0x0E, 0x00, 0x33, -/* 0000DBE0 */ 0x00, 0x11, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x2F, 0x00, 0x24, 0x00, 0x92, 0x00, 0x08, 0x00, 0x3B, -/* 0000DBF0 */ 0x00, 0x0E, 0x00, 0xB1, 0x00, 0x06, 0x00, 0x7F, 0x00, 0x13, 0x00, 0x51, 0x00, 0x39, 0x00, 0x79, -/* 0000DC00 */ 0x00, 0x01, 0x00, 0x52, 0x00, 0x17, 0x00, 0x92, 0x01, 0x19, 0x00, 0x52, 0x00, 0x08, 0x00, 0x29, -/* 0000DC10 */ 0x00, 0x09, 0x00, 0x30, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x09, 0x00, 0x4A, 0x00, 0x06, 0x00, 0x4E, -/* 0000DC20 */ 0x00, 0x0A, 0x00, 0x35, 0x00, 0x03, 0x00, 0x3C, 0x00, 0x10, 0x00, 0x31, 0x00, 0x06, 0x00, 0x65, -/* 0000DC30 */ 0x00, 0x04, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x48, 0x00, 0x04, 0x00, 0x2A, -/* 0000DC40 */ 0x00, 0x04, 0x00, 0x36, 0x00, 0x04, 0x00, 0x42, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x0A, 0x00, 0x2E, -/* 0000DC50 */ 0x00, 0x0A, 0x00, 0x32, 0x00, 0x06, 0x00, 0x33, 0x00, 0x00, 0x5E, 0xDC, 0x00, 0x00, 0xBF, 0xFC, -/* 0000DC60 */ 0x02, 0x04, 0xCF, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0B, 0x03, 0x57, 0xFF, 0xA2, -/* 0000DC70 */ 0x41, 0xD1, 0x00, 0x31, 0x00, 0xFE, 0x91, 0x8B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 0000DC80 */ 0x91, 0x8B, 0xFE, 0xCB, 0x04, 0xFE, 0xCB, 0x04, 0x41, 0x09, 0x15, 0x1A, 0x0B, 0x5E, 0x59, 0x03, -/* 0000DC90 */ 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DCA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DCB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, -/* 0000DCC0 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0xBB, 0x03, 0x02, 0x01, 0xFE, 0xB1, -/* 0000DCD0 */ 0x03, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0xB2, 0x03, 0x02, 0x00, 0xFE, -/* 0000DCE0 */ 0xB3, 0x03, 0x02, 0x01, 0xFE, 0xB4, 0x03, 0x02, 0x00, 0xFE, 0xBC, 0x03, 0x02, 0x01, 0xFE, 0xBD, -/* 0000DCF0 */ 0x03, 0x08, 0x02, 0x00, 0xFE, 0xBE, 0x03, 0x02, 0x01, 0xFE, 0xB6, 0x03, 0x02, 0x01, 0xFE, 0xAA, -/* 0000DD00 */ 0x03, 0x02, 0x01, 0xFE, 0xA9, 0x03, 0x02, 0x00, 0xFE, 0xBF, 0x03, 0xFE, 0x94, 0x01, 0x8E, 0x03, -/* 0000DD10 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1B, 0x6C, 0x1A, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 0000DD20 */ 0x00, 0x1B, 0x5C, 0x01, 0x15, 0xE0, 0x1C, 0x00, 0x5C, 0x02, 0x1C, 0x1F, 0x03, 0x1A, 0x1A, 0x47, -/* 0000DD30 */ 0x16, 0x1A, 0x97, 0x1A, 0x16, 0x02, 0x47, 0x17, 0x1A, 0x97, 0x1A, 0x16, 0x03, 0x14, 0x03, 0x00, -/* 0000DD40 */ 0x1A, 0x04, 0x09, 0x08, 0x00, 0xA8, 0x1B, 0x47, 0x1A, 0x1B, 0x09, 0x07, 0x00, 0x97, 0x1B, 0x16, -/* 0000DD50 */ 0x03, 0x47, 0x1A, 0x1B, 0x47, 0x18, 0x1A, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x80, 0x00, 0x8E, -/* 0000DD60 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, -/* 0000DD70 */ 0x09, 0x6C, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x06, 0x00, -/* 0000DD80 */ 0x5C, 0x00, 0x08, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x03, 0x00, -/* 0000DD90 */ 0x5C, 0x00, 0x08, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, -/* 0000DDA0 */ 0x7A, 0x18, 0x1C, 0x01, 0x5C, 0x01, 0x1C, 0x5C, 0x02, 0x07, 0x1F, 0x03, 0x1B, 0x1B, 0x5C, 0x01, -/* 0000DDB0 */ 0x1B, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x09, 0xCD, 0x1B, 0x03, 0xA1, 0x00, 0x0A, 0x1B, 0xA1, 0x01, -/* 0000DDC0 */ 0x0B, 0x1B, 0xA1, 0x02, 0x0C, 0x1B, 0x5C, 0x04, 0x1B, 0xA8, 0x1B, 0x5C, 0x05, 0x1B, 0x1F, 0x06, -/* 0000DDD0 */ 0x1A, 0x1A, 0x94, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x09, 0xBF, 0x00, 0x14, -/* 0000DDE0 */ 0x03, 0x00, 0x17, 0x0D, 0x09, 0x7B, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000DDF0 */ 0x1A, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x67, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, -/* 0000DE00 */ 0x18, 0x1A, 0x09, 0x50, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x1B, 0x6C, -/* 0000DE10 */ 0x1A, 0x1B, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000DE20 */ 0x00, 0x00, 0x1C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x08, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, -/* 0000DE30 */ 0x00, 0x00, 0x1D, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x1C, 0x1C, 0x43, 0x1C, 0x1C, -/* 0000DE40 */ 0x0E, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1A, 0x1A, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 0000DE50 */ 0x00, 0x1A, 0x09, 0x0A, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x09, -/* 0000DE60 */ 0x3C, 0x00, 0x14, 0x03, 0x00, 0x17, 0x10, 0x09, 0x34, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, -/* 0000DE70 */ 0x1A, 0x09, 0x2A, 0x00, 0x15, 0x03, 0x00, 0x18, 0x11, 0x09, 0x22, 0x00, 0x15, 0x03, 0x00, 0x18, -/* 0000DE80 */ 0x12, 0x09, 0x1A, 0x00, 0x15, 0x03, 0x00, 0x18, 0x13, 0x09, 0x12, 0x00, 0x15, 0x03, 0x00, 0x18, -/* 0000DE90 */ 0x14, 0x09, 0x0A, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0xA8, 0x00, -/* 0000DEA0 */ 0x24, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000DEB0 */ 0x00, 0xB1, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0xFE, 0xB1, 0x03, 0xFE, 0x5A, 0x02, 0x00, -/* 0000DEC0 */ 0x0E, 0xFE, 0x4F, 0x03, 0x00, 0xFE, 0xBD, 0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x82, -/* 0000DED0 */ 0x00, 0x07, 0x00, 0x2C, 0x00, 0x1E, 0x00, 0x4C, 0x00, 0x1C, 0x00, 0x4B, 0x00, 0x6C, 0x00, 0x9F, -/* 0000DEE0 */ 0x00, 0x1C, 0x00, 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x50, 0x00, 0xA9, 0x00, 0x0D, 0x00, 0x4D, -/* 0000DEF0 */ 0x00, 0x32, 0x00, 0xFF, 0x00, 0x0C, 0x00, 0x41, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x8F, 0xFD, -/* 0000DF00 */ 0x0F, 0xFE, 0x2E, 0x03, 0xFE, 0xAD, 0x02, 0x1E, 0xFF, 0xA0, 0x41, 0xC1, 0x00, 0x2D, 0x00, 0xFE, -/* 0000DF10 */ 0x4E, 0x7A, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x4E, 0x7A, 0xFE, 0xE5, 0x08, -/* 0000DF20 */ 0xFE, 0xE5, 0x08, 0x01, 0x0C, 0x07, 0x0F, 0x06, 0x7E, 0x76, 0x01, 0x07, 0x02, 0x02, 0x02, 0x02, -/* 0000DF30 */ 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DF40 */ 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, -/* 0000DF50 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x97, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x01, -/* 0000DF60 */ 0x02, 0x00, 0x00, 0x00, 0xFE, 0x08, 0x02, 0x4F, 0x07, 0x4F, 0x08, 0x4F, 0x0B, 0x4F, 0x0C, 0x4F, -/* 0000DF70 */ 0x0D, 0x4F, 0x09, 0x4F, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x4B, -/* 0000DF80 */ 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x24, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000DF90 */ 0x00, 0x10, 0x61, 0x10, 0x10, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x0F, 0x00, 0x8E, 0x01, 0x00, -/* 0000DFA0 */ 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xC1, 0x01, 0xA8, 0x10, 0x47, 0x07, -/* 0000DFB0 */ 0x10, 0xA8, 0x10, 0x47, 0x08, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x10, -/* 0000DFC0 */ 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x8B, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, -/* 0000DFD0 */ 0x00, 0x00, 0x10, 0x4B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x10, 0x10, 0x47, -/* 0000DFE0 */ 0x07, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x01, -/* 0000DFF0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x07, 0xE0, 0x12, 0x00, 0x5C, 0x02, 0x12, 0x1F, -/* 0000E000 */ 0x03, 0x10, 0x10, 0x54, 0x09, 0x10, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x44, 0x00, 0x97, 0x10, 0x09, -/* 0000E010 */ 0x03, 0x47, 0x08, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x05, -/* 0000E020 */ 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, -/* 0000E030 */ 0x11, 0x5C, 0x02, 0x07, 0x47, 0x11, 0x04, 0x01, 0x04, 0x01, 0x12, 0x08, 0x2F, 0x11, 0x11, 0x12, -/* 0000E040 */ 0x2F, 0x11, 0x11, 0x05, 0x5C, 0x03, 0x11, 0x5C, 0x04, 0x05, 0x1F, 0x05, 0x10, 0x10, 0x47, 0x07, -/* 0000E050 */ 0x10, 0x09, 0x48, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, -/* 0000E060 */ 0x11, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, -/* 0000E070 */ 0x00, 0x12, 0x4B, 0x12, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x12, 0x12, 0x5C, 0x01, -/* 0000E080 */ 0x12, 0xE0, 0x12, 0x01, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x10, 0x10, 0x54, 0x0A, 0x10, 0x97, 0x10, -/* 0000E090 */ 0x0A, 0x03, 0x47, 0x07, 0x10, 0x97, 0x10, 0x0A, 0x06, 0x47, 0x08, 0x10, 0xA8, 0x10, 0x14, 0x03, -/* 0000E0A0 */ 0x00, 0x08, 0x10, 0x09, 0x1B, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, -/* 0000E0B0 */ 0x00, 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xAC, -/* 0000E0C0 */ 0x00, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x10, 0x54, 0x0B, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x36, -/* 0000E0D0 */ 0x00, 0x00, 0x00, 0x10, 0x97, 0x10, 0x10, 0x07, 0x54, 0x0C, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, -/* 0000E0E0 */ 0x0C, 0x10, 0x09, 0x2B, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, -/* 0000E0F0 */ 0x08, 0x1F, 0x03, 0x10, 0x0B, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, -/* 0000E100 */ 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x5D, 0x00, -/* 0000E110 */ 0x97, 0x10, 0x0C, 0x08, 0x54, 0x0D, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0D, 0x10, 0x09, 0x1F, -/* 0000E120 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x0D, 0x1F, 0x03, 0x10, -/* 0000E130 */ 0x0B, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x09, 0x1C, 0x00, -/* 0000E140 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x10, 0x0B, -/* 0000E150 */ 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x8E, 0x01, 0x00, 0x00, -/* 0000E160 */ 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000E170 */ 0x00, 0xFE, 0x03, 0x03, 0xFE, 0x37, 0x02, 0x00, 0x28, 0xFE, 0x98, 0x03, 0x00, 0x0E, 0xFE, 0x99, -/* 0000E180 */ 0x03, 0x00, 0xFE, 0x64, 0x7A, 0x1B, 0x0E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x0F, 0x00, -/* 0000E190 */ 0x31, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, 0x23, 0x00, 0x13, 0x00, 0x7A, 0x00, 0x19, 0x00, -/* 0000E1A0 */ 0x29, 0x00, 0x24, 0x00, 0x6A, 0x00, 0x07, 0x00, 0xB8, 0x00, 0x07, 0x00, 0x26, 0x00, 0x40, 0x00, -/* 0000E1B0 */ 0xC6, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x29, 0x00, 0x0A, 0x00, -/* 0000E1C0 */ 0x2B, 0x00, 0x0C, 0x00, 0x2C, 0x00, 0x0F, 0x00, 0x8D, 0x00, 0x09, 0x00, 0x28, 0x01, 0x11, 0x00, -/* 0000E1D0 */ 0x56, 0x00, 0x0A, 0x00, 0x84, 0x00, 0x1C, 0x00, 0x54, 0x00, 0x0F, 0x00, 0x31, 0x00, 0x07, 0x00, -/* 0000E1E0 */ 0x42, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x1F, 0x00, 0x6B, 0x00, 0x1C, 0x00, 0x5B, 0x00, 0x11, 0x00, -/* 0000E1F0 */ 0x22, 0x00, 0x00, 0xF7, 0xE1, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x9A, -/* 0000E200 */ 0x03, 0xFE, 0xCB, 0x02, 0x2C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x2E, 0x00, 0xFE, 0x74, 0x7F, 0xFF, -/* 0000E210 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x74, 0x7F, 0xF9, 0xF9, 0x01, 0x04, 0x05, 0x08, 0x18, -/* 0000E220 */ 0x16, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E230 */ 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E240 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x97, 0x03, 0x02, 0x00, -/* 0000E250 */ 0xFE, 0x9B, 0x03, 0x5A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x4B, 0x08, -/* 0000E260 */ 0x0F, 0x03, 0x00, 0x08, 0x09, 0x23, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, -/* 0000E270 */ 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, -/* 0000E280 */ 0x2F, 0x00, 0x00, 0x02, 0x09, 0x25, 0x00, 0x09, 0x20, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, -/* 0000E290 */ 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x04, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, -/* 0000E2A0 */ 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000E2B0 */ 0x00, 0xFE, 0xA9, 0x7F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x53, -/* 0000E2C0 */ 0x00, 0x22, 0x00, 0x46, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x00, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, -/* 0000E2D0 */ 0xFF, 0xFF, 0xFE, 0x98, 0x02, 0x32, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x2A, 0x00, 0xFE, 0x6D, 0x76, -/* 0000E2E0 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x6D, 0x76, 0xFE, 0x13, 0x03, 0xFE, 0x13, -/* 0000E2F0 */ 0x03, 0x01, 0x06, 0x04, 0x07, 0x08, 0x1E, 0x1E, 0x01, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E300 */ 0x05, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E310 */ 0xFF, 0x00, 0x00, 0x03, 0x04, 0x85, 0x4F, 0x07, 0x96, 0x02, 0x00, 0x00, 0x00, 0x07, 0x8E, 0x01, -/* 0000E320 */ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x07, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x08, -/* 0000E330 */ 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x07, 0x07, 0x96, 0x02, 0x00, 0x00, 0x00, 0x07, -/* 0000E340 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, -/* 0000E350 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, -/* 0000E360 */ 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x00, -/* 0000E370 */ 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x09, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x08, 0x08, 0x5C, 0x02, -/* 0000E380 */ 0x08, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0xFF, 0x07, 0x92, 0x02, -/* 0000E390 */ 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x94, 0x03, -/* 0000E3A0 */ 0x00, 0xFE, 0x83, 0x76, 0x04, 0x08, 0x00, 0x00, 0x00, 0x22, 0x00, 0x31, 0x00, 0x4E, 0x00, 0xB6, -/* 0000E3B0 */ 0x02, 0x0B, 0x00, 0x15, 0x00, 0x00, 0xBA, 0xE3, 0x00, 0x00, 0xBF, 0xFD, 0x02, 0x04, 0x00, 0xFC, -/* 0000E3C0 */ 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9A, 0x02, 0x6B, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x2B, -/* 0000E3D0 */ 0x00, 0xFE, 0x17, 0x77, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x17, 0x77, 0xFE, -/* 0000E3E0 */ 0x48, 0x02, 0xFE, 0x48, 0x02, 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x25, 0x25, 0x02, 0x08, 0x05, -/* 0000E3F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E400 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0xAA, 0x4F, 0x08, 0x96, 0x02, 0x00, -/* 0000E410 */ 0x00, 0x00, 0x08, 0x4F, 0x08, 0x96, 0x03, 0x00, 0x00, 0x00, 0x08, 0x8E, 0x02, 0x00, 0x00, 0x00, -/* 0000E420 */ 0x35, 0x00, 0x00, 0x00, 0x08, 0x97, 0x08, 0x08, 0x04, 0x96, 0x02, 0x00, 0x00, 0x00, 0x08, 0x8E, -/* 0000E430 */ 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, -/* 0000E440 */ 0x09, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x08, 0x08, 0x96, 0x03, 0x00, 0x00, 0x00, -/* 0000E450 */ 0x08, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000E460 */ 0x03, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x09, 0x5C, 0x01, 0x09, 0x8E, 0x02, -/* 0000E470 */ 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x09, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x92, 0x02, -/* 0000E480 */ 0x00, 0x00, 0x00, 0x0A, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x09, 0x09, 0x5C, 0x02, 0x09, 0xD4, 0x00, -/* 0000E490 */ 0x00, 0x00, 0x00, 0x09, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000E4A0 */ 0x02, 0x00, 0x00, 0x00, 0x08, 0x4B, 0x08, 0x92, 0x03, 0x00, 0x00, 0x00, 0x09, 0x9C, 0x09, 0x08, -/* 0000E4B0 */ 0x04, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x95, 0x03, 0xFE, 0x96, 0x03, 0x00, 0xFE, 0x37, -/* 0000E4C0 */ 0x77, 0x05, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x56, 0x00, 0x22, 0x00, 0x45, 0x00, 0x4A, 0x00, -/* 0000E4D0 */ 0x58, 0x01, 0x18, 0x00, 0x34, 0x00, 0x00, 0xDB, 0xE4, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x04, 0x00, -/* 0000E4E0 */ 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9E, 0x02, 0x68, 0xFF, 0xA2, 0x41, 0xD1, 0x00, -/* 0000E4F0 */ 0x2C, 0x00, 0xFE, 0x2E, 0x78, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x2E, 0x78, 0xEC, -/* 0000E500 */ 0xEC, 0x41, 0x04, 0x03, 0x06, 0x0D, 0x0D, 0x03, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E510 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E520 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x31, -/* 0000E530 */ 0x4F, 0x04, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x4B, 0x06, 0x97, 0x06, -/* 0000E540 */ 0x06, 0x03, 0x54, 0x04, 0x06, 0x15, 0x03, 0x00, 0x04, 0x02, 0x09, 0x10, 0x00, 0x8E, 0x01, 0x00, -/* 0000E550 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x4B, 0x06, 0x9C, 0x03, 0x06, 0x04, 0xA8, 0x00, 0x24, -/* 0000E560 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x78, 0x04, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x48, 0x00, -/* 0000E570 */ 0x08, 0x00, 0x2D, 0x00, 0x12, 0x00, 0x4F, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, -/* 0000E580 */ 0xFE, 0x93, 0x03, 0xFE, 0x73, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xC3, 0x00, 0x29, 0x00, 0xFE, 0x45, -/* 0000E590 */ 0x6C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x45, 0x6C, 0x96, 0x96, 0x01, 0x05, 0x03, -/* 0000E5A0 */ 0x06, 0x05, 0x0F, 0x0F, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E5B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E5C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x35, 0x5B, 0x04, 0xB3, 0x04, 0x04, 0x8E, 0x01, -/* 0000E5D0 */ 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x06, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, -/* 0000E5E0 */ 0x04, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x07, 0x4B, 0x07, 0x5C, 0x02, 0x07, -/* 0000E5F0 */ 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000E600 */ 0x00, 0xFE, 0x83, 0x6C, 0x02, 0x05, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x57, 0x00, 0x00, 0xBF, 0xFC, -/* 0000E610 */ 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x92, 0x03, 0xFE, 0x6C, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xA3, -/* 0000E620 */ 0x00, 0x28, 0x00, 0xFE, 0x67, 0x6A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x67, 0x6A, -/* 0000E630 */ 0xFE, 0x04, 0x01, 0xFE, 0x04, 0x01, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, 0x02, 0x01, -/* 0000E640 */ 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E650 */ 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E660 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, -/* 0000E670 */ 0x5A, 0xAE, 0x07, 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x4F, 0x08, 0x61, 0x0B, 0x07, 0x00, 0x12, 0x03, -/* 0000E680 */ 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x07, 0x00, 0x97, 0x0C, -/* 0000E690 */ 0x07, 0x04, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, -/* 0000E6A0 */ 0x00, 0x0B, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000E6B0 */ 0x49, 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, -/* 0000E6C0 */ 0x1F, 0x05, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFE, -/* 0000E6D0 */ 0xB3, 0x6A, 0x03, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x4D, 0x00, 0x31, 0x00, 0x6A, 0x00, 0x00, -/* 0000E6E0 */ 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x91, 0x03, 0xFE, 0x65, 0x02, 0x08, 0xFF, 0xA2, -/* 0000E6F0 */ 0x41, 0xA3, 0x00, 0x27, 0x00, 0xFE, 0x55, 0x68, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 0000E700 */ 0x55, 0x68, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, -/* 0000E710 */ 0x02, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E720 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E730 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -/* 0000E740 */ 0x00, 0x04, 0x5A, 0xAE, 0x07, 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x4F, 0x08, 0x61, 0x0B, 0x07, 0x00, -/* 0000E750 */ 0x12, 0x03, 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x07, 0x00, -/* 0000E760 */ 0x97, 0x0C, 0x07, 0x04, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x32, -/* 0000E770 */ 0x00, 0x00, 0x00, 0x0B, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x00, -/* 0000E780 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, -/* 0000E790 */ 0x04, 0x08, 0x1F, 0x05, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, -/* 0000E7A0 */ 0x00, 0xFE, 0x9F, 0x68, 0x03, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x4D, 0x00, 0x31, 0x00, 0x68, -/* 0000E7B0 */ 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x90, 0x03, 0xFE, 0x5E, 0x02, 0x08, -/* 0000E7C0 */ 0xFF, 0xA2, 0x41, 0xA3, 0x00, 0x26, 0x00, 0xFE, 0x53, 0x66, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 0000E7D0 */ 0x02, 0xFE, 0x53, 0x66, 0xF8, 0xF8, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, 0x02, 0x01, -/* 0000E7E0 */ 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E7F0 */ 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E800 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, -/* 0000E810 */ 0x5A, 0xAE, 0x07, 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x4F, 0x08, 0x61, 0x0B, 0x07, 0x00, 0x12, 0x03, -/* 0000E820 */ 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x07, 0x00, 0x97, 0x0C, -/* 0000E830 */ 0x07, 0x04, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, -/* 0000E840 */ 0x00, 0x0B, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000E850 */ 0x45, 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, -/* 0000E860 */ 0x1F, 0x05, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFE, -/* 0000E870 */ 0x99, 0x66, 0x03, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x4D, 0x00, 0x31, 0x00, 0x64, 0x00, 0x00, -/* 0000E880 */ 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xE6, 0x02, 0xFE, 0x40, 0x02, 0x1D, 0xFF, 0xA2, -/* 0000E890 */ 0x41, 0xC1, 0x00, 0x25, 0x00, 0xFE, 0xB3, 0x60, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, -/* 0000E8A0 */ 0xB3, 0x60, 0xFE, 0x60, 0x03, 0xFE, 0x60, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, 0x50, 0x4D, 0x01, -/* 0000E8B0 */ 0x08, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E8C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E8D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, 0x00, 0xFE, 0x50, -/* 0000E8E0 */ 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x00, 0xFE, 0x8F, 0x03, -/* 0000E8F0 */ 0xFE, 0x50, 0x01, 0xA8, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0C, 0x07, -/* 0000E900 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0C, 0x0C, 0x47, 0x08, 0x0C, 0x2C, -/* 0000E910 */ 0x0C, 0x09, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x78, 0x00, 0x61, 0x0C, 0x09, 0x00, 0x47, 0x0A, -/* 0000E920 */ 0x0C, 0x2C, 0x0C, 0x0A, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x66, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 0000E930 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x0D, 0x6C, 0x0C, 0x0D, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0D, -/* 0000E940 */ 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0C, 0x0C, 0x47, 0x0A, 0x0C, 0x15, 0x03, 0x00, 0x0A, 0x04, 0x09, -/* 0000E950 */ 0x40, 0x00, 0x15, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x38, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 0000E960 */ 0x00, 0x00, 0x00, 0x0D, 0x6C, 0x0C, 0x0D, 0x02, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0D, 0x8E, 0x01, -/* 0000E970 */ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, -/* 0000E980 */ 0x0A, 0x1F, 0x02, 0x0E, 0x0E, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x07, 0x1F, 0x04, -/* 0000E990 */ 0xFF, 0x0C, 0x2C, 0x0C, 0x0A, 0x14, 0x0B, 0x00, 0x0C, 0x03, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, -/* 0000E9A0 */ 0x0A, 0x05, 0x09, 0x5C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x07, -/* 0000E9B0 */ 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, -/* 0000E9C0 */ 0x00, 0x0D, 0x5C, 0x02, 0x0D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, -/* 0000E9D0 */ 0x0D, 0x0E, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, -/* 0000E9E0 */ 0x00, 0x00, 0x0F, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, -/* 0000E9F0 */ 0x1F, 0x02, 0x0D, 0x0D, 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0x00, 0x0C, 0x09, 0x43, 0x00, 0x09, 0x3E, -/* 0000EA00 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000EA10 */ 0x02, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0D, 0x5C, 0x02, -/* 0000EA20 */ 0x0D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 0000EA30 */ 0x02, 0x1F, 0x01, 0x0D, 0x0D, 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, -/* 0000EA40 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x62, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x27, -/* 0000EA50 */ 0x02, 0x00, 0xFE, 0xEE, 0x60, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x34, 0x00, 0x0B, 0x00, -/* 0000EA60 */ 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x1E, 0x00, 0x37, 0x00, 0x10, 0x00, -/* 0000EA70 */ 0x4A, 0x00, 0x38, 0x00, 0x96, 0x00, 0x13, 0x00, 0x4C, 0x00, 0x5C, 0x00, 0x93, 0x00, 0x40, 0x00, -/* 0000EA80 */ 0x64, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x2B, 0x03, 0xFE, 0x32, 0x02, -/* 0000EA90 */ 0x28, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x24, 0x00, 0xFE, 0xDF, 0x5E, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000EAA0 */ 0x04, 0x04, 0xFE, 0xDF, 0x5E, 0xFE, 0x8C, 0x01, 0xFE, 0x8C, 0x01, 0x01, 0x07, 0x05, 0x0A, 0x03, -/* 0000EAB0 */ 0x26, 0x25, 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EAC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EAD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x04, -/* 0000EAE0 */ 0x97, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0A, 0x14, 0x03, 0x00, 0x05, 0x0A, -/* 0000EAF0 */ 0x09, 0x1B, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x6C, 0x0A, 0x0B, -/* 0000EB00 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0A, 0x8E, 0x01, -/* 0000EB10 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x6C, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, -/* 0000EB20 */ 0x00, 0x0B, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x0A, 0x0A, 0x47, 0x08, 0x0A, 0x0F, 0x03, 0x00, 0x08, -/* 0000EB30 */ 0x09, 0x0C, 0x00, 0x61, 0x0A, 0x08, 0x02, 0x15, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x1B, 0x00, 0x8E, -/* 0000EB40 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, -/* 0000EB50 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x07, -/* 0000EB60 */ 0x00, 0x00, 0x00, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x00, -/* 0000EB70 */ 0x0A, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x58, 0x02, 0xFE, 0x33, 0x02, -/* 0000EB80 */ 0xFE, 0x61, 0x02, 0x00, 0xFE, 0x10, 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, -/* 0000EB90 */ 0x1B, 0x00, 0x40, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x1B, 0x00, 0x40, 0x00, -/* 0000EBA0 */ 0x1C, 0x00, 0x2C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x2A, 0x03, 0xFE, -/* 0000EBB0 */ 0x25, 0x02, 0x24, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x23, 0x00, 0xFE, 0x1B, 0x5D, 0xFF, 0x00, 0x10, -/* 0000EBC0 */ 0x01, 0x00, 0x05, 0x05, 0xFE, 0x1B, 0x5D, 0xFE, 0x9A, 0x01, 0xFE, 0x9A, 0x01, 0x01, 0x08, 0x05, -/* 0000EBD0 */ 0x0B, 0x04, 0x27, 0x26, 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EBE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EBF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x00, 0xFE, 0xDF, -/* 0000EC00 */ 0x02, 0x04, 0x9A, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, -/* 0000EC10 */ 0x05, 0x0B, 0x09, 0x1B, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, -/* 0000EC20 */ 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0B, -/* 0000EC30 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, -/* 0000EC40 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x0F, 0x03, -/* 0000EC50 */ 0x00, 0x09, 0x09, 0x0C, 0x00, 0x61, 0x0B, 0x09, 0x02, 0x15, 0x03, 0x00, 0x0B, 0x03, 0x09, 0x1B, -/* 0000EC60 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, -/* 0000EC70 */ 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x01, 0x00, 0x00, -/* 0000EC80 */ 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x5C, -/* 0000EC90 */ 0x02, 0x08, 0x1F, 0x03, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 0000ECA0 */ 0x58, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x61, 0x02, 0x00, 0xFE, 0x55, 0x5D, 0x07, 0x00, 0x00, 0x00, -/* 0000ECB0 */ 0x00, 0x12, 0x00, 0x37, 0x00, 0x1B, 0x00, 0x40, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, -/* 0000ECC0 */ 0x00, 0x1B, 0x00, 0x40, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x4F, 0xFC, -/* 0000ECD0 */ 0x0F, 0xFE, 0x0C, 0x03, 0xFE, 0x12, 0x02, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x21, 0x00, 0xFE, -/* 0000ECE0 */ 0x86, 0x59, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x86, 0x59, 0xFE, 0x6F, 0x03, -/* 0000ECF0 */ 0xFE, 0x6F, 0x03, 0x04, 0x09, 0x0A, 0x10, 0x05, 0x20, 0x20, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, -/* 0000ED00 */ 0x01, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ED10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, -/* 0000ED20 */ 0x02, 0x01, 0xFE, 0x88, 0x03, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x09, -/* 0000ED30 */ 0x02, 0x01, 0xFE, 0x00, 0x03, 0x03, 0x97, 0x96, 0x04, 0x00, 0x00, 0x00, 0x0B, 0x96, 0x05, 0x00, -/* 0000ED40 */ 0x00, 0x00, 0x0C, 0xCD, 0x10, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x10, 0x96, 0x03, 0x00, 0x00, -/* 0000ED50 */ 0x00, 0x02, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, -/* 0000ED60 */ 0x00, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x5C, -/* 0000ED70 */ 0x02, 0x0A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, 0x8E, -/* 0000ED80 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x92, -/* 0000ED90 */ 0x02, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, -/* 0000EDA0 */ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x12, 0x7A, 0x12, -/* 0000EDB0 */ 0x11, 0x00, 0x7A, 0x07, 0x11, 0x01, 0x7A, 0x07, 0x11, 0x02, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, -/* 0000EDC0 */ 0x10, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, -/* 0000EDD0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, -/* 0000EDE0 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, -/* 0000EDF0 */ 0xFE, 0xB2, 0x01, 0xFE, 0x89, 0x03, 0xFE, 0x8A, 0x03, 0xFE, 0x8B, 0x03, 0xFE, 0x8C, 0x03, 0x00, -/* 0000EE00 */ 0xFE, 0xD9, 0x59, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x00, 0x19, 0x00, 0x06, 0x00, 0x17, 0x00, -/* 0000EE10 */ 0x2D, 0x00, 0x70, 0x02, 0x42, 0x00, 0x68, 0x00, 0x0B, 0x00, 0x13, 0x00, 0x00, 0x21, 0xEE, 0x00, -/* 0000EE20 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x4F, 0xFD, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x15, 0x02, -/* 0000EE30 */ 0x41, 0xFF, 0xB2, 0x41, 0xD1, 0x00, 0x22, 0x00, 0xFE, 0x42, 0x5A, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000EE40 */ 0x02, 0x02, 0xFE, 0x42, 0x5A, 0xFE, 0x2C, 0x02, 0xFE, 0x2C, 0x02, 0x45, 0x08, 0x0B, 0x0F, 0x06, -/* 0000EE50 */ 0x30, 0x2F, 0x02, 0x07, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EE60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, -/* 0000EE70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, -/* 0000EE80 */ 0xFE, 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x08, 0x03, 0x01, -/* 0000EE90 */ 0x01, 0x00, 0x00, 0x00, 0xD6, 0xA8, 0x0D, 0xE5, 0xB2, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x2E, -/* 0000EEA0 */ 0x00, 0x00, 0x00, 0x10, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0B, 0x8E, 0x01, 0x00, -/* 0000EEB0 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x02, 0x11, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x8E, -/* 0000EEC0 */ 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x04, 0x11, 0x1F, 0x05, 0x10, 0x10, -/* 0000EED0 */ 0x47, 0x0D, 0x10, 0x61, 0x10, 0x0D, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x6A, 0x00, 0x8E, 0x02, -/* 0000EEE0 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, -/* 0000EEF0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000EF00 */ 0x03, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x02, 0x11, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000EF10 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x61, 0x12, 0x0D, 0x00, 0x7A, 0x12, 0x11, 0x01, 0x7A, 0x05, 0x11, -/* 0000EF20 */ 0x02, 0x7A, 0x05, 0x11, 0x03, 0x7A, 0x08, 0x11, 0x04, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, -/* 0000EF30 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x2F, 0x10, 0x10, 0x0A, 0x94, 0x01, -/* 0000EF40 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xE9, 0x09, 0x1B, 0x00, 0xE7, 0x0C, 0x06, 0x8E, -/* 0000EF50 */ 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, -/* 0000EF60 */ 0x01, 0x0C, 0x1F, 0x02, 0xFF, 0x10, 0xE9, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, -/* 0000EF70 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, -/* 0000EF80 */ 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x02, 0xFE, 0xB4, -/* 0000EF90 */ 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, 0x00, 0xFE, 0x78, 0x5A, 0x07, 0x05, -/* 0000EFA0 */ 0x00, 0x00, 0x00, 0x39, 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x52, 0x00, 0x8D, 0x00, 0x1E, -/* 0000EFB0 */ 0x00, 0x33, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x1A, 0x00, 0x8F, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, -/* 0000EFC0 */ 0x0F, 0xFC, 0x0F, 0xFE, 0x0B, 0x03, 0xFE, 0xEE, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1F, -/* 0000EFD0 */ 0x00, 0xFE, 0x4F, 0x55, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x4F, 0x55, 0xFE, -/* 0000EFE0 */ 0x31, 0x04, 0xFE, 0x31, 0x04, 0x01, 0x08, 0x05, 0x0A, 0x05, 0x2C, 0x2A, 0x01, 0x03, 0x03, 0x03, -/* 0000EFF0 */ 0x03, 0x03, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F000 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, -/* 0000F010 */ 0x02, 0x01, 0xFE, 0x59, 0x03, 0x04, 0xA9, 0x4F, 0x06, 0x4F, 0x0A, 0x96, 0x02, 0x00, 0x00, 0x00, -/* 0000F020 */ 0x0A, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x06, 0x00, 0xCD, 0x00, 0x00, 0x09, -/* 0000F030 */ 0x8C, 0x00, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x0A, 0x00, 0xCD, 0x0A, 0x01, -/* 0000F040 */ 0xA1, 0x00, 0x05, 0x0A, 0x47, 0x05, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, -/* 0000F050 */ 0x0B, 0x6C, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x05, 0x1F, 0x02, -/* 0000F060 */ 0x0A, 0x0A, 0x47, 0x05, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0B, 0x6C, -/* 0000F070 */ 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x61, 0x0C, 0x05, 0x02, 0x5C, 0x01, 0x0C, -/* 0000F080 */ 0x1F, 0x02, 0x0A, 0x0A, 0x54, 0x06, 0x0A, 0xCD, 0x0A, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x0A, -/* 0000F090 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, -/* 0000F0A0 */ 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x5C, 0x03, 0x0B, 0x1F, -/* 0000F0B0 */ 0x04, 0xFF, 0x0A, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 0000F0C0 */ 0x00, 0x00, 0xFE, 0x52, 0x03, 0xFE, 0x5F, 0x02, 0xF0, 0xFE, 0x85, 0x03, 0x00, 0xFE, 0x82, 0x55, -/* 0000F0D0 */ 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x06, 0x00, 0x1E, 0x00, 0x0B, 0x00, 0x2F, -/* 0000F0E0 */ 0x00, 0x0A, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x22, 0x00, 0x70, 0x00, 0x09, 0x00, 0x18, -/* 0000F0F0 */ 0x00, 0x23, 0x00, 0x8F, 0x02, 0x0B, 0x00, 0x11, 0x00, 0x00, 0xFE, 0xF0, 0x00, 0x00, 0xBF, 0xFC, -/* 0000F100 */ 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0x01, 0x2A, 0xFF, 0xA2, -/* 0000F110 */ 0x41, 0xD1, 0x00, 0x20, 0x00, 0xFE, 0x01, 0x57, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 0000F120 */ 0x01, 0x57, 0xFE, 0x61, 0x02, 0xFE, 0x61, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x4C, 0x4A, 0x02, -/* 0000F130 */ 0x08, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F150 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, -/* 0000F160 */ 0x03, 0x02, 0x00, 0xFE, 0x87, 0x03, 0x04, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x45, 0x01, 0x4F, -/* 0000F170 */ 0x09, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x0B, 0x00, 0x2C, 0x0B, 0x08, 0x15, -/* 0000F180 */ 0x0B, 0x00, 0x0B, 0x03, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x08, 0x04, 0x09, 0x1B, 0x00, 0x8E, -/* 0000F190 */ 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, -/* 0000F1A0 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x31, -/* 0000F1B0 */ 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, -/* 0000F1C0 */ 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, -/* 0000F1D0 */ 0x00, 0x0B, 0x4B, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0B, -/* 0000F1E0 */ 0x0B, 0x0F, 0x35, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000F1F0 */ 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x8E, 0x02, 0x00, 0x00, -/* 0000F200 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0x1F, -/* 0000F210 */ 0x02, 0x0D, 0x0D, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, -/* 0000F220 */ 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, -/* 0000F230 */ 0x09, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x09, 0x0B, 0x09, -/* 0000F240 */ 0x6E, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x04, 0x00, 0x5C, -/* 0000F250 */ 0x00, 0x06, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, -/* 0000F260 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, -/* 0000F270 */ 0x09, 0x1F, 0x04, 0x0B, 0x0B, 0x14, 0x03, 0x00, 0x0B, 0x07, 0x09, 0x33, 0x00, 0x8E, 0x02, 0x00, -/* 0000F280 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x02, 0x00, -/* 0000F290 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000F2A0 */ 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x0B, -/* 0000F2B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x56, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x60, 0x02, 0xFE, -/* 0000F2C0 */ 0x27, 0x02, 0x00, 0xFE, 0x21, 0x57, 0x09, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x65, 0x00, 0x1B, -/* 0000F2D0 */ 0x00, 0x47, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x20, 0x00, 0x35, 0x00, 0x32, 0x00, 0x4B, 0x00, 0x1E, -/* 0000F2E0 */ 0x00, 0x37, 0x00, 0x45, 0x00, 0x65, 0x00, 0x35, 0x00, 0x46, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, -/* 0000F2F0 */ 0x0F, 0xFC, 0x07, 0xFE, 0x0A, 0x03, 0xFE, 0xE3, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1E, -/* 0000F300 */ 0x00, 0xFE, 0xDA, 0x53, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xDA, 0x53, 0xF8, 0xF8, -/* 0000F310 */ 0x01, 0x05, 0x04, 0x06, 0x04, 0x1D, 0x1C, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, -/* 0000F320 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, -/* 0000F330 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x03, -/* 0000F340 */ 0x7A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x07, 0x6C, 0x06, 0x07, 0x00, 0x07, -/* 0000F350 */ 0x02, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x06, 0x06, 0x47, 0x04, 0x06, 0x8E, -/* 0000F360 */ 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x06, 0x4B, 0x06, 0x0F, 0x17, 0x00, 0x06, 0x09, -/* 0000F370 */ 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x07, 0x01, 0x00, 0x5C, -/* 0000F380 */ 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, -/* 0000F390 */ 0x6C, 0x06, 0x07, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x8E, 0x01, 0x00, -/* 0000F3A0 */ 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x06, 0x06, -/* 0000F3B0 */ 0x44, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5B, 0x02, -/* 0000F3C0 */ 0xFE, 0x37, 0x02, 0x00, 0xFE, 0x0C, 0x54, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x29, 0x00, -/* 0000F3D0 */ 0x13, 0x00, 0x25, 0x00, 0x14, 0x00, 0x2F, 0x00, 0x33, 0x00, 0x48, 0x00, 0x00, 0xBF, 0xFC, 0x02, -/* 0000F3E0 */ 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x09, 0x03, 0xFE, 0xA8, 0x01, 0x04, 0xFF, 0xA1, 0x41, 0xC1, 0x00, -/* 0000F3F0 */ 0x1D, 0x00, 0xFE, 0xD6, 0x40, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD6, 0x40, 0xFE, -/* 0000F400 */ 0xFE, 0x12, 0xFE, 0xFE, 0x12, 0x41, 0x17, 0x25, 0x38, 0x04, 0xAF, 0x9B, 0x01, 0x01, 0xFF, 0xFF, -/* 0000F410 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, -/* 0000F420 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 0000F430 */ 0x00, 0xFE, 0x63, 0x03, 0x02, 0x00, 0xFE, 0x64, 0x03, 0x02, 0x00, 0xFE, 0x65, 0x03, 0x02, 0x01, -/* 0000F440 */ 0xFE, 0x66, 0x03, 0x02, 0x01, 0xFE, 0x67, 0x03, 0x02, 0x00, 0xFE, 0x68, 0x03, 0x02, 0x00, 0xFE, -/* 0000F450 */ 0x69, 0x03, 0x02, 0x00, 0xFE, 0x6A, 0x03, 0x02, 0x00, 0xFE, 0x6B, 0x03, 0x02, 0x00, 0xFE, 0x6C, -/* 0000F460 */ 0x03, 0x02, 0x00, 0xFE, 0x6D, 0x03, 0x02, 0x00, 0xFE, 0x6E, 0x03, 0x02, 0x00, 0xFE, 0x6F, 0x03, -/* 0000F470 */ 0x02, 0x00, 0xFE, 0x70, 0x03, 0x02, 0x00, 0xFE, 0x71, 0x03, 0x02, 0x00, 0xFE, 0x72, 0x03, 0x02, -/* 0000F480 */ 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x73, 0x03, 0x02, 0x00, 0xFE, 0x74, 0x03, 0x02, 0x00, -/* 0000F490 */ 0xFE, 0x75, 0x03, 0x02, 0x00, 0xFE, 0x76, 0x03, 0x02, 0x00, 0xFE, 0x77, 0x03, 0x02, 0x00, 0xFE, -/* 0000F4A0 */ 0x78, 0x03, 0x02, 0x00, 0xFE, 0x79, 0x03, 0x02, 0x00, 0xFE, 0x7A, 0x03, 0x02, 0x00, 0xFE, 0x7B, -/* 0000F4B0 */ 0x03, 0x02, 0x00, 0xFE, 0x7C, 0x03, 0x02, 0x00, 0xFE, 0x7D, 0x03, 0x02, 0x00, 0xFE, 0x7E, 0x03, -/* 0000F4C0 */ 0x02, 0x00, 0xFE, 0x7F, 0x03, 0x02, 0x00, 0xFE, 0x80, 0x03, 0x02, 0x00, 0xFE, 0x81, 0x03, 0x02, -/* 0000F4D0 */ 0x00, 0xFE, 0x82, 0x03, 0x02, 0x00, 0xFE, 0x83, 0x03, 0x02, 0x01, 0xFE, 0x84, 0x03, 0xFE, 0xAB, -/* 0000F4E0 */ 0x02, 0x4F, 0x25, 0x4F, 0x26, 0x4F, 0x27, 0x4F, 0x28, 0x4F, 0x29, 0x4F, 0x2A, 0x4F, 0x2B, 0x4F, -/* 0000F4F0 */ 0x2C, 0x4F, 0x2D, 0x4F, 0x2E, 0x4F, 0x2F, 0x4F, 0x30, 0x4F, 0x31, 0x4F, 0x32, 0x4F, 0x33, 0x4F, -/* 0000F500 */ 0x34, 0x4F, 0x35, 0x4F, 0x36, 0x54, 0x25, 0x02, 0x54, 0x26, 0x03, 0x47, 0x38, 0x04, 0x01, 0x04, -/* 0000F510 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 0000F520 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x06, 0x54, 0x27, 0x38, 0x54, 0x28, 0x07, 0x2F, 0x38, -/* 0000F530 */ 0x08, 0x09, 0x54, 0x29, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x28, 0x2F, 0x38, 0x38, -/* 0000F540 */ 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x29, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, -/* 0000F550 */ 0x38, 0x0B, 0x54, 0x2A, 0x38, 0x47, 0x38, 0x0C, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, -/* 0000F560 */ 0x39, 0x2F, 0x38, 0x38, 0x0D, 0x54, 0x2B, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 0000F570 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0E, 0x54, 0x2C, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 0000F580 */ 0x01, 0x39, 0x2C, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0F, 0x01, 0x04, 0x01, 0x39, 0x27, -/* 0000F590 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x10, 0x54, 0x2D, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 0000F5A0 */ 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x11, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 0000F5B0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x12, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, -/* 0000F5C0 */ 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2E, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 0000F5D0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x14, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, -/* 0000F5E0 */ 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2F, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 0000F5F0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x15, 0x54, 0x30, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 0000F600 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x16, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 0000F610 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x17, 0x54, 0x31, 0x38, 0x47, 0x39, 0x12, 0x01, 0x04, -/* 0000F620 */ 0x01, 0x3A, 0x25, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x18, 0xFC, 0x38, 0x0A, 0x39, 0x05, -/* 0000F630 */ 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x31, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1A, -/* 0000F640 */ 0x47, 0x3A, 0x05, 0x01, 0x04, 0x01, 0x3B, 0x25, 0x2F, 0x3A, 0x3A, 0x3B, 0x2F, 0x3A, 0x3A, 0x1B, -/* 0000F650 */ 0xFE, 0x38, 0x39, 0x3A, 0x02, 0xFD, 0x38, 0x0B, 0x04, 0x54, 0x32, 0x38, 0x47, 0x38, 0x1C, 0x01, -/* 0000F660 */ 0x04, 0x01, 0x39, 0x32, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x47, 0x39, 0x1D, 0x01, -/* 0000F670 */ 0x04, 0x01, 0x3A, 0x30, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, -/* 0000F680 */ 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x2F, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, -/* 0000F690 */ 0x2F, 0x38, 0x38, 0x39, 0x54, 0x33, 0x38, 0x47, 0x38, 0x19, 0x01, 0x04, 0x01, 0x39, 0x2E, 0x2F, -/* 0000F6A0 */ 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x1F, 0x47, 0x39, 0x20, 0x01, 0x04, 0x01, 0x3A, 0x2D, 0x2F, -/* 0000F6B0 */ 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x21, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x19, 0x01, 0x04, -/* 0000F6C0 */ 0x01, 0x3A, 0x2B, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x22, 0x2F, 0x38, 0x38, 0x39, 0x54, -/* 0000F6D0 */ 0x34, 0x38, 0x47, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x33, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, -/* 0000F6E0 */ 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x34, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x23, 0x54, -/* 0000F6F0 */ 0x35, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x35, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, -/* 0000F700 */ 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, -/* 0000F710 */ 0x04, 0x01, 0x39, 0x2A, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x36, 0x38, 0x8E, -/* 0000F720 */ 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x33, 0x5C, -/* 0000F730 */ 0x02, 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, -/* 0000F740 */ 0x00, 0x38, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x07, 0x03, 0x00, 0x5C, -/* 0000F750 */ 0x01, 0x34, 0x5C, 0x02, 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 0000F760 */ 0x43, 0x00, 0x00, 0x00, 0x38, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x07, -/* 0000F770 */ 0x03, 0x00, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, -/* 0000F780 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, -/* 0000F790 */ 0xB6, 0x45, 0x16, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x20, -/* 0000F7A0 */ 0x00, 0x33, 0x00, 0x03, 0x00, 0x77, 0x00, 0x07, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x44, 0x00, 0x13, -/* 0000F7B0 */ 0x00, 0x7D, 0x00, 0x13, 0x00, 0x94, 0x00, 0x20, 0x00, 0x83, 0x00, 0x2D, 0x00, 0x83, 0x00, 0x20, -/* 0000F7C0 */ 0x00, 0x74, 0x00, 0x13, 0x00, 0x6A, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x41, 0x00, 0x00, 0x04, 0x3B, -/* 0000F7D0 */ 0x00, 0x4C, 0x01, 0x3B, 0x00, 0x5A, 0x01, 0x20, 0x00, 0x4B, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x23, -/* 0000F7E0 */ 0x00, 0x66, 0x00, 0x23, 0x00, 0x8B, 0x00, 0x25, 0x00, 0x72, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x00, -/* 0000F7F0 */ 0x80, 0xFC, 0x07, 0xFE, 0x08, 0x03, 0xFE, 0xA1, 0x01, 0x04, 0xFF, 0xA1, 0x41, 0xC1, 0x00, 0x1C, -/* 0000F800 */ 0x00, 0xFE, 0x99, 0x3F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x99, 0x3F, 0x55, 0x55, -/* 0000F810 */ 0x41, 0x02, 0x02, 0x03, 0x05, 0x05, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F820 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F830 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x13, 0xE0, 0x03, 0x00, 0x01, 0x32, 0x01, -/* 0000F840 */ 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x03, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 0000F850 */ 0x0A, 0xFE, 0x62, 0x03, 0x01, 0xFE, 0xC7, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x26, -/* 0000F860 */ 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x07, 0x03, 0xFE, 0x90, 0x01, 0x04, -/* 0000F870 */ 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1B, 0x00, 0xFE, 0x34, 0x3D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, -/* 0000F880 */ 0x06, 0xFE, 0x34, 0x3D, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x0C, 0x07, 0x0F, 0x08, 0x3C, -/* 0000F890 */ 0x3B, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F8A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, -/* 0000F8B0 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x5F, 0x03, -/* 0000F8C0 */ 0x02, 0x00, 0xFE, 0x60, 0x03, 0x02, 0x01, 0xFE, 0x61, 0x03, 0xEC, 0x4F, 0x0C, 0x4F, 0x0D, 0x97, -/* 0000F8D0 */ 0x10, 0x07, 0x08, 0x54, 0x0C, 0x10, 0x2C, 0x10, 0x0C, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0xCC, -/* 0000F8E0 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, -/* 0000F8F0 */ 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x54, 0x0D, 0x10, 0x8E, -/* 0000F900 */ 0x01, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, -/* 0000F910 */ 0x01, 0x0D, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x13, 0x00, 0x10, 0x09, 0x00, 0x00, 0x12, 0x0B, 0x00, -/* 0000F920 */ 0x0D, 0x09, 0x09, 0x00, 0x00, 0x11, 0x03, 0x00, 0x0D, 0x0A, 0x09, 0x5F, 0x00, 0x8E, 0x01, 0x00, -/* 0000F930 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000F940 */ 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000F950 */ 0x03, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x12, 0x12, 0x5C, 0x01, 0x12, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000F960 */ 0x11, 0x00, 0x00, 0x00, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x08, 0x1F, 0x02, -/* 0000F970 */ 0x12, 0x12, 0x5C, 0x02, 0x12, 0x2F, 0x12, 0x04, 0x09, 0x2F, 0x12, 0x12, 0x05, 0x2F, 0x12, 0x12, -/* 0000F980 */ 0x0A, 0x2F, 0x12, 0x12, 0x06, 0x5C, 0x03, 0x12, 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x01, 0x00, 0x00, -/* 0000F990 */ 0x00, 0x15, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, -/* 0000F9A0 */ 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x00, 0x10, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, -/* 0000F9B0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, 0x02, 0x1F, -/* 0000F9C0 */ 0x00, 0xFE, 0x86, 0x3D, 0x08, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x33, -/* 0000F9D0 */ 0x00, 0x1E, 0x00, 0x41, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x8D, 0x00, 0x21, 0x00, 0x40, -/* 0000F9E0 */ 0x00, 0x08, 0x00, 0x1F, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x06, 0x03, -/* 0000F9F0 */ 0xFE, 0x76, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1A, 0x00, 0xFE, 0x17, 0x3A, 0xFF, 0x00, -/* 0000FA00 */ 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x17, 0x3A, 0xFE, 0x17, 0x03, 0xFE, 0x17, 0x03, 0x01, 0x0B, -/* 0000FA10 */ 0x0A, 0x11, 0x0A, 0x51, 0x4B, 0x01, 0x06, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FA20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FA30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x58, -/* 0000FA40 */ 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x01, 0xFE, 0x5A, 0x03, 0x04, 0x01, 0xFF, 0xFF, 0xFF, -/* 0000FA50 */ 0xFF, 0x02, 0x00, 0xFE, 0x5B, 0x03, 0x02, 0x00, 0xFE, 0x5C, 0x03, 0x02, 0x00, 0xFE, 0x5D, 0x03, -/* 0000FA60 */ 0xFE, 0x4C, 0x01, 0x4F, 0x0F, 0x97, 0x11, 0x0A, 0x0B, 0x47, 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, -/* 0000FA70 */ 0x00, 0x0F, 0x11, 0x09, 0x2F, 0x01, 0x0C, 0x03, 0x00, 0x0C, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x01, -/* 0000FA80 */ 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, 0x12, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 0000FA90 */ 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x11, 0x11, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, -/* 0000FAA0 */ 0x03, 0x09, 0x1E, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, -/* 0000FAB0 */ 0x12, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x11, 0x11, 0x47, -/* 0000FAC0 */ 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x04, 0x09, 0x1E, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, -/* 0000FAD0 */ 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, 0x12, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, -/* 0000FAE0 */ 0x0F, 0x1F, 0x02, 0x11, 0x11, 0x47, 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0D, 0x11, 0x09, -/* 0000FAF0 */ 0xAD, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x11, 0x07, 0x04, 0x00, 0x5C, -/* 0000FB00 */ 0x00, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x12, 0x5C, 0x01, 0x12, 0x5C, -/* 0000FB10 */ 0x02, 0x0D, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0x11, 0x11, 0x0C, 0x03, 0x00, 0x11, 0x06, 0x09, 0x7E, -/* 0000FB20 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, 0x12, 0x03, 0x07, -/* 0000FB30 */ 0x04, 0x00, 0x5C, 0x00, 0x12, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x07, -/* 0000FB40 */ 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x01, 0x13, 0x8E, -/* 0000FB50 */ 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, -/* 0000FB60 */ 0x01, 0x0B, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x02, 0x13, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000FB70 */ 0x00, 0x00, 0x13, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x00, -/* 0000FB80 */ 0x00, 0x00, 0x14, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0x13, 0x13, -/* 0000FB90 */ 0x2F, 0x13, 0x07, 0x13, 0x2F, 0x13, 0x13, 0x09, 0x5C, 0x03, 0x13, 0x1F, 0x04, 0xFF, 0x11, 0x47, -/* 0000FBA0 */ 0x00, 0x0F, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000FBB0 */ 0x00, 0xFE, 0x5A, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, 0x02, 0x00, 0xFE, 0x5F, -/* 0000FBC0 */ 0x3A, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x28, 0x00, 0x0A, 0x00, 0x27, 0x00, 0x08, 0x00, -/* 0000FBD0 */ 0x29, 0x00, 0x1E, 0x00, 0x45, 0x00, 0x08, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x3D, 0x00, 0x08, 0x00, -/* 0000FBE0 */ 0x28, 0x00, 0x1E, 0x00, 0x3D, 0x00, 0x39, 0x00, 0x6B, 0x00, 0x7E, 0x00, 0xA6, 0x00, 0x06, 0x00, -/* 0000FBF0 */ 0x21, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x3F, 0xFC, 0x02, 0x04, 0x4F, 0xFC, 0x0F, 0xFF, 0xFF, -/* 0000FC00 */ 0xFF, 0xFF, 0xFF, 0xFE, 0x4B, 0x01, 0x14, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x13, 0x00, 0xFE, 0x06, -/* 0000FC10 */ 0x35, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x06, 0x35, 0xFE, 0xE0, 0x04, 0xFE, -/* 0000FC20 */ 0xE0, 0x04, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, 0x01, 0x01, 0x06, 0x06, 0x06, 0x06, 0x01, 0xFF, -/* 0000FC30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, -/* 0000FC40 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000FC50 */ 0x02, 0x01, 0xFE, 0x52, 0x03, 0x02, 0x01, 0xFE, 0x53, 0x03, 0x02, 0x01, 0xFE, 0x54, 0x03, 0x02, -/* 0000FC60 */ 0x01, 0xFE, 0x55, 0x03, 0x02, 0x01, 0xFE, 0x56, 0x03, 0x02, 0x01, 0xFE, 0x57, 0x03, 0x03, 0x04, -/* 0000FC70 */ 0x88, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000FC80 */ 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xD4, 0x00, -/* 0000FC90 */ 0x00, 0x00, 0x00, 0x0D, 0x7A, 0x0D, 0x0C, 0x00, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x01, 0x00, -/* 0000FCA0 */ 0x00, 0x00, 0x0D, 0x7A, 0x0D, 0x0C, 0x01, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x02, 0x00, 0x00, -/* 0000FCB0 */ 0x00, 0x0D, 0x7A, 0x0D, 0x0C, 0x02, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x03, 0x00, 0x00, 0x00, -/* 0000FCC0 */ 0x0D, 0x7A, 0x0D, 0x0C, 0x03, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x0D, -/* 0000FCD0 */ 0x7A, 0x0D, 0x0C, 0x04, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x05, 0x00, 0x00, 0x00, 0x0D, 0x7A, -/* 0000FCE0 */ 0x0D, 0x0C, 0x05, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x08, 0x1F, 0x03, -/* 0000FCF0 */ 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000FD00 */ 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x5B, 0x02, 0x00, 0x00, -/* 0000FD10 */ 0x5C, 0x02, 0x00, 0x00, 0x5A, 0x02, 0x00, 0x00, 0x5F, 0x02, 0x00, 0x00, 0x57, 0x03, 0x00, 0x00, -/* 0000FD20 */ 0x00, 0xFE, 0x52, 0x03, 0xFE, 0x5B, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x5A, 0x02, 0xFE, 0x5F, 0x02, -/* 0000FD30 */ 0xFE, 0x57, 0x03, 0x00, 0xFE, 0x1C, 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0xC9, 0x04, -/* 0000FD40 */ 0x00, 0x10, 0x01, 0x01, 0x00, 0x7D, 0x00, 0x01, 0x00, 0xEA, 0xFF, 0x00, 0x00, 0x57, 0xFF, 0x00, -/* 0000FD50 */ 0x00, 0x2C, 0xFE, 0x00, 0x00, 0x59, 0xFD, 0x00, 0x00, 0xBF, 0xFC, 0x03, 0x0C, 0x00, 0xFC, 0x07, -/* 0000FD60 */ 0xFE, 0x57, 0x03, 0xFE, 0x69, 0x01, 0x19, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x19, 0x00, 0xFE, 0x9A, -/* 0000FD70 */ 0x38, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x9A, 0x38, 0xFE, 0x35, 0x01, 0xFE, 0x35, -/* 0000FD80 */ 0x01, 0x01, 0x05, 0x04, 0x07, 0x05, 0x19, 0x17, 0x16, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FD90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FDA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x5A, 0x00, 0x04, -/* 0000FDB0 */ 0x08, 0x5E, 0xEA, 0x00, 0x0F, 0x03, 0x00, 0x04, 0x09, 0x51, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000FDC0 */ 0x0C, 0x00, 0x00, 0x00, 0x07, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000FDD0 */ 0x19, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x04, 0x5C, 0x03, 0x05, 0x1F, 0x04, -/* 0000FDE0 */ 0x07, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x06, 0x00, 0x47, 0x00, 0x03, 0x09, 0x1F, 0x00, 0x8E, -/* 0000FDF0 */ 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x07, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, -/* 0000FE00 */ 0x01, 0x04, 0x1F, 0x02, 0x07, 0x07, 0x47, 0x04, 0x07, 0x09, 0xA6, 0xFF, 0xA8, 0x00, 0x24, 0x00, -/* 0000FE10 */ 0x00, 0x00, 0x00, 0xFE, 0xEF, 0x38, 0x05, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x19, 0x00, 0x2E, -/* 0000FE20 */ 0x00, 0x54, 0x00, 0x06, 0x00, 0x37, 0x00, 0x1F, 0x00, 0x3B, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, -/* 0000FE30 */ 0x0F, 0xFC, 0x07, 0xFE, 0x56, 0x03, 0xFE, 0x60, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x18, -/* 0000FE40 */ 0x00, 0xFE, 0x83, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x83, 0x37, 0xFB, 0xFB, -/* 0000FE50 */ 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, -/* 0000FE60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, -/* 0000FE70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, -/* 0000FE80 */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xA6, 0x8E, -/* 0000FE90 */ 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, -/* 0000FEA0 */ 0x01, 0x06, 0x1F, 0x02, 0x0A, 0x0A, 0x47, 0x07, 0x0A, 0x47, 0x08, 0x03, 0x8E, 0x01, 0x00, 0x00, -/* 0000FEB0 */ 0x00, 0x27, 0x00, 0x00, 0x00, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x1F, -/* 0000FEC0 */ 0x02, 0x0A, 0x0A, 0x0F, 0x64, 0x00, 0x0A, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x26, -/* 0000FED0 */ 0x00, 0x00, 0x00, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0A, -/* 0000FEE0 */ 0x0A, 0x0F, 0x03, 0x00, 0x0A, 0x09, 0x43, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, -/* 0000FEF0 */ 0x00, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x47, 0x0C, 0x07, 0x8E, -/* 0000FF00 */ 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x01, 0x07, 0x03, 0x00, -/* 0000FF10 */ 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0x0D, 0x0D, 0x33, 0x0C, 0x0C, -/* 0000FF20 */ 0x0D, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0A, 0x0A, 0x47, 0x08, 0x0A, 0x47, 0x00, 0x08, 0x09, 0x02, -/* 0000FF30 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x17, 0x25, 0x00, 0xFE, 0xA2, 0x37, 0x06, 0x00, 0x00, -/* 0000FF40 */ 0x00, 0x00, 0x1A, 0x00, 0x29, 0x00, 0x03, 0x00, 0x19, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x43, 0x00, -/* 0000FF50 */ 0x49, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x55, -/* 0000FF60 */ 0x03, 0xFE, 0x5C, 0x01, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x17, 0x00, 0xFE, 0x0D, 0x37, 0xFF, -/* 0000FF70 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0D, 0x37, 0x5D, 0x5D, 0x01, 0x03, 0x03, 0x05, 0x03, -/* 0000FF80 */ 0x10, 0x0E, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FF90 */ 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FFA0 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x33, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, 0x05, 0x09, 0x1D, -/* 0000FFB0 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000FFC0 */ 0x02, 0x5C, 0x01, 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, -/* 0000FFD0 */ 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x2C, 0x37, -/* 0000FFE0 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x3D, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, -/* 0000FFF0 */ 0x07, 0xFE, 0x54, 0x03, 0xFE, 0x58, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x16, 0x00, 0xFE, -/* 00010000 */ 0x96, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x96, 0x36, 0x56, 0x56, 0x01, 0x03, -/* 00010010 */ 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x33, 0xA8, 0x05, 0x14, 0x03, 0x00, 0x03, -/* 00010040 */ 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, 0x47, 0x00, 0x05, 0x09, 0x1A, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 00010050 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0x1F, -/* 00010060 */ 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 00010070 */ 0xFE, 0xB5, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x36, 0x00, 0x00, 0xBF, 0xFC, 0x02, -/* 00010080 */ 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x53, 0x03, 0xFE, 0x54, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, -/* 00010090 */ 0x15, 0x00, 0xFE, 0x21, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x21, 0x36, 0x5C, -/* 000100A0 */ 0x5C, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000100B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000100C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x33, 0xA8, 0x05, 0x15, -/* 000100D0 */ 0x03, 0x00, 0x03, 0x05, 0x09, 0x1D, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, -/* 000100E0 */ 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, -/* 000100F0 */ 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00010100 */ 0x00, 0x00, 0x00, 0xFE, 0x40, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x3C, 0x00, 0x00, -/* 00010110 */ 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x52, 0x03, 0xFE, 0x4D, 0x01, 0x16, 0xFF, 0xA2, -/* 00010120 */ 0x41, 0xC1, 0x00, 0x14, 0x00, 0xFE, 0x48, 0x35, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 00010130 */ 0x48, 0x35, 0xC0, 0xC0, 0x01, 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x01, 0x01, 0x01, -/* 00010140 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010150 */ 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010160 */ 0x00, 0x00, 0x03, 0x04, 0x53, 0x14, 0x03, 0x00, 0x04, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x01, 0x00, -/* 00010170 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x6C, 0x06, 0x07, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 00010180 */ 0x07, 0x1F, 0x01, 0xFF, 0x06, 0xA8, 0x06, 0x15, 0x03, 0x00, 0x04, 0x06, 0x09, 0x1D, 0x00, 0x8E, -/* 00010190 */ 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, -/* 000101A0 */ 0x01, 0x04, 0x1F, 0x02, 0x06, 0x06, 0x47, 0x00, 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, -/* 000101B0 */ 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0x00, 0xFE, 0x67, -/* 000101C0 */ 0x35, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x26, 0x00, 0x18, 0x00, 0x3E, 0x00, 0x31, 0x00, -/* 000101D0 */ 0x3C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x8F, 0xFD, 0x07, 0xFE, 0x28, 0x03, 0xFE, 0x30, 0x01, -/* 000101E0 */ 0x20, 0xFF, 0xA0, 0x41, 0xC1, 0x00, 0x12, 0x00, 0xFE, 0x7F, 0x31, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 000101F0 */ 0x01, 0x01, 0xFE, 0x7F, 0x31, 0xFE, 0x70, 0x03, 0xFE, 0x70, 0x03, 0x01, 0x07, 0x05, 0x08, 0x06, -/* 00010200 */ 0x41, 0x41, 0x01, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, -/* 00010220 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, -/* 00010230 */ 0x00, 0x00, 0xFE, 0x29, 0x01, 0x4F, 0x05, 0x4F, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, -/* 00010240 */ 0x00, 0x00, 0x09, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0F, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 00010250 */ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x01, 0x01, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00010260 */ 0x39, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x96, 0x00, 0x8E, 0x01, -/* 00010270 */ 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x09, 0x0F, 0x17, 0x00, 0x09, 0x09, 0x00, -/* 00010280 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 00010290 */ 0x02, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x4B, -/* 000102A0 */ 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x09, 0x09, 0x54, 0x05, 0x09, 0x8E, 0x01, -/* 000102B0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 000102C0 */ 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x4B, -/* 000102D0 */ 0x0B, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x54, 0x06, 0x09, 0x0F, 0x03, 0x00, 0x06, 0x09, -/* 000102E0 */ 0x13, 0x00, 0x97, 0x09, 0x06, 0x03, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, -/* 000102F0 */ 0x00, 0x09, 0x09, 0x0C, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, -/* 00010300 */ 0x05, 0x09, 0x47, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, -/* 00010310 */ 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, -/* 00010320 */ 0x00, 0x0B, 0x4B, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x0B, 0x0B, 0x5C, 0x01, -/* 00010330 */ 0x0B, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x97, 0x09, 0x09, 0x04, 0x01, -/* 00010340 */ 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00010350 */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 00010360 */ 0xFE, 0x37, 0x02, 0x00, 0x09, 0xFE, 0x51, 0x03, 0x00, 0xFE, 0x95, 0x31, 0x0D, 0x04, 0x00, 0x00, -/* 00010370 */ 0x00, 0x13, 0x00, 0x2B, 0x00, 0x0F, 0x00, 0x33, 0x00, 0x13, 0x00, 0x26, 0x00, 0x13, 0x00, 0x29, -/* 00010380 */ 0x00, 0x14, 0x00, 0x33, 0x00, 0x19, 0x00, 0x2C, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x07, 0x00, 0x5B, -/* 00010390 */ 0x00, 0x13, 0x00, 0x49, 0x00, 0x0F, 0x00, 0xCB, 0x00, 0x47, 0x00, 0x6D, 0x00, 0x11, 0x00, 0x24, -/* 000103A0 */ 0x00, 0x00, 0xBF, 0xFC, 0x03, 0x0C, 0x0F, 0xFC, 0x07, 0xFE, 0x27, 0x03, 0xFE, 0x1E, 0x01, 0x19, -/* 000103B0 */ 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x11, 0x00, 0xFE, 0x5C, 0x2E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, -/* 000103C0 */ 0x05, 0xFE, 0x5C, 0x2E, 0xFE, 0x91, 0x02, 0xFE, 0x91, 0x02, 0x01, 0x0C, 0x06, 0x10, 0x06, 0x3E, -/* 000103D0 */ 0x33, 0x15, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000103E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000103F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x6C, 0xB7, 0x00, 0x02, 0x00, 0xFE, 0x50, -/* 00010400 */ 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xE0, 0xA8, 0x0D, 0xA8, -/* 00010410 */ 0x0E, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x10, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2C, 0x00, -/* 00010420 */ 0x00, 0x00, 0x11, 0x47, 0x10, 0x11, 0x09, 0x0D, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2B, 0x00, -/* 00010430 */ 0x00, 0x00, 0x11, 0x47, 0x10, 0x11, 0x47, 0x0A, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 00010440 */ 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x10, 0x10, -/* 00010450 */ 0x47, 0x0B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0x1F, 0x01, 0x10, 0x09, 0x47, 0x0C, 0x10, -/* 00010460 */ 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0B, 0x10, 0x09, 0x06, 0x00, 0x47, 0x10, 0x0B, 0x09, 0x03, 0x00, -/* 00010470 */ 0x47, 0x10, 0x04, 0x47, 0x0B, 0x10, 0x47, 0x0D, 0x04, 0xEA, 0x00, 0x12, 0x03, 0x00, 0x0D, 0x0B, -/* 00010480 */ 0x09, 0x41, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x10, 0x07, 0x05, 0x00, -/* 00010490 */ 0x5C, 0x00, 0x03, 0x97, 0x11, 0x06, 0x0D, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x08, -/* 000104A0 */ 0x5C, 0x04, 0x0C, 0x1F, 0x05, 0x10, 0x10, 0x47, 0x0E, 0x10, 0x61, 0x10, 0x0E, 0x00, 0xA8, 0x11, -/* 000104B0 */ 0x15, 0x03, 0x00, 0x10, 0x11, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0E, 0x09, 0x2D, 0x00, 0x28, 0x0D, -/* 000104C0 */ 0x0D, 0x09, 0xB5, 0xFF, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x10, 0x07, 0x05, -/* 000104D0 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0A, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x5C, -/* 000104E0 */ 0x04, 0x0C, 0x1F, 0x05, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 000104F0 */ 0x1F, 0x02, 0x00, 0xFE, 0xAB, 0x2E, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x58, 0x00, 0x1A, -/* 00010500 */ 0x00, 0x34, 0x00, 0x0D, 0x00, 0x32, 0x00, 0x16, 0x00, 0x39, 0x00, 0x05, 0x00, 0x0B, 0x00, 0x08, -/* 00010510 */ 0x00, 0x1F, 0x00, 0x27, 0x00, 0x69, 0x00, 0x0E, 0x00, 0x35, 0x00, 0x06, 0x00, 0x4F, 0xFF, 0x06, -/* 00010520 */ 0x00, 0xE2, 0x00, 0x27, 0x00, 0x51, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0xCF, 0xFD, 0x0F, 0xFE, -/* 00010530 */ 0x26, 0x03, 0xE6, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0E, 0x00, 0xFE, 0xB0, 0x24, 0x02, 0xFF, -/* 00010540 */ 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0xB0, 0x24, 0xFE, 0x91, 0x09, 0xFE, 0x91, 0x09, 0x03, -/* 00010550 */ 0x0E, 0x0B, 0x15, 0x05, 0x71, 0x6A, 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, -/* 00010560 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, 0xFF, 0xFF, -/* 00010570 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -/* 00010580 */ 0x02, 0x01, 0xFE, 0x46, 0x03, 0x02, 0x00, 0xFE, 0x48, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, -/* 00010590 */ 0x01, 0xFE, 0x4A, 0x03, 0x02, 0x01, 0xFE, 0x4B, 0x03, 0xFE, 0xE8, 0x01, 0x96, 0x03, 0x00, 0x00, -/* 000105A0 */ 0x00, 0x0B, 0x96, 0x04, 0x00, 0x00, 0x00, 0x0D, 0x4F, 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 000105B0 */ 0x00, 0x00, 0x00, 0x17, 0x6C, 0x16, 0x17, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x17, 0x92, 0x03, -/* 000105C0 */ 0x00, 0x00, 0x00, 0x18, 0x5C, 0x01, 0x18, 0x1F, 0x02, 0x16, 0x16, 0x47, 0x0F, 0x16, 0x14, 0x03, -/* 000105D0 */ 0x00, 0x0F, 0x02, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x16, -/* 000105E0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x92, 0x03, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x1F, -/* 000105F0 */ 0x02, 0x16, 0x16, 0x47, 0x0F, 0x16, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x2D, 0x00, 0x8E, 0x01, 0x00, -/* 00010600 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x00, -/* 00010610 */ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x00, 0x00, -/* 00010620 */ 0x00, 0x00, 0x17, 0x5C, 0x03, 0x17, 0x1F, 0x04, 0xFF, 0x16, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 00010630 */ 0x00, 0x00, 0x00, 0x17, 0x6C, 0x16, 0x17, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x92, 0x03, -/* 00010640 */ 0x00, 0x00, 0x00, 0x18, 0x5C, 0x01, 0x18, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x16, -/* 00010650 */ 0x16, 0x97, 0x16, 0x16, 0x04, 0x96, 0x03, 0x00, 0x00, 0x00, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00010660 */ 0x03, 0x92, 0x03, 0x00, 0x00, 0x00, 0x16, 0x5C, 0x01, 0x16, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x16, -/* 00010670 */ 0x0C, 0x47, 0x10, 0x16, 0x92, 0x04, 0x00, 0x00, 0x00, 0x16, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, -/* 00010680 */ 0x17, 0x09, 0x3F, 0x00, 0xCD, 0x16, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x16, 0x8E, 0x01, 0x00, -/* 00010690 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x00, -/* 000106A0 */ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x01, 0x00, -/* 000106B0 */ 0x00, 0x00, 0x17, 0x5C, 0x03, 0x17, 0x1F, 0x04, 0xFF, 0x16, 0x92, 0x02, 0x00, 0x00, 0x00, 0x16, -/* 000106C0 */ 0x47, 0x0F, 0x16, 0x54, 0x11, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x78, 0x00, 0x0F, 0x03, 0x00, -/* 000106D0 */ 0x0F, 0x09, 0x3D, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x16, 0x07, 0x02, -/* 000106E0 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x16, 0x16, 0x11, 0x03, 0x00, 0x16, 0x05, -/* 000106F0 */ 0x09, 0x1E, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x0F, -/* 00010700 */ 0x03, 0x00, 0x16, 0x09, 0x07, 0x00, 0x2F, 0x10, 0x10, 0x06, 0x09, 0x04, 0x00, 0x2F, 0x10, 0x10, -/* 00010710 */ 0x07, 0x47, 0x16, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x17, 0x07, 0x04, -/* 00010720 */ 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x18, 0x5C, 0x01, -/* 00010730 */ 0x18, 0x5C, 0x02, 0x0F, 0x5C, 0x03, 0x06, 0x1F, 0x04, 0x17, 0x17, 0x2F, 0x16, 0x16, 0x17, 0x47, -/* 00010740 */ 0x10, 0x16, 0x09, 0x05, 0x00, 0xA8, 0x16, 0x47, 0x10, 0x16, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, -/* 00010750 */ 0x00, 0x00, 0x00, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00010760 */ 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x7A, 0x10, 0x17, 0x02, 0x7A, 0x0F, 0x17, 0x03, 0x7A, -/* 00010770 */ 0x11, 0x17, 0x04, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x00, 0x16, 0x09, 0x02, 0x00, -/* 00010780 */ 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, -/* 00010790 */ 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x6D, 0x02, 0x00, 0x00, 0x00, -/* 000107A0 */ 0xFE, 0x2C, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x6D, 0x02, 0xFE, -/* 000107B0 */ 0x4C, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x4D, 0x03, 0x00, 0x0D, 0xFE, 0x4E, 0x03, 0x00, 0xFE, 0xF4, -/* 000107C0 */ 0x24, 0x15, 0x0E, 0x00, 0x00, 0x00, 0x24, 0x00, 0x36, 0x00, 0x08, 0x00, 0x81, 0x00, 0x20, 0x00, -/* 000107D0 */ 0x3A, 0x00, 0x07, 0x00, 0x1B, 0x00, 0x2D, 0x00, 0x53, 0x02, 0x31, 0x00, 0x49, 0x00, 0x19, 0x00, -/* 000107E0 */ 0x37, 0x00, 0x10, 0x00, 0x50, 0x00, 0x09, 0x00, 0x1F, 0x00, 0x2D, 0x00, 0xB8, 0x01, 0x09, 0x00, -/* 000107F0 */ 0xF9, 0x00, 0x03, 0x00, 0x29, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x3E, 0x00, 0x13, 0x00, -/* 00010800 */ 0x2E, 0x00, 0x07, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x40, 0x00, 0x34, 0x00, 0x5C, 0x00, 0x05, 0x00, -/* 00010810 */ 0x29, 0x00, 0x38, 0x00, 0x99, 0x00, 0x00, 0x3F, 0x09, 0x01, 0x00, 0x1F, 0x08, 0x01, 0x00, 0xBF, -/* 00010820 */ 0xFC, 0x02, 0x04, 0x8F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x3D, 0xFF, 0xA2, 0x41, -/* 00010830 */ 0xD1, 0x00, 0x10, 0x00, 0xFE, 0x73, 0x29, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x73, -/* 00010840 */ 0x29, 0xFE, 0x77, 0x01, 0xFE, 0x77, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, 0x02, 0x06, -/* 00010850 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010870 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x01, 0xFF, 0xFF, 0xFF, -/* 00010880 */ 0xFF, 0x99, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, -/* 00010890 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0x1F, -/* 000108A0 */ 0x03, 0x09, 0x09, 0x47, 0x06, 0x09, 0x97, 0x09, 0x06, 0x02, 0x47, 0x07, 0x09, 0x8E, 0x02, 0x00, -/* 000108B0 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, 0x00, -/* 000108C0 */ 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x0A, 0x5C, 0x01, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x04, -/* 000108D0 */ 0x00, 0x00, 0x00, 0x0A, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x07, 0x1F, 0x04, 0x09, 0x09, 0x15, 0x03, -/* 000108E0 */ 0x00, 0x09, 0x04, 0x09, 0x31, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, -/* 000108F0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0A, -/* 00010900 */ 0x5C, 0x01, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x5C, 0x02, 0x0A, -/* 00010910 */ 0x5C, 0x03, 0x05, 0x1F, 0x04, 0xFF, 0x09, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, -/* 00010920 */ 0x00, 0x0E, 0xFE, 0x4F, 0x03, 0x00, 0xFE, 0x97, 0x29, 0x05, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, -/* 00010930 */ 0x7A, 0x00, 0x07, 0x00, 0x24, 0x00, 0x39, 0x00, 0x5F, 0x00, 0x33, 0x00, 0x55, 0x00, 0x00, 0xBF, -/* 00010940 */ 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x3C, 0xFF, 0xA2, 0x41, -/* 00010950 */ 0xD1, 0x00, 0x0F, 0x00, 0xFE, 0x30, 0x26, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x30, -/* 00010960 */ 0x26, 0x7D, 0x7D, 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010970 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010980 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, -/* 00010990 */ 0x46, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x04, 0x46, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 000109A0 */ 0x00, 0x00, 0x07, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, -/* 000109B0 */ 0x00, 0x00, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, -/* 000109C0 */ 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, 0x5C, 0x04, 0x03, 0x1F, 0x05, 0x07, -/* 000109D0 */ 0x07, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 000109E0 */ 0x00, 0x00, 0xFE, 0x54, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x58, 0x00, 0x00, 0x3F, -/* 000109F0 */ 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0x25, 0x03, 0xCD, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, -/* 00010A00 */ 0x0C, 0x00, 0xFE, 0x7F, 0x20, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x7F, 0x20, -/* 00010A10 */ 0xFE, 0x11, 0x04, 0xFE, 0x11, 0x04, 0x07, 0x05, 0x09, 0x04, 0x2A, 0x29, 0x01, 0x03, 0x03, 0x03, -/* 00010A20 */ 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010A30 */ 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010A40 */ 0xFF, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0x9D, 0x4F, -/* 00010A50 */ 0x06, 0x4F, 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x09, 0x0F, -/* 00010A60 */ 0x17, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, -/* 00010A70 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 00010A80 */ 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, -/* 00010A90 */ 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0B, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, -/* 00010AA0 */ 0x1F, 0x03, 0x09, 0x09, 0x54, 0x06, 0x09, 0x0F, 0x08, 0x00, 0x06, 0x09, 0x00, 0x00, 0xA8, 0x00, -/* 00010AB0 */ 0x09, 0x37, 0x00, 0x97, 0x0B, 0x06, 0x03, 0x6C, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00010AC0 */ 0x0B, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x0A, 0x0A, 0x6C, 0x09, 0x0A, 0x02, 0x07, 0x02, 0x00, 0x5C, -/* 00010AD0 */ 0x00, 0x0A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x09, 0x09, 0x54, -/* 00010AE0 */ 0x07, 0x09, 0x47, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x37, -/* 00010AF0 */ 0x02, 0xFE, 0x75, 0x01, 0xAF, 0x00, 0xFE, 0x9B, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0x13, 0x00, -/* 00010B00 */ 0x24, 0x00, 0x14, 0x00, 0x2B, 0x00, 0x2D, 0x00, 0x4B, 0x00, 0x07, 0x00, 0x1A, 0x00, 0x05, 0x00, -/* 00010B10 */ 0x5C, 0x02, 0x2F, 0x00, 0xCD, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0x1F, 0x0B, 0x01, 0x00, 0xBF, -/* 00010B20 */ 0xDC, 0x02, 0x00, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x36, 0xFF, 0xA2, 0x41, -/* 00010B30 */ 0xD0, 0x00, 0x0D, 0xFE, 0x01, 0x10, 0xFE, 0xD9, 0x23, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00010B40 */ 0xFE, 0xD9, 0x23, 0x0A, 0x0A, 0x01, 0x02, 0x02, 0x03, 0x0A, 0x0A, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010B50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010B60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00010B70 */ 0x00, 0x17, 0xAC, 0x03, 0x0F, 0x02, 0x00, 0x02, 0xAB, 0x03, 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x03, -/* 00010B80 */ 0xAB, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xE0, 0x23, 0x02, -/* 00010B90 */ 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFD, 0x07, -/* 00010BA0 */ 0xFE, 0x47, 0x03, 0xB6, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0B, 0x00, 0xFE, 0xEC, 0x1B, 0xFF, -/* 00010BB0 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xEC, 0x1B, 0xFE, 0x73, 0x04, 0xFE, 0x73, 0x04, 0x01, -/* 00010BC0 */ 0x09, 0x09, 0x0D, 0x04, 0x58, 0x4C, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0xFF, 0xFF, 0xFF, -/* 00010BD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, -/* 00010BE0 */ 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, -/* 00010BF0 */ 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, -/* 00010C00 */ 0x01, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x58, 0x01, 0x4F, 0x0A, 0x4F, 0x0B, 0x8E, 0x01, 0x00, 0x00, -/* 00010C10 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x61, 0x0F, 0x0F, 0x00, 0x6C, 0x0E, 0x0F, 0x01, 0x07, 0x02, -/* 00010C20 */ 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x0A, 0x0E, 0xA8, 0x0E, -/* 00010C30 */ 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0x05, 0x01, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00010C40 */ 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, -/* 00010C50 */ 0x02, 0x0E, 0x0E, 0x47, 0x0A, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x9B, 0x00, 0x8E, 0x01, -/* 00010C60 */ 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0E, 0x4B, 0x0E, 0x0F, 0x17, 0x00, 0x0E, 0x09, 0x00, -/* 00010C70 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 00010C80 */ 0x03, 0x1F, 0x01, 0xFF, 0x0E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x6C, -/* 00010C90 */ 0x0E, 0x0F, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x00, 0x00, -/* 00010CA0 */ 0x00, 0x42, 0x00, 0x00, 0x00, 0x10, 0x4B, 0x10, 0x5C, 0x02, 0x10, 0x1F, 0x03, 0x0E, 0x0E, 0x47, -/* 00010CB0 */ 0x0B, 0x0E, 0x97, 0x0E, 0x0B, 0x04, 0x97, 0x0F, 0x0B, 0x05, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x0E, -/* 00010CC0 */ 0x00, 0x97, 0x10, 0x0B, 0x05, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, 0x00, 0x47, -/* 00010CD0 */ 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x97, 0x0F, 0x0B, 0x08, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x0E, -/* 00010CE0 */ 0x00, 0x97, 0x10, 0x0B, 0x08, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, 0x00, 0x47, -/* 00010CF0 */ 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x47, 0x0A, 0x0E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00010D00 */ 0x00, 0x00, 0x0F, 0x61, 0x0F, 0x0F, 0x00, 0x6C, 0x0E, 0x0F, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00010D10 */ 0x0F, 0x5C, 0x01, 0x09, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0A, 0x10, 0x09, 0x12, 0x00, 0x8E, 0x01, -/* 00010D20 */ 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, -/* 00010D30 */ 0x47, 0x10, 0x0A, 0x5C, 0x02, 0x10, 0x1F, 0x03, 0xFF, 0x0E, 0x09, 0x19, 0x00, 0x8E, 0x01, 0x00, -/* 00010D40 */ 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0E, 0x4B, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0x05, -/* 00010D50 */ 0x00, 0xA8, 0x0E, 0x47, 0x0A, 0x0E, 0x47, 0x00, 0x0A, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00010D60 */ 0x00, 0x00, 0xFE, 0x04, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0x29, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0xB8, -/* 00010D70 */ 0x01, 0x00, 0xFE, 0x16, 0x1C, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x22, 0x00, 0x53, 0x00, 0x0A, 0x00, -/* 00010D80 */ 0x30, 0x00, 0x1E, 0x00, 0x51, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x13, 0x00, 0x2D, 0x00, 0x14, 0x00, -/* 00010D90 */ 0x3A, 0x00, 0x2D, 0x00, 0xB1, 0x00, 0x47, 0x00, 0x34, 0x01, 0x44, 0x00, 0x80, 0x00, 0x14, 0x00, -/* 00010DA0 */ 0x30, 0x00, 0x05, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x1B, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, -/* 00010DB0 */ 0xFD, 0x07, 0xFE, 0x45, 0x03, 0x9B, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0A, 0x00, 0xFE, 0x46, -/* 00010DC0 */ 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x46, 0x17, 0xFE, 0x86, 0x04, 0xFE, 0x86, -/* 00010DD0 */ 0x04, 0x01, 0x0A, 0x09, 0x0E, 0x04, 0x61, 0x54, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0xFF, -/* 00010DE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, -/* 00010DF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x01, 0x01, -/* 00010E00 */ 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0x02, 0x01, 0xFE, -/* 00010E10 */ 0xF6, 0x02, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x77, 0x01, 0x4F, 0x0C, 0x8E, 0x01, 0x00, 0x00, -/* 00010E20 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x61, 0x10, 0x10, 0x00, 0x6C, 0x0F, 0x10, 0x01, 0x07, 0x02, -/* 00010E30 */ 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0B, 0x0F, 0xA8, 0x0F, -/* 00010E40 */ 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x05, 0x01, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00010E50 */ 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x1F, -/* 00010E60 */ 0x02, 0x0F, 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x9B, 0x00, 0x8E, 0x01, -/* 00010E70 */ 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x0F, 0x17, 0x00, 0x0F, 0x09, 0x00, -/* 00010E80 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 00010E90 */ 0x03, 0x1F, 0x01, 0xFF, 0x0F, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, -/* 00010EA0 */ 0x0F, 0x10, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x00, 0x00, -/* 00010EB0 */ 0x00, 0x42, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x1F, 0x03, 0x0F, 0x0F, 0x47, -/* 00010EC0 */ 0x0C, 0x0F, 0x97, 0x0F, 0x0C, 0x04, 0x97, 0x10, 0x0C, 0x05, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x0E, -/* 00010ED0 */ 0x00, 0x97, 0x11, 0x0C, 0x05, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, -/* 00010EE0 */ 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x97, 0x10, 0x0C, 0x08, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x0E, -/* 00010EF0 */ 0x00, 0x97, 0x11, 0x0C, 0x08, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, -/* 00010F00 */ 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x47, 0x0B, 0x0F, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00010F10 */ 0x00, 0x00, 0x10, 0x61, 0x10, 0x10, 0x00, 0x6C, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00010F20 */ 0x10, 0x5C, 0x01, 0x09, 0xA8, 0x11, 0x14, 0x03, 0x00, 0x0B, 0x11, 0x09, 0x12, 0x00, 0x8E, 0x01, -/* 00010F30 */ 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x12, 0x4B, 0x12, 0x47, 0x11, 0x12, 0x09, 0x03, 0x00, -/* 00010F40 */ 0x47, 0x11, 0x0B, 0x5C, 0x02, 0x11, 0x1F, 0x03, 0xFF, 0x0F, 0x09, 0x19, 0x00, 0x8E, 0x01, 0x00, -/* 00010F50 */ 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x05, -/* 00010F60 */ 0x00, 0xA8, 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0A, 0x09, 0x09, 0x09, 0x00, 0x47, 0x00, -/* 00010F70 */ 0x0B, 0x09, 0x1B, 0x00, 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x0B, 0x09, 0x08, 0x00, 0xA8, -/* 00010F80 */ 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 00010F90 */ 0x00, 0x00, 0x00, 0xFE, 0x05, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0x2A, 0x02, 0xFE, 0x37, 0x02, 0xFE, -/* 00010FA0 */ 0xB8, 0x01, 0x00, 0xFE, 0x71, 0x17, 0x11, 0x02, 0x00, 0x00, 0x00, 0x22, 0x00, 0x46, 0x00, 0x0A, -/* 00010FB0 */ 0x00, 0x30, 0x00, 0x1E, 0x00, 0x44, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x13, 0x00, 0x2D, 0x00, 0x14, -/* 00010FC0 */ 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x52, 0x00, 0x47, 0x00, 0x0C, 0x01, 0x44, 0x00, 0x73, 0x00, 0x14, -/* 00010FD0 */ 0x00, 0x30, 0x00, 0x05, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x26, 0x00, 0x08, -/* 00010FE0 */ 0x00, 0x34, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x25, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, -/* 00010FF0 */ 0x0F, 0xFC, 0x07, 0xFE, 0x24, 0x03, 0x97, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x09, 0x00, 0xFE, -/* 00011000 */ 0xD3, 0x16, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xD3, 0x16, 0x51, 0x51, 0x01, 0x05, -/* 00011010 */ 0x02, 0x05, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x25, 0x8E, 0x01, 0x00, -/* 00011040 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x6C, 0x05, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00011050 */ 0x06, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 00011060 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0xA5, 0x02, 0x00, 0xFE, 0xF0, 0x16, 0x02, 0x00, 0x00, 0x00, 0x00, -/* 00011070 */ 0x23, 0x00, 0x33, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x00, 0x0F, 0xFC, 0x07, 0xFE, 0x23, 0x03, 0x91, -/* 00011080 */ 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x08, 0x00, 0xFE, 0x39, 0x16, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 00011090 */ 0x02, 0x02, 0xFE, 0x39, 0x16, 0x7B, 0x7B, 0x41, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, 0x01, 0x01, -/* 000110A0 */ 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000110B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000110C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xF9, 0x7F, 0xFD, 0xDF, 0xC1, -/* 000110D0 */ 0x05, 0x00, 0x00, 0x40, 0xFE, 0x7F, 0xFD, 0xDF, 0xC1, 0x1E, 0x61, 0x05, 0x04, 0x00, 0x14, 0x0F, -/* 000110E0 */ 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0x61, 0x05, 0x04, 0x00, 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, -/* 000110F0 */ 0x02, 0x00, 0x23, 0x04, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2E, 0x01, 0x00, 0xFE, 0x51, -/* 00011100 */ 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x4A, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0xBF, -/* 00011110 */ 0xFC, 0x03, 0x08, 0x00, 0xFC, 0x07, 0xFE, 0x22, 0x03, 0x86, 0x1B, 0xFF, 0xA2, 0x41, 0xC1, 0x00, -/* 00011120 */ 0x07, 0x00, 0xFE, 0xE0, 0x14, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xE0, 0x14, 0xD5, -/* 00011130 */ 0xD5, 0x41, 0x06, 0x05, 0x09, 0x03, 0x13, 0x11, 0x0E, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011150 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x05, -/* 00011160 */ 0x34, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x38, 0x4F, 0x08, -/* 00011170 */ 0x47, 0x08, 0x02, 0xEA, 0x00, 0x12, 0x03, 0x00, 0x08, 0x06, 0x09, 0x25, 0x00, 0xBA, 0x09, 0x08, -/* 00011180 */ 0x05, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x14, 0x00, 0x47, 0x09, 0x07, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00011190 */ 0x03, 0x97, 0x0A, 0x05, 0x08, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0xFF, 0x09, 0x28, 0x08, 0x08, 0x09, -/* 000111A0 */ 0xD1, 0xFF, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x15, 0x06, 0x02, 0x00, 0x00, -/* 000111B0 */ 0x00, 0x05, 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, 0x00, 0x0B, 0x00, 0x26, 0x00, 0x14, 0x00, 0x2E, -/* 000111C0 */ 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x35, 0x03, -/* 000111D0 */ 0x79, 0x22, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x06, 0x00, 0xFE, 0x57, 0x13, 0xFF, 0x00, 0x10, 0x01, -/* 000111E0 */ 0x00, 0x02, 0x02, 0xFE, 0x57, 0x13, 0xFE, 0x6B, 0x01, 0xFE, 0x6B, 0x01, 0x01, 0x08, 0x04, 0x08, -/* 000111F0 */ 0x04, 0x2A, 0x27, 0x01, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011200 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, -/* 00011210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x9E, 0x4F, 0x05, 0x4F, 0x06, 0x8E, 0x01, -/* 00011220 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, -/* 00011230 */ 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x09, 0x09, 0x47, 0x05, 0x09, 0x14, 0x03, 0x00, 0x05, -/* 00011240 */ 0x02, 0x09, 0x6A, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x09, -/* 00011250 */ 0x0F, 0x17, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -/* 00011260 */ 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00011270 */ 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, -/* 00011280 */ 0x01, 0x04, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0B, 0x4B, 0x0B, 0x5C, 0x02, -/* 00011290 */ 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x47, 0x06, 0x09, 0xAC, 0x09, 0x0F, 0x02, 0x00, 0x06, 0xAB, 0x09, -/* 000112A0 */ 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x09, 0xAB, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, -/* 000112B0 */ 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x26, 0x02, 0xFE, 0x37, 0x02, -/* 000112C0 */ 0x00, 0xFE, 0x74, 0x13, 0x08, 0x04, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x40, 0x00, 0x08, 0x00, 0x23, -/* 000112D0 */ 0x00, 0x13, 0x00, 0x24, 0x00, 0x14, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x16, 0x00, 0x2D, -/* 000112E0 */ 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x34, 0x03, -/* 000112F0 */ 0x6C, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x05, 0x00, 0xFE, 0x48, 0x11, 0xFF, 0x00, 0x10, 0x01, -/* 00011300 */ 0x00, 0x03, 0x03, 0xFE, 0x48, 0x11, 0xFE, 0xEA, 0x01, 0xFE, 0xEA, 0x01, 0x41, 0x06, 0x05, 0x09, -/* 00011310 */ 0x04, 0x14, 0x12, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011320 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011330 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, -/* 00011340 */ 0x02, 0x00, 0xFE, 0x44, 0x03, 0x45, 0x4F, 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00011350 */ 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x5C, -/* 00011360 */ 0x02, 0x06, 0x1F, 0x03, 0x09, 0x09, 0x47, 0x07, 0x09, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x16, -/* 00011370 */ 0x00, 0x76, 0x03, 0x05, 0x01, 0x47, 0x09, 0x05, 0xCD, 0x0A, 0x02, 0xA1, 0x00, 0x04, 0x0A, 0xA1, -/* 00011380 */ 0x01, 0x03, 0x0A, 0x76, 0x0A, 0x09, 0x02, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2F, 0x02, -/* 00011390 */ 0xFE, 0x12, 0x02, 0xFE, 0x25, 0x02, 0x00, 0xFE, 0x77, 0x11, 0x05, 0x02, 0x00, 0x00, 0x00, 0x21, -/* 000113A0 */ 0x00, 0x4F, 0x00, 0x08, 0x00, 0x71, 0x00, 0x04, 0x00, 0x33, 0x00, 0x14, 0x00, 0xC7, 0x00, 0x00, -/* 000113B0 */ 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x33, 0x03, 0x63, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, -/* 000113C0 */ 0x00, 0x04, 0x00, 0xFE, 0x05, 0x10, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x05, 0x10, -/* 000113D0 */ 0xFE, 0x21, 0x01, 0xFE, 0x21, 0x01, 0x41, 0x05, 0x04, 0x07, 0x03, 0x0E, 0x0D, 0x01, 0x01, 0x02, -/* 000113E0 */ 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000113F0 */ 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011400 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x30, 0x4F, 0x05, 0x8E, 0x01, 0x00, -/* 00011410 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x6C, 0x07, 0x08, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00011420 */ 0x08, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x07, 0x07, 0x47, 0x05, 0x07, 0x14, 0x03, 0x00, 0x05, 0x02, -/* 00011430 */ 0x09, 0x04, 0x00, 0x76, 0x03, 0x04, 0x01, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2E, 0x02, -/* 00011440 */ 0xFE, 0x12, 0x02, 0x00, 0xFE, 0x27, 0x10, 0x04, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x3F, 0x00, -/* 00011450 */ 0x08, 0x00, 0x71, 0x00, 0x06, 0x00, 0x4E, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, -/* 00011460 */ 0xFE, 0x32, 0x03, 0x52, 0x1D, 0xFF, 0xA0, 0x41, 0xC1, 0x00, 0x03, 0x00, 0xFE, 0x1D, 0x0E, 0xFF, -/* 00011470 */ 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x1D, 0x0E, 0xFE, 0xC9, 0x01, 0xFE, 0xC9, 0x01, 0x01, -/* 00011480 */ 0x04, 0x03, 0x05, 0x02, 0x1D, 0x1D, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011490 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000114A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 000114B0 */ 0x43, 0x03, 0x89, 0x4F, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x05, 0x4B, -/* 000114C0 */ 0x05, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x24, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 000114D0 */ 0x00, 0x05, 0x61, 0x05, 0x05, 0x00, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x0F, 0x00, 0x8E, 0x01, 0x00, -/* 000114E0 */ 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x4E, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 000114F0 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x6C, 0x05, 0x06, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x06, -/* 00011500 */ 0x1F, 0x01, 0x05, 0x05, 0x54, 0x03, 0x05, 0x0F, 0x12, 0x00, 0x03, 0x09, 0x00, 0x00, 0x01, 0x32, -/* 00011510 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x02, 0x09, 0x0C, 0x00, 0x01, 0x32, 0x01, -/* 00011520 */ 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, -/* 00011530 */ 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x03, -/* 00011540 */ 0x03, 0xFE, 0x2B, 0x02, 0x00, 0xFE, 0x33, 0x0E, 0x08, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x39, -/* 00011550 */ 0x00, 0x0F, 0x00, 0x2B, 0x00, 0x1B, 0x00, 0x34, 0x00, 0x07, 0x00, 0x9C, 0x00, 0x0F, 0x00, 0x35, -/* 00011560 */ 0x00, 0x0C, 0x00, 0x2D, 0x00, 0x11, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, -/* 00011570 */ 0x07, 0xFE, 0x17, 0x03, 0x3B, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x02, 0x00, 0xFE, 0xC9, 0x09, -/* 00011580 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xC9, 0x09, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, -/* 00011590 */ 0x09, 0x10, 0x10, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000115A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000115B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x3B, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1A, 0x00, -/* 000115C0 */ 0x00, 0x00, 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8E, -/* 000115D0 */ 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, -/* 000115E0 */ 0x01, 0x06, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x09, 0x09, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, -/* 000115F0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xF4, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x39, -/* 00011600 */ 0x00, 0x46, 0x00, 0x00}; +/* 00003050 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00003060 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, +/* 00003070 */ 0x31, 0x00, 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, +/* 00003080 */ 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, +/* 00003090 */ 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, +/* 000030A0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, +/* 000030B0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, +/* 000030C0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, +/* 000030D0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000030E0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, +/* 000030F0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, +/* 00003100 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, +/* 00003110 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, +/* 00003120 */ 0x2F, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2F, 0x00, +/* 00003130 */ 0x73, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2F, 0x00, 0x6D, 0x00, +/* 00003140 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00003150 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00003160 */ 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, +/* 00003170 */ 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00003180 */ 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, +/* 00003190 */ 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, +/* 000031A0 */ 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 000031B0 */ 0x72, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 000031C0 */ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, +/* 000031D0 */ 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, +/* 000031E0 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, +/* 000031F0 */ 0x6B, 0x00, 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, +/* 00003200 */ 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00003210 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, +/* 00003220 */ 0x77, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, +/* 00003230 */ 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00003240 */ 0x20, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, +/* 00003250 */ 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, +/* 00003260 */ 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00003270 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00003280 */ 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, +/* 00003290 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, +/* 000032A0 */ 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 000032B0 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 000032C0 */ 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7B, 0x00, +/* 000032D0 */ 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x5B, 0x00, 0x61, 0x00, +/* 000032E0 */ 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 000032F0 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, +/* 00003300 */ 0x5C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, +/* 00003310 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, +/* 00003320 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, +/* 00003330 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00003340 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, +/* 00003350 */ 0x72, 0x00, 0x31, 0x00, 0x32, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00003360 */ 0x61, 0x00, 0x74, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, +/* 00003370 */ 0x72, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, +/* 00003380 */ 0x31, 0x00, 0x32, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, +/* 00003390 */ 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x48, 0x00, 0x6F, 0x00, +/* 000033A0 */ 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, +/* 000033B0 */ 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x76, 0x00, +/* 000033C0 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000033D0 */ 0x65, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 000033E0 */ 0x31, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 000033F0 */ 0x32, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 00003400 */ 0x6C, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00003410 */ 0x5F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00003420 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, +/* 00003430 */ 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, +/* 00003440 */ 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x5F, 0x00, +/* 00003450 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00003460 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00003470 */ 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, +/* 00003480 */ 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00003490 */ 0x74, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 000034A0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 000034B0 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x65, 0x00, 0x6E, 0x00, +/* 000034C0 */ 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 000034D0 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 000034E0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, +/* 000034F0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 00003500 */ 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00003510 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00003520 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, +/* 00003530 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 00003540 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, +/* 00003550 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00003560 */ 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, +/* 00003570 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x00, 0x00, +/* 00003580 */ 0xFE, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, +/* 00003590 */ 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x8F, +/* 000035A0 */ 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x5B, +/* 000035B0 */ 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xE8, +/* 000035C0 */ 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x63, +/* 000035D0 */ 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xFB, +/* 000035E0 */ 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x5E, 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x70, +/* 000035F0 */ 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xDA, +/* 00003600 */ 0x04, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x79, +/* 00003610 */ 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0xBD, 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0x01, +/* 00003620 */ 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5C, +/* 00003630 */ 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xCD, +/* 00003640 */ 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x50, +/* 00003650 */ 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x53, +/* 00003660 */ 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0xAA, +/* 00003670 */ 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0x36, 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3E, +/* 00003680 */ 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0xD6, 0x0A, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x62, +/* 00003690 */ 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0xAF, 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0x33, +/* 000036A0 */ 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x82, 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0x2E, +/* 000036B0 */ 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x63, 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0xA2, +/* 000036C0 */ 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDB, 0x0D, 0x00, 0x00, 0x46, 0x0E, 0x00, 0x00, 0x77, +/* 000036D0 */ 0x0E, 0x00, 0x00, 0x87, 0x0E, 0x00, 0x00, 0xA6, 0x0E, 0x00, 0x00, 0xC9, 0x0E, 0x00, 0x00, 0xEC, +/* 000036E0 */ 0x0E, 0x00, 0x00, 0x0D, 0x0F, 0x00, 0x00, 0x2D, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x4A, +/* 000036F0 */ 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x00, 0x9B, 0x0F, 0x00, 0x00, 0xD0, +/* 00003700 */ 0x0F, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x33, +/* 00003710 */ 0x10, 0x00, 0x00, 0x4A, 0x10, 0x00, 0x00, 0x99, 0x10, 0x00, 0x00, 0xCB, 0x10, 0x00, 0x00, 0xEF, +/* 00003720 */ 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x26, 0x11, 0x00, 0x00, 0x30, 0x11, 0x00, 0x00, 0x31, +/* 00003730 */ 0x11, 0x00, 0x00, 0x51, 0x11, 0x00, 0x00, 0x58, 0x11, 0x00, 0x00, 0x59, 0x11, 0x00, 0x00, 0x9F, +/* 00003740 */ 0x11, 0x00, 0x00, 0xEE, 0x11, 0x00, 0x00, 0x0D, 0x12, 0x00, 0x00, 0x5B, 0x12, 0x00, 0x00, 0x8E, +/* 00003750 */ 0x12, 0x00, 0x00, 0xBE, 0x12, 0x00, 0x00, 0xFE, 0x12, 0x00, 0x00, 0x2A, 0x13, 0x00, 0x00, 0x38, +/* 00003760 */ 0x13, 0x00, 0x00, 0x42, 0x13, 0x00, 0x00, 0x5D, 0x13, 0x00, 0x00, 0x64, 0x13, 0x00, 0x00, 0x65, +/* 00003770 */ 0x13, 0x00, 0x00, 0x9C, 0x13, 0x00, 0x00, 0xDC, 0x13, 0x00, 0x00, 0xFB, 0x13, 0x00, 0x00, 0x1B, +/* 00003780 */ 0x14, 0x00, 0x00, 0x43, 0x14, 0x00, 0x00, 0x51, 0x14, 0x00, 0x00, 0x9B, 0x14, 0x00, 0x00, 0xB7, +/* 00003790 */ 0x14, 0x00, 0x00, 0xC8, 0x14, 0x00, 0x00, 0xE3, 0x14, 0x00, 0x00, 0xED, 0x14, 0x00, 0x00, 0xF4, +/* 000037A0 */ 0x14, 0x00, 0x00, 0xF5, 0x14, 0x00, 0x00, 0x2F, 0x15, 0x00, 0x00, 0x48, 0x15, 0x00, 0x00, 0x6B, +/* 000037B0 */ 0x15, 0x00, 0x00, 0x8D, 0x15, 0x00, 0x00, 0xB1, 0x15, 0x00, 0x00, 0xBF, 0x15, 0x00, 0x00, 0xD6, +/* 000037C0 */ 0x15, 0x00, 0x00, 0xE0, 0x15, 0x00, 0x00, 0xE7, 0x15, 0x00, 0x00, 0xE8, 0x15, 0x00, 0x00, 0x4D, +/* 000037D0 */ 0x16, 0x00, 0x00, 0x79, 0x16, 0x00, 0x00, 0xBF, 0x16, 0x00, 0x00, 0xD5, 0x16, 0x00, 0x00, 0xDF, +/* 000037E0 */ 0x16, 0x00, 0x00, 0xE6, 0x16, 0x00, 0x00, 0xE7, 0x16, 0x00, 0x00, 0x18, 0x17, 0x00, 0x00, 0x4F, +/* 000037F0 */ 0x17, 0x00, 0x00, 0x56, 0x17, 0x00, 0x00, 0x57, 0x17, 0x00, 0x00, 0x99, 0x17, 0x00, 0x00, 0xDF, +/* 00003800 */ 0x17, 0x00, 0x00, 0x0B, 0x18, 0x00, 0x00, 0x4F, 0x18, 0x00, 0x00, 0x7A, 0x18, 0x00, 0x00, 0xA3, +/* 00003810 */ 0x18, 0x00, 0x00, 0xCF, 0x18, 0x00, 0x00, 0xE1, 0x18, 0x00, 0x00, 0x33, 0x19, 0x00, 0x00, 0xA8, +/* 00003820 */ 0x19, 0x00, 0x00, 0xB6, 0x19, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x00, 0x43, 0x1A, 0x00, 0x00, 0xB3, +/* 00003830 */ 0x1A, 0x00, 0x00, 0xE6, 0x1A, 0x00, 0x00, 0x0E, 0x1B, 0x00, 0x00, 0x18, 0x1B, 0x00, 0x00, 0x19, +/* 00003840 */ 0x1B, 0x00, 0x00, 0x41, 0x1B, 0x00, 0x00, 0x64, 0x1B, 0x00, 0x00, 0x9B, 0x1B, 0x00, 0x00, 0xB9, +/* 00003850 */ 0x1B, 0x00, 0x00, 0xCA, 0x1B, 0x00, 0x00, 0xED, 0x1B, 0x00, 0x00, 0xF7, 0x1B, 0x00, 0x00, 0xFD, +/* 00003860 */ 0x1B, 0x00, 0x00, 0xFE, 0x1B, 0x00, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x91, 0x1C, 0x00, 0x00, 0xBD, +/* 00003870 */ 0x1C, 0x00, 0x00, 0x0E, 0x1D, 0x00, 0x00, 0x39, 0x1D, 0x00, 0x00, 0x62, 0x1D, 0x00, 0x00, 0x8E, +/* 00003880 */ 0x1D, 0x00, 0x00, 0xA0, 0x1D, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x51, 0x1E, 0x00, 0x00, 0x7B, +/* 00003890 */ 0x1E, 0x00, 0x00, 0xB4, 0x1E, 0x00, 0x00, 0xEE, 0x1E, 0x00, 0x00, 0xFC, 0x1E, 0x00, 0x00, 0x47, +/* 000038A0 */ 0x1F, 0x00, 0x00, 0x89, 0x1F, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00, 0x61, +/* 000038B0 */ 0x20, 0x00, 0x00, 0x6B, 0x20, 0x00, 0x00, 0x8A, 0x20, 0x00, 0x00, 0x90, 0x20, 0x00, 0x00, 0x91, +/* 000038C0 */ 0x20, 0x00, 0x00, 0xC3, 0x20, 0x00, 0x00, 0xE3, 0x20, 0x00, 0x00, 0x07, 0x21, 0x00, 0x00, 0x11, +/* 000038D0 */ 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x00, 0x5D, 0x21, 0x00, 0x00, 0x73, 0x21, 0x00, 0x00, 0x91, +/* 000038E0 */ 0x21, 0x00, 0x00, 0x9B, 0x21, 0x00, 0x00, 0x9C, 0x21, 0x00, 0x00, 0x11, 0x22, 0x00, 0x00, 0x61, +/* 000038F0 */ 0x22, 0x00, 0x00, 0xA6, 0x22, 0x00, 0x00, 0xA7, 0x22, 0x00, 0x00, 0x1A, 0x23, 0x00, 0x00, 0x33, +/* 00003900 */ 0x23, 0x00, 0x00, 0x57, 0x23, 0x00, 0x00, 0x7B, 0x23, 0x00, 0x00, 0xD3, 0x23, 0x00, 0x00, 0x16, +/* 00003910 */ 0x24, 0x00, 0x00, 0x9F, 0x24, 0x00, 0x00, 0xA0, 0x24, 0x00, 0x00, 0xBB, 0x24, 0x00, 0x00, 0xC1, +/* 00003920 */ 0x24, 0x00, 0x00, 0xC2, 0x24, 0x00, 0x00, 0x1C, 0x25, 0x00, 0x00, 0x52, 0x25, 0x00, 0x00, 0x72, +/* 00003930 */ 0x25, 0x00, 0x00, 0xCF, 0x25, 0x00, 0x00, 0x02, 0x26, 0x00, 0x00, 0x0C, 0x26, 0x00, 0x00, 0x0D, +/* 00003940 */ 0x26, 0x00, 0x00, 0x24, 0x26, 0x00, 0x00, 0x74, 0x26, 0x00, 0x00, 0xD0, 0x26, 0x00, 0x00, 0xE0, +/* 00003950 */ 0x26, 0x00, 0x00, 0xEA, 0x26, 0x00, 0x00, 0xEB, 0x26, 0x00, 0x00, 0x7A, 0x27, 0x00, 0x00, 0x00, +/* 00003960 */ 0x28, 0x00, 0x00, 0x7B, 0x28, 0x00, 0x00, 0xC4, 0x28, 0x00, 0x00, 0xFA, 0x28, 0x00, 0x00, 0xFB, +/* 00003970 */ 0x28, 0x00, 0x00, 0x47, 0x29, 0x00, 0x00, 0x66, 0x29, 0x00, 0x00, 0xB7, 0x29, 0x00, 0x00, 0x31, +/* 00003980 */ 0x2A, 0x00, 0x00, 0x55, 0x2A, 0x00, 0x00, 0xB0, 0x2A, 0x00, 0x00, 0xFB, 0x2A, 0x00, 0x00, 0x0D, +/* 00003990 */ 0x2B, 0x00, 0x00, 0x1E, 0x2B, 0x00, 0x00, 0x3E, 0x2B, 0x00, 0x00, 0x48, 0x2B, 0x00, 0x00, 0x49, +/* 000039A0 */ 0x2B, 0x00, 0x00, 0xB8, 0x2B, 0x00, 0x00, 0xE6, 0x2B, 0x00, 0x00, 0x1B, 0x2C, 0x00, 0x00, 0x44, +/* 000039B0 */ 0x2C, 0x00, 0x00, 0x5C, 0x2C, 0x00, 0x00, 0x96, 0x2C, 0x00, 0x00, 0xC0, 0x2C, 0x00, 0x00, 0xE5, +/* 000039C0 */ 0x2C, 0x00, 0x00, 0xFE, 0x2C, 0x00, 0x00, 0x25, 0x2D, 0x00, 0x00, 0x37, 0x2D, 0x00, 0x00, 0x45, +/* 000039D0 */ 0x2D, 0x00, 0x00, 0x46, 0x2D, 0x00, 0x00, 0x91, 0x2D, 0x00, 0x00, 0xA2, 0x2D, 0x00, 0x00, 0xC4, +/* 000039E0 */ 0x2D, 0x00, 0x00, 0xCE, 0x2D, 0x00, 0x00, 0xCF, 0x2D, 0x00, 0x00, 0xED, 0x2D, 0x00, 0x00, 0x0B, +/* 000039F0 */ 0x2E, 0x00, 0x00, 0x29, 0x2E, 0x00, 0x00, 0x5A, 0x2E, 0x00, 0x00, 0x6C, 0x2E, 0x00, 0x00, 0x72, +/* 00003A00 */ 0x2E, 0x00, 0x00, 0x73, 0x2E, 0x00, 0x00, 0xD3, 0x2E, 0x00, 0x00, 0x2B, 0x2F, 0x00, 0x00, 0x5E, +/* 00003A10 */ 0x2F, 0x00, 0x00, 0x5F, 0x2F, 0x00, 0x00, 0x90, 0x2F, 0x00, 0x00, 0x91, 0x2F, 0x00, 0x00, 0xC5, +/* 00003A20 */ 0x2F, 0x00, 0x00, 0xF0, 0x2F, 0x00, 0x00, 0x59, 0x30, 0x00, 0x00, 0x8A, 0x30, 0x00, 0x00, 0xAB, +/* 00003A30 */ 0x30, 0x00, 0x00, 0xB9, 0x30, 0x00, 0x00, 0xC3, 0x30, 0x00, 0x00, 0x18, 0x31, 0x00, 0x00, 0x1E, +/* 00003A40 */ 0x31, 0x00, 0x00, 0x1F, 0x31, 0x00, 0x00, 0x62, 0x31, 0x00, 0x00, 0x8F, 0x31, 0x00, 0x00, 0xBD, +/* 00003A50 */ 0x31, 0x00, 0x00, 0xE4, 0x31, 0x00, 0x00, 0x10, 0x32, 0x00, 0x00, 0x1A, 0x32, 0x00, 0x00, 0x1B, +/* 00003A60 */ 0x32, 0x00, 0x00, 0x3D, 0x32, 0x00, 0x00, 0x62, 0x32, 0x00, 0x00, 0x8A, 0x32, 0x00, 0x00, 0x98, +/* 00003A70 */ 0x32, 0x00, 0x00, 0x99, 0x32, 0x00, 0x00, 0xC5, 0x32, 0x00, 0x00, 0x12, 0x33, 0x00, 0x00, 0x2B, +/* 00003A80 */ 0x33, 0x00, 0x00, 0x69, 0x33, 0x00, 0x00, 0x9D, 0x33, 0x00, 0x00, 0xB2, 0x33, 0x00, 0x00, 0xE1, +/* 00003A90 */ 0x33, 0x00, 0x00, 0xEF, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x51, 0x34, 0x00, 0x00, 0x81, +/* 00003AA0 */ 0x34, 0x00, 0x00, 0xE7, 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF2, 0x34, 0x00, 0x00, 0x1A, +/* 00003AB0 */ 0x35, 0x00, 0x00, 0x21, 0x35, 0x00, 0x00, 0x22, 0x35, 0x00, 0x00, 0x44, 0x35, 0x00, 0x00, 0x62, +/* 00003AC0 */ 0x35, 0x00, 0x00, 0x87, 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xD9, 0x35, 0x00, 0x00, 0xEB, +/* 00003AD0 */ 0x35, 0x00, 0x00, 0x2B, 0x36, 0x00, 0x00, 0x3A, 0x36, 0x00, 0x00, 0x3B, 0x36, 0x00, 0x00, 0x60, +/* 00003AE0 */ 0x36, 0x00, 0x00, 0xA0, 0x36, 0x00, 0x00, 0xAF, 0x36, 0x00, 0x00, 0xB0, 0x36, 0x00, 0x00, 0xD5, +/* 00003AF0 */ 0x36, 0x00, 0x00, 0x0F, 0x37, 0x00, 0x00, 0x1E, 0x37, 0x00, 0x00, 0x1F, 0x37, 0x00, 0x00, 0x4C, +/* 00003B00 */ 0x37, 0x00, 0x00, 0x8D, 0x37, 0x00, 0x00, 0x9C, 0x37, 0x00, 0x00, 0x9D, 0x37, 0x00, 0x00, 0xC2, +/* 00003B10 */ 0x37, 0x00, 0x00, 0xE7, 0x37, 0x00, 0x00, 0x04, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x73, +/* 00003B20 */ 0x38, 0x00, 0x00, 0x85, 0x38, 0x00, 0x00, 0xA1, 0x38, 0x00, 0x00, 0xB0, 0x38, 0x00, 0x00, 0xB1, +/* 00003B30 */ 0x38, 0x00, 0x00, 0xDC, 0x38, 0x00, 0x00, 0x08, 0x39, 0x00, 0x00, 0x24, 0x39, 0x00, 0x00, 0x74, +/* 00003B40 */ 0x39, 0x00, 0x00, 0x99, 0x39, 0x00, 0x00, 0xAF, 0x39, 0x00, 0x00, 0xE0, 0x39, 0x00, 0x00, 0xF2, +/* 00003B50 */ 0x39, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x11, 0x3A, 0x00, 0x00, 0x1B, 0x3A, 0x00, 0x00, 0x1C, +/* 00003B60 */ 0x3A, 0x00, 0x00, 0x43, 0x3A, 0x00, 0x00, 0x87, 0x3A, 0x00, 0x00, 0xAE, 0x3A, 0x00, 0x00, 0xAF, +/* 00003B70 */ 0x3A, 0x00, 0x00, 0xD2, 0x3A, 0x00, 0x00, 0xF7, 0x3A, 0x00, 0x00, 0x31, 0x3B, 0x00, 0x00, 0x3F, +/* 00003B80 */ 0x3B, 0x00, 0x00, 0x40, 0x3B, 0x00, 0x00, 0x64, 0x3B, 0x00, 0x00, 0x96, 0x3B, 0x00, 0x00, 0xA4, +/* 00003B90 */ 0x3B, 0x00, 0x00, 0xA5, 0x3B, 0x00, 0x00, 0xC9, 0x3B, 0x00, 0x00, 0xFB, 0x3B, 0x00, 0x00, 0x09, +/* 00003BA0 */ 0x3C, 0x00, 0x00, 0x0A, 0x3C, 0x00, 0x00, 0x71, 0x3C, 0x00, 0x00, 0x0C, 0x3D, 0x00, 0x00, 0x1A, +/* 00003BB0 */ 0x3D, 0x00, 0x00, 0x1B, 0x3D, 0x00, 0x00, 0x35, 0x3D, 0x00, 0x00, 0x3F, 0x3D, 0x00, 0x00, 0x40, +/* 00003BC0 */ 0x3D, 0x00, 0x00, 0x59, 0x3D, 0x00, 0x00, 0x5F, 0x3D, 0x00, 0x00, 0x60, 0x3D, 0x00, 0x00, 0xAE, +/* 00003BD0 */ 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0xDB, 0x3D, 0x00, 0x00, 0x0A, 0x3E, 0x00, 0x00, 0x4A, +/* 00003BE0 */ 0x3E, 0x00, 0x00, 0x4B, 0x3E, 0x00, 0x00, 0xAC, 0x3E, 0x00, 0x00, 0x2E, 0x3F, 0x00, 0x00, 0x3C, +/* 00003BF0 */ 0x3F, 0x00, 0x00, 0x3D, 0x3F, 0x00, 0x00, 0x6C, 0x3F, 0x00, 0x00, 0x7D, 0x3F, 0x00, 0x00, 0x9A, +/* 00003C00 */ 0x3F, 0x00, 0x00, 0xA4, 0x3F, 0x00, 0x00, 0xAA, 0x3F, 0x00, 0x00, 0xAB, 0x3F, 0x00, 0x00, 0xC5, +/* 00003C10 */ 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0x19, 0x40, 0x00, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x20, +/* 00003C20 */ 0x40, 0x00, 0x00, 0x58, 0x40, 0x00, 0x00, 0xA4, 0x40, 0x00, 0x00, 0x02, 0x41, 0x00, 0x00, 0x28, +/* 00003C30 */ 0x41, 0x00, 0x00, 0x6D, 0x41, 0x00, 0x00, 0xD1, 0x41, 0x00, 0x00, 0x51, 0x42, 0x00, 0x00, 0x52, +/* 00003C40 */ 0x42, 0x00, 0x00, 0xC4, 0x42, 0x00, 0x00, 0xF5, 0x42, 0x00, 0x00, 0x44, 0x43, 0x00, 0x00, 0x96, +/* 00003C50 */ 0x43, 0x00, 0x00, 0xEA, 0x43, 0x00, 0x00, 0x22, 0x44, 0x00, 0x00, 0x74, 0x44, 0x00, 0x00, 0xC6, +/* 00003C60 */ 0x44, 0x00, 0x00, 0x1B, 0x45, 0x00, 0x00, 0x87, 0x45, 0x00, 0x00, 0xDD, 0x45, 0x00, 0x00, 0xDE, +/* 00003C70 */ 0x45, 0x00, 0x00, 0xFD, 0x45, 0x00, 0x00, 0x1C, 0x46, 0x00, 0x00, 0x4E, 0x46, 0x00, 0x00, 0x4F, +/* 00003C80 */ 0x46, 0x00, 0x00, 0xC6, 0x46, 0x00, 0x00, 0x33, 0x47, 0x00, 0x00, 0x86, 0x47, 0x00, 0x00, 0xC9, +/* 00003C90 */ 0x47, 0x00, 0x00, 0xCA, 0x47, 0x00, 0x00, 0x47, 0x48, 0x00, 0x00, 0xDB, 0x48, 0x00, 0x00, 0x5E, +/* 00003CA0 */ 0x49, 0x00, 0x00, 0xE1, 0x49, 0x00, 0x00, 0x54, 0x4A, 0x00, 0x00, 0x55, 0x4A, 0x00, 0x00, 0xBF, +/* 00003CB0 */ 0x4A, 0x00, 0x00, 0x38, 0x4B, 0x00, 0x00, 0x39, 0x4B, 0x00, 0x00, 0x9C, 0x4B, 0x00, 0x00, 0x2B, +/* 00003CC0 */ 0x4C, 0x00, 0x00, 0xD4, 0x4C, 0x00, 0x00, 0x68, 0x4D, 0x00, 0x00, 0xFF, 0x4D, 0x00, 0x00, 0xA3, +/* 00003CD0 */ 0x4E, 0x00, 0x00, 0xB7, 0x4E, 0x00, 0x00, 0xB8, 0x4E, 0x00, 0x00, 0x39, 0x4F, 0x00, 0x00, 0xA5, +/* 00003CE0 */ 0x4F, 0x00, 0x00, 0x15, 0x50, 0x00, 0x00, 0x85, 0x50, 0x00, 0x00, 0xF7, 0x50, 0x00, 0x00, 0x6B, +/* 00003CF0 */ 0x51, 0x00, 0x00, 0xDF, 0x51, 0x00, 0x00, 0x29, 0x52, 0x00, 0x00, 0x2A, 0x52, 0x00, 0x00, 0x97, +/* 00003D00 */ 0x52, 0x00, 0x00, 0x98, 0x52, 0x00, 0x00, 0xFE, 0x52, 0x00, 0x00, 0x89, 0x53, 0x00, 0x00, 0xFF, +/* 00003D10 */ 0x53, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x06, 0x54, 0x00, 0x00, 0x34, 0x54, 0x00, 0x00, 0x5C, +/* 00003D20 */ 0x54, 0x00, 0x00, 0x5D, 0x54, 0x00, 0x00, 0x7E, 0x54, 0x00, 0x00, 0xA6, 0x54, 0x00, 0x00, 0xB0, +/* 00003D30 */ 0x54, 0x00, 0x00, 0xB1, 0x54, 0x00, 0x00, 0xFD, 0x54, 0x00, 0x00, 0x03, 0x55, 0x00, 0x00, 0x04, +/* 00003D40 */ 0x55, 0x00, 0x00, 0x7B, 0x55, 0x00, 0x00, 0xAA, 0x55, 0x00, 0x00, 0xD8, 0x55, 0x00, 0x00, 0xEF, +/* 00003D50 */ 0x55, 0x00, 0x00, 0xF9, 0x55, 0x00, 0x00, 0xFA, 0x55, 0x00, 0x00, 0x25, 0x56, 0x00, 0x00, 0x46, +/* 00003D60 */ 0x56, 0x00, 0x00, 0x50, 0x56, 0x00, 0x00, 0x51, 0x56, 0x00, 0x00, 0x7F, 0x56, 0x00, 0x00, 0xB9, +/* 00003D70 */ 0x56, 0x00, 0x00, 0xBA, 0x56, 0x00, 0x00, 0xEF, 0x56, 0x00, 0x00, 0x06, 0x57, 0x00, 0x00, 0x07, +/* 00003D80 */ 0x57, 0x00, 0x00, 0x45, 0x57, 0x00, 0x00, 0xA6, 0x57, 0x00, 0x00, 0xE2, 0x57, 0x00, 0x00, 0xF0, +/* 00003D90 */ 0x57, 0x00, 0x00, 0xF1, 0x57, 0x00, 0x00, 0x22, 0x58, 0x00, 0x00, 0x23, 0x58, 0x00, 0x00, 0x54, +/* 00003DA0 */ 0x58, 0x00, 0x00, 0x94, 0x58, 0x00, 0x00, 0xA2, 0x58, 0x00, 0x00, 0xA3, 0x58, 0x00, 0x00, 0xD9, +/* 00003DB0 */ 0x58, 0x00, 0x00, 0xDA, 0x58, 0x00, 0x00, 0x3B, 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x89, +/* 00003DC0 */ 0x59, 0x00, 0x00, 0x95, 0x59, 0x00, 0x00, 0x96, 0x59, 0x00, 0x00, 0xAB, 0x59, 0x00, 0x00, 0xB1, +/* 00003DD0 */ 0x59, 0x00, 0x00, 0xB2, 0x59, 0x00, 0x00, 0x01, 0x5A, 0x00, 0x00, 0x1A, 0x5A, 0x00, 0x00, 0x31, +/* 00003DE0 */ 0x5A, 0x00, 0x00, 0x86, 0x5A, 0x00, 0x00, 0x98, 0x5A, 0x00, 0x00, 0xF6, 0x5A, 0x00, 0x00, 0x1D, +/* 00003DF0 */ 0x5B, 0x00, 0x00, 0xAA, 0x5B, 0x00, 0x00, 0xD1, 0x5B, 0x00, 0x00, 0xE3, 0x5B, 0x00, 0x00, 0xFE, +/* 00003E00 */ 0x5B, 0x00, 0x00, 0x25, 0x5C, 0x00, 0x00, 0x87, 0x5C, 0x00, 0x00, 0x95, 0x5C, 0x00, 0x00, 0xA1, +/* 00003E10 */ 0x5C, 0x00, 0x00, 0x09, 0x5D, 0x00, 0x00, 0x20, 0x5D, 0x00, 0x00, 0x26, 0x5D, 0x00, 0x00, 0x27, +/* 00003E20 */ 0x5D, 0x00, 0x00, 0x7D, 0x5D, 0x00, 0x00, 0xB0, 0x5D, 0x00, 0x00, 0xE9, 0x5D, 0x00, 0x00, 0xF3, +/* 00003E30 */ 0x5D, 0x00, 0x00, 0xF4, 0x5D, 0x00, 0x00, 0x2C, 0x5E, 0x00, 0x00, 0x67, 0x5E, 0x00, 0x00, 0xA0, +/* 00003E40 */ 0x5E, 0x00, 0x00, 0xAA, 0x5E, 0x00, 0x00, 0xAB, 0x5E, 0x00, 0x00, 0xE0, 0x5E, 0x00, 0x00, 0xE6, +/* 00003E50 */ 0x5E, 0x00, 0x00, 0xE7, 0x5E, 0x00, 0x00, 0x38, 0x5F, 0x00, 0x00, 0x6B, 0x5F, 0x00, 0x00, 0xA4, +/* 00003E60 */ 0x5F, 0x00, 0x00, 0xAE, 0x5F, 0x00, 0x00, 0xAF, 0x5F, 0x00, 0x00, 0xE7, 0x5F, 0x00, 0x00, 0x22, +/* 00003E70 */ 0x60, 0x00, 0x00, 0x5B, 0x60, 0x00, 0x00, 0x65, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x96, +/* 00003E80 */ 0x60, 0x00, 0x00, 0x9C, 0x60, 0x00, 0x00, 0x9D, 0x60, 0x00, 0x00, 0xC6, 0x60, 0x00, 0x00, 0x01, +/* 00003E90 */ 0x61, 0x00, 0x00, 0x16, 0x61, 0x00, 0x00, 0x49, 0x61, 0x00, 0x00, 0x4A, 0x61, 0x00, 0x00, 0x78, +/* 00003EA0 */ 0x61, 0x00, 0x00, 0xA5, 0x61, 0x00, 0x00, 0xA6, 0x61, 0x00, 0x00, 0xD8, 0x61, 0x00, 0x00, 0x0E, +/* 00003EB0 */ 0x62, 0x00, 0x00, 0x0F, 0x62, 0x00, 0x00, 0x55, 0x62, 0x00, 0x00, 0xCC, 0x62, 0x00, 0x00, 0xDE, +/* 00003EC0 */ 0x62, 0x00, 0x00, 0xEC, 0x62, 0x00, 0x00, 0xF6, 0x62, 0x00, 0x00, 0xF7, 0x62, 0x00, 0x00, 0x3F, +/* 00003ED0 */ 0x63, 0x00, 0x00, 0xC1, 0x63, 0x00, 0x00, 0xD2, 0x63, 0x00, 0x00, 0x34, 0x64, 0x00, 0x00, 0x3E, +/* 00003EE0 */ 0x64, 0x00, 0x00, 0x45, 0x64, 0x00, 0x00, 0x46, 0x64, 0x00, 0x00, 0x82, 0x64, 0x00, 0x00, 0xE3, +/* 00003EF0 */ 0x64, 0x00, 0x00, 0xE4, 0x64, 0x00, 0x00, 0x57, 0x65, 0x00, 0x00, 0xA7, 0x65, 0x00, 0x00, 0xF8, +/* 00003F00 */ 0x65, 0x00, 0x00, 0x7B, 0x66, 0x00, 0x00, 0xD2, 0x66, 0x00, 0x00, 0x3A, 0x67, 0x00, 0x00, 0x60, +/* 00003F10 */ 0x67, 0x00, 0x00, 0x61, 0x67, 0x00, 0x00, 0xBA, 0x67, 0x00, 0x00, 0x45, 0x68, 0x00, 0x00, 0xA0, +/* 00003F20 */ 0x68, 0x00, 0x00, 0x0C, 0x69, 0x00, 0x00, 0x32, 0x69, 0x00, 0x00, 0x33, 0x69, 0x00, 0x00, 0x90, +/* 00003F30 */ 0x69, 0x00, 0x00, 0x1F, 0x6A, 0x00, 0x00, 0x7C, 0x6A, 0x00, 0x00, 0xEA, 0x6A, 0x00, 0x00, 0x10, +/* 00003F40 */ 0x6B, 0x00, 0x00, 0x11, 0x6B, 0x00, 0x00, 0x52, 0x6B, 0x00, 0x00, 0xC5, 0x6B, 0x00, 0x00, 0xFF, +/* 00003F50 */ 0x6B, 0x00, 0x00, 0x5A, 0x6C, 0x00, 0x00, 0x80, 0x6C, 0x00, 0x00, 0x81, 0x6C, 0x00, 0x00, 0xDA, +/* 00003F60 */ 0x6C, 0x00, 0x00, 0x34, 0x6D, 0x00, 0x00, 0x83, 0x6D, 0x00, 0x00, 0xFF, 0x6D, 0x00, 0x00, 0x5F, +/* 00003F70 */ 0x6E, 0x00, 0x00, 0xC3, 0x6E, 0x00, 0x00, 0x29, 0x6F, 0x00, 0x00, 0x82, 0x6F, 0x00, 0x00, 0x83, +/* 00003F80 */ 0x6F, 0x00, 0x00, 0xEA, 0x6F, 0x00, 0x00, 0x2F, 0x70, 0x00, 0x00, 0x72, 0x70, 0x00, 0x00, 0xAB, +/* 00003F90 */ 0x70, 0x00, 0x00, 0xE6, 0x70, 0x00, 0x00, 0x21, 0x71, 0x00, 0x00, 0x5F, 0x71, 0x00, 0x00, 0x9C, +/* 00003FA0 */ 0x71, 0x00, 0x00, 0xD1, 0x71, 0x00, 0x00, 0x32, 0x72, 0x00, 0x00, 0x7D, 0x72, 0x00, 0x00, 0xC8, +/* 00003FB0 */ 0x72, 0x00, 0x00, 0x13, 0x73, 0x00, 0x00, 0x5D, 0x73, 0x00, 0x00, 0x5E, 0x73, 0x00, 0x00, 0xDD, +/* 00003FC0 */ 0x73, 0x00, 0x00, 0x78, 0x74, 0x00, 0x00, 0x98, 0x74, 0x00, 0x00, 0xB8, 0x74, 0x00, 0x00, 0xD6, +/* 00003FD0 */ 0x74, 0x00, 0x00, 0xE4, 0x74, 0x00, 0x00, 0xE5, 0x74, 0x00, 0x00, 0x48, 0x75, 0x00, 0x00, 0xC3, +/* 00003FE0 */ 0x75, 0x00, 0x00, 0x03, 0x76, 0x00, 0x00, 0x34, 0x76, 0x00, 0x00, 0xB3, 0x76, 0x00, 0x00, 0x09, +/* 00003FF0 */ 0x77, 0x00, 0x00, 0x4D, 0x77, 0x00, 0x00, 0x4E, 0x77, 0x00, 0x00, 0xCD, 0x77, 0x00, 0x00, 0x15, +/* 00004000 */ 0x78, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x83, 0x78, 0x00, 0x00, 0x95, 0x78, 0x00, 0x00, 0xA5, +/* 00004010 */ 0x78, 0x00, 0x00, 0xA6, 0x78, 0x00, 0x00, 0xDE, 0x78, 0x00, 0x00, 0xEA, 0x78, 0x00, 0x00, 0x03, +/* 00004020 */ 0x79, 0x00, 0x00, 0x0D, 0x79, 0x00, 0x00, 0x0E, 0x79, 0x00, 0x00, 0x5F, 0x79, 0x00, 0x00, 0x8D, +/* 00004030 */ 0x79, 0x00, 0x00, 0xB8, 0x79, 0x00, 0x00, 0xE4, 0x79, 0x00, 0x00, 0x1F, 0x7A, 0x00, 0x00, 0x49, +/* 00004040 */ 0x7A, 0x00, 0x00, 0x53, 0x7A, 0x00, 0x00, 0x54, 0x7A, 0x00, 0x00, 0x74, 0x7A, 0x00, 0x00, 0x97, +/* 00004050 */ 0x7A, 0x00, 0x00, 0xB9, 0x7A, 0x00, 0x00, 0x0D, 0x7B, 0x00, 0x00, 0x36, 0x7B, 0x00, 0x00, 0xA0, +/* 00004060 */ 0x7B, 0x00, 0x00, 0xB9, 0x7B, 0x00, 0x00, 0x0B, 0x7C, 0x00, 0x00, 0x54, 0x7C, 0x00, 0x00, 0x7A, +/* 00004070 */ 0x7C, 0x00, 0x00, 0xDC, 0x7C, 0x00, 0x00, 0xEA, 0x7C, 0x00, 0x00, 0xFB, 0x7C, 0x00, 0x00, 0x44, +/* 00004080 */ 0x7D, 0x00, 0x00, 0xA0, 0x7D, 0x00, 0x00, 0xBF, 0x7D, 0x00, 0x00, 0xE1, 0x7D, 0x00, 0x00, 0xEB, +/* 00004090 */ 0x7D, 0x00, 0x00, 0xEC, 0x7D, 0x00, 0x00, 0x13, 0x7E, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x69, +/* 000040A0 */ 0x7E, 0x00, 0x00, 0x73, 0x7E, 0x00, 0x00, 0x74, 0x7E, 0x00, 0x00, 0xD0, 0x7E, 0x00, 0x00, 0x25, +/* 000040B0 */ 0x7F, 0x00, 0x00, 0x4B, 0x7F, 0x00, 0x00, 0x89, 0x7F, 0x00, 0x00, 0x9E, 0x7F, 0x00, 0x00, 0xDE, +/* 000040C0 */ 0x7F, 0x00, 0x00, 0xEC, 0x7F, 0x00, 0x00, 0xF7, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x4E, +/* 000040D0 */ 0x80, 0x00, 0x00, 0x81, 0x80, 0x00, 0x00, 0xCE, 0x80, 0x00, 0x00, 0x22, 0x81, 0x00, 0x00, 0x4C, +/* 000040E0 */ 0x81, 0x00, 0x00, 0x56, 0x81, 0x00, 0x00, 0x57, 0x81, 0x00, 0x00, 0x99, 0x81, 0x00, 0x00, 0xC6, +/* 000040F0 */ 0x81, 0x00, 0x00, 0x20, 0x82, 0x00, 0x00, 0x31, 0x82, 0x00, 0x00, 0x85, 0x82, 0x00, 0x00, 0x8F, +/* 00004100 */ 0x82, 0x00, 0x00, 0x90, 0x82, 0x00, 0x00, 0xB6, 0x82, 0x00, 0x00, 0xBD, 0x82, 0x00, 0x00, 0xBE, +/* 00004110 */ 0x82, 0x00, 0x00, 0xF3, 0x82, 0x00, 0x00, 0x15, 0x83, 0x00, 0x00, 0x16, 0x83, 0x00, 0x00, 0x52, +/* 00004120 */ 0x83, 0x00, 0x00, 0x53, 0x83, 0x00, 0x00, 0x9C, 0x83, 0x00, 0x00, 0xCF, 0x83, 0x00, 0x00, 0xFF, +/* 00004130 */ 0x83, 0x00, 0x00, 0x11, 0x84, 0x00, 0x00, 0x12, 0x84, 0x00, 0x00, 0xA1, 0x84, 0x00, 0x00, 0xF7, +/* 00004140 */ 0x84, 0x00, 0x00, 0x09, 0x85, 0x00, 0x00, 0x0A, 0x85, 0x00, 0x00, 0x43, 0x85, 0x00, 0x00, 0x44, +/* 00004150 */ 0x85, 0x00, 0x00, 0x67, 0x85, 0x00, 0x00, 0x9D, 0x85, 0x00, 0x00, 0xD3, 0x85, 0x00, 0x00, 0xEC, +/* 00004160 */ 0x85, 0x00, 0x00, 0x26, 0x86, 0x00, 0x00, 0x38, 0x86, 0x00, 0x00, 0x39, 0x86, 0x00, 0x00, 0xAA, +/* 00004170 */ 0x86, 0x00, 0x00, 0x09, 0x87, 0x00, 0x00, 0x8A, 0x87, 0x00, 0x00, 0xF8, 0x87, 0x00, 0x00, 0x6B, +/* 00004180 */ 0x88, 0x00, 0x00, 0xCD, 0x88, 0x00, 0x00, 0xCE, 0x88, 0x00, 0x00, 0x06, 0x89, 0x00, 0x00, 0x47, +/* 00004190 */ 0x89, 0x00, 0x00, 0xB5, 0x89, 0x00, 0x00, 0xB6, 0x89, 0x00, 0x00, 0xE1, 0x89, 0x00, 0x00, 0x4A, +/* 000041A0 */ 0x8A, 0x00, 0x00, 0x8F, 0x8A, 0x00, 0x00, 0x90, 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0x2D, +/* 000041B0 */ 0x8B, 0x00, 0x00, 0xAF, 0x8B, 0x00, 0x00, 0xDB, 0x8B, 0x00, 0x00, 0x27, 0x8C, 0x00, 0x00, 0x6E, +/* 000041C0 */ 0x8C, 0x00, 0x00, 0x0A, 0x8D, 0x00, 0x00, 0x56, 0x8D, 0x00, 0x00, 0x8D, 0x8D, 0x00, 0x00, 0x11, +/* 000041D0 */ 0x8E, 0x00, 0x00, 0x36, 0x8E, 0x00, 0x00, 0x66, 0x8E, 0x00, 0x00, 0x84, 0x8E, 0x00, 0x00, 0x27, +/* 000041E0 */ 0x8F, 0x00, 0x00, 0x86, 0x8F, 0x00, 0x00, 0xB5, 0x8F, 0x00, 0x00, 0xCF, 0x8F, 0x00, 0x00, 0xE7, +/* 000041F0 */ 0x8F, 0x00, 0x00, 0xF9, 0x8F, 0x00, 0x00, 0x28, 0x90, 0x00, 0x00, 0x97, 0x90, 0x00, 0x00, 0xC6, +/* 00004200 */ 0x90, 0x00, 0x00, 0x54, 0x91, 0x00, 0x00, 0x8B, 0x91, 0x00, 0x00, 0xF5, 0x91, 0x00, 0x00, 0x0F, +/* 00004210 */ 0x92, 0x00, 0x00, 0x25, 0x92, 0x00, 0x00, 0x40, 0x92, 0x00, 0x00, 0x6F, 0x92, 0x00, 0x00, 0x85, +/* 00004220 */ 0x92, 0x00, 0x00, 0x97, 0x92, 0x00, 0x00, 0x98, 0x92, 0x00, 0x00, 0xC7, 0x92, 0x00, 0x00, 0xF6, +/* 00004230 */ 0x92, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x8B, 0x93, 0x00, 0x00, 0xAD, 0x93, 0x00, 0x00, 0xDB, +/* 00004240 */ 0x93, 0x00, 0x00, 0x09, 0x94, 0x00, 0x00, 0x0A, 0x94, 0x00, 0x00, 0x7B, 0x94, 0x00, 0x00, 0x04, +/* 00004250 */ 0x95, 0x00, 0x00, 0x6D, 0x95, 0x00, 0x00, 0xAC, 0x95, 0x00, 0x00, 0xC2, 0x95, 0x00, 0x00, 0xC3, +/* 00004260 */ 0x95, 0x00, 0x00, 0xE8, 0x95, 0x00, 0x00, 0x15, 0x96, 0x00, 0x00, 0x42, 0x96, 0x00, 0x00, 0x6F, +/* 00004270 */ 0x96, 0x00, 0x00, 0x8C, 0x96, 0x00, 0x00, 0xB9, 0x96, 0x00, 0x00, 0xCF, 0x96, 0x00, 0x00, 0xE1, +/* 00004280 */ 0x96, 0x00, 0x00, 0xE2, 0x96, 0x00, 0x00, 0x13, 0x97, 0x00, 0x00, 0x40, 0x97, 0x00, 0x00, 0x52, +/* 00004290 */ 0x97, 0x00, 0x00, 0x53, 0x97, 0x00, 0x00, 0x80, 0x97, 0x00, 0x00, 0xA5, 0x97, 0x00, 0x00, 0xB7, +/* 000042A0 */ 0x97, 0x00, 0x00, 0xB8, 0x97, 0x00, 0x00, 0xE9, 0x97, 0x00, 0x00, 0x17, 0x98, 0x00, 0x00, 0x64, +/* 000042B0 */ 0x98, 0x00, 0x00, 0xAC, 0x98, 0x00, 0x00, 0xD6, 0x98, 0x00, 0x00, 0x0C, 0x99, 0x00, 0x00, 0x4E, +/* 000042C0 */ 0x99, 0x00, 0x00, 0x80, 0x99, 0x00, 0x00, 0xAE, 0x99, 0x00, 0x00, 0xE0, 0x99, 0x00, 0x00, 0x17, +/* 000042D0 */ 0x9A, 0x00, 0x00, 0x25, 0x9A, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x95, 0x9A, 0x00, 0x00, 0xBE, +/* 000042E0 */ 0x9A, 0x00, 0x00, 0xF9, 0x9A, 0x00, 0x00, 0x53, 0x9B, 0x00, 0x00, 0x65, 0x9B, 0x00, 0x00, 0x8F, +/* 000042F0 */ 0x9B, 0x00, 0x00, 0xBF, 0x9B, 0x00, 0x00, 0xD1, 0x9B, 0x00, 0x00, 0x75, 0x9C, 0x00, 0x00, 0xA1, +/* 00004300 */ 0x9C, 0x00, 0x00, 0xCA, 0x9C, 0x00, 0x00, 0x04, 0x9D, 0x00, 0x00, 0x51, 0x9D, 0x00, 0x00, 0x0A, +/* 00004310 */ 0x9E, 0x00, 0x00, 0x46, 0x9E, 0x00, 0x00, 0x47, 0x9E, 0x00, 0x00, 0x6E, 0x9E, 0x00, 0x00, 0x6F, +/* 00004320 */ 0x9E, 0x00, 0x00, 0xBD, 0x9E, 0x00, 0x00, 0xFC, 0x9E, 0x00, 0x00, 0x3B, 0x9F, 0x00, 0x00, 0x51, +/* 00004330 */ 0x9F, 0x00, 0x00, 0x52, 0x9F, 0x00, 0x00, 0x89, 0x9F, 0x00, 0x00, 0xBD, 0x9F, 0x00, 0x00, 0x06, +/* 00004340 */ 0xA0, 0x00, 0x00, 0x1C, 0xA0, 0x00, 0x00, 0x1D, 0xA0, 0x00, 0x00, 0x58, 0xA0, 0x00, 0x00, 0x9E, +/* 00004350 */ 0xA0, 0x00, 0x00, 0x9F, 0xA0, 0x00, 0x00, 0xD5, 0xA0, 0x00, 0x00, 0x14, 0xA1, 0x00, 0x00, 0x59, +/* 00004360 */ 0xA1, 0x00, 0x00, 0x6F, 0xA1, 0x00, 0x00, 0x70, 0xA1, 0x00, 0x00, 0xB8, 0xA1, 0x00, 0x00, 0xB9, +/* 00004370 */ 0xA1, 0x00, 0x00, 0xE6, 0xA1, 0x00, 0x00, 0x4E, 0xA2, 0x00, 0x00, 0x8B, 0xA2, 0x00, 0x00, 0xAB, +/* 00004380 */ 0xA2, 0x00, 0x00, 0xBD, 0xA2, 0x00, 0x00, 0xFB, 0xA2, 0x00, 0x00, 0xFC, 0xA2, 0x00, 0x00, 0x25, +/* 00004390 */ 0xA3, 0x00, 0x00, 0x59, 0xA3, 0x00, 0x00, 0xBB, 0xA3, 0x00, 0x00, 0xD1, 0xA3, 0x00, 0x00, 0xD2, +/* 000043A0 */ 0xA3, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x76, 0xA4, 0x00, 0x00, 0xD8, 0xA4, 0x00, 0x00, 0xEE, +/* 000043B0 */ 0xA4, 0x00, 0x00, 0xEF, 0xA4, 0x00, 0x00, 0x12, 0xA5, 0x00, 0x00, 0x35, 0xA5, 0x00, 0x00, 0x36, +/* 000043C0 */ 0xA5, 0x00, 0x00, 0xEE, 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x4F, 0xA6, 0x00, 0x00, 0x50, +/* 000043D0 */ 0xA6, 0x00, 0x00, 0xE2, 0xA6, 0x00, 0x00, 0xE3, 0xA6, 0x00, 0x00, 0x74, 0xA7, 0x00, 0x00, 0xB8, +/* 000043E0 */ 0xA7, 0x00, 0x00, 0xB9, 0xA7, 0x00, 0x00, 0x4E, 0xA8, 0x00, 0x00, 0x4F, 0xA8, 0x00, 0x00, 0x9D, +/* 000043F0 */ 0xA8, 0x00, 0x00, 0xD5, 0xA8, 0x00, 0x00, 0x0D, 0xA9, 0x00, 0x00, 0x7B, 0xA9, 0x00, 0x00, 0x95, +/* 00004400 */ 0xA9, 0x00, 0x00, 0xE0, 0xA9, 0x00, 0x00, 0x41, 0xAA, 0x00, 0x00, 0xAF, 0xAA, 0x00, 0x00, 0xC9, +/* 00004410 */ 0xAA, 0x00, 0x00, 0xCA, 0xAA, 0x00, 0x00, 0xEB, 0xAA, 0x00, 0x00, 0x26, 0xAB, 0x00, 0x00, 0x5F, +/* 00004420 */ 0xAB, 0x00, 0x00, 0xA4, 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0x50, 0xAC, 0x00, 0x00, 0xE5, +/* 00004430 */ 0xAC, 0x00, 0x00, 0x7A, 0xAD, 0x00, 0x00, 0x94, 0xAD, 0x00, 0x00, 0xE1, 0xAD, 0x00, 0x00, 0xF5, +/* 00004440 */ 0xAD, 0x00, 0x00, 0xF6, 0xAD, 0x00, 0x00, 0x3C, 0xAE, 0x00, 0x00, 0x84, 0xAE, 0x00, 0x00, 0xBC, +/* 00004450 */ 0xAE, 0x00, 0x00, 0x22, 0xAF, 0x00, 0x00, 0x3C, 0xAF, 0x00, 0x00, 0x3D, 0xAF, 0x00, 0x00, 0x88, +/* 00004460 */ 0xAF, 0x00, 0x00, 0xE9, 0xAF, 0x00, 0x00, 0x4F, 0xB0, 0x00, 0x00, 0x69, 0xB0, 0x00, 0x00, 0x6A, +/* 00004470 */ 0xB0, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x00, 0xE4, 0xB0, 0x00, 0x00, 0xF8, 0xB0, 0x00, 0x00, 0xF9, +/* 00004480 */ 0xB0, 0x00, 0x00, 0x1A, 0xB1, 0x00, 0x00, 0x28, 0xB1, 0x00, 0x00, 0x32, 0xB1, 0x00, 0x00, 0x7D, +/* 00004490 */ 0xB1, 0x00, 0x00, 0x97, 0xB1, 0x00, 0x00, 0xA1, 0xB1, 0x00, 0x00, 0xA2, 0xB1, 0x00, 0x00, 0xDC, +/* 000044A0 */ 0xB1, 0x00, 0x00, 0x02, 0xB2, 0x00, 0x00, 0x51, 0xB2, 0x00, 0x00, 0x82, 0xB2, 0x00, 0x00, 0xB6, +/* 000044B0 */ 0xB2, 0x00, 0x00, 0x21, 0xB3, 0x00, 0x00, 0x6D, 0xB3, 0x00, 0x00, 0xC0, 0xB3, 0x00, 0x00, 0xD3, +/* 000044C0 */ 0xB3, 0x00, 0x00, 0xE5, 0xB3, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x53, 0xB4, 0x00, 0x00, 0xE2, +/* 000044D0 */ 0xB4, 0x00, 0x00, 0x53, 0xB5, 0x00, 0x00, 0xCA, 0xB5, 0x00, 0x00, 0xDD, 0xB5, 0x00, 0x00, 0xEF, +/* 000044E0 */ 0xB5, 0x00, 0x00, 0xF0, 0xB5, 0x00, 0x00, 0x2C, 0xB6, 0x00, 0x00, 0x7D, 0xB6, 0x00, 0x00, 0xB4, +/* 000044F0 */ 0xB6, 0x00, 0x00, 0xE4, 0xB6, 0x00, 0x00, 0xF6, 0xB6, 0x00, 0x00, 0xF7, 0xB6, 0x00, 0x00, 0x8E, +/* 00004500 */ 0xB7, 0x00, 0x00, 0xEC, 0xB7, 0x00, 0x00, 0xFE, 0xB7, 0x00, 0x00, 0xFF, 0xB7, 0x00, 0x00, 0x3C, +/* 00004510 */ 0xB8, 0x00, 0x00, 0x3D, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x96, 0xB8, 0x00, 0x00, 0xCC, +/* 00004520 */ 0xB8, 0x00, 0x00, 0xE5, 0xB8, 0x00, 0x00, 0x1F, 0xB9, 0x00, 0x00, 0x31, 0xB9, 0x00, 0x00, 0x32, +/* 00004530 */ 0xB9, 0x00, 0x00, 0xA3, 0xB9, 0x00, 0x00, 0x15, 0xBA, 0x00, 0x00, 0x16, 0xBA, 0x00, 0x00, 0x61, +/* 00004540 */ 0xBA, 0x00, 0x00, 0x8C, 0xBA, 0x00, 0x00, 0xCC, 0xBA, 0x00, 0x00, 0xFF, 0xBA, 0x00, 0x00, 0x40, +/* 00004550 */ 0xBB, 0x00, 0x00, 0x52, 0xBB, 0x00, 0x00, 0x53, 0xBB, 0x00, 0x00, 0xB2, 0xBB, 0x00, 0x00, 0x2F, +/* 00004560 */ 0xBC, 0x00, 0x00, 0x5F, 0xBC, 0x00, 0x00, 0x60, 0xBC, 0x00, 0x00, 0xC7, 0xBC, 0x00, 0x00, 0xFE, +/* 00004570 */ 0xBC, 0x00, 0x00, 0x35, 0xBD, 0x00, 0x00, 0x73, 0xBD, 0x00, 0x00, 0x74, 0xBD, 0x00, 0x00, 0xC5, +/* 00004580 */ 0xBD, 0x00, 0x00, 0x16, 0xBE, 0x00, 0x00, 0x17, 0xBE, 0x00, 0x00, 0x91, 0xBE, 0x00, 0x00, 0x00, +/* 00004590 */ 0xBF, 0x00, 0x00, 0x87, 0xBF, 0x00, 0x00, 0x99, 0xBF, 0x00, 0x00, 0x9A, 0xBF, 0x00, 0x00, 0xFB, +/* 000045A0 */ 0xBF, 0x00, 0x00, 0xFC, 0xBF, 0x00, 0x00, 0x34, 0xC0, 0x00, 0x00, 0x75, 0xC0, 0x00, 0x00, 0xE2, +/* 000045B0 */ 0xC0, 0x00, 0x00, 0xE3, 0xC0, 0x00, 0x00, 0x17, 0xC1, 0x00, 0x00, 0x75, 0xC1, 0x00, 0x00, 0xBE, +/* 000045C0 */ 0xC1, 0x00, 0x00, 0xD0, 0xC1, 0x00, 0x00, 0xD1, 0xC1, 0x00, 0x00, 0xFD, 0xC1, 0x00, 0x00, 0x38, +/* 000045D0 */ 0xC2, 0x00, 0x00, 0x75, 0xC2, 0x00, 0x00, 0x8B, 0xC2, 0x00, 0x00, 0xE1, 0xC2, 0x00, 0x00, 0xFB, +/* 000045E0 */ 0xC2, 0x00, 0x00, 0x47, 0xC3, 0x00, 0x00, 0x69, 0xC3, 0x00, 0x00, 0x97, 0xC3, 0x00, 0x00, 0xE4, +/* 000045F0 */ 0xC3, 0x00, 0x00, 0xFA, 0xC3, 0x00, 0x00, 0x70, 0xC4, 0x00, 0x00, 0xD4, 0xC4, 0x00, 0x00, 0xED, +/* 00004600 */ 0xC4, 0x00, 0x00, 0x17, 0xC5, 0x00, 0x00, 0x48, 0xC5, 0x00, 0x00, 0xB1, 0xC5, 0x00, 0x00, 0xE0, +/* 00004610 */ 0xC5, 0x00, 0x00, 0x3B, 0xC6, 0x00, 0x00, 0x58, 0xC6, 0x00, 0x00, 0xB2, 0xC6, 0x00, 0x00, 0xC8, +/* 00004620 */ 0xC6, 0x00, 0x00, 0xDA, 0xC6, 0x00, 0x00, 0xDB, 0xC6, 0x00, 0x00, 0x6F, 0xC7, 0x00, 0x00, 0x70, +/* 00004630 */ 0xC7, 0x00, 0x00, 0xA1, 0xC7, 0x00, 0x00, 0xD9, 0xC7, 0x00, 0x00, 0x1C, 0xC8, 0x00, 0x00, 0x4A, +/* 00004640 */ 0xC8, 0x00, 0x00, 0x4B, 0xC8, 0x00, 0x00, 0x79, 0xC8, 0x00, 0x00, 0xB1, 0xC8, 0x00, 0x00, 0xC3, +/* 00004650 */ 0xC8, 0x00, 0x00, 0xC4, 0xC8, 0x00, 0x00, 0xF9, 0xC8, 0x00, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x9E, +/* 00004660 */ 0xC9, 0x00, 0x00, 0xD6, 0xC9, 0x00, 0x00, 0x38, 0xCA, 0x00, 0x00, 0x75, 0xCA, 0x00, 0x00, 0xD5, +/* 00004670 */ 0xCA, 0x00, 0x00, 0x12, 0xCB, 0x00, 0x00, 0x72, 0xCB, 0x00, 0x00, 0x88, 0xCB, 0x00, 0x00, 0x9A, +/* 00004680 */ 0xCB, 0x00, 0x00, 0x9B, 0xCB, 0x00, 0x00, 0xE7, 0xCB, 0x00, 0x00, 0x35, 0xCC, 0x00, 0x00, 0x83, +/* 00004690 */ 0xCC, 0x00, 0x00, 0x84, 0xCC, 0x00, 0x00, 0xC2, 0xCC, 0x00, 0x00, 0x1A, 0xCD, 0x00, 0x00, 0x72, +/* 000046A0 */ 0xCD, 0x00, 0x00, 0x84, 0xCD, 0x00, 0x00, 0x85, 0xCD, 0x00, 0x00, 0xC5, 0xCD, 0x00, 0x00, 0xFF, +/* 000046B0 */ 0xCD, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x16, 0xCE, 0x00, 0x00, 0x6A, 0xCE, 0x00, 0x00, 0xA8, +/* 000046C0 */ 0xCE, 0x00, 0x00, 0xC6, 0xCE, 0x00, 0x00, 0xF0, 0xCE, 0x00, 0x00, 0x47, 0xCF, 0x00, 0x00, 0xCC, +/* 000046D0 */ 0xCF, 0x00, 0x00, 0x31, 0xD0, 0x00, 0x00, 0x6C, 0xD0, 0x00, 0x00, 0x7E, 0xD0, 0x00, 0x00, 0x7F, +/* 000046E0 */ 0xD0, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x00, 0x17, 0xD1, 0x00, 0x00, 0x29, 0xD1, 0x00, 0x00, 0x2A, +/* 000046F0 */ 0xD1, 0x00, 0x00, 0xA8, 0xD1, 0x00, 0x00, 0xE7, 0xD1, 0x00, 0x00, 0xF5, 0xD1, 0x00, 0x00, 0xF6, +/* 00004700 */ 0xD1, 0x00, 0x00, 0x66, 0xD2, 0x00, 0x00, 0xB5, 0xD2, 0x00, 0x00, 0x16, 0xD3, 0x00, 0x00, 0x28, +/* 00004710 */ 0xD3, 0x00, 0x00, 0x29, 0xD3, 0x00, 0x00, 0x63, 0xD3, 0x00, 0x00, 0xB4, 0xD3, 0x00, 0x00, 0xB5, +/* 00004720 */ 0xD3, 0x00, 0x00, 0xE6, 0xD3, 0x00, 0x00, 0x3A, 0xD4, 0x00, 0x00, 0x8F, 0xD4, 0x00, 0x00, 0xCC, +/* 00004730 */ 0xD4, 0x00, 0x00, 0xCD, 0xD4, 0x00, 0x00, 0xF4, 0xD4, 0x00, 0x00, 0x46, 0xD5, 0x00, 0x00, 0x85, +/* 00004740 */ 0xD5, 0x00, 0x00, 0xC8, 0xD5, 0x00, 0x00, 0xDE, 0xD5, 0x00, 0x00, 0xDF, 0xD5, 0x00, 0x00, 0x16, +/* 00004750 */ 0xD6, 0x00, 0x00, 0x17, 0xD6, 0x00, 0x00, 0x4B, 0xD6, 0x00, 0x00, 0x98, 0xD6, 0x00, 0x00, 0xAE, +/* 00004760 */ 0xD6, 0x00, 0x00, 0xAF, 0xD6, 0x00, 0x00, 0xEA, 0xD6, 0x00, 0x00, 0x30, 0xD7, 0x00, 0x00, 0x31, +/* 00004770 */ 0xD7, 0x00, 0x00, 0x67, 0xD7, 0x00, 0x00, 0xA6, 0xD7, 0x00, 0x00, 0xEB, 0xD7, 0x00, 0x00, 0x01, +/* 00004780 */ 0xD8, 0x00, 0x00, 0x02, 0xD8, 0x00, 0x00, 0x4E, 0xD8, 0x00, 0x00, 0x4F, 0xD8, 0x00, 0x00, 0xB4, +/* 00004790 */ 0xD8, 0x00, 0x00, 0xF0, 0xD8, 0x00, 0x00, 0xF1, 0xD8, 0x00, 0x00, 0x11, 0xD9, 0x00, 0x00, 0x23, +/* 000047A0 */ 0xD9, 0x00, 0x00, 0x69, 0xD9, 0x00, 0x00, 0x6A, 0xD9, 0x00, 0x00, 0x8F, 0xD9, 0x00, 0x00, 0xBD, +/* 000047B0 */ 0xD9, 0x00, 0x00, 0xBE, 0xD9, 0x00, 0x00, 0xF2, 0xD9, 0x00, 0x00, 0x5B, 0xDA, 0x00, 0x00, 0x71, +/* 000047C0 */ 0xDA, 0x00, 0x00, 0x72, 0xDA, 0x00, 0x00, 0xB9, 0xDA, 0x00, 0x00, 0x1A, 0xDB, 0x00, 0x00, 0x83, +/* 000047D0 */ 0xDB, 0x00, 0x00, 0x99, 0xDB, 0x00, 0x00, 0x9A, 0xDB, 0x00, 0x00, 0xF2, 0xDB, 0x00, 0x00, 0x4C, +/* 000047E0 */ 0xDC, 0x00, 0x00, 0x5E, 0xDC, 0x00, 0x00, 0xAF, 0xDC, 0x00, 0x00, 0xB0, 0xDC, 0x00, 0x00, 0x4A, +/* 000047F0 */ 0xDD, 0x00, 0x00, 0x4B, 0xDD, 0x00, 0x00, 0xC7, 0xDD, 0x00, 0x00, 0x45, 0xDE, 0x00, 0x00, 0x69, +/* 00004800 */ 0xDE, 0x00, 0x00, 0x6A, 0xDE, 0x00, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x4B, 0xDF, 0x00, 0x00, 0xE8, +/* 00004810 */ 0xDF, 0x00, 0x00, 0xE9, 0xDF, 0x00, 0x00, 0x3B, 0xE0, 0x00, 0x00, 0x73, 0xE0, 0x00, 0x00, 0xAB, +/* 00004820 */ 0xE0, 0x00, 0x00, 0x21, 0xE1, 0x00, 0x00, 0x3B, 0xE1, 0x00, 0x00, 0x86, 0xE1, 0x00, 0x00, 0xEB, +/* 00004830 */ 0xE1, 0x00, 0x00, 0x61, 0xE2, 0x00, 0x00, 0x7B, 0xE2, 0x00, 0x00, 0x7C, 0xE2, 0x00, 0x00, 0xC2, +/* 00004840 */ 0xE2, 0x00, 0x00, 0xC3, 0xE2, 0x00, 0x00, 0x1F, 0xE3, 0x00, 0x00, 0x75, 0xE3, 0x00, 0x00, 0xCC, +/* 00004850 */ 0xE3, 0x00, 0x00, 0xEA, 0xE3, 0x00, 0x00, 0x06, 0xE4, 0x00, 0x00, 0x07, 0xE4, 0x00, 0x00, 0x49, +/* 00004860 */ 0xE4, 0x00, 0x00, 0x96, 0xE4, 0x00, 0x00, 0xAA, 0xE4, 0x00, 0x00, 0xAB, 0xE4, 0x00, 0x00, 0xF4, +/* 00004870 */ 0xE4, 0x00, 0x00, 0x3B, 0xE5, 0x00, 0x00, 0x73, 0xE5, 0x00, 0x00, 0xE0, 0xE5, 0x00, 0x00, 0xFA, +/* 00004880 */ 0xE5, 0x00, 0x00, 0xFB, 0xE5, 0x00, 0x00, 0x46, 0xE6, 0x00, 0x00, 0xAB, 0xE6, 0x00, 0x00, 0x18, +/* 00004890 */ 0xE7, 0x00, 0x00, 0x32, 0xE7, 0x00, 0x00, 0x33, 0xE7, 0x00, 0x00, 0x6E, 0xE7, 0x00, 0x00, 0xAC, +/* 000048A0 */ 0xE7, 0x00, 0x00, 0xC0, 0xE7, 0x00, 0x00, 0xC1, 0xE7, 0x00, 0x00, 0xE6, 0xE7, 0x00, 0x00, 0xF4, +/* 000048B0 */ 0xE7, 0x00, 0x00, 0xFE, 0xE7, 0x00, 0x00, 0x4D, 0xE8, 0x00, 0x00, 0x67, 0xE8, 0x00, 0x00, 0x71, +/* 000048C0 */ 0xE8, 0x00, 0x00, 0x72, 0xE8, 0x00, 0x00, 0xF2, 0xE8, 0x00, 0x00, 0x1A, 0xE9, 0x00, 0x00, 0x1B, +/* 000048D0 */ 0xE9, 0x00, 0x00, 0x55, 0xE9, 0x00, 0x00, 0x9B, 0xE9, 0x00, 0x00, 0xC8, 0xE9, 0x00, 0x00, 0xFE, +/* 000048E0 */ 0xE9, 0x00, 0x00, 0x17, 0xEA, 0x00, 0x00, 0x51, 0xEA, 0x00, 0x00, 0x63, 0xEA, 0x00, 0x00, 0x64, +/* 000048F0 */ 0xEA, 0x00, 0x00, 0x8D, 0xEA, 0x00, 0x00, 0xCE, 0xEA, 0x00, 0x00, 0x61, 0xEB, 0x00, 0x00, 0x8F, +/* 00004900 */ 0xEB, 0x00, 0x00, 0xA5, 0xEB, 0x00, 0x00, 0xB7, 0xEB, 0x00, 0x00, 0xF8, 0xEB, 0x00, 0x00, 0x6E, +/* 00004910 */ 0xEC, 0x00, 0x00, 0x9C, 0xEC, 0x00, 0x00, 0xB2, 0xEC, 0x00, 0x00, 0xC4, 0xEC, 0x00, 0x00, 0xC5, +/* 00004920 */ 0xEC, 0x00, 0x00, 0x18, 0xED, 0x00, 0x00, 0x54, 0xED, 0x00, 0x00, 0x8E, 0xED, 0x00, 0x00, 0xCB, +/* 00004930 */ 0xED, 0x00, 0x00, 0xE3, 0xED, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x5A, 0xEE, 0x00, 0x00, 0x97, +/* 00004940 */ 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xEA, 0xEE, 0x00, 0x00, 0x24, 0xEF, 0x00, 0x00, 0x61, +/* 00004950 */ 0xEF, 0x00, 0x00, 0x79, 0xEF, 0x00, 0x00, 0x8B, 0xEF, 0x00, 0x00, 0xDE, 0xEF, 0x00, 0x00, 0x1A, +/* 00004960 */ 0xF0, 0x00, 0x00, 0x54, 0xF0, 0x00, 0x00, 0x91, 0xF0, 0x00, 0x00, 0xA9, 0xF0, 0x00, 0x00, 0xE7, +/* 00004970 */ 0xF0, 0x00, 0x00, 0x21, 0xF1, 0x00, 0x00, 0x5E, 0xF1, 0x00, 0x00, 0x76, 0xF1, 0x00, 0x00, 0xB4, +/* 00004980 */ 0xF1, 0x00, 0x00, 0xEE, 0xF1, 0x00, 0x00, 0x2B, 0xF2, 0x00, 0x00, 0x43, 0xF2, 0x00, 0x00, 0x55, +/* 00004990 */ 0xF2, 0x00, 0x00, 0x75, 0xF2, 0x00, 0x00, 0x83, 0xF2, 0x00, 0x00, 0x84, 0xF2, 0x00, 0x00, 0x0E, +/* 000049A0 */ 0xF3, 0x00, 0x00, 0x4B, 0xF3, 0x00, 0x00, 0x6E, 0xF3, 0x00, 0x00, 0x6F, 0xF3, 0x00, 0x00, 0x96, +/* 000049B0 */ 0xF3, 0x00, 0x00, 0xED, 0xF3, 0x00, 0x00, 0x4D, 0xF4, 0x00, 0x00, 0x8A, 0xF4, 0x00, 0x00, 0xE3, +/* 000049C0 */ 0xF4, 0x00, 0x00, 0xF9, 0xF4, 0x00, 0x00, 0x0B, 0xF5, 0x00, 0x00, 0x0C, 0xF5, 0x00, 0x00, 0x37, +/* 000049D0 */ 0xF5, 0x00, 0x00, 0x5B, 0xF5, 0x00, 0x00, 0x91, 0xF5, 0x00, 0x00, 0xEC, 0xF5, 0x00, 0x00, 0x29, +/* 000049E0 */ 0xF6, 0x00, 0x00, 0x7D, 0xF6, 0x00, 0x00, 0x93, 0xF6, 0x00, 0x00, 0xA5, 0xF6, 0x00, 0x00, 0xA6, +/* 000049F0 */ 0xF6, 0x00, 0x00, 0xCB, 0xF6, 0x00, 0x00, 0x21, 0xF7, 0x00, 0x00, 0x78, 0xF7, 0x00, 0x00, 0xD2, +/* 00004A00 */ 0xF7, 0x00, 0x00, 0x2E, 0xF8, 0x00, 0x00, 0x69, 0xF8, 0x00, 0x00, 0xBE, 0xF8, 0x00, 0x00, 0xD4, +/* 00004A10 */ 0xF8, 0x00, 0x00, 0xE6, 0xF8, 0x00, 0x00, 0xE7, 0xF8, 0x00, 0x00, 0x0A, 0xF9, 0x00, 0x00, 0x54, +/* 00004A20 */ 0xF9, 0x00, 0x00, 0x66, 0xF9, 0x00, 0x00, 0x67, 0xF9, 0x00, 0x00, 0x93, 0xF9, 0x00, 0x00, 0xCF, +/* 00004A30 */ 0xF9, 0x00, 0x00, 0x2E, 0xFA, 0x00, 0x00, 0x70, 0xFA, 0x00, 0x00, 0xC8, 0xFA, 0x00, 0x00, 0xDE, +/* 00004A40 */ 0xFA, 0x00, 0x00, 0xF0, 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0x57, 0xFB, 0x00, 0x00, 0x7F, +/* 00004A50 */ 0xFB, 0x00, 0x00, 0xCB, 0xFB, 0x00, 0x00, 0xE1, 0xFB, 0x00, 0x00, 0xF5, 0xFB, 0x00, 0x00, 0xF6, +/* 00004A60 */ 0xFB, 0x00, 0x00, 0x2C, 0xFC, 0x00, 0x00, 0xA2, 0xFC, 0x00, 0x00, 0xB0, 0xFC, 0x00, 0x00, 0xB1, +/* 00004A70 */ 0xFC, 0x00, 0x00, 0xDE, 0xFC, 0x00, 0x00, 0x0E, 0xFD, 0x00, 0x00, 0x3A, 0xFD, 0x00, 0x00, 0x66, +/* 00004A80 */ 0xFD, 0x00, 0x00, 0x96, 0xFD, 0x00, 0x00, 0xC2, 0xFD, 0x00, 0x00, 0xEE, 0xFD, 0x00, 0x00, 0x23, +/* 00004A90 */ 0xFE, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x00, 0x76, 0xFE, 0x00, 0x00, 0x85, 0xFE, 0x00, 0x00, 0x86, +/* 00004AA0 */ 0xFE, 0x00, 0x00, 0xBD, 0xFE, 0x00, 0x00, 0xF4, 0xFE, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x25, +/* 00004AB0 */ 0xFF, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x00, 0x6E, 0xFF, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x7D, +/* 00004AC0 */ 0xFF, 0x00, 0x00, 0xED, 0xFF, 0x00, 0x00, 0x49, 0x00, 0x01, 0x00, 0xBF, 0x00, 0x01, 0x00, 0x50, +/* 00004AD0 */ 0x01, 0x01, 0x00, 0xCE, 0x01, 0x01, 0x00, 0xF4, 0x01, 0x01, 0x00, 0xE9, 0x02, 0x01, 0x00, 0x13, +/* 00004AE0 */ 0x03, 0x01, 0x00, 0x25, 0x03, 0x01, 0x00, 0x26, 0x03, 0x01, 0x00, 0x69, 0x03, 0x01, 0x00, 0xEB, +/* 00004AF0 */ 0x03, 0x01, 0x00, 0x1E, 0x04, 0x01, 0x00, 0xD4, 0x04, 0x01, 0x00, 0xE6, 0x04, 0x01, 0x00, 0x0C, +/* 00004B00 */ 0x05, 0x01, 0x00, 0x1A, 0x05, 0x01, 0x00, 0x1B, 0x05, 0x01, 0x00, 0x80, 0x05, 0x01, 0x00, 0xCA, +/* 00004B10 */ 0x05, 0x01, 0x00, 0x3E, 0x06, 0x01, 0x00, 0xCF, 0x06, 0x01, 0x00, 0xF5, 0x06, 0x01, 0x00, 0xF5, +/* 00004B20 */ 0x07, 0x01, 0x00, 0x1F, 0x08, 0x01, 0x00, 0x31, 0x08, 0x01, 0x00, 0x32, 0x08, 0x01, 0x00, 0x7C, +/* 00004B30 */ 0x08, 0x01, 0x00, 0xAB, 0x08, 0x01, 0x00, 0x29, 0x09, 0x01, 0x00, 0x5E, 0x09, 0x01, 0x00, 0xD9, +/* 00004B40 */ 0x09, 0x01, 0x00, 0xEB, 0x09, 0x01, 0x00, 0xEC, 0x09, 0x01, 0x00, 0x12, 0x0A, 0x01, 0x00, 0x20, +/* 00004B50 */ 0x0A, 0x01, 0x00, 0x21, 0x0A, 0x01, 0x00, 0x83, 0x0A, 0x01, 0x00, 0xCE, 0x0A, 0x01, 0x00, 0x0C, +/* 00004B60 */ 0x0B, 0x01, 0x00, 0x85, 0x0B, 0x01, 0x00, 0x97, 0x0B, 0x01, 0x00, 0x98, 0x0B, 0x01, 0x00, 0xD2, +/* 00004B70 */ 0x0B, 0x01, 0x00, 0x3F, 0x0C, 0x01, 0x00, 0x9E, 0x0C, 0x01, 0x00, 0x13, 0x0D, 0x01, 0x00, 0x25, +/* 00004B80 */ 0x0D, 0x01, 0x00, 0x26, 0x0D, 0x01, 0x00, 0x61, 0x0D, 0x01, 0x00, 0xCC, 0x0D, 0x01, 0x00, 0xF6, +/* 00004B90 */ 0x0D, 0x01, 0x00, 0x6A, 0x0E, 0x01, 0x00, 0x87, 0x0E, 0x01, 0x00, 0x0A, 0x0F, 0x01, 0x00, 0x20, +/* 00004BA0 */ 0x0F, 0x01, 0x00, 0x5F, 0x0F, 0x01, 0x00, 0xCA, 0x0F, 0x01, 0x00, 0xF4, 0x0F, 0x01, 0x00, 0x68, +/* 00004BB0 */ 0x10, 0x01, 0x00, 0x85, 0x10, 0x01, 0x00, 0xFE, 0x10, 0x01, 0x00, 0x14, 0x11, 0x01, 0x00, 0x26, +/* 00004BC0 */ 0x11, 0x01, 0x00, 0x27, 0x11, 0x01, 0x00, 0xBC, 0x11, 0x01, 0x00, 0x48, 0x12, 0x01, 0x00, 0xBB, +/* 00004BD0 */ 0x12, 0x01, 0x00, 0xFE, 0x12, 0x01, 0x00, 0x7A, 0x13, 0x01, 0x00, 0x8C, 0x13, 0x01, 0x00, 0x8D, +/* 00004BE0 */ 0x13, 0x01, 0x00, 0xC7, 0x13, 0x01, 0x00, 0x3F, 0x14, 0x01, 0x00, 0x51, 0x14, 0x01, 0x00, 0x52, +/* 00004BF0 */ 0x14, 0x01, 0x00, 0x8D, 0x14, 0x01, 0x00, 0x07, 0x15, 0x01, 0x00, 0x19, 0x15, 0x01, 0x00, 0x1A, +/* 00004C00 */ 0x15, 0x01, 0x00, 0x57, 0x15, 0x01, 0x00, 0xD5, 0x15, 0x01, 0x00, 0xE7, 0x15, 0x01, 0x00, 0xE8, +/* 00004C10 */ 0x15, 0x01, 0x00, 0x25, 0x16, 0x01, 0x00, 0xA3, 0x16, 0x01, 0x00, 0xB5, 0x16, 0x01, 0x00, 0xB6, +/* 00004C20 */ 0x16, 0x01, 0x00, 0xF9, 0x16, 0x01, 0x00, 0x76, 0x17, 0x01, 0x00, 0x88, 0x17, 0x01, 0x00, 0x89, +/* 00004C30 */ 0x17, 0x01, 0x00, 0xAF, 0x17, 0x01, 0x00, 0xBD, 0x17, 0x01, 0x00, 0xBE, 0x17, 0x01, 0x00, 0x13, +/* 00004C40 */ 0x18, 0x01, 0x00, 0x4C, 0x18, 0x01, 0x00, 0x7C, 0x18, 0x01, 0x00, 0x8E, 0x18, 0x01, 0x00, 0x8F, +/* 00004C50 */ 0x18, 0x01, 0x00, 0x2A, 0x19, 0x01, 0x00, 0x8C, 0x19, 0x01, 0x00, 0x9E, 0x19, 0x01, 0x00, 0x9F, +/* 00004C60 */ 0x19, 0x01, 0x00, 0xDE, 0x19, 0x01, 0x00, 0xDF, 0x19, 0x01, 0x00, 0x06, 0x1A, 0x01, 0x00, 0x4B, +/* 00004C70 */ 0x1A, 0x01, 0x00, 0x4C, 0x1A, 0x01, 0x00, 0xBD, 0x1A, 0x01, 0x00, 0x1C, 0x1B, 0x01, 0x00, 0x1D, +/* 00004C80 */ 0x1B, 0x01, 0x00, 0x4B, 0x1B, 0x01, 0x00, 0x9E, 0x1B, 0x01, 0x00, 0xB7, 0x1B, 0x01, 0x00, 0xF5, +/* 00004C90 */ 0x1B, 0x01, 0x00, 0x07, 0x1C, 0x01, 0x00, 0x08, 0x1C, 0x01, 0x00, 0x36, 0x1C, 0x01, 0x00, 0x71, +/* 00004CA0 */ 0x1C, 0x01, 0x00, 0x83, 0x1C, 0x01, 0x00, 0x84, 0x1C, 0x01, 0x00, 0xA6, 0x1C, 0x01, 0x00, 0x15, +/* 00004CB0 */ 0x1D, 0x01, 0x00, 0x7C, 0x1D, 0x01, 0x00, 0xE0, 0x1D, 0x01, 0x00, 0x61, 0x1E, 0x01, 0x00, 0xC3, +/* 00004CC0 */ 0x1E, 0x01, 0x00, 0x27, 0x1F, 0x01, 0x00, 0x8F, 0x1F, 0x01, 0x00, 0xF7, 0x1F, 0x01, 0x00, 0x66, +/* 00004CD0 */ 0x20, 0x01, 0x00, 0x67, 0x20, 0x01, 0x00, 0xD6, 0x20, 0x01, 0x00, 0x4C, 0x21, 0x01, 0x00, 0x4D, +/* 00004CE0 */ 0x21, 0x01, 0x00, 0xBD, 0x21, 0x01, 0x00, 0xBE, 0x21, 0x01, 0x00, 0x0F, 0x22, 0x01, 0x00, 0x35, +/* 00004CF0 */ 0x22, 0x01, 0x00, 0x53, 0x22, 0x01, 0x00, 0x73, 0x22, 0x01, 0x00, 0x95, 0x22, 0x01, 0x00, 0xB3, +/* 00004D00 */ 0x22, 0x01, 0x00, 0xD3, 0x22, 0x01, 0x00, 0xF7, 0x22, 0x01, 0x00, 0x1B, 0x23, 0x01, 0x00, 0x4A, +/* 00004D10 */ 0x23, 0x01, 0x00, 0x65, 0x23, 0x01, 0x00, 0x66, 0x23, 0x01, 0x00, 0x8E, 0x23, 0x01, 0x00, 0xCF, +/* 00004D20 */ 0x23, 0x01, 0x00, 0x42, 0x24, 0x01, 0x00, 0x43, 0x24, 0x01, 0x00, 0x69, 0x24, 0x01, 0x00, 0x9D, +/* 00004D30 */ 0x24, 0x01, 0x00, 0xD3, 0x24, 0x01, 0x00, 0x18, 0x25, 0x01, 0x00, 0x19, 0x25, 0x01, 0x00, 0x3B, +/* 00004D40 */ 0x25, 0x01, 0x00, 0x6F, 0x25, 0x01, 0x00, 0x9B, 0x25, 0x01, 0x00, 0xC9, 0x25, 0x01, 0x00, 0xF9, +/* 00004D50 */ 0x25, 0x01, 0x00, 0x25, 0x26, 0x01, 0x00, 0x53, 0x26, 0x01, 0x00, 0x85, 0x26, 0x01, 0x00, 0xB7, +/* 00004D60 */ 0x26, 0x01, 0x00, 0xF5, 0x26, 0x01, 0x00, 0xF6, 0x26, 0x01, 0x00, 0x28, 0x27, 0x01, 0x00, 0x68, +/* 00004D70 */ 0x27, 0x01, 0x00, 0xA6, 0x27, 0x01, 0x00, 0xA7, 0x27, 0x01, 0x00, 0xE9, 0x27, 0x01, 0x00, 0xEA, +/* 00004D80 */ 0x27, 0x01, 0x00, 0xFD, 0x27, 0x01, 0x00, 0x16, 0x28, 0x01, 0x00, 0x6B, 0x28, 0x01, 0x00, 0xE2, +/* 00004D90 */ 0x28, 0x01, 0x00, 0x84, 0x29, 0x01, 0x00, 0x28, 0x2A, 0x01, 0x00, 0x8D, 0x2A, 0x01, 0x00, 0xA1, +/* 00004DA0 */ 0x2A, 0x01, 0x00, 0xCA, 0x2A, 0x01, 0x00, 0xCB, 0x2A, 0x01, 0x00, 0xE1, 0x2A, 0x01, 0x00, 0x30, +/* 00004DB0 */ 0x2B, 0x01, 0x00, 0x71, 0x2B, 0x01, 0x00, 0x8F, 0x2B, 0x01, 0x00, 0xB9, 0x2B, 0x01, 0x00, 0xE3, +/* 00004DC0 */ 0x2B, 0x01, 0x00, 0xE4, 0x2B, 0x01, 0x00, 0x52, 0x2C, 0x01, 0x00, 0xA8, 0x2C, 0x01, 0x00, 0xFC, +/* 00004DD0 */ 0x2C, 0x01, 0x00, 0x66, 0x2D, 0x01, 0x00, 0x8E, 0x2D, 0x01, 0x00, 0xA0, 0x2D, 0x01, 0x00, 0xA1, +/* 00004DE0 */ 0x2D, 0x01, 0x00, 0xC5, 0x2D, 0x01, 0x00, 0xF7, 0x2D, 0x01, 0x00, 0x77, 0x2E, 0x01, 0x00, 0x89, +/* 00004DF0 */ 0x2E, 0x01, 0x00, 0x8A, 0x2E, 0x01, 0x00, 0xA0, 0x2E, 0x01, 0x00, 0xD5, 0x2E, 0x01, 0x00, 0x15, +/* 00004E00 */ 0x2F, 0x01, 0x00, 0x33, 0x2F, 0x01, 0x00, 0x5D, 0x2F, 0x01, 0x00, 0x87, 0x2F, 0x01, 0x00, 0x88, +/* 00004E10 */ 0x2F, 0x01, 0x00, 0xEA, 0x2F, 0x01, 0x00, 0x6F, 0x30, 0x01, 0x00, 0xD4, 0x30, 0x01, 0x00, 0x0F, +/* 00004E20 */ 0x31, 0x01, 0x00, 0x21, 0x31, 0x01, 0x00, 0x22, 0x31, 0x01, 0x00, 0x4F, 0x31, 0x01, 0x00, 0xB4, +/* 00004E30 */ 0x31, 0x01, 0x00, 0xB5, 0x31, 0x01, 0x00, 0x37, 0x32, 0x01, 0x00, 0x72, 0x32, 0x01, 0x00, 0xD1, +/* 00004E40 */ 0x32, 0x01, 0x00, 0xE3, 0x32, 0x01, 0x00, 0x26, 0x33, 0x01, 0x00, 0x34, 0x33, 0x01, 0x00, 0x35, +/* 00004E50 */ 0x33, 0x01, 0x00, 0x8B, 0x33, 0x01, 0x00, 0xE9, 0x33, 0x01, 0x00, 0x39, 0x34, 0x01, 0x00, 0x5C, +/* 00004E60 */ 0x34, 0x01, 0x00, 0x83, 0x34, 0x01, 0x00, 0xA9, 0x34, 0x01, 0x00, 0xBF, 0x34, 0x01, 0x00, 0xC0, +/* 00004E70 */ 0x34, 0x01, 0x00, 0x35, 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0xC2, 0x35, 0x01, 0x00, 0xD4, +/* 00004E80 */ 0x35, 0x01, 0x00, 0x27, 0x36, 0x01, 0x00, 0x5F, 0x36, 0x01, 0x00, 0x8A, 0x36, 0x01, 0x00, 0x9C, +/* 00004E90 */ 0x36, 0x01, 0x00, 0x9D, 0x36, 0x01, 0x00, 0xCA, 0x36, 0x01, 0x00, 0x0C, 0x37, 0x01, 0x00, 0x7A, +/* 00004EA0 */ 0x37, 0x01, 0x00, 0xC9, 0x37, 0x01, 0x00, 0xFA, 0x37, 0x01, 0x00, 0x55, 0x38, 0x01, 0x00, 0x72, +/* 00004EB0 */ 0x38, 0x01, 0x00, 0x9C, 0x38, 0x01, 0x00, 0xDA, 0x38, 0x01, 0x00, 0x54, 0x39, 0x01, 0x00, 0xAF, +/* 00004EC0 */ 0x39, 0x01, 0x00, 0xC5, 0x39, 0x01, 0x00, 0xD7, 0x39, 0x01, 0x00, 0xD8, 0x39, 0x01, 0x00, 0xFC, +/* 00004ED0 */ 0x39, 0x01, 0x00, 0x36, 0x3A, 0x01, 0x00, 0xA8, 0x3A, 0x01, 0x00, 0xBA, 0x3A, 0x01, 0x00, 0xBB, +/* 00004EE0 */ 0x3A, 0x01, 0x00, 0x19, 0x3B, 0x01, 0x00, 0x27, 0x3B, 0x01, 0x00, 0x28, 0x3B, 0x01, 0x00, 0xA5, +/* 00004EF0 */ 0x3B, 0x01, 0x00, 0x31, 0x3C, 0x01, 0x00, 0xB0, 0x3C, 0x01, 0x00, 0x39, 0x3D, 0x01, 0x00, 0x5E, +/* 00004F00 */ 0x3D, 0x01, 0x00, 0x6D, 0x3D, 0x01, 0x00, 0xF8, 0x3D, 0x01, 0x00, 0x7E, 0x3E, 0x01, 0x00, 0x08, +/* 00004F10 */ 0x3F, 0x01, 0x00, 0x5C, 0x3F, 0x01, 0x00, 0x6B, 0x3F, 0x01, 0x00, 0xED, 0x3F, 0x01, 0x00, 0x5E, +/* 00004F20 */ 0x40, 0x01, 0x00, 0xB9, 0x40, 0x01, 0x00, 0x24, 0x41, 0x01, 0x00, 0x9E, 0x41, 0x01, 0x00, 0xEF, +/* 00004F30 */ 0x41, 0x01, 0x00, 0xFE, 0x41, 0x01, 0x00, 0x74, 0x42, 0x01, 0x00, 0x83, 0x42, 0x01, 0x00, 0x0F, +/* 00004F40 */ 0x43, 0x01, 0x00, 0x98, 0x43, 0x01, 0x00, 0xE3, 0x43, 0x01, 0x00, 0xE4, 0x43, 0x01, 0x00, 0x34, +/* 00004F50 */ 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0x56, 0x45, 0x01, 0x00, 0x7F, 0x45, 0x01, 0x00, 0x25, +/* 00004F60 */ 0x46, 0x01, 0x00, 0x26, 0x46, 0x01, 0x00, 0x76, 0x46, 0x01, 0x00, 0x17, 0x47, 0x01, 0x00, 0x9C, +/* 00004F70 */ 0x47, 0x01, 0x00, 0xC5, 0x47, 0x01, 0x00, 0x79, 0x48, 0x01, 0x00, 0x7A, 0x48, 0x01, 0x00, 0xCA, +/* 00004F80 */ 0x48, 0x01, 0x00, 0x6B, 0x49, 0x01, 0x00, 0xF0, 0x49, 0x01, 0x00, 0x19, 0x4A, 0x01, 0x00, 0xCD, +/* 00004F90 */ 0x4A, 0x01, 0x00, 0xCE, 0x4A, 0x01, 0x00, 0xF5, 0x4A, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x88, +/* 00004FA0 */ 0x4B, 0x01, 0x00, 0xCD, 0x4B, 0x01, 0x00, 0xE3, 0x4B, 0x01, 0x00, 0xE4, 0x4B, 0x01, 0x00, 0x1B, +/* 00004FB0 */ 0x4C, 0x01, 0x00, 0x4F, 0x4C, 0x01, 0x00, 0x9E, 0x4C, 0x01, 0x00, 0xB4, 0x4C, 0x01, 0x00, 0xB5, +/* 00004FC0 */ 0x4C, 0x01, 0x00, 0xF0, 0x4C, 0x01, 0x00, 0x36, 0x4D, 0x01, 0x00, 0x37, 0x4D, 0x01, 0x00, 0x6D, +/* 00004FD0 */ 0x4D, 0x01, 0x00, 0xAC, 0x4D, 0x01, 0x00, 0xF1, 0x4D, 0x01, 0x00, 0x07, 0x4E, 0x01, 0x00, 0x08, +/* 00004FE0 */ 0x4E, 0x01, 0x00, 0x56, 0x4E, 0x01, 0x00, 0x57, 0x4E, 0x01, 0x00, 0xBD, 0x4E, 0x01, 0x00, 0xF9, +/* 00004FF0 */ 0x4E, 0x01, 0x00, 0xFA, 0x4E, 0x01, 0x00, 0x1A, 0x4F, 0x01, 0x00, 0x2C, 0x4F, 0x01, 0x00, 0x76, +/* 00005000 */ 0x4F, 0x01, 0x00, 0x77, 0x4F, 0x01, 0x00, 0x9F, 0x4F, 0x01, 0x00, 0xD3, 0x4F, 0x01, 0x00, 0x40, +/* 00005010 */ 0x50, 0x01, 0x00, 0x56, 0x50, 0x01, 0x00, 0x9D, 0x50, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x6D, +/* 00005020 */ 0x51, 0x01, 0x00, 0x83, 0x51, 0x01, 0x00, 0x84, 0x51, 0x01, 0x00, 0xD6, 0x51, 0x01, 0x00, 0x0B, +/* 00005030 */ 0x52, 0x01, 0x00, 0x21, 0x52, 0x01, 0x00, 0x22, 0x52, 0x01, 0x00, 0x51, 0x52, 0x01, 0x00, 0x7F, +/* 00005040 */ 0x52, 0x01, 0x00, 0xBB, 0x52, 0x01, 0x00, 0xD8, 0x52, 0x01, 0x00, 0x07, 0x53, 0x01, 0x00, 0x1D, +/* 00005050 */ 0x53, 0x01, 0x00, 0x1E, 0x53, 0x01, 0x00, 0x73, 0x53, 0x01, 0x00, 0x85, 0x53, 0x01, 0x00, 0xD8, +/* 00005060 */ 0x53, 0x01, 0x00, 0xD9, 0x53, 0x01, 0x00, 0x20, 0x54, 0x01, 0x00, 0x21, 0x54, 0x01, 0x00, 0xBE, +/* 00005070 */ 0x54, 0x01, 0x00, 0x08, 0x55, 0x01, 0x00, 0xA9, 0x55, 0x01, 0x00, 0xAA, 0x55, 0x01, 0x00, 0xF5, +/* 00005080 */ 0x55, 0x01, 0x00, 0x3C, 0x56, 0x01, 0x00, 0x74, 0x56, 0x01, 0x00, 0xE5, 0x56, 0x01, 0x00, 0xFF, +/* 00005090 */ 0x56, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x4B, 0x57, 0x01, 0x00, 0xB2, 0x57, 0x01, 0x00, 0x23, +/* 000050A0 */ 0x58, 0x01, 0x00, 0x3D, 0x58, 0x01, 0x00, 0x3E, 0x58, 0x01, 0x00, 0x79, 0x58, 0x01, 0x00, 0xB7, +/* 000050B0 */ 0x58, 0x01, 0x00, 0xCB, 0x58, 0x01, 0x00, 0xCC, 0x58, 0x01, 0x00, 0x20, 0x59, 0x01, 0x00, 0x58, +/* 000050C0 */ 0x59, 0x01, 0x00, 0x90, 0x59, 0x01, 0x00, 0x0A, 0x5A, 0x01, 0x00, 0x24, 0x5A, 0x01, 0x00, 0x6F, +/* 000050D0 */ 0x5A, 0x01, 0x00, 0xD6, 0x5A, 0x01, 0x00, 0x50, 0x5B, 0x01, 0x00, 0x6A, 0x5B, 0x01, 0x00, 0x9C, +/* 000050E0 */ 0x5B, 0x01, 0x00, 0xD7, 0x5B, 0x01, 0x00, 0x2E, 0x5C, 0x01, 0x00, 0x93, 0x5C, 0x01, 0x00, 0xD2, +/* 000050F0 */ 0x5C, 0x01, 0x00, 0x0D, 0x5D, 0x01, 0x00, 0x4A, 0x5D, 0x01, 0x00, 0x7F, 0x5D, 0x01, 0x00, 0xB6, +/* 00005100 */ 0x5D, 0x01, 0x00, 0xEF, 0x5D, 0x01, 0x00, 0x24, 0x5E, 0x01, 0x00, 0x5B, 0x5E, 0x01, 0x00, 0x96, +/* 00005110 */ 0x5E, 0x01, 0x00, 0xD1, 0x5E, 0x01, 0x00, 0x17, 0x5F, 0x01, 0x00, 0x38, 0x5F, 0x01, 0x00, 0x76, +/* 00005120 */ 0x5F, 0x01, 0x00, 0xE8, 0x5F, 0x01, 0x00, 0x8A, 0x60, 0x01, 0x00, 0xC6, 0x60, 0x01, 0x00, 0xE4, +/* 00005130 */ 0x60, 0x01, 0x00, 0x0E, 0x61, 0x01, 0x00, 0x56, 0x61, 0x01, 0x00, 0xA3, 0x61, 0x01, 0x00, 0xB7, +/* 00005140 */ 0x61, 0x01, 0x00, 0xB8, 0x61, 0x01, 0x00, 0x56, 0x62, 0x01, 0x00, 0x57, 0x62, 0x01, 0x00, 0x7E, +/* 00005150 */ 0x62, 0x01, 0x00, 0x8C, 0x62, 0x01, 0x00, 0x96, 0x62, 0x01, 0x00, 0xE7, 0x62, 0x01, 0x00, 0x01, +/* 00005160 */ 0x63, 0x01, 0x00, 0x0B, 0x63, 0x01, 0x00, 0x0C, 0x63, 0x01, 0x00, 0x3D, 0x63, 0x01, 0x00, 0x5C, +/* 00005170 */ 0x63, 0x01, 0x00, 0xF2, 0x63, 0x01, 0x00, 0x88, 0x64, 0x01, 0x00, 0x1E, 0x65, 0x01, 0x00, 0xB4, +/* 00005180 */ 0x65, 0x01, 0x00, 0xBA, 0x65, 0x01, 0x00, 0xBE, 0x65, 0x01, 0x00, 0x00, 0x53, 0xB9, 0x0C, 0x00, +/* 00005190 */ 0x00, 0x00, 0x04, 0x02, 0xA8, 0x41, 0xC0, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, 0x70, 0x01, 0x01, +/* 000051A0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFF, 0x4E, 0x64, 0x01, 0x00, 0xFF, 0x4E, 0x64, +/* 000051B0 */ 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x0A, 0x09, 0xA8, +/* 000051C0 */ 0x00, 0xD4, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0xD3, +/* 000051D0 */ 0x51, 0x00, 0x00, 0xBF, 0x1D, 0x80, 0xE0, 0x89, 0xC6, 0x12, 0x07, 0x01, 0xA2, 0x41, 0xD1, 0x00, +/* 000051E0 */ 0x01, 0xFE, 0x90, 0x01, 0x21, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x90, 0x01, 0xFF, +/* 000051F0 */ 0x2B, 0x64, 0x01, 0x00, 0xFF, 0x2B, 0x64, 0x01, 0x00, 0x40, 0x4B, 0x18, 0x3D, 0x51, 0x09, 0xFE, +/* 00005200 */ 0x47, 0x02, 0xFE, 0x41, 0x02, 0x0F, 0x4B, 0x4A, 0x4B, 0x4B, 0x15, 0x4E, 0x4F, 0x50, 0x0B, 0x06, +/* 00005210 */ 0xFE, 0xE6, 0x02, 0x06, 0xFE, 0xE7, 0x02, 0x06, 0xFE, 0xE8, 0x02, 0x06, 0xFE, 0xE9, 0x02, 0x06, +/* 00005220 */ 0xFE, 0xEA, 0x02, 0x07, 0x08, 0x06, 0xFE, 0xEB, 0x02, 0x01, 0x00, 0x06, 0xFE, 0xEC, 0x02, 0x06, +/* 00005230 */ 0xFE, 0xED, 0x02, 0x01, 0x01, 0x06, 0xFE, 0xEE, 0x02, 0x01, 0x02, 0x06, 0xFE, 0xEF, 0x02, 0x01, +/* 00005240 */ 0x03, 0x06, 0xFE, 0xF0, 0x02, 0x01, 0x04, 0x06, 0xFE, 0xF1, 0x02, 0x01, 0x05, 0x06, 0xFE, 0xF2, +/* 00005250 */ 0x02, 0x05, 0xFE, 0xF3, 0x02, 0x05, 0xFE, 0xF4, 0x02, 0x05, 0xFE, 0xF5, 0x02, 0x05, 0xFE, 0xF6, +/* 00005260 */ 0x02, 0x05, 0xFE, 0xF7, 0x02, 0x06, 0xFE, 0xF8, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xFA, +/* 00005270 */ 0x02, 0x05, 0xFE, 0xFB, 0x02, 0x06, 0xFE, 0xFC, 0x02, 0x06, 0xFE, 0xFD, 0x02, 0x05, 0xFE, 0xFE, +/* 00005280 */ 0x02, 0x06, 0xFE, 0xFF, 0x02, 0x06, 0xFE, 0x00, 0x03, 0x06, 0xFE, 0x01, 0x03, 0x05, 0xFE, 0x02, +/* 00005290 */ 0x03, 0x06, 0xFE, 0x03, 0x03, 0x06, 0xFE, 0x04, 0x03, 0x05, 0xFE, 0x05, 0x03, 0x06, 0xFE, 0x06, +/* 000052A0 */ 0x03, 0x06, 0xFE, 0x07, 0x03, 0x05, 0xFE, 0x08, 0x03, 0x06, 0xFE, 0x09, 0x03, 0x06, 0xFE, 0x0A, +/* 000052B0 */ 0x03, 0x06, 0xFE, 0x0B, 0x03, 0x06, 0xFE, 0x0C, 0x03, 0x06, 0xFE, 0x0D, 0x03, 0x06, 0xFE, 0x0E, +/* 000052C0 */ 0x03, 0x06, 0xFE, 0x0F, 0x03, 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x06, 0xFE, 0x12, +/* 000052D0 */ 0x03, 0x06, 0xFE, 0x13, 0x03, 0x0C, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x06, 0xFE, +/* 000052E0 */ 0x16, 0x03, 0xFE, 0x1C, 0x08, 0x96, 0x38, 0x3E, 0xD4, 0x0E, 0x3F, 0x96, 0x02, 0x3F, 0xD4, 0x0F, +/* 000052F0 */ 0x40, 0x96, 0x03, 0x40, 0xD4, 0x10, 0x41, 0x96, 0x04, 0x41, 0xD4, 0x11, 0x42, 0x96, 0x05, 0x42, +/* 00005300 */ 0xD4, 0x12, 0x43, 0x96, 0x06, 0x43, 0xD4, 0x13, 0x44, 0x96, 0x07, 0x44, 0xD4, 0x14, 0x45, 0x96, +/* 00005310 */ 0x08, 0x45, 0x4F, 0x46, 0x4F, 0x49, 0x4F, 0x4A, 0x4F, 0x51, 0x96, 0x39, 0x51, 0x4F, 0x51, 0x96, +/* 00005320 */ 0x3A, 0x51, 0x4F, 0x51, 0x96, 0x3B, 0x51, 0x4F, 0x51, 0x96, 0x3C, 0x51, 0x4F, 0x51, 0x96, 0x3D, +/* 00005330 */ 0x51, 0x4F, 0x51, 0x96, 0x3E, 0x51, 0x4F, 0x51, 0x96, 0x3F, 0x51, 0x4F, 0x51, 0x96, 0x40, 0x51, +/* 00005340 */ 0x4F, 0x51, 0x96, 0x41, 0x51, 0x4F, 0x51, 0x96, 0x42, 0x51, 0x4F, 0x51, 0x96, 0x43, 0x51, 0x4F, +/* 00005350 */ 0x51, 0x96, 0x44, 0x51, 0x4F, 0x51, 0x96, 0x45, 0x51, 0x4F, 0x51, 0x96, 0x46, 0x51, 0x4F, 0x51, +/* 00005360 */ 0x96, 0x47, 0x51, 0x4F, 0x51, 0x96, 0x48, 0x51, 0x4F, 0x51, 0x96, 0x49, 0x51, 0x4F, 0x51, 0x96, +/* 00005370 */ 0x4A, 0x51, 0x4F, 0x51, 0x96, 0x4B, 0x51, 0x4F, 0x51, 0x96, 0x4C, 0x51, 0x61, 0x51, 0x3D, 0x00, +/* 00005380 */ 0x96, 0x09, 0x51, 0x92, 0x09, 0x51, 0x76, 0x02, 0x51, 0x01, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, +/* 00005390 */ 0x02, 0xA8, 0x52, 0x14, 0x03, 0x00, 0x51, 0x52, 0x09, 0x15, 0x00, 0x92, 0x09, 0x51, 0x92, 0x09, +/* 000053A0 */ 0x52, 0x61, 0x52, 0x52, 0x03, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x52, 0x52, 0x76, 0x52, 0x51, 0x04, +/* 000053B0 */ 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x05, 0xA8, 0x52, 0x14, 0x03, 0x00, 0x51, 0x52, 0x09, 0x15, +/* 000053C0 */ 0x00, 0x92, 0x09, 0x51, 0x92, 0x09, 0x52, 0x61, 0x52, 0x52, 0x03, 0x07, 0x01, 0x00, 0xC2, 0x01, +/* 000053D0 */ 0x52, 0x52, 0x76, 0x52, 0x51, 0x06, 0x92, 0x09, 0x52, 0x61, 0x52, 0x52, 0x07, 0xAC, 0x51, 0x0F, +/* 000053E0 */ 0x02, 0x00, 0x52, 0xAB, 0x51, 0x96, 0x39, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x08, 0x47, +/* 000053F0 */ 0x46, 0x51, 0x96, 0x3A, 0x03, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x09, 0x96, 0x0A, 0x51, 0x92, +/* 00005400 */ 0x09, 0x51, 0x61, 0x51, 0x51, 0x0A, 0x96, 0x0B, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x0B, +/* 00005410 */ 0x96, 0x0C, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x0C, 0x96, 0x0D, 0x51, 0x92, 0x09, 0x51, +/* 00005420 */ 0x61, 0x51, 0x51, 0x0D, 0x96, 0x0E, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x0E, 0x96, 0x0F, +/* 00005430 */ 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x0F, 0x96, 0x10, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, +/* 00005440 */ 0x51, 0x10, 0x96, 0x11, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x11, 0x96, 0x12, 0x51, 0x92, +/* 00005450 */ 0x09, 0x51, 0x61, 0x51, 0x51, 0x12, 0x96, 0x13, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x13, +/* 00005460 */ 0x47, 0x47, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x14, 0x96, 0x14, 0x51, 0x92, 0x0A, 0x51, +/* 00005470 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, +/* 00005480 */ 0x00, 0x00, 0x00, 0x92, 0x09, 0x53, 0x61, 0x53, 0x53, 0x15, 0x7A, 0x53, 0x52, 0x16, 0x92, 0x09, +/* 00005490 */ 0x53, 0x61, 0x53, 0x53, 0x17, 0x7A, 0x53, 0x52, 0x18, 0x92, 0x09, 0x53, 0x61, 0x53, 0x53, 0x19, +/* 000054A0 */ 0x7A, 0x53, 0x52, 0x1A, 0x92, 0x09, 0x53, 0x61, 0x53, 0x53, 0x1B, 0x7A, 0x53, 0x52, 0x1C, 0x5C, +/* 000054B0 */ 0x01, 0x52, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x51, 0x51, 0x96, 0x15, 0x51, 0x92, 0x09, 0x51, 0x61, +/* 000054C0 */ 0x51, 0x51, 0x1D, 0x96, 0x16, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x1E, 0x96, 0x17, 0x51, +/* 000054D0 */ 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x1F, 0x96, 0x18, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, +/* 000054E0 */ 0x20, 0x96, 0x19, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x21, 0x96, 0x1A, 0x51, 0xD4, 0x00, +/* 000054F0 */ 0x51, 0x96, 0x1B, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x22, 0x96, 0x1C, 0x51, 0x92, 0x09, +/* 00005500 */ 0x51, 0x61, 0x51, 0x51, 0x23, 0x96, 0x1D, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x24, 0x96, +/* 00005510 */ 0x1E, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x25, 0x96, 0x1F, 0x51, 0x92, 0x09, 0x51, 0x61, +/* 00005520 */ 0x51, 0x51, 0x26, 0x96, 0x20, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x27, 0x96, 0x21, 0x51, +/* 00005530 */ 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x28, 0x96, 0x22, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, +/* 00005540 */ 0x29, 0x96, 0x23, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x2A, 0x96, 0x24, 0x51, 0x92, 0x09, +/* 00005550 */ 0x51, 0x61, 0x51, 0x51, 0x2B, 0x96, 0x25, 0x51, 0x92, 0x16, 0x51, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00005560 */ 0x09, 0xCB, 0x52, 0x5C, 0x01, 0x52, 0x1F, 0x02, 0x51, 0x51, 0x47, 0x48, 0x51, 0x92, 0x09, 0x51, +/* 00005570 */ 0x61, 0x51, 0x51, 0x2C, 0x96, 0x26, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x2D, 0x96, 0x27, +/* 00005580 */ 0x51, 0x92, 0x0A, 0x51, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, +/* 00005590 */ 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x0B, 0x52, 0x2E, 0x7A, 0x0B, 0x52, 0x2F, 0x7A, +/* 000055A0 */ 0x0E, 0x52, 0x30, 0x7A, 0x10, 0x52, 0x31, 0x7A, 0x12, 0x52, 0x32, 0x7A, 0x14, 0x52, 0x33, 0x7A, +/* 000055B0 */ 0x16, 0x52, 0x34, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x51, 0x51, 0x96, 0x3B, 0x51, +/* 000055C0 */ 0xA8, 0x51, 0x96, 0x3C, 0x51, 0xD4, 0x01, 0x51, 0x96, 0x3D, 0x51, 0xD4, 0x02, 0x51, 0x96, 0x3E, +/* 000055D0 */ 0x51, 0xD4, 0x03, 0x51, 0x96, 0x3F, 0x51, 0xD4, 0x04, 0x51, 0x96, 0x28, 0x51, 0xD4, 0x05, 0x51, +/* 000055E0 */ 0x96, 0x29, 0x51, 0xD4, 0x06, 0x51, 0x96, 0x2A, 0x51, 0xD4, 0x07, 0x51, 0x96, 0x2B, 0x51, 0xD4, +/* 000055F0 */ 0x08, 0x51, 0x96, 0x2C, 0x51, 0xD4, 0x09, 0x51, 0x96, 0x2D, 0x51, 0xD4, 0x0A, 0x51, 0x96, 0x2E, +/* 00005600 */ 0x51, 0xD4, 0x0B, 0x51, 0x96, 0x2F, 0x51, 0xA8, 0x51, 0x96, 0x40, 0x51, 0xD4, 0x0C, 0x51, 0x96, +/* 00005610 */ 0x30, 0x51, 0xD4, 0x0D, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, 0x96, +/* 00005620 */ 0x31, 0x51, 0xA8, 0x51, 0x96, 0x41, 0x51, 0xA8, 0x51, 0x96, 0x42, 0x51, 0xA8, 0x51, 0x96, 0x43, +/* 00005630 */ 0x51, 0xA8, 0x51, 0x96, 0x44, 0x51, 0xD4, 0x15, 0x51, 0x96, 0x32, 0x51, 0xD4, 0x16, 0x51, 0x96, +/* 00005640 */ 0x33, 0x51, 0xD4, 0x17, 0x51, 0x96, 0x34, 0x51, 0x92, 0x0A, 0x51, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00005650 */ 0x09, 0xCB, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x51, 0x51, 0x54, 0x49, 0x51, +/* 00005660 */ 0x92, 0x09, 0x52, 0x6C, 0x51, 0x52, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x52, 0x5C, 0x01, 0x49, +/* 00005670 */ 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x3C, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 00005680 */ 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x18, 0x54, 0x36, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, +/* 00005690 */ 0x1F, 0x03, 0x53, 0x53, 0x5C, 0x02, 0x53, 0x1F, 0x03, 0xFF, 0x51, 0x96, 0x45, 0x19, 0x92, 0x0C, +/* 000056A0 */ 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x52, 0x5C, 0x01, 0x52, 0x92, 0x2A, 0x52, +/* 000056B0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x45, 0x53, 0x5C, 0x01, 0x53, 0xD4, 0x18, 0x53, 0x5C, +/* 000056C0 */ 0x02, 0x53, 0x1F, 0x03, 0x52, 0x52, 0x5C, 0x02, 0x52, 0x5C, 0x03, 0x49, 0x1F, 0x04, 0x51, 0x51, +/* 000056D0 */ 0x96, 0x46, 0x51, 0x96, 0x47, 0x1A, 0x92, 0x0C, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, +/* 000056E0 */ 0x20, 0x52, 0x5C, 0x01, 0x52, 0x92, 0x2A, 0x52, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x47, +/* 000056F0 */ 0x53, 0x5C, 0x01, 0x53, 0xD4, 0x19, 0x53, 0x5C, 0x02, 0x53, 0x1F, 0x03, 0x52, 0x52, 0x5C, 0x02, +/* 00005700 */ 0x52, 0x5C, 0x03, 0x49, 0x1F, 0x04, 0x51, 0x51, 0x96, 0x48, 0x51, 0x96, 0x49, 0x1B, 0x92, 0x0C, +/* 00005710 */ 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x52, 0x5C, 0x01, 0x52, 0x92, 0x2A, 0x52, +/* 00005720 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x49, 0x53, 0x5C, 0x01, 0x53, 0xD4, 0x1A, 0x53, 0x5C, +/* 00005730 */ 0x02, 0x53, 0x1F, 0x03, 0x52, 0x52, 0x5C, 0x02, 0x52, 0x5C, 0x03, 0x49, 0x1F, 0x04, 0x51, 0x51, +/* 00005740 */ 0x96, 0x4A, 0x51, 0x96, 0x4B, 0x1C, 0x92, 0x0C, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, +/* 00005750 */ 0x20, 0x52, 0x5C, 0x01, 0x52, 0x92, 0x2A, 0x52, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x4B, +/* 00005760 */ 0x53, 0x5C, 0x01, 0x53, 0xD4, 0x1B, 0x53, 0x5C, 0x02, 0x53, 0x1F, 0x03, 0x52, 0x52, 0x5C, 0x02, +/* 00005770 */ 0x52, 0x5C, 0x03, 0x49, 0x1F, 0x04, 0x51, 0x51, 0x54, 0x4A, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, +/* 00005780 */ 0x00, 0x5C, 0x00, 0x09, 0x92, 0x46, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x1D, 0xCC, 0x48, 0x00, +/* 00005790 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x52, 0x37, 0x5C, 0x03, +/* 000057A0 */ 0x52, 0x1F, 0x04, 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x48, +/* 000057B0 */ 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x1D, 0xCC, 0x54, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +/* 000057C0 */ 0x52, 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x52, 0x37, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, 0x92, +/* 000057D0 */ 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x4A, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, +/* 000057E0 */ 0x1D, 0xCC, 0x60, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x1F, +/* 000057F0 */ 0x52, 0x37, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, +/* 00005800 */ 0x00, 0x09, 0x5C, 0x01, 0x4A, 0x5C, 0x02, 0x1D, 0xCC, 0x6C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, +/* 00005810 */ 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x20, 0x52, 0x37, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, +/* 00005820 */ 0x92, 0x0A, 0x51, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x07, 0x00, +/* 00005830 */ 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 00005840 */ 0xA4, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x23, 0x54, 0x38, +/* 00005850 */ 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, 0x52, 0x39, 0x92, 0x0A, +/* 00005860 */ 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, +/* 00005870 */ 0x54, 0x00, 0x00, 0x00, 0x7A, 0x23, 0x54, 0x38, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, +/* 00005880 */ 0x53, 0x53, 0x7A, 0x53, 0x52, 0x3A, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 00005890 */ 0xBC, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x27, 0x54, 0x3B, +/* 000058A0 */ 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, 0x52, 0x3C, 0x92, 0x0A, +/* 000058B0 */ 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xC8, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, +/* 000058C0 */ 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2A, 0x54, 0x3D, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, +/* 000058D0 */ 0x53, 0x53, 0x7A, 0x53, 0x52, 0x3E, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 000058E0 */ 0xD4, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2D, 0x54, 0x3F, +/* 000058F0 */ 0x7A, 0x2A, 0x54, 0x3D, 0x7A, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, +/* 00005900 */ 0x53, 0x53, 0x7A, 0x53, 0x52, 0x41, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 00005910 */ 0xE8, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2A, 0x54, 0x3D, +/* 00005920 */ 0x7A, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, +/* 00005930 */ 0x52, 0x42, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xF8, 0x00, 0x00, 0x00, +/* 00005940 */ 0x0E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2A, 0x54, 0x3D, 0x7A, 0x2F, 0x54, 0x40, +/* 00005950 */ 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, 0x52, 0x43, 0x92, 0x0A, +/* 00005960 */ 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x08, 0x01, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, +/* 00005970 */ 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2E, 0x54, 0x40, 0x7A, 0x2F, 0x54, 0x44, 0x5C, 0x01, 0x54, 0x5C, +/* 00005980 */ 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, 0x52, 0x45, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, +/* 00005990 */ 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 000059A0 */ 0x7A, 0x2E, 0x54, 0x40, 0x7A, 0x2F, 0x54, 0x44, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, +/* 000059B0 */ 0x53, 0x53, 0x7A, 0x53, 0x52, 0x46, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x51, 0x51, +/* 000059C0 */ 0x96, 0x35, 0x51, 0xD4, 0x1C, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, +/* 000059D0 */ 0x96, 0x36, 0x51, 0xA8, 0x51, 0x96, 0x4C, 0x51, 0xD4, 0x1D, 0x51, 0x96, 0x37, 0x51, 0xD4, 0x1E, +/* 000059E0 */ 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, 0x47, 0x4B, 0x51, 0xD4, 0x1F, +/* 000059F0 */ 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, 0x47, 0x4C, 0x51, 0xD4, 0x20, +/* 00005A00 */ 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, 0x47, 0x4D, 0x51, 0x92, 0x38, +/* 00005A10 */ 0x51, 0x14, 0x03, 0x00, 0x51, 0x35, 0x09, 0xE4, 0x00, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, +/* 00005A20 */ 0x00, 0x09, 0x6A, 0x4A, 0x00, 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x36, 0xCC, 0x28, +/* 00005A30 */ 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x4B, 0x52, 0x37, 0x7A, +/* 00005A40 */ 0x02, 0x52, 0x47, 0x7A, 0x39, 0x52, 0x48, 0x7A, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0x1F, 0x04, +/* 00005A50 */ 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x4A, 0x00, 0x00, 0x00, +/* 00005A60 */ 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x3B, 0xCC, 0x40, 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, +/* 00005A70 */ 0x52, 0x00, 0x00, 0x00, 0x7A, 0x4C, 0x52, 0x37, 0x7A, 0x02, 0x52, 0x47, 0x7A, 0x39, 0x52, 0x48, +/* 00005A80 */ 0x7A, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, +/* 00005A90 */ 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x4A, 0x00, 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x3C, +/* 00005AA0 */ 0xCC, 0x58, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x4D, 0x52, +/* 00005AB0 */ 0x37, 0x7A, 0x02, 0x52, 0x47, 0x7A, 0x39, 0x52, 0x48, 0x7A, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, +/* 00005AC0 */ 0x1F, 0x04, 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x4A, 0x00, +/* 00005AD0 */ 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x20, 0xCC, 0x70, 0x01, 0x00, 0x00, 0x14, 0x00, +/* 00005AE0 */ 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x4A, 0x52, 0x37, 0x7A, 0x02, 0x52, 0x47, 0x7A, 0x39, +/* 00005AF0 */ 0x52, 0x48, 0x7A, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, 0xA8, 0x00, 0x24, +/* 00005B00 */ 0x00, 0x15, 0xFE, 0x88, 0x01, 0x00, 0x70, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00005B10 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00005B20 */ 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00005B30 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x40, 0x01, +/* 00005B40 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 00005B50 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x03, 0x04, +/* 00005B60 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00005B70 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, +/* 00005B80 */ 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x03, 0x02, +/* 00005B90 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0xF8, 0x00, +/* 00005BA0 */ 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x09, 0x03, +/* 00005BB0 */ 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, +/* 00005BC0 */ 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, +/* 00005BD0 */ 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0xC8, 0x00, +/* 00005BE0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0xBC, 0x00, +/* 00005BF0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0xB0, 0x00, +/* 00005C00 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, 0x00, 0xA4, 0x00, +/* 00005C10 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, 0x00, 0x78, 0x00, +/* 00005C20 */ 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x00, 0x00, 0xFF, 0x02, +/* 00005C30 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x0B, 0x03, +/* 00005C40 */ 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x6C, 0x00, +/* 00005C50 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0x60, 0x00, +/* 00005C60 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0x54, 0x00, +/* 00005C70 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0x48, 0x00, +/* 00005C80 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0x3C, 0x00, +/* 00005C90 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x18, 0x00, +/* 00005CA0 */ 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x02, 0x00, 0x00, 0xEC, 0x02, +/* 00005CB0 */ 0x00, 0x00, 0xED, 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, 0x00, 0xF0, 0x02, +/* 00005CC0 */ 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00005CD0 */ 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x25, 0x00, +/* 00005CE0 */ 0x00, 0x00, 0xDD, 0xFE, 0x17, 0x03, 0xFE, 0x18, 0x03, 0xF9, 0xFE, 0x18, 0x03, 0xFE, 0x19, 0x03, +/* 00005CF0 */ 0xFE, 0x19, 0x03, 0xFE, 0xAC, 0x02, 0xFE, 0xAC, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x38, 0x02, 0xFE, +/* 00005D00 */ 0x3A, 0x02, 0x84, 0xFE, 0x35, 0x01, 0xFE, 0x5B, 0x01, 0xFE, 0x30, 0x01, 0xFE, 0x7D, 0x01, 0x96, +/* 00005D10 */ 0xA9, 0xF9, 0xFE, 0x0A, 0x02, 0xFE, 0x3C, 0x02, 0x17, 0xFE, 0x3D, 0x02, 0x1F, 0xFE, 0x3E, 0x02, +/* 00005D20 */ 0xFE, 0x21, 0x01, 0xFE, 0x3F, 0x02, 0x25, 0xFE, 0x41, 0x02, 0xFE, 0x42, 0x02, 0xFE, 0x43, 0x02, +/* 00005D30 */ 0xFE, 0x44, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x48, 0x02, 0xFE, 0x49, 0x02, 0xFE, 0x4A, 0x02, 0xFE, +/* 00005D40 */ 0x4B, 0x02, 0xFE, 0x4C, 0x02, 0xFE, 0x4D, 0x02, 0xFE, 0x4E, 0x02, 0xFE, 0x51, 0x02, 0xFE, 0x52, +/* 00005D50 */ 0x02, 0xFE, 0x53, 0x02, 0xFE, 0x54, 0x02, 0xFE, 0x55, 0x02, 0xFE, 0xEB, 0x02, 0xFE, 0xEC, 0x02, +/* 00005D60 */ 0xFE, 0xED, 0x02, 0xFE, 0xEE, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF0, 0x02, 0xFE, 0xF1, 0x02, 0xFE, +/* 00005D70 */ 0x36, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xFD, 0x02, 0xFE, 0xFC, 0x02, 0xFE, 0xFF, +/* 00005D80 */ 0x02, 0xFE, 0x01, 0x03, 0xFE, 0x00, 0x03, 0xFE, 0x04, 0x03, 0xFE, 0x03, 0x03, 0xFE, 0x07, 0x03, +/* 00005D90 */ 0xFE, 0x09, 0x03, 0xFE, 0x06, 0x03, 0xFE, 0x0B, 0x03, 0xFE, 0x0C, 0x03, 0xFE, 0x0E, 0x03, 0xFE, +/* 00005DA0 */ 0x0D, 0x03, 0xFE, 0x0F, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, 0x01, 0xDD, 0xFE, +/* 00005DB0 */ 0x1A, 0x03, 0xFE, 0x1B, 0x03, 0xFE, 0x1C, 0x03, 0xFE, 0x1D, 0x03, 0xFE, 0x1E, 0x03, 0xFE, 0x1F, +/* 00005DC0 */ 0x03, 0xFE, 0x20, 0x03, 0xFE, 0x21, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x23, 0x03, 0xFE, 0x24, 0x03, +/* 00005DD0 */ 0x84, 0xFE, 0x35, 0x01, 0xFE, 0x5B, 0x01, 0xFE, 0x30, 0x01, 0xFE, 0x7D, 0x01, 0x96, 0xA9, 0xFE, +/* 00005DE0 */ 0x25, 0x03, 0xFA, 0xFE, 0x26, 0x03, 0xFE, 0x27, 0x03, 0xFE, 0x28, 0x03, 0xFE, 0x29, 0x03, 0xFE, +/* 00005DF0 */ 0x2A, 0x03, 0xFE, 0x2B, 0x03, 0xFE, 0x2C, 0x03, 0xFE, 0x2D, 0x03, 0xFE, 0x2E, 0x03, 0xFE, 0x2F, +/* 00005E00 */ 0x03, 0xFE, 0x30, 0x03, 0xFE, 0x31, 0x03, 0xFE, 0x32, 0x03, 0xFE, 0x33, 0x03, 0xFE, 0x34, 0x03, +/* 00005E10 */ 0xFE, 0x35, 0x03, 0xE3, 0xE6, 0xFE, 0x36, 0x03, 0xFE, 0x37, 0x03, 0xFE, 0x38, 0x03, 0xFE, 0x2C, +/* 00005E20 */ 0x02, 0xFE, 0x2B, 0x02, 0xFE, 0x39, 0x03, 0xFE, 0x3A, 0x03, 0xFE, 0x3B, 0x03, 0xFE, 0x3C, 0x03, +/* 00005E30 */ 0xFE, 0x3D, 0x03, 0xFE, 0x3E, 0x03, 0xFE, 0x3F, 0x03, 0xFE, 0x7B, 0x02, 0xFE, 0x40, 0x03, 0xFE, +/* 00005E40 */ 0x41, 0x03, 0xFE, 0x42, 0x03, 0xFE, 0x43, 0x03, 0xFE, 0x44, 0x03, 0xFE, 0xE6, 0x02, 0xFE, 0x45, +/* 00005E50 */ 0x03, 0xFE, 0x46, 0x03, 0xFE, 0x47, 0x03, 0xFE, 0x48, 0x03, 0xFE, 0x49, 0x03, 0xFE, 0x4A, 0x03, +/* 00005E60 */ 0xFE, 0x4B, 0x03, 0xFE, 0x4C, 0x03, 0xFE, 0x4D, 0x03, 0xFE, 0x4E, 0x03, 0xFE, 0x4F, 0x03, 0xFE, +/* 00005E70 */ 0x50, 0x03, 0xFE, 0x51, 0x03, 0xFE, 0x52, 0x03, 0xFE, 0x53, 0x03, 0xFE, 0x54, 0x03, 0xFE, 0x55, +/* 00005E80 */ 0x03, 0xFE, 0x56, 0x03, 0xFE, 0xBB, 0x01, 0x5B, 0x97, 0x00, 0x00, 0x00, 0x07, 0x00, 0xA4, 0x00, +/* 00005E90 */ 0x07, 0x00, 0x20, 0x00, 0x11, 0x00, 0x38, 0x00, 0x15, 0x00, 0x3B, 0x00, 0x11, 0x00, 0x39, 0x00, +/* 00005EA0 */ 0x15, 0x00, 0xD4, 0x00, 0x12, 0x00, 0x30, 0x00, 0x0A, 0x00, 0x45, 0x00, 0x03, 0x00, 0x35, 0x00, +/* 00005EB0 */ 0x0A, 0x00, 0x35, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x0A, 0x00, 0x24, 0x00, +/* 00005EC0 */ 0x0A, 0x00, 0x22, 0x00, 0x0A, 0x00, 0x22, 0x00, 0x0A, 0x00, 0x22, 0x00, 0x0A, 0x00, 0x22, 0x00, +/* 00005ED0 */ 0x0A, 0x00, 0x1E, 0x00, 0x0A, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x1D, 0x00, 0x0A, 0x00, 0x2D, 0x00, +/* 00005EE0 */ 0x4F, 0x00, 0xC8, 0x00, 0x0A, 0x00, 0x54, 0x00, 0x0A, 0x00, 0x50, 0x00, 0x0A, 0x00, 0x5E, 0x00, +/* 00005EF0 */ 0x0A, 0x00, 0x02, 0x01, 0x0A, 0x00, 0x55, 0x00, 0x06, 0x00, 0x94, 0x00, 0x0A, 0x00, 0x4C, 0x00, +/* 00005F00 */ 0x0A, 0x00, 0x4C, 0x00, 0x0A, 0x00, 0x46, 0x00, 0x0A, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x4C, 0x00, +/* 00005F10 */ 0x0A, 0x00, 0x4A, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x0A, 0x00, 0x4E, 0x00, 0x0A, 0x00, 0x56, 0x00, +/* 00005F20 */ 0x0A, 0x00, 0x57, 0x00, 0x15, 0x00, 0x35, 0x00, 0x0A, 0x00, 0x3E, 0x00, 0x0A, 0x00, 0xA4, 0x00, +/* 00005F30 */ 0x3F, 0x00, 0x05, 0x01, 0x05, 0x00, 0x25, 0x00, 0x06, 0x00, 0xE9, 0x01, 0x06, 0x00, 0x0C, 0x02, +/* 00005F40 */ 0x06, 0x00, 0x90, 0x01, 0x06, 0x00, 0x58, 0x01, 0x06, 0x00, 0x9A, 0x00, 0x06, 0x00, 0x70, 0x00, +/* 00005F50 */ 0x06, 0x00, 0xA7, 0x04, 0x06, 0x00, 0x93, 0x04, 0x06, 0x00, 0x31, 0x04, 0x06, 0x00, 0xB1, 0x09, +/* 00005F60 */ 0x06, 0x00, 0xEF, 0x02, 0x05, 0x00, 0x2D, 0x00, 0x06, 0x00, 0x93, 0x03, 0x10, 0x00, 0x89, 0x0A, +/* 00005F70 */ 0x05, 0x00, 0x75, 0x00, 0x05, 0x00, 0x38, 0x00, 0x05, 0x00, 0x4C, 0x00, 0x05, 0x00, 0x83, 0x1C, +/* 00005F80 */ 0x06, 0x00, 0xC0, 0x01, 0x06, 0x00, 0xDF, 0x01, 0x06, 0x00, 0x80, 0x03, 0x18, 0x00, 0x3C, 0x00, +/* 00005F90 */ 0x3B, 0x00, 0x25, 0x01, 0x03, 0x00, 0x51, 0x00, 0x35, 0x00, 0x69, 0x01, 0x03, 0x00, 0x59, 0x00, +/* 00005FA0 */ 0x35, 0x00, 0x79, 0x01, 0x03, 0x00, 0x5D, 0x00, 0x35, 0x00, 0x81, 0x01, 0x03, 0x00, 0x41, 0x00, +/* 00005FB0 */ 0x35, 0x00, 0xAD, 0x02, 0x2A, 0x00, 0x60, 0x00, 0x2A, 0x00, 0x64, 0x00, 0x2A, 0x00, 0x66, 0x00, +/* 00005FC0 */ 0x27, 0x00, 0x49, 0x01, 0xA3, 0x01, 0x51, 0x05, 0x10, 0x00, 0xCA, 0x03, 0x05, 0x00, 0x2B, 0x00, +/* 00005FD0 */ 0x06, 0x00, 0x3B, 0x09, 0x10, 0x00, 0xE9, 0x2E, 0x10, 0x00, 0x16, 0x37, 0x10, 0x00, 0x4B, 0x7A, +/* 00005FE0 */ 0x0B, 0x00, 0x23, 0x00, 0x39, 0x00, 0x96, 0x00, 0x39, 0x00, 0x96, 0x00, 0x39, 0x00, 0x96, 0x00, +/* 00005FF0 */ 0x3B, 0x00, 0x94, 0x00, 0x00, 0x90, 0xDC, 0x00, 0x00, 0xCF, 0xDB, 0x00, 0x00, 0x32, 0xDB, 0x00, +/* 00006000 */ 0x00, 0x50, 0xDA, 0x00, 0x00, 0xC9, 0xD9, 0x00, 0x00, 0x59, 0xD9, 0x00, 0x00, 0xFB, 0xD8, 0x00, +/* 00006010 */ 0x00, 0x1B, 0xD7, 0x00, 0x00, 0x6A, 0xD5, 0x00, 0x00, 0x32, 0xD4, 0x00, 0x00, 0x95, 0xD0, 0x00, +/* 00006020 */ 0x00, 0x59, 0xCF, 0x00, 0x00, 0x06, 0xCE, 0x00, 0x00, 0xA6, 0xC9, 0x00, 0x00, 0xFF, 0xC7, 0x00, +/* 00006030 */ 0x00, 0xC3, 0xC6, 0x00, 0x00, 0x78, 0xC6, 0x00, 0x00, 0xD5, 0xC2, 0x00, 0x00, 0x27, 0xC2, 0x00, +/* 00006040 */ 0x00, 0xAC, 0xBF, 0x00, 0x00, 0x66, 0xBD, 0x00, 0x00, 0x7F, 0xBC, 0x00, 0x00, 0x9B, 0xBB, 0x00, +/* 00006050 */ 0x00, 0x04, 0xBA, 0x00, 0x00, 0x8F, 0xB9, 0x00, 0x00, 0x1A, 0xB9, 0x00, 0x00, 0xA5, 0xB8, 0x00, +/* 00006060 */ 0x00, 0x41, 0xB8, 0x00, 0x00, 0x68, 0xB6, 0x00, 0x00, 0x61, 0xB3, 0x00, 0x00, 0xEC, 0xA0, 0x00, +/* 00006070 */ 0x00, 0xE7, 0x8C, 0x00, 0x00, 0x79, 0x60, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0xA9, 0xD6, 0x92, +/* 00006080 */ 0xFE, 0xD1, 0x04, 0x1A, 0xA0, 0x41, 0xD1, 0x00, 0x3E, 0xFE, 0x0C, 0xE9, 0x0F, 0xFF, 0x00, 0x10, +/* 00006090 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0x0C, 0xE9, 0xFE, 0xFA, 0x79, 0xFE, 0xFA, 0x79, 0x01, 0x15, 0x36, +/* 000060A0 */ 0x44, 0x09, 0xF0, 0xF0, 0x01, 0x09, 0x19, 0x19, 0x19, 0x19, 0x07, 0x02, 0x41, 0x42, 0x43, 0x44, +/* 000060B0 */ 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xFB, 0x03, 0x06, 0xFE, 0xFC, 0x03, 0x05, 0xFE, 0xFD, 0x03, +/* 000060C0 */ 0x06, 0xFE, 0xFE, 0x03, 0x05, 0xFE, 0xFF, 0x03, 0x06, 0xFE, 0x00, 0x04, 0x05, 0xFE, 0x01, 0x04, +/* 000060D0 */ 0x06, 0xFE, 0x02, 0x04, 0x05, 0xFE, 0x03, 0x04, 0x06, 0xFE, 0x04, 0x04, 0x05, 0xFE, 0x05, 0x04, +/* 000060E0 */ 0x06, 0xFE, 0x06, 0x04, 0x05, 0xFE, 0x07, 0x04, 0x06, 0xFE, 0x08, 0x04, 0x05, 0xFE, 0x09, 0x04, +/* 000060F0 */ 0x06, 0xFE, 0x0A, 0x04, 0x05, 0xFE, 0x0B, 0x04, 0x06, 0xFE, 0x0C, 0x04, 0x05, 0xFE, 0x0D, 0x04, +/* 00006100 */ 0x07, 0x06, 0xFE, 0x0E, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x0F, 0x04, 0x01, 0x01, 0x06, 0xFE, 0x10, +/* 00006110 */ 0x04, 0x01, 0x02, 0x08, 0x05, 0xFE, 0x11, 0x04, 0x05, 0xFE, 0x12, 0x04, 0x06, 0xFE, 0x13, 0x04, +/* 00006120 */ 0x05, 0xFE, 0x14, 0x04, 0x06, 0xFE, 0x15, 0x04, 0x05, 0xFE, 0x16, 0x04, 0x05, 0xFE, 0x17, 0x04, +/* 00006130 */ 0x05, 0xFE, 0x18, 0x04, 0x05, 0xFE, 0x19, 0x04, 0x05, 0xFE, 0x1A, 0x04, 0x05, 0xFE, 0xF4, 0x03, +/* 00006140 */ 0x06, 0xFE, 0xB4, 0x03, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0C, 0x06, 0xFE, 0x13, +/* 00006150 */ 0x03, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0xB5, 0x03, 0x0B, 0x06, 0xFE, 0xEB, 0x03, 0x06, 0xFE, +/* 00006160 */ 0xB8, 0x03, 0x05, 0xFE, 0xEC, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, 0xFA, 0x02, 0xFE, 0xA7, +/* 00006170 */ 0x03, 0x4F, 0x40, 0xA8, 0x36, 0xA8, 0x37, 0xA8, 0x38, 0xA8, 0x39, 0xA8, 0x3A, 0xA8, 0x3B, 0xA8, +/* 00006180 */ 0x3C, 0xA8, 0x3D, 0xA8, 0x3E, 0xA8, 0x3F, 0x8E, 0x01, 0x38, 0x46, 0x14, 0x0F, 0x00, 0x46, 0x02, +/* 00006190 */ 0x09, 0x00, 0x00, 0x8E, 0x01, 0x38, 0x46, 0x14, 0x03, 0x00, 0x46, 0x03, 0x09, 0x70, 0x03, 0xDE, +/* 000061A0 */ 0x00, 0x0B, 0x01, 0xB8, 0x46, 0x00, 0x01, 0x51, 0x01, 0x00, 0x36, 0x46, 0x95, 0x00, 0x02, 0x36, +/* 000061B0 */ 0x01, 0x51, 0x01, 0x01, 0x37, 0x46, 0x95, 0x00, 0x03, 0x37, 0x01, 0x51, 0x01, 0x02, 0x38, 0x46, +/* 000061C0 */ 0x95, 0x00, 0x04, 0x38, 0x01, 0x51, 0x01, 0x03, 0x39, 0x46, 0x95, 0x00, 0x05, 0x39, 0x01, 0x51, +/* 000061D0 */ 0x01, 0x04, 0x3A, 0x46, 0x95, 0x00, 0x06, 0x3A, 0x01, 0x51, 0x01, 0x05, 0x3B, 0x46, 0x95, 0x00, +/* 000061E0 */ 0x07, 0x3B, 0x01, 0x51, 0x01, 0x06, 0x3C, 0x46, 0x95, 0x00, 0x08, 0x3C, 0x01, 0x51, 0x01, 0x07, +/* 000061F0 */ 0x3D, 0x46, 0x95, 0x00, 0x09, 0x3D, 0x4F, 0x46, 0x95, 0x00, 0x0A, 0x46, 0xCC, 0x00, 0x00, 0x00, +/* 00006200 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x7A, 0x05, 0x46, 0x00, 0x7A, 0x07, 0x46, +/* 00006210 */ 0x01, 0x7A, 0x09, 0x46, 0x02, 0x7A, 0x0B, 0x46, 0x03, 0x7A, 0x0D, 0x46, 0x04, 0x7A, 0x0F, 0x46, +/* 00006220 */ 0x05, 0x7A, 0x11, 0x46, 0x06, 0x7A, 0x13, 0x46, 0x07, 0x7A, 0x15, 0x46, 0x08, 0x96, 0x02, 0x46, +/* 00006230 */ 0xCD, 0x46, 0x03, 0xA8, 0x47, 0xA1, 0x00, 0x47, 0x46, 0xA8, 0x47, 0xA1, 0x01, 0x47, 0x46, 0xA8, +/* 00006240 */ 0x47, 0xA1, 0x02, 0x47, 0x46, 0x95, 0x00, 0x0A, 0x46, 0x8E, 0x01, 0x0A, 0x46, 0x07, 0x03, 0x00, +/* 00006250 */ 0x5C, 0x00, 0x1D, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, +/* 00006260 */ 0x7A, 0x18, 0x47, 0x09, 0x7A, 0x1A, 0x47, 0x0A, 0x7A, 0x1C, 0x47, 0x0B, 0x5C, 0x01, 0x47, 0x5C, +/* 00006270 */ 0x02, 0x16, 0x1F, 0x03, 0x46, 0x46, 0x54, 0x40, 0x46, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, 0x08, +/* 00006280 */ 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5C, 0x01, 0x1E, 0x5C, 0x02, 0x1F, 0x5C, 0x03, +/* 00006290 */ 0x20, 0x61, 0x47, 0x40, 0x0C, 0x5C, 0x04, 0x47, 0x8E, 0x01, 0x3B, 0x47, 0x4B, 0x47, 0x61, 0x47, +/* 000062A0 */ 0x47, 0x0D, 0x5C, 0x05, 0x47, 0x1F, 0x06, 0xFF, 0x46, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, 0x09, +/* 000062B0 */ 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5C, 0x01, 0x21, 0x5C, 0x02, 0x22, 0x5C, 0x03, +/* 000062C0 */ 0x22, 0x61, 0x47, 0x40, 0x0E, 0x5C, 0x04, 0x47, 0x8E, 0x01, 0x3B, 0x47, 0x4B, 0x47, 0x61, 0x47, +/* 000062D0 */ 0x47, 0x0F, 0x5C, 0x05, 0x47, 0x1F, 0x06, 0xFF, 0x46, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, 0x0A, +/* 000062E0 */ 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5C, 0x01, 0x23, 0x5C, 0x02, 0x24, 0x5C, 0x03, +/* 000062F0 */ 0x24, 0x61, 0x47, 0x40, 0x10, 0x5C, 0x04, 0x47, 0x8E, 0x01, 0x3B, 0x47, 0x4B, 0x47, 0x61, 0x47, +/* 00006300 */ 0x47, 0x11, 0x5C, 0x05, 0x47, 0x1F, 0x06, 0xFF, 0x46, 0x8E, 0x01, 0x38, 0x46, 0x14, 0x03, 0x00, +/* 00006310 */ 0x46, 0x02, 0x09, 0xFA, 0x01, 0xDE, 0x01, 0x04, 0x03, 0xB8, 0x46, 0x00, 0xB7, 0x01, 0x00, 0x00, +/* 00006320 */ 0x00, 0x46, 0x46, 0x01, 0x51, 0x01, 0x0B, 0x3E, 0x46, 0x95, 0x01, 0x02, 0x3E, 0x01, 0x51, 0x01, +/* 00006330 */ 0x0C, 0x3F, 0x46, 0x95, 0x01, 0x03, 0x3F, 0x8E, 0x01, 0x2A, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00006340 */ 0x1D, 0x5C, 0x01, 0x25, 0x90, 0x01, 0x02, 0x47, 0x5C, 0x02, 0x47, 0x1F, 0x03, 0xFF, 0x46, 0x8E, +/* 00006350 */ 0x01, 0x2A, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x5C, 0x01, 0x26, 0x90, 0x01, 0x03, 0x47, +/* 00006360 */ 0x5C, 0x02, 0x47, 0x1F, 0x03, 0xFF, 0x46, 0x90, 0x01, 0x02, 0x46, 0xCD, 0x47, 0x02, 0xA1, 0x00, +/* 00006370 */ 0x27, 0x47, 0xA1, 0x01, 0x28, 0x47, 0x76, 0x47, 0x46, 0x12, 0x8E, 0x01, 0x1B, 0x46, 0x07, 0x04, +/* 00006380 */ 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x29, 0xCC, 0x40, +/* 00006390 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x48, 0x07, +/* 000063A0 */ 0x01, 0x00, 0xC2, 0x01, 0x48, 0x48, 0x7A, 0x48, 0x47, 0x13, 0x7A, 0x2C, 0x47, 0x14, 0x7A, 0x2C, +/* 000063B0 */ 0x47, 0x15, 0x7A, 0x2C, 0x47, 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, 0x46, 0x8E, 0x01, 0x0A, +/* 000063C0 */ 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x61, 0x47, 0x47, 0x17, 0x5C, +/* 000063D0 */ 0x01, 0x47, 0x8E, 0x01, 0x0E, 0x47, 0x61, 0x47, 0x47, 0x17, 0x5C, 0x02, 0x47, 0x1F, 0x03, 0xFF, +/* 000063E0 */ 0x46, 0x8E, 0x01, 0x1B, 0x46, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x61, +/* 000063F0 */ 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x2F, 0xCC, 0x58, 0x00, 0x00, 0x00, 0x03, 0x00, +/* 00006400 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x48, 0x7A, 0x48, 0x47, 0x13, 0x7A, 0x30, +/* 00006410 */ 0x47, 0x14, 0x7A, 0x2C, 0x47, 0x15, 0x7A, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, +/* 00006420 */ 0x46, 0x8E, 0x01, 0x1B, 0x46, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x61, +/* 00006430 */ 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x31, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, +/* 00006440 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x2A, 0x48, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, +/* 00006450 */ 0x5C, 0x01, 0x33, 0xB8, 0x4A, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x4A, 0x4A, 0x01, 0x51, 0x01, +/* 00006460 */ 0x0D, 0x49, 0x4A, 0x5C, 0x02, 0x49, 0x1F, 0x03, 0x48, 0x48, 0x7A, 0x48, 0x47, 0x18, 0x7A, 0x2C, +/* 00006470 */ 0x47, 0x15, 0x7A, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, 0x46, 0x8E, 0x01, 0x1B, +/* 00006480 */ 0x46, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x61, 0x47, 0x47, 0x17, 0x5C, +/* 00006490 */ 0x01, 0x47, 0x5C, 0x02, 0x34, 0xCC, 0x84, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x47, 0x00, +/* 000064A0 */ 0x00, 0x00, 0xB8, 0x49, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x49, 0x49, 0x01, 0x51, 0x01, 0x0E, +/* 000064B0 */ 0x48, 0x49, 0x7A, 0x48, 0x47, 0x13, 0x01, 0x65, 0x01, 0x48, 0x47, 0x7A, 0x30, 0x47, 0x14, 0x7A, +/* 000064C0 */ 0x2C, 0x47, 0x15, 0x7A, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, 0x46, 0x8E, 0x01, +/* 000064D0 */ 0x1B, 0x46, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x5C, 0x01, 0x47, 0x5C, +/* 000064E0 */ 0x02, 0x35, 0xCC, 0x9C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x8E, +/* 000064F0 */ 0x01, 0x4A, 0x48, 0x4B, 0x48, 0x7A, 0x48, 0x47, 0x13, 0x7A, 0x30, 0x47, 0x14, 0x7A, 0x30, 0x47, +/* 00006500 */ 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, 0x46, 0x90, 0x01, 0x02, 0x00, 0x09, 0x07, 0x00, 0xA8, +/* 00006510 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x07, 0xB0, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x03, +/* 00006520 */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, +/* 00006530 */ 0x01, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, +/* 00006540 */ 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x70, +/* 00006550 */ 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB3, +/* 00006560 */ 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, +/* 00006570 */ 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, +/* 00006580 */ 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, +/* 00006590 */ 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x2C, +/* 000065A0 */ 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x91, +/* 000065B0 */ 0x01, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, +/* 000065C0 */ 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, +/* 000065D0 */ 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x0A, +/* 000065E0 */ 0x04, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x00, 0xFE, 0xFC, 0x03, 0xFE, 0xFE, 0x03, 0xFE, 0x00, 0x04, +/* 000065F0 */ 0xFE, 0x02, 0x04, 0xFE, 0x04, 0x04, 0xFE, 0x06, 0x04, 0xFE, 0x08, 0x04, 0xFE, 0x0A, 0x04, 0xFE, +/* 00006600 */ 0x0C, 0x04, 0xFE, 0x93, 0x01, 0xFE, 0x91, 0x01, 0xFE, 0x94, 0x01, 0xFE, 0x93, 0x01, 0xFE, 0xEC, +/* 00006610 */ 0x02, 0xFE, 0x91, 0x01, 0xFE, 0xED, 0x02, 0xFE, 0x94, 0x01, 0xFE, 0xEE, 0x02, 0xFE, 0x96, 0x02, +/* 00006620 */ 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0x48, 0x01, 0xFE, +/* 00006630 */ 0xB7, 0x01, 0xFE, 0x1B, 0x04, 0x02, 0x01, 0x09, 0x00, 0xFE, 0x1C, 0x04, 0x01, 0xFE, 0x1D, 0x04, +/* 00006640 */ 0x02, 0xFE, 0x1E, 0x04, 0x03, 0xFE, 0x1F, 0x04, 0x04, 0xFE, 0x20, 0x04, 0x05, 0xFE, 0x21, 0x04, +/* 00006650 */ 0x06, 0xFE, 0x22, 0x04, 0x07, 0xFE, 0x23, 0x04, 0x08, 0xFE, 0x24, 0x04, 0x03, 0x02, 0x00, 0xFE, +/* 00006660 */ 0x1D, 0x02, 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x23, 0xE9, 0x14, 0x16, 0x00, 0x00, 0x00, 0x75, 0x00, +/* 00006670 */ 0x9A, 0x13, 0x34, 0x00, 0xDA, 0x36, 0x19, 0x00, 0x5E, 0x00, 0x30, 0x00, 0xFC, 0x0F, 0x30, 0x00, +/* 00006680 */ 0x42, 0x02, 0x30, 0x00, 0x54, 0x02, 0x30, 0x00, 0x53, 0x02, 0x2E, 0x00, 0x62, 0x04, 0x18, 0x00, +/* 00006690 */ 0x59, 0x04, 0x18, 0x00, 0x54, 0x00, 0x13, 0x00, 0x48, 0x00, 0x43, 0x00, 0x9D, 0x00, 0x24, 0x00, +/* 000066A0 */ 0x4A, 0x00, 0x40, 0x00, 0xA2, 0x00, 0x5C, 0x00, 0x22, 0x03, 0x51, 0x00, 0xEC, 0x08, 0x3A, 0x00, +/* 000066B0 */ 0x9F, 0x00, 0x07, 0x00, 0x88, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x12, 0x89, 0x00, 0x00, 0xD6, +/* 000066C0 */ 0x84, 0x00, 0x00, 0x5F, 0x84, 0x00, 0x00, 0xA1, 0x82, 0x00, 0x00, 0x1C, 0x81, 0x00, 0x00, 0x6B, +/* 000066D0 */ 0x7D, 0x00, 0x00, 0x6C, 0x75, 0x00, 0x00, 0xFD, 0x72, 0x00, 0x00, 0xB7, 0x71, 0x00, 0x00, 0x71, +/* 000066E0 */ 0x70, 0x00, 0x00, 0x2B, 0x6F, 0x00, 0x00, 0x53, 0x6D, 0x00, 0x00, 0x96, 0x6B, 0x00, 0x00, 0xAD, +/* 000066F0 */ 0x6A, 0x00, 0x00, 0xF7, 0x66, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0x89, 0xC6, 0x12, 0xFE, 0xCE, +/* 00006700 */ 0x06, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x51, 0xFF, 0x3B, 0x59, 0x01, 0x00, 0x01, +/* 00006710 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x3B, 0x59, 0x01, 0x00, 0xFE, 0x30, 0x08, 0xFE, +/* 00006720 */ 0x30, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, 0x04, 0x09, 0x20, 0x20, 0x20, 0x20, 0x01, +/* 00006730 */ 0x16, 0x17, 0x18, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x62, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x06, +/* 00006740 */ 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0x63, 0x04, 0x06, 0xFE, 0xE1, 0x03, 0x06, 0xFE, 0x50, 0x04, 0x06, +/* 00006750 */ 0xFE, 0x54, 0x04, 0x06, 0xFE, 0x51, 0x04, 0x06, 0xFE, 0x52, 0x04, 0x06, 0xFE, 0x25, 0x04, 0x06, +/* 00006760 */ 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, +/* 00006770 */ 0xFE, 0x2A, 0x04, 0x06, 0xFE, 0x53, 0x04, 0x07, 0x08, 0xFE, 0xA8, 0x01, 0x5B, 0x15, 0xB3, 0x15, +/* 00006780 */ 0x15, 0x2C, 0x19, 0x15, 0x15, 0x03, 0x00, 0x19, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x04, 0x09, 0x1A, +/* 00006790 */ 0x6C, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, +/* 000067A0 */ 0x1F, 0x03, 0xFF, 0x19, 0x8E, 0x04, 0x09, 0x1A, 0x6C, 0x19, 0x1A, 0x01, 0x07, 0x02, 0x00, 0x5C, +/* 000067B0 */ 0x00, 0x1A, 0x5C, 0x01, 0x15, 0x1F, 0x02, 0x19, 0x19, 0x96, 0x02, 0x19, 0x92, 0x02, 0x19, 0xA8, +/* 000067C0 */ 0x1A, 0x14, 0x11, 0x00, 0x19, 0x1A, 0x09, 0x00, 0x00, 0x92, 0x02, 0x19, 0x61, 0x19, 0x19, 0x02, +/* 000067D0 */ 0x0F, 0x1B, 0x00, 0x19, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x1A, 0x6C, 0x19, 0x1A, 0x00, 0x07, +/* 000067E0 */ 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x19, 0x8E, +/* 000067F0 */ 0x04, 0x0A, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00006800 */ 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x03, 0x7A, 0x1B, 0x1A, +/* 00006810 */ 0x04, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x05, 0x7A, 0x1B, 0x1A, 0x06, 0x92, 0x02, 0x1B, 0x61, +/* 00006820 */ 0x1B, 0x1B, 0x07, 0x7A, 0x1B, 0x1A, 0x08, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x09, 0x7A, 0x1B, +/* 00006830 */ 0x1A, 0x0A, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x0B, 0x7A, 0x1B, 0x1A, 0x0C, 0x92, 0x02, 0x1B, +/* 00006840 */ 0x61, 0x1B, 0x1B, 0x0D, 0x7A, 0x1B, 0x1A, 0x0E, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x0F, 0x7A, +/* 00006850 */ 0x1B, 0x1A, 0x10, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x11, 0x7A, 0x1B, 0x1A, 0x12, 0x92, 0x02, +/* 00006860 */ 0x1B, 0x61, 0x1B, 0x1B, 0x13, 0x7A, 0x1B, 0x1A, 0x14, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x15, +/* 00006870 */ 0x7A, 0x1B, 0x1A, 0x16, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x17, 0x7A, 0x1B, 0x1A, 0x18, 0x92, +/* 00006880 */ 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x19, 0x7A, 0x1B, 0x1A, 0x1A, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, +/* 00006890 */ 0x1B, 0x7A, 0x1B, 0x1A, 0x1C, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x1D, 0x7A, 0x1B, 0x1A, 0x1E, +/* 000068A0 */ 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x13, 0x1F, 0x03, 0x19, 0x19, 0x96, 0x03, 0x19, 0x8E, 0x04, 0x0A, +/* 000068B0 */ 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCB, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x13, 0x1F, +/* 000068C0 */ 0x03, 0x19, 0x19, 0x96, 0x04, 0x19, 0x8E, 0x04, 0x0C, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x14, +/* 000068D0 */ 0x8E, 0x04, 0x1C, 0x1A, 0x5C, 0x01, 0x1A, 0x8E, 0x04, 0x18, 0x1A, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 000068E0 */ 0x14, 0x92, 0x03, 0x1B, 0x5C, 0x01, 0x1B, 0x1F, 0x02, 0x1A, 0x1A, 0x5C, 0x02, 0x1A, 0xD4, 0x00, +/* 000068F0 */ 0x1A, 0x5C, 0x03, 0x1A, 0x92, 0x02, 0x1A, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0xFF, 0x19, 0x8E, 0x04, +/* 00006900 */ 0x0A, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0x92, 0x04, 0x1A, 0x5C, 0x01, 0x1A, 0x8E, 0x04, +/* 00006910 */ 0x0E, 0x1A, 0x61, 0x1A, 0x1A, 0x1F, 0x5C, 0x02, 0x1A, 0x1F, 0x03, 0x00, 0x19, 0x09, 0x02, 0x00, +/* 00006920 */ 0xA8, 0x00, 0x24, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, +/* 00006930 */ 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x85, +/* 00006940 */ 0x02, 0x00, 0x00, 0x87, 0x02, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x7E, +/* 00006950 */ 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x81, +/* 00006960 */ 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, +/* 00006970 */ 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x94, 0x02, 0xFE, 0x95, 0x02, +/* 00006980 */ 0xFE, 0x14, 0x02, 0xFE, 0x97, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x85, 0x02, 0xFE, 0x92, 0x02, 0xFE, +/* 00006990 */ 0x87, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x89, +/* 000069A0 */ 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x80, 0x02, +/* 000069B0 */ 0xFE, 0x8D, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x8E, 0x02, 0xFE, +/* 000069C0 */ 0x83, 0x02, 0xFE, 0x91, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x48, 0x01, 0xFE, 0xF9, 0x03, 0xFE, 0x64, +/* 000069D0 */ 0x04, 0xFE, 0xFD, 0x01, 0xFF, 0x70, 0x59, 0x01, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, +/* 000069E0 */ 0x3C, 0x00, 0x18, 0x00, 0x90, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x1B, 0x00, 0x6B, 0x00, 0x18, 0x00, +/* 000069F0 */ 0x90, 0x00, 0xBE, 0x00, 0xCE, 0x03, 0x19, 0x00, 0x3E, 0x00, 0x38, 0x00, 0x98, 0x01, 0x24, 0x00, +/* 00006A00 */ 0x44, 0x00, 0x00, 0x07, 0x6A, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xE7, +/* 00006A10 */ 0x06, 0x60, 0xA2, 0x41, 0xD1, 0x00, 0x52, 0xFF, 0xD6, 0x5F, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, +/* 00006A20 */ 0x00, 0x02, 0x02, 0xFF, 0xD6, 0x5F, 0x01, 0x00, 0xFE, 0x27, 0x01, 0xFE, 0x27, 0x01, 0x41, 0x04, +/* 00006A30 */ 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x05, 0x06, 0x06, 0xFE, 0x50, 0x04, 0x05, 0xFE, 0xFA, 0x03, +/* 00006A40 */ 0x08, 0x58, 0x8E, 0x01, 0x03, 0x07, 0x97, 0x07, 0x07, 0x05, 0xA8, 0x08, 0x15, 0x0B, 0x00, 0x07, +/* 00006A50 */ 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x3A, 0x00, 0x8E, 0x05, 0x0C, 0x07, +/* 00006A60 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x05, 0x19, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x02, +/* 00006A70 */ 0x08, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x03, 0x05, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0x07, 0x07, 0x0F, +/* 00006A80 */ 0x03, 0x00, 0x07, 0x09, 0x10, 0x00, 0x8E, 0x01, 0x04, 0x07, 0x8E, 0x01, 0x03, 0x08, 0x97, 0x08, +/* 00006A90 */ 0x08, 0x05, 0x9C, 0x08, 0x07, 0x05, 0xA8, 0x00, 0x24, 0x00, 0xFF, 0x04, 0x60, 0x01, 0x00, 0x03, +/* 00006AA0 */ 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xA6, 0x00, 0x12, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x5C, 0x80, +/* 00006AB0 */ 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xBF, 0x06, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x50, 0xFF, 0x2E, 0x56, +/* 00006AC0 */ 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x2E, 0x56, 0x01, 0x00, 0xFE, 0x60, +/* 00006AD0 */ 0x02, 0xFE, 0x60, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x01, 0x04, 0x04, 0x04, +/* 00006AE0 */ 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x61, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x78, 0x5B, +/* 00006AF0 */ 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x18, 0x00, 0x8E, +/* 00006B00 */ 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, +/* 00006B10 */ 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, +/* 00006B20 */ 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, +/* 00006B30 */ 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, 0x08, 0x06, 0x02, 0x0F, 0x1B, 0x00, +/* 00006B40 */ 0x08, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00006B50 */ 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x61, 0x00, 0x06, 0x03, +/* 00006B60 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, +/* 00006B70 */ 0xFE, 0x7A, 0x02, 0xFF, 0x54, 0x56, 0x01, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, +/* 00006B80 */ 0x00, 0x18, 0x00, 0x88, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x6B, 0x00, 0x18, 0x00, 0x88, +/* 00006B90 */ 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xA0, 0x06, +/* 00006BA0 */ 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0xEB, 0x03, 0x4F, 0xFF, 0x87, 0x4F, 0x01, 0x00, 0xFF, 0x00, +/* 00006BB0 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0x87, 0x4F, 0x01, 0x00, 0xFE, 0xFD, 0x03, 0xFE, 0xFD, 0x03, +/* 00006BC0 */ 0x01, 0x08, 0x06, 0x0B, 0x07, 0x5A, 0x56, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0A, 0x06, 0xFE, +/* 00006BD0 */ 0x9A, 0x03, 0x05, 0xFE, 0x61, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x08, 0xFE, 0x28, 0x01, 0x5B, 0x07, +/* 00006BE0 */ 0xB3, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x2C, 0x0B, 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, +/* 00006BF0 */ 0x18, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, +/* 00006C00 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, +/* 00006C10 */ 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, +/* 00006C20 */ 0x08, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x08, 0x0B, 0x09, 0x00, 0x00, 0x61, 0x0B, 0x08, 0x02, +/* 00006C30 */ 0x0F, 0x1B, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, +/* 00006C40 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0xA8, +/* 00006C50 */ 0x0B, 0x15, 0x03, 0x00, 0x06, 0x0B, 0x09, 0x42, 0x00, 0x8E, 0x04, 0x27, 0x0B, 0x07, 0x02, 0x00, +/* 00006C60 */ 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x1B, 0x00, 0x0B, 0x09, 0x00, +/* 00006C70 */ 0x00, 0x8E, 0x04, 0x26, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0x1F, 0x02, +/* 00006C80 */ 0x0B, 0x0B, 0x0F, 0x15, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, +/* 00006C90 */ 0x03, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x0C, 0x1F, 0x01, 0xFF, 0x0B, 0xA8, 0x0B, 0x47, 0x09, 0x0B, +/* 00006CA0 */ 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x06, 0x0B, 0x09, 0x1B, 0x00, 0x8E, 0x04, 0x31, 0x0C, 0x6C, 0x0B, +/* 00006CB0 */ 0x0C, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0B, 0x0B, 0x47, +/* 00006CC0 */ 0x09, 0x0B, 0x09, 0x11, 0x00, 0x8E, 0x04, 0x22, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x05, 0x1F, +/* 00006CD0 */ 0x01, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x8E, 0x04, 0x11, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, +/* 00006CE0 */ 0x8E, 0x04, 0x09, 0x0D, 0x6C, 0x0C, 0x0D, 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, +/* 00006CF0 */ 0x09, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x0C, 0x0C, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x00, 0x0B, 0x09, +/* 00006D00 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, 0xFE, +/* 00006D10 */ 0x5B, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x33, 0x02, 0xFF, 0xB3, 0x4F, 0x01, 0x00, 0x0D, 0x09, 0x00, +/* 00006D20 */ 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7F, 0x00, 0x18, 0x00, 0x47, 0x00, 0x15, 0x00, +/* 00006D30 */ 0x67, 0x00, 0x18, 0x00, 0x80, 0x00, 0x3A, 0x00, 0x56, 0x00, 0x12, 0x00, 0x48, 0x00, 0x05, 0x00, +/* 00006D40 */ 0x2F, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x1B, 0x00, 0x59, 0x00, 0x11, 0x00, 0x42, 0x00, 0x2E, 0x00, +/* 00006D50 */ 0x51, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x85, 0x06, 0x10, 0xA3, 0x41, +/* 00006D60 */ 0xC1, 0x00, 0xFE, 0x16, 0x03, 0x4E, 0xFF, 0x05, 0x4B, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00006D70 */ 0x03, 0x01, 0xFF, 0x05, 0x4B, 0x01, 0x00, 0xFE, 0x26, 0x04, 0xFE, 0x26, 0x04, 0x01, 0x09, 0x05, +/* 00006D80 */ 0x0B, 0x05, 0x62, 0x5B, 0x04, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x16, 0x03, +/* 00006D90 */ 0x07, 0xFE, 0x3D, 0x01, 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, +/* 00006DA0 */ 0x05, 0x02, 0xA8, 0x0B, 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, +/* 00006DB0 */ 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x6A, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, +/* 00006DC0 */ 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x16, 0x00, 0x8E, 0x01, 0x02, +/* 00006DD0 */ 0x0B, 0x4B, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC2, 0x03, 0x00, 0x0B, +/* 00006DE0 */ 0x09, 0xEC, 0x00, 0x8E, 0x04, 0x31, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00006DF0 */ 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x08, 0x0B, 0x8E, 0x04, 0x17, 0x0B, 0x07, +/* 00006E00 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x18, 0x00, 0x0B, +/* 00006E10 */ 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00006E20 */ 0x0C, 0x5C, 0x01, 0x03, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, +/* 00006E30 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, +/* 00006E40 */ 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x31, 0x00, 0x8E, 0x04, 0x0A, 0x0B, 0x07, 0x03, +/* 00006E50 */ 0x00, 0x5C, 0x00, 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0x0B, 0x0B, +/* 00006E60 */ 0x47, 0x09, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00006E70 */ 0x0C, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x02, 0x08, 0x0B, 0x4B, +/* 00006E80 */ 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, +/* 00006E90 */ 0x1F, 0x04, 0xFF, 0x0B, 0x47, 0x0B, 0x09, 0x8E, 0x04, 0x0C, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00006EA0 */ 0x02, 0x8E, 0x04, 0x20, 0x0D, 0x5C, 0x01, 0x0D, 0x8E, 0x01, 0x03, 0x0D, 0x4B, 0x0D, 0x5C, 0x02, +/* 00006EB0 */ 0x0D, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0x0C, 0x0C, 0x76, 0x0C, 0x0B, 0x04, 0x61, 0x0B, 0x09, 0x05, +/* 00006EC0 */ 0x82, 0x0B, 0x0B, 0x2B, 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 00006ED0 */ 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x7A, 0x02, +/* 00006EE0 */ 0xFE, 0x7A, 0x02, 0xDD, 0xFF, 0x1D, 0x4B, 0x01, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, +/* 00006EF0 */ 0x15, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x18, 0x00, 0x43, 0x00, 0x16, 0x00, 0x58, 0x00, 0x18, 0x00, +/* 00006F00 */ 0x37, 0x00, 0x18, 0x00, 0x38, 0x00, 0x15, 0x00, 0x9D, 0x00, 0x18, 0x00, 0x47, 0x00, 0x0A, 0x00, +/* 00006F10 */ 0x3A, 0x00, 0x19, 0x00, 0x3F, 0x00, 0x18, 0x00, 0x58, 0x00, 0x19, 0x00, 0x4F, 0x00, 0x28, 0x00, +/* 00006F20 */ 0x66, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5D, 0x80, 0xE0, 0x81, +/* 00006F30 */ 0xC6, 0x02, 0xFE, 0x7E, 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, 0x4C, 0xFF, 0x87, 0x48, 0x01, 0x00, +/* 00006F40 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFF, 0x87, 0x48, 0x01, 0x00, 0xFE, 0x9F, 0x01, +/* 00006F50 */ 0xFE, 0x9F, 0x01, 0x40, 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, 0x16, 0x03, 0x03, 0x01, 0x01, 0x01, +/* 00006F60 */ 0x01, 0x08, 0x09, 0x0A, 0x08, 0x42, 0x96, 0x02, 0x03, 0x96, 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, +/* 00006F70 */ 0x05, 0x06, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, +/* 00006F80 */ 0x8E, 0x03, 0x2A, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x92, 0x02, 0x0E, 0x5C, 0x01, 0x0E, +/* 00006F90 */ 0xD4, 0x00, 0x0E, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x0D, 0x0D, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, +/* 00006FA0 */ 0x1F, 0x03, 0xFF, 0x0B, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0x2B, 0x01, 0xFE, 0x5B, +/* 00006FB0 */ 0x04, 0xFE, 0x5C, 0x04, 0xFE, 0x5D, 0x04, 0xFF, 0xDA, 0x48, 0x01, 0x00, 0x02, 0x0C, 0x00, 0x00, +/* 00006FC0 */ 0x00, 0x34, 0x00, 0x4B, 0x01, 0x00, 0xCA, 0x6F, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, +/* 00006FD0 */ 0x00, 0xFE, 0x7F, 0x06, 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x60, 0x04, 0x4D, 0xFF, 0x13, 0x49, +/* 00006FE0 */ 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x13, 0x49, 0x01, 0x00, 0xEE, 0xEE, +/* 00006FF0 */ 0x01, 0x07, 0x03, 0x07, 0x09, 0x1D, 0x1B, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x06, 0x08, 0x59, +/* 00007000 */ 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, +/* 00007010 */ 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, 0x02, 0x09, 0x08, 0x4B, 0x08, 0x6C, +/* 00007020 */ 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x02, 0x09, +/* 00007030 */ 0x5C, 0x02, 0x09, 0x8E, 0x01, 0x03, 0x09, 0x5C, 0x03, 0x09, 0x8E, 0x01, 0x04, 0x09, 0x5C, 0x04, +/* 00007040 */ 0x09, 0x8E, 0x01, 0x05, 0x09, 0x5C, 0x05, 0x09, 0x5C, 0x06, 0x03, 0x5C, 0x07, 0x04, 0x1F, 0x08, +/* 00007050 */ 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, 0xFF, 0x3F, 0x49, 0x01, 0x00, 0x04, +/* 00007060 */ 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x3E, 0x00, 0x81, 0x00, +/* 00007070 */ 0x00, 0xBF, 0x5D, 0x80, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x78, 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, +/* 00007080 */ 0x4A, 0xFF, 0x33, 0x46, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFF, 0x33, +/* 00007090 */ 0x46, 0x01, 0x00, 0xFE, 0x9F, 0x01, 0xFE, 0x9F, 0x01, 0x40, 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, +/* 000070A0 */ 0x16, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, 0x0A, 0x08, 0x42, 0x96, 0x02, 0x03, 0x96, +/* 000070B0 */ 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, 0x05, 0x06, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, +/* 000070C0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8E, 0x03, 0x2A, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, +/* 000070D0 */ 0x92, 0x02, 0x0E, 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x0D, 0x0D, +/* 000070E0 */ 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, 0x1F, 0x03, 0xFF, 0x0B, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, +/* 000070F0 */ 0x02, 0xFE, 0x2B, 0x01, 0xFE, 0x5B, 0x04, 0xFE, 0x5C, 0x04, 0xFE, 0x5D, 0x04, 0xFF, 0x86, 0x46, +/* 00007100 */ 0x01, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x34, 0x00, 0x4B, 0x01, 0x00, 0x10, 0x71, 0x00, 0x00, +/* 00007110 */ 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x79, 0x06, 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, +/* 00007120 */ 0x5F, 0x04, 0x4B, 0xFF, 0xBF, 0x46, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, +/* 00007130 */ 0xBF, 0x46, 0x01, 0x00, 0xEE, 0xEE, 0x01, 0x07, 0x03, 0x07, 0x09, 0x1D, 0x1B, 0x04, 0x05, 0x01, +/* 00007140 */ 0x01, 0x01, 0x01, 0x06, 0x08, 0x59, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, +/* 00007150 */ 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, +/* 00007160 */ 0x02, 0x09, 0x08, 0x4B, 0x08, 0x6C, 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, +/* 00007170 */ 0x01, 0x05, 0x8E, 0x01, 0x02, 0x09, 0x5C, 0x02, 0x09, 0x8E, 0x01, 0x03, 0x09, 0x5C, 0x03, 0x09, +/* 00007180 */ 0x8E, 0x01, 0x04, 0x09, 0x5C, 0x04, 0x09, 0x8E, 0x01, 0x05, 0x09, 0x5C, 0x05, 0x09, 0x5C, 0x06, +/* 00007190 */ 0x03, 0x5C, 0x07, 0x04, 0x1F, 0x08, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, +/* 000071A0 */ 0xFF, 0xEB, 0x46, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, +/* 000071B0 */ 0x2B, 0x00, 0x3E, 0x00, 0x81, 0x00, 0x00, 0xBF, 0x5D, 0x80, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x72, +/* 000071C0 */ 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, 0x48, 0xFF, 0xF1, 0x43, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, +/* 000071D0 */ 0x01, 0x00, 0x06, 0x06, 0xFF, 0xF1, 0x43, 0x01, 0x00, 0xFE, 0x9B, 0x01, 0xFE, 0x9B, 0x01, 0x40, +/* 000071E0 */ 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, 0x16, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, 0x0A, +/* 000071F0 */ 0x08, 0x42, 0x96, 0x02, 0x03, 0x96, 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, 0x05, 0x06, 0x8E, 0x03, +/* 00007200 */ 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8E, 0x03, 0x2A, 0x0D, +/* 00007210 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x92, 0x02, 0x0E, 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, 0x5C, +/* 00007220 */ 0x02, 0x0E, 0x1F, 0x03, 0x0D, 0x0D, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, 0x1F, 0x03, 0xFF, 0x0B, +/* 00007230 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0x2B, 0x01, 0xFE, 0x5B, 0x04, 0xFE, 0x5C, 0x04, +/* 00007240 */ 0xFE, 0x5D, 0x04, 0xFF, 0x44, 0x44, 0x01, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x34, 0x00, 0x47, +/* 00007250 */ 0x01, 0x00, 0x56, 0x72, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x73, 0x06, +/* 00007260 */ 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x5E, 0x04, 0x49, 0xFF, 0x7D, 0x44, 0x01, 0x00, 0xFF, 0x00, +/* 00007270 */ 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x7D, 0x44, 0x01, 0x00, 0xEA, 0xEA, 0x01, 0x07, 0x03, 0x07, +/* 00007280 */ 0x09, 0x1D, 0x1B, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x06, 0x08, 0x59, 0x5B, 0x05, 0xB3, 0x05, +/* 00007290 */ 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, +/* 000072A0 */ 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, 0x02, 0x09, 0x08, 0x4B, 0x08, 0x6C, 0x07, 0x08, 0x00, 0x07, +/* 000072B0 */ 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x02, 0x09, 0x5C, 0x02, 0x09, 0x8E, +/* 000072C0 */ 0x01, 0x03, 0x09, 0x5C, 0x03, 0x09, 0x8E, 0x01, 0x04, 0x09, 0x5C, 0x04, 0x09, 0x8E, 0x01, 0x05, +/* 000072D0 */ 0x09, 0x5C, 0x05, 0x09, 0x5C, 0x06, 0x03, 0x5C, 0x07, 0x04, 0x1F, 0x08, 0x00, 0x07, 0x09, 0x02, +/* 000072E0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, 0xFF, 0xA5, 0x44, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, +/* 000072F0 */ 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x3E, 0x00, 0x81, 0x00, 0x00, 0xBF, 0x5C, 0x80, +/* 00007300 */ 0xE0, 0x03, 0xC4, 0x00, 0xFE, 0x3B, 0x06, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x23, 0x04, 0x47, +/* 00007310 */ 0xFF, 0xCC, 0x34, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x07, 0x07, 0xFF, 0xCC, 0x34, 0x01, +/* 00007320 */ 0x00, 0xFE, 0x5A, 0x06, 0xFE, 0x5A, 0x06, 0x01, 0x0F, 0x07, 0x11, 0x0A, 0x8F, 0x89, 0x03, 0x0C, +/* 00007330 */ 0x04, 0x04, 0x04, 0x04, 0x01, 0x10, 0x06, 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xFB, 0x03, 0x08, 0x05, +/* 00007340 */ 0xFE, 0x5A, 0x04, 0x07, 0xFE, 0xCE, 0x01, 0x5B, 0x0D, 0xB3, 0x0D, 0x0D, 0x4F, 0x0E, 0x4F, 0x0F, +/* 00007350 */ 0x2C, 0x11, 0x0D, 0x15, 0x13, 0x00, 0x11, 0x02, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x12, 0x11, 0xE1, +/* 00007360 */ 0x11, 0x0D, 0x11, 0x00, 0x0F, 0x1B, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x12, 0x6C, +/* 00007370 */ 0x11, 0x12, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x03, 0x1F, +/* 00007380 */ 0x03, 0xFF, 0x11, 0x8E, 0x03, 0x0C, 0x11, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x21, +/* 00007390 */ 0x12, 0x5C, 0x01, 0x12, 0x8E, 0x03, 0x12, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x0D, 0xC2, 0x02, +/* 000073A0 */ 0x12, 0x12, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0E, 0x11, 0x8E, 0x03, 0x27, 0x11, +/* 000073B0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x11, 0x11, 0x0F, 0x1B, 0x00, +/* 000073C0 */ 0x11, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x26, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 000073D0 */ 0x0E, 0x1F, 0x02, 0x11, 0x11, 0x0F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, +/* 000073E0 */ 0x31, 0x01, 0xA8, 0x11, 0x47, 0x0F, 0x11, 0x8E, 0x03, 0x09, 0x11, 0x61, 0x11, 0x11, 0x01, 0x0F, +/* 000073F0 */ 0x03, 0x00, 0x11, 0x09, 0x88, 0x00, 0x0F, 0x84, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x0F, 0x7D, 0x00, +/* 00007400 */ 0x0C, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x0A, 0x11, 0x4B, 0x11, 0x97, 0x11, 0x11, 0x0A, 0x0F, 0x03, +/* 00007410 */ 0x00, 0x11, 0x09, 0x10, 0x00, 0x8E, 0x01, 0x0A, 0x11, 0x4B, 0x11, 0x97, 0x11, 0x11, 0x0A, 0x47, +/* 00007420 */ 0x0F, 0x11, 0x09, 0x59, 0x00, 0x8E, 0x03, 0x0A, 0x11, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, +/* 00007430 */ 0x12, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0F, 0x11, 0x8E, 0x01, +/* 00007440 */ 0x08, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0F, 0xA8, 0x12, 0x5C, +/* 00007450 */ 0x02, 0x12, 0x8E, 0x01, 0x02, 0x12, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0xA8, 0x13, +/* 00007460 */ 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0x12, 0x12, 0x5C, 0x03, 0x12, +/* 00007470 */ 0x1F, 0x04, 0xFF, 0x11, 0x8E, 0x01, 0x0A, 0x11, 0x4B, 0x11, 0x9C, 0x0F, 0x11, 0x0A, 0x0F, 0x4E, +/* 00007480 */ 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x0A, 0x11, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, +/* 00007490 */ 0x12, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0F, 0x11, 0x8E, 0x01, +/* 000074A0 */ 0x08, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0F, 0x5C, 0x02, 0x0B, +/* 000074B0 */ 0x8E, 0x01, 0x02, 0x12, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0C, 0x5C, +/* 000074C0 */ 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0x12, 0x12, 0x5C, 0x03, 0x12, 0x1F, 0x04, 0xFF, 0x11, +/* 000074D0 */ 0x8E, 0x03, 0x11, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x09, 0x13, 0x6C, 0x12, +/* 000074E0 */ 0x13, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x13, 0x8E, 0x03, 0x31, 0x15, 0x6C, 0x14, 0x15, 0x03, +/* 000074F0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x15, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x14, 0x14, 0x5C, 0x01, 0x14, +/* 00007500 */ 0x5C, 0x02, 0x0F, 0x1F, 0x03, 0x12, 0x12, 0x5C, 0x01, 0x12, 0x1F, 0x02, 0x00, 0x11, 0x09, 0x02, +/* 00007510 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x17, 0x03, 0xFE, 0x33, 0x02, 0xFE, 0x5E, +/* 00007520 */ 0x02, 0xFF, 0x45, 0x35, 0x01, 0x00, 0x11, 0x09, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x4F, 0x00, 0x18, +/* 00007530 */ 0x00, 0x50, 0x00, 0x29, 0x00, 0x53, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x3A, 0x00, 0x05, +/* 00007540 */ 0x00, 0x2D, 0x00, 0x1D, 0x00, 0xB4, 0x00, 0x11, 0x00, 0x84, 0x00, 0x10, 0x00, 0xA2, 0x00, 0x19, +/* 00007550 */ 0x00, 0x3E, 0x00, 0x36, 0x00, 0x7A, 0x00, 0x0A, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x28, 0x00, 0x19, +/* 00007560 */ 0x00, 0x3A, 0x00, 0x32, 0x00, 0x81, 0x00, 0x43, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, +/* 00007570 */ 0x29, 0xD4, 0x10, 0xFE, 0xAE, 0x05, 0x0C, 0xB3, 0x41, 0xC1, 0x00, 0xFE, 0x22, 0x04, 0x46, 0xFF, +/* 00007580 */ 0xCA, 0x17, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0xCA, 0x17, 0x01, 0x00, +/* 00007590 */ 0xFE, 0x69, 0x1B, 0xFE, 0x69, 0x1B, 0x45, 0x1C, 0x29, 0x41, 0x07, 0xFE, 0xAA, 0x01, 0xFE, 0x8A, +/* 000075A0 */ 0x01, 0x03, 0x0F, 0x2A, 0x2A, 0x2A, 0x2A, 0x01, 0x01, 0x40, 0x41, 0x06, 0xFE, 0x9A, 0x03, 0x06, +/* 000075B0 */ 0xFE, 0xBB, 0x03, 0x08, 0x06, 0xFE, 0x16, 0x03, 0x0B, 0x05, 0xFE, 0x12, 0x04, 0x06, 0xFE, 0x15, +/* 000075C0 */ 0x04, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, +/* 000075D0 */ 0x03, 0x06, 0xFE, 0x50, 0x04, 0x06, 0xFE, 0x51, 0x04, 0x05, 0xFE, 0x2B, 0x04, 0x05, 0xFE, 0x2C, +/* 000075E0 */ 0x04, 0x05, 0xFE, 0x2E, 0x04, 0x06, 0xFE, 0x52, 0x04, 0x06, 0xFE, 0x25, 0x04, 0x05, 0xFE, 0x30, +/* 000075F0 */ 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, +/* 00007600 */ 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x06, 0xFE, 0x53, 0x04, 0x06, 0xFE, 0x54, +/* 00007610 */ 0x04, 0x06, 0xFE, 0x6C, 0x03, 0x05, 0xFE, 0x55, 0x04, 0x05, 0xFE, 0x56, 0x04, 0x05, 0xFE, 0x57, +/* 00007620 */ 0x04, 0x05, 0xFE, 0x58, 0x04, 0x07, 0x05, 0xFE, 0xF4, 0x03, 0x05, 0xFE, 0x1A, 0x04, 0x0C, 0x05, +/* 00007630 */ 0xFE, 0x59, 0x04, 0x06, 0xFE, 0x13, 0x04, 0x01, 0x00, 0xFE, 0x7B, 0x05, 0xA8, 0x3F, 0x2C, 0x42, +/* 00007640 */ 0x29, 0x0D, 0x03, 0x00, 0x42, 0x02, 0x09, 0x12, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, +/* 00007650 */ 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0x8E, 0x03, 0x0C, 0x42, 0x07, +/* 00007660 */ 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x19, 0x43, 0x5C, 0x01, 0x43, 0x5C, 0x02, 0x29, 0x5C, +/* 00007670 */ 0x03, 0x03, 0x1F, 0x04, 0x42, 0x42, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x23, 0x00, 0x61, 0x42, 0x29, +/* 00007680 */ 0x01, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x18, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, 0x02, +/* 00007690 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x42, +/* 000076A0 */ 0x76, 0x06, 0x29, 0x03, 0x8E, 0x01, 0x02, 0x42, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, +/* 000076B0 */ 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0x42, 0x42, 0x47, 0x2B, 0x42, +/* 000076C0 */ 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x09, +/* 000076D0 */ 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x0B, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, +/* 000076E0 */ 0x43, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x2E, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, +/* 000076F0 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xA8, 0x43, +/* 00007700 */ 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x2F, 0x42, 0xA8, +/* 00007710 */ 0x42, 0x15, 0x03, 0x00, 0x2F, 0x42, 0x09, 0x1B, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, +/* 00007720 */ 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x2F, 0x1F, 0x02, 0x42, 0x42, 0x47, 0x2F, +/* 00007730 */ 0x42, 0x09, 0x15, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, 0x05, 0x07, 0x01, 0x00, 0x5C, +/* 00007740 */ 0x00, 0x43, 0x1F, 0x01, 0x42, 0x42, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x14, 0x03, 0x00, 0x2F, 0x42, +/* 00007750 */ 0x09, 0x12, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 00007760 */ 0x43, 0x1F, 0x01, 0xFF, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007770 */ 0x01, 0x2B, 0x5C, 0x02, 0x0E, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x03, 0xA1, 0x00, 0x0F, 0x43, 0xA1, +/* 00007780 */ 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, +/* 00007790 */ 0x06, 0x42, 0x42, 0x47, 0x30, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 000077A0 */ 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x12, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x03, 0xA1, 0x00, 0x0F, 0x43, +/* 000077B0 */ 0xA1, 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, +/* 000077C0 */ 0x1F, 0x06, 0x42, 0x42, 0x47, 0x31, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 000077D0 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x13, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, +/* 000077E0 */ 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, +/* 000077F0 */ 0x42, 0x47, 0x32, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007800 */ 0x2B, 0x5C, 0x02, 0x16, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x05, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, +/* 00007810 */ 0x15, 0x43, 0xA1, 0x02, 0x0F, 0x43, 0xA1, 0x03, 0x10, 0x43, 0xA1, 0x04, 0x11, 0x43, 0x5C, 0x04, +/* 00007820 */ 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x33, 0x42, 0x8E, 0x03, 0x02, +/* 00007830 */ 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0A, +/* 00007840 */ 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, +/* 00007850 */ 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x34, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, +/* 00007860 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, +/* 00007870 */ 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, +/* 00007880 */ 0x1F, 0x06, 0x42, 0x42, 0x47, 0x35, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 00007890 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x19, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, +/* 000078A0 */ 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, +/* 000078B0 */ 0x42, 0x47, 0x36, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 000078C0 */ 0x2B, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, +/* 000078D0 */ 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x37, +/* 000078E0 */ 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, +/* 000078F0 */ 0x1B, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x10, 0x43, 0xA1, 0x01, 0x11, 0x43, 0x5C, +/* 00007900 */ 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x38, 0x42, 0x0F, 0x03, +/* 00007910 */ 0x00, 0x35, 0x09, 0x27, 0x00, 0x8E, 0x03, 0x02, 0x43, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007920 */ 0x01, 0x2B, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x1D, 0xA8, 0x44, 0x5C, 0x04, 0x44, 0xA8, 0x44, 0x5C, +/* 00007930 */ 0x05, 0x44, 0x1F, 0x06, 0x43, 0x43, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, +/* 00007940 */ 0x43, 0x47, 0x39, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007950 */ 0x2B, 0x5C, 0x02, 0x1E, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x1F, 0x43, 0xA1, 0x01, +/* 00007960 */ 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x3A, 0x42, 0xA8, +/* 00007970 */ 0x42, 0x15, 0x03, 0x00, 0x39, 0x42, 0x09, 0x16, 0x00, 0x0F, 0x03, 0x00, 0x39, 0x09, 0x06, 0x00, +/* 00007980 */ 0x47, 0x43, 0x20, 0x09, 0x03, 0x00, 0x47, 0x43, 0x21, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, +/* 00007990 */ 0x43, 0x47, 0x42, 0x43, 0x47, 0x3B, 0x42, 0x8E, 0x01, 0x03, 0x42, 0x4B, 0x42, 0x07, 0x02, 0x00, +/* 000079A0 */ 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x0A, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCC, 0x00, 0x00, +/* 000079B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x7A, 0x30, 0x44, 0x07, 0x7A, 0x31, +/* 000079C0 */ 0x44, 0x08, 0x7A, 0x32, 0x44, 0x09, 0x7A, 0x33, 0x44, 0x0A, 0x7A, 0x34, 0x44, 0x0B, 0x7A, 0x35, +/* 000079D0 */ 0x44, 0x0C, 0x7A, 0x36, 0x44, 0x0D, 0x7A, 0x37, 0x44, 0x0E, 0x7A, 0x38, 0x44, 0x0F, 0x5C, 0x01, +/* 000079E0 */ 0x44, 0x5C, 0x02, 0x22, 0x1F, 0x03, 0x43, 0x43, 0x5C, 0x01, 0x43, 0x1F, 0x02, 0x42, 0x42, 0x47, +/* 000079F0 */ 0x3C, 0x42, 0x8E, 0x03, 0x07, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2A, 0x1F, +/* 00007A00 */ 0x02, 0x42, 0x42, 0x47, 0x2A, 0x42, 0x8E, 0x03, 0x2F, 0x42, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, +/* 00007A10 */ 0x5C, 0x01, 0x2A, 0x5C, 0x02, 0x2E, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x23, 0x43, 0xA1, 0x01, 0x24, +/* 00007A20 */ 0x43, 0x5C, 0x03, 0x43, 0x8E, 0x03, 0x30, 0x43, 0x5C, 0x04, 0x43, 0x1F, 0x05, 0x42, 0x42, 0x47, +/* 00007A30 */ 0x3D, 0x42, 0x76, 0x2E, 0x29, 0x10, 0x76, 0x2F, 0x29, 0x11, 0x61, 0x42, 0x3D, 0x12, 0x76, 0x42, +/* 00007A40 */ 0x29, 0x13, 0x76, 0x30, 0x29, 0x14, 0x76, 0x31, 0x29, 0x15, 0x76, 0x32, 0x29, 0x16, 0x76, 0x33, +/* 00007A50 */ 0x29, 0x17, 0x76, 0x34, 0x29, 0x18, 0x76, 0x35, 0x29, 0x19, 0x76, 0x36, 0x29, 0x1A, 0x76, 0x37, +/* 00007A60 */ 0x29, 0x1B, 0x76, 0x38, 0x29, 0x1C, 0x76, 0x39, 0x29, 0x1D, 0x76, 0x3A, 0x29, 0x1E, 0x76, 0x3B, +/* 00007A70 */ 0x29, 0x1F, 0x76, 0x3C, 0x29, 0x20, 0x47, 0x3E, 0x25, 0xE5, 0x1A, 0x00, 0x8E, 0x03, 0x3E, 0x42, +/* 00007A80 */ 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, 0x25, 0x1F, 0x03, +/* 00007A90 */ 0xFF, 0x42, 0xE9, 0x09, 0x51, 0x00, 0xE7, 0x2C, 0x06, 0x8E, 0x03, 0x29, 0x42, 0x07, 0x02, 0x00, +/* 00007AA0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2C, 0x1F, 0x02, 0xFF, 0x42, 0x8E, 0x01, 0x02, 0x42, 0x4B, 0x42, +/* 00007AB0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x26, 0x5C, 0x03, 0x27, 0x1F, +/* 00007AC0 */ 0x04, 0x42, 0x42, 0x47, 0x3F, 0x42, 0x47, 0x42, 0x29, 0x8E, 0x01, 0x03, 0x43, 0x4B, 0x43, 0x07, +/* 00007AD0 */ 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x22, 0x1F, 0x03, 0x43, 0x43, 0x76, +/* 00007AE0 */ 0x43, 0x42, 0x21, 0x47, 0x3E, 0x06, 0xE9, 0x0F, 0x28, 0x00, 0x3E, 0x09, 0x00, 0x00, 0x47, 0x42, +/* 00007AF0 */ 0x29, 0x8E, 0x01, 0x07, 0x43, 0x4B, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x61, 0x44, 0x29, +/* 00007B00 */ 0x22, 0x97, 0x44, 0x44, 0x28, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x29, 0x1F, 0x03, 0x43, 0x43, 0x76, +/* 00007B10 */ 0x43, 0x42, 0x21, 0xE5, 0x1A, 0x00, 0x8E, 0x03, 0x3E, 0x42, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, +/* 00007B20 */ 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0xFF, 0x42, 0xE9, 0x09, 0x27, 0x00, +/* 00007B30 */ 0xE7, 0x2D, 0x06, 0x8E, 0x03, 0x29, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2D, +/* 00007B40 */ 0x1F, 0x02, 0xFF, 0x42, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, +/* 00007B50 */ 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0xE9, 0x8E, 0x01, 0x04, 0x42, 0x4B, 0x42, 0x07, 0x02, 0x00, +/* 00007B60 */ 0x5C, 0x00, 0x04, 0x61, 0x43, 0x29, 0x23, 0x5C, 0x01, 0x43, 0x1F, 0x02, 0x42, 0x42, 0x76, 0x42, +/* 00007B70 */ 0x29, 0x24, 0x47, 0x42, 0x29, 0x8E, 0x03, 0x0C, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, +/* 00007B80 */ 0x03, 0x24, 0x44, 0x5C, 0x01, 0x44, 0x61, 0x44, 0x29, 0x25, 0x5C, 0x02, 0x44, 0x1F, 0x03, 0x43, +/* 00007B90 */ 0x43, 0x76, 0x43, 0x42, 0x26, 0x61, 0x42, 0x29, 0x27, 0xA8, 0x43, 0x15, 0x03, 0x00, 0x42, 0x43, +/* 00007BA0 */ 0x09, 0x0C, 0x00, 0x61, 0x42, 0x29, 0x28, 0x43, 0x42, 0x42, 0x20, 0x76, 0x42, 0x29, 0x1D, 0x76, +/* 00007BB0 */ 0x06, 0x29, 0x29, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, +/* 00007BC0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x7E, 0x02, +/* 00007BD0 */ 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x81, 0x02, +/* 00007BE0 */ 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, 0x02, +/* 00007BF0 */ 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x66, 0x02, 0xFE, 0x60, 0x02, 0xFE, +/* 00007C00 */ 0x7D, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x82, +/* 00007C10 */ 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x90, 0x02, +/* 00007C20 */ 0xFE, 0x21, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x89, 0x02, 0xFE, +/* 00007C30 */ 0x8A, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x91, +/* 00007C40 */ 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x93, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x1A, 0x02, 0xFE, 0x1A, 0x02, +/* 00007C50 */ 0xFE, 0x27, 0x02, 0xFE, 0x26, 0x02, 0xFE, 0x94, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x14, 0x02, 0xFE, +/* 00007C60 */ 0x8D, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x6E, 0x02, 0xFF, 0x23, 0x18, 0x01, 0x00, 0x3F, 0x02, 0x00, +/* 00007C70 */ 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x2D, 0x00, 0x9F, 0x00, 0x18, 0x00, +/* 00007C80 */ 0x71, 0x00, 0x04, 0x00, 0x67, 0x00, 0x1C, 0x00, 0x46, 0x00, 0x2B, 0x00, 0x71, 0x00, 0x24, 0x00, +/* 00007C90 */ 0x60, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x1B, 0x00, 0x6C, 0x00, 0x15, 0x00, 0x4D, 0x00, 0x0A, 0x00, +/* 00007CA0 */ 0x32, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x31, 0x00, 0x6F, 0x00, 0x31, 0x00, 0x67, 0x00, 0x2D, 0x00, +/* 00007CB0 */ 0x64, 0x00, 0x39, 0x00, 0x81, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x2D, 0x00, +/* 00007CC0 */ 0x68, 0x00, 0x2D, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x70, 0x00, 0x36, 0x00, 0x6F, 0x00, 0x2B, 0x00, +/* 00007CD0 */ 0x77, 0x00, 0x28, 0x00, 0x71, 0x00, 0x5B, 0x00, 0xD0, 0x01, 0x14, 0x00, 0x41, 0x00, 0x2C, 0x00, +/* 00007CE0 */ 0x9A, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x36, 0x00, 0x08, 0x00, 0x68, 0x00, 0x04, 0x00, +/* 00007CF0 */ 0x34, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x30, 0x00, 0x04, 0x00, +/* 00007D00 */ 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, +/* 00007D10 */ 0x3F, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, +/* 00007D20 */ 0xFA, 0x02, 0x06, 0x00, 0x93, 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x11, 0x00, +/* 00007D30 */ 0xEF, 0x00, 0x1C, 0x00, 0x54, 0x00, 0x1D, 0x00, 0x6A, 0x00, 0x04, 0x00, 0x37, 0x00, 0x07, 0x00, +/* 00007D40 */ 0x5A, 0x00, 0x28, 0x00, 0xDE, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x11, 0x00, +/* 00007D50 */ 0x77, 0x01, 0x13, 0x00, 0x77, 0x00, 0x1B, 0x00, 0x66, 0x00, 0x23, 0x00, 0x82, 0x00, 0x0E, 0x00, +/* 00007D60 */ 0x3F, 0x00, 0x0C, 0x00, 0x6D, 0x00, 0x06, 0x00, 0x3F, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x11, +/* 00007D70 */ 0xC4, 0x00, 0xFE, 0x75, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x21, 0x04, 0x45, 0xFF, 0x8F, +/* 00007D80 */ 0x0A, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFF, 0x8F, 0x0A, 0x01, 0x00, 0xFE, +/* 00007D90 */ 0x2D, 0x0D, 0xFE, 0x2D, 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, 0xC8, 0xBB, 0x03, 0x07, 0x0A, 0x0A, +/* 00007DA0 */ 0x0A, 0x0A, 0x02, 0x15, 0x05, 0xFE, 0x4A, 0x04, 0x08, 0x05, 0xFE, 0x30, 0x04, 0x07, 0x05, 0xFE, +/* 00007DB0 */ 0x4B, 0x04, 0x01, 0x00, 0x05, 0xFE, 0x4C, 0x04, 0x05, 0xFE, 0x3F, 0x04, 0x05, 0xFE, 0x4D, 0x04, +/* 00007DC0 */ 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, +/* 00007DD0 */ 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x05, 0xFE, 0x4E, 0x04, 0xFE, 0x9A, 0x02, 0xA8, +/* 00007DE0 */ 0x14, 0x61, 0x16, 0x13, 0x00, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, +/* 00007DF0 */ 0x01, 0x05, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, +/* 00007E00 */ 0x13, 0x00, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x02, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, +/* 00007E10 */ 0x16, 0x13, 0x01, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x00, 0x00, 0x61, 0x16, 0x13, +/* 00007E20 */ 0x02, 0x14, 0x03, 0x00, 0x16, 0x04, 0x09, 0x70, 0x00, 0x8E, 0x03, 0x09, 0x17, 0x6C, 0x16, 0x17, +/* 00007E30 */ 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, +/* 00007E40 */ 0x1F, 0x03, 0x16, 0x16, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x22, 0x00, 0x8E, +/* 00007E50 */ 0x03, 0x14, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x13, 0x17, 0x07, 0x02, 0x00, +/* 00007E60 */ 0x5C, 0x01, 0x06, 0xC2, 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x09, 0x25, +/* 00007E70 */ 0x00, 0x8E, 0x03, 0x0C, 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x23, 0x17, 0x5C, +/* 00007E80 */ 0x01, 0x17, 0x5C, 0x02, 0x12, 0x97, 0x17, 0x14, 0x07, 0x5C, 0x03, 0x17, 0x5C, 0x04, 0x08, 0x1F, +/* 00007E90 */ 0x05, 0x16, 0x16, 0x47, 0x12, 0x16, 0x09, 0x79, 0x00, 0x61, 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, +/* 00007EA0 */ 0x16, 0x09, 0x09, 0x6D, 0x00, 0x8E, 0x03, 0x09, 0x17, 0x6C, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, +/* 00007EB0 */ 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x01, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x16, 0x16, +/* 00007EC0 */ 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x22, 0x00, 0x8E, 0x03, 0x14, 0x16, 0x07, +/* 00007ED0 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x13, 0x17, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x06, 0xC2, +/* 00007EE0 */ 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x09, 0x25, 0x00, 0x8E, 0x03, 0x0C, +/* 00007EF0 */ 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x23, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, +/* 00007F00 */ 0x12, 0x97, 0x17, 0x14, 0x07, 0x5C, 0x03, 0x17, 0x5C, 0x04, 0x0A, 0x1F, 0x05, 0x16, 0x16, 0x47, +/* 00007F10 */ 0x12, 0x16, 0x61, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x3B, 0x00, +/* 00007F20 */ 0x61, 0x16, 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x04, 0x09, 0x2F, 0x00, 0x61, 0x16, 0x13, 0x04, +/* 00007F30 */ 0x15, 0x03, 0x00, 0x16, 0x0B, 0x09, 0x23, 0x00, 0x8E, 0x01, 0x05, 0x16, 0x4B, 0x16, 0x07, 0x04, +/* 00007F40 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5C, 0x03, +/* 00007F50 */ 0x0C, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x09, 0x2E, 0x00, 0x61, 0x16, 0x13, 0x04, 0xA8, +/* 00007F60 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, +/* 00007F70 */ 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5C, +/* 00007F80 */ 0x03, 0x0C, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x05, 0xA8, 0x17, 0x15, +/* 00007F90 */ 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, +/* 00007FA0 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x05, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0D, +/* 00007FB0 */ 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x06, 0xA8, 0x17, 0x15, 0x03, 0x00, +/* 00007FC0 */ 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00007FD0 */ 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x06, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0E, 0x1F, 0x04, +/* 00007FE0 */ 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x07, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, +/* 00007FF0 */ 0x09, 0x20, 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 00008000 */ 0x01, 0x12, 0x61, 0x17, 0x13, 0x07, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0x16, 0x16, +/* 00008010 */ 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x08, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, +/* 00008020 */ 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, +/* 00008030 */ 0x61, 0x17, 0x13, 0x08, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x10, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, +/* 00008040 */ 0x16, 0x61, 0x16, 0x13, 0x09, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, +/* 00008050 */ 0x01, 0x05, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, +/* 00008060 */ 0x13, 0x09, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x47, +/* 00008070 */ 0x00, 0x12, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x88, 0x02, 0xFE, 0x8F, 0x02, 0xFE, +/* 00008080 */ 0x89, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x8C, +/* 00008090 */ 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x91, 0x02, 0x1C, 0xFE, 0x4F, 0x04, 0x00, 0x1C, 0xFE, 0x4F, 0x04, +/* 000080A0 */ 0x00, 0xFF, 0xDE, 0x0A, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x20, +/* 000080B0 */ 0x00, 0x88, 0x00, 0x0E, 0x00, 0x8E, 0x01, 0x0C, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x6B, 0x00, 0x08, +/* 000080C0 */ 0x00, 0x2E, 0x00, 0x22, 0x00, 0x91, 0x00, 0x28, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x1E, +/* 000080D0 */ 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x22, 0x00, 0x91, 0x00, 0x25, 0x00, 0x2F, 0x01, 0x26, +/* 000080E0 */ 0x00, 0x90, 0x00, 0x23, 0x00, 0x76, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x20, 0x00, 0x8B, 0x00, 0x0E, +/* 000080F0 */ 0x00, 0x3E, 0x00, 0x20, 0x00, 0x87, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x89, 0x00, 0x0E, +/* 00008100 */ 0x00, 0x41, 0x00, 0x20, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x20, 0x00, 0x8D, 0x00, 0x0E, +/* 00008110 */ 0x00, 0x47, 0x00, 0x20, 0x00, 0x8C, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, +/* 00008120 */ 0x01, 0xC4, 0x00, 0xFE, 0x61, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x20, 0x04, 0x44, 0xFF, +/* 00008130 */ 0x27, 0x05, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x27, 0x05, 0x01, 0x00, +/* 00008140 */ 0xFE, 0xF8, 0x04, 0xFE, 0xF8, 0x04, 0x01, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x06, 0x01, +/* 00008150 */ 0x01, 0x01, 0x01, 0x15, 0x05, 0xFE, 0x3A, 0x04, 0x05, 0xFE, 0x45, 0x04, 0x08, 0x07, 0x05, 0xFE, +/* 00008160 */ 0x46, 0x04, 0x05, 0xFE, 0x3D, 0x04, 0x05, 0xFE, 0x3E, 0x04, 0x05, 0xFE, 0x30, 0x04, 0x01, 0x00, +/* 00008170 */ 0x06, 0xFE, 0x40, 0x04, 0x01, 0x01, 0x05, 0xFE, 0x47, 0x04, 0x01, 0x02, 0x05, 0xFE, 0x48, 0x04, +/* 00008180 */ 0x05, 0xFE, 0x49, 0x04, 0xEA, 0x8E, 0x03, 0x09, 0x17, 0x6C, 0x16, 0x17, 0x00, 0x07, 0x03, 0x00, +/* 00008190 */ 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x11, 0x8E, 0x03, 0x0F, 0x18, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, +/* 000081A0 */ 0xFB, 0x19, 0x02, 0x13, 0x03, 0x5C, 0x01, 0x19, 0x1F, 0x02, 0x18, 0x18, 0x5C, 0x02, 0x18, 0x1F, +/* 000081B0 */ 0x03, 0x16, 0x16, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x34, 0x00, 0x8E, 0x03, +/* 000081C0 */ 0x14, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x13, 0x17, 0x07, 0x02, 0x00, 0xFC, +/* 000081D0 */ 0x18, 0x06, 0x11, 0x06, 0xFE, 0x18, 0x07, 0x02, 0x02, 0xFE, 0x18, 0x13, 0x08, 0x04, 0x5C, 0x01, +/* 000081E0 */ 0x18, 0xC2, 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x47, 0x00, 0x11, 0x09, +/* 000081F0 */ 0x7B, 0x00, 0x14, 0x03, 0x00, 0x12, 0x09, 0x09, 0x31, 0x00, 0x8E, 0x03, 0x0C, 0x16, 0x07, 0x05, +/* 00008200 */ 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x23, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x97, 0x17, +/* 00008210 */ 0x14, 0x0A, 0x5C, 0x03, 0x17, 0x97, 0x17, 0x14, 0x0C, 0xFB, 0x17, 0x0B, 0x17, 0x0D, 0x5C, 0x04, +/* 00008220 */ 0x17, 0x1F, 0x05, 0x00, 0x16, 0x09, 0x45, 0x00, 0x09, 0x3A, 0x00, 0x97, 0x16, 0x14, 0x0E, 0x15, +/* 00008230 */ 0x03, 0x00, 0x16, 0x0F, 0x09, 0x2E, 0x00, 0x8E, 0x03, 0x0C, 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, +/* 00008240 */ 0x04, 0x8E, 0x03, 0x23, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x97, 0x17, 0x14, 0x0A, 0x5C, +/* 00008250 */ 0x03, 0x17, 0x97, 0x17, 0x14, 0x0C, 0xFB, 0x17, 0x0B, 0x17, 0x10, 0x5C, 0x04, 0x17, 0x1F, 0x05, +/* 00008260 */ 0x00, 0x16, 0x09, 0x08, 0x00, 0x47, 0x00, 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 00008270 */ 0x39, 0x02, 0xFF, 0x4E, 0x06, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x91, 0x00, +/* 00008280 */ 0x08, 0x00, 0x2A, 0x00, 0x2E, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x08, 0x00, 0x33, 0x00, +/* 00008290 */ 0x31, 0x00, 0x81, 0x00, 0x0C, 0x00, 0x32, 0x00, 0x2E, 0x00, 0x8A, 0x00, 0x08, 0x00, 0x22, 0x00, +/* 000082A0 */ 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x50, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, +/* 000082B0 */ 0xFE, 0x1F, 0x04, 0x43, 0xFE, 0xF9, 0xFF, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xF9, +/* 000082C0 */ 0xFF, 0xFE, 0x20, 0x05, 0xFE, 0x20, 0x05, 0x01, 0x09, 0x14, 0x19, 0x07, 0x50, 0x4B, 0x03, 0x06, +/* 000082D0 */ 0x01, 0x01, 0x01, 0x01, 0x18, 0x05, 0xFE, 0x3A, 0x04, 0x05, 0xFE, 0x3B, 0x04, 0x08, 0x07, 0x05, +/* 000082E0 */ 0xFE, 0x3C, 0x04, 0x05, 0xFE, 0x3D, 0x04, 0x05, 0xFE, 0x3E, 0x04, 0x01, 0x02, 0x05, 0xFE, 0x3F, +/* 000082F0 */ 0x04, 0x05, 0xFE, 0x2E, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x40, 0x04, 0x01, 0x01, 0x06, 0xFE, 0x41, +/* 00008300 */ 0x04, 0x06, 0xFE, 0x42, 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x43, 0x04, 0x05, 0xFE, 0x44, +/* 00008310 */ 0x04, 0xFE, 0x19, 0x01, 0x8E, 0x03, 0x09, 0x1A, 0x6C, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00008320 */ 0x00, 0x1A, 0x5C, 0x01, 0x14, 0x8E, 0x03, 0x0F, 0x1B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, +/* 00008330 */ 0x1C, 0x02, 0x16, 0x03, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1B, 0x1B, 0x5C, 0x02, 0x1B, 0x1F, 0x03, +/* 00008340 */ 0x19, 0x19, 0x47, 0x17, 0x19, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x34, 0x00, 0x8E, 0x03, 0x14, +/* 00008350 */ 0x19, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x13, 0x1A, 0x07, 0x02, 0x00, 0xFC, 0x1B, +/* 00008360 */ 0x06, 0x14, 0x06, 0xFE, 0x1B, 0x07, 0x02, 0x02, 0xFE, 0x1B, 0x16, 0x08, 0x04, 0x5C, 0x01, 0x1B, +/* 00008370 */ 0xC2, 0x02, 0x1A, 0x1A, 0x5C, 0x01, 0x1A, 0x1F, 0x02, 0xFF, 0x19, 0x47, 0x00, 0x14, 0x09, 0xAA, +/* 00008380 */ 0x00, 0x97, 0x19, 0x17, 0x09, 0x15, 0x03, 0x00, 0x19, 0x0A, 0x09, 0x44, 0x00, 0x14, 0x03, 0x00, +/* 00008390 */ 0x15, 0x0B, 0x09, 0x3C, 0x00, 0x8E, 0x03, 0x0C, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, +/* 000083A0 */ 0x03, 0x23, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x97, 0x1A, 0x17, 0x0C, 0x5C, 0x03, 0x1A, +/* 000083B0 */ 0x97, 0x1A, 0x17, 0x0E, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, 0x2F, 0x1A, 0x1A, 0x0A, +/* 000083C0 */ 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0x00, 0x19, 0x09, 0x5D, 0x00, 0x09, 0x52, +/* 000083D0 */ 0x00, 0x15, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x4A, 0x00, 0x8E, 0x03, 0x0C, 0x19, 0x07, 0x05, 0x00, +/* 000083E0 */ 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x23, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x97, 0x1A, 0x17, +/* 000083F0 */ 0x0C, 0x5C, 0x03, 0x1A, 0x97, 0x1A, 0x17, 0x0E, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, +/* 00008400 */ 0x14, 0x03, 0x00, 0x15, 0x11, 0x09, 0x06, 0x00, 0x47, 0x1B, 0x12, 0x09, 0x03, 0x00, 0x47, 0x1B, +/* 00008410 */ 0x13, 0x2F, 0x1A, 0x1A, 0x1B, 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0x00, 0x19, +/* 00008420 */ 0x09, 0x08, 0x00, 0x47, 0x00, 0x14, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, +/* 00008430 */ 0xFF, 0xCF, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x0F, 0x01, 0x08, 0x00, +/* 00008440 */ 0x2A, 0x00, 0x2E, 0x00, 0xF5, 0x00, 0x06, 0x00, 0x39, 0x00, 0x14, 0x00, 0x47, 0x00, 0x3C, 0x00, +/* 00008450 */ 0x85, 0x00, 0x08, 0x00, 0x30, 0x00, 0x4A, 0x00, 0xC4, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, +/* 00008460 */ 0x4C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x47, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1E, +/* 00008470 */ 0x04, 0x42, 0xFE, 0x92, 0xFE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x92, 0xFE, 0xE9, +/* 00008480 */ 0xE9, 0x01, 0x03, 0x05, 0x07, 0x0E, 0x0B, 0x03, 0x01, 0x06, 0x06, 0xFE, 0x72, 0x03, 0x06, 0xFE, +/* 00008490 */ 0x0A, 0x03, 0x05, 0xFE, 0xFD, 0x03, 0x2A, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, +/* 000084A0 */ 0x06, 0x00, 0x47, 0x00, 0x03, 0x09, 0x17, 0x00, 0x8E, 0x02, 0x02, 0x07, 0x97, 0x07, 0x07, 0x05, +/* 000084B0 */ 0x47, 0x00, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 000084C0 */ 0x00, 0xFE, 0xCD, 0xFE, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x06, 0x00, 0x2E, +/* 000084D0 */ 0x00, 0x17, 0x00, 0x44, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x07, 0x05, +/* 000084E0 */ 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1D, 0x04, 0x40, 0xFE, 0x1A, 0xF3, 0x01, 0xFF, 0x00, 0x10, +/* 000084F0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x1A, 0xF3, 0xFE, 0x95, 0x09, 0xFE, 0x95, 0x09, 0x02, 0x06, 0x17, +/* 00008500 */ 0x1B, 0x05, 0xCC, 0xCA, 0x03, 0x07, 0x05, 0x05, 0x05, 0x05, 0x18, 0x19, 0x1A, 0x05, 0xFE, 0x2B, +/* 00008510 */ 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x2D, 0x04, 0x08, 0x05, 0xFE, 0x2E, 0x04, 0x05, 0xFE, +/* 00008520 */ 0x2F, 0x04, 0x05, 0xFE, 0x30, 0x04, 0x05, 0xFE, 0x31, 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x05, 0xFE, +/* 00008530 */ 0x32, 0x04, 0x05, 0xFE, 0x33, 0x04, 0x05, 0xFE, 0x34, 0x04, 0x05, 0xFE, 0x35, 0x04, 0x06, 0xFE, +/* 00008540 */ 0x27, 0x04, 0x05, 0xFE, 0x36, 0x04, 0x05, 0xFE, 0x37, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, 0xFE, +/* 00008550 */ 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x38, 0x04, 0xFE, 0xB7, 0x02, 0x96, +/* 00008560 */ 0x03, 0x17, 0xCD, 0x1B, 0x00, 0x96, 0x02, 0x1B, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x0F, +/* 00008570 */ 0x03, 0x00, 0x1B, 0x09, 0x6C, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x14, 0x12, 0x00, +/* 00008580 */ 0x1B, 0x02, 0x09, 0x00, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, +/* 00008590 */ 0x03, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, +/* 000085A0 */ 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x04, 0x1F, 0x04, +/* 000085B0 */ 0xFF, 0x1B, 0x09, 0x2D, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, +/* 000085C0 */ 0x06, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, +/* 000085D0 */ 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x07, 0x1F, 0x04, +/* 000085E0 */ 0xFF, 0x1B, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x01, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x5D, 0x00, +/* 000085F0 */ 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x08, 0x09, 0x21, 0x00, 0x8E, +/* 00008600 */ 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, +/* 00008610 */ 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x2D, 0x00, +/* 00008620 */ 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x1E, 0x00, 0x8E, +/* 00008630 */ 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, +/* 00008640 */ 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0B, 0x1F, 0x04, 0xFF, 0x1B, 0x92, 0x03, 0x1B, +/* 00008650 */ 0x61, 0x1B, 0x1B, 0x02, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0xAB, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, +/* 00008660 */ 0x1B, 0x02, 0x14, 0x12, 0x00, 0x1B, 0x08, 0x09, 0x00, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, +/* 00008670 */ 0x02, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, +/* 00008680 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, +/* 00008690 */ 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x6C, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, +/* 000086A0 */ 0x02, 0x14, 0x12, 0x00, 0x1B, 0x03, 0x09, 0x00, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x02, +/* 000086B0 */ 0x14, 0x03, 0x00, 0x1B, 0x02, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, +/* 000086C0 */ 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, +/* 000086D0 */ 0x03, 0x0D, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x2D, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x02, +/* 000086E0 */ 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, +/* 000086F0 */ 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, +/* 00008700 */ 0x03, 0x0E, 0x1F, 0x04, 0xFF, 0x1B, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x03, 0x0F, 0x03, 0x00, +/* 00008710 */ 0x1B, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, +/* 00008720 */ 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0F, 0x1F, 0x04, +/* 00008730 */ 0xFF, 0x1B, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x5D, 0x00, +/* 00008740 */ 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x21, 0x00, 0x8E, +/* 00008750 */ 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, +/* 00008760 */ 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x10, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x2D, 0x00, +/* 00008770 */ 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x1E, 0x00, 0x8E, +/* 00008780 */ 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, +/* 00008790 */ 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x1B, 0x8E, 0x03, 0x0C, +/* 000087A0 */ 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1C, 0x1C, 0x5C, 0x01, 0x1C, 0xCD, 0x1C, +/* 000087B0 */ 0x03, 0xA1, 0x00, 0x12, 0x1C, 0xA1, 0x01, 0x13, 0x1C, 0xA1, 0x02, 0x14, 0x1C, 0x5C, 0x02, 0x1C, +/* 000087C0 */ 0xD4, 0x00, 0x1C, 0x5C, 0x03, 0x1C, 0x1F, 0x04, 0xFF, 0x1B, 0x8E, 0x03, 0x0B, 0x1B, 0x07, 0x02, +/* 000087D0 */ 0x00, 0x5C, 0x00, 0x05, 0x92, 0x02, 0x1C, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1B, 0x1B, 0x11, 0x03, +/* 000087E0 */ 0x00, 0x1B, 0x15, 0x09, 0x24, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, +/* 000087F0 */ 0x8E, 0x03, 0x1F, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x16, +/* 00008800 */ 0x1F, 0x04, 0x1B, 0x1B, 0x47, 0x00, 0x1B, 0x09, 0x05, 0x00, 0xA8, 0x1B, 0x47, 0x00, 0x1B, 0x09, +/* 00008810 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, 0xFE, +/* 00008820 */ 0x80, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x39, 0x04, 0xFE, 0xFD, 0x01, 0xFE, 0x5B, 0xF3, 0x1C, 0x03, +/* 00008830 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x24, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x1E, 0x00, 0x5B, 0x00, 0x21, +/* 00008840 */ 0x00, 0x63, 0x00, 0x0F, 0x00, 0x3A, 0x00, 0x1E, 0x00, 0xA5, 0x00, 0x0E, 0x00, 0x28, 0x00, 0x0F, +/* 00008850 */ 0x00, 0x3A, 0x00, 0x21, 0x00, 0x5E, 0x00, 0x0F, 0x00, 0x3A, 0x00, 0x1E, 0x00, 0x75, 0x00, 0x0E, +/* 00008860 */ 0x00, 0x29, 0x00, 0x1E, 0x00, 0x5A, 0x00, 0x21, 0x00, 0x5A, 0x00, 0x1E, 0x00, 0x57, 0x00, 0x21, +/* 00008870 */ 0x00, 0x5F, 0x00, 0x0F, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x76, 0x00, 0x0E, 0x00, 0x27, 0x00, 0x1E, +/* 00008880 */ 0x00, 0x59, 0x00, 0x0E, 0x00, 0x30, 0x00, 0x0F, 0x00, 0x40, 0x00, 0x21, 0x00, 0x62, 0x00, 0x0F, +/* 00008890 */ 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x79, 0x00, 0x2D, 0x00, 0x3B, 0x01, 0x4A, 0x00, 0x72, 0x00, 0x00, +/* 000088A0 */ 0xA4, 0x88, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x31, 0x05, 0x55, 0xA2, +/* 000088B0 */ 0x41, 0xD1, 0x00, 0x41, 0xFE, 0x46, 0xFB, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x46, +/* 000088C0 */ 0xFB, 0xAC, 0xAC, 0x41, 0x04, 0x03, 0x05, 0x05, 0x10, 0x10, 0x04, 0x04, 0x04, 0x08, 0x32, 0x8E, +/* 000088D0 */ 0x01, 0x03, 0x05, 0x97, 0x05, 0x05, 0x03, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x1F, 0x00, 0x8E, 0x04, +/* 000088E0 */ 0x0C, 0x05, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x04, 0x1E, 0x06, 0x5C, 0x01, 0x06, 0x8E, +/* 000088F0 */ 0x01, 0x02, 0x06, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0xFF, 0x05, 0xA8, 0x00, 0x24, +/* 00008900 */ 0x00, 0xFE, 0x6B, 0xFB, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x2C, 0x00, 0x21, 0x00, 0x5A, +/* 00008910 */ 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x09, 0xC4, 0x10, 0xFE, 0xD4, 0x04, 0x0C, 0xA3, 0x41, 0xC1, +/* 00008920 */ 0x00, 0xFE, 0x1C, 0x04, 0x3F, 0xFE, 0x61, 0xE9, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, +/* 00008930 */ 0x61, 0xE9, 0xFE, 0x21, 0x09, 0xFE, 0x21, 0x09, 0x01, 0x07, 0x15, 0x1A, 0x05, 0x93, 0x8D, 0x03, +/* 00008940 */ 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x19, 0x07, 0x08, 0x0B, 0x06, 0xFE, 0x15, 0x04, 0x05, 0xFE, +/* 00008950 */ 0x12, 0x04, 0x0C, 0x05, 0xFE, 0x17, 0x04, 0x06, 0xFE, 0x13, 0x04, 0x06, 0xFE, 0x25, 0x04, 0x06, +/* 00008960 */ 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x12, 0x03, 0x06, 0xFE, 0x13, 0x03, 0x06, +/* 00008970 */ 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, +/* 00008980 */ 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0xFE, 0x39, 0x02, 0xA8, 0x1A, 0x14, 0x03, 0x00, 0x15, +/* 00008990 */ 0x1A, 0x09, 0x1C, 0x00, 0x8E, 0x03, 0x0A, 0x1A, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x1B, +/* 000089A0 */ 0x5C, 0x01, 0x1B, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x1A, 0x1A, 0x47, 0x15, 0x1A, 0x09, 0x18, 0x00, +/* 000089B0 */ 0x8E, 0x03, 0x31, 0x1B, 0x6C, 0x1A, 0x1B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, +/* 000089C0 */ 0x15, 0x1F, 0x02, 0x1A, 0x1A, 0x47, 0x15, 0x1A, 0x47, 0x18, 0x04, 0x14, 0x0B, 0x00, 0x16, 0x05, +/* 000089D0 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x3B, 0x00, 0x61, 0x1A, 0x15, 0x01, 0xA8, +/* 000089E0 */ 0x1B, 0x15, 0x2D, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x02, 0xA8, 0x1B, 0x15, +/* 000089F0 */ 0x1F, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x03, 0xA8, 0x1B, 0x15, 0x11, 0x00, +/* 00008A00 */ 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x04, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, +/* 00008A10 */ 0x09, 0x03, 0x00, 0x47, 0x18, 0x07, 0x14, 0x0B, 0x00, 0x16, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, +/* 00008A20 */ 0x00, 0x16, 0x06, 0x09, 0x2D, 0x00, 0x61, 0x1A, 0x15, 0x05, 0xA8, 0x1B, 0x15, 0x1F, 0x00, 0x1A, +/* 00008A30 */ 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x06, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, 0x09, +/* 00008A40 */ 0x00, 0x00, 0x61, 0x1A, 0x15, 0x07, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, 0x00, +/* 00008A50 */ 0x47, 0x18, 0x07, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xAC, 0x00, 0x14, 0x0B, 0x00, 0x17, 0x05, 0x09, +/* 00008A60 */ 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0x9C, 0x00, 0x8E, 0x03, 0x1B, 0x1A, 0x07, 0x04, +/* 00008A70 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x0A, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00008A80 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, +/* 00008A90 */ 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x8E, 0x03, +/* 00008AA0 */ 0x1B, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x10, 0xCC, 0x18, +/* 00008AB0 */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, +/* 00008AC0 */ 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, +/* 00008AD0 */ 0xFF, 0x1A, 0x8E, 0x03, 0x1B, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, +/* 00008AE0 */ 0x02, 0x11, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, +/* 00008AF0 */ 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, +/* 00008B00 */ 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xAC, 0x00, 0x14, 0x0B, 0x00, +/* 00008B10 */ 0x17, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0x9C, 0x00, 0x8E, 0x03, 0x1B, +/* 00008B20 */ 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x12, 0xCC, 0x48, 0x00, +/* 00008B30 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, +/* 00008B40 */ 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, +/* 00008B50 */ 0x1A, 0x8E, 0x03, 0x1B, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, +/* 00008B60 */ 0x13, 0xCC, 0x60, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, +/* 00008B70 */ 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, +/* 00008B80 */ 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x8E, 0x03, 0x1B, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 00008B90 */ 0x01, 0x15, 0x5C, 0x02, 0x14, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1B, 0x00, +/* 00008BA0 */ 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, +/* 00008BB0 */ 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x47, 0x00, 0x15, 0x09, 0x02, 0x00, 0xA8, +/* 00008BC0 */ 0x00, 0x24, 0x00, 0x06, 0x90, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00008BD0 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00008BE0 */ 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00008BF0 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x48, 0x00, +/* 00008C00 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 00008C10 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 00008C20 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00008C30 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00008C40 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00008C50 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00008C60 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0x66, +/* 00008C70 */ 0x03, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x82, 0x02, +/* 00008C80 */ 0xFE, 0x81, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, +/* 00008C90 */ 0xB4, 0x01, 0xFE, 0xAB, 0xE9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x1C, 0x00, +/* 00008CA0 */ 0x4F, 0x00, 0x18, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x10, 0x00, 0x45, 0x00, 0x38, 0x00, +/* 00008CB0 */ 0x97, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x45, 0x00, 0x2A, 0x00, 0x7A, 0x00, 0x03, 0x00, +/* 00008CC0 */ 0x4F, 0x00, 0x17, 0x00, 0x57, 0x00, 0x34, 0x00, 0xCB, 0x00, 0x34, 0x00, 0xCC, 0x00, 0x34, 0x00, +/* 00008CD0 */ 0xD8, 0x00, 0x17, 0x00, 0x57, 0x00, 0x34, 0x00, 0xCB, 0x00, 0x34, 0x00, 0xCD, 0x00, 0x34, 0x00, +/* 00008CE0 */ 0xDB, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0xA9, 0xD6, 0x92, 0xFE, 0xC7, +/* 00008CF0 */ 0x03, 0x18, 0xA0, 0x41, 0xD1, 0x00, 0x36, 0xFE, 0xF4, 0xB1, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00008D00 */ 0x01, 0x01, 0xFE, 0xF4, 0xB1, 0xFE, 0x78, 0x36, 0xFE, 0x78, 0x36, 0x03, 0x0D, 0x2D, 0x33, 0x09, +/* 00008D10 */ 0xC8, 0xC8, 0x01, 0x0A, 0x10, 0x10, 0x10, 0x10, 0x07, 0x02, 0x30, 0x31, 0x32, 0x33, 0x06, 0xFE, +/* 00008D20 */ 0xD6, 0x03, 0x01, 0x00, 0x06, 0xFE, 0xD7, 0x03, 0x06, 0xFE, 0xD8, 0x03, 0x01, 0x01, 0x06, 0xFE, +/* 00008D30 */ 0xD9, 0x03, 0x01, 0x02, 0x06, 0xFE, 0xF1, 0x02, 0x01, 0x03, 0x07, 0x08, 0x06, 0xFE, 0xDA, 0x03, +/* 00008D40 */ 0x06, 0xFE, 0xDB, 0x03, 0x06, 0xFE, 0xDC, 0x03, 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xDD, 0x03, +/* 00008D50 */ 0x05, 0xFE, 0xDE, 0x03, 0x05, 0xFE, 0xDF, 0x03, 0x05, 0xFE, 0xE0, 0x03, 0x06, 0xFE, 0xFA, 0x02, +/* 00008D60 */ 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0B, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x5D, +/* 00008D70 */ 0x03, 0x06, 0xFE, 0xE1, 0x03, 0x05, 0xFE, 0xE2, 0x03, 0x05, 0xFE, 0xE3, 0x03, 0x05, 0xFE, 0xE4, +/* 00008D80 */ 0x03, 0x05, 0xFE, 0xE5, 0x03, 0x05, 0xFE, 0xE6, 0x03, 0x05, 0xFE, 0xE7, 0x03, 0x06, 0xFE, 0xE8, +/* 00008D90 */ 0x03, 0x06, 0xFE, 0xE9, 0x03, 0x05, 0xFE, 0xEA, 0x03, 0x06, 0xFE, 0xB4, 0x03, 0x0C, 0x06, 0xFE, +/* 00008DA0 */ 0x13, 0x03, 0x06, 0xFE, 0xB5, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, 0xEB, 0x03, 0x06, 0xFE, +/* 00008DB0 */ 0xB8, 0x03, 0x05, 0xFE, 0xEC, 0x03, 0xFE, 0x16, 0x03, 0xA8, 0x2D, 0xA8, 0x2E, 0xA8, 0x2F, 0x4F, +/* 00008DC0 */ 0x35, 0x96, 0x03, 0x35, 0x4F, 0x35, 0x96, 0x04, 0x35, 0x8E, 0x01, 0x0A, 0x35, 0x07, 0x03, 0x00, +/* 00008DD0 */ 0x5C, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, +/* 00008DE0 */ 0x7A, 0x03, 0x36, 0x00, 0x7A, 0x03, 0x36, 0x01, 0x7A, 0x06, 0x36, 0x02, 0x7A, 0x08, 0x36, 0x03, +/* 00008DF0 */ 0x7A, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x35, 0x35, 0x96, 0x03, +/* 00008E00 */ 0x35, 0x8E, 0x01, 0x0A, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x1C, 0x00, 0x00, 0x00, +/* 00008E10 */ 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7A, 0x03, 0x36, 0x00, 0x7A, 0x03, 0x36, 0x05, +/* 00008E20 */ 0x7A, 0x06, 0x36, 0x06, 0x7A, 0x08, 0x36, 0x07, 0x7A, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5C, +/* 00008E30 */ 0x02, 0x0B, 0x1F, 0x03, 0x35, 0x35, 0x96, 0x04, 0x35, 0x8E, 0x01, 0x38, 0x35, 0x14, 0x0F, 0x00, +/* 00008E40 */ 0x35, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x38, 0x35, 0x14, 0x03, 0x00, 0x35, 0x11, 0x09, 0x75, +/* 00008E50 */ 0x02, 0xDE, 0x00, 0x03, 0x02, 0xB8, 0x35, 0x00, 0x01, 0x51, 0x01, 0x00, 0x2D, 0x35, 0x95, 0x00, +/* 00008E60 */ 0x02, 0x2D, 0x8E, 0x01, 0x09, 0x36, 0x6C, 0x35, 0x36, 0x08, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x36, +/* 00008E70 */ 0x8E, 0x01, 0x2A, 0x37, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x12, 0xB8, 0x39, 0x00, +/* 00008E80 */ 0x01, 0x51, 0x01, 0x01, 0x38, 0x39, 0x5C, 0x02, 0x38, 0x1F, 0x03, 0x37, 0x37, 0x5C, 0x01, 0x37, +/* 00008E90 */ 0x8E, 0x01, 0x3B, 0x37, 0x4B, 0x37, 0x61, 0x37, 0x37, 0x09, 0x5C, 0x02, 0x37, 0x1F, 0x03, 0xFF, +/* 00008EA0 */ 0x35, 0x8E, 0x01, 0x38, 0x35, 0x14, 0x03, 0x00, 0x35, 0x10, 0x09, 0x19, 0x02, 0xDE, 0x01, 0x04, +/* 00008EB0 */ 0x03, 0xB8, 0x35, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x35, 0x35, 0x01, 0x51, 0x01, 0x02, 0x2E, +/* 00008EC0 */ 0x35, 0x95, 0x01, 0x02, 0x2E, 0x01, 0x51, 0x01, 0x03, 0x2F, 0x35, 0x95, 0x01, 0x03, 0x2F, 0x8E, +/* 00008ED0 */ 0x01, 0x2A, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x13, 0x90, 0x01, 0x02, 0x36, +/* 00008EE0 */ 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, 0x2A, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00008EF0 */ 0x0C, 0x5C, 0x01, 0x14, 0x90, 0x01, 0x03, 0x36, 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, +/* 00008F00 */ 0x01, 0x1B, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, 0x5C, 0x01, 0x36, +/* 00008F10 */ 0x5C, 0x02, 0x15, 0xCC, 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, +/* 00008F20 */ 0x8E, 0x01, 0x48, 0x37, 0x4B, 0x37, 0x7A, 0x37, 0x36, 0x0A, 0x7A, 0x18, 0x36, 0x0B, 0x7A, 0x18, +/* 00008F30 */ 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0xCD, 0x35, 0x0B, 0xA1, 0x00, 0x1A, 0x35, +/* 00008F40 */ 0xA1, 0x01, 0x1B, 0x35, 0xA1, 0x02, 0x1C, 0x35, 0xA1, 0x03, 0x1D, 0x35, 0xA1, 0x04, 0x1E, 0x35, +/* 00008F50 */ 0xA1, 0x05, 0x1F, 0x35, 0xA1, 0x06, 0x20, 0x35, 0xA1, 0x07, 0x21, 0x35, 0xA1, 0x08, 0x22, 0x35, +/* 00008F60 */ 0xA1, 0x09, 0x23, 0x35, 0xA1, 0x0A, 0x24, 0x35, 0x96, 0x02, 0x35, 0x8E, 0x01, 0x1B, 0x35, 0x07, +/* 00008F70 */ 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x25, 0xCC, +/* 00008F80 */ 0x4C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x37, +/* 00008F90 */ 0x07, 0x01, 0x00, 0xC2, 0x01, 0x37, 0x37, 0x7A, 0x37, 0x36, 0x0A, 0x7A, 0x26, 0x36, 0x0B, 0x7A, +/* 00008FA0 */ 0x26, 0x36, 0x0D, 0x7A, 0x26, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x8E, 0x01, +/* 00008FB0 */ 0x0A, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, 0x61, 0x36, 0x36, 0x0E, +/* 00008FC0 */ 0x5C, 0x01, 0x36, 0x8E, 0x01, 0x0E, 0x36, 0x61, 0x36, 0x36, 0x0E, 0x5C, 0x02, 0x36, 0x1F, 0x03, +/* 00008FD0 */ 0xFF, 0x35, 0x8E, 0x01, 0x1B, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, +/* 00008FE0 */ 0x61, 0x36, 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x28, 0xCC, 0x64, 0x00, 0x00, 0x00, 0x04, +/* 00008FF0 */ 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x37, 0x7A, 0x37, 0x36, 0x0A, 0x7A, +/* 00009000 */ 0x18, 0x36, 0x0B, 0x7A, 0x26, 0x36, 0x0D, 0x7A, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, 0x04, +/* 00009010 */ 0xFF, 0x35, 0x8E, 0x01, 0x1B, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, +/* 00009020 */ 0x61, 0x36, 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x29, 0xCC, 0x7C, 0x00, 0x00, 0x00, 0x05, +/* 00009030 */ 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xB8, 0x38, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x38, +/* 00009040 */ 0x38, 0x01, 0x51, 0x01, 0x04, 0x37, 0x38, 0x7A, 0x37, 0x36, 0x0A, 0x01, 0x65, 0x01, 0x37, 0x36, +/* 00009050 */ 0x7A, 0x18, 0x36, 0x0B, 0x7A, 0x26, 0x36, 0x0D, 0x7A, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, +/* 00009060 */ 0x04, 0xFF, 0x35, 0x8E, 0x01, 0x1B, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, +/* 00009070 */ 0x36, 0x61, 0x36, 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x2A, 0xCC, 0x94, 0x00, 0x00, 0x00, +/* 00009080 */ 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x2A, 0x37, 0x07, 0x03, 0x00, 0x5C, +/* 00009090 */ 0x00, 0x0C, 0x5C, 0x01, 0x2C, 0xB8, 0x39, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x39, 0x39, 0x01, +/* 000090A0 */ 0x51, 0x01, 0x05, 0x38, 0x39, 0x5C, 0x02, 0x38, 0x1F, 0x03, 0x37, 0x37, 0x7A, 0x37, 0x36, 0x0F, +/* 000090B0 */ 0x7A, 0x26, 0x36, 0x0D, 0x7A, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x90, +/* 000090C0 */ 0x01, 0x02, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x07, +/* 000090D0 */ 0xA8, 0x00, 0x94, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x01, +/* 000090E0 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 000090F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00009100 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00009110 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00009120 */ 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00009130 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x38, 0x00, +/* 00009140 */ 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 00009150 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, +/* 00009160 */ 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xDA, 0x03, 0x00, 0x00, 0xDB, 0x03, 0x00, 0x00, 0xDC, 0x03, +/* 00009170 */ 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, +/* 00009180 */ 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xD7, 0x03, 0x00, 0x00, 0xD8, 0x03, 0x00, 0x00, 0xD9, 0x03, +/* 00009190 */ 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0xFE, 0xD6, 0x03, 0xFE, 0xD7, 0x03, 0xFE, 0xD8, 0x03, 0xFE, +/* 000091A0 */ 0xD9, 0x03, 0xFE, 0xF1, 0x02, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, 0xFE, 0xDC, 0x03, 0xFE, 0x34, +/* 000091B0 */ 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, +/* 000091C0 */ 0xFE, 0x48, 0x01, 0xFE, 0xB7, 0x01, 0xFE, 0xFD, 0x01, 0xFE, 0xED, 0x03, 0xFE, 0xEE, 0x03, 0x02, +/* 000091D0 */ 0x02, 0x01, 0x00, 0xFE, 0xEF, 0x03, 0x03, 0x02, 0x00, 0xFE, 0x1C, 0x02, 0x01, 0xFE, 0x1E, 0x02, +/* 000091E0 */ 0xFE, 0x59, 0xB2, 0x11, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x94, 0x01, 0x38, 0x00, 0x0B, 0x02, +/* 000091F0 */ 0x29, 0x00, 0x0A, 0x1C, 0x3F, 0x00, 0xD7, 0x02, 0x2E, 0x00, 0x5A, 0x04, 0x18, 0x00, 0x3B, 0x03, +/* 00009200 */ 0x18, 0x00, 0x52, 0x00, 0x3A, 0x00, 0x9B, 0x00, 0x32, 0x00, 0x1F, 0x01, 0x43, 0x00, 0x99, 0x00, +/* 00009210 */ 0x24, 0x00, 0x48, 0x00, 0x40, 0x00, 0x9E, 0x00, 0x51, 0x00, 0xC2, 0x04, 0x5C, 0x00, 0x16, 0x03, +/* 00009220 */ 0x07, 0x00, 0x84, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x34, 0x99, 0x00, 0x00, 0xF5, 0x97, 0x00, +/* 00009230 */ 0x00, 0x23, 0x96, 0x00, 0x00, 0xE2, 0x94, 0x00, 0x00, 0x24, 0x93, 0x00, 0x00, 0x41, 0x92, 0x00, +/* 00009240 */ 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xBB, 0x04, 0x39, 0xA0, 0x41, 0xD1, 0x00, +/* 00009250 */ 0x3D, 0xFE, 0x2D, 0xE5, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x2D, 0xE5, 0xFE, 0x56, +/* 00009260 */ 0x02, 0xFE, 0x56, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x01, 0x04, 0x04, 0x04, +/* 00009270 */ 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xF7, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x78, 0x5B, +/* 00009280 */ 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x18, 0x00, 0x8E, +/* 00009290 */ 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, +/* 000092A0 */ 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, +/* 000092B0 */ 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, +/* 000092C0 */ 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, 0x08, 0x06, 0x02, 0x0F, 0x1B, 0x00, +/* 000092D0 */ 0x08, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 000092E0 */ 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x61, 0x00, 0x06, 0x03, +/* 000092F0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, 0x02, +/* 00009300 */ 0xFE, 0x7A, 0x02, 0xFE, 0x53, 0xE5, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x18, +/* 00009310 */ 0x00, 0x84, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x69, 0x00, 0x18, 0x00, 0x84, 0x00, 0x09, +/* 00009320 */ 0x00, 0x37, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0xA5, 0x04, 0x1B, 0xA0, +/* 00009330 */ 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x3B, 0xFE, 0x56, 0xE0, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00009340 */ 0x01, 0x01, 0xFE, 0x56, 0xE0, 0xFE, 0x08, 0x04, 0xFE, 0x08, 0x04, 0x02, 0x06, 0x07, 0x0B, 0x05, +/* 00009350 */ 0x40, 0x40, 0x04, 0x07, 0x03, 0x03, 0x03, 0x03, 0x08, 0x09, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, +/* 00009360 */ 0xFE, 0xF8, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x07, 0x08, 0xCE, 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x2C, +/* 00009370 */ 0x0B, 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, +/* 00009380 */ 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, +/* 00009390 */ 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, +/* 000093A0 */ 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x96, 0x02, 0x0B, 0x92, 0x02, 0x0B, 0xA8, 0x0C, 0x14, +/* 000093B0 */ 0x11, 0x00, 0x0B, 0x0C, 0x09, 0x00, 0x00, 0x92, 0x02, 0x0B, 0x61, 0x0B, 0x0B, 0x02, 0x0F, 0x1B, +/* 000093C0 */ 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, +/* 000093D0 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x0A, +/* 000093E0 */ 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x05, 0x1F, +/* 000093F0 */ 0x03, 0x0B, 0x0B, 0x96, 0x03, 0x0B, 0x8E, 0x04, 0x0C, 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, +/* 00009400 */ 0x8E, 0x04, 0x1C, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, 0x03, 0x02, 0x0C, 0x5C, 0x02, 0x0C, 0xD4, 0x00, +/* 00009410 */ 0x0C, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0xFF, 0x0B, 0x8E, 0x04, 0x0A, 0x0B, 0x07, 0x03, 0x00, 0x5C, +/* 00009420 */ 0x00, 0x06, 0x92, 0x03, 0x0C, 0x5C, 0x01, 0x0C, 0xCB, 0x0C, 0x5C, 0x02, 0x0C, 0x1F, 0x03, 0x00, +/* 00009430 */ 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, +/* 00009440 */ 0x02, 0xFE, 0xF9, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x8B, 0xE0, 0x09, 0x05, 0x00, 0x00, 0x00, 0x0B, +/* 00009450 */ 0x00, 0x3C, 0x00, 0x18, 0x00, 0x8C, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x1B, 0x00, 0x69, 0x00, 0x18, +/* 00009460 */ 0x00, 0x8D, 0x00, 0x19, 0x00, 0x47, 0x00, 0x22, 0x00, 0x44, 0x01, 0x1E, 0x00, 0x3E, 0x00, 0x00, +/* 00009470 */ 0x74, 0x94, 0x00, 0x00, 0xBF, 0x4C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xB0, 0x04, 0x48, 0xA2, +/* 00009480 */ 0x41, 0xD1, 0x00, 0x3C, 0xFE, 0x0B, 0xE3, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0B, +/* 00009490 */ 0xE3, 0xF8, 0xF8, 0x41, 0x05, 0x04, 0x06, 0x0D, 0x0D, 0x05, 0x02, 0x05, 0x05, 0xFE, 0xFA, 0x03, +/* 000094A0 */ 0x06, 0xFE, 0x72, 0x03, 0x2C, 0x8E, 0x01, 0x02, 0x06, 0x2F, 0x07, 0x02, 0x04, 0x2D, 0x06, 0x06, +/* 000094B0 */ 0x07, 0x15, 0x03, 0x00, 0x06, 0x03, 0x09, 0x14, 0x00, 0x8E, 0x01, 0x03, 0x06, 0x8E, 0x01, 0x02, +/* 000094C0 */ 0x07, 0x2F, 0x08, 0x02, 0x04, 0x97, 0x07, 0x07, 0x08, 0x9C, 0x07, 0x06, 0x04, 0xA8, 0x00, 0x24, +/* 000094D0 */ 0x00, 0xFE, 0x3B, 0xE3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x5A, 0x00, 0x16, 0x00, 0x6D, +/* 000094E0 */ 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x89, 0x04, 0x10, 0xA3, 0x41, 0xC1, +/* 000094F0 */ 0x00, 0xFE, 0xEB, 0x03, 0x3A, 0xFE, 0x7A, 0xD9, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 00009500 */ 0x7A, 0xD9, 0xFE, 0xE3, 0x02, 0xFE, 0xE3, 0x02, 0x01, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, +/* 00009510 */ 0x03, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xF7, 0x03, 0x06, 0xFE, +/* 00009520 */ 0x15, 0x03, 0x01, 0x00, 0x08, 0xC9, 0x5B, 0x08, 0xB3, 0x08, 0x08, 0x8E, 0x04, 0x31, 0x0C, 0x6C, +/* 00009530 */ 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, +/* 00009540 */ 0x47, 0x07, 0x0B, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x04, +/* 00009550 */ 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, +/* 00009560 */ 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, +/* 00009570 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, +/* 00009580 */ 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x61, 0x0B, 0x09, 0x03, 0x0F, 0x1B, 0x00, 0x0B, +/* 00009590 */ 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 000095A0 */ 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x11, 0x0B, 0x07, +/* 000095B0 */ 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x04, 0x09, 0x0D, 0x6C, 0x0C, 0x0D, 0x04, 0x07, 0x03, 0x00, +/* 000095C0 */ 0x5C, 0x00, 0x0D, 0x2A, 0x0E, 0x05, 0x14, 0x03, 0x00, 0x07, 0x0E, 0x09, 0x06, 0x00, 0x47, 0x0E, +/* 000095D0 */ 0x05, 0x09, 0x03, 0x00, 0x47, 0x0E, 0x07, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x09, 0x1F, 0x03, 0x0C, +/* 000095E0 */ 0x0C, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 000095F0 */ 0x5E, 0x02, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0x2F, 0x02, 0xFE, 0xA3, +/* 00009600 */ 0xD9, 0x08, 0x05, 0x00, 0x00, 0x00, 0x18, 0x00, 0x2F, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x18, 0x00, +/* 00009610 */ 0x7C, 0x00, 0x18, 0x00, 0x47, 0x00, 0x15, 0x00, 0x65, 0x00, 0x18, 0x00, 0xD4, 0x00, 0x42, 0x00, +/* 00009620 */ 0x56, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x6D, 0x04, 0x10, 0xA3, 0x41, +/* 00009630 */ 0xC1, 0x00, 0xFE, 0x15, 0x03, 0x39, 0xFE, 0x04, 0xD5, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, +/* 00009640 */ 0xFE, 0x04, 0xD5, 0xFE, 0x1E, 0x04, 0xFE, 0x1E, 0x04, 0x01, 0x09, 0x05, 0x0B, 0x05, 0x62, 0x5B, +/* 00009650 */ 0x04, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x15, 0x03, 0x07, 0xFE, 0x3D, 0x01, +/* 00009660 */ 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, 0x05, 0x02, 0xA8, 0x0B, +/* 00009670 */ 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, 0x0B, 0x4F, 0x08, 0x4F, +/* 00009680 */ 0x09, 0x6A, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, 0x09, 0x00, 0x00, 0xA8, +/* 00009690 */ 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x16, 0x00, 0x8E, 0x01, 0x02, 0x0B, 0x4B, 0x0B, 0x07, +/* 000096A0 */ 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC2, 0x03, 0x00, 0x0B, 0x09, 0xEC, 0x00, 0x8E, +/* 000096B0 */ 0x04, 0x31, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, +/* 000096C0 */ 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x08, 0x0B, 0x8E, 0x04, 0x17, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 000096D0 */ 0x02, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x18, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, +/* 000096E0 */ 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, +/* 000096F0 */ 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, +/* 00009700 */ 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x03, +/* 00009710 */ 0x00, 0x09, 0x0B, 0x09, 0x31, 0x00, 0x8E, 0x04, 0x0A, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, +/* 00009720 */ 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x8E, +/* 00009730 */ 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, +/* 00009740 */ 0x5C, 0x02, 0x09, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x02, 0x02, 0x0B, 0x4B, 0x0B, 0x07, 0x04, 0x00, +/* 00009750 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, 0x1F, 0x04, 0xFF, 0x0B, +/* 00009760 */ 0x47, 0x0B, 0x09, 0x8E, 0x04, 0x0C, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x04, 0x20, +/* 00009770 */ 0x0D, 0x5C, 0x01, 0x0D, 0x8E, 0x01, 0x03, 0x0D, 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, +/* 00009780 */ 0x1F, 0x04, 0x0C, 0x0C, 0x76, 0x0C, 0x0B, 0x04, 0x61, 0x0B, 0x09, 0x05, 0x82, 0x0B, 0x0B, 0x2B, +/* 00009790 */ 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, +/* 000097A0 */ 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x7A, 0x02, 0xDD, +/* 000097B0 */ 0xFE, 0x1A, 0xD5, 0x10, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x2B, 0x00, +/* 000097C0 */ 0x18, 0x00, 0x43, 0x00, 0x16, 0x00, 0x56, 0x00, 0x18, 0x00, 0x38, 0x00, 0x18, 0x00, 0x38, 0x00, +/* 000097D0 */ 0x15, 0x00, 0x9B, 0x00, 0x18, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x19, 0x00, 0x3F, 0x00, +/* 000097E0 */ 0x18, 0x00, 0x58, 0x00, 0x19, 0x00, 0x4D, 0x00, 0x28, 0x00, 0x65, 0x00, 0x0B, 0x00, 0x3D, 0x00, +/* 000097F0 */ 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x03, 0xC4, 0x00, 0xFE, 0x5F, 0x04, 0x62, +/* 00009800 */ 0xA0, 0x41, 0xF1, 0x00, 0x38, 0xFE, 0x58, 0xD2, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, +/* 00009810 */ 0x58, 0xD2, 0xFE, 0x44, 0x02, 0xFE, 0x44, 0x02, 0x03, 0x09, 0x09, 0x0E, 0x07, 0x40, 0x3C, 0x03, +/* 00009820 */ 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0x0D, 0x07, 0x06, 0xFE, 0x6E, 0x03, 0x05, 0xFE, 0xDE, 0x03, +/* 00009830 */ 0x06, 0xFE, 0xDD, 0x03, 0x08, 0x01, 0x00, 0x01, 0x01, 0xD0, 0xAE, 0x0B, 0x5B, 0x09, 0xB3, 0x09, +/* 00009840 */ 0x09, 0x2C, 0x0E, 0x09, 0x15, 0x03, 0x00, 0x0E, 0x03, 0x09, 0x28, 0x00, 0x8E, 0x03, 0x10, 0x0E, +/* 00009850 */ 0xE1, 0x0E, 0x09, 0x0E, 0x00, 0x0F, 0x1B, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x0F, +/* 00009860 */ 0x6C, 0x0E, 0x0F, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, +/* 00009870 */ 0x1F, 0x03, 0xFF, 0x0E, 0x8E, 0x03, 0x0A, 0x0E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0F, +/* 00009880 */ 0x5C, 0x01, 0x0F, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0E, 0x0E, 0x47, 0x0A, 0x0E, 0x8E, 0x01, 0x02, +/* 00009890 */ 0x0E, 0x4B, 0x0E, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0A, 0x97, 0x0F, 0x0B, 0x07, +/* 000098A0 */ 0x5C, 0x02, 0x0F, 0x97, 0x0F, 0x0B, 0x08, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0xFF, 0x0E, 0x8E, 0x03, +/* 000098B0 */ 0x31, 0x0F, 0x6C, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, +/* 000098C0 */ 0x02, 0x0E, 0x0E, 0x47, 0x0C, 0x0E, 0x8E, 0x03, 0x11, 0x0E, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, +/* 000098D0 */ 0x8E, 0x03, 0x09, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x2A, 0x11, +/* 000098E0 */ 0x07, 0x14, 0x03, 0x00, 0x0C, 0x11, 0x09, 0x06, 0x00, 0x47, 0x11, 0x07, 0x09, 0x03, 0x00, 0x47, +/* 000098F0 */ 0x11, 0x0C, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x1F, 0x03, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, 0x1F, +/* 00009900 */ 0x02, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x5E, 0x02, +/* 00009910 */ 0xFE, 0x2F, 0x02, 0xFE, 0x76, 0xD2, 0x07, 0x07, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x53, 0x00, 0x18, +/* 00009920 */ 0x00, 0x70, 0x00, 0x19, 0x00, 0x3A, 0x00, 0x21, 0x00, 0x52, 0x00, 0x18, 0x00, 0x85, 0x00, 0x42, +/* 00009930 */ 0x00, 0x51, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x21, 0xD4, 0x00, 0xFE, 0xD9, 0x03, 0x0C, 0xB3, +/* 00009940 */ 0x41, 0xC1, 0x00, 0xFE, 0xEF, 0x03, 0x37, 0xFE, 0x38, 0xB6, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, +/* 00009950 */ 0x04, 0xFE, 0x38, 0xB6, 0xFE, 0xBC, 0x1B, 0xFE, 0xBC, 0x1B, 0x45, 0x18, 0x23, 0x37, 0x07, 0xFE, +/* 00009960 */ 0x9B, 0x01, 0xFE, 0x7B, 0x01, 0x03, 0x12, 0x26, 0x26, 0x26, 0x26, 0x01, 0x36, 0x37, 0x06, 0xFE, +/* 00009970 */ 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, 0x08, 0x06, 0xFE, 0x15, 0x03, 0x0B, 0x06, 0xFE, 0x72, 0x03, +/* 00009980 */ 0x07, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, +/* 00009990 */ 0x03, 0x05, 0xFE, 0xE2, 0x03, 0x05, 0xFE, 0xF0, 0x03, 0x05, 0xFE, 0xF1, 0x03, 0x05, 0xFE, 0xE3, +/* 000099A0 */ 0x03, 0x05, 0xFE, 0xE4, 0x03, 0x05, 0xFE, 0xF2, 0x03, 0x06, 0xFE, 0xF3, 0x03, 0x06, 0xFE, 0xF8, +/* 000099B0 */ 0x02, 0x05, 0xFE, 0xE5, 0x03, 0x01, 0x01, 0x01, 0x15, 0x06, 0xFE, 0xE8, 0x03, 0x06, 0xFE, 0xE9, +/* 000099C0 */ 0x03, 0x05, 0xFE, 0xEA, 0x03, 0x06, 0xFE, 0x6C, 0x03, 0x05, 0xFE, 0xF4, 0x03, 0x05, 0xFE, 0xE6, +/* 000099D0 */ 0x03, 0x01, 0x00, 0x01, 0x14, 0x01, 0x03, 0x05, 0xFE, 0xE7, 0x03, 0x05, 0xFE, 0xF5, 0x03, 0xFE, +/* 000099E0 */ 0x53, 0x05, 0x2C, 0x38, 0x23, 0x0D, 0x03, 0x00, 0x38, 0x02, 0x09, 0x12, 0x00, 0x8E, 0x03, 0x09, +/* 000099F0 */ 0x39, 0x6C, 0x38, 0x39, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, 0x8E, +/* 00009A00 */ 0x03, 0x0C, 0x38, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x19, 0x39, 0x5C, 0x01, 0x39, +/* 00009A10 */ 0x5C, 0x02, 0x23, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x38, 0x38, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x23, +/* 00009A20 */ 0x00, 0x61, 0x38, 0x23, 0x01, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x18, 0x00, 0x8E, 0x03, 0x09, 0x39, +/* 00009A30 */ 0x6C, 0x38, 0x39, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, +/* 00009A40 */ 0x1F, 0x03, 0xFF, 0x38, 0x76, 0x06, 0x23, 0x03, 0x2C, 0x38, 0x25, 0x14, 0x03, 0x00, 0x38, 0x07, +/* 00009A50 */ 0x09, 0x1C, 0x00, 0x8E, 0x03, 0x0A, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x39, 0x5C, +/* 00009A60 */ 0x01, 0x39, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x25, 0x38, 0x09, 0x18, 0x00, 0x8E, +/* 00009A70 */ 0x03, 0x31, 0x39, 0x6C, 0x38, 0x39, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x25, +/* 00009A80 */ 0x1F, 0x02, 0x38, 0x38, 0x47, 0x25, 0x38, 0x8E, 0x03, 0x02, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 00009A90 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x02, 0xA1, 0x00, 0x0B, +/* 00009AA0 */ 0x39, 0xA1, 0x01, 0x0C, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x38, 0x38, 0x47, +/* 00009AB0 */ 0x28, 0x38, 0x8E, 0x03, 0x02, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, +/* 00009AC0 */ 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x03, 0xA1, 0x00, 0x0E, 0x39, 0xA1, 0x01, 0x0F, 0x39, +/* 00009AD0 */ 0xA1, 0x02, 0x10, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0E, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x29, +/* 00009AE0 */ 0x38, 0x8E, 0x02, 0x03, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x05, 0x47, 0x2A, 0x38, 0x14, 0x03, +/* 00009AF0 */ 0x00, 0x29, 0x0F, 0x09, 0x10, 0x00, 0x8E, 0x02, 0x03, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x06, +/* 00009B00 */ 0x47, 0x2A, 0x38, 0x09, 0x15, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x0D, 0x00, 0x8E, 0x02, +/* 00009B10 */ 0x03, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x07, 0x47, 0x2A, 0x38, 0x8E, 0x03, 0x02, 0x38, 0x07, +/* 00009B20 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xA8, 0x39, +/* 00009B30 */ 0x5C, 0x04, 0x39, 0xA8, 0x39, 0x5C, 0x05, 0x39, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2B, 0x38, 0x8E, +/* 00009B40 */ 0x03, 0x02, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x11, 0x5C, +/* 00009B50 */ 0x03, 0x0A, 0xCD, 0x39, 0x03, 0xA1, 0x00, 0x12, 0x39, 0xA1, 0x01, 0x13, 0x39, 0xA1, 0x02, 0x14, +/* 00009B60 */ 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x13, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2C, 0x38, 0xA8, 0x38, +/* 00009B70 */ 0x47, 0x2D, 0x38, 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, +/* 00009B80 */ 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0x1F, 0x06, 0x38, 0x38, +/* 00009B90 */ 0x47, 0x2E, 0x38, 0xA8, 0x38, 0x47, 0x2F, 0x38, 0xA8, 0x38, 0x47, 0x30, 0x38, 0xA8, 0x38, 0x47, +/* 00009BA0 */ 0x31, 0x38, 0x61, 0x38, 0x25, 0x08, 0x47, 0x32, 0x38, 0x61, 0x38, 0x25, 0x09, 0x47, 0x33, 0x38, +/* 00009BB0 */ 0x2C, 0x38, 0x32, 0x15, 0x0E, 0x00, 0x38, 0x07, 0x09, 0x00, 0x00, 0x2C, 0x38, 0x33, 0x15, 0x03, +/* 00009BC0 */ 0x00, 0x38, 0x07, 0x09, 0x40, 0x00, 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 00009BD0 */ 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0x1F, +/* 00009BE0 */ 0x06, 0x38, 0x38, 0x47, 0x32, 0x38, 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 00009BF0 */ 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x19, 0x5C, 0x03, 0x32, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x17, 0x1F, +/* 00009C00 */ 0x06, 0x38, 0x38, 0x47, 0x33, 0x38, 0x8E, 0x03, 0x02, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 00009C10 */ 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x1B, 0xA8, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, +/* 00009C20 */ 0x06, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x34, 0x38, 0x8E, 0x03, 0x07, 0x38, 0x07, 0x02, 0x00, 0x5C, +/* 00009C30 */ 0x00, 0x04, 0x5C, 0x01, 0x24, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x24, 0x38, 0x8E, 0x03, 0x2F, 0x38, +/* 00009C40 */ 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0x5C, 0x02, 0x28, 0xCD, 0x39, 0x01, 0xA1, +/* 00009C50 */ 0x00, 0x1C, 0x39, 0x5C, 0x03, 0x39, 0x8E, 0x03, 0x30, 0x39, 0x5C, 0x04, 0x39, 0x1F, 0x05, 0x38, +/* 00009C60 */ 0x38, 0x47, 0x35, 0x38, 0x2C, 0x38, 0x2B, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x3E, 0x00, 0x8E, +/* 00009C70 */ 0x03, 0x06, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x1F, 0x02, 0x38, 0x38, +/* 00009C80 */ 0x0F, 0x29, 0x00, 0x38, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x0A, 0x07, +/* 00009C90 */ 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8E, 0x03, 0x11, 0x3A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00009CA0 */ 0x01, 0x2B, 0x1F, 0x02, 0x3A, 0x3A, 0x5C, 0x01, 0x3A, 0x1F, 0x02, 0xFF, 0x38, 0x14, 0x03, 0x00, +/* 00009CB0 */ 0x29, 0x10, 0x09, 0xD0, 0x00, 0x2C, 0x38, 0x2B, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x12, 0x00, +/* 00009CC0 */ 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, +/* 00009CD0 */ 0xFF, 0x38, 0x8E, 0x03, 0x0C, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x25, 0x39, +/* 00009CE0 */ 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x2B, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x2B, 0x38, 0xE5, 0x1C, 0x00, +/* 00009CF0 */ 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x0C, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, +/* 00009D00 */ 0x2B, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x2D, 0x38, 0xE9, 0x09, 0x3B, 0x00, 0xE7, 0x26, 0x06, 0x8E, +/* 00009D10 */ 0x03, 0x29, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x1F, 0x02, 0xFF, 0x38, +/* 00009D20 */ 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8E, 0x03, +/* 00009D30 */ 0x11, 0x3A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x1F, 0x02, 0x3A, 0x3A, 0x5C, +/* 00009D40 */ 0x01, 0x3A, 0x1F, 0x02, 0xFF, 0x38, 0xE9, 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 00009D50 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x2D, +/* 00009D60 */ 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2F, 0x38, 0x8E, 0x03, 0x15, 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, +/* 00009D70 */ 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2D, 0x5C, 0x02, 0x2F, 0x1F, 0x03, 0x38, 0x38, 0x47, +/* 00009D80 */ 0x31, 0x38, 0x09, 0x6B, 0x00, 0xA8, 0x38, 0x47, 0x2B, 0x38, 0xA8, 0x38, 0x47, 0x2C, 0x38, 0x8E, +/* 00009D90 */ 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, +/* 00009DA0 */ 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x1E, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2F, 0x38, 0x14, +/* 00009DB0 */ 0x03, 0x00, 0x29, 0x0F, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x15, 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, +/* 00009DC0 */ 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, 0x1E, 0x1F, 0x03, 0x38, 0x38, 0x47, +/* 00009DD0 */ 0x31, 0x38, 0x09, 0x1B, 0x00, 0x8E, 0x03, 0x15, 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, +/* 00009DE0 */ 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, 0x20, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x31, 0x38, +/* 00009DF0 */ 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x21, +/* 00009E00 */ 0x5C, 0x03, 0x2F, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x31, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x30, 0x38, +/* 00009E10 */ 0x76, 0x28, 0x23, 0x0E, 0x61, 0x38, 0x35, 0x0F, 0x76, 0x38, 0x23, 0x10, 0x76, 0x29, 0x23, 0x11, +/* 00009E20 */ 0xA8, 0x38, 0x15, 0x03, 0x00, 0x2B, 0x38, 0x09, 0x04, 0x00, 0x76, 0x2B, 0x23, 0x12, 0xA8, 0x38, +/* 00009E30 */ 0x15, 0x03, 0x00, 0x2C, 0x38, 0x09, 0x5A, 0x00, 0x76, 0x2C, 0x23, 0x13, 0x8E, 0x02, 0x04, 0x38, +/* 00009E40 */ 0x4B, 0x38, 0x61, 0x38, 0x38, 0x14, 0x76, 0x38, 0x23, 0x15, 0x14, 0x03, 0x00, 0x2C, 0x13, 0x09, +/* 00009E50 */ 0x11, 0x00, 0x8E, 0x02, 0x04, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x16, 0x76, 0x38, 0x23, 0x15, +/* 00009E60 */ 0x09, 0x2F, 0x00, 0x14, 0x03, 0x00, 0x2C, 0x12, 0x09, 0x11, 0x00, 0x8E, 0x02, 0x04, 0x38, 0x4B, +/* 00009E70 */ 0x38, 0x61, 0x38, 0x38, 0x17, 0x76, 0x38, 0x23, 0x15, 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x2C, +/* 00009E80 */ 0x14, 0x09, 0x0E, 0x00, 0x8E, 0x02, 0x04, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x18, 0x76, 0x38, +/* 00009E90 */ 0x23, 0x15, 0x76, 0x2E, 0x23, 0x19, 0x76, 0x2F, 0x23, 0x1A, 0x76, 0x30, 0x23, 0x1B, 0xA8, 0x38, +/* 00009EA0 */ 0x15, 0x03, 0x00, 0x33, 0x38, 0x09, 0x08, 0x00, 0x76, 0x32, 0x23, 0x1C, 0x76, 0x33, 0x23, 0x1D, +/* 00009EB0 */ 0x76, 0x2A, 0x23, 0x1E, 0x76, 0x34, 0x23, 0x1F, 0xE5, 0x19, 0x00, 0x8E, 0x03, 0x09, 0x39, 0x6C, +/* 00009EC0 */ 0x38, 0x39, 0x20, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x23, 0x1F, 0x02, 0xFF, 0x38, +/* 00009ED0 */ 0xE9, 0x09, 0x27, 0x00, 0xE7, 0x27, 0x06, 0x8E, 0x03, 0x29, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00009EE0 */ 0x04, 0x5C, 0x01, 0x27, 0x1F, 0x02, 0xFF, 0x38, 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x21, +/* 00009EF0 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, 0xE9, 0x61, 0x38, 0x23, 0x22, 0x0F, +/* 00009F00 */ 0x07, 0x00, 0x38, 0x09, 0x00, 0x00, 0x76, 0x22, 0x23, 0x23, 0x47, 0x38, 0x23, 0x8E, 0x03, 0x0C, +/* 00009F10 */ 0x39, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x24, 0x3A, 0x5C, 0x01, 0x3A, 0x61, 0x3A, +/* 00009F20 */ 0x23, 0x22, 0x5C, 0x02, 0x3A, 0x1F, 0x03, 0x39, 0x39, 0x76, 0x39, 0x38, 0x24, 0x76, 0x06, 0x23, +/* 00009F30 */ 0x25, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, +/* 00009F40 */ 0x02, 0xFE, 0x66, 0x03, 0xFE, 0xD7, 0x03, 0xFE, 0xD8, 0x03, 0xFE, 0xD9, 0x03, 0xFE, 0x10, 0x02, +/* 00009F50 */ 0xFE, 0x11, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x32, 0x02, 0xFE, 0x21, 0x01, 0xFE, +/* 00009F60 */ 0xF6, 0x03, 0xFE, 0x21, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x16, 0x02, 0xFE, 0x17, +/* 00009F70 */ 0x02, 0xFE, 0xD6, 0x03, 0xFE, 0x18, 0x02, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, 0xFE, 0xDC, 0x03, +/* 00009F80 */ 0xFE, 0x0D, 0x02, 0xFE, 0x0B, 0x02, 0xFE, 0x0C, 0x02, 0xFE, 0x0E, 0x02, 0xFE, 0x0F, 0x02, 0xFE, +/* 00009F90 */ 0x15, 0x02, 0xFE, 0x13, 0x02, 0xFE, 0x30, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x14, +/* 00009FA0 */ 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0x8D, 0xB6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, +/* 00009FB0 */ 0x00, 0x3B, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x2D, 0x00, 0x9B, 0x00, 0x18, 0x00, 0x6D, 0x00, 0x04, +/* 00009FC0 */ 0x00, 0x61, 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x1C, 0x00, 0x4F, 0x00, 0x18, 0x00, 0x49, 0x00, 0x2B, +/* 00009FD0 */ 0x00, 0x71, 0x00, 0x2F, 0x00, 0x73, 0x00, 0x0D, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x10, +/* 00009FE0 */ 0x00, 0x43, 0x00, 0x08, 0x00, 0x30, 0x00, 0x0D, 0x00, 0x50, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x2F, +/* 00009FF0 */ 0x00, 0x7D, 0x00, 0x05, 0x00, 0x31, 0x00, 0x20, 0x00, 0x67, 0x00, 0x05, 0x00, 0x37, 0x00, 0x05, +/* 0000A000 */ 0x00, 0x37, 0x00, 0x05, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x51, 0x00, 0x07, 0x00, 0x52, 0x00, 0x16, +/* 0000A010 */ 0x00, 0x7E, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x96, 0x00, 0x22, 0x00, 0x9A, 0x00, 0x14, +/* 0000A020 */ 0x00, 0x41, 0x00, 0x28, 0x00, 0xA2, 0x00, 0x23, 0x00, 0x62, 0x00, 0x26, 0x00, 0x58, 0x00, 0x08, +/* 0000A030 */ 0x00, 0x30, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x12, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x74, 0x00, 0x1E, +/* 0000A040 */ 0x00, 0x4A, 0x00, 0x01, 0x00, 0x24, 0x00, 0x11, 0x00, 0x2E, 0x00, 0x27, 0x00, 0x5F, 0x00, 0x20, +/* 0000A050 */ 0x00, 0x76, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x2A, 0x00, 0x05, 0x00, 0x31, 0x00, 0x20, +/* 0000A060 */ 0x00, 0x69, 0x00, 0x08, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x1B, 0x00, 0x7B, 0x00, 0x20, +/* 0000A070 */ 0x00, 0xC6, 0x00, 0x04, 0x00, 0x38, 0x00, 0x08, 0x00, 0x43, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x0A, +/* 0000A080 */ 0x00, 0x32, 0x00, 0x04, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x04, 0x00, 0x46, 0x00, 0x0E, +/* 0000A090 */ 0x00, 0x5F, 0x00, 0x08, 0x00, 0x3C, 0x00, 0x11, 0x00, 0x65, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x11, +/* 0000A0A0 */ 0x00, 0x63, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x0E, 0x00, 0x81, 0x00, 0x04, 0x00, 0x4C, 0x00, 0x04, +/* 0000A0B0 */ 0x00, 0x4E, 0x00, 0x04, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x04, 0x00, 0x58, 0x00, 0x04, +/* 0000A0C0 */ 0x00, 0x67, 0x00, 0x04, 0x00, 0x40, 0x00, 0x07, 0x00, 0xA9, 0x00, 0x1B, 0x00, 0x3C, 0x00, 0x01, +/* 0000A0D0 */ 0x00, 0x20, 0x00, 0x11, 0x00, 0x6B, 0x01, 0x13, 0x00, 0x4A, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x04, +/* 0000A0E0 */ 0x00, 0x70, 0x00, 0x23, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x00, 0x3F, 0x5C, 0x80, 0xE0, +/* 0000A0F0 */ 0x29, 0xD4, 0x92, 0xFE, 0xE4, 0x02, 0x14, 0xA0, 0x41, 0xD1, 0x00, 0x2E, 0xFE, 0x07, 0x83, 0x06, +/* 0000A100 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x07, 0x83, 0xFE, 0x95, 0x2E, 0xFE, 0x95, 0x2E, +/* 0000A110 */ 0x0B, 0x16, 0x1A, 0x09, 0x9D, 0x9D, 0x01, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x05, 0x02, 0x19, 0x1A, +/* 0000A120 */ 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xB0, 0x03, 0x05, 0xFE, 0xB1, 0x03, 0x08, 0x05, 0xFE, 0xB2, +/* 0000A130 */ 0x03, 0x05, 0xFE, 0xB3, 0x03, 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, +/* 0000A140 */ 0x03, 0x0B, 0x06, 0xFE, 0x14, 0x03, 0x07, 0x06, 0xFE, 0xB4, 0x03, 0x0C, 0x06, 0xFE, 0x13, 0x03, +/* 0000A150 */ 0x06, 0xFE, 0xB5, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, 0xB7, 0x03, 0x06, 0xFE, 0xB8, 0x03, +/* 0000A160 */ 0x05, 0xFE, 0xB9, 0x03, 0xFE, 0x6A, 0x02, 0xA8, 0x16, 0xA8, 0x17, 0xA8, 0x18, 0x8E, 0x01, 0x38, +/* 0000A170 */ 0x1C, 0x14, 0x0F, 0x00, 0x1C, 0x02, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x38, 0x1C, 0x14, 0x03, 0x00, +/* 0000A180 */ 0x1C, 0x03, 0x09, 0x43, 0x02, 0xDE, 0x00, 0x03, 0x01, 0xB8, 0x1C, 0x00, 0x01, 0x51, 0x01, 0x00, +/* 0000A190 */ 0x16, 0x1C, 0x95, 0x00, 0x02, 0x16, 0x8E, 0x01, 0x09, 0x1D, 0x6C, 0x1C, 0x1D, 0x00, 0x07, 0x03, +/* 0000A1A0 */ 0x00, 0x5C, 0x00, 0x1D, 0x8E, 0x01, 0x2A, 0x1E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, +/* 0000A1B0 */ 0x04, 0xB8, 0x20, 0x00, 0x01, 0x51, 0x01, 0x01, 0x1F, 0x20, 0x5C, 0x02, 0x1F, 0x1F, 0x03, 0x1E, +/* 0000A1C0 */ 0x1E, 0x5C, 0x01, 0x1E, 0x8E, 0x01, 0x3B, 0x1E, 0x4B, 0x1E, 0x61, 0x1E, 0x1E, 0x01, 0x5C, 0x02, +/* 0000A1D0 */ 0x1E, 0x1F, 0x03, 0xFF, 0x1C, 0x8E, 0x01, 0x38, 0x1C, 0x14, 0x03, 0x00, 0x1C, 0x02, 0x09, 0xE7, +/* 0000A1E0 */ 0x01, 0xDE, 0x01, 0x04, 0x02, 0xB8, 0x1C, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x01, +/* 0000A1F0 */ 0x51, 0x01, 0x02, 0x17, 0x1C, 0x95, 0x01, 0x02, 0x17, 0x01, 0x51, 0x01, 0x03, 0x18, 0x1C, 0x95, +/* 0000A200 */ 0x01, 0x03, 0x18, 0x8E, 0x01, 0x2A, 0x1C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, +/* 0000A210 */ 0x90, 0x01, 0x02, 0x1D, 0x5C, 0x02, 0x1D, 0x1F, 0x03, 0xFF, 0x1C, 0x8E, 0x01, 0x2A, 0x1C, 0x07, +/* 0000A220 */ 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x07, 0x90, 0x01, 0x03, 0x1D, 0x5C, 0x02, 0x1D, 0x1F, +/* 0000A230 */ 0x03, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x02, +/* 0000A240 */ 0x1D, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x08, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A250 */ 0x1D, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x46, 0x1E, 0x4B, 0x1E, 0x7A, 0x1E, 0x1D, 0x02, 0x7A, 0x0B, +/* 0000A260 */ 0x1D, 0x03, 0x7A, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0x1F, 0x04, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, +/* 0000A270 */ 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x02, 0x1D, 0x5C, 0x01, 0x1D, 0x5C, 0x02, +/* 0000A280 */ 0x0E, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x90, 0x01, +/* 0000A290 */ 0x02, 0x1E, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x1E, 0x1E, 0x7A, 0x1E, 0x1D, 0x02, 0x7A, 0x0F, 0x1D, +/* 0000A2A0 */ 0x03, 0x7A, 0x0F, 0x1D, 0x05, 0x7A, 0x0F, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0x1F, 0x04, 0xFF, 0x1C, +/* 0000A2B0 */ 0x8E, 0x01, 0x0A, 0x1C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x02, 0x1D, 0x61, 0x1D, +/* 0000A2C0 */ 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x8E, 0x01, 0x0E, 0x1D, 0x61, 0x1D, 0x1D, 0x06, 0x5C, 0x02, 0x1D, +/* 0000A2D0 */ 0x1F, 0x03, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, +/* 0000A2E0 */ 0x02, 0x1D, 0x61, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x11, 0xCC, 0x2C, 0x00, 0x00, +/* 0000A2F0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x1E, 0x7A, 0x1E, 0x1D, +/* 0000A300 */ 0x02, 0x7A, 0x0B, 0x1D, 0x03, 0x7A, 0x0F, 0x1D, 0x05, 0x7A, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, +/* 0000A310 */ 0x1F, 0x04, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, +/* 0000A320 */ 0x02, 0x1D, 0x61, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x12, 0xCC, 0x44, 0x00, 0x00, +/* 0000A330 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0xB8, 0x1F, 0x00, 0xB7, 0x01, 0x00, 0x00, +/* 0000A340 */ 0x00, 0x1F, 0x1F, 0x01, 0x51, 0x01, 0x04, 0x1E, 0x1F, 0x7A, 0x1E, 0x1D, 0x02, 0x01, 0x65, 0x01, +/* 0000A350 */ 0x1E, 0x1D, 0x7A, 0x0B, 0x1D, 0x03, 0x7A, 0x0F, 0x1D, 0x05, 0x7A, 0x0B, 0x1D, 0x04, 0x5C, 0x03, +/* 0000A360 */ 0x1D, 0x1F, 0x04, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, +/* 0000A370 */ 0x01, 0x02, 0x1D, 0x61, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x13, 0xCC, 0x5C, 0x00, +/* 0000A380 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x2A, 0x1E, 0x07, 0x03, +/* 0000A390 */ 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x15, 0xB8, 0x20, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x20, +/* 0000A3A0 */ 0x20, 0x01, 0x51, 0x01, 0x05, 0x1F, 0x20, 0x5C, 0x02, 0x1F, 0x1F, 0x03, 0x1E, 0x1E, 0x7A, 0x1E, +/* 0000A3B0 */ 0x1D, 0x07, 0x7A, 0x0F, 0x1D, 0x05, 0x7A, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0x1F, 0x04, 0xFF, +/* 0000A3C0 */ 0x1C, 0x90, 0x01, 0x02, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000A3D0 */ 0x00, 0x05, 0x70, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A3E0 */ 0xB7, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, +/* 0000A3F0 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, +/* 0000A400 */ 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 0000A410 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 0000A420 */ 0xB4, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A430 */ 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, +/* 0000A440 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, +/* 0000A450 */ 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0xF0, 0x02, 0xFE, 0xB6, +/* 0000A460 */ 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0x48, 0x01, 0xFE, 0xB7, 0x01, +/* 0000A470 */ 0x02, 0x01, 0x01, 0x00, 0xFE, 0xBA, 0x03, 0x02, 0x02, 0x00, 0xFE, 0x1B, 0x02, 0x01, 0xFE, 0x20, +/* 0000A480 */ 0x02, 0xFE, 0x1E, 0x83, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x29, 0x00, 0x14, 0x17, 0x3F, 0x00, 0x21, +/* 0000A490 */ 0x04, 0x2E, 0x00, 0x7A, 0x04, 0x18, 0x00, 0x43, 0x03, 0x18, 0x00, 0x50, 0x00, 0x3A, 0x00, 0x93, +/* 0000A4A0 */ 0x00, 0x43, 0x00, 0x91, 0x00, 0x24, 0x00, 0x45, 0x00, 0x40, 0x00, 0x96, 0x00, 0x51, 0x00, 0xA7, +/* 0000A4B0 */ 0x05, 0x5C, 0x00, 0x03, 0x03, 0x07, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x0C, 0xAC, +/* 0000A4C0 */ 0x00, 0x00, 0x86, 0xAA, 0x00, 0x00, 0xB4, 0xA8, 0x00, 0x00, 0x50, 0xA7, 0x00, 0x00, 0xB9, 0xA5, +/* 0000A4D0 */ 0x00, 0x00, 0xD6, 0xA4, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xB1, 0x03, +/* 0000A4E0 */ 0x3A, 0xA0, 0x41, 0xD1, 0x00, 0x35, 0xFE, 0x76, 0xAE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, +/* 0000A4F0 */ 0xFE, 0x76, 0xAE, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, +/* 0000A500 */ 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xD4, 0x03, 0x06, +/* 0000A510 */ 0xFE, 0x11, 0x03, 0x78, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, +/* 0000A520 */ 0x02, 0x09, 0x18, 0x00, 0x8E, 0x03, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 0000A530 */ 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x03, 0x09, 0x09, +/* 0000A540 */ 0x6C, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x08, +/* 0000A550 */ 0x08, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, 0x08, +/* 0000A560 */ 0x06, 0x02, 0x0F, 0x1B, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x09, 0x6C, 0x08, 0x09, +/* 0000A570 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, +/* 0000A580 */ 0x08, 0x61, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, +/* 0000A590 */ 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x79, 0x02, 0xFE, 0x9C, 0xAE, 0x07, 0x05, 0x00, 0x00, 0x00, +/* 0000A5A0 */ 0x0B, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x7D, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, +/* 0000A5B0 */ 0x18, 0x00, 0x7D, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x09, 0xC4, 0x10, +/* 0000A5C0 */ 0xFE, 0x9B, 0x03, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x34, 0xFE, 0xB8, 0xA8, 0xFF, +/* 0000A5D0 */ 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xB8, 0xA8, 0xFE, 0xF1, 0x04, 0xFE, 0xF1, 0x04, 0x01, +/* 0000A5E0 */ 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, 0x03, 0x01, 0x11, 0x11, 0x11, 0x11, 0x01, 0x0F, 0x06, 0xFE, +/* 0000A5F0 */ 0x9A, 0x03, 0x05, 0xFE, 0xD5, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x06, 0xFE, 0x5D, 0x03, 0x06, 0xFE, +/* 0000A600 */ 0xBC, 0x03, 0x06, 0xFE, 0xBF, 0x03, 0x06, 0xFE, 0xC4, 0x03, 0x06, 0xFE, 0xCE, 0x03, 0x06, 0xFE, +/* 0000A610 */ 0xC9, 0x03, 0x06, 0xFE, 0xC5, 0x03, 0x07, 0xB9, 0x5B, 0x0D, 0xB3, 0x0D, 0x0D, 0x2C, 0x10, 0x0D, +/* 0000A620 */ 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x03, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x00, +/* 0000A630 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x10, +/* 0000A640 */ 0x8E, 0x03, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, +/* 0000A650 */ 0x0D, 0x1F, 0x02, 0x10, 0x10, 0x47, 0x0E, 0x10, 0xA8, 0x10, 0x14, 0x0E, 0x00, 0x0E, 0x10, 0x09, +/* 0000A660 */ 0x00, 0x00, 0x61, 0x10, 0x0E, 0x02, 0x0F, 0x1B, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, +/* 0000A670 */ 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x03, 0x5C, 0x02, +/* 0000A680 */ 0x04, 0x1F, 0x03, 0xFF, 0x10, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A690 */ 0x00, 0x00, 0x61, 0x10, 0x0E, 0x03, 0x7A, 0x10, 0x00, 0x04, 0x61, 0x10, 0x0E, 0x05, 0x7A, 0x10, +/* 0000A6A0 */ 0x00, 0x06, 0x61, 0x10, 0x0E, 0x07, 0x7A, 0x10, 0x00, 0x08, 0x61, 0x10, 0x0E, 0x09, 0x7A, 0x10, +/* 0000A6B0 */ 0x00, 0x0A, 0x61, 0x10, 0x0E, 0x0B, 0x7A, 0x10, 0x00, 0x0C, 0x61, 0x10, 0x0E, 0x0D, 0x7A, 0x10, +/* 0000A6C0 */ 0x00, 0x0E, 0x61, 0x10, 0x0E, 0x0F, 0x7A, 0x10, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000A6D0 */ 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A6E0 */ 0x21, 0x02, 0x00, 0x00, 0xBC, 0x03, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, +/* 0000A6F0 */ 0xCE, 0x03, 0x00, 0x00, 0x23, 0x02, 0x00, 0x00, 0xC5, 0x03, 0x00, 0x00, 0xFE, 0x69, 0x02, 0xFE, +/* 0000A700 */ 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0xBC, +/* 0000A710 */ 0x03, 0xFE, 0x73, 0x02, 0xFE, 0x22, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x24, 0x02, 0xFE, 0x77, 0x02, +/* 0000A720 */ 0xFE, 0xCE, 0x03, 0xFE, 0x76, 0x02, 0xFE, 0x23, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0xC5, 0x03, 0xFE, +/* 0000A730 */ 0xED, 0xA8, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x84, 0x00, 0x18, +/* 0000A740 */ 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x18, 0x00, 0x85, 0x00, 0x4A, 0x00, 0xC6, 0x02, 0x00, +/* 0000A750 */ 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x82, 0x03, 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, +/* 0000A760 */ 0xB7, 0x03, 0x33, 0xFE, 0x0C, 0xA3, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x0C, 0xA3, +/* 0000A770 */ 0xFE, 0xF3, 0x02, 0xFE, 0xF3, 0x02, 0x01, 0x09, 0x06, 0x0B, 0x0B, 0x44, 0x41, 0x03, 0x03, 0x08, +/* 0000A780 */ 0x08, 0x08, 0x08, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xD4, 0x03, 0x06, 0xFE, 0x11, 0x03, +/* 0000A790 */ 0x08, 0xE1, 0x5B, 0x08, 0xB3, 0x08, 0x08, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, +/* 0000A7A0 */ 0x18, 0x00, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, +/* 0000A7B0 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, +/* 0000A7C0 */ 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, +/* 0000A7D0 */ 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x61, 0x0B, 0x09, 0x02, +/* 0000A7E0 */ 0x0F, 0x1B, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, +/* 0000A7F0 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, +/* 0000A800 */ 0x03, 0x11, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0B, 0x0B, +/* 0000A810 */ 0x47, 0x06, 0x0B, 0x8E, 0x03, 0x11, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x07, +/* 0000A820 */ 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x07, 0x0B, 0x8E, 0x03, 0x10, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000A830 */ 0x05, 0x8E, 0x03, 0x09, 0x0D, 0x6C, 0x0C, 0x0D, 0x03, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x0D, 0x5C, +/* 0000A840 */ 0x01, 0x06, 0x5C, 0x02, 0x07, 0x61, 0x0E, 0x09, 0x04, 0x5C, 0x03, 0x0E, 0x61, 0x0E, 0x09, 0x05, +/* 0000A850 */ 0x5C, 0x04, 0x0E, 0x61, 0x0E, 0x09, 0x06, 0x5C, 0x05, 0x0E, 0x61, 0x0E, 0x09, 0x07, 0x5C, 0x06, +/* 0000A860 */ 0x0E, 0x1F, 0x07, 0x0C, 0x0C, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, +/* 0000A870 */ 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x2A, 0x02, 0xFE, +/* 0000A880 */ 0x71, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x39, 0xA3, 0x09, 0x05, +/* 0000A890 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x18, 0x00, 0x75, 0x00, 0x18, 0x00, 0x47, 0x00, 0x15, +/* 0000A8A0 */ 0x00, 0x61, 0x00, 0x18, 0x00, 0x75, 0x00, 0x14, 0x00, 0x23, 0x00, 0x14, 0x00, 0x24, 0x00, 0x4A, +/* 0000A8B0 */ 0x00, 0xB4, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x67, 0x03, 0x10, 0xA3, +/* 0000A8C0 */ 0x41, 0xC1, 0x00, 0xFE, 0x11, 0x03, 0x32, 0xFE, 0x7F, 0x9E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 0000A8D0 */ 0x01, 0xFE, 0x7F, 0x9E, 0xFE, 0x3D, 0x04, 0xFE, 0x3D, 0x04, 0x01, 0x09, 0x05, 0x0B, 0x05, 0x62, +/* 0000A8E0 */ 0x5B, 0x03, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x11, 0x03, 0x07, 0xFE, 0x3D, +/* 0000A8F0 */ 0x01, 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, 0x05, 0x02, 0xA8, +/* 0000A900 */ 0x0B, 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, 0x0B, 0x4F, 0x08, +/* 0000A910 */ 0x4F, 0x09, 0x6A, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, 0x09, 0x00, 0x00, +/* 0000A920 */ 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x16, 0x00, 0x8E, 0x01, 0x02, 0x0B, 0x4B, 0x0B, +/* 0000A930 */ 0x07, 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC2, 0x03, 0x00, 0x0B, 0x09, 0xEC, 0x00, +/* 0000A940 */ 0x8E, 0x03, 0x31, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, +/* 0000A950 */ 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x08, 0x0B, 0x8E, 0x03, 0x17, 0x0B, 0x07, 0x02, 0x00, 0x5C, +/* 0000A960 */ 0x00, 0x02, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x18, 0x00, 0x0B, 0x09, 0x00, 0x00, +/* 0000A970 */ 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, +/* 0000A980 */ 0x03, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, +/* 0000A990 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, +/* 0000A9A0 */ 0x03, 0x00, 0x09, 0x0B, 0x09, 0x31, 0x00, 0x8E, 0x03, 0x0A, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000A9B0 */ 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0x0B, 0x0B, 0x47, 0x09, 0x0B, +/* 0000A9C0 */ 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, +/* 0000A9D0 */ 0x08, 0x5C, 0x02, 0x09, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x02, 0x02, 0x0B, 0x4B, 0x0B, 0x07, 0x04, +/* 0000A9E0 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, 0x1F, 0x04, 0xFF, +/* 0000A9F0 */ 0x0B, 0x47, 0x0B, 0x09, 0x8E, 0x03, 0x0C, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x03, +/* 0000AA00 */ 0x20, 0x0D, 0x5C, 0x01, 0x0D, 0x8E, 0x01, 0x03, 0x0D, 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, +/* 0000AA10 */ 0x08, 0x1F, 0x04, 0x0C, 0x0C, 0x76, 0x0C, 0x0B, 0x04, 0x61, 0x0B, 0x09, 0x05, 0x82, 0x0B, 0x0B, +/* 0000AA20 */ 0x2B, 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, +/* 0000AA30 */ 0x03, 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x79, 0x02, 0xFE, 0x79, 0x02, +/* 0000AA40 */ 0xDD, 0xFE, 0x91, 0x9E, 0x10, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x2B, +/* 0000AA50 */ 0x00, 0x18, 0x00, 0x43, 0x00, 0x16, 0x00, 0x52, 0x00, 0x18, 0x00, 0x37, 0x00, 0x18, 0x00, 0x38, +/* 0000AA60 */ 0x00, 0x15, 0x00, 0x97, 0x00, 0x18, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x19, 0x00, 0x3F, +/* 0000AA70 */ 0x00, 0x18, 0x00, 0x58, 0x00, 0x19, 0x00, 0x76, 0x00, 0x28, 0x00, 0x68, 0x00, 0x0B, 0x00, 0x3D, +/* 0000AA80 */ 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x55, 0x03, +/* 0000AA90 */ 0x61, 0xA0, 0x41, 0xF1, 0x00, 0x31, 0xFE, 0x87, 0x9A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, +/* 0000AAA0 */ 0xFE, 0x87, 0x9A, 0xFE, 0x90, 0x03, 0xFE, 0x90, 0x03, 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4E, 0x4A, +/* 0000AAB0 */ 0x02, 0x05, 0x07, 0x07, 0x07, 0x07, 0x0D, 0x07, 0x01, 0x00, 0x05, 0xFE, 0xB1, 0x03, 0x08, 0x01, +/* 0000AAC0 */ 0x01, 0x01, 0x02, 0xFE, 0x00, 0x01, 0xAE, 0x08, 0x5B, 0x0A, 0xB3, 0x0A, 0x0A, 0x97, 0x0E, 0x08, +/* 0000AAD0 */ 0x03, 0x47, 0x09, 0x0E, 0xA8, 0x0E, 0x14, 0x0B, 0x00, 0x0A, 0x0E, 0x09, 0x00, 0x00, 0x14, 0x03, +/* 0000AAE0 */ 0x00, 0x0A, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x02, 0x09, 0x0F, 0x6C, 0x0E, 0x0F, 0x00, 0x07, 0x02, +/* 0000AAF0 */ 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0xFF, 0x0E, 0x09, 0x1A, 0x00, 0x14, 0x03, +/* 0000AB00 */ 0x00, 0x09, 0x02, 0x09, 0x12, 0x00, 0x8E, 0x02, 0x09, 0x0F, 0x6C, 0x0E, 0x0F, 0x01, 0x07, 0x01, +/* 0000AB10 */ 0x00, 0x5C, 0x00, 0x0F, 0x1F, 0x01, 0xFF, 0x0E, 0x8E, 0x02, 0x11, 0x0E, 0x07, 0x02, 0x00, 0x5C, +/* 0000AB20 */ 0x00, 0x05, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x0B, 0x0E, 0x8E, 0x02, 0x11, 0x0E, +/* 0000AB30 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x09, 0x0E, +/* 0000AB40 */ 0x8E, 0x02, 0x0A, 0x0E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5C, +/* 0000AB50 */ 0x02, 0x02, 0x1F, 0x03, 0x0E, 0x0E, 0x47, 0x0C, 0x0E, 0x8E, 0x01, 0x02, 0x0E, 0x4B, 0x0E, 0x07, +/* 0000AB60 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0C, 0x97, 0x0F, 0x08, 0x06, 0x5C, 0x02, 0x0F, 0x97, +/* 0000AB70 */ 0x0F, 0x08, 0x07, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0xFF, 0x0E, 0x8E, 0x02, 0x10, 0x0E, 0x07, 0x02, +/* 0000AB80 */ 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x02, 0x09, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x07, 0x00, 0x5C, +/* 0000AB90 */ 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x5C, 0x02, 0x09, 0x61, 0x11, 0x0C, 0x03, 0x5C, 0x03, 0x11, 0x61, +/* 0000ABA0 */ 0x11, 0x0C, 0x04, 0x5C, 0x04, 0x11, 0x61, 0x11, 0x0C, 0x05, 0x5C, 0x05, 0x11, 0x61, 0x11, 0x0C, +/* 0000ABB0 */ 0x06, 0x5C, 0x06, 0x11, 0x1F, 0x07, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x00, 0x0E, 0x09, +/* 0000ABC0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x59, 0x02, 0xFE, 0x57, 0x02, 0xFE, 0x2A, 0x02, 0xFE, +/* 0000ABD0 */ 0x71, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0xA5, 0x9A, 0x0B, 0x07, +/* 0000ABE0 */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x29, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x18, 0x00, 0x6D, 0x00, 0x08, +/* 0000ABF0 */ 0x00, 0x29, 0x00, 0x12, 0x00, 0xE2, 0x00, 0x14, 0x00, 0x2C, 0x00, 0x14, 0x00, 0x29, 0x00, 0x19, +/* 0000AC00 */ 0x00, 0x3A, 0x00, 0x21, 0x00, 0x4D, 0x00, 0x4A, 0x00, 0xB5, 0x00, 0x00, 0xBF, 0x5D, 0x80, 0xE0, +/* 0000AC10 */ 0xA1, 0xD6, 0x02, 0xFE, 0xE8, 0x02, 0x0C, 0xB3, 0x41, 0xC1, 0x00, 0xFE, 0xBA, 0x03, 0x2F, 0xFE, +/* 0000AC20 */ 0x5F, 0x83, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x5F, 0x83, 0xFE, 0xC5, 0x16, +/* 0000AC30 */ 0xFE, 0xC5, 0x16, 0x44, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, 0x0A, 0x01, 0xF9, 0x02, 0x10, 0x13, +/* 0000AC40 */ 0x13, 0x13, 0x13, 0x01, 0x32, 0x33, 0x34, 0x35, 0x06, 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, +/* 0000AC50 */ 0x08, 0x06, 0xFE, 0x11, 0x03, 0x0B, 0x06, 0xFE, 0x72, 0x03, 0x07, 0x06, 0xFE, 0xA2, 0x03, 0x06, +/* 0000AC60 */ 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x06, 0xFE, 0xBC, 0x03, 0x06, +/* 0000AC70 */ 0xFE, 0xBD, 0x03, 0x06, 0xFE, 0xBE, 0x03, 0x06, 0xFE, 0xBF, 0x03, 0x05, 0xFE, 0xC0, 0x03, 0x05, +/* 0000AC80 */ 0xFE, 0xC1, 0x03, 0x05, 0xFE, 0xC2, 0x03, 0x05, 0xFE, 0xC3, 0x03, 0x06, 0xFE, 0xC4, 0x03, 0x06, +/* 0000AC90 */ 0xFE, 0x6C, 0x03, 0x0C, 0x06, 0xFE, 0xC5, 0x03, 0x05, 0xFE, 0xC6, 0x03, 0x05, 0xFE, 0xC7, 0x03, +/* 0000ACA0 */ 0x06, 0xFE, 0xC8, 0x03, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0xCA, 0x03, 0x06, 0xFE, 0x0A, 0x03, +/* 0000ACB0 */ 0x06, 0xFE, 0xCB, 0x03, 0x06, 0xFE, 0xCC, 0x03, 0x06, 0xFE, 0xCD, 0x03, 0x01, 0x00, 0x01, 0xFF, +/* 0000ACC0 */ 0xFE, 0x68, 0x03, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0x2C, 0x36, 0x24, 0x0D, 0x03, 0x00, 0x36, +/* 0000ACD0 */ 0x02, 0x09, 0x12, 0x00, 0x8E, 0x02, 0x09, 0x37, 0x6C, 0x36, 0x37, 0x00, 0x07, 0x01, 0x00, 0x5C, +/* 0000ACE0 */ 0x00, 0x37, 0x1F, 0x01, 0xFF, 0x36, 0x8E, 0x02, 0x0C, 0x36, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, +/* 0000ACF0 */ 0x8E, 0x02, 0x19, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x24, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x36, +/* 0000AD00 */ 0x36, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x23, 0x00, 0x61, 0x36, 0x24, 0x01, 0x0F, 0x03, 0x00, 0x36, +/* 0000AD10 */ 0x09, 0x18, 0x00, 0x8E, 0x02, 0x09, 0x37, 0x6C, 0x36, 0x37, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000AD20 */ 0x37, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x36, 0x76, 0x06, 0x24, 0x03, 0x2C, +/* 0000AD30 */ 0x36, 0x26, 0x14, 0x03, 0x00, 0x36, 0x07, 0x09, 0x1C, 0x00, 0x8E, 0x02, 0x0A, 0x36, 0x07, 0x03, +/* 0000AD40 */ 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x36, 0x36, +/* 0000AD50 */ 0x47, 0x26, 0x36, 0x09, 0x18, 0x00, 0x8E, 0x02, 0x31, 0x37, 0x6C, 0x36, 0x37, 0x04, 0x07, 0x02, +/* 0000AD60 */ 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x26, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x26, 0x36, 0x8E, 0x02, +/* 0000AD70 */ 0x02, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x09, 0x5C, 0x03, +/* 0000AD80 */ 0x0A, 0xCD, 0x37, 0x02, 0xA1, 0x00, 0x0B, 0x37, 0xA1, 0x01, 0x0C, 0x37, 0x5C, 0x04, 0x37, 0x5C, +/* 0000AD90 */ 0x05, 0x0C, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x28, 0x36, 0x8E, 0x02, 0x02, 0x36, 0x07, 0x06, 0x00, +/* 0000ADA0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x02, 0xA1, +/* 0000ADB0 */ 0x00, 0x0E, 0x37, 0xA1, 0x01, 0x0F, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x0E, 0x1F, 0x06, 0x36, +/* 0000ADC0 */ 0x36, 0x47, 0x29, 0x36, 0x8E, 0x02, 0x02, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 0000ADD0 */ 0x26, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x04, 0xA1, 0x00, 0x11, 0x37, 0xA1, 0x01, +/* 0000ADE0 */ 0x12, 0x37, 0xA1, 0x02, 0x13, 0x37, 0xA1, 0x03, 0x14, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, +/* 0000ADF0 */ 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x2A, 0x36, 0x8E, 0x02, 0x02, 0x36, 0x07, 0x06, 0x00, +/* 0000AE00 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, 0xA8, 0x37, 0x5C, 0x04, +/* 0000AE10 */ 0x37, 0x5C, 0x05, 0x17, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x2B, 0x36, 0x8E, 0x02, 0x02, 0x36, 0x07, +/* 0000AE20 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCD, 0x37, +/* 0000AE30 */ 0x03, 0xA1, 0x00, 0x19, 0x37, 0xA1, 0x01, 0x1A, 0x37, 0xA1, 0x02, 0x1B, 0x37, 0x5C, 0x04, 0x37, +/* 0000AE40 */ 0xA8, 0x37, 0x5C, 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x96, 0x02, 0x36, 0x8E, 0x02, 0x02, 0x36, +/* 0000AE50 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x16, 0xCD, +/* 0000AE60 */ 0x37, 0x02, 0xA1, 0x00, 0x06, 0x37, 0xA1, 0x01, 0x17, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, +/* 0000AE70 */ 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x96, 0x03, 0x36, 0x8E, 0x02, 0x07, 0x36, 0x07, 0x02, 0x00, +/* 0000AE80 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x25, 0x36, 0x8E, 0x02, 0x2F, +/* 0000AE90 */ 0x36, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x28, 0xA8, 0x37, 0x5C, +/* 0000AEA0 */ 0x03, 0x37, 0x8E, 0x02, 0x37, 0x37, 0x5C, 0x04, 0x37, 0x1F, 0x05, 0x36, 0x36, 0x47, 0x2C, 0x36, +/* 0000AEB0 */ 0x96, 0x04, 0x1D, 0x8E, 0x02, 0x2C, 0x36, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x61, 0x37, 0x2C, +/* 0000AEC0 */ 0x05, 0x5C, 0x01, 0x37, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x2D, 0x36, 0x47, 0x2E, 0x2D, 0x61, 0x36, +/* 0000AED0 */ 0x2C, 0x06, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x22, 0x00, 0x8E, 0x02, 0x0C, 0x36, 0x07, 0x04, 0x00, +/* 0000AEE0 */ 0x5C, 0x00, 0x04, 0x8E, 0x02, 0x1C, 0x37, 0x5C, 0x01, 0x37, 0x61, 0x37, 0x2C, 0x06, 0x5C, 0x02, +/* 0000AEF0 */ 0x37, 0xD4, 0x00, 0x37, 0x5C, 0x03, 0x37, 0x1F, 0x04, 0xFF, 0x36, 0x92, 0x04, 0x36, 0x15, 0x03, +/* 0000AF00 */ 0x00, 0x36, 0x1D, 0x09, 0x48, 0x00, 0x8E, 0x02, 0x35, 0x36, 0x97, 0x36, 0x36, 0x2E, 0x47, 0x2F, +/* 0000AF10 */ 0x36, 0x47, 0x30, 0x1E, 0xA8, 0x36, 0x15, 0x03, 0x00, 0x2F, 0x36, 0x09, 0x2D, 0x00, 0x92, 0x04, +/* 0000AF20 */ 0x37, 0x97, 0x37, 0x2F, 0x37, 0x47, 0x30, 0x37, 0x47, 0x36, 0x37, 0xA8, 0x37, 0x15, 0x03, 0x00, +/* 0000AF30 */ 0x36, 0x37, 0x09, 0x16, 0x00, 0x15, 0x03, 0x00, 0x30, 0x1E, 0x09, 0x0B, 0x00, 0x2F, 0x36, 0x2E, +/* 0000AF40 */ 0x1F, 0x2F, 0x36, 0x36, 0x30, 0x47, 0x2E, 0x36, 0x09, 0x03, 0x00, 0x96, 0x04, 0x1D, 0x92, 0x02, +/* 0000AF50 */ 0x36, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x7A, 0x00, 0xE5, 0x31, 0x00, 0x8E, 0x02, +/* 0000AF60 */ 0x09, 0x37, 0x6C, 0x36, 0x37, 0x07, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x20, 0x5C, +/* 0000AF70 */ 0x02, 0x21, 0x5C, 0x03, 0x2D, 0xA8, 0x38, 0x5C, 0x04, 0x38, 0xA8, 0x38, 0x5C, 0x05, 0x38, 0xA8, +/* 0000AF80 */ 0x38, 0x5C, 0x06, 0x38, 0x1F, 0x07, 0x36, 0x36, 0x47, 0x31, 0x36, 0xE9, 0x09, 0x27, 0x00, 0xE7, +/* 0000AF90 */ 0x27, 0x06, 0x8E, 0x02, 0x29, 0x36, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x27, 0x1F, +/* 0000AFA0 */ 0x02, 0xFF, 0x36, 0x8E, 0x02, 0x09, 0x37, 0x6C, 0x36, 0x37, 0x08, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 0000AFB0 */ 0x37, 0x1F, 0x01, 0xFF, 0x36, 0xE9, 0x14, 0x03, 0x00, 0x31, 0x22, 0x09, 0x06, 0x00, 0x96, 0x02, +/* 0000AFC0 */ 0x1B, 0x09, 0x11, 0x00, 0x14, 0x03, 0x00, 0x31, 0x23, 0x09, 0x06, 0x00, 0x96, 0x02, 0x19, 0x09, +/* 0000AFD0 */ 0x03, 0x00, 0x96, 0x02, 0x1A, 0xA8, 0x36, 0x14, 0x03, 0x00, 0x2A, 0x36, 0x09, 0x03, 0x00, 0x47, +/* 0000AFE0 */ 0x2A, 0x14, 0x92, 0x03, 0x36, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x03, 0x00, 0x96, +/* 0000AFF0 */ 0x03, 0x17, 0x76, 0x28, 0x24, 0x09, 0x61, 0x36, 0x2C, 0x05, 0x76, 0x36, 0x24, 0x0A, 0x76, 0x2E, +/* 0000B000 */ 0x24, 0x0B, 0x76, 0x29, 0x24, 0x0C, 0x76, 0x2A, 0x24, 0x0D, 0x76, 0x2B, 0x24, 0x0E, 0x92, 0x02, +/* 0000B010 */ 0x36, 0x76, 0x36, 0x24, 0x0F, 0x92, 0x03, 0x36, 0x76, 0x36, 0x24, 0x10, 0x92, 0x04, 0x36, 0x76, +/* 0000B020 */ 0x36, 0x24, 0x11, 0x76, 0x06, 0x24, 0x12, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, +/* 0000B030 */ 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x66, 0x03, 0xFE, 0x6F, 0x02, 0xFE, 0x3B, 0x02, +/* 0000B040 */ 0xFE, 0x2A, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x71, 0x02, 0xFE, +/* 0000B050 */ 0x72, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x77, +/* 0000B060 */ 0x02, 0xFE, 0x78, 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0x23, 0x02, 0xFE, 0xCE, 0x03, 0xFE, 0xAC, 0x83, +/* 0000B070 */ 0x35, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x37, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x2D, 0x00, 0x93, +/* 0000B080 */ 0x00, 0x18, 0x00, 0x65, 0x00, 0x04, 0x00, 0x5D, 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x1C, 0x00, 0x4F, +/* 0000B090 */ 0x00, 0x18, 0x00, 0x49, 0x00, 0x2B, 0x00, 0x71, 0x00, 0x2B, 0x00, 0x5F, 0x00, 0x35, 0x00, 0x81, +/* 0000B0A0 */ 0x00, 0x22, 0x00, 0x6E, 0x00, 0x31, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x9B, 0x00, 0x14, 0x00, 0x41, +/* 0000B0B0 */ 0x00, 0x23, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x2B, 0x00, 0x18, 0x00, 0x69, 0x00, 0x03, 0x00, 0x46, +/* 0000B0C0 */ 0x00, 0x0B, 0x00, 0x36, 0x00, 0x22, 0x00, 0x33, 0x05, 0x0B, 0x00, 0x33, 0x00, 0x0B, 0x00, 0x6F, +/* 0000B0D0 */ 0x00, 0x03, 0x00, 0x2F, 0x00, 0x21, 0x00, 0x92, 0x00, 0x08, 0x00, 0x3B, 0x00, 0x0E, 0x00, 0xB1, +/* 0000B0E0 */ 0x00, 0x03, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x51, 0x00, 0x33, 0x00, 0x79, 0x00, 0x01, 0x00, 0x52, +/* 0000B0F0 */ 0x00, 0x11, 0x00, 0x92, 0x01, 0x13, 0x00, 0x52, 0x00, 0x08, 0x00, 0x29, 0x00, 0x06, 0x00, 0x30, +/* 0000B100 */ 0x00, 0x08, 0x00, 0x2A, 0x00, 0x06, 0x00, 0x4A, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x0A, 0x00, 0x35, +/* 0000B110 */ 0x00, 0x03, 0x00, 0x3C, 0x00, 0x0D, 0x00, 0x31, 0x00, 0x03, 0x00, 0x65, 0x00, 0x04, 0x00, 0x2E, +/* 0000B120 */ 0x00, 0x08, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x48, 0x00, 0x04, 0x00, 0x2A, 0x00, 0x04, 0x00, 0x36, +/* 0000B130 */ 0x00, 0x04, 0x00, 0x42, 0x00, 0x07, 0x00, 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x07, 0x00, 0x32, +/* 0000B140 */ 0x00, 0x06, 0x00, 0x33, 0x00, 0x00, 0x4A, 0xB1, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x19, 0xC4, +/* 0000B150 */ 0x10, 0xFE, 0x0A, 0x03, 0x57, 0xA2, 0x41, 0xD1, 0x00, 0x30, 0xFE, 0x19, 0x8B, 0xFF, 0x00, 0x10, +/* 0000B160 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x19, 0x8B, 0xFE, 0xCB, 0x04, 0xFE, 0xCB, 0x04, 0x41, 0x09, 0x15, +/* 0000B170 */ 0x1A, 0x0B, 0x5E, 0x59, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x19, 0x01, 0x01, 0x01, +/* 0000B180 */ 0x02, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xCF, 0x03, 0x06, 0xFE, 0xC5, 0x03, 0x07, 0x08, 0x06, +/* 0000B190 */ 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0xC6, 0x03, 0x05, 0xFE, 0xC7, 0x03, 0x06, 0xFE, 0xC8, 0x03, 0x05, +/* 0000B1A0 */ 0xFE, 0xD0, 0x03, 0x06, 0xFE, 0xD1, 0x03, 0x0B, 0x05, 0xFE, 0xD2, 0x03, 0x06, 0xFE, 0xCA, 0x03, +/* 0000B1B0 */ 0x06, 0xFE, 0xBE, 0x03, 0x06, 0xFE, 0xBD, 0x03, 0x05, 0xFE, 0xD3, 0x03, 0xFE, 0x4C, 0x01, 0x8E, +/* 0000B1C0 */ 0x03, 0x09, 0x1B, 0x6C, 0x1A, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, +/* 0000B1D0 */ 0xE0, 0x1C, 0x00, 0x5C, 0x02, 0x1C, 0x1F, 0x03, 0x1A, 0x1A, 0x47, 0x16, 0x1A, 0x97, 0x1A, 0x16, +/* 0000B1E0 */ 0x02, 0x47, 0x17, 0x1A, 0x97, 0x1A, 0x16, 0x03, 0x14, 0x03, 0x00, 0x1A, 0x04, 0x09, 0x08, 0x00, +/* 0000B1F0 */ 0xA8, 0x1B, 0x47, 0x1A, 0x1B, 0x09, 0x07, 0x00, 0x97, 0x1B, 0x16, 0x03, 0x47, 0x1A, 0x1B, 0x47, +/* 0000B200 */ 0x18, 0x1A, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x68, 0x00, 0x8E, 0x01, 0x02, 0x1A, 0xA8, 0x1B, +/* 0000B210 */ 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x5A, 0x00, 0x8E, 0x03, 0x02, 0x1A, 0x07, 0x06, 0x00, 0x5C, +/* 0000B220 */ 0x00, 0x08, 0x8E, 0x03, 0x0A, 0x1B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x08, 0xCC, 0x00, 0x00, 0x00, +/* 0000B230 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7A, 0x18, 0x1C, 0x01, 0x5C, 0x01, 0x1C, +/* 0000B240 */ 0x5C, 0x02, 0x07, 0x1F, 0x03, 0x1B, 0x1B, 0x5C, 0x01, 0x1B, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x09, +/* 0000B250 */ 0xCD, 0x1B, 0x03, 0xA1, 0x00, 0x0A, 0x1B, 0xA1, 0x01, 0x0B, 0x1B, 0xA1, 0x02, 0x0C, 0x1B, 0x5C, +/* 0000B260 */ 0x04, 0x1B, 0xA8, 0x1B, 0x5C, 0x05, 0x1B, 0x1F, 0x06, 0x1A, 0x1A, 0x94, 0x01, 0x02, 0x1A, 0x09, +/* 0000B270 */ 0x95, 0x00, 0x14, 0x03, 0x00, 0x17, 0x0D, 0x09, 0x57, 0x00, 0x8E, 0x01, 0x03, 0x1A, 0xA8, 0x1B, +/* 0000B280 */ 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x49, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, 0x1A, 0x09, +/* 0000B290 */ 0x38, 0x00, 0x8E, 0x03, 0x31, 0x1B, 0x6C, 0x1A, 0x1B, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, +/* 0000B2A0 */ 0x8E, 0x03, 0x0C, 0x1C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x08, 0x8E, 0x03, 0x24, 0x1D, 0x5C, 0x01, +/* 0000B2B0 */ 0x1D, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x1C, 0x1C, 0x43, 0x1C, 0x1C, 0x0E, 0x5C, 0x01, 0x1C, 0x1F, +/* 0000B2C0 */ 0x02, 0x1A, 0x1A, 0x94, 0x01, 0x03, 0x1A, 0x09, 0x04, 0x00, 0x94, 0x01, 0x03, 0x0F, 0x09, 0x36, +/* 0000B2D0 */ 0x00, 0x14, 0x03, 0x00, 0x17, 0x10, 0x09, 0x2E, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, 0x1A, +/* 0000B2E0 */ 0x09, 0x24, 0x00, 0x15, 0x03, 0x00, 0x18, 0x11, 0x09, 0x1C, 0x00, 0x15, 0x03, 0x00, 0x18, 0x12, +/* 0000B2F0 */ 0x09, 0x14, 0x00, 0x15, 0x03, 0x00, 0x18, 0x13, 0x09, 0x0C, 0x00, 0x15, 0x03, 0x00, 0x18, 0x14, +/* 0000B300 */ 0x09, 0x04, 0x00, 0x94, 0x01, 0x04, 0x18, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, +/* 0000B310 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x03, 0x00, 0x00, 0xFE, 0x39, +/* 0000B320 */ 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0x5C, 0x02, 0x0E, 0xFE, 0x63, 0x03, 0x00, 0xFE, 0x45, 0x8B, 0x0C, +/* 0000B330 */ 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x82, 0x00, 0x07, 0x00, 0x2C, 0x00, 0x1E, 0x00, 0x4C, 0x00, +/* 0000B340 */ 0x16, 0x00, 0x4B, 0x00, 0x5A, 0x00, 0x9F, 0x00, 0x16, 0x00, 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, +/* 0000B350 */ 0x38, 0x00, 0xA9, 0x00, 0x07, 0x00, 0x4D, 0x00, 0x32, 0x00, 0xFF, 0x00, 0x06, 0x00, 0x41, 0x00, +/* 0000B360 */ 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x31, 0xD4, 0x02, 0xFE, 0xAC, 0x02, 0x1E, 0xA0, 0x41, 0xC1, 0x00, +/* 0000B370 */ 0xFE, 0x42, 0x03, 0x2C, 0xFE, 0xD6, 0x79, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, +/* 0000B380 */ 0xD6, 0x79, 0xFE, 0xE5, 0x08, 0xFE, 0xE5, 0x08, 0x01, 0x0C, 0x07, 0x0F, 0x06, 0x7E, 0x76, 0x01, +/* 0000B390 */ 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x0E, 0x0F, 0x08, 0x01, 0x01, 0x05, 0xFE, 0xAB, 0x03, +/* 0000B3A0 */ 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x02, 0xFE, 0x99, 0x01, 0x4F, 0x07, 0x4F, 0x08, 0x4F, 0x0B, 0x4F, +/* 0000B3B0 */ 0x0C, 0x4F, 0x0D, 0x4F, 0x09, 0x4F, 0x0A, 0x8E, 0x01, 0x4C, 0x10, 0x4B, 0x10, 0x0F, 0x03, 0x00, +/* 0000B3C0 */ 0x10, 0x09, 0x18, 0x00, 0x8E, 0x01, 0x09, 0x10, 0x61, 0x10, 0x10, 0x00, 0x0F, 0x03, 0x00, 0x10, +/* 0000B3D0 */ 0x09, 0x09, 0x00, 0x8E, 0x01, 0x4C, 0x00, 0x4B, 0x00, 0x09, 0x64, 0x01, 0xA8, 0x10, 0x47, 0x07, +/* 0000B3E0 */ 0x10, 0xA8, 0x10, 0x47, 0x08, 0x10, 0x8E, 0x01, 0x39, 0x10, 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, +/* 0000B3F0 */ 0x09, 0x73, 0x00, 0x8E, 0x01, 0x3D, 0x10, 0x4B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, +/* 0000B400 */ 0x01, 0x10, 0x10, 0x47, 0x07, 0x10, 0x8E, 0x01, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x03, +/* 0000B410 */ 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x07, 0xE0, 0x12, 0x00, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x10, +/* 0000B420 */ 0x10, 0x54, 0x09, 0x10, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x38, 0x00, 0x97, 0x10, 0x09, 0x03, 0x47, +/* 0000B430 */ 0x08, 0x10, 0x8E, 0x01, 0x0C, 0x10, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, 0x23, 0x11, +/* 0000B440 */ 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x07, 0x47, 0x11, 0x04, 0x01, 0x04, 0x01, 0x12, 0x08, 0x2F, 0x11, +/* 0000B450 */ 0x11, 0x12, 0x2F, 0x11, 0x11, 0x05, 0x5C, 0x03, 0x11, 0x5C, 0x04, 0x05, 0x1F, 0x05, 0x10, 0x10, +/* 0000B460 */ 0x47, 0x07, 0x10, 0x09, 0x3C, 0x00, 0x8E, 0x01, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x03, +/* 0000B470 */ 0x00, 0x5C, 0x00, 0x11, 0x8E, 0x01, 0x3D, 0x12, 0x4B, 0x12, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, +/* 0000B480 */ 0x1F, 0x01, 0x12, 0x12, 0x5C, 0x01, 0x12, 0xE0, 0x12, 0x01, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x10, +/* 0000B490 */ 0x10, 0x54, 0x0A, 0x10, 0x97, 0x10, 0x0A, 0x03, 0x47, 0x07, 0x10, 0x97, 0x10, 0x0A, 0x06, 0x47, +/* 0000B4A0 */ 0x08, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x08, 0x10, 0x09, 0x0F, 0x00, 0x01, 0x32, 0x01, 0x01, +/* 0000B4B0 */ 0x4C, 0x07, 0x8E, 0x01, 0x4C, 0x00, 0x4B, 0x00, 0x09, 0x85, 0x00, 0xD6, 0x00, 0x10, 0x54, 0x0B, +/* 0000B4C0 */ 0x10, 0x8E, 0x01, 0x36, 0x10, 0x97, 0x10, 0x10, 0x07, 0x54, 0x0C, 0x10, 0xA8, 0x10, 0x14, 0x03, +/* 0000B4D0 */ 0x00, 0x0C, 0x10, 0x09, 0x1F, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, +/* 0000B4E0 */ 0x02, 0x08, 0x1F, 0x03, 0x10, 0x0B, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x8E, 0x01, 0x4C, 0x00, +/* 0000B4F0 */ 0x4B, 0x00, 0x09, 0x4B, 0x00, 0x97, 0x10, 0x0C, 0x08, 0x54, 0x0D, 0x10, 0xA8, 0x10, 0x15, 0x03, +/* 0000B500 */ 0x00, 0x0D, 0x10, 0x09, 0x19, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, +/* 0000B510 */ 0x02, 0x0D, 0x1F, 0x03, 0x10, 0x0B, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x09, 0x16, 0x00, 0x07, +/* 0000B520 */ 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x10, 0x0B, 0x01, +/* 0000B530 */ 0x32, 0x01, 0x01, 0x4C, 0x10, 0x8E, 0x01, 0x4C, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000B540 */ 0x24, 0x00, 0xFE, 0x17, 0x03, 0xFE, 0x39, 0x02, 0x28, 0xFE, 0xAC, 0x03, 0x00, 0x0E, 0xFE, 0xAD, +/* 0000B550 */ 0x03, 0x00, 0xFE, 0xEC, 0x79, 0x1B, 0x0E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x09, 0x00, +/* 0000B560 */ 0x31, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, 0x23, 0x00, 0x0D, 0x00, 0x7A, 0x00, 0x13, 0x00, +/* 0000B570 */ 0x29, 0x00, 0x1E, 0x00, 0x6A, 0x00, 0x07, 0x00, 0xB8, 0x00, 0x07, 0x00, 0x26, 0x00, 0x34, 0x00, +/* 0000B580 */ 0xC6, 0x00, 0x2E, 0x00, 0x5C, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x29, 0x00, 0x0A, 0x00, +/* 0000B590 */ 0x2B, 0x00, 0x06, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x8D, 0x00, 0x06, 0x00, 0x28, 0x01, 0x0B, 0x00, +/* 0000B5A0 */ 0x56, 0x00, 0x0A, 0x00, 0x84, 0x00, 0x16, 0x00, 0x54, 0x00, 0x09, 0x00, 0x31, 0x00, 0x07, 0x00, +/* 0000B5B0 */ 0x42, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x19, 0x00, 0x6B, 0x00, 0x16, 0x00, 0x5B, 0x00, 0x0B, 0x00, +/* 0000B5C0 */ 0x22, 0x00, 0x00, 0xC7, 0xB5, 0x00, 0x00, 0xBF, 0x4C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xCA, +/* 0000B5D0 */ 0x02, 0x2C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xAE, 0x03, 0x2D, 0xFE, 0xFC, 0x7E, 0xFF, 0x00, 0x10, +/* 0000B5E0 */ 0x01, 0x00, 0x03, 0x03, 0xFE, 0xFC, 0x7E, 0xF9, 0xF9, 0x01, 0x04, 0x05, 0x08, 0x18, 0x16, 0x01, +/* 0000B5F0 */ 0x01, 0x07, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xAB, 0x03, 0x05, 0xFE, 0xAF, 0x03, 0x54, 0x8E, +/* 0000B600 */ 0x01, 0x39, 0x08, 0x4B, 0x08, 0x0F, 0x03, 0x00, 0x08, 0x09, 0x23, 0x00, 0x47, 0x00, 0x02, 0x01, +/* 0000B610 */ 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x08, +/* 0000B620 */ 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, 0x09, 0x25, 0x00, 0x09, 0x20, 0x00, 0x47, +/* 0000B630 */ 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x04, 0x01, +/* 0000B640 */ 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, 0x09, 0x02, 0x00, 0xA8, +/* 0000B650 */ 0x00, 0x24, 0x00, 0xFE, 0x31, 0x7F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x2A, 0x00, 0x23, +/* 0000B660 */ 0x00, 0x53, 0x00, 0x22, 0x00, 0x46, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0x00, 0x80, 0xC6, 0x02, 0xFE, +/* 0000B670 */ 0x97, 0x02, 0x32, 0xA0, 0x41, 0xD1, 0x00, 0x29, 0xFE, 0xF5, 0x75, 0x01, 0xFF, 0x00, 0x10, 0x01, +/* 0000B680 */ 0x00, 0x01, 0x01, 0xFE, 0xF5, 0x75, 0xFE, 0x13, 0x03, 0xFE, 0x13, 0x03, 0x01, 0x06, 0x04, 0x07, +/* 0000B690 */ 0x08, 0x1E, 0x1E, 0x01, 0x06, 0x04, 0x05, 0x06, 0x07, 0x08, 0x5B, 0x4F, 0x07, 0x96, 0x02, 0x07, +/* 0000B6A0 */ 0x8E, 0x01, 0x0A, 0x07, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x08, 0x5C, 0x01, 0x08, 0x5C, +/* 0000B6B0 */ 0x02, 0x02, 0x1F, 0x03, 0x07, 0x07, 0x96, 0x02, 0x07, 0x8E, 0x01, 0x0C, 0x07, 0x07, 0x04, 0x00, +/* 0000B6C0 */ 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x1C, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x18, 0x08, 0x07, 0x02, +/* 0000B6D0 */ 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x35, 0x09, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x08, 0x08, 0x5C, +/* 0000B6E0 */ 0x02, 0x08, 0xD4, 0x00, 0x08, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0xFF, 0x07, 0x92, 0x02, 0x00, 0x09, +/* 0000B6F0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xA8, 0x03, 0xFE, 0x0B, 0x76, 0x04, 0x05, 0x00, 0x00, +/* 0000B700 */ 0x00, 0x19, 0x00, 0x31, 0x00, 0x33, 0x00, 0xB6, 0x02, 0x08, 0x00, 0x15, 0x00, 0x00, 0x12, 0xB7, +/* 0000B710 */ 0x00, 0x00, 0xBF, 0x5D, 0x80, 0x00, 0x80, 0xC6, 0x02, 0xFE, 0x99, 0x02, 0x6B, 0xA2, 0x41, 0xD1, +/* 0000B720 */ 0x00, 0x2A, 0xFE, 0x9F, 0x76, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x9F, 0x76, +/* 0000B730 */ 0xFE, 0x48, 0x02, 0xFE, 0x48, 0x02, 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x25, 0x25, 0x02, 0x08, +/* 0000B740 */ 0x05, 0x06, 0x07, 0x07, 0x08, 0x71, 0x4F, 0x08, 0x96, 0x02, 0x08, 0x4F, 0x08, 0x96, 0x03, 0x08, +/* 0000B750 */ 0x8E, 0x02, 0x35, 0x08, 0x97, 0x08, 0x08, 0x04, 0x96, 0x02, 0x08, 0x8E, 0x02, 0x0A, 0x08, 0x07, +/* 0000B760 */ 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x09, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x08, +/* 0000B770 */ 0x08, 0x96, 0x03, 0x08, 0x8E, 0x02, 0x0C, 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, +/* 0000B780 */ 0x1C, 0x09, 0x5C, 0x01, 0x09, 0x8E, 0x02, 0x18, 0x09, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x92, +/* 0000B790 */ 0x02, 0x0A, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x09, 0x09, 0x5C, 0x02, 0x09, 0xD4, 0x00, 0x09, 0x5C, +/* 0000B7A0 */ 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, 0x8E, 0x01, 0x02, 0x08, 0x4B, 0x08, 0x92, 0x03, 0x09, 0x9C, +/* 0000B7B0 */ 0x09, 0x08, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xA9, 0x03, 0xFE, 0xAA, 0x03, 0xFE, 0xBF, 0x76, +/* 0000B7C0 */ 0x05, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x56, 0x00, 0x19, 0x00, 0x45, 0x00, 0x32, 0x00, 0x58, +/* 0000B7D0 */ 0x01, 0x0F, 0x00, 0x34, 0x00, 0x00, 0xDA, 0xB7, 0x00, 0x00, 0xBF, 0x4C, 0x80, 0x00, 0x00, 0xC4, +/* 0000B7E0 */ 0x00, 0xFE, 0x9D, 0x02, 0x68, 0xA2, 0x41, 0xD1, 0x00, 0x2B, 0xFE, 0xB6, 0x77, 0xFF, 0x00, 0x10, +/* 0000B7F0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0xB6, 0x77, 0xEC, 0xEC, 0x41, 0x04, 0x03, 0x06, 0x0D, 0x0D, 0x03, +/* 0000B800 */ 0x02, 0x05, 0x06, 0xFE, 0x0A, 0x03, 0x25, 0x4F, 0x04, 0x8E, 0x01, 0x02, 0x06, 0x4B, 0x06, 0x97, +/* 0000B810 */ 0x06, 0x06, 0x03, 0x54, 0x04, 0x06, 0x15, 0x03, 0x00, 0x04, 0x02, 0x09, 0x0A, 0x00, 0x8E, 0x01, +/* 0000B820 */ 0x03, 0x06, 0x4B, 0x06, 0x9C, 0x03, 0x06, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xDD, 0x77, 0x04, +/* 0000B830 */ 0x02, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x48, 0x00, 0x08, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x4F, 0x00, +/* 0000B840 */ 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x72, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, +/* 0000B850 */ 0xFE, 0xA7, 0x03, 0x28, 0xFE, 0xCD, 0x6B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xCD, +/* 0000B860 */ 0x6B, 0x96, 0x96, 0x01, 0x05, 0x03, 0x06, 0x05, 0x0F, 0x0F, 0x01, 0x02, 0x05, 0x08, 0x29, 0x5B, +/* 0000B870 */ 0x04, 0xB3, 0x04, 0x04, 0x8E, 0x01, 0x33, 0x06, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, +/* 0000B880 */ 0x04, 0x8E, 0x01, 0x4B, 0x07, 0x4B, 0x07, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x00, +/* 0000B890 */ 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x0B, 0x6C, 0x02, 0x05, 0x00, 0x00, 0x00, +/* 0000B8A0 */ 0x22, 0x00, 0x57, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x6C, 0x02, 0x08, +/* 0000B8B0 */ 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA6, 0x03, 0x27, 0xFE, 0x27, 0x6A, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000B8C0 */ 0x03, 0x02, 0xFE, 0x27, 0x6A, 0xCC, 0xCC, 0x01, 0x06, 0x03, 0x07, 0x06, 0x13, 0x12, 0x01, 0x02, +/* 0000B8D0 */ 0x06, 0x08, 0x36, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, +/* 0000B8E0 */ 0x04, 0x07, 0x8E, 0x01, 0x32, 0x07, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8E, +/* 0000B8F0 */ 0x01, 0x49, 0x08, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0x1F, 0x05, +/* 0000B900 */ 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x65, 0x6A, 0x03, 0x05, 0x00, 0x00, +/* 0000B910 */ 0x00, 0x0A, 0x00, 0x23, 0x00, 0x25, 0x00, 0x6A, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, +/* 0000B920 */ 0x00, 0xFE, 0x66, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA5, 0x03, 0x26, 0xFE, 0x4D, 0x68, +/* 0000B930 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x4D, 0x68, 0xC8, 0xC8, 0x01, 0x06, 0x03, 0x07, +/* 0000B940 */ 0x06, 0x13, 0x12, 0x01, 0x02, 0x06, 0x08, 0x36, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x15, 0x05, 0x00, +/* 0000B950 */ 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, 0x01, 0x32, 0x07, 0x07, 0x05, 0x00, 0x5C, 0x00, +/* 0000B960 */ 0x02, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x47, 0x08, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x03, +/* 0000B970 */ 0x5C, 0x04, 0x04, 0x1F, 0x05, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x89, +/* 0000B980 */ 0x68, 0x03, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x23, 0x00, 0x25, 0x00, 0x68, 0x00, 0x00, 0xBF, +/* 0000B990 */ 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x60, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA4, +/* 0000B9A0 */ 0x03, 0x25, 0xFE, 0x83, 0x66, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x83, 0x66, 0xC0, +/* 0000B9B0 */ 0xC0, 0x01, 0x06, 0x03, 0x07, 0x06, 0x13, 0x12, 0x01, 0x02, 0x06, 0x08, 0x36, 0x5B, 0x05, 0xB3, +/* 0000B9C0 */ 0x05, 0x05, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, 0x01, 0x32, 0x07, +/* 0000B9D0 */ 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x45, 0x08, 0x4B, 0x08, 0x5C, +/* 0000B9E0 */ 0x02, 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0x1F, 0x05, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, +/* 0000B9F0 */ 0x00, 0x24, 0x00, 0xFE, 0xBB, 0x66, 0x03, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x23, 0x00, 0x25, +/* 0000BA00 */ 0x00, 0x64, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x42, 0x02, 0x1D, 0xA2, +/* 0000BA10 */ 0x41, 0xC1, 0x00, 0xFE, 0xFA, 0x02, 0x24, 0xFE, 0xE3, 0x60, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 0000BA20 */ 0x03, 0xFE, 0xE3, 0x60, 0xFE, 0x60, 0x03, 0xFE, 0x60, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, 0x50, +/* 0000BA30 */ 0x4D, 0x01, 0x08, 0x04, 0x04, 0x04, 0x04, 0x0B, 0x08, 0x06, 0xFE, 0x72, 0x03, 0x05, 0xFE, 0x64, +/* 0000BA40 */ 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x06, 0xFE, 0xA2, 0x03, 0x05, 0xFE, 0xA3, 0x03, 0xFE, 0x0E, 0x01, +/* 0000BA50 */ 0xA8, 0x0A, 0x8E, 0x01, 0x07, 0x0C, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x1F, +/* 0000BA60 */ 0x02, 0x0C, 0x0C, 0x47, 0x08, 0x0C, 0x2C, 0x0C, 0x09, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x66, +/* 0000BA70 */ 0x00, 0x61, 0x0C, 0x09, 0x00, 0x47, 0x0A, 0x0C, 0x2C, 0x0C, 0x0A, 0x15, 0x03, 0x00, 0x0C, 0x03, +/* 0000BA80 */ 0x09, 0x54, 0x00, 0x8E, 0x01, 0x31, 0x0D, 0x6C, 0x0C, 0x0D, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000BA90 */ 0x0D, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0C, 0x0C, 0x47, 0x0A, 0x0C, 0x15, 0x03, 0x00, 0x0A, 0x04, +/* 0000BAA0 */ 0x09, 0x34, 0x00, 0x15, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x2C, 0x00, 0x8E, 0x01, 0x09, 0x0D, 0x6C, +/* 0000BAB0 */ 0x0C, 0x0D, 0x02, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0D, 0x8E, 0x01, 0x11, 0x0E, 0x07, 0x02, 0x00, +/* 0000BAC0 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0E, 0x0E, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x06, +/* 0000BAD0 */ 0x5C, 0x03, 0x07, 0x1F, 0x04, 0xFF, 0x0C, 0x2C, 0x0C, 0x0A, 0x14, 0x0B, 0x00, 0x0C, 0x03, 0x09, +/* 0000BAE0 */ 0x00, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x44, 0x00, 0x8E, 0x01, 0x08, 0x0C, 0x07, 0x04, +/* 0000BAF0 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x2B, 0x0D, 0x5C, 0x02, 0x0D, 0x8E, 0x01, +/* 0000BB00 */ 0x09, 0x0E, 0x6C, 0x0D, 0x0E, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, 0x8E, 0x01, 0x30, 0x0F, +/* 0000BB10 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x0D, +/* 0000BB20 */ 0x0D, 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0x00, 0x0C, 0x09, 0x31, 0x00, 0x09, 0x2C, 0x00, 0x8E, 0x01, +/* 0000BB30 */ 0x08, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x2C, 0x0D, 0x5C, +/* 0000BB40 */ 0x02, 0x0D, 0x8E, 0x01, 0x30, 0x0D, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x0D, 0x0D, +/* 0000BB50 */ 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x64, +/* 0000BB60 */ 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x5F, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x1E, 0x61, 0x0B, 0x02, 0x00, +/* 0000BB70 */ 0x00, 0x00, 0x14, 0x00, 0x34, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0B, 0x00, +/* 0000BB80 */ 0x36, 0x00, 0x18, 0x00, 0x37, 0x00, 0x10, 0x00, 0x4A, 0x00, 0x2C, 0x00, 0x96, 0x00, 0x13, 0x00, +/* 0000BB90 */ 0x4C, 0x00, 0x44, 0x00, 0x93, 0x00, 0x2E, 0x00, 0x64, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, +/* 0000BBA0 */ 0xC4, 0x00, 0xFE, 0x34, 0x02, 0x28, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3F, 0x03, 0x23, 0xFE, 0x0F, +/* 0000BBB0 */ 0x5F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x0F, 0x5F, 0xFE, 0x8C, 0x01, 0xFE, 0x8C, +/* 0000BBC0 */ 0x01, 0x01, 0x07, 0x05, 0x0A, 0x03, 0x26, 0x25, 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0x09, 0x07, +/* 0000BBD0 */ 0x05, 0xFE, 0xF3, 0x02, 0x08, 0x7F, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0A, +/* 0000BBE0 */ 0x14, 0x03, 0x00, 0x05, 0x0A, 0x09, 0x15, 0x00, 0x8E, 0x01, 0x09, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, +/* 0000BBF0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0A, 0x8E, 0x01, 0x09, +/* 0000BC00 */ 0x0B, 0x6C, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x05, 0x1F, 0x02, +/* 0000BC10 */ 0x0A, 0x0A, 0x47, 0x08, 0x0A, 0x0F, 0x03, 0x00, 0x08, 0x09, 0x0C, 0x00, 0x61, 0x0A, 0x08, 0x02, +/* 0000BC20 */ 0x15, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x15, 0x00, 0x8E, 0x01, 0x09, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, +/* 0000BC30 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0A, 0x8E, 0x01, 0x07, +/* 0000BC40 */ 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x00, 0x0A, 0x09, 0x02, +/* 0000BC50 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5A, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0x40, +/* 0000BC60 */ 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x15, 0x00, 0x40, 0x00, 0x18, 0x00, +/* 0000BC70 */ 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x15, 0x00, 0x40, 0x00, 0x16, 0x00, 0x2C, 0x00, 0x00, 0xBF, +/* 0000BC80 */ 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x27, 0x02, 0x24, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3E, +/* 0000BC90 */ 0x03, 0x22, 0xFE, 0x4B, 0x5D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x4B, 0x5D, 0xFE, +/* 0000BCA0 */ 0x9A, 0x01, 0xFE, 0x9A, 0x01, 0x01, 0x08, 0x05, 0x0B, 0x04, 0x27, 0x26, 0x01, 0x02, 0x03, 0x03, +/* 0000BCB0 */ 0x03, 0x03, 0x0A, 0x07, 0x05, 0xFE, 0xF3, 0x02, 0x08, 0x82, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, +/* 0000BCC0 */ 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x05, 0x0B, 0x09, 0x15, 0x00, 0x8E, 0x01, 0x09, 0x0C, +/* 0000BCD0 */ 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, +/* 0000BCE0 */ 0x0B, 0x8E, 0x01, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, +/* 0000BCF0 */ 0x01, 0x05, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0C, 0x00, +/* 0000BD00 */ 0x61, 0x0B, 0x09, 0x02, 0x15, 0x03, 0x00, 0x0B, 0x03, 0x09, 0x15, 0x00, 0x8E, 0x01, 0x09, 0x0C, +/* 0000BD10 */ 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, +/* 0000BD20 */ 0x0B, 0x8E, 0x01, 0x34, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x5C, 0x02, +/* 0000BD30 */ 0x08, 0x1F, 0x03, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5A, 0x02, 0xFE, +/* 0000BD40 */ 0x35, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0x85, 0x5D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, +/* 0000BD50 */ 0x00, 0x15, 0x00, 0x40, 0x00, 0x18, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x15, 0x00, 0x40, +/* 0000BD60 */ 0x00, 0x19, 0x00, 0x31, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0x89, 0xC6, 0x12, 0xFE, 0x14, 0x02, +/* 0000BD70 */ 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x20, 0x03, 0x20, 0xFE, 0xB6, 0x59, 0x01, 0xFF, 0x00, 0x10, +/* 0000BD80 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xB6, 0x59, 0xFE, 0x6F, 0x03, 0xFE, 0x6F, 0x03, 0x04, 0x09, 0x0A, +/* 0000BD90 */ 0x10, 0x05, 0x20, 0x20, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0x0D, 0x0E, 0x0F, 0x01, 0x00, +/* 0000BDA0 */ 0x08, 0x06, 0xFE, 0x9C, 0x03, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0C, 0x06, 0xFE, +/* 0000BDB0 */ 0x14, 0x03, 0x07, 0x6D, 0x96, 0x04, 0x0B, 0x96, 0x05, 0x0C, 0xCD, 0x10, 0x00, 0x96, 0x02, 0x10, +/* 0000BDC0 */ 0x96, 0x03, 0x02, 0x8E, 0x01, 0x0C, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x1C, +/* 0000BDD0 */ 0x11, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0xD4, 0x00, 0x11, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, +/* 0000BDE0 */ 0x10, 0x8E, 0x01, 0x1B, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x92, 0x02, 0x11, 0x5C, 0x01, +/* 0000BDF0 */ 0x11, 0x5C, 0x02, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, +/* 0000BE00 */ 0x00, 0x92, 0x03, 0x12, 0x7A, 0x12, 0x11, 0x00, 0x7A, 0x07, 0x11, 0x01, 0x7A, 0x07, 0x11, 0x02, +/* 0000BE10 */ 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, 0x92, 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000BE20 */ 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000BE30 */ 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0xB6, 0x01, 0xFE, +/* 0000BE40 */ 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0x9D, 0x03, 0xFE, 0x9E, 0x03, 0xFE, 0x9F, 0x03, 0xFE, 0xA0, +/* 0000BE50 */ 0x03, 0xFE, 0x09, 0x5A, 0x06, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x19, 0x00, 0x03, 0x00, 0x17, +/* 0000BE60 */ 0x00, 0x1E, 0x00, 0x70, 0x02, 0x36, 0x00, 0x68, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x72, 0xBE, +/* 0000BE70 */ 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x29, 0xD4, 0x10, 0xFE, 0x17, 0x02, 0x41, 0xB2, 0x41, 0xD1, +/* 0000BE80 */ 0x00, 0x21, 0xFE, 0x72, 0x5A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x72, 0x5A, 0xFE, +/* 0000BE90 */ 0x2C, 0x02, 0xFE, 0x2C, 0x02, 0x45, 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x07, 0x05, 0x05, +/* 0000BEA0 */ 0x05, 0x05, 0x01, 0x01, 0x0E, 0x0F, 0x08, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0C, +/* 0000BEB0 */ 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x13, 0x03, 0x0B, 0x07, 0x01, 0x01, 0xA0, 0xA8, 0x0D, 0xE5, +/* 0000BEC0 */ 0x82, 0x00, 0x8E, 0x02, 0x2E, 0x10, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0B, 0x8E, +/* 0000BED0 */ 0x01, 0x04, 0x11, 0x5C, 0x02, 0x11, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x8E, 0x01, 0x05, 0x11, 0x5C, +/* 0000BEE0 */ 0x04, 0x11, 0x1F, 0x05, 0x10, 0x10, 0x47, 0x0D, 0x10, 0x61, 0x10, 0x0D, 0x00, 0x0F, 0x03, 0x00, +/* 0000BEF0 */ 0x10, 0x09, 0x4C, 0x00, 0x8E, 0x02, 0x1B, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, +/* 0000BF00 */ 0x02, 0x11, 0x5C, 0x01, 0x11, 0x8E, 0x01, 0x03, 0x11, 0x5C, 0x02, 0x11, 0xCC, 0x00, 0x00, 0x00, +/* 0000BF10 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x61, 0x12, 0x0D, 0x00, 0x7A, 0x12, 0x11, +/* 0000BF20 */ 0x01, 0x7A, 0x05, 0x11, 0x02, 0x7A, 0x05, 0x11, 0x03, 0x7A, 0x08, 0x11, 0x04, 0x5C, 0x03, 0x11, +/* 0000BF30 */ 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x01, 0x03, 0x10, 0x2F, 0x10, 0x10, 0x0A, 0x94, 0x01, 0x03, 0x10, +/* 0000BF40 */ 0xE9, 0x09, 0x15, 0x00, 0xE7, 0x0C, 0x06, 0x8E, 0x02, 0x29, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000BF50 */ 0x02, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0xFF, 0x10, 0xE9, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x18, 0x00, +/* 0000BF60 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, +/* 0000BF70 */ 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xFE, 0x21, 0x02, 0xFE, +/* 0000BF80 */ 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xA8, 0x5A, 0x07, 0x05, +/* 0000BF90 */ 0x00, 0x00, 0x00, 0x27, 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x40, 0x00, 0x8D, 0x00, 0x12, +/* 0000BFA0 */ 0x00, 0x33, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x14, 0x00, 0x8F, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, +/* 0000BFB0 */ 0x81, 0xC6, 0x02, 0xFE, 0xF0, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1F, 0x03, 0x1E, 0xFE, +/* 0000BFC0 */ 0x7F, 0x55, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x7F, 0x55, 0xFE, 0x31, 0x04, +/* 0000BFD0 */ 0xFE, 0x31, 0x04, 0x01, 0x08, 0x05, 0x0A, 0x05, 0x2C, 0x2A, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, +/* 0000BFE0 */ 0x07, 0x08, 0x09, 0x06, 0xFE, 0x72, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x08, 0x8B, 0x4F, 0x06, 0x4F, +/* 0000BFF0 */ 0x0A, 0x96, 0x02, 0x0A, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x06, 0x00, 0xCD, +/* 0000C000 */ 0x00, 0x00, 0x09, 0x71, 0x00, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x0A, 0x00, +/* 0000C010 */ 0xCD, 0x0A, 0x01, 0xA1, 0x00, 0x05, 0x0A, 0x47, 0x05, 0x0A, 0x8E, 0x01, 0x31, 0x0B, 0x6C, 0x0A, +/* 0000C020 */ 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x0A, 0x0A, 0x47, +/* 0000C030 */ 0x05, 0x0A, 0x8E, 0x01, 0x31, 0x0B, 0x6C, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, +/* 0000C040 */ 0x61, 0x0C, 0x05, 0x02, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0A, 0x0A, 0x54, 0x06, 0x0A, 0xCD, 0x0A, +/* 0000C050 */ 0x00, 0x96, 0x02, 0x0A, 0x8E, 0x01, 0x28, 0x0A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 0000C060 */ 0x05, 0x5C, 0x02, 0x06, 0xD4, 0x00, 0x0B, 0x5C, 0x03, 0x0B, 0x1F, 0x04, 0xFF, 0x0A, 0x92, 0x02, +/* 0000C070 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x61, 0x02, 0xF3, 0xFE, +/* 0000C080 */ 0x99, 0x03, 0xFE, 0xB2, 0x55, 0x0A, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x06, 0x00, +/* 0000C090 */ 0x1E, 0x00, 0x0B, 0x00, 0x2F, 0x00, 0x0A, 0x00, 0x28, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x1C, 0x00, +/* 0000C0A0 */ 0x70, 0x00, 0x06, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x8F, 0x02, 0x08, 0x00, 0x11, 0x00, 0x00, 0xB3, +/* 0000C0B0 */ 0xC0, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xFF, 0x01, 0x2A, 0xA2, 0x41, +/* 0000C0C0 */ 0xD1, 0x00, 0x1F, 0xFE, 0x31, 0x57, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x31, 0x57, +/* 0000C0D0 */ 0xFE, 0x61, 0x02, 0xFE, 0x61, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x4C, 0x4A, 0x02, 0x08, 0x04, +/* 0000C0E0 */ 0x04, 0x04, 0x04, 0x0A, 0x06, 0xFE, 0x6D, 0x03, 0x06, 0xFE, 0x9A, 0x03, 0x07, 0x05, 0xFE, 0x9B, +/* 0000C0F0 */ 0x03, 0x08, 0x01, 0xFF, 0xFD, 0x4F, 0x09, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, +/* 0000C100 */ 0x0B, 0x00, 0x2C, 0x0B, 0x08, 0x15, 0x0B, 0x00, 0x0B, 0x03, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, +/* 0000C110 */ 0x08, 0x04, 0x09, 0x15, 0x00, 0x8E, 0x02, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, +/* 0000C120 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x02, 0x31, 0x0C, 0x6C, 0x0B, +/* 0000C130 */ 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, +/* 0000C140 */ 0x09, 0x0B, 0x8E, 0x02, 0x3F, 0x0B, 0x4B, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, +/* 0000C150 */ 0x09, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x29, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x02, 0x09, 0x0C, +/* 0000C160 */ 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x8E, 0x02, 0x11, 0x0D, 0x07, 0x02, +/* 0000C170 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0D, 0x0D, 0x5C, 0x01, 0x0D, 0x1F, 0x02, +/* 0000C180 */ 0xFF, 0x0B, 0x8E, 0x02, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, +/* 0000C190 */ 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x09, +/* 0000C1A0 */ 0x0B, 0x09, 0x4A, 0x00, 0x8E, 0x02, 0x0C, 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x02, +/* 0000C1B0 */ 0x1D, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, 0x01, 0x02, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, +/* 0000C1C0 */ 0x09, 0x1F, 0x04, 0x0B, 0x0B, 0x14, 0x03, 0x00, 0x0B, 0x07, 0x09, 0x21, 0x00, 0x8E, 0x02, 0x0C, +/* 0000C1D0 */ 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x02, 0x1E, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, 0x01, +/* 0000C1E0 */ 0x02, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x0B, 0xA8, 0x00, +/* 0000C1F0 */ 0x24, 0x00, 0xFE, 0x58, 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x62, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x51, +/* 0000C200 */ 0x57, 0x09, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x65, 0x00, 0x15, 0x00, 0x47, 0x00, 0x18, 0x00, +/* 0000C210 */ 0x32, 0x00, 0x1A, 0x00, 0x35, 0x00, 0x26, 0x00, 0x4B, 0x00, 0x18, 0x00, 0x37, 0x00, 0x33, 0x00, +/* 0000C220 */ 0x65, 0x00, 0x23, 0x00, 0x46, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xE5, +/* 0000C230 */ 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1E, 0x03, 0x1D, 0xFE, 0x0A, 0x54, 0xFF, 0x00, 0x10, +/* 0000C240 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0A, 0x54, 0xF8, 0xF8, 0x01, 0x05, 0x04, 0x06, 0x04, 0x1D, 0x1C, +/* 0000C250 */ 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0x05, 0x08, 0x07, 0x5C, 0x8E, 0x01, 0x31, 0x07, 0x6C, 0x06, +/* 0000C260 */ 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x06, 0x06, 0x47, +/* 0000C270 */ 0x04, 0x06, 0x8E, 0x01, 0x41, 0x06, 0x4B, 0x06, 0x0F, 0x11, 0x00, 0x06, 0x09, 0x00, 0x00, 0x8E, +/* 0000C280 */ 0x01, 0x04, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x06, 0x8E, 0x01, 0x09, +/* 0000C290 */ 0x07, 0x6C, 0x06, 0x07, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x8E, 0x01, +/* 0000C2A0 */ 0x41, 0x08, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x06, 0x06, 0x44, 0x00, 0x06, 0x03, 0x09, +/* 0000C2B0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5D, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x3C, 0x54, 0x05, +/* 0000C2C0 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x29, 0x00, 0x0D, 0x00, 0x25, 0x00, 0x0E, 0x00, 0x2F, 0x00, +/* 0000C2D0 */ 0x27, 0x00, 0x48, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xAA, 0x01, 0x04, +/* 0000C2E0 */ 0xA1, 0x41, 0xC1, 0x00, 0xFE, 0x1D, 0x03, 0x1C, 0xFE, 0x06, 0x41, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000C2F0 */ 0x01, 0x01, 0xFE, 0x06, 0x41, 0xFE, 0xFE, 0x12, 0xFE, 0xFE, 0x12, 0x41, 0x17, 0x25, 0x38, 0x04, +/* 0000C300 */ 0xAF, 0x9B, 0x01, 0x01, 0x37, 0x05, 0xFE, 0x77, 0x03, 0x05, 0xFE, 0x78, 0x03, 0x05, 0xFE, 0x79, +/* 0000C310 */ 0x03, 0x06, 0xFE, 0x7A, 0x03, 0x06, 0xFE, 0x7B, 0x03, 0x05, 0xFE, 0x7C, 0x03, 0x05, 0xFE, 0x7D, +/* 0000C320 */ 0x03, 0x05, 0xFE, 0x7E, 0x03, 0x05, 0xFE, 0x7F, 0x03, 0x05, 0xFE, 0x80, 0x03, 0x05, 0xFE, 0x81, +/* 0000C330 */ 0x03, 0x05, 0xFE, 0x82, 0x03, 0x05, 0xFE, 0x83, 0x03, 0x05, 0xFE, 0x84, 0x03, 0x05, 0xFE, 0x85, +/* 0000C340 */ 0x03, 0x05, 0xFE, 0x86, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0x87, 0x03, 0x05, 0xFE, 0x88, +/* 0000C350 */ 0x03, 0x05, 0xFE, 0x89, 0x03, 0x05, 0xFE, 0x8A, 0x03, 0x05, 0xFE, 0x8B, 0x03, 0x05, 0xFE, 0x8C, +/* 0000C360 */ 0x03, 0x05, 0xFE, 0x8D, 0x03, 0x05, 0xFE, 0x8E, 0x03, 0x05, 0xFE, 0x8F, 0x03, 0x05, 0xFE, 0x90, +/* 0000C370 */ 0x03, 0x05, 0xFE, 0x91, 0x03, 0x05, 0xFE, 0x92, 0x03, 0x05, 0xFE, 0x93, 0x03, 0x05, 0xFE, 0x94, +/* 0000C380 */ 0x03, 0x05, 0xFE, 0x95, 0x03, 0x05, 0xFE, 0x96, 0x03, 0x05, 0xFE, 0x97, 0x03, 0x06, 0xFE, 0x98, +/* 0000C390 */ 0x03, 0xFE, 0x87, 0x02, 0x4F, 0x25, 0x4F, 0x26, 0x4F, 0x27, 0x4F, 0x28, 0x4F, 0x29, 0x4F, 0x2A, +/* 0000C3A0 */ 0x4F, 0x2B, 0x4F, 0x2C, 0x4F, 0x2D, 0x4F, 0x2E, 0x4F, 0x2F, 0x4F, 0x30, 0x4F, 0x31, 0x4F, 0x32, +/* 0000C3B0 */ 0x4F, 0x33, 0x4F, 0x34, 0x4F, 0x35, 0x4F, 0x36, 0x54, 0x25, 0x02, 0x54, 0x26, 0x03, 0x47, 0x38, +/* 0000C3C0 */ 0x04, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, +/* 0000C3D0 */ 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x06, 0x54, 0x27, 0x38, 0x54, 0x28, +/* 0000C3E0 */ 0x07, 0x2F, 0x38, 0x08, 0x09, 0x54, 0x29, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x28, +/* 0000C3F0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x29, 0x2F, 0x38, 0x38, +/* 0000C400 */ 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x2A, 0x38, 0x47, 0x38, 0x0C, 0x01, 0x04, 0x01, 0x39, 0x27, +/* 0000C410 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0D, 0x54, 0x2B, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, +/* 0000C420 */ 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0E, 0x54, 0x2C, 0x38, 0x47, 0x38, +/* 0000C430 */ 0x0A, 0x01, 0x04, 0x01, 0x39, 0x2C, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0F, 0x01, 0x04, +/* 0000C440 */ 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x10, 0x54, 0x2D, 0x38, 0x47, 0x38, +/* 0000C450 */ 0x0A, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x11, 0x01, 0x04, +/* 0000C460 */ 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x12, 0x01, 0x04, 0x01, 0x39, 0x27, +/* 0000C470 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2E, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, +/* 0000C480 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x14, 0x01, 0x04, 0x01, 0x39, 0x26, +/* 0000C490 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2F, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, +/* 0000C4A0 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x15, 0x54, 0x30, 0x38, 0x47, 0x38, +/* 0000C4B0 */ 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x16, 0x01, 0x04, +/* 0000C4C0 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x17, 0x54, 0x31, 0x38, 0x47, 0x39, +/* 0000C4D0 */ 0x12, 0x01, 0x04, 0x01, 0x3A, 0x25, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x18, 0xFC, 0x38, +/* 0000C4E0 */ 0x0A, 0x39, 0x05, 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x31, 0x2F, 0x39, 0x39, 0x3A, 0x2F, +/* 0000C4F0 */ 0x39, 0x39, 0x1A, 0x47, 0x3A, 0x05, 0x01, 0x04, 0x01, 0x3B, 0x25, 0x2F, 0x3A, 0x3A, 0x3B, 0x2F, +/* 0000C500 */ 0x3A, 0x3A, 0x1B, 0xFE, 0x38, 0x39, 0x3A, 0x02, 0xFD, 0x38, 0x0B, 0x04, 0x54, 0x32, 0x38, 0x47, +/* 0000C510 */ 0x38, 0x1C, 0x01, 0x04, 0x01, 0x39, 0x32, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x47, +/* 0000C520 */ 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x30, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, +/* 0000C530 */ 0x38, 0x38, 0x39, 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x2F, 0x2F, 0x39, 0x39, 0x3A, 0x2F, +/* 0000C540 */ 0x39, 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x54, 0x33, 0x38, 0x47, 0x38, 0x19, 0x01, 0x04, 0x01, +/* 0000C550 */ 0x39, 0x2E, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x1F, 0x47, 0x39, 0x20, 0x01, 0x04, 0x01, +/* 0000C560 */ 0x3A, 0x2D, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x21, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, +/* 0000C570 */ 0x19, 0x01, 0x04, 0x01, 0x3A, 0x2B, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x22, 0x2F, 0x38, +/* 0000C580 */ 0x38, 0x39, 0x54, 0x34, 0x38, 0x47, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x33, 0x2F, 0x38, 0x38, +/* 0000C590 */ 0x39, 0x2F, 0x38, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x34, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, +/* 0000C5A0 */ 0x38, 0x23, 0x54, 0x35, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x35, 0x2F, 0x38, 0x38, +/* 0000C5B0 */ 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, +/* 0000C5C0 */ 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2A, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, +/* 0000C5D0 */ 0x36, 0x38, 0x8E, 0x01, 0x0F, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x33, 0x5C, 0x02, 0x24, 0xC2, +/* 0000C5E0 */ 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, 0x42, 0x38, 0x8E, 0x01, 0x0F, 0x38, 0x07, 0x03, 0x00, +/* 0000C5F0 */ 0x5C, 0x01, 0x34, 0x5C, 0x02, 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, 0x43, 0x38, +/* 0000C600 */ 0x8E, 0x01, 0x0F, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x24, 0xC2, 0x03, 0x38, +/* 0000C610 */ 0x38, 0x01, 0x32, 0x01, 0x01, 0x44, 0x38, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xE6, 0x45, 0x16, 0x24, +/* 0000C620 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x33, 0x00, 0x03, +/* 0000C630 */ 0x00, 0x77, 0x00, 0x07, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x44, 0x00, 0x13, 0x00, 0x7D, 0x00, 0x13, +/* 0000C640 */ 0x00, 0x94, 0x00, 0x20, 0x00, 0x83, 0x00, 0x2D, 0x00, 0x83, 0x00, 0x20, 0x00, 0x74, 0x00, 0x13, +/* 0000C650 */ 0x00, 0x6A, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x41, 0x00, 0x00, 0x04, 0x3B, 0x00, 0x4C, 0x01, 0x3B, +/* 0000C660 */ 0x00, 0x5A, 0x01, 0x20, 0x00, 0x4B, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x17, 0x00, 0x66, 0x00, 0x17, +/* 0000C670 */ 0x00, 0x8B, 0x00, 0x19, 0x00, 0x72, 0x00, 0x00, 0xBF, 0x4C, 0x00, 0x00, 0x10, 0xC4, 0x00, 0xFE, +/* 0000C680 */ 0xA3, 0x01, 0x04, 0xA1, 0x41, 0xC1, 0x00, 0xFE, 0x1C, 0x03, 0x1B, 0xFE, 0xC9, 0x3F, 0xFF, 0x00, +/* 0000C690 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xC9, 0x3F, 0x55, 0x55, 0x41, 0x02, 0x02, 0x03, 0x05, 0x05, +/* 0000C6A0 */ 0x01, 0x01, 0x02, 0x0D, 0xE0, 0x03, 0x00, 0x01, 0x32, 0x01, 0x01, 0x41, 0x03, 0xA8, 0x00, 0x24, +/* 0000C6B0 */ 0x00, 0x0A, 0xFE, 0x76, 0x03, 0x01, 0xFE, 0xF7, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, +/* 0000C6C0 */ 0x26, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x21, 0xD4, 0x00, 0xFE, 0x92, 0x01, 0x04, 0xA3, 0x41, +/* 0000C6D0 */ 0xC1, 0x00, 0xFE, 0x1B, 0x03, 0x1A, 0xFE, 0x64, 0x3D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, +/* 0000C6E0 */ 0xFE, 0x64, 0x3D, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x0C, 0x07, 0x0F, 0x08, 0x3C, 0x3B, +/* 0000C6F0 */ 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0x0E, 0x0F, 0x06, 0xFE, 0x72, 0x03, 0x08, 0x06, 0xFE, +/* 0000C700 */ 0x73, 0x03, 0x05, 0xFE, 0x74, 0x03, 0x06, 0xFE, 0x75, 0x03, 0xC8, 0x4F, 0x0C, 0x4F, 0x0D, 0x97, +/* 0000C710 */ 0x10, 0x07, 0x08, 0x54, 0x0C, 0x10, 0x2C, 0x10, 0x0C, 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0xA8, +/* 0000C720 */ 0x00, 0x8E, 0x01, 0x31, 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, +/* 0000C730 */ 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x54, 0x0D, 0x10, 0x8E, 0x01, 0x27, 0x10, 0x07, 0x02, 0x00, +/* 0000C740 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x13, 0x00, 0x10, 0x09, 0x00, +/* 0000C750 */ 0x00, 0x12, 0x0B, 0x00, 0x0D, 0x09, 0x09, 0x00, 0x00, 0x11, 0x03, 0x00, 0x0D, 0x0A, 0x09, 0x4D, +/* 0000C760 */ 0x00, 0x8E, 0x01, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x11, 0x8E, +/* 0000C770 */ 0x01, 0x11, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x12, 0x12, +/* 0000C780 */ 0x5C, 0x01, 0x12, 0x8E, 0x01, 0x11, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x08, +/* 0000C790 */ 0x1F, 0x02, 0x12, 0x12, 0x5C, 0x02, 0x12, 0x2F, 0x12, 0x04, 0x09, 0x2F, 0x12, 0x12, 0x05, 0x2F, +/* 0000C7A0 */ 0x12, 0x12, 0x0A, 0x2F, 0x12, 0x12, 0x06, 0x5C, 0x03, 0x12, 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x01, +/* 0000C7B0 */ 0x15, 0x11, 0x6C, 0x10, 0x11, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0x1F, +/* 0000C7C0 */ 0x02, 0x00, 0x10, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, +/* 0000C7D0 */ 0x00, 0x24, 0x00, 0xFE, 0x5E, 0x02, 0xFE, 0x5F, 0x02, 0x1F, 0xFE, 0xB6, 0x3D, 0x08, 0x04, 0x00, +/* 0000C7E0 */ 0x00, 0x00, 0x07, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x33, 0x00, 0x18, 0x00, 0x41, 0x00, 0x28, 0x00, +/* 0000C7F0 */ 0x65, 0x00, 0x4D, 0x00, 0x8D, 0x00, 0x1B, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x00, 0xBF, +/* 0000C800 */ 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x78, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1A, +/* 0000C810 */ 0x03, 0x19, 0xFE, 0x47, 0x3A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x47, 0x3A, 0xFE, +/* 0000C820 */ 0x17, 0x03, 0xFE, 0x17, 0x03, 0x01, 0x0B, 0x0A, 0x11, 0x0A, 0x51, 0x4B, 0x01, 0x06, 0x04, 0x04, +/* 0000C830 */ 0x04, 0x04, 0x10, 0x06, 0xFE, 0x6C, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x06, 0xFE, 0x6E, 0x03, 0x08, +/* 0000C840 */ 0x01, 0xFF, 0x05, 0xFE, 0x6F, 0x03, 0x05, 0xFE, 0x70, 0x03, 0x05, 0xFE, 0x71, 0x03, 0xFE, 0x10, +/* 0000C850 */ 0x01, 0x4F, 0x0F, 0x97, 0x11, 0x0A, 0x0B, 0x47, 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0F, +/* 0000C860 */ 0x11, 0x09, 0xF3, 0x00, 0x0C, 0x03, 0x00, 0x0C, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x01, 0x31, 0x12, +/* 0000C870 */ 0x6C, 0x11, 0x12, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x11, +/* 0000C880 */ 0x11, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x18, 0x00, 0x8E, 0x01, 0x31, 0x12, +/* 0000C890 */ 0x6C, 0x11, 0x12, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x11, +/* 0000C8A0 */ 0x11, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x04, 0x09, 0x18, 0x00, 0x8E, 0x01, 0x31, 0x12, +/* 0000C8B0 */ 0x6C, 0x11, 0x12, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x11, +/* 0000C8C0 */ 0x11, 0x47, 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0D, 0x11, 0x09, 0x83, 0x00, 0x8E, 0x01, +/* 0000C8D0 */ 0x0C, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x01, 0x1D, 0x12, 0x5C, 0x01, 0x12, 0x5C, +/* 0000C8E0 */ 0x02, 0x0D, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0x11, 0x11, 0x0C, 0x03, 0x00, 0x11, 0x06, 0x09, 0x60, +/* 0000C8F0 */ 0x00, 0x8E, 0x01, 0x09, 0x12, 0x6C, 0x11, 0x12, 0x03, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x12, 0x8E, +/* 0000C900 */ 0x01, 0x11, 0x13, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x13, 0x13, +/* 0000C910 */ 0x5C, 0x01, 0x13, 0x8E, 0x01, 0x11, 0x13, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0B, +/* 0000C920 */ 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x02, 0x13, 0x8E, 0x01, 0x0C, 0x13, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 0000C930 */ 0x05, 0x8E, 0x01, 0x1F, 0x14, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, 0x1F, 0x04, +/* 0000C940 */ 0x13, 0x13, 0x2F, 0x13, 0x07, 0x13, 0x2F, 0x13, 0x13, 0x09, 0x5C, 0x03, 0x13, 0x1F, 0x04, 0xFF, +/* 0000C950 */ 0x11, 0x47, 0x00, 0x0F, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000C960 */ 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x5F, 0x02, 0xFE, 0x8F, 0x3A, +/* 0000C970 */ 0x0D, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x28, 0x00, 0x0A, 0x00, 0x27, 0x00, 0x08, 0x00, 0x29, +/* 0000C980 */ 0x00, 0x18, 0x00, 0x45, 0x00, 0x08, 0x00, 0x28, 0x00, 0x18, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x28, +/* 0000C990 */ 0x00, 0x18, 0x00, 0x3D, 0x00, 0x2D, 0x00, 0x6B, 0x00, 0x60, 0x00, 0xA6, 0x00, 0x06, 0x00, 0x21, +/* 0000C9A0 */ 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x3F, 0x5C, 0x80, 0xE0, 0x09, 0xC4, 0x12, 0xFE, 0x4D, 0x01, +/* 0000C9B0 */ 0x14, 0xA0, 0x41, 0xD1, 0x00, 0x12, 0xFE, 0x36, 0x35, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, +/* 0000C9C0 */ 0x01, 0xFE, 0x36, 0x35, 0xFE, 0xE0, 0x04, 0xFE, 0xE0, 0x04, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, +/* 0000C9D0 */ 0x01, 0x01, 0x06, 0x06, 0x06, 0x06, 0x01, 0x0A, 0x06, 0xFE, 0x66, 0x03, 0x06, 0xFE, 0x67, 0x03, +/* 0000C9E0 */ 0x06, 0xFE, 0x68, 0x03, 0x06, 0xFE, 0x69, 0x03, 0x06, 0xFE, 0x6A, 0x03, 0x06, 0xFE, 0x6B, 0x03, +/* 0000C9F0 */ 0x07, 0x08, 0x70, 0x8E, 0x01, 0x0A, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, +/* 0000CA00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x0D, 0x7A, 0x0D, 0x0C, +/* 0000CA10 */ 0x00, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x01, 0x0D, 0x7A, 0x0D, 0x0C, 0x01, 0x01, 0x65, 0x01, +/* 0000CA20 */ 0x0D, 0x0C, 0xD4, 0x02, 0x0D, 0x7A, 0x0D, 0x0C, 0x02, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x03, +/* 0000CA30 */ 0x0D, 0x7A, 0x0D, 0x0C, 0x03, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x04, 0x0D, 0x7A, 0x0D, 0x0C, +/* 0000CA40 */ 0x04, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x05, 0x0D, 0x7A, 0x0D, 0x0C, 0x05, 0x01, 0x65, 0x01, +/* 0000CA50 */ 0x0D, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, +/* 0000CA60 */ 0x00, 0x24, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, +/* 0000CA70 */ 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x00, 0x00, 0x5E, 0x02, 0x00, 0x00, 0x5C, 0x02, +/* 0000CA80 */ 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x6B, 0x03, 0x00, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x5D, 0x02, +/* 0000CA90 */ 0xFE, 0x5E, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x61, 0x02, 0xFE, 0x6B, 0x03, 0xFE, 0x4C, 0x35, 0x02, +/* 0000CAA0 */ 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0xC9, 0x04, 0x00, 0x74, 0xCD, 0x00, 0x00, 0x0C, 0xCD, 0x00, +/* 0000CAB0 */ 0x00, 0xA4, 0xCC, 0x00, 0x00, 0x3C, 0xCC, 0x00, 0x00, 0x5D, 0xCB, 0x00, 0x00, 0xC1, 0xCA, 0x00, +/* 0000CAC0 */ 0x00, 0xBF, 0x7C, 0x80, 0x01, 0x00, 0xC4, 0x04, 0xFE, 0x6B, 0x01, 0x19, 0xA2, 0x41, 0xC1, 0x00, +/* 0000CAD0 */ 0xFE, 0x6B, 0x03, 0x18, 0xFE, 0xCA, 0x38, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xCA, +/* 0000CAE0 */ 0x38, 0xFE, 0x35, 0x01, 0xFE, 0x35, 0x01, 0x01, 0x05, 0x04, 0x07, 0x05, 0x19, 0x17, 0x16, 0x01, +/* 0000CAF0 */ 0x03, 0x01, 0x06, 0x00, 0x48, 0x08, 0x0B, 0x4C, 0xEA, 0x00, 0x0F, 0x03, 0x00, 0x04, 0x09, 0x3F, +/* 0000CB00 */ 0x00, 0x8E, 0x01, 0x0C, 0x07, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, 0x19, 0x08, 0x5C, +/* 0000CB10 */ 0x01, 0x08, 0x5C, 0x02, 0x04, 0x5C, 0x03, 0x05, 0x1F, 0x04, 0x07, 0x07, 0x0F, 0x03, 0x00, 0x07, +/* 0000CB20 */ 0x09, 0x06, 0x00, 0x47, 0x00, 0x03, 0x09, 0x19, 0x00, 0x8E, 0x01, 0x16, 0x07, 0x07, 0x02, 0x00, +/* 0000CB30 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x07, 0x07, 0x47, 0x04, 0x07, 0x09, 0xB8, 0xFF, +/* 0000CB40 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x1F, 0x39, 0x05, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x19, 0x00, +/* 0000CB50 */ 0x22, 0x00, 0x54, 0x00, 0x06, 0x00, 0x37, 0x00, 0x19, 0x00, 0x3B, 0x00, 0x00, 0xBF, 0x5C, 0x80, +/* 0000CB60 */ 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x62, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x6A, 0x03, 0x17, +/* 0000CB70 */ 0xFE, 0xB3, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xB3, 0x37, 0xFB, 0xFB, 0x01, +/* 0000CB80 */ 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0x09, 0x08, 0x01, 0x00, +/* 0000CB90 */ 0x01, 0x02, 0x01, 0x20, 0x88, 0x8E, 0x01, 0x10, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, +/* 0000CBA0 */ 0x01, 0x06, 0x1F, 0x02, 0x0A, 0x0A, 0x47, 0x07, 0x0A, 0x47, 0x08, 0x03, 0x8E, 0x01, 0x27, 0x0A, +/* 0000CBB0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0A, 0x0A, 0x0F, 0x52, 0x00, +/* 0000CBC0 */ 0x0A, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x26, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, +/* 0000CBD0 */ 0x07, 0x1F, 0x02, 0x0A, 0x0A, 0x0F, 0x03, 0x00, 0x0A, 0x09, 0x37, 0x00, 0x8E, 0x01, 0x15, 0x0B, +/* 0000CBE0 */ 0x6C, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x47, 0x0C, 0x07, 0x8E, 0x01, 0x15, +/* 0000CBF0 */ 0x0E, 0x6C, 0x0D, 0x0E, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x04, 0x5C, 0x02, +/* 0000CC00 */ 0x05, 0x1F, 0x03, 0x0D, 0x0D, 0x33, 0x0C, 0x0C, 0x0D, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0A, 0x0A, +/* 0000CC10 */ 0x47, 0x08, 0x0A, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x17, 0x25, 0xFE, +/* 0000CC20 */ 0xD2, 0x37, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x29, 0x00, 0x03, 0x00, 0x19, 0x00, 0x30, +/* 0000CC30 */ 0x00, 0x38, 0x00, 0x37, 0x00, 0x49, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, +/* 0000CC40 */ 0x00, 0xC4, 0x00, 0xFE, 0x5E, 0x01, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x69, 0x03, 0x16, 0xFE, +/* 0000CC50 */ 0x3D, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x3D, 0x37, 0x5D, 0x5D, 0x01, 0x03, +/* 0000CC60 */ 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x04, 0x08, 0x2D, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, +/* 0000CC70 */ 0x05, 0x09, 0x17, 0x00, 0x8E, 0x01, 0x0D, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, +/* 0000CC80 */ 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, +/* 0000CC90 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5C, 0x37, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2B, +/* 0000CCA0 */ 0x00, 0x3D, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x5A, 0x01, 0x16, 0xA2, +/* 0000CCB0 */ 0x41, 0xC1, 0x00, 0xFE, 0x68, 0x03, 0x15, 0xFE, 0xC6, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, +/* 0000CCC0 */ 0x02, 0xFE, 0xC6, 0x36, 0x56, 0x56, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x04, +/* 0000CCD0 */ 0x08, 0x2D, 0xA8, 0x05, 0x14, 0x03, 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, 0x47, 0x00, +/* 0000CCE0 */ 0x05, 0x09, 0x14, 0x00, 0x8E, 0x01, 0x10, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, +/* 0000CCF0 */ 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 0000CD00 */ 0xE5, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x36, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, +/* 0000CD10 */ 0x00, 0xC4, 0x00, 0xFE, 0x56, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x67, 0x03, 0x14, 0xFE, +/* 0000CD20 */ 0x51, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x51, 0x36, 0x5C, 0x5C, 0x01, 0x03, +/* 0000CD30 */ 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x04, 0x08, 0x2D, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, +/* 0000CD40 */ 0x05, 0x09, 0x17, 0x00, 0x8E, 0x01, 0x11, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, +/* 0000CD50 */ 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, +/* 0000CD60 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x70, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2B, +/* 0000CD70 */ 0x00, 0x3C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x4F, 0x01, 0x16, 0xA2, +/* 0000CD80 */ 0x41, 0xC1, 0x00, 0xFE, 0x66, 0x03, 0x13, 0xFE, 0x78, 0x35, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, +/* 0000CD90 */ 0x02, 0xFE, 0x78, 0x35, 0xC0, 0xC0, 0x01, 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x01, +/* 0000CDA0 */ 0x01, 0x01, 0x01, 0x05, 0x07, 0x08, 0x47, 0x14, 0x03, 0x00, 0x04, 0x02, 0x09, 0x12, 0x00, 0x8E, +/* 0000CDB0 */ 0x01, 0x09, 0x07, 0x6C, 0x06, 0x07, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x07, 0x1F, 0x01, 0xFF, +/* 0000CDC0 */ 0x06, 0xA8, 0x06, 0x15, 0x03, 0x00, 0x04, 0x06, 0x09, 0x17, 0x00, 0x8E, 0x01, 0x0E, 0x06, 0x07, +/* 0000CDD0 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x06, 0x06, 0x47, 0x00, 0x06, 0x09, +/* 0000CDE0 */ 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x57, +/* 0000CDF0 */ 0x02, 0xFE, 0x97, 0x35, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x26, 0x00, 0x12, 0x00, 0x3E, +/* 0000CE00 */ 0x00, 0x2B, 0x00, 0x3C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x31, 0xD4, 0x00, 0xFE, 0x32, 0x01, +/* 0000CE10 */ 0x20, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0x3C, 0x03, 0x11, 0xFE, 0xAF, 0x31, 0xFF, 0x00, 0x10, 0x01, +/* 0000CE20 */ 0x00, 0x01, 0x01, 0xFE, 0xAF, 0x31, 0xFE, 0x70, 0x03, 0xFE, 0x70, 0x03, 0x01, 0x07, 0x05, 0x08, +/* 0000CE30 */ 0x06, 0x41, 0x41, 0x01, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x08, 0x08, 0x01, 0x00, +/* 0000CE40 */ 0x01, 0x01, 0xD5, 0x4F, 0x05, 0x4F, 0x06, 0x8E, 0x01, 0x40, 0x09, 0x4B, 0x09, 0x0F, 0x03, 0x00, +/* 0000CE50 */ 0x09, 0x09, 0x09, 0x00, 0x8E, 0x01, 0x40, 0x00, 0x4B, 0x00, 0x09, 0xB9, 0x00, 0x8E, 0x01, 0x39, +/* 0000CE60 */ 0x09, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x6C, 0x00, 0x8E, 0x01, 0x42, 0x09, 0x4B, 0x09, +/* 0000CE70 */ 0x0F, 0x11, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x05, 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 0000CE80 */ 0x02, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x3D, 0x09, 0x4B, 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 0000CE90 */ 0x02, 0x1F, 0x01, 0x09, 0x09, 0x54, 0x05, 0x09, 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x00, +/* 0000CEA0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x42, 0x0B, 0x4B, 0x0B, 0x5C, +/* 0000CEB0 */ 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x54, 0x06, 0x09, 0x0F, 0x03, 0x00, 0x06, 0x09, 0x0D, 0x00, +/* 0000CEC0 */ 0x97, 0x09, 0x06, 0x03, 0x01, 0x32, 0x01, 0x01, 0x40, 0x09, 0x09, 0x06, 0x00, 0x01, 0x32, 0x01, +/* 0000CED0 */ 0x01, 0x40, 0x05, 0x09, 0x35, 0x00, 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, +/* 0000CEE0 */ 0x00, 0x5C, 0x00, 0x0A, 0x8E, 0x01, 0x3D, 0x0B, 0x4B, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, +/* 0000CEF0 */ 0x1F, 0x01, 0x0B, 0x0B, 0x5C, 0x01, 0x0B, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, +/* 0000CF00 */ 0x09, 0x97, 0x09, 0x09, 0x04, 0x01, 0x32, 0x01, 0x01, 0x40, 0x09, 0x8E, 0x01, 0x40, 0x00, 0x4B, +/* 0000CF10 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0x09, 0xFE, 0x65, 0x03, 0x00, +/* 0000CF20 */ 0xFE, 0xC5, 0x31, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x2B, 0x00, 0x09, 0x00, 0x33, 0x00, +/* 0000CF30 */ 0x0D, 0x00, 0x26, 0x00, 0x0D, 0x00, 0x29, 0x00, 0x0E, 0x00, 0x33, 0x00, 0x13, 0x00, 0x2C, 0x00, +/* 0000CF40 */ 0x21, 0x00, 0x4D, 0x00, 0x07, 0x00, 0x5B, 0x00, 0x0D, 0x00, 0x49, 0x00, 0x09, 0x00, 0xCB, 0x00, +/* 0000CF50 */ 0x35, 0x00, 0x6D, 0x00, 0x0B, 0x00, 0x24, 0x00, 0x00, 0xBF, 0x7C, 0x80, 0xE1, 0x01, 0xC4, 0x04, +/* 0000CF60 */ 0xFE, 0x20, 0x01, 0x19, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3B, 0x03, 0x10, 0xFE, 0x8C, 0x2E, 0xFF, +/* 0000CF70 */ 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x8C, 0x2E, 0xFE, 0x91, 0x02, 0xFE, 0x91, 0x02, 0x01, +/* 0000CF80 */ 0x0C, 0x06, 0x10, 0x06, 0x3E, 0x33, 0x15, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x5A, +/* 0000CF90 */ 0x9F, 0x05, 0xFE, 0x64, 0x03, 0x08, 0x01, 0x00, 0x01, 0x01, 0xC2, 0xA8, 0x0D, 0xA8, 0x0E, 0x14, +/* 0000CFA0 */ 0x03, 0x00, 0x07, 0x02, 0x09, 0x0A, 0x00, 0x8E, 0x01, 0x2C, 0x11, 0x47, 0x10, 0x11, 0x09, 0x07, +/* 0000CFB0 */ 0x00, 0x8E, 0x01, 0x2B, 0x11, 0x47, 0x10, 0x11, 0x47, 0x0A, 0x10, 0x8E, 0x01, 0x0B, 0x10, 0x07, +/* 0000CFC0 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x10, 0x10, 0x47, 0x0B, 0x10, 0x07, +/* 0000CFD0 */ 0x01, 0x00, 0x5C, 0x00, 0x03, 0x1F, 0x01, 0x10, 0x09, 0x47, 0x0C, 0x10, 0xA8, 0x10, 0x15, 0x03, +/* 0000CFE0 */ 0x00, 0x0B, 0x10, 0x09, 0x06, 0x00, 0x47, 0x10, 0x0B, 0x09, 0x03, 0x00, 0x47, 0x10, 0x04, 0x47, +/* 0000CFF0 */ 0x0B, 0x10, 0x47, 0x0D, 0x04, 0xEA, 0x00, 0x12, 0x03, 0x00, 0x0D, 0x0B, 0x09, 0x3B, 0x00, 0x8E, +/* 0000D000 */ 0x01, 0x2E, 0x10, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x97, 0x11, 0x06, 0x0D, 0x5C, 0x01, 0x11, +/* 0000D010 */ 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x08, 0x5C, 0x04, 0x0C, 0x1F, 0x05, 0x10, 0x10, 0x47, 0x0E, 0x10, +/* 0000D020 */ 0x61, 0x10, 0x0E, 0x00, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x10, 0x11, 0x09, 0x06, 0x00, 0x47, 0x00, +/* 0000D030 */ 0x0E, 0x09, 0x27, 0x00, 0x28, 0x0D, 0x0D, 0x09, 0xBB, 0xFF, 0x8E, 0x01, 0x2E, 0x10, 0x07, 0x05, +/* 0000D040 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0A, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x5C, +/* 0000D050 */ 0x04, 0x0C, 0x1F, 0x05, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x21, 0x02, +/* 0000D060 */ 0xFE, 0xDB, 0x2E, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x58, 0x00, 0x14, 0x00, 0x34, 0x00, +/* 0000D070 */ 0x0D, 0x00, 0x32, 0x00, 0x16, 0x00, 0x39, 0x00, 0x05, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x1F, 0x00, +/* 0000D080 */ 0x21, 0x00, 0x69, 0x00, 0x0E, 0x00, 0x35, 0x00, 0x06, 0x00, 0x4F, 0xFF, 0x06, 0x00, 0xE2, 0x00, +/* 0000D090 */ 0x21, 0x00, 0x51, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0xB9, 0xD6, 0x12, 0xE8, 0x1E, 0xA2, 0x41, +/* 0000D0A0 */ 0xC1, 0x00, 0xFE, 0x3A, 0x03, 0x0D, 0xFE, 0xE0, 0x24, 0x02, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, +/* 0000D0B0 */ 0x05, 0xFE, 0xE0, 0x24, 0xFE, 0x91, 0x09, 0xFE, 0x91, 0x09, 0x03, 0x0E, 0x0B, 0x15, 0x05, 0x71, +/* 0000D0C0 */ 0x6A, 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, 0x13, 0x14, 0x15, 0x07, 0x08, +/* 0000D0D0 */ 0x01, 0x01, 0x01, 0x00, 0x06, 0xFE, 0x5A, 0x03, 0x05, 0xFE, 0x5C, 0x03, 0x06, 0xFE, 0x5D, 0x03, +/* 0000D0E0 */ 0x06, 0xFE, 0x5E, 0x03, 0x06, 0xFE, 0x5F, 0x03, 0xFE, 0x7C, 0x01, 0x96, 0x03, 0x0B, 0x96, 0x04, +/* 0000D0F0 */ 0x0D, 0x4F, 0x11, 0x8E, 0x01, 0x09, 0x17, 0x6C, 0x16, 0x17, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000D100 */ 0x17, 0x92, 0x03, 0x18, 0x5C, 0x01, 0x18, 0x1F, 0x02, 0x16, 0x16, 0x47, 0x0F, 0x16, 0x14, 0x03, +/* 0000D110 */ 0x00, 0x0F, 0x02, 0x09, 0x17, 0x00, 0x8E, 0x01, 0x2D, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, +/* 0000D120 */ 0x92, 0x03, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0x16, 0x16, 0x47, 0x0F, 0x16, 0x0F, 0x03, 0x00, +/* 0000D130 */ 0x0F, 0x09, 0x1E, 0x00, 0x8E, 0x01, 0x0C, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, +/* 0000D140 */ 0x1C, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x00, 0x17, 0x5C, 0x03, 0x17, 0x1F, 0x04, +/* 0000D150 */ 0xFF, 0x16, 0x8E, 0x01, 0x09, 0x17, 0x6C, 0x16, 0x17, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, +/* 0000D160 */ 0x92, 0x03, 0x18, 0x5C, 0x01, 0x18, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x16, 0x16, +/* 0000D170 */ 0x97, 0x16, 0x16, 0x04, 0x96, 0x03, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x92, 0x03, 0x16, +/* 0000D180 */ 0x5C, 0x01, 0x16, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x16, 0x0C, 0x47, 0x10, 0x16, 0x92, 0x04, 0x16, +/* 0000D190 */ 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2A, 0x00, 0xCD, 0x16, 0x00, 0x96, 0x02, 0x16, +/* 0000D1A0 */ 0x8E, 0x01, 0x0C, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x1C, 0x17, 0x5C, 0x01, +/* 0000D1B0 */ 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x01, 0x17, 0x5C, 0x03, 0x17, 0x1F, 0x04, 0xFF, 0x16, 0x92, 0x02, +/* 0000D1C0 */ 0x16, 0x47, 0x0F, 0x16, 0x54, 0x11, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x60, 0x00, 0x0F, 0x03, +/* 0000D1D0 */ 0x00, 0x0F, 0x09, 0x31, 0x00, 0x8E, 0x01, 0x0B, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 0000D1E0 */ 0x01, 0x0F, 0x1F, 0x02, 0x16, 0x16, 0x11, 0x03, 0x00, 0x16, 0x05, 0x09, 0x18, 0x00, 0x8E, 0x01, +/* 0000D1F0 */ 0x39, 0x16, 0x4B, 0x16, 0x0F, 0x03, 0x00, 0x16, 0x09, 0x07, 0x00, 0x2F, 0x10, 0x10, 0x06, 0x09, +/* 0000D200 */ 0x04, 0x00, 0x2F, 0x10, 0x10, 0x07, 0x47, 0x16, 0x10, 0x8E, 0x01, 0x0C, 0x17, 0x07, 0x04, 0x00, +/* 0000D210 */ 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x1F, 0x18, 0x5C, 0x01, 0x18, 0x5C, 0x02, 0x0F, 0x5C, 0x03, 0x06, +/* 0000D220 */ 0x1F, 0x04, 0x17, 0x17, 0x2F, 0x16, 0x16, 0x17, 0x47, 0x10, 0x16, 0x09, 0x05, 0x00, 0xA8, 0x16, +/* 0000D230 */ 0x47, 0x10, 0x16, 0x8E, 0x01, 0x0A, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCC, 0x00, 0x00, +/* 0000D240 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x7A, 0x10, 0x17, 0x02, 0x7A, 0x0F, +/* 0000D250 */ 0x17, 0x03, 0x7A, 0x11, 0x17, 0x04, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x00, 0x16, +/* 0000D260 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0000D270 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x3B, 0x02, 0x00, 0x00, 0x6F, 0x02, +/* 0000D280 */ 0x00, 0x00, 0xFE, 0x2E, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x3B, 0x02, 0xFE, 0x6F, +/* 0000D290 */ 0x02, 0xFE, 0x60, 0x03, 0xFE, 0x21, 0x02, 0xFE, 0x61, 0x03, 0x0D, 0xFE, 0x62, 0x03, 0x00, 0xFE, +/* 0000D2A0 */ 0x24, 0x25, 0x15, 0x08, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x36, 0x00, 0x08, 0x00, 0x81, 0x00, 0x17, +/* 0000D2B0 */ 0x00, 0x3A, 0x00, 0x07, 0x00, 0x1B, 0x00, 0x1E, 0x00, 0x53, 0x02, 0x25, 0x00, 0x49, 0x00, 0x16, +/* 0000D2C0 */ 0x00, 0x37, 0x00, 0x0D, 0x00, 0x50, 0x00, 0x06, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0xB8, 0x01, 0x06, +/* 0000D2D0 */ 0x00, 0xF9, 0x00, 0x03, 0x00, 0x29, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x0D, +/* 0000D2E0 */ 0x00, 0x2E, 0x00, 0x07, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x40, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x05, +/* 0000D2F0 */ 0x00, 0x29, 0x00, 0x32, 0x00, 0x99, 0x00, 0x00, 0xC6, 0xD3, 0x00, 0x00, 0x00, 0xD3, 0x00, 0x00, +/* 0000D300 */ 0xBF, 0x5C, 0x80, 0xE0, 0x11, 0xC4, 0x00, 0xFD, 0x3D, 0xA2, 0x41, 0xD1, 0x00, 0x0F, 0xFE, 0xA3, +/* 0000D310 */ 0x29, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA3, 0x29, 0xFE, 0x77, 0x01, 0xFE, 0x77, +/* 0000D320 */ 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, 0x02, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, +/* 0000D330 */ 0x01, 0x01, 0x08, 0x01, 0xFF, 0x6F, 0x8E, 0x02, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, +/* 0000D340 */ 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, +/* 0000D350 */ 0x09, 0x47, 0x06, 0x09, 0x97, 0x09, 0x06, 0x02, 0x47, 0x07, 0x09, 0x8E, 0x02, 0x0C, 0x09, 0x07, +/* 0000D360 */ 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, 0x1D, 0x0A, 0x5C, 0x01, 0x0A, 0x8E, 0x01, 0x04, 0x0A, +/* 0000D370 */ 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x07, 0x1F, 0x04, 0x09, 0x09, 0x15, 0x03, 0x00, 0x09, 0x04, 0x09, +/* 0000D380 */ 0x1F, 0x00, 0x8E, 0x02, 0x0C, 0x09, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, 0x1E, 0x0A, +/* 0000D390 */ 0x5C, 0x01, 0x0A, 0x8E, 0x01, 0x02, 0x0A, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x05, 0x1F, 0x04, 0xFF, +/* 0000D3A0 */ 0x09, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0x0E, 0xFE, 0x63, 0x03, 0x00, 0xFE, 0xC7, 0x29, +/* 0000D3B0 */ 0x05, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x7A, 0x00, 0x07, 0x00, 0x24, 0x00, 0x27, 0x00, 0x5F, +/* 0000D3C0 */ 0x00, 0x21, 0x00, 0x55, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xF0, 0x3C, 0xA2, +/* 0000D3D0 */ 0x41, 0xD1, 0x00, 0x0E, 0xFE, 0x60, 0x26, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x60, +/* 0000D3E0 */ 0x26, 0x7D, 0x7D, 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x03, 0x06, 0x06, 0xFE, 0x5A, +/* 0000D3F0 */ 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x08, 0x2E, 0x8E, 0x02, 0x0C, 0x07, 0x07, 0x05, 0x00, 0x5C, 0x00, +/* 0000D400 */ 0x04, 0x8E, 0x02, 0x23, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x03, 0x08, 0x5C, 0x02, 0x08, 0x2F, +/* 0000D410 */ 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, 0x5C, 0x04, 0x03, 0x1F, 0x05, 0x07, 0x07, 0x94, 0x01, 0x03, +/* 0000D420 */ 0x07, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x84, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x58, +/* 0000D430 */ 0x00, 0x00, 0x3F, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x02, 0xCF, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, +/* 0000D440 */ 0x39, 0x03, 0x0B, 0xFE, 0xAF, 0x20, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xAF, +/* 0000D450 */ 0x20, 0xFE, 0x11, 0x04, 0xFE, 0x11, 0x04, 0x07, 0x05, 0x09, 0x04, 0x2A, 0x29, 0x01, 0x03, 0x03, +/* 0000D460 */ 0x03, 0x03, 0x03, 0x08, 0x08, 0x01, 0x00, 0x06, 0xFE, 0x5A, 0x03, 0x82, 0x4F, 0x06, 0x4F, 0x07, +/* 0000D470 */ 0x8E, 0x01, 0x43, 0x09, 0x4B, 0x09, 0x0F, 0x11, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x05, +/* 0000D480 */ 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x09, 0x0A, 0x6C, +/* 0000D490 */ 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x43, 0x0B, +/* 0000D4A0 */ 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x54, 0x06, 0x09, 0x0F, 0x08, 0x00, 0x06, +/* 0000D4B0 */ 0x09, 0x00, 0x00, 0xA8, 0x00, 0x09, 0x34, 0x00, 0x97, 0x0B, 0x06, 0x03, 0x6C, 0x0A, 0x0B, 0x01, +/* 0000D4C0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x0A, 0x0A, 0x6C, 0x09, 0x0A, +/* 0000D4D0 */ 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0xD4, 0x00, 0x0B, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x09, +/* 0000D4E0 */ 0x09, 0x54, 0x07, 0x09, 0x47, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, +/* 0000D4F0 */ 0x02, 0xFE, 0x78, 0x01, 0xB1, 0xFE, 0xCB, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x24, +/* 0000D500 */ 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x21, 0x00, 0x4B, 0x00, 0x07, 0x00, 0x1A, 0x00, 0x05, 0x00, 0x5C, +/* 0000D510 */ 0x02, 0x2C, 0x00, 0xCD, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0x1E, 0xD5, 0x00, 0x00, 0xBF, 0x4C, +/* 0000D520 */ 0x00, 0x00, 0x00, 0xC0, 0x01, 0xE2, 0x36, 0xA2, 0x41, 0xD0, 0x00, 0x0C, 0xFE, 0x01, 0x10, 0xFE, +/* 0000D530 */ 0x09, 0x24, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x09, 0x24, 0x0A, 0x0A, 0x01, 0x02, +/* 0000D540 */ 0x02, 0x03, 0x0A, 0x0A, 0x01, 0x17, 0xAC, 0x03, 0x0F, 0x02, 0x00, 0x02, 0xAB, 0x03, 0xAC, 0x00, +/* 0000D550 */ 0x0F, 0x02, 0x00, 0x03, 0xAB, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x10, 0x24, +/* 0000D560 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x21, 0xD4, +/* 0000D570 */ 0x00, 0xB8, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x5B, 0x03, 0x0A, 0xFE, 0x1C, 0x1C, 0xFF, 0x00, +/* 0000D580 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x1C, 0x1C, 0xFE, 0x73, 0x04, 0xFE, 0x73, 0x04, 0x01, 0x09, +/* 0000D590 */ 0x09, 0x0D, 0x04, 0x58, 0x4C, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0x0C, 0x0D, 0x07, 0x08, +/* 0000D5A0 */ 0x01, 0x01, 0x01, 0x02, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x03, 0xFE, 0x22, +/* 0000D5B0 */ 0x01, 0x4F, 0x0A, 0x4F, 0x0B, 0x8E, 0x01, 0x09, 0x0F, 0x61, 0x0F, 0x0F, 0x00, 0x6C, 0x0E, 0x0F, +/* 0000D5C0 */ 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x0A, +/* 0000D5D0 */ 0x0E, 0xA8, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0xDB, 0x00, 0x8E, 0x01, 0x09, 0x0F, 0x6C, +/* 0000D5E0 */ 0x0E, 0x0F, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, +/* 0000D5F0 */ 0x47, 0x0A, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x83, 0x00, 0x8E, 0x01, 0x42, 0x0E, 0x4B, +/* 0000D600 */ 0x0E, 0x0F, 0x11, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x05, 0x0E, 0x07, 0x01, 0x00, 0x5C, +/* 0000D610 */ 0x00, 0x03, 0x1F, 0x01, 0xFF, 0x0E, 0x8E, 0x01, 0x09, 0x0F, 0x6C, 0x0E, 0x0F, 0x03, 0x07, 0x03, +/* 0000D620 */ 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x42, 0x10, 0x4B, 0x10, 0x5C, 0x02, 0x10, +/* 0000D630 */ 0x1F, 0x03, 0x0E, 0x0E, 0x47, 0x0B, 0x0E, 0x97, 0x0E, 0x0B, 0x04, 0x97, 0x0F, 0x0B, 0x05, 0x0F, +/* 0000D640 */ 0x03, 0x00, 0x0F, 0x09, 0x0E, 0x00, 0x97, 0x10, 0x0B, 0x05, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, +/* 0000D650 */ 0x10, 0x09, 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x97, 0x0F, 0x0B, 0x08, 0x0F, +/* 0000D660 */ 0x03, 0x00, 0x0F, 0x09, 0x0E, 0x00, 0x97, 0x10, 0x0B, 0x08, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, +/* 0000D670 */ 0x10, 0x09, 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x47, 0x0A, 0x0E, 0x8E, 0x01, +/* 0000D680 */ 0x09, 0x0F, 0x61, 0x0F, 0x0F, 0x00, 0x6C, 0x0E, 0x0F, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, +/* 0000D690 */ 0x5C, 0x01, 0x09, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0A, 0x10, 0x09, 0x0C, 0x00, 0x8E, 0x01, 0x3A, +/* 0000D6A0 */ 0x11, 0x4B, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x0A, 0x5C, 0x02, 0x10, 0x1F, +/* 0000D6B0 */ 0x03, 0xFF, 0x0E, 0x09, 0x13, 0x00, 0x8E, 0x01, 0x3A, 0x0E, 0x4B, 0x0E, 0x14, 0x03, 0x00, 0x0A, +/* 0000D6C0 */ 0x0E, 0x09, 0x05, 0x00, 0xA8, 0x0E, 0x47, 0x0A, 0x0E, 0x47, 0x00, 0x0A, 0x09, 0x02, 0x00, 0xA8, +/* 0000D6D0 */ 0x00, 0x24, 0x00, 0xFE, 0x18, 0x03, 0xFE, 0xB7, 0x01, 0xFE, 0x2B, 0x02, 0xFE, 0x39, 0x02, 0xFE, +/* 0000D6E0 */ 0xBA, 0x01, 0xFE, 0x46, 0x1C, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x53, 0x00, 0x0A, 0x00, +/* 0000D6F0 */ 0x30, 0x00, 0x18, 0x00, 0x51, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x0D, 0x00, 0x2D, 0x00, 0x0E, 0x00, +/* 0000D700 */ 0x3A, 0x00, 0x21, 0x00, 0xB1, 0x00, 0x47, 0x00, 0x34, 0x01, 0x38, 0x00, 0x80, 0x00, 0x0E, 0x00, +/* 0000D710 */ 0x30, 0x00, 0x05, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x1B, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x21, +/* 0000D720 */ 0xD4, 0x00, 0x9D, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x59, 0x03, 0x09, 0xFE, 0x76, 0x17, 0xFF, +/* 0000D730 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x76, 0x17, 0xFE, 0x86, 0x04, 0xFE, 0x86, 0x04, 0x01, +/* 0000D740 */ 0x0A, 0x09, 0x0E, 0x04, 0x61, 0x54, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0x0D, 0x0E, 0x07, +/* 0000D750 */ 0x08, 0x01, 0x01, 0x01, 0x02, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x03, 0xFE, +/* 0000D760 */ 0x41, 0x01, 0x4F, 0x0C, 0x8E, 0x01, 0x09, 0x10, 0x61, 0x10, 0x10, 0x00, 0x6C, 0x0F, 0x10, 0x01, +/* 0000D770 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0B, 0x0F, +/* 0000D780 */ 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0xDB, 0x00, 0x8E, 0x01, 0x09, 0x10, 0x6C, 0x0F, +/* 0000D790 */ 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0F, 0x0F, 0x47, +/* 0000D7A0 */ 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x83, 0x00, 0x8E, 0x01, 0x42, 0x0F, 0x4B, 0x0F, +/* 0000D7B0 */ 0x0F, 0x11, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x05, 0x0F, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 0000D7C0 */ 0x03, 0x1F, 0x01, 0xFF, 0x0F, 0x8E, 0x01, 0x09, 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, 0x03, 0x00, +/* 0000D7D0 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x42, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x1F, +/* 0000D7E0 */ 0x03, 0x0F, 0x0F, 0x47, 0x0C, 0x0F, 0x97, 0x0F, 0x0C, 0x04, 0x97, 0x10, 0x0C, 0x05, 0x0F, 0x03, +/* 0000D7F0 */ 0x00, 0x10, 0x09, 0x0E, 0x00, 0x97, 0x11, 0x0C, 0x05, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, +/* 0000D800 */ 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x97, 0x10, 0x0C, 0x08, 0x0F, 0x03, +/* 0000D810 */ 0x00, 0x10, 0x09, 0x0E, 0x00, 0x97, 0x11, 0x0C, 0x08, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, +/* 0000D820 */ 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x47, 0x0B, 0x0F, 0x8E, 0x01, 0x09, +/* 0000D830 */ 0x10, 0x61, 0x10, 0x10, 0x00, 0x6C, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, +/* 0000D840 */ 0x01, 0x09, 0xA8, 0x11, 0x14, 0x03, 0x00, 0x0B, 0x11, 0x09, 0x0C, 0x00, 0x8E, 0x01, 0x3A, 0x12, +/* 0000D850 */ 0x4B, 0x12, 0x47, 0x11, 0x12, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0B, 0x5C, 0x02, 0x11, 0x1F, 0x03, +/* 0000D860 */ 0xFF, 0x0F, 0x09, 0x13, 0x00, 0x8E, 0x01, 0x3A, 0x0F, 0x4B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, +/* 0000D870 */ 0x09, 0x05, 0x00, 0xA8, 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0A, 0x09, 0x09, 0x09, 0x00, +/* 0000D880 */ 0x47, 0x00, 0x0B, 0x09, 0x1B, 0x00, 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x0B, 0x09, 0x08, +/* 0000D890 */ 0x00, 0xA8, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, +/* 0000D8A0 */ 0x00, 0x24, 0x00, 0xFE, 0x19, 0x03, 0xFE, 0xB7, 0x01, 0xFE, 0x2C, 0x02, 0xFE, 0x39, 0x02, 0xFE, +/* 0000D8B0 */ 0xBA, 0x01, 0xFE, 0xA1, 0x17, 0x11, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x46, 0x00, 0x0A, 0x00, +/* 0000D8C0 */ 0x30, 0x00, 0x18, 0x00, 0x44, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x0D, 0x00, 0x2D, 0x00, 0x0E, 0x00, +/* 0000D8D0 */ 0x3A, 0x00, 0x21, 0x00, 0x52, 0x00, 0x47, 0x00, 0x0C, 0x01, 0x38, 0x00, 0x73, 0x00, 0x0E, 0x00, +/* 0000D8E0 */ 0x30, 0x00, 0x05, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x26, 0x00, 0x08, 0x00, +/* 0000D8F0 */ 0x34, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x25, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, +/* 0000D900 */ 0xC4, 0x00, 0x99, 0x1C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x38, 0x03, 0x08, 0xFE, 0x03, 0x17, 0xFF, +/* 0000D910 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x03, 0x17, 0x51, 0x51, 0x01, 0x05, 0x02, 0x05, 0x04, +/* 0000D920 */ 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x1F, 0x8E, 0x01, 0x09, 0x06, 0x6C, 0x05, +/* 0000D930 */ 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x02, 0x1F, 0x03, +/* 0000D940 */ 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xA7, 0x02, 0xFE, 0x20, 0x17, 0x02, +/* 0000D950 */ 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x33, 0x00, 0x00, 0xBF, 0x4C, 0x00, 0xE0, 0x01, 0xC0, 0x00, +/* 0000D960 */ 0x93, 0x1C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x37, 0x03, 0x07, 0xFE, 0x69, 0x16, 0xFF, 0x00, 0x10, +/* 0000D970 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x69, 0x16, 0x7B, 0x7B, 0x41, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, +/* 0000D980 */ 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, 0x00, 0x00, 0xF9, 0x7F, 0xFD, 0xDF, 0xC1, 0x04, 0x00, 0x00, +/* 0000D990 */ 0x40, 0xFE, 0x7F, 0xFD, 0xDF, 0xC1, 0x1E, 0x61, 0x05, 0x04, 0x00, 0x14, 0x0F, 0x00, 0x05, 0x02, +/* 0000D9A0 */ 0x09, 0x00, 0x00, 0x61, 0x05, 0x04, 0x00, 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, 0x02, 0x00, 0x23, +/* 0000D9B0 */ 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x31, 0x01, 0xFE, 0x81, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, +/* 0000D9C0 */ 0x18, 0x00, 0x4A, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0xBF, 0x7C, 0x00, 0x01, 0x00, 0xC0, 0x04, +/* 0000D9D0 */ 0x88, 0x1B, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x36, 0x03, 0x06, 0xFE, 0x10, 0x15, 0xFF, 0x00, 0x10, +/* 0000D9E0 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0x10, 0x15, 0xD5, 0xD5, 0x41, 0x06, 0x05, 0x09, 0x03, 0x13, 0x11, +/* 0000D9F0 */ 0x0E, 0x01, 0x01, 0x05, 0x34, 0x01, 0x00, 0x08, 0x01, 0x01, 0x38, 0x4F, 0x08, 0x47, 0x08, 0x02, +/* 0000DA00 */ 0xEA, 0x00, 0x12, 0x03, 0x00, 0x08, 0x06, 0x09, 0x25, 0x00, 0xBA, 0x09, 0x08, 0x05, 0x0F, 0x03, +/* 0000DA10 */ 0x00, 0x09, 0x09, 0x14, 0x00, 0x47, 0x09, 0x07, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x97, 0x0A, +/* 0000DA20 */ 0x05, 0x08, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0xFF, 0x09, 0x28, 0x08, 0x08, 0x09, 0xD1, 0xFF, 0xA8, +/* 0000DA30 */ 0x00, 0x24, 0x00, 0xFE, 0x37, 0x15, 0x06, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x08, +/* 0000DA40 */ 0x00, 0x20, 0x00, 0x0B, 0x00, 0x26, 0x00, 0x14, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, +/* 0000DA50 */ 0xBF, 0x5C, 0x80, 0xE0, 0x21, 0xD4, 0x00, 0x7B, 0x22, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x49, 0x03, +/* 0000DA60 */ 0x05, 0xFE, 0x87, 0x13, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x87, 0x13, 0xFE, 0x6B, +/* 0000DA70 */ 0x01, 0xFE, 0x6B, 0x01, 0x01, 0x08, 0x04, 0x08, 0x04, 0x2A, 0x27, 0x01, 0x03, 0x02, 0x02, 0x02, +/* 0000DA80 */ 0x02, 0x01, 0x07, 0x08, 0x07, 0x08, 0x80, 0x4F, 0x05, 0x4F, 0x06, 0x8E, 0x01, 0x09, 0x0A, 0x6C, +/* 0000DA90 */ 0x09, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x09, 0x09, +/* 0000DAA0 */ 0x47, 0x05, 0x09, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x52, 0x00, 0x8E, 0x01, 0x44, 0x09, 0x4B, +/* 0000DAB0 */ 0x09, 0x0F, 0x11, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x05, 0x09, 0x07, 0x01, 0x00, 0x5C, +/* 0000DAC0 */ 0x00, 0x03, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x01, 0x07, 0x03, +/* 0000DAD0 */ 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x8E, 0x01, 0x44, 0x0B, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, +/* 0000DAE0 */ 0x1F, 0x03, 0x09, 0x09, 0x47, 0x06, 0x09, 0xAC, 0x09, 0x0F, 0x02, 0x00, 0x06, 0xAB, 0x09, 0xAC, +/* 0000DAF0 */ 0x00, 0x0F, 0x02, 0x00, 0x09, 0xAB, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x05, +/* 0000DB00 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x28, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0xA4, 0x13, +/* 0000DB10 */ 0x08, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x40, 0x00, 0x08, 0x00, 0x23, 0x00, 0x0D, 0x00, 0x24, +/* 0000DB20 */ 0x00, 0x0E, 0x00, 0x32, 0x00, 0x21, 0x00, 0x4A, 0x00, 0x16, 0x00, 0x2D, 0x00, 0x08, 0x00, 0x1D, +/* 0000DB30 */ 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0x6E, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, +/* 0000DB40 */ 0x48, 0x03, 0x04, 0xFE, 0x78, 0x11, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x78, 0x11, +/* 0000DB50 */ 0xFE, 0xEA, 0x01, 0xFE, 0xEA, 0x01, 0x41, 0x06, 0x05, 0x09, 0x04, 0x14, 0x12, 0x01, 0x01, 0x03, +/* 0000DB60 */ 0x03, 0x03, 0x03, 0x08, 0x07, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0x58, 0x03, 0x3F, 0x4F, 0x07, +/* 0000DB70 */ 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, +/* 0000DB80 */ 0x05, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0x09, 0x09, 0x47, 0x07, 0x09, 0x14, 0x03, 0x00, 0x07, 0x02, +/* 0000DB90 */ 0x09, 0x16, 0x00, 0x76, 0x03, 0x05, 0x01, 0x47, 0x09, 0x05, 0xCD, 0x0A, 0x02, 0xA1, 0x00, 0x04, +/* 0000DBA0 */ 0x0A, 0xA1, 0x01, 0x03, 0x0A, 0x76, 0x0A, 0x09, 0x02, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x31, 0x02, +/* 0000DBB0 */ 0xFE, 0x14, 0x02, 0xFE, 0x27, 0x02, 0xFE, 0xA7, 0x11, 0x05, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, +/* 0000DBC0 */ 0x4F, 0x00, 0x08, 0x00, 0x71, 0x00, 0x04, 0x00, 0x33, 0x00, 0x14, 0x00, 0xC7, 0x00, 0x00, 0xBF, +/* 0000DBD0 */ 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0x5D, 0x1D, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0x47, 0x03, 0x03, +/* 0000DBE0 */ 0xFE, 0x8D, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x8D, 0x0F, 0xFE, 0xC9, 0x01, +/* 0000DBF0 */ 0xFE, 0xC9, 0x01, 0x01, 0x04, 0x03, 0x05, 0x02, 0x1D, 0x1D, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, +/* 0000DC00 */ 0x04, 0x05, 0xFE, 0x57, 0x03, 0x5F, 0x4F, 0x03, 0x8E, 0x01, 0x3C, 0x05, 0x4B, 0x05, 0x0F, 0x03, +/* 0000DC10 */ 0x00, 0x05, 0x09, 0x18, 0x00, 0x8E, 0x01, 0x09, 0x05, 0x61, 0x05, 0x05, 0x00, 0x0F, 0x03, 0x00, +/* 0000DC20 */ 0x05, 0x09, 0x09, 0x00, 0x8E, 0x01, 0x3C, 0x00, 0x4B, 0x00, 0x09, 0x36, 0x00, 0x8E, 0x01, 0x09, +/* 0000DC30 */ 0x06, 0x6C, 0x05, 0x06, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x06, 0x1F, 0x01, 0x05, 0x05, 0x54, +/* 0000DC40 */ 0x03, 0x05, 0x0F, 0x0C, 0x00, 0x03, 0x09, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x3C, 0x02, 0x09, +/* 0000DC50 */ 0x06, 0x00, 0x01, 0x32, 0x01, 0x01, 0x3C, 0x03, 0x8E, 0x01, 0x3C, 0x00, 0x4B, 0x00, 0x09, 0x02, +/* 0000DC60 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x17, 0x03, 0xFE, 0x2D, 0x02, 0xFE, 0xA3, 0x0F, 0x08, 0x02, +/* 0000DC70 */ 0x00, 0x00, 0x00, 0x1C, 0x00, 0x39, 0x00, 0x09, 0x00, 0x2B, 0x00, 0x15, 0x00, 0x34, 0x00, 0x07, +/* 0000DC80 */ 0x00, 0x9C, 0x00, 0x09, 0x00, 0x35, 0x00, 0x06, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x00, +/* 0000DC90 */ 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0x3B, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x2B, 0x03, +/* 0000DCA0 */ 0x02, 0xFE, 0xC9, 0x09, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xC9, 0x09, 0x72, 0x72, +/* 0000DCB0 */ 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, 0x02, 0x07, 0x07, 0x08, 0x2F, 0x8E, 0x01, 0x1A, +/* 0000DCC0 */ 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8E, 0x01, 0x0A, +/* 0000DCD0 */ 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x09, +/* 0000DCE0 */ 0x09, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xF4, 0x09, 0x02, +/* 0000DCF0 */ 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x00}; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.64b.h b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.64b.h index c301c8fd09d..3165fce7a8b 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.64b.h +++ b/deps/chakrashim/core/lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.64b.h @@ -84,6 +84,17 @@ var isFinite = platform.builtInGlobalObjectEntryIsFinite; var isNaN = platform.builtInGlobalObjectEntryIsNaN; + // Keep this "enum" in sync with IntlEngineInterfaceExtensionObject::EntryIntl_RegisterBuiltInFunction + const IntlBuiltInFunctionID = setPrototype({ + MIN: 0, + DateToLocaleString: 0, + DateToLocaleDateString: 1, + DateToLocaleTimeString: 2, + NumberToLocaleString: 3, + StringLocaleCompare: 4, + MAX: 5 + }, null); + let __defaultLocale = undefined; const GetDefaultLocale = function () { if (__defaultLocale && platform.useCaches) { @@ -102,15 +113,6 @@ return __defaultLocale; }; - let CacheNumberFormat = function (numberFormat) { - let retVal = platform.cacheNumberFormat(numberFormat); - if (retVal === null) { - // TODO (doilij): remove this fallback when implemented under ICU - numberFormat.__numberingSystem = ""; - } - // no return value - }; - let CreateDateTimeFormat = function (dateTimeFormat, condition) { let retVal = platform.createDateTimeFormat(dateTimeFormat, condition); if (retVal === null) { @@ -609,22 +611,19 @@ // which allows us to display the correct error message for each Intl type. const collator_supportedLocalesOf_name = "Intl.Collator.supportedLocalesOf"; const collator_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(collator_supportedLocalesOf_name, - function collator_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function collator_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, collator_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const numberFormat_supportedLocalesOf_name = "Intl.NumberFormat.supportedLocalesOf"; const numberFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(numberFormat_supportedLocalesOf_name, - function numberFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function numberFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, numberFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); const dateTimeFormat_supportedLocalesOf_name = "Intl.DateTimeFormat.supportedLocalesOf"; const dateTimeFormat_supportedLocalesOf = callInstanceFunc(FunctionInstanceBind, tagPublicFunction(dateTimeFormat_supportedLocalesOf_name, - function dateTimeFormat_supportedLocalesOf_dummyName(locales) { - const options = arguments.length < 2 ? undefined : arguments[1]; + function dateTimeFormat_supportedLocalesOf_dummyName(locales, options = undefined) { return supportedLocalesOfWrapper(this, dateTimeFormat_supportedLocalesOf_name, locales, options); }), intlStaticMethodThisArg); @@ -871,30 +870,22 @@ var stateObject = setPrototype({}, null); InitializeCollator(stateObject, arguments[1], arguments[2]); return Number(platform.compareString(thisArg, that, stateObject.__localeForCompare, stateObject.__sensitivity, stateObject.__ignorePunctuation, stateObject.__numeric)); - }), 4); + }), IntlBuiltInFunctionID.StringLocaleCompare); if (InitType === 'Intl') { - function Collator() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function Collator(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new Collator(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("Collator"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1114,9 +1105,8 @@ try { // Cache api instance and update numbering system on the object - CacheNumberFormat(numberFormat); - } - catch (e) { + platform.cacheNumberFormat(numberFormat); + } catch (e) { throwExIfOOMOrSOE(e); // Generic message to cover the exception throw from the platform. // The platform's exception is also generic and in most if not all cases specifies that "a" argument is invalid. @@ -1124,8 +1114,7 @@ platform.raiseOptionValueOutOfRange(); } - if (!numberFormat.__numberingSystem) - { + if (!numberFormat.__numberingSystem) { numberFormat.__numberingSystem = "latn"; // assume Latin numerals by default } @@ -1144,18 +1133,10 @@ var n = Internal.ToNumber(this); // Need to special case the '-0' case to format as 0 instead of -0. return String(platform.formatNumber(n === -0 ? 0 : n, stateObject)); - }), 3); + }), IntlBuiltInFunctionID.NumberToLocaleString); if (InitType === 'Intl') { - function NumberFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - let locales = undefined; - let options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; - + function NumberFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new NumberFormat(locales, options); } @@ -1609,66 +1590,100 @@ dateTimeFormat.__initializedDateTimeFormat = true; } - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleString", "Date"); - } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; - } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "any", "all")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 0); + // caches for objects constructed with default parameters for each method + let __DateInstanceToLocaleStringDefaultCache = [undefined, undefined, undefined]; + const __DateInstanceToLocaleStringDefaultCacheSlot = setPrototype({ + toLocaleString: 0, + toLocaleDateString: 1, + toLocaleTimeString: 2 + }, null); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleDateString", function () { + function DateInstanceToLocaleStringImplementation(name, option1, option2, cacheSlot, locales, options) { if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleDateString", "Date"); + platform.raiseNeedObjectOfType(name, "Date"); } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); + let value = callInstanceFunc(DateInstanceGetDate, new Date(this)); if (isNaN(value) || !isFinite(value)) { return "Invalid Date"; } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "date", "date")); - return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 1); - platform.registerBuiltInFunction(tagPublicFunction("Date.prototype.toLocaleTimeString", function () { - if (typeof this !== 'object' || !(this instanceof Date)) { - platform.raiseNeedObjectOfType("Date.prototype.toLocaleTimeString", "Date"); + let stateObject = undefined; + if (platform.useCaches && !locales && !options) { + // All default parameters (locales and options): this is the most valuable case to cache. + if (__DateInstanceToLocaleStringDefaultCache[cacheSlot]) { + // retrieve cached value + stateObject = __DateInstanceToLocaleStringDefaultCache[cacheSlot]; + } else { + // populate cache + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, undefined, ToDateTimeOptions(undefined, option1, option2)); + __DateInstanceToLocaleStringDefaultCache[cacheSlot] = stateObject; + } } - var value = callInstanceFunc(DateInstanceGetDate, new Date(this)); - if (isNaN(value) || !isFinite(value)) { - return "Invalid Date"; + + if (!stateObject) { + stateObject = setPrototype({}, null); + InitializeDateTimeFormat(stateObject, locales, ToDateTimeOptions(options, option1, option2)); } - var stateObject = setPrototype({}, null); - InitializeDateTimeFormat(stateObject, arguments[0], ToDateTimeOptions(arguments[1], "time", "time")); + return String(platform.formatDateTime(Internal.ToNumber(this), stateObject)); - }), 2); + } - if (InitType === 'Intl') { - function DateTimeFormat() { - // The function should have length of 0, hence we are getting arguments this way. - // While it's true that we could just do e.g. arguments[0] and get undefined if it is not present, - // that makes assumptions that the JIT must check. This pattern is marginally more efficient. - var locales = undefined; - var options = undefined; - if (arguments.length >= 1) locales = arguments[0]; - if (arguments.length >= 2) options = arguments[1]; + // Note: tagPublicFunction (platform.tagPublicLibraryCode) messes with declared name of the FunctionBody so that + // the functions called appear correctly in the debugger and stack traces. Thus, we we cannot call tagPublicFunction in a loop. + // Each entry point needs to have its own unique FunctionBody (which is a function as defined in the source code); + // this is why we have seemingly repeated ourselves below, instead of having one function and calling it multiple times with + // different parameters. + // + // The following invocations of `platform.registerBuiltInFunction(tagPublicFunction(name, entryPoint))` are enclosed in IIFEs. + // The IIFEs are used to group all of the meaningful differences between each entry point into the arguments to the IIFE. + // The exception to this are the different entryPoint names which are only significant for debugging (and cannot be passed in + // as arguments, as the name is intrinsic to the function declaration). + // + // The `date_toLocale*String_entryPoint` function names are placeholder names that will never be seen from user code. + // The function name property and FunctionBody declared name are overwritten by `tagPublicFunction`. + // The fact that they are declared with unique names is helpful for debugging. + // The functions *must not* be declared as anonymous functions (must be declared with a name); + // converting from an unnnamed function to a named function is not readily supported by the platform code and + // this has caused us to hit assertions in debug builds in the past. + // + // See invocations of `tagPublicFunction` on the `supportedLocalesOf` entry points for a similar pattern. + // + // The entryPoint functions will be called as `Date.prototype.toLocale*String` and thus their `this` parameters will be a Date. + // `DateInstanceToLocaleStringImplementation` is not on `Date.prototype`, so we must propagate `this` into the call by using + // `DateInstanceToLocaleStringImplementation.call(this, ...)`. + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleString", "any", "all", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleString, IntlBuiltInFunctionID.DateToLocaleString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleDateString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleDateString", "date", "date", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleDateString, IntlBuiltInFunctionID.DateToLocaleDateString); + + (function (name, option1, option2, cacheSlot, platformFunctionID) { + platform.registerBuiltInFunction(tagPublicFunction(name, function date_toLocaleTimeString_entryPoint(locales = undefined, options = undefined) { + return DateInstanceToLocaleStringImplementation.call(this, name, option1, option2, cacheSlot, locales, options); + }), platformFunctionID); + })("Date.prototype.toLocaleTimeString", "time", "time", __DateInstanceToLocaleStringDefaultCacheSlot.toLocaleTimeString, IntlBuiltInFunctionID.DateToLocaleTimeString); + if (InitType === 'Intl') { + function DateTimeFormat(locales = undefined, options = undefined) { if (this === Intl || this === undefined) { return new DateTimeFormat(locales, options); } - var obj = Internal.ToObject(this); + let obj = Internal.ToObject(this); if (!ObjectIsExtensible(obj)) { platform.raiseObjectIsNonExtensible("DateTimeFormat"); } // Use the hidden object to store data - var hiddenObject = platform.getHiddenObject(obj); + let hiddenObject = platform.getHiddenObject(obj); if (hiddenObject === undefined) { hiddenObject = setPrototype({}, null); @@ -1684,23 +1699,27 @@ } tagPublicFunction("Intl.DateTimeFormat", DateTimeFormat); - function format() { + function format(date) { if (typeof this !== 'object') { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - var hiddenObject = platform.getHiddenObject(this); + let hiddenObject = platform.getHiddenObject(this); if (hiddenObject === undefined || !hiddenObject.__initializedDateTimeFormat) { platform.raiseNeedObjectOfType("DateTimeFormat.prototype.format", "DateTimeFormat"); } - if (arguments.length >= 1) { - if (isNaN(arguments[0]) || !isFinite(arguments[0])) { - platform.raiseInvalidDate(); - } - return String(platform.formatDateTime(Internal.ToNumber(arguments[0]), hiddenObject)); + if (date !== undefined && (isNaN(date) || !isFinite(date))) { + platform.raiseInvalidDate(); + } + + let dateValue = undefined; + if (date !== undefined) { + dateValue = Internal.ToNumber(date) + } else { + dateValue = DateNow(); } - return String(platform.formatDateTime(DateNow(), hiddenObject)); + return String(platform.formatDateTime(dateValue, hiddenObject)); } tagPublicFunction("Intl.DateTimeFormat.prototype.format", format); @@ -1782,4453 +1801,3541 @@ namespace Js { const char Library_Bytecode_Intl[] = { -/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0xFE, 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFE, 0xD7, 0x02, 0x00, 0xFF, -/* 00000020 */ 0x94, 0x5D, 0x01, 0x00, 0xFF, 0x94, 0x5D, 0x01, 0x00, 0x39, 0x00, 0x00, 0x00, 0x40, 0x32, 0x00, -/* 00000030 */ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x69, 0x00, 0x00, 0xFE, 0x70, 0x01, 0x72, 0x07, 0x00, 0x00, -/* 00000040 */ 0x00, 0x8A, 0x07, 0x00, 0x00, 0x00, 0xA0, 0x07, 0x00, 0x00, 0x01, 0xB4, 0x07, 0x00, 0x00, 0x00, -/* 00000050 */ 0xBC, 0x07, 0x00, 0x00, 0x00, 0xC8, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0x00, 0xD8, -/* 00000060 */ 0x07, 0x00, 0x00, 0x00, 0xE8, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x00, 0x00, 0x00, 0x36, 0x08, -/* 00000070 */ 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0xCE, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00000080 */ 0x00, 0x00, 0x0A, 0x09, 0x00, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x00, 0x3C, 0x09, 0x00, 0x00, -/* 00000090 */ 0x00, 0x64, 0x09, 0x00, 0x00, 0x01, 0x70, 0x09, 0x00, 0x00, 0x01, 0x7A, 0x09, 0x00, 0x00, 0x00, -/* 000000A0 */ 0x88, 0x09, 0x00, 0x00, 0x01, 0x94, 0x09, 0x00, 0x00, 0x01, 0xA0, 0x09, 0x00, 0x00, 0x01, 0xB0, -/* 000000B0 */ 0x09, 0x00, 0x00, 0x00, 0xBE, 0x09, 0x00, 0x00, 0x01, 0xCA, 0x09, 0x00, 0x00, 0x01, 0xD8, 0x09, -/* 000000C0 */ 0x00, 0x00, 0x00, 0xE6, 0x09, 0x00, 0x00, 0x01, 0xF2, 0x09, 0x00, 0x00, 0x01, 0x04, 0x0A, 0x00, -/* 000000D0 */ 0x00, 0x00, 0x12, 0x0A, 0x00, 0x00, 0x01, 0x20, 0x0A, 0x00, 0x00, 0x00, 0x22, 0x0A, 0x00, 0x00, -/* 000000E0 */ 0x01, 0x2E, 0x0A, 0x00, 0x00, 0x01, 0x3A, 0x0A, 0x00, 0x00, 0x01, 0x46, 0x0A, 0x00, 0x00, 0x01, -/* 000000F0 */ 0x54, 0x0A, 0x00, 0x00, 0x01, 0x60, 0x0A, 0x00, 0x00, 0x00, 0x6A, 0x0A, 0x00, 0x00, 0x00, 0x7C, -/* 00000100 */ 0x0A, 0x00, 0x00, 0x00, 0x8E, 0x0A, 0x00, 0x00, 0x00, 0xA4, 0x0A, 0x00, 0x00, 0x00, 0xBE, 0x0A, -/* 00000110 */ 0x00, 0x00, 0x00, 0xD8, 0x0A, 0x00, 0x00, 0x00, 0xF6, 0x0A, 0x00, 0x00, 0x01, 0x0A, 0x0B, 0x00, -/* 00000120 */ 0x00, 0x01, 0x2E, 0x0B, 0x00, 0x00, 0x01, 0x54, 0x0B, 0x00, 0x00, 0x01, 0x68, 0x0B, 0x00, 0x00, -/* 00000130 */ 0x01, 0x88, 0x0B, 0x00, 0x00, 0x01, 0xBA, 0x0B, 0x00, 0x00, 0x01, 0xE4, 0x0B, 0x00, 0x00, 0x01, -/* 00000140 */ 0x16, 0x0C, 0x00, 0x00, 0x01, 0x44, 0x0C, 0x00, 0x00, 0x01, 0x72, 0x0C, 0x00, 0x00, 0x01, 0x84, -/* 00000150 */ 0x0C, 0x00, 0x00, 0x01, 0x9E, 0x0C, 0x00, 0x00, 0x01, 0xBC, 0x0C, 0x00, 0x00, 0x01, 0xDE, 0x0C, -/* 00000160 */ 0x00, 0x00, 0x01, 0xF6, 0x0C, 0x00, 0x00, 0x01, 0x20, 0x0D, 0x00, 0x00, 0x01, 0x46, 0x0D, 0x00, -/* 00000170 */ 0x00, 0x01, 0x7A, 0x0D, 0x00, 0x00, 0x01, 0xB4, 0x0D, 0x00, 0x00, 0x01, 0xE0, 0x0D, 0x00, 0x00, -/* 00000180 */ 0x01, 0x0A, 0x0E, 0x00, 0x00, 0x01, 0x34, 0x0E, 0x00, 0x00, 0x01, 0x5E, 0x0E, 0x00, 0x00, 0x01, -/* 00000190 */ 0x82, 0x0E, 0x00, 0x00, 0x01, 0xA6, 0x0E, 0x00, 0x00, 0x01, 0xD0, 0x0E, 0x00, 0x00, 0x01, 0xF8, -/* 000001A0 */ 0x0E, 0x00, 0x00, 0x01, 0x08, 0x0F, 0x00, 0x00, 0x01, 0x34, 0x0F, 0x00, 0x00, 0x01, 0x68, 0x0F, -/* 000001B0 */ 0x00, 0x00, 0x01, 0x9C, 0x0F, 0x00, 0x00, 0x01, 0xBE, 0x0F, 0x00, 0x00, 0x01, 0xE2, 0x0F, 0x00, -/* 000001C0 */ 0x00, 0x01, 0x06, 0x10, 0x00, 0x00, 0x01, 0x2E, 0x10, 0x00, 0x00, 0x01, 0x56, 0x10, 0x00, 0x00, -/* 000001D0 */ 0x01, 0x74, 0x10, 0x00, 0x00, 0x01, 0xA0, 0x10, 0x00, 0x00, 0x01, 0xB2, 0x10, 0x00, 0x00, 0x01, -/* 000001E0 */ 0xE6, 0x10, 0x00, 0x00, 0x01, 0x22, 0x11, 0x00, 0x00, 0x01, 0x62, 0x11, 0x00, 0x00, 0x01, 0xB0, -/* 000001F0 */ 0x11, 0x00, 0x00, 0x01, 0xD8, 0x11, 0x00, 0x00, 0x01, 0xEA, 0x11, 0x00, 0x00, 0x01, 0x10, 0x12, -/* 00000200 */ 0x00, 0x00, 0x01, 0x30, 0x12, 0x00, 0x00, 0x01, 0x52, 0x12, 0x00, 0x00, 0x01, 0x76, 0x12, 0x00, -/* 00000210 */ 0x00, 0x01, 0xA0, 0x12, 0x00, 0x00, 0x01, 0xD0, 0x12, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, -/* 00000220 */ 0x01, 0x22, 0x13, 0x00, 0x00, 0x01, 0x44, 0x13, 0x00, 0x00, 0x01, 0x64, 0x13, 0x00, 0x00, 0x01, -/* 00000230 */ 0x7C, 0x13, 0x00, 0x00, 0x01, 0xBE, 0x13, 0x00, 0x00, 0x01, 0xF6, 0x13, 0x00, 0x00, 0x01, 0x40, -/* 00000240 */ 0x14, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x00, 0x01, 0xCE, 0x14, 0x00, 0x00, 0x01, 0x12, 0x15, -/* 00000250 */ 0x00, 0x00, 0x01, 0x44, 0x15, 0x00, 0x00, 0x01, 0x70, 0x15, 0x00, 0x00, 0x00, 0x76, 0x15, 0x00, -/* 00000260 */ 0x00, 0x00, 0xD0, 0x15, 0x00, 0x00, 0x00, 0xFA, 0x15, 0x00, 0x00, 0x00, 0xFE, 0x15, 0x00, 0x00, -/* 00000270 */ 0x00, 0x26, 0x16, 0x00, 0x00, 0x00, 0x2E, 0x16, 0x00, 0x00, 0x00, 0x3C, 0x16, 0x00, 0x00, 0x00, -/* 00000280 */ 0x4C, 0x16, 0x00, 0x00, 0x00, 0x76, 0x16, 0x00, 0x00, 0x01, 0x88, 0x16, 0x00, 0x00, 0x01, 0xA8, -/* 00000290 */ 0x16, 0x00, 0x00, 0x00, 0xC4, 0x16, 0x00, 0x00, 0x00, 0xE2, 0x16, 0x00, 0x00, 0x00, 0xF0, 0x16, -/* 000002A0 */ 0x00, 0x00, 0x00, 0x04, 0x17, 0x00, 0x00, 0x01, 0x16, 0x17, 0x00, 0x00, 0x00, 0x28, 0x17, 0x00, -/* 000002B0 */ 0x00, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, 0x5C, 0x17, 0x00, 0x00, 0x00, 0x6E, 0x17, 0x00, 0x00, -/* 000002C0 */ 0x01, 0x86, 0x17, 0x00, 0x00, 0x00, 0x96, 0x17, 0x00, 0x00, 0x00, 0xA4, 0x17, 0x00, 0x00, 0x00, -/* 000002D0 */ 0xB2, 0x17, 0x00, 0x00, 0x00, 0xB8, 0x17, 0x00, 0x00, 0x00, 0xC2, 0x17, 0x00, 0x00, 0x00, 0xC8, -/* 000002E0 */ 0x17, 0x00, 0x00, 0x00, 0xDC, 0x17, 0x00, 0x00, 0x00, 0xE0, 0x17, 0x00, 0x00, 0x00, 0xE8, 0x17, -/* 000002F0 */ 0x00, 0x00, 0x00, 0xEC, 0x17, 0x00, 0x00, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00, 0x0E, 0x18, 0x00, -/* 00000300 */ 0x00, 0x00, 0x1A, 0x18, 0x00, 0x00, 0x00, 0x22, 0x18, 0x00, 0x00, 0x00, 0x26, 0x18, 0x00, 0x00, -/* 00000310 */ 0x00, 0x2A, 0x18, 0x00, 0x00, 0x00, 0xDE, 0x18, 0x00, 0x00, 0x00, 0x7A, 0x19, 0x00, 0x00, 0x00, -/* 00000320 */ 0x00, 0x1A, 0x00, 0x00, 0x00, 0x0C, 0x1A, 0x00, 0x00, 0x00, 0x14, 0x1A, 0x00, 0x00, 0x00, 0x2A, -/* 00000330 */ 0x1A, 0x00, 0x00, 0x00, 0x44, 0x1A, 0x00, 0x00, 0x00, 0x5E, 0x1A, 0x00, 0x00, 0x00, 0x68, 0x1A, -/* 00000340 */ 0x00, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x00, 0x8C, 0x1A, 0x00, 0x00, 0x00, 0x9A, 0x1A, 0x00, -/* 00000350 */ 0x00, 0x00, 0xA4, 0x1A, 0x00, 0x00, 0x00, 0xB2, 0x1A, 0x00, 0x00, 0x00, 0xC6, 0x1A, 0x00, 0x00, -/* 00000360 */ 0x00, 0xE0, 0x1A, 0x00, 0x00, 0x00, 0xEC, 0x1A, 0x00, 0x00, 0x00, 0xFA, 0x1A, 0x00, 0x00, 0x00, -/* 00000370 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x0C, 0x1B, 0x00, 0x00, 0x00, 0x14, 0x1B, 0x00, 0x00, 0x00, 0x24, -/* 00000380 */ 0x1B, 0x00, 0x00, 0x00, 0x30, 0x1B, 0x00, 0x00, 0x00, 0x3A, 0x1B, 0x00, 0x00, 0x00, 0x4A, 0x1B, -/* 00000390 */ 0x00, 0x00, 0x00, 0x56, 0x1B, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x1B, 0x00, -/* 000003A0 */ 0x00, 0x00, 0x6A, 0x1B, 0x00, 0x00, 0x01, 0x74, 0x1B, 0x00, 0x00, 0x00, 0x82, 0x1B, 0x00, 0x00, -/* 000003B0 */ 0x00, 0x90, 0x1B, 0x00, 0x00, 0x00, 0x9E, 0x1B, 0x00, 0x00, 0x01, 0xAC, 0x1B, 0x00, 0x00, 0x01, -/* 000003C0 */ 0xB8, 0x1B, 0x00, 0x00, 0x01, 0xC6, 0x1B, 0x00, 0x00, 0x01, 0xE2, 0x1B, 0x00, 0x00, 0x00, 0xF4, -/* 000003D0 */ 0x1B, 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x00, 0x8A, 0x1C, -/* 000003E0 */ 0x00, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x1D, 0x00, 0x00, 0x00, 0x72, 0x1D, 0x00, -/* 000003F0 */ 0x00, 0x01, 0x84, 0x1D, 0x00, 0x00, 0x01, 0xB6, 0x1D, 0x00, 0x00, 0x01, 0xE6, 0x1D, 0x00, 0x00, -/* 00000400 */ 0x00, 0xF0, 0x1D, 0x00, 0x00, 0x00, 0x42, 0x1E, 0x00, 0x00, 0x00, 0x60, 0x1E, 0x00, 0x00, 0x00, -/* 00000410 */ 0x98, 0x1E, 0x00, 0x00, 0x00, 0xA6, 0x1E, 0x00, 0x00, 0x00, 0xB4, 0x1E, 0x00, 0x00, 0x00, 0xF2, -/* 00000420 */ 0x1E, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x00, 0x00, 0x00, 0x4E, 0x1F, 0x00, 0x00, 0x00, 0x62, 0x1F, -/* 00000430 */ 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x00, 0x00, 0x00, 0x9A, 0x1F, 0x00, 0x00, 0x00, 0xAA, 0x1F, 0x00, -/* 00000440 */ 0x00, 0x00, 0xB2, 0x1F, 0x00, 0x00, 0x00, 0xCA, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x1F, 0x00, 0x00, -/* 00000450 */ 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x2C, 0x20, 0x00, 0x00, 0x00, 0x36, 0x20, 0x00, 0x00, 0x00, -/* 00000460 */ 0x44, 0x20, 0x00, 0x00, 0x00, 0x5C, 0x20, 0x00, 0x00, 0x00, 0x66, 0x20, 0x00, 0x00, 0x00, 0x74, -/* 00000470 */ 0x20, 0x00, 0x00, 0x00, 0x7E, 0x20, 0x00, 0x00, 0x00, 0x8E, 0x20, 0x00, 0x00, 0x00, 0xB2, 0x20, -/* 00000480 */ 0x00, 0x00, 0x01, 0xC6, 0x20, 0x00, 0x00, 0x00, 0xD2, 0x20, 0x00, 0x00, 0x00, 0xDE, 0x20, 0x00, -/* 00000490 */ 0x00, 0x00, 0xEA, 0x20, 0x00, 0x00, 0x00, 0xFA, 0x20, 0x00, 0x00, 0x00, 0x0A, 0x21, 0x00, 0x00, -/* 000004A0 */ 0x00, 0x0E, 0x21, 0x00, 0x00, 0x00, 0x12, 0x21, 0x00, 0x00, 0x00, 0x16, 0x21, 0x00, 0x00, 0x01, -/* 000004B0 */ 0x2A, 0x21, 0x00, 0x00, 0x00, 0x30, 0x21, 0x00, 0x00, 0x00, 0x36, 0x21, 0x00, 0x00, 0x00, 0x40, -/* 000004C0 */ 0x21, 0x00, 0x00, 0x00, 0x46, 0x21, 0x00, 0x00, 0x00, 0x58, 0x21, 0x00, 0x00, 0x00, 0x8E, 0x21, -/* 000004D0 */ 0x00, 0x00, 0x00, 0xD4, 0x21, 0x00, 0x00, 0x01, 0xE4, 0x21, 0x00, 0x00, 0x01, 0xF4, 0x21, 0x00, -/* 000004E0 */ 0x00, 0x01, 0x04, 0x22, 0x00, 0x00, 0x01, 0x16, 0x22, 0x00, 0x00, 0x01, 0x1E, 0x22, 0x00, 0x00, -/* 000004F0 */ 0x01, 0x2C, 0x22, 0x00, 0x00, 0x01, 0x36, 0x22, 0x00, 0x00, 0x01, 0x40, 0x22, 0x00, 0x00, 0x00, -/* 00000500 */ 0x4E, 0x22, 0x00, 0x00, 0x00, 0x8E, 0x22, 0x00, 0x00, 0x00, 0xB2, 0x22, 0x00, 0x00, 0x00, 0xF8, -/* 00000510 */ 0x22, 0x00, 0x00, 0x00, 0x18, 0x23, 0x00, 0x00, 0x00, 0x24, 0x23, 0x00, 0x00, 0x00, 0x36, 0x23, -/* 00000520 */ 0x00, 0x00, 0x00, 0x56, 0x23, 0x00, 0x00, 0x00, 0x80, 0x23, 0x00, 0x00, 0x00, 0xAC, 0x23, 0x00, -/* 00000530 */ 0x00, 0x00, 0xD8, 0x23, 0x00, 0x00, 0x00, 0x0A, 0x24, 0x00, 0x00, 0x00, 0x3C, 0x24, 0x00, 0x00, -/* 00000540 */ 0x00, 0x54, 0x24, 0x00, 0x00, 0x00, 0x62, 0x24, 0x00, 0x00, 0x00, 0x78, 0x24, 0x00, 0x00, 0x01, -/* 00000550 */ 0x9C, 0x24, 0x00, 0x00, 0x01, 0xD4, 0x24, 0x00, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x12, -/* 00000560 */ 0x25, 0x00, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x00, 0x2C, 0x25, 0x00, 0x00, 0x00, 0x3A, 0x25, -/* 00000570 */ 0x00, 0x00, 0x00, 0x40, 0x25, 0x00, 0x00, 0x00, 0x4A, 0x25, 0x00, 0x00, 0x01, 0x6A, 0x25, 0x00, -/* 00000580 */ 0x00, 0x00, 0xA6, 0x25, 0x00, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0x01, 0x0E, 0x26, 0x00, 0x00, -/* 00000590 */ 0x00, 0x14, 0x26, 0x00, 0x00, 0x00, 0x1E, 0x26, 0x00, 0x00, 0x01, 0x42, 0x26, 0x00, 0x00, 0x00, -/* 000005A0 */ 0x52, 0x26, 0x00, 0x00, 0x01, 0x70, 0x26, 0x00, 0x00, 0x00, 0x7E, 0x26, 0x00, 0x00, 0x01, 0x9A, -/* 000005B0 */ 0x26, 0x00, 0x00, 0x00, 0xAA, 0x26, 0x00, 0x00, 0x01, 0xCC, 0x26, 0x00, 0x00, 0x00, 0xDE, 0x26, -/* 000005C0 */ 0x00, 0x00, 0x01, 0xFC, 0x26, 0x00, 0x00, 0x00, 0x0A, 0x27, 0x00, 0x00, 0x01, 0x28, 0x27, 0x00, -/* 000005D0 */ 0x00, 0x00, 0x36, 0x27, 0x00, 0x00, 0x01, 0x58, 0x27, 0x00, 0x00, 0x00, 0x74, 0x27, 0x00, 0x00, -/* 000005E0 */ 0x01, 0x8E, 0x27, 0x00, 0x00, 0x00, 0x98, 0x27, 0x00, 0x00, 0x01, 0xB6, 0x27, 0x00, 0x00, 0x00, -/* 000005F0 */ 0xC4, 0x27, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x28, 0x00, 0x00, 0x00, 0x88, -/* 00000600 */ 0x28, 0x00, 0x00, 0x00, 0xB0, 0x28, 0x00, 0x00, 0x00, 0xFA, 0x28, 0x00, 0x00, 0x00, 0x00, 0x29, -/* 00000610 */ 0x00, 0x00, 0x01, 0x32, 0x29, 0x00, 0x00, 0x01, 0x56, 0x29, 0x00, 0x00, 0x01, 0x90, 0x29, 0x00, -/* 00000620 */ 0x00, 0x01, 0xBC, 0x29, 0x00, 0x00, 0x01, 0xF8, 0x29, 0x00, 0x00, 0x01, 0x46, 0x2A, 0x00, 0x00, -/* 00000630 */ 0x01, 0x70, 0x2A, 0x00, 0x00, 0x01, 0xA2, 0x2A, 0x00, 0x00, 0x00, 0xAC, 0x2A, 0x00, 0x00, 0x00, -/* 00000640 */ 0xB4, 0x2A, 0x00, 0x00, 0x00, 0xBE, 0x2A, 0x00, 0x00, 0x00, 0xC6, 0x2A, 0x00, 0x00, 0x00, 0xD0, -/* 00000650 */ 0x2A, 0x00, 0x00, 0x00, 0xDC, 0x2A, 0x00, 0x00, 0x00, 0xE4, 0x2A, 0x00, 0x00, 0x00, 0xEE, 0x2A, -/* 00000660 */ 0x00, 0x00, 0x00, 0xFC, 0x2A, 0x00, 0x00, 0x00, 0x0A, 0x2B, 0x00, 0x00, 0x00, 0x18, 0x2B, 0x00, -/* 00000670 */ 0x00, 0x00, 0x24, 0x2B, 0x00, 0x00, 0x00, 0x50, 0x2B, 0x00, 0x00, 0x00, 0x5A, 0x2B, 0x00, 0x00, -/* 00000680 */ 0x00, 0x78, 0x2B, 0x00, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0x00, 0xAA, 0x2B, 0x00, 0x00, 0x00, -/* 00000690 */ 0xBE, 0x2B, 0x00, 0x00, 0x00, 0xDA, 0x2B, 0x00, 0x00, 0x00, 0xFE, 0x2B, 0x00, 0x00, 0x00, 0x14, -/* 000006A0 */ 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x2C, 0x00, 0x00, 0x00, 0x5A, 0x2C, 0x00, 0x00, 0x00, 0x5E, 0x2C, -/* 000006B0 */ 0x00, 0x00, 0x01, 0x70, 0x2C, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x00, 0x00, 0x00, 0xC2, 0x2C, 0x00, -/* 000006C0 */ 0x00, 0x00, 0x8C, 0x2D, 0x00, 0x00, 0x00, 0xA2, 0x2D, 0x00, 0x00, 0x00, 0xE8, 0x2D, 0x00, 0x00, -/* 000006D0 */ 0x00, 0xF2, 0x2D, 0x00, 0x00, 0x00, 0xF6, 0x2D, 0x00, 0x00, 0x00, 0xFA, 0x2D, 0x00, 0x00, 0x00, -/* 000006E0 */ 0xFE, 0x2D, 0x00, 0x00, 0x00, 0x16, 0x2E, 0x00, 0x00, 0x00, 0x34, 0x2E, 0x00, 0x00, 0x00, 0x80, -/* 000006F0 */ 0x2E, 0x00, 0x00, 0x00, 0x60, 0x2F, 0x00, 0x00, 0x00, 0x7A, 0x2F, 0x00, 0x00, 0x00, 0x8A, 0x2F, -/* 00000700 */ 0x00, 0x00, 0x00, 0x9E, 0x2F, 0x00, 0x00, 0x00, 0xB2, 0x2F, 0x00, 0x00, 0x00, 0x34, 0x30, 0x00, -/* 00000710 */ 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x78, 0x30, 0x00, 0x00, 0x00, 0x8A, 0x30, 0x00, 0x00, -/* 00000720 */ 0x00, 0xC4, 0x30, 0x00, 0x00, 0x00, 0xD6, 0x30, 0x00, 0x00, 0x00, 0xE6, 0x30, 0x00, 0x00, 0x00, -/* 00000730 */ 0xEE, 0x30, 0x00, 0x00, 0x00, 0x08, 0x31, 0x00, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x00, 0x32, -/* 00000740 */ 0x31, 0x00, 0x00, 0x00, 0x3E, 0x31, 0x00, 0x00, 0x00, 0x56, 0x31, 0x00, 0x00, 0x00, 0x6E, 0x31, -/* 00000750 */ 0x00, 0x00, 0x00, 0x78, 0x31, 0x00, 0x00, 0x00, 0x92, 0x31, 0x00, 0x00, 0x00, 0xD2, 0x31, 0x00, -/* 00000760 */ 0x00, 0x00, 0x24, 0x32, 0x00, 0x00, 0x00, 0x36, 0x32, 0x00, 0x00, 0x01, 0x40, 0x32, 0x00, 0x00, -/* 00000770 */ 0x00, 0x00, 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, -/* 00000780 */ 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00000790 */ 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000007A0 */ 0x4E, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x46, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x4E, 0x00, -/* 000007B0 */ 0x44, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6C, 0x00, -/* 000007C0 */ 0x6F, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x00, 0x00, -/* 000007D0 */ 0x70, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x56, 0x00, 0x61, 0x00, -/* 000007E0 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, -/* 000007F0 */ 0x64, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, -/* 00000800 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, -/* 00000810 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000820 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000830 */ 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, -/* 00000840 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 00000850 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00000860 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00000870 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00000880 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00000890 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000008A0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000008B0 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 000008C0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 000008D0 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, -/* 000008E0 */ 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000008F0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00000900 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00000910 */ 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, -/* 00000920 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00000930 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, -/* 00000940 */ 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, -/* 00000950 */ 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00000960 */ 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x45, 0x00, 0x53, 0x00, 0x00, 0x00, -/* 00000970 */ 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, -/* 00000980 */ 0x64, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x2D, 0x00, 0x4C, 0x00, -/* 00000990 */ 0x56, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, -/* 000009A0 */ 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, 0x6B, 0x00, 0x00, 0x00, -/* 000009B0 */ 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, 0x00, 0x00, 0x6A, 0x00, -/* 000009C0 */ 0x61, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000009D0 */ 0x68, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x73, 0x00, -/* 000009E0 */ 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x54, 0x00, 0x57, 0x00, -/* 000009F0 */ 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00000A00 */ 0x63, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6E, 0x00, -/* 00000A10 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00000A20 */ 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x48, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x7A, 0x00, -/* 00000A30 */ 0x68, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, -/* 00000A40 */ 0x43, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x69, 0x00, -/* 00000A50 */ 0x6E, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x53, 0x00, 0x47, 0x00, 0x00, 0x00, -/* 00000A60 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, -/* 00000A70 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x77, 0x00, 0x72, 0x00, -/* 00000A80 */ 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, -/* 00000A90 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, -/* 00000AA0 */ 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, -/* 00000AB0 */ 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 00000AC0 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00000AD0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000AE0 */ 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 00000AF0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00000B00 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 00000B10 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, -/* 00000B20 */ 0x70, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, -/* 00000B30 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000B40 */ 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, -/* 00000B50 */ 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00000B60 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4E, 0x00, -/* 00000B70 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00000B80 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 00000B90 */ 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, 0x75, 0x00, -/* 00000BA0 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x52, 0x00, 0x65, 0x00, -/* 00000BB0 */ 0x67, 0x00, 0x45, 0x00, 0x78, 0x00, 0x70, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 00000BC0 */ 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00000BD0 */ 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x52, 0x00, 0x45, 0x00, -/* 00000BE0 */ 0x73, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00000BF0 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x43, 0x00, 0x75, 0x00, -/* 00000C00 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x43, 0x00, 0x6F, 0x00, -/* 00000C10 */ 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00000C20 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00000C30 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, -/* 00000C40 */ 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00000C50 */ 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000C60 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00000C70 */ 0x00, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00000C80 */ 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00000C90 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, -/* 00000CA0 */ 0x65, 0x00, 0x74, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4C, 0x00, -/* 00000CB0 */ 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00000CC0 */ 0x6C, 0x00, 0x6C, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000CD0 */ 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x00, 0x00, 0x52, 0x00, -/* 00000CE0 */ 0x61, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x41, 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00000CF0 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000D00 */ 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 00000D10 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00000D20 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x73, 0x00, -/* 00000D30 */ 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x62, 0x00, -/* 00000D40 */ 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000D50 */ 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x50, 0x00, -/* 00000D60 */ 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x4E, 0x00, -/* 00000D70 */ 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, -/* 00000D80 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00000D90 */ 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x77, 0x00, -/* 00000DA0 */ 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, -/* 00000DB0 */ 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, -/* 00000DC0 */ 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, -/* 00000DD0 */ 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, -/* 00000DE0 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, -/* 00000DF0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, -/* 00000E00 */ 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00000E10 */ 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000E20 */ 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, -/* 00000E30 */ 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, -/* 00000E40 */ 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x49, 0x00, -/* 00000E50 */ 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x41, 0x00, -/* 00000E60 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, -/* 00000E70 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x73, 0x00, 0x68, 0x00, -/* 00000E80 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, -/* 00000E90 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x4A, 0x00, 0x6F, 0x00, -/* 00000EA0 */ 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, -/* 00000EB0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00000EC0 */ 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x42, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, -/* 00000ED0 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, -/* 00000EE0 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, -/* 00000EF0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00000F00 */ 0x4E, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, -/* 00000F10 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000F20 */ 0x63, 0x00, 0x65, 0x00, 0x52, 0x00, 0x65, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x63, 0x00, -/* 00000F30 */ 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00000F40 */ 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, -/* 00000F50 */ 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, -/* 00000F60 */ 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, -/* 00000F70 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00000F80 */ 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00000F90 */ 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, -/* 00000FA0 */ 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x49, 0x00, 0x66, 0x00, 0x50, 0x00, -/* 00000FB0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00000FC0 */ 0x68, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x45, 0x00, 0x78, 0x00, 0x49, 0x00, 0x66, 0x00, -/* 00000FD0 */ 0x4F, 0x00, 0x4F, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x53, 0x00, 0x4F, 0x00, 0x45, 0x00, -/* 00000FE0 */ 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x50, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6C, 0x00, -/* 00000FF0 */ 0x69, 0x00, 0x63, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00001000 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x45, 0x00, 0x78, 0x00, -/* 00001010 */ 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, -/* 00001020 */ 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, -/* 00001030 */ 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001040 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, -/* 00001050 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, -/* 00001060 */ 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001070 */ 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 00001080 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001090 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 000010A0 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000010B0 */ 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, -/* 000010C0 */ 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 000010D0 */ 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000010E0 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000010F0 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 00001100 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, -/* 00001110 */ 0x74, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001120 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001130 */ 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00001140 */ 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, -/* 00001150 */ 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001160 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00001170 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x41, 0x00, -/* 00001180 */ 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00001190 */ 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, -/* 000011A0 */ 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 000011B0 */ 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, -/* 000011C0 */ 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 000011D0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 000011E0 */ 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x50, 0x00, -/* 000011F0 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x55, 0x00, -/* 00001200 */ 0x73, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x43, 0x00, 0x55, 0x00, 0x00, 0x00, -/* 00001210 */ 0x5F, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001220 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001230 */ 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, -/* 00001240 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001250 */ 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 00001260 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 00001270 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00001280 */ 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 00001290 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000012A0 */ 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 000012B0 */ 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 000012C0 */ 0x75, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x00, 0x00, -/* 000012D0 */ 0x5F, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 000012E0 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 000012F0 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001300 */ 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, -/* 00001310 */ 0x5F, 0x00, 0x43, 0x00, 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, -/* 00001320 */ 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, -/* 00001330 */ 0x47, 0x00, 0x5F, 0x00, 0x42, 0x00, 0x41, 0x00, 0x53, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, -/* 00001340 */ 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, -/* 00001350 */ 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x45, 0x00, 0x58, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x52, 0x00, -/* 00001360 */ 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, -/* 00001370 */ 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 00001380 */ 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, -/* 00001390 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, -/* 000013A0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, -/* 000013B0 */ 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, -/* 000013C0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, -/* 000013D0 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 000013E0 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 000013F0 */ 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, -/* 00001400 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, -/* 00001410 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001420 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001430 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001440 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, -/* 00001450 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, -/* 00001460 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001470 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00001480 */ 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00001490 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, -/* 000014A0 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, -/* 000014B0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, -/* 000014C0 */ 0x66, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 000014D0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, -/* 000014E0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 000014F0 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, -/* 00001500 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, -/* 00001510 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, -/* 00001520 */ 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, -/* 00001530 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, -/* 00001540 */ 0x65, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, -/* 00001550 */ 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00001560 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001570 */ 0x65, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00001580 */ 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 00001590 */ 0x2E, 0x00, 0x62, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 000015A0 */ 0x2E, 0x00, 0x63, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, -/* 000015B0 */ 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x64, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 000015C0 */ 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 000015D0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, -/* 000015E0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 000015F0 */ 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x72, 0x00, -/* 00001600 */ 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001610 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, -/* 00001620 */ 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x6C, 0x00, -/* 00001630 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 00001640 */ 0x62, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001650 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, -/* 00001660 */ 0x6F, 0x00, 0x75, 0x00, 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, -/* 00001670 */ 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001680 */ 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001690 */ 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, -/* 000016A0 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x3F, 0x00, -/* 000016B0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x29, 0x00, 0x3F, 0x00, -/* 000016C0 */ 0x24, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2A, 0x00, -/* 000016D0 */ 0x29, 0x00, 0x2D, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x3F, 0x00, -/* 000016E0 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 000016F0 */ 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2E, 0x00, -/* 00001700 */ 0x2A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, -/* 00001710 */ 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00001720 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 00001730 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, -/* 00001740 */ 0x6F, 0x00, 0x67, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x6F, 0x00, -/* 00001750 */ 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, -/* 00001760 */ 0x55, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 00001770 */ 0x61, 0x00, 0x73, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001780 */ 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001790 */ 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 000017A0 */ 0x67, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 000017B0 */ 0x00, 0x00, 0x5B, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, -/* 000017C0 */ 0x00, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, -/* 000017D0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, -/* 000017E0 */ 0x20, 0x00, 0x2D, 0x00, 0x20, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x5B, 0x00, -/* 000017F0 */ 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x24, 0x00, -/* 00001800 */ 0x00, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x00, -/* 00001810 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, -/* 00001820 */ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, -/* 00001830 */ 0x3F, 0x00, 0x3A, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001840 */ 0x6A, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6C, 0x00, -/* 00001850 */ 0x2D, 0x00, 0x67, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, -/* 00001860 */ 0x7C, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x7C, 0x00, -/* 00001870 */ 0x6E, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, -/* 00001880 */ 0x68, 0x00, 0x2D, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x79, 0x00, 0x75, 0x00, 0x7C, 0x00, -/* 00001890 */ 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x61, 0x00, -/* 000018A0 */ 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x7C, 0x00, -/* 000018B0 */ 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x6E, 0x00, -/* 000018C0 */ 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x78, 0x00, 0x69, 0x00, -/* 000018D0 */ 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, -/* 000018E0 */ 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x47, 0x00, -/* 000018F0 */ 0x42, 0x00, 0x2D, 0x00, 0x6F, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, -/* 00001900 */ 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6E, 0x00, -/* 00001910 */ 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, -/* 00001920 */ 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00001930 */ 0x6F, 0x00, 0x63, 0x00, 0x68, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001940 */ 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6B, 0x00, -/* 00001950 */ 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001960 */ 0x2D, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6D, 0x00, -/* 00001970 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, -/* 00001980 */ 0x6E, 0x00, 0x61, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, -/* 00001990 */ 0x2D, 0x00, 0x70, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, -/* 000019A0 */ 0x61, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 000019B0 */ 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x73, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x73, 0x00, -/* 000019C0 */ 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x52, 0x00, -/* 000019D0 */ 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, -/* 000019E0 */ 0x4E, 0x00, 0x4C, 0x00, 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x43, 0x00, -/* 000019F0 */ 0x48, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x45, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001A00 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00001A10 */ 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x78, 0x00, -/* 00001A20 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x2C, 0x00, -/* 00001A30 */ 0x38, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00001A40 */ 0x62, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x57, 0x00, 0x59, 0x00, -/* 00001A50 */ 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, -/* 00001A60 */ 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x38, 0x00, -/* 00001A70 */ 0x7D, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, -/* 00001A80 */ 0x35, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, -/* 00001A90 */ 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x7D, 0x00, -/* 00001AA0 */ 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x34, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001AB0 */ 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, -/* 00001AC0 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x7B, 0x00, -/* 00001AD0 */ 0x30, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001AE0 */ 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001AF0 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, -/* 00001B00 */ 0x7B, 0x00, 0x34, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, -/* 00001B10 */ 0x28, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, -/* 00001B20 */ 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001B30 */ 0x29, 0x00, 0x2A, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, -/* 00001B40 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00001B50 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, -/* 00001B60 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, -/* 00001B70 */ 0x6E, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, -/* 00001B80 */ 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00001B90 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, -/* 00001BA0 */ 0x75, 0x00, 0x62, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 00001BB0 */ 0x75, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 00001BC0 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, -/* 00001BD0 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001BE0 */ 0x00, 0x00, 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, -/* 00001BF0 */ 0x74, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00001C00 */ 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00001C10 */ 0x5B, 0x00, 0x27, 0x00, 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, -/* 00001C20 */ 0x69, 0x00, 0x74, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00001C30 */ 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x63, 0x00, -/* 00001C40 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, -/* 00001C50 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00001C60 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001C70 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, -/* 00001C80 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00001C90 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00001CA0 */ 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00001CB0 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00001CC0 */ 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00001CD0 */ 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 00001CE0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, -/* 00001CF0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, -/* 00001D00 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, -/* 00001D10 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, -/* 00001D20 */ 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, -/* 00001D30 */ 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00001D40 */ 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, -/* 00001D50 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x64, 0x00, -/* 00001D60 */ 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00001D70 */ 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x52, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00001D80 */ 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00001D90 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, -/* 00001DA0 */ 0x73, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, -/* 00001DB0 */ 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00001DC0 */ 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00001DD0 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, -/* 00001DE0 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, -/* 00001DF0 */ 0x2D, 0x00, 0x75, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, -/* 00001E00 */ 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, -/* 00001E10 */ 0x3F, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, -/* 00001E20 */ 0x29, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, -/* 00001E30 */ 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, -/* 00001E40 */ 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00001E50 */ 0x5F, 0x00, 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, -/* 00001E60 */ 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, -/* 00001E70 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00001E80 */ 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00001E90 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x63, 0x00, -/* 00001EA0 */ 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00001EB0 */ 0x67, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, -/* 00001EC0 */ 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, -/* 00001ED0 */ 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00001EE0 */ 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00001EF0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, -/* 00001F00 */ 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 00001F10 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00001F20 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00001F30 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, -/* 00001F40 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, -/* 00001F50 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00001F60 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, -/* 00001F70 */ 0x63, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, -/* 00001F80 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, -/* 00001F90 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, -/* 00001FA0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, -/* 00001FB0 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, -/* 00001FC0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 00001FD0 */ 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, -/* 00001FE0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00001FF0 */ 0x5F, 0x00, 0x5F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 00002000 */ 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x64, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002010 */ 0x6C, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 00002020 */ 0x75, 0x00, 0x73, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x6F, 0x00, -/* 00002030 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, -/* 00002040 */ 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, -/* 00002050 */ 0x69, 0x00, 0x76, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, -/* 00002060 */ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002070 */ 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, -/* 00002080 */ 0x61, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x69, 0x00, -/* 00002090 */ 0x67, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x6E, 0x00, -/* 000020A0 */ 0x63, 0x00, 0x74, 0x00, 0x75, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000020B0 */ 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x46, 0x00, 0x69, 0x00, 0x72, 0x00, -/* 000020C0 */ 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 000020D0 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x66, 0x00, -/* 000020E0 */ 0x61, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 000020F0 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, -/* 00002100 */ 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x41, 0x00, -/* 00002110 */ 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00002120 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x66, 0x00, 0x00, 0x00, -/* 00002130 */ 0x6B, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002140 */ 0x63, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 00002150 */ 0x61, 0x00, 0x72, 0x00, 0x64, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002160 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00002170 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, -/* 00002180 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, -/* 00002190 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, -/* 000021A0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000021B0 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 000021C0 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000021D0 */ 0x73, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x41, 0x00, 0x55, 0x00, 0x4C, 0x00, -/* 000021E0 */ 0x54, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x41, 0x00, -/* 000021F0 */ 0x4C, 0x00, 0x00, 0x00, 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4E, 0x00, -/* 00002200 */ 0x54, 0x00, 0x00, 0x00, 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, -/* 00002210 */ 0x43, 0x00, 0x59, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x58, 0x00, 0x00, 0x00, 0x53, 0x00, -/* 00002220 */ 0x59, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x43, 0x00, 0x4F, 0x00, -/* 00002230 */ 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4D, 0x00, 0x45, 0x00, 0x00, 0x00, -/* 00002240 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 00002250 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, -/* 00002260 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, -/* 00002270 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00002280 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x49, 0x00, -/* 00002290 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 000022A0 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000022B0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 000022C0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000022D0 */ 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, -/* 000022E0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000022F0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 00002300 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x53, 0x00, 0x79, 0x00, 0x73, 0x00, -/* 00002310 */ 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, -/* 00002320 */ 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002330 */ 0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002340 */ 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6C, 0x00, -/* 00002350 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 00002360 */ 0x75, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, -/* 00002370 */ 0x72, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00002380 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, -/* 00002390 */ 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, -/* 000023A0 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 000023B0 */ 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, 0x72, 0x00, 0x61, 0x00, -/* 000023C0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, -/* 000023D0 */ 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000023E0 */ 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x69, 0x00, -/* 000023F0 */ 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x44, 0x00, 0x69, 0x00, -/* 00002400 */ 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, -/* 00002410 */ 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, -/* 00002420 */ 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x44, 0x00, -/* 00002430 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, -/* 00002440 */ 0x65, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002450 */ 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002460 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002470 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 00002480 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002490 */ 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, -/* 000024A0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000024B0 */ 0x61, 0x00, 0x74, 0x00, 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 000024C0 */ 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 000024D0 */ 0x79, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 000024E0 */ 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, -/* 000024F0 */ 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002500 */ 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x63, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002510 */ 0x00, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002520 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x79, 0x00, -/* 00002530 */ 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x00, 0x00, -/* 00002540 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x6C, 0x00, -/* 00002550 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002560 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00002570 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00002580 */ 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 00002590 */ 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, -/* 000025A0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, -/* 000025B0 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000025C0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000025D0 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 000025E0 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 000025F0 */ 0x73, 0x00, 0x00, 0x00, 0x68, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002600 */ 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, -/* 00002610 */ 0x5F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, -/* 00002620 */ 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00002630 */ 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002640 */ 0x00, 0x00, 0x67, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x79, 0x00, -/* 00002650 */ 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, 0x43, 0x00, -/* 00002660 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00002670 */ 0x68, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 00002680 */ 0x69, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, -/* 00002690 */ 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6C, 0x00, -/* 000026A0 */ 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x61, 0x00, 0x70, 0x00, -/* 000026B0 */ 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000026C0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x61, 0x00, -/* 000026D0 */ 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4A, 0x00, -/* 000026E0 */ 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000026F0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x75, 0x00, -/* 00002700 */ 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002710 */ 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002720 */ 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002730 */ 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x41, 0x00, 0x6C, 0x00, 0x51, 0x00, -/* 00002740 */ 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, -/* 00002750 */ 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, -/* 00002760 */ 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x69, 0x00, 0x76, 0x00, 0x69, 0x00, -/* 00002770 */ 0x6C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, -/* 00002780 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002790 */ 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, 0x69, 0x00, 0x77, 0x00, -/* 000027A0 */ 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 000027B0 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x77, 0x00, 0x61, 0x00, -/* 000027C0 */ 0x6E, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, -/* 000027D0 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 000027E0 */ 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000027F0 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, -/* 00002800 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, -/* 00002810 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, -/* 00002820 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, -/* 00002830 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002840 */ 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, -/* 00002850 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, -/* 00002860 */ 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002870 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, -/* 00002880 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, -/* 00002890 */ 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000028A0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, -/* 000028B0 */ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000028C0 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 000028D0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, -/* 000028E0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, -/* 000028F0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x00, 0x00, -/* 00002900 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 00002910 */ 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 00002920 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x70, 0x00, -/* 00002930 */ 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, -/* 00002940 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, -/* 00002950 */ 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x4F, 0x00, -/* 00002960 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x54, 0x00, 0x6F, 0x00, -/* 00002970 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 00002980 */ 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002990 */ 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x54, 0x00, -/* 000029A0 */ 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, -/* 000029B0 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, -/* 000029C0 */ 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x57, 0x00, 0x65, 0x00, 0x65, 0x00, -/* 000029D0 */ 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x4D, 0x00, -/* 000029E0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 000029F0 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002A00 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x79, 0x00, 0x48, 0x00, 0x6F, 0x00, -/* 00002A10 */ 0x75, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00002A20 */ 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x4D, 0x00, 0x6F, 0x00, -/* 00002A30 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00002A40 */ 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002A50 */ 0x65, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, -/* 00002A60 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, -/* 00002A70 */ 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, -/* 00002A80 */ 0x7A, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, -/* 00002A90 */ 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002AA0 */ 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, 0x6E, 0x00, -/* 00002AB0 */ 0x79, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0x00, -/* 00002AC0 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, -/* 00002AD0 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, -/* 00002AE0 */ 0x79, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002AF0 */ 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, -/* 00002B00 */ 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002B10 */ 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x72, 0x00, -/* 00002B20 */ 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, -/* 00002B30 */ 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, -/* 00002B40 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, -/* 00002B50 */ 0x6C, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, -/* 00002B60 */ 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x66, 0x00, -/* 00002B70 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x69, 0x00, -/* 00002B80 */ 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, -/* 00002B90 */ 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, -/* 00002BA0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, -/* 00002BB0 */ 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002BC0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, -/* 00002BD0 */ 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00002BE0 */ 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002BF0 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6D, 0x00, -/* 00002C00 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00002C10 */ 0x6C, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, -/* 00002C20 */ 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002C30 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002C40 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, -/* 00002C50 */ 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 00002C60 */ 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, -/* 00002C70 */ 0x7B, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002C80 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, -/* 00002C90 */ 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, -/* 00002CA0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 00002CB0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, -/* 00002CC0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002CD0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002CE0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002CF0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, -/* 00002D00 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, -/* 00002D10 */ 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, -/* 00002D20 */ 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2F, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002D30 */ 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00002D40 */ 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, -/* 00002D50 */ 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, -/* 00002D60 */ 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, -/* 00002D70 */ 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002D80 */ 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x0A, 0x00, -/* 00002D90 */ 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, -/* 00002DA0 */ 0x00, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00002DB0 */ 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, -/* 00002DC0 */ 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, -/* 00002DD0 */ 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, -/* 00002DE0 */ 0x3F, 0x00, 0x7D, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002DF0 */ 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x61, 0x00, -/* 00002E00 */ 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 00002E10 */ 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002E20 */ 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x31, 0x00, -/* 00002E30 */ 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002E40 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x2E, 0x00, -/* 00002E50 */ 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, -/* 00002E60 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, -/* 00002E70 */ 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 00002E80 */ 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, -/* 00002E90 */ 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002EA0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, -/* 00002EB0 */ 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00002EC0 */ 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, -/* 00002ED0 */ 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x2F, 0x00, -/* 00002EE0 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2F, 0x00, 0x73, 0x00, -/* 00002EF0 */ 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2F, 0x00, 0x6D, 0x00, 0x6F, 0x00, -/* 00002F00 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, -/* 00002F10 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, -/* 00002F20 */ 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00002F30 */ 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, -/* 00002F40 */ 0x2E, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, -/* 00002F50 */ 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, -/* 00002F60 */ 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00002F70 */ 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, -/* 00002F80 */ 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, -/* 00002F90 */ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x64, 0x00, -/* 00002FA0 */ 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, -/* 00002FB0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002FC0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, -/* 00002FD0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, -/* 00002FE0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, -/* 00002FF0 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, -/* 00003000 */ 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, -/* 00003010 */ 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, -/* 00003020 */ 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, -/* 00003030 */ 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, +/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0xF3, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFF, +/* 00000020 */ 0xBE, 0x65, 0x01, 0x00, 0xFF, 0xBE, 0x65, 0x01, 0x00, 0x35, 0x00, 0x00, 0x00, 0x80, 0x35, 0x00, +/* 00000030 */ 0x00, 0x8C, 0x51, 0x00, 0x00, 0xFE, 0x81, 0x01, 0xC2, 0x07, 0x00, 0x00, 0x00, 0xDA, 0x07, 0x00, +/* 00000040 */ 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x01, 0x04, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x08, 0x00, 0x00, +/* 00000050 */ 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x01, +/* 00000060 */ 0x30, 0x08, 0x00, 0x00, 0x01, 0x56, 0x08, 0x00, 0x00, 0x01, 0x84, 0x08, 0x00, 0x00, 0x01, 0xB2, +/* 00000070 */ 0x08, 0x00, 0x00, 0x01, 0xDC, 0x08, 0x00, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x01, 0x0C, 0x09, +/* 00000080 */ 0x00, 0x00, 0x00, 0x1C, 0x09, 0x00, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x6A, 0x09, 0x00, +/* 00000090 */ 0x00, 0x00, 0xB4, 0x09, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x34, 0x0A, 0x00, 0x00, +/* 000000A0 */ 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x0A, 0x00, 0x00, 0x00, 0x70, 0x0A, 0x00, 0x00, 0x00, +/* 000000B0 */ 0x98, 0x0A, 0x00, 0x00, 0x01, 0xA4, 0x0A, 0x00, 0x00, 0x01, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0xBC, +/* 000000C0 */ 0x0A, 0x00, 0x00, 0x01, 0xC8, 0x0A, 0x00, 0x00, 0x01, 0xD4, 0x0A, 0x00, 0x00, 0x01, 0xE4, 0x0A, +/* 000000D0 */ 0x00, 0x00, 0x00, 0xF2, 0x0A, 0x00, 0x00, 0x01, 0xFE, 0x0A, 0x00, 0x00, 0x01, 0x0C, 0x0B, 0x00, +/* 000000E0 */ 0x00, 0x00, 0x1A, 0x0B, 0x00, 0x00, 0x01, 0x26, 0x0B, 0x00, 0x00, 0x01, 0x38, 0x0B, 0x00, 0x00, +/* 000000F0 */ 0x00, 0x46, 0x0B, 0x00, 0x00, 0x01, 0x54, 0x0B, 0x00, 0x00, 0x00, 0x56, 0x0B, 0x00, 0x00, 0x01, +/* 00000100 */ 0x62, 0x0B, 0x00, 0x00, 0x01, 0x6E, 0x0B, 0x00, 0x00, 0x01, 0x7A, 0x0B, 0x00, 0x00, 0x01, 0x88, +/* 00000110 */ 0x0B, 0x00, 0x00, 0x01, 0x94, 0x0B, 0x00, 0x00, 0x00, 0x9E, 0x0B, 0x00, 0x00, 0x00, 0xB0, 0x0B, +/* 00000120 */ 0x00, 0x00, 0x00, 0xC2, 0x0B, 0x00, 0x00, 0x00, 0xD8, 0x0B, 0x00, 0x00, 0x00, 0xF2, 0x0B, 0x00, +/* 00000130 */ 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x2A, 0x0C, 0x00, 0x00, 0x01, 0x3E, 0x0C, 0x00, 0x00, +/* 00000140 */ 0x01, 0x62, 0x0C, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x00, 0x00, 0x01, 0x9C, 0x0C, 0x00, 0x00, 0x01, +/* 00000150 */ 0xBC, 0x0C, 0x00, 0x00, 0x01, 0xEE, 0x0C, 0x00, 0x00, 0x01, 0x18, 0x0D, 0x00, 0x00, 0x01, 0x4A, +/* 00000160 */ 0x0D, 0x00, 0x00, 0x01, 0x78, 0x0D, 0x00, 0x00, 0x01, 0xA6, 0x0D, 0x00, 0x00, 0x01, 0xB8, 0x0D, +/* 00000170 */ 0x00, 0x00, 0x01, 0xD2, 0x0D, 0x00, 0x00, 0x01, 0xF0, 0x0D, 0x00, 0x00, 0x01, 0x12, 0x0E, 0x00, +/* 00000180 */ 0x00, 0x01, 0x2A, 0x0E, 0x00, 0x00, 0x01, 0x54, 0x0E, 0x00, 0x00, 0x01, 0x7A, 0x0E, 0x00, 0x00, +/* 00000190 */ 0x01, 0xAE, 0x0E, 0x00, 0x00, 0x01, 0xE8, 0x0E, 0x00, 0x00, 0x01, 0x14, 0x0F, 0x00, 0x00, 0x01, +/* 000001A0 */ 0x3E, 0x0F, 0x00, 0x00, 0x01, 0x68, 0x0F, 0x00, 0x00, 0x01, 0x92, 0x0F, 0x00, 0x00, 0x01, 0xB6, +/* 000001B0 */ 0x0F, 0x00, 0x00, 0x01, 0xDA, 0x0F, 0x00, 0x00, 0x01, 0x04, 0x10, 0x00, 0x00, 0x01, 0x2C, 0x10, +/* 000001C0 */ 0x00, 0x00, 0x01, 0x3C, 0x10, 0x00, 0x00, 0x01, 0x68, 0x10, 0x00, 0x00, 0x01, 0x9C, 0x10, 0x00, +/* 000001D0 */ 0x00, 0x01, 0xD0, 0x10, 0x00, 0x00, 0x01, 0xF2, 0x10, 0x00, 0x00, 0x01, 0x16, 0x11, 0x00, 0x00, +/* 000001E0 */ 0x01, 0x3A, 0x11, 0x00, 0x00, 0x01, 0x62, 0x11, 0x00, 0x00, 0x01, 0x8A, 0x11, 0x00, 0x00, 0x01, +/* 000001F0 */ 0xA8, 0x11, 0x00, 0x00, 0x01, 0xD4, 0x11, 0x00, 0x00, 0x01, 0xE6, 0x11, 0x00, 0x00, 0x01, 0x1A, +/* 00000200 */ 0x12, 0x00, 0x00, 0x01, 0x56, 0x12, 0x00, 0x00, 0x01, 0x96, 0x12, 0x00, 0x00, 0x01, 0xE4, 0x12, +/* 00000210 */ 0x00, 0x00, 0x01, 0x0C, 0x13, 0x00, 0x00, 0x01, 0x1E, 0x13, 0x00, 0x00, 0x01, 0x44, 0x13, 0x00, +/* 00000220 */ 0x00, 0x01, 0x70, 0x13, 0x00, 0x00, 0x01, 0x90, 0x13, 0x00, 0x00, 0x01, 0xB2, 0x13, 0x00, 0x00, +/* 00000230 */ 0x01, 0xDC, 0x13, 0x00, 0x00, 0x01, 0x0C, 0x14, 0x00, 0x00, 0x01, 0x3C, 0x14, 0x00, 0x00, 0x01, +/* 00000240 */ 0x5E, 0x14, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x00, 0x01, 0xA0, 0x14, 0x00, 0x00, 0x01, 0xB8, +/* 00000250 */ 0x14, 0x00, 0x00, 0x01, 0xFA, 0x14, 0x00, 0x00, 0x01, 0x32, 0x15, 0x00, 0x00, 0x01, 0x7C, 0x15, +/* 00000260 */ 0x00, 0x00, 0x01, 0xBC, 0x15, 0x00, 0x00, 0x01, 0x0A, 0x16, 0x00, 0x00, 0x01, 0x4E, 0x16, 0x00, +/* 00000270 */ 0x00, 0x01, 0x80, 0x16, 0x00, 0x00, 0x01, 0xAC, 0x16, 0x00, 0x00, 0x00, 0xB2, 0x16, 0x00, 0x00, +/* 00000280 */ 0x00, 0x0C, 0x17, 0x00, 0x00, 0x00, 0x36, 0x17, 0x00, 0x00, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, +/* 00000290 */ 0x62, 0x17, 0x00, 0x00, 0x00, 0x6A, 0x17, 0x00, 0x00, 0x00, 0x78, 0x17, 0x00, 0x00, 0x00, 0x88, +/* 000002A0 */ 0x17, 0x00, 0x00, 0x00, 0xB2, 0x17, 0x00, 0x00, 0x01, 0xC4, 0x17, 0x00, 0x00, 0x01, 0xE4, 0x17, +/* 000002B0 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x00, 0x00, 0x00, 0x2C, 0x18, 0x00, +/* 000002C0 */ 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x01, 0x52, 0x18, 0x00, 0x00, 0x00, 0x64, 0x18, 0x00, 0x00, +/* 000002D0 */ 0x00, 0x76, 0x18, 0x00, 0x00, 0x00, 0x98, 0x18, 0x00, 0x00, 0x00, 0xAA, 0x18, 0x00, 0x00, 0x01, +/* 000002E0 */ 0xC2, 0x18, 0x00, 0x00, 0x00, 0xD2, 0x18, 0x00, 0x00, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0xEE, +/* 000002F0 */ 0x18, 0x00, 0x00, 0x00, 0xF4, 0x18, 0x00, 0x00, 0x00, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x04, 0x19, +/* 00000300 */ 0x00, 0x00, 0x00, 0x18, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x19, 0x00, 0x00, 0x00, 0x24, 0x19, 0x00, +/* 00000310 */ 0x00, 0x00, 0x28, 0x19, 0x00, 0x00, 0x00, 0x3E, 0x19, 0x00, 0x00, 0x00, 0x4A, 0x19, 0x00, 0x00, +/* 00000320 */ 0x00, 0x56, 0x19, 0x00, 0x00, 0x00, 0x5E, 0x19, 0x00, 0x00, 0x00, 0x62, 0x19, 0x00, 0x00, 0x00, +/* 00000330 */ 0x66, 0x19, 0x00, 0x00, 0x00, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0x00, 0x3C, +/* 00000340 */ 0x1B, 0x00, 0x00, 0x00, 0x48, 0x1B, 0x00, 0x00, 0x00, 0x50, 0x1B, 0x00, 0x00, 0x00, 0x66, 0x1B, +/* 00000350 */ 0x00, 0x00, 0x00, 0x80, 0x1B, 0x00, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0x00, 0xA4, 0x1B, 0x00, +/* 00000360 */ 0x00, 0x00, 0xBA, 0x1B, 0x00, 0x00, 0x00, 0xC8, 0x1B, 0x00, 0x00, 0x00, 0xD6, 0x1B, 0x00, 0x00, +/* 00000370 */ 0x00, 0xE0, 0x1B, 0x00, 0x00, 0x00, 0xEE, 0x1B, 0x00, 0x00, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x00, +/* 00000380 */ 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x28, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x3C, +/* 00000390 */ 0x1C, 0x00, 0x00, 0x00, 0x48, 0x1C, 0x00, 0x00, 0x00, 0x50, 0x1C, 0x00, 0x00, 0x00, 0x60, 0x1C, +/* 000003A0 */ 0x00, 0x00, 0x00, 0x6C, 0x1C, 0x00, 0x00, 0x00, 0x76, 0x1C, 0x00, 0x00, 0x00, 0x86, 0x1C, 0x00, +/* 000003B0 */ 0x00, 0x00, 0x92, 0x1C, 0x00, 0x00, 0x00, 0x9C, 0x1C, 0x00, 0x00, 0x00, 0xA2, 0x1C, 0x00, 0x00, +/* 000003C0 */ 0x00, 0xA6, 0x1C, 0x00, 0x00, 0x01, 0xB0, 0x1C, 0x00, 0x00, 0x00, 0xBE, 0x1C, 0x00, 0x00, 0x00, +/* 000003D0 */ 0xCC, 0x1C, 0x00, 0x00, 0x00, 0xDA, 0x1C, 0x00, 0x00, 0x01, 0xE8, 0x1C, 0x00, 0x00, 0x01, 0xF4, +/* 000003E0 */ 0x1C, 0x00, 0x00, 0x01, 0x02, 0x1D, 0x00, 0x00, 0x01, 0x1E, 0x1D, 0x00, 0x00, 0x00, 0x30, 0x1D, +/* 000003F0 */ 0x00, 0x00, 0x00, 0x4C, 0x1D, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x00, 0x00, 0x00, 0xC6, 0x1D, 0x00, +/* 00000400 */ 0x00, 0x00, 0x1A, 0x1E, 0x00, 0x00, 0x00, 0x72, 0x1E, 0x00, 0x00, 0x00, 0xAE, 0x1E, 0x00, 0x00, +/* 00000410 */ 0x01, 0xC0, 0x1E, 0x00, 0x00, 0x01, 0xF2, 0x1E, 0x00, 0x00, 0x01, 0x22, 0x1F, 0x00, 0x00, 0x00, +/* 00000420 */ 0x2C, 0x1F, 0x00, 0x00, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0x00, 0x9C, 0x1F, 0x00, 0x00, 0x00, 0xD4, +/* 00000430 */ 0x1F, 0x00, 0x00, 0x00, 0xE2, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x2E, 0x20, +/* 00000440 */ 0x00, 0x00, 0x00, 0x4A, 0x20, 0x00, 0x00, 0x00, 0x8A, 0x20, 0x00, 0x00, 0x00, 0x9E, 0x20, 0x00, +/* 00000450 */ 0x00, 0x00, 0xB6, 0x20, 0x00, 0x00, 0x00, 0xD6, 0x20, 0x00, 0x00, 0x00, 0xE6, 0x20, 0x00, 0x00, +/* 00000460 */ 0x00, 0xEE, 0x20, 0x00, 0x00, 0x00, 0x06, 0x21, 0x00, 0x00, 0x01, 0x2C, 0x21, 0x00, 0x00, 0x00, +/* 00000470 */ 0x5C, 0x21, 0x00, 0x00, 0x01, 0x68, 0x21, 0x00, 0x00, 0x00, 0x72, 0x21, 0x00, 0x00, 0x00, 0x80, +/* 00000480 */ 0x21, 0x00, 0x00, 0x00, 0x98, 0x21, 0x00, 0x00, 0x00, 0xA2, 0x21, 0x00, 0x00, 0x00, 0xB0, 0x21, +/* 00000490 */ 0x00, 0x00, 0x00, 0xBA, 0x21, 0x00, 0x00, 0x00, 0xCA, 0x21, 0x00, 0x00, 0x00, 0xEE, 0x21, 0x00, +/* 000004A0 */ 0x00, 0x01, 0x02, 0x22, 0x00, 0x00, 0x00, 0x0E, 0x22, 0x00, 0x00, 0x00, 0x1A, 0x22, 0x00, 0x00, +/* 000004B0 */ 0x00, 0x26, 0x22, 0x00, 0x00, 0x00, 0x36, 0x22, 0x00, 0x00, 0x00, 0x46, 0x22, 0x00, 0x00, 0x00, +/* 000004C0 */ 0x4A, 0x22, 0x00, 0x00, 0x00, 0x4E, 0x22, 0x00, 0x00, 0x00, 0x52, 0x22, 0x00, 0x00, 0x01, 0x66, +/* 000004D0 */ 0x22, 0x00, 0x00, 0x00, 0x6C, 0x22, 0x00, 0x00, 0x00, 0x72, 0x22, 0x00, 0x00, 0x00, 0x7C, 0x22, +/* 000004E0 */ 0x00, 0x00, 0x00, 0x82, 0x22, 0x00, 0x00, 0x00, 0x94, 0x22, 0x00, 0x00, 0x00, 0xCA, 0x22, 0x00, +/* 000004F0 */ 0x00, 0x00, 0x10, 0x23, 0x00, 0x00, 0x01, 0x20, 0x23, 0x00, 0x00, 0x01, 0x30, 0x23, 0x00, 0x00, +/* 00000500 */ 0x01, 0x40, 0x23, 0x00, 0x00, 0x01, 0x52, 0x23, 0x00, 0x00, 0x01, 0x60, 0x23, 0x00, 0x00, 0x01, +/* 00000510 */ 0x6A, 0x23, 0x00, 0x00, 0x01, 0x74, 0x23, 0x00, 0x00, 0x00, 0x82, 0x23, 0x00, 0x00, 0x00, 0xC2, +/* 00000520 */ 0x23, 0x00, 0x00, 0x00, 0xE6, 0x23, 0x00, 0x00, 0x00, 0x2C, 0x24, 0x00, 0x00, 0x00, 0x4C, 0x24, +/* 00000530 */ 0x00, 0x00, 0x00, 0x58, 0x24, 0x00, 0x00, 0x00, 0x6A, 0x24, 0x00, 0x00, 0x00, 0x8A, 0x24, 0x00, +/* 00000540 */ 0x00, 0x00, 0xB4, 0x24, 0x00, 0x00, 0x00, 0xE0, 0x24, 0x00, 0x00, 0x00, 0x0C, 0x25, 0x00, 0x00, +/* 00000550 */ 0x00, 0x3E, 0x25, 0x00, 0x00, 0x00, 0x70, 0x25, 0x00, 0x00, 0x00, 0x88, 0x25, 0x00, 0x00, 0x00, +/* 00000560 */ 0x96, 0x25, 0x00, 0x00, 0x00, 0xAC, 0x25, 0x00, 0x00, 0x01, 0xD0, 0x25, 0x00, 0x00, 0x01, 0x08, +/* 00000570 */ 0x26, 0x00, 0x00, 0x01, 0x36, 0x26, 0x00, 0x00, 0x00, 0x46, 0x26, 0x00, 0x00, 0x00, 0x56, 0x26, +/* 00000580 */ 0x00, 0x00, 0x00, 0x60, 0x26, 0x00, 0x00, 0x00, 0x6E, 0x26, 0x00, 0x00, 0x00, 0x74, 0x26, 0x00, +/* 00000590 */ 0x00, 0x00, 0x7E, 0x26, 0x00, 0x00, 0x01, 0x9E, 0x26, 0x00, 0x00, 0x00, 0xDA, 0x26, 0x00, 0x00, +/* 000005A0 */ 0x00, 0x28, 0x27, 0x00, 0x00, 0x01, 0x42, 0x27, 0x00, 0x00, 0x00, 0x48, 0x27, 0x00, 0x00, 0x00, +/* 000005B0 */ 0x52, 0x27, 0x00, 0x00, 0x01, 0x76, 0x27, 0x00, 0x00, 0x00, 0x86, 0x27, 0x00, 0x00, 0x01, 0xA4, +/* 000005C0 */ 0x27, 0x00, 0x00, 0x00, 0xB2, 0x27, 0x00, 0x00, 0x01, 0xCE, 0x27, 0x00, 0x00, 0x00, 0xDE, 0x27, +/* 000005D0 */ 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x12, 0x28, 0x00, 0x00, 0x01, 0x30, 0x28, 0x00, +/* 000005E0 */ 0x00, 0x00, 0x3E, 0x28, 0x00, 0x00, 0x01, 0x5C, 0x28, 0x00, 0x00, 0x00, 0x6A, 0x28, 0x00, 0x00, +/* 000005F0 */ 0x01, 0x8C, 0x28, 0x00, 0x00, 0x00, 0xA8, 0x28, 0x00, 0x00, 0x01, 0xC2, 0x28, 0x00, 0x00, 0x00, +/* 00000600 */ 0xCC, 0x28, 0x00, 0x00, 0x01, 0xEA, 0x28, 0x00, 0x00, 0x00, 0xF8, 0x28, 0x00, 0x00, 0x00, 0x16, +/* 00000610 */ 0x29, 0x00, 0x00, 0x00, 0x3C, 0x29, 0x00, 0x00, 0x00, 0x62, 0x29, 0x00, 0x00, 0x00, 0x9E, 0x29, +/* 00000620 */ 0x00, 0x00, 0x00, 0xA6, 0x29, 0x00, 0x00, 0x00, 0xAE, 0x29, 0x00, 0x00, 0x00, 0xF2, 0x29, 0x00, +/* 00000630 */ 0x00, 0x00, 0xFC, 0x29, 0x00, 0x00, 0x00, 0x40, 0x2A, 0x00, 0x00, 0x00, 0x4A, 0x2A, 0x00, 0x00, +/* 00000640 */ 0x00, 0x72, 0x2A, 0x00, 0x00, 0x00, 0xBC, 0x2A, 0x00, 0x00, 0x00, 0xC2, 0x2A, 0x00, 0x00, 0x01, +/* 00000650 */ 0xF4, 0x2A, 0x00, 0x00, 0x01, 0x18, 0x2B, 0x00, 0x00, 0x01, 0x52, 0x2B, 0x00, 0x00, 0x01, 0x7E, +/* 00000660 */ 0x2B, 0x00, 0x00, 0x01, 0xBA, 0x2B, 0x00, 0x00, 0x01, 0x08, 0x2C, 0x00, 0x00, 0x01, 0x32, 0x2C, +/* 00000670 */ 0x00, 0x00, 0x01, 0x64, 0x2C, 0x00, 0x00, 0x01, 0xB6, 0x2C, 0x00, 0x00, 0x01, 0x08, 0x2D, 0x00, +/* 00000680 */ 0x00, 0x00, 0x12, 0x2D, 0x00, 0x00, 0x00, 0x1E, 0x2D, 0x00, 0x00, 0x00, 0x26, 0x2D, 0x00, 0x00, +/* 00000690 */ 0x00, 0x30, 0x2D, 0x00, 0x00, 0x00, 0x3E, 0x2D, 0x00, 0x00, 0x00, 0x4C, 0x2D, 0x00, 0x00, 0x00, +/* 000006A0 */ 0x5A, 0x2D, 0x00, 0x00, 0x00, 0x66, 0x2D, 0x00, 0x00, 0x00, 0x92, 0x2D, 0x00, 0x00, 0x00, 0x9C, +/* 000006B0 */ 0x2D, 0x00, 0x00, 0x00, 0xBA, 0x2D, 0x00, 0x00, 0x00, 0xCA, 0x2D, 0x00, 0x00, 0x00, 0xEC, 0x2D, +/* 000006C0 */ 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x1C, 0x2E, 0x00, 0x00, 0x00, 0x40, 0x2E, 0x00, +/* 000006D0 */ 0x00, 0x00, 0x56, 0x2E, 0x00, 0x00, 0x00, 0x80, 0x2E, 0x00, 0x00, 0x00, 0x9C, 0x2E, 0x00, 0x00, +/* 000006E0 */ 0x00, 0xA0, 0x2E, 0x00, 0x00, 0x01, 0xB2, 0x2E, 0x00, 0x00, 0x00, 0xB8, 0x2E, 0x00, 0x00, 0x00, +/* 000006F0 */ 0x04, 0x2F, 0x00, 0x00, 0x00, 0xCE, 0x2F, 0x00, 0x00, 0x00, 0xE4, 0x2F, 0x00, 0x00, 0x00, 0x2A, +/* 00000700 */ 0x30, 0x00, 0x00, 0x00, 0x34, 0x30, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x30, +/* 00000710 */ 0x00, 0x00, 0x00, 0x40, 0x30, 0x00, 0x00, 0x00, 0x58, 0x30, 0x00, 0x00, 0x00, 0x76, 0x30, 0x00, +/* 00000720 */ 0x00, 0x00, 0xC2, 0x30, 0x00, 0x00, 0x00, 0xA2, 0x31, 0x00, 0x00, 0x00, 0xBC, 0x31, 0x00, 0x00, +/* 00000730 */ 0x00, 0xCC, 0x31, 0x00, 0x00, 0x00, 0xE0, 0x31, 0x00, 0x00, 0x00, 0xF4, 0x31, 0x00, 0x00, 0x00, +/* 00000740 */ 0x76, 0x32, 0x00, 0x00, 0x00, 0xA2, 0x32, 0x00, 0x00, 0x00, 0xBA, 0x32, 0x00, 0x00, 0x00, 0xCC, +/* 00000750 */ 0x32, 0x00, 0x00, 0x00, 0x06, 0x33, 0x00, 0x00, 0x00, 0x18, 0x33, 0x00, 0x00, 0x00, 0x28, 0x33, +/* 00000760 */ 0x00, 0x00, 0x00, 0x30, 0x33, 0x00, 0x00, 0x00, 0x4A, 0x33, 0x00, 0x00, 0x00, 0x58, 0x33, 0x00, +/* 00000770 */ 0x00, 0x00, 0x74, 0x33, 0x00, 0x00, 0x00, 0x80, 0x33, 0x00, 0x00, 0x00, 0x98, 0x33, 0x00, 0x00, +/* 00000780 */ 0x00, 0xB0, 0x33, 0x00, 0x00, 0x00, 0xBA, 0x33, 0x00, 0x00, 0x00, 0xD4, 0x33, 0x00, 0x00, 0x01, +/* 00000790 */ 0xE4, 0x33, 0x00, 0x00, 0x01, 0xF4, 0x33, 0x00, 0x00, 0x01, 0x08, 0x34, 0x00, 0x00, 0x00, 0x46, +/* 000007A0 */ 0x34, 0x00, 0x00, 0x00, 0x8C, 0x34, 0x00, 0x00, 0x00, 0xD2, 0x34, 0x00, 0x00, 0x00, 0x12, 0x35, +/* 000007B0 */ 0x00, 0x00, 0x00, 0x64, 0x35, 0x00, 0x00, 0x00, 0x76, 0x35, 0x00, 0x00, 0x01, 0x80, 0x35, 0x00, +/* 000007C0 */ 0x00, 0x00, 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, +/* 000007D0 */ 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 000007E0 */ 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 000007F0 */ 0x4E, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x46, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x4E, 0x00, +/* 00000800 */ 0x44, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6C, 0x00, +/* 00000810 */ 0x6F, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x00, 0x00, +/* 00000820 */ 0x70, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x4E, 0x00, 0x00, 0x00, +/* 00000830 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00000840 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00000850 */ 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, +/* 00000860 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, +/* 00000870 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000880 */ 0x67, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, +/* 00000890 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 000008A0 */ 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000008B0 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x54, 0x00, +/* 000008C0 */ 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 000008D0 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 000008E0 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000008F0 */ 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00000900 */ 0x65, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x58, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00000910 */ 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x56, 0x00, 0x61, 0x00, +/* 00000920 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, +/* 00000930 */ 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00000940 */ 0x72, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00000950 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000960 */ 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00000970 */ 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00000980 */ 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, +/* 00000990 */ 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 000009A0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, +/* 000009B0 */ 0x66, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, +/* 000009C0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, +/* 000009D0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 000009E0 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 000009F0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00000A00 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 00000A10 */ 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, +/* 00000A20 */ 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000A30 */ 0x73, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, +/* 00000A40 */ 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00000A50 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00000A60 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, +/* 00000A70 */ 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00000A80 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00000A90 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x45, 0x00, +/* 00000AA0 */ 0x53, 0x00, 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x00, 0x00, 0x74, 0x00, +/* 00000AB0 */ 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x76, 0x00, +/* 00000AC0 */ 0x2D, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2D, 0x00, 0x44, 0x00, +/* 00000AD0 */ 0x45, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, +/* 00000AE0 */ 0x6B, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x62, 0x00, +/* 00000AF0 */ 0x00, 0x00, 0x6A, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x00, 0x00, 0x75, 0x00, +/* 00000B00 */ 0x6E, 0x00, 0x69, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000B10 */ 0x64, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, +/* 00000B20 */ 0x54, 0x00, 0x57, 0x00, 0x00, 0x00, 0x70, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00000B30 */ 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00000B40 */ 0x75, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00000B50 */ 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x48, 0x00, 0x4B, 0x00, +/* 00000B60 */ 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x7A, 0x00, +/* 00000B70 */ 0x68, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000B80 */ 0x79, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x53, 0x00, +/* 00000B90 */ 0x47, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x43, 0x00, +/* 00000BA0 */ 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00000BB0 */ 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000BC0 */ 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000BD0 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, +/* 00000BE0 */ 0x69, 0x00, 0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00000BF0 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, +/* 00000C00 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00000C10 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00000C20 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00000C30 */ 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00000C40 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, +/* 00000C50 */ 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x43, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, +/* 00000C60 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, +/* 00000C70 */ 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x46, 0x00, 0x69, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00000C80 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, +/* 00000C90 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x47, 0x00, 0x65, 0x00, +/* 00000CA0 */ 0x74, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x4F, 0x00, +/* 00000CB0 */ 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00000CC0 */ 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, +/* 00000CD0 */ 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, +/* 00000CE0 */ 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x45, 0x00, 0x78, 0x00, 0x70, 0x00, 0x00, 0x00, 0x49, 0x00, +/* 00000CF0 */ 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00000D00 */ 0x65, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, +/* 00000D10 */ 0x52, 0x00, 0x45, 0x00, 0x73, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, 0x57, 0x00, 0x65, 0x00, +/* 00000D20 */ 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00000D30 */ 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, +/* 00000D40 */ 0x43, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00000D50 */ 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00000D60 */ 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, +/* 00000D70 */ 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00000D80 */ 0x75, 0x00, 0x70, 0x00, 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00000D90 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000DA0 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, +/* 00000DB0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, +/* 00000DC0 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000DD0 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000DE0 */ 0x79, 0x00, 0x4C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, +/* 00000DF0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00000E00 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00000E10 */ 0x00, 0x00, 0x52, 0x00, 0x61, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x41, 0x00, 0x73, 0x00, +/* 00000E20 */ 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000E30 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000E40 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x4F, 0x00, +/* 00000E50 */ 0x66, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00000E60 */ 0x49, 0x00, 0x73, 0x00, 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000E70 */ 0x69, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000E80 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x77, 0x00, +/* 00000E90 */ 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00000EA0 */ 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x4F, 0x00, +/* 00000EB0 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000EC0 */ 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, +/* 00000ED0 */ 0x4F, 0x00, 0x77, 0x00, 0x6E, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000EE0 */ 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, +/* 00000EF0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00000F00 */ 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00000F10 */ 0x79, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00000F20 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000F30 */ 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, +/* 00000F40 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00000F50 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, +/* 00000F60 */ 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000F70 */ 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00000F80 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00000F90 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00000FA0 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, +/* 00000FB0 */ 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00000FC0 */ 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, +/* 00000FD0 */ 0x4A, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00000FE0 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 00000FF0 */ 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x42, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001000 */ 0x64, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00001010 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x65, 0x00, +/* 00001020 */ 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00001030 */ 0x74, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 00001040 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00001050 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x52, 0x00, 0x65, 0x00, 0x70, 0x00, 0x6C, 0x00, +/* 00001060 */ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00001070 */ 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001080 */ 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, +/* 00001090 */ 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 000010A0 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 000010B0 */ 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x70, 0x00, +/* 000010C0 */ 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000010D0 */ 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x45, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x49, 0x00, +/* 000010E0 */ 0x66, 0x00, 0x50, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 000010F0 */ 0x00, 0x00, 0x74, 0x00, 0x68, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x45, 0x00, 0x78, 0x00, +/* 00001100 */ 0x49, 0x00, 0x66, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x53, 0x00, +/* 00001110 */ 0x4F, 0x00, 0x45, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x50, 0x00, 0x75, 0x00, +/* 00001120 */ 0x62, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x63, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00001130 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, +/* 00001140 */ 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 00001150 */ 0x6E, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 00001160 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, +/* 00001170 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x48, 0x00, 0x65, 0x00, +/* 00001180 */ 0x6C, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001190 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000011A0 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 000011B0 */ 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, +/* 000011C0 */ 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 000011D0 */ 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, +/* 000011E0 */ 0x61, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, +/* 000011F0 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001200 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00001210 */ 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001220 */ 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, +/* 00001230 */ 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, +/* 00001240 */ 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x57, 0x00, 0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001250 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00001260 */ 0x65, 0x00, 0x73, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, +/* 00001270 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, +/* 00001280 */ 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, +/* 00001290 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 000012A0 */ 0x73, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000012B0 */ 0x73, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 000012C0 */ 0x6E, 0x00, 0x67, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000012D0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, +/* 000012E0 */ 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 000012F0 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 00001300 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00001310 */ 0x69, 0x00, 0x74, 0x00, 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x69, 0x00, +/* 00001320 */ 0x73, 0x00, 0x50, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001330 */ 0x6D, 0x00, 0x55, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x43, 0x00, +/* 00001340 */ 0x55, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x75, 0x00, +/* 00001350 */ 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00001360 */ 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x49, 0x00, 0x44, 0x00, 0x00, 0x00, +/* 00001370 */ 0x5F, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00001380 */ 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00001390 */ 0x47, 0x00, 0x65, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, +/* 000013A0 */ 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000013B0 */ 0x00, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x44, 0x00, +/* 000013C0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, +/* 000013D0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x49, 0x00, 0x73, 0x00, +/* 000013E0 */ 0x57, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000013F0 */ 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x75, 0x00, 0x61, 0x00, +/* 00001400 */ 0x67, 0x00, 0x65, 0x00, 0x54, 0x00, 0x61, 0x00, 0x67, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, +/* 00001410 */ 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00001420 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 00001430 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x55, 0x00, +/* 00001440 */ 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, 0x5F, 0x00, 0x43, 0x00, +/* 00001450 */ 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4C, 0x00, +/* 00001460 */ 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, 0x5F, 0x00, +/* 00001470 */ 0x42, 0x00, 0x41, 0x00, 0x53, 0x00, 0x45, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, +/* 00001480 */ 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, +/* 00001490 */ 0x5F, 0x00, 0x45, 0x00, 0x58, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, +/* 000014A0 */ 0x4C, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x47, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x41, 0x00, 0x47, 0x00, +/* 000014B0 */ 0x5F, 0x00, 0x52, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 000014C0 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 000014D0 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 000014E0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, +/* 000014F0 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001500 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001510 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001520 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001530 */ 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, +/* 00001540 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001550 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001560 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001570 */ 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00001580 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00001590 */ 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, +/* 000015A0 */ 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000015B0 */ 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 000015C0 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 000015D0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 000015E0 */ 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 000015F0 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, +/* 00001600 */ 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001610 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001620 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001630 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001640 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, +/* 00001650 */ 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x69, 0x00, +/* 00001660 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00001670 */ 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00001680 */ 0x5F, 0x00, 0x5F, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00001690 */ 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x4C, 0x00, +/* 000016A0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, +/* 000016B0 */ 0x00, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, +/* 000016C0 */ 0x61, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x62, 0x00, +/* 000016D0 */ 0x7D, 0x00, 0x7B, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x63, 0x00, +/* 000016E0 */ 0x7D, 0x00, 0x7B, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000016F0 */ 0x2E, 0x00, 0x64, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x73, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, +/* 00001700 */ 0x6E, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00001710 */ 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001720 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x46, 0x00, +/* 00001730 */ 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001740 */ 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001750 */ 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00001760 */ 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001770 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x54, 0x00, +/* 00001780 */ 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001790 */ 0x6C, 0x00, 0x65, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, +/* 000017A0 */ 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 000017B0 */ 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 000017C0 */ 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, +/* 000017D0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000017E0 */ 0x72, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x28, 0x00, +/* 000017F0 */ 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x24, 0x00, 0x00, 0x00, +/* 00001800 */ 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2D, 0x00, +/* 00001810 */ 0x3F, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00001820 */ 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x75, 0x00, 0x70, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00001830 */ 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x00, 0x00, +/* 00001840 */ 0x54, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00001850 */ 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001860 */ 0x67, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, +/* 00001870 */ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x67, 0x00, +/* 00001880 */ 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001890 */ 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x55, 0x00, 0x69, 0x00, +/* 000018A0 */ 0x6E, 0x00, 0x74, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00, 0x48, 0x00, 0x61, 0x00, 0x73, 0x00, +/* 000018B0 */ 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, +/* 000018C0 */ 0x00, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 000018D0 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 000018E0 */ 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5B, 0x00, +/* 000018F0 */ 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, +/* 00001900 */ 0x5D, 0x00, 0x00, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, +/* 00001910 */ 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x20, 0x00, 0x2D, 0x00, +/* 00001920 */ 0x20, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, +/* 00001930 */ 0x5A, 0x00, 0x5D, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x24, 0x00, 0x00, 0x00, 0x5B, 0x00, +/* 00001940 */ 0x41, 0x00, 0x2D, 0x00, 0x5A, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, +/* 00001950 */ 0x39, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x7C, 0x00, +/* 00001960 */ 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, +/* 00001970 */ 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6A, 0x00, 0x62, 0x00, +/* 00001980 */ 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x2D, 0x00, 0x67, 0x00, +/* 00001990 */ 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x7C, 0x00, 0x6E, 0x00, +/* 000019A0 */ 0x6F, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x6E, 0x00, 0x6F, 0x00, +/* 000019B0 */ 0x2D, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, +/* 000019C0 */ 0x67, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x79, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, +/* 000019D0 */ 0x2D, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x61, 0x00, 0x7C, 0x00, 0x7A, 0x00, +/* 000019E0 */ 0x68, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, +/* 000019F0 */ 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001A00 */ 0x7C, 0x00, 0x7A, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x78, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00001A10 */ 0x67, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, +/* 00001A20 */ 0x3F, 0x00, 0x3A, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x47, 0x00, 0x42, 0x00, 0x2D, 0x00, +/* 00001A30 */ 0x6F, 0x00, 0x65, 0x00, 0x64, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x61, 0x00, 0x6D, 0x00, +/* 00001A40 */ 0x69, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x7C, 0x00, +/* 00001A50 */ 0x69, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00001A60 */ 0x74, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001A70 */ 0x68, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x68, 0x00, +/* 00001A80 */ 0x61, 0x00, 0x6B, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x69, 0x00, +/* 00001A90 */ 0x6E, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6C, 0x00, +/* 00001AA0 */ 0x75, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001AB0 */ 0x67, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, +/* 00001AC0 */ 0x76, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x70, 0x00, +/* 00001AD0 */ 0x77, 0x00, 0x6E, 0x00, 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6F, 0x00, +/* 00001AE0 */ 0x7C, 0x00, 0x69, 0x00, 0x2D, 0x00, 0x74, 0x00, 0x61, 0x00, 0x79, 0x00, 0x7C, 0x00, 0x69, 0x00, +/* 00001AF0 */ 0x2D, 0x00, 0x74, 0x00, 0x73, 0x00, 0x75, 0x00, 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, +/* 00001B00 */ 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x52, 0x00, 0x7C, 0x00, 0x73, 0x00, +/* 00001B10 */ 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x42, 0x00, 0x45, 0x00, 0x2D, 0x00, 0x4E, 0x00, 0x4C, 0x00, +/* 00001B20 */ 0x7C, 0x00, 0x73, 0x00, 0x67, 0x00, 0x6E, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x48, 0x00, 0x2D, 0x00, +/* 00001B30 */ 0x44, 0x00, 0x45, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001B40 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, +/* 00001B50 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x78, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001B60 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, +/* 00001B70 */ 0x5C, 0x00, 0x62, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, +/* 00001B80 */ 0x7C, 0x00, 0x5B, 0x00, 0x41, 0x00, 0x2D, 0x00, 0x57, 0x00, 0x59, 0x00, 0x2D, 0x00, 0x5A, 0x00, +/* 00001B90 */ 0x5D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, +/* 00001BA0 */ 0x2D, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x29, 0x00, +/* 00001BB0 */ 0x2B, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x35, 0x00, 0x2C, 0x00, +/* 00001BC0 */ 0x38, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, +/* 00001BD0 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0x00, 0x00, +/* 00001BE0 */ 0x7B, 0x00, 0x34, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, +/* 00001BF0 */ 0x33, 0x00, 0x7D, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, +/* 00001C00 */ 0x00, 0x00, 0x7B, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x7B, 0x00, 0x30, 0x00, 0x2C, 0x00, +/* 00001C10 */ 0x32, 0x00, 0x7D, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x32, 0x00, +/* 00001C20 */ 0x2C, 0x00, 0x33, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001C30 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x34, 0x00, +/* 00001C40 */ 0x2C, 0x00, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x00, 0x00, +/* 00001C50 */ 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x00, 0x00, +/* 00001C60 */ 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, +/* 00001C70 */ 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x28, 0x00, 0x28, 0x00, 0x3F, 0x00, +/* 00001C80 */ 0x3A, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001C90 */ 0x00, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, +/* 00001CA0 */ 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x00, 0x00, +/* 00001CB0 */ 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4C, 0x00, +/* 00001CC0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00001CD0 */ 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, +/* 00001CE0 */ 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x6E, 0x00, +/* 00001CF0 */ 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00001D00 */ 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, +/* 00001D10 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x62, 0x00, +/* 00001D20 */ 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 00001D30 */ 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x61, 0x00, +/* 00001D40 */ 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x27, 0x00, +/* 00001D50 */ 0x62, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 00001D60 */ 0x27, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x27, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6B, 0x00, +/* 00001D70 */ 0x75, 0x00, 0x70, 0x00, 0x27, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00001D80 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, +/* 00001D90 */ 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, +/* 00001DA0 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, +/* 00001DB0 */ 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, +/* 00001DC0 */ 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, +/* 00001DD0 */ 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, +/* 00001DE0 */ 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00001DF0 */ 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001E00 */ 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, +/* 00001E10 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001E20 */ 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00001E30 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x73, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, +/* 00001E40 */ 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001E50 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x4F, 0x00, 0x66, 0x00, 0x5F, 0x00, 0x64, 0x00, +/* 00001E60 */ 0x75, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, +/* 00001E70 */ 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x6F, 0x00, +/* 00001E80 */ 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00001E90 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 00001EA0 */ 0x6D, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x74, 0x00, +/* 00001EB0 */ 0x6F, 0x00, 0x52, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, +/* 00001EC0 */ 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 00001ED0 */ 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x46, 0x00, +/* 00001EE0 */ 0x6F, 0x00, 0x72, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00001EF0 */ 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00001F00 */ 0x64, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00001F10 */ 0x6F, 0x00, 0x6E, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00001F20 */ 0x00, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, +/* 00001F30 */ 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, +/* 00001F40 */ 0x5D, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x3F, 0x00, 0x2D, 0x00, +/* 00001F50 */ 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2A, 0x00, +/* 00001F60 */ 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x5E, 0x00, 0x5C, 0x00, +/* 00001F70 */ 0x2D, 0x00, 0x5D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x28, 0x00, +/* 00001F80 */ 0x5B, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x5F, 0x00, 0x3F, 0x00, +/* 00001F90 */ 0x28, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x63, 0x00, 0x72, 0x00, +/* 00001FA0 */ 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00001FB0 */ 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00001FC0 */ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00001FD0 */ 0x67, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x2D, 0x00, +/* 00001FE0 */ 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 00001FF0 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00002000 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00002010 */ 0x2E, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x43, 0x00, +/* 00002020 */ 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, +/* 00002030 */ 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 00002040 */ 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002050 */ 0x6C, 0x00, 0x2E, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002060 */ 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002070 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, +/* 00002080 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002090 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 000020A0 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 000020B0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 000020C0 */ 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 000020D0 */ 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, +/* 000020E0 */ 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x00, 0x67, 0x00, +/* 000020F0 */ 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x61, 0x00, +/* 00002100 */ 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002110 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00002120 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, +/* 00002130 */ 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, +/* 00002140 */ 0x7A, 0x00, 0x65, 0x00, 0x64, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x4F, 0x00, +/* 00002150 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, +/* 00002160 */ 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x74, 0x00, +/* 00002170 */ 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, 0x68, 0x00, 0x00, 0x00, +/* 00002180 */ 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x76, 0x00, +/* 00002190 */ 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 000021A0 */ 0x00, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, +/* 000021B0 */ 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 000021C0 */ 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6E, 0x00, +/* 000021D0 */ 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x50, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 000021E0 */ 0x75, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 000021F0 */ 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x46, 0x00, 0x69, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00002200 */ 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, +/* 00002210 */ 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x66, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002220 */ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002230 */ 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, +/* 00002240 */ 0x6C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x61, 0x00, +/* 00002250 */ 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002260 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6E, 0x00, +/* 00002270 */ 0x00, 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, +/* 00002280 */ 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00002290 */ 0x64, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000022A0 */ 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000022B0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, +/* 000022C0 */ 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 000022D0 */ 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, +/* 000022E0 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, +/* 000022F0 */ 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002300 */ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 00002310 */ 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x41, 0x00, 0x55, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 00002320 */ 0x44, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x4C, 0x00, 0x00, 0x00, +/* 00002330 */ 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 00002340 */ 0x43, 0x00, 0x55, 0x00, 0x52, 0x00, 0x52, 0x00, 0x45, 0x00, 0x4E, 0x00, 0x43, 0x00, 0x59, 0x00, +/* 00002350 */ 0x00, 0x00, 0x53, 0x00, 0x59, 0x00, 0x4D, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x4C, 0x00, 0x00, 0x00, +/* 00002360 */ 0x43, 0x00, 0x4F, 0x00, 0x44, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4D, 0x00, +/* 00002370 */ 0x45, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002380 */ 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2E, 0x00, +/* 00002390 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 000023A0 */ 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 000023B0 */ 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000023C0 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 000023D0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000023E0 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, +/* 000023F0 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00002400 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002410 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 00002420 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00002430 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x53, 0x00, +/* 00002440 */ 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, +/* 00002450 */ 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00002460 */ 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, +/* 00002470 */ 0x72, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00002480 */ 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 00002490 */ 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000024A0 */ 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 000024B0 */ 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, +/* 000024C0 */ 0x6D, 0x00, 0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, +/* 000024D0 */ 0x6E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 000024E0 */ 0x6D, 0x00, 0x61, 0x00, 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x46, 0x00, +/* 000024F0 */ 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x44, 0x00, +/* 00002500 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x69, 0x00, +/* 00002510 */ 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, 0x67, 0x00, +/* 00002520 */ 0x6E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002530 */ 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6D, 0x00, +/* 00002540 */ 0x61, 0x00, 0x78, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x53, 0x00, 0x69, 0x00, +/* 00002550 */ 0x67, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6E, 0x00, +/* 00002560 */ 0x74, 0x00, 0x44, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 00002570 */ 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x70, 0x00, +/* 00002580 */ 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00002590 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00, +/* 000025A0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 000025B0 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 000025C0 */ 0x61, 0x00, 0x74, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000025D0 */ 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 000025E0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000025F0 */ 0x65, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x79, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, +/* 00002600 */ 0x6C, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, +/* 00002610 */ 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x4E, 0x00, 0x75, 0x00, +/* 00002620 */ 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00002630 */ 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x65, 0x00, 0x63, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00002640 */ 0x61, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, +/* 00002650 */ 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00002660 */ 0x73, 0x00, 0x79, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6E, 0x00, +/* 00002670 */ 0x75, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, +/* 00002680 */ 0x5F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, +/* 00002690 */ 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x4E, 0x00, +/* 000026A0 */ 0x75, 0x00, 0x6D, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 000026B0 */ 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 000026C0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, +/* 000026D0 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 000026E0 */ 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 000026F0 */ 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 00002700 */ 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, +/* 00002710 */ 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002720 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x68, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, +/* 00002730 */ 0x65, 0x00, 0x6E, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, +/* 00002740 */ 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002750 */ 0x00, 0x00, 0x47, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00002760 */ 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, +/* 00002770 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x67, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6F, 0x00, +/* 00002780 */ 0x72, 0x00, 0x79, 0x00, 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00002790 */ 0x77, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 000027A0 */ 0x72, 0x00, 0x00, 0x00, 0x68, 0x00, 0x65, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x77, 0x00, +/* 000027B0 */ 0x00, 0x00, 0x48, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x69, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 000027C0 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, +/* 000027D0 */ 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x4A, 0x00, +/* 000027E0 */ 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x43, 0x00, +/* 000027F0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002800 */ 0x6A, 0x00, 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, +/* 00002810 */ 0x00, 0x00, 0x4A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, +/* 00002820 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002830 */ 0x6A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x4B, 0x00, +/* 00002840 */ 0x6F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002850 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6F, 0x00, +/* 00002860 */ 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x00, 0x6D, 0x00, 0x41, 0x00, +/* 00002870 */ 0x6C, 0x00, 0x51, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002880 */ 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00002890 */ 0x6C, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x2D, 0x00, 0x63, 0x00, 0x69, 0x00, +/* 000028A0 */ 0x76, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, +/* 000028B0 */ 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 000028C0 */ 0x00, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x69, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, +/* 000028D0 */ 0x69, 0x00, 0x77, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 000028E0 */ 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, +/* 000028F0 */ 0x77, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, +/* 00002900 */ 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00002910 */ 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 00002920 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 00002930 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002940 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 00002950 */ 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 00002960 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, +/* 00002970 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, +/* 00002980 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00002990 */ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x61, 0x00, +/* 000029A0 */ 0x6E, 0x00, 0x79, 0x00, 0x00, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x44, 0x00, +/* 000029B0 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, +/* 000029C0 */ 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000029D0 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 000029E0 */ 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, +/* 000029F0 */ 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00002A00 */ 0x74, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 00002A10 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, +/* 00002A20 */ 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00002A30 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, +/* 00002A40 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 00002A50 */ 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, +/* 00002A60 */ 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002A70 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x61, 0x00, +/* 00002A80 */ 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, +/* 00002A90 */ 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00002AA0 */ 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 00002AB0 */ 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, +/* 00002AC0 */ 0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002AD0 */ 0x54, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002AE0 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x61, 0x00, +/* 00002AF0 */ 0x70, 0x00, 0x00, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002B00 */ 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002B10 */ 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x00, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 00002B20 */ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x54, 0x00, +/* 00002B30 */ 0x6F, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002B40 */ 0x54, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002B50 */ 0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, +/* 00002B60 */ 0x54, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002B70 */ 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 00002B80 */ 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x57, 0x00, 0x65, 0x00, +/* 00002B90 */ 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00002BA0 */ 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002BB0 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00002BC0 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x61, 0x00, 0x79, 0x00, 0x48, 0x00, +/* 00002BD0 */ 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, +/* 00002BE0 */ 0x65, 0x00, 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x4D, 0x00, +/* 00002BF0 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, +/* 00002C00 */ 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x75, 0x00, 0x70, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00002C10 */ 0x74, 0x00, 0x65, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00002C20 */ 0x6E, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00, +/* 00002C30 */ 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002C40 */ 0x69, 0x00, 0x7A, 0x00, 0x65, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, +/* 00002C50 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, +/* 00002C60 */ 0x74, 0x00, 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, +/* 00002C70 */ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, +/* 00002C80 */ 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, +/* 00002C90 */ 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x49, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, +/* 00002CA0 */ 0x65, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, +/* 00002CB0 */ 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00002CC0 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, +/* 00002CD0 */ 0x65, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00002CE0 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x44, 0x00, +/* 00002CF0 */ 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x43, 0x00, 0x61, 0x00, +/* 00002D00 */ 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00002D10 */ 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, +/* 00002D20 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00002D30 */ 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x00, 0x00, 0x73, 0x00, +/* 00002D40 */ 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, +/* 00002D50 */ 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6F, 0x00, +/* 00002D60 */ 0x72, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, +/* 00002D70 */ 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, +/* 00002D80 */ 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002D90 */ 0x00, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00002DA0 */ 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x2E, 0x00, +/* 00002DB0 */ 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x64, 0x00, +/* 00002DC0 */ 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, +/* 00002DD0 */ 0x72, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, +/* 00002DE0 */ 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x79, 0x00, 0x65, 0x00, +/* 00002DF0 */ 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, +/* 00002E00 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00002E10 */ 0x6D, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6F, 0x00, +/* 00002E20 */ 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00002E30 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, +/* 00002E40 */ 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, +/* 00002E50 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, +/* 00002E60 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00002E70 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, +/* 00002E80 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00002E90 */ 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +/* 00002EA0 */ 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002EB0 */ 0x00, 0x00, 0x7B, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, +/* 00002EC0 */ 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, +/* 00002ED0 */ 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, +/* 00002EE0 */ 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00002EF0 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, +/* 00002F00 */ 0x7D, 0x00, 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, +/* 00002F10 */ 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00002F20 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, +/* 00002F30 */ 0x77, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, +/* 00002F40 */ 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00002F50 */ 0x20, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00002F60 */ 0x2F, 0x00, 0x45, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2F, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00002F70 */ 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00002F80 */ 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 00002F90 */ 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, +/* 00002FA0 */ 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, +/* 00002FB0 */ 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, +/* 00002FC0 */ 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00, +/* 00002FD0 */ 0x0A, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x3A, 0x00, 0x20, 0x00, +/* 00002FE0 */ 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, +/* 00002FF0 */ 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x29, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 00003000 */ 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x5C, 0x00, +/* 00003010 */ 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, +/* 00003020 */ 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00003030 */ 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, /* 00003040 */ 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, -/* 00003050 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, -/* 00003060 */ 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x75, 0x00, -/* 00003070 */ 0x6C, 0x00, 0x6C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, -/* 00003080 */ 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7B, 0x00, 0x79, 0x00, -/* 00003090 */ 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, -/* 000030A0 */ 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 000030B0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, -/* 000030C0 */ 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, -/* 000030D0 */ 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x64, 0x00, -/* 000030E0 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, 0x74, 0x00, -/* 000030F0 */ 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x4E, 0x00, -/* 00003100 */ 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, -/* 00003110 */ 0x31, 0x00, 0x32, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, -/* 00003120 */ 0x74, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, -/* 00003130 */ 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x31, 0x00, -/* 00003140 */ 0x32, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, -/* 00003150 */ 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, -/* 00003160 */ 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x6E, 0x00, -/* 00003170 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x61, 0x00, -/* 00003180 */ 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, -/* 00003190 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000031A0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000031B0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 000031C0 */ 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, -/* 000031D0 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, -/* 000031E0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, -/* 000031F0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, -/* 00003200 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, -/* 00003210 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, -/* 00003220 */ 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, -/* 00003230 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 00003240 */ 0xFE, 0xEF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x6A, -/* 00003250 */ 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x05, -/* 00003260 */ 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x70, -/* 00003270 */ 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x8F, -/* 00003280 */ 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE0, -/* 00003290 */ 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x5B, 0x02, 0x00, 0x00, 0x5B, -/* 000032A0 */ 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x7B, -/* 000032B0 */ 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xE8, 0x02, 0x00, 0x00, 0xE8, -/* 000032C0 */ 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x23, -/* 000032D0 */ 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x63, -/* 000032E0 */ 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0x97, -/* 000032F0 */ 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0xFB, -/* 00003300 */ 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x5E, 0x04, 0x00, 0x00, 0x5E, -/* 00003310 */ 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x70, -/* 00003320 */ 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x94, -/* 00003330 */ 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xDA, 0x04, 0x00, 0x00, 0xDA, -/* 00003340 */ 0x04, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x54, -/* 00003350 */ 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, 0x79, -/* 00003360 */ 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0xBD, 0x05, 0x00, 0x00, 0xBD, -/* 00003370 */ 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, -/* 00003380 */ 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x00, 0x3F, -/* 00003390 */ 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5C, 0x06, 0x00, 0x00, 0x5C, -/* 000033A0 */ 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0x89, -/* 000033B0 */ 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, 0xCD, -/* 000033C0 */ 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x00, 0x1D, -/* 000033D0 */ 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x50, -/* 000033E0 */ 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0xA5, -/* 000033F0 */ 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0x53, -/* 00003400 */ 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x25, -/* 00003410 */ 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0xAA, 0x09, 0x00, 0x00, 0xAA, -/* 00003420 */ 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0x36, 0x0A, 0x00, 0x00, 0x36, -/* 00003430 */ 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x3E, -/* 00003440 */ 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0xD6, 0x0A, 0x00, 0x00, 0xD6, -/* 00003450 */ 0x0A, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0x62, -/* 00003460 */ 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0xAF, 0x0B, 0x00, 0x00, 0xAF, -/* 00003470 */ 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0x33, 0x0C, 0x00, 0x00, 0x33, -/* 00003480 */ 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x82, 0x0C, 0x00, 0x00, 0x82, -/* 00003490 */ 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0x2E, 0x0D, 0x00, 0x00, 0x2E, -/* 000034A0 */ 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x63, 0x0D, 0x00, 0x00, 0x63, -/* 000034B0 */ 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0xA2, 0x0D, 0x00, 0x00, 0xA2, -/* 000034C0 */ 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDB, 0x0D, 0x00, 0x00, 0xDB, -/* 000034D0 */ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x2B, 0x0E, 0x00, 0x00, 0x2B, -/* 000034E0 */ 0x0E, 0x00, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x84, 0x0E, 0x00, 0x00, 0x84, -/* 000034F0 */ 0x0E, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x00, 0x8F, 0x0E, 0x00, 0x00, 0x8F, -/* 00003500 */ 0x0E, 0x00, 0x00, 0xC3, 0x0E, 0x00, 0x00, 0xC3, 0x0E, 0x00, 0x00, 0xDA, 0x0E, 0x00, 0x00, 0xDA, -/* 00003510 */ 0x0E, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0x5B, 0x0F, 0x00, 0x00, 0x5B, -/* 00003520 */ 0x0F, 0x00, 0x00, 0x7F, 0x0F, 0x00, 0x00, 0x7F, 0x0F, 0x00, 0x00, 0x90, 0x0F, 0x00, 0x00, 0x90, -/* 00003530 */ 0x0F, 0x00, 0x00, 0xB6, 0x0F, 0x00, 0x00, 0xB6, 0x0F, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0xC0, -/* 00003540 */ 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, 0xE1, 0x0F, 0x00, 0x00, 0xE1, -/* 00003550 */ 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00, 0xE9, 0x0F, 0x00, 0x00, 0xE9, -/* 00003560 */ 0x0F, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x5E, 0x10, 0x00, 0x00, 0x5E, -/* 00003570 */ 0x10, 0x00, 0x00, 0x7D, 0x10, 0x00, 0x00, 0x7D, 0x10, 0x00, 0x00, 0xCB, 0x10, 0x00, 0x00, 0xCB, -/* 00003580 */ 0x10, 0x00, 0x00, 0xFC, 0x10, 0x00, 0x00, 0xFC, 0x10, 0x00, 0x00, 0x06, 0x11, 0x00, 0x00, 0x06, -/* 00003590 */ 0x11, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x28, 0x11, 0x00, 0x00, 0x28, -/* 000035A0 */ 0x11, 0x00, 0x00, 0x29, 0x11, 0x00, 0x00, 0x29, 0x11, 0x00, 0x00, 0x6F, 0x11, 0x00, 0x00, 0x6F, -/* 000035B0 */ 0x11, 0x00, 0x00, 0xBE, 0x11, 0x00, 0x00, 0xBE, 0x11, 0x00, 0x00, 0xDD, 0x11, 0x00, 0x00, 0xDD, -/* 000035C0 */ 0x11, 0x00, 0x00, 0x2B, 0x12, 0x00, 0x00, 0x2B, 0x12, 0x00, 0x00, 0x5E, 0x12, 0x00, 0x00, 0x5E, -/* 000035D0 */ 0x12, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x00, 0xCE, 0x12, 0x00, 0x00, 0xCE, -/* 000035E0 */ 0x12, 0x00, 0x00, 0xFA, 0x12, 0x00, 0x00, 0xFA, 0x12, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, -/* 000035F0 */ 0x13, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x2D, 0x13, 0x00, 0x00, 0x2D, -/* 00003600 */ 0x13, 0x00, 0x00, 0x34, 0x13, 0x00, 0x00, 0x34, 0x13, 0x00, 0x00, 0x35, 0x13, 0x00, 0x00, 0x35, -/* 00003610 */ 0x13, 0x00, 0x00, 0x6C, 0x13, 0x00, 0x00, 0x6C, 0x13, 0x00, 0x00, 0xAC, 0x13, 0x00, 0x00, 0xAC, -/* 00003620 */ 0x13, 0x00, 0x00, 0xCB, 0x13, 0x00, 0x00, 0xCB, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0xEB, -/* 00003630 */ 0x13, 0x00, 0x00, 0x13, 0x14, 0x00, 0x00, 0x13, 0x14, 0x00, 0x00, 0x21, 0x14, 0x00, 0x00, 0x21, -/* 00003640 */ 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x87, 0x14, 0x00, 0x00, 0x87, -/* 00003650 */ 0x14, 0x00, 0x00, 0x98, 0x14, 0x00, 0x00, 0x98, 0x14, 0x00, 0x00, 0xB3, 0x14, 0x00, 0x00, 0xB3, -/* 00003660 */ 0x14, 0x00, 0x00, 0xBD, 0x14, 0x00, 0x00, 0xBD, 0x14, 0x00, 0x00, 0xC4, 0x14, 0x00, 0x00, 0xC4, -/* 00003670 */ 0x14, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, -/* 00003680 */ 0x14, 0x00, 0x00, 0x18, 0x15, 0x00, 0x00, 0x18, 0x15, 0x00, 0x00, 0x3B, 0x15, 0x00, 0x00, 0x3B, -/* 00003690 */ 0x15, 0x00, 0x00, 0x5D, 0x15, 0x00, 0x00, 0x5D, 0x15, 0x00, 0x00, 0x81, 0x15, 0x00, 0x00, 0x81, -/* 000036A0 */ 0x15, 0x00, 0x00, 0x8F, 0x15, 0x00, 0x00, 0x8F, 0x15, 0x00, 0x00, 0xA6, 0x15, 0x00, 0x00, 0xA6, -/* 000036B0 */ 0x15, 0x00, 0x00, 0xB0, 0x15, 0x00, 0x00, 0xB0, 0x15, 0x00, 0x00, 0xB7, 0x15, 0x00, 0x00, 0xB7, -/* 000036C0 */ 0x15, 0x00, 0x00, 0xB8, 0x15, 0x00, 0x00, 0xB8, 0x15, 0x00, 0x00, 0x1D, 0x16, 0x00, 0x00, 0x1D, -/* 000036D0 */ 0x16, 0x00, 0x00, 0x49, 0x16, 0x00, 0x00, 0x49, 0x16, 0x00, 0x00, 0x8F, 0x16, 0x00, 0x00, 0x8F, -/* 000036E0 */ 0x16, 0x00, 0x00, 0xA5, 0x16, 0x00, 0x00, 0xA5, 0x16, 0x00, 0x00, 0xAF, 0x16, 0x00, 0x00, 0xAF, -/* 000036F0 */ 0x16, 0x00, 0x00, 0xB6, 0x16, 0x00, 0x00, 0xB6, 0x16, 0x00, 0x00, 0xB7, 0x16, 0x00, 0x00, 0xB7, -/* 00003700 */ 0x16, 0x00, 0x00, 0xE8, 0x16, 0x00, 0x00, 0xE8, 0x16, 0x00, 0x00, 0x1F, 0x17, 0x00, 0x00, 0x1F, -/* 00003710 */ 0x17, 0x00, 0x00, 0x26, 0x17, 0x00, 0x00, 0x26, 0x17, 0x00, 0x00, 0x27, 0x17, 0x00, 0x00, 0x27, -/* 00003720 */ 0x17, 0x00, 0x00, 0x69, 0x17, 0x00, 0x00, 0x69, 0x17, 0x00, 0x00, 0xAF, 0x17, 0x00, 0x00, 0xAF, -/* 00003730 */ 0x17, 0x00, 0x00, 0xDB, 0x17, 0x00, 0x00, 0xDB, 0x17, 0x00, 0x00, 0x1F, 0x18, 0x00, 0x00, 0x1F, -/* 00003740 */ 0x18, 0x00, 0x00, 0x4A, 0x18, 0x00, 0x00, 0x4A, 0x18, 0x00, 0x00, 0x73, 0x18, 0x00, 0x00, 0x73, -/* 00003750 */ 0x18, 0x00, 0x00, 0x9F, 0x18, 0x00, 0x00, 0x9F, 0x18, 0x00, 0x00, 0xB1, 0x18, 0x00, 0x00, 0xB1, -/* 00003760 */ 0x18, 0x00, 0x00, 0x03, 0x19, 0x00, 0x00, 0x03, 0x19, 0x00, 0x00, 0x78, 0x19, 0x00, 0x00, 0x78, -/* 00003770 */ 0x19, 0x00, 0x00, 0x86, 0x19, 0x00, 0x00, 0x86, 0x19, 0x00, 0x00, 0xD1, 0x19, 0x00, 0x00, 0xD1, -/* 00003780 */ 0x19, 0x00, 0x00, 0x13, 0x1A, 0x00, 0x00, 0x13, 0x1A, 0x00, 0x00, 0x83, 0x1A, 0x00, 0x00, 0x83, -/* 00003790 */ 0x1A, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0xB6, 0x1A, 0x00, 0x00, 0xDE, 0x1A, 0x00, 0x00, 0xDE, -/* 000037A0 */ 0x1A, 0x00, 0x00, 0xE8, 0x1A, 0x00, 0x00, 0xE8, 0x1A, 0x00, 0x00, 0xE9, 0x1A, 0x00, 0x00, 0xE9, -/* 000037B0 */ 0x1A, 0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x11, 0x1B, 0x00, 0x00, 0x34, 0x1B, 0x00, 0x00, 0x34, -/* 000037C0 */ 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0x89, 0x1B, 0x00, 0x00, 0x89, -/* 000037D0 */ 0x1B, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0x9A, 0x1B, 0x00, 0x00, 0xBD, 0x1B, 0x00, 0x00, 0xBD, -/* 000037E0 */ 0x1B, 0x00, 0x00, 0xC7, 0x1B, 0x00, 0x00, 0xC7, 0x1B, 0x00, 0x00, 0xCD, 0x1B, 0x00, 0x00, 0xCD, -/* 000037F0 */ 0x1B, 0x00, 0x00, 0xCE, 0x1B, 0x00, 0x00, 0xCE, 0x1B, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, -/* 00003800 */ 0x1C, 0x00, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x8D, 0x1C, 0x00, 0x00, 0x8D, -/* 00003810 */ 0x1C, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0xDE, 0x1C, 0x00, 0x00, 0x09, 0x1D, 0x00, 0x00, 0x09, -/* 00003820 */ 0x1D, 0x00, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x5E, 0x1D, 0x00, 0x00, 0x5E, -/* 00003830 */ 0x1D, 0x00, 0x00, 0x70, 0x1D, 0x00, 0x00, 0x70, 0x1D, 0x00, 0x00, 0xD0, 0x1D, 0x00, 0x00, 0xD0, -/* 00003840 */ 0x1D, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x00, 0x4B, 0x1E, 0x00, 0x00, 0x4B, -/* 00003850 */ 0x1E, 0x00, 0x00, 0x84, 0x1E, 0x00, 0x00, 0x84, 0x1E, 0x00, 0x00, 0xBE, 0x1E, 0x00, 0x00, 0xBE, -/* 00003860 */ 0x1E, 0x00, 0x00, 0xCC, 0x1E, 0x00, 0x00, 0xCC, 0x1E, 0x00, 0x00, 0x17, 0x1F, 0x00, 0x00, 0x17, -/* 00003870 */ 0x1F, 0x00, 0x00, 0x59, 0x1F, 0x00, 0x00, 0x59, 0x1F, 0x00, 0x00, 0xD6, 0x1F, 0x00, 0x00, 0xD6, -/* 00003880 */ 0x1F, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x31, 0x20, 0x00, 0x00, 0x31, -/* 00003890 */ 0x20, 0x00, 0x00, 0x3B, 0x20, 0x00, 0x00, 0x3B, 0x20, 0x00, 0x00, 0x5A, 0x20, 0x00, 0x00, 0x5A, -/* 000038A0 */ 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x61, -/* 000038B0 */ 0x20, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0xB3, 0x20, 0x00, 0x00, 0xB3, -/* 000038C0 */ 0x20, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0xE1, 0x20, 0x00, 0x00, 0xE1, -/* 000038D0 */ 0x20, 0x00, 0x00, 0xE2, 0x20, 0x00, 0x00, 0xE2, 0x20, 0x00, 0x00, 0x2D, 0x21, 0x00, 0x00, 0x2D, -/* 000038E0 */ 0x21, 0x00, 0x00, 0x43, 0x21, 0x00, 0x00, 0x43, 0x21, 0x00, 0x00, 0x61, 0x21, 0x00, 0x00, 0x61, -/* 000038F0 */ 0x21, 0x00, 0x00, 0x6B, 0x21, 0x00, 0x00, 0x6B, 0x21, 0x00, 0x00, 0x6C, 0x21, 0x00, 0x00, 0x6C, -/* 00003900 */ 0x21, 0x00, 0x00, 0xE1, 0x21, 0x00, 0x00, 0xE1, 0x21, 0x00, 0x00, 0x31, 0x22, 0x00, 0x00, 0x31, -/* 00003910 */ 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x00, 0x77, 0x22, 0x00, 0x00, 0x77, -/* 00003920 */ 0x22, 0x00, 0x00, 0xEA, 0x22, 0x00, 0x00, 0xEA, 0x22, 0x00, 0x00, 0x03, 0x23, 0x00, 0x00, 0x03, -/* 00003930 */ 0x23, 0x00, 0x00, 0x27, 0x23, 0x00, 0x00, 0x27, 0x23, 0x00, 0x00, 0x4B, 0x23, 0x00, 0x00, 0x4B, -/* 00003940 */ 0x23, 0x00, 0x00, 0xA3, 0x23, 0x00, 0x00, 0xA3, 0x23, 0x00, 0x00, 0xE6, 0x23, 0x00, 0x00, 0xE6, -/* 00003950 */ 0x23, 0x00, 0x00, 0x6F, 0x24, 0x00, 0x00, 0x6F, 0x24, 0x00, 0x00, 0x70, 0x24, 0x00, 0x00, 0x70, -/* 00003960 */ 0x24, 0x00, 0x00, 0x8B, 0x24, 0x00, 0x00, 0x8B, 0x24, 0x00, 0x00, 0x91, 0x24, 0x00, 0x00, 0x91, -/* 00003970 */ 0x24, 0x00, 0x00, 0x92, 0x24, 0x00, 0x00, 0x92, 0x24, 0x00, 0x00, 0xEC, 0x24, 0x00, 0x00, 0xEC, -/* 00003980 */ 0x24, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x42, 0x25, 0x00, 0x00, 0x42, -/* 00003990 */ 0x25, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x00, 0xD2, 0x25, 0x00, 0x00, 0xD2, -/* 000039A0 */ 0x25, 0x00, 0x00, 0xDC, 0x25, 0x00, 0x00, 0xDC, 0x25, 0x00, 0x00, 0xDD, 0x25, 0x00, 0x00, 0xDD, -/* 000039B0 */ 0x25, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0xF4, 0x25, 0x00, 0x00, 0x44, 0x26, 0x00, 0x00, 0x44, -/* 000039C0 */ 0x26, 0x00, 0x00, 0xA0, 0x26, 0x00, 0x00, 0xA0, 0x26, 0x00, 0x00, 0xB0, 0x26, 0x00, 0x00, 0xB0, -/* 000039D0 */ 0x26, 0x00, 0x00, 0xBA, 0x26, 0x00, 0x00, 0xBA, 0x26, 0x00, 0x00, 0xBB, 0x26, 0x00, 0x00, 0xBB, -/* 000039E0 */ 0x26, 0x00, 0x00, 0x4A, 0x27, 0x00, 0x00, 0x4A, 0x27, 0x00, 0x00, 0xD0, 0x27, 0x00, 0x00, 0xD0, -/* 000039F0 */ 0x27, 0x00, 0x00, 0x4B, 0x28, 0x00, 0x00, 0x4B, 0x28, 0x00, 0x00, 0x94, 0x28, 0x00, 0x00, 0x94, -/* 00003A00 */ 0x28, 0x00, 0x00, 0xCA, 0x28, 0x00, 0x00, 0xCA, 0x28, 0x00, 0x00, 0xCB, 0x28, 0x00, 0x00, 0xCB, -/* 00003A10 */ 0x28, 0x00, 0x00, 0x17, 0x29, 0x00, 0x00, 0x17, 0x29, 0x00, 0x00, 0x36, 0x29, 0x00, 0x00, 0x36, -/* 00003A20 */ 0x29, 0x00, 0x00, 0x87, 0x29, 0x00, 0x00, 0x87, 0x29, 0x00, 0x00, 0x01, 0x2A, 0x00, 0x00, 0x01, -/* 00003A30 */ 0x2A, 0x00, 0x00, 0x25, 0x2A, 0x00, 0x00, 0x25, 0x2A, 0x00, 0x00, 0x80, 0x2A, 0x00, 0x00, 0x80, -/* 00003A40 */ 0x2A, 0x00, 0x00, 0xCB, 0x2A, 0x00, 0x00, 0xCB, 0x2A, 0x00, 0x00, 0xDD, 0x2A, 0x00, 0x00, 0xDD, -/* 00003A50 */ 0x2A, 0x00, 0x00, 0xEE, 0x2A, 0x00, 0x00, 0xEE, 0x2A, 0x00, 0x00, 0x0E, 0x2B, 0x00, 0x00, 0x0E, -/* 00003A60 */ 0x2B, 0x00, 0x00, 0x18, 0x2B, 0x00, 0x00, 0x18, 0x2B, 0x00, 0x00, 0x19, 0x2B, 0x00, 0x00, 0x19, -/* 00003A70 */ 0x2B, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0x88, 0x2B, 0x00, 0x00, 0xB6, 0x2B, 0x00, 0x00, 0xB6, -/* 00003A80 */ 0x2B, 0x00, 0x00, 0xEB, 0x2B, 0x00, 0x00, 0xEB, 0x2B, 0x00, 0x00, 0x14, 0x2C, 0x00, 0x00, 0x14, -/* 00003A90 */ 0x2C, 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x00, 0x66, 0x2C, 0x00, 0x00, 0x66, -/* 00003AA0 */ 0x2C, 0x00, 0x00, 0x90, 0x2C, 0x00, 0x00, 0x90, 0x2C, 0x00, 0x00, 0xB5, 0x2C, 0x00, 0x00, 0xB5, -/* 00003AB0 */ 0x2C, 0x00, 0x00, 0xCE, 0x2C, 0x00, 0x00, 0xCE, 0x2C, 0x00, 0x00, 0xF5, 0x2C, 0x00, 0x00, 0xF5, -/* 00003AC0 */ 0x2C, 0x00, 0x00, 0x07, 0x2D, 0x00, 0x00, 0x07, 0x2D, 0x00, 0x00, 0x15, 0x2D, 0x00, 0x00, 0x15, -/* 00003AD0 */ 0x2D, 0x00, 0x00, 0x16, 0x2D, 0x00, 0x00, 0x16, 0x2D, 0x00, 0x00, 0x61, 0x2D, 0x00, 0x00, 0x61, -/* 00003AE0 */ 0x2D, 0x00, 0x00, 0x72, 0x2D, 0x00, 0x00, 0x72, 0x2D, 0x00, 0x00, 0x94, 0x2D, 0x00, 0x00, 0x94, -/* 00003AF0 */ 0x2D, 0x00, 0x00, 0x9E, 0x2D, 0x00, 0x00, 0x9E, 0x2D, 0x00, 0x00, 0x9F, 0x2D, 0x00, 0x00, 0x9F, -/* 00003B00 */ 0x2D, 0x00, 0x00, 0xBD, 0x2D, 0x00, 0x00, 0xBD, 0x2D, 0x00, 0x00, 0xDB, 0x2D, 0x00, 0x00, 0xDB, -/* 00003B10 */ 0x2D, 0x00, 0x00, 0xF9, 0x2D, 0x00, 0x00, 0xF9, 0x2D, 0x00, 0x00, 0x2A, 0x2E, 0x00, 0x00, 0x2A, -/* 00003B20 */ 0x2E, 0x00, 0x00, 0x3C, 0x2E, 0x00, 0x00, 0x3C, 0x2E, 0x00, 0x00, 0x42, 0x2E, 0x00, 0x00, 0x42, -/* 00003B30 */ 0x2E, 0x00, 0x00, 0x43, 0x2E, 0x00, 0x00, 0x43, 0x2E, 0x00, 0x00, 0xA3, 0x2E, 0x00, 0x00, 0xA3, -/* 00003B40 */ 0x2E, 0x00, 0x00, 0xFB, 0x2E, 0x00, 0x00, 0xFB, 0x2E, 0x00, 0x00, 0x2E, 0x2F, 0x00, 0x00, 0x2E, -/* 00003B50 */ 0x2F, 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x00, 0x60, 0x2F, 0x00, 0x00, 0x60, -/* 00003B60 */ 0x2F, 0x00, 0x00, 0x61, 0x2F, 0x00, 0x00, 0x61, 0x2F, 0x00, 0x00, 0x95, 0x2F, 0x00, 0x00, 0x95, -/* 00003B70 */ 0x2F, 0x00, 0x00, 0xC0, 0x2F, 0x00, 0x00, 0xC0, 0x2F, 0x00, 0x00, 0x29, 0x30, 0x00, 0x00, 0x29, -/* 00003B80 */ 0x30, 0x00, 0x00, 0x5A, 0x30, 0x00, 0x00, 0x5A, 0x30, 0x00, 0x00, 0x7B, 0x30, 0x00, 0x00, 0x7B, -/* 00003B90 */ 0x30, 0x00, 0x00, 0x89, 0x30, 0x00, 0x00, 0x89, 0x30, 0x00, 0x00, 0x93, 0x30, 0x00, 0x00, 0x93, -/* 00003BA0 */ 0x30, 0x00, 0x00, 0xE8, 0x30, 0x00, 0x00, 0xE8, 0x30, 0x00, 0x00, 0xEE, 0x30, 0x00, 0x00, 0xEE, -/* 00003BB0 */ 0x30, 0x00, 0x00, 0xEF, 0x30, 0x00, 0x00, 0xEF, 0x30, 0x00, 0x00, 0x32, 0x31, 0x00, 0x00, 0x32, -/* 00003BC0 */ 0x31, 0x00, 0x00, 0x5F, 0x31, 0x00, 0x00, 0x5F, 0x31, 0x00, 0x00, 0x8D, 0x31, 0x00, 0x00, 0x8D, -/* 00003BD0 */ 0x31, 0x00, 0x00, 0xB4, 0x31, 0x00, 0x00, 0xB4, 0x31, 0x00, 0x00, 0xE0, 0x31, 0x00, 0x00, 0xE0, -/* 00003BE0 */ 0x31, 0x00, 0x00, 0xEA, 0x31, 0x00, 0x00, 0xEA, 0x31, 0x00, 0x00, 0xEB, 0x31, 0x00, 0x00, 0xEB, -/* 00003BF0 */ 0x31, 0x00, 0x00, 0x0D, 0x32, 0x00, 0x00, 0x0D, 0x32, 0x00, 0x00, 0x32, 0x32, 0x00, 0x00, 0x32, -/* 00003C00 */ 0x32, 0x00, 0x00, 0x5A, 0x32, 0x00, 0x00, 0x5A, 0x32, 0x00, 0x00, 0x68, 0x32, 0x00, 0x00, 0x68, -/* 00003C10 */ 0x32, 0x00, 0x00, 0x69, 0x32, 0x00, 0x00, 0x69, 0x32, 0x00, 0x00, 0x95, 0x32, 0x00, 0x00, 0x95, -/* 00003C20 */ 0x32, 0x00, 0x00, 0xE2, 0x32, 0x00, 0x00, 0xE2, 0x32, 0x00, 0x00, 0xFB, 0x32, 0x00, 0x00, 0xFB, -/* 00003C30 */ 0x32, 0x00, 0x00, 0x39, 0x33, 0x00, 0x00, 0x39, 0x33, 0x00, 0x00, 0x6D, 0x33, 0x00, 0x00, 0x6D, -/* 00003C40 */ 0x33, 0x00, 0x00, 0x82, 0x33, 0x00, 0x00, 0x82, 0x33, 0x00, 0x00, 0xB1, 0x33, 0x00, 0x00, 0xB1, -/* 00003C50 */ 0x33, 0x00, 0x00, 0xBF, 0x33, 0x00, 0x00, 0xBF, 0x33, 0x00, 0x00, 0xD0, 0x33, 0x00, 0x00, 0xD0, -/* 00003C60 */ 0x33, 0x00, 0x00, 0x21, 0x34, 0x00, 0x00, 0x21, 0x34, 0x00, 0x00, 0x51, 0x34, 0x00, 0x00, 0x51, -/* 00003C70 */ 0x34, 0x00, 0x00, 0xB7, 0x34, 0x00, 0x00, 0xB7, 0x34, 0x00, 0x00, 0xC1, 0x34, 0x00, 0x00, 0xC1, -/* 00003C80 */ 0x34, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0xEA, 0x34, 0x00, 0x00, 0xEA, -/* 00003C90 */ 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF2, 0x34, 0x00, 0x00, 0xF2, -/* 00003CA0 */ 0x34, 0x00, 0x00, 0x14, 0x35, 0x00, 0x00, 0x14, 0x35, 0x00, 0x00, 0x32, 0x35, 0x00, 0x00, 0x32, -/* 00003CB0 */ 0x35, 0x00, 0x00, 0x57, 0x35, 0x00, 0x00, 0x57, 0x35, 0x00, 0x00, 0x79, 0x35, 0x00, 0x00, 0x79, -/* 00003CC0 */ 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xBB, 0x35, 0x00, 0x00, 0xBB, -/* 00003CD0 */ 0x35, 0x00, 0x00, 0xFB, 0x35, 0x00, 0x00, 0xFB, 0x35, 0x00, 0x00, 0x0A, 0x36, 0x00, 0x00, 0x0A, -/* 00003CE0 */ 0x36, 0x00, 0x00, 0x0B, 0x36, 0x00, 0x00, 0x0B, 0x36, 0x00, 0x00, 0x30, 0x36, 0x00, 0x00, 0x30, -/* 00003CF0 */ 0x36, 0x00, 0x00, 0x70, 0x36, 0x00, 0x00, 0x70, 0x36, 0x00, 0x00, 0x7F, 0x36, 0x00, 0x00, 0x7F, -/* 00003D00 */ 0x36, 0x00, 0x00, 0x80, 0x36, 0x00, 0x00, 0x80, 0x36, 0x00, 0x00, 0xA5, 0x36, 0x00, 0x00, 0xA5, -/* 00003D10 */ 0x36, 0x00, 0x00, 0xDF, 0x36, 0x00, 0x00, 0xDF, 0x36, 0x00, 0x00, 0xEE, 0x36, 0x00, 0x00, 0xEE, -/* 00003D20 */ 0x36, 0x00, 0x00, 0xEF, 0x36, 0x00, 0x00, 0xEF, 0x36, 0x00, 0x00, 0x1C, 0x37, 0x00, 0x00, 0x1C, -/* 00003D30 */ 0x37, 0x00, 0x00, 0x5D, 0x37, 0x00, 0x00, 0x5D, 0x37, 0x00, 0x00, 0x6C, 0x37, 0x00, 0x00, 0x6C, -/* 00003D40 */ 0x37, 0x00, 0x00, 0x6D, 0x37, 0x00, 0x00, 0x6D, 0x37, 0x00, 0x00, 0x92, 0x37, 0x00, 0x00, 0x92, -/* 00003D50 */ 0x37, 0x00, 0x00, 0xB7, 0x37, 0x00, 0x00, 0xB7, 0x37, 0x00, 0x00, 0xD4, 0x37, 0x00, 0x00, 0xD4, -/* 00003D60 */ 0x37, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x43, 0x38, 0x00, 0x00, 0x43, -/* 00003D70 */ 0x38, 0x00, 0x00, 0x55, 0x38, 0x00, 0x00, 0x55, 0x38, 0x00, 0x00, 0x71, 0x38, 0x00, 0x00, 0x71, -/* 00003D80 */ 0x38, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x81, 0x38, 0x00, 0x00, 0x81, -/* 00003D90 */ 0x38, 0x00, 0x00, 0xAC, 0x38, 0x00, 0x00, 0xAC, 0x38, 0x00, 0x00, 0xD8, 0x38, 0x00, 0x00, 0xD8, -/* 00003DA0 */ 0x38, 0x00, 0x00, 0xF4, 0x38, 0x00, 0x00, 0xF4, 0x38, 0x00, 0x00, 0x44, 0x39, 0x00, 0x00, 0x44, -/* 00003DB0 */ 0x39, 0x00, 0x00, 0x69, 0x39, 0x00, 0x00, 0x69, 0x39, 0x00, 0x00, 0x7F, 0x39, 0x00, 0x00, 0x7F, -/* 00003DC0 */ 0x39, 0x00, 0x00, 0xB0, 0x39, 0x00, 0x00, 0xB0, 0x39, 0x00, 0x00, 0xC2, 0x39, 0x00, 0x00, 0xC2, -/* 00003DD0 */ 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0xE1, 0x39, 0x00, 0x00, 0xE1, -/* 00003DE0 */ 0x39, 0x00, 0x00, 0xEB, 0x39, 0x00, 0x00, 0xEB, 0x39, 0x00, 0x00, 0xEC, 0x39, 0x00, 0x00, 0xEC, -/* 00003DF0 */ 0x39, 0x00, 0x00, 0x13, 0x3A, 0x00, 0x00, 0x13, 0x3A, 0x00, 0x00, 0x57, 0x3A, 0x00, 0x00, 0x57, -/* 00003E00 */ 0x3A, 0x00, 0x00, 0x7E, 0x3A, 0x00, 0x00, 0x7E, 0x3A, 0x00, 0x00, 0x7F, 0x3A, 0x00, 0x00, 0x7F, -/* 00003E10 */ 0x3A, 0x00, 0x00, 0xA2, 0x3A, 0x00, 0x00, 0xA2, 0x3A, 0x00, 0x00, 0xC7, 0x3A, 0x00, 0x00, 0xC7, -/* 00003E20 */ 0x3A, 0x00, 0x00, 0x01, 0x3B, 0x00, 0x00, 0x01, 0x3B, 0x00, 0x00, 0x0F, 0x3B, 0x00, 0x00, 0x0F, -/* 00003E30 */ 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x34, 0x3B, 0x00, 0x00, 0x34, -/* 00003E40 */ 0x3B, 0x00, 0x00, 0x66, 0x3B, 0x00, 0x00, 0x66, 0x3B, 0x00, 0x00, 0x74, 0x3B, 0x00, 0x00, 0x74, -/* 00003E50 */ 0x3B, 0x00, 0x00, 0x75, 0x3B, 0x00, 0x00, 0x75, 0x3B, 0x00, 0x00, 0x99, 0x3B, 0x00, 0x00, 0x99, -/* 00003E60 */ 0x3B, 0x00, 0x00, 0xCB, 0x3B, 0x00, 0x00, 0xCB, 0x3B, 0x00, 0x00, 0xD9, 0x3B, 0x00, 0x00, 0xD9, -/* 00003E70 */ 0x3B, 0x00, 0x00, 0xDA, 0x3B, 0x00, 0x00, 0xDA, 0x3B, 0x00, 0x00, 0x41, 0x3C, 0x00, 0x00, 0x41, -/* 00003E80 */ 0x3C, 0x00, 0x00, 0xDC, 0x3C, 0x00, 0x00, 0xDC, 0x3C, 0x00, 0x00, 0xEA, 0x3C, 0x00, 0x00, 0xEA, -/* 00003E90 */ 0x3C, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0x00, 0x05, 0x3D, 0x00, 0x00, 0x05, -/* 00003EA0 */ 0x3D, 0x00, 0x00, 0x0F, 0x3D, 0x00, 0x00, 0x0F, 0x3D, 0x00, 0x00, 0x10, 0x3D, 0x00, 0x00, 0x10, -/* 00003EB0 */ 0x3D, 0x00, 0x00, 0x29, 0x3D, 0x00, 0x00, 0x29, 0x3D, 0x00, 0x00, 0x2F, 0x3D, 0x00, 0x00, 0x2F, -/* 00003EC0 */ 0x3D, 0x00, 0x00, 0x30, 0x3D, 0x00, 0x00, 0x30, 0x3D, 0x00, 0x00, 0x7E, 0x3D, 0x00, 0x00, 0x7E, -/* 00003ED0 */ 0x3D, 0x00, 0x00, 0xAA, 0x3D, 0x00, 0x00, 0xAA, 0x3D, 0x00, 0x00, 0xAB, 0x3D, 0x00, 0x00, 0xAB, -/* 00003EE0 */ 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0x1A, 0x3E, 0x00, 0x00, 0x1A, -/* 00003EF0 */ 0x3E, 0x00, 0x00, 0x1B, 0x3E, 0x00, 0x00, 0x1B, 0x3E, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0x7C, -/* 00003F00 */ 0x3E, 0x00, 0x00, 0xFE, 0x3E, 0x00, 0x00, 0xFE, 0x3E, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x00, 0x0C, -/* 00003F10 */ 0x3F, 0x00, 0x00, 0x0D, 0x3F, 0x00, 0x00, 0x0D, 0x3F, 0x00, 0x00, 0x3C, 0x3F, 0x00, 0x00, 0x3C, -/* 00003F20 */ 0x3F, 0x00, 0x00, 0x4D, 0x3F, 0x00, 0x00, 0x4D, 0x3F, 0x00, 0x00, 0x6A, 0x3F, 0x00, 0x00, 0x6A, -/* 00003F30 */ 0x3F, 0x00, 0x00, 0x74, 0x3F, 0x00, 0x00, 0x74, 0x3F, 0x00, 0x00, 0x7A, 0x3F, 0x00, 0x00, 0x7A, -/* 00003F40 */ 0x3F, 0x00, 0x00, 0x7B, 0x3F, 0x00, 0x00, 0x7B, 0x3F, 0x00, 0x00, 0x95, 0x3F, 0x00, 0x00, 0x95, -/* 00003F50 */ 0x3F, 0x00, 0x00, 0xBF, 0x3F, 0x00, 0x00, 0xBF, 0x3F, 0x00, 0x00, 0xE9, 0x3F, 0x00, 0x00, 0xE9, -/* 00003F60 */ 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xF0, -/* 00003F70 */ 0x3F, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x74, 0x40, 0x00, 0x00, 0x74, -/* 00003F80 */ 0x40, 0x00, 0x00, 0xD2, 0x40, 0x00, 0x00, 0xD2, 0x40, 0x00, 0x00, 0xF8, 0x40, 0x00, 0x00, 0xF8, -/* 00003F90 */ 0x40, 0x00, 0x00, 0x3D, 0x41, 0x00, 0x00, 0x3D, 0x41, 0x00, 0x00, 0xA1, 0x41, 0x00, 0x00, 0xA1, -/* 00003FA0 */ 0x41, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x21, 0x42, 0x00, 0x00, 0x22, 0x42, 0x00, 0x00, 0x22, -/* 00003FB0 */ 0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0xC5, 0x42, 0x00, 0x00, 0xC5, -/* 00003FC0 */ 0x42, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x66, 0x43, 0x00, 0x00, 0x66, -/* 00003FD0 */ 0x43, 0x00, 0x00, 0xBA, 0x43, 0x00, 0x00, 0xBA, 0x43, 0x00, 0x00, 0xF2, 0x43, 0x00, 0x00, 0xF2, -/* 00003FE0 */ 0x43, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x96, 0x44, 0x00, 0x00, 0x96, -/* 00003FF0 */ 0x44, 0x00, 0x00, 0xEB, 0x44, 0x00, 0x00, 0xEB, 0x44, 0x00, 0x00, 0x57, 0x45, 0x00, 0x00, 0x57, -/* 00004000 */ 0x45, 0x00, 0x00, 0xAD, 0x45, 0x00, 0x00, 0xAD, 0x45, 0x00, 0x00, 0xAE, 0x45, 0x00, 0x00, 0xAE, -/* 00004010 */ 0x45, 0x00, 0x00, 0xCD, 0x45, 0x00, 0x00, 0xCD, 0x45, 0x00, 0x00, 0xEC, 0x45, 0x00, 0x00, 0xEC, -/* 00004020 */ 0x45, 0x00, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x1F, 0x46, 0x00, 0x00, 0x1F, -/* 00004030 */ 0x46, 0x00, 0x00, 0x96, 0x46, 0x00, 0x00, 0x96, 0x46, 0x00, 0x00, 0x03, 0x47, 0x00, 0x00, 0x03, -/* 00004040 */ 0x47, 0x00, 0x00, 0x56, 0x47, 0x00, 0x00, 0x56, 0x47, 0x00, 0x00, 0x99, 0x47, 0x00, 0x00, 0x99, -/* 00004050 */ 0x47, 0x00, 0x00, 0x9A, 0x47, 0x00, 0x00, 0x9A, 0x47, 0x00, 0x00, 0x17, 0x48, 0x00, 0x00, 0x17, -/* 00004060 */ 0x48, 0x00, 0x00, 0xAB, 0x48, 0x00, 0x00, 0xAB, 0x48, 0x00, 0x00, 0x2E, 0x49, 0x00, 0x00, 0x2E, -/* 00004070 */ 0x49, 0x00, 0x00, 0xB1, 0x49, 0x00, 0x00, 0xB1, 0x49, 0x00, 0x00, 0x24, 0x4A, 0x00, 0x00, 0x24, -/* 00004080 */ 0x4A, 0x00, 0x00, 0x25, 0x4A, 0x00, 0x00, 0x25, 0x4A, 0x00, 0x00, 0x8F, 0x4A, 0x00, 0x00, 0x8F, -/* 00004090 */ 0x4A, 0x00, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x09, 0x4B, 0x00, 0x00, 0x09, -/* 000040A0 */ 0x4B, 0x00, 0x00, 0x6C, 0x4B, 0x00, 0x00, 0x6C, 0x4B, 0x00, 0x00, 0xFB, 0x4B, 0x00, 0x00, 0xFB, -/* 000040B0 */ 0x4B, 0x00, 0x00, 0xA4, 0x4C, 0x00, 0x00, 0xA4, 0x4C, 0x00, 0x00, 0x38, 0x4D, 0x00, 0x00, 0x38, -/* 000040C0 */ 0x4D, 0x00, 0x00, 0xCF, 0x4D, 0x00, 0x00, 0xCF, 0x4D, 0x00, 0x00, 0x73, 0x4E, 0x00, 0x00, 0x73, -/* 000040D0 */ 0x4E, 0x00, 0x00, 0x87, 0x4E, 0x00, 0x00, 0x87, 0x4E, 0x00, 0x00, 0x88, 0x4E, 0x00, 0x00, 0x88, -/* 000040E0 */ 0x4E, 0x00, 0x00, 0x09, 0x4F, 0x00, 0x00, 0x09, 0x4F, 0x00, 0x00, 0x75, 0x4F, 0x00, 0x00, 0x75, -/* 000040F0 */ 0x4F, 0x00, 0x00, 0xE5, 0x4F, 0x00, 0x00, 0xE5, 0x4F, 0x00, 0x00, 0x55, 0x50, 0x00, 0x00, 0x55, -/* 00004100 */ 0x50, 0x00, 0x00, 0xC7, 0x50, 0x00, 0x00, 0xC7, 0x50, 0x00, 0x00, 0x3B, 0x51, 0x00, 0x00, 0x3B, -/* 00004110 */ 0x51, 0x00, 0x00, 0xAF, 0x51, 0x00, 0x00, 0xAF, 0x51, 0x00, 0x00, 0xF9, 0x51, 0x00, 0x00, 0xF9, -/* 00004120 */ 0x51, 0x00, 0x00, 0xFA, 0x51, 0x00, 0x00, 0xFA, 0x51, 0x00, 0x00, 0x67, 0x52, 0x00, 0x00, 0x67, -/* 00004130 */ 0x52, 0x00, 0x00, 0x68, 0x52, 0x00, 0x00, 0x68, 0x52, 0x00, 0x00, 0xCE, 0x52, 0x00, 0x00, 0xCE, -/* 00004140 */ 0x52, 0x00, 0x00, 0x59, 0x53, 0x00, 0x00, 0x59, 0x53, 0x00, 0x00, 0xCF, 0x53, 0x00, 0x00, 0xCF, -/* 00004150 */ 0x53, 0x00, 0x00, 0xD5, 0x53, 0x00, 0x00, 0xD5, 0x53, 0x00, 0x00, 0xD6, 0x53, 0x00, 0x00, 0xD6, -/* 00004160 */ 0x53, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x2C, 0x54, 0x00, 0x00, 0x2C, -/* 00004170 */ 0x54, 0x00, 0x00, 0x2D, 0x54, 0x00, 0x00, 0x2D, 0x54, 0x00, 0x00, 0x4E, 0x54, 0x00, 0x00, 0x4E, -/* 00004180 */ 0x54, 0x00, 0x00, 0x76, 0x54, 0x00, 0x00, 0x76, 0x54, 0x00, 0x00, 0x80, 0x54, 0x00, 0x00, 0x80, -/* 00004190 */ 0x54, 0x00, 0x00, 0x81, 0x54, 0x00, 0x00, 0x81, 0x54, 0x00, 0x00, 0xCD, 0x54, 0x00, 0x00, 0xCD, -/* 000041A0 */ 0x54, 0x00, 0x00, 0xD3, 0x54, 0x00, 0x00, 0xD3, 0x54, 0x00, 0x00, 0xD4, 0x54, 0x00, 0x00, 0xD4, -/* 000041B0 */ 0x54, 0x00, 0x00, 0x4B, 0x55, 0x00, 0x00, 0x4B, 0x55, 0x00, 0x00, 0x7A, 0x55, 0x00, 0x00, 0x7A, -/* 000041C0 */ 0x55, 0x00, 0x00, 0xA8, 0x55, 0x00, 0x00, 0xA8, 0x55, 0x00, 0x00, 0xBF, 0x55, 0x00, 0x00, 0xBF, -/* 000041D0 */ 0x55, 0x00, 0x00, 0xC9, 0x55, 0x00, 0x00, 0xC9, 0x55, 0x00, 0x00, 0xCA, 0x55, 0x00, 0x00, 0xCA, -/* 000041E0 */ 0x55, 0x00, 0x00, 0xF5, 0x55, 0x00, 0x00, 0xF5, 0x55, 0x00, 0x00, 0x16, 0x56, 0x00, 0x00, 0x16, -/* 000041F0 */ 0x56, 0x00, 0x00, 0x20, 0x56, 0x00, 0x00, 0x20, 0x56, 0x00, 0x00, 0x21, 0x56, 0x00, 0x00, 0x21, -/* 00004200 */ 0x56, 0x00, 0x00, 0x4F, 0x56, 0x00, 0x00, 0x4F, 0x56, 0x00, 0x00, 0x89, 0x56, 0x00, 0x00, 0x89, -/* 00004210 */ 0x56, 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0xBF, 0x56, 0x00, 0x00, 0xBF, -/* 00004220 */ 0x56, 0x00, 0x00, 0xD6, 0x56, 0x00, 0x00, 0xD6, 0x56, 0x00, 0x00, 0xD7, 0x56, 0x00, 0x00, 0xD7, -/* 00004230 */ 0x56, 0x00, 0x00, 0x15, 0x57, 0x00, 0x00, 0x15, 0x57, 0x00, 0x00, 0x76, 0x57, 0x00, 0x00, 0x76, -/* 00004240 */ 0x57, 0x00, 0x00, 0xB2, 0x57, 0x00, 0x00, 0xB2, 0x57, 0x00, 0x00, 0xC0, 0x57, 0x00, 0x00, 0xC0, -/* 00004250 */ 0x57, 0x00, 0x00, 0xC1, 0x57, 0x00, 0x00, 0xC1, 0x57, 0x00, 0x00, 0xF2, 0x57, 0x00, 0x00, 0xF2, -/* 00004260 */ 0x57, 0x00, 0x00, 0xF3, 0x57, 0x00, 0x00, 0xF3, 0x57, 0x00, 0x00, 0x24, 0x58, 0x00, 0x00, 0x24, -/* 00004270 */ 0x58, 0x00, 0x00, 0x64, 0x58, 0x00, 0x00, 0x64, 0x58, 0x00, 0x00, 0x72, 0x58, 0x00, 0x00, 0x72, -/* 00004280 */ 0x58, 0x00, 0x00, 0x73, 0x58, 0x00, 0x00, 0x73, 0x58, 0x00, 0x00, 0xA9, 0x58, 0x00, 0x00, 0xA9, -/* 00004290 */ 0x58, 0x00, 0x00, 0xAA, 0x58, 0x00, 0x00, 0xAA, 0x58, 0x00, 0x00, 0x0B, 0x59, 0x00, 0x00, 0x0B, -/* 000042A0 */ 0x59, 0x00, 0x00, 0x4B, 0x59, 0x00, 0x00, 0x4B, 0x59, 0x00, 0x00, 0x59, 0x59, 0x00, 0x00, 0x59, -/* 000042B0 */ 0x59, 0x00, 0x00, 0x65, 0x59, 0x00, 0x00, 0x65, 0x59, 0x00, 0x00, 0x66, 0x59, 0x00, 0x00, 0x66, -/* 000042C0 */ 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x81, 0x59, 0x00, 0x00, 0x81, -/* 000042D0 */ 0x59, 0x00, 0x00, 0x82, 0x59, 0x00, 0x00, 0x82, 0x59, 0x00, 0x00, 0xD1, 0x59, 0x00, 0x00, 0xD1, -/* 000042E0 */ 0x59, 0x00, 0x00, 0xEA, 0x59, 0x00, 0x00, 0xEA, 0x59, 0x00, 0x00, 0x01, 0x5A, 0x00, 0x00, 0x01, -/* 000042F0 */ 0x5A, 0x00, 0x00, 0x56, 0x5A, 0x00, 0x00, 0x56, 0x5A, 0x00, 0x00, 0x68, 0x5A, 0x00, 0x00, 0x68, -/* 00004300 */ 0x5A, 0x00, 0x00, 0xC6, 0x5A, 0x00, 0x00, 0xC6, 0x5A, 0x00, 0x00, 0xED, 0x5A, 0x00, 0x00, 0xED, -/* 00004310 */ 0x5A, 0x00, 0x00, 0x7A, 0x5B, 0x00, 0x00, 0x7A, 0x5B, 0x00, 0x00, 0xA1, 0x5B, 0x00, 0x00, 0xA1, -/* 00004320 */ 0x5B, 0x00, 0x00, 0xB3, 0x5B, 0x00, 0x00, 0xB3, 0x5B, 0x00, 0x00, 0xCE, 0x5B, 0x00, 0x00, 0xCE, -/* 00004330 */ 0x5B, 0x00, 0x00, 0xF5, 0x5B, 0x00, 0x00, 0xF5, 0x5B, 0x00, 0x00, 0x57, 0x5C, 0x00, 0x00, 0x57, -/* 00004340 */ 0x5C, 0x00, 0x00, 0x65, 0x5C, 0x00, 0x00, 0x65, 0x5C, 0x00, 0x00, 0x71, 0x5C, 0x00, 0x00, 0x71, -/* 00004350 */ 0x5C, 0x00, 0x00, 0xD9, 0x5C, 0x00, 0x00, 0xD9, 0x5C, 0x00, 0x00, 0xF0, 0x5C, 0x00, 0x00, 0xF0, -/* 00004360 */ 0x5C, 0x00, 0x00, 0xF6, 0x5C, 0x00, 0x00, 0xF6, 0x5C, 0x00, 0x00, 0xF7, 0x5C, 0x00, 0x00, 0xF7, -/* 00004370 */ 0x5C, 0x00, 0x00, 0x4D, 0x5D, 0x00, 0x00, 0x4D, 0x5D, 0x00, 0x00, 0x80, 0x5D, 0x00, 0x00, 0x80, -/* 00004380 */ 0x5D, 0x00, 0x00, 0xB9, 0x5D, 0x00, 0x00, 0xB9, 0x5D, 0x00, 0x00, 0xC3, 0x5D, 0x00, 0x00, 0xC3, -/* 00004390 */ 0x5D, 0x00, 0x00, 0xC4, 0x5D, 0x00, 0x00, 0xC4, 0x5D, 0x00, 0x00, 0xFC, 0x5D, 0x00, 0x00, 0xFC, -/* 000043A0 */ 0x5D, 0x00, 0x00, 0x37, 0x5E, 0x00, 0x00, 0x37, 0x5E, 0x00, 0x00, 0x70, 0x5E, 0x00, 0x00, 0x70, -/* 000043B0 */ 0x5E, 0x00, 0x00, 0x7A, 0x5E, 0x00, 0x00, 0x7A, 0x5E, 0x00, 0x00, 0x7B, 0x5E, 0x00, 0x00, 0x7B, -/* 000043C0 */ 0x5E, 0x00, 0x00, 0xB0, 0x5E, 0x00, 0x00, 0xB0, 0x5E, 0x00, 0x00, 0xB6, 0x5E, 0x00, 0x00, 0xB6, -/* 000043D0 */ 0x5E, 0x00, 0x00, 0xB7, 0x5E, 0x00, 0x00, 0xB7, 0x5E, 0x00, 0x00, 0x08, 0x5F, 0x00, 0x00, 0x08, -/* 000043E0 */ 0x5F, 0x00, 0x00, 0x3B, 0x5F, 0x00, 0x00, 0x3B, 0x5F, 0x00, 0x00, 0x74, 0x5F, 0x00, 0x00, 0x74, -/* 000043F0 */ 0x5F, 0x00, 0x00, 0x7E, 0x5F, 0x00, 0x00, 0x7E, 0x5F, 0x00, 0x00, 0x7F, 0x5F, 0x00, 0x00, 0x7F, -/* 00004400 */ 0x5F, 0x00, 0x00, 0xB7, 0x5F, 0x00, 0x00, 0xB7, 0x5F, 0x00, 0x00, 0xF2, 0x5F, 0x00, 0x00, 0xF2, -/* 00004410 */ 0x5F, 0x00, 0x00, 0x2B, 0x60, 0x00, 0x00, 0x2B, 0x60, 0x00, 0x00, 0x35, 0x60, 0x00, 0x00, 0x35, -/* 00004420 */ 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x66, -/* 00004430 */ 0x60, 0x00, 0x00, 0x6C, 0x60, 0x00, 0x00, 0x6C, 0x60, 0x00, 0x00, 0x6D, 0x60, 0x00, 0x00, 0x6D, -/* 00004440 */ 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0xD1, 0x60, 0x00, 0x00, 0xD1, -/* 00004450 */ 0x60, 0x00, 0x00, 0xE6, 0x60, 0x00, 0x00, 0xE6, 0x60, 0x00, 0x00, 0x19, 0x61, 0x00, 0x00, 0x19, -/* 00004460 */ 0x61, 0x00, 0x00, 0x1A, 0x61, 0x00, 0x00, 0x1A, 0x61, 0x00, 0x00, 0x48, 0x61, 0x00, 0x00, 0x48, -/* 00004470 */ 0x61, 0x00, 0x00, 0x75, 0x61, 0x00, 0x00, 0x75, 0x61, 0x00, 0x00, 0x76, 0x61, 0x00, 0x00, 0x76, -/* 00004480 */ 0x61, 0x00, 0x00, 0xA8, 0x61, 0x00, 0x00, 0xA8, 0x61, 0x00, 0x00, 0xDE, 0x61, 0x00, 0x00, 0xDE, -/* 00004490 */ 0x61, 0x00, 0x00, 0xDF, 0x61, 0x00, 0x00, 0xDF, 0x61, 0x00, 0x00, 0x25, 0x62, 0x00, 0x00, 0x25, -/* 000044A0 */ 0x62, 0x00, 0x00, 0x9C, 0x62, 0x00, 0x00, 0x9C, 0x62, 0x00, 0x00, 0xAE, 0x62, 0x00, 0x00, 0xAE, -/* 000044B0 */ 0x62, 0x00, 0x00, 0xBC, 0x62, 0x00, 0x00, 0xBC, 0x62, 0x00, 0x00, 0xC6, 0x62, 0x00, 0x00, 0xC6, -/* 000044C0 */ 0x62, 0x00, 0x00, 0xC7, 0x62, 0x00, 0x00, 0xC7, 0x62, 0x00, 0x00, 0x0F, 0x63, 0x00, 0x00, 0x0F, -/* 000044D0 */ 0x63, 0x00, 0x00, 0x91, 0x63, 0x00, 0x00, 0x91, 0x63, 0x00, 0x00, 0xA2, 0x63, 0x00, 0x00, 0xA2, -/* 000044E0 */ 0x63, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x0E, 0x64, 0x00, 0x00, 0x0E, -/* 000044F0 */ 0x64, 0x00, 0x00, 0x15, 0x64, 0x00, 0x00, 0x15, 0x64, 0x00, 0x00, 0x16, 0x64, 0x00, 0x00, 0x16, -/* 00004500 */ 0x64, 0x00, 0x00, 0x52, 0x64, 0x00, 0x00, 0x52, 0x64, 0x00, 0x00, 0xB3, 0x64, 0x00, 0x00, 0xB3, -/* 00004510 */ 0x64, 0x00, 0x00, 0xB4, 0x64, 0x00, 0x00, 0xB4, 0x64, 0x00, 0x00, 0x27, 0x65, 0x00, 0x00, 0x27, -/* 00004520 */ 0x65, 0x00, 0x00, 0x77, 0x65, 0x00, 0x00, 0x77, 0x65, 0x00, 0x00, 0xC8, 0x65, 0x00, 0x00, 0xC8, -/* 00004530 */ 0x65, 0x00, 0x00, 0x4B, 0x66, 0x00, 0x00, 0x4B, 0x66, 0x00, 0x00, 0x8D, 0x66, 0x00, 0x00, 0x8D, -/* 00004540 */ 0x66, 0x00, 0x00, 0xDA, 0x66, 0x00, 0x00, 0xDA, 0x66, 0x00, 0x00, 0x42, 0x67, 0x00, 0x00, 0x42, -/* 00004550 */ 0x67, 0x00, 0x00, 0x68, 0x67, 0x00, 0x00, 0x68, 0x67, 0x00, 0x00, 0x69, 0x67, 0x00, 0x00, 0x69, -/* 00004560 */ 0x67, 0x00, 0x00, 0xC2, 0x67, 0x00, 0x00, 0xC2, 0x67, 0x00, 0x00, 0x4D, 0x68, 0x00, 0x00, 0x4D, -/* 00004570 */ 0x68, 0x00, 0x00, 0x93, 0x68, 0x00, 0x00, 0x93, 0x68, 0x00, 0x00, 0xE0, 0x68, 0x00, 0x00, 0xE0, -/* 00004580 */ 0x68, 0x00, 0x00, 0x4C, 0x69, 0x00, 0x00, 0x4C, 0x69, 0x00, 0x00, 0x72, 0x69, 0x00, 0x00, 0x72, -/* 00004590 */ 0x69, 0x00, 0x00, 0x73, 0x69, 0x00, 0x00, 0x73, 0x69, 0x00, 0x00, 0xD0, 0x69, 0x00, 0x00, 0xD0, -/* 000045A0 */ 0x69, 0x00, 0x00, 0x5F, 0x6A, 0x00, 0x00, 0x5F, 0x6A, 0x00, 0x00, 0xA7, 0x6A, 0x00, 0x00, 0xA7, -/* 000045B0 */ 0x6A, 0x00, 0x00, 0xF4, 0x6A, 0x00, 0x00, 0xF4, 0x6A, 0x00, 0x00, 0x62, 0x6B, 0x00, 0x00, 0x62, -/* 000045C0 */ 0x6B, 0x00, 0x00, 0x88, 0x6B, 0x00, 0x00, 0x88, 0x6B, 0x00, 0x00, 0x89, 0x6B, 0x00, 0x00, 0x89, -/* 000045D0 */ 0x6B, 0x00, 0x00, 0xCA, 0x6B, 0x00, 0x00, 0xCA, 0x6B, 0x00, 0x00, 0x3D, 0x6C, 0x00, 0x00, 0x3D, -/* 000045E0 */ 0x6C, 0x00, 0x00, 0x77, 0x6C, 0x00, 0x00, 0x77, 0x6C, 0x00, 0x00, 0xD2, 0x6C, 0x00, 0x00, 0xD2, -/* 000045F0 */ 0x6C, 0x00, 0x00, 0xF8, 0x6C, 0x00, 0x00, 0xF8, 0x6C, 0x00, 0x00, 0xF9, 0x6C, 0x00, 0x00, 0xF9, -/* 00004600 */ 0x6C, 0x00, 0x00, 0x52, 0x6D, 0x00, 0x00, 0x52, 0x6D, 0x00, 0x00, 0xAC, 0x6D, 0x00, 0x00, 0xAC, -/* 00004610 */ 0x6D, 0x00, 0x00, 0xFB, 0x6D, 0x00, 0x00, 0xFB, 0x6D, 0x00, 0x00, 0x77, 0x6E, 0x00, 0x00, 0x77, -/* 00004620 */ 0x6E, 0x00, 0x00, 0xD7, 0x6E, 0x00, 0x00, 0xD7, 0x6E, 0x00, 0x00, 0x3B, 0x6F, 0x00, 0x00, 0x3B, -/* 00004630 */ 0x6F, 0x00, 0x00, 0xA1, 0x6F, 0x00, 0x00, 0xA1, 0x6F, 0x00, 0x00, 0xFA, 0x6F, 0x00, 0x00, 0xFA, -/* 00004640 */ 0x6F, 0x00, 0x00, 0xFB, 0x6F, 0x00, 0x00, 0xFB, 0x6F, 0x00, 0x00, 0x62, 0x70, 0x00, 0x00, 0x62, -/* 00004650 */ 0x70, 0x00, 0x00, 0xA7, 0x70, 0x00, 0x00, 0xA7, 0x70, 0x00, 0x00, 0xEA, 0x70, 0x00, 0x00, 0xEA, -/* 00004660 */ 0x70, 0x00, 0x00, 0x23, 0x71, 0x00, 0x00, 0x23, 0x71, 0x00, 0x00, 0x5E, 0x71, 0x00, 0x00, 0x5E, -/* 00004670 */ 0x71, 0x00, 0x00, 0x99, 0x71, 0x00, 0x00, 0x99, 0x71, 0x00, 0x00, 0xD7, 0x71, 0x00, 0x00, 0xD7, -/* 00004680 */ 0x71, 0x00, 0x00, 0x14, 0x72, 0x00, 0x00, 0x14, 0x72, 0x00, 0x00, 0x49, 0x72, 0x00, 0x00, 0x49, -/* 00004690 */ 0x72, 0x00, 0x00, 0xAA, 0x72, 0x00, 0x00, 0xAA, 0x72, 0x00, 0x00, 0xF5, 0x72, 0x00, 0x00, 0xF5, -/* 000046A0 */ 0x72, 0x00, 0x00, 0x40, 0x73, 0x00, 0x00, 0x40, 0x73, 0x00, 0x00, 0x8B, 0x73, 0x00, 0x00, 0x8B, -/* 000046B0 */ 0x73, 0x00, 0x00, 0xD5, 0x73, 0x00, 0x00, 0xD5, 0x73, 0x00, 0x00, 0xD6, 0x73, 0x00, 0x00, 0xD6, -/* 000046C0 */ 0x73, 0x00, 0x00, 0x55, 0x74, 0x00, 0x00, 0x55, 0x74, 0x00, 0x00, 0xF0, 0x74, 0x00, 0x00, 0xF0, -/* 000046D0 */ 0x74, 0x00, 0x00, 0x10, 0x75, 0x00, 0x00, 0x10, 0x75, 0x00, 0x00, 0x30, 0x75, 0x00, 0x00, 0x30, -/* 000046E0 */ 0x75, 0x00, 0x00, 0x4E, 0x75, 0x00, 0x00, 0x4E, 0x75, 0x00, 0x00, 0x5C, 0x75, 0x00, 0x00, 0x5C, -/* 000046F0 */ 0x75, 0x00, 0x00, 0x5D, 0x75, 0x00, 0x00, 0x5D, 0x75, 0x00, 0x00, 0xC0, 0x75, 0x00, 0x00, 0xC0, -/* 00004700 */ 0x75, 0x00, 0x00, 0x3B, 0x76, 0x00, 0x00, 0x3B, 0x76, 0x00, 0x00, 0x7B, 0x76, 0x00, 0x00, 0x7B, -/* 00004710 */ 0x76, 0x00, 0x00, 0xAC, 0x76, 0x00, 0x00, 0xAC, 0x76, 0x00, 0x00, 0x2B, 0x77, 0x00, 0x00, 0x2B, -/* 00004720 */ 0x77, 0x00, 0x00, 0x81, 0x77, 0x00, 0x00, 0x81, 0x77, 0x00, 0x00, 0xC5, 0x77, 0x00, 0x00, 0xC5, -/* 00004730 */ 0x77, 0x00, 0x00, 0xC6, 0x77, 0x00, 0x00, 0xC6, 0x77, 0x00, 0x00, 0x45, 0x78, 0x00, 0x00, 0x45, -/* 00004740 */ 0x78, 0x00, 0x00, 0x8D, 0x78, 0x00, 0x00, 0x8D, 0x78, 0x00, 0x00, 0xB6, 0x78, 0x00, 0x00, 0xB6, -/* 00004750 */ 0x78, 0x00, 0x00, 0xFB, 0x78, 0x00, 0x00, 0xFB, 0x78, 0x00, 0x00, 0x0D, 0x79, 0x00, 0x00, 0x0D, -/* 00004760 */ 0x79, 0x00, 0x00, 0x1D, 0x79, 0x00, 0x00, 0x1D, 0x79, 0x00, 0x00, 0x1E, 0x79, 0x00, 0x00, 0x1E, -/* 00004770 */ 0x79, 0x00, 0x00, 0x56, 0x79, 0x00, 0x00, 0x56, 0x79, 0x00, 0x00, 0x62, 0x79, 0x00, 0x00, 0x62, -/* 00004780 */ 0x79, 0x00, 0x00, 0x7B, 0x79, 0x00, 0x00, 0x7B, 0x79, 0x00, 0x00, 0x85, 0x79, 0x00, 0x00, 0x85, -/* 00004790 */ 0x79, 0x00, 0x00, 0x86, 0x79, 0x00, 0x00, 0x86, 0x79, 0x00, 0x00, 0xD7, 0x79, 0x00, 0x00, 0xD7, -/* 000047A0 */ 0x79, 0x00, 0x00, 0x05, 0x7A, 0x00, 0x00, 0x05, 0x7A, 0x00, 0x00, 0x30, 0x7A, 0x00, 0x00, 0x30, -/* 000047B0 */ 0x7A, 0x00, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x97, 0x7A, 0x00, 0x00, 0x97, -/* 000047C0 */ 0x7A, 0x00, 0x00, 0xC1, 0x7A, 0x00, 0x00, 0xC1, 0x7A, 0x00, 0x00, 0xCB, 0x7A, 0x00, 0x00, 0xCB, -/* 000047D0 */ 0x7A, 0x00, 0x00, 0xCC, 0x7A, 0x00, 0x00, 0xCC, 0x7A, 0x00, 0x00, 0xEC, 0x7A, 0x00, 0x00, 0xEC, -/* 000047E0 */ 0x7A, 0x00, 0x00, 0x0F, 0x7B, 0x00, 0x00, 0x0F, 0x7B, 0x00, 0x00, 0x31, 0x7B, 0x00, 0x00, 0x31, -/* 000047F0 */ 0x7B, 0x00, 0x00, 0x85, 0x7B, 0x00, 0x00, 0x85, 0x7B, 0x00, 0x00, 0xAE, 0x7B, 0x00, 0x00, 0xAE, -/* 00004800 */ 0x7B, 0x00, 0x00, 0x18, 0x7C, 0x00, 0x00, 0x18, 0x7C, 0x00, 0x00, 0x31, 0x7C, 0x00, 0x00, 0x31, -/* 00004810 */ 0x7C, 0x00, 0x00, 0x83, 0x7C, 0x00, 0x00, 0x83, 0x7C, 0x00, 0x00, 0xCC, 0x7C, 0x00, 0x00, 0xCC, -/* 00004820 */ 0x7C, 0x00, 0x00, 0xF2, 0x7C, 0x00, 0x00, 0xF2, 0x7C, 0x00, 0x00, 0x54, 0x7D, 0x00, 0x00, 0x54, -/* 00004830 */ 0x7D, 0x00, 0x00, 0x62, 0x7D, 0x00, 0x00, 0x62, 0x7D, 0x00, 0x00, 0x73, 0x7D, 0x00, 0x00, 0x73, -/* 00004840 */ 0x7D, 0x00, 0x00, 0xBC, 0x7D, 0x00, 0x00, 0xBC, 0x7D, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x00, 0x18, -/* 00004850 */ 0x7E, 0x00, 0x00, 0x37, 0x7E, 0x00, 0x00, 0x37, 0x7E, 0x00, 0x00, 0x59, 0x7E, 0x00, 0x00, 0x59, -/* 00004860 */ 0x7E, 0x00, 0x00, 0x63, 0x7E, 0x00, 0x00, 0x63, 0x7E, 0x00, 0x00, 0x64, 0x7E, 0x00, 0x00, 0x64, -/* 00004870 */ 0x7E, 0x00, 0x00, 0x8B, 0x7E, 0x00, 0x00, 0x8B, 0x7E, 0x00, 0x00, 0xB7, 0x7E, 0x00, 0x00, 0xB7, -/* 00004880 */ 0x7E, 0x00, 0x00, 0xE1, 0x7E, 0x00, 0x00, 0xE1, 0x7E, 0x00, 0x00, 0xEB, 0x7E, 0x00, 0x00, 0xEB, -/* 00004890 */ 0x7E, 0x00, 0x00, 0xEC, 0x7E, 0x00, 0x00, 0xEC, 0x7E, 0x00, 0x00, 0x48, 0x7F, 0x00, 0x00, 0x48, -/* 000048A0 */ 0x7F, 0x00, 0x00, 0x9D, 0x7F, 0x00, 0x00, 0x9D, 0x7F, 0x00, 0x00, 0xC3, 0x7F, 0x00, 0x00, 0xC3, -/* 000048B0 */ 0x7F, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x16, 0x80, 0x00, 0x00, 0x16, -/* 000048C0 */ 0x80, 0x00, 0x00, 0x56, 0x80, 0x00, 0x00, 0x56, 0x80, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x64, -/* 000048D0 */ 0x80, 0x00, 0x00, 0x6F, 0x80, 0x00, 0x00, 0x6F, 0x80, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x70, -/* 000048E0 */ 0x80, 0x00, 0x00, 0xC6, 0x80, 0x00, 0x00, 0xC6, 0x80, 0x00, 0x00, 0xF9, 0x80, 0x00, 0x00, 0xF9, -/* 000048F0 */ 0x80, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x9A, 0x81, 0x00, 0x00, 0x9A, -/* 00004900 */ 0x81, 0x00, 0x00, 0xC4, 0x81, 0x00, 0x00, 0xC4, 0x81, 0x00, 0x00, 0xCE, 0x81, 0x00, 0x00, 0xCE, -/* 00004910 */ 0x81, 0x00, 0x00, 0xCF, 0x81, 0x00, 0x00, 0xCF, 0x81, 0x00, 0x00, 0x11, 0x82, 0x00, 0x00, 0x11, -/* 00004920 */ 0x82, 0x00, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x98, 0x82, 0x00, 0x00, 0x98, -/* 00004930 */ 0x82, 0x00, 0x00, 0xA9, 0x82, 0x00, 0x00, 0xA9, 0x82, 0x00, 0x00, 0xFD, 0x82, 0x00, 0x00, 0xFD, -/* 00004940 */ 0x82, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x08, 0x83, 0x00, 0x00, 0x08, -/* 00004950 */ 0x83, 0x00, 0x00, 0x2E, 0x83, 0x00, 0x00, 0x2E, 0x83, 0x00, 0x00, 0x35, 0x83, 0x00, 0x00, 0x35, -/* 00004960 */ 0x83, 0x00, 0x00, 0x36, 0x83, 0x00, 0x00, 0x36, 0x83, 0x00, 0x00, 0x6B, 0x83, 0x00, 0x00, 0x6B, -/* 00004970 */ 0x83, 0x00, 0x00, 0x8D, 0x83, 0x00, 0x00, 0x8D, 0x83, 0x00, 0x00, 0x8E, 0x83, 0x00, 0x00, 0x8E, -/* 00004980 */ 0x83, 0x00, 0x00, 0xCA, 0x83, 0x00, 0x00, 0xCA, 0x83, 0x00, 0x00, 0xCB, 0x83, 0x00, 0x00, 0xCB, -/* 00004990 */ 0x83, 0x00, 0x00, 0x14, 0x84, 0x00, 0x00, 0x14, 0x84, 0x00, 0x00, 0x47, 0x84, 0x00, 0x00, 0x47, -/* 000049A0 */ 0x84, 0x00, 0x00, 0x77, 0x84, 0x00, 0x00, 0x77, 0x84, 0x00, 0x00, 0x89, 0x84, 0x00, 0x00, 0x89, -/* 000049B0 */ 0x84, 0x00, 0x00, 0x8A, 0x84, 0x00, 0x00, 0x8A, 0x84, 0x00, 0x00, 0x19, 0x85, 0x00, 0x00, 0x19, -/* 000049C0 */ 0x85, 0x00, 0x00, 0x6F, 0x85, 0x00, 0x00, 0x6F, 0x85, 0x00, 0x00, 0x81, 0x85, 0x00, 0x00, 0x81, -/* 000049D0 */ 0x85, 0x00, 0x00, 0x82, 0x85, 0x00, 0x00, 0x82, 0x85, 0x00, 0x00, 0xBB, 0x85, 0x00, 0x00, 0xBB, -/* 000049E0 */ 0x85, 0x00, 0x00, 0xBC, 0x85, 0x00, 0x00, 0xBC, 0x85, 0x00, 0x00, 0xDF, 0x85, 0x00, 0x00, 0xDF, -/* 000049F0 */ 0x85, 0x00, 0x00, 0x15, 0x86, 0x00, 0x00, 0x15, 0x86, 0x00, 0x00, 0x4B, 0x86, 0x00, 0x00, 0x4B, -/* 00004A00 */ 0x86, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x9E, 0x86, 0x00, 0x00, 0x9E, -/* 00004A10 */ 0x86, 0x00, 0x00, 0xB0, 0x86, 0x00, 0x00, 0xB0, 0x86, 0x00, 0x00, 0xB1, 0x86, 0x00, 0x00, 0xB1, -/* 00004A20 */ 0x86, 0x00, 0x00, 0x22, 0x87, 0x00, 0x00, 0x22, 0x87, 0x00, 0x00, 0x81, 0x87, 0x00, 0x00, 0x81, -/* 00004A30 */ 0x87, 0x00, 0x00, 0x02, 0x88, 0x00, 0x00, 0x02, 0x88, 0x00, 0x00, 0x70, 0x88, 0x00, 0x00, 0x70, -/* 00004A40 */ 0x88, 0x00, 0x00, 0xE3, 0x88, 0x00, 0x00, 0xE3, 0x88, 0x00, 0x00, 0x45, 0x89, 0x00, 0x00, 0x45, -/* 00004A50 */ 0x89, 0x00, 0x00, 0x46, 0x89, 0x00, 0x00, 0x46, 0x89, 0x00, 0x00, 0x7E, 0x89, 0x00, 0x00, 0x7E, -/* 00004A60 */ 0x89, 0x00, 0x00, 0xBF, 0x89, 0x00, 0x00, 0xBF, 0x89, 0x00, 0x00, 0x2D, 0x8A, 0x00, 0x00, 0x2D, -/* 00004A70 */ 0x8A, 0x00, 0x00, 0x2E, 0x8A, 0x00, 0x00, 0x2E, 0x8A, 0x00, 0x00, 0x59, 0x8A, 0x00, 0x00, 0x59, -/* 00004A80 */ 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0x07, 0x8B, 0x00, 0x00, 0x07, -/* 00004A90 */ 0x8B, 0x00, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x3A, 0x8B, 0x00, 0x00, 0x3A, -/* 00004AA0 */ 0x8B, 0x00, 0x00, 0xA5, 0x8B, 0x00, 0x00, 0xA5, 0x8B, 0x00, 0x00, 0x27, 0x8C, 0x00, 0x00, 0x27, -/* 00004AB0 */ 0x8C, 0x00, 0x00, 0x53, 0x8C, 0x00, 0x00, 0x53, 0x8C, 0x00, 0x00, 0x9F, 0x8C, 0x00, 0x00, 0x9F, -/* 00004AC0 */ 0x8C, 0x00, 0x00, 0xE6, 0x8C, 0x00, 0x00, 0xE6, 0x8C, 0x00, 0x00, 0x82, 0x8D, 0x00, 0x00, 0x82, -/* 00004AD0 */ 0x8D, 0x00, 0x00, 0xCE, 0x8D, 0x00, 0x00, 0xCE, 0x8D, 0x00, 0x00, 0x05, 0x8E, 0x00, 0x00, 0x05, -/* 00004AE0 */ 0x8E, 0x00, 0x00, 0x89, 0x8E, 0x00, 0x00, 0x89, 0x8E, 0x00, 0x00, 0xAE, 0x8E, 0x00, 0x00, 0xAE, -/* 00004AF0 */ 0x8E, 0x00, 0x00, 0xDE, 0x8E, 0x00, 0x00, 0xDE, 0x8E, 0x00, 0x00, 0xFC, 0x8E, 0x00, 0x00, 0xFC, -/* 00004B00 */ 0x8E, 0x00, 0x00, 0x9F, 0x8F, 0x00, 0x00, 0x9F, 0x8F, 0x00, 0x00, 0xFE, 0x8F, 0x00, 0x00, 0xFE, -/* 00004B10 */ 0x8F, 0x00, 0x00, 0x2D, 0x90, 0x00, 0x00, 0x2D, 0x90, 0x00, 0x00, 0x47, 0x90, 0x00, 0x00, 0x47, -/* 00004B20 */ 0x90, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x71, 0x90, 0x00, 0x00, 0x71, -/* 00004B30 */ 0x90, 0x00, 0x00, 0xA0, 0x90, 0x00, 0x00, 0xA0, 0x90, 0x00, 0x00, 0x0F, 0x91, 0x00, 0x00, 0x0F, -/* 00004B40 */ 0x91, 0x00, 0x00, 0x3E, 0x91, 0x00, 0x00, 0x3E, 0x91, 0x00, 0x00, 0xCC, 0x91, 0x00, 0x00, 0xCC, -/* 00004B50 */ 0x91, 0x00, 0x00, 0x03, 0x92, 0x00, 0x00, 0x03, 0x92, 0x00, 0x00, 0x6D, 0x92, 0x00, 0x00, 0x6D, -/* 00004B60 */ 0x92, 0x00, 0x00, 0x87, 0x92, 0x00, 0x00, 0x87, 0x92, 0x00, 0x00, 0x9D, 0x92, 0x00, 0x00, 0x9D, -/* 00004B70 */ 0x92, 0x00, 0x00, 0xB8, 0x92, 0x00, 0x00, 0xB8, 0x92, 0x00, 0x00, 0xE7, 0x92, 0x00, 0x00, 0xE7, -/* 00004B80 */ 0x92, 0x00, 0x00, 0xFD, 0x92, 0x00, 0x00, 0xFD, 0x92, 0x00, 0x00, 0x0F, 0x93, 0x00, 0x00, 0x0F, -/* 00004B90 */ 0x93, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x3F, 0x93, 0x00, 0x00, 0x3F, -/* 00004BA0 */ 0x93, 0x00, 0x00, 0x6E, 0x93, 0x00, 0x00, 0x6E, 0x93, 0x00, 0x00, 0x88, 0x93, 0x00, 0x00, 0x88, -/* 00004BB0 */ 0x93, 0x00, 0x00, 0x03, 0x94, 0x00, 0x00, 0x03, 0x94, 0x00, 0x00, 0x25, 0x94, 0x00, 0x00, 0x25, -/* 00004BC0 */ 0x94, 0x00, 0x00, 0x53, 0x94, 0x00, 0x00, 0x53, 0x94, 0x00, 0x00, 0x81, 0x94, 0x00, 0x00, 0x81, -/* 00004BD0 */ 0x94, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0xF3, 0x94, 0x00, 0x00, 0xF3, -/* 00004BE0 */ 0x94, 0x00, 0x00, 0x7C, 0x95, 0x00, 0x00, 0x7C, 0x95, 0x00, 0x00, 0xE5, 0x95, 0x00, 0x00, 0xE5, -/* 00004BF0 */ 0x95, 0x00, 0x00, 0x24, 0x96, 0x00, 0x00, 0x24, 0x96, 0x00, 0x00, 0x3A, 0x96, 0x00, 0x00, 0x3A, -/* 00004C00 */ 0x96, 0x00, 0x00, 0x3B, 0x96, 0x00, 0x00, 0x3B, 0x96, 0x00, 0x00, 0x60, 0x96, 0x00, 0x00, 0x60, -/* 00004C10 */ 0x96, 0x00, 0x00, 0x8D, 0x96, 0x00, 0x00, 0x8D, 0x96, 0x00, 0x00, 0xBA, 0x96, 0x00, 0x00, 0xBA, -/* 00004C20 */ 0x96, 0x00, 0x00, 0xE7, 0x96, 0x00, 0x00, 0xE7, 0x96, 0x00, 0x00, 0x04, 0x97, 0x00, 0x00, 0x04, -/* 00004C30 */ 0x97, 0x00, 0x00, 0x31, 0x97, 0x00, 0x00, 0x31, 0x97, 0x00, 0x00, 0x47, 0x97, 0x00, 0x00, 0x47, -/* 00004C40 */ 0x97, 0x00, 0x00, 0x59, 0x97, 0x00, 0x00, 0x59, 0x97, 0x00, 0x00, 0x5A, 0x97, 0x00, 0x00, 0x5A, -/* 00004C50 */ 0x97, 0x00, 0x00, 0x8B, 0x97, 0x00, 0x00, 0x8B, 0x97, 0x00, 0x00, 0xB8, 0x97, 0x00, 0x00, 0xB8, -/* 00004C60 */ 0x97, 0x00, 0x00, 0xCA, 0x97, 0x00, 0x00, 0xCA, 0x97, 0x00, 0x00, 0xCB, 0x97, 0x00, 0x00, 0xCB, -/* 00004C70 */ 0x97, 0x00, 0x00, 0xF8, 0x97, 0x00, 0x00, 0xF8, 0x97, 0x00, 0x00, 0x1D, 0x98, 0x00, 0x00, 0x1D, -/* 00004C80 */ 0x98, 0x00, 0x00, 0x2F, 0x98, 0x00, 0x00, 0x2F, 0x98, 0x00, 0x00, 0x30, 0x98, 0x00, 0x00, 0x30, -/* 00004C90 */ 0x98, 0x00, 0x00, 0x61, 0x98, 0x00, 0x00, 0x61, 0x98, 0x00, 0x00, 0x8F, 0x98, 0x00, 0x00, 0x8F, -/* 00004CA0 */ 0x98, 0x00, 0x00, 0xDC, 0x98, 0x00, 0x00, 0xDC, 0x98, 0x00, 0x00, 0x24, 0x99, 0x00, 0x00, 0x24, -/* 00004CB0 */ 0x99, 0x00, 0x00, 0x4E, 0x99, 0x00, 0x00, 0x4E, 0x99, 0x00, 0x00, 0x84, 0x99, 0x00, 0x00, 0x84, -/* 00004CC0 */ 0x99, 0x00, 0x00, 0xC6, 0x99, 0x00, 0x00, 0xC6, 0x99, 0x00, 0x00, 0xF8, 0x99, 0x00, 0x00, 0xF8, -/* 00004CD0 */ 0x99, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x58, 0x9A, 0x00, 0x00, 0x58, -/* 00004CE0 */ 0x9A, 0x00, 0x00, 0x8F, 0x9A, 0x00, 0x00, 0x8F, 0x9A, 0x00, 0x00, 0x9D, 0x9A, 0x00, 0x00, 0x9D, -/* 00004CF0 */ 0x9A, 0x00, 0x00, 0x9E, 0x9A, 0x00, 0x00, 0x9E, 0x9A, 0x00, 0x00, 0x0D, 0x9B, 0x00, 0x00, 0x0D, -/* 00004D00 */ 0x9B, 0x00, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x71, 0x9B, 0x00, 0x00, 0x71, -/* 00004D10 */ 0x9B, 0x00, 0x00, 0xCB, 0x9B, 0x00, 0x00, 0xCB, 0x9B, 0x00, 0x00, 0xDD, 0x9B, 0x00, 0x00, 0xDD, -/* 00004D20 */ 0x9B, 0x00, 0x00, 0x07, 0x9C, 0x00, 0x00, 0x07, 0x9C, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x00, 0x37, -/* 00004D30 */ 0x9C, 0x00, 0x00, 0x49, 0x9C, 0x00, 0x00, 0x49, 0x9C, 0x00, 0x00, 0xED, 0x9C, 0x00, 0x00, 0xED, -/* 00004D40 */ 0x9C, 0x00, 0x00, 0x19, 0x9D, 0x00, 0x00, 0x19, 0x9D, 0x00, 0x00, 0x42, 0x9D, 0x00, 0x00, 0x42, -/* 00004D50 */ 0x9D, 0x00, 0x00, 0x7C, 0x9D, 0x00, 0x00, 0x7C, 0x9D, 0x00, 0x00, 0xC9, 0x9D, 0x00, 0x00, 0xC9, -/* 00004D60 */ 0x9D, 0x00, 0x00, 0x82, 0x9E, 0x00, 0x00, 0x82, 0x9E, 0x00, 0x00, 0x96, 0x9E, 0x00, 0x00, 0x96, -/* 00004D70 */ 0x9E, 0x00, 0x00, 0x97, 0x9E, 0x00, 0x00, 0x97, 0x9E, 0x00, 0x00, 0xBE, 0x9E, 0x00, 0x00, 0xBE, -/* 00004D80 */ 0x9E, 0x00, 0x00, 0xBF, 0x9E, 0x00, 0x00, 0xBF, 0x9E, 0x00, 0x00, 0xE5, 0x9E, 0x00, 0x00, 0xE5, -/* 00004D90 */ 0x9E, 0x00, 0x00, 0x4B, 0x9F, 0x00, 0x00, 0x4B, 0x9F, 0x00, 0x00, 0xC2, 0x9F, 0x00, 0x00, 0xC2, -/* 00004DA0 */ 0x9F, 0x00, 0x00, 0x34, 0xA0, 0x00, 0x00, 0x34, 0xA0, 0x00, 0x00, 0x61, 0xA0, 0x00, 0x00, 0x61, -/* 00004DB0 */ 0xA0, 0x00, 0x00, 0x8E, 0xA0, 0x00, 0x00, 0x8E, 0xA0, 0x00, 0x00, 0xD5, 0xA0, 0x00, 0x00, 0xD5, -/* 00004DC0 */ 0xA0, 0x00, 0x00, 0x1C, 0xA1, 0x00, 0x00, 0x1C, 0xA1, 0x00, 0x00, 0x1D, 0xA1, 0x00, 0x00, 0x1D, -/* 00004DD0 */ 0xA1, 0x00, 0x00, 0x5C, 0xA1, 0x00, 0x00, 0x5C, 0xA1, 0x00, 0x00, 0x9B, 0xA1, 0x00, 0x00, 0x9B, -/* 00004DE0 */ 0xA1, 0x00, 0x00, 0xB1, 0xA1, 0x00, 0x00, 0xB1, 0xA1, 0x00, 0x00, 0xB2, 0xA1, 0x00, 0x00, 0xB2, -/* 00004DF0 */ 0xA1, 0x00, 0x00, 0xE9, 0xA1, 0x00, 0x00, 0xE9, 0xA1, 0x00, 0x00, 0x1D, 0xA2, 0x00, 0x00, 0x1D, -/* 00004E00 */ 0xA2, 0x00, 0x00, 0x66, 0xA2, 0x00, 0x00, 0x66, 0xA2, 0x00, 0x00, 0x7C, 0xA2, 0x00, 0x00, 0x7C, -/* 00004E10 */ 0xA2, 0x00, 0x00, 0x7D, 0xA2, 0x00, 0x00, 0x7D, 0xA2, 0x00, 0x00, 0xB8, 0xA2, 0x00, 0x00, 0xB8, -/* 00004E20 */ 0xA2, 0x00, 0x00, 0xFE, 0xA2, 0x00, 0x00, 0xFE, 0xA2, 0x00, 0x00, 0xFF, 0xA2, 0x00, 0x00, 0xFF, -/* 00004E30 */ 0xA2, 0x00, 0x00, 0x35, 0xA3, 0x00, 0x00, 0x35, 0xA3, 0x00, 0x00, 0x74, 0xA3, 0x00, 0x00, 0x74, -/* 00004E40 */ 0xA3, 0x00, 0x00, 0xB9, 0xA3, 0x00, 0x00, 0xB9, 0xA3, 0x00, 0x00, 0xCF, 0xA3, 0x00, 0x00, 0xCF, -/* 00004E50 */ 0xA3, 0x00, 0x00, 0xD0, 0xA3, 0x00, 0x00, 0xD0, 0xA3, 0x00, 0x00, 0x18, 0xA4, 0x00, 0x00, 0x18, -/* 00004E60 */ 0xA4, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x46, 0xA4, 0x00, 0x00, 0x46, -/* 00004E70 */ 0xA4, 0x00, 0x00, 0xAE, 0xA4, 0x00, 0x00, 0xAE, 0xA4, 0x00, 0x00, 0xEB, 0xA4, 0x00, 0x00, 0xEB, -/* 00004E80 */ 0xA4, 0x00, 0x00, 0x0B, 0xA5, 0x00, 0x00, 0x0B, 0xA5, 0x00, 0x00, 0x1D, 0xA5, 0x00, 0x00, 0x1D, -/* 00004E90 */ 0xA5, 0x00, 0x00, 0x5B, 0xA5, 0x00, 0x00, 0x5B, 0xA5, 0x00, 0x00, 0x5C, 0xA5, 0x00, 0x00, 0x5C, -/* 00004EA0 */ 0xA5, 0x00, 0x00, 0x85, 0xA5, 0x00, 0x00, 0x85, 0xA5, 0x00, 0x00, 0xB9, 0xA5, 0x00, 0x00, 0xB9, -/* 00004EB0 */ 0xA5, 0x00, 0x00, 0x1B, 0xA6, 0x00, 0x00, 0x1B, 0xA6, 0x00, 0x00, 0x31, 0xA6, 0x00, 0x00, 0x31, -/* 00004EC0 */ 0xA6, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x79, 0xA6, 0x00, 0x00, 0x79, -/* 00004ED0 */ 0xA6, 0x00, 0x00, 0xD6, 0xA6, 0x00, 0x00, 0xD6, 0xA6, 0x00, 0x00, 0x38, 0xA7, 0x00, 0x00, 0x38, -/* 00004EE0 */ 0xA7, 0x00, 0x00, 0x4E, 0xA7, 0x00, 0x00, 0x4E, 0xA7, 0x00, 0x00, 0x4F, 0xA7, 0x00, 0x00, 0x4F, -/* 00004EF0 */ 0xA7, 0x00, 0x00, 0x72, 0xA7, 0x00, 0x00, 0x72, 0xA7, 0x00, 0x00, 0x95, 0xA7, 0x00, 0x00, 0x95, -/* 00004F00 */ 0xA7, 0x00, 0x00, 0x96, 0xA7, 0x00, 0x00, 0x96, 0xA7, 0x00, 0x00, 0x4E, 0xA8, 0x00, 0x00, 0x4E, -/* 00004F10 */ 0xA8, 0x00, 0x00, 0x60, 0xA8, 0x00, 0x00, 0x60, 0xA8, 0x00, 0x00, 0xAF, 0xA8, 0x00, 0x00, 0xAF, -/* 00004F20 */ 0xA8, 0x00, 0x00, 0xB0, 0xA8, 0x00, 0x00, 0xB0, 0xA8, 0x00, 0x00, 0x42, 0xA9, 0x00, 0x00, 0x42, -/* 00004F30 */ 0xA9, 0x00, 0x00, 0x43, 0xA9, 0x00, 0x00, 0x43, 0xA9, 0x00, 0x00, 0xD4, 0xA9, 0x00, 0x00, 0xD4, -/* 00004F40 */ 0xA9, 0x00, 0x00, 0x18, 0xAA, 0x00, 0x00, 0x18, 0xAA, 0x00, 0x00, 0x19, 0xAA, 0x00, 0x00, 0x19, -/* 00004F50 */ 0xAA, 0x00, 0x00, 0xAE, 0xAA, 0x00, 0x00, 0xAE, 0xAA, 0x00, 0x00, 0xAF, 0xAA, 0x00, 0x00, 0xAF, -/* 00004F60 */ 0xAA, 0x00, 0x00, 0xFD, 0xAA, 0x00, 0x00, 0xFD, 0xAA, 0x00, 0x00, 0x35, 0xAB, 0x00, 0x00, 0x35, -/* 00004F70 */ 0xAB, 0x00, 0x00, 0x6D, 0xAB, 0x00, 0x00, 0x6D, 0xAB, 0x00, 0x00, 0xDB, 0xAB, 0x00, 0x00, 0xDB, -/* 00004F80 */ 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0x40, 0xAC, 0x00, 0x00, 0x40, -/* 00004F90 */ 0xAC, 0x00, 0x00, 0xA1, 0xAC, 0x00, 0x00, 0xA1, 0xAC, 0x00, 0x00, 0x0F, 0xAD, 0x00, 0x00, 0x0F, -/* 00004FA0 */ 0xAD, 0x00, 0x00, 0x29, 0xAD, 0x00, 0x00, 0x29, 0xAD, 0x00, 0x00, 0x2A, 0xAD, 0x00, 0x00, 0x2A, -/* 00004FB0 */ 0xAD, 0x00, 0x00, 0x4B, 0xAD, 0x00, 0x00, 0x4B, 0xAD, 0x00, 0x00, 0x86, 0xAD, 0x00, 0x00, 0x86, -/* 00004FC0 */ 0xAD, 0x00, 0x00, 0xBF, 0xAD, 0x00, 0x00, 0xBF, 0xAD, 0x00, 0x00, 0x04, 0xAE, 0x00, 0x00, 0x04, -/* 00004FD0 */ 0xAE, 0x00, 0x00, 0x55, 0xAE, 0x00, 0x00, 0x55, 0xAE, 0x00, 0x00, 0xB0, 0xAE, 0x00, 0x00, 0xB0, -/* 00004FE0 */ 0xAE, 0x00, 0x00, 0x45, 0xAF, 0x00, 0x00, 0x45, 0xAF, 0x00, 0x00, 0xDA, 0xAF, 0x00, 0x00, 0xDA, -/* 00004FF0 */ 0xAF, 0x00, 0x00, 0xF4, 0xAF, 0x00, 0x00, 0xF4, 0xAF, 0x00, 0x00, 0x41, 0xB0, 0x00, 0x00, 0x41, -/* 00005000 */ 0xB0, 0x00, 0x00, 0x55, 0xB0, 0x00, 0x00, 0x55, 0xB0, 0x00, 0x00, 0x56, 0xB0, 0x00, 0x00, 0x56, -/* 00005010 */ 0xB0, 0x00, 0x00, 0x9C, 0xB0, 0x00, 0x00, 0x9C, 0xB0, 0x00, 0x00, 0xE4, 0xB0, 0x00, 0x00, 0xE4, -/* 00005020 */ 0xB0, 0x00, 0x00, 0x1C, 0xB1, 0x00, 0x00, 0x1C, 0xB1, 0x00, 0x00, 0x82, 0xB1, 0x00, 0x00, 0x82, -/* 00005030 */ 0xB1, 0x00, 0x00, 0x9C, 0xB1, 0x00, 0x00, 0x9C, 0xB1, 0x00, 0x00, 0x9D, 0xB1, 0x00, 0x00, 0x9D, -/* 00005040 */ 0xB1, 0x00, 0x00, 0xE8, 0xB1, 0x00, 0x00, 0xE8, 0xB1, 0x00, 0x00, 0x49, 0xB2, 0x00, 0x00, 0x49, -/* 00005050 */ 0xB2, 0x00, 0x00, 0xAF, 0xB2, 0x00, 0x00, 0xAF, 0xB2, 0x00, 0x00, 0xC9, 0xB2, 0x00, 0x00, 0xC9, -/* 00005060 */ 0xB2, 0x00, 0x00, 0xCA, 0xB2, 0x00, 0x00, 0xCA, 0xB2, 0x00, 0x00, 0x06, 0xB3, 0x00, 0x00, 0x06, -/* 00005070 */ 0xB3, 0x00, 0x00, 0x44, 0xB3, 0x00, 0x00, 0x44, 0xB3, 0x00, 0x00, 0x58, 0xB3, 0x00, 0x00, 0x58, -/* 00005080 */ 0xB3, 0x00, 0x00, 0x59, 0xB3, 0x00, 0x00, 0x59, 0xB3, 0x00, 0x00, 0x7A, 0xB3, 0x00, 0x00, 0x7A, -/* 00005090 */ 0xB3, 0x00, 0x00, 0x88, 0xB3, 0x00, 0x00, 0x88, 0xB3, 0x00, 0x00, 0x92, 0xB3, 0x00, 0x00, 0x92, -/* 000050A0 */ 0xB3, 0x00, 0x00, 0xDD, 0xB3, 0x00, 0x00, 0xDD, 0xB3, 0x00, 0x00, 0xF7, 0xB3, 0x00, 0x00, 0xF7, -/* 000050B0 */ 0xB3, 0x00, 0x00, 0x01, 0xB4, 0x00, 0x00, 0x01, 0xB4, 0x00, 0x00, 0x02, 0xB4, 0x00, 0x00, 0x02, -/* 000050C0 */ 0xB4, 0x00, 0x00, 0x3C, 0xB4, 0x00, 0x00, 0x3C, 0xB4, 0x00, 0x00, 0x62, 0xB4, 0x00, 0x00, 0x62, -/* 000050D0 */ 0xB4, 0x00, 0x00, 0xB1, 0xB4, 0x00, 0x00, 0xB1, 0xB4, 0x00, 0x00, 0xE2, 0xB4, 0x00, 0x00, 0xE2, -/* 000050E0 */ 0xB4, 0x00, 0x00, 0x16, 0xB5, 0x00, 0x00, 0x16, 0xB5, 0x00, 0x00, 0x81, 0xB5, 0x00, 0x00, 0x81, -/* 000050F0 */ 0xB5, 0x00, 0x00, 0xCD, 0xB5, 0x00, 0x00, 0xCD, 0xB5, 0x00, 0x00, 0x20, 0xB6, 0x00, 0x00, 0x20, -/* 00005100 */ 0xB6, 0x00, 0x00, 0x33, 0xB6, 0x00, 0x00, 0x33, 0xB6, 0x00, 0x00, 0x45, 0xB6, 0x00, 0x00, 0x45, -/* 00005110 */ 0xB6, 0x00, 0x00, 0x80, 0xB6, 0x00, 0x00, 0x80, 0xB6, 0x00, 0x00, 0xB3, 0xB6, 0x00, 0x00, 0xB3, -/* 00005120 */ 0xB6, 0x00, 0x00, 0x42, 0xB7, 0x00, 0x00, 0x42, 0xB7, 0x00, 0x00, 0xB3, 0xB7, 0x00, 0x00, 0xB3, -/* 00005130 */ 0xB7, 0x00, 0x00, 0x2A, 0xB8, 0x00, 0x00, 0x2A, 0xB8, 0x00, 0x00, 0x3D, 0xB8, 0x00, 0x00, 0x3D, -/* 00005140 */ 0xB8, 0x00, 0x00, 0x4F, 0xB8, 0x00, 0x00, 0x4F, 0xB8, 0x00, 0x00, 0x50, 0xB8, 0x00, 0x00, 0x50, -/* 00005150 */ 0xB8, 0x00, 0x00, 0x8C, 0xB8, 0x00, 0x00, 0x8C, 0xB8, 0x00, 0x00, 0xDD, 0xB8, 0x00, 0x00, 0xDD, -/* 00005160 */ 0xB8, 0x00, 0x00, 0x14, 0xB9, 0x00, 0x00, 0x14, 0xB9, 0x00, 0x00, 0x44, 0xB9, 0x00, 0x00, 0x44, -/* 00005170 */ 0xB9, 0x00, 0x00, 0x56, 0xB9, 0x00, 0x00, 0x56, 0xB9, 0x00, 0x00, 0x57, 0xB9, 0x00, 0x00, 0x57, -/* 00005180 */ 0xB9, 0x00, 0x00, 0xEE, 0xB9, 0x00, 0x00, 0xEE, 0xB9, 0x00, 0x00, 0x4C, 0xBA, 0x00, 0x00, 0x4C, -/* 00005190 */ 0xBA, 0x00, 0x00, 0x5E, 0xBA, 0x00, 0x00, 0x5E, 0xBA, 0x00, 0x00, 0x5F, 0xBA, 0x00, 0x00, 0x5F, -/* 000051A0 */ 0xBA, 0x00, 0x00, 0x9C, 0xBA, 0x00, 0x00, 0x9C, 0xBA, 0x00, 0x00, 0x9D, 0xBA, 0x00, 0x00, 0x9D, -/* 000051B0 */ 0xBA, 0x00, 0x00, 0xC0, 0xBA, 0x00, 0x00, 0xC0, 0xBA, 0x00, 0x00, 0xF6, 0xBA, 0x00, 0x00, 0xF6, -/* 000051C0 */ 0xBA, 0x00, 0x00, 0x2C, 0xBB, 0x00, 0x00, 0x2C, 0xBB, 0x00, 0x00, 0x45, 0xBB, 0x00, 0x00, 0x45, -/* 000051D0 */ 0xBB, 0x00, 0x00, 0x7F, 0xBB, 0x00, 0x00, 0x7F, 0xBB, 0x00, 0x00, 0x91, 0xBB, 0x00, 0x00, 0x91, -/* 000051E0 */ 0xBB, 0x00, 0x00, 0x92, 0xBB, 0x00, 0x00, 0x92, 0xBB, 0x00, 0x00, 0x03, 0xBC, 0x00, 0x00, 0x03, -/* 000051F0 */ 0xBC, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x76, 0xBC, 0x00, 0x00, 0x76, -/* 00005200 */ 0xBC, 0x00, 0x00, 0xC1, 0xBC, 0x00, 0x00, 0xC1, 0xBC, 0x00, 0x00, 0xEC, 0xBC, 0x00, 0x00, 0xEC, -/* 00005210 */ 0xBC, 0x00, 0x00, 0x2C, 0xBD, 0x00, 0x00, 0x2C, 0xBD, 0x00, 0x00, 0x5F, 0xBD, 0x00, 0x00, 0x5F, -/* 00005220 */ 0xBD, 0x00, 0x00, 0xA0, 0xBD, 0x00, 0x00, 0xA0, 0xBD, 0x00, 0x00, 0xB2, 0xBD, 0x00, 0x00, 0xB2, -/* 00005230 */ 0xBD, 0x00, 0x00, 0xB3, 0xBD, 0x00, 0x00, 0xB3, 0xBD, 0x00, 0x00, 0x12, 0xBE, 0x00, 0x00, 0x12, -/* 00005240 */ 0xBE, 0x00, 0x00, 0x8F, 0xBE, 0x00, 0x00, 0x8F, 0xBE, 0x00, 0x00, 0xBF, 0xBE, 0x00, 0x00, 0xBF, -/* 00005250 */ 0xBE, 0x00, 0x00, 0xC0, 0xBE, 0x00, 0x00, 0xC0, 0xBE, 0x00, 0x00, 0x27, 0xBF, 0x00, 0x00, 0x27, -/* 00005260 */ 0xBF, 0x00, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x95, 0xBF, 0x00, 0x00, 0x95, -/* 00005270 */ 0xBF, 0x00, 0x00, 0xD3, 0xBF, 0x00, 0x00, 0xD3, 0xBF, 0x00, 0x00, 0xD4, 0xBF, 0x00, 0x00, 0xD4, -/* 00005280 */ 0xBF, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x76, 0xC0, 0x00, 0x00, 0x76, -/* 00005290 */ 0xC0, 0x00, 0x00, 0x77, 0xC0, 0x00, 0x00, 0x77, 0xC0, 0x00, 0x00, 0xF1, 0xC0, 0x00, 0x00, 0xF1, -/* 000052A0 */ 0xC0, 0x00, 0x00, 0x60, 0xC1, 0x00, 0x00, 0x60, 0xC1, 0x00, 0x00, 0xE7, 0xC1, 0x00, 0x00, 0xE7, -/* 000052B0 */ 0xC1, 0x00, 0x00, 0xF9, 0xC1, 0x00, 0x00, 0xF9, 0xC1, 0x00, 0x00, 0xFA, 0xC1, 0x00, 0x00, 0xFA, -/* 000052C0 */ 0xC1, 0x00, 0x00, 0x5B, 0xC2, 0x00, 0x00, 0x5B, 0xC2, 0x00, 0x00, 0x5C, 0xC2, 0x00, 0x00, 0x5C, -/* 000052D0 */ 0xC2, 0x00, 0x00, 0x94, 0xC2, 0x00, 0x00, 0x94, 0xC2, 0x00, 0x00, 0xD5, 0xC2, 0x00, 0x00, 0xD5, -/* 000052E0 */ 0xC2, 0x00, 0x00, 0x42, 0xC3, 0x00, 0x00, 0x42, 0xC3, 0x00, 0x00, 0x43, 0xC3, 0x00, 0x00, 0x43, -/* 000052F0 */ 0xC3, 0x00, 0x00, 0x77, 0xC3, 0x00, 0x00, 0x77, 0xC3, 0x00, 0x00, 0xD5, 0xC3, 0x00, 0x00, 0xD5, -/* 00005300 */ 0xC3, 0x00, 0x00, 0x1E, 0xC4, 0x00, 0x00, 0x1E, 0xC4, 0x00, 0x00, 0x30, 0xC4, 0x00, 0x00, 0x30, -/* 00005310 */ 0xC4, 0x00, 0x00, 0x31, 0xC4, 0x00, 0x00, 0x31, 0xC4, 0x00, 0x00, 0x5D, 0xC4, 0x00, 0x00, 0x5D, -/* 00005320 */ 0xC4, 0x00, 0x00, 0x98, 0xC4, 0x00, 0x00, 0x98, 0xC4, 0x00, 0x00, 0xD5, 0xC4, 0x00, 0x00, 0xD5, -/* 00005330 */ 0xC4, 0x00, 0x00, 0xEB, 0xC4, 0x00, 0x00, 0xEB, 0xC4, 0x00, 0x00, 0x41, 0xC5, 0x00, 0x00, 0x41, -/* 00005340 */ 0xC5, 0x00, 0x00, 0x5B, 0xC5, 0x00, 0x00, 0x5B, 0xC5, 0x00, 0x00, 0xA7, 0xC5, 0x00, 0x00, 0xA7, -/* 00005350 */ 0xC5, 0x00, 0x00, 0xC9, 0xC5, 0x00, 0x00, 0xC9, 0xC5, 0x00, 0x00, 0xF7, 0xC5, 0x00, 0x00, 0xF7, -/* 00005360 */ 0xC5, 0x00, 0x00, 0x44, 0xC6, 0x00, 0x00, 0x44, 0xC6, 0x00, 0x00, 0x5A, 0xC6, 0x00, 0x00, 0x5A, -/* 00005370 */ 0xC6, 0x00, 0x00, 0xD0, 0xC6, 0x00, 0x00, 0xD0, 0xC6, 0x00, 0x00, 0x34, 0xC7, 0x00, 0x00, 0x34, -/* 00005380 */ 0xC7, 0x00, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x77, 0xC7, 0x00, 0x00, 0x77, -/* 00005390 */ 0xC7, 0x00, 0x00, 0xA8, 0xC7, 0x00, 0x00, 0xA8, 0xC7, 0x00, 0x00, 0x11, 0xC8, 0x00, 0x00, 0x11, -/* 000053A0 */ 0xC8, 0x00, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x9B, 0xC8, 0x00, 0x00, 0x9B, -/* 000053B0 */ 0xC8, 0x00, 0x00, 0xB8, 0xC8, 0x00, 0x00, 0xB8, 0xC8, 0x00, 0x00, 0x12, 0xC9, 0x00, 0x00, 0x12, -/* 000053C0 */ 0xC9, 0x00, 0x00, 0x28, 0xC9, 0x00, 0x00, 0x28, 0xC9, 0x00, 0x00, 0x3A, 0xC9, 0x00, 0x00, 0x3A, -/* 000053D0 */ 0xC9, 0x00, 0x00, 0x3B, 0xC9, 0x00, 0x00, 0x3B, 0xC9, 0x00, 0x00, 0xCF, 0xC9, 0x00, 0x00, 0xCF, -/* 000053E0 */ 0xC9, 0x00, 0x00, 0xD0, 0xC9, 0x00, 0x00, 0xD0, 0xC9, 0x00, 0x00, 0x01, 0xCA, 0x00, 0x00, 0x01, -/* 000053F0 */ 0xCA, 0x00, 0x00, 0x39, 0xCA, 0x00, 0x00, 0x39, 0xCA, 0x00, 0x00, 0x7C, 0xCA, 0x00, 0x00, 0x7C, -/* 00005400 */ 0xCA, 0x00, 0x00, 0xAA, 0xCA, 0x00, 0x00, 0xAA, 0xCA, 0x00, 0x00, 0xAB, 0xCA, 0x00, 0x00, 0xAB, -/* 00005410 */ 0xCA, 0x00, 0x00, 0xD9, 0xCA, 0x00, 0x00, 0xD9, 0xCA, 0x00, 0x00, 0x11, 0xCB, 0x00, 0x00, 0x11, -/* 00005420 */ 0xCB, 0x00, 0x00, 0x23, 0xCB, 0x00, 0x00, 0x23, 0xCB, 0x00, 0x00, 0x24, 0xCB, 0x00, 0x00, 0x24, -/* 00005430 */ 0xCB, 0x00, 0x00, 0x59, 0xCB, 0x00, 0x00, 0x59, 0xCB, 0x00, 0x00, 0x9F, 0xCB, 0x00, 0x00, 0x9F, -/* 00005440 */ 0xCB, 0x00, 0x00, 0xFE, 0xCB, 0x00, 0x00, 0xFE, 0xCB, 0x00, 0x00, 0x36, 0xCC, 0x00, 0x00, 0x36, -/* 00005450 */ 0xCC, 0x00, 0x00, 0x98, 0xCC, 0x00, 0x00, 0x98, 0xCC, 0x00, 0x00, 0xD5, 0xCC, 0x00, 0x00, 0xD5, -/* 00005460 */ 0xCC, 0x00, 0x00, 0x35, 0xCD, 0x00, 0x00, 0x35, 0xCD, 0x00, 0x00, 0x72, 0xCD, 0x00, 0x00, 0x72, -/* 00005470 */ 0xCD, 0x00, 0x00, 0xD2, 0xCD, 0x00, 0x00, 0xD2, 0xCD, 0x00, 0x00, 0xE8, 0xCD, 0x00, 0x00, 0xE8, -/* 00005480 */ 0xCD, 0x00, 0x00, 0xFA, 0xCD, 0x00, 0x00, 0xFA, 0xCD, 0x00, 0x00, 0xFB, 0xCD, 0x00, 0x00, 0xFB, -/* 00005490 */ 0xCD, 0x00, 0x00, 0x47, 0xCE, 0x00, 0x00, 0x47, 0xCE, 0x00, 0x00, 0x95, 0xCE, 0x00, 0x00, 0x95, -/* 000054A0 */ 0xCE, 0x00, 0x00, 0xE3, 0xCE, 0x00, 0x00, 0xE3, 0xCE, 0x00, 0x00, 0xE4, 0xCE, 0x00, 0x00, 0xE4, -/* 000054B0 */ 0xCE, 0x00, 0x00, 0x22, 0xCF, 0x00, 0x00, 0x22, 0xCF, 0x00, 0x00, 0x7A, 0xCF, 0x00, 0x00, 0x7A, -/* 000054C0 */ 0xCF, 0x00, 0x00, 0xD2, 0xCF, 0x00, 0x00, 0xD2, 0xCF, 0x00, 0x00, 0xE4, 0xCF, 0x00, 0x00, 0xE4, -/* 000054D0 */ 0xCF, 0x00, 0x00, 0xE5, 0xCF, 0x00, 0x00, 0xE5, 0xCF, 0x00, 0x00, 0x25, 0xD0, 0x00, 0x00, 0x25, -/* 000054E0 */ 0xD0, 0x00, 0x00, 0x5F, 0xD0, 0x00, 0x00, 0x5F, 0xD0, 0x00, 0x00, 0x60, 0xD0, 0x00, 0x00, 0x60, -/* 000054F0 */ 0xD0, 0x00, 0x00, 0x76, 0xD0, 0x00, 0x00, 0x76, 0xD0, 0x00, 0x00, 0xCA, 0xD0, 0x00, 0x00, 0xCA, -/* 00005500 */ 0xD0, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0x11, 0xD1, 0x00, 0x00, 0x11, -/* 00005510 */ 0xD1, 0x00, 0x00, 0x2D, 0xD1, 0x00, 0x00, 0x2D, 0xD1, 0x00, 0x00, 0x57, 0xD1, 0x00, 0x00, 0x57, -/* 00005520 */ 0xD1, 0x00, 0x00, 0xAE, 0xD1, 0x00, 0x00, 0xAE, 0xD1, 0x00, 0x00, 0x33, 0xD2, 0x00, 0x00, 0x33, -/* 00005530 */ 0xD2, 0x00, 0x00, 0x98, 0xD2, 0x00, 0x00, 0x98, 0xD2, 0x00, 0x00, 0xD3, 0xD2, 0x00, 0x00, 0xD3, -/* 00005540 */ 0xD2, 0x00, 0x00, 0xE5, 0xD2, 0x00, 0x00, 0xE5, 0xD2, 0x00, 0x00, 0xE6, 0xD2, 0x00, 0x00, 0xE6, -/* 00005550 */ 0xD2, 0x00, 0x00, 0x1B, 0xD3, 0x00, 0x00, 0x1B, 0xD3, 0x00, 0x00, 0x2D, 0xD3, 0x00, 0x00, 0x2D, -/* 00005560 */ 0xD3, 0x00, 0x00, 0x8E, 0xD3, 0x00, 0x00, 0x8E, 0xD3, 0x00, 0x00, 0xA0, 0xD3, 0x00, 0x00, 0xA0, -/* 00005570 */ 0xD3, 0x00, 0x00, 0xA1, 0xD3, 0x00, 0x00, 0xA1, 0xD3, 0x00, 0x00, 0x1F, 0xD4, 0x00, 0x00, 0x1F, -/* 00005580 */ 0xD4, 0x00, 0x00, 0x5E, 0xD4, 0x00, 0x00, 0x5E, 0xD4, 0x00, 0x00, 0x6C, 0xD4, 0x00, 0x00, 0x6C, -/* 00005590 */ 0xD4, 0x00, 0x00, 0x6D, 0xD4, 0x00, 0x00, 0x6D, 0xD4, 0x00, 0x00, 0xDD, 0xD4, 0x00, 0x00, 0xDD, -/* 000055A0 */ 0xD4, 0x00, 0x00, 0x2C, 0xD5, 0x00, 0x00, 0x2C, 0xD5, 0x00, 0x00, 0x8D, 0xD5, 0x00, 0x00, 0x8D, -/* 000055B0 */ 0xD5, 0x00, 0x00, 0x9F, 0xD5, 0x00, 0x00, 0x9F, 0xD5, 0x00, 0x00, 0xA0, 0xD5, 0x00, 0x00, 0xA0, -/* 000055C0 */ 0xD5, 0x00, 0x00, 0xDA, 0xD5, 0x00, 0x00, 0xDA, 0xD5, 0x00, 0x00, 0x2B, 0xD6, 0x00, 0x00, 0x2B, -/* 000055D0 */ 0xD6, 0x00, 0x00, 0x2C, 0xD6, 0x00, 0x00, 0x2C, 0xD6, 0x00, 0x00, 0x5D, 0xD6, 0x00, 0x00, 0x5D, -/* 000055E0 */ 0xD6, 0x00, 0x00, 0xB1, 0xD6, 0x00, 0x00, 0xB1, 0xD6, 0x00, 0x00, 0x06, 0xD7, 0x00, 0x00, 0x06, -/* 000055F0 */ 0xD7, 0x00, 0x00, 0x1A, 0xD7, 0x00, 0x00, 0x1A, 0xD7, 0x00, 0x00, 0x1B, 0xD7, 0x00, 0x00, 0x1B, -/* 00005600 */ 0xD7, 0x00, 0x00, 0x42, 0xD7, 0x00, 0x00, 0x42, 0xD7, 0x00, 0x00, 0x6C, 0xD7, 0x00, 0x00, 0x6C, -/* 00005610 */ 0xD7, 0x00, 0x00, 0xD2, 0xD7, 0x00, 0x00, 0xD2, 0xD7, 0x00, 0x00, 0x49, 0xD8, 0x00, 0x00, 0x49, -/* 00005620 */ 0xD8, 0x00, 0x00, 0xBB, 0xD8, 0x00, 0x00, 0xBB, 0xD8, 0x00, 0x00, 0xE8, 0xD8, 0x00, 0x00, 0xE8, -/* 00005630 */ 0xD8, 0x00, 0x00, 0x15, 0xD9, 0x00, 0x00, 0x15, 0xD9, 0x00, 0x00, 0x5C, 0xD9, 0x00, 0x00, 0x5C, -/* 00005640 */ 0xD9, 0x00, 0x00, 0xA3, 0xD9, 0x00, 0x00, 0xA3, 0xD9, 0x00, 0x00, 0xA4, 0xD9, 0x00, 0x00, 0xA4, -/* 00005650 */ 0xD9, 0x00, 0x00, 0xE3, 0xD9, 0x00, 0x00, 0xE3, 0xD9, 0x00, 0x00, 0x26, 0xDA, 0x00, 0x00, 0x26, -/* 00005660 */ 0xDA, 0x00, 0x00, 0x3C, 0xDA, 0x00, 0x00, 0x3C, 0xDA, 0x00, 0x00, 0x3D, 0xDA, 0x00, 0x00, 0x3D, -/* 00005670 */ 0xDA, 0x00, 0x00, 0x74, 0xDA, 0x00, 0x00, 0x74, 0xDA, 0x00, 0x00, 0x75, 0xDA, 0x00, 0x00, 0x75, -/* 00005680 */ 0xDA, 0x00, 0x00, 0xA9, 0xDA, 0x00, 0x00, 0xA9, 0xDA, 0x00, 0x00, 0xF6, 0xDA, 0x00, 0x00, 0xF6, -/* 00005690 */ 0xDA, 0x00, 0x00, 0x0C, 0xDB, 0x00, 0x00, 0x0C, 0xDB, 0x00, 0x00, 0x0D, 0xDB, 0x00, 0x00, 0x0D, -/* 000056A0 */ 0xDB, 0x00, 0x00, 0x48, 0xDB, 0x00, 0x00, 0x48, 0xDB, 0x00, 0x00, 0x8E, 0xDB, 0x00, 0x00, 0x8E, -/* 000056B0 */ 0xDB, 0x00, 0x00, 0x8F, 0xDB, 0x00, 0x00, 0x8F, 0xDB, 0x00, 0x00, 0xC5, 0xDB, 0x00, 0x00, 0xC5, -/* 000056C0 */ 0xDB, 0x00, 0x00, 0x04, 0xDC, 0x00, 0x00, 0x04, 0xDC, 0x00, 0x00, 0x49, 0xDC, 0x00, 0x00, 0x49, -/* 000056D0 */ 0xDC, 0x00, 0x00, 0x5F, 0xDC, 0x00, 0x00, 0x5F, 0xDC, 0x00, 0x00, 0x60, 0xDC, 0x00, 0x00, 0x60, -/* 000056E0 */ 0xDC, 0x00, 0x00, 0xAC, 0xDC, 0x00, 0x00, 0xAC, 0xDC, 0x00, 0x00, 0xAD, 0xDC, 0x00, 0x00, 0xAD, -/* 000056F0 */ 0xDC, 0x00, 0x00, 0x12, 0xDD, 0x00, 0x00, 0x12, 0xDD, 0x00, 0x00, 0x4E, 0xDD, 0x00, 0x00, 0x4E, -/* 00005700 */ 0xDD, 0x00, 0x00, 0x4F, 0xDD, 0x00, 0x00, 0x4F, 0xDD, 0x00, 0x00, 0x6F, 0xDD, 0x00, 0x00, 0x6F, -/* 00005710 */ 0xDD, 0x00, 0x00, 0x81, 0xDD, 0x00, 0x00, 0x81, 0xDD, 0x00, 0x00, 0xC7, 0xDD, 0x00, 0x00, 0xC7, -/* 00005720 */ 0xDD, 0x00, 0x00, 0xC8, 0xDD, 0x00, 0x00, 0xC8, 0xDD, 0x00, 0x00, 0xED, 0xDD, 0x00, 0x00, 0xED, -/* 00005730 */ 0xDD, 0x00, 0x00, 0x1B, 0xDE, 0x00, 0x00, 0x1B, 0xDE, 0x00, 0x00, 0x1C, 0xDE, 0x00, 0x00, 0x1C, -/* 00005740 */ 0xDE, 0x00, 0x00, 0x50, 0xDE, 0x00, 0x00, 0x50, 0xDE, 0x00, 0x00, 0xB9, 0xDE, 0x00, 0x00, 0xB9, -/* 00005750 */ 0xDE, 0x00, 0x00, 0xCF, 0xDE, 0x00, 0x00, 0xCF, 0xDE, 0x00, 0x00, 0xD0, 0xDE, 0x00, 0x00, 0xD0, -/* 00005760 */ 0xDE, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0x78, 0xDF, 0x00, 0x00, 0x78, -/* 00005770 */ 0xDF, 0x00, 0x00, 0xE1, 0xDF, 0x00, 0x00, 0xE1, 0xDF, 0x00, 0x00, 0xF7, 0xDF, 0x00, 0x00, 0xF7, -/* 00005780 */ 0xDF, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00, 0x50, 0xE0, 0x00, 0x00, 0x50, -/* 00005790 */ 0xE0, 0x00, 0x00, 0xAA, 0xE0, 0x00, 0x00, 0xAA, 0xE0, 0x00, 0x00, 0xBC, 0xE0, 0x00, 0x00, 0xBC, -/* 000057A0 */ 0xE0, 0x00, 0x00, 0x0D, 0xE1, 0x00, 0x00, 0x0D, 0xE1, 0x00, 0x00, 0x0E, 0xE1, 0x00, 0x00, 0x0E, -/* 000057B0 */ 0xE1, 0x00, 0x00, 0xA8, 0xE1, 0x00, 0x00, 0xA8, 0xE1, 0x00, 0x00, 0xA9, 0xE1, 0x00, 0x00, 0xA9, -/* 000057C0 */ 0xE1, 0x00, 0x00, 0x25, 0xE2, 0x00, 0x00, 0x25, 0xE2, 0x00, 0x00, 0xA3, 0xE2, 0x00, 0x00, 0xA3, -/* 000057D0 */ 0xE2, 0x00, 0x00, 0xC7, 0xE2, 0x00, 0x00, 0xC7, 0xE2, 0x00, 0x00, 0xC8, 0xE2, 0x00, 0x00, 0xC8, -/* 000057E0 */ 0xE2, 0x00, 0x00, 0x61, 0xE3, 0x00, 0x00, 0x61, 0xE3, 0x00, 0x00, 0xA9, 0xE3, 0x00, 0x00, 0xA9, -/* 000057F0 */ 0xE3, 0x00, 0x00, 0x46, 0xE4, 0x00, 0x00, 0x46, 0xE4, 0x00, 0x00, 0x47, 0xE4, 0x00, 0x00, 0x47, -/* 00005800 */ 0xE4, 0x00, 0x00, 0x99, 0xE4, 0x00, 0x00, 0x99, 0xE4, 0x00, 0x00, 0xD1, 0xE4, 0x00, 0x00, 0xD1, -/* 00005810 */ 0xE4, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x7F, -/* 00005820 */ 0xE5, 0x00, 0x00, 0x99, 0xE5, 0x00, 0x00, 0x99, 0xE5, 0x00, 0x00, 0xE4, 0xE5, 0x00, 0x00, 0xE4, -/* 00005830 */ 0xE5, 0x00, 0x00, 0x49, 0xE6, 0x00, 0x00, 0x49, 0xE6, 0x00, 0x00, 0xBF, 0xE6, 0x00, 0x00, 0xBF, -/* 00005840 */ 0xE6, 0x00, 0x00, 0xD9, 0xE6, 0x00, 0x00, 0xD9, 0xE6, 0x00, 0x00, 0xDA, 0xE6, 0x00, 0x00, 0xDA, -/* 00005850 */ 0xE6, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x21, 0xE7, 0x00, 0x00, 0x21, -/* 00005860 */ 0xE7, 0x00, 0x00, 0x7D, 0xE7, 0x00, 0x00, 0x7D, 0xE7, 0x00, 0x00, 0xD3, 0xE7, 0x00, 0x00, 0xD3, -/* 00005870 */ 0xE7, 0x00, 0x00, 0x2A, 0xE8, 0x00, 0x00, 0x2A, 0xE8, 0x00, 0x00, 0x48, 0xE8, 0x00, 0x00, 0x48, -/* 00005880 */ 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, 0x64, 0xE8, 0x00, 0x00, 0x65, 0xE8, 0x00, 0x00, 0x65, -/* 00005890 */ 0xE8, 0x00, 0x00, 0xA7, 0xE8, 0x00, 0x00, 0xA7, 0xE8, 0x00, 0x00, 0xF4, 0xE8, 0x00, 0x00, 0xF4, -/* 000058A0 */ 0xE8, 0x00, 0x00, 0x08, 0xE9, 0x00, 0x00, 0x08, 0xE9, 0x00, 0x00, 0x09, 0xE9, 0x00, 0x00, 0x09, -/* 000058B0 */ 0xE9, 0x00, 0x00, 0x52, 0xE9, 0x00, 0x00, 0x52, 0xE9, 0x00, 0x00, 0x99, 0xE9, 0x00, 0x00, 0x99, -/* 000058C0 */ 0xE9, 0x00, 0x00, 0xD1, 0xE9, 0x00, 0x00, 0xD1, 0xE9, 0x00, 0x00, 0x3E, 0xEA, 0x00, 0x00, 0x3E, -/* 000058D0 */ 0xEA, 0x00, 0x00, 0x58, 0xEA, 0x00, 0x00, 0x58, 0xEA, 0x00, 0x00, 0x59, 0xEA, 0x00, 0x00, 0x59, -/* 000058E0 */ 0xEA, 0x00, 0x00, 0xA4, 0xEA, 0x00, 0x00, 0xA4, 0xEA, 0x00, 0x00, 0x09, 0xEB, 0x00, 0x00, 0x09, -/* 000058F0 */ 0xEB, 0x00, 0x00, 0x76, 0xEB, 0x00, 0x00, 0x76, 0xEB, 0x00, 0x00, 0x90, 0xEB, 0x00, 0x00, 0x90, -/* 00005900 */ 0xEB, 0x00, 0x00, 0x91, 0xEB, 0x00, 0x00, 0x91, 0xEB, 0x00, 0x00, 0xCC, 0xEB, 0x00, 0x00, 0xCC, -/* 00005910 */ 0xEB, 0x00, 0x00, 0x0A, 0xEC, 0x00, 0x00, 0x0A, 0xEC, 0x00, 0x00, 0x1E, 0xEC, 0x00, 0x00, 0x1E, -/* 00005920 */ 0xEC, 0x00, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x44, 0xEC, 0x00, 0x00, 0x44, -/* 00005930 */ 0xEC, 0x00, 0x00, 0x52, 0xEC, 0x00, 0x00, 0x52, 0xEC, 0x00, 0x00, 0x5C, 0xEC, 0x00, 0x00, 0x5C, -/* 00005940 */ 0xEC, 0x00, 0x00, 0xAB, 0xEC, 0x00, 0x00, 0xAB, 0xEC, 0x00, 0x00, 0xC5, 0xEC, 0x00, 0x00, 0xC5, -/* 00005950 */ 0xEC, 0x00, 0x00, 0xCF, 0xEC, 0x00, 0x00, 0xCF, 0xEC, 0x00, 0x00, 0xD0, 0xEC, 0x00, 0x00, 0xD0, -/* 00005960 */ 0xEC, 0x00, 0x00, 0x50, 0xED, 0x00, 0x00, 0x50, 0xED, 0x00, 0x00, 0x78, 0xED, 0x00, 0x00, 0x78, -/* 00005970 */ 0xED, 0x00, 0x00, 0x79, 0xED, 0x00, 0x00, 0x79, 0xED, 0x00, 0x00, 0xB3, 0xED, 0x00, 0x00, 0xB3, -/* 00005980 */ 0xED, 0x00, 0x00, 0xF9, 0xED, 0x00, 0x00, 0xF9, 0xED, 0x00, 0x00, 0x26, 0xEE, 0x00, 0x00, 0x26, -/* 00005990 */ 0xEE, 0x00, 0x00, 0x5C, 0xEE, 0x00, 0x00, 0x5C, 0xEE, 0x00, 0x00, 0x75, 0xEE, 0x00, 0x00, 0x75, -/* 000059A0 */ 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xC1, 0xEE, 0x00, 0x00, 0xC1, -/* 000059B0 */ 0xEE, 0x00, 0x00, 0xC2, 0xEE, 0x00, 0x00, 0xC2, 0xEE, 0x00, 0x00, 0xEB, 0xEE, 0x00, 0x00, 0xEB, -/* 000059C0 */ 0xEE, 0x00, 0x00, 0x2C, 0xEF, 0x00, 0x00, 0x2C, 0xEF, 0x00, 0x00, 0xBF, 0xEF, 0x00, 0x00, 0xBF, -/* 000059D0 */ 0xEF, 0x00, 0x00, 0xED, 0xEF, 0x00, 0x00, 0xED, 0xEF, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x03, -/* 000059E0 */ 0xF0, 0x00, 0x00, 0x15, 0xF0, 0x00, 0x00, 0x15, 0xF0, 0x00, 0x00, 0x56, 0xF0, 0x00, 0x00, 0x56, -/* 000059F0 */ 0xF0, 0x00, 0x00, 0xCC, 0xF0, 0x00, 0x00, 0xCC, 0xF0, 0x00, 0x00, 0xFA, 0xF0, 0x00, 0x00, 0xFA, -/* 00005A00 */ 0xF0, 0x00, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x22, 0xF1, 0x00, 0x00, 0x22, -/* 00005A10 */ 0xF1, 0x00, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x76, 0xF1, 0x00, 0x00, 0x76, -/* 00005A20 */ 0xF1, 0x00, 0x00, 0xB2, 0xF1, 0x00, 0x00, 0xB2, 0xF1, 0x00, 0x00, 0xEC, 0xF1, 0x00, 0x00, 0xEC, -/* 00005A30 */ 0xF1, 0x00, 0x00, 0x29, 0xF2, 0x00, 0x00, 0x29, 0xF2, 0x00, 0x00, 0x41, 0xF2, 0x00, 0x00, 0x41, -/* 00005A40 */ 0xF2, 0x00, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0xB8, 0xF2, 0x00, 0x00, 0xB8, -/* 00005A50 */ 0xF2, 0x00, 0x00, 0xF5, 0xF2, 0x00, 0x00, 0xF5, 0xF2, 0x00, 0x00, 0x0D, 0xF3, 0x00, 0x00, 0x0D, -/* 00005A60 */ 0xF3, 0x00, 0x00, 0x48, 0xF3, 0x00, 0x00, 0x48, 0xF3, 0x00, 0x00, 0x82, 0xF3, 0x00, 0x00, 0x82, -/* 00005A70 */ 0xF3, 0x00, 0x00, 0xBF, 0xF3, 0x00, 0x00, 0xBF, 0xF3, 0x00, 0x00, 0xD7, 0xF3, 0x00, 0x00, 0xD7, -/* 00005A80 */ 0xF3, 0x00, 0x00, 0xE9, 0xF3, 0x00, 0x00, 0xE9, 0xF3, 0x00, 0x00, 0x3C, 0xF4, 0x00, 0x00, 0x3C, -/* 00005A90 */ 0xF4, 0x00, 0x00, 0x78, 0xF4, 0x00, 0x00, 0x78, 0xF4, 0x00, 0x00, 0xB2, 0xF4, 0x00, 0x00, 0xB2, -/* 00005AA0 */ 0xF4, 0x00, 0x00, 0xEF, 0xF4, 0x00, 0x00, 0xEF, 0xF4, 0x00, 0x00, 0x07, 0xF5, 0x00, 0x00, 0x07, -/* 00005AB0 */ 0xF5, 0x00, 0x00, 0x45, 0xF5, 0x00, 0x00, 0x45, 0xF5, 0x00, 0x00, 0x7F, 0xF5, 0x00, 0x00, 0x7F, -/* 00005AC0 */ 0xF5, 0x00, 0x00, 0xBC, 0xF5, 0x00, 0x00, 0xBC, 0xF5, 0x00, 0x00, 0xD4, 0xF5, 0x00, 0x00, 0xD4, -/* 00005AD0 */ 0xF5, 0x00, 0x00, 0x12, 0xF6, 0x00, 0x00, 0x12, 0xF6, 0x00, 0x00, 0x4C, 0xF6, 0x00, 0x00, 0x4C, -/* 00005AE0 */ 0xF6, 0x00, 0x00, 0x89, 0xF6, 0x00, 0x00, 0x89, 0xF6, 0x00, 0x00, 0xA1, 0xF6, 0x00, 0x00, 0xA1, -/* 00005AF0 */ 0xF6, 0x00, 0x00, 0xB3, 0xF6, 0x00, 0x00, 0xB3, 0xF6, 0x00, 0x00, 0xD3, 0xF6, 0x00, 0x00, 0xD3, -/* 00005B00 */ 0xF6, 0x00, 0x00, 0xE1, 0xF6, 0x00, 0x00, 0xE1, 0xF6, 0x00, 0x00, 0xE2, 0xF6, 0x00, 0x00, 0xE2, -/* 00005B10 */ 0xF6, 0x00, 0x00, 0x6C, 0xF7, 0x00, 0x00, 0x6C, 0xF7, 0x00, 0x00, 0xA9, 0xF7, 0x00, 0x00, 0xA9, -/* 00005B20 */ 0xF7, 0x00, 0x00, 0xCC, 0xF7, 0x00, 0x00, 0xCC, 0xF7, 0x00, 0x00, 0xCD, 0xF7, 0x00, 0x00, 0xCD, -/* 00005B30 */ 0xF7, 0x00, 0x00, 0xF4, 0xF7, 0x00, 0x00, 0xF4, 0xF7, 0x00, 0x00, 0x4B, 0xF8, 0x00, 0x00, 0x4B, -/* 00005B40 */ 0xF8, 0x00, 0x00, 0xAB, 0xF8, 0x00, 0x00, 0xAB, 0xF8, 0x00, 0x00, 0xE8, 0xF8, 0x00, 0x00, 0xE8, -/* 00005B50 */ 0xF8, 0x00, 0x00, 0x41, 0xF9, 0x00, 0x00, 0x41, 0xF9, 0x00, 0x00, 0x57, 0xF9, 0x00, 0x00, 0x57, -/* 00005B60 */ 0xF9, 0x00, 0x00, 0x69, 0xF9, 0x00, 0x00, 0x69, 0xF9, 0x00, 0x00, 0x6A, 0xF9, 0x00, 0x00, 0x6A, -/* 00005B70 */ 0xF9, 0x00, 0x00, 0x95, 0xF9, 0x00, 0x00, 0x95, 0xF9, 0x00, 0x00, 0xB9, 0xF9, 0x00, 0x00, 0xB9, -/* 00005B80 */ 0xF9, 0x00, 0x00, 0xEF, 0xF9, 0x00, 0x00, 0xEF, 0xF9, 0x00, 0x00, 0x4A, 0xFA, 0x00, 0x00, 0x4A, -/* 00005B90 */ 0xFA, 0x00, 0x00, 0x87, 0xFA, 0x00, 0x00, 0x87, 0xFA, 0x00, 0x00, 0xDB, 0xFA, 0x00, 0x00, 0xDB, -/* 00005BA0 */ 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0x03, 0xFB, 0x00, 0x00, 0x03, -/* 00005BB0 */ 0xFB, 0x00, 0x00, 0x04, 0xFB, 0x00, 0x00, 0x04, 0xFB, 0x00, 0x00, 0x29, 0xFB, 0x00, 0x00, 0x29, -/* 00005BC0 */ 0xFB, 0x00, 0x00, 0x7F, 0xFB, 0x00, 0x00, 0x7F, 0xFB, 0x00, 0x00, 0xD6, 0xFB, 0x00, 0x00, 0xD6, -/* 00005BD0 */ 0xFB, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x8C, 0xFC, 0x00, 0x00, 0x8C, -/* 00005BE0 */ 0xFC, 0x00, 0x00, 0xC7, 0xFC, 0x00, 0x00, 0xC7, 0xFC, 0x00, 0x00, 0x1C, 0xFD, 0x00, 0x00, 0x1C, -/* 00005BF0 */ 0xFD, 0x00, 0x00, 0x32, 0xFD, 0x00, 0x00, 0x32, 0xFD, 0x00, 0x00, 0x44, 0xFD, 0x00, 0x00, 0x44, -/* 00005C00 */ 0xFD, 0x00, 0x00, 0x45, 0xFD, 0x00, 0x00, 0x45, 0xFD, 0x00, 0x00, 0x68, 0xFD, 0x00, 0x00, 0x68, -/* 00005C10 */ 0xFD, 0x00, 0x00, 0xB2, 0xFD, 0x00, 0x00, 0xB2, 0xFD, 0x00, 0x00, 0xC4, 0xFD, 0x00, 0x00, 0xC4, -/* 00005C20 */ 0xFD, 0x00, 0x00, 0xC5, 0xFD, 0x00, 0x00, 0xC5, 0xFD, 0x00, 0x00, 0xF1, 0xFD, 0x00, 0x00, 0xF1, -/* 00005C30 */ 0xFD, 0x00, 0x00, 0x2D, 0xFE, 0x00, 0x00, 0x2D, 0xFE, 0x00, 0x00, 0x8C, 0xFE, 0x00, 0x00, 0x8C, -/* 00005C40 */ 0xFE, 0x00, 0x00, 0xCE, 0xFE, 0x00, 0x00, 0xCE, 0xFE, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x00, 0x26, -/* 00005C50 */ 0xFF, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x4E, 0xFF, 0x00, 0x00, 0x4E, -/* 00005C60 */ 0xFF, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0xB5, 0xFF, 0x00, 0x00, 0xB5, -/* 00005C70 */ 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x00, 0x00, 0x29, 0x00, 0x01, 0x00, 0x29, -/* 00005C80 */ 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x53, 0x00, 0x01, 0x00, 0x53, -/* 00005C90 */ 0x00, 0x01, 0x00, 0x54, 0x00, 0x01, 0x00, 0x54, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x01, 0x00, 0x8A, -/* 00005CA0 */ 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0E, 0x01, 0x01, 0x00, 0x0E, -/* 00005CB0 */ 0x01, 0x01, 0x00, 0x0F, 0x01, 0x01, 0x00, 0x0F, 0x01, 0x01, 0x00, 0x3C, 0x01, 0x01, 0x00, 0x3C, -/* 00005CC0 */ 0x01, 0x01, 0x00, 0x6C, 0x01, 0x01, 0x00, 0x6C, 0x01, 0x01, 0x00, 0x98, 0x01, 0x01, 0x00, 0x98, -/* 00005CD0 */ 0x01, 0x01, 0x00, 0xC4, 0x01, 0x01, 0x00, 0xC4, 0x01, 0x01, 0x00, 0xF4, 0x01, 0x01, 0x00, 0xF4, -/* 00005CE0 */ 0x01, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x4C, 0x02, 0x01, 0x00, 0x4C, -/* 00005CF0 */ 0x02, 0x01, 0x00, 0x81, 0x02, 0x01, 0x00, 0x81, 0x02, 0x01, 0x00, 0xA9, 0x02, 0x01, 0x00, 0xA9, -/* 00005D00 */ 0x02, 0x01, 0x00, 0xD4, 0x02, 0x01, 0x00, 0xD4, 0x02, 0x01, 0x00, 0xE3, 0x02, 0x01, 0x00, 0xE3, -/* 00005D10 */ 0x02, 0x01, 0x00, 0xE4, 0x02, 0x01, 0x00, 0xE4, 0x02, 0x01, 0x00, 0x1B, 0x03, 0x01, 0x00, 0x1B, -/* 00005D20 */ 0x03, 0x01, 0x00, 0x52, 0x03, 0x01, 0x00, 0x52, 0x03, 0x01, 0x00, 0x71, 0x03, 0x01, 0x00, 0x71, -/* 00005D30 */ 0x03, 0x01, 0x00, 0x83, 0x03, 0x01, 0x00, 0x83, 0x03, 0x01, 0x00, 0x84, 0x03, 0x01, 0x00, 0x84, -/* 00005D40 */ 0x03, 0x01, 0x00, 0xCC, 0x03, 0x01, 0x00, 0xCC, 0x03, 0x01, 0x00, 0xDA, 0x03, 0x01, 0x00, 0xDA, -/* 00005D50 */ 0x03, 0x01, 0x00, 0xDB, 0x03, 0x01, 0x00, 0xDB, 0x03, 0x01, 0x00, 0x4B, 0x04, 0x01, 0x00, 0x4B, -/* 00005D60 */ 0x04, 0x01, 0x00, 0xA7, 0x04, 0x01, 0x00, 0xA7, 0x04, 0x01, 0x00, 0x1D, 0x05, 0x01, 0x00, 0x1D, -/* 00005D70 */ 0x05, 0x01, 0x00, 0xAE, 0x05, 0x01, 0x00, 0xAE, 0x05, 0x01, 0x00, 0x2C, 0x06, 0x01, 0x00, 0x2C, -/* 00005D80 */ 0x06, 0x01, 0x00, 0x52, 0x06, 0x01, 0x00, 0x52, 0x06, 0x01, 0x00, 0x47, 0x07, 0x01, 0x00, 0x47, -/* 00005D90 */ 0x07, 0x01, 0x00, 0x71, 0x07, 0x01, 0x00, 0x71, 0x07, 0x01, 0x00, 0x83, 0x07, 0x01, 0x00, 0x83, -/* 00005DA0 */ 0x07, 0x01, 0x00, 0x84, 0x07, 0x01, 0x00, 0x84, 0x07, 0x01, 0x00, 0xC7, 0x07, 0x01, 0x00, 0xC7, -/* 00005DB0 */ 0x07, 0x01, 0x00, 0x49, 0x08, 0x01, 0x00, 0x49, 0x08, 0x01, 0x00, 0x7C, 0x08, 0x01, 0x00, 0x7C, -/* 00005DC0 */ 0x08, 0x01, 0x00, 0x32, 0x09, 0x01, 0x00, 0x32, 0x09, 0x01, 0x00, 0x44, 0x09, 0x01, 0x00, 0x44, -/* 00005DD0 */ 0x09, 0x01, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x78, 0x09, 0x01, 0x00, 0x78, -/* 00005DE0 */ 0x09, 0x01, 0x00, 0x79, 0x09, 0x01, 0x00, 0x79, 0x09, 0x01, 0x00, 0xDE, 0x09, 0x01, 0x00, 0xDE, -/* 00005DF0 */ 0x09, 0x01, 0x00, 0x28, 0x0A, 0x01, 0x00, 0x28, 0x0A, 0x01, 0x00, 0x9C, 0x0A, 0x01, 0x00, 0x9C, -/* 00005E00 */ 0x0A, 0x01, 0x00, 0x2D, 0x0B, 0x01, 0x00, 0x2D, 0x0B, 0x01, 0x00, 0x53, 0x0B, 0x01, 0x00, 0x53, -/* 00005E10 */ 0x0B, 0x01, 0x00, 0x53, 0x0C, 0x01, 0x00, 0x53, 0x0C, 0x01, 0x00, 0x7D, 0x0C, 0x01, 0x00, 0x7D, -/* 00005E20 */ 0x0C, 0x01, 0x00, 0x8F, 0x0C, 0x01, 0x00, 0x8F, 0x0C, 0x01, 0x00, 0x90, 0x0C, 0x01, 0x00, 0x90, -/* 00005E30 */ 0x0C, 0x01, 0x00, 0xDA, 0x0C, 0x01, 0x00, 0xDA, 0x0C, 0x01, 0x00, 0x09, 0x0D, 0x01, 0x00, 0x09, -/* 00005E40 */ 0x0D, 0x01, 0x00, 0x87, 0x0D, 0x01, 0x00, 0x87, 0x0D, 0x01, 0x00, 0xBC, 0x0D, 0x01, 0x00, 0xBC, -/* 00005E50 */ 0x0D, 0x01, 0x00, 0x37, 0x0E, 0x01, 0x00, 0x37, 0x0E, 0x01, 0x00, 0x49, 0x0E, 0x01, 0x00, 0x49, -/* 00005E60 */ 0x0E, 0x01, 0x00, 0x4A, 0x0E, 0x01, 0x00, 0x4A, 0x0E, 0x01, 0x00, 0x70, 0x0E, 0x01, 0x00, 0x70, -/* 00005E70 */ 0x0E, 0x01, 0x00, 0x7E, 0x0E, 0x01, 0x00, 0x7E, 0x0E, 0x01, 0x00, 0x7F, 0x0E, 0x01, 0x00, 0x7F, -/* 00005E80 */ 0x0E, 0x01, 0x00, 0xE1, 0x0E, 0x01, 0x00, 0xE1, 0x0E, 0x01, 0x00, 0x2C, 0x0F, 0x01, 0x00, 0x2C, -/* 00005E90 */ 0x0F, 0x01, 0x00, 0x6A, 0x0F, 0x01, 0x00, 0x6A, 0x0F, 0x01, 0x00, 0xE3, 0x0F, 0x01, 0x00, 0xE3, -/* 00005EA0 */ 0x0F, 0x01, 0x00, 0xF5, 0x0F, 0x01, 0x00, 0xF5, 0x0F, 0x01, 0x00, 0xF6, 0x0F, 0x01, 0x00, 0xF6, -/* 00005EB0 */ 0x0F, 0x01, 0x00, 0x30, 0x10, 0x01, 0x00, 0x30, 0x10, 0x01, 0x00, 0x9D, 0x10, 0x01, 0x00, 0x9D, -/* 00005EC0 */ 0x10, 0x01, 0x00, 0xFC, 0x10, 0x01, 0x00, 0xFC, 0x10, 0x01, 0x00, 0x71, 0x11, 0x01, 0x00, 0x71, -/* 00005ED0 */ 0x11, 0x01, 0x00, 0x83, 0x11, 0x01, 0x00, 0x83, 0x11, 0x01, 0x00, 0x84, 0x11, 0x01, 0x00, 0x84, -/* 00005EE0 */ 0x11, 0x01, 0x00, 0xBF, 0x11, 0x01, 0x00, 0xBF, 0x11, 0x01, 0x00, 0x2A, 0x12, 0x01, 0x00, 0x2A, -/* 00005EF0 */ 0x12, 0x01, 0x00, 0x54, 0x12, 0x01, 0x00, 0x54, 0x12, 0x01, 0x00, 0xC8, 0x12, 0x01, 0x00, 0xC8, -/* 00005F00 */ 0x12, 0x01, 0x00, 0xE5, 0x12, 0x01, 0x00, 0xE5, 0x12, 0x01, 0x00, 0x68, 0x13, 0x01, 0x00, 0x68, -/* 00005F10 */ 0x13, 0x01, 0x00, 0x7E, 0x13, 0x01, 0x00, 0x7E, 0x13, 0x01, 0x00, 0xBD, 0x13, 0x01, 0x00, 0xBD, -/* 00005F20 */ 0x13, 0x01, 0x00, 0x28, 0x14, 0x01, 0x00, 0x28, 0x14, 0x01, 0x00, 0x52, 0x14, 0x01, 0x00, 0x52, -/* 00005F30 */ 0x14, 0x01, 0x00, 0xC6, 0x14, 0x01, 0x00, 0xC6, 0x14, 0x01, 0x00, 0xE3, 0x14, 0x01, 0x00, 0xE3, -/* 00005F40 */ 0x14, 0x01, 0x00, 0x5C, 0x15, 0x01, 0x00, 0x5C, 0x15, 0x01, 0x00, 0x72, 0x15, 0x01, 0x00, 0x72, -/* 00005F50 */ 0x15, 0x01, 0x00, 0x84, 0x15, 0x01, 0x00, 0x84, 0x15, 0x01, 0x00, 0x85, 0x15, 0x01, 0x00, 0x85, -/* 00005F60 */ 0x15, 0x01, 0x00, 0x1A, 0x16, 0x01, 0x00, 0x1A, 0x16, 0x01, 0x00, 0xA6, 0x16, 0x01, 0x00, 0xA6, -/* 00005F70 */ 0x16, 0x01, 0x00, 0x19, 0x17, 0x01, 0x00, 0x19, 0x17, 0x01, 0x00, 0x5C, 0x17, 0x01, 0x00, 0x5C, -/* 00005F80 */ 0x17, 0x01, 0x00, 0xD8, 0x17, 0x01, 0x00, 0xD8, 0x17, 0x01, 0x00, 0xEA, 0x17, 0x01, 0x00, 0xEA, -/* 00005F90 */ 0x17, 0x01, 0x00, 0xEB, 0x17, 0x01, 0x00, 0xEB, 0x17, 0x01, 0x00, 0x25, 0x18, 0x01, 0x00, 0x25, -/* 00005FA0 */ 0x18, 0x01, 0x00, 0x9D, 0x18, 0x01, 0x00, 0x9D, 0x18, 0x01, 0x00, 0xAF, 0x18, 0x01, 0x00, 0xAF, -/* 00005FB0 */ 0x18, 0x01, 0x00, 0xB0, 0x18, 0x01, 0x00, 0xB0, 0x18, 0x01, 0x00, 0xEB, 0x18, 0x01, 0x00, 0xEB, -/* 00005FC0 */ 0x18, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0x77, 0x19, 0x01, 0x00, 0x77, -/* 00005FD0 */ 0x19, 0x01, 0x00, 0x78, 0x19, 0x01, 0x00, 0x78, 0x19, 0x01, 0x00, 0xB5, 0x19, 0x01, 0x00, 0xB5, -/* 00005FE0 */ 0x19, 0x01, 0x00, 0x33, 0x1A, 0x01, 0x00, 0x33, 0x1A, 0x01, 0x00, 0x45, 0x1A, 0x01, 0x00, 0x45, -/* 00005FF0 */ 0x1A, 0x01, 0x00, 0x46, 0x1A, 0x01, 0x00, 0x46, 0x1A, 0x01, 0x00, 0x83, 0x1A, 0x01, 0x00, 0x83, -/* 00006000 */ 0x1A, 0x01, 0x00, 0x01, 0x1B, 0x01, 0x00, 0x01, 0x1B, 0x01, 0x00, 0x13, 0x1B, 0x01, 0x00, 0x13, -/* 00006010 */ 0x1B, 0x01, 0x00, 0x14, 0x1B, 0x01, 0x00, 0x14, 0x1B, 0x01, 0x00, 0x57, 0x1B, 0x01, 0x00, 0x57, -/* 00006020 */ 0x1B, 0x01, 0x00, 0xD4, 0x1B, 0x01, 0x00, 0xD4, 0x1B, 0x01, 0x00, 0xE6, 0x1B, 0x01, 0x00, 0xE6, -/* 00006030 */ 0x1B, 0x01, 0x00, 0xE7, 0x1B, 0x01, 0x00, 0xE7, 0x1B, 0x01, 0x00, 0x0D, 0x1C, 0x01, 0x00, 0x0D, -/* 00006040 */ 0x1C, 0x01, 0x00, 0x1B, 0x1C, 0x01, 0x00, 0x1B, 0x1C, 0x01, 0x00, 0x1C, 0x1C, 0x01, 0x00, 0x1C, -/* 00006050 */ 0x1C, 0x01, 0x00, 0x71, 0x1C, 0x01, 0x00, 0x71, 0x1C, 0x01, 0x00, 0xAA, 0x1C, 0x01, 0x00, 0xAA, -/* 00006060 */ 0x1C, 0x01, 0x00, 0xDA, 0x1C, 0x01, 0x00, 0xDA, 0x1C, 0x01, 0x00, 0xEC, 0x1C, 0x01, 0x00, 0xEC, -/* 00006070 */ 0x1C, 0x01, 0x00, 0xED, 0x1C, 0x01, 0x00, 0xED, 0x1C, 0x01, 0x00, 0x88, 0x1D, 0x01, 0x00, 0x88, -/* 00006080 */ 0x1D, 0x01, 0x00, 0xEA, 0x1D, 0x01, 0x00, 0xEA, 0x1D, 0x01, 0x00, 0xFC, 0x1D, 0x01, 0x00, 0xFC, -/* 00006090 */ 0x1D, 0x01, 0x00, 0xFD, 0x1D, 0x01, 0x00, 0xFD, 0x1D, 0x01, 0x00, 0x3C, 0x1E, 0x01, 0x00, 0x3C, -/* 000060A0 */ 0x1E, 0x01, 0x00, 0x3D, 0x1E, 0x01, 0x00, 0x3D, 0x1E, 0x01, 0x00, 0x64, 0x1E, 0x01, 0x00, 0x64, -/* 000060B0 */ 0x1E, 0x01, 0x00, 0xA9, 0x1E, 0x01, 0x00, 0xA9, 0x1E, 0x01, 0x00, 0xAA, 0x1E, 0x01, 0x00, 0xAA, -/* 000060C0 */ 0x1E, 0x01, 0x00, 0x1B, 0x1F, 0x01, 0x00, 0x1B, 0x1F, 0x01, 0x00, 0x7A, 0x1F, 0x01, 0x00, 0x7A, -/* 000060D0 */ 0x1F, 0x01, 0x00, 0x7B, 0x1F, 0x01, 0x00, 0x7B, 0x1F, 0x01, 0x00, 0xA9, 0x1F, 0x01, 0x00, 0xA9, -/* 000060E0 */ 0x1F, 0x01, 0x00, 0xFC, 0x1F, 0x01, 0x00, 0xFC, 0x1F, 0x01, 0x00, 0x15, 0x20, 0x01, 0x00, 0x15, -/* 000060F0 */ 0x20, 0x01, 0x00, 0x53, 0x20, 0x01, 0x00, 0x53, 0x20, 0x01, 0x00, 0x65, 0x20, 0x01, 0x00, 0x65, -/* 00006100 */ 0x20, 0x01, 0x00, 0x66, 0x20, 0x01, 0x00, 0x66, 0x20, 0x01, 0x00, 0x94, 0x20, 0x01, 0x00, 0x94, -/* 00006110 */ 0x20, 0x01, 0x00, 0xCF, 0x20, 0x01, 0x00, 0xCF, 0x20, 0x01, 0x00, 0xE1, 0x20, 0x01, 0x00, 0xE1, -/* 00006120 */ 0x20, 0x01, 0x00, 0xE2, 0x20, 0x01, 0x00, 0xE2, 0x20, 0x01, 0x00, 0x04, 0x21, 0x01, 0x00, 0x04, -/* 00006130 */ 0x21, 0x01, 0x00, 0x73, 0x21, 0x01, 0x00, 0x73, 0x21, 0x01, 0x00, 0xDA, 0x21, 0x01, 0x00, 0xDA, -/* 00006140 */ 0x21, 0x01, 0x00, 0x3E, 0x22, 0x01, 0x00, 0x3E, 0x22, 0x01, 0x00, 0xBF, 0x22, 0x01, 0x00, 0xBF, -/* 00006150 */ 0x22, 0x01, 0x00, 0x21, 0x23, 0x01, 0x00, 0x21, 0x23, 0x01, 0x00, 0x85, 0x23, 0x01, 0x00, 0x85, -/* 00006160 */ 0x23, 0x01, 0x00, 0xED, 0x23, 0x01, 0x00, 0xED, 0x23, 0x01, 0x00, 0x55, 0x24, 0x01, 0x00, 0x55, -/* 00006170 */ 0x24, 0x01, 0x00, 0xC4, 0x24, 0x01, 0x00, 0xC4, 0x24, 0x01, 0x00, 0xC5, 0x24, 0x01, 0x00, 0xC5, -/* 00006180 */ 0x24, 0x01, 0x00, 0x34, 0x25, 0x01, 0x00, 0x34, 0x25, 0x01, 0x00, 0xAA, 0x25, 0x01, 0x00, 0xAA, -/* 00006190 */ 0x25, 0x01, 0x00, 0xAB, 0x25, 0x01, 0x00, 0xAB, 0x25, 0x01, 0x00, 0x1B, 0x26, 0x01, 0x00, 0x1B, -/* 000061A0 */ 0x26, 0x01, 0x00, 0x1C, 0x26, 0x01, 0x00, 0x1C, 0x26, 0x01, 0x00, 0x6D, 0x26, 0x01, 0x00, 0x6D, -/* 000061B0 */ 0x26, 0x01, 0x00, 0x93, 0x26, 0x01, 0x00, 0x93, 0x26, 0x01, 0x00, 0xB1, 0x26, 0x01, 0x00, 0xB1, -/* 000061C0 */ 0x26, 0x01, 0x00, 0xD1, 0x26, 0x01, 0x00, 0xD1, 0x26, 0x01, 0x00, 0xF3, 0x26, 0x01, 0x00, 0xF3, -/* 000061D0 */ 0x26, 0x01, 0x00, 0x11, 0x27, 0x01, 0x00, 0x11, 0x27, 0x01, 0x00, 0x31, 0x27, 0x01, 0x00, 0x31, -/* 000061E0 */ 0x27, 0x01, 0x00, 0x55, 0x27, 0x01, 0x00, 0x55, 0x27, 0x01, 0x00, 0x79, 0x27, 0x01, 0x00, 0x79, -/* 000061F0 */ 0x27, 0x01, 0x00, 0xA8, 0x27, 0x01, 0x00, 0xA8, 0x27, 0x01, 0x00, 0xC3, 0x27, 0x01, 0x00, 0xC3, -/* 00006200 */ 0x27, 0x01, 0x00, 0xC4, 0x27, 0x01, 0x00, 0xC4, 0x27, 0x01, 0x00, 0xEC, 0x27, 0x01, 0x00, 0xEC, -/* 00006210 */ 0x27, 0x01, 0x00, 0x2D, 0x28, 0x01, 0x00, 0x2D, 0x28, 0x01, 0x00, 0xA0, 0x28, 0x01, 0x00, 0xA0, -/* 00006220 */ 0x28, 0x01, 0x00, 0xA1, 0x28, 0x01, 0x00, 0xA1, 0x28, 0x01, 0x00, 0xC7, 0x28, 0x01, 0x00, 0xC7, -/* 00006230 */ 0x28, 0x01, 0x00, 0xFB, 0x28, 0x01, 0x00, 0xFB, 0x28, 0x01, 0x00, 0x31, 0x29, 0x01, 0x00, 0x31, -/* 00006240 */ 0x29, 0x01, 0x00, 0x76, 0x29, 0x01, 0x00, 0x76, 0x29, 0x01, 0x00, 0x77, 0x29, 0x01, 0x00, 0x77, -/* 00006250 */ 0x29, 0x01, 0x00, 0x99, 0x29, 0x01, 0x00, 0x99, 0x29, 0x01, 0x00, 0xCD, 0x29, 0x01, 0x00, 0xCD, -/* 00006260 */ 0x29, 0x01, 0x00, 0xF9, 0x29, 0x01, 0x00, 0xF9, 0x29, 0x01, 0x00, 0x27, 0x2A, 0x01, 0x00, 0x27, -/* 00006270 */ 0x2A, 0x01, 0x00, 0x57, 0x2A, 0x01, 0x00, 0x57, 0x2A, 0x01, 0x00, 0x83, 0x2A, 0x01, 0x00, 0x83, -/* 00006280 */ 0x2A, 0x01, 0x00, 0xB1, 0x2A, 0x01, 0x00, 0xB1, 0x2A, 0x01, 0x00, 0xE3, 0x2A, 0x01, 0x00, 0xE3, -/* 00006290 */ 0x2A, 0x01, 0x00, 0x15, 0x2B, 0x01, 0x00, 0x15, 0x2B, 0x01, 0x00, 0x53, 0x2B, 0x01, 0x00, 0x53, -/* 000062A0 */ 0x2B, 0x01, 0x00, 0x54, 0x2B, 0x01, 0x00, 0x54, 0x2B, 0x01, 0x00, 0x86, 0x2B, 0x01, 0x00, 0x86, -/* 000062B0 */ 0x2B, 0x01, 0x00, 0xC6, 0x2B, 0x01, 0x00, 0xC6, 0x2B, 0x01, 0x00, 0x04, 0x2C, 0x01, 0x00, 0x04, -/* 000062C0 */ 0x2C, 0x01, 0x00, 0x05, 0x2C, 0x01, 0x00, 0x05, 0x2C, 0x01, 0x00, 0x47, 0x2C, 0x01, 0x00, 0x47, -/* 000062D0 */ 0x2C, 0x01, 0x00, 0x48, 0x2C, 0x01, 0x00, 0x48, 0x2C, 0x01, 0x00, 0x5B, 0x2C, 0x01, 0x00, 0x5B, -/* 000062E0 */ 0x2C, 0x01, 0x00, 0x74, 0x2C, 0x01, 0x00, 0x74, 0x2C, 0x01, 0x00, 0xC9, 0x2C, 0x01, 0x00, 0xC9, -/* 000062F0 */ 0x2C, 0x01, 0x00, 0x40, 0x2D, 0x01, 0x00, 0x40, 0x2D, 0x01, 0x00, 0xE2, 0x2D, 0x01, 0x00, 0xE2, -/* 00006300 */ 0x2D, 0x01, 0x00, 0x86, 0x2E, 0x01, 0x00, 0x86, 0x2E, 0x01, 0x00, 0xEB, 0x2E, 0x01, 0x00, 0xEB, -/* 00006310 */ 0x2E, 0x01, 0x00, 0xFF, 0x2E, 0x01, 0x00, 0xFF, 0x2E, 0x01, 0x00, 0x28, 0x2F, 0x01, 0x00, 0x28, -/* 00006320 */ 0x2F, 0x01, 0x00, 0x29, 0x2F, 0x01, 0x00, 0x29, 0x2F, 0x01, 0x00, 0x3F, 0x2F, 0x01, 0x00, 0x3F, -/* 00006330 */ 0x2F, 0x01, 0x00, 0x8E, 0x2F, 0x01, 0x00, 0x8E, 0x2F, 0x01, 0x00, 0xCF, 0x2F, 0x01, 0x00, 0xCF, -/* 00006340 */ 0x2F, 0x01, 0x00, 0xED, 0x2F, 0x01, 0x00, 0xED, 0x2F, 0x01, 0x00, 0x17, 0x30, 0x01, 0x00, 0x17, -/* 00006350 */ 0x30, 0x01, 0x00, 0x41, 0x30, 0x01, 0x00, 0x41, 0x30, 0x01, 0x00, 0x42, 0x30, 0x01, 0x00, 0x42, -/* 00006360 */ 0x30, 0x01, 0x00, 0xB0, 0x30, 0x01, 0x00, 0xB0, 0x30, 0x01, 0x00, 0x06, 0x31, 0x01, 0x00, 0x06, -/* 00006370 */ 0x31, 0x01, 0x00, 0x5A, 0x31, 0x01, 0x00, 0x5A, 0x31, 0x01, 0x00, 0xC4, 0x31, 0x01, 0x00, 0xC4, -/* 00006380 */ 0x31, 0x01, 0x00, 0xEC, 0x31, 0x01, 0x00, 0xEC, 0x31, 0x01, 0x00, 0xFE, 0x31, 0x01, 0x00, 0xFE, -/* 00006390 */ 0x31, 0x01, 0x00, 0xFF, 0x31, 0x01, 0x00, 0xFF, 0x31, 0x01, 0x00, 0x23, 0x32, 0x01, 0x00, 0x23, -/* 000063A0 */ 0x32, 0x01, 0x00, 0x55, 0x32, 0x01, 0x00, 0x55, 0x32, 0x01, 0x00, 0xD5, 0x32, 0x01, 0x00, 0xD5, -/* 000063B0 */ 0x32, 0x01, 0x00, 0xE7, 0x32, 0x01, 0x00, 0xE7, 0x32, 0x01, 0x00, 0xE8, 0x32, 0x01, 0x00, 0xE8, -/* 000063C0 */ 0x32, 0x01, 0x00, 0xFE, 0x32, 0x01, 0x00, 0xFE, 0x32, 0x01, 0x00, 0x33, 0x33, 0x01, 0x00, 0x33, -/* 000063D0 */ 0x33, 0x01, 0x00, 0x73, 0x33, 0x01, 0x00, 0x73, 0x33, 0x01, 0x00, 0x91, 0x33, 0x01, 0x00, 0x91, -/* 000063E0 */ 0x33, 0x01, 0x00, 0xBB, 0x33, 0x01, 0x00, 0xBB, 0x33, 0x01, 0x00, 0xE5, 0x33, 0x01, 0x00, 0xE5, -/* 000063F0 */ 0x33, 0x01, 0x00, 0xE6, 0x33, 0x01, 0x00, 0xE6, 0x33, 0x01, 0x00, 0x48, 0x34, 0x01, 0x00, 0x48, -/* 00006400 */ 0x34, 0x01, 0x00, 0xCD, 0x34, 0x01, 0x00, 0xCD, 0x34, 0x01, 0x00, 0x32, 0x35, 0x01, 0x00, 0x32, -/* 00006410 */ 0x35, 0x01, 0x00, 0x6D, 0x35, 0x01, 0x00, 0x6D, 0x35, 0x01, 0x00, 0x7F, 0x35, 0x01, 0x00, 0x7F, -/* 00006420 */ 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0xAD, 0x35, 0x01, 0x00, 0xAD, -/* 00006430 */ 0x35, 0x01, 0x00, 0x12, 0x36, 0x01, 0x00, 0x12, 0x36, 0x01, 0x00, 0x13, 0x36, 0x01, 0x00, 0x13, -/* 00006440 */ 0x36, 0x01, 0x00, 0x95, 0x36, 0x01, 0x00, 0x95, 0x36, 0x01, 0x00, 0xD0, 0x36, 0x01, 0x00, 0xD0, -/* 00006450 */ 0x36, 0x01, 0x00, 0x2F, 0x37, 0x01, 0x00, 0x2F, 0x37, 0x01, 0x00, 0x41, 0x37, 0x01, 0x00, 0x41, -/* 00006460 */ 0x37, 0x01, 0x00, 0x84, 0x37, 0x01, 0x00, 0x84, 0x37, 0x01, 0x00, 0x92, 0x37, 0x01, 0x00, 0x92, -/* 00006470 */ 0x37, 0x01, 0x00, 0x93, 0x37, 0x01, 0x00, 0x93, 0x37, 0x01, 0x00, 0x01, 0x38, 0x01, 0x00, 0x01, -/* 00006480 */ 0x38, 0x01, 0x00, 0x4C, 0x38, 0x01, 0x00, 0x4C, 0x38, 0x01, 0x00, 0xA9, 0x38, 0x01, 0x00, 0xA9, -/* 00006490 */ 0x38, 0x01, 0x00, 0xBB, 0x38, 0x01, 0x00, 0xBB, 0x38, 0x01, 0x00, 0x0E, 0x39, 0x01, 0x00, 0x0E, -/* 000064A0 */ 0x39, 0x01, 0x00, 0x46, 0x39, 0x01, 0x00, 0x46, 0x39, 0x01, 0x00, 0x71, 0x39, 0x01, 0x00, 0x71, -/* 000064B0 */ 0x39, 0x01, 0x00, 0x83, 0x39, 0x01, 0x00, 0x83, 0x39, 0x01, 0x00, 0xBD, 0x39, 0x01, 0x00, 0xBD, -/* 000064C0 */ 0x39, 0x01, 0x00, 0x31, 0x3A, 0x01, 0x00, 0x31, 0x3A, 0x01, 0x00, 0x8F, 0x3A, 0x01, 0x00, 0x8F, -/* 000064D0 */ 0x3A, 0x01, 0x00, 0xA3, 0x3A, 0x01, 0x00, 0xA3, 0x3A, 0x01, 0x00, 0xA4, 0x3A, 0x01, 0x00, 0xA4, -/* 000064E0 */ 0x3A, 0x01, 0x00, 0x16, 0x3B, 0x01, 0x00, 0x16, 0x3B, 0x01, 0x00, 0x61, 0x3B, 0x01, 0x00, 0x61, -/* 000064F0 */ 0x3B, 0x01, 0x00, 0xC2, 0x3B, 0x01, 0x00, 0xC2, 0x3B, 0x01, 0x00, 0xD4, 0x3B, 0x01, 0x00, 0xD4, -/* 00006500 */ 0x3B, 0x01, 0x00, 0x27, 0x3C, 0x01, 0x00, 0x27, 0x3C, 0x01, 0x00, 0x5F, 0x3C, 0x01, 0x00, 0x5F, -/* 00006510 */ 0x3C, 0x01, 0x00, 0x8A, 0x3C, 0x01, 0x00, 0x8A, 0x3C, 0x01, 0x00, 0x9C, 0x3C, 0x01, 0x00, 0x9C, -/* 00006520 */ 0x3C, 0x01, 0x00, 0xD6, 0x3C, 0x01, 0x00, 0xD6, 0x3C, 0x01, 0x00, 0x4C, 0x3D, 0x01, 0x00, 0x4C, -/* 00006530 */ 0x3D, 0x01, 0x00, 0xAA, 0x3D, 0x01, 0x00, 0xAA, 0x3D, 0x01, 0x00, 0xBE, 0x3D, 0x01, 0x00, 0xBE, -/* 00006540 */ 0x3D, 0x01, 0x00, 0xBF, 0x3D, 0x01, 0x00, 0xBF, 0x3D, 0x01, 0x00, 0x31, 0x3E, 0x01, 0x00, 0x31, -/* 00006550 */ 0x3E, 0x01, 0x00, 0x7C, 0x3E, 0x01, 0x00, 0x7C, 0x3E, 0x01, 0x00, 0xDD, 0x3E, 0x01, 0x00, 0xDD, -/* 00006560 */ 0x3E, 0x01, 0x00, 0xEF, 0x3E, 0x01, 0x00, 0xEF, 0x3E, 0x01, 0x00, 0x42, 0x3F, 0x01, 0x00, 0x42, -/* 00006570 */ 0x3F, 0x01, 0x00, 0x7A, 0x3F, 0x01, 0x00, 0x7A, 0x3F, 0x01, 0x00, 0xA5, 0x3F, 0x01, 0x00, 0xA5, -/* 00006580 */ 0x3F, 0x01, 0x00, 0xB7, 0x3F, 0x01, 0x00, 0xB7, 0x3F, 0x01, 0x00, 0xF1, 0x3F, 0x01, 0x00, 0xF1, -/* 00006590 */ 0x3F, 0x01, 0x00, 0x67, 0x40, 0x01, 0x00, 0x67, 0x40, 0x01, 0x00, 0xC5, 0x40, 0x01, 0x00, 0xC5, -/* 000065A0 */ 0x40, 0x01, 0x00, 0xD9, 0x40, 0x01, 0x00, 0xD9, 0x40, 0x01, 0x00, 0xDA, 0x40, 0x01, 0x00, 0xDA, -/* 000065B0 */ 0x40, 0x01, 0x00, 0x01, 0x41, 0x01, 0x00, 0x01, 0x41, 0x01, 0x00, 0x2D, 0x41, 0x01, 0x00, 0x2D, -/* 000065C0 */ 0x41, 0x01, 0x00, 0x93, 0x41, 0x01, 0x00, 0x93, 0x41, 0x01, 0x00, 0x0A, 0x42, 0x01, 0x00, 0x0A, -/* 000065D0 */ 0x42, 0x01, 0x00, 0x7C, 0x42, 0x01, 0x00, 0x7C, 0x42, 0x01, 0x00, 0xA9, 0x42, 0x01, 0x00, 0xA9, -/* 000065E0 */ 0x42, 0x01, 0x00, 0xD6, 0x42, 0x01, 0x00, 0xD6, 0x42, 0x01, 0x00, 0x1D, 0x43, 0x01, 0x00, 0x1D, -/* 000065F0 */ 0x43, 0x01, 0x00, 0x64, 0x43, 0x01, 0x00, 0x64, 0x43, 0x01, 0x00, 0x65, 0x43, 0x01, 0x00, 0x65, -/* 00006600 */ 0x43, 0x01, 0x00, 0xA4, 0x43, 0x01, 0x00, 0xA4, 0x43, 0x01, 0x00, 0xE9, 0x43, 0x01, 0x00, 0xE9, -/* 00006610 */ 0x43, 0x01, 0x00, 0xFF, 0x43, 0x01, 0x00, 0xFF, 0x43, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, -/* 00006620 */ 0x44, 0x01, 0x00, 0x37, 0x44, 0x01, 0x00, 0x37, 0x44, 0x01, 0x00, 0x6B, 0x44, 0x01, 0x00, 0x6B, -/* 00006630 */ 0x44, 0x01, 0x00, 0xBA, 0x44, 0x01, 0x00, 0xBA, 0x44, 0x01, 0x00, 0xD0, 0x44, 0x01, 0x00, 0xD0, -/* 00006640 */ 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0x0C, 0x45, 0x01, 0x00, 0x0C, -/* 00006650 */ 0x45, 0x01, 0x00, 0x52, 0x45, 0x01, 0x00, 0x52, 0x45, 0x01, 0x00, 0x53, 0x45, 0x01, 0x00, 0x53, -/* 00006660 */ 0x45, 0x01, 0x00, 0x89, 0x45, 0x01, 0x00, 0x89, 0x45, 0x01, 0x00, 0xC8, 0x45, 0x01, 0x00, 0xC8, -/* 00006670 */ 0x45, 0x01, 0x00, 0x0D, 0x46, 0x01, 0x00, 0x0D, 0x46, 0x01, 0x00, 0x23, 0x46, 0x01, 0x00, 0x23, -/* 00006680 */ 0x46, 0x01, 0x00, 0x24, 0x46, 0x01, 0x00, 0x24, 0x46, 0x01, 0x00, 0x72, 0x46, 0x01, 0x00, 0x72, -/* 00006690 */ 0x46, 0x01, 0x00, 0x73, 0x46, 0x01, 0x00, 0x73, 0x46, 0x01, 0x00, 0xD9, 0x46, 0x01, 0x00, 0xD9, -/* 000066A0 */ 0x46, 0x01, 0x00, 0x15, 0x47, 0x01, 0x00, 0x15, 0x47, 0x01, 0x00, 0x16, 0x47, 0x01, 0x00, 0x16, -/* 000066B0 */ 0x47, 0x01, 0x00, 0x36, 0x47, 0x01, 0x00, 0x36, 0x47, 0x01, 0x00, 0x48, 0x47, 0x01, 0x00, 0x48, -/* 000066C0 */ 0x47, 0x01, 0x00, 0x92, 0x47, 0x01, 0x00, 0x92, 0x47, 0x01, 0x00, 0x93, 0x47, 0x01, 0x00, 0x93, -/* 000066D0 */ 0x47, 0x01, 0x00, 0xB7, 0x47, 0x01, 0x00, 0xB7, 0x47, 0x01, 0x00, 0xEB, 0x47, 0x01, 0x00, 0xEB, -/* 000066E0 */ 0x47, 0x01, 0x00, 0x58, 0x48, 0x01, 0x00, 0x58, 0x48, 0x01, 0x00, 0x6E, 0x48, 0x01, 0x00, 0x6E, -/* 000066F0 */ 0x48, 0x01, 0x00, 0xB5, 0x48, 0x01, 0x00, 0xB5, 0x48, 0x01, 0x00, 0x18, 0x49, 0x01, 0x00, 0x18, -/* 00006700 */ 0x49, 0x01, 0x00, 0x85, 0x49, 0x01, 0x00, 0x85, 0x49, 0x01, 0x00, 0x9B, 0x49, 0x01, 0x00, 0x9B, -/* 00006710 */ 0x49, 0x01, 0x00, 0x9C, 0x49, 0x01, 0x00, 0x9C, 0x49, 0x01, 0x00, 0xCD, 0x49, 0x01, 0x00, 0xCD, -/* 00006720 */ 0x49, 0x01, 0x00, 0x1B, 0x4A, 0x01, 0x00, 0x1B, 0x4A, 0x01, 0x00, 0x54, 0x4A, 0x01, 0x00, 0x54, -/* 00006730 */ 0x4A, 0x01, 0x00, 0x6E, 0x4A, 0x01, 0x00, 0x6E, 0x4A, 0x01, 0x00, 0xDD, 0x4A, 0x01, 0x00, 0xDD, -/* 00006740 */ 0x4A, 0x01, 0x00, 0xF3, 0x4A, 0x01, 0x00, 0xF3, 0x4A, 0x01, 0x00, 0xF4, 0x4A, 0x01, 0x00, 0xF4, -/* 00006750 */ 0x4A, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x5B, 0x4B, 0x01, 0x00, 0x5B, -/* 00006760 */ 0x4B, 0x01, 0x00, 0xAE, 0x4B, 0x01, 0x00, 0xAE, 0x4B, 0x01, 0x00, 0xAF, 0x4B, 0x01, 0x00, 0xAF, -/* 00006770 */ 0x4B, 0x01, 0x00, 0xF6, 0x4B, 0x01, 0x00, 0xF6, 0x4B, 0x01, 0x00, 0xF7, 0x4B, 0x01, 0x00, 0xF7, -/* 00006780 */ 0x4B, 0x01, 0x00, 0x94, 0x4C, 0x01, 0x00, 0x94, 0x4C, 0x01, 0x00, 0xDE, 0x4C, 0x01, 0x00, 0xDE, -/* 00006790 */ 0x4C, 0x01, 0x00, 0x7F, 0x4D, 0x01, 0x00, 0x7F, 0x4D, 0x01, 0x00, 0x80, 0x4D, 0x01, 0x00, 0x80, -/* 000067A0 */ 0x4D, 0x01, 0x00, 0xCB, 0x4D, 0x01, 0x00, 0xCB, 0x4D, 0x01, 0x00, 0x12, 0x4E, 0x01, 0x00, 0x12, -/* 000067B0 */ 0x4E, 0x01, 0x00, 0x4A, 0x4E, 0x01, 0x00, 0x4A, 0x4E, 0x01, 0x00, 0xBB, 0x4E, 0x01, 0x00, 0xBB, -/* 000067C0 */ 0x4E, 0x01, 0x00, 0xD5, 0x4E, 0x01, 0x00, 0xD5, 0x4E, 0x01, 0x00, 0xD6, 0x4E, 0x01, 0x00, 0xD6, -/* 000067D0 */ 0x4E, 0x01, 0x00, 0x21, 0x4F, 0x01, 0x00, 0x21, 0x4F, 0x01, 0x00, 0x88, 0x4F, 0x01, 0x00, 0x88, -/* 000067E0 */ 0x4F, 0x01, 0x00, 0xF9, 0x4F, 0x01, 0x00, 0xF9, 0x4F, 0x01, 0x00, 0x13, 0x50, 0x01, 0x00, 0x13, -/* 000067F0 */ 0x50, 0x01, 0x00, 0x14, 0x50, 0x01, 0x00, 0x14, 0x50, 0x01, 0x00, 0x4F, 0x50, 0x01, 0x00, 0x4F, -/* 00006800 */ 0x50, 0x01, 0x00, 0x8D, 0x50, 0x01, 0x00, 0x8D, 0x50, 0x01, 0x00, 0xA1, 0x50, 0x01, 0x00, 0xA1, -/* 00006810 */ 0x50, 0x01, 0x00, 0xA2, 0x50, 0x01, 0x00, 0xA2, 0x50, 0x01, 0x00, 0xF6, 0x50, 0x01, 0x00, 0xF6, -/* 00006820 */ 0x50, 0x01, 0x00, 0x2E, 0x51, 0x01, 0x00, 0x2E, 0x51, 0x01, 0x00, 0x66, 0x51, 0x01, 0x00, 0x66, -/* 00006830 */ 0x51, 0x01, 0x00, 0xE0, 0x51, 0x01, 0x00, 0xE0, 0x51, 0x01, 0x00, 0xFA, 0x51, 0x01, 0x00, 0xFA, -/* 00006840 */ 0x51, 0x01, 0x00, 0x45, 0x52, 0x01, 0x00, 0x45, 0x52, 0x01, 0x00, 0xAC, 0x52, 0x01, 0x00, 0xAC, -/* 00006850 */ 0x52, 0x01, 0x00, 0x26, 0x53, 0x01, 0x00, 0x26, 0x53, 0x01, 0x00, 0x40, 0x53, 0x01, 0x00, 0x40, -/* 00006860 */ 0x53, 0x01, 0x00, 0x72, 0x53, 0x01, 0x00, 0x72, 0x53, 0x01, 0x00, 0xAD, 0x53, 0x01, 0x00, 0xAD, -/* 00006870 */ 0x53, 0x01, 0x00, 0x04, 0x54, 0x01, 0x00, 0x04, 0x54, 0x01, 0x00, 0x69, 0x54, 0x01, 0x00, 0x69, -/* 00006880 */ 0x54, 0x01, 0x00, 0xA8, 0x54, 0x01, 0x00, 0xA8, 0x54, 0x01, 0x00, 0xE3, 0x54, 0x01, 0x00, 0xE3, -/* 00006890 */ 0x54, 0x01, 0x00, 0x20, 0x55, 0x01, 0x00, 0x20, 0x55, 0x01, 0x00, 0x55, 0x55, 0x01, 0x00, 0x55, -/* 000068A0 */ 0x55, 0x01, 0x00, 0x8C, 0x55, 0x01, 0x00, 0x8C, 0x55, 0x01, 0x00, 0xC5, 0x55, 0x01, 0x00, 0xC5, -/* 000068B0 */ 0x55, 0x01, 0x00, 0xFA, 0x55, 0x01, 0x00, 0xFA, 0x55, 0x01, 0x00, 0x31, 0x56, 0x01, 0x00, 0x31, -/* 000068C0 */ 0x56, 0x01, 0x00, 0x6C, 0x56, 0x01, 0x00, 0x6C, 0x56, 0x01, 0x00, 0xA7, 0x56, 0x01, 0x00, 0xA7, -/* 000068D0 */ 0x56, 0x01, 0x00, 0xED, 0x56, 0x01, 0x00, 0xED, 0x56, 0x01, 0x00, 0x0E, 0x57, 0x01, 0x00, 0x0E, -/* 000068E0 */ 0x57, 0x01, 0x00, 0x4C, 0x57, 0x01, 0x00, 0x4C, 0x57, 0x01, 0x00, 0xBE, 0x57, 0x01, 0x00, 0xBE, -/* 000068F0 */ 0x57, 0x01, 0x00, 0x60, 0x58, 0x01, 0x00, 0x60, 0x58, 0x01, 0x00, 0x9C, 0x58, 0x01, 0x00, 0x9C, -/* 00006900 */ 0x58, 0x01, 0x00, 0xBA, 0x58, 0x01, 0x00, 0xBA, 0x58, 0x01, 0x00, 0xE4, 0x58, 0x01, 0x00, 0xE4, -/* 00006910 */ 0x58, 0x01, 0x00, 0x2C, 0x59, 0x01, 0x00, 0x2C, 0x59, 0x01, 0x00, 0x79, 0x59, 0x01, 0x00, 0x79, -/* 00006920 */ 0x59, 0x01, 0x00, 0x8D, 0x59, 0x01, 0x00, 0x8D, 0x59, 0x01, 0x00, 0x8E, 0x59, 0x01, 0x00, 0x8E, -/* 00006930 */ 0x59, 0x01, 0x00, 0x2C, 0x5A, 0x01, 0x00, 0x2C, 0x5A, 0x01, 0x00, 0x2D, 0x5A, 0x01, 0x00, 0x2D, -/* 00006940 */ 0x5A, 0x01, 0x00, 0x54, 0x5A, 0x01, 0x00, 0x54, 0x5A, 0x01, 0x00, 0x62, 0x5A, 0x01, 0x00, 0x62, -/* 00006950 */ 0x5A, 0x01, 0x00, 0x6C, 0x5A, 0x01, 0x00, 0x6C, 0x5A, 0x01, 0x00, 0xBD, 0x5A, 0x01, 0x00, 0xBD, -/* 00006960 */ 0x5A, 0x01, 0x00, 0xD7, 0x5A, 0x01, 0x00, 0xD7, 0x5A, 0x01, 0x00, 0xE1, 0x5A, 0x01, 0x00, 0xE1, -/* 00006970 */ 0x5A, 0x01, 0x00, 0xE2, 0x5A, 0x01, 0x00, 0xE2, 0x5A, 0x01, 0x00, 0x13, 0x5B, 0x01, 0x00, 0x13, -/* 00006980 */ 0x5B, 0x01, 0x00, 0x32, 0x5B, 0x01, 0x00, 0x32, 0x5B, 0x01, 0x00, 0xC8, 0x5B, 0x01, 0x00, 0xC8, -/* 00006990 */ 0x5B, 0x01, 0x00, 0x5E, 0x5C, 0x01, 0x00, 0x5E, 0x5C, 0x01, 0x00, 0xF4, 0x5C, 0x01, 0x00, 0xF4, -/* 000069A0 */ 0x5C, 0x01, 0x00, 0x8A, 0x5D, 0x01, 0x00, 0x8A, 0x5D, 0x01, 0x00, 0x90, 0x5D, 0x01, 0x00, 0x90, -/* 000069B0 */ 0x5D, 0x01, 0x00, 0x94, 0x5D, 0x01, 0x00, 0x94, 0x5D, 0x01, 0x00, 0x50, 0xB9, 0xDC, 0x00, 0x00, -/* 000069C0 */ 0x00, 0xFC, 0x09, 0xFE, 0xD7, 0x02, 0xFF, 0xA8, 0x41, 0xC0, 0x00, 0x00, 0x00, 0xFE, 0x70, 0x01, -/* 000069D0 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFF, 0x24, 0x5C, 0x01, 0x00, 0xFF, 0x24, -/* 000069E0 */ 0x5C, 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000069F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xD8, 0x02, 0x07, -/* 00006A10 */ 0x0C, 0xA8, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 00006A20 */ 0x00, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6A, 0x00, 0x00, 0xBF, 0xFD, 0x00, 0x04, 0x4F, -/* 00006A30 */ 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x01, 0x00, -/* 00006A40 */ 0xFE, 0x90, 0x01, 0x22, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x90, 0x01, 0xFF, 0x01, -/* 00006A50 */ 0x5C, 0x01, 0x00, 0xFF, 0x01, 0x5C, 0x01, 0x00, 0x40, 0x4B, 0x18, 0x30, 0x44, 0x09, 0xFE, 0x3A, -/* 00006A60 */ 0x02, 0xFE, 0x34, 0x02, 0x0F, 0x44, 0x43, 0x44, 0x44, 0x14, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A70 */ 0x42, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00006A80 */ 0xFF, 0x00, 0x00, 0x08, 0x02, 0x01, 0xFE, 0xD9, 0x02, 0x02, 0x01, 0xFE, 0xDA, 0x02, 0x02, 0x01, -/* 00006A90 */ 0xFE, 0xDB, 0x02, 0x02, 0x01, 0xFE, 0xDC, 0x02, 0x02, 0x01, 0xFE, 0xDD, 0x02, 0x03, 0x04, 0x02, -/* 00006AA0 */ 0x01, 0xFE, 0xDE, 0x02, 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x02, 0x00, 0xFE, 0xE0, 0x02, 0x02, 0x00, -/* 00006AB0 */ 0xFE, 0xE1, 0x02, 0x02, 0x00, 0xFE, 0xE2, 0x02, 0x02, 0x00, 0xFE, 0xE3, 0x02, 0x02, 0x01, 0xFE, -/* 00006AC0 */ 0xE4, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x00, 0xFE, 0xE7, -/* 00006AD0 */ 0x02, 0x02, 0x01, 0xFE, 0xE8, 0x02, 0x02, 0x01, 0xFE, 0xE9, 0x02, 0x02, 0x00, 0xFE, 0xEA, 0x02, -/* 00006AE0 */ 0x02, 0x01, 0xFE, 0xEB, 0x02, 0x02, 0x01, 0xFE, 0xEC, 0x02, 0x02, 0x01, 0xFE, 0xED, 0x02, 0x02, -/* 00006AF0 */ 0x00, 0xFE, 0xEE, 0x02, 0x02, 0x01, 0xFE, 0xEF, 0x02, 0x02, 0x01, 0xFE, 0xF0, 0x02, 0x02, 0x00, -/* 00006B00 */ 0xFE, 0xF1, 0x02, 0x02, 0x01, 0xFE, 0xF2, 0x02, 0x02, 0x01, 0xFE, 0xF3, 0x02, 0x02, 0x00, 0xFE, -/* 00006B10 */ 0xF4, 0x02, 0x02, 0x01, 0xFE, 0xF5, 0x02, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x01, 0xFE, 0xF7, -/* 00006B20 */ 0x02, 0x02, 0x01, 0xFE, 0xF8, 0x02, 0x02, 0x01, 0xFE, 0xF9, 0x02, 0x02, 0x01, 0xFE, 0xFA, 0x02, -/* 00006B30 */ 0x02, 0x01, 0xFE, 0xFB, 0x02, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x02, -/* 00006B40 */ 0x01, 0xFE, 0xFE, 0x02, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, -/* 00006B50 */ 0x01, 0xFE, 0x01, 0x03, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xFE, 0x65, 0x0A, 0x96, 0x38, 0x00, 0x00, -/* 00006B60 */ 0x00, 0x31, 0xD4, 0x0F, 0x00, 0x00, 0x00, 0x32, 0x96, 0x02, 0x00, 0x00, 0x00, 0x32, 0xD4, 0x10, -/* 00006B70 */ 0x00, 0x00, 0x00, 0x33, 0x96, 0x03, 0x00, 0x00, 0x00, 0x33, 0xD4, 0x11, 0x00, 0x00, 0x00, 0x34, -/* 00006B80 */ 0x96, 0x04, 0x00, 0x00, 0x00, 0x34, 0xD4, 0x12, 0x00, 0x00, 0x00, 0x35, 0x96, 0x05, 0x00, 0x00, -/* 00006B90 */ 0x00, 0x35, 0xD4, 0x13, 0x00, 0x00, 0x00, 0x36, 0x96, 0x06, 0x00, 0x00, 0x00, 0x36, 0xD4, 0x14, -/* 00006BA0 */ 0x00, 0x00, 0x00, 0x37, 0x96, 0x07, 0x00, 0x00, 0x00, 0x37, 0xD4, 0x15, 0x00, 0x00, 0x00, 0x38, -/* 00006BB0 */ 0x96, 0x08, 0x00, 0x00, 0x00, 0x38, 0x4F, 0x39, 0x4F, 0x3C, 0x4F, 0x3D, 0x4F, 0x44, 0x96, 0x39, -/* 00006BC0 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3A, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3B, -/* 00006BD0 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3C, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3D, -/* 00006BE0 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3E, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x3F, -/* 00006BF0 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x40, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x41, -/* 00006C00 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x42, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x43, -/* 00006C10 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x44, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x45, -/* 00006C20 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x46, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x47, -/* 00006C30 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x48, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x49, -/* 00006C40 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4A, 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4B, -/* 00006C50 */ 0x00, 0x00, 0x00, 0x44, 0x4F, 0x44, 0x96, 0x4C, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x30, 0x00, -/* 00006C60 */ 0x96, 0x09, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x76, 0x02, 0x44, 0x01, -/* 00006C70 */ 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x02, 0xA8, 0x45, 0x14, 0x03, 0x00, 0x44, -/* 00006C80 */ 0x45, 0x09, 0x1B, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x45, -/* 00006C90 */ 0x61, 0x45, 0x45, 0x03, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x45, 0x45, 0x76, 0x45, 0x44, 0x04, 0x92, -/* 00006CA0 */ 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x05, 0xA8, 0x45, 0x14, 0x03, 0x00, 0x44, 0x45, -/* 00006CB0 */ 0x09, 0x1B, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x45, 0x61, -/* 00006CC0 */ 0x45, 0x45, 0x03, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x45, 0x45, 0x76, 0x45, 0x44, 0x06, 0x92, 0x09, -/* 00006CD0 */ 0x00, 0x00, 0x00, 0x45, 0x61, 0x45, 0x45, 0x07, 0xAC, 0x44, 0x0F, 0x02, 0x00, 0x45, 0xAB, 0x44, -/* 00006CE0 */ 0x96, 0x39, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x08, -/* 00006CF0 */ 0x47, 0x39, 0x44, 0x96, 0x3A, 0x00, 0x00, 0x00, 0x03, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D00 */ 0x44, 0x44, 0x09, 0x96, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D10 */ 0x44, 0x44, 0x0A, 0x96, 0x0B, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D20 */ 0x44, 0x44, 0x0B, 0x96, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D30 */ 0x44, 0x44, 0x0C, 0x96, 0x0D, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D40 */ 0x44, 0x44, 0x0D, 0x96, 0x0E, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D50 */ 0x44, 0x44, 0x0E, 0x96, 0x0F, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D60 */ 0x44, 0x44, 0x0F, 0x96, 0x10, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D70 */ 0x44, 0x44, 0x10, 0x96, 0x11, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D80 */ 0x44, 0x44, 0x11, 0x96, 0x12, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006D90 */ 0x44, 0x44, 0x12, 0x96, 0x13, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, -/* 00006DA0 */ 0x44, 0x44, 0x13, 0x47, 0x3A, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x14, -/* 00006DB0 */ 0x96, 0x14, 0x00, 0x00, 0x00, 0x44, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x07, 0x03, 0x00, 0x5C, -/* 00006DC0 */ 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x92, -/* 00006DD0 */ 0x09, 0x00, 0x00, 0x00, 0x46, 0x61, 0x46, 0x46, 0x15, 0x7A, 0x46, 0x45, 0x16, 0x92, 0x09, 0x00, -/* 00006DE0 */ 0x00, 0x00, 0x46, 0x61, 0x46, 0x46, 0x17, 0x7A, 0x46, 0x45, 0x18, 0x92, 0x09, 0x00, 0x00, 0x00, -/* 00006DF0 */ 0x46, 0x61, 0x46, 0x46, 0x19, 0x7A, 0x46, 0x45, 0x1A, 0x92, 0x09, 0x00, 0x00, 0x00, 0x46, 0x61, -/* 00006E00 */ 0x46, 0x46, 0x1B, 0x7A, 0x46, 0x45, 0x1C, 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x44, -/* 00006E10 */ 0x44, 0x96, 0x15, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E20 */ 0x1D, 0x96, 0x16, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E30 */ 0x1E, 0x96, 0x17, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E40 */ 0x1F, 0x96, 0x18, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E50 */ 0x20, 0x96, 0x19, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, -/* 00006E60 */ 0x21, 0x96, 0x1A, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x44, 0x96, 0x1B, 0x00, -/* 00006E70 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x22, 0x96, 0x1C, 0x00, -/* 00006E80 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x23, 0x96, 0x1D, 0x00, -/* 00006E90 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x24, 0x96, 0x1E, 0x00, -/* 00006EA0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x25, 0x96, 0x1F, 0x00, -/* 00006EB0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x26, 0x96, 0x20, 0x00, -/* 00006EC0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x27, 0x96, 0x21, 0x00, -/* 00006ED0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x28, 0x96, 0x22, 0x00, -/* 00006EE0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x29, 0x96, 0x23, 0x00, -/* 00006EF0 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x2A, 0x96, 0x24, 0x00, -/* 00006F00 */ 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, 0x44, 0x61, 0x44, 0x44, 0x2B, 0x96, 0x25, 0x00, -/* 00006F10 */ 0x00, 0x00, 0x44, 0x92, 0x16, 0x00, 0x00, 0x00, 0x44, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0xCB, -/* 00006F20 */ 0x45, 0x5C, 0x01, 0x45, 0x1F, 0x02, 0x44, 0x44, 0x47, 0x3B, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, -/* 00006F30 */ 0x44, 0x61, 0x44, 0x44, 0x2C, 0x96, 0x26, 0x00, 0x00, 0x00, 0x44, 0x92, 0x09, 0x00, 0x00, 0x00, -/* 00006F40 */ 0x44, 0x61, 0x44, 0x44, 0x2D, 0x96, 0x27, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x3B, 0x00, -/* 00006F50 */ 0x00, 0x00, 0x44, 0xD4, 0x01, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3C, 0x00, 0x00, 0x00, 0x44, 0xD4, -/* 00006F60 */ 0x02, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3D, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x03, 0x00, 0x00, 0x00, -/* 00006F70 */ 0x44, 0x96, 0x3E, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x44, 0x96, 0x3F, 0x00, -/* 00006F80 */ 0x00, 0x00, 0x44, 0xD4, 0x05, 0x00, 0x00, 0x00, 0x44, 0x96, 0x28, 0x00, 0x00, 0x00, 0x44, 0xD4, -/* 00006F90 */ 0x06, 0x00, 0x00, 0x00, 0x44, 0x96, 0x29, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x07, 0x00, 0x00, 0x00, -/* 00006FA0 */ 0x44, 0x96, 0x2A, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x08, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2B, 0x00, -/* 00006FB0 */ 0x00, 0x00, 0x44, 0xD4, 0x09, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2C, 0x00, 0x00, 0x00, 0x44, 0xD4, -/* 00006FC0 */ 0x0A, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2D, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0B, 0x00, 0x00, 0x00, -/* 00006FD0 */ 0x44, 0x96, 0x2E, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x96, 0x2F, 0x00, -/* 00006FE0 */ 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x40, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0D, 0x00, 0x00, 0x00, -/* 00006FF0 */ 0x44, 0x96, 0x30, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x0E, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, -/* 00007000 */ 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x96, 0x31, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, -/* 00007010 */ 0x41, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x42, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, -/* 00007020 */ 0x43, 0x00, 0x00, 0x00, 0x44, 0xA8, 0x44, 0x96, 0x44, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x16, 0x00, -/* 00007030 */ 0x00, 0x00, 0x44, 0x96, 0x32, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x17, 0x00, 0x00, 0x00, 0x44, 0x96, -/* 00007040 */ 0x33, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x18, 0x00, 0x00, 0x00, 0x44, 0x96, 0x34, 0x00, 0x00, 0x00, -/* 00007050 */ 0x44, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCB, 0x45, 0x5C, -/* 00007060 */ 0x01, 0x45, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x44, 0x44, 0x54, 0x3C, 0x44, 0x92, 0x09, 0x00, 0x00, -/* 00007070 */ 0x00, 0x45, 0x6C, 0x44, 0x45, 0x2E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x45, 0x5C, 0x01, 0x3C, 0x92, -/* 00007080 */ 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x00, 0x00, 0x00, -/* 00007090 */ 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x0B, 0x47, 0x2F, 0x5C, 0x01, 0x47, 0x5C, -/* 000070A0 */ 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x5C, 0x02, 0x46, 0x1F, 0x03, 0xFF, 0x44, 0x96, 0x45, 0x00, -/* 000070B0 */ 0x00, 0x00, 0x0C, 0x92, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, -/* 000070C0 */ 0x20, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x92, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x07, 0x03, -/* 000070D0 */ 0x00, 0x5C, 0x00, 0x09, 0x92, 0x45, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x01, 0x46, 0xD4, 0x19, 0x00, -/* 000070E0 */ 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0x1F, 0x03, 0x45, 0x45, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, -/* 000070F0 */ 0x1F, 0x04, 0x44, 0x44, 0x96, 0x46, 0x00, 0x00, 0x00, 0x44, 0x96, 0x47, 0x00, 0x00, 0x00, 0x0D, -/* 00007100 */ 0x92, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x00, 0x00, -/* 00007110 */ 0x00, 0x45, 0x5C, 0x01, 0x45, 0x92, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00007120 */ 0x09, 0x92, 0x47, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x01, 0x46, 0xD4, 0x1A, 0x00, 0x00, 0x00, 0x46, -/* 00007130 */ 0x5C, 0x02, 0x46, 0x1F, 0x03, 0x45, 0x45, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0x1F, 0x04, 0x44, -/* 00007140 */ 0x44, 0x96, 0x48, 0x00, 0x00, 0x00, 0x44, 0x96, 0x49, 0x00, 0x00, 0x00, 0x0E, 0x92, 0x0C, 0x00, -/* 00007150 */ 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x00, 0x00, 0x00, 0x45, 0x5C, -/* 00007160 */ 0x01, 0x45, 0x92, 0x2A, 0x00, 0x00, 0x00, 0x45, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x49, -/* 00007170 */ 0x00, 0x00, 0x00, 0x46, 0x5C, 0x01, 0x46, 0xD4, 0x1B, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, -/* 00007180 */ 0x1F, 0x03, 0x45, 0x45, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0x1F, 0x04, 0x44, 0x44, 0x96, 0x4A, -/* 00007190 */ 0x00, 0x00, 0x00, 0x44, 0x96, 0x4B, 0x00, 0x00, 0x00, 0x0F, 0x92, 0x0C, 0x00, 0x00, 0x00, 0x44, -/* 000071A0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x92, -/* 000071B0 */ 0x2A, 0x00, 0x00, 0x00, 0x45, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x4B, 0x00, 0x00, 0x00, -/* 000071C0 */ 0x46, 0x5C, 0x01, 0x46, 0xD4, 0x1C, 0x00, 0x00, 0x00, 0x46, 0x5C, 0x02, 0x46, 0x1F, 0x03, 0x45, -/* 000071D0 */ 0x45, 0x5C, 0x02, 0x45, 0x5C, 0x03, 0x3C, 0x1F, 0x04, 0x44, 0x44, 0x54, 0x3D, 0x44, 0x92, 0x1B, -/* 000071E0 */ 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x46, 0x00, 0x00, 0x00, 0x45, -/* 000071F0 */ 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x10, 0xCC, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x45, -/* 00007200 */ 0x00, 0x00, 0x00, 0x7A, 0x12, 0x45, 0x30, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, -/* 00007210 */ 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x48, 0x00, 0x00, 0x00, 0x45, -/* 00007220 */ 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x10, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x45, -/* 00007230 */ 0x00, 0x00, 0x00, 0x7A, 0x12, 0x45, 0x30, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, -/* 00007240 */ 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x4A, 0x00, 0x00, 0x00, 0x45, -/* 00007250 */ 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x10, 0xCC, 0x3C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x45, -/* 00007260 */ 0x00, 0x00, 0x00, 0x7A, 0x12, 0x45, 0x30, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, -/* 00007270 */ 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x3D, 0x5C, 0x02, 0x10, -/* 00007280 */ 0xCC, 0x48, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7A, 0x13, 0x45, -/* 00007290 */ 0x30, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x44, 0x07, 0x03, -/* 000072A0 */ 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x54, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, -/* 000072B0 */ 0x00, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x80, 0x00, -/* 000072C0 */ 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x16, 0x47, 0x31, 0x5C, 0x01, -/* 000072D0 */ 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x32, 0x92, 0x0A, 0x00, 0x00, -/* 000072E0 */ 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x8C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, -/* 000072F0 */ 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x16, 0x47, 0x31, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, -/* 00007300 */ 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x33, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, -/* 00007310 */ 0x5C, 0x00, 0x09, 0xCC, 0x98, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, -/* 00007320 */ 0x7A, 0x1A, 0x47, 0x34, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, -/* 00007330 */ 0x45, 0x35, 0x92, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xA4, -/* 00007340 */ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x47, 0x36, 0x5C, -/* 00007350 */ 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x37, 0x92, 0x0A, 0x00, -/* 00007360 */ 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 00007370 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x20, 0x47, 0x38, 0x7A, 0x1D, 0x47, 0x36, 0x7A, 0x22, -/* 00007380 */ 0x47, 0x39, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3A, -/* 00007390 */ 0x92, 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xC4, 0x00, 0x00, -/* 000073A0 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x47, 0x36, 0x7A, 0x22, 0x47, -/* 000073B0 */ 0x39, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3B, 0x92, -/* 000073C0 */ 0x0A, 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xD4, 0x00, 0x00, 0x00, -/* 000073D0 */ 0x0D, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x1D, 0x47, 0x36, 0x7A, 0x22, 0x47, 0x39, -/* 000073E0 */ 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3C, 0x92, 0x0A, -/* 000073F0 */ 0x00, 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xE4, 0x00, 0x00, 0x00, 0x0E, -/* 00007400 */ 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x21, 0x47, 0x39, 0x7A, 0x22, 0x47, 0x3D, 0x5C, -/* 00007410 */ 0x01, 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3E, 0x92, 0x0A, 0x00, -/* 00007420 */ 0x00, 0x00, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xF4, 0x00, 0x00, 0x00, 0x0F, 0x00, -/* 00007430 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x7A, 0x21, 0x47, 0x39, 0x7A, 0x22, 0x47, 0x3D, 0x5C, 0x01, -/* 00007440 */ 0x47, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x46, 0x46, 0x7A, 0x46, 0x45, 0x3F, 0x5C, 0x01, 0x45, 0x5C, -/* 00007450 */ 0x02, 0x08, 0x1F, 0x03, 0x44, 0x44, 0x96, 0x35, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1D, 0x00, 0x00, -/* 00007460 */ 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x96, 0x36, 0x00, 0x00, -/* 00007470 */ 0x00, 0x44, 0xA8, 0x44, 0x96, 0x4C, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1E, 0x00, 0x00, 0x00, 0x44, -/* 00007480 */ 0x96, 0x37, 0x00, 0x00, 0x00, 0x44, 0xD4, 0x1F, 0x00, 0x00, 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, -/* 00007490 */ 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x47, 0x3E, 0x44, 0xD4, 0x20, 0x00, 0x00, 0x00, 0x44, 0x07, -/* 000074A0 */ 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x47, 0x3F, 0x44, 0xD4, 0x21, 0x00, 0x00, -/* 000074B0 */ 0x00, 0x44, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x44, 0x44, 0x47, 0x40, 0x44, 0x92, -/* 000074C0 */ 0x38, 0x00, 0x00, 0x00, 0x44, 0x14, 0x03, 0x00, 0x44, 0x28, 0x09, 0xF0, 0x00, 0x92, 0x1B, 0x00, -/* 000074D0 */ 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, -/* 000074E0 */ 0x01, 0x45, 0x5C, 0x02, 0x29, 0xCC, 0x04, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, -/* 000074F0 */ 0x00, 0x00, 0x7A, 0x3E, 0x45, 0x30, 0x7A, 0x02, 0x45, 0x40, 0x7A, 0x2C, 0x45, 0x41, 0x7A, 0x02, -/* 00007500 */ 0x45, 0x42, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x07, -/* 00007510 */ 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5C, 0x02, -/* 00007520 */ 0x2E, 0xCC, 0x1C, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7A, 0x3F, -/* 00007530 */ 0x45, 0x30, 0x7A, 0x02, 0x45, 0x40, 0x7A, 0x2C, 0x45, 0x41, 0x7A, 0x02, 0x45, 0x42, 0x5C, 0x03, -/* 00007540 */ 0x45, 0x1F, 0x04, 0xFF, 0x44, 0x92, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 00007550 */ 0x09, 0x6A, 0x43, 0x00, 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x2F, 0xCC, 0x34, 0x01, -/* 00007560 */ 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7A, 0x40, 0x45, 0x30, 0x7A, 0x02, -/* 00007570 */ 0x45, 0x40, 0x7A, 0x2C, 0x45, 0x41, 0x7A, 0x02, 0x45, 0x42, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, -/* 00007580 */ 0x44, 0x92, 0x1B, 0x00, 0x00, 0x00, 0x44, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x43, 0x00, -/* 00007590 */ 0x00, 0x00, 0x45, 0x5C, 0x01, 0x45, 0x5C, 0x02, 0x13, 0xCC, 0x4C, 0x01, 0x00, 0x00, 0x13, 0x00, -/* 000075A0 */ 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x7A, 0x3D, 0x45, 0x30, 0x7A, 0x02, 0x45, 0x40, 0x7A, 0x2C, -/* 000075B0 */ 0x45, 0x41, 0x7A, 0x02, 0x45, 0x42, 0x5C, 0x03, 0x45, 0x1F, 0x04, 0xFF, 0x44, 0xA8, 0x00, 0x24, -/* 000075C0 */ 0x00, 0x14, 0xFE, 0x64, 0x01, 0x00, 0x4C, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, -/* 000075D0 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, -/* 000075E0 */ 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, -/* 000075F0 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x1C, 0x01, -/* 00007600 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, -/* 00007610 */ 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x03, 0x04, -/* 00007620 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, -/* 00007630 */ 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0xF4, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, -/* 00007640 */ 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xFA, 0x02, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x03, 0x02, -/* 00007650 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xFA, 0x02, 0x00, 0x00, 0xD4, 0x00, -/* 00007660 */ 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, 0x02, -/* 00007670 */ 0x00, 0x00, 0xC4, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, -/* 00007680 */ 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, -/* 00007690 */ 0x00, 0x00, 0xF3, 0x02, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0xF5, 0x02, 0x00, 0x00, 0xA4, 0x00, -/* 000076A0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x98, 0x00, -/* 000076B0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0x02, 0x00, 0x00, 0x8C, 0x00, -/* 000076C0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x00, 0x80, 0x00, -/* 000076D0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x00, 0x54, 0x00, -/* 000076E0 */ 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x02, 0x00, 0x00, 0xEB, 0x02, -/* 000076F0 */ 0x00, 0x00, 0xEC, 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0xF7, 0x02, -/* 00007700 */ 0x00, 0x00, 0xF8, 0x02, 0x00, 0x00, 0xF9, 0x02, 0x00, 0x00, 0xFB, 0x02, 0x00, 0x00, 0x48, 0x00, -/* 00007710 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x3C, 0x00, -/* 00007720 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x30, 0x00, -/* 00007730 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x24, 0x00, -/* 00007740 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x00, -/* 00007750 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x00, 0x00, -/* 00007760 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1F, 0x00, -/* 00007770 */ 0x00, 0x00, 0x1E, 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xFE, 0x03, 0x03, 0xFE, -/* 00007780 */ 0x04, 0x03, 0xF6, 0xFE, 0x04, 0x03, 0xFE, 0x05, 0x03, 0xFE, 0x05, 0x03, 0xFE, 0xAA, 0x02, 0xFE, -/* 00007790 */ 0xAA, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x38, 0x02, 0x84, 0xFE, 0x32, 0x01, 0xFE, -/* 000077A0 */ 0x58, 0x01, 0xFE, 0x2D, 0x01, 0xFE, 0x7A, 0x01, 0x95, 0xA7, 0xF6, 0xFE, 0x08, 0x02, 0xFE, 0x3A, -/* 000077B0 */ 0x02, 0x17, 0xFE, 0x3B, 0x02, 0x1F, 0xFE, 0x3C, 0x02, 0xFE, 0x1E, 0x01, 0xFE, 0x3D, 0x02, 0x25, -/* 000077C0 */ 0xFE, 0x3F, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x41, 0x02, 0xFE, 0x42, 0x02, 0xFE, 0x3E, 0x02, 0xFE, -/* 000077D0 */ 0x46, 0x02, 0xFE, 0x47, 0x02, 0xFE, 0x48, 0x02, 0xFE, 0x49, 0x02, 0xFE, 0x4A, 0x02, 0xFE, 0x4B, -/* 000077E0 */ 0x02, 0xFE, 0x4C, 0x02, 0xFE, 0x4F, 0x02, 0xFE, 0x50, 0x02, 0xFE, 0x51, 0x02, 0xFE, 0x52, 0x02, -/* 000077F0 */ 0xFE, 0x53, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x61, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xE9, 0x02, 0xFE, -/* 00007800 */ 0xE8, 0x02, 0xFE, 0xEB, 0x02, 0xFE, 0xED, 0x02, 0xFE, 0xEC, 0x02, 0xFE, 0xF0, 0x02, 0xFE, 0xEF, -/* 00007810 */ 0x02, 0xFE, 0xF3, 0x02, 0xFE, 0xF5, 0x02, 0xFE, 0xF2, 0x02, 0xFE, 0xF7, 0x02, 0xFE, 0xF8, 0x02, -/* 00007820 */ 0xFE, 0xFA, 0x02, 0xFE, 0xF9, 0x02, 0xFE, 0xFB, 0x02, 0xFE, 0xB3, 0x01, 0xFE, 0xB1, 0x01, 0xFE, -/* 00007830 */ 0xB2, 0x01, 0xDB, 0xFE, 0x06, 0x03, 0xFE, 0x07, 0x03, 0xFE, 0x08, 0x03, 0xFE, 0x09, 0x03, 0xFE, -/* 00007840 */ 0x0A, 0x03, 0xFE, 0x0B, 0x03, 0xFE, 0x0C, 0x03, 0xFE, 0x0D, 0x03, 0xFE, 0x0E, 0x03, 0xFE, 0x0F, -/* 00007850 */ 0x03, 0xFE, 0x10, 0x03, 0x84, 0xFE, 0x32, 0x01, 0xFE, 0x58, 0x01, 0xFE, 0x2D, 0x01, 0xFE, 0x7A, -/* 00007860 */ 0x01, 0x95, 0xA7, 0xFE, 0x11, 0x03, 0xF7, 0xFE, 0x12, 0x03, 0xFE, 0x13, 0x03, 0xFE, 0x14, 0x03, -/* 00007870 */ 0xFE, 0x15, 0x03, 0xFE, 0x16, 0x03, 0xFE, 0x17, 0x03, 0xFE, 0x18, 0x03, 0xFE, 0x19, 0x03, 0xFE, -/* 00007880 */ 0x1A, 0x03, 0xFE, 0x1B, 0x03, 0xFE, 0x1C, 0x03, 0xFE, 0x1D, 0x03, 0xFE, 0x1E, 0x03, 0xFE, 0x1F, -/* 00007890 */ 0x03, 0xFE, 0x20, 0x03, 0xFE, 0x21, 0x03, 0xE0, 0xE3, 0xFE, 0x22, 0x03, 0xFE, 0x23, 0x03, 0xFE, -/* 000078A0 */ 0x24, 0x03, 0xFE, 0x2A, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x25, 0x03, 0xFE, 0x26, 0x03, 0xFE, 0x27, -/* 000078B0 */ 0x03, 0xFE, 0x28, 0x03, 0xFE, 0x29, 0x03, 0xFE, 0x2A, 0x03, 0xFE, 0x2B, 0x03, 0xFE, 0x79, 0x02, -/* 000078C0 */ 0xFE, 0x2C, 0x03, 0xFE, 0x2D, 0x03, 0xFE, 0x2E, 0x03, 0xFE, 0x2F, 0x03, 0xFE, 0x30, 0x03, 0xFE, -/* 000078D0 */ 0xD9, 0x02, 0xFE, 0x31, 0x03, 0xFE, 0x32, 0x03, 0xFE, 0x33, 0x03, 0xFE, 0x34, 0x03, 0xFE, 0x35, -/* 000078E0 */ 0x03, 0xFE, 0x36, 0x03, 0xFE, 0x37, 0x03, 0xFE, 0x38, 0x03, 0xFE, 0x39, 0x03, 0xFE, 0x3A, 0x03, -/* 000078F0 */ 0xFE, 0x3B, 0x03, 0xFE, 0x3C, 0x03, 0xFE, 0x3D, 0x03, 0xFE, 0x3E, 0x03, 0xFE, 0x3F, 0x03, 0xFE, -/* 00007900 */ 0x40, 0x03, 0xFE, 0x41, 0x03, 0xFE, 0x42, 0x03, 0x00, 0xFE, 0xBB, 0x01, 0x5B, 0x00, 0x01, 0x00, -/* 00007910 */ 0x00, 0x0A, 0x00, 0xA4, 0x00, 0x0A, 0x00, 0x20, 0x00, 0x14, 0x00, 0x38, 0x00, 0x1B, 0x00, 0x3B, -/* 00007920 */ 0x00, 0x14, 0x00, 0x39, 0x00, 0x1B, 0x00, 0xD4, 0x00, 0x18, 0x00, 0x30, 0x00, 0x0D, 0x00, 0x45, -/* 00007930 */ 0x00, 0x06, 0x00, 0x35, 0x00, 0x10, 0x00, 0x35, 0x00, 0x10, 0x00, 0x39, 0x00, 0x10, 0x00, 0x42, -/* 00007940 */ 0x00, 0x10, 0x00, 0x24, 0x00, 0x10, 0x00, 0x22, 0x00, 0x10, 0x00, 0x22, 0x00, 0x10, 0x00, 0x22, -/* 00007950 */ 0x00, 0x10, 0x00, 0x22, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x20, 0x00, 0x0D, 0x00, 0x1D, -/* 00007960 */ 0x00, 0x10, 0x00, 0x2D, 0x00, 0x61, 0x00, 0xC8, 0x00, 0x10, 0x00, 0x54, 0x00, 0x10, 0x00, 0x50, -/* 00007970 */ 0x00, 0x10, 0x00, 0x5E, 0x00, 0x10, 0x00, 0x02, 0x01, 0x10, 0x00, 0x55, 0x00, 0x0C, 0x00, 0x94, -/* 00007980 */ 0x00, 0x10, 0x00, 0x4C, 0x00, 0x10, 0x00, 0x4C, 0x00, 0x10, 0x00, 0x46, 0x00, 0x10, 0x00, 0x47, -/* 00007990 */ 0x00, 0x10, 0x00, 0x4C, 0x00, 0x10, 0x00, 0x4A, 0x00, 0x10, 0x00, 0x3B, 0x00, 0x10, 0x00, 0x4E, -/* 000079A0 */ 0x00, 0x10, 0x00, 0x56, 0x00, 0x10, 0x00, 0x57, 0x00, 0x18, 0x00, 0x35, 0x00, 0x10, 0x00, 0x3E, -/* 000079B0 */ 0x00, 0x10, 0x00, 0x39, 0x00, 0x08, 0x00, 0x25, 0x00, 0x0C, 0x00, 0xE9, 0x01, 0x0C, 0x00, 0x40, -/* 000079C0 */ 0x01, 0x0C, 0x00, 0x0C, 0x02, 0x0C, 0x00, 0x90, 0x01, 0x0C, 0x00, 0x58, 0x01, 0x0C, 0x00, 0x9A, -/* 000079D0 */ 0x00, 0x0C, 0x00, 0x70, 0x00, 0x0C, 0x00, 0xA7, 0x04, 0x0C, 0x00, 0x93, 0x04, 0x0C, 0x00, 0x31, -/* 000079E0 */ 0x04, 0x0C, 0x00, 0xB1, 0x09, 0x0C, 0x00, 0xEF, 0x02, 0x08, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x93, -/* 000079F0 */ 0x03, 0x16, 0x00, 0x89, 0x0A, 0x08, 0x00, 0x75, 0x00, 0x08, 0x00, 0x38, 0x00, 0x08, 0x00, 0x4C, -/* 00007A00 */ 0x00, 0x08, 0x00, 0x83, 0x1C, 0x0C, 0x00, 0xC0, 0x01, 0x0C, 0x00, 0xDF, 0x01, 0x0C, 0x00, 0x80, -/* 00007A10 */ 0x03, 0x1B, 0x00, 0x3C, 0x00, 0x41, 0x00, 0x25, 0x01, 0x06, 0x00, 0x51, 0x00, 0x47, 0x00, 0xA1, -/* 00007A20 */ 0x01, 0x06, 0x00, 0x59, 0x00, 0x47, 0x00, 0xB1, 0x01, 0x06, 0x00, 0x5D, 0x00, 0x47, 0x00, 0xB9, -/* 00007A30 */ 0x01, 0x06, 0x00, 0x41, 0x00, 0x44, 0x00, 0xAD, 0x02, 0x30, 0x00, 0x60, 0x00, 0x30, 0x00, 0x64, -/* 00007A40 */ 0x00, 0x30, 0x00, 0x66, 0x00, 0x2A, 0x00, 0x49, 0x01, 0xC4, 0x01, 0x51, 0x05, 0x16, 0x00, 0xCA, -/* 00007A50 */ 0x03, 0x08, 0x00, 0x2B, 0x00, 0x0C, 0x00, 0x3B, 0x09, 0x13, 0x00, 0xD1, 0x30, 0x13, 0x00, 0x14, -/* 00007A60 */ 0x39, 0x13, 0x00, 0xC3, 0x6D, 0x0E, 0x00, 0x23, 0x00, 0x3C, 0x00, 0x96, 0x00, 0x3C, 0x00, 0x96, -/* 00007A70 */ 0x00, 0x3C, 0x00, 0x96, 0x00, 0x3E, 0x00, 0x94, 0x00, 0x00, 0x64, 0x15, 0x01, 0x00, 0x53, 0x14, -/* 00007A80 */ 0x01, 0x00, 0xAA, 0x13, 0x01, 0x00, 0xE0, 0x12, 0x01, 0x00, 0xC0, 0x11, 0x01, 0x00, 0x09, 0x11, -/* 00007A90 */ 0x01, 0x00, 0x77, 0x10, 0x01, 0x00, 0xEE, 0x0F, 0x01, 0x00, 0xAD, 0x0D, 0x01, 0x00, 0x9B, 0x0B, -/* 00007AA0 */ 0x01, 0x00, 0xF1, 0x09, 0x01, 0x00, 0x2A, 0x05, 0x01, 0x00, 0xA4, 0x03, 0x01, 0x00, 0xD5, 0x01, -/* 00007AB0 */ 0x01, 0x00, 0xF9, 0xFB, 0x00, 0x00, 0xE8, 0xF9, 0x00, 0x00, 0x64, 0xF8, 0x00, 0x00, 0xEE, 0xF7, -/* 00007AC0 */ 0x00, 0x00, 0xDD, 0xF3, 0x00, 0x00, 0xEC, 0xF2, 0x00, 0x00, 0xBC, 0xEF, 0x00, 0x00, 0xCA, 0xEC, -/* 00007AD0 */ 0x00, 0x00, 0xA5, 0xEB, 0x00, 0x00, 0x83, 0xEA, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0xB2, 0xE7, -/* 00007AE0 */ 0x00, 0x00, 0xE0, 0xE6, 0x00, 0x00, 0x0E, 0xE6, 0x00, 0x00, 0x79, 0xE5, 0x00, 0x00, 0xC6, 0xE2, -/* 00007AF0 */ 0x00, 0x00, 0xFA, 0xDE, 0x00, 0x00, 0x4E, 0xC8, 0x00, 0x00, 0xAB, 0xAF, 0x00, 0x00, 0x02, 0x7B, -/* 00007B00 */ 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x4F, 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE4, -/* 00007B10 */ 0x04, 0x1A, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x3F, 0x00, 0xFE, 0x6A, 0xED, 0x0E, 0xFF, 0x00, 0x10, -/* 00007B20 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0x6A, 0xED, 0xFE, 0x72, 0x6D, 0xFE, 0x72, 0x6D, 0x01, 0x13, 0x2F, -/* 00007B30 */ 0x3B, 0x09, 0xDA, 0xDA, 0x01, 0x09, 0x11, 0x11, 0x11, 0x11, 0x06, 0x02, 0x38, 0xFF, 0xFF, 0xFF, -/* 00007B40 */ 0xFF, 0xFF, 0x39, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00007B50 */ 0x00, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x02, 0x01, 0xFE, 0xE9, 0x03, -/* 00007B60 */ 0x02, 0x00, 0xFE, 0xEA, 0x03, 0x02, 0x01, 0xFE, 0xEB, 0x03, 0x02, 0x00, 0xFE, 0xEC, 0x03, 0x02, -/* 00007B70 */ 0x01, 0xFE, 0xED, 0x03, 0x02, 0x00, 0xFE, 0xEE, 0x03, 0x02, 0x01, 0xFE, 0xEF, 0x03, 0x02, 0x00, -/* 00007B80 */ 0xFE, 0xF0, 0x03, 0x02, 0x01, 0xFE, 0xF1, 0x03, 0x02, 0x00, 0xFE, 0xF2, 0x03, 0x02, 0x01, 0xFE, -/* 00007B90 */ 0xF3, 0x03, 0x02, 0x00, 0xFE, 0xF4, 0x03, 0x02, 0x01, 0xFE, 0xF5, 0x03, 0x02, 0x00, 0xFE, 0xF6, -/* 00007BA0 */ 0x03, 0x02, 0x01, 0xFE, 0xF7, 0x03, 0x02, 0x00, 0xFE, 0xF8, 0x03, 0x02, 0x01, 0xFE, 0xF9, 0x03, -/* 00007BB0 */ 0x02, 0x00, 0xFE, 0xFA, 0x03, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, -/* 00007BC0 */ 0x00, 0x02, 0x00, 0xFE, 0xFC, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFD, 0x03, -/* 00007BD0 */ 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFE, 0x03, 0x02, 0x00, 0xFE, 0xFF, 0x03, 0x02, -/* 00007BE0 */ 0x00, 0xFE, 0x00, 0x04, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x02, 0x01, -/* 00007BF0 */ 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x09, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, -/* 00007C00 */ 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x08, 0x02, 0x01, 0xFE, 0xD8, 0x03, 0x02, 0x01, -/* 00007C10 */ 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xD9, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, 0x01, 0xFE, -/* 00007C20 */ 0xE6, 0x02, 0xFE, 0x7C, 0x04, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0xA8, 0x32, 0xA8, 0x33, 0xA8, -/* 00007C30 */ 0x34, 0xA8, 0x35, 0xA8, 0x36, 0xA8, 0x37, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, -/* 00007C40 */ 0x3D, 0x14, 0x15, 0x00, 0x3D, 0x02, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, -/* 00007C50 */ 0x00, 0x00, 0x3D, 0x14, 0x03, 0x00, 0x3D, 0x03, 0x09, 0x3D, 0x04, 0xDE, 0x00, 0x09, 0x01, 0xB8, -/* 00007C60 */ 0x3D, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, -/* 00007C70 */ 0x02, 0x00, 0x00, 0x00, 0x2F, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x30, 0x3D, 0x95, 0x00, -/* 00007C80 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x01, 0x50, 0x01, 0x02, 0x00, 0x00, 0x00, 0x31, -/* 00007C90 */ 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x01, 0x50, 0x01, 0x03, 0x00, -/* 00007CA0 */ 0x00, 0x00, 0x32, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x32, 0x01, 0x50, -/* 00007CB0 */ 0x01, 0x04, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, -/* 00007CC0 */ 0x33, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, 0x00, 0x34, 0x3D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 00007CD0 */ 0x00, 0x00, 0x00, 0x34, 0x01, 0x50, 0x01, 0x06, 0x00, 0x00, 0x00, 0x35, 0x3D, 0x95, 0x00, 0x00, -/* 00007CE0 */ 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x35, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00007CF0 */ 0x3D, 0x00, 0x00, 0x00, 0x7A, 0x05, 0x3D, 0x00, 0x7A, 0x07, 0x3D, 0x01, 0x7A, 0x09, 0x3D, 0x02, -/* 00007D00 */ 0x7A, 0x0B, 0x3D, 0x03, 0x7A, 0x0D, 0x3D, 0x04, 0x7A, 0x0F, 0x3D, 0x05, 0x7A, 0x11, 0x3D, 0x06, -/* 00007D10 */ 0x7A, 0x13, 0x3D, 0x07, 0x7A, 0x15, 0x3D, 0x08, 0x96, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x8E, 0x01, -/* 00007D20 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, 0x6C, 0x3D, 0x3E, 0x09, 0x07, 0x03, 0x00, 0x5C, -/* 00007D30 */ 0x00, 0x3E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x07, 0x03, 0x00, 0x5C, -/* 00007D40 */ 0x00, 0x18, 0x5C, 0x01, 0x17, 0xB8, 0x41, 0x00, 0x01, 0x50, 0x01, 0x07, 0x00, 0x00, 0x00, 0x40, -/* 00007D50 */ 0x41, 0x5C, 0x02, 0x40, 0x1F, 0x03, 0x3F, 0x3F, 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x19, 0x1F, 0x03, -/* 00007D60 */ 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, 0x6C, 0x3D, 0x3E, 0x09, -/* 00007D70 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, -/* 00007D80 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5C, 0x01, 0x1A, 0xB8, 0x41, 0x00, 0x01, 0x50, 0x01, 0x08, -/* 00007D90 */ 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0x1F, 0x03, 0x3F, 0x3F, 0x5C, 0x01, 0x3F, 0x5C, -/* 00007DA0 */ 0x02, 0x1B, 0x1F, 0x03, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3E, -/* 00007DB0 */ 0x6C, 0x3D, 0x3E, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x3E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, -/* 00007DC0 */ 0x00, 0x00, 0x00, 0x3F, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5C, 0x01, 0x1C, 0xB8, 0x41, 0x00, -/* 00007DD0 */ 0x01, 0x50, 0x01, 0x09, 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0x1F, 0x03, 0x3F, 0x3F, -/* 00007DE0 */ 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x1D, 0x1F, 0x03, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, -/* 00007DF0 */ 0x00, 0x00, 0x00, 0x3D, 0x14, 0x03, 0x00, 0x3D, 0x02, 0x09, 0x9C, 0x02, 0xDE, 0x01, 0x04, 0x02, -/* 00007E00 */ 0xB8, 0x3D, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x3D, 0x3D, 0x01, 0x50, 0x01, 0x0A, 0x00, 0x00, -/* 00007E10 */ 0x00, 0x36, 0x3D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x01, 0x50, 0x01, -/* 00007E20 */ 0x0B, 0x00, 0x00, 0x00, 0x37, 0x3D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x37, -/* 00007E30 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, -/* 00007E40 */ 0x5C, 0x01, 0x1E, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x5C, 0x02, 0x3E, -/* 00007E50 */ 0x1F, 0x03, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x03, -/* 00007E60 */ 0x00, 0x5C, 0x00, 0x18, 0x5C, 0x01, 0x1F, 0x90, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 00007E70 */ 0x3E, 0x5C, 0x02, 0x3E, 0x1F, 0x03, 0xFF, 0x3D, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00007E80 */ 0x00, 0x3D, 0xCD, 0x3E, 0x02, 0xA1, 0x00, 0x20, 0x3E, 0xA1, 0x01, 0x21, 0x3E, 0x76, 0x3E, 0x3D, -/* 00007E90 */ 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 00007EA0 */ 0x18, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x5C, 0x01, 0x3E, 0x5C, 0x02, -/* 00007EB0 */ 0x22, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x90, 0x01, -/* 00007EC0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x3F, 0x3F, 0x7A, -/* 00007ED0 */ 0x3F, 0x3E, 0x0B, 0x7A, 0x25, 0x3E, 0x0C, 0x7A, 0x25, 0x3E, 0x0D, 0x7A, 0x25, 0x3E, 0x0E, 0x5C, -/* 00007EE0 */ 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x3D, -/* 00007EF0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, -/* 00007F00 */ 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, -/* 00007F10 */ 0x3E, 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x02, 0x3E, 0x1F, 0x03, 0xFF, 0x3D, 0x8E, 0x01, 0x00, 0x00, -/* 00007F20 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x90, 0x01, 0x00, 0x00, -/* 00007F30 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5C, 0x02, 0x28, -/* 00007F40 */ 0xCC, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, -/* 00007F50 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x7A, 0x3F, 0x3E, 0x0B, 0x7A, 0x29, 0x3E, 0x0C, 0x7A, -/* 00007F60 */ 0x25, 0x3E, 0x0D, 0x7A, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x8E, 0x01, -/* 00007F70 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x90, 0x01, -/* 00007F80 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, 0x5C, -/* 00007F90 */ 0x02, 0x2A, 0xCC, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x8E, -/* 00007FA0 */ 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3F, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x18, 0x5C, -/* 00007FB0 */ 0x01, 0x2C, 0xB8, 0x41, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x41, 0x41, 0x01, 0x50, 0x01, 0x0C, -/* 00007FC0 */ 0x00, 0x00, 0x00, 0x40, 0x41, 0x5C, 0x02, 0x40, 0x1F, 0x03, 0x3F, 0x3F, 0x7A, 0x3F, 0x3E, 0x10, -/* 00007FD0 */ 0x7A, 0x25, 0x3E, 0x0D, 0x7A, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x8E, -/* 00007FE0 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x90, -/* 00007FF0 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x61, 0x3E, 0x3E, 0x0F, 0x5C, 0x01, 0x3E, -/* 00008000 */ 0x5C, 0x02, 0x2D, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, -/* 00008010 */ 0xB8, 0x40, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x01, 0x50, 0x01, 0x0D, 0x00, 0x00, -/* 00008020 */ 0x00, 0x3F, 0x40, 0x7A, 0x3F, 0x3E, 0x0B, 0x01, 0x64, 0x01, 0x3F, 0x3E, 0x7A, 0x29, 0x3E, 0x0C, -/* 00008030 */ 0x7A, 0x25, 0x3E, 0x0D, 0x7A, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x8E, -/* 00008040 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x18, 0x90, -/* 00008050 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x5C, 0x01, 0x3E, 0x5C, 0x02, 0x2E, 0xCC, -/* 00008060 */ 0x88, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 00008070 */ 0x00, 0x4A, 0x00, 0x00, 0x00, 0x3F, 0x4B, 0x3F, 0x7A, 0x3F, 0x3E, 0x0B, 0x7A, 0x29, 0x3E, 0x0C, -/* 00008080 */ 0x7A, 0x29, 0x3E, 0x0E, 0x5C, 0x03, 0x3E, 0x1F, 0x04, 0xFF, 0x3D, 0x90, 0x01, 0x00, 0x00, 0x00, -/* 00008090 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 000080A0 */ 0x00, 0x06, 0x9C, 0x00, 0x88, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000080B0 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, -/* 000080C0 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 000080D0 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, -/* 000080E0 */ 0x00, 0x00, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 000080F0 */ 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, -/* 00008100 */ 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, -/* 00008110 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 00008120 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, -/* 00008130 */ 0x00, 0x00, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, 0xEB, 0x03, 0x00, 0x00, 0xED, 0x03, 0x00, 0x00, -/* 00008140 */ 0xEF, 0x03, 0x00, 0x00, 0xF1, 0x03, 0x00, 0x00, 0xF3, 0x03, 0x00, 0x00, 0xF5, 0x03, 0x00, 0x00, -/* 00008150 */ 0xF7, 0x03, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xE9, 0x03, 0xFE, 0xEB, 0x03, 0xFE, -/* 00008160 */ 0xED, 0x03, 0xFE, 0xEF, 0x03, 0xFE, 0xF1, 0x03, 0xFE, 0xF3, 0x03, 0xFE, 0xF5, 0x03, 0xFE, 0xF7, -/* 00008170 */ 0x03, 0xFE, 0xF9, 0x03, 0xFE, 0x32, 0x02, 0xFE, 0x94, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, -/* 00008180 */ 0xFE, 0xB1, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0x45, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0x01, 0x04, 0x02, -/* 00008190 */ 0x01, 0x07, 0x00, 0xFE, 0x02, 0x04, 0x01, 0xFE, 0x03, 0x04, 0x02, 0xFE, 0x04, 0x04, 0x03, 0xFE, -/* 000081A0 */ 0x05, 0x04, 0x04, 0xFE, 0x06, 0x04, 0x05, 0xFE, 0x07, 0x04, 0x06, 0xFE, 0x08, 0x04, 0x02, 0x02, -/* 000081B0 */ 0x00, 0xFE, 0x1B, 0x02, 0x01, 0xFE, 0x1C, 0x02, 0xFE, 0x81, 0xED, 0x12, 0x12, 0x00, 0x00, 0x00, -/* 000081C0 */ 0xB0, 0x00, 0x9A, 0x13, 0x37, 0x00, 0x84, 0x36, 0x44, 0x00, 0x11, 0x03, 0x44, 0x00, 0x1B, 0x03, -/* 000081D0 */ 0x44, 0x00, 0x1B, 0x03, 0x46, 0x00, 0x72, 0x06, 0x24, 0x00, 0x13, 0x04, 0x24, 0x00, 0x54, 0x00, -/* 000081E0 */ 0x19, 0x00, 0x48, 0x00, 0x55, 0x00, 0x9D, 0x00, 0x36, 0x00, 0x4A, 0x00, 0x52, 0x00, 0xA2, 0x00, -/* 000081F0 */ 0x71, 0x00, 0x22, 0x03, 0x60, 0x00, 0xEC, 0x08, 0x4C, 0x00, 0x9F, 0x00, 0x0D, 0x00, 0x88, 0x00, -/* 00008200 */ 0x07, 0x00, 0x16, 0x00, 0x00, 0x73, 0xAB, 0x00, 0x00, 0xCE, 0xA5, 0x00, 0x00, 0x23, 0xA5, 0x00, -/* 00008210 */ 0x00, 0xF6, 0xA2, 0x00, 0x00, 0x07, 0xA1, 0x00, 0x00, 0xB5, 0x9C, 0x00, 0x00, 0x94, 0x93, 0x00, -/* 00008220 */ 0x00, 0x54, 0x91, 0x00, 0x00, 0x19, 0x8F, 0x00, 0x00, 0xDE, 0x8C, 0x00, 0x00, 0x68, 0x8A, 0x00, -/* 00008230 */ 0x00, 0x17, 0x88, 0x00, 0x00, 0xEF, 0x86, 0x00, 0x00, 0x3D, 0x82, 0x00, 0x00, 0x3F, 0xFD, 0x02, -/* 00008240 */ 0x04, 0x4F, 0xFC, 0x0F, 0xFE, 0xA2, 0x03, 0xFE, 0xBB, 0x06, 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, -/* 00008250 */ 0x4E, 0x00, 0xFF, 0x11, 0x51, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, -/* 00008260 */ 0x11, 0x51, 0x01, 0x00, 0xFE, 0x30, 0x08, 0xFE, 0x30, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, -/* 00008270 */ 0x7A, 0x04, 0x09, 0x20, 0x20, 0x20, 0x20, 0x01, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0x18, -/* 00008280 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00008290 */ 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0x44, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, -/* 000082A0 */ 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0x45, 0x04, 0x02, 0x01, 0xFE, 0xCE, 0x03, 0x02, -/* 000082B0 */ 0x01, 0xFE, 0x38, 0x04, 0x02, 0x01, 0xFE, 0x3C, 0x04, 0x02, 0x01, 0xFE, 0x39, 0x04, 0x02, 0x01, -/* 000082C0 */ 0xFE, 0x3A, 0x04, 0x02, 0x01, 0xFE, 0x0D, 0x04, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, 0xFE, -/* 000082D0 */ 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, -/* 000082E0 */ 0x04, 0x02, 0x01, 0xFE, 0x3B, 0x04, 0x03, 0x04, 0xFE, 0x29, 0x02, 0x5B, 0x15, 0xB3, 0x15, 0x15, -/* 000082F0 */ 0x2C, 0x19, 0x15, 0x15, 0x03, 0x00, 0x19, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, -/* 00008300 */ 0x09, 0x00, 0x00, 0x00, 0x1A, 0x6C, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, -/* 00008310 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x19, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00008320 */ 0x00, 0x00, 0x1A, 0x6C, 0x19, 0x1A, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x15, -/* 00008330 */ 0x1F, 0x02, 0x19, 0x19, 0x96, 0x02, 0x00, 0x00, 0x00, 0x19, 0x92, 0x02, 0x00, 0x00, 0x00, 0x19, -/* 00008340 */ 0xA8, 0x1A, 0x14, 0x14, 0x00, 0x19, 0x1A, 0x09, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x00, 0x19, -/* 00008350 */ 0x61, 0x19, 0x19, 0x02, 0x0F, 0x21, 0x00, 0x19, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, -/* 00008360 */ 0x09, 0x00, 0x00, 0x00, 0x1A, 0x6C, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, -/* 00008370 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x19, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 00008380 */ 0x00, 0x00, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 00008390 */ 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x03, -/* 000083A0 */ 0x7A, 0x1B, 0x1A, 0x04, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x05, 0x7A, 0x1B, -/* 000083B0 */ 0x1A, 0x06, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x07, 0x7A, 0x1B, 0x1A, 0x08, -/* 000083C0 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x09, 0x7A, 0x1B, 0x1A, 0x0A, 0x92, 0x02, -/* 000083D0 */ 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x0B, 0x7A, 0x1B, 0x1A, 0x0C, 0x92, 0x02, 0x00, 0x00, -/* 000083E0 */ 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x0D, 0x7A, 0x1B, 0x1A, 0x0E, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, -/* 000083F0 */ 0x61, 0x1B, 0x1B, 0x0F, 0x7A, 0x1B, 0x1A, 0x10, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, -/* 00008400 */ 0x1B, 0x11, 0x7A, 0x1B, 0x1A, 0x12, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x13, -/* 00008410 */ 0x7A, 0x1B, 0x1A, 0x14, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x15, 0x7A, 0x1B, -/* 00008420 */ 0x1A, 0x16, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x17, 0x7A, 0x1B, 0x1A, 0x18, -/* 00008430 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x19, 0x7A, 0x1B, 0x1A, 0x1A, 0x92, 0x02, -/* 00008440 */ 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x1B, 0x7A, 0x1B, 0x1A, 0x1C, 0x92, 0x02, 0x00, 0x00, -/* 00008450 */ 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x1D, 0x7A, 0x1B, 0x1A, 0x1E, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x13, -/* 00008460 */ 0x1F, 0x03, 0x19, 0x19, 0x96, 0x03, 0x00, 0x00, 0x00, 0x19, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, -/* 00008470 */ 0x00, 0x00, 0x00, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCB, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, -/* 00008480 */ 0x02, 0x13, 0x1F, 0x03, 0x19, 0x19, 0x96, 0x04, 0x00, 0x00, 0x00, 0x19, 0x8E, 0x04, 0x00, 0x00, -/* 00008490 */ 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x14, 0x8E, 0x04, 0x00, 0x00, -/* 000084A0 */ 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x01, 0x1A, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, -/* 000084B0 */ 0x00, 0x00, 0x1A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x14, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x5C, -/* 000084C0 */ 0x01, 0x1B, 0x1F, 0x02, 0x1A, 0x1A, 0x5C, 0x02, 0x1A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x5C, -/* 000084D0 */ 0x03, 0x1A, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0xFF, 0x19, 0x8E, -/* 000084E0 */ 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0x92, -/* 000084F0 */ 0x04, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x01, 0x1A, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, -/* 00008500 */ 0x00, 0x1A, 0x61, 0x1A, 0x1A, 0x1F, 0x5C, 0x02, 0x1A, 0x1F, 0x03, 0x00, 0x19, 0x09, 0x02, 0x00, -/* 00008510 */ 0xA8, 0x00, 0x24, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, -/* 00008520 */ 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x83, -/* 00008530 */ 0x02, 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7C, -/* 00008540 */ 0x02, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7F, -/* 00008550 */ 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, -/* 00008560 */ 0x33, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x93, -/* 00008570 */ 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x95, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x90, 0x02, -/* 00008580 */ 0xFE, 0x85, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x7B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x82, 0x02, 0xFE, -/* 00008590 */ 0x87, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x7E, -/* 000085A0 */ 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x8C, 0x02, -/* 000085B0 */ 0xFE, 0x81, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x45, 0x01, 0xFE, 0xE6, 0x03, 0xFE, -/* 000085C0 */ 0x46, 0x04, 0xFE, 0xFB, 0x01, 0x00, 0xFF, 0x46, 0x51, 0x01, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, -/* 000085D0 */ 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x90, 0x00, 0x21, 0x00, 0x4B, 0x00, 0x21, 0x00, 0x6B, 0x00, -/* 000085E0 */ 0x1E, 0x00, 0x90, 0x00, 0xF1, 0x00, 0xCE, 0x03, 0x22, 0x00, 0x3E, 0x00, 0x53, 0x00, 0x98, 0x01, -/* 000085F0 */ 0x33, 0x00, 0x44, 0x00, 0x00, 0xF9, 0x85, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, -/* 00008600 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xD4, 0x06, 0x60, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x4F, 0x00, -/* 00008610 */ 0xFF, 0xAC, 0x57, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0xAC, 0x57, 0x01, -/* 00008620 */ 0x00, 0xFE, 0x27, 0x01, 0xFE, 0x27, 0x01, 0x41, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x05, -/* 00008630 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, -/* 00008640 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00008650 */ 0x00, 0x02, 0x01, 0xFE, 0x38, 0x04, 0x02, 0x00, 0xFE, 0xE7, 0x03, 0x04, 0x7C, 0x8E, 0x01, 0x00, -/* 00008660 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x97, 0x07, 0x07, 0x05, 0xA8, 0x08, 0x15, 0x0B, 0x00, -/* 00008670 */ 0x07, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x58, 0x00, 0x8E, 0x05, 0x00, -/* 00008680 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x05, 0x00, -/* 00008690 */ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 000086A0 */ 0x00, 0x00, 0x00, 0x08, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x03, 0x05, 0x5C, 0x03, 0x08, 0x1F, 0x04, -/* 000086B0 */ 0x07, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x1C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, -/* 000086C0 */ 0x00, 0x00, 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x97, 0x08, 0x08, -/* 000086D0 */ 0x05, 0x9C, 0x08, 0x07, 0x05, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x57, 0x01, -/* 000086E0 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0xA6, 0x00, 0x1E, 0x00, 0x52, 0x00, 0x00, 0xBF, -/* 000086F0 */ 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAC, 0x06, 0x39, 0xFF, -/* 00008700 */ 0xA0, 0x41, 0xD1, 0x00, 0x4D, 0x00, 0xFF, 0x04, 0x4E, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 00008710 */ 0x01, 0x01, 0xFF, 0x04, 0x4E, 0x01, 0x00, 0xFE, 0x60, 0x02, 0xFE, 0x60, 0x02, 0x01, 0x05, 0x05, -/* 00008720 */ 0x08, 0x04, 0x25, 0x24, 0x04, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008730 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008740 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, -/* 00008750 */ 0x02, 0x00, 0xFE, 0x43, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0x8A, 0x5B, 0x05, 0xB3, 0x05, 0x05, -/* 00008760 */ 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, -/* 00008770 */ 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, -/* 00008780 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 00008790 */ 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, -/* 000087A0 */ 0x1F, 0x02, 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, -/* 000087B0 */ 0x00, 0x61, 0x08, 0x06, 0x02, 0x0F, 0x21, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, -/* 000087C0 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, -/* 000087D0 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x61, 0x00, 0x06, 0x03, 0x09, 0x02, -/* 000087E0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6C, 0x02, -/* 000087F0 */ 0xFE, 0x78, 0x02, 0x00, 0xFF, 0x2A, 0x4E, 0x01, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, -/* 00008800 */ 0x3C, 0x00, 0x1E, 0x00, 0x88, 0x00, 0x1E, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x6B, 0x00, 0x1E, 0x00, -/* 00008810 */ 0x88, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xD8, -/* 00008820 */ 0x03, 0xFE, 0x91, 0x06, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x4C, 0x00, 0xFF, 0xA3, 0x47, 0x01, -/* 00008830 */ 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0xA3, 0x47, 0x01, 0x00, 0xFE, 0xB7, 0x03, -/* 00008840 */ 0xFE, 0xB7, 0x03, 0x03, 0x0A, 0x09, 0x0D, 0x0A, 0x61, 0x60, 0x04, 0x06, 0x07, 0x07, 0x07, 0x07, -/* 00008850 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, -/* 00008860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00008870 */ 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0x43, 0x04, 0x02, 0x01, 0xFE, 0x02, -/* 00008880 */ 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFE, 0x90, 0x01, 0xAE, -/* 00008890 */ 0x0B, 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x2C, 0x0D, 0x09, 0x15, 0x03, 0x00, 0x0D, 0x03, 0x09, 0x1E, -/* 000088A0 */ 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x00, 0x07, -/* 000088B0 */ 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x0D, 0x8E, -/* 000088C0 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x01, 0x07, 0x02, 0x00, -/* 000088D0 */ 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0D, 0x0D, 0x47, 0x0A, 0x0D, 0xA8, 0x0D, 0x14, -/* 000088E0 */ 0x0E, 0x00, 0x0A, 0x0D, 0x09, 0x00, 0x00, 0x61, 0x0D, 0x0A, 0x02, 0x0F, 0x21, 0x00, 0x0D, 0x09, -/* 000088F0 */ 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x00, -/* 00008900 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x0D, -/* 00008910 */ 0x61, 0x0D, 0x0B, 0x03, 0x10, 0x03, 0x00, 0x0D, 0x06, 0x09, 0xB3, 0x00, 0x8E, 0x04, 0x00, 0x00, -/* 00008920 */ 0x00, 0x27, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x97, 0x0E, 0x0B, 0x07, -/* 00008930 */ 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x0D, 0x0D, 0x0F, 0x25, 0x00, 0x0D, 0x09, 0x00, 0x00, 0x8E, 0x04, -/* 00008940 */ 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x97, 0x0E, -/* 00008950 */ 0x0B, 0x07, 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x0D, 0x0D, 0x0F, 0x1B, 0x00, 0x0D, 0x09, 0x00, 0x00, -/* 00008960 */ 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x04, 0x07, 0x01, -/* 00008970 */ 0x00, 0x5C, 0x00, 0x0E, 0x1F, 0x01, 0xFF, 0x0D, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, -/* 00008980 */ 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00008990 */ 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x8E, 0x04, 0x00, 0x00, -/* 000089A0 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, -/* 000089B0 */ 0x97, 0x12, 0x0B, 0x07, 0x5C, 0x01, 0x12, 0x1F, 0x02, 0x10, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, -/* 000089C0 */ 0x0A, 0x1F, 0x03, 0x0E, 0x0E, 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x00, 0x0D, 0x09, 0x4E, 0x00, 0x8E, -/* 000089D0 */ 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x8E, -/* 000089E0 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x05, 0x07, 0x03, 0x00, -/* 000089F0 */ 0x5C, 0x00, 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x10, 0x07, 0x01, 0x00, -/* 00008A00 */ 0x5C, 0x00, 0x08, 0x1F, 0x01, 0x10, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x0A, 0x1F, 0x03, 0x0E, -/* 00008A10 */ 0x0E, 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x00, 0x0D, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 00008A20 */ 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6C, 0x02, 0xF0, 0xFE, 0x59, 0x02, 0xFE, 0x31, -/* 00008A30 */ 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0xCB, 0x47, 0x01, 0x00, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x0B, -/* 00008A40 */ 0x00, 0x38, 0x00, 0x1E, 0x00, 0x7F, 0x00, 0x1E, 0x00, 0x47, 0x00, 0x15, 0x00, 0x67, 0x00, 0x1E, -/* 00008A50 */ 0x00, 0x80, 0x00, 0x0C, 0x00, 0x35, 0x00, 0x44, 0x00, 0x52, 0x00, 0x18, 0x00, 0x4F, 0x00, 0x57, -/* 00008A60 */ 0x00, 0x82, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 00008A70 */ 0x02, 0x03, 0xFE, 0x6E, 0x06, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x4B, 0x00, 0xFF, 0x11, 0x41, -/* 00008A80 */ 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x11, 0x41, 0x01, 0x00, 0xFE, 0x36, -/* 00008A90 */ 0x06, 0xFE, 0x36, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x04, 0x09, 0x08, 0x07, 0x08, -/* 00008AA0 */ 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008AB0 */ 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008AC0 */ 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, -/* 00008AD0 */ 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, 0xFE, 0x95, 0x01, 0xAE, 0x0A, 0x5B, 0x0B, 0xB3, -/* 00008AE0 */ 0x0B, 0x0B, 0xA8, 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x61, 0x0F, 0x0A, 0x00, -/* 00008AF0 */ 0x10, 0x03, 0x00, 0x0F, 0x03, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x04, 0x47, 0x08, 0x0F, 0x61, -/* 00008B00 */ 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x03, 0x47, -/* 00008B10 */ 0x09, 0x0F, 0x6A, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, -/* 00008B20 */ 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x1C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 00008B30 */ 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC2, -/* 00008B40 */ 0x03, 0x00, 0x0F, 0x09, 0x28, 0x01, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, -/* 00008B50 */ 0x6C, 0x0F, 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x0F, -/* 00008B60 */ 0x0F, 0x47, 0x0C, 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x02, -/* 00008B70 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x0F, 0x1E, 0x00, 0x0F, 0x09, -/* 00008B80 */ 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, -/* 00008B90 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0xFF, 0x0F, 0x8E, 0x04, 0x00, -/* 00008BA0 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00008BB0 */ 0x10, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, -/* 00008BC0 */ 0x0D, 0x0F, 0x09, 0x3D, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x07, -/* 00008BD0 */ 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0F, -/* 00008BE0 */ 0x0F, 0x47, 0x0D, 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, -/* 00008BF0 */ 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0x1F, 0x03, -/* 00008C00 */ 0xFF, 0x0F, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x04, -/* 00008C10 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, -/* 00008C20 */ 0x0F, 0x47, 0x0F, 0x0D, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, -/* 00008C30 */ 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, -/* 00008C40 */ 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, -/* 00008C50 */ 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0x10, 0x10, 0x76, 0x10, 0x0F, 0x05, 0x61, 0x0F, 0x0D, 0x06, 0x82, -/* 00008C60 */ 0x0F, 0x0F, 0x28, 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00008C70 */ 0x00, 0x00, 0xF0, 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, -/* 00008C80 */ 0x78, 0x02, 0xFE, 0x78, 0x02, 0xDB, 0x00, 0xFF, 0x90, 0x42, 0x01, 0x00, 0x14, 0x07, 0x00, 0x00, -/* 00008C90 */ 0x00, 0x05, 0x00, 0x2D, 0x00, 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x2C, -/* 00008CA0 */ 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x1C, 0x00, 0x58, -/* 00008CB0 */ 0x00, 0x1E, 0x00, 0x37, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x1B, 0x00, 0x9D, 0x00, 0x1E, 0x00, 0x47, -/* 00008CC0 */ 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x58, 0x00, 0x1F, 0x00, 0x4F, -/* 00008CD0 */ 0x00, 0x3A, 0x00, 0x66, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, -/* 00008CE0 */ 0x02, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x60, 0x06, 0x64, 0xFF, 0xA0, -/* 00008CF0 */ 0x41, 0xF1, 0x00, 0x4A, 0x00, 0xFF, 0x23, 0x3E, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 00008D00 */ 0x01, 0xFF, 0x23, 0x3E, 0x01, 0x00, 0xFE, 0xAF, 0x02, 0xFE, 0xAF, 0x02, 0x03, 0x0A, 0x0B, 0x10, -/* 00008D10 */ 0x0A, 0x5D, 0x5A, 0x03, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008D20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008D30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, -/* 00008D40 */ 0x03, 0x02, 0x00, 0xFE, 0xFD, 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, 0x02, 0x00, 0xFE, 0x42, -/* 00008D50 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x0B, 0x04, -/* 00008D60 */ 0xFE, 0x7F, 0x01, 0xAE, 0x0E, 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, 0x2C, 0x10, 0x0B, 0x15, 0x19, 0x00, -/* 00008D70 */ 0x10, 0x03, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0xE1, -/* 00008D80 */ 0x10, 0x0B, 0x10, 0x00, 0x0F, 0x21, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00008D90 */ 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, -/* 00008DA0 */ 0x01, 0x04, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 00008DB0 */ 0x00, 0x00, 0x10, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, -/* 00008DC0 */ 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, -/* 00008DD0 */ 0x07, 0x02, 0x00, 0x5C, 0x01, 0x0B, 0xC2, 0x02, 0x11, 0x11, 0x5C, 0x02, 0x11, 0x1F, 0x03, 0x10, -/* 00008DE0 */ 0x10, 0x47, 0x0C, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, -/* 00008DF0 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x21, 0x00, 0x10, 0x09, -/* 00008E00 */ 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, -/* 00008E10 */ 0x00, 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, -/* 00008E20 */ 0x47, 0x00, 0x07, 0x09, 0xBA, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, -/* 00008E30 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x11, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x02, 0x1F, 0x03, -/* 00008E40 */ 0x10, 0x10, 0x47, 0x0D, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x4B, -/* 00008E50 */ 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x97, 0x11, 0x0E, 0x08, 0x5C, 0x02, -/* 00008E60 */ 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, -/* 00008E70 */ 0x5C, 0x00, 0x06, 0x97, 0x12, 0x0E, 0x09, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x0A, -/* 00008E80 */ 0x1F, 0x04, 0x11, 0x11, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00008E90 */ 0x11, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00008EA0 */ 0x09, 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, 0x12, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x8E, -/* 00008EB0 */ 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x14, 0x6C, 0x13, 0x14, 0x02, 0x07, 0x02, 0x00, -/* 00008EC0 */ 0x5C, 0x00, 0x14, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0D, -/* 00008ED0 */ 0x1F, 0x03, 0x11, 0x11, 0x5C, 0x01, 0x11, 0x1F, 0x02, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 00008EE0 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0x41, -/* 00008EF0 */ 0x3E, 0x01, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x6F, 0x00, -/* 00008F00 */ 0x3B, 0x00, 0x53, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x1F, 0x00, 0x3A, 0x00, -/* 00008F10 */ 0x46, 0x00, 0x76, 0x00, 0x55, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x1F, 0xFC, 0x07, -/* 00008F20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x53, 0x06, 0x64, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x49, 0x00, -/* 00008F30 */ 0xFF, 0x08, 0x3B, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x08, 0x3B, 0x01, -/* 00008F40 */ 0x00, 0xFE, 0xAF, 0x02, 0xFE, 0xAF, 0x02, 0x03, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x0B, -/* 00008F50 */ 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008F60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00008F70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFC, -/* 00008F80 */ 0x03, 0x02, 0x01, 0xFE, 0xE8, 0x03, 0x04, 0x02, 0x00, 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, -/* 00008F90 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x09, 0x04, 0xFE, 0x7F, 0x01, 0xAE, 0x0E, -/* 00008FA0 */ 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, 0x2C, 0x10, 0x0B, 0x15, 0x19, 0x00, 0x10, 0x03, 0x09, 0x00, 0x00, -/* 00008FB0 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0xE1, 0x10, 0x0B, 0x10, 0x00, 0x0F, -/* 00008FC0 */ 0x21, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, -/* 00008FD0 */ 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, -/* 00008FE0 */ 0x1F, 0x03, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x03, -/* 00008FF0 */ 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, -/* 00009000 */ 0x11, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x01, -/* 00009010 */ 0x0B, 0xC2, 0x02, 0x11, 0x11, 0x5C, 0x02, 0x11, 0x1F, 0x03, 0x10, 0x10, 0x47, 0x0C, 0x10, 0x8E, -/* 00009020 */ 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, -/* 00009030 */ 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x21, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, -/* 00009040 */ 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0C, -/* 00009050 */ 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xBA, -/* 00009060 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00009070 */ 0x06, 0xCB, 0x11, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x10, 0x10, 0x47, 0x0D, 0x10, -/* 00009080 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x4B, 0x10, 0x07, 0x04, 0x00, 0x5C, -/* 00009090 */ 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x97, 0x11, 0x0E, 0x08, 0x5C, 0x02, 0x11, 0x8E, 0x01, 0x00, 0x00, -/* 000090A0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x97, 0x12, -/* 000090B0 */ 0x0E, 0x09, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x0A, 0x1F, 0x04, 0x11, 0x11, 0x5C, -/* 000090C0 */ 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, -/* 000090D0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, -/* 000090E0 */ 0x6C, 0x11, 0x12, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, -/* 000090F0 */ 0x00, 0x00, 0x00, 0x14, 0x6C, 0x13, 0x14, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x14, 0x5C, 0x01, -/* 00009100 */ 0x0B, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0D, 0x1F, 0x03, 0x11, 0x11, 0x5C, -/* 00009110 */ 0x01, 0x11, 0x1F, 0x02, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 00009120 */ 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0x26, 0x3B, 0x01, 0x00, 0x09, 0x07, -/* 00009130 */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x6F, 0x00, 0x3B, 0x00, 0x53, 0x00, 0x3C, -/* 00009140 */ 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x76, 0x00, 0x55, -/* 00009150 */ 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x1F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00009160 */ 0xFE, 0x46, 0x06, 0x60, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x48, 0x00, 0xFF, 0xF3, 0x37, 0x01, 0x00, -/* 00009170 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0xF3, 0x37, 0x01, 0x00, 0xFE, 0xA9, 0x02, 0xFE, -/* 00009180 */ 0xA9, 0x02, 0x03, 0x0A, 0x0C, 0x11, 0x0A, 0x5D, 0x5A, 0x03, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, -/* 00009190 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, -/* 000091A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 000091B0 */ 0x00, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0x03, 0x02, 0x01, 0xFE, 0xE8, -/* 000091C0 */ 0x03, 0x04, 0x02, 0x00, 0xFE, 0x42, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -/* 000091D0 */ 0x00, 0x02, 0x00, 0xFE, 0x0A, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0xFE, 0x7F, 0x01, 0xAE, 0x0F, -/* 000091E0 */ 0x5B, 0x0C, 0xB3, 0x0C, 0x0C, 0x2C, 0x11, 0x0C, 0x15, 0x19, 0x00, 0x11, 0x03, 0x09, 0x00, 0x00, -/* 000091F0 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0xE1, 0x11, 0x0C, 0x11, 0x00, 0x0F, -/* 00009200 */ 0x21, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, -/* 00009210 */ 0x6C, 0x11, 0x12, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, -/* 00009220 */ 0x1F, 0x03, 0xFF, 0x11, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x11, 0x07, 0x03, -/* 00009230 */ 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x12, 0x5C, 0x01, -/* 00009240 */ 0x12, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x01, -/* 00009250 */ 0x0C, 0xC2, 0x02, 0x12, 0x12, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0D, 0x11, 0x8E, -/* 00009260 */ 0x03, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, -/* 00009270 */ 0x01, 0x0D, 0x1F, 0x02, 0x11, 0x11, 0x0F, 0x21, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, -/* 00009280 */ 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0D, -/* 00009290 */ 0x1F, 0x02, 0x11, 0x11, 0x0F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x00, 0x47, 0x00, 0x07, 0x09, 0xBA, -/* 000092A0 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x11, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 000092B0 */ 0x06, 0xCB, 0x12, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0E, 0x11, -/* 000092C0 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, -/* 000092D0 */ 0x00, 0x06, 0x5C, 0x01, 0x0E, 0x97, 0x12, 0x0F, 0x08, 0x5C, 0x02, 0x12, 0x8E, 0x01, 0x00, 0x00, -/* 000092E0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x97, 0x13, -/* 000092F0 */ 0x0F, 0x09, 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x0B, 0x1F, 0x04, 0x12, 0x12, 0x5C, -/* 00009300 */ 0x03, 0x12, 0x1F, 0x04, 0xFF, 0x11, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, -/* 00009310 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, -/* 00009320 */ 0x6C, 0x12, 0x13, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x13, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, -/* 00009330 */ 0x00, 0x00, 0x00, 0x15, 0x6C, 0x14, 0x15, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x15, 0x5C, 0x01, -/* 00009340 */ 0x0C, 0x1F, 0x02, 0x14, 0x14, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x12, 0x12, 0x5C, -/* 00009350 */ 0x01, 0x12, 0x1F, 0x02, 0x00, 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 00009360 */ 0x67, 0x02, 0xFE, 0x31, 0x02, 0xFE, 0x5C, 0x02, 0x00, 0xFF, 0x11, 0x38, 0x01, 0x00, 0x09, 0x07, -/* 00009370 */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x6B, 0x00, 0x3B, 0x00, 0x53, 0x00, 0x3C, -/* 00009380 */ 0x00, 0x3C, 0x00, 0x06, 0x00, 0x39, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x74, 0x00, 0x55, -/* 00009390 */ 0x00, 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x4F, 0xFD, 0x07, 0xFE, 0x08, 0x04, 0xFE, 0xC1, -/* 000093A0 */ 0x05, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x47, 0x00, 0xFF, 0x28, 0x1C, 0x01, 0x00, 0xFF, 0x00, -/* 000093B0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x28, 0x1C, 0x01, 0x00, 0xFE, 0x69, 0x1B, 0xFE, 0x69, 0x1B, -/* 000093C0 */ 0x45, 0x1C, 0x29, 0x41, 0x07, 0xFE, 0xAA, 0x01, 0xFE, 0x8A, 0x01, 0x03, 0x0F, 0x2A, 0x2A, 0x2A, -/* 000093D0 */ 0x2A, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000093E0 */ 0xFF, 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 000093F0 */ 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x02, 0x03, -/* 00009400 */ 0x08, 0x02, 0x00, 0xFE, 0x0A, 0x04, 0x02, 0x01, 0xFE, 0x09, 0x04, 0x02, 0x01, 0xFE, 0x8E, 0x03, -/* 00009410 */ 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, -/* 00009420 */ 0x01, 0xFE, 0x38, 0x04, 0x02, 0x01, 0xFE, 0x39, 0x04, 0x02, 0x00, 0xFE, 0x13, 0x04, 0x02, 0x00, -/* 00009430 */ 0xFE, 0x14, 0x04, 0x02, 0x00, 0xFE, 0x16, 0x04, 0x02, 0x01, 0xFE, 0x3A, 0x04, 0x02, 0x01, 0xFE, -/* 00009440 */ 0x0D, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0x0E, -/* 00009450 */ 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, -/* 00009460 */ 0x02, 0x01, 0xFE, 0x12, 0x04, 0x02, 0x01, 0xFE, 0x3B, 0x04, 0x02, 0x01, 0xFE, 0x3C, 0x04, 0x02, -/* 00009470 */ 0x01, 0xFE, 0x58, 0x03, 0x02, 0x00, 0xFE, 0x3D, 0x04, 0x02, 0x00, 0xFE, 0x3E, 0x04, 0x02, 0x00, -/* 00009480 */ 0xFE, 0x3F, 0x04, 0x02, 0x00, 0xFE, 0x40, 0x04, 0x03, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x00, -/* 00009490 */ 0xFE, 0x00, 0x04, 0x09, 0x02, 0x00, 0xFE, 0x41, 0x04, 0x02, 0x01, 0xFE, 0x0C, 0x04, 0x01, 0x00, -/* 000094A0 */ 0x00, 0x00, 0x00, 0xFE, 0x59, 0x06, 0xA8, 0x3F, 0x2C, 0x42, 0x29, 0x0D, 0x03, 0x00, 0x42, 0x02, -/* 000094B0 */ 0x09, 0x18, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, 0x43, -/* 000094C0 */ 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 000094D0 */ 0x0C, 0x00, 0x00, 0x00, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 000094E0 */ 0x19, 0x00, 0x00, 0x00, 0x43, 0x5C, 0x01, 0x43, 0x5C, 0x02, 0x29, 0x5C, 0x03, 0x03, 0x1F, 0x04, -/* 000094F0 */ 0x42, 0x42, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x29, 0x00, 0x61, 0x42, 0x29, 0x01, 0x0F, 0x03, 0x00, -/* 00009500 */ 0x42, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, -/* 00009510 */ 0x43, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, -/* 00009520 */ 0xFF, 0x42, 0x76, 0x06, 0x29, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, -/* 00009530 */ 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x07, 0x5C, 0x03, -/* 00009540 */ 0x08, 0x1F, 0x04, 0x42, 0x42, 0x47, 0x2B, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 00009550 */ 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x09, 0x5C, 0x03, -/* 00009560 */ 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x0B, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, -/* 00009570 */ 0x05, 0x0C, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x2E, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 00009580 */ 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x0D, 0x5C, -/* 00009590 */ 0x03, 0x0A, 0xA8, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, -/* 000095A0 */ 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x2F, 0x42, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x00, -/* 000095B0 */ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, 0x43, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 000095C0 */ 0x43, 0x5C, 0x01, 0x2F, 0x1F, 0x02, 0x42, 0x42, 0x47, 0x2F, 0x42, 0x09, 0x1B, 0x00, 0x8E, 0x03, -/* 000095D0 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, 0x43, 0x05, 0x07, 0x01, 0x00, 0x5C, -/* 000095E0 */ 0x00, 0x43, 0x1F, 0x01, 0x42, 0x42, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x14, 0x03, 0x00, 0x2F, 0x42, -/* 000095F0 */ 0x09, 0x18, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, 0x43, -/* 00009600 */ 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00009610 */ 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, -/* 00009620 */ 0x0E, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x03, 0xA1, 0x00, 0x0F, 0x43, 0xA1, 0x01, 0x10, 0x43, 0xA1, -/* 00009630 */ 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, -/* 00009640 */ 0x30, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, -/* 00009650 */ 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x12, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x03, 0xA1, 0x00, -/* 00009660 */ 0x0F, 0x43, 0xA1, 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, -/* 00009670 */ 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x31, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 00009680 */ 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x13, 0x5C, -/* 00009690 */ 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, -/* 000096A0 */ 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x32, 0x42, 0x8E, 0x03, 0x00, 0x00, -/* 000096B0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, -/* 000096C0 */ 0x02, 0x16, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x05, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, -/* 000096D0 */ 0xA1, 0x02, 0x0F, 0x43, 0xA1, 0x03, 0x10, 0x43, 0xA1, 0x04, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, -/* 000096E0 */ 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x33, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 000096F0 */ 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, -/* 00009700 */ 0x17, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, -/* 00009710 */ 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x34, 0x42, 0x8E, 0x03, -/* 00009720 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 00009730 */ 0x2B, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, -/* 00009740 */ 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x35, -/* 00009750 */ 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 00009760 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x19, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, -/* 00009770 */ 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, -/* 00009780 */ 0x42, 0x47, 0x36, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x07, 0x06, -/* 00009790 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, -/* 000097A0 */ 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, -/* 000097B0 */ 0x1F, 0x06, 0x42, 0x42, 0x47, 0x37, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 000097C0 */ 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1B, 0x5C, 0x03, 0x0A, -/* 000097D0 */ 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x10, 0x43, 0xA1, 0x01, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, -/* 000097E0 */ 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x38, 0x42, 0x0F, 0x03, 0x00, 0x35, 0x09, 0x2D, -/* 000097F0 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x43, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 00009800 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x1D, 0xA8, 0x44, 0x5C, 0x04, 0x44, 0xA8, -/* 00009810 */ 0x44, 0x5C, 0x05, 0x44, 0x1F, 0x06, 0x43, 0x43, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, -/* 00009820 */ 0x47, 0x42, 0x43, 0x47, 0x39, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, -/* 00009830 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x1E, 0x5C, 0x03, 0x0A, 0xCD, -/* 00009840 */ 0x43, 0x02, 0xA1, 0x00, 0x1F, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, 0x05, 0x0C, -/* 00009850 */ 0x1F, 0x06, 0x42, 0x42, 0x47, 0x3A, 0x42, 0xA8, 0x42, 0x15, 0x03, 0x00, 0x39, 0x42, 0x09, 0x16, -/* 00009860 */ 0x00, 0x0F, 0x03, 0x00, 0x39, 0x09, 0x06, 0x00, 0x47, 0x43, 0x20, 0x09, 0x03, 0x00, 0x47, 0x43, -/* 00009870 */ 0x21, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, 0x43, 0x47, 0x3B, 0x42, 0x8E, -/* 00009880 */ 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00009890 */ 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 000098A0 */ 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x7A, 0x30, -/* 000098B0 */ 0x44, 0x07, 0x7A, 0x31, 0x44, 0x08, 0x7A, 0x32, 0x44, 0x09, 0x7A, 0x33, 0x44, 0x0A, 0x7A, 0x34, -/* 000098C0 */ 0x44, 0x0B, 0x7A, 0x35, 0x44, 0x0C, 0x7A, 0x36, 0x44, 0x0D, 0x7A, 0x37, 0x44, 0x0E, 0x7A, 0x38, -/* 000098D0 */ 0x44, 0x0F, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x22, 0x1F, 0x03, 0x43, 0x43, 0x5C, 0x01, 0x43, 0x1F, -/* 000098E0 */ 0x02, 0x42, 0x42, 0x47, 0x3C, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x42, -/* 000098F0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2A, 0x1F, 0x02, 0x42, 0x42, 0x47, 0x2A, 0x42, -/* 00009900 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x42, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, -/* 00009910 */ 0x5C, 0x01, 0x2A, 0x5C, 0x02, 0x2E, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x23, 0x43, 0xA1, 0x01, 0x24, -/* 00009920 */ 0x43, 0x5C, 0x03, 0x43, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x43, 0x5C, 0x04, -/* 00009930 */ 0x43, 0x1F, 0x05, 0x42, 0x42, 0x47, 0x3D, 0x42, 0x76, 0x2E, 0x29, 0x10, 0x76, 0x2F, 0x29, 0x11, -/* 00009940 */ 0x61, 0x42, 0x3D, 0x12, 0x76, 0x42, 0x29, 0x13, 0x76, 0x30, 0x29, 0x14, 0x76, 0x31, 0x29, 0x15, -/* 00009950 */ 0x76, 0x32, 0x29, 0x16, 0x76, 0x33, 0x29, 0x17, 0x76, 0x34, 0x29, 0x18, 0x76, 0x35, 0x29, 0x19, -/* 00009960 */ 0x76, 0x36, 0x29, 0x1A, 0x76, 0x37, 0x29, 0x1B, 0x76, 0x38, 0x29, 0x1C, 0x76, 0x39, 0x29, 0x1D, -/* 00009970 */ 0x76, 0x3A, 0x29, 0x1E, 0x76, 0x3B, 0x29, 0x1F, 0x76, 0x3C, 0x29, 0x20, 0x47, 0x3E, 0x25, 0xE5, -/* 00009980 */ 0x20, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x03, -/* 00009990 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, 0x25, 0x1F, 0x03, 0xFF, 0x42, 0xE9, 0x09, -/* 000099A0 */ 0x63, 0x00, 0xE7, 0x2C, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x42, 0x07, -/* 000099B0 */ 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2C, 0x1F, 0x02, 0xFF, 0x42, 0x8E, 0x01, 0x00, 0x00, -/* 000099C0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 000099D0 */ 0x2B, 0x5C, 0x02, 0x26, 0x5C, 0x03, 0x27, 0x1F, 0x04, 0x42, 0x42, 0x47, 0x3F, 0x42, 0x47, 0x42, -/* 000099E0 */ 0x29, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x43, 0x4B, 0x43, 0x07, 0x03, 0x00, -/* 000099F0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x22, 0x1F, 0x03, 0x43, 0x43, 0x76, 0x43, 0x42, -/* 00009A00 */ 0x21, 0x47, 0x3E, 0x06, 0xE9, 0x0F, 0x2E, 0x00, 0x3E, 0x09, 0x00, 0x00, 0x47, 0x42, 0x29, 0x8E, -/* 00009A10 */ 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x43, 0x4B, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00009A20 */ 0x04, 0x61, 0x44, 0x29, 0x22, 0x97, 0x44, 0x44, 0x28, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x29, 0x1F, -/* 00009A30 */ 0x03, 0x43, 0x43, 0x76, 0x43, 0x42, 0x21, 0xE5, 0x20, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x3E, -/* 00009A40 */ 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, -/* 00009A50 */ 0x02, 0x06, 0x1F, 0x03, 0xFF, 0x42, 0xE9, 0x09, 0x33, 0x00, 0xE7, 0x2D, 0x06, 0x8E, 0x03, 0x00, -/* 00009A60 */ 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2D, -/* 00009A70 */ 0x1F, 0x02, 0xFF, 0x42, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x43, 0x6C, 0x42, -/* 00009A80 */ 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0xE9, 0x8E, 0x01, 0x00, -/* 00009A90 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x42, 0x4B, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x61, -/* 00009AA0 */ 0x43, 0x29, 0x23, 0x5C, 0x01, 0x43, 0x1F, 0x02, 0x42, 0x42, 0x76, 0x42, 0x29, 0x24, 0x47, 0x42, -/* 00009AB0 */ 0x29, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 00009AC0 */ 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x44, 0x5C, 0x01, 0x44, 0x61, 0x44, -/* 00009AD0 */ 0x29, 0x25, 0x5C, 0x02, 0x44, 0x1F, 0x03, 0x43, 0x43, 0x76, 0x43, 0x42, 0x26, 0x61, 0x42, 0x29, -/* 00009AE0 */ 0x27, 0xA8, 0x43, 0x15, 0x03, 0x00, 0x42, 0x43, 0x09, 0x0C, 0x00, 0x61, 0x42, 0x29, 0x28, 0x43, -/* 00009AF0 */ 0x42, 0x42, 0x20, 0x76, 0x42, 0x29, 0x1D, 0x76, 0x06, 0x29, 0x29, 0xA8, 0x00, 0x24, 0x00, 0x01, -/* 00009B00 */ 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x02, -/* 00009B10 */ 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x7E, 0x02, -/* 00009B20 */ 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x84, 0x02, -/* 00009B30 */ 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, 0x02, 0xFE, -/* 00009B40 */ 0x63, 0x02, 0xFE, 0x64, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x7B, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x7C, -/* 00009B50 */ 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x81, 0x02, -/* 00009B60 */ 0xFE, 0x84, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x17, 0x02, 0xFE, -/* 00009B70 */ 0x86, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x8B, -/* 00009B80 */ 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x91, 0x02, -/* 00009B90 */ 0xFE, 0x23, 0x02, 0xFE, 0x18, 0x02, 0xFE, 0x18, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x24, 0x02, 0xFE, -/* 00009BA0 */ 0x92, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x23, 0x02, 0xFE, 0x6C, -/* 00009BB0 */ 0x02, 0x00, 0xFF, 0x81, 0x1C, 0x01, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, -/* 00009BC0 */ 0x18, 0x00, 0x3F, 0x00, 0x39, 0x00, 0x9F, 0x00, 0x1E, 0x00, 0x71, 0x00, 0x04, 0x00, 0x67, 0x00, -/* 00009BD0 */ 0x22, 0x00, 0x46, 0x00, 0x31, 0x00, 0x71, 0x00, 0x2A, 0x00, 0x60, 0x00, 0x0A, 0x00, 0x32, 0x00, -/* 00009BE0 */ 0x21, 0x00, 0x6C, 0x00, 0x1B, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x18, 0x00, 0x6C, 0x00, -/* 00009BF0 */ 0x37, 0x00, 0x6F, 0x00, 0x37, 0x00, 0x67, 0x00, 0x33, 0x00, 0x64, 0x00, 0x3F, 0x00, 0x81, 0x00, -/* 00009C00 */ 0x33, 0x00, 0x62, 0x00, 0x33, 0x00, 0x64, 0x00, 0x33, 0x00, 0x68, 0x00, 0x33, 0x00, 0x68, 0x00, -/* 00009C10 */ 0x33, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x6F, 0x00, 0x31, 0x00, 0x77, 0x00, 0x28, 0x00, 0x71, 0x00, -/* 00009C20 */ 0x67, 0x00, 0xD0, 0x01, 0x1A, 0x00, 0x41, 0x00, 0x38, 0x00, 0x9A, 0x00, 0x04, 0x00, 0x34, 0x00, -/* 00009C30 */ 0x04, 0x00, 0x36, 0x00, 0x08, 0x00, 0x68, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x2C, 0x00, -/* 00009C40 */ 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x30, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, -/* 00009C50 */ 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x32, 0x00, -/* 00009C60 */ 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0xFA, 0x02, 0x06, 0x00, 0x93, 0x00, -/* 00009C70 */ 0x22, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x17, 0x00, 0xEF, 0x00, 0x22, 0x00, 0x54, 0x00, -/* 00009C80 */ 0x23, 0x00, 0x6A, 0x00, 0x04, 0x00, 0x37, 0x00, 0x07, 0x00, 0x5A, 0x00, 0x2E, 0x00, 0xDE, 0x00, -/* 00009C90 */ 0x22, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x17, 0x00, 0x77, 0x01, 0x19, 0x00, 0x77, 0x00, -/* 00009CA0 */ 0x21, 0x00, 0x66, 0x00, 0x2F, 0x00, 0x82, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x0C, 0x00, 0x6D, 0x00, -/* 00009CB0 */ 0x06, 0x00, 0x3F, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x8F, 0xFC, 0x07, 0xFE, 0x07, 0x04, 0xFE, -/* 00009CC0 */ 0x88, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x46, 0x00, 0xFF, 0xED, 0x0E, 0x01, 0x00, 0xFF, -/* 00009CD0 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFF, 0xED, 0x0E, 0x01, 0x00, 0xFE, 0x2D, 0x0D, 0xFE, 0x2D, -/* 00009CE0 */ 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, 0xC8, 0xBB, 0x03, 0x07, 0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0xFF, -/* 00009CF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, -/* 00009D00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 00009D10 */ 0x02, 0x00, 0xFE, 0x32, 0x04, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x03, 0x02, 0x00, 0xFE, 0x33, -/* 00009D20 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x34, 0x04, 0x02, 0x00, 0xFE, 0x27, 0x04, -/* 00009D30 */ 0x02, 0x00, 0xFE, 0x35, 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, -/* 00009D40 */ 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, -/* 00009D50 */ 0xFE, 0x12, 0x04, 0x02, 0x00, 0xFE, 0x36, 0x04, 0xFE, 0x06, 0x03, 0xA8, 0x14, 0x61, 0x16, 0x13, -/* 00009D60 */ 0x00, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00009D70 */ 0x05, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, -/* 00009D80 */ 0x61, 0x17, 0x13, 0x00, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x02, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, -/* 00009D90 */ 0x16, 0x61, 0x16, 0x13, 0x01, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x00, 0x00, 0x61, -/* 00009DA0 */ 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, 0x16, 0x04, 0x09, 0x8E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 00009DB0 */ 0x09, 0x00, 0x00, 0x00, 0x17, 0x6C, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, -/* 00009DC0 */ 0x01, 0x12, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x16, 0x16, 0x47, 0x14, 0x16, 0x14, -/* 00009DD0 */ 0x03, 0x00, 0x14, 0x05, 0x09, 0x2E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, -/* 00009DE0 */ 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, -/* 00009DF0 */ 0x17, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x06, 0xC2, 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, -/* 00009E00 */ 0xFF, 0x16, 0x09, 0x31, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, -/* 00009E10 */ 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x5C, -/* 00009E20 */ 0x01, 0x17, 0x5C, 0x02, 0x12, 0x97, 0x17, 0x14, 0x07, 0x5C, 0x03, 0x17, 0x5C, 0x04, 0x08, 0x1F, -/* 00009E30 */ 0x05, 0x16, 0x16, 0x47, 0x12, 0x16, 0x09, 0x97, 0x00, 0x61, 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, -/* 00009E40 */ 0x16, 0x09, 0x09, 0x8B, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x6C, -/* 00009E50 */ 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x01, 0x5C, -/* 00009E60 */ 0x02, 0x18, 0x1F, 0x03, 0x16, 0x16, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x2E, -/* 00009E70 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 00009E80 */ 0x03, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, 0x07, 0x02, 0x00, 0x5C, 0x01, -/* 00009E90 */ 0x06, 0xC2, 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x09, 0x31, 0x00, 0x8E, -/* 00009EA0 */ 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8E, -/* 00009EB0 */ 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x12, 0x97, -/* 00009EC0 */ 0x17, 0x14, 0x07, 0x5C, 0x03, 0x17, 0x5C, 0x04, 0x0A, 0x1F, 0x05, 0x16, 0x16, 0x47, 0x12, 0x16, -/* 00009ED0 */ 0x61, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x41, 0x00, 0x61, 0x16, -/* 00009EE0 */ 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x04, 0x09, 0x35, 0x00, 0x61, 0x16, 0x13, 0x04, 0x15, 0x03, -/* 00009EF0 */ 0x00, 0x16, 0x0B, 0x09, 0x29, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, -/* 00009F00 */ 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x04, 0x5C, -/* 00009F10 */ 0x02, 0x17, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x09, 0x34, 0x00, 0x61, -/* 00009F20 */ 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, -/* 00009F30 */ 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, -/* 00009F40 */ 0x01, 0x12, 0x61, 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0x16, 0x16, -/* 00009F50 */ 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x05, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, -/* 00009F60 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, -/* 00009F70 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x05, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0D, -/* 00009F80 */ 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x06, 0xA8, 0x17, 0x15, 0x03, 0x00, -/* 00009F90 */ 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4B, -/* 00009FA0 */ 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x06, 0x5C, 0x02, -/* 00009FB0 */ 0x17, 0x5C, 0x03, 0x0E, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x07, 0xA8, -/* 00009FC0 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, -/* 00009FD0 */ 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, -/* 00009FE0 */ 0x13, 0x07, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, -/* 00009FF0 */ 0x16, 0x13, 0x08, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, 0x00, 0x8E, 0x01, 0x00, -/* 0000A000 */ 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, -/* 0000A010 */ 0x01, 0x12, 0x61, 0x17, 0x13, 0x08, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x10, 0x1F, 0x04, 0x16, 0x16, -/* 0000A020 */ 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x09, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x26, -/* 0000A030 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, -/* 0000A040 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x09, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x11, -/* 0000A050 */ 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x47, 0x00, 0x12, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000A060 */ 0x00, 0x00, 0x00, 0xFE, 0x86, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x87, 0x02, 0xFE, 0x37, 0x02, 0xFE, -/* 0000A070 */ 0x88, 0x02, 0xFE, 0x89, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8F, -/* 0000A080 */ 0x02, 0x00, 0x1C, 0xFE, 0x37, 0x04, 0x00, 0x1C, 0xFE, 0x37, 0x04, 0x00, 0xFF, 0x3C, 0x0F, 0x01, -/* 0000A090 */ 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x26, 0x00, 0x88, 0x00, 0x0E, 0x00, -/* 0000A0A0 */ 0x8E, 0x01, 0x0C, 0x00, 0x3F, 0x00, 0x24, 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x2E, 0x00, -/* 0000A0B0 */ 0x91, 0x00, 0x34, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x6B, 0x00, 0x08, 0x00, -/* 0000A0C0 */ 0x2E, 0x00, 0x2E, 0x00, 0x91, 0x00, 0x31, 0x00, 0x2F, 0x01, 0x26, 0x00, 0x90, 0x00, 0x29, 0x00, -/* 0000A0D0 */ 0x76, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x26, 0x00, 0x8B, 0x00, 0x0E, 0x00, 0x3E, 0x00, 0x26, 0x00, -/* 0000A0E0 */ 0x87, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x26, 0x00, 0x89, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x26, 0x00, -/* 0000A0F0 */ 0x8D, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x26, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x47, 0x00, 0x26, 0x00, -/* 0000A100 */ 0x8C, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x06, -/* 0000A110 */ 0x04, 0xFE, 0x74, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x45, 0x00, 0xFF, 0x85, 0x09, 0x01, -/* 0000A120 */ 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x85, 0x09, 0x01, 0x00, 0xFE, 0xF8, 0x04, -/* 0000A130 */ 0xFE, 0xF8, 0x04, 0x01, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, -/* 0000A140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, -/* 0000A150 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000A160 */ 0x00, 0x02, 0x00, 0xFE, 0x22, 0x04, 0x02, 0x00, 0xFE, 0x2D, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, -/* 0000A170 */ 0x2E, 0x04, 0x02, 0x00, 0xFE, 0x25, 0x04, 0x02, 0x00, 0xFE, 0x26, 0x04, 0x02, 0x00, 0xFE, 0x18, -/* 0000A180 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x28, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, -/* 0000A190 */ 0x02, 0x00, 0xFE, 0x2F, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x30, 0x04, 0x02, -/* 0000A1A0 */ 0x00, 0xFE, 0x31, 0x04, 0xFE, 0x1A, 0x01, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000A1B0 */ 0x17, 0x6C, 0x16, 0x17, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x11, 0x8E, 0x03, -/* 0000A1C0 */ 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x18, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, 0x19, -/* 0000A1D0 */ 0x02, 0x13, 0x03, 0x5C, 0x01, 0x19, 0x1F, 0x02, 0x18, 0x18, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x16, -/* 0000A1E0 */ 0x16, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x40, 0x00, 0x8E, 0x03, 0x00, 0x00, -/* 0000A1F0 */ 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, -/* 0000A200 */ 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, 0x07, 0x02, 0x00, 0xFC, 0x18, 0x06, 0x11, 0x06, 0xFE, 0x18, -/* 0000A210 */ 0x07, 0x02, 0x02, 0xFE, 0x18, 0x13, 0x08, 0x04, 0x5C, 0x01, 0x18, 0xC2, 0x02, 0x17, 0x17, 0x5C, -/* 0000A220 */ 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x47, 0x00, 0x11, 0x09, 0x93, 0x00, 0x14, 0x03, 0x00, 0x12, -/* 0000A230 */ 0x09, 0x09, 0x3D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x05, -/* 0000A240 */ 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, -/* 0000A250 */ 0x17, 0x5C, 0x02, 0x11, 0x97, 0x17, 0x14, 0x0A, 0x5C, 0x03, 0x17, 0x97, 0x17, 0x14, 0x0C, 0xFB, -/* 0000A260 */ 0x17, 0x0B, 0x17, 0x0D, 0x5C, 0x04, 0x17, 0x1F, 0x05, 0x00, 0x16, 0x09, 0x51, 0x00, 0x09, 0x46, -/* 0000A270 */ 0x00, 0x97, 0x16, 0x14, 0x0E, 0x15, 0x03, 0x00, 0x16, 0x0F, 0x09, 0x3A, 0x00, 0x8E, 0x03, 0x00, -/* 0000A280 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, -/* 0000A290 */ 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x97, 0x17, 0x14, -/* 0000A2A0 */ 0x0A, 0x5C, 0x03, 0x17, 0x97, 0x17, 0x14, 0x0C, 0xFB, 0x17, 0x0B, 0x17, 0x10, 0x5C, 0x04, 0x17, -/* 0000A2B0 */ 0x1F, 0x05, 0x00, 0x16, 0x09, 0x08, 0x00, 0x47, 0x00, 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000A2C0 */ 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, 0xFF, 0xAC, 0x0A, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000A2D0 */ 0x00, 0x3D, 0x00, 0x91, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x3A, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, -/* 0000A2E0 */ 0x00, 0x08, 0x00, 0x33, 0x00, 0x3D, 0x00, 0x81, 0x00, 0x0C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x8A, -/* 0000A2F0 */ 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x05, 0x04, -/* 0000A300 */ 0xFE, 0x63, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x44, 0x00, 0xFF, 0x57, 0x04, 0x01, 0x00, -/* 0000A310 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x57, 0x04, 0x01, 0x00, 0xFE, 0x20, 0x05, 0xFE, -/* 0000A320 */ 0x20, 0x05, 0x01, 0x09, 0x14, 0x19, 0x07, 0x50, 0x4B, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, 0xFF, -/* 0000A330 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0xFF, -/* 0000A340 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000A350 */ 0x02, 0x00, 0xFE, 0x22, 0x04, 0x02, 0x00, 0xFE, 0x23, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, 0x24, -/* 0000A360 */ 0x04, 0x02, 0x00, 0xFE, 0x25, 0x04, 0x02, 0x00, 0xFE, 0x26, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, -/* 0000A370 */ 0x02, 0x00, 0xFE, 0x27, 0x04, 0x02, 0x00, 0xFE, 0x16, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, -/* 0000A380 */ 0x01, 0xFE, 0x28, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x29, 0x04, 0x02, 0x01, -/* 0000A390 */ 0xFE, 0x2A, 0x04, 0x02, 0x00, 0xFE, 0x14, 0x04, 0x02, 0x00, 0xFE, 0x2B, 0x04, 0x02, 0x00, 0xFE, -/* 0000A3A0 */ 0x2C, 0x04, 0xFE, 0x49, 0x01, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1A, 0x6C, -/* 0000A3B0 */ 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x14, 0x8E, 0x03, 0x00, 0x00, -/* 0000A3C0 */ 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, 0x1C, 0x02, 0x16, -/* 0000A3D0 */ 0x03, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1B, 0x1B, 0x5C, 0x02, 0x1B, 0x1F, 0x03, 0x19, 0x19, 0x47, -/* 0000A3E0 */ 0x17, 0x19, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x40, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x14, -/* 0000A3F0 */ 0x00, 0x00, 0x00, 0x19, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x13, -/* 0000A400 */ 0x00, 0x00, 0x00, 0x1A, 0x07, 0x02, 0x00, 0xFC, 0x1B, 0x06, 0x14, 0x06, 0xFE, 0x1B, 0x07, 0x02, -/* 0000A410 */ 0x02, 0xFE, 0x1B, 0x16, 0x08, 0x04, 0x5C, 0x01, 0x1B, 0xC2, 0x02, 0x1A, 0x1A, 0x5C, 0x01, 0x1A, -/* 0000A420 */ 0x1F, 0x02, 0xFF, 0x19, 0x47, 0x00, 0x14, 0x09, 0xC2, 0x00, 0x97, 0x19, 0x17, 0x09, 0x15, 0x03, -/* 0000A430 */ 0x00, 0x19, 0x0A, 0x09, 0x50, 0x00, 0x14, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x48, 0x00, 0x8E, 0x03, -/* 0000A440 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, -/* 0000A450 */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x97, 0x1A, -/* 0000A460 */ 0x17, 0x0C, 0x5C, 0x03, 0x1A, 0x97, 0x1A, 0x17, 0x0E, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, -/* 0000A470 */ 0x0F, 0x2F, 0x1A, 0x1A, 0x0A, 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0x00, 0x19, -/* 0000A480 */ 0x09, 0x69, 0x00, 0x09, 0x5E, 0x00, 0x15, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x56, 0x00, 0x8E, 0x03, -/* 0000A490 */ 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, -/* 0000A4A0 */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x97, 0x1A, -/* 0000A4B0 */ 0x17, 0x0C, 0x5C, 0x03, 0x1A, 0x97, 0x1A, 0x17, 0x0E, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, -/* 0000A4C0 */ 0x0F, 0x14, 0x03, 0x00, 0x15, 0x11, 0x09, 0x06, 0x00, 0x47, 0x1B, 0x12, 0x09, 0x03, 0x00, 0x47, -/* 0000A4D0 */ 0x1B, 0x13, 0x2F, 0x1A, 0x1A, 0x1B, 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0x00, -/* 0000A4E0 */ 0x19, 0x09, 0x08, 0x00, 0x47, 0x00, 0x14, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000A4F0 */ 0xFE, 0x37, 0x02, 0x00, 0xFF, 0x2D, 0x05, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, -/* 0000A500 */ 0x0F, 0x01, 0x08, 0x00, 0x2A, 0x00, 0x3A, 0x00, 0xF5, 0x00, 0x06, 0x00, 0x39, 0x00, 0x14, 0x00, -/* 0000A510 */ 0x47, 0x00, 0x48, 0x00, 0x85, 0x00, 0x08, 0x00, 0x30, 0x00, 0x56, 0x00, 0xC4, 0x00, 0x08, 0x00, -/* 0000A520 */ 0x22, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x04, 0x04, 0xFE, 0x5A, 0x05, -/* 0000A530 */ 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x43, 0x00, 0xFF, 0xF0, 0x02, 0x01, 0x00, 0xFF, 0x00, 0x10, -/* 0000A540 */ 0x01, 0x00, 0x02, 0x02, 0xFF, 0xF0, 0x02, 0x01, 0x00, 0xE9, 0xE9, 0x01, 0x03, 0x05, 0x07, 0x0E, -/* 0000A550 */ 0x0B, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A560 */ 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A570 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, -/* 0000A580 */ 0xFE, 0xEA, 0x03, 0x30, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x06, 0x00, 0x47, -/* 0000A590 */ 0x00, 0x03, 0x09, 0x1D, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x97, -/* 0000A5A0 */ 0x07, 0x07, 0x05, 0x47, 0x00, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, -/* 0000A5B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x2B, 0x03, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, -/* 0000A5C0 */ 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x06, 0x00, 0x2E, 0x00, 0x1D, 0x00, 0x44, 0x00, 0x00, 0x3F, 0xFD, -/* 0000A5D0 */ 0x02, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0x03, 0x04, 0xFE, 0x1A, 0x05, 0x0C, 0xFF, 0xA3, 0x41, 0xC1, -/* 0000A5E0 */ 0x00, 0x41, 0x00, 0xFE, 0x78, 0xF7, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x78, -/* 0000A5F0 */ 0xF7, 0xFE, 0x95, 0x09, 0xFE, 0x95, 0x09, 0x02, 0x06, 0x17, 0x1B, 0x05, 0xCC, 0xCA, 0x03, 0x07, -/* 0000A600 */ 0x05, 0x05, 0x05, 0x05, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000A610 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, -/* 0000A620 */ 0x13, 0x04, 0x02, 0x00, 0xFE, 0x14, 0x04, 0x02, 0x00, 0xFE, 0x15, 0x04, 0x04, 0x02, 0x00, 0xFE, -/* 0000A630 */ 0x16, 0x04, 0x02, 0x00, 0xFE, 0x17, 0x04, 0x02, 0x00, 0xFE, 0x18, 0x04, 0x02, 0x00, 0xFE, 0x19, -/* 0000A640 */ 0x04, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x00, 0xFE, 0x1A, 0x04, 0x02, 0x00, 0xFE, 0x1B, 0x04, -/* 0000A650 */ 0x02, 0x00, 0xFE, 0x1C, 0x04, 0x02, 0x00, 0xFE, 0x1D, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, -/* 0000A660 */ 0x00, 0xFE, 0x1E, 0x04, 0x02, 0x00, 0xFE, 0x1F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, 0x01, -/* 0000A670 */ 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, -/* 0000A680 */ 0x20, 0x04, 0xFE, 0xAD, 0x03, 0x96, 0x03, 0x00, 0x00, 0x00, 0x17, 0xCD, 0x1B, 0x00, 0x96, 0x02, -/* 0000A690 */ 0x00, 0x00, 0x00, 0x1B, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x0F, 0x03, -/* 0000A6A0 */ 0x00, 0x1B, 0x09, 0x93, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x14, -/* 0000A6B0 */ 0x15, 0x00, 0x1B, 0x02, 0x09, 0x00, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, -/* 0000A6C0 */ 0x00, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x30, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000A6D0 */ 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, -/* 0000A6E0 */ 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, -/* 0000A6F0 */ 0x03, 0x04, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x3F, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, -/* 0000A700 */ 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000A710 */ 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000A720 */ 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, -/* 0000A730 */ 0x1C, 0x5C, 0x03, 0x07, 0x1F, 0x04, 0xFF, 0x1B, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, -/* 0000A740 */ 0x1B, 0x01, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x81, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, -/* 0000A750 */ 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x08, 0x09, 0x30, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000A760 */ 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000A770 */ 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, -/* 0000A780 */ 0x1C, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x3F, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, -/* 0000A790 */ 0x1B, 0x61, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, -/* 0000A7A0 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, -/* 0000A7B0 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, -/* 0000A7C0 */ 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0B, 0x1F, 0x04, 0xFF, 0x1B, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, -/* 0000A7D0 */ 0x61, 0x1B, 0x1B, 0x02, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0xE7, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, -/* 0000A7E0 */ 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x15, 0x00, 0x1B, 0x08, 0x09, 0x00, 0x00, 0x92, 0x03, 0x00, -/* 0000A7F0 */ 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x30, 0x00, 0x8E, -/* 0000A800 */ 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, -/* 0000A810 */ 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, -/* 0000A820 */ 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x93, 0x00, 0x92, -/* 0000A830 */ 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x15, 0x00, 0x1B, 0x03, 0x09, 0x00, -/* 0000A840 */ 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, 0x1B, 0x02, -/* 0000A850 */ 0x09, 0x30, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, -/* 0000A860 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, -/* 0000A870 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0xFF, 0x1B, -/* 0000A880 */ 0x09, 0x3F, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x02, 0x14, 0x03, 0x00, -/* 0000A890 */ 0x1B, 0x06, 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, -/* 0000A8A0 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, -/* 0000A8B0 */ 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0E, 0x1F, 0x04, -/* 0000A8C0 */ 0xFF, 0x1B, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x03, 0x0F, 0x03, 0x00, 0x1B, -/* 0000A8D0 */ 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, -/* 0000A8E0 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, -/* 0000A8F0 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0xFF, 0x1B, -/* 0000A900 */ 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x81, -/* 0000A910 */ 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x03, -/* 0000A920 */ 0x09, 0x30, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, -/* 0000A930 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, -/* 0000A940 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x10, 0x1F, 0x04, 0xFF, 0x1B, -/* 0000A950 */ 0x09, 0x3F, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, -/* 0000A960 */ 0x1B, 0x06, 0x09, 0x2D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, -/* 0000A970 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x5C, -/* 0000A980 */ 0x01, 0x1C, 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x11, 0x1F, 0x04, -/* 0000A990 */ 0xFF, 0x1B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, 0x5C, -/* 0000A9A0 */ 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0xCD, -/* 0000A9B0 */ 0x1C, 0x03, 0xA1, 0x00, 0x12, 0x1C, 0xA1, 0x01, 0x13, 0x1C, 0xA1, 0x02, 0x14, 0x1C, 0x5C, 0x02, -/* 0000A9C0 */ 0x1C, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x03, 0x1C, 0x1F, 0x04, 0xFF, 0x1B, 0x8E, 0x03, -/* 0000A9D0 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x92, 0x02, -/* 0000A9E0 */ 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1B, 0x1B, 0x11, 0x03, 0x00, 0x1B, 0x15, -/* 0000A9F0 */ 0x09, 0x33, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x04, 0x00, -/* 0000AA00 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x01, 0x1C, -/* 0000AA10 */ 0x92, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x16, 0x1F, 0x04, 0x1B, 0x1B, -/* 0000AA20 */ 0x47, 0x00, 0x1B, 0x09, 0x05, 0x00, 0xA8, 0x1B, 0x47, 0x00, 0x1B, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 0000AA30 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x7B, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, -/* 0000AA40 */ 0xFE, 0x84, 0x02, 0xFE, 0x21, 0x04, 0xFE, 0xFB, 0x01, 0x00, 0xFE, 0xB9, 0xF7, 0x1C, 0x06, 0x00, -/* 0000AA50 */ 0x00, 0x00, 0x09, 0x00, 0x24, 0x00, 0x11, 0x00, 0x2B, 0x00, 0x24, 0x00, 0x5B, 0x00, 0x30, 0x00, -/* 0000AA60 */ 0x63, 0x00, 0x12, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0xA5, 0x00, 0x11, 0x00, 0x28, 0x00, 0x12, 0x00, -/* 0000AA70 */ 0x3A, 0x00, 0x30, 0x00, 0x5E, 0x00, 0x12, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x75, 0x00, 0x11, 0x00, -/* 0000AA80 */ 0x29, 0x00, 0x24, 0x00, 0x5A, 0x00, 0x30, 0x00, 0x5A, 0x00, 0x24, 0x00, 0x57, 0x00, 0x30, 0x00, -/* 0000AA90 */ 0x5F, 0x00, 0x12, 0x00, 0x38, 0x00, 0x2D, 0x00, 0x76, 0x00, 0x11, 0x00, 0x27, 0x00, 0x2D, 0x00, -/* 0000AAA0 */ 0x59, 0x00, 0x11, 0x00, 0x30, 0x00, 0x12, 0x00, 0x40, 0x00, 0x30, 0x00, 0x62, 0x00, 0x12, 0x00, -/* 0000AAB0 */ 0x3F, 0x00, 0x2D, 0x00, 0x79, 0x00, 0x3C, 0x00, 0x3B, 0x01, 0x62, 0x00, 0x72, 0x00, 0x00, 0xC3, -/* 0000AAC0 */ 0xAA, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, -/* 0000AAD0 */ 0x44, 0x05, 0x55, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x42, 0x00, 0xFE, 0xA4, 0xFF, 0xFF, 0x00, 0x10, -/* 0000AAE0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA4, 0xFF, 0xAC, 0xAC, 0x41, 0x04, 0x03, 0x05, 0x05, 0x10, 0x10, -/* 0000AAF0 */ 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AB00 */ 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000AB10 */ 0xFF, 0x00, 0x00, 0x04, 0x4A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x97, -/* 0000AB20 */ 0x05, 0x05, 0x03, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x31, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0C, -/* 0000AB30 */ 0x00, 0x00, 0x00, 0x05, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x1E, -/* 0000AB40 */ 0x00, 0x00, 0x00, 0x06, 0x5C, 0x01, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000AB50 */ 0x06, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0xFF, 0x05, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000AB60 */ 0x00, 0x00, 0xFE, 0xC9, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x2C, 0x00, 0x33, 0x00, -/* 0000AB70 */ 0x5A, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x4F, 0xFC, 0x07, 0xFE, 0x02, 0x04, 0xFE, 0xE7, 0x04, -/* 0000AB80 */ 0x0C, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x40, 0x00, 0xFE, 0xBF, 0xED, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000AB90 */ 0x04, 0x04, 0xFE, 0xBF, 0xED, 0xFE, 0x21, 0x09, 0xFE, 0x21, 0x09, 0x01, 0x07, 0x15, 0x1A, 0x05, -/* 0000ABA0 */ 0x93, 0x8D, 0x03, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ABB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ABC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x08, 0x02, 0x01, 0xFE, -/* 0000ABD0 */ 0x09, 0x04, 0x02, 0x00, 0xFE, 0x0A, 0x04, 0x09, 0x02, 0x00, 0xFE, 0x0B, 0x04, 0x02, 0x01, 0xFE, -/* 0000ABE0 */ 0x0C, 0x04, 0x02, 0x01, 0xFE, 0x0D, 0x04, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xB5, -/* 0000ABF0 */ 0x03, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x03, -/* 0000AC00 */ 0x02, 0x01, 0xFE, 0x0E, 0x04, 0x02, 0x01, 0xFE, 0x0F, 0x04, 0x02, 0x01, 0xFE, 0x10, 0x04, 0x02, -/* 0000AC10 */ 0x01, 0xFE, 0x11, 0x04, 0x02, 0x01, 0xFE, 0x12, 0x04, 0xFE, 0x69, 0x02, 0xA8, 0x1A, 0x14, 0x03, -/* 0000AC20 */ 0x00, 0x15, 0x1A, 0x09, 0x22, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x1A, -/* 0000AC30 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x1B, 0x5C, 0x01, 0x1B, 0x5C, 0x02, 0x02, 0x1F, 0x03, -/* 0000AC40 */ 0x1A, 0x1A, 0x47, 0x15, 0x1A, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, -/* 0000AC50 */ 0x00, 0x1B, 0x6C, 0x1A, 0x1B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, 0x1F, -/* 0000AC60 */ 0x02, 0x1A, 0x1A, 0x47, 0x15, 0x1A, 0x47, 0x18, 0x04, 0x14, 0x0B, 0x00, 0x16, 0x05, 0x09, 0x00, -/* 0000AC70 */ 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x3B, 0x00, 0x61, 0x1A, 0x15, 0x01, 0xA8, 0x1B, 0x15, -/* 0000AC80 */ 0x2D, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x02, 0xA8, 0x1B, 0x15, 0x1F, 0x00, -/* 0000AC90 */ 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x03, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, -/* 0000ACA0 */ 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x04, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, -/* 0000ACB0 */ 0x00, 0x47, 0x18, 0x07, 0x14, 0x0B, 0x00, 0x16, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, -/* 0000ACC0 */ 0x06, 0x09, 0x2D, 0x00, 0x61, 0x1A, 0x15, 0x05, 0xA8, 0x1B, 0x15, 0x1F, 0x00, 0x1A, 0x1B, 0x09, -/* 0000ACD0 */ 0x00, 0x00, 0x61, 0x1A, 0x15, 0x06, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, -/* 0000ACE0 */ 0x61, 0x1A, 0x15, 0x07, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, 0x00, 0x47, 0x18, -/* 0000ACF0 */ 0x07, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xBE, 0x00, 0x14, 0x0B, 0x00, 0x17, 0x05, 0x09, 0x00, 0x00, -/* 0000AD00 */ 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xAE, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000AD10 */ 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x0A, 0xCC, 0x00, -/* 0000AD20 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, -/* 0000AD30 */ 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, -/* 0000AD40 */ 0xFF, 0x1A, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, -/* 0000AD50 */ 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x10, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -/* 0000AD60 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, -/* 0000AD70 */ 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x8E, 0x03, 0x00, 0x00, -/* 0000AD80 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, -/* 0000AD90 */ 0x02, 0x11, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, -/* 0000ADA0 */ 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, -/* 0000ADB0 */ 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xBE, 0x00, 0x14, 0x0B, 0x00, -/* 0000ADC0 */ 0x17, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0xAE, 0x00, 0x8E, 0x03, 0x00, -/* 0000ADD0 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, -/* 0000ADE0 */ 0x5C, 0x02, 0x12, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, -/* 0000ADF0 */ 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, -/* 0000AE00 */ 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, -/* 0000AE10 */ 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x13, 0xCC, 0x60, 0x00, -/* 0000AE20 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, -/* 0000AE30 */ 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, -/* 0000AE40 */ 0x1A, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000AE50 */ 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x14, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -/* 0000AE60 */ 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, -/* 0000AE70 */ 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x47, 0x00, 0x15, 0x09, 0x02, -/* 0000AE80 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x06, 0x90, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, -/* 0000AE90 */ 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, -/* 0000AEA0 */ 0xB2, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000AEB0 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000AEC0 */ 0x48, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, -/* 0000AED0 */ 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, -/* 0000AEE0 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 0000AEF0 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, -/* 0000AF00 */ 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, -/* 0000AF10 */ 0xB2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000AF20 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000AF30 */ 0x00, 0xFE, 0x52, 0x03, 0xFE, 0x7B, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, -/* 0000AF40 */ 0xFE, 0x80, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x81, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, -/* 0000AF50 */ 0xB1, 0x01, 0xFE, 0xB2, 0x01, 0x00, 0xFE, 0x09, 0xEE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 0000AF60 */ 0x31, 0x00, 0x22, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x10, 0x00, -/* 0000AF70 */ 0x45, 0x00, 0x38, 0x00, 0x97, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x45, 0x00, 0x2A, 0x00, -/* 0000AF80 */ 0x7A, 0x00, 0x03, 0x00, 0x4F, 0x00, 0x17, 0x00, 0x57, 0x00, 0x3A, 0x00, 0xCB, 0x00, 0x3A, 0x00, -/* 0000AF90 */ 0xCC, 0x00, 0x3A, 0x00, 0xD8, 0x00, 0x17, 0x00, 0x57, 0x00, 0x3A, 0x00, 0xCB, 0x00, 0x3A, 0x00, -/* 0000AFA0 */ 0xCD, 0x00, 0x3A, 0x00, 0xDB, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x4F, -/* 0000AFB0 */ 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xD0, 0x03, 0x18, 0xFF, 0xA0, 0x41, 0xD1, 0x00, -/* 0000AFC0 */ 0x37, 0x00, 0xFE, 0x54, 0xB4, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x54, 0xB4, -/* 0000AFD0 */ 0xFE, 0x76, 0x38, 0xFE, 0x76, 0x38, 0x03, 0x0D, 0x2D, 0x33, 0x09, 0xC5, 0xC5, 0x01, 0x09, 0x0F, -/* 0000AFE0 */ 0x0F, 0x0F, 0x0F, 0x07, 0x02, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x32, 0xFF, 0xFF, 0xFF, -/* 0000AFF0 */ 0xFF, 0xFF, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC2, 0x03, 0x01, -/* 0000B000 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC3, 0x03, 0x02, 0x01, 0xFE, 0xC4, 0x03, 0x01, 0x01, -/* 0000B010 */ 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xC5, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, -/* 0000B020 */ 0xC6, 0x03, 0x01, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x01, 0xFE, 0xC7, 0x03, 0x02, 0x01, -/* 0000B030 */ 0xFE, 0xC8, 0x03, 0x02, 0x01, 0xFE, 0xC9, 0x03, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, -/* 0000B040 */ 0xCA, 0x03, 0x02, 0x00, 0xFE, 0xCB, 0x03, 0x02, 0x00, 0xFE, 0xCC, 0x03, 0x02, 0x00, 0xFE, 0xCD, -/* 0000B050 */ 0x03, 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, -/* 0000B060 */ 0x08, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0xCE, 0x03, -/* 0000B070 */ 0x02, 0x00, 0xFE, 0xCF, 0x03, 0x02, 0x00, 0xFE, 0xD0, 0x03, 0x02, 0x00, 0xFE, 0xD1, 0x03, 0x02, -/* 0000B080 */ 0x00, 0xFE, 0xD2, 0x03, 0x02, 0x00, 0xFE, 0xD3, 0x03, 0x02, 0x00, 0xFE, 0xD4, 0x03, 0x02, 0x01, -/* 0000B090 */ 0xFE, 0xD5, 0x03, 0x02, 0x01, 0xFE, 0xD6, 0x03, 0x02, 0x00, 0xFE, 0xD7, 0x03, 0x02, 0x01, 0xFE, -/* 0000B0A0 */ 0xA0, 0x03, 0x09, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x02, 0x01, 0xFE, -/* 0000B0B0 */ 0xA2, 0x03, 0x02, 0x01, 0xFE, 0xD8, 0x03, 0x02, 0x01, 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xD9, -/* 0000B0C0 */ 0x03, 0xFE, 0xED, 0x03, 0xA8, 0x2D, 0xA8, 0x2E, 0xA8, 0x2F, 0x4F, 0x35, 0x96, 0x03, 0x00, 0x00, -/* 0000B0D0 */ 0x00, 0x35, 0x4F, 0x35, 0x96, 0x04, 0x00, 0x00, 0x00, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, -/* 0000B0E0 */ 0x00, 0x00, 0x00, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B0F0 */ 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7A, 0x03, 0x36, 0x00, 0x7A, 0x03, 0x36, 0x01, 0x7A, -/* 0000B100 */ 0x06, 0x36, 0x02, 0x7A, 0x08, 0x36, 0x03, 0x7A, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5C, 0x02, -/* 0000B110 */ 0x0B, 0x1F, 0x03, 0x35, 0x35, 0x96, 0x03, 0x00, 0x00, 0x00, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000B120 */ 0x0A, 0x00, 0x00, 0x00, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x1C, 0x00, 0x00, 0x00, -/* 0000B130 */ 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7A, 0x03, 0x36, 0x00, 0x7A, 0x03, 0x36, 0x05, -/* 0000B140 */ 0x7A, 0x06, 0x36, 0x06, 0x7A, 0x08, 0x36, 0x07, 0x7A, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5C, -/* 0000B150 */ 0x02, 0x0B, 0x1F, 0x03, 0x35, 0x35, 0x96, 0x04, 0x00, 0x00, 0x00, 0x35, 0x8E, 0x01, 0x00, 0x00, -/* 0000B160 */ 0x00, 0x38, 0x00, 0x00, 0x00, 0x35, 0x14, 0x15, 0x00, 0x35, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x01, -/* 0000B170 */ 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x35, 0x14, 0x03, 0x00, 0x35, 0x11, 0x09, 0x28, 0x03, -/* 0000B180 */ 0xDE, 0x00, 0x03, 0x02, 0xB8, 0x35, 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x35, -/* 0000B190 */ 0x95, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 0000B1A0 */ 0x00, 0x00, 0x00, 0x36, 0x6C, 0x35, 0x36, 0x08, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x36, 0x8E, 0x01, -/* 0000B1B0 */ 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x37, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, -/* 0000B1C0 */ 0x12, 0xB8, 0x39, 0x00, 0x01, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x38, 0x39, 0x5C, 0x02, 0x38, -/* 0000B1D0 */ 0x1F, 0x03, 0x37, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x0A, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, -/* 0000B1E0 */ 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x35, 0x14, 0x03, 0x00, 0x35, 0x10, 0x09, 0xB8, 0x02, -/* 0000B1F0 */ 0xDE, 0x01, 0x04, 0x03, 0xB8, 0x35, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x35, 0x35, 0x01, 0x50, -/* 0000B200 */ 0x01, 0x02, 0x00, 0x00, 0x00, 0x2E, 0x35, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000B210 */ 0x2E, 0x01, 0x50, 0x01, 0x03, 0x00, 0x00, 0x00, 0x2F, 0x35, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, -/* 0000B220 */ 0x00, 0x00, 0x00, 0x2F, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x35, 0x07, 0x03, -/* 0000B230 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x13, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000B240 */ 0x36, 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, -/* 0000B250 */ 0x00, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x14, 0x90, 0x01, 0x00, 0x00, 0x00, -/* 0000B260 */ 0x03, 0x00, 0x00, 0x00, 0x36, 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, -/* 0000B270 */ 0x00, 0x1B, 0x00, 0x00, 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, -/* 0000B280 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x15, 0xCC, 0x38, 0x00, 0x00, -/* 0000B290 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, -/* 0000B2A0 */ 0x00, 0x00, 0x37, 0x4B, 0x37, 0x7A, 0x37, 0x36, 0x09, 0x7A, 0x18, 0x36, 0x0A, 0x7A, 0x18, 0x36, -/* 0000B2B0 */ 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0xCD, 0x35, 0x0B, 0xA1, 0x00, 0x1A, 0x35, 0xA1, -/* 0000B2C0 */ 0x01, 0x1B, 0x35, 0xA1, 0x02, 0x1C, 0x35, 0xA1, 0x03, 0x1D, 0x35, 0xA1, 0x04, 0x1E, 0x35, 0xA1, -/* 0000B2D0 */ 0x05, 0x1F, 0x35, 0xA1, 0x06, 0x20, 0x35, 0xA1, 0x07, 0x21, 0x35, 0xA1, 0x08, 0x22, 0x35, 0xA1, -/* 0000B2E0 */ 0x09, 0x23, 0x35, 0xA1, 0x0A, 0x24, 0x35, 0x96, 0x02, 0x00, 0x00, 0x00, 0x35, 0x8E, 0x01, 0x00, -/* 0000B2F0 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, -/* 0000B300 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x25, 0xCC, 0x4C, 0x00, -/* 0000B310 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B320 */ 0x00, 0x00, 0x00, 0x37, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x37, 0x37, 0x7A, 0x37, 0x36, 0x09, 0x7A, -/* 0000B330 */ 0x26, 0x36, 0x0A, 0x7A, 0x26, 0x36, 0x0C, 0x7A, 0x26, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, -/* 0000B340 */ 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x35, 0x07, 0x03, 0x00, 0x5C, -/* 0000B350 */ 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x61, 0x36, 0x36, 0x0D, -/* 0000B360 */ 0x5C, 0x01, 0x36, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x36, 0x61, 0x36, 0x36, -/* 0000B370 */ 0x0D, 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, -/* 0000B380 */ 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000B390 */ 0x00, 0x36, 0x61, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x28, 0xCC, 0x64, 0x00, 0x00, -/* 0000B3A0 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, -/* 0000B3B0 */ 0x00, 0x00, 0x37, 0x7A, 0x37, 0x36, 0x09, 0x7A, 0x18, 0x36, 0x0A, 0x7A, 0x26, 0x36, 0x0C, 0x7A, -/* 0000B3C0 */ 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, -/* 0000B3D0 */ 0x00, 0x00, 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B3E0 */ 0x00, 0x00, 0x00, 0x36, 0x61, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x29, 0xCC, 0x7C, -/* 0000B3F0 */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xB8, 0x38, 0x00, 0xB7, 0x01, -/* 0000B400 */ 0x00, 0x00, 0x00, 0x38, 0x38, 0x01, 0x50, 0x01, 0x04, 0x00, 0x00, 0x00, 0x37, 0x38, 0x7A, 0x37, -/* 0000B410 */ 0x36, 0x09, 0x01, 0x64, 0x01, 0x37, 0x36, 0x7A, 0x18, 0x36, 0x0A, 0x7A, 0x26, 0x36, 0x0C, 0x7A, -/* 0000B420 */ 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, -/* 0000B430 */ 0x00, 0x00, 0x00, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000B440 */ 0x00, 0x00, 0x00, 0x36, 0x61, 0x36, 0x36, 0x0D, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x2A, 0xCC, 0x94, -/* 0000B450 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000B460 */ 0x2A, 0x00, 0x00, 0x00, 0x37, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x2C, 0xB8, 0x39, -/* 0000B470 */ 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x39, 0x39, 0x01, 0x50, 0x01, 0x05, 0x00, 0x00, 0x00, 0x38, -/* 0000B480 */ 0x39, 0x5C, 0x02, 0x38, 0x1F, 0x03, 0x37, 0x37, 0x7A, 0x37, 0x36, 0x0E, 0x7A, 0x26, 0x36, 0x0C, -/* 0000B490 */ 0x7A, 0x18, 0x36, 0x0B, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x90, 0x01, 0x00, 0x00, 0x00, -/* 0000B4A0 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000B4B0 */ 0x00, 0x07, 0xA8, 0x00, 0x94, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B4C0 */ 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, -/* 0000B4D0 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, -/* 0000B4E0 */ 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, -/* 0000B4F0 */ 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, -/* 0000B500 */ 0xB2, 0x01, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000B510 */ 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, -/* 0000B520 */ 0x38, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, -/* 0000B530 */ 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, -/* 0000B540 */ 0x00, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00, 0x00, 0xC7, 0x03, 0x00, 0x00, 0xC8, 0x03, 0x00, 0x00, -/* 0000B550 */ 0xC9, 0x03, 0x00, 0x00, 0xC6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, -/* 0000B560 */ 0x00, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00, 0x00, 0xC3, 0x03, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x00, -/* 0000B570 */ 0xC5, 0x03, 0x00, 0x00, 0xC6, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xC2, 0x03, 0xFE, 0xC3, 0x03, 0xFE, -/* 0000B580 */ 0xC4, 0x03, 0xFE, 0xC5, 0x03, 0xFE, 0xC6, 0x03, 0xFE, 0xC7, 0x03, 0xFE, 0xC8, 0x03, 0xFE, 0xC9, -/* 0000B590 */ 0x03, 0xFE, 0x32, 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, -/* 0000B5A0 */ 0xFE, 0x45, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xFB, 0x01, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, 0x02, -/* 0000B5B0 */ 0x02, 0x01, 0x00, 0xFE, 0xDC, 0x03, 0x03, 0x02, 0x00, 0xFE, 0x1A, 0x02, 0x01, 0xFE, 0x1C, 0x02, -/* 0000B5C0 */ 0xFE, 0xB9, 0xB4, 0x11, 0x16, 0x00, 0x00, 0x00, 0x41, 0x00, 0x94, 0x01, 0x41, 0x00, 0x0B, 0x02, -/* 0000B5D0 */ 0x3E, 0x00, 0x21, 0x1C, 0x44, 0x00, 0xAE, 0x02, 0x46, 0x00, 0x6A, 0x06, 0x24, 0x00, 0x3B, 0x03, -/* 0000B5E0 */ 0x24, 0x00, 0x52, 0x00, 0x4C, 0x00, 0x9B, 0x00, 0x35, 0x00, 0x1F, 0x01, 0x55, 0x00, 0x99, 0x00, -/* 0000B5F0 */ 0x36, 0x00, 0x48, 0x00, 0x52, 0x00, 0x9E, 0x00, 0x60, 0x00, 0xC2, 0x04, 0x71, 0x00, 0x16, 0x03, -/* 0000B600 */ 0x0D, 0x00, 0x84, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x45, 0xBF, 0x00, 0x00, 0xA9, 0xBD, 0x00, -/* 0000B610 */ 0x00, 0x31, 0xBB, 0x00, 0x00, 0xA1, 0xB9, 0x00, 0x00, 0x43, 0xB7, 0x00, 0x00, 0x21, 0xB6, 0x00, -/* 0000B620 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCE, 0x04, -/* 0000B630 */ 0x39, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x3E, 0x00, 0xFE, 0x8B, 0xE9, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000B640 */ 0x01, 0x01, 0xFE, 0x8B, 0xE9, 0xFE, 0x56, 0x02, 0xFE, 0x56, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, -/* 0000B650 */ 0x25, 0x24, 0x04, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B660 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B670 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, -/* 0000B680 */ 0xFE, 0xE4, 0x03, 0x02, 0x01, 0xFE, 0x01, 0x03, 0x8A, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, -/* 0000B690 */ 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000B6A0 */ 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, -/* 0000B6B0 */ 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000B6C0 */ 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, -/* 0000B6D0 */ 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, -/* 0000B6E0 */ 0x08, 0x06, 0x02, 0x0F, 0x21, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, -/* 0000B6F0 */ 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, -/* 0000B700 */ 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x61, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, -/* 0000B710 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x78, -/* 0000B720 */ 0x02, 0x00, 0xFE, 0xB1, 0xE9, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, -/* 0000B730 */ 0x84, 0x00, 0x1E, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x69, 0x00, 0x1E, 0x00, 0x84, 0x00, 0x09, 0x00, -/* 0000B740 */ 0x37, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0xA2, 0x03, 0xFE, 0xB8, 0x04, -/* 0000B750 */ 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, 0x3C, 0x00, 0xFE, 0xB4, 0xE4, 0x01, 0xFF, 0x00, 0x10, 0x01, -/* 0000B760 */ 0x00, 0x01, 0x01, 0xFE, 0xB4, 0xE4, 0xFE, 0x08, 0x04, 0xFE, 0x08, 0x04, 0x02, 0x06, 0x07, 0x0B, -/* 0000B770 */ 0x05, 0x40, 0x40, 0x04, 0x07, 0x03, 0x03, 0x03, 0x03, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, -/* 0000B780 */ 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B790 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xE5, 0x03, 0x02, 0x01, 0xFE, 0x01, -/* 0000B7A0 */ 0x03, 0x03, 0x04, 0xFE, 0x10, 0x01, 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x2C, 0x0B, 0x07, 0x15, 0x03, -/* 0000B7B0 */ 0x00, 0x0B, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, -/* 0000B7C0 */ 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, -/* 0000B7D0 */ 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, -/* 0000B7E0 */ 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x96, -/* 0000B7F0 */ 0x02, 0x00, 0x00, 0x00, 0x0B, 0x92, 0x02, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0x0C, 0x14, 0x14, 0x00, -/* 0000B800 */ 0x0B, 0x0C, 0x09, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x61, 0x0B, 0x0B, 0x02, 0x0F, -/* 0000B810 */ 0x21, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, -/* 0000B820 */ 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, -/* 0000B830 */ 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x03, -/* 0000B840 */ 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0x0B, 0x0B, -/* 0000B850 */ 0x96, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, -/* 0000B860 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0C, -/* 0000B870 */ 0x5C, 0x01, 0x0C, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x02, 0x0C, -/* 0000B880 */ 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0xFF, 0x0B, 0x8E, 0x04, 0x00, -/* 0000B890 */ 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x92, 0x03, 0x00, -/* 0000B8A0 */ 0x00, 0x00, 0x0C, 0x5C, 0x01, 0x0C, 0xCB, 0x0C, 0x5C, 0x02, 0x0C, 0x1F, 0x03, 0x00, 0x0B, 0x09, -/* 0000B8B0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, -/* 0000B8C0 */ 0x02, 0xFE, 0xE6, 0x03, 0xFE, 0x1D, 0x02, 0x00, 0xFE, 0xE9, 0xE4, 0x09, 0x05, 0x00, 0x00, 0x00, -/* 0000B8D0 */ 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x8C, 0x00, 0x21, 0x00, 0x4B, 0x00, 0x21, 0x00, 0x69, 0x00, -/* 0000B8E0 */ 0x1E, 0x00, 0x8D, 0x00, 0x22, 0x00, 0x47, 0x00, 0x37, 0x00, 0x44, 0x01, 0x27, 0x00, 0x3E, 0x00, -/* 0000B8F0 */ 0x00, 0xF5, 0xB8, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B900 */ 0xFF, 0xFE, 0xC3, 0x04, 0x48, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x3D, 0x00, 0xFE, 0x69, 0xE7, 0xFF, -/* 0000B910 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x69, 0xE7, 0xF8, 0xF8, 0x41, 0x05, 0x04, 0x06, 0x0D, -/* 0000B920 */ 0x0D, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B930 */ 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B940 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xE7, 0x03, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x3E, 0x8E, -/* 0000B950 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x2F, 0x07, 0x02, 0x04, 0x2D, 0x06, 0x06, -/* 0000B960 */ 0x07, 0x15, 0x03, 0x00, 0x06, 0x03, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, -/* 0000B970 */ 0x00, 0x00, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x2F, 0x08, 0x02, -/* 0000B980 */ 0x04, 0x97, 0x07, 0x07, 0x08, 0x9C, 0x07, 0x06, 0x04, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 0000B990 */ 0xFE, 0x99, 0xE7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x5A, 0x00, 0x22, 0x00, 0x6D, 0x00, -/* 0000B9A0 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xD8, 0x03, 0xFE, 0x9C, 0x04, 0x10, 0xFF, -/* 0000B9B0 */ 0xA3, 0x41, 0xC1, 0x00, 0x3B, 0x00, 0xFE, 0xD8, 0xDD, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 0000B9C0 */ 0xFE, 0xD8, 0xDD, 0xFE, 0xE3, 0x02, 0xFE, 0xE3, 0x02, 0x01, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, -/* 0000B9D0 */ 0x04, 0x03, 0x05, 0x05, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B9E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000B9F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xE4, -/* 0000BA00 */ 0x03, 0x02, 0x01, 0xFE, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0xED, 0x5B, 0x08, 0xB3, -/* 0000BA10 */ 0x08, 0x08, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, -/* 0000BA20 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x07, 0x0B, -/* 0000BA30 */ 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, -/* 0000BA40 */ 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, -/* 0000BA50 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000BA60 */ 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, -/* 0000BA70 */ 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, -/* 0000BA80 */ 0x00, 0x61, 0x0B, 0x09, 0x03, 0x0F, 0x21, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x00, 0x00, -/* 0000BA90 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, -/* 0000BAA0 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x11, -/* 0000BAB0 */ 0x00, 0x00, 0x00, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, -/* 0000BAC0 */ 0x00, 0x00, 0x00, 0x0D, 0x6C, 0x0C, 0x0D, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0D, 0x2A, 0x0E, -/* 0000BAD0 */ 0x05, 0x14, 0x03, 0x00, 0x07, 0x0E, 0x09, 0x06, 0x00, 0x47, 0x0E, 0x05, 0x09, 0x03, 0x00, 0x47, -/* 0000BAE0 */ 0x0E, 0x07, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x09, 0x1F, 0x03, 0x0C, 0x0C, 0x5C, 0x01, 0x0C, 0x1F, -/* 0000BAF0 */ 0x02, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5C, 0x02, 0xFE, -/* 0000BB00 */ 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x2D, 0x02, 0x00, 0xFE, 0x01, 0xDE, 0x08, -/* 0000BB10 */ 0x05, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x2F, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x7C, 0x00, -/* 0000BB20 */ 0x1E, 0x00, 0x47, 0x00, 0x15, 0x00, 0x65, 0x00, 0x1E, 0x00, 0xD4, 0x00, 0x4E, 0x00, 0x56, 0x00, -/* 0000BB30 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x01, 0x03, 0xFE, 0x78, 0x04, 0x10, 0xFF, -/* 0000BB40 */ 0xA1, 0x41, 0xE1, 0x00, 0x3A, 0x00, 0xFE, 0x52, 0xD7, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 0000BB50 */ 0xFE, 0x52, 0xD7, 0xFE, 0x2E, 0x06, 0xFE, 0x2E, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x6B, 0x62, -/* 0000BB60 */ 0x04, 0x09, 0x08, 0x07, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BB70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BB80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -/* 0000BB90 */ 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x01, 0x03, 0xFE, 0x9D, 0x01, -/* 0000BBA0 */ 0xAE, 0x0A, 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x4F, 0x0C, 0x4F, 0x0D, 0xA8, -/* 0000BBB0 */ 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x61, 0x0F, 0x0A, 0x00, 0x10, 0x03, 0x00, -/* 0000BBC0 */ 0x0F, 0x03, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x04, 0x47, 0x08, 0x0F, 0x61, 0x0F, 0x0A, 0x00, -/* 0000BBD0 */ 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x03, 0x47, 0x09, 0x0F, 0x6A, -/* 0000BBE0 */ 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, 0xA8, 0x0F, 0x14, -/* 0000BBF0 */ 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x1C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000BC00 */ 0x0F, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC2, 0x03, 0x00, 0x0F, -/* 0000BC10 */ 0x09, 0x28, 0x01, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, -/* 0000BC20 */ 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0C, -/* 0000BC30 */ 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000BC40 */ 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x0F, 0x1E, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8E, -/* 0000BC50 */ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, -/* 0000BC60 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0xFF, 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, -/* 0000BC70 */ 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, -/* 0000BC80 */ 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0D, 0x0F, 0x09, -/* 0000BC90 */ 0x3D, 0x00, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x03, 0x00, 0x5C, -/* 0000BCA0 */ 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0F, 0x0F, 0x47, 0x0D, -/* 0000BCB0 */ 0x0F, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x04, 0x07, -/* 0000BCC0 */ 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0x1F, 0x03, 0xFF, 0x0F, 0x8E, -/* 0000BCD0 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000BCE0 */ 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x0F, 0x47, 0x0F, -/* 0000BCF0 */ 0x0D, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000BD00 */ 0x06, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x8E, 0x01, -/* 0000BD10 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0C, -/* 0000BD20 */ 0x1F, 0x04, 0x10, 0x10, 0x76, 0x10, 0x0F, 0x05, 0x61, 0x0F, 0x0D, 0x06, 0x82, 0x0F, 0x0F, 0x28, -/* 0000BD30 */ 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, -/* 0000BD40 */ 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x78, 0x02, 0xFE, -/* 0000BD50 */ 0x78, 0x02, 0xDB, 0x00, 0xFE, 0xCF, 0xD8, 0x14, 0x0F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0x00, -/* 0000BD60 */ 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, 0x00, -/* 0000BD70 */ 0x07, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x1C, 0x00, 0x56, 0x00, 0x1E, 0x00, 0x38, 0x00, -/* 0000BD80 */ 0x1E, 0x00, 0x38, 0x00, 0x1B, 0x00, 0x9B, 0x00, 0x1E, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, -/* 0000BD90 */ 0x1F, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x58, 0x00, 0x1F, 0x00, 0x4D, 0x00, 0x3A, 0x00, 0x65, 0x00, -/* 0000BDA0 */ 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x1F, 0xFC, 0x07, -/* 0000BDB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x6A, 0x04, 0x62, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x39, 0x00, -/* 0000BDC0 */ 0xFE, 0xCF, 0xD4, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xCF, 0xD4, 0xFE, 0x44, 0x02, -/* 0000BDD0 */ 0xFE, 0x44, 0x02, 0x03, 0x09, 0x09, 0x0E, 0x07, 0x40, 0x3C, 0x03, 0x06, 0x03, 0x03, 0x03, 0x03, -/* 0000BDE0 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BDF0 */ 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000BE00 */ 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0x5A, 0x03, 0x02, 0x00, 0xFE, 0xCB, 0x03, 0x02, 0x01, 0xFE, -/* 0000BE10 */ 0xCA, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFA, 0xAE, 0x0B, -/* 0000BE20 */ 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x2C, 0x0E, 0x09, 0x15, 0x03, 0x00, 0x0E, 0x03, 0x09, 0x34, 0x00, -/* 0000BE30 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, 0xE1, 0x0E, 0x09, 0x0E, 0x00, 0x0F, -/* 0000BE40 */ 0x21, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, -/* 0000BE50 */ 0x6C, 0x0E, 0x0F, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, -/* 0000BE60 */ 0x1F, 0x03, 0xFF, 0x0E, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x03, -/* 0000BE70 */ 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0E, 0x0E, -/* 0000BE80 */ 0x47, 0x0A, 0x0E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x4B, 0x0E, 0x07, -/* 0000BE90 */ 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0A, 0x97, 0x0F, 0x0B, 0x07, 0x5C, 0x02, 0x0F, 0x97, -/* 0000BEA0 */ 0x0F, 0x0B, 0x08, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0xFF, 0x0E, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, -/* 0000BEB0 */ 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, -/* 0000BEC0 */ 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x0C, 0x0E, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, -/* 0000BED0 */ 0x00, 0x0E, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000BEE0 */ 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x2A, 0x11, 0x07, 0x14, -/* 0000BEF0 */ 0x03, 0x00, 0x0C, 0x11, 0x09, 0x06, 0x00, 0x47, 0x11, 0x07, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0C, -/* 0000BF00 */ 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x1F, 0x03, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x00, -/* 0000BF10 */ 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x5C, 0x02, -/* 0000BF20 */ 0xFE, 0x2D, 0x02, 0x00, 0xFE, 0xED, 0xD4, 0x07, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x53, 0x00, -/* 0000BF30 */ 0x1E, 0x00, 0x70, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x27, 0x00, 0x52, 0x00, 0x1E, 0x00, 0x85, 0x00, -/* 0000BF40 */ 0x4E, 0x00, 0x51, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0xDC, 0x03, 0xFE, -/* 0000BF50 */ 0xE2, 0x03, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x38, 0x00, 0xFE, 0x98, 0xB8, 0xFF, 0x00, 0x10, -/* 0000BF60 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0x98, 0xB8, 0xFE, 0xD3, 0x1B, 0xFE, 0xD3, 0x1B, 0x45, 0x18, 0x23, -/* 0000BF70 */ 0x37, 0x07, 0xFE, 0x9B, 0x01, 0xFE, 0x7B, 0x01, 0x03, 0x13, 0x25, 0x25, 0x25, 0x25, 0x01, 0xFF, -/* 0000BF80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x36, 0xFF, -/* 0000BF90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, -/* 0000BFA0 */ 0x03, 0x02, 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x01, 0x03, 0x08, 0x02, 0x01, 0xFE, -/* 0000BFB0 */ 0x5E, 0x03, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, -/* 0000BFC0 */ 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x00, 0xFE, 0xCF, 0x03, 0x02, 0x00, 0xFE, 0xDD, -/* 0000BFD0 */ 0x03, 0x02, 0x00, 0xFE, 0xDE, 0x03, 0x02, 0x00, 0xFE, 0xD0, 0x03, 0x02, 0x00, 0xFE, 0xD1, 0x03, -/* 0000BFE0 */ 0x02, 0x00, 0xFE, 0xDF, 0x03, 0x02, 0x01, 0xFE, 0xE0, 0x03, 0x02, 0x01, 0xFE, 0xE4, 0x02, 0x02, -/* 0000BFF0 */ 0x00, 0xFE, 0xD2, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x15, 0x00, 0x00, 0x00, 0x02, 0x01, -/* 0000C000 */ 0xFE, 0xD5, 0x03, 0x02, 0x01, 0xFE, 0xD6, 0x03, 0x02, 0x00, 0xFE, 0xD7, 0x03, 0x02, 0x01, 0xFE, -/* 0000C010 */ 0x58, 0x03, 0x02, 0x00, 0xFE, 0xE1, 0x03, 0x02, 0x00, 0xFE, 0xD3, 0x03, 0x01, 0x00, 0x00, 0x00, -/* 0000C020 */ 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xD4, 0x03, -/* 0000C030 */ 0x02, 0x00, 0xFE, 0xE2, 0x03, 0xFE, 0x5F, 0x06, 0x2C, 0x38, 0x23, 0x0D, 0x03, 0x00, 0x38, 0x02, -/* 0000C040 */ 0x09, 0x18, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, -/* 0000C050 */ 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000C060 */ 0x0C, 0x00, 0x00, 0x00, 0x38, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000C070 */ 0x19, 0x00, 0x00, 0x00, 0x39, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x23, 0x5C, 0x03, 0x03, 0x1F, 0x04, -/* 0000C080 */ 0x38, 0x38, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x29, 0x00, 0x61, 0x38, 0x23, 0x01, 0x0F, 0x03, 0x00, -/* 0000C090 */ 0x38, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, -/* 0000C0A0 */ 0x39, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, -/* 0000C0B0 */ 0xFF, 0x38, 0x76, 0x06, 0x23, 0x03, 0x2C, 0x38, 0x25, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x22, -/* 0000C0C0 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x00, -/* 0000C0D0 */ 0x04, 0xCB, 0x39, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x25, 0x38, -/* 0000C0E0 */ 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, -/* 0000C0F0 */ 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x25, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x25, -/* 0000C100 */ 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000C110 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x02, 0xA1, 0x00, 0x0B, -/* 0000C120 */ 0x39, 0xA1, 0x01, 0x0C, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x38, 0x38, 0x47, -/* 0000C130 */ 0x28, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, -/* 0000C140 */ 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x03, 0xA1, 0x00, -/* 0000C150 */ 0x0E, 0x39, 0xA1, 0x01, 0x0F, 0x39, 0xA1, 0x02, 0x10, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0E, -/* 0000C160 */ 0x1F, 0x06, 0x38, 0x38, 0x47, 0x29, 0x38, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000C170 */ 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x05, 0x47, 0x2A, 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, 0x09, -/* 0000C180 */ 0x16, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, 0x61, 0x38, -/* 0000C190 */ 0x38, 0x06, 0x47, 0x2A, 0x38, 0x09, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x13, 0x00, -/* 0000C1A0 */ 0x8E, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x07, -/* 0000C1B0 */ 0x47, 0x2A, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, -/* 0000C1C0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xA8, 0x39, 0x5C, 0x04, -/* 0000C1D0 */ 0x39, 0xA8, 0x39, 0x5C, 0x05, 0x39, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2B, 0x38, 0x8E, 0x03, 0x00, -/* 0000C1E0 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, -/* 0000C1F0 */ 0x5C, 0x02, 0x11, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x03, 0xA1, 0x00, 0x12, 0x39, 0xA1, 0x01, 0x13, -/* 0000C200 */ 0x39, 0xA1, 0x02, 0x14, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x13, 0x1F, 0x06, 0x38, 0x38, 0x47, -/* 0000C210 */ 0x2C, 0x38, 0xA8, 0x38, 0x47, 0x2D, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000C220 */ 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, -/* 0000C230 */ 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2E, 0x38, 0xA8, 0x38, 0x47, -/* 0000C240 */ 0x2F, 0x38, 0xA8, 0x38, 0x47, 0x30, 0x38, 0xA8, 0x38, 0x47, 0x31, 0x38, 0x61, 0x38, 0x25, 0x08, -/* 0000C250 */ 0x47, 0x32, 0x38, 0x61, 0x38, 0x25, 0x09, 0x47, 0x33, 0x38, 0x2C, 0x38, 0x32, 0x15, 0x0E, 0x00, -/* 0000C260 */ 0x38, 0x07, 0x09, 0x00, 0x00, 0x2C, 0x38, 0x33, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x4C, 0x00, -/* 0000C270 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, -/* 0000C280 */ 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0x1F, -/* 0000C290 */ 0x06, 0x38, 0x38, 0x47, 0x32, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, -/* 0000C2A0 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x19, 0x5C, 0x03, 0x32, 0x5C, -/* 0000C2B0 */ 0x04, 0x17, 0x5C, 0x05, 0x17, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x33, 0x38, 0x8E, 0x03, 0x00, 0x00, -/* 0000C2C0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, -/* 0000C2D0 */ 0x02, 0x1A, 0x5C, 0x03, 0x1B, 0xA8, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x06, 0x1F, 0x06, 0x38, -/* 0000C2E0 */ 0x38, 0x47, 0x34, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, -/* 0000C2F0 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x24, 0x38, 0x8E, 0x03, -/* 0000C300 */ 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x38, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000C310 */ 0x24, 0x5C, 0x02, 0x28, 0xCD, 0x39, 0x01, 0xA1, 0x00, 0x1C, 0x39, 0x5C, 0x03, 0x39, 0x8E, 0x03, -/* 0000C320 */ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x39, 0x5C, 0x04, 0x39, 0x1F, 0x05, 0x38, 0x38, 0x47, -/* 0000C330 */ 0x35, 0x38, 0x2C, 0x38, 0x2B, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x50, 0x00, 0x8E, 0x03, 0x00, -/* 0000C340 */ 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, -/* 0000C350 */ 0x1F, 0x02, 0x38, 0x38, 0x0F, 0x35, 0x00, 0x38, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000C360 */ 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8E, -/* 0000C370 */ 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000C380 */ 0x01, 0x2B, 0x1F, 0x02, 0x3A, 0x3A, 0x5C, 0x01, 0x3A, 0x1F, 0x02, 0xFF, 0x38, 0x14, 0x03, 0x00, -/* 0000C390 */ 0x29, 0x10, 0x09, 0x06, 0x01, 0x2C, 0x38, 0x2B, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x18, 0x00, -/* 0000C3A0 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, 0x0B, 0x07, 0x01, -/* 0000C3B0 */ 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -/* 0000C3C0 */ 0x00, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, -/* 0000C3D0 */ 0x00, 0x39, 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x2B, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x2B, 0x38, 0xE5, -/* 0000C3E0 */ 0x22, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, 0x0C, -/* 0000C3F0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2B, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x2D, 0x38, -/* 0000C400 */ 0xE9, 0x09, 0x4D, 0x00, 0xE7, 0x26, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, -/* 0000C410 */ 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x1F, 0x02, 0xFF, 0x38, 0x8E, 0x03, -/* 0000C420 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, 0x0A, 0x07, 0x02, 0x00, 0x5C, -/* 0000C430 */ 0x00, 0x39, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3A, 0x07, 0x02, 0x00, 0x5C, -/* 0000C440 */ 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x1F, 0x02, 0x3A, 0x3A, 0x5C, 0x01, 0x3A, 0x1F, 0x02, 0xFF, 0x38, -/* 0000C450 */ 0xE9, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000C460 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x2D, -/* 0000C470 */ 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2F, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, -/* 0000C480 */ 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2D, 0x5C, 0x02, -/* 0000C490 */ 0x2F, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x31, 0x38, 0x09, 0x7D, 0x00, 0xA8, 0x38, 0x47, 0x2B, 0x38, -/* 0000C4A0 */ 0xA8, 0x38, 0x47, 0x2C, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x07, -/* 0000C4B0 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, 0x03, 0x1E, 0x5C, 0x04, -/* 0000C4C0 */ 0x1F, 0x5C, 0x05, 0x1E, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2F, 0x38, 0x14, 0x03, 0x00, 0x29, 0x0F, -/* 0000C4D0 */ 0x09, 0x24, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x39, 0x6C, 0x38, 0x39, -/* 0000C4E0 */ 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, 0x1E, 0x1F, 0x03, 0x38, -/* 0000C4F0 */ 0x38, 0x47, 0x31, 0x38, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, -/* 0000C500 */ 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, -/* 0000C510 */ 0x20, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x31, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 0000C520 */ 0x00, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x21, 0x5C, 0x03, -/* 0000C530 */ 0x2F, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x31, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x30, 0x38, 0x76, 0x28, -/* 0000C540 */ 0x23, 0x0E, 0x61, 0x38, 0x35, 0x0F, 0x76, 0x38, 0x23, 0x10, 0x76, 0x29, 0x23, 0x11, 0xA8, 0x38, -/* 0000C550 */ 0x15, 0x03, 0x00, 0x2B, 0x38, 0x09, 0x04, 0x00, 0x76, 0x2B, 0x23, 0x12, 0xA8, 0x38, 0x15, 0x03, -/* 0000C560 */ 0x00, 0x2C, 0x38, 0x09, 0x72, 0x00, 0x76, 0x2C, 0x23, 0x13, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x04, -/* 0000C570 */ 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x14, 0x76, 0x38, 0x23, 0x15, 0x14, 0x03, -/* 0000C580 */ 0x00, 0x2C, 0x13, 0x09, 0x17, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, -/* 0000C590 */ 0x4B, 0x38, 0x61, 0x38, 0x38, 0x16, 0x76, 0x38, 0x23, 0x15, 0x09, 0x3B, 0x00, 0x14, 0x03, 0x00, -/* 0000C5A0 */ 0x2C, 0x12, 0x09, 0x17, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x4B, -/* 0000C5B0 */ 0x38, 0x61, 0x38, 0x38, 0x17, 0x76, 0x38, 0x23, 0x15, 0x09, 0x1C, 0x00, 0x14, 0x03, 0x00, 0x2C, -/* 0000C5C0 */ 0x14, 0x09, 0x14, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, -/* 0000C5D0 */ 0x61, 0x38, 0x38, 0x18, 0x76, 0x38, 0x23, 0x15, 0x76, 0x2E, 0x23, 0x19, 0x76, 0x2F, 0x23, 0x1A, -/* 0000C5E0 */ 0x76, 0x30, 0x23, 0x1B, 0xA8, 0x38, 0x15, 0x03, 0x00, 0x33, 0x38, 0x09, 0x08, 0x00, 0x76, 0x32, -/* 0000C5F0 */ 0x23, 0x1C, 0x76, 0x33, 0x23, 0x1D, 0x76, 0x2A, 0x23, 0x1E, 0x76, 0x34, 0x23, 0x1F, 0xE5, 0x1D, -/* 0000C600 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x38, 0x4B, 0x38, 0x07, 0x02, 0x00, -/* 0000C610 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x23, 0x1F, 0x02, 0xFF, 0x38, 0xE9, 0x09, 0x33, 0x00, 0xE7, 0x27, -/* 0000C620 */ 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000C630 */ 0x04, 0x5C, 0x01, 0x27, 0x1F, 0x02, 0xFF, 0x38, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000C640 */ 0x00, 0x39, 0x6C, 0x38, 0x39, 0x20, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, -/* 0000C650 */ 0xE9, 0x61, 0x38, 0x23, 0x21, 0x0F, 0x07, 0x00, 0x38, 0x09, 0x00, 0x00, 0x76, 0x22, 0x23, 0x22, -/* 0000C660 */ 0x47, 0x38, 0x23, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x39, 0x07, 0x03, 0x00, -/* 0000C670 */ 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x3A, 0x5C, 0x01, 0x3A, -/* 0000C680 */ 0x61, 0x3A, 0x23, 0x21, 0x5C, 0x02, 0x3A, 0x1F, 0x03, 0x39, 0x39, 0x76, 0x39, 0x38, 0x23, 0x76, -/* 0000C690 */ 0x06, 0x23, 0x24, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0xFE, 0x6A, 0x02, 0xFE, -/* 0000C6A0 */ 0x65, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x52, 0x03, 0xFE, 0xC3, 0x03, 0xFE, 0xC4, 0x03, 0xFE, 0xC5, -/* 0000C6B0 */ 0x03, 0xFE, 0x0E, 0x02, 0xFE, 0x0F, 0x02, 0xFE, 0x68, 0x02, 0xFE, 0x69, 0x02, 0xFE, 0x30, 0x02, -/* 0000C6C0 */ 0xFE, 0x1E, 0x01, 0xFE, 0xE3, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x7A, 0x02, 0xFE, -/* 0000C6D0 */ 0x14, 0x02, 0xFE, 0x15, 0x02, 0xFE, 0xC2, 0x03, 0xFE, 0x16, 0x02, 0xFE, 0xC7, 0x03, 0xFE, 0xC8, -/* 0000C6E0 */ 0x03, 0xFE, 0xC9, 0x03, 0xFE, 0x0B, 0x02, 0xFE, 0x09, 0x02, 0xFE, 0x0A, 0x02, 0xFE, 0x0C, 0x02, -/* 0000C6F0 */ 0xFE, 0x0D, 0x02, 0xFE, 0x13, 0x02, 0xFE, 0x11, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x12, 0x02, 0xFE, -/* 0000C700 */ 0x12, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x6B, 0x02, 0x00, 0xFE, 0xED, 0xB8, 0x50, 0x00, 0x00, 0x00, -/* 0000C710 */ 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x18, 0x00, 0x3F, 0x00, 0x39, 0x00, 0x9B, 0x00, 0x1E, 0x00, 0x6D, -/* 0000C720 */ 0x00, 0x04, 0x00, 0x61, 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x49, -/* 0000C730 */ 0x00, 0x31, 0x00, 0x71, 0x00, 0x35, 0x00, 0x73, 0x00, 0x13, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x2F, -/* 0000C740 */ 0x00, 0x16, 0x00, 0x43, 0x00, 0x08, 0x00, 0x30, 0x00, 0x13, 0x00, 0x50, 0x00, 0x2A, 0x00, 0x5F, -/* 0000C750 */ 0x00, 0x35, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x31, 0x00, 0x26, 0x00, 0x67, 0x00, 0x05, 0x00, 0x37, -/* 0000C760 */ 0x00, 0x05, 0x00, 0x37, 0x00, 0x05, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x51, 0x00, 0x07, 0x00, 0x52, -/* 0000C770 */ 0x00, 0x16, 0x00, 0x7E, 0x00, 0x26, 0x00, 0x6F, 0x00, 0x26, 0x00, 0x96, 0x00, 0x28, 0x00, 0x9A, -/* 0000C780 */ 0x00, 0x1A, 0x00, 0x41, 0x00, 0x34, 0x00, 0xA2, 0x00, 0x29, 0x00, 0x62, 0x00, 0x32, 0x00, 0x58, -/* 0000C790 */ 0x00, 0x08, 0x00, 0x30, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x18, 0x00, 0x4F, 0x00, 0x2A, 0x00, 0x74, -/* 0000C7A0 */ 0x00, 0x24, 0x00, 0x4A, 0x00, 0x01, 0x00, 0x24, 0x00, 0x17, 0x00, 0x2E, 0x00, 0x33, 0x00, 0x5F, -/* 0000C7B0 */ 0x00, 0x26, 0x00, 0x76, 0x00, 0x24, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x2A, 0x00, 0x05, 0x00, 0x31, -/* 0000C7C0 */ 0x00, 0x26, 0x00, 0x69, 0x00, 0x08, 0x00, 0x33, 0x00, 0x24, 0x00, 0x78, 0x00, 0x21, 0x00, 0x7B, -/* 0000C7D0 */ 0x00, 0x26, 0x00, 0xC6, 0x00, 0x04, 0x00, 0x38, 0x00, 0x08, 0x00, 0x43, 0x00, 0x04, 0x00, 0x2F, -/* 0000C7E0 */ 0x00, 0x0A, 0x00, 0x32, 0x00, 0x04, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x04, 0x00, 0x46, -/* 0000C7F0 */ 0x00, 0x14, 0x00, 0x5F, 0x00, 0x08, 0x00, 0x3C, 0x00, 0x17, 0x00, 0x65, 0x00, 0x08, 0x00, 0x3A, -/* 0000C800 */ 0x00, 0x17, 0x00, 0x63, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x14, 0x00, 0x81, 0x00, 0x04, 0x00, 0x4C, -/* 0000C810 */ 0x00, 0x04, 0x00, 0x4E, 0x00, 0x04, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x04, 0x00, 0x58, -/* 0000C820 */ 0x00, 0x04, 0x00, 0x67, 0x00, 0x04, 0x00, 0x40, 0x00, 0x07, 0x00, 0xA9, 0x00, 0x1F, 0x00, 0x43, -/* 0000C830 */ 0x00, 0x01, 0x00, 0x20, 0x00, 0x17, 0x00, 0x6B, 0x01, 0x19, 0x00, 0x4A, 0x00, 0x0B, 0x00, 0x4B, -/* 0000C840 */ 0x00, 0x04, 0x00, 0x70, 0x00, 0x2F, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x00, 0x3F, 0xFC, -/* 0000C850 */ 0x02, 0x04, 0x4F, 0xFD, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE5, 0x02, 0x14, 0xFF, 0xA0, -/* 0000C860 */ 0x41, 0xD1, 0x00, 0x2F, 0x00, 0xFE, 0x7F, 0x83, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 0000C870 */ 0xFE, 0x7F, 0x83, 0xFE, 0x7D, 0x30, 0xFE, 0x7D, 0x30, 0x0B, 0x17, 0x1B, 0x09, 0x9A, 0x9A, 0x01, -/* 0000C880 */ 0x09, 0x07, 0x07, 0x07, 0x07, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000C890 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0xFF, 0xFF, 0xFF, -/* 0000C8A0 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xFC, 0x02, 0x02, 0x01, 0xFE, 0x9C, 0x03, 0x02, 0x00, -/* 0000C8B0 */ 0xFE, 0x9D, 0x03, 0x04, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x9E, 0x03, 0x02, 0x00, -/* 0000C8C0 */ 0xFE, 0x9F, 0x03, 0x02, 0x01, 0xFE, 0xE6, 0x02, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, -/* 0000C8D0 */ 0xFE, 0x02, 0x08, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x03, 0x02, 0x01, 0xFE, 0xA0, 0x03, 0x09, 0x02, -/* 0000C8E0 */ 0x01, 0xFE, 0xFF, 0x02, 0x02, 0x01, 0xFE, 0xA1, 0x03, 0x02, 0x01, 0xFE, 0xA2, 0x03, 0x02, 0x01, -/* 0000C8F0 */ 0xFE, 0xA3, 0x03, 0x02, 0x01, 0xFE, 0xA4, 0x03, 0x02, 0x00, 0xFE, 0xA5, 0x03, 0xFE, 0x26, 0x03, -/* 0000C900 */ 0xA8, 0x17, 0xA8, 0x18, 0xA8, 0x19, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1D, -/* 0000C910 */ 0x14, 0x15, 0x00, 0x1D, 0x02, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, -/* 0000C920 */ 0x00, 0x1D, 0x14, 0x03, 0x00, 0x1D, 0x03, 0x09, 0xF3, 0x02, 0xDE, 0x00, 0x03, 0x01, 0xB8, 0x1D, -/* 0000C930 */ 0x00, 0x01, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x17, 0x1D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x02, -/* 0000C940 */ 0x00, 0x00, 0x00, 0x17, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x6C, 0x1D, -/* 0000C950 */ 0x1E, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, -/* 0000C960 */ 0x00, 0x1F, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x04, 0xB8, 0x21, 0x00, 0x01, 0x50, -/* 0000C970 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0x21, 0x5C, 0x02, 0x20, 0x1F, 0x03, 0x1F, 0x1F, 0x5C, 0x01, -/* 0000C980 */ 0x1F, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, -/* 0000C990 */ 0x00, 0x1D, 0x14, 0x03, 0x00, 0x1D, 0x02, 0x09, 0x83, 0x02, 0xDE, 0x01, 0x04, 0x02, 0xB8, 0x1D, -/* 0000C9A0 */ 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x1D, 0x1D, 0x01, 0x50, 0x01, 0x02, 0x00, 0x00, 0x00, 0x18, -/* 0000C9B0 */ 0x1D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x01, 0x50, 0x01, 0x03, 0x00, -/* 0000C9C0 */ 0x00, 0x00, 0x19, 0x1D, 0x95, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x19, 0x8E, 0x01, -/* 0000C9D0 */ 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, -/* 0000C9E0 */ 0x07, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x5C, 0x02, 0x1E, 0x1F, 0x03, -/* 0000C9F0 */ 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x03, 0x00, 0x5C, -/* 0000CA00 */ 0x00, 0x05, 0x5C, 0x01, 0x08, 0x90, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x5C, -/* 0000CA10 */ 0x02, 0x1E, 0x1F, 0x03, 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, -/* 0000CA20 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, -/* 0000CA30 */ 0x5C, 0x01, 0x1E, 0x5C, 0x02, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, -/* 0000CA40 */ 0x00, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x1F, 0x4B, 0x1F, 0x7A, -/* 0000CA50 */ 0x1F, 0x1E, 0x01, 0x7A, 0x0C, 0x1E, 0x02, 0x7A, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0x1F, 0x04, -/* 0000CA60 */ 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x04, 0x00, 0x5C, -/* 0000CA70 */ 0x00, 0x05, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x5C, 0x01, 0x1E, 0x5C, -/* 0000CA80 */ 0x02, 0x0F, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x90, -/* 0000CA90 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x1F, 0x1F, -/* 0000CAA0 */ 0x7A, 0x1F, 0x1E, 0x01, 0x7A, 0x10, 0x1E, 0x02, 0x7A, 0x10, 0x1E, 0x04, 0x7A, 0x10, 0x1E, 0x03, -/* 0000CAB0 */ 0x5C, 0x03, 0x1E, 0x1F, 0x04, 0xFF, 0x1D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -/* 0000CAC0 */ 0x1D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -/* 0000CAD0 */ 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, -/* 0000CAE0 */ 0x00, 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x02, 0x1E, 0x1F, 0x03, 0xFF, 0x1D, 0x8E, 0x01, 0x00, -/* 0000CAF0 */ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x00, -/* 0000CB00 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, 0x5C, 0x02, -/* 0000CB10 */ 0x12, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x90, 0x01, -/* 0000CB20 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x7A, 0x1F, 0x1E, 0x01, 0x7A, 0x0C, 0x1E, 0x02, -/* 0000CB30 */ 0x7A, 0x10, 0x1E, 0x04, 0x7A, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0x1F, 0x04, 0xFF, 0x1D, 0x8E, -/* 0000CB40 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, -/* 0000CB50 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, -/* 0000CB60 */ 0x5C, 0x02, 0x13, 0xCC, 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, -/* 0000CB70 */ 0xB8, 0x20, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x20, 0x20, 0x01, 0x50, 0x01, 0x04, 0x00, 0x00, -/* 0000CB80 */ 0x00, 0x1F, 0x20, 0x7A, 0x1F, 0x1E, 0x01, 0x01, 0x64, 0x01, 0x1F, 0x1E, 0x7A, 0x0C, 0x1E, 0x02, -/* 0000CB90 */ 0x7A, 0x10, 0x1E, 0x04, 0x7A, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0x1F, 0x04, 0xFF, 0x1D, 0x8E, -/* 0000CBA0 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, -/* 0000CBB0 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x61, 0x1E, 0x1E, 0x05, 0x5C, 0x01, 0x1E, -/* 0000CBC0 */ 0x5C, 0x02, 0x14, 0xCC, 0x5C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, -/* 0000CBD0 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, -/* 0000CBE0 */ 0x5C, 0x01, 0x16, 0xB8, 0x21, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x21, 0x21, 0x01, 0x50, 0x01, -/* 0000CBF0 */ 0x05, 0x00, 0x00, 0x00, 0x20, 0x21, 0x5C, 0x02, 0x20, 0x1F, 0x03, 0x1F, 0x1F, 0x7A, 0x1F, 0x1E, -/* 0000CC00 */ 0x06, 0x7A, 0x10, 0x1E, 0x04, 0x7A, 0x0C, 0x1E, 0x03, 0x5C, 0x03, 0x1E, 0x1F, 0x04, 0xFF, 0x1D, -/* 0000CC10 */ 0x90, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, -/* 0000CC20 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x05, 0x70, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, -/* 0000CC30 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, -/* 0000CC40 */ 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, -/* 0000CC50 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, -/* 0000CC60 */ 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, -/* 0000CC70 */ 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, -/* 0000CC80 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, -/* 0000CC90 */ 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000CCA0 */ 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x32, -/* 0000CCB0 */ 0x02, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, 0xFE, 0x45, 0x01, -/* 0000CCC0 */ 0xFE, 0xB5, 0x01, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xA6, 0x03, 0x02, 0x02, 0x00, 0xFE, 0x19, 0x02, -/* 0000CCD0 */ 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x96, 0x83, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x14, 0x17, -/* 0000CCE0 */ 0x44, 0x00, 0xF9, 0x03, 0x46, 0x00, 0x8A, 0x06, 0x24, 0x00, 0x43, 0x03, 0x24, 0x00, 0x50, 0x00, -/* 0000CCF0 */ 0x4C, 0x00, 0x93, 0x00, 0x55, 0x00, 0x91, 0x00, 0x36, 0x00, 0x45, 0x00, 0x52, 0x00, 0x96, 0x00, -/* 0000CD00 */ 0x60, 0x00, 0xA7, 0x05, 0x71, 0x00, 0x03, 0x03, 0x0D, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x16, 0x00, -/* 0000CD10 */ 0x00, 0x34, 0xD6, 0x00, 0x00, 0x4A, 0xD4, 0x00, 0x00, 0xDA, 0xD1, 0x00, 0x00, 0x22, 0xD0, 0x00, -/* 0000CD20 */ 0x00, 0x4B, 0xCE, 0x00, 0x00, 0x29, 0xCD, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, -/* 0000CD30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0x03, 0x3A, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x36, 0x00, -/* 0000CD40 */ 0xFE, 0xD6, 0xB0, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD6, 0xB0, 0xFE, 0x45, 0x02, -/* 0000CD50 */ 0xFE, 0x45, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, -/* 0000CD60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, -/* 0000CD70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 0000CD80 */ 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC0, 0x03, 0x02, 0x01, 0xFE, 0xFD, 0x02, -/* 0000CD90 */ 0x8A, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x1E, -/* 0000CDA0 */ 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, -/* 0000CDB0 */ 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, -/* 0000CDC0 */ 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, -/* 0000CDD0 */ 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, -/* 0000CDE0 */ 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, 0x08, 0x06, 0x02, 0x0F, 0x21, 0x00, 0x08, 0x09, -/* 0000CDF0 */ 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x6C, 0x08, 0x09, 0x00, -/* 0000CE00 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, -/* 0000CE10 */ 0x61, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, -/* 0000CE20 */ 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x77, 0x02, 0x00, 0xFE, 0xFC, 0xB0, 0x07, 0x05, 0x00, -/* 0000CE30 */ 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x1E, 0x00, 0x4B, 0x00, 0x15, 0x00, -/* 0000CE40 */ 0x65, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x4F, -/* 0000CE50 */ 0xFC, 0x07, 0xFE, 0xA2, 0x03, 0xFE, 0xA4, 0x03, 0x1B, 0xFF, 0xA0, 0x41, 0xC3, 0x00, 0x35, 0x00, -/* 0000CE60 */ 0xFE, 0x18, 0xAB, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x18, 0xAB, 0xFE, 0xF1, 0x04, -/* 0000CE70 */ 0xFE, 0xF1, 0x04, 0x01, 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, 0x03, 0x01, 0x11, 0x11, 0x11, 0x11, -/* 0000CE80 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000CE90 */ 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000CEA0 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, 0xC1, 0x03, 0x02, 0x01, 0xFE, 0xFD, -/* 0000CEB0 */ 0x02, 0x02, 0x01, 0xFE, 0x49, 0x03, 0x02, 0x01, 0xFE, 0xA8, 0x03, 0x02, 0x01, 0xFE, 0xAB, 0x03, -/* 0000CEC0 */ 0x02, 0x01, 0xFE, 0xB0, 0x03, 0x02, 0x01, 0xFE, 0xBA, 0x03, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, -/* 0000CED0 */ 0x01, 0xFE, 0xB1, 0x03, 0x03, 0xCB, 0x5B, 0x0D, 0xB3, 0x0D, 0x0D, 0x2C, 0x10, 0x0D, 0x15, 0x03, -/* 0000CEE0 */ 0x00, 0x10, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, -/* 0000CEF0 */ 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, -/* 0000CF00 */ 0x1F, 0x03, 0xFF, 0x10, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, -/* 0000CF10 */ 0x11, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x10, 0x10, 0x47, -/* 0000CF20 */ 0x0E, 0x10, 0xA8, 0x10, 0x14, 0x0E, 0x00, 0x0E, 0x10, 0x09, 0x00, 0x00, 0x61, 0x10, 0x0E, 0x02, -/* 0000CF30 */ 0x0F, 0x21, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 0000CF40 */ 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x03, 0x5C, 0x02, -/* 0000CF50 */ 0x04, 0x1F, 0x03, 0xFF, 0x10, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000CF60 */ 0x00, 0x00, 0x61, 0x10, 0x0E, 0x03, 0x7A, 0x10, 0x00, 0x04, 0x61, 0x10, 0x0E, 0x05, 0x7A, 0x10, -/* 0000CF70 */ 0x00, 0x06, 0x61, 0x10, 0x0E, 0x07, 0x7A, 0x10, 0x00, 0x08, 0x61, 0x10, 0x0E, 0x09, 0x7A, 0x10, -/* 0000CF80 */ 0x00, 0x0A, 0x61, 0x10, 0x0E, 0x0B, 0x7A, 0x10, 0x00, 0x0C, 0x61, 0x10, 0x0E, 0x0D, 0x7A, 0x10, -/* 0000CF90 */ 0x00, 0x0E, 0x61, 0x10, 0x0E, 0x0F, 0x7A, 0x10, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000CFA0 */ 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000CFB0 */ 0x1F, 0x02, 0x00, 0x00, 0xA8, 0x03, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, -/* 0000CFC0 */ 0xBA, 0x03, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, -/* 0000CFD0 */ 0xFE, 0x33, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x17, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x70, 0x02, 0xFE, -/* 0000CFE0 */ 0xA8, 0x03, 0xFE, 0x71, 0x02, 0xFE, 0x20, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x22, 0x02, 0xFE, 0x75, -/* 0000CFF0 */ 0x02, 0xFE, 0xBA, 0x03, 0xFE, 0x74, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0xB1, 0x03, -/* 0000D000 */ 0x00, 0xFE, 0x4D, 0xAB, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x84, -/* 0000D010 */ 0x00, 0x1E, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x1E, 0x00, 0x85, 0x00, 0x4A, 0x00, 0xC6, -/* 0000D020 */ 0x02, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xA3, 0x03, 0xFE, 0x8B, 0x03, 0x10, -/* 0000D030 */ 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x34, 0x00, 0xFE, 0x6C, 0xA5, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, -/* 0000D040 */ 0x03, 0xFE, 0x6C, 0xA5, 0xFE, 0xF3, 0x02, 0xFE, 0xF3, 0x02, 0x01, 0x09, 0x06, 0x0B, 0x0B, 0x44, -/* 0000D050 */ 0x41, 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D060 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D070 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x00, 0xFE, -/* 0000D080 */ 0xC0, 0x03, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0x04, 0xFE, 0x0B, 0x01, 0x5B, 0x08, 0xB3, 0x08, 0x08, -/* 0000D090 */ 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000D0A0 */ 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, -/* 0000D0B0 */ 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, -/* 0000D0C0 */ 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, -/* 0000D0D0 */ 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, -/* 0000D0E0 */ 0x00, 0x61, 0x0B, 0x09, 0x02, 0x0F, 0x21, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x00, -/* 0000D0F0 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, -/* 0000D100 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, -/* 0000D110 */ 0x00, 0x00, 0x00, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0B, -/* 0000D120 */ 0x0B, 0x47, 0x06, 0x0B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x02, -/* 0000D130 */ 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x07, 0x0B, 0x8E, 0x03, -/* 0000D140 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, -/* 0000D150 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x6C, 0x0C, 0x0D, 0x03, 0x07, 0x07, 0x00, 0x5C, -/* 0000D160 */ 0x00, 0x0D, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x07, 0x61, 0x0E, 0x09, 0x04, 0x5C, 0x03, 0x0E, 0x61, -/* 0000D170 */ 0x0E, 0x09, 0x05, 0x5C, 0x04, 0x0E, 0x61, 0x0E, 0x09, 0x06, 0x5C, 0x05, 0x0E, 0x61, 0x0E, 0x09, -/* 0000D180 */ 0x07, 0x5C, 0x06, 0x0E, 0x1F, 0x07, 0x0C, 0x0C, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x00, 0x0B, 0x09, -/* 0000D190 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x67, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x76, -/* 0000D1A0 */ 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x74, 0x02, -/* 0000D1B0 */ 0x00, 0xFE, 0x99, 0xA5, 0x09, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x75, -/* 0000D1C0 */ 0x00, 0x1E, 0x00, 0x47, 0x00, 0x15, 0x00, 0x61, 0x00, 0x1E, 0x00, 0x75, 0x00, 0x1A, 0x00, 0x23, -/* 0000D1D0 */ 0x00, 0x1A, 0x00, 0x24, 0x00, 0x56, 0x00, 0xB4, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, -/* 0000D1E0 */ 0x07, 0xFE, 0xFD, 0x02, 0xFE, 0x68, 0x03, 0x10, 0xFF, 0xA1, 0x41, 0xE1, 0x00, 0x33, 0x00, 0xFE, -/* 0000D1F0 */ 0xCF, 0x9E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xCF, 0x9E, 0xFE, 0x4D, 0x06, 0xFE, -/* 0000D200 */ 0x4D, 0x06, 0x03, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x03, 0x09, 0x08, 0x07, 0x08, 0x08, 0xFF, -/* 0000D210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, -/* 0000D220 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000D230 */ 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, -/* 0000D240 */ 0x04, 0x02, 0x01, 0xFE, 0xFD, 0x02, 0xFE, 0x95, 0x01, 0xAE, 0x0A, 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, -/* 0000D250 */ 0xA8, 0x0F, 0x47, 0x08, 0x0F, 0xA8, 0x0F, 0x47, 0x09, 0x0F, 0x61, 0x0F, 0x0A, 0x00, 0x10, 0x03, -/* 0000D260 */ 0x00, 0x0F, 0x03, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x04, 0x47, 0x08, 0x0F, 0x61, 0x0F, 0x0A, -/* 0000D270 */ 0x00, 0x10, 0x03, 0x00, 0x0F, 0x05, 0x09, 0x07, 0x00, 0x97, 0x0F, 0x0A, 0x03, 0x47, 0x09, 0x0F, -/* 0000D280 */ 0x6A, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x0D, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x00, 0xA8, 0x0F, -/* 0000D290 */ 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x1C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -/* 0000D2A0 */ 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0xC2, 0x03, 0x00, -/* 0000D2B0 */ 0x0F, 0x09, 0x28, 0x01, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, -/* 0000D2C0 */ 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x0F, 0x0F, 0x47, -/* 0000D2D0 */ 0x0C, 0x0F, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x02, 0x00, 0x5C, -/* 0000D2E0 */ 0x00, 0x06, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x0F, 0x1E, 0x00, 0x0F, 0x09, 0x00, 0x00, -/* 0000D2F0 */ 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x02, -/* 0000D300 */ 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0xFF, 0x0F, 0x8E, 0x03, 0x00, 0x00, 0x00, -/* 0000D310 */ 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, -/* 0000D320 */ 0x01, 0x0C, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0D, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0D, 0x0F, -/* 0000D330 */ 0x09, 0x3D, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x03, 0x00, -/* 0000D340 */ 0x5C, 0x00, 0x06, 0xCB, 0x10, 0x5C, 0x01, 0x10, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0F, 0x0F, 0x47, -/* 0000D350 */ 0x0D, 0x0F, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x04, -/* 0000D360 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0D, 0x1F, 0x03, 0xFF, 0x0F, -/* 0000D370 */ 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x07, 0x04, 0x00, 0x5C, -/* 0000D380 */ 0x00, 0x06, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x0F, 0x47, -/* 0000D390 */ 0x0F, 0x0D, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, -/* 0000D3A0 */ 0x00, 0x06, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x8E, -/* 0000D3B0 */ 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x5C, 0x03, -/* 0000D3C0 */ 0x0C, 0x1F, 0x04, 0x10, 0x10, 0x76, 0x10, 0x0F, 0x05, 0x61, 0x0F, 0x0D, 0x06, 0x82, 0x0F, 0x0F, -/* 0000D3D0 */ 0x28, 0x01, 0xFA, 0x0F, 0x47, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000D3E0 */ 0xF0, 0xFE, 0x52, 0x03, 0xFE, 0x66, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x34, 0x02, 0xFE, 0x77, 0x02, -/* 0000D3F0 */ 0xFE, 0x77, 0x02, 0xDB, 0x00, 0xFE, 0x48, 0xA0, 0x14, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, -/* 0000D400 */ 0x00, 0x05, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x2C, 0x00, 0x0C, 0x00, 0x1B, -/* 0000D410 */ 0x00, 0x07, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x43, 0x00, 0x1C, 0x00, 0x52, 0x00, 0x1E, 0x00, 0x37, -/* 0000D420 */ 0x00, 0x1E, 0x00, 0x38, 0x00, 0x1B, 0x00, 0x97, 0x00, 0x1E, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, -/* 0000D430 */ 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x58, 0x00, 0x1F, 0x00, 0x76, 0x00, 0x3A, 0x00, 0x68, -/* 0000D440 */ 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, -/* 0000D450 */ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x56, 0x03, 0x61, 0xFF, 0xA0, 0x41, 0xF1, 0x00, 0x32, -/* 0000D460 */ 0x00, 0xFE, 0xFF, 0x9A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xFF, 0x9A, 0xFE, 0x90, -/* 0000D470 */ 0x03, 0xFE, 0x90, 0x03, 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4E, 0x4A, 0x02, 0x05, 0x07, 0x07, 0x07, -/* 0000D480 */ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D490 */ 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D4A0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x9D, 0x03, 0x04, 0x01, 0x01, -/* 0000D4B0 */ 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x30, 0x01, 0xAE, 0x08, 0x5B, 0x0A, 0xB3, -/* 0000D4C0 */ 0x0A, 0x0A, 0x97, 0x0E, 0x08, 0x03, 0x47, 0x09, 0x0E, 0xA8, 0x0E, 0x14, 0x0B, 0x00, 0x0A, 0x0E, -/* 0000D4D0 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x1E, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, -/* 0000D4E0 */ 0x09, 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, -/* 0000D4F0 */ 0x01, 0x04, 0x1F, 0x02, 0xFF, 0x0E, 0x09, 0x20, 0x00, 0x14, 0x03, 0x00, 0x09, 0x02, 0x09, 0x18, -/* 0000D500 */ 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x01, 0x07, -/* 0000D510 */ 0x01, 0x00, 0x5C, 0x00, 0x0F, 0x1F, 0x01, 0xFF, 0x0E, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 0000D520 */ 0x00, 0x00, 0x0E, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0E, 0x0E, -/* 0000D530 */ 0x47, 0x0B, 0x0E, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x02, 0x00, -/* 0000D540 */ 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x09, 0x0E, 0x8E, 0x02, 0x00, -/* 0000D550 */ 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0xCB, 0x0F, 0x5C, -/* 0000D560 */ 0x01, 0x0F, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0E, 0x0E, 0x47, 0x0C, 0x0E, 0x8E, 0x01, 0x00, 0x00, -/* 0000D570 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x4B, 0x0E, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, -/* 0000D580 */ 0x0C, 0x97, 0x0F, 0x08, 0x06, 0x5C, 0x02, 0x0F, 0x97, 0x0F, 0x08, 0x07, 0x5C, 0x03, 0x0F, 0x1F, -/* 0000D590 */ 0x04, 0xFF, 0x0E, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x02, 0x00, -/* 0000D5A0 */ 0x5C, 0x00, 0x05, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, -/* 0000D5B0 */ 0x02, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x5C, 0x02, 0x09, 0x61, 0x11, 0x0C, -/* 0000D5C0 */ 0x03, 0x5C, 0x03, 0x11, 0x61, 0x11, 0x0C, 0x04, 0x5C, 0x04, 0x11, 0x61, 0x11, 0x0C, 0x05, 0x5C, -/* 0000D5D0 */ 0x05, 0x11, 0x61, 0x11, 0x0C, 0x06, 0x5C, 0x06, 0x11, 0x1F, 0x07, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, -/* 0000D5E0 */ 0x1F, 0x02, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x57, 0x02, -/* 0000D5F0 */ 0xFE, 0x55, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x6F, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, -/* 0000D600 */ 0x74, 0x02, 0x00, 0xFE, 0x1D, 0x9B, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x29, 0x00, 0x12, -/* 0000D610 */ 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x6D, 0x00, 0x08, 0x00, 0x29, 0x00, 0x18, 0x00, 0xE2, 0x00, 0x1A, -/* 0000D620 */ 0x00, 0x2C, 0x00, 0x1A, 0x00, 0x29, 0x00, 0x1F, 0x00, 0x3A, 0x00, 0x27, 0x00, 0x4D, 0x00, 0x56, -/* 0000D630 */ 0x00, 0xB5, 0x00, 0x00, 0xBF, 0xFD, 0x02, 0x04, 0x0F, 0xFD, 0x0F, 0xFE, 0xA6, 0x03, 0xFE, 0xE9, -/* 0000D640 */ 0x02, 0x0C, 0xFF, 0xB3, 0x41, 0xC1, 0x00, 0x30, 0x00, 0xFE, 0xD7, 0x83, 0x01, 0xFF, 0x00, 0x10, -/* 0000D650 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xD7, 0x83, 0xFE, 0xC5, 0x16, 0xFE, 0xC5, 0x16, 0x44, 0x03, 0x15, -/* 0000D660 */ 0x24, 0x35, 0x08, 0xFE, 0x0A, 0x01, 0xF9, 0x02, 0x10, 0x13, 0x13, 0x13, 0x13, 0x01, 0x32, 0xFF, -/* 0000D670 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x35, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000D680 */ 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x86, 0x03, 0x02, 0x01, 0xFE, 0xA7, 0x03, 0x04, 0x02, 0x01, -/* 0000D690 */ 0xFE, 0xFD, 0x02, 0x08, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, -/* 0000D6A0 */ 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0x50, 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, -/* 0000D6B0 */ 0xFE, 0xA8, 0x03, 0x02, 0x01, 0xFE, 0xA9, 0x03, 0x02, 0x01, 0xFE, 0xAA, 0x03, 0x02, 0x01, 0xFE, -/* 0000D6C0 */ 0xAB, 0x03, 0x02, 0x00, 0xFE, 0xAC, 0x03, 0x02, 0x00, 0xFE, 0xAD, 0x03, 0x02, 0x00, 0xFE, 0xAE, -/* 0000D6D0 */ 0x03, 0x02, 0x00, 0xFE, 0xAF, 0x03, 0x02, 0x01, 0xFE, 0xB0, 0x03, 0x02, 0x01, 0xFE, 0x58, 0x03, -/* 0000D6E0 */ 0x09, 0x02, 0x01, 0xFE, 0xB1, 0x03, 0x02, 0x00, 0xFE, 0xB2, 0x03, 0x02, 0x00, 0xFE, 0xB3, 0x03, -/* 0000D6F0 */ 0x02, 0x01, 0xFE, 0xB4, 0x03, 0x02, 0x01, 0xFE, 0xB5, 0x03, 0x02, 0x01, 0xFE, 0xB6, 0x03, 0x02, -/* 0000D700 */ 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x01, 0xFE, 0xB7, 0x03, 0x02, 0x01, 0xFE, 0xB8, 0x03, 0x02, 0x01, -/* 0000D710 */ 0xFE, 0xB9, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1C, 0x04, -/* 0000D720 */ 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0x2C, 0x36, 0x24, 0x0D, 0x03, 0x00, 0x36, 0x02, 0x09, 0x18, -/* 0000D730 */ 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x6C, 0x36, 0x37, 0x00, 0x07, -/* 0000D740 */ 0x01, 0x00, 0x5C, 0x00, 0x37, 0x1F, 0x01, 0xFF, 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000D750 */ 0x00, 0x00, 0x36, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x19, 0x00, -/* 0000D760 */ 0x00, 0x00, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x24, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x36, 0x36, -/* 0000D770 */ 0x0F, 0x03, 0x00, 0x36, 0x09, 0x29, 0x00, 0x61, 0x36, 0x24, 0x01, 0x0F, 0x03, 0x00, 0x36, 0x09, -/* 0000D780 */ 0x1E, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x6C, 0x36, 0x37, 0x02, -/* 0000D790 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x36, -/* 0000D7A0 */ 0x76, 0x06, 0x24, 0x03, 0x2C, 0x36, 0x26, 0x14, 0x03, 0x00, 0x36, 0x07, 0x09, 0x22, 0x00, 0x8E, -/* 0000D7B0 */ 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x36, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, -/* 0000D7C0 */ 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x36, 0x36, 0x47, 0x26, 0x36, 0x09, 0x1E, -/* 0000D7D0 */ 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x37, 0x6C, 0x36, 0x37, 0x04, 0x07, -/* 0000D7E0 */ 0x02, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x26, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x26, 0x36, 0x8E, -/* 0000D7F0 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000D800 */ 0x01, 0x26, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x02, 0xA1, 0x00, 0x0B, 0x37, 0xA1, -/* 0000D810 */ 0x01, 0x0C, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x28, 0x36, -/* 0000D820 */ 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, -/* 0000D830 */ 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x02, 0xA1, 0x00, 0x0E, 0x37, -/* 0000D840 */ 0xA1, 0x01, 0x0F, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x0E, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x29, -/* 0000D850 */ 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, -/* 0000D860 */ 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x04, 0xA1, 0x00, 0x11, -/* 0000D870 */ 0x37, 0xA1, 0x01, 0x12, 0x37, 0xA1, 0x02, 0x13, 0x37, 0xA1, 0x03, 0x14, 0x37, 0x5C, 0x04, 0x37, -/* 0000D880 */ 0xA8, 0x37, 0x5C, 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x2A, 0x36, 0x8E, 0x02, 0x00, 0x00, -/* 0000D890 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, -/* 0000D8A0 */ 0x02, 0x15, 0x5C, 0x03, 0x16, 0xA8, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x17, 0x1F, 0x06, 0x36, -/* 0000D8B0 */ 0x36, 0x47, 0x2B, 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, -/* 0000D8C0 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x03, -/* 0000D8D0 */ 0xA1, 0x00, 0x19, 0x37, 0xA1, 0x01, 0x1A, 0x37, 0xA1, 0x02, 0x1B, 0x37, 0x5C, 0x04, 0x37, 0xA8, -/* 0000D8E0 */ 0x37, 0x5C, 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x96, 0x02, 0x00, 0x00, 0x00, 0x36, 0x8E, 0x02, -/* 0000D8F0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000D900 */ 0x26, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x16, 0xCD, 0x37, 0x02, 0xA1, 0x00, 0x06, 0x37, 0xA1, 0x01, -/* 0000D910 */ 0x17, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x96, 0x03, -/* 0000D920 */ 0x00, 0x00, 0x00, 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x36, 0x07, 0x02, -/* 0000D930 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x25, 0x36, 0x8E, 0x02, -/* 0000D940 */ 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x36, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, -/* 0000D950 */ 0x25, 0x5C, 0x02, 0x28, 0xA8, 0x37, 0x5C, 0x03, 0x37, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x37, 0x00, -/* 0000D960 */ 0x00, 0x00, 0x37, 0x5C, 0x04, 0x37, 0x1F, 0x05, 0x36, 0x36, 0x47, 0x2C, 0x36, 0x96, 0x04, 0x00, -/* 0000D970 */ 0x00, 0x00, 0x1D, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x36, 0x07, 0x02, 0x00, -/* 0000D980 */ 0x5C, 0x00, 0x04, 0x61, 0x37, 0x2C, 0x05, 0x5C, 0x01, 0x37, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x2D, -/* 0000D990 */ 0x36, 0x47, 0x2E, 0x2D, 0x61, 0x36, 0x2C, 0x06, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x31, 0x00, 0x8E, -/* 0000D9A0 */ 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x36, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, -/* 0000D9B0 */ 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x37, 0x5C, 0x01, 0x37, 0x61, 0x37, 0x2C, 0x06, -/* 0000D9C0 */ 0x5C, 0x02, 0x37, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x37, 0x5C, 0x03, 0x37, 0x1F, 0x04, 0xFF, 0x36, -/* 0000D9D0 */ 0x92, 0x04, 0x00, 0x00, 0x00, 0x36, 0x15, 0x03, 0x00, 0x36, 0x1D, 0x09, 0x54, 0x00, 0x8E, 0x02, -/* 0000D9E0 */ 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x36, 0x97, 0x36, 0x36, 0x2E, 0x47, 0x2F, 0x36, 0x47, -/* 0000D9F0 */ 0x30, 0x1E, 0xA8, 0x36, 0x15, 0x03, 0x00, 0x2F, 0x36, 0x09, 0x30, 0x00, 0x92, 0x04, 0x00, 0x00, -/* 0000DA00 */ 0x00, 0x37, 0x97, 0x37, 0x2F, 0x37, 0x47, 0x30, 0x37, 0x47, 0x36, 0x37, 0xA8, 0x37, 0x15, 0x03, -/* 0000DA10 */ 0x00, 0x36, 0x37, 0x09, 0x16, 0x00, 0x15, 0x03, 0x00, 0x30, 0x1E, 0x09, 0x0B, 0x00, 0x2F, 0x36, -/* 0000DA20 */ 0x2E, 0x1F, 0x2F, 0x36, 0x36, 0x30, 0x47, 0x2E, 0x36, 0x09, 0x06, 0x00, 0x96, 0x04, 0x00, 0x00, -/* 0000DA30 */ 0x00, 0x1D, 0x92, 0x02, 0x00, 0x00, 0x00, 0x36, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, -/* 0000DA40 */ 0x95, 0x00, 0xE5, 0x37, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, 0x6C, -/* 0000DA50 */ 0x36, 0x37, 0x07, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x20, 0x5C, 0x02, 0x21, 0x5C, -/* 0000DA60 */ 0x03, 0x2D, 0xA8, 0x38, 0x5C, 0x04, 0x38, 0xA8, 0x38, 0x5C, 0x05, 0x38, 0xA8, 0x38, 0x5C, 0x06, -/* 0000DA70 */ 0x38, 0x1F, 0x07, 0x36, 0x36, 0x47, 0x31, 0x36, 0xE9, 0x09, 0x33, 0x00, 0xE7, 0x27, 0x06, 0x8E, -/* 0000DA80 */ 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x36, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, -/* 0000DA90 */ 0x01, 0x27, 0x1F, 0x02, 0xFF, 0x36, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x37, -/* 0000DAA0 */ 0x6C, 0x36, 0x37, 0x08, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x37, 0x1F, 0x01, 0xFF, 0x36, 0xE9, 0x14, -/* 0000DAB0 */ 0x03, 0x00, 0x31, 0x22, 0x09, 0x09, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x09, 0x17, 0x00, -/* 0000DAC0 */ 0x14, 0x03, 0x00, 0x31, 0x23, 0x09, 0x09, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x19, 0x09, 0x06, -/* 0000DAD0 */ 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x1A, 0xA8, 0x36, 0x14, 0x03, 0x00, 0x2A, 0x36, 0x09, 0x03, -/* 0000DAE0 */ 0x00, 0x47, 0x2A, 0x14, 0x92, 0x03, 0x00, 0x00, 0x00, 0x36, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, -/* 0000DAF0 */ 0x37, 0x09, 0x06, 0x00, 0x96, 0x03, 0x00, 0x00, 0x00, 0x17, 0x76, 0x28, 0x24, 0x09, 0x61, 0x36, -/* 0000DB00 */ 0x2C, 0x05, 0x76, 0x36, 0x24, 0x0A, 0x76, 0x2E, 0x24, 0x0B, 0x76, 0x29, 0x24, 0x0C, 0x76, 0x2A, -/* 0000DB10 */ 0x24, 0x0D, 0x76, 0x2B, 0x24, 0x0E, 0x92, 0x02, 0x00, 0x00, 0x00, 0x36, 0x76, 0x36, 0x24, 0x0F, -/* 0000DB20 */ 0x92, 0x03, 0x00, 0x00, 0x00, 0x36, 0x76, 0x36, 0x24, 0x10, 0x92, 0x04, 0x00, 0x00, 0x00, 0x36, -/* 0000DB30 */ 0x76, 0x36, 0x24, 0x11, 0x76, 0x06, 0x24, 0x12, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, -/* 0000DB40 */ 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x52, 0x03, 0xFE, 0x6D, 0x02, -/* 0000DB50 */ 0xFE, 0x39, 0x02, 0xFE, 0x28, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x17, 0x02, 0xFE, -/* 0000DB60 */ 0x6F, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x71, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, -/* 0000DB70 */ 0x02, 0xFE, 0x75, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0xB1, 0x03, 0xFE, 0x21, 0x02, 0xFE, 0xBA, 0x03, -/* 0000DB80 */ 0x00, 0xFE, 0x24, 0x84, 0x35, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x37, 0x00, 0x18, 0x00, 0x3F, -/* 0000DB90 */ 0x00, 0x39, 0x00, 0x93, 0x00, 0x1E, 0x00, 0x65, 0x00, 0x04, 0x00, 0x5D, 0x00, 0x0B, 0x00, 0x3A, -/* 0000DBA0 */ 0x00, 0x22, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x49, 0x00, 0x31, 0x00, 0x71, 0x00, 0x31, 0x00, 0x5F, -/* 0000DBB0 */ 0x00, 0x3B, 0x00, 0x81, 0x00, 0x28, 0x00, 0x6E, 0x00, 0x3A, 0x00, 0x73, 0x00, 0x36, 0x00, 0x9B, -/* 0000DBC0 */ 0x00, 0x1A, 0x00, 0x41, 0x00, 0x2F, 0x00, 0x6F, 0x00, 0x06, 0x00, 0x2B, 0x00, 0x1E, 0x00, 0x69, -/* 0000DBD0 */ 0x00, 0x03, 0x00, 0x46, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x31, 0x00, 0x33, 0x05, 0x0E, 0x00, 0x33, -/* 0000DBE0 */ 0x00, 0x11, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x2F, 0x00, 0x24, 0x00, 0x92, 0x00, 0x08, 0x00, 0x3B, -/* 0000DBF0 */ 0x00, 0x0E, 0x00, 0xB1, 0x00, 0x06, 0x00, 0x7F, 0x00, 0x13, 0x00, 0x51, 0x00, 0x39, 0x00, 0x79, -/* 0000DC00 */ 0x00, 0x01, 0x00, 0x52, 0x00, 0x17, 0x00, 0x92, 0x01, 0x19, 0x00, 0x52, 0x00, 0x08, 0x00, 0x29, -/* 0000DC10 */ 0x00, 0x09, 0x00, 0x30, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x09, 0x00, 0x4A, 0x00, 0x06, 0x00, 0x4E, -/* 0000DC20 */ 0x00, 0x0A, 0x00, 0x35, 0x00, 0x03, 0x00, 0x3C, 0x00, 0x10, 0x00, 0x31, 0x00, 0x06, 0x00, 0x65, -/* 0000DC30 */ 0x00, 0x04, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x48, 0x00, 0x04, 0x00, 0x2A, -/* 0000DC40 */ 0x00, 0x04, 0x00, 0x36, 0x00, 0x04, 0x00, 0x42, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x0A, 0x00, 0x2E, -/* 0000DC50 */ 0x00, 0x0A, 0x00, 0x32, 0x00, 0x06, 0x00, 0x33, 0x00, 0x00, 0x5E, 0xDC, 0x00, 0x00, 0xBF, 0xFC, -/* 0000DC60 */ 0x02, 0x04, 0xCF, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0B, 0x03, 0x57, 0xFF, 0xA2, -/* 0000DC70 */ 0x41, 0xD1, 0x00, 0x31, 0x00, 0xFE, 0x91, 0x8B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 0000DC80 */ 0x91, 0x8B, 0xFE, 0xCB, 0x04, 0xFE, 0xCB, 0x04, 0x41, 0x09, 0x15, 0x1A, 0x0B, 0x5E, 0x59, 0x03, -/* 0000DC90 */ 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DCA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DCB0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, -/* 0000DCC0 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0xBB, 0x03, 0x02, 0x01, 0xFE, 0xB1, -/* 0000DCD0 */ 0x03, 0x03, 0x04, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x00, 0xFE, 0xB2, 0x03, 0x02, 0x00, 0xFE, -/* 0000DCE0 */ 0xB3, 0x03, 0x02, 0x01, 0xFE, 0xB4, 0x03, 0x02, 0x00, 0xFE, 0xBC, 0x03, 0x02, 0x01, 0xFE, 0xBD, -/* 0000DCF0 */ 0x03, 0x08, 0x02, 0x00, 0xFE, 0xBE, 0x03, 0x02, 0x01, 0xFE, 0xB6, 0x03, 0x02, 0x01, 0xFE, 0xAA, -/* 0000DD00 */ 0x03, 0x02, 0x01, 0xFE, 0xA9, 0x03, 0x02, 0x00, 0xFE, 0xBF, 0x03, 0xFE, 0x94, 0x01, 0x8E, 0x03, -/* 0000DD10 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1B, 0x6C, 0x1A, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, -/* 0000DD20 */ 0x00, 0x1B, 0x5C, 0x01, 0x15, 0xE0, 0x1C, 0x00, 0x5C, 0x02, 0x1C, 0x1F, 0x03, 0x1A, 0x1A, 0x47, -/* 0000DD30 */ 0x16, 0x1A, 0x97, 0x1A, 0x16, 0x02, 0x47, 0x17, 0x1A, 0x97, 0x1A, 0x16, 0x03, 0x14, 0x03, 0x00, -/* 0000DD40 */ 0x1A, 0x04, 0x09, 0x08, 0x00, 0xA8, 0x1B, 0x47, 0x1A, 0x1B, 0x09, 0x07, 0x00, 0x97, 0x1B, 0x16, -/* 0000DD50 */ 0x03, 0x47, 0x1A, 0x1B, 0x47, 0x18, 0x1A, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x80, 0x00, 0x8E, -/* 0000DD60 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, -/* 0000DD70 */ 0x09, 0x6C, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x07, 0x06, 0x00, -/* 0000DD80 */ 0x5C, 0x00, 0x08, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x1B, 0x07, 0x03, 0x00, -/* 0000DD90 */ 0x5C, 0x00, 0x08, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, -/* 0000DDA0 */ 0x7A, 0x18, 0x1C, 0x01, 0x5C, 0x01, 0x1C, 0x5C, 0x02, 0x07, 0x1F, 0x03, 0x1B, 0x1B, 0x5C, 0x01, -/* 0000DDB0 */ 0x1B, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x09, 0xCD, 0x1B, 0x03, 0xA1, 0x00, 0x0A, 0x1B, 0xA1, 0x01, -/* 0000DDC0 */ 0x0B, 0x1B, 0xA1, 0x02, 0x0C, 0x1B, 0x5C, 0x04, 0x1B, 0xA8, 0x1B, 0x5C, 0x05, 0x1B, 0x1F, 0x06, -/* 0000DDD0 */ 0x1A, 0x1A, 0x94, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x09, 0xBF, 0x00, 0x14, -/* 0000DDE0 */ 0x03, 0x00, 0x17, 0x0D, 0x09, 0x7B, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -/* 0000DDF0 */ 0x1A, 0xA8, 0x1B, 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x67, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, -/* 0000DE00 */ 0x18, 0x1A, 0x09, 0x50, 0x00, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x1B, 0x6C, -/* 0000DE10 */ 0x1A, 0x1B, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, -/* 0000DE20 */ 0x00, 0x00, 0x1C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x08, 0x8E, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, -/* 0000DE30 */ 0x00, 0x00, 0x1D, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x1C, 0x1C, 0x43, 0x1C, 0x1C, -/* 0000DE40 */ 0x0E, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1A, 0x1A, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 0000DE50 */ 0x00, 0x1A, 0x09, 0x0A, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x09, -/* 0000DE60 */ 0x3C, 0x00, 0x14, 0x03, 0x00, 0x17, 0x10, 0x09, 0x34, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, -/* 0000DE70 */ 0x1A, 0x09, 0x2A, 0x00, 0x15, 0x03, 0x00, 0x18, 0x11, 0x09, 0x22, 0x00, 0x15, 0x03, 0x00, 0x18, -/* 0000DE80 */ 0x12, 0x09, 0x1A, 0x00, 0x15, 0x03, 0x00, 0x18, 0x13, 0x09, 0x12, 0x00, 0x15, 0x03, 0x00, 0x18, -/* 0000DE90 */ 0x14, 0x09, 0x0A, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0xA8, 0x00, -/* 0000DEA0 */ 0x24, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000DEB0 */ 0x00, 0xB1, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x37, 0x02, 0xFE, 0xB1, 0x03, 0xFE, 0x5A, 0x02, 0x00, -/* 0000DEC0 */ 0x0E, 0xFE, 0x4F, 0x03, 0x00, 0xFE, 0xBD, 0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x82, -/* 0000DED0 */ 0x00, 0x07, 0x00, 0x2C, 0x00, 0x1E, 0x00, 0x4C, 0x00, 0x1C, 0x00, 0x4B, 0x00, 0x6C, 0x00, 0x9F, -/* 0000DEE0 */ 0x00, 0x1C, 0x00, 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x50, 0x00, 0xA9, 0x00, 0x0D, 0x00, 0x4D, -/* 0000DEF0 */ 0x00, 0x32, 0x00, 0xFF, 0x00, 0x0C, 0x00, 0x41, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x8F, 0xFD, -/* 0000DF00 */ 0x0F, 0xFE, 0x2E, 0x03, 0xFE, 0xAD, 0x02, 0x1E, 0xFF, 0xA0, 0x41, 0xC1, 0x00, 0x2D, 0x00, 0xFE, -/* 0000DF10 */ 0x4E, 0x7A, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x4E, 0x7A, 0xFE, 0xE5, 0x08, -/* 0000DF20 */ 0xFE, 0xE5, 0x08, 0x01, 0x0C, 0x07, 0x0F, 0x06, 0x7E, 0x76, 0x01, 0x07, 0x02, 0x02, 0x02, 0x02, -/* 0000DF30 */ 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000DF40 */ 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, -/* 0000DF50 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x97, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x01, -/* 0000DF60 */ 0x02, 0x00, 0x00, 0x00, 0xFE, 0x08, 0x02, 0x4F, 0x07, 0x4F, 0x08, 0x4F, 0x0B, 0x4F, 0x0C, 0x4F, -/* 0000DF70 */ 0x0D, 0x4F, 0x09, 0x4F, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x4B, -/* 0000DF80 */ 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x24, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000DF90 */ 0x00, 0x10, 0x61, 0x10, 0x10, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x0F, 0x00, 0x8E, 0x01, 0x00, -/* 0000DFA0 */ 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xC1, 0x01, 0xA8, 0x10, 0x47, 0x07, -/* 0000DFB0 */ 0x10, 0xA8, 0x10, 0x47, 0x08, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x10, -/* 0000DFC0 */ 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x8B, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, -/* 0000DFD0 */ 0x00, 0x00, 0x10, 0x4B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x10, 0x10, 0x47, -/* 0000DFE0 */ 0x07, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x01, -/* 0000DFF0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x07, 0xE0, 0x12, 0x00, 0x5C, 0x02, 0x12, 0x1F, -/* 0000E000 */ 0x03, 0x10, 0x10, 0x54, 0x09, 0x10, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x44, 0x00, 0x97, 0x10, 0x09, -/* 0000E010 */ 0x03, 0x47, 0x08, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x05, -/* 0000E020 */ 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, -/* 0000E030 */ 0x11, 0x5C, 0x02, 0x07, 0x47, 0x11, 0x04, 0x01, 0x04, 0x01, 0x12, 0x08, 0x2F, 0x11, 0x11, 0x12, -/* 0000E040 */ 0x2F, 0x11, 0x11, 0x05, 0x5C, 0x03, 0x11, 0x5C, 0x04, 0x05, 0x1F, 0x05, 0x10, 0x10, 0x47, 0x07, -/* 0000E050 */ 0x10, 0x09, 0x48, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, -/* 0000E060 */ 0x11, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, -/* 0000E070 */ 0x00, 0x12, 0x4B, 0x12, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x12, 0x12, 0x5C, 0x01, -/* 0000E080 */ 0x12, 0xE0, 0x12, 0x01, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x10, 0x10, 0x54, 0x0A, 0x10, 0x97, 0x10, -/* 0000E090 */ 0x0A, 0x03, 0x47, 0x07, 0x10, 0x97, 0x10, 0x0A, 0x06, 0x47, 0x08, 0x10, 0xA8, 0x10, 0x14, 0x03, -/* 0000E0A0 */ 0x00, 0x08, 0x10, 0x09, 0x1B, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, -/* 0000E0B0 */ 0x00, 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0xAC, -/* 0000E0C0 */ 0x00, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x10, 0x54, 0x0B, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x36, -/* 0000E0D0 */ 0x00, 0x00, 0x00, 0x10, 0x97, 0x10, 0x10, 0x07, 0x54, 0x0C, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, -/* 0000E0E0 */ 0x0C, 0x10, 0x09, 0x2B, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, -/* 0000E0F0 */ 0x08, 0x1F, 0x03, 0x10, 0x0B, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, -/* 0000E100 */ 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x5D, 0x00, -/* 0000E110 */ 0x97, 0x10, 0x0C, 0x08, 0x54, 0x0D, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0D, 0x10, 0x09, 0x1F, -/* 0000E120 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x0D, 0x1F, 0x03, 0x10, -/* 0000E130 */ 0x0B, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x09, 0x1C, 0x00, -/* 0000E140 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x10, 0x0B, -/* 0000E150 */ 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x8E, 0x01, 0x00, 0x00, -/* 0000E160 */ 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000E170 */ 0x00, 0xFE, 0x03, 0x03, 0xFE, 0x37, 0x02, 0x00, 0x28, 0xFE, 0x98, 0x03, 0x00, 0x0E, 0xFE, 0x99, -/* 0000E180 */ 0x03, 0x00, 0xFE, 0x64, 0x7A, 0x1B, 0x0E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x0F, 0x00, -/* 0000E190 */ 0x31, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, 0x23, 0x00, 0x13, 0x00, 0x7A, 0x00, 0x19, 0x00, -/* 0000E1A0 */ 0x29, 0x00, 0x24, 0x00, 0x6A, 0x00, 0x07, 0x00, 0xB8, 0x00, 0x07, 0x00, 0x26, 0x00, 0x40, 0x00, -/* 0000E1B0 */ 0xC6, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x29, 0x00, 0x0A, 0x00, -/* 0000E1C0 */ 0x2B, 0x00, 0x0C, 0x00, 0x2C, 0x00, 0x0F, 0x00, 0x8D, 0x00, 0x09, 0x00, 0x28, 0x01, 0x11, 0x00, -/* 0000E1D0 */ 0x56, 0x00, 0x0A, 0x00, 0x84, 0x00, 0x1C, 0x00, 0x54, 0x00, 0x0F, 0x00, 0x31, 0x00, 0x07, 0x00, -/* 0000E1E0 */ 0x42, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x1F, 0x00, 0x6B, 0x00, 0x1C, 0x00, 0x5B, 0x00, 0x11, 0x00, -/* 0000E1F0 */ 0x22, 0x00, 0x00, 0xF7, 0xE1, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x9A, -/* 0000E200 */ 0x03, 0xFE, 0xCB, 0x02, 0x2C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x2E, 0x00, 0xFE, 0x74, 0x7F, 0xFF, -/* 0000E210 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x74, 0x7F, 0xF9, 0xF9, 0x01, 0x04, 0x05, 0x08, 0x18, -/* 0000E220 */ 0x16, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E230 */ 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E240 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x97, 0x03, 0x02, 0x00, -/* 0000E250 */ 0xFE, 0x9B, 0x03, 0x5A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x4B, 0x08, -/* 0000E260 */ 0x0F, 0x03, 0x00, 0x08, 0x09, 0x23, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, -/* 0000E270 */ 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, -/* 0000E280 */ 0x2F, 0x00, 0x00, 0x02, 0x09, 0x25, 0x00, 0x09, 0x20, 0x00, 0x47, 0x00, 0x02, 0x01, 0x04, 0x01, -/* 0000E290 */ 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x04, 0x01, 0x04, 0x01, 0x08, 0x06, 0x2F, -/* 0000E2A0 */ 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000E2B0 */ 0x00, 0xFE, 0xA9, 0x7F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x53, -/* 0000E2C0 */ 0x00, 0x22, 0x00, 0x46, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x00, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, -/* 0000E2D0 */ 0xFF, 0xFF, 0xFE, 0x98, 0x02, 0x32, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x2A, 0x00, 0xFE, 0x6D, 0x76, -/* 0000E2E0 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x6D, 0x76, 0xFE, 0x13, 0x03, 0xFE, 0x13, -/* 0000E2F0 */ 0x03, 0x01, 0x06, 0x04, 0x07, 0x08, 0x1E, 0x1E, 0x01, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E300 */ 0x05, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E310 */ 0xFF, 0x00, 0x00, 0x03, 0x04, 0x85, 0x4F, 0x07, 0x96, 0x02, 0x00, 0x00, 0x00, 0x07, 0x8E, 0x01, -/* 0000E320 */ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x07, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x08, -/* 0000E330 */ 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x07, 0x07, 0x96, 0x02, 0x00, 0x00, 0x00, 0x07, -/* 0000E340 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, -/* 0000E350 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, -/* 0000E360 */ 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x00, -/* 0000E370 */ 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x09, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x08, 0x08, 0x5C, 0x02, -/* 0000E380 */ 0x08, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0xFF, 0x07, 0x92, 0x02, -/* 0000E390 */ 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x94, 0x03, -/* 0000E3A0 */ 0x00, 0xFE, 0x83, 0x76, 0x04, 0x08, 0x00, 0x00, 0x00, 0x22, 0x00, 0x31, 0x00, 0x4E, 0x00, 0xB6, -/* 0000E3B0 */ 0x02, 0x0B, 0x00, 0x15, 0x00, 0x00, 0xBA, 0xE3, 0x00, 0x00, 0xBF, 0xFD, 0x02, 0x04, 0x00, 0xFC, -/* 0000E3C0 */ 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9A, 0x02, 0x6B, 0xFF, 0xA2, 0x41, 0xD1, 0x00, 0x2B, -/* 0000E3D0 */ 0x00, 0xFE, 0x17, 0x77, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x17, 0x77, 0xFE, -/* 0000E3E0 */ 0x48, 0x02, 0xFE, 0x48, 0x02, 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x25, 0x25, 0x02, 0x08, 0x05, -/* 0000E3F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E400 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0xAA, 0x4F, 0x08, 0x96, 0x02, 0x00, -/* 0000E410 */ 0x00, 0x00, 0x08, 0x4F, 0x08, 0x96, 0x03, 0x00, 0x00, 0x00, 0x08, 0x8E, 0x02, 0x00, 0x00, 0x00, -/* 0000E420 */ 0x35, 0x00, 0x00, 0x00, 0x08, 0x97, 0x08, 0x08, 0x04, 0x96, 0x02, 0x00, 0x00, 0x00, 0x08, 0x8E, -/* 0000E430 */ 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, -/* 0000E440 */ 0x09, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x08, 0x08, 0x96, 0x03, 0x00, 0x00, 0x00, -/* 0000E450 */ 0x08, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000E460 */ 0x03, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x09, 0x5C, 0x01, 0x09, 0x8E, 0x02, -/* 0000E470 */ 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x09, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x92, 0x02, -/* 0000E480 */ 0x00, 0x00, 0x00, 0x0A, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x09, 0x09, 0x5C, 0x02, 0x09, 0xD4, 0x00, -/* 0000E490 */ 0x00, 0x00, 0x00, 0x09, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000E4A0 */ 0x02, 0x00, 0x00, 0x00, 0x08, 0x4B, 0x08, 0x92, 0x03, 0x00, 0x00, 0x00, 0x09, 0x9C, 0x09, 0x08, -/* 0000E4B0 */ 0x04, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x95, 0x03, 0xFE, 0x96, 0x03, 0x00, 0xFE, 0x37, -/* 0000E4C0 */ 0x77, 0x05, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x56, 0x00, 0x22, 0x00, 0x45, 0x00, 0x4A, 0x00, -/* 0000E4D0 */ 0x58, 0x01, 0x18, 0x00, 0x34, 0x00, 0x00, 0xDB, 0xE4, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x04, 0x00, -/* 0000E4E0 */ 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9E, 0x02, 0x68, 0xFF, 0xA2, 0x41, 0xD1, 0x00, -/* 0000E4F0 */ 0x2C, 0x00, 0xFE, 0x2E, 0x78, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x2E, 0x78, 0xEC, -/* 0000E500 */ 0xEC, 0x41, 0x04, 0x03, 0x06, 0x0D, 0x0D, 0x03, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E510 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E520 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x31, -/* 0000E530 */ 0x4F, 0x04, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x4B, 0x06, 0x97, 0x06, -/* 0000E540 */ 0x06, 0x03, 0x54, 0x04, 0x06, 0x15, 0x03, 0x00, 0x04, 0x02, 0x09, 0x10, 0x00, 0x8E, 0x01, 0x00, -/* 0000E550 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x4B, 0x06, 0x9C, 0x03, 0x06, 0x04, 0xA8, 0x00, 0x24, -/* 0000E560 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x78, 0x04, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x48, 0x00, -/* 0000E570 */ 0x08, 0x00, 0x2D, 0x00, 0x12, 0x00, 0x4F, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, -/* 0000E580 */ 0xFE, 0x93, 0x03, 0xFE, 0x73, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xC3, 0x00, 0x29, 0x00, 0xFE, 0x45, -/* 0000E590 */ 0x6C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x45, 0x6C, 0x96, 0x96, 0x01, 0x05, 0x03, -/* 0000E5A0 */ 0x06, 0x05, 0x0F, 0x0F, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E5B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E5C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x35, 0x5B, 0x04, 0xB3, 0x04, 0x04, 0x8E, 0x01, -/* 0000E5D0 */ 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x06, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, -/* 0000E5E0 */ 0x04, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x07, 0x4B, 0x07, 0x5C, 0x02, 0x07, -/* 0000E5F0 */ 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000E600 */ 0x00, 0xFE, 0x83, 0x6C, 0x02, 0x05, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x57, 0x00, 0x00, 0xBF, 0xFC, -/* 0000E610 */ 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x92, 0x03, 0xFE, 0x6C, 0x02, 0x08, 0xFF, 0xA2, 0x41, 0xA3, -/* 0000E620 */ 0x00, 0x28, 0x00, 0xFE, 0x67, 0x6A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x67, 0x6A, -/* 0000E630 */ 0xFE, 0x04, 0x01, 0xFE, 0x04, 0x01, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, 0x02, 0x01, -/* 0000E640 */ 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E650 */ 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E660 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, -/* 0000E670 */ 0x5A, 0xAE, 0x07, 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x4F, 0x08, 0x61, 0x0B, 0x07, 0x00, 0x12, 0x03, -/* 0000E680 */ 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x07, 0x00, 0x97, 0x0C, -/* 0000E690 */ 0x07, 0x04, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, -/* 0000E6A0 */ 0x00, 0x0B, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000E6B0 */ 0x49, 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, -/* 0000E6C0 */ 0x1F, 0x05, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFE, -/* 0000E6D0 */ 0xB3, 0x6A, 0x03, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x4D, 0x00, 0x31, 0x00, 0x6A, 0x00, 0x00, -/* 0000E6E0 */ 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x91, 0x03, 0xFE, 0x65, 0x02, 0x08, 0xFF, 0xA2, -/* 0000E6F0 */ 0x41, 0xA3, 0x00, 0x27, 0x00, 0xFE, 0x55, 0x68, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 0000E700 */ 0x55, 0x68, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, -/* 0000E710 */ 0x02, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E720 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E730 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -/* 0000E740 */ 0x00, 0x04, 0x5A, 0xAE, 0x07, 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x4F, 0x08, 0x61, 0x0B, 0x07, 0x00, -/* 0000E750 */ 0x12, 0x03, 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x07, 0x00, -/* 0000E760 */ 0x97, 0x0C, 0x07, 0x04, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x32, -/* 0000E770 */ 0x00, 0x00, 0x00, 0x0B, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x00, -/* 0000E780 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, -/* 0000E790 */ 0x04, 0x08, 0x1F, 0x05, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, -/* 0000E7A0 */ 0x00, 0xFE, 0x9F, 0x68, 0x03, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x4D, 0x00, 0x31, 0x00, 0x68, -/* 0000E7B0 */ 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x90, 0x03, 0xFE, 0x5E, 0x02, 0x08, -/* 0000E7C0 */ 0xFF, 0xA2, 0x41, 0xA3, 0x00, 0x26, 0x00, 0xFE, 0x53, 0x66, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 0000E7D0 */ 0x02, 0xFE, 0x53, 0x66, 0xF8, 0xF8, 0x03, 0x07, 0x06, 0x0B, 0x06, 0x1B, 0x19, 0x01, 0x02, 0x01, -/* 0000E7E0 */ 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E7F0 */ 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E800 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, -/* 0000E810 */ 0x5A, 0xAE, 0x07, 0x5B, 0x09, 0xB3, 0x09, 0x09, 0x4F, 0x08, 0x61, 0x0B, 0x07, 0x00, 0x12, 0x03, -/* 0000E820 */ 0x00, 0x0B, 0x03, 0x09, 0x08, 0x00, 0xA8, 0x0C, 0x47, 0x0B, 0x0C, 0x09, 0x07, 0x00, 0x97, 0x0C, -/* 0000E830 */ 0x07, 0x04, 0x47, 0x0B, 0x0C, 0x54, 0x08, 0x0B, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, -/* 0000E840 */ 0x00, 0x0B, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000E850 */ 0x45, 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, -/* 0000E860 */ 0x1F, 0x05, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFE, -/* 0000E870 */ 0x99, 0x66, 0x03, 0x09, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x4D, 0x00, 0x31, 0x00, 0x64, 0x00, 0x00, -/* 0000E880 */ 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0xE6, 0x02, 0xFE, 0x40, 0x02, 0x1D, 0xFF, 0xA2, -/* 0000E890 */ 0x41, 0xC1, 0x00, 0x25, 0x00, 0xFE, 0xB3, 0x60, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, -/* 0000E8A0 */ 0xB3, 0x60, 0xFE, 0x60, 0x03, 0xFE, 0x60, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, 0x50, 0x4D, 0x01, -/* 0000E8B0 */ 0x08, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E8C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000E8D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x02, 0x00, 0xFE, 0x50, -/* 0000E8E0 */ 0x03, 0x02, 0x00, 0xFE, 0x8D, 0x03, 0x02, 0x01, 0xFE, 0x8E, 0x03, 0x02, 0x00, 0xFE, 0x8F, 0x03, -/* 0000E8F0 */ 0xFE, 0x50, 0x01, 0xA8, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0C, 0x07, -/* 0000E900 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0C, 0x0C, 0x47, 0x08, 0x0C, 0x2C, -/* 0000E910 */ 0x0C, 0x09, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x78, 0x00, 0x61, 0x0C, 0x09, 0x00, 0x47, 0x0A, -/* 0000E920 */ 0x0C, 0x2C, 0x0C, 0x0A, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x66, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 0000E930 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x0D, 0x6C, 0x0C, 0x0D, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0D, -/* 0000E940 */ 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0C, 0x0C, 0x47, 0x0A, 0x0C, 0x15, 0x03, 0x00, 0x0A, 0x04, 0x09, -/* 0000E950 */ 0x40, 0x00, 0x15, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x38, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 0000E960 */ 0x00, 0x00, 0x00, 0x0D, 0x6C, 0x0C, 0x0D, 0x02, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0D, 0x8E, 0x01, -/* 0000E970 */ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, -/* 0000E980 */ 0x0A, 0x1F, 0x02, 0x0E, 0x0E, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x07, 0x1F, 0x04, -/* 0000E990 */ 0xFF, 0x0C, 0x2C, 0x0C, 0x0A, 0x14, 0x0B, 0x00, 0x0C, 0x03, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, -/* 0000E9A0 */ 0x0A, 0x05, 0x09, 0x5C, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x07, -/* 0000E9B0 */ 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, -/* 0000E9C0 */ 0x00, 0x0D, 0x5C, 0x02, 0x0D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0E, 0x6C, -/* 0000E9D0 */ 0x0D, 0x0E, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, -/* 0000E9E0 */ 0x00, 0x00, 0x0F, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, -/* 0000E9F0 */ 0x1F, 0x02, 0x0D, 0x0D, 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0x00, 0x0C, 0x09, 0x43, 0x00, 0x09, 0x3E, -/* 0000EA00 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, -/* 0000EA10 */ 0x02, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0D, 0x5C, 0x02, -/* 0000EA20 */ 0x0D, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 0000EA30 */ 0x02, 0x1F, 0x01, 0x0D, 0x0D, 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, -/* 0000EA40 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x62, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x27, -/* 0000EA50 */ 0x02, 0x00, 0xFE, 0xEE, 0x60, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x34, 0x00, 0x0B, 0x00, -/* 0000EA60 */ 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x1E, 0x00, 0x37, 0x00, 0x10, 0x00, -/* 0000EA70 */ 0x4A, 0x00, 0x38, 0x00, 0x96, 0x00, 0x13, 0x00, 0x4C, 0x00, 0x5C, 0x00, 0x93, 0x00, 0x40, 0x00, -/* 0000EA80 */ 0x64, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x2B, 0x03, 0xFE, 0x32, 0x02, -/* 0000EA90 */ 0x28, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x24, 0x00, 0xFE, 0xDF, 0x5E, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000EAA0 */ 0x04, 0x04, 0xFE, 0xDF, 0x5E, 0xFE, 0x8C, 0x01, 0xFE, 0x8C, 0x01, 0x01, 0x07, 0x05, 0x0A, 0x03, -/* 0000EAB0 */ 0x26, 0x25, 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EAC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EAD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x00, 0xFE, 0xDF, 0x02, 0x04, -/* 0000EAE0 */ 0x97, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0A, 0x14, 0x03, 0x00, 0x05, 0x0A, -/* 0000EAF0 */ 0x09, 0x1B, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x6C, 0x0A, 0x0B, -/* 0000EB00 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0A, 0x8E, 0x01, -/* 0000EB10 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x6C, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, -/* 0000EB20 */ 0x00, 0x0B, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x0A, 0x0A, 0x47, 0x08, 0x0A, 0x0F, 0x03, 0x00, 0x08, -/* 0000EB30 */ 0x09, 0x0C, 0x00, 0x61, 0x0A, 0x08, 0x02, 0x15, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x1B, 0x00, 0x8E, -/* 0000EB40 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, -/* 0000EB50 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x07, -/* 0000EB60 */ 0x00, 0x00, 0x00, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x00, -/* 0000EB70 */ 0x0A, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x58, 0x02, 0xFE, 0x33, 0x02, -/* 0000EB80 */ 0xFE, 0x61, 0x02, 0x00, 0xFE, 0x10, 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, -/* 0000EB90 */ 0x1B, 0x00, 0x40, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x1B, 0x00, 0x40, 0x00, -/* 0000EBA0 */ 0x1C, 0x00, 0x2C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x2A, 0x03, 0xFE, -/* 0000EBB0 */ 0x25, 0x02, 0x24, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x23, 0x00, 0xFE, 0x1B, 0x5D, 0xFF, 0x00, 0x10, -/* 0000EBC0 */ 0x01, 0x00, 0x05, 0x05, 0xFE, 0x1B, 0x5D, 0xFE, 0x9A, 0x01, 0xFE, 0x9A, 0x01, 0x01, 0x08, 0x05, -/* 0000EBD0 */ 0x0B, 0x04, 0x27, 0x26, 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EBE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EBF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x00, 0xFE, 0xDF, -/* 0000EC00 */ 0x02, 0x04, 0x9A, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, -/* 0000EC10 */ 0x05, 0x0B, 0x09, 0x1B, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, -/* 0000EC20 */ 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0B, -/* 0000EC30 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, -/* 0000EC40 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x0F, 0x03, -/* 0000EC50 */ 0x00, 0x09, 0x09, 0x0C, 0x00, 0x61, 0x0B, 0x09, 0x02, 0x15, 0x03, 0x00, 0x0B, 0x03, 0x09, 0x1B, -/* 0000EC60 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, -/* 0000EC70 */ 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x01, 0x00, 0x00, -/* 0000EC80 */ 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x5C, -/* 0000EC90 */ 0x02, 0x08, 0x1F, 0x03, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 0000ECA0 */ 0x58, 0x02, 0xFE, 0x33, 0x02, 0xFE, 0x61, 0x02, 0x00, 0xFE, 0x55, 0x5D, 0x07, 0x00, 0x00, 0x00, -/* 0000ECB0 */ 0x00, 0x12, 0x00, 0x37, 0x00, 0x1B, 0x00, 0x40, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, -/* 0000ECC0 */ 0x00, 0x1B, 0x00, 0x40, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0x4F, 0xFC, -/* 0000ECD0 */ 0x0F, 0xFE, 0x0C, 0x03, 0xFE, 0x12, 0x02, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x21, 0x00, 0xFE, -/* 0000ECE0 */ 0x86, 0x59, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x86, 0x59, 0xFE, 0x6F, 0x03, -/* 0000ECF0 */ 0xFE, 0x6F, 0x03, 0x04, 0x09, 0x0A, 0x10, 0x05, 0x20, 0x20, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, -/* 0000ED00 */ 0x01, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000ED10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, -/* 0000ED20 */ 0x02, 0x01, 0xFE, 0x88, 0x03, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, 0xFE, 0x02, 0x09, -/* 0000ED30 */ 0x02, 0x01, 0xFE, 0x00, 0x03, 0x03, 0x97, 0x96, 0x04, 0x00, 0x00, 0x00, 0x0B, 0x96, 0x05, 0x00, -/* 0000ED40 */ 0x00, 0x00, 0x0C, 0xCD, 0x10, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x10, 0x96, 0x03, 0x00, 0x00, -/* 0000ED50 */ 0x00, 0x02, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, -/* 0000ED60 */ 0x00, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x5C, -/* 0000ED70 */ 0x02, 0x0A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, 0x8E, -/* 0000ED80 */ 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x92, -/* 0000ED90 */ 0x02, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, -/* 0000EDA0 */ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x92, 0x03, 0x00, 0x00, 0x00, 0x12, 0x7A, 0x12, -/* 0000EDB0 */ 0x11, 0x00, 0x7A, 0x07, 0x11, 0x01, 0x7A, 0x07, 0x11, 0x02, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, -/* 0000EDC0 */ 0x10, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, -/* 0000EDD0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, -/* 0000EDE0 */ 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, -/* 0000EDF0 */ 0xFE, 0xB2, 0x01, 0xFE, 0x89, 0x03, 0xFE, 0x8A, 0x03, 0xFE, 0x8B, 0x03, 0xFE, 0x8C, 0x03, 0x00, -/* 0000EE00 */ 0xFE, 0xD9, 0x59, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x00, 0x19, 0x00, 0x06, 0x00, 0x17, 0x00, -/* 0000EE10 */ 0x2D, 0x00, 0x70, 0x02, 0x42, 0x00, 0x68, 0x00, 0x0B, 0x00, 0x13, 0x00, 0x00, 0x21, 0xEE, 0x00, -/* 0000EE20 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x4F, 0xFD, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x15, 0x02, -/* 0000EE30 */ 0x41, 0xFF, 0xB2, 0x41, 0xD1, 0x00, 0x22, 0x00, 0xFE, 0x42, 0x5A, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000EE40 */ 0x02, 0x02, 0xFE, 0x42, 0x5A, 0xFE, 0x2C, 0x02, 0xFE, 0x2C, 0x02, 0x45, 0x08, 0x0B, 0x0F, 0x06, -/* 0000EE50 */ 0x30, 0x2F, 0x02, 0x07, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000EE60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, -/* 0000EE70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, 0x01, 0xFE, 0xE5, 0x02, 0x02, 0x01, 0xFE, -/* 0000EE80 */ 0xFE, 0x02, 0x09, 0x02, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xFF, 0x02, 0x08, 0x03, 0x01, -/* 0000EE90 */ 0x01, 0x00, 0x00, 0x00, 0xD6, 0xA8, 0x0D, 0xE5, 0xB2, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x2E, -/* 0000EEA0 */ 0x00, 0x00, 0x00, 0x10, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0B, 0x8E, 0x01, 0x00, -/* 0000EEB0 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x02, 0x11, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x8E, -/* 0000EEC0 */ 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x04, 0x11, 0x1F, 0x05, 0x10, 0x10, -/* 0000EED0 */ 0x47, 0x0D, 0x10, 0x61, 0x10, 0x0D, 0x00, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x6A, 0x00, 0x8E, 0x02, -/* 0000EEE0 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, -/* 0000EEF0 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x01, 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000EF00 */ 0x03, 0x00, 0x00, 0x00, 0x11, 0x5C, 0x02, 0x11, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0000EF10 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x61, 0x12, 0x0D, 0x00, 0x7A, 0x12, 0x11, 0x01, 0x7A, 0x05, 0x11, -/* 0000EF20 */ 0x02, 0x7A, 0x05, 0x11, 0x03, 0x7A, 0x08, 0x11, 0x04, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, -/* 0000EF30 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x2F, 0x10, 0x10, 0x0A, 0x94, 0x01, -/* 0000EF40 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xE9, 0x09, 0x1B, 0x00, 0xE7, 0x0C, 0x06, 0x8E, -/* 0000EF50 */ 0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, -/* 0000EF60 */ 0x01, 0x0C, 0x1F, 0x02, 0xFF, 0x10, 0xE9, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, -/* 0000EF70 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, -/* 0000EF80 */ 0x00, 0x00, 0xB2, 0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x02, 0xFE, 0xB4, -/* 0000EF90 */ 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB2, 0x01, 0xFE, 0xB1, 0x01, 0x00, 0xFE, 0x78, 0x5A, 0x07, 0x05, -/* 0000EFA0 */ 0x00, 0x00, 0x00, 0x39, 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x52, 0x00, 0x8D, 0x00, 0x1E, -/* 0000EFB0 */ 0x00, 0x33, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x1A, 0x00, 0x8F, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, -/* 0000EFC0 */ 0x0F, 0xFC, 0x0F, 0xFE, 0x0B, 0x03, 0xFE, 0xEE, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1F, -/* 0000EFD0 */ 0x00, 0xFE, 0x4F, 0x55, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x4F, 0x55, 0xFE, -/* 0000EFE0 */ 0x31, 0x04, 0xFE, 0x31, 0x04, 0x01, 0x08, 0x05, 0x0A, 0x05, 0x2C, 0x2A, 0x01, 0x03, 0x03, 0x03, -/* 0000EFF0 */ 0x03, 0x03, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F000 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, -/* 0000F010 */ 0x02, 0x01, 0xFE, 0x59, 0x03, 0x04, 0xA9, 0x4F, 0x06, 0x4F, 0x0A, 0x96, 0x02, 0x00, 0x00, 0x00, -/* 0000F020 */ 0x0A, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x06, 0x00, 0xCD, 0x00, 0x00, 0x09, -/* 0000F030 */ 0x8C, 0x00, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x0A, 0x00, 0xCD, 0x0A, 0x01, -/* 0000F040 */ 0xA1, 0x00, 0x05, 0x0A, 0x47, 0x05, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, -/* 0000F050 */ 0x0B, 0x6C, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x05, 0x1F, 0x02, -/* 0000F060 */ 0x0A, 0x0A, 0x47, 0x05, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0B, 0x6C, -/* 0000F070 */ 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x61, 0x0C, 0x05, 0x02, 0x5C, 0x01, 0x0C, -/* 0000F080 */ 0x1F, 0x02, 0x0A, 0x0A, 0x54, 0x06, 0x0A, 0xCD, 0x0A, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x0A, -/* 0000F090 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, -/* 0000F0A0 */ 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x5C, 0x03, 0x0B, 0x1F, -/* 0000F0B0 */ 0x04, 0xFF, 0x0A, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 0000F0C0 */ 0x00, 0x00, 0xFE, 0x52, 0x03, 0xFE, 0x5F, 0x02, 0xF0, 0xFE, 0x85, 0x03, 0x00, 0xFE, 0x82, 0x55, -/* 0000F0D0 */ 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x06, 0x00, 0x1E, 0x00, 0x0B, 0x00, 0x2F, -/* 0000F0E0 */ 0x00, 0x0A, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x22, 0x00, 0x70, 0x00, 0x09, 0x00, 0x18, -/* 0000F0F0 */ 0x00, 0x23, 0x00, 0x8F, 0x02, 0x0B, 0x00, 0x11, 0x00, 0x00, 0xFE, 0xF0, 0x00, 0x00, 0xBF, 0xFC, -/* 0000F100 */ 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0x01, 0x2A, 0xFF, 0xA2, -/* 0000F110 */ 0x41, 0xD1, 0x00, 0x20, 0x00, 0xFE, 0x01, 0x57, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 0000F120 */ 0x01, 0x57, 0xFE, 0x61, 0x02, 0xFE, 0x61, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x4C, 0x4A, 0x02, -/* 0000F130 */ 0x08, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F150 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x01, 0xFE, 0x86, 0x03, -/* 0000F160 */ 0x03, 0x02, 0x00, 0xFE, 0x87, 0x03, 0x04, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x45, 0x01, 0x4F, -/* 0000F170 */ 0x09, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x0B, 0x00, 0x2C, 0x0B, 0x08, 0x15, -/* 0000F180 */ 0x0B, 0x00, 0x0B, 0x03, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x08, 0x04, 0x09, 0x1B, 0x00, 0x8E, -/* 0000F190 */ 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, -/* 0000F1A0 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x31, -/* 0000F1B0 */ 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, -/* 0000F1C0 */ 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, -/* 0000F1D0 */ 0x00, 0x0B, 0x4B, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0B, -/* 0000F1E0 */ 0x0B, 0x0F, 0x35, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 0000F1F0 */ 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x8E, 0x02, 0x00, 0x00, -/* 0000F200 */ 0x00, 0x11, 0x00, 0x00, 0x00, 0x0D, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0x1F, -/* 0000F210 */ 0x02, 0x0D, 0x0D, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, -/* 0000F220 */ 0x00, 0x00, 0x00, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, -/* 0000F230 */ 0x09, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x09, 0x0B, 0x09, -/* 0000F240 */ 0x6E, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x04, 0x00, 0x5C, -/* 0000F250 */ 0x00, 0x06, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, -/* 0000F260 */ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, -/* 0000F270 */ 0x09, 0x1F, 0x04, 0x0B, 0x0B, 0x14, 0x03, 0x00, 0x0B, 0x07, 0x09, 0x33, 0x00, 0x8E, 0x02, 0x00, -/* 0000F280 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x02, 0x00, -/* 0000F290 */ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, -/* 0000F2A0 */ 0x00, 0x00, 0x00, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x0B, -/* 0000F2B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x56, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x60, 0x02, 0xFE, -/* 0000F2C0 */ 0x27, 0x02, 0x00, 0xFE, 0x21, 0x57, 0x09, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x65, 0x00, 0x1B, -/* 0000F2D0 */ 0x00, 0x47, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x20, 0x00, 0x35, 0x00, 0x32, 0x00, 0x4B, 0x00, 0x1E, -/* 0000F2E0 */ 0x00, 0x37, 0x00, 0x45, 0x00, 0x65, 0x00, 0x35, 0x00, 0x46, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, -/* 0000F2F0 */ 0x0F, 0xFC, 0x07, 0xFE, 0x0A, 0x03, 0xFE, 0xE3, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1E, -/* 0000F300 */ 0x00, 0xFE, 0xDA, 0x53, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xDA, 0x53, 0xF8, 0xF8, -/* 0000F310 */ 0x01, 0x05, 0x04, 0x06, 0x04, 0x1D, 0x1C, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, -/* 0000F320 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, -/* 0000F330 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x03, -/* 0000F340 */ 0x7A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x07, 0x6C, 0x06, 0x07, 0x00, 0x07, -/* 0000F350 */ 0x02, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x06, 0x06, 0x47, 0x04, 0x06, 0x8E, -/* 0000F360 */ 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x06, 0x4B, 0x06, 0x0F, 0x17, 0x00, 0x06, 0x09, -/* 0000F370 */ 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x07, 0x01, 0x00, 0x5C, -/* 0000F380 */ 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, -/* 0000F390 */ 0x6C, 0x06, 0x07, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x8E, 0x01, 0x00, -/* 0000F3A0 */ 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x06, 0x06, -/* 0000F3B0 */ 0x44, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5B, 0x02, -/* 0000F3C0 */ 0xFE, 0x37, 0x02, 0x00, 0xFE, 0x0C, 0x54, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x29, 0x00, -/* 0000F3D0 */ 0x13, 0x00, 0x25, 0x00, 0x14, 0x00, 0x2F, 0x00, 0x33, 0x00, 0x48, 0x00, 0x00, 0xBF, 0xFC, 0x02, -/* 0000F3E0 */ 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x09, 0x03, 0xFE, 0xA8, 0x01, 0x04, 0xFF, 0xA1, 0x41, 0xC1, 0x00, -/* 0000F3F0 */ 0x1D, 0x00, 0xFE, 0xD6, 0x40, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD6, 0x40, 0xFE, -/* 0000F400 */ 0xFE, 0x12, 0xFE, 0xFE, 0x12, 0x41, 0x16, 0x25, 0x38, 0x04, 0xB0, 0x9C, 0x01, 0x01, 0xFF, 0xFF, -/* 0000F410 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, -/* 0000F420 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 0000F430 */ 0x00, 0xFE, 0x63, 0x03, 0x02, 0x00, 0xFE, 0x64, 0x03, 0x02, 0x00, 0xFE, 0x65, 0x03, 0x02, 0x01, -/* 0000F440 */ 0xFE, 0x66, 0x03, 0x02, 0x01, 0xFE, 0x67, 0x03, 0x02, 0x00, 0xFE, 0x68, 0x03, 0x02, 0x00, 0xFE, -/* 0000F450 */ 0x69, 0x03, 0x02, 0x00, 0xFE, 0x6A, 0x03, 0x02, 0x00, 0xFE, 0x6B, 0x03, 0x02, 0x00, 0xFE, 0x6C, -/* 0000F460 */ 0x03, 0x02, 0x00, 0xFE, 0x6D, 0x03, 0x02, 0x00, 0xFE, 0x6E, 0x03, 0x02, 0x00, 0xFE, 0x6F, 0x03, -/* 0000F470 */ 0x02, 0x00, 0xFE, 0x70, 0x03, 0x02, 0x00, 0xFE, 0x71, 0x03, 0x02, 0x00, 0xFE, 0x72, 0x03, 0x02, -/* 0000F480 */ 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x73, 0x03, 0x02, 0x00, 0xFE, 0x74, 0x03, 0x02, 0x00, -/* 0000F490 */ 0xFE, 0x75, 0x03, 0x02, 0x00, 0xFE, 0x76, 0x03, 0x02, 0x00, 0xFE, 0x77, 0x03, 0x02, 0x00, 0xFE, -/* 0000F4A0 */ 0x78, 0x03, 0x02, 0x00, 0xFE, 0x79, 0x03, 0x02, 0x00, 0xFE, 0x7A, 0x03, 0x02, 0x00, 0xFE, 0x7B, -/* 0000F4B0 */ 0x03, 0x02, 0x00, 0xFE, 0x7C, 0x03, 0x02, 0x00, 0xFE, 0x7D, 0x03, 0x02, 0x00, 0xFE, 0x7E, 0x03, -/* 0000F4C0 */ 0x02, 0x00, 0xFE, 0x7F, 0x03, 0x02, 0x00, 0xFE, 0x80, 0x03, 0x02, 0x00, 0xFE, 0x81, 0x03, 0x02, -/* 0000F4D0 */ 0x00, 0xFE, 0x82, 0x03, 0x02, 0x00, 0xFE, 0x83, 0x03, 0x02, 0x01, 0xFE, 0x84, 0x03, 0xFE, 0xAD, -/* 0000F4E0 */ 0x02, 0x4F, 0x25, 0x4F, 0x26, 0x4F, 0x27, 0x4F, 0x28, 0x4F, 0x29, 0x4F, 0x2A, 0x4F, 0x2B, 0x4F, -/* 0000F4F0 */ 0x2C, 0x4F, 0x2D, 0x4F, 0x2E, 0x4F, 0x2F, 0x4F, 0x30, 0x4F, 0x31, 0x4F, 0x32, 0x4F, 0x33, 0x4F, -/* 0000F500 */ 0x34, 0x4F, 0x35, 0x4F, 0x36, 0x54, 0x25, 0x02, 0x54, 0x26, 0x03, 0x47, 0x38, 0x04, 0x01, 0x04, -/* 0000F510 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 0000F520 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x06, 0x54, 0x27, 0x38, 0x54, 0x28, 0x07, 0x2F, 0x38, -/* 0000F530 */ 0x08, 0x09, 0x54, 0x29, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x28, 0x2F, 0x38, 0x38, -/* 0000F540 */ 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x29, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, -/* 0000F550 */ 0x38, 0x0B, 0x54, 0x2A, 0x38, 0x47, 0x38, 0x0C, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, -/* 0000F560 */ 0x39, 0x2F, 0x38, 0x38, 0x0D, 0x54, 0x2B, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 0000F570 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0E, 0x54, 0x2C, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 0000F580 */ 0x01, 0x39, 0x2C, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0F, 0x01, 0x04, 0x01, 0x39, 0x27, -/* 0000F590 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x10, 0x54, 0x2D, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 0000F5A0 */ 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x11, 0x01, 0x04, 0x01, 0x39, 0x26, -/* 0000F5B0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x12, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, -/* 0000F5C0 */ 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2E, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 0000F5D0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x14, 0x01, 0x04, 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, -/* 0000F5E0 */ 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2F, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 0000F5F0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x15, 0x54, 0x30, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, -/* 0000F600 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x16, 0x01, 0x04, 0x01, 0x39, 0x25, -/* 0000F610 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x17, 0x54, 0x31, 0x38, 0x47, 0x38, 0x12, 0x01, 0x04, -/* 0000F620 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x18, 0x2F, 0x38, 0x0A, 0x38, 0x47, -/* 0000F630 */ 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x31, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1A, 0x2F, -/* 0000F640 */ 0x38, 0x38, 0x39, 0x47, 0x39, 0x05, 0x01, 0x04, 0x01, 0x3A, 0x25, 0x2F, 0x39, 0x39, 0x3A, 0x2F, -/* 0000F650 */ 0x39, 0x39, 0x1B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x32, 0x38, 0x47, 0x38, -/* 0000F660 */ 0x1C, 0x01, 0x04, 0x01, 0x39, 0x32, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x47, 0x39, -/* 0000F670 */ 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x30, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, -/* 0000F680 */ 0x38, 0x39, 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x2F, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, -/* 0000F690 */ 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x54, 0x33, 0x38, 0x47, 0x38, 0x19, 0x01, 0x04, 0x01, 0x39, -/* 0000F6A0 */ 0x2E, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x1F, 0x47, 0x39, 0x20, 0x01, 0x04, 0x01, 0x3A, -/* 0000F6B0 */ 0x2D, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x21, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x19, -/* 0000F6C0 */ 0x01, 0x04, 0x01, 0x3A, 0x2B, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x22, 0x2F, 0x38, 0x38, -/* 0000F6D0 */ 0x39, 0x54, 0x34, 0x38, 0x47, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x33, 0x2F, 0x38, 0x38, 0x39, -/* 0000F6E0 */ 0x2F, 0x38, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x34, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, -/* 0000F6F0 */ 0x23, 0x54, 0x35, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x35, 0x2F, 0x38, 0x38, 0x39, -/* 0000F700 */ 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, -/* 0000F710 */ 0x05, 0x01, 0x04, 0x01, 0x39, 0x2A, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x36, -/* 0000F720 */ 0x38, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x01, -/* 0000F730 */ 0x33, 0x5C, 0x02, 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, -/* 0000F740 */ 0x00, 0x00, 0x00, 0x38, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x38, 0x07, 0x03, -/* 0000F750 */ 0x00, 0x5C, 0x01, 0x34, 0x5C, 0x02, 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, 0x00, -/* 0000F760 */ 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x38, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, -/* 0000F770 */ 0x38, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, -/* 0000F780 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 0000F790 */ 0x00, 0xFE, 0xB6, 0x45, 0x16, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x1F, -/* 0000F7A0 */ 0x00, 0x20, 0x00, 0x33, 0x00, 0x03, 0x00, 0x77, 0x00, 0x07, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x44, -/* 0000F7B0 */ 0x00, 0x13, 0x00, 0x7D, 0x00, 0x13, 0x00, 0x94, 0x00, 0x20, 0x00, 0x83, 0x00, 0x2D, 0x00, 0x83, -/* 0000F7C0 */ 0x00, 0x20, 0x00, 0x74, 0x00, 0x13, 0x00, 0x6A, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x43, 0x00, 0x00, -/* 0000F7D0 */ 0x04, 0x3B, 0x00, 0x4C, 0x01, 0x3B, 0x00, 0x5A, 0x01, 0x20, 0x00, 0x4B, 0x00, 0x2D, 0x00, 0x6E, -/* 0000F7E0 */ 0x00, 0x23, 0x00, 0x66, 0x00, 0x23, 0x00, 0x8B, 0x00, 0x25, 0x00, 0x72, 0x00, 0x00, 0xBF, 0xDC, -/* 0000F7F0 */ 0x02, 0x00, 0x80, 0xFC, 0x07, 0xFE, 0x08, 0x03, 0xFE, 0xA1, 0x01, 0x04, 0xFF, 0xA1, 0x41, 0xC1, -/* 0000F800 */ 0x00, 0x1C, 0x00, 0xFE, 0x99, 0x3F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x99, 0x3F, -/* 0000F810 */ 0x55, 0x55, 0x41, 0x02, 0x02, 0x03, 0x05, 0x05, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F820 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F830 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x13, 0xE0, 0x03, 0x00, 0x01, -/* 0000F840 */ 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x03, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 0000F850 */ 0x00, 0x00, 0x0A, 0xFE, 0x62, 0x03, 0x01, 0xFE, 0xC7, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x11, -/* 0000F860 */ 0x00, 0x26, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x07, 0x03, 0xFE, 0x90, -/* 0000F870 */ 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1B, 0x00, 0xFE, 0x34, 0x3D, 0xFF, 0x00, 0x10, 0x01, -/* 0000F880 */ 0x00, 0x06, 0x06, 0xFE, 0x34, 0x3D, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x0C, 0x07, 0x0F, -/* 0000F890 */ 0x08, 0x3C, 0x3B, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000F8A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, -/* 0000F8B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x5E, 0x03, 0x04, 0x02, 0x01, 0xFE, -/* 0000F8C0 */ 0x5F, 0x03, 0x02, 0x00, 0xFE, 0x60, 0x03, 0x02, 0x01, 0xFE, 0x61, 0x03, 0xEC, 0x4F, 0x0C, 0x4F, -/* 0000F8D0 */ 0x0D, 0x97, 0x10, 0x07, 0x08, 0x54, 0x0C, 0x10, 0x2C, 0x10, 0x0C, 0x15, 0x03, 0x00, 0x10, 0x02, -/* 0000F8E0 */ 0x09, 0xCC, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, -/* 0000F8F0 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x54, 0x0D, -/* 0000F900 */ 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000F910 */ 0x03, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x13, 0x00, 0x10, 0x09, 0x00, 0x00, 0x12, -/* 0000F920 */ 0x0B, 0x00, 0x0D, 0x09, 0x09, 0x00, 0x00, 0x11, 0x03, 0x00, 0x0D, 0x0A, 0x09, 0x5F, 0x00, 0x8E, -/* 0000F930 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x04, 0x00, -/* 0000F940 */ 0x5C, 0x00, 0x11, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x07, 0x02, 0x00, -/* 0000F950 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x12, 0x12, 0x5C, 0x01, 0x12, 0x8E, 0x01, 0x00, -/* 0000F960 */ 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x08, -/* 0000F970 */ 0x1F, 0x02, 0x12, 0x12, 0x5C, 0x02, 0x12, 0x2F, 0x12, 0x04, 0x09, 0x2F, 0x12, 0x12, 0x05, 0x2F, -/* 0000F980 */ 0x12, 0x12, 0x0A, 0x2F, 0x12, 0x12, 0x06, 0x5C, 0x03, 0x12, 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x01, -/* 0000F990 */ 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x11, 0x6C, 0x10, 0x11, 0x02, 0x07, 0x02, 0x00, 0x5C, -/* 0000F9A0 */ 0x00, 0x11, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x00, 0x10, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, -/* 0000F9B0 */ 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, -/* 0000F9C0 */ 0x02, 0x1F, 0x00, 0xFE, 0x86, 0x3D, 0x08, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x2D, 0x00, 0x0B, -/* 0000F9D0 */ 0x00, 0x33, 0x00, 0x1E, 0x00, 0x41, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x8D, 0x00, 0x21, -/* 0000F9E0 */ 0x00, 0x40, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, -/* 0000F9F0 */ 0x06, 0x03, 0xFE, 0x76, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0xC1, 0x00, 0x1A, 0x00, 0xFE, 0x17, 0x3A, -/* 0000FA00 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x17, 0x3A, 0xFE, 0x17, 0x03, 0xFE, 0x17, 0x03, -/* 0000FA10 */ 0x01, 0x0B, 0x0A, 0x11, 0x0A, 0x51, 0x4B, 0x01, 0x06, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, -/* 0000FA20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, 0xFF, -/* 0000FA30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, -/* 0000FA40 */ 0xFE, 0x58, 0x03, 0x02, 0x01, 0xFE, 0x59, 0x03, 0x02, 0x01, 0xFE, 0x5A, 0x03, 0x04, 0x01, 0xFF, -/* 0000FA50 */ 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0xFE, 0x5B, 0x03, 0x02, 0x00, 0xFE, 0x5C, 0x03, 0x02, 0x00, 0xFE, -/* 0000FA60 */ 0x5D, 0x03, 0xFE, 0x4C, 0x01, 0x4F, 0x0F, 0x97, 0x11, 0x0A, 0x0B, 0x47, 0x0F, 0x11, 0xA8, 0x11, -/* 0000FA70 */ 0x15, 0x03, 0x00, 0x0F, 0x11, 0x09, 0x2F, 0x01, 0x0C, 0x03, 0x00, 0x0C, 0x02, 0x09, 0x1E, 0x00, -/* 0000FA80 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, 0x12, 0x00, 0x07, 0x02, -/* 0000FA90 */ 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x11, 0x11, 0x47, 0x0F, 0x11, 0x0C, 0x03, -/* 0000FAA0 */ 0x00, 0x0C, 0x03, 0x09, 0x1E, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, -/* 0000FAB0 */ 0x6C, 0x11, 0x12, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x11, -/* 0000FAC0 */ 0x11, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x04, 0x09, 0x1E, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 0000FAD0 */ 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, 0x12, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, -/* 0000FAE0 */ 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x11, 0x11, 0x47, 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0D, -/* 0000FAF0 */ 0x11, 0x09, 0xAD, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x11, 0x07, 0x04, -/* 0000FB00 */ 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x12, 0x5C, 0x01, -/* 0000FB10 */ 0x12, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0x11, 0x11, 0x0C, 0x03, 0x00, 0x11, 0x06, -/* 0000FB20 */ 0x09, 0x7E, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x6C, 0x11, 0x12, -/* 0000FB30 */ 0x03, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x12, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, -/* 0000FB40 */ 0x13, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x01, -/* 0000FB50 */ 0x13, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000FB60 */ 0x05, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x02, 0x13, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000FB70 */ 0x0C, 0x00, 0x00, 0x00, 0x13, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 0000FB80 */ 0x1F, 0x00, 0x00, 0x00, 0x14, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, 0x1F, 0x04, -/* 0000FB90 */ 0x13, 0x13, 0x2F, 0x13, 0x07, 0x13, 0x2F, 0x13, 0x13, 0x09, 0x5C, 0x03, 0x13, 0x1F, 0x04, 0xFF, -/* 0000FBA0 */ 0x11, 0x47, 0x00, 0x0F, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, -/* 0000FBB0 */ 0x00, 0x00, 0x00, 0xFE, 0x5A, 0x02, 0xFE, 0x5B, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, 0x02, 0x00, -/* 0000FBC0 */ 0xFE, 0x5F, 0x3A, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x28, 0x00, 0x0A, 0x00, 0x27, 0x00, -/* 0000FBD0 */ 0x08, 0x00, 0x29, 0x00, 0x1E, 0x00, 0x45, 0x00, 0x08, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x3D, 0x00, -/* 0000FBE0 */ 0x08, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x3D, 0x00, 0x39, 0x00, 0x6B, 0x00, 0x7E, 0x00, 0xA6, 0x00, -/* 0000FBF0 */ 0x06, 0x00, 0x21, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x3F, 0xFC, 0x02, 0x04, 0x4F, 0xFC, 0x0F, -/* 0000FC00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x4B, 0x01, 0x14, 0xFF, 0xA0, 0x41, 0xD1, 0x00, 0x13, 0x00, -/* 0000FC10 */ 0xFE, 0x06, 0x35, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x06, 0x35, 0xFE, 0xE0, -/* 0000FC20 */ 0x04, 0xFE, 0xE0, 0x04, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, 0x01, 0x01, 0x06, 0x06, 0x06, 0x06, -/* 0000FC30 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FC40 */ 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FC50 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x52, 0x03, 0x02, 0x01, 0xFE, 0x53, 0x03, 0x02, 0x01, 0xFE, 0x54, -/* 0000FC60 */ 0x03, 0x02, 0x01, 0xFE, 0x55, 0x03, 0x02, 0x01, 0xFE, 0x56, 0x03, 0x02, 0x01, 0xFE, 0x57, 0x03, -/* 0000FC70 */ 0x03, 0x04, 0x88, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x07, 0x03, 0x00, -/* 0000FC80 */ 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, -/* 0000FC90 */ 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7A, 0x0D, 0x0C, 0x00, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, -/* 0000FCA0 */ 0x01, 0x00, 0x00, 0x00, 0x0D, 0x7A, 0x0D, 0x0C, 0x01, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x02, -/* 0000FCB0 */ 0x00, 0x00, 0x00, 0x0D, 0x7A, 0x0D, 0x0C, 0x02, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x03, 0x00, -/* 0000FCC0 */ 0x00, 0x00, 0x0D, 0x7A, 0x0D, 0x0C, 0x03, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x04, 0x00, 0x00, -/* 0000FCD0 */ 0x00, 0x0D, 0x7A, 0x0D, 0x0C, 0x04, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0xD4, 0x05, 0x00, 0x00, 0x00, -/* 0000FCE0 */ 0x0D, 0x7A, 0x0D, 0x0C, 0x05, 0x01, 0x64, 0x01, 0x0D, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x08, -/* 0000FCF0 */ 0x1F, 0x03, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, -/* 0000FD00 */ 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x5B, 0x02, -/* 0000FD10 */ 0x00, 0x00, 0x5C, 0x02, 0x00, 0x00, 0x5A, 0x02, 0x00, 0x00, 0x5F, 0x02, 0x00, 0x00, 0x57, 0x03, -/* 0000FD20 */ 0x00, 0x00, 0x00, 0xFE, 0x52, 0x03, 0xFE, 0x5B, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x5A, 0x02, 0xFE, -/* 0000FD30 */ 0x5F, 0x02, 0xFE, 0x57, 0x03, 0x00, 0xFE, 0x1C, 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, -/* 0000FD40 */ 0xC9, 0x04, 0x00, 0x12, 0x01, 0x01, 0x00, 0x7F, 0x00, 0x01, 0x00, 0xEC, 0xFF, 0x00, 0x00, 0x59, -/* 0000FD50 */ 0xFF, 0x00, 0x00, 0x2E, 0xFE, 0x00, 0x00, 0x5B, 0xFD, 0x00, 0x00, 0xBF, 0xFC, 0x03, 0x0C, 0x00, -/* 0000FD60 */ 0xFC, 0x07, 0xFE, 0x57, 0x03, 0xFE, 0x69, 0x01, 0x19, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x19, 0x00, -/* 0000FD70 */ 0xFE, 0x9A, 0x38, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x9A, 0x38, 0xFE, 0x35, 0x01, -/* 0000FD80 */ 0xFE, 0x35, 0x01, 0x01, 0x05, 0x04, 0x07, 0x05, 0x19, 0x17, 0x16, 0x01, 0x03, 0x01, 0xFF, 0xFF, -/* 0000FD90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, -/* 0000FDA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x5A, -/* 0000FDB0 */ 0x00, 0x04, 0x08, 0x5E, 0xEA, 0x00, 0x0F, 0x03, 0x00, 0x04, 0x09, 0x51, 0x00, 0x8E, 0x01, 0x00, -/* 0000FDC0 */ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, 0x00, -/* 0000FDD0 */ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x04, 0x5C, 0x03, 0x05, -/* 0000FDE0 */ 0x1F, 0x04, 0x07, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x09, 0x06, 0x00, 0x47, 0x00, 0x03, 0x09, 0x1F, -/* 0000FDF0 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x07, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000FE00 */ 0x02, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x07, 0x07, 0x47, 0x04, 0x07, 0x09, 0xA6, 0xFF, 0xA8, 0x00, -/* 0000FE10 */ 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xEF, 0x38, 0x05, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x19, -/* 0000FE20 */ 0x00, 0x2E, 0x00, 0x54, 0x00, 0x06, 0x00, 0x37, 0x00, 0x1F, 0x00, 0x3B, 0x00, 0x00, 0xBF, 0xFC, -/* 0000FE30 */ 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x56, 0x03, 0xFE, 0x60, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, -/* 0000FE40 */ 0x00, 0x18, 0x00, 0xFE, 0x83, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x83, 0x37, -/* 0000FE50 */ 0xFB, 0xFB, 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0xFF, -/* 0000FE60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, -/* 0000FE70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 0000FE80 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, -/* 0000FE90 */ 0xA6, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 0000FEA0 */ 0x02, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0A, 0x0A, 0x47, 0x07, 0x0A, 0x47, 0x08, 0x03, 0x8E, 0x01, -/* 0000FEB0 */ 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, -/* 0000FEC0 */ 0x07, 0x1F, 0x02, 0x0A, 0x0A, 0x0F, 0x64, 0x00, 0x0A, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, -/* 0000FED0 */ 0x00, 0x26, 0x00, 0x00, 0x00, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x1F, -/* 0000FEE0 */ 0x02, 0x0A, 0x0A, 0x0F, 0x03, 0x00, 0x0A, 0x09, 0x43, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x15, -/* 0000FEF0 */ 0x00, 0x00, 0x00, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x47, 0x0C, -/* 0000FF00 */ 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x0E, 0x6C, 0x0D, 0x0E, 0x01, 0x07, -/* 0000FF10 */ 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0x0D, 0x0D, 0x33, -/* 0000FF20 */ 0x0C, 0x0C, 0x0D, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0A, 0x0A, 0x47, 0x08, 0x0A, 0x47, 0x00, 0x08, -/* 0000FF30 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x17, 0x25, 0x00, 0xFE, 0xA2, 0x37, 0x06, -/* 0000FF40 */ 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x29, 0x00, 0x03, 0x00, 0x19, 0x00, 0x3C, 0x00, 0x38, 0x00, -/* 0000FF50 */ 0x43, 0x00, 0x49, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, -/* 0000FF60 */ 0xFE, 0x55, 0x03, 0xFE, 0x5C, 0x01, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x17, 0x00, 0xFE, 0x0D, -/* 0000FF70 */ 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0D, 0x37, 0x5D, 0x5D, 0x01, 0x03, 0x03, -/* 0000FF80 */ 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FF90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 0000FFA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x33, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, 0x05, -/* 0000FFB0 */ 0x09, 0x1D, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x05, 0x07, 0x02, 0x00, -/* 0000FFC0 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, -/* 0000FFD0 */ 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, -/* 0000FFE0 */ 0x2C, 0x37, 0x02, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x3D, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, -/* 0000FFF0 */ 0x00, 0xFC, 0x07, 0xFE, 0x54, 0x03, 0xFE, 0x58, 0x01, 0x16, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x16, -/* 00010000 */ 0x00, 0xFE, 0x96, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x96, 0x36, 0x56, 0x56, -/* 00010010 */ 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x33, 0xA8, 0x05, 0x14, 0x03, -/* 00010040 */ 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, 0x47, 0x00, 0x05, 0x09, 0x1A, 0x00, 0x8E, 0x01, -/* 00010050 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, -/* 00010060 */ 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 00010070 */ 0x00, 0x00, 0xFE, 0xB5, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x36, 0x00, 0x00, 0xBF, -/* 00010080 */ 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x53, 0x03, 0xFE, 0x54, 0x01, 0x16, 0xFF, 0xA2, 0x41, -/* 00010090 */ 0xC1, 0x00, 0x15, 0x00, 0xFE, 0x21, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x21, -/* 000100A0 */ 0x36, 0x5C, 0x5C, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000100B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000100C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x33, 0xA8, -/* 000100D0 */ 0x05, 0x15, 0x03, 0x00, 0x03, 0x05, 0x09, 0x1D, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, -/* 000100E0 */ 0x00, 0x00, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0x1F, 0x02, 0x05, 0x05, -/* 000100F0 */ 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 00010100 */ 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x40, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x3C, -/* 00010110 */ 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x52, 0x03, 0xFE, 0x4D, 0x01, 0x16, -/* 00010120 */ 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x14, 0x00, 0xFE, 0x48, 0x35, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 00010130 */ 0x02, 0xFE, 0x48, 0x35, 0xC0, 0xC0, 0x01, 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x01, -/* 00010140 */ 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010150 */ 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010160 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x53, 0x14, 0x03, 0x00, 0x04, 0x02, 0x09, 0x18, 0x00, 0x8E, -/* 00010170 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x6C, 0x06, 0x07, 0x00, 0x07, 0x01, 0x00, -/* 00010180 */ 0x5C, 0x00, 0x07, 0x1F, 0x01, 0xFF, 0x06, 0xA8, 0x06, 0x15, 0x03, 0x00, 0x04, 0x06, 0x09, 0x1D, -/* 00010190 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, -/* 000101A0 */ 0x03, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x06, 0x06, 0x47, 0x00, 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, -/* 000101B0 */ 0x47, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x02, 0x00, -/* 000101C0 */ 0xFE, 0x67, 0x35, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x26, 0x00, 0x18, 0x00, 0x3E, 0x00, -/* 000101D0 */ 0x31, 0x00, 0x3C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x8F, 0xFD, 0x07, 0xFE, 0x28, 0x03, 0xFE, -/* 000101E0 */ 0x30, 0x01, 0x20, 0xFF, 0xA0, 0x41, 0xC1, 0x00, 0x12, 0x00, 0xFE, 0x7F, 0x31, 0xFF, 0x00, 0x10, -/* 000101F0 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0x7F, 0x31, 0xFE, 0x70, 0x03, 0xFE, 0x70, 0x03, 0x01, 0x07, 0x05, -/* 00010200 */ 0x08, 0x06, 0x41, 0x41, 0x01, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010220 */ 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 00010230 */ 0x01, 0x00, 0x00, 0x00, 0xFE, 0x29, 0x01, 0x4F, 0x05, 0x4F, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00010240 */ 0x40, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0F, 0x00, 0x8E, 0x01, -/* 00010250 */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x01, 0x01, 0x8E, 0x01, 0x00, -/* 00010260 */ 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x96, 0x00, -/* 00010270 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x09, 0x0F, 0x17, 0x00, 0x09, -/* 00010280 */ 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x07, 0x01, 0x00, -/* 00010290 */ 0x5C, 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, -/* 000102A0 */ 0x09, 0x4B, 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x09, 0x09, 0x54, 0x05, 0x09, -/* 000102B0 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, -/* 000102C0 */ 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, -/* 000102D0 */ 0x0B, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x54, 0x06, 0x09, 0x0F, 0x03, 0x00, -/* 000102E0 */ 0x06, 0x09, 0x13, 0x00, 0x97, 0x09, 0x06, 0x03, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, -/* 000102F0 */ 0x00, 0x00, 0x00, 0x09, 0x09, 0x0C, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, -/* 00010300 */ 0x00, 0x00, 0x05, 0x09, 0x47, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, -/* 00010310 */ 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3C, -/* 00010320 */ 0x00, 0x00, 0x00, 0x0B, 0x4B, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x0B, 0x0B, -/* 00010330 */ 0x5C, 0x01, 0x0B, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x97, 0x09, 0x09, -/* 00010340 */ 0x04, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x8E, 0x01, 0x00, -/* 00010350 */ 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, -/* 00010360 */ 0x00, 0x00, 0xFE, 0x37, 0x02, 0x00, 0x09, 0xFE, 0x51, 0x03, 0x00, 0xFE, 0x95, 0x31, 0x0D, 0x04, -/* 00010370 */ 0x00, 0x00, 0x00, 0x13, 0x00, 0x2B, 0x00, 0x0F, 0x00, 0x33, 0x00, 0x13, 0x00, 0x26, 0x00, 0x13, -/* 00010380 */ 0x00, 0x29, 0x00, 0x14, 0x00, 0x33, 0x00, 0x19, 0x00, 0x2C, 0x00, 0x2D, 0x00, 0x4D, 0x00, 0x07, -/* 00010390 */ 0x00, 0x5B, 0x00, 0x13, 0x00, 0x49, 0x00, 0x0F, 0x00, 0xCB, 0x00, 0x47, 0x00, 0x6D, 0x00, 0x11, -/* 000103A0 */ 0x00, 0x24, 0x00, 0x00, 0xBF, 0xFC, 0x03, 0x0C, 0x0F, 0xFC, 0x07, 0xFE, 0x27, 0x03, 0xFE, 0x1E, -/* 000103B0 */ 0x01, 0x19, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x11, 0x00, 0xFE, 0x5C, 0x2E, 0xFF, 0x00, 0x10, 0x01, -/* 000103C0 */ 0x00, 0x05, 0x05, 0xFE, 0x5C, 0x2E, 0xFE, 0x91, 0x02, 0xFE, 0x91, 0x02, 0x01, 0x0C, 0x06, 0x10, -/* 000103D0 */ 0x06, 0x3E, 0x33, 0x15, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000103E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000103F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x6C, 0xB7, 0x00, 0x02, 0x00, -/* 00010400 */ 0xFE, 0x50, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xE0, 0xA8, -/* 00010410 */ 0x0D, 0xA8, 0x0E, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x10, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00010420 */ 0x2C, 0x00, 0x00, 0x00, 0x11, 0x47, 0x10, 0x11, 0x09, 0x0D, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00010430 */ 0x2B, 0x00, 0x00, 0x00, 0x11, 0x47, 0x10, 0x11, 0x47, 0x0A, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00010440 */ 0x0B, 0x00, 0x00, 0x00, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x1F, 0x02, -/* 00010450 */ 0x10, 0x10, 0x47, 0x0B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0x1F, 0x01, 0x10, 0x09, 0x47, -/* 00010460 */ 0x0C, 0x10, 0xA8, 0x10, 0x15, 0x03, 0x00, 0x0B, 0x10, 0x09, 0x06, 0x00, 0x47, 0x10, 0x0B, 0x09, -/* 00010470 */ 0x03, 0x00, 0x47, 0x10, 0x04, 0x47, 0x0B, 0x10, 0x47, 0x0D, 0x04, 0xEA, 0x00, 0x12, 0x03, 0x00, -/* 00010480 */ 0x0D, 0x0B, 0x09, 0x41, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x10, 0x07, -/* 00010490 */ 0x05, 0x00, 0x5C, 0x00, 0x03, 0x97, 0x11, 0x06, 0x0D, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x5C, -/* 000104A0 */ 0x03, 0x08, 0x5C, 0x04, 0x0C, 0x1F, 0x05, 0x10, 0x10, 0x47, 0x0E, 0x10, 0x61, 0x10, 0x0E, 0x00, -/* 000104B0 */ 0xA8, 0x11, 0x15, 0x03, 0x00, 0x10, 0x11, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0E, 0x09, 0x2D, 0x00, -/* 000104C0 */ 0x28, 0x0D, 0x0D, 0x09, 0xB5, 0xFF, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x10, -/* 000104D0 */ 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0A, 0xA8, 0x11, 0x5C, 0x03, -/* 000104E0 */ 0x11, 0x5C, 0x04, 0x0C, 0x1F, 0x05, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, -/* 000104F0 */ 0x00, 0xFE, 0x1F, 0x02, 0x00, 0xFE, 0xAB, 0x2E, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x58, -/* 00010500 */ 0x00, 0x1A, 0x00, 0x34, 0x00, 0x0D, 0x00, 0x32, 0x00, 0x16, 0x00, 0x39, 0x00, 0x05, 0x00, 0x0B, -/* 00010510 */ 0x00, 0x08, 0x00, 0x1F, 0x00, 0x27, 0x00, 0x69, 0x00, 0x0E, 0x00, 0x35, 0x00, 0x06, 0x00, 0x4F, -/* 00010520 */ 0xFF, 0x06, 0x00, 0xE2, 0x00, 0x27, 0x00, 0x51, 0x00, 0x00, 0x3F, 0xFD, 0x02, 0x04, 0xCF, 0xFD, -/* 00010530 */ 0x0F, 0xFE, 0x26, 0x03, 0xE6, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0E, 0x00, 0xFE, 0xB0, 0x24, -/* 00010540 */ 0x02, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0xB0, 0x24, 0xFE, 0x91, 0x09, 0xFE, 0x91, -/* 00010550 */ 0x09, 0x03, 0x0E, 0x0B, 0x15, 0x05, 0x71, 0x6A, 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, -/* 00010560 */ 0x01, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, -/* 00010570 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -/* 00010580 */ 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0x02, 0x00, 0xFE, 0x48, 0x03, 0x02, 0x01, 0xFE, 0x49, -/* 00010590 */ 0x03, 0x02, 0x01, 0xFE, 0x4A, 0x03, 0x02, 0x01, 0xFE, 0x4B, 0x03, 0xFE, 0xE8, 0x01, 0x96, 0x03, -/* 000105A0 */ 0x00, 0x00, 0x00, 0x0B, 0x96, 0x04, 0x00, 0x00, 0x00, 0x0D, 0x4F, 0x11, 0x8E, 0x01, 0x00, 0x00, -/* 000105B0 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x6C, 0x16, 0x17, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x17, -/* 000105C0 */ 0x92, 0x03, 0x00, 0x00, 0x00, 0x18, 0x5C, 0x01, 0x18, 0x1F, 0x02, 0x16, 0x16, 0x47, 0x0F, 0x16, -/* 000105D0 */ 0x14, 0x03, 0x00, 0x0F, 0x02, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, -/* 000105E0 */ 0x00, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x92, 0x03, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, -/* 000105F0 */ 0x17, 0x1F, 0x02, 0x16, 0x16, 0x47, 0x0F, 0x16, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x2D, 0x00, 0x8E, -/* 00010600 */ 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, -/* 00010610 */ 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, -/* 00010620 */ 0x00, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x03, 0x17, 0x1F, 0x04, 0xFF, 0x16, 0x8E, 0x01, 0x00, 0x00, -/* 00010630 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x17, 0x6C, 0x16, 0x17, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, -/* 00010640 */ 0x92, 0x03, 0x00, 0x00, 0x00, 0x18, 0x5C, 0x01, 0x18, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, 0x1F, -/* 00010650 */ 0x03, 0x16, 0x16, 0x97, 0x16, 0x16, 0x04, 0x96, 0x03, 0x00, 0x00, 0x00, 0x16, 0x07, 0x03, 0x00, -/* 00010660 */ 0x5C, 0x00, 0x03, 0x92, 0x03, 0x00, 0x00, 0x00, 0x16, 0x5C, 0x01, 0x16, 0x5C, 0x02, 0x0E, 0x1F, -/* 00010670 */ 0x03, 0x16, 0x0C, 0x47, 0x10, 0x16, 0x92, 0x04, 0x00, 0x00, 0x00, 0x16, 0xA8, 0x17, 0x15, 0x03, -/* 00010680 */ 0x00, 0x16, 0x17, 0x09, 0x3F, 0x00, 0xCD, 0x16, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x16, 0x8E, -/* 00010690 */ 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, -/* 000106A0 */ 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, -/* 000106B0 */ 0x01, 0x00, 0x00, 0x00, 0x17, 0x5C, 0x03, 0x17, 0x1F, 0x04, 0xFF, 0x16, 0x92, 0x02, 0x00, 0x00, -/* 000106C0 */ 0x00, 0x16, 0x47, 0x0F, 0x16, 0x54, 0x11, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x78, 0x00, 0x0F, -/* 000106D0 */ 0x03, 0x00, 0x0F, 0x09, 0x3D, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x16, -/* 000106E0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x16, 0x16, 0x11, 0x03, 0x00, -/* 000106F0 */ 0x16, 0x05, 0x09, 0x1E, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x16, 0x4B, -/* 00010700 */ 0x16, 0x0F, 0x03, 0x00, 0x16, 0x09, 0x07, 0x00, 0x2F, 0x10, 0x10, 0x06, 0x09, 0x04, 0x00, 0x2F, -/* 00010710 */ 0x10, 0x10, 0x07, 0x47, 0x16, 0x10, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x17, -/* 00010720 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x18, -/* 00010730 */ 0x5C, 0x01, 0x18, 0x5C, 0x02, 0x0F, 0x5C, 0x03, 0x06, 0x1F, 0x04, 0x17, 0x17, 0x2F, 0x16, 0x16, -/* 00010740 */ 0x17, 0x47, 0x10, 0x16, 0x09, 0x05, 0x00, 0xA8, 0x16, 0x47, 0x10, 0x16, 0x8E, 0x01, 0x00, 0x00, -/* 00010750 */ 0x00, 0x0A, 0x00, 0x00, 0x00, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCC, 0x00, 0x00, 0x00, -/* 00010760 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x7A, 0x10, 0x17, 0x02, 0x7A, 0x0F, 0x17, -/* 00010770 */ 0x03, 0x7A, 0x11, 0x17, 0x04, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x00, 0x16, 0x09, -/* 00010780 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, -/* 00010790 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x6D, 0x02, 0x00, -/* 000107A0 */ 0x00, 0x00, 0xFE, 0x2C, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x1F, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x6D, -/* 000107B0 */ 0x02, 0xFE, 0x4C, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x4D, 0x03, 0x00, 0x0D, 0xFE, 0x4E, 0x03, 0x00, -/* 000107C0 */ 0xFE, 0xF4, 0x24, 0x15, 0x0E, 0x00, 0x00, 0x00, 0x24, 0x00, 0x36, 0x00, 0x08, 0x00, 0x81, 0x00, -/* 000107D0 */ 0x20, 0x00, 0x3A, 0x00, 0x07, 0x00, 0x1B, 0x00, 0x2D, 0x00, 0x53, 0x02, 0x31, 0x00, 0x49, 0x00, -/* 000107E0 */ 0x19, 0x00, 0x37, 0x00, 0x10, 0x00, 0x50, 0x00, 0x09, 0x00, 0x1F, 0x00, 0x2D, 0x00, 0xB8, 0x01, -/* 000107F0 */ 0x09, 0x00, 0xF9, 0x00, 0x03, 0x00, 0x29, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x3E, 0x00, -/* 00010800 */ 0x13, 0x00, 0x2E, 0x00, 0x07, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x40, 0x00, 0x34, 0x00, 0x5C, 0x00, -/* 00010810 */ 0x05, 0x00, 0x29, 0x00, 0x38, 0x00, 0x99, 0x00, 0x00, 0x41, 0x09, 0x01, 0x00, 0x21, 0x08, 0x01, -/* 00010820 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x8F, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x3D, 0xFF, -/* 00010830 */ 0xA2, 0x41, 0xD1, 0x00, 0x10, 0x00, 0xFE, 0x73, 0x29, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00010840 */ 0xFE, 0x73, 0x29, 0xFE, 0x77, 0x01, 0xFE, 0x77, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, -/* 00010850 */ 0x02, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010870 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x01, 0xFF, -/* 00010880 */ 0xFF, 0xFF, 0xFF, 0x99, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, -/* 00010890 */ 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0xE0, 0x0B, 0x00, 0x5C, 0x02, -/* 000108A0 */ 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x47, 0x06, 0x09, 0x97, 0x09, 0x06, 0x02, 0x47, 0x07, 0x09, 0x8E, -/* 000108B0 */ 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, -/* 000108C0 */ 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x0A, 0x5C, 0x01, 0x0A, 0x8E, 0x01, 0x00, 0x00, -/* 000108D0 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x07, 0x1F, 0x04, 0x09, 0x09, -/* 000108E0 */ 0x15, 0x03, 0x00, 0x09, 0x04, 0x09, 0x31, 0x00, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -/* 000108F0 */ 0x00, 0x09, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, -/* 00010900 */ 0x00, 0x0A, 0x5C, 0x01, 0x0A, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x5C, -/* 00010910 */ 0x02, 0x0A, 0x5C, 0x03, 0x05, 0x1F, 0x04, 0xFF, 0x09, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, -/* 00010920 */ 0x37, 0x02, 0x00, 0x0E, 0xFE, 0x4F, 0x03, 0x00, 0xFE, 0x97, 0x29, 0x05, 0x00, 0x00, 0x00, 0x00, -/* 00010930 */ 0x24, 0x00, 0x7A, 0x00, 0x07, 0x00, 0x24, 0x00, 0x39, 0x00, 0x5F, 0x00, 0x33, 0x00, 0x55, 0x00, -/* 00010940 */ 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x3C, 0xFF, -/* 00010950 */ 0xA2, 0x41, 0xD1, 0x00, 0x0F, 0x00, 0xFE, 0x30, 0x26, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00010960 */ 0xFE, 0x30, 0x26, 0x7D, 0x7D, 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x03, 0xFF, 0xFF, -/* 00010970 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, -/* 00010980 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, -/* 00010990 */ 0x01, 0xFE, 0x46, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x04, 0x46, 0x8E, 0x02, 0x00, 0x00, 0x00, -/* 000109A0 */ 0x0C, 0x00, 0x00, 0x00, 0x07, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x02, 0x00, 0x00, 0x00, -/* 000109B0 */ 0x23, 0x00, 0x00, 0x00, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -/* 000109C0 */ 0x00, 0x08, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, 0x5C, 0x04, 0x03, 0x1F, -/* 000109D0 */ 0x05, 0x07, 0x07, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0xA8, 0x00, 0x24, -/* 000109E0 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x54, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x58, 0x00, -/* 000109F0 */ 0x00, 0x3F, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x0F, 0xFE, 0x25, 0x03, 0xCD, 0x1E, 0xFF, 0xA2, 0x41, -/* 00010A00 */ 0xC1, 0x00, 0x0C, 0x00, 0xFE, 0x7F, 0x20, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, -/* 00010A10 */ 0x7F, 0x20, 0xFE, 0x11, 0x04, 0xFE, 0x11, 0x04, 0x07, 0x05, 0x09, 0x04, 0x2A, 0x29, 0x01, 0x03, -/* 00010A20 */ 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010A30 */ 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010A40 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, -/* 00010A50 */ 0x9D, 0x4F, 0x06, 0x4F, 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x09, 0x4B, -/* 00010A60 */ 0x09, 0x0F, 0x17, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -/* 00010A70 */ 0x00, 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x00, 0x00, -/* 00010A80 */ 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, -/* 00010A90 */ 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0B, 0x4B, 0x0B, 0x5C, -/* 00010AA0 */ 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x54, 0x06, 0x09, 0x0F, 0x08, 0x00, 0x06, 0x09, 0x00, 0x00, -/* 00010AB0 */ 0xA8, 0x00, 0x09, 0x37, 0x00, 0x97, 0x0B, 0x06, 0x03, 0x6C, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, -/* 00010AC0 */ 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x0A, 0x0A, 0x6C, 0x09, 0x0A, 0x02, 0x07, 0x02, -/* 00010AD0 */ 0x00, 0x5C, 0x00, 0x0A, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x5C, 0x01, 0x0B, 0x1F, 0x02, 0x09, -/* 00010AE0 */ 0x09, 0x54, 0x07, 0x09, 0x47, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 00010AF0 */ 0xFE, 0x37, 0x02, 0xFE, 0x75, 0x01, 0xAF, 0x00, 0xFE, 0x9B, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, -/* 00010B00 */ 0x13, 0x00, 0x24, 0x00, 0x14, 0x00, 0x2B, 0x00, 0x2D, 0x00, 0x4B, 0x00, 0x07, 0x00, 0x1A, 0x00, -/* 00010B10 */ 0x05, 0x00, 0x5C, 0x02, 0x2F, 0x00, 0xCD, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0x21, 0x0B, 0x01, -/* 00010B20 */ 0x00, 0xBF, 0xDC, 0x02, 0x00, 0x00, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x36, 0xFF, -/* 00010B30 */ 0xA2, 0x41, 0xD0, 0x00, 0x0D, 0xFE, 0x01, 0x10, 0xFE, 0xD9, 0x23, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 00010B40 */ 0x02, 0x02, 0xFE, 0xD9, 0x23, 0x0A, 0x0A, 0x01, 0x02, 0x02, 0x03, 0x0A, 0x0A, 0x01, 0xFF, 0xFF, -/* 00010B50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010B60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010B70 */ 0xFF, 0x00, 0x00, 0x17, 0xAC, 0x03, 0x0F, 0x02, 0x00, 0x02, 0xAB, 0x03, 0xAC, 0x00, 0x0F, 0x02, -/* 00010B80 */ 0x00, 0x03, 0xAB, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xE0, -/* 00010B90 */ 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, -/* 00010BA0 */ 0xFD, 0x07, 0xFE, 0x47, 0x03, 0xB6, 0x1E, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0B, 0x00, 0xFE, 0xEC, -/* 00010BB0 */ 0x1B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xEC, 0x1B, 0xFE, 0x73, 0x04, 0xFE, 0x73, -/* 00010BC0 */ 0x04, 0x01, 0x09, 0x09, 0x0D, 0x04, 0x58, 0x4C, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0xFF, -/* 00010BD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, -/* 00010BE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x01, 0x01, -/* 00010BF0 */ 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0x02, 0x01, 0xFE, -/* 00010C00 */ 0xF6, 0x02, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x58, 0x01, 0x4F, 0x0A, 0x4F, 0x0B, 0x8E, 0x01, -/* 00010C10 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0F, 0x61, 0x0F, 0x0F, 0x00, 0x6C, 0x0E, 0x0F, 0x01, -/* 00010C20 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x0A, 0x0E, -/* 00010C30 */ 0xA8, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0x05, 0x01, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 00010C40 */ 0x00, 0x00, 0x00, 0x0F, 0x6C, 0x0E, 0x0F, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, -/* 00010C50 */ 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x0A, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x9B, 0x00, -/* 00010C60 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0E, 0x4B, 0x0E, 0x0F, 0x17, 0x00, 0x0E, -/* 00010C70 */ 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x01, 0x00, -/* 00010C80 */ 0x5C, 0x00, 0x03, 0x1F, 0x01, 0xFF, 0x0E, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00010C90 */ 0x0F, 0x6C, 0x0E, 0x0F, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x8E, 0x01, -/* 00010CA0 */ 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x10, 0x4B, 0x10, 0x5C, 0x02, 0x10, 0x1F, 0x03, 0x0E, -/* 00010CB0 */ 0x0E, 0x47, 0x0B, 0x0E, 0x97, 0x0E, 0x0B, 0x04, 0x97, 0x0F, 0x0B, 0x05, 0x0F, 0x03, 0x00, 0x0F, -/* 00010CC0 */ 0x09, 0x0E, 0x00, 0x97, 0x10, 0x0B, 0x05, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, -/* 00010CD0 */ 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x97, 0x0F, 0x0B, 0x08, 0x0F, 0x03, 0x00, 0x0F, -/* 00010CE0 */ 0x09, 0x0E, 0x00, 0x97, 0x10, 0x0B, 0x08, 0x2F, 0x10, 0x06, 0x10, 0x47, 0x0F, 0x10, 0x09, 0x03, -/* 00010CF0 */ 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x47, 0x0A, 0x0E, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00010D00 */ 0x09, 0x00, 0x00, 0x00, 0x0F, 0x61, 0x0F, 0x0F, 0x00, 0x6C, 0x0E, 0x0F, 0x04, 0x07, 0x03, 0x00, -/* 00010D10 */ 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0A, 0x10, 0x09, 0x12, 0x00, -/* 00010D20 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x47, 0x10, 0x11, 0x09, -/* 00010D30 */ 0x03, 0x00, 0x47, 0x10, 0x0A, 0x5C, 0x02, 0x10, 0x1F, 0x03, 0xFF, 0x0E, 0x09, 0x19, 0x00, 0x8E, -/* 00010D40 */ 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0E, 0x4B, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, -/* 00010D50 */ 0x09, 0x05, 0x00, 0xA8, 0x0E, 0x47, 0x0A, 0x0E, 0x47, 0x00, 0x0A, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 00010D60 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x04, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0x29, 0x02, 0xFE, 0x37, 0x02, -/* 00010D70 */ 0xFE, 0xB8, 0x01, 0x00, 0xFE, 0x16, 0x1C, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x22, 0x00, 0x53, 0x00, -/* 00010D80 */ 0x0A, 0x00, 0x30, 0x00, 0x1E, 0x00, 0x51, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x13, 0x00, 0x2D, 0x00, -/* 00010D90 */ 0x14, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0xB1, 0x00, 0x47, 0x00, 0x34, 0x01, 0x44, 0x00, 0x80, 0x00, -/* 00010DA0 */ 0x14, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x1B, 0x00, 0x00, 0xBF, 0xFC, 0x02, -/* 00010DB0 */ 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x45, 0x03, 0x9B, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x0A, 0x00, -/* 00010DC0 */ 0xFE, 0x46, 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x46, 0x17, 0xFE, 0x86, 0x04, -/* 00010DD0 */ 0xFE, 0x86, 0x04, 0x01, 0x0A, 0x09, 0x0E, 0x04, 0x61, 0x54, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, -/* 00010DE0 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00010DF0 */ 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, -/* 00010E00 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFE, 0x46, 0x03, 0x02, -/* 00010E10 */ 0x01, 0xFE, 0xF6, 0x02, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x77, 0x01, 0x4F, 0x0C, 0x8E, 0x01, -/* 00010E20 */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x61, 0x10, 0x10, 0x00, 0x6C, 0x0F, 0x10, 0x01, -/* 00010E30 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0B, 0x0F, -/* 00010E40 */ 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0x05, 0x01, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, -/* 00010E50 */ 0x00, 0x00, 0x00, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, -/* 00010E60 */ 0x09, 0x1F, 0x02, 0x0F, 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x9B, 0x00, -/* 00010E70 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x0F, 0x17, 0x00, 0x0F, -/* 00010E80 */ 0x09, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x01, 0x00, -/* 00010E90 */ 0x5C, 0x00, 0x03, 0x1F, 0x01, 0xFF, 0x0F, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00010EA0 */ 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x8E, 0x01, -/* 00010EB0 */ 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x11, 0x4B, 0x11, 0x5C, 0x02, 0x11, 0x1F, 0x03, 0x0F, -/* 00010EC0 */ 0x0F, 0x47, 0x0C, 0x0F, 0x97, 0x0F, 0x0C, 0x04, 0x97, 0x10, 0x0C, 0x05, 0x0F, 0x03, 0x00, 0x10, -/* 00010ED0 */ 0x09, 0x0E, 0x00, 0x97, 0x11, 0x0C, 0x05, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, -/* 00010EE0 */ 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x97, 0x10, 0x0C, 0x08, 0x0F, 0x03, 0x00, 0x10, -/* 00010EF0 */ 0x09, 0x0E, 0x00, 0x97, 0x11, 0x0C, 0x08, 0x2F, 0x11, 0x06, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, -/* 00010F00 */ 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x47, 0x0B, 0x0F, 0x8E, 0x01, 0x00, 0x00, 0x00, -/* 00010F10 */ 0x09, 0x00, 0x00, 0x00, 0x10, 0x61, 0x10, 0x10, 0x00, 0x6C, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, -/* 00010F20 */ 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0xA8, 0x11, 0x14, 0x03, 0x00, 0x0B, 0x11, 0x09, 0x12, 0x00, -/* 00010F30 */ 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x12, 0x4B, 0x12, 0x47, 0x11, 0x12, 0x09, -/* 00010F40 */ 0x03, 0x00, 0x47, 0x11, 0x0B, 0x5C, 0x02, 0x11, 0x1F, 0x03, 0xFF, 0x0F, 0x09, 0x19, 0x00, 0x8E, -/* 00010F50 */ 0x01, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0F, 0x4B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, -/* 00010F60 */ 0x09, 0x05, 0x00, 0xA8, 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0A, 0x09, 0x09, 0x09, 0x00, -/* 00010F70 */ 0x47, 0x00, 0x0B, 0x09, 0x1B, 0x00, 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x0B, 0x09, 0x08, -/* 00010F80 */ 0x00, 0xA8, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, -/* 00010F90 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x05, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0x2A, 0x02, 0xFE, 0x37, -/* 00010FA0 */ 0x02, 0xFE, 0xB8, 0x01, 0x00, 0xFE, 0x71, 0x17, 0x11, 0x02, 0x00, 0x00, 0x00, 0x22, 0x00, 0x46, -/* 00010FB0 */ 0x00, 0x0A, 0x00, 0x30, 0x00, 0x1E, 0x00, 0x44, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x13, 0x00, 0x2D, -/* 00010FC0 */ 0x00, 0x14, 0x00, 0x3A, 0x00, 0x2D, 0x00, 0x52, 0x00, 0x47, 0x00, 0x0C, 0x01, 0x44, 0x00, 0x73, -/* 00010FD0 */ 0x00, 0x14, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x26, -/* 00010FE0 */ 0x00, 0x08, 0x00, 0x34, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x25, 0x00, 0x00, 0xBF, 0xFC, -/* 00010FF0 */ 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x24, 0x03, 0x97, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x09, -/* 00011000 */ 0x00, 0xFE, 0xD3, 0x16, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xD3, 0x16, 0x51, 0x51, -/* 00011010 */ 0x01, 0x05, 0x02, 0x05, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, -/* 00011020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, -/* 00011030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x25, 0x8E, -/* 00011040 */ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x6C, 0x05, 0x06, 0x00, 0x07, 0x03, 0x00, -/* 00011050 */ 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x00, 0x05, 0x09, 0x02, 0x00, -/* 00011060 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0xA5, 0x02, 0x00, 0xFE, 0xF0, 0x16, 0x02, 0x00, 0x00, -/* 00011070 */ 0x00, 0x00, 0x23, 0x00, 0x33, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x00, 0x0F, 0xFC, 0x07, 0xFE, 0x23, -/* 00011080 */ 0x03, 0x91, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x08, 0x00, 0xFE, 0x39, 0x16, 0xFF, 0x00, 0x10, -/* 00011090 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x39, 0x16, 0x7B, 0x7B, 0x41, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, -/* 000110A0 */ 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000110B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000110C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x0A, 0x80, 0x01, 0x07, -/* 000110D0 */ 0x00, 0x0A, 0x80, 0x1E, 0x61, 0x05, 0x04, 0x00, 0x14, 0x0F, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, -/* 000110E0 */ 0x61, 0x05, 0x04, 0x00, 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, 0x02, 0x00, 0x23, 0x04, 0xA8, 0x00, -/* 000110F0 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2E, 0x01, 0x00, 0xFE, 0x51, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, -/* 00011100 */ 0x18, 0x00, 0x4A, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0xBF, 0xFC, 0x03, 0x08, 0x00, 0xFC, 0x07, -/* 00011110 */ 0xFE, 0x22, 0x03, 0x86, 0x1B, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x07, 0x00, 0xFE, 0xE0, 0x14, 0xFF, -/* 00011120 */ 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xE0, 0x14, 0xD5, 0xD5, 0x41, 0x06, 0x05, 0x09, 0x03, -/* 00011130 */ 0x13, 0x11, 0x0E, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011150 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x05, 0x34, 0x00, 0x01, 0x00, 0x00, 0x00, -/* 00011160 */ 0x00, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x38, 0x4F, 0x08, 0x47, 0x08, 0x02, 0xEA, 0x00, 0x12, -/* 00011170 */ 0x03, 0x00, 0x08, 0x06, 0x09, 0x25, 0x00, 0xBA, 0x09, 0x08, 0x05, 0x0F, 0x03, 0x00, 0x09, 0x09, -/* 00011180 */ 0x14, 0x00, 0x47, 0x09, 0x07, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x97, 0x0A, 0x05, 0x08, 0x5C, -/* 00011190 */ 0x01, 0x0A, 0x1F, 0x02, 0xFF, 0x09, 0x28, 0x08, 0x08, 0x09, 0xD1, 0xFF, 0xA8, 0x00, 0x24, 0x00, -/* 000111A0 */ 0x00, 0x00, 0x00, 0xFE, 0x07, 0x15, 0x06, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x08, -/* 000111B0 */ 0x00, 0x20, 0x00, 0x0B, 0x00, 0x26, 0x00, 0x14, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, -/* 000111C0 */ 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFD, 0x07, 0xFE, 0x35, 0x03, 0x79, 0x22, 0xFF, 0xA2, 0x41, 0xC1, -/* 000111D0 */ 0x00, 0x06, 0x00, 0xFE, 0x57, 0x13, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x57, 0x13, -/* 000111E0 */ 0xFE, 0x6B, 0x01, 0xFE, 0x6B, 0x01, 0x01, 0x08, 0x04, 0x08, 0x04, 0x2A, 0x27, 0x01, 0x03, 0x02, -/* 000111F0 */ 0x02, 0x02, 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011200 */ 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, -/* 00011210 */ 0x00, 0x03, 0x04, 0x9E, 0x4F, 0x05, 0x4F, 0x06, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, -/* 00011220 */ 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x1F, -/* 00011230 */ 0x02, 0x09, 0x09, 0x47, 0x05, 0x09, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x6A, 0x00, 0x8E, 0x01, -/* 00011240 */ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x09, 0x0F, 0x17, 0x00, 0x09, 0x09, 0x00, -/* 00011250 */ 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, -/* 00011260 */ 0x03, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, -/* 00011270 */ 0x09, 0x0A, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x8E, 0x01, 0x00, 0x00, -/* 00011280 */ 0x00, 0x44, 0x00, 0x00, 0x00, 0x0B, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x47, -/* 00011290 */ 0x06, 0x09, 0xAC, 0x09, 0x0F, 0x02, 0x00, 0x06, 0xAB, 0x09, 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x09, -/* 000112A0 */ 0xAB, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, -/* 000112B0 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x26, 0x02, 0xFE, 0x37, 0x02, 0x00, 0xFE, 0x74, 0x13, 0x08, 0x04, -/* 000112C0 */ 0x00, 0x00, 0x00, 0x1E, 0x00, 0x40, 0x00, 0x08, 0x00, 0x23, 0x00, 0x13, 0x00, 0x24, 0x00, 0x14, -/* 000112D0 */ 0x00, 0x32, 0x00, 0x2D, 0x00, 0x4A, 0x00, 0x16, 0x00, 0x2D, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, -/* 000112E0 */ 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x34, 0x03, 0x6C, 0x1F, 0xFF, 0xA2, 0x41, 0xC1, -/* 000112F0 */ 0x00, 0x05, 0x00, 0xFE, 0x48, 0x11, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x48, 0x11, -/* 00011300 */ 0xFE, 0xEA, 0x01, 0xFE, 0xEA, 0x01, 0x41, 0x06, 0x05, 0x09, 0x04, 0x14, 0x12, 0x01, 0x01, 0x03, -/* 00011310 */ 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011320 */ 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011330 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0x01, 0xFE, 0xF6, 0x02, 0x02, 0x00, 0xFE, 0x44, 0x03, 0x45, -/* 00011340 */ 0x4F, 0x07, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x6C, 0x09, 0x0A, 0x00, -/* 00011350 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0x09, 0x09, -/* 00011360 */ 0x47, 0x07, 0x09, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x16, 0x00, 0x76, 0x03, 0x05, 0x01, 0x47, -/* 00011370 */ 0x09, 0x05, 0xCD, 0x0A, 0x02, 0xA1, 0x00, 0x04, 0x0A, 0xA1, 0x01, 0x03, 0x0A, 0x76, 0x0A, 0x09, -/* 00011380 */ 0x02, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2F, 0x02, 0xFE, 0x12, 0x02, 0xFE, 0x25, 0x02, -/* 00011390 */ 0x00, 0xFE, 0x77, 0x11, 0x05, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x4F, 0x00, 0x08, 0x00, 0x71, -/* 000113A0 */ 0x00, 0x04, 0x00, 0x33, 0x00, 0x14, 0x00, 0xC7, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, -/* 000113B0 */ 0x07, 0xFE, 0x33, 0x03, 0x63, 0x1C, 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x04, 0x00, 0xFE, 0x05, 0x10, -/* 000113C0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x05, 0x10, 0xFE, 0x21, 0x01, 0xFE, 0x21, 0x01, -/* 000113D0 */ 0x41, 0x05, 0x04, 0x07, 0x03, 0x0E, 0x0D, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, -/* 000113E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, -/* 000113F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, -/* 00011400 */ 0x01, 0xFE, 0xF6, 0x02, 0x30, 0x4F, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -/* 00011410 */ 0x08, 0x6C, 0x07, 0x08, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x04, 0x1F, 0x02, -/* 00011420 */ 0x07, 0x07, 0x47, 0x05, 0x07, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x04, 0x00, 0x76, 0x03, 0x04, -/* 00011430 */ 0x01, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x2E, 0x02, 0xFE, 0x12, 0x02, 0x00, 0xFE, 0x27, -/* 00011440 */ 0x10, 0x04, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x71, 0x00, 0x06, 0x00, -/* 00011450 */ 0x4E, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x0F, 0xFC, 0x07, 0xFE, 0x32, 0x03, 0x52, 0x1D, 0xFF, -/* 00011460 */ 0xA0, 0x41, 0xC1, 0x00, 0x03, 0x00, 0xFE, 0x1D, 0x0E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 00011470 */ 0xFE, 0x1D, 0x0E, 0xFE, 0xC9, 0x01, 0xFE, 0xC9, 0x01, 0x01, 0x04, 0x03, 0x05, 0x02, 0x1D, 0x1D, -/* 00011480 */ 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 00011490 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -/* 000114A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0x43, 0x03, 0x89, 0x4F, 0x03, 0x8E, -/* 000114B0 */ 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x05, 0x4B, 0x05, 0x0F, 0x03, 0x00, 0x05, 0x09, -/* 000114C0 */ 0x24, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x05, 0x61, 0x05, 0x05, 0x00, -/* 000114D0 */ 0x0F, 0x03, 0x00, 0x05, 0x09, 0x0F, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, -/* 000114E0 */ 0x00, 0x4B, 0x00, 0x09, 0x4E, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, -/* 000114F0 */ 0x6C, 0x05, 0x06, 0x01, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x06, 0x1F, 0x01, 0x05, 0x05, 0x54, 0x03, -/* 00011500 */ 0x05, 0x0F, 0x12, 0x00, 0x03, 0x09, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3B, -/* 00011510 */ 0x00, 0x00, 0x00, 0x02, 0x09, 0x0C, 0x00, 0x01, 0x32, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, -/* 00011520 */ 0x00, 0x00, 0x03, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x09, -/* 00011530 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x03, 0xFE, 0x2B, 0x02, 0x00, 0xFE, -/* 00011540 */ 0x33, 0x0E, 0x08, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x39, 0x00, 0x0F, 0x00, 0x2B, 0x00, 0x1B, -/* 00011550 */ 0x00, 0x34, 0x00, 0x07, 0x00, 0x9C, 0x00, 0x0F, 0x00, 0x35, 0x00, 0x0C, 0x00, 0x2D, 0x00, 0x11, -/* 00011560 */ 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x04, 0x00, 0xFC, 0x07, 0xFE, 0x17, 0x03, 0x3B, 0x1F, -/* 00011570 */ 0xFF, 0xA2, 0x41, 0xC1, 0x00, 0x02, 0x00, 0xFE, 0xC9, 0x09, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, -/* 00011580 */ 0x04, 0xFE, 0xC9, 0x09, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, 0x02, 0xFF, -/* 00011590 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, -/* 000115A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -/* 000115B0 */ 0x03, 0x04, 0x3B, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x08, 0x07, 0x04, 0x00, -/* 000115C0 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, -/* 000115D0 */ 0x00, 0x00, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x02, 0x1F, -/* 000115E0 */ 0x03, 0x09, 0x09, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, -/* 000115F0 */ 0x00, 0xFE, 0xF4, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x46, 0x00, 0x00}; +/* 00003050 */ 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, +/* 00003060 */ 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, +/* 00003070 */ 0x31, 0x00, 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, +/* 00003080 */ 0x2E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x5C, 0x00, +/* 00003090 */ 0x2E, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x61, 0x00, 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, +/* 000030A0 */ 0x29, 0x00, 0x28, 0x00, 0x3F, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x30, 0x00, +/* 000030B0 */ 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, 0x7D, 0x00, +/* 000030C0 */ 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, +/* 000030D0 */ 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000030E0 */ 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, +/* 000030F0 */ 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, +/* 00003100 */ 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, +/* 00003110 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2F, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, +/* 00003120 */ 0x2F, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2F, 0x00, +/* 00003130 */ 0x73, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x2F, 0x00, 0x6D, 0x00, +/* 00003140 */ 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00003150 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, +/* 00003160 */ 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, +/* 00003170 */ 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, +/* 00003180 */ 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x75, 0x00, +/* 00003190 */ 0x74, 0x00, 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, +/* 000031A0 */ 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, +/* 000031B0 */ 0x72, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 000031C0 */ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x69, 0x00, +/* 000031D0 */ 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, +/* 000031E0 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, +/* 000031F0 */ 0x6B, 0x00, 0x00, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, +/* 00003200 */ 0x77, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x72, 0x00, +/* 00003210 */ 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x20, 0x00, +/* 00003220 */ 0x77, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x73, 0x00, 0x20, 0x00, +/* 00003230 */ 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00003240 */ 0x20, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3B, 0x00, 0x20, 0x00, 0x72, 0x00, +/* 00003250 */ 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x78, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, +/* 00003260 */ 0x75, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, +/* 00003270 */ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00003280 */ 0x2E, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, +/* 00003290 */ 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x28, 0x00, 0x32, 0x00, 0x29, 0x00, 0x7D, 0x00, +/* 000032A0 */ 0x00, 0x00, 0x7B, 0x00, 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x66, 0x00, +/* 000032B0 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 000032C0 */ 0x65, 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7B, 0x00, +/* 000032D0 */ 0x79, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x5C, 0x00, 0x2E, 0x00, 0x5B, 0x00, 0x61, 0x00, +/* 000032E0 */ 0x2D, 0x00, 0x7A, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x28, 0x00, 0x5C, 0x00, 0x28, 0x00, 0x5B, 0x00, +/* 000032F0 */ 0x30, 0x00, 0x2D, 0x00, 0x39, 0x00, 0x5D, 0x00, 0x5C, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3F, 0x00, +/* 00003300 */ 0x5C, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, +/* 00003310 */ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, +/* 00003320 */ 0x64, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, +/* 00003330 */ 0x74, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5A, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, +/* 00003340 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x75, 0x00, +/* 00003350 */ 0x72, 0x00, 0x31, 0x00, 0x32, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, +/* 00003360 */ 0x61, 0x00, 0x74, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, +/* 00003370 */ 0x72, 0x00, 0x00, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, +/* 00003380 */ 0x31, 0x00, 0x32, 0x00, 0x48, 0x00, 0x6F, 0x00, 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, +/* 00003390 */ 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x48, 0x00, 0x6F, 0x00, +/* 000033A0 */ 0x75, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x00, 0x00, +/* 000033B0 */ 0x6E, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x76, 0x00, +/* 000033C0 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000033D0 */ 0x65, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 000033E0 */ 0x31, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 000033F0 */ 0x32, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 00003400 */ 0x6C, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 00003410 */ 0x5F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00003420 */ 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, +/* 00003430 */ 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, +/* 00003440 */ 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x5F, 0x00, +/* 00003450 */ 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, +/* 00003460 */ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, +/* 00003470 */ 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, +/* 00003480 */ 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +/* 00003490 */ 0x74, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, +/* 000034A0 */ 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, +/* 000034B0 */ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x65, 0x00, 0x6E, 0x00, +/* 000034C0 */ 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, +/* 000034D0 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 000034E0 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, +/* 000034F0 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 00003500 */ 0x65, 0x00, 0x2E, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 00003510 */ 0x00, 0x00, 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, +/* 00003520 */ 0x65, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x74, 0x00, 0x2E, 0x00, +/* 00003530 */ 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, +/* 00003540 */ 0x65, 0x00, 0x2E, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x76, 0x00, +/* 00003550 */ 0x65, 0x00, 0x64, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, +/* 00003560 */ 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, +/* 00003570 */ 0x61, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x00, 0x00, +/* 00003580 */ 0xFE, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, +/* 00003590 */ 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x8F, +/* 000035A0 */ 0x01, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x5B, +/* 000035B0 */ 0x02, 0x00, 0x00, 0x7A, 0x02, 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0xAF, 0x02, 0x00, 0x00, 0xE8, +/* 000035C0 */ 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x00, 0x00, 0x63, +/* 000035D0 */ 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xFB, +/* 000035E0 */ 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x5E, 0x04, 0x00, 0x00, 0x5F, 0x04, 0x00, 0x00, 0x70, +/* 000035F0 */ 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0xDA, +/* 00003600 */ 0x04, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x79, +/* 00003610 */ 0x05, 0x00, 0x00, 0x9B, 0x05, 0x00, 0x00, 0xBD, 0x05, 0x00, 0x00, 0xDF, 0x05, 0x00, 0x00, 0x01, +/* 00003620 */ 0x06, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x5C, +/* 00003630 */ 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0xA7, 0x06, 0x00, 0x00, 0xCD, +/* 00003640 */ 0x06, 0x00, 0x00, 0xF7, 0x06, 0x00, 0x00, 0x1D, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x50, +/* 00003650 */ 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x53, +/* 00003660 */ 0x08, 0x00, 0x00, 0xAF, 0x08, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0xAA, +/* 00003670 */ 0x09, 0x00, 0x00, 0xEC, 0x09, 0x00, 0x00, 0x36, 0x0A, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x00, 0x3E, +/* 00003680 */ 0x0A, 0x00, 0x00, 0x8A, 0x0A, 0x00, 0x00, 0xD6, 0x0A, 0x00, 0x00, 0x1C, 0x0B, 0x00, 0x00, 0x62, +/* 00003690 */ 0x0B, 0x00, 0x00, 0x63, 0x0B, 0x00, 0x00, 0xAF, 0x0B, 0x00, 0x00, 0xF9, 0x0B, 0x00, 0x00, 0x33, +/* 000036A0 */ 0x0C, 0x00, 0x00, 0x34, 0x0C, 0x00, 0x00, 0x82, 0x0C, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00, 0x2E, +/* 000036B0 */ 0x0D, 0x00, 0x00, 0x2F, 0x0D, 0x00, 0x00, 0x63, 0x0D, 0x00, 0x00, 0x64, 0x0D, 0x00, 0x00, 0xA2, +/* 000036C0 */ 0x0D, 0x00, 0x00, 0xDA, 0x0D, 0x00, 0x00, 0xDB, 0x0D, 0x00, 0x00, 0x46, 0x0E, 0x00, 0x00, 0x77, +/* 000036D0 */ 0x0E, 0x00, 0x00, 0x87, 0x0E, 0x00, 0x00, 0xA6, 0x0E, 0x00, 0x00, 0xC9, 0x0E, 0x00, 0x00, 0xEC, +/* 000036E0 */ 0x0E, 0x00, 0x00, 0x0D, 0x0F, 0x00, 0x00, 0x2D, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x4A, +/* 000036F0 */ 0x0F, 0x00, 0x00, 0x4B, 0x0F, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x00, 0x9B, 0x0F, 0x00, 0x00, 0xD0, +/* 00003700 */ 0x0F, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x33, +/* 00003710 */ 0x10, 0x00, 0x00, 0x4A, 0x10, 0x00, 0x00, 0x99, 0x10, 0x00, 0x00, 0xCB, 0x10, 0x00, 0x00, 0xEF, +/* 00003720 */ 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x26, 0x11, 0x00, 0x00, 0x30, 0x11, 0x00, 0x00, 0x31, +/* 00003730 */ 0x11, 0x00, 0x00, 0x51, 0x11, 0x00, 0x00, 0x58, 0x11, 0x00, 0x00, 0x59, 0x11, 0x00, 0x00, 0x9F, +/* 00003740 */ 0x11, 0x00, 0x00, 0xEE, 0x11, 0x00, 0x00, 0x0D, 0x12, 0x00, 0x00, 0x5B, 0x12, 0x00, 0x00, 0x8E, +/* 00003750 */ 0x12, 0x00, 0x00, 0xBE, 0x12, 0x00, 0x00, 0xFE, 0x12, 0x00, 0x00, 0x2A, 0x13, 0x00, 0x00, 0x38, +/* 00003760 */ 0x13, 0x00, 0x00, 0x42, 0x13, 0x00, 0x00, 0x5D, 0x13, 0x00, 0x00, 0x64, 0x13, 0x00, 0x00, 0x65, +/* 00003770 */ 0x13, 0x00, 0x00, 0x9C, 0x13, 0x00, 0x00, 0xDC, 0x13, 0x00, 0x00, 0xFB, 0x13, 0x00, 0x00, 0x1B, +/* 00003780 */ 0x14, 0x00, 0x00, 0x43, 0x14, 0x00, 0x00, 0x51, 0x14, 0x00, 0x00, 0x9B, 0x14, 0x00, 0x00, 0xB7, +/* 00003790 */ 0x14, 0x00, 0x00, 0xC8, 0x14, 0x00, 0x00, 0xE3, 0x14, 0x00, 0x00, 0xED, 0x14, 0x00, 0x00, 0xF4, +/* 000037A0 */ 0x14, 0x00, 0x00, 0xF5, 0x14, 0x00, 0x00, 0x2F, 0x15, 0x00, 0x00, 0x48, 0x15, 0x00, 0x00, 0x6B, +/* 000037B0 */ 0x15, 0x00, 0x00, 0x8D, 0x15, 0x00, 0x00, 0xB1, 0x15, 0x00, 0x00, 0xBF, 0x15, 0x00, 0x00, 0xD6, +/* 000037C0 */ 0x15, 0x00, 0x00, 0xE0, 0x15, 0x00, 0x00, 0xE7, 0x15, 0x00, 0x00, 0xE8, 0x15, 0x00, 0x00, 0x4D, +/* 000037D0 */ 0x16, 0x00, 0x00, 0x79, 0x16, 0x00, 0x00, 0xBF, 0x16, 0x00, 0x00, 0xD5, 0x16, 0x00, 0x00, 0xDF, +/* 000037E0 */ 0x16, 0x00, 0x00, 0xE6, 0x16, 0x00, 0x00, 0xE7, 0x16, 0x00, 0x00, 0x18, 0x17, 0x00, 0x00, 0x4F, +/* 000037F0 */ 0x17, 0x00, 0x00, 0x56, 0x17, 0x00, 0x00, 0x57, 0x17, 0x00, 0x00, 0x99, 0x17, 0x00, 0x00, 0xDF, +/* 00003800 */ 0x17, 0x00, 0x00, 0x0B, 0x18, 0x00, 0x00, 0x4F, 0x18, 0x00, 0x00, 0x7A, 0x18, 0x00, 0x00, 0xA3, +/* 00003810 */ 0x18, 0x00, 0x00, 0xCF, 0x18, 0x00, 0x00, 0xE1, 0x18, 0x00, 0x00, 0x33, 0x19, 0x00, 0x00, 0xA8, +/* 00003820 */ 0x19, 0x00, 0x00, 0xB6, 0x19, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x00, 0x43, 0x1A, 0x00, 0x00, 0xB3, +/* 00003830 */ 0x1A, 0x00, 0x00, 0xE6, 0x1A, 0x00, 0x00, 0x0E, 0x1B, 0x00, 0x00, 0x18, 0x1B, 0x00, 0x00, 0x19, +/* 00003840 */ 0x1B, 0x00, 0x00, 0x41, 0x1B, 0x00, 0x00, 0x64, 0x1B, 0x00, 0x00, 0x9B, 0x1B, 0x00, 0x00, 0xB9, +/* 00003850 */ 0x1B, 0x00, 0x00, 0xCA, 0x1B, 0x00, 0x00, 0xED, 0x1B, 0x00, 0x00, 0xF7, 0x1B, 0x00, 0x00, 0xFD, +/* 00003860 */ 0x1B, 0x00, 0x00, 0xFE, 0x1B, 0x00, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x91, 0x1C, 0x00, 0x00, 0xBD, +/* 00003870 */ 0x1C, 0x00, 0x00, 0x0E, 0x1D, 0x00, 0x00, 0x39, 0x1D, 0x00, 0x00, 0x62, 0x1D, 0x00, 0x00, 0x8E, +/* 00003880 */ 0x1D, 0x00, 0x00, 0xA0, 0x1D, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x51, 0x1E, 0x00, 0x00, 0x7B, +/* 00003890 */ 0x1E, 0x00, 0x00, 0xB4, 0x1E, 0x00, 0x00, 0xEE, 0x1E, 0x00, 0x00, 0xFC, 0x1E, 0x00, 0x00, 0x47, +/* 000038A0 */ 0x1F, 0x00, 0x00, 0x89, 0x1F, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00, 0x61, +/* 000038B0 */ 0x20, 0x00, 0x00, 0x6B, 0x20, 0x00, 0x00, 0x8A, 0x20, 0x00, 0x00, 0x90, 0x20, 0x00, 0x00, 0x91, +/* 000038C0 */ 0x20, 0x00, 0x00, 0xC3, 0x20, 0x00, 0x00, 0xE3, 0x20, 0x00, 0x00, 0x07, 0x21, 0x00, 0x00, 0x11, +/* 000038D0 */ 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x00, 0x5D, 0x21, 0x00, 0x00, 0x73, 0x21, 0x00, 0x00, 0x91, +/* 000038E0 */ 0x21, 0x00, 0x00, 0x9B, 0x21, 0x00, 0x00, 0x9C, 0x21, 0x00, 0x00, 0x11, 0x22, 0x00, 0x00, 0x61, +/* 000038F0 */ 0x22, 0x00, 0x00, 0xA6, 0x22, 0x00, 0x00, 0xA7, 0x22, 0x00, 0x00, 0x1A, 0x23, 0x00, 0x00, 0x33, +/* 00003900 */ 0x23, 0x00, 0x00, 0x57, 0x23, 0x00, 0x00, 0x7B, 0x23, 0x00, 0x00, 0xD3, 0x23, 0x00, 0x00, 0x16, +/* 00003910 */ 0x24, 0x00, 0x00, 0x9F, 0x24, 0x00, 0x00, 0xA0, 0x24, 0x00, 0x00, 0xBB, 0x24, 0x00, 0x00, 0xC1, +/* 00003920 */ 0x24, 0x00, 0x00, 0xC2, 0x24, 0x00, 0x00, 0x1C, 0x25, 0x00, 0x00, 0x52, 0x25, 0x00, 0x00, 0x72, +/* 00003930 */ 0x25, 0x00, 0x00, 0xCF, 0x25, 0x00, 0x00, 0x02, 0x26, 0x00, 0x00, 0x0C, 0x26, 0x00, 0x00, 0x0D, +/* 00003940 */ 0x26, 0x00, 0x00, 0x24, 0x26, 0x00, 0x00, 0x74, 0x26, 0x00, 0x00, 0xD0, 0x26, 0x00, 0x00, 0xE0, +/* 00003950 */ 0x26, 0x00, 0x00, 0xEA, 0x26, 0x00, 0x00, 0xEB, 0x26, 0x00, 0x00, 0x7A, 0x27, 0x00, 0x00, 0x00, +/* 00003960 */ 0x28, 0x00, 0x00, 0x7B, 0x28, 0x00, 0x00, 0xC4, 0x28, 0x00, 0x00, 0xFA, 0x28, 0x00, 0x00, 0xFB, +/* 00003970 */ 0x28, 0x00, 0x00, 0x47, 0x29, 0x00, 0x00, 0x66, 0x29, 0x00, 0x00, 0xB7, 0x29, 0x00, 0x00, 0x31, +/* 00003980 */ 0x2A, 0x00, 0x00, 0x55, 0x2A, 0x00, 0x00, 0xB0, 0x2A, 0x00, 0x00, 0xFB, 0x2A, 0x00, 0x00, 0x0D, +/* 00003990 */ 0x2B, 0x00, 0x00, 0x1E, 0x2B, 0x00, 0x00, 0x3E, 0x2B, 0x00, 0x00, 0x48, 0x2B, 0x00, 0x00, 0x49, +/* 000039A0 */ 0x2B, 0x00, 0x00, 0xB8, 0x2B, 0x00, 0x00, 0xE6, 0x2B, 0x00, 0x00, 0x1B, 0x2C, 0x00, 0x00, 0x44, +/* 000039B0 */ 0x2C, 0x00, 0x00, 0x5C, 0x2C, 0x00, 0x00, 0x96, 0x2C, 0x00, 0x00, 0xC0, 0x2C, 0x00, 0x00, 0xE5, +/* 000039C0 */ 0x2C, 0x00, 0x00, 0xFE, 0x2C, 0x00, 0x00, 0x25, 0x2D, 0x00, 0x00, 0x37, 0x2D, 0x00, 0x00, 0x45, +/* 000039D0 */ 0x2D, 0x00, 0x00, 0x46, 0x2D, 0x00, 0x00, 0x91, 0x2D, 0x00, 0x00, 0xA2, 0x2D, 0x00, 0x00, 0xC4, +/* 000039E0 */ 0x2D, 0x00, 0x00, 0xCE, 0x2D, 0x00, 0x00, 0xCF, 0x2D, 0x00, 0x00, 0xED, 0x2D, 0x00, 0x00, 0x0B, +/* 000039F0 */ 0x2E, 0x00, 0x00, 0x29, 0x2E, 0x00, 0x00, 0x5A, 0x2E, 0x00, 0x00, 0x6C, 0x2E, 0x00, 0x00, 0x72, +/* 00003A00 */ 0x2E, 0x00, 0x00, 0x73, 0x2E, 0x00, 0x00, 0xD3, 0x2E, 0x00, 0x00, 0x2B, 0x2F, 0x00, 0x00, 0x5E, +/* 00003A10 */ 0x2F, 0x00, 0x00, 0x5F, 0x2F, 0x00, 0x00, 0x90, 0x2F, 0x00, 0x00, 0x91, 0x2F, 0x00, 0x00, 0xC5, +/* 00003A20 */ 0x2F, 0x00, 0x00, 0xF0, 0x2F, 0x00, 0x00, 0x59, 0x30, 0x00, 0x00, 0x8A, 0x30, 0x00, 0x00, 0xAB, +/* 00003A30 */ 0x30, 0x00, 0x00, 0xB9, 0x30, 0x00, 0x00, 0xC3, 0x30, 0x00, 0x00, 0x18, 0x31, 0x00, 0x00, 0x1E, +/* 00003A40 */ 0x31, 0x00, 0x00, 0x1F, 0x31, 0x00, 0x00, 0x62, 0x31, 0x00, 0x00, 0x8F, 0x31, 0x00, 0x00, 0xBD, +/* 00003A50 */ 0x31, 0x00, 0x00, 0xE4, 0x31, 0x00, 0x00, 0x10, 0x32, 0x00, 0x00, 0x1A, 0x32, 0x00, 0x00, 0x1B, +/* 00003A60 */ 0x32, 0x00, 0x00, 0x3D, 0x32, 0x00, 0x00, 0x62, 0x32, 0x00, 0x00, 0x8A, 0x32, 0x00, 0x00, 0x98, +/* 00003A70 */ 0x32, 0x00, 0x00, 0x99, 0x32, 0x00, 0x00, 0xC5, 0x32, 0x00, 0x00, 0x12, 0x33, 0x00, 0x00, 0x2B, +/* 00003A80 */ 0x33, 0x00, 0x00, 0x69, 0x33, 0x00, 0x00, 0x9D, 0x33, 0x00, 0x00, 0xB2, 0x33, 0x00, 0x00, 0xE1, +/* 00003A90 */ 0x33, 0x00, 0x00, 0xEF, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x51, 0x34, 0x00, 0x00, 0x81, +/* 00003AA0 */ 0x34, 0x00, 0x00, 0xE7, 0x34, 0x00, 0x00, 0xF1, 0x34, 0x00, 0x00, 0xF2, 0x34, 0x00, 0x00, 0x1A, +/* 00003AB0 */ 0x35, 0x00, 0x00, 0x21, 0x35, 0x00, 0x00, 0x22, 0x35, 0x00, 0x00, 0x44, 0x35, 0x00, 0x00, 0x62, +/* 00003AC0 */ 0x35, 0x00, 0x00, 0x87, 0x35, 0x00, 0x00, 0xA9, 0x35, 0x00, 0x00, 0xD9, 0x35, 0x00, 0x00, 0xEB, +/* 00003AD0 */ 0x35, 0x00, 0x00, 0x2B, 0x36, 0x00, 0x00, 0x3A, 0x36, 0x00, 0x00, 0x3B, 0x36, 0x00, 0x00, 0x60, +/* 00003AE0 */ 0x36, 0x00, 0x00, 0xA0, 0x36, 0x00, 0x00, 0xAF, 0x36, 0x00, 0x00, 0xB0, 0x36, 0x00, 0x00, 0xD5, +/* 00003AF0 */ 0x36, 0x00, 0x00, 0x0F, 0x37, 0x00, 0x00, 0x1E, 0x37, 0x00, 0x00, 0x1F, 0x37, 0x00, 0x00, 0x4C, +/* 00003B00 */ 0x37, 0x00, 0x00, 0x8D, 0x37, 0x00, 0x00, 0x9C, 0x37, 0x00, 0x00, 0x9D, 0x37, 0x00, 0x00, 0xC2, +/* 00003B10 */ 0x37, 0x00, 0x00, 0xE7, 0x37, 0x00, 0x00, 0x04, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x73, +/* 00003B20 */ 0x38, 0x00, 0x00, 0x85, 0x38, 0x00, 0x00, 0xA1, 0x38, 0x00, 0x00, 0xB0, 0x38, 0x00, 0x00, 0xB1, +/* 00003B30 */ 0x38, 0x00, 0x00, 0xDC, 0x38, 0x00, 0x00, 0x08, 0x39, 0x00, 0x00, 0x24, 0x39, 0x00, 0x00, 0x74, +/* 00003B40 */ 0x39, 0x00, 0x00, 0x99, 0x39, 0x00, 0x00, 0xAF, 0x39, 0x00, 0x00, 0xE0, 0x39, 0x00, 0x00, 0xF2, +/* 00003B50 */ 0x39, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x11, 0x3A, 0x00, 0x00, 0x1B, 0x3A, 0x00, 0x00, 0x1C, +/* 00003B60 */ 0x3A, 0x00, 0x00, 0x43, 0x3A, 0x00, 0x00, 0x87, 0x3A, 0x00, 0x00, 0xAE, 0x3A, 0x00, 0x00, 0xAF, +/* 00003B70 */ 0x3A, 0x00, 0x00, 0xD2, 0x3A, 0x00, 0x00, 0xF7, 0x3A, 0x00, 0x00, 0x31, 0x3B, 0x00, 0x00, 0x3F, +/* 00003B80 */ 0x3B, 0x00, 0x00, 0x40, 0x3B, 0x00, 0x00, 0x64, 0x3B, 0x00, 0x00, 0x96, 0x3B, 0x00, 0x00, 0xA4, +/* 00003B90 */ 0x3B, 0x00, 0x00, 0xA5, 0x3B, 0x00, 0x00, 0xC9, 0x3B, 0x00, 0x00, 0xFB, 0x3B, 0x00, 0x00, 0x09, +/* 00003BA0 */ 0x3C, 0x00, 0x00, 0x0A, 0x3C, 0x00, 0x00, 0x71, 0x3C, 0x00, 0x00, 0x0C, 0x3D, 0x00, 0x00, 0x1A, +/* 00003BB0 */ 0x3D, 0x00, 0x00, 0x1B, 0x3D, 0x00, 0x00, 0x35, 0x3D, 0x00, 0x00, 0x3F, 0x3D, 0x00, 0x00, 0x40, +/* 00003BC0 */ 0x3D, 0x00, 0x00, 0x59, 0x3D, 0x00, 0x00, 0x5F, 0x3D, 0x00, 0x00, 0x60, 0x3D, 0x00, 0x00, 0xAE, +/* 00003BD0 */ 0x3D, 0x00, 0x00, 0xDA, 0x3D, 0x00, 0x00, 0xDB, 0x3D, 0x00, 0x00, 0x0A, 0x3E, 0x00, 0x00, 0x4A, +/* 00003BE0 */ 0x3E, 0x00, 0x00, 0x4B, 0x3E, 0x00, 0x00, 0xAC, 0x3E, 0x00, 0x00, 0x2E, 0x3F, 0x00, 0x00, 0x3C, +/* 00003BF0 */ 0x3F, 0x00, 0x00, 0x3D, 0x3F, 0x00, 0x00, 0x6C, 0x3F, 0x00, 0x00, 0x7D, 0x3F, 0x00, 0x00, 0x9A, +/* 00003C00 */ 0x3F, 0x00, 0x00, 0xA4, 0x3F, 0x00, 0x00, 0xAA, 0x3F, 0x00, 0x00, 0xAB, 0x3F, 0x00, 0x00, 0xC5, +/* 00003C10 */ 0x3F, 0x00, 0x00, 0xEF, 0x3F, 0x00, 0x00, 0x19, 0x40, 0x00, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x20, +/* 00003C20 */ 0x40, 0x00, 0x00, 0x58, 0x40, 0x00, 0x00, 0xA4, 0x40, 0x00, 0x00, 0x02, 0x41, 0x00, 0x00, 0x28, +/* 00003C30 */ 0x41, 0x00, 0x00, 0x6D, 0x41, 0x00, 0x00, 0xD1, 0x41, 0x00, 0x00, 0x51, 0x42, 0x00, 0x00, 0x52, +/* 00003C40 */ 0x42, 0x00, 0x00, 0xC4, 0x42, 0x00, 0x00, 0xF5, 0x42, 0x00, 0x00, 0x44, 0x43, 0x00, 0x00, 0x96, +/* 00003C50 */ 0x43, 0x00, 0x00, 0xEA, 0x43, 0x00, 0x00, 0x22, 0x44, 0x00, 0x00, 0x74, 0x44, 0x00, 0x00, 0xC6, +/* 00003C60 */ 0x44, 0x00, 0x00, 0x1B, 0x45, 0x00, 0x00, 0x87, 0x45, 0x00, 0x00, 0xDD, 0x45, 0x00, 0x00, 0xDE, +/* 00003C70 */ 0x45, 0x00, 0x00, 0xFD, 0x45, 0x00, 0x00, 0x1C, 0x46, 0x00, 0x00, 0x4E, 0x46, 0x00, 0x00, 0x4F, +/* 00003C80 */ 0x46, 0x00, 0x00, 0xC6, 0x46, 0x00, 0x00, 0x33, 0x47, 0x00, 0x00, 0x86, 0x47, 0x00, 0x00, 0xC9, +/* 00003C90 */ 0x47, 0x00, 0x00, 0xCA, 0x47, 0x00, 0x00, 0x47, 0x48, 0x00, 0x00, 0xDB, 0x48, 0x00, 0x00, 0x5E, +/* 00003CA0 */ 0x49, 0x00, 0x00, 0xE1, 0x49, 0x00, 0x00, 0x54, 0x4A, 0x00, 0x00, 0x55, 0x4A, 0x00, 0x00, 0xBF, +/* 00003CB0 */ 0x4A, 0x00, 0x00, 0x38, 0x4B, 0x00, 0x00, 0x39, 0x4B, 0x00, 0x00, 0x9C, 0x4B, 0x00, 0x00, 0x2B, +/* 00003CC0 */ 0x4C, 0x00, 0x00, 0xD4, 0x4C, 0x00, 0x00, 0x68, 0x4D, 0x00, 0x00, 0xFF, 0x4D, 0x00, 0x00, 0xA3, +/* 00003CD0 */ 0x4E, 0x00, 0x00, 0xB7, 0x4E, 0x00, 0x00, 0xB8, 0x4E, 0x00, 0x00, 0x39, 0x4F, 0x00, 0x00, 0xA5, +/* 00003CE0 */ 0x4F, 0x00, 0x00, 0x15, 0x50, 0x00, 0x00, 0x85, 0x50, 0x00, 0x00, 0xF7, 0x50, 0x00, 0x00, 0x6B, +/* 00003CF0 */ 0x51, 0x00, 0x00, 0xDF, 0x51, 0x00, 0x00, 0x29, 0x52, 0x00, 0x00, 0x2A, 0x52, 0x00, 0x00, 0x97, +/* 00003D00 */ 0x52, 0x00, 0x00, 0x98, 0x52, 0x00, 0x00, 0xFE, 0x52, 0x00, 0x00, 0x89, 0x53, 0x00, 0x00, 0xFF, +/* 00003D10 */ 0x53, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x06, 0x54, 0x00, 0x00, 0x34, 0x54, 0x00, 0x00, 0x5C, +/* 00003D20 */ 0x54, 0x00, 0x00, 0x5D, 0x54, 0x00, 0x00, 0x7E, 0x54, 0x00, 0x00, 0xA6, 0x54, 0x00, 0x00, 0xB0, +/* 00003D30 */ 0x54, 0x00, 0x00, 0xB1, 0x54, 0x00, 0x00, 0xFD, 0x54, 0x00, 0x00, 0x03, 0x55, 0x00, 0x00, 0x04, +/* 00003D40 */ 0x55, 0x00, 0x00, 0x7B, 0x55, 0x00, 0x00, 0xAA, 0x55, 0x00, 0x00, 0xD8, 0x55, 0x00, 0x00, 0xEF, +/* 00003D50 */ 0x55, 0x00, 0x00, 0xF9, 0x55, 0x00, 0x00, 0xFA, 0x55, 0x00, 0x00, 0x25, 0x56, 0x00, 0x00, 0x46, +/* 00003D60 */ 0x56, 0x00, 0x00, 0x50, 0x56, 0x00, 0x00, 0x51, 0x56, 0x00, 0x00, 0x7F, 0x56, 0x00, 0x00, 0xB9, +/* 00003D70 */ 0x56, 0x00, 0x00, 0xBA, 0x56, 0x00, 0x00, 0xEF, 0x56, 0x00, 0x00, 0x06, 0x57, 0x00, 0x00, 0x07, +/* 00003D80 */ 0x57, 0x00, 0x00, 0x45, 0x57, 0x00, 0x00, 0xA6, 0x57, 0x00, 0x00, 0xE2, 0x57, 0x00, 0x00, 0xF0, +/* 00003D90 */ 0x57, 0x00, 0x00, 0xF1, 0x57, 0x00, 0x00, 0x22, 0x58, 0x00, 0x00, 0x23, 0x58, 0x00, 0x00, 0x54, +/* 00003DA0 */ 0x58, 0x00, 0x00, 0x94, 0x58, 0x00, 0x00, 0xA2, 0x58, 0x00, 0x00, 0xA3, 0x58, 0x00, 0x00, 0xD9, +/* 00003DB0 */ 0x58, 0x00, 0x00, 0xDA, 0x58, 0x00, 0x00, 0x3B, 0x59, 0x00, 0x00, 0x7B, 0x59, 0x00, 0x00, 0x89, +/* 00003DC0 */ 0x59, 0x00, 0x00, 0x95, 0x59, 0x00, 0x00, 0x96, 0x59, 0x00, 0x00, 0xAB, 0x59, 0x00, 0x00, 0xB1, +/* 00003DD0 */ 0x59, 0x00, 0x00, 0xB2, 0x59, 0x00, 0x00, 0x01, 0x5A, 0x00, 0x00, 0x1A, 0x5A, 0x00, 0x00, 0x31, +/* 00003DE0 */ 0x5A, 0x00, 0x00, 0x86, 0x5A, 0x00, 0x00, 0x98, 0x5A, 0x00, 0x00, 0xF6, 0x5A, 0x00, 0x00, 0x1D, +/* 00003DF0 */ 0x5B, 0x00, 0x00, 0xAA, 0x5B, 0x00, 0x00, 0xD1, 0x5B, 0x00, 0x00, 0xE3, 0x5B, 0x00, 0x00, 0xFE, +/* 00003E00 */ 0x5B, 0x00, 0x00, 0x25, 0x5C, 0x00, 0x00, 0x87, 0x5C, 0x00, 0x00, 0x95, 0x5C, 0x00, 0x00, 0xA1, +/* 00003E10 */ 0x5C, 0x00, 0x00, 0x09, 0x5D, 0x00, 0x00, 0x20, 0x5D, 0x00, 0x00, 0x26, 0x5D, 0x00, 0x00, 0x27, +/* 00003E20 */ 0x5D, 0x00, 0x00, 0x7D, 0x5D, 0x00, 0x00, 0xB0, 0x5D, 0x00, 0x00, 0xE9, 0x5D, 0x00, 0x00, 0xF3, +/* 00003E30 */ 0x5D, 0x00, 0x00, 0xF4, 0x5D, 0x00, 0x00, 0x2C, 0x5E, 0x00, 0x00, 0x67, 0x5E, 0x00, 0x00, 0xA0, +/* 00003E40 */ 0x5E, 0x00, 0x00, 0xAA, 0x5E, 0x00, 0x00, 0xAB, 0x5E, 0x00, 0x00, 0xE0, 0x5E, 0x00, 0x00, 0xE6, +/* 00003E50 */ 0x5E, 0x00, 0x00, 0xE7, 0x5E, 0x00, 0x00, 0x38, 0x5F, 0x00, 0x00, 0x6B, 0x5F, 0x00, 0x00, 0xA4, +/* 00003E60 */ 0x5F, 0x00, 0x00, 0xAE, 0x5F, 0x00, 0x00, 0xAF, 0x5F, 0x00, 0x00, 0xE7, 0x5F, 0x00, 0x00, 0x22, +/* 00003E70 */ 0x60, 0x00, 0x00, 0x5B, 0x60, 0x00, 0x00, 0x65, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x96, +/* 00003E80 */ 0x60, 0x00, 0x00, 0x9C, 0x60, 0x00, 0x00, 0x9D, 0x60, 0x00, 0x00, 0xC6, 0x60, 0x00, 0x00, 0x01, +/* 00003E90 */ 0x61, 0x00, 0x00, 0x16, 0x61, 0x00, 0x00, 0x49, 0x61, 0x00, 0x00, 0x4A, 0x61, 0x00, 0x00, 0x78, +/* 00003EA0 */ 0x61, 0x00, 0x00, 0xA5, 0x61, 0x00, 0x00, 0xA6, 0x61, 0x00, 0x00, 0xD8, 0x61, 0x00, 0x00, 0x0E, +/* 00003EB0 */ 0x62, 0x00, 0x00, 0x0F, 0x62, 0x00, 0x00, 0x55, 0x62, 0x00, 0x00, 0xCC, 0x62, 0x00, 0x00, 0xDE, +/* 00003EC0 */ 0x62, 0x00, 0x00, 0xEC, 0x62, 0x00, 0x00, 0xF6, 0x62, 0x00, 0x00, 0xF7, 0x62, 0x00, 0x00, 0x3F, +/* 00003ED0 */ 0x63, 0x00, 0x00, 0xC1, 0x63, 0x00, 0x00, 0xD2, 0x63, 0x00, 0x00, 0x34, 0x64, 0x00, 0x00, 0x3E, +/* 00003EE0 */ 0x64, 0x00, 0x00, 0x45, 0x64, 0x00, 0x00, 0x46, 0x64, 0x00, 0x00, 0x82, 0x64, 0x00, 0x00, 0xE3, +/* 00003EF0 */ 0x64, 0x00, 0x00, 0xE4, 0x64, 0x00, 0x00, 0x57, 0x65, 0x00, 0x00, 0xA7, 0x65, 0x00, 0x00, 0xF8, +/* 00003F00 */ 0x65, 0x00, 0x00, 0x7B, 0x66, 0x00, 0x00, 0xD2, 0x66, 0x00, 0x00, 0x3A, 0x67, 0x00, 0x00, 0x60, +/* 00003F10 */ 0x67, 0x00, 0x00, 0x61, 0x67, 0x00, 0x00, 0xBA, 0x67, 0x00, 0x00, 0x45, 0x68, 0x00, 0x00, 0xA0, +/* 00003F20 */ 0x68, 0x00, 0x00, 0x0C, 0x69, 0x00, 0x00, 0x32, 0x69, 0x00, 0x00, 0x33, 0x69, 0x00, 0x00, 0x90, +/* 00003F30 */ 0x69, 0x00, 0x00, 0x1F, 0x6A, 0x00, 0x00, 0x7C, 0x6A, 0x00, 0x00, 0xEA, 0x6A, 0x00, 0x00, 0x10, +/* 00003F40 */ 0x6B, 0x00, 0x00, 0x11, 0x6B, 0x00, 0x00, 0x52, 0x6B, 0x00, 0x00, 0xC5, 0x6B, 0x00, 0x00, 0xFF, +/* 00003F50 */ 0x6B, 0x00, 0x00, 0x5A, 0x6C, 0x00, 0x00, 0x80, 0x6C, 0x00, 0x00, 0x81, 0x6C, 0x00, 0x00, 0xDA, +/* 00003F60 */ 0x6C, 0x00, 0x00, 0x34, 0x6D, 0x00, 0x00, 0x83, 0x6D, 0x00, 0x00, 0xFF, 0x6D, 0x00, 0x00, 0x5F, +/* 00003F70 */ 0x6E, 0x00, 0x00, 0xC3, 0x6E, 0x00, 0x00, 0x29, 0x6F, 0x00, 0x00, 0x82, 0x6F, 0x00, 0x00, 0x83, +/* 00003F80 */ 0x6F, 0x00, 0x00, 0xEA, 0x6F, 0x00, 0x00, 0x2F, 0x70, 0x00, 0x00, 0x72, 0x70, 0x00, 0x00, 0xAB, +/* 00003F90 */ 0x70, 0x00, 0x00, 0xE6, 0x70, 0x00, 0x00, 0x21, 0x71, 0x00, 0x00, 0x5F, 0x71, 0x00, 0x00, 0x9C, +/* 00003FA0 */ 0x71, 0x00, 0x00, 0xD1, 0x71, 0x00, 0x00, 0x32, 0x72, 0x00, 0x00, 0x7D, 0x72, 0x00, 0x00, 0xC8, +/* 00003FB0 */ 0x72, 0x00, 0x00, 0x13, 0x73, 0x00, 0x00, 0x5D, 0x73, 0x00, 0x00, 0x5E, 0x73, 0x00, 0x00, 0xDD, +/* 00003FC0 */ 0x73, 0x00, 0x00, 0x78, 0x74, 0x00, 0x00, 0x98, 0x74, 0x00, 0x00, 0xB8, 0x74, 0x00, 0x00, 0xD6, +/* 00003FD0 */ 0x74, 0x00, 0x00, 0xE4, 0x74, 0x00, 0x00, 0xE5, 0x74, 0x00, 0x00, 0x48, 0x75, 0x00, 0x00, 0xC3, +/* 00003FE0 */ 0x75, 0x00, 0x00, 0x03, 0x76, 0x00, 0x00, 0x34, 0x76, 0x00, 0x00, 0xB3, 0x76, 0x00, 0x00, 0x09, +/* 00003FF0 */ 0x77, 0x00, 0x00, 0x4D, 0x77, 0x00, 0x00, 0x4E, 0x77, 0x00, 0x00, 0xCD, 0x77, 0x00, 0x00, 0x15, +/* 00004000 */ 0x78, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x83, 0x78, 0x00, 0x00, 0x95, 0x78, 0x00, 0x00, 0xA5, +/* 00004010 */ 0x78, 0x00, 0x00, 0xA6, 0x78, 0x00, 0x00, 0xDE, 0x78, 0x00, 0x00, 0xEA, 0x78, 0x00, 0x00, 0x03, +/* 00004020 */ 0x79, 0x00, 0x00, 0x0D, 0x79, 0x00, 0x00, 0x0E, 0x79, 0x00, 0x00, 0x5F, 0x79, 0x00, 0x00, 0x8D, +/* 00004030 */ 0x79, 0x00, 0x00, 0xB8, 0x79, 0x00, 0x00, 0xE4, 0x79, 0x00, 0x00, 0x1F, 0x7A, 0x00, 0x00, 0x49, +/* 00004040 */ 0x7A, 0x00, 0x00, 0x53, 0x7A, 0x00, 0x00, 0x54, 0x7A, 0x00, 0x00, 0x74, 0x7A, 0x00, 0x00, 0x97, +/* 00004050 */ 0x7A, 0x00, 0x00, 0xB9, 0x7A, 0x00, 0x00, 0x0D, 0x7B, 0x00, 0x00, 0x36, 0x7B, 0x00, 0x00, 0xA0, +/* 00004060 */ 0x7B, 0x00, 0x00, 0xB9, 0x7B, 0x00, 0x00, 0x0B, 0x7C, 0x00, 0x00, 0x54, 0x7C, 0x00, 0x00, 0x7A, +/* 00004070 */ 0x7C, 0x00, 0x00, 0xDC, 0x7C, 0x00, 0x00, 0xEA, 0x7C, 0x00, 0x00, 0xFB, 0x7C, 0x00, 0x00, 0x44, +/* 00004080 */ 0x7D, 0x00, 0x00, 0xA0, 0x7D, 0x00, 0x00, 0xBF, 0x7D, 0x00, 0x00, 0xE1, 0x7D, 0x00, 0x00, 0xEB, +/* 00004090 */ 0x7D, 0x00, 0x00, 0xEC, 0x7D, 0x00, 0x00, 0x13, 0x7E, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x69, +/* 000040A0 */ 0x7E, 0x00, 0x00, 0x73, 0x7E, 0x00, 0x00, 0x74, 0x7E, 0x00, 0x00, 0xD0, 0x7E, 0x00, 0x00, 0x25, +/* 000040B0 */ 0x7F, 0x00, 0x00, 0x4B, 0x7F, 0x00, 0x00, 0x89, 0x7F, 0x00, 0x00, 0x9E, 0x7F, 0x00, 0x00, 0xDE, +/* 000040C0 */ 0x7F, 0x00, 0x00, 0xEC, 0x7F, 0x00, 0x00, 0xF7, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x4E, +/* 000040D0 */ 0x80, 0x00, 0x00, 0x81, 0x80, 0x00, 0x00, 0xCE, 0x80, 0x00, 0x00, 0x22, 0x81, 0x00, 0x00, 0x4C, +/* 000040E0 */ 0x81, 0x00, 0x00, 0x56, 0x81, 0x00, 0x00, 0x57, 0x81, 0x00, 0x00, 0x99, 0x81, 0x00, 0x00, 0xC6, +/* 000040F0 */ 0x81, 0x00, 0x00, 0x20, 0x82, 0x00, 0x00, 0x31, 0x82, 0x00, 0x00, 0x85, 0x82, 0x00, 0x00, 0x8F, +/* 00004100 */ 0x82, 0x00, 0x00, 0x90, 0x82, 0x00, 0x00, 0xB6, 0x82, 0x00, 0x00, 0xBD, 0x82, 0x00, 0x00, 0xBE, +/* 00004110 */ 0x82, 0x00, 0x00, 0xF3, 0x82, 0x00, 0x00, 0x15, 0x83, 0x00, 0x00, 0x16, 0x83, 0x00, 0x00, 0x52, +/* 00004120 */ 0x83, 0x00, 0x00, 0x53, 0x83, 0x00, 0x00, 0x9C, 0x83, 0x00, 0x00, 0xCF, 0x83, 0x00, 0x00, 0xFF, +/* 00004130 */ 0x83, 0x00, 0x00, 0x11, 0x84, 0x00, 0x00, 0x12, 0x84, 0x00, 0x00, 0xA1, 0x84, 0x00, 0x00, 0xF7, +/* 00004140 */ 0x84, 0x00, 0x00, 0x09, 0x85, 0x00, 0x00, 0x0A, 0x85, 0x00, 0x00, 0x43, 0x85, 0x00, 0x00, 0x44, +/* 00004150 */ 0x85, 0x00, 0x00, 0x67, 0x85, 0x00, 0x00, 0x9D, 0x85, 0x00, 0x00, 0xD3, 0x85, 0x00, 0x00, 0xEC, +/* 00004160 */ 0x85, 0x00, 0x00, 0x26, 0x86, 0x00, 0x00, 0x38, 0x86, 0x00, 0x00, 0x39, 0x86, 0x00, 0x00, 0xAA, +/* 00004170 */ 0x86, 0x00, 0x00, 0x09, 0x87, 0x00, 0x00, 0x8A, 0x87, 0x00, 0x00, 0xF8, 0x87, 0x00, 0x00, 0x6B, +/* 00004180 */ 0x88, 0x00, 0x00, 0xCD, 0x88, 0x00, 0x00, 0xCE, 0x88, 0x00, 0x00, 0x06, 0x89, 0x00, 0x00, 0x47, +/* 00004190 */ 0x89, 0x00, 0x00, 0xB5, 0x89, 0x00, 0x00, 0xB6, 0x89, 0x00, 0x00, 0xE1, 0x89, 0x00, 0x00, 0x4A, +/* 000041A0 */ 0x8A, 0x00, 0x00, 0x8F, 0x8A, 0x00, 0x00, 0x90, 0x8A, 0x00, 0x00, 0xC2, 0x8A, 0x00, 0x00, 0x2D, +/* 000041B0 */ 0x8B, 0x00, 0x00, 0xAF, 0x8B, 0x00, 0x00, 0xDB, 0x8B, 0x00, 0x00, 0x27, 0x8C, 0x00, 0x00, 0x6E, +/* 000041C0 */ 0x8C, 0x00, 0x00, 0x0A, 0x8D, 0x00, 0x00, 0x56, 0x8D, 0x00, 0x00, 0x8D, 0x8D, 0x00, 0x00, 0x11, +/* 000041D0 */ 0x8E, 0x00, 0x00, 0x36, 0x8E, 0x00, 0x00, 0x66, 0x8E, 0x00, 0x00, 0x84, 0x8E, 0x00, 0x00, 0x27, +/* 000041E0 */ 0x8F, 0x00, 0x00, 0x86, 0x8F, 0x00, 0x00, 0xB5, 0x8F, 0x00, 0x00, 0xCF, 0x8F, 0x00, 0x00, 0xE7, +/* 000041F0 */ 0x8F, 0x00, 0x00, 0xF9, 0x8F, 0x00, 0x00, 0x28, 0x90, 0x00, 0x00, 0x97, 0x90, 0x00, 0x00, 0xC6, +/* 00004200 */ 0x90, 0x00, 0x00, 0x54, 0x91, 0x00, 0x00, 0x8B, 0x91, 0x00, 0x00, 0xF5, 0x91, 0x00, 0x00, 0x0F, +/* 00004210 */ 0x92, 0x00, 0x00, 0x25, 0x92, 0x00, 0x00, 0x40, 0x92, 0x00, 0x00, 0x6F, 0x92, 0x00, 0x00, 0x85, +/* 00004220 */ 0x92, 0x00, 0x00, 0x97, 0x92, 0x00, 0x00, 0x98, 0x92, 0x00, 0x00, 0xC7, 0x92, 0x00, 0x00, 0xF6, +/* 00004230 */ 0x92, 0x00, 0x00, 0x10, 0x93, 0x00, 0x00, 0x8B, 0x93, 0x00, 0x00, 0xAD, 0x93, 0x00, 0x00, 0xDB, +/* 00004240 */ 0x93, 0x00, 0x00, 0x09, 0x94, 0x00, 0x00, 0x0A, 0x94, 0x00, 0x00, 0x7B, 0x94, 0x00, 0x00, 0x04, +/* 00004250 */ 0x95, 0x00, 0x00, 0x6D, 0x95, 0x00, 0x00, 0xAC, 0x95, 0x00, 0x00, 0xC2, 0x95, 0x00, 0x00, 0xC3, +/* 00004260 */ 0x95, 0x00, 0x00, 0xE8, 0x95, 0x00, 0x00, 0x15, 0x96, 0x00, 0x00, 0x42, 0x96, 0x00, 0x00, 0x6F, +/* 00004270 */ 0x96, 0x00, 0x00, 0x8C, 0x96, 0x00, 0x00, 0xB9, 0x96, 0x00, 0x00, 0xCF, 0x96, 0x00, 0x00, 0xE1, +/* 00004280 */ 0x96, 0x00, 0x00, 0xE2, 0x96, 0x00, 0x00, 0x13, 0x97, 0x00, 0x00, 0x40, 0x97, 0x00, 0x00, 0x52, +/* 00004290 */ 0x97, 0x00, 0x00, 0x53, 0x97, 0x00, 0x00, 0x80, 0x97, 0x00, 0x00, 0xA5, 0x97, 0x00, 0x00, 0xB7, +/* 000042A0 */ 0x97, 0x00, 0x00, 0xB8, 0x97, 0x00, 0x00, 0xE9, 0x97, 0x00, 0x00, 0x17, 0x98, 0x00, 0x00, 0x64, +/* 000042B0 */ 0x98, 0x00, 0x00, 0xAC, 0x98, 0x00, 0x00, 0xD6, 0x98, 0x00, 0x00, 0x0C, 0x99, 0x00, 0x00, 0x4E, +/* 000042C0 */ 0x99, 0x00, 0x00, 0x80, 0x99, 0x00, 0x00, 0xAE, 0x99, 0x00, 0x00, 0xE0, 0x99, 0x00, 0x00, 0x17, +/* 000042D0 */ 0x9A, 0x00, 0x00, 0x25, 0x9A, 0x00, 0x00, 0x26, 0x9A, 0x00, 0x00, 0x95, 0x9A, 0x00, 0x00, 0xBE, +/* 000042E0 */ 0x9A, 0x00, 0x00, 0xF9, 0x9A, 0x00, 0x00, 0x53, 0x9B, 0x00, 0x00, 0x65, 0x9B, 0x00, 0x00, 0x8F, +/* 000042F0 */ 0x9B, 0x00, 0x00, 0xBF, 0x9B, 0x00, 0x00, 0xD1, 0x9B, 0x00, 0x00, 0x75, 0x9C, 0x00, 0x00, 0xA1, +/* 00004300 */ 0x9C, 0x00, 0x00, 0xCA, 0x9C, 0x00, 0x00, 0x04, 0x9D, 0x00, 0x00, 0x51, 0x9D, 0x00, 0x00, 0x0A, +/* 00004310 */ 0x9E, 0x00, 0x00, 0x46, 0x9E, 0x00, 0x00, 0x47, 0x9E, 0x00, 0x00, 0x6E, 0x9E, 0x00, 0x00, 0x6F, +/* 00004320 */ 0x9E, 0x00, 0x00, 0xBD, 0x9E, 0x00, 0x00, 0xFC, 0x9E, 0x00, 0x00, 0x3B, 0x9F, 0x00, 0x00, 0x51, +/* 00004330 */ 0x9F, 0x00, 0x00, 0x52, 0x9F, 0x00, 0x00, 0x89, 0x9F, 0x00, 0x00, 0xBD, 0x9F, 0x00, 0x00, 0x06, +/* 00004340 */ 0xA0, 0x00, 0x00, 0x1C, 0xA0, 0x00, 0x00, 0x1D, 0xA0, 0x00, 0x00, 0x58, 0xA0, 0x00, 0x00, 0x9E, +/* 00004350 */ 0xA0, 0x00, 0x00, 0x9F, 0xA0, 0x00, 0x00, 0xD5, 0xA0, 0x00, 0x00, 0x14, 0xA1, 0x00, 0x00, 0x59, +/* 00004360 */ 0xA1, 0x00, 0x00, 0x6F, 0xA1, 0x00, 0x00, 0x70, 0xA1, 0x00, 0x00, 0xB8, 0xA1, 0x00, 0x00, 0xB9, +/* 00004370 */ 0xA1, 0x00, 0x00, 0xE6, 0xA1, 0x00, 0x00, 0x4E, 0xA2, 0x00, 0x00, 0x8B, 0xA2, 0x00, 0x00, 0xAB, +/* 00004380 */ 0xA2, 0x00, 0x00, 0xBD, 0xA2, 0x00, 0x00, 0xFB, 0xA2, 0x00, 0x00, 0xFC, 0xA2, 0x00, 0x00, 0x25, +/* 00004390 */ 0xA3, 0x00, 0x00, 0x59, 0xA3, 0x00, 0x00, 0xBB, 0xA3, 0x00, 0x00, 0xD1, 0xA3, 0x00, 0x00, 0xD2, +/* 000043A0 */ 0xA3, 0x00, 0x00, 0x19, 0xA4, 0x00, 0x00, 0x76, 0xA4, 0x00, 0x00, 0xD8, 0xA4, 0x00, 0x00, 0xEE, +/* 000043B0 */ 0xA4, 0x00, 0x00, 0xEF, 0xA4, 0x00, 0x00, 0x12, 0xA5, 0x00, 0x00, 0x35, 0xA5, 0x00, 0x00, 0x36, +/* 000043C0 */ 0xA5, 0x00, 0x00, 0xEE, 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x4F, 0xA6, 0x00, 0x00, 0x50, +/* 000043D0 */ 0xA6, 0x00, 0x00, 0xE2, 0xA6, 0x00, 0x00, 0xE3, 0xA6, 0x00, 0x00, 0x74, 0xA7, 0x00, 0x00, 0xB8, +/* 000043E0 */ 0xA7, 0x00, 0x00, 0xB9, 0xA7, 0x00, 0x00, 0x4E, 0xA8, 0x00, 0x00, 0x4F, 0xA8, 0x00, 0x00, 0x9D, +/* 000043F0 */ 0xA8, 0x00, 0x00, 0xD5, 0xA8, 0x00, 0x00, 0x0D, 0xA9, 0x00, 0x00, 0x7B, 0xA9, 0x00, 0x00, 0x95, +/* 00004400 */ 0xA9, 0x00, 0x00, 0xE0, 0xA9, 0x00, 0x00, 0x41, 0xAA, 0x00, 0x00, 0xAF, 0xAA, 0x00, 0x00, 0xC9, +/* 00004410 */ 0xAA, 0x00, 0x00, 0xCA, 0xAA, 0x00, 0x00, 0xEB, 0xAA, 0x00, 0x00, 0x26, 0xAB, 0x00, 0x00, 0x5F, +/* 00004420 */ 0xAB, 0x00, 0x00, 0xA4, 0xAB, 0x00, 0x00, 0xF5, 0xAB, 0x00, 0x00, 0x50, 0xAC, 0x00, 0x00, 0xE5, +/* 00004430 */ 0xAC, 0x00, 0x00, 0x7A, 0xAD, 0x00, 0x00, 0x94, 0xAD, 0x00, 0x00, 0xE1, 0xAD, 0x00, 0x00, 0xF5, +/* 00004440 */ 0xAD, 0x00, 0x00, 0xF6, 0xAD, 0x00, 0x00, 0x3C, 0xAE, 0x00, 0x00, 0x84, 0xAE, 0x00, 0x00, 0xBC, +/* 00004450 */ 0xAE, 0x00, 0x00, 0x22, 0xAF, 0x00, 0x00, 0x3C, 0xAF, 0x00, 0x00, 0x3D, 0xAF, 0x00, 0x00, 0x88, +/* 00004460 */ 0xAF, 0x00, 0x00, 0xE9, 0xAF, 0x00, 0x00, 0x4F, 0xB0, 0x00, 0x00, 0x69, 0xB0, 0x00, 0x00, 0x6A, +/* 00004470 */ 0xB0, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x00, 0xE4, 0xB0, 0x00, 0x00, 0xF8, 0xB0, 0x00, 0x00, 0xF9, +/* 00004480 */ 0xB0, 0x00, 0x00, 0x1A, 0xB1, 0x00, 0x00, 0x28, 0xB1, 0x00, 0x00, 0x32, 0xB1, 0x00, 0x00, 0x7D, +/* 00004490 */ 0xB1, 0x00, 0x00, 0x97, 0xB1, 0x00, 0x00, 0xA1, 0xB1, 0x00, 0x00, 0xA2, 0xB1, 0x00, 0x00, 0xDC, +/* 000044A0 */ 0xB1, 0x00, 0x00, 0x02, 0xB2, 0x00, 0x00, 0x51, 0xB2, 0x00, 0x00, 0x82, 0xB2, 0x00, 0x00, 0xB6, +/* 000044B0 */ 0xB2, 0x00, 0x00, 0x21, 0xB3, 0x00, 0x00, 0x6D, 0xB3, 0x00, 0x00, 0xC0, 0xB3, 0x00, 0x00, 0xD3, +/* 000044C0 */ 0xB3, 0x00, 0x00, 0xE5, 0xB3, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x53, 0xB4, 0x00, 0x00, 0xE2, +/* 000044D0 */ 0xB4, 0x00, 0x00, 0x53, 0xB5, 0x00, 0x00, 0xCA, 0xB5, 0x00, 0x00, 0xDD, 0xB5, 0x00, 0x00, 0xEF, +/* 000044E0 */ 0xB5, 0x00, 0x00, 0xF0, 0xB5, 0x00, 0x00, 0x2C, 0xB6, 0x00, 0x00, 0x7D, 0xB6, 0x00, 0x00, 0xB4, +/* 000044F0 */ 0xB6, 0x00, 0x00, 0xE4, 0xB6, 0x00, 0x00, 0xF6, 0xB6, 0x00, 0x00, 0xF7, 0xB6, 0x00, 0x00, 0x8E, +/* 00004500 */ 0xB7, 0x00, 0x00, 0xEC, 0xB7, 0x00, 0x00, 0xFE, 0xB7, 0x00, 0x00, 0xFF, 0xB7, 0x00, 0x00, 0x3C, +/* 00004510 */ 0xB8, 0x00, 0x00, 0x3D, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x96, 0xB8, 0x00, 0x00, 0xCC, +/* 00004520 */ 0xB8, 0x00, 0x00, 0xE5, 0xB8, 0x00, 0x00, 0x1F, 0xB9, 0x00, 0x00, 0x31, 0xB9, 0x00, 0x00, 0x32, +/* 00004530 */ 0xB9, 0x00, 0x00, 0xA3, 0xB9, 0x00, 0x00, 0x15, 0xBA, 0x00, 0x00, 0x16, 0xBA, 0x00, 0x00, 0x61, +/* 00004540 */ 0xBA, 0x00, 0x00, 0x8C, 0xBA, 0x00, 0x00, 0xCC, 0xBA, 0x00, 0x00, 0xFF, 0xBA, 0x00, 0x00, 0x40, +/* 00004550 */ 0xBB, 0x00, 0x00, 0x52, 0xBB, 0x00, 0x00, 0x53, 0xBB, 0x00, 0x00, 0xB2, 0xBB, 0x00, 0x00, 0x2F, +/* 00004560 */ 0xBC, 0x00, 0x00, 0x5F, 0xBC, 0x00, 0x00, 0x60, 0xBC, 0x00, 0x00, 0xC7, 0xBC, 0x00, 0x00, 0xFE, +/* 00004570 */ 0xBC, 0x00, 0x00, 0x35, 0xBD, 0x00, 0x00, 0x73, 0xBD, 0x00, 0x00, 0x74, 0xBD, 0x00, 0x00, 0xC5, +/* 00004580 */ 0xBD, 0x00, 0x00, 0x16, 0xBE, 0x00, 0x00, 0x17, 0xBE, 0x00, 0x00, 0x91, 0xBE, 0x00, 0x00, 0x00, +/* 00004590 */ 0xBF, 0x00, 0x00, 0x87, 0xBF, 0x00, 0x00, 0x99, 0xBF, 0x00, 0x00, 0x9A, 0xBF, 0x00, 0x00, 0xFB, +/* 000045A0 */ 0xBF, 0x00, 0x00, 0xFC, 0xBF, 0x00, 0x00, 0x34, 0xC0, 0x00, 0x00, 0x75, 0xC0, 0x00, 0x00, 0xE2, +/* 000045B0 */ 0xC0, 0x00, 0x00, 0xE3, 0xC0, 0x00, 0x00, 0x17, 0xC1, 0x00, 0x00, 0x75, 0xC1, 0x00, 0x00, 0xBE, +/* 000045C0 */ 0xC1, 0x00, 0x00, 0xD0, 0xC1, 0x00, 0x00, 0xD1, 0xC1, 0x00, 0x00, 0xFD, 0xC1, 0x00, 0x00, 0x38, +/* 000045D0 */ 0xC2, 0x00, 0x00, 0x75, 0xC2, 0x00, 0x00, 0x8B, 0xC2, 0x00, 0x00, 0xE1, 0xC2, 0x00, 0x00, 0xFB, +/* 000045E0 */ 0xC2, 0x00, 0x00, 0x47, 0xC3, 0x00, 0x00, 0x69, 0xC3, 0x00, 0x00, 0x97, 0xC3, 0x00, 0x00, 0xE4, +/* 000045F0 */ 0xC3, 0x00, 0x00, 0xFA, 0xC3, 0x00, 0x00, 0x70, 0xC4, 0x00, 0x00, 0xD4, 0xC4, 0x00, 0x00, 0xED, +/* 00004600 */ 0xC4, 0x00, 0x00, 0x17, 0xC5, 0x00, 0x00, 0x48, 0xC5, 0x00, 0x00, 0xB1, 0xC5, 0x00, 0x00, 0xE0, +/* 00004610 */ 0xC5, 0x00, 0x00, 0x3B, 0xC6, 0x00, 0x00, 0x58, 0xC6, 0x00, 0x00, 0xB2, 0xC6, 0x00, 0x00, 0xC8, +/* 00004620 */ 0xC6, 0x00, 0x00, 0xDA, 0xC6, 0x00, 0x00, 0xDB, 0xC6, 0x00, 0x00, 0x6F, 0xC7, 0x00, 0x00, 0x70, +/* 00004630 */ 0xC7, 0x00, 0x00, 0xA1, 0xC7, 0x00, 0x00, 0xD9, 0xC7, 0x00, 0x00, 0x1C, 0xC8, 0x00, 0x00, 0x4A, +/* 00004640 */ 0xC8, 0x00, 0x00, 0x4B, 0xC8, 0x00, 0x00, 0x79, 0xC8, 0x00, 0x00, 0xB1, 0xC8, 0x00, 0x00, 0xC3, +/* 00004650 */ 0xC8, 0x00, 0x00, 0xC4, 0xC8, 0x00, 0x00, 0xF9, 0xC8, 0x00, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x9E, +/* 00004660 */ 0xC9, 0x00, 0x00, 0xD6, 0xC9, 0x00, 0x00, 0x38, 0xCA, 0x00, 0x00, 0x75, 0xCA, 0x00, 0x00, 0xD5, +/* 00004670 */ 0xCA, 0x00, 0x00, 0x12, 0xCB, 0x00, 0x00, 0x72, 0xCB, 0x00, 0x00, 0x88, 0xCB, 0x00, 0x00, 0x9A, +/* 00004680 */ 0xCB, 0x00, 0x00, 0x9B, 0xCB, 0x00, 0x00, 0xE7, 0xCB, 0x00, 0x00, 0x35, 0xCC, 0x00, 0x00, 0x83, +/* 00004690 */ 0xCC, 0x00, 0x00, 0x84, 0xCC, 0x00, 0x00, 0xC2, 0xCC, 0x00, 0x00, 0x1A, 0xCD, 0x00, 0x00, 0x72, +/* 000046A0 */ 0xCD, 0x00, 0x00, 0x84, 0xCD, 0x00, 0x00, 0x85, 0xCD, 0x00, 0x00, 0xC5, 0xCD, 0x00, 0x00, 0xFF, +/* 000046B0 */ 0xCD, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x16, 0xCE, 0x00, 0x00, 0x6A, 0xCE, 0x00, 0x00, 0xA8, +/* 000046C0 */ 0xCE, 0x00, 0x00, 0xC6, 0xCE, 0x00, 0x00, 0xF0, 0xCE, 0x00, 0x00, 0x47, 0xCF, 0x00, 0x00, 0xCC, +/* 000046D0 */ 0xCF, 0x00, 0x00, 0x31, 0xD0, 0x00, 0x00, 0x6C, 0xD0, 0x00, 0x00, 0x7E, 0xD0, 0x00, 0x00, 0x7F, +/* 000046E0 */ 0xD0, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x00, 0x17, 0xD1, 0x00, 0x00, 0x29, 0xD1, 0x00, 0x00, 0x2A, +/* 000046F0 */ 0xD1, 0x00, 0x00, 0xA8, 0xD1, 0x00, 0x00, 0xE7, 0xD1, 0x00, 0x00, 0xF5, 0xD1, 0x00, 0x00, 0xF6, +/* 00004700 */ 0xD1, 0x00, 0x00, 0x66, 0xD2, 0x00, 0x00, 0xB5, 0xD2, 0x00, 0x00, 0x16, 0xD3, 0x00, 0x00, 0x28, +/* 00004710 */ 0xD3, 0x00, 0x00, 0x29, 0xD3, 0x00, 0x00, 0x63, 0xD3, 0x00, 0x00, 0xB4, 0xD3, 0x00, 0x00, 0xB5, +/* 00004720 */ 0xD3, 0x00, 0x00, 0xE6, 0xD3, 0x00, 0x00, 0x3A, 0xD4, 0x00, 0x00, 0x8F, 0xD4, 0x00, 0x00, 0xCC, +/* 00004730 */ 0xD4, 0x00, 0x00, 0xCD, 0xD4, 0x00, 0x00, 0xF4, 0xD4, 0x00, 0x00, 0x46, 0xD5, 0x00, 0x00, 0x85, +/* 00004740 */ 0xD5, 0x00, 0x00, 0xC8, 0xD5, 0x00, 0x00, 0xDE, 0xD5, 0x00, 0x00, 0xDF, 0xD5, 0x00, 0x00, 0x16, +/* 00004750 */ 0xD6, 0x00, 0x00, 0x17, 0xD6, 0x00, 0x00, 0x4B, 0xD6, 0x00, 0x00, 0x98, 0xD6, 0x00, 0x00, 0xAE, +/* 00004760 */ 0xD6, 0x00, 0x00, 0xAF, 0xD6, 0x00, 0x00, 0xEA, 0xD6, 0x00, 0x00, 0x30, 0xD7, 0x00, 0x00, 0x31, +/* 00004770 */ 0xD7, 0x00, 0x00, 0x67, 0xD7, 0x00, 0x00, 0xA6, 0xD7, 0x00, 0x00, 0xEB, 0xD7, 0x00, 0x00, 0x01, +/* 00004780 */ 0xD8, 0x00, 0x00, 0x02, 0xD8, 0x00, 0x00, 0x4E, 0xD8, 0x00, 0x00, 0x4F, 0xD8, 0x00, 0x00, 0xB4, +/* 00004790 */ 0xD8, 0x00, 0x00, 0xF0, 0xD8, 0x00, 0x00, 0xF1, 0xD8, 0x00, 0x00, 0x11, 0xD9, 0x00, 0x00, 0x23, +/* 000047A0 */ 0xD9, 0x00, 0x00, 0x69, 0xD9, 0x00, 0x00, 0x6A, 0xD9, 0x00, 0x00, 0x8F, 0xD9, 0x00, 0x00, 0xBD, +/* 000047B0 */ 0xD9, 0x00, 0x00, 0xBE, 0xD9, 0x00, 0x00, 0xF2, 0xD9, 0x00, 0x00, 0x5B, 0xDA, 0x00, 0x00, 0x71, +/* 000047C0 */ 0xDA, 0x00, 0x00, 0x72, 0xDA, 0x00, 0x00, 0xB9, 0xDA, 0x00, 0x00, 0x1A, 0xDB, 0x00, 0x00, 0x83, +/* 000047D0 */ 0xDB, 0x00, 0x00, 0x99, 0xDB, 0x00, 0x00, 0x9A, 0xDB, 0x00, 0x00, 0xF2, 0xDB, 0x00, 0x00, 0x4C, +/* 000047E0 */ 0xDC, 0x00, 0x00, 0x5E, 0xDC, 0x00, 0x00, 0xAF, 0xDC, 0x00, 0x00, 0xB0, 0xDC, 0x00, 0x00, 0x4A, +/* 000047F0 */ 0xDD, 0x00, 0x00, 0x4B, 0xDD, 0x00, 0x00, 0xC7, 0xDD, 0x00, 0x00, 0x45, 0xDE, 0x00, 0x00, 0x69, +/* 00004800 */ 0xDE, 0x00, 0x00, 0x6A, 0xDE, 0x00, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x4B, 0xDF, 0x00, 0x00, 0xE8, +/* 00004810 */ 0xDF, 0x00, 0x00, 0xE9, 0xDF, 0x00, 0x00, 0x3B, 0xE0, 0x00, 0x00, 0x73, 0xE0, 0x00, 0x00, 0xAB, +/* 00004820 */ 0xE0, 0x00, 0x00, 0x21, 0xE1, 0x00, 0x00, 0x3B, 0xE1, 0x00, 0x00, 0x86, 0xE1, 0x00, 0x00, 0xEB, +/* 00004830 */ 0xE1, 0x00, 0x00, 0x61, 0xE2, 0x00, 0x00, 0x7B, 0xE2, 0x00, 0x00, 0x7C, 0xE2, 0x00, 0x00, 0xC2, +/* 00004840 */ 0xE2, 0x00, 0x00, 0xC3, 0xE2, 0x00, 0x00, 0x1F, 0xE3, 0x00, 0x00, 0x75, 0xE3, 0x00, 0x00, 0xCC, +/* 00004850 */ 0xE3, 0x00, 0x00, 0xEA, 0xE3, 0x00, 0x00, 0x06, 0xE4, 0x00, 0x00, 0x07, 0xE4, 0x00, 0x00, 0x49, +/* 00004860 */ 0xE4, 0x00, 0x00, 0x96, 0xE4, 0x00, 0x00, 0xAA, 0xE4, 0x00, 0x00, 0xAB, 0xE4, 0x00, 0x00, 0xF4, +/* 00004870 */ 0xE4, 0x00, 0x00, 0x3B, 0xE5, 0x00, 0x00, 0x73, 0xE5, 0x00, 0x00, 0xE0, 0xE5, 0x00, 0x00, 0xFA, +/* 00004880 */ 0xE5, 0x00, 0x00, 0xFB, 0xE5, 0x00, 0x00, 0x46, 0xE6, 0x00, 0x00, 0xAB, 0xE6, 0x00, 0x00, 0x18, +/* 00004890 */ 0xE7, 0x00, 0x00, 0x32, 0xE7, 0x00, 0x00, 0x33, 0xE7, 0x00, 0x00, 0x6E, 0xE7, 0x00, 0x00, 0xAC, +/* 000048A0 */ 0xE7, 0x00, 0x00, 0xC0, 0xE7, 0x00, 0x00, 0xC1, 0xE7, 0x00, 0x00, 0xE6, 0xE7, 0x00, 0x00, 0xF4, +/* 000048B0 */ 0xE7, 0x00, 0x00, 0xFE, 0xE7, 0x00, 0x00, 0x4D, 0xE8, 0x00, 0x00, 0x67, 0xE8, 0x00, 0x00, 0x71, +/* 000048C0 */ 0xE8, 0x00, 0x00, 0x72, 0xE8, 0x00, 0x00, 0xF2, 0xE8, 0x00, 0x00, 0x1A, 0xE9, 0x00, 0x00, 0x1B, +/* 000048D0 */ 0xE9, 0x00, 0x00, 0x55, 0xE9, 0x00, 0x00, 0x9B, 0xE9, 0x00, 0x00, 0xC8, 0xE9, 0x00, 0x00, 0xFE, +/* 000048E0 */ 0xE9, 0x00, 0x00, 0x17, 0xEA, 0x00, 0x00, 0x51, 0xEA, 0x00, 0x00, 0x63, 0xEA, 0x00, 0x00, 0x64, +/* 000048F0 */ 0xEA, 0x00, 0x00, 0x8D, 0xEA, 0x00, 0x00, 0xCE, 0xEA, 0x00, 0x00, 0x61, 0xEB, 0x00, 0x00, 0x8F, +/* 00004900 */ 0xEB, 0x00, 0x00, 0xA5, 0xEB, 0x00, 0x00, 0xB7, 0xEB, 0x00, 0x00, 0xF8, 0xEB, 0x00, 0x00, 0x6E, +/* 00004910 */ 0xEC, 0x00, 0x00, 0x9C, 0xEC, 0x00, 0x00, 0xB2, 0xEC, 0x00, 0x00, 0xC4, 0xEC, 0x00, 0x00, 0xC5, +/* 00004920 */ 0xEC, 0x00, 0x00, 0x18, 0xED, 0x00, 0x00, 0x54, 0xED, 0x00, 0x00, 0x8E, 0xED, 0x00, 0x00, 0xCB, +/* 00004930 */ 0xED, 0x00, 0x00, 0xE3, 0xED, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x5A, 0xEE, 0x00, 0x00, 0x97, +/* 00004940 */ 0xEE, 0x00, 0x00, 0xAF, 0xEE, 0x00, 0x00, 0xEA, 0xEE, 0x00, 0x00, 0x24, 0xEF, 0x00, 0x00, 0x61, +/* 00004950 */ 0xEF, 0x00, 0x00, 0x79, 0xEF, 0x00, 0x00, 0x8B, 0xEF, 0x00, 0x00, 0xDE, 0xEF, 0x00, 0x00, 0x1A, +/* 00004960 */ 0xF0, 0x00, 0x00, 0x54, 0xF0, 0x00, 0x00, 0x91, 0xF0, 0x00, 0x00, 0xA9, 0xF0, 0x00, 0x00, 0xE7, +/* 00004970 */ 0xF0, 0x00, 0x00, 0x21, 0xF1, 0x00, 0x00, 0x5E, 0xF1, 0x00, 0x00, 0x76, 0xF1, 0x00, 0x00, 0xB4, +/* 00004980 */ 0xF1, 0x00, 0x00, 0xEE, 0xF1, 0x00, 0x00, 0x2B, 0xF2, 0x00, 0x00, 0x43, 0xF2, 0x00, 0x00, 0x55, +/* 00004990 */ 0xF2, 0x00, 0x00, 0x75, 0xF2, 0x00, 0x00, 0x83, 0xF2, 0x00, 0x00, 0x84, 0xF2, 0x00, 0x00, 0x0E, +/* 000049A0 */ 0xF3, 0x00, 0x00, 0x4B, 0xF3, 0x00, 0x00, 0x6E, 0xF3, 0x00, 0x00, 0x6F, 0xF3, 0x00, 0x00, 0x96, +/* 000049B0 */ 0xF3, 0x00, 0x00, 0xED, 0xF3, 0x00, 0x00, 0x4D, 0xF4, 0x00, 0x00, 0x8A, 0xF4, 0x00, 0x00, 0xE3, +/* 000049C0 */ 0xF4, 0x00, 0x00, 0xF9, 0xF4, 0x00, 0x00, 0x0B, 0xF5, 0x00, 0x00, 0x0C, 0xF5, 0x00, 0x00, 0x37, +/* 000049D0 */ 0xF5, 0x00, 0x00, 0x5B, 0xF5, 0x00, 0x00, 0x91, 0xF5, 0x00, 0x00, 0xEC, 0xF5, 0x00, 0x00, 0x29, +/* 000049E0 */ 0xF6, 0x00, 0x00, 0x7D, 0xF6, 0x00, 0x00, 0x93, 0xF6, 0x00, 0x00, 0xA5, 0xF6, 0x00, 0x00, 0xA6, +/* 000049F0 */ 0xF6, 0x00, 0x00, 0xCB, 0xF6, 0x00, 0x00, 0x21, 0xF7, 0x00, 0x00, 0x78, 0xF7, 0x00, 0x00, 0xD2, +/* 00004A00 */ 0xF7, 0x00, 0x00, 0x2E, 0xF8, 0x00, 0x00, 0x69, 0xF8, 0x00, 0x00, 0xBE, 0xF8, 0x00, 0x00, 0xD4, +/* 00004A10 */ 0xF8, 0x00, 0x00, 0xE6, 0xF8, 0x00, 0x00, 0xE7, 0xF8, 0x00, 0x00, 0x0A, 0xF9, 0x00, 0x00, 0x54, +/* 00004A20 */ 0xF9, 0x00, 0x00, 0x66, 0xF9, 0x00, 0x00, 0x67, 0xF9, 0x00, 0x00, 0x93, 0xF9, 0x00, 0x00, 0xCF, +/* 00004A30 */ 0xF9, 0x00, 0x00, 0x2E, 0xFA, 0x00, 0x00, 0x70, 0xFA, 0x00, 0x00, 0xC8, 0xFA, 0x00, 0x00, 0xDE, +/* 00004A40 */ 0xFA, 0x00, 0x00, 0xF0, 0xFA, 0x00, 0x00, 0xF1, 0xFA, 0x00, 0x00, 0x57, 0xFB, 0x00, 0x00, 0x7F, +/* 00004A50 */ 0xFB, 0x00, 0x00, 0xCB, 0xFB, 0x00, 0x00, 0xE1, 0xFB, 0x00, 0x00, 0xF5, 0xFB, 0x00, 0x00, 0xF6, +/* 00004A60 */ 0xFB, 0x00, 0x00, 0x2C, 0xFC, 0x00, 0x00, 0xA2, 0xFC, 0x00, 0x00, 0xB0, 0xFC, 0x00, 0x00, 0xB1, +/* 00004A70 */ 0xFC, 0x00, 0x00, 0xDE, 0xFC, 0x00, 0x00, 0x0E, 0xFD, 0x00, 0x00, 0x3A, 0xFD, 0x00, 0x00, 0x66, +/* 00004A80 */ 0xFD, 0x00, 0x00, 0x96, 0xFD, 0x00, 0x00, 0xC2, 0xFD, 0x00, 0x00, 0xEE, 0xFD, 0x00, 0x00, 0x23, +/* 00004A90 */ 0xFE, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x00, 0x76, 0xFE, 0x00, 0x00, 0x85, 0xFE, 0x00, 0x00, 0x86, +/* 00004AA0 */ 0xFE, 0x00, 0x00, 0xBD, 0xFE, 0x00, 0x00, 0xF4, 0xFE, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x25, +/* 00004AB0 */ 0xFF, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x00, 0x6E, 0xFF, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x7D, +/* 00004AC0 */ 0xFF, 0x00, 0x00, 0xED, 0xFF, 0x00, 0x00, 0x49, 0x00, 0x01, 0x00, 0xBF, 0x00, 0x01, 0x00, 0x50, +/* 00004AD0 */ 0x01, 0x01, 0x00, 0xCE, 0x01, 0x01, 0x00, 0xF4, 0x01, 0x01, 0x00, 0xE9, 0x02, 0x01, 0x00, 0x13, +/* 00004AE0 */ 0x03, 0x01, 0x00, 0x25, 0x03, 0x01, 0x00, 0x26, 0x03, 0x01, 0x00, 0x69, 0x03, 0x01, 0x00, 0xEB, +/* 00004AF0 */ 0x03, 0x01, 0x00, 0x1E, 0x04, 0x01, 0x00, 0xD4, 0x04, 0x01, 0x00, 0xE6, 0x04, 0x01, 0x00, 0x0C, +/* 00004B00 */ 0x05, 0x01, 0x00, 0x1A, 0x05, 0x01, 0x00, 0x1B, 0x05, 0x01, 0x00, 0x80, 0x05, 0x01, 0x00, 0xCA, +/* 00004B10 */ 0x05, 0x01, 0x00, 0x3E, 0x06, 0x01, 0x00, 0xCF, 0x06, 0x01, 0x00, 0xF5, 0x06, 0x01, 0x00, 0xF5, +/* 00004B20 */ 0x07, 0x01, 0x00, 0x1F, 0x08, 0x01, 0x00, 0x31, 0x08, 0x01, 0x00, 0x32, 0x08, 0x01, 0x00, 0x7C, +/* 00004B30 */ 0x08, 0x01, 0x00, 0xAB, 0x08, 0x01, 0x00, 0x29, 0x09, 0x01, 0x00, 0x5E, 0x09, 0x01, 0x00, 0xD9, +/* 00004B40 */ 0x09, 0x01, 0x00, 0xEB, 0x09, 0x01, 0x00, 0xEC, 0x09, 0x01, 0x00, 0x12, 0x0A, 0x01, 0x00, 0x20, +/* 00004B50 */ 0x0A, 0x01, 0x00, 0x21, 0x0A, 0x01, 0x00, 0x83, 0x0A, 0x01, 0x00, 0xCE, 0x0A, 0x01, 0x00, 0x0C, +/* 00004B60 */ 0x0B, 0x01, 0x00, 0x85, 0x0B, 0x01, 0x00, 0x97, 0x0B, 0x01, 0x00, 0x98, 0x0B, 0x01, 0x00, 0xD2, +/* 00004B70 */ 0x0B, 0x01, 0x00, 0x3F, 0x0C, 0x01, 0x00, 0x9E, 0x0C, 0x01, 0x00, 0x13, 0x0D, 0x01, 0x00, 0x25, +/* 00004B80 */ 0x0D, 0x01, 0x00, 0x26, 0x0D, 0x01, 0x00, 0x61, 0x0D, 0x01, 0x00, 0xCC, 0x0D, 0x01, 0x00, 0xF6, +/* 00004B90 */ 0x0D, 0x01, 0x00, 0x6A, 0x0E, 0x01, 0x00, 0x87, 0x0E, 0x01, 0x00, 0x0A, 0x0F, 0x01, 0x00, 0x20, +/* 00004BA0 */ 0x0F, 0x01, 0x00, 0x5F, 0x0F, 0x01, 0x00, 0xCA, 0x0F, 0x01, 0x00, 0xF4, 0x0F, 0x01, 0x00, 0x68, +/* 00004BB0 */ 0x10, 0x01, 0x00, 0x85, 0x10, 0x01, 0x00, 0xFE, 0x10, 0x01, 0x00, 0x14, 0x11, 0x01, 0x00, 0x26, +/* 00004BC0 */ 0x11, 0x01, 0x00, 0x27, 0x11, 0x01, 0x00, 0xBC, 0x11, 0x01, 0x00, 0x48, 0x12, 0x01, 0x00, 0xBB, +/* 00004BD0 */ 0x12, 0x01, 0x00, 0xFE, 0x12, 0x01, 0x00, 0x7A, 0x13, 0x01, 0x00, 0x8C, 0x13, 0x01, 0x00, 0x8D, +/* 00004BE0 */ 0x13, 0x01, 0x00, 0xC7, 0x13, 0x01, 0x00, 0x3F, 0x14, 0x01, 0x00, 0x51, 0x14, 0x01, 0x00, 0x52, +/* 00004BF0 */ 0x14, 0x01, 0x00, 0x8D, 0x14, 0x01, 0x00, 0x07, 0x15, 0x01, 0x00, 0x19, 0x15, 0x01, 0x00, 0x1A, +/* 00004C00 */ 0x15, 0x01, 0x00, 0x57, 0x15, 0x01, 0x00, 0xD5, 0x15, 0x01, 0x00, 0xE7, 0x15, 0x01, 0x00, 0xE8, +/* 00004C10 */ 0x15, 0x01, 0x00, 0x25, 0x16, 0x01, 0x00, 0xA3, 0x16, 0x01, 0x00, 0xB5, 0x16, 0x01, 0x00, 0xB6, +/* 00004C20 */ 0x16, 0x01, 0x00, 0xF9, 0x16, 0x01, 0x00, 0x76, 0x17, 0x01, 0x00, 0x88, 0x17, 0x01, 0x00, 0x89, +/* 00004C30 */ 0x17, 0x01, 0x00, 0xAF, 0x17, 0x01, 0x00, 0xBD, 0x17, 0x01, 0x00, 0xBE, 0x17, 0x01, 0x00, 0x13, +/* 00004C40 */ 0x18, 0x01, 0x00, 0x4C, 0x18, 0x01, 0x00, 0x7C, 0x18, 0x01, 0x00, 0x8E, 0x18, 0x01, 0x00, 0x8F, +/* 00004C50 */ 0x18, 0x01, 0x00, 0x2A, 0x19, 0x01, 0x00, 0x8C, 0x19, 0x01, 0x00, 0x9E, 0x19, 0x01, 0x00, 0x9F, +/* 00004C60 */ 0x19, 0x01, 0x00, 0xDE, 0x19, 0x01, 0x00, 0xDF, 0x19, 0x01, 0x00, 0x06, 0x1A, 0x01, 0x00, 0x4B, +/* 00004C70 */ 0x1A, 0x01, 0x00, 0x4C, 0x1A, 0x01, 0x00, 0xBD, 0x1A, 0x01, 0x00, 0x1C, 0x1B, 0x01, 0x00, 0x1D, +/* 00004C80 */ 0x1B, 0x01, 0x00, 0x4B, 0x1B, 0x01, 0x00, 0x9E, 0x1B, 0x01, 0x00, 0xB7, 0x1B, 0x01, 0x00, 0xF5, +/* 00004C90 */ 0x1B, 0x01, 0x00, 0x07, 0x1C, 0x01, 0x00, 0x08, 0x1C, 0x01, 0x00, 0x36, 0x1C, 0x01, 0x00, 0x71, +/* 00004CA0 */ 0x1C, 0x01, 0x00, 0x83, 0x1C, 0x01, 0x00, 0x84, 0x1C, 0x01, 0x00, 0xA6, 0x1C, 0x01, 0x00, 0x15, +/* 00004CB0 */ 0x1D, 0x01, 0x00, 0x7C, 0x1D, 0x01, 0x00, 0xE0, 0x1D, 0x01, 0x00, 0x61, 0x1E, 0x01, 0x00, 0xC3, +/* 00004CC0 */ 0x1E, 0x01, 0x00, 0x27, 0x1F, 0x01, 0x00, 0x8F, 0x1F, 0x01, 0x00, 0xF7, 0x1F, 0x01, 0x00, 0x66, +/* 00004CD0 */ 0x20, 0x01, 0x00, 0x67, 0x20, 0x01, 0x00, 0xD6, 0x20, 0x01, 0x00, 0x4C, 0x21, 0x01, 0x00, 0x4D, +/* 00004CE0 */ 0x21, 0x01, 0x00, 0xBD, 0x21, 0x01, 0x00, 0xBE, 0x21, 0x01, 0x00, 0x0F, 0x22, 0x01, 0x00, 0x35, +/* 00004CF0 */ 0x22, 0x01, 0x00, 0x53, 0x22, 0x01, 0x00, 0x73, 0x22, 0x01, 0x00, 0x95, 0x22, 0x01, 0x00, 0xB3, +/* 00004D00 */ 0x22, 0x01, 0x00, 0xD3, 0x22, 0x01, 0x00, 0xF7, 0x22, 0x01, 0x00, 0x1B, 0x23, 0x01, 0x00, 0x4A, +/* 00004D10 */ 0x23, 0x01, 0x00, 0x65, 0x23, 0x01, 0x00, 0x66, 0x23, 0x01, 0x00, 0x8E, 0x23, 0x01, 0x00, 0xCF, +/* 00004D20 */ 0x23, 0x01, 0x00, 0x42, 0x24, 0x01, 0x00, 0x43, 0x24, 0x01, 0x00, 0x69, 0x24, 0x01, 0x00, 0x9D, +/* 00004D30 */ 0x24, 0x01, 0x00, 0xD3, 0x24, 0x01, 0x00, 0x18, 0x25, 0x01, 0x00, 0x19, 0x25, 0x01, 0x00, 0x3B, +/* 00004D40 */ 0x25, 0x01, 0x00, 0x6F, 0x25, 0x01, 0x00, 0x9B, 0x25, 0x01, 0x00, 0xC9, 0x25, 0x01, 0x00, 0xF9, +/* 00004D50 */ 0x25, 0x01, 0x00, 0x25, 0x26, 0x01, 0x00, 0x53, 0x26, 0x01, 0x00, 0x85, 0x26, 0x01, 0x00, 0xB7, +/* 00004D60 */ 0x26, 0x01, 0x00, 0xF5, 0x26, 0x01, 0x00, 0xF6, 0x26, 0x01, 0x00, 0x28, 0x27, 0x01, 0x00, 0x68, +/* 00004D70 */ 0x27, 0x01, 0x00, 0xA6, 0x27, 0x01, 0x00, 0xA7, 0x27, 0x01, 0x00, 0xE9, 0x27, 0x01, 0x00, 0xEA, +/* 00004D80 */ 0x27, 0x01, 0x00, 0xFD, 0x27, 0x01, 0x00, 0x16, 0x28, 0x01, 0x00, 0x6B, 0x28, 0x01, 0x00, 0xE2, +/* 00004D90 */ 0x28, 0x01, 0x00, 0x84, 0x29, 0x01, 0x00, 0x28, 0x2A, 0x01, 0x00, 0x8D, 0x2A, 0x01, 0x00, 0xA1, +/* 00004DA0 */ 0x2A, 0x01, 0x00, 0xCA, 0x2A, 0x01, 0x00, 0xCB, 0x2A, 0x01, 0x00, 0xE1, 0x2A, 0x01, 0x00, 0x30, +/* 00004DB0 */ 0x2B, 0x01, 0x00, 0x71, 0x2B, 0x01, 0x00, 0x8F, 0x2B, 0x01, 0x00, 0xB9, 0x2B, 0x01, 0x00, 0xE3, +/* 00004DC0 */ 0x2B, 0x01, 0x00, 0xE4, 0x2B, 0x01, 0x00, 0x52, 0x2C, 0x01, 0x00, 0xA8, 0x2C, 0x01, 0x00, 0xFC, +/* 00004DD0 */ 0x2C, 0x01, 0x00, 0x66, 0x2D, 0x01, 0x00, 0x8E, 0x2D, 0x01, 0x00, 0xA0, 0x2D, 0x01, 0x00, 0xA1, +/* 00004DE0 */ 0x2D, 0x01, 0x00, 0xC5, 0x2D, 0x01, 0x00, 0xF7, 0x2D, 0x01, 0x00, 0x77, 0x2E, 0x01, 0x00, 0x89, +/* 00004DF0 */ 0x2E, 0x01, 0x00, 0x8A, 0x2E, 0x01, 0x00, 0xA0, 0x2E, 0x01, 0x00, 0xD5, 0x2E, 0x01, 0x00, 0x15, +/* 00004E00 */ 0x2F, 0x01, 0x00, 0x33, 0x2F, 0x01, 0x00, 0x5D, 0x2F, 0x01, 0x00, 0x87, 0x2F, 0x01, 0x00, 0x88, +/* 00004E10 */ 0x2F, 0x01, 0x00, 0xEA, 0x2F, 0x01, 0x00, 0x6F, 0x30, 0x01, 0x00, 0xD4, 0x30, 0x01, 0x00, 0x0F, +/* 00004E20 */ 0x31, 0x01, 0x00, 0x21, 0x31, 0x01, 0x00, 0x22, 0x31, 0x01, 0x00, 0x4F, 0x31, 0x01, 0x00, 0xB4, +/* 00004E30 */ 0x31, 0x01, 0x00, 0xB5, 0x31, 0x01, 0x00, 0x37, 0x32, 0x01, 0x00, 0x72, 0x32, 0x01, 0x00, 0xD1, +/* 00004E40 */ 0x32, 0x01, 0x00, 0xE3, 0x32, 0x01, 0x00, 0x26, 0x33, 0x01, 0x00, 0x34, 0x33, 0x01, 0x00, 0x35, +/* 00004E50 */ 0x33, 0x01, 0x00, 0x8B, 0x33, 0x01, 0x00, 0xE9, 0x33, 0x01, 0x00, 0x39, 0x34, 0x01, 0x00, 0x5C, +/* 00004E60 */ 0x34, 0x01, 0x00, 0x83, 0x34, 0x01, 0x00, 0xA9, 0x34, 0x01, 0x00, 0xBF, 0x34, 0x01, 0x00, 0xC0, +/* 00004E70 */ 0x34, 0x01, 0x00, 0x35, 0x35, 0x01, 0x00, 0x80, 0x35, 0x01, 0x00, 0xC2, 0x35, 0x01, 0x00, 0xD4, +/* 00004E80 */ 0x35, 0x01, 0x00, 0x27, 0x36, 0x01, 0x00, 0x5F, 0x36, 0x01, 0x00, 0x8A, 0x36, 0x01, 0x00, 0x9C, +/* 00004E90 */ 0x36, 0x01, 0x00, 0x9D, 0x36, 0x01, 0x00, 0xCA, 0x36, 0x01, 0x00, 0x0C, 0x37, 0x01, 0x00, 0x7A, +/* 00004EA0 */ 0x37, 0x01, 0x00, 0xC9, 0x37, 0x01, 0x00, 0xFA, 0x37, 0x01, 0x00, 0x55, 0x38, 0x01, 0x00, 0x72, +/* 00004EB0 */ 0x38, 0x01, 0x00, 0x9C, 0x38, 0x01, 0x00, 0xDA, 0x38, 0x01, 0x00, 0x54, 0x39, 0x01, 0x00, 0xAF, +/* 00004EC0 */ 0x39, 0x01, 0x00, 0xC5, 0x39, 0x01, 0x00, 0xD7, 0x39, 0x01, 0x00, 0xD8, 0x39, 0x01, 0x00, 0xFC, +/* 00004ED0 */ 0x39, 0x01, 0x00, 0x36, 0x3A, 0x01, 0x00, 0xA8, 0x3A, 0x01, 0x00, 0xBA, 0x3A, 0x01, 0x00, 0xBB, +/* 00004EE0 */ 0x3A, 0x01, 0x00, 0x19, 0x3B, 0x01, 0x00, 0x27, 0x3B, 0x01, 0x00, 0x28, 0x3B, 0x01, 0x00, 0xA5, +/* 00004EF0 */ 0x3B, 0x01, 0x00, 0x31, 0x3C, 0x01, 0x00, 0xB0, 0x3C, 0x01, 0x00, 0x39, 0x3D, 0x01, 0x00, 0x5E, +/* 00004F00 */ 0x3D, 0x01, 0x00, 0x6D, 0x3D, 0x01, 0x00, 0xF8, 0x3D, 0x01, 0x00, 0x7E, 0x3E, 0x01, 0x00, 0x08, +/* 00004F10 */ 0x3F, 0x01, 0x00, 0x5C, 0x3F, 0x01, 0x00, 0x6B, 0x3F, 0x01, 0x00, 0xED, 0x3F, 0x01, 0x00, 0x5E, +/* 00004F20 */ 0x40, 0x01, 0x00, 0xB9, 0x40, 0x01, 0x00, 0x24, 0x41, 0x01, 0x00, 0x9E, 0x41, 0x01, 0x00, 0xEF, +/* 00004F30 */ 0x41, 0x01, 0x00, 0xFE, 0x41, 0x01, 0x00, 0x74, 0x42, 0x01, 0x00, 0x83, 0x42, 0x01, 0x00, 0x0F, +/* 00004F40 */ 0x43, 0x01, 0x00, 0x98, 0x43, 0x01, 0x00, 0xE3, 0x43, 0x01, 0x00, 0xE4, 0x43, 0x01, 0x00, 0x34, +/* 00004F50 */ 0x44, 0x01, 0x00, 0xD1, 0x44, 0x01, 0x00, 0x56, 0x45, 0x01, 0x00, 0x7F, 0x45, 0x01, 0x00, 0x25, +/* 00004F60 */ 0x46, 0x01, 0x00, 0x26, 0x46, 0x01, 0x00, 0x76, 0x46, 0x01, 0x00, 0x17, 0x47, 0x01, 0x00, 0x9C, +/* 00004F70 */ 0x47, 0x01, 0x00, 0xC5, 0x47, 0x01, 0x00, 0x79, 0x48, 0x01, 0x00, 0x7A, 0x48, 0x01, 0x00, 0xCA, +/* 00004F80 */ 0x48, 0x01, 0x00, 0x6B, 0x49, 0x01, 0x00, 0xF0, 0x49, 0x01, 0x00, 0x19, 0x4A, 0x01, 0x00, 0xCD, +/* 00004F90 */ 0x4A, 0x01, 0x00, 0xCE, 0x4A, 0x01, 0x00, 0xF5, 0x4A, 0x01, 0x00, 0x49, 0x4B, 0x01, 0x00, 0x88, +/* 00004FA0 */ 0x4B, 0x01, 0x00, 0xCD, 0x4B, 0x01, 0x00, 0xE3, 0x4B, 0x01, 0x00, 0xE4, 0x4B, 0x01, 0x00, 0x1B, +/* 00004FB0 */ 0x4C, 0x01, 0x00, 0x4F, 0x4C, 0x01, 0x00, 0x9E, 0x4C, 0x01, 0x00, 0xB4, 0x4C, 0x01, 0x00, 0xB5, +/* 00004FC0 */ 0x4C, 0x01, 0x00, 0xF0, 0x4C, 0x01, 0x00, 0x36, 0x4D, 0x01, 0x00, 0x37, 0x4D, 0x01, 0x00, 0x6D, +/* 00004FD0 */ 0x4D, 0x01, 0x00, 0xAC, 0x4D, 0x01, 0x00, 0xF1, 0x4D, 0x01, 0x00, 0x07, 0x4E, 0x01, 0x00, 0x08, +/* 00004FE0 */ 0x4E, 0x01, 0x00, 0x56, 0x4E, 0x01, 0x00, 0x57, 0x4E, 0x01, 0x00, 0xBD, 0x4E, 0x01, 0x00, 0xF9, +/* 00004FF0 */ 0x4E, 0x01, 0x00, 0xFA, 0x4E, 0x01, 0x00, 0x1A, 0x4F, 0x01, 0x00, 0x2C, 0x4F, 0x01, 0x00, 0x76, +/* 00005000 */ 0x4F, 0x01, 0x00, 0x77, 0x4F, 0x01, 0x00, 0x9F, 0x4F, 0x01, 0x00, 0xD3, 0x4F, 0x01, 0x00, 0x40, +/* 00005010 */ 0x50, 0x01, 0x00, 0x56, 0x50, 0x01, 0x00, 0x9D, 0x50, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x6D, +/* 00005020 */ 0x51, 0x01, 0x00, 0x83, 0x51, 0x01, 0x00, 0x84, 0x51, 0x01, 0x00, 0xD6, 0x51, 0x01, 0x00, 0x0B, +/* 00005030 */ 0x52, 0x01, 0x00, 0x21, 0x52, 0x01, 0x00, 0x22, 0x52, 0x01, 0x00, 0x51, 0x52, 0x01, 0x00, 0x7F, +/* 00005040 */ 0x52, 0x01, 0x00, 0xBB, 0x52, 0x01, 0x00, 0xD8, 0x52, 0x01, 0x00, 0x07, 0x53, 0x01, 0x00, 0x1D, +/* 00005050 */ 0x53, 0x01, 0x00, 0x1E, 0x53, 0x01, 0x00, 0x73, 0x53, 0x01, 0x00, 0x85, 0x53, 0x01, 0x00, 0xD8, +/* 00005060 */ 0x53, 0x01, 0x00, 0xD9, 0x53, 0x01, 0x00, 0x20, 0x54, 0x01, 0x00, 0x21, 0x54, 0x01, 0x00, 0xBE, +/* 00005070 */ 0x54, 0x01, 0x00, 0x08, 0x55, 0x01, 0x00, 0xA9, 0x55, 0x01, 0x00, 0xAA, 0x55, 0x01, 0x00, 0xF5, +/* 00005080 */ 0x55, 0x01, 0x00, 0x3C, 0x56, 0x01, 0x00, 0x74, 0x56, 0x01, 0x00, 0xE5, 0x56, 0x01, 0x00, 0xFF, +/* 00005090 */ 0x56, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x4B, 0x57, 0x01, 0x00, 0xB2, 0x57, 0x01, 0x00, 0x23, +/* 000050A0 */ 0x58, 0x01, 0x00, 0x3D, 0x58, 0x01, 0x00, 0x3E, 0x58, 0x01, 0x00, 0x79, 0x58, 0x01, 0x00, 0xB7, +/* 000050B0 */ 0x58, 0x01, 0x00, 0xCB, 0x58, 0x01, 0x00, 0xCC, 0x58, 0x01, 0x00, 0x20, 0x59, 0x01, 0x00, 0x58, +/* 000050C0 */ 0x59, 0x01, 0x00, 0x90, 0x59, 0x01, 0x00, 0x0A, 0x5A, 0x01, 0x00, 0x24, 0x5A, 0x01, 0x00, 0x6F, +/* 000050D0 */ 0x5A, 0x01, 0x00, 0xD6, 0x5A, 0x01, 0x00, 0x50, 0x5B, 0x01, 0x00, 0x6A, 0x5B, 0x01, 0x00, 0x9C, +/* 000050E0 */ 0x5B, 0x01, 0x00, 0xD7, 0x5B, 0x01, 0x00, 0x2E, 0x5C, 0x01, 0x00, 0x93, 0x5C, 0x01, 0x00, 0xD2, +/* 000050F0 */ 0x5C, 0x01, 0x00, 0x0D, 0x5D, 0x01, 0x00, 0x4A, 0x5D, 0x01, 0x00, 0x7F, 0x5D, 0x01, 0x00, 0xB6, +/* 00005100 */ 0x5D, 0x01, 0x00, 0xEF, 0x5D, 0x01, 0x00, 0x24, 0x5E, 0x01, 0x00, 0x5B, 0x5E, 0x01, 0x00, 0x96, +/* 00005110 */ 0x5E, 0x01, 0x00, 0xD1, 0x5E, 0x01, 0x00, 0x17, 0x5F, 0x01, 0x00, 0x38, 0x5F, 0x01, 0x00, 0x76, +/* 00005120 */ 0x5F, 0x01, 0x00, 0xE8, 0x5F, 0x01, 0x00, 0x8A, 0x60, 0x01, 0x00, 0xC6, 0x60, 0x01, 0x00, 0xE4, +/* 00005130 */ 0x60, 0x01, 0x00, 0x0E, 0x61, 0x01, 0x00, 0x56, 0x61, 0x01, 0x00, 0xA3, 0x61, 0x01, 0x00, 0xB7, +/* 00005140 */ 0x61, 0x01, 0x00, 0xB8, 0x61, 0x01, 0x00, 0x56, 0x62, 0x01, 0x00, 0x57, 0x62, 0x01, 0x00, 0x7E, +/* 00005150 */ 0x62, 0x01, 0x00, 0x8C, 0x62, 0x01, 0x00, 0x96, 0x62, 0x01, 0x00, 0xE7, 0x62, 0x01, 0x00, 0x01, +/* 00005160 */ 0x63, 0x01, 0x00, 0x0B, 0x63, 0x01, 0x00, 0x0C, 0x63, 0x01, 0x00, 0x3D, 0x63, 0x01, 0x00, 0x5C, +/* 00005170 */ 0x63, 0x01, 0x00, 0xF2, 0x63, 0x01, 0x00, 0x88, 0x64, 0x01, 0x00, 0x1E, 0x65, 0x01, 0x00, 0xB4, +/* 00005180 */ 0x65, 0x01, 0x00, 0xBA, 0x65, 0x01, 0x00, 0xBE, 0x65, 0x01, 0x00, 0x00, 0x53, 0xB9, 0x0C, 0x00, +/* 00005190 */ 0x00, 0x00, 0x04, 0x02, 0xA8, 0x41, 0xC0, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, 0x70, 0x01, 0x01, +/* 000051A0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFF, 0x4E, 0x64, 0x01, 0x00, 0xFF, 0x4E, 0x64, +/* 000051B0 */ 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x0A, 0x09, 0xA8, +/* 000051C0 */ 0x00, 0xD4, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0xD3, +/* 000051D0 */ 0x51, 0x00, 0x00, 0xBF, 0x1D, 0x80, 0xE0, 0x89, 0xC6, 0x12, 0x07, 0x01, 0xA2, 0x41, 0xD1, 0x00, +/* 000051E0 */ 0x01, 0xFE, 0x90, 0x01, 0x21, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x90, 0x01, 0xFF, +/* 000051F0 */ 0x2B, 0x64, 0x01, 0x00, 0xFF, 0x2B, 0x64, 0x01, 0x00, 0x40, 0x4B, 0x18, 0x3D, 0x51, 0x09, 0xFE, +/* 00005200 */ 0x47, 0x02, 0xFE, 0x41, 0x02, 0x0F, 0x4B, 0x4A, 0x4B, 0x4B, 0x15, 0x4E, 0x4F, 0x50, 0x0B, 0x06, +/* 00005210 */ 0xFE, 0xE6, 0x02, 0x06, 0xFE, 0xE7, 0x02, 0x06, 0xFE, 0xE8, 0x02, 0x06, 0xFE, 0xE9, 0x02, 0x06, +/* 00005220 */ 0xFE, 0xEA, 0x02, 0x07, 0x08, 0x06, 0xFE, 0xEB, 0x02, 0x01, 0x00, 0x06, 0xFE, 0xEC, 0x02, 0x06, +/* 00005230 */ 0xFE, 0xED, 0x02, 0x01, 0x01, 0x06, 0xFE, 0xEE, 0x02, 0x01, 0x02, 0x06, 0xFE, 0xEF, 0x02, 0x01, +/* 00005240 */ 0x03, 0x06, 0xFE, 0xF0, 0x02, 0x01, 0x04, 0x06, 0xFE, 0xF1, 0x02, 0x01, 0x05, 0x06, 0xFE, 0xF2, +/* 00005250 */ 0x02, 0x05, 0xFE, 0xF3, 0x02, 0x05, 0xFE, 0xF4, 0x02, 0x05, 0xFE, 0xF5, 0x02, 0x05, 0xFE, 0xF6, +/* 00005260 */ 0x02, 0x05, 0xFE, 0xF7, 0x02, 0x06, 0xFE, 0xF8, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xFA, +/* 00005270 */ 0x02, 0x05, 0xFE, 0xFB, 0x02, 0x06, 0xFE, 0xFC, 0x02, 0x06, 0xFE, 0xFD, 0x02, 0x05, 0xFE, 0xFE, +/* 00005280 */ 0x02, 0x06, 0xFE, 0xFF, 0x02, 0x06, 0xFE, 0x00, 0x03, 0x06, 0xFE, 0x01, 0x03, 0x05, 0xFE, 0x02, +/* 00005290 */ 0x03, 0x06, 0xFE, 0x03, 0x03, 0x06, 0xFE, 0x04, 0x03, 0x05, 0xFE, 0x05, 0x03, 0x06, 0xFE, 0x06, +/* 000052A0 */ 0x03, 0x06, 0xFE, 0x07, 0x03, 0x05, 0xFE, 0x08, 0x03, 0x06, 0xFE, 0x09, 0x03, 0x06, 0xFE, 0x0A, +/* 000052B0 */ 0x03, 0x06, 0xFE, 0x0B, 0x03, 0x06, 0xFE, 0x0C, 0x03, 0x06, 0xFE, 0x0D, 0x03, 0x06, 0xFE, 0x0E, +/* 000052C0 */ 0x03, 0x06, 0xFE, 0x0F, 0x03, 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x06, 0xFE, 0x12, +/* 000052D0 */ 0x03, 0x06, 0xFE, 0x13, 0x03, 0x0C, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x06, 0xFE, +/* 000052E0 */ 0x16, 0x03, 0xFE, 0x1C, 0x08, 0x96, 0x38, 0x3E, 0xD4, 0x0E, 0x3F, 0x96, 0x02, 0x3F, 0xD4, 0x0F, +/* 000052F0 */ 0x40, 0x96, 0x03, 0x40, 0xD4, 0x10, 0x41, 0x96, 0x04, 0x41, 0xD4, 0x11, 0x42, 0x96, 0x05, 0x42, +/* 00005300 */ 0xD4, 0x12, 0x43, 0x96, 0x06, 0x43, 0xD4, 0x13, 0x44, 0x96, 0x07, 0x44, 0xD4, 0x14, 0x45, 0x96, +/* 00005310 */ 0x08, 0x45, 0x4F, 0x46, 0x4F, 0x49, 0x4F, 0x4A, 0x4F, 0x51, 0x96, 0x39, 0x51, 0x4F, 0x51, 0x96, +/* 00005320 */ 0x3A, 0x51, 0x4F, 0x51, 0x96, 0x3B, 0x51, 0x4F, 0x51, 0x96, 0x3C, 0x51, 0x4F, 0x51, 0x96, 0x3D, +/* 00005330 */ 0x51, 0x4F, 0x51, 0x96, 0x3E, 0x51, 0x4F, 0x51, 0x96, 0x3F, 0x51, 0x4F, 0x51, 0x96, 0x40, 0x51, +/* 00005340 */ 0x4F, 0x51, 0x96, 0x41, 0x51, 0x4F, 0x51, 0x96, 0x42, 0x51, 0x4F, 0x51, 0x96, 0x43, 0x51, 0x4F, +/* 00005350 */ 0x51, 0x96, 0x44, 0x51, 0x4F, 0x51, 0x96, 0x45, 0x51, 0x4F, 0x51, 0x96, 0x46, 0x51, 0x4F, 0x51, +/* 00005360 */ 0x96, 0x47, 0x51, 0x4F, 0x51, 0x96, 0x48, 0x51, 0x4F, 0x51, 0x96, 0x49, 0x51, 0x4F, 0x51, 0x96, +/* 00005370 */ 0x4A, 0x51, 0x4F, 0x51, 0x96, 0x4B, 0x51, 0x4F, 0x51, 0x96, 0x4C, 0x51, 0x61, 0x51, 0x3D, 0x00, +/* 00005380 */ 0x96, 0x09, 0x51, 0x92, 0x09, 0x51, 0x76, 0x02, 0x51, 0x01, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, +/* 00005390 */ 0x02, 0xA8, 0x52, 0x14, 0x03, 0x00, 0x51, 0x52, 0x09, 0x15, 0x00, 0x92, 0x09, 0x51, 0x92, 0x09, +/* 000053A0 */ 0x52, 0x61, 0x52, 0x52, 0x03, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x52, 0x52, 0x76, 0x52, 0x51, 0x04, +/* 000053B0 */ 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x05, 0xA8, 0x52, 0x14, 0x03, 0x00, 0x51, 0x52, 0x09, 0x15, +/* 000053C0 */ 0x00, 0x92, 0x09, 0x51, 0x92, 0x09, 0x52, 0x61, 0x52, 0x52, 0x03, 0x07, 0x01, 0x00, 0xC2, 0x01, +/* 000053D0 */ 0x52, 0x52, 0x76, 0x52, 0x51, 0x06, 0x92, 0x09, 0x52, 0x61, 0x52, 0x52, 0x07, 0xAC, 0x51, 0x0F, +/* 000053E0 */ 0x02, 0x00, 0x52, 0xAB, 0x51, 0x96, 0x39, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x08, 0x47, +/* 000053F0 */ 0x46, 0x51, 0x96, 0x3A, 0x03, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x09, 0x96, 0x0A, 0x51, 0x92, +/* 00005400 */ 0x09, 0x51, 0x61, 0x51, 0x51, 0x0A, 0x96, 0x0B, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x0B, +/* 00005410 */ 0x96, 0x0C, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x0C, 0x96, 0x0D, 0x51, 0x92, 0x09, 0x51, +/* 00005420 */ 0x61, 0x51, 0x51, 0x0D, 0x96, 0x0E, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x0E, 0x96, 0x0F, +/* 00005430 */ 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x0F, 0x96, 0x10, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, +/* 00005440 */ 0x51, 0x10, 0x96, 0x11, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x11, 0x96, 0x12, 0x51, 0x92, +/* 00005450 */ 0x09, 0x51, 0x61, 0x51, 0x51, 0x12, 0x96, 0x13, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x13, +/* 00005460 */ 0x47, 0x47, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x14, 0x96, 0x14, 0x51, 0x92, 0x0A, 0x51, +/* 00005470 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, +/* 00005480 */ 0x00, 0x00, 0x00, 0x92, 0x09, 0x53, 0x61, 0x53, 0x53, 0x15, 0x7A, 0x53, 0x52, 0x16, 0x92, 0x09, +/* 00005490 */ 0x53, 0x61, 0x53, 0x53, 0x17, 0x7A, 0x53, 0x52, 0x18, 0x92, 0x09, 0x53, 0x61, 0x53, 0x53, 0x19, +/* 000054A0 */ 0x7A, 0x53, 0x52, 0x1A, 0x92, 0x09, 0x53, 0x61, 0x53, 0x53, 0x1B, 0x7A, 0x53, 0x52, 0x1C, 0x5C, +/* 000054B0 */ 0x01, 0x52, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x51, 0x51, 0x96, 0x15, 0x51, 0x92, 0x09, 0x51, 0x61, +/* 000054C0 */ 0x51, 0x51, 0x1D, 0x96, 0x16, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x1E, 0x96, 0x17, 0x51, +/* 000054D0 */ 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x1F, 0x96, 0x18, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, +/* 000054E0 */ 0x20, 0x96, 0x19, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x21, 0x96, 0x1A, 0x51, 0xD4, 0x00, +/* 000054F0 */ 0x51, 0x96, 0x1B, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x22, 0x96, 0x1C, 0x51, 0x92, 0x09, +/* 00005500 */ 0x51, 0x61, 0x51, 0x51, 0x23, 0x96, 0x1D, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x24, 0x96, +/* 00005510 */ 0x1E, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x25, 0x96, 0x1F, 0x51, 0x92, 0x09, 0x51, 0x61, +/* 00005520 */ 0x51, 0x51, 0x26, 0x96, 0x20, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x27, 0x96, 0x21, 0x51, +/* 00005530 */ 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x28, 0x96, 0x22, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, +/* 00005540 */ 0x29, 0x96, 0x23, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x2A, 0x96, 0x24, 0x51, 0x92, 0x09, +/* 00005550 */ 0x51, 0x61, 0x51, 0x51, 0x2B, 0x96, 0x25, 0x51, 0x92, 0x16, 0x51, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00005560 */ 0x09, 0xCB, 0x52, 0x5C, 0x01, 0x52, 0x1F, 0x02, 0x51, 0x51, 0x47, 0x48, 0x51, 0x92, 0x09, 0x51, +/* 00005570 */ 0x61, 0x51, 0x51, 0x2C, 0x96, 0x26, 0x51, 0x92, 0x09, 0x51, 0x61, 0x51, 0x51, 0x2D, 0x96, 0x27, +/* 00005580 */ 0x51, 0x92, 0x0A, 0x51, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x00, 0x00, 0x00, 0x01, +/* 00005590 */ 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x0B, 0x52, 0x2E, 0x7A, 0x0B, 0x52, 0x2F, 0x7A, +/* 000055A0 */ 0x0E, 0x52, 0x30, 0x7A, 0x10, 0x52, 0x31, 0x7A, 0x12, 0x52, 0x32, 0x7A, 0x14, 0x52, 0x33, 0x7A, +/* 000055B0 */ 0x16, 0x52, 0x34, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x51, 0x51, 0x96, 0x3B, 0x51, +/* 000055C0 */ 0xA8, 0x51, 0x96, 0x3C, 0x51, 0xD4, 0x01, 0x51, 0x96, 0x3D, 0x51, 0xD4, 0x02, 0x51, 0x96, 0x3E, +/* 000055D0 */ 0x51, 0xD4, 0x03, 0x51, 0x96, 0x3F, 0x51, 0xD4, 0x04, 0x51, 0x96, 0x28, 0x51, 0xD4, 0x05, 0x51, +/* 000055E0 */ 0x96, 0x29, 0x51, 0xD4, 0x06, 0x51, 0x96, 0x2A, 0x51, 0xD4, 0x07, 0x51, 0x96, 0x2B, 0x51, 0xD4, +/* 000055F0 */ 0x08, 0x51, 0x96, 0x2C, 0x51, 0xD4, 0x09, 0x51, 0x96, 0x2D, 0x51, 0xD4, 0x0A, 0x51, 0x96, 0x2E, +/* 00005600 */ 0x51, 0xD4, 0x0B, 0x51, 0x96, 0x2F, 0x51, 0xA8, 0x51, 0x96, 0x40, 0x51, 0xD4, 0x0C, 0x51, 0x96, +/* 00005610 */ 0x30, 0x51, 0xD4, 0x0D, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, 0x96, +/* 00005620 */ 0x31, 0x51, 0xA8, 0x51, 0x96, 0x41, 0x51, 0xA8, 0x51, 0x96, 0x42, 0x51, 0xA8, 0x51, 0x96, 0x43, +/* 00005630 */ 0x51, 0xA8, 0x51, 0x96, 0x44, 0x51, 0xD4, 0x15, 0x51, 0x96, 0x32, 0x51, 0xD4, 0x16, 0x51, 0x96, +/* 00005640 */ 0x33, 0x51, 0xD4, 0x17, 0x51, 0x96, 0x34, 0x51, 0x92, 0x0A, 0x51, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00005650 */ 0x09, 0xCB, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x51, 0x51, 0x54, 0x49, 0x51, +/* 00005660 */ 0x92, 0x09, 0x52, 0x6C, 0x51, 0x52, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x52, 0x5C, 0x01, 0x49, +/* 00005670 */ 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x3C, 0x00, 0x00, 0x00, 0x02, 0x00, +/* 00005680 */ 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x18, 0x54, 0x36, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, +/* 00005690 */ 0x1F, 0x03, 0x53, 0x53, 0x5C, 0x02, 0x53, 0x1F, 0x03, 0xFF, 0x51, 0x96, 0x45, 0x19, 0x92, 0x0C, +/* 000056A0 */ 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x52, 0x5C, 0x01, 0x52, 0x92, 0x2A, 0x52, +/* 000056B0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x45, 0x53, 0x5C, 0x01, 0x53, 0xD4, 0x18, 0x53, 0x5C, +/* 000056C0 */ 0x02, 0x53, 0x1F, 0x03, 0x52, 0x52, 0x5C, 0x02, 0x52, 0x5C, 0x03, 0x49, 0x1F, 0x04, 0x51, 0x51, +/* 000056D0 */ 0x96, 0x46, 0x51, 0x96, 0x47, 0x1A, 0x92, 0x0C, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, +/* 000056E0 */ 0x20, 0x52, 0x5C, 0x01, 0x52, 0x92, 0x2A, 0x52, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x47, +/* 000056F0 */ 0x53, 0x5C, 0x01, 0x53, 0xD4, 0x19, 0x53, 0x5C, 0x02, 0x53, 0x1F, 0x03, 0x52, 0x52, 0x5C, 0x02, +/* 00005700 */ 0x52, 0x5C, 0x03, 0x49, 0x1F, 0x04, 0x51, 0x51, 0x96, 0x48, 0x51, 0x96, 0x49, 0x1B, 0x92, 0x0C, +/* 00005710 */ 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x20, 0x52, 0x5C, 0x01, 0x52, 0x92, 0x2A, 0x52, +/* 00005720 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x49, 0x53, 0x5C, 0x01, 0x53, 0xD4, 0x1A, 0x53, 0x5C, +/* 00005730 */ 0x02, 0x53, 0x1F, 0x03, 0x52, 0x52, 0x5C, 0x02, 0x52, 0x5C, 0x03, 0x49, 0x1F, 0x04, 0x51, 0x51, +/* 00005740 */ 0x96, 0x4A, 0x51, 0x96, 0x4B, 0x1C, 0x92, 0x0C, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, +/* 00005750 */ 0x20, 0x52, 0x5C, 0x01, 0x52, 0x92, 0x2A, 0x52, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x4B, +/* 00005760 */ 0x53, 0x5C, 0x01, 0x53, 0xD4, 0x1B, 0x53, 0x5C, 0x02, 0x53, 0x1F, 0x03, 0x52, 0x52, 0x5C, 0x02, +/* 00005770 */ 0x52, 0x5C, 0x03, 0x49, 0x1F, 0x04, 0x51, 0x51, 0x54, 0x4A, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, +/* 00005780 */ 0x00, 0x5C, 0x00, 0x09, 0x92, 0x46, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x1D, 0xCC, 0x48, 0x00, +/* 00005790 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x52, 0x37, 0x5C, 0x03, +/* 000057A0 */ 0x52, 0x1F, 0x04, 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x48, +/* 000057B0 */ 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x1D, 0xCC, 0x54, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +/* 000057C0 */ 0x52, 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x52, 0x37, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, 0x92, +/* 000057D0 */ 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x92, 0x4A, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, +/* 000057E0 */ 0x1D, 0xCC, 0x60, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x1F, +/* 000057F0 */ 0x52, 0x37, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, +/* 00005800 */ 0x00, 0x09, 0x5C, 0x01, 0x4A, 0x5C, 0x02, 0x1D, 0xCC, 0x6C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, +/* 00005810 */ 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x20, 0x52, 0x37, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, +/* 00005820 */ 0x92, 0x0A, 0x51, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x07, 0x00, +/* 00005830 */ 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 00005840 */ 0xA4, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x23, 0x54, 0x38, +/* 00005850 */ 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, 0x52, 0x39, 0x92, 0x0A, +/* 00005860 */ 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, +/* 00005870 */ 0x54, 0x00, 0x00, 0x00, 0x7A, 0x23, 0x54, 0x38, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, +/* 00005880 */ 0x53, 0x53, 0x7A, 0x53, 0x52, 0x3A, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 00005890 */ 0xBC, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x27, 0x54, 0x3B, +/* 000058A0 */ 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, 0x52, 0x3C, 0x92, 0x0A, +/* 000058B0 */ 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xC8, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, +/* 000058C0 */ 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2A, 0x54, 0x3D, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, +/* 000058D0 */ 0x53, 0x53, 0x7A, 0x53, 0x52, 0x3E, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 000058E0 */ 0xD4, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2D, 0x54, 0x3F, +/* 000058F0 */ 0x7A, 0x2A, 0x54, 0x3D, 0x7A, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, +/* 00005900 */ 0x53, 0x53, 0x7A, 0x53, 0x52, 0x41, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 00005910 */ 0xE8, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2A, 0x54, 0x3D, +/* 00005920 */ 0x7A, 0x2F, 0x54, 0x40, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, +/* 00005930 */ 0x52, 0x42, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0xF8, 0x00, 0x00, 0x00, +/* 00005940 */ 0x0E, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2A, 0x54, 0x3D, 0x7A, 0x2F, 0x54, 0x40, +/* 00005950 */ 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, 0x52, 0x43, 0x92, 0x0A, +/* 00005960 */ 0x53, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, 0x08, 0x01, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, +/* 00005970 */ 0x54, 0x00, 0x00, 0x00, 0x7A, 0x2E, 0x54, 0x40, 0x7A, 0x2F, 0x54, 0x44, 0x5C, 0x01, 0x54, 0x5C, +/* 00005980 */ 0x02, 0x08, 0x1F, 0x03, 0x53, 0x53, 0x7A, 0x53, 0x52, 0x45, 0x92, 0x0A, 0x53, 0x07, 0x03, 0x00, +/* 00005990 */ 0x5C, 0x00, 0x09, 0xCC, 0x18, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, +/* 000059A0 */ 0x7A, 0x2E, 0x54, 0x40, 0x7A, 0x2F, 0x54, 0x44, 0x5C, 0x01, 0x54, 0x5C, 0x02, 0x08, 0x1F, 0x03, +/* 000059B0 */ 0x53, 0x53, 0x7A, 0x53, 0x52, 0x46, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x51, 0x51, +/* 000059C0 */ 0x96, 0x35, 0x51, 0xD4, 0x1C, 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, +/* 000059D0 */ 0x96, 0x36, 0x51, 0xA8, 0x51, 0x96, 0x4C, 0x51, 0xD4, 0x1D, 0x51, 0x96, 0x37, 0x51, 0xD4, 0x1E, +/* 000059E0 */ 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, 0x47, 0x4B, 0x51, 0xD4, 0x1F, +/* 000059F0 */ 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, 0x47, 0x4C, 0x51, 0xD4, 0x20, +/* 00005A00 */ 0x51, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x09, 0x1F, 0x01, 0x51, 0x51, 0x47, 0x4D, 0x51, 0x92, 0x38, +/* 00005A10 */ 0x51, 0x14, 0x03, 0x00, 0x51, 0x35, 0x09, 0xE4, 0x00, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, +/* 00005A20 */ 0x00, 0x09, 0x6A, 0x4A, 0x00, 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x36, 0xCC, 0x28, +/* 00005A30 */ 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x4B, 0x52, 0x37, 0x7A, +/* 00005A40 */ 0x02, 0x52, 0x47, 0x7A, 0x39, 0x52, 0x48, 0x7A, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0x1F, 0x04, +/* 00005A50 */ 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x4A, 0x00, 0x00, 0x00, +/* 00005A60 */ 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x3B, 0xCC, 0x40, 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, +/* 00005A70 */ 0x52, 0x00, 0x00, 0x00, 0x7A, 0x4C, 0x52, 0x37, 0x7A, 0x02, 0x52, 0x47, 0x7A, 0x39, 0x52, 0x48, +/* 00005A80 */ 0x7A, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, +/* 00005A90 */ 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x4A, 0x00, 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x3C, +/* 00005AA0 */ 0xCC, 0x58, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x4D, 0x52, +/* 00005AB0 */ 0x37, 0x7A, 0x02, 0x52, 0x47, 0x7A, 0x39, 0x52, 0x48, 0x7A, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, +/* 00005AC0 */ 0x1F, 0x04, 0xFF, 0x51, 0x92, 0x1B, 0x51, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x09, 0x6A, 0x4A, 0x00, +/* 00005AD0 */ 0x00, 0x00, 0x52, 0x5C, 0x01, 0x52, 0x5C, 0x02, 0x20, 0xCC, 0x70, 0x01, 0x00, 0x00, 0x14, 0x00, +/* 00005AE0 */ 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x7A, 0x4A, 0x52, 0x37, 0x7A, 0x02, 0x52, 0x47, 0x7A, 0x39, +/* 00005AF0 */ 0x52, 0x48, 0x7A, 0x02, 0x52, 0x49, 0x5C, 0x03, 0x52, 0x1F, 0x04, 0xFF, 0x51, 0xA8, 0x00, 0x24, +/* 00005B00 */ 0x00, 0x15, 0xFE, 0x88, 0x01, 0x00, 0x70, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00005B10 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00005B20 */ 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00005B30 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x40, 0x01, +/* 00005B40 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 00005B50 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x03, 0x04, +/* 00005B60 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00005B70 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, +/* 00005B80 */ 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x03, 0x02, +/* 00005B90 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0xF8, 0x00, +/* 00005BA0 */ 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x09, 0x03, +/* 00005BB0 */ 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, +/* 00005BC0 */ 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, +/* 00005BD0 */ 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0xC8, 0x00, +/* 00005BE0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0xBC, 0x00, +/* 00005BF0 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0xB0, 0x00, +/* 00005C00 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, 0x00, 0xA4, 0x00, +/* 00005C10 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, 0x00, 0x78, 0x00, +/* 00005C20 */ 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x00, 0x00, 0xFF, 0x02, +/* 00005C30 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x0B, 0x03, +/* 00005C40 */ 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x0D, 0x03, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x6C, 0x00, +/* 00005C50 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0x60, 0x00, +/* 00005C60 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0x54, 0x00, +/* 00005C70 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0x48, 0x00, +/* 00005C80 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0x3C, 0x00, +/* 00005C90 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x18, 0x00, +/* 00005CA0 */ 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x02, 0x00, 0x00, 0xEC, 0x02, +/* 00005CB0 */ 0x00, 0x00, 0xED, 0x02, 0x00, 0x00, 0xEE, 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, 0x00, 0xF0, 0x02, +/* 00005CC0 */ 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00005CD0 */ 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x25, 0x00, +/* 00005CE0 */ 0x00, 0x00, 0xDD, 0xFE, 0x17, 0x03, 0xFE, 0x18, 0x03, 0xF9, 0xFE, 0x18, 0x03, 0xFE, 0x19, 0x03, +/* 00005CF0 */ 0xFE, 0x19, 0x03, 0xFE, 0xAC, 0x02, 0xFE, 0xAC, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x38, 0x02, 0xFE, +/* 00005D00 */ 0x3A, 0x02, 0x84, 0xFE, 0x35, 0x01, 0xFE, 0x5B, 0x01, 0xFE, 0x30, 0x01, 0xFE, 0x7D, 0x01, 0x96, +/* 00005D10 */ 0xA9, 0xF9, 0xFE, 0x0A, 0x02, 0xFE, 0x3C, 0x02, 0x17, 0xFE, 0x3D, 0x02, 0x1F, 0xFE, 0x3E, 0x02, +/* 00005D20 */ 0xFE, 0x21, 0x01, 0xFE, 0x3F, 0x02, 0x25, 0xFE, 0x41, 0x02, 0xFE, 0x42, 0x02, 0xFE, 0x43, 0x02, +/* 00005D30 */ 0xFE, 0x44, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x48, 0x02, 0xFE, 0x49, 0x02, 0xFE, 0x4A, 0x02, 0xFE, +/* 00005D40 */ 0x4B, 0x02, 0xFE, 0x4C, 0x02, 0xFE, 0x4D, 0x02, 0xFE, 0x4E, 0x02, 0xFE, 0x51, 0x02, 0xFE, 0x52, +/* 00005D50 */ 0x02, 0xFE, 0x53, 0x02, 0xFE, 0x54, 0x02, 0xFE, 0x55, 0x02, 0xFE, 0xEB, 0x02, 0xFE, 0xEC, 0x02, +/* 00005D60 */ 0xFE, 0xED, 0x02, 0xFE, 0xEE, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF0, 0x02, 0xFE, 0xF1, 0x02, 0xFE, +/* 00005D70 */ 0x36, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xFD, 0x02, 0xFE, 0xFC, 0x02, 0xFE, 0xFF, +/* 00005D80 */ 0x02, 0xFE, 0x01, 0x03, 0xFE, 0x00, 0x03, 0xFE, 0x04, 0x03, 0xFE, 0x03, 0x03, 0xFE, 0x07, 0x03, +/* 00005D90 */ 0xFE, 0x09, 0x03, 0xFE, 0x06, 0x03, 0xFE, 0x0B, 0x03, 0xFE, 0x0C, 0x03, 0xFE, 0x0E, 0x03, 0xFE, +/* 00005DA0 */ 0x0D, 0x03, 0xFE, 0x0F, 0x03, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, 0x01, 0xDD, 0xFE, +/* 00005DB0 */ 0x1A, 0x03, 0xFE, 0x1B, 0x03, 0xFE, 0x1C, 0x03, 0xFE, 0x1D, 0x03, 0xFE, 0x1E, 0x03, 0xFE, 0x1F, +/* 00005DC0 */ 0x03, 0xFE, 0x20, 0x03, 0xFE, 0x21, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x23, 0x03, 0xFE, 0x24, 0x03, +/* 00005DD0 */ 0x84, 0xFE, 0x35, 0x01, 0xFE, 0x5B, 0x01, 0xFE, 0x30, 0x01, 0xFE, 0x7D, 0x01, 0x96, 0xA9, 0xFE, +/* 00005DE0 */ 0x25, 0x03, 0xFA, 0xFE, 0x26, 0x03, 0xFE, 0x27, 0x03, 0xFE, 0x28, 0x03, 0xFE, 0x29, 0x03, 0xFE, +/* 00005DF0 */ 0x2A, 0x03, 0xFE, 0x2B, 0x03, 0xFE, 0x2C, 0x03, 0xFE, 0x2D, 0x03, 0xFE, 0x2E, 0x03, 0xFE, 0x2F, +/* 00005E00 */ 0x03, 0xFE, 0x30, 0x03, 0xFE, 0x31, 0x03, 0xFE, 0x32, 0x03, 0xFE, 0x33, 0x03, 0xFE, 0x34, 0x03, +/* 00005E10 */ 0xFE, 0x35, 0x03, 0xE3, 0xE6, 0xFE, 0x36, 0x03, 0xFE, 0x37, 0x03, 0xFE, 0x38, 0x03, 0xFE, 0x2C, +/* 00005E20 */ 0x02, 0xFE, 0x2B, 0x02, 0xFE, 0x39, 0x03, 0xFE, 0x3A, 0x03, 0xFE, 0x3B, 0x03, 0xFE, 0x3C, 0x03, +/* 00005E30 */ 0xFE, 0x3D, 0x03, 0xFE, 0x3E, 0x03, 0xFE, 0x3F, 0x03, 0xFE, 0x7B, 0x02, 0xFE, 0x40, 0x03, 0xFE, +/* 00005E40 */ 0x41, 0x03, 0xFE, 0x42, 0x03, 0xFE, 0x43, 0x03, 0xFE, 0x44, 0x03, 0xFE, 0xE6, 0x02, 0xFE, 0x45, +/* 00005E50 */ 0x03, 0xFE, 0x46, 0x03, 0xFE, 0x47, 0x03, 0xFE, 0x48, 0x03, 0xFE, 0x49, 0x03, 0xFE, 0x4A, 0x03, +/* 00005E60 */ 0xFE, 0x4B, 0x03, 0xFE, 0x4C, 0x03, 0xFE, 0x4D, 0x03, 0xFE, 0x4E, 0x03, 0xFE, 0x4F, 0x03, 0xFE, +/* 00005E70 */ 0x50, 0x03, 0xFE, 0x51, 0x03, 0xFE, 0x52, 0x03, 0xFE, 0x53, 0x03, 0xFE, 0x54, 0x03, 0xFE, 0x55, +/* 00005E80 */ 0x03, 0xFE, 0x56, 0x03, 0xFE, 0xBB, 0x01, 0x5B, 0x97, 0x00, 0x00, 0x00, 0x07, 0x00, 0xA4, 0x00, +/* 00005E90 */ 0x07, 0x00, 0x20, 0x00, 0x11, 0x00, 0x38, 0x00, 0x15, 0x00, 0x3B, 0x00, 0x11, 0x00, 0x39, 0x00, +/* 00005EA0 */ 0x15, 0x00, 0xD4, 0x00, 0x12, 0x00, 0x30, 0x00, 0x0A, 0x00, 0x45, 0x00, 0x03, 0x00, 0x35, 0x00, +/* 00005EB0 */ 0x0A, 0x00, 0x35, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x0A, 0x00, 0x24, 0x00, +/* 00005EC0 */ 0x0A, 0x00, 0x22, 0x00, 0x0A, 0x00, 0x22, 0x00, 0x0A, 0x00, 0x22, 0x00, 0x0A, 0x00, 0x22, 0x00, +/* 00005ED0 */ 0x0A, 0x00, 0x1E, 0x00, 0x0A, 0x00, 0x20, 0x00, 0x0A, 0x00, 0x1D, 0x00, 0x0A, 0x00, 0x2D, 0x00, +/* 00005EE0 */ 0x4F, 0x00, 0xC8, 0x00, 0x0A, 0x00, 0x54, 0x00, 0x0A, 0x00, 0x50, 0x00, 0x0A, 0x00, 0x5E, 0x00, +/* 00005EF0 */ 0x0A, 0x00, 0x02, 0x01, 0x0A, 0x00, 0x55, 0x00, 0x06, 0x00, 0x94, 0x00, 0x0A, 0x00, 0x4C, 0x00, +/* 00005F00 */ 0x0A, 0x00, 0x4C, 0x00, 0x0A, 0x00, 0x46, 0x00, 0x0A, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x4C, 0x00, +/* 00005F10 */ 0x0A, 0x00, 0x4A, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x0A, 0x00, 0x4E, 0x00, 0x0A, 0x00, 0x56, 0x00, +/* 00005F20 */ 0x0A, 0x00, 0x57, 0x00, 0x15, 0x00, 0x35, 0x00, 0x0A, 0x00, 0x3E, 0x00, 0x0A, 0x00, 0xA4, 0x00, +/* 00005F30 */ 0x3F, 0x00, 0x05, 0x01, 0x05, 0x00, 0x25, 0x00, 0x06, 0x00, 0xE9, 0x01, 0x06, 0x00, 0x0C, 0x02, +/* 00005F40 */ 0x06, 0x00, 0x90, 0x01, 0x06, 0x00, 0x58, 0x01, 0x06, 0x00, 0x9A, 0x00, 0x06, 0x00, 0x70, 0x00, +/* 00005F50 */ 0x06, 0x00, 0xA7, 0x04, 0x06, 0x00, 0x93, 0x04, 0x06, 0x00, 0x31, 0x04, 0x06, 0x00, 0xB1, 0x09, +/* 00005F60 */ 0x06, 0x00, 0xEF, 0x02, 0x05, 0x00, 0x2D, 0x00, 0x06, 0x00, 0x93, 0x03, 0x10, 0x00, 0x89, 0x0A, +/* 00005F70 */ 0x05, 0x00, 0x75, 0x00, 0x05, 0x00, 0x38, 0x00, 0x05, 0x00, 0x4C, 0x00, 0x05, 0x00, 0x83, 0x1C, +/* 00005F80 */ 0x06, 0x00, 0xC0, 0x01, 0x06, 0x00, 0xDF, 0x01, 0x06, 0x00, 0x80, 0x03, 0x18, 0x00, 0x3C, 0x00, +/* 00005F90 */ 0x3B, 0x00, 0x25, 0x01, 0x03, 0x00, 0x51, 0x00, 0x35, 0x00, 0x69, 0x01, 0x03, 0x00, 0x59, 0x00, +/* 00005FA0 */ 0x35, 0x00, 0x79, 0x01, 0x03, 0x00, 0x5D, 0x00, 0x35, 0x00, 0x81, 0x01, 0x03, 0x00, 0x41, 0x00, +/* 00005FB0 */ 0x35, 0x00, 0xAD, 0x02, 0x2A, 0x00, 0x60, 0x00, 0x2A, 0x00, 0x64, 0x00, 0x2A, 0x00, 0x66, 0x00, +/* 00005FC0 */ 0x27, 0x00, 0x49, 0x01, 0xA3, 0x01, 0x51, 0x05, 0x10, 0x00, 0xCA, 0x03, 0x05, 0x00, 0x2B, 0x00, +/* 00005FD0 */ 0x06, 0x00, 0x3B, 0x09, 0x10, 0x00, 0xE9, 0x2E, 0x10, 0x00, 0x16, 0x37, 0x10, 0x00, 0x4B, 0x7A, +/* 00005FE0 */ 0x0B, 0x00, 0x23, 0x00, 0x39, 0x00, 0x96, 0x00, 0x39, 0x00, 0x96, 0x00, 0x39, 0x00, 0x96, 0x00, +/* 00005FF0 */ 0x3B, 0x00, 0x94, 0x00, 0x00, 0x8A, 0xDC, 0x00, 0x00, 0xC9, 0xDB, 0x00, 0x00, 0x2C, 0xDB, 0x00, +/* 00006000 */ 0x00, 0x4A, 0xDA, 0x00, 0x00, 0xC3, 0xD9, 0x00, 0x00, 0x5B, 0xD9, 0x00, 0x00, 0xFD, 0xD8, 0x00, +/* 00006010 */ 0x00, 0x1D, 0xD7, 0x00, 0x00, 0x6C, 0xD5, 0x00, 0x00, 0x34, 0xD4, 0x00, 0x00, 0x97, 0xD0, 0x00, +/* 00006020 */ 0x00, 0x5B, 0xCF, 0x00, 0x00, 0x08, 0xCE, 0x00, 0x00, 0xA8, 0xC9, 0x00, 0x00, 0x01, 0xC8, 0x00, +/* 00006030 */ 0x00, 0xC5, 0xC6, 0x00, 0x00, 0x7A, 0xC6, 0x00, 0x00, 0xD5, 0xC2, 0x00, 0x00, 0x27, 0xC2, 0x00, +/* 00006040 */ 0x00, 0xAC, 0xBF, 0x00, 0x00, 0x66, 0xBD, 0x00, 0x00, 0x7F, 0xBC, 0x00, 0x00, 0x9B, 0xBB, 0x00, +/* 00006050 */ 0x00, 0x04, 0xBA, 0x00, 0x00, 0x8F, 0xB9, 0x00, 0x00, 0x1A, 0xB9, 0x00, 0x00, 0xA5, 0xB8, 0x00, +/* 00006060 */ 0x00, 0x41, 0xB8, 0x00, 0x00, 0x68, 0xB6, 0x00, 0x00, 0x61, 0xB3, 0x00, 0x00, 0xEC, 0xA0, 0x00, +/* 00006070 */ 0x00, 0xE7, 0x8C, 0x00, 0x00, 0x79, 0x60, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0xA9, 0xD6, 0x92, +/* 00006080 */ 0xFE, 0xD1, 0x04, 0x1A, 0xA0, 0x41, 0xD1, 0x00, 0x3E, 0xFE, 0x0C, 0xE9, 0x0F, 0xFF, 0x00, 0x10, +/* 00006090 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0x0C, 0xE9, 0xFE, 0xFA, 0x79, 0xFE, 0xFA, 0x79, 0x01, 0x15, 0x36, +/* 000060A0 */ 0x44, 0x09, 0xF0, 0xF0, 0x01, 0x09, 0x19, 0x19, 0x19, 0x19, 0x07, 0x02, 0x41, 0x42, 0x43, 0x44, +/* 000060B0 */ 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xFB, 0x03, 0x06, 0xFE, 0xFC, 0x03, 0x05, 0xFE, 0xFD, 0x03, +/* 000060C0 */ 0x06, 0xFE, 0xFE, 0x03, 0x05, 0xFE, 0xFF, 0x03, 0x06, 0xFE, 0x00, 0x04, 0x05, 0xFE, 0x01, 0x04, +/* 000060D0 */ 0x06, 0xFE, 0x02, 0x04, 0x05, 0xFE, 0x03, 0x04, 0x06, 0xFE, 0x04, 0x04, 0x05, 0xFE, 0x05, 0x04, +/* 000060E0 */ 0x06, 0xFE, 0x06, 0x04, 0x05, 0xFE, 0x07, 0x04, 0x06, 0xFE, 0x08, 0x04, 0x05, 0xFE, 0x09, 0x04, +/* 000060F0 */ 0x06, 0xFE, 0x0A, 0x04, 0x05, 0xFE, 0x0B, 0x04, 0x06, 0xFE, 0x0C, 0x04, 0x05, 0xFE, 0x0D, 0x04, +/* 00006100 */ 0x07, 0x06, 0xFE, 0x0E, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x0F, 0x04, 0x01, 0x01, 0x06, 0xFE, 0x10, +/* 00006110 */ 0x04, 0x01, 0x02, 0x08, 0x05, 0xFE, 0x11, 0x04, 0x05, 0xFE, 0x12, 0x04, 0x06, 0xFE, 0x13, 0x04, +/* 00006120 */ 0x05, 0xFE, 0x14, 0x04, 0x06, 0xFE, 0x15, 0x04, 0x05, 0xFE, 0x16, 0x04, 0x05, 0xFE, 0x17, 0x04, +/* 00006130 */ 0x05, 0xFE, 0x18, 0x04, 0x05, 0xFE, 0x19, 0x04, 0x05, 0xFE, 0x1A, 0x04, 0x05, 0xFE, 0xF4, 0x03, +/* 00006140 */ 0x06, 0xFE, 0xB4, 0x03, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0C, 0x06, 0xFE, 0x13, +/* 00006150 */ 0x03, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0xB5, 0x03, 0x0B, 0x06, 0xFE, 0xEB, 0x03, 0x06, 0xFE, +/* 00006160 */ 0xB8, 0x03, 0x05, 0xFE, 0xEC, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, 0xFA, 0x02, 0xFE, 0xA7, +/* 00006170 */ 0x03, 0x4F, 0x40, 0xA8, 0x36, 0xA8, 0x37, 0xA8, 0x38, 0xA8, 0x39, 0xA8, 0x3A, 0xA8, 0x3B, 0xA8, +/* 00006180 */ 0x3C, 0xA8, 0x3D, 0xA8, 0x3E, 0xA8, 0x3F, 0x8E, 0x01, 0x38, 0x46, 0x14, 0x0F, 0x00, 0x46, 0x02, +/* 00006190 */ 0x09, 0x00, 0x00, 0x8E, 0x01, 0x38, 0x46, 0x14, 0x03, 0x00, 0x46, 0x03, 0x09, 0x70, 0x03, 0xDE, +/* 000061A0 */ 0x00, 0x0B, 0x01, 0xB8, 0x46, 0x00, 0x01, 0x51, 0x01, 0x00, 0x36, 0x46, 0x95, 0x00, 0x02, 0x36, +/* 000061B0 */ 0x01, 0x51, 0x01, 0x01, 0x37, 0x46, 0x95, 0x00, 0x03, 0x37, 0x01, 0x51, 0x01, 0x02, 0x38, 0x46, +/* 000061C0 */ 0x95, 0x00, 0x04, 0x38, 0x01, 0x51, 0x01, 0x03, 0x39, 0x46, 0x95, 0x00, 0x05, 0x39, 0x01, 0x51, +/* 000061D0 */ 0x01, 0x04, 0x3A, 0x46, 0x95, 0x00, 0x06, 0x3A, 0x01, 0x51, 0x01, 0x05, 0x3B, 0x46, 0x95, 0x00, +/* 000061E0 */ 0x07, 0x3B, 0x01, 0x51, 0x01, 0x06, 0x3C, 0x46, 0x95, 0x00, 0x08, 0x3C, 0x01, 0x51, 0x01, 0x07, +/* 000061F0 */ 0x3D, 0x46, 0x95, 0x00, 0x09, 0x3D, 0x4F, 0x46, 0x95, 0x00, 0x0A, 0x46, 0xCC, 0x00, 0x00, 0x00, +/* 00006200 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x7A, 0x05, 0x46, 0x00, 0x7A, 0x07, 0x46, +/* 00006210 */ 0x01, 0x7A, 0x09, 0x46, 0x02, 0x7A, 0x0B, 0x46, 0x03, 0x7A, 0x0D, 0x46, 0x04, 0x7A, 0x0F, 0x46, +/* 00006220 */ 0x05, 0x7A, 0x11, 0x46, 0x06, 0x7A, 0x13, 0x46, 0x07, 0x7A, 0x15, 0x46, 0x08, 0x96, 0x02, 0x46, +/* 00006230 */ 0xCD, 0x46, 0x03, 0xA8, 0x47, 0xA1, 0x00, 0x47, 0x46, 0xA8, 0x47, 0xA1, 0x01, 0x47, 0x46, 0xA8, +/* 00006240 */ 0x47, 0xA1, 0x02, 0x47, 0x46, 0x95, 0x00, 0x0A, 0x46, 0x8E, 0x01, 0x0A, 0x46, 0x07, 0x03, 0x00, +/* 00006250 */ 0x5C, 0x00, 0x1D, 0xCC, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, +/* 00006260 */ 0x7A, 0x18, 0x47, 0x09, 0x7A, 0x1A, 0x47, 0x0A, 0x7A, 0x1C, 0x47, 0x0B, 0x5C, 0x01, 0x47, 0x5C, +/* 00006270 */ 0x02, 0x16, 0x1F, 0x03, 0x46, 0x46, 0x54, 0x40, 0x46, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, 0x08, +/* 00006280 */ 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5C, 0x01, 0x1E, 0x5C, 0x02, 0x1F, 0x5C, 0x03, +/* 00006290 */ 0x20, 0x61, 0x47, 0x40, 0x0C, 0x5C, 0x04, 0x47, 0x8E, 0x01, 0x3B, 0x47, 0x4B, 0x47, 0x61, 0x47, +/* 000062A0 */ 0x47, 0x0D, 0x5C, 0x05, 0x47, 0x1F, 0x06, 0xFF, 0x46, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, 0x09, +/* 000062B0 */ 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5C, 0x01, 0x21, 0x5C, 0x02, 0x22, 0x5C, 0x03, +/* 000062C0 */ 0x22, 0x61, 0x47, 0x40, 0x0E, 0x5C, 0x04, 0x47, 0x8E, 0x01, 0x3B, 0x47, 0x4B, 0x47, 0x61, 0x47, +/* 000062D0 */ 0x47, 0x0F, 0x5C, 0x05, 0x47, 0x1F, 0x06, 0xFF, 0x46, 0xB8, 0x47, 0x00, 0x01, 0x51, 0x01, 0x0A, +/* 000062E0 */ 0x46, 0x47, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x1D, 0x5C, 0x01, 0x23, 0x5C, 0x02, 0x24, 0x5C, 0x03, +/* 000062F0 */ 0x24, 0x61, 0x47, 0x40, 0x10, 0x5C, 0x04, 0x47, 0x8E, 0x01, 0x3B, 0x47, 0x4B, 0x47, 0x61, 0x47, +/* 00006300 */ 0x47, 0x11, 0x5C, 0x05, 0x47, 0x1F, 0x06, 0xFF, 0x46, 0x8E, 0x01, 0x38, 0x46, 0x14, 0x03, 0x00, +/* 00006310 */ 0x46, 0x02, 0x09, 0xFA, 0x01, 0xDE, 0x01, 0x04, 0x03, 0xB8, 0x46, 0x00, 0xB7, 0x01, 0x00, 0x00, +/* 00006320 */ 0x00, 0x46, 0x46, 0x01, 0x51, 0x01, 0x0B, 0x3E, 0x46, 0x95, 0x01, 0x02, 0x3E, 0x01, 0x51, 0x01, +/* 00006330 */ 0x0C, 0x3F, 0x46, 0x95, 0x01, 0x03, 0x3F, 0x8E, 0x01, 0x2A, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00006340 */ 0x1D, 0x5C, 0x01, 0x25, 0x90, 0x01, 0x02, 0x47, 0x5C, 0x02, 0x47, 0x1F, 0x03, 0xFF, 0x46, 0x8E, +/* 00006350 */ 0x01, 0x2A, 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x5C, 0x01, 0x26, 0x90, 0x01, 0x03, 0x47, +/* 00006360 */ 0x5C, 0x02, 0x47, 0x1F, 0x03, 0xFF, 0x46, 0x90, 0x01, 0x02, 0x46, 0xCD, 0x47, 0x02, 0xA1, 0x00, +/* 00006370 */ 0x27, 0x47, 0xA1, 0x01, 0x28, 0x47, 0x76, 0x47, 0x46, 0x12, 0x8E, 0x01, 0x1B, 0x46, 0x07, 0x04, +/* 00006380 */ 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x29, 0xCC, 0x40, +/* 00006390 */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x48, 0x07, +/* 000063A0 */ 0x01, 0x00, 0xC2, 0x01, 0x48, 0x48, 0x7A, 0x48, 0x47, 0x13, 0x7A, 0x2C, 0x47, 0x14, 0x7A, 0x2C, +/* 000063B0 */ 0x47, 0x15, 0x7A, 0x2C, 0x47, 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, 0x46, 0x8E, 0x01, 0x0A, +/* 000063C0 */ 0x46, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x61, 0x47, 0x47, 0x17, 0x5C, +/* 000063D0 */ 0x01, 0x47, 0x8E, 0x01, 0x0E, 0x47, 0x61, 0x47, 0x47, 0x17, 0x5C, 0x02, 0x47, 0x1F, 0x03, 0xFF, +/* 000063E0 */ 0x46, 0x8E, 0x01, 0x1B, 0x46, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x61, +/* 000063F0 */ 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x2F, 0xCC, 0x58, 0x00, 0x00, 0x00, 0x03, 0x00, +/* 00006400 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x48, 0x7A, 0x48, 0x47, 0x13, 0x7A, 0x30, +/* 00006410 */ 0x47, 0x14, 0x7A, 0x2C, 0x47, 0x15, 0x7A, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, +/* 00006420 */ 0x46, 0x8E, 0x01, 0x1B, 0x46, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x61, +/* 00006430 */ 0x47, 0x47, 0x17, 0x5C, 0x01, 0x47, 0x5C, 0x02, 0x31, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, +/* 00006440 */ 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x2A, 0x48, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1D, +/* 00006450 */ 0x5C, 0x01, 0x33, 0xB8, 0x4A, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x4A, 0x4A, 0x01, 0x51, 0x01, +/* 00006460 */ 0x0D, 0x49, 0x4A, 0x5C, 0x02, 0x49, 0x1F, 0x03, 0x48, 0x48, 0x7A, 0x48, 0x47, 0x18, 0x7A, 0x2C, +/* 00006470 */ 0x47, 0x15, 0x7A, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, 0x46, 0x8E, 0x01, 0x1B, +/* 00006480 */ 0x46, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x61, 0x47, 0x47, 0x17, 0x5C, +/* 00006490 */ 0x01, 0x47, 0x5C, 0x02, 0x34, 0xCC, 0x84, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x47, 0x00, +/* 000064A0 */ 0x00, 0x00, 0xB8, 0x49, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x49, 0x49, 0x01, 0x51, 0x01, 0x0E, +/* 000064B0 */ 0x48, 0x49, 0x7A, 0x48, 0x47, 0x13, 0x01, 0x65, 0x01, 0x48, 0x47, 0x7A, 0x30, 0x47, 0x14, 0x7A, +/* 000064C0 */ 0x2C, 0x47, 0x15, 0x7A, 0x30, 0x47, 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, 0x46, 0x8E, 0x01, +/* 000064D0 */ 0x1B, 0x46, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x1D, 0x90, 0x01, 0x02, 0x47, 0x5C, 0x01, 0x47, 0x5C, +/* 000064E0 */ 0x02, 0x35, 0xCC, 0x9C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x8E, +/* 000064F0 */ 0x01, 0x4A, 0x48, 0x4B, 0x48, 0x7A, 0x48, 0x47, 0x13, 0x7A, 0x30, 0x47, 0x14, 0x7A, 0x30, 0x47, +/* 00006500 */ 0x16, 0x5C, 0x03, 0x47, 0x1F, 0x04, 0xFF, 0x46, 0x90, 0x01, 0x02, 0x00, 0x09, 0x07, 0x00, 0xA8, +/* 00006510 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x07, 0xB0, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x03, +/* 00006520 */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, +/* 00006530 */ 0x01, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, +/* 00006540 */ 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x70, +/* 00006550 */ 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x01, 0x00, 0x00, 0xB3, +/* 00006560 */ 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, +/* 00006570 */ 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, +/* 00006580 */ 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, +/* 00006590 */ 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x2C, +/* 000065A0 */ 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x91, +/* 000065B0 */ 0x01, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, +/* 000065C0 */ 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, +/* 000065D0 */ 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x0A, +/* 000065E0 */ 0x04, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x00, 0xFE, 0xFC, 0x03, 0xFE, 0xFE, 0x03, 0xFE, 0x00, 0x04, +/* 000065F0 */ 0xFE, 0x02, 0x04, 0xFE, 0x04, 0x04, 0xFE, 0x06, 0x04, 0xFE, 0x08, 0x04, 0xFE, 0x0A, 0x04, 0xFE, +/* 00006600 */ 0x0C, 0x04, 0xFE, 0x93, 0x01, 0xFE, 0x91, 0x01, 0xFE, 0x94, 0x01, 0xFE, 0x93, 0x01, 0xFE, 0xEC, +/* 00006610 */ 0x02, 0xFE, 0x91, 0x01, 0xFE, 0xED, 0x02, 0xFE, 0x94, 0x01, 0xFE, 0xEE, 0x02, 0xFE, 0x96, 0x02, +/* 00006620 */ 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0x48, 0x01, 0xFE, +/* 00006630 */ 0xB7, 0x01, 0xFE, 0x1B, 0x04, 0x02, 0x01, 0x09, 0x00, 0xFE, 0x1C, 0x04, 0x01, 0xFE, 0x1D, 0x04, +/* 00006640 */ 0x02, 0xFE, 0x1E, 0x04, 0x03, 0xFE, 0x1F, 0x04, 0x04, 0xFE, 0x20, 0x04, 0x05, 0xFE, 0x21, 0x04, +/* 00006650 */ 0x06, 0xFE, 0x22, 0x04, 0x07, 0xFE, 0x23, 0x04, 0x08, 0xFE, 0x24, 0x04, 0x03, 0x02, 0x00, 0xFE, +/* 00006660 */ 0x1D, 0x02, 0x01, 0xFE, 0x1E, 0x02, 0xFE, 0x23, 0xE9, 0x14, 0x16, 0x00, 0x00, 0x00, 0x75, 0x00, +/* 00006670 */ 0x9A, 0x13, 0x34, 0x00, 0xDA, 0x36, 0x19, 0x00, 0x5E, 0x00, 0x30, 0x00, 0xFC, 0x0F, 0x30, 0x00, +/* 00006680 */ 0x42, 0x02, 0x30, 0x00, 0x54, 0x02, 0x30, 0x00, 0x53, 0x02, 0x2E, 0x00, 0x62, 0x04, 0x18, 0x00, +/* 00006690 */ 0x59, 0x04, 0x18, 0x00, 0x54, 0x00, 0x13, 0x00, 0x48, 0x00, 0x43, 0x00, 0x9D, 0x00, 0x24, 0x00, +/* 000066A0 */ 0x4A, 0x00, 0x40, 0x00, 0xA2, 0x00, 0x5C, 0x00, 0x22, 0x03, 0x51, 0x00, 0xEC, 0x08, 0x3A, 0x00, +/* 000066B0 */ 0x9F, 0x00, 0x07, 0x00, 0x88, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x12, 0x89, 0x00, 0x00, 0xD6, +/* 000066C0 */ 0x84, 0x00, 0x00, 0x5F, 0x84, 0x00, 0x00, 0xA1, 0x82, 0x00, 0x00, 0x1C, 0x81, 0x00, 0x00, 0x6B, +/* 000066D0 */ 0x7D, 0x00, 0x00, 0x6C, 0x75, 0x00, 0x00, 0xFD, 0x72, 0x00, 0x00, 0xB7, 0x71, 0x00, 0x00, 0x71, +/* 000066E0 */ 0x70, 0x00, 0x00, 0x2B, 0x6F, 0x00, 0x00, 0x53, 0x6D, 0x00, 0x00, 0x96, 0x6B, 0x00, 0x00, 0xAD, +/* 000066F0 */ 0x6A, 0x00, 0x00, 0xF7, 0x66, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0x89, 0xC6, 0x12, 0xFE, 0xCE, +/* 00006700 */ 0x06, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x51, 0xFF, 0x3B, 0x59, 0x01, 0x00, 0x01, +/* 00006710 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x3B, 0x59, 0x01, 0x00, 0xFE, 0x30, 0x08, 0xFE, +/* 00006720 */ 0x30, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, 0x04, 0x09, 0x20, 0x20, 0x20, 0x20, 0x01, +/* 00006730 */ 0x16, 0x17, 0x18, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x62, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x06, +/* 00006740 */ 0xFE, 0x5D, 0x03, 0x06, 0xFE, 0x63, 0x04, 0x06, 0xFE, 0xE1, 0x03, 0x06, 0xFE, 0x50, 0x04, 0x06, +/* 00006750 */ 0xFE, 0x54, 0x04, 0x06, 0xFE, 0x51, 0x04, 0x06, 0xFE, 0x52, 0x04, 0x06, 0xFE, 0x25, 0x04, 0x06, +/* 00006760 */ 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, +/* 00006770 */ 0xFE, 0x2A, 0x04, 0x06, 0xFE, 0x53, 0x04, 0x07, 0x08, 0xFE, 0xA8, 0x01, 0x5B, 0x15, 0xB3, 0x15, +/* 00006780 */ 0x15, 0x2C, 0x19, 0x15, 0x15, 0x03, 0x00, 0x19, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x04, 0x09, 0x1A, +/* 00006790 */ 0x6C, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, +/* 000067A0 */ 0x1F, 0x03, 0xFF, 0x19, 0x8E, 0x04, 0x09, 0x1A, 0x6C, 0x19, 0x1A, 0x01, 0x07, 0x02, 0x00, 0x5C, +/* 000067B0 */ 0x00, 0x1A, 0x5C, 0x01, 0x15, 0x1F, 0x02, 0x19, 0x19, 0x96, 0x02, 0x19, 0x92, 0x02, 0x19, 0xA8, +/* 000067C0 */ 0x1A, 0x14, 0x11, 0x00, 0x19, 0x1A, 0x09, 0x00, 0x00, 0x92, 0x02, 0x19, 0x61, 0x19, 0x19, 0x02, +/* 000067D0 */ 0x0F, 0x1B, 0x00, 0x19, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x1A, 0x6C, 0x19, 0x1A, 0x00, 0x07, +/* 000067E0 */ 0x03, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x19, 0x8E, +/* 000067F0 */ 0x04, 0x0A, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00006800 */ 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x03, 0x7A, 0x1B, 0x1A, +/* 00006810 */ 0x04, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x05, 0x7A, 0x1B, 0x1A, 0x06, 0x92, 0x02, 0x1B, 0x61, +/* 00006820 */ 0x1B, 0x1B, 0x07, 0x7A, 0x1B, 0x1A, 0x08, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x09, 0x7A, 0x1B, +/* 00006830 */ 0x1A, 0x0A, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x0B, 0x7A, 0x1B, 0x1A, 0x0C, 0x92, 0x02, 0x1B, +/* 00006840 */ 0x61, 0x1B, 0x1B, 0x0D, 0x7A, 0x1B, 0x1A, 0x0E, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x0F, 0x7A, +/* 00006850 */ 0x1B, 0x1A, 0x10, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x11, 0x7A, 0x1B, 0x1A, 0x12, 0x92, 0x02, +/* 00006860 */ 0x1B, 0x61, 0x1B, 0x1B, 0x13, 0x7A, 0x1B, 0x1A, 0x14, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x15, +/* 00006870 */ 0x7A, 0x1B, 0x1A, 0x16, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x17, 0x7A, 0x1B, 0x1A, 0x18, 0x92, +/* 00006880 */ 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x19, 0x7A, 0x1B, 0x1A, 0x1A, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, +/* 00006890 */ 0x1B, 0x7A, 0x1B, 0x1A, 0x1C, 0x92, 0x02, 0x1B, 0x61, 0x1B, 0x1B, 0x1D, 0x7A, 0x1B, 0x1A, 0x1E, +/* 000068A0 */ 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x13, 0x1F, 0x03, 0x19, 0x19, 0x96, 0x03, 0x19, 0x8E, 0x04, 0x0A, +/* 000068B0 */ 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0xCB, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x13, 0x1F, +/* 000068C0 */ 0x03, 0x19, 0x19, 0x96, 0x04, 0x19, 0x8E, 0x04, 0x0C, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x14, +/* 000068D0 */ 0x8E, 0x04, 0x1C, 0x1A, 0x5C, 0x01, 0x1A, 0x8E, 0x04, 0x18, 0x1A, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 000068E0 */ 0x14, 0x92, 0x03, 0x1B, 0x5C, 0x01, 0x1B, 0x1F, 0x02, 0x1A, 0x1A, 0x5C, 0x02, 0x1A, 0xD4, 0x00, +/* 000068F0 */ 0x1A, 0x5C, 0x03, 0x1A, 0x92, 0x02, 0x1A, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0xFF, 0x19, 0x8E, 0x04, +/* 00006900 */ 0x0A, 0x19, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x14, 0x92, 0x04, 0x1A, 0x5C, 0x01, 0x1A, 0x8E, 0x04, +/* 00006910 */ 0x0E, 0x1A, 0x61, 0x1A, 0x1A, 0x1F, 0x5C, 0x02, 0x1A, 0x1F, 0x03, 0x00, 0x19, 0x09, 0x02, 0x00, +/* 00006920 */ 0xA8, 0x00, 0x24, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, +/* 00006930 */ 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x85, +/* 00006940 */ 0x02, 0x00, 0x00, 0x87, 0x02, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x7E, +/* 00006950 */ 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x81, +/* 00006960 */ 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, +/* 00006970 */ 0x02, 0xFE, 0x6E, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x94, 0x02, 0xFE, 0x95, 0x02, +/* 00006980 */ 0xFE, 0x14, 0x02, 0xFE, 0x97, 0x02, 0xFE, 0x90, 0x02, 0xFE, 0x85, 0x02, 0xFE, 0x92, 0x02, 0xFE, +/* 00006990 */ 0x87, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x7D, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x89, +/* 000069A0 */ 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x80, 0x02, +/* 000069B0 */ 0xFE, 0x8D, 0x02, 0xFE, 0x82, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x8E, 0x02, 0xFE, +/* 000069C0 */ 0x83, 0x02, 0xFE, 0x91, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x48, 0x01, 0xFE, 0xF9, 0x03, 0xFE, 0x64, +/* 000069D0 */ 0x04, 0xFE, 0xFD, 0x01, 0xFF, 0x70, 0x59, 0x01, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, +/* 000069E0 */ 0x3C, 0x00, 0x18, 0x00, 0x90, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x1B, 0x00, 0x6B, 0x00, 0x18, 0x00, +/* 000069F0 */ 0x90, 0x00, 0xBE, 0x00, 0xCE, 0x03, 0x19, 0x00, 0x3E, 0x00, 0x38, 0x00, 0x98, 0x01, 0x24, 0x00, +/* 00006A00 */ 0x44, 0x00, 0x00, 0x07, 0x6A, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xE7, +/* 00006A10 */ 0x06, 0x60, 0xA2, 0x41, 0xD1, 0x00, 0x52, 0xFF, 0xD6, 0x5F, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, +/* 00006A20 */ 0x00, 0x02, 0x02, 0xFF, 0xD6, 0x5F, 0x01, 0x00, 0xFE, 0x27, 0x01, 0xFE, 0x27, 0x01, 0x41, 0x04, +/* 00006A30 */ 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x05, 0x06, 0x06, 0xFE, 0x50, 0x04, 0x05, 0xFE, 0xFA, 0x03, +/* 00006A40 */ 0x08, 0x58, 0x8E, 0x01, 0x03, 0x07, 0x97, 0x07, 0x07, 0x05, 0xA8, 0x08, 0x15, 0x0B, 0x00, 0x07, +/* 00006A50 */ 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x05, 0x02, 0x09, 0x3A, 0x00, 0x8E, 0x05, 0x0C, 0x07, +/* 00006A60 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x05, 0x19, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x02, +/* 00006A70 */ 0x08, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x03, 0x05, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0x07, 0x07, 0x0F, +/* 00006A80 */ 0x03, 0x00, 0x07, 0x09, 0x10, 0x00, 0x8E, 0x01, 0x04, 0x07, 0x8E, 0x01, 0x03, 0x08, 0x97, 0x08, +/* 00006A90 */ 0x08, 0x05, 0x9C, 0x08, 0x07, 0x05, 0xA8, 0x00, 0x24, 0x00, 0xFF, 0x04, 0x60, 0x01, 0x00, 0x03, +/* 00006AA0 */ 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xA6, 0x00, 0x12, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x5C, 0x80, +/* 00006AB0 */ 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xBF, 0x06, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x50, 0xFF, 0x2E, 0x56, +/* 00006AC0 */ 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x2E, 0x56, 0x01, 0x00, 0xFE, 0x60, +/* 00006AD0 */ 0x02, 0xFE, 0x60, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x01, 0x04, 0x04, 0x04, +/* 00006AE0 */ 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0x61, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x78, 0x5B, +/* 00006AF0 */ 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x18, 0x00, 0x8E, +/* 00006B00 */ 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, +/* 00006B10 */ 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, +/* 00006B20 */ 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, +/* 00006B30 */ 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, 0x08, 0x06, 0x02, 0x0F, 0x1B, 0x00, +/* 00006B40 */ 0x08, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00006B50 */ 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x61, 0x00, 0x06, 0x03, +/* 00006B60 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, +/* 00006B70 */ 0xFE, 0x7A, 0x02, 0xFF, 0x54, 0x56, 0x01, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, +/* 00006B80 */ 0x00, 0x18, 0x00, 0x88, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x6B, 0x00, 0x18, 0x00, 0x88, +/* 00006B90 */ 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xA0, 0x06, +/* 00006BA0 */ 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0xEB, 0x03, 0x4F, 0xFF, 0x87, 0x4F, 0x01, 0x00, 0xFF, 0x00, +/* 00006BB0 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFF, 0x87, 0x4F, 0x01, 0x00, 0xFE, 0xFD, 0x03, 0xFE, 0xFD, 0x03, +/* 00006BC0 */ 0x01, 0x08, 0x06, 0x0B, 0x07, 0x5A, 0x56, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0A, 0x06, 0xFE, +/* 00006BD0 */ 0x9A, 0x03, 0x05, 0xFE, 0x61, 0x04, 0x06, 0xFE, 0x16, 0x03, 0x08, 0xFE, 0x28, 0x01, 0x5B, 0x07, +/* 00006BE0 */ 0xB3, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x2C, 0x0B, 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, +/* 00006BF0 */ 0x18, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, +/* 00006C00 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, +/* 00006C10 */ 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, +/* 00006C20 */ 0x08, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x08, 0x0B, 0x09, 0x00, 0x00, 0x61, 0x0B, 0x08, 0x02, +/* 00006C30 */ 0x0F, 0x1B, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, +/* 00006C40 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0xA8, +/* 00006C50 */ 0x0B, 0x15, 0x03, 0x00, 0x06, 0x0B, 0x09, 0x42, 0x00, 0x8E, 0x04, 0x27, 0x0B, 0x07, 0x02, 0x00, +/* 00006C60 */ 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x1B, 0x00, 0x0B, 0x09, 0x00, +/* 00006C70 */ 0x00, 0x8E, 0x04, 0x26, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0x1F, 0x02, +/* 00006C80 */ 0x0B, 0x0B, 0x0F, 0x15, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, +/* 00006C90 */ 0x03, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x0C, 0x1F, 0x01, 0xFF, 0x0B, 0xA8, 0x0B, 0x47, 0x09, 0x0B, +/* 00006CA0 */ 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x06, 0x0B, 0x09, 0x1B, 0x00, 0x8E, 0x04, 0x31, 0x0C, 0x6C, 0x0B, +/* 00006CB0 */ 0x0C, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0B, 0x0B, 0x47, +/* 00006CC0 */ 0x09, 0x0B, 0x09, 0x11, 0x00, 0x8E, 0x04, 0x22, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x05, 0x1F, +/* 00006CD0 */ 0x01, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x8E, 0x04, 0x11, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, +/* 00006CE0 */ 0x8E, 0x04, 0x09, 0x0D, 0x6C, 0x0C, 0x0D, 0x05, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0D, 0x5C, 0x01, +/* 00006CF0 */ 0x09, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x0C, 0x0C, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x00, 0x0B, 0x09, +/* 00006D00 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6E, 0x02, 0xFE, +/* 00006D10 */ 0x5B, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x33, 0x02, 0xFF, 0xB3, 0x4F, 0x01, 0x00, 0x0D, 0x09, 0x00, +/* 00006D20 */ 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7F, 0x00, 0x18, 0x00, 0x47, 0x00, 0x15, 0x00, +/* 00006D30 */ 0x67, 0x00, 0x18, 0x00, 0x80, 0x00, 0x3A, 0x00, 0x56, 0x00, 0x12, 0x00, 0x48, 0x00, 0x05, 0x00, +/* 00006D40 */ 0x2F, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x1B, 0x00, 0x59, 0x00, 0x11, 0x00, 0x42, 0x00, 0x2E, 0x00, +/* 00006D50 */ 0x51, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x85, 0x06, 0x10, 0xA3, 0x41, +/* 00006D60 */ 0xC1, 0x00, 0xFE, 0x16, 0x03, 0x4E, 0xFF, 0x05, 0x4B, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00006D70 */ 0x03, 0x01, 0xFF, 0x05, 0x4B, 0x01, 0x00, 0xFE, 0x26, 0x04, 0xFE, 0x26, 0x04, 0x01, 0x09, 0x05, +/* 00006D80 */ 0x0B, 0x05, 0x62, 0x5B, 0x04, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x16, 0x03, +/* 00006D90 */ 0x07, 0xFE, 0x3D, 0x01, 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, +/* 00006DA0 */ 0x05, 0x02, 0xA8, 0x0B, 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, +/* 00006DB0 */ 0x0B, 0x4F, 0x08, 0x4F, 0x09, 0x6A, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, +/* 00006DC0 */ 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x16, 0x00, 0x8E, 0x01, 0x02, +/* 00006DD0 */ 0x0B, 0x4B, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC2, 0x03, 0x00, 0x0B, +/* 00006DE0 */ 0x09, 0xEC, 0x00, 0x8E, 0x04, 0x31, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00006DF0 */ 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x08, 0x0B, 0x8E, 0x04, 0x17, 0x0B, 0x07, +/* 00006E00 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x18, 0x00, 0x0B, +/* 00006E10 */ 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00006E20 */ 0x0C, 0x5C, 0x01, 0x03, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, +/* 00006E30 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, +/* 00006E40 */ 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x09, 0x0B, 0x09, 0x31, 0x00, 0x8E, 0x04, 0x0A, 0x0B, 0x07, 0x03, +/* 00006E50 */ 0x00, 0x5C, 0x00, 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0x0B, 0x0B, +/* 00006E60 */ 0x47, 0x09, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00006E70 */ 0x0C, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x09, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x02, 0x08, 0x0B, 0x4B, +/* 00006E80 */ 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, +/* 00006E90 */ 0x1F, 0x04, 0xFF, 0x0B, 0x47, 0x0B, 0x09, 0x8E, 0x04, 0x0C, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00006EA0 */ 0x02, 0x8E, 0x04, 0x20, 0x0D, 0x5C, 0x01, 0x0D, 0x8E, 0x01, 0x03, 0x0D, 0x4B, 0x0D, 0x5C, 0x02, +/* 00006EB0 */ 0x0D, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0x0C, 0x0C, 0x76, 0x0C, 0x0B, 0x04, 0x61, 0x0B, 0x09, 0x05, +/* 00006EC0 */ 0x82, 0x0B, 0x0B, 0x2B, 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 00006ED0 */ 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x7A, 0x02, +/* 00006EE0 */ 0xFE, 0x7A, 0x02, 0xDD, 0xFF, 0x1D, 0x4B, 0x01, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, +/* 00006EF0 */ 0x15, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x18, 0x00, 0x43, 0x00, 0x16, 0x00, 0x58, 0x00, 0x18, 0x00, +/* 00006F00 */ 0x37, 0x00, 0x18, 0x00, 0x38, 0x00, 0x15, 0x00, 0x9D, 0x00, 0x18, 0x00, 0x47, 0x00, 0x0A, 0x00, +/* 00006F10 */ 0x3A, 0x00, 0x19, 0x00, 0x3F, 0x00, 0x18, 0x00, 0x58, 0x00, 0x19, 0x00, 0x4F, 0x00, 0x28, 0x00, +/* 00006F20 */ 0x66, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5D, 0x80, 0xE0, 0x81, +/* 00006F30 */ 0xC6, 0x02, 0xFE, 0x7E, 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, 0x4C, 0xFF, 0x87, 0x48, 0x01, 0x00, +/* 00006F40 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFF, 0x87, 0x48, 0x01, 0x00, 0xFE, 0x9F, 0x01, +/* 00006F50 */ 0xFE, 0x9F, 0x01, 0x40, 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, 0x16, 0x03, 0x03, 0x01, 0x01, 0x01, +/* 00006F60 */ 0x01, 0x08, 0x09, 0x0A, 0x08, 0x42, 0x96, 0x02, 0x03, 0x96, 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, +/* 00006F70 */ 0x05, 0x06, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, +/* 00006F80 */ 0x8E, 0x03, 0x2A, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x92, 0x02, 0x0E, 0x5C, 0x01, 0x0E, +/* 00006F90 */ 0xD4, 0x00, 0x0E, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x0D, 0x0D, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, +/* 00006FA0 */ 0x1F, 0x03, 0xFF, 0x0B, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0x2B, 0x01, 0xFE, 0x5B, +/* 00006FB0 */ 0x04, 0xFE, 0x5C, 0x04, 0xFE, 0x5D, 0x04, 0xFF, 0xDA, 0x48, 0x01, 0x00, 0x02, 0x0C, 0x00, 0x00, +/* 00006FC0 */ 0x00, 0x34, 0x00, 0x4B, 0x01, 0x00, 0xCA, 0x6F, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, +/* 00006FD0 */ 0x00, 0xFE, 0x7F, 0x06, 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x60, 0x04, 0x4D, 0xFF, 0x13, 0x49, +/* 00006FE0 */ 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x13, 0x49, 0x01, 0x00, 0xEE, 0xEE, +/* 00006FF0 */ 0x01, 0x07, 0x03, 0x07, 0x09, 0x1D, 0x1B, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x06, 0x08, 0x59, +/* 00007000 */ 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, +/* 00007010 */ 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, 0x02, 0x09, 0x08, 0x4B, 0x08, 0x6C, +/* 00007020 */ 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x02, 0x09, +/* 00007030 */ 0x5C, 0x02, 0x09, 0x8E, 0x01, 0x03, 0x09, 0x5C, 0x03, 0x09, 0x8E, 0x01, 0x04, 0x09, 0x5C, 0x04, +/* 00007040 */ 0x09, 0x8E, 0x01, 0x05, 0x09, 0x5C, 0x05, 0x09, 0x5C, 0x06, 0x03, 0x5C, 0x07, 0x04, 0x1F, 0x08, +/* 00007050 */ 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, 0xFF, 0x3F, 0x49, 0x01, 0x00, 0x04, +/* 00007060 */ 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x3E, 0x00, 0x81, 0x00, +/* 00007070 */ 0x00, 0xBF, 0x5D, 0x80, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x78, 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, +/* 00007080 */ 0x4A, 0xFF, 0x33, 0x46, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFF, 0x33, +/* 00007090 */ 0x46, 0x01, 0x00, 0xFE, 0x9F, 0x01, 0xFE, 0x9F, 0x01, 0x40, 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, +/* 000070A0 */ 0x16, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, 0x0A, 0x08, 0x42, 0x96, 0x02, 0x03, 0x96, +/* 000070B0 */ 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, 0x05, 0x06, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, +/* 000070C0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8E, 0x03, 0x2A, 0x0D, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, +/* 000070D0 */ 0x92, 0x02, 0x0E, 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x0D, 0x0D, +/* 000070E0 */ 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, 0x1F, 0x03, 0xFF, 0x0B, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, +/* 000070F0 */ 0x02, 0xFE, 0x2B, 0x01, 0xFE, 0x5B, 0x04, 0xFE, 0x5C, 0x04, 0xFE, 0x5D, 0x04, 0xFF, 0x86, 0x46, +/* 00007100 */ 0x01, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x34, 0x00, 0x4B, 0x01, 0x00, 0x10, 0x71, 0x00, 0x00, +/* 00007110 */ 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x79, 0x06, 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, +/* 00007120 */ 0x5F, 0x04, 0x4B, 0xFF, 0xBF, 0x46, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, +/* 00007130 */ 0xBF, 0x46, 0x01, 0x00, 0xEE, 0xEE, 0x01, 0x07, 0x03, 0x07, 0x09, 0x1D, 0x1B, 0x04, 0x05, 0x01, +/* 00007140 */ 0x01, 0x01, 0x01, 0x06, 0x08, 0x59, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, +/* 00007150 */ 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, +/* 00007160 */ 0x02, 0x09, 0x08, 0x4B, 0x08, 0x6C, 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, +/* 00007170 */ 0x01, 0x05, 0x8E, 0x01, 0x02, 0x09, 0x5C, 0x02, 0x09, 0x8E, 0x01, 0x03, 0x09, 0x5C, 0x03, 0x09, +/* 00007180 */ 0x8E, 0x01, 0x04, 0x09, 0x5C, 0x04, 0x09, 0x8E, 0x01, 0x05, 0x09, 0x5C, 0x05, 0x09, 0x5C, 0x06, +/* 00007190 */ 0x03, 0x5C, 0x07, 0x04, 0x1F, 0x08, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, +/* 000071A0 */ 0xFF, 0xEB, 0x46, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, +/* 000071B0 */ 0x2B, 0x00, 0x3E, 0x00, 0x81, 0x00, 0x00, 0xBF, 0x5D, 0x80, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x72, +/* 000071C0 */ 0x06, 0x0D, 0xA2, 0x41, 0xD1, 0x00, 0x48, 0xFF, 0xF1, 0x43, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, +/* 000071D0 */ 0x01, 0x00, 0x06, 0x06, 0xFF, 0xF1, 0x43, 0x01, 0x00, 0xFE, 0x9B, 0x01, 0xFE, 0x9B, 0x01, 0x40, +/* 000071E0 */ 0x04, 0x0C, 0x03, 0x0B, 0x08, 0x16, 0x16, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x08, 0x09, 0x0A, +/* 000071F0 */ 0x08, 0x42, 0x96, 0x02, 0x03, 0x96, 0x03, 0x04, 0x96, 0x04, 0x05, 0x96, 0x05, 0x06, 0x8E, 0x03, +/* 00007200 */ 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x8E, 0x03, 0x2A, 0x0D, +/* 00007210 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x92, 0x02, 0x0E, 0x5C, 0x01, 0x0E, 0xD4, 0x00, 0x0E, 0x5C, +/* 00007220 */ 0x02, 0x0E, 0x1F, 0x03, 0x0D, 0x0D, 0x5C, 0x01, 0x0D, 0x5C, 0x02, 0x07, 0x1F, 0x03, 0xFF, 0x0B, +/* 00007230 */ 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0x2B, 0x01, 0xFE, 0x5B, 0x04, 0xFE, 0x5C, 0x04, +/* 00007240 */ 0xFE, 0x5D, 0x04, 0xFF, 0x44, 0x44, 0x01, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x34, 0x00, 0x47, +/* 00007250 */ 0x01, 0x00, 0x56, 0x72, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x73, 0x06, +/* 00007260 */ 0x49, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0x5E, 0x04, 0x49, 0xFF, 0x7D, 0x44, 0x01, 0x00, 0xFF, 0x00, +/* 00007270 */ 0x10, 0x01, 0x00, 0x03, 0x01, 0xFF, 0x7D, 0x44, 0x01, 0x00, 0xEA, 0xEA, 0x01, 0x07, 0x03, 0x07, +/* 00007280 */ 0x09, 0x1D, 0x1B, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x06, 0x08, 0x59, 0x5B, 0x05, 0xB3, 0x05, +/* 00007290 */ 0x05, 0x15, 0x05, 0x00, 0x03, 0x02, 0xA8, 0x07, 0x47, 0x03, 0x07, 0x15, 0x05, 0x00, 0x04, 0x02, +/* 000072A0 */ 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, 0x02, 0x09, 0x08, 0x4B, 0x08, 0x6C, 0x07, 0x08, 0x00, 0x07, +/* 000072B0 */ 0x08, 0x00, 0x5C, 0x00, 0x08, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x02, 0x09, 0x5C, 0x02, 0x09, 0x8E, +/* 000072C0 */ 0x01, 0x03, 0x09, 0x5C, 0x03, 0x09, 0x8E, 0x01, 0x04, 0x09, 0x5C, 0x04, 0x09, 0x8E, 0x01, 0x05, +/* 000072D0 */ 0x09, 0x5C, 0x05, 0x09, 0x5C, 0x06, 0x03, 0x5C, 0x07, 0x04, 0x1F, 0x08, 0x00, 0x07, 0x09, 0x02, +/* 000072E0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x86, 0xFF, 0xA5, 0x44, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, +/* 000072F0 */ 0x0A, 0x00, 0x15, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x3E, 0x00, 0x81, 0x00, 0x00, 0xBF, 0x5C, 0x80, +/* 00007300 */ 0xE0, 0x03, 0xC4, 0x00, 0xFE, 0x3B, 0x06, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x23, 0x04, 0x47, +/* 00007310 */ 0xFF, 0xCC, 0x34, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x07, 0x07, 0xFF, 0xCC, 0x34, 0x01, +/* 00007320 */ 0x00, 0xFE, 0x5A, 0x06, 0xFE, 0x5A, 0x06, 0x01, 0x0F, 0x07, 0x11, 0x0A, 0x8F, 0x89, 0x03, 0x0C, +/* 00007330 */ 0x04, 0x04, 0x04, 0x04, 0x01, 0x10, 0x06, 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xFB, 0x03, 0x08, 0x05, +/* 00007340 */ 0xFE, 0x5A, 0x04, 0x07, 0xFE, 0xCE, 0x01, 0x5B, 0x0D, 0xB3, 0x0D, 0x0D, 0x4F, 0x0E, 0x4F, 0x0F, +/* 00007350 */ 0x2C, 0x11, 0x0D, 0x15, 0x13, 0x00, 0x11, 0x02, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x12, 0x11, 0xE1, +/* 00007360 */ 0x11, 0x0D, 0x11, 0x00, 0x0F, 0x1B, 0x00, 0x11, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x12, 0x6C, +/* 00007370 */ 0x11, 0x12, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x03, 0x1F, +/* 00007380 */ 0x03, 0xFF, 0x11, 0x8E, 0x03, 0x0C, 0x11, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x21, +/* 00007390 */ 0x12, 0x5C, 0x01, 0x12, 0x8E, 0x03, 0x12, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x0D, 0xC2, 0x02, +/* 000073A0 */ 0x12, 0x12, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0E, 0x11, 0x8E, 0x03, 0x27, 0x11, +/* 000073B0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0E, 0x1F, 0x02, 0x11, 0x11, 0x0F, 0x1B, 0x00, +/* 000073C0 */ 0x11, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x26, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 000073D0 */ 0x0E, 0x1F, 0x02, 0x11, 0x11, 0x0F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, +/* 000073E0 */ 0x31, 0x01, 0xA8, 0x11, 0x47, 0x0F, 0x11, 0x8E, 0x03, 0x09, 0x11, 0x61, 0x11, 0x11, 0x01, 0x0F, +/* 000073F0 */ 0x03, 0x00, 0x11, 0x09, 0x88, 0x00, 0x0F, 0x84, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x0F, 0x7D, 0x00, +/* 00007400 */ 0x0C, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x0A, 0x11, 0x4B, 0x11, 0x97, 0x11, 0x11, 0x0A, 0x0F, 0x03, +/* 00007410 */ 0x00, 0x11, 0x09, 0x10, 0x00, 0x8E, 0x01, 0x0A, 0x11, 0x4B, 0x11, 0x97, 0x11, 0x11, 0x0A, 0x47, +/* 00007420 */ 0x0F, 0x11, 0x09, 0x59, 0x00, 0x8E, 0x03, 0x0A, 0x11, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, +/* 00007430 */ 0x12, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0F, 0x11, 0x8E, 0x01, +/* 00007440 */ 0x08, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0F, 0xA8, 0x12, 0x5C, +/* 00007450 */ 0x02, 0x12, 0x8E, 0x01, 0x02, 0x12, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0xA8, 0x13, +/* 00007460 */ 0x5C, 0x01, 0x13, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0x12, 0x12, 0x5C, 0x03, 0x12, +/* 00007470 */ 0x1F, 0x04, 0xFF, 0x11, 0x8E, 0x01, 0x0A, 0x11, 0x4B, 0x11, 0x9C, 0x0F, 0x11, 0x0A, 0x0F, 0x4E, +/* 00007480 */ 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x0A, 0x11, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, +/* 00007490 */ 0x12, 0x5C, 0x01, 0x12, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0x11, 0x11, 0x47, 0x0F, 0x11, 0x8E, 0x01, +/* 000074A0 */ 0x08, 0x11, 0x4B, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0F, 0x5C, 0x02, 0x0B, +/* 000074B0 */ 0x8E, 0x01, 0x02, 0x12, 0x4B, 0x12, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x0C, 0x5C, +/* 000074C0 */ 0x02, 0x08, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0x12, 0x12, 0x5C, 0x03, 0x12, 0x1F, 0x04, 0xFF, 0x11, +/* 000074D0 */ 0x8E, 0x03, 0x11, 0x11, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x09, 0x13, 0x6C, 0x12, +/* 000074E0 */ 0x13, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x13, 0x8E, 0x03, 0x31, 0x15, 0x6C, 0x14, 0x15, 0x03, +/* 000074F0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x15, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x14, 0x14, 0x5C, 0x01, 0x14, +/* 00007500 */ 0x5C, 0x02, 0x0F, 0x1F, 0x03, 0x12, 0x12, 0x5C, 0x01, 0x12, 0x1F, 0x02, 0x00, 0x11, 0x09, 0x02, +/* 00007510 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x17, 0x03, 0xFE, 0x33, 0x02, 0xFE, 0x5E, +/* 00007520 */ 0x02, 0xFF, 0x45, 0x35, 0x01, 0x00, 0x11, 0x09, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x4F, 0x00, 0x18, +/* 00007530 */ 0x00, 0x50, 0x00, 0x29, 0x00, 0x53, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x3A, 0x00, 0x05, +/* 00007540 */ 0x00, 0x2D, 0x00, 0x1D, 0x00, 0xB4, 0x00, 0x11, 0x00, 0x84, 0x00, 0x10, 0x00, 0xA2, 0x00, 0x19, +/* 00007550 */ 0x00, 0x3E, 0x00, 0x36, 0x00, 0x7A, 0x00, 0x0A, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x28, 0x00, 0x19, +/* 00007560 */ 0x00, 0x3A, 0x00, 0x32, 0x00, 0x81, 0x00, 0x43, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, +/* 00007570 */ 0x29, 0xD4, 0x10, 0xFE, 0xAE, 0x05, 0x0C, 0xB3, 0x41, 0xC1, 0x00, 0xFE, 0x22, 0x04, 0x46, 0xFF, +/* 00007580 */ 0xCA, 0x17, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0xCA, 0x17, 0x01, 0x00, +/* 00007590 */ 0xFE, 0x69, 0x1B, 0xFE, 0x69, 0x1B, 0x45, 0x1C, 0x29, 0x41, 0x07, 0xFE, 0xAA, 0x01, 0xFE, 0x8A, +/* 000075A0 */ 0x01, 0x03, 0x0F, 0x2A, 0x2A, 0x2A, 0x2A, 0x01, 0x01, 0x40, 0x41, 0x06, 0xFE, 0x9A, 0x03, 0x06, +/* 000075B0 */ 0xFE, 0xBB, 0x03, 0x08, 0x06, 0xFE, 0x16, 0x03, 0x0B, 0x05, 0xFE, 0x12, 0x04, 0x06, 0xFE, 0x15, +/* 000075C0 */ 0x04, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, +/* 000075D0 */ 0x03, 0x06, 0xFE, 0x50, 0x04, 0x06, 0xFE, 0x51, 0x04, 0x05, 0xFE, 0x2B, 0x04, 0x05, 0xFE, 0x2C, +/* 000075E0 */ 0x04, 0x05, 0xFE, 0x2E, 0x04, 0x06, 0xFE, 0x52, 0x04, 0x06, 0xFE, 0x25, 0x04, 0x05, 0xFE, 0x30, +/* 000075F0 */ 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, +/* 00007600 */ 0x04, 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x06, 0xFE, 0x53, 0x04, 0x06, 0xFE, 0x54, +/* 00007610 */ 0x04, 0x06, 0xFE, 0x6C, 0x03, 0x05, 0xFE, 0x55, 0x04, 0x05, 0xFE, 0x56, 0x04, 0x05, 0xFE, 0x57, +/* 00007620 */ 0x04, 0x05, 0xFE, 0x58, 0x04, 0x07, 0x05, 0xFE, 0xF4, 0x03, 0x05, 0xFE, 0x1A, 0x04, 0x0C, 0x05, +/* 00007630 */ 0xFE, 0x59, 0x04, 0x06, 0xFE, 0x13, 0x04, 0x01, 0x00, 0xFE, 0x7B, 0x05, 0xA8, 0x3F, 0x2C, 0x42, +/* 00007640 */ 0x29, 0x0D, 0x03, 0x00, 0x42, 0x02, 0x09, 0x12, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, +/* 00007650 */ 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0x8E, 0x03, 0x0C, 0x42, 0x07, +/* 00007660 */ 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x19, 0x43, 0x5C, 0x01, 0x43, 0x5C, 0x02, 0x29, 0x5C, +/* 00007670 */ 0x03, 0x03, 0x1F, 0x04, 0x42, 0x42, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x23, 0x00, 0x61, 0x42, 0x29, +/* 00007680 */ 0x01, 0x0F, 0x03, 0x00, 0x42, 0x09, 0x18, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, 0x02, +/* 00007690 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x42, +/* 000076A0 */ 0x76, 0x06, 0x29, 0x03, 0x8E, 0x01, 0x02, 0x42, 0x4B, 0x42, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, +/* 000076B0 */ 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0x42, 0x42, 0x47, 0x2B, 0x42, +/* 000076C0 */ 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x09, +/* 000076D0 */ 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x0B, 0x43, 0xA1, 0x01, 0x0C, 0x43, 0x5C, 0x04, +/* 000076E0 */ 0x43, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x2E, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, +/* 000076F0 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xA8, 0x43, +/* 00007700 */ 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x2F, 0x42, 0xA8, +/* 00007710 */ 0x42, 0x15, 0x03, 0x00, 0x2F, 0x42, 0x09, 0x1B, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, +/* 00007720 */ 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x43, 0x5C, 0x01, 0x2F, 0x1F, 0x02, 0x42, 0x42, 0x47, 0x2F, +/* 00007730 */ 0x42, 0x09, 0x15, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, 0x05, 0x07, 0x01, 0x00, 0x5C, +/* 00007740 */ 0x00, 0x43, 0x1F, 0x01, 0x42, 0x42, 0x47, 0x2F, 0x42, 0xA8, 0x42, 0x14, 0x03, 0x00, 0x2F, 0x42, +/* 00007750 */ 0x09, 0x12, 0x00, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 00007760 */ 0x43, 0x1F, 0x01, 0xFF, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007770 */ 0x01, 0x2B, 0x5C, 0x02, 0x0E, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x03, 0xA1, 0x00, 0x0F, 0x43, 0xA1, +/* 00007780 */ 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, +/* 00007790 */ 0x06, 0x42, 0x42, 0x47, 0x30, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 000077A0 */ 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x12, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x03, 0xA1, 0x00, 0x0F, 0x43, +/* 000077B0 */ 0xA1, 0x01, 0x10, 0x43, 0xA1, 0x02, 0x11, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, +/* 000077C0 */ 0x1F, 0x06, 0x42, 0x42, 0x47, 0x31, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 000077D0 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x13, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, +/* 000077E0 */ 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, +/* 000077F0 */ 0x42, 0x47, 0x32, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007800 */ 0x2B, 0x5C, 0x02, 0x16, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x05, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, +/* 00007810 */ 0x15, 0x43, 0xA1, 0x02, 0x0F, 0x43, 0xA1, 0x03, 0x10, 0x43, 0xA1, 0x04, 0x11, 0x43, 0x5C, 0x04, +/* 00007820 */ 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x33, 0x42, 0x8E, 0x03, 0x02, +/* 00007830 */ 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0A, +/* 00007840 */ 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, +/* 00007850 */ 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x34, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, +/* 00007860 */ 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, +/* 00007870 */ 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, +/* 00007880 */ 0x1F, 0x06, 0x42, 0x42, 0x47, 0x35, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 00007890 */ 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x19, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, +/* 000078A0 */ 0x43, 0xA1, 0x01, 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, +/* 000078B0 */ 0x42, 0x47, 0x36, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 000078C0 */ 0x2B, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x14, 0x43, 0xA1, 0x01, +/* 000078D0 */ 0x15, 0x43, 0x5C, 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x37, +/* 000078E0 */ 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, +/* 000078F0 */ 0x1B, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x10, 0x43, 0xA1, 0x01, 0x11, 0x43, 0x5C, +/* 00007900 */ 0x04, 0x43, 0xA8, 0x43, 0x5C, 0x05, 0x43, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x38, 0x42, 0x0F, 0x03, +/* 00007910 */ 0x00, 0x35, 0x09, 0x27, 0x00, 0x8E, 0x03, 0x02, 0x43, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00007920 */ 0x01, 0x2B, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x1D, 0xA8, 0x44, 0x5C, 0x04, 0x44, 0xA8, 0x44, 0x5C, +/* 00007930 */ 0x05, 0x44, 0x1F, 0x06, 0x43, 0x43, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, 0x43, 0x47, 0x42, +/* 00007940 */ 0x43, 0x47, 0x39, 0x42, 0x8E, 0x03, 0x02, 0x42, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 00007950 */ 0x2B, 0x5C, 0x02, 0x1E, 0x5C, 0x03, 0x0A, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x1F, 0x43, 0xA1, 0x01, +/* 00007960 */ 0x0C, 0x43, 0x5C, 0x04, 0x43, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x42, 0x42, 0x47, 0x3A, 0x42, 0xA8, +/* 00007970 */ 0x42, 0x15, 0x03, 0x00, 0x39, 0x42, 0x09, 0x16, 0x00, 0x0F, 0x03, 0x00, 0x39, 0x09, 0x06, 0x00, +/* 00007980 */ 0x47, 0x43, 0x20, 0x09, 0x03, 0x00, 0x47, 0x43, 0x21, 0x47, 0x42, 0x43, 0x09, 0x05, 0x00, 0xA8, +/* 00007990 */ 0x43, 0x47, 0x42, 0x43, 0x47, 0x3B, 0x42, 0x8E, 0x01, 0x03, 0x42, 0x4B, 0x42, 0x07, 0x02, 0x00, +/* 000079A0 */ 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x0A, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCC, 0x00, 0x00, +/* 000079B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x7A, 0x30, 0x44, 0x07, 0x7A, 0x31, +/* 000079C0 */ 0x44, 0x08, 0x7A, 0x32, 0x44, 0x09, 0x7A, 0x33, 0x44, 0x0A, 0x7A, 0x34, 0x44, 0x0B, 0x7A, 0x35, +/* 000079D0 */ 0x44, 0x0C, 0x7A, 0x36, 0x44, 0x0D, 0x7A, 0x37, 0x44, 0x0E, 0x7A, 0x38, 0x44, 0x0F, 0x5C, 0x01, +/* 000079E0 */ 0x44, 0x5C, 0x02, 0x22, 0x1F, 0x03, 0x43, 0x43, 0x5C, 0x01, 0x43, 0x1F, 0x02, 0x42, 0x42, 0x47, +/* 000079F0 */ 0x3C, 0x42, 0x8E, 0x03, 0x07, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2A, 0x1F, +/* 00007A00 */ 0x02, 0x42, 0x42, 0x47, 0x2A, 0x42, 0x8E, 0x03, 0x2F, 0x42, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, +/* 00007A10 */ 0x5C, 0x01, 0x2A, 0x5C, 0x02, 0x2E, 0xCD, 0x43, 0x02, 0xA1, 0x00, 0x23, 0x43, 0xA1, 0x01, 0x24, +/* 00007A20 */ 0x43, 0x5C, 0x03, 0x43, 0x8E, 0x03, 0x30, 0x43, 0x5C, 0x04, 0x43, 0x1F, 0x05, 0x42, 0x42, 0x47, +/* 00007A30 */ 0x3D, 0x42, 0x76, 0x2E, 0x29, 0x10, 0x76, 0x2F, 0x29, 0x11, 0x61, 0x42, 0x3D, 0x12, 0x76, 0x42, +/* 00007A40 */ 0x29, 0x13, 0x76, 0x30, 0x29, 0x14, 0x76, 0x31, 0x29, 0x15, 0x76, 0x32, 0x29, 0x16, 0x76, 0x33, +/* 00007A50 */ 0x29, 0x17, 0x76, 0x34, 0x29, 0x18, 0x76, 0x35, 0x29, 0x19, 0x76, 0x36, 0x29, 0x1A, 0x76, 0x37, +/* 00007A60 */ 0x29, 0x1B, 0x76, 0x38, 0x29, 0x1C, 0x76, 0x39, 0x29, 0x1D, 0x76, 0x3A, 0x29, 0x1E, 0x76, 0x3B, +/* 00007A70 */ 0x29, 0x1F, 0x76, 0x3C, 0x29, 0x20, 0x47, 0x3E, 0x25, 0xE5, 0x1A, 0x00, 0x8E, 0x03, 0x3E, 0x42, +/* 00007A80 */ 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, 0x25, 0x1F, 0x03, +/* 00007A90 */ 0xFF, 0x42, 0xE9, 0x09, 0x51, 0x00, 0xE7, 0x2C, 0x06, 0x8E, 0x03, 0x29, 0x42, 0x07, 0x02, 0x00, +/* 00007AA0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2C, 0x1F, 0x02, 0xFF, 0x42, 0x8E, 0x01, 0x02, 0x42, 0x4B, 0x42, +/* 00007AB0 */ 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x5C, 0x02, 0x26, 0x5C, 0x03, 0x27, 0x1F, +/* 00007AC0 */ 0x04, 0x42, 0x42, 0x47, 0x3F, 0x42, 0x47, 0x42, 0x29, 0x8E, 0x01, 0x03, 0x43, 0x4B, 0x43, 0x07, +/* 00007AD0 */ 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x3F, 0x5C, 0x02, 0x22, 0x1F, 0x03, 0x43, 0x43, 0x76, +/* 00007AE0 */ 0x43, 0x42, 0x21, 0x47, 0x3E, 0x06, 0xE9, 0x0F, 0x28, 0x00, 0x3E, 0x09, 0x00, 0x00, 0x47, 0x42, +/* 00007AF0 */ 0x29, 0x8E, 0x01, 0x07, 0x43, 0x4B, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x61, 0x44, 0x29, +/* 00007B00 */ 0x22, 0x97, 0x44, 0x44, 0x28, 0x5C, 0x01, 0x44, 0x5C, 0x02, 0x29, 0x1F, 0x03, 0x43, 0x43, 0x76, +/* 00007B10 */ 0x43, 0x42, 0x21, 0xE5, 0x1A, 0x00, 0x8E, 0x03, 0x3E, 0x42, 0x4B, 0x42, 0x07, 0x03, 0x00, 0x5C, +/* 00007B20 */ 0x00, 0x04, 0x5C, 0x01, 0x29, 0x5C, 0x02, 0x06, 0x1F, 0x03, 0xFF, 0x42, 0xE9, 0x09, 0x27, 0x00, +/* 00007B30 */ 0xE7, 0x2D, 0x06, 0x8E, 0x03, 0x29, 0x42, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2D, +/* 00007B40 */ 0x1F, 0x02, 0xFF, 0x42, 0x8E, 0x03, 0x09, 0x43, 0x6C, 0x42, 0x43, 0x06, 0x07, 0x01, 0x00, 0x5C, +/* 00007B50 */ 0x00, 0x43, 0x1F, 0x01, 0xFF, 0x42, 0xE9, 0x8E, 0x01, 0x04, 0x42, 0x4B, 0x42, 0x07, 0x02, 0x00, +/* 00007B60 */ 0x5C, 0x00, 0x04, 0x61, 0x43, 0x29, 0x23, 0x5C, 0x01, 0x43, 0x1F, 0x02, 0x42, 0x42, 0x76, 0x42, +/* 00007B70 */ 0x29, 0x24, 0x47, 0x42, 0x29, 0x8E, 0x03, 0x0C, 0x43, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, +/* 00007B80 */ 0x03, 0x24, 0x44, 0x5C, 0x01, 0x44, 0x61, 0x44, 0x29, 0x25, 0x5C, 0x02, 0x44, 0x1F, 0x03, 0x43, +/* 00007B90 */ 0x43, 0x76, 0x43, 0x42, 0x26, 0x61, 0x42, 0x29, 0x27, 0xA8, 0x43, 0x15, 0x03, 0x00, 0x42, 0x43, +/* 00007BA0 */ 0x09, 0x0C, 0x00, 0x61, 0x42, 0x29, 0x28, 0x43, 0x42, 0x42, 0x20, 0x76, 0x42, 0x29, 0x1D, 0x76, +/* 00007BB0 */ 0x06, 0x29, 0x29, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, +/* 00007BC0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x7E, 0x02, +/* 00007BD0 */ 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x81, 0x02, +/* 00007BE0 */ 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, 0x02, +/* 00007BF0 */ 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x65, 0x02, 0xFE, 0x66, 0x02, 0xFE, 0x60, 0x02, 0xFE, +/* 00007C00 */ 0x7D, 0x02, 0xFE, 0x84, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x82, +/* 00007C10 */ 0x02, 0xFE, 0x81, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x90, 0x02, +/* 00007C20 */ 0xFE, 0x21, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x88, 0x02, 0xFE, 0x8F, 0x02, 0xFE, 0x89, 0x02, 0xFE, +/* 00007C30 */ 0x8A, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x8C, 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x91, +/* 00007C40 */ 0x02, 0xFE, 0x92, 0x02, 0xFE, 0x93, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x1A, 0x02, 0xFE, 0x1A, 0x02, +/* 00007C50 */ 0xFE, 0x27, 0x02, 0xFE, 0x26, 0x02, 0xFE, 0x94, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x14, 0x02, 0xFE, +/* 00007C60 */ 0x8D, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x6E, 0x02, 0xFF, 0x23, 0x18, 0x01, 0x00, 0x3F, 0x02, 0x00, +/* 00007C70 */ 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x2D, 0x00, 0x9F, 0x00, 0x18, 0x00, +/* 00007C80 */ 0x71, 0x00, 0x04, 0x00, 0x67, 0x00, 0x1C, 0x00, 0x46, 0x00, 0x2B, 0x00, 0x71, 0x00, 0x24, 0x00, +/* 00007C90 */ 0x60, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x1B, 0x00, 0x6C, 0x00, 0x15, 0x00, 0x4D, 0x00, 0x0A, 0x00, +/* 00007CA0 */ 0x32, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x31, 0x00, 0x6F, 0x00, 0x31, 0x00, 0x67, 0x00, 0x2D, 0x00, +/* 00007CB0 */ 0x64, 0x00, 0x39, 0x00, 0x81, 0x00, 0x2D, 0x00, 0x62, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x2D, 0x00, +/* 00007CC0 */ 0x68, 0x00, 0x2D, 0x00, 0x68, 0x00, 0x2D, 0x00, 0x70, 0x00, 0x36, 0x00, 0x6F, 0x00, 0x2B, 0x00, +/* 00007CD0 */ 0x77, 0x00, 0x28, 0x00, 0x71, 0x00, 0x5B, 0x00, 0xD0, 0x01, 0x14, 0x00, 0x41, 0x00, 0x2C, 0x00, +/* 00007CE0 */ 0x9A, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x36, 0x00, 0x08, 0x00, 0x68, 0x00, 0x04, 0x00, +/* 00007CF0 */ 0x34, 0x00, 0x04, 0x00, 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x30, 0x00, 0x04, 0x00, +/* 00007D00 */ 0x2C, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, +/* 00007D10 */ 0x3F, 0x00, 0x04, 0x00, 0x32, 0x00, 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, +/* 00007D20 */ 0xFA, 0x02, 0x06, 0x00, 0x93, 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x11, 0x00, +/* 00007D30 */ 0xEF, 0x00, 0x1C, 0x00, 0x54, 0x00, 0x1D, 0x00, 0x6A, 0x00, 0x04, 0x00, 0x37, 0x00, 0x07, 0x00, +/* 00007D40 */ 0x5A, 0x00, 0x28, 0x00, 0xDE, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x4A, 0x00, 0x11, 0x00, +/* 00007D50 */ 0x77, 0x01, 0x13, 0x00, 0x77, 0x00, 0x1B, 0x00, 0x66, 0x00, 0x23, 0x00, 0x82, 0x00, 0x0E, 0x00, +/* 00007D60 */ 0x3F, 0x00, 0x0C, 0x00, 0x6D, 0x00, 0x06, 0x00, 0x3F, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x11, +/* 00007D70 */ 0xC4, 0x00, 0xFE, 0x75, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x21, 0x04, 0x45, 0xFF, 0x8F, +/* 00007D80 */ 0x0A, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFF, 0x8F, 0x0A, 0x01, 0x00, 0xFE, +/* 00007D90 */ 0x2D, 0x0D, 0xFE, 0x2D, 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, 0xC8, 0xBB, 0x03, 0x07, 0x0A, 0x0A, +/* 00007DA0 */ 0x0A, 0x0A, 0x02, 0x15, 0x05, 0xFE, 0x4A, 0x04, 0x08, 0x05, 0xFE, 0x30, 0x04, 0x07, 0x05, 0xFE, +/* 00007DB0 */ 0x4B, 0x04, 0x01, 0x00, 0x05, 0xFE, 0x4C, 0x04, 0x05, 0xFE, 0x3F, 0x04, 0x05, 0xFE, 0x4D, 0x04, +/* 00007DC0 */ 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, +/* 00007DD0 */ 0x06, 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x05, 0xFE, 0x4E, 0x04, 0xFE, 0x9A, 0x02, 0xA8, +/* 00007DE0 */ 0x14, 0x61, 0x16, 0x13, 0x00, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, +/* 00007DF0 */ 0x01, 0x05, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, +/* 00007E00 */ 0x13, 0x00, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x02, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, +/* 00007E10 */ 0x16, 0x13, 0x01, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x00, 0x00, 0x61, 0x16, 0x13, +/* 00007E20 */ 0x02, 0x14, 0x03, 0x00, 0x16, 0x04, 0x09, 0x70, 0x00, 0x8E, 0x03, 0x09, 0x17, 0x6C, 0x16, 0x17, +/* 00007E30 */ 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, +/* 00007E40 */ 0x1F, 0x03, 0x16, 0x16, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x22, 0x00, 0x8E, +/* 00007E50 */ 0x03, 0x14, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x13, 0x17, 0x07, 0x02, 0x00, +/* 00007E60 */ 0x5C, 0x01, 0x06, 0xC2, 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x09, 0x25, +/* 00007E70 */ 0x00, 0x8E, 0x03, 0x0C, 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x23, 0x17, 0x5C, +/* 00007E80 */ 0x01, 0x17, 0x5C, 0x02, 0x12, 0x97, 0x17, 0x14, 0x07, 0x5C, 0x03, 0x17, 0x5C, 0x04, 0x08, 0x1F, +/* 00007E90 */ 0x05, 0x16, 0x16, 0x47, 0x12, 0x16, 0x09, 0x79, 0x00, 0x61, 0x16, 0x13, 0x02, 0x14, 0x03, 0x00, +/* 00007EA0 */ 0x16, 0x09, 0x09, 0x6D, 0x00, 0x8E, 0x03, 0x09, 0x17, 0x6C, 0x16, 0x17, 0x03, 0x07, 0x03, 0x00, +/* 00007EB0 */ 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x12, 0xE0, 0x18, 0x01, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x16, 0x16, +/* 00007EC0 */ 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x22, 0x00, 0x8E, 0x03, 0x14, 0x16, 0x07, +/* 00007ED0 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x13, 0x17, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x06, 0xC2, +/* 00007EE0 */ 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x09, 0x25, 0x00, 0x8E, 0x03, 0x0C, +/* 00007EF0 */ 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x03, 0x23, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, +/* 00007F00 */ 0x12, 0x97, 0x17, 0x14, 0x07, 0x5C, 0x03, 0x17, 0x5C, 0x04, 0x0A, 0x1F, 0x05, 0x16, 0x16, 0x47, +/* 00007F10 */ 0x12, 0x16, 0x61, 0x16, 0x13, 0x04, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x3B, 0x00, +/* 00007F20 */ 0x61, 0x16, 0x13, 0x04, 0x15, 0x03, 0x00, 0x16, 0x04, 0x09, 0x2F, 0x00, 0x61, 0x16, 0x13, 0x04, +/* 00007F30 */ 0x15, 0x03, 0x00, 0x16, 0x0B, 0x09, 0x23, 0x00, 0x8E, 0x01, 0x05, 0x16, 0x4B, 0x16, 0x07, 0x04, +/* 00007F40 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5C, 0x03, +/* 00007F50 */ 0x0C, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x09, 0x2E, 0x00, 0x61, 0x16, 0x13, 0x04, 0xA8, +/* 00007F60 */ 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, +/* 00007F70 */ 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x04, 0x5C, 0x02, 0x17, 0x5C, +/* 00007F80 */ 0x03, 0x0C, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x05, 0xA8, 0x17, 0x15, +/* 00007F90 */ 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, +/* 00007FA0 */ 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x05, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0D, +/* 00007FB0 */ 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x06, 0xA8, 0x17, 0x15, 0x03, 0x00, +/* 00007FC0 */ 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 00007FD0 */ 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, 0x13, 0x06, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0E, 0x1F, 0x04, +/* 00007FE0 */ 0x16, 0x16, 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x07, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, +/* 00007FF0 */ 0x09, 0x20, 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 00008000 */ 0x01, 0x12, 0x61, 0x17, 0x13, 0x07, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0x16, 0x16, +/* 00008010 */ 0x47, 0x12, 0x16, 0x61, 0x16, 0x13, 0x08, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, +/* 00008020 */ 0x00, 0x8E, 0x01, 0x06, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, +/* 00008030 */ 0x61, 0x17, 0x13, 0x08, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x10, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, +/* 00008040 */ 0x16, 0x61, 0x16, 0x13, 0x09, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x20, 0x00, 0x8E, +/* 00008050 */ 0x01, 0x05, 0x16, 0x4B, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x12, 0x61, 0x17, +/* 00008060 */ 0x13, 0x09, 0x5C, 0x02, 0x17, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0x16, 0x16, 0x47, 0x12, 0x16, 0x47, +/* 00008070 */ 0x00, 0x12, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x88, 0x02, 0xFE, 0x8F, 0x02, 0xFE, +/* 00008080 */ 0x89, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x8A, 0x02, 0xFE, 0x8B, 0x02, 0xFE, 0x8D, 0x02, 0xFE, 0x8C, +/* 00008090 */ 0x02, 0xFE, 0x8E, 0x02, 0xFE, 0x91, 0x02, 0x1C, 0xFE, 0x4F, 0x04, 0x00, 0x1C, 0xFE, 0x4F, 0x04, +/* 000080A0 */ 0x00, 0xFF, 0xDE, 0x0A, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x20, +/* 000080B0 */ 0x00, 0x88, 0x00, 0x0E, 0x00, 0x8E, 0x01, 0x0C, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x6B, 0x00, 0x08, +/* 000080C0 */ 0x00, 0x2E, 0x00, 0x22, 0x00, 0x91, 0x00, 0x28, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x1E, +/* 000080D0 */ 0x00, 0x6B, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x22, 0x00, 0x91, 0x00, 0x25, 0x00, 0x2F, 0x01, 0x26, +/* 000080E0 */ 0x00, 0x90, 0x00, 0x23, 0x00, 0x76, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x20, 0x00, 0x8B, 0x00, 0x0E, +/* 000080F0 */ 0x00, 0x3E, 0x00, 0x20, 0x00, 0x87, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x89, 0x00, 0x0E, +/* 00008100 */ 0x00, 0x41, 0x00, 0x20, 0x00, 0x8D, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x20, 0x00, 0x8D, 0x00, 0x0E, +/* 00008110 */ 0x00, 0x47, 0x00, 0x20, 0x00, 0x8C, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, +/* 00008120 */ 0x01, 0xC4, 0x00, 0xFE, 0x61, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x20, 0x04, 0x44, 0xFF, +/* 00008130 */ 0x27, 0x05, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFF, 0x27, 0x05, 0x01, 0x00, +/* 00008140 */ 0xFE, 0xF8, 0x04, 0xFE, 0xF8, 0x04, 0x01, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x06, 0x01, +/* 00008150 */ 0x01, 0x01, 0x01, 0x15, 0x05, 0xFE, 0x3A, 0x04, 0x05, 0xFE, 0x45, 0x04, 0x08, 0x07, 0x05, 0xFE, +/* 00008160 */ 0x46, 0x04, 0x05, 0xFE, 0x3D, 0x04, 0x05, 0xFE, 0x3E, 0x04, 0x05, 0xFE, 0x30, 0x04, 0x01, 0x00, +/* 00008170 */ 0x06, 0xFE, 0x40, 0x04, 0x01, 0x01, 0x05, 0xFE, 0x47, 0x04, 0x01, 0x02, 0x05, 0xFE, 0x48, 0x04, +/* 00008180 */ 0x05, 0xFE, 0x49, 0x04, 0xEA, 0x8E, 0x03, 0x09, 0x17, 0x6C, 0x16, 0x17, 0x00, 0x07, 0x03, 0x00, +/* 00008190 */ 0x5C, 0x00, 0x17, 0x5C, 0x01, 0x11, 0x8E, 0x03, 0x0F, 0x18, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, +/* 000081A0 */ 0xFB, 0x19, 0x02, 0x13, 0x03, 0x5C, 0x01, 0x19, 0x1F, 0x02, 0x18, 0x18, 0x5C, 0x02, 0x18, 0x1F, +/* 000081B0 */ 0x03, 0x16, 0x16, 0x47, 0x14, 0x16, 0x14, 0x03, 0x00, 0x14, 0x05, 0x09, 0x34, 0x00, 0x8E, 0x03, +/* 000081C0 */ 0x14, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x13, 0x17, 0x07, 0x02, 0x00, 0xFC, +/* 000081D0 */ 0x18, 0x06, 0x11, 0x06, 0xFE, 0x18, 0x07, 0x02, 0x02, 0xFE, 0x18, 0x13, 0x08, 0x04, 0x5C, 0x01, +/* 000081E0 */ 0x18, 0xC2, 0x02, 0x17, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0xFF, 0x16, 0x47, 0x00, 0x11, 0x09, +/* 000081F0 */ 0x7B, 0x00, 0x14, 0x03, 0x00, 0x12, 0x09, 0x09, 0x31, 0x00, 0x8E, 0x03, 0x0C, 0x16, 0x07, 0x05, +/* 00008200 */ 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x23, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x97, 0x17, +/* 00008210 */ 0x14, 0x0A, 0x5C, 0x03, 0x17, 0x97, 0x17, 0x14, 0x0C, 0xFB, 0x17, 0x0B, 0x17, 0x0D, 0x5C, 0x04, +/* 00008220 */ 0x17, 0x1F, 0x05, 0x00, 0x16, 0x09, 0x45, 0x00, 0x09, 0x3A, 0x00, 0x97, 0x16, 0x14, 0x0E, 0x15, +/* 00008230 */ 0x03, 0x00, 0x16, 0x0F, 0x09, 0x2E, 0x00, 0x8E, 0x03, 0x0C, 0x16, 0x07, 0x05, 0x00, 0x5C, 0x00, +/* 00008240 */ 0x04, 0x8E, 0x03, 0x23, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x11, 0x97, 0x17, 0x14, 0x0A, 0x5C, +/* 00008250 */ 0x03, 0x17, 0x97, 0x17, 0x14, 0x0C, 0xFB, 0x17, 0x0B, 0x17, 0x10, 0x5C, 0x04, 0x17, 0x1F, 0x05, +/* 00008260 */ 0x00, 0x16, 0x09, 0x08, 0x00, 0x47, 0x00, 0x11, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 00008270 */ 0x39, 0x02, 0xFF, 0x4E, 0x06, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x91, 0x00, +/* 00008280 */ 0x08, 0x00, 0x2A, 0x00, 0x2E, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x08, 0x00, 0x33, 0x00, +/* 00008290 */ 0x31, 0x00, 0x81, 0x00, 0x0C, 0x00, 0x32, 0x00, 0x2E, 0x00, 0x8A, 0x00, 0x08, 0x00, 0x22, 0x00, +/* 000082A0 */ 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x50, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, +/* 000082B0 */ 0xFE, 0x1F, 0x04, 0x43, 0xFE, 0xF9, 0xFF, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xF9, +/* 000082C0 */ 0xFF, 0xFE, 0x20, 0x05, 0xFE, 0x20, 0x05, 0x01, 0x09, 0x14, 0x19, 0x07, 0x50, 0x4B, 0x03, 0x06, +/* 000082D0 */ 0x01, 0x01, 0x01, 0x01, 0x18, 0x05, 0xFE, 0x3A, 0x04, 0x05, 0xFE, 0x3B, 0x04, 0x08, 0x07, 0x05, +/* 000082E0 */ 0xFE, 0x3C, 0x04, 0x05, 0xFE, 0x3D, 0x04, 0x05, 0xFE, 0x3E, 0x04, 0x01, 0x02, 0x05, 0xFE, 0x3F, +/* 000082F0 */ 0x04, 0x05, 0xFE, 0x2E, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x40, 0x04, 0x01, 0x01, 0x06, 0xFE, 0x41, +/* 00008300 */ 0x04, 0x06, 0xFE, 0x42, 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x43, 0x04, 0x05, 0xFE, 0x44, +/* 00008310 */ 0x04, 0xFE, 0x19, 0x01, 0x8E, 0x03, 0x09, 0x1A, 0x6C, 0x19, 0x1A, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 00008320 */ 0x00, 0x1A, 0x5C, 0x01, 0x14, 0x8E, 0x03, 0x0F, 0x1B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0xFB, +/* 00008330 */ 0x1C, 0x02, 0x16, 0x03, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1B, 0x1B, 0x5C, 0x02, 0x1B, 0x1F, 0x03, +/* 00008340 */ 0x19, 0x19, 0x47, 0x17, 0x19, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x34, 0x00, 0x8E, 0x03, 0x14, +/* 00008350 */ 0x19, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x13, 0x1A, 0x07, 0x02, 0x00, 0xFC, 0x1B, +/* 00008360 */ 0x06, 0x14, 0x06, 0xFE, 0x1B, 0x07, 0x02, 0x02, 0xFE, 0x1B, 0x16, 0x08, 0x04, 0x5C, 0x01, 0x1B, +/* 00008370 */ 0xC2, 0x02, 0x1A, 0x1A, 0x5C, 0x01, 0x1A, 0x1F, 0x02, 0xFF, 0x19, 0x47, 0x00, 0x14, 0x09, 0xAA, +/* 00008380 */ 0x00, 0x97, 0x19, 0x17, 0x09, 0x15, 0x03, 0x00, 0x19, 0x0A, 0x09, 0x44, 0x00, 0x14, 0x03, 0x00, +/* 00008390 */ 0x15, 0x0B, 0x09, 0x3C, 0x00, 0x8E, 0x03, 0x0C, 0x19, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x8E, +/* 000083A0 */ 0x03, 0x23, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x97, 0x1A, 0x17, 0x0C, 0x5C, 0x03, 0x1A, +/* 000083B0 */ 0x97, 0x1A, 0x17, 0x0E, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, 0x2F, 0x1A, 0x1A, 0x0A, +/* 000083C0 */ 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0x00, 0x19, 0x09, 0x5D, 0x00, 0x09, 0x52, +/* 000083D0 */ 0x00, 0x15, 0x03, 0x00, 0x15, 0x0B, 0x09, 0x4A, 0x00, 0x8E, 0x03, 0x0C, 0x19, 0x07, 0x05, 0x00, +/* 000083E0 */ 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x23, 0x1A, 0x5C, 0x01, 0x1A, 0x5C, 0x02, 0x14, 0x97, 0x1A, 0x17, +/* 000083F0 */ 0x0C, 0x5C, 0x03, 0x1A, 0x97, 0x1A, 0x17, 0x0E, 0x2F, 0x1A, 0x0D, 0x1A, 0x2F, 0x1A, 0x1A, 0x0F, +/* 00008400 */ 0x14, 0x03, 0x00, 0x15, 0x11, 0x09, 0x06, 0x00, 0x47, 0x1B, 0x12, 0x09, 0x03, 0x00, 0x47, 0x1B, +/* 00008410 */ 0x13, 0x2F, 0x1A, 0x1A, 0x1B, 0x2F, 0x1A, 0x1A, 0x10, 0x5C, 0x04, 0x1A, 0x1F, 0x05, 0x00, 0x19, +/* 00008420 */ 0x09, 0x08, 0x00, 0x47, 0x00, 0x14, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, +/* 00008430 */ 0xFF, 0xCF, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x0F, 0x01, 0x08, 0x00, +/* 00008440 */ 0x2A, 0x00, 0x2E, 0x00, 0xF5, 0x00, 0x06, 0x00, 0x39, 0x00, 0x14, 0x00, 0x47, 0x00, 0x3C, 0x00, +/* 00008450 */ 0x85, 0x00, 0x08, 0x00, 0x30, 0x00, 0x4A, 0x00, 0xC4, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0xBF, +/* 00008460 */ 0x4C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x47, 0x05, 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1E, +/* 00008470 */ 0x04, 0x42, 0xFE, 0x92, 0xFE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x92, 0xFE, 0xE9, +/* 00008480 */ 0xE9, 0x01, 0x03, 0x05, 0x07, 0x0E, 0x0B, 0x03, 0x01, 0x06, 0x06, 0xFE, 0x72, 0x03, 0x06, 0xFE, +/* 00008490 */ 0x0A, 0x03, 0x05, 0xFE, 0xFD, 0x03, 0x2A, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, +/* 000084A0 */ 0x06, 0x00, 0x47, 0x00, 0x03, 0x09, 0x17, 0x00, 0x8E, 0x02, 0x02, 0x07, 0x97, 0x07, 0x07, 0x05, +/* 000084B0 */ 0x47, 0x00, 0x07, 0x0F, 0x03, 0x00, 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 000084C0 */ 0x00, 0xFE, 0xCD, 0xFE, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x06, 0x00, 0x2E, +/* 000084D0 */ 0x00, 0x17, 0x00, 0x44, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0x07, 0x05, +/* 000084E0 */ 0x0C, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1D, 0x04, 0x40, 0xFE, 0x1A, 0xF3, 0x01, 0xFF, 0x00, 0x10, +/* 000084F0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x1A, 0xF3, 0xFE, 0x95, 0x09, 0xFE, 0x95, 0x09, 0x02, 0x06, 0x17, +/* 00008500 */ 0x1B, 0x05, 0xCC, 0xCA, 0x03, 0x07, 0x05, 0x05, 0x05, 0x05, 0x18, 0x19, 0x1A, 0x05, 0xFE, 0x2B, +/* 00008510 */ 0x04, 0x05, 0xFE, 0x2C, 0x04, 0x05, 0xFE, 0x2D, 0x04, 0x08, 0x05, 0xFE, 0x2E, 0x04, 0x05, 0xFE, +/* 00008520 */ 0x2F, 0x04, 0x05, 0xFE, 0x30, 0x04, 0x05, 0xFE, 0x31, 0x04, 0x06, 0xFE, 0xC9, 0x03, 0x05, 0xFE, +/* 00008530 */ 0x32, 0x04, 0x05, 0xFE, 0x33, 0x04, 0x05, 0xFE, 0x34, 0x04, 0x05, 0xFE, 0x35, 0x04, 0x06, 0xFE, +/* 00008540 */ 0x27, 0x04, 0x05, 0xFE, 0x36, 0x04, 0x05, 0xFE, 0x37, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, 0xFE, +/* 00008550 */ 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0x01, 0x00, 0x06, 0xFE, 0x38, 0x04, 0xFE, 0xB7, 0x02, 0x96, +/* 00008560 */ 0x03, 0x17, 0xCD, 0x1B, 0x00, 0x96, 0x02, 0x1B, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x0F, +/* 00008570 */ 0x03, 0x00, 0x1B, 0x09, 0x6C, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x14, 0x12, 0x00, +/* 00008580 */ 0x1B, 0x02, 0x09, 0x00, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, +/* 00008590 */ 0x03, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, +/* 000085A0 */ 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x04, 0x1F, 0x04, +/* 000085B0 */ 0xFF, 0x1B, 0x09, 0x2D, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x00, 0x14, 0x03, 0x00, 0x1B, +/* 000085C0 */ 0x06, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, +/* 000085D0 */ 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x07, 0x1F, 0x04, +/* 000085E0 */ 0xFF, 0x1B, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x01, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x5D, 0x00, +/* 000085F0 */ 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x08, 0x09, 0x21, 0x00, 0x8E, +/* 00008600 */ 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, +/* 00008610 */ 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x2D, 0x00, +/* 00008620 */ 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x1E, 0x00, 0x8E, +/* 00008630 */ 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, +/* 00008640 */ 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0B, 0x1F, 0x04, 0xFF, 0x1B, 0x92, 0x03, 0x1B, +/* 00008650 */ 0x61, 0x1B, 0x1B, 0x02, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0xAB, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, +/* 00008660 */ 0x1B, 0x02, 0x14, 0x12, 0x00, 0x1B, 0x08, 0x09, 0x00, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, +/* 00008670 */ 0x02, 0x14, 0x03, 0x00, 0x1B, 0x0A, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, +/* 00008680 */ 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, +/* 00008690 */ 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x6C, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, +/* 000086A0 */ 0x02, 0x14, 0x12, 0x00, 0x1B, 0x03, 0x09, 0x00, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x02, +/* 000086B0 */ 0x14, 0x03, 0x00, 0x1B, 0x02, 0x09, 0x21, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, +/* 000086C0 */ 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, +/* 000086D0 */ 0x03, 0x0D, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x2D, 0x00, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x02, +/* 000086E0 */ 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, +/* 000086F0 */ 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, +/* 00008700 */ 0x03, 0x0E, 0x1F, 0x04, 0xFF, 0x1B, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x03, 0x0F, 0x03, 0x00, +/* 00008710 */ 0x1B, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, +/* 00008720 */ 0x1E, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x0F, 0x1F, 0x04, +/* 00008730 */ 0xFF, 0x1B, 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x0F, 0x03, 0x00, 0x1B, 0x09, 0x5D, 0x00, +/* 00008740 */ 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x03, 0x09, 0x21, 0x00, 0x8E, +/* 00008750 */ 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, +/* 00008760 */ 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x10, 0x1F, 0x04, 0xFF, 0x1B, 0x09, 0x2D, 0x00, +/* 00008770 */ 0x92, 0x03, 0x1B, 0x61, 0x1B, 0x1B, 0x04, 0x14, 0x03, 0x00, 0x1B, 0x06, 0x09, 0x1E, 0x00, 0x8E, +/* 00008780 */ 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1E, 0x1C, 0x5C, 0x01, 0x1C, +/* 00008790 */ 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x1B, 0x8E, 0x03, 0x0C, +/* 000087A0 */ 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x03, 0x1C, 0x1C, 0x5C, 0x01, 0x1C, 0xCD, 0x1C, +/* 000087B0 */ 0x03, 0xA1, 0x00, 0x12, 0x1C, 0xA1, 0x01, 0x13, 0x1C, 0xA1, 0x02, 0x14, 0x1C, 0x5C, 0x02, 0x1C, +/* 000087C0 */ 0xD4, 0x00, 0x1C, 0x5C, 0x03, 0x1C, 0x1F, 0x04, 0xFF, 0x1B, 0x8E, 0x03, 0x0B, 0x1B, 0x07, 0x02, +/* 000087D0 */ 0x00, 0x5C, 0x00, 0x05, 0x92, 0x02, 0x1C, 0x5C, 0x01, 0x1C, 0x1F, 0x02, 0x1B, 0x1B, 0x11, 0x03, +/* 000087E0 */ 0x00, 0x1B, 0x15, 0x09, 0x24, 0x00, 0x8E, 0x03, 0x0C, 0x1B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, +/* 000087F0 */ 0x8E, 0x03, 0x1F, 0x1C, 0x5C, 0x01, 0x1C, 0x92, 0x02, 0x1C, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x16, +/* 00008800 */ 0x1F, 0x04, 0x1B, 0x1B, 0x47, 0x00, 0x1B, 0x09, 0x05, 0x00, 0xA8, 0x1B, 0x47, 0x00, 0x1B, 0x09, +/* 00008810 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, 0xFE, +/* 00008820 */ 0x80, 0x02, 0xFE, 0x86, 0x02, 0xFE, 0x39, 0x04, 0xFE, 0xFD, 0x01, 0xFE, 0x5B, 0xF3, 0x1C, 0x03, +/* 00008830 */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x24, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x1E, 0x00, 0x5B, 0x00, 0x21, +/* 00008840 */ 0x00, 0x63, 0x00, 0x0F, 0x00, 0x3A, 0x00, 0x1E, 0x00, 0xA5, 0x00, 0x0E, 0x00, 0x28, 0x00, 0x0F, +/* 00008850 */ 0x00, 0x3A, 0x00, 0x21, 0x00, 0x5E, 0x00, 0x0F, 0x00, 0x3A, 0x00, 0x1E, 0x00, 0x75, 0x00, 0x0E, +/* 00008860 */ 0x00, 0x29, 0x00, 0x1E, 0x00, 0x5A, 0x00, 0x21, 0x00, 0x5A, 0x00, 0x1E, 0x00, 0x57, 0x00, 0x21, +/* 00008870 */ 0x00, 0x5F, 0x00, 0x0F, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x76, 0x00, 0x0E, 0x00, 0x27, 0x00, 0x1E, +/* 00008880 */ 0x00, 0x59, 0x00, 0x0E, 0x00, 0x30, 0x00, 0x0F, 0x00, 0x40, 0x00, 0x21, 0x00, 0x62, 0x00, 0x0F, +/* 00008890 */ 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x79, 0x00, 0x2D, 0x00, 0x3B, 0x01, 0x4A, 0x00, 0x72, 0x00, 0x00, +/* 000088A0 */ 0xA4, 0x88, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x31, 0x05, 0x55, 0xA2, +/* 000088B0 */ 0x41, 0xD1, 0x00, 0x41, 0xFE, 0x46, 0xFB, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x46, +/* 000088C0 */ 0xFB, 0xAC, 0xAC, 0x41, 0x04, 0x03, 0x05, 0x05, 0x10, 0x10, 0x04, 0x04, 0x04, 0x08, 0x32, 0x8E, +/* 000088D0 */ 0x01, 0x03, 0x05, 0x97, 0x05, 0x05, 0x03, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x1F, 0x00, 0x8E, 0x04, +/* 000088E0 */ 0x0C, 0x05, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x04, 0x1E, 0x06, 0x5C, 0x01, 0x06, 0x8E, +/* 000088F0 */ 0x01, 0x02, 0x06, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0xFF, 0x05, 0xA8, 0x00, 0x24, +/* 00008900 */ 0x00, 0xFE, 0x6B, 0xFB, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x2C, 0x00, 0x21, 0x00, 0x5A, +/* 00008910 */ 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x09, 0xC4, 0x10, 0xFE, 0xD4, 0x04, 0x0C, 0xA3, 0x41, 0xC1, +/* 00008920 */ 0x00, 0xFE, 0x1C, 0x04, 0x3F, 0xFE, 0x61, 0xE9, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, +/* 00008930 */ 0x61, 0xE9, 0xFE, 0x21, 0x09, 0xFE, 0x21, 0x09, 0x01, 0x07, 0x15, 0x1A, 0x05, 0x93, 0x8D, 0x03, +/* 00008940 */ 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x19, 0x07, 0x08, 0x0B, 0x06, 0xFE, 0x15, 0x04, 0x05, 0xFE, +/* 00008950 */ 0x12, 0x04, 0x0C, 0x05, 0xFE, 0x17, 0x04, 0x06, 0xFE, 0x13, 0x04, 0x06, 0xFE, 0x25, 0x04, 0x06, +/* 00008960 */ 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0x12, 0x03, 0x06, 0xFE, 0x13, 0x03, 0x06, +/* 00008970 */ 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x26, 0x04, 0x06, 0xFE, 0x27, 0x04, 0x06, 0xFE, 0x28, 0x04, 0x06, +/* 00008980 */ 0xFE, 0x29, 0x04, 0x06, 0xFE, 0x2A, 0x04, 0xFE, 0x39, 0x02, 0xA8, 0x1A, 0x14, 0x03, 0x00, 0x15, +/* 00008990 */ 0x1A, 0x09, 0x1C, 0x00, 0x8E, 0x03, 0x0A, 0x1A, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x1B, +/* 000089A0 */ 0x5C, 0x01, 0x1B, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x1A, 0x1A, 0x47, 0x15, 0x1A, 0x09, 0x18, 0x00, +/* 000089B0 */ 0x8E, 0x03, 0x31, 0x1B, 0x6C, 0x1A, 0x1B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, +/* 000089C0 */ 0x15, 0x1F, 0x02, 0x1A, 0x1A, 0x47, 0x15, 0x1A, 0x47, 0x18, 0x04, 0x14, 0x0B, 0x00, 0x16, 0x05, +/* 000089D0 */ 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x16, 0x06, 0x09, 0x3B, 0x00, 0x61, 0x1A, 0x15, 0x01, 0xA8, +/* 000089E0 */ 0x1B, 0x15, 0x2D, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x02, 0xA8, 0x1B, 0x15, +/* 000089F0 */ 0x1F, 0x00, 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x03, 0xA8, 0x1B, 0x15, 0x11, 0x00, +/* 00008A00 */ 0x1A, 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x04, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, +/* 00008A10 */ 0x09, 0x03, 0x00, 0x47, 0x18, 0x07, 0x14, 0x0B, 0x00, 0x16, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, +/* 00008A20 */ 0x00, 0x16, 0x06, 0x09, 0x2D, 0x00, 0x61, 0x1A, 0x15, 0x05, 0xA8, 0x1B, 0x15, 0x1F, 0x00, 0x1A, +/* 00008A30 */ 0x1B, 0x09, 0x00, 0x00, 0x61, 0x1A, 0x15, 0x06, 0xA8, 0x1B, 0x15, 0x11, 0x00, 0x1A, 0x1B, 0x09, +/* 00008A40 */ 0x00, 0x00, 0x61, 0x1A, 0x15, 0x07, 0xA8, 0x1B, 0x15, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x03, 0x00, +/* 00008A50 */ 0x47, 0x18, 0x07, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xAC, 0x00, 0x14, 0x0B, 0x00, 0x17, 0x05, 0x09, +/* 00008A60 */ 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0x9C, 0x00, 0x8E, 0x03, 0x1B, 0x1A, 0x07, 0x04, +/* 00008A70 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x0A, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00008A80 */ 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, +/* 00008A90 */ 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x8E, 0x03, +/* 00008AA0 */ 0x1B, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x10, 0xCC, 0x18, +/* 00008AB0 */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, +/* 00008AC0 */ 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, +/* 00008AD0 */ 0xFF, 0x1A, 0x8E, 0x03, 0x1B, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, +/* 00008AE0 */ 0x02, 0x11, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, +/* 00008AF0 */ 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, +/* 00008B00 */ 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x0F, 0x03, 0x00, 0x18, 0x09, 0xAC, 0x00, 0x14, 0x0B, 0x00, +/* 00008B10 */ 0x17, 0x08, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x17, 0x09, 0x09, 0x9C, 0x00, 0x8E, 0x03, 0x1B, +/* 00008B20 */ 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, 0x12, 0xCC, 0x48, 0x00, +/* 00008B30 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, +/* 00008B40 */ 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, +/* 00008B50 */ 0x1A, 0x8E, 0x03, 0x1B, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x15, 0x5C, 0x02, +/* 00008B60 */ 0x13, 0xCC, 0x60, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x7A, 0x0C, +/* 00008B70 */ 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, 0x1B, 0x0B, 0x5C, 0x03, +/* 00008B80 */ 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x8E, 0x03, 0x1B, 0x1A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 00008B90 */ 0x01, 0x15, 0x5C, 0x02, 0x14, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1B, 0x00, +/* 00008BA0 */ 0x00, 0x00, 0x7A, 0x0C, 0x1B, 0x08, 0x7A, 0x04, 0x1B, 0x09, 0x7A, 0x04, 0x1B, 0x0A, 0x7A, 0x04, +/* 00008BB0 */ 0x1B, 0x0B, 0x5C, 0x03, 0x1B, 0x1F, 0x04, 0xFF, 0x1A, 0x47, 0x00, 0x15, 0x09, 0x02, 0x00, 0xA8, +/* 00008BC0 */ 0x00, 0x24, 0x00, 0x06, 0x90, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00008BD0 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00008BE0 */ 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00008BF0 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x48, 0x00, +/* 00008C00 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 00008C10 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 00008C20 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00008C30 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00008C40 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00008C50 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00008C60 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0x66, +/* 00008C70 */ 0x03, 0xFE, 0x7D, 0x02, 0xFE, 0x7E, 0x02, 0xFE, 0x7F, 0x02, 0xFE, 0x80, 0x02, 0xFE, 0x82, 0x02, +/* 00008C80 */ 0xFE, 0x81, 0x02, 0xFE, 0x83, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, +/* 00008C90 */ 0xB4, 0x01, 0xFE, 0xAB, 0xE9, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x1C, 0x00, +/* 00008CA0 */ 0x4F, 0x00, 0x18, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x10, 0x00, 0x45, 0x00, 0x38, 0x00, +/* 00008CB0 */ 0x97, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x45, 0x00, 0x2A, 0x00, 0x7A, 0x00, 0x03, 0x00, +/* 00008CC0 */ 0x4F, 0x00, 0x17, 0x00, 0x57, 0x00, 0x34, 0x00, 0xCB, 0x00, 0x34, 0x00, 0xCC, 0x00, 0x34, 0x00, +/* 00008CD0 */ 0xD8, 0x00, 0x17, 0x00, 0x57, 0x00, 0x34, 0x00, 0xCB, 0x00, 0x34, 0x00, 0xCD, 0x00, 0x34, 0x00, +/* 00008CE0 */ 0xDB, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0xA9, 0xD6, 0x92, 0xFE, 0xC7, +/* 00008CF0 */ 0x03, 0x18, 0xA0, 0x41, 0xD1, 0x00, 0x36, 0xFE, 0xF4, 0xB1, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00008D00 */ 0x01, 0x01, 0xFE, 0xF4, 0xB1, 0xFE, 0x78, 0x36, 0xFE, 0x78, 0x36, 0x03, 0x0D, 0x2D, 0x33, 0x09, +/* 00008D10 */ 0xC8, 0xC8, 0x01, 0x0A, 0x10, 0x10, 0x10, 0x10, 0x07, 0x02, 0x30, 0x31, 0x32, 0x33, 0x06, 0xFE, +/* 00008D20 */ 0xD6, 0x03, 0x01, 0x00, 0x06, 0xFE, 0xD7, 0x03, 0x06, 0xFE, 0xD8, 0x03, 0x01, 0x01, 0x06, 0xFE, +/* 00008D30 */ 0xD9, 0x03, 0x01, 0x02, 0x06, 0xFE, 0xF1, 0x02, 0x01, 0x03, 0x07, 0x08, 0x06, 0xFE, 0xDA, 0x03, +/* 00008D40 */ 0x06, 0xFE, 0xDB, 0x03, 0x06, 0xFE, 0xDC, 0x03, 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xDD, 0x03, +/* 00008D50 */ 0x05, 0xFE, 0xDE, 0x03, 0x05, 0xFE, 0xDF, 0x03, 0x05, 0xFE, 0xE0, 0x03, 0x06, 0xFE, 0xFA, 0x02, +/* 00008D60 */ 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0B, 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x5D, +/* 00008D70 */ 0x03, 0x06, 0xFE, 0xE1, 0x03, 0x05, 0xFE, 0xE2, 0x03, 0x05, 0xFE, 0xE3, 0x03, 0x05, 0xFE, 0xE4, +/* 00008D80 */ 0x03, 0x05, 0xFE, 0xE5, 0x03, 0x05, 0xFE, 0xE6, 0x03, 0x05, 0xFE, 0xE7, 0x03, 0x06, 0xFE, 0xE8, +/* 00008D90 */ 0x03, 0x06, 0xFE, 0xE9, 0x03, 0x05, 0xFE, 0xEA, 0x03, 0x06, 0xFE, 0xB4, 0x03, 0x0C, 0x06, 0xFE, +/* 00008DA0 */ 0x13, 0x03, 0x06, 0xFE, 0xB5, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, 0xEB, 0x03, 0x06, 0xFE, +/* 00008DB0 */ 0xB8, 0x03, 0x05, 0xFE, 0xEC, 0x03, 0xFE, 0x16, 0x03, 0xA8, 0x2D, 0xA8, 0x2E, 0xA8, 0x2F, 0x4F, +/* 00008DC0 */ 0x35, 0x96, 0x03, 0x35, 0x4F, 0x35, 0x96, 0x04, 0x35, 0x8E, 0x01, 0x0A, 0x35, 0x07, 0x03, 0x00, +/* 00008DD0 */ 0x5C, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, +/* 00008DE0 */ 0x7A, 0x03, 0x36, 0x00, 0x7A, 0x03, 0x36, 0x01, 0x7A, 0x06, 0x36, 0x02, 0x7A, 0x08, 0x36, 0x03, +/* 00008DF0 */ 0x7A, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x35, 0x35, 0x96, 0x03, +/* 00008E00 */ 0x35, 0x8E, 0x01, 0x0A, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0xCC, 0x1C, 0x00, 0x00, 0x00, +/* 00008E10 */ 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7A, 0x03, 0x36, 0x00, 0x7A, 0x03, 0x36, 0x05, +/* 00008E20 */ 0x7A, 0x06, 0x36, 0x06, 0x7A, 0x08, 0x36, 0x07, 0x7A, 0x0A, 0x36, 0x04, 0x5C, 0x01, 0x36, 0x5C, +/* 00008E30 */ 0x02, 0x0B, 0x1F, 0x03, 0x35, 0x35, 0x96, 0x04, 0x35, 0x8E, 0x01, 0x38, 0x35, 0x14, 0x0F, 0x00, +/* 00008E40 */ 0x35, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x38, 0x35, 0x14, 0x03, 0x00, 0x35, 0x11, 0x09, 0x75, +/* 00008E50 */ 0x02, 0xDE, 0x00, 0x03, 0x02, 0xB8, 0x35, 0x00, 0x01, 0x51, 0x01, 0x00, 0x2D, 0x35, 0x95, 0x00, +/* 00008E60 */ 0x02, 0x2D, 0x8E, 0x01, 0x09, 0x36, 0x6C, 0x35, 0x36, 0x08, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x36, +/* 00008E70 */ 0x8E, 0x01, 0x2A, 0x37, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x12, 0xB8, 0x39, 0x00, +/* 00008E80 */ 0x01, 0x51, 0x01, 0x01, 0x38, 0x39, 0x5C, 0x02, 0x38, 0x1F, 0x03, 0x37, 0x37, 0x5C, 0x01, 0x37, +/* 00008E90 */ 0x8E, 0x01, 0x3B, 0x37, 0x4B, 0x37, 0x61, 0x37, 0x37, 0x09, 0x5C, 0x02, 0x37, 0x1F, 0x03, 0xFF, +/* 00008EA0 */ 0x35, 0x8E, 0x01, 0x38, 0x35, 0x14, 0x03, 0x00, 0x35, 0x10, 0x09, 0x19, 0x02, 0xDE, 0x01, 0x04, +/* 00008EB0 */ 0x03, 0xB8, 0x35, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x35, 0x35, 0x01, 0x51, 0x01, 0x02, 0x2E, +/* 00008EC0 */ 0x35, 0x95, 0x01, 0x02, 0x2E, 0x01, 0x51, 0x01, 0x03, 0x2F, 0x35, 0x95, 0x01, 0x03, 0x2F, 0x8E, +/* 00008ED0 */ 0x01, 0x2A, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x13, 0x90, 0x01, 0x02, 0x36, +/* 00008EE0 */ 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, 0x01, 0x2A, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00008EF0 */ 0x0C, 0x5C, 0x01, 0x14, 0x90, 0x01, 0x03, 0x36, 0x5C, 0x02, 0x36, 0x1F, 0x03, 0xFF, 0x35, 0x8E, +/* 00008F00 */ 0x01, 0x1B, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, 0x5C, 0x01, 0x36, +/* 00008F10 */ 0x5C, 0x02, 0x15, 0xCC, 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, +/* 00008F20 */ 0x8E, 0x01, 0x48, 0x37, 0x4B, 0x37, 0x7A, 0x37, 0x36, 0x0A, 0x7A, 0x18, 0x36, 0x0B, 0x7A, 0x18, +/* 00008F30 */ 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0xCD, 0x35, 0x0B, 0xA1, 0x00, 0x1A, 0x35, +/* 00008F40 */ 0xA1, 0x01, 0x1B, 0x35, 0xA1, 0x02, 0x1C, 0x35, 0xA1, 0x03, 0x1D, 0x35, 0xA1, 0x04, 0x1E, 0x35, +/* 00008F50 */ 0xA1, 0x05, 0x1F, 0x35, 0xA1, 0x06, 0x20, 0x35, 0xA1, 0x07, 0x21, 0x35, 0xA1, 0x08, 0x22, 0x35, +/* 00008F60 */ 0xA1, 0x09, 0x23, 0x35, 0xA1, 0x0A, 0x24, 0x35, 0x96, 0x02, 0x35, 0x8E, 0x01, 0x1B, 0x35, 0x07, +/* 00008F70 */ 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x25, 0xCC, +/* 00008F80 */ 0x4C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x37, +/* 00008F90 */ 0x07, 0x01, 0x00, 0xC2, 0x01, 0x37, 0x37, 0x7A, 0x37, 0x36, 0x0A, 0x7A, 0x26, 0x36, 0x0B, 0x7A, +/* 00008FA0 */ 0x26, 0x36, 0x0D, 0x7A, 0x26, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x8E, 0x01, +/* 00008FB0 */ 0x0A, 0x35, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, 0x61, 0x36, 0x36, 0x0E, +/* 00008FC0 */ 0x5C, 0x01, 0x36, 0x8E, 0x01, 0x0E, 0x36, 0x61, 0x36, 0x36, 0x0E, 0x5C, 0x02, 0x36, 0x1F, 0x03, +/* 00008FD0 */ 0xFF, 0x35, 0x8E, 0x01, 0x1B, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, +/* 00008FE0 */ 0x61, 0x36, 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x28, 0xCC, 0x64, 0x00, 0x00, 0x00, 0x04, +/* 00008FF0 */ 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x37, 0x7A, 0x37, 0x36, 0x0A, 0x7A, +/* 00009000 */ 0x18, 0x36, 0x0B, 0x7A, 0x26, 0x36, 0x0D, 0x7A, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, 0x04, +/* 00009010 */ 0xFF, 0x35, 0x8E, 0x01, 0x1B, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, 0x36, +/* 00009020 */ 0x61, 0x36, 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x29, 0xCC, 0x7C, 0x00, 0x00, 0x00, 0x05, +/* 00009030 */ 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xB8, 0x38, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x38, +/* 00009040 */ 0x38, 0x01, 0x51, 0x01, 0x04, 0x37, 0x38, 0x7A, 0x37, 0x36, 0x0A, 0x01, 0x65, 0x01, 0x37, 0x36, +/* 00009050 */ 0x7A, 0x18, 0x36, 0x0B, 0x7A, 0x26, 0x36, 0x0D, 0x7A, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, +/* 00009060 */ 0x04, 0xFF, 0x35, 0x8E, 0x01, 0x1B, 0x35, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0C, 0x90, 0x01, 0x02, +/* 00009070 */ 0x36, 0x61, 0x36, 0x36, 0x0E, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x2A, 0xCC, 0x94, 0x00, 0x00, 0x00, +/* 00009080 */ 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x2A, 0x37, 0x07, 0x03, 0x00, 0x5C, +/* 00009090 */ 0x00, 0x0C, 0x5C, 0x01, 0x2C, 0xB8, 0x39, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x39, 0x39, 0x01, +/* 000090A0 */ 0x51, 0x01, 0x05, 0x38, 0x39, 0x5C, 0x02, 0x38, 0x1F, 0x03, 0x37, 0x37, 0x7A, 0x37, 0x36, 0x0F, +/* 000090B0 */ 0x7A, 0x26, 0x36, 0x0D, 0x7A, 0x18, 0x36, 0x0C, 0x5C, 0x03, 0x36, 0x1F, 0x04, 0xFF, 0x35, 0x90, +/* 000090C0 */ 0x01, 0x02, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x07, +/* 000090D0 */ 0xA8, 0x00, 0x94, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x01, +/* 000090E0 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 000090F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00009100 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00009110 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00009120 */ 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00009130 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x38, 0x00, +/* 00009140 */ 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 00009150 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, +/* 00009160 */ 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xDA, 0x03, 0x00, 0x00, 0xDB, 0x03, 0x00, 0x00, 0xDC, 0x03, +/* 00009170 */ 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, +/* 00009180 */ 0x00, 0x00, 0xD6, 0x03, 0x00, 0x00, 0xD7, 0x03, 0x00, 0x00, 0xD8, 0x03, 0x00, 0x00, 0xD9, 0x03, +/* 00009190 */ 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0xFE, 0xD6, 0x03, 0xFE, 0xD7, 0x03, 0xFE, 0xD8, 0x03, 0xFE, +/* 000091A0 */ 0xD9, 0x03, 0xFE, 0xF1, 0x02, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, 0xFE, 0xDC, 0x03, 0xFE, 0x34, +/* 000091B0 */ 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, +/* 000091C0 */ 0xFE, 0x48, 0x01, 0xFE, 0xB7, 0x01, 0xFE, 0xFD, 0x01, 0xFE, 0xED, 0x03, 0xFE, 0xEE, 0x03, 0x02, +/* 000091D0 */ 0x02, 0x01, 0x00, 0xFE, 0xEF, 0x03, 0x03, 0x02, 0x00, 0xFE, 0x1C, 0x02, 0x01, 0xFE, 0x1E, 0x02, +/* 000091E0 */ 0xFE, 0x59, 0xB2, 0x11, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x94, 0x01, 0x38, 0x00, 0x0B, 0x02, +/* 000091F0 */ 0x29, 0x00, 0x0A, 0x1C, 0x3F, 0x00, 0xD7, 0x02, 0x2E, 0x00, 0x5A, 0x04, 0x18, 0x00, 0x3B, 0x03, +/* 00009200 */ 0x18, 0x00, 0x52, 0x00, 0x3A, 0x00, 0x9B, 0x00, 0x32, 0x00, 0x1F, 0x01, 0x43, 0x00, 0x99, 0x00, +/* 00009210 */ 0x24, 0x00, 0x48, 0x00, 0x40, 0x00, 0x9E, 0x00, 0x51, 0x00, 0xC2, 0x04, 0x5C, 0x00, 0x16, 0x03, +/* 00009220 */ 0x07, 0x00, 0x84, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x34, 0x99, 0x00, 0x00, 0xF5, 0x97, 0x00, +/* 00009230 */ 0x00, 0x23, 0x96, 0x00, 0x00, 0xE2, 0x94, 0x00, 0x00, 0x24, 0x93, 0x00, 0x00, 0x41, 0x92, 0x00, +/* 00009240 */ 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xBB, 0x04, 0x39, 0xA0, 0x41, 0xD1, 0x00, +/* 00009250 */ 0x3D, 0xFE, 0x2D, 0xE5, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x2D, 0xE5, 0xFE, 0x56, +/* 00009260 */ 0x02, 0xFE, 0x56, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x01, 0x04, 0x04, 0x04, +/* 00009270 */ 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xF7, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x78, 0x5B, +/* 00009280 */ 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, 0x02, 0x09, 0x18, 0x00, 0x8E, +/* 00009290 */ 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, +/* 000092A0 */ 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, +/* 000092B0 */ 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x06, 0x08, 0xA8, +/* 000092C0 */ 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, 0x08, 0x06, 0x02, 0x0F, 0x1B, 0x00, +/* 000092D0 */ 0x08, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 000092E0 */ 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x61, 0x00, 0x06, 0x03, +/* 000092F0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, 0x02, +/* 00009300 */ 0xFE, 0x7A, 0x02, 0xFE, 0x53, 0xE5, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x18, +/* 00009310 */ 0x00, 0x84, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x69, 0x00, 0x18, 0x00, 0x84, 0x00, 0x09, +/* 00009320 */ 0x00, 0x37, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0x81, 0xC6, 0x02, 0xFE, 0xA5, 0x04, 0x1B, 0xA0, +/* 00009330 */ 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x3B, 0xFE, 0x56, 0xE0, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00009340 */ 0x01, 0x01, 0xFE, 0x56, 0xE0, 0xFE, 0x08, 0x04, 0xFE, 0x08, 0x04, 0x02, 0x06, 0x07, 0x0B, 0x05, +/* 00009350 */ 0x40, 0x40, 0x04, 0x07, 0x03, 0x03, 0x03, 0x03, 0x08, 0x09, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, +/* 00009360 */ 0xFE, 0xF8, 0x03, 0x06, 0xFE, 0x15, 0x03, 0x07, 0x08, 0xCE, 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x2C, +/* 00009370 */ 0x0B, 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, +/* 00009380 */ 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, +/* 00009390 */ 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, +/* 000093A0 */ 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x96, 0x02, 0x0B, 0x92, 0x02, 0x0B, 0xA8, 0x0C, 0x14, +/* 000093B0 */ 0x11, 0x00, 0x0B, 0x0C, 0x09, 0x00, 0x00, 0x92, 0x02, 0x0B, 0x61, 0x0B, 0x0B, 0x02, 0x0F, 0x1B, +/* 000093C0 */ 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, +/* 000093D0 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x0A, +/* 000093E0 */ 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x05, 0x1F, +/* 000093F0 */ 0x03, 0x0B, 0x0B, 0x96, 0x03, 0x0B, 0x8E, 0x04, 0x0C, 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, +/* 00009400 */ 0x8E, 0x04, 0x1C, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, 0x03, 0x02, 0x0C, 0x5C, 0x02, 0x0C, 0xD4, 0x00, +/* 00009410 */ 0x0C, 0x5C, 0x03, 0x0C, 0x1F, 0x04, 0xFF, 0x0B, 0x8E, 0x04, 0x0A, 0x0B, 0x07, 0x03, 0x00, 0x5C, +/* 00009420 */ 0x00, 0x06, 0x92, 0x03, 0x0C, 0x5C, 0x01, 0x0C, 0xCB, 0x0C, 0x5C, 0x02, 0x0C, 0x1F, 0x03, 0x00, +/* 00009430 */ 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, +/* 00009440 */ 0x02, 0xFE, 0xF9, 0x03, 0xFE, 0x1F, 0x02, 0xFE, 0x8B, 0xE0, 0x09, 0x05, 0x00, 0x00, 0x00, 0x0B, +/* 00009450 */ 0x00, 0x3C, 0x00, 0x18, 0x00, 0x8C, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x1B, 0x00, 0x69, 0x00, 0x18, +/* 00009460 */ 0x00, 0x8D, 0x00, 0x19, 0x00, 0x47, 0x00, 0x22, 0x00, 0x44, 0x01, 0x1E, 0x00, 0x3E, 0x00, 0x00, +/* 00009470 */ 0x74, 0x94, 0x00, 0x00, 0xBF, 0x4C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xB0, 0x04, 0x48, 0xA2, +/* 00009480 */ 0x41, 0xD1, 0x00, 0x3C, 0xFE, 0x0B, 0xE3, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0B, +/* 00009490 */ 0xE3, 0xF8, 0xF8, 0x41, 0x05, 0x04, 0x06, 0x0D, 0x0D, 0x05, 0x02, 0x05, 0x05, 0xFE, 0xFA, 0x03, +/* 000094A0 */ 0x06, 0xFE, 0x72, 0x03, 0x2C, 0x8E, 0x01, 0x02, 0x06, 0x2F, 0x07, 0x02, 0x04, 0x2D, 0x06, 0x06, +/* 000094B0 */ 0x07, 0x15, 0x03, 0x00, 0x06, 0x03, 0x09, 0x14, 0x00, 0x8E, 0x01, 0x03, 0x06, 0x8E, 0x01, 0x02, +/* 000094C0 */ 0x07, 0x2F, 0x08, 0x02, 0x04, 0x97, 0x07, 0x07, 0x08, 0x9C, 0x07, 0x06, 0x04, 0xA8, 0x00, 0x24, +/* 000094D0 */ 0x00, 0xFE, 0x3B, 0xE3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x5A, 0x00, 0x16, 0x00, 0x6D, +/* 000094E0 */ 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x89, 0x04, 0x10, 0xA3, 0x41, 0xC1, +/* 000094F0 */ 0x00, 0xFE, 0xEB, 0x03, 0x3A, 0xFE, 0x7A, 0xD9, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, +/* 00009500 */ 0x7A, 0xD9, 0xFE, 0xE3, 0x02, 0xFE, 0xE3, 0x02, 0x01, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, +/* 00009510 */ 0x03, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xF7, 0x03, 0x06, 0xFE, +/* 00009520 */ 0x15, 0x03, 0x01, 0x00, 0x08, 0xC9, 0x5B, 0x08, 0xB3, 0x08, 0x08, 0x8E, 0x04, 0x31, 0x0C, 0x6C, +/* 00009530 */ 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0B, 0x0B, +/* 00009540 */ 0x47, 0x07, 0x0B, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x04, +/* 00009550 */ 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, +/* 00009560 */ 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, +/* 00009570 */ 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, +/* 00009580 */ 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x61, 0x0B, 0x09, 0x03, 0x0F, 0x1B, 0x00, 0x0B, +/* 00009590 */ 0x09, 0x00, 0x00, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 000095A0 */ 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x04, 0x11, 0x0B, 0x07, +/* 000095B0 */ 0x02, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x04, 0x09, 0x0D, 0x6C, 0x0C, 0x0D, 0x04, 0x07, 0x03, 0x00, +/* 000095C0 */ 0x5C, 0x00, 0x0D, 0x2A, 0x0E, 0x05, 0x14, 0x03, 0x00, 0x07, 0x0E, 0x09, 0x06, 0x00, 0x47, 0x0E, +/* 000095D0 */ 0x05, 0x09, 0x03, 0x00, 0x47, 0x0E, 0x07, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x09, 0x1F, 0x03, 0x0C, +/* 000095E0 */ 0x0C, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 000095F0 */ 0x5E, 0x02, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0x2F, 0x02, 0xFE, 0xA3, +/* 00009600 */ 0xD9, 0x08, 0x05, 0x00, 0x00, 0x00, 0x18, 0x00, 0x2F, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x18, 0x00, +/* 00009610 */ 0x7C, 0x00, 0x18, 0x00, 0x47, 0x00, 0x15, 0x00, 0x65, 0x00, 0x18, 0x00, 0xD4, 0x00, 0x42, 0x00, +/* 00009620 */ 0x56, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x6D, 0x04, 0x10, 0xA3, 0x41, +/* 00009630 */ 0xC1, 0x00, 0xFE, 0x15, 0x03, 0x39, 0xFE, 0x04, 0xD5, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x01, +/* 00009640 */ 0xFE, 0x04, 0xD5, 0xFE, 0x1E, 0x04, 0xFE, 0x1E, 0x04, 0x01, 0x09, 0x05, 0x0B, 0x05, 0x62, 0x5B, +/* 00009650 */ 0x04, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x15, 0x03, 0x07, 0xFE, 0x3D, 0x01, +/* 00009660 */ 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, 0x05, 0x02, 0xA8, 0x0B, +/* 00009670 */ 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, 0x0B, 0x4F, 0x08, 0x4F, +/* 00009680 */ 0x09, 0x6A, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, 0x09, 0x00, 0x00, 0xA8, +/* 00009690 */ 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x16, 0x00, 0x8E, 0x01, 0x02, 0x0B, 0x4B, 0x0B, 0x07, +/* 000096A0 */ 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC2, 0x03, 0x00, 0x0B, 0x09, 0xEC, 0x00, 0x8E, +/* 000096B0 */ 0x04, 0x31, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x07, +/* 000096C0 */ 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x08, 0x0B, 0x8E, 0x04, 0x17, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 000096D0 */ 0x02, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x18, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, +/* 000096E0 */ 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, +/* 000096F0 */ 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, +/* 00009700 */ 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x03, +/* 00009710 */ 0x00, 0x09, 0x0B, 0x09, 0x31, 0x00, 0x8E, 0x04, 0x0A, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, +/* 00009720 */ 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x8E, +/* 00009730 */ 0x04, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, +/* 00009740 */ 0x5C, 0x02, 0x09, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x02, 0x02, 0x0B, 0x4B, 0x0B, 0x07, 0x04, 0x00, +/* 00009750 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, 0x1F, 0x04, 0xFF, 0x0B, +/* 00009760 */ 0x47, 0x0B, 0x09, 0x8E, 0x04, 0x0C, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x04, 0x20, +/* 00009770 */ 0x0D, 0x5C, 0x01, 0x0D, 0x8E, 0x01, 0x03, 0x0D, 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, +/* 00009780 */ 0x1F, 0x04, 0x0C, 0x0C, 0x76, 0x0C, 0x0B, 0x04, 0x61, 0x0B, 0x09, 0x05, 0x82, 0x0B, 0x0B, 0x2B, +/* 00009790 */ 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, +/* 000097A0 */ 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x7A, 0x02, 0xFE, 0x7A, 0x02, 0xDD, +/* 000097B0 */ 0xFE, 0x1A, 0xD5, 0x10, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x2B, 0x00, +/* 000097C0 */ 0x18, 0x00, 0x43, 0x00, 0x16, 0x00, 0x56, 0x00, 0x18, 0x00, 0x38, 0x00, 0x18, 0x00, 0x38, 0x00, +/* 000097D0 */ 0x15, 0x00, 0x9B, 0x00, 0x18, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x19, 0x00, 0x3F, 0x00, +/* 000097E0 */ 0x18, 0x00, 0x58, 0x00, 0x19, 0x00, 0x4D, 0x00, 0x28, 0x00, 0x65, 0x00, 0x0B, 0x00, 0x3D, 0x00, +/* 000097F0 */ 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x03, 0xC4, 0x00, 0xFE, 0x5F, 0x04, 0x62, +/* 00009800 */ 0xA0, 0x41, 0xF1, 0x00, 0x38, 0xFE, 0x58, 0xD2, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, +/* 00009810 */ 0x58, 0xD2, 0xFE, 0x44, 0x02, 0xFE, 0x44, 0x02, 0x03, 0x09, 0x09, 0x0E, 0x07, 0x40, 0x3C, 0x03, +/* 00009820 */ 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0x0D, 0x07, 0x06, 0xFE, 0x6E, 0x03, 0x05, 0xFE, 0xDE, 0x03, +/* 00009830 */ 0x06, 0xFE, 0xDD, 0x03, 0x08, 0x01, 0x00, 0x01, 0x01, 0xD0, 0xAE, 0x0B, 0x5B, 0x09, 0xB3, 0x09, +/* 00009840 */ 0x09, 0x2C, 0x0E, 0x09, 0x15, 0x03, 0x00, 0x0E, 0x03, 0x09, 0x28, 0x00, 0x8E, 0x03, 0x10, 0x0E, +/* 00009850 */ 0xE1, 0x0E, 0x09, 0x0E, 0x00, 0x0F, 0x1B, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x0F, +/* 00009860 */ 0x6C, 0x0E, 0x0F, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, +/* 00009870 */ 0x1F, 0x03, 0xFF, 0x0E, 0x8E, 0x03, 0x0A, 0x0E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0xCB, 0x0F, +/* 00009880 */ 0x5C, 0x01, 0x0F, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x0E, 0x0E, 0x47, 0x0A, 0x0E, 0x8E, 0x01, 0x02, +/* 00009890 */ 0x0E, 0x4B, 0x0E, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x0A, 0x97, 0x0F, 0x0B, 0x07, +/* 000098A0 */ 0x5C, 0x02, 0x0F, 0x97, 0x0F, 0x0B, 0x08, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0xFF, 0x0E, 0x8E, 0x03, +/* 000098B0 */ 0x31, 0x0F, 0x6C, 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, +/* 000098C0 */ 0x02, 0x0E, 0x0E, 0x47, 0x0C, 0x0E, 0x8E, 0x03, 0x11, 0x0E, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, +/* 000098D0 */ 0x8E, 0x03, 0x09, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x10, 0x2A, 0x11, +/* 000098E0 */ 0x07, 0x14, 0x03, 0x00, 0x0C, 0x11, 0x09, 0x06, 0x00, 0x47, 0x11, 0x07, 0x09, 0x03, 0x00, 0x47, +/* 000098F0 */ 0x11, 0x0C, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x1F, 0x03, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, 0x1F, +/* 00009900 */ 0x02, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x5E, 0x02, +/* 00009910 */ 0xFE, 0x2F, 0x02, 0xFE, 0x76, 0xD2, 0x07, 0x07, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x53, 0x00, 0x18, +/* 00009920 */ 0x00, 0x70, 0x00, 0x19, 0x00, 0x3A, 0x00, 0x21, 0x00, 0x52, 0x00, 0x18, 0x00, 0x85, 0x00, 0x42, +/* 00009930 */ 0x00, 0x51, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x21, 0xD4, 0x00, 0xFE, 0xD9, 0x03, 0x0C, 0xB3, +/* 00009940 */ 0x41, 0xC1, 0x00, 0xFE, 0xEF, 0x03, 0x37, 0xFE, 0x38, 0xB6, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, +/* 00009950 */ 0x04, 0xFE, 0x38, 0xB6, 0xFE, 0xBC, 0x1B, 0xFE, 0xBC, 0x1B, 0x45, 0x18, 0x23, 0x37, 0x07, 0xFE, +/* 00009960 */ 0x9B, 0x01, 0xFE, 0x7B, 0x01, 0x03, 0x12, 0x26, 0x26, 0x26, 0x26, 0x01, 0x36, 0x37, 0x06, 0xFE, +/* 00009970 */ 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, 0x08, 0x06, 0xFE, 0x15, 0x03, 0x0B, 0x06, 0xFE, 0x72, 0x03, +/* 00009980 */ 0x07, 0x06, 0xFE, 0xA2, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, +/* 00009990 */ 0x03, 0x05, 0xFE, 0xE2, 0x03, 0x05, 0xFE, 0xF0, 0x03, 0x05, 0xFE, 0xF1, 0x03, 0x05, 0xFE, 0xE3, +/* 000099A0 */ 0x03, 0x05, 0xFE, 0xE4, 0x03, 0x05, 0xFE, 0xF2, 0x03, 0x06, 0xFE, 0xF3, 0x03, 0x06, 0xFE, 0xF8, +/* 000099B0 */ 0x02, 0x05, 0xFE, 0xE5, 0x03, 0x01, 0x01, 0x01, 0x15, 0x06, 0xFE, 0xE8, 0x03, 0x06, 0xFE, 0xE9, +/* 000099C0 */ 0x03, 0x05, 0xFE, 0xEA, 0x03, 0x06, 0xFE, 0x6C, 0x03, 0x05, 0xFE, 0xF4, 0x03, 0x05, 0xFE, 0xE6, +/* 000099D0 */ 0x03, 0x01, 0x00, 0x01, 0x14, 0x01, 0x03, 0x05, 0xFE, 0xE7, 0x03, 0x05, 0xFE, 0xF5, 0x03, 0xFE, +/* 000099E0 */ 0x53, 0x05, 0x2C, 0x38, 0x23, 0x0D, 0x03, 0x00, 0x38, 0x02, 0x09, 0x12, 0x00, 0x8E, 0x03, 0x09, +/* 000099F0 */ 0x39, 0x6C, 0x38, 0x39, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, 0x8E, +/* 00009A00 */ 0x03, 0x0C, 0x38, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x19, 0x39, 0x5C, 0x01, 0x39, +/* 00009A10 */ 0x5C, 0x02, 0x23, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x38, 0x38, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x23, +/* 00009A20 */ 0x00, 0x61, 0x38, 0x23, 0x01, 0x0F, 0x03, 0x00, 0x38, 0x09, 0x18, 0x00, 0x8E, 0x03, 0x09, 0x39, +/* 00009A30 */ 0x6C, 0x38, 0x39, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, +/* 00009A40 */ 0x1F, 0x03, 0xFF, 0x38, 0x76, 0x06, 0x23, 0x03, 0x2C, 0x38, 0x25, 0x14, 0x03, 0x00, 0x38, 0x07, +/* 00009A50 */ 0x09, 0x1C, 0x00, 0x8E, 0x03, 0x0A, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x39, 0x5C, +/* 00009A60 */ 0x01, 0x39, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x25, 0x38, 0x09, 0x18, 0x00, 0x8E, +/* 00009A70 */ 0x03, 0x31, 0x39, 0x6C, 0x38, 0x39, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x25, +/* 00009A80 */ 0x1F, 0x02, 0x38, 0x38, 0x47, 0x25, 0x38, 0x8E, 0x03, 0x02, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 00009A90 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x09, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x02, 0xA1, 0x00, 0x0B, +/* 00009AA0 */ 0x39, 0xA1, 0x01, 0x0C, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0C, 0x1F, 0x06, 0x38, 0x38, 0x47, +/* 00009AB0 */ 0x28, 0x38, 0x8E, 0x03, 0x02, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, +/* 00009AC0 */ 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCD, 0x39, 0x03, 0xA1, 0x00, 0x0E, 0x39, 0xA1, 0x01, 0x0F, 0x39, +/* 00009AD0 */ 0xA1, 0x02, 0x10, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x0E, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x29, +/* 00009AE0 */ 0x38, 0x8E, 0x02, 0x03, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x05, 0x47, 0x2A, 0x38, 0x14, 0x03, +/* 00009AF0 */ 0x00, 0x29, 0x0F, 0x09, 0x10, 0x00, 0x8E, 0x02, 0x03, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x06, +/* 00009B00 */ 0x47, 0x2A, 0x38, 0x09, 0x15, 0x00, 0x14, 0x03, 0x00, 0x29, 0x10, 0x09, 0x0D, 0x00, 0x8E, 0x02, +/* 00009B10 */ 0x03, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x07, 0x47, 0x2A, 0x38, 0x8E, 0x03, 0x02, 0x38, 0x07, +/* 00009B20 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xA8, 0x39, +/* 00009B30 */ 0x5C, 0x04, 0x39, 0xA8, 0x39, 0x5C, 0x05, 0x39, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2B, 0x38, 0x8E, +/* 00009B40 */ 0x03, 0x02, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x11, 0x5C, +/* 00009B50 */ 0x03, 0x0A, 0xCD, 0x39, 0x03, 0xA1, 0x00, 0x12, 0x39, 0xA1, 0x01, 0x13, 0x39, 0xA1, 0x02, 0x14, +/* 00009B60 */ 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, 0x13, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2C, 0x38, 0xA8, 0x38, +/* 00009B70 */ 0x47, 0x2D, 0x38, 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, +/* 00009B80 */ 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0x1F, 0x06, 0x38, 0x38, +/* 00009B90 */ 0x47, 0x2E, 0x38, 0xA8, 0x38, 0x47, 0x2F, 0x38, 0xA8, 0x38, 0x47, 0x30, 0x38, 0xA8, 0x38, 0x47, +/* 00009BA0 */ 0x31, 0x38, 0x61, 0x38, 0x25, 0x08, 0x47, 0x32, 0x38, 0x61, 0x38, 0x25, 0x09, 0x47, 0x33, 0x38, +/* 00009BB0 */ 0x2C, 0x38, 0x32, 0x15, 0x0E, 0x00, 0x38, 0x07, 0x09, 0x00, 0x00, 0x2C, 0x38, 0x33, 0x15, 0x03, +/* 00009BC0 */ 0x00, 0x38, 0x07, 0x09, 0x40, 0x00, 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 00009BD0 */ 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x16, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x16, 0x1F, +/* 00009BE0 */ 0x06, 0x38, 0x38, 0x47, 0x32, 0x38, 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 00009BF0 */ 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x19, 0x5C, 0x03, 0x32, 0x5C, 0x04, 0x17, 0x5C, 0x05, 0x17, 0x1F, +/* 00009C00 */ 0x06, 0x38, 0x38, 0x47, 0x33, 0x38, 0x8E, 0x03, 0x02, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, +/* 00009C10 */ 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1A, 0x5C, 0x03, 0x1B, 0xA8, 0x39, 0x5C, 0x04, 0x39, 0x5C, 0x05, +/* 00009C20 */ 0x06, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x34, 0x38, 0x8E, 0x03, 0x07, 0x38, 0x07, 0x02, 0x00, 0x5C, +/* 00009C30 */ 0x00, 0x04, 0x5C, 0x01, 0x24, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x24, 0x38, 0x8E, 0x03, 0x2F, 0x38, +/* 00009C40 */ 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x24, 0x5C, 0x02, 0x28, 0xCD, 0x39, 0x01, 0xA1, +/* 00009C50 */ 0x00, 0x1C, 0x39, 0x5C, 0x03, 0x39, 0x8E, 0x03, 0x30, 0x39, 0x5C, 0x04, 0x39, 0x1F, 0x05, 0x38, +/* 00009C60 */ 0x38, 0x47, 0x35, 0x38, 0x2C, 0x38, 0x2B, 0x15, 0x03, 0x00, 0x38, 0x07, 0x09, 0x3E, 0x00, 0x8E, +/* 00009C70 */ 0x03, 0x06, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x1F, 0x02, 0x38, 0x38, +/* 00009C80 */ 0x0F, 0x29, 0x00, 0x38, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x0A, 0x07, +/* 00009C90 */ 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8E, 0x03, 0x11, 0x3A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, +/* 00009CA0 */ 0x01, 0x2B, 0x1F, 0x02, 0x3A, 0x3A, 0x5C, 0x01, 0x3A, 0x1F, 0x02, 0xFF, 0x38, 0x14, 0x03, 0x00, +/* 00009CB0 */ 0x29, 0x10, 0x09, 0xD0, 0x00, 0x2C, 0x38, 0x2B, 0x14, 0x03, 0x00, 0x38, 0x07, 0x09, 0x12, 0x00, +/* 00009CC0 */ 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x0B, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, +/* 00009CD0 */ 0xFF, 0x38, 0x8E, 0x03, 0x0C, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x25, 0x39, +/* 00009CE0 */ 0x5C, 0x01, 0x39, 0x5C, 0x02, 0x2B, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x2B, 0x38, 0xE5, 0x1C, 0x00, +/* 00009CF0 */ 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x0C, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, +/* 00009D00 */ 0x2B, 0x1F, 0x02, 0x38, 0x38, 0x47, 0x2D, 0x38, 0xE9, 0x09, 0x3B, 0x00, 0xE7, 0x26, 0x06, 0x8E, +/* 00009D10 */ 0x03, 0x29, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x1F, 0x02, 0xFF, 0x38, +/* 00009D20 */ 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x8E, 0x03, +/* 00009D30 */ 0x11, 0x3A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x2B, 0x1F, 0x02, 0x3A, 0x3A, 0x5C, +/* 00009D40 */ 0x01, 0x3A, 0x1F, 0x02, 0xFF, 0x38, 0xE9, 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, +/* 00009D50 */ 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x2D, +/* 00009D60 */ 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2F, 0x38, 0x8E, 0x03, 0x15, 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, +/* 00009D70 */ 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2D, 0x5C, 0x02, 0x2F, 0x1F, 0x03, 0x38, 0x38, 0x47, +/* 00009D80 */ 0x31, 0x38, 0x09, 0x6B, 0x00, 0xA8, 0x38, 0x47, 0x2B, 0x38, 0xA8, 0x38, 0x47, 0x2C, 0x38, 0x8E, +/* 00009D90 */ 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x1D, 0x5C, +/* 00009DA0 */ 0x03, 0x1E, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x1E, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x2F, 0x38, 0x14, +/* 00009DB0 */ 0x03, 0x00, 0x29, 0x0F, 0x09, 0x1E, 0x00, 0x8E, 0x03, 0x15, 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, +/* 00009DC0 */ 0x03, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, 0x1E, 0x1F, 0x03, 0x38, 0x38, 0x47, +/* 00009DD0 */ 0x31, 0x38, 0x09, 0x1B, 0x00, 0x8E, 0x03, 0x15, 0x39, 0x6C, 0x38, 0x39, 0x0D, 0x07, 0x03, 0x00, +/* 00009DE0 */ 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x2F, 0x5C, 0x02, 0x20, 0x1F, 0x03, 0x38, 0x38, 0x47, 0x31, 0x38, +/* 00009DF0 */ 0x8E, 0x03, 0x03, 0x38, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x21, +/* 00009E00 */ 0x5C, 0x03, 0x2F, 0x5C, 0x04, 0x1F, 0x5C, 0x05, 0x31, 0x1F, 0x06, 0x38, 0x38, 0x47, 0x30, 0x38, +/* 00009E10 */ 0x76, 0x28, 0x23, 0x0E, 0x61, 0x38, 0x35, 0x0F, 0x76, 0x38, 0x23, 0x10, 0x76, 0x29, 0x23, 0x11, +/* 00009E20 */ 0xA8, 0x38, 0x15, 0x03, 0x00, 0x2B, 0x38, 0x09, 0x04, 0x00, 0x76, 0x2B, 0x23, 0x12, 0xA8, 0x38, +/* 00009E30 */ 0x15, 0x03, 0x00, 0x2C, 0x38, 0x09, 0x5A, 0x00, 0x76, 0x2C, 0x23, 0x13, 0x8E, 0x02, 0x04, 0x38, +/* 00009E40 */ 0x4B, 0x38, 0x61, 0x38, 0x38, 0x14, 0x76, 0x38, 0x23, 0x15, 0x14, 0x03, 0x00, 0x2C, 0x13, 0x09, +/* 00009E50 */ 0x11, 0x00, 0x8E, 0x02, 0x04, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x16, 0x76, 0x38, 0x23, 0x15, +/* 00009E60 */ 0x09, 0x2F, 0x00, 0x14, 0x03, 0x00, 0x2C, 0x12, 0x09, 0x11, 0x00, 0x8E, 0x02, 0x04, 0x38, 0x4B, +/* 00009E70 */ 0x38, 0x61, 0x38, 0x38, 0x17, 0x76, 0x38, 0x23, 0x15, 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x2C, +/* 00009E80 */ 0x14, 0x09, 0x0E, 0x00, 0x8E, 0x02, 0x04, 0x38, 0x4B, 0x38, 0x61, 0x38, 0x38, 0x18, 0x76, 0x38, +/* 00009E90 */ 0x23, 0x15, 0x76, 0x2E, 0x23, 0x19, 0x76, 0x2F, 0x23, 0x1A, 0x76, 0x30, 0x23, 0x1B, 0xA8, 0x38, +/* 00009EA0 */ 0x15, 0x03, 0x00, 0x33, 0x38, 0x09, 0x08, 0x00, 0x76, 0x32, 0x23, 0x1C, 0x76, 0x33, 0x23, 0x1D, +/* 00009EB0 */ 0x76, 0x2A, 0x23, 0x1E, 0x76, 0x34, 0x23, 0x1F, 0xE5, 0x19, 0x00, 0x8E, 0x03, 0x09, 0x39, 0x6C, +/* 00009EC0 */ 0x38, 0x39, 0x20, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x39, 0x5C, 0x01, 0x23, 0x1F, 0x02, 0xFF, 0x38, +/* 00009ED0 */ 0xE9, 0x09, 0x27, 0x00, 0xE7, 0x27, 0x06, 0x8E, 0x03, 0x29, 0x38, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00009EE0 */ 0x04, 0x5C, 0x01, 0x27, 0x1F, 0x02, 0xFF, 0x38, 0x8E, 0x03, 0x09, 0x39, 0x6C, 0x38, 0x39, 0x21, +/* 00009EF0 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x39, 0x1F, 0x01, 0xFF, 0x38, 0xE9, 0x61, 0x38, 0x23, 0x22, 0x0F, +/* 00009F00 */ 0x07, 0x00, 0x38, 0x09, 0x00, 0x00, 0x76, 0x22, 0x23, 0x23, 0x47, 0x38, 0x23, 0x8E, 0x03, 0x0C, +/* 00009F10 */ 0x39, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x8E, 0x03, 0x24, 0x3A, 0x5C, 0x01, 0x3A, 0x61, 0x3A, +/* 00009F20 */ 0x23, 0x22, 0x5C, 0x02, 0x3A, 0x1F, 0x03, 0x39, 0x39, 0x76, 0x39, 0x38, 0x24, 0x76, 0x06, 0x23, +/* 00009F30 */ 0x25, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, +/* 00009F40 */ 0x02, 0xFE, 0x66, 0x03, 0xFE, 0xD7, 0x03, 0xFE, 0xD8, 0x03, 0xFE, 0xD9, 0x03, 0xFE, 0x10, 0x02, +/* 00009F50 */ 0xFE, 0x11, 0x02, 0xFE, 0x6A, 0x02, 0xFE, 0x6B, 0x02, 0xFE, 0x32, 0x02, 0xFE, 0x21, 0x01, 0xFE, +/* 00009F60 */ 0xF6, 0x03, 0xFE, 0x21, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x7C, 0x02, 0xFE, 0x16, 0x02, 0xFE, 0x17, +/* 00009F70 */ 0x02, 0xFE, 0xD6, 0x03, 0xFE, 0x18, 0x02, 0xFE, 0xDA, 0x03, 0xFE, 0xDB, 0x03, 0xFE, 0xDC, 0x03, +/* 00009F80 */ 0xFE, 0x0D, 0x02, 0xFE, 0x0B, 0x02, 0xFE, 0x0C, 0x02, 0xFE, 0x0E, 0x02, 0xFE, 0x0F, 0x02, 0xFE, +/* 00009F90 */ 0x15, 0x02, 0xFE, 0x13, 0x02, 0xFE, 0x30, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x14, +/* 00009FA0 */ 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x6D, 0x02, 0xFE, 0x8D, 0xB6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, +/* 00009FB0 */ 0x00, 0x3B, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x2D, 0x00, 0x9B, 0x00, 0x18, 0x00, 0x6D, 0x00, 0x04, +/* 00009FC0 */ 0x00, 0x61, 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x1C, 0x00, 0x4F, 0x00, 0x18, 0x00, 0x49, 0x00, 0x2B, +/* 00009FD0 */ 0x00, 0x71, 0x00, 0x2F, 0x00, 0x73, 0x00, 0x0D, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x10, +/* 00009FE0 */ 0x00, 0x43, 0x00, 0x08, 0x00, 0x30, 0x00, 0x0D, 0x00, 0x50, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x2F, +/* 00009FF0 */ 0x00, 0x7D, 0x00, 0x05, 0x00, 0x31, 0x00, 0x20, 0x00, 0x67, 0x00, 0x05, 0x00, 0x37, 0x00, 0x05, +/* 0000A000 */ 0x00, 0x37, 0x00, 0x05, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x51, 0x00, 0x07, 0x00, 0x52, 0x00, 0x16, +/* 0000A010 */ 0x00, 0x7E, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x96, 0x00, 0x22, 0x00, 0x9A, 0x00, 0x14, +/* 0000A020 */ 0x00, 0x41, 0x00, 0x28, 0x00, 0xA2, 0x00, 0x23, 0x00, 0x62, 0x00, 0x26, 0x00, 0x58, 0x00, 0x08, +/* 0000A030 */ 0x00, 0x30, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x12, 0x00, 0x4F, 0x00, 0x1E, 0x00, 0x74, 0x00, 0x1E, +/* 0000A040 */ 0x00, 0x4A, 0x00, 0x01, 0x00, 0x24, 0x00, 0x11, 0x00, 0x2E, 0x00, 0x27, 0x00, 0x5F, 0x00, 0x20, +/* 0000A050 */ 0x00, 0x76, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x05, 0x00, 0x2A, 0x00, 0x05, 0x00, 0x31, 0x00, 0x20, +/* 0000A060 */ 0x00, 0x69, 0x00, 0x08, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x1B, 0x00, 0x7B, 0x00, 0x20, +/* 0000A070 */ 0x00, 0xC6, 0x00, 0x04, 0x00, 0x38, 0x00, 0x08, 0x00, 0x43, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x0A, +/* 0000A080 */ 0x00, 0x32, 0x00, 0x04, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x39, 0x00, 0x04, 0x00, 0x46, 0x00, 0x0E, +/* 0000A090 */ 0x00, 0x5F, 0x00, 0x08, 0x00, 0x3C, 0x00, 0x11, 0x00, 0x65, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x11, +/* 0000A0A0 */ 0x00, 0x63, 0x00, 0x08, 0x00, 0x3A, 0x00, 0x0E, 0x00, 0x81, 0x00, 0x04, 0x00, 0x4C, 0x00, 0x04, +/* 0000A0B0 */ 0x00, 0x4E, 0x00, 0x04, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x42, 0x00, 0x04, 0x00, 0x58, 0x00, 0x04, +/* 0000A0C0 */ 0x00, 0x67, 0x00, 0x04, 0x00, 0x40, 0x00, 0x07, 0x00, 0xA9, 0x00, 0x1B, 0x00, 0x3C, 0x00, 0x01, +/* 0000A0D0 */ 0x00, 0x20, 0x00, 0x11, 0x00, 0x6B, 0x01, 0x13, 0x00, 0x4A, 0x00, 0x0B, 0x00, 0x3B, 0x00, 0x04, +/* 0000A0E0 */ 0x00, 0x70, 0x00, 0x23, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x00, 0x3F, 0x5C, 0x80, 0xE0, +/* 0000A0F0 */ 0x29, 0xD4, 0x92, 0xFE, 0xE4, 0x02, 0x14, 0xA0, 0x41, 0xD1, 0x00, 0x2E, 0xFE, 0x07, 0x83, 0x06, +/* 0000A100 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x07, 0x83, 0xFE, 0x95, 0x2E, 0xFE, 0x95, 0x2E, +/* 0000A110 */ 0x0B, 0x16, 0x1A, 0x09, 0x9D, 0x9D, 0x01, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x05, 0x02, 0x19, 0x1A, +/* 0000A120 */ 0x06, 0xFE, 0x10, 0x03, 0x06, 0xFE, 0xB0, 0x03, 0x05, 0xFE, 0xB1, 0x03, 0x08, 0x05, 0xFE, 0xB2, +/* 0000A130 */ 0x03, 0x05, 0xFE, 0xB3, 0x03, 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, +/* 0000A140 */ 0x03, 0x0B, 0x06, 0xFE, 0x14, 0x03, 0x07, 0x06, 0xFE, 0xB4, 0x03, 0x0C, 0x06, 0xFE, 0x13, 0x03, +/* 0000A150 */ 0x06, 0xFE, 0xB5, 0x03, 0x06, 0xFE, 0xB6, 0x03, 0x06, 0xFE, 0xB7, 0x03, 0x06, 0xFE, 0xB8, 0x03, +/* 0000A160 */ 0x05, 0xFE, 0xB9, 0x03, 0xFE, 0x6A, 0x02, 0xA8, 0x16, 0xA8, 0x17, 0xA8, 0x18, 0x8E, 0x01, 0x38, +/* 0000A170 */ 0x1C, 0x14, 0x0F, 0x00, 0x1C, 0x02, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x38, 0x1C, 0x14, 0x03, 0x00, +/* 0000A180 */ 0x1C, 0x03, 0x09, 0x43, 0x02, 0xDE, 0x00, 0x03, 0x01, 0xB8, 0x1C, 0x00, 0x01, 0x51, 0x01, 0x00, +/* 0000A190 */ 0x16, 0x1C, 0x95, 0x00, 0x02, 0x16, 0x8E, 0x01, 0x09, 0x1D, 0x6C, 0x1C, 0x1D, 0x00, 0x07, 0x03, +/* 0000A1A0 */ 0x00, 0x5C, 0x00, 0x1D, 0x8E, 0x01, 0x2A, 0x1E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, +/* 0000A1B0 */ 0x04, 0xB8, 0x20, 0x00, 0x01, 0x51, 0x01, 0x01, 0x1F, 0x20, 0x5C, 0x02, 0x1F, 0x1F, 0x03, 0x1E, +/* 0000A1C0 */ 0x1E, 0x5C, 0x01, 0x1E, 0x8E, 0x01, 0x3B, 0x1E, 0x4B, 0x1E, 0x61, 0x1E, 0x1E, 0x01, 0x5C, 0x02, +/* 0000A1D0 */ 0x1E, 0x1F, 0x03, 0xFF, 0x1C, 0x8E, 0x01, 0x38, 0x1C, 0x14, 0x03, 0x00, 0x1C, 0x02, 0x09, 0xE7, +/* 0000A1E0 */ 0x01, 0xDE, 0x01, 0x04, 0x02, 0xB8, 0x1C, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x01, +/* 0000A1F0 */ 0x51, 0x01, 0x02, 0x17, 0x1C, 0x95, 0x01, 0x02, 0x17, 0x01, 0x51, 0x01, 0x03, 0x18, 0x1C, 0x95, +/* 0000A200 */ 0x01, 0x03, 0x18, 0x8E, 0x01, 0x2A, 0x1C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, +/* 0000A210 */ 0x90, 0x01, 0x02, 0x1D, 0x5C, 0x02, 0x1D, 0x1F, 0x03, 0xFF, 0x1C, 0x8E, 0x01, 0x2A, 0x1C, 0x07, +/* 0000A220 */ 0x03, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x07, 0x90, 0x01, 0x03, 0x1D, 0x5C, 0x02, 0x1D, 0x1F, +/* 0000A230 */ 0x03, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x02, +/* 0000A240 */ 0x1D, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x08, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A250 */ 0x1D, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x46, 0x1E, 0x4B, 0x1E, 0x7A, 0x1E, 0x1D, 0x02, 0x7A, 0x0B, +/* 0000A260 */ 0x1D, 0x03, 0x7A, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0x1F, 0x04, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, +/* 0000A270 */ 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x02, 0x1D, 0x5C, 0x01, 0x1D, 0x5C, 0x02, +/* 0000A280 */ 0x0E, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x90, 0x01, +/* 0000A290 */ 0x02, 0x1E, 0x07, 0x01, 0x00, 0xC2, 0x01, 0x1E, 0x1E, 0x7A, 0x1E, 0x1D, 0x02, 0x7A, 0x0F, 0x1D, +/* 0000A2A0 */ 0x03, 0x7A, 0x0F, 0x1D, 0x05, 0x7A, 0x0F, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0x1F, 0x04, 0xFF, 0x1C, +/* 0000A2B0 */ 0x8E, 0x01, 0x0A, 0x1C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, 0x02, 0x1D, 0x61, 0x1D, +/* 0000A2C0 */ 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x8E, 0x01, 0x0E, 0x1D, 0x61, 0x1D, 0x1D, 0x06, 0x5C, 0x02, 0x1D, +/* 0000A2D0 */ 0x1F, 0x03, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, +/* 0000A2E0 */ 0x02, 0x1D, 0x61, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x11, 0xCC, 0x2C, 0x00, 0x00, +/* 0000A2F0 */ 0x00, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x90, 0x01, 0x02, 0x1E, 0x7A, 0x1E, 0x1D, +/* 0000A300 */ 0x02, 0x7A, 0x0B, 0x1D, 0x03, 0x7A, 0x0F, 0x1D, 0x05, 0x7A, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, +/* 0000A310 */ 0x1F, 0x04, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, 0x01, +/* 0000A320 */ 0x02, 0x1D, 0x61, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x12, 0xCC, 0x44, 0x00, 0x00, +/* 0000A330 */ 0x00, 0x03, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0xB8, 0x1F, 0x00, 0xB7, 0x01, 0x00, 0x00, +/* 0000A340 */ 0x00, 0x1F, 0x1F, 0x01, 0x51, 0x01, 0x04, 0x1E, 0x1F, 0x7A, 0x1E, 0x1D, 0x02, 0x01, 0x65, 0x01, +/* 0000A350 */ 0x1E, 0x1D, 0x7A, 0x0B, 0x1D, 0x03, 0x7A, 0x0F, 0x1D, 0x05, 0x7A, 0x0B, 0x1D, 0x04, 0x5C, 0x03, +/* 0000A360 */ 0x1D, 0x1F, 0x04, 0xFF, 0x1C, 0x8E, 0x01, 0x1B, 0x1C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x90, +/* 0000A370 */ 0x01, 0x02, 0x1D, 0x61, 0x1D, 0x1D, 0x06, 0x5C, 0x01, 0x1D, 0x5C, 0x02, 0x13, 0xCC, 0x5C, 0x00, +/* 0000A380 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x8E, 0x01, 0x2A, 0x1E, 0x07, 0x03, +/* 0000A390 */ 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x15, 0xB8, 0x20, 0x00, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x20, +/* 0000A3A0 */ 0x20, 0x01, 0x51, 0x01, 0x05, 0x1F, 0x20, 0x5C, 0x02, 0x1F, 0x1F, 0x03, 0x1E, 0x1E, 0x7A, 0x1E, +/* 0000A3B0 */ 0x1D, 0x07, 0x7A, 0x0F, 0x1D, 0x05, 0x7A, 0x0B, 0x1D, 0x04, 0x5C, 0x03, 0x1D, 0x1F, 0x04, 0xFF, +/* 0000A3C0 */ 0x1C, 0x90, 0x01, 0x02, 0x00, 0x09, 0x07, 0x00, 0xA8, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000A3D0 */ 0x00, 0x05, 0x70, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A3E0 */ 0xB7, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, +/* 0000A3F0 */ 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, +/* 0000A400 */ 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, +/* 0000A410 */ 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, +/* 0000A420 */ 0xB4, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A430 */ 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, +/* 0000A440 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, +/* 0000A450 */ 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0x34, 0x02, 0xFE, 0xF0, 0x02, 0xFE, 0xB6, +/* 0000A460 */ 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0x48, 0x01, 0xFE, 0xB7, 0x01, +/* 0000A470 */ 0x02, 0x01, 0x01, 0x00, 0xFE, 0xBA, 0x03, 0x02, 0x02, 0x00, 0xFE, 0x1B, 0x02, 0x01, 0xFE, 0x20, +/* 0000A480 */ 0x02, 0xFE, 0x1E, 0x83, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x29, 0x00, 0x14, 0x17, 0x3F, 0x00, 0x21, +/* 0000A490 */ 0x04, 0x2E, 0x00, 0x7A, 0x04, 0x18, 0x00, 0x43, 0x03, 0x18, 0x00, 0x50, 0x00, 0x3A, 0x00, 0x93, +/* 0000A4A0 */ 0x00, 0x43, 0x00, 0x91, 0x00, 0x24, 0x00, 0x45, 0x00, 0x40, 0x00, 0x96, 0x00, 0x51, 0x00, 0xA7, +/* 0000A4B0 */ 0x05, 0x5C, 0x00, 0x03, 0x03, 0x07, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x16, 0x00, 0x00, 0x0C, 0xAC, +/* 0000A4C0 */ 0x00, 0x00, 0x86, 0xAA, 0x00, 0x00, 0xB4, 0xA8, 0x00, 0x00, 0x50, 0xA7, 0x00, 0x00, 0xB9, 0xA5, +/* 0000A4D0 */ 0x00, 0x00, 0xD6, 0xA4, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xB1, 0x03, +/* 0000A4E0 */ 0x3A, 0xA0, 0x41, 0xD1, 0x00, 0x35, 0xFE, 0x76, 0xAE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, +/* 0000A4F0 */ 0xFE, 0x76, 0xAE, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, +/* 0000A500 */ 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0x07, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xD4, 0x03, 0x06, +/* 0000A510 */ 0xFE, 0x11, 0x03, 0x78, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, 0x08, +/* 0000A520 */ 0x02, 0x09, 0x18, 0x00, 0x8E, 0x03, 0x09, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x03, 0x00, 0x5C, +/* 0000A530 */ 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x08, 0x8E, 0x03, 0x09, 0x09, +/* 0000A540 */ 0x6C, 0x08, 0x09, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x08, +/* 0000A550 */ 0x08, 0x47, 0x06, 0x08, 0xA8, 0x08, 0x14, 0x0E, 0x00, 0x06, 0x08, 0x09, 0x00, 0x00, 0x61, 0x08, +/* 0000A560 */ 0x06, 0x02, 0x0F, 0x1B, 0x00, 0x08, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x09, 0x6C, 0x08, 0x09, +/* 0000A570 */ 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, +/* 0000A580 */ 0x08, 0x61, 0x00, 0x06, 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, +/* 0000A590 */ 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x79, 0x02, 0xFE, 0x9C, 0xAE, 0x07, 0x05, 0x00, 0x00, 0x00, +/* 0000A5A0 */ 0x0B, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x7D, 0x00, 0x18, 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, +/* 0000A5B0 */ 0x18, 0x00, 0x7D, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x09, 0xC4, 0x10, +/* 0000A5C0 */ 0xFE, 0x9B, 0x03, 0x1B, 0xA0, 0x41, 0xC3, 0x00, 0xFE, 0xB6, 0x03, 0x34, 0xFE, 0xB8, 0xA8, 0xFF, +/* 0000A5D0 */ 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xB8, 0xA8, 0xFE, 0xF1, 0x04, 0xFE, 0xF1, 0x04, 0x01, +/* 0000A5E0 */ 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, 0x03, 0x01, 0x11, 0x11, 0x11, 0x11, 0x01, 0x0F, 0x06, 0xFE, +/* 0000A5F0 */ 0x9A, 0x03, 0x05, 0xFE, 0xD5, 0x03, 0x06, 0xFE, 0x11, 0x03, 0x06, 0xFE, 0x5D, 0x03, 0x06, 0xFE, +/* 0000A600 */ 0xBC, 0x03, 0x06, 0xFE, 0xBF, 0x03, 0x06, 0xFE, 0xC4, 0x03, 0x06, 0xFE, 0xCE, 0x03, 0x06, 0xFE, +/* 0000A610 */ 0xC9, 0x03, 0x06, 0xFE, 0xC5, 0x03, 0x07, 0xB9, 0x5B, 0x0D, 0xB3, 0x0D, 0x0D, 0x2C, 0x10, 0x0D, +/* 0000A620 */ 0x15, 0x03, 0x00, 0x10, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x03, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x00, +/* 0000A630 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x10, +/* 0000A640 */ 0x8E, 0x03, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, +/* 0000A650 */ 0x0D, 0x1F, 0x02, 0x10, 0x10, 0x47, 0x0E, 0x10, 0xA8, 0x10, 0x14, 0x0E, 0x00, 0x0E, 0x10, 0x09, +/* 0000A660 */ 0x00, 0x00, 0x61, 0x10, 0x0E, 0x02, 0x0F, 0x1B, 0x00, 0x10, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, +/* 0000A670 */ 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x03, 0x5C, 0x02, +/* 0000A680 */ 0x04, 0x1F, 0x03, 0xFF, 0x10, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A690 */ 0x00, 0x00, 0x61, 0x10, 0x0E, 0x03, 0x7A, 0x10, 0x00, 0x04, 0x61, 0x10, 0x0E, 0x05, 0x7A, 0x10, +/* 0000A6A0 */ 0x00, 0x06, 0x61, 0x10, 0x0E, 0x07, 0x7A, 0x10, 0x00, 0x08, 0x61, 0x10, 0x0E, 0x09, 0x7A, 0x10, +/* 0000A6B0 */ 0x00, 0x0A, 0x61, 0x10, 0x0E, 0x0B, 0x7A, 0x10, 0x00, 0x0C, 0x61, 0x10, 0x0E, 0x0D, 0x7A, 0x10, +/* 0000A6C0 */ 0x00, 0x0E, 0x61, 0x10, 0x0E, 0x0F, 0x7A, 0x10, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000A6D0 */ 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000A6E0 */ 0x21, 0x02, 0x00, 0x00, 0xBC, 0x03, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, +/* 0000A6F0 */ 0xCE, 0x03, 0x00, 0x00, 0x23, 0x02, 0x00, 0x00, 0xC5, 0x03, 0x00, 0x00, 0xFE, 0x69, 0x02, 0xFE, +/* 0000A700 */ 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x72, 0x02, 0xFE, 0xBC, +/* 0000A710 */ 0x03, 0xFE, 0x73, 0x02, 0xFE, 0x22, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x24, 0x02, 0xFE, 0x77, 0x02, +/* 0000A720 */ 0xFE, 0xCE, 0x03, 0xFE, 0x76, 0x02, 0xFE, 0x23, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0xC5, 0x03, 0xFE, +/* 0000A730 */ 0xED, 0xA8, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x84, 0x00, 0x18, +/* 0000A740 */ 0x00, 0x4B, 0x00, 0x15, 0x00, 0x65, 0x00, 0x18, 0x00, 0x85, 0x00, 0x4A, 0x00, 0xC6, 0x02, 0x00, +/* 0000A750 */ 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x82, 0x03, 0x10, 0xA3, 0x41, 0xC1, 0x00, 0xFE, +/* 0000A760 */ 0xB7, 0x03, 0x33, 0xFE, 0x0C, 0xA3, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x0C, 0xA3, +/* 0000A770 */ 0xFE, 0xF3, 0x02, 0xFE, 0xF3, 0x02, 0x01, 0x09, 0x06, 0x0B, 0x0B, 0x44, 0x41, 0x03, 0x03, 0x08, +/* 0000A780 */ 0x08, 0x08, 0x08, 0x0A, 0x06, 0xFE, 0x9A, 0x03, 0x05, 0xFE, 0xD4, 0x03, 0x06, 0xFE, 0x11, 0x03, +/* 0000A790 */ 0x08, 0xE1, 0x5B, 0x08, 0xB3, 0x08, 0x08, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, +/* 0000A7A0 */ 0x18, 0x00, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, +/* 0000A7B0 */ 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, +/* 0000A7C0 */ 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, +/* 0000A7D0 */ 0x09, 0x0B, 0xA8, 0x0B, 0x14, 0x0E, 0x00, 0x09, 0x0B, 0x09, 0x00, 0x00, 0x61, 0x0B, 0x09, 0x02, +/* 0000A7E0 */ 0x0F, 0x1B, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, +/* 0000A7F0 */ 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, +/* 0000A800 */ 0x03, 0x11, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0B, 0x0B, +/* 0000A810 */ 0x47, 0x06, 0x0B, 0x8E, 0x03, 0x11, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x07, +/* 0000A820 */ 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x07, 0x0B, 0x8E, 0x03, 0x10, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000A830 */ 0x05, 0x8E, 0x03, 0x09, 0x0D, 0x6C, 0x0C, 0x0D, 0x03, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x0D, 0x5C, +/* 0000A840 */ 0x01, 0x06, 0x5C, 0x02, 0x07, 0x61, 0x0E, 0x09, 0x04, 0x5C, 0x03, 0x0E, 0x61, 0x0E, 0x09, 0x05, +/* 0000A850 */ 0x5C, 0x04, 0x0E, 0x61, 0x0E, 0x09, 0x06, 0x5C, 0x05, 0x0E, 0x61, 0x0E, 0x09, 0x07, 0x5C, 0x06, +/* 0000A860 */ 0x0E, 0x1F, 0x07, 0x0C, 0x0C, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, +/* 0000A870 */ 0x00, 0x24, 0x00, 0xFE, 0x69, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x78, 0x02, 0xFE, 0x2A, 0x02, 0xFE, +/* 0000A880 */ 0x71, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x39, 0xA3, 0x09, 0x05, +/* 0000A890 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x18, 0x00, 0x75, 0x00, 0x18, 0x00, 0x47, 0x00, 0x15, +/* 0000A8A0 */ 0x00, 0x61, 0x00, 0x18, 0x00, 0x75, 0x00, 0x14, 0x00, 0x23, 0x00, 0x14, 0x00, 0x24, 0x00, 0x4A, +/* 0000A8B0 */ 0x00, 0xB4, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x67, 0x03, 0x10, 0xA3, +/* 0000A8C0 */ 0x41, 0xC1, 0x00, 0xFE, 0x11, 0x03, 0x32, 0xFE, 0x7F, 0x9E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 0000A8D0 */ 0x01, 0xFE, 0x7F, 0x9E, 0xFE, 0x3D, 0x04, 0xFE, 0x3D, 0x04, 0x01, 0x09, 0x05, 0x0B, 0x05, 0x62, +/* 0000A8E0 */ 0x5B, 0x03, 0x09, 0x07, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x06, 0xFE, 0x11, 0x03, 0x07, 0xFE, 0x3D, +/* 0000A8F0 */ 0x01, 0x5B, 0x07, 0xB3, 0x07, 0x07, 0x4F, 0x08, 0x4F, 0x09, 0x15, 0x05, 0x00, 0x05, 0x02, 0xA8, +/* 0000A900 */ 0x0B, 0x47, 0x05, 0x0B, 0x15, 0x05, 0x00, 0x06, 0x02, 0xA8, 0x0B, 0x47, 0x06, 0x0B, 0x4F, 0x08, +/* 0000A910 */ 0x4F, 0x09, 0x6A, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x14, 0x0D, 0x00, 0x07, 0x0B, 0x09, 0x00, 0x00, +/* 0000A920 */ 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x07, 0x0B, 0x09, 0x16, 0x00, 0x8E, 0x01, 0x02, 0x0B, 0x4B, 0x0B, +/* 0000A930 */ 0x07, 0x03, 0x00, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0xC2, 0x03, 0x00, 0x0B, 0x09, 0xEC, 0x00, +/* 0000A940 */ 0x8E, 0x03, 0x31, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, +/* 0000A950 */ 0x07, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x08, 0x0B, 0x8E, 0x03, 0x17, 0x0B, 0x07, 0x02, 0x00, 0x5C, +/* 0000A960 */ 0x00, 0x02, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x18, 0x00, 0x0B, 0x09, 0x00, 0x00, +/* 0000A970 */ 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, +/* 0000A980 */ 0x03, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, +/* 0000A990 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x14, +/* 0000A9A0 */ 0x03, 0x00, 0x09, 0x0B, 0x09, 0x31, 0x00, 0x8E, 0x03, 0x0A, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000A9B0 */ 0x02, 0xCB, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x04, 0x1F, 0x03, 0x0B, 0x0B, 0x47, 0x09, 0x0B, +/* 0000A9C0 */ 0x8E, 0x03, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, +/* 0000A9D0 */ 0x08, 0x5C, 0x02, 0x09, 0x1F, 0x03, 0xFF, 0x0B, 0x8E, 0x02, 0x02, 0x0B, 0x4B, 0x0B, 0x07, 0x04, +/* 0000A9E0 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x05, 0x5C, 0x03, 0x06, 0x1F, 0x04, 0xFF, +/* 0000A9F0 */ 0x0B, 0x47, 0x0B, 0x09, 0x8E, 0x03, 0x0C, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x03, +/* 0000AA00 */ 0x20, 0x0D, 0x5C, 0x01, 0x0D, 0x8E, 0x01, 0x03, 0x0D, 0x4B, 0x0D, 0x5C, 0x02, 0x0D, 0x5C, 0x03, +/* 0000AA10 */ 0x08, 0x1F, 0x04, 0x0C, 0x0C, 0x76, 0x0C, 0x0B, 0x04, 0x61, 0x0B, 0x09, 0x05, 0x82, 0x0B, 0x0B, +/* 0000AA20 */ 0x2B, 0x01, 0xFA, 0x0B, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, +/* 0000AA30 */ 0x03, 0xFE, 0x68, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x36, 0x02, 0xFE, 0x79, 0x02, 0xFE, 0x79, 0x02, +/* 0000AA40 */ 0xDD, 0xFE, 0x91, 0x9E, 0x10, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x2B, +/* 0000AA50 */ 0x00, 0x18, 0x00, 0x43, 0x00, 0x16, 0x00, 0x52, 0x00, 0x18, 0x00, 0x37, 0x00, 0x18, 0x00, 0x38, +/* 0000AA60 */ 0x00, 0x15, 0x00, 0x97, 0x00, 0x18, 0x00, 0x47, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x19, 0x00, 0x3F, +/* 0000AA70 */ 0x00, 0x18, 0x00, 0x58, 0x00, 0x19, 0x00, 0x76, 0x00, 0x28, 0x00, 0x68, 0x00, 0x0B, 0x00, 0x3D, +/* 0000AA80 */ 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x55, 0x03, +/* 0000AA90 */ 0x61, 0xA0, 0x41, 0xF1, 0x00, 0x31, 0xFE, 0x87, 0x9A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, +/* 0000AAA0 */ 0xFE, 0x87, 0x9A, 0xFE, 0x90, 0x03, 0xFE, 0x90, 0x03, 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4E, 0x4A, +/* 0000AAB0 */ 0x02, 0x05, 0x07, 0x07, 0x07, 0x07, 0x0D, 0x07, 0x01, 0x00, 0x05, 0xFE, 0xB1, 0x03, 0x08, 0x01, +/* 0000AAC0 */ 0x01, 0x01, 0x02, 0xFE, 0x00, 0x01, 0xAE, 0x08, 0x5B, 0x0A, 0xB3, 0x0A, 0x0A, 0x97, 0x0E, 0x08, +/* 0000AAD0 */ 0x03, 0x47, 0x09, 0x0E, 0xA8, 0x0E, 0x14, 0x0B, 0x00, 0x0A, 0x0E, 0x09, 0x00, 0x00, 0x14, 0x03, +/* 0000AAE0 */ 0x00, 0x0A, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x02, 0x09, 0x0F, 0x6C, 0x0E, 0x0F, 0x00, 0x07, 0x02, +/* 0000AAF0 */ 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0xFF, 0x0E, 0x09, 0x1A, 0x00, 0x14, 0x03, +/* 0000AB00 */ 0x00, 0x09, 0x02, 0x09, 0x12, 0x00, 0x8E, 0x02, 0x09, 0x0F, 0x6C, 0x0E, 0x0F, 0x01, 0x07, 0x01, +/* 0000AB10 */ 0x00, 0x5C, 0x00, 0x0F, 0x1F, 0x01, 0xFF, 0x0E, 0x8E, 0x02, 0x11, 0x0E, 0x07, 0x02, 0x00, 0x5C, +/* 0000AB20 */ 0x00, 0x05, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x0B, 0x0E, 0x8E, 0x02, 0x11, 0x0E, +/* 0000AB30 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, 0x47, 0x09, 0x0E, +/* 0000AB40 */ 0x8E, 0x02, 0x0A, 0x0E, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x05, 0xCB, 0x0F, 0x5C, 0x01, 0x0F, 0x5C, +/* 0000AB50 */ 0x02, 0x02, 0x1F, 0x03, 0x0E, 0x0E, 0x47, 0x0C, 0x0E, 0x8E, 0x01, 0x02, 0x0E, 0x4B, 0x0E, 0x07, +/* 0000AB60 */ 0x04, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0C, 0x97, 0x0F, 0x08, 0x06, 0x5C, 0x02, 0x0F, 0x97, +/* 0000AB70 */ 0x0F, 0x08, 0x07, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0xFF, 0x0E, 0x8E, 0x02, 0x10, 0x0E, 0x07, 0x02, +/* 0000AB80 */ 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x02, 0x09, 0x10, 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x07, 0x00, 0x5C, +/* 0000AB90 */ 0x00, 0x10, 0x5C, 0x01, 0x0B, 0x5C, 0x02, 0x09, 0x61, 0x11, 0x0C, 0x03, 0x5C, 0x03, 0x11, 0x61, +/* 0000ABA0 */ 0x11, 0x0C, 0x04, 0x5C, 0x04, 0x11, 0x61, 0x11, 0x0C, 0x05, 0x5C, 0x05, 0x11, 0x61, 0x11, 0x0C, +/* 0000ABB0 */ 0x06, 0x5C, 0x06, 0x11, 0x1F, 0x07, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x00, 0x0E, 0x09, +/* 0000ABC0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x59, 0x02, 0xFE, 0x57, 0x02, 0xFE, 0x2A, 0x02, 0xFE, +/* 0000ABD0 */ 0x71, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0xA5, 0x9A, 0x0B, 0x07, +/* 0000ABE0 */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x29, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x18, 0x00, 0x6D, 0x00, 0x08, +/* 0000ABF0 */ 0x00, 0x29, 0x00, 0x12, 0x00, 0xE2, 0x00, 0x14, 0x00, 0x2C, 0x00, 0x14, 0x00, 0x29, 0x00, 0x19, +/* 0000AC00 */ 0x00, 0x3A, 0x00, 0x21, 0x00, 0x4D, 0x00, 0x4A, 0x00, 0xB5, 0x00, 0x00, 0xBF, 0x5D, 0x80, 0xE0, +/* 0000AC10 */ 0xA1, 0xD6, 0x02, 0xFE, 0xE8, 0x02, 0x0C, 0xB3, 0x41, 0xC1, 0x00, 0xFE, 0xBA, 0x03, 0x2F, 0xFE, +/* 0000AC20 */ 0x5F, 0x83, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x5F, 0x83, 0xFE, 0xC5, 0x16, +/* 0000AC30 */ 0xFE, 0xC5, 0x16, 0x44, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, 0x0A, 0x01, 0xF9, 0x02, 0x10, 0x13, +/* 0000AC40 */ 0x13, 0x13, 0x13, 0x01, 0x32, 0x33, 0x34, 0x35, 0x06, 0xFE, 0x9A, 0x03, 0x06, 0xFE, 0xBB, 0x03, +/* 0000AC50 */ 0x08, 0x06, 0xFE, 0x11, 0x03, 0x0B, 0x06, 0xFE, 0x72, 0x03, 0x07, 0x06, 0xFE, 0xA2, 0x03, 0x06, +/* 0000AC60 */ 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0x64, 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x06, 0xFE, 0xBC, 0x03, 0x06, +/* 0000AC70 */ 0xFE, 0xBD, 0x03, 0x06, 0xFE, 0xBE, 0x03, 0x06, 0xFE, 0xBF, 0x03, 0x05, 0xFE, 0xC0, 0x03, 0x05, +/* 0000AC80 */ 0xFE, 0xC1, 0x03, 0x05, 0xFE, 0xC2, 0x03, 0x05, 0xFE, 0xC3, 0x03, 0x06, 0xFE, 0xC4, 0x03, 0x06, +/* 0000AC90 */ 0xFE, 0x6C, 0x03, 0x0C, 0x06, 0xFE, 0xC5, 0x03, 0x05, 0xFE, 0xC6, 0x03, 0x05, 0xFE, 0xC7, 0x03, +/* 0000ACA0 */ 0x06, 0xFE, 0xC8, 0x03, 0x06, 0xFE, 0xC9, 0x03, 0x06, 0xFE, 0xCA, 0x03, 0x06, 0xFE, 0x0A, 0x03, +/* 0000ACB0 */ 0x06, 0xFE, 0xCB, 0x03, 0x06, 0xFE, 0xCC, 0x03, 0x06, 0xFE, 0xCD, 0x03, 0x01, 0x00, 0x01, 0xFF, +/* 0000ACC0 */ 0xFE, 0x68, 0x03, 0xA8, 0x2F, 0xA8, 0x30, 0xA8, 0x31, 0x2C, 0x36, 0x24, 0x0D, 0x03, 0x00, 0x36, +/* 0000ACD0 */ 0x02, 0x09, 0x12, 0x00, 0x8E, 0x02, 0x09, 0x37, 0x6C, 0x36, 0x37, 0x00, 0x07, 0x01, 0x00, 0x5C, +/* 0000ACE0 */ 0x00, 0x37, 0x1F, 0x01, 0xFF, 0x36, 0x8E, 0x02, 0x0C, 0x36, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, +/* 0000ACF0 */ 0x8E, 0x02, 0x19, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x24, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x36, +/* 0000AD00 */ 0x36, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x23, 0x00, 0x61, 0x36, 0x24, 0x01, 0x0F, 0x03, 0x00, 0x36, +/* 0000AD10 */ 0x09, 0x18, 0x00, 0x8E, 0x02, 0x09, 0x37, 0x6C, 0x36, 0x37, 0x02, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000AD20 */ 0x37, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0xFF, 0x36, 0x76, 0x06, 0x24, 0x03, 0x2C, +/* 0000AD30 */ 0x36, 0x26, 0x14, 0x03, 0x00, 0x36, 0x07, 0x09, 0x1C, 0x00, 0x8E, 0x02, 0x0A, 0x36, 0x07, 0x03, +/* 0000AD40 */ 0x00, 0x5C, 0x00, 0x04, 0xCB, 0x37, 0x5C, 0x01, 0x37, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x36, 0x36, +/* 0000AD50 */ 0x47, 0x26, 0x36, 0x09, 0x18, 0x00, 0x8E, 0x02, 0x31, 0x37, 0x6C, 0x36, 0x37, 0x04, 0x07, 0x02, +/* 0000AD60 */ 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x26, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x26, 0x36, 0x8E, 0x02, +/* 0000AD70 */ 0x02, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x09, 0x5C, 0x03, +/* 0000AD80 */ 0x0A, 0xCD, 0x37, 0x02, 0xA1, 0x00, 0x0B, 0x37, 0xA1, 0x01, 0x0C, 0x37, 0x5C, 0x04, 0x37, 0x5C, +/* 0000AD90 */ 0x05, 0x0C, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x28, 0x36, 0x8E, 0x02, 0x02, 0x36, 0x07, 0x06, 0x00, +/* 0000ADA0 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x02, 0xA1, +/* 0000ADB0 */ 0x00, 0x0E, 0x37, 0xA1, 0x01, 0x0F, 0x37, 0x5C, 0x04, 0x37, 0x5C, 0x05, 0x0E, 0x1F, 0x06, 0x36, +/* 0000ADC0 */ 0x36, 0x47, 0x29, 0x36, 0x8E, 0x02, 0x02, 0x36, 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 0000ADD0 */ 0x26, 0x5C, 0x02, 0x10, 0x5C, 0x03, 0x0A, 0xCD, 0x37, 0x04, 0xA1, 0x00, 0x11, 0x37, 0xA1, 0x01, +/* 0000ADE0 */ 0x12, 0x37, 0xA1, 0x02, 0x13, 0x37, 0xA1, 0x03, 0x14, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, +/* 0000ADF0 */ 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x2A, 0x36, 0x8E, 0x02, 0x02, 0x36, 0x07, 0x06, 0x00, +/* 0000AE00 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x15, 0x5C, 0x03, 0x16, 0xA8, 0x37, 0x5C, 0x04, +/* 0000AE10 */ 0x37, 0x5C, 0x05, 0x17, 0x1F, 0x06, 0x36, 0x36, 0x47, 0x2B, 0x36, 0x8E, 0x02, 0x02, 0x36, 0x07, +/* 0000AE20 */ 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x18, 0x5C, 0x03, 0x0A, 0xCD, 0x37, +/* 0000AE30 */ 0x03, 0xA1, 0x00, 0x19, 0x37, 0xA1, 0x01, 0x1A, 0x37, 0xA1, 0x02, 0x1B, 0x37, 0x5C, 0x04, 0x37, +/* 0000AE40 */ 0xA8, 0x37, 0x5C, 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x96, 0x02, 0x36, 0x8E, 0x02, 0x02, 0x36, +/* 0000AE50 */ 0x07, 0x06, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x26, 0x5C, 0x02, 0x1C, 0x5C, 0x03, 0x16, 0xCD, +/* 0000AE60 */ 0x37, 0x02, 0xA1, 0x00, 0x06, 0x37, 0xA1, 0x01, 0x17, 0x37, 0x5C, 0x04, 0x37, 0xA8, 0x37, 0x5C, +/* 0000AE70 */ 0x05, 0x37, 0x1F, 0x06, 0x36, 0x36, 0x96, 0x03, 0x36, 0x8E, 0x02, 0x07, 0x36, 0x07, 0x02, 0x00, +/* 0000AE80 */ 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x25, 0x36, 0x8E, 0x02, 0x2F, +/* 0000AE90 */ 0x36, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x25, 0x5C, 0x02, 0x28, 0xA8, 0x37, 0x5C, +/* 0000AEA0 */ 0x03, 0x37, 0x8E, 0x02, 0x37, 0x37, 0x5C, 0x04, 0x37, 0x1F, 0x05, 0x36, 0x36, 0x47, 0x2C, 0x36, +/* 0000AEB0 */ 0x96, 0x04, 0x1D, 0x8E, 0x02, 0x2C, 0x36, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x61, 0x37, 0x2C, +/* 0000AEC0 */ 0x05, 0x5C, 0x01, 0x37, 0x1F, 0x02, 0x36, 0x36, 0x47, 0x2D, 0x36, 0x47, 0x2E, 0x2D, 0x61, 0x36, +/* 0000AED0 */ 0x2C, 0x06, 0x0F, 0x03, 0x00, 0x36, 0x09, 0x22, 0x00, 0x8E, 0x02, 0x0C, 0x36, 0x07, 0x04, 0x00, +/* 0000AEE0 */ 0x5C, 0x00, 0x04, 0x8E, 0x02, 0x1C, 0x37, 0x5C, 0x01, 0x37, 0x61, 0x37, 0x2C, 0x06, 0x5C, 0x02, +/* 0000AEF0 */ 0x37, 0xD4, 0x00, 0x37, 0x5C, 0x03, 0x37, 0x1F, 0x04, 0xFF, 0x36, 0x92, 0x04, 0x36, 0x15, 0x03, +/* 0000AF00 */ 0x00, 0x36, 0x1D, 0x09, 0x48, 0x00, 0x8E, 0x02, 0x35, 0x36, 0x97, 0x36, 0x36, 0x2E, 0x47, 0x2F, +/* 0000AF10 */ 0x36, 0x47, 0x30, 0x1E, 0xA8, 0x36, 0x15, 0x03, 0x00, 0x2F, 0x36, 0x09, 0x2D, 0x00, 0x92, 0x04, +/* 0000AF20 */ 0x37, 0x97, 0x37, 0x2F, 0x37, 0x47, 0x30, 0x37, 0x47, 0x36, 0x37, 0xA8, 0x37, 0x15, 0x03, 0x00, +/* 0000AF30 */ 0x36, 0x37, 0x09, 0x16, 0x00, 0x15, 0x03, 0x00, 0x30, 0x1E, 0x09, 0x0B, 0x00, 0x2F, 0x36, 0x2E, +/* 0000AF40 */ 0x1F, 0x2F, 0x36, 0x36, 0x30, 0x47, 0x2E, 0x36, 0x09, 0x03, 0x00, 0x96, 0x04, 0x1D, 0x92, 0x02, +/* 0000AF50 */ 0x36, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x7A, 0x00, 0xE5, 0x31, 0x00, 0x8E, 0x02, +/* 0000AF60 */ 0x09, 0x37, 0x6C, 0x36, 0x37, 0x07, 0x07, 0x07, 0x00, 0x5C, 0x00, 0x37, 0x5C, 0x01, 0x20, 0x5C, +/* 0000AF70 */ 0x02, 0x21, 0x5C, 0x03, 0x2D, 0xA8, 0x38, 0x5C, 0x04, 0x38, 0xA8, 0x38, 0x5C, 0x05, 0x38, 0xA8, +/* 0000AF80 */ 0x38, 0x5C, 0x06, 0x38, 0x1F, 0x07, 0x36, 0x36, 0x47, 0x31, 0x36, 0xE9, 0x09, 0x27, 0x00, 0xE7, +/* 0000AF90 */ 0x27, 0x06, 0x8E, 0x02, 0x29, 0x36, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x27, 0x1F, +/* 0000AFA0 */ 0x02, 0xFF, 0x36, 0x8E, 0x02, 0x09, 0x37, 0x6C, 0x36, 0x37, 0x08, 0x07, 0x01, 0x00, 0x5C, 0x00, +/* 0000AFB0 */ 0x37, 0x1F, 0x01, 0xFF, 0x36, 0xE9, 0x14, 0x03, 0x00, 0x31, 0x22, 0x09, 0x06, 0x00, 0x96, 0x02, +/* 0000AFC0 */ 0x1B, 0x09, 0x11, 0x00, 0x14, 0x03, 0x00, 0x31, 0x23, 0x09, 0x06, 0x00, 0x96, 0x02, 0x19, 0x09, +/* 0000AFD0 */ 0x03, 0x00, 0x96, 0x02, 0x1A, 0xA8, 0x36, 0x14, 0x03, 0x00, 0x2A, 0x36, 0x09, 0x03, 0x00, 0x47, +/* 0000AFE0 */ 0x2A, 0x14, 0x92, 0x03, 0x36, 0xA8, 0x37, 0x14, 0x03, 0x00, 0x36, 0x37, 0x09, 0x03, 0x00, 0x96, +/* 0000AFF0 */ 0x03, 0x17, 0x76, 0x28, 0x24, 0x09, 0x61, 0x36, 0x2C, 0x05, 0x76, 0x36, 0x24, 0x0A, 0x76, 0x2E, +/* 0000B000 */ 0x24, 0x0B, 0x76, 0x29, 0x24, 0x0C, 0x76, 0x2A, 0x24, 0x0D, 0x76, 0x2B, 0x24, 0x0E, 0x92, 0x02, +/* 0000B010 */ 0x36, 0x76, 0x36, 0x24, 0x0F, 0x92, 0x03, 0x36, 0x76, 0x36, 0x24, 0x10, 0x92, 0x04, 0x36, 0x76, +/* 0000B020 */ 0x36, 0x24, 0x11, 0x76, 0x06, 0x24, 0x12, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x57, 0x02, 0xFE, 0x6C, +/* 0000B030 */ 0x02, 0xFE, 0x67, 0x02, 0xFE, 0x6C, 0x02, 0xFE, 0x66, 0x03, 0xFE, 0x6F, 0x02, 0xFE, 0x3B, 0x02, +/* 0000B040 */ 0xFE, 0x2A, 0x02, 0xFE, 0x60, 0x02, 0xFE, 0x70, 0x02, 0xFE, 0x19, 0x02, 0xFE, 0x71, 0x02, 0xFE, +/* 0000B050 */ 0x72, 0x02, 0xFE, 0x73, 0x02, 0xFE, 0x74, 0x02, 0xFE, 0x75, 0x02, 0xFE, 0x76, 0x02, 0xFE, 0x77, +/* 0000B060 */ 0x02, 0xFE, 0x78, 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0x23, 0x02, 0xFE, 0xCE, 0x03, 0xFE, 0xAC, 0x83, +/* 0000B070 */ 0x35, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x37, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x2D, 0x00, 0x93, +/* 0000B080 */ 0x00, 0x18, 0x00, 0x65, 0x00, 0x04, 0x00, 0x5D, 0x00, 0x0B, 0x00, 0x3A, 0x00, 0x1C, 0x00, 0x4F, +/* 0000B090 */ 0x00, 0x18, 0x00, 0x49, 0x00, 0x2B, 0x00, 0x71, 0x00, 0x2B, 0x00, 0x5F, 0x00, 0x35, 0x00, 0x81, +/* 0000B0A0 */ 0x00, 0x22, 0x00, 0x6E, 0x00, 0x31, 0x00, 0x73, 0x00, 0x2D, 0x00, 0x9B, 0x00, 0x14, 0x00, 0x41, +/* 0000B0B0 */ 0x00, 0x23, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x2B, 0x00, 0x18, 0x00, 0x69, 0x00, 0x03, 0x00, 0x46, +/* 0000B0C0 */ 0x00, 0x0B, 0x00, 0x36, 0x00, 0x22, 0x00, 0x33, 0x05, 0x0B, 0x00, 0x33, 0x00, 0x0B, 0x00, 0x6F, +/* 0000B0D0 */ 0x00, 0x03, 0x00, 0x2F, 0x00, 0x21, 0x00, 0x92, 0x00, 0x08, 0x00, 0x3B, 0x00, 0x0E, 0x00, 0xB1, +/* 0000B0E0 */ 0x00, 0x03, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x51, 0x00, 0x33, 0x00, 0x79, 0x00, 0x01, 0x00, 0x52, +/* 0000B0F0 */ 0x00, 0x11, 0x00, 0x92, 0x01, 0x13, 0x00, 0x52, 0x00, 0x08, 0x00, 0x29, 0x00, 0x06, 0x00, 0x30, +/* 0000B100 */ 0x00, 0x08, 0x00, 0x2A, 0x00, 0x06, 0x00, 0x4A, 0x00, 0x03, 0x00, 0x4E, 0x00, 0x0A, 0x00, 0x35, +/* 0000B110 */ 0x00, 0x03, 0x00, 0x3C, 0x00, 0x0D, 0x00, 0x31, 0x00, 0x03, 0x00, 0x65, 0x00, 0x04, 0x00, 0x2E, +/* 0000B120 */ 0x00, 0x08, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x48, 0x00, 0x04, 0x00, 0x2A, 0x00, 0x04, 0x00, 0x36, +/* 0000B130 */ 0x00, 0x04, 0x00, 0x42, 0x00, 0x07, 0x00, 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x07, 0x00, 0x32, +/* 0000B140 */ 0x00, 0x06, 0x00, 0x33, 0x00, 0x00, 0x4A, 0xB1, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x19, 0xC4, +/* 0000B150 */ 0x10, 0xFE, 0x0A, 0x03, 0x57, 0xA2, 0x41, 0xD1, 0x00, 0x30, 0xFE, 0x19, 0x8B, 0xFF, 0x00, 0x10, +/* 0000B160 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x19, 0x8B, 0xFE, 0xCB, 0x04, 0xFE, 0xCB, 0x04, 0x41, 0x09, 0x15, +/* 0000B170 */ 0x1A, 0x0B, 0x5E, 0x59, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x19, 0x01, 0x01, 0x01, +/* 0000B180 */ 0x02, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xCF, 0x03, 0x06, 0xFE, 0xC5, 0x03, 0x07, 0x08, 0x06, +/* 0000B190 */ 0xFE, 0x6D, 0x03, 0x05, 0xFE, 0xC6, 0x03, 0x05, 0xFE, 0xC7, 0x03, 0x06, 0xFE, 0xC8, 0x03, 0x05, +/* 0000B1A0 */ 0xFE, 0xD0, 0x03, 0x06, 0xFE, 0xD1, 0x03, 0x0B, 0x05, 0xFE, 0xD2, 0x03, 0x06, 0xFE, 0xCA, 0x03, +/* 0000B1B0 */ 0x06, 0xFE, 0xBE, 0x03, 0x06, 0xFE, 0xBD, 0x03, 0x05, 0xFE, 0xD3, 0x03, 0xFE, 0x4C, 0x01, 0x8E, +/* 0000B1C0 */ 0x03, 0x09, 0x1B, 0x6C, 0x1A, 0x1B, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1B, 0x5C, 0x01, 0x15, +/* 0000B1D0 */ 0xE0, 0x1C, 0x00, 0x5C, 0x02, 0x1C, 0x1F, 0x03, 0x1A, 0x1A, 0x47, 0x16, 0x1A, 0x97, 0x1A, 0x16, +/* 0000B1E0 */ 0x02, 0x47, 0x17, 0x1A, 0x97, 0x1A, 0x16, 0x03, 0x14, 0x03, 0x00, 0x1A, 0x04, 0x09, 0x08, 0x00, +/* 0000B1F0 */ 0xA8, 0x1B, 0x47, 0x1A, 0x1B, 0x09, 0x07, 0x00, 0x97, 0x1B, 0x16, 0x03, 0x47, 0x1A, 0x1B, 0x47, +/* 0000B200 */ 0x18, 0x1A, 0x14, 0x03, 0x00, 0x17, 0x05, 0x09, 0x68, 0x00, 0x8E, 0x01, 0x02, 0x1A, 0xA8, 0x1B, +/* 0000B210 */ 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x5A, 0x00, 0x8E, 0x03, 0x02, 0x1A, 0x07, 0x06, 0x00, 0x5C, +/* 0000B220 */ 0x00, 0x08, 0x8E, 0x03, 0x0A, 0x1B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x08, 0xCC, 0x00, 0x00, 0x00, +/* 0000B230 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7A, 0x18, 0x1C, 0x01, 0x5C, 0x01, 0x1C, +/* 0000B240 */ 0x5C, 0x02, 0x07, 0x1F, 0x03, 0x1B, 0x1B, 0x5C, 0x01, 0x1B, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x09, +/* 0000B250 */ 0xCD, 0x1B, 0x03, 0xA1, 0x00, 0x0A, 0x1B, 0xA1, 0x01, 0x0B, 0x1B, 0xA1, 0x02, 0x0C, 0x1B, 0x5C, +/* 0000B260 */ 0x04, 0x1B, 0xA8, 0x1B, 0x5C, 0x05, 0x1B, 0x1F, 0x06, 0x1A, 0x1A, 0x94, 0x01, 0x02, 0x1A, 0x09, +/* 0000B270 */ 0x95, 0x00, 0x14, 0x03, 0x00, 0x17, 0x0D, 0x09, 0x57, 0x00, 0x8E, 0x01, 0x03, 0x1A, 0xA8, 0x1B, +/* 0000B280 */ 0x14, 0x03, 0x00, 0x1A, 0x1B, 0x09, 0x49, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, 0x1A, 0x09, +/* 0000B290 */ 0x38, 0x00, 0x8E, 0x03, 0x31, 0x1B, 0x6C, 0x1A, 0x1B, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1B, +/* 0000B2A0 */ 0x8E, 0x03, 0x0C, 0x1C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x08, 0x8E, 0x03, 0x24, 0x1D, 0x5C, 0x01, +/* 0000B2B0 */ 0x1D, 0x5C, 0x02, 0x18, 0x1F, 0x03, 0x1C, 0x1C, 0x43, 0x1C, 0x1C, 0x0E, 0x5C, 0x01, 0x1C, 0x1F, +/* 0000B2C0 */ 0x02, 0x1A, 0x1A, 0x94, 0x01, 0x03, 0x1A, 0x09, 0x04, 0x00, 0x94, 0x01, 0x03, 0x0F, 0x09, 0x36, +/* 0000B2D0 */ 0x00, 0x14, 0x03, 0x00, 0x17, 0x10, 0x09, 0x2E, 0x00, 0xA8, 0x1A, 0x15, 0x03, 0x00, 0x18, 0x1A, +/* 0000B2E0 */ 0x09, 0x24, 0x00, 0x15, 0x03, 0x00, 0x18, 0x11, 0x09, 0x1C, 0x00, 0x15, 0x03, 0x00, 0x18, 0x12, +/* 0000B2F0 */ 0x09, 0x14, 0x00, 0x15, 0x03, 0x00, 0x18, 0x13, 0x09, 0x0C, 0x00, 0x15, 0x03, 0x00, 0x18, 0x14, +/* 0000B300 */ 0x09, 0x04, 0x00, 0x94, 0x01, 0x04, 0x18, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, +/* 0000B310 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x03, 0x00, 0x00, 0xFE, 0x39, +/* 0000B320 */ 0x02, 0xFE, 0xC5, 0x03, 0xFE, 0x5C, 0x02, 0x0E, 0xFE, 0x63, 0x03, 0x00, 0xFE, 0x45, 0x8B, 0x0C, +/* 0000B330 */ 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x82, 0x00, 0x07, 0x00, 0x2C, 0x00, 0x1E, 0x00, 0x4C, 0x00, +/* 0000B340 */ 0x16, 0x00, 0x4B, 0x00, 0x5A, 0x00, 0x9F, 0x00, 0x16, 0x00, 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, +/* 0000B350 */ 0x38, 0x00, 0xA9, 0x00, 0x07, 0x00, 0x4D, 0x00, 0x32, 0x00, 0xFF, 0x00, 0x06, 0x00, 0x41, 0x00, +/* 0000B360 */ 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x31, 0xD4, 0x02, 0xFE, 0xAC, 0x02, 0x1E, 0xA0, 0x41, 0xC1, 0x00, +/* 0000B370 */ 0xFE, 0x42, 0x03, 0x2C, 0xFE, 0xD6, 0x79, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, +/* 0000B380 */ 0xD6, 0x79, 0xFE, 0xE5, 0x08, 0xFE, 0xE5, 0x08, 0x01, 0x0C, 0x07, 0x0F, 0x06, 0x7E, 0x76, 0x01, +/* 0000B390 */ 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x0E, 0x0F, 0x08, 0x01, 0x01, 0x05, 0xFE, 0xAB, 0x03, +/* 0000B3A0 */ 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x02, 0xFE, 0x99, 0x01, 0x4F, 0x07, 0x4F, 0x08, 0x4F, 0x0B, 0x4F, +/* 0000B3B0 */ 0x0C, 0x4F, 0x0D, 0x4F, 0x09, 0x4F, 0x0A, 0x8E, 0x01, 0x4C, 0x10, 0x4B, 0x10, 0x0F, 0x03, 0x00, +/* 0000B3C0 */ 0x10, 0x09, 0x18, 0x00, 0x8E, 0x01, 0x09, 0x10, 0x61, 0x10, 0x10, 0x00, 0x0F, 0x03, 0x00, 0x10, +/* 0000B3D0 */ 0x09, 0x09, 0x00, 0x8E, 0x01, 0x4C, 0x00, 0x4B, 0x00, 0x09, 0x64, 0x01, 0xA8, 0x10, 0x47, 0x07, +/* 0000B3E0 */ 0x10, 0xA8, 0x10, 0x47, 0x08, 0x10, 0x8E, 0x01, 0x39, 0x10, 0x4B, 0x10, 0x0F, 0x03, 0x00, 0x10, +/* 0000B3F0 */ 0x09, 0x73, 0x00, 0x8E, 0x01, 0x3D, 0x10, 0x4B, 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, +/* 0000B400 */ 0x01, 0x10, 0x10, 0x47, 0x07, 0x10, 0x8E, 0x01, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x03, +/* 0000B410 */ 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, 0x07, 0xE0, 0x12, 0x00, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x10, +/* 0000B420 */ 0x10, 0x54, 0x09, 0x10, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x38, 0x00, 0x97, 0x10, 0x09, 0x03, 0x47, +/* 0000B430 */ 0x08, 0x10, 0x8E, 0x01, 0x0C, 0x10, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, 0x23, 0x11, +/* 0000B440 */ 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x07, 0x47, 0x11, 0x04, 0x01, 0x04, 0x01, 0x12, 0x08, 0x2F, 0x11, +/* 0000B450 */ 0x11, 0x12, 0x2F, 0x11, 0x11, 0x05, 0x5C, 0x03, 0x11, 0x5C, 0x04, 0x05, 0x1F, 0x05, 0x10, 0x10, +/* 0000B460 */ 0x47, 0x07, 0x10, 0x09, 0x3C, 0x00, 0x8E, 0x01, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x03, +/* 0000B470 */ 0x00, 0x5C, 0x00, 0x11, 0x8E, 0x01, 0x3D, 0x12, 0x4B, 0x12, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, +/* 0000B480 */ 0x1F, 0x01, 0x12, 0x12, 0x5C, 0x01, 0x12, 0xE0, 0x12, 0x01, 0x5C, 0x02, 0x12, 0x1F, 0x03, 0x10, +/* 0000B490 */ 0x10, 0x54, 0x0A, 0x10, 0x97, 0x10, 0x0A, 0x03, 0x47, 0x07, 0x10, 0x97, 0x10, 0x0A, 0x06, 0x47, +/* 0000B4A0 */ 0x08, 0x10, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x08, 0x10, 0x09, 0x0F, 0x00, 0x01, 0x32, 0x01, 0x01, +/* 0000B4B0 */ 0x4C, 0x07, 0x8E, 0x01, 0x4C, 0x00, 0x4B, 0x00, 0x09, 0x85, 0x00, 0xD6, 0x00, 0x10, 0x54, 0x0B, +/* 0000B4C0 */ 0x10, 0x8E, 0x01, 0x36, 0x10, 0x97, 0x10, 0x10, 0x07, 0x54, 0x0C, 0x10, 0xA8, 0x10, 0x14, 0x03, +/* 0000B4D0 */ 0x00, 0x0C, 0x10, 0x09, 0x1F, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, +/* 0000B4E0 */ 0x02, 0x08, 0x1F, 0x03, 0x10, 0x0B, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x8E, 0x01, 0x4C, 0x00, +/* 0000B4F0 */ 0x4B, 0x00, 0x09, 0x4B, 0x00, 0x97, 0x10, 0x0C, 0x08, 0x54, 0x0D, 0x10, 0xA8, 0x10, 0x15, 0x03, +/* 0000B500 */ 0x00, 0x0D, 0x10, 0x09, 0x19, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, +/* 0000B510 */ 0x02, 0x0D, 0x1F, 0x03, 0x10, 0x0B, 0x01, 0x32, 0x01, 0x01, 0x4C, 0x10, 0x09, 0x16, 0x00, 0x07, +/* 0000B520 */ 0x03, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x10, 0x0B, 0x01, +/* 0000B530 */ 0x32, 0x01, 0x01, 0x4C, 0x10, 0x8E, 0x01, 0x4C, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, +/* 0000B540 */ 0x24, 0x00, 0xFE, 0x17, 0x03, 0xFE, 0x39, 0x02, 0x28, 0xFE, 0xAC, 0x03, 0x00, 0x0E, 0xFE, 0xAD, +/* 0000B550 */ 0x03, 0x00, 0xFE, 0xEC, 0x79, 0x1B, 0x0E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x09, 0x00, +/* 0000B560 */ 0x31, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, 0x23, 0x00, 0x0D, 0x00, 0x7A, 0x00, 0x13, 0x00, +/* 0000B570 */ 0x29, 0x00, 0x1E, 0x00, 0x6A, 0x00, 0x07, 0x00, 0xB8, 0x00, 0x07, 0x00, 0x26, 0x00, 0x34, 0x00, +/* 0000B580 */ 0xC6, 0x00, 0x2E, 0x00, 0x5C, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x29, 0x00, 0x0A, 0x00, +/* 0000B590 */ 0x2B, 0x00, 0x06, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x8D, 0x00, 0x06, 0x00, 0x28, 0x01, 0x0B, 0x00, +/* 0000B5A0 */ 0x56, 0x00, 0x0A, 0x00, 0x84, 0x00, 0x16, 0x00, 0x54, 0x00, 0x09, 0x00, 0x31, 0x00, 0x07, 0x00, +/* 0000B5B0 */ 0x42, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x19, 0x00, 0x6B, 0x00, 0x16, 0x00, 0x5B, 0x00, 0x0B, 0x00, +/* 0000B5C0 */ 0x22, 0x00, 0x00, 0xC7, 0xB5, 0x00, 0x00, 0xBF, 0x4C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xCA, +/* 0000B5D0 */ 0x02, 0x2C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xAE, 0x03, 0x2D, 0xFE, 0xFC, 0x7E, 0xFF, 0x00, 0x10, +/* 0000B5E0 */ 0x01, 0x00, 0x03, 0x03, 0xFE, 0xFC, 0x7E, 0xF9, 0xF9, 0x01, 0x04, 0x05, 0x08, 0x18, 0x16, 0x01, +/* 0000B5F0 */ 0x01, 0x07, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0xAB, 0x03, 0x05, 0xFE, 0xAF, 0x03, 0x54, 0x8E, +/* 0000B600 */ 0x01, 0x39, 0x08, 0x4B, 0x08, 0x0F, 0x03, 0x00, 0x08, 0x09, 0x23, 0x00, 0x47, 0x00, 0x02, 0x01, +/* 0000B610 */ 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x08, +/* 0000B620 */ 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, 0x09, 0x25, 0x00, 0x09, 0x20, 0x00, 0x47, +/* 0000B630 */ 0x00, 0x02, 0x01, 0x04, 0x01, 0x08, 0x05, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x04, 0x01, +/* 0000B640 */ 0x04, 0x01, 0x08, 0x06, 0x2F, 0x00, 0x00, 0x08, 0x2F, 0x00, 0x00, 0x02, 0x09, 0x02, 0x00, 0xA8, +/* 0000B650 */ 0x00, 0x24, 0x00, 0xFE, 0x31, 0x7F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x2A, 0x00, 0x23, +/* 0000B660 */ 0x00, 0x53, 0x00, 0x22, 0x00, 0x46, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0x00, 0x80, 0xC6, 0x02, 0xFE, +/* 0000B670 */ 0x97, 0x02, 0x32, 0xA0, 0x41, 0xD1, 0x00, 0x29, 0xFE, 0xF5, 0x75, 0x01, 0xFF, 0x00, 0x10, 0x01, +/* 0000B680 */ 0x00, 0x01, 0x01, 0xFE, 0xF5, 0x75, 0xFE, 0x13, 0x03, 0xFE, 0x13, 0x03, 0x01, 0x06, 0x04, 0x07, +/* 0000B690 */ 0x08, 0x1E, 0x1E, 0x01, 0x06, 0x04, 0x05, 0x06, 0x07, 0x08, 0x5B, 0x4F, 0x07, 0x96, 0x02, 0x07, +/* 0000B6A0 */ 0x8E, 0x01, 0x0A, 0x07, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x08, 0x5C, 0x01, 0x08, 0x5C, +/* 0000B6B0 */ 0x02, 0x02, 0x1F, 0x03, 0x07, 0x07, 0x96, 0x02, 0x07, 0x8E, 0x01, 0x0C, 0x07, 0x07, 0x04, 0x00, +/* 0000B6C0 */ 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x1C, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x18, 0x08, 0x07, 0x02, +/* 0000B6D0 */ 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x35, 0x09, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x08, 0x08, 0x5C, +/* 0000B6E0 */ 0x02, 0x08, 0xD4, 0x00, 0x08, 0x5C, 0x03, 0x08, 0x1F, 0x04, 0xFF, 0x07, 0x92, 0x02, 0x00, 0x09, +/* 0000B6F0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xA8, 0x03, 0xFE, 0x0B, 0x76, 0x04, 0x05, 0x00, 0x00, +/* 0000B700 */ 0x00, 0x19, 0x00, 0x31, 0x00, 0x33, 0x00, 0xB6, 0x02, 0x08, 0x00, 0x15, 0x00, 0x00, 0x12, 0xB7, +/* 0000B710 */ 0x00, 0x00, 0xBF, 0x5D, 0x80, 0x00, 0x80, 0xC6, 0x02, 0xFE, 0x99, 0x02, 0x6B, 0xA2, 0x41, 0xD1, +/* 0000B720 */ 0x00, 0x2A, 0xFE, 0x9F, 0x76, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x9F, 0x76, +/* 0000B730 */ 0xFE, 0x48, 0x02, 0xFE, 0x48, 0x02, 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x25, 0x25, 0x02, 0x08, +/* 0000B740 */ 0x05, 0x06, 0x07, 0x07, 0x08, 0x71, 0x4F, 0x08, 0x96, 0x02, 0x08, 0x4F, 0x08, 0x96, 0x03, 0x08, +/* 0000B750 */ 0x8E, 0x02, 0x35, 0x08, 0x97, 0x08, 0x08, 0x04, 0x96, 0x02, 0x08, 0x8E, 0x02, 0x0A, 0x08, 0x07, +/* 0000B760 */ 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCB, 0x09, 0x5C, 0x01, 0x09, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x08, +/* 0000B770 */ 0x08, 0x96, 0x03, 0x08, 0x8E, 0x02, 0x0C, 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, +/* 0000B780 */ 0x1C, 0x09, 0x5C, 0x01, 0x09, 0x8E, 0x02, 0x18, 0x09, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x92, +/* 0000B790 */ 0x02, 0x0A, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x09, 0x09, 0x5C, 0x02, 0x09, 0xD4, 0x00, 0x09, 0x5C, +/* 0000B7A0 */ 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, 0x8E, 0x01, 0x02, 0x08, 0x4B, 0x08, 0x92, 0x03, 0x09, 0x9C, +/* 0000B7B0 */ 0x09, 0x08, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xA9, 0x03, 0xFE, 0xAA, 0x03, 0xFE, 0xBF, 0x76, +/* 0000B7C0 */ 0x05, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x56, 0x00, 0x19, 0x00, 0x45, 0x00, 0x32, 0x00, 0x58, +/* 0000B7D0 */ 0x01, 0x0F, 0x00, 0x34, 0x00, 0x00, 0xDA, 0xB7, 0x00, 0x00, 0xBF, 0x4C, 0x80, 0x00, 0x00, 0xC4, +/* 0000B7E0 */ 0x00, 0xFE, 0x9D, 0x02, 0x68, 0xA2, 0x41, 0xD1, 0x00, 0x2B, 0xFE, 0xB6, 0x77, 0xFF, 0x00, 0x10, +/* 0000B7F0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0xB6, 0x77, 0xEC, 0xEC, 0x41, 0x04, 0x03, 0x06, 0x0D, 0x0D, 0x03, +/* 0000B800 */ 0x02, 0x05, 0x06, 0xFE, 0x0A, 0x03, 0x25, 0x4F, 0x04, 0x8E, 0x01, 0x02, 0x06, 0x4B, 0x06, 0x97, +/* 0000B810 */ 0x06, 0x06, 0x03, 0x54, 0x04, 0x06, 0x15, 0x03, 0x00, 0x04, 0x02, 0x09, 0x0A, 0x00, 0x8E, 0x01, +/* 0000B820 */ 0x03, 0x06, 0x4B, 0x06, 0x9C, 0x03, 0x06, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xDD, 0x77, 0x04, +/* 0000B830 */ 0x02, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x48, 0x00, 0x08, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x4F, 0x00, +/* 0000B840 */ 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x72, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, +/* 0000B850 */ 0xFE, 0xA7, 0x03, 0x28, 0xFE, 0xCD, 0x6B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xCD, +/* 0000B860 */ 0x6B, 0x96, 0x96, 0x01, 0x05, 0x03, 0x06, 0x05, 0x0F, 0x0F, 0x01, 0x02, 0x05, 0x08, 0x29, 0x5B, +/* 0000B870 */ 0x04, 0xB3, 0x04, 0x04, 0x8E, 0x01, 0x33, 0x06, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, +/* 0000B880 */ 0x04, 0x8E, 0x01, 0x4B, 0x07, 0x4B, 0x07, 0x5C, 0x02, 0x07, 0x5C, 0x03, 0x03, 0x1F, 0x04, 0x00, +/* 0000B890 */ 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x0B, 0x6C, 0x02, 0x05, 0x00, 0x00, 0x00, +/* 0000B8A0 */ 0x22, 0x00, 0x57, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x6C, 0x02, 0x08, +/* 0000B8B0 */ 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA6, 0x03, 0x27, 0xFE, 0x27, 0x6A, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000B8C0 */ 0x03, 0x02, 0xFE, 0x27, 0x6A, 0xCC, 0xCC, 0x01, 0x06, 0x03, 0x07, 0x06, 0x13, 0x12, 0x01, 0x02, +/* 0000B8D0 */ 0x06, 0x08, 0x36, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, +/* 0000B8E0 */ 0x04, 0x07, 0x8E, 0x01, 0x32, 0x07, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8E, +/* 0000B8F0 */ 0x01, 0x49, 0x08, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0x1F, 0x05, +/* 0000B900 */ 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x65, 0x6A, 0x03, 0x05, 0x00, 0x00, +/* 0000B910 */ 0x00, 0x0A, 0x00, 0x23, 0x00, 0x25, 0x00, 0x6A, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, +/* 0000B920 */ 0x00, 0xFE, 0x66, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA5, 0x03, 0x26, 0xFE, 0x4D, 0x68, +/* 0000B930 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x4D, 0x68, 0xC8, 0xC8, 0x01, 0x06, 0x03, 0x07, +/* 0000B940 */ 0x06, 0x13, 0x12, 0x01, 0x02, 0x06, 0x08, 0x36, 0x5B, 0x05, 0xB3, 0x05, 0x05, 0x15, 0x05, 0x00, +/* 0000B950 */ 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, 0x01, 0x32, 0x07, 0x07, 0x05, 0x00, 0x5C, 0x00, +/* 0000B960 */ 0x02, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x47, 0x08, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x5C, 0x03, 0x03, +/* 0000B970 */ 0x5C, 0x04, 0x04, 0x1F, 0x05, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x89, +/* 0000B980 */ 0x68, 0x03, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x23, 0x00, 0x25, 0x00, 0x68, 0x00, 0x00, 0xBF, +/* 0000B990 */ 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x60, 0x02, 0x08, 0xA2, 0x41, 0xC3, 0x00, 0xFE, 0xA4, +/* 0000B9A0 */ 0x03, 0x25, 0xFE, 0x83, 0x66, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x02, 0xFE, 0x83, 0x66, 0xC0, +/* 0000B9B0 */ 0xC0, 0x01, 0x06, 0x03, 0x07, 0x06, 0x13, 0x12, 0x01, 0x02, 0x06, 0x08, 0x36, 0x5B, 0x05, 0xB3, +/* 0000B9C0 */ 0x05, 0x05, 0x15, 0x05, 0x00, 0x04, 0x02, 0xA8, 0x07, 0x47, 0x04, 0x07, 0x8E, 0x01, 0x32, 0x07, +/* 0000B9D0 */ 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x45, 0x08, 0x4B, 0x08, 0x5C, +/* 0000B9E0 */ 0x02, 0x08, 0x5C, 0x03, 0x03, 0x5C, 0x04, 0x04, 0x1F, 0x05, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, +/* 0000B9F0 */ 0x00, 0x24, 0x00, 0xFE, 0xBB, 0x66, 0x03, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x23, 0x00, 0x25, +/* 0000BA00 */ 0x00, 0x64, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x42, 0x02, 0x1D, 0xA2, +/* 0000BA10 */ 0x41, 0xC1, 0x00, 0xFE, 0xFA, 0x02, 0x24, 0xFE, 0xE3, 0x60, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 0000BA20 */ 0x03, 0xFE, 0xE3, 0x60, 0xFE, 0x60, 0x03, 0xFE, 0x60, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, 0x50, +/* 0000BA30 */ 0x4D, 0x01, 0x08, 0x04, 0x04, 0x04, 0x04, 0x0B, 0x08, 0x06, 0xFE, 0x72, 0x03, 0x05, 0xFE, 0x64, +/* 0000BA40 */ 0x03, 0x05, 0xFE, 0xA1, 0x03, 0x06, 0xFE, 0xA2, 0x03, 0x05, 0xFE, 0xA3, 0x03, 0xFE, 0x0E, 0x01, +/* 0000BA50 */ 0xA8, 0x0A, 0x8E, 0x01, 0x07, 0x0C, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x1F, +/* 0000BA60 */ 0x02, 0x0C, 0x0C, 0x47, 0x08, 0x0C, 0x2C, 0x0C, 0x09, 0x15, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x66, +/* 0000BA70 */ 0x00, 0x61, 0x0C, 0x09, 0x00, 0x47, 0x0A, 0x0C, 0x2C, 0x0C, 0x0A, 0x15, 0x03, 0x00, 0x0C, 0x03, +/* 0000BA80 */ 0x09, 0x54, 0x00, 0x8E, 0x01, 0x31, 0x0D, 0x6C, 0x0C, 0x0D, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000BA90 */ 0x0D, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0C, 0x0C, 0x47, 0x0A, 0x0C, 0x15, 0x03, 0x00, 0x0A, 0x04, +/* 0000BAA0 */ 0x09, 0x34, 0x00, 0x15, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x2C, 0x00, 0x8E, 0x01, 0x09, 0x0D, 0x6C, +/* 0000BAB0 */ 0x0C, 0x0D, 0x02, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x0D, 0x8E, 0x01, 0x11, 0x0E, 0x07, 0x02, 0x00, +/* 0000BAC0 */ 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0A, 0x1F, 0x02, 0x0E, 0x0E, 0x5C, 0x01, 0x0E, 0x5C, 0x02, 0x06, +/* 0000BAD0 */ 0x5C, 0x03, 0x07, 0x1F, 0x04, 0xFF, 0x0C, 0x2C, 0x0C, 0x0A, 0x14, 0x0B, 0x00, 0x0C, 0x03, 0x09, +/* 0000BAE0 */ 0x00, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x05, 0x09, 0x44, 0x00, 0x8E, 0x01, 0x08, 0x0C, 0x07, 0x04, +/* 0000BAF0 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x2B, 0x0D, 0x5C, 0x02, 0x0D, 0x8E, 0x01, +/* 0000BB00 */ 0x09, 0x0E, 0x6C, 0x0D, 0x0E, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0E, 0x8E, 0x01, 0x30, 0x0F, +/* 0000BB10 */ 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x0F, 0x0F, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x0D, +/* 0000BB20 */ 0x0D, 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0x00, 0x0C, 0x09, 0x31, 0x00, 0x09, 0x2C, 0x00, 0x8E, 0x01, +/* 0000BB30 */ 0x08, 0x0C, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x2C, 0x0D, 0x5C, +/* 0000BB40 */ 0x02, 0x0D, 0x8E, 0x01, 0x30, 0x0D, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x0D, 0x0D, +/* 0000BB50 */ 0x5C, 0x03, 0x0D, 0x1F, 0x04, 0x00, 0x0C, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x64, +/* 0000BB60 */ 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x5F, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x1E, 0x61, 0x0B, 0x02, 0x00, +/* 0000BB70 */ 0x00, 0x00, 0x14, 0x00, 0x34, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0B, 0x00, +/* 0000BB80 */ 0x36, 0x00, 0x18, 0x00, 0x37, 0x00, 0x10, 0x00, 0x4A, 0x00, 0x2C, 0x00, 0x96, 0x00, 0x13, 0x00, +/* 0000BB90 */ 0x4C, 0x00, 0x44, 0x00, 0x93, 0x00, 0x2E, 0x00, 0x64, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, +/* 0000BBA0 */ 0xC4, 0x00, 0xFE, 0x34, 0x02, 0x28, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3F, 0x03, 0x23, 0xFE, 0x0F, +/* 0000BBB0 */ 0x5F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x0F, 0x5F, 0xFE, 0x8C, 0x01, 0xFE, 0x8C, +/* 0000BBC0 */ 0x01, 0x01, 0x07, 0x05, 0x0A, 0x03, 0x26, 0x25, 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0x09, 0x07, +/* 0000BBD0 */ 0x05, 0xFE, 0xF3, 0x02, 0x08, 0x7F, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0A, +/* 0000BBE0 */ 0x14, 0x03, 0x00, 0x05, 0x0A, 0x09, 0x15, 0x00, 0x8E, 0x01, 0x09, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, +/* 0000BBF0 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0A, 0x8E, 0x01, 0x09, +/* 0000BC00 */ 0x0B, 0x6C, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x05, 0x1F, 0x02, +/* 0000BC10 */ 0x0A, 0x0A, 0x47, 0x08, 0x0A, 0x0F, 0x03, 0x00, 0x08, 0x09, 0x0C, 0x00, 0x61, 0x0A, 0x08, 0x02, +/* 0000BC20 */ 0x15, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x15, 0x00, 0x8E, 0x01, 0x09, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, +/* 0000BC30 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, 0x0A, 0x8E, 0x01, 0x07, +/* 0000BC40 */ 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x00, 0x0A, 0x09, 0x02, +/* 0000BC50 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5A, 0x02, 0xFE, 0x35, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0x40, +/* 0000BC60 */ 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x15, 0x00, 0x40, 0x00, 0x18, 0x00, +/* 0000BC70 */ 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x15, 0x00, 0x40, 0x00, 0x16, 0x00, 0x2C, 0x00, 0x00, 0xBF, +/* 0000BC80 */ 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x27, 0x02, 0x24, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3E, +/* 0000BC90 */ 0x03, 0x22, 0xFE, 0x4B, 0x5D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x4B, 0x5D, 0xFE, +/* 0000BCA0 */ 0x9A, 0x01, 0xFE, 0x9A, 0x01, 0x01, 0x08, 0x05, 0x0B, 0x04, 0x27, 0x26, 0x01, 0x02, 0x03, 0x03, +/* 0000BCB0 */ 0x03, 0x03, 0x0A, 0x07, 0x05, 0xFE, 0xF3, 0x02, 0x08, 0x82, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, +/* 0000BCC0 */ 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, 0x05, 0x0B, 0x09, 0x15, 0x00, 0x8E, 0x01, 0x09, 0x0C, +/* 0000BCD0 */ 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, +/* 0000BCE0 */ 0x0B, 0x8E, 0x01, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, +/* 0000BCF0 */ 0x01, 0x05, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x0C, 0x00, +/* 0000BD00 */ 0x61, 0x0B, 0x09, 0x02, 0x15, 0x03, 0x00, 0x0B, 0x03, 0x09, 0x15, 0x00, 0x8E, 0x01, 0x09, 0x0C, +/* 0000BD10 */ 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0xFF, +/* 0000BD20 */ 0x0B, 0x8E, 0x01, 0x34, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, 0x07, 0x5C, 0x02, +/* 0000BD30 */ 0x08, 0x1F, 0x03, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5A, 0x02, 0xFE, +/* 0000BD40 */ 0x35, 0x02, 0xFE, 0x63, 0x02, 0xFE, 0x85, 0x5D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, +/* 0000BD50 */ 0x00, 0x15, 0x00, 0x40, 0x00, 0x18, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x15, 0x00, 0x40, +/* 0000BD60 */ 0x00, 0x19, 0x00, 0x31, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0x89, 0xC6, 0x12, 0xFE, 0x14, 0x02, +/* 0000BD70 */ 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x20, 0x03, 0x20, 0xFE, 0xB6, 0x59, 0x01, 0xFF, 0x00, 0x10, +/* 0000BD80 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xB6, 0x59, 0xFE, 0x6F, 0x03, 0xFE, 0x6F, 0x03, 0x04, 0x09, 0x0A, +/* 0000BD90 */ 0x10, 0x05, 0x20, 0x20, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0x0D, 0x0E, 0x0F, 0x01, 0x00, +/* 0000BDA0 */ 0x08, 0x06, 0xFE, 0x9C, 0x03, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0C, 0x06, 0xFE, +/* 0000BDB0 */ 0x14, 0x03, 0x07, 0x6D, 0x96, 0x04, 0x0B, 0x96, 0x05, 0x0C, 0xCD, 0x10, 0x00, 0x96, 0x02, 0x10, +/* 0000BDC0 */ 0x96, 0x03, 0x02, 0x8E, 0x01, 0x0C, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x1C, +/* 0000BDD0 */ 0x11, 0x5C, 0x01, 0x11, 0x5C, 0x02, 0x0A, 0xD4, 0x00, 0x11, 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, +/* 0000BDE0 */ 0x10, 0x8E, 0x01, 0x1B, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x92, 0x02, 0x11, 0x5C, 0x01, +/* 0000BDF0 */ 0x11, 0x5C, 0x02, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, +/* 0000BE00 */ 0x00, 0x92, 0x03, 0x12, 0x7A, 0x12, 0x11, 0x00, 0x7A, 0x07, 0x11, 0x01, 0x7A, 0x07, 0x11, 0x02, +/* 0000BE10 */ 0x5C, 0x03, 0x11, 0x1F, 0x04, 0xFF, 0x10, 0x92, 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000BE20 */ 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000BE30 */ 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xFE, 0xB6, 0x01, 0xFE, +/* 0000BE40 */ 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0x9D, 0x03, 0xFE, 0x9E, 0x03, 0xFE, 0x9F, 0x03, 0xFE, 0xA0, +/* 0000BE50 */ 0x03, 0xFE, 0x09, 0x5A, 0x06, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x19, 0x00, 0x03, 0x00, 0x17, +/* 0000BE60 */ 0x00, 0x1E, 0x00, 0x70, 0x02, 0x36, 0x00, 0x68, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x72, 0xBE, +/* 0000BE70 */ 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x29, 0xD4, 0x10, 0xFE, 0x17, 0x02, 0x41, 0xB2, 0x41, 0xD1, +/* 0000BE80 */ 0x00, 0x21, 0xFE, 0x72, 0x5A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x72, 0x5A, 0xFE, +/* 0000BE90 */ 0x2C, 0x02, 0xFE, 0x2C, 0x02, 0x45, 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x07, 0x05, 0x05, +/* 0000BEA0 */ 0x05, 0x05, 0x01, 0x01, 0x0E, 0x0F, 0x08, 0x06, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0x12, 0x03, 0x0C, +/* 0000BEB0 */ 0x06, 0xFE, 0x14, 0x03, 0x06, 0xFE, 0x13, 0x03, 0x0B, 0x07, 0x01, 0x01, 0xA0, 0xA8, 0x0D, 0xE5, +/* 0000BEC0 */ 0x82, 0x00, 0x8E, 0x02, 0x2E, 0x10, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x0B, 0x8E, +/* 0000BED0 */ 0x01, 0x04, 0x11, 0x5C, 0x02, 0x11, 0xA8, 0x11, 0x5C, 0x03, 0x11, 0x8E, 0x01, 0x05, 0x11, 0x5C, +/* 0000BEE0 */ 0x04, 0x11, 0x1F, 0x05, 0x10, 0x10, 0x47, 0x0D, 0x10, 0x61, 0x10, 0x0D, 0x00, 0x0F, 0x03, 0x00, +/* 0000BEF0 */ 0x10, 0x09, 0x4C, 0x00, 0x8E, 0x02, 0x1B, 0x10, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, +/* 0000BF00 */ 0x02, 0x11, 0x5C, 0x01, 0x11, 0x8E, 0x01, 0x03, 0x11, 0x5C, 0x02, 0x11, 0xCC, 0x00, 0x00, 0x00, +/* 0000BF10 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x61, 0x12, 0x0D, 0x00, 0x7A, 0x12, 0x11, +/* 0000BF20 */ 0x01, 0x7A, 0x05, 0x11, 0x02, 0x7A, 0x05, 0x11, 0x03, 0x7A, 0x08, 0x11, 0x04, 0x5C, 0x03, 0x11, +/* 0000BF30 */ 0x1F, 0x04, 0xFF, 0x10, 0x8E, 0x01, 0x03, 0x10, 0x2F, 0x10, 0x10, 0x0A, 0x94, 0x01, 0x03, 0x10, +/* 0000BF40 */ 0xE9, 0x09, 0x15, 0x00, 0xE7, 0x0C, 0x06, 0x8E, 0x02, 0x29, 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000BF50 */ 0x02, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0xFF, 0x10, 0xE9, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x18, 0x00, +/* 0000BF60 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, +/* 0000BF70 */ 0xB5, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xFE, 0x21, 0x02, 0xFE, +/* 0000BF80 */ 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xA8, 0x5A, 0x07, 0x05, +/* 0000BF90 */ 0x00, 0x00, 0x00, 0x27, 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x2B, 0x00, 0x40, 0x00, 0x8D, 0x00, 0x12, +/* 0000BFA0 */ 0x00, 0x33, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x14, 0x00, 0x8F, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, +/* 0000BFB0 */ 0x81, 0xC6, 0x02, 0xFE, 0xF0, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1F, 0x03, 0x1E, 0xFE, +/* 0000BFC0 */ 0x7F, 0x55, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x7F, 0x55, 0xFE, 0x31, 0x04, +/* 0000BFD0 */ 0xFE, 0x31, 0x04, 0x01, 0x08, 0x05, 0x0A, 0x05, 0x2C, 0x2A, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, +/* 0000BFE0 */ 0x07, 0x08, 0x09, 0x06, 0xFE, 0x72, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x08, 0x8B, 0x4F, 0x06, 0x4F, +/* 0000BFF0 */ 0x0A, 0x96, 0x02, 0x0A, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x06, 0x00, 0xCD, +/* 0000C000 */ 0x00, 0x00, 0x09, 0x71, 0x00, 0x2C, 0x0A, 0x05, 0x14, 0x03, 0x00, 0x0A, 0x03, 0x09, 0x0A, 0x00, +/* 0000C010 */ 0xCD, 0x0A, 0x01, 0xA1, 0x00, 0x05, 0x0A, 0x47, 0x05, 0x0A, 0x8E, 0x01, 0x31, 0x0B, 0x6C, 0x0A, +/* 0000C020 */ 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0x0A, 0x0A, 0x47, +/* 0000C030 */ 0x05, 0x0A, 0x8E, 0x01, 0x31, 0x0B, 0x6C, 0x0A, 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, +/* 0000C040 */ 0x61, 0x0C, 0x05, 0x02, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x0A, 0x0A, 0x54, 0x06, 0x0A, 0xCD, 0x0A, +/* 0000C050 */ 0x00, 0x96, 0x02, 0x0A, 0x8E, 0x01, 0x28, 0x0A, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x04, 0x5C, 0x01, +/* 0000C060 */ 0x05, 0x5C, 0x02, 0x06, 0xD4, 0x00, 0x0B, 0x5C, 0x03, 0x0B, 0x1F, 0x04, 0xFF, 0x0A, 0x92, 0x02, +/* 0000C070 */ 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x66, 0x03, 0xFE, 0x61, 0x02, 0xF3, 0xFE, +/* 0000C080 */ 0x99, 0x03, 0xFE, 0xB2, 0x55, 0x0A, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x06, 0x00, +/* 0000C090 */ 0x1E, 0x00, 0x0B, 0x00, 0x2F, 0x00, 0x0A, 0x00, 0x28, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x1C, 0x00, +/* 0000C0A0 */ 0x70, 0x00, 0x06, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x8F, 0x02, 0x08, 0x00, 0x11, 0x00, 0x00, 0xB3, +/* 0000C0B0 */ 0xC0, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xFF, 0x01, 0x2A, 0xA2, 0x41, +/* 0000C0C0 */ 0xD1, 0x00, 0x1F, 0xFE, 0x31, 0x57, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x31, 0x57, +/* 0000C0D0 */ 0xFE, 0x61, 0x02, 0xFE, 0x61, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x4C, 0x4A, 0x02, 0x08, 0x04, +/* 0000C0E0 */ 0x04, 0x04, 0x04, 0x0A, 0x06, 0xFE, 0x6D, 0x03, 0x06, 0xFE, 0x9A, 0x03, 0x07, 0x05, 0xFE, 0x9B, +/* 0000C0F0 */ 0x03, 0x08, 0x01, 0xFF, 0xFD, 0x4F, 0x09, 0x2C, 0x0B, 0x08, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, +/* 0000C100 */ 0x0B, 0x00, 0x2C, 0x0B, 0x08, 0x15, 0x0B, 0x00, 0x0B, 0x03, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, +/* 0000C110 */ 0x08, 0x04, 0x09, 0x15, 0x00, 0x8E, 0x02, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x00, 0x07, 0x02, 0x00, +/* 0000C120 */ 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x05, 0x1F, 0x02, 0xFF, 0x0B, 0x8E, 0x02, 0x31, 0x0C, 0x6C, 0x0B, +/* 0000C130 */ 0x0C, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x5C, 0x01, 0x08, 0x1F, 0x02, 0x0B, 0x0B, 0x47, +/* 0000C140 */ 0x09, 0x0B, 0x8E, 0x02, 0x3F, 0x0B, 0x4B, 0x0B, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, +/* 0000C150 */ 0x09, 0x1F, 0x02, 0x0B, 0x0B, 0x0F, 0x29, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x8E, 0x02, 0x09, 0x0C, +/* 0000C160 */ 0x6C, 0x0B, 0x0C, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, 0x8E, 0x02, 0x11, 0x0D, 0x07, 0x02, +/* 0000C170 */ 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0D, 0x0D, 0x5C, 0x01, 0x0D, 0x1F, 0x02, +/* 0000C180 */ 0xFF, 0x0B, 0x8E, 0x02, 0x09, 0x0C, 0x6C, 0x0B, 0x0C, 0x03, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0C, +/* 0000C190 */ 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0B, 0x0B, 0x47, 0x09, 0x0B, 0xA8, 0x0B, 0x15, 0x03, 0x00, 0x09, +/* 0000C1A0 */ 0x0B, 0x09, 0x4A, 0x00, 0x8E, 0x02, 0x0C, 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x02, +/* 0000C1B0 */ 0x1D, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, 0x01, 0x02, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, +/* 0000C1C0 */ 0x09, 0x1F, 0x04, 0x0B, 0x0B, 0x14, 0x03, 0x00, 0x0B, 0x07, 0x09, 0x21, 0x00, 0x8E, 0x02, 0x0C, +/* 0000C1D0 */ 0x0B, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x06, 0x8E, 0x02, 0x1E, 0x0C, 0x5C, 0x01, 0x0C, 0x8E, 0x01, +/* 0000C1E0 */ 0x02, 0x0C, 0x4B, 0x0C, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x0B, 0xA8, 0x00, +/* 0000C1F0 */ 0x24, 0x00, 0xFE, 0x58, 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x62, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x51, +/* 0000C200 */ 0x57, 0x09, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x65, 0x00, 0x15, 0x00, 0x47, 0x00, 0x18, 0x00, +/* 0000C210 */ 0x32, 0x00, 0x1A, 0x00, 0x35, 0x00, 0x26, 0x00, 0x4B, 0x00, 0x18, 0x00, 0x37, 0x00, 0x33, 0x00, +/* 0000C220 */ 0x65, 0x00, 0x23, 0x00, 0x46, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0xE5, +/* 0000C230 */ 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1E, 0x03, 0x1D, 0xFE, 0x0A, 0x54, 0xFF, 0x00, 0x10, +/* 0000C240 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0A, 0x54, 0xF8, 0xF8, 0x01, 0x05, 0x04, 0x06, 0x04, 0x1D, 0x1C, +/* 0000C250 */ 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0x05, 0x08, 0x07, 0x5C, 0x8E, 0x01, 0x31, 0x07, 0x6C, 0x06, +/* 0000C260 */ 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x06, 0x06, 0x47, +/* 0000C270 */ 0x04, 0x06, 0x8E, 0x01, 0x41, 0x06, 0x4B, 0x06, 0x0F, 0x11, 0x00, 0x06, 0x09, 0x00, 0x00, 0x8E, +/* 0000C280 */ 0x01, 0x04, 0x06, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x06, 0x8E, 0x01, 0x09, +/* 0000C290 */ 0x07, 0x6C, 0x06, 0x07, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x07, 0x5C, 0x01, 0x04, 0x8E, 0x01, +/* 0000C2A0 */ 0x41, 0x08, 0x4B, 0x08, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x06, 0x06, 0x44, 0x00, 0x06, 0x03, 0x09, +/* 0000C2B0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5D, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x3C, 0x54, 0x05, +/* 0000C2C0 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x29, 0x00, 0x0D, 0x00, 0x25, 0x00, 0x0E, 0x00, 0x2F, 0x00, +/* 0000C2D0 */ 0x27, 0x00, 0x48, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0xAA, 0x01, 0x04, +/* 0000C2E0 */ 0xA1, 0x41, 0xC1, 0x00, 0xFE, 0x1D, 0x03, 0x1C, 0xFE, 0x06, 0x41, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000C2F0 */ 0x01, 0x01, 0xFE, 0x06, 0x41, 0xFE, 0xFE, 0x12, 0xFE, 0xFE, 0x12, 0x41, 0x16, 0x25, 0x38, 0x04, +/* 0000C300 */ 0xB0, 0x9C, 0x01, 0x01, 0x37, 0x05, 0xFE, 0x77, 0x03, 0x05, 0xFE, 0x78, 0x03, 0x05, 0xFE, 0x79, +/* 0000C310 */ 0x03, 0x06, 0xFE, 0x7A, 0x03, 0x06, 0xFE, 0x7B, 0x03, 0x05, 0xFE, 0x7C, 0x03, 0x05, 0xFE, 0x7D, +/* 0000C320 */ 0x03, 0x05, 0xFE, 0x7E, 0x03, 0x05, 0xFE, 0x7F, 0x03, 0x05, 0xFE, 0x80, 0x03, 0x05, 0xFE, 0x81, +/* 0000C330 */ 0x03, 0x05, 0xFE, 0x82, 0x03, 0x05, 0xFE, 0x83, 0x03, 0x05, 0xFE, 0x84, 0x03, 0x05, 0xFE, 0x85, +/* 0000C340 */ 0x03, 0x05, 0xFE, 0x86, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0x87, 0x03, 0x05, 0xFE, 0x88, +/* 0000C350 */ 0x03, 0x05, 0xFE, 0x89, 0x03, 0x05, 0xFE, 0x8A, 0x03, 0x05, 0xFE, 0x8B, 0x03, 0x05, 0xFE, 0x8C, +/* 0000C360 */ 0x03, 0x05, 0xFE, 0x8D, 0x03, 0x05, 0xFE, 0x8E, 0x03, 0x05, 0xFE, 0x8F, 0x03, 0x05, 0xFE, 0x90, +/* 0000C370 */ 0x03, 0x05, 0xFE, 0x91, 0x03, 0x05, 0xFE, 0x92, 0x03, 0x05, 0xFE, 0x93, 0x03, 0x05, 0xFE, 0x94, +/* 0000C380 */ 0x03, 0x05, 0xFE, 0x95, 0x03, 0x05, 0xFE, 0x96, 0x03, 0x05, 0xFE, 0x97, 0x03, 0x06, 0xFE, 0x98, +/* 0000C390 */ 0x03, 0xFE, 0x89, 0x02, 0x4F, 0x25, 0x4F, 0x26, 0x4F, 0x27, 0x4F, 0x28, 0x4F, 0x29, 0x4F, 0x2A, +/* 0000C3A0 */ 0x4F, 0x2B, 0x4F, 0x2C, 0x4F, 0x2D, 0x4F, 0x2E, 0x4F, 0x2F, 0x4F, 0x30, 0x4F, 0x31, 0x4F, 0x32, +/* 0000C3B0 */ 0x4F, 0x33, 0x4F, 0x34, 0x4F, 0x35, 0x4F, 0x36, 0x54, 0x25, 0x02, 0x54, 0x26, 0x03, 0x47, 0x38, +/* 0000C3C0 */ 0x04, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, +/* 0000C3D0 */ 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x06, 0x54, 0x27, 0x38, 0x54, 0x28, +/* 0000C3E0 */ 0x07, 0x2F, 0x38, 0x08, 0x09, 0x54, 0x29, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x28, +/* 0000C3F0 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x29, 0x2F, 0x38, 0x38, +/* 0000C400 */ 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x2A, 0x38, 0x47, 0x38, 0x0C, 0x01, 0x04, 0x01, 0x39, 0x27, +/* 0000C410 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0D, 0x54, 0x2B, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, +/* 0000C420 */ 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0E, 0x54, 0x2C, 0x38, 0x47, 0x38, +/* 0000C430 */ 0x0A, 0x01, 0x04, 0x01, 0x39, 0x2C, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0F, 0x01, 0x04, +/* 0000C440 */ 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x10, 0x54, 0x2D, 0x38, 0x47, 0x38, +/* 0000C450 */ 0x0A, 0x01, 0x04, 0x01, 0x39, 0x27, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x11, 0x01, 0x04, +/* 0000C460 */ 0x01, 0x39, 0x26, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x12, 0x01, 0x04, 0x01, 0x39, 0x27, +/* 0000C470 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2E, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, +/* 0000C480 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x14, 0x01, 0x04, 0x01, 0x39, 0x26, +/* 0000C490 */ 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x13, 0x54, 0x2F, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, +/* 0000C4A0 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x15, 0x54, 0x30, 0x38, 0x47, 0x38, +/* 0000C4B0 */ 0x0A, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x16, 0x01, 0x04, +/* 0000C4C0 */ 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x17, 0x54, 0x31, 0x38, 0x47, 0x38, +/* 0000C4D0 */ 0x12, 0x01, 0x04, 0x01, 0x39, 0x25, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x18, 0x2F, 0x38, +/* 0000C4E0 */ 0x0A, 0x38, 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x31, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, +/* 0000C4F0 */ 0x39, 0x1A, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x05, 0x01, 0x04, 0x01, 0x3A, 0x25, 0x2F, 0x39, +/* 0000C500 */ 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x1B, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x0B, 0x54, 0x32, +/* 0000C510 */ 0x38, 0x47, 0x38, 0x1C, 0x01, 0x04, 0x01, 0x39, 0x32, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000C520 */ 0x0B, 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x30, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, +/* 0000C530 */ 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x47, 0x39, 0x1D, 0x01, 0x04, 0x01, 0x3A, 0x2F, 0x2F, 0x39, 0x39, +/* 0000C540 */ 0x3A, 0x2F, 0x39, 0x39, 0x1E, 0x2F, 0x38, 0x38, 0x39, 0x54, 0x33, 0x38, 0x47, 0x38, 0x19, 0x01, +/* 0000C550 */ 0x04, 0x01, 0x39, 0x2E, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x1F, 0x47, 0x39, 0x20, 0x01, +/* 0000C560 */ 0x04, 0x01, 0x3A, 0x2D, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x21, 0x2F, 0x38, 0x38, 0x39, +/* 0000C570 */ 0x47, 0x39, 0x19, 0x01, 0x04, 0x01, 0x3A, 0x2B, 0x2F, 0x39, 0x39, 0x3A, 0x2F, 0x39, 0x39, 0x22, +/* 0000C580 */ 0x2F, 0x38, 0x38, 0x39, 0x54, 0x34, 0x38, 0x47, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x33, 0x2F, +/* 0000C590 */ 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x23, 0x01, 0x04, 0x01, 0x39, 0x34, 0x2F, 0x38, 0x38, 0x39, +/* 0000C5A0 */ 0x2F, 0x38, 0x38, 0x23, 0x54, 0x35, 0x38, 0x47, 0x38, 0x0A, 0x01, 0x04, 0x01, 0x39, 0x35, 0x2F, +/* 0000C5B0 */ 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2B, 0x2F, 0x38, 0x38, 0x39, +/* 0000C5C0 */ 0x2F, 0x38, 0x38, 0x05, 0x01, 0x04, 0x01, 0x39, 0x2A, 0x2F, 0x38, 0x38, 0x39, 0x2F, 0x38, 0x38, +/* 0000C5D0 */ 0x0B, 0x54, 0x36, 0x38, 0x8E, 0x01, 0x0F, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x33, 0x5C, 0x02, +/* 0000C5E0 */ 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, 0x42, 0x38, 0x8E, 0x01, 0x0F, 0x38, 0x07, +/* 0000C5F0 */ 0x03, 0x00, 0x5C, 0x01, 0x34, 0x5C, 0x02, 0x24, 0xC2, 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, +/* 0000C600 */ 0x43, 0x38, 0x8E, 0x01, 0x0F, 0x38, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x36, 0x5C, 0x02, 0x24, 0xC2, +/* 0000C610 */ 0x03, 0x38, 0x38, 0x01, 0x32, 0x01, 0x01, 0x44, 0x38, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xE6, 0x45, +/* 0000C620 */ 0x16, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x33, +/* 0000C630 */ 0x00, 0x03, 0x00, 0x77, 0x00, 0x07, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x44, 0x00, 0x13, 0x00, 0x7D, +/* 0000C640 */ 0x00, 0x13, 0x00, 0x94, 0x00, 0x20, 0x00, 0x83, 0x00, 0x2D, 0x00, 0x83, 0x00, 0x20, 0x00, 0x74, +/* 0000C650 */ 0x00, 0x13, 0x00, 0x6A, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x43, 0x00, 0x00, 0x04, 0x3B, 0x00, 0x4C, +/* 0000C660 */ 0x01, 0x3B, 0x00, 0x5A, 0x01, 0x20, 0x00, 0x4B, 0x00, 0x2D, 0x00, 0x6E, 0x00, 0x17, 0x00, 0x66, +/* 0000C670 */ 0x00, 0x17, 0x00, 0x8B, 0x00, 0x19, 0x00, 0x72, 0x00, 0x00, 0xBF, 0x4C, 0x00, 0x00, 0x10, 0xC4, +/* 0000C680 */ 0x00, 0xFE, 0xA3, 0x01, 0x04, 0xA1, 0x41, 0xC1, 0x00, 0xFE, 0x1C, 0x03, 0x1B, 0xFE, 0xC9, 0x3F, +/* 0000C690 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xC9, 0x3F, 0x55, 0x55, 0x41, 0x02, 0x02, 0x03, +/* 0000C6A0 */ 0x05, 0x05, 0x01, 0x01, 0x02, 0x0D, 0xE0, 0x03, 0x00, 0x01, 0x32, 0x01, 0x01, 0x41, 0x03, 0xA8, +/* 0000C6B0 */ 0x00, 0x24, 0x00, 0x0A, 0xFE, 0x76, 0x03, 0x01, 0xFE, 0xF7, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x00, +/* 0000C6C0 */ 0x0B, 0x00, 0x26, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x21, 0xD4, 0x00, 0xFE, 0x92, 0x01, 0x04, +/* 0000C6D0 */ 0xA3, 0x41, 0xC1, 0x00, 0xFE, 0x1B, 0x03, 0x1A, 0xFE, 0x64, 0x3D, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 0000C6E0 */ 0x06, 0x06, 0xFE, 0x64, 0x3D, 0xFE, 0x45, 0x02, 0xFE, 0x45, 0x02, 0x01, 0x0C, 0x07, 0x0F, 0x08, +/* 0000C6F0 */ 0x3C, 0x3B, 0x01, 0x05, 0x03, 0x03, 0x03, 0x03, 0x01, 0x0E, 0x0F, 0x06, 0xFE, 0x72, 0x03, 0x08, +/* 0000C700 */ 0x06, 0xFE, 0x73, 0x03, 0x05, 0xFE, 0x74, 0x03, 0x06, 0xFE, 0x75, 0x03, 0xC8, 0x4F, 0x0C, 0x4F, +/* 0000C710 */ 0x0D, 0x97, 0x10, 0x07, 0x08, 0x54, 0x0C, 0x10, 0x2C, 0x10, 0x0C, 0x15, 0x03, 0x00, 0x10, 0x02, +/* 0000C720 */ 0x09, 0xA8, 0x00, 0x8E, 0x01, 0x31, 0x11, 0x6C, 0x10, 0x11, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000C730 */ 0x11, 0x5C, 0x01, 0x0C, 0x1F, 0x02, 0x10, 0x10, 0x54, 0x0D, 0x10, 0x8E, 0x01, 0x27, 0x10, 0x07, +/* 0000C740 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x10, 0x10, 0x0F, 0x13, 0x00, 0x10, +/* 0000C750 */ 0x09, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x0D, 0x09, 0x09, 0x00, 0x00, 0x11, 0x03, 0x00, 0x0D, 0x0A, +/* 0000C760 */ 0x09, 0x4D, 0x00, 0x8E, 0x01, 0x09, 0x11, 0x6C, 0x10, 0x11, 0x01, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 0000C770 */ 0x11, 0x8E, 0x01, 0x11, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x1F, 0x02, +/* 0000C780 */ 0x12, 0x12, 0x5C, 0x01, 0x12, 0x8E, 0x01, 0x11, 0x12, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, +/* 0000C790 */ 0x01, 0x08, 0x1F, 0x02, 0x12, 0x12, 0x5C, 0x02, 0x12, 0x2F, 0x12, 0x04, 0x09, 0x2F, 0x12, 0x12, +/* 0000C7A0 */ 0x05, 0x2F, 0x12, 0x12, 0x0A, 0x2F, 0x12, 0x12, 0x06, 0x5C, 0x03, 0x12, 0x1F, 0x04, 0xFF, 0x10, +/* 0000C7B0 */ 0x8E, 0x01, 0x15, 0x11, 0x6C, 0x10, 0x11, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x11, 0x5C, 0x01, +/* 0000C7C0 */ 0x0D, 0x1F, 0x02, 0x00, 0x10, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, +/* 0000C7D0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5E, 0x02, 0xFE, 0x5F, 0x02, 0x1F, 0xFE, 0xB6, 0x3D, 0x08, +/* 0000C7E0 */ 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x33, 0x00, 0x18, 0x00, 0x41, 0x00, +/* 0000C7F0 */ 0x28, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x8D, 0x00, 0x1B, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1F, 0x00, +/* 0000C800 */ 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x78, 0x01, 0x04, 0xA3, 0x41, 0xC1, 0x00, +/* 0000C810 */ 0xFE, 0x1A, 0x03, 0x19, 0xFE, 0x47, 0x3A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0x47, +/* 0000C820 */ 0x3A, 0xFE, 0x17, 0x03, 0xFE, 0x17, 0x03, 0x01, 0x0B, 0x0A, 0x11, 0x0A, 0x51, 0x4B, 0x01, 0x06, +/* 0000C830 */ 0x04, 0x04, 0x04, 0x04, 0x10, 0x06, 0xFE, 0x6C, 0x03, 0x06, 0xFE, 0x6D, 0x03, 0x06, 0xFE, 0x6E, +/* 0000C840 */ 0x03, 0x08, 0x01, 0xFF, 0x05, 0xFE, 0x6F, 0x03, 0x05, 0xFE, 0x70, 0x03, 0x05, 0xFE, 0x71, 0x03, +/* 0000C850 */ 0xFE, 0x10, 0x01, 0x4F, 0x0F, 0x97, 0x11, 0x0A, 0x0B, 0x47, 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, +/* 0000C860 */ 0x00, 0x0F, 0x11, 0x09, 0xF3, 0x00, 0x0C, 0x03, 0x00, 0x0C, 0x02, 0x09, 0x18, 0x00, 0x8E, 0x01, +/* 0000C870 */ 0x31, 0x12, 0x6C, 0x11, 0x12, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, +/* 0000C880 */ 0x02, 0x11, 0x11, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x03, 0x09, 0x18, 0x00, 0x8E, 0x01, +/* 0000C890 */ 0x31, 0x12, 0x6C, 0x11, 0x12, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, +/* 0000C8A0 */ 0x02, 0x11, 0x11, 0x47, 0x0F, 0x11, 0x0C, 0x03, 0x00, 0x0C, 0x04, 0x09, 0x18, 0x00, 0x8E, 0x01, +/* 0000C8B0 */ 0x31, 0x12, 0x6C, 0x11, 0x12, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x12, 0x5C, 0x01, 0x0F, 0x1F, +/* 0000C8C0 */ 0x02, 0x11, 0x11, 0x47, 0x0F, 0x11, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x0D, 0x11, 0x09, 0x83, 0x00, +/* 0000C8D0 */ 0x8E, 0x01, 0x0C, 0x11, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x05, 0x8E, 0x01, 0x1D, 0x12, 0x5C, 0x01, +/* 0000C8E0 */ 0x12, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x0F, 0x1F, 0x04, 0x11, 0x11, 0x0C, 0x03, 0x00, 0x11, 0x06, +/* 0000C8F0 */ 0x09, 0x60, 0x00, 0x8E, 0x01, 0x09, 0x12, 0x6C, 0x11, 0x12, 0x03, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 0000C900 */ 0x12, 0x8E, 0x01, 0x11, 0x13, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, 0x01, 0x0F, 0x1F, 0x02, +/* 0000C910 */ 0x13, 0x13, 0x5C, 0x01, 0x13, 0x8E, 0x01, 0x11, 0x13, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x05, 0x5C, +/* 0000C920 */ 0x01, 0x0B, 0x1F, 0x02, 0x13, 0x13, 0x5C, 0x02, 0x13, 0x8E, 0x01, 0x0C, 0x13, 0x07, 0x04, 0x00, +/* 0000C930 */ 0x5C, 0x00, 0x05, 0x8E, 0x01, 0x1F, 0x14, 0x5C, 0x01, 0x14, 0x5C, 0x02, 0x0D, 0x5C, 0x03, 0x08, +/* 0000C940 */ 0x1F, 0x04, 0x13, 0x13, 0x2F, 0x13, 0x07, 0x13, 0x2F, 0x13, 0x13, 0x09, 0x5C, 0x03, 0x13, 0x1F, +/* 0000C950 */ 0x04, 0xFF, 0x11, 0x47, 0x00, 0x0F, 0x09, 0x08, 0x00, 0x47, 0x00, 0x0E, 0x09, 0x02, 0x00, 0xA8, +/* 0000C960 */ 0x00, 0x24, 0x00, 0xFE, 0x5C, 0x02, 0xFE, 0x5D, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x5F, 0x02, 0xFE, +/* 0000C970 */ 0x8F, 0x3A, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x28, 0x00, 0x0A, 0x00, 0x27, 0x00, 0x08, +/* 0000C980 */ 0x00, 0x29, 0x00, 0x18, 0x00, 0x45, 0x00, 0x08, 0x00, 0x28, 0x00, 0x18, 0x00, 0x3D, 0x00, 0x08, +/* 0000C990 */ 0x00, 0x28, 0x00, 0x18, 0x00, 0x3D, 0x00, 0x2D, 0x00, 0x6B, 0x00, 0x60, 0x00, 0xA6, 0x00, 0x06, +/* 0000C9A0 */ 0x00, 0x21, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x3F, 0x5C, 0x80, 0xE0, 0x09, 0xC4, 0x12, 0xFE, +/* 0000C9B0 */ 0x4D, 0x01, 0x14, 0xA0, 0x41, 0xD1, 0x00, 0x12, 0xFE, 0x36, 0x35, 0x06, 0xFF, 0x00, 0x10, 0x01, +/* 0000C9C0 */ 0x00, 0x01, 0x01, 0xFE, 0x36, 0x35, 0xFE, 0xE0, 0x04, 0xFE, 0xE0, 0x04, 0x04, 0x0A, 0x0B, 0x04, +/* 0000C9D0 */ 0x1D, 0x1D, 0x01, 0x01, 0x06, 0x06, 0x06, 0x06, 0x01, 0x0A, 0x06, 0xFE, 0x66, 0x03, 0x06, 0xFE, +/* 0000C9E0 */ 0x67, 0x03, 0x06, 0xFE, 0x68, 0x03, 0x06, 0xFE, 0x69, 0x03, 0x06, 0xFE, 0x6A, 0x03, 0x06, 0xFE, +/* 0000C9F0 */ 0x6B, 0x03, 0x07, 0x08, 0x70, 0x8E, 0x01, 0x0A, 0x0B, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0xCC, +/* 0000CA00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x0D, 0x7A, +/* 0000CA10 */ 0x0D, 0x0C, 0x00, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x01, 0x0D, 0x7A, 0x0D, 0x0C, 0x01, 0x01, +/* 0000CA20 */ 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x02, 0x0D, 0x7A, 0x0D, 0x0C, 0x02, 0x01, 0x65, 0x01, 0x0D, 0x0C, +/* 0000CA30 */ 0xD4, 0x03, 0x0D, 0x7A, 0x0D, 0x0C, 0x03, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x04, 0x0D, 0x7A, +/* 0000CA40 */ 0x0D, 0x0C, 0x04, 0x01, 0x65, 0x01, 0x0D, 0x0C, 0xD4, 0x05, 0x0D, 0x7A, 0x0D, 0x0C, 0x05, 0x01, +/* 0000CA50 */ 0x65, 0x01, 0x0D, 0x0C, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x08, 0x1F, 0x03, 0x00, 0x0B, 0x09, 0x02, +/* 0000CA60 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, +/* 0000CA70 */ 0x00, 0x00, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x5D, 0x02, 0x00, 0x00, 0x5E, 0x02, 0x00, 0x00, +/* 0000CA80 */ 0x5C, 0x02, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x6B, 0x03, 0x00, 0x00, 0xFE, 0x66, 0x03, 0xFE, +/* 0000CA90 */ 0x5D, 0x02, 0xFE, 0x5E, 0x02, 0xFE, 0x5C, 0x02, 0xFE, 0x61, 0x02, 0xFE, 0x6B, 0x03, 0xFE, 0x4C, +/* 0000CAA0 */ 0x35, 0x02, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0xC9, 0x04, 0x00, 0x76, 0xCD, 0x00, 0x00, 0x0E, +/* 0000CAB0 */ 0xCD, 0x00, 0x00, 0xA6, 0xCC, 0x00, 0x00, 0x3E, 0xCC, 0x00, 0x00, 0x5F, 0xCB, 0x00, 0x00, 0xC3, +/* 0000CAC0 */ 0xCA, 0x00, 0x00, 0xBF, 0x7C, 0x80, 0x01, 0x00, 0xC4, 0x04, 0xFE, 0x6B, 0x01, 0x19, 0xA2, 0x41, +/* 0000CAD0 */ 0xC1, 0x00, 0xFE, 0x6B, 0x03, 0x18, 0xFE, 0xCA, 0x38, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, +/* 0000CAE0 */ 0xFE, 0xCA, 0x38, 0xFE, 0x35, 0x01, 0xFE, 0x35, 0x01, 0x01, 0x05, 0x04, 0x07, 0x05, 0x19, 0x17, +/* 0000CAF0 */ 0x16, 0x01, 0x03, 0x01, 0x06, 0x00, 0x48, 0x08, 0x0B, 0x4C, 0xEA, 0x00, 0x0F, 0x03, 0x00, 0x04, +/* 0000CB00 */ 0x09, 0x3F, 0x00, 0x8E, 0x01, 0x0C, 0x07, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x02, 0x8E, 0x01, 0x19, +/* 0000CB10 */ 0x08, 0x5C, 0x01, 0x08, 0x5C, 0x02, 0x04, 0x5C, 0x03, 0x05, 0x1F, 0x04, 0x07, 0x07, 0x0F, 0x03, +/* 0000CB20 */ 0x00, 0x07, 0x09, 0x06, 0x00, 0x47, 0x00, 0x03, 0x09, 0x19, 0x00, 0x8E, 0x01, 0x16, 0x07, 0x07, +/* 0000CB30 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x07, 0x07, 0x47, 0x04, 0x07, 0x09, +/* 0000CB40 */ 0xB8, 0xFF, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x1F, 0x39, 0x05, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, +/* 0000CB50 */ 0x19, 0x00, 0x22, 0x00, 0x54, 0x00, 0x06, 0x00, 0x37, 0x00, 0x19, 0x00, 0x3B, 0x00, 0x00, 0xBF, +/* 0000CB60 */ 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x62, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x6A, +/* 0000CB70 */ 0x03, 0x17, 0xFE, 0xB3, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xB3, 0x37, 0xFB, +/* 0000CB80 */ 0xFB, 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0x09, 0x08, +/* 0000CB90 */ 0x01, 0x00, 0x01, 0x02, 0x01, 0x20, 0x88, 0x8E, 0x01, 0x10, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000CBA0 */ 0x02, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x0A, 0x0A, 0x47, 0x07, 0x0A, 0x47, 0x08, 0x03, 0x8E, 0x01, +/* 0000CBB0 */ 0x27, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0A, 0x0A, 0x0F, +/* 0000CBC0 */ 0x52, 0x00, 0x0A, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x26, 0x0A, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000CBD0 */ 0x5C, 0x01, 0x07, 0x1F, 0x02, 0x0A, 0x0A, 0x0F, 0x03, 0x00, 0x0A, 0x09, 0x37, 0x00, 0x8E, 0x01, +/* 0000CBE0 */ 0x15, 0x0B, 0x6C, 0x0A, 0x0B, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x47, 0x0C, 0x07, 0x8E, +/* 0000CBF0 */ 0x01, 0x15, 0x0E, 0x6C, 0x0D, 0x0E, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x04, +/* 0000CC00 */ 0x5C, 0x02, 0x05, 0x1F, 0x03, 0x0D, 0x0D, 0x33, 0x0C, 0x0C, 0x0D, 0x5C, 0x01, 0x0C, 0x1F, 0x02, +/* 0000CC10 */ 0x0A, 0x0A, 0x47, 0x08, 0x0A, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x17, +/* 0000CC20 */ 0x25, 0xFE, 0xD2, 0x37, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x29, 0x00, 0x03, 0x00, 0x19, +/* 0000CC30 */ 0x00, 0x30, 0x00, 0x38, 0x00, 0x37, 0x00, 0x49, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0xBF, 0x5C, +/* 0000CC40 */ 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x5E, 0x01, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x69, 0x03, +/* 0000CC50 */ 0x16, 0xFE, 0x3D, 0x37, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x3D, 0x37, 0x5D, 0x5D, +/* 0000CC60 */ 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x04, 0x08, 0x2D, 0xA8, 0x05, 0x15, 0x03, +/* 0000CC70 */ 0x00, 0x03, 0x05, 0x09, 0x17, 0x00, 0x8E, 0x01, 0x0D, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000CC80 */ 0x5C, 0x01, 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, +/* 0000CC90 */ 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x5C, 0x37, 0x02, 0x00, 0x00, 0x00, +/* 0000CCA0 */ 0x00, 0x2B, 0x00, 0x3D, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x5A, 0x01, +/* 0000CCB0 */ 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x68, 0x03, 0x15, 0xFE, 0xC6, 0x36, 0xFF, 0x00, 0x10, 0x01, +/* 0000CCC0 */ 0x00, 0x02, 0x02, 0xFE, 0xC6, 0x36, 0x56, 0x56, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, +/* 0000CCD0 */ 0x01, 0x04, 0x08, 0x2D, 0xA8, 0x05, 0x14, 0x03, 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, +/* 0000CCE0 */ 0x47, 0x00, 0x05, 0x09, 0x14, 0x00, 0x8E, 0x01, 0x10, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000CCF0 */ 0x5C, 0x01, 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000CD00 */ 0x00, 0xFE, 0xE5, 0x36, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x36, 0x00, 0x00, 0xBF, 0x5C, +/* 0000CD10 */ 0x80, 0x00, 0x00, 0xC4, 0x00, 0xFE, 0x56, 0x01, 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x67, 0x03, +/* 0000CD20 */ 0x14, 0xFE, 0x51, 0x36, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x51, 0x36, 0x5C, 0x5C, +/* 0000CD30 */ 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x04, 0x08, 0x2D, 0xA8, 0x05, 0x15, 0x03, +/* 0000CD40 */ 0x00, 0x03, 0x05, 0x09, 0x17, 0x00, 0x8E, 0x01, 0x11, 0x05, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, +/* 0000CD50 */ 0x5C, 0x01, 0x03, 0x1F, 0x02, 0x05, 0x05, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, +/* 0000CD60 */ 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x70, 0x36, 0x02, 0x00, 0x00, 0x00, +/* 0000CD70 */ 0x00, 0x2B, 0x00, 0x3C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, 0xFE, 0x4F, 0x01, +/* 0000CD80 */ 0x16, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x66, 0x03, 0x13, 0xFE, 0x78, 0x35, 0xFF, 0x00, 0x10, 0x01, +/* 0000CD90 */ 0x00, 0x02, 0x02, 0xFE, 0x78, 0x35, 0xC0, 0xC0, 0x01, 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, +/* 0000CDA0 */ 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x07, 0x08, 0x47, 0x14, 0x03, 0x00, 0x04, 0x02, 0x09, 0x12, +/* 0000CDB0 */ 0x00, 0x8E, 0x01, 0x09, 0x07, 0x6C, 0x06, 0x07, 0x00, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x07, 0x1F, +/* 0000CDC0 */ 0x01, 0xFF, 0x06, 0xA8, 0x06, 0x15, 0x03, 0x00, 0x04, 0x06, 0x09, 0x17, 0x00, 0x8E, 0x01, 0x0E, +/* 0000CDD0 */ 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x06, 0x06, 0x47, 0x00, +/* 0000CDE0 */ 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000CDF0 */ 0xFE, 0x57, 0x02, 0xFE, 0x97, 0x35, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x26, 0x00, 0x12, +/* 0000CE00 */ 0x00, 0x3E, 0x00, 0x2B, 0x00, 0x3C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x31, 0xD4, 0x00, 0xFE, +/* 0000CE10 */ 0x32, 0x01, 0x20, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0x3C, 0x03, 0x11, 0xFE, 0xAF, 0x31, 0xFF, 0x00, +/* 0000CE20 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xAF, 0x31, 0xFE, 0x70, 0x03, 0xFE, 0x70, 0x03, 0x01, 0x07, +/* 0000CE30 */ 0x05, 0x08, 0x06, 0x41, 0x41, 0x01, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x08, 0x08, +/* 0000CE40 */ 0x01, 0x00, 0x01, 0x01, 0xD5, 0x4F, 0x05, 0x4F, 0x06, 0x8E, 0x01, 0x40, 0x09, 0x4B, 0x09, 0x0F, +/* 0000CE50 */ 0x03, 0x00, 0x09, 0x09, 0x09, 0x00, 0x8E, 0x01, 0x40, 0x00, 0x4B, 0x00, 0x09, 0xB9, 0x00, 0x8E, +/* 0000CE60 */ 0x01, 0x39, 0x09, 0x4B, 0x09, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x6C, 0x00, 0x8E, 0x01, 0x42, 0x09, +/* 0000CE70 */ 0x4B, 0x09, 0x0F, 0x11, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x05, 0x09, 0x07, 0x01, 0x00, +/* 0000CE80 */ 0x5C, 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x3D, 0x09, 0x4B, 0x09, 0x07, 0x01, 0x00, +/* 0000CE90 */ 0x5C, 0x00, 0x02, 0x1F, 0x01, 0x09, 0x09, 0x54, 0x05, 0x09, 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, +/* 0000CEA0 */ 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8E, 0x01, 0x42, 0x0B, 0x4B, +/* 0000CEB0 */ 0x0B, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x54, 0x06, 0x09, 0x0F, 0x03, 0x00, 0x06, 0x09, +/* 0000CEC0 */ 0x0D, 0x00, 0x97, 0x09, 0x06, 0x03, 0x01, 0x32, 0x01, 0x01, 0x40, 0x09, 0x09, 0x06, 0x00, 0x01, +/* 0000CED0 */ 0x32, 0x01, 0x01, 0x40, 0x05, 0x09, 0x35, 0x00, 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x00, +/* 0000CEE0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x8E, 0x01, 0x3D, 0x0B, 0x4B, 0x0B, 0x07, 0x01, 0x00, 0x5C, +/* 0000CEF0 */ 0x00, 0x02, 0x1F, 0x01, 0x0B, 0x0B, 0x5C, 0x01, 0x0B, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0x1F, +/* 0000CF00 */ 0x03, 0x09, 0x09, 0x97, 0x09, 0x09, 0x04, 0x01, 0x32, 0x01, 0x01, 0x40, 0x09, 0x8E, 0x01, 0x40, +/* 0000CF10 */ 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0x09, 0xFE, 0x65, +/* 0000CF20 */ 0x03, 0x00, 0xFE, 0xC5, 0x31, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x2B, 0x00, 0x09, 0x00, +/* 0000CF30 */ 0x33, 0x00, 0x0D, 0x00, 0x26, 0x00, 0x0D, 0x00, 0x29, 0x00, 0x0E, 0x00, 0x33, 0x00, 0x13, 0x00, +/* 0000CF40 */ 0x2C, 0x00, 0x21, 0x00, 0x4D, 0x00, 0x07, 0x00, 0x5B, 0x00, 0x0D, 0x00, 0x49, 0x00, 0x09, 0x00, +/* 0000CF50 */ 0xCB, 0x00, 0x35, 0x00, 0x6D, 0x00, 0x0B, 0x00, 0x24, 0x00, 0x00, 0xBF, 0x7C, 0x80, 0xE1, 0x01, +/* 0000CF60 */ 0xC4, 0x04, 0xFE, 0x20, 0x01, 0x19, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3B, 0x03, 0x10, 0xFE, 0x8C, +/* 0000CF70 */ 0x2E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x8C, 0x2E, 0xFE, 0x91, 0x02, 0xFE, 0x91, +/* 0000CF80 */ 0x02, 0x01, 0x0C, 0x06, 0x10, 0x06, 0x3E, 0x33, 0x15, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, +/* 0000CF90 */ 0x0F, 0x5A, 0x9F, 0x05, 0xFE, 0x64, 0x03, 0x08, 0x01, 0x00, 0x01, 0x01, 0xC2, 0xA8, 0x0D, 0xA8, +/* 0000CFA0 */ 0x0E, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x0A, 0x00, 0x8E, 0x01, 0x2C, 0x11, 0x47, 0x10, 0x11, +/* 0000CFB0 */ 0x09, 0x07, 0x00, 0x8E, 0x01, 0x2B, 0x11, 0x47, 0x10, 0x11, 0x47, 0x0A, 0x10, 0x8E, 0x01, 0x0B, +/* 0000CFC0 */ 0x10, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x10, 0x10, 0x47, 0x0B, +/* 0000CFD0 */ 0x10, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0x1F, 0x01, 0x10, 0x09, 0x47, 0x0C, 0x10, 0xA8, 0x10, +/* 0000CFE0 */ 0x15, 0x03, 0x00, 0x0B, 0x10, 0x09, 0x06, 0x00, 0x47, 0x10, 0x0B, 0x09, 0x03, 0x00, 0x47, 0x10, +/* 0000CFF0 */ 0x04, 0x47, 0x0B, 0x10, 0x47, 0x0D, 0x04, 0xEA, 0x00, 0x12, 0x03, 0x00, 0x0D, 0x0B, 0x09, 0x3B, +/* 0000D000 */ 0x00, 0x8E, 0x01, 0x2E, 0x10, 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x97, 0x11, 0x06, 0x0D, 0x5C, +/* 0000D010 */ 0x01, 0x11, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x08, 0x5C, 0x04, 0x0C, 0x1F, 0x05, 0x10, 0x10, 0x47, +/* 0000D020 */ 0x0E, 0x10, 0x61, 0x10, 0x0E, 0x00, 0xA8, 0x11, 0x15, 0x03, 0x00, 0x10, 0x11, 0x09, 0x06, 0x00, +/* 0000D030 */ 0x47, 0x00, 0x0E, 0x09, 0x27, 0x00, 0x28, 0x0D, 0x0D, 0x09, 0xBB, 0xFF, 0x8E, 0x01, 0x2E, 0x10, +/* 0000D040 */ 0x07, 0x05, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x0A, 0xA8, 0x11, 0x5C, 0x03, +/* 0000D050 */ 0x11, 0x5C, 0x04, 0x0C, 0x1F, 0x05, 0x00, 0x10, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 0000D060 */ 0x21, 0x02, 0xFE, 0xDB, 0x2E, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x58, 0x00, 0x14, 0x00, +/* 0000D070 */ 0x34, 0x00, 0x0D, 0x00, 0x32, 0x00, 0x16, 0x00, 0x39, 0x00, 0x05, 0x00, 0x0B, 0x00, 0x08, 0x00, +/* 0000D080 */ 0x1F, 0x00, 0x21, 0x00, 0x69, 0x00, 0x0E, 0x00, 0x35, 0x00, 0x06, 0x00, 0x4F, 0xFF, 0x06, 0x00, +/* 0000D090 */ 0xE2, 0x00, 0x21, 0x00, 0x51, 0x00, 0x00, 0x3F, 0x5D, 0x80, 0xE0, 0xB9, 0xD6, 0x12, 0xE8, 0x1E, +/* 0000D0A0 */ 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x3A, 0x03, 0x0D, 0xFE, 0xE0, 0x24, 0x02, 0xFF, 0x00, 0x10, 0x01, +/* 0000D0B0 */ 0x00, 0x05, 0x05, 0xFE, 0xE0, 0x24, 0xFE, 0x91, 0x09, 0xFE, 0x91, 0x09, 0x03, 0x0E, 0x0B, 0x15, +/* 0000D0C0 */ 0x05, 0x71, 0x6A, 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, 0x13, 0x14, 0x15, +/* 0000D0D0 */ 0x07, 0x08, 0x01, 0x01, 0x01, 0x00, 0x06, 0xFE, 0x5A, 0x03, 0x05, 0xFE, 0x5C, 0x03, 0x06, 0xFE, +/* 0000D0E0 */ 0x5D, 0x03, 0x06, 0xFE, 0x5E, 0x03, 0x06, 0xFE, 0x5F, 0x03, 0xFE, 0x7C, 0x01, 0x96, 0x03, 0x0B, +/* 0000D0F0 */ 0x96, 0x04, 0x0D, 0x4F, 0x11, 0x8E, 0x01, 0x09, 0x17, 0x6C, 0x16, 0x17, 0x00, 0x07, 0x02, 0x00, +/* 0000D100 */ 0x5C, 0x00, 0x17, 0x92, 0x03, 0x18, 0x5C, 0x01, 0x18, 0x1F, 0x02, 0x16, 0x16, 0x47, 0x0F, 0x16, +/* 0000D110 */ 0x14, 0x03, 0x00, 0x0F, 0x02, 0x09, 0x17, 0x00, 0x8E, 0x01, 0x2D, 0x16, 0x07, 0x02, 0x00, 0x5C, +/* 0000D120 */ 0x00, 0x03, 0x92, 0x03, 0x17, 0x5C, 0x01, 0x17, 0x1F, 0x02, 0x16, 0x16, 0x47, 0x0F, 0x16, 0x0F, +/* 0000D130 */ 0x03, 0x00, 0x0F, 0x09, 0x1E, 0x00, 0x8E, 0x01, 0x0C, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, +/* 0000D140 */ 0x8E, 0x01, 0x1C, 0x17, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x00, 0x17, 0x5C, 0x03, 0x17, +/* 0000D150 */ 0x1F, 0x04, 0xFF, 0x16, 0x8E, 0x01, 0x09, 0x17, 0x6C, 0x16, 0x17, 0x01, 0x07, 0x03, 0x00, 0x5C, +/* 0000D160 */ 0x00, 0x17, 0x92, 0x03, 0x18, 0x5C, 0x01, 0x18, 0xE0, 0x18, 0x00, 0x5C, 0x02, 0x18, 0x1F, 0x03, +/* 0000D170 */ 0x16, 0x16, 0x97, 0x16, 0x16, 0x04, 0x96, 0x03, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x92, +/* 0000D180 */ 0x03, 0x16, 0x5C, 0x01, 0x16, 0x5C, 0x02, 0x0E, 0x1F, 0x03, 0x16, 0x0C, 0x47, 0x10, 0x16, 0x92, +/* 0000D190 */ 0x04, 0x16, 0xA8, 0x17, 0x15, 0x03, 0x00, 0x16, 0x17, 0x09, 0x2A, 0x00, 0xCD, 0x16, 0x00, 0x96, +/* 0000D1A0 */ 0x02, 0x16, 0x8E, 0x01, 0x0C, 0x16, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x1C, 0x17, +/* 0000D1B0 */ 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x0F, 0xD4, 0x01, 0x17, 0x5C, 0x03, 0x17, 0x1F, 0x04, 0xFF, 0x16, +/* 0000D1C0 */ 0x92, 0x02, 0x16, 0x47, 0x0F, 0x16, 0x54, 0x11, 0x10, 0x0F, 0x03, 0x00, 0x10, 0x09, 0x60, 0x00, +/* 0000D1D0 */ 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x31, 0x00, 0x8E, 0x01, 0x0B, 0x16, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 0000D1E0 */ 0x03, 0x5C, 0x01, 0x0F, 0x1F, 0x02, 0x16, 0x16, 0x11, 0x03, 0x00, 0x16, 0x05, 0x09, 0x18, 0x00, +/* 0000D1F0 */ 0x8E, 0x01, 0x39, 0x16, 0x4B, 0x16, 0x0F, 0x03, 0x00, 0x16, 0x09, 0x07, 0x00, 0x2F, 0x10, 0x10, +/* 0000D200 */ 0x06, 0x09, 0x04, 0x00, 0x2F, 0x10, 0x10, 0x07, 0x47, 0x16, 0x10, 0x8E, 0x01, 0x0C, 0x17, 0x07, +/* 0000D210 */ 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x01, 0x1F, 0x18, 0x5C, 0x01, 0x18, 0x5C, 0x02, 0x0F, 0x5C, +/* 0000D220 */ 0x03, 0x06, 0x1F, 0x04, 0x17, 0x17, 0x2F, 0x16, 0x16, 0x17, 0x47, 0x10, 0x16, 0x09, 0x05, 0x00, +/* 0000D230 */ 0xA8, 0x16, 0x47, 0x10, 0x16, 0x8E, 0x01, 0x0A, 0x16, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0xCC, +/* 0000D240 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x7A, 0x10, 0x17, 0x02, +/* 0000D250 */ 0x7A, 0x0F, 0x17, 0x03, 0x7A, 0x11, 0x17, 0x04, 0x5C, 0x01, 0x17, 0x5C, 0x02, 0x02, 0x1F, 0x03, +/* 0000D260 */ 0x00, 0x16, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0000D270 */ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x3B, 0x02, 0x00, 0x00, +/* 0000D280 */ 0x6F, 0x02, 0x00, 0x00, 0xFE, 0x2E, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0x21, 0x02, 0xFE, 0x3B, 0x02, +/* 0000D290 */ 0xFE, 0x6F, 0x02, 0xFE, 0x60, 0x03, 0xFE, 0x21, 0x02, 0xFE, 0x61, 0x03, 0x0D, 0xFE, 0x62, 0x03, +/* 0000D2A0 */ 0x00, 0xFE, 0x24, 0x25, 0x15, 0x08, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x36, 0x00, 0x08, 0x00, 0x81, +/* 0000D2B0 */ 0x00, 0x17, 0x00, 0x3A, 0x00, 0x07, 0x00, 0x1B, 0x00, 0x1E, 0x00, 0x53, 0x02, 0x25, 0x00, 0x49, +/* 0000D2C0 */ 0x00, 0x16, 0x00, 0x37, 0x00, 0x0D, 0x00, 0x50, 0x00, 0x06, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0xB8, +/* 0000D2D0 */ 0x01, 0x06, 0x00, 0xF9, 0x00, 0x03, 0x00, 0x29, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x3E, +/* 0000D2E0 */ 0x00, 0x0D, 0x00, 0x2E, 0x00, 0x07, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x40, 0x00, 0x28, 0x00, 0x5C, +/* 0000D2F0 */ 0x00, 0x05, 0x00, 0x29, 0x00, 0x32, 0x00, 0x99, 0x00, 0x00, 0xC8, 0xD3, 0x00, 0x00, 0x02, 0xD3, +/* 0000D300 */ 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x11, 0xC4, 0x00, 0xFD, 0x3D, 0xA2, 0x41, 0xD1, 0x00, 0x0F, +/* 0000D310 */ 0xFE, 0xA3, 0x29, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA3, 0x29, 0xFE, 0x77, 0x01, +/* 0000D320 */ 0xFE, 0x77, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, 0x02, 0x06, 0x01, 0x01, 0x01, 0x01, +/* 0000D330 */ 0x01, 0x08, 0x01, 0x01, 0x08, 0x01, 0xFF, 0x6F, 0x8E, 0x02, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x00, +/* 0000D340 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0xE0, 0x0B, 0x00, 0x5C, 0x02, 0x0B, 0x1F, +/* 0000D350 */ 0x03, 0x09, 0x09, 0x47, 0x06, 0x09, 0x97, 0x09, 0x06, 0x02, 0x47, 0x07, 0x09, 0x8E, 0x02, 0x0C, +/* 0000D360 */ 0x09, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, 0x1D, 0x0A, 0x5C, 0x01, 0x0A, 0x8E, 0x01, +/* 0000D370 */ 0x04, 0x0A, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x07, 0x1F, 0x04, 0x09, 0x09, 0x15, 0x03, 0x00, 0x09, +/* 0000D380 */ 0x04, 0x09, 0x1F, 0x00, 0x8E, 0x02, 0x0C, 0x09, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x8E, 0x02, +/* 0000D390 */ 0x1E, 0x0A, 0x5C, 0x01, 0x0A, 0x8E, 0x01, 0x02, 0x0A, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x05, 0x1F, +/* 0000D3A0 */ 0x04, 0xFF, 0x09, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x39, 0x02, 0x0E, 0xFE, 0x63, 0x03, 0x00, 0xFE, +/* 0000D3B0 */ 0xC7, 0x29, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x7A, 0x00, 0x07, 0x00, 0x24, 0x00, 0x27, +/* 0000D3C0 */ 0x00, 0x5F, 0x00, 0x21, 0x00, 0x55, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0xF0, +/* 0000D3D0 */ 0x3C, 0xA2, 0x41, 0xD1, 0x00, 0x0E, 0xFE, 0x60, 0x26, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, +/* 0000D3E0 */ 0xFE, 0x60, 0x26, 0x7D, 0x7D, 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x03, 0x06, 0x06, +/* 0000D3F0 */ 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x08, 0x2E, 0x8E, 0x02, 0x0C, 0x07, 0x07, 0x05, 0x00, +/* 0000D400 */ 0x5C, 0x00, 0x04, 0x8E, 0x02, 0x23, 0x08, 0x5C, 0x01, 0x08, 0x8E, 0x01, 0x03, 0x08, 0x5C, 0x02, +/* 0000D410 */ 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, 0x5C, 0x04, 0x03, 0x1F, 0x05, 0x07, 0x07, 0x94, +/* 0000D420 */ 0x01, 0x03, 0x07, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x84, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2C, +/* 0000D430 */ 0x00, 0x58, 0x00, 0x00, 0x3F, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x02, 0xCF, 0x1E, 0xA2, 0x41, 0xC1, +/* 0000D440 */ 0x00, 0xFE, 0x39, 0x03, 0x0B, 0xFE, 0xAF, 0x20, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, +/* 0000D450 */ 0xFE, 0xAF, 0x20, 0xFE, 0x11, 0x04, 0xFE, 0x11, 0x04, 0x07, 0x05, 0x09, 0x04, 0x2A, 0x29, 0x01, +/* 0000D460 */ 0x03, 0x03, 0x03, 0x03, 0x03, 0x08, 0x08, 0x01, 0x00, 0x06, 0xFE, 0x5A, 0x03, 0x82, 0x4F, 0x06, +/* 0000D470 */ 0x4F, 0x07, 0x8E, 0x01, 0x43, 0x09, 0x4B, 0x09, 0x0F, 0x11, 0x00, 0x09, 0x09, 0x00, 0x00, 0x8E, +/* 0000D480 */ 0x01, 0x05, 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x02, 0x1F, 0x01, 0xFF, 0x09, 0x8E, 0x01, 0x09, +/* 0000D490 */ 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x8E, 0x01, +/* 0000D4A0 */ 0x43, 0x0B, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x54, 0x06, 0x09, 0x0F, 0x08, +/* 0000D4B0 */ 0x00, 0x06, 0x09, 0x00, 0x00, 0xA8, 0x00, 0x09, 0x34, 0x00, 0x97, 0x0B, 0x06, 0x03, 0x6C, 0x0A, +/* 0000D4C0 */ 0x0B, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0B, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x0A, 0x0A, 0x6C, +/* 0000D4D0 */ 0x09, 0x0A, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0A, 0xD4, 0x00, 0x0B, 0x5C, 0x01, 0x0B, 0x1F, +/* 0000D4E0 */ 0x02, 0x09, 0x09, 0x54, 0x07, 0x09, 0x47, 0x00, 0x07, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 0000D4F0 */ 0xFE, 0x39, 0x02, 0xFE, 0x78, 0x01, 0xB1, 0xFE, 0xCB, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0x0D, +/* 0000D500 */ 0x00, 0x24, 0x00, 0x0E, 0x00, 0x2B, 0x00, 0x21, 0x00, 0x4B, 0x00, 0x07, 0x00, 0x1A, 0x00, 0x05, +/* 0000D510 */ 0x00, 0x5C, 0x02, 0x2C, 0x00, 0xCD, 0x00, 0x08, 0x00, 0x17, 0x00, 0x00, 0x20, 0xD5, 0x00, 0x00, +/* 0000D520 */ 0xBF, 0x4C, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xE2, 0x36, 0xA2, 0x41, 0xD0, 0x00, 0x0C, 0xFE, 0x01, +/* 0000D530 */ 0x10, 0xFE, 0x09, 0x24, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x09, 0x24, 0x0A, 0x0A, +/* 0000D540 */ 0x01, 0x02, 0x02, 0x03, 0x0A, 0x0A, 0x01, 0x17, 0xAC, 0x03, 0x0F, 0x02, 0x00, 0x02, 0xAB, 0x03, +/* 0000D550 */ 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x03, 0xAB, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 0000D560 */ 0x10, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, +/* 0000D570 */ 0x21, 0xD4, 0x00, 0xB8, 0x1E, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x5B, 0x03, 0x0A, 0xFE, 0x1C, 0x1C, +/* 0000D580 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x1C, 0x1C, 0xFE, 0x73, 0x04, 0xFE, 0x73, 0x04, +/* 0000D590 */ 0x01, 0x09, 0x09, 0x0D, 0x04, 0x58, 0x4C, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0x0C, 0x0D, +/* 0000D5A0 */ 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, 0x03, +/* 0000D5B0 */ 0xFE, 0x22, 0x01, 0x4F, 0x0A, 0x4F, 0x0B, 0x8E, 0x01, 0x09, 0x0F, 0x61, 0x0F, 0x0F, 0x00, 0x6C, +/* 0000D5C0 */ 0x0E, 0x0F, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0E, 0x0E, +/* 0000D5D0 */ 0x47, 0x0A, 0x0E, 0xA8, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x0E, 0x09, 0xDB, 0x00, 0x8E, 0x01, 0x09, +/* 0000D5E0 */ 0x0F, 0x6C, 0x0E, 0x0F, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x1F, 0x02, +/* 0000D5F0 */ 0x0E, 0x0E, 0x47, 0x0A, 0x0E, 0x14, 0x03, 0x00, 0x0A, 0x02, 0x09, 0x83, 0x00, 0x8E, 0x01, 0x42, +/* 0000D600 */ 0x0E, 0x4B, 0x0E, 0x0F, 0x11, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x05, 0x0E, 0x07, 0x01, +/* 0000D610 */ 0x00, 0x5C, 0x00, 0x03, 0x1F, 0x01, 0xFF, 0x0E, 0x8E, 0x01, 0x09, 0x0F, 0x6C, 0x0E, 0x0F, 0x03, +/* 0000D620 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0F, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x42, 0x10, 0x4B, 0x10, 0x5C, +/* 0000D630 */ 0x02, 0x10, 0x1F, 0x03, 0x0E, 0x0E, 0x47, 0x0B, 0x0E, 0x97, 0x0E, 0x0B, 0x04, 0x97, 0x0F, 0x0B, +/* 0000D640 */ 0x05, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x0E, 0x00, 0x97, 0x10, 0x0B, 0x05, 0x2F, 0x10, 0x06, 0x10, +/* 0000D650 */ 0x47, 0x0F, 0x10, 0x09, 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x97, 0x0F, 0x0B, +/* 0000D660 */ 0x08, 0x0F, 0x03, 0x00, 0x0F, 0x09, 0x0E, 0x00, 0x97, 0x10, 0x0B, 0x08, 0x2F, 0x10, 0x06, 0x10, +/* 0000D670 */ 0x47, 0x0F, 0x10, 0x09, 0x03, 0x00, 0x47, 0x0F, 0x07, 0x2F, 0x0E, 0x0E, 0x0F, 0x47, 0x0A, 0x0E, +/* 0000D680 */ 0x8E, 0x01, 0x09, 0x0F, 0x61, 0x0F, 0x0F, 0x00, 0x6C, 0x0E, 0x0F, 0x04, 0x07, 0x03, 0x00, 0x5C, +/* 0000D690 */ 0x00, 0x0F, 0x5C, 0x01, 0x09, 0xA8, 0x10, 0x14, 0x03, 0x00, 0x0A, 0x10, 0x09, 0x0C, 0x00, 0x8E, +/* 0000D6A0 */ 0x01, 0x3A, 0x11, 0x4B, 0x11, 0x47, 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x0A, 0x5C, 0x02, +/* 0000D6B0 */ 0x10, 0x1F, 0x03, 0xFF, 0x0E, 0x09, 0x13, 0x00, 0x8E, 0x01, 0x3A, 0x0E, 0x4B, 0x0E, 0x14, 0x03, +/* 0000D6C0 */ 0x00, 0x0A, 0x0E, 0x09, 0x05, 0x00, 0xA8, 0x0E, 0x47, 0x0A, 0x0E, 0x47, 0x00, 0x0A, 0x09, 0x02, +/* 0000D6D0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x18, 0x03, 0xFE, 0xB7, 0x01, 0xFE, 0x2B, 0x02, 0xFE, 0x39, +/* 0000D6E0 */ 0x02, 0xFE, 0xBA, 0x01, 0xFE, 0x46, 0x1C, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x53, 0x00, +/* 0000D6F0 */ 0x0A, 0x00, 0x30, 0x00, 0x18, 0x00, 0x51, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x0D, 0x00, 0x2D, 0x00, +/* 0000D700 */ 0x0E, 0x00, 0x3A, 0x00, 0x21, 0x00, 0xB1, 0x00, 0x47, 0x00, 0x34, 0x01, 0x38, 0x00, 0x80, 0x00, +/* 0000D710 */ 0x0E, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x1B, 0x00, 0x00, 0xBF, 0x5C, 0x80, +/* 0000D720 */ 0xE0, 0x21, 0xD4, 0x00, 0x9D, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x59, 0x03, 0x09, 0xFE, 0x76, +/* 0000D730 */ 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x76, 0x17, 0xFE, 0x86, 0x04, 0xFE, 0x86, +/* 0000D740 */ 0x04, 0x01, 0x0A, 0x09, 0x0E, 0x04, 0x61, 0x54, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01, 0x0D, +/* 0000D750 */ 0x0E, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, 0x06, 0xFE, 0x5A, 0x03, 0x06, 0xFE, 0x0A, 0x03, 0x01, +/* 0000D760 */ 0x03, 0xFE, 0x41, 0x01, 0x4F, 0x0C, 0x8E, 0x01, 0x09, 0x10, 0x61, 0x10, 0x10, 0x00, 0x6C, 0x0F, +/* 0000D770 */ 0x10, 0x01, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0F, 0x0F, 0x47, +/* 0000D780 */ 0x0B, 0x0F, 0xA8, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x0F, 0x09, 0xDB, 0x00, 0x8E, 0x01, 0x09, 0x10, +/* 0000D790 */ 0x6C, 0x0F, 0x10, 0x02, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x1F, 0x02, 0x0F, +/* 0000D7A0 */ 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x83, 0x00, 0x8E, 0x01, 0x42, 0x0F, +/* 0000D7B0 */ 0x4B, 0x0F, 0x0F, 0x11, 0x00, 0x0F, 0x09, 0x00, 0x00, 0x8E, 0x01, 0x05, 0x0F, 0x07, 0x01, 0x00, +/* 0000D7C0 */ 0x5C, 0x00, 0x03, 0x1F, 0x01, 0xFF, 0x0F, 0x8E, 0x01, 0x09, 0x10, 0x6C, 0x0F, 0x10, 0x03, 0x07, +/* 0000D7D0 */ 0x03, 0x00, 0x5C, 0x00, 0x10, 0x5C, 0x01, 0x09, 0x8E, 0x01, 0x42, 0x11, 0x4B, 0x11, 0x5C, 0x02, +/* 0000D7E0 */ 0x11, 0x1F, 0x03, 0x0F, 0x0F, 0x47, 0x0C, 0x0F, 0x97, 0x0F, 0x0C, 0x04, 0x97, 0x10, 0x0C, 0x05, +/* 0000D7F0 */ 0x0F, 0x03, 0x00, 0x10, 0x09, 0x0E, 0x00, 0x97, 0x11, 0x0C, 0x05, 0x2F, 0x11, 0x06, 0x11, 0x47, +/* 0000D800 */ 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x97, 0x10, 0x0C, 0x08, +/* 0000D810 */ 0x0F, 0x03, 0x00, 0x10, 0x09, 0x0E, 0x00, 0x97, 0x11, 0x0C, 0x08, 0x2F, 0x11, 0x06, 0x11, 0x47, +/* 0000D820 */ 0x10, 0x11, 0x09, 0x03, 0x00, 0x47, 0x10, 0x07, 0x2F, 0x0F, 0x0F, 0x10, 0x47, 0x0B, 0x0F, 0x8E, +/* 0000D830 */ 0x01, 0x09, 0x10, 0x61, 0x10, 0x10, 0x00, 0x6C, 0x0F, 0x10, 0x04, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000D840 */ 0x10, 0x5C, 0x01, 0x09, 0xA8, 0x11, 0x14, 0x03, 0x00, 0x0B, 0x11, 0x09, 0x0C, 0x00, 0x8E, 0x01, +/* 0000D850 */ 0x3A, 0x12, 0x4B, 0x12, 0x47, 0x11, 0x12, 0x09, 0x03, 0x00, 0x47, 0x11, 0x0B, 0x5C, 0x02, 0x11, +/* 0000D860 */ 0x1F, 0x03, 0xFF, 0x0F, 0x09, 0x13, 0x00, 0x8E, 0x01, 0x3A, 0x0F, 0x4B, 0x0F, 0x14, 0x03, 0x00, +/* 0000D870 */ 0x0B, 0x0F, 0x09, 0x05, 0x00, 0xA8, 0x0F, 0x47, 0x0B, 0x0F, 0x14, 0x03, 0x00, 0x0A, 0x09, 0x09, +/* 0000D880 */ 0x09, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x1B, 0x00, 0x09, 0x16, 0x00, 0x14, 0x03, 0x00, 0x0A, 0x0B, +/* 0000D890 */ 0x09, 0x08, 0x00, 0xA8, 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, +/* 0000D8A0 */ 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x19, 0x03, 0xFE, 0xB7, 0x01, 0xFE, 0x2C, 0x02, 0xFE, 0x39, +/* 0000D8B0 */ 0x02, 0xFE, 0xBA, 0x01, 0xFE, 0xA1, 0x17, 0x11, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x46, 0x00, +/* 0000D8C0 */ 0x0A, 0x00, 0x30, 0x00, 0x18, 0x00, 0x44, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x0D, 0x00, 0x2D, 0x00, +/* 0000D8D0 */ 0x0E, 0x00, 0x3A, 0x00, 0x21, 0x00, 0x52, 0x00, 0x47, 0x00, 0x0C, 0x01, 0x38, 0x00, 0x73, 0x00, +/* 0000D8E0 */ 0x0E, 0x00, 0x30, 0x00, 0x05, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x2C, 0x00, 0x09, 0x00, 0x26, 0x00, +/* 0000D8F0 */ 0x08, 0x00, 0x34, 0x00, 0x08, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x25, 0x00, 0x00, 0xBF, 0x5C, 0x80, +/* 0000D900 */ 0xE0, 0x01, 0xC4, 0x00, 0x99, 0x1C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x38, 0x03, 0x08, 0xFE, 0x03, +/* 0000D910 */ 0x17, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x03, 0x17, 0x51, 0x51, 0x01, 0x05, 0x02, +/* 0000D920 */ 0x05, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x1F, 0x8E, 0x01, 0x09, 0x06, +/* 0000D930 */ 0x6C, 0x05, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x02, +/* 0000D940 */ 0x1F, 0x03, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xA7, 0x02, 0xFE, 0x20, +/* 0000D950 */ 0x17, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x33, 0x00, 0x00, 0xBF, 0x4C, 0x00, 0xE0, 0x01, +/* 0000D960 */ 0xC0, 0x00, 0x93, 0x1C, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x37, 0x03, 0x07, 0xFE, 0x69, 0x16, 0xFF, +/* 0000D970 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x69, 0x16, 0x7B, 0x7B, 0x41, 0x02, 0x04, 0x05, 0x0A, +/* 0000D980 */ 0x0A, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x1C, 0x00, 0x0A, 0x80, 0x03, 0x07, 0x00, 0x0A, 0x80, +/* 0000D990 */ 0x1E, 0x61, 0x05, 0x04, 0x00, 0x14, 0x0F, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0x61, 0x05, 0x04, +/* 0000D9A0 */ 0x00, 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, 0x02, 0x00, 0x23, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 0000D9B0 */ 0x31, 0x01, 0xFE, 0x81, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x4A, 0x00, 0x04, 0x00, +/* 0000D9C0 */ 0x18, 0x00, 0x00, 0xBF, 0x7C, 0x00, 0x01, 0x00, 0xC0, 0x04, 0x88, 0x1B, 0xA2, 0x41, 0xC1, 0x00, +/* 0000D9D0 */ 0xFE, 0x36, 0x03, 0x06, 0xFE, 0x10, 0x15, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x10, +/* 0000D9E0 */ 0x15, 0xD5, 0xD5, 0x41, 0x06, 0x05, 0x09, 0x03, 0x13, 0x11, 0x0E, 0x01, 0x01, 0x05, 0x34, 0x01, +/* 0000D9F0 */ 0x00, 0x08, 0x01, 0x01, 0x38, 0x4F, 0x08, 0x47, 0x08, 0x02, 0xEA, 0x00, 0x12, 0x03, 0x00, 0x08, +/* 0000DA00 */ 0x06, 0x09, 0x25, 0x00, 0xBA, 0x09, 0x08, 0x05, 0x0F, 0x03, 0x00, 0x09, 0x09, 0x14, 0x00, 0x47, +/* 0000DA10 */ 0x09, 0x07, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x97, 0x0A, 0x05, 0x08, 0x5C, 0x01, 0x0A, 0x1F, +/* 0000DA20 */ 0x02, 0xFF, 0x09, 0x28, 0x08, 0x08, 0x09, 0xD1, 0xFF, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x37, 0x15, +/* 0000DA30 */ 0x06, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, 0x00, 0x0B, 0x00, 0x26, +/* 0000DA40 */ 0x00, 0x14, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x21, 0xD4, +/* 0000DA50 */ 0x00, 0x7B, 0x22, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x49, 0x03, 0x05, 0xFE, 0x87, 0x13, 0xFF, 0x00, +/* 0000DA60 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x87, 0x13, 0xFE, 0x6B, 0x01, 0xFE, 0x6B, 0x01, 0x01, 0x08, +/* 0000DA70 */ 0x04, 0x08, 0x04, 0x2A, 0x27, 0x01, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x07, 0x08, 0x07, 0x08, +/* 0000DA80 */ 0x80, 0x4F, 0x05, 0x4F, 0x06, 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x00, 0x07, 0x02, 0x00, +/* 0000DA90 */ 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x04, 0x1F, 0x02, 0x09, 0x09, 0x47, 0x05, 0x09, 0x14, 0x03, 0x00, +/* 0000DAA0 */ 0x05, 0x02, 0x09, 0x52, 0x00, 0x8E, 0x01, 0x44, 0x09, 0x4B, 0x09, 0x0F, 0x11, 0x00, 0x09, 0x09, +/* 0000DAB0 */ 0x00, 0x00, 0x8E, 0x01, 0x05, 0x09, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x03, 0x1F, 0x01, 0xFF, 0x09, +/* 0000DAC0 */ 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, 0x0A, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, +/* 0000DAD0 */ 0x04, 0x8E, 0x01, 0x44, 0x0B, 0x4B, 0x0B, 0x5C, 0x02, 0x0B, 0x1F, 0x03, 0x09, 0x09, 0x47, 0x06, +/* 0000DAE0 */ 0x09, 0xAC, 0x09, 0x0F, 0x02, 0x00, 0x06, 0xAB, 0x09, 0xAC, 0x00, 0x0F, 0x02, 0x00, 0x09, 0xAB, +/* 0000DAF0 */ 0x00, 0x09, 0x0B, 0x00, 0x09, 0x06, 0x00, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, +/* 0000DB00 */ 0x00, 0xFE, 0x28, 0x02, 0xFE, 0x39, 0x02, 0xFE, 0xA4, 0x13, 0x08, 0x04, 0x00, 0x00, 0x00, 0x18, +/* 0000DB10 */ 0x00, 0x40, 0x00, 0x08, 0x00, 0x23, 0x00, 0x0D, 0x00, 0x24, 0x00, 0x0E, 0x00, 0x32, 0x00, 0x21, +/* 0000DB20 */ 0x00, 0x4A, 0x00, 0x16, 0x00, 0x2D, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, +/* 0000DB30 */ 0x01, 0xC4, 0x00, 0x6E, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x48, 0x03, 0x04, 0xFE, 0x78, 0x11, +/* 0000DB40 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x78, 0x11, 0xFE, 0xEA, 0x01, 0xFE, 0xEA, 0x01, +/* 0000DB50 */ 0x41, 0x06, 0x05, 0x09, 0x04, 0x14, 0x12, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x08, 0x07, 0x06, +/* 0000DB60 */ 0xFE, 0x0A, 0x03, 0x05, 0xFE, 0x58, 0x03, 0x3F, 0x4F, 0x07, 0x8E, 0x01, 0x09, 0x0A, 0x6C, 0x09, +/* 0000DB70 */ 0x0A, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x0A, 0x5C, 0x01, 0x05, 0x5C, 0x02, 0x06, 0x1F, 0x03, +/* 0000DB80 */ 0x09, 0x09, 0x47, 0x07, 0x09, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, 0x16, 0x00, 0x76, 0x03, 0x05, +/* 0000DB90 */ 0x01, 0x47, 0x09, 0x05, 0xCD, 0x0A, 0x02, 0xA1, 0x00, 0x04, 0x0A, 0xA1, 0x01, 0x03, 0x0A, 0x76, +/* 0000DBA0 */ 0x0A, 0x09, 0x02, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0x14, 0x02, 0xFE, 0x27, 0x02, +/* 0000DBB0 */ 0xFE, 0xA7, 0x11, 0x05, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x4F, 0x00, 0x08, 0x00, 0x71, 0x00, +/* 0000DBC0 */ 0x04, 0x00, 0x33, 0x00, 0x14, 0x00, 0xC7, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0xE0, 0x01, 0xC4, 0x00, +/* 0000DBD0 */ 0x5D, 0x1D, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0x47, 0x03, 0x03, 0xFE, 0x8D, 0x0F, 0xFF, 0x00, 0x10, +/* 0000DBE0 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0x8D, 0x0F, 0xFE, 0xC9, 0x01, 0xFE, 0xC9, 0x01, 0x01, 0x04, 0x03, +/* 0000DBF0 */ 0x05, 0x02, 0x1D, 0x1D, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x05, 0xFE, 0x57, 0x03, 0x5F, +/* 0000DC00 */ 0x4F, 0x03, 0x8E, 0x01, 0x3C, 0x05, 0x4B, 0x05, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x18, 0x00, 0x8E, +/* 0000DC10 */ 0x01, 0x09, 0x05, 0x61, 0x05, 0x05, 0x00, 0x0F, 0x03, 0x00, 0x05, 0x09, 0x09, 0x00, 0x8E, 0x01, +/* 0000DC20 */ 0x3C, 0x00, 0x4B, 0x00, 0x09, 0x36, 0x00, 0x8E, 0x01, 0x09, 0x06, 0x6C, 0x05, 0x06, 0x01, 0x07, +/* 0000DC30 */ 0x01, 0x00, 0x5C, 0x00, 0x06, 0x1F, 0x01, 0x05, 0x05, 0x54, 0x03, 0x05, 0x0F, 0x0C, 0x00, 0x03, +/* 0000DC40 */ 0x09, 0x00, 0x00, 0x01, 0x32, 0x01, 0x01, 0x3C, 0x02, 0x09, 0x06, 0x00, 0x01, 0x32, 0x01, 0x01, +/* 0000DC50 */ 0x3C, 0x03, 0x8E, 0x01, 0x3C, 0x00, 0x4B, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, +/* 0000DC60 */ 0x17, 0x03, 0xFE, 0x2D, 0x02, 0xFE, 0xA3, 0x0F, 0x08, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x39, +/* 0000DC70 */ 0x00, 0x09, 0x00, 0x2B, 0x00, 0x15, 0x00, 0x34, 0x00, 0x07, 0x00, 0x9C, 0x00, 0x09, 0x00, 0x35, +/* 0000DC80 */ 0x00, 0x06, 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, +/* 0000DC90 */ 0x00, 0x3B, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0x2B, 0x03, 0x02, 0xFE, 0xC9, 0x09, 0xFF, 0x00, +/* 0000DCA0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xC9, 0x09, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, +/* 0000DCB0 */ 0x10, 0x01, 0x02, 0x07, 0x07, 0x08, 0x2F, 0x8E, 0x01, 0x1A, 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, +/* 0000DCC0 */ 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8E, 0x01, 0x0A, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 0000DCD0 */ 0x03, 0x5C, 0x01, 0x06, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x09, 0x09, 0x5C, 0x03, 0x09, 0x1F, 0x04, +/* 0000DCE0 */ 0xFF, 0x08, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xF4, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, +/* 0000DCF0 */ 0x46, 0x00, 0x00}; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp index 83be5a987b8..bf7fd8d6a0b 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp @@ -18,6 +18,7 @@ using namespace Windows::Globalization; #ifdef INTL_ICU #include #include "PlatformAgnostic/IPlatformAgnosticResource.h" +#include "PlatformAgnostic/Intl.h" using namespace PlatformAgnostic::Intl; using namespace PlatformAgnostic::Resource; #endif @@ -27,13 +28,13 @@ using namespace PlatformAgnostic::Resource; #pragma warning(disable:4838) // conversion from 'int' to 'const char' requires a narrowing conversion #if DISABLE_JIT -#if _M_AMD64 +#if TARGET_64 #include "InJavascript/Intl.js.nojit.bc.64b.h" #else #include "InJavascript/Intl.js.nojit.bc.32b.h" #endif #else -#if _M_AMD64 +#if TARGET_64 #include "InJavascript/Intl.js.bc.64b.h" #else #include "InJavascript/Intl.js.bc.32b.h" @@ -164,7 +165,10 @@ namespace Js } } }; +#endif +// Defining Finalizable wrappers for Intl data +#if defined(INTL_WINGLOB) class AutoCOMJSObject : public FinalizableObject { IInspectable *instance; @@ -203,6 +207,55 @@ namespace Js return instance; } }; + +#elif defined(INTL_ICU) + + template + class AutoIcuJsObject : public FinalizableObject + { + private: + FieldNoBarrier(T *) instance; + + public: + DEFINE_VTABLE_CTOR_NOBASE(AutoIcuJsObject); + + AutoIcuJsObject(T *object) + : instance(object) + { } + + static AutoIcuJsObject * New(Recycler *recycler, T *object) + { + return RecyclerNewFinalized(recycler, AutoIcuJsObject, object); + } + + void Finalize(bool isShutdown) override + { + } + + void Dispose(bool isShutdown) override + { + if (!isShutdown) + { + // Here we use Cleanup() because we can't rely on delete (not dealing with virtual destructors). + // The template thus requires that the type implement the Cleanup function. + instance->Cleanup(); // e.g. deletes the object held in the IPlatformAgnosticResource + + // REVIEW (doilij): Is cleanup in this way necessary or are the trivial destructors enough, assuming Cleanup() has been called? + // Note: delete here introduces a build break on Linux complaining of non-virtual dtor + // delete instance; // deletes the instance itself + // instance = nullptr; + } + } + + void Mark(Recycler *recycler) override + { + } + + T * GetInstance() + { + return instance; + } + }; #endif IntlEngineInterfaceExtensionObject::IntlEngineInterfaceExtensionObject(Js::ScriptContext* scriptContext) : @@ -280,7 +333,7 @@ namespace Js void IntlEngineInterfaceExtensionObject::DumpByteCode() { Output::Print(_u("Dumping Intl Byte Code:")); - this->EnsureIntlByteCode(scriptContext); + Assert(this->intlByteCode); Js::ByteCodeDumper::DumpRecursively(intlByteCode); } #endif @@ -410,6 +463,8 @@ namespace Js HRESULT hr = Js::ByteCodeSerializer::DeserializeFromBuffer(scriptContext, flags, (LPCUTF8)nullptr, hsi, (byte*)Library_Bytecode_Intl, nullptr, &this->intlByteCode); IfFailAssertMsgAndThrowHr(hr, "Failed to deserialize Intl.js bytecode - very probably the bytecode needs to be rebuilt."); + + this->SetHasBytecode(); } } @@ -475,9 +530,11 @@ namespace Js } #endif +#ifdef ENABLE_SCRIPT_DEBUGGING // Mark we are profiling library code already, so that any initialization library code called here won't be reported to profiler. // Also tell the debugger not to record events during intialization so that we don't leak information about initialization. AutoInitLibraryCodeScope autoInitLibraryCodeScope(scriptContext); +#endif Js::Var args[] = { scriptContext->GetLibrary()->GetUndefined(), scriptContext->GetLibrary()->GetEngineInterfaceObject(), initType }; Js::CallInfo callInfo(Js::CallFlags_Value, _countof(args)); @@ -495,6 +552,14 @@ namespace Js deletePrototypePropertyHelper(scriptContext, intlObject, Js::PropertyIds::NumberFormat, Js::PropertyIds::format); deletePrototypePropertyHelper(scriptContext, intlObject, Js::PropertyIds::DateTimeFormat, Js::PropertyIds::format); } + +#if DBG_DUMP + if (PHASE_DUMP(Js::ByteCodePhase, function->GetFunctionProxy()) && Js::Configuration::Global.flags.Verbose) + { + DumpByteCode(); + } +#endif + } catch (const JavascriptException& err) { @@ -614,15 +679,17 @@ namespace Js char16 normalized[ULOC_FULLNAME_CAPACITY] = { 0 }; size_t normalizedLength = 0; hr = NormalizeLanguageTag(argString->GetSz(), argString->GetLength(), normalized, &normalizedLength); + if (FAILED(hr)) + { + HandleOOMSOEHR(hr); + //If we can't normalize the tag; return undefined. + return scriptContext->GetLibrary()->GetUndefined(); + } + retVal = Js::JavascriptString::NewCopyBuffer(normalized, static_cast(normalizedLength), scriptContext); #else AutoHSTRING str; hr = GetWindowsGlobalizationAdapter(scriptContext)->NormalizeLanguageTag(scriptContext, argString->GetSz(), &str); - DelayLoadWindowsGlobalization *wsl = scriptContext->GetThreadContext()->GetWindowsGlobalizationLibrary(); - PCWSTR strBuf = wsl->WindowsGetStringRawBuffer(*str, NULL); - retVal = Js::JavascriptString::NewCopySz(strBuf, scriptContext); -#endif - if (FAILED(hr)) { HandleOOMSOEHR(hr); @@ -630,6 +697,11 @@ namespace Js return scriptContext->GetLibrary()->GetUndefined(); } + DelayLoadWindowsGlobalization *wsl = scriptContext->GetThreadContext()->GetWindowsGlobalizationLibrary(); + PCWSTR strBuf = wsl->WindowsGetStringRawBuffer(*str, NULL); + retVal = Js::JavascriptString::NewCopySz(strBuf, scriptContext); +#endif + return retVal; } Var IntlEngineInterfaceExtensionObject::EntryIntl_ResolveLocaleLookup(RecyclableObject* function, CallInfo callInfo, ...) @@ -682,8 +754,7 @@ namespace Js } Var toReturn = nullptr; - ENTER_PINNED_SCOPE(JavascriptString, localeStrings); - localeStrings = JavascriptString::FromVar(args.Values[1]); + JavascriptString *localeStrings = JavascriptString::FromVar(args.Values[1]); PCWSTR passedLocale = localeStrings->GetSz(); #if defined(INTL_ICU) @@ -722,8 +793,6 @@ namespace Js #endif - LEAVE_PINNED_SCOPE(); // localeStrings - return toReturn; } @@ -874,23 +943,11 @@ namespace Js } Assert(numberFormatter); - // REVIEW (doilij): AutoPtr will call delete on IPlatformAgnosticResource and complain of non-virtual dtor. There are no IfFailThrowHr so is this still necessary? - // TODO (doilij): If necessary, introduce an PlatformAgnosticResourceAutoPtr that calls Cleanup() instead of delete on the pointer. - // AutoPtr numberFormatterGuard(numberFormatter); - - // TODO (doilij): Render signed zero. - - bool isDecimalPointAlwaysDisplayed = false; - bool useGrouping = true; - - if (GetTypedPropertyBuiltInFrom(options, __isDecimalPointAlwaysDisplayed, JavascriptBoolean)) - { - isDecimalPointAlwaysDisplayed = JavascriptBoolean::FromVar(propertyValue)->GetValue(); - } if (GetTypedPropertyBuiltInFrom(options, __useGrouping, JavascriptBoolean)) { - useGrouping = JavascriptBoolean::FromVar(propertyValue)->GetValue(); + bool useGrouping = JavascriptBoolean::FromVar(propertyValue)->GetValue(); + SetNumberFormatGroupingUsed(numberFormatter, useGrouping); } // Numeral system is in the locale and is therefore already set on the icu::NumberFormat @@ -941,9 +998,6 @@ namespace Js auto *autoObject = AutoIcuJsObject::New(scriptContext->GetRecycler(), numberFormatter); options->SetInternalProperty(Js::InternalPropertyIds::HiddenObject, autoObject, Js::PropertyOperationFlags::PropertyOperation_None, NULL); - // clear the pointer so it is not freed when numberFormatterGuard goes out of scope - // numberFormatterGuard.setPointer(nullptr); - return scriptContext->GetLibrary()->GetUndefined(); #else DelayLoadWindowsGlobalization* wgl = scriptContext->GetThreadContext()->GetWindowsGlobalizationLibrary(); @@ -1233,12 +1287,8 @@ namespace Js const char16 *givenLocale = nullptr; defaultLocale[0] = '\0'; - ENTER_PINNED_SCOPE(JavascriptString, str1); - ENTER_PINNED_SCOPE(JavascriptString, str2); - ENTER_PINNED_SCOPE(JavascriptString, givenLocaleStr); - str1 = JavascriptString::FromVar(args.Values[1]); - str2 = JavascriptString::FromVar(args.Values[2]); - givenLocaleStr = nullptr; + JavascriptString *str1 = JavascriptString::FromVar(args.Values[1]); + JavascriptString *str2 = JavascriptString::FromVar(args.Values[2]); if (!JavascriptOperators::IsUndefinedObject(args.Values[3])) { @@ -1246,8 +1296,7 @@ namespace Js { return scriptContext->GetLibrary()->GetUndefined(); } - givenLocaleStr = JavascriptString::FromVar(args.Values[3]); - givenLocale = givenLocaleStr->GetSz(); + givenLocale = JavascriptString::FromVar(args.Values[3])->GetSz(); } if (!JavascriptOperators::IsUndefinedObject(args.Values[4])) @@ -1344,10 +1393,6 @@ namespace Js } END_TEMP_ALLOCATOR(tempAllocator, scriptContext); - LEAVE_PINNED_SCOPE(); // str1 - LEAVE_PINNED_SCOPE(); // str2 - LEAVE_PINNED_SCOPE(); // givenLocaleStr - // CompareStringEx returns 1, 2, 3 on success; 2 if the strings are equal, 1 if the first string is lexically less than second, 3 otherwise. if (compareResult != 0) { @@ -1682,41 +1727,53 @@ namespace Js */ Var IntlEngineInterfaceExtensionObject::EntryIntl_RegisterBuiltInFunction(RecyclableObject* function, CallInfo callInfo, ...) { + // Don't put this in a header or add it to the namespace even in this file. Keep it to the minimum scope needed. + enum class IntlBuiltInFunctionID : int32 { + Min = 0, + DateToLocaleString = Min, + DateToLocaleDateString, + DateToLocaleTimeString, + NumberToLocaleString, + StringLocaleCompare, + Max + }; + EngineInterfaceObject_CommonFunctionProlog(function, callInfo); - //This function will only be used during the construction of the Intl object, hence Asserts are in place. + // This function will only be used during the construction of the Intl object, hence Asserts are in place. Assert(args.Info.Count >= 3 && JavascriptFunction::Is(args.Values[1]) && TaggedInt::Is(args.Values[2])); JavascriptFunction *func = JavascriptFunction::FromVar(args.Values[1]); int32 id = TaggedInt::ToInt32(args.Values[2]); + Assert(id >= (int32)IntlBuiltInFunctionID::Min && id < (int32)IntlBuiltInFunctionID::Max); - Assert(id >= 0 && id < 5); EngineInterfaceObject* nativeEngineInterfaceObj = scriptContext->GetLibrary()->GetEngineInterfaceObject(); IntlEngineInterfaceExtensionObject* extensionObject = static_cast(nativeEngineInterfaceObj->GetEngineExtension(EngineInterfaceExtensionKind_Intl)); - switch (id) + IntlBuiltInFunctionID functionID = static_cast(id); + switch (functionID) { - case 0: + case IntlBuiltInFunctionID::DateToLocaleString: extensionObject->dateToLocaleString = func; break; - case 1: + case IntlBuiltInFunctionID::DateToLocaleDateString: extensionObject->dateToLocaleDateString = func; break; - case 2: + case IntlBuiltInFunctionID::DateToLocaleTimeString: extensionObject->dateToLocaleTimeString = func; break; - case 3: + case IntlBuiltInFunctionID::NumberToLocaleString: extensionObject->numberToLocaleString = func; break; - case 4: + case IntlBuiltInFunctionID::StringLocaleCompare: extensionObject->stringLocaleCompare = func; break; default: - Assert(false);//Shouldn't hit here, the previous assert should catch this. + AssertMsg(false, "functionID was not one of the allowed values. The previous assert should catch this."); break; } - //Don't need to return anything + // Don't need to return anything return scriptContext->GetLibrary()->GetUndefined(); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSON.cpp b/deps/chakrashim/core/lib/Runtime/Library/JSON.cpp index 37d9c21df8e..31da047eac4 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JSON.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JSON.cpp @@ -7,11 +7,9 @@ #include "Library/JSONParser.h" #include "Library/JSON.h" -#define MAX_JSON_STRINGIFY_NAMES_ON_STACK 20 -static const int JSONspaceSize = 10; //ES5 defined limit on the indentation space using namespace Js; - +// TODO: make JSON a class and use the normal EntryInfo code namespace JSON { Js::FunctionInfo EntryInfo::Stringify(FORCE_NO_WRITE_BARRIER_TAG(JSON::Stringify), Js::FunctionInfo::ErrorOnNew); @@ -38,20 +36,17 @@ namespace JSON Js::JavascriptError::ThrowSyntaxError(scriptContext, ERRsyntax); } - Js::JavascriptString* input; Js::Var value = args[1]; - if (Js::JavascriptString::Is(value)) - { - input = Js::JavascriptString::FromVar(value); - } - else + + Js::JavascriptString * input = JavascriptOperators::TryFromVar(value); + if (!input) { input = Js::JavascriptConversion::ToString(value, scriptContext); } - Js::RecyclableObject* reviver = NULL; + Js::RecyclableObject* reviver = nullptr; if (args.Info.Count > 2 && Js::JavascriptConversion::IsCallable(args[2])) { - reviver = Js::RecyclableObject::FromVar(args[2]); + reviver = Js::RecyclableObject::UnsafeFromVar(args[2]); } return Parse(input, reviver, scriptContext); @@ -65,17 +60,27 @@ namespace JSON TryFinally([&]() { - result = parser.Parse(input); + LazyJSONString* lazyString = LazyJSONString::TryFromVar(input); + if (lazyString) + { + // Try to reconstruct object based on the data collected during stringify + // In case of semantically important gap, this call may fail and we will need to do real parse + result = lazyString->TryParse(); + } + if (result == nullptr) + { + result = parser.Parse(input); + } -#ifdef ENABLE_DEBUG_CONFIG_OPTIONS + #ifdef ENABLE_DEBUG_CONFIG_OPTIONS if (CONFIG_FLAG(ForceGCAfterJSONParse)) { Recycler* recycler = scriptContext->GetRecycler(); recycler->CollectNow(); } -#endif + #endif - if(reviver) + if (reviver) { Js::DynamicObject* root = scriptContext->GetLibrary()->CreateObject(); JS_ETW(EventWriteJSCRIPT_RECYCLER_ALLOCATE_OBJECT(root)); @@ -84,7 +89,7 @@ namespace JSON result = parser.Walk(scriptContext->GetLibrary()->GetEmptyString(), propertyId, root); } }, - [&](bool/*hasException*/) + [&](bool/*hasException*/) { parser.Finalizer(); }); @@ -92,64 +97,6 @@ namespace JSON return result; } - inline bool IsValidReplacerType(Js::TypeId typeId) - { - switch(typeId) - { - case Js::TypeIds_Integer: - case Js::TypeIds_String: - case Js::TypeIds_Number: - case Js::TypeIds_NumberObject: - case Js::TypeIds_Int64Number: - case Js::TypeIds_UInt64Number: - case Js::TypeIds_StringObject: - return true; - } - return false; - } - - uint32 AddToNameTable(StringifySession::StringTable nameTable[], uint32 tableLen, uint32 size, Js::Var item, Js::ScriptContext* scriptContext) - { - Js::Var value = nullptr; - switch (Js::JavascriptOperators::GetTypeId(item)) - { - case Js::TypeIds_Integer: - value = scriptContext->GetIntegerString(item); - break; - case Js::TypeIds_String: - value = item; - break; - case Js::TypeIds_Number: - case Js::TypeIds_NumberObject: - case Js::TypeIds_Int64Number: - case Js::TypeIds_UInt64Number: - case Js::TypeIds_StringObject: - value = Js::JavascriptConversion::ToString(item, scriptContext); - break; - } - if (value && Js::JavascriptString::Is(value)) - { - // Only validate size when about to modify it. We skip over all other (non-valid) replacement elements. - if (tableLen == size) - { - Js::Throw::FatalInternalError(); // nameTable buffer calculation is wrong - } - Js::JavascriptString *propertyName = Js::JavascriptString::FromVar(value); - nameTable[tableLen].propName = propertyName; - Js::PropertyRecord const * propertyRecord; - scriptContext->GetOrAddPropertyRecord(propertyName, &propertyRecord); - nameTable[tableLen].propRecord = propertyRecord; // Keep the property id alive. - tableLen++; - } - return tableLen; - } - - BVSparse* AllocateMap(ArenaAllocator *tempAlloc) - { - //To escape error C2712: Cannot use __try in functions that require object unwinding - return Anew(tempAlloc, BVSparse, tempAlloc); - } - Js::Var Stringify(Js::RecyclableObject* function, Js::CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); @@ -168,16 +115,14 @@ namespace JSON // shortcut: the stringify algorithm returns undefined in this case. return library->GetUndefined(); } - Js::Var value = args[1]; Js::Var replacerArg = args.Info.Count > 2 ? args[2] : nullptr; Js::Var space = args.Info.Count > 3 ? args[3] : library->GetNull(); - Js::DynamicObject* remoteObject; - Js::TypeId valueType = Js::JavascriptOperators::GetTypeId(value); - if (valueType == Js::TypeIds_HostDispatch) + if (Js::JavascriptOperators::GetTypeId(value) == Js::TypeIds_HostDispatch) { - remoteObject = Js::RecyclableObject::FromVar(value)->GetRemoteObject(); + // If we a remote object, we need to pull out the underlying JS object to stringify that + Js::DynamicObject* remoteObject = Js::RecyclableObject::FromVar(value)->GetRemoteObject(); if (remoteObject != nullptr) { value = Js::DynamicObject::FromVar(remoteObject); @@ -192,883 +137,12 @@ namespace JSON } } - Js::Var result = nullptr; - StringifySession stringifySession(scriptContext); - //stringifySession will point to the memory allocated by nameTable, so make sure lifespans are linked. - StringifySession::StringTable* nameTable = nullptr; - - DECLARE_TEMP_GUEST_ALLOCATOR(nameTableAlloc); - - if (replacerArg) - { - if (Js::JavascriptOperators::IsArray(replacerArg)) - { - uint32 length; - Js::JavascriptArray *reArray = nullptr; - Js::RecyclableObject *reRemoteArray = Js::RecyclableObject::FromVar(replacerArg); - bool isArray = false; - - if (Js::JavascriptArray::Is(replacerArg)) - { - reArray = Js::JavascriptArray::FromVar(replacerArg); - length = reArray->GetLength(); - isArray = true; - } - else - { - length = Js::JavascriptConversion::ToUInt32(Js::JavascriptOperators::OP_GetLength(replacerArg, scriptContext), scriptContext); - } - - uint32 count = 0; - Js::Var item = nullptr; - - if (isArray) - { - for (uint32 i = 0; i< length; i++) - { - Js::TypeId idn = Js::JavascriptOperators::GetTypeId(reArray->DirectGetItem(i)); - if(IsValidReplacerType(idn)) - { - count++; - } - } - } - else - { - for (uint32 i = 0; i< length; i++) - { - if (Js::JavascriptOperators::GetItem(reRemoteArray, i, &item, scriptContext)) - { - Js::TypeId idn = Js::JavascriptOperators::GetTypeId(item); - if(IsValidReplacerType(idn)) - { - count++; - } - } - } - } - - uint32 tableLen = 0; - if (count) - { - // the name table goes away with stringify session. - if (count < MAX_JSON_STRINGIFY_NAMES_ON_STACK) - { - PROBE_STACK(scriptContext, (sizeof(StringifySession::StringTable) * count)) ; - nameTable = (StringifySession::StringTable*)_alloca(sizeof(StringifySession::StringTable) * count); - } - else - { - ACQUIRE_TEMP_GUEST_ALLOCATOR(nameTableAlloc, scriptContext, _u("JSON")); - nameTable = AnewArray(nameTableAlloc, StringifySession::StringTable, count); - } - if (isArray && !!reArray->IsCrossSiteObject()) - { - for (uint32 i = 0; i < length; i++) - { - item = reArray->DirectGetItem(i); - tableLen = AddToNameTable(nameTable, tableLen, count, item, scriptContext); - } - } - else - { - for (uint32 i = 0; i < length; i++) - { - if (Js::JavascriptOperators::GetItem(reRemoteArray, i, &item, scriptContext)) - { - tableLen = AddToNameTable(nameTable, tableLen, count, item, scriptContext); - } - } - } - - //Eliminate duplicates in replacer array. - BEGIN_TEMP_ALLOCATOR(tempAlloc, scriptContext, _u("JSON")) - { - BVSparse* propIdMap = AllocateMap(tempAlloc); //Anew(tempAlloc, BVSparse, tempAlloc); - - // TODO: Potential arithmetic overflow for table size/count/tableLen if large replacement args are specified. - // tableLen is ensured by AddToNameTable but this doesn't propagate as an annotation so we assume here to fix the OACR warning. - _Analysis_assume_(tableLen <= count); - Assert(tableLen <= count); - - uint32 j = 0; - for (uint32 i=0; i < tableLen; i++) - { - if(propIdMap->TestAndSet(nameTable[i].propRecord->GetPropertyId())) //Find & skip duplicate - { - continue; - } - if (j != i) - { - nameTable[j] = nameTable[i]; - } - j++; - } - tableLen = j; - } - END_TEMP_ALLOCATOR(tempAlloc, scriptContext); - } - - stringifySession.InitReplacer(nameTable, tableLen); - } - else if (Js::JavascriptConversion::IsCallable(replacerArg)) - { - stringifySession.InitReplacer(Js::RecyclableObject::FromVar(replacerArg)); - } - } - - BEGIN_TEMP_ALLOCATOR(tempAlloc, scriptContext, _u("JSON")) - { - stringifySession.CompleteInit(space, tempAlloc); - - Js::DynamicObject* wrapper = scriptContext->GetLibrary()->CreateObject(); - JS_ETW(EventWriteJSCRIPT_RECYCLER_ALLOCATE_OBJECT(wrapper)); - Js::PropertyId propertyId = scriptContext->GetEmptyStringPropertyId(); - Js::JavascriptOperators::InitProperty(wrapper, propertyId, value); - result = stringifySession.Str(scriptContext->GetLibrary()->GetEmptyString(), propertyId, wrapper, value); - } - END_TEMP_ALLOCATOR(tempAlloc, scriptContext); - - RELEASE_TEMP_GUEST_ALLOCATOR(nameTableAlloc, scriptContext); - return result; - } - - // -------- StringifySession implementation ------------// - - class JSONSpace - { - public: - static char16 Buffer[JSONspaceSize]; - JSONSpace() { wmemset(Buffer, _u(' '), JSONspaceSize); } - }; - char16 JSONSpace::Buffer[JSONspaceSize]; - static JSONSpace jsonSpace; - - void StringifySession::CompleteInit(Js::Var space, ArenaAllocator* tempAlloc) - { - charcount_t len = 0; - switch (Js::JavascriptOperators::GetTypeId(space)) - { - case Js::TypeIds_Integer: - { - len = max(0, min(JSONspaceSize, static_cast(Js::TaggedInt::ToInt32(space)))); - if (len) - { - gap = Js::JavascriptString::NewCopyBuffer(jsonSpace.Buffer, len, scriptContext); - } - break; - } - case Js::TypeIds_Number: - case Js::TypeIds_NumberObject: - case Js::TypeIds_Int64Number: - case Js::TypeIds_UInt64Number: - { - len = max(0, static_cast(min(static_cast(JSONspaceSize), Js::JavascriptConversion::ToInteger(space, scriptContext)))); - if (len) - { - gap = Js::JavascriptString::NewCopyBuffer(jsonSpace.Buffer, len, scriptContext); - } - break; - } - case Js::TypeIds_String: - { - len = min(static_cast(JSONspaceSize), Js::JavascriptString::FromVar(space)->GetLength()); - if(len) - { - gap = Js::JavascriptString::NewCopyBuffer(Js::JavascriptString::FromVar(space)->GetString(), len, scriptContext); - } - break; - } - case Js::TypeIds_StringObject: - { - Js::Var spaceString = Js::JavascriptConversion::ToString(space, scriptContext); - if(Js::JavascriptString::Is(spaceString)) - { - len = min(static_cast(JSONspaceSize), Js::JavascriptString::FromVar(spaceString)->GetLength()); - if(len) - { - gap = Js::JavascriptString::NewCopyBuffer(Js::JavascriptString::FromVar(spaceString)->GetString(), len, scriptContext); - } - } - break; - } - } - - objectStack = Anew(tempAlloc, JSONStack, tempAlloc, scriptContext); - } - - Js::Var StringifySession::Str(uint32 index, Js::RecyclableObject * holder) - { - Js::Var value = nullptr; - Js::RecyclableObject *undefined = scriptContext->GetLibrary()->GetUndefined(); - - if (Js::JavascriptArray::Is(holder->GetTypeId()) && !Js::JavascriptArray::FromAnyArray(holder)->IsCrossSiteObject()) - { - value = Js::JavascriptArray::FromAnyArray(holder)->DirectGetItem(index); - if (Js::JavascriptOperators::IsUndefinedObject(value, undefined)) - { - return value; - } - } - else - { - if (!Js::JavascriptOperators::GetItem(holder, index, &value, scriptContext)) - { - return undefined; - } - if (Js::JavascriptOperators::IsUndefinedObject(value, undefined)) - { - return value; - } - } - - Js::JavascriptString *key = scriptContext->GetIntegerString(index); - return StrHelper(key, value, holder); - } - - Js::Var StringifySession::Str(Js::JavascriptString* key, Js::PropertyId keyId, Js::Var holder, Js::Var value) - { - // We should look only into object's own properties here. When an object is serialized, only the own properties are considered, - // the prototype chain is not considered. However, the property names can be selected via an array replacer. In this case - // ES5 spec doesn't say the property has to own property or even to be enumerable. So, properties from the prototype, or non enum properties, - // can end up being serialized. Well, that is the ES5 spec word. - //if(!Js::RecyclableObject::FromVar(holder)->GetType()->GetProperty(holder, keyId, &value)) - - if (value == nullptr) + LazyJSONString* lazy = JSONStringifier::Stringify(scriptContext, value, replacerArg, space); + if (!lazy) { - if (VirtualTableInfo::HasVirtualTable(key)) - { - PropertyValueInfo info; - Js::PropertyString* propertyString = (Js::PropertyString*)key; - PropertyValueInfo::SetCacheInfo(&info, propertyString, propertyString->GetLdElemInlineCache(), false); - CacheOperators::TryGetProperty(holder, false, Js::RecyclableObject::FromVar(holder), keyId, &value, scriptContext, nullptr, &info); - } - - if (value == nullptr) - { - if (!Js::JavascriptOperators::GetProperty(Js::RecyclableObject::FromVar(holder), keyId, &value, scriptContext)) - { - return scriptContext->GetLibrary()->GetUndefined(); - } - } - } - - return StrHelper(key, value, holder); - } - - inline bool Get_ToJSON(ScriptContext* scriptContext, Js::JavascriptString* key, Js::Var* value, Js::TypeId typeId) - { - Js::Var toJSON = nullptr; - Js::RecyclableObject* object = Js::RecyclableObject::FromVar(*value); - while (typeId != Js::TypeIds_Null) - { - PropertyQueryFlags result = object->GetPropertyQuery(object, Js::PropertyIds::toJSON, &toJSON, nullptr, scriptContext); - - if (result != PropertyQueryFlags::Property_NotFound && Js::JavascriptConversion::IsCallable(toJSON)) - { - Js::Var values[2]; - Js::Arguments args(2, values); - args.Values[0] = *value; - args.Values[1] = key; - - Js::RecyclableObject* func = Js::RecyclableObject::FromVar(toJSON); - *value = Js::JavascriptFunction::CallFunction(func, func->GetEntryPoint(), args); - return true; - } - - object = object->GetPrototype(); - typeId = Js::JavascriptOperators::GetTypeId(object); - } - return false; - } - - Js::Var StringifySession::StrHelper(Js::JavascriptString* key, Js::Var value, Js::Var holder) - { - PROBE_STACK(scriptContext, Js::Constants::MinStackDefault); - AssertMsg(Js::RecyclableObject::Is(holder), "The holder argument in a JSON::Str function must be an object"); - - Js::Var undefined = scriptContext->GetLibrary()->GetUndefined(); - Js::TypeId id = Js::JavascriptOperators::GetTypeId(value); - - //check and apply 'toJSON' filter - if (Js::JavascriptOperators::IsJsNativeObject(value) || (Js::JavascriptOperators::IsObject(value))) - { - if (Get_ToJSON(scriptContext, key, &value, id)) - { - id = Js::JavascriptOperators::GetTypeId(value); - } - } - - //check and apply the user defined replacer filter - if (ReplacerFunction == replacerType) - { - Js::Var values[3]; - Js::Arguments args(0, values); - - args.Info.Count = 3; - args.Values[0] = holder; - args.Values[1] = key; - args.Values[2] = value; - - Js::RecyclableObject* func = replacer.ReplacerFunction; - value = Js::JavascriptFunction::CallFunction(func, func->GetEntryPoint(), args); - id = Js::JavascriptOperators::GetTypeId(value); - } - - if (Js::TypeIds_NumberObject == id) - { - value = Js::JavascriptNumber::ToVarNoCheck(Js::JavascriptConversion::ToNumber(value, scriptContext),scriptContext); - id = Js::JavascriptOperators::GetTypeId(value); - } - else if (Js::TypeIds_StringObject == id) - { - value = Js::JavascriptConversion::ToString(value, scriptContext); - id = Js::JavascriptOperators::GetTypeId(value); - } - else if (Js::TypeIds_BooleanObject == id) - { - value = Js::JavascriptBooleanObject::FromVar(value)->GetValue() ? - scriptContext->GetLibrary()->GetTrue() - : - scriptContext->GetLibrary()->GetFalse(); - id = Js::JavascriptOperators::GetTypeId(value); - } - - switch (id) - { - case Js::TypeIds_Undefined: - case Js::TypeIds_Symbol: - return undefined; - - case Js::TypeIds_Null: - return scriptContext->GetLibrary()->GetNullDisplayString(); - - case Js::TypeIds_Integer: - return scriptContext->GetIntegerString(value); - - case Js::TypeIds_Boolean: - return (Js::JavascriptBoolean::FromVar(value)->GetValue()) ? scriptContext->GetLibrary()->GetTrueDisplayString() : scriptContext->GetLibrary()->GetFalseDisplayString(); - - case Js::TypeIds_Int64Number: - if (Js::NumberUtilities::IsFinite(static_cast(Js::JavascriptInt64Number::FromVar(value)->GetValue()))) - { - return Js::JavascriptConversion::ToString(value, scriptContext); - } - else - { - return scriptContext->GetLibrary()->GetNullDisplayString(); - } - - case Js::TypeIds_UInt64Number: - if (Js::NumberUtilities::IsFinite(static_cast(Js::JavascriptUInt64Number::FromVar(value)->GetValue()))) - { - return Js::JavascriptConversion::ToString(value, scriptContext); - } - else - { - return scriptContext->GetLibrary()->GetNullDisplayString(); - } - - case Js::TypeIds_Number: - if (Js::NumberUtilities::IsFinite(Js::JavascriptNumber::GetValue(value))) - { - return Js::JavascriptConversion::ToString(value, scriptContext); - } - else - { - return scriptContext->GetLibrary()->GetNullDisplayString(); - } - - case Js::TypeIds_String: - return Quote(Js::JavascriptString::FromVar(value)); - - default: - Js::Var ret = undefined; - if (Js::JavascriptOperators::IsJsNativeObject(value)) - { - if (!Js::JavascriptConversion::IsCallable(value)) - { - if (objectStack->Has(value)) - { - Js::JavascriptError::ThrowTypeError(scriptContext, JSERR_JSONSerializeCircular); - } - objectStack->Push(value); - - if (Js::JavascriptOperators::IsArray(value)) - { - ret = StringifyArray(Js::RecyclableObject::FromVar(value)); - } - else - { - ret = StringifyObject(value); - } - objectStack->Pop(); - } - } - else if (Js::JavascriptOperators::IsObject(value)) //every object which is not a native object gets stringified here - { - if (objectStack->Has(value, false)) - { - Js::JavascriptError::ThrowTypeError(scriptContext, JSERR_JSONSerializeCircular); - } - objectStack->Push(value, false); - ret = StringifyObject(value); - objectStack->Pop(false); - } - return ret; - } - } - - Js::Var StringifySession::StringifyObject(Js::Var value) - { - Js::JavascriptString* propertyName; - Js::PropertyId id; - Js::PropertyRecord const * propRecord; - - bool isFirstMember = true; - bool isEmpty = true; - - uint stepBackIndent = this->indent++; - Js::JavascriptString* memberSeparator = NULL; // comma or comma+linefeed+indent - Js::JavascriptString* indentString = NULL; // gap*indent - Js::RecyclableObject* object = Js::RecyclableObject::FromVar(value); - Js::JavascriptString* result = NULL; - - if(ReplacerArray == this->replacerType) - { - result = Js::ConcatStringBuilder::New(this->scriptContext, this->replacer.propertyList.length); // Reserve initial slots for properties. - - for (uint k = 0; k < this->replacer.propertyList.length; k++) - { - propertyName = replacer.propertyList.propertyNames[k].propName; - id = replacer.propertyList.propertyNames[k].propRecord->GetPropertyId(); - - StringifyMemberObject(propertyName, id, value, (Js::ConcatStringBuilder*)result, indentString, memberSeparator, isFirstMember, isEmpty); - } - } - else - { - if (JavascriptProxy::Is(object)) - { - JavascriptProxy* proxyObject = JavascriptProxy::FromVar(object); - JavascriptArray* proxyResult = proxyObject->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind, this->scriptContext); - - // filter enumerable keys - uint32 resultLength = proxyResult->GetLength(); - result = Js::ConcatStringBuilder::New(this->scriptContext, resultLength); // Reserve initial slots for properties. - Var element; - for (uint32 i = 0; i < resultLength; i++) - { - element = proxyResult->DirectGetItem(i); - - Assert(JavascriptString::Is(element)); - propertyName = JavascriptString::FromVar(element); - - PropertyDescriptor propertyDescriptor; - JavascriptConversion::ToPropertyKey(propertyName, scriptContext, &propRecord); - id = propRecord->GetPropertyId(); - if (JavascriptOperators::GetOwnPropertyDescriptor(RecyclableObject::FromVar(proxyObject), id, scriptContext, &propertyDescriptor)) - { - if (propertyDescriptor.IsEnumerable()) - { - StringifyMemberObject(propertyName, id, value, (Js::ConcatStringBuilder*)result, indentString, memberSeparator, isFirstMember, isEmpty); - } - } - } - } - else - { - Js::JavascriptStaticEnumerator enumerator; - if (object->GetEnumerator(&enumerator, EnumeratorFlags::SnapShotSemantics | EnumeratorFlags::EphemeralReference, scriptContext)) - { - bool isDynamicObject = Js::DynamicObject::Is(object); - Js::DynamicObject * dynamicObject = nullptr; - bool hasObjectArray = false; - if (isDynamicObject) - { - dynamicObject = Js::DynamicObject::FromVar(object); - hasObjectArray = dynamicObject->HasObjectArray(); - } - - bool repFunctionIsReplacerType = ReplacerFunction == replacerType; - bool requiresStoringNames = repFunctionIsReplacerType && (!isDynamicObject || hasObjectArray); - if (!requiresStoringNames) - { - uint32 propertyCount; - - // if object has an objectArray, (aka indexed properties) - // we need to loop them first since they won't show up on the second loop below - // besides, we might be talking to a non dynamicObject - // in that case, we will also take the enumerator path - if (!isDynamicObject || hasObjectArray) - { - // get the precise count because resizing ConcatString will be expensive! - propertyCount = this->GetPropertyCount(object, &enumerator); - result = Js::ConcatStringBuilder::New(this->scriptContext, propertyCount); - - enumerator.Reset(); - while (propertyCount > 0 && (propertyName = enumerator.MoveAndGetNext(id)) != NULL) - { - // if unsuccessful get propertyId from the string - scriptContext->GetOrAddPropertyRecord(propertyName, &propRecord); - if (isDynamicObject && !propRecord->IsNumeric()) - { - break; - } - - id = propRecord->GetPropertyId(); - StringifyMemberObject(propertyName, id, value, - (Js::ConcatStringBuilder*)result, indentString, - memberSeparator, isFirstMember, isEmpty); - propertyCount--; - } - } - - if (isDynamicObject) - { - Js::DynamicTypeHandler * typeHandler = dynamicObject->GetTypeHandler(); - propertyCount = dynamicObject->GetPropertyCount(); // logic below assumes the whole unfiltered count - - if (result == NULL) - { - result = Js::ConcatStringBuilder::New(this->scriptContext, propertyCount); - } - - // loop over the named properties - for (uint32 i = 0; i < propertyCount; i++) - { - id = typeHandler->GetPropertyId(scriptContext, (Js::PropertyId)i); - if (id == Js::Constants::NoProperty || id < Js::InternalPropertyIds::Count) - { - continue; - } - - if (!dynamicObject->IsEnumerable(id)) - { - continue; - } - - Js::PropertyString * propertyString = scriptContext->GetPropertyString(id); - propRecord = propertyString->GetPropertyRecord(); - propertyName = (Js::JavascriptString*) propertyString; - - if (!propRecord->IsSymbol()) - { - PropertyIndex index = typeHandler->GetPropertyIndex(propRecord); - Js::Var property = index != Constants::NoSlot ? - Js::CrossSite::MarshalVar(scriptContext, dynamicObject->GetSlot(index)) - : - nullptr; // slow case. isCaller? - - StringifyMemberObject(propertyName, id, value, - (Js::ConcatStringBuilder*)result, indentString, - memberSeparator, isFirstMember, isEmpty, property); - } - } - } - } - else // case: ES5 && ReplacerFunction == replacerType. && object->HasObjectArray - { - // TODO: Optimize this? Store only the ObjectArray and loop over the params - Js::Var* nameTable = nullptr; - // ES5 requires that the new properties introduced by the replacer to not be stringified - // Get the actual count first. - uint precisePropertyCount = (uint) this->GetPropertyCount(object, &enumerator); - - result = Js::ConcatStringBuilder::New(this->scriptContext, precisePropertyCount); // Reserve initial slots for properties. - - // pick the property names before walking the object - DECLARE_TEMP_GUEST_ALLOCATOR(nameTableAlloc); - if (precisePropertyCount > 0) - { - // allocate and fill a table with the property names - if (precisePropertyCount < MAX_JSON_STRINGIFY_NAMES_ON_STACK) - { - PROBE_STACK(scriptContext, (sizeof(Js::Var) * precisePropertyCount)); - nameTable = (Js::Var*)_alloca(sizeof(Js::Var) * precisePropertyCount); - } else - { - ACQUIRE_TEMP_GUEST_ALLOCATOR(nameTableAlloc, scriptContext, _u("JSON")); - nameTable = AnewArray(nameTableAlloc, Js::Var, precisePropertyCount); - } - enumerator.Reset(); - uint index = 0; - while ((propertyName = enumerator.MoveAndGetNext(id)) != NULL && index < precisePropertyCount) - { - nameTable[index++] = propertyName; - } - - // If the enumeration changed, assert - We want to identify code that hits this, but don't want to break release cases. - Assert(index == precisePropertyCount); - - // walk the property name list - // Note that we're only walking up to index, not precisePropertyCount, as we only know that we've filled the array up to index (in release) - for (uint k = 0; k < index; k++) - { - propertyName = Js::JavascriptString::FromVar(nameTable[k]); - scriptContext->GetOrAddPropertyRecord(propertyName, &propRecord); - id = propRecord->GetPropertyId(); - StringifyMemberObject(propertyName, id, value, - (Js::ConcatStringBuilder*)result, indentString, - memberSeparator, isFirstMember, isEmpty); - } - } - RELEASE_TEMP_GUEST_ALLOCATOR(nameTableAlloc, scriptContext); - } - } - } - } - Assert(isEmpty || result); - - if(isEmpty) - { - result = scriptContext->GetLibrary()->GetEmptyObjectString(); - } - else - { - if(this->gap) - { - JavascriptLibrary *library = scriptContext->GetLibrary(); - if(!indentString) - { - indentString = GetIndentString(this->indent); - } - // Note: it's better to use strings with length = 1 as the are cached/new instances are not created every time. - Js::ConcatStringN<7>* retVal = Js::ConcatStringN<7>::New(this->scriptContext); - retVal->SetItem(0, library->GetOpenBracketString()); - retVal->SetItem(1, library->GetNewLineString()); - retVal->SetItem(2, indentString); - retVal->SetItem(3, result); - retVal->SetItem(4, library->GetNewLineString()); - retVal->SetItem(5, GetIndentString(stepBackIndent)); - retVal->SetItem(6, library->GetCloseBracketString()); - result = retVal; - } - else - { - result = Js::ConcatStringWrapping<_u('{'), _u('}')>::New(result); - } - } - - this->indent = stepBackIndent; - return result; - } - - Js::JavascriptString* StringifySession::GetArrayElementString(uint32 index, Js::RecyclableObject * arrayValue) - { - Js::RecyclableObject *undefined = scriptContext->GetLibrary()->GetUndefined(); - - Js::Var arrayElement = Str(index, arrayValue); - if (Js::JavascriptOperators::IsUndefinedObject(arrayElement, undefined)) - { - return scriptContext->GetLibrary()->GetNullDisplayString(); - } - return Js::JavascriptString::FromVar(arrayElement); - } - - Js::Var StringifySession::StringifyArray(Js::RecyclableObject * value) - { - uint stepBackIndent = this->indent++; - Js::JavascriptString* memberSeparator = NULL; // comma or comma+linefeed+indent - Js::JavascriptString* indentString = NULL; // gap*indent - - uint32 length; - if (Js::JavascriptArray::Is(value->GetTypeId())) - { - length = Js::JavascriptArray::FromAnyArray(value)->GetLength(); - } - else - { - int64 len = Js::JavascriptConversion::ToLength(Js::JavascriptOperators::OP_GetLength(value, scriptContext), scriptContext); - if (MaxCharCount <= len) - { - // If the length goes more than MaxCharCount we will eventually fail (as OOM) in ConcatStringBuilder - so failing early. - JavascriptError::ThrowRangeError(scriptContext, JSERR_OutOfBoundString); - } - length = (uint32)len; - } - - Js::JavascriptString* result; - if (length == 0) - { - result = scriptContext->GetLibrary()->GetEmptyArrayString(); - } - else - { - if (length == 1) - { - result = GetArrayElementString(0, value); - } - else - { - Assert(length > 1); - if (!indentString) - { - indentString = GetIndentString(this->indent); - memberSeparator = GetMemberSeparator(indentString); - } - bool isFirstMember = true; - - // Total node count: number of array elements (N = length) + indents [including member separators] (N = length - 1). - result = Js::ConcatStringBuilder::New(this->scriptContext, length * 2 - 1); - for (uint32 k = 0; k < length; k++) - { - if (!isFirstMember) - { - ((Js::ConcatStringBuilder*)result)->Append(memberSeparator); - } - Js::JavascriptString* arrayElementString = GetArrayElementString(k, value); - ((Js::ConcatStringBuilder*)result)->Append(arrayElementString); - isFirstMember = false; - } - } - - if (this->gap) - { - JavascriptLibrary *library = scriptContext->GetLibrary(); - if (!indentString) - { - indentString = GetIndentString(this->indent); - } - Js::ConcatStringN<7>* retVal = Js::ConcatStringN<7>::New(this->scriptContext); - retVal->SetItem(0, library->GetOpenSBracketString()); - retVal->SetItem(1, library->GetNewLineString()); - retVal->SetItem(2, indentString); - retVal->SetItem(3, result); - retVal->SetItem(4, library->GetNewLineString()); - retVal->SetItem(5, GetIndentString(stepBackIndent)); - retVal->SetItem(6, library->GetCloseSBracketString()); - result = retVal; - } - else - { - result = Js::ConcatStringWrapping<_u('['), _u(']')>::New(result); - } - } - - this->indent = stepBackIndent; - return result; - } - - Js::JavascriptString* StringifySession::GetPropertySeparator() - { - if(!propertySeparator) - { - if(this->gap) - { - propertySeparator = scriptContext->GetLibrary()->CreateStringFromCppLiteral(_u(": ")); - } - else - { - propertySeparator = scriptContext->GetLibrary()->GetColonString(); - } - } - return propertySeparator; - } - - Js::JavascriptString* StringifySession::GetIndentString(uint count) - { - // Note: this potentially can be improved by using a special ConcatString which has gap and count fields. - // Although this does not seem to be a critical path (using gap should not be often). - Js::JavascriptString* res = scriptContext->GetLibrary()->GetEmptyString(); - if(this->gap) - { - for (uint i = 0 ; i < count; i++) - { - res = Js::JavascriptString::Concat(res, this->gap); - } - } - return res; - } - - Js::JavascriptString* StringifySession::GetMemberSeparator(Js::JavascriptString* indentString) - { - if(this->gap) - { - return Js::JavascriptString::Concat(scriptContext->GetLibrary()->CreateStringFromCppLiteral(_u(",\n")), indentString); - } - else - { - return scriptContext->GetLibrary()->GetCommaDisplayString(); - } - } - - void StringifySession::StringifyMemberObject(Js::JavascriptString* propertyName, - Js::PropertyId id, Js::Var value, Js::ConcatStringBuilder* result, - Js::JavascriptString* &indentString, Js::JavascriptString* &memberSeparator, - bool &isFirstMember, bool &isEmpty, Js::Var propertyValue) - { - Js::Var propertyObjectString = Str(propertyName, id, value, propertyValue); - if(!Js::JavascriptOperators::IsUndefinedObject(propertyObjectString)) - { - int slotIndex = 0; - Js::ConcatStringN<4>* tempResult = Js::ConcatStringN<4>::New(this->scriptContext); // We may use 3 or 4 slots. - if(!isFirstMember) - { - if(!indentString) - { - indentString = GetIndentString(this->indent); - memberSeparator = GetMemberSeparator(indentString); - } - tempResult->SetItem(slotIndex++, memberSeparator); - } - tempResult->SetItem(slotIndex++, Quote(propertyName)); - tempResult->SetItem(slotIndex++, this->GetPropertySeparator()); - tempResult->SetItem(slotIndex++, Js::JavascriptString::FromVar(propertyObjectString)); - - result->Append(tempResult); - isFirstMember = false; - isEmpty = false; - } - } - - // Returns precise property count for given object and enumerator, does not count properties that are undefined. - inline uint32 StringifySession::GetPropertyCount(Js::RecyclableObject* object, Js::JavascriptStaticEnumerator* enumerator) - { - uint32 count = 0; - Js::JavascriptString * propertyName; - Js::PropertyId id; - enumerator->Reset(); - while ((propertyName = enumerator->MoveAndGetNext(id)) != NULL) - { - ++count; - } - return count; - } - - // Returns property count (including array items) for given object and enumerator. - // When object has objectArray, we do slow path return actual/precise count, in this case *pPrecise will receive true. - // Otherwise we optimize for speed and try to guess the count, in this case *pPrecise will receive false. - // Parameters: - // - object: the object to get the number of properties for. - // - enumerator: the enumerator to enumerate the object. - // - [out] pIsPrecise: receives a boolean indicating whether the value returned is precise or just guessed. - inline uint32 StringifySession::GetPropertyCount(Js::RecyclableObject* object, Js::JavascriptStaticEnumerator* enumerator, bool* pIsPrecise) - { - Assert(pIsPrecise); - *pIsPrecise = false; - - uint32 count = object->GetPropertyCount(); - if (Js::DynamicObject::Is(object) && Js::DynamicObject::FromVar(object)->HasObjectArray()) - { - // Can't use array->GetLength() as this can be sparse array for which we stringify only real/set properties. - // Do one walk through the elements. - // This would account for prototype property as well. - count = this->GetPropertyCount(object, enumerator); - *pIsPrecise = true; - } - if (!*pIsPrecise && count > sizeof(Js::JavascriptString*) * 8) - { - // For large # of elements just one more for potential prototype wouldn't matter. - ++count; + return library->GetUndefined(); } - - return count; + return lazy; } - inline Js::JavascriptString* StringifySession::Quote(Js::JavascriptString* value) - { - // By default, optimize for scenario when we don't need to change the inside of the string. That's majority of cases. - return Js::JSONString::Escape(value); - } } // namespace JSON diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSON.h b/deps/chakrashim/core/lib/Runtime/Library/JSON.h index e333320d8b5..2f066d37db1 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JSON.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JSON.h @@ -6,9 +6,6 @@ namespace JSON { - class JSONStack; - class JSONParser; - class EntryInfo { public: @@ -18,89 +15,4 @@ namespace JSON Js::Var Stringify(Js::RecyclableObject* function, Js::CallInfo callInfo, ...); Js::Var Parse(Js::RecyclableObject* function, Js::CallInfo callInfo, ...); - - class StringifySession - { - public: - enum ReplacerType - { - ReplacerNone, - ReplacerFunction, - ReplacerArray - }; - struct StringTable - { - Js::JavascriptString * propName; - Js::PropertyRecord const * propRecord; - }; - - StringifySession(Js::ScriptContext* sc) - : scriptContext(sc), - replacerType(ReplacerNone), - gap(NULL), - indent(0), - propertySeparator(NULL) - { - replacer.propertyList.propertyNames = NULL; - replacer.propertyList.length = 0; - }; - - Js::Var Stringify(){}; - - // Init operation is split in three functions - void InitReplacer(Js::RecyclableObject* f) - { - replacerType = ReplacerFunction; - replacer.ReplacerFunction = f; - } - void InitReplacer(StringTable *nameTable, uint len) - { - replacerType = ReplacerArray; - replacer.propertyList.propertyNames = nameTable; - replacer.propertyList.length = len; - } - void CompleteInit(Js::Var space, ArenaAllocator* alloc); - - Js::Var Str(Js::JavascriptString* key, Js::PropertyId keyId, Js::Var holder, Js::Var value = nullptr); - Js::Var Str(uint32 index, Js::RecyclableObject * holder); - - private: - Js::JavascriptString* Quote(Js::JavascriptString* value); - - Js::Var StringifyObject(Js::Var value); - - Js::Var StringifyArray(Js::RecyclableObject * arrayValue); - Js::JavascriptString* GetArrayElementString(uint32 index, Js::RecyclableObject * arrayValue); - Js::JavascriptString* GetPropertySeparator(); - Js::JavascriptString* GetIndentString(uint count); - Js::JavascriptString* GetMemberSeparator(Js::JavascriptString* indentString); - void StringifyMemberObject(Js::JavascriptString* propertyName, Js::PropertyId id, - Js::Var value, Js::ConcatStringBuilder* result, Js::JavascriptString* &indentString, - Js::JavascriptString* &memberSeparator, bool &isFirstMember, bool &isEmpty, - Js::Var propertyValue = nullptr ); - - uint32 GetPropertyCount(Js::RecyclableObject* object, Js::JavascriptStaticEnumerator* enumerator); - uint32 GetPropertyCount(Js::RecyclableObject* object, Js::JavascriptStaticEnumerator* enumerator, bool* isPrecise); - - JSONStack *objectStack; - - Js::ScriptContext* scriptContext; - ReplacerType replacerType; - - union - { - Js::RecyclableObject* ReplacerFunction; - struct PropertyList - { - StringTable *propertyNames; - uint length; - } propertyList; - - } replacer; - - Js::JavascriptString* gap; - uint indent; - Js::JavascriptString* propertySeparator; // colon or colon+space - Js::Var StrHelper(Js::JavascriptString* key, Js::Var value, Js::Var holder); - }; } // namespace JSON diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSONParser.cpp b/deps/chakrashim/core/lib/Runtime/Library/JSONParser.cpp index 9b613a437a7..22a7c6c98ea 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JSONParser.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JSONParser.cpp @@ -43,11 +43,7 @@ namespace JSON Js::Var JSONParser::Parse(Js::JavascriptString* input) { - Js::Var result = nullptr; - EnterPinnedScope((volatile void**)& input); - result = Parse(input->GetSz(), input->GetLength()); - LeavePinnedScope(); // input - return result; + return Parse(input->GetSz(), input->GetLength()); } Js::Var JSONParser::Walk(Js::JavascriptString* name, Js::PropertyId id, Js::Var holder, uint32 index) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSONParser.h b/deps/chakrashim/core/lib/Runtime/Library/JSONParser.h index fb7badc9e88..a1687d2b922 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JSONParser.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JSONParser.h @@ -53,11 +53,11 @@ namespace JSON reviver(rv), arenaAllocatorObject(nullptr), arenaAllocator(nullptr), typeCacheList(nullptr) { }; + void Finalizer(); Js::Var Parse(LPCWSTR str, uint length); Js::Var Parse(Js::JavascriptString* input); Js::Var Walk(Js::JavascriptString* name, Js::PropertyId id, Js::Var holder, uint32 index = Js::JavascriptArray::InvalidIndex); - void Finalizer(); private: tokens Scan() diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSONString.h b/deps/chakrashim/core/lib/Runtime/Library/JSONString.h index 227b4888c7d..798bfd32957 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JSONString.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JSONString.h @@ -42,7 +42,6 @@ namespace Js virtual const char16* GetSz() override; protected: DEFINE_VTABLE_CTOR(JSONString, JavascriptString); - DECLARE_CONCRETE_STRING_CLASS; private: Field(JavascriptString*) m_originalString; Field(charcount_t) m_start; /* start of the escaping operation */ @@ -50,8 +49,9 @@ namespace Js private: JSONString(JavascriptString* originalString, charcount_t start, charcount_t length); static const WCHAR escapeMap[128]; - static const BYTE escapeMapCount[128]; public: + static const BYTE escapeMapCount[128]; + template static Js::JavascriptString* Escape(Js::JavascriptString* value, uint start = 0, WritableStringBuffer* outputString = nullptr) { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSONStringBuilder.cpp b/deps/chakrashim/core/lib/Runtime/Library/JSONStringBuilder.cpp new file mode 100644 index 00000000000..b3b7bdbe813 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JSONStringBuilder.cpp @@ -0,0 +1,288 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "RuntimeLibraryPch.h" + +namespace Js +{ + +void +JSONStringBuilder::AppendCharacter(char16 character) +{ + AssertOrFailFast(this->currentLocation < endLocation); + *this->currentLocation = character; + ++this->currentLocation; +} + +void +JSONStringBuilder::AppendBuffer(_In_ const char16* buffer, charcount_t length) +{ + AssertOrFailFast(this->currentLocation + length <= endLocation); + wmemcpy_s(this->currentLocation, length, buffer, length); + this->currentLocation += length; +} + +void +JSONStringBuilder::AppendString(_In_ JavascriptString* str) +{ + AppendBuffer(str->GetString(), str->GetLength()); +} + +void +JSONStringBuilder::EscapeAndAppendString(_In_ JavascriptString* str) +{ + const charcount_t strLength = str->GetLength(); + + // Strings should be surrounded by double quotes + this->AppendCharacter(_u('"')); + const char16* bufferStart = str->GetString(); + for (const char16* index = bufferStart; index < bufferStart + strLength; ++index) + { + char16 currentCharacter = *index; + switch (currentCharacter) + { + case _u('"'): + case _u('\\'): + // Special characters are escaped with a backslash + this->AppendCharacter(_u('\\')); + this->AppendCharacter(currentCharacter); + break; + case _u('\b'): + this->AppendCharacter(_u('\\')); + this->AppendCharacter(_u('b')); + break; + case _u('\f'): + this->AppendCharacter(_u('\\')); + this->AppendCharacter(_u('f')); + break; + case _u('\n'): + this->AppendCharacter(_u('\\')); + this->AppendCharacter(_u('n')); + break; + case _u('\r'): + this->AppendCharacter(_u('\\')); + this->AppendCharacter(_u('r')); + break; + case _u('\t'): + this->AppendCharacter(_u('\\')); + this->AppendCharacter(_u('t')); + break; + default: + if (currentCharacter < _u(' ')) + { + // If character is less than SPACE, it is converted into a 4 digit hex code (e.g. \u0010) + this->AppendCharacter(_u('\\')); + this->AppendCharacter(_u('u')); + { + char16 buf[5]; + // Get hex value + _ltow_s(currentCharacter, buf, _countof(buf), 16); + + // Append leading zeros if necessary before the hex value + charcount_t count = static_cast(wcslen(buf)); + switch (count) + { + case 1: + this->AppendCharacter(_u('0')); + case 2: + this->AppendCharacter(_u('0')); + case 3: + this->AppendCharacter(_u('0')); + default: + this->AppendBuffer(buf, count); + break; + } + } + } + else + { + this->AppendCharacter(currentCharacter); + } + break; + } + } + + this->AppendCharacter(_u('"')); +} + +void +JSONStringBuilder::AppendGap(uint32 count) +{ + for (uint i = 0; i < count; ++i) + { + this->AppendBuffer(this->gap, this->gapLength); + } +} + +void +JSONStringBuilder::AppendObjectString(_In_ JSONObject* valueList) +{ + const uint elementCount = valueList->Count(); + if (elementCount == 0) + { + this->AppendCharacter(_u('{')); + this->AppendCharacter(_u('}')); + return; + } + + const uint32 stepbackLevel = this->indentLevel; + ++this->indentLevel; + + this->AppendCharacter(_u('{')); + if (this->gap != nullptr) + { + this->AppendCharacter(_u('\n')); + this->AppendGap(indentLevel); + } + + bool isFirstMember = true; + FOREACH_SLISTCOUNTED_ENTRY(JSONObjectProperty, entry, valueList) + { + if (!isFirstMember) + { + if (this->gap == nullptr) + { + this->AppendCharacter(_u(',')); + } + else + { + this->AppendCharacter(_u(',')); + this->AppendCharacter(_u('\n')); + this->AppendGap(indentLevel); + } + } + this->EscapeAndAppendString(entry.propertyName); + this->AppendCharacter(_u(':')); + if (this->gap != nullptr) + { + this->AppendCharacter(_u(' ')); + } + + this->AppendJSONPropertyString(&entry.propertyValue); + + isFirstMember = false; + } + NEXT_SLISTCOUNTED_ENTRY; + + if (this->gap != nullptr) + { + this->AppendCharacter(_u('\n')); + this->AppendGap(stepbackLevel); + } + + this->AppendCharacter(_u('}')); + + this->indentLevel = stepbackLevel; +} + +void +JSONStringBuilder::AppendArrayString(_In_ JSONArray* valueArray) +{ + uint32 length = valueArray->length; + if (length == 0) + { + this->AppendCharacter(_u('[')); + this->AppendCharacter(_u(']')); + return; + } + + const uint32 stepbackLevel = this->indentLevel; + ++this->indentLevel; + + JSONProperty* arr = valueArray->arr; + + this->AppendCharacter(_u('[')); + + if (this->gap != nullptr) + { + this->AppendCharacter(_u('\n')); + this->AppendGap(indentLevel); + } + + this->AppendJSONPropertyString(&arr[0]); + + for (uint32 i = 1; i < length; ++i) + { + if (this->gap == nullptr) + { + this->AppendCharacter(_u(',')); + } + else + { + this->AppendCharacter(_u(',')); + this->AppendCharacter(_u('\n')); + this->AppendGap(indentLevel); + } + AppendJSONPropertyString(&arr[i]); + } + + if (this->gap != nullptr) + { + this->AppendCharacter(_u('\n')); + this->AppendGap(stepbackLevel); + } + this->AppendCharacter(_u(']')); + + this->indentLevel = stepbackLevel; +} + +void +JSONStringBuilder::AppendJSONPropertyString(_In_ JSONProperty* prop) +{ + switch (prop->type) + { + case JSONContentType::False: + this->AppendString(this->scriptContext->GetLibrary()->GetFalseDisplayString()); + return; + case JSONContentType::True: + this->AppendString(this->scriptContext->GetLibrary()->GetTrueDisplayString()); + return; + case JSONContentType::Null: + this->AppendString(this->scriptContext->GetLibrary()->GetNullDisplayString()); + return; + case JSONContentType::Number: + this->AppendString(prop->numericValue.string); + return; + case JSONContentType::Object: + this->AppendObjectString(prop->obj); + return; + case JSONContentType::Array: + this->AppendArrayString(prop->arr); + return; + case JSONContentType::String: + this->EscapeAndAppendString(prop->stringValue); + return; + default: + Assume(UNREACHED); + } +} + +void +JSONStringBuilder::Build() +{ + this->AppendJSONPropertyString(this->jsonContent); + // Null terminate the string + AssertOrFailFast(this->currentLocation == endLocation); + *this->currentLocation = _u('\0'); +} + +JSONStringBuilder::JSONStringBuilder( + _In_ ScriptContext* scriptContext, + _In_ JSONProperty* jsonContent, + _In_ char16* buffer, + charcount_t bufferLength, + _In_opt_ const char16* gap, + charcount_t gapLength) : + scriptContext(scriptContext), + endLocation(buffer + bufferLength - 1), + currentLocation(buffer), + jsonContent(jsonContent), + gap(gap), + gapLength(gapLength), + indentLevel(0) +{ +} + +} //namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSONStringBuilder.h b/deps/chakrashim/core/lib/Runtime/Library/JSONStringBuilder.h new file mode 100644 index 00000000000..132fb96c701 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JSONStringBuilder.h @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#pragma once + +namespace Js +{ + +class JSONStringBuilder +{ +private: + ScriptContext* scriptContext; + const char16* endLocation; + char16* currentLocation; + JSONProperty* jsonContent; + const char16* gap; + charcount_t gapLength; + uint32 indentLevel; + + void AppendGap(uint32 count); + void AppendCharacter(char16 character); + void AppendBuffer(_In_ const char16* buffer, charcount_t length); + void AppendString(_In_ JavascriptString* str); + void EscapeAndAppendString(_In_ JavascriptString* str); + void AppendObjectString(_In_ JSONObject* valueList); + void AppendArrayString(_In_ JSONArray* valueArray); + void AppendJSONPropertyString(_In_ JSONProperty* prop); +public: + JSONStringBuilder( + _In_ ScriptContext* scriptContext, + _In_ JSONProperty* jsonContent, + _In_ char16* buffer, + charcount_t bufferLength, + _In_opt_ const char16* gap, + charcount_t gapLength); + void Build(); +}; + +} // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSONStringifier.cpp b/deps/chakrashim/core/lib/Runtime/Library/JSONStringifier.cpp new file mode 100644 index 00000000000..bf01faa5dcc --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JSONStringifier.cpp @@ -0,0 +1,810 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "RuntimeLibraryPch.h" + +namespace Js +{ + +const charcount_t JSONStringifier::MaxGapLength = 10; + +JSONStringifier::JSONStringifier(_In_ ScriptContext* scriptContext) : + scriptContext(scriptContext), + replacerFunction(nullptr), + totalStringLength(0), + indentLength(0), + gapLength(0), + gap(nullptr), + propertyList(nullptr) +{ +} + +void +JSONStringifier::SetStringGap(_In_ JavascriptString* spaceString) +{ + this->gapLength = min(MaxGapLength, spaceString->GetLength()); + if (this->gapLength != 0) + { + this->gap = RecyclerNewArrayLeaf(this->scriptContext->GetRecycler(), char16, this->gapLength); + wmemcpy_s(gap, this->gapLength, spaceString->GetString(), this->gapLength); + } +} + +void +JSONStringifier::SetNumericGap(charcount_t spaceCount) +{ + this->gapLength = spaceCount; + if (this->gapLength != 0) + { + this->gap = RecyclerNewArrayLeaf(this->scriptContext->GetRecycler(), char16, this->gapLength); + wmemset(gap, _u(' '), this->gapLength); + } +} + +void +JSONStringifier::ReadSpace(_In_opt_ Var space) +{ + if (space != nullptr) + { + switch (JavascriptOperators::GetTypeId(space)) + { + case TypeIds_Integer: + this->SetNumericGap(static_cast(max(0, min(static_cast(MaxGapLength), TaggedInt::ToInt32(space))))); + + break; + case TypeIds_Number: + case TypeIds_NumberObject: + case TypeIds_Int64Number: + case TypeIds_UInt64Number: + { + double numericSpace = JavascriptConversion::ToInteger(space, this->scriptContext); + if (numericSpace > 0) + { + SetNumericGap(numericSpace < static_cast(MaxGapLength) ? static_cast(numericSpace) : MaxGapLength); + } + break; + } + case TypeIds_String: + this->SetStringGap(JavascriptString::UnsafeFromVar(space)); + break; + case TypeIds_StringObject: + this->SetStringGap(JavascriptConversion::ToString(space, this->scriptContext)); + break; + default: + break; + } + } +} + +void +JSONStringifier::AddToPropertyList(_In_ Var item, _Inout_ BVSparse* propertyBV) +{ + JavascriptString* propertyName = nullptr; + switch (JavascriptOperators::GetTypeId(item)) + { + case TypeIds_Integer: + propertyName = this->scriptContext->GetIntegerString(item); + break; + case TypeIds_String: + propertyName = JavascriptString::UnsafeFromVar(item); + break; + case TypeIds_Number: + case TypeIds_NumberObject: + case TypeIds_Int64Number: + case TypeIds_UInt64Number: + case TypeIds_StringObject: + propertyName = JavascriptConversion::ToString(item, this->scriptContext); + break; + default: + break; + } + + if (propertyName != nullptr) + { + PropertyRecord const* propertyRecord; + scriptContext->GetOrAddPropertyRecord(propertyName, &propertyRecord); + if(!propertyBV->TestAndSet(propertyRecord->GetPropertyId())) + { + PropertyListElement elem; + elem.propertyName = propertyName; + elem.propertyRecord = propertyRecord; + this->propertyList->Push(elem); + } + } +} + + +void +JSONStringifier::ReadReplacer(_In_opt_ Var replacer) +{ + if (replacer != nullptr) + { + RecyclableObject* replacerObj = JavascriptOperators::TryFromVar(replacer); + if (replacerObj && JavascriptOperators::IsObject(replacerObj)) + { + if (JavascriptConversion::IsCallable(replacerObj)) + { + this->replacerFunction = replacerObj; + } + else if (JavascriptOperators::IsArray(replacerObj)) + { + Recycler* recycler = this->scriptContext->GetRecycler(); + + BVSparse propertyListBV(recycler); + this->propertyList = RecyclerNew(recycler, PropertyList, recycler); + JavascriptArray* propertyArray = JavascriptOperators::TryFromVar(replacer); + if (propertyArray != nullptr) + { + uint32 length = propertyArray->GetLength(); + for (uint32 i = 0; i < length; i++) + { + Var item = propertyArray->DirectGetItem(i); + this->AddToPropertyList(item, &propertyListBV); + } + } + else + { + int64 length = JavascriptConversion::ToLength(JavascriptOperators::OP_GetLength(replacerObj, this->scriptContext), this->scriptContext); + // ToLength always returns positive length + Assert(length >= 0); + for (uint64 i = 0; i < static_cast(length); i++) + { + Var item = nullptr; + if (JavascriptOperators::GetItem(replacerObj, i, &item, scriptContext)) + { + this->AddToPropertyList(item, &propertyListBV); + } + } + } + // PropertyList is an SList, which only has push/pop, so need to reverse list for it to be in order + this->propertyList->Reverse(); + } + } + } +} + +LazyJSONString* +JSONStringifier::Stringify(_In_ ScriptContext* scriptContext, _In_ Var value, _In_opt_ Var replacer, _In_opt_ Var space) +{ + Recycler* recycler = scriptContext->GetRecycler(); + JavascriptLibrary* library = scriptContext->GetLibrary(); + + if (scriptContext->Cache()->toJSONCache == nullptr) + { + scriptContext->Cache()->toJSONCache = ScriptContextPolymorphicInlineCache::New(32, library); + } + + JSONProperty* prop = RecyclerNewStruct(recycler, JSONProperty); + JSONObjectStack objStack = { 0 }; + + JSONStringifier stringifier(scriptContext); + + stringifier.ReadReplacer(replacer); + stringifier.ReadSpace(space); + + DynamicObject* wrapper = nullptr; + if (stringifier.HasReplacerFunction()) + { + // ReplacerFunction takes wrapper object as a parameter, so we need to materialize it (otherwise it isn't needed) + wrapper = library->CreateObject(); + PropertyId propertyId = scriptContext->GetEmptyStringPropertyId(); + JavascriptOperators::InitProperty(wrapper, propertyId, value); + } + + stringifier.ReadProperty( + library->GetEmptyString(), + wrapper, + prop, + value, + scriptContext->GetThreadContext()->GetEmptyStringPropertyRecord(), + &objStack); + + if (prop->type == JSONContentType::Undefined) + { + return nullptr; + } + else + { + return RecyclerNew( + recycler, + LazyJSONString, + prop, + stringifier.totalStringLength, + stringifier.GetGap(), + stringifier.GetGapLength(), + library->GetStringTypeStatic()); + } +} + +_Ret_notnull_ Var +JSONStringifier::ReadValue(_In_ JavascriptString* key, _In_opt_ const PropertyRecord* propertyRecord, _In_ RecyclableObject* holder) +{ + Var value = nullptr; + PropertyString* propertyString = PropertyString::TryFromVar(key); + PropertyValueInfo info; + if (propertyString != nullptr) + { + PropertyValueInfo::SetCacheInfo(&info, propertyString, propertyString->GetLdElemInlineCache(), false); + if (propertyString->TryGetPropertyFromCache(holder, holder, &value, this->scriptContext, &info)) + { + return value; + } + } + + if (propertyRecord == nullptr) + { + propertyRecord = key->GetPropertyRecord(); + } + JavascriptOperators::GetProperty(holder, propertyRecord->GetPropertyId(), &value, this->scriptContext, &info); + return value; +} + +// Convert NumberObject, StringObject, or BooleanObject to their primitive types, +// since stringification converts these to their primitive values. +// These types are used in cases where user does something like new Object("hello") +Var +JSONStringifier::TryConvertPrimitiveObject(_In_ RecyclableObject* value) +{ + TypeId id = JavascriptOperators::GetTypeId(value); + if (TypeIds_NumberObject == id) + { + return JavascriptNumber::ToVarNoCheck(JavascriptConversion::ToNumber(value, this->scriptContext), this->scriptContext); + } + else if (TypeIds_StringObject == id) + { + return JavascriptConversion::ToString(value, this->scriptContext); + } + else if (TypeIds_BooleanObject == id) + { + return (JavascriptBooleanObject::UnsafeFromVar(value)->GetValue() != FALSE) + ? this->scriptContext->GetLibrary()->GetTrue() + : this->scriptContext->GetLibrary()->GetFalse(); + } + return nullptr; +} + +Var +JSONStringifier::ToJSON(_In_ JavascriptString* key, _In_ RecyclableObject* valueObject) +{ + Var toJSON = nullptr; + PolymorphicInlineCache* cache = this->scriptContext->Cache()->toJSONCache; + PropertyValueInfo info; + PropertyValueInfo::SetCacheInfo(&info, nullptr, cache, false); + if (!CacheOperators::TryGetProperty< + true, // CheckLocal + true, // CheckProto + true, // CheckAccessor + true, // CheckMissing + true, // CheckPolymorphicInlineCache + true, // CheckTypePropertyCache + false, // IsInlineCacheAvailable + true, // IsPolymorphicInlineCacheAvailable + false> // ReturnOperationInfo + (valueObject, + false, + valueObject, + PropertyIds::toJSON, + &toJSON, + this->scriptContext, + nullptr, + &info)) + { + if (!JavascriptOperators::GetProperty(valueObject, PropertyIds::toJSON, &toJSON, this->scriptContext, &info)) + { + return nullptr; + } + } + if (JavascriptConversion::IsCallable(toJSON)) + { + RecyclableObject* func = RecyclableObject::UnsafeFromVar(toJSON); + Var values[2]; + Arguments args(2, values); + args.Values[0] = valueObject; + args.Values[1] = key; + return JavascriptFunction::CallFunction(func, func->GetEntryPoint(), args); + } + return nullptr; +} + +uint32 +JSONStringifier::ReadArrayLength(_In_ RecyclableObject* value) +{ + JavascriptArray* arr = JavascriptOperators::TryFromVar(value); + if (arr != nullptr) + { + return arr->GetLength(); + } + + int64 len = JavascriptConversion::ToLength(JavascriptOperators::OP_GetLength(value, this->scriptContext), this->scriptContext); + if (len >= MaxCharCount) + { + // If the length goes more than MaxCharCount we will eventually fail (as OOM) in ConcatStringBuilder - so failing early. + JavascriptError::ThrowRangeError(this->scriptContext, JSERR_OutOfBoundString); + } + return static_cast(len); +} + +void +JSONStringifier::ReadArrayElement(uint32 index, _In_ RecyclableObject* arr, _Out_ JSONProperty* prop, _In_ JSONObjectStack* objectStack) +{ + Var value = nullptr; + JavascriptArray* jsArray = JavascriptOperators::TryFromVar(arr); + if (jsArray && !jsArray->IsCrossSiteObject()) + { + value = jsArray->DirectGetItem(index); + } + else + { + JavascriptOperators::GetItem(arr, index, &value, this->scriptContext); + } + JavascriptString* indexString = this->scriptContext->GetIntegerString(index); + this->ReadProperty(indexString, arr, prop, value, nullptr, objectStack); +} + +JSONArray* +JSONStringifier::ReadArray(_In_ RecyclableObject* arr, _In_ JSONObjectStack* objectStack) +{ + if (objectStack->Has(arr)) + { + JavascriptError::ThrowTypeError(this->scriptContext, JSERR_JSONSerializeCircular); + } + JSONObjectStack stack = { 0 }; + stack.next = objectStack; + stack.object = arr; + + // Increase indentation + const charcount_t stepbackLength = this->indentLength; + if (this->gapLength != 0) + { + this->indentLength = UInt32Math::Add(this->indentLength, this->gapLength); + } + + const uint32 arrayLength = this->ReadArrayLength(arr); + + const size_t arraySize = AllocSizeMath::Mul(arrayLength, sizeof(JSONProperty)); + JSONArray * jsonArray = RecyclerNewPlusZ(this->scriptContext->GetRecycler(), arraySize, JSONArray); + + jsonArray->length = arrayLength; + for (uint32 i = 0; i < arrayLength; ++i) + { + this->ReadArrayElement(i, arr, &jsonArray->arr[i], &stack); + if (jsonArray->arr[i].type == JSONContentType::Undefined) + { + // We append null string in case of Undefined + this->SetNullProperty(&jsonArray->arr[i]); + } + } + + this->CalculateStringifiedLength(arrayLength, stepbackLength); + + // Restore indentataion + this->indentLength = stepbackLength; + + return jsonArray; +} + +void +JSONStringifier::ReadObjectElement( + _In_ JavascriptString* propertyName, + _In_opt_ PropertyRecord const* propertyRecord, + _In_ RecyclableObject* obj, + _In_ JSONObject* jsonObject, + _In_ JSONObjectStack* objectStack) +{ + JSONObjectProperty prop; + prop.propertyName = propertyName; + this->ReadProperty(propertyName, obj, &prop.propertyValue, nullptr, propertyRecord, objectStack); + + // Undefined result is not concatenated + if (prop.propertyValue.type != JSONContentType::Undefined) + { + // Increase length for the name of the property + this->totalStringLength = UInt32Math::Add(this->totalStringLength, CalculateStringElementLength(propertyName)); + // Increment length for concatenation of ":" + UInt32Math::Inc(this->totalStringLength); + if (this->gapLength != 0) + { + // If gap is specified, a space is appended + UInt32Math::Inc(this->totalStringLength); + } + jsonObject->Push(prop); + } +} + +// Calculates how many additional characters are needed for printing the Object/Array structure +// This includes commas, brackets, and gap (if any) +void +JSONStringifier::CalculateStringifiedLength(uint32 propertyCount, charcount_t stepbackLength) +{ + if (propertyCount == 0) + { + // Empty object is always represented as "{}" (and arrays are "[]") + this->totalStringLength = UInt32Math::Add(this->totalStringLength, 2); + } + else if (this->gapLength == 0) + { + // Concatenate the comma separators, one for all but the last property + this->totalStringLength = UInt32Math::Add(this->totalStringLength, propertyCount - 1); + // Wrap the object with curly braces + this->totalStringLength = UInt32Math::Add(this->totalStringLength, 2); + } + else + { + // Separator is the concatenation of comma, line feed, and indent + // Therefore length is 2 + indentLength + charcount_t separatorLength = UInt32Math::Add(this->indentLength, 2); + // Separators are inserted after all but the last property + charcount_t totalSeparatorsLength = UInt32Math::Mul(separatorLength, propertyCount - 1); + this->totalStringLength = UInt32Math::Add(this->totalStringLength, totalSeparatorsLength); + + // Properties are wrapped by open bracket, line feed, indent, line feed, stepback, and close bracket + // That amounts to an additional length of 4 + indentLength + stepbackLength + this->totalStringLength = UInt32Math::Add(this->totalStringLength, 4); + this->totalStringLength = UInt32Math::Add(this->totalStringLength, stepbackLength); + this->totalStringLength = UInt32Math::Add(this->totalStringLength, this->indentLength); + } +} + +void +JSONStringifier::ReadProxy(_In_ JavascriptProxy* proxyObject, _In_ JSONObject* jsonObject, _In_ JSONObjectStack* stack) +{ + JavascriptArray* ownPropertyNames = proxyObject->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind, this->scriptContext); + + // filter enumerable keys + uint32 resultLength = ownPropertyNames->GetLength(); + for (uint32 i = 0; i < resultLength; i++) + { + Var element = ownPropertyNames->DirectGetItem(i); + + // Array should only have string elements, but let's check to be safe + JavascriptString* propertyName = JavascriptOperators::TryFromVar(element); + Assert(propertyName); + if (propertyName != nullptr) + { + PropertyDescriptor propertyDescriptor; + PropertyRecord const* propertyRecord; + JavascriptConversion::ToPropertyKey(propertyName, scriptContext, &propertyRecord, nullptr); + if (JavascriptOperators::GetOwnPropertyDescriptor(proxyObject, propertyRecord->GetPropertyId(), scriptContext, &propertyDescriptor)) + { + if (propertyDescriptor.IsEnumerable()) + { + this->ReadObjectElement(propertyName, propertyRecord, proxyObject, jsonObject, stack); + } + } + } + } +} + +JSONObject* +JSONStringifier::ReadObject(_In_ RecyclableObject* obj, _In_ JSONObjectStack* objectStack) +{ + if (objectStack->Has(obj)) + { + JavascriptError::ThrowTypeError(this->scriptContext, JSERR_JSONSerializeCircular); + } + JSONObjectStack stack = { 0 }; + stack.next = objectStack; + stack.object = obj; + + // Increase indentation + const charcount_t stepbackLength = this->indentLength; + if (this->gapLength != 0) + { + this->indentLength = UInt32Math::Add(this->indentLength, this->gapLength); + } + + Recycler* recycler = this->scriptContext->GetRecycler(); + JSONObject* jsonObject = RecyclerNew(recycler, JSONObject, recycler); + + // If we are given a property list, we should only read the listed properties + if (this->propertyList != nullptr) + { + FOREACH_SLIST_ENTRY(PropertyListElement, entry, this->propertyList) + { + this->ReadObjectElement(entry.propertyName, entry.propertyRecord, obj, jsonObject, &stack); + } + NEXT_SLIST_ENTRY; + } + else + { + // Enumerating proxies is different than normal objects, so enumerate them separately + JavascriptProxy* proxyObject = JavascriptOperators::TryFromVar(obj); + if (proxyObject != nullptr) + { + this->ReadProxy(proxyObject, jsonObject, &stack); + } + else + { + JavascriptStaticEnumerator enumerator; + if (obj->GetEnumerator(&enumerator, EnumeratorFlags::SnapShotSemantics | EnumeratorFlags::EphemeralReference, this->scriptContext)) + { + enumerator.GetInitialPropertyCount(); + JavascriptString* propertyName = nullptr; + PropertyId nextKey = Constants::NoProperty; + while ((propertyName = enumerator.MoveAndGetNext(nextKey)) != nullptr) + { + PropertyRecord const * propertyRecord = nullptr; + if (nextKey == Constants::NoProperty) + { + this->scriptContext->GetOrAddPropertyRecord(propertyName, &propertyRecord); + nextKey = propertyRecord->GetPropertyId(); + } + this->ReadObjectElement(propertyName, propertyRecord, obj, jsonObject, &stack); + } + } + } + } + // JSONObject is an SList, which only has push/pop, so need to reverse list for it to be in order + jsonObject->Reverse(); + const uint propertyCount = jsonObject->Count(); + + this->CalculateStringifiedLength(propertyCount, stepbackLength); + + // Restore indent level + this->indentLength = stepbackLength; + + return jsonObject; +} + +Var +JSONStringifier::CallReplacerFunction(_In_opt_ RecyclableObject* holder, _In_ JavascriptString* key, _In_ Var value) +{ + Var values[3]; + Arguments args(0, values); + + args.Info.Count = 3; + args.Values[0] = holder; + args.Values[1] = key; + args.Values[2] = value; + + return JavascriptFunction::CallFunction(this->replacerFunction, this->replacerFunction->GetEntryPoint(), args); +} + +void +JSONStringifier::SetNullProperty(_Out_ JSONProperty* prop) +{ + prop->type = JSONContentType::Null; + this->totalStringLength = UInt32Math::Add(this->totalStringLength, Constants::NullStringLength); +} + +void +JSONStringifier::SetNumericProperty(double value, _In_ Var valueVar, _Out_ JSONProperty* prop) +{ + if (NumberUtilities::IsFinite(value)) + { + prop->type = JSONContentType::Number; + prop->numericValue.value = valueVar; + prop->numericValue.string = JavascriptConversion::ToString(valueVar, this->scriptContext); + this->totalStringLength = UInt32Math::Add(this->totalStringLength, prop->numericValue.string->GetLength()); + } + else + { + this->SetNullProperty(prop); + } +} + +// Strings may need to be escaped, so the length requires some calculation +charcount_t +JSONStringifier::CalculateStringElementLength(_In_ JavascriptString* str) +{ + const charcount_t strLength = str->GetLength(); + + // To avoid overflow checks, use uint64 for intermediate size calculation. We cannot overflow uint64, + // as stringification will be at most a 5x expansion of the original string (which has max length INT_MAX - 1) + // + // All JSON strings are enclosed in double quotes, so add 2 to the length to account for them + uint64 escapedStrLength = strLength + 2; + const char16* bufferStart = str->GetString(); + for (const char16* index = str->GetString(); index < bufferStart + strLength; ++index) + { + char16 currentCharacter = *index; + + // Some characters may require an escape sequence. We can use the escapeMapCount table + // to determine how many extra characters are needed + if (currentCharacter < _countof(JSONString::escapeMapCount)) + { + escapedStrLength += JSONString::escapeMapCount[currentCharacter]; + } + } + if (escapedStrLength > UINT32_MAX) + { + Js::Throw::OutOfMemory(); + } + return static_cast(escapedStrLength); +} + +void +JSONStringifier::ReadData(_In_ RecyclableObject* valueObj, _Out_ JSONProperty* prop) +{ + TypeId typeId = JavascriptOperators::GetTypeId(valueObj); + + switch (typeId) + { + case TypeIds_Null: + this->SetNullProperty(prop); + return; + + case TypeIds_Boolean: + if (JavascriptBoolean::UnsafeFromVar(valueObj)->GetValue() != FALSE) + { + prop->type = JSONContentType::True; + this->totalStringLength = UInt32Math::Add(this->totalStringLength, Constants::TrueStringLength); + } + else + { + prop->type = JSONContentType::False; + this->totalStringLength = UInt32Math::Add(this->totalStringLength, Constants::FalseStringLength); + } + return; + + case TypeIds_Int64Number: + this->SetNumericProperty(static_cast(JavascriptInt64Number::UnsafeFromVar(valueObj)->GetValue()), valueObj, prop); + return; + + case TypeIds_UInt64Number: + this->SetNumericProperty(static_cast(JavascriptUInt64Number::UnsafeFromVar(valueObj)->GetValue()), valueObj, prop); + return; + +#if !FLOATVAR + case TypeIds_Number: + this->SetNumericProperty(JavascriptNumber::GetValue(valueObj), valueObj, prop); + return; +#endif + + case TypeIds_String: + prop->stringValue = JavascriptString::UnsafeFromVar(valueObj); + prop->type = JSONContentType::String; + this->totalStringLength = UInt32Math::Add(this->totalStringLength, CalculateStringElementLength(prop->stringValue)); + return; + + case TypeIds_Symbol: + // Treat symbols as undefined + case TypeIds_Undefined: + // If undefined is in an object, it is not included in the string, and if it is an array element it will show up as "null" + // Given that, we can't caluclate the string length here and instead we do it at the usage points + prop->type = JSONContentType::Undefined; + return; + + default: + Assert(UNREACHED); + prop->type = JSONContentType::Undefined; + return; + } +} + +void +JSONStringifier::ReadData(_In_ Var value, _Out_ JSONProperty* prop) +{ + RecyclableObject* valueObj = JavascriptOperators::TryFromVar(value); + if (valueObj != nullptr) + { + ReadData(valueObj, prop); + return; + } + + // If value isn't a RecyclableObject, it must be a tagged number + + TypeId typeId = JavascriptOperators::GetTypeId(value); + switch (typeId) + { + case TypeIds_Integer: + { + prop->type = JSONContentType::Number; + prop->numericValue.value = value; + prop->numericValue.string = this->scriptContext->GetIntegerString(value); + this->totalStringLength = UInt32Math::Add(this->totalStringLength, prop->numericValue.string->GetLength()); + return; + } +#if FLOATVAR + case TypeIds_Number: + this->SetNumericProperty(JavascriptNumber::GetValue(value), value, prop); + return; +#endif + default: + Assume(UNREACHED); + prop->type = JSONContentType::Undefined; + return; + } +} + +void +RecheckValue(_In_ Var value, _Out_ RecyclableObject** valueObj, _Out_ bool* isObject) +{ + *valueObj = JavascriptOperators::TryFromVar(value); + if (*valueObj != nullptr) + { + *isObject = JavascriptOperators::IsObject(value) != FALSE; + } + else + { + *isObject = false; + } +} + +void +JSONStringifier::ReadProperty( + _In_ JavascriptString* key, + _In_opt_ RecyclableObject* holder, + _Out_ JSONProperty* prop, + _In_opt_ Var value, + _In_opt_ const PropertyRecord* propertyRecord, + _In_ JSONObjectStack* objectStack) +{ + PROBE_STACK(this->scriptContext, Constants::MinStackDefault); + if (value == nullptr) + { + // If we don't have a value, we must have an object from which we can read it + AnalysisAssert(holder != nullptr); + value = this->ReadValue(key, propertyRecord, holder); + } + + // Save these to avoid having to recheck conditions unless value is modified by ToJSON or a replacer function + RecyclableObject* valueObj = JavascriptOperators::TryFromVar(value); + bool isObject = false; + if (valueObj) + { + isObject = JavascriptOperators::IsObject(value) != FALSE; + if (isObject) + { + // If value is an object, we must first check if it has a ToJSON method + Var toJSONValue = this->ToJSON(key, valueObj); + if (toJSONValue != nullptr) + { + value = toJSONValue; + RecheckValue(toJSONValue, &valueObj, &isObject); + } + } + } + + // If user provided a replacer function, we need to call it + if (this->replacerFunction != nullptr) + { + value = this->CallReplacerFunction(holder, key, value); + RecheckValue(value, &valueObj, &isObject); + } + + if (valueObj != nullptr) + { + // Callable JS objects are undefined, but we still stringify callable host objects + // Host object case is for compat with old implementation, but isn't defined in the + // spec, so we should consider removing it + if (JavascriptConversion::IsCallable(valueObj) && JavascriptOperators::IsJsNativeObject(value)) + { + prop->type = JSONContentType::Undefined; + return; + } + + if (JavascriptOperators::IsArray(valueObj)) + { + prop->type = JSONContentType::Array; + prop->arr = this->ReadArray(valueObj, objectStack); + return; + } + + Var primitive = this->TryConvertPrimitiveObject(valueObj); + if (primitive != nullptr) + { + value = primitive; + RecheckValue(value, &valueObj, &isObject); + } + + if (isObject) + { + prop->type = JSONContentType::Object; + prop->obj = this->ReadObject(valueObj, objectStack); + return; + } + + if (valueObj != nullptr) + { + this->ReadData(valueObj, prop); + return; + } + } + this->ReadData(value, prop); + return; +} + +} // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/JSONStringifier.h b/deps/chakrashim/core/lib/Runtime/Library/JSONStringifier.h new file mode 100644 index 00000000000..31c0098ef47 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JSONStringifier.h @@ -0,0 +1,112 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#pragma once + +namespace Js +{ + +struct JSONObjectStack +{ + RecyclableObject* object; + JSONObjectStack* next; + + bool Has(_In_ RecyclableObject* object) + { + JSONObjectStack* stack = this; + while (stack != nullptr) + { + if (stack->object == object) + { + return true; + } + stack = stack->next; + } + return false; + } +}; + + +class JSONStringifier +{ +private: + // Spec defined limit on the gap length + static const charcount_t MaxGapLength; + + struct PropertyListElement + { + Field(PropertyRecord const*) propertyRecord; + Field(JavascriptString*) propertyName; + + PropertyListElement() {} + PropertyListElement(const PropertyListElement& other) + : propertyRecord(other.propertyRecord), propertyName(other.propertyName) + {} + }; + + typedef SList PropertyList; + + ScriptContext* scriptContext; + RecyclableObject* replacerFunction; + PropertyList* propertyList; + charcount_t totalStringLength; + charcount_t indentLength; + charcount_t gapLength; + char16* gap; + + Var TryConvertPrimitiveObject(_In_ RecyclableObject* value); + Var ToJSON(_In_ JavascriptString* key, _In_ RecyclableObject* valueObject); + Var CallReplacerFunction(_In_opt_ RecyclableObject* holder, _In_ JavascriptString* key, _In_ Var value); + _Ret_notnull_ Var ReadValue(_In_ JavascriptString* key, _In_opt_ const PropertyRecord* propertyRecord, _In_ RecyclableObject* holder); + uint32 ReadArrayLength(_In_ RecyclableObject* value); + JSONArray* ReadArray(_In_ RecyclableObject* arr, _In_ JSONObjectStack* objectStack); + + void ReadObjectElement( + _In_ JavascriptString* propertyName, + _In_opt_ PropertyRecord const* propertyRecord, + _In_ RecyclableObject* obj, + _In_ JSONObject* jsonObject, + _In_ JSONObjectStack* objectStack); + + void ReadArrayElement( + uint32 index, + _In_ RecyclableObject* arr, + _Out_ JSONProperty* prop, + _In_ JSONObjectStack* objectStack); + + void CalculateStringifiedLength(uint32 propertyCount, charcount_t stepbackLength); + void ReadProxy(_In_ JavascriptProxy* proxyObject, _In_ JSONObject* jsonObject, _In_ JSONObjectStack* stack); + JSONObject* ReadObject(_In_ RecyclableObject* obj, _In_ JSONObjectStack* objectStack); + void SetNullProperty(_Out_ JSONProperty* prop); + void SetNumericProperty(double value, _In_ Var valueVar, _Out_ JSONProperty* prop); + static charcount_t CalculateStringElementLength(_In_ JavascriptString* str); + void ReadData(_In_ RecyclableObject* valueObj, _Out_ JSONProperty* prop); + void ReadData(_In_ Var value, _Out_ JSONProperty* prop); + void SetStringGap(_In_ JavascriptString* spaceString); + void SetNumericGap(charcount_t spaceCount); + void AddToPropertyList(_In_ Var item, _Inout_ BVSparse* propertyBV); +public: + JSONStringifier(_In_ ScriptContext* scriptContext); + void ReadSpace(_In_opt_ Var space); + void ReadReplacer(_In_opt_ Var replacer); + void ReadProperty( + _In_ JavascriptString* key, + _In_opt_ RecyclableObject* holder, + _Out_ JSONProperty* prop, + _In_opt_ Var value, + _In_opt_ const PropertyRecord* propertyRecord, + _In_ JSONObjectStack* objectStack); + + const char16* GetGap() const { return this->gap; }; + charcount_t GetGapLength() const { return this->gapLength; } + bool HasReplacerFunction() const { return this->replacerFunction != nullptr; } + + bool HasComplexGap() const; + + static LazyJSONString* Stringify(_In_ ScriptContext* scriptContext, _In_ Var value, _In_opt_ Var replacer, _In_opt_ Var space); + +}; // class JSONStringifier + +} //namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.cpp index d8a456511b8..90bb3256f80 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.cpp @@ -27,7 +27,7 @@ namespace Js { 5, 0, 0 }, // allocate space for 5 elements for array of length 4,5 { 8, 0, 0 }, // allocate space for 8 elements for array of length 6,7,8 }; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) const Var JavascriptArray::MissingItem = (Var)0x8000000280000002; uint JavascriptNativeIntArray::allocationBuckets[][AllocationBucketsInfoSize] = { @@ -506,20 +506,34 @@ namespace Js } JavascriptArray* JavascriptArray::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptArray'"); + + return static_cast(aValue); + } + + JavascriptArray* JavascriptArray::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptArray'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } // Get JavascriptArray* from a Var, which is either a JavascriptArray* or ESArray*. JavascriptArray* JavascriptArray::FromAnyArray(Var aValue) { - AssertMsg(Is(aValue) || ES5Array::Is(aValue), "Ensure var is actually a 'JavascriptArray' or 'ES5Array'"); + AssertOrFailFastMsg(Is(aValue) || ES5Array::Is(aValue), "Ensure var is actually a 'JavascriptArray' or 'ES5Array'"); return static_cast(RecyclableObject::FromVar(aValue)); } + JavascriptArray* JavascriptArray::UnsafeFromAnyArray(Var aValue) + { + AssertMsg(Is(aValue) || ES5Array::Is(aValue), "Ensure var is actually a 'JavascriptArray' or 'ES5Array'"); + + return static_cast(RecyclableObject::UnsafeFromVar(aValue)); + } + // Check if a Var is a direct-accessible (fast path) JavascriptArray. bool JavascriptArray::IsDirectAccessArray(Var aValue) { @@ -1124,10 +1138,8 @@ namespace Js // SkipDefaultNewObject function flag should have prevented the default object // being created, except when call true a host dispatch. const CallInfo &callInfo = args.Info; - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert( isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); ScriptContext* scriptContext = function->GetScriptContext(); JavascriptArray* pNew = nullptr; @@ -1411,7 +1423,7 @@ namespace Js bool isTaggedInt = TaggedInt::Is(item); bool isTaggedIntMissingValue = false; -#ifdef _M_AMD64 +#ifdef TARGET_64 if (isTaggedInt) { int32 iValue = TaggedInt::ToInt32(item); @@ -3035,12 +3047,12 @@ namespace Js Assert(obj != nullptr); Assert(length != nullptr); - if (JavascriptArray::Is(arg) && !JavascriptArray::FromVar(arg)->IsCrossSiteObject()) + *array = JavascriptOperators::TryFromVar(arg); + if (*array && !(*array)->IsCrossSiteObject()) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(arg); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(*array); #endif - *array = JavascriptArray::FromVar(arg); *obj = *array; *length = (*array)->length; } @@ -3086,12 +3098,11 @@ namespace Js ConcatSpreadableState previousItemSpreadableState /*= ConcatSpreadableState_NotChecked*/, BigIndex *firstPromotedItemLength /* = nullptr */) { JS_REENTRANCY_LOCK(jsReentLock, scriptContext->GetThreadContext()); - JavascriptArray* pDestArray = nullptr; - - if (JavascriptArray::Is(pDestObj)) + JavascriptArray* pDestArray = JavascriptOperators::TryFromVar(pDestObj); + if (pDestArray) { // ConcatArgs function expects to work on the Var array so we are ensuring it. - pDestArray = EnsureNonNativeArray(JavascriptArray::FromVar(pDestObj)); + pDestArray = EnsureNonNativeArray(pDestArray); SET_SECOND_OBJECT_FOR_MUTATION(jsReentLock, pDestArray); } @@ -3121,25 +3132,28 @@ namespace Js } if (pDestArray && JavascriptArray::IsDirectAccessArray(aItem) && JavascriptArray::IsDirectAccessArray(pDestArray) - && BigIndex(idxDest + JavascriptArray::FromVar(aItem)->length).IsSmallIndex() && !JavascriptArray::FromVar(aItem)->IsFillFromPrototypes()) // Fast path + && BigIndex(idxDest + JavascriptArray::UnsafeFromVar(aItem)->length).IsSmallIndex() && !JavascriptArray::UnsafeFromVar(aItem)->IsFillFromPrototypes()) // Fast path { - if (JavascriptNativeIntArray::Is(aItem)) - { - JavascriptNativeIntArray *pItemArray = JavascriptNativeIntArray::FromVar(aItem); - JS_REENTRANT_NO_MUTATE(jsReentLock, CopyNativeIntArrayElementsToVar(pDestArray, BigIndex(idxDest).GetSmallIndex(), pItemArray)); - idxDest = idxDest + pItemArray->length; - } - else if (JavascriptNativeFloatArray::Is(aItem)) + JavascriptNativeIntArray *pIntItemArray = JavascriptOperators::TryFromVar(aItem); + if (pIntItemArray) { - JavascriptNativeFloatArray *pItemArray = JavascriptNativeFloatArray::FromVar(aItem); - JS_REENTRANT_NO_MUTATE(jsReentLock, CopyNativeFloatArrayElementsToVar(pDestArray, BigIndex(idxDest).GetSmallIndex(), pItemArray)); - idxDest = idxDest + pItemArray->length; + JS_REENTRANT_NO_MUTATE(jsReentLock, CopyNativeIntArrayElementsToVar(pDestArray, BigIndex(idxDest).GetSmallIndex(), pIntItemArray)); + idxDest = idxDest + pIntItemArray->length; } else { - JavascriptArray* pItemArray = JavascriptArray::FromVar(aItem); - JS_REENTRANT(jsReentLock, CopyArrayElements(pDestArray, BigIndex(idxDest).GetSmallIndex(), pItemArray)); - idxDest = idxDest + pItemArray->length; + JavascriptNativeFloatArray *pFloatItemArray = JavascriptOperators::TryFromVar(aItem); + if (pFloatItemArray) + { + JS_REENTRANT_NO_MUTATE(jsReentLock, CopyNativeFloatArrayElementsToVar(pDestArray, BigIndex(idxDest).GetSmallIndex(), pFloatItemArray)); + idxDest = idxDest + pFloatItemArray->length; + } + else + { + JavascriptArray* pItemArray = JavascriptArray::UnsafeFromVar(aItem); + JS_REENTRANT(jsReentLock, CopyArrayElements(pDestArray, BigIndex(idxDest).GetSmallIndex(), pItemArray)); + idxDest = idxDest + pItemArray->length; + } } } else @@ -3163,7 +3177,7 @@ namespace Js // in EntryConcat like we do with Arrays because a getProperty on an object Length // is observable. The result is we have to check for overflows separately for // spreadable objects and promote to a bigger index type when we find them. - JS_REENTRANT(jsReentLock, ConcatArgs(pDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest, ConcatSpreadableState_CheckedAndTrue, &length)); + JS_REENTRANT(jsReentLock, ConcatArgs(pDestObj, remoteTypeIds, args, scriptContext, idxArg, idxDest, ConcatSpreadableState_CheckedAndTrue, &length)); return; } @@ -3280,9 +3294,9 @@ namespace Js continue; } - if (JavascriptNativeIntArray::Is(aItem) && !JavascriptNativeIntArray::FromVar(aItem)->IsFillFromPrototypes()) // Fast path + JavascriptNativeIntArray * pItemArray = JavascriptOperators::TryFromVar(aItem); + if (pItemArray && !pItemArray->IsFillFromPrototypes()) // Fast path { - JavascriptNativeIntArray* pItemArray = JavascriptNativeIntArray::FromVar(aItem); JS_REENTRANT_NO_MUTATE(jsReentLock, bool converted = CopyNativeIntArrayElements(pDestArray, idxDest, pItemArray)); idxDest = idxDest + pItemArray->length; @@ -3368,30 +3382,34 @@ namespace Js bool converted = false; if (JavascriptArray::IsAnyArray(aItem) || remoteTypeIds[idxArg] == TypeIds_Array) { - if (JavascriptNativeIntArray::Is(aItem) && !JavascriptArray::FromVar(aItem)->IsFillFromPrototypes()) // Fast path + bool isFillFromPrototypes = JavascriptArray::UnsafeFromVar(aItem)->IsFillFromPrototypes(); + JavascriptNativeIntArray * pIntItemArray = JavascriptOperators::TryFromVar(aItem); + if (pIntItemArray && !isFillFromPrototypes) // Fast path { - JavascriptNativeIntArray *pIntArray = JavascriptNativeIntArray::FromVar(aItem); - JS_REENTRANT_NO_MUTATE(jsReentLock, converted = CopyNativeIntArrayElementsToFloat(pDestArray, idxDest, pIntArray)); + JS_REENTRANT_NO_MUTATE(jsReentLock, converted = CopyNativeIntArrayElementsToFloat(pDestArray, idxDest, pIntItemArray)); - idxDest = idxDest + pIntArray->length; + idxDest = idxDest + pIntItemArray->length; } - else if (JavascriptNativeFloatArray::Is(aItem) && !JavascriptArray::FromVar(aItem)->IsFillFromPrototypes()) + else { - JavascriptNativeFloatArray* pItemArray = JavascriptNativeFloatArray::FromVar(aItem); + JavascriptNativeFloatArray * pFloatItemArray = JavascriptOperators::TryFromVar(aItem); + if (pFloatItemArray && !isFillFromPrototypes) + { - JS_REENTRANT_NO_MUTATE(jsReentLock, converted = CopyNativeFloatArrayElements(pDestArray, idxDest, pItemArray)); + JS_REENTRANT_NO_MUTATE(jsReentLock, converted = CopyNativeFloatArrayElements(pDestArray, idxDest, pFloatItemArray)); - idxDest = idxDest + pItemArray->length; - } - else - { - JavascriptArray *pVarDestArray = JavascriptNativeFloatArray::ConvertToVarArray(pDestArray); + idxDest = idxDest + pFloatItemArray->length; + } + else + { + JavascriptArray *pVarDestArray = JavascriptNativeFloatArray::ConvertToVarArray(pDestArray); - BigIndex length; - JS_REENTRANT(jsReentLock, length = OP_GetLength(aItem, scriptContext), - ConcatArgs(pVarDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest, ConcatSpreadableState_CheckedAndTrue, &length)); + BigIndex length; + JS_REENTRANT(jsReentLock, length = OP_GetLength(aItem, scriptContext), + ConcatArgs(pVarDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest, ConcatSpreadableState_CheckedAndTrue, &length)); - return pVarDestArray; + return pVarDestArray; + } } if (converted) @@ -3589,9 +3607,10 @@ namespace Js } else if (isFloat) { - if (JavascriptNativeIntArray::Is(pDestObj)) + JavascriptNativeIntArray *nativeIntArray = JavascriptOperators::TryFromVar(pDestObj); + if (nativeIntArray) { - JavascriptNativeIntArray::ToNativeFloatArray(JavascriptNativeIntArray::FromVar(pDestObj)); + JavascriptNativeIntArray::ToNativeFloatArray(nativeIntArray); isArray = true; } else @@ -3602,22 +3621,26 @@ namespace Js } else { - if (JavascriptNativeIntArray::Is(pDestObj)) + JavascriptNativeIntArray *nativeIntArray = JavascriptOperators::TryFromVar(pDestObj); + if (nativeIntArray) { - JavascriptNativeIntArray::ToVarArray(JavascriptNativeIntArray::FromVar(pDestObj)); - isArray = true; - } - else if (JavascriptNativeFloatArray::Is(pDestObj)) - { - JavascriptNativeFloatArray::ToVarArray(JavascriptNativeFloatArray::FromVar(pDestObj)); + JavascriptNativeIntArray::ToVarArray(nativeIntArray); isArray = true; } else { - isArray = JavascriptArray::Is(pDestObj); + JavascriptNativeFloatArray *nativeFloatArray = JavascriptOperators::TryFromVar(pDestObj); + if (nativeFloatArray) + { + JavascriptNativeFloatArray::ToVarArray(nativeFloatArray); + isArray = true; + } + else + { + isArray = JavascriptArray::Is(pDestObj); + } } } - } if (pDestObj == nullptr || isArray) @@ -3839,9 +3862,9 @@ namespace Js case Js::TypeIds_Array: JS_REENTRANT_UNLOCK(jsReentLock, return TemplatedIndexOfHelper(pArr, search, fromIndex, len, scriptContext)); case Js::TypeIds_NativeIntArray: - JS_REENTRANT_UNLOCK(jsReentLock, return TemplatedIndexOfHelper(JavascriptNativeIntArray::FromVar(pArr), search, fromIndex, len, scriptContext)); + JS_REENTRANT_UNLOCK(jsReentLock, return TemplatedIndexOfHelper(JavascriptNativeIntArray::UnsafeFromVar(pArr), search, fromIndex, len, scriptContext)); case Js::TypeIds_NativeFloatArray: - JS_REENTRANT_UNLOCK(jsReentLock, return TemplatedIndexOfHelper(JavascriptNativeFloatArray::FromVar(pArr), search, fromIndex, len, scriptContext)); + JS_REENTRANT_UNLOCK(jsReentLock, return TemplatedIndexOfHelper(JavascriptNativeFloatArray::UnsafeFromVar(pArr), search, fromIndex, len, scriptContext)); default: AssertMsg(FALSE, "invalid array typeid"); JS_REENTRANT_UNLOCK(jsReentLock, return TemplatedIndexOfHelper(pArr, search, fromIndex, len, scriptContext)); @@ -3850,11 +3873,12 @@ namespace Js } // source object is not a JavascriptArray but source could be a TypedArray - if (TypedArrayBase::Is(obj)) + TypedArrayBase * typedArrayObj = JavascriptOperators::TryFromVar(obj); + if (typedArrayObj) { if (length.IsSmallIndex() || length.IsUint32Max()) { - JS_REENTRANT_UNLOCK(jsReentLock, return TemplatedIndexOfHelper(TypedArrayBase::FromVar(obj), search, fromIndex, length.GetSmallIndex(), scriptContext)); + JS_REENTRANT_UNLOCK(jsReentLock, return TemplatedIndexOfHelper(typedArrayObj, search, fromIndex, length.GetSmallIndex(), scriptContext)); } } if (length.IsSmallIndex()) @@ -4356,15 +4380,16 @@ namespace Js JS_REENTRANCY_LOCK(jsReentLock, scriptContext->GetThreadContext()); SETOBJECT_FOR_MUTATION(jsReentLock, thisArg); - bool isArray = JavascriptArray::Is(thisArg) && (scriptContext == JavascriptArray::FromVar(thisArg)->GetScriptContext()); - bool isProxy = JavascriptProxy::Is(thisArg) && (scriptContext == JavascriptProxy::FromVar(thisArg)->GetScriptContext()); + JavascriptArray * arr = JavascriptOperators::TryFromVar(thisArg); + JavascriptProxy * proxy = JavascriptOperators::TryFromVar(thisArg); + bool isArray = arr && (scriptContext == arr->GetScriptContext()); + bool isProxy = proxy && (scriptContext == proxy->GetScriptContext()); Var target = NULL; bool isTargetObjectPushed = false; // if we are visiting a proxy object, track that we have visited the target object as well so the next time w // call the join helper for the target of this proxy, we will return above. if (isProxy) { - JavascriptProxy* proxy = JavascriptProxy::FromVar(thisArg); Assert(proxy); target = proxy->GetTarget(); if (target != nullptr) @@ -4401,17 +4426,16 @@ namespace Js #if ENABLE_COPYONACCESS_ARRAY JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(thisArg); #endif - JavascriptArray * arr = JavascriptArray::FromVar(thisArg); switch (arr->GetTypeId()) { case Js::TypeIds_Array: JS_REENTRANT(jsReentLock, res = JoinArrayHelper(arr, separator, scriptContext)); break; case Js::TypeIds_NativeIntArray: - JS_REENTRANT(jsReentLock, res = JoinArrayHelper(JavascriptNativeIntArray::FromVar(arr), separator, scriptContext)); + JS_REENTRANT(jsReentLock, res = JoinArrayHelper(JavascriptNativeIntArray::UnsafeFromVar(arr), separator, scriptContext)); break; case Js::TypeIds_NativeFloatArray: - JS_REENTRANT(jsReentLock, res = JoinArrayHelper(JavascriptNativeFloatArray::FromVar(arr), separator, scriptContext)); + JS_REENTRANT(jsReentLock, res = JoinArrayHelper(JavascriptNativeFloatArray::UnsafeFromVar(arr), separator, scriptContext)); break; } @@ -4675,9 +4699,9 @@ namespace Js case Js::TypeIds_Array: JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(pArr, search, fromIndex, scriptContext)); case Js::TypeIds_NativeIntArray: - JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(JavascriptNativeIntArray::FromVar(pArr), search, fromIndex, scriptContext)); + JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(JavascriptNativeIntArray::UnsafeFromVar(pArr), search, fromIndex, scriptContext)); case Js::TypeIds_NativeFloatArray: - JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(JavascriptNativeFloatArray::FromVar(pArr), search, fromIndex, scriptContext)); + JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(JavascriptNativeFloatArray::UnsafeFromVar(pArr), search, fromIndex, scriptContext)); default: AssertMsg(FALSE, "invalid array typeid"); JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(pArr, search, fromIndex, scriptContext)); @@ -4685,9 +4709,10 @@ namespace Js } // source object is not a JavascriptArray but source could be a TypedArray - if (TypedArrayBase::Is(obj)) + TypedArrayBase * typedArrayObj = JavascriptOperators::TryFromVar(obj); + if (typedArrayObj) { - JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(TypedArrayBase::FromVar(obj), search, fromIndex, scriptContext)); + JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(typedArrayObj, search, fromIndex, scriptContext)); } JS_REENTRANT_UNLOCK(jsReentLock, return LastIndexOfHelper(obj, search, fromIndex, scriptContext)); @@ -4992,7 +5017,7 @@ namespace Js // JavascriptArray::Push will handle other cases. if (JavascriptNativeIntArray::IsNonCrossSite(array)) { - JavascriptNativeIntArray * nativeIntArray = JavascriptNativeIntArray::FromVar(array); + JavascriptNativeIntArray * nativeIntArray = JavascriptNativeIntArray::UnsafeFromVar(array); Assert(!nativeIntArray->IsCrossSiteObject()); uint32 n = nativeIntArray->length; @@ -5021,7 +5046,7 @@ namespace Js // JavascriptArray::Push will handle other cases. if(JavascriptNativeFloatArray::IsNonCrossSite(array)) { - JavascriptNativeFloatArray * nativeFloatArray = JavascriptNativeFloatArray::FromVar(array); + JavascriptNativeFloatArray * nativeFloatArray = JavascriptNativeFloatArray::UnsafeFromVar(array); Assert(!nativeFloatArray->IsCrossSiteObject()); uint32 n = nativeFloatArray->length; @@ -5373,7 +5398,7 @@ namespace Js } else if (DynamicType::Is(protoObj->GetTypeId())) { - DynamicObject* dynobj = DynamicObject::FromVar(protoObj); + DynamicObject* dynobj = DynamicObject::UnsafeFromVar(protoObj); ArrayObject* objectArray = dynobj->GetObjectArray(); if (objectArray != nullptr && ES5Array::Is(objectArray)) { @@ -5413,7 +5438,7 @@ namespace Js // If we came from Array.prototype.map and source object is not a JavascriptArray, source could be a TypedArray if (!isTypedArrayEntryPoint && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } ThrowTypeErrorOnFailureHelper h(scriptContext, methodName); @@ -5778,11 +5803,11 @@ namespace Js bool useNoSideEffectShift = JavascriptArray::Is(args[0]) && !JavascriptArray::FromVar(args[0])->IsCrossSiteObject() - && !HasAnyES5ArrayInPrototypeChain(JavascriptArray::FromVar(args[0])); + && !HasAnyES5ArrayInPrototypeChain(JavascriptArray::UnsafeFromVar(args[0])); if (useNoSideEffectShift) { - JavascriptArray * pArr = JavascriptArray::FromVar(args[0]); + JavascriptArray * pArr = JavascriptArray::UnsafeFromVar(args[0]); if (pArr->length == 0) { @@ -5972,7 +5997,7 @@ namespace Js Js::JavascriptNativeIntArray *pnewArr = scriptContext->GetLibrary()->CreateNativeIntArray(len); pnewArr->EnsureHead(); #if ENABLE_PROFILE_INFO - pnewArr->CopyArrayProfileInfo(Js::JavascriptNativeIntArray::FromVar(baseArray)); + pnewArr->CopyArrayProfileInfo(Js::JavascriptNativeIntArray::UnsafeFromVar(baseArray)); #endif return pnewArr; @@ -5982,7 +6007,7 @@ namespace Js Js::JavascriptNativeFloatArray *pnewArr = scriptContext->GetLibrary()->CreateNativeFloatArray(len); pnewArr->EnsureHead(); #if ENABLE_PROFILE_INFO - pnewArr->CopyArrayProfileInfo(Js::JavascriptNativeFloatArray::FromVar(baseArray)); + pnewArr->CopyArrayProfileInfo(Js::JavascriptNativeFloatArray::UnsafeFromVar(baseArray)); #endif return pnewArr; @@ -6016,7 +6041,7 @@ namespace Js for (uint32 i = 0; i < newLen; i++) { if (!(pArr->head->left <= (i + start) && (i + start) < (pArr->head->left + pArr->head->length))) - { + { break; } // array type might be changed in the below call to DirectGetItemAtFull @@ -6048,10 +6073,10 @@ namespace Js // in the profile void JavascriptArray::GetArrayTypeAndConvert(bool* isIntArray, bool* isFloatArray) { - if (JavascriptNativeIntArray::Is(this)) + JavascriptNativeIntArray* nativeIntArray = JavascriptOperators::TryFromVar(this); + if (nativeIntArray) { #if ENABLE_PROFILE_INFO - JavascriptNativeIntArray* nativeIntArray = JavascriptNativeIntArray::FromVar(this); ArrayCallSiteInfo* info = nativeIntArray->GetArrayCallSiteInfo(); if(!info || info->IsNativeIntArray()) { @@ -6070,23 +6095,26 @@ namespace Js *isIntArray = true; #endif } - else if (JavascriptNativeFloatArray::Is(this)) + else { + JavascriptNativeFloatArray* nativeFloatArray = JavascriptOperators::TryFromVar(this); + if (nativeFloatArray) + { #if ENABLE_PROFILE_INFO - JavascriptNativeFloatArray* nativeFloatArray = JavascriptNativeFloatArray::FromVar(this); - ArrayCallSiteInfo* info = nativeFloatArray->GetArrayCallSiteInfo(); + ArrayCallSiteInfo* info = nativeFloatArray->GetArrayCallSiteInfo(); - if(info && !info->IsNativeArray()) - { - JavascriptNativeFloatArray::ToVarArray(nativeFloatArray); - } - else - { - *isFloatArray = true; - } + if (info && !info->IsNativeArray()) + { + JavascriptNativeFloatArray::ToVarArray(nativeFloatArray); + } + else + { + *isFloatArray = true; + } #else - *isFloatArray = true; + *isFloatArray = true; #endif + } } } @@ -6169,7 +6197,7 @@ namespace Js // If we came from Array.prototype.slice and source object is not a JavascriptArray, source could be a TypedArray if (!isTypedArrayEntryPoint && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } // If the entry point is %TypedArray%.prototype.slice or the source object is an Array exotic object we should try to load the constructor property @@ -6177,7 +6205,7 @@ namespace Js if (isTypedArrayEntryPoint) { JS_REENTRANT(jsReentLock, - Var constructor = JavascriptOperators::SpeciesConstructor(typedArrayBase, TypedArrayBase::GetDefaultConstructor(args[0], scriptContext), scriptContext)); + RecyclableObject* constructor = JavascriptOperators::SpeciesConstructor(typedArrayBase, TypedArrayBase::GetDefaultConstructor(args[0], scriptContext), scriptContext)); isBuiltinArrayCtor = false; AssertAndFailFast(pArr == nullptr); @@ -6223,12 +6251,12 @@ namespace Js else { // If the new object we created is an array, remember that as it will save us time setting properties in the object below - if (JavascriptArray::Is(newObj)) + newArr = JavascriptOperators::TryFromVar(newObj); + if (newArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newObj); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newArr); #endif - newArr = JavascriptArray::FromVar(newObj); } } @@ -6349,13 +6377,9 @@ namespace Js AssertAndFailFast(TypedArrayBase::Is(typedArrayBase)); // Source is a TypedArray, we must have created the return object via a call to constructor, but newObj may not be a TypedArray (or an array either) - TypedArrayBase* newTypedArray = nullptr; + TypedArrayBase* newTypedArray = JavascriptOperators::TryFromVar(newObj); - if (TypedArrayBase::Is(newObj)) - { - newTypedArray = TypedArrayBase::FromVar(newObj); - } - else + if (!newTypedArray) { AssertAndFailFast(newArr != nullptr); } @@ -6390,13 +6414,14 @@ namespace Js if (!isTypedArrayEntryPoint) { - JavascriptOperators::SetProperty(newObj, newObj, Js::PropertyIds::length, JavascriptNumber::ToVar(newLen, scriptContext), scriptContext, PropertyOperation_ThrowIfNotExtensible); + JS_REENTRANT(jsReentLock, JavascriptOperators::SetProperty(newObj, newObj, Js::PropertyIds::length, JavascriptNumber::ToVar(newLen, scriptContext), scriptContext, PropertyOperation_ThrowIfNotExtensible)); } #ifdef VALIDATE_ARRAY - if (JavascriptArray::Is(newObj)) + JavascriptArray * jsArr = JavascriptOperators::TryFromVar(newObj); + if (jsArr) { - JavascriptArray::FromVar(newObj)->ValidateArray(); + jsArr->ValidateArray(); } #endif @@ -6429,9 +6454,10 @@ namespace Js JavascriptOperators::SetProperty(newObj, newObj, Js::PropertyIds::length, JavascriptNumber::ToVar(newLen, scriptContext), scriptContext, PropertyOperation_ThrowIfNotExtensible)); #ifdef VALIDATE_ARRAY - if (JavascriptArray::Is(newObj)) + JavascriptArray * jsArr = JavascriptOperators::TryFromVar(newObj); + if (jsArr) { - JavascriptArray::FromVar(newObj)->ValidateArray(); + jsArr->ValidateArray(); } #endif @@ -6828,11 +6854,11 @@ namespace Js bool useNoSideEffectSort = JavascriptArray::Is(args[0]) && !JavascriptArray::FromVar(args[0])->IsCrossSiteObject() - && !HasAnyES5ArrayInPrototypeChain(JavascriptArray::FromVar(args[0])); + && !HasAnyES5ArrayInPrototypeChain(JavascriptArray::UnsafeFromVar(args[0])); if (useNoSideEffectSort) { - JavascriptArray *arr = JavascriptArray::FromVar(args[0]); + JavascriptArray *arr = JavascriptArray::UnsafeFromVar(args[0]); if (arr->length <= 1) { @@ -6857,7 +6883,7 @@ namespace Js // - FloatArray for AMD64 // We convert the entire array back and forth once here O(n), rather than doing the costly conversion down the call stack which is O(nlogn) -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) if(compFn && JavascriptNativeFloatArray::Is(arr)) { arr = JavascriptNativeFloatArray::ConvertToVarArray((JavascriptNativeFloatArray*)arr); @@ -7447,12 +7473,12 @@ namespace Js { pArr = EnsureNonNativeArray(pArr); // If the new object we created is an array, remember that as it will save us time setting properties in the object below - if (JavascriptArray::Is(newObj)) + newArr = JavascriptOperators::TryFromVar(newObj); + if (newArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newObj); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newArr); #endif - newArr = JavascriptArray::FromVar(newObj); SET_SECOND_OBJECT_FOR_MUTATION(jsReentLock, newArr); } } @@ -7618,12 +7644,12 @@ namespace Js } } - if (JavascriptArray::Is(pNewObj)) + pnewArr = JavascriptOperators::TryFromVar(pNewObj); + if (pnewArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(pNewObj); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(pnewArr); #endif - pnewArr = JavascriptArray::FromVar(pNewObj); SET_SECOND_OBJECT_FOR_MUTATION(jsReentLock, pnewArr); } @@ -7734,7 +7760,7 @@ namespace Js if (JavascriptArray::IsDirectAccessArray(args[0])) { - JavascriptArray* arr = JavascriptArray::FromVar(args[0]); + JavascriptArray* arr = JavascriptArray::UnsafeFromVar(args[0]); JS_REENTRANT_UNLOCK(jsReentLock, return ToLocaleString(arr, scriptContext)); } else @@ -8168,7 +8194,7 @@ namespace Js return JavascriptString::NewCopyBuffer(szSeparator, count, scriptContext); } #else - // xplat-todo: Support locale-specific seperator + // xplat-todo: Support locale-specific separator return scriptContext->GetLibrary()->GetCommaSpaceDisplayString(); #endif } @@ -8180,10 +8206,11 @@ namespace Js SETOBJECT_FOR_MUTATION(jsReentLock, arr); uint32 length = 0; - if (TypedArrayBase::Is(arr)) + TypedArrayBase * typedArray = JavascriptOperators::TryFromVar(arr); + if (typedArray) { // For a TypedArray use the actual length of the array. - length = TypedArrayBase::FromVar(arr)->GetLength(); + length = typedArray->GetLength(); } else { @@ -8333,7 +8360,7 @@ namespace Js // If we came from Array.prototype.find/findIndex and source object is not a JavascriptArray, source could be a TypedArray if (typedArrayBase == nullptr && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } // The correct flag value is CallFlags_Value but we pass CallFlags_None in compat modes @@ -8475,6 +8502,11 @@ namespace Js ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); + +#ifdef ENABLE_JS_BUILTINS + Assert(!scriptContext->IsJsBuiltInEnabled()); +#endif + JS_REENTRANCY_LOCK(jsReentLock, scriptContext->GetThreadContext()); Assert(!(callInfo.Flags & CallFlags_New)); @@ -8507,6 +8539,11 @@ namespace Js ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); + +#ifdef ENABLE_JS_BUILTINS + Assert(!scriptContext->IsJsBuiltInEnabled()); +#endif + JS_REENTRANCY_LOCK(jsReentLock, scriptContext->GetThreadContext()); Assert(!(callInfo.Flags & CallFlags_New)); @@ -8539,6 +8576,11 @@ namespace Js ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); + +#ifdef ENABLE_JS_BUILTINS + Assert(!scriptContext->IsJsBuiltInEnabled()); +#endif + JS_REENTRANCY_LOCK(jsReentLock, scriptContext->GetThreadContext()); Assert(!(callInfo.Flags & CallFlags_New)); @@ -8629,7 +8671,7 @@ namespace Js // If we came from Array.prototype.map and source object is not a JavascriptArray, source could be a TypedArray if (typedArrayBase == nullptr && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } Var element = nullptr; @@ -8637,38 +8679,7 @@ namespace Js // The correct flag value is CallFlags_Value but we pass CallFlags_None in compat modes CallFlags flags = CallFlags_Value; - if (pArr) - { - Assert(length <= UINT_MAX); - for (uint32 k = 0; k < (uint32)length; k++) - { - JS_REENTRANT(jsReentLock, BOOL gotItem = pArr->DirectGetItemAtFull(k, &element)); - if (!gotItem) - { - continue; - } - - JS_REENTRANT(jsReentLock, - testResult = CALL_FUNCTION(scriptContext->GetThreadContext(), callBackFn, CallInfo(flags, 4), thisArg, - element, - JavascriptNumber::ToVar(k, scriptContext), - pArr)); - - if (!JavascriptConversion::ToBoolean(testResult, scriptContext)) - { - return scriptContext->GetLibrary()->GetFalse(); - } - - // Side-effects in the callback function may have changed the source array into an ES5Array. If this happens - // we will process the rest of the array elements like an ES5Array. - if (!JavascriptArray::Is(obj)) - { - AssertOrFailFastMsg(ES5Array::Is(obj), "The array should have been converted to an ES5Array"); - JS_REENTRANT_UNLOCK(jsReentLock, return JavascriptArray::EveryObjectHelper(obj, length, k + 1, callBackFn, thisArg, scriptContext)); - } - } - } - else if (typedArrayBase) + if (typedArrayBase) { AssertAndFailFast(TypedArrayBase::Is(typedArrayBase)); uint32 end = (uint32)min(length, (T)typedArrayBase->GetLength()); @@ -8802,7 +8813,7 @@ namespace Js // If we came from Array.prototype.some and source object is not a JavascriptArray, source could be a TypedArray if (typedArrayBase == nullptr && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } // The correct flag value is CallFlags_Value but we pass CallFlags_None in compat modes @@ -8810,38 +8821,7 @@ namespace Js Var element = nullptr; Var testResult = nullptr; - if (pArr) - { - Assert(length <= UINT_MAX); - for (uint32 k = 0; k < (uint32)length; k++) - { - JS_REENTRANT(jsReentLock, BOOL gotItem = pArr->DirectGetItemAtFull(k, &element)); - if (!gotItem) - { - continue; - } - - JS_REENTRANT_UNLOCK(jsReentLock, - testResult = CALL_FUNCTION(scriptContext->GetThreadContext(), callBackFn, CallInfo(flags, 4), thisArg, - element, - JavascriptNumber::ToVar(k, scriptContext), - pArr)); - - if (JavascriptConversion::ToBoolean(testResult, scriptContext)) - { - return scriptContext->GetLibrary()->GetTrue(); - } - - // Side-effects in the callback function may have changed the source array into an ES5Array. If this happens - // we will process the rest of the array elements like an ES5Array. - if (!JavascriptArray::Is(obj)) - { - AssertOrFailFastMsg(ES5Array::Is(obj), "The array should have been converted to an ES5Array"); - JS_REENTRANT_UNLOCK(jsReentLock, return JavascriptArray::SomeObjectHelper(obj, length, k + 1, callBackFn, thisArg, scriptContext)); - } - } - } - else if (typedArrayBase) + if (typedArrayBase) { AssertAndFailFast(TypedArrayBase::Is(typedArrayBase)); uint32 end = (uint32)min(length, (T)typedArrayBase->GetLength()); @@ -9014,6 +8994,7 @@ namespace Js Assert(args.Info.Count > 0); + bool isTypedArrayEntryPoint = typedArrayBase != nullptr; JavascriptLibrary* library = scriptContext->GetLibrary(); int64 fromVal = 0; int64 toVal = 0; @@ -9022,7 +9003,7 @@ namespace Js // If we came from Array.prototype.copyWithin and source object is not a JavascriptArray, source could be a TypedArray if (typedArrayBase == nullptr && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } if (args.Info.Count > 1) @@ -9054,6 +9035,36 @@ namespace Js // We shouldn't have made it here if the count was going to be zero Assert(count > 0); + // If we entered via TypedArray.prototype.copyWithin, then we can copy by bytes. Otherwise, if the user called + // Array.prototype.copyWithin on a typed array instance, then the typed array might be responsible for not + // writing torn values, which memmove does not guarantee. + if (isTypedArrayEntryPoint) + { + Assert(typedArrayBase); + + // Re-validate the typed array, which could have become detached due to reentrant script. + if (typedArrayBase->IsDetachedBuffer()) + { + JavascriptError::ThrowTypeError(scriptContext, JSERR_DetachedTypedArray, _u("[TypedArray].prototype.copyWithin")); + } + + AssertOrFailFast(length == typedArrayBase->GetLength()); + + uint32 bytesPerElement = typedArrayBase->GetBytesPerElement(); + byte *buffer = typedArrayBase->GetByteBuffer(); + size_t fromByteIndex = static_cast(fromVal) * bytesPerElement; + size_t toByteIndex = static_cast(toVal) * bytesPerElement; + size_t byteCount = static_cast(count) * bytesPerElement; + + Assert(typedArrayBase->GetByteLength() >= byteCount); + Assert(fromByteIndex <= typedArrayBase->GetByteLength() - byteCount); + Assert(toByteIndex <= typedArrayBase->GetByteLength() - byteCount); + + memmove(&buffer[toByteIndex], &buffer[fromByteIndex], byteCount); + + return obj; + } + int direction; if (fromVal < toVal && toVal < (fromVal + count)) @@ -9112,7 +9123,7 @@ namespace Js while (count > 0) { - JS_REENTRANT(jsReentLock, BOOL hasItem = obj->HasItem(fromIndex)); + JS_REENTRANT(jsReentLock, BOOL hasItem = JavascriptOperators::HasItem(obj, fromIndex)); if (hasItem) { if (typedArrayBase) @@ -9186,7 +9197,7 @@ namespace Js // If we came from Array.prototype.fill and source object is not a JavascriptArray, source could be a TypedArray if (typedArrayBase == nullptr && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } Var fillValue; @@ -9355,7 +9366,7 @@ namespace Js // If we came from Array.prototype.map and source object is not a JavascriptArray, source could be a TypedArray if (!isTypedArrayEntryPoint && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } // If the entry point is %TypedArray%.prototype.map or the source object is an Array exotic object we should try to load the constructor property @@ -9363,7 +9374,7 @@ namespace Js if (isTypedArrayEntryPoint) { JS_REENTRANT(jsReentLock, - Var constructor = JavascriptOperators::SpeciesConstructor( + RecyclableObject* constructor = JavascriptOperators::SpeciesConstructor( typedArrayBase, TypedArrayBase::GetDefaultConstructor(args[0], scriptContext), scriptContext)); isBuiltinArrayCtor = false; @@ -9393,12 +9404,12 @@ namespace Js else { // If the new object we created is an array, remember that as it will save us time setting properties in the object below - if (JavascriptArray::Is(newObj)) + newArr = JavascriptOperators::TryFromVar(newObj); + if (newArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newObj); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newArr); #endif - newArr = JavascriptArray::FromVar(newObj); SET_SECOND_OBJECT_FOR_MUTATION(jsReentLock, newArr); } } @@ -9462,13 +9473,9 @@ namespace Js AssertAndFailFast(TypedArrayBase::Is(typedArrayBase)); // Source is a TypedArray, we may have tried to call a constructor, but newObj may not be a TypedArray (or an array either) - TypedArrayBase* newTypedArray = nullptr; + TypedArrayBase* newTypedArray = JavascriptOperators::TryFromVar(newObj); - if (TypedArrayBase::Is(newObj)) - { - newTypedArray = TypedArrayBase::FromVar(newObj); - } - else + if (!newTypedArray) { AssertAndFailFast(newArr != nullptr); } @@ -9627,85 +9634,17 @@ namespace Js else { // If the new object we created is an array, remember that as it will save us time setting properties in the object below - if (JavascriptArray::Is(newObj)) + newArr = JavascriptOperators::TryFromVar(newObj); + if (newArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newObj); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newArr); #endif - newArr = JavascriptArray::FromVar(newObj); SET_SECOND_OBJECT_FOR_MUTATION(jsReentLock, newArr); } } - // The ArraySpeciesCreate call above could have converted the source array into an ES5Array. If this happens - // we will process the array elements like an ES5Array. - if (pArr && !JavascriptArray::Is(obj)) - { - AssertOrFailFastMsg(ES5Array::Is(obj), "The array should have been converted to an ES5Array"); - pArr = nullptr; - } - - Var element = nullptr; - Var selected = nullptr; - - if (pArr) - { - Assert(length <= MaxArrayLength); - uint32 i = 0; - - Assert(length <= UINT_MAX); - for (uint32 k = 0; k < (uint32)length; k++) - { - JS_REENTRANT(jsReentLock, BOOL gotItem = pArr->DirectGetItemAtFull(k, &element)); - if (!gotItem) - { - continue; - } - - JS_REENTRANT(jsReentLock, - selected = CALL_ENTRYPOINT(scriptContext->GetThreadContext(), - callBackFn->GetEntryPoint(), callBackFn, CallInfo(CallFlags_Value, 4), - thisArg, - element, - JavascriptNumber::ToVar(k, scriptContext), - pArr)); - - if (JavascriptConversion::ToBoolean(selected, scriptContext)) - { - // Try to fast path if the return object is an array - if (newArr && isBuiltinArrayCtor) - { - newArr->DirectSetItemAt(i, element); - } - else - { - JS_REENTRANT(jsReentLock, ThrowErrorOnFailure(JavascriptArray::SetArrayLikeObjects(newObj, i, element), scriptContext, i)); - } - ++i; - } - - // Side-effects in the callback function may have changed the source array into an ES5Array. If this happens - // we will process the rest of the array elements like an ES5Array. - if (!JavascriptArray::Is(obj)) - { - AssertOrFailFastMsg(ES5Array::Is(obj), "The array should have been converted to an ES5Array"); - JS_REENTRANT_UNLOCK(jsReentLock, return JavascriptArray::FilterObjectHelper(obj, length, k + 1, newArr, newObj, i, callBackFn, thisArg, scriptContext)); - } - } - } - else - { - JS_REENTRANT_UNLOCK(jsReentLock, return JavascriptArray::FilterObjectHelper(obj, length, 0u, newArr, newObj, 0u, callBackFn, thisArg, scriptContext)); - } - -#ifdef VALIDATE_ARRAY - if (newArr) - { - newArr->ValidateArray(); - } -#endif - - return newObj; + JS_REENTRANT_UNLOCK(jsReentLock, return JavascriptArray::FilterObjectHelper(obj, length, 0u, newArr, newObj, 0u, callBackFn, thisArg, scriptContext)); } template @@ -9813,7 +9752,7 @@ namespace Js // If we came from Array.prototype.reduce and source object is not a JavascriptArray, source could be a TypedArray if (typedArrayBase == nullptr && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } T k = 0; @@ -9834,29 +9773,7 @@ namespace Js bool bPresent = false; - if (pArr) - { - for (; k < length && bPresent == false; k++) - { - JS_REENTRANT(jsReentLock, BOOL gotItem = pArr->DirectGetItemAtFull((uint32)k, &element)); - if (!gotItem) - { - continue; - } - - bPresent = true; - accumulator = element; - } - - // Side-effects in the callback function may have changed the source array into an ES5Array. If this happens - // we will process the array elements like an ES5Array. - if (!JavascriptArray::Is(obj)) - { - AssertOrFailFastMsg(ES5Array::Is(obj), "The array should have been converted to an ES5Array"); - pArr = nullptr; - } - } - else if (typedArrayBase) + if (typedArrayBase) { AssertAndFailFast(TypedArrayBase::Is(typedArrayBase)); uint32 end = (uint32)min(length, (T)typedArrayBase->GetLength()); @@ -9896,35 +9813,7 @@ namespace Js // The correct flag value is CallFlags_Value but we pass CallFlags_None in compat modes CallFlags flags = CallFlags_Value; - if (pArr) - { - for (; k < length; k++) - { - JS_REENTRANT(jsReentLock, BOOL gotItem = pArr->DirectGetItemAtFull((uint32)k, &element)); - if (!gotItem) - { - continue; - } - - JS_REENTRANT(jsReentLock, - accumulator = CALL_FUNCTION(scriptContext->GetThreadContext(), callBackFn, CallInfo(flags, 5), - undefinedValue, - accumulator, - element, - JavascriptNumber::ToVar(k, scriptContext), - pArr - )); - - // Side-effects in the callback function may have changed the source array into an ES5Array. If this happens - // we will process the rest of the array elements like an ES5Array. - if (!JavascriptArray::Is(obj)) - { - AssertOrFailFastMsg(ES5Array::Is(obj), "The array should have been converted to an ES5Array"); - JS_REENTRANT_UNLOCK(jsReentLock, return JavascriptArray::ReduceObjectHelper(obj, length, k + 1, callBackFn, accumulator, scriptContext)); - } - } - } - else if (typedArrayBase) + if (typedArrayBase) { AssertAndFailFast(TypedArrayBase::Is(typedArrayBase)); uint32 end = (uint32)min(length, (T)typedArrayBase->GetLength()); @@ -10033,7 +9922,7 @@ namespace Js // If we came from Array.prototype.reduceRight and source object is not a JavascriptArray, source could be a TypedArray if (typedArrayBase == nullptr && pArr == nullptr && TypedArrayBase::Is(obj)) { - typedArrayBase = TypedArrayBase::FromVar(obj); + typedArrayBase = TypedArrayBase::UnsafeFromVar(obj); } RecyclableObject* callBackFn = RecyclableObject::FromVar(args[1]); @@ -10054,29 +9943,7 @@ namespace Js } bool bPresent = false; - if (pArr) - { - for (; k < length && bPresent == false; k++) - { - index = length - k - 1; - JS_REENTRANT(jsReentLock, BOOL gotItem = pArr->DirectGetItemAtFull((uint32)index, &element)); - if (!gotItem) - { - continue; - } - bPresent = true; - accumulator = element; - } - - // Side-effects in the callback function may have changed the source array into an ES5Array. If this happens - // we will process the array elements like an ES5Array. - if (!JavascriptArray::Is(obj)) - { - AssertOrFailFastMsg(ES5Array::Is(obj), "The array should have been converted to an ES5Array"); - pArr = nullptr; - } - } - else if (typedArrayBase) + if (typedArrayBase) { AssertAndFailFast(TypedArrayBase::Is(typedArrayBase)); uint32 end = (uint32)min(length, (T)typedArrayBase->GetLength()); @@ -10114,34 +9981,7 @@ namespace Js CallFlags flags = CallFlags_Value; Var undefinedValue = scriptContext->GetLibrary()->GetUndefined(); - if (pArr) - { - for (; k < length; k++) - { - index = length - k - 1; - JS_REENTRANT(jsReentLock, BOOL gotItem = pArr->DirectGetItemAtFull((uint32)index, &element)); - if (!gotItem) - { - continue; - } - - JS_REENTRANT(jsReentLock, - accumulator = CALL_FUNCTION(scriptContext->GetThreadContext(), callBackFn, CallInfo(flags, 5), undefinedValue, - accumulator, - element, - JavascriptNumber::ToVar(index, scriptContext), - pArr)); - - // Side-effects in the callback function may have changed the source array into an ES5Array. If this happens - // we will process the rest of the array elements like an ES5Array. - if (!JavascriptArray::Is(obj)) - { - AssertOrFailFastMsg(ES5Array::Is(obj), "The array should have been converted to an ES5Array"); - JS_REENTRANT_UNLOCK(jsReentLock, return JavascriptArray::ReduceRightObjectHelper(obj, length, k + 1, callBackFn, accumulator, scriptContext)); - } - } - } - else if (typedArrayBase) + if (typedArrayBase) { AssertAndFailFast(TypedArrayBase::Is(typedArrayBase)); uint32 end = (uint32)min(length, (T)typedArrayBase->GetLength()); @@ -10227,14 +10067,13 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_FunctionArgument_NeedObject, _u("Array.from")); } - JavascriptArray* itemsArr = nullptr; + JavascriptArray* itemsArr = JavascriptOperators::TryFromVar(items); - if (JavascriptArray::Is(items)) + if (itemsArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(items); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(itemsArr); #endif - itemsArr = JavascriptArray::FromVar(items); } SETOBJECT_FOR_MUTATION(jsReentLock, itemsArr); @@ -10277,12 +10116,12 @@ namespace Js Js::CallInfo constructorCallInfo(Js::CallFlags_New, _countof(constructorArgs)); JS_REENTRANT(jsReentLock, newObj = RecyclableObject::FromVar(JavascriptOperators::NewScObject(constructor, Js::Arguments(constructorCallInfo, constructorArgs), scriptContext))); - if (JavascriptArray::Is(newObj)) + newArr = JavascriptOperators::TryFromVar(newObj); + if (newArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newObj); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newArr); #endif - newArr = JavascriptArray::FromVar(newObj); } } else @@ -10300,9 +10139,8 @@ namespace Js Assert(mapFn != nullptr); Assert(mapFnThisArg != nullptr); - Js::Var mapFnArgs[] = { mapFnThisArg, nextValue, JavascriptNumber::ToVar(k, scriptContext) }; - Js::CallInfo mapFnCallInfo(Js::CallFlags_Value, _countof(mapFnArgs)); - nextValue = mapFn->CallFunction(Js::Arguments(mapFnCallInfo, mapFnArgs)); + Var kVar = JavascriptNumber::ToVar(k, scriptContext); + nextValue = CALL_FUNCTION(scriptContext->GetThreadContext(), mapFn, CallInfo(CallFlags_Value, 3), mapFnThisArg, nextValue, kVar); } if (newArr) @@ -10329,12 +10167,12 @@ namespace Js Js::CallInfo constructorCallInfo(Js::CallFlags_New, _countof(constructorArgs)); JS_REENTRANT(jsReentLock, newObj = RecyclableObject::FromVar(JavascriptOperators::NewScObject(constructor, Js::Arguments(constructorCallInfo, constructorArgs), scriptContext))); - if (JavascriptArray::Is(newObj)) + newArr = JavascriptOperators::TryFromVar(newObj); + if (newArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newObj); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newArr); #endif - newArr = JavascriptArray::FromVar(newObj); } } else @@ -10371,9 +10209,8 @@ namespace Js Assert(mapFn != nullptr); Assert(mapFnThisArg != nullptr); - Js::Var mapFnArgs[] = { mapFnThisArg, kValue, JavascriptNumber::ToVar(k, scriptContext) }; - Js::CallInfo mapFnCallInfo(Js::CallFlags_Value, _countof(mapFnArgs)); - JS_REENTRANT(jsReentLock, kValue = mapFn->CallFunction(Js::Arguments(mapFnCallInfo, mapFnArgs))); + Var kVar = JavascriptNumber::ToVar(k, scriptContext); + JS_REENTRANT(jsReentLock, kValue = CALL_FUNCTION(scriptContext->GetThreadContext(), mapFn, CallInfo(CallFlags_Value, 3), mapFnThisArg, kValue, kVar)); } if (newArr) @@ -10450,18 +10287,18 @@ namespace Js } // If the new object we created is an array, remember that as it will save us time setting properties in the object below - if (JavascriptArray::Is(newObj)) + newArr = JavascriptOperators::TryFromVar(newObj); + if (newArr) { #if ENABLE_COPYONACCESS_ARRAY - JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newObj); + JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(newArr); #endif - newArr = JavascriptArray::FromVar(newObj); SETOBJECT_FOR_MUTATION(jsReentLock, newArr); } else if (TypedArrayBase::Is(newObj)) { - newTypedArray = TypedArrayBase::FromVar(newObj); + newTypedArray = TypedArrayBase::UnsafeFromVar(newObj); } } else @@ -10658,13 +10495,13 @@ namespace Js JavascriptArray* arr = nullptr; if (DynamicObject::IsAnyArray(obj)) { - arr = JavascriptArray::FromAnyArray(obj); + arr = JavascriptArray::UnsafeFromAnyArray(obj); } else if (DynamicType::Is(obj->GetTypeId())) { - DynamicObject* dynobj = DynamicObject::FromVar(obj); + DynamicObject* dynobj = DynamicObject::UnsafeFromVar(obj); ArrayObject* objectArray = dynobj->GetObjectArray(); - arr = (objectArray && JavascriptArray::IsAnyArray(objectArray)) ? JavascriptArray::FromAnyArray(objectArray) : nullptr; + arr = (objectArray && JavascriptArray::IsAnyArray(objectArray)) ? JavascriptArray::UnsafeFromAnyArray(objectArray) : nullptr; } if (arr != nullptr) @@ -11226,17 +11063,22 @@ namespace Js #if ENABLE_COPYONACCESS_ARRAY JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(dstArray); #endif - if (JavascriptNativeIntArray::Is(srcArray)) - { - CopyNativeIntArrayElementsToVar(dstArray, dstIndex, JavascriptNativeIntArray::FromVar(srcArray), start, end); - } - else if (JavascriptNativeFloatArray::Is(srcArray)) + JavascriptNativeIntArray * nativeIntArray = JavascriptOperators::TryFromVar(srcArray); + if (nativeIntArray) { - CopyNativeFloatArrayElementsToVar(dstArray, dstIndex, JavascriptNativeFloatArray::FromVar(srcArray), start, end); + CopyNativeIntArrayElementsToVar(dstArray, dstIndex, nativeIntArray, start, end); } else { - CopyArrayElements(dstArray, dstIndex, srcArray, start, end); + JavascriptNativeFloatArray * nativeFloatArray = JavascriptOperators::TryFromVar(srcArray); + if (nativeFloatArray) + { + CopyNativeFloatArrayElementsToVar(dstArray, dstIndex, nativeFloatArray, start, end); + } + else + { + CopyArrayElements(dstArray, dstIndex, srcArray, start, end); + } } } @@ -11480,9 +11322,9 @@ namespace Js // An array needs a slow copy if it is a cross-site object or we have missing values that need to be set to undefined. auto needArraySlowCopy = [&](Var instance) { - if (JavascriptArray::Is(instance)) + JavascriptArray *arr = JavascriptOperators::TryFromVar(instance); + if (arr) { - JavascriptArray *arr = JavascriptArray::FromVar(instance); JS_REENTRANT_UNLOCK(jsReentLock, return arr->IsCrossSiteObject() || arr->IsFillFromPrototypes()); } return false; @@ -11579,15 +11421,15 @@ namespace Js // A spread argument can be anything that returns a 'length' property, even if that // property is null or undefined. spreadArg = CrossSite::MarshalVar(scriptContext, spreadArg); - if (JavascriptArray::Is(spreadArg)) + JavascriptArray *arr = JavascriptOperators::TryFromVar(spreadArg); + if (arr) { - JavascriptArray *arr = JavascriptArray::FromVar(spreadArg); return arr->GetLength(); } - if (TypedArrayBase::Is(spreadArg)) + TypedArrayBase *tarr = JavascriptOperators::TryFromVar(spreadArg); + if (tarr) { - TypedArrayBase *tarr = TypedArrayBase::FromVar(spreadArg); return tarr->GetLength(); } @@ -12048,8 +11890,8 @@ namespace Js SETOBJECT_FOR_MUTATION(jsReentLock, originalArray); if (JavascriptArray::Is(originalArray) - && !DynamicObject::FromVar(originalArray)->GetDynamicType()->GetTypeHandler()->GetIsNotPathTypeHandlerOrHasUserDefinedCtor() - && DynamicObject::FromVar(originalArray)->GetPrototype() == scriptContext->GetLibrary()->GetArrayPrototype() + && !DynamicObject::UnsafeFromVar(originalArray)->GetDynamicType()->GetTypeHandler()->GetIsNotPathTypeHandlerOrHasUserDefinedCtor() + && DynamicObject::UnsafeFromVar(originalArray)->GetPrototype() == scriptContext->GetLibrary()->GetArrayPrototype() && !scriptContext->GetLibrary()->GetArrayObjectHasUserDefinedSpecies()) { return nullptr; @@ -12059,7 +11901,7 @@ namespace Js if (JavascriptOperators::IsArray(originalArray)) { - JS_REENTRANT(jsReentLock, BOOL getProp = JavascriptOperators::GetProperty(RecyclableObject::FromVar(originalArray), PropertyIds::constructor, &constructor, scriptContext)); + JS_REENTRANT(jsReentLock, BOOL getProp = JavascriptOperators::GetProperty(RecyclableObject::UnsafeFromVar(originalArray), PropertyIds::constructor, &constructor, scriptContext)); if (!getProp) { return nullptr; @@ -12067,7 +11909,7 @@ namespace Js if (JavascriptOperators::IsConstructor(constructor)) { - ScriptContext* constructorScriptContext = RecyclableObject::FromVar(constructor)->GetScriptContext(); + ScriptContext* constructorScriptContext = RecyclableObject::UnsafeFromVar(constructor)->GetScriptContext(); if (constructorScriptContext != scriptContext) { if (constructorScriptContext->GetLibrary()->GetArrayConstructor() == constructor) @@ -12153,8 +11995,7 @@ namespace Js BOOL JavascriptArray::DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) { - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (BuiltInPropertyRecords::length.Equals(propertyName)) + if (BuiltInPropertyRecords::length.Equals(propertyNameString)) { return false; } @@ -12826,10 +12667,17 @@ namespace Js } JavascriptNativeArray* JavascriptNativeArray::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptNativeArray'"); + + return static_cast(aValue); + } + + JavascriptNativeArray* JavascriptNativeArray::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptNativeArray'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } bool JavascriptNativeIntArray::Is(Var aValue) @@ -12866,19 +12714,34 @@ namespace Js } JavascriptNativeIntArray* JavascriptNativeIntArray::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptNativeIntArray'"); + + return static_cast(aValue); + } + + JavascriptNativeIntArray* JavascriptNativeIntArray::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptNativeIntArray'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } #if ENABLE_COPYONACCESS_ARRAY JavascriptCopyOnAccessNativeIntArray* JavascriptCopyOnAccessNativeIntArray::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptCopyOnAccessNativeIntArray'"); + + return static_cast(aValue); + } + + JavascriptCopyOnAccessNativeIntArray* JavascriptCopyOnAccessNativeIntArray::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptCopyOnAccessNativeIntArray'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } + #endif bool JavascriptNativeFloatArray::Is(Var aValue) @@ -12901,11 +12764,18 @@ namespace Js JavascriptNativeFloatArray* JavascriptNativeFloatArray::FromVar(Var aValue) { - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptNativeFloatArray'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptNativeFloatArray'"); return static_cast(RecyclableObject::FromVar(aValue)); } + JavascriptNativeFloatArray* JavascriptNativeFloatArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptNativeFloatArray'"); + + return static_cast(RecyclableObject::UnsafeFromVar(aValue)); + } + template int Js::JavascriptArray::GetParamForIndexOf(unsigned int, Js::Arguments const&, void*&, unsigned int&, Js::ScriptContext*); template bool Js::JavascriptArray::ArrayElementEnumerator::MoveNext(); template void Js::JavascriptArray::SetArrayLiteralItem(unsigned int, void*); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.h index 8b0632ffa70..d4da6379930 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.h @@ -135,7 +135,7 @@ namespace Js static const uint8 MissingElementsCountIndex = 1; // 2nd column in allocationBuckets that stores allocation size for given bucket static const uint8 AllocationSizeIndex = 2; -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) static const uint8 AllocationBucketsCount = 3; #else static const uint8 AllocationBucketsCount = 2; @@ -215,11 +215,13 @@ namespace Js static bool Is(Var aValue); static bool Is(TypeId typeId); static JavascriptArray* FromVar(Var aValue); + static JavascriptArray* UnsafeFromVar(Var aValue); static bool IsVarArray(Var aValue); static bool IsVarArray(TypeId typeId); static JavascriptArray* FromAnyArray(Var aValue); + static JavascriptArray* UnsafeFromAnyArray(Var aValue); static bool IsDirectAccessArray(Var aValue); static bool IsInlineSegment(SparseArraySegmentBase *seg, JavascriptArray *pArr); @@ -967,6 +969,7 @@ namespace Js static bool Is(Var aValue); static bool Is(TypeId typeId); static JavascriptNativeArray* FromVar(Var aValue); + static JavascriptNativeArray* UnsafeFromVar(Var aValue); void SetArrayCallSite(ProfileId index, RecyclerWeakReference *weakRef) { @@ -1027,6 +1030,7 @@ namespace Js static bool Is(Var aValue); static bool Is(TypeId typeId); static JavascriptNativeIntArray* FromVar(Var aValue); + static JavascriptNativeIntArray* UnsafeFromVar(Var aValue); static bool IsNonCrossSite(Var aValue); typedef int32 TElement; @@ -1125,6 +1129,7 @@ namespace Js static bool Is(Var aValue); static bool Is(TypeId typeId); static JavascriptCopyOnAccessNativeIntArray* FromVar(Var aValue); + static JavascriptCopyOnAccessNativeIntArray* UnsafeFromVar(Var aValue); static DynamicType * GetInitialType(ScriptContext * scriptContext); void ConvertCopyOnAccessSegment(); @@ -1191,6 +1196,7 @@ namespace Js static bool Is(Var aValue); static bool Is(TypeId typeId); static JavascriptNativeFloatArray* FromVar(Var aValue); + static JavascriptNativeFloatArray* UnsafeFromVar(Var aValue); static bool IsNonCrossSite(Var aValue); typedef double TElement; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.inl b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.inl index e60cacec0b3..0311267d35b 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.inl +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArray.inl @@ -1786,7 +1786,7 @@ SECOND_PASS: sizeof(T) + sizeof(SparseArraySegment) + InlinePropertySlots * sizeof(Var); size_t totalSize = UInt32Math::MulAdd(inlineElementSlots); - #if defined(_M_X64_OR_ARM64) + #if defined(TARGET_64) // On x64, the total size won't be anywhere near AllocSizeMath::MaxMemory on x64, so no need to check totalSize = HeapInfo::GetAlignedSizeNoCheck(totalSize); #else diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArrayIterator.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArrayIterator.cpp index 2984149c33d..6bd164d1543 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArrayIterator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArrayIterator.cpp @@ -26,10 +26,17 @@ namespace Js } JavascriptArrayIterator* JavascriptArrayIterator::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptArrayIterator'"); + + return static_cast(aValue); + } + + JavascriptArrayIterator* JavascriptArrayIterator::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptArrayIterator'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptArrayIterator::EntryNext(RecyclableObject* function, CallInfo callInfo, ...) @@ -38,6 +45,11 @@ namespace Js ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); + +#ifdef ENABLE_JS_BUILTINS + Assert(!scriptContext->IsJsBuiltInEnabled()); +#endif + JavascriptLibrary* library = scriptContext->GetLibrary(); Assert(!(callInfo.Flags & CallFlags_New)); @@ -70,7 +82,7 @@ namespace Js } else if (TypedArrayBase::Is(iterable)) { - typedArrayBase = TypedArrayBase::FromVar(iterable); + typedArrayBase = TypedArrayBase::UnsafeFromVar(iterable); if (typedArrayBase->IsDetachedBuffer()) { JavascriptError::ThrowTypeError(scriptContext, JSERR_DetachedTypedArray); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArrayIterator.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArrayIterator.h index ab7815199af..8ce7d5dfc73 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptArrayIterator.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptArrayIterator.h @@ -29,6 +29,7 @@ namespace Js static bool Is(Var aValue); static JavascriptArrayIterator* FromVar(Var aValue); + static JavascriptArrayIterator* UnsafeFromVar(Var aValue); class EntryInfo { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.cpp index 798221ed6f8..36256af7dfb 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.cpp @@ -31,14 +31,12 @@ namespace Js ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); - AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); + AssertMsg(args.HasArg(), "Should always have implicit 'this'"); // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch. - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); BOOL value; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.h index 89615b9f857..57fb29a09e0 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.h @@ -22,6 +22,7 @@ namespace Js static inline bool Is(Var aValue); static inline JavascriptBoolean* FromVar(Var aValue); + static inline JavascriptBoolean* UnsafeFromVar(Var aValue); static Var ToVar(BOOL fValue,ScriptContext* scriptContext); class EntryInfo diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.inl b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.inl index 0562f4bb6f1..ef256ddfaa2 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.inl +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBoolean.inl @@ -15,9 +15,15 @@ namespace Js inline JavascriptBoolean* JavascriptBoolean::FromVar(Js::Var aValue) { - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptBoolean'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptBoolean'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } + inline JavascriptBoolean* JavascriptBoolean::UnsafeFromVar(Js::Var aValue) + { + AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptBoolean'"); + + return static_cast(aValue); + } } // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBooleanObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBooleanObject.cpp index 93882e5935f..346db9c3ba9 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBooleanObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBooleanObject.cpp @@ -18,10 +18,17 @@ namespace Js } JavascriptBooleanObject* JavascriptBooleanObject::FromVar(Js::Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptBooleanObject'"); + + return static_cast(aValue); + } + + JavascriptBooleanObject* JavascriptBooleanObject::UnsafeFromVar(Js::Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptBooleanObject'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } BOOL JavascriptBooleanObject::GetValue() const diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBooleanObject.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBooleanObject.h index 8e29510ac07..6e000413bc3 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBooleanObject.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBooleanObject.h @@ -17,6 +17,7 @@ namespace Js JavascriptBooleanObject(JavascriptBoolean* value, DynamicType * type); static bool Is(Var aValue); static JavascriptBooleanObject* FromVar(Js::Var aValue); + static JavascriptBooleanObject* UnsafeFromVar(Js::Var aValue); BOOL GetValue() const; void Initialize(JavascriptBoolean* value); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBuiltInFunctionList.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBuiltInFunctionList.h index 18547eae008..f4274e15526 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptBuiltInFunctionList.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptBuiltInFunctionList.h @@ -154,6 +154,9 @@ BUILTIN(JavascriptFunction, Call, EntryCall, FunctionInfo::ErrorOnNew) BUILTIN(JavascriptFunction, ToString, EntryToString, FunctionInfo::ErrorOnNew | FunctionInfo::HasNoSideEffect) BUILTIN(JavascriptFunction, SymbolHasInstance, EntrySymbolHasInstance, FunctionInfo::ErrorOnNew) BUILTIN(JavascriptFunction, NewAsyncFunctionInstance, NewAsyncFunctionInstance, FunctionInfo::SkipDefaultNewObject) +#ifdef ALLOW_JIT_REPRO +BUILTIN(JavascriptFunction, InvokeJit, EntryInvokeJit, FunctionInfo::ErrorOnNew) +#endif BUILTIN(JavascriptNumber, IsNaN, EntryIsNaN, FunctionInfo::ErrorOnNew) BUILTIN(JavascriptNumber, IsFinite, EntryIsFinite, FunctionInfo::ErrorOnNew) BUILTIN(JavascriptNumber, IsInteger, EntryIsInteger, FunctionInfo::ErrorOnNew) @@ -910,7 +913,9 @@ BUILTIN(ArrayBuffer, Slice, EntrySlice, FunctionInfo::ErrorOnNew) BUILTIN(ArrayBuffer, IsView, EntryIsView, FunctionInfo::ErrorOnNew) BUILTIN(ArrayBuffer, GetterByteLength, EntryGetterByteLength, FunctionInfo::ErrorOnNew | FunctionInfo::HasNoSideEffect) BUILTIN(ArrayBuffer, GetterSymbolSpecies, EntryGetterSymbolSpecies, FunctionInfo::ErrorOnNew) -BUILTIN(ArrayBuffer, Transfer, EntryTransfer, FunctionInfo::ErrorOnNew) +#if ENABLE_DEBUG_CONFIG_OPTIONS +BUILTIN(ArrayBuffer, Detach, EntryDetach, FunctionInfo::ErrorOnNew) +#endif BUILTIN(DataView, NewInstance, NewInstance, FunctionInfo::SkipDefaultNewObject) BUILTIN(DataView, SetInt8, EntrySetInt8, FunctionInfo::ErrorOnNew) BUILTIN(DataView, SetUint8, EntrySetUint8, FunctionInfo::ErrorOnNew) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptDate.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptDate.cpp index 0c8879d054e..a09561df603 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptDate.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptDate.cpp @@ -30,10 +30,17 @@ namespace Js } JavascriptDate* JavascriptDate::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'Date'"); + + return static_cast(aValue); + } + + JavascriptDate* JavascriptDate::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'Date'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptDate::GetDateData(JavascriptDate* date, DateImplementation::DateData dd, ScriptContext* scriptContext) @@ -71,10 +78,8 @@ namespace Js // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch. - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); if (!(callInfo.Flags & CallFlags_New)) { @@ -255,8 +260,9 @@ namespace Js if (JavascriptString::Is(args[1])) { JavascriptString* StringObject = JavascriptString::FromVar(args[1]); + const char16 * str = StringObject->GetString(); - if (wcscmp(StringObject->UnsafeGetBuffer(), _u("default")) == 0 || wcscmp(StringObject->UnsafeGetBuffer(), _u("string")) == 0) + if (wcscmp(str, _u("default")) == 0 || wcscmp(str, _u("string")) == 0) { // Date objects, are unique among built-in ECMAScript object in that they treat "default" as being equivalent to "string" // If hint is the string value "string" or the string value "default", then @@ -265,7 +271,7 @@ namespace Js } // Else if hint is the string value "number", then // Let tryFirst be "number". - else if(wcscmp(StringObject->UnsafeGetBuffer(), _u("number")) == 0) + else if(wcscmp(str, _u("number")) == 0) { return JavascriptConversion::OrdinaryToPrimitive(args[0], JavascriptHint::HintNumber/*tryFirst*/, scriptContext); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptDate.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptDate.h index 745bb82ad49..2d665f1a8a2 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptDate.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptDate.h @@ -24,6 +24,7 @@ namespace Js double GetTime() { return m_date.GetMilliSeconds(); } static JavascriptDate* FromVar(Var aValue); + static JavascriptDate* UnsafeFromVar(Var aValue); class EntryInfo { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptError.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptError.cpp index 1c25355c4c1..8c14dd2f1c9 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptError.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptError.cpp @@ -29,7 +29,7 @@ namespace Js bool JavascriptError::Is(Var aValue) { - AssertMsg(aValue != NULL, "Error is NULL - did it come from an out of memory exception?"); + AssertMsg(aValue != NULL, "Error is NULL - did it come from an oom exception?"); return JavascriptOperators::GetTypeId(aValue) == TypeIds_Error; } @@ -123,7 +123,7 @@ namespace Js JavascriptOperators::SetProperty(pError, pError, PropertyIds::description, descriptionString, scriptContext); pError->SetNotEnumerable(PropertyIds::description); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; + Var newTarget = args.GetNewTarget(); return JavascriptError::NewInstance(function, pError, callInfo, newTarget, message); } @@ -134,7 +134,7 @@ namespace Js ARGUMENTS(args, callInfo); \ ScriptContext* scriptContext = function->GetScriptContext(); \ JavascriptError* pError = scriptContext->GetLibrary()->Create##name(); \ - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; \ + Var newTarget = args.GetNewTarget(); \ Var message = args.Info.Count > 1 ? args[1] : scriptContext->GetLibrary()->GetUndefined(); \ return JavascriptError::NewInstance(function, pError, callInfo, newTarget, message); \ } @@ -159,7 +159,7 @@ namespace Js ScriptContext* scriptContext = function->GetScriptContext(); JavascriptError* pError = scriptContext->GetHostScriptContext()->CreateWinRTError(nullptr, nullptr); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; + Var newTarget = args.GetNewTarget(); Var message = args.Info.Count > 1 ? args[1] : scriptContext->GetLibrary()->GetUndefined(); return JavascriptError::NewInstance(function, pError, callInfo, newTarget, message); } @@ -831,6 +831,7 @@ namespace Js if (cse->ei.bstrDescription) { value = JavascriptString::NewCopySz(cse->ei.bstrDescription, scriptContext); + JavascriptOperators::OP_SetProperty(error, PropertyIds::description, value, scriptContext); JavascriptOperators::OP_SetProperty(error, PropertyIds::message, value, scriptContext); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptError.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptError.h index 1877364c15a..bd370b1f319 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptError.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptError.h @@ -42,11 +42,18 @@ namespace Js static JavascriptError* FromVar(Var aValue) { - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptError'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptError'"); return static_cast(RecyclableObject::FromVar(aValue)); } + static JavascriptError* UnsafeFromVar(Var aValue) + { + AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptError'"); + + return static_cast(RecyclableObject::UnsafeFromVar(aValue)); + } + void SetNotEnumerable(PropertyId propertyId); static Var NewInstance(RecyclableObject* function, JavascriptError* pError, CallInfo callInfo, Var newTarget, Var message); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptExceptionMetadata.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptExceptionMetadata.cpp index ef0fb07a767..7d298766f24 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptExceptionMetadata.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptExceptionMetadata.cpp @@ -67,7 +67,7 @@ namespace Js { Js::Utf8SourceInfo* sourceInfo = functionBody->GetUtf8SourceInfo(); sourceInfo->EnsureLineOffsetCache(); - JsUtil::LineOffsetCache *cache = sourceInfo->GetLineOffsetCache(); + LineOffsetCache *cache = sourceInfo->GetLineOffsetCache(); if (line >= cache->GetLineCount()) { @@ -143,7 +143,7 @@ namespace Js { } else { - AssertMsg(FALSE, "Line ending logic out of sync between Js::JavascriptExceptionMetadata and JsUtil::LineOffsetCache::GetCharacterOffsetForLine"); + AssertMsg(FALSE, "Line ending logic out of sync between Js::JavascriptExceptionMetadata and Js::LineOffsetCache::GetCharacterOffsetForLine"); return false; } } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptExternalFunction.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptExternalFunction.cpp index c2ef65391e2..b1f711a3a24 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptExternalFunction.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptExternalFunction.cpp @@ -273,7 +273,14 @@ namespace Js ScriptContext * scriptContext = externalFunction->type->GetScriptContext(); AnalysisAssert(scriptContext); - Var result = NULL; + Var result = nullptr; + Assert(callInfo.Count > 0); + + StdCallJavascriptMethodInfo info = { + args[0], + args.HasNewTarget() ? args.GetNewTarget() : args.IsNewCall() ? function : scriptContext->GetLibrary()->GetUndefined(), + args.IsNewCall() + }; #if ENABLE_TTD if(scriptContext->ShouldPerformRecordOrReplayAction()) @@ -284,14 +291,14 @@ namespace Js { BEGIN_LEAVE_SCRIPT(scriptContext) { - result = externalFunction->stdCallNativeMethod(function, ((callInfo.Flags & CallFlags_New) != 0), args.Values, args.Info.Count, externalFunction->callbackState); + result = externalFunction->stdCallNativeMethod(function, args.Values, args.Info.Count, &info, externalFunction->callbackState); } END_LEAVE_SCRIPT(scriptContext); } #else BEGIN_LEAVE_SCRIPT(scriptContext) { - result = externalFunction->stdCallNativeMethod(function, ((callInfo.Flags & CallFlags_New) != 0), args.Values, args.Info.Count, externalFunction->callbackState); + result = externalFunction->stdCallNativeMethod(function, args.Values, args.Info.Count, &info, externalFunction->callbackState); } END_LEAVE_SCRIPT(scriptContext); #endif @@ -424,9 +431,15 @@ namespace Js TTD::TTDNestingDepthAutoAdjuster logPopper(scriptContext->GetThreadContext()); TTD::NSLogEvents::EventLogEntry* callEvent = elog->RecordExternalCallEvent(externalFunction, scriptContext->GetThreadContext()->TTDRootNestingCount, args.Info.Count, args.Values, true); + StdCallJavascriptMethodInfo info = { + args[0], + args.HasNewTarget() ? args.GetNewTarget() : args.IsNewCall() ? function : scriptContext->GetLibrary()->GetUndefined(), + args.IsNewCall() + }; + BEGIN_LEAVE_SCRIPT(scriptContext) { - result = externalFunction->stdCallNativeMethod(function, ((callInfo.Flags & CallFlags_New) != 0), args.Values, args.Info.Count, externalFunction->callbackState); + result = externalFunction->stdCallNativeMethod(function, args.Values, args.Info.Count, &info, externalFunction->callbackState); } END_LEAVE_SCRIPT(scriptContext); @@ -436,7 +449,7 @@ namespace Js return result; } - Var __stdcall JavascriptExternalFunction::TTDReplayDummyExternalMethod(Js::Var callee, bool isConstructCall, Var *args, USHORT cargs, void *callbackState) + Var __stdcall JavascriptExternalFunction::TTDReplayDummyExternalMethod(Var callee, Var *args, USHORT cargs, StdCallJavascriptMethodInfo *info, void *callbackState) { JavascriptExternalFunction* externalFunction = static_cast(callee); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptExternalFunction.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptExternalFunction.h index 735f877b6e0..4e25ac961b1 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptExternalFunction.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptExternalFunction.h @@ -8,7 +8,14 @@ typedef HRESULT(__cdecl *InitializeMethod)(Js::Var instance); namespace Js { - typedef Var (__stdcall *StdCallJavascriptMethod)(Var callee, bool isConstructCall, Var *args, USHORT cargs, void *callbackState); + struct StdCallJavascriptMethodInfo + { + Var thisArg; + Var newTargetArg; + bool isConstructCall; + }; + + typedef Var (__stdcall *StdCallJavascriptMethod)(Var callee, Var *args, USHORT cargs, StdCallJavascriptMethodInfo *info, void *callbackState); typedef int JavascriptTypeId; class JavascriptExternalFunction : public RuntimeFunction @@ -96,7 +103,7 @@ namespace Js static Var HandleRecordReplayExternalFunction_Thunk(Js::JavascriptFunction* function, CallInfo& callInfo, Arguments& args, ScriptContext* scriptContext); static Var HandleRecordReplayExternalFunction_StdThunk(Js::RecyclableObject* function, CallInfo& callInfo, Arguments& args, ScriptContext* scriptContext); - static Var __stdcall TTDReplayDummyExternalMethod(Js::Var callee, bool isConstructCall, Var *args, USHORT cargs, void *callbackState); + static Var __stdcall TTDReplayDummyExternalMethod(Var callee, Var *args, USHORT cargs, StdCallJavascriptMethodInfo *info, void *callbackState); #endif friend class JavascriptLibrary; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptFunction.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptFunction.cpp index 07db7063918..183694f9aa3 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptFunction.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptFunction.cpp @@ -3,7 +3,6 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeLibraryPch.h" -#include "BackendApi.h" #include "Library/StackScriptFunction.h" #include "Types/SpreadArgument.h" @@ -109,10 +108,17 @@ namespace Js } JavascriptFunction* JavascriptFunction::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptFunction'"); + + return static_cast(aValue); + } + + JavascriptFunction* JavascriptFunction::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptFunction'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } BOOL JavascriptFunction::IsStrictMode() const @@ -148,19 +154,13 @@ namespace Js // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch. - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); JavascriptString* separator = library->GetCommaDisplayString(); - JavascriptFunction* pfuncScript; - ENTER_PINNED_SCOPE(JavascriptString, formals); - ENTER_PINNED_SCOPE(JavascriptString, fnBody); - fnBody = NULL; // Gather all the formals into a string like (fml1, fml2, fml3) - formals = library->GetOpenRBracketString(); + JavascriptString *formals = library->GetOpenRBracketString(); for (uint i = 1; i < args.Info.Count - 1; ++i) { @@ -172,6 +172,7 @@ namespace Js } formals = JavascriptString::Concat(formals, library->GetNewLineCloseRBracketString()); // Function body, last argument to Function(...) + JavascriptString *fnBody = NULL; if (args.Info.Count > 1) { fnBody = JavascriptConversion::ToString(args.Values[args.Info.Count - 1], scriptContext); @@ -185,8 +186,7 @@ namespace Js 0 // " {" GetSpaceOpenBracketString == numberLinesPrependedToAnonymousFunction); // Be sure to add exactly one line to anonymous function - ENTER_PINNED_SCOPE(JavascriptString, bs); - bs = functionKind == FunctionKind::Async ? + JavascriptString *bs = functionKind == FunctionKind::Async ? library->GetAsyncFunctionAnonymouseString() : functionKind == FunctionKind::Generator ? library->GetFunctionPTRAnonymousString() : @@ -205,6 +205,7 @@ namespace Js BOOL strictMode = FALSE; + JavascriptFunction* pfuncScript; FunctionInfo *pfuncInfoCache = NULL; char16 const * sourceString = bs->GetSz(); charcount_t sourceLen = bs->GetLength(); @@ -299,10 +300,6 @@ namespace Js } #endif - LEAVE_PINNED_SCOPE(); // bs - LEAVE_PINNED_SCOPE(); // fnBody - LEAVE_PINNED_SCOPE(); // formals - JS_ETW(EventWriteJSCRIPT_RECYCLER_ALLOCATE_FUNCTION(pfuncScript, EtwTrace::GetFunctionId(pfuncScript->GetFunctionProxy()))); if (functionKind == FunctionKind::Generator || functionKind == FunctionKind::Async) @@ -561,7 +558,8 @@ namespace Js } else { - return JavascriptFunction::CallFunction(pFunc, pFunc->GetEntryPoint(), outArgs); + // Apply scenarios can have more than Constants::MaxAllowedArgs number of args. Need to use the large argCount logic here. + return JavascriptFunction::CallFunction(pFunc, pFunc->GetEntryPoint(), outArgs, /* useLargeArgCount */true); } } @@ -623,12 +621,6 @@ namespace Js /// If not, throw TypeError /// uint argCount = args.Info.Count; - if (callInfo.Flags & CallFlags_ExtraArg) - { - // The last argument is the "extra". Don't consider it in the logic below. - // It will either remain in place (argCount == 1) or be copied. - argCount--; - } if (argCount == 0 || !JavascriptConversion::IsCallable(args[0])) { JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedFunction, _u("Function.prototype.call")); @@ -866,20 +858,21 @@ namespace Js resultObject = JavascriptOperators::NewScObjectNoCtor(v, scriptContext); } - // JavascriptOperators::NewScObject should have thrown if 'v' is not a constructor - RecyclableObject* functionObj = RecyclableObject::FromVar(v); + // JavascriptOperators::NewScObjectNoCtor should have thrown if 'v' is not a constructor + RecyclableObject* functionObj = RecyclableObject::UnsafeFromVar(v); const unsigned STACK_ARGS_ALLOCA_THRESHOLD = 8; // Number of stack args we allow before using _alloca Var stackArgs[STACK_ARGS_ALLOCA_THRESHOLD]; Var* newValues = args.Values; CallFlags newFlags = args.Info.Flags; - ushort newCount = args.Info.Count; bool thisAlreadySpecified = false; if (overridingNewTarget != nullptr) { - if (ScriptFunction::Is(functionObj) && ScriptFunction::FromVar(functionObj)->GetFunctionInfo()->IsClassConstructor()) + ScriptFunction * scriptFunctionObj = JavascriptOperators::TryFromVar(functionObj); + ushort newCount = args.Info.Count; + if (scriptFunctionObj && scriptFunctionObj->GetFunctionInfo()->IsClassConstructor()) { thisAlreadySpecified = true; args.Values[0] = overridingNewTarget; @@ -916,7 +909,7 @@ namespace Js newValues[0] = resultObject; } - CallInfo newCallInfo(newFlags, newCount); + CallInfo newCallInfo(newFlags, args.Info.Count); Arguments newArgs(newCallInfo, newValues); if (JavascriptProxy::Is(v)) @@ -985,18 +978,25 @@ namespace Js return JavascriptFunction::CallSpreadFunction(function, args, spreadIndices); } - uint32 JavascriptFunction::GetSpreadSize(const Arguments args, const Js::AuxArray *spreadIndices, ScriptContext *scriptContext) + uint JavascriptFunction::GetSpreadSize(const Arguments args, const Js::AuxArray *spreadIndices, ScriptContext *scriptContext) { // Work out the expanded number of arguments. - uint32 totalLength = args.Info.Count - spreadIndices->count; - ::Math::RecordOverflowPolicy overflow; - for (unsigned i = 0; i < spreadIndices->count; ++i) + AssertOrFailFast(args.Info.Count < CallInfo::kMaxCountArgs && args.Info.Count >= spreadIndices->count); + + uint spreadArgsCount = spreadIndices->count; + uint32 totalLength = args.Info.Count - spreadArgsCount; + + for (unsigned i = 0; i < spreadArgsCount; ++i) { uint32 elementLength = JavascriptArray::GetSpreadArgLen(args[spreadIndices->elements[i]], scriptContext); - totalLength = UInt32Math::Add(totalLength, elementLength, overflow); + if (elementLength >= CallInfo::kMaxCountArgs) + { + JavascriptError::ThrowRangeError(scriptContext, JSERR_ArgListTooLarge); + } + totalLength = UInt32Math::Add(totalLength, elementLength); } - if (totalLength >= CallInfo::kMaxCountArgs || overflow.HasOverflowed()) + if (totalLength >= CallInfo::kMaxCountArgs) { JavascriptError::ThrowRangeError(scriptContext, JSERR_ArgListTooLarge); } @@ -1010,14 +1010,16 @@ namespace Js Assert(destArgs.Values != nullptr); CallInfo callInfo = args.Info; - size_t destArgsByteSize = destArgs.Info.Count * sizeof(Var); + uint argCount = args.GetArgCountWithExtraArgs(); + unsigned destArgCount = destArgs.GetLargeArgCountWithExtraArgs(); // Result can be bigger than Constants::MaxAllowedArgs + size_t destArgsByteSize = destArgCount * sizeof(Var); destArgs.Values[0] = args[0]; // Iterate over the arguments, spreading inline. We skip 'this'. uint32 argsIndex = 1; - for (unsigned i = 1, spreadArgIndex = 0; i < callInfo.Count; ++i) + for (unsigned i = 1, spreadArgIndex = 0; i < argCount; ++i) { uint32 spreadIndex = spreadIndices->elements[spreadArgIndex]; // Next index to be spread. if (i < spreadIndex) @@ -1037,7 +1039,7 @@ namespace Js js_memcpy_s(destArgs.Values + argsIndex, destArgsByteSize - (argsIndex * sizeof(Var)), args.Values + i, - (args.Info.Count - i) * sizeof(Var)); + (argCount - i) * sizeof(Var)); break; } else @@ -1071,7 +1073,7 @@ namespace Js } } } - if (argsIndex > destArgs.Info.Count) + if (argsIndex > destArgCount) { AssertMsg(false, "The array length has changed since we allocated the destArgs buffer?"); Throw::FatalInternalError(); @@ -1084,17 +1086,17 @@ namespace Js ScriptContext* scriptContext = function->GetScriptContext(); // Work out the expanded number of arguments. - uint32 actualLength = GetSpreadSize(args, spreadIndices, scriptContext); + uint spreadSize = GetSpreadSize(args, spreadIndices, scriptContext); + uint32 actualLength = CallInfo::GetLargeArgCountWithExtraArgs(args.Info.Flags, spreadSize); // Allocate (if needed) space for the expanded arguments. - Arguments outArgs(CallInfo(args.Info.Flags, 0), nullptr); - outArgs.Info.Count = actualLength; + Arguments outArgs(CallInfo(args.Info.Flags, spreadSize, /* unUsedBool */ false), nullptr); Var stackArgs[STACK_ARGS_ALLOCA_THRESHOLD]; size_t outArgsSize = 0; - if (outArgs.Info.Count > STACK_ARGS_ALLOCA_THRESHOLD) + if (actualLength > STACK_ARGS_ALLOCA_THRESHOLD) { - PROBE_STACK(scriptContext, outArgs.Info.Count * sizeof(Var) + Js::Constants::MinStackDefault); // args + function call - outArgsSize = outArgs.Info.Count * sizeof(Var); + PROBE_STACK(scriptContext, actualLength * sizeof(Var) + Js::Constants::MinStackDefault); // args + function call + outArgsSize = actualLength * sizeof(Var); outArgs.Values = (Var*)_alloca(outArgsSize); ZeroMemory(outArgs.Values, outArgsSize); } @@ -1107,7 +1109,8 @@ namespace Js SpreadArgs(args, outArgs, spreadIndices, scriptContext); - return JavascriptFunction::CallFunction(function, function->GetEntryPoint(), outArgs); + // Number of arguments are allowed to be more than Constants::MaxAllowedArgs in runtime. Need to use the large argcount logic in this case. + return JavascriptFunction::CallFunction(function, function->GetEntryPoint(), outArgs, true); } Var JavascriptFunction::CallFunction(Arguments args) @@ -1115,94 +1118,58 @@ namespace Js return JavascriptFunction::CallFunction(this, this->GetEntryPoint(), args); } - template Var JavascriptFunction::CallFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args); - template Var JavascriptFunction::CallFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args); + template Var JavascriptFunction::CallFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args, bool useLargeArgCount); + template Var JavascriptFunction::CallFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args, bool useLargeArgCount); #if _M_IX86 #ifdef ASMJS_PLAT - template <> int JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, uint argc, Var * argv) + template <> int JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) { - return CallAsmJsFunctionX86Thunk(function, entryPoint, argc, argv).retIntVal; + return CallAsmJsFunctionX86Thunk(function, entryPoint, argv, argsSize, reg).i32; } - template <> int64 JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, uint argc, Var * argv) + template <> int64 JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) { - return CallAsmJsFunctionX86Thunk(function, entryPoint, argc, argv).retInt64Val; + return CallAsmJsFunctionX86Thunk(function, entryPoint, argv, argsSize, reg).i64; } - template <> float JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, uint argc, Var * argv) + template <> float JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) { - return CallAsmJsFunctionX86Thunk(function, entryPoint, argc, argv).retFloatVal; + return CallAsmJsFunctionX86Thunk(function, entryPoint, argv, argsSize, reg).f32; } - template <> double JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, uint argc, Var * argv) + template <> double JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) { - return CallAsmJsFunctionX86Thunk(function, entryPoint, argc, argv).retDoubleVal; + return CallAsmJsFunctionX86Thunk(function, entryPoint, argv, argsSize, reg).f64; } - template <> AsmJsSIMDValue JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, uint argc, Var * argv) + template <> AsmJsSIMDValue JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) { - return CallAsmJsFunctionX86Thunk(function, entryPoint, argc, argv).retSimdVal; + return CallAsmJsFunctionX86Thunk(function, entryPoint, argv, argsSize, reg).simd; } - PossibleAsmJsReturnValues JavascriptFunction::CallAsmJsFunctionX86Thunk(RecyclableObject * function, JavascriptMethod entryPoint, uint argc, Var * argv) + PossibleAsmJsReturnValues JavascriptFunction::CallAsmJsFunctionX86Thunk(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte*) { - enum { - IsFloat = 1 << AsmJsRetType::Float, - IsDouble = 1 << AsmJsRetType::Double, - IsInt64 = 1 << AsmJsRetType::Int64, - IsSimd = - 1 << AsmJsRetType::Int32x4 | - 1 << AsmJsRetType::Bool32x4 | - 1 << AsmJsRetType::Bool16x8 | - 1 << AsmJsRetType::Bool8x16 | - 1 << AsmJsRetType::Float32x4 | - 1 << AsmJsRetType::Float64x2 | - 1 << AsmJsRetType::Int16x8 | - 1 << AsmJsRetType::Int8x16 | - 1 << AsmJsRetType::Uint32x4 | - 1 << AsmJsRetType::Uint16x8 | - 1 << AsmJsRetType::Uint8x16, - CannotUseEax = IsFloat | IsDouble | IsInt64 | IsSimd - }; - - AsmJsFunctionInfo* asmInfo = ((ScriptFunction*)function)->GetFunctionBody()->GetAsmJsFunctionInfo(); - Assert((uint)((ArgSlot)asmInfo->GetArgCount() + 1) == (uint)(asmInfo->GetArgCount() + 1)); - uint argsSize = asmInfo->GetArgByteSize(); - uint alignedSize = ::Math::Align(argsSize, 8); - ScriptContext * scriptContext = function->GetScriptContext(); - PROBE_STACK_CALL(scriptContext, function, alignedSize); + void* savedEsp; + _declspec(align(16)) PossibleAsmJsReturnValues retVals; + CompileAssert(sizeof(PossibleAsmJsReturnValues) == sizeof(int64) + sizeof(AsmJsSIMDValue)); + CompileAssert(offsetof(PossibleAsmJsReturnValues, low) == offsetof(PossibleAsmJsReturnValues, i32)); + CompileAssert(offsetof(PossibleAsmJsReturnValues, high) == offsetof(PossibleAsmJsReturnValues, i32) + sizeof(int32)); - PossibleAsmJsReturnValues retVals; - AsmJsRetType::Which retType = asmInfo->GetReturnType().which(); - - void *data = nullptr; - void *savedEsp = nullptr; + // call variable argument function provided in entryPoint __asm { - // Save ESP mov savedEsp, esp; - mov eax, alignedSize; - // Make sure we don't go beyond guard page + mov eax, argsSize; cmp eax, 0x1000; - jge alloca_probe; + jl allocate_stack; + // Use _chkstk to probe each page when using more then a page size + call _chkstk; +allocate_stack: sub esp, eax; - jmp dbl_align; -alloca_probe : - // Use alloca to allocate more then a page size - // Alloca assumes eax, contains size, and adjust ESP while - // probing each page. - call _alloca_probe_16; -dbl_align : - and esp,-8 - mov data, esp; - } - { - Var* outParam = argv + 1; - void* dest = (void*)data; - memmove(dest, outParam, argsSize); + mov edi, esp; + mov esi, argv; + add esi, 4; // Skip function + mov ecx, argsSize; + rep movs byte ptr[edi], byte ptr[esi]; - } - // call variable argument function provided in entryPoint - __asm - { #ifdef _CONTROL_FLOW_GUARD // verify that the call target is valid mov ecx, entryPoint @@ -1211,35 +1178,9 @@ dbl_align : #endif push function; call entryPoint; - push edx; // save possible int64 return value - mov ecx, retType; - mov edx, 1; - shl edx, cl; - pop ecx; // restore possible int64 return value - and edx, CannotUseEax; - jz FromEax; - and edx, ~IsInt64; - jz FromEaxEcx; - and edx, ~IsFloat; - jz FromXmmWord; - and edx, ~IsDouble; - jz FromXmmDWord; - // simd - movups retVals.retSimdVal, xmm0; - jmp end - FromEax: - mov retVals.retIntVal, eax; - jmp end; -FromEaxEcx: - mov retVals.retIntVal, eax; - mov retVals.retIntVal + 4, ecx; - jmp end; -FromXmmWord: - movss retVals.retFloatVal, xmm0; - jmp end; -FromXmmDWord: - movsd retVals.retDoubleVal, xmm0; -end: + mov retVals.low, eax; + mov retVals.high, edx; + movaps retVals.xmm, xmm0; // Restore ESP mov esp, savedEsp; } @@ -1265,7 +1206,7 @@ void __cdecl _alloca_probe_16() #endif static Var LocalCallFunction(RecyclableObject* function, - JavascriptMethod entryPoint, Arguments args, bool doStackProbe) + JavascriptMethod entryPoint, Arguments args, bool doStackProbe, bool useLargeArgCount = false) { Js::Var varResult; @@ -1274,7 +1215,8 @@ void __cdecl _alloca_probe_16() #endif // compute size of stack to reserve CallInfo callInfo = args.Info; - uint argsSize = callInfo.Count * sizeof(Var); + uint argCount = useLargeArgCount ? args.GetLargeArgCountWithExtraArgs() : args.GetArgCountWithExtraArgs(); + uint argsSize = argCount * sizeof(Var); ScriptContext * scriptContext = function->GetScriptContext(); @@ -1283,6 +1225,8 @@ void __cdecl _alloca_probe_16() PROBE_STACK_CALL(scriptContext, function, argsSize); } + JS_REENTRANCY_CHECK(scriptContext->GetThreadContext()); + void *data; void *savedEsp; __asm { @@ -1310,7 +1254,7 @@ void __cdecl _alloca_probe_16() Var* dest = (Var*)data; Var* src = args.Values; - for(unsigned int i =0; i < callInfo.Count; i++) + for(unsigned int i =0; i < argCount; i++) { dest[i] = src[i]; } @@ -1344,18 +1288,19 @@ void __cdecl _alloca_probe_16() // when __asm op is under a template function template Var JavascriptFunction::CallFunction(RecyclableObject* function, - JavascriptMethod entryPoint, Arguments args) + JavascriptMethod entryPoint, Arguments args, bool useLargeArgCount) { - return LocalCallFunction(function, entryPoint, args, doStackProbe); + return LocalCallFunction(function, entryPoint, args, doStackProbe, useLargeArgCount); } #elif _M_X64 template - Var JavascriptFunction::CallFunction(RecyclableObject *function, JavascriptMethod entryPoint, Arguments args) + Var JavascriptFunction::CallFunction(RecyclableObject *function, JavascriptMethod entryPoint, Arguments args, bool useLargeArgCount) { // compute size of stack to reserve and make sure we have enough stack. - CallInfo callInfo = args.Info; - uint argsSize = callInfo.Count * sizeof(Var); + uint argCount = useLargeArgCount ? args.GetLargeArgCountWithExtraArgs() : args.GetArgCountWithExtraArgs(); + uint argsSize = argCount * sizeof(Var); + if (doStackProbe == true) { PROBE_STACK_CALL(function->GetScriptContext(), function, argsSize); @@ -1365,20 +1310,20 @@ void __cdecl _alloca_probe_16() #endif return JS_REENTRANCY_CHECK(function->GetScriptContext()->GetThreadContext(), - amd64_CallFunction(function, entryPoint, args.Info, args.Info.Count, &args.Values[0])); + amd64_CallFunction(function, entryPoint, args.Info, argCount, &args.Values[0])); } #elif defined(_M_ARM) extern "C" { - extern Var arm_CallFunction(JavascriptFunction* function, CallInfo info, Var* values, JavascriptMethod entryPoint); + extern Var arm_CallFunction(JavascriptFunction* function, CallInfo info, uint argCount, Var* values, JavascriptMethod entryPoint); } template - Var JavascriptFunction::CallFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args) + Var JavascriptFunction::CallFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args, bool useLargeArgCount) { // compute size of stack to reserve and make sure we have enough stack. - CallInfo callInfo = args.Info; - uint argsSize = callInfo.Count * sizeof(Var); + uint argCount = useLargeArgCount ? args.GetLargeArgCountWithExtraArgs() : args.GetArgCountWithExtraArgs(); + uint argsSize = argCount * sizeof(Var); if (doStackProbe) { PROBE_STACK_CALL(function->GetScriptContext(), function, argsSize); @@ -1391,13 +1336,12 @@ void __cdecl _alloca_probe_16() //The ARM can pass 4 arguments via registers so handle the cases for 0 or 1 values without resorting to asm code //(so that the asm code can assume 0 or more values will go on the stack: putting -1 values on the stack is unhealthy). - unsigned count = args.Info.Count; - if (count == 0) + if (argCount == 0) { varResult = CALL_ENTRYPOINT(function->GetScriptContext()->GetThreadContext(), entryPoint, (JavascriptFunction*)function, args.Info); } - else if (count == 1) + else if (argCount == 1) { varResult = CALL_ENTRYPOINT(function->GetScriptContext()->GetThreadContext(), entryPoint, (JavascriptFunction*)function, args.Info, args.Values[0]); @@ -1405,7 +1349,7 @@ void __cdecl _alloca_probe_16() else { varResult = JS_REENTRANCY_CHECK(function->GetScriptContext()->GetThreadContext(), - arm_CallFunction((JavascriptFunction*)function, args.Info, args.Values, entryPoint)); + arm_CallFunction((JavascriptFunction*)function, args.Info, argCount, args.Values, entryPoint)); } return varResult; @@ -1413,15 +1357,15 @@ void __cdecl _alloca_probe_16() #elif defined(_M_ARM64) extern "C" { - extern Var arm64_CallFunction(JavascriptFunction* function, CallInfo info, Var* values, JavascriptMethod entryPoint); + extern Var arm64_CallFunction(JavascriptFunction* function, CallInfo info, uint argCount, Var* values, JavascriptMethod entryPoint); } template - Var JavascriptFunction::CallFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args) + Var JavascriptFunction::CallFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args, bool useLargeArgCount) { // compute size of stack to reserve and make sure we have enough stack. - CallInfo callInfo = args.Info; - uint argsSize = callInfo.Count * sizeof(Var); + uint argCount = useLargeArgCount ? args.GetLargeArgCountWithExtraArgs() : args.GetArgCountWithExtraArgs(); + uint argsSize = argCount * sizeof(Var); if (doStackProbe) { PROBE_STACK_CALL(function->GetScriptContext(), function, argsSize); @@ -1433,7 +1377,7 @@ void __cdecl _alloca_probe_16() Js::Var varResult; varResult = JS_REENTRANCY_CHECK(function->GetScriptContext()->GetThreadContext(), - arm64_CallFunction((JavascriptFunction*)function, args.Info, args.Values, entryPoint)); + arm64_CallFunction((JavascriptFunction*)function, args.Info, argCount, args.Values, entryPoint)); return varResult; } @@ -1705,19 +1649,19 @@ void __cdecl _alloca_probe_16() Assert(functionInfo); try { - functionInfo->GetFunctionBody()->AddDeferParseAttribute(); - functionInfo->GetFunctionBody()->ResetEntryPoint(); - functionInfo->GetFunctionBody()->ResetInParams(); + functionInfo->GetFunctionBody()->AddDeferParseAttribute(); + functionInfo->GetFunctionBody()->ResetEntryPoint(); + functionInfo->GetFunctionBody()->ResetInParams(); - FunctionBody * funcBody = functionInfo->Parse(functionRef); + FunctionBody * funcBody = functionInfo->Parse(functionRef); - #if ENABLE_PROFILE_INFO - // This is the first call to the function, ensure dynamic profile info - funcBody->EnsureDynamicProfileInfo(); - #endif +#if ENABLE_PROFILE_INFO + // This is the first call to the function, ensure dynamic profile info + funcBody->EnsureDynamicProfileInfo(); +#endif - (*functionRef)->UpdateUndeferredBody(funcBody); - } + (*functionRef)->UpdateUndeferredBody(funcBody); + } catch (JavascriptException&) { Js::Throw::FatalInternalError(); @@ -2322,14 +2266,15 @@ void __cdecl _alloca_probe_16() { return false; } - Js::FunctionBody* funcBody = func->GetFunctionBody(); - bool isWAsmJs = funcBody->GetIsAsmJsFunction(); - bool isWasmOnly = funcBody->IsWasmFunction(); - if (isWAsmJs) + + bool isAsmJs = AsmJsScriptFunction::Is(func); + bool isWasmOnly = WasmScriptFunction::Is(func); + uintptr_t faultingAddr = helper.GetFaultingAddress(); + if (isAsmJs) { + AsmJsScriptFunction* asmFunc = AsmJsScriptFunction::FromVar(func); // some extra checks for asm.js because we have slightly more information that we can validate - uintptr_t moduleMemory = (uintptr_t)((AsmJsScriptFunction*)func)->GetModuleMemory(); - if (!moduleMemory) + if (!asmFunc->GetModuleEnvironment()) { return false; } @@ -2339,14 +2284,14 @@ void __cdecl _alloca_probe_16() #ifdef ENABLE_WASM if (isWasmOnly) { - WebAssemblyMemory* mem = *(WebAssemblyMemory**)(moduleMemory + WebAssemblyModule::GetMemoryOffset()); + WebAssemblyMemory* mem = WasmScriptFunction::FromVar(func)->GetWebAssemblyMemory(); arrayBuffer = mem->GetBuffer(); reservationSize = MAX_WASM__ARRAYBUFFER_LENGTH; } else #endif { - arrayBuffer = *(ArrayBuffer**)(moduleMemory + AsmJsModuleMemory::MemoryTableBeginOffset); + arrayBuffer = asmFunc->GetAsmJsArrayBuffer(); reservationSize = MAX_ASMJS_ARRAYBUFFER_LENGTH; } @@ -2363,7 +2308,6 @@ void __cdecl _alloca_probe_16() { return false; } - uintptr_t faultingAddr = helper.GetFaultingAddress(); if (faultingAddr < bufferAddr) { return false; @@ -2373,6 +2317,28 @@ void __cdecl _alloca_probe_16() return false; } } + else + { + MEMORY_BASIC_INFORMATION info = { 0 }; + size_t size = VirtualQuery((LPCVOID)faultingAddr, &info, sizeof(info)); + if (size == 0) + { + return false; + } + size_t allocationSize = info.RegionSize + ((uintptr_t)info.BaseAddress - (uintptr_t)info.AllocationBase); + if (allocationSize != MAX_WASM__ARRAYBUFFER_LENGTH && allocationSize != MAX_ASMJS_ARRAYBUFFER_LENGTH) + { + return false; + } + if (info.State != MEM_RESERVE) + { + return false; + } + if (info.Type != MEM_PRIVATE) + { + return false; + } + } PEXCEPTION_POINTERS exceptionInfo = helper.GetExceptionInfo(); BYTE* pc = (BYTE*)exceptionInfo->ExceptionRecord->ExceptionAddress; @@ -2498,6 +2464,16 @@ void __cdecl _alloca_probe_16() ); } + void JavascriptFunction::SetIsJsBuiltInCode() + { + isJsBuiltInCode = true; + } + + bool JavascriptFunction::IsJsBuiltIn() + { + return isJsBuiltInCode; + } + PropertyQueryFlags JavascriptFunction::HasPropertyQuery(PropertyId propertyId) { switch (propertyId) @@ -3098,8 +3074,7 @@ void __cdecl _alloca_probe_16() BOOL JavascriptFunction::DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) { - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (BuiltInPropertyRecords::caller.Equals(propertyName) || BuiltInPropertyRecords::arguments.Equals(propertyName)) + if (BuiltInPropertyRecords::caller.Equals(propertyNameString) || BuiltInPropertyRecords::arguments.Equals(propertyNameString)) { if (this->HasRestrictedProperties()) { @@ -3107,7 +3082,7 @@ void __cdecl _alloca_probe_16() return false; } } - else if (BuiltInPropertyRecords::length.Equals(propertyName)) + else if (BuiltInPropertyRecords::length.Equals(propertyNameString)) { if (this->IsScriptFunction()) { @@ -3118,7 +3093,7 @@ void __cdecl _alloca_probe_16() BOOL result = DynamicObject::DeleteProperty(propertyNameString, flags); - if (result && (BuiltInPropertyRecords::prototype.Equals(propertyName) || BuiltInPropertyRecords::_symbolHasInstance.Equals(propertyName))) + if (result && (BuiltInPropertyRecords::prototype.Equals(propertyNameString) || BuiltInPropertyRecords::_symbolHasInstance.Equals(propertyNameString))) { InvalidateConstructorCacheOnPrototypeChange(); this->GetScriptContext()->GetThreadContext()->InvalidateIsInstInlineCachesForFunction(this); @@ -3382,7 +3357,7 @@ void __cdecl _alloca_probe_16() && scriptContext == function->GetScriptContext())// only register when function has same scriptContext { inlineCache->Cache(RecyclableObject::Is(instance) ? - RecyclableObject::FromVar(instance)->GetType() : nullptr, + RecyclableObject::UnsafeFromVar(instance)->GetType() : nullptr, function, scriptContext->GetLibrary()->GetFalse(), scriptContext); } return result; @@ -3468,4 +3443,39 @@ void __cdecl _alloca_probe_16() return result; } + +#ifdef ALLOW_JIT_REPRO + Var JavascriptFunction::EntryInvokeJit(RecyclableObject* function, CallInfo callInfo, ...) + { + PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); + + ARGUMENTS(args, callInfo); + ScriptContext* scriptContext = function->GetScriptContext(); + + Assert(!(callInfo.Flags & CallFlags_New)); + + // todo:: make it work with inproc jit + if (!JITManager::GetJITManager()->IsOOPJITEnabled()) + { + Output::Print(_u("Out of proc jit is necessary to repro using an encoded buffer")); + Js::Throw::FatalInternalError(); + } + + if (args.Info.Count < 2 || !ArrayBufferBase::Is(args[1])) + { + JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedArrayBufferObject); + } + + ArrayBufferBase* arrayBuffer = ArrayBufferBase::FromVar(args[1]); + const byte* buffer = arrayBuffer->GetBuffer(); + uint32 size = arrayBuffer->GetByteLength(); + HRESULT hr = JitFromEncodedWorkItem(scriptContext->GetNativeCodeGenerator(), buffer, size); + if (FAILED(hr)) + { + JavascriptExceptionOperators::OP_Throw(JavascriptNumber::New(hr, scriptContext), scriptContext); + } + return scriptContext->GetLibrary()->GetUndefined(); + } +#endif + } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptFunction.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptFunction.h index 5748fd4b4ec..7d92db8608a 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptFunction.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptFunction.h @@ -13,11 +13,20 @@ namespace Js { union { - int retIntVal; - int64 retInt64Val; - float retFloatVal; - double retDoubleVal; - AsmJsSIMDValue retSimdVal; + byte xmm[sizeof(AsmJsSIMDValue)]; + float f32; + double f64; + AsmJsSIMDValue simd; + }; + union + { + int32 i32; + int64 i64; + struct + { + int32 low; + int32 high; + }; }; }; @@ -33,6 +42,8 @@ namespace Js // Need a constructor cache on every function (script and native) to avoid extra checks on the fast path, if the function isn't fixed. Field(ConstructorCache*) constructorCache; + Field(bool) isJsBuiltInCode; + protected: Field(FunctionInfo *) functionInfo; // Underlying function @@ -78,6 +89,9 @@ namespace Js static FunctionInfo SymbolHasInstance; static FunctionInfo NewAsyncFunctionInstance; +#ifdef ALLOW_JIT_REPRO + static FunctionInfo InvokeJit; +#endif }; static const int numberLinesPrependedToAnonymousFunction = 1; @@ -95,16 +109,20 @@ namespace Js static Var NewAsyncFunctionInstance(RecyclableObject* function, CallInfo callInfo, ...); static Var NewAsyncFunctionInstanceRestrictedMode(RecyclableObject* function, CallInfo callInfo, ...); +#ifdef ALLOW_JIT_REPRO + static Var EntryInvokeJit(RecyclableObject* function, CallInfo callInfo, ...); +#endif static bool Is(Var aValue); static JavascriptFunction* FromVar(Var aValue); + static JavascriptFunction* UnsafeFromVar(Var aValue); Var CallFunction(Arguments args); Var CallRootFunction(Arguments args, ScriptContext * scriptContext, bool inScript); #ifdef ASMJS_PLAT template - static T VECTORCALL CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, uint argc, Var * argv); + static T VECTORCALL CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg); + static PossibleAsmJsReturnValues CallAsmJsFunctionX86Thunk(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg); #endif - static PossibleAsmJsReturnValues CallAsmJsFunctionX86Thunk(RecyclableObject * function, JavascriptMethod entryPoint, uint argc, Var * argv); template static Var CalloutHelper(RecyclableObject* function, Var thisArg, Var overridingNewTarget, Var argArray, ScriptContext* scriptContext); @@ -119,11 +137,11 @@ namespace Js static void CheckValidDebugThunk(ScriptContext* scriptContext, RecyclableObject *function); #endif template - static Var CallFunction(RecyclableObject* obj, JavascriptMethod entryPoint, Arguments args); + static Var CallFunction(RecyclableObject* obj, JavascriptMethod entryPoint, Arguments args, bool useLargeArgCount = false); static Var CallRootFunction(RecyclableObject* obj, Arguments args, ScriptContext * scriptContext, bool inScript); static Var CallRootFunctionInternal(RecyclableObject* obj, Arguments args, ScriptContext * scriptContext, bool inScript); static Var CallSpreadFunction(RecyclableObject* obj, Arguments args, const Js::AuxArray *spreadIndices); - static uint32 GetSpreadSize(const Arguments args, const Js::AuxArray *spreadIndices, ScriptContext *scriptContext); + static uint GetSpreadSize(const Arguments args, const Js::AuxArray *spreadIndices, ScriptContext *scriptContext); static void SpreadArgs(const Arguments args, Arguments& destArgs, const Js::AuxArray *spreadIndices, ScriptContext *scriptContext); static Var EntrySpreadCall(const Js::AuxArray *spreadIndices, RecyclableObject* function, CallInfo callInfo, ...); static void CheckAlignment(); @@ -172,6 +190,9 @@ namespace Js virtual inline BOOL IsConstructor() const; bool HasRestrictedProperties() const; + void SetIsJsBuiltInCode(); + bool IsJsBuiltIn(); + ConstructorCache* GetConstructorCache() { Assert(this->constructorCache != nullptr); return this->constructorCache; } ConstructorCache* EnsureValidConstructorCache(); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptGenerator.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptGenerator.cpp index 9e896989cb1..3ee85adaea2 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptGenerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptGenerator.cpp @@ -19,8 +19,11 @@ namespace Js { JavascriptGenerator* obj = RecyclerNewFinalized( recycler, JavascriptGenerator, generatorType, args, scriptFunction); - recycler->RegisterPendingWriteBarrierBlock(obj->args.Values, obj->args.Info.Count * sizeof(Var)); - recycler->RegisterPendingWriteBarrierBlock(&obj->args.Values, sizeof(Var*)); + if (obj->args.Values != nullptr) + { + recycler->RegisterPendingWriteBarrierBlock(obj->args.Values, obj->args.Info.Count * sizeof(Var)); + recycler->RegisterPendingWriteBarrierBlock(&obj->args.Values, sizeof(Var*)); + } return obj; } else @@ -30,12 +33,27 @@ namespace Js } } + JavascriptGenerator *JavascriptGenerator::New(Recycler *recycler, DynamicType *generatorType, Arguments &args, + Js::JavascriptGenerator::GeneratorState generatorState) + { + JavascriptGenerator *obj = JavascriptGenerator::New(recycler, generatorType, args, nullptr); + obj->SetState(generatorState); + return obj; + } + bool JavascriptGenerator::Is(Var var) { return JavascriptOperators::GetTypeId(var) == TypeIds_Generator; } JavascriptGenerator* JavascriptGenerator::FromVar(Var var) + { + AssertOrFailFastMsg(Is(var), "Ensure var is actually a 'JavascriptGenerator'"); + + return static_cast(var); + } + + JavascriptGenerator* JavascriptGenerator::UnsafeFromVar(Var var) { AssertMsg(Is(var), "Ensure var is actually a 'JavascriptGenerator'"); @@ -54,6 +72,15 @@ namespace Js #endif } + void JavascriptGenerator::SetFrameSlots(Js::RegSlot slotCount, Field(Var)* frameSlotArray) + { + AssertMsg(this->frame->GetFunctionBody()->GetLocalsCount() == slotCount, "Unexpected mismatch in frame slot count for generated."); + for (Js::RegSlot i = 0; i < slotCount; i++) + { + this->GetFrame()->m_localSlots[i] = frameSlotArray[i]; + } + } + #if GLOBAL_ENABLE_WRITE_BARRIER void JavascriptGenerator::Finalize(bool isShutdown) { @@ -225,14 +252,155 @@ namespace Js } #if ENABLE_TTD + + void JavascriptGenerator::MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) + { + if (this->scriptFunction != nullptr) + { + extractor->MarkVisitVar(this->scriptFunction); + } + + // frame is null when generator has been completed + if (this->frame != nullptr) + { + // mark slot variables for traversal + Js::RegSlot slotCount = this->frame->GetFunctionBody()->GetLocalsCount(); + for (Js::RegSlot i = 0; i < slotCount; i++) + { + Js::Var curr = this->frame->m_localSlots[i]; + if (curr != nullptr) + { + extractor->MarkVisitVar(curr); + } + } + } + + // args.Values is null when generator has been completed + if (this->args.Values != nullptr) + { + // mark argument variables for traversal + uint32 argCount = this->args.GetArgCountWithExtraArgs(); + for (uint32 i = 0; i < argCount; i++) + { + Js::Var curr = this->args[i]; + if (curr != nullptr) + { + extractor->MarkVisitVar(curr); + } + } + } + } + TTD::NSSnapObjects::SnapObjectType JavascriptGenerator::GetSnapTag_TTD() const { - return TTD::NSSnapObjects::SnapObjectType::Invalid; + return TTD::NSSnapObjects::SnapObjectType::SnapGenerator; } void JavascriptGenerator::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) { - TTDAssert(false, "Invalid -- JavascriptGenerator"); + TTD::NSSnapObjects::SnapGeneratorInfo* gi = alloc.SlabAllocateStruct(); + + // TODO: BUGBUG - figure out how to determine what the prototype was + gi->generatorPrototype = 0; + //if (this->GetPrototype() == this->GetScriptContext()->GetLibrary()->GetNull()) + //{ + // gi->generatorPrototype = 1; + //} + //else if (this->GetType() == this->GetScriptContext()->GetLibrary()->GetGeneratorConstructorPrototypeObjectType()) + //{ + // // check type here, not prototype, since type is static across generators + // gi->generatorPrototype = 2; + //} + //else + //{ + // //TTDAssert(false, "unexpected prototype found JavascriptGenerator"); + //} + + gi->scriptFunction = TTD_CONVERT_VAR_TO_PTR_ID(this->scriptFunction); + gi->state = static_cast(this->state); + + + // grab slot info from InterpreterStackFrame + gi->frame_slotCount = 0; + gi->frame_slotArray = nullptr; + if (this->frame != nullptr) + { + gi->frame_slotCount = this->frame->GetFunctionBody()->GetLocalsCount(); + if (gi->frame_slotCount > 0) + { + gi->frame_slotArray = alloc.SlabAllocateArray(gi->frame_slotCount); + } + for (Js::RegSlot i = 0; i < gi->frame_slotCount; i++) + { + gi->frame_slotArray[i] = this->frame->m_localSlots[i]; + } + } + + // grab arguments + TTD_PTR_ID* depArray = nullptr; + uint32 depCount = 0; + + if (this->args.Values == nullptr) + { + gi->arguments_count = 0; + } + else + { + gi->arguments_count = this->args.GetArgCountWithExtraArgs(); + } + + gi->arguments_values = nullptr; + if (gi->arguments_count > 0) + { + gi->arguments_values = alloc.SlabAllocateArray(gi->arguments_count); + depArray = alloc.SlabReserveArraySpace(gi->arguments_count); + } + + for (uint32 i = 0; i < gi->arguments_count; i++) + { + gi->arguments_values[i] = this->args[i]; + if (gi->arguments_values[i] != nullptr && TTD::JsSupport::IsVarComplexKind(gi->arguments_values[i])) + { + depArray[depCount] = TTD_CONVERT_VAR_TO_PTR_ID(gi->arguments_values[i]); + depCount++; + } + } + + if (depCount > 0) + { + alloc.SlabCommitArraySpace(depCount, gi->arguments_count); + } + else if (gi->arguments_count > 0) + { + alloc.SlabAbortArraySpace(gi->arguments_count); + } + + if (this->frame != nullptr) + { + gi->byteCodeReader_offset = this->frame->GetReader()->GetCurrentOffset(); + } + else + { + gi->byteCodeReader_offset = 0; + } + + // Copy the CallInfo data into the struct + gi->arguments_callInfo_count = this->args.Info.Count; + gi->arguments_callInfo_flags = this->args.Info.Flags; + + // TODO: understand why there's a mis-match between args.Info.Count and GetArgCountWithExtraArgs + // TTDAssert(this->args.Info.Count == gi->arguments_count, "mismatched count between args.Info and GetArgCountWithExtraArgs"); + + if (depCount == 0) + { + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, gi); + } + else + { + TTDAssert(depArray != nullptr, "depArray should be non-null if depCount is > 0"); + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, gi, alloc, depCount, depArray); + } + } #endif } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptGenerator.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptGenerator.h index 0d766003996..a84f9b6f736 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptGenerator.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptGenerator.h @@ -19,7 +19,8 @@ namespace Js class JavascriptGenerator : public DynamicObject { public: - enum class GeneratorState { + enum class GeneratorState + { Suspended, Executing, Completed @@ -29,6 +30,16 @@ namespace Js static uint32 GetCallInfoOffset() { return offsetof(JavascriptGenerator, args) + Arguments::GetCallInfoOffset(); } static uint32 GetArgsPtrOffset() { return offsetof(JavascriptGenerator, args) + Arguments::GetValuesOffset(); } + void SetState(GeneratorState state) { + this->state = state; + if(state == GeneratorState::Completed) + { + frame = nullptr; + args.Values = nullptr; + scriptFunction = nullptr; + } + } + private: Field(InterpreterStackFrame*) frame; Field(GeneratorState) state; @@ -38,30 +49,27 @@ namespace Js DEFINE_VTABLE_CTOR_MEMBER_INIT(JavascriptGenerator, DynamicObject, args); DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptGenerator); - void SetState(GeneratorState state) - { - this->state = state; - if (state == GeneratorState::Completed) - { - frame = nullptr; - args.Values = nullptr; - scriptFunction = nullptr; - } - } - Var CallGenerator(ResumeYieldData* yieldData, const char16* apiNameForErrorMessage); JavascriptGenerator(DynamicType* type, Arguments& args, ScriptFunction* scriptFunction); public: static JavascriptGenerator* New(Recycler* recycler, DynamicType* generatorType, Arguments& args, ScriptFunction* scriptFunction); + static JavascriptGenerator *New(Recycler *recycler, DynamicType *generatorType, Arguments &args, Js::JavascriptGenerator::GeneratorState generatorState); + bool IsExecuting() const { return state == GeneratorState::Executing; } bool IsSuspended() const { return state == GeneratorState::Suspended; } bool IsCompleted() const { return state == GeneratorState::Completed; } bool IsSuspendedStart() const { return state == GeneratorState::Suspended && this->frame == nullptr; } + void SetScriptFunction(ScriptFunction* sf) + { + this->scriptFunction = sf; + } + void SetFrame(InterpreterStackFrame* frame, size_t bytes); InterpreterStackFrame* GetFrame() const { return frame; } + void SetFrameSlots(uint slotCount, Field(Var)* frameSlotArray); #if GLOBAL_ENABLE_WRITE_BARRIER virtual void Finalize(bool isShutdown) override; @@ -71,6 +79,7 @@ namespace Js static bool Is(Var var); static JavascriptGenerator* FromVar(Var var); + static JavascriptGenerator* UnsafeFromVar(Var var); class EntryInfo { @@ -84,8 +93,10 @@ namespace Js static Var EntryThrow(RecyclableObject* function, CallInfo callInfo, ...); #if ENABLE_TTD + virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override; virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override; virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override; + //virtual void ProcessCorePaths() override; #endif }; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptGeneratorFunction.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptGeneratorFunction.cpp index 385906a5d8a..7d4141040e0 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptGeneratorFunction.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptGeneratorFunction.cpp @@ -50,7 +50,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -60,6 +60,13 @@ namespace Js } JavascriptGeneratorFunction* JavascriptGeneratorFunction::FromVar(Var var) + { + AssertOrFailFast(JavascriptGeneratorFunction::Is(var) || JavascriptAsyncFunction::Is(var)); + + return static_cast(var); + } + + JavascriptGeneratorFunction* JavascriptGeneratorFunction::UnsafeFromVar(Var var) { Assert(JavascriptGeneratorFunction::Is(var) || JavascriptAsyncFunction::Is(var)); @@ -70,7 +77,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -80,6 +87,13 @@ namespace Js } JavascriptAsyncFunction* JavascriptAsyncFunction::FromVar(Var var) + { + AssertOrFailFast(JavascriptAsyncFunction::Is(var)); + + return static_cast(var); + } + + JavascriptAsyncFunction* JavascriptAsyncFunction::UnsafeFromVar(Var var) { Assert(JavascriptAsyncFunction::Is(var)); @@ -156,7 +170,6 @@ namespace Js JavascriptPromiseResolveOrRejectFunction* reject; JavascriptPromiseAsyncSpawnExecutorFunction* executor = library->CreatePromiseAsyncSpawnExecutorFunction( - JavascriptPromise::EntryJavascriptPromiseAsyncSpawnExecutorFunction, scriptContext->GetLibrary()->CreateGenerator(heapArgs, JavascriptAsyncFunction::FromVar(function)->GetGeneratorVirtualScriptFunction(), prototype), stackArgs[0]); @@ -433,10 +446,10 @@ namespace Js } if ((propertyRecord->GetPropertyId() == PropertyIds::caller || propertyRecord->GetPropertyId() == PropertyIds::arguments)) - { - // JavascriptFunction has special case for caller and arguments; call DynamicObject:: virtual directly to skip that. - return DynamicObject::GetSetter(propertyNameString, setterValue, info, requestContext); - } + { + // JavascriptFunction has special case for caller and arguments; call DynamicObject:: virtual directly to skip that. + return DynamicObject::GetSetter(propertyNameString, setterValue, info, requestContext); + } } return JavascriptFunction::GetSetter(propertyNameString, setterValue, info, requestContext); @@ -465,13 +478,12 @@ namespace Js BOOL JavascriptGeneratorFunction::DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) { - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (BuiltInPropertyRecords::length.Equals(propertyName)) + if (BuiltInPropertyRecords::length.Equals(propertyNameString)) { return false; } - if (BuiltInPropertyRecords::caller.Equals(propertyName) || BuiltInPropertyRecords::arguments.Equals(propertyName)) + if (BuiltInPropertyRecords::caller.Equals(propertyNameString) || BuiltInPropertyRecords::arguments.Equals(propertyNameString)) { // JavascriptFunction has special case for caller and arguments; call DynamicObject:: virtual directly to skip that. return DynamicObject::DeleteProperty(propertyNameString, flags); @@ -513,37 +525,91 @@ namespace Js } #if ENABLE_TTD + + void JavascriptGeneratorFunction::MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) + { + if (this->scriptFunction != nullptr) + { + extractor->MarkVisitVar(this->scriptFunction); + } + } + TTD::NSSnapObjects::SnapObjectType JavascriptGeneratorFunction::GetSnapTag_TTD() const { - //we override this with invalid to make sure it isn't unexpectedly handled by the parent class - return TTD::NSSnapObjects::SnapObjectType::Invalid; + return TTD::NSSnapObjects::SnapObjectType::SnapGeneratorFunction; } void JavascriptGeneratorFunction::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) { - TTDAssert(false, "Invalid -- JavascriptGeneratorFunction"); + TTD::NSSnapObjects::SnapGeneratorFunctionInfo* fi = nullptr; + uint32 depCount = 0; + TTD_PTR_ID* depArray = nullptr; + + this->CreateSnapObjectInfo(alloc, &fi, &depArray, &depCount); + + if (depCount == 0) + { + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, fi); + } + else + { + TTDAssert(depArray != nullptr, "depArray should be non-null if depCount is > 0"); + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, fi, alloc, depCount, depArray); + } + } + + void JavascriptGeneratorFunction::CreateSnapObjectInfo(TTD::SlabAllocator& alloc, _Out_ TTD::NSSnapObjects::SnapGeneratorFunctionInfo** info, _Out_ TTD_PTR_ID** depArray, _Out_ uint32* depCount) + { + *info = alloc.SlabAllocateStruct(); + (*info)->scriptFunction = TTD_CONVERT_VAR_TO_PTR_ID(this->scriptFunction); + (*info)->isAnonymousFunction = this->scriptFunction->IsAnonymousFunction(); + + *depCount = 0; + *depArray = nullptr; + if (this->scriptFunction != nullptr && TTD::JsSupport::IsVarComplexKind(this->scriptFunction)) + { + *depArray = alloc.SlabReserveArraySpace(1); + (*depArray)[*depCount] = TTD_CONVERT_VAR_TO_PTR_ID(this->scriptFunction); + *depCount = 1; + alloc.SlabCommitArraySpace(*depCount, 1); + } } TTD::NSSnapObjects::SnapObjectType JavascriptAsyncFunction::GetSnapTag_TTD() const { - //we override this with invalid to make sure it isn't unexpectedly handled by the parent class - return TTD::NSSnapObjects::SnapObjectType::Invalid; + return TTD::NSSnapObjects::SnapObjectType::SnapAsyncFunction; } void JavascriptAsyncFunction::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) { - TTDAssert(false, "Invalid -- JavascriptAsyncFunction"); + TTD::NSSnapObjects::SnapGeneratorFunctionInfo* fi = nullptr; + uint32 depCount = 0; + TTD_PTR_ID* depArray = nullptr; + + this->CreateSnapObjectInfo(alloc, &fi, &depArray, &depCount); + + if (depCount == 0) + { + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, fi); + } + else + { + TTDAssert(depArray != nullptr, "depArray should be non-null if depCount is > 0"); + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, fi, alloc, depCount, depArray); + } } TTD::NSSnapObjects::SnapObjectType GeneratorVirtualScriptFunction::GetSnapTag_TTD() const { - //we override this with invalid to make sure it isn't unexpectedly handled by the parent class - return TTD::NSSnapObjects::SnapObjectType::Invalid; + return TTD::NSSnapObjects::SnapObjectType::SnapGeneratorVirtualScriptFunction; } void GeneratorVirtualScriptFunction::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) { - TTDAssert(false, "Invalid -- GeneratorVirtualScriptFunction"); + TTD::NSSnapObjects::SnapGeneratorVirtualScriptFunctionInfo* fi = alloc.SlabAllocateStruct(); + ScriptFunction::ExtractSnapObjectDataIntoSnapScriptFunctionInfo(fi, alloc); + fi->realFunction = TTD_CONVERT_VAR_TO_PTR_ID(this->realFunction); + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, fi); } #endif } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptGeneratorFunction.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptGeneratorFunction.h index 52a6bd3ce27..65b60e53cae 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptGeneratorFunction.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptGeneratorFunction.h @@ -21,21 +21,22 @@ namespace Js DEFINE_VTABLE_CTOR(JavascriptGeneratorFunction, ScriptFunctionBase); DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptGeneratorFunction); - JavascriptGeneratorFunction(DynamicType* type); JavascriptGeneratorFunction(DynamicType* type, FunctionInfo* functionInfo, GeneratorVirtualScriptFunction* scriptFunction); public: JavascriptGeneratorFunction(DynamicType* type, GeneratorVirtualScriptFunction* scriptFunction); + JavascriptGeneratorFunction(DynamicType* type); virtual JavascriptString* GetDisplayNameImpl() const override; GeneratorVirtualScriptFunction* GetGeneratorVirtualScriptFunction() { return scriptFunction; } static JavascriptGeneratorFunction* FromVar(Var var); + static JavascriptGeneratorFunction* UnsafeFromVar(Var var); static bool Is(Var var); inline static bool Test(JavascriptFunction *obj) { return VirtualTableInfo::HasVirtualTable(obj) - || VirtualTableInfo>::HasVirtualTable(obj); + || VirtualTableInfo>::HasVirtualTable(obj); } static JavascriptGeneratorFunction* OP_NewScGenFunc(FrameDisplay* environment, FunctionInfoPtrPtr infoRef); @@ -43,6 +44,10 @@ namespace Js static Var EntryAsyncFunctionImplementation(RecyclableObject* function, CallInfo callInfo, ...); static DWORD GetOffsetOfScriptFunction() { return offsetof(JavascriptGeneratorFunction, scriptFunction); } + void SetScriptFunction(GeneratorVirtualScriptFunction* scriptFunction) { + this->scriptFunction = scriptFunction; + } + virtual Var GetHomeObj() const override; virtual void SetHomeObj(Var homeObj) override; virtual void SetComputedNameVar(Var computedNameVar) override; @@ -82,8 +87,10 @@ namespace Js static Var NewInstanceRestrictedMode(RecyclableObject* function, CallInfo callInfo, ...); #if ENABLE_TTD + virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override; virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override; virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override; + void CreateSnapObjectInfo(TTD::SlabAllocator& alloc, _Out_ TTD::NSSnapObjects::SnapGeneratorFunctionInfo** info, _Out_ TTD_PTR_ID** depArray, _Out_ uint32* depCount); #endif public: @@ -111,11 +118,12 @@ namespace Js static DWORD GetOffsetOfScriptFunction() { return JavascriptGeneratorFunction::GetOffsetOfScriptFunction(); } static JavascriptAsyncFunction* FromVar(Var var); + static JavascriptAsyncFunction* UnsafeFromVar(Var var); static bool Is(Var var); inline static bool Test(JavascriptFunction *obj) { return VirtualTableInfo::HasVirtualTable(obj) - || VirtualTableInfo>::HasVirtualTable(obj); + || VirtualTableInfo>::HasVirtualTable(obj); } #if ENABLE_TTD @@ -138,14 +146,13 @@ namespace Js Field(JavascriptGeneratorFunction*) realFunction; - void SetRealGeneratorFunction(JavascriptGeneratorFunction* realFunction) { this->realFunction = realFunction; } - public: GeneratorVirtualScriptFunction(FunctionProxy* proxy, ScriptFunctionType* deferredPrototypeType) : ScriptFunction(proxy, deferredPrototypeType) { } static uint32 GetRealFunctionOffset() { return offsetof(GeneratorVirtualScriptFunction, realFunction); } virtual JavascriptFunction* GetRealFunctionObject() override { return realFunction; } + void SetRealGeneratorFunction(JavascriptGeneratorFunction* realFunction) { this->realFunction = realFunction; } #if ENABLE_TTD virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.cpp index a8101441ea4..c875bc97560 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.cpp @@ -18,6 +18,9 @@ #include "Library/ForInObjectEnumerator.h" #include "Library/EngineInterfaceObject.h" #include "Library/IntlEngineInterfaceExtensionObject.h" +#ifdef ENABLE_JS_BUILTINS +#include "Library/JsBuiltInEngineInterfaceExtensionObject.h" +#endif #include "Library/ThrowErrorObject.h" #include "Library/StackScriptFunction.h" @@ -87,6 +90,8 @@ namespace Js InitializeStaticValues(); PrecalculateArrayAllocationBuckets(); + this->cache.toStringTagCache = ScriptContextPolymorphicInlineCache::New(32, this); + #if ENABLE_COPYONACCESS_ARRAY if (!PHASE_OFF1(CopyOnAccessArrayPhase)) { @@ -349,9 +354,13 @@ namespace Js DynamicType::New(scriptContext, TypeIds_Object, objectPrototype, nullptr, DeferredTypeHandler::GetDefaultInstance())); - arrayIteratorPrototype = DynamicObject::New(recycler, - DynamicType::New(scriptContext, TypeIds_Object, iteratorPrototype, nullptr, - DeferredTypeHandler::GetDefaultInstance())); + if (!scriptContext->IsJsBuiltInEnabled()) + { + arrayIteratorPrototype = DynamicObject::New(recycler, + DynamicType::New(scriptContext, TypeIds_Object, iteratorPrototype, nullptr, + DeferredTypeHandler::GetDefaultInstance())); + } + mapIteratorPrototype = DynamicObject::New(recycler, DynamicType::New(scriptContext, TypeIds_Object, iteratorPrototype, nullptr, DeferredTypeHandler::GetDefaultInstance())); @@ -423,7 +432,7 @@ namespace Js #define INIT_SIMPLE_TYPE(field, typeId, prototype) \ field = DynamicType::New(scriptContext, typeId, prototype, nullptr, \ - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true) + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true) INIT_SIMPLE_TYPE(activationObjectType, TypeIds_ActivationObject, nullValue); INIT_SIMPLE_TYPE(arrayType, TypeIds_Array, arrayPrototype); @@ -521,7 +530,7 @@ namespace Js // Initialize Date types dateType = DynamicType::New(scriptContext, TypeIds_Date, datePrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); variantDateType = StaticType::New(scriptContext, TypeIds_VariantDate, nullValue, nullptr); anonymousFunctionTypeHandler = NullTypeHandler::GetDefaultInstance(); @@ -565,7 +574,7 @@ namespace Js else { boundFunctionType = DynamicType::New(scriptContext, TypeIds_Function, functionPrototype, BoundFunction::NewInstance, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); } crossSiteDeferredPrototypeFunctionType = CreateDeferredPrototypeFunctionTypeNoProfileThunk( scriptContext->CurrentCrossSiteThunk, true /*isShared*/); @@ -626,8 +635,8 @@ namespace Js // Initialize Object types for (int16 i = 0; i < PreInitializedObjectTypeCount; i++) { - SimplePathTypeHandler * typeHandler = - SimplePathTypeHandler::New( + SimplePathTypeHandlerNoAttr * typeHandler = + SimplePathTypeHandlerNoAttr::New( scriptContext, this->GetRootPath(), 0, @@ -640,8 +649,8 @@ namespace Js } for (int16 i = 0; i < PreInitializedObjectTypeCount; i++) { - SimplePathTypeHandler * typeHandler = - SimplePathTypeHandler::New( + SimplePathTypeHandlerNoAttr * typeHandler = + SimplePathTypeHandlerNoAttr::New( scriptContext, this->GetRootPath(), 0, @@ -654,12 +663,15 @@ namespace Js DynamicType::New(scriptContext, TypeIds_Object, objectPrototype, nullptr, typeHandler, true, true); } + SimplePathTypeHandlerNoAttr * typeHandler = SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true); + nullPrototypeObjectType = DynamicType::New(scriptContext, TypeIds_Object, nullValue, nullptr, typeHandler, true, true); + // Initialize regex types TypePath *const regexResultPath = TypePath::New(recycler); regexResultPath->Add(BuiltInPropertyRecords::input); regexResultPath->Add(BuiltInPropertyRecords::index); regexResultType = DynamicType::New(scriptContext, TypeIds_Array, arrayPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, regexResultPath, regexResultPath->GetPathLength(), JavascriptRegularExpressionResult::InlineSlotCount, sizeof(JavascriptArray), true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, regexResultPath, regexResultPath->GetPathLength(), JavascriptRegularExpressionResult::InlineSlotCount, sizeof(JavascriptArray), true, true), true, true); // Initialize string types // static type is handled under StringCache.h @@ -669,33 +681,33 @@ namespace Js throwErrorObjectType = StaticType::New(scriptContext, TypeIds_Undefined, nullValue, ThrowErrorObject::DefaultEntryPoint); mapType = DynamicType::New(scriptContext, TypeIds_Map, mapPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); setType = DynamicType::New(scriptContext, TypeIds_Set, setPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); weakMapType = DynamicType::New(scriptContext, TypeIds_WeakMap, weakMapPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); weakSetType = DynamicType::New(scriptContext, TypeIds_WeakSet, weakSetPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); TypePath *const iteratorResultPath = TypePath::New(recycler); iteratorResultPath->Add(BuiltInPropertyRecords::value); iteratorResultPath->Add(BuiltInPropertyRecords::done); iteratorResultType = DynamicType::New(scriptContext, TypeIds_Object, objectPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, iteratorResultPath, iteratorResultPath->GetPathLength(), 2, sizeof(DynamicObject), true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, iteratorResultPath, iteratorResultPath->GetPathLength(), 2, sizeof(DynamicObject), true, true), true, true); arrayIteratorType = DynamicType::New(scriptContext, TypeIds_ArrayIterator, arrayIteratorPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); mapIteratorType = DynamicType::New(scriptContext, TypeIds_MapIterator, mapIteratorPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); setIteratorType = DynamicType::New(scriptContext, TypeIds_SetIterator, setIteratorPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); stringIteratorType = DynamicType::New(scriptContext, TypeIds_StringIterator, stringIteratorPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); listIteratorType = DynamicType::New(scriptContext, TypeIds_ListIterator, iteratorPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); if (config->IsES6GeneratorsEnabled()) { @@ -707,10 +719,10 @@ namespace Js #ifdef ENABLE_DEBUG_CONFIG_OPTIONS debugDisposableObjectType = DynamicType::New(scriptContext, TypeIds_Object, objectPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); debugFuncExecutorInDisposeObjectType = DynamicType::New(scriptContext, TypeIds_Object, objectPrototype, nullptr, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); #endif } @@ -1164,25 +1176,25 @@ namespace Js if (scriptContext->GetConfig()->IsErrorStackTraceEnabled()) { stackTraceAccessorFunction = CreateNonProfiledFunction(&JavascriptExceptionOperators::EntryInfo::StackTraceAccessor); - stackTraceAccessorFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone, nullptr); + stackTraceAccessorFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable, nullptr); } throwTypeErrorRestrictedPropertyAccessorFunction = CreateNonProfiledFunction(&JavascriptExceptionOperators::EntryInfo::ThrowTypeErrorRestrictedPropertyAccessor); - throwTypeErrorRestrictedPropertyAccessorFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone, nullptr); + throwTypeErrorRestrictedPropertyAccessorFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable, nullptr); __proto__getterFunction = CreateNonProfiledFunction(&ObjectPrototypeObject::EntryInfo::__proto__getter); - __proto__getterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone, nullptr); + __proto__getterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable, nullptr); __proto__setterFunction = CreateNonProfiledFunction(&ObjectPrototypeObject::EntryInfo::__proto__setter); - __proto__setterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone, nullptr); + __proto__setterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable, nullptr); if (scriptContext->GetConfig()->IsES6PromiseEnabled()) { identityFunction = CreateNonProfiledFunction(&JavascriptPromise::EntryInfo::Identity); - identityFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone, nullptr); + identityFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable, nullptr); throwerFunction = CreateNonProfiledFunction(&JavascriptPromise::EntryInfo::Thrower); - throwerFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone, nullptr); + throwerFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable, nullptr); } booleanTrue = RecyclerNew(recycler, JavascriptBoolean, true, booleanTypeStatic); @@ -1424,7 +1436,7 @@ namespace Js } #endif -#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_PROJECTION) +#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS) || defined(ENABLE_PROJECTION) engineInterfaceObject = EngineInterfaceObject::New(recycler, DynamicType::New(scriptContext, TypeIds_EngineInterfaceObject, objectPrototype, nullptr, DeferredTypeHandler::GetDefaultInstance())); @@ -1433,6 +1445,20 @@ namespace Js IntlEngineInterfaceExtensionObject* intlExtension = RecyclerNew(recycler, IntlEngineInterfaceExtensionObject, scriptContext); engineInterfaceObject->SetEngineExtension(EngineInterfaceExtensionKind_Intl, intlExtension); #endif + +#ifdef ENABLE_JS_BUILTINS + chakraLibraryObject = DynamicObject::New(recycler, + DynamicType::New(scriptContext, TypeIds_Object, objectPrototype, nullptr, + DeferredTypeHandler::GetDefaultInstance())); + if (CONFIG_FLAG(LdChakraLib)) { + AddMember(globalObject, PropertyIds::__chakraLibrary, chakraLibraryObject); + } + + JsBuiltInEngineInterfaceExtensionObject* builtInExtension = RecyclerNew(recycler, JsBuiltInEngineInterfaceExtensionObject, scriptContext); + engineInterfaceObject->SetEngineExtension(EngineInterfaceExtensionKind_JsBuiltIn, builtInExtension); + this->isArrayFunction = this->DefaultCreateFunction(&JavascriptArray::EntryInfo::IsArray, 1, nullptr, nullptr, PropertyIds::isArray); +#endif + #endif mapConstructor = CreateBuiltinConstructor(&JavascriptMap::EntryInfo::NewInstance, @@ -1565,10 +1591,10 @@ namespace Js Assert(funcSetter); debugObjectNonUserGetterFunction = CreateNonProfiledFunction(funcGetter); - debugObjectNonUserGetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone, nullptr); + debugObjectNonUserGetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable, nullptr); debugObjectNonUserSetterFunction = CreateNonProfiledFunction(funcSetter); - debugObjectNonUserSetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone, nullptr); + debugObjectNonUserSetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable, nullptr); } #ifdef ENABLE_DEBUG_CONFIG_OPTIONS @@ -1578,10 +1604,10 @@ namespace Js Assert(funcSetter); debugObjectFaultInjectionCookieGetterFunction = CreateNonProfiledFunction(funcGetter); - debugObjectFaultInjectionCookieGetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone, nullptr); + debugObjectFaultInjectionCookieGetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable, nullptr); debugObjectFaultInjectionCookieSetterFunction = CreateNonProfiledFunction(funcSetter); - debugObjectFaultInjectionCookieSetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone, nullptr); + debugObjectFaultInjectionCookieSetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable, nullptr); } #endif @@ -1590,7 +1616,7 @@ namespace Js Assert(funcGetter); debugObjectDebugModeGetterFunction = CreateNonProfiledFunction(funcGetter); - debugObjectDebugModeGetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone, nullptr); + debugObjectDebugModeGetterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable, nullptr); } bool JavascriptLibrary::InitializeArrayConstructor(DynamicObject* arrayConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode) @@ -1602,7 +1628,7 @@ namespace Js JavascriptLibrary* library = arrayConstructor->GetLibrary(); Field(JavascriptFunction*)* builtinFuncs = library->GetBuiltinFunctions(); - library->AddMember(arrayConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(arrayConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); library->AddMember(arrayConstructor, PropertyIds::prototype, scriptContext->GetLibrary()->arrayPrototype, PropertyNone); library->AddSpeciesAccessorsToLibraryObject(arrayConstructor, &JavascriptArray::EntryInfo::GetterSymbolSpecies); @@ -1610,7 +1636,13 @@ namespace Js { library->AddMember(arrayConstructor, PropertyIds::name, scriptContext->GetPropertyString(PropertyIds::Array), PropertyConfigurable); } - builtinFuncs[BuiltinFunction::JavascriptArray_IsArray] = library->AddFunctionToLibraryObject(arrayConstructor, PropertyIds::isArray, &JavascriptArray::EntryInfo::IsArray, 1); + +#ifdef ENABLE_JS_BUILTINS + builtinFuncs[BuiltinFunction::JavascriptArray_IsArray] = library->isArrayFunction; + library->AddMember(arrayConstructor, PropertyIds::isArray, library->isArrayFunction); +#else + library->AddFunctionToLibraryObject(arrayConstructor, PropertyIds::isArray, &JavascriptArray::EntryInfo::IsArray, 1); +#endif library->AddFunctionToLibraryObject(arrayConstructor, PropertyIds::from, &JavascriptArray::EntryInfo::From, 1); library->AddFunctionToLibraryObject(arrayConstructor, PropertyIds::of, &JavascriptArray::EntryInfo::Of, 0); @@ -1622,6 +1654,19 @@ namespace Js return true; } + bool JavascriptLibrary::IsDefaultArrayValuesFunction(RecyclableObject * function, ScriptContext *scriptContext) + { +#ifdef ENABLE_JS_BUILTINS + if (scriptContext->IsJsBuiltInEnabled()) + { + scriptContext->GetLibrary()->EnsureBuiltInEngineIsReady(); + return JavascriptFunction::Is(function) && JavascriptFunction::FromVar(function)->IsJsBuiltIn(); + } +#endif + JavascriptMethod method = function->GetEntryPoint(); + return method == JavascriptArray::EntryInfo::Values.GetOriginalEntryPoint(); + } + JavascriptFunction* JavascriptLibrary::EnsureArrayPrototypeForEachFunction() { if (arrayPrototypeForEachFunction == nullptr) @@ -1636,9 +1681,19 @@ namespace Js { if (arrayPrototypeKeysFunction == nullptr) { +#ifndef ENABLE_JS_BUILTINS arrayPrototypeKeysFunction = DefaultCreateFunction(&JavascriptArray::EntryInfo::Keys, 0, nullptr, nullptr, PropertyIds::keys); +#else + if (!scriptContext->IsJsBuiltInEnabled()) + { + arrayPrototypeKeysFunction = DefaultCreateFunction(&JavascriptArray::EntryInfo::Keys, 0, nullptr, nullptr, PropertyIds::keys); + } + else + { + this->EnsureBuiltInEngineIsReady(); + } +#endif } - return arrayPrototypeKeysFunction; } @@ -1646,9 +1701,19 @@ namespace Js { if (arrayPrototypeValuesFunction == nullptr) { +#ifndef ENABLE_JS_BUILTINS arrayPrototypeValuesFunction = DefaultCreateFunction(&JavascriptArray::EntryInfo::Values, 0, nullptr, nullptr, PropertyIds::values); +#else + if (!scriptContext->IsJsBuiltInEnabled()) + { + arrayPrototypeValuesFunction = DefaultCreateFunction(&JavascriptArray::EntryInfo::Values, 0, nullptr, nullptr, PropertyIds::values); + } + else + { + this->EnsureBuiltInEngineIsReady(); + } +#endif } - return arrayPrototypeValuesFunction; } @@ -1656,9 +1721,19 @@ namespace Js { if (arrayPrototypeEntriesFunction == nullptr) { +#ifndef ENABLE_JS_BUILTINS arrayPrototypeEntriesFunction = DefaultCreateFunction(&JavascriptArray::EntryInfo::Entries, 0, nullptr, nullptr, PropertyIds::entries); +#else + if (!scriptContext->IsJsBuiltInEnabled()) + { + arrayPrototypeEntriesFunction = DefaultCreateFunction(&JavascriptArray::EntryInfo::Entries, 0, nullptr, nullptr, PropertyIds::entries); + } + else + { + this->EnsureBuiltInEngineIsReady(); + } +#endif } - return arrayPrototypeEntriesFunction; } @@ -1670,6 +1745,7 @@ namespace Js ScriptContext* scriptContext = arrayPrototype->GetScriptContext(); JavascriptLibrary* library = arrayPrototype->GetLibrary(); + library->AddMember(arrayPrototype, PropertyIds::constructor, library->arrayConstructor); Field(JavascriptFunction*)* builtinFuncs = library->GetBuiltinFunctions(); @@ -1702,9 +1778,8 @@ namespace Js } builtinFuncs[BuiltinFunction::JavascriptArray_Unshift] = library->AddFunctionToLibraryObject(arrayPrototype, PropertyIds::unshift, &JavascriptArray::EntryInfo::Unshift, 1); + builtinFuncs[BuiltinFunction::JavascriptArray_IndexOf] = library->AddFunctionToLibraryObject(arrayPrototype, PropertyIds::indexOf, &JavascriptArray::EntryInfo::IndexOf, 1); - - builtinFuncs[BuiltinFunction::JavascriptArray_IndexOf] = library->AddFunctionToLibraryObject(arrayPrototype, PropertyIds::indexOf, &JavascriptArray::EntryInfo::IndexOf, 1); /* No inlining Array_Every */ library->AddFunctionToLibraryObject(arrayPrototype, PropertyIds::every, &JavascriptArray::EntryInfo::Every, 1); /* No inlining Array_Filter */ library->AddFunctionToLibraryObject(arrayPrototype, PropertyIds::filter, &JavascriptArray::EntryInfo::Filter, 1); @@ -1723,6 +1798,7 @@ namespace Js /* No inlining Array_FindIndex */ library->AddFunctionToLibraryObject(arrayPrototype, PropertyIds::findIndex, &JavascriptArray::EntryInfo::FindIndex, 1); } +#ifndef ENABLE_JS_BUILTINS /* No inlining Array_Entries */ library->AddMember(arrayPrototype, PropertyIds::entries, library->EnsureArrayPrototypeEntriesFunction()); @@ -1732,6 +1808,25 @@ namespace Js JavascriptFunction *values = library->EnsureArrayPrototypeValuesFunction(); /* No inlining Array_Values */ library->AddMember(arrayPrototype, PropertyIds::values, values); /* No inlining Array_SymbolIterator */ library->AddMember(arrayPrototype, PropertyIds::_symbolIterator, values); +#else + if (!scriptContext->IsJsBuiltInEnabled()) + { + /* No inlining Array_Entries */ + library->AddMember(arrayPrototype, PropertyIds::entries, library->EnsureArrayPrototypeEntriesFunction()); + + /* No inlining Array_Keys */ + library->AddMember(arrayPrototype, PropertyIds::keys, library->EnsureArrayPrototypeKeysFunction()); + + JavascriptFunction *values = library->EnsureArrayPrototypeValuesFunction(); + /* No inlining Array_Values */ library->AddMember(arrayPrototype, PropertyIds::values, values); + /* No inlining Array_SymbolIterator */ library->AddMember(arrayPrototype, PropertyIds::_symbolIterator, values); + } + else + { + library->EnsureBuiltInEngineIsReady(); + } + +#endif if (scriptContext->GetConfig()->IsES6UnscopablesEnabled()) { @@ -1766,7 +1861,7 @@ namespace Js ScriptContext* scriptContext = sharedArrayBufferConstructor->GetScriptContext(); JavascriptLibrary* library = sharedArrayBufferConstructor->GetLibrary(); - library->AddMember(sharedArrayBufferConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(sharedArrayBufferConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); library->AddMember(sharedArrayBufferConstructor, PropertyIds::prototype, scriptContext->GetLibrary()->sharedArrayBufferPrototype, PropertyNone); library->AddSpeciesAccessorsToLibraryObject(sharedArrayBufferConstructor, &SharedArrayBuffer::EntryInfo::GetterSymbolSpecies); @@ -1835,7 +1930,7 @@ namespace Js ScriptContext* scriptContext = arrayBufferConstructor->GetScriptContext(); JavascriptLibrary* library = arrayBufferConstructor->GetLibrary(); - library->AddMember(arrayBufferConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(arrayBufferConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); library->AddMember(arrayBufferConstructor, PropertyIds::prototype, scriptContext->GetLibrary()->arrayBufferPrototype, PropertyNone); library->AddSpeciesAccessorsToLibraryObject(arrayBufferConstructor, &ArrayBuffer::EntryInfo::GetterSymbolSpecies); @@ -1845,11 +1940,9 @@ namespace Js } library->AddFunctionToLibraryObject(arrayBufferConstructor, PropertyIds::isView, &ArrayBuffer::EntryInfo::IsView, 1); - if (scriptContext->GetConfig()->IsArrayBufferTransferEnabled()) - { - library->AddFunctionToLibraryObject(arrayBufferConstructor, PropertyIds::transfer, &ArrayBuffer::EntryInfo::Transfer, 2); - } - +#if ENABLE_DEBUG_CONFIG_OPTIONS + library->AddFunctionToLibraryObject(arrayBufferConstructor, PropertyIds::detach, &ArrayBuffer::EntryInfo::Detach, 1); +#endif arrayBufferConstructor->SetHasNoEnumerableProperties(true); return true; @@ -1882,7 +1975,7 @@ namespace Js ScriptContext* scriptContext = dataViewConstructor->GetScriptContext(); JavascriptLibrary* library = dataViewConstructor->GetLibrary(); - library->AddMember(dataViewConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(dataViewConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(3), PropertyConfigurable); library->AddMember(dataViewConstructor, PropertyIds::prototype, scriptContext->GetLibrary()->dataViewPrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -1900,14 +1993,14 @@ namespace Js ScriptContext* scriptContext = dataViewPrototype->GetScriptContext(); JavascriptLibrary* library = dataViewPrototype->GetLibrary(); library->AddMember(dataViewPrototype, PropertyIds::constructor, library->dataViewConstructor); - library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setInt8, &DataView::EntryInfo::SetInt8, 1); - library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setUint8, &DataView::EntryInfo::SetUint8, 1); - library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setInt16, &DataView::EntryInfo::SetInt16, 1); - library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setUint16, &DataView::EntryInfo::SetUint16, 1); - library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setInt32, &DataView::EntryInfo::SetInt32, 1); - library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setUint32, &DataView::EntryInfo::SetUint32, 1); - library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setFloat32, &DataView::EntryInfo::SetFloat32, 1); - library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setFloat64, &DataView::EntryInfo::SetFloat64, 1); + library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setInt8, &DataView::EntryInfo::SetInt8, 2); + library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setUint8, &DataView::EntryInfo::SetUint8, 2); + library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setInt16, &DataView::EntryInfo::SetInt16, 2); + library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setUint16, &DataView::EntryInfo::SetUint16, 2); + library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setInt32, &DataView::EntryInfo::SetInt32, 2); + library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setUint32, &DataView::EntryInfo::SetUint32, 2); + library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setFloat32, &DataView::EntryInfo::SetFloat32, 2); + library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::setFloat64, &DataView::EntryInfo::SetFloat64, 2); library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::getInt8, &DataView::EntryInfo::GetInt8, 1); library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::getUint8, &DataView::EntryInfo::GetUint8, 1); library->AddFunctionToLibraryObject(dataViewPrototype, PropertyIds::getInt16, &DataView::EntryInfo::GetInt16, 1); @@ -1938,7 +2031,7 @@ namespace Js ScriptContext* scriptContext = typedArrayConstructor->GetScriptContext(); JavascriptLibrary* library = typedArrayConstructor->GetLibrary(); - library->AddMember(typedArrayConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(3), PropertyNone); + library->AddMember(typedArrayConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(3), PropertyConfigurable); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { library->AddMember(typedArrayConstructor, PropertyIds::name, library->CreateStringFromCppLiteral(_u("TypedArray")), PropertyConfigurable); @@ -1961,6 +2054,13 @@ namespace Js ScriptContext* scriptContext = typedarrayPrototype->GetScriptContext(); JavascriptLibrary* library = typedarrayPrototype->GetLibrary(); +#ifdef ENABLE_JS_BUILTINS + if (scriptContext->IsJsBuiltInEnabled()) + { + library->EnsureBuiltInEngineIsReady(); + } +#endif + library->AddMember(typedarrayPrototype, PropertyIds::constructor, library->typedArrayConstructor); library->AddFunctionToLibraryObject(typedarrayPrototype, PropertyIds::set, &TypedArrayBase::EntryInfo::Set, 2); library->AddFunctionToLibraryObject(typedarrayPrototype, PropertyIds::subarray, &TypedArrayBase::EntryInfo::Subarray, 2); @@ -2029,7 +2129,7 @@ namespace Js typeHandler->Convert(typedArrayConstructor, mode, 4); \ ScriptContext* scriptContext = typedArrayConstructor->GetScriptContext(); \ JavascriptLibrary* library = typedArrayConstructor->GetLibrary(); \ - library->AddMember(typedArrayConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(3), PropertyNone); \ + library->AddMember(typedArrayConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(3), PropertyConfigurable); \ if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) \ { \ library->AddMember(typedArrayConstructor, PropertyIds::name, library->CreateStringFromCppLiteral(_u(#typedArray)), PropertyConfigurable); \ @@ -2096,7 +2196,7 @@ namespace Js JavascriptLibrary* library = constructor->GetLibrary(); library->AddMember(constructor, PropertyIds::prototype, library->errorPrototype, PropertyNone); - library->AddMember(constructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(constructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -2139,7 +2239,7 @@ namespace Js ScriptContext* scriptContext = constructor->GetScriptContext(); \ JavascriptLibrary* library = constructor->GetLibrary(); \ library->AddMember(constructor, PropertyIds::prototype, library->Get##error##Prototype(), PropertyNone); \ - library->AddMember(constructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); \ + library->AddMember(constructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); \ if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) \ { \ PropertyAttributes prototypeNameMessageAttributes = PropertyConfigurable; \ @@ -2182,7 +2282,7 @@ namespace Js // so that the update is in sync with profiler ScriptContext* scriptContext = booleanConstructor->GetScriptContext(); JavascriptLibrary* library = booleanConstructor->GetLibrary(); - library->AddMember(booleanConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(booleanConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); library->AddMember(booleanConstructor, PropertyIds::prototype, library->booleanPrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -2218,7 +2318,7 @@ namespace Js // so that the update is in sync with profiler JavascriptLibrary* library = symbolConstructor->GetLibrary(); ScriptContext* scriptContext = symbolConstructor->GetScriptContext(); - library->AddMember(symbolConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone); + library->AddMember(symbolConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable); library->AddMember(symbolConstructor, PropertyIds::prototype, library->symbolPrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -2303,7 +2403,7 @@ namespace Js // so that the update is in sync with profiler JavascriptLibrary* library = promiseConstructor->GetLibrary(); ScriptContext* scriptContext = promiseConstructor->GetScriptContext(); - library->AddMember(promiseConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(promiseConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); library->AddMember(promiseConstructor, PropertyIds::prototype, library->promisePrototype, PropertyNone); library->AddSpeciesAccessorsToLibraryObject(promiseConstructor, &JavascriptPromise::EntryInfo::GetterSymbolSpecies); @@ -2406,11 +2506,10 @@ namespace Js ScriptContext* scriptContext = library->GetScriptContext(); library->AddMember(generatorPrototype, PropertyIds::constructor, library->generatorFunctionPrototype, PropertyConfigurable); - if (scriptContext->GetConfig()->IsES6ToStringTagEnabled()) - { + if (scriptContext->GetConfig()->IsES6ToStringTagEnabled()) { library->AddMember(generatorPrototype, PropertyIds::_symbolToStringTag, library->CreateStringFromCppLiteral(_u("Generator")), PropertyConfigurable); } - library->AddFunctionToLibraryObject(generatorPrototype, PropertyIds::return_, &JavascriptGenerator::EntryInfo::Return, 1); + library->AddMember(generatorPrototype, PropertyIds::return_, library->EnsureGeneratorReturnFunction(), PropertyBuiltInMethodDefaults); library->AddMember(generatorPrototype, PropertyIds::next, library->EnsureGeneratorNextFunction(), PropertyBuiltInMethodDefaults); library->AddMember(generatorPrototype, PropertyIds::throw_, library->EnsureGeneratorThrowFunction(), PropertyBuiltInMethodDefaults); @@ -2419,6 +2518,15 @@ namespace Js return true; } + JavascriptFunction* JavascriptLibrary::EnsureGeneratorReturnFunction() + { + if (generatorReturnFunction == nullptr) + { + generatorReturnFunction = DefaultCreateFunction(&JavascriptGenerator::EntryInfo::Return, 1, nullptr, nullptr, PropertyIds::return_); + } + return generatorReturnFunction; + } + JavascriptFunction* JavascriptLibrary::EnsureGeneratorNextFunction() { if (generatorNextFunction == nullptr) @@ -2508,7 +2616,7 @@ namespace Js // so that the update is in sync with profiler JavascriptLibrary* library = dateConstructor->GetLibrary(); ScriptContext* scriptContext = dateConstructor->GetScriptContext(); - library->AddMember(dateConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(7), PropertyNone); + library->AddMember(dateConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(7), PropertyConfigurable); library->AddMember(dateConstructor, PropertyIds::prototype, library->datePrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -2659,6 +2767,13 @@ namespace Js } functionConstructor->SetHasNoEnumerableProperties(true); +#ifdef ALLOW_JIT_REPRO + if (CONFIG_FLAG(JitRepro)) + { + library->AddFunctionToLibraryObject(functionConstructor, PropertyIds::invokeJit, &JavascriptFunction::EntryInfo::InvokeJit, 1); + } +#endif + return true; } @@ -2724,8 +2839,8 @@ namespace Js DeferredTypeHandler::GetDefaultInstance())); } - SimplePathTypeHandler *typeHandler = - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true); + SimplePathTypeHandlerNoAttr *typeHandler = + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true); // See JavascriptRegExp::IsWritable for property writability if (!scriptConfig->IsES6RegExPrototypePropertiesEnabled()) { @@ -3542,7 +3657,7 @@ namespace Js defaultPropertyDescriptor.SetEnumerable(false); defaultPropertyDescriptor.SetConfigurable(false); -#if !defined(_M_X64_OR_ARM64) +#if !defined(TARGET_64) VirtualTableRecorder::RecordVirtualTableAddress(vtableAddresses, VTableValue::VtableJavascriptNumber); #else @@ -3551,6 +3666,7 @@ namespace Js VirtualTableRecorder::RecordVirtualTableAddress(vtableAddresses, VTableValue::VtableDynamicObject); vtableAddresses[VTableValue::VtableInvalid] = Js::ScriptContextOptimizationOverrideInfo::InvalidVtable; VirtualTableRecorder::RecordVirtualTableAddress(vtableAddresses, VTableValue::VtablePropertyString); + VirtualTableRecorder::RecordVirtualTableAddress(vtableAddresses, VTableValue::VtableLazyJSONString); VirtualTableRecorder::RecordVirtualTableAddress(vtableAddresses, VTableValue::VtableJavascriptBoolean); VirtualTableRecorder::RecordVirtualTableAddress(vtableAddresses, VTableValue::VtableJavascriptArray); VirtualTableRecorder::RecordVirtualTableAddress(vtableAddresses, VTableValue::VtableInt8Array); @@ -4037,7 +4153,7 @@ namespace Js { Var arrayIteratorPrototypeNext = nullptr; ImplicitCallFlags flags = scriptContext->GetThreadContext()->TryWithDisabledImplicitCall( - [&]() { arrayIteratorPrototypeNext = JavascriptOperators::GetPropertyNoCache(scriptContext->GetLibrary()->GetArrayIteratorPrototype(), PropertyIds::next, scriptContext); }); + [&]() { arrayIteratorPrototypeNext = JavascriptOperators::GetPropertyNoCache(scriptContext->GetLibrary()->GetArrayIteratorPrototype(), PropertyIds::next, scriptContext); }); return (flags != ImplicitCall_None) || arrayIteratorPrototypeNext != scriptContext->GetLibrary()->GetArrayIteratorPrototypeBuiltinNextFunction(); } @@ -4050,7 +4166,7 @@ namespace Js // so that the update is in sync with profiler ScriptContext* scriptContext = numberConstructor->GetScriptContext(); JavascriptLibrary* library = numberConstructor->GetLibrary(); - library->AddMember(numberConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(numberConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); library->AddMember(numberConstructor, PropertyIds::prototype, library->numberPrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -4258,7 +4374,7 @@ namespace Js typeHandler->Convert(objectConstructor, mode, propertyCount); - library->AddMember(objectConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(objectConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); library->AddMember(objectConstructor, PropertyIds::prototype, library->objectPrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -4375,7 +4491,7 @@ namespace Js typeHandler->Convert(regexConstructor, mode, 3); // Note: Any new function addition/deletion/modification should also be updated in JavascriptLibrary::ProfilerRegisterRegExp // so that the update is in sync with profiler - library->AddMember(regexConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(2), PropertyNone); + library->AddMember(regexConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(2), PropertyConfigurable); library->AddMember(regexConstructor, PropertyIds::prototype, library->regexPrototype, PropertyNone); library->AddSpeciesAccessorsToLibraryObject(regexConstructor, &JavascriptRegExp::EntryInfo::GetterSymbolSpecies); @@ -4495,7 +4611,7 @@ namespace Js ScriptContext* scriptContext = stringConstructor->GetScriptContext(); Field(JavascriptFunction*)* builtinFuncs = library->GetBuiltinFunctions(); - library->AddMember(stringConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone); + library->AddMember(stringConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable); library->AddMember(stringConstructor, PropertyIds::prototype, library->stringPrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) @@ -4527,6 +4643,7 @@ namespace Js ScriptContext* scriptContext = stringPrototype->GetScriptContext(); JavascriptLibrary* library = stringPrototype->GetLibrary(); Field(JavascriptFunction*)* builtinFuncs = library->GetBuiltinFunctions(); + library->AddMember(stringPrototype, PropertyIds::constructor, library->stringConstructor); builtinFuncs[BuiltinFunction::JavascriptString_IndexOf] = library->AddFunctionToLibraryObject(stringPrototype, PropertyIds::indexOf, &JavascriptString::EntryInfo::IndexOf, 1); @@ -4603,7 +4720,7 @@ namespace Js // so that the update is in sync with profiler JavascriptLibrary* library = mapConstructor->GetLibrary(); ScriptContext* scriptContext = mapConstructor->GetScriptContext(); - library->AddMember(mapConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone); + library->AddMember(mapConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable); library->AddMember(mapConstructor, PropertyIds::prototype, library->mapPrototype, PropertyNone); library->AddSpeciesAccessorsToLibraryObject(mapConstructor, &JavascriptMap::EntryInfo::GetterSymbolSpecies); @@ -4658,7 +4775,7 @@ namespace Js // so that the update is in sync with profiler JavascriptLibrary* library = setConstructor->GetLibrary(); ScriptContext* scriptContext = setConstructor->GetScriptContext(); - library->AddMember(setConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone); + library->AddMember(setConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable); library->AddMember(setConstructor, PropertyIds::prototype, library->setPrototype, PropertyNone); library->AddSpeciesAccessorsToLibraryObject(setConstructor, &JavascriptSet::EntryInfo::GetterSymbolSpecies); @@ -4712,7 +4829,7 @@ namespace Js // so that the update is in sync with profiler JavascriptLibrary* library = weakMapConstructor->GetLibrary(); ScriptContext* scriptContext = weakMapConstructor->GetScriptContext(); - library->AddMember(weakMapConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone); + library->AddMember(weakMapConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable); library->AddMember(weakMapConstructor, PropertyIds::prototype, library->weakMapPrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -4755,7 +4872,7 @@ namespace Js // so that the update is in sync with profiler JavascriptLibrary* library = weakSetConstructor->GetLibrary(); ScriptContext* scriptContext = weakSetConstructor->GetScriptContext(); - library->AddMember(weakSetConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone); + library->AddMember(weakSetConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable); library->AddMember(weakSetConstructor, PropertyIds::prototype, library->weakSetPrototype, PropertyNone); if (scriptContext->GetConfig()->IsES6FunctionNameEnabled()) { @@ -4806,6 +4923,7 @@ namespace Js bool JavascriptLibrary::InitializeArrayIteratorPrototype(DynamicObject* arrayIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode) { + typeHandler->Convert(arrayIteratorPrototype, mode, 2); // Note: Any new function addition/deletion/modification should also be updated in JavascriptLibrary::ProfilerRegisterArrayIterator // so that the update is in sync with profiler @@ -4813,6 +4931,10 @@ namespace Js JavascriptLibrary* library = arrayIteratorPrototype->GetLibrary(); ScriptContext* scriptContext = library->GetScriptContext(); +#ifdef ENABLE_JS_BUILTINS + Assert(!scriptContext->IsJsBuiltInEnabled()); +#endif + library->arrayIteratorPrototypeBuiltinNextFunction = library->AddFunctionToLibraryObject(arrayIteratorPrototype, PropertyIds::next, &JavascriptArrayIterator::EntryInfo::Next, 0); if (scriptContext->GetConfig()->IsES6ToStringTagEnabled()) @@ -4972,6 +5094,14 @@ namespace Js jsrtExternalTypesCache->Item(finalizeCallback, recycler->CreateWeakReferenceHandle(dynamicTypeToCache)); } + void JavascriptLibrary::DefaultCreateFunction(ParseableFunctionInfo * functionInfo, int length, DynamicObject * prototype, PropertyId nameId) + { + Assert(nameId >= Js::InternalPropertyIds::Count && scriptContext->IsTrackedPropertyId(nameId)); + ScriptFunction* function = scriptContext->GetLibrary()->CreateScriptFunction(functionInfo); + function->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(length), PropertyConfigurable, nullptr); + AddMember(prototype, nameId, function); + } + RuntimeFunction* JavascriptLibrary::DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, PropertyId nameId) { Assert(nameId >= Js::InternalPropertyIds::Count && scriptContext->IsTrackedPropertyId(nameId)); @@ -5096,7 +5226,7 @@ namespace Js { Var name_withGetPrefix = LiteralString::Concat(LiteralString::NewCopySz(_u("get "), scriptContext), scriptContext->GetPropertyString(nameId)); RuntimeFunction* getterFunction = DefaultCreateFunction(functionInfo, 0, nullptr, nullptr, name_withGetPrefix); - getterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyNone, nullptr); + getterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(0), PropertyConfigurable, nullptr); return getterFunction; } @@ -5104,7 +5234,7 @@ namespace Js { Var name_withSetPrefix = LiteralString::Concat(LiteralString::NewCopySz(_u("set "), scriptContext), scriptContext->GetPropertyString(nameId)); RuntimeFunction* setterFunction = DefaultCreateFunction(functionInfo, 0, nullptr, nullptr, name_withSetPrefix); - setterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyNone, nullptr); + setterFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(1), PropertyConfigurable, nullptr); return setterFunction; } @@ -5146,7 +5276,7 @@ namespace Js return jsonStringifyFunction; } -#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_PROJECTION) +#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS) || defined(ENABLE_PROJECTION) bool JavascriptLibrary::InitializeEngineInterfaceObject(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode) { typeHandler->Convert(engineInterface, mode, 3); @@ -5270,6 +5400,61 @@ namespace Js } } +#ifdef ENABLE_JS_BUILTINS + + bool JavascriptLibrary::InitializeBuiltInObject(DynamicObject* builtInObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode) + { + typeHandler->Convert(builtInObject, mode, /*initSlotCapacity*/ 2); + + if (builtInObject->GetScriptContext()->IsJsBuiltInEnabled()) + { + auto builtInInitializer = [&](JsBuiltInEngineInterfaceExtensionObject* builtInExtension, ScriptContext * scriptContext) -> void + { + builtInExtension->InjectJsBuiltInLibraryCode(scriptContext); + }; + builtInObject->GetLibrary()->InitializeBuiltInForPrototypes(builtInInitializer); + } + return true; + } + + void JavascriptLibrary::EnsureBuiltInEngineIsReady() + { + if (scriptContext->IsJsBuiltInEnabled()) + { + auto builtInInitializer = [&](JsBuiltInEngineInterfaceExtensionObject* builtInExtension, ScriptContext * scriptContext) -> void + { + builtInExtension->InjectJsBuiltInLibraryCode(scriptContext); + }; + scriptContext->GetLibrary()->InitializeBuiltInForPrototypes(builtInInitializer); + } + } + + template + void JavascriptLibrary::InitializeBuiltInForPrototypes(Fn fn) + { + if (scriptContext->VerifyAlive()) // Can't initialize if scriptContext closed, will need to run script + { + Assert(engineInterfaceObject != nullptr); + JsBuiltInEngineInterfaceExtensionObject* builtInExtension = static_cast(GetEngineInterfaceObject()->GetEngineExtension(EngineInterfaceExtensionKind_JsBuiltIn)); + fn(builtInExtension, scriptContext); + } + } + + bool JavascriptLibrary::InitializeChakraLibraryObject(DynamicObject * chakraLibraryObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode) + { + JavascriptLibrary* library = chakraLibraryObject->GetLibrary(); + typeHandler->Convert(chakraLibraryObject, mode, 4); + + library->AddFunctionToLibraryObject(chakraLibraryObject, PropertyIds::GetLength, &JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_Internal_GetLength, 1); + library->AddFunctionToLibraryObject(chakraLibraryObject, PropertyIds::InitInternalProperties, &JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_Internal_InitInternalProperties, 1); + library->AddMember(chakraLibraryObject, PropertyIds::isArray, library->isArrayFunction); + library->AddMember(chakraLibraryObject, PropertyIds::Object, library->objectConstructor); + + return true; + } + +#endif // ENABLE_JS_BUILTINS + #ifdef ENABLE_INTL_OBJECT void JavascriptLibrary::ResetIntlObject() { @@ -5393,7 +5578,7 @@ namespace Js } JavascriptString* JavascriptLibrary::CreateEmptyString() { - return LiteralString::CreateEmptyString(GetStringTypeStatic()); + return LiteralStringWithPropertyStringPtr::CreateEmptyString(this); } JavascriptRegExp* JavascriptLibrary::CreateEmptyRegExp() @@ -5664,7 +5849,17 @@ namespace Js return res; } -#endif + + Js::RecyclableObject* JavascriptLibrary::CreateJavascriptGenerator_TTD(Js::ScriptContext *ctx, + Js::RecyclableObject *prototype, Js::Arguments &arguments, + Js::JavascriptGenerator::GeneratorState generatorState) + { + Js::DynamicType* generatorType = CreateGeneratorType(prototype); + Js::JavascriptGenerator* generator = Js::JavascriptGenerator::New(ctx->GetRecycler(), generatorType, arguments, generatorState); + return generator; + } + +#endif // ENABLE_TTD void JavascriptLibrary::SetCrossSiteForSharedFunctionType(JavascriptFunction * function) { @@ -6425,8 +6620,9 @@ namespace Js return RecyclerNew(this->GetRecycler(), JavascriptPromise, promiseType); } - JavascriptPromiseAsyncSpawnExecutorFunction* JavascriptLibrary::CreatePromiseAsyncSpawnExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var target) + JavascriptPromiseAsyncSpawnExecutorFunction* JavascriptLibrary::CreatePromiseAsyncSpawnExecutorFunction(JavascriptGenerator* generator, Var target) { + JavascriptMethod entryPoint = JavascriptPromise::EntryJavascriptPromiseAsyncSpawnExecutorFunction; FunctionInfo* functionInfo = RecyclerNew(this->GetRecycler(), FunctionInfo, entryPoint); DynamicType* type = CreateDeferredPrototypeFunctionType(this->inDispatchProfileMode ? ProfileEntryThunk : entryPoint); JavascriptPromiseAsyncSpawnExecutorFunction* function = RecyclerNewEnumClass(this->GetRecycler(), EnumFunctionClass, JavascriptPromiseAsyncSpawnExecutorFunction, type, functionInfo, generator, target); @@ -6583,6 +6779,14 @@ namespace Js return RecyclerNewEnumClass(this->GetRecycler(), EnumFunctionClass, AsmJsScriptFunction, proxy, deferredPrototypeType); } +#ifdef ENABLE_WASM + WasmScriptFunction * JavascriptLibrary::CreateWasmScriptFunction(FunctionProxy* proxy) + { + ScriptFunctionType* deferredPrototypeType = proxy->EnsureDeferredPrototypeType(); + return RecyclerNewEnumClass(this->GetRecycler(), EnumFunctionClass, WasmScriptFunction, proxy, deferredPrototypeType); + } +#endif + ScriptFunctionWithInlineCache* JavascriptLibrary::CreateScriptFunctionWithInlineCache(FunctionProxy * proxy) { ScriptFunctionType* deferredPrototypeType = proxy->EnsureDeferredPrototypeType(); @@ -6615,6 +6819,15 @@ namespace Js return RecyclerNewEnumClass(this->GetRecycler(), EnumFunctionClass, JavascriptGeneratorFunction, type, scriptFunction); } + JavascriptGeneratorFunction* JavascriptLibrary::CreateGeneratorFunction(JavascriptMethod entryPoint, bool isAnonymousFunction) + { + Assert(scriptContext->GetConfig()->IsES6GeneratorsEnabled()); + + DynamicType* type = CreateDeferredPrototypeGeneratorFunctionType(entryPoint, isAnonymousFunction); + + return RecyclerNewEnumClass(this->GetRecycler(), EnumFunctionClass, JavascriptGeneratorFunction, type, nullptr); + } + JavascriptAsyncFunction* JavascriptLibrary::CreateAsyncFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction) { DynamicType* type = CreateDeferredPrototypeAsyncFunctionType(entryPoint, scriptFunction->IsAnonymousFunction()); @@ -6622,6 +6835,13 @@ namespace Js return RecyclerNewEnumClass(this->GetRecycler(), EnumFunctionClass, JavascriptAsyncFunction, type, scriptFunction); } + JavascriptAsyncFunction* JavascriptLibrary::CreateAsyncFunction(JavascriptMethod entryPoint, bool isAnonymousFunction) + { + DynamicType* type = CreateDeferredPrototypeAsyncFunctionType(entryPoint, isAnonymousFunction); + + return RecyclerNewEnumClass(this->GetRecycler(), EnumFunctionClass, JavascriptAsyncFunction, type, nullptr); + } + JavascriptExternalFunction* JavascriptLibrary::CreateStdCallExternalFunction(StdCallJavascriptMethod entryPoint, PropertyId nameId, void *callbackState) { Assert(nameId == 0 || scriptContext->IsTrackedPropertyId(nameId)); @@ -6866,7 +7086,7 @@ namespace Js } oldCachedType = dynamicType; #endif - SimplePathTypeHandler* typeHandler = SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, requestedInlineSlotCapacity, offsetOfInlineSlots, true, true); + SimplePathTypeHandlerNoAttr* typeHandler = SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, requestedInlineSlotCapacity, offsetOfInlineSlots, true, true); dynamicType = DynamicType::New(scriptContext, typeId, prototype, RecyclableObject::DefaultEntryPoint, typeHandler, true, true); if (useCache) @@ -6896,7 +7116,7 @@ namespace Js DynamicType* JavascriptLibrary::CreateObjectTypeNoCache(RecyclableObject* prototype, Js::TypeId typeId) { return DynamicType::New(scriptContext, typeId, prototype, RecyclableObject::DefaultEntryPoint, - SimplePathTypeHandler::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); + SimplePathTypeHandlerNoAttr::New(scriptContext, this->GetRootPath(), 0, 0, 0, true, true), true, true); } DynamicType* JavascriptLibrary::CreateObjectType(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity) @@ -6908,9 +7128,24 @@ namespace Js DynamicObject* JavascriptLibrary::CreateObject(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity) { Assert(JavascriptOperators::IsObjectOrNull(prototype)); - - DynamicType* dynamicType = CreateObjectType(prototype, requestedInlineSlotCapacity); - return DynamicObject::New(this->GetRecycler(), dynamicType); + DynamicType* type = nullptr; + // If requested capacity is 0, we can't shrink, so it is already fixed and we can reuse the cached types + // For other inline slot capacities, we might want to shrink so we can't use the cached types (whose slot capacities are fixed) + // + // REVIEW: Do we really need non-fixed inline slot capacity? The obvious downside is it prevents type sharing with the cached types + if (requestedInlineSlotCapacity == 0 && JavascriptOperators::IsNull(prototype)) + { + type = GetNullPrototypeObjectType(); + } + else if(requestedInlineSlotCapacity == 0 && prototype == GetObjectPrototype()) + { + type = GetObjectType(); + } + else + { + type = CreateObjectType(prototype, requestedInlineSlotCapacity); + } + return DynamicObject::New(this->GetRecycler(), type); } PropertyStringCacheMap* JavascriptLibrary::EnsurePropertyStringMap() @@ -7375,7 +7610,7 @@ namespace Js this->dynamicFunctionReference->Push(func); } - +#ifdef ENABLE_SCRIPT_PROFILING // Register for profiler #define DEFINE_OBJECT_NAME(object) const char16 *pwszObjectName = _u(#object); @@ -7597,10 +7832,15 @@ namespace Js REG_OBJECTS_LIB_FUNC(findIndex, JavascriptArray::EntryFindIndex); } - REG_OBJECTS_LIB_FUNC(entries, JavascriptArray::EntryEntries) - REG_OBJECTS_LIB_FUNC(keys, JavascriptArray::EntryKeys) - REG_OBJECTS_LIB_FUNC(values, JavascriptArray::EntryValues) - // _symbolIterator is just an alias for values on Array.prototype so do not register it as its own function + // All iterator constructor functions are implemeted in Js when JsBuiltIns are enabled and their entrypoint will be the same + // The profiler cannot distinguish between them + if (!scriptContext->IsJsBuiltInEnabled()) + { + REG_OBJECTS_LIB_FUNC(entries, JavascriptArray::EntryEntries) + REG_OBJECTS_LIB_FUNC(keys, JavascriptArray::EntryKeys) + REG_OBJECTS_LIB_FUNC(values, JavascriptArray::EntryValues) + // _symbolIterator is just an alias for values on Array.prototype so do not register it as its own function + } REG_OBJECTS_LIB_FUNC(fill, JavascriptArray::EntryFill) REG_OBJECTS_LIB_FUNC(copyWithin, JavascriptArray::EntryCopyWithin) @@ -8002,11 +8242,14 @@ namespace Js { HRESULT hr = S_OK; // Array Iterator has no global constructor +#if defined(ENABLE_JS_BUILTINS) + if (!scriptContext->IsJsBuiltInEnabled()) + { + DEFINE_OBJECT_NAME(Array Iterator); - DEFINE_OBJECT_NAME(Array Iterator); - - REG_OBJECTS_LIB_FUNC(next, JavascriptArrayIterator::EntryNext); - + REG_OBJECTS_LIB_FUNC(next, JavascriptArrayIterator::EntryNext); + } +#endif return hr; } @@ -8491,11 +8734,12 @@ namespace Js return hr; } #endif +#endif // ENABLE_SCRIPT_PROFILING #if DBG void JavascriptLibrary::DumpLibraryByteCode() { -#ifdef ENABLE_INTL_OBJECT +#if defined(ENABLE_JS_BUILTINS) || defined(ENABLE_INTL_OBJECT) // We aren't going to be passing in a number to check range of -dump:LibInit, that will be done by Intl/Promise // This is just to force init Intl code if dump:LibInit has been passed if (CONFIG_ISENABLED(DumpFlag) && Js::Configuration::Global.flags.Dump.IsEnabled(Js::JsLibInitPhase)) @@ -8503,7 +8747,7 @@ namespace Js for (uint i = 0; i <= MaxEngineInterfaceExtensionKind; i++) { EngineExtensionObjectBase* engineExtension = this->GetEngineInterfaceObject()->GetEngineExtension((Js::EngineInterfaceExtensionKind)i); - if (engineExtension != nullptr) + if (engineExtension != nullptr && engineExtension->GetHasByteCode()) { engineExtension->DumpByteCode(); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.h index a51136fd98d..9122f1b6fea 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.h @@ -13,6 +13,7 @@ CompileAssert(MaxPreInitializedObjectTypeInlineSlotCount <= USHRT_MAX); #include "StringCache.h" +#include "Library/JavascriptGenerator.h" class ScriptSite; class ActiveScriptExternalLibrary; @@ -43,6 +44,7 @@ namespace Js typedef TwoLevelHashDictionary EvalCacheDictionary; typedef JsUtil::BaseDictionary BuiltInLibraryFunctionMap; + typedef JsUtil::BaseDictionary StringMap; // valid if object!= NULL struct EnumeratedObjectCache @@ -74,6 +76,7 @@ namespace Js Field(EvalCacheDictionary*) evalCacheDictionary; Field(EvalCacheDictionary*) indirectEvalCacheDictionary; Field(NewFunctionCache*) newFunctionCache; + Field(StringMap *) integerStringMap; Field(RegexPatternMruMap *) dynamicRegexMap; Field(SourceContextInfoMap*) sourceContextInfoMap; // maps host provided context cookie to the URL of the script buffer passed. Field(DynamicSourceContextInfoMap*) dynamicSourceContextInfoMap; @@ -81,11 +84,14 @@ namespace Js Field(SRCINFO*) noContextGlobalSourceInfo; Field(Field(SRCINFO const *)*) moduleSrcInfo; Field(BuiltInLibraryFunctionMap*) builtInLibraryFunctions; + Field(ScriptContextPolymorphicInlineCache*) toStringTagCache; + Field(ScriptContextPolymorphicInlineCache*) toJSONCache; #if ENABLE_PROFILE_INFO #if DBG_DUMP || defined(DYNAMIC_PROFILE_STORAGE) || defined(RUNTIME_DATA_COLLECTION) Field(DynamicProfileInfoList*) profileInfoList; #endif #endif + Cache() : toStringTagCache(nullptr), toJSONCache(nullptr) { } }; class MissingPropertyTypeHandler; @@ -186,6 +192,9 @@ namespace Js friend class ExternalLibraryBase; friend class ActiveScriptExternalLibrary; friend class IntlEngineInterfaceExtensionObject; +#ifdef ENABLE_JS_BUILTINS + friend class JsBuiltInEngineInterfaceExtensionObject; +#endif friend class ChakraHostScriptContext; #ifdef ENABLE_PROJECTION friend class ProjectionExternalLibrary; @@ -226,6 +235,7 @@ namespace Js static DWORD GetBuiltinFunctionsOffset() { return offsetof(JavascriptLibrary, builtinFunctions); } static DWORD GetCharStringCacheOffset() { return offsetof(JavascriptLibrary, charStringCache); } static DWORD GetCharStringCacheAOffset() { return GetCharStringCacheOffset() + CharStringCache::GetCharStringCacheAOffset(); } + PolymorphicInlineCache *GetToStringTagCache() const { return cache.toStringTagCache; } const JavascriptLibraryBase* GetLibraryBase() const { return static_cast(this); } void SetGlobalObject(GlobalObject* globalObject) {this->globalObject = globalObject; } static DWORD GetRandSeed0Offset() { return offsetof(JavascriptLibrary, randSeed0); } @@ -359,6 +369,7 @@ namespace Js Field(DynamicType *) numberTypeDynamic; Field(DynamicType *) objectTypes[PreInitializedObjectTypeCount]; Field(DynamicType *) objectHeaderInlinedTypes[PreInitializedObjectTypeCount]; + Field(DynamicType *) nullPrototypeObjectType; Field(DynamicType *) regexPrototypeType; Field(DynamicType *) regexType; Field(DynamicType *) regexResultType; @@ -388,6 +399,8 @@ namespace Js Field(PropertyStringCacheMap*) propertyStringMap; Field(ConstructorCache*) builtInConstructorCache; + Field(DynamicObject*) chakraLibraryObject; + #ifdef ENABLE_DEBUG_CONFIG_OPTIONS Field(JavascriptFunction*) debugObjectFaultInjectionCookieGetterFunction; Field(JavascriptFunction*) debugObjectFaultInjectionCookieSetterFunction; @@ -401,12 +414,17 @@ namespace Js Field(JavascriptFunction*) arrayPrototypeToLocaleStringFunction; Field(JavascriptFunction*) identityFunction; Field(JavascriptFunction*) throwerFunction; + Field(JavascriptFunction*) generatorReturnFunction; Field(JavascriptFunction*) generatorNextFunction; Field(JavascriptFunction*) generatorThrowFunction; Field(JavascriptFunction*) objectValueOfFunction; Field(JavascriptFunction*) objectToStringFunction; +#ifdef ENABLE_JS_BUILTINS + Field(JavascriptFunction*) isArrayFunction; +#endif + #ifdef ENABLE_WASM Field(DynamicObject*) webAssemblyObject; Field(JavascriptFunction*) webAssemblyQueryResponseFunction; @@ -583,6 +601,7 @@ namespace Js bindRefChunkCurrent(nullptr), bindRefChunkEnd(nullptr), dynamicFunctionReference(nullptr) + { this->globalObject = globalObject; } @@ -651,6 +670,8 @@ namespace Js SCACHE_FUNCTION_PROXY(GetObjectNumberDisplayString) SCACHE_FUNCTION_PROXY(GetObjectRegExpDisplayString) SCACHE_FUNCTION_PROXY(GetObjectStringDisplayString) + SCACHE_FUNCTION_PROXY(GetObjectNullDisplayString) + SCACHE_FUNCTION_PROXY(GetObjectUndefinedDisplayString) SCACHE_FUNCTION_PROXY(GetUndefinedDisplayString) SCACHE_FUNCTION_PROXY(GetNaNDisplayString) SCACHE_FUNCTION_PROXY(GetNullDisplayString) @@ -686,6 +707,8 @@ namespace Js DynamicObject* GetWebAssemblyLinkErrorPrototype() const { return webAssemblyLinkErrorPrototype; } DynamicObject* GetWebAssemblyLinkErrorConstructor() const { return webAssemblyLinkErrorConstructor; } + DynamicObject* GetChakraLib() const { return chakraLibraryObject; } + #if ENABLE_TTD Js::PropertyId ExtractPrimitveSymbolId_TTD(Var value); Js::RecyclableObject* CreatePrimitveSymbol_TTD(Js::PropertyId pid); @@ -730,6 +753,9 @@ namespace Js Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* CreateRemainingElementsWrapper_TTD(Js::ScriptContext* ctx, uint32 value); Js::RecyclableObject* CreatePromiseAllResolveElementFunction_TTD(Js::JavascriptPromiseCapability* capabilities, uint32 index, Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* wrapper, Js::RecyclableObject* values, bool alreadyCalled); + Js::RecyclableObject* CreateJavascriptGenerator_TTD(Js::ScriptContext *ctx, + Js::RecyclableObject *prototype, Js::Arguments &arguments, + Js::JavascriptGenerator::GeneratorState generatorState); #endif #ifdef ENABLE_INTL_OBJECT @@ -742,6 +768,17 @@ namespace Js void InitializeIntlForNumberPrototype(); #endif +#ifdef ENABLE_JS_BUILTINS + template + void InitializeBuiltInForPrototypes(Fn fn); + + void EnsureBuiltInEngineIsReady(); + + static bool __cdecl InitializeChakraLibraryObject(DynamicObject* chakraLibraryObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); + static bool __cdecl InitializeBuiltInObject(DynamicObject* builtInEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); + +#endif + #ifdef ENABLE_DEBUG_CONFIG_OPTIONS DynamicType * GetDebugDisposableObjectType() { return debugDisposableObjectType; } DynamicType * GetDebugFuncExecutorInDisposeObjectType() { return debugFuncExecutorInDisposeObjectType; } @@ -776,6 +813,8 @@ namespace Js DynamicType * GetWebAssemblyInstanceType() const { return webAssemblyInstanceType; } DynamicType * GetWebAssemblyMemoryType() const { return webAssemblyMemoryType; } DynamicType * GetWebAssemblyTableType() const { return webAssemblyTableType; } + DynamicType * GetGeneratorConstructorPrototypeObjectType() const { return generatorConstructorPrototypeObjectType; } + #ifdef ENABLE_WASM JavascriptFunction* GetWebAssemblyQueryResponseFunction() const { return webAssemblyQueryResponseFunction; } JavascriptFunction* GetWebAssemblyCompileFunction() const { return webAssemblyCompileFunction; } @@ -811,6 +850,7 @@ namespace Js DynamicType * GetObjectLiteralType(uint16 requestedInlineSlotCapacity); DynamicType * GetObjectHeaderInlinedLiteralType(uint16 requestedInlineSlotCapacity); DynamicType * GetObjectType() const { return objectTypes[0]; } + DynamicType * GetNullPrototypeObjectType() const { return nullPrototypeObjectType; } DynamicType * GetObjectHeaderInlinedType() const { return objectHeaderInlinedTypes[0]; } StaticType * GetSymbolTypeStatic() const { return symbolTypeStatic; } DynamicType * GetSymbolTypeDynamic() const { return symbolTypeDynamic; } @@ -1032,8 +1072,12 @@ namespace Js DynamicType * CreateFunctionWithLengthAndPrototypeType(DynamicObject * prototype, FunctionInfo * functionInfo); ScriptFunction * CreateScriptFunction(FunctionProxy* proxy); AsmJsScriptFunction * CreateAsmJsScriptFunction(FunctionProxy* proxy); +#ifdef ENABLE_WASM + WasmScriptFunction * CreateWasmScriptFunction(FunctionProxy* proxy); +#endif ScriptFunctionWithInlineCache * CreateScriptFunctionWithInlineCache(FunctionProxy* proxy); GeneratorVirtualScriptFunction * CreateGeneratorVirtualScriptFunction(FunctionProxy* proxy); + DynamicType * CreateGeneratorType(RecyclableObject* prototype); #if 0 @@ -1041,12 +1085,14 @@ namespace Js #endif JavascriptNumber* CreateNumber(double value, RecyclerJavascriptNumberAllocator * numberAllocator); JavascriptGeneratorFunction* CreateGeneratorFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction); + JavascriptGeneratorFunction* CreateGeneratorFunction(JavascriptMethod entryPoint, bool isAnonymousFunction); JavascriptAsyncFunction* CreateAsyncFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction); + JavascriptAsyncFunction* CreateAsyncFunction(JavascriptMethod entryPoint, bool isAnonymousFunction); JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, PropertyId nameId, Var signature, UINT64 flags, bool isLengthAvailable = false); JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, Var nameId, Var signature, UINT64 flags, bool isLengthAvailable = false); JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, PropertyId nameId, void *callbackState); JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, Var name, void *callbackState); - JavascriptPromiseAsyncSpawnExecutorFunction* CreatePromiseAsyncSpawnExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var target); + JavascriptPromiseAsyncSpawnExecutorFunction* CreatePromiseAsyncSpawnExecutorFunction(JavascriptGenerator* generator, Var target); JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* CreatePromiseAsyncSpawnStepArgumentExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var argument, Var resolve = nullptr, Var reject = nullptr, bool isReject = false); JavascriptPromiseCapabilitiesExecutorFunction* CreatePromiseCapabilitiesExecutorFunction(JavascriptMethod entryPoint, JavascriptPromiseCapability* capability); JavascriptPromiseResolveOrRejectFunction* CreatePromiseResolveOrRejectFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolvedRecord); @@ -1108,6 +1154,7 @@ namespace Js JavascriptFunction* EnsurePromiseResolveFunction(); JavascriptFunction* EnsurePromiseThenFunction(); + JavascriptFunction* EnsureGeneratorReturnFunction(); JavascriptFunction* EnsureGeneratorNextFunction(); JavascriptFunction* EnsureGeneratorThrowFunction(); JavascriptFunction* EnsureArrayPrototypeForEachFunction(); @@ -1189,6 +1236,7 @@ namespace Js void TypeAndPrototypesAreEnsuredToHaveOnlyWritableDataProperties(Type *const type); void NoPrototypeChainsAreEnsuredToHaveOnlyWritableDataProperties(); + static bool IsDefaultArrayValuesFunction(RecyclableObject * function, ScriptContext *scriptContext); static bool ArrayIteratorPrototypeHasUserDefinedNext(ScriptContext *scriptContext); CharStringCache& GetCharStringCache() { return charStringCache; } @@ -1313,6 +1361,7 @@ namespace Js #ifdef ENABLE_INTL_OBJECT static bool __cdecl InitializeIntlObject(DynamicObject* IntlEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); #endif + #ifdef ENABLE_PROJECTION void InitializeWinRTPromiseConstructor(); #endif @@ -1328,6 +1377,7 @@ namespace Js static bool __cdecl InitializeAsyncFunction(DynamicObject *function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); RuntimeFunction* CreateBuiltinConstructor(FunctionInfo * functionInfo, DynamicTypeHandler * typeHandler, DynamicObject* prototype = nullptr); + void DefaultCreateFunction(ParseableFunctionInfo * functionInfo, int length, DynamicObject * prototype, PropertyId nameId); RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, PropertyId nameId); RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, Var nameId); JavascriptFunction* AddFunction(DynamicObject* object, PropertyId propertyId, RuntimeFunction* function); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.inl b/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.inl index 97c2f56c2bb..36fa194ee1d 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.inl +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibrary.inl @@ -46,9 +46,13 @@ namespace Js template <> inline void JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(const Var instance) { - if (instance && JavascriptCopyOnAccessNativeIntArray::Is(instance)) + if (instance ) { - JavascriptCopyOnAccessNativeIntArray::FromVar(instance)->ConvertCopyOnAccessSegment(); + JavascriptCopyOnAccessNativeIntArray * copyOnAccessArray = JavascriptOperators::TryFromVar(instance); + if (copyOnAccessArray) + { + copyOnAccessArray->ConvertCopyOnAccessSegment(); + } } } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibraryBase.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibraryBase.h index 423758e0b7b..48aa8295835 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibraryBase.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptLibraryBase.h @@ -97,7 +97,7 @@ namespace Js #ifdef ENABLE_INTL_OBJECT DynamicObject* GetINTLObject() { return IntlObject; } #endif -#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_PROJECTION) +#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS) || defined(ENABLE_PROJECTION) EngineInterfaceObject* GetEngineInterfaceObject() { return engineInterfaceObject; } #endif @@ -210,7 +210,7 @@ namespace Js #ifdef ENABLE_INTL_OBJECT Field(DynamicObject*) IntlObject; #endif -#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_PROJECTION) +#if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS) || defined(ENABLE_PROJECTION) Field(EngineInterfaceObject*) engineInterfaceObject; #endif Field(DynamicObject*) reflectObject; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptListIterator.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptListIterator.cpp index 7eac07aa457..bf9d621f282 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptListIterator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptListIterator.cpp @@ -22,12 +22,20 @@ namespace Js } JavascriptListIterator* JavascriptListIterator::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptListIterator'"); + + return static_cast(aValue); + } + + JavascriptListIterator* JavascriptListIterator::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptListIterator'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } + Var JavascriptListIterator::EntryNext(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptListIterator.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptListIterator.h index cda1a4a7457..c54ce9df3c2 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptListIterator.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptListIterator.h @@ -22,6 +22,7 @@ namespace Js static bool Is(Var aValue); static JavascriptListIterator* FromVar(Var aValue); + static JavascriptListIterator* UnsafeFromVar(Var aValue); class EntryInfo { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptMap.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptMap.cpp index 9e9395a8db0..fa944e09319 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptMap.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptMap.cpp @@ -25,10 +25,17 @@ namespace Js } JavascriptMap* JavascriptMap::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptMap'"); + + return static_cast(aValue); + } + + JavascriptMap* JavascriptMap::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptMap'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } JavascriptMap::MapDataList::Iterator JavascriptMap::GetIterator() @@ -45,9 +52,8 @@ namespace Js JavascriptLibrary* library = scriptContext->GetLibrary(); AUTO_TAG_NATIVE_LIBRARY_ENTRY(function, callInfo, _u("Map")); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); CHAKRATEL_LANGSTATS_INC_DATACOUNT(ES6_Map); JavascriptMap* mapObject = nullptr; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptMap.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptMap.h index 9b4ad1c6f58..6bab5311e03 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptMap.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptMap.h @@ -28,6 +28,7 @@ namespace Js static bool Is(Var aValue); static JavascriptMap* FromVar(Var aValue); + static JavascriptMap* UnsafeFromVar(Var aValue); void Clear(); bool Delete(Var key); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptMapIterator.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptMapIterator.cpp index bebee964357..a37034257f6 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptMapIterator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptMapIterator.cpp @@ -22,10 +22,17 @@ namespace Js } JavascriptMapIterator* JavascriptMapIterator::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptMapIterator'"); + + return static_cast(aValue); + } + + JavascriptMapIterator* JavascriptMapIterator::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptMapIterator'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptMapIterator::EntryNext(RecyclableObject* function, CallInfo callInfo, ...) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptMapIterator.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptMapIterator.h index 363111f4cc3..96849c6029a 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptMapIterator.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptMapIterator.h @@ -29,6 +29,7 @@ namespace Js static bool Is(Var aValue); static JavascriptMapIterator* FromVar(Var aValue); + static JavascriptMapIterator* UnsafeFromVar(Var aValue); class EntryInfo { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.cpp index c977b178c7f..0b0f9b9c272 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.cpp @@ -368,10 +368,8 @@ namespace Js // AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); Var result; @@ -1082,9 +1080,8 @@ namespace Js } JavascriptString *result = nullptr; - ENTER_PINNED_SCOPE(JavascriptString, dblStr); - dblStr = JavascriptString::FromVar(FormatDoubleToString(value, NumberUtilities::FormatFixed, -1, scriptContext)); + JavascriptString *dblStr = JavascriptString::FromVar(FormatDoubleToString(value, NumberUtilities::FormatFixed, -1, scriptContext)); const char16* szValue = dblStr->GetSz(); const size_t szLength = dblStr->GetLength(); @@ -1116,8 +1113,6 @@ namespace Js } } - LEAVE_PINNED_SCOPE(); // dblStr - if ( pszToBeFreed ) { HeapDeleteArray(count, pszToBeFreed); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.h index 4f0e54910ba..fb309e76cef 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.h @@ -160,6 +160,7 @@ namespace Js static Var ToVar(double value); #else static JavascriptNumber* FromVar(Var aValue); + static JavascriptNumber* UnsafeFromVar(Var aValue); #endif private: diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.inl b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.inl index 51b34b559e4..80e563b4ad6 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.inl +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumber.inl @@ -168,6 +168,13 @@ namespace Js #endif inline JavascriptNumber* JavascriptNumber::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptNumber'"); + + return reinterpret_cast(aValue); + } + + inline JavascriptNumber* JavascriptNumber::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptNumber'"); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumberObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumberObject.cpp index ba729ac16dc..cae552183a2 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumberObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumberObject.cpp @@ -26,10 +26,17 @@ namespace Js } JavascriptNumberObject* JavascriptNumberObject::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptNumber'"); + + return static_cast(aValue); + } + + JavascriptNumberObject* JavascriptNumberObject::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptNumber'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptNumberObject::Unwrap() const diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumberObject.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumberObject.h index 5da38475726..461951eda6e 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumberObject.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptNumberObject.h @@ -20,6 +20,7 @@ namespace Js JavascriptNumberObject(Var value, DynamicType * type); static bool Is(Var aValue); static JavascriptNumberObject* FromVar(Var aValue); + static JavascriptNumberObject* UnsafeFromVar(Var aValue); double GetValue() const; void SetValue(Var value); Var Unwrap() const; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptObject.cpp index 7682e9aa1d1..3d50790a8e5 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptObject.cpp @@ -3,7 +3,6 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeLibraryPch.h" -#include "Types/NullTypeHandler.h" namespace Js { @@ -14,14 +13,12 @@ namespace Js ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); - AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); + AssertMsg(args.HasArg(), "Should always have implicit 'this'"); // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch. - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); if (args.Info.Count > 1) { @@ -98,9 +95,10 @@ namespace Js } const PropertyRecord* propertyRecord; - JavascriptConversion::ToPropertyKey(args[1], scriptContext, &propertyRecord); + PropertyString* propertyString; + JavascriptConversion::ToPropertyKey(args[1], scriptContext, &propertyRecord, &propertyString); - if (JavascriptOperators::HasOwnProperty(dynamicObject, propertyRecord->GetPropertyId(), scriptContext)) + if (JavascriptOperators::HasOwnProperty(dynamicObject, propertyRecord->GetPropertyId(), scriptContext, propertyString)) { return scriptContext->GetLibrary()->GetTrue(); } @@ -128,7 +126,7 @@ namespace Js if (args.Info.Count >= 2) { const PropertyRecord* propertyRecord; - JavascriptConversion::ToPropertyKey(args[1], scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(args[1], scriptContext, &propertyRecord, nullptr); PropertyId propertyId = propertyRecord->GetPropertyId(); PropertyDescriptor currentDescriptor; @@ -267,7 +265,7 @@ namespace Js } // Set to new prototype - if (object->IsExternal() || (DynamicType::Is(object->GetTypeId()) && (DynamicObject::FromVar(object))->IsCrossSiteObject())) + if (object->IsExternal() || (DynamicType::Is(object->GetTypeId()) && (DynamicObject::UnsafeFromVar(object))->IsCrossSiteObject())) { CrossSite::ForceCrossSiteThunkOnPrototypeChain(newPrototype); } @@ -357,6 +355,41 @@ namespace Js return ToStringHelper(args[0], scriptContext); } + Var JavascriptObject::GetToStringTagValue(RecyclableObject *thisArg, ScriptContext *scriptContext) + { + const PropertyId toStringTagId(PropertyIds::_symbolToStringTag); + PolymorphicInlineCache *cache = scriptContext->GetLibrary()->GetToStringTagCache(); + PropertyValueInfo info; + // We don't allow cache resizing, at least for the moment: it's more work, and since there's only one + // cache per script context, we can afford to create each cache with the maximum size. + PropertyValueInfo::SetCacheInfo(&info, nullptr, cache, false); + Var value; + if (CacheOperators::TryGetProperty< + true, // CheckLocal + true, // CheckProto + true, // CheckAccessor + true, // CheckMissing + true, // CheckPolymorphicInlineCache + true, // CheckTypePropertyCache + !PolymorphicInlineCache::IsPolymorphic, // IsInlineCacheAvailable + PolymorphicInlineCache::IsPolymorphic, // IsPolymorphicInlineCacheAvailable + false> // ReturnOperationInfo + (thisArg, false, thisArg, toStringTagId, &value, scriptContext, nullptr, &info)) + { + return value; + } + else + { +#if DBG_DUMP + if (PHASE_VERBOSE_TRACE1(Js::InlineCachePhase)) + { + CacheOperators::TraceCache(cache, _u("PatchGetValue"), toStringTagId, scriptContext, thisArg); + } +#endif + return JavascriptOperators::GetProperty(thisArg, thisArg, toStringTagId, scriptContext, &info); + } + } + // ES2017 19.1.3.6 Object.prototype.toString() JavascriptString* JavascriptObject::ToStringTagHelper(Var thisArg, ScriptContext *scriptContext, TypeId type) { @@ -365,19 +398,19 @@ namespace Js // 1. If the this value is undefined, return "[object Undefined]". if (type == TypeIds_Undefined) { - return library->CreateStringFromCppLiteral(_u("[object Undefined]")); + return library->GetObjectUndefinedDisplayString(); } // 2. If the this value is null, return "[object Null]". if (type == TypeIds_Null) { - return library->CreateStringFromCppLiteral(_u("[object Null]")); + return library->GetObjectNullDisplayString(); } // 3. Let O be ToObject(this value). - RecyclableObject *thisArgAsObject = RecyclableObject::FromVar(JavascriptOperators::ToObject(thisArg, scriptContext)); + RecyclableObject *thisArgAsObject = JavascriptOperators::ToObject(thisArg, scriptContext); // 15. Let tag be ? Get(O, @@toStringTag). - Var tag = JavascriptOperators::GetPropertyNoCache(thisArgAsObject, PropertyIds::_symbolToStringTag, scriptContext); // Let tag be the result of Get(O, @@toStringTag). + Var tag = JavascriptObject::GetToStringTagValue(thisArgAsObject, scriptContext); // 17. Return the String that is the result of concatenating "[object ", tag, and "]". auto buildToString = [&scriptContext](Var tag) { @@ -559,12 +592,12 @@ namespace Js RecyclableObject* obj = nullptr; if (args.Info.Count < 2) { - obj = RecyclableObject::FromVar(JavascriptOperators::ToObject(scriptContext->GetLibrary()->GetUndefined(), scriptContext)); + obj = JavascriptOperators::ToObject(scriptContext->GetLibrary()->GetUndefined(), scriptContext); } else { // Convert the argument to object first - obj = RecyclableObject::FromVar(JavascriptOperators::ToObject(args[1], scriptContext)); + obj = JavascriptOperators::ToObject(args[1], scriptContext); } // If the object is HostDispatch try to invoke the operation remotely @@ -585,11 +618,9 @@ namespace Js Var JavascriptObject::GetOwnPropertyDescriptorHelper(RecyclableObject* obj, Var propertyKey, ScriptContext* scriptContext) { const PropertyRecord* propertyRecord; - JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord, nullptr); PropertyId propertyId = propertyRecord->GetPropertyId(); - obj->ThrowIfCannotGetOwnPropertyDescriptor(propertyId); - PropertyDescriptor propertyDescriptor; BOOL isPropertyDescriptorDefined; isPropertyDescriptorDefined = JavascriptObject::GetOwnPropertyDescriptorHelper(obj, propertyId, scriptContext, propertyDescriptor); @@ -630,12 +661,12 @@ namespace Js if (args.Info.Count < 2) { - obj = RecyclableObject::FromVar(JavascriptOperators::ToObject(scriptContext->GetLibrary()->GetUndefined(), scriptContext)); + obj = JavascriptOperators::ToObject(scriptContext->GetLibrary()->GetUndefined(), scriptContext); } else { // Convert the argument to object first - obj = RecyclableObject::FromVar(JavascriptOperators::ToObject(args[1], scriptContext)); + obj = JavascriptOperators::ToObject(args[1], scriptContext); } // If the object is HostDispatch try to invoke the operation remotely @@ -665,7 +696,7 @@ namespace Js } PropertyRecord const * propertyRecord; - JavascriptConversion::ToPropertyKey(propKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(propKey, scriptContext, &propertyRecord, nullptr); Var newDescriptor = JavascriptObject::GetOwnPropertyDescriptorHelper(obj, propKey, scriptContext); if (!JavascriptOperators::IsUndefined(newDescriptor)) @@ -947,7 +978,7 @@ namespace Js CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(Object_Constructor_getOwnPropertyNames); Var tempVar = args.Info.Count < 2 ? scriptContext->GetLibrary()->GetUndefined() : args[1]; - RecyclableObject *object = RecyclableObject::FromVar(JavascriptOperators::ToObject(tempVar, scriptContext)); + RecyclableObject *object = JavascriptOperators::ToObject(tempVar, scriptContext); if (object->GetTypeId() == TypeIds_HostDispatch) { @@ -971,7 +1002,7 @@ namespace Js Assert(!(callInfo.Flags & CallFlags_New)); Var tempVar = args.Info.Count < 2 ? scriptContext->GetLibrary()->GetUndefined() : args[1]; - RecyclableObject *object = RecyclableObject::FromVar(JavascriptOperators::ToObject(tempVar, scriptContext)); + RecyclableObject *object = JavascriptOperators::ToObject(tempVar, scriptContext); if (object->GetTypeId() == TypeIds_HostDispatch) { @@ -996,7 +1027,7 @@ namespace Js CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(Object_Constructor_keys); Var tempVar = args.Info.Count < 2 ? scriptContext->GetLibrary()->GetUndefined() : args[1]; - RecyclableObject *object = RecyclableObject::FromVar(JavascriptOperators::ToObject(tempVar, scriptContext)); + RecyclableObject *object = JavascriptOperators::ToObject(tempVar, scriptContext); if (object->GetTypeId() == TypeIds_HostDispatch) { @@ -1028,7 +1059,7 @@ namespace Js PropertyDescriptor propertyDescriptor; - JavascriptConversion::ToPropertyKey(nextKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(nextKey, scriptContext, &propertyRecord, nullptr); propertyId = propertyRecord->GetPropertyId(); Assert(propertyId != Constants::NoProperty); @@ -1065,7 +1096,7 @@ namespace Js CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(Object_Constructor_values); Var tempVar = args.Info.Count < 2 ? scriptContext->GetLibrary()->GetUndefined() : args[1]; - RecyclableObject *object = RecyclableObject::FromVar(JavascriptOperators::ToObject(tempVar, scriptContext)); + RecyclableObject *object = JavascriptOperators::ToObject(tempVar, scriptContext); return GetValuesOrEntries(object, true /*valuesToReturn*/, scriptContext); } @@ -1081,7 +1112,7 @@ namespace Js CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(Object_Constructor_entries); Var tempVar = args.Info.Count < 2 ? scriptContext->GetLibrary()->GetUndefined() : args[1]; - RecyclableObject *object = RecyclableObject::FromVar(JavascriptOperators::ToObject(tempVar, scriptContext)); + RecyclableObject *object = JavascriptOperators::ToObject(tempVar, scriptContext); return GetValuesOrEntries(object, false /*valuesToReturn*/, scriptContext); } @@ -1225,7 +1256,7 @@ namespace Js Var propertyKey = args.Info.Count > 2 ? args[2] : obj->GetLibrary()->GetUndefined(); PropertyRecord const * propertyRecord; - JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord, nullptr); Var descVar = args.Info.Count > 3 ? args[3] : obj->GetLibrary()->GetUndefined(); PropertyDescriptor propertyDescriptor; @@ -1316,7 +1347,7 @@ namespace Js Var propertyKey = args.Info.Count > 1 ? args[1] : obj->GetLibrary()->GetUndefined(); const PropertyRecord* propertyRecord; - JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord, nullptr); PropertyDescriptor propertyDescriptor; propertyDescriptor.SetEnumerable(true); @@ -1357,7 +1388,7 @@ namespace Js Var propertyKey = args.Info.Count > 1 ? args[1] : obj->GetLibrary()->GetUndefined(); const PropertyRecord* propertyRecord; - JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord, nullptr); PropertyDescriptor propertyDescriptor; propertyDescriptor.SetEnumerable(true); @@ -1387,7 +1418,7 @@ namespace Js Var propertyKey = args.Info.Count > 1 ? args[1] : obj->GetLibrary()->GetUndefined(); const PropertyRecord* propertyRecord; - JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord, nullptr); Var getter = nullptr; Var unused = nullptr; @@ -1420,7 +1451,7 @@ namespace Js Var propertyKey = args.Info.Count > 1 ? args[1] : obj->GetLibrary()->GetUndefined(); const PropertyRecord* propertyRecord; - JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord, nullptr); Var unused = nullptr; Var setter = nullptr; @@ -1520,7 +1551,7 @@ namespace Js JavascriptStaticEnumerator enumerator; if (!from->GetEnumerator(&enumerator, EnumeratorFlags::SnapShotSemantics | EnumeratorFlags::EnumSymbols, scriptContext)) { - //nothing to enumerate, continue with the nextSource. + // Nothing to enumerate, continue with the nextSource. return; } @@ -1528,7 +1559,7 @@ namespace Js Var propValue = nullptr; JavascriptString * propertyName = nullptr; - //enumerate through each property of properties and fetch the property descriptor + // Enumerate through each property of properties and fetch the property descriptor while ((propertyName = enumerator.MoveAndGetNext(nextKey)) != NULL) { if (nextKey == Constants::NoProperty) @@ -1538,15 +1569,29 @@ namespace Js scriptContext->GetOrAddPropertyRecord(propertyName, &propertyRecord); nextKey = propertyRecord->GetPropertyId(); } + PropertyString * propertyString = PropertyString::TryFromVar(propertyName); + - if (!JavascriptOperators::GetOwnProperty(from, nextKey, &propValue, scriptContext)) + // If propertyName is a PropertyString* we can try getting the property from the inline cache to avoid having a full property lookup + // + // Whenever possible, our enumerator populates the cache, so we should generally get a cache hit here + PropertyValueInfo getPropertyInfo; + if (propertyString == nullptr || !propertyString->TryGetPropertyFromCache(from, from, &propValue, scriptContext, &getPropertyInfo)) { - JavascriptError::ThrowTypeError(scriptContext, JSERR_Operand_Invalid_NeedObject, _u("Object.assign")); + if (!JavascriptOperators::GetOwnProperty(from, nextKey, &propValue, scriptContext, &getPropertyInfo)) + { + JavascriptError::ThrowTypeError(scriptContext, JSERR_Operand_Invalid_NeedObject, _u("Object.assign")); + } } - if (!JavascriptOperators::SetProperty(to, to, nextKey, propValue, scriptContext, PropertyOperationFlags::PropertyOperation_ThrowIfNonWritable)) + // Similarly, try to set the property using our cache to avoid having to do the full work of SetProperty + PropertyValueInfo setPropertyInfo; + if (propertyString == nullptr || !propertyString->TrySetPropertyFromCache(to, propValue, scriptContext, PropertyOperation_ThrowIfNonWritable, &setPropertyInfo)) { - JavascriptError::ThrowTypeError(scriptContext, JSERR_Operand_Invalid_NeedObject, _u("Object.assign")); + if (!JavascriptOperators::SetProperty(to, to, nextKey, propValue, &setPropertyInfo, scriptContext, PropertyOperation_ThrowIfNonWritable)) + { + JavascriptError::ThrowTypeError(scriptContext, JSERR_Operand_Invalid_NeedObject, _u("Object.assign")); + } } } } @@ -1574,14 +1619,14 @@ namespace Js nextKey = keys->DirectGetItem(j); AssertMsg(JavascriptSymbol::Is(nextKey) || JavascriptString::Is(nextKey), "Invariant check during ownKeys proxy trap should make sure we only get property key here. (symbol or string primitives)"); // Spec doesn't strictly call for us to use ToPropertyKey but since we know nextKey is already a symbol or string primitive, ToPropertyKey will be a nop and return us the propertyRecord - JavascriptConversion::ToPropertyKey(nextKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(nextKey, scriptContext, &propertyRecord, nullptr); propertyId = propertyRecord->GetPropertyId(); AssertMsg(propertyId != Constants::NoProperty, "AssignForProxyObjects - OwnPropertyKeys returned a propertyId with value NoProperty."); if (JavascriptOperators::GetOwnPropertyDescriptor(from, propertyRecord->GetPropertyId(), scriptContext, &propertyDescriptor)) { if (propertyDescriptor.IsEnumerable()) { - if (!JavascriptOperators::GetOwnProperty(from, propertyId, &propValue, scriptContext)) + if (!JavascriptOperators::GetOwnProperty(from, propertyId, &propValue, scriptContext, nullptr)) { JavascriptError::ThrowTypeError(scriptContext, JSERR_Operand_Invalid_NeedObject, _u("Object.assign")); } @@ -1601,7 +1646,6 @@ namespace Js ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); - Recycler *recycler = scriptContext->GetRecycler(); CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(Object_Constructor_create) @@ -1613,18 +1657,15 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_FunctionArgument_NotObjectOrNull, _u("Object.create")); } - TypeId typeId = JavascriptOperators::GetTypeId(args[1]); - if (typeId != TypeIds_Null && !JavascriptOperators::IsObjectType(typeId)) + Var protoVar = args[1]; + if (!JavascriptOperators::IsObjectOrNull(protoVar)) { JavascriptError::ThrowTypeError(scriptContext, JSERR_FunctionArgument_NotObjectOrNull, _u("Object.create")); } - //Create a new DynamicType with first argument as prototype and non shared type - RecyclableObject *prototype = RecyclableObject::FromVar(args[1]); - DynamicType *objectType = DynamicType::New(scriptContext, TypeIds_Object, prototype, nullptr, NullTypeHandler::GetDefaultInstance(), false); + RecyclableObject* protoObj = RecyclableObject::FromVar(protoVar); + DynamicObject* object = function->GetLibrary()->CreateObject(protoObj); - //Create a new Object using this type. - DynamicObject* object = DynamicObject::New(recycler, objectType); JS_ETW(EventWriteJSCRIPT_RECYCLER_ALLOCATE_OBJECT(object)); #if ENABLE_DEBUG_CONFIG_OPTIONS if (Js::Configuration::Global.flags.IsEnabled(Js::autoProxyFlag)) @@ -1783,7 +1824,7 @@ namespace Js PropertyDescriptor propertyDescriptor; nextKey = keys->DirectGetItem(j); AssertMsg(JavascriptSymbol::Is(nextKey) || JavascriptString::Is(nextKey), "Invariant check during ownKeys proxy trap should make sure we only get property key here. (symbol or string primitives)"); - JavascriptConversion::ToPropertyKey(nextKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(nextKey, scriptContext, &propertyRecord, nullptr); propertyId = propertyRecord->GetPropertyId(); AssertMsg(propertyId != Constants::NoProperty, "DefinePropertiesHelper - OwnPropertyKeys returned a propertyId with value NoProperty."); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptObject.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptObject.h index eb318eb4afc..af38ff0b5b7 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptObject.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptObject.h @@ -120,5 +120,7 @@ namespace Js static Var DefinePropertiesHelperForGenericObjects(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext); static Var DefinePropertiesHelperForProxyObjects(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext); static bool IsPrototypeOf(RecyclableObject* proto, RecyclableObject* obj, ScriptContext* scriptContext); + + static Var GetToStringTagValue(RecyclableObject *thisArg, ScriptContext *scriptContext); }; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptPromise.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptPromise.cpp index 18f952e5882..27a33e62bcf 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptPromise.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptPromise.cpp @@ -31,10 +31,8 @@ namespace Js // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); AUTO_TAG_NATIVE_LIBRARY_ENTRY(function, callInfo, _u("Promise")); @@ -122,10 +120,17 @@ namespace Js } JavascriptPromise* JavascriptPromise::FromVar(Js::Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptPromise'"); + + return static_cast(aValue); + } + + JavascriptPromise* JavascriptPromise::UnsafeFromVar(Js::Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptPromise'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } BOOL JavascriptPromise::GetDiagValueString(StringBuilder* stringBuilder, ScriptContext* requestContext) @@ -817,7 +822,7 @@ namespace Js Var JavascriptPromise::CreateThenPromise(JavascriptPromise* sourcePromise, RecyclableObject* fulfillmentHandler, RecyclableObject* rejectionHandler, ScriptContext* scriptContext) { - Var constructor = JavascriptOperators::SpeciesConstructor(sourcePromise, scriptContext->GetLibrary()->GetPromiseConstructor(), scriptContext); + RecyclableObject* constructor = JavascriptOperators::SpeciesConstructor(sourcePromise, scriptContext->GetLibrary()->GetPromiseConstructor(), scriptContext); JavascriptPromiseCapability* promiseCapability = NewPromiseCapability(constructor, scriptContext); JavascriptPromiseReaction* resolveReaction = JavascriptPromiseReaction::New(promiseCapability, fulfillmentHandler, scriptContext); @@ -1128,14 +1133,7 @@ namespace Js { JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedFunction); } - CALL_FUNCTION(scriptContext->GetThreadContext(), RecyclableObject::FromVar(promiseThen), CallInfo(CallFlags_Value, 2), promise, successFunction); - - Var promiseCatch = JavascriptOperators::GetProperty(promise, PropertyIds::catch_, scriptContext); - if (!JavascriptConversion::IsCallable(promiseCatch)) - { - JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedFunction); - } - CALL_FUNCTION(scriptContext->GetThreadContext(), RecyclableObject::FromVar(promiseCatch), CallInfo(CallFlags_Value, 2), promise, failFunction); + CALL_FUNCTION(scriptContext->GetThreadContext(), RecyclableObject::FromVar(promiseThen), CallInfo(CallFlags_Value, 3), promise, successFunction, failFunction); } #if ENABLE_TTD @@ -1324,7 +1322,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -1334,6 +1332,13 @@ namespace Js } JavascriptPromiseResolveOrRejectFunction* JavascriptPromiseResolveOrRejectFunction::FromVar(Var var) + { + AssertOrFailFast(JavascriptPromiseResolveOrRejectFunction::Is(var)); + + return static_cast(var); + } + + JavascriptPromiseResolveOrRejectFunction* JavascriptPromiseResolveOrRejectFunction::UnsafeFromVar(Var var) { Assert(JavascriptPromiseResolveOrRejectFunction::Is(var)); @@ -1404,7 +1409,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -1414,12 +1419,20 @@ namespace Js } JavascriptPromiseAsyncSpawnExecutorFunction* JavascriptPromiseAsyncSpawnExecutorFunction::FromVar(Var var) + { + AssertOrFailFast(JavascriptPromiseAsyncSpawnExecutorFunction::Is(var)); + + return static_cast(var); + } + + JavascriptPromiseAsyncSpawnExecutorFunction* JavascriptPromiseAsyncSpawnExecutorFunction::UnsafeFromVar(Var var) { Assert(JavascriptPromiseAsyncSpawnExecutorFunction::Is(var)); return static_cast(var); } + JavascriptGenerator* JavascriptPromiseAsyncSpawnExecutorFunction::GetGenerator() { return this->generator; @@ -1433,18 +1446,28 @@ namespace Js #if ENABLE_TTD void JavascriptPromiseAsyncSpawnExecutorFunction::MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) { - TTDAssert(false, "Not Implemented Yet"); + if (this->generator != nullptr) + { + extractor->MarkVisitVar(this->generator); + } + + if (this->target != nullptr) + { + extractor->MarkVisitVar(this->target); + } } TTD::NSSnapObjects::SnapObjectType JavascriptPromiseAsyncSpawnExecutorFunction::GetSnapTag_TTD() const { - TTDAssert(false, "Not Implemented Yet"); - return TTD::NSSnapObjects::SnapObjectType::Invalid; + return TTD::NSSnapObjects::SnapObjectType::JavascriptPromiseAsyncSpawnExecutorFunction; } void JavascriptPromiseAsyncSpawnExecutorFunction::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) { - TTDAssert(false, "Not Implemented Yet"); + TTD::NSSnapObjects::SnapJavascriptPromiseAsyncSpawnExecutorFunctionInfo* info = alloc.SlabAllocateStruct(); + info->generator= TTD_CONVERT_VAR_TO_PTR_ID(this->generator); + info->target = TTD_CONVERT_JSVAR_TO_TTDVAR(this->target); + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, info); } #endif @@ -1456,7 +1479,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -1466,6 +1489,13 @@ namespace Js } JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction::FromVar(Var var) + { + AssertOrFailFast(JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction::Is(var)); + + return static_cast(var); + } + + JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction::UnsafeFromVar(Var var) { Assert(JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction::Is(var)); @@ -1500,18 +1530,105 @@ namespace Js #if ENABLE_TTD void JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction::MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) { - TTDAssert(false, "Not Implemented Yet"); + if (this->generator != nullptr) + { + extractor->MarkVisitVar(this->generator); + } + + if (this->reject != nullptr) + { + extractor->MarkVisitVar(this->reject); + } + + if (this->resolve != nullptr) + { + extractor->MarkVisitVar(this->resolve); + } + + if (this->argument != nullptr) + { + extractor->MarkVisitVar(this->argument); + } } TTD::NSSnapObjects::SnapObjectType JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction::GetSnapTag_TTD() const { - TTDAssert(false, "Not Implemented Yet"); - return TTD::NSSnapObjects::SnapObjectType::Invalid; + return TTD::NSSnapObjects::SnapObjectType::JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction; } void JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) { - TTDAssert(false, "Not Implemented Yet"); + TTD::NSSnapObjects::SnapJavascriptPromiseAsyncSpawnStepArgumentExecutorFunctionInfo* info = alloc.SlabAllocateStruct(); + info->generator = TTD_CONVERT_VAR_TO_PTR_ID(this->generator); + info->reject = this->reject; + info->resolve = this->resolve; + info->argument = this->argument; + info->isReject = this->isReject; + + info->entryPoint = 0; + JavascriptMethod entryPoint = this->GetFunctionInfo()->GetOriginalEntryPoint(); + if (entryPoint == JavascriptPromise::EntryJavascriptPromiseAsyncSpawnStepNextExecutorFunction) + { + info->entryPoint = 1; + } + else if (entryPoint == JavascriptPromise::EntryJavascriptPromiseAsyncSpawnStepThrowExecutorFunction) + { + info->entryPoint = 2; + } + else if (entryPoint == JavascriptPromise::EntryJavascriptPromiseAsyncSpawnCallStepExecutorFunction) + { + info->entryPoint = 3; + } + else + { + TTDAssert(false, "Unexpected entrypoint found JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction"); + } + + const uint32 maxDeps = 4; + uint32 depCount = 0; + TTD_PTR_ID* depArray = alloc.SlabReserveArraySpace(maxDeps); + if (this->reject != nullptr && TTD::JsSupport::IsVarComplexKind(this->reject)) + { + depArray[depCount] = TTD_CONVERT_VAR_TO_PTR_ID(this->reject); + depCount++; + } + + if (this->resolve != nullptr && TTD::JsSupport::IsVarComplexKind(this->resolve)) + { + depArray[depCount] = TTD_CONVERT_VAR_TO_PTR_ID(this->resolve); + depCount++; + } + + if (this->argument != nullptr && TTD::JsSupport::IsVarComplexKind(this->argument)) + { + depArray[depCount] = TTD_CONVERT_VAR_TO_PTR_ID(this->argument); + depCount++; + } + + if (this->generator != nullptr) + { + depArray[depCount] = TTD_CONVERT_VAR_TO_PTR_ID(this->generator); + depCount++; + } + + if (depCount > 0) + { + alloc.SlabCommitArraySpace(depCount, maxDeps); + } + else + { + alloc.SlabAbortArraySpace(maxDeps); + } + + if (depCount == 0) + { + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, info); + } + else + { + TTDAssert(depArray != nullptr, "depArray should be non-null if depCount is > 0"); + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, info, alloc, depCount, depArray); + } } #endif @@ -1523,7 +1640,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -1533,6 +1650,13 @@ namespace Js } JavascriptPromiseCapabilitiesExecutorFunction* JavascriptPromiseCapabilitiesExecutorFunction::FromVar(Var var) + { + AssertOrFailFast(JavascriptPromiseCapabilitiesExecutorFunction::Is(var)); + + return static_cast(var); + } + + JavascriptPromiseCapabilitiesExecutorFunction* JavascriptPromiseCapabilitiesExecutorFunction::UnsafeFromVar(Var var) { Assert(JavascriptPromiseCapabilitiesExecutorFunction::Is(var)); @@ -1775,7 +1899,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -1785,6 +1909,13 @@ namespace Js } JavascriptPromiseAllResolveElementFunction* JavascriptPromiseAllResolveElementFunction::FromVar(Var var) + { + AssertOrFailFast(JavascriptPromiseAllResolveElementFunction::Is(var)); + + return static_cast(var); + } + + JavascriptPromiseAllResolveElementFunction* JavascriptPromiseAllResolveElementFunction::UnsafeFromVar(Var var) { Assert(JavascriptPromiseAllResolveElementFunction::Is(var)); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptPromise.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptPromise.h index 8bbac581ded..ae3b6791eb8 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptPromise.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptPromise.h @@ -23,6 +23,7 @@ namespace Js inline static bool Is(Var var); inline static JavascriptPromiseResolveOrRejectFunction* FromVar(Var var); + inline static JavascriptPromiseResolveOrRejectFunction* UnsafeFromVar(Var var); JavascriptPromise* GetPromise(); bool IsRejectFunction(); @@ -54,6 +55,7 @@ namespace Js inline static bool Is(Var var); inline static JavascriptPromiseAsyncSpawnExecutorFunction* FromVar(Var var); + inline static JavascriptPromiseAsyncSpawnExecutorFunction* UnsafeFromVar(Var var); JavascriptGenerator* GetGenerator(); Var GetTarget(); @@ -82,6 +84,7 @@ namespace Js inline static bool Is(Var var); inline static JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* FromVar(Var var); + inline static JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* UnsafeFromVar(Var var); JavascriptGenerator* GetGenerator(); Var GetReject(); @@ -116,6 +119,7 @@ namespace Js inline static bool Is(Var var); inline static JavascriptPromiseCapabilitiesExecutorFunction* FromVar(Var var); + inline static JavascriptPromiseCapabilitiesExecutorFunction* UnsafeFromVar(Var var); JavascriptPromiseCapability* GetCapability(); @@ -146,7 +150,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -157,7 +161,7 @@ namespace Js inline static JavascriptPromiseResolveThenableTaskFunction* FromVar(Var var) { - Assert(JavascriptPromiseResolveThenableTaskFunction::Is(var)); + AssertOrFailFast(JavascriptPromiseResolveThenableTaskFunction::Is(var)); return static_cast(var); } @@ -196,7 +200,7 @@ namespace Js { if (JavascriptFunction::Is(var)) { - JavascriptFunction* obj = JavascriptFunction::FromVar(var); + JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var); return VirtualTableInfo::HasVirtualTable(obj) || VirtualTableInfo>::HasVirtualTable(obj); @@ -207,7 +211,7 @@ namespace Js inline static JavascriptPromiseReactionTaskFunction* FromVar(Var var) { - Assert(JavascriptPromiseReactionTaskFunction::Is(var)); + AssertOrFailFast(JavascriptPromiseReactionTaskFunction::Is(var)); return static_cast(var); } @@ -245,6 +249,7 @@ namespace Js inline static bool Is(Var var); inline static JavascriptPromiseAllResolveElementFunction* FromVar(Var var); + inline static JavascriptPromiseAllResolveElementFunction* UnsafeFromVar(Var var); JavascriptPromiseCapability* GetCapabilities(); uint32 GetIndex(); @@ -421,6 +426,7 @@ namespace Js static bool Is(Var aValue); static JavascriptPromise* FromVar(Js::Var aValue); + static JavascriptPromise* UnsafeFromVar(Js::Var aValue); static Var CreateRejectedPromise(Var resolution, ScriptContext* scriptContext, Var promiseConstructor = nullptr); static Var CreateResolvedPromise(Var resolution, ScriptContext* scriptContext, Var promiseConstructor = nullptr); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptProxy.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptProxy.cpp index 7d946e3e8da..9e5965b473b 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptProxy.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptProxy.cpp @@ -6,7 +6,12 @@ namespace Js { - BOOL JavascriptProxy::Is(Var obj) + BOOL JavascriptProxy::Is(_In_ RecyclableObject* obj) + { + return JavascriptOperators::GetTypeId(obj) == TypeIds_Proxy; + } + + BOOL JavascriptProxy::Is(_In_ Var obj) { return JavascriptOperators::GetTypeId(obj) == TypeIds_Proxy; } @@ -54,11 +59,8 @@ namespace Js // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch. - Var newTarget = args.Info.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - - bool isCtorSuperCall = (args.Info.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(args.Info.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::IsConstructorSuperCall(args); RecyclableObject* target, *handler; @@ -128,7 +130,7 @@ namespace Js JavascriptLibrary::EnumFunctionClass, RuntimeFunction, type, &EntryInfo::Revoke); - revoker->SetPropertyWithAttributes(Js::PropertyIds::length, Js::TaggedInt::ToVarUnchecked(0), PropertyNone, NULL); + revoker->SetPropertyWithAttributes(Js::PropertyIds::length, Js::TaggedInt::ToVarUnchecked(2), PropertyConfigurable, NULL); revoker->SetInternalProperty(Js::InternalPropertyIds::RevocableProxy, proxy, PropertyOperationFlags::PropertyOperation_Force, nullptr); DynamicObject* obj = scriptContext->GetLibrary()->CreateObject(true, 2); @@ -217,7 +219,7 @@ namespace Js Assert((static_cast(GetType()))->GetTypeHandler()->GetPropertyCount() == 0 || (static_cast(GetType()))->GetTypeHandler()->GetPropertyId(GetScriptContext(), 0) == InternalPropertyIds::WeakMapKeyMap); JavascriptFunction* gOPDMethod = GetMethodHelper(PropertyIds::getOwnPropertyDescriptor, requestContext); - Var getResult; + //7. If trap is undefined, then // a.Return the result of calling the[[GetOwnProperty]] internal method of target with argument P. if (nullptr == gOPDMethod || GetScriptContext()->IsHeapEnumInProgress()) @@ -227,21 +229,17 @@ namespace Js } PropertyId propertyId = getPropertyId(); - CallInfo callInfo(CallFlags_Value, 3); - Var varArgs[3]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - varArgs[2] = GetName(requestContext, propertyId); + Var propertyName = GetName(requestContext, propertyId); - Assert(JavascriptString::Is(varArgs[2]) || JavascriptSymbol::Is(varArgs[2])); + Assert(JavascriptString::Is(propertyName) || JavascriptSymbol::Is(propertyName)); //8. Let trapResultObj be the result of calling the[[Call]] internal method of trap with handler as the this value and a new List containing target and P. //9. ReturnIfAbrupt(trapResultObj). //10. If Type(trapResultObj) is neither Object nor Undefined, then throw a TypeError exception. - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - getResult = JavascriptFunction::FromVar(gOPDMethod)->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); + Var getResult = threadContext->ExecuteImplicitCall(gOPDMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, gOPDMethod, CallInfo(CallFlags_Value, 3), handlerObj, targetObj, propertyName); + }); TypeId getResultTypeId = JavascriptOperators::GetTypeId(getResult); if (StaticType::Is(getResultTypeId) && getResultTypeId != TypeIds_Undefined) @@ -339,7 +337,7 @@ namespace Js RecyclableObject *targetObj = this->MarshalTarget(requestContext); JavascriptFunction* getGetMethod = GetMethodHelper(PropertyIds::get, requestContext); - Var getGetResult; + if (nullptr == getGetMethod || requestContext->IsHeapEnumInProgress()) { propertyDescriptor->SetFromProxy(false); @@ -348,17 +346,12 @@ namespace Js PropertyId propertyId = getPropertyId(); propertyDescriptor->SetFromProxy(true); - CallInfo callInfo(CallFlags_Value, 4); - Var varArgs[4]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - varArgs[2] = GetName(requestContext, propertyId); - varArgs[3] = instance; + Var propertyName = GetName(requestContext, propertyId); - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - getGetResult = getGetMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); + Var getGetResult = threadContext->ExecuteImplicitCall(getGetMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, getGetMethod, CallInfo(CallFlags_Value, 4), handlerObj, targetObj, propertyName, instance); + }); // 9. Let targetDesc be the result of calling the[[GetOwnProperty]] internal method of target with argument P. // 10. ReturnIfAbrupt(targetDesc). @@ -425,23 +418,19 @@ namespace Js Js::RecyclableObject *targetObj = this->MarshalTarget(requestContext); JavascriptFunction* hasMethod = GetMethodHelper(PropertyIds::has, requestContext); - Var getHasResult; + if (nullptr == hasMethod || requestContext->IsHeapEnumInProgress()) { return fn(targetObj); } PropertyId propertyId = getPropertyId(); - CallInfo callInfo(CallFlags_Value, 3); - Var varArgs[3]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - varArgs[2] = GetName(requestContext, propertyId); + Var propertyName = GetName(requestContext, propertyId); - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - getHasResult = hasMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); + Var getHasResult = threadContext->ExecuteImplicitCall(hasMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, hasMethod, CallInfo(CallFlags_Value, 3), handlerObj, targetObj, propertyName); + }); //9. Let booleanTrapResult be ToBoolean(trapResult). //10. ReturnIfAbrupt(booleanTrapResult). @@ -587,7 +576,7 @@ namespace Js } return FALSE; } - + BOOL JavascriptProxy::GetAccessors(PropertyId propertyId, __out Var* getter, __out Var* setter, ScriptContext * requestContext) { PropertyDescriptor result; @@ -680,7 +669,7 @@ namespace Js } else { - // ES2017 Spec'ed (9.1.9.1): + // ES2017 Spec'd (9.1.9.1): // If existingDescriptor is not undefined, then // If IsAccessorDescriptor(existingDescriptor) is true, return false. // If existingDescriptor.[[Writable]] is false, return false. @@ -793,7 +782,7 @@ namespace Js //5. Let trap be the result of GetMethod(handler, "deleteProperty"). JavascriptFunction* deleteMethod = GetMethodHelper(PropertyIds::deleteProperty, requestContext); - Var deletePropertyResult; + //7. If trap is undefined, then //a.Return the result of calling the[[Delete]] internal method of target with argument P. Assert(!GetScriptContext()->IsHeapEnumInProgress()); @@ -813,16 +802,13 @@ namespace Js //9. Let booleanTrapResult be ToBoolean(trapResult). //10. ReturnIfAbrupt(booleanTrapResult). //11. If booleanTrapResult is false, then return false. - CallInfo callInfo(CallFlags_Value, 3); - Var varArgs[3]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - varArgs[2] = GetName(requestContext, propertyId); - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - deletePropertyResult = deleteMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); + Var propertyName = GetName(requestContext, propertyId); + + Var deletePropertyResult = threadContext->ExecuteImplicitCall(deleteMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, deleteMethod, CallInfo(CallFlags_Value, 3), handlerObj, targetObj, propertyName); + }); BOOL trapResult = JavascriptConversion::ToBoolean(deletePropertyResult, requestContext); if (!trapResult) @@ -859,11 +845,13 @@ namespace Js return TRUE; } +#if ENABLE_FIXED_FIELDS BOOL JavascriptProxy::IsFixedProperty(PropertyId propertyId) { // TODO: can we add support for fixed property? don't see a clear way to invalidate... return false; } +#endif PropertyQueryFlags JavascriptProxy::HasItemQuery(uint32 index) { @@ -1166,16 +1154,12 @@ namespace Js { return targetObj->IsExtensible(); } - CallInfo callInfo(CallFlags_Value, 2); - Var varArgs[2]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - Var isExtensibleResult = isExtensibleMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); - + + Var isExtensibleResult = threadContext->ExecuteImplicitCall(isExtensibleMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, isExtensibleMethod, CallInfo(CallFlags_Value, 2), handlerObj, targetObj); + }); + BOOL trapResult = JavascriptConversion::ToBoolean(isExtensibleResult, requestContext); BOOL targetIsExtensible = targetObj->IsExtensible(); if (trapResult != targetIsExtensible) @@ -1226,21 +1210,17 @@ namespace Js { return targetObj->PreventExtensions(); } - CallInfo callInfo(CallFlags_Value, 2); - Var varArgs[2]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - + //8. Let booleanTrapResult be ToBoolean(trapResult) //9. ReturnIfAbrupt(booleanTrapResult). //10. Let targetIsExtensible be the result of calling the[[IsExtensible]] internal method of target. //11. ReturnIfAbrupt(targetIsExtensible). //12. If booleanTrapResult is true and targetIsExtensible is true, then throw a TypeError exception. //13. Return booleanTrapResult. - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - Var preventExtensionsResult = preventExtensionsMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); + Var preventExtensionsResult = threadContext->ExecuteImplicitCall(preventExtensionsMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, preventExtensionsMethod, CallInfo(CallFlags_Value, 2), handlerObj, targetObj); + }); BOOL trapResult = JavascriptConversion::ToBoolean(preventExtensionsResult, requestContext); if (trapResult) @@ -1303,7 +1283,7 @@ namespace Js { itemVar = resultArray->DirectGetItem(i); AssertMsg(JavascriptSymbol::Is(itemVar) || JavascriptString::Is(itemVar), "Invariant check during ownKeys proxy trap should make sure we only get property key here. (symbol or string primitives)"); - JavascriptConversion::ToPropertyKey(itemVar, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(itemVar, scriptContext, &propertyRecord, nullptr); PropertyId propertyId = propertyRecord->GetPropertyId(); if (JavascriptObject::GetOwnPropertyDescriptorHelper(obj, propertyId, scriptContext, propertyDescriptor)) { @@ -1356,7 +1336,7 @@ namespace Js { itemVar = resultArray->DirectGetItem(i); AssertMsg(JavascriptSymbol::Is(itemVar) || JavascriptString::Is(itemVar), "Invariant check during ownKeys proxy trap should make sure we only get property key here. (symbol or string primitives)"); - JavascriptConversion::ToPropertyKey(itemVar, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(itemVar, scriptContext, &propertyRecord, nullptr); PropertyId propertyId = propertyRecord->GetPropertyId(); JavascriptObject::DefineOwnPropertyHelper(obj, propertyId, propertyDescriptor, scriptContext); } @@ -1384,7 +1364,7 @@ namespace Js { itemVar = resultArray->DirectGetItem(i); AssertMsg(JavascriptSymbol::Is(itemVar) || JavascriptString::Is(itemVar), "Invariant check during ownKeys proxy trap should make sure we only get property key here. (symbol or string primitives)"); - JavascriptConversion::ToPropertyKey(itemVar, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(itemVar, scriptContext, &propertyRecord, nullptr); PropertyId propertyId = propertyRecord->GetPropertyId(); PropertyDescriptor propertyDescriptor; if (JavascriptObject::GetOwnPropertyDescriptorHelper(obj, propertyId, scriptContext, propertyDescriptor)) @@ -1489,21 +1469,17 @@ namespace Js Js::RecyclableObject *targetObj = this->MarshalTarget(requestContext); JavascriptFunction* getPrototypeOfMethod = GetMethodHelper(PropertyIds::getPrototypeOf, requestContext); - Var getPrototypeOfResult; + if (nullptr == getPrototypeOfMethod || GetScriptContext()->IsHeapEnumInProgress()) { return RecyclableObject::FromVar(JavascriptObject::GetPrototypeOf(targetObj, requestContext)); } - CallInfo callInfo(CallFlags_Value, 2); - Var varArgs[2]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - getPrototypeOfResult = getPrototypeOfMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); - + + Var getPrototypeOfResult = threadContext->ExecuteImplicitCall(getPrototypeOfMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, getPrototypeOfMethod, CallInfo(CallFlags_Value, 2), handlerObj, targetObj); + }); + TypeId prototypeTypeId = JavascriptOperators::GetTypeId(getPrototypeOfResult); if (!JavascriptOperators::IsObjectType(prototypeTypeId) && prototypeTypeId != TypeIds_Null) { @@ -1583,16 +1559,11 @@ namespace Js return TRUE; } //8. Let trapResult be the result of calling the[[Call]] internal method of trap with handler as the this value and a new List containing target and V. - CallInfo callInfo(CallFlags_Value, 3); - Var varArgs[3]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - varArgs[2] = newPrototype; - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - Var setPrototypeResult = setPrototypeOfMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); + Var setPrototypeResult = threadContext->ExecuteImplicitCall(setPrototypeOfMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, setPrototypeOfMethod, CallInfo(CallFlags_Value, 3), handlerObj, targetObj, newPrototype); + }); //9. Let booleanTrapResult be ToBoolean(trapResult). //10. ReturnIfAbrupt(booleanTrapResult). @@ -1733,7 +1704,7 @@ namespace Js //7. If trap is undefined, then //a.Return the result of calling the[[DefineOwnProperty]] internal method of target with arguments P and Desc. JavascriptFunction* defineOwnPropertyMethod = proxy->GetMethodHelper(PropertyIds::defineProperty, requestContext); - Var definePropertyResult; + Assert(!requestContext->IsHeapEnumInProgress()); if (nullptr == defineOwnPropertyMethod) { @@ -1754,17 +1725,12 @@ namespace Js descVar = JavascriptOperators::FromPropertyDescriptor(descriptor, requestContext); } - CallInfo callInfo(CallFlags_Value, 4); - Var varArgs[4]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - varArgs[2] = GetName(requestContext, propId); - varArgs[3] = descVar; + Var propertyName = GetName(requestContext, propId); - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - definePropertyResult = defineOwnPropertyMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); + Var definePropertyResult = threadContext->ExecuteImplicitCall(defineOwnPropertyMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, defineOwnPropertyMethod, CallInfo(CallFlags_Value, 4), handlerObj, targetObj, propertyName, descVar); + }); BOOL defineResult = JavascriptConversion::ToBoolean(definePropertyResult, requestContext); if (!defineResult) @@ -1851,7 +1817,7 @@ namespace Js //7. If trap is undefined, then //a.Return the result of calling the[[Set]] internal method of target with arguments P, V, and Receiver. JavascriptFunction* setMethod = GetMethodHelper(PropertyIds::set, requestContext); - Var setPropertyResult; + Assert(!GetScriptContext()->IsHeapEnumInProgress()); if (nullptr == setMethod) { @@ -1882,7 +1848,7 @@ namespace Js return JavascriptOperators::SetPropertyWPCache(receiver, targetObj, propertyId, newValue, requestContext, PropertyOperationFlags::PropertyOperation_None, &propertyValueInfo); } default: - Assert(FALSE); + AnalysisAssert(FALSE); } } //8. Let trapResult be the result of calling the[[Call]] internal method of trap with handler as the this value and a new List containing target, P, V, and Receiver. @@ -1890,19 +1856,13 @@ namespace Js //10. ReturnIfAbrupt(booleanTrapResult). //11. If booleanTrapResult is false, then return false. - CallInfo callInfo(CallFlags_Value, 5); - Var varArgs[5]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - varArgs[2] = GetName(requestContext, propertyId); - varArgs[3] = newValue; - varArgs[4] = receiver; - - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - setPropertyResult = setMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); - + Var propertyName = GetName(requestContext, propertyId); + + Var setPropertyResult = threadContext->ExecuteImplicitCall(setMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, setMethod, CallInfo(CallFlags_Value, 5), handlerObj, targetObj, propertyName, newValue, receiver); + }); + BOOL setResult = JavascriptConversion::ToBoolean(setPropertyResult, requestContext); if (!setResult) { @@ -2099,9 +2059,9 @@ namespace Js ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); - BOOL hasOverridingNewTarget = callInfo.Flags & CallFlags_NewTarget; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && args[0] != nullptr && RecyclableObject::Is(args[0]); - bool isNewCall = callInfo.Flags & CallFlags_New || callInfo.Flags & CallFlags_NewTarget; + BOOL hasOverridingNewTarget = args.HasNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); + bool isNewCall = args.IsNewCall() || hasOverridingNewTarget; AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); if (!JavascriptProxy::Is(function)) @@ -2191,7 +2151,7 @@ namespace Js newValues = stackArgs; } - CallInfo calleeInfo((CallFlags)(args.Info.Flags), newCount); + CallInfo calleeInfo((CallFlags)(args.Info.Flags), args.Info.Count); if (isNewCall) { calleeInfo.Flags = (CallFlags)(calleeInfo.Flags | CallFlags_ExtraArg | CallFlags_NewTarget); @@ -2320,15 +2280,11 @@ namespace Js //12. ReturnIfAbrupt(extensibleTarget). //13. Let targetKeys be target.[[OwnPropertyKeys]](). //14. ReturnIfAbrupt(targetKeys). - CallInfo callInfo(CallFlags_Value, 2); - Var varArgs[2]; - Js::Arguments arguments(callInfo, varArgs); - varArgs[0] = handlerObj; - varArgs[1] = targetObj; - - Js::ImplicitCallFlags saveImplicitCallFlags = threadContext->GetImplicitCallFlags(); - Var ownKeysResult = ownKeysMethod->CallFunction(arguments); - threadContext->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | ImplicitCall_Accessor)); + + Var ownKeysResult = threadContext->ExecuteImplicitCall(ownKeysMethod, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, ownKeysMethod, CallInfo(CallFlags_Value, 2), handlerObj, targetObj); + }); if (!JavascriptOperators::IsObject(ownKeysResult)) { @@ -2463,7 +2419,7 @@ namespace Js { element = targetKeys->DirectGetItem(i); AssertMsg(JavascriptSymbol::Is(element) || JavascriptString::Is(element), "Invariant check during ownKeys proxy trap should make sure we only get property key here. (symbol or string primitives)"); - JavascriptConversion::ToPropertyKey(element, requestContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(element, requestContext, &propertyRecord, nullptr); propertyId = propertyRecord->GetPropertyId(); if (propertyId == Constants::NoProperty) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptProxy.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptProxy.h index 8efc64fa786..75e4ecfc84f 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptProxy.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptProxy.h @@ -50,8 +50,10 @@ namespace Js JavascriptProxy(DynamicType * type); JavascriptProxy(DynamicType * type, ScriptContext * scriptContext, RecyclableObject* target, RecyclableObject* handler); - static BOOL Is(Var obj); - static JavascriptProxy* FromVar(Var obj) { Assert(Is(obj)); return static_cast(obj); } + static BOOL Is(_In_ Var obj); + static BOOL Is(_In_ RecyclableObject* obj); + static JavascriptProxy* FromVar(Var obj) { AssertOrFailFast(Is(obj)); return static_cast(obj); } + static JavascriptProxy* UnsafeFromVar(Var obj) { Assert(Is(obj)); return static_cast(obj); } #ifndef IsJsDiag RecyclableObject* GetTarget(); RecyclableObject* GetHandler(); @@ -94,7 +96,9 @@ namespace Js virtual BOOL InitFuncScoped(PropertyId propertyId, Var value) override; virtual BOOL DeleteProperty(PropertyId propertyId, PropertyOperationFlags flags) override; virtual BOOL DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) override; +#if ENABLE_FIXED_FIELDS virtual BOOL IsFixedProperty(PropertyId propertyId) override; +#endif virtual PropertyQueryFlags HasItemQuery(uint32 index) override; virtual BOOL HasOwnItem(uint32 index) override; virtual PropertyQueryFlags GetItemQuery(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override; @@ -112,7 +116,6 @@ namespace Js virtual BOOL IsExtensible() override; virtual BOOL PreventExtensions() override; virtual void ThrowIfCannotDefineProperty(PropertyId propId, const PropertyDescriptor& descriptor) { } - virtual void ThrowIfCannotGetOwnPropertyDescriptor(PropertyId propId) {}; virtual BOOL GetDefaultPropertyDescriptor(PropertyDescriptor& descriptor) override; virtual BOOL Seal() override; virtual BOOL Freeze() override; @@ -168,15 +171,13 @@ namespace Js PropertyId propertyId; for (uint32 i = 0; i < len; i++) { - if (!JavascriptOperators::GetItem(trapResultArray, i, &element, scriptContext)) - continue; - - if (!(JavascriptString::Is(element) || JavascriptSymbol::Is(element))) + if (!JavascriptOperators::GetItem(trapResultArray, i, &element, scriptContext) || // missing + !(JavascriptString::Is(element) || JavascriptSymbol::Is(element))) // neither String nor Symbol { JavascriptError::ThrowTypeError(scriptContext, JSERR_InconsistentTrapResult, _u("ownKeys")); } - JavascriptConversion::ToPropertyKey(element, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(element, scriptContext, &propertyRecord, nullptr); propertyId = propertyRecord->GetPropertyId(); if (!targetToTrapResultMap.ContainsKey(propertyId)) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptReflect.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptReflect.cpp index 5cf781d7cfe..afa606e7484 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptReflect.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptReflect.cpp @@ -30,7 +30,7 @@ namespace Js propertyKey = args.Info.Count > 2 ? args[2] : undefinedValue; PropertyRecord const * propertyRecord; - JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord); + JavascriptConversion::ToPropertyKey(propertyKey, scriptContext, &propertyRecord, nullptr); attributes = args.Info.Count > 3 ? args[3] : undefinedValue; PropertyDescriptor propertyDescriptor; @@ -409,6 +409,7 @@ namespace Js } Var argArray = args.Info.Count > 2 ? args[2] : undefinedValue; + AnalysisAssert(argArray != nullptr); if (!(JavascriptOperators::IsObjectType(JavascriptOperators::GetTypeId(argArray)))) { JavascriptError::ThrowTypeError(scriptContext, JSERR_FunctionArgument_NeedArrayLike, _u("Reflect.construct")); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegExpConstructor.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegExpConstructor.cpp index 737155a9d88..48258af2d0e 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegExpConstructor.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegExpConstructor.cpp @@ -391,28 +391,30 @@ namespace Js BOOL JavascriptRegExpConstructor::DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) { - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (BuiltInPropertyRecords::input.Equals(propertyName) - || BuiltInPropertyRecords::$_.Equals(propertyName) - || BuiltInPropertyRecords::length.Equals(propertyName) - || BuiltInPropertyRecords::lastMatch.Equals(propertyName) - || BuiltInPropertyRecords::$Ampersand.Equals(propertyName) - || BuiltInPropertyRecords::lastParen.Equals(propertyName) - || BuiltInPropertyRecords::$Plus.Equals(propertyName) - || BuiltInPropertyRecords::leftContext.Equals(propertyName) - || BuiltInPropertyRecords::$BackTick.Equals(propertyName) - || BuiltInPropertyRecords::rightContext.Equals(propertyName) - || BuiltInPropertyRecords::$Tick.Equals(propertyName) - || BuiltInPropertyRecords::$1.Equals(propertyName) - || BuiltInPropertyRecords::$2.Equals(propertyName) - || BuiltInPropertyRecords::$3.Equals(propertyName) - || BuiltInPropertyRecords::$4.Equals(propertyName) - || BuiltInPropertyRecords::$5.Equals(propertyName) - || BuiltInPropertyRecords::$6.Equals(propertyName) - || BuiltInPropertyRecords::$7.Equals(propertyName) - || BuiltInPropertyRecords::$8.Equals(propertyName) - || BuiltInPropertyRecords::$9.Equals(propertyName) - || BuiltInPropertyRecords::index.Equals(propertyName)) + PropertyRecord const * propertyRecord = nullptr; + propertyNameString->GetScriptContext()->GetOrAddPropertyRecord(propertyNameString, &propertyRecord); + PropertyId propertyId = propertyRecord->GetPropertyId(); + + if (BuiltInPropertyRecords::input.Equals(propertyId) + || BuiltInPropertyRecords::$_.Equals(propertyId) + || BuiltInPropertyRecords::lastMatch.Equals(propertyId) + || BuiltInPropertyRecords::$Ampersand.Equals(propertyId) + || BuiltInPropertyRecords::lastParen.Equals(propertyId) + || BuiltInPropertyRecords::$Plus.Equals(propertyId) + || BuiltInPropertyRecords::leftContext.Equals(propertyId) + || BuiltInPropertyRecords::$BackTick.Equals(propertyId) + || BuiltInPropertyRecords::rightContext.Equals(propertyId) + || BuiltInPropertyRecords::$Tick.Equals(propertyId) + || BuiltInPropertyRecords::$1.Equals(propertyId) + || BuiltInPropertyRecords::$2.Equals(propertyId) + || BuiltInPropertyRecords::$3.Equals(propertyId) + || BuiltInPropertyRecords::$4.Equals(propertyId) + || BuiltInPropertyRecords::$5.Equals(propertyId) + || BuiltInPropertyRecords::$6.Equals(propertyId) + || BuiltInPropertyRecords::$7.Equals(propertyId) + || BuiltInPropertyRecords::$8.Equals(propertyId) + || BuiltInPropertyRecords::$9.Equals(propertyId) + || BuiltInPropertyRecords::index.Equals(propertyId)) { JavascriptError::ThrowCantDeleteIfStrictMode(flags, GetScriptContext(), propertyNameString->GetString()); return false; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegularExpression.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegularExpression.cpp index 3c7f6f18231..cc36ead90ee 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegularExpression.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegularExpression.cpp @@ -94,10 +94,17 @@ namespace Js } JavascriptRegExp* JavascriptRegExp::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptRegExp'"); + + return static_cast(aValue); + } + + JavascriptRegExp* JavascriptRegExp::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptRegExp'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } CharCount JavascriptRegExp::GetLastIndexProperty(RecyclableObject* instance, ScriptContext* scriptContext) @@ -177,15 +184,16 @@ namespace Js JavascriptRegExp* JavascriptRegExp::ToRegExp(Var var, PCWSTR varName, ScriptContext* scriptContext) { - if (JavascriptRegExp::Is(var)) + JavascriptRegExp * regExp = JavascriptOperators::TryFromVar(var); + if (regExp) { - return JavascriptRegExp::FromVar(var); + return regExp; } if (JavascriptOperators::GetTypeId(var) == TypeIds_HostDispatch) { TypeId remoteTypeId = TypeIds_Limit; - RecyclableObject* reclObj = RecyclableObject::FromVar(var); + RecyclableObject* reclObj = RecyclableObject::UnsafeFromVar(var); if (reclObj->GetRemoteTypeId(&remoteTypeId) && remoteTypeId == TypeIds_RegEx) { return static_cast(reclObj->GetRemoteObject()); @@ -212,13 +220,17 @@ namespace Js { return scriptContext->GetLibrary()->GetUndefinedDisplayString(); } - else if (JavascriptString::Is(args[1])) - { - return JavascriptString::FromVar(args[1]); - } else { - return JavascriptConversion::ToString(args[1], scriptContext); + JavascriptString *jsString = JavascriptOperators::TryFromVar(args[1]); + if (jsString) + { + return jsString; + } + else + { + return JavascriptConversion::ToString(args[1], scriptContext); + } } } @@ -240,10 +252,8 @@ namespace Js // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch. - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : function; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.HasNewTarget() ? args.Values[args.Info.Count] : function; + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); UnifiedRegex::RegexPattern* pattern = nullptr; UnifiedRegex::RegexPattern* splitPattern = nullptr; @@ -329,11 +339,7 @@ namespace Js UnifiedRegex::RegexPattern* JavascriptRegExp::CreatePattern(Var aValue, Var options, ScriptContext *scriptContext) { - UnifiedRegex::RegexPattern* pattern = nullptr; - - ENTER_PINNED_SCOPE(JavascriptString, strBody); - ENTER_PINNED_SCOPE(JavascriptString, strOptions); - strOptions = nullptr; + JavascriptString * strBody; if (JavascriptString::Is(aValue)) { @@ -353,6 +359,7 @@ namespace Js int cOpts = 0; const char16 *szOptions = nullptr; + JavascriptString * strOptions = nullptr; if (options != nullptr && !JavascriptOperators::IsUndefinedObject(options)) { if (JavascriptString::Is(options)) @@ -368,10 +375,7 @@ namespace Js cOpts = strOptions->GetLength(); } - pattern = RegexHelper::CompileDynamic(scriptContext, szRegex, cBody, szOptions, cOpts, false); - - LEAVE_PINNED_SCOPE(); //strOptions - LEAVE_PINNED_SCOPE(); //strBody + UnifiedRegex::RegexPattern* pattern = RegexHelper::CompileDynamic(scriptContext, szRegex, cBody, szOptions, cOpts, false); return pattern; } @@ -573,11 +577,7 @@ namespace Js else { //compile with a string - ENTER_PINNED_SCOPE(JavascriptString, strBody); - ENTER_PINNED_SCOPE(JavascriptString, strOptions); - strBody = nullptr; - strOptions = nullptr; - + JavascriptString * strBody; if (JavascriptString::Is(args[1])) { strBody = JavascriptString::FromVar(args[1]); @@ -596,6 +596,7 @@ namespace Js int cOpts = 0; const char16 *szOptions = nullptr; + JavascriptString * strOptions = nullptr; if (callInfo.Count > 2 && !JavascriptOperators::IsUndefinedObject(args[2])) { if (JavascriptString::Is(args[2])) @@ -612,9 +613,6 @@ namespace Js } pattern = RegexHelper::CompileDynamic(scriptContext, szRegex, cBody, szOptions, cOpts, false); - - LEAVE_PINNED_SCOPE(); //strOptions - LEAVE_PINNED_SCOPE(); //strBody } thisRegularExpression->SetPattern(pattern); @@ -872,8 +870,12 @@ namespace Js Var exec = JavascriptOperators::GetProperty(thisObj, PropertyIds::exec, scriptContext); if (JavascriptConversion::IsCallable(exec)) { - RecyclableObject* execFn = RecyclableObject::FromVar(exec); - Var result = CALL_FUNCTION(scriptContext->GetThreadContext(), execFn, CallInfo(CallFlags_Value, 2), thisObj, string); + RecyclableObject* execFn = RecyclableObject::UnsafeFromVar(exec); + ThreadContext * threadContext = scriptContext->GetThreadContext(); + Var result = threadContext->ExecuteImplicitCall(execFn, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(scriptContext->GetThreadContext(), execFn, CallInfo(CallFlags_Value, 2), thisObj, string); + }); if (!JavascriptOperators::IsObjectOrNull(result)) { @@ -1323,7 +1325,6 @@ namespace Js BOOL JavascriptRegExp::DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) { const ScriptConfiguration* scriptConfig = this->GetScriptContext()->GetConfig(); - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); #define DELETE_PROPERTY(ownProperty) \ if (ownProperty) \ @@ -1333,23 +1334,23 @@ namespace Js } \ return DynamicObject::DeleteProperty(propertyNameString, flags); - if (BuiltInPropertyRecords::lastIndex.Equals(propertyName)) + if (BuiltInPropertyRecords::lastIndex.Equals(propertyNameString)) { DELETE_PROPERTY(true); } - else if (BuiltInPropertyRecords::global.Equals(propertyName) - || BuiltInPropertyRecords::multiline.Equals(propertyName) - || BuiltInPropertyRecords::ignoreCase.Equals(propertyName) - || BuiltInPropertyRecords::source.Equals(propertyName) - || BuiltInPropertyRecords::options.Equals(propertyName)) + else if (BuiltInPropertyRecords::global.Equals(propertyNameString) + || BuiltInPropertyRecords::multiline.Equals(propertyNameString) + || BuiltInPropertyRecords::ignoreCase.Equals(propertyNameString) + || BuiltInPropertyRecords::source.Equals(propertyNameString) + || BuiltInPropertyRecords::options.Equals(propertyNameString)) { DELETE_PROPERTY(!scriptConfig->IsES6RegExPrototypePropertiesEnabled()); } - else if (BuiltInPropertyRecords::unicode.Equals(propertyName)) + else if (BuiltInPropertyRecords::unicode.Equals(propertyNameString)) { DELETE_PROPERTY(scriptConfig->IsES6UnicodeExtensionsEnabled() && !scriptConfig->IsES6RegExPrototypePropertiesEnabled()); } - else if (BuiltInPropertyRecords::sticky.Equals(propertyName)) + else if (BuiltInPropertyRecords::sticky.Equals(propertyNameString)) { DELETE_PROPERTY(scriptConfig->IsES6RegExStickyEnabled() && !scriptConfig->IsES6RegExPrototypePropertiesEnabled()); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegularExpression.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegularExpression.h index 0f4f2858e65..45ebe1ea1c2 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegularExpression.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptRegularExpression.h @@ -25,14 +25,13 @@ namespace Js // Initialization of this pattern is deferred until split() is called, or it's copied from another // RegExp object. Field(UnifiedRegex::RegexPattern*) splitPattern; - Field(Var) lastIndexVar; // null => must build lastIndexVar from current lastIndex public: - // Three states for lastIndex value: // 1. lastIndexVar has been updated, we must calculate lastIndex from it when we next need it static const CharCount NotCachedValue = (CharCount)-2; + private: // 2. ToNumber(lastIndexVar) yields +inf or -inf or an integer not in range [0, MaxCharCount] static const CharCount InvalidValue = CharCountFlag; @@ -124,6 +123,7 @@ namespace Js static bool Is(Var aValue); static bool IsRegExpLike(Var aValue, ScriptContext* scriptContext); static JavascriptRegExp* FromVar(Var aValue); + static JavascriptRegExp* UnsafeFromVar(Var aValue); static JavascriptRegExp* CreateRegEx(const char16* pSource, CharCount sourceLen, UnifiedRegex::RegexFlags flags, ScriptContext *scriptContext); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSet.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSet.cpp index 137b01b531d..8b53c04fe2a 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSet.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSet.cpp @@ -25,10 +25,17 @@ namespace Js } JavascriptSet* JavascriptSet::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSet'"); + + return static_cast(aValue); + } + + JavascriptSet* JavascriptSet::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSet'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } JavascriptSet::SetDataList::Iterator JavascriptSet::GetIterator() @@ -45,9 +52,8 @@ namespace Js JavascriptLibrary* library = scriptContext->GetLibrary(); AUTO_TAG_NATIVE_LIBRARY_ENTRY(function, callInfo, _u("Set")); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); CHAKRATEL_LANGSTATS_INC_DATACOUNT(ES6_Set); JavascriptSet* setObject = nullptr; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSet.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSet.h index a3e81a68e69..4c5451bbf23 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSet.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSet.h @@ -27,6 +27,7 @@ namespace Js static bool Is(Var aValue); static JavascriptSet* FromVar(Var aValue); + static JavascriptSet* UnsafeFromVar(Var aValue); void Add(Var value); void Clear(); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSetIterator.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSetIterator.cpp index e7cc55613b8..c9454400e56 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSetIterator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSetIterator.cpp @@ -22,10 +22,17 @@ namespace Js } JavascriptSetIterator* JavascriptSetIterator::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSetIterator'"); + + return static_cast(aValue); + } + + JavascriptSetIterator* JavascriptSetIterator::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSetIterator'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptSetIterator::EntryNext(RecyclableObject* function, CallInfo callInfo, ...) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSetIterator.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSetIterator.h index 10609cd042c..4106f3245c8 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSetIterator.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSetIterator.h @@ -28,6 +28,7 @@ namespace Js static bool Is(Var aValue); static JavascriptSetIterator* FromVar(Var aValue); + static JavascriptSetIterator* UnsafeFromVar(Var aValue); class EntryInfo { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool16x8.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool16x8.cpp index 10fb4735f98..8c923dbacce 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool16x8.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool16x8.cpp @@ -36,7 +36,7 @@ namespace Js JavascriptSIMDBool16x8* JavascriptSIMDBool16x8::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDBool16x8'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDBool16x8'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool32x4.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool32x4.cpp index 678bf63f3fa..12759b4ca41 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool32x4.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool32x4.cpp @@ -36,7 +36,7 @@ namespace Js JavascriptSIMDBool32x4* JavascriptSIMDBool32x4::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDBool32x4'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDBool32x4'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool8x16.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool8x16.cpp index b610bf3a4d0..e1bcbd3ba71 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool8x16.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdBool8x16.cpp @@ -39,7 +39,7 @@ namespace Js JavascriptSIMDBool8x16* JavascriptSIMDBool8x16::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDBool8x16'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDBool8x16'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdFloat32x4.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdFloat32x4.cpp index 3e9148bc6eb..fbb716a370f 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdFloat32x4.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdFloat32x4.cpp @@ -36,7 +36,7 @@ namespace Js JavascriptSIMDFloat32x4* JavascriptSIMDFloat32x4::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDFloat32x4'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDFloat32x4'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdFloat64x2.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdFloat64x2.cpp index f19ff0dfdda..78474172c6b 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdFloat64x2.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdFloat64x2.cpp @@ -25,7 +25,7 @@ namespace Js JavascriptSIMDFloat64x2* JavascriptSIMDFloat64x2::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDFloat64x2'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDFloat64x2'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt16x8.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt16x8.cpp index 3a972a19081..5d3b0ef3e44 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt16x8.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt16x8.cpp @@ -34,7 +34,7 @@ namespace Js JavascriptSIMDInt16x8* JavascriptSIMDInt16x8::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDInt16x8'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDInt16x8'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt32x4.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt32x4.cpp index c821a6b32fe..f65156f87c1 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt32x4.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt32x4.cpp @@ -36,7 +36,7 @@ namespace Js JavascriptSIMDInt32x4* JavascriptSIMDInt32x4::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDInt32x4'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDInt32x4'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt8x16.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt8x16.cpp index 548ec8ac748..08d64b9a360 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt8x16.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdInt8x16.cpp @@ -31,7 +31,7 @@ namespace Js JavascriptSIMDInt8x16* JavascriptSIMDInt8x16::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDInt8x16'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDInt8x16'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdObject.cpp index 1296dfcd89d..3a37d3ac6ef 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdObject.cpp @@ -78,7 +78,7 @@ namespace Js JavascriptSIMDObject* JavascriptSIMDObject::FromVar(Var aValue) { - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMD'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMD'"); return static_cast(RecyclableObject::FromVar(aValue)); } @@ -179,8 +179,8 @@ namespace Js newArgs[2] = args[2]; } - //Locale specifc seperator?? - JavascriptString *seperator = JavascriptString::NewWithSz(_u(", "), scriptContext); + //Locale specific separator?? + JavascriptString *separator = JavascriptString::NewWithSz(_u(", "), scriptContext); uint idx = 0; Var laneVar = nullptr; BEGIN_TEMP_ALLOCATOR(tempAllocator, scriptContext, _u("fromCodePoint")); @@ -198,7 +198,7 @@ namespace Js newArgs[0] = laneVar; JavascriptString *laneValue = JavascriptNumber::ToLocaleStringIntl(newArgs, newCallInfo, scriptContext); result = JavascriptString::Concat(result, laneValue); - result = JavascriptString::Concat(result, seperator); + result = JavascriptString::Concat(result, separator); } laneVar = JavascriptNumber::ToVarWithCheck(laneValues[idx], scriptContext); newArgs[0] = laneVar; @@ -212,7 +212,7 @@ namespace Js newArgs[0] = laneVar; JavascriptString *laneValue = JavascriptNumber::ToLocaleStringIntl(newArgs, newCallInfo, scriptContext); result = JavascriptString::Concat(result, laneValue); - result = JavascriptString::Concat(result, seperator); + result = JavascriptString::Concat(result, separator); } laneVar = JavascriptNumber::ToVar(static_cast(laneValues[idx]), scriptContext); newArgs[0] = laneVar; @@ -227,7 +227,7 @@ namespace Js newArgs[0] = laneVar; JavascriptString *laneValue = JavascriptNumber::ToLocaleStringIntl(newArgs, newCallInfo, scriptContext); result = JavascriptString::Concat(result, laneValue); - result = JavascriptString::Concat(result, seperator); + result = JavascriptString::Concat(result, separator); } laneVar = JavascriptNumber::ToVar(static_cast(laneValues[idx]), scriptContext); newArgs[0] = laneVar; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint16x8.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint16x8.cpp index 886300f50ac..d7b355ba9ca 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint16x8.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint16x8.cpp @@ -32,7 +32,7 @@ namespace Js JavascriptSIMDUint16x8* JavascriptSIMDUint16x8::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDUint16x8'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDUint16x8'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint32x4.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint32x4.cpp index be743adb3e5..d4cd4916ff5 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint32x4.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint32x4.cpp @@ -36,7 +36,7 @@ namespace Js JavascriptSIMDUint32x4* JavascriptSIMDUint32x4::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDUint32x4'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDUint32x4'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint8x16.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint8x16.cpp index 9419085ef4e..ed4ca2409a3 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint8x16.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSimdUint8x16.cpp @@ -32,7 +32,7 @@ namespace Js JavascriptSIMDUint8x16* JavascriptSIMDUint8x16::FromVar(Var aValue) { Assert(aValue); - AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDUint8x16'"); + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDUint8x16'"); return reinterpret_cast(aValue); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptString.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptString.cpp index 133adb8a5ae..6e3e416dade 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptString.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptString.cpp @@ -102,22 +102,11 @@ namespace Js return NewWithBuffer(content, GetBufferLength(content), scriptContext); } - JavascriptString* JavascriptString::NewWithArenaSz(__in_z const char16 * content, ScriptContext * scriptContext) - { - AssertMsg(content != nullptr, "NULL value passed to JavascriptString::New"); - return NewWithArenaBuffer(content, GetBufferLength(content), scriptContext); - } - JavascriptString* JavascriptString::NewWithBuffer(__in_ecount(cchUseLength) const char16 * content, charcount_t cchUseLength, ScriptContext * scriptContext) { return NewWithBufferT(content, cchUseLength, scriptContext); } - JavascriptString* JavascriptString::NewWithArenaBuffer(__in_ecount(cchUseLength) const char16* content, charcount_t cchUseLength, ScriptContext* scriptContext) - { - return NewWithBufferT(content, cchUseLength, scriptContext); - } - JavascriptString* JavascriptString::NewCopySz(__in_z const char16* content, ScriptContext* scriptContext) { return NewCopyBuffer(content, GetBufferLength(content), scriptContext); @@ -128,21 +117,6 @@ namespace Js return NewWithBufferT(content, cchUseLength, scriptContext); } - JavascriptString* JavascriptString::NewCopySzFromArena(__in_z const char16* content, - ScriptContext* scriptContext, ArenaAllocator *arena, charcount_t cchUseLength) - { - AssertMsg(content != nullptr, "NULL value passed to JavascriptString::New"); - - if (!cchUseLength) - { - cchUseLength = JavascriptString::GetBufferLength(content); - } - - char16* buffer = JavascriptString::AllocateAndCopySz(arena, content, cchUseLength); - return ArenaLiteralString::New(scriptContext->GetLibrary()->GetStringTypeStatic(), - buffer, cchUseLength, arena); - } - Var JavascriptString::NewInstance(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); @@ -154,20 +128,19 @@ namespace Js // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch. - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); JavascriptString* str; Var result; if (args.Info.Count > 1) { - if (JavascriptSymbol::Is(args[1]) && !(callInfo.Flags & CallFlags_New)) + JavascriptSymbol * symbol = JavascriptOperators::TryFromVar(args[1]); + if (symbol && !(callInfo.Flags & CallFlags_New)) { // By ES2015 21.1.1.1 step 2, calling the String constructor directly results in an explicit ToString, which does not throw. - return JavascriptSymbol::ToString(JavascriptSymbol::FromVar(args[1])->GetValue(), scriptContext); + return JavascriptSymbol::ToString(symbol->GetValue(), scriptContext); // Calling with new is an implicit ToString on the Symbol, resulting in a throw. For this case we can let JavascriptConversion handle the call. } str = JavascriptConversion::ToString(args[1], scriptContext); @@ -187,7 +160,7 @@ namespace Js } return isCtorSuperCall ? - JavascriptOperators::OrdinaryCreateFromConstructor(RecyclableObject::FromVar(newTarget), RecyclableObject::FromVar(result), nullptr, scriptContext) : + JavascriptOperators::OrdinaryCreateFromConstructor(RecyclableObject::FromVar(newTarget), RecyclableObject::UnsafeFromVar(result), nullptr, scriptContext) : result; } @@ -251,11 +224,31 @@ namespace Js return JavascriptOperators::GetTypeId(aValue) == TypeIds_String; } + Js::PropertyRecord const * JavascriptString::GetPropertyRecord(bool dontLookupFromDictionary) + { + if (dontLookupFromDictionary) + { + return nullptr; + } + + Js::PropertyRecord const * propertyRecord; + GetScriptContext()->GetOrAddPropertyRecord(GetString(), GetLength(), &propertyRecord); + + return propertyRecord; + } + JavascriptString* JavascriptString::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptString'"); + + return static_cast(aValue); + } + + JavascriptString* JavascriptString::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptString'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } charcount_t @@ -263,7 +256,7 @@ namespace Js { size_t cchActual = wcslen(content); -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) if (!IsValidCharCount(cchActual)) { // Limit javascript string to 31-bit length @@ -874,15 +867,11 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NullOrUndefined, _u("String.prototype.concat")); } - JavascriptString* pstr = nullptr; JavascriptString* accum = nullptr; for (uint index = 0; index < args.Info.Count; index++) { - if (JavascriptString::Is(args[index])) - { - pstr = JavascriptString::FromVar(args[index]); - } - else + JavascriptString * pstr = JavascriptOperators::TryFromVar(args[index]); + if (!pstr) { pstr = JavascriptConversion::ToString(args[index], scriptContext); } @@ -1060,10 +1049,8 @@ namespace Js // The indexOf function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method. // - int result = -1; - - ENTER_PINNED_SCOPE(JavascriptString, pThis); - ENTER_PINNED_SCOPE(JavascriptString, searchString); + JavascriptString * pThis; + JavascriptString * searchString; GetThisAndSearchStringArguments(args, scriptContext, apiNameForErrorMsg, &pThis, &searchString, isRegExpAnAllowedArg); @@ -1091,6 +1078,8 @@ namespace Js return position; } + int result = -1; + if (position < pThis->GetLengthAsSignedInt()) { const char16* searchStr = searchString->GetString(); @@ -1118,10 +1107,6 @@ namespace Js } } } - - LEAVE_PINNED_SCOPE(); // searchString - LEAVE_PINNED_SCOPE(); // pThis - return result; } @@ -1142,20 +1127,16 @@ namespace Js // 3. Let searchStr be ? ToString(searchString). // default search string if the search argument is not provided - ENTER_PINNED_SCOPE(JavascriptString, pThis); - ENTER_PINNED_SCOPE(JavascriptString, searchArg); - pThis = nullptr; - searchArg = nullptr; + + JavascriptString * pThis = nullptr; GetThisStringArgument(args, scriptContext, _u("String.prototype.lastIndexOf"), &pThis); + JavascriptString * searchArg = nullptr; if(args.Info.Count > 1) { - if (JavascriptString::Is(args[1])) - { - searchArg = JavascriptString::FromVar(args[1]); - } - else + searchArg = JavascriptOperators::TryFromVar(args[1]); + if (!searchArg) { searchArg = JavascriptConversion::ToString(args[1], scriptContext); } @@ -1256,10 +1237,6 @@ namespace Js } --currentPos; } - - LEAVE_PINNED_SCOPE(); //pThis - LEAVE_PINNED_SCOPE(); //searchArg - return JavascriptNumber::ToVar(-1, scriptContext); } @@ -1275,16 +1252,10 @@ namespace Js } AssertMsg(args.Info.Count > 0, "Negative argument count"); - JavascriptString * pThis; - if (JavascriptString::Is(args[0])) + JavascriptString * pThis = JavascriptOperators::TryFromVar(args[0]); + if (!pThis) { - pThis = JavascriptString::FromVar(args[0]); - } - else - { - pThis = JavascriptConversion::CoerseString(args[0], scriptContext , apiNameForErrorMsg); - } *ppThis = pThis; @@ -1307,13 +1278,13 @@ namespace Js { JavascriptError::ThrowTypeError(scriptContext, JSERR_FunctionArgument_FirstCannotBeRegExp, apiNameForErrorMsg); } - else if (JavascriptString::Is(args[1])) - { - pSearch = JavascriptString::FromVar(args[1]); - } else { - pSearch = JavascriptConversion::ToString(args[1], scriptContext); + pSearch = JavascriptOperators::TryFromVar(args[1]); + if (!pSearch) + { + pSearch = JavascriptConversion::ToString(args[1], scriptContext); + } } } @@ -1335,9 +1306,8 @@ namespace Js } AssertMsg(args.Info.Count > 0, "Negative argument count"); - Var resultVar = scriptContext->GetLibrary()->GetUndefined(); - ENTER_PINNED_SCOPE(JavascriptString, pThis); - ENTER_PINNED_SCOPE(JavascriptString, pThat); + JavascriptString * pThis; + JavascriptString * pThat; GetThisAndSearchStringArguments(args, scriptContext, _u("String.prototype.localeCompare"), &pThis, &pThat, true); @@ -1400,17 +1370,12 @@ namespace Js JavascriptError::ThrowRangeError(function->GetScriptContext(), VBSERR_InternalError /* TODO-ERROR: _u("Failed compare operation")*/ ); } - resultVar = JavascriptNumber::ToVar(result-2, scriptContext); + return JavascriptNumber::ToVar(result-2, scriptContext); #else // !ENABLE_GLOBALIZATION // no ICU / or external support for localization. Use c-lib const int result = wcscmp(pThisStr, pThatStr); - resultVar = JavascriptNumber::ToVar(result > 0 ? 1 : result == 0 ? 0 : -1, scriptContext); + return JavascriptNumber::ToVar(result > 0 ? 1 : result == 0 ? 0 : -1, scriptContext); #endif - - LEAVE_PINNED_SCOPE(); // pThat - LEAVE_PINNED_SCOPE(); // pThis - - return resultVar; } @@ -1468,12 +1433,8 @@ namespace Js if (args.Info.Count >= 2 && !(JavascriptOperators::IsUndefinedObject(args.Values[1]))) { - JavascriptString *formStr = nullptr; - if (JavascriptString::Is(args[1])) - { - formStr = JavascriptString::FromVar(args[1]); - } - else + JavascriptString *formStr = JavascriptOperators::TryFromVar(args[1]); + if (!formStr) { formStr = JavascriptConversion::ToString(args[1], scriptContext); } @@ -1784,7 +1745,7 @@ namespace Js Var JavascriptString::GetRegExSymbolFunction(Var regExp, PropertyId propertyId, ScriptContext* scriptContext) { return JavascriptOperators::GetPropertyNoCache( - RecyclableObject::FromVar(JavascriptOperators::ToObject(regExp, scriptContext)), + JavascriptOperators::ToObject(regExp, scriptContext), propertyId, scriptContext); } @@ -1797,7 +1758,7 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_FunctionArgument_Invalid, varName); } - RecyclableObject* fnObj = RecyclableObject::FromVar(fn); + RecyclableObject* fnObj = RecyclableObject::UnsafeFromVar(fn); return CallRegExFunction(fnObj, regExp, args, scriptContext); } @@ -1805,7 +1766,11 @@ namespace Js Var JavascriptString::CallRegExFunction<1>(RecyclableObject* fnObj, Var regExp, Arguments& args, ScriptContext *scriptContext) { // args[0]: String - return CALL_FUNCTION(scriptContext->GetThreadContext(), fnObj, CallInfo(CallFlags_Value, 2), regExp, args[0]); + ThreadContext * threadContext = scriptContext->GetThreadContext(); + return threadContext->ExecuteImplicitCall(fnObj, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, fnObj, CallInfo(CallFlags_Value, 2), regExp, args[0]); + }); } template<> @@ -1820,7 +1785,11 @@ namespace Js return CallRegExFunction<1>(fnObj, regExp, args, scriptContext); } - return CALL_FUNCTION(scriptContext->GetThreadContext(), fnObj, CallInfo(CallFlags_Value, 3), regExp, args[0], args[2]); + ThreadContext * threadContext = scriptContext->GetThreadContext(); + return threadContext->ExecuteImplicitCall(fnObj, ImplicitCall_Accessor, [=]()->Js::Var + { + return CALL_FUNCTION(threadContext, fnObj, CallInfo(CallFlags_Value, 3), regExp, args[0], args[2]); + }); } Var JavascriptString::EntrySlice(RecyclableObject* function, CallInfo callInfo, ...) @@ -1918,7 +1887,7 @@ namespace Js if (!scriptContext->GetConfig()->IsES6RegExSymbolsEnabled() && JavascriptRegExp::Is(args[1])) { - return RegexHelper::RegexSplit(scriptContext, JavascriptRegExp::FromVar(args[1]), input, limit, + return RegexHelper::RegexSplit(scriptContext, JavascriptRegExp::UnsafeFromVar(args[1]), input, limit, RegexHelper::IsResultNotUsed(callInfo.Flags)); } else @@ -2223,7 +2192,7 @@ namespace Js if (JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch) { Var result; - if (RecyclableObject::FromVar(args[0])->InvokeBuiltInOperationRemotely(EntryToString, args, &result)) + if (RecyclableObject::UnsafeFromVar(args[0])->InvokeBuiltInOperationRemotely(EntryToString, args, &result)) { return result; } @@ -2528,14 +2497,11 @@ namespace Js Assert(currentString->GetLength() > 0); Assert(count > 0); - charcount_t finalBufferCount = 0; - char16* buffer = nullptr; - EnterPinnedScope((volatile void**)& currentString); const char16* currentRawString = currentString->GetString(); charcount_t currentLength = currentString->GetLength(); - finalBufferCount = UInt32Math::Add(UInt32Math::Mul(count, currentLength), 1); - buffer = RecyclerNewArrayLeaf(scriptContext->GetRecycler(), char16, finalBufferCount); + charcount_t finalBufferCount = UInt32Math::Add(UInt32Math::Mul(count, currentLength), 1); + char16* buffer = RecyclerNewArrayLeaf(scriptContext->GetRecycler(), char16, finalBufferCount); if (currentLength == 1) { @@ -2558,8 +2524,6 @@ namespace Js *bufferDst = '\0'; } - LeavePinnedScope(); // currentString - return JavascriptString::NewWithBuffer(buffer, finalBufferCount - 1, scriptContext); } @@ -2714,7 +2678,7 @@ namespace Js if (JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch) { Var result; - if (RecyclableObject::FromVar(args[0])->InvokeBuiltInOperationRemotely(EntryValueOf, args, &result)) + if (RecyclableObject::UnsafeFromVar(args[0])->InvokeBuiltInOperationRemotely(EntryValueOf, args, &result)) { return result; } @@ -3154,11 +3118,8 @@ namespace Js charcount_t cchPropertyValue; charcount_t cchTotalChars; charcount_t ich; - JavascriptString * resultString = nullptr; - ENTER_PINNED_SCOPE(JavascriptString, pThis); - ENTER_PINNED_SCOPE(JavascriptString, pPropertyValue); - pThis = nullptr; - pPropertyValue = nullptr; + JavascriptString * pThis = nullptr; + JavascriptString * pPropertyValue = nullptr; const char16 * propertyValueStr = nullptr; uint quotesCount = 0; const char16 quotStr[] = _u("""); @@ -3198,11 +3159,8 @@ namespace Js } } - if (JavascriptString::Is(args[0])) - { - pThis = JavascriptString::FromVar(args[0]); - } - else + pThis = JavascriptOperators::TryFromVar(args[0]); + if (!pThis) { pThis = JavascriptConversion::ToString(args[0], scriptContext); } @@ -3218,11 +3176,8 @@ namespace Js // Need one string argument. if (args.Info.Count >= 2) { - if (JavascriptString::Is(args[1])) - { - pPropertyValue = JavascriptString::FromVar(args[1]); - } - else + pPropertyValue = JavascriptOperators::TryFromVar(args[1]); + if (!pPropertyValue) { pPropertyValue = JavascriptConversion::ToString(args[1], scriptContext); } @@ -3363,24 +3318,15 @@ namespace Js // Assert we ended at the right place. AssertMsg((charcount_t)(pResult - builder.DangerousGetWritableBuffer()) == cchTotalChars, "Exceeded allocated string limit"); - resultString = builder.ToString(); - - LEAVE_PINNED_SCOPE(); // pThis - LEAVE_PINNED_SCOPE(); // pPropertyValue - - return resultString; + return builder.ToString(); } Var JavascriptString::ToLocaleCaseHelper(Var thisObj, bool toUpper, ScriptContext *scriptContext) { using namespace PlatformAgnostic::UnicodeText; - JavascriptString * resultString = nullptr; - ENTER_PINNED_SCOPE(JavascriptString, pThis); - if (JavascriptString::Is(thisObj)) - { - pThis = JavascriptString::FromVar(thisObj); - } - else + JavascriptString * pThis = JavascriptOperators::TryFromVar(thisObj); + + if (!pThis) { pThis = JavascriptConversion::ToString(thisObj, scriptContext); } @@ -3414,11 +3360,7 @@ namespace Js Throw::InternalError(); } - resultString = builder.ToString(); - - LEAVE_PINNED_SCOPE(); // pThis - - return resultString; + return builder.ToString(); } int JavascriptString::IndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, charcount_t len, const char16* searchStr, int searchLen, int position) @@ -3567,16 +3509,6 @@ namespace Js { uint i; - // We want to pin the strings string and substring because flattening of any of these strings could cause a GC and result in the other string getting collected if it was optimized - // away by the compiler. We would normally have called the EnterPinnedScope/LeavePinnedScope methods here but it adds extra call instructions to the assembly code. As Equals - // methods could get called a lot of times this can show up as regressions in benchmarks. - volatile Js::JavascriptString** keepAliveString1 = (volatile Js::JavascriptString**)& string; - volatile Js::JavascriptString** keepAliveString2 = (volatile Js::JavascriptString**)& substring; - auto keepAliveLambda = [&]() { - UNREFERENCED_PARAMETER(keepAliveString1); - UNREFERENCED_PARAMETER(keepAliveString2); - }; - const char16 *stringOrig = string->GetString(); uint stringLenOrig = string->GetLength(); const char16 *stringSz = stringOrig + start; @@ -3630,8 +3562,8 @@ namespace Js uint string1Len = string1->GetLength(); uint string2Len = string2->GetLength(); - // We want to pin the strings string1 and string2 because flattening of any of these strings could cause a GC and result in the other string getting collected if it was optimized - // away by the compiler. We would normally have called the EnterPinnedScope/LeavePinnedScope methods here but it adds extra call instructions to the assembly code. As Equals + // We want to pin the strings string1 and string2 because flattening of any of these strings could cause a GC and result in the other string getting collected if it was optimized + // away by the compiler. We would normally have called the EnterPinnedScope/LeavePinnedScope methods here but it adds extra call instructions to the assembly code. As Equals // methods could get called a lot of times this can show up as regressions in benchmarks. volatile Js::JavascriptString** keepAliveString1 = (volatile Js::JavascriptString**)& string1; volatile Js::JavascriptString** keepAliveString2 = (volatile Js::JavascriptString**)& string2; @@ -3939,8 +3871,7 @@ namespace Js BOOL JavascriptString::DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags propertyOperationFlags) { - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (BuiltInPropertyRecords::length.Equals(propertyName)) + if (BuiltInPropertyRecords::length.Equals(propertyNameString)) { JavascriptError::ThrowCantDeleteIfStrictMode(propertyOperationFlags, this->GetScriptContext(), propertyNameString->GetString()); @@ -3981,8 +3912,8 @@ namespace Js if (aLeft == aRight) return true; - T *leftString = T::FromVar(aLeft); - T *rightString = T::FromVar(aRight); + T *leftString = T::UnsafeFromVar(aLeft); + T *rightString = T::UnsafeFromVar(aRight); // methods could get called a lot of times this can show up as regressions in benchmarks. volatile T** keepAliveLeftString = (volatile T**)& leftString; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptString.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptString.h index 1abf69e5e46..a10c7488272 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptString.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptString.h @@ -29,24 +29,6 @@ namespace Js bool IsValidCharCount(size_t charCount); const charcount_t k_InvalidCharCount = static_cast(-1); - - // - // To inspect strings in hybrid debugging, we use vtable lookup to find out concrete string type - // then inspect string content accordingly. - // - // To ensure all known string vtables are listed and exported from chakra.dll and handler class - // exists in chakradiag.dll, declare an abstract method in base JavascriptString class. Any concrete - // subclass that has runtime string instance must DECLARE_CONCRETE_STRING_CLASS, otherwise - // we'll get a compile time error. - // -#if DBG && defined(NTBUILD) -#define DECLARE_CONCRETE_STRING_CLASS_BASE virtual void _declareConcreteStringClass() = 0 -#define DECLARE_CONCRETE_STRING_CLASS virtual void _declareConcreteStringClass() override -#else -#define DECLARE_CONCRETE_STRING_CLASS_BASE -#define DECLARE_CONCRETE_STRING_CLASS -#endif - class JavascriptString _ABSTRACT : public RecyclableObject { friend Lowerer; @@ -68,6 +50,8 @@ namespace Js BOOL GetItemAt(charcount_t idxChar, Var* value); char16 GetItem(charcount_t index); + virtual Js::PropertyRecord const * GetPropertyRecord(bool dontLookupFromDictionary = false); + _Ret_range_(m_charLength, m_charLength) charcount_t GetLength() const; virtual size_t GetAllocatedByteCount() const; virtual bool IsSubstring() const; @@ -142,6 +126,7 @@ namespace Js static bool Is(Var aValue); static JavascriptString* FromVar(Var aValue); + static JavascriptString* UnsafeFromVar(Var aValue); static bool Equals(Var aLeft, Var aRight); static bool LessThan(Var aLeft, Var aRight); static bool IsNegZero(JavascriptString *string); @@ -174,7 +159,6 @@ namespace Js JavascriptString(StaticType * type); JavascriptString(StaticType * type, charcount_t charLength, const char16* szValue); DEFINE_VTABLE_CTOR_ABSTRACT(JavascriptString, RecyclableObject); - DECLARE_CONCRETE_STRING_CLASS_BASE; void SetLength(charcount_t newLength); void SetBuffer(const char16* buffer); @@ -192,11 +176,6 @@ namespace Js static JavascriptString* NewCopySz(__in_z const char16* content, ScriptContext* scriptContext); static JavascriptString* NewCopyBuffer(__in_ecount(charLength) const char16* content, charcount_t charLength, ScriptContext* scriptContext); - static JavascriptString* NewWithArenaSz(__in_z const char16 * content, ScriptContext* scriptContext); - static JavascriptString* NewWithArenaBuffer(__in_ecount(charLength) const char16 * content, charcount_t charLength, ScriptContext * scriptContext); - - static JavascriptString* NewCopySzFromArena(__in_z const char16* content, ScriptContext* scriptContext, ArenaAllocator *arena, charcount_t cchUseLength = 0); - static __ecount(length+1) char16* AllocateLeafAndCopySz(__in Recycler* recycler, __in_ecount(length) const char16* content, charcount_t length); static __ecount(length+1) char16* AllocateAndCopySz(__in ArenaAllocator* arena, __in_ecount(length) const char16* content, charcount_t length); static void CopyHelper(__out_ecount(countNeeded) char16 *dst, __in_ecount(countNeeded) const char16 * str, charcount_t countNeeded); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringIterator.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringIterator.cpp index 9a37d0f673c..de9d18c745a 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringIterator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringIterator.cpp @@ -21,10 +21,17 @@ namespace Js } JavascriptStringIterator* JavascriptStringIterator::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptStringIterator'"); + + return static_cast(aValue); + } + + JavascriptStringIterator* JavascriptStringIterator::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptStringIterator'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptStringIterator::EntryNext(RecyclableObject* function, CallInfo callInfo, ...) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringIterator.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringIterator.h index 89e0d1ace76..bf3ae4b0f9f 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringIterator.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringIterator.h @@ -21,6 +21,7 @@ namespace Js static bool Is(Var aValue); static JavascriptStringIterator* FromVar(Var aValue); + static JavascriptStringIterator* UnsafeFromVar(Var aValue); class EntryInfo { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringObject.cpp index 003e98e5337..577bd526013 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringObject.cpp @@ -43,10 +43,17 @@ namespace Js } JavascriptStringObject* JavascriptStringObject::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptString'"); + + return static_cast(aValue); + } + + JavascriptStringObject* JavascriptStringObject::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptString'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } void JavascriptStringObject::Initialize(JavascriptString* value) @@ -335,8 +342,7 @@ namespace Js BOOL JavascriptStringObject::DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags propertyOperationFlags) { - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (BuiltInPropertyRecords::length.Equals(propertyName)) + if (BuiltInPropertyRecords::length.Equals(propertyNameString)) { JavascriptError::ThrowCantDeleteIfStrictMode(propertyOperationFlags, this->GetScriptContext(), propertyNameString->GetString()); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringObject.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringObject.h index 1bb72345526..3c2f57a00fc 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringObject.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptStringObject.h @@ -29,6 +29,7 @@ namespace Js JavascriptStringObject(JavascriptString* value, DynamicType * type); static bool Is(Var aValue); static JavascriptStringObject* FromVar(Var aValue); + static JavascriptStringObject* UnsafeFromVar(Var aValue); void Initialize(JavascriptString* value); JavascriptString* Unwrap() { return InternalUnwrap(); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbol.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbol.cpp index bc99268bf8f..871d039e4c2 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbol.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbol.cpp @@ -12,10 +12,17 @@ namespace Js } JavascriptSymbol* JavascriptSymbol::FromVar(Js::Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSymbol'"); + + return static_cast(aValue); + } + + JavascriptSymbol* JavascriptSymbol::UnsafeFromVar(Js::Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSymbol'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptSymbol::NewInstance(RecyclableObject* function, CallInfo callInfo, ...) @@ -30,10 +37,7 @@ namespace Js // SkipDefaultNewObject function flag should have prevented the default object from // being created, except when call true a host dispatch. - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr - || JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch); + JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); if (callInfo.Flags & CallFlags_New) { @@ -116,11 +120,10 @@ namespace Js AssertMsg(args.Info.Count, "Should always have implicit 'this'."); ScriptContext* scriptContext = function->GetScriptContext(); JavascriptLibrary* library = scriptContext->GetLibrary(); - const Js::PropertyRecord* propertyRecord = nullptr; Assert(!(callInfo.Flags & CallFlags_New)); - ENTER_PINNED_SCOPE(JavascriptString, key); + JavascriptString* key; if (args.Info.Count > 1) { @@ -134,7 +137,7 @@ namespace Js // Search the global symbol registration map for a symbol with description equal to the string key. // The map can only have one symbol with that description so if we found a symbol, that is the registered // symbol for the string key. - propertyRecord = scriptContext->GetThreadContext()->GetSymbolFromRegistrationMap(key->GetString(), key->GetLength()); + const Js::PropertyRecord* propertyRecord = scriptContext->GetThreadContext()->GetSymbolFromRegistrationMap(key->GetString(), key->GetLength()); // If we didn't find a PropertyRecord in the map, we'll create a new symbol with description equal to the key string. // This is the only place we add new PropertyRecords to the map, so we should never have multiple PropertyRecords in the @@ -144,8 +147,6 @@ namespace Js propertyRecord = scriptContext->GetThreadContext()->AddSymbolToRegistrationMap(key->GetString(), key->GetLength()); } - LEAVE_PINNED_SCOPE(); // key - Assert(propertyRecord != nullptr); return library->CreateSymbol(propertyRecord); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbol.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbol.h index b0596b7ab19..ee8b725ea17 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbol.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbol.h @@ -22,6 +22,7 @@ namespace Js static bool Is(Var aValue); static JavascriptSymbol* FromVar(Var aValue); + static JavascriptSymbol* UnsafeFromVar(Var aValue); class EntryInfo { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbolObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbolObject.cpp index 66912045a90..6dcf8cd76e9 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbolObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbolObject.cpp @@ -18,10 +18,17 @@ namespace Js } JavascriptSymbolObject* JavascriptSymbolObject::FromVar(Js::Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptSymbolObject'"); + + return static_cast(aValue); + } + + JavascriptSymbolObject* JavascriptSymbolObject::UnsafeFromVar(Js::Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSymbolObject'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } BOOL JavascriptSymbolObject::GetDiagValueString(StringBuilder* stringBuilder, ScriptContext* requestContext) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbolObject.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbolObject.h index 607f99ea28d..3ddea70e968 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbolObject.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptSymbolObject.h @@ -18,6 +18,7 @@ namespace Js JavascriptSymbolObject(JavascriptSymbol* value, DynamicType * type); static bool Is(Var aValue); static JavascriptSymbolObject* FromVar(Js::Var aValue); + static JavascriptSymbolObject* UnsafeFromVar(Js::Var aValue); inline const PropertyRecord* GetValue() { diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptTypedNumber.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptTypedNumber.h index 583dd65597b..0575918d075 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptTypedNumber.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptTypedNumber.h @@ -33,6 +33,14 @@ namespace Js static JavascriptTypedNumber* FromVar(Var value) { + AssertOrFailFastMsg(JavascriptOperators::GetTypeId(value) == TypeIds_Int64Number || + JavascriptOperators::GetTypeId(value) == TypeIds_UInt64Number, "invalid typed number"); + + return static_cast*>(value); + }; + + static JavascriptTypedNumber* UnsafeFromVar(Var value) + { #if DBG AssertMsg(JavascriptOperators::GetTypeId(value) == TypeIds_Int64Number || JavascriptOperators::GetTypeId(value) == TypeIds_UInt64Number, "invalid typed number"); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptVariantDate.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptVariantDate.cpp index bfd9cc907c3..bab70b7c749 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptVariantDate.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptVariantDate.cpp @@ -12,10 +12,17 @@ namespace Js } JavascriptVariantDate* JavascriptVariantDate::FromVar(Js::Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptVariantDate'"); + + return static_cast(aValue); + } + + JavascriptVariantDate* JavascriptVariantDate::UnsafeFromVar(Js::Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptVariantDate'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptVariantDate::GetTypeOfString(ScriptContext* requestContext) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptVariantDate.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptVariantDate.h index a94aed9a726..daced6d87f5 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptVariantDate.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptVariantDate.h @@ -27,6 +27,7 @@ namespace Js static bool Is(Var aValue); static JavascriptVariantDate* FromVar(Var aValue); + static JavascriptVariantDate* UnsafeFromVar(Var aValue); // Used for making function calls to external objects requiring string params. JavascriptString* GetValueString(ScriptContext* scriptContext); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakMap.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakMap.cpp index 21b1a760557..0ce2fbec28b 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakMap.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakMap.cpp @@ -18,10 +18,17 @@ namespace Js } JavascriptWeakMap* JavascriptWeakMap::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptWeakMap'"); + + return static_cast(aValue); + } + + JavascriptWeakMap* JavascriptWeakMap::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptWeakMap'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(RecyclableObject::UnsafeFromVar(aValue)); } JavascriptWeakMap::WeakMapKeyMap* JavascriptWeakMap::GetWeakMapKeyMapFromKey(RecyclableObject* key) const @@ -78,9 +85,8 @@ namespace Js ScriptContext* scriptContext = function->GetScriptContext(); JavascriptLibrary* library = scriptContext->GetLibrary(); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); CHAKRATEL_LANGSTATS_INC_DATACOUNT(ES6_WeakMap); JavascriptWeakMap* weakMapObject = nullptr; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakMap.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakMap.h index 6a5ad0b51ed..d62b77581e5 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakMap.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakMap.h @@ -62,6 +62,7 @@ namespace Js static bool Is(Var aValue); static JavascriptWeakMap* FromVar(Var aValue); + static JavascriptWeakMap* UnsafeFromVar(Var aValue); void Clear(); bool Delete(RecyclableObject* key); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakSet.cpp b/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakSet.cpp index 2dddb836107..4724b5a229b 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakSet.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakSet.cpp @@ -18,10 +18,17 @@ namespace Js } JavascriptWeakSet* JavascriptWeakSet::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptWeakSet'"); + + return static_cast(aValue); + } + + JavascriptWeakSet* JavascriptWeakSet::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptWeakSet'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } Var JavascriptWeakSet::NewInstance(RecyclableObject* function, CallInfo callInfo, ...) @@ -32,9 +39,8 @@ namespace Js ScriptContext* scriptContext = function->GetScriptContext(); JavascriptLibrary* library = scriptContext->GetLibrary(); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); CHAKRATEL_LANGSTATS_INC_DATACOUNT(ES6_WeakSet); JavascriptWeakSet* weakSetObject = nullptr; diff --git a/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakSet.h b/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakSet.h index 873dea709f9..618286fc315 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakSet.h +++ b/deps/chakrashim/core/lib/Runtime/Library/JavascriptWeakSet.h @@ -21,6 +21,7 @@ namespace Js static bool Is(Var aValue); static JavascriptWeakSet* FromVar(Var aValue); + static JavascriptWeakSet* UnsafeFromVar(Var aValue); void Add(RecyclableObject* key); bool Delete(RecyclableObject* key); diff --git a/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/GenByteCode.cmd b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/GenByteCode.cmd new file mode 100644 index 00000000000..5adecde4b10 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/GenByteCode.cmd @@ -0,0 +1,85 @@ +::------------------------------------------------------------------------------------------------------- +:: Copyright (C) Microsoft. All rights reserved. +:: Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +::------------------------------------------------------------------------------------------------------- + +@echo off +setlocal +set _HASERROR=0 +set _binary=ch.exe +set _BuildDir=%~dp0..\..\..\..\Build + +if "%_FILE%" == "" ( + set "_FILE=%~dp0*.js" +) + +:ContinueArgParse +if not [%1]==[] ( + if [%1]==[-nojit] ( + set _suffix=.nojit + goto :ContinueArgParseEnd + ) + if [%1]==[-binary] ( + if [%2]==[] ( + echo Error: no argument supplied to -binary. Exiting ... + exit /b 1 + ) + set _binary=%2 + shift + goto :ContinueArgParseEnd + ) + if [%1]==[-bindir] ( + if [%2]==[] ( + echo Error: no argument supplied to -bindir. Exiting ... + exit /b 1 + ) + set _BinLocation=%2 + shift + goto :ContinueArgParseEnd + ) + + :ContinueArgParseEnd + shift + goto :ContinueArgParse +) + +:: This script will expect %_binary% to be built for x86_debug and x64_debug + +if "%OutBaseDir%" NEQ "" ( + set _BinLocation=%OutBaseDir%\Chakra.Core%_suffix%\bin +) +if "%_BinLocation%"=="" ( + set _BinLocation=%_BuildDir%\VcBuild%_suffix%\bin +) + +if not exist %_BinLocation%\x86_debug\%_binary% ( + echo Error: %_BinLocation%\x86_debug\%_binary% not found, please build sources. Exiting ... + exit /b 1 +) + +if not exist %_BinLocation%\x64_debug\%_binary% ( + echo Error: %_BinLocation%\x64_debug\%_binary% not found, please build sources. Exiting ... + exit /b 1 +) + +for %%i in (%_FILE%) do ( + call :GenerateLibraryByteCodeHeader %%i +) +exit /B %_HASERROR% + +:GenerateLibraryBytecodeHeader + +echo Generating %1%_suffix%.bc.32b.h +call :Generate %1 %_BinLocation%\x86_debug %1%_suffix%.bc.32b.h +echo Generating %1%_suffix%.bc.64b.h +call :Generate %1 %_BinLocation%\x64_debug %1%_suffix%.bc.64b.h +exit /B 0 + +:Generate +%2\%_binary% -GenerateLibraryByteCodeHeader:%3 -JsBuiltIn -LdChakraLib %1 +if "%errorlevel%" NEQ "0" ( + echo %1: Error generating bytecode file. Ensure %3 writable. + set _HASERROR=1 +) else ( + echo Bytecode generated. Please rebuild to incorporate the new bytecode. +) diff --git a/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js new file mode 100644 index 00000000000..3248767739d --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js @@ -0,0 +1,127 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +"use strict"; + +(function (intrinsic) { + var platform = intrinsic.JsBuiltIn; + + let FunctionsEnum = { + ArrayValues: { className: "Array", methodName: "values", argumentsCount: 0, forceInline: true /*optional*/, alias: "Symbol.iterator" }, + ArrayKeys: { className: "Array", methodName: "keys", argumentsCount: 0, forceInline: true /*optional*/ }, + ArrayEntries: { className: "Array", methodName: "entries", argumentsCount: 0, forceInline: true /*optional*/ } + }; + + var setPrototype = platform.builtInSetPrototype; + var _objectDefineProperty = platform.builtInJavascriptObjectEntryDefineProperty; + + // Object's getter and setter can get overriden on the prototype, in that case while setting the value attributes, we will end up with TypeError + // So, we need to set the prototype of attributes to null + var ObjectDefineProperty = function (obj, prop, attributes) { + _objectDefineProperty(obj, prop, setPrototype(attributes, null)); + }; + var CreateObject = platform.builtInJavascriptObjectCreate; + + platform.registerChakraLibraryFunction("ArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + __chakraLibrary.InitInternalProperties(this, 4, "__$arrayObj$__", "__$nextIndex$__", "__$kind$__", "__$internalDone$__"); + this.__$arrayObj$__ = arrayObj; + this.__$nextIndex$__ = 0; + this.__$kind$__ = iterationKind; + this.__$internalDone$__ = false; // We use this additional property to enable hoisting load of arrayObj outside the loop, we write to this property instead of the arrayObj + }); + + // ArrayIterator's prototype is the C++ Iterator, which is also the prototype for StringIterator, MapIterator etc + var iteratorPrototype = platform.GetIteratorPrototype(); + // Establish prototype chain here + __chakraLibrary.ArrayIterator.prototype = CreateObject(iteratorPrototype); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, 'next', + { + value: function () { + "use strict"; + let o = this; + + if (!(o instanceof __chakraLibrary.ArrayIterator)) { + throw new TypeError("Array Iterator.prototype.next: 'this' is not an Array Iterator object"); + } + + let a = o.__$arrayObj$__; + let value, done; + + if (o.__$internalDone$__ === true) { + value = undefined; + done = true; + } else { + let index = o.__$nextIndex$__; + let len = __chakraLibrary.isArray(a) ? a.length : __chakraLibrary.GetLength(a); + + if (index < len) { // < comparison should happen instead of >= , because len can be NaN + let itemKind = o.__$kind$__; + + o.__$nextIndex$__ = index + 1; + + if (itemKind === 1 /*ArrayIterationKind.Value*/) { + value = a[index]; + } else if (itemKind === 0 /*ArrayIterationKind.Key*/) { // TODO (megupta) : Use clean enums here ? + value = index; + } else { + let elementKey = index; + let elementValue = a[index]; + value = [elementKey, elementValue]; + } + done = false; + } else { + o.__$internalDone$__ = true; + value = undefined; + done = true; + } + } + return { value: value, done: done }; + }, + writable: true, + enumerable: false, + configurable: true + } + ); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, Symbol.toStringTag, { value: "Array Iterator", writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'length', { value: 0, writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'name', { value: "next", writable: false, enumerable: false, configurable: true }); + + platform.registerChakraLibraryFunction("CreateArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + return new __chakraLibrary.ArrayIterator(arrayObj, iterationKind); + }); + + platform.registerFunction(FunctionsEnum.ArrayKeys, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.keys: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 0 /* ArrayIterationKind.Key*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayValues, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.values: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 1 /* ArrayIterationKind.Value*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayEntries, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.entries: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 2 /* ArrayIterationKind.KeyAndValue*/); + }); +}); \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.bc.32b.h b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.bc.32b.h new file mode 100644 index 00000000000..0a584607f08 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.bc.32b.h @@ -0,0 +1,443 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#if 0 +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +"use strict"; + +(function (intrinsic) { + var platform = intrinsic.JsBuiltIn; + + let FunctionsEnum = { + ArrayValues: { className: "Array", methodName: "values", argumentsCount: 0, forceInline: true /*optional*/, alias: "Symbol.iterator" }, + ArrayKeys: { className: "Array", methodName: "keys", argumentsCount: 0, forceInline: true /*optional*/ }, + ArrayEntries: { className: "Array", methodName: "entries", argumentsCount: 0, forceInline: true /*optional*/ } + }; + + var setPrototype = platform.builtInSetPrototype; + var _objectDefineProperty = platform.builtInJavascriptObjectEntryDefineProperty; + + // Object's getter and setter can get overriden on the prototype, in that case while setting the value attributes, we will end up with TypeError + // So, we need to set the prototype of attributes to null + var ObjectDefineProperty = function (obj, prop, attributes) { + _objectDefineProperty(obj, prop, setPrototype(attributes, null)); + }; + var CreateObject = platform.builtInJavascriptObjectCreate; + + platform.registerChakraLibraryFunction("ArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + __chakraLibrary.InitInternalProperties(this, 4, "__$arrayObj$__", "__$nextIndex$__", "__$kind$__", "__$internalDone$__"); + this.__$arrayObj$__ = arrayObj; + this.__$nextIndex$__ = 0; + this.__$kind$__ = iterationKind; + this.__$internalDone$__ = false; // We use this additional property to enable hoisting load of arrayObj outside the loop, we write to this property instead of the arrayObj + }); + + // ArrayIterator's prototype is the C++ Iterator, which is also the prototype for StringIterator, MapIterator etc + var iteratorPrototype = platform.GetIteratorPrototype(); + // Establish prototype chain here + __chakraLibrary.ArrayIterator.prototype = CreateObject(iteratorPrototype); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, 'next', + { + value: function () { + "use strict"; + let o = this; + + if (!(o instanceof __chakraLibrary.ArrayIterator)) { + throw new TypeError("Array Iterator.prototype.next: 'this' is not an Array Iterator object"); + } + + let a = o.__$arrayObj$__; + let value, done; + + if (o.__$internalDone$__ === true) { + value = undefined; + done = true; + } else { + let index = o.__$nextIndex$__; + let len = __chakraLibrary.isArray(a) ? a.length : __chakraLibrary.GetLength(a); + + if (index < len) { // < comparison should happen instead of >= , because len can be NaN + let itemKind = o.__$kind$__; + + o.__$nextIndex$__ = index + 1; + + if (itemKind === 1 /*ArrayIterationKind.Value*/) { + value = a[index]; + } else if (itemKind === 0 /*ArrayIterationKind.Key*/) { // TODO (megupta) : Use clean enums here ? + value = index; + } else { + let elementKey = index; + let elementValue = a[index]; + value = [elementKey, elementValue]; + } + done = false; + } else { + o.__$internalDone$__ = true; + value = undefined; + done = true; + } + } + return { value: value, done: done }; + }, + writable: true, + enumerable: false, + configurable: true + } + ); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, Symbol.toStringTag, { value: "Array Iterator", writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'length', { value: 0, writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'name', { value: "next", writable: false, enumerable: false, configurable: true }); + + platform.registerChakraLibraryFunction("CreateArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + return new __chakraLibrary.ArrayIterator(arrayObj, iterationKind); + }); + + platform.registerFunction(FunctionsEnum.ArrayKeys, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.keys: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 0 /* ArrayIterationKind.Key*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayValues, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.values: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 1 /* ArrayIterationKind.Value*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayEntries, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.entries: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 2 /* ArrayIterationKind.KeyAndValue*/); + }); +}); +#endif +namespace Js +{ + const char Library_Bytecode_JsBuiltIn[] = { +/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x0E, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, +/* 00000020 */ 0x8F, 0x17, 0xFE, 0x8F, 0x17, 0x31, 0x00, 0x00, 0x00, 0xAC, 0x05, 0x00, 0x00, 0xAA, 0x07, 0x00, +/* 00000030 */ 0x00, 0x25, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x1E, 0x01, 0x00, 0x00, +/* 00000040 */ 0x01, 0x36, 0x01, 0x00, 0x00, 0x00, 0x4A, 0x01, 0x00, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x00, +/* 00000050 */ 0x6C, 0x01, 0x00, 0x00, 0x00, 0x7A, 0x01, 0x00, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x00, 0xB0, +/* 00000060 */ 0x01, 0x00, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0x00, 0xDC, 0x01, 0x00, 0x00, 0x01, 0xF0, 0x01, +/* 00000070 */ 0x00, 0x00, 0x00, 0xFA, 0x01, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x24, 0x02, 0x00, +/* 00000080 */ 0x00, 0x01, 0x40, 0x02, 0x00, 0x00, 0x00, 0x4A, 0x02, 0x00, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, +/* 00000090 */ 0x00, 0x68, 0x02, 0x00, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x00, +/* 000000A0 */ 0xB6, 0x02, 0x00, 0x00, 0x00, 0xC4, 0x02, 0x00, 0x00, 0x00, 0xCE, 0x02, 0x00, 0x00, 0x01, 0xF6, +/* 000000B0 */ 0x02, 0x00, 0x00, 0x01, 0x10, 0x03, 0x00, 0x00, 0x01, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x66, 0x03, +/* 000000C0 */ 0x00, 0x00, 0x01, 0x84, 0x03, 0x00, 0x00, 0x01, 0xA4, 0x03, 0x00, 0x00, 0x01, 0xBA, 0x03, 0x00, +/* 000000D0 */ 0x00, 0x01, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x6C, 0x04, 0x00, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, +/* 000000E0 */ 0x00, 0xDA, 0x04, 0x00, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0xAC, 0x05, 0x00, 0x00, 0x00, +/* 000000F0 */ 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x63, 0x00, +/* 00000100 */ 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, +/* 00000110 */ 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x41, 0x00, +/* 00000120 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, +/* 00000130 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x73, 0x00, 0x73, 0x00, +/* 00000140 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00000150 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, +/* 00000160 */ 0x64, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, +/* 00000170 */ 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, +/* 00000180 */ 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x73, 0x00, 0x43, 0x00, 0x6F, 0x00, +/* 00000190 */ 0x75, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x63, 0x00, +/* 000001A0 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000001B0 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x73, 0x00, 0x00, 0x00, 0x53, 0x00, 0x79, 0x00, +/* 000001C0 */ 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000001D0 */ 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, +/* 000001E0 */ 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 000001F0 */ 0x6B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00000200 */ 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, +/* 00000210 */ 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, +/* 00000220 */ 0x73, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, +/* 00000230 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00000240 */ 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000250 */ 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, +/* 00000260 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 00000270 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 00000280 */ 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000290 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 000002A0 */ 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000002B0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, +/* 000002C0 */ 0x68, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, +/* 000002D0 */ 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000002E0 */ 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000002F0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000300 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00000310 */ 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, +/* 00000320 */ 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00000330 */ 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, +/* 00000340 */ 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, +/* 00000350 */ 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00000360 */ 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00000370 */ 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x24, 0x00, 0x5F, 0x00, +/* 00000380 */ 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, +/* 00000390 */ 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x24, 0x00, 0x5F, 0x00, +/* 000003A0 */ 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x6B, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 000003B0 */ 0x64, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, +/* 000003C0 */ 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 000003D0 */ 0x44, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, +/* 000003E0 */ 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, +/* 000003F0 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00000400 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000410 */ 0x2E, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, +/* 00000420 */ 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00000430 */ 0x20, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x20, 0x00, +/* 00000440 */ 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, +/* 00000450 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6F, 0x00, +/* 00000460 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x6F, 0x00, +/* 00000470 */ 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00000480 */ 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, +/* 00000490 */ 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x3A, 0x00, +/* 000004A0 */ 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, +/* 000004B0 */ 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, +/* 000004C0 */ 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, +/* 000004D0 */ 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000004E0 */ 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000004F0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000500 */ 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, +/* 00000510 */ 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, +/* 00000520 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, +/* 00000530 */ 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00000540 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00000550 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000560 */ 0x2E, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00000570 */ 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, +/* 00000580 */ 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 00000590 */ 0x20, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, +/* 000005A0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, +/* 000005B0 */ 0x00, 0x6A, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, +/* 000005C0 */ 0x00, 0x70, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x7F, 0x01, 0x00, 0x00, 0x97, 0x01, 0x00, +/* 000005D0 */ 0x00, 0xBF, 0x01, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xDA, 0x01, 0x00, 0x00, 0x6A, 0x02, 0x00, +/* 000005E0 */ 0x00, 0xDC, 0x02, 0x00, 0x00, 0x53, 0x03, 0x00, 0x00, 0x5A, 0x03, 0x00, 0x00, 0x5B, 0x03, 0x00, +/* 000005F0 */ 0x00, 0x90, 0x03, 0x00, 0x00, 0xE5, 0x03, 0x00, 0x00, 0xE6, 0x03, 0x00, 0x00, 0x7B, 0x04, 0x00, +/* 00000600 */ 0x00, 0xB9, 0x04, 0x00, 0x00, 0xFB, 0x04, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, 0x4C, 0x05, 0x00, +/* 00000610 */ 0x00, 0x8B, 0x05, 0x00, 0x00, 0x8C, 0x05, 0x00, 0x00, 0xED, 0x05, 0x00, 0x00, 0x03, 0x06, 0x00, +/* 00000620 */ 0x00, 0x85, 0x06, 0x00, 0x00, 0xAD, 0x06, 0x00, 0x00, 0xCF, 0x06, 0x00, 0x00, 0xF8, 0x06, 0x00, +/* 00000630 */ 0x00, 0xAC, 0x07, 0x00, 0x00, 0xB4, 0x07, 0x00, 0x00, 0xB5, 0x07, 0x00, 0x00, 0x2B, 0x08, 0x00, +/* 00000640 */ 0x00, 0x68, 0x08, 0x00, 0x00, 0x8E, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0xDE, 0x08, 0x00, +/* 00000650 */ 0x00, 0x28, 0x09, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, +/* 00000660 */ 0x00, 0x8F, 0x09, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0xD5, 0x09, 0x00, 0x00, 0x47, 0x0A, 0x00, +/* 00000670 */ 0x00, 0x59, 0x0A, 0x00, 0x00, 0x5A, 0x0A, 0x00, 0x00, 0x84, 0x0A, 0x00, 0x00, 0xA5, 0x0A, 0x00, +/* 00000680 */ 0x00, 0xA6, 0x0A, 0x00, 0x00, 0xDB, 0x0A, 0x00, 0x00, 0x02, 0x0B, 0x00, 0x00, 0x23, 0x0B, 0x00, +/* 00000690 */ 0x00, 0x3C, 0x0B, 0x00, 0x00, 0x6F, 0x0B, 0x00, 0x00, 0xD3, 0x0B, 0x00, 0x00, 0xD4, 0x0B, 0x00, +/* 000006A0 */ 0x00, 0x40, 0x0C, 0x00, 0x00, 0x75, 0x0C, 0x00, 0x00, 0x76, 0x0C, 0x00, 0x00, 0xAD, 0x0C, 0x00, +/* 000006B0 */ 0x00, 0xAE, 0x0C, 0x00, 0x00, 0xF9, 0x0C, 0x00, 0x00, 0x27, 0x0D, 0x00, 0x00, 0xA2, 0x0D, 0x00, +/* 000006C0 */ 0x00, 0xCD, 0x0D, 0x00, 0x00, 0xEE, 0x0D, 0x00, 0x00, 0x22, 0x0E, 0x00, 0x00, 0x5B, 0x0E, 0x00, +/* 000006D0 */ 0x00, 0x9B, 0x0E, 0x00, 0x00, 0xB5, 0x0E, 0x00, 0x00, 0xDB, 0x0E, 0x00, 0x00, 0xF8, 0x0E, 0x00, +/* 000006E0 */ 0x00, 0x2D, 0x0F, 0x00, 0x00, 0x58, 0x0F, 0x00, 0x00, 0x7D, 0x0F, 0x00, 0x00, 0x93, 0x0F, 0x00, +/* 000006F0 */ 0x00, 0xA5, 0x0F, 0x00, 0x00, 0xDA, 0x0F, 0x00, 0x00, 0xE9, 0x0F, 0x00, 0x00, 0x05, 0x10, 0x00, +/* 00000700 */ 0x00, 0x24, 0x10, 0x00, 0x00, 0x43, 0x10, 0x00, 0x00, 0x4D, 0x10, 0x00, 0x00, 0x54, 0x10, 0x00, +/* 00000710 */ 0x00, 0x55, 0x10, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x02, 0x11, 0x00, 0x00, 0x9A, 0x11, 0x00, +/* 00000720 */ 0x00, 0x9B, 0x11, 0x00, 0x00, 0x36, 0x12, 0x00, 0x00, 0x37, 0x12, 0x00, 0x00, 0x9E, 0x12, 0x00, +/* 00000730 */ 0x00, 0xB4, 0x12, 0x00, 0x00, 0xFF, 0x12, 0x00, 0x00, 0x07, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, +/* 00000740 */ 0x00, 0x4D, 0x13, 0x00, 0x00, 0x63, 0x13, 0x00, 0x00, 0x96, 0x13, 0x00, 0x00, 0xEC, 0x13, 0x00, +/* 00000750 */ 0x00, 0xF6, 0x13, 0x00, 0x00, 0x24, 0x14, 0x00, 0x00, 0x7A, 0x14, 0x00, 0x00, 0x82, 0x14, 0x00, +/* 00000760 */ 0x00, 0x83, 0x14, 0x00, 0x00, 0xCA, 0x14, 0x00, 0x00, 0xE0, 0x14, 0x00, 0x00, 0x13, 0x15, 0x00, +/* 00000770 */ 0x00, 0x6B, 0x15, 0x00, 0x00, 0x75, 0x15, 0x00, 0x00, 0xA3, 0x15, 0x00, 0x00, 0xFB, 0x15, 0x00, +/* 00000780 */ 0x00, 0x03, 0x16, 0x00, 0x00, 0x04, 0x16, 0x00, 0x00, 0x4C, 0x16, 0x00, 0x00, 0x62, 0x16, 0x00, +/* 00000790 */ 0x00, 0x95, 0x16, 0x00, 0x00, 0xEE, 0x16, 0x00, 0x00, 0xF8, 0x16, 0x00, 0x00, 0x26, 0x17, 0x00, +/* 000007A0 */ 0x00, 0x84, 0x17, 0x00, 0x00, 0x8C, 0x17, 0x00, 0x00, 0x00, 0x09, 0xB9, 0x0C, 0x00, 0x00, 0x00, +/* 000007B0 */ 0x04, 0x02, 0xA8, 0x41, 0xC0, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, 0x70, 0x01, 0x01, 0xFF, 0x00, +/* 000007C0 */ 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFE, 0x1F, 0x16, 0xFE, 0x1F, 0x16, 0x40, 0x01, 0x04, 0x04, +/* 000007D0 */ 0x05, 0x05, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x0A, 0x09, 0xA8, 0x00, 0xD4, 0x00, 0x04, 0xFA, 0x04, +/* 000007E0 */ 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0xED, 0x07, 0x00, 0x00, 0xBF, 0x1D, 0x04, +/* 000007F0 */ 0xE0, 0x89, 0xC6, 0x12, 0x07, 0x01, 0xA2, 0x41, 0xD1, 0x00, 0x01, 0xFE, 0x80, 0x01, 0x07, 0xFF, +/* 00000800 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x80, 0x01, 0xFE, 0x0D, 0x16, 0xFE, 0x0D, 0x16, 0x40, +/* 00000810 */ 0x02, 0x0C, 0x1E, 0x27, 0x05, 0x9A, 0x8E, 0x0B, 0x1D, 0x1C, 0x1D, 0x1D, 0x08, 0x24, 0x25, 0x26, +/* 00000820 */ 0x06, 0xFE, 0xE6, 0x02, 0x06, 0xFE, 0xE7, 0x02, 0x06, 0xFE, 0xE8, 0x02, 0x06, 0xFE, 0xE9, 0x02, +/* 00000830 */ 0x06, 0xFE, 0xEA, 0x02, 0x06, 0xFE, 0xEB, 0x02, 0x01, 0x00, 0x06, 0xFE, 0xEC, 0x02, 0x0B, 0x06, +/* 00000840 */ 0xFE, 0xED, 0x02, 0x05, 0xFE, 0xEE, 0x02, 0x07, 0x06, 0xFE, 0xEF, 0x02, 0x06, 0xFE, 0xF0, 0x02, +/* 00000850 */ 0x06, 0xFE, 0xF1, 0x02, 0x06, 0xFE, 0xF2, 0x02, 0x06, 0xFE, 0xF3, 0x02, 0x08, 0x06, 0xFE, 0xF4, +/* 00000860 */ 0x02, 0x06, 0xFE, 0xF5, 0x02, 0x06, 0xFE, 0xF6, 0x02, 0x06, 0xFE, 0xF7, 0x02, 0x0C, 0x06, 0xFE, +/* 00000870 */ 0xF8, 0x02, 0x05, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xFB, 0x02, 0x06, 0xFE, +/* 00000880 */ 0xFC, 0x02, 0xFE, 0x9F, 0x02, 0x4F, 0x20, 0x62, 0x27, 0x1E, 0x00, 0x47, 0x1F, 0x27, 0xCC, 0x00, +/* 00000890 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0xCC, 0x14, 0x00, 0x00, 0x00, +/* 000008A0 */ 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x04, 0x28, 0x01, 0x7B, 0x06, 0x28, 0x02, +/* 000008B0 */ 0x7B, 0x08, 0x28, 0x03, 0x7B, 0x0A, 0x28, 0x04, 0x7B, 0x0C, 0x28, 0x05, 0x7B, 0x28, 0x27, 0x06, +/* 000008C0 */ 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x04, 0x28, +/* 000008D0 */ 0x01, 0x7B, 0x0F, 0x28, 0x02, 0x7B, 0x08, 0x28, 0x03, 0x7B, 0x0A, 0x28, 0x04, 0x7B, 0x28, 0x27, +/* 000008E0 */ 0x07, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x04, +/* 000008F0 */ 0x28, 0x01, 0x7B, 0x11, 0x28, 0x02, 0x7B, 0x08, 0x28, 0x03, 0x7B, 0x0A, 0x28, 0x04, 0x7B, 0x28, +/* 00000900 */ 0x27, 0x08, 0x47, 0x20, 0x27, 0x62, 0x27, 0x1F, 0x09, 0x96, 0x02, 0x27, 0x62, 0x27, 0x1F, 0x0A, +/* 00000910 */ 0x96, 0x03, 0x27, 0xD4, 0x00, 0x27, 0x47, 0x21, 0x27, 0x62, 0x27, 0x1F, 0x0B, 0x47, 0x22, 0x27, +/* 00000920 */ 0x6D, 0x27, 0x1F, 0x0C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1F, 0x5D, 0x01, 0x12, 0x00, 0x00, 0xD4, +/* 00000930 */ 0x01, 0x28, 0x5C, 0x02, 0x28, 0xF2, 0x03, 0xFF, 0x27, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, +/* 00000940 */ 0x27, 0x1F, 0x0D, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x1F, 0xF2, 0x01, 0x27, 0x27, 0x0D, 0x00, 0x00, +/* 00000950 */ 0x00, 0x01, 0x00, 0x47, 0x23, 0x27, 0x01, 0x47, 0x01, 0x27, 0x62, 0x27, 0x27, 0x0E, 0x07, 0x02, +/* 00000960 */ 0x00, 0x5C, 0x00, 0x13, 0x5C, 0x01, 0x23, 0xEE, 0x02, 0x28, 0x22, 0x02, 0x00, 0x77, 0x28, 0x27, +/* 00000970 */ 0x0F, 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x62, 0x28, +/* 00000980 */ 0x28, 0x10, 0x62, 0x28, 0x28, 0x11, 0x5C, 0x01, 0x28, 0x5D, 0x02, 0x14, 0x03, 0x00, 0xCC, 0x60, +/* 00000990 */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xD4, 0x02, 0x29, 0x7B, 0x29, +/* 000009A0 */ 0x28, 0x12, 0x01, 0x65, 0x01, 0x29, 0x28, 0x7B, 0x0A, 0x28, 0x13, 0x7B, 0x18, 0x28, 0x14, 0x7B, +/* 000009B0 */ 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0xEE, 0x04, 0xFF, 0x27, 0x03, 0x00, 0x47, 0x27, 0x21, 0x07, +/* 000009C0 */ 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x62, 0x28, 0x28, 0x10, 0x62, 0x28, 0x28, +/* 000009D0 */ 0x11, 0x5C, 0x01, 0x28, 0x6B, 0x1C, 0x00, 0x00, 0x00, 0x28, 0x62, 0x28, 0x28, 0x16, 0x5C, 0x02, +/* 000009E0 */ 0x28, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x1A, +/* 000009F0 */ 0x28, 0x12, 0x7B, 0x18, 0x28, 0x13, 0x7B, 0x18, 0x28, 0x14, 0x7B, 0x0A, 0x28, 0x15, 0x5C, 0x03, +/* 00000A00 */ 0x28, 0xEE, 0x04, 0xFF, 0x27, 0x04, 0x00, 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, +/* 00000A10 */ 0x01, 0x47, 0x01, 0x28, 0x62, 0x28, 0x28, 0x10, 0x62, 0x28, 0x28, 0x11, 0x62, 0x28, 0x28, 0x17, +/* 00000A20 */ 0x5C, 0x01, 0x28, 0x5D, 0x02, 0x1B, 0x05, 0x00, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, +/* 00000A30 */ 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x08, 0x28, 0x12, 0x7B, 0x18, 0x28, 0x13, 0x7B, 0x18, 0x28, +/* 00000A40 */ 0x14, 0x7B, 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0xEE, 0x04, 0xFF, 0x27, 0x05, 0x00, 0x47, 0x27, +/* 00000A50 */ 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x62, 0x28, 0x28, 0x10, 0x62, +/* 00000A60 */ 0x28, 0x28, 0x11, 0x62, 0x28, 0x28, 0x17, 0x5C, 0x01, 0x28, 0x5D, 0x02, 0x1C, 0x06, 0x00, 0xCC, +/* 00000A70 */ 0xA8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x14, 0x28, 0x12, +/* 00000A80 */ 0x7B, 0x18, 0x28, 0x13, 0x7B, 0x18, 0x28, 0x14, 0x7B, 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0xEE, +/* 00000A90 */ 0x04, 0xFF, 0x27, 0x06, 0x00, 0x6D, 0x27, 0x1F, 0x0C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1F, 0x5D, +/* 00000AA0 */ 0x01, 0x1D, 0x07, 0x00, 0xD4, 0x03, 0x28, 0x5C, 0x02, 0x28, 0xF2, 0x03, 0xFF, 0x27, 0x0C, 0x00, +/* 00000AB0 */ 0x00, 0x00, 0x07, 0x00, 0x47, 0x28, 0x1F, 0x6D, 0x27, 0x28, 0x18, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00000AC0 */ 0x28, 0x62, 0x29, 0x20, 0x19, 0x5C, 0x01, 0x29, 0xD4, 0x04, 0x29, 0x5C, 0x02, 0x29, 0xF2, 0x03, +/* 00000AD0 */ 0xFF, 0x27, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x47, 0x28, 0x1F, 0x6D, 0x27, 0x28, 0x18, 0x07, +/* 00000AE0 */ 0x03, 0x00, 0x5C, 0x00, 0x28, 0x62, 0x29, 0x20, 0x1A, 0x5C, 0x01, 0x29, 0xD4, 0x05, 0x29, 0x5C, +/* 00000AF0 */ 0x02, 0x29, 0xF2, 0x03, 0xFF, 0x27, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0x47, 0x28, 0x1F, 0x6D, +/* 00000B00 */ 0x27, 0x28, 0x18, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x28, 0x62, 0x29, 0x20, 0x1B, 0x5C, 0x01, 0x29, +/* 00000B10 */ 0xD4, 0x06, 0x29, 0x5C, 0x02, 0x29, 0xF2, 0x03, 0xFF, 0x27, 0x18, 0x00, 0x00, 0x00, 0x0A, 0x00, +/* 00000B20 */ 0xA8, 0x00, 0x24, 0x00, 0x08, 0xC0, 0x00, 0xA8, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, +/* 00000B30 */ 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, +/* 00000B40 */ 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, +/* 00000B50 */ 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x78, +/* 00000B60 */ 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, +/* 00000B70 */ 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, +/* 00000B80 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, +/* 00000B90 */ 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, +/* 00000BA0 */ 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, 0x02, 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, +/* 00000BB0 */ 0x02, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, +/* 00000BC0 */ 0x02, 0x00, 0x00, 0xB1, 0x02, 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, 0x02, 0x00, 0x00, 0x14, +/* 00000BD0 */ 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, +/* 00000BE0 */ 0x02, 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, 0x02, 0x00, 0x00, 0xB4, 0x02, 0x00, 0x00, 0x00, +/* 00000BF0 */ 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x02, 0x00, 0x00, 0xEF, +/* 00000C00 */ 0x02, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x85, 0xFE, 0xB0, 0x02, 0xFE, 0xB1, 0x02, 0xFE, 0xB2, +/* 00000C10 */ 0x02, 0xFE, 0xB3, 0x02, 0xFE, 0xB4, 0x02, 0xFE, 0xE6, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF1, 0x02, +/* 00000C20 */ 0xFE, 0x37, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x45, 0x02, 0xFE, 0xAE, 0x02, 0xFE, 0xB6, 0x02, 0xFE, +/* 00000C30 */ 0xF3, 0x02, 0xFE, 0x48, 0x01, 0xFE, 0xF3, 0x02, 0xFE, 0x48, 0x01, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, +/* 00000C40 */ 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0x9A, 0x01, 0xFE, 0x2C, 0x01, 0xFE, 0xAF, 0x02, +/* 00000C50 */ 0xFE, 0xEF, 0x02, 0xFE, 0xE6, 0x02, 0xFE, 0xF1, 0x02, 0xFE, 0x87, 0x01, 0xFE, 0xFD, 0x02, 0xFE, +/* 00000C60 */ 0xFE, 0x02, 0xFE, 0x9B, 0x01, 0x12, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x29, 0x00, 0x77, 0x00, +/* 00000C70 */ 0x9B, 0x01, 0x07, 0x00, 0x35, 0x00, 0x07, 0x00, 0x29, 0x01, 0x06, 0x00, 0x93, 0x00, 0x07, 0x00, +/* 00000C80 */ 0x40, 0x00, 0x1F, 0x00, 0x9F, 0x02, 0x17, 0x00, 0x63, 0x00, 0x1B, 0x00, 0x50, 0x00, 0x4B, 0x00, +/* 00000C90 */ 0x77, 0x07, 0x4B, 0x00, 0xAD, 0x00, 0x47, 0x00, 0x99, 0x00, 0x47, 0x00, 0x9C, 0x00, 0x1F, 0x00, +/* 00000CA0 */ 0xD1, 0x00, 0x24, 0x00, 0x7B, 0x01, 0x24, 0x00, 0x81, 0x01, 0x26, 0x00, 0x84, 0x01, 0x00, 0x9A, +/* 00000CB0 */ 0x12, 0x00, 0x00, 0xD9, 0x11, 0x00, 0x00, 0x9C, 0x0F, 0x00, 0x00, 0x3B, 0x0F, 0x00, 0x00, 0x6B, +/* 00000CC0 */ 0x0E, 0x00, 0x00, 0x9B, 0x0D, 0x00, 0x00, 0xCB, 0x0C, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, +/* 00000CD0 */ 0xC0, 0x00, 0x76, 0x3A, 0xA0, 0x41, 0xD1, 0x00, 0x08, 0xFE, 0x3E, 0x16, 0xFF, 0x00, 0x10, 0x01, +/* 00000CE0 */ 0x00, 0x01, 0x01, 0xFE, 0x3E, 0x16, 0xFE, 0x4B, 0x01, 0xFE, 0x4B, 0x01, 0x01, 0x04, 0x06, 0x08, +/* 00000CF0 */ 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, +/* 00000D00 */ 0x08, 0x03, 0x01, 0x02, 0x74, 0x5B, 0x06, 0xB4, 0x06, 0x06, 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, +/* 00000D10 */ 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x16, 0x00, 0x6B, 0x02, +/* 00000D20 */ 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xC3, 0x02, 0x08, 0x08, +/* 00000D30 */ 0x00, 0x00, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 00000D40 */ 0x00, 0x09, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, +/* 00000D50 */ 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 00000D60 */ 0x5C, 0x01, 0x07, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +/* 00000D70 */ 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, 0xFE, +/* 00000D80 */ 0xA2, 0x01, 0xFE, 0x6A, 0x16, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x16, 0x00, +/* 00000D90 */ 0x5F, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, +/* 00000DA0 */ 0xC0, 0x00, 0x6D, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x07, 0xFE, 0xBC, 0x14, 0xFF, 0x00, 0x10, 0x01, +/* 00000DB0 */ 0x00, 0x01, 0x01, 0xFE, 0xBC, 0x14, 0xFE, 0x44, 0x01, 0xFE, 0x44, 0x01, 0x01, 0x04, 0x06, 0x08, +/* 00000DC0 */ 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, +/* 00000DD0 */ 0x07, 0x03, 0x01, 0x01, 0x74, 0x5B, 0x06, 0xB4, 0x06, 0x06, 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, +/* 00000DE0 */ 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x16, 0x00, 0x6B, 0x02, +/* 00000DF0 */ 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xC3, 0x02, 0x08, 0x08, +/* 00000E00 */ 0x00, 0x00, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 00000E10 */ 0x00, 0x09, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, +/* 00000E20 */ 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 00000E30 */ 0x5C, 0x01, 0x07, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +/* 00000E40 */ 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, 0xFE, +/* 00000E50 */ 0xA2, 0x01, 0xFE, 0xE8, 0x14, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x16, 0x00, +/* 00000E60 */ 0x5E, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x54, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, +/* 00000E70 */ 0xC0, 0x00, 0x64, 0x37, 0xA0, 0x41, 0xD1, 0x00, 0x06, 0xFE, 0x3F, 0x13, 0xFF, 0x00, 0x10, 0x01, +/* 00000E80 */ 0x00, 0x01, 0x01, 0xFE, 0x3F, 0x13, 0xFE, 0x40, 0x01, 0xFE, 0x40, 0x01, 0x01, 0x04, 0x06, 0x08, +/* 00000E90 */ 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, +/* 00000EA0 */ 0x06, 0x03, 0x01, 0x00, 0x74, 0x5B, 0x06, 0xB4, 0x06, 0x06, 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, +/* 00000EB0 */ 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x16, 0x00, 0x6B, 0x02, +/* 00000EC0 */ 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xC3, 0x02, 0x08, 0x08, +/* 00000ED0 */ 0x00, 0x00, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 00000EE0 */ 0x00, 0x09, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, +/* 00000EF0 */ 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 00000F00 */ 0x5C, 0x01, 0x07, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +/* 00000F10 */ 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, 0xFE, +/* 00000F20 */ 0xA2, 0x01, 0xFE, 0x6B, 0x13, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x16, 0x00, +/* 00000F30 */ 0x5C, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, +/* 00000F40 */ 0xC0, 0x00, 0x5F, 0x42, 0xA2, 0x41, 0xD1, 0x00, 0x05, 0xFE, 0x79, 0x12, 0xFF, 0x00, 0x10, 0x01, +/* 00000F50 */ 0x00, 0x03, 0x03, 0xFE, 0x79, 0x12, 0x8B, 0x8B, 0x01, 0x03, 0x03, 0x05, 0x04, 0x0A, 0x0A, 0x01, +/* 00000F60 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0xFE, 0xE5, 0x02, 0x22, 0x01, 0x47, 0x01, 0x05, 0x62, 0x05, +/* 00000F70 */ 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0xC4, 0x03, 0x00, 0x05, 0x00, +/* 00000F80 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xF3, 0x02, 0xFE, +/* 00000F90 */ 0xBC, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x47, 0x00, 0x00, 0xBF, 0x5C, 0x0D, 0xE0, +/* 00000FA0 */ 0x2B, 0xD0, 0x10, 0x2A, 0x13, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0xF5, 0x02, 0x04, 0xFE, 0x45, 0x09, +/* 00000FB0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x45, 0x09, 0xFE, 0xA2, 0x06, 0xFE, 0xA2, 0x06, +/* 00000FC0 */ 0x01, 0x10, 0x0B, 0x15, 0x03, 0x5B, 0x48, 0x01, 0x02, 0x03, 0x01, 0x0D, 0x0C, 0x0D, 0x0D, 0x01, +/* 00000FD0 */ 0x01, 0x03, 0x15, 0x05, 0xFE, 0xE5, 0x02, 0x05, 0xFE, 0x04, 0x03, 0x0B, 0x01, 0x01, 0x01, 0x00, +/* 00000FE0 */ 0x0C, 0x06, 0xFE, 0xF5, 0x02, 0x06, 0xFE, 0x05, 0x03, 0x07, 0xFE, 0x43, 0x01, 0x5B, 0x0B, 0xB4, +/* 00000FF0 */ 0x0B, 0x0B, 0x4F, 0x0C, 0x4F, 0x0D, 0x4F, 0x0E, 0x4F, 0x0F, 0x4F, 0x10, 0x4F, 0x11, 0x4F, 0x12, +/* 00001000 */ 0x4F, 0x13, 0x4F, 0x14, 0x47, 0x0C, 0x0B, 0x01, 0x47, 0x01, 0x18, 0x62, 0x18, 0x18, 0x00, 0xE1, +/* 00001010 */ 0x18, 0x0C, 0x18, 0x00, 0x0F, 0x19, 0x00, 0x18, 0x09, 0x00, 0x00, 0x6B, 0x0C, 0x00, 0x00, 0x00, +/* 00001020 */ 0x18, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x03, 0x00, 0x00, 0xC3, 0x02, 0x18, 0x18, 0x00, 0x00, 0x23, +/* 00001030 */ 0x18, 0x62, 0x18, 0x0C, 0x01, 0x47, 0x0D, 0x18, 0xA8, 0x18, 0x47, 0x0E, 0x18, 0xA8, 0x18, 0x47, +/* 00001040 */ 0x0F, 0x18, 0x62, 0x18, 0x0C, 0x02, 0x14, 0x03, 0x00, 0x18, 0x04, 0x09, 0x0B, 0x00, 0xA8, 0x18, +/* 00001050 */ 0x47, 0x0E, 0x18, 0x47, 0x0F, 0x04, 0x09, 0xBB, 0x00, 0x62, 0x18, 0x0C, 0x03, 0x47, 0x10, 0x18, +/* 00001060 */ 0x01, 0x47, 0x01, 0x19, 0x6D, 0x18, 0x19, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x19, 0x5C, 0x01, +/* 00001070 */ 0x0D, 0xF2, 0x02, 0x18, 0x18, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x18, 0x09, +/* 00001080 */ 0x0A, 0x00, 0x62, 0x19, 0x0D, 0x05, 0x47, 0x18, 0x19, 0x09, 0x1E, 0x00, 0x01, 0x47, 0x01, 0x1A, +/* 00001090 */ 0x6D, 0x19, 0x1A, 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0x19, +/* 000010A0 */ 0x19, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x18, 0x19, 0x47, 0x11, 0x18, 0x12, 0x03, 0x00, +/* 000010B0 */ 0x10, 0x11, 0x09, 0x53, 0x00, 0x62, 0x18, 0x0C, 0x07, 0x47, 0x12, 0x18, 0x2F, 0x18, 0x10, 0x05, +/* 000010C0 */ 0x77, 0x18, 0x0C, 0x08, 0x14, 0x03, 0x00, 0x12, 0x05, 0x09, 0x0C, 0x00, 0x98, 0x18, 0x0D, 0x10, +/* 000010D0 */ 0x00, 0x00, 0x47, 0x0E, 0x18, 0x09, 0x2A, 0x00, 0x14, 0x03, 0x00, 0x12, 0x06, 0x09, 0x06, 0x00, +/* 000010E0 */ 0x47, 0x0E, 0x10, 0x09, 0x1C, 0x00, 0x47, 0x13, 0x10, 0x98, 0x18, 0x0D, 0x10, 0x01, 0x00, 0x47, +/* 000010F0 */ 0x14, 0x18, 0xCE, 0x18, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x13, 0x18, 0xA1, 0x01, 0x14, 0x18, 0x47, +/* 00001100 */ 0x0E, 0x18, 0x47, 0x0F, 0x07, 0x09, 0x0C, 0x00, 0x77, 0x04, 0x0C, 0x09, 0xA8, 0x18, 0x47, 0x0E, +/* 00001110 */ 0x18, 0x47, 0x0F, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00001120 */ 0x00, 0x7B, 0x0E, 0x00, 0x0A, 0x7B, 0x0F, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 00001130 */ 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, +/* 00001140 */ 0x01, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, 0xFE, 0xF3, 0x02, 0xFE, 0x00, 0x03, 0xFE, 0x03, 0x03, +/* 00001150 */ 0xFE, 0x01, 0x03, 0xE0, 0xF3, 0xFE, 0xB5, 0x02, 0xFE, 0x02, 0x03, 0xFE, 0x01, 0x03, 0xFE, 0x03, +/* 00001160 */ 0x03, 0xFE, 0xB6, 0x01, 0x9F, 0xFE, 0xA2, 0x01, 0xFE, 0x81, 0x09, 0x1B, 0x17, 0x00, 0x00, 0x00, +/* 00001170 */ 0x03, 0x00, 0x1F, 0x00, 0x14, 0x00, 0x49, 0x00, 0x16, 0x00, 0x81, 0x00, 0x07, 0x00, 0x2A, 0x00, +/* 00001180 */ 0x05, 0x00, 0x0B, 0x00, 0x05, 0x00, 0x17, 0x00, 0x0C, 0x00, 0x39, 0x00, 0x05, 0x00, 0x27, 0x00, +/* 00001190 */ 0x06, 0x00, 0x3A, 0x00, 0x07, 0x00, 0x33, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x08, 0x00, 0x70, 0x00, +/* 000011A0 */ 0x07, 0x00, 0x36, 0x00, 0x08, 0x00, 0x38, 0x00, 0x08, 0x00, 0x4F, 0x00, 0x0C, 0x00, 0x31, 0x00, +/* 000011B0 */ 0x08, 0x00, 0x78, 0x00, 0x06, 0x00, 0x4C, 0x00, 0x03, 0x00, 0x34, 0x00, 0x09, 0x00, 0x39, 0x00, +/* 000011C0 */ 0x10, 0x00, 0x56, 0x00, 0x06, 0x00, 0x43, 0x00, 0x04, 0x00, 0x35, 0x00, 0x05, 0x00, 0x2B, 0x00, +/* 000011D0 */ 0x03, 0x00, 0x45, 0x00, 0x1A, 0x00, 0x31, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, 0xC0, 0x00, +/* 000011E0 */ 0x1A, 0x3C, 0xA2, 0x41, 0xD1, 0x00, 0x03, 0xFE, 0xC8, 0x05, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 000011F0 */ 0x03, 0xFE, 0xC8, 0x05, 0xFE, 0xE9, 0x01, 0xFE, 0xE9, 0x01, 0x41, 0x05, 0x0A, 0x0D, 0x08, 0x14, +/* 00001200 */ 0x14, 0x01, 0x01, 0x05, 0x05, 0x05, 0x05, 0x05, 0xFE, 0xE5, 0x02, 0x01, 0x04, 0x06, 0xFE, 0x00, +/* 00001210 */ 0x03, 0x06, 0xFE, 0x01, 0x03, 0x06, 0xFE, 0x02, 0x03, 0x06, 0xFE, 0x03, 0x03, 0x01, 0x00, 0x0C, +/* 00001220 */ 0x4D, 0x5B, 0x0C, 0xB4, 0x0C, 0x0C, 0x01, 0x47, 0x01, 0x0E, 0x6D, 0x0D, 0x0E, 0x00, 0x07, 0x07, +/* 00001230 */ 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x04, 0x00, +/* 00001240 */ 0x00, 0x5D, 0x04, 0x05, 0x00, 0x00, 0x5D, 0x05, 0x06, 0x00, 0x00, 0x5D, 0x06, 0x07, 0x00, 0x00, +/* 00001250 */ 0xF2, 0x07, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x0A, 0x0C, 0x01, 0x77, 0x08, +/* 00001260 */ 0x0C, 0x02, 0x77, 0x0B, 0x0C, 0x03, 0x77, 0x09, 0x0C, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xB7, +/* 00001270 */ 0x02, 0xFE, 0x00, 0x03, 0xFE, 0x01, 0x03, 0xFE, 0x02, 0x03, 0xFE, 0x03, 0x03, 0xFE, 0x0B, 0x06, +/* 00001280 */ 0x06, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x82, 0x00, 0x04, 0x00, 0x28, 0x00, 0x04, 0x00, 0x22, +/* 00001290 */ 0x00, 0x04, 0x00, 0x29, 0x00, 0x06, 0x00, 0xB0, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, +/* 000012A0 */ 0x00, 0x15, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xFF, 0x02, 0x02, 0xFE, 0xD8, 0x04, 0xFF, 0x00, +/* 000012B0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xD8, 0x04, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, +/* 000012C0 */ 0x10, 0x01, 0x02, 0x02, 0x07, 0x07, 0x08, 0x39, 0x8F, 0x01, 0x03, 0x08, 0x00, 0x00, 0x07, 0x04, +/* 000012D0 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8F, 0x01, 0x02, 0x09, 0x01, 0x00, +/* 000012E0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x5D, 0x02, 0x02, 0x01, 0x00, 0xEE, 0x03, +/* 000012F0 */ 0x09, 0x09, 0x01, 0x00, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x08, 0x00, 0x00, 0xA8, 0x00, 0x24, +/* 00001300 */ 0x00, 0xFE, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x46, 0x00, 0x00}; + +} diff --git a/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.bc.64b.h b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.bc.64b.h new file mode 100644 index 00000000000..ed12f34d596 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.bc.64b.h @@ -0,0 +1,443 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#if 0 +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +"use strict"; + +(function (intrinsic) { + var platform = intrinsic.JsBuiltIn; + + let FunctionsEnum = { + ArrayValues: { className: "Array", methodName: "values", argumentsCount: 0, forceInline: true /*optional*/, alias: "Symbol.iterator" }, + ArrayKeys: { className: "Array", methodName: "keys", argumentsCount: 0, forceInline: true /*optional*/ }, + ArrayEntries: { className: "Array", methodName: "entries", argumentsCount: 0, forceInline: true /*optional*/ } + }; + + var setPrototype = platform.builtInSetPrototype; + var _objectDefineProperty = platform.builtInJavascriptObjectEntryDefineProperty; + + // Object's getter and setter can get overriden on the prototype, in that case while setting the value attributes, we will end up with TypeError + // So, we need to set the prototype of attributes to null + var ObjectDefineProperty = function (obj, prop, attributes) { + _objectDefineProperty(obj, prop, setPrototype(attributes, null)); + }; + var CreateObject = platform.builtInJavascriptObjectCreate; + + platform.registerChakraLibraryFunction("ArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + __chakraLibrary.InitInternalProperties(this, 4, "__$arrayObj$__", "__$nextIndex$__", "__$kind$__", "__$internalDone$__"); + this.__$arrayObj$__ = arrayObj; + this.__$nextIndex$__ = 0; + this.__$kind$__ = iterationKind; + this.__$internalDone$__ = false; // We use this additional property to enable hoisting load of arrayObj outside the loop, we write to this property instead of the arrayObj + }); + + // ArrayIterator's prototype is the C++ Iterator, which is also the prototype for StringIterator, MapIterator etc + var iteratorPrototype = platform.GetIteratorPrototype(); + // Establish prototype chain here + __chakraLibrary.ArrayIterator.prototype = CreateObject(iteratorPrototype); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, 'next', + { + value: function () { + "use strict"; + let o = this; + + if (!(o instanceof __chakraLibrary.ArrayIterator)) { + throw new TypeError("Array Iterator.prototype.next: 'this' is not an Array Iterator object"); + } + + let a = o.__$arrayObj$__; + let value, done; + + if (o.__$internalDone$__ === true) { + value = undefined; + done = true; + } else { + let index = o.__$nextIndex$__; + let len = __chakraLibrary.isArray(a) ? a.length : __chakraLibrary.GetLength(a); + + if (index < len) { // < comparison should happen instead of >= , because len can be NaN + let itemKind = o.__$kind$__; + + o.__$nextIndex$__ = index + 1; + + if (itemKind === 1 /*ArrayIterationKind.Value*/) { + value = a[index]; + } else if (itemKind === 0 /*ArrayIterationKind.Key*/) { // TODO (megupta) : Use clean enums here ? + value = index; + } else { + let elementKey = index; + let elementValue = a[index]; + value = [elementKey, elementValue]; + } + done = false; + } else { + o.__$internalDone$__ = true; + value = undefined; + done = true; + } + } + return { value: value, done: done }; + }, + writable: true, + enumerable: false, + configurable: true + } + ); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, Symbol.toStringTag, { value: "Array Iterator", writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'length', { value: 0, writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'name', { value: "next", writable: false, enumerable: false, configurable: true }); + + platform.registerChakraLibraryFunction("CreateArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + return new __chakraLibrary.ArrayIterator(arrayObj, iterationKind); + }); + + platform.registerFunction(FunctionsEnum.ArrayKeys, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.keys: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 0 /* ArrayIterationKind.Key*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayValues, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.values: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 1 /* ArrayIterationKind.Value*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayEntries, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.entries: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 2 /* ArrayIterationKind.KeyAndValue*/); + }); +}); +#endif +namespace Js +{ + const char Library_Bytecode_JsBuiltIn[] = { +/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x0E, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, +/* 00000020 */ 0x8F, 0x17, 0xFE, 0x8F, 0x17, 0x31, 0x00, 0x00, 0x00, 0xAC, 0x05, 0x00, 0x00, 0xAA, 0x07, 0x00, +/* 00000030 */ 0x00, 0x25, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x1E, 0x01, 0x00, 0x00, +/* 00000040 */ 0x01, 0x36, 0x01, 0x00, 0x00, 0x00, 0x4A, 0x01, 0x00, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x00, +/* 00000050 */ 0x6C, 0x01, 0x00, 0x00, 0x00, 0x7A, 0x01, 0x00, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x00, 0xB0, +/* 00000060 */ 0x01, 0x00, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0x00, 0xDC, 0x01, 0x00, 0x00, 0x01, 0xF0, 0x01, +/* 00000070 */ 0x00, 0x00, 0x00, 0xFA, 0x01, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x24, 0x02, 0x00, +/* 00000080 */ 0x00, 0x01, 0x40, 0x02, 0x00, 0x00, 0x00, 0x4A, 0x02, 0x00, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, +/* 00000090 */ 0x00, 0x68, 0x02, 0x00, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x00, +/* 000000A0 */ 0xB6, 0x02, 0x00, 0x00, 0x00, 0xC4, 0x02, 0x00, 0x00, 0x00, 0xCE, 0x02, 0x00, 0x00, 0x01, 0xF6, +/* 000000B0 */ 0x02, 0x00, 0x00, 0x01, 0x10, 0x03, 0x00, 0x00, 0x01, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x66, 0x03, +/* 000000C0 */ 0x00, 0x00, 0x01, 0x84, 0x03, 0x00, 0x00, 0x01, 0xA4, 0x03, 0x00, 0x00, 0x01, 0xBA, 0x03, 0x00, +/* 000000D0 */ 0x00, 0x01, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x6C, 0x04, 0x00, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, +/* 000000E0 */ 0x00, 0xDA, 0x04, 0x00, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0xAC, 0x05, 0x00, 0x00, 0x00, +/* 000000F0 */ 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x63, 0x00, +/* 00000100 */ 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, +/* 00000110 */ 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x41, 0x00, +/* 00000120 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, +/* 00000130 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x73, 0x00, 0x73, 0x00, +/* 00000140 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00000150 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, +/* 00000160 */ 0x64, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, +/* 00000170 */ 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, +/* 00000180 */ 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x73, 0x00, 0x43, 0x00, 0x6F, 0x00, +/* 00000190 */ 0x75, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x63, 0x00, +/* 000001A0 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000001B0 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x73, 0x00, 0x00, 0x00, 0x53, 0x00, 0x79, 0x00, +/* 000001C0 */ 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000001D0 */ 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, +/* 000001E0 */ 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 000001F0 */ 0x6B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00000200 */ 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, +/* 00000210 */ 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, +/* 00000220 */ 0x73, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, +/* 00000230 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00000240 */ 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000250 */ 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, +/* 00000260 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 00000270 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 00000280 */ 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000290 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 000002A0 */ 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000002B0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, +/* 000002C0 */ 0x68, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, +/* 000002D0 */ 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000002E0 */ 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000002F0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000300 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00000310 */ 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, +/* 00000320 */ 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00000330 */ 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, +/* 00000340 */ 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, +/* 00000350 */ 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00000360 */ 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00000370 */ 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x24, 0x00, 0x5F, 0x00, +/* 00000380 */ 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, +/* 00000390 */ 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x24, 0x00, 0x5F, 0x00, +/* 000003A0 */ 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x6B, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 000003B0 */ 0x64, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, +/* 000003C0 */ 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 000003D0 */ 0x44, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, +/* 000003E0 */ 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, +/* 000003F0 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00000400 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000410 */ 0x2E, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, +/* 00000420 */ 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00000430 */ 0x20, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x20, 0x00, +/* 00000440 */ 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, +/* 00000450 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6F, 0x00, +/* 00000460 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x6F, 0x00, +/* 00000470 */ 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00000480 */ 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, +/* 00000490 */ 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x3A, 0x00, +/* 000004A0 */ 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, +/* 000004B0 */ 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, +/* 000004C0 */ 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, +/* 000004D0 */ 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000004E0 */ 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000004F0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000500 */ 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, +/* 00000510 */ 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, +/* 00000520 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, +/* 00000530 */ 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00000540 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00000550 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000560 */ 0x2E, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00000570 */ 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, +/* 00000580 */ 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 00000590 */ 0x20, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, +/* 000005A0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, +/* 000005B0 */ 0x00, 0x6A, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, +/* 000005C0 */ 0x00, 0x70, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x7F, 0x01, 0x00, 0x00, 0x97, 0x01, 0x00, +/* 000005D0 */ 0x00, 0xBF, 0x01, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xDA, 0x01, 0x00, 0x00, 0x6A, 0x02, 0x00, +/* 000005E0 */ 0x00, 0xDC, 0x02, 0x00, 0x00, 0x53, 0x03, 0x00, 0x00, 0x5A, 0x03, 0x00, 0x00, 0x5B, 0x03, 0x00, +/* 000005F0 */ 0x00, 0x90, 0x03, 0x00, 0x00, 0xE5, 0x03, 0x00, 0x00, 0xE6, 0x03, 0x00, 0x00, 0x7B, 0x04, 0x00, +/* 00000600 */ 0x00, 0xB9, 0x04, 0x00, 0x00, 0xFB, 0x04, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, 0x4C, 0x05, 0x00, +/* 00000610 */ 0x00, 0x8B, 0x05, 0x00, 0x00, 0x8C, 0x05, 0x00, 0x00, 0xED, 0x05, 0x00, 0x00, 0x03, 0x06, 0x00, +/* 00000620 */ 0x00, 0x85, 0x06, 0x00, 0x00, 0xAD, 0x06, 0x00, 0x00, 0xCF, 0x06, 0x00, 0x00, 0xF8, 0x06, 0x00, +/* 00000630 */ 0x00, 0xAC, 0x07, 0x00, 0x00, 0xB4, 0x07, 0x00, 0x00, 0xB5, 0x07, 0x00, 0x00, 0x2B, 0x08, 0x00, +/* 00000640 */ 0x00, 0x68, 0x08, 0x00, 0x00, 0x8E, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0xDE, 0x08, 0x00, +/* 00000650 */ 0x00, 0x28, 0x09, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, +/* 00000660 */ 0x00, 0x8F, 0x09, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0xD5, 0x09, 0x00, 0x00, 0x47, 0x0A, 0x00, +/* 00000670 */ 0x00, 0x59, 0x0A, 0x00, 0x00, 0x5A, 0x0A, 0x00, 0x00, 0x84, 0x0A, 0x00, 0x00, 0xA5, 0x0A, 0x00, +/* 00000680 */ 0x00, 0xA6, 0x0A, 0x00, 0x00, 0xDB, 0x0A, 0x00, 0x00, 0x02, 0x0B, 0x00, 0x00, 0x23, 0x0B, 0x00, +/* 00000690 */ 0x00, 0x3C, 0x0B, 0x00, 0x00, 0x6F, 0x0B, 0x00, 0x00, 0xD3, 0x0B, 0x00, 0x00, 0xD4, 0x0B, 0x00, +/* 000006A0 */ 0x00, 0x40, 0x0C, 0x00, 0x00, 0x75, 0x0C, 0x00, 0x00, 0x76, 0x0C, 0x00, 0x00, 0xAD, 0x0C, 0x00, +/* 000006B0 */ 0x00, 0xAE, 0x0C, 0x00, 0x00, 0xF9, 0x0C, 0x00, 0x00, 0x27, 0x0D, 0x00, 0x00, 0xA2, 0x0D, 0x00, +/* 000006C0 */ 0x00, 0xCD, 0x0D, 0x00, 0x00, 0xEE, 0x0D, 0x00, 0x00, 0x22, 0x0E, 0x00, 0x00, 0x5B, 0x0E, 0x00, +/* 000006D0 */ 0x00, 0x9B, 0x0E, 0x00, 0x00, 0xB5, 0x0E, 0x00, 0x00, 0xDB, 0x0E, 0x00, 0x00, 0xF8, 0x0E, 0x00, +/* 000006E0 */ 0x00, 0x2D, 0x0F, 0x00, 0x00, 0x58, 0x0F, 0x00, 0x00, 0x7D, 0x0F, 0x00, 0x00, 0x93, 0x0F, 0x00, +/* 000006F0 */ 0x00, 0xA5, 0x0F, 0x00, 0x00, 0xDA, 0x0F, 0x00, 0x00, 0xE9, 0x0F, 0x00, 0x00, 0x05, 0x10, 0x00, +/* 00000700 */ 0x00, 0x24, 0x10, 0x00, 0x00, 0x43, 0x10, 0x00, 0x00, 0x4D, 0x10, 0x00, 0x00, 0x54, 0x10, 0x00, +/* 00000710 */ 0x00, 0x55, 0x10, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x02, 0x11, 0x00, 0x00, 0x9A, 0x11, 0x00, +/* 00000720 */ 0x00, 0x9B, 0x11, 0x00, 0x00, 0x36, 0x12, 0x00, 0x00, 0x37, 0x12, 0x00, 0x00, 0x9E, 0x12, 0x00, +/* 00000730 */ 0x00, 0xB4, 0x12, 0x00, 0x00, 0xFF, 0x12, 0x00, 0x00, 0x07, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, +/* 00000740 */ 0x00, 0x4D, 0x13, 0x00, 0x00, 0x63, 0x13, 0x00, 0x00, 0x96, 0x13, 0x00, 0x00, 0xEC, 0x13, 0x00, +/* 00000750 */ 0x00, 0xF6, 0x13, 0x00, 0x00, 0x24, 0x14, 0x00, 0x00, 0x7A, 0x14, 0x00, 0x00, 0x82, 0x14, 0x00, +/* 00000760 */ 0x00, 0x83, 0x14, 0x00, 0x00, 0xCA, 0x14, 0x00, 0x00, 0xE0, 0x14, 0x00, 0x00, 0x13, 0x15, 0x00, +/* 00000770 */ 0x00, 0x6B, 0x15, 0x00, 0x00, 0x75, 0x15, 0x00, 0x00, 0xA3, 0x15, 0x00, 0x00, 0xFB, 0x15, 0x00, +/* 00000780 */ 0x00, 0x03, 0x16, 0x00, 0x00, 0x04, 0x16, 0x00, 0x00, 0x4C, 0x16, 0x00, 0x00, 0x62, 0x16, 0x00, +/* 00000790 */ 0x00, 0x95, 0x16, 0x00, 0x00, 0xEE, 0x16, 0x00, 0x00, 0xF8, 0x16, 0x00, 0x00, 0x26, 0x17, 0x00, +/* 000007A0 */ 0x00, 0x84, 0x17, 0x00, 0x00, 0x8C, 0x17, 0x00, 0x00, 0x00, 0x09, 0xB9, 0x0C, 0x00, 0x00, 0x00, +/* 000007B0 */ 0x04, 0x02, 0xA8, 0x41, 0xC0, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, 0x70, 0x01, 0x01, 0xFF, 0x00, +/* 000007C0 */ 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFE, 0x1F, 0x16, 0xFE, 0x1F, 0x16, 0x40, 0x01, 0x04, 0x04, +/* 000007D0 */ 0x05, 0x05, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x0A, 0x09, 0xA8, 0x00, 0xD4, 0x00, 0x04, 0xFA, 0x04, +/* 000007E0 */ 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0xED, 0x07, 0x00, 0x00, 0xBF, 0x1D, 0x04, +/* 000007F0 */ 0xE0, 0x89, 0xC6, 0x12, 0x07, 0x01, 0xA2, 0x41, 0xD1, 0x00, 0x01, 0xFE, 0x80, 0x01, 0x07, 0xFF, +/* 00000800 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x80, 0x01, 0xFE, 0x0D, 0x16, 0xFE, 0x0D, 0x16, 0x40, +/* 00000810 */ 0x02, 0x0C, 0x1E, 0x27, 0x05, 0x9A, 0x8E, 0x0B, 0x1D, 0x1C, 0x1D, 0x1D, 0x08, 0x24, 0x25, 0x26, +/* 00000820 */ 0x06, 0xFE, 0xE6, 0x02, 0x06, 0xFE, 0xE7, 0x02, 0x06, 0xFE, 0xE8, 0x02, 0x06, 0xFE, 0xE9, 0x02, +/* 00000830 */ 0x06, 0xFE, 0xEA, 0x02, 0x06, 0xFE, 0xEB, 0x02, 0x01, 0x00, 0x06, 0xFE, 0xEC, 0x02, 0x0B, 0x06, +/* 00000840 */ 0xFE, 0xED, 0x02, 0x05, 0xFE, 0xEE, 0x02, 0x07, 0x06, 0xFE, 0xEF, 0x02, 0x06, 0xFE, 0xF0, 0x02, +/* 00000850 */ 0x06, 0xFE, 0xF1, 0x02, 0x06, 0xFE, 0xF2, 0x02, 0x06, 0xFE, 0xF3, 0x02, 0x08, 0x06, 0xFE, 0xF4, +/* 00000860 */ 0x02, 0x06, 0xFE, 0xF5, 0x02, 0x06, 0xFE, 0xF6, 0x02, 0x06, 0xFE, 0xF7, 0x02, 0x0C, 0x06, 0xFE, +/* 00000870 */ 0xF8, 0x02, 0x05, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xFB, 0x02, 0x06, 0xFE, +/* 00000880 */ 0xFC, 0x02, 0xFE, 0x9F, 0x02, 0x4F, 0x20, 0x62, 0x27, 0x1E, 0x00, 0x47, 0x1F, 0x27, 0xCC, 0x00, +/* 00000890 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0xCC, 0x14, 0x00, 0x00, 0x00, +/* 000008A0 */ 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x04, 0x28, 0x01, 0x7B, 0x06, 0x28, 0x02, +/* 000008B0 */ 0x7B, 0x08, 0x28, 0x03, 0x7B, 0x0A, 0x28, 0x04, 0x7B, 0x0C, 0x28, 0x05, 0x7B, 0x28, 0x27, 0x06, +/* 000008C0 */ 0xCC, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x04, 0x28, +/* 000008D0 */ 0x01, 0x7B, 0x0F, 0x28, 0x02, 0x7B, 0x08, 0x28, 0x03, 0x7B, 0x0A, 0x28, 0x04, 0x7B, 0x28, 0x27, +/* 000008E0 */ 0x07, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x04, +/* 000008F0 */ 0x28, 0x01, 0x7B, 0x11, 0x28, 0x02, 0x7B, 0x08, 0x28, 0x03, 0x7B, 0x0A, 0x28, 0x04, 0x7B, 0x28, +/* 00000900 */ 0x27, 0x08, 0x47, 0x20, 0x27, 0x62, 0x27, 0x1F, 0x09, 0x96, 0x02, 0x27, 0x62, 0x27, 0x1F, 0x0A, +/* 00000910 */ 0x96, 0x03, 0x27, 0xD4, 0x00, 0x27, 0x47, 0x21, 0x27, 0x62, 0x27, 0x1F, 0x0B, 0x47, 0x22, 0x27, +/* 00000920 */ 0x6D, 0x27, 0x1F, 0x0C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1F, 0x5D, 0x01, 0x12, 0x00, 0x00, 0xD4, +/* 00000930 */ 0x01, 0x28, 0x5C, 0x02, 0x28, 0xF2, 0x03, 0xFF, 0x27, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, +/* 00000940 */ 0x27, 0x1F, 0x0D, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x1F, 0xF2, 0x01, 0x27, 0x27, 0x0D, 0x00, 0x00, +/* 00000950 */ 0x00, 0x01, 0x00, 0x47, 0x23, 0x27, 0x01, 0x47, 0x01, 0x27, 0x62, 0x27, 0x27, 0x0E, 0x07, 0x02, +/* 00000960 */ 0x00, 0x5C, 0x00, 0x13, 0x5C, 0x01, 0x23, 0xEE, 0x02, 0x28, 0x22, 0x02, 0x00, 0x77, 0x28, 0x27, +/* 00000970 */ 0x0F, 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x62, 0x28, +/* 00000980 */ 0x28, 0x10, 0x62, 0x28, 0x28, 0x11, 0x5C, 0x01, 0x28, 0x5D, 0x02, 0x14, 0x03, 0x00, 0xCC, 0x60, +/* 00000990 */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xD4, 0x02, 0x29, 0x7B, 0x29, +/* 000009A0 */ 0x28, 0x12, 0x01, 0x65, 0x01, 0x29, 0x28, 0x7B, 0x0A, 0x28, 0x13, 0x7B, 0x18, 0x28, 0x14, 0x7B, +/* 000009B0 */ 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0xEE, 0x04, 0xFF, 0x27, 0x03, 0x00, 0x47, 0x27, 0x21, 0x07, +/* 000009C0 */ 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x62, 0x28, 0x28, 0x10, 0x62, 0x28, 0x28, +/* 000009D0 */ 0x11, 0x5C, 0x01, 0x28, 0x6B, 0x1C, 0x00, 0x00, 0x00, 0x28, 0x62, 0x28, 0x28, 0x16, 0x5C, 0x02, +/* 000009E0 */ 0x28, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x1A, +/* 000009F0 */ 0x28, 0x12, 0x7B, 0x18, 0x28, 0x13, 0x7B, 0x18, 0x28, 0x14, 0x7B, 0x0A, 0x28, 0x15, 0x5C, 0x03, +/* 00000A00 */ 0x28, 0xEE, 0x04, 0xFF, 0x27, 0x04, 0x00, 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, +/* 00000A10 */ 0x01, 0x47, 0x01, 0x28, 0x62, 0x28, 0x28, 0x10, 0x62, 0x28, 0x28, 0x11, 0x62, 0x28, 0x28, 0x17, +/* 00000A20 */ 0x5C, 0x01, 0x28, 0x5D, 0x02, 0x1B, 0x05, 0x00, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, +/* 00000A30 */ 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x08, 0x28, 0x12, 0x7B, 0x18, 0x28, 0x13, 0x7B, 0x18, 0x28, +/* 00000A40 */ 0x14, 0x7B, 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0xEE, 0x04, 0xFF, 0x27, 0x05, 0x00, 0x47, 0x27, +/* 00000A50 */ 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x62, 0x28, 0x28, 0x10, 0x62, +/* 00000A60 */ 0x28, 0x28, 0x11, 0x62, 0x28, 0x28, 0x17, 0x5C, 0x01, 0x28, 0x5D, 0x02, 0x1C, 0x06, 0x00, 0xCC, +/* 00000A70 */ 0xA8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7B, 0x14, 0x28, 0x12, +/* 00000A80 */ 0x7B, 0x18, 0x28, 0x13, 0x7B, 0x18, 0x28, 0x14, 0x7B, 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0xEE, +/* 00000A90 */ 0x04, 0xFF, 0x27, 0x06, 0x00, 0x6D, 0x27, 0x1F, 0x0C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1F, 0x5D, +/* 00000AA0 */ 0x01, 0x1D, 0x07, 0x00, 0xD4, 0x03, 0x28, 0x5C, 0x02, 0x28, 0xF2, 0x03, 0xFF, 0x27, 0x0C, 0x00, +/* 00000AB0 */ 0x00, 0x00, 0x07, 0x00, 0x47, 0x28, 0x1F, 0x6D, 0x27, 0x28, 0x18, 0x07, 0x03, 0x00, 0x5C, 0x00, +/* 00000AC0 */ 0x28, 0x62, 0x29, 0x20, 0x19, 0x5C, 0x01, 0x29, 0xD4, 0x04, 0x29, 0x5C, 0x02, 0x29, 0xF2, 0x03, +/* 00000AD0 */ 0xFF, 0x27, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x47, 0x28, 0x1F, 0x6D, 0x27, 0x28, 0x18, 0x07, +/* 00000AE0 */ 0x03, 0x00, 0x5C, 0x00, 0x28, 0x62, 0x29, 0x20, 0x1A, 0x5C, 0x01, 0x29, 0xD4, 0x05, 0x29, 0x5C, +/* 00000AF0 */ 0x02, 0x29, 0xF2, 0x03, 0xFF, 0x27, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0x47, 0x28, 0x1F, 0x6D, +/* 00000B00 */ 0x27, 0x28, 0x18, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x28, 0x62, 0x29, 0x20, 0x1B, 0x5C, 0x01, 0x29, +/* 00000B10 */ 0xD4, 0x06, 0x29, 0x5C, 0x02, 0x29, 0xF2, 0x03, 0xFF, 0x27, 0x18, 0x00, 0x00, 0x00, 0x0A, 0x00, +/* 00000B20 */ 0xA8, 0x00, 0x24, 0x00, 0x08, 0xC0, 0x00, 0xA8, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, +/* 00000B30 */ 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, +/* 00000B40 */ 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, +/* 00000B50 */ 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x78, +/* 00000B60 */ 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, +/* 00000B70 */ 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, +/* 00000B80 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, +/* 00000B90 */ 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, +/* 00000BA0 */ 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, 0x02, 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, +/* 00000BB0 */ 0x02, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, +/* 00000BC0 */ 0x02, 0x00, 0x00, 0xB1, 0x02, 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, 0x02, 0x00, 0x00, 0x14, +/* 00000BD0 */ 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, +/* 00000BE0 */ 0x02, 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, 0x02, 0x00, 0x00, 0xB4, 0x02, 0x00, 0x00, 0x00, +/* 00000BF0 */ 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x02, 0x00, 0x00, 0xEF, +/* 00000C00 */ 0x02, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x85, 0xFE, 0xB0, 0x02, 0xFE, 0xB1, 0x02, 0xFE, 0xB2, +/* 00000C10 */ 0x02, 0xFE, 0xB3, 0x02, 0xFE, 0xB4, 0x02, 0xFE, 0xE6, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF1, 0x02, +/* 00000C20 */ 0xFE, 0x37, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x45, 0x02, 0xFE, 0xAE, 0x02, 0xFE, 0xB6, 0x02, 0xFE, +/* 00000C30 */ 0xF3, 0x02, 0xFE, 0x48, 0x01, 0xFE, 0xF3, 0x02, 0xFE, 0x48, 0x01, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, +/* 00000C40 */ 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0x9A, 0x01, 0xFE, 0x2C, 0x01, 0xFE, 0xAF, 0x02, +/* 00000C50 */ 0xFE, 0xEF, 0x02, 0xFE, 0xE6, 0x02, 0xFE, 0xF1, 0x02, 0xFE, 0x87, 0x01, 0xFE, 0xFD, 0x02, 0xFE, +/* 00000C60 */ 0xFE, 0x02, 0xFE, 0x9B, 0x01, 0x12, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x29, 0x00, 0x77, 0x00, +/* 00000C70 */ 0x9B, 0x01, 0x07, 0x00, 0x35, 0x00, 0x07, 0x00, 0x29, 0x01, 0x06, 0x00, 0x93, 0x00, 0x07, 0x00, +/* 00000C80 */ 0x40, 0x00, 0x1F, 0x00, 0x9F, 0x02, 0x17, 0x00, 0x63, 0x00, 0x1B, 0x00, 0x50, 0x00, 0x4B, 0x00, +/* 00000C90 */ 0x77, 0x07, 0x4B, 0x00, 0xAD, 0x00, 0x47, 0x00, 0x99, 0x00, 0x47, 0x00, 0x9C, 0x00, 0x1F, 0x00, +/* 00000CA0 */ 0xD1, 0x00, 0x24, 0x00, 0x7B, 0x01, 0x24, 0x00, 0x81, 0x01, 0x26, 0x00, 0x84, 0x01, 0x00, 0x9A, +/* 00000CB0 */ 0x12, 0x00, 0x00, 0xD9, 0x11, 0x00, 0x00, 0x9C, 0x0F, 0x00, 0x00, 0x3B, 0x0F, 0x00, 0x00, 0x6B, +/* 00000CC0 */ 0x0E, 0x00, 0x00, 0x9B, 0x0D, 0x00, 0x00, 0xCB, 0x0C, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, +/* 00000CD0 */ 0xC0, 0x00, 0x76, 0x3A, 0xA0, 0x41, 0xD1, 0x00, 0x08, 0xFE, 0x3E, 0x16, 0xFF, 0x00, 0x10, 0x01, +/* 00000CE0 */ 0x00, 0x01, 0x01, 0xFE, 0x3E, 0x16, 0xFE, 0x4B, 0x01, 0xFE, 0x4B, 0x01, 0x01, 0x04, 0x06, 0x08, +/* 00000CF0 */ 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, +/* 00000D00 */ 0x08, 0x03, 0x01, 0x02, 0x74, 0x5B, 0x06, 0xB4, 0x06, 0x06, 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, +/* 00000D10 */ 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x16, 0x00, 0x6B, 0x02, +/* 00000D20 */ 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xC3, 0x02, 0x08, 0x08, +/* 00000D30 */ 0x00, 0x00, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 00000D40 */ 0x00, 0x09, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, +/* 00000D50 */ 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 00000D60 */ 0x5C, 0x01, 0x07, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +/* 00000D70 */ 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, 0xFE, +/* 00000D80 */ 0xA2, 0x01, 0xFE, 0x6A, 0x16, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x16, 0x00, +/* 00000D90 */ 0x5F, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x5A, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, +/* 00000DA0 */ 0xC0, 0x00, 0x6D, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x07, 0xFE, 0xBC, 0x14, 0xFF, 0x00, 0x10, 0x01, +/* 00000DB0 */ 0x00, 0x01, 0x01, 0xFE, 0xBC, 0x14, 0xFE, 0x44, 0x01, 0xFE, 0x44, 0x01, 0x01, 0x04, 0x06, 0x08, +/* 00000DC0 */ 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, +/* 00000DD0 */ 0x07, 0x03, 0x01, 0x01, 0x74, 0x5B, 0x06, 0xB4, 0x06, 0x06, 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, +/* 00000DE0 */ 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x16, 0x00, 0x6B, 0x02, +/* 00000DF0 */ 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xC3, 0x02, 0x08, 0x08, +/* 00000E00 */ 0x00, 0x00, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 00000E10 */ 0x00, 0x09, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, +/* 00000E20 */ 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 00000E30 */ 0x5C, 0x01, 0x07, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +/* 00000E40 */ 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, 0xFE, +/* 00000E50 */ 0xA2, 0x01, 0xFE, 0xE8, 0x14, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x16, 0x00, +/* 00000E60 */ 0x5E, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x54, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, +/* 00000E70 */ 0xC0, 0x00, 0x64, 0x37, 0xA0, 0x41, 0xD1, 0x00, 0x06, 0xFE, 0x3F, 0x13, 0xFF, 0x00, 0x10, 0x01, +/* 00000E80 */ 0x00, 0x01, 0x01, 0xFE, 0x3F, 0x13, 0xFE, 0x40, 0x01, 0xFE, 0x40, 0x01, 0x01, 0x04, 0x06, 0x08, +/* 00000E90 */ 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, +/* 00000EA0 */ 0x06, 0x03, 0x01, 0x00, 0x74, 0x5B, 0x06, 0xB4, 0x06, 0x06, 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, +/* 00000EB0 */ 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x16, 0x00, 0x6B, 0x02, +/* 00000EC0 */ 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x04, 0x00, 0x00, 0xC3, 0x02, 0x08, 0x08, +/* 00000ED0 */ 0x00, 0x00, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, +/* 00000EE0 */ 0x00, 0x09, 0x5C, 0x01, 0x06, 0xF2, 0x02, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, +/* 00000EF0 */ 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6D, 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, +/* 00000F00 */ 0x5C, 0x01, 0x07, 0x5D, 0x02, 0x05, 0x02, 0x00, 0xF2, 0x03, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +/* 00000F10 */ 0x02, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, 0xFE, +/* 00000F20 */ 0xA2, 0x01, 0xFE, 0x6B, 0x13, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x16, 0x00, +/* 00000F30 */ 0x5C, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, +/* 00000F40 */ 0xC0, 0x00, 0x5F, 0x42, 0xA2, 0x41, 0xD1, 0x00, 0x05, 0xFE, 0x79, 0x12, 0xFF, 0x00, 0x10, 0x01, +/* 00000F50 */ 0x00, 0x03, 0x03, 0xFE, 0x79, 0x12, 0x8B, 0x8B, 0x01, 0x03, 0x03, 0x05, 0x04, 0x0A, 0x0A, 0x01, +/* 00000F60 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0xFE, 0xE5, 0x02, 0x22, 0x01, 0x47, 0x01, 0x05, 0x62, 0x05, +/* 00000F70 */ 0x05, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0xC4, 0x03, 0x00, 0x05, 0x00, +/* 00000F80 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xF3, 0x02, 0xFE, +/* 00000F90 */ 0xBC, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x47, 0x00, 0x00, 0xBF, 0x5C, 0x0D, 0xE0, +/* 00000FA0 */ 0x2B, 0xD0, 0x10, 0x2A, 0x13, 0xA0, 0x41, 0xC1, 0x00, 0xFE, 0xF5, 0x02, 0x04, 0xFE, 0x45, 0x09, +/* 00000FB0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x45, 0x09, 0xFE, 0xA2, 0x06, 0xFE, 0xA2, 0x06, +/* 00000FC0 */ 0x01, 0x10, 0x0B, 0x15, 0x03, 0x5B, 0x48, 0x01, 0x02, 0x03, 0x01, 0x0D, 0x0C, 0x0D, 0x0D, 0x01, +/* 00000FD0 */ 0x01, 0x03, 0x15, 0x05, 0xFE, 0xE5, 0x02, 0x05, 0xFE, 0x04, 0x03, 0x0B, 0x01, 0x01, 0x01, 0x00, +/* 00000FE0 */ 0x0C, 0x06, 0xFE, 0xF5, 0x02, 0x06, 0xFE, 0x05, 0x03, 0x07, 0xFE, 0x43, 0x01, 0x5B, 0x0B, 0xB4, +/* 00000FF0 */ 0x0B, 0x0B, 0x4F, 0x0C, 0x4F, 0x0D, 0x4F, 0x0E, 0x4F, 0x0F, 0x4F, 0x10, 0x4F, 0x11, 0x4F, 0x12, +/* 00001000 */ 0x4F, 0x13, 0x4F, 0x14, 0x47, 0x0C, 0x0B, 0x01, 0x47, 0x01, 0x18, 0x62, 0x18, 0x18, 0x00, 0xE1, +/* 00001010 */ 0x18, 0x0C, 0x18, 0x00, 0x0F, 0x19, 0x00, 0x18, 0x09, 0x00, 0x00, 0x6B, 0x0C, 0x00, 0x00, 0x00, +/* 00001020 */ 0x18, 0x07, 0x02, 0x00, 0x5D, 0x01, 0x03, 0x00, 0x00, 0xC3, 0x02, 0x18, 0x18, 0x00, 0x00, 0x23, +/* 00001030 */ 0x18, 0x62, 0x18, 0x0C, 0x01, 0x47, 0x0D, 0x18, 0xA8, 0x18, 0x47, 0x0E, 0x18, 0xA8, 0x18, 0x47, +/* 00001040 */ 0x0F, 0x18, 0x62, 0x18, 0x0C, 0x02, 0x14, 0x03, 0x00, 0x18, 0x04, 0x09, 0x0B, 0x00, 0xA8, 0x18, +/* 00001050 */ 0x47, 0x0E, 0x18, 0x47, 0x0F, 0x04, 0x09, 0xBB, 0x00, 0x62, 0x18, 0x0C, 0x03, 0x47, 0x10, 0x18, +/* 00001060 */ 0x01, 0x47, 0x01, 0x19, 0x6D, 0x18, 0x19, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x19, 0x5C, 0x01, +/* 00001070 */ 0x0D, 0xF2, 0x02, 0x18, 0x18, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x03, 0x00, 0x18, 0x09, +/* 00001080 */ 0x0A, 0x00, 0x62, 0x19, 0x0D, 0x05, 0x47, 0x18, 0x19, 0x09, 0x1E, 0x00, 0x01, 0x47, 0x01, 0x1A, +/* 00001090 */ 0x6D, 0x19, 0x1A, 0x06, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x0D, 0xF2, 0x02, 0x19, +/* 000010A0 */ 0x19, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x18, 0x19, 0x47, 0x11, 0x18, 0x12, 0x03, 0x00, +/* 000010B0 */ 0x10, 0x11, 0x09, 0x53, 0x00, 0x62, 0x18, 0x0C, 0x07, 0x47, 0x12, 0x18, 0x2F, 0x18, 0x10, 0x05, +/* 000010C0 */ 0x77, 0x18, 0x0C, 0x08, 0x14, 0x03, 0x00, 0x12, 0x05, 0x09, 0x0C, 0x00, 0x98, 0x18, 0x0D, 0x10, +/* 000010D0 */ 0x00, 0x00, 0x47, 0x0E, 0x18, 0x09, 0x2A, 0x00, 0x14, 0x03, 0x00, 0x12, 0x06, 0x09, 0x06, 0x00, +/* 000010E0 */ 0x47, 0x0E, 0x10, 0x09, 0x1C, 0x00, 0x47, 0x13, 0x10, 0x98, 0x18, 0x0D, 0x10, 0x01, 0x00, 0x47, +/* 000010F0 */ 0x14, 0x18, 0xCE, 0x18, 0x02, 0x00, 0x00, 0xA1, 0x00, 0x13, 0x18, 0xA1, 0x01, 0x14, 0x18, 0x47, +/* 00001100 */ 0x0E, 0x18, 0x47, 0x0F, 0x07, 0x09, 0x0C, 0x00, 0x77, 0x04, 0x0C, 0x09, 0xA8, 0x18, 0x47, 0x0E, +/* 00001110 */ 0x18, 0x47, 0x0F, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00001120 */ 0x00, 0x7B, 0x0E, 0x00, 0x0A, 0x7B, 0x0F, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, +/* 00001130 */ 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, +/* 00001140 */ 0x01, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, 0xFE, 0xF3, 0x02, 0xFE, 0x00, 0x03, 0xFE, 0x03, 0x03, +/* 00001150 */ 0xFE, 0x01, 0x03, 0xE0, 0xF3, 0xFE, 0xB5, 0x02, 0xFE, 0x02, 0x03, 0xFE, 0x01, 0x03, 0xFE, 0x03, +/* 00001160 */ 0x03, 0xFE, 0xB6, 0x01, 0x9F, 0xFE, 0xA2, 0x01, 0xFE, 0x81, 0x09, 0x1B, 0x17, 0x00, 0x00, 0x00, +/* 00001170 */ 0x03, 0x00, 0x1F, 0x00, 0x14, 0x00, 0x49, 0x00, 0x16, 0x00, 0x81, 0x00, 0x07, 0x00, 0x2A, 0x00, +/* 00001180 */ 0x05, 0x00, 0x0B, 0x00, 0x05, 0x00, 0x17, 0x00, 0x0C, 0x00, 0x39, 0x00, 0x05, 0x00, 0x27, 0x00, +/* 00001190 */ 0x06, 0x00, 0x3A, 0x00, 0x07, 0x00, 0x33, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x08, 0x00, 0x70, 0x00, +/* 000011A0 */ 0x07, 0x00, 0x36, 0x00, 0x08, 0x00, 0x38, 0x00, 0x08, 0x00, 0x4F, 0x00, 0x0C, 0x00, 0x31, 0x00, +/* 000011B0 */ 0x08, 0x00, 0x78, 0x00, 0x06, 0x00, 0x4C, 0x00, 0x03, 0x00, 0x34, 0x00, 0x09, 0x00, 0x39, 0x00, +/* 000011C0 */ 0x10, 0x00, 0x56, 0x00, 0x06, 0x00, 0x43, 0x00, 0x04, 0x00, 0x35, 0x00, 0x05, 0x00, 0x2B, 0x00, +/* 000011D0 */ 0x03, 0x00, 0x45, 0x00, 0x1A, 0x00, 0x31, 0x00, 0x00, 0xBF, 0x5C, 0x04, 0xE0, 0x01, 0xC0, 0x00, +/* 000011E0 */ 0x1A, 0x3C, 0xA2, 0x41, 0xD1, 0x00, 0x03, 0xFE, 0xC8, 0x05, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 000011F0 */ 0x03, 0xFE, 0xC8, 0x05, 0xFE, 0xE9, 0x01, 0xFE, 0xE9, 0x01, 0x41, 0x05, 0x0A, 0x0D, 0x08, 0x14, +/* 00001200 */ 0x14, 0x01, 0x01, 0x05, 0x05, 0x05, 0x05, 0x05, 0xFE, 0xE5, 0x02, 0x01, 0x04, 0x06, 0xFE, 0x00, +/* 00001210 */ 0x03, 0x06, 0xFE, 0x01, 0x03, 0x06, 0xFE, 0x02, 0x03, 0x06, 0xFE, 0x03, 0x03, 0x01, 0x00, 0x0C, +/* 00001220 */ 0x4D, 0x5B, 0x0C, 0xB4, 0x0C, 0x0C, 0x01, 0x47, 0x01, 0x0E, 0x6D, 0x0D, 0x0E, 0x00, 0x07, 0x07, +/* 00001230 */ 0x00, 0x5C, 0x00, 0x0E, 0x5C, 0x01, 0x0C, 0x5D, 0x02, 0x03, 0x00, 0x00, 0x5D, 0x03, 0x04, 0x00, +/* 00001240 */ 0x00, 0x5D, 0x04, 0x05, 0x00, 0x00, 0x5D, 0x05, 0x06, 0x00, 0x00, 0x5D, 0x06, 0x07, 0x00, 0x00, +/* 00001250 */ 0xF2, 0x07, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x0A, 0x0C, 0x01, 0x77, 0x08, +/* 00001260 */ 0x0C, 0x02, 0x77, 0x0B, 0x0C, 0x03, 0x77, 0x09, 0x0C, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xB7, +/* 00001270 */ 0x02, 0xFE, 0x00, 0x03, 0xFE, 0x01, 0x03, 0xFE, 0x02, 0x03, 0xFE, 0x03, 0x03, 0xFE, 0x0B, 0x06, +/* 00001280 */ 0x06, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x82, 0x00, 0x04, 0x00, 0x28, 0x00, 0x04, 0x00, 0x22, +/* 00001290 */ 0x00, 0x04, 0x00, 0x29, 0x00, 0x06, 0x00, 0xB0, 0x00, 0x00, 0xBF, 0x5C, 0x84, 0x00, 0x00, 0xC4, +/* 000012A0 */ 0x00, 0x15, 0x1F, 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xFF, 0x02, 0x02, 0xFE, 0xD8, 0x04, 0xFF, 0x00, +/* 000012B0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xD8, 0x04, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, +/* 000012C0 */ 0x10, 0x01, 0x02, 0x02, 0x07, 0x07, 0x08, 0x39, 0x8F, 0x01, 0x03, 0x08, 0x00, 0x00, 0x07, 0x04, +/* 000012D0 */ 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8F, 0x01, 0x02, 0x09, 0x01, 0x00, +/* 000012E0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x06, 0x5D, 0x02, 0x02, 0x01, 0x00, 0xEE, 0x03, +/* 000012F0 */ 0x09, 0x09, 0x01, 0x00, 0x5C, 0x03, 0x09, 0xEE, 0x04, 0xFF, 0x08, 0x00, 0x00, 0xA8, 0x00, 0x24, +/* 00001300 */ 0x00, 0xFE, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x46, 0x00, 0x00}; + +} diff --git a/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.nojit.bc.32b.h b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.nojit.bc.32b.h new file mode 100644 index 00000000000..eca1a176e55 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.nojit.bc.32b.h @@ -0,0 +1,432 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#if 0 +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +"use strict"; + +(function (intrinsic) { + var platform = intrinsic.JsBuiltIn; + + let FunctionsEnum = { + ArrayValues: { className: "Array", methodName: "values", argumentsCount: 0, forceInline: true /*optional*/, alias: "Symbol.iterator" }, + ArrayKeys: { className: "Array", methodName: "keys", argumentsCount: 0, forceInline: true /*optional*/ }, + ArrayEntries: { className: "Array", methodName: "entries", argumentsCount: 0, forceInline: true /*optional*/ } + }; + + var setPrototype = platform.builtInSetPrototype; + var _objectDefineProperty = platform.builtInJavascriptObjectEntryDefineProperty; + + // Object's getter and setter can get overriden on the prototype, in that case while setting the value attributes, we will end up with TypeError + // So, we need to set the prototype of attributes to null + var ObjectDefineProperty = function (obj, prop, attributes) { + _objectDefineProperty(obj, prop, setPrototype(attributes, null)); + }; + var CreateObject = platform.builtInJavascriptObjectCreate; + + platform.registerChakraLibraryFunction("ArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + __chakraLibrary.InitInternalProperties(this, 4, "__$arrayObj$__", "__$nextIndex$__", "__$kind$__", "__$internalDone$__"); + this.__$arrayObj$__ = arrayObj; + this.__$nextIndex$__ = 0; + this.__$kind$__ = iterationKind; + this.__$internalDone$__ = false; // We use this additional property to enable hoisting load of arrayObj outside the loop, we write to this property instead of the arrayObj + }); + + // ArrayIterator's prototype is the C++ Iterator, which is also the prototype for StringIterator, MapIterator etc + var iteratorPrototype = platform.GetIteratorPrototype(); + // Establish prototype chain here + __chakraLibrary.ArrayIterator.prototype = CreateObject(iteratorPrototype); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, 'next', + { + value: function () { + "use strict"; + let o = this; + + if (!(o instanceof __chakraLibrary.ArrayIterator)) { + throw new TypeError("Array Iterator.prototype.next: 'this' is not an Array Iterator object"); + } + + let a = o.__$arrayObj$__; + let value, done; + + if (o.__$internalDone$__ === true) { + value = undefined; + done = true; + } else { + let index = o.__$nextIndex$__; + let len = __chakraLibrary.isArray(a) ? a.length : __chakraLibrary.GetLength(a); + + if (index < len) { // < comparison should happen instead of >= , because len can be NaN + let itemKind = o.__$kind$__; + + o.__$nextIndex$__ = index + 1; + + if (itemKind === 1 /*ArrayIterationKind.Value*/) { + value = a[index]; + } else if (itemKind === 0 /*ArrayIterationKind.Key*/) { // TODO (megupta) : Use clean enums here ? + value = index; + } else { + let elementKey = index; + let elementValue = a[index]; + value = [elementKey, elementValue]; + } + done = false; + } else { + o.__$internalDone$__ = true; + value = undefined; + done = true; + } + } + return { value: value, done: done }; + }, + writable: true, + enumerable: false, + configurable: true + } + ); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, Symbol.toStringTag, { value: "Array Iterator", writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'length', { value: 0, writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'name', { value: "next", writable: false, enumerable: false, configurable: true }); + + platform.registerChakraLibraryFunction("CreateArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + return new __chakraLibrary.ArrayIterator(arrayObj, iterationKind); + }); + + platform.registerFunction(FunctionsEnum.ArrayKeys, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.keys: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 0 /* ArrayIterationKind.Key*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayValues, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.values: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 1 /* ArrayIterationKind.Value*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayEntries, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.entries: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 2 /* ArrayIterationKind.KeyAndValue*/); + }); +}); +#endif +namespace Js +{ + const char Library_Bytecode_JsBuiltIn[] = { +/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x60, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, +/* 00000020 */ 0x8F, 0x17, 0xFE, 0x8F, 0x17, 0x31, 0x00, 0x00, 0x00, 0xAC, 0x05, 0x00, 0x00, 0xAA, 0x07, 0x00, +/* 00000030 */ 0x00, 0x25, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x1E, 0x01, 0x00, 0x00, +/* 00000040 */ 0x01, 0x36, 0x01, 0x00, 0x00, 0x00, 0x4A, 0x01, 0x00, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x00, +/* 00000050 */ 0x6C, 0x01, 0x00, 0x00, 0x00, 0x7A, 0x01, 0x00, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x00, 0xB0, +/* 00000060 */ 0x01, 0x00, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0x00, 0xDC, 0x01, 0x00, 0x00, 0x01, 0xF0, 0x01, +/* 00000070 */ 0x00, 0x00, 0x00, 0xFA, 0x01, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x24, 0x02, 0x00, +/* 00000080 */ 0x00, 0x01, 0x40, 0x02, 0x00, 0x00, 0x00, 0x4A, 0x02, 0x00, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, +/* 00000090 */ 0x00, 0x68, 0x02, 0x00, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x00, +/* 000000A0 */ 0xB6, 0x02, 0x00, 0x00, 0x00, 0xC4, 0x02, 0x00, 0x00, 0x00, 0xCE, 0x02, 0x00, 0x00, 0x01, 0xF6, +/* 000000B0 */ 0x02, 0x00, 0x00, 0x01, 0x10, 0x03, 0x00, 0x00, 0x01, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x66, 0x03, +/* 000000C0 */ 0x00, 0x00, 0x01, 0x84, 0x03, 0x00, 0x00, 0x01, 0xA4, 0x03, 0x00, 0x00, 0x01, 0xBA, 0x03, 0x00, +/* 000000D0 */ 0x00, 0x01, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x6C, 0x04, 0x00, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, +/* 000000E0 */ 0x00, 0xDA, 0x04, 0x00, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0xAC, 0x05, 0x00, 0x00, 0x00, +/* 000000F0 */ 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x63, 0x00, +/* 00000100 */ 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, +/* 00000110 */ 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x41, 0x00, +/* 00000120 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, +/* 00000130 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x73, 0x00, 0x73, 0x00, +/* 00000140 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00000150 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, +/* 00000160 */ 0x64, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, +/* 00000170 */ 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, +/* 00000180 */ 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x73, 0x00, 0x43, 0x00, 0x6F, 0x00, +/* 00000190 */ 0x75, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x63, 0x00, +/* 000001A0 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000001B0 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x73, 0x00, 0x00, 0x00, 0x53, 0x00, 0x79, 0x00, +/* 000001C0 */ 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000001D0 */ 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, +/* 000001E0 */ 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 000001F0 */ 0x6B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00000200 */ 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, +/* 00000210 */ 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, +/* 00000220 */ 0x73, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, +/* 00000230 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00000240 */ 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000250 */ 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, +/* 00000260 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 00000270 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 00000280 */ 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000290 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 000002A0 */ 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000002B0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, +/* 000002C0 */ 0x68, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, +/* 000002D0 */ 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000002E0 */ 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000002F0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000300 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00000310 */ 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, +/* 00000320 */ 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00000330 */ 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, +/* 00000340 */ 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, +/* 00000350 */ 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00000360 */ 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00000370 */ 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x24, 0x00, 0x5F, 0x00, +/* 00000380 */ 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, +/* 00000390 */ 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x24, 0x00, 0x5F, 0x00, +/* 000003A0 */ 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x6B, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 000003B0 */ 0x64, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, +/* 000003C0 */ 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 000003D0 */ 0x44, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, +/* 000003E0 */ 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, +/* 000003F0 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00000400 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000410 */ 0x2E, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, +/* 00000420 */ 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00000430 */ 0x20, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x20, 0x00, +/* 00000440 */ 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, +/* 00000450 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6F, 0x00, +/* 00000460 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x6F, 0x00, +/* 00000470 */ 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00000480 */ 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, +/* 00000490 */ 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x3A, 0x00, +/* 000004A0 */ 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, +/* 000004B0 */ 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, +/* 000004C0 */ 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, +/* 000004D0 */ 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000004E0 */ 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000004F0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000500 */ 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, +/* 00000510 */ 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, +/* 00000520 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, +/* 00000530 */ 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00000540 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00000550 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000560 */ 0x2E, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00000570 */ 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, +/* 00000580 */ 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 00000590 */ 0x20, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, +/* 000005A0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, +/* 000005B0 */ 0x00, 0x6A, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, +/* 000005C0 */ 0x00, 0x70, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x7F, 0x01, 0x00, 0x00, 0x97, 0x01, 0x00, +/* 000005D0 */ 0x00, 0xBF, 0x01, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xDA, 0x01, 0x00, 0x00, 0x6A, 0x02, 0x00, +/* 000005E0 */ 0x00, 0xDC, 0x02, 0x00, 0x00, 0x53, 0x03, 0x00, 0x00, 0x5A, 0x03, 0x00, 0x00, 0x5B, 0x03, 0x00, +/* 000005F0 */ 0x00, 0x90, 0x03, 0x00, 0x00, 0xE5, 0x03, 0x00, 0x00, 0xE6, 0x03, 0x00, 0x00, 0x7B, 0x04, 0x00, +/* 00000600 */ 0x00, 0xB9, 0x04, 0x00, 0x00, 0xFB, 0x04, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, 0x4C, 0x05, 0x00, +/* 00000610 */ 0x00, 0x8B, 0x05, 0x00, 0x00, 0x8C, 0x05, 0x00, 0x00, 0xED, 0x05, 0x00, 0x00, 0x03, 0x06, 0x00, +/* 00000620 */ 0x00, 0x85, 0x06, 0x00, 0x00, 0xAD, 0x06, 0x00, 0x00, 0xCF, 0x06, 0x00, 0x00, 0xF8, 0x06, 0x00, +/* 00000630 */ 0x00, 0xAC, 0x07, 0x00, 0x00, 0xB4, 0x07, 0x00, 0x00, 0xB5, 0x07, 0x00, 0x00, 0x2B, 0x08, 0x00, +/* 00000640 */ 0x00, 0x68, 0x08, 0x00, 0x00, 0x8E, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0xDE, 0x08, 0x00, +/* 00000650 */ 0x00, 0x28, 0x09, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, +/* 00000660 */ 0x00, 0x8F, 0x09, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0xD5, 0x09, 0x00, 0x00, 0x47, 0x0A, 0x00, +/* 00000670 */ 0x00, 0x59, 0x0A, 0x00, 0x00, 0x5A, 0x0A, 0x00, 0x00, 0x84, 0x0A, 0x00, 0x00, 0xA5, 0x0A, 0x00, +/* 00000680 */ 0x00, 0xA6, 0x0A, 0x00, 0x00, 0xDB, 0x0A, 0x00, 0x00, 0x02, 0x0B, 0x00, 0x00, 0x23, 0x0B, 0x00, +/* 00000690 */ 0x00, 0x3C, 0x0B, 0x00, 0x00, 0x6F, 0x0B, 0x00, 0x00, 0xD3, 0x0B, 0x00, 0x00, 0xD4, 0x0B, 0x00, +/* 000006A0 */ 0x00, 0x40, 0x0C, 0x00, 0x00, 0x75, 0x0C, 0x00, 0x00, 0x76, 0x0C, 0x00, 0x00, 0xAD, 0x0C, 0x00, +/* 000006B0 */ 0x00, 0xAE, 0x0C, 0x00, 0x00, 0xF9, 0x0C, 0x00, 0x00, 0x27, 0x0D, 0x00, 0x00, 0xA2, 0x0D, 0x00, +/* 000006C0 */ 0x00, 0xCD, 0x0D, 0x00, 0x00, 0xEE, 0x0D, 0x00, 0x00, 0x22, 0x0E, 0x00, 0x00, 0x5B, 0x0E, 0x00, +/* 000006D0 */ 0x00, 0x9B, 0x0E, 0x00, 0x00, 0xB5, 0x0E, 0x00, 0x00, 0xDB, 0x0E, 0x00, 0x00, 0xF8, 0x0E, 0x00, +/* 000006E0 */ 0x00, 0x2D, 0x0F, 0x00, 0x00, 0x58, 0x0F, 0x00, 0x00, 0x7D, 0x0F, 0x00, 0x00, 0x93, 0x0F, 0x00, +/* 000006F0 */ 0x00, 0xA5, 0x0F, 0x00, 0x00, 0xDA, 0x0F, 0x00, 0x00, 0xE9, 0x0F, 0x00, 0x00, 0x05, 0x10, 0x00, +/* 00000700 */ 0x00, 0x24, 0x10, 0x00, 0x00, 0x43, 0x10, 0x00, 0x00, 0x4D, 0x10, 0x00, 0x00, 0x54, 0x10, 0x00, +/* 00000710 */ 0x00, 0x55, 0x10, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x02, 0x11, 0x00, 0x00, 0x9A, 0x11, 0x00, +/* 00000720 */ 0x00, 0x9B, 0x11, 0x00, 0x00, 0x36, 0x12, 0x00, 0x00, 0x37, 0x12, 0x00, 0x00, 0x9E, 0x12, 0x00, +/* 00000730 */ 0x00, 0xB4, 0x12, 0x00, 0x00, 0xFF, 0x12, 0x00, 0x00, 0x07, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, +/* 00000740 */ 0x00, 0x4D, 0x13, 0x00, 0x00, 0x63, 0x13, 0x00, 0x00, 0x96, 0x13, 0x00, 0x00, 0xEC, 0x13, 0x00, +/* 00000750 */ 0x00, 0xF6, 0x13, 0x00, 0x00, 0x24, 0x14, 0x00, 0x00, 0x7A, 0x14, 0x00, 0x00, 0x82, 0x14, 0x00, +/* 00000760 */ 0x00, 0x83, 0x14, 0x00, 0x00, 0xCA, 0x14, 0x00, 0x00, 0xE0, 0x14, 0x00, 0x00, 0x13, 0x15, 0x00, +/* 00000770 */ 0x00, 0x6B, 0x15, 0x00, 0x00, 0x75, 0x15, 0x00, 0x00, 0xA3, 0x15, 0x00, 0x00, 0xFB, 0x15, 0x00, +/* 00000780 */ 0x00, 0x03, 0x16, 0x00, 0x00, 0x04, 0x16, 0x00, 0x00, 0x4C, 0x16, 0x00, 0x00, 0x62, 0x16, 0x00, +/* 00000790 */ 0x00, 0x95, 0x16, 0x00, 0x00, 0xEE, 0x16, 0x00, 0x00, 0xF8, 0x16, 0x00, 0x00, 0x26, 0x17, 0x00, +/* 000007A0 */ 0x00, 0x84, 0x17, 0x00, 0x00, 0x8C, 0x17, 0x00, 0x00, 0x00, 0x09, 0xB9, 0x0C, 0x00, 0x00, 0x00, +/* 000007B0 */ 0x04, 0x02, 0xA8, 0x41, 0xC0, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, 0x70, 0x01, 0x01, 0xFF, 0x00, +/* 000007C0 */ 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFE, 0x1F, 0x16, 0xFE, 0x1F, 0x16, 0x40, 0x01, 0x04, 0x04, +/* 000007D0 */ 0x05, 0x05, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x0A, 0x09, 0xA8, 0x00, 0xD4, 0x00, 0x04, 0xFA, 0x04, +/* 000007E0 */ 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0xED, 0x07, 0x00, 0x00, 0xBF, 0x1D, 0x00, +/* 000007F0 */ 0xE0, 0x89, 0xC6, 0x12, 0x07, 0x01, 0xA2, 0x41, 0xD1, 0x00, 0x01, 0xFE, 0x80, 0x01, 0x07, 0xFF, +/* 00000800 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x80, 0x01, 0xFE, 0x0D, 0x16, 0xFE, 0x0D, 0x16, 0x40, +/* 00000810 */ 0x02, 0x0C, 0x1E, 0x27, 0x05, 0x9A, 0x8E, 0x1D, 0x1C, 0x1D, 0x1D, 0x08, 0x24, 0x25, 0x26, 0x06, +/* 00000820 */ 0xFE, 0xE6, 0x02, 0x06, 0xFE, 0xE7, 0x02, 0x06, 0xFE, 0xE8, 0x02, 0x06, 0xFE, 0xE9, 0x02, 0x06, +/* 00000830 */ 0xFE, 0xEA, 0x02, 0x06, 0xFE, 0xEB, 0x02, 0x01, 0x00, 0x06, 0xFE, 0xEC, 0x02, 0x0B, 0x06, 0xFE, +/* 00000840 */ 0xED, 0x02, 0x05, 0xFE, 0xEE, 0x02, 0x07, 0x06, 0xFE, 0xEF, 0x02, 0x06, 0xFE, 0xF0, 0x02, 0x06, +/* 00000850 */ 0xFE, 0xF1, 0x02, 0x06, 0xFE, 0xF2, 0x02, 0x06, 0xFE, 0xF3, 0x02, 0x08, 0x06, 0xFE, 0xF4, 0x02, +/* 00000860 */ 0x06, 0xFE, 0xF5, 0x02, 0x06, 0xFE, 0xF6, 0x02, 0x06, 0xFE, 0xF7, 0x02, 0x0C, 0x06, 0xFE, 0xF8, +/* 00000870 */ 0x02, 0x05, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xFB, 0x02, 0x06, 0xFE, 0xFC, +/* 00000880 */ 0x02, 0xFE, 0x67, 0x02, 0x4F, 0x20, 0x61, 0x27, 0x1E, 0x00, 0x47, 0x1F, 0x27, 0xCC, 0x00, 0x00, +/* 00000890 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, +/* 000008A0 */ 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x04, 0x28, 0x01, 0x7A, 0x06, 0x28, 0x02, 0x7A, +/* 000008B0 */ 0x08, 0x28, 0x03, 0x7A, 0x0A, 0x28, 0x04, 0x7A, 0x0C, 0x28, 0x05, 0x7A, 0x28, 0x27, 0x06, 0xCC, +/* 000008C0 */ 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x04, 0x28, 0x01, +/* 000008D0 */ 0x7A, 0x0F, 0x28, 0x02, 0x7A, 0x08, 0x28, 0x03, 0x7A, 0x0A, 0x28, 0x04, 0x7A, 0x28, 0x27, 0x07, +/* 000008E0 */ 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x04, 0x28, +/* 000008F0 */ 0x01, 0x7A, 0x11, 0x28, 0x02, 0x7A, 0x08, 0x28, 0x03, 0x7A, 0x0A, 0x28, 0x04, 0x7A, 0x28, 0x27, +/* 00000900 */ 0x08, 0x47, 0x20, 0x27, 0x61, 0x27, 0x1F, 0x09, 0x96, 0x02, 0x27, 0x61, 0x27, 0x1F, 0x0A, 0x96, +/* 00000910 */ 0x03, 0x27, 0xD4, 0x00, 0x27, 0x47, 0x21, 0x27, 0x61, 0x27, 0x1F, 0x0B, 0x47, 0x22, 0x27, 0x6C, +/* 00000920 */ 0x27, 0x1F, 0x0C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1F, 0x5C, 0x01, 0x12, 0xD4, 0x01, 0x28, 0x5C, +/* 00000930 */ 0x02, 0x28, 0x1F, 0x03, 0xFF, 0x27, 0x6C, 0x27, 0x1F, 0x0D, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x1F, +/* 00000940 */ 0x1F, 0x01, 0x27, 0x27, 0x47, 0x23, 0x27, 0x01, 0x47, 0x01, 0x27, 0x61, 0x27, 0x27, 0x0E, 0x07, +/* 00000950 */ 0x02, 0x00, 0x5C, 0x00, 0x13, 0x5C, 0x01, 0x23, 0x1F, 0x02, 0x28, 0x22, 0x76, 0x28, 0x27, 0x0F, +/* 00000960 */ 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x61, 0x28, 0x28, +/* 00000970 */ 0x10, 0x61, 0x28, 0x28, 0x11, 0x5C, 0x01, 0x28, 0x5C, 0x02, 0x14, 0xCC, 0x60, 0x00, 0x00, 0x00, +/* 00000980 */ 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xD4, 0x02, 0x29, 0x7A, 0x29, 0x28, 0x12, 0x01, +/* 00000990 */ 0x65, 0x01, 0x29, 0x28, 0x7A, 0x0A, 0x28, 0x13, 0x7A, 0x18, 0x28, 0x14, 0x7A, 0x0A, 0x28, 0x15, +/* 000009A0 */ 0x5C, 0x03, 0x28, 0x1F, 0x04, 0xFF, 0x27, 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, +/* 000009B0 */ 0x01, 0x47, 0x01, 0x28, 0x61, 0x28, 0x28, 0x10, 0x61, 0x28, 0x28, 0x11, 0x5C, 0x01, 0x28, 0x6A, +/* 000009C0 */ 0x1C, 0x00, 0x00, 0x00, 0x28, 0x61, 0x28, 0x28, 0x16, 0x5C, 0x02, 0x28, 0xCC, 0x78, 0x00, 0x00, +/* 000009D0 */ 0x00, 0x05, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x1A, 0x28, 0x12, 0x7A, 0x18, 0x28, +/* 000009E0 */ 0x13, 0x7A, 0x18, 0x28, 0x14, 0x7A, 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0x1F, 0x04, 0xFF, 0x27, +/* 000009F0 */ 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x61, 0x28, 0x28, +/* 00000A00 */ 0x10, 0x61, 0x28, 0x28, 0x11, 0x61, 0x28, 0x28, 0x17, 0x5C, 0x01, 0x28, 0x5C, 0x02, 0x1B, 0xCC, +/* 00000A10 */ 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x08, 0x28, 0x12, +/* 00000A20 */ 0x7A, 0x18, 0x28, 0x13, 0x7A, 0x18, 0x28, 0x14, 0x7A, 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0x1F, +/* 00000A30 */ 0x04, 0xFF, 0x27, 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, +/* 00000A40 */ 0x61, 0x28, 0x28, 0x10, 0x61, 0x28, 0x28, 0x11, 0x61, 0x28, 0x28, 0x17, 0x5C, 0x01, 0x28, 0x5C, +/* 00000A50 */ 0x02, 0x1C, 0xCC, 0xA8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, +/* 00000A60 */ 0x14, 0x28, 0x12, 0x7A, 0x18, 0x28, 0x13, 0x7A, 0x18, 0x28, 0x14, 0x7A, 0x0A, 0x28, 0x15, 0x5C, +/* 00000A70 */ 0x03, 0x28, 0x1F, 0x04, 0xFF, 0x27, 0x6C, 0x27, 0x1F, 0x0C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1F, +/* 00000A80 */ 0x5C, 0x01, 0x1D, 0xD4, 0x03, 0x28, 0x5C, 0x02, 0x28, 0x1F, 0x03, 0xFF, 0x27, 0x47, 0x28, 0x1F, +/* 00000A90 */ 0x6C, 0x27, 0x28, 0x18, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x28, 0x61, 0x29, 0x20, 0x19, 0x5C, 0x01, +/* 00000AA0 */ 0x29, 0xD4, 0x04, 0x29, 0x5C, 0x02, 0x29, 0x1F, 0x03, 0xFF, 0x27, 0x47, 0x28, 0x1F, 0x6C, 0x27, +/* 00000AB0 */ 0x28, 0x18, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x28, 0x61, 0x29, 0x20, 0x1A, 0x5C, 0x01, 0x29, 0xD4, +/* 00000AC0 */ 0x05, 0x29, 0x5C, 0x02, 0x29, 0x1F, 0x03, 0xFF, 0x27, 0x47, 0x28, 0x1F, 0x6C, 0x27, 0x28, 0x18, +/* 00000AD0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x28, 0x61, 0x29, 0x20, 0x1B, 0x5C, 0x01, 0x29, 0xD4, 0x06, 0x29, +/* 00000AE0 */ 0x5C, 0x02, 0x29, 0x1F, 0x03, 0xFF, 0x27, 0xA8, 0x00, 0x24, 0x00, 0x08, 0xC0, 0x00, 0xA8, 0x00, +/* 00000AF0 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 00000B00 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 00000B10 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00000B20 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00000B30 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00000B40 */ 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00000B50 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x48, 0x00, +/* 00000B60 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, 0x02, +/* 00000B70 */ 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, 0x02, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 00000B80 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, 0x02, 0x00, 0x00, 0xB2, 0x02, +/* 00000B90 */ 0x00, 0x00, 0xB3, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, +/* 00000BA0 */ 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, 0x02, 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, 0x02, +/* 00000BB0 */ 0x00, 0x00, 0xB4, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, +/* 00000BC0 */ 0x00, 0x00, 0xE6, 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x85, 0xFE, +/* 00000BD0 */ 0xB0, 0x02, 0xFE, 0xB1, 0x02, 0xFE, 0xB2, 0x02, 0xFE, 0xB3, 0x02, 0xFE, 0xB4, 0x02, 0xFE, 0xE6, +/* 00000BE0 */ 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF1, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x45, 0x02, +/* 00000BF0 */ 0xFE, 0xAE, 0x02, 0xFE, 0xB6, 0x02, 0xFE, 0xF3, 0x02, 0xFE, 0x48, 0x01, 0xFE, 0xF3, 0x02, 0xFE, +/* 00000C00 */ 0x48, 0x01, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0x9A, +/* 00000C10 */ 0x01, 0xFE, 0x2C, 0x01, 0xFE, 0xAF, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xE6, 0x02, 0xFE, 0xF1, 0x02, +/* 00000C20 */ 0xFE, 0x87, 0x01, 0xFE, 0xFD, 0x02, 0xFE, 0xFE, 0x02, 0xFE, 0x9B, 0x01, 0x12, 0x02, 0x00, 0x00, +/* 00000C30 */ 0x00, 0x07, 0x00, 0x29, 0x00, 0x77, 0x00, 0x9B, 0x01, 0x07, 0x00, 0x35, 0x00, 0x07, 0x00, 0x29, +/* 00000C40 */ 0x01, 0x06, 0x00, 0x93, 0x00, 0x07, 0x00, 0x40, 0x00, 0x17, 0x00, 0x9F, 0x02, 0x11, 0x00, 0x63, +/* 00000C50 */ 0x00, 0x19, 0x00, 0x50, 0x00, 0x47, 0x00, 0x77, 0x07, 0x49, 0x00, 0xAD, 0x00, 0x43, 0x00, 0x99, +/* 00000C60 */ 0x00, 0x43, 0x00, 0x9C, 0x00, 0x17, 0x00, 0xD1, 0x00, 0x1E, 0x00, 0x7B, 0x01, 0x1E, 0x00, 0x81, +/* 00000C70 */ 0x01, 0x20, 0x00, 0x84, 0x01, 0x00, 0xF7, 0x11, 0x00, 0x00, 0x47, 0x11, 0x00, 0x00, 0x23, 0x0F, +/* 00000C80 */ 0x00, 0x00, 0xC9, 0x0E, 0x00, 0x00, 0x0C, 0x0E, 0x00, 0x00, 0x4F, 0x0D, 0x00, 0x00, 0x92, 0x0C, +/* 00000C90 */ 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, 0x01, 0xC0, 0x00, 0x76, 0x3A, 0xA0, 0x41, 0xD1, 0x00, 0x08, +/* 00000CA0 */ 0xFE, 0x3E, 0x16, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x3E, 0x16, 0xFE, 0x4B, 0x01, +/* 00000CB0 */ 0xFE, 0x4B, 0x01, 0x01, 0x04, 0x06, 0x08, 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x02, 0x03, 0x03, 0x05, +/* 00000CC0 */ 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, 0x08, 0x03, 0x01, 0x02, 0x62, 0x5B, 0x06, 0xB3, 0x06, 0x06, +/* 00000CD0 */ 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, +/* 00000CE0 */ 0x08, 0x09, 0x12, 0x00, 0x6A, 0x02, 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x04, +/* 00000CF0 */ 0xC2, 0x02, 0x08, 0x08, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x02, +/* 00000D00 */ 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x07, 0x08, 0x01, 0x47, +/* 00000D10 */ 0x01, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x07, 0x5C, +/* 00000D20 */ 0x02, 0x05, 0x1F, 0x03, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, +/* 00000D30 */ 0xFE, 0xFC, 0x02, 0xFE, 0xA2, 0x01, 0xFE, 0x6A, 0x16, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, +/* 00000D40 */ 0x37, 0x00, 0x12, 0x00, 0x5F, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x1D, 0x00, 0x5A, 0x00, 0x00, 0xBF, +/* 00000D50 */ 0x5C, 0x00, 0xE0, 0x01, 0xC0, 0x00, 0x6D, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x07, 0xFE, 0xBC, 0x14, +/* 00000D60 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xBC, 0x14, 0xFE, 0x44, 0x01, 0xFE, 0x44, 0x01, +/* 00000D70 */ 0x01, 0x04, 0x06, 0x08, 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, +/* 00000D80 */ 0x07, 0x05, 0xFE, 0x07, 0x03, 0x01, 0x01, 0x62, 0x5B, 0x06, 0xB3, 0x06, 0x06, 0x4F, 0x07, 0x14, +/* 00000D90 */ 0x0D, 0x00, 0x06, 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x12, +/* 00000DA0 */ 0x00, 0x6A, 0x02, 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x04, 0xC2, 0x02, 0x08, +/* 00000DB0 */ 0x08, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00000DC0 */ 0x09, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6C, +/* 00000DD0 */ 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x05, 0x1F, +/* 00000DE0 */ 0x03, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, +/* 00000DF0 */ 0xFE, 0xA2, 0x01, 0xFE, 0xE8, 0x14, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x12, +/* 00000E00 */ 0x00, 0x5E, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x1D, 0x00, 0x54, 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, +/* 00000E10 */ 0x01, 0xC0, 0x00, 0x64, 0x37, 0xA0, 0x41, 0xD1, 0x00, 0x06, 0xFE, 0x3F, 0x13, 0xFF, 0x00, 0x10, +/* 00000E20 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0x3F, 0x13, 0xFE, 0x40, 0x01, 0xFE, 0x40, 0x01, 0x01, 0x04, 0x06, +/* 00000E30 */ 0x08, 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, +/* 00000E40 */ 0x06, 0x03, 0x01, 0x00, 0x62, 0x5B, 0x06, 0xB3, 0x06, 0x06, 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, +/* 00000E50 */ 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x12, 0x00, 0x6A, 0x02, +/* 00000E60 */ 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x04, 0xC2, 0x02, 0x08, 0x08, 0x23, 0x08, +/* 00000E70 */ 0x01, 0x47, 0x01, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, +/* 00000E80 */ 0x06, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6C, 0x08, 0x09, 0x01, +/* 00000E90 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0x00, 0x08, +/* 00000EA0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, 0xFE, 0xA2, 0x01, +/* 00000EB0 */ 0xFE, 0x6B, 0x13, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x12, 0x00, 0x5C, 0x00, +/* 00000EC0 */ 0x18, 0x00, 0x2E, 0x00, 0x1D, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, 0x01, 0xC0, 0x00, +/* 00000ED0 */ 0x5F, 0x42, 0xA2, 0x41, 0xD1, 0x00, 0x05, 0xFE, 0x79, 0x12, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 00000EE0 */ 0x03, 0xFE, 0x79, 0x12, 0x8B, 0x8B, 0x01, 0x03, 0x03, 0x05, 0x04, 0x0A, 0x0A, 0x01, 0x01, 0x01, +/* 00000EF0 */ 0x01, 0x01, 0x05, 0xFE, 0xE5, 0x02, 0x1C, 0x01, 0x47, 0x01, 0x05, 0x61, 0x05, 0x05, 0x00, 0x07, +/* 00000F00 */ 0x03, 0x00, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0xC2, 0x03, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, +/* 00000F10 */ 0x00, 0x24, 0x00, 0xFE, 0xF3, 0x02, 0xFE, 0xBC, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, +/* 00000F20 */ 0x47, 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, 0x2B, 0xD0, 0x10, 0x2A, 0x13, 0xA0, 0x41, 0xC1, 0x00, +/* 00000F30 */ 0xFE, 0xF5, 0x02, 0x04, 0xFE, 0x45, 0x09, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x45, +/* 00000F40 */ 0x09, 0xFE, 0xA2, 0x06, 0xFE, 0xA2, 0x06, 0x01, 0x10, 0x0B, 0x15, 0x03, 0x5B, 0x48, 0x01, 0x0D, +/* 00000F50 */ 0x0C, 0x0D, 0x0D, 0x01, 0x01, 0x03, 0x15, 0x05, 0xFE, 0xE5, 0x02, 0x05, 0xFE, 0x04, 0x03, 0x0B, +/* 00000F60 */ 0x01, 0x01, 0x01, 0x00, 0x0C, 0x06, 0xFE, 0xF5, 0x02, 0x06, 0xFE, 0x05, 0x03, 0x07, 0xFE, 0x2D, +/* 00000F70 */ 0x01, 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, 0x4F, 0x0C, 0x4F, 0x0D, 0x4F, 0x0E, 0x4F, 0x0F, 0x4F, 0x10, +/* 00000F80 */ 0x4F, 0x11, 0x4F, 0x12, 0x4F, 0x13, 0x4F, 0x14, 0x47, 0x0C, 0x0B, 0x01, 0x47, 0x01, 0x18, 0x61, +/* 00000F90 */ 0x18, 0x18, 0x00, 0xE1, 0x18, 0x0C, 0x18, 0x00, 0x0F, 0x15, 0x00, 0x18, 0x09, 0x00, 0x00, 0x6A, +/* 00000FA0 */ 0x0C, 0x00, 0x00, 0x00, 0x18, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x03, 0xC2, 0x02, 0x18, 0x18, 0x23, +/* 00000FB0 */ 0x18, 0x61, 0x18, 0x0C, 0x01, 0x47, 0x0D, 0x18, 0xA8, 0x18, 0x47, 0x0E, 0x18, 0xA8, 0x18, 0x47, +/* 00000FC0 */ 0x0F, 0x18, 0x61, 0x18, 0x0C, 0x02, 0x14, 0x03, 0x00, 0x18, 0x04, 0x09, 0x0B, 0x00, 0xA8, 0x18, +/* 00000FD0 */ 0x47, 0x0E, 0x18, 0x47, 0x0F, 0x04, 0x09, 0xA9, 0x00, 0x61, 0x18, 0x0C, 0x03, 0x47, 0x10, 0x18, +/* 00000FE0 */ 0x01, 0x47, 0x01, 0x19, 0x6C, 0x18, 0x19, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x19, 0x5C, 0x01, +/* 00000FF0 */ 0x0D, 0x1F, 0x02, 0x18, 0x18, 0x0F, 0x03, 0x00, 0x18, 0x09, 0x0A, 0x00, 0x61, 0x19, 0x0D, 0x05, +/* 00001000 */ 0x47, 0x18, 0x19, 0x09, 0x18, 0x00, 0x01, 0x47, 0x01, 0x1A, 0x6C, 0x19, 0x1A, 0x06, 0x07, 0x02, +/* 00001010 */ 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x19, 0x19, 0x47, 0x18, 0x19, 0x47, 0x11, +/* 00001020 */ 0x18, 0x12, 0x03, 0x00, 0x10, 0x11, 0x09, 0x4D, 0x00, 0x61, 0x18, 0x0C, 0x07, 0x47, 0x12, 0x18, +/* 00001030 */ 0x2F, 0x18, 0x10, 0x05, 0x76, 0x18, 0x0C, 0x08, 0x14, 0x03, 0x00, 0x12, 0x05, 0x09, 0x0A, 0x00, +/* 00001040 */ 0x97, 0x18, 0x0D, 0x10, 0x47, 0x0E, 0x18, 0x09, 0x26, 0x00, 0x14, 0x03, 0x00, 0x12, 0x06, 0x09, +/* 00001050 */ 0x06, 0x00, 0x47, 0x0E, 0x10, 0x09, 0x18, 0x00, 0x47, 0x13, 0x10, 0x97, 0x18, 0x0D, 0x10, 0x47, +/* 00001060 */ 0x14, 0x18, 0xCD, 0x18, 0x02, 0xA1, 0x00, 0x13, 0x18, 0xA1, 0x01, 0x14, 0x18, 0x47, 0x0E, 0x18, +/* 00001070 */ 0x47, 0x0F, 0x07, 0x09, 0x0C, 0x00, 0x76, 0x04, 0x0C, 0x09, 0xA8, 0x18, 0x47, 0x0E, 0x18, 0x47, +/* 00001080 */ 0x0F, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, +/* 00001090 */ 0x0E, 0x00, 0x0A, 0x7A, 0x0F, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x10, +/* 000010A0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 000010B0 */ 0x00, 0x9F, 0x00, 0x00, 0x00, 0xFE, 0xF3, 0x02, 0xFE, 0x00, 0x03, 0xFE, 0x03, 0x03, 0xFE, 0x01, +/* 000010C0 */ 0x03, 0xE0, 0xF3, 0xFE, 0xB5, 0x02, 0xFE, 0x02, 0x03, 0xFE, 0x01, 0x03, 0xFE, 0x03, 0x03, 0xFE, +/* 000010D0 */ 0xB6, 0x01, 0x9F, 0xFE, 0xA2, 0x01, 0xFE, 0x81, 0x09, 0x1B, 0x17, 0x00, 0x00, 0x00, 0x03, 0x00, +/* 000010E0 */ 0x1F, 0x00, 0x14, 0x00, 0x49, 0x00, 0x12, 0x00, 0x81, 0x00, 0x07, 0x00, 0x2A, 0x00, 0x05, 0x00, +/* 000010F0 */ 0x0B, 0x00, 0x05, 0x00, 0x17, 0x00, 0x0C, 0x00, 0x39, 0x00, 0x05, 0x00, 0x27, 0x00, 0x06, 0x00, +/* 00001100 */ 0x3A, 0x00, 0x07, 0x00, 0x33, 0x00, 0x41, 0x00, 0x65, 0x00, 0x08, 0x00, 0x70, 0x00, 0x07, 0x00, +/* 00001110 */ 0x36, 0x00, 0x08, 0x00, 0x38, 0x00, 0x08, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x08, 0x00, +/* 00001120 */ 0x78, 0x00, 0x06, 0x00, 0x4C, 0x00, 0x03, 0x00, 0x34, 0x00, 0x07, 0x00, 0x39, 0x00, 0x0E, 0x00, +/* 00001130 */ 0x56, 0x00, 0x06, 0x00, 0x43, 0x00, 0x04, 0x00, 0x35, 0x00, 0x05, 0x00, 0x2B, 0x00, 0x03, 0x00, +/* 00001140 */ 0x45, 0x00, 0x1A, 0x00, 0x31, 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, 0x01, 0xC0, 0x00, 0x1A, 0x3C, +/* 00001150 */ 0xA2, 0x41, 0xD1, 0x00, 0x03, 0xFE, 0xC8, 0x05, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, +/* 00001160 */ 0xC8, 0x05, 0xFE, 0xE9, 0x01, 0xFE, 0xE9, 0x01, 0x41, 0x05, 0x0A, 0x0D, 0x08, 0x14, 0x14, 0x01, +/* 00001170 */ 0x05, 0x05, 0x05, 0x05, 0x05, 0xFE, 0xE5, 0x02, 0x01, 0x04, 0x06, 0xFE, 0x00, 0x03, 0x06, 0xFE, +/* 00001180 */ 0x01, 0x03, 0x06, 0xFE, 0x02, 0x03, 0x06, 0xFE, 0x03, 0x03, 0x01, 0x00, 0x0C, 0x3D, 0x5B, 0x0C, +/* 00001190 */ 0xB3, 0x0C, 0x0C, 0x01, 0x47, 0x01, 0x0E, 0x6C, 0x0D, 0x0E, 0x00, 0x07, 0x07, 0x00, 0x5C, 0x00, +/* 000011A0 */ 0x0E, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x03, 0x5C, 0x03, 0x04, 0x5C, 0x04, 0x05, 0x5C, 0x05, 0x06, +/* 000011B0 */ 0x5C, 0x06, 0x07, 0x1F, 0x07, 0xFF, 0x0D, 0x76, 0x0A, 0x0C, 0x01, 0x76, 0x08, 0x0C, 0x02, 0x76, +/* 000011C0 */ 0x0B, 0x0C, 0x03, 0x76, 0x09, 0x0C, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xB7, 0x02, 0xFE, 0x00, +/* 000011D0 */ 0x03, 0xFE, 0x01, 0x03, 0xFE, 0x02, 0x03, 0xFE, 0x03, 0x03, 0xFE, 0x0B, 0x06, 0x06, 0x05, 0x00, +/* 000011E0 */ 0x00, 0x00, 0x24, 0x00, 0x82, 0x00, 0x04, 0x00, 0x28, 0x00, 0x04, 0x00, 0x22, 0x00, 0x04, 0x00, +/* 000011F0 */ 0x29, 0x00, 0x06, 0x00, 0xB0, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0x15, 0x1F, +/* 00001200 */ 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xFF, 0x02, 0x02, 0xFE, 0xD8, 0x04, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00001210 */ 0x04, 0x04, 0xFE, 0xD8, 0x04, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, 0x02, +/* 00001220 */ 0x07, 0x07, 0x08, 0x2F, 0x8E, 0x01, 0x03, 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, +/* 00001230 */ 0x04, 0x5C, 0x02, 0x05, 0x8E, 0x01, 0x02, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, +/* 00001240 */ 0x06, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x09, 0x09, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, 0xA8, +/* 00001250 */ 0x00, 0x24, 0x00, 0xFE, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x00}; + +} diff --git a/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.nojit.bc.64b.h b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.nojit.bc.64b.h new file mode 100644 index 00000000000..813c10750af --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltIn/JsBuiltIn.js.nojit.bc.64b.h @@ -0,0 +1,432 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#if 0 +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +"use strict"; + +(function (intrinsic) { + var platform = intrinsic.JsBuiltIn; + + let FunctionsEnum = { + ArrayValues: { className: "Array", methodName: "values", argumentsCount: 0, forceInline: true /*optional*/, alias: "Symbol.iterator" }, + ArrayKeys: { className: "Array", methodName: "keys", argumentsCount: 0, forceInline: true /*optional*/ }, + ArrayEntries: { className: "Array", methodName: "entries", argumentsCount: 0, forceInline: true /*optional*/ } + }; + + var setPrototype = platform.builtInSetPrototype; + var _objectDefineProperty = platform.builtInJavascriptObjectEntryDefineProperty; + + // Object's getter and setter can get overriden on the prototype, in that case while setting the value attributes, we will end up with TypeError + // So, we need to set the prototype of attributes to null + var ObjectDefineProperty = function (obj, prop, attributes) { + _objectDefineProperty(obj, prop, setPrototype(attributes, null)); + }; + var CreateObject = platform.builtInJavascriptObjectCreate; + + platform.registerChakraLibraryFunction("ArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + __chakraLibrary.InitInternalProperties(this, 4, "__$arrayObj$__", "__$nextIndex$__", "__$kind$__", "__$internalDone$__"); + this.__$arrayObj$__ = arrayObj; + this.__$nextIndex$__ = 0; + this.__$kind$__ = iterationKind; + this.__$internalDone$__ = false; // We use this additional property to enable hoisting load of arrayObj outside the loop, we write to this property instead of the arrayObj + }); + + // ArrayIterator's prototype is the C++ Iterator, which is also the prototype for StringIterator, MapIterator etc + var iteratorPrototype = platform.GetIteratorPrototype(); + // Establish prototype chain here + __chakraLibrary.ArrayIterator.prototype = CreateObject(iteratorPrototype); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, 'next', + { + value: function () { + "use strict"; + let o = this; + + if (!(o instanceof __chakraLibrary.ArrayIterator)) { + throw new TypeError("Array Iterator.prototype.next: 'this' is not an Array Iterator object"); + } + + let a = o.__$arrayObj$__; + let value, done; + + if (o.__$internalDone$__ === true) { + value = undefined; + done = true; + } else { + let index = o.__$nextIndex$__; + let len = __chakraLibrary.isArray(a) ? a.length : __chakraLibrary.GetLength(a); + + if (index < len) { // < comparison should happen instead of >= , because len can be NaN + let itemKind = o.__$kind$__; + + o.__$nextIndex$__ = index + 1; + + if (itemKind === 1 /*ArrayIterationKind.Value*/) { + value = a[index]; + } else if (itemKind === 0 /*ArrayIterationKind.Key*/) { // TODO (megupta) : Use clean enums here ? + value = index; + } else { + let elementKey = index; + let elementValue = a[index]; + value = [elementKey, elementValue]; + } + done = false; + } else { + o.__$internalDone$__ = true; + value = undefined; + done = true; + } + } + return { value: value, done: done }; + }, + writable: true, + enumerable: false, + configurable: true + } + ); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype, Symbol.toStringTag, { value: "Array Iterator", writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'length', { value: 0, writable: false, enumerable: false, configurable: true }); + + ObjectDefineProperty(__chakraLibrary.ArrayIterator.prototype.next, 'name', { value: "next", writable: false, enumerable: false, configurable: true }); + + platform.registerChakraLibraryFunction("CreateArrayIterator", function (arrayObj, iterationKind) { + "use strict"; + return new __chakraLibrary.ArrayIterator(arrayObj, iterationKind); + }); + + platform.registerFunction(FunctionsEnum.ArrayKeys, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.keys: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 0 /* ArrayIterationKind.Key*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayValues, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.values: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 1 /* ArrayIterationKind.Value*/); + }); + + platform.registerFunction(FunctionsEnum.ArrayEntries, function () { + "use strict"; + if (this === null || this === undefined) { + throw new TypeError("Array.prototype.entries: 'this' is null or undefined"); + } + let o = __chakraLibrary.Object(this); + return __chakraLibrary.CreateArrayIterator(o, 2 /* ArrayIterationKind.KeyAndValue*/); + }); +}); +#endif +namespace Js +{ + const char Library_Bytecode_JsBuiltIn[] = { +/* 00000000 */ 0x43, 0x68, 0x42, 0x63, 0x60, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 00000010 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, +/* 00000020 */ 0x8F, 0x17, 0xFE, 0x8F, 0x17, 0x31, 0x00, 0x00, 0x00, 0xAC, 0x05, 0x00, 0x00, 0xAA, 0x07, 0x00, +/* 00000030 */ 0x00, 0x25, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x1E, 0x01, 0x00, 0x00, +/* 00000040 */ 0x01, 0x36, 0x01, 0x00, 0x00, 0x00, 0x4A, 0x01, 0x00, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x00, +/* 00000050 */ 0x6C, 0x01, 0x00, 0x00, 0x00, 0x7A, 0x01, 0x00, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x00, 0xB0, +/* 00000060 */ 0x01, 0x00, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0x00, 0xDC, 0x01, 0x00, 0x00, 0x01, 0xF0, 0x01, +/* 00000070 */ 0x00, 0x00, 0x00, 0xFA, 0x01, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x24, 0x02, 0x00, +/* 00000080 */ 0x00, 0x01, 0x40, 0x02, 0x00, 0x00, 0x00, 0x4A, 0x02, 0x00, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, +/* 00000090 */ 0x00, 0x68, 0x02, 0x00, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x00, +/* 000000A0 */ 0xB6, 0x02, 0x00, 0x00, 0x00, 0xC4, 0x02, 0x00, 0x00, 0x00, 0xCE, 0x02, 0x00, 0x00, 0x01, 0xF6, +/* 000000B0 */ 0x02, 0x00, 0x00, 0x01, 0x10, 0x03, 0x00, 0x00, 0x01, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x66, 0x03, +/* 000000C0 */ 0x00, 0x00, 0x01, 0x84, 0x03, 0x00, 0x00, 0x01, 0xA4, 0x03, 0x00, 0x00, 0x01, 0xBA, 0x03, 0x00, +/* 000000D0 */ 0x00, 0x01, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x6C, 0x04, 0x00, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, +/* 000000E0 */ 0x00, 0xDA, 0x04, 0x00, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0xAC, 0x05, 0x00, 0x00, 0x00, +/* 000000F0 */ 0x47, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x63, 0x00, +/* 00000100 */ 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, +/* 00000110 */ 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x41, 0x00, +/* 00000120 */ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x75, 0x00, +/* 00000130 */ 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x73, 0x00, 0x73, 0x00, +/* 00000140 */ 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00000150 */ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, +/* 00000160 */ 0x64, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, +/* 00000170 */ 0x6C, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x00, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, +/* 00000180 */ 0x75, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x73, 0x00, 0x43, 0x00, 0x6F, 0x00, +/* 00000190 */ 0x75, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x63, 0x00, +/* 000001A0 */ 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 000001B0 */ 0x61, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x61, 0x00, 0x73, 0x00, 0x00, 0x00, 0x53, 0x00, 0x79, 0x00, +/* 000001C0 */ 0x6D, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x69, 0x00, 0x74, 0x00, 0x65, 0x00, +/* 000001D0 */ 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, +/* 000001E0 */ 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x00, 0x00, +/* 000001F0 */ 0x6B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 00000200 */ 0x61, 0x00, 0x79, 0x00, 0x45, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, +/* 00000210 */ 0x73, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, +/* 00000220 */ 0x73, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, +/* 00000230 */ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, +/* 00000240 */ 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x00, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000250 */ 0x75, 0x00, 0x65, 0x00, 0x00, 0x00, 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, +/* 00000260 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6D, 0x00, +/* 00000270 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, +/* 00000280 */ 0x6F, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 00000290 */ 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, +/* 000002A0 */ 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000002B0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x74, 0x00, +/* 000002C0 */ 0x68, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x43, 0x00, +/* 000002D0 */ 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000002E0 */ 0x61, 0x00, 0x79, 0x00, 0x49, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, +/* 000002F0 */ 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x50, 0x00, 0x72, 0x00, +/* 00000300 */ 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x00, 0x00, +/* 00000310 */ 0x5F, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, +/* 00000320 */ 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, +/* 00000330 */ 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x62, 0x00, +/* 00000340 */ 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x44, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, +/* 00000350 */ 0x6E, 0x00, 0x65, 0x00, 0x50, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, +/* 00000360 */ 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x61, 0x00, 0x72, 0x00, +/* 00000370 */ 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x24, 0x00, 0x5F, 0x00, +/* 00000380 */ 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, +/* 00000390 */ 0x74, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x24, 0x00, 0x5F, 0x00, +/* 000003A0 */ 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, 0x6B, 0x00, 0x69, 0x00, 0x6E, 0x00, +/* 000003B0 */ 0x64, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x24, 0x00, +/* 000003C0 */ 0x69, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 000003D0 */ 0x44, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x24, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, +/* 000003E0 */ 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, +/* 000003F0 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00000400 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000410 */ 0x2E, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, +/* 00000420 */ 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, +/* 00000430 */ 0x20, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x20, 0x00, +/* 00000440 */ 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x49, 0x00, 0x74, 0x00, +/* 00000450 */ 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6F, 0x00, +/* 00000460 */ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x64, 0x00, 0x6F, 0x00, +/* 00000470 */ 0x6E, 0x00, 0x65, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, +/* 00000480 */ 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, +/* 00000490 */ 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x3A, 0x00, +/* 000004A0 */ 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, +/* 000004B0 */ 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, +/* 000004C0 */ 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, +/* 000004D0 */ 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, +/* 000004E0 */ 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, +/* 000004F0 */ 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x76, 0x00, 0x61, 0x00, 0x6C, 0x00, +/* 00000500 */ 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, +/* 00000510 */ 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, +/* 00000520 */ 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, +/* 00000530 */ 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, +/* 00000540 */ 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x2E, 0x00, 0x70, 0x00, +/* 00000550 */ 0x72, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, +/* 00000560 */ 0x2E, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, +/* 00000570 */ 0x3A, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x27, 0x00, +/* 00000580 */ 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x6C, 0x00, +/* 00000590 */ 0x20, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, +/* 000005A0 */ 0x66, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, +/* 000005B0 */ 0x00, 0x6A, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x6F, 0x01, 0x00, +/* 000005C0 */ 0x00, 0x70, 0x01, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x00, 0x7F, 0x01, 0x00, 0x00, 0x97, 0x01, 0x00, +/* 000005D0 */ 0x00, 0xBF, 0x01, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xDA, 0x01, 0x00, 0x00, 0x6A, 0x02, 0x00, +/* 000005E0 */ 0x00, 0xDC, 0x02, 0x00, 0x00, 0x53, 0x03, 0x00, 0x00, 0x5A, 0x03, 0x00, 0x00, 0x5B, 0x03, 0x00, +/* 000005F0 */ 0x00, 0x90, 0x03, 0x00, 0x00, 0xE5, 0x03, 0x00, 0x00, 0xE6, 0x03, 0x00, 0x00, 0x7B, 0x04, 0x00, +/* 00000600 */ 0x00, 0xB9, 0x04, 0x00, 0x00, 0xFB, 0x04, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, 0x4C, 0x05, 0x00, +/* 00000610 */ 0x00, 0x8B, 0x05, 0x00, 0x00, 0x8C, 0x05, 0x00, 0x00, 0xED, 0x05, 0x00, 0x00, 0x03, 0x06, 0x00, +/* 00000620 */ 0x00, 0x85, 0x06, 0x00, 0x00, 0xAD, 0x06, 0x00, 0x00, 0xCF, 0x06, 0x00, 0x00, 0xF8, 0x06, 0x00, +/* 00000630 */ 0x00, 0xAC, 0x07, 0x00, 0x00, 0xB4, 0x07, 0x00, 0x00, 0xB5, 0x07, 0x00, 0x00, 0x2B, 0x08, 0x00, +/* 00000640 */ 0x00, 0x68, 0x08, 0x00, 0x00, 0x8E, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0xDE, 0x08, 0x00, +/* 00000650 */ 0x00, 0x28, 0x09, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, +/* 00000660 */ 0x00, 0x8F, 0x09, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0xD5, 0x09, 0x00, 0x00, 0x47, 0x0A, 0x00, +/* 00000670 */ 0x00, 0x59, 0x0A, 0x00, 0x00, 0x5A, 0x0A, 0x00, 0x00, 0x84, 0x0A, 0x00, 0x00, 0xA5, 0x0A, 0x00, +/* 00000680 */ 0x00, 0xA6, 0x0A, 0x00, 0x00, 0xDB, 0x0A, 0x00, 0x00, 0x02, 0x0B, 0x00, 0x00, 0x23, 0x0B, 0x00, +/* 00000690 */ 0x00, 0x3C, 0x0B, 0x00, 0x00, 0x6F, 0x0B, 0x00, 0x00, 0xD3, 0x0B, 0x00, 0x00, 0xD4, 0x0B, 0x00, +/* 000006A0 */ 0x00, 0x40, 0x0C, 0x00, 0x00, 0x75, 0x0C, 0x00, 0x00, 0x76, 0x0C, 0x00, 0x00, 0xAD, 0x0C, 0x00, +/* 000006B0 */ 0x00, 0xAE, 0x0C, 0x00, 0x00, 0xF9, 0x0C, 0x00, 0x00, 0x27, 0x0D, 0x00, 0x00, 0xA2, 0x0D, 0x00, +/* 000006C0 */ 0x00, 0xCD, 0x0D, 0x00, 0x00, 0xEE, 0x0D, 0x00, 0x00, 0x22, 0x0E, 0x00, 0x00, 0x5B, 0x0E, 0x00, +/* 000006D0 */ 0x00, 0x9B, 0x0E, 0x00, 0x00, 0xB5, 0x0E, 0x00, 0x00, 0xDB, 0x0E, 0x00, 0x00, 0xF8, 0x0E, 0x00, +/* 000006E0 */ 0x00, 0x2D, 0x0F, 0x00, 0x00, 0x58, 0x0F, 0x00, 0x00, 0x7D, 0x0F, 0x00, 0x00, 0x93, 0x0F, 0x00, +/* 000006F0 */ 0x00, 0xA5, 0x0F, 0x00, 0x00, 0xDA, 0x0F, 0x00, 0x00, 0xE9, 0x0F, 0x00, 0x00, 0x05, 0x10, 0x00, +/* 00000700 */ 0x00, 0x24, 0x10, 0x00, 0x00, 0x43, 0x10, 0x00, 0x00, 0x4D, 0x10, 0x00, 0x00, 0x54, 0x10, 0x00, +/* 00000710 */ 0x00, 0x55, 0x10, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x02, 0x11, 0x00, 0x00, 0x9A, 0x11, 0x00, +/* 00000720 */ 0x00, 0x9B, 0x11, 0x00, 0x00, 0x36, 0x12, 0x00, 0x00, 0x37, 0x12, 0x00, 0x00, 0x9E, 0x12, 0x00, +/* 00000730 */ 0x00, 0xB4, 0x12, 0x00, 0x00, 0xFF, 0x12, 0x00, 0x00, 0x07, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, +/* 00000740 */ 0x00, 0x4D, 0x13, 0x00, 0x00, 0x63, 0x13, 0x00, 0x00, 0x96, 0x13, 0x00, 0x00, 0xEC, 0x13, 0x00, +/* 00000750 */ 0x00, 0xF6, 0x13, 0x00, 0x00, 0x24, 0x14, 0x00, 0x00, 0x7A, 0x14, 0x00, 0x00, 0x82, 0x14, 0x00, +/* 00000760 */ 0x00, 0x83, 0x14, 0x00, 0x00, 0xCA, 0x14, 0x00, 0x00, 0xE0, 0x14, 0x00, 0x00, 0x13, 0x15, 0x00, +/* 00000770 */ 0x00, 0x6B, 0x15, 0x00, 0x00, 0x75, 0x15, 0x00, 0x00, 0xA3, 0x15, 0x00, 0x00, 0xFB, 0x15, 0x00, +/* 00000780 */ 0x00, 0x03, 0x16, 0x00, 0x00, 0x04, 0x16, 0x00, 0x00, 0x4C, 0x16, 0x00, 0x00, 0x62, 0x16, 0x00, +/* 00000790 */ 0x00, 0x95, 0x16, 0x00, 0x00, 0xEE, 0x16, 0x00, 0x00, 0xF8, 0x16, 0x00, 0x00, 0x26, 0x17, 0x00, +/* 000007A0 */ 0x00, 0x84, 0x17, 0x00, 0x00, 0x8C, 0x17, 0x00, 0x00, 0x00, 0x09, 0xB9, 0x0C, 0x00, 0x00, 0x00, +/* 000007B0 */ 0x04, 0x02, 0xA8, 0x41, 0xC0, 0x00, 0xFE, 0xE4, 0x02, 0x00, 0xFE, 0x70, 0x01, 0x01, 0xFF, 0x00, +/* 000007C0 */ 0x10, 0x01, 0x00, 0xFE, 0x70, 0x01, 0xFE, 0x1F, 0x16, 0xFE, 0x1F, 0x16, 0x40, 0x01, 0x04, 0x04, +/* 000007D0 */ 0x05, 0x05, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x0A, 0x09, 0xA8, 0x00, 0xD4, 0x00, 0x04, 0xFA, 0x04, +/* 000007E0 */ 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0xED, 0x07, 0x00, 0x00, 0xBF, 0x1D, 0x00, +/* 000007F0 */ 0xE0, 0x89, 0xC6, 0x12, 0x07, 0x01, 0xA2, 0x41, 0xD1, 0x00, 0x01, 0xFE, 0x80, 0x01, 0x07, 0xFF, +/* 00000800 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x80, 0x01, 0xFE, 0x0D, 0x16, 0xFE, 0x0D, 0x16, 0x40, +/* 00000810 */ 0x02, 0x0C, 0x1E, 0x27, 0x05, 0x9A, 0x8E, 0x1D, 0x1C, 0x1D, 0x1D, 0x08, 0x24, 0x25, 0x26, 0x06, +/* 00000820 */ 0xFE, 0xE6, 0x02, 0x06, 0xFE, 0xE7, 0x02, 0x06, 0xFE, 0xE8, 0x02, 0x06, 0xFE, 0xE9, 0x02, 0x06, +/* 00000830 */ 0xFE, 0xEA, 0x02, 0x06, 0xFE, 0xEB, 0x02, 0x01, 0x00, 0x06, 0xFE, 0xEC, 0x02, 0x0B, 0x06, 0xFE, +/* 00000840 */ 0xED, 0x02, 0x05, 0xFE, 0xEE, 0x02, 0x07, 0x06, 0xFE, 0xEF, 0x02, 0x06, 0xFE, 0xF0, 0x02, 0x06, +/* 00000850 */ 0xFE, 0xF1, 0x02, 0x06, 0xFE, 0xF2, 0x02, 0x06, 0xFE, 0xF3, 0x02, 0x08, 0x06, 0xFE, 0xF4, 0x02, +/* 00000860 */ 0x06, 0xFE, 0xF5, 0x02, 0x06, 0xFE, 0xF6, 0x02, 0x06, 0xFE, 0xF7, 0x02, 0x0C, 0x06, 0xFE, 0xF8, +/* 00000870 */ 0x02, 0x05, 0xFE, 0xF9, 0x02, 0x06, 0xFE, 0xFA, 0x02, 0x06, 0xFE, 0xFB, 0x02, 0x06, 0xFE, 0xFC, +/* 00000880 */ 0x02, 0xFE, 0x67, 0x02, 0x4F, 0x20, 0x61, 0x27, 0x1E, 0x00, 0x47, 0x1F, 0x27, 0xCC, 0x00, 0x00, +/* 00000890 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0xCC, 0x14, 0x00, 0x00, 0x00, 0x01, +/* 000008A0 */ 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x04, 0x28, 0x01, 0x7A, 0x06, 0x28, 0x02, 0x7A, +/* 000008B0 */ 0x08, 0x28, 0x03, 0x7A, 0x0A, 0x28, 0x04, 0x7A, 0x0C, 0x28, 0x05, 0x7A, 0x28, 0x27, 0x06, 0xCC, +/* 000008C0 */ 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x04, 0x28, 0x01, +/* 000008D0 */ 0x7A, 0x0F, 0x28, 0x02, 0x7A, 0x08, 0x28, 0x03, 0x7A, 0x0A, 0x28, 0x04, 0x7A, 0x28, 0x27, 0x07, +/* 000008E0 */ 0xCC, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x04, 0x28, +/* 000008F0 */ 0x01, 0x7A, 0x11, 0x28, 0x02, 0x7A, 0x08, 0x28, 0x03, 0x7A, 0x0A, 0x28, 0x04, 0x7A, 0x28, 0x27, +/* 00000900 */ 0x08, 0x47, 0x20, 0x27, 0x61, 0x27, 0x1F, 0x09, 0x96, 0x02, 0x27, 0x61, 0x27, 0x1F, 0x0A, 0x96, +/* 00000910 */ 0x03, 0x27, 0xD4, 0x00, 0x27, 0x47, 0x21, 0x27, 0x61, 0x27, 0x1F, 0x0B, 0x47, 0x22, 0x27, 0x6C, +/* 00000920 */ 0x27, 0x1F, 0x0C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1F, 0x5C, 0x01, 0x12, 0xD4, 0x01, 0x28, 0x5C, +/* 00000930 */ 0x02, 0x28, 0x1F, 0x03, 0xFF, 0x27, 0x6C, 0x27, 0x1F, 0x0D, 0x07, 0x01, 0x00, 0x5C, 0x00, 0x1F, +/* 00000940 */ 0x1F, 0x01, 0x27, 0x27, 0x47, 0x23, 0x27, 0x01, 0x47, 0x01, 0x27, 0x61, 0x27, 0x27, 0x0E, 0x07, +/* 00000950 */ 0x02, 0x00, 0x5C, 0x00, 0x13, 0x5C, 0x01, 0x23, 0x1F, 0x02, 0x28, 0x22, 0x76, 0x28, 0x27, 0x0F, +/* 00000960 */ 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x61, 0x28, 0x28, +/* 00000970 */ 0x10, 0x61, 0x28, 0x28, 0x11, 0x5C, 0x01, 0x28, 0x5C, 0x02, 0x14, 0xCC, 0x60, 0x00, 0x00, 0x00, +/* 00000980 */ 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xD4, 0x02, 0x29, 0x7A, 0x29, 0x28, 0x12, 0x01, +/* 00000990 */ 0x65, 0x01, 0x29, 0x28, 0x7A, 0x0A, 0x28, 0x13, 0x7A, 0x18, 0x28, 0x14, 0x7A, 0x0A, 0x28, 0x15, +/* 000009A0 */ 0x5C, 0x03, 0x28, 0x1F, 0x04, 0xFF, 0x27, 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, +/* 000009B0 */ 0x01, 0x47, 0x01, 0x28, 0x61, 0x28, 0x28, 0x10, 0x61, 0x28, 0x28, 0x11, 0x5C, 0x01, 0x28, 0x6A, +/* 000009C0 */ 0x1C, 0x00, 0x00, 0x00, 0x28, 0x61, 0x28, 0x28, 0x16, 0x5C, 0x02, 0x28, 0xCC, 0x78, 0x00, 0x00, +/* 000009D0 */ 0x00, 0x05, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x1A, 0x28, 0x12, 0x7A, 0x18, 0x28, +/* 000009E0 */ 0x13, 0x7A, 0x18, 0x28, 0x14, 0x7A, 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0x1F, 0x04, 0xFF, 0x27, +/* 000009F0 */ 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, 0x61, 0x28, 0x28, +/* 00000A00 */ 0x10, 0x61, 0x28, 0x28, 0x11, 0x61, 0x28, 0x28, 0x17, 0x5C, 0x01, 0x28, 0x5C, 0x02, 0x1B, 0xCC, +/* 00000A10 */ 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, 0x08, 0x28, 0x12, +/* 00000A20 */ 0x7A, 0x18, 0x28, 0x13, 0x7A, 0x18, 0x28, 0x14, 0x7A, 0x0A, 0x28, 0x15, 0x5C, 0x03, 0x28, 0x1F, +/* 00000A30 */ 0x04, 0xFF, 0x27, 0x47, 0x27, 0x21, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x13, 0x01, 0x47, 0x01, 0x28, +/* 00000A40 */ 0x61, 0x28, 0x28, 0x10, 0x61, 0x28, 0x28, 0x11, 0x61, 0x28, 0x28, 0x17, 0x5C, 0x01, 0x28, 0x5C, +/* 00000A50 */ 0x02, 0x1C, 0xCC, 0xA8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7A, +/* 00000A60 */ 0x14, 0x28, 0x12, 0x7A, 0x18, 0x28, 0x13, 0x7A, 0x18, 0x28, 0x14, 0x7A, 0x0A, 0x28, 0x15, 0x5C, +/* 00000A70 */ 0x03, 0x28, 0x1F, 0x04, 0xFF, 0x27, 0x6C, 0x27, 0x1F, 0x0C, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x1F, +/* 00000A80 */ 0x5C, 0x01, 0x1D, 0xD4, 0x03, 0x28, 0x5C, 0x02, 0x28, 0x1F, 0x03, 0xFF, 0x27, 0x47, 0x28, 0x1F, +/* 00000A90 */ 0x6C, 0x27, 0x28, 0x18, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x28, 0x61, 0x29, 0x20, 0x19, 0x5C, 0x01, +/* 00000AA0 */ 0x29, 0xD4, 0x04, 0x29, 0x5C, 0x02, 0x29, 0x1F, 0x03, 0xFF, 0x27, 0x47, 0x28, 0x1F, 0x6C, 0x27, +/* 00000AB0 */ 0x28, 0x18, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x28, 0x61, 0x29, 0x20, 0x1A, 0x5C, 0x01, 0x29, 0xD4, +/* 00000AC0 */ 0x05, 0x29, 0x5C, 0x02, 0x29, 0x1F, 0x03, 0xFF, 0x27, 0x47, 0x28, 0x1F, 0x6C, 0x27, 0x28, 0x18, +/* 00000AD0 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x28, 0x61, 0x29, 0x20, 0x1B, 0x5C, 0x01, 0x29, 0xD4, 0x06, 0x29, +/* 00000AE0 */ 0x5C, 0x02, 0x29, 0x1F, 0x03, 0xFF, 0x27, 0xA8, 0x00, 0x24, 0x00, 0x08, 0xC0, 0x00, 0xA8, 0x00, +/* 00000AF0 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, +/* 00000B00 */ 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 00000B10 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, +/* 00000B20 */ 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, +/* 00000B30 */ 0x00, 0x00, 0xB6, 0x01, 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, +/* 00000B40 */ 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, +/* 00000B50 */ 0x00, 0x00, 0xB5, 0x01, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x00, 0xB4, 0x01, 0x00, 0x00, 0x48, 0x00, +/* 00000B60 */ 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, 0x02, +/* 00000B70 */ 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, 0x02, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x04, +/* 00000B80 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, 0x02, 0x00, 0x00, 0xB2, 0x02, +/* 00000B90 */ 0x00, 0x00, 0xB3, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, +/* 00000BA0 */ 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0xB1, 0x02, 0x00, 0x00, 0xB2, 0x02, 0x00, 0x00, 0xB3, 0x02, +/* 00000BB0 */ 0x00, 0x00, 0xB4, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, +/* 00000BC0 */ 0x00, 0x00, 0xE6, 0x02, 0x00, 0x00, 0xEF, 0x02, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x85, 0xFE, +/* 00000BD0 */ 0xB0, 0x02, 0xFE, 0xB1, 0x02, 0xFE, 0xB2, 0x02, 0xFE, 0xB3, 0x02, 0xFE, 0xB4, 0x02, 0xFE, 0xE6, +/* 00000BE0 */ 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xF1, 0x02, 0xFE, 0x37, 0x02, 0xFE, 0x40, 0x02, 0xFE, 0x45, 0x02, +/* 00000BF0 */ 0xFE, 0xAE, 0x02, 0xFE, 0xB6, 0x02, 0xFE, 0xF3, 0x02, 0xFE, 0x48, 0x01, 0xFE, 0xF3, 0x02, 0xFE, +/* 00000C00 */ 0x48, 0x01, 0xFE, 0xB6, 0x01, 0xFE, 0xB5, 0x01, 0xFE, 0xB3, 0x01, 0xFE, 0xB4, 0x01, 0xFE, 0x9A, +/* 00000C10 */ 0x01, 0xFE, 0x2C, 0x01, 0xFE, 0xAF, 0x02, 0xFE, 0xEF, 0x02, 0xFE, 0xE6, 0x02, 0xFE, 0xF1, 0x02, +/* 00000C20 */ 0xFE, 0x87, 0x01, 0xFE, 0xFD, 0x02, 0xFE, 0xFE, 0x02, 0xFE, 0x9B, 0x01, 0x12, 0x02, 0x00, 0x00, +/* 00000C30 */ 0x00, 0x07, 0x00, 0x29, 0x00, 0x77, 0x00, 0x9B, 0x01, 0x07, 0x00, 0x35, 0x00, 0x07, 0x00, 0x29, +/* 00000C40 */ 0x01, 0x06, 0x00, 0x93, 0x00, 0x07, 0x00, 0x40, 0x00, 0x17, 0x00, 0x9F, 0x02, 0x11, 0x00, 0x63, +/* 00000C50 */ 0x00, 0x19, 0x00, 0x50, 0x00, 0x47, 0x00, 0x77, 0x07, 0x49, 0x00, 0xAD, 0x00, 0x43, 0x00, 0x99, +/* 00000C60 */ 0x00, 0x43, 0x00, 0x9C, 0x00, 0x17, 0x00, 0xD1, 0x00, 0x1E, 0x00, 0x7B, 0x01, 0x1E, 0x00, 0x81, +/* 00000C70 */ 0x01, 0x20, 0x00, 0x84, 0x01, 0x00, 0xF7, 0x11, 0x00, 0x00, 0x47, 0x11, 0x00, 0x00, 0x23, 0x0F, +/* 00000C80 */ 0x00, 0x00, 0xC9, 0x0E, 0x00, 0x00, 0x0C, 0x0E, 0x00, 0x00, 0x4F, 0x0D, 0x00, 0x00, 0x92, 0x0C, +/* 00000C90 */ 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, 0x01, 0xC0, 0x00, 0x76, 0x3A, 0xA0, 0x41, 0xD1, 0x00, 0x08, +/* 00000CA0 */ 0xFE, 0x3E, 0x16, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x3E, 0x16, 0xFE, 0x4B, 0x01, +/* 00000CB0 */ 0xFE, 0x4B, 0x01, 0x01, 0x04, 0x06, 0x08, 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x02, 0x03, 0x03, 0x05, +/* 00000CC0 */ 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, 0x08, 0x03, 0x01, 0x02, 0x62, 0x5B, 0x06, 0xB3, 0x06, 0x06, +/* 00000CD0 */ 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, +/* 00000CE0 */ 0x08, 0x09, 0x12, 0x00, 0x6A, 0x02, 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x04, +/* 00000CF0 */ 0xC2, 0x02, 0x08, 0x08, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x02, +/* 00000D00 */ 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x07, 0x08, 0x01, 0x47, +/* 00000D10 */ 0x01, 0x09, 0x6C, 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x07, 0x5C, +/* 00000D20 */ 0x02, 0x05, 0x1F, 0x03, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, +/* 00000D30 */ 0xFE, 0xFC, 0x02, 0xFE, 0xA2, 0x01, 0xFE, 0x6A, 0x16, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, +/* 00000D40 */ 0x37, 0x00, 0x12, 0x00, 0x5F, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x1D, 0x00, 0x5A, 0x00, 0x00, 0xBF, +/* 00000D50 */ 0x5C, 0x00, 0xE0, 0x01, 0xC0, 0x00, 0x6D, 0x39, 0xA0, 0x41, 0xD1, 0x00, 0x07, 0xFE, 0xBC, 0x14, +/* 00000D60 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xBC, 0x14, 0xFE, 0x44, 0x01, 0xFE, 0x44, 0x01, +/* 00000D70 */ 0x01, 0x04, 0x06, 0x08, 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, +/* 00000D80 */ 0x07, 0x05, 0xFE, 0x07, 0x03, 0x01, 0x01, 0x62, 0x5B, 0x06, 0xB3, 0x06, 0x06, 0x4F, 0x07, 0x14, +/* 00000D90 */ 0x0D, 0x00, 0x06, 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x12, +/* 00000DA0 */ 0x00, 0x6A, 0x02, 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x04, 0xC2, 0x02, 0x08, +/* 00000DB0 */ 0x08, 0x23, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, +/* 00000DC0 */ 0x09, 0x5C, 0x01, 0x06, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6C, +/* 00000DD0 */ 0x08, 0x09, 0x01, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x05, 0x1F, +/* 00000DE0 */ 0x03, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, +/* 00000DF0 */ 0xFE, 0xA2, 0x01, 0xFE, 0xE8, 0x14, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x12, +/* 00000E00 */ 0x00, 0x5E, 0x00, 0x18, 0x00, 0x2E, 0x00, 0x1D, 0x00, 0x54, 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, +/* 00000E10 */ 0x01, 0xC0, 0x00, 0x64, 0x37, 0xA0, 0x41, 0xD1, 0x00, 0x06, 0xFE, 0x3F, 0x13, 0xFF, 0x00, 0x10, +/* 00000E20 */ 0x01, 0x00, 0x01, 0x01, 0xFE, 0x3F, 0x13, 0xFE, 0x40, 0x01, 0xFE, 0x40, 0x01, 0x01, 0x04, 0x06, +/* 00000E30 */ 0x08, 0x04, 0x1F, 0x1E, 0x01, 0x03, 0x02, 0x03, 0x03, 0x05, 0xFE, 0xE5, 0x02, 0x07, 0x05, 0xFE, +/* 00000E40 */ 0x06, 0x03, 0x01, 0x00, 0x62, 0x5B, 0x06, 0xB3, 0x06, 0x06, 0x4F, 0x07, 0x14, 0x0D, 0x00, 0x06, +/* 00000E50 */ 0x03, 0x09, 0x00, 0x00, 0xA8, 0x08, 0x14, 0x03, 0x00, 0x06, 0x08, 0x09, 0x12, 0x00, 0x6A, 0x02, +/* 00000E60 */ 0x00, 0x00, 0x00, 0x08, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x04, 0xC2, 0x02, 0x08, 0x08, 0x23, 0x08, +/* 00000E70 */ 0x01, 0x47, 0x01, 0x09, 0x6C, 0x08, 0x09, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, +/* 00000E80 */ 0x06, 0x1F, 0x02, 0x08, 0x08, 0x47, 0x07, 0x08, 0x01, 0x47, 0x01, 0x09, 0x6C, 0x08, 0x09, 0x01, +/* 00000E90 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x09, 0x5C, 0x01, 0x07, 0x5C, 0x02, 0x05, 0x1F, 0x03, 0x00, 0x08, +/* 00000EA0 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0x35, 0x01, 0xFE, 0xFC, 0x02, 0xFE, 0xA2, 0x01, +/* 00000EB0 */ 0xFE, 0x6B, 0x13, 0x05, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x37, 0x00, 0x12, 0x00, 0x5C, 0x00, +/* 00000EC0 */ 0x18, 0x00, 0x2E, 0x00, 0x1D, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, 0x01, 0xC0, 0x00, +/* 00000ED0 */ 0x5F, 0x42, 0xA2, 0x41, 0xD1, 0x00, 0x05, 0xFE, 0x79, 0x12, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, +/* 00000EE0 */ 0x03, 0xFE, 0x79, 0x12, 0x8B, 0x8B, 0x01, 0x03, 0x03, 0x05, 0x04, 0x0A, 0x0A, 0x01, 0x01, 0x01, +/* 00000EF0 */ 0x01, 0x01, 0x05, 0xFE, 0xE5, 0x02, 0x1C, 0x01, 0x47, 0x01, 0x05, 0x61, 0x05, 0x05, 0x00, 0x07, +/* 00000F00 */ 0x03, 0x00, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x04, 0xC2, 0x03, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, +/* 00000F10 */ 0x00, 0x24, 0x00, 0xFE, 0xF3, 0x02, 0xFE, 0xBC, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, +/* 00000F20 */ 0x47, 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, 0x2B, 0xD0, 0x10, 0x2A, 0x13, 0xA0, 0x41, 0xC1, 0x00, +/* 00000F30 */ 0xFE, 0xF5, 0x02, 0x04, 0xFE, 0x45, 0x09, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x45, +/* 00000F40 */ 0x09, 0xFE, 0xA2, 0x06, 0xFE, 0xA2, 0x06, 0x01, 0x10, 0x0B, 0x15, 0x03, 0x5B, 0x48, 0x01, 0x0D, +/* 00000F50 */ 0x0C, 0x0D, 0x0D, 0x01, 0x01, 0x03, 0x15, 0x05, 0xFE, 0xE5, 0x02, 0x05, 0xFE, 0x04, 0x03, 0x0B, +/* 00000F60 */ 0x01, 0x01, 0x01, 0x00, 0x0C, 0x06, 0xFE, 0xF5, 0x02, 0x06, 0xFE, 0x05, 0x03, 0x07, 0xFE, 0x2D, +/* 00000F70 */ 0x01, 0x5B, 0x0B, 0xB3, 0x0B, 0x0B, 0x4F, 0x0C, 0x4F, 0x0D, 0x4F, 0x0E, 0x4F, 0x0F, 0x4F, 0x10, +/* 00000F80 */ 0x4F, 0x11, 0x4F, 0x12, 0x4F, 0x13, 0x4F, 0x14, 0x47, 0x0C, 0x0B, 0x01, 0x47, 0x01, 0x18, 0x61, +/* 00000F90 */ 0x18, 0x18, 0x00, 0xE1, 0x18, 0x0C, 0x18, 0x00, 0x0F, 0x15, 0x00, 0x18, 0x09, 0x00, 0x00, 0x6A, +/* 00000FA0 */ 0x0C, 0x00, 0x00, 0x00, 0x18, 0x07, 0x02, 0x00, 0x5C, 0x01, 0x03, 0xC2, 0x02, 0x18, 0x18, 0x23, +/* 00000FB0 */ 0x18, 0x61, 0x18, 0x0C, 0x01, 0x47, 0x0D, 0x18, 0xA8, 0x18, 0x47, 0x0E, 0x18, 0xA8, 0x18, 0x47, +/* 00000FC0 */ 0x0F, 0x18, 0x61, 0x18, 0x0C, 0x02, 0x14, 0x03, 0x00, 0x18, 0x04, 0x09, 0x0B, 0x00, 0xA8, 0x18, +/* 00000FD0 */ 0x47, 0x0E, 0x18, 0x47, 0x0F, 0x04, 0x09, 0xA9, 0x00, 0x61, 0x18, 0x0C, 0x03, 0x47, 0x10, 0x18, +/* 00000FE0 */ 0x01, 0x47, 0x01, 0x19, 0x6C, 0x18, 0x19, 0x04, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x19, 0x5C, 0x01, +/* 00000FF0 */ 0x0D, 0x1F, 0x02, 0x18, 0x18, 0x0F, 0x03, 0x00, 0x18, 0x09, 0x0A, 0x00, 0x61, 0x19, 0x0D, 0x05, +/* 00001000 */ 0x47, 0x18, 0x19, 0x09, 0x18, 0x00, 0x01, 0x47, 0x01, 0x1A, 0x6C, 0x19, 0x1A, 0x06, 0x07, 0x02, +/* 00001010 */ 0x00, 0x5C, 0x00, 0x1A, 0x5C, 0x01, 0x0D, 0x1F, 0x02, 0x19, 0x19, 0x47, 0x18, 0x19, 0x47, 0x11, +/* 00001020 */ 0x18, 0x12, 0x03, 0x00, 0x10, 0x11, 0x09, 0x4D, 0x00, 0x61, 0x18, 0x0C, 0x07, 0x47, 0x12, 0x18, +/* 00001030 */ 0x2F, 0x18, 0x10, 0x05, 0x76, 0x18, 0x0C, 0x08, 0x14, 0x03, 0x00, 0x12, 0x05, 0x09, 0x0A, 0x00, +/* 00001040 */ 0x97, 0x18, 0x0D, 0x10, 0x47, 0x0E, 0x18, 0x09, 0x26, 0x00, 0x14, 0x03, 0x00, 0x12, 0x06, 0x09, +/* 00001050 */ 0x06, 0x00, 0x47, 0x0E, 0x10, 0x09, 0x18, 0x00, 0x47, 0x13, 0x10, 0x97, 0x18, 0x0D, 0x10, 0x47, +/* 00001060 */ 0x14, 0x18, 0xCD, 0x18, 0x02, 0xA1, 0x00, 0x13, 0x18, 0xA1, 0x01, 0x14, 0x18, 0x47, 0x0E, 0x18, +/* 00001070 */ 0x47, 0x0F, 0x07, 0x09, 0x0C, 0x00, 0x76, 0x04, 0x0C, 0x09, 0xA8, 0x18, 0x47, 0x0E, 0x18, 0x47, +/* 00001080 */ 0x0F, 0x04, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, +/* 00001090 */ 0x0E, 0x00, 0x0A, 0x7A, 0x0F, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x01, 0x10, +/* 000010A0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x01, 0x00, +/* 000010B0 */ 0x00, 0x9F, 0x00, 0x00, 0x00, 0xFE, 0xF3, 0x02, 0xFE, 0x00, 0x03, 0xFE, 0x03, 0x03, 0xFE, 0x01, +/* 000010C0 */ 0x03, 0xE0, 0xF3, 0xFE, 0xB5, 0x02, 0xFE, 0x02, 0x03, 0xFE, 0x01, 0x03, 0xFE, 0x03, 0x03, 0xFE, +/* 000010D0 */ 0xB6, 0x01, 0x9F, 0xFE, 0xA2, 0x01, 0xFE, 0x81, 0x09, 0x1B, 0x17, 0x00, 0x00, 0x00, 0x03, 0x00, +/* 000010E0 */ 0x1F, 0x00, 0x14, 0x00, 0x49, 0x00, 0x12, 0x00, 0x81, 0x00, 0x07, 0x00, 0x2A, 0x00, 0x05, 0x00, +/* 000010F0 */ 0x0B, 0x00, 0x05, 0x00, 0x17, 0x00, 0x0C, 0x00, 0x39, 0x00, 0x05, 0x00, 0x27, 0x00, 0x06, 0x00, +/* 00001100 */ 0x3A, 0x00, 0x07, 0x00, 0x33, 0x00, 0x41, 0x00, 0x65, 0x00, 0x08, 0x00, 0x70, 0x00, 0x07, 0x00, +/* 00001110 */ 0x36, 0x00, 0x08, 0x00, 0x38, 0x00, 0x08, 0x00, 0x4F, 0x00, 0x0A, 0x00, 0x31, 0x00, 0x08, 0x00, +/* 00001120 */ 0x78, 0x00, 0x06, 0x00, 0x4C, 0x00, 0x03, 0x00, 0x34, 0x00, 0x07, 0x00, 0x39, 0x00, 0x0E, 0x00, +/* 00001130 */ 0x56, 0x00, 0x06, 0x00, 0x43, 0x00, 0x04, 0x00, 0x35, 0x00, 0x05, 0x00, 0x2B, 0x00, 0x03, 0x00, +/* 00001140 */ 0x45, 0x00, 0x1A, 0x00, 0x31, 0x00, 0x00, 0xBF, 0x5C, 0x00, 0xE0, 0x01, 0xC0, 0x00, 0x1A, 0x3C, +/* 00001150 */ 0xA2, 0x41, 0xD1, 0x00, 0x03, 0xFE, 0xC8, 0x05, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, +/* 00001160 */ 0xC8, 0x05, 0xFE, 0xE9, 0x01, 0xFE, 0xE9, 0x01, 0x41, 0x05, 0x0A, 0x0D, 0x08, 0x14, 0x14, 0x01, +/* 00001170 */ 0x05, 0x05, 0x05, 0x05, 0x05, 0xFE, 0xE5, 0x02, 0x01, 0x04, 0x06, 0xFE, 0x00, 0x03, 0x06, 0xFE, +/* 00001180 */ 0x01, 0x03, 0x06, 0xFE, 0x02, 0x03, 0x06, 0xFE, 0x03, 0x03, 0x01, 0x00, 0x0C, 0x3D, 0x5B, 0x0C, +/* 00001190 */ 0xB3, 0x0C, 0x0C, 0x01, 0x47, 0x01, 0x0E, 0x6C, 0x0D, 0x0E, 0x00, 0x07, 0x07, 0x00, 0x5C, 0x00, +/* 000011A0 */ 0x0E, 0x5C, 0x01, 0x0C, 0x5C, 0x02, 0x03, 0x5C, 0x03, 0x04, 0x5C, 0x04, 0x05, 0x5C, 0x05, 0x06, +/* 000011B0 */ 0x5C, 0x06, 0x07, 0x1F, 0x07, 0xFF, 0x0D, 0x76, 0x0A, 0x0C, 0x01, 0x76, 0x08, 0x0C, 0x02, 0x76, +/* 000011C0 */ 0x0B, 0x0C, 0x03, 0x76, 0x09, 0x0C, 0x04, 0xA8, 0x00, 0x24, 0x00, 0xFE, 0xB7, 0x02, 0xFE, 0x00, +/* 000011D0 */ 0x03, 0xFE, 0x01, 0x03, 0xFE, 0x02, 0x03, 0xFE, 0x03, 0x03, 0xFE, 0x0B, 0x06, 0x06, 0x05, 0x00, +/* 000011E0 */ 0x00, 0x00, 0x24, 0x00, 0x82, 0x00, 0x04, 0x00, 0x28, 0x00, 0x04, 0x00, 0x22, 0x00, 0x04, 0x00, +/* 000011F0 */ 0x29, 0x00, 0x06, 0x00, 0xB0, 0x00, 0x00, 0xBF, 0x5C, 0x80, 0x00, 0x00, 0xC4, 0x00, 0x15, 0x1F, +/* 00001200 */ 0xA2, 0x41, 0xC1, 0x00, 0xFE, 0xFF, 0x02, 0x02, 0xFE, 0xD8, 0x04, 0xFF, 0x00, 0x10, 0x01, 0x00, +/* 00001210 */ 0x04, 0x04, 0xFE, 0xD8, 0x04, 0x72, 0x72, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, 0x02, +/* 00001220 */ 0x07, 0x07, 0x08, 0x2F, 0x8E, 0x01, 0x03, 0x08, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, +/* 00001230 */ 0x04, 0x5C, 0x02, 0x05, 0x8E, 0x01, 0x02, 0x09, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, +/* 00001240 */ 0x06, 0x5C, 0x02, 0x02, 0x1F, 0x03, 0x09, 0x09, 0x5C, 0x03, 0x09, 0x1F, 0x04, 0xFF, 0x08, 0xA8, +/* 00001250 */ 0x00, 0x24, 0x00, 0xFE, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x46, 0x00, 0x00}; + +} diff --git a/deps/chakrashim/core/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.cpp new file mode 100644 index 00000000000..d2afae40b33 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.cpp @@ -0,0 +1,443 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#include "RuntimeLibraryPch.h" +#include "EngineInterfaceObject.h" +#include "JsBuiltInEngineInterfaceExtensionObject.h" +#include "Types/DeferredTypeHandler.h" + +#ifdef ENABLE_JS_BUILTINS +#include "ByteCode/ByteCodeSerializer.h" +#include "errstr.h" +#include "ByteCode/ByteCodeDumper.h" + +#pragma warning(push) +#pragma warning(disable:4309) // truncation of constant value +#pragma warning(disable:4838) // conversion from 'int' to 'const char' requires a narrowing conversion + +#if DISABLE_JIT +#if TARGET_64 +#include "JsBuiltIn/JsBuiltIn.js.nojit.bc.64b.h" +#else +#include "JsBuiltIn/JsBuiltIn.js.nojit.bc.32b.h" +#endif // TARGET_64 +#else +#if TARGET_64 +#include "JsBuiltIn/JsBuiltIn.js.bc.64b.h" +#else +#include "JsBuiltIn/JsBuiltIn.js.bc.32b.h" +#endif // TARGET_64 +#endif // DISABLE_JIT + +#pragma warning(pop) + +#define IfFailAssertMsgAndThrowHr(op, msg) \ + if (FAILED(hr=(op))) \ + { \ + AssertMsg(false, msg); \ + JavascriptError::MapAndThrowError(scriptContext, hr); \ + } \ + +#endif // ENABLE_JS_BUILTINS + +namespace Js +{ +#ifdef ENABLE_JS_BUILTINS + + JsBuiltInEngineInterfaceExtensionObject::JsBuiltInEngineInterfaceExtensionObject(ScriptContext * scriptContext) : + EngineExtensionObjectBase(EngineInterfaceExtensionKind_JsBuiltIn, scriptContext), + jsBuiltInByteCode(nullptr), + wasInitialized(false) + { + } + + NoProfileFunctionInfo JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_RegisterFunction(FORCE_NO_WRITE_BARRIER_TAG(JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_RegisterFunction)); + NoProfileFunctionInfo JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_RegisterChakraLibraryFunction(FORCE_NO_WRITE_BARRIER_TAG(JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_RegisterChakraLibraryFunction)); + + NoProfileFunctionInfo JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_Internal_GetLength(FORCE_NO_WRITE_BARRIER_TAG(JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_Internal_GetLength)); + NoProfileFunctionInfo JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_Internal_SetPrototype(FORCE_NO_WRITE_BARRIER_TAG(JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_Internal_SetPrototype)); + NoProfileFunctionInfo JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_Internal_GetIteratorPrototype(FORCE_NO_WRITE_BARRIER_TAG(JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_Internal_GetIteratorPrototype)); + NoProfileFunctionInfo JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_Internal_InitInternalProperties(FORCE_NO_WRITE_BARRIER_TAG(JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_Internal_InitInternalProperties)); + + void JsBuiltInEngineInterfaceExtensionObject::Initialize() + { + if (wasInitialized) + { + return; + } + + JavascriptLibrary* library = scriptContext->GetLibrary(); + DynamicObject* commonObject = library->GetEngineInterfaceObject()->GetCommonNativeInterfaces(); + if (scriptContext->IsJsBuiltInEnabled()) + { + Assert(library->GetEngineInterfaceObject() != nullptr); + builtInNativeInterfaces = DynamicObject::New(library->GetRecycler(), + DynamicType::New(scriptContext, TypeIds_Object, commonObject, nullptr, + DeferredTypeHandler::GetDefaultInstance())); + library->AddMember(library->GetEngineInterfaceObject(), Js::PropertyIds::JsBuiltIn, builtInNativeInterfaces); + } + + wasInitialized = true; + } + + void JsBuiltInEngineInterfaceExtensionObject::InitializePrototypes(ScriptContext * scriptContext) + { + JavascriptLibrary* library = scriptContext->GetLibrary(); + JavascriptString * methodName = JavascriptString::NewWithSz(_u("ArrayIterator"), scriptContext); + auto arrayIterator = JavascriptOperators::GetProperty(library->GetChakraLib(), JavascriptOperators::GetPropertyId(methodName, scriptContext), scriptContext); + library->arrayIteratorPrototype = DynamicObject::FromVar(JavascriptOperators::GetProperty(DynamicObject::FromVar(arrayIterator), PropertyIds::prototype, scriptContext)); + library->arrayIteratorPrototypeBuiltinNextFunction = JavascriptFunction::FromVar(JavascriptOperators::GetProperty(library->arrayIteratorPrototype, PropertyIds::next, scriptContext)); + } + + void JsBuiltInEngineInterfaceExtensionObject::InjectJsBuiltInLibraryCode(ScriptContext * scriptContext) + { + if (jsBuiltInByteCode != nullptr) + { + return; + } + + try { + EnsureJsBuiltInByteCode(scriptContext); + Assert(jsBuiltInByteCode != nullptr); + + Js::ScriptFunction *functionGlobal = scriptContext->GetLibrary()->CreateScriptFunction(jsBuiltInByteCode); + + // If we are in the debugger and doing a GetProperty of arguments, then Js Builtins code will be injected on-demand + // Since it is a cross site call, we marshall not only functionGlobal but also its entire prototype chain + // The prototype of functionGlobal will be shared by a normal Js function, + // so marshalling will inadvertantly transition the entrypoint of the prototype to a crosssite entrypoint + // So we set the prototype to null here + functionGlobal->SetPrototype(scriptContext->GetLibrary()->nullValue); + +#ifdef ENABLE_SCRIPT_PROFILING + // If we are profiling, we need to register the script to the profiler callback, so the script compiled event will be sent. + if (scriptContext->IsProfiling()) + { + scriptContext->RegisterScript(functionGlobal->GetFunctionProxy()); + } +#endif + +#ifdef ENABLE_SCRIPT_DEBUGGING + // Mark we are profiling library code already, so that any initialization library code called here won't be reported to profiler. + // Also tell the debugger not to record events during intialization so that we don't leak information about initialization. + AutoInitLibraryCodeScope autoInitLibraryCodeScope(scriptContext); +#endif + + Js::Var args[] = { scriptContext->GetLibrary()->GetUndefined(), scriptContext->GetLibrary()->GetEngineInterfaceObject() }; + Js::CallInfo callInfo(Js::CallFlags_Value, _countof(args)); + + // Clear disable implicit call bit as initialization code doesn't have any side effect + Js::ImplicitCallFlags saveImplicitCallFlags = scriptContext->GetThreadContext()->GetImplicitCallFlags(); + scriptContext->GetThreadContext()->ClearDisableImplicitFlags(); + JavascriptFunction::CallRootFunctionInScript(functionGlobal, Js::Arguments(callInfo, args)); + scriptContext->GetThreadContext()->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags)); + + Js::ScriptFunction *functionBuiltins = scriptContext->GetLibrary()->CreateScriptFunction(jsBuiltInByteCode->GetNestedFunctionForExecution(0)); + functionBuiltins->SetPrototype(scriptContext->GetLibrary()->nullValue); + + // Clear disable implicit call bit as initialization code doesn't have any side effect + saveImplicitCallFlags = scriptContext->GetThreadContext()->GetImplicitCallFlags(); + scriptContext->GetThreadContext()->ClearDisableImplicitFlags(); + JavascriptFunction::CallRootFunctionInScript(functionBuiltins, Js::Arguments(callInfo, args)); + scriptContext->GetThreadContext()->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags)); + + InitializePrototypes(scriptContext); +#if DBG_DUMP + if (PHASE_DUMP(Js::ByteCodePhase, functionGlobal->GetFunctionProxy()) && Js::Configuration::Global.flags.Verbose) + { + DumpByteCode(); + } +#endif + } + catch (const JavascriptException& err) + { + Js::JavascriptExceptionObject* ex = err.GetAndClear(); + ex->GetScriptContext(); + JavascriptError::ThrowTypeError(ex->GetScriptContext(), JSERR_BuiltInNotAvailable); + } + } + + bool JsBuiltInEngineInterfaceExtensionObject::InitializeJsBuiltInNativeInterfaces(DynamicObject * builtInNativeInterfaces, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode) + { + typeHandler->Convert(builtInNativeInterfaces, mode, 16); + + ScriptContext* scriptContext = builtInNativeInterfaces->GetScriptContext(); + JavascriptLibrary* library = scriptContext->GetLibrary(); + + library->AddFunctionToLibraryObject(builtInNativeInterfaces, Js::PropertyIds::registerChakraLibraryFunction, &JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_RegisterChakraLibraryFunction, 2); + library->AddFunctionToLibraryObject(builtInNativeInterfaces, Js::PropertyIds::registerFunction, &JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_RegisterFunction, 2); + library->AddFunctionToLibraryObject(builtInNativeInterfaces, Js::PropertyIds::GetIteratorPrototype, &JsBuiltInEngineInterfaceExtensionObject::EntryInfo::JsBuiltIn_Internal_GetIteratorPrototype, 1); + + builtInNativeInterfaces->SetHasNoEnumerableProperties(true); + return true; + } + +#if DBG + void JsBuiltInEngineInterfaceExtensionObject::DumpByteCode() + { + Output::Print(_u("Dumping JS Built Ins Byte Code:\r")); + Assert(this->jsBuiltInByteCode); + Js::ByteCodeDumper::DumpRecursively(jsBuiltInByteCode); + } +#endif // DBG + + void JsBuiltInEngineInterfaceExtensionObject::EnsureJsBuiltInByteCode(ScriptContext * scriptContext) + { + if (jsBuiltInByteCode == nullptr) + { + SourceContextInfo* sourceContextInfo = RecyclerNewStructZ(scriptContext->GetRecycler(), SourceContextInfo); + sourceContextInfo->dwHostSourceContext = Js::Constants::JsBuiltInSourceContext; + sourceContextInfo->isHostDynamicDocument = true; + sourceContextInfo->sourceContextId = Js::Constants::JsBuiltInSourceContextId; + + Assert(sourceContextInfo != nullptr); + + SRCINFO si; + memset(&si, 0, sizeof(si)); + si.sourceContextInfo = sourceContextInfo; + SRCINFO *hsi = scriptContext->AddHostSrcInfo(&si); + uint32 flags = fscrJsBuiltIn | (CONFIG_FLAG(CreateFunctionProxy) && !scriptContext->IsProfiling() ? fscrAllowFunctionProxy : 0); + + HRESULT hr = Js::ByteCodeSerializer::DeserializeFromBuffer(scriptContext, flags, (LPCUTF8)nullptr, hsi, (byte*)Library_Bytecode_JsBuiltIn, nullptr, &jsBuiltInByteCode); + + IfFailAssertMsgAndThrowHr(hr, "Failed to deserialize JsBuiltIn.js bytecode - very probably the bytecode needs to be rebuilt."); + this->SetHasBytecode(); + } + } + + DynamicObject* JsBuiltInEngineInterfaceExtensionObject::GetPrototypeFromName(Js::PropertyIds propertyId, ScriptContext* scriptContext) + { + JavascriptLibrary* library = scriptContext->GetLibrary(); + + switch (propertyId) { + case PropertyIds::Array: + return library->arrayPrototype; + + case PropertyIds::String: + return library->stringPrototype; + + case PropertyIds::__chakraLibrary: + return library->GetChakraLib(); + + default: + AssertMsg(false, "Unable to find a prototype that match with this className."); + return nullptr; + } + } + + + void JsBuiltInEngineInterfaceExtensionObject::RecordDefaultIteratorFunctions(Js::PropertyIds propertyId, ScriptContext * scriptContext, JavascriptFunction * iteratorFunc) + { + JavascriptLibrary* library = scriptContext->GetLibrary(); + + switch (propertyId) { + case PropertyIds::entries: + library->arrayPrototypeEntriesFunction = iteratorFunc; + break; + case PropertyIds::values: + library->arrayPrototypeValuesFunction = iteratorFunc; + break; + case PropertyIds::keys: + library->arrayPrototypeKeysFunction = iteratorFunc; + break; + } + } + + Var JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_RegisterChakraLibraryFunction(RecyclableObject* function, CallInfo callInfo, ...) + { + EngineInterfaceObject_CommonFunctionProlog(function, callInfo); + + AssertOrFailFast(args.Info.Count >= 3 && JavascriptString::Is(args.Values[1]) && JavascriptFunction::Is(args.Values[2])); + + JavascriptLibrary * library = scriptContext->GetLibrary(); + + // retrieves arguments + JavascriptString* methodName = JavascriptString::FromVar(args.Values[1]); + JavascriptFunction* func = JavascriptFunction::FromVar(args.Values[2]); + + // Set the function's display name, as the function we pass in argument are anonym. + func->GetFunctionProxy()->SetIsPublicLibraryCode(); + func->GetFunctionProxy()->EnsureDeserialized()->SetDisplayName(methodName->GetString(), methodName->GetLength(), 0); + + DynamicObject* chakraLibraryObject = GetPrototypeFromName(PropertyIds::__chakraLibrary, scriptContext); + PropertyIds functionIdentifier = JavascriptOperators::GetPropertyId(methodName, scriptContext); + + // Link the function to __chakraLibrary. + ScriptFunction* scriptFunction = library->CreateScriptFunction(func->GetFunctionProxy()); + scriptFunction->SetIsJsBuiltInCode(); + scriptFunction->GetFunctionProxy()->SetIsJsBuiltInCode(); + + Assert(scriptFunction->HasFunctionBody()); + scriptFunction->GetFunctionBody()->SetJsBuiltInForceInline(); + + if (scriptFunction->GetScriptContext()->GetConfig()->IsES6FunctionNameEnabled()) + { + scriptFunction->SetPropertyWithAttributes(PropertyIds::name, methodName, PropertyConfigurable, nullptr); + } + + library->AddMember(chakraLibraryObject, functionIdentifier, scriptFunction); + + //Don't need to return anything + return library->GetUndefined(); + } + + Var JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_RegisterFunction(RecyclableObject* function, CallInfo callInfo, ...) + { + EngineInterfaceObject_CommonFunctionProlog(function, callInfo); + + AssertOrFailFast(args.Info.Count >= 3 && JavascriptObject::Is(args.Values[1]) && JavascriptFunction::Is(args.Values[2])); + + JavascriptLibrary * library = scriptContext->GetLibrary(); + + // retrieves arguments + RecyclableObject* funcInfo = nullptr; + if (!JavascriptConversion::ToObject(args.Values[1], scriptContext, &funcInfo)) + { + JavascriptError::ThrowTypeError(scriptContext, JSERR_FunctionArgument_NeedObject, _u("Object.assign")); + } + + Var classNameProperty = JavascriptOperators::OP_GetProperty(funcInfo, Js::PropertyIds::className, scriptContext); + Var methodNameProperty = JavascriptOperators::OP_GetProperty(funcInfo, Js::PropertyIds::methodName, scriptContext); + Var argumentsCountProperty = JavascriptOperators::OP_GetProperty(funcInfo, Js::PropertyIds::argumentsCount, scriptContext); + Var forceInlineProperty = JavascriptOperators::OP_GetProperty(funcInfo, Js::PropertyIds::forceInline, scriptContext); + Var aliasProperty = JavascriptOperators::OP_GetProperty(funcInfo, Js::PropertyIds::alias, scriptContext); + + Assert(JavascriptString::Is(classNameProperty)); + Assert(JavascriptString::Is(methodNameProperty)); + Assert(TaggedInt::Is(argumentsCountProperty)); + + JavascriptString* className = JavascriptString::FromVar(classNameProperty); + JavascriptString* methodName = JavascriptString::FromVar(methodNameProperty); + int argumentsCount = TaggedInt::ToInt32(argumentsCountProperty); + + BOOL forceInline = JavascriptConversion::ToBoolean(forceInlineProperty, scriptContext); + + JavascriptFunction* func = JavascriptFunction::FromVar(args.Values[2]); + + // Set the function's display name, as the function we pass in argument are anonym. + func->GetFunctionProxy()->SetIsPublicLibraryCode(); + func->GetFunctionProxy()->EnsureDeserialized()->SetDisplayName(methodName->GetString(), methodName->GetLength(), 0); + + DynamicObject* prototype = GetPrototypeFromName(JavascriptOperators::GetPropertyId(className, scriptContext), scriptContext); + PropertyIds functionIdentifier = methodName->BufferEquals(_u("Symbol.iterator"), 15)? PropertyIds::_symbolIterator : + JavascriptOperators::GetPropertyId(methodName, scriptContext); + + // Link the function to the prototype. + ScriptFunction* scriptFunction = library->CreateScriptFunction(func->GetFunctionProxy()); + scriptFunction->SetIsJsBuiltInCode(); + scriptFunction->GetFunctionProxy()->SetIsJsBuiltInCode(); + + if (forceInline) + { + Assert(scriptFunction->HasFunctionBody()); + scriptFunction->GetFunctionBody()->SetJsBuiltInForceInline(); + } + scriptFunction->SetPropertyWithAttributes(PropertyIds::length, TaggedInt::ToVarUnchecked(argumentsCount), PropertyConfigurable, nullptr); + scriptFunction->SetPropertyWithAttributes(PropertyIds::caller, library->nullValue, PropertyNone, nullptr); + scriptFunction->SetPropertyWithAttributes(PropertyIds::arguments, library->nullValue, PropertyNone, nullptr); + + scriptFunction->SetConfigurable(PropertyIds::prototype, true); + scriptFunction->DeleteProperty(PropertyIds::prototype, Js::PropertyOperationFlags::PropertyOperation_None); + + if (scriptFunction->GetScriptContext()->GetConfig()->IsES6FunctionNameEnabled()) + { + scriptFunction->SetPropertyWithAttributes(PropertyIds::name, methodName, PropertyConfigurable, nullptr); + } + + library->AddMember(prototype, functionIdentifier, scriptFunction); + + if (!JavascriptOperators::IsUndefinedOrNull(aliasProperty)) + { + JavascriptString * alias = JavascriptConversion::ToString(aliasProperty, scriptContext); + // Cannot do a string to property id search here, Symbol.* have different hashing mechanism, so resort to this str compare + PropertyIds aliasFunctionIdentifier = alias->BufferEquals(_u("Symbol.iterator"), 15) ? PropertyIds::_symbolIterator : + JavascriptOperators::GetPropertyId(alias, scriptContext); + library->AddMember(prototype, aliasFunctionIdentifier, scriptFunction); + } + + if (prototype == library->arrayPrototype) + { + RecordDefaultIteratorFunctions(functionIdentifier, scriptContext, scriptFunction); + } + + //Don't need to return anything + return library->GetUndefined(); + } + + Var JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_Internal_GetLength(RecyclableObject *function, CallInfo callInfo, ...) + { + EngineInterfaceObject_CommonFunctionProlog(function, callInfo); + Assert(callInfo.Count == 2); + + int64 length; + Var iterable = args.Values[1]; + + TypedArrayBase *typedArrayBase = nullptr; + Assert(!JavascriptArray::Is(iterable)); + + if (TypedArrayBase::Is(iterable)) + { + typedArrayBase = TypedArrayBase::FromVar(iterable); + if (typedArrayBase->IsDetachedBuffer()) + { + JavascriptError::ThrowTypeError(scriptContext, JSERR_DetachedTypedArray); + } + + length = typedArrayBase->GetLength(); + } + else + { + length = JavascriptConversion::ToLength(JavascriptOperators::OP_GetLength(iterable, scriptContext), scriptContext); + } + + return JavascriptNumber::ToVar(length, scriptContext); + } + + /* + * First parameter is the object onto which prototype should be set; second is the value + */ + Var JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_Internal_SetPrototype(RecyclableObject *function, CallInfo callInfo, ...) + { + EngineInterfaceObject_CommonFunctionProlog(function, callInfo); + UNREFERENCED_PARAMETER(scriptContext); + + Assert(callInfo.Count == 3 && DynamicObject::Is(args.Values[1]) && RecyclableObject::Is(args.Values[2])); + + DynamicObject* obj = DynamicObject::FromVar(args.Values[1]); + RecyclableObject* value = RecyclableObject::FromVar(args.Values[2]); + + obj->SetPrototype(value); + + return obj; + } + + Var JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_Internal_GetIteratorPrototype(RecyclableObject *function, CallInfo callInfo, ...) + { + EngineInterfaceObject_CommonFunctionProlog(function, callInfo); + + Assert(callInfo.Count == 1); + + return scriptContext->GetLibrary()->iteratorPrototype; + } + + Var JsBuiltInEngineInterfaceExtensionObject::EntryJsBuiltIn_Internal_InitInternalProperties(RecyclableObject *function, CallInfo callInfo, ...) + { + EngineInterfaceObject_CommonFunctionProlog(function, callInfo); + + DynamicObject* obj = DynamicObject::FromVar(args.Values[1]); + unsigned propCount = TaggedInt::ToUInt32(args.Values[2]); + + Assert(callInfo.Count == 3 + propCount); + + for (unsigned i = 0; i < propCount; i++) + { + JavascriptString *propName = JavascriptString::FromVar(args.Values[i + 3]); + obj->SetPropertyWithAttributes(JavascriptOperators::GetPropertyId(propName, scriptContext), scriptContext->GetLibrary()->GetNull(), PropertyWritable, nullptr); + } + + return obj; + } + +#endif // ENABLE_JS_BUILTINS +} diff --git a/deps/chakrashim/core/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.h b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.h new file mode 100644 index 00000000000..9e14fa85c49 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.h @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- +#pragma once +#ifdef ENABLE_JS_BUILTINS +namespace Js +{ + class JsBuiltInEngineInterfaceExtensionObject : public EngineExtensionObjectBase + { + public: + JsBuiltInEngineInterfaceExtensionObject(ScriptContext* scriptContext); + void Initialize(); + void InitializePrototypes(ScriptContext * scriptContext); + void InjectJsBuiltInLibraryCode(ScriptContext * scriptContext); + + static bool __cdecl InitializeJsBuiltInNativeInterfaces(DynamicObject* intlNativeInterfaces, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); + +#if DBG + void DumpByteCode() override; +#endif + + class EntryInfo + { + public: + static NoProfileFunctionInfo JsBuiltIn_RegisterChakraLibraryFunction; + static NoProfileFunctionInfo JsBuiltIn_RegisterFunction; + static NoProfileFunctionInfo JsBuiltIn_Internal_GetLength; + static NoProfileFunctionInfo JsBuiltIn_Internal_SetPrototype; + static NoProfileFunctionInfo JsBuiltIn_Internal_GetIteratorPrototype; + static NoProfileFunctionInfo JsBuiltIn_Internal_InitInternalProperties; + }; + + private: + Field(DynamicObject*) builtInNativeInterfaces; + Field(FunctionBody*) jsBuiltInByteCode; + + Field(bool) wasInitialized; + + void EnsureJsBuiltInByteCode(ScriptContext * scriptContext); + + static DynamicObject* GetPrototypeFromName(Js::PropertyIds propertyId, ScriptContext* scriptContext); + static void RecordDefaultIteratorFunctions(Js::PropertyIds propertyId, ScriptContext * scriptContext, JavascriptFunction* iteratorFunc); + static Var EntryJsBuiltIn_RegisterChakraLibraryFunction(RecyclableObject* function, CallInfo callInfo, ...); + static Var EntryJsBuiltIn_RegisterFunction(RecyclableObject* function, CallInfo callInfo, ...); + static Var EntryJsBuiltIn_Internal_GetLength(RecyclableObject* function, CallInfo callInfo, ...); + static Var EntryJsBuiltIn_Internal_SetPrototype(RecyclableObject* function, CallInfo callInfo, ...); + static Var EntryJsBuiltIn_Internal_GetIteratorPrototype(RecyclableObject* function, CallInfo callInfo, ...); + static Var EntryJsBuiltIn_Internal_InitInternalProperties(RecyclableObject* function, CallInfo callInfo, ...); + }; +} +#endif // ENABLE_JS_BUILTINS diff --git a/deps/chakrashim/core/lib/Runtime/Library/LazyJSONString.cpp b/deps/chakrashim/core/lib/Runtime/Library/LazyJSONString.cpp new file mode 100644 index 00000000000..801cfed5ba9 --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/LazyJSONString.cpp @@ -0,0 +1,177 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#include "RuntimeLibraryPch.h" + +namespace Js +{ + +LazyJSONString::LazyJSONString(_In_ JSONProperty* jsonContent, charcount_t length, _In_opt_ const char16* gap, charcount_t gapLength, _In_ StaticType* type) : + JavascriptString(type), + jsonContent(jsonContent), + gap(gap), + gapLength(gapLength) +{ + // Use SetLength to ensure length is valid + SetLength(length); +} + +bool +LazyJSONString::HasComplexGap() const +{ + for (charcount_t i = 0; i < this->gapLength; ++i) + { + switch (this->gap[i]) + { + // This is not exhaustive, just a useful subset of semantics preserving characters + case _u(' '): + case _u('\t'): + case _u('\n'): + continue; + default: + return true; + } + } + return false; +} + +DynamicObject* +LazyJSONString::ReconstructObject(_In_ JSONObject* valueList) const +{ + const uint elementCount = valueList->Count(); + + // This is just a heuristic, so overflow doesn't matter + PropertyIndex requestedInlineSlotCapacity = static_cast(elementCount); + + DynamicObject* obj = this->GetLibrary()->CreateObject( + true, // allowObjectHeaderInlining + requestedInlineSlotCapacity); + + FOREACH_SLISTCOUNTED_ENTRY(JSONObjectProperty, entry, valueList) + { + Var propertyValue = ReconstructVar(&entry.propertyValue); + JavascriptString* propertyName = entry.propertyName; + PropertyString* propertyString = PropertyString::TryFromVar(propertyName); + PropertyValueInfo info; + if (!propertyString || !propertyString->TrySetPropertyFromCache(obj, propertyValue, this->GetScriptContext(), PropertyOperation_None, &info)) + { + const PropertyRecord* propertyRecord = propertyName->GetPropertyRecord(); + JavascriptOperators::SetProperty(obj, obj, propertyRecord->GetPropertyId(), propertyValue, &info, this->GetScriptContext()); + } + } + NEXT_SLISTCOUNTED_ENTRY; + return obj; +} + +JavascriptArray* +LazyJSONString::ReconstructArray(_In_ JSONArray* jsonArray) const +{ + const uint32 length = jsonArray->length; + JavascriptArray* arr = this->GetLibrary()->CreateArrayLiteral(length); + JSONProperty* prop = jsonArray->arr; + for (uint i = 0; i < length; ++i) + { + Var element = ReconstructVar(&prop[i]); + BOOL result = arr->SetItem(i, element, PropertyOperation_None); + Assert(result); // Setting item in an array we just allocated should always succeed + } + return arr; +} + +Var +LazyJSONString::ReconstructVar(_In_ JSONProperty* prop) const +{ + switch (prop->type) + { + case JSONContentType::Array: + return ReconstructArray(prop->arr); + case JSONContentType::Null: + return this->GetLibrary()->GetNull(); + case JSONContentType::True: + return this->GetLibrary()->GetTrue(); + case JSONContentType::False: + return this->GetLibrary()->GetFalse(); + case JSONContentType::Number: + return prop->numericValue.value; + case JSONContentType::String: + return prop->stringValue; + case JSONContentType::Object: + return ReconstructObject(prop->obj); + default: + Assume(UNREACHED); + return nullptr; + } +} + +Var +LazyJSONString::TryParse() const +{ + // If we have thrown away our metadata, we won't be able to Parse + if (this->jsonContent == nullptr) + { + return nullptr; + } + + // If the gap is complex, this means that parse will be a non-trivial transformation, + // so fall back to the real parse + if (this->HasComplexGap()) + { + return nullptr; + } + + Var result = ReconstructVar(this->jsonContent); + + return result; +} + +const char16* +LazyJSONString::GetSz() +{ + if (this->IsFinalized()) + { + return this->UnsafeGetBuffer(); + } + + const charcount_t allocSize = this->SafeSzSize(); + + Recycler* recycler = GetScriptContext()->GetRecycler(); + char16* target = RecyclerNewArrayLeaf(recycler, char16, allocSize); + + JSONStringBuilder builder( + this->GetScriptContext(), + this->jsonContent, + target, + allocSize, + this->gap, + this->gapLength); + + builder.Build(); + + this->SetBuffer(target); + + // You probably aren't going to parse if you are using the string buffer + // Let's throw away the metadata so we can reclaim the memory + this->jsonContent = nullptr; + + return target; +} + +// static +bool +LazyJSONString::Is(Var var) +{ + return RecyclableObject::Is(var) && VirtualTableInfo::HasVirtualTable(RecyclableObject::FromVar(var)); +} + +// static +LazyJSONString* +LazyJSONString::TryFromVar(Var var) +{ + return LazyJSONString::Is(var) + ? reinterpret_cast(var) + : nullptr; +} + +} // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/LazyJSONString.h b/deps/chakrashim/core/lib/Runtime/Library/LazyJSONString.h new file mode 100644 index 00000000000..821875be09c --- /dev/null +++ b/deps/chakrashim/core/lib/Runtime/Library/LazyJSONString.h @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#pragma once + +namespace Js +{ +struct JSONObjectProperty; +struct JSONProperty; +struct JSONArray; + +enum class JSONContentType : uint8 +{ + Array, + Object, + Undefined, + Null, + True, + False, + Number, + String +}; + +typedef SListCounted JSONObject; + + +struct JSONNumberData +{ + Field(Var) value; + Field(JavascriptString*) string; +}; + + +struct JSONProperty +{ + Field(JSONContentType) type; + union + { + Field(JSONNumberData) numericValue; + Field(JavascriptString*) stringValue; + Field(JSONObject*) obj; + Field(JSONArray*) arr; + }; + + JSONProperty() + { + memset(this, 0, sizeof(JSONProperty)); + } + JSONProperty(const JSONProperty& other) + { + // Copy the full struct and use "Field(Var)" to identify write barrier + // policy as the struct contains Vars + CopyArray(this, 1, &other, 1); + } +}; + +struct JSONObjectProperty +{ + Field(JavascriptString*) propertyName; + Field(JSONProperty) propertyValue; + + JSONObjectProperty() : propertyName(nullptr), propertyValue() + { + } + JSONObjectProperty(const JSONObjectProperty& other) : + propertyName(other.propertyName), + propertyValue(other.propertyValue) + { + } +}; + +struct JSONArray +{ + Field(uint32) length; + Field(JSONProperty) arr[]; +}; + +class LazyJSONString : JavascriptString +{ +private: + Field(charcount_t) gapLength; + Field(JSONProperty*) jsonContent; + Field(const char16*) gap; + + DynamicObject* ReconstructObject(_In_ JSONObject* valueList) const; + JavascriptArray* ReconstructArray(_In_ JSONArray* valueArray) const; + Var ReconstructVar(_In_ JSONProperty* content) const; + +protected: + DEFINE_VTABLE_CTOR(LazyJSONString, JavascriptString); + +public: + LazyJSONString(_In_ JSONProperty* content, charcount_t length, _In_opt_ const char16* gap, charcount_t gapLength, _In_ StaticType* type); + Var TryParse() const; + + // Tells if the string has a gap with characters that might impact JSON.parse + bool HasComplexGap() const; + + const char16* GetSz() override sealed; + + static bool Is(Var var); + + static LazyJSONString* TryFromVar(Var var); + + virtual VTableValue DummyVirtualFunctionToHinderLinkerICF() + { + return VTableValue::VtableLazyJSONString; + } +}; // class LazyJSONString + +} // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/LiteralString.cpp b/deps/chakrashim/core/lib/Runtime/Library/LiteralString.cpp index 9da14c65056..6de3020109e 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/LiteralString.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/LiteralString.cpp @@ -41,36 +41,4 @@ namespace Js return RecyclerNew(type->GetScriptContext()->GetRecycler(), LiteralString, type, _u(""), 0); } - - ArenaLiteralString::ArenaLiteralString(StaticType * type, const char16* content, charcount_t charLength) : - JavascriptString(type, charLength, content) - { -#if defined(DBG) && defined(_M_IX86) - // Make sure content isn't on the stack by comparing to stack bounds in TIB - AssertMsg(!ThreadContext::IsOnStack((void*)content), - "ArenaLiteralString object created using stack buffer..."); -#endif - - AssertMsg(!type->GetScriptContext()->GetRecycler()->IsValidObject((void *)content), - "ArenaLiteralString should not be used with GC strings"); - -#ifdef PROFILE_STRINGS - StringProfiler::RecordNewString( type->GetScriptContext(), content, charLength ); -#endif - } - - ArenaLiteralString* ArenaLiteralString::New(StaticType* type, const char16* content, charcount_t charLength, Recycler* recycler) - { - return RecyclerNew(recycler, ArenaLiteralString, type, content, charLength); - } - - ArenaLiteralString* ArenaLiteralString::New(StaticType* type, const char16* content, charcount_t charLength, ArenaAllocator* arena) - { - return Anew(arena, ArenaLiteralString, type, content, charLength); - } - - RecyclableObject * ArenaLiteralString::CloneToScriptContext(ScriptContext* requestContext) - { - return JavascriptString::NewCopyBuffer(this->GetSz(), this->GetLength(), requestContext); - } } // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/LiteralString.h b/deps/chakrashim/core/lib/Runtime/Library/LiteralString.h index 2ca019ab6c6..aa14bcb8bdf 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/LiteralString.h +++ b/deps/chakrashim/core/lib/Runtime/Library/LiteralString.h @@ -12,23 +12,9 @@ namespace Js LiteralString(StaticType* type); LiteralString(StaticType* type, const char16* content, charcount_t charLength); DEFINE_VTABLE_CTOR(LiteralString, JavascriptString); - DECLARE_CONCRETE_STRING_CLASS; public: static LiteralString* New(StaticType* type, const char16* content, charcount_t charLength, Recycler* recycler); static LiteralString* CreateEmptyString(StaticType* type); }; - - class ArenaLiteralString sealed : public JavascriptString - { - protected: - ArenaLiteralString(StaticType* type, const char16* content, charcount_t charLength); - DEFINE_VTABLE_CTOR(ArenaLiteralString, JavascriptString); - DECLARE_CONCRETE_STRING_CLASS; - - public: - static ArenaLiteralString* New(StaticType* type, const char16* content, charcount_t charLength, Recycler* recycler); - static ArenaLiteralString* New(StaticType* type, const char16* content, charcount_t charLength, ArenaAllocator* arena); - virtual RecyclableObject * CloneToScriptContext(ScriptContext* requestContext) override; - }; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/MathLibrary.cpp b/deps/chakrashim/core/lib/Runtime/Library/MathLibrary.cpp index 227562e735f..c4f856e5bd7 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/MathLibrary.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/MathLibrary.cpp @@ -85,7 +85,7 @@ namespace Js if (TaggedInt::Is(arg)) { -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) __int64 result = ::_abs64(TaggedInt::ToInt32(arg)); #else __int32 result = ::abs(TaggedInt::ToInt32(arg)); diff --git a/deps/chakrashim/core/lib/Runtime/Library/ModuleRoot.cpp b/deps/chakrashim/core/lib/Runtime/Library/ModuleRoot.cpp index ffa6556af9e..89b3e0b7cff 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ModuleRoot.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ModuleRoot.cpp @@ -68,10 +68,12 @@ namespace Js if (info) // Avoid testing IsWritable if info not being queried { PropertyValueInfo::Set(info, this, index, IsWritable(propertyId) ? PropertyWritable : PropertyNone); +#if ENABLE_FIXED_FIELDS if (this->IsFixedProperty(propertyId)) { PropertyValueInfo::DisableStoreFieldCache(info); } +#endif } return PropertyQueryFlags::Property_Found; } @@ -98,10 +100,12 @@ namespace Js if (info) // Avoid testing IsWritable if info not being queried { PropertyValueInfo::Set(info, this, index, IsWritable(propertyId) ? PropertyWritable : PropertyNone); +#if ENABLE_FIXED_FIELDS if (this->IsFixedProperty(propertyId)) { PropertyValueInfo::DisableStoreFieldCache(info); } +#endif } return TRUE; } @@ -152,10 +156,12 @@ namespace Js if (info) // Avoid testing IsWritable if info not being queried { PropertyValueInfo::Set(info, this, index, IsWritable(propertyId) ? PropertyWritable : PropertyNone); +#if ENABLE_FIXED_FIELDS if (this->IsFixedProperty(propertyId)) { PropertyValueInfo::DisableStoreFieldCache(info); } +#endif } return PropertyQueryFlags::Property_Found; } @@ -183,10 +189,12 @@ namespace Js if (info) // Avoid testing IsWritable if info not being queried { PropertyValueInfo::Set(info, this, index, IsWritable(propertyId) ? PropertyWritable : PropertyNone); +#if ENABLE_FIXED_FIELDS if (this->IsFixedProperty(propertyId)) { PropertyValueInfo::DisableStoreFieldCache(info); } +#endif } return TRUE; } @@ -213,24 +221,28 @@ namespace Js { JavascriptError::ThrowCantAssignIfStrictMode(flags, this->GetScriptContext()); - if (!this->IsFixedProperty(propertyId)) +#if ENABLE_FIXED_FIELDS + if (this->IsFixedProperty(propertyId)) { - PropertyValueInfo::Set(info, this, index, PropertyNone); // Try to cache property info even if not writable + PropertyValueInfo::SetNoCache(info, this); } else +#endif { - PropertyValueInfo::SetNoCache(info, this); + PropertyValueInfo::Set(info, this, index, PropertyNone); // Try to cache property info even if not writable } return FALSE; } this->SetSlot(SetSlotArguments(propertyId, index, value)); - if (!this->IsFixedProperty(propertyId)) +#if ENABLE_FIXED_FIELDS + if (this->IsFixedProperty(propertyId)) { - PropertyValueInfo::Set(info, this, index); + PropertyValueInfo::SetNoCache(info, this); } else +#endif { - PropertyValueInfo::SetNoCache(info, this); + PropertyValueInfo::Set(info, this, index); } return TRUE; } @@ -272,25 +284,29 @@ namespace Js { JavascriptError::ThrowCantAssignIfStrictMode(flags, this->GetScriptContext()); - if (!this->IsFixedProperty(propertyId)) +#if ENABLE_FIXED_FIELDS + if (this->IsFixedProperty(propertyId)) { - PropertyValueInfo::Set(info, this, index, PropertyNone); // Try to cache property info even if not writable + PropertyValueInfo::SetNoCache(info, this); } else +#endif { - PropertyValueInfo::SetNoCache(info, this); + PropertyValueInfo::Set(info, this, index, PropertyNone); // Try to cache property info even if not writable } return FALSE; } this->SetSlot(SetSlotArgumentsRoot(propertyId, true, index, value)); - if (!this->IsFixedProperty(propertyId)) +#if ENABLE_FIXED_FIELDS + if (this->IsFixedProperty(propertyId)) { - PropertyValueInfo::Set(info, this, index); + PropertyValueInfo::SetNoCache(info, this); } else +#endif { - PropertyValueInfo::SetNoCache(info, this); - } + PropertyValueInfo::Set(info, this, index); + } return TRUE; } else if (this->hostObject && this->hostObject->HasProperty(propertyId)) diff --git a/deps/chakrashim/core/lib/Runtime/Library/ObjectPrototypeObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/ObjectPrototypeObject.cpp index 54209012905..8f7cfc90b31 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ObjectPrototypeObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ObjectPrototypeObject.cpp @@ -107,8 +107,7 @@ namespace Js { const BOOL result = __super::DeleteProperty(propertyNameString, flags); - JsUtil::CharacterBuffer propertyName(propertyNameString->GetString(), propertyNameString->GetLength()); - if (result && BuiltInPropertyRecords::__proto__.Equals(propertyName)) + if (result && BuiltInPropertyRecords::__proto__.Equals(propertyNameString)) { this->__proto__Enabled = false; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/PropertyString.cpp b/deps/chakrashim/core/lib/Runtime/Library/PropertyString.cpp index c25d4e6bae6..ccc5f498693 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/PropertyString.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/PropertyString.cpp @@ -37,6 +37,18 @@ namespace Js return this->stElemInlineCache; } + /* static */ + bool PropertyString::Is(RecyclableObject * obj) + { + return VirtualTableInfo::HasVirtualTable(obj); + } + + /* static */ + bool PropertyString::Is(Var var) + { + return RecyclableObject::Is(var) && PropertyString::Is(RecyclableObject::UnsafeFromVar(var)); + } + void const * PropertyString::GetOriginalStringReference() { // Property record is the allocation containing the string buffer @@ -48,7 +60,61 @@ namespace Js return this->hitRate > (int)CONFIG_FLAG(StringCacheMissThreshold); } - void PropertyString::LogCacheMiss() + bool PropertyString::TrySetPropertyFromCache( + _In_ RecyclableObject *const object, + _In_ Var propertyValue, + _In_ ScriptContext *const requestContext, + const PropertyOperationFlags propertyOperationFlags, + _Inout_ PropertyValueInfo *const propertyValueInfo) + { + if (ShouldUseCache()) + { + PropertyValueInfo::SetCacheInfo(propertyValueInfo, this, GetStElemInlineCache(), true /* allowResizing */); + bool found = CacheOperators::TrySetProperty< + true, // CheckLocal + true, // CheckLocalTypeWithoutProperty + true, // CheckAccessor + true, // CheckPolymorphicInlineCache + true, // CheckTypePropertyCache + false, // IsInlineCacheAvailable + true, // IsPolymorphicInlineCacheAvailable + false> // ReturnOperationInfo + (object, + false, // isRoot + this->propertyRecord->GetPropertyId(), + propertyValue, + requestContext, + propertyOperationFlags, + nullptr, // operationInfo + propertyValueInfo); + + if(found) + { +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS + if (PHASE_TRACE1(PropertyStringCachePhase)) + { + Output::Print(_u("PropertyCache: SetElem cache hit for '%s': type %p\n"), GetString(), object->GetType()); + } +#endif + RegisterCacheHit(); + return true; + } + } + RegisterCacheMiss(); +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS + if (PHASE_TRACE1(PropertyStringCachePhase)) + { + Output::Print(_u("PropertyCache: SetElem cache miss for '%s': type %p, index %d\n"), + GetString(), + object->GetType(), + GetStElemInlineCache()->GetInlineCacheIndexForType(object->GetType())); + DumpCache(false); + } +#endif + return false; + } + + void PropertyString::RegisterCacheMiss() { this->hitRate -= (int)CONFIG_FLAG(StringCacheMissPenalty); if (this->hitRate < (int)CONFIG_FLAG(StringCacheMissReset)) diff --git a/deps/chakrashim/core/lib/Runtime/Library/PropertyString.h b/deps/chakrashim/core/lib/Runtime/Library/PropertyString.h index e03f930cebe..f532adacec7 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/PropertyString.h +++ b/deps/chakrashim/core/lib/Runtime/Library/PropertyString.h @@ -6,58 +6,152 @@ namespace Js { - class PropertyString : public JavascriptString +class PropertyString : public JavascriptString +{ +protected: + Field(int) hitRate; + Field(PolymorphicInlineCache*) ldElemInlineCache; + Field(PolymorphicInlineCache*) stElemInlineCache; + Field(const Js::PropertyRecord*) propertyRecord; + + DEFINE_VTABLE_CTOR(PropertyString, JavascriptString); + + PropertyString(StaticType* type, const Js::PropertyRecord* propertyRecord); +public: + virtual Js::PropertyRecord const * GetPropertyRecord(bool dontLookupFromDictionary = false) override { - protected: - Field(int) hitRate; - Field(PolymorphicInlineCache*) ldElemInlineCache; - Field(PolymorphicInlineCache*) stElemInlineCache; - Field(const Js::PropertyRecord*) propertyRecord; - - DEFINE_VTABLE_CTOR(PropertyString, JavascriptString); - DECLARE_CONCRETE_STRING_CLASS; - - PropertyString(StaticType* type, const Js::PropertyRecord* propertyRecord); - public: - PolymorphicInlineCache * GetLdElemInlineCache() const; - PolymorphicInlineCache * GetStElemInlineCache() const; - Js::PropertyRecord const * GetPropertyRecord() const { return this->propertyRecord; } - PolymorphicInlineCache * CreateBiggerPolymorphicInlineCache(bool isLdElem); - void LogCacheMiss(); - int GetHitRate() const { return this->hitRate; }; - void LogCacheHit() { ++this->hitRate; }; - bool ShouldUseCache() const; - - static PropertyString* New(StaticType* type, const Js::PropertyRecord* propertyRecord, Recycler *recycler); - - virtual void const * GetOriginalStringReference() override; - virtual RecyclableObject * CloneToScriptContext(ScriptContext* requestContext) override; - - static uint32 GetOffsetOfLdElemInlineCache() { return offsetof(PropertyString, ldElemInlineCache); } - static uint32 GetOffsetOfStElemInlineCache() { return offsetof(PropertyString, stElemInlineCache); } - static uint32 GetOffsetOfHitRate() { return offsetof(PropertyString, hitRate); } + return this->propertyRecord; + } + + PolymorphicInlineCache * GetLdElemInlineCache() const; + PolymorphicInlineCache * GetStElemInlineCache() const; + PolymorphicInlineCache * CreateBiggerPolymorphicInlineCache(bool isLdElem); + void RegisterCacheMiss(); + int GetHitRate() const { return this->hitRate; }; + void RegisterCacheHit() { ++this->hitRate; }; + bool ShouldUseCache() const; + + bool TrySetPropertyFromCache( + _In_ RecyclableObject *const object, + _In_ Var propertyValue, + _In_ ScriptContext *const requestContext, + const PropertyOperationFlags propertyOperationFlags, + _Inout_ PropertyValueInfo *const propertyValueInfo); + + + template + bool TryGetPropertyFromCache( + Var const instance, + RecyclableObject *const object, + Var *const propertyValue, + ScriptContext *const requestContext, + PropertyValueInfo *const propertyValueInfo); + + static PropertyString* New(StaticType* type, const Js::PropertyRecord* propertyRecord, Recycler *recycler); + + virtual void const * GetOriginalStringReference() override; + virtual RecyclableObject * CloneToScriptContext(ScriptContext* requestContext) override; + + static uint32 GetOffsetOfLdElemInlineCache() { return offsetof(PropertyString, ldElemInlineCache); } + static uint32 GetOffsetOfStElemInlineCache() { return offsetof(PropertyString, stElemInlineCache); } + static uint32 GetOffsetOfHitRate() { return offsetof(PropertyString, hitRate); } + static bool Is(Var var); + static bool Is(RecyclableObject * var); + + template static PropertyString* TryFromVar(T var); #if ENABLE_DEBUG_CONFIG_OPTIONS - void DumpCache(bool ldElemCache) + void DumpCache(bool ldElemCache) + { + PolymorphicInlineCache * cache = ldElemCache ? GetLdElemInlineCache() : GetStElemInlineCache(); + Output::Print(_u("PropertyCache HitRate: %i; types: "), this->hitRate); + for (uint i = 0; i < cache->GetSize(); ++i) { - PolymorphicInlineCache * cache = ldElemCache ? GetLdElemInlineCache() : GetStElemInlineCache(); - Output::Print(_u("PropertyCache HitRate: %i; types: "), this->hitRate); - for (uint i = 0; i < cache->GetSize(); ++i) - { - Output::Print(_u("%p,"), cache->GetInlineCaches()[i].GetType()); - } - Output::Print(_u("\n")); + Output::Print(_u("%p,"), cache->GetInlineCaches()[i].GetType()); } + Output::Print(_u("\n")); + } #endif #if ENABLE_TTD - //Get the associated property id for this string if there is on (e.g. it is a propertystring otherwise return Js::PropertyIds::_none) - virtual Js::PropertyId TryGetAssociatedPropertyId() const override { return this->propertyRecord->GetPropertyId(); } + //Get the associated property id for this string if there is on (e.g. it is a propertystring otherwise return Js::PropertyIds::_none) + virtual Js::PropertyId TryGetAssociatedPropertyId() const override { return this->propertyRecord->GetPropertyId(); } #endif +public: + virtual VTableValue DummyVirtualFunctionToHinderLinkerICF() + { + return VTableValue::VtablePropertyString; + } +}; - public: - virtual VTableValue DummyVirtualFunctionToHinderLinkerICF() +// Templated so that the Is call dispatchs to different function depending +// on if argument is already a RecyclableObject* or only known to be a Var +// +// In case it is known to be a RecyclableObject*, the Is call skips that check +template inline +PropertyString * PropertyString::TryFromVar(T var) +{ + return PropertyString::Is(var) + ? reinterpret_cast(var) + : nullptr; +} + +template inline +bool PropertyString::TryGetPropertyFromCache( + Var const instance, + RecyclableObject *const object, + Var *const propertyValue, + ScriptContext *const requestContext, + PropertyValueInfo *const propertyValueInfo) +{ + if (ShouldUseCache()) + { + PropertyValueInfo::SetCacheInfo(propertyValueInfo, this, GetLdElemInlineCache(), true /* allowResizing */); + + // Some caches will look at prototype, so GetOwnProperty lookups must not check these + bool found = CacheOperators::TryGetProperty< + true, // CheckLocal + !OwnPropertyOnly, // CheckProto + !OwnPropertyOnly, // CheckAccessor + !OwnPropertyOnly, // CheckMissing + true, // CheckPolymorphicInlineCache + !OwnPropertyOnly, // CheckTypePropertyCache + false, // IsInlineCacheAvailable + true, // IsPolymorphicInlineCacheAvailable + false> // ReturnOperationInfo + (instance, + false, // isRoot + object, + this->propertyRecord->GetPropertyId(), + propertyValue, + requestContext, + nullptr, // operationInfo + propertyValueInfo); + + if (found) { - return VTableValue::VtablePropertyString; + RegisterCacheHit(); +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS + if (PHASE_TRACE1(PropertyStringCachePhase)) + { + Output::Print(_u("PropertyCache: GetElem cache hit for '%s': type %p\n"), GetString(), object->GetType()); + } +#endif + return true; } - }; + } + + RegisterCacheMiss(); +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS + if (PHASE_TRACE1(PropertyStringCachePhase)) + { + Output::Print(_u("PropertyCache: GetElem cache miss for '%s': type %p, index %d\n"), + GetString(), + object->GetType(), + GetLdElemInlineCache()->GetInlineCacheIndexForType(object->GetType())); + DumpCache(true); + } +#endif + return false; } + +} // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/RegexHelper.cpp b/deps/chakrashim/core/lib/Runtime/Library/RegexHelper.cpp index 669d474086a..e69f2a58a3c 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/RegexHelper.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/RegexHelper.cpp @@ -323,9 +323,7 @@ namespace Js Assert(regExp); Assert(input); - EnterPinnedScope((volatile void**)& input); RegexHelperTrace(scriptContext, use, regExp, input->GetString(), input->GetLength()); - LeavePinnedScope(); // input } static void RegexHelperTrace(ScriptContext* scriptContext, UnifiedRegex::RegexStats::Use use, JavascriptRegExp* regExp, JavascriptString* input, JavascriptString* replace) @@ -334,12 +332,7 @@ namespace Js Assert(input); Assert(replace); - EnterPinnedScope((volatile void**)& input); - EnterPinnedScope((volatile void**)& replace); RegexHelperTrace(scriptContext, use, regExp, input->GetString(), input->GetLength(), replace->GetString(), replace->GetLength()); - - LeavePinnedScope(); // replace - LeavePinnedScope(); // input } #endif @@ -435,11 +428,7 @@ namespace Js template Var RegexHelper::RegexEs5MatchImpl(ScriptContext* scriptContext, JavascriptRegExp *regularExpression, JavascriptString *input, bool noResult, void *const stackAllocationPointer) { - JavascriptArray* arrayResult = nullptr; UnifiedRegex::RegexPattern* pattern = regularExpression->GetPattern(); - - EnterPinnedScope((volatile void**)& input); - const char16* inputStr = input->GetString(); CharCount inputLength = input->GetLength(); @@ -477,7 +466,7 @@ namespace Js Assert(pattern->IsGlobal()); - arrayResult = CreateMatchResult(stackAllocationPointer, scriptContext, /* isGlobal */ true, pattern->NumGroups(), input); + JavascriptArray* arrayResult = CreateMatchResult(stackAllocationPointer, scriptContext, /* isGlobal */ true, pattern->NumGroups(), input); FinalizeMatchResult(scriptContext, /* isGlobal */ true, arrayResult, lastSuccessfulMatch); if (trigramInfo->resultCount > 0) @@ -517,6 +506,7 @@ namespace Js const bool isGlobal = pattern->IsGlobal(); const bool isSticky = pattern->IsSticky(); + JavascriptArray* arrayResult = 0; RegexMatchState state; // If global = false and sticky = true, set offset = lastIndex, else set offset = 0 @@ -591,8 +581,6 @@ namespace Js FinalizeMatchResult(scriptContext, /* isGlobal */ true, arrayResult, lastSuccessfulMatch); } - LeavePinnedScope(); // input - return arrayResult; } @@ -678,15 +666,51 @@ namespace Js CharCount inputLength = input->GetLength(); UnifiedRegex::GroupInfo match; // initially undefined + const bool isGlobal = pattern->IsGlobal(); + const bool isSticky = pattern->IsSticky(); + const bool useCache = !isGlobal && !isSticky; + + UnifiedRegex::RegExpTestCache* cache = nullptr; + JavascriptString * cachedInput = nullptr; + uint cacheIndex = 0; + bool cacheHit = false; + bool cachedResult = false; + if (useCache) + { + cache = pattern->EnsureTestCache(); + cacheIndex = UnifiedRegex::RegexPattern::GetTestCacheIndex(input); + cachedInput = cache->inputArray[cacheIndex] != nullptr ? cache->inputArray[cacheIndex]->Get() : nullptr; + cacheHit = cachedInput == input; + } #if ENABLE_REGEX_CONFIG_OPTIONS RegexHelperTrace(scriptContext, UnifiedRegex::RegexStats::Test, regularExpression, input); + UnifiedRegex::RegexPattern::TraceTestCache(cacheHit, input, cachedInput, !useCache); #endif - const bool isGlobal = pattern->IsGlobal(); - const bool isSticky = pattern->IsSticky(); + + if (cacheHit) + { + Assert(useCache); + cachedResult = (cache->resultBV.Test(cacheIndex) != 0); + // for debug builds, let's still do the real test so we can validate values in the cache +#if !DBG + return JavascriptBoolean::ToVar(cachedResult, scriptContext); +#endif + } + + CharCount offset; if (!GetInitialOffset(isGlobal, isSticky, regularExpression, inputLength, offset)) + { + if (useCache) + { + Assert(offset == 0); + Assert(!cacheHit || cachedInput == input); + Assert(!cacheHit || cachedResult == false); + cache->inputArray[cacheIndex] = regularExpression->GetRecycler()->CreateWeakReferenceHandle(input); + cache->resultBV.Clear(cacheIndex); + } return scriptContext->GetLibrary()->GetFalse(); - + } if (offset <= inputLength) { match = SimpleMatch(scriptContext, pattern, inputStr, inputLength, offset); @@ -694,8 +718,24 @@ namespace Js // else: match remains undefined PropagateLastMatch(scriptContext, isGlobal, isSticky, regularExpression, input, match, match, true, true); + bool wasFound = !match.IsUndefined(); - return JavascriptBoolean::ToVar(!match.IsUndefined(), scriptContext); + if (useCache) + { + Assert(offset == 0); + Assert(!cacheHit || cachedInput == input); + Assert(!cacheHit || cachedResult == wasFound); + cache->inputArray[cacheIndex] = regularExpression->GetRecycler()->CreateWeakReferenceHandle(input); + if (wasFound) + { + cache->resultBV.Set(cacheIndex); + } + else + { + cache->resultBV.Clear(cacheIndex); + } + } + return JavascriptBoolean::ToVar(wasFound, scriptContext); } template @@ -755,7 +795,7 @@ namespace Js { Var group = getGroup(captureIndex, nonMatchValue); if (JavascriptString::Is(group)) - concatenated.Append(JavascriptString::FromVar(group)); + concatenated.Append(JavascriptString::UnsafeFromVar(group)); else if (group != nonMatchValue) concatenated.Append(replace, substitutionOffset, offset - substitutionOffset); } @@ -933,9 +973,11 @@ namespace Js args[numberOfCaptures + 2] = JavascriptNumber::ToVar(position, scriptContext); args[numberOfCaptures + 3] = input; - JavascriptString* replace = JavascriptConversion::ToString( - replaceFn->CallFunction(Arguments(CallInfo(argCount), args)), - scriptContext); + Js::Var replaceFnResult = scriptContext->GetThreadContext()->ExecuteImplicitCall(replaceFn, Js::ImplicitCall_Accessor, [=]()->Js::Var + { + return replaceFn->CallFunction(Arguments(CallInfo(argCount), args)); + }); + JavascriptString* replace = JavascriptConversion::ToString(replaceFnResult, scriptContext); resultBuilder.Append(replace); }; @@ -1039,9 +1081,7 @@ namespace Js CharCount substringLength = position - nextSourcePosition; accumulatedResultBuilder.Append(input, nextSourcePosition, substringLength); - EnterPinnedScope((volatile void**)& matchStr); appendReplacement(accumulatedResultBuilder, tempAlloc, matchStr, (int) numberOfCapturesToKeep, (Var*)captures, position); - LeavePinnedScope(); // matchStr nextSourcePosition = JavascriptRegExp::AddIndex(position, matchStr->GetLength()); } @@ -1434,7 +1474,7 @@ namespace Js ThreadContext* threadContext = scriptContext->GetThreadContext(); Var replaceVar = threadContext->ExecuteImplicitCall(replacefn, ImplicitCall_Accessor, [=]()->Js::Var { - Var pThis = scriptContext->GetLibrary()->GetUndefined(); + Var pThis = scriptContext->GetLibrary()->GetUndefined(); return CALL_FUNCTION(threadContext, replacefn, CallInfo(4), pThis, match, JavascriptNumber::ToVar((int)indexMatched, scriptContext), input); }); JavascriptString* replace = JavascriptConversion::ToString(replaceVar, scriptContext); @@ -1548,10 +1588,12 @@ namespace Js { PCWSTR const varName = _u("RegExp.prototype[Symbol.split]"); - Var speciesConstructor = JavascriptOperators::SpeciesConstructor( + JavascriptFunction* defaultConstructor = scriptContext->GetLibrary()->GetRegExpConstructor(); + RecyclableObject* speciesConstructor = JavascriptOperators::SpeciesConstructor( thisObj, - scriptContext->GetLibrary()->GetRegExpConstructor(), + defaultConstructor, scriptContext); + AssertOrFailFast(JavascriptOperators::IsConstructor(speciesConstructor)); JavascriptString* flags = JavascriptConversion::ToString( JavascriptOperators::GetProperty(thisObj, PropertyIds::flags, scriptContext), @@ -1559,13 +1601,16 @@ namespace Js bool unicode = wcsstr(flags->GetString(), _u("u")) != nullptr; flags = AppendStickyToFlagsIfNeeded(flags, scriptContext); - Js::Var args[] = { speciesConstructor, thisObj, flags }; - Js::CallInfo callInfo(Js::CallFlags_New, _countof(args)); - Var regEx = JavascriptOperators::NewScObject( - speciesConstructor, - Js::Arguments(callInfo, args), - scriptContext); - RecyclableObject* splitter = RecyclableObject::FromVar(regEx); + Var regEx = JavascriptOperators::NewObjectCreationHelper_ReentrancySafe(speciesConstructor, defaultConstructor, scriptContext->GetThreadContext(), [=]()->Js::Var + { + Js::Var args[] = { speciesConstructor, thisObj, flags }; + Js::CallInfo callInfo(Js::CallFlags_New, _countof(args)); + return JavascriptOperators::NewScObject( + speciesConstructor, + Js::Arguments(callInfo, args), + scriptContext); + }); + RecyclableObject* splitter = RecyclableObject::UnsafeFromVar(regEx); JavascriptArray* arrayResult = scriptContext->GetLibrary()->CreateArray(); @@ -2263,6 +2308,8 @@ namespace Js Var RegexHelper::RegexSplitResultUsedAndMayBeTemp(void *const stackAllocationPointer, ScriptContext* scriptContext, JavascriptRegExp* regularExpression, JavascriptString* input, CharCount limit) { + Assert(ThreadContext::IsOnStack(stackAllocationPointer)); + return RegexHelper::RegexSplit(scriptContext, regularExpression, input, limit, false, stackAllocationPointer); } @@ -2290,7 +2337,7 @@ namespace Js // an Object or Null. RegExp algorithms have special conditions for when the result is Null, // so we can directly cast to RecyclableObject. Assert(!JavascriptOperators::IsNull(result)); - return RecyclableObject::FromVar(result); + return RecyclableObject::UnsafeFromVar(result); } JavascriptString* RegexHelper::GetMatchStrFromResult(RecyclableObject* result, ScriptContext* scriptContext) diff --git a/deps/chakrashim/core/lib/Runtime/Library/RootObjectBase.cpp b/deps/chakrashim/core/lib/Runtime/Library/RootObjectBase.cpp index bb23796aa1d..87e5adc062f 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/RootObjectBase.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/RootObjectBase.cpp @@ -23,7 +23,7 @@ namespace Js bool RootObjectBase::Is(Var var) { - return RecyclableObject::Is(var) && RootObjectBase::Is(RecyclableObject::FromVar(var)); + return RecyclableObject::Is(var) && RootObjectBase::Is(RecyclableObject::UnsafeFromVar(var)); } bool RootObjectBase::Is(RecyclableObject* obj) @@ -33,6 +33,12 @@ namespace Js } RootObjectBase * RootObjectBase::FromVar(Var var) + { + AssertOrFailFast(RootObjectBase::Is(var)); + return static_cast(var); + } + + RootObjectBase * RootObjectBase::UnsafeFromVar(Var var) { Assert(RootObjectBase::Is(var)); return static_cast(var); diff --git a/deps/chakrashim/core/lib/Runtime/Library/RootObjectBase.h b/deps/chakrashim/core/lib/Runtime/Library/RootObjectBase.h index 3bc814e3c29..22afe5fc074 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/RootObjectBase.h +++ b/deps/chakrashim/core/lib/Runtime/Library/RootObjectBase.h @@ -57,6 +57,7 @@ namespace Js static bool Is(Var var); static bool Is(RecyclableObject * obj); static RootObjectBase * FromVar(Var var); + static RootObjectBase * UnsafeFromVar(Var var); protected: DEFINE_VTABLE_CTOR(RootObjectBase, DynamicObject); diff --git a/deps/chakrashim/core/lib/Runtime/Library/RuntimeLibraryPch.h b/deps/chakrashim/core/lib/Runtime/Library/RuntimeLibraryPch.h index 33e841e4956..831e787bde7 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/RuntimeLibraryPch.h +++ b/deps/chakrashim/core/lib/Runtime/Library/RuntimeLibraryPch.h @@ -21,6 +21,9 @@ #include "Library/DataView.h" #include "Library/JSONString.h" +#include "Library/LazyJSONString.h" +#include "Library/JSONStringBuilder.h" +#include "Library/JSONStringifier.h" #include "Library/ProfileString.h" #include "Library/SingleCharString.h" #include "Library/SubString.h" diff --git a/deps/chakrashim/core/lib/Runtime/Library/ScriptFunction.cpp b/deps/chakrashim/core/lib/Runtime/Library/ScriptFunction.cpp index 3092e74250b..a7691c8062e 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ScriptFunction.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ScriptFunction.cpp @@ -18,7 +18,7 @@ namespace Js { if (JavascriptFunction::Is(func)) { - JavascriptFunction *function = JavascriptFunction::FromVar(func); + JavascriptFunction *function = JavascriptFunction::UnsafeFromVar(func); return ScriptFunction::Test(function) || JavascriptGeneratorFunction::Test(function) || JavascriptAsyncFunction::Test(function); } @@ -27,6 +27,12 @@ namespace Js } ScriptFunctionBase * ScriptFunctionBase::FromVar(Var func) + { + AssertOrFailFast(ScriptFunctionBase::Is(func)); + return reinterpret_cast(func); + } + + ScriptFunctionBase * ScriptFunctionBase::UnsafeFromVar(Var func) { Assert(ScriptFunctionBase::Is(func)); return reinterpret_cast(func); @@ -155,10 +161,16 @@ namespace Js bool ScriptFunction::Is(Var func) { - return JavascriptFunction::Is(func) && JavascriptFunction::FromVar(func)->GetFunctionInfo()->HasBody(); + return JavascriptFunction::Is(func) && JavascriptFunction::UnsafeFromVar(func)->GetFunctionInfo()->HasBody(); } ScriptFunction * ScriptFunction::FromVar(Var func) + { + AssertOrFailFast(ScriptFunction::Is(func)); + return reinterpret_cast(func); + } + + ScriptFunction * ScriptFunction::UnsafeFromVar(Var func) { Assert(ScriptFunction::Is(func)); return reinterpret_cast(func); @@ -566,13 +578,13 @@ namespace Js uint slotArrayCount = static_cast(slotArray.GetCount()); //get the function body associated with the scope - if(slotArray.IsFunctionScopeSlotArray()) + if (slotArray.IsDebuggerScopeSlotArray()) { - rctxInfo->EnqueueNewFunctionBodyObject(this, slotArray.GetFunctionInfo()->GetFunctionBody(), scopePathString.GetStrValue()); + rctxInfo->AddWellKnownDebuggerScopePath(this, slotArray.GetDebuggerScope(), i); } else { - rctxInfo->AddWellKnownDebuggerScopePath(this, slotArray.GetDebuggerScope(), i); + rctxInfo->EnqueueNewFunctionBodyObject(this, slotArray.GetFunctionInfo()->GetFunctionBody(), scopePathString.GetStrValue()); } for(uint j = 0; j < slotArrayCount; j++) @@ -613,6 +625,17 @@ namespace Js TTDAssert(this->GetFunctionInfo() != nullptr, "We are only doing this for functions with ParseableFunctionInfo."); TTD::NSSnapObjects::SnapScriptFunctionInfo* ssfi = alloc.SlabAllocateStruct(); + + this->ExtractSnapObjectDataIntoSnapScriptFunctionInfo(ssfi, alloc); + + TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, ssfi); + } + + // TODO: Fixup function definition - something funky w/ header file includes - cycles? + void ScriptFunction::ExtractSnapObjectDataIntoSnapScriptFunctionInfo(/*TTD::NSSnapObjects::SnapScriptFunctionInfo* */ void* snapScriptFunctionInfo, TTD::SlabAllocator& alloc) + { + TTD::NSSnapObjects::SnapScriptFunctionInfo* ssfi = reinterpret_cast(snapScriptFunctionInfo); + Js::FunctionBody* fb = TTD::JsSupport::ForceAndGetFunctionBody(this->GetParseableFunctionInfo()); alloc.CopyNullTermStringInto(fb->GetDisplayName(), ssfi->DebugFunctionName); @@ -621,19 +644,19 @@ namespace Js Js::FrameDisplay* environment = this->GetEnvironment(); ssfi->ScopeId = TTD_INVALID_PTR_ID; - if(environment->GetLength() != 0) + if (environment->GetLength() != 0) { ssfi->ScopeId = TTD_CONVERT_SCOPE_TO_PTR_ID(environment); } ssfi->CachedScopeObjId = TTD_INVALID_PTR_ID; - if(this->cachedScopeObj != nullptr) + if (this->cachedScopeObj != nullptr) { ssfi->CachedScopeObjId = TTD_CONVERT_VAR_TO_PTR_ID(this->cachedScopeObj); } ssfi->HomeObjId = TTD_INVALID_PTR_ID; - if(this->homeObj != nullptr) + if (this->homeObj != nullptr) { ssfi->HomeObjId = TTD_CONVERT_VAR_TO_PTR_ID(this->homeObj); } @@ -641,34 +664,29 @@ namespace Js ssfi->ComputedNameInfo = TTD_CONVERT_JSVAR_TO_TTDVAR(this->computedNameVar); ssfi->HasSuperReference = this->hasSuperReference; - - TTD::NSSnapObjects::StdExtractSetKindSpecificInfo(objData, ssfi); } #endif AsmJsScriptFunction::AsmJsScriptFunction(FunctionProxy * proxy, ScriptFunctionType* deferredPrototypeType) : - ScriptFunction(proxy, deferredPrototypeType), m_moduleMemory(nullptr) + ScriptFunction(proxy, deferredPrototypeType), m_moduleEnvironment(nullptr) {} AsmJsScriptFunction::AsmJsScriptFunction(DynamicType * type) : - ScriptFunction(type), m_moduleMemory(nullptr) + ScriptFunction(type), m_moduleEnvironment(nullptr) {} bool AsmJsScriptFunction::Is(Var func) { - return ScriptFunction::Is(func) && - ScriptFunction::FromVar(func)->HasFunctionBody() && - ScriptFunction::FromVar(func)->GetFunctionBody()->GetIsAsmJsFunction(); + return ScriptFunction::Is(func) && ScriptFunction::UnsafeFromVar(func)->IsAsmJsFunction(); } - bool AsmJsScriptFunction::IsWasmScriptFunction(Var func) + AsmJsScriptFunction* AsmJsScriptFunction::FromVar(Var func) { - return ScriptFunction::Is(func) && - ScriptFunction::FromVar(func)->HasFunctionBody() && - ScriptFunction::FromVar(func)->GetFunctionBody()->IsWasmFunction(); + AssertOrFailFast(AsmJsScriptFunction::Is(func)); + return reinterpret_cast(func); } - AsmJsScriptFunction* AsmJsScriptFunction::FromVar(Var func) + AsmJsScriptFunction* AsmJsScriptFunction::UnsafeFromVar(Var func) { Assert(AsmJsScriptFunction::Is(func)); return reinterpret_cast(func); @@ -695,6 +713,48 @@ namespace Js return asmJsFunc; } + JavascriptArrayBuffer* AsmJsScriptFunction::GetAsmJsArrayBuffer() const + { +#ifdef ASMJS_PLAT + return *(JavascriptArrayBuffer**)(this->GetModuleEnvironment() + AsmJsModuleMemory::MemoryTableBeginOffset); +#else + Assert(UNREACHED); + return nullptr; +#endif + } + +#ifdef ENABLE_WASM + WasmScriptFunction::WasmScriptFunction(DynamicType * type) : + AsmJsScriptFunction(type), m_signature(nullptr) + {} + + WasmScriptFunction::WasmScriptFunction(FunctionProxy * proxy, ScriptFunctionType* deferredPrototypeType) : + AsmJsScriptFunction(proxy, deferredPrototypeType), m_signature(nullptr) + {} + + bool WasmScriptFunction::Is(Var func) + { + return ScriptFunction::Is(func) && ScriptFunction::UnsafeFromVar(func)->IsWasmFunction(); + } + + WasmScriptFunction* WasmScriptFunction::FromVar(Var func) + { + AssertOrFailFast(WasmScriptFunction::Is(func)); + return reinterpret_cast(func); + } + + WasmScriptFunction* WasmScriptFunction::UnsafeFromVar(Var func) + { + Assert(WasmScriptFunction::Is(func)); + return reinterpret_cast(func); + } + + WebAssemblyMemory* WasmScriptFunction::GetWebAssemblyMemory() const + { + return *(WebAssemblyMemory**)(this->GetModuleEnvironment() + AsmJsModuleMemory::MemoryTableBeginOffset); + } +#endif + ScriptFunctionWithInlineCache::ScriptFunctionWithInlineCache(FunctionProxy * proxy, ScriptFunctionType* deferredPrototypeType) : ScriptFunction(proxy, deferredPrototypeType), hasOwnInlineCaches(false) {} @@ -705,10 +765,16 @@ namespace Js bool ScriptFunctionWithInlineCache::Is(Var func) { - return ScriptFunction::Is(func) && ScriptFunction::FromVar(func)->GetHasInlineCaches(); + return ScriptFunction::Is(func) && ScriptFunction::UnsafeFromVar(func)->GetHasInlineCaches(); } ScriptFunctionWithInlineCache* ScriptFunctionWithInlineCache::FromVar(Var func) + { + AssertOrFailFast(ScriptFunctionWithInlineCache::Is(func)); + return reinterpret_cast(func); + } + + ScriptFunctionWithInlineCache* ScriptFunctionWithInlineCache::UnsafeFromVar(Var func) { Assert(ScriptFunctionWithInlineCache::Is(func)); return reinterpret_cast(func); diff --git a/deps/chakrashim/core/lib/Runtime/Library/ScriptFunction.h b/deps/chakrashim/core/lib/Runtime/Library/ScriptFunction.h index 032b2227943..b0200f53c96 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ScriptFunction.h +++ b/deps/chakrashim/core/lib/Runtime/Library/ScriptFunction.h @@ -17,6 +17,7 @@ namespace Js public: static bool Is(Var func); static ScriptFunctionBase * FromVar(Var func); + static ScriptFunctionBase * UnsafeFromVar(Var func); virtual Var GetHomeObj() const = 0; virtual void SetHomeObj(Var homeObj) = 0; @@ -47,6 +48,7 @@ namespace Js static bool Is(Var func); inline static BOOL Test(JavascriptFunction *func) { return func->GetFunctionInfo()->HasBody(); } static ScriptFunction * FromVar(Var func); + static ScriptFunction * UnsafeFromVar(Var func); static ScriptFunction * OP_NewScFunc(FrameDisplay *environment, FunctionInfoPtrPtr infoRef); ProxyEntryPointInfo* GetEntryPointInfo() const; @@ -97,6 +99,8 @@ namespace Js virtual JavascriptString* GetDisplayNameImpl() const; JavascriptString* GetComputedName() const; virtual bool IsAnonymousFunction() const override; + virtual bool IsAsmJsFunction() const { return false; } + virtual bool IsWasmFunction() const { return false; } virtual JavascriptFunction* GetRealFunctionObject() { return this; } @@ -109,6 +113,7 @@ namespace Js virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override; virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override; + void ExtractSnapObjectDataIntoSnapScriptFunctionInfo(/*TTD::NSSnapObjects::SnapScriptFunctionInfo* */ void* ssfi, TTD::SlabAllocator& alloc); #endif public: @@ -124,30 +129,57 @@ namespace Js AsmJsScriptFunction(FunctionProxy * proxy, ScriptFunctionType* deferredPrototypeType); static bool Is(Var func); - static bool IsWasmScriptFunction(Var func); static AsmJsScriptFunction* FromVar(Var func); + static AsmJsScriptFunction* UnsafeFromVar(Var func); static AsmJsScriptFunction * OP_NewAsmJsFunc(FrameDisplay *environment, FunctionInfoPtrPtr infoRef); - void SetModuleMemory(Field(Var)* mem) { m_moduleMemory = mem; } - Field(Var)* GetModuleMemory() const { return m_moduleMemory; } + virtual bool IsAsmJsFunction() const override { return true; } -#ifdef ENABLE_WASM - void SetSignature(Wasm::WasmSignature * sig) { m_signature = sig; } - Wasm::WasmSignature * GetSignature() const { return m_signature; } - static uint32 GetOffsetOfSignature() { return offsetof(AsmJsScriptFunction, m_signature); } -#endif - static uint32 GetOffsetOfModuleMemory() { return offsetof(AsmJsScriptFunction, m_moduleMemory); } + void SetModuleEnvironment(Field(Var)* mem) { m_moduleEnvironment = mem; } + Field(Var)* GetModuleEnvironment() const { return m_moduleEnvironment; } + static uint32 GetOffsetOfModuleMemory() { return offsetof(AsmJsScriptFunction, m_moduleEnvironment); } + + class JavascriptArrayBuffer* GetAsmJsArrayBuffer() const; protected: AsmJsScriptFunction(DynamicType * type); DEFINE_VTABLE_CTOR(AsmJsScriptFunction, ScriptFunction); DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(AsmJsScriptFunction); private: - Field(Field(Var)*) m_moduleMemory; + Field(Field(Var)*) m_moduleEnvironment; + }; + #ifdef ENABLE_WASM + class WasmScriptFunction : public AsmJsScriptFunction + { + public: + WasmScriptFunction(FunctionProxy * proxy, ScriptFunctionType* deferredPrototypeType); + + static bool Is(Var func); + static WasmScriptFunction* FromVar(Var func); + static WasmScriptFunction* UnsafeFromVar(Var func); + + void SetSignature(Wasm::WasmSignature * sig) { m_signature = sig; } + Wasm::WasmSignature * GetSignature() const { return m_signature; } + static uint32 GetOffsetOfSignature() { return offsetof(WasmScriptFunction, m_signature); } + + WebAssemblyMemory* GetWebAssemblyMemory() const; + + virtual bool IsWasmFunction() const override { return true; } + protected: + WasmScriptFunction(DynamicType * type); + DEFINE_VTABLE_CTOR(WasmScriptFunction, AsmJsScriptFunction); + DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(WasmScriptFunction); + private: Field(Wasm::WasmSignature *) m_signature; -#endif }; +#else + class WasmScriptFunction + { + public: + static bool Is(Var) { return false; } + }; +#endif class ScriptFunctionWithInlineCache : public ScriptFunction { @@ -177,6 +209,7 @@ namespace Js ScriptFunctionWithInlineCache(FunctionProxy * proxy, ScriptFunctionType* deferredPrototypeType); static bool Is(Var func); static ScriptFunctionWithInlineCache * FromVar(Var func); + static ScriptFunctionWithInlineCache * UnsafeFromVar(Var func); void CreateInlineCache(); void AllocateInlineCache(); void ClearInlineCacheOnFunctionObject(); diff --git a/deps/chakrashim/core/lib/Runtime/Library/SharedArrayBuffer.cpp b/deps/chakrashim/core/lib/Runtime/Library/SharedArrayBuffer.cpp index 69257118ee8..2b3ca88c8b2 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/SharedArrayBuffer.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/SharedArrayBuffer.cpp @@ -80,9 +80,8 @@ namespace Js AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); if (!(callInfo.Flags & CallFlags_New) || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) { @@ -177,9 +176,7 @@ namespace Js if (scriptContext->GetConfig()->IsES6SpeciesEnabled()) { - Var constructorVar = JavascriptOperators::SpeciesConstructor(currentBuffer, scriptContext->GetLibrary()->GetSharedArrayBufferConstructor(), scriptContext); - - JavascriptFunction* constructor = JavascriptFunction::FromVar(constructorVar); + RecyclableObject* constructor = JavascriptOperators::SpeciesConstructor(currentBuffer, scriptContext->GetLibrary()->GetSharedArrayBufferConstructor(), scriptContext); Js::Var constructorArgs[] = { constructor, JavascriptNumber::ToVar(newbyteLength, scriptContext) }; Js::CallInfo constructorCallInfo(Js::CallFlags_New, _countof(constructorArgs)); @@ -231,10 +228,17 @@ namespace Js } SharedArrayBuffer* SharedArrayBuffer::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "var must be an SharedArrayBuffer"); + + return static_cast(aValue); + } + + SharedArrayBuffer* SharedArrayBuffer::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "var must be an SharedArrayBuffer"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } bool SharedArrayBuffer::Is(Var aValue) diff --git a/deps/chakrashim/core/lib/Runtime/Library/SharedArrayBuffer.h b/deps/chakrashim/core/lib/Runtime/Library/SharedArrayBuffer.h index 70002a71098..6d0efd3d83f 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/SharedArrayBuffer.h +++ b/deps/chakrashim/core/lib/Runtime/Library/SharedArrayBuffer.h @@ -71,6 +71,7 @@ namespace Js static bool Is(Var aValue); static SharedArrayBuffer* FromVar(Var aValue); + static SharedArrayBuffer* UnsafeFromVar(Var aValue); virtual BOOL GetDiagTypeString(StringBuilder* stringBuilder, ScriptContext* requestContext) override; virtual BOOL GetDiagValueString(StringBuilder* stringBuilder, ScriptContext* requestContext) override; diff --git a/deps/chakrashim/core/lib/Runtime/Library/SimdBool16x8Lib.cpp b/deps/chakrashim/core/lib/Runtime/Library/SimdBool16x8Lib.cpp index 4ae88878728..0188c4f2480 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/SimdBool16x8Lib.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/SimdBool16x8Lib.cpp @@ -131,7 +131,7 @@ namespace Js JavascriptSIMDBool16x8 *a = JavascriptSIMDBool16x8::FromVar(args[1]); Assert(a); - bool result = SIMDBool32x4Operation::OpAllTrue(a->GetValue()); + bool result = SIMDBool32x4Operation::OpAllTrue(a->GetValue()); return JavascriptBoolean::ToVar(result, scriptContext); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/SimdBool8x16Lib.cpp b/deps/chakrashim/core/lib/Runtime/Library/SimdBool8x16Lib.cpp index c62d5493e8b..11ba2888b8e 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/SimdBool8x16Lib.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/SimdBool8x16Lib.cpp @@ -131,7 +131,7 @@ namespace Js JavascriptSIMDBool8x16 *a = JavascriptSIMDBool8x16::FromVar(args[1]); Assert(a); - bool result = SIMDBool32x4Operation::OpAllTrue(a->GetValue()); + bool result = SIMDBool32x4Operation::OpAllTrue(a->GetValue()); return JavascriptBoolean::ToVar(result, scriptContext); } diff --git a/deps/chakrashim/core/lib/Runtime/Library/SingleCharString.h b/deps/chakrashim/core/lib/Runtime/Library/SingleCharString.h index 2631bb318cf..9c651e99631 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/SingleCharString.h +++ b/deps/chakrashim/core/lib/Runtime/Library/SingleCharString.h @@ -18,11 +18,10 @@ namespace Js protected: DEFINE_VTABLE_CTOR(SingleCharString, JavascriptString); - DECLARE_CONCRETE_STRING_CLASS; private: SingleCharString(char16 ch, StaticType * type); - Field(char16) m_buff[2]; // the 2nd is always NULL so that GetSz works + Field(char16) m_buff[2] = { 0 }; // the 2nd is always NULL so that GetSz works }; } // namespace Js diff --git a/deps/chakrashim/core/lib/Runtime/Library/StackScriptFunction.cpp b/deps/chakrashim/core/lib/Runtime/Library/StackScriptFunction.cpp index 62ec430f457..510d7dfd1cc 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/StackScriptFunction.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/StackScriptFunction.cpp @@ -64,6 +64,14 @@ namespace Js StackScriptFunction * StackScriptFunction::FromVar(Var var) + { + AssertOrFailFast(ScriptFunction::Is(var)); + Assert(ThreadContext::IsOnStack(var)); + return static_cast(var); + } + + StackScriptFunction * + StackScriptFunction::UnsafeFromVar(Var var) { Assert(ScriptFunction::Is(var)); Assert(ThreadContext::IsOnStack(var)); @@ -349,13 +357,17 @@ namespace Js for (i = 0; i < frameDisplay->GetLength(); i++) { Var *slotArray = (Var*)frameDisplay->GetItem(i); - ScopeSlots slots(slotArray); - if (slots.IsFunctionScopeSlotArray()) + + if (ScopeSlots::Is(slotArray)) { - FunctionProxy *functionProxy = slots.GetFunctionInfo()->GetFunctionProxy(); - if (functionProxy->IsFunctionBody() && this->NeedBoxFrame(functionProxy->GetFunctionBody())) + ScopeSlots slots(slotArray); + if (!slots.IsDebuggerScopeSlotArray()) { - break; + FunctionProxy *functionProxy = slots.GetFunctionInfo()->GetFunctionProxy(); + if (functionProxy->IsFunctionBody() && this->NeedBoxFrame(functionProxy->GetFunctionBody())) + { + break; + } } } } diff --git a/deps/chakrashim/core/lib/Runtime/Library/StackScriptFunction.h b/deps/chakrashim/core/lib/Runtime/Library/StackScriptFunction.h index d781506e0a9..4a2b001ec1a 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/StackScriptFunction.h +++ b/deps/chakrashim/core/lib/Runtime/Library/StackScriptFunction.h @@ -42,6 +42,7 @@ namespace Js private: static ScriptFunction * Box(StackScriptFunction * stackScriptFunction, void * returnAddress); static StackScriptFunction * FromVar(Var var); + static StackScriptFunction * UnsafeFromVar(Var var); struct BoxState { public: diff --git a/deps/chakrashim/core/lib/Runtime/Library/StringCache.h b/deps/chakrashim/core/lib/Runtime/Library/StringCache.h index 2d5e4f7a999..20a26a85be9 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/StringCache.h +++ b/deps/chakrashim/core/lib/Runtime/Library/StringCache.h @@ -77,6 +77,8 @@ class StringCache SCACHE_INIT_DEFAULT(GetObjectNumberDisplayString), SCACHE_INIT_DEFAULT(GetObjectRegExpDisplayString), SCACHE_INIT_DEFAULT(GetObjectStringDisplayString), + SCACHE_INIT_DEFAULT(GetObjectNullDisplayString), + SCACHE_INIT_DEFAULT(GetObjectUndefinedDisplayString), SCACHE_INIT_DEFAULT(GetUndefinedDisplayString), SCACHE_INIT_DEFAULT(GetNaNDisplayString), SCACHE_INIT_DEFAULT(GetNullDisplayString), @@ -155,6 +157,8 @@ class StringCache DEFINE_CACHED_STRING(GetObjectNumberDisplayString, _u("[object Number]")) DEFINE_CACHED_STRING(GetObjectRegExpDisplayString, _u("[object RegExp]")) DEFINE_CACHED_STRING(GetObjectStringDisplayString, _u("[object String]")) + DEFINE_CACHED_STRING(GetObjectNullDisplayString, _u("[object Null]")) + DEFINE_CACHED_STRING(GetObjectUndefinedDisplayString, _u("[object Undefined]")) DEFINE_CACHED_STRING(GetUndefinedDisplayString, _u("undefined")) DEFINE_CACHED_STRING(GetNaNDisplayString, _u("NaN")) DEFINE_CACHED_STRING(GetNullDisplayString, _u("null")) diff --git a/deps/chakrashim/core/lib/Runtime/Library/SubString.h b/deps/chakrashim/core/lib/Runtime/Library/SubString.h index 9fa1020365a..1afdbe88364 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/SubString.h +++ b/deps/chakrashim/core/lib/Runtime/Library/SubString.h @@ -14,7 +14,6 @@ namespace Js protected: DEFINE_VTABLE_CTOR(SubString, JavascriptString); - DECLARE_CONCRETE_STRING_CLASS; public: static JavascriptString* New(JavascriptString* string, charcount_t start, charcount_t length); diff --git a/deps/chakrashim/core/lib/Runtime/Library/ThrowErrorObject.cpp b/deps/chakrashim/core/lib/Runtime/Library/ThrowErrorObject.cpp index f71bb353162..4b23b94803f 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ThrowErrorObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/ThrowErrorObject.cpp @@ -3,7 +3,9 @@ // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "RuntimeLibraryPch.h" +#ifdef ENABLE_SCRIPT_DEBUGGING #include "Debug/DiagHelperMethodWrapper.h" +#endif #include "Library/ThrowErrorObject.h" namespace Js @@ -17,6 +19,7 @@ namespace Js ThrowErrorObject* throwErrorObject = ThrowErrorObject::FromVar(function); +#ifdef ENABLE_SCRIPT_DEBUGGING bool useExceptionWrapper = scriptContext->IsScriptContextInDebugMode() /* Check for script context is intentional as library code also uses exception wrapper */ && (ScriptContext::IsExceptionWrapperForBuiltInsEnabled(scriptContext) || ScriptContext::IsExceptionWrapperForHelpersEnabled(scriptContext)) && @@ -33,6 +36,7 @@ namespace Js return ret; } else +#endif { JavascriptExceptionOperators::Throw(throwErrorObject->m_error, scriptContext); } @@ -54,9 +58,15 @@ namespace Js } ThrowErrorObject* ThrowErrorObject::FromVar(Var aValue) + { + AssertOrFailFast(Is(aValue)); + return static_cast(aValue); + } + + ThrowErrorObject* ThrowErrorObject::UnsafeFromVar(Var aValue) { Assert(Is(aValue)); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } RecyclableObject* ThrowErrorObject::CreateThrowErrorObject(CreateErrorFunc createError, ScriptContext* scriptContext, int32 hCode, PCWSTR varName) diff --git a/deps/chakrashim/core/lib/Runtime/Library/ThrowErrorObject.h b/deps/chakrashim/core/lib/Runtime/Library/ThrowErrorObject.h index ccf5d1ba059..3b9cdc41ec0 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/ThrowErrorObject.h +++ b/deps/chakrashim/core/lib/Runtime/Library/ThrowErrorObject.h @@ -24,6 +24,7 @@ namespace Js static ThrowErrorObject* New(StaticType* type, JavascriptError* error, Recycler* recycler); static bool Is(Var aValue); static ThrowErrorObject* FromVar(Var aValue); + static ThrowErrorObject* UnsafeFromVar(Var aValue); static RecyclableObject* CreateThrowTypeErrorObject(ScriptContext* scriptContext, int32 hCode, PCWSTR varName); static RecyclableObject* CreateThrowTypeErrorObject(ScriptContext* scriptContext, int32 hCode, JavascriptString* varName); diff --git a/deps/chakrashim/core/lib/Runtime/Library/TypedArray.cpp b/deps/chakrashim/core/lib/Runtime/Library/TypedArray.cpp index 32f866c1778..014bea09b4e 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/TypedArray.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/TypedArray.cpp @@ -201,134 +201,267 @@ namespace Js template TypedArray* TypedArray::FromVar(Var aValue) { - AssertMsg(TypedArray::Is(aValue), "invalid TypedArray"); - return static_cast*>(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(TypedArray::Is(aValue), "invalid TypedArray"); + return static_cast*>(aValue); } template<> Uint8ClampedArray* Uint8ClampedArray::FromVar(Var aValue) { - AssertMsg(Uint8ClampedArray::Is(aValue), "invalid Uint8ClampedArray"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint8ClampedArray::Is(aValue), "invalid Uint8ClampedArray"); + return static_cast(aValue); } template<> Uint8Array* Uint8Array::FromVar(Var aValue) { - AssertMsg(Uint8Array::Is(aValue), "invalid Uint8Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint8Array::Is(aValue), "invalid Uint8Array"); + return static_cast(aValue); } template<> Int8Array* Int8Array::FromVar(Var aValue) { - AssertMsg(Int8Array::Is(aValue), "invalid Int8Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Int8Array::Is(aValue), "invalid Int8Array"); + return static_cast(aValue); } template<> Int16Array* Int16Array::FromVar(Var aValue) { - AssertMsg(Int16Array::Is(aValue), "invalid Int16Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Int16Array::Is(aValue), "invalid Int16Array"); + return static_cast(aValue); } template<> Uint16Array* Uint16Array::FromVar(Var aValue) { - AssertMsg(Uint16Array::Is(aValue), "invalid Uint16Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint16Array::Is(aValue), "invalid Uint16Array"); + return static_cast(aValue); } template<> Int32Array* Int32Array::FromVar(Var aValue) { - AssertMsg(Int32Array::Is(aValue), "invalid Int32Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Int32Array::Is(aValue), "invalid Int32Array"); + return static_cast(aValue); } template<> Uint32Array* Uint32Array::FromVar(Var aValue) { - AssertMsg(Uint32Array::Is(aValue), "invalid Uint32Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint32Array::Is(aValue), "invalid Uint32Array"); + return static_cast(aValue); } template<> Float32Array* Float32Array::FromVar(Var aValue) { - AssertMsg(Float32Array::Is(aValue), "invalid Float32Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Float32Array::Is(aValue), "invalid Float32Array"); + return static_cast(aValue); } template<> Float64Array* Float64Array::FromVar(Var aValue) { - AssertMsg(Float64Array::Is(aValue), "invalid Float64Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Float64Array::Is(aValue), "invalid Float64Array"); + return static_cast(aValue); } template<> Int64Array* Int64Array::FromVar(Var aValue) { - AssertMsg(Int64Array::Is(aValue), "invalid Int64Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Int64Array::Is(aValue), "invalid Int64Array"); + return static_cast(aValue); } template<> Uint64Array* Uint64Array::FromVar(Var aValue) { - AssertMsg(Uint64Array::Is(aValue), "invalid Uint64Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint64Array::Is(aValue), "invalid Uint64Array"); + return static_cast(aValue); } template<> Int8VirtualArray* Int8VirtualArray::FromVar(Var aValue) { - AssertMsg(Int8VirtualArray::Is(aValue), "invalid Int8Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Int8VirtualArray::Is(aValue), "invalid Int8Array"); + return static_cast(aValue); } template<> Uint8ClampedVirtualArray* Uint8ClampedVirtualArray::FromVar(Var aValue) { - AssertMsg(Uint8ClampedVirtualArray::Is(aValue), "invalid Uint8ClampedArray"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint8ClampedVirtualArray::Is(aValue), "invalid Uint8ClampedArray"); + return static_cast(aValue); } template<> Uint8VirtualArray* Uint8VirtualArray::FromVar(Var aValue) { - AssertMsg(Uint8VirtualArray::Is(aValue), "invalid Uint8Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint8VirtualArray::Is(aValue), "invalid Uint8Array"); + return static_cast(aValue); } template<> Int16VirtualArray* Int16VirtualArray::FromVar(Var aValue) { - AssertMsg(Int16VirtualArray::Is(aValue), "invalid Int16Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Int16VirtualArray::Is(aValue), "invalid Int16Array"); + return static_cast(aValue); } template<> Uint16VirtualArray* Uint16VirtualArray::FromVar(Var aValue) { - AssertMsg(Uint16VirtualArray::Is(aValue), "invalid Uint16Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint16VirtualArray::Is(aValue), "invalid Uint16Array"); + return static_cast(aValue); } template<> Int32VirtualArray* Int32VirtualArray::FromVar(Var aValue) { - AssertMsg(Int32VirtualArray::Is(aValue), "invalid Int32Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Int32VirtualArray::Is(aValue), "invalid Int32Array"); + return static_cast(aValue); } template<> Uint32VirtualArray* Uint32VirtualArray::FromVar(Var aValue) { - AssertMsg(Uint32VirtualArray::Is(aValue), "invalid Uint32Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Uint32VirtualArray::Is(aValue), "invalid Uint32Array"); + return static_cast(aValue); } template<> Float32VirtualArray* Float32VirtualArray::FromVar(Var aValue) { - AssertMsg(Float32VirtualArray::Is(aValue), "invalid Float32Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Float32VirtualArray::Is(aValue), "invalid Float32Array"); + return static_cast(aValue); } template<> Float64VirtualArray* Float64VirtualArray::FromVar(Var aValue) { - AssertMsg(Float64VirtualArray::Is(aValue), "invalid Float64Array"); - return static_cast(RecyclableObject::FromVar(aValue)); + AssertOrFailFastMsg(Float64VirtualArray::Is(aValue), "invalid Float64Array"); + return static_cast(aValue); } template<> BoolArray* BoolArray::FromVar(Var aValue) + { + AssertOrFailFastMsg(BoolArray::Is(aValue), "invalid BoolArray"); + return static_cast(aValue); + } + + template + TypedArray* TypedArray::UnsafeFromVar(Var aValue) + { + AssertMsg(TypedArray::Is(aValue), "invalid TypedArray"); + return static_cast*>(aValue); + } + + template<> Uint8ClampedArray* Uint8ClampedArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint8ClampedArray::Is(aValue), "invalid Uint8ClampedArray"); + return static_cast(aValue); + } + + template<> Uint8Array* Uint8Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint8Array::Is(aValue), "invalid Uint8Array"); + return static_cast(aValue); + } + + template<> Int8Array* Int8Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Int8Array::Is(aValue), "invalid Int8Array"); + return static_cast(aValue); + } + + template<> Int16Array* Int16Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Int16Array::Is(aValue), "invalid Int16Array"); + return static_cast(aValue); + } + + template<> Uint16Array* Uint16Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint16Array::Is(aValue), "invalid Uint16Array"); + return static_cast(aValue); + } + + template<> Int32Array* Int32Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Int32Array::Is(aValue), "invalid Int32Array"); + return static_cast(aValue); + } + + template<> Uint32Array* Uint32Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint32Array::Is(aValue), "invalid Uint32Array"); + return static_cast(aValue); + } + + template<> Float32Array* Float32Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Float32Array::Is(aValue), "invalid Float32Array"); + return static_cast(aValue); + } + + template<> Float64Array* Float64Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Float64Array::Is(aValue), "invalid Float64Array"); + return static_cast(aValue); + } + + template<> Int64Array* Int64Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Int64Array::Is(aValue), "invalid Int64Array"); + return static_cast(aValue); + } + + template<> Uint64Array* Uint64Array::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint64Array::Is(aValue), "invalid Uint64Array"); + return static_cast(aValue); + } + + template<> Int8VirtualArray* Int8VirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Int8VirtualArray::Is(aValue), "invalid Int8Array"); + return static_cast(aValue); + } + + template<> Uint8ClampedVirtualArray* Uint8ClampedVirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint8ClampedVirtualArray::Is(aValue), "invalid Uint8ClampedArray"); + return static_cast(aValue); + } + + template<> Uint8VirtualArray* Uint8VirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint8VirtualArray::Is(aValue), "invalid Uint8Array"); + return static_cast(aValue); + } + + template<> Int16VirtualArray* Int16VirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Int16VirtualArray::Is(aValue), "invalid Int16Array"); + return static_cast(aValue); + } + + template<> Uint16VirtualArray* Uint16VirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint16VirtualArray::Is(aValue), "invalid Uint16Array"); + return static_cast(aValue); + } + + template<> Int32VirtualArray* Int32VirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Int32VirtualArray::Is(aValue), "invalid Int32Array"); + return static_cast(aValue); + } + + template<> Uint32VirtualArray* Uint32VirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Uint32VirtualArray::Is(aValue), "invalid Uint32Array"); + return static_cast(aValue); + } + + template<> Float32VirtualArray* Float32VirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Float32VirtualArray::Is(aValue), "invalid Float32Array"); + return static_cast(aValue); + } + + template<> Float64VirtualArray* Float64VirtualArray::UnsafeFromVar(Var aValue) + { + AssertMsg(Float64VirtualArray::Is(aValue), "invalid Float64Array"); + return static_cast(aValue); + } + + template<> BoolArray* BoolArray::UnsafeFromVar(Var aValue) { AssertMsg(BoolArray::Is(aValue), "invalid BoolArray"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } TypedArrayBase::TypedArrayBase(ArrayBufferBase* arrayBuffer, uint32 offSet, uint mappedLength, uint elementSize, DynamicType* type) : @@ -567,9 +700,7 @@ namespace Js AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); JavascriptError::ThrowTypeError(scriptContext, JSERR_InvalidTypedArray_Constructor); } @@ -584,8 +715,8 @@ namespace Js AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && RecyclableObject::Is(newTarget); + Var newTarget = args.GetNewTarget(); + bool isCtorSuperCall = JavascriptOperators::IsConstructorSuperCall(args); Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); if (!(callInfo.Flags & CallFlags_New) || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) @@ -979,6 +1110,12 @@ namespace Js } TypedArrayBase* TypedArrayBase::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "must be a typed array"); + return static_cast(aValue); + } + + TypedArrayBase* TypedArrayBase::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "must be a typed array"); return static_cast(aValue); @@ -1010,11 +1147,13 @@ namespace Js // types of the same size are compatible, with the following exceptions: // - we cannot memmove between float and int arrays, due to different bit pattern // - we cannot memmove to a uint8 clamped array from an int8 array, due to negatives rounding to 0 - if (GetTypeId() == source->GetTypeId() - || (GetBytesPerElement() == source->GetBytesPerElement() - && !(Uint8ClampedArray::Is(this) && Int8Array::Is(source)) - && !Float32Array::Is(this) && !Float32Array::Is(source) - && !Float64Array::Is(this) && !Float64Array::Is(source))) + if (GetTypeId() == source->GetTypeId() || + (GetBytesPerElement() == source->GetBytesPerElement() + && !((Uint8ClampedArray::Is(this) || Uint8ClampedVirtualArray::Is(this)) && (Int8Array::Is(source) || Int8VirtualArray::Is(source))) + && !Float32Array::Is(this) && !Float32Array::Is(source) + && !Float32VirtualArray::Is(this) && !Float32VirtualArray::Is(source) + && !Float64Array::Is(this) && !Float64Array::Is(source) + && !Float64VirtualArray::Is(this) && !Float64VirtualArray::Is(source))) { const size_t offsetInBytes = offset * BYTES_PER_ELEMENT; memmove_s(buffer + offsetInBytes, @@ -1163,7 +1302,7 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedTypedArray); } - TypedArrayBase* typedArray = TypedArrayBase::FromVar(args[0]); + TypedArrayBase* typedArray = TypedArrayBase::UnsafeFromVar(args[0]); ArrayBufferBase* arrayBuffer = typedArray->GetArrayBuffer(); if (arrayBuffer == nullptr) @@ -1188,7 +1327,7 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedTypedArray); } - TypedArrayBase* typedArray = TypedArrayBase::FromVar(args[0]); + TypedArrayBase* typedArray = TypedArrayBase::UnsafeFromVar(args[0]); ArrayBufferBase* arrayBuffer = typedArray->GetArrayBuffer(); if (arrayBuffer == nullptr) @@ -1217,7 +1356,7 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedTypedArray); } - TypedArrayBase* typedArray = TypedArrayBase::FromVar(args[0]); + TypedArrayBase* typedArray = TypedArrayBase::UnsafeFromVar(args[0]); ArrayBufferBase* arrayBuffer = typedArray->GetArrayBuffer(); if (arrayBuffer == nullptr) @@ -1246,7 +1385,7 @@ namespace Js JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedTypedArray); } - TypedArrayBase* typedArray = TypedArrayBase::FromVar(args[0]); + TypedArrayBase* typedArray = TypedArrayBase::UnsafeFromVar(args[0]); ArrayBufferBase* arrayBuffer = typedArray->GetArrayBuffer(); if (arrayBuffer == nullptr) @@ -1397,9 +1536,9 @@ namespace Js offset = ArrayBuffer::ToIndex(args[2], JSERR_InvalidTypedArrayLength, scriptContext, ArrayBuffer::MaxArrayBufferLength, false); } - if (TypedArrayBase::Is(args[1])) + TypedArrayBase* typedArraySource = JavascriptOperators::TryFromVar(args[1]); + if (typedArraySource) { - TypedArrayBase* typedArraySource = TypedArrayBase::FromVar(args[1]); if (typedArraySource->IsDetachedBuffer() || typedArrayBase->IsDetachedBuffer()) // If IsDetachedBuffer(targetBuffer) is true, then throw a TypeError exception. { JavascriptError::ThrowTypeError(scriptContext, JSERR_DetachedTypedArray, _u("[TypedArray].prototype.set")); @@ -1489,8 +1628,7 @@ namespace Js if (scriptContext->GetConfig()->IsES6SpeciesEnabled()) { - JavascriptFunction* constructor = - JavascriptFunction::FromVar(JavascriptOperators::SpeciesConstructor(this, TypedArrayBase::GetDefaultConstructor(this, scriptContext), scriptContext)); + RecyclableObject* constructor = JavascriptOperators::SpeciesConstructor(this, TypedArrayBase::GetDefaultConstructor(this, scriptContext), scriptContext); Js::Var constructorArgs[] = { constructor, buffer, JavascriptNumber::ToVar(beginByteOffset, scriptContext), JavascriptNumber::ToVar(newLength, scriptContext) }; Js::CallInfo constructorCallInfo(Js::CallFlags_New, _countof(constructorArgs)); @@ -1582,16 +1720,12 @@ namespace Js Js::CallInfo constructorCallInfo(Js::CallFlags_New, _countof(constructorArgs)); newObj = TypedArrayBase::TypedArrayCreate(constructor, &Js::Arguments(constructorCallInfo, constructorArgs), len, scriptContext); - TypedArrayBase* newTypedArrayBase = nullptr; + TypedArrayBase* newTypedArrayBase = JavascriptOperators::TryFromVar(newObj); JavascriptArray* newArr = nullptr; - if (TypedArrayBase::Is(newObj)) - { - newTypedArrayBase = TypedArrayBase::FromVar(newObj); - } - else if (JavascriptArray::Is(newObj)) + if (!newTypedArrayBase) { - newArr = JavascriptArray::FromVar(newObj); + newArr = JavascriptOperators::TryFromVar(newObj); } for (uint32 k = 0; k < len; k++) @@ -1603,9 +1737,8 @@ namespace Js Assert(mapFn != nullptr); Assert(mapFnThisArg != nullptr); - Js::Var mapFnArgs[] = { mapFnThisArg, kValue, JavascriptNumber::ToVar(k, scriptContext) }; - Js::CallInfo mapFnCallInfo(Js::CallFlags_Value, _countof(mapFnArgs)); - kValue = mapFn->CallFunction(Js::Arguments(mapFnCallInfo, mapFnArgs)); + Var kVar = JavascriptNumber::ToVar(k, scriptContext); + kValue = CALL_FUNCTION(scriptContext->GetThreadContext(), mapFn, CallInfo(CallFlags_Value, 3), mapFnThisArg, kValue, kVar); } // We're likely to have constructed a new TypedArray, but the constructor could return any object @@ -1630,32 +1763,24 @@ namespace Js Var lenValue = JavascriptOperators::OP_GetLength(items, scriptContext); uint32 len = JavascriptConversion::ToUInt32(lenValue, scriptContext); - TypedArrayBase* itemsTypedArrayBase = nullptr; + TypedArrayBase* itemsTypedArrayBase = JavascriptOperators::TryFromVar(items); JavascriptArray* itemsArray = nullptr; - if (TypedArrayBase::Is(items)) - { - itemsTypedArrayBase = TypedArrayBase::FromVar(items); - } - else if (JavascriptArray::Is(items)) + if (!itemsTypedArrayBase) { - itemsArray = JavascriptArray::FromVar(items); + itemsArray = JavascriptOperators::TryFromVar(items); } Js::Var constructorArgs[] = { constructor, JavascriptNumber::ToVar(len, scriptContext) }; Js::CallInfo constructorCallInfo(Js::CallFlags_New, _countof(constructorArgs)); newObj = TypedArrayBase::TypedArrayCreate(constructor, &Js::Arguments(constructorCallInfo, constructorArgs), len, scriptContext); - TypedArrayBase* newTypedArrayBase = nullptr; + TypedArrayBase* newTypedArrayBase = JavascriptOperators::TryFromVar(newObj); JavascriptArray* newArr = nullptr; - if (TypedArrayBase::Is(newObj)) - { - newTypedArrayBase = TypedArrayBase::FromVar(newObj); - } - else if (JavascriptArray::Is(newObj)) + if (!newTypedArrayBase) { - newArr = JavascriptArray::FromVar(newObj); + newArr = JavascriptOperators::TryFromVar(newObj); } for (uint32 k = 0; k < len; k++) @@ -1681,9 +1806,8 @@ namespace Js Assert(mapFn != nullptr); Assert(mapFnThisArg != nullptr); - Js::Var mapFnArgs[] = { mapFnThisArg, kValue, JavascriptNumber::ToVar(k, scriptContext) }; - Js::CallInfo mapFnCallInfo(Js::CallFlags_Value, _countof(mapFnArgs)); - kValue = mapFn->CallFunction(Js::Arguments(mapFnCallInfo, mapFnArgs)); + Var kVar = JavascriptNumber::ToVar(k, scriptContext); + kValue = CALL_FUNCTION(scriptContext->GetThreadContext(), mapFn, CallInfo(CallFlags_Value, 3), mapFnThisArg, kValue, kVar); } // If constructor built a TypedArray (likely) or Array (maybe likely) we can do a more direct set operation @@ -1742,6 +1866,26 @@ namespace Js Var TypedArrayBase::GetKeysEntriesValuesHelper(Arguments& args, ScriptContext *scriptContext, LPCWSTR apiName, JavascriptArrayIteratorKind kind) { TypedArrayBase* typedArrayBase = ValidateTypedArray(args, scriptContext, apiName); +#ifdef ENABLE_JS_BUILTINS + JavascriptLibrary * library = scriptContext->GetLibrary(); + if (scriptContext->IsJsBuiltInEnabled()) + { + JavascriptString* methodName = JavascriptString::NewWithSz(_u("CreateArrayIterator"), scriptContext); + PropertyIds functionIdentifier = JavascriptOperators::GetPropertyId(methodName, scriptContext); + Var scriptFunction = JavascriptOperators::OP_GetProperty(library->GetChakraLib(), functionIdentifier, scriptContext); + + Assert(!JavascriptOperators::IsUndefinedOrNull(scriptFunction)); + Assert(JavascriptConversion::IsCallable(scriptFunction)); + + RecyclableObject* function = RecyclableObject::FromVar(scriptFunction); + + Var chakraLibObj = JavascriptOperators::OP_GetProperty(library->GetGlobalObject(), PropertyIds::__chakraLibrary, scriptContext); + Var argsIt[] = { chakraLibObj, args[0], TaggedInt::ToVarUnchecked((int)kind) }; + CallInfo callInfo(CallFlags_Value, 3); + return JavascriptFunction::CallFunction(function, function->GetEntryPoint(), Js::Arguments(callInfo, argsIt)); + } + else +#endif return scriptContext->GetLibrary()->CreateArrayIterator(typedArrayBase, kind); } @@ -1855,17 +1999,17 @@ namespace Js uint32 captured = tempList->Count(); - Var constructor = JavascriptOperators::SpeciesConstructor( + RecyclableObject* constructor = JavascriptOperators::SpeciesConstructor( typedArrayBase, TypedArrayBase::GetDefaultConstructor(args[0], scriptContext), scriptContext); Js::Var constructorArgs[] = { constructor, JavascriptNumber::ToVar(captured, scriptContext) }; Js::CallInfo constructorCallInfo(Js::CallFlags_New, _countof(constructorArgs)); newObj = RecyclableObject::FromVar(TypedArrayBase::TypedArrayCreate(constructor, &Js::Arguments(constructorCallInfo, constructorArgs), captured, scriptContext)); - if (TypedArrayBase::Is(newObj)) + TypedArrayBase* newArr = JavascriptOperators::TryFromVar(newObj); + if (newArr) { // We are much more likely to have a TypedArray here than anything else - TypedArrayBase* newArr = TypedArrayBase::FromVar(newObj); for (uint32 i = 0; i < captured; i++) { @@ -2537,43 +2681,32 @@ namespace Js } // static - Var TypedArrayBase::GetDefaultConstructor(Var object, ScriptContext* scriptContext) + JavascriptFunction* TypedArrayBase::GetDefaultConstructor(Var object, ScriptContext* scriptContext) { - TypeId typeId = JavascriptOperators::GetTypeId(object); - Var defaultConstructor = nullptr; - switch (typeId) + switch (JavascriptOperators::GetTypeId(object)) { case TypeId::TypeIds_Int8Array: - defaultConstructor = scriptContext->GetLibrary()->GetInt8ArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetInt8ArrayConstructor(); case TypeId::TypeIds_Uint8Array: - defaultConstructor = scriptContext->GetLibrary()->GetUint8ArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetUint8ArrayConstructor(); case TypeId::TypeIds_Uint8ClampedArray: - defaultConstructor = scriptContext->GetLibrary()->GetUint8ClampedArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetUint8ClampedArrayConstructor(); case TypeId::TypeIds_Int16Array: - defaultConstructor = scriptContext->GetLibrary()->GetInt16ArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetInt16ArrayConstructor(); case TypeId::TypeIds_Uint16Array: - defaultConstructor = scriptContext->GetLibrary()->GetUint16ArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetUint16ArrayConstructor(); case TypeId::TypeIds_Int32Array: - defaultConstructor = scriptContext->GetLibrary()->GetInt32ArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetInt32ArrayConstructor(); case TypeId::TypeIds_Uint32Array: - defaultConstructor = scriptContext->GetLibrary()->GetUint32ArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetUint32ArrayConstructor(); case TypeId::TypeIds_Float32Array: - defaultConstructor = scriptContext->GetLibrary()->GetFloat32ArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetFloat32ArrayConstructor(); case TypeId::TypeIds_Float64Array: - defaultConstructor = scriptContext->GetLibrary()->GetFloat64ArrayConstructor(); - break; + return scriptContext->GetLibrary()->GetFloat64ArrayConstructor(); default: - Assert(false); + Assert(UNREACHED); + return nullptr; } - return defaultConstructor; } Var TypedArrayBase::FindMinOrMax(Js::ScriptContext * scriptContext, TypeId typeId, bool findMax) @@ -2655,13 +2788,12 @@ namespace Js // static TypedArrayBase* TypedArrayBase::ValidateTypedArray(Var aValue, ScriptContext *scriptContext, LPCWSTR apiName) { - if (!TypedArrayBase::Is(aValue)) + TypedArrayBase *typedArrayBase = JavascriptOperators::TryFromVar(aValue); + if (!typedArrayBase) { JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedTypedArray); } - TypedArrayBase *typedArrayBase = TypedArrayBase::FromVar(aValue); - if (typedArrayBase->IsDetachedBuffer()) { JavascriptError::ThrowTypeError(scriptContext, JSERR_DetachedTypedArray, apiName); @@ -2675,10 +2807,10 @@ namespace Js { Var newObj = JavascriptOperators::NewScObject(constructor, *args, scriptContext); - TypedArrayBase::ValidateTypedArray(newObj, scriptContext, nullptr); + TypedArrayBase * typedArray = TypedArrayBase::ValidateTypedArray(newObj, scriptContext, nullptr); // ECMA262 22.2.4.6 TypedArrayCreate line 3. "If argumentList is a List of a single Number" (args[0] == constructor) - if (args->Info.Count == 2 && TypedArrayBase::FromVar(newObj)->GetLength() < length) + if (args->Info.Count == 2 && typedArray->GetLength() < length) { JavascriptError::ThrowTypeError(scriptContext, JSERR_InvalidTypedArrayLength); } @@ -3501,9 +3633,15 @@ namespace Js } inline CharArray* CharArray::FromVar(Var aValue) + { + AssertOrFailFastMsg(CharArray::Is(aValue), "invalid CharArray"); + return static_cast(aValue); + } + + inline CharArray* CharArray::UnsafeFromVar(Var aValue) { AssertMsg(CharArray::Is(aValue), "invalid CharArray"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } inline BOOL CharArray::DirectSetItem(__in uint32 index, __in Js::Var value) diff --git a/deps/chakrashim/core/lib/Runtime/Library/TypedArray.h b/deps/chakrashim/core/lib/Runtime/Library/TypedArray.h index 16ddc641870..b79770c23ba 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/TypedArray.h +++ b/deps/chakrashim/core/lib/Runtime/Library/TypedArray.h @@ -21,7 +21,7 @@ namespace Js DEFINE_VTABLE_CTOR_ABSTRACT(TypedArrayBase, ArrayBufferParent); public: - static Var GetDefaultConstructor(Var object, ScriptContext* scriptContext); + static JavascriptFunction* GetDefaultConstructor(Var object, ScriptContext* scriptContext); class EntryInfo { @@ -133,6 +133,7 @@ namespace Js static BOOL Is(Var aValue); static BOOL Is(TypeId typeId); static TypedArrayBase* FromVar(Var aValue); + static TypedArrayBase* UnsafeFromVar(Var aValue); // Returns false if this is not a TypedArray or it's not detached static BOOL IsDetachedTypedArray(Var aValue); static HRESULT GetBuffer(Var aValue, ArrayBuffer** outBuffer, uint32* outOffset, uint32* outLength); @@ -263,6 +264,7 @@ namespace Js static BOOL Is(Var aValue); static TypedArray* FromVar(Var aValue); + static TypedArray* UnsafeFromVar(Var aValue); inline Var BaseTypedDirectGetItem(__in uint32 index) { @@ -540,6 +542,7 @@ namespace Js Var Subarray(uint32 begin, uint32 end); static CharArray* FromVar(Var aValue); + static CharArray* UnsafeFromVar(Var aValue); virtual BOOL DirectSetItem(__in uint32 index, __in Js::Var value) override; virtual BOOL DirectSetItemNoSet(__in uint32 index, __in Js::Var value) override; diff --git a/deps/chakrashim/core/lib/Runtime/Library/UriHelper.cpp b/deps/chakrashim/core/lib/Runtime/Library/UriHelper.cpp index 53811109696..8e33d9236c5 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/UriHelper.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/UriHelper.cpp @@ -9,8 +9,8 @@ namespace Js Var UriHelper::EncodeCoreURI(ScriptContext* scriptContext, Arguments& args, unsigned char flags ) { AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var result = nullptr; - ENTER_PINNED_SCOPE(JavascriptString, strURI); + + JavascriptString * strURI; //TODO make sure this string is pinned when the memory recycler is in if(args.Info.Count < 2) { @@ -29,10 +29,7 @@ namespace Js } } - result = Encode(strURI->GetSz(), strURI->GetLength(), flags, scriptContext); - - LEAVE_PINNED_SCOPE(); //strURI - return result; + return Encode(strURI->GetSz(), strURI->GetLength(), flags, scriptContext); } unsigned char UriHelper::s_uriProps[128] = @@ -181,6 +178,7 @@ namespace Js uint32 allocSize = UInt32Math::Add(outputLen, 1); char16* outURI = RecyclerNewArrayLeaf(scriptContext->GetRecycler(), char16, allocSize); char16* outCurrent = outURI; + const char16 *hexStream = _u("0123456789ABCDEF"); for( uint32 k = 0; k < len; k++ ) { @@ -227,9 +225,11 @@ namespace Js uint32 utfLen = ToUTF8(uVal, bUTF8); for( uint32 j = 0; j < utfLen; j++ ) { -#pragma prefast(suppress: 26014, "buffer length was calculated earlier"); - swprintf_s(outCurrent, 4, _u("%%%02X"), (int)bUTF8[j] ); - outCurrent +=3; +#pragma prefast(disable: 26014, "buffer length was calculated earlier"); + BYTE val = bUTF8[j]; + *outCurrent++ = _u('%'); + *outCurrent++ = hexStream[(val >> 4)]; + *outCurrent++ = hexStream[(val & 0xF)]; #pragma prefast(default: 26014); } } @@ -245,8 +245,7 @@ namespace Js { AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var result = nullptr; - ENTER_PINNED_SCOPE(JavascriptString, strURI); + JavascriptString * strURI; //TODO make sure this string is pinned when the memory recycler is in if(args.Info.Count < 2) @@ -266,11 +265,7 @@ namespace Js } } - result = Decode(strURI->GetSz(), strURI->GetLength(), reservedFlags, scriptContext); - - LEAVE_PINNED_SCOPE(); // strURI - - return result; + return Decode(strURI->GetSz(), strURI->GetLength(), reservedFlags, scriptContext); } // The Decode algorithm described in sec. 15.1.3 of the spec. The input string is diff --git a/deps/chakrashim/core/lib/Runtime/Library/VerifyMarkFalseReference.cpp b/deps/chakrashim/core/lib/Runtime/Library/VerifyMarkFalseReference.cpp index 03c9604c78a..d935138f2d8 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/VerifyMarkFalseReference.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/VerifyMarkFalseReference.cpp @@ -56,6 +56,20 @@ bool IsLikelyRuntimeFalseReference(char* objectStartAddress, size_t offset, } } + // On x86 some int32/uint32 fields may look like GC pointers +#if TARGET_32 + if (strstr(typeName, "Js::TypedArray<") && offset == Js::Int8Array::GetOffsetOfLength()) + { + return true; + } + + if (strstr(typeName, "Js::ScriptContextPolymorphicInlineCache") + && offset == offsetof(Js::ScriptContextPolymorphicInlineCache, inlineCachesFillInfo)) + { + return true; + } +#endif + return false; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/WabtInterface.cpp b/deps/chakrashim/core/lib/Runtime/Library/WabtInterface.cpp index fea7cee45a6..c11514deeaf 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WabtInterface.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/WabtInterface.cpp @@ -101,12 +101,6 @@ Js::Var CreateBuffer(const uint8* buf, uint size, void* user_data) return arrayBuffer; } -void* Allocate(uint size, void* user_data) -{ - Context* ctx = (Context*)user_data; - return (void*)AnewArrayZ(ctx->allocator, byte, size); -}; - Js::Var WabtInterface::EntryConvertWast2Wasm(RecyclableObject* function, CallInfo callInfo, ...) { ScriptContext* scriptContext = function->GetScriptContext(); @@ -154,10 +148,10 @@ Js::Var WabtInterface::EntryConvertWast2Wasm(RecyclableObject* function, CallInf try { ChakraWabt::SpecContext spec; - ChakraWabt::Context wabtCtx; + ChakraWabt::ChakraContext wabtCtx; wabtCtx.user_data = &context; - wabtCtx.allocator = Allocate; wabtCtx.createBuffer = CreateBuffer; + wabtCtx.features.sign_extends = CONFIG_FLAG(WasmSignExtends); if (isSpecText) { wabtCtx.spec = &spec; diff --git a/deps/chakrashim/core/lib/Runtime/Library/WasmLibrary.cpp b/deps/chakrashim/core/lib/Runtime/Library/WasmLibrary.cpp index 92d988d35cb..01e769d56f9 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WasmLibrary.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/WasmLibrary.cpp @@ -14,7 +14,7 @@ namespace Js Var WasmLibrary::WasmLazyTrapCallback(RecyclableObject *callee, CallInfo, ...) { - AsmJsScriptFunction* asmFunction = static_cast(callee); + WasmScriptFunction* asmFunction = static_cast(callee); Assert(asmFunction); ScriptContext * scriptContext = asmFunction->GetScriptContext(); Assert(scriptContext); @@ -24,7 +24,7 @@ namespace Js void WasmLibrary::SetWasmEntryPointToInterpreter(Js::ScriptFunction* func, bool deferParse) { - Assert(AsmJsScriptFunction::Is(func)); + Assert(WasmScriptFunction::Is(func)); FunctionEntryPointInfo* entrypointInfo = (FunctionEntryPointInfo*)func->GetEntryPointInfo(); entrypointInfo->SetIsAsmJSFunction(true); @@ -42,16 +42,12 @@ namespace Js #if _M_IX86 __declspec(naked) - Var WasmLibrary::WasmDeferredParseExternalThunk(RecyclableObject* function, CallInfo callInfo, ...) + Var WasmLibrary::WasmDeferredParseExternalThunk(RecyclableObject* function, CallInfo callInfo, ...) { - // Register functions __asm { - push ebp - mov ebp, esp - lea eax, [esp + 8] - push 0 - push eax + push 0; + push [esp + 8]; call WasmLibrary::WasmDeferredParseEntryPoint #ifdef _CONTROL_FLOW_GUARD // verify that the call target is valid @@ -59,22 +55,18 @@ namespace Js call[__guard_check_icall_fptr] mov eax, ecx #endif - pop ebp // Although we don't restore ESP here on WinCE, this is fine because script profiler is not shipped for WinCE. jmp eax } } - __declspec(naked) Var WasmLibrary::WasmDeferredParseInternalThunk(RecyclableObject* function, CallInfo callInfo, ...) + __declspec(naked) + Var WasmLibrary::WasmDeferredParseInternalThunk(RecyclableObject* function, CallInfo callInfo, ...) { - // Register functions __asm { - push ebp - mov ebp, esp - lea eax, [esp + 8] - push 1 - push eax + push 1; + push [esp + 8]; call WasmLibrary::WasmDeferredParseEntryPoint #ifdef _CONTROL_FLOW_GUARD // verify that the call target is valid @@ -82,7 +74,6 @@ namespace Js call[__guard_check_icall_fptr] mov eax, ecx #endif - pop ebp // Although we don't restore ESP here on WinCE, this is fine because script profiler is not shipped for WinCE. jmp eax } @@ -96,11 +87,9 @@ namespace Js #endif // ENABLE_WASM -Js::JavascriptMethod Js::WasmLibrary::WasmDeferredParseEntryPoint(Js::AsmJsScriptFunction** funcPtr, int internalCall) +Js::JavascriptMethod Js::WasmLibrary::WasmDeferredParseEntryPoint(Js::AsmJsScriptFunction* func, int internalCall) { #ifdef ENABLE_WASM - AsmJsScriptFunction* func = *funcPtr; - FunctionBody* body = func->GetFunctionBody(); AsmJsFunctionInfo* info = body->GetAsmJsFunctionInfo(); ScriptContext* scriptContext = func->GetScriptContext(); @@ -118,22 +107,12 @@ Js::JavascriptMethod Js::WasmLibrary::WasmDeferredParseEntryPoint(Js::AsmJsScrip } catch (Wasm::WasmCompilationException& ex) { - char16* originalMessage = ex.ReleaseErrorMessage(); - Wasm::BinaryLocation location = readerInfo->m_module->GetReader()->GetCurrentLocation(); + AutoFreeExceptionMessage autoCleanExceptionMessage; + char16* exceptionMessage = WebAssemblyModule::FormatExceptionMessage(&ex, &autoCleanExceptionMessage, readerInfo->m_module, body); - Wasm::WasmCompilationException newEx( - _u("function %s at offset %u/%u (0x%x/0x%x): %s"), - body->GetDisplayName(), - location.offset, location.size, - location.offset, location.size, - originalMessage - ); - SysFreeString(originalMessage); - char16* msg = newEx.ReleaseErrorMessage(); JavascriptLibrary *library = scriptContext->GetLibrary(); JavascriptError *pError = library->CreateWebAssemblyCompileError(); - JavascriptError::SetErrorMessage(pError, WASMERR_WasmCompileError, msg, scriptContext); - SysFreeString(msg); + JavascriptError::SetErrorMessage(pError, WASMERR_WasmCompileError, exceptionMessage, scriptContext); func->GetDynamicType()->SetEntryPoint(WasmLazyTrapCallback); entrypointInfo->jsMethod = WasmLazyTrapCallback; diff --git a/deps/chakrashim/core/lib/Runtime/Library/WasmLibrary.h b/deps/chakrashim/core/lib/Runtime/Library/WasmLibrary.h index ed02708ea3a..70a159aee60 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WasmLibrary.h +++ b/deps/chakrashim/core/lib/Runtime/Library/WasmLibrary.h @@ -9,7 +9,7 @@ namespace Js class WasmLibrary { public: - static JavascriptMethod WasmDeferredParseEntryPoint(AsmJsScriptFunction** funcPtr, int internalCall); + static JavascriptMethod WasmDeferredParseEntryPoint(AsmJsScriptFunction* funcPtr, int internalCall); static void SetWasmEntryPointToInterpreter(Js::ScriptFunction* func, bool deferParse); #ifdef ENABLE_WASM static Var WasmLazyTrapCallback(RecyclableObject *callee, CallInfo, ...); diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssembly.cpp b/deps/chakrashim/core/lib/Runtime/Library/WebAssembly.cpp index 9d164dd98cf..ac7f51f2e8d 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssembly.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssembly.cpp @@ -171,7 +171,7 @@ Var WebAssembly::EntryInstantiateBound(RecyclableObject* function, CallInfo call Var importObj = callInfo.Count > 1 ? args[1] : function->GetScriptContext()->GetLibrary()->GetUndefined(); Var bufferSrc = callInfo.Count > 2 ? args[2] : function->GetScriptContext()->GetLibrary()->GetUndefined(); - return EntryInstantiate(function, CallInfo(CallFlags_Value, 3), thisVar, bufferSrc, importObj); + return CALL_ENTRYPOINT_NOASSERT(EntryInstantiate, function, CallInfo(CallFlags_Value, 3), thisVar, bufferSrc, importObj); } Var WebAssembly::EntryValidate(RecyclableObject* function, CallInfo callInfo, ...) @@ -264,7 +264,7 @@ Var WebAssembly::TryResolveResponse(RecyclableObject* function, Var thisArg, Var CallInfo newCallInfo; newCallInfo.Count = 2; // We already have a response object, query it now - responsePromise = EntryQueryResponse(function, Js::CallInfo(CallFlags_Value, 2), thisArg, responseArg); + responsePromise = CALL_ENTRYPOINT_NOASSERT(EntryQueryResponse, function, Js::CallInfo(CallFlags_Value, 2), thisArg, responseArg); } else if (JavascriptPromise::Is(responseArg)) { diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyEnvironment.cpp b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyEnvironment.cpp index 18e07bab55b..e6c4147245a 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyEnvironment.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyEnvironment.cpp @@ -25,7 +25,7 @@ WebAssemblyEnvironment::WebAssemblyEnvironment(WebAssemblyModule* module): this->table = this->start + module->GetTableEnvironmentOffset(); this->globals = this->start + module->GetGlobalOffset(); - uint32 globalsSize = WAsmJs::ConvertToJsVarOffset(module->GetGlobalsByteSize()); + uint32 globalsSize = WAsmJs::ConvertOffset(module->GetGlobalsByteSize()); // Assumes globals are last Assert(globals > table && globals > functions && globals > imports && globals > memory); if (globals < start || @@ -41,7 +41,7 @@ WebAssemblyEnvironment::WebAssemblyEnvironment(WebAssemblyModule* module): } template -void Js::WebAssemblyEnvironment::CheckPtrIsValid(intptr_t ptr) const +void WebAssemblyEnvironment::CheckPtrIsValid(intptr_t ptr) const { if (ptr < (intptr_t)PointerValue(start) || (intptr_t)(ptr + sizeof(T)) > (intptr_t)PointerValue(end)) { @@ -50,7 +50,7 @@ void Js::WebAssemblyEnvironment::CheckPtrIsValid(intptr_t ptr) const } template -T* Js::WebAssemblyEnvironment::GetVarElement(Field(Var)* ptr, uint32 index, uint32 maxCount) const +T* WebAssemblyEnvironment::GetVarElement(Field(Var)* ptr, uint32 index, uint32 maxCount) const { if (index >= maxCount) { @@ -72,7 +72,7 @@ T* Js::WebAssemblyEnvironment::GetVarElement(Field(Var)* ptr, uint32 index, uint } template -void Js::WebAssemblyEnvironment::SetVarElement(Field(Var)* ptr, T* val, uint32 index, uint32 maxCount) +void WebAssemblyEnvironment::SetVarElement(Field(Var)* ptr, T* val, uint32 index, uint32 maxCount) { if (index >= maxCount || !T::Is(val)) @@ -86,25 +86,24 @@ void Js::WebAssemblyEnvironment::SetVarElement(Field(Var)* ptr, T* val, uint32 i *dst = val; } -AsmJsScriptFunction* WebAssemblyEnvironment::GetWasmFunction(uint32 index) const +WasmScriptFunction* WebAssemblyEnvironment::GetWasmFunction(uint32 index) const { if (!(module->GetFunctionIndexType(index) == Wasm::FunctionIndexTypes::Function || module->GetFunctionIndexType(index) == Wasm::FunctionIndexTypes::ImportThunk)) { Js::Throw::InternalError(); } - return GetVarElement(functions, index, module->GetWasmFunctionCount()); + return GetVarElement(functions, index, module->GetWasmFunctionCount()); } -void WebAssemblyEnvironment::SetWasmFunction(uint32 index, AsmJsScriptFunction* func) +void WebAssemblyEnvironment::SetWasmFunction(uint32 index, WasmScriptFunction* func) { if (!(module->GetFunctionIndexType(index) == Wasm::FunctionIndexTypes::Function || - module->GetFunctionIndexType(index) == Wasm::FunctionIndexTypes::ImportThunk) || - !AsmJsScriptFunction::IsWasmScriptFunction(func)) + module->GetFunctionIndexType(index) == Wasm::FunctionIndexTypes::ImportThunk)) { Js::Throw::InternalError(); } - SetVarElement(functions, func, index, module->GetWasmFunctionCount()); + SetVarElement(functions, func, index, module->GetWasmFunctionCount()); } void WebAssemblyEnvironment::SetImportedFunction(uint32 index, Var importedFunc) diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyEnvironment.h b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyEnvironment.h index 3f7cf53345b..1b3e7dccdc9 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyEnvironment.h +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyEnvironment.h @@ -22,8 +22,8 @@ namespace Js Var* GetStartPtr() const { return (Var*)PointerValue(start); } - AsmJsScriptFunction* GetWasmFunction(uint32 index) const; - void SetWasmFunction(uint32 index, AsmJsScriptFunction* func); + WasmScriptFunction* GetWasmFunction(uint32 index) const; + void SetWasmFunction(uint32 index, WasmScriptFunction* func); void SetImportedFunction(uint32 index, Var importedFunc); WebAssemblyTable* GetTable(uint32 index) const; void SetTable(uint32 index, class WebAssemblyTable* table); diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyInstance.cpp b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyInstance.cpp index f77eeae1047..d6fe6db3cdb 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyInstance.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyInstance.cpp @@ -51,6 +51,14 @@ WebAssemblyInstance::Is(Var value) /* static */ WebAssemblyInstance * WebAssemblyInstance::FromVar(Var value) +{ + AssertOrFailFast(WebAssemblyInstance::Is(value)); + return static_cast(value); +} + +/* static */ +WebAssemblyInstance * +WebAssemblyInstance::UnsafeFromVar(Var value) { Assert(WebAssemblyInstance::Is(value)); return static_cast(value); @@ -68,11 +76,10 @@ WebAssemblyInstance::NewInstance(RecyclableObject* function, CallInfo callInfo, AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); - if (!(callInfo.Flags & CallFlags_New) || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) + if (!args.IsNewCall() || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) { JavascriptError::ThrowTypeError(scriptContext, JSERR_ClassConstructorCannotBeCalledWithoutNew, _u("WebAssembly.Instance")); } @@ -131,20 +138,20 @@ WebAssemblyInstance::CreateInstance(WebAssemblyModule * module, Var importObject try { LoadImports(module, scriptContext, importObject, &environment); - LoadGlobals(module, scriptContext, &environment); - LoadFunctions(module, scriptContext, &environment); ValidateTableAndMemory(module, scriptContext, &environment); + InitialGlobals(module, scriptContext, &environment); + CreateWasmFunctions(module, scriptContext, &environment); try { - LoadDataSegs(module, scriptContext, &environment); - LoadIndirectFunctionTable(module, scriptContext, &environment); + InitializeDataSegs(module, scriptContext, &environment); + InitializeFunctionTable(module, scriptContext, &environment); } catch (...) { AssertMsg(UNREACHED, "By spec, we should not have any exceptions possible here"); throw; } - newInstance->m_exports = BuildObject(module, scriptContext, &environment); + newInstance->m_exports = CreateExportObject(module, scriptContext, &environment); } catch (Wasm::WasmCompilationException& e) { @@ -154,7 +161,7 @@ WebAssemblyInstance::CreateInstance(WebAssemblyModule * module, Var importObject uint32 startFuncIdx = module->GetStartFunction(); if (startFuncIdx != Js::Constants::UninitializedValue) { - AsmJsScriptFunction* start = environment.GetWasmFunction(startFuncIdx); + WasmScriptFunction* start = environment.GetWasmFunction(startFuncIdx); Js::CallInfo info(Js::CallFlags_New, 1); Js::Arguments startArg(info, (Var*)&start); Js::JavascriptFunction::CallFunction(start, start->GetEntryPoint(), startArg); @@ -163,10 +170,9 @@ WebAssemblyInstance::CreateInstance(WebAssemblyModule * module, Var importObject return newInstance; } -void WebAssemblyInstance::LoadFunctions(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env) +void WebAssemblyInstance::CreateWasmFunctions(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env) { - FrameDisplay * frameDisplay = RecyclerNewPlus(ctx->GetRecycler(), sizeof(void*), FrameDisplay, 1); - frameDisplay->SetItem(0, env->GetStartPtr()); + FrameDisplay * frameDisplay = RecyclerNewPlus(ctx->GetRecycler(), sizeof(void*), FrameDisplay, 0); for (uint i = 0; i < wasmModule->GetWasmFunctionCount(); ++i) { @@ -176,8 +182,8 @@ void WebAssemblyInstance::LoadFunctions(WebAssemblyModule * wasmModule, ScriptCo } Wasm::WasmFunctionInfo* wasmFuncInfo = wasmModule->GetWasmFunctionInfo(i); FunctionBody* body = wasmFuncInfo->GetBody(); - AsmJsScriptFunction * funcObj = ctx->GetLibrary()->CreateAsmJsScriptFunction(body); - funcObj->SetModuleMemory((Field(Var)*)env->GetStartPtr()); + WasmScriptFunction* funcObj = ctx->GetLibrary()->CreateWasmScriptFunction(body); + funcObj->SetModuleEnvironment((Field(Var)*)env->GetStartPtr()); funcObj->SetSignature(body->GetAsmJsFunctionInfo()->GetWasmSignature()); funcObj->SetEnvironment(frameDisplay); @@ -210,7 +216,7 @@ void WebAssemblyInstance::LoadFunctions(WebAssemblyModule * wasmModule, ScriptCo } } -void WebAssemblyInstance::LoadDataSegs(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env) +void WebAssemblyInstance::InitializeDataSegs(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env) { WebAssemblyMemory* mem = env->GetMemory(0); Assert(mem); @@ -230,7 +236,7 @@ void WebAssemblyInstance::LoadDataSegs(WebAssemblyModule * wasmModule, ScriptCon } } -Var WebAssemblyInstance::BuildObject(WebAssemblyModule * wasmModule, ScriptContext* scriptContext, WebAssemblyEnvironment* env) +Var WebAssemblyInstance::CreateExportObject(WebAssemblyModule * wasmModule, ScriptContext* scriptContext, WebAssemblyEnvironment* env) { Js::Var exportsNamespace = scriptContext->GetLibrary()->CreateObject(scriptContext->GetLibrary()->GetNull()); for (uint32 iExport = 0; iExport < wasmModule->GetExportCount(); ++iExport) @@ -317,10 +323,10 @@ void WebAssemblyInstance::LoadImports( Assert(wasmModule->GetFunctionIndexType(counter) == Wasm::FunctionIndexTypes::ImportThunk); env->SetImportedFunction(counter, prop); - if (AsmJsScriptFunction::IsWasmScriptFunction(prop)) + if (WasmScriptFunction::Is(prop)) { Assert(env->GetWasmFunction(counter) == nullptr); - AsmJsScriptFunction* func = AsmJsScriptFunction::FromVar(prop); + WasmScriptFunction* func = WasmScriptFunction::FromVar(prop); if (!wasmModule->GetWasmFunctionInfo(counter)->GetSignature()->IsEquivalent(func->GetSignature())) { char16 temp[2048] = { 0 }; @@ -412,7 +418,7 @@ void WebAssemblyInstance::LoadImports( } } -void WebAssemblyInstance::LoadGlobals(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env) +void WebAssemblyInstance::InitialGlobals(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env) { uint count = wasmModule->GetGlobalCount(); for (uint i = 0; i < count; i++) @@ -450,7 +456,7 @@ void WebAssemblyInstance::LoadGlobals(WebAssemblyModule * wasmModule, ScriptCont } } -void WebAssemblyInstance::LoadIndirectFunctionTable(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env) +void WebAssemblyInstance::InitializeFunctionTable(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env) { WebAssemblyTable* table = env->GetTable(0); Assert(table != nullptr); diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyInstance.h b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyInstance.h index e60a0753724..6d5cb366137 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyInstance.h +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyInstance.h @@ -27,17 +27,18 @@ namespace Js static bool Is(Var aValue); static WebAssemblyInstance * FromVar(Var aValue); + static WebAssemblyInstance * UnsafeFromVar(Var aValue); static WebAssemblyInstance * CreateInstance(WebAssemblyModule * module, Var importObject); private: WebAssemblyInstance(WebAssemblyModule * wasmModule, DynamicType * type); - static void LoadDataSegs(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); - static void LoadFunctions(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); - static Var BuildObject(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); + static void InitializeDataSegs(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); + static void CreateWasmFunctions(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); + static Var CreateExportObject(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); static void LoadImports(WebAssemblyModule * wasmModule, ScriptContext* ctx, Var ffi, WebAssemblyEnvironment* env); - static void LoadGlobals(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); - static void LoadIndirectFunctionTable(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); + static void InitialGlobals(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); + static void InitializeFunctionTable(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); static void ValidateTableAndMemory(WebAssemblyModule * wasmModule, ScriptContext* ctx, WebAssemblyEnvironment* env); Field(WebAssemblyModule *) m_module; diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyMemory.cpp b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyMemory.cpp index 4d7519c038e..99590a5a81b 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyMemory.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyMemory.cpp @@ -31,6 +31,14 @@ WebAssemblyMemory::Is(Var value) /* static */ WebAssemblyMemory * WebAssemblyMemory::FromVar(Var value) +{ + AssertOrFailFast(WebAssemblyMemory::Is(value)); + return static_cast(value); +} + +/* static */ +WebAssemblyMemory * +WebAssemblyMemory::UnsafeFromVar(Var value) { Assert(WebAssemblyMemory::Is(value)); return static_cast(value); @@ -44,11 +52,10 @@ WebAssemblyMemory::NewInstance(RecyclableObject* function, CallInfo callInfo, .. ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); - AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); + AssertMsg(args.HasArg(), "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); if (!(callInfo.Flags & CallFlags_New) || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) { @@ -183,30 +190,30 @@ void WebAssemblyMemory::TraceMemWrite(WebAssemblyMemory* mem, uint32 index, uint } if (offset) { - Output::Print(_u("WasmMemoryTrace:: buf[%u + %u (%llu)] = "), index, offset, bigIndex); + Output::Print(_u("WasmMemoryTrace:: buf[%u + %u (%llu)]"), index, offset, bigIndex); } else { - Output::Print(_u("WasmMemoryTrace:: buf[%u] = "), index); + Output::Print(_u("WasmMemoryTrace:: buf[%u]"), index); } BYTE* buffer = mem->m_buffer->GetBuffer(); switch (viewType) { case ArrayBufferView::ViewType::TYPE_INT8_TO_INT64: - case ArrayBufferView::ViewType::TYPE_INT8: Output::Print(_u("%d\n"), *(int8*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_INT8: Output::Print(_u(".int8 = %d\n"), *(int8*)(buffer + bigIndex)); break; case ArrayBufferView::ViewType::TYPE_UINT8_TO_INT64: - case ArrayBufferView::ViewType::TYPE_UINT8: Output::Print(_u("%u\n"), *(uint8*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_UINT8: Output::Print(_u(".uint8 = %u\n"), *(uint8*)(buffer + bigIndex)); break; case ArrayBufferView::ViewType::TYPE_INT16_TO_INT64: - case ArrayBufferView::ViewType::TYPE_INT16: Output::Print(_u("%d\n"), *(int16*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_INT16: Output::Print(_u(".int16 = %d\n"), *(int16*)(buffer + bigIndex)); break; case ArrayBufferView::ViewType::TYPE_UINT16_TO_INT64: - case ArrayBufferView::ViewType::TYPE_UINT16: Output::Print(_u("%u\n"), *(uint16*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_UINT16: Output::Print(_u(".uint16 = %u\n"), *(uint16*)(buffer + bigIndex)); break; case ArrayBufferView::ViewType::TYPE_INT32_TO_INT64: - case ArrayBufferView::ViewType::TYPE_INT32: Output::Print(_u("%d\n"), *(int32*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_INT32: Output::Print(_u(".int32 = %d\n"), *(int32*)(buffer + bigIndex)); break; case ArrayBufferView::ViewType::TYPE_UINT32_TO_INT64: - case ArrayBufferView::ViewType::TYPE_UINT32: Output::Print(_u("%u\n"), *(uint32*)(buffer + bigIndex)); break; - case ArrayBufferView::ViewType::TYPE_FLOAT32: Output::Print(_u("%.4f\n"), *(float*)(buffer + bigIndex)); break; - case ArrayBufferView::ViewType::TYPE_FLOAT64: Output::Print(_u("%.8f\n"), *(double*)(buffer + bigIndex)); break; - case ArrayBufferView::ViewType::TYPE_INT64: Output::Print(_u("%lld\n"), *(int64*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_UINT32: Output::Print(_u(".uint32 = %u\n"), *(uint32*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_FLOAT32: Output::Print(_u(".f32 = %.4f\n"), *(float*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_FLOAT64: Output::Print(_u(".f64 = %.8f\n"), *(double*)(buffer + bigIndex)); break; + case ArrayBufferView::ViewType::TYPE_INT64: Output::Print(_u(".int64 = %lld\n"), *(int64*)(buffer + bigIndex)); break; default: CompileAssert(ArrayBufferView::ViewType::TYPE_COUNT == 15); Assert(UNREACHED); diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyMemory.h b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyMemory.h index fc2c04d5e81..5b62d292382 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyMemory.h +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyMemory.h @@ -29,6 +29,7 @@ namespace Js static bool Is(Var aValue); static WebAssemblyMemory * FromVar(Var aValue); + static WebAssemblyMemory * UnsafeFromVar(Var aValue); static WebAssemblyMemory * CreateMemoryObject(uint32 initial, uint32 maximum, ScriptContext * scriptContext); diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyModule.cpp b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyModule.cpp index 0468f658542..03d675d7b9c 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyModule.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyModule.cpp @@ -37,7 +37,7 @@ WebAssemblyModule::WebAssemblyModule(Js::ScriptContext* scriptContext, const byt m_customSections(nullptr) { m_alloc = HeapNew(ArenaAllocator, _u("WebAssemblyModule"), scriptContext->GetThreadContext()->GetPageAllocator(), Js::Throw::OutOfMemory); - //the first elm is the number of Vars in front of I32; makes for a nicer offset computation + // the first elem is the number of Vars in front of I32; makes for a nicer offset computation memset(m_globalCounts, 0, sizeof(uint) * Wasm::WasmTypes::Limit); m_functionsInfo = RecyclerNew(scriptContext->GetRecycler(), WasmFunctionInfosList, scriptContext->GetRecycler()); m_imports = Anew(m_alloc, WasmImportsList, m_alloc); @@ -55,6 +55,14 @@ WebAssemblyModule::Is(Var value) /* static */ WebAssemblyModule * WebAssemblyModule::FromVar(Var value) +{ + AssertOrFailFast(WebAssemblyModule::Is(value)); + return static_cast(value); +} + +/* static */ +WebAssemblyModule * +WebAssemblyModule::UnsafeFromVar(Var value) { Assert(WebAssemblyModule::Is(value)); return static_cast(value); @@ -69,11 +77,10 @@ WebAssemblyModule::NewInstance(RecyclableObject* function, CallInfo callInfo, .. ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); - AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); + AssertMsg(args.HasArg(), "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); if (!(callInfo.Flags & CallFlags_New) || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) { @@ -203,7 +210,6 @@ Var WebAssemblyModule::EntryCustomSections(RecyclableObject* function, CallInfo JavascriptArray::Push(scriptContext, customSections, arrayBuffer); } } - LEAVE_PINNED_SCOPE(); // sectionName return customSections; @@ -216,12 +222,12 @@ WebAssemblyModule::CreateModule( WebAssemblySource* src) { Assert(src); - AutoProfilingPhase wasmPhase(scriptContext, Js::WasmBytecodePhase); - Unused(wasmPhase); WebAssemblyModule * webAssemblyModule = nullptr; Wasm::WasmReaderInfo * readerInfo = nullptr; Js::FunctionBody * currentBody = nullptr; + char16* exceptionMessage = nullptr; + AutoFreeExceptionMessage autoCleanExceptionMessage; try { Wasm::WasmModuleGenerator bytecodeGen(scriptContext, src); @@ -242,33 +248,14 @@ WebAssemblyModule::CreateModule( } catch (Wasm::WasmCompilationException& ex) { - // The reason that we use GetTempErrorMessageRef here, instead of just doing simply - // ReleaseErrorMessage and grabbing it away from the WasmCompilationException, is a - // slight niggle in the lifetime of the message buffer. The normal error throw..Var - // routines don't actually do anything to clean up their varargs - likely good, due - // to the variety of situations that we want to use them in. However, this fails to - // clean up strings if they're not cleaned up by some destructor. By handling these - // error strings not by grabbing them away from the WasmCompilationException, I can - // have the WasmCompilationException destructor clean up the strings when we throw, - // by which point SetErrorMessage will already have copied out what it needs. - BSTR originalMessage = ex.GetTempErrorMessageRef(); - if (currentBody != nullptr) - { - Wasm::BinaryLocation location = readerInfo->m_module->GetReader()->GetCurrentLocation(); - - originalMessage = ex.ReleaseErrorMessage(); - ex = Wasm::WasmCompilationException( - _u("function %s at offset %u/%u (0x%x/0x%x): %s"), - currentBody->GetDisplayName(), - location.offset, location.size, - location.offset, location.size, - originalMessage - ); - currentBody->GetAsmJsFunctionInfo()->SetWasmReaderInfo(nullptr); - SysFreeString(originalMessage); - originalMessage = ex.GetTempErrorMessageRef(); - } - JavascriptError::ThrowWebAssemblyCompileErrorVar(scriptContext, WASMERR_WasmCompileError, originalMessage); + // The stackwalker doesn't need to see the current stack + // do not throw in the catch block to allow the stack to unwind before throwing. + exceptionMessage = FormatExceptionMessage(&ex, &autoCleanExceptionMessage, webAssemblyModule, currentBody); + } + + if (exceptionMessage) + { + JavascriptError::ThrowWebAssemblyCompileErrorVar(scriptContext, WASMERR_WasmCompileError, exceptionMessage); } return webAssemblyModule; @@ -300,9 +287,9 @@ WebAssemblyModule::ValidateModule( if (PHASE_ON(WasmValidatePrejitPhase, body)) { CONFIG_FLAG(MaxAsmJsInterpreterRunCount) = 0; - AsmJsScriptFunction * funcObj = scriptContext->GetLibrary()->CreateAsmJsScriptFunction(body); - FunctionEntryPointInfo * entypointInfo = (FunctionEntryPointInfo*)funcObj->GetEntryPointInfo(); - entypointInfo->SetIsAsmJSFunction(true); + WasmScriptFunction * funcObj = scriptContext->GetLibrary()->CreateWasmScriptFunction(body); + FunctionEntryPointInfo * entrypointInfo = (FunctionEntryPointInfo*)funcObj->GetEntryPointInfo(); + entrypointInfo->SetIsAsmJSFunction(true); GenerateFunction(scriptContext->GetNativeCodeGenerator(), body, funcObj); } #endif @@ -809,8 +796,7 @@ WebAssemblyModule::SetStartFunction(uint32 i) { if (i >= GetWasmFunctionCount()) { - TRACE_WASM_DECODER(_u("Invalid start function index")); - return; + throw Wasm::WasmCompilationException(_u("Invalid start function index %u"), i); } m_startFuncIndex = i; } @@ -837,10 +823,37 @@ WebAssemblyModule::GetModuleEnvironmentSize() const uint32 size = 3; size = UInt32Math::Add(size, GetWasmFunctionCount()); size = UInt32Math::Add(size, GetImportedFunctionCount()); - size = UInt32Math::Add(size, WAsmJs::ConvertToJsVarOffset(GetGlobalsByteSize())); + size = UInt32Math::Add(size, WAsmJs::ConvertOffset(GetGlobalsByteSize())); return size; } +char16* WebAssemblyModule::FormatExceptionMessage(Wasm::WasmCompilationException* ex, AutoFreeExceptionMessage* autoFree, WebAssemblyModule* wasmModule, FunctionBody* body) +{ + char16* originalExceptionMessage = ex->GetTempErrorMessageRef(); + if (!wasmModule || !body) + { + size_t len = wcslen(originalExceptionMessage) + 1; + char16* buf = HeapNewArray(char16, len); + autoFree->Set(buf, len); + js_memcpy_s(buf, len * sizeof(char16), originalExceptionMessage, len * sizeof(char16)); + return buf; + } + + Wasm::BinaryLocation location = wasmModule->GetReader()->GetCurrentLocation(); + + const char16* format = _u("function %s at offset %u/%u (0x%x/0x%x): %s"); + const char16* funcName = body->GetDisplayName(); + char16* buf = HeapNewArray(char16, 2048); + autoFree->Set(buf, 2048); + + _snwprintf_s(buf, 2048, _TRUNCATE, format, + funcName, + location.offset, location.size, + location.offset, location.size, + originalExceptionMessage); + return buf; +} + void WebAssemblyModule::Finalize(bool isShutdown) { @@ -866,12 +879,12 @@ uint WebAssemblyModule::GetOffsetForGlobal(Wasm::WasmGlobal* global) const { Wasm::WasmTypes::WasmType type = global->GetType(); - if (type >= Wasm::WasmTypes::Limit) + if (!Wasm::WasmTypes::IsLocalType(type)) { throw Wasm::WasmCompilationException(_u("Invalid Global type")); } - uint32 offset = WAsmJs::ConvertFromJsVarOffset(GetGlobalOffset()); + uint32 offset = WAsmJs::ConvertOffset(GetGlobalOffset()); for (uint i = 1; i < (uint)type; i++) { @@ -919,6 +932,10 @@ WebAssemblyModule::GetGlobalsByteSize() const uint32 size = 0; for (Wasm::WasmTypes::WasmType type = (Wasm::WasmTypes::WasmType)(Wasm::WasmTypes::Void + 1); type < Wasm::WasmTypes::Limit; type = (Wasm::WasmTypes::WasmType)(type + 1)) { + if (!Wasm::WasmTypes::IsLocalType(type)) + { + continue; + } size = AddGlobalByteSizeToOffset(type, size); } return size; diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyModule.h b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyModule.h index 2e7f49e4140..44129cfb374 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyModule.h +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyModule.h @@ -15,6 +15,7 @@ namespace Wasm class WasmDataSegment; class WasmElementSegment; class WasmGlobal; + class WasmCompilationException; struct WasmImport; struct WasmExport; struct CustomSection; @@ -22,6 +23,8 @@ namespace Wasm namespace Js { +typedef HeapAllocator::AutoFreeArray AutoFreeExceptionMessage; + class WebAssemblyModule : public DynamicObject { protected: @@ -46,6 +49,7 @@ class WebAssemblyModule : public DynamicObject static bool Is(Var aValue); static WebAssemblyModule * FromVar(Var aValue); + static WebAssemblyModule * UnsafeFromVar(Var aValue); static WebAssemblyModule * CreateModule( ScriptContext* scriptContext, @@ -147,6 +151,8 @@ class WebAssemblyModule : public DynamicObject Wasm::WasmBinaryReader* GetReader() const { return m_reader; } + static char16* FormatExceptionMessage(Wasm::WasmCompilationException* ex, AutoFreeExceptionMessage* autoClean, WebAssemblyModule* wasmModule = nullptr, FunctionBody* body = nullptr); + virtual void Finalize(bool isShutdown) override; virtual void Dispose(bool isShutdown) override; virtual void Mark(Recycler * recycler) override; diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyTable.cpp b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyTable.cpp index 2f0ddee1a16..6d9db601e7d 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyTable.cpp +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyTable.cpp @@ -30,6 +30,14 @@ WebAssemblyTable::Is(Var value) /* static */ WebAssemblyTable * WebAssemblyTable::FromVar(Var value) +{ + AssertOrFailFast(WebAssemblyTable::Is(value)); + return static_cast(value); +} + +/* static */ +WebAssemblyTable * +WebAssemblyTable::UnsafeFromVar(Var value) { Assert(WebAssemblyTable::Is(value)); return static_cast(value); @@ -43,11 +51,10 @@ WebAssemblyTable::NewInstance(RecyclableObject* function, CallInfo callInfo, ... ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); - AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); + AssertMsg(args.HasArg(), "Should always have implicit 'this'"); - Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; - bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); - Assert(isCtorSuperCall || !(callInfo.Flags & CallFlags_New) || args[0] == nullptr); + Var newTarget = args.GetNewTarget(); + JavascriptOperators::GetAndAssertIsConstructorSuperCall(args); if (!(callInfo.Flags & CallFlags_New) || (newTarget && JavascriptOperators::IsUndefinedObject(newTarget))) { @@ -194,7 +201,7 @@ WebAssemblyTable::EntrySet(RecyclableObject* function, CallInfo callInfo, ...) { value = nullptr; } - else if (!AsmJsScriptFunction::IsWasmScriptFunction(args[2])) + else if (!WasmScriptFunction::Is(args[2])) { JavascriptError::ThrowTypeError(scriptContext, WASMERR_NeedWebAssemblyFunc); } @@ -229,7 +236,7 @@ void WebAssemblyTable::DirectSetValue(uint index, Var val) { Assert(index < m_currentLength); - Assert(!val || AsmJsScriptFunction::Is(val)); + Assert(!val || WasmScriptFunction::Is(val)); m_values[index] = val; } @@ -238,7 +245,7 @@ WebAssemblyTable::DirectGetValue(uint index) const { Assert(index < m_currentLength); Var val = m_values[index]; - Assert(!val || AsmJsScriptFunction::Is(val)); + Assert(!val || WasmScriptFunction::Is(val)); return val; } diff --git a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyTable.h b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyTable.h index 12166e82bdf..3da59ca54b4 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyTable.h +++ b/deps/chakrashim/core/lib/Runtime/Library/WebAssemblyTable.h @@ -32,6 +32,7 @@ namespace Js static bool Is(Var aValue); static WebAssemblyTable * FromVar(Var aValue); + static WebAssemblyTable * UnsafeFromVar(Var aValue); static WebAssemblyTable * Create(uint32 initial, uint32 maximum, ScriptContext * scriptContext); diff --git a/deps/chakrashim/core/lib/Runtime/Library/amd64/JavascriptFunctionA.S b/deps/chakrashim/core/lib/Runtime/Library/amd64/JavascriptFunctionA.S index ef39b1af0ea..b5f5ef3093f 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/amd64/JavascriptFunctionA.S +++ b/deps/chakrashim/core/lib/Runtime/Library/amd64/JavascriptFunctionA.S @@ -115,145 +115,69 @@ NESTED_END amd64_CallFunction, _TEXT // int CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); .balign 16 -NESTED_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_, _TEXT, NoHandler +NESTED_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh, _TEXT, NoHandler push_nonvol_reg rbp mov rbp, rsp // Set to compute CFA as: rbp + 2 words (RA, rbp) set_cfa_register rbp, (2*8) - push rbx - push r12 - push r13 - push r15 - - // rdi: function - - // rax: entry point - mov rax, rsi - - // rbx: argc - mov rbx, rdx - - // r15: argv - mov r15, rcx - add r15, 8h - - // int GetArgsSizesArray(ScriptFunction* func) - push rax - push rdi - call C_FUNC(_ZN2Js17GetArgsSizesArrayEPNS_14ScriptFunctionE) - mov r12, rax - pop rdi - pop rax - - // int GetStackSizeForAsmJsUnboxing(ScriptFunction* func) - // This will return 0x20 bytes if size is below minimum. Includes space for function*. - push rax - push rdi - call C_FUNC(_ZN2Js28GetStackSizeForAsmJsUnboxingEPNS_14ScriptFunctionE) - mov r13, rax - pop rdi - pop rax - -LOCAL_LABEL(setup_stack_and_reg_args): - - // OP_CallAsmInternal checks stack space - -LOCAL_LABEL(stack_alloc): - sub rsp, r13 - - // copy all args to the new stack frame. - lea r11, [r15] - lea r10, [rsp + 8] // copy after ScriptFunction* - push r13 // save r13 -LOCAL_LABEL(copy_stack_args): - mov rsi, qword ptr [r11] - mov qword ptr [r10], rsi - add r11, 8 - add r10, 8 - sub r13, 8 - cmp r13, 8 // skipped 1 - jg LOCAL_LABEL(copy_stack_args) - pop r13 // restore r13 - - // r12 points to arg size map -LOCAL_LABEL(setup_reg_args_1): - lea r11, [r15] - // argc < 1 ? - cmp rbx, 1h - jl LOCAL_LABEL(setup_args_done) - cmp dword ptr[r12], 10h - je LOCAL_LABEL(SIMDArg1) - mov rsi, qword ptr [r11] - movq xmm1, qword ptr [r11] - add r11, 8h - jmp LOCAL_LABEL(setup_reg_args_2) -LOCAL_LABEL(SIMDArg1): - movups xmm1, xmmword ptr [r11] - add r11, 10h - -LOCAL_LABEL(setup_reg_args_2): - // argc < 2 ? - cmp rbx, 2h - jl LOCAL_LABEL(setup_args_done) - - add r12, 4 - cmp dword ptr[r12], 10h - je LOCAL_LABEL(SIMDArg2) - mov rdx, qword ptr [r11] - movq xmm2, qword ptr [r11] - add r11, 8h - jmp LOCAL_LABEL(setup_reg_args_3) -LOCAL_LABEL(SIMDArg2): - movups xmm2, xmmword ptr [r11] - add r11, 10h - -LOCAL_LABEL(setup_reg_args_3): - // argc < 3 ? - cmp rbx, 3h - jl LOCAL_LABEL(setup_args_done) - add r12, 4 - cmp dword ptr[r12], 10h - je LOCAL_LABEL(SIMDArg3) - mov rcx, qword ptr [r11] - movq xmm3, qword ptr [r11] -LOCAL_LABEL(SIMDArg3): - movups xmm3, xmmword ptr [r11] - -LOCAL_LABEL(setup_args_done): - // "home" arg0. other args already copied. - mov [rsp], rdi - call rax - add rsp, r13 // restore stack + // rdi: function, rsi: entryPoint, rdx: argv, rcx: argSizes, r8: reg + + and rsp, -16 // Make sure the stack is 16 bytes aligned + // add 16 bytes to argsSize to account for ScriptFunction and stay 16 bytes aligned + add rcx, 16 + // Stack allocation + sub rsp, rcx + + // Set entrypoint to r11 + mov r11, rsi + + // Make sure ScriptFunction* is first argument + mov qword ptr [rdx], rdi + + shr rcx, 3 // rcx = rcx / 8 for qword size mov + mov rsi, rdx // rsi = argv + mov rdi, rsp // rdi = arguments destination + rep movsq + + mov rdi, qword ptr [rsp] + + xor rax, rax // Zero out rax in case r11 expects varags + call r11 // done: - pop r15 - pop r13 - pop r12 - pop rbx + // restore stack + mov rsp, rbp pop_nonvol_reg rbp ret -NESTED_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_, _TEXT +NESTED_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh, _TEXT // int64 CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); .balign 16 -LEAF_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIlEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_, _TEXT - jmp C_FUNC(_ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_) -LEAF_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIlEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_, _TEXT +LEAF_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIlEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh, _TEXT + jmp C_FUNC(_ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh) +LEAF_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIlEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh, _TEXT // float CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); .balign 16 -LEAF_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIfEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_, _TEXT - jmp C_FUNC(_ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_) -LEAF_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIfEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_, _TEXT +LEAF_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIfEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh, _TEXT + jmp C_FUNC(_ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh) +LEAF_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIfEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh, _TEXT // double CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); .balign 16 -LEAF_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIdEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_, _TEXT - jmp C_FUNC(_ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_) -LEAF_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIdEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEjPS5_, _TEXT +LEAF_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIdEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh, _TEXT + jmp C_FUNC(_ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh) +LEAF_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIdEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh, _TEXT + +// AsmJsSIMDValue CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); +.balign 16 +LEAF_ENTRY _ZN2Js18JavascriptFunction17CallAsmJsFunctionIDv4_fEET_PNS_16RecyclableObjectEPFPvS5_NS_8CallInfoEzEjPS6_, _TEXT + int 3 //TODO: Verify this code path when enabling WASM.SIMD for xplat + jmp C_FUNC(_ZN2Js18JavascriptFunction17CallAsmJsFunctionIiEET_PNS_16RecyclableObjectEPFPvS4_NS_8CallInfoEzEPS5_jPh) +LEAF_END _ZN2Js18JavascriptFunction17CallAsmJsFunctionIDv4_fEET_PNS_16RecyclableObjectEPFPvS5_NS_8CallInfoEzEjPS6_, _TEXT #endif // _ENABLE_DYNAMIC_THUNKS //------------------------------------------------------------------------------ diff --git a/deps/chakrashim/core/lib/Runtime/Library/amd64/JavascriptFunctionA.asm b/deps/chakrashim/core/lib/Runtime/Library/amd64/JavascriptFunctionA.asm index 411e22d9c14..db033bdbe6d 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/amd64/JavascriptFunctionA.asm +++ b/deps/chakrashim/core/lib/Runtime/Library/amd64/JavascriptFunctionA.asm @@ -219,122 +219,67 @@ ifdef _ENABLE_DYNAMIC_THUNKS extrn ?GetStackSizeForAsmJsUnboxing@Js@@YAHPEAVScriptFunction@1@@Z: PROC extrn ?GetArgsSizesArray@Js@@YAPEAIPEAVScriptFunction@1@@Z : PROC -; int64 CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); +; int64 JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) align 16 -??$CallAsmJsFunction@_J@JavascriptFunction@Js@@SQ_JPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z PROC FRAME +??$CallAsmJsFunction@_J@JavascriptFunction@Js@@SA_JPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z PROC FRAME .setframe rbp, 0 .endprolog - rex_jmp_reg ??$CallAsmJsFunction@H@JavascriptFunction@Js@@SQHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z -??$CallAsmJsFunction@_J@JavascriptFunction@Js@@SQ_JPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z ENDP + rex_jmp_reg ??$CallAsmJsFunction@H@JavascriptFunction@Js@@SAHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z +??$CallAsmJsFunction@_J@JavascriptFunction@Js@@SA_JPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z ENDP -; float CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); +; float JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) align 16 -??$CallAsmJsFunction@M@JavascriptFunction@Js@@SQMPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z PROC FRAME +??$CallAsmJsFunction@N@JavascriptFunction@Js@@SANPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z PROC FRAME .setframe rbp, 0 .endprolog - rex_jmp_reg ??$CallAsmJsFunction@H@JavascriptFunction@Js@@SQHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z -??$CallAsmJsFunction@M@JavascriptFunction@Js@@SQMPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z ENDP + rex_jmp_reg ??$CallAsmJsFunction@H@JavascriptFunction@Js@@SAHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z +??$CallAsmJsFunction@N@JavascriptFunction@Js@@SANPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z ENDP -; double CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); +; double JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) align 16 -??$CallAsmJsFunction@N@JavascriptFunction@Js@@SQNPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z PROC FRAME +??$CallAsmJsFunction@M@JavascriptFunction@Js@@SAMPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z PROC FRAME .setframe rbp, 0 .endprolog - rex_jmp_reg ??$CallAsmJsFunction@H@JavascriptFunction@Js@@SQHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z -??$CallAsmJsFunction@N@JavascriptFunction@Js@@SQNPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z ENDP + rex_jmp_reg ??$CallAsmJsFunction@H@JavascriptFunction@Js@@SAHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z +??$CallAsmJsFunction@M@JavascriptFunction@Js@@SAMPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z ENDP -; __m128 JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, void* entryPoint, uint argc, Var * argv); +; __m128 JavascriptFunction::CallAsmJsFunction<__m128>(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) align 16 -??$CallAsmJsFunction@T__m128@@@JavascriptFunction@Js@@SQ?AT__m128@@PEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z PROC FRAME +??$CallAsmJsFunction@T__m128@@@JavascriptFunction@Js@@SA?AT__m128@@PEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z PROC FRAME .setframe rbp, 0 .endprolog - rex_jmp_reg ??$CallAsmJsFunction@H@JavascriptFunction@Js@@SQHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z -??$CallAsmJsFunction@T__m128@@@JavascriptFunction@Js@@SQ?AT__m128@@PEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z ENDP + rex_jmp_reg ??$CallAsmJsFunction@H@JavascriptFunction@Js@@SAHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z +??$CallAsmJsFunction@T__m128@@@JavascriptFunction@Js@@SA?AT__m128@@PEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z ENDP - - -; int CallAsmJsFunction(RecyclableObject *function, JavascriptMethod entryPoint, uint argc, Var *argv); +; int JavascriptFunction::CallAsmJsFunction(RecyclableObject * function, JavascriptMethod entryPoint, Var * argv, uint argsSize, byte* reg) align 16 -??$CallAsmJsFunction@H@JavascriptFunction@Js@@SQHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z PROC FRAME - - ; save these to stack for interpreter - mov qword ptr [rsp + 8h], rcx - mov qword ptr [rsp + 10h], rdx - mov qword ptr [rsp + 18h], r8 - mov qword ptr [rsp + 20h], r9 - - push rbx - .pushreg rbx +??$CallAsmJsFunction@H@JavascriptFunction@Js@@SAHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z PROC FRAME + ; save arguments to stack for interpreter + mov qword ptr [rsp + 8h], rcx ;; function + mov qword ptr [rsp + 10h], rdx ;; entrypoint + mov qword ptr [rsp + 18h], r8 ;; argv + mov qword ptr [rsp + 20h], r9 ;; argsSize + ;; reg is at [rsp + 28h] + + ; push rbx unused + ; .pushreg rbx push rsi .pushreg rsi push rdi .pushreg rdi - push r12 - .pushreg r12 - push r13 - .pushreg r13 + ; push r12 unused + ; .pushreg r12 + ; push r13 unused + ; .pushreg r13 push rbp .pushreg rbp - lea rbp, [rsp] + mov rbp, rsp .setframe rbp, 0 .endprolog - ; The first 4 QWORD args are passed in rcx, rdx/xmm1, r8/xmm2 and r9/xmm3, - ; upon entry rcx contains function *. - sub rsp, 8h - - - - ;; rbx = argc - mov rbx, r8 - -ifdef _CONTROL_FLOW_GUARD - mov rdi, rcx ; save function * - mov rcx, rdx ; save entry point (the call target) - ; it is guaranteed that icall check will preserve rcx - ;[b-namost]: are the push/pops necessary ? - push rdx - push r8 - push r9 - call amd64_CheckICall ; verify that the call target is valid - pop r9 - pop r8 - pop rdx - - mov rax, rcx ; restore entry point to rax - same as non-CFG path - mov rcx, rdi ; restore function * back to rcx -else - ; save entry point into rax. - mov rax, rdx -endif - - xor r10d, r10d + and rsp, -16 ; Make sure the stack is 16 bytes aligned + lea rax, [r9 + 16] ; add 16 bytes to argsSize to account for ScriptFunction and stay 16 bytes aligned - ;; rsi = argv - mov rsi, r9 - add rsi, 8h - - ; get map of args sizes for this function - push rax - push rcx - sub rsp, 20h - call ?GetArgsSizesArray@Js@@YAPEAIPEAVScriptFunction@1@@Z - mov r12, rax - add rsp, 20h - pop rcx - pop rax - - ; int GetStackSizeForAsmJsUnboxing(ScriptFunction* func) - ; This will return 0x20 bytes if size is below minimum. Includes space for function*. - push rax - push rcx - sub rsp, 20h - call ?GetStackSizeForAsmJsUnboxing@Js@@YAHPEAVScriptFunction@1@@Z - add rsp, 20h - pop rcx - pop r13 - - ; OP_CallAsmInternal probes stack ; Check if we need to commit more stack cmp rax, 2000h ; x64 has 2 guard pages jl stack_alloc @@ -342,75 +287,50 @@ endif stack_alloc: sub rsp, rax + ;; Make sure ScriptFunction* is first argument + mov qword ptr [r8], rcx + ;; copy all args to the new stack frame. - lea r11, [rsi] - lea r10, [rsp + 8] ; copy after ScriptFunction* -copy_stack_args: - mov rdi, qword ptr [r11] - mov qword ptr [r10], rdi - add r11, 8 - add r10, 8 - sub rax, 8 - cmp rax, 0 - jg copy_stack_args - - ; r12 points to arg size map -setup_reg_args_1: - lea r11, [rsi] - ; argc < 1 ? - cmp rbx, 1h - jl setup_args_done - cmp dword ptr[r12], 10h - je SIMDArg1 - mov rdx, qword ptr [r11] - movq xmm1, qword ptr [r11] - add r11, 8h - jmp setup_reg_args_2 -SIMDArg1: - movups xmm1, xmmword ptr [r11] - add r11, 10h + ;; Move argSize in rcx for rep movs + mov rcx, rax + shr rcx, 3 ;; rcx = rcx / 8 for qword size mov + mov rsi, r8 ;; rsi = argv + mov rdi, rsp ;; rdi = arguments destination + rep movsq + + ;; Move entrypoint in rax + mov rax, rdx -setup_reg_args_2: - ; argc < 2 ? - cmp rbx, 2h - jl setup_args_done - - add r12, 4 - cmp dword ptr[r12], 10h - je SIMDArg2 - mov r8, qword ptr [r11] - movq xmm2, qword ptr [r11] - add r11, 8h - jmp setup_reg_args_3 -SIMDArg2: - movups xmm2, xmmword ptr [r11] - add r11, 10h - -setup_reg_args_3: - ; argc < 3 ? - cmp rbx, 3h - jl setup_args_done - add r12, 4 - cmp dword ptr[r12], 10h - je SIMDArg3 - mov r9, qword ptr [r11] - movq xmm3, qword ptr [r11] -SIMDArg3: - movups xmm3, xmmword ptr [r11] + ;; Load 4 first arguments in registers + ;; First argument (aka ScriptFunction*) + mov rcx, qword ptr [rsp] + mov r10, [rbp + 40h] ;; r10 = byte* reg + ;; Second argument + mov rdx, qword ptr [r10] + movaps xmm1, xmmword ptr [r10] + ;; Third argument + mov r8, qword ptr [r10 + 10h] + movaps xmm2, xmmword ptr [r10 + 10h] + ;; Fourth argument + mov r9, qword ptr [r10 + 20h] + movaps xmm3, xmmword ptr [r10 + 20h] + +ifdef _CONTROL_FLOW_GUARD + call [__guard_dispatch_icall_fptr] +else + call rax +endif -setup_args_done: - call r13 -done: lea rsp, [rbp] pop rbp - pop r13 - pop r12 + ; pop r13 + ; pop r12 pop rdi pop rsi - pop rbx + ; pop rbx ret -??$CallAsmJsFunction@H@JavascriptFunction@Js@@SQHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZIPEAPEAX@Z ENDP +??$CallAsmJsFunction@H@JavascriptFunction@Js@@SAHPEAVRecyclableObject@1@P6APEAX0UCallInfo@1@ZZPEAPEAXIPEAE@Z ENDP endif ;; _ENABLE_DYNAMIC_THUNKS diff --git a/deps/chakrashim/core/lib/Runtime/Library/arm/arm_CallFunction.asm b/deps/chakrashim/core/lib/Runtime/Library/arm/arm_CallFunction.asm index 63fe4f29c6e..99036ac1e12 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/arm/arm_CallFunction.asm +++ b/deps/chakrashim/core/lib/Runtime/Library/arm/arm_CallFunction.asm @@ -3,10 +3,10 @@ ; Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. ;------------------------------------------------------------------------------------------------------- -;Var arm_CallFunction(JavascriptFunction* function, CallInfo info, Var* values, JavascriptMethod entryPoint) +;Var arm_CallFunction(JavascriptFunction* function, CallInfo info, uint count, Var* values, JavascriptMethod entryPoint) ; ; This method should be called as follows -; varResult = arm_CallFunction((JavascriptFunction*)function, args.Info, args.Values, entryPoint); +; varResult = arm_CallFunction((JavascriptFunction*)function, args.Info, argCount, args.Values, entryPoint); ; ; and makes the following call ; return entryPoint(function, info, values[0], values[1], ..., values[n-2], values[n-1]); @@ -53,9 +53,7 @@ ;All but two values go onto the stack ... calculate the number of values on the stack. - mov r4,r1 ;r4 = callInfo. - bfc r4,#24,#8 ;clear high order 8 bits of r6 -- clean callInfo.Flags which shares same word as callInfo.Count. - sub r4,r4,#2 ;subtract 2 == number of values that we can pass via registers. + sub r4,r2,#2 ;subtract 2 == number of values that we can pass via registers. mov r5,r4,lsl #2 ;r5 = space needed on the stack for values. ; Adjust sp to meet ABI requirement: stack must be 8-bytes aligned at any function boundary. @@ -70,20 +68,23 @@ ; - output: r4 = total number of BYTES probed/allocated. blx __chkstk ;now r4 = the space to allocate, r5 = actual space needed for values on stack, r4 >= r5. +#if defined(_CONTROL_FLOW_GUARD) + ldr r6,[sp, #32] ; r6 = entryPoint +#else + ldr r6,[sp, #24] +#endif ;offset stack by the amount of space we'll need. sub sp,sp,r4 - mov r4,r3 ;copy entryPoint to r4 so we can use r3 as a scratch variable - - add r2,r2,#8 ;add 8 to r2 (so it is the address of the first value to be placed on the stack). + add r3,r3,#8 ;add 8 to r3 (so it is the address of the first value to be placed on the stack). mov r12,#0 ;offset for getting values/storing on stack. |argN| cmp r5,r12 beq arg2 ;if r5 == r12, no more values need to go onto the stack. - ldr r3,[r2,r12] ;r3 = *(r2 + r12) - str r3,[sp,r12] ;*(sp + r12) = r3 + ldr r4,[r3,r12] ;r3 = *(r2 + r12) + str r4,[sp,r12] ;*(sp + r12) = r3 add r12,r12,#4 ;offset increases by 4. b argN ;goto argN @@ -91,27 +92,27 @@ |arg2| ; Verify that the call target is valid, and process last two arguments #if defined(_CONTROL_FLOW_GUARD) - mov r5, r0 ; save argument registers - mov r6, r1 - mov r8, r2 + mov r4, r0 ; save argument registers + mov r5, r1 + mov r8, r3 - mov r0, r4 ; the target address to check + mov r0, r6 ; the target address to check mov32 r12, __guard_check_icall_fptr ldr r12, [r12] blx r12 - mov r0, r5 ; restore argument registers - mov r1, r6 - mov r2, r8 + mov r0, r4 ; restore argument registers + mov r1, r5 + mov r3, r8 #endif - ;Push values[1] into r3 - ldr r3,[r2,#-4] ;r3 = *(r2-4) = values[1] - ;Push values[0] into r2 - ldr r2,[r2,#-8] ;r2 = *(r2-8) = values[0] + ldr r2,[r3,#-8] ;r2 = *(r2-8) = values[0] + + ;Push values[1] into r3 + ldr r3,[r3,#-4] ;r3 = *(r2-4) = values[1] - blx r4 ;call r4 (== entry point) + blx r6 ;call r4 (== entry point) EPILOG_STACK_RESTORE r7 #if defined(_CONTROL_FLOW_GUARD) diff --git a/deps/chakrashim/core/lib/Runtime/Library/arm64/arm64_CallFunction.asm b/deps/chakrashim/core/lib/Runtime/Library/arm64/arm64_CallFunction.asm index 03228767c4f..7abc45b0e0d 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/arm64/arm64_CallFunction.asm +++ b/deps/chakrashim/core/lib/Runtime/Library/arm64/arm64_CallFunction.asm @@ -3,10 +3,10 @@ ; Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. ;------------------------------------------------------------------------------------------------------- -;Var arm64_CallFunction(JavascriptFunction* function, CallInfo info, Var* values, JavascriptMethod entryPoint) +;Var arm64_CallFunction(JavascriptFunction* function, CallInfo info, uint argCount, Var* values, JavascriptMethod entryPoint) ; ; This method should be called as follows -; varResult = arm64_CallFunction((JavascriptFunction*)function, args.Info, args.Values, entryPoint); +; varResult = arm64_CallFunction((JavascriptFunction*)function, args.Info, argCount, args.Values, entryPoint); ; ; and makes the following call ; return entryPoint(function, info, values[0], values[1], ..., values[n-2], values[n-1]); @@ -50,31 +50,31 @@ PROLOG_SAVE_REG_PAIR fp, lr, #-16! ; save fp/lr (implicitly saves SP in FP) - mov x15, x3 ; copy entry point to x15 + mov x8, x4 ; copy entry point to x8 + mov x9, x3 ; copy values pointer to x9 #if _CONTROL_FLOW_GUARD + mov x15, x4 ; __guard_check_icall_fptr requires the call target in x15 adrp x16, __guard_check_icall_fptr ; ldr x16, [x16, __guard_check_icall_fptr]; fetch address of guard check handler blr x16 ; call it #endif - and x4, x1, #0xffffff ; clear high order 40 bits of x1(callInfo) - ; (clean callInfo.Flags which shares same word as callInfo.Count) - subs x5, x4, #6 ; more than 6 parameters? + subs x5, x2, #6 ; more than 6 parameters? bgt StackAlloc ; if so, allocate necessary stack adr x5, CopyZero ; get bottom of parameter copy loop - sub x5, x5, x4, lsl #2 ; compute address of where to start + sub x5, x5, x2, lsl #2 ; compute address of where to start br x5 ; branch there CopyAll - ldr x7, [x2, #40] ; load remaining 6 registers here - ldr x6, [x2, #32] ; - ldr x5, [x2, #24] ; - ldr x4, [x2, #16] ; - ldr x3, [x2, #8] ; - ldr x2, [x2, #0] ; + ldr x7, [x9, #40] ; load remaining 6 registers here + ldr x6, [x9, #32] ; + ldr x5, [x9, #24] ; + ldr x4, [x9, #16] ; + ldr x3, [x9, #8] ; + ldr x2, [x9, #0] ; CopyZero - blr x15 ; call saved entry point + blr x8 ; call saved entry point mov sp, fp ; explicitly restore sp EPILOG_RESTORE_REG_PAIR fp, lr, #16! ; restore FP/LR @@ -85,14 +85,13 @@ StackAlloc lsr x15, x15, #1 ; divide by 2 bl __chkstk ; ensure stack is allocated sub sp, sp, x15, lsl #4 ; then allocate the space - add x6, x2, #48 ; use x6 = source - mov x7, sp ; use x7 = dest + add x3, x3, #48 ; use x3 = source + mov x4, sp ; use x4 = dest CopyLoop subs x5, x5, #1 ; decrement param count by 1 - ldr x4, [x6], #8 ; read param from source - str x4, [x7], #8 ; store param to dest + ldr x7, [x3], #8 ; read param from source + str x7, [x4], #8 ; store param to dest bne CopyLoop ; loop until all copied - mov x15, x3 ; recover entry point in x15 b CopyAll ; jump ahead to copy all 6 remaining parameters NESTED_END diff --git a/deps/chakrashim/core/lib/Runtime/Library/arm64/arm64_DeferredParsingThunk.asm b/deps/chakrashim/core/lib/Runtime/Library/arm64/arm64_DeferredParsingThunk.asm index 4c97f7c282b..71913034096 100644 --- a/deps/chakrashim/core/lib/Runtime/Library/arm64/arm64_DeferredParsingThunk.asm +++ b/deps/chakrashim/core/lib/Runtime/Library/arm64/arm64_DeferredParsingThunk.asm @@ -37,7 +37,7 @@ ; Pass the address of the function at the saved x0 mov x0, sp - add x0, x0, #16 + add x0, x0, #16 ; 16 is subtracted from the stack pointer when the a function is called, add it back here. bl |?DeferredParse@JavascriptFunction@Js@@SAP6APEAXPEAVRecyclableObject@2@UCallInfo@2@ZZPEAPEAVScriptFunction@2@@Z| ; retrieve entrypoint mov x16, x0 ; back up entryPoint in x16 diff --git a/deps/chakrashim/core/lib/Runtime/Math/JavascriptMath.cpp b/deps/chakrashim/core/lib/Runtime/Math/JavascriptMath.cpp index 68da6480bd0..3576ad576e9 100644 --- a/deps/chakrashim/core/lib/Runtime/Math/JavascriptMath.cpp +++ b/deps/chakrashim/core/lib/Runtime/Math/JavascriptMath.cpp @@ -183,7 +183,7 @@ namespace Js } else if (typeLeft == TypeIds_String) { - return JavascriptString::Concat(JavascriptString::FromVar(aLeft), JavascriptString::FromVar(aRight)); + return JavascriptString::Concat(JavascriptString::UnsafeFromVar(aLeft), JavascriptString::UnsafeFromVar(aRight)); } } else if(typeLeft == TypeIds_Number && typeRight == TypeIds_Integer) @@ -262,8 +262,8 @@ namespace Js { if( typeRight == TypeIds_String ) { - JavascriptString* leftString = JavascriptString::FromVar(aLeft); - JavascriptString* rightString = JavascriptString::FromVar(aRight); + JavascriptString* leftString = JavascriptString::UnsafeFromVar(aLeft); + JavascriptString* rightString = JavascriptString::UnsafeFromVar(aRight); return JavascriptString::Concat(leftString, rightString); } break; @@ -323,13 +323,13 @@ namespace Js { if (JavascriptOperators::GetTypeId(aLeft) == TypeIds_String) { - JavascriptString* leftString = JavascriptString::FromVar(aLeft); + JavascriptString* leftString = JavascriptString::UnsafeFromVar(aLeft); JavascriptString* rightString; TypeId rightType = JavascriptOperators::GetTypeId(aRight); switch(rightType) { case TypeIds_String: - rightString = JavascriptString::FromVar(aRight); + rightString = JavascriptString::UnsafeFromVar(aRight); StringCommon: return leftString->ConcatDestructive(rightString); @@ -381,12 +381,12 @@ namespace Js // If either side is a string, then the result is also a string if (JavascriptOperators::GetTypeId(primLeft) == TypeIds_String) { - JavascriptString* stringLeft = JavascriptString::FromVar(primLeft); + JavascriptString* stringLeft = JavascriptString::UnsafeFromVar(primLeft); JavascriptString* stringRight = nullptr; if (JavascriptOperators::GetTypeId(primRight) == TypeIds_String) { - stringRight = JavascriptString::FromVar(primRight); + stringRight = JavascriptString::UnsafeFromVar(primRight); } else { @@ -403,7 +403,7 @@ namespace Js if (JavascriptOperators::GetTypeId(primRight) == TypeIds_String) { JavascriptString* stringLeft = JavascriptConversion::ToString(primLeft, scriptContext); - JavascriptString* stringRight = JavascriptString::FromVar(primRight); + JavascriptString* stringRight = JavascriptString::UnsafeFromVar(primRight); if(leftIsDead) { @@ -903,7 +903,7 @@ namespace Js TypeId typeId = JavascriptOperators::GetTypeId(arrayArg); if (!JavascriptNativeArray::Is(typeId) && !(TypedArrayBase::Is(typeId) && typeId != TypeIds_CharArray && typeId != TypeIds_BoolArray)) { - if (JavascriptArray::IsVarArray(typeId) && JavascriptArray::FromVar(arrayArg)->GetLength() == 0) + if (JavascriptArray::IsVarArray(typeId) && JavascriptArray::UnsafeFromVar(arrayArg)->GetLength() == 0) { return scriptContext->GetLibrary()->GetNegativeInfinite(); } @@ -915,7 +915,7 @@ namespace Js #if ENABLE_COPYONACCESS_ARRAY JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(arrayArg); #endif - JavascriptNativeArray * argsArray = JavascriptNativeArray::FromVar(arrayArg); + JavascriptNativeArray * argsArray = JavascriptNativeArray::UnsafeFromVar(arrayArg); uint len = argsArray->GetLength(); if (len == 0) { @@ -932,7 +932,7 @@ namespace Js } else { - TypedArrayBase * argsArray = TypedArrayBase::FromVar(arrayArg); + TypedArrayBase * argsArray = TypedArrayBase::UnsafeFromVar(arrayArg); uint len = argsArray->GetLength(); if (len == 0) { @@ -961,7 +961,7 @@ namespace Js TypeId typeId = JavascriptOperators::GetTypeId(arrayArg); if (!JavascriptNativeArray::Is(typeId) && !(TypedArrayBase::Is(typeId) && typeId != TypeIds_CharArray && typeId != TypeIds_BoolArray)) { - if (JavascriptArray::Is(typeId) && JavascriptArray::FromVar(arrayArg)->GetLength() == 0) + if (JavascriptArray::Is(typeId) && JavascriptArray::UnsafeFromVar(arrayArg)->GetLength() == 0) { return scriptContext->GetLibrary()->GetPositiveInfinite(); } @@ -973,7 +973,7 @@ namespace Js #if ENABLE_COPYONACCESS_ARRAY JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray(arrayArg); #endif - JavascriptNativeArray * argsArray = JavascriptNativeArray::FromVar(arrayArg); + JavascriptNativeArray * argsArray = JavascriptNativeArray::UnsafeFromVar(arrayArg); uint len = argsArray->GetLength(); if (len == 0) { @@ -990,7 +990,7 @@ namespace Js } else { - TypedArrayBase * argsArray = TypedArrayBase::FromVar(arrayArg); + TypedArrayBase * argsArray = TypedArrayBase::UnsafeFromVar(arrayArg); uint len = argsArray->GetLength(); if (len == 0) { diff --git a/deps/chakrashim/core/lib/Runtime/Math/WasmMath.h b/deps/chakrashim/core/lib/Runtime/Math/WasmMath.h index 4b18adbe5d0..bc7179defa6 100644 --- a/deps/chakrashim/core/lib/Runtime/Math/WasmMath.h +++ b/deps/chakrashim/core/lib/Runtime/Math/WasmMath.h @@ -27,6 +27,8 @@ class WasmMath template using CmpPtr = bool(*)(T a, T b); template CMP1, CmpPtr CMP2> static bool isInRange(STYPE srcVal); template static bool isNaN(STYPE src); + + template static To SignExtend(To value); }; } //namespace Wasm diff --git a/deps/chakrashim/core/lib/Runtime/Math/WasmMath.inl b/deps/chakrashim/core/lib/Runtime/Math/WasmMath.inl index feec8ce4237..fc0959025d3 100644 --- a/deps/chakrashim/core/lib/Runtime/Math/WasmMath.inl +++ b/deps/chakrashim/core/lib/Runtime/Math/WasmMath.inl @@ -223,4 +223,10 @@ inline int64 WasmMath::Ror(int64 aLeft, int64 aRight) return _rotr64(aLeft, (int)aRight); } +template +To WasmMath::SignExtend(To value) +{ + return static_cast(static_cast(value)); +} + } diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Chakra.Runtime.PlatformAgnostic.vcxproj b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Chakra.Runtime.PlatformAgnostic.vcxproj index ee29c21aee3..ba1ef3d206b 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Chakra.Runtime.PlatformAgnostic.vcxproj +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Chakra.Runtime.PlatformAgnostic.vcxproj @@ -37,6 +37,12 @@ RuntimePlatformAgnosticPch.h + + + + true + + Create @@ -49,7 +55,6 @@ - @@ -57,7 +62,6 @@ - @@ -73,4 +77,4 @@ - \ No newline at end of file + diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Chakra.Runtime.PlatformAgnostic.vcxproj.filters b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Chakra.Runtime.PlatformAgnostic.vcxproj.filters index a29ec48615f..36761c623b7 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Chakra.Runtime.PlatformAgnostic.vcxproj.filters +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Chakra.Runtime.PlatformAgnostic.vcxproj.filters @@ -1,12 +1,9 @@ - + Platform\Windows - - Platform\Windows - Platform\Windows @@ -51,9 +48,6 @@ - - Interfaces - Interfaces @@ -61,4 +55,4 @@ Interfaces - \ No newline at end of file + diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/ChakraPlatform.h b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/ChakraPlatform.h index aea38dfb77e..35c593f6974 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/ChakraPlatform.h +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/ChakraPlatform.h @@ -5,8 +5,16 @@ #pragma once #include "UnicodeText.h" -#include "EventTrace.h" + +// Configure whether we configure a signal handler +// to produce perf-.map files +#ifndef PERFMAP_TRACE_ENABLED +#define PERFMAP_TRACE_ENABLED 0 +#endif + +#if PERFMAP_TRACE_ENABLED #include "PerfTrace.h" +#endif #include "PlatformAgnostic/DateTime.h" #include "PlatformAgnostic/AssemblyCommon.h" diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Intl.h b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Intl.h index 1ab7d871776..66f7fc14011 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Intl.h +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Intl.h @@ -73,8 +73,9 @@ namespace Intl HRESULT CreateCurrencyFormatter(_In_z_ const char16 *languageTag, _In_ const charcount_t cch, _In_z_ const char16 *currencyCode, _In_ const NumberFormatCurrencyDisplay currencyDisplay, _Out_ IPlatformAgnosticResource **resource); - HRESULT SetNumberFormatSignificantDigits(IPlatformAgnosticResource *resource, const uint16 minSigDigits, const uint16 maxSigDigits); - HRESULT SetNumberFormatIntFracDigits(IPlatformAgnosticResource *resource, const uint16 minFracDigits, const uint16 maxFracDigits, const uint16 minIntDigits); + void SetNumberFormatSignificantDigits(IPlatformAgnosticResource *resource, const uint16 minSigDigits, const uint16 maxSigDigits); + void SetNumberFormatIntFracDigits(IPlatformAgnosticResource *resource, const uint16 minFracDigits, const uint16 maxFracDigits, const uint16 minIntDigits); + void SetNumberFormatGroupingUsed(_In_ IPlatformAgnosticResource *resource, _In_ const bool isGroupingUsed); template const char16 *FormatNumber(IPlatformAgnosticResource *formatter, const T val, const NumberFormatStyle formatterToUse, const NumberFormatCurrencyDisplay currencyDisplay, const char16 *currencyCode); diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/CMakeLists.txt b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/CMakeLists.txt index 6b2a30618c6..c62bd85f1d3 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/CMakeLists.txt +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/CMakeLists.txt @@ -4,30 +4,29 @@ set(PL_SOURCE_FILES Common/UnicodeText.Common.cpp Common/HiResTimer.cpp Common/DateTime.cpp - Linux/EventTrace.cpp Linux/UnicodeText.ICU.cpp Linux/NumbersUtility.cpp Linux/Thread.cpp - Linux/PerfTrace.cpp Common/Trace.cpp Common/SystemInfo.Common.cpp ) if(CC_TARGET_OS_ANDROID OR CC_TARGET_OS_LINUX) -set(PL_SOURCE_FILES ${PL_SOURCE_FILES} - Linux/SystemInfo.cpp - ) + set(PL_SOURCE_FILES ${PL_SOURCE_FILES} + Linux/SystemInfo.cpp + Linux/PerfTrace.cpp + ) elseif(CC_TARGET_OS_OSX) -set(PL_SOURCE_FILES ${PL_SOURCE_FILES} - Unix/AssemblyCommon.cpp - Unix/SystemInfo.cpp - ) + set(PL_SOURCE_FILES ${PL_SOURCE_FILES} + Unix/AssemblyCommon.cpp + Unix/SystemInfo.cpp + # Linux/PerfTrace.cpp # TODO : implement for OSX? + ) endif() -if(ICU_INTL_ENABLED) -set(PL_SOURCE_FILES ${PL_SOURCE_FILES} - Common/Intl.cpp - ) +if(NOT ICU_INTL_DISABLED) + set(PL_SOURCE_FILES ${PL_SOURCE_FILES} Common/Intl.cpp) + add_compile_options(-frtti) endif() if(NOT STATIC_LIBRARY) diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/Intl.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/Intl.cpp index 022e7c2d086..825b818ae5c 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/Intl.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/Intl.cpp @@ -54,124 +54,187 @@ typedef uint64_t uint64; #include #pragma warning(pop) +#include "CommonDefines.h" // INTL_ICU_DEBUG + +#if defined(__GNUC__) || defined(__clang__) +// Output gets included through some other path on Windows +class Output +{ +public: + static size_t __cdecl Print(const char16 *form, ...); +}; +#endif + +#define ICU_ERROR_FMT _u("INTL: %S failed with error code %S\n") +#define ICU_EXPR_FMT _u("INTL: %S failed expression check %S\n") + +#ifdef INTL_ICU_DEBUG +#define ICU_DEBUG_PRINT(fmt, msg) Output::Print(fmt, __func__, (msg)) +#else +#define ICU_DEBUG_PRINT(fmt, msg) +#endif + +#define ICU_RETURN(e, expr, r) \ + do \ + { \ + if (U_FAILURE(e)) \ + { \ + ICU_DEBUG_PRINT(ICU_ERROR_FMT, u_errorName(e)); \ + return r; \ + } \ + else if (!(expr)) \ + { \ + ICU_DEBUG_PRINT(ICU_EXPR_FMT, u_errorName(e)); \ + return r; \ + } \ + } while (false) + +#define ICU_ASSERT(e, expr) \ + do \ + { \ + if (U_FAILURE(e)) \ + { \ + ICU_DEBUG_PRINT(ICU_ERROR_FMT, u_errorName(e)); \ + AssertMsg(false, u_errorName(e)); \ + } \ + else if (!(expr)) \ + { \ + ICU_DEBUG_PRINT(ICU_EXPR_FMT, u_errorName(e)); \ + Assert(expr); \ + } \ + } while (false) + +#define ICU_ASSERT_RETURN(e, expr, r) \ + do \ + { \ + if (U_FAILURE(e)) \ + { \ + ICU_DEBUG_PRINT(ICU_ERROR_FMT, u_errorName(e)); \ + AssertMsg(false, u_errorName(e)); \ + return r; \ + } \ + else if (!(expr)) \ + { \ + ICU_DEBUG_PRINT(ICU_EXPR_FMT, u_errorName(e)); \ + Assert(expr); \ + return r; \ + } \ + } while (false) + +#define CHECK_UTF_CONVERSION(str, ret) \ + do \ + { \ + if (str == nullptr) \ + { \ + AssertOrFailFastMsg(false, "OOM: failed to allocate string buffer"); \ + return ret; \ + } \ + } while (false) + +#define UNWRAP_RESOURCE(resource, innerType) reinterpret_cast *>(resource)->GetInstance(); + namespace PlatformAgnostic { namespace Intl { using namespace PlatformAgnostic::Resource; - bool IsWellFormedLanguageTag(_In_z_ const char16 *languageTag, _In_ const charcount_t cch) + // This file uses dynamic_cast and RTTI + // While most of ChakraCore has left this feature disabled for a number of reasons, ICU uses it heavily internally + // For instance, in creating NumberFormats, the documentation recommends the use of the NumberFormat::create* factory methods + // However, to use attributes and significant digits, you must be working with a DecimalFormat + // NumberFormat offers no indicator fields or convenience methods to convert to a DecimalFormat, as ICU expects RTTI to be enabled + // As such, RTTI is enabled only in the PlatformAgnostic project and only if IntlICU=true + + // lots of logic below requires utf8char_t ~= char and UChar ~= char16 + static_assert(sizeof(utf8char_t) == sizeof(char), "ICU-based Intl logic assumes that utf8char_t is compatible with char"); + + // [[ Ctrl-F: UChar_cast_explainer ]] + // UChar, like char16, is guaranteed to be 2 bytes on all platforms. + // However, we cannot use static_cast because on Windows: + // - char16 => WCHAR => wchar_t (native type) -- see Core/CommonTypedefs.h or Codex/Utf8Codex.h + // - (wchar_t is a native 2-byte type on Windows, but native 4-byte elsewhere) + // On other platforms: + // - char16 => char16_t -- see pal/inc/pal_mstypes.h + // All platforms: + // - UChar -> char16_t (all platforms) + static_assert(sizeof(UChar) == sizeof(char16), "ICU-based Intl logic assumes that UChar is compatible with char16"); + + // This function duplicates the Utf8Helper.h classes/methods + // See https://github.com/Microsoft/ChakraCore/pull/3913 for a (failed) attempt to use those directly + // Use CHECK_UTF_CONVERSION macro at the callsite to check the return value + // The caller is responsible for delete[]ing the memory returned here + // TODO(jahorto): As long as this function exists, it _must_ be kept in sync with utf8::WideStringToNarrow (Utf8Helper.h) + // TODO(jahorto 10/13/2017): This function should not exist for long, and should eventually be replaced with official utf8:: code + static utf8char_t *Utf16ToUtf8(_In_ const char16 *src, _In_ const charcount_t srcLength, _Out_ size_t *destLength) { - bool success = false; - UErrorCode error = UErrorCode::U_ZERO_ERROR; - char icuLocaleId[ULOC_FULLNAME_CAPACITY] = { 0 }; - char icuLangTag[ULOC_FULLNAME_CAPACITY] = { 0 }; - int32_t parsedLength = 0; - int32_t forLangTagResultLength = 0; - int32_t toLangTagResultLength = 0; - size_t inputLangTagUtf8SizeActual = 0; - // Allocate memory for the UTF8 output buffer. Need 3 bytes for each (code point + null) to satisfy SAL. - const size_t inputLangTagUtf8SizeAllocated = AllocSizeMath::Mul(AllocSizeMath::Add(cch, 1), 3); - unsigned char *inputLangTagUtf8 = new unsigned char[inputLangTagUtf8SizeAllocated]; - if (!inputLangTagUtf8) + size_t allocSize = AllocSizeMath::Mul(AllocSizeMath::Add(srcLength, 1), 3); + utf8char_t *dest = new utf8char_t[allocSize]; + if (!dest) { - AssertOrFailFastMsg(false, "OOM: failed to allocate inputLangTagUtf8"); - return false; + // this check has to happen in the caller regardless, so asserting here doesn't do much good + return nullptr; } - StringBufferAutoPtr guard(inputLangTagUtf8); - memset(inputLangTagUtf8, 0, inputLangTagUtf8SizeAllocated); // explicitly zero the array + *destLength = utf8::EncodeIntoAndNullTerminate(dest, src, srcLength); + return dest; + } - inputLangTagUtf8SizeActual = utf8::EncodeIntoAndNullTerminate(inputLangTagUtf8, languageTag, cch); + bool IsWellFormedLanguageTag(_In_z_ const char16 *langtag16, _In_ const charcount_t cch) + { + UErrorCode error = UErrorCode::U_ZERO_ERROR; + char icuLocaleId[ULOC_FULLNAME_CAPACITY] = { 0 }; + char icuLangTag[ULOC_FULLNAME_CAPACITY] = { 0 }; + + size_t langtag8Length = 0; + const utf8char_t *langtag8 = Utf16ToUtf8(langtag16, cch, &langtag8Length); + StringBufferAutoPtr guard(langtag8); + CHECK_UTF_CONVERSION(langtag8, false); // Convert input language tag to a locale ID for use in uloc_toLanguageTag API. // We used utf8 conversion to turn char16* into utf8char_t* (unsigned char *) but uloc_forLanguageTag takes char* // LangTags must be 7-bit-ASCII to be valid and any of these chars being "negative" is irrelevant. - forLangTagResultLength = uloc_forLanguageTag(reinterpret_cast(inputLangTagUtf8), + int32_t parsedLength = 0; + int32_t forLangTagResultLength = uloc_forLanguageTag(reinterpret_cast(langtag8), icuLocaleId, ULOC_FULLNAME_CAPACITY, &parsedLength, &error); - success = (forLangTagResultLength > 0) && (parsedLength > 0) && - U_SUCCESS(error) && ((size_t)parsedLength == inputLangTagUtf8SizeActual); - if (!success) - { - return false; - } + ICU_RETURN(error, forLangTagResultLength > 0 && parsedLength > 0 && ((size_t) parsedLength) == langtag8Length, false); - toLangTagResultLength = uloc_toLanguageTag(icuLocaleId, icuLangTag, ULOC_FULLNAME_CAPACITY, TRUE, &error); - success = toLangTagResultLength && U_SUCCESS(error); - if (!success) - { - if (error == UErrorCode::U_ILLEGAL_ARGUMENT_ERROR) - { - AssertMsg(false, "uloc_toLanguageTag: error U_ILLEGAL_ARGUMENT_ERROR"); - } - else - { - AssertMsg(false, "uloc_toLanguageTag: unexpected error (besides U_ILLEGAL_ARGUMENT_ERROR)"); - } - } + int32_t toLangTagResultLength = uloc_toLanguageTag(icuLocaleId, icuLangTag, ULOC_FULLNAME_CAPACITY, true, &error); + ICU_RETURN(error, toLangTagResultLength > 0, false); - return success; + return true; } HRESULT NormalizeLanguageTag(_In_z_ const char16 *languageTag, _In_ const charcount_t cch, _Out_ char16 *normalized, _Out_ size_t *normalizedLength) { - bool success = false; UErrorCode error = UErrorCode::U_ZERO_ERROR; char icuLocaleId[ULOC_FULLNAME_CAPACITY] = { 0 }; char icuLangTag[ULOC_FULLNAME_CAPACITY] = { 0 }; - int32_t parsedLength = 0; - int32_t forLangTagResultLength = 0; - int32_t toLangTagResultLength = 0; - - // Allocate memory for the UTF8 output buffer. Need 3 bytes for each (code point + null) to satisfy SAL. - const size_t inputLangTagUtf8SizeAllocated = AllocSizeMath::Mul(AllocSizeMath::Add(cch, 1), 3); - unsigned char *inputLangTagUtf8 = new unsigned char[inputLangTagUtf8SizeAllocated]; - if (!inputLangTagUtf8) - { - AssertOrFailFastMsg(false, "OOM: failed to allocate inputLangTagUtf8."); - return E_OUTOFMEMORY; - } - - StringBufferAutoPtr guard(inputLangTagUtf8); - memset(inputLangTagUtf8, 0, inputLangTagUtf8SizeAllocated); // explicitly zero the array - utf8::EncodeIntoAndNullTerminate(inputLangTagUtf8, languageTag, cch); + size_t langtag8Length = 0; + const utf8char_t *langtag8 = Utf16ToUtf8(languageTag, cch, &langtag8Length); + StringBufferAutoPtr guard(langtag8); + CHECK_UTF_CONVERSION(langtag8, E_OUTOFMEMORY); // Convert input language tag to a locale ID for use in uloc_toLanguageTag API. // We used utf8 conversion to turn char16* into utf8char_t* (unsigned char *) but uloc_forLanguageTag takes char* // LangTags must be 7-bit-ASCII to be valid and any of these chars being "negative" is irrelevant. - forLangTagResultLength = uloc_forLanguageTag(reinterpret_cast(inputLangTagUtf8), + int32_t parsedLength = 0; + int32_t forLangTagResultLength = uloc_forLanguageTag(reinterpret_cast(langtag8), icuLocaleId, ULOC_FULLNAME_CAPACITY, &parsedLength, &error); - success = forLangTagResultLength && parsedLength && U_SUCCESS(error); - if (!success) - { - AssertMsg(false, "uloc_forLanguageTag failed"); - return E_INVALIDARG; - } + ICU_ASSERT_RETURN(error, forLangTagResultLength > 0 && parsedLength > 0, E_INVALIDARG); // Try to convert icuLocaleId (locale ID version of input locale string) to BCP47 language tag, using strict checks - toLangTagResultLength = uloc_toLanguageTag(icuLocaleId, icuLangTag, ULOC_FULLNAME_CAPACITY, TRUE, &error); - success = toLangTagResultLength && U_SUCCESS(error); - if (!success) - { - if (error == UErrorCode::U_ILLEGAL_ARGUMENT_ERROR) - { - AssertMsg(false, "uloc_toLanguageTag: error U_ILLEGAL_ARGUMENT_ERROR"); - } - else - { - AssertMsg(false, "uloc_toLanguageTag: unexpected error (besides U_ILLEGAL_ARGUMENT_ERROR)"); - } + int32_t toLangTagResultLength = uloc_toLanguageTag(icuLocaleId, icuLangTag, ULOC_FULLNAME_CAPACITY, true, &error); + ICU_ASSERT_RETURN(error, toLangTagResultLength > 0, E_INVALIDARG); - return E_INVALIDARG; - } - - *normalizedLength = utf8::DecodeUnitsIntoAndNullTerminateNoAdvance(normalized, + *normalizedLength = utf8::DecodeUnitsIntoAndNullTerminateNoAdvance( + normalized, reinterpret_cast(icuLangTag), - reinterpret_cast(icuLangTag + toLangTagResultLength), - utf8::doDefault); + reinterpret_cast(icuLangTag + toLangTagResultLength) + ); return S_OK; } @@ -179,98 +242,48 @@ namespace Intl int32_t GetCurrencyFractionDigits(_In_z_ const char16 * currencyCode) { UErrorCode error = UErrorCode::U_ZERO_ERROR; - - // [[ Ctrl-F: UChar_cast_explainer ]] - // UChar, like char16, is guaranteed to be 2 bytes on all platforms. - // However, we cannot use static_cast because on Windows: - // - char16 => WCHAR => wchar_t (native type) -- see Core/CommonTypedefs.h or Codex/Utf8Codex.h - // - (wchar_t is a native 2-byte type on Windows, but native 4-byte elsewhere) - // On other platforms: - // - char16 => char16_t -- see pal/inc/pal_mstypes.h - // All platforms: - // - UChar -> char16_t (all platforms) const UChar *uCurrencyCode = reinterpret_cast(currencyCode); // REVIEW (doilij): What does the spec say to do if a currency is not supported? Does that affect this decision? - int32_t minFracDigits = 2; // Picked a "reasonable" fallback value as a starting value here. + const int32_t fallback = 2; // Picked a "reasonable" fallback value as a starting value here. // Note: The number of fractional digits specified for a currency is not locale-dependent. - icu::NumberFormat *nf = icu::NumberFormat::createCurrencyInstance(error); // using default locale - AutoPtr guard(nf); // ICU requires that the caller explicitly deletes pointers allocated by ICU (otherwise will leak) - - if (U_FAILURE(error)) - { -#ifdef INTL_ICU_DEBUG - if (error == UErrorCode::U_MISSING_RESOURCE_ERROR) - { - Output::Print(_u("EntryIntl_CurrencyDigits > icu::NumberFormat::createCurrencyInstance(error) > U_MISSING_RESOURCE_ERROR (%d)\n"), error); - } - else - { - Output::Print(_u("EntryIntl_CurrencyDigits > icu::NumberFormat::createCurrencyInstance(error) > UErrorCode (%d)\n"), error); - } -#endif - goto LReturn; - } + icu::NumberFormat *nf = icu::NumberFormat::createCurrencyInstance(error); // use default locale + AutoPtr guard(nf); + ICU_RETURN(error, true, fallback); nf->setCurrency(uCurrencyCode, error); - if (U_FAILURE(error)) - { -#ifdef INTL_ICU_DEBUG - if (error == UErrorCode::U_MISSING_RESOURCE_ERROR) - { - Output::Print(_u("EntryIntl_CurrencyDigits > nf->setCurrency(uCurrencyCode (%s), error) > U_MISSING_RESOURCE_ERROR (%d)\n"), currencyCode, error); - } - else - { - Output::Print(_u("EntryIntl_CurrencyDigits > nf->setCurrency(uCurrencyCode (%s), error) > UErrorCode (%d)\n"), currencyCode, error); - } -#endif - goto LReturn; - } - - minFracDigits = nf->getMinimumFractionDigits(); - -#ifdef INTL_ICU_DEBUG - Output::Print(_u("EntryIntl_CurrencyDigits > nf->getMinimumFractionDigits() successful > returned (%d)\n"), minFracDigits); -#endif - - LReturn: -#ifdef INTL_ICU_DEBUG - Output::Print(_u("EntryIntl_CurrencyDigits > returning (%d)\n"), minFracDigits); -#endif + ICU_RETURN(error, true, fallback); - return minFracDigits; + return nf->getMinimumFractionDigits(); } template - HRESULT CreateFormatter(Func function, _In_z_ const char16 *languageTag, _In_ const charcount_t cch, _Out_ IPlatformAgnosticResource **resource) + HRESULT CreateFormatter(Func formatterFactory, _In_z_ const char16 *languageTag, _In_ const charcount_t cch, _Out_ IPlatformAgnosticResource **resource) { UErrorCode error = UErrorCode::U_ZERO_ERROR; - // Allocate memory for the UTF8 output buffer. Need 3 bytes for each (code point + null) to satisfy SAL. - const size_t inputLangTagUtf8SizeAllocated = AllocSizeMath::Mul(AllocSizeMath::Add(cch, 1), 3); - unsigned char *inputLangTagUtf8 = new unsigned char[inputLangTagUtf8SizeAllocated]; - if (!inputLangTagUtf8) + size_t langtag8Length = 0; + const utf8char_t *langtag8 = Utf16ToUtf8(languageTag, cch, &langtag8Length); + StringBufferAutoPtr guard(langtag8); + CHECK_UTF_CONVERSION(langtag8, E_OUTOFMEMORY); + + // TODO(jahorto): Should this createCanonical instead? + icu::Locale locale = icu::Locale::createFromName(reinterpret_cast(langtag8)); + if (locale.isBogus()) { - AssertOrFailFastMsg(false, "OOM: failed to allocate inputLangTagUtf8."); - return E_OUTOFMEMORY; + return E_INVALIDARG; } - StringBufferAutoPtr guard(inputLangTagUtf8); - memset(inputLangTagUtf8, 0, inputLangTagUtf8SizeAllocated); // explicitly zero the array + icu::NumberFormat *nf = formatterFactory(locale, error); + ICU_ASSERT_RETURN(error, true, E_INVALIDARG); - utf8::EncodeIntoAndNullTerminate(inputLangTagUtf8, languageTag, cch); - - char *localeName = reinterpret_cast(inputLangTagUtf8); - icu::Locale locale = icu::Locale::createFromName(localeName); - - icu::NumberFormat *nf = function(locale, error); - - if (U_FAILURE(error)) + // If the formatter produced a DecimalFormat, force it to round up + icu::DecimalFormat *df = dynamic_cast(nf); + if (df) { - AssertMsg(false, "Creating icu::NumberFormat failed"); - return E_INVALIDARG; + df->setAttribute(UNUM_ROUNDING_MODE, UNUM_ROUND_HALFUP, error); + ICU_ASSERT(error, true); } IPlatformAgnosticResource *formatterResource = new PlatformAgnosticIntlObject(nf); @@ -300,108 +313,86 @@ namespace Intl HRESULT CreateCurrencyFormatter(_In_z_ const char16 *languageTag, _In_ const charcount_t cch, _In_z_ const char16 *currencyCode, _In_ const NumberFormatCurrencyDisplay currencyDisplay, _Out_ IPlatformAgnosticResource **resource) { - UErrorCode error = UErrorCode::U_ZERO_ERROR; - unsigned char *inputLangTagUtf8 = nullptr; - - // Allocate memory for the UTF8 output buffer. Need 3 bytes for each (code point + null) to satisfy SAL. - const size_t inputLangTagUtf8SizeAllocated = AllocSizeMath::Mul(AllocSizeMath::Add(cch, 1), 3); - inputLangTagUtf8 = new unsigned char[inputLangTagUtf8SizeAllocated]; - if (!inputLangTagUtf8) - { - AssertOrFailFastMsg(false, "OOM: failed to allocate inputLangTagUtf8."); - return E_OUTOFMEMORY; - } - - StringBufferAutoPtr guard(inputLangTagUtf8); - memset(inputLangTagUtf8, 0, inputLangTagUtf8SizeAllocated); // explicitly zero the array + return CreateFormatter( + [¤cyDisplay, currencyCode](icu::Locale &locale, UErrorCode &error) -> icu::NumberFormat* + { + icu::NumberFormat *nf = nullptr; + if (currencyDisplay == NumberFormatCurrencyDisplay::SYMBOL || currencyDisplay >= NumberFormatCurrencyDisplay::MAX) + { + // 0 (or default) => use symbol (e.g. "$" or "US$") + nf = icu::NumberFormat::createCurrencyInstance(locale, error); + ICU_ASSERT_RETURN(error, true, nullptr); - utf8::EncodeIntoAndNullTerminate(inputLangTagUtf8, languageTag, cch); + nf->setCurrency(reinterpret_cast(currencyCode), error); // Ctrl-F: UChar_cast_explainer + ICU_ASSERT_RETURN(error, true, nullptr); + } + else if (currencyDisplay == NumberFormatCurrencyDisplay::CODE || currencyDisplay == NumberFormatCurrencyDisplay::NAME) + { + // CODE e.g. "USD 42.00"; NAME (e.g. "42.00 US dollars") + // In both cases we need to be able to format in decimal and add the code or name afterwards. + // We will decide how to do this when platform.formatNumber is invoked (based on currencyDisplay again). + // TODO(doilij): How do we handle which side of the number to put the code or name? Can ICU do this? It doesn't seem clear how at the moment. + nf = icu::NumberFormat::createInstance(locale, error); + ICU_ASSERT_RETURN(error, true, nullptr); + } - char *localeName = reinterpret_cast(inputLangTagUtf8); - icu::Locale locale = icu::Locale::createFromName(localeName); + return nf; + }, + languageTag, + cch, + resource + ); + } - icu::NumberFormat *nf = nullptr; - if (currencyDisplay == NumberFormatCurrencyDisplay::SYMBOL || currencyDisplay >= NumberFormatCurrencyDisplay::MAX) - { - // 0 (or default) => use symbol (e.g. "$" or "US$") - nf = icu::NumberFormat::createCurrencyInstance(locale, error); - if (U_FAILURE(error)) - { - AssertMsg(false, "icu::NumberFormat::createCurrencyInstance failed"); - return E_INVALIDARG; - } + void SetNumberFormatSignificantDigits(IPlatformAgnosticResource *resource, const uint16 minSigDigits, const uint16 maxSigDigits) + { + // We know what actual type we stored in the IPlatformAgnosticResource*, so cast to it. + icu::NumberFormat *nf = UNWRAP_RESOURCE(resource, icu::NumberFormat); - nf->setCurrency(reinterpret_cast(currencyCode), error); // Ctrl-F: UChar_cast_explainer - if (U_FAILURE(error)) - { - AssertMsg(false, "Failed to set currency on icu::NumberFormat"); - return E_INVALIDARG; - } - } - else if (currencyDisplay == NumberFormatCurrencyDisplay::CODE || currencyDisplay == NumberFormatCurrencyDisplay::NAME) + // TODO(jahorto): Determine if we could ever have a NumberFormat that isn't a DecimalFormat (and if so, what to do here) + icu::DecimalFormat *df = dynamic_cast(nf); + if (df) { - // CODE e.g. "USD 42.00"; NAME (e.g. "42.00 US dollars") - // In both cases we need to be able to format in decimal and add the code or name afterwards. - // We will decide how to do this when platform.formatNumber is invoked (based on currencyDisplay again). - // TODO (future) (doilij): How do we handle which side of the number to put the code or name? Can ICU do this? It doesn't seem clear how at the moment. - - nf = icu::NumberFormat::createInstance(locale, error); - if (U_FAILURE(error)) - { - AssertMsg(false, "icu::NumberFormat::createInstance failed"); - return E_INVALIDARG; - } + df->setMinimumSignificantDigits(minSigDigits); + df->setMaximumSignificantDigits(maxSigDigits); } - - if (U_FAILURE(error)) - { - AssertMsg(false, "Creating icu::NumberFormat failed"); - return E_INVALIDARG; - } - - IPlatformAgnosticResource *formatterResource = new PlatformAgnosticIntlObject(nf); - if (!formatterResource) + else { - return E_OUTOFMEMORY; + // if we can't use DecimalFormat-specific features because we didn't get a DecimalFormat, we should not crash. + // Best effort is good enough for Intl outputs, and we'd assume this is a transient issue. + // However, non-DecimalFormat-based output might be regarded as buggy, especially if consistently wrong. + // We'd like to use Debug builds to detect if this is the case and how prevalent it is, and we can make a further determination if and when we see failures here. + AssertMsg(false, "Could not cast an icu::NumberFormat to an icu::DecimalFormat"); } - - *resource = formatterResource; - return S_OK; } - HRESULT SetNumberFormatSignificantDigits(IPlatformAgnosticResource *resource, const uint16 minSigDigits, const uint16 maxSigDigits) + void SetNumberFormatIntFracDigits(IPlatformAgnosticResource *resource, const uint16 minFracDigits, const uint16 maxFracDigits, const uint16 minIntDigits) { // We know what actual type we stored in the IPlatformAgnosticResource*, so cast to it. - auto *numFormatResource = reinterpret_cast *>(resource); - icu::NumberFormat *nf = numFormatResource->GetInstance(); - // REVIEW (doilij): Without RTTI support, we can't do dynamic_cast, - // which is the preferred way to know whether it was indeed created as a DecimalFormat, - // which is not something the API will indicate to us directly (create returns a NumberFormat which may or may not be a DecimalFormat) - icu::DecimalFormat *df = reinterpret_cast(nf); - df->setMinimumSignificantDigits(minSigDigits); - df->setMaximumSignificantDigits(maxSigDigits); - return S_OK; + icu::NumberFormat *nf = UNWRAP_RESOURCE(resource, icu::NumberFormat); + nf->setMinimumIntegerDigits(minIntDigits); + nf->setMinimumFractionDigits(minFracDigits); + nf->setMaximumFractionDigits(maxFracDigits); } - HRESULT SetNumberFormatIntFracDigits(IPlatformAgnosticResource *resource, const uint16 minFracDigits, const uint16 maxFracDigits, const uint16 minIntDigits) + void SetNumberFormatGroupingUsed(IPlatformAgnosticResource *resource, const bool isGroupingUsed) { // We know what actual type we stored in the IPlatformAgnosticResource*, so cast to it. - auto *numFormatResource = reinterpret_cast *>(resource); - icu::NumberFormat *nf = numFormatResource->GetInstance(); - nf->setMinimumIntegerDigits(minIntDigits); - nf->setMinimumFractionDigits(minFracDigits); - nf->setMaximumFractionDigits(maxFracDigits); - return S_OK; + icu::NumberFormat *nf = UNWRAP_RESOURCE(resource, icu::NumberFormat); + nf->setGroupingUsed(isGroupingUsed); } // We explicitly declare these specializations of FormatNumber so the compiler creates them // because they will be used in another compilation unit, // at which time we cannot generate code for specializations of this template. - template const char16 *FormatNumber<>(IPlatformAgnosticResource *formatter, const int32_t val, const NumberFormatStyle formatterToUse, const NumberFormatCurrencyDisplay currencyDisplay, const char16 *currencyCode); - template const char16 *FormatNumber<>(IPlatformAgnosticResource *formatter, const double val, const NumberFormatStyle formatterToUse, const NumberFormatCurrencyDisplay currencyDisplay, const char16 *currencyCode); + template const char16 *FormatNumber<>(IPlatformAgnosticResource *formatter, const int32_t val, const NumberFormatStyle formatterToUse, + const NumberFormatCurrencyDisplay currencyDisplay, const char16 *currencyCode); + template const char16 *FormatNumber<>(IPlatformAgnosticResource *formatter, const double val, const NumberFormatStyle formatterToUse, + const NumberFormatCurrencyDisplay currencyDisplay, const char16 *currencyCode); template - const char16 *FormatNumber(IPlatformAgnosticResource *formatter, const T val, const NumberFormatStyle formatterToUse, const NumberFormatCurrencyDisplay currencyDisplay, const char16 *currencyCode) + const char16 *FormatNumber(IPlatformAgnosticResource *formatter, const T val, const NumberFormatStyle formatterToUse, + const NumberFormatCurrencyDisplay currencyDisplay, const char16 *currencyCode) { icu::UnicodeString result; @@ -425,11 +416,7 @@ namespace Intl const UChar *uCurrencyCode = reinterpret_cast(currencyCode); // Ctrl-F: UChar_cast_explainer const char *localeName = numberFormatter->getLocale(ULocDataLocaleType::ULOC_ACTUAL_LOCALE, error).getName(); - - if (U_FAILURE(error)) - { - AssertMsg(false, "numberFormatter->getLocale failed"); - } + ICU_ASSERT(error, true); UBool isChoiceFormat = false; int32_t currencyNameLen = 0; @@ -449,11 +436,7 @@ namespace Intl { const char *pluralCount = nullptr; // REVIEW (doilij): is this okay? It's not entirely clear from the documentation whether this is an optional parameter. const UChar *currencyLongName = ucurr_getPluralName(uCurrencyCode, localeName, &isChoiceFormat, pluralCount, ¤cyNameLen, &error); - - if (U_FAILURE(error)) - { - AssertMsg(false, "Failed to format"); - } + ICU_ASSERT(error, true); numberFormatter->format(val, result); result.append(" "); @@ -493,33 +476,19 @@ namespace Intl char defaultLocaleId[ULOC_FULLNAME_CAPACITY] = { 0 }; int32_t written = uloc_getName(nullptr, defaultLocaleId, ULOC_FULLNAME_CAPACITY, &error); - if (U_SUCCESS(error) && written > 0 && written < ULOC_FULLNAME_CAPACITY) - { - defaultLocaleId[written] = 0; - error = UErrorCode::U_ZERO_ERROR; - } - else - { - AssertMsg(false, "uloc_getName: unexpected error getting default localeId"); - return 0; - } + ICU_ASSERT_RETURN(error, written > 0 && written < ULOC_FULLNAME_CAPACITY, 0); + + defaultLocaleId[written] = 0; + error = UErrorCode::U_ZERO_ERROR; written = uloc_toLanguageTag(defaultLocaleId, bcp47, ULOC_FULLNAME_CAPACITY, true, &error); - if (U_FAILURE(error) || written <= 0) - { - AssertMsg(false, "uloc_toLanguageTag: unexpected error getting default langtag"); - return 0; - } + ICU_ASSERT_RETURN(error, written > 0 && written < cchLangtag, 0); - if (written < cchLangtag) - { - return utf8::DecodeUnitsIntoAndNullTerminateNoAdvance(langtag, reinterpret_cast(bcp47), reinterpret_cast(bcp47 + written)); - } - else - { - AssertMsg(false, "User default language tag is larger than the provided buffer"); - return 0; - } + return utf8::DecodeUnitsIntoAndNullTerminateNoAdvance( + langtag, + reinterpret_cast(bcp47), + reinterpret_cast(bcp47 + written) + ); } } // namespace Intl } // namespace PlatformAgnostic diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/SystemInfo.Common.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/SystemInfo.Common.cpp index 2b67a0c6f60..8b9d37d911c 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/SystemInfo.Common.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/SystemInfo.Common.cpp @@ -6,6 +6,7 @@ #include "RuntimePlatformAgnosticPch.h" #include "../../Common/Core/CommonTypedefs.h" #include "../../Common/PlatformAgnostic/SystemInfo.h" +#include "../../../../Common/Codex/Utf8Codex.h" #if defined(__APPLE__) #include // _NSGetExecutablePath @@ -15,7 +16,7 @@ namespace PlatformAgnostic { - void SystemInfo::GetBinaryLocation(char *path, const unsigned size) + bool SystemInfo::GetBinaryLocation(char *path, const unsigned size) { // TODO: make AssertMsg available under PlatformAgnostic //AssertMsg(path != nullptr, "Path can not be nullptr"); @@ -27,7 +28,7 @@ namespace PlatformAgnostic if (_NSGetExecutablePath(path, &path_size)) { SET_BINARY_PATH_ERROR_MESSAGE(path, "GetBinaryLocation: _NSGetExecutablePath has failed."); - return; + return false; } tmp = (char*)malloc(size); @@ -36,17 +37,37 @@ namespace PlatformAgnostic memcpy(path, result, str_len); free(tmp); path[str_len] = char(0); + return true; #elif defined(__linux__) int str_len = readlink("/proc/self/exe", path, size - 1); if (str_len <= 0) { SET_BINARY_PATH_ERROR_MESSAGE(path, "GetBinaryLocation: /proc/self/exe has failed."); - return; + return false; } path[str_len] = char(0); + return true; #else #warning "Implement GetBinaryLocation for this platform" #endif } + bool SystemInfo::GetBinaryLocation(char16 *path, const unsigned size) + { + int tmp_size = size * 3; + char *tmp = (char*)malloc(tmp_size); + if (!GetBinaryLocation(tmp, tmp_size)) + { + free(tmp); + return false; + } + if (utf8::DecodeUnitsIntoAndNullTerminate(path, (LPCUTF8&)tmp, (LPCUTF8)tmp + strlen(tmp)) <= 0) + { + free(tmp); + wcscpy_s(path, size, _u("GetBinaryLocation: DecodeUnitsIntoAndNullTerminate has failed.")); + return false; + } + free(tmp); + return true; + } } // namespace PlatformAgnostic diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/Trace.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/Trace.cpp index a4f00267d0c..2a926b0be16 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/Trace.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/Trace.cpp @@ -213,7 +213,7 @@ CLOSE_TRACE_FILE () { print_to_buffer(nullptr, 0); // force flush fclose(FTRACE); - printf("\nTrace output is available under ./TraceOutput.txt\n"); + Output::Print(_u("\nTrace output is available under ./TraceOutput.txt\n")); } #endif IN_TRACE = 0; diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/UnicodeText.Common.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/UnicodeText.Common.cpp index d2a0f264de1..ff75536f297 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/UnicodeText.Common.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Common/UnicodeText.Common.cpp @@ -15,10 +15,10 @@ CharacterTypeFlags GetLegacyCharacterTypeFlags(char16 ch) { Assert(ch >= 128); - const char16 lineSeperatorChar = 0x2028; - const char16 paraSeperatorChar = 0x2029; + const char16 lineSeparatorChar = 0x2028; + const char16 paraSeparatorChar = 0x2029; - if (ch == lineSeperatorChar || ch == paraSeperatorChar) + if (ch == lineSeparatorChar || ch == paraSeparatorChar) { return LineCharGroup; } @@ -195,7 +195,7 @@ void LogicalStringCompareTest(const WCHAR* str1, const WCHAR* str2, int expected if (compareStringResult == 0) { - printf("ERROR: CompareStringW failed with error: %d\n", ::GetLastError()); + Output::Print(_u("ERROR: CompareStringW failed with error: %d\n"), ::GetLastError()); return; } @@ -206,77 +206,77 @@ void LogicalStringCompareTest(const WCHAR* str1, const WCHAR* str2, int expected if (compareStringResult != expected) { - wprintf(L"WARNING: Incorrect expected value: %d, actual: %d\n", expected, compareStringResult); + Output::Print(_u("WARNING: Incorrect expected value: %d, actual: %d\n"), expected, compareStringResult); } if (passed) { - wprintf(L"[%s]\n", L"PASS"); + Output::Print(_u("[PASS]\n")); } else { - wprintf(L"[%s] Expected: %d, Actual: %d)\n", L"FAIL", expected, res); + Output::Print(_u("[FAIL] Expected: %d, Actual: %d)\n"), expected, res); } } void doLogicalStringTests() { - LogicalStringCompareTest(L"a", L"a", 0); - LogicalStringCompareTest(L"a", L"b", -1); - LogicalStringCompareTest(L"b", L"a", 1); - - LogicalStringCompareTest(L"a", L"A", 0); - LogicalStringCompareTest(L"a", L"B", -1); - LogicalStringCompareTest(L"b", L"A", 1); - - LogicalStringCompareTest(L"1", L"2", -1); - LogicalStringCompareTest(L"2", L"1", 1); - - LogicalStringCompareTest(L"10", L"01", 1); - LogicalStringCompareTest(L"01", L"10", -1); - - LogicalStringCompareTest(L"01", L"1", -1); - LogicalStringCompareTest(L"1", L"01", 1); - - LogicalStringCompareTest(L"1a", L"a1", -1); - LogicalStringCompareTest(L"aa1", L"a1", 1); - LogicalStringCompareTest(L"a1", L"a1", 0); - LogicalStringCompareTest(L"a1", L"b1", -1); - LogicalStringCompareTest(L"b1", L"a1", 1); - LogicalStringCompareTest(L"a1", L"a2", -1); - LogicalStringCompareTest(L"a10", L"a2", 1); - LogicalStringCompareTest(L"a2", L"a10", -1); - - LogicalStringCompareTest(L"A1", L"a1", 0); - LogicalStringCompareTest(L"A1", L"b1", -1); - LogicalStringCompareTest(L"B1", L"a1", 1); - LogicalStringCompareTest(L"A1", L"a2", -1); - LogicalStringCompareTest(L"A10", L"a2", 1); - LogicalStringCompareTest(L"A2", L"a10", -1); - - LogicalStringCompareTest(L"123", L"456", -1); - LogicalStringCompareTest(L"456", L"123", 1); - LogicalStringCompareTest(L"abc123", L"def123", -1); - LogicalStringCompareTest(L"abc123", L"abc123", 0); - LogicalStringCompareTest(L"abc123", L"abc0123", 1); - LogicalStringCompareTest(L"abc123", L"abc124", -1); - LogicalStringCompareTest(L"abc124", L"abc123", 1); - - LogicalStringCompareTest(L"abc123def", L"abc123def", 0); - LogicalStringCompareTest(L"abc123def", L"abc123eef", -1); - LogicalStringCompareTest(L"abc123eef", L"abc123def", 1); - - LogicalStringCompareTest(L"abc1def", L"abc10def", -1); - LogicalStringCompareTest(L"abc1def1", L"abc1def12", -1); - - LogicalStringCompareTest(L"2string", L"3string", -1); - LogicalStringCompareTest(L"20string", L"3string", 1); - LogicalStringCompareTest(L"20string", L"st2ring", -1); - LogicalStringCompareTest(L"st3ring", L"st2ring", 1); - - LogicalStringCompareTest(L"2String", L"3string", -1); - LogicalStringCompareTest(L"20String", L"3string", 1); - LogicalStringCompareTest(L"20sTRing", L"st2ring", -1); - LogicalStringCompareTest(L"st3rING", L"st2riNG", 1); + LogicalStringCompareTest(_u("a"), _u("a"), 0); + LogicalStringCompareTest(_u("a"), _u("b"), -1); + LogicalStringCompareTest(_u("b"), _u("a"), 1); + + LogicalStringCompareTest(_u("a"), _u("A"), 0); + LogicalStringCompareTest(_u("a"), _u("B"), -1); + LogicalStringCompareTest(_u("b"), _u("A"), 1); + + LogicalStringCompareTest(_u("1"), _u("2"), -1); + LogicalStringCompareTest(_u("2"), _u("1"), 1); + + LogicalStringCompareTest(_u("10"), _u("01"), 1); + LogicalStringCompareTest(_u("01"), _u("10"), -1); + + LogicalStringCompareTest(_u("01"), _u("1"), -1); + LogicalStringCompareTest(_u("1"), _u("01"), 1); + + LogicalStringCompareTest(_u("1a"), _u("a1"), -1); + LogicalStringCompareTest(_u("aa1"), _u("a1"), 1); + LogicalStringCompareTest(_u("a1"), _u("a1"), 0); + LogicalStringCompareTest(_u("a1"), _u("b1"), -1); + LogicalStringCompareTest(_u("b1"), _u("a1"), 1); + LogicalStringCompareTest(_u("a1"), _u("a2"), -1); + LogicalStringCompareTest(_u("a10"), _u("a2"), 1); + LogicalStringCompareTest(_u("a2"), _u("a10"), -1); + + LogicalStringCompareTest(_u("A1"), _u("a1"), 0); + LogicalStringCompareTest(_u("A1"), _u("b1"), -1); + LogicalStringCompareTest(_u("B1"), _u("a1"), 1); + LogicalStringCompareTest(_u("A1"), _u("a2"), -1); + LogicalStringCompareTest(_u("A10"), _u("a2"), 1); + LogicalStringCompareTest(_u("A2"), _u("a10"), -1); + + LogicalStringCompareTest(_u("123"), _u("456"), -1); + LogicalStringCompareTest(_u("456"), _u("123"), 1); + LogicalStringCompareTest(_u("abc123"), _u("def123"), -1); + LogicalStringCompareTest(_u("abc123"), _u("abc123"), 0); + LogicalStringCompareTest(_u("abc123"), _u("abc0123"), 1); + LogicalStringCompareTest(_u("abc123"), _u("abc124"), -1); + LogicalStringCompareTest(_u("abc124"), _u("abc123"), 1); + + LogicalStringCompareTest(_u("abc123def"), _u("abc123def"), 0); + LogicalStringCompareTest(_u("abc123def"), _u("abc123eef"), -1); + LogicalStringCompareTest(_u("abc123eef"), _u("abc123def"), 1); + + LogicalStringCompareTest(_u("abc1def"), _u("abc10def"), -1); + LogicalStringCompareTest(_u("abc1def1"), _u("abc1def12"), -1); + + LogicalStringCompareTest(_u("2string"), _u("3string"), -1); + LogicalStringCompareTest(_u("20string"), _u("3string"), 1); + LogicalStringCompareTest(_u("20string"), _u("st2ring"), -1); + LogicalStringCompareTest(_u("st3ring"), _u("st2ring"), 1); + + LogicalStringCompareTest(_u("2String"), _u("3string"), -1); + LogicalStringCompareTest(_u("20String"), _u("3string"), 1); + LogicalStringCompareTest(_u("20sTRing"), _u("st2ring"), -1); + LogicalStringCompareTest(_u("st3rING"), _u("st2riNG"), 1); } #endif diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/PerfTrace.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/PerfTrace.cpp index 1954fb94aa9..0ea93df8a0e 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/PerfTrace.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/PerfTrace.cpp @@ -12,6 +12,7 @@ using namespace Js; +#if PERFMAP_TRACE_ENABLED // // Handle the SIGUSR2 signal by setting a flag // indicating that we should call WritePerfMap later on @@ -25,13 +26,12 @@ namespace PlatformAgnostic { volatile sig_atomic_t PerfTrace::mapsRequested = 0; - + // -// Registers a signal handler for SIGUSR2 +// Registers a signal handler for SIGUSR2 // void PerfTrace::Register() { -#if PERFMAP_TRACE_ENABLED struct sigaction newAction = {0}; newAction.sa_flags = SA_RESTART; newAction.sa_handler = handle_signal; @@ -43,7 +43,6 @@ void PerfTrace::Register() { AssertMsg(errno, "PerfTrace::Register: sigaction() call failed\n"); } -#endif } void PerfTrace::WritePerfMap() @@ -150,3 +149,4 @@ void PerfTrace::WritePerfMap() } +#endif // PERFMAP_TRACE_ENABLED \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/SystemInfo.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/SystemInfo.cpp index 55c6cc29c29..e2b044351fb 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/SystemInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/SystemInfo.cpp @@ -5,26 +5,10 @@ #include "Common.h" #include "ChakraPlatform.h" -#include #include namespace PlatformAgnostic { - SystemInfo::PlatformData SystemInfo::data; - - SystemInfo::PlatformData::PlatformData() - { - struct sysinfo systemInfo; - if (sysinfo(&systemInfo) == -1) - { - totalRam = 0; - } - else - { - totalRam = systemInfo.totalram; - } - } - bool SystemInfo::GetMaxVirtualMemory(size_t *totalAS) { struct rlimit limit; diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/UnicodeText.ICU.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/UnicodeText.ICU.cpp index ecc66c63305..76d10bf5040 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/UnicodeText.ICU.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Linux/UnicodeText.ICU.cpp @@ -26,10 +26,6 @@ namespace PlatformAgnostic { namespace UnicodeText { -#if DBG - static UErrorCode g_lastErrorCode = U_ZERO_ERROR; -#endif - static_assert(sizeof(char16) == sizeof(UChar), "This implementation depends on ICU char size matching char16's size"); @@ -119,10 +115,6 @@ namespace PlatformAgnostic static ApiError TranslateUErrorCode(UErrorCode icuError) { -#if DBG - g_lastErrorCode = icuError; -#endif - switch (icuError) { case U_BUFFER_OVERFLOW_ERROR: @@ -263,8 +255,7 @@ namespace PlatformAgnostic // Return insufficient buffer in that case return resultStringLength; } -#else - +#else // HAS_REAL_ICU bool IsWhitespace(codepoint_t ch) { if (ch > 127) @@ -283,25 +274,41 @@ namespace PlatformAgnostic return true; } -#define EMPTY_COPY \ - const int len = (destLength <= sourceLength) ? destLength - 1 : sourceLength; \ - memcpy(destString, sourceString, len * sizeof(char16)); \ - destString[len] = char16(0); \ - *pErrorOut = NoError; \ - return len; +#define minm(a,b) ((a < b) ? a : b) int32 NormalizeString(NormalizationForm normalizationForm, const char16* sourceString, uint32 sourceLength, char16* destString, int32 destLength, ApiError* pErrorOut) { - // TODO: implement this - EMPTY_COPY + *pErrorOut = ApiError::NoError; + if (destString == nullptr) + { + return sourceLength; + } + + int32 len = (int32) minm(minm(destLength, sourceLength), INT_MAX); + memcpy(destString, sourceString, len * sizeof(char16)); + + return len; } +typedef WCHAR (*ToUPorLOW)(WCHAR); int32 ChangeStringLinguisticCase(CaseFlags caseFlags, const char16* sourceString, uint32 sourceLength, char16* destString, uint32 destLength, ApiError* pErrorOut) { - // TODO: implement this - EMPTY_COPY + *pErrorOut = ApiError::NoError; + if (destString == nullptr) + { + return sourceLength; + } + + int32 len = (int32) minm(minm(destLength, sourceLength), INT_MAX); + ToUPorLOW fnc = caseFlags == CaseFlagsLower ? PAL_towlower : PAL_towupper; + for (int32 i = 0; i < len; i++) + { + destString[i] = fnc(sourceString[i]); + } + + return len; } -#endif +#endif // HAS_REAL_ICU bool IsIdStart(codepoint_t ch) { @@ -378,7 +385,7 @@ namespace PlatformAgnostic } } return bufferLength; -#else +#else // HAS_REAL_ICU // Assert pointers Assert(stringToChange != nullptr); ApiError error = NoError; @@ -394,7 +401,7 @@ namespace PlatformAgnostic Assert(error == ApiError::NoError); Assert(ret > 0); return (uint32) ret; -#endif +#endif // HAS_REAL_ICU } int LogicalStringCompare(const char16* string1, const char16* string2) @@ -439,8 +446,34 @@ namespace PlatformAgnostic { return UnicodeGeneralCategoryClass::CategoryClassSpaceSeparator; } - // todo-xplat: implement the others ? -#else + + if (ispunct((int)ch)) + { + return UnicodeGeneralCategoryClass::CategoryClassConnectorPunctuation; + } + + // for the rest of the ``combining chars``, return CategoryClassSpaceSeparator + // consider this approach as a fallback mechnanism. + // since, this function returns CategoryClassLetter for everything else. + if ((ch >= 836 && ch <= 846) || ch == 810) // U+32A || U+346 <= ch <= U+34E + { + return UnicodeGeneralCategoryClass::CategoryClassSpaceSeparator; + } + + if (ch >= 768 && ch <= 879) // U+300 <= ch <= U+36F (version 1.0) + { + return UnicodeGeneralCategoryClass::CategoryClassSpaceSeparator; + } + + if (ch >= 6832 && ch <= 6911) // U+1AB0 <= ch <= U+1AFF (version 7.0) + { + return UnicodeGeneralCategoryClass::CategoryClassSpaceSeparator; + } + + // default to letter since we don't identify unicode letters + // xplat-todo: can we do this better? + return UnicodeGeneralCategoryClass::CategoryClassLetter; +#else // HAS_REAL_ICU int8_t charType = u_charType(ch); if (charType == U_LOWERCASE_LETTER || @@ -487,8 +520,9 @@ namespace PlatformAgnostic { return UnicodeGeneralCategoryClass::CategoryClassConnectorPunctuation; } -#endif + return UnicodeGeneralCategoryClass::CategoryClassOther; +#endif // HAS_REAL_ICU } // We actually don't care about the legacy behavior on Linux since no one diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Unix/SystemInfo.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Unix/SystemInfo.cpp index 84691c060ed..419a4a8395c 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Unix/SystemInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Unix/SystemInfo.cpp @@ -9,20 +9,6 @@ namespace PlatformAgnostic { - SystemInfo::PlatformData SystemInfo::data; - - SystemInfo::PlatformData::PlatformData() - { - // Get Total Ram - int totalRamHW [] = { CTL_HW, HW_MEMSIZE }; - - size_t length = sizeof(size_t); - if(sysctl(totalRamHW, 2, &totalRam, &length, NULL, 0) == -1) - { - totalRam = 0; - } - } - bool SystemInfo::GetMaxVirtualMemory(size_t *totalAS) { struct rlimit limit; diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/DateTime.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/DateTime.cpp index 97cf2a1daf8..c8a1f454f64 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/DateTime.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/DateTime.cpp @@ -75,17 +75,25 @@ namespace DateTime // class TimeZoneInfo ****** // Cache should be invalid at the moment of creation - // if january1 > nextJanuary1 cache is always invalid, so we don't care about other fields, because cache will be updated. - TimeZoneInfo::TimeZoneInfo() + // if january1 > nextJanuary1, the cache will be considered invalid + TimeZoneInfo::TimeZoneInfo() : + daylightDate(0.0), + standardDate(0.0), + january1(1.0), + nextJanuary1(0.0), + daylightBias(0), + standardBias(0), + bias(0), + lastUpdateTickCount(0), + isDaylightTimeApplicable(false), + isJanuary1Critical(false) { - january1 = 1; - nextJanuary1 = 0; } // Cache is valid for given time if this time is within a year for which cache was created, and cache was updated within 1 second of current moment bool TimeZoneInfo::IsValid(const double time) { - return GetTickCount() - lastUpdateTickCount < updatePeriod && time >= january1 && time < nextJanuary1; + return time >= january1 && time < nextJanuary1 && GetTickCount() - lastUpdateTickCount < updatePeriod; } void TimeZoneInfo::Update(const double inputTime) diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/PerfTrace.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/PerfTrace.cpp index 4d7111a02be..70c9b943b68 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/PerfTrace.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/PerfTrace.cpp @@ -6,6 +6,7 @@ #include "ChakraPlatform.h" +#if PERFMAP_TRACE_ENABLED using namespace Js; @@ -13,7 +14,7 @@ namespace PlatformAgnostic { volatile sig_atomic_t PerfTrace::mapsRequested = 0; - + void PerfTrace::Register() { // TODO: Implement this on Windows? @@ -25,3 +26,5 @@ void PerfTrace::WritePerfMap() } } + +#endif // PERFMAP_TRACE_ENABLED \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/SystemInfo.cpp b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/SystemInfo.cpp index 30403b0ce37..c08b1f0a366 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/SystemInfo.cpp +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/Platform/Windows/SystemInfo.cpp @@ -9,17 +9,6 @@ namespace PlatformAgnostic { - SystemInfo::PlatformData SystemInfo::data; - - SystemInfo::PlatformData::PlatformData() - { - ULONGLONG ram; - if (GetPhysicallyInstalledSystemMemory(&ram) == TRUE) - { - totalRam = static_cast(ram) * 1024; - } - } - bool SystemInfo::GetMaxVirtualMemory(size_t *totalAS) { SYSTEM_INFO info; diff --git a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/RuntimePlatformAgnosticPch.h b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/RuntimePlatformAgnosticPch.h index f0ddcf7f19e..e0c79b8bcf3 100644 --- a/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/RuntimePlatformAgnosticPch.h +++ b/deps/chakrashim/core/lib/Runtime/PlatformAgnostic/RuntimePlatformAgnosticPch.h @@ -5,7 +5,6 @@ #pragma once #ifdef _WIN32 -#include "CommonDefines.h" #include "CommonMin.h" #else #include "pal.h" diff --git a/deps/chakrashim/core/lib/Runtime/Runtime.h b/deps/chakrashim/core/lib/Runtime/Runtime.h index 353c89099da..25bf2898973 100644 --- a/deps/chakrashim/core/lib/Runtime/Runtime.h +++ b/deps/chakrashim/core/lib/Runtime/Runtime.h @@ -9,6 +9,7 @@ //======================== // Parser includes //======================== +#include "Parser.h" #include "ParserCommon.h" #include "ParseFlags.h" #include "rterror.h" @@ -122,7 +123,6 @@ namespace Js struct JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper; class JavascriptGenerator; class LiteralString; - class ArenaLiteralString; class JavascriptStringObject; struct PropertyDescriptor; class Type; @@ -202,6 +202,7 @@ namespace Js class JavascriptGeneratorFunction; class JavascriptAsyncFunction; class AsmJsScriptFunction; + class WasmScriptFunction; class JavascriptRegExpConstructor; class JavascriptRegExpEnumerator; class BoundFunction; @@ -261,6 +262,8 @@ namespace Js class PolymorphicInlineCacheInfo; class PropertyGuard; + class DetachedStateBase; + // asm.js namespace ArrayBufferView { @@ -352,10 +355,20 @@ class SourceContextInfo; #if defined(ENABLE_SCRIPT_DEBUGGING) && defined(_WIN32) #include "activdbg100.h" +#else +#define SCRIPT_E_RECORDED _HRESULT_TYPEDEF_(0x86664004L) +#define NEED_DEBUG_EVENT_INFO_TYPE #endif #ifndef NTDDI_WIN10 // These are only defined for the Win10 SDK and above +#define NEED_DEBUG_EVENT_INFO_TYPE +#define SDO_ENABLE_LIBRARY_STACK_FRAME ((SCRIPT_DEBUGGER_OPTIONS)0x8) +#define DBGPROP_ATTRIB_VALUE_IS_RETURN_VALUE 0x8000000 +#define DBGPROP_ATTRIB_VALUE_PENDING_MUTATION 0x10000000 +#endif + +#ifdef NEED_DEBUG_EVENT_INFO_TYPE // Consider: Refactor to avoid needing these? typedef enum tagDEBUG_EVENT_INFO_TYPE @@ -365,16 +378,13 @@ enum tagDEBUG_EVENT_INFO_TYPE DEIT_ASMJS_SUCCEEDED = (DEIT_ASMJS_IN_DEBUGGING + 1), DEIT_ASMJS_FAILED = (DEIT_ASMJS_SUCCEEDED + 1) } DEBUG_EVENT_INFO_TYPE; - -#define SDO_ENABLE_LIBRARY_STACK_FRAME ((SCRIPT_DEBUGGER_OPTIONS)0x8) -#define DBGPROP_ATTRIB_VALUE_IS_RETURN_VALUE 0x8000000 -#define DBGPROP_ATTRIB_VALUE_PENDING_MUTATION 0x10000000 #endif #include "../JITIDL/JITTypes.h" #include "../JITClient/JITManager.h" #include "Base/SourceHolder.h" +#include "Base/LineOffsetCache.h" #include "Base/Utf8SourceInfo.h" #include "Base/PropertyRecord.h" #ifdef ENABLE_GLOBALIZATION @@ -384,10 +394,9 @@ enum tagDEBUG_EVENT_INFO_TYPE #include "Language/ExecutionMode.h" #include "Types/TypeId.h" -#include "BackendApi.h" -#include "DetachedStateBase.h" - #include "Base/Constants.h" +#include "Language/ConstructorCache.h" +#include "BackendApi.h" #include "ByteCode/OpLayoutsCommon.h" #include "ByteCode/OpLayouts.h" #include "ByteCode/OpLayoutsAsmJs.h" @@ -416,7 +425,7 @@ enum tagDEBUG_EVENT_INFO_TYPE #include "Base/TempArenaAllocatorObject.h" #include "Language/ValueType.h" #include "Language/DynamicProfileInfo.h" -#include "Debug/SourceContextInfo.h" +#include "Base/SourceContextInfo.h" #include "Language/InlineCache.h" #include "Language/InlineCachePointerArray.h" #include "Base/FunctionInfo.h" @@ -513,6 +522,7 @@ enum tagDEBUG_EVENT_INFO_TYPE #include "Library/JavascriptArray.h" #include "Library/AtomicsObject.h" +#include "DetachedStateBase.h" #include "Library/ArrayBuffer.h" #include "Library/SharedArrayBuffer.h" #include "Library/TypedArray.h" diff --git a/deps/chakrashim/core/lib/Runtime/SerializableFunctionFields.h b/deps/chakrashim/core/lib/Runtime/SerializableFunctionFields.h index 5463a7614b2..e9a088de5ab 100644 --- a/deps/chakrashim/core/lib/Runtime/SerializableFunctionFields.h +++ b/deps/chakrashim/core/lib/Runtime/SerializableFunctionFields.h @@ -13,7 +13,11 @@ #endif #ifndef DECLARE_SERIALIZABLE_ACCESSOR_FIELD -#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD(type, name, serializableType) +#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD(type, name, serializableType, defaultValue) +#endif + +#ifndef DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK +#define DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK(type, name, serializableType) #endif #ifndef DECLARE_TAG_FIELD @@ -52,13 +56,13 @@ CURRENT_ACCESS_MODIFIER #if DEFINE_FUNCTION_BODY_FIELDS PUBLIC_FIELDS - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, VarCount, RegSlot); // Count of non-constant locals - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, ConstantCount, RegSlot); // Count of enregistered constants - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, FirstTmpRegister, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, OutParamMaxDepth, RegSlot); // Count of call depth in a nested expression - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ByteCodeCount, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ByteCodeWithoutLDACount, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ByteCodeInLoopCount, UInt32); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, VarCount, RegSlot, 0); // Count of non-constant locals + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, ConstantCount, RegSlot, 0); // Count of enregistered constants + DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK(RegSlot, FirstTmpRegister, RegSlot); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, OutParamMaxDepth, RegSlot, 0); // Count of call depth in a nested expression + DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK(uint, ByteCodeCount, RegSlot); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK(uint, ByteCodeWithoutLDACount, RegSlot); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ByteCodeInLoopCount, UInt32, 0); DECLARE_SERIALIZABLE_FIELD(uint16, m_envDepth, UInt16); DECLARE_SERIALIZABLE_FIELD(uint16, m_argUsedForBranch, UInt16); @@ -71,31 +75,31 @@ PRIVATE_FIELDS DECLARE_SERIALIZABLE_FIELD(ProfileId, profiledSwitchCount, UInt16); DECLARE_SERIALIZABLE_FIELD(ProfileId, profiledReturnTypeCount, UInt16); DECLARE_SERIALIZABLE_FIELD(ProfileId, profiledSlotCount, UInt16); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, LoopCount, RegSlot); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, LoopCount, RegSlot, 0); DECLARE_TAG_FIELD(bool, m_tag31, Bool); // Used to tag the low bit to prevent possible GC false references DECLARE_SERIALIZABLE_FIELD(bool, m_hasFinally, Bool); DECLARE_SERIALIZABLE_FIELD(bool, hasScopeObject, Bool); DECLARE_SERIALIZABLE_FIELD(bool, hasCachedScopePropIds, Bool); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ForInLoopDepth, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, InlineCacheCount, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, RootObjectLoadInlineCacheStart, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, RootObjectLoadMethodInlineCacheStart, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, RootObjectStoreInlineCacheStart, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, IsInstInlineCacheCount, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ReferencedPropertyIdCount, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ObjLiteralCount, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, LiteralRegexCount, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, InnerScopeCount, UInt32); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(ProfileId, ProfiledForInLoopCount, UInt16); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, LocalClosureRegister, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, ParamClosureRegister, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, LocalFrameDisplayRegister, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, EnvRegister, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, ThisRegisterForEventHandler, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, FirstInnerScopeRegister, RegSlot); - DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, FuncExprScopeRegister, RegSlot); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ForInLoopDepth, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, InlineCacheCount, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, RootObjectLoadInlineCacheStart, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, RootObjectLoadMethodInlineCacheStart, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, RootObjectStoreInlineCacheStart, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, IsInstInlineCacheCount, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ReferencedPropertyIdCount, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, ObjLiteralCount, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, LiteralRegexCount, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, InnerScopeCount, UInt32, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(ProfileId, ProfiledForInLoopCount, UInt16, 0); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, LocalClosureRegister, RegSlot, Constants::NoRegister); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, ParamClosureRegister, RegSlot, Constants::NoRegister); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, LocalFrameDisplayRegister, RegSlot, Constants::NoRegister); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, EnvRegister, RegSlot, Constants::NoRegister); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, ThisRegisterForEventHandler, RegSlot, Constants::NoRegister); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, FirstInnerScopeRegister, RegSlot, Constants::NoRegister); + DECLARE_SERIALIZABLE_ACCESSOR_FIELD(RegSlot, FuncExprScopeRegister, RegSlot, Constants::NoRegister); CURRENT_ACCESS_MODIFIER #endif @@ -106,7 +110,8 @@ CURRENT_ACCESS_MODIFIER #undef CURRENT_ACCESS_MODIFIER #undef DECLARE_SERIALIZABLE_FIELD #undef DECLARE_SERIALIZABLE_ACCESSOR_FIELD +#undef DECLARE_SERIALIZABLE_ACCESSOR_FIELD_NO_CHECK #undef PROTECTED_FIELDS #undef PRIVATE_FIELDS #undef PUBLIC_FIELDS -#undef DECLARE_TAG_FIELD +#undef DECLARE_TAG_FIELD \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Types/ActivationObject.cpp b/deps/chakrashim/core/lib/Runtime/Types/ActivationObject.cpp index ee3d301286d..1a1e9a6e937 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/ActivationObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/ActivationObject.cpp @@ -141,7 +141,9 @@ namespace Js BlockActivationObject* BlockActivationObject::Clone(ScriptContext *scriptContext) { DynamicType* type = this->GetDynamicType(); +#if ENABLE_FIXED_FIELDS type->GetTypeHandler()->ClearSingletonInstance(); //We are going to share the type. +#endif BlockActivationObject* blockScopeClone = DynamicObject::NewObject(scriptContext->GetRecycler(), type); int slotCapacity = this->GetTypeHandler()->GetSlotCapacity(); diff --git a/deps/chakrashim/core/lib/Runtime/Types/ActivationObject.h b/deps/chakrashim/core/lib/Runtime/Types/ActivationObject.h index af0bb4f9c73..e0548ea0bd1 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/ActivationObject.h +++ b/deps/chakrashim/core/lib/Runtime/Types/ActivationObject.h @@ -62,7 +62,7 @@ namespace Js } static BlockActivationObject* FromVar(Var value) { - Assert(BlockActivationObject::Is(value)); + AssertOrFailFast(BlockActivationObject::Is(value)); return static_cast(DynamicObject::FromVar(value)); } diff --git a/deps/chakrashim/core/lib/Runtime/Types/ArrayObject.h b/deps/chakrashim/core/lib/Runtime/Types/ArrayObject.h index 0cfc6044c9f..f50f0d10b45 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/ArrayObject.h +++ b/deps/chakrashim/core/lib/Runtime/Types/ArrayObject.h @@ -6,7 +6,7 @@ namespace Js { -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 // This base class has a 4-byte length field. Change struct pack to 4 on 64bit to avoid 4 padding bytes here. #pragma pack(push, 4) #endif @@ -51,7 +51,7 @@ namespace Js virtual JavascriptEnumerator * GetIndexEnumerator(EnumeratorFlags flags, ScriptContext* requestContext) = 0; }; -#ifdef _M_X64_OR_ARM64 +#ifdef TARGET_64 #pragma pack(pop) #endif diff --git a/deps/chakrashim/core/lib/Runtime/Types/DeferredTypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/DeferredTypeHandler.cpp index 65142aa4cfc..0a83e7bb7fd 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DeferredTypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/DeferredTypeHandler.cpp @@ -83,8 +83,9 @@ namespace Js // Create new type handler, allowing slotCapacity round up here. We'll allocate instance slots below. T* newTypeHandler = T::New(recycler, initSlotCapacity, GetInlineSlotCapacity(), GetOffsetOfInlineSlots()); +#if ENABLE_FIXED_FIELDS newTypeHandler->SetSingletonInstanceIfNeeded(instance); - +#endif // EnsureSlots before updating the type handler and instance, as EnsureSlots allocates and may throw. instance->EnsureSlots(0, newTypeHandler->GetSlotCapacity(), scriptContext, newTypeHandler); newTypeHandler->SetFlags(IsPrototypeFlag, this->GetFlags()); diff --git a/deps/chakrashim/core/lib/Runtime/Types/DeferredTypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/DeferredTypeHandler.h index 3ee524a6740..27c40fb4339 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DeferredTypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/DeferredTypeHandler.h @@ -74,7 +74,7 @@ namespace Js DEFINE_GETCPPNAME(); private: - DeferredTypeHandler() : DeferredTypeHandlerBase(isPrototypeTemplate, _inlineSlotCapacity, _offsetOfInlineSlots) { } + DeferredTypeHandler() : DeferredTypeHandlerBase(isPrototypeTemplate, _inlineSlotCapacity, _offsetOfInlineSlots), m_initializer(initializer) { } public: static DeferredTypeHandler *GetDefaultInstance() { return &defaultInstance; } @@ -87,9 +87,11 @@ namespace Js virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override; virtual PropertyIndex GetPropertyIndex(PropertyRecord const* propertyRecord) override; +#if ENABLE_NATIVE_CODEGEN virtual bool GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; +#endif virtual bool EnsureObjectReady(DynamicObject* instance) override; virtual BOOL HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl = nullptr) override; virtual BOOL HasProperty(DynamicObject* instance, JavascriptString* propertyNameString) override; @@ -137,8 +139,18 @@ namespace Js private: static DeferredTypeHandler defaultInstance; + + DeferredTypeInitializer m_initializer; + bool EnsureObjectReady(DynamicObject* instance, DeferredInitializeMode mode); virtual BOOL FreezeImpl(DynamicObject *instance, bool isConvertedType) override; +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override + { + Output::Print(_u("%*sDeferredTypeHandler (0x%p): Dump unimplemented\n"), indent, _u(""), this); + } +#endif }; template @@ -177,6 +189,7 @@ namespace Js return Constants::NoSlot; } +#if ENABLE_NATIVE_CODEGEN template bool DeferredTypeHandler::GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) { @@ -218,6 +231,7 @@ namespace Js return true; } +#endif template bool DeferredTypeHandler::EnsureObjectReady(DynamicObject* instance) @@ -228,7 +242,8 @@ namespace Js template bool DeferredTypeHandler::EnsureObjectReady(DynamicObject* instance, DeferredInitializeMode mode) { - return initializer(instance, this, mode); + Assert(initializer == m_initializer); + return m_initializer(instance, this, mode); } template diff --git a/deps/chakrashim/core/lib/Runtime/Types/DictionaryPropertyDescriptor.h b/deps/chakrashim/core/lib/Runtime/Types/DictionaryPropertyDescriptor.h index 1f3c3f1c916..37fffe8332d 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DictionaryPropertyDescriptor.h +++ b/deps/chakrashim/core/lib/Runtime/Types/DictionaryPropertyDescriptor.h @@ -14,23 +14,38 @@ namespace Js public: DictionaryPropertyDescriptor(TPropertyIndex dataSlot, bool isInitialized = false, bool isFixed = false, bool usedAsFixed = false) : Data(dataSlot), Getter(NoSlots), Setter(NoSlots), Attributes(PropertyDynamicTypeDefaults), - PreventFalseReference(true), IsInitialized(isInitialized), IsOnlyOneAccessorInitialized(false), IsFixed(isFixed), UsedAsFixed(usedAsFixed), IsShadowed(false), IsAccessor(false) { } +#if ENABLE_FIXED_FIELDS + IsInitialized(isInitialized), IsOnlyOneAccessorInitialized(false), IsFixed(isFixed), UsedAsFixed(usedAsFixed), +#endif + PreventFalseReference(true), IsShadowed(false), IsAccessor(false) {} DictionaryPropertyDescriptor(TPropertyIndex getterSlot, TPropertyIndex setterSlot, bool isInitialized = false, bool isFixed = false, bool usedAsFixed = false) : Data(NoSlots), Getter(getterSlot), Setter(setterSlot), Attributes(PropertyDynamicTypeDefaults), - PreventFalseReference(true), IsInitialized(isInitialized), IsOnlyOneAccessorInitialized(false), IsFixed(isFixed), UsedAsFixed(usedAsFixed), IsShadowed(false), IsAccessor(true) { } +#if ENABLE_FIXED_FIELDS + IsInitialized(isInitialized), IsOnlyOneAccessorInitialized(false), IsFixed(isFixed), UsedAsFixed(usedAsFixed), +#endif + PreventFalseReference(true), IsShadowed(false), IsAccessor(true) {} DictionaryPropertyDescriptor(TPropertyIndex dataSlot, PropertyAttributes attributes, bool isInitialized = false, bool isFixed = false, bool usedAsFixed = false) : Data(dataSlot), Getter(NoSlots), Setter(NoSlots), Attributes(attributes), - PreventFalseReference(true), IsInitialized(isInitialized), IsOnlyOneAccessorInitialized(false), IsFixed(isFixed), UsedAsFixed(usedAsFixed), IsShadowed(false), IsAccessor(false) { } +#if ENABLE_FIXED_FIELDS + IsInitialized(isInitialized), IsOnlyOneAccessorInitialized(false), IsFixed(isFixed), UsedAsFixed(usedAsFixed), +#endif + PreventFalseReference(true), IsShadowed(false), IsAccessor(false) { } DictionaryPropertyDescriptor(TPropertyIndex getterSlot, TPropertyIndex setterSlot, PropertyAttributes attributes, bool isInitialized = false, bool isFixed = false, bool usedAsFixed = false) : Data(NoSlots), Getter(getterSlot), Setter(setterSlot), Attributes(attributes), - PreventFalseReference(true), IsInitialized(isInitialized), IsOnlyOneAccessorInitialized(false), IsFixed(isFixed), UsedAsFixed(usedAsFixed), IsShadowed(false), IsAccessor(true) { } +#if ENABLE_FIXED_FIELDS + IsInitialized(isInitialized), IsOnlyOneAccessorInitialized(false), IsFixed(isFixed), UsedAsFixed(usedAsFixed), +#endif + PreventFalseReference(true), IsShadowed(false), IsAccessor(true) { } // this is for initialization. DictionaryPropertyDescriptor() : Data(NoSlots), Getter(NoSlots), Setter(NoSlots), Attributes(PropertyDynamicTypeDefaults), - PreventFalseReference(true), IsInitialized(false), IsOnlyOneAccessorInitialized(false), IsFixed(false), UsedAsFixed(false), IsShadowed(false), IsAccessor(false) { } +#if ENABLE_FIXED_FIELDS + IsInitialized(false), IsOnlyOneAccessorInitialized(false), IsFixed(false), UsedAsFixed(false), +#endif + PreventFalseReference(true), IsShadowed(false), IsAccessor(false) { } template void CopyFrom(DictionaryPropertyDescriptor& descriptor); @@ -38,13 +53,15 @@ namespace Js // SimpleDictionaryPropertyDescriptor is allocated by a dictionary along with the PropertyRecord // so it cannot be allocated as leaf, tag the lower bit to prevent false reference. bool PreventFalseReference:1; - + bool IsShadowed : 1; + bool IsAccessor : 1; +#if ENABLE_FIXED_FIELDS bool IsInitialized:1; bool IsOnlyOneAccessorInitialized:1; bool IsFixed:1; bool UsedAsFixed:1; - bool IsShadowed : 1; - bool IsAccessor : 1; +#endif + PropertyAttributes Attributes; private: TPropertyIndex Data; @@ -68,7 +85,15 @@ namespace Js static const TPropertyIndex NoSlots = PropertyIndexRanges::NoSlots; public: -#if DBG + bool IsOrMayBecomeFixed() + { +#if ENABLE_FIXED_FIELDS + return !IsInitialized || IsFixed; +#else + return false; +#endif + } +#if ENABLE_FIXED_FIELDS && DBG bool SanityCheckFixedBits() { return @@ -76,6 +101,11 @@ namespace Js (!(this->Attributes & PropertyDeleted) && (this->Data != NoSlots || this->Getter != NoSlots || this->Setter != NoSlots))); } #endif + +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const; +#endif }; @@ -242,10 +272,49 @@ namespace Js this->Data = (descriptor.Data == DictionaryPropertyDescriptor::NoSlots) ? NoSlots : descriptor.Data; this->Getter = (descriptor.Getter == DictionaryPropertyDescriptor::NoSlots) ? NoSlots : descriptor.Getter; this->Setter = (descriptor.Setter == DictionaryPropertyDescriptor::NoSlots) ? NoSlots : descriptor.Setter; + this->IsAccessor = descriptor.IsAccessor; +#if ENABLE_FIXED_FIELDS this->IsInitialized = descriptor.IsInitialized; this->IsFixed = descriptor.IsFixed; this->UsedAsFixed = descriptor.UsedAsFixed; - this->IsAccessor = descriptor.IsAccessor; +#endif } + +#if DBG_DUMP + template + void DictionaryPropertyDescriptor::Dump(unsigned indent) const + { + const auto padding(_u("")); + const unsigned fieldIndent(indent + 2); + + Output::Print(_u("%*sDictionaryPropertyDescriptor (0x%p)\n"), indent, padding, this); + Output::Print(_u("%*sPreventFalseReference: %d\n"), fieldIndent, padding, this->PreventFalseReference); + Output::Print(_u("%*sIsShadowed: %d\n"), fieldIndent, padding, this->IsShadowed); + Output::Print(_u("%*sIsAccessor: %d\n"), fieldIndent, padding, this->IsAccessor); +#if ENABLE_FIXED_FIELDS + Output::Print(_u("%*sIsInitialized: %d\n"), fieldIndent, padding, this->IsInitialized); + Output::Print(_u("%*sIsOnlyOneAccessorInitialized: %d\n"), fieldIndent, padding, this->IsOnlyOneAccessorInitialized); + Output::Print(_u("%*sIsFixed: %d\n"), fieldIndent, padding, this->IsFixed); + Output::Print(_u("%*sUsedAsFixed: %d\n"), fieldIndent, padding, this->UsedAsFixed); +#endif + Output::Print(_u("%*sAttributes: 0x%02x "), fieldIndent, padding, this->Attributes); + if (this->Attributes != PropertyNone) + { + if (this->Attributes & PropertyEnumerable) Output::Print(_u("PropertyEnumerable ")); + if (this->Attributes & PropertyConfigurable) Output::Print(_u("PropertyConfigurable ")); + if (this->Attributes & PropertyWritable) Output::Print(_u("PropertyWritable ")); + if (this->Attributes & PropertyDeleted) Output::Print(_u("PropertyDeleted ")); + if (this->Attributes & PropertyLetConstGlobal) Output::Print(_u("PropertyLetConstGlobal ")); + if (this->Attributes & PropertyDeclaredGlobal) Output::Print(_u("PropertyDeclaredGlobal ")); + if (this->Attributes & PropertyLet) Output::Print(_u("PropertyLet ")); + if (this->Attributes & PropertyConst) Output::Print(_u("PropertyConst ")); + } + Output::Print(_u("\n")); + + Output::Print(_u("%*sData: %d\n"), fieldIndent, padding, static_cast(this->Data)); + Output::Print(_u("%*sGetter: %d\n"), fieldIndent, padding, static_cast(this->Getter)); + Output::Print(_u("%*sSetter: %d\n"), fieldIndent, padding, static_cast(this->Setter)); + } +#endif } diff --git a/deps/chakrashim/core/lib/Runtime/Types/DictionaryTypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/DictionaryTypeHandler.cpp index 404a0f787e8..7dd7a1432a6 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DictionaryTypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/DictionaryTypeHandler.cpp @@ -27,8 +27,10 @@ namespace Js template DictionaryTypeHandlerBase::DictionaryTypeHandlerBase(Recycler* recycler) : DynamicTypeHandler(1), - nextPropertyIndex(0), - singletonInstance(nullptr) + nextPropertyIndex(0) +#if ENABLE_FIXED_FIELDS + , singletonInstance(nullptr) +#endif { SetIsInlineSlotCapacityLocked(); propertyMap = RecyclerNew(recycler, PropertyDescriptorMap, recycler, this->GetSlotCapacity()); @@ -38,8 +40,10 @@ namespace Js DictionaryTypeHandlerBase::DictionaryTypeHandlerBase(Recycler* recycler, int slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots) : // Do not RoundUp passed in slotCapacity. This may be called by ConvertTypeHandler for an existing DynamicObject and should use the real existing slotCapacity. DynamicTypeHandler(slotCapacity, inlineSlotCapacity, offsetOfInlineSlots), - nextPropertyIndex(0), - singletonInstance(nullptr) + nextPropertyIndex(0) +#if ENABLE_FIXED_FIELDS + , singletonInstance(nullptr) +#endif { SetIsInlineSlotCapacityLocked(); Assert(GetSlotCapacity() <= MaxPropertyIndexSize); @@ -52,8 +56,10 @@ namespace Js template DictionaryTypeHandlerBase::DictionaryTypeHandlerBase(DictionaryTypeHandlerBase* typeHandler) : DynamicTypeHandler(typeHandler->GetSlotCapacity(), typeHandler->GetInlineSlotCapacity(), typeHandler->GetOffsetOfInlineSlots()), - propertyMap(typeHandler->propertyMap), nextPropertyIndex(typeHandler->nextPropertyIndex), - singletonInstance(typeHandler->singletonInstance) + propertyMap(typeHandler->propertyMap), nextPropertyIndex(typeHandler->nextPropertyIndex) +#if ENABLE_FIXED_FIELDS + , singletonInstance(typeHandler->singletonInstance) +#endif { Assert(typeHandler->GetIsInlineSlotCapacityLocked()); CopyPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection | PropertyTypesInlineSlotCapacityLocked, typeHandler->GetPropertyTypes()); @@ -131,7 +137,7 @@ namespace Js { PropertyValueInfo::SetCacheInfo(info, propertyString, propertyString->GetLdElemInlineCache(), false); SetPropertyValueInfo(info, instance, dataSlot, descriptor.Attributes); - if (!descriptor.IsInitialized || descriptor.IsFixed) + if (descriptor.IsOrMayBecomeFixed()) { PropertyValueInfo::DisableStoreFieldCache(info); } @@ -222,6 +228,7 @@ namespace Js return GetPropertyIndex_Internal(propertyRecord); } +#if ENABLE_NATIVE_CODEGEN template bool DictionaryTypeHandlerBase::GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) { @@ -304,8 +311,8 @@ namespace Js { return false; } - - if (entry->mustBeWritable && (!(descriptor->Attributes & PropertyWritable) || !descriptor->IsInitialized || descriptor->IsFixed)) + + if (entry->mustBeWritable && (!(descriptor->Attributes & PropertyWritable) || descriptor->IsOrMayBecomeFixed())) { return false; } @@ -320,6 +327,7 @@ namespace Js return true; } +#endif template template @@ -379,11 +387,12 @@ namespace Js T index = ::Math::PostInc(nextPropertyIndex); DictionaryPropertyDescriptor descriptor(index, attributes); +#if ENABLE_FIXED_FIELDS Assert((!isFixed && !usedAsFixed) || (!IsInternalPropertyId(propertyId->GetPropertyId()) && this->singletonInstance != nullptr)); descriptor.IsInitialized = isInitialized; descriptor.IsFixed = isFixed; descriptor.UsedAsFixed = usedAsFixed; - +#endif propertyMap->Add(propertyId, descriptor); if (!(attributes & PropertyWritable)) @@ -518,7 +527,7 @@ namespace Js { *value = instance->GetSlot(dataSlot); SetPropertyValueInfo(info, instance, dataSlot, descriptor->Attributes); - if (!descriptor->IsInitialized || descriptor->IsFixed) + if (descriptor->IsOrMayBecomeFixed()) { PropertyValueInfo::DisableStoreFieldCache(info); } @@ -535,7 +544,7 @@ namespace Js CacheOperators::CachePropertyReadForGetter(info, originalInstance, propertyT, requestContext); PropertyValueInfo::SetNoCache(info, instance); // we already cached getter, so we don't have to do it once more - RecyclableObject* func = RecyclableObject::FromVar(instance->GetSlot(descriptor->GetGetterPropertyIndex())); + RecyclableObject* func = RecyclableObject::UnsafeFromVar(instance->GetSlot(descriptor->GetGetterPropertyIndex())); *value = JavascriptOperators::CallGetter(func, originalInstance, requestContext); return true; } @@ -715,9 +724,10 @@ namespace Js // DictionaryTypeHandlers are not supposed to be shared. Assert(!GetIsOrMayBecomeShared()); +#if ENABLE_FIXED_FIELDS DynamicObject* localSingletonInstance = this->singletonInstance != nullptr ? this->singletonInstance->Get() : nullptr; Assert(this->singletonInstance == nullptr || localSingletonInstance == instance); - +#endif T dataSlotAllowLetConstGlobal = descriptor->template GetDataPropertyIndex(); if (dataSlotAllowLetConstGlobal != NoSlots) { @@ -732,6 +742,7 @@ namespace Js } } +#if ENABLE_FIXED_FIELDS if (!descriptor->IsInitialized) { if ((flags & PropertyOperation_PreInit) == 0) @@ -751,12 +762,13 @@ namespace Js { InvalidateFixedField(instance, propertyId, descriptor); } +#endif SetSlotUnchecked(instance, dataSlotAllowLetConstGlobal, value); // If we just added a fixed method, don't populate the inline cache so that we always take the slow path // when overwriting this property and correctly invalidate any JIT-ed code that hard-coded this method. - if (descriptor->IsInitialized && !descriptor->IsFixed) + if (!descriptor->IsOrMayBecomeFixed()) { SetPropertyValueInfo(info, instance, dataSlotAllowLetConstGlobal, GetLetConstGlobalPropertyAttributes(descriptor->Attributes)); } @@ -800,7 +812,9 @@ namespace Js PropertyRecord const* propertyRecord = scriptContext->GetPropertyName(propertyId); if (propertyMap->TryGetReference(propertyRecord, &descriptor)) { +#if ENABLE_FIXED_FIELDS Assert(descriptor->SanityCheckFixedBits()); +#endif if (descriptor->Attributes & PropertyDeleted) { if (!isForce) @@ -888,8 +902,9 @@ namespace Js if (propertyMap->TryGetReference(propertyName, &descriptor)) { +#if ENABLE_FIXED_FIELDS Assert(descriptor->SanityCheckFixedBits()); - +#endif if (descriptor->Attributes & PropertyDeleted) { return true; @@ -933,7 +948,9 @@ namespace Js descriptor->Attributes &= ~PropertyDynamicTypeDefaults; descriptor->Attributes |= PropertyDeletedDefaults; } +#if ENABLE_FIXED_FIELDS InvalidateFixedField(instance, propertyNameString, descriptor); +#endif // Change the type so as we can invalidate the cache in fast path jit if (instance->GetType()->HasBeenCached()) @@ -968,8 +985,9 @@ namespace Js PropertyRecord const* propertyRecord = scriptContext->GetPropertyName(propertyId); if (propertyMap->TryGetReference(propertyRecord, &descriptor)) { +#if ENABLE_FIXED_FIELDS Assert(descriptor->SanityCheckFixedBits()); - +#endif if (descriptor->Attributes & PropertyDeleted) { // If PropertyDeleted and PropertyLetConstGlobal are set then we have both @@ -1025,7 +1043,9 @@ namespace Js descriptor->Attributes &= ~PropertyDynamicTypeDefaults; descriptor->Attributes |= PropertyDeletedDefaults; } +#if ENABLE_FIXED_FIELDS InvalidateFixedField(instance, propertyId, descriptor); +#endif // Change the type so as we can invalidate the cache in fast path jit if (instance->GetType()->HasBeenCached()) @@ -1049,6 +1069,7 @@ namespace Js return true; } +#if ENABLE_FIXED_FIELDS template BOOL DictionaryTypeHandlerBase::IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) { @@ -1066,8 +1087,9 @@ namespace Js return false; } } +#endif - template + template BOOL DictionaryTypeHandlerBase::SetItem(DynamicObject* instance, uint32 index, Var value, PropertyOperationFlags flags) { if (!(this->GetFlags() & IsExtensibleFlag) && !instance->HasObjectArray()) @@ -1578,8 +1600,9 @@ namespace Js PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); if (propertyMap->TryGetReference(propertyRecord, &descriptor)) { +#if ENABLE_FIXED_FIELDS Assert(descriptor->SanityCheckFixedBits()); - +#endif if (descriptor->Attributes & PropertyDeleted) { if (descriptor->Attributes & PropertyLetConstGlobal) @@ -1607,6 +1630,7 @@ namespace Js // DictionaryTypeHandlers are not supposed to be shared. Assert(!GetIsOrMayBecomeShared()); +#if ENABLE_FIXED_FIELDS DynamicObject* localSingletonInstance = this->singletonInstance != nullptr ? this->singletonInstance->Get() : nullptr; Assert(this->singletonInstance == nullptr || localSingletonInstance == instance); @@ -1646,6 +1670,7 @@ namespace Js { InvalidateFixedField(instance, propertyId, descriptor); } +#endif // don't overwrite an existing accessor with null if (getter != nullptr) @@ -1689,6 +1714,7 @@ namespace Js // DictionaryTypeHandlers are not supposed to be shared. Assert(!GetIsOrMayBecomeShared()); +#if ENABLE_FIXED_FIELDS DynamicObject* localSingletonInstance = this->singletonInstance != nullptr ? this->singletonInstance->Get() : nullptr; Assert(this->singletonInstance == nullptr || localSingletonInstance == instance); newDescriptor.IsInitialized = true; @@ -1705,6 +1731,7 @@ namespace Js newDescriptor.IsOnlyOneAccessorInitialized = true; } } +#endif propertyMap->Add(propertyRecord, newDescriptor); @@ -1753,8 +1780,9 @@ namespace Js PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); if (propertyMap->TryGetReference(propertyRecord, &descriptor)) { +#if ENABLE_FIXED_FIELDS Assert(descriptor->SanityCheckFixedBits()); - +#endif if (attributes & descriptor->Attributes & PropertyLetConstGlobal) { // Do not need to change the descriptor or its attributes if setting the initial value of a LetConstGlobal @@ -1828,6 +1856,9 @@ namespace Js { if (descriptor->IsAccessor && !(attributes & PropertyLetConstGlobal)) { +#if DEBUG + Var ctor = JavascriptOperators::GetProperty(instance, PropertyIds::constructor, scriptContext); +#endif AssertMsg(RootObjectBase::Is(instance) || JavascriptFunction::IsBuiltinProperty(instance, propertyId) || // ValidateAndApplyPropertyDescriptor says to preserve Configurable and Enumerable flags @@ -1839,8 +1870,10 @@ namespace Js // something else. All we need to do is convert the descriptor to a data descriptor. // Built-in Function.prototype properties 'length', 'arguments', and 'caller' are special cases. - (JavascriptOperators::IsClassConstructor(JavascriptOperators::GetProperty(instance, PropertyIds::constructor, scriptContext)) && - (attributes & PropertyClassMemberDefaults) == PropertyClassMemberDefaults), + ((JavascriptOperators::IsClassConstructor(instance) // Static method + || JavascriptOperators::IsClassConstructor(ctor) + || JavascriptOperators::IsClassMethod(ctor)) + && (attributes & PropertyClassMemberDefaults) == PropertyClassMemberDefaults), // 14.3.9: InitClassMember sets property descriptor to {writable:true, enumerable:false, configurable:true} "Expect to only come down this path for InitClassMember or InitRootFld (on the global object) overwriting existing accessor property"); @@ -2003,6 +2036,7 @@ namespace Js // We expect the new type handler to start off marked as having only writable data properties. Assert(newTypeHandler->GetHasOnlyWritableDataProperties()); +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS DynamicType* oldType = instance->GetDynamicType(); RecyclerWeakReference* oldSingletonInstance = GetSingletonInstance(); @@ -2010,6 +2044,7 @@ namespace Js #endif CopySingletonInstance(instance, newTypeHandler); +#endif DictionaryPropertyDescriptor descriptor; DictionaryPropertyDescriptor bigDescriptor; @@ -2026,7 +2061,9 @@ namespace Js newTypeHandler->nextPropertyIndex = nextPropertyIndex; +#if ENABLE_FIXED_FIELDS ClearSingletonInstance(); +#endif AssertMsg((newTypeHandler->GetFlags() & IsPrototypeFlag) == 0, "Why did we create a brand new type handler with a prototype flag set?"); newTypeHandler->SetFlags(IsPrototypeFlag, this->GetFlags()); @@ -2036,6 +2073,8 @@ namespace Js Assert(newTypeHandler->GetIsInlineSlotCapacityLocked()); newTypeHandler->SetPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection, this->GetPropertyTypes()); newTypeHandler->SetInstanceTypeHandler(instance); + +#if ENABLE_FIXED_FIELDS // Unlike for SimpleDictionaryTypeHandler or PathTypeHandler, the DictionaryTypeHandler copies usedAsFixed indiscriminately above. // Therefore, we don't care if we changed the type or not, and don't need the assert below. // We assumed that we don't need to transfer used as fixed bits unless we are a prototype, which is only valid if we also changed the type. @@ -2044,6 +2083,7 @@ namespace Js #ifdef ENABLE_DEBUG_CONFIG_OPTIONS TraceFixedFieldsAfterTypeHandlerChange(instance, this, newTypeHandler, oldType, oldSingletonInstance); +#endif #endif return newTypeHandler; @@ -2112,6 +2152,7 @@ namespace Js // DictionaryTypeHandlers are not supposed to be shared. Assert(!GetIsOrMayBecomeShared()); +#if ENABLE_FIXED_FIELDS DynamicObject* localSingletonInstance = this->singletonInstance != nullptr ? this->singletonInstance->Get() : nullptr; Assert(this->singletonInstance == nullptr || localSingletonInstance == instance); @@ -2127,6 +2168,7 @@ namespace Js newDescriptor.IsFixed = (JavascriptFunction::Is(value) ? ShouldFixMethodProperties() : (ShouldFixDataProperties() & CheckHeuristicsForFixedDataProps(instance, propertyRecord, value))); } } +#endif propertyMap->Add(propertyRecord, newDescriptor); @@ -2147,6 +2189,7 @@ namespace Js SetSlotUnchecked(instance, index, value); +#if ENABLE_FIXED_FIELDS // If we just added a fixed method, don't populate the inline cache so that we always take the // slow path when overwriting this property and correctly invalidate any JIT-ed code that hard-coded // this method. @@ -2155,18 +2198,17 @@ namespace Js PropertyValueInfo::SetNoCache(info, instance); } else +#endif { SetPropertyValueInfo(info, instance, index, attributes); } - if (!IsInternalPropertyId(propertyRecord->GetPropertyId()) && ((this->GetFlags() & IsPrototypeFlag) - || JavascriptOperators::HasProxyOrPrototypeInlineCacheProperty(instance, propertyRecord->GetPropertyId()))) - { - // We don't evolve dictionary types when adding a field, so we need to invalidate prototype caches. - // We only have to do this though if the current type is used as a prototype, or the current property - // is found on the prototype chain. - scriptContext->InvalidateProtoCaches(propertyRecord->GetPropertyId()); - } + // Always invalidate prototype caches when we add a property. Previously, we only did this if the current + // type is used as a prototype, or if the new property is also found on the prototype chain (because + // adding a new field doesn't create a new dictionary type). However, if the new property is already in + // the cache as a missing property, we have to invalidate the prototype caches. + scriptContext->InvalidateProtoCaches(propertyRecord->GetPropertyId()); + SetPropertyUpdateSideEffect(instance, propertyRecord->GetPropertyId(), value, possibleSideEffects); return true; } @@ -2206,6 +2248,7 @@ namespace Js // object has changed and/or property guards have already been invalidated through some other means. int propertyCount = this->propertyMap->Count(); +#if ENABLE_FIXED_FIELDS if (invalidateFixedFields) { for (int propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++) @@ -2215,6 +2258,7 @@ namespace Js InvalidateFixedField(instance, propertyRecord->GetPropertyId(), descriptor); } } +#endif Js::RecyclableObject* undefined = instance->GetLibrary()->GetUndefined(); Js::JavascriptFunction* defaultAccessor = instance->GetLibrary()->GetDefaultAccessorFunction(); @@ -2238,6 +2282,7 @@ namespace Js template void DictionaryTypeHandlerBase::MarshalAllPropertiesToScriptContext(DynamicObject* instance, ScriptContext* targetScriptContext, bool invalidateFixedFields) { +#if ENABLE_FIXED_FIELDS // Note: This method is currently only called from ResetObject, which in turn only applies to external objects. // Before using for other purposes, make sure the assumptions made here make sense in the new context. In particular, // the invalidateFixedFields == false is only correct if a) the object is known not to have any, or b) the type of the @@ -2252,6 +2297,7 @@ namespace Js InvalidateFixedField(instance, propertyRecord->GetPropertyId(), descriptor); } } +#endif int slotCount = this->nextPropertyIndex; for (int slotIndex = 0; slotIndex < slotCount; slotIndex++) @@ -2278,6 +2324,11 @@ namespace Js return; } + // DictionaryTypeHandlers are never shared. If we allow sharing, we will have to handle this case + // just like SimpleDictionaryTypeHandler. + Assert(!GetIsOrMayBecomeShared()); + +#if ENABLE_FIXED_FIELDS Assert(!GetIsShared() || this->singletonInstance == nullptr); Assert(this->singletonInstance == nullptr || this->singletonInstance->Get() == instance); @@ -2330,14 +2381,11 @@ namespace Js } }; - // DictionaryTypeHandlers are never shared. If we allow sharing, we will have to handle this case - // just like SimpleDictionaryTypeHandler. - Assert(!GetIsOrMayBecomeShared()); - #ifdef ENABLE_DEBUG_CONFIG_OPTIONS DynamicType* oldType = instance->GetDynamicType(); RecyclerWeakReference* oldSingletonInstance = GetSingletonInstance(); TraceFixedFieldsBeforeSetIsProto(instance, this, oldType, oldSingletonInstance); +#endif #endif bool hasNewType = false; @@ -2351,6 +2399,7 @@ namespace Js // Currently there is no way to become the prototype if you are a stack instance Assert(!ThreadContext::IsOnStack(instance)); +#if ENABLE_FIXED_FIELDS if (AreSingletonInstancesNeeded() && this->singletonInstance == nullptr) { this->singletonInstance = instance->CreateWeakReferenceToSelf(); @@ -2367,35 +2416,15 @@ namespace Js setFixedFlags(propertyRecord, descriptor, hasNewType); } } +#endif SetFlags(IsPrototypeFlag); +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS TraceFixedFieldsAfterSetIsProto(instance, this, this, oldType, oldSingletonInstance); #endif - - } - - template - bool DictionaryTypeHandlerBase::HasSingletonInstance() const - { - return this->singletonInstance != nullptr; - } - - template - bool DictionaryTypeHandlerBase::TryUseFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext) - { - bool result = TryGetFixedProperty(propertyRecord, pProperty, propertyType, requestContext); - TraceUseFixedProperty(propertyRecord, pProperty, result, _u("DictionaryTypeHandler"), requestContext); - return result; - } - - template - bool DictionaryTypeHandlerBase::TryUseFixedAccessor(PropertyRecord const * propertyRecord, Var * pAccessor, FixedPropertyKind propertyType, bool getter, ScriptContext * requestContext) - { - bool result = TryGetFixedAccessor(propertyRecord, pAccessor, propertyType, getter, requestContext); - TraceUseFixedProperty(propertyRecord, pAccessor, result, _u("DictionaryTypeHandler"), requestContext); - return result; +#endif } #if DBG @@ -2420,7 +2449,7 @@ namespace Js } else { - return descriptor.IsInitialized && !descriptor.IsFixed; + return !descriptor.IsOrMayBecomeFixed(); } } else @@ -2430,6 +2459,65 @@ namespace Js } } + template + bool DictionaryTypeHandlerBase::IsLetConstGlobal(DynamicObject* instance, PropertyId propertyId) + { + DictionaryPropertyDescriptor* descriptor; + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyMap->TryGetReference(propertyRecord, &descriptor) && (descriptor->Attributes & PropertyLetConstGlobal)) + { + return true; + } + return false; + } +#endif + + template + bool DictionaryTypeHandlerBase::NextLetConstGlobal(int& index, RootObjectBase* instance, const PropertyRecord** propertyRecord, Var* value, bool* isConst) + { + for (; index < propertyMap->Count(); index++) + { + DictionaryPropertyDescriptor descriptor = propertyMap->GetValueAt(index); + + if (descriptor.Attributes & PropertyLetConstGlobal) + { + *propertyRecord = propertyMap->GetKeyAt(index); + *value = instance->GetSlot(descriptor.template GetDataPropertyIndex()); + *isConst = (descriptor.Attributes & PropertyConst) != 0; + + index += 1; + + return true; + } + } + + return false; + } + +#if ENABLE_FIXED_FIELDS + template + bool DictionaryTypeHandlerBase::HasSingletonInstance() const + { + return this->singletonInstance != nullptr; + } + + template + bool DictionaryTypeHandlerBase::TryUseFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext) + { + bool result = TryGetFixedProperty(propertyRecord, pProperty, propertyType, requestContext); + TraceUseFixedProperty(propertyRecord, pProperty, result, _u("DictionaryTypeHandler"), requestContext); + return result; + } + + template + bool DictionaryTypeHandlerBase::TryUseFixedAccessor(PropertyRecord const * propertyRecord, Var * pAccessor, FixedPropertyKind propertyType, bool getter, ScriptContext * requestContext) + { + bool result = TryGetFixedAccessor(propertyRecord, pAccessor, propertyType, getter, requestContext); + TraceUseFixedProperty(propertyRecord, pAccessor, result, _u("DictionaryTypeHandler"), requestContext); + return result; + } + +#if DBG template bool DictionaryTypeHandlerBase::CheckFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, ScriptContext * requestContext) { @@ -2565,51 +2653,13 @@ namespace Js { // Invalidate any JIT-ed code that hard coded this method. No need to invalidate // any store field inline caches, because they have never been populated. -#if ENABLE_NATIVE_CODEGEN PropertyId propertyId = TMapKey_GetPropertyId(instance->GetScriptContext(), propertyKey); instance->GetScriptContext()->GetThreadContext()->InvalidatePropertyGuards(propertyId); -#endif descriptor->UsedAsFixed = false; } } } -#if DBG - template - bool DictionaryTypeHandlerBase::IsLetConstGlobal(DynamicObject* instance, PropertyId propertyId) - { - DictionaryPropertyDescriptor* descriptor; - PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); - if (propertyMap->TryGetReference(propertyRecord, &descriptor) && (descriptor->Attributes & PropertyLetConstGlobal)) - { - return true; - } - return false; - } -#endif - - template - bool DictionaryTypeHandlerBase::NextLetConstGlobal(int& index, RootObjectBase* instance, const PropertyRecord** propertyRecord, Var* value, bool* isConst) - { - for (; index < propertyMap->Count(); index++) - { - DictionaryPropertyDescriptor descriptor = propertyMap->GetValueAt(index); - - if (descriptor.Attributes & PropertyLetConstGlobal) - { - *propertyRecord = propertyMap->GetKeyAt(index); - *value = instance->GetSlot(descriptor.template GetDataPropertyIndex()); - *isConst = (descriptor.Attributes & PropertyConst) != 0; - - index += 1; - - return true; - } - } - - return false; - } - #ifdef ENABLE_DEBUG_CONFIG_OPTIONS template void DictionaryTypeHandlerBase::DumpFixedFields() const { @@ -2735,6 +2785,7 @@ namespace Js } } #endif +#endif // ENABLE_FIXED_FIELDS #if ENABLE_TTD template @@ -2750,7 +2801,11 @@ namespace Js // Js::PropertyId pid = iter.CurrentKey()->GetPropertyId(); +#if ENABLE_FIXED_FIELDS if((!DynamicTypeHandler::ShouldMarkPropertyId_TTD(pid)) | (!descriptor.IsInitialized) | (descriptor.Attributes & PropertyDeleted)) +#else + if ((!DynamicTypeHandler::ShouldMarkPropertyId_TTD(pid)) | (descriptor.Attributes & PropertyDeleted)) +#endif { continue; } @@ -2795,12 +2850,18 @@ namespace Js { maxSlot = max(maxSlot, dIndex); +#if ENABLE_FIXED_FIELDS TTD::NSSnapType::SnapEntryDataKindTag tag = descriptor.IsInitialized ? TTD::NSSnapType::SnapEntryDataKindTag::Data : TTD::NSSnapType::SnapEntryDataKindTag::Uninitialized; +#else + TTD::NSSnapType::SnapEntryDataKindTag tag = TTD::NSSnapType::SnapEntryDataKindTag::Data; +#endif TTD::NSSnapType::ExtractSnapPropertyEntryInfo(entryInfo + dIndex, pid, descriptor.Attributes, tag); } else { +#if ENABLE_FIXED_FIELDS TTDAssert(descriptor.IsInitialized, "How can this not be initialized?"); +#endif T gIndex = descriptor.GetGetterPropertyIndex(); if(gIndex != NoSlots) @@ -2851,6 +2912,42 @@ namespace Js } #endif +#if DBG_DUMP + template void DictionaryTypeHandlerBase::Dump(unsigned indent) const { + const auto padding(_u("")); + const unsigned fieldIndent(indent + 2); + const unsigned mapLabelIndent(indent + 4); + const unsigned mapValueIndent(indent + 6); + + Output::Print(_u("%*sDictionaryTypeHandlerBase (0x%p):\n"), indent, padding, this); + DynamicTypeHandler::Dump(indent + 2); + if (this->propertyMap == nullptr) + { + Output::Print(_u("%*spropertyMap: \n"), fieldIndent, padding); + } + else + { + Output::Print(_u("%*spropertyMap: 0x%p\n"), fieldIndent, padding, static_cast(this->propertyMap)); + this->propertyMap->Map([&](const PropertyRecord *key, const DictionaryPropertyDescriptor &value) + { + Output::Print(_u("%*sKey:\n"), mapLabelIndent, padding); + if (key == nullptr) + { + Output::Print(_u("%*s\n"), mapValueIndent, padding); + } + else + { + key->Dump(mapValueIndent); + } + Output::Print(_u("%*sValue\n"), mapLabelIndent, padding); + value.Dump(mapValueIndent); + }); + } + Output::Print(_u("%*snextPropertyIndex: %d\n"), fieldIndent, padding, static_cast(this->nextPropertyIndex)); + } + +#endif + template class DictionaryTypeHandlerBase; template class DictionaryTypeHandlerBase; diff --git a/deps/chakrashim/core/lib/Runtime/Types/DictionaryTypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/DictionaryTypeHandler.h index 0715feb2669..86a40e8c9cb 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DictionaryTypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/DictionaryTypeHandler.h @@ -31,7 +31,9 @@ namespace Js Field(PropertyDescriptorMap*) propertyMap; Field(T) nextPropertyIndex; +#if ENABLE_FIXED_FIELDS Field(RecyclerWeakReference*) singletonInstance; +#endif typedef PropertyIndexRanges PropertyIndexRangesType; static const T MaxPropertyIndexSize = PropertyIndexRangesType::MaxValue; @@ -65,8 +67,7 @@ namespace Js BOOL IsBigDictionaryTypeHandler(); virtual BOOL IsLockable() const override { return false; } - virtual BOOL IsSharable() const override { return false; } - virtual void DoShareTypeHandler(ScriptContext* scriptContext) override { AssertMsg(false, "DictionaryTypeHandlers cannot be shared."); }; + virtual BOOL IsSharable() const override { return false; } virtual int GetPropertyCount() override; virtual PropertyId GetPropertyId(ScriptContext* scriptContext, PropertyIndex index) override; @@ -78,9 +79,11 @@ namespace Js PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override; virtual PropertyIndex GetPropertyIndex(PropertyRecord const* propertyRecord) override; +#if ENABLE_NATIVE_CODEGEN virtual bool GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; +#endif virtual BOOL HasProperty(DynamicObject* instance, PropertyId propertyId, bool *noRedecl = nullptr) override; virtual BOOL HasProperty(DynamicObject* instance, JavascriptString* propertyNameString) override; @@ -109,7 +112,6 @@ namespace Js #endif virtual bool NextLetConstGlobal(int& index, RootObjectBase* instance, const PropertyRecord** propertyRecord, Var* value, bool* isConst) override; - virtual BOOL IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) override; virtual BOOL IsEnumerable(DynamicObject* instance, PropertyId propertyId) override; virtual BOOL IsWritable(DynamicObject* instance, PropertyId propertyId) override; virtual BOOL IsConfigurable(DynamicObject* instance, PropertyId propertyId) override; @@ -139,14 +141,18 @@ namespace Js #if DBG virtual bool SupportsPrototypeInstances() const { return true; } + virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) override; #endif +#if ENABLE_FIXED_FIELDS + virtual void DoShareTypeHandler(ScriptContext* scriptContext) override { AssertMsg(false, "DictionaryTypeHandlers cannot be shared."); }; + virtual BOOL IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) override; + virtual bool HasSingletonInstance() const override sealed; virtual bool TryUseFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext) override; virtual bool TryUseFixedAccessor(PropertyRecord const * propertyRecord, Var * pAccessor, FixedPropertyKind propertyType, bool getter, ScriptContext * requestContext) override; #if DBG - virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) override; virtual bool CheckFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, ScriptContext * requestContext) override; virtual bool HasAnyFixedProperties() const override; #endif @@ -167,8 +173,7 @@ namespace Js #endif private: - template - bool IsObjTypeSpecEquivalentImpl(const Type* type, const EquivalentPropertyEntry *entry); + template bool TryGetFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext); template @@ -202,8 +207,12 @@ namespace Js template void InvalidateFixedField(DynamicObject* instance, TPropertyKey propertyKey, DictionaryPropertyDescriptor* descriptor); - +#endif private: +#if ENABLE_NATIVE_CODEGEN + template + bool IsObjTypeSpecEquivalentImpl(const Type* type, const EquivalentPropertyEntry *entry); +#endif void SetNumDeletedProperties(const byte n) {} void Add(const PropertyRecord* propertyId, PropertyAttributes attributes, ScriptContext *const scriptContext); @@ -254,6 +263,11 @@ namespace Js virtual Js::BigPropertyIndex GetPropertyIndex_EnumerateTTD(const Js::PropertyRecord* pRecord) override; #endif + +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override; +#endif }; template diff --git a/deps/chakrashim/core/lib/Runtime/Types/DynamicObject.cpp b/deps/chakrashim/core/lib/Runtime/Types/DynamicObject.cpp index 91166beb52a..bc1abf7bb68 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DynamicObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/DynamicObject.cpp @@ -15,7 +15,7 @@ namespace Js objectArray(nullptr) { Assert(!UsesObjectArrayOrFlagsAsFlags()); - if(initSlots) + if (initSlots) { InitSlots(this); } @@ -101,13 +101,21 @@ namespace Js bool DynamicObject::Is(Var aValue) { - return RecyclableObject::Is(aValue) && (RecyclableObject::FromVar(aValue)->GetTypeId() == TypeIds_Object); + return RecyclableObject::Is(aValue) && (RecyclableObject::UnsafeFromVar(aValue)->GetTypeId() == TypeIds_Object); } DynamicObject* DynamicObject::FromVar(Var aValue) { RecyclableObject* obj = RecyclableObject::FromVar(aValue); AssertMsg(obj->DbgIsDynamicObject(), "Ensure instance is actually a DynamicObject"); + AssertOrFailFast(DynamicType::Is(obj->GetTypeId())); + return static_cast(obj); + } + + DynamicObject* DynamicObject::UnsafeFromVar(Var aValue) + { + RecyclableObject* obj = RecyclableObject::UnsafeFromVar(aValue); + AssertMsg(obj->DbgIsDynamicObject(), "Ensure instance is actually a DynamicObject"); Assert(DynamicType::Is(obj->GetTypeId())); return static_cast(obj); } @@ -653,6 +661,7 @@ namespace Js DynamicType * oldType = this->GetDynamicType(); DynamicTypeHandler* oldTypeHandler = oldType->GetTypeHandler(); +#if ENABLE_FIXED_FIELDS // Consider: Because we've disabled fixed properties on DOM objects, we don't need to rely on a type change here to // invalidate fixed properties. Under some circumstances (with F12 tools enabled) an object which // is already in the new context can be reset and newType == oldType. If we re-enable fixed properties on DOM objects @@ -660,6 +669,7 @@ namespace Js // Assert(newType != oldType); // We only expect DOM objects to ever be reset and we explicitly disable fixed properties on DOM objects. Assert(!oldTypeHandler->HasAnyFixedProperties()); +#endif this->type = newType; if (!IsAnyArray(this)) diff --git a/deps/chakrashim/core/lib/Runtime/Types/DynamicObject.h b/deps/chakrashim/core/lib/Runtime/Types/DynamicObject.h index f67995a7324..15517c861d8 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DynamicObject.h +++ b/deps/chakrashim/core/lib/Runtime/Types/DynamicObject.h @@ -69,6 +69,9 @@ namespace Js friend class JavascriptNativeArray; // for xplat offsetof field access friend class JavascriptOperators; // for ReplaceType friend class PathTypeHandlerBase; // for ReplaceType + friend class SimplePathTypeHandlerNoAttr; + friend class SimplePathTypeHandlerWithAttr; + friend class PathTypeHandlerNoAttr; friend class JavascriptLibrary; // for ReplaceType friend class ScriptFunction; // for ReplaceType; friend class JSON::JSONParser; //for ReplaceType @@ -131,6 +134,7 @@ namespace Js static bool Is(Var aValue); static DynamicObject* FromVar(Var value); + static DynamicObject* UnsafeFromVar(Var value); void EnsureSlots(int oldCount, int newCount, ScriptContext * scriptContext, DynamicTypeHandler * newTypeHandler = nullptr); void EnsureSlots(int newCount, ScriptContext *scriptContext); @@ -238,7 +242,9 @@ namespace Js virtual BOOL SetPropertyWithAttributes(PropertyId propertyId, Var value, PropertyAttributes attributes, PropertyValueInfo* info, PropertyOperationFlags flags = PropertyOperation_None, SideEffects possibleSideEffects = SideEffects_Any) override; virtual BOOL DeleteProperty(PropertyId propertyId, PropertyOperationFlags flags) override; virtual BOOL DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) override; +#if ENABLE_FIXED_FIELDS virtual BOOL IsFixedProperty(PropertyId propertyId) override; +#endif virtual PropertyQueryFlags HasItemQuery(uint32 index) override; virtual BOOL HasOwnItem(uint32 index) override; virtual PropertyQueryFlags GetItemQuery(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override; diff --git a/deps/chakrashim/core/lib/Runtime/Types/DynamicObjectPropertyEnumerator.cpp b/deps/chakrashim/core/lib/Runtime/Types/DynamicObjectPropertyEnumerator.cpp index 08ea1c350ad..f78030f5175 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DynamicObjectPropertyEnumerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/DynamicObjectPropertyEnumerator.cpp @@ -199,13 +199,17 @@ namespace Js { propertyStringName = this->MoveAndGetNextNoCache(propertyId, &propertyAttributes); - if (propertyStringName && VirtualTableInfo::HasVirtualTable(propertyStringName)) + if (propertyStringName) { - Assert(enumeratedCount < this->initialPropertyCount); - cachedData->strings[enumeratedCount] = (PropertyString*)propertyStringName; - cachedData->indexes[enumeratedCount] = this->objectIndex; - cachedData->attributes[enumeratedCount] = propertyAttributes; - cachedData->cachedCount = ++enumeratedCount; + PropertyString* propertyString = PropertyString::TryFromVar(propertyStringName); + if (propertyString != nullptr) + { + Assert(enumeratedCount < this->initialPropertyCount); + cachedData->strings[enumeratedCount] = propertyString; + cachedData->indexes[enumeratedCount] = this->objectIndex; + cachedData->attributes[enumeratedCount] = propertyAttributes; + cachedData->cachedCount = ++enumeratedCount; + } } else { @@ -266,6 +270,7 @@ namespace Js JavascriptString * DynamicObjectPropertyEnumerator::MoveAndGetNext(PropertyId& propertyId, PropertyAttributes * attributes) { + propertyId = Js::Constants::NoProperty; if (this->cachedData && this->initialType == this->object->GetDynamicType()) { return MoveAndGetNextWithCache(propertyId, attributes); diff --git a/deps/chakrashim/core/lib/Runtime/Types/DynamicObjectPropertyEnumerator.h b/deps/chakrashim/core/lib/Runtime/Types/DynamicObjectPropertyEnumerator.h index 1041c599857..798f8cd20c1 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DynamicObjectPropertyEnumerator.h +++ b/deps/chakrashim/core/lib/Runtime/Types/DynamicObjectPropertyEnumerator.h @@ -45,6 +45,7 @@ namespace Js bool GetSnapShotSemantics() const; bool GetUseCache() const; ScriptContext * GetScriptContext() const { return scriptContext; } + BigPropertyIndex GetInitialPropertyCount() const { return this->initialPropertyCount; } bool Initialize(DynamicObject * object, EnumeratorFlags flags, ScriptContext * requestContext, ForInCache * forInCache); bool IsNullEnumerator() const; diff --git a/deps/chakrashim/core/lib/Runtime/Types/DynamicType.cpp b/deps/chakrashim/core/lib/Runtime/Types/DynamicType.cpp index 88b06721310..a95e60bfe56 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DynamicType.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/DynamicType.cpp @@ -85,7 +85,7 @@ namespace Js Currently we lock Both the Type and the Type Handler in the following cases: 1. When a type is Shared. 2. Snapshot Enumeration: DynamicType::PrepareForTypeSnapshotEnumeration() - To support snapshot enumetation we need to remember the type handler at the start of the enumeration in case the type evolves during enumeration. To acieve this we lock BOTH the + To support snapshot enumeration we need to remember the type handler at the start of the enumeration in case the type evolves during enumeration. To achieve this we lock BOTH the type and the type handler in preparation for the enumeration. 3. While setting prototype: PathTypeHandlerBase::SetPrototype() While setting prototype if we create a new type and put the old type to promoted type mapping in the TypeOfPrototypeObjectDictionary property we lock and share the new type. @@ -327,11 +327,13 @@ namespace Js return GetTypeHandler()->DeleteProperty(this, propertyNameString, flags); } +#if ENABLE_FIXED_FIELDS BOOL DynamicObject::IsFixedProperty(PropertyId propertyId) { Assert(!Js::IsInternalPropertyId(propertyId)); return GetTypeHandler()->IsFixedProperty(this, propertyId); } +#endif PropertyQueryFlags DynamicObject::HasItemQuery(uint32 index) { diff --git a/deps/chakrashim/core/lib/Runtime/Types/DynamicType.h b/deps/chakrashim/core/lib/Runtime/Types/DynamicType.h index 9af0cef09a3..fa0f4ca7bfc 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/DynamicType.h +++ b/deps/chakrashim/core/lib/Runtime/Types/DynamicType.h @@ -61,6 +61,7 @@ namespace Js bool PrepareForTypeSnapshotEnumeration(); static bool Is(TypeId typeId); + static bool Is(const Type *type) { return DynamicType::Is(type->GetTypeId()); } static DynamicType * New(ScriptContext* scriptContext, TypeId typeId, RecyclableObject* prototype, JavascriptMethod entryPoint, DynamicTypeHandler * typeHandler, bool isLocked = false, bool isShared = false); static uint32 GetOffsetOfTypeHandler() { return offsetof(DynamicType, typeHandler); } diff --git a/deps/chakrashim/core/lib/Runtime/Types/ES5ArrayTypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/ES5ArrayTypeHandler.cpp index d1e186f47ed..710b2add0ab 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/ES5ArrayTypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/ES5ArrayTypeHandler.cpp @@ -1334,6 +1334,16 @@ namespace Js return indexPropertyMap->TryGetReference(index, ppDescriptor); } +#if DBG_DUMP + // Explicitly override the superclass's Dump method to prevent misleading output. Without this method, if + // someone calls Dump on an ES5ArrayTypeHandlerBase, the output would make it look like the type is actually + // a DictionaryTypeHandlerBase instance. + template void ES5ArrayTypeHandlerBase::Dump(unsigned indent) const + { + Output::Print(_u("%*sES5ArrayTypeHandlerBase (0x%p): Dump unimplemented\n"), indent, _u(""), this); + } +#endif + template class ES5ArrayTypeHandlerBase; template class ES5ArrayTypeHandlerBase; } diff --git a/deps/chakrashim/core/lib/Runtime/Types/ES5ArrayTypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/ES5ArrayTypeHandler.h index fe01b608856..e901ed95023 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/ES5ArrayTypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/ES5ArrayTypeHandler.h @@ -204,5 +204,10 @@ namespace Js //We let the handler processing fall through -- the snap object extraction will take care of visiting/copying the info from this type into the object representation. // #endif + +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override; +#endif }; } diff --git a/deps/chakrashim/core/lib/Runtime/Types/JavascriptEnumerator.cpp b/deps/chakrashim/core/lib/Runtime/Types/JavascriptEnumerator.cpp index 7bfa62656dd..c4531c344b3 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/JavascriptEnumerator.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/JavascriptEnumerator.cpp @@ -17,9 +17,16 @@ namespace Js } JavascriptEnumerator* JavascriptEnumerator::FromVar(Var aValue) + { + AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'JavascriptEnumerator'"); + + return static_cast(aValue); + } + + JavascriptEnumerator* JavascriptEnumerator::UnsafeFromVar(Var aValue) { AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptEnumerator'"); - return static_cast(RecyclableObject::FromVar(aValue)); + return static_cast(aValue); } } diff --git a/deps/chakrashim/core/lib/Runtime/Types/JavascriptEnumerator.h b/deps/chakrashim/core/lib/Runtime/Types/JavascriptEnumerator.h index c4fe220fec2..312c036f29a 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/JavascriptEnumerator.h +++ b/deps/chakrashim/core/lib/Runtime/Types/JavascriptEnumerator.h @@ -28,7 +28,8 @@ namespace Js { // // Moves to the next element and gets the current value. // PropertyId: Sets the propertyId of the current value. - // In some cases, i.e. arrays, propertyId is not returned successfully. + // In some cases, i.e. arrays, propertyId is not returned successfully. + // Must be initialized to at least NoProperty on all paths. // Returns: NULL if there are no more elements. // // Note: in the future we might want to enumerate specialPropertyIds @@ -40,5 +41,6 @@ namespace Js { static bool Is(Var aValue); static JavascriptEnumerator* FromVar(Var varValue); + static JavascriptEnumerator* UnsafeFromVar(Var varValue); }; } diff --git a/deps/chakrashim/core/lib/Runtime/Types/JavascriptStaticEnumerator.h b/deps/chakrashim/core/lib/Runtime/Types/JavascriptStaticEnumerator.h index 550d26ba528..68fa00d0896 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/JavascriptStaticEnumerator.h +++ b/deps/chakrashim/core/lib/Runtime/Types/JavascriptStaticEnumerator.h @@ -39,6 +39,7 @@ namespace Js void Reset(); uint32 GetCurrentItemIndex(); JavascriptString * MoveAndGetNext(PropertyId& propertyId, PropertyAttributes* attributes = nullptr); + BigPropertyIndex GetInitialPropertyCount() const { return this->propertyEnumerator.GetInitialPropertyCount(); } static uint32 GetOffsetOfCurrentEnumerator() { return offsetof(JavascriptStaticEnumerator, currentEnumerator); } static uint32 GetOffsetOfPrefixEnumerator() { return offsetof(JavascriptStaticEnumerator, prefixEnumerator); } diff --git a/deps/chakrashim/core/lib/Runtime/Types/MissingPropertyTypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/MissingPropertyTypeHandler.cpp index 75d59b1d0bb..2313ef0a158 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/MissingPropertyTypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/MissingPropertyTypeHandler.cpp @@ -36,6 +36,7 @@ namespace Js return 0; } +#if ENABLE_NATIVE_CODEGEN bool MissingPropertyTypeHandler::GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) { info.slotIndex = Constants::NoSlot; @@ -53,6 +54,7 @@ namespace Js { return false; } +#endif BOOL MissingPropertyTypeHandler::HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl) { @@ -222,4 +224,11 @@ namespace Js Throw::FatalInternalError(); } #endif + +#if DBG_DUMP + void MissingPropertyTypeHandler::Dump(unsigned indent) const + { + Output::Print(_u("%*sMissingPropertyTypeHandler (0x%p): Dump unimplemented\n"), indent, _u(""), this); + } +#endif } diff --git a/deps/chakrashim/core/lib/Runtime/Types/MissingPropertyTypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/MissingPropertyTypeHandler.h index 0bba5f69174..a4287f31cd0 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/MissingPropertyTypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/MissingPropertyTypeHandler.h @@ -26,9 +26,11 @@ namespace Js virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override; virtual PropertyIndex GetPropertyIndex(PropertyRecord const* propertyRecord) override; +#if ENABLE_NATIVE_CODEGEN virtual bool GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; +#endif virtual BOOL HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl = nullptr) override; virtual BOOL HasProperty(DynamicObject* instance, JavascriptString* propertyNameString) override; virtual BOOL GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; @@ -90,6 +92,10 @@ namespace Js { return 0; } +#endif +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override; #endif }; } diff --git a/deps/chakrashim/core/lib/Runtime/Types/NullTypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/NullTypeHandler.cpp index e50e1cc62e7..06ce78afb13 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/NullTypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/NullTypeHandler.cpp @@ -41,6 +41,7 @@ namespace Js return Constants::NoSlot; } +#if ENABLE_NATIVE_CODEGEN bool NullTypeHandlerBase::GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) { info.slotIndex = Constants::NoSlot; @@ -69,6 +70,7 @@ namespace Js { return entry->slotIndex == Constants::NoSlot && !entry->mustBeWritable; } +#endif BOOL NullTypeHandlerBase::HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl) { @@ -341,6 +343,14 @@ namespace Js template NullTypeHandler * NullTypeHandler::GetDefaultInstance() { return &defaultInstance; } +#if DBG_DUMP + template + void NullTypeHandler::Dump(unsigned indent) const + { + Output::Print(_u("%*sNullTypeHandler<%d> (0x%p): Dump unimplemented\n"), indent, _u(""), static_cast(IsPrototypeTemplate), this); + } +#endif + template class NullTypeHandler; template class NullTypeHandler; } diff --git a/deps/chakrashim/core/lib/Runtime/Types/NullTypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/NullTypeHandler.h index 9b112879a07..b1f77810734 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/NullTypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/NullTypeHandler.h @@ -30,9 +30,11 @@ namespace Js virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override; virtual PropertyIndex GetPropertyIndex(PropertyRecord const* propertyRecord) override; +#if ENABLE_NATIVE_CODEGEN virtual bool GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; +#endif virtual BOOL HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl = nullptr) override; virtual BOOL HasProperty(DynamicObject* instance, JavascriptString* propertyNameString) override; virtual BOOL GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; @@ -105,6 +107,10 @@ namespace Js { return 0; } +#endif +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override; #endif }; } diff --git a/deps/chakrashim/core/lib/Runtime/Types/PathTypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/PathTypeHandler.cpp index df0a9583796..6c04203766c 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/PathTypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/PathTypeHandler.cpp @@ -6,6 +6,58 @@ namespace Js { + // These attributes should match up for ease of translation + CompileAssert(ObjectSlotAttr_Enumerable == PropertyEnumerable); + CompileAssert(ObjectSlotAttr_Configurable == PropertyConfigurable); + CompileAssert(ObjectSlotAttr_Writable == PropertyWritable); + CompileAssert(ObjectSlotAttr_Deleted == PropertyDeleted); + + PathTypeSuccessorKey::PathTypeSuccessorKey() : propertyId(Constants::NoProperty), attributes(ObjectSlotAttr_Default) + { + } + + PathTypeSuccessorKey::PathTypeSuccessorKey( + const PropertyId propertyId, + const ObjectSlotAttributes attributes) + : propertyId(propertyId), attributes(attributes) + { + } + + bool PathTypeSuccessorKey::HasInfo() const + { + return propertyId != Constants::NoProperty; + } + + void PathTypeSuccessorKey::Clear() + { + propertyId = Constants::NoProperty; + } + + PropertyId PathTypeSuccessorKey::GetPropertyId() const + { + return propertyId; + } + + ObjectSlotAttributes PathTypeSuccessorKey::GetAttributes() const + { + return attributes; + } + + bool PathTypeSuccessorKey::operator ==(const PathTypeSuccessorKey &other) const + { + return propertyId == other.propertyId && attributes == other.attributes; + } + + bool PathTypeSuccessorKey::operator !=(const PathTypeSuccessorKey &other) const + { + return !(*this == other); + } + + hash_t PathTypeSuccessorKey::GetHashCode() const + { + return static_cast((propertyId << ObjectSlotAttr_BitSize) | static_cast(attributes)); + } + PathTypeHandlerBase::PathTypeHandlerBase(TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) : DynamicTypeHandler(slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, DefaultFlags | (isLocked ? IsLockedFlag : 0) | (isShared ? (MayBecomeSharedFlag | IsSharedFlag) : 0)), typePath(typePath), @@ -26,7 +78,7 @@ namespace Js { if (index < GetPathLength()) { - return typePath->GetPropertyId(index)->GetPropertyId(); + return GetTypePath()->GetPropertyId(index)->GetPropertyId(); } else { @@ -38,7 +90,7 @@ namespace Js { if (index < GetPathLength()) { - return typePath->GetPropertyId(index)->GetPropertyId(); + return GetTypePath()->GetPropertyId(index)->GetPropertyId(); } else { @@ -46,7 +98,7 @@ namespace Js } } - BOOL PathTypeHandlerBase::FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyStringName, PropertyId* propertyId, + BOOL PathTypeHandlerBase::FindNextPropertyHelper(ScriptContext* scriptContext, ObjectSlotAttributes * objectAttrs, PropertyIndex& index, JavascriptString** propertyStringName, PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) { Assert(propertyStringName); @@ -57,30 +109,43 @@ namespace Js { for (; index < GetPathLength(); ++index) { - const PropertyRecord* propertyRecord = typePath->GetPropertyId(index); - - // Skip this property if it is a symbol and we are not including symbol properties - if (!(flags & EnumeratorFlags::EnumSymbols) && propertyRecord->IsSymbol()) + ObjectSlotAttributes attr = objectAttrs ? objectAttrs[index] : ObjectSlotAttr_Default; + if( !(attr & ObjectSlotAttr_Deleted) && (!!(flags & EnumeratorFlags::EnumNonEnumerable) || (attr & ObjectSlotAttr_Enumerable))) { - continue; - } + const PropertyRecord* propertyRecord = GetTypePath()->GetPropertyId(index); - if (attributes) - { - *attributes = PropertyEnumerable; - } + // Skip this property if it is a symbol and we are not including symbol properties + if (!(flags & EnumeratorFlags::EnumSymbols) && propertyRecord->IsSymbol()) + { + continue; + } + + if (attributes) + { + *attributes = ObjectSlotAttributesToPropertyAttributes(attr); + } - *propertyId = propertyRecord->GetPropertyId(); - PropertyString* propertyString = scriptContext->GetPropertyString(*propertyId); - *propertyStringName = propertyString; + *propertyId = propertyRecord->GetPropertyId(); + PropertyString* propertyString = scriptContext->GetPropertyString(*propertyId); + *propertyStringName = propertyString; - PropertyValueInfo::SetCacheInfo(info, propertyString, propertyString->GetLdElemInlineCache(), false); - PropertyValueInfo::Set(info, instance, index); - if (FixPropsOnPathTypes() && (index >= this->typePath->GetMaxInitializedLength() || this->typePath->GetIsFixedFieldAt(index, GetPathLength()))) - { - PropertyValueInfo::DisableStoreFieldCache(info); + if (attr & ObjectSlotAttr_Writable) + { + PropertyValueInfo::SetCacheInfo(info, propertyString, propertyString->GetLdElemInlineCache(), false); + PropertyValueInfo::Set(info, instance, index, ObjectSlotAttributesToPropertyAttributes(attr)); +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + if (FixPropsOnPathTypes() && (index >= this->GetTypePath()->GetMaxInitializedLength() || this->GetTypePath()->GetIsFixedFieldAt(index, GetPathLength()))) + { + PropertyValueInfo::DisableStoreFieldCache(info); + } +#endif + } + else + { + PropertyValueInfo::SetNoCache(info, instance); + } + return TRUE; } - return TRUE; } PropertyValueInfo::SetNoCache(info, instance); return FALSE; @@ -111,19 +176,130 @@ namespace Js return found; } + BOOL PathTypeHandlerBase::SetAttributesHelper(DynamicObject* instance, PropertyId propertyId, PropertyIndex propertyIndex, ObjectSlotAttributes * instanceAttributes, ObjectSlotAttributes propertyAttributes) + { + if (instanceAttributes == nullptr ? propertyAttributes == ObjectSlotAttr_Default : propertyAttributes == instanceAttributes[propertyIndex]) + { + return true; + } + + // Create a handler with attributes and use it to set the attribute. + + // Find the predecessor from which to branch. + PathTypeHandlerBase *predTypeHandler = this; + DynamicType *currentType = instance->GetDynamicType(); + while (predTypeHandler->GetPathLength() > propertyIndex) + { + currentType = predTypeHandler->GetPredecessorType(); + if (currentType == nullptr) + { + // This can happen if object header inlining is deoptimized, and we haven't built a full path from the root. + // For now, just punt this case. + return ConvertToSimpleDictionaryType(instance, GetPathLength())->SetAttributes(instance, propertyId, ObjectSlotAttributesToPropertyAttributes(propertyAttributes)); + } + predTypeHandler = PathTypeHandlerBase::FromTypeHandler(currentType->GetTypeHandler()); + } + Assert(predTypeHandler); + Assert(predTypeHandler->GetTypePath()->LookupInline(propertyId, predTypeHandler->GetPathLength()) == Constants::NoSlot); + + // Add this property with the new attributes and add the remaining properties with no attributes. + PropertyIndex pathLength = GetPathLength(); + PropertyIndex currentSlotIndex = propertyIndex; + ObjectSlotAttributes currentAttributes = propertyAttributes; + PathTypeHandlerBase *currentTypeHandler = predTypeHandler; + ScriptContext *scriptContext = instance->GetScriptContext(); + while (true) + { + const PropertyRecord *currentPropertyRecord = GetTypePath()->GetPropertyIdUnchecked(currentSlotIndex); + currentType = currentTypeHandler->PromoteType(currentType, PathTypeSuccessorKey(currentPropertyRecord->GetPropertyId(), currentAttributes), false, scriptContext, instance, ¤tSlotIndex); + currentTypeHandler = PathTypeHandlerBase::FromTypeHandler(currentType->GetTypeHandler()); +#if ENABLE_FIXED_FIELDS +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + currentTypeHandler->InitializePath( + instance, currentSlotIndex, currentTypeHandler->GetPathLength(), scriptContext, [=]() { return typePath->GetIsFixedFieldAt(currentSlotIndex, currentTypeHandler->GetPathLength()); }); +#endif +#endif + currentSlotIndex = currentTypeHandler->GetPathLength(); + if (currentSlotIndex >= pathLength) + { + break; + } + currentAttributes = instanceAttributes ? instanceAttributes[currentSlotIndex] : ObjectSlotAttr_Default; + } + + Assert(currentType != instance->GetType()); + instance->ReplaceType(currentType); + if(!IsolatePrototypes() && GetFlags() & IsPrototypeFlag) + { + scriptContext->InvalidateProtoCaches(propertyId); + } + + return true; + } + + +#if ENABLE_FIXED_FIELDS +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + void PathTypeHandlerBase::InitializeExistingPath( + const PropertyIndex slotIndex, + const PropertyIndex objectSlotCount, + ScriptContext *const scriptContext) + { + Assert(scriptContext); + + TypePath *const typePath = GetTypePath(); + Assert(slotIndex < typePath->GetMaxInitializedLength()); + Assert(objectSlotCount <= typePath->GetMaxInitializedLength()); + + if(typePath->GetIsUsedFixedFieldAt(slotIndex, objectSlotCount)) + { + // We are adding a new value where some other instance already has an existing value. If this is a fixed + // field we must clear the bit. If the value was hard coded in the JIT-ed code, we must invalidate the guards. + + // Invalidate any JIT-ed code that hard coded this method. No need to invalidate store field + // inline caches (which might quitely overwrite this fixed fields, because they have never been populated. + scriptContext->GetThreadContext()->InvalidatePropertyGuards(typePath->GetPropertyIdUnchecked(slotIndex)->GetPropertyId()); + } + + // If we're overwriting an existing value of this property, we don't consider the new one fixed. + // This also means that it's ok to populate the inline caches for this property from now on. + typePath->ClearIsFixedFieldAt(slotIndex, objectSlotCount); + + Assert(HasOnlyInitializedNonFixedProperties(/*typePath, objectSlotCount*/)); + Assert(HasSingletonInstanceOnlyIfNeeded(/*typePath*/)); + if(objectSlotCount == typePath->GetMaxInitializedLength()) + { + // We have now reached the most advanced instance along this path. If this instance is not the singleton instance, + // then the former singleton instance (if any) is no longer a singleton. This instance could be the singleton + // instance, if we just happen to set (overwrite) its last property. + + // This is perhaps the most fragile point of fixed fields on path types. If we cleared the singleton instance + // while some fields remained fixed, the instance would be collectible, and yet some code would expect to see + // values and call methods on it. Clearly, a recipe for disaster. We rely on the fact that we always add + // properties to (pre-initialized) type handlers in the order they appear on the type path. By the time + // we reach the singleton instance, all fixed fields will have been invalidated. Otherwise, some fields + // could remain fixed (or even uninitialized) and we would have to spin off a loop here to invalidate any + // remaining fixed fields - a rather unfortunate overhead. + typePath->ClearSingletonInstance(); + } + } +#endif +#endif + PropertyIndex PathTypeHandlerBase::GetPropertyIndex(const PropertyRecord* propertyRecord) { - return typePath->LookupInline(propertyRecord->GetPropertyId(), GetPathLength()); + return GetTypePath()->LookupInline(propertyRecord->GetPropertyId(), GetPathLength()); } PropertyIndex PathTypeHandlerBase::GetPropertyIndex(PropertyId propertyId) { - return typePath->LookupInline(propertyId, GetPathLength()); + return GetTypePath()->LookupInline(propertyId, GetPathLength()); } +#if ENABLE_NATIVE_CODEGEN bool PathTypeHandlerBase::GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) { - Js::PropertyIndex absSlotIndex = typePath->LookupInline(propertyRecord->GetPropertyId(), GetPathLength()); + Js::PropertyIndex absSlotIndex = GetTypePath()->LookupInline(propertyRecord->GetPropertyId(), GetPathLength()); info.slotIndex = AdjustSlotIndexForInlineSlots(absSlotIndex); info.isAuxSlot = absSlotIndex >= this->inlineSlotCapacity; info.isWritable = info.slotIndex != Constants::NoSlot; @@ -131,13 +307,18 @@ namespace Js } bool PathTypeHandlerBase::IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) + { + return IsObjTypeSpecEquivalentHelper(type, nullptr, record, failedPropertyIndex); + } + + bool PathTypeHandlerBase::IsObjTypeSpecEquivalentHelper(const Type* type, const ObjectSlotAttributes * attributes, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) { uint propertyCount = record.propertyCount; Js::EquivalentPropertyEntry* properties = record.properties; for (uint pi = 0; pi < propertyCount; pi++) { const EquivalentPropertyEntry* entry = &properties[pi]; - if (!this->PathTypeHandlerBase::IsObjTypeSpecEquivalent(type, entry)) + if (!this->PathTypeHandlerBase::IsObjTypeSpecEquivalentHelper(type, attributes, entry)) { failedPropertyIndex = pi; return false; @@ -149,20 +330,47 @@ namespace Js bool PathTypeHandlerBase::IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry *entry) { - Js::PropertyIndex absSlotIndex = typePath->LookupInline(entry->propertyId, GetPathLength()); + return IsObjTypeSpecEquivalentHelper(type, nullptr, entry); + } + + bool PathTypeHandlerBase::IsObjTypeSpecEquivalentHelper(const Type* type, const ObjectSlotAttributes * attributes, const EquivalentPropertyEntry *entry) + { + Js::PropertyIndex absSlotIndex = GetTypePath()->LookupInline(entry->propertyId, GetPathLength()); if (absSlotIndex != Constants::NoSlot) { + ObjectSlotAttributes attr = attributes ? attributes[absSlotIndex] : ObjectSlotAttr_Default; + + if (attr & ObjectSlotAttr_Deleted) + { + return entry->slotIndex == Constants::NoSlot && !entry->mustBeWritable; + } + + if (attr & ObjectSlotAttr_Accessor) + { + return false; + } + Js::PropertyIndex relSlotIndex = AdjustValidSlotIndexForInlineSlots(absSlotIndex); if (relSlotIndex != entry->slotIndex || ((absSlotIndex >= GetInlineSlotCapacity()) != entry->isAuxSlot)) { return false; } - int maxInitializedLength = this->typePath->GetMaxInitializedLength(); - if (entry->mustBeWritable && FixPropsOnPathTypes() && (absSlotIndex >= maxInitializedLength || this->typePath->GetIsFixedFieldAt(absSlotIndex, this->GetPathLength()))) + if (entry->mustBeWritable) { - return false; + if (!(attr & ObjectSlotAttr_Writable)) + { + return false; + } + +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + int maxInitializedLength = this->GetTypePath()->GetMaxInitializedLength(); + if (FixPropsOnPathTypes() && (absSlotIndex >= maxInitializedLength || this->GetTypePath()->GetIsFixedFieldAt(absSlotIndex, this->GetPathLength()))) + { + return false; + } +#endif } } else @@ -175,6 +383,7 @@ namespace Js return true; } +#endif BOOL PathTypeHandlerBase::HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl) { @@ -209,15 +418,17 @@ namespace Js BOOL PathTypeHandlerBase::GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) { - PropertyIndex index = typePath->LookupInline(propertyId, GetPathLength()); + PropertyIndex index = GetTypePath()->LookupInline(propertyId, GetPathLength()); if (index != Constants::NoSlot) { *value = instance->GetSlot(index); PropertyValueInfo::Set(info, instance, index); - if (FixPropsOnPathTypes() && (index >= this->typePath->GetMaxInitializedLength() || this->typePath->GetIsFixedFieldAt(index, GetPathLength()))) +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + if (FixPropsOnPathTypes() && (index >= this->GetTypePath()->GetMaxInitializedLength() || this->GetTypePath()->GetIsFixedFieldAt(index, GetPathLength()))) { PropertyValueInfo::DisableStoreFieldCache(info); } +#endif return true; } @@ -237,16 +448,14 @@ namespace Js // Consider: Implement actual string hash lookup Assert(requestContext); PropertyRecord const* propertyRecord; - char16 const * propertyName = propertyNameString->GetString(); - charcount_t const propertyNameLength = propertyNameString->GetLength(); if (instance->HasObjectArray()) { - requestContext->GetOrAddPropertyRecord(propertyName, propertyNameLength, &propertyRecord); + requestContext->GetOrAddPropertyRecord(propertyNameString, &propertyRecord); } else { - requestContext->FindPropertyRecord(propertyName, propertyNameLength, &propertyRecord); + requestContext->FindPropertyRecord(propertyNameString, &propertyRecord); if (propertyRecord == nullptr) { *value = requestContext->GetMissingPropertyResult(); @@ -258,7 +467,7 @@ namespace Js BOOL PathTypeHandlerBase::SetProperty(DynamicObject* instance, PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) { - return SetPropertyInternal(instance, propertyId, value, info, flags, SideEffects_Any); + return SetPropertyInternal(instance, propertyId, value, ObjectSlotAttr_Default, info, flags, SideEffects_Any); } BOOL PathTypeHandlerBase::SetProperty(DynamicObject* instance, JavascriptString* propertyNameString, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) @@ -269,7 +478,42 @@ namespace Js return PathTypeHandlerBase::SetProperty(instance, propertyRecord->GetPropertyId(), value, flags, info); } - BOOL PathTypeHandlerBase::SetPropertyInternal(DynamicObject* instance, PropertyId propertyId, Var value, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects) + void PathTypeHandlerBase::SetSlotAndCache(DynamicObject* instance, PropertyId propertyId, PropertyRecord const * propertyRecord, PropertyIndex index, Var value, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects) + { +#if ENABLE_FIXED_FIELDS + // Don't populate inline cache if this handler isn't yet shared. If we did, a new instance could + // reach this handler without us noticing and we could fail to release the old singleton instance, which may later + // become collectible (not referenced by anything other than this handler), thus we would leak the old singleton instance. + bool populateInlineCache = GetIsShared() || + ProcessFixedFieldChange(instance, propertyId, index, value, (flags & PropertyOperation_NonFixedValue) != 0, propertyRecord); +#else + bool populateInlineCache = true; +#endif + + SetSlotUnchecked(instance, index, value); + + if (populateInlineCache) + { +#if ENABLE_FIXED_FIELDS + Assert((instance->GetDynamicType()->GetIsShared()) || (FixPropsOnPathTypes() && instance->GetDynamicType()->GetTypeHandler()->GetIsOrMayBecomeShared())); +#endif + // Can't assert the following. With NewScObject we can jump to the type handler at the tip (where the singleton is), + // even though we haven't yet initialized the properties all the way to the tip, and we don't want to kill + // the singleton in that case yet. It's basically a transient inconsistent state, but we have to live with it. + // The user's code will never see the object in this state. + //Assert(!instance->GetTypeHandler()->HasSingletonInstance()); + PropertyValueInfo::Set(info, instance, index); + } + else + { + PropertyValueInfo::SetNoCache(info, instance); + } + + SetPropertyUpdateSideEffect(instance, propertyId, value, possibleSideEffects); + } + + template + BOOL PathTypeHandlerBase::SetPropertyInternal(DynamicObject* instance, PropertyId propertyId, Var value, ObjectSlotAttributes attr, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects) { // Path type handler doesn't support pre-initialization (PropertyOperation_PreInit). Pre-initialized properties // will get marked as fixed when pre-initialized and then as non-fixed when their actual values are set. @@ -289,27 +533,12 @@ namespace Js Assert(instance->GetDynamicType()->GetIsShared() == GetIsShared()); - bool populateInlineCache = GetIsShared() || - ProcessFixedFieldChange(instance, propertyId, index, value, (flags & PropertyOperation_NonFixedValue) != 0); - - SetSlotUnchecked(instance, index, value); - - if (populateInlineCache) + if (setAttributes) { - Assert((instance->GetDynamicType()->GetIsShared()) || (FixPropsOnPathTypes() && instance->GetDynamicType()->GetTypeHandler()->GetIsOrMayBecomeShared())); - // Can't assert the following. With NewScObject we can jump to the type handler at the tip (where the singleton is), - // even though we haven't yet initialized the properties all the way to the tip, and we don't want to kill - // the singleton in that case yet. It's basically a transient inconsistent state, but we have to live with it. - // The user's code will never see the object in this state. - //Assert(!instance->GetTypeHandler()->HasSingletonInstance()); - PropertyValueInfo::Set(info, instance, index); + this->SetAttributesHelper(instance, propertyId, index, GetAttributeArray(), attr); } - else - { - PropertyValueInfo::SetNoCache(info, instance); - } - - SetPropertyUpdateSideEffect(instance, propertyId, value, possibleSideEffects); + PathTypeHandlerBase *newTypeHandler = PathTypeHandlerBase::FromTypeHandler(instance->GetDynamicType()->GetTypeHandler()); + newTypeHandler->SetSlotAndCache(instance, propertyId, nullptr, index, value, info, flags, possibleSideEffects); return true; } @@ -318,10 +547,17 @@ namespace Js uint32 indexVal; if (scriptContext->IsNumericPropertyId(propertyId, &indexVal)) { + if (setAttributes) + { + if (attr != ObjectSlotAttr_Default) + { + return this->ConvertToTypeWithItemAttributes(instance)->SetItemWithAttributes(instance, indexVal, value, ObjectSlotAttributesToPropertyAttributes(attr)); + } + } return PathTypeHandlerBase::SetItem(instance, indexVal, value, PropertyOperation_None); } - return PathTypeHandlerBase::AddPropertyInternal(instance, propertyId, value, info, flags, possibleSideEffects); + return PathTypeHandlerBase::AddPropertyInternal(instance, propertyId, value, attr, info, flags, possibleSideEffects); } void PathTypeHandlerBase::MoveAuxSlotsToObjectHeader(DynamicObject *const object) @@ -418,7 +654,9 @@ namespace Js // ShareType will take care of invalidating fixed fields and removing singleton object from predecessorType predecessorType->ShareType(); - this->typePath->ClearSingletonInstanceIfSame(object); +#if ENABLE_FIXED_FIELDS + this->GetTypePath()->ClearSingletonInstanceIfSame(object); +#endif object->ReplaceTypeWithPredecessorType(predecessorType); @@ -443,6 +681,17 @@ namespace Js return TRUE; } + ObjectSlotAttributes attr = this->GetAttributes(index); + if (attr & ObjectSlotAttr_Deleted) + { + return TRUE; + } + if (!(attr & ObjectSlotAttr_Configurable)) + { + JavascriptError::ThrowCantDelete(PropertyOperation_None, scriptContext, scriptContext->GetPropertyName(propertyId)->GetBuffer()); + return FALSE; + } + uint16 pathLength = GetPathLength(); if ((index + 1) == pathLength && @@ -462,19 +711,6 @@ namespace Js return deleteResult; } - BOOL PathTypeHandlerBase::IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) - { - if (!FixPropsOnPathTypes()) - { - return false; - } - - PropertyIndex index = PathTypeHandlerBase::GetPropertyIndex(propertyId); - Assert(index != Constants::NoSlot); - - return this->typePath->GetIsFixedFieldAt(index, GetPathLength()); - } - BOOL PathTypeHandlerBase::IsEnumerable(DynamicObject* instance, PropertyId propertyId) { return true; @@ -490,28 +726,85 @@ namespace Js return true; } - BOOL PathTypeHandlerBase::SetEnumerable(DynamicObject* instance, PropertyId propertyId, BOOL value) + BOOL PathTypeHandlerBase::SetConfigurable(DynamicObject* instance, PropertyId propertyId, BOOL value) { -#ifdef PROFILE_TYPES - instance->GetScriptContext()->convertPathToDictionaryCount3++; -#endif - return value || ConvertToSimpleDictionaryType(instance, GetPathLength())->SetEnumerable(instance, propertyId, value); + if (value) + { + return true; + } + + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetConfigurable(instance, propertyId, value); + } + } + return true; + } + + return SetAttributesHelper(instance, propertyId, propertyIndex, nullptr, (ObjectSlotAttributes)(ObjectSlotAttr_Default & ~ObjectSlotAttr_Configurable)); } - BOOL PathTypeHandlerBase::SetWritable(DynamicObject* instance, PropertyId propertyId, BOOL value) + BOOL PathTypeHandlerBase::SetEnumerable(DynamicObject* instance, PropertyId propertyId, BOOL value) { -#ifdef PROFILE_TYPES - instance->GetScriptContext()->convertPathToDictionaryCount3++; -#endif - return value || ConvertToSimpleDictionaryType(instance, GetPathLength())->SetWritable(instance, propertyId, value); + if (value) + { + return true; + } + + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetEnumerable(instance, propertyId, value); + } + } + return true; + } + + return SetAttributesHelper(instance, propertyId, propertyIndex, nullptr, (ObjectSlotAttributes)(ObjectSlotAttr_Default & ~ObjectSlotAttr_Enumerable)); } - BOOL PathTypeHandlerBase::SetConfigurable(DynamicObject* instance, PropertyId propertyId, BOOL value) + BOOL PathTypeHandlerBase::SetWritable(DynamicObject* instance, PropertyId propertyId, BOOL value) { -#ifdef PROFILE_TYPES - instance->GetScriptContext()->convertPathToDictionaryCount3++; -#endif - return value || ConvertToSimpleDictionaryType(instance, GetPathLength())->SetConfigurable(instance, propertyId, value); + if (value) + { + return true; + } + + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetWritable(instance, propertyId, value); + } + } + return true; + } + + return SetAttributesHelper(instance, propertyId, propertyIndex, nullptr, (ObjectSlotAttributes)(ObjectSlotAttr_Default & ~ObjectSlotAttr_Writable)); } BOOL PathTypeHandlerBase::SetAccessors(DynamicObject* instance, PropertyId propertyId, Var getter, Var setter, PropertyOperationFlags flags) @@ -608,9 +901,10 @@ namespace Js RecyclerWeakReference* newTypeWeakRef = nullptr; DynamicType * oldType = instance->GetDynamicType(); + PathTypeSuccessorKey key(operationInternalPropertyRecord->GetPropertyId(), ObjectSlotAttr_Default); // See if we already have shared type for this type and convert to it, otherwise create a new one. - if (!GetSuccessor(operationInternalPropertyRecord, &newTypeWeakRef) || newTypeWeakRef->Get() == nullptr) + if (!GetSuccessor(key, &newTypeWeakRef) || newTypeWeakRef->Get() == nullptr) { // Convert to new shared type with shared simple dictionary type handler and call operation on it. SimpleDictionaryTypeHandlerWithNontExtensibleSupport* newTypeHandler = ConvertToSimpleDictionaryType @@ -623,7 +917,7 @@ namespace Js ScriptContext * scriptContext = instance->GetScriptContext(); Recycler * recycler = scriptContext->GetRecycler(); - SetSuccessor(oldType, operationInternalPropertyRecord, recycler->CreateWeakReferenceHandle(newType), scriptContext); + SetSuccessor(oldType, key, recycler->CreateWeakReferenceHandle(newType), scriptContext); return operation(newTypeHandler); } else @@ -638,7 +932,9 @@ namespace Js // There should be nothing to transfer. // Assert(!IsolatePrototypes() || (this->GetFlags() & IsPrototypeFlag) == 0); newTypeHandler->SetFlags(IsPrototypeFlag, this->GetFlags()); +#if ENABLE_FIXED_FIELDS Assert(!newTypeHandler->HasSingletonInstance()); +#endif if(instance->IsObjectHeaderInlinedTypeHandler()) { @@ -651,12 +947,12 @@ namespace Js return TRUE; } - DynamicType* PathTypeHandlerBase::PromoteType(DynamicObject* instance, const PropertyRecord* propertyRecord, PropertyIndex* propertyIndex) + DynamicType* PathTypeHandlerBase::PromoteType(DynamicObject* instance, const PathTypeSuccessorKey key, PropertyIndex* propertyIndex) { ScriptContext* scriptContext = instance->GetScriptContext(); DynamicType* currentType = instance->GetDynamicType(); - DynamicType* nextType = this->PromoteType(currentType, propertyRecord, false, scriptContext, instance, propertyIndex); + DynamicType* nextType = this->PromoteType(currentType, key, false, scriptContext, instance, propertyIndex); PathTypeHandlerBase* nextPath = (PathTypeHandlerBase*) nextType->GetTypeHandler(); instance->EnsureSlots(this->GetSlotCapacity(), nextPath->GetSlotCapacity(), scriptContext, nextType->GetTypeHandler()); @@ -696,6 +992,7 @@ namespace Js // We expect the new type handler to start off marked as having only writable data properties. Assert(newTypeHandler->GetHasOnlyWritableDataProperties()); +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS DynamicType* oldType = instance->GetDynamicType(); RecyclerWeakReference* oldSingletonInstance = oldTypeHandler->GetSingletonInstance(); @@ -723,7 +1020,7 @@ namespace Js { if (DynamicTypeHandler::AreSingletonInstancesNeeded()) { - RecyclerWeakReference* curSingletonInstance = oldTypeHandler->typePath->GetSingletonInstance(); + RecyclerWeakReference* curSingletonInstance = oldTypeHandler->GetTypePath()->GetSingletonInstance(); if (curSingletonInstance != nullptr && curSingletonInstance->Get() == instance) { newTypeHandler->SetSingletonInstance(curSingletonInstance); @@ -740,25 +1037,29 @@ namespace Js // If we are a prototype or may become a prototype we must transfer used as fixed bits. See point 4 in ConvertToSimpleDictionaryType. Assert(!DynamicTypeHandler::IsolatePrototypes() || ((oldTypeHandler->GetFlags() & IsPrototypeFlag) == 0)); bool transferUsedAsFixed = ((oldTypeHandler->GetFlags() & IsPrototypeFlag) != 0 || (oldTypeHandler->GetIsOrMayBecomeShared() && !DynamicTypeHandler::IsolatePrototypes())); +#endif + ObjectSlotAttributes * attributes = this->GetAttributeArray(); for (PropertyIndex i = 0; i < oldTypeHandler->GetPathLength(); i++) { +#if ENABLE_FIXED_FIELDS // Consider: As noted in point 2 in ConvertToSimpleDictionaryType, when converting to non-shared handler we could be more // aggressive and mark every field as fixed, because we will always take a type transition. We have to remember to respect // the switches as to which kinds of properties we should fix, and for that we need the values from the instance. Even if // the type handler says the property is initialized, the current instance may not have a value for it. Check for value != null. if (PathTypeHandlerBase::FixPropsOnPathTypes()) { - TypePath * typePath = oldTypeHandler->typePath; - newTypeHandler->Add(typePath->GetPropertyId(i), PropertyDynamicTypeDefaults, + TypePath * typePath = oldTypeHandler->GetTypePath(); + newTypeHandler->Add(typePath->GetPropertyId(i), attributes ? ObjectSlotAttributesToPropertyAttributes(attributes[i]) : PropertyDynamicTypeDefaults, i < typePath->GetMaxInitializedLength(), transferFixed && typePath->GetIsFixedFieldAt(i, oldTypeHandler->GetPathLength()), transferUsedAsFixed && typePath->GetIsUsedFixedFieldAt(i, oldTypeHandler->GetPathLength()), scriptContext); } else +#endif { - newTypeHandler->Add(oldTypeHandler->typePath->GetPropertyId(i), PropertyDynamicTypeDefaults, true, false, false, scriptContext); + newTypeHandler->Add(oldTypeHandler->GetTypePath()->GetPropertyId(i), attributes ? ObjectSlotAttributesToPropertyAttributes(attributes[i]) : PropertyDynamicTypeDefaults, true, false, false, scriptContext); } } @@ -766,7 +1067,7 @@ namespace Js if (PathTypeHandlerBase::FixPropsOnPathTypes()) { Assert(oldTypeHandler->HasSingletonInstanceOnlyIfNeeded()); - oldTypeHandler->typePath->ClearSingletonInstanceIfSame(instance); + oldTypeHandler->GetTypePath()->ClearSingletonInstanceIfSame(instance); } #endif @@ -781,10 +1082,13 @@ namespace Js Assert(newTypeHandler->GetIsInlineSlotCapacityLocked()); newTypeHandler->SetPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection, oldTypeHandler->GetPropertyTypes()); newTypeHandler->SetInstanceTypeHandler(instance); + +#if ENABLE_FIXED_FIELDS Assert(!newTypeHandler->HasSingletonInstance() || !instance->HasSharedType()); #ifdef ENABLE_DEBUG_CONFIG_OPTIONS PathTypeHandlerBase::TraceFixedFieldsAfterTypeHandlerChange(instance, oldTypeHandler, newTypeHandler, oldType, instance->GetDynamicType(), oldSingletonInstance); +#endif #endif return newTypeHandler; @@ -828,7 +1132,9 @@ namespace Js Assert(oldTypeHandler); +#if ENABLE_FIXED_FIELDS DynamicType* oldType = instance->GetDynamicType(); +#endif T* newTypeHandler = RecyclerNew(recycler, T, recycler, oldTypeHandler->GetSlotCapacity(), propertyCapacity, oldTypeHandler->GetInlineSlotCapacity(), oldTypeHandler->GetOffsetOfInlineSlots()); // We expect the new type handler to start off marked as having only writable data properties. Assert(newTypeHandler->GetHasOnlyWritableDataProperties()); @@ -898,6 +1204,7 @@ namespace Js // No. With the rules above any necessary invalidation will be triggered when the value actually gets overwritten. // +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS RecyclerWeakReference* oldSingletonInstance = oldTypeHandler->GetSingletonInstance(); oldTypeHandler->TraceFixedFieldsBeforeTypeHandlerChange(_u("converting"), _u("PathTypeHandler"), _u("SimpleDictionaryTypeHandler"), instance, oldTypeHandler, oldType, oldSingletonInstance); @@ -914,7 +1221,7 @@ namespace Js Assert(oldTypeHandler->HasSingletonInstanceOnlyIfNeeded()); if (DynamicTypeHandler::AreSingletonInstancesNeeded()) { - RecyclerWeakReference* curSingletonInstance = oldTypeHandler->typePath->GetSingletonInstance(); + RecyclerWeakReference* curSingletonInstance = oldTypeHandler->GetTypePath()->GetSingletonInstance(); if (curSingletonInstance != nullptr && curSingletonInstance->Get() == instance) { newTypeHandler->SetSingletonInstance(curSingletonInstance); @@ -939,25 +1246,30 @@ namespace Js Assert(instance->GetTypeId() != TypeIds_GlobalObject); // If the type isn't locked, we may not change the type of the instance, and we must also track the used fixed fields on the new handler. bool transferUsedAsFixed = !instance->GetDynamicType()->GetIsLocked() || ((oldTypeHandler->GetFlags() & IsPrototypeFlag) != 0 || (oldTypeHandler->GetIsOrMayBecomeShared() && !DynamicTypeHandler::IsolatePrototypes())); +#endif // Consider: As noted in point 2 above, when converting to non-shared SimpleDictionaryTypeHandler we could be more aggressive // and mark every field as fixed, because we will always take a type transition. We have to remember to respect the switches as // to which kinds of properties we should fix, and for that we need the values from the instance. Even if the type handler // says the property is initialized, the current instance may not have a value for it. Check for value != null. + + ObjectSlotAttributes * attributes = this->GetAttributeArray(); for (PropertyIndex i = 0; i < oldTypeHandler->GetPathLength(); i++) { +#if ENABLE_FIXED_FIELDS if (PathTypeHandlerBase::FixPropsOnPathTypes()) { - Js::TypePath * typePath = oldTypeHandler->typePath; - newTypeHandler->Add(typePath->GetPropertyId(i), PropertyDynamicTypeDefaults, + Js::TypePath * typePath = oldTypeHandler->GetTypePath(); + newTypeHandler->Add(typePath->GetPropertyId(i), attributes ? ObjectSlotAttributesToPropertyAttributes(attributes[i]) : PropertyDynamicTypeDefaults, i < typePath->GetMaxInitializedLength(), transferIsFixed && typePath->GetIsFixedFieldAt(i, GetPathLength()), transferUsedAsFixed && typePath->GetIsUsedFixedFieldAt(i, GetPathLength()), scriptContext); } else +#endif { - newTypeHandler->Add(oldTypeHandler->typePath->GetPropertyId(i), PropertyDynamicTypeDefaults, true, false, false, scriptContext); + newTypeHandler->Add(oldTypeHandler->GetTypePath()->GetPropertyId(i), attributes ? ObjectSlotAttributesToPropertyAttributes(attributes[i]) : PropertyDynamicTypeDefaults, true, false, false, scriptContext); } // No need to clear fixed fields not used as fixed, because we never convert during pre-creation of type handlers and we always @@ -970,7 +1282,7 @@ namespace Js if (PathTypeHandlerBase::FixPropsOnPathTypes()) { Assert(oldTypeHandler->HasSingletonInstanceOnlyIfNeeded()); - oldTypeHandler->typePath->ClearSingletonInstanceIfSame(instance); + oldTypeHandler->GetTypePath()->ClearSingletonInstanceIfSame(instance); } #endif @@ -988,6 +1300,8 @@ namespace Js Assert(newTypeHandler->GetIsInlineSlotCapacityLocked()); newTypeHandler->SetPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection, oldTypeHandler->GetPropertyTypes()); newTypeHandler->SetInstanceTypeHandler(instance); + +#if ENABLE_FIXED_FIELDS Assert(!newTypeHandler->HasSingletonInstance() || !instance->HasSharedType()); // We assumed that we don't need to transfer used as fixed bits unless we are a prototype, which is only valid if we also changed the type. Assert(transferUsedAsFixed || (instance->GetType() != oldType && oldType->GetTypeId() != TypeIds_GlobalObject)); @@ -995,6 +1309,7 @@ namespace Js #ifdef ENABLE_DEBUG_CONFIG_OPTIONS PathTypeHandlerBase::TraceFixedFieldsAfterTypeHandlerChange(instance, oldTypeHandler, newTypeHandler, oldType, instance->GetDynamicType(), oldSingletonInstance); #endif +#endif #ifdef PROFILE_TYPES scriptContext->convertPathToSimpleDictionaryCount++; @@ -1004,9 +1319,9 @@ namespace Js BOOL PathTypeHandlerBase::SetPropertyWithAttributes(DynamicObject* instance, PropertyId propertyId, Var value, PropertyAttributes attributes, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects) { - if (attributes == PropertyDynamicTypeDefaults) + if (ObjectSlotAttributesContains(attributes)) { - return PathTypeHandlerBase::SetPropertyInternal(instance, propertyId, value, info, flags, possibleSideEffects); + return PathTypeHandlerBase::SetPropertyInternal(instance, propertyId, value, PropertyAttributesToObjectSlotAttributes(attributes), info, flags, possibleSideEffects); } else { @@ -1016,7 +1331,7 @@ namespace Js BOOL PathTypeHandlerBase::SetAttributes(DynamicObject* instance, PropertyId propertyId, PropertyAttributes attributes) { - if ( (attributes & PropertyDynamicTypeDefaults) != PropertyDynamicTypeDefaults) + if (!ObjectSlotAttributesContains(attributes)) { #ifdef PROFILE_TYPES instance->GetScriptContext()->convertPathToDictionaryCount3++; @@ -1025,7 +1340,21 @@ namespace Js return ConvertToSimpleDictionaryType(instance, GetPathLength())->SetAttributes(instance, propertyId, attributes); } - return true; + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + if (instance->HasObjectArray() && attributes != PropertyDynamicTypeDefaults) + { + const PropertyRecord * propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + this->ConvertToTypeWithItemAttributes(instance)->SetItemAttributes(instance, propertyRecord->GetNumericValue(), attributes); + } + } + return true; + } + + return SetAttributesHelper(instance, propertyId, propertyIndex, GetAttributeArray(), PropertyAttributesToObjectSlotAttributes(attributes)); } BOOL PathTypeHandlerBase::GetAttributesWithPropertyIndex(DynamicObject * instance, PropertyId propertyId, BigPropertyIndex index, PropertyAttributes * attributes) @@ -1081,13 +1410,13 @@ namespace Js #ifdef PROFILE_OBJECT_LITERALS { RecyclerWeakReference* nextTypeWeakRef; - if (!pathHandler->GetSuccessor(scriptContext->GetPropertyName(propertyId), &nextTypeWeakRef) || nextTypeWeakRef->Get() == nullptr) + if (!pathHandler->GetSuccessor(PathTypeSuccessorKey(propertyId, ObjectSlotAttr_Default), &nextTypeWeakRef) || nextTypeWeakRef->Get() == nullptr) { scriptContext->objectLiteralPathCount++; } } #endif - type = pathHandler->PromoteType(type, scriptContext->GetPropertyName(propertyId), shareType, scriptContext, nullptr, &propertyIndex); + type = pathHandler->PromoteType(type, PathTypeSuccessorKey(propertyId, ObjectSlotAttr_Default), shareType, scriptContext, nullptr, &propertyIndex); } } else if (count <= static_cast(SimpleDictionaryTypeHandler::MaxPropertyIndexSize)) @@ -1140,7 +1469,7 @@ namespace Js } template - DynamicType* PathTypeHandlerBase::PromoteType(DynamicType* predecessorType, const PropertyRecord* propertyRecord, bool shareType, ScriptContext* scriptContext, DynamicObject* instance, PropertyIndex* propertyIndex) + DynamicType* PathTypeHandlerBase::PromoteType(DynamicType* predecessorType, const PathTypeSuccessorKey key, bool shareType, ScriptContext* scriptContext, DynamicObject* instance, PropertyIndex* propertyIndex) { Assert(propertyIndex != nullptr); Assert(isObjectLiteral || instance != nullptr); @@ -1149,25 +1478,35 @@ namespace Js PropertyIndex index; DynamicType * nextType; RecyclerWeakReference* nextTypeWeakRef = nullptr; + const PropertyRecord *propertyRecord = scriptContext->GetPropertyName(key.GetPropertyId()); PathTypeHandlerBase * nextPath; - if (!GetSuccessor(propertyRecord, &nextTypeWeakRef) || nextTypeWeakRef->Get() == nullptr) + if (!GetSuccessor(key, &nextTypeWeakRef) || nextTypeWeakRef->Get() == nullptr) { + TypePath * newTypePath = GetTypePath(); + uint8 oldPathSize = GetTypePath()->GetPathSize(); + ObjectSlotAttributes *oldAttributes = GetAttributeArray(); + ObjectSlotAttributes *newAttributes = oldAttributes; + PathTypeHandlerSetterSlotIndex *oldSetters = GetSetterSlots(); + PathTypeHandlerSetterSlotIndex *newSetters = oldSetters; + + bool branching = GetTypePath()->GetPathLength() > GetPathLength(); + bool growing = !branching && GetTypePath()->GetPathLength() == GetTypePath()->GetPathSize(); + +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS DynamicType* oldType = predecessorType; RecyclerWeakReference* oldSingletonInstance = GetSingletonInstance(); - bool branching = typePath->GetPathLength() > GetPathLength(); TraceFixedFieldsBeforeTypeHandlerChange(branching ? _u("branching") : _u("advancing"), _u("PathTypeHandler"), _u("PathTypeHandler"), instance, this, oldType, oldSingletonInstance); +#endif #endif - TypePath * newTypePath = typePath; - - if (typePath->GetPathLength() > GetPathLength()) + if (branching) { // We need to branch the type path. - newTypePath = typePath->Branch(recycler, GetPathLength(), GetIsOrMayBecomeShared() && !IsolatePrototypes()); + newTypePath = GetTypePath()->Branch(recycler, GetPathLength(), GetIsOrMayBecomeShared() && !IsolatePrototypes()); #ifdef PROFILE_TYPES scriptContext->branchCount++; @@ -1178,22 +1517,50 @@ namespace Js scriptContext->objectLiteralBranchCount++; } #endif - } - else if (typePath->GetPathLength() == typePath->GetPathSize()) - { - // We need to grow the type path. - - newTypePath = typePath->Grow(recycler); + + if (key.GetAttributes() != ObjectSlotAttr_Default || oldAttributes != nullptr) + { + newAttributes = this->UpdateAttributes(recycler, oldAttributes, oldPathSize, newTypePath->GetPathSize()); + } + + if ((key.GetAttributes() & ObjectSlotAttr_Accessor) || oldSetters != nullptr) + { + newSetters = this->UpdateSetterSlots(recycler, oldSetters, oldPathSize, newTypePath->GetPathSize()); + } + } + else if (growing) + { + // We need to grow the type path. + + newTypePath = GetTypePath()->Grow(recycler); + + if (key.GetAttributes() != ObjectSlotAttr_Default || oldAttributes != nullptr) + { + newAttributes = this->UpdateAttributes(recycler, oldAttributes, oldPathSize, newTypePath->GetPathSize()); + } + + if ((key.GetAttributes() & ObjectSlotAttr_Accessor) || oldSetters != nullptr) + { + newSetters = this->UpdateSetterSlots(recycler, oldSetters, oldPathSize, newTypePath->GetPathSize()); + } // Update all the predecessor types that use this TypePath to the new TypePath. // This will allow the old TypePath to be collected, and will ensure that the // fixed field info is correct for those types. PathTypeHandlerBase * typeHandlerToUpdate = this; - TypePath * oldTypePath = typePath; + TypePath * oldTypePath = GetTypePath(); while (true) { - typeHandlerToUpdate->typePath = newTypePath; + typeHandlerToUpdate->SetTypePath(newTypePath); + if (oldAttributes && typeHandlerToUpdate->GetAttributeArray() == oldAttributes) + { + typeHandlerToUpdate->SetAttributeArray(newAttributes); + } + if (oldSetters && typeHandlerToUpdate->GetSetterSlots() == oldSetters) + { + typeHandlerToUpdate->SetSetterSlots(newSetters); + } DynamicType * currPredecessorType = typeHandlerToUpdate->GetPredecessorType(); if (currPredecessorType == nullptr) @@ -1202,13 +1569,25 @@ namespace Js } Assert(currPredecessorType->GetTypeHandler()->IsPathTypeHandler()); - typeHandlerToUpdate = (PathTypeHandlerBase *)currPredecessorType->GetTypeHandler(); - if (typeHandlerToUpdate->typePath != oldTypePath) + typeHandlerToUpdate = PathTypeHandlerBase::FromTypeHandler(currPredecessorType->GetTypeHandler()); + if (typeHandlerToUpdate->GetTypePath() != oldTypePath) { break; } } } + else + { + if (key.GetAttributes() != ObjectSlotAttr_Default && oldAttributes == nullptr) + { + newAttributes = this->UpdateAttributes(recycler, nullptr, oldPathSize, newTypePath->GetPathSize()); + } + + if ((key.GetAttributes() & ObjectSlotAttr_Accessor) && oldSetters == nullptr) + { + newSetters = this->UpdateSetterSlots(recycler, nullptr, oldPathSize, newTypePath->GetPathSize()); + } + } index = (PropertyIndex)newTypePath->AddInternal(propertyRecord); @@ -1221,17 +1600,32 @@ namespace Js newInlineSlotCapacity -= GetObjectHeaderInlinableSlotCapacity(); newOffsetOfInlineSlots = sizeof(DynamicObject); } +#if ENABLE_FIXED_FIELDS bool markTypeAsShared = !FixPropsOnPathTypes() || shareType; - nextPath = SimplePathTypeHandler::New(scriptContext, newTypePath, newPropertyCount, newSlotCapacity, newInlineSlotCapacity, newOffsetOfInlineSlots, true, markTypeAsShared, predecessorType); +#else + bool markTypeAsShared = true; +#endif + + if (key.GetAttributes() == ObjectSlotAttr_Default && oldAttributes == nullptr) + { + nextPath = SimplePathTypeHandlerNoAttr::New(scriptContext, newTypePath, newPropertyCount, newSlotCapacity, newInlineSlotCapacity, newOffsetOfInlineSlots, true, markTypeAsShared, predecessorType); + } + else + { + newAttributes[index] = key.GetAttributes(); + nextPath = SimplePathTypeHandlerWithAttr::New(scriptContext, newTypePath, newAttributes, newSetters, newPropertyCount, newSlotCapacity, newInlineSlotCapacity, newOffsetOfInlineSlots, true, markTypeAsShared, predecessorType); + } if (!markTypeAsShared) nextPath->SetMayBecomeShared(); Assert(nextPath->GetHasOnlyWritableDataProperties()); nextPath->CopyPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection, GetPropertyTypes()); nextPath->SetPropertyTypes(PropertyTypesInlineSlotCapacityLocked, GetPropertyTypes()); +#if ENABLE_FIXED_FIELDS if (shareType) { nextPath->AddBlankFieldAt(propertyRecord->GetPropertyId(), index, scriptContext); } +#endif #ifdef PROFILE_TYPES scriptContext->maxPathLength = max(GetPathLength() + 1, scriptContext->maxPathLength); @@ -1253,12 +1647,16 @@ namespace Js markTypeAsShared ? nextType->SetIsLockedAndShared() : nextType->SetIsLocked(); } - SetSuccessor(predecessorType, propertyRecord, recycler->CreateWeakReferenceHandle(nextType), scriptContext); + SetSuccessor(predecessorType, key, recycler->CreateWeakReferenceHandle(nextType), scriptContext); // We just extended the current type path to a new tip or created a brand new type path. We should // be at the tip of the path and there should be no instances there yet. Assert(nextPath->GetPathLength() == newTypePath->GetPathLength()); +#if ENABLE_FIXED_FIELDS Assert(!FixPropsOnPathTypes() || shareType || nextPath->GetPathLength() > newTypePath->GetMaxInitializedLength()); - +#ifdef ENABLE_DEBUG_CONFIG_OPTIONS + TraceFixedFieldsAfterTypeHandlerChange(instance, this, nextPath, oldType, nextType, oldSingletonInstance); +#endif +#endif #ifdef PROFILE_TYPES scriptContext->promoteCount++; #endif @@ -1268,10 +1666,6 @@ namespace Js scriptContext->objectLiteralPromoteCount++; } #endif - -#ifdef ENABLE_DEBUG_CONFIG_OPTIONS - TraceFixedFieldsAfterTypeHandlerChange(instance, this, nextPath, oldType, nextType, oldSingletonInstance); -#endif } else { @@ -1286,29 +1680,84 @@ namespace Js index = nextPath->GetPropertyIndex(propertyRecord); +#if ENABLE_FIXED_FIELDS Assert((FixPropsOnPathTypes() && nextPath->GetMayBecomeShared()) || (nextPath->GetIsShared() && nextType->GetIsShared())); if (FixPropsOnPathTypes() && !nextType->GetIsShared()) { if (!nextPath->GetIsShared()) { nextPath->AddBlankFieldAt(propertyRecord->GetPropertyId(), index, scriptContext); - nextPath->DoShareTypeHandlerInternal(scriptContext); + nextPath->DoShareTypeHandlerInternal(scriptContext); } nextType->ShareType(); } +#endif } Assert(!IsolatePrototypes() || !GetIsOrMayBecomeShared() || !GetIsPrototype()); nextPath->SetFlags(IsPrototypeFlag, this->GetFlags()); - Assert(this->GetHasOnlyWritableDataProperties() == nextPath->GetHasOnlyWritableDataProperties()); + Assert(this->GetHasOnlyWritableDataProperties() == nextPath->GetHasOnlyWritableDataProperties() || !(key.GetAttributes() & ObjectSlotAttr_Writable)); Assert(this->GetIsInlineSlotCapacityLocked() == nextPath->GetIsInlineSlotCapacityLocked()); nextPath->SetPropertyTypes(PropertyTypesWritableDataOnlyDetection, this->GetPropertyTypes()); + if (!(key.GetAttributes() & ObjectSlotAttr_Writable)) + { + nextPath->ClearHasOnlyWritableDataProperties(); + if (nextPath->GetFlags() & IsPrototypeFlag) + { + scriptContext->InvalidateStoreFieldCaches(key.GetPropertyId()); + instance->GetLibrary()->NoPrototypeChainsAreEnsuredToHaveOnlyWritableDataProperties(); + } + } (*propertyIndex) = index; return nextType; } + ObjectSlotAttributes * PathTypeHandlerBase::UpdateAttributes(Recycler * recycler, ObjectSlotAttributes * oldAttributes, uint8 oldPathSize, uint8 newTypePathSize) + { + ObjectSlotAttributes * newAttributes = RecyclerNewArrayLeaf(recycler, ObjectSlotAttributes, newTypePathSize); + uint8 initStart; + if (oldAttributes == nullptr) + { + initStart = 0; + } + else + { + // In branching cases, the new type path may be shorter than the old. + initStart = min(newTypePathSize, oldPathSize); + memcpy(newAttributes, oldAttributes, sizeof(ObjectSlotAttributes) * initStart); + } + for (uint8 i = initStart; i < newTypePathSize; i++) + { + newAttributes[i] = ObjectSlotAttr_Default; + } + + return newAttributes; + } + + PathTypeHandlerSetterSlotIndex * PathTypeHandlerBase::UpdateSetterSlots(Recycler * recycler, PathTypeHandlerSetterSlotIndex * oldSetters, uint8 oldPathSize, uint8 newTypePathSize) + { + PathTypeHandlerSetterSlotIndex * newSetters = RecyclerNewArrayLeaf(recycler, PathTypeHandlerSetterSlotIndex, newTypePathSize); + uint8 initStart; + if (oldSetters == nullptr) + { + initStart = 0; + } + else + { + // In branching cases, the new type path may be shorter than the old. + initStart = min(newTypePathSize, oldPathSize); + memcpy(newSetters, oldSetters, sizeof(PathTypeHandlerSetterSlotIndex) * initStart); + } + for (uint8 i = initStart; i < newTypePathSize; i++) + { + newSetters[i] = NoSetterSlot; + } + + return newSetters; + } + void PathTypeHandlerBase::ResetTypeHandler(DynamicObject * instance) { @@ -1325,15 +1774,17 @@ namespace Js // object has changed and/or property guards have already been invalidated through some other means. int propertyCount = GetPathLength(); +#if ENABLE_FIXED_FIELDS if (invalidateFixedFields) { Js::ScriptContext* scriptContext = instance->GetScriptContext(); for (PropertyIndex propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++) { - PropertyId propertyId = this->typePath->GetPropertyIdUnchecked(propertyIndex)->GetPropertyId(); + PropertyId propertyId = this->GetTypePath()->GetPropertyIdUnchecked(propertyIndex)->GetPropertyId(); InvalidateFixedFieldAt(propertyId, propertyIndex, scriptContext); } } +#endif Js::RecyclableObject* undefined = instance->GetLibrary()->GetUndefined(); for (PropertyIndex propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++) @@ -1351,15 +1802,17 @@ namespace Js // object has changed and/or property guards have already been invalidated through some other means. int propertyCount = GetPathLength(); +#if ENABLE_FIXED_FIELDS if (invalidateFixedFields) { ScriptContext* scriptContext = instance->GetScriptContext(); for (PropertyIndex propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++) { - PropertyId propertyId = this->typePath->GetPropertyIdUnchecked(propertyIndex)->GetPropertyId(); + PropertyId propertyId = this->GetTypePath()->GetPropertyIdUnchecked(propertyIndex)->GetPropertyId(); InvalidateFixedFieldAt(propertyId, propertyIndex, scriptContext); } } +#endif for (int slotIndex = 0; slotIndex < propertyCount; slotIndex++) { @@ -1369,16 +1822,17 @@ namespace Js BOOL PathTypeHandlerBase::AddProperty(DynamicObject * instance, PropertyId propertyId, Js::Var value, PropertyAttributes attributes, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects) { - if (attributes != PropertyDynamicTypeDefaults) + if (!ObjectSlotAttributesContains(attributes)) { + // Setting an attribute that PathTypeHandler can't express Assert(propertyId != Constants::NoProperty); PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); return ConvertToSimpleDictionaryType(instance, GetPathLength() + 1)->AddProperty(instance, propertyRecord, value, attributes, info, flags, possibleSideEffects); } - return AddPropertyInternal(instance, propertyId, value, info, flags, possibleSideEffects); + return AddPropertyInternal(instance, propertyId, value, PropertyAttributesToObjectSlotAttributes(attributes), info, flags, possibleSideEffects); } - BOOL PathTypeHandlerBase::AddPropertyInternal(DynamicObject * instance, PropertyId propertyId, Js::Var value, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects) + BOOL PathTypeHandlerBase::AddPropertyInternal(DynamicObject * instance, PropertyId propertyId, Js::Var value, ObjectSlotAttributes attr, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects) { ScriptContext* scriptContext = instance->GetScriptContext(); @@ -1400,7 +1854,7 @@ namespace Js } PropertyIndex index; - DynamicType* newType = PromoteType(instance, propertyRecord, &index); + DynamicType* newType = PromoteType(instance, PathTypeSuccessorKey(propertyId, attr), &index); Assert(instance->GetTypeHandler()->IsPathTypeHandler()); PathTypeHandlerBase* newTypeHandler = (PathTypeHandlerBase*)newType->GetTypeHandler(); @@ -1411,34 +1865,13 @@ namespace Js Assert(newType->GetIsShared() == newTypeHandler->GetIsShared()); - // Don't populate inline cache if this handler isn't yet shared. If we did, a new instance could - // reach this handler without us noticing and we could fail to release the old singleton instance, which may later - // become collectible (not referenced by anything other than this handler), thus we would leak the old singleton instance. - bool populateInlineCache = newTypeHandler->GetIsShared() || - ProcessFixedFieldChange(instance, propertyId, index, value, (flags & PropertyOperation_NonFixedValue) != 0, propertyRecord); - - SetSlotUnchecked(instance, index, value); - - if (populateInlineCache) - { - Assert((instance->GetDynamicType()->GetIsShared()) || (FixPropsOnPathTypes() && instance->GetDynamicType()->GetTypeHandler()->GetIsOrMayBecomeShared())); - // Can't assert this. With NewScObject we can jump to the type handler at the tip (where the singleton is), - // even though we haven't yet initialized the properties all the way to the tip, and we don't want to kill - // the singleton in that case yet. It's basically a transient inconsistent state, but we have to live with it. - // Assert(!instance->GetTypeHandler()->HasSingletonInstance()); - PropertyValueInfo::Set(info, instance, index); - } - else - { - PropertyValueInfo::SetNoCache(info, instance); - } + newTypeHandler->SetSlotAndCache(instance, propertyId, propertyRecord, index, value, info, flags, possibleSideEffects); Assert(!IsolatePrototypes() || ((this->GetFlags() & IsPrototypeFlag) == 0)); if (this->GetFlags() & IsPrototypeFlag) { scriptContext->InvalidateProtoCaches(propertyId); } - SetPropertyUpdateSideEffect(instance, propertyId, value, possibleSideEffects); return true; } @@ -1499,27 +1932,49 @@ namespace Js Assert(IsObjectHeaderInlinedTypeHandler()); // Clone the type Path here to evolve separately - uint16 pathLength = typePath->GetPathLength(); + uint16 pathLength = GetTypePath()->GetPathLength(); TypePath * clonedPath = TypePath::New(library->GetRecycler(), pathLength); for (PropertyIndex i = 0; i < pathLength; i++) { - clonedPath->assignments[i] = typePath->assignments[i]; + clonedPath->assignments[i] = GetTypePath()->assignments[i]; clonedPath->AddInternal(clonedPath->assignments[i]); } // We don't copy the fixed fields, as we will be sharing this type anyways later and the fixed fields vector has to be invalidated. - SimplePathTypeHandler *const clonedTypeHandler = - SimplePathTypeHandler::New( - library->GetScriptContext(), - clonedPath, - GetPathLength(), - static_cast(GetSlotCapacity()), - GetInlineSlotCapacity() - GetObjectHeaderInlinableSlotCapacity(), - sizeof(DynamicObject), - false, - false); + SimplePathTypeHandler * clonedTypeHandler; + ObjectSlotAttributes *attributes = this->GetAttributeArray(); + if (attributes == nullptr) + { + clonedTypeHandler = + SimplePathTypeHandlerNoAttr::New( + library->GetScriptContext(), + clonedPath, + GetPathLength(), + static_cast(GetSlotCapacity()), + GetInlineSlotCapacity() - GetObjectHeaderInlinableSlotCapacity(), + sizeof(DynamicObject), + false, + false); + } + else + { + clonedTypeHandler = + SimplePathTypeHandlerWithAttr::New( + library->GetScriptContext(), + clonedPath, + attributes, + GetSetterSlots(), + GetPathLength(), + static_cast(GetSlotCapacity()), + GetInlineSlotCapacity() - GetObjectHeaderInlinableSlotCapacity(), + sizeof(DynamicObject), + false, + false); + } clonedTypeHandler->SetMayBecomeShared(); + clonedTypeHandler->CopyPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection, this->GetPropertyTypes()); + return clonedTypeHandler; } @@ -1595,7 +2050,8 @@ namespace Js if (cachedDynamicType == nullptr) { - SimplePathTypeHandler* newTypeHandler = SimplePathTypeHandler::New(scriptContext, scriptContext->GetLibrary()->GetRootPath(), 0, static_cast(this->GetSlotCapacity()), this->GetInlineSlotCapacity(), this->GetOffsetOfInlineSlots(), true, true); + SimplePathTypeHandlerNoAttr* newTypeHandler = SimplePathTypeHandlerNoAttr::New(scriptContext, scriptContext->GetLibrary()->GetRootPath(), 0, static_cast(this->GetSlotCapacity()), this->GetInlineSlotCapacity(), this->GetOffsetOfInlineSlots(), GetIsLocked(), GetIsShared()); + newTypeHandler->SetFlags(MayBecomeSharedFlag, GetFlags()); cachedDynamicType = instance->DuplicateType(); cachedDynamicType->SetPrototype(newPrototype); @@ -1609,13 +2065,14 @@ namespace Js } // Promote type based on existing properties to get new type which will be cached and shared + ObjectSlotAttributes * attr = this->GetAttributeArray(); for (PropertyIndex i = 0; i < GetPropertyCount(); i++) { PathTypeHandlerBase * pathTypeHandler = (PathTypeHandlerBase*)cachedDynamicType->GetTypeHandler(); Js::PropertyId propertyId = GetPropertyId(scriptContext, i); PropertyIndex propertyIndex = GetPropertyIndex(propertyId); - cachedDynamicType = pathTypeHandler->PromoteType(cachedDynamicType, scriptContext->GetPropertyName(propertyId), true, scriptContext, instance, &propertyIndex); + cachedDynamicType = pathTypeHandler->PromoteType(cachedDynamicType, PathTypeSuccessorKey(propertyId, attr ? attr[propertyIndex] : ObjectSlotAttr_Default), true, scriptContext, instance, &propertyIndex); } if (useCache) @@ -1699,9 +2156,11 @@ namespace Js return; } +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS DynamicType* oldTypeDebug = instance->GetDynamicType(); RecyclerWeakReference* oldSingletonInstance = GetSingletonInstance(); +#endif #endif if ((GetIsOrMayBecomeShared() && IsolatePrototypes())) @@ -1719,9 +2178,10 @@ namespace Js } else { - +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS TraceFixedFieldsBeforeSetIsProto(instance, this, oldTypeDebug, oldSingletonInstance); +#endif #endif if (ChangeTypeOnProto()) @@ -1752,11 +2212,67 @@ namespace Js { SetFlags(IsPrototypeFlag); +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS TraceFixedFieldsAfterSetIsProto(instance, this, typeHandler, oldTypeDebug, instance->GetDynamicType(), oldSingletonInstance); #endif +#endif + + } + } + + PathTypeHandlerBase* PathTypeHandlerBase::GetRootPathTypeHandler() + { + PathTypeHandlerBase* rootTypeHandler = this; + while (rootTypeHandler->predecessorType != nullptr) + { + rootTypeHandler = PathTypeHandlerBase::FromTypeHandler(rootTypeHandler->predecessorType->GetTypeHandler()); + } + Assert(rootTypeHandler->predecessorType == nullptr); + return rootTypeHandler; + } + +#if DBG + bool PathTypeHandlerBase::CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) + { + Assert(!allowLetConst); + // We pass Constants::NoProperty for ActivationObjects for functions with same named formals, but we don't + // use PathTypeHandlers for those. + Assert(propertyId != Constants::NoProperty); + Js::PropertyIndex index = GetPropertyIndex(propertyId); + if (index != Constants::NoSlot) + { +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + if (FixPropsOnPathTypes()) + { + return index < this->GetTypePath()->GetMaxInitializedLength() && !this->GetTypePath()->GetIsFixedFieldAt(index, this->GetPathLength()); + } + else +#endif + { + return true; + } + } + else + { + AssertMsg(false, "Asking about a property this type handler doesn't know about?"); + return false; + } + } +#endif +#if ENABLE_FIXED_FIELDS + BOOL PathTypeHandlerBase::IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) + { + if (!FixPropsOnPathTypes()) + { + return false; } + + PropertyIndex index = PathTypeHandlerBase::GetPropertyIndex(propertyId); + Assert(index != Constants::NoSlot); + + return this->GetTypePath()->GetIsFixedFieldAt(index, GetPathLength()); } bool PathTypeHandlerBase::HasSingletonInstance() const @@ -1767,7 +2283,7 @@ namespace Js return false; } - return this->typePath->HasSingletonInstance() && GetPathLength() >= this->typePath->GetMaxInitializedLength(); + return this->GetTypePath()->HasSingletonInstance() && GetPathLength() >= this->GetTypePath()->GetMaxInitializedLength(); } void PathTypeHandlerBase::DoShareTypeHandler(ScriptContext* scriptContext) @@ -1788,13 +2304,13 @@ namespace Js { if (invalidateFixedFields) { - if (this->typePath->GetMaxInitializedLength() < GetPathLength()) + if (this->GetTypePath()->GetMaxInitializedLength() < GetPathLength()) { - this->typePath->SetMaxInitializedLength(GetPathLength()); + this->GetTypePath()->SetMaxInitializedLength(GetPathLength()); } for (PropertyIndex index = 0; index < this->GetPathLength(); index++) { - InvalidateFixedFieldAt(this->typePath->GetPropertyIdUnchecked(index)->GetPropertyId(), index, scriptContext); + InvalidateFixedFieldAt(this->GetTypePath()->GetPropertyIdUnchecked(index)->GetPropertyId(), index, scriptContext); } } @@ -1802,7 +2318,7 @@ namespace Js Assert(HasSingletonInstanceOnlyIfNeeded()); if (HasSingletonInstance()) { - this->typePath->ClearSingletonInstance(); + this->GetTypePath()->ClearSingletonInstance(); } } #endif @@ -1817,10 +2333,10 @@ namespace Js // We are adding a new value where some other instance already has an existing value. If this is a fixed // field we must clear the bit. If the value was hard coded in the JIT-ed code, we must invalidate the guards. - if (this->typePath->GetIsUsedFixedFieldAt(index, GetPathLength())) + if (this->GetTypePath()->GetIsUsedFixedFieldAt(index, GetPathLength())) { // We may be a second instance chasing the singleton and invalidating fixed fields along the way. - // Assert(newTypeHandler->typePath->GetSingletonInstance() == instance); + // Assert(newTypeHandler->GetTypePath()->GetSingletonInstance() == instance); // Invalidate any JIT-ed code that hard coded this method. No need to invalidate store field // inline caches (which might quietly overwrite this fixed fields, because they have never been populated. @@ -1831,7 +2347,7 @@ namespace Js // If we're overwriting an existing value of this property, we don't consider the new one fixed. // This also means that it's ok to populate the inline caches for this property from now on. - this->typePath->ClearIsFixedFieldAt(index, GetPathLength()); + this->GetTypePath()->ClearIsFixedFieldAt(index, GetPathLength()); } void PathTypeHandlerBase::AddBlankFieldAt(Js::PropertyId propertyId, Js::PropertyIndex index, ScriptContext* scriptContext) @@ -1841,14 +2357,14 @@ namespace Js return; } - if (index >= this->typePath->GetMaxInitializedLength()) + if (index >= this->GetTypePath()->GetMaxInitializedLength()) { // We are adding a property where no instance property has been set before. We rely on properties being // added in order of indexes to be sure that we don't leave any uninitialized properties interspersed with // initialized ones, which could lead to incorrect behavior. See comment in TypePath::Branch. - AssertMsg(index == this->typePath->GetMaxInitializedLength(), "Adding properties out of order?"); + AssertMsg(index == this->GetTypePath()->GetMaxInitializedLength(), "Adding properties out of order?"); - this->typePath->AddBlankFieldAt(index, GetPathLength()); + this->GetTypePath()->AddBlankFieldAt(index, GetPathLength()); } else { @@ -1857,7 +2373,7 @@ namespace Js // We have now reached the most advanced instance along this path. If this instance is not the singleton instance, // then the former singleton instance (if any) is no longer a singleton. This instance could be the singleton // instance, if we just happen to set (overwrite) its last property. - if (index + 1 == this->typePath->GetMaxInitializedLength()) + if (index + 1 == this->GetTypePath()->GetMaxInitializedLength()) { // If we cleared the singleton instance while some fields remained fixed, the instance would // be collectible, and yet some code would expect to see values and call methods on it. We rely on the @@ -1866,7 +2382,7 @@ namespace Js // Otherwise, some fields could remain fixed (or even uninitialized) and we would have to spin off a loop here // to invalidate any remaining fixed fields Assert(HasSingletonInstanceOnlyIfNeeded()); - this->typePath->ClearSingletonInstance(); + this->GetTypePath()->ClearSingletonInstance(); } } @@ -1888,12 +2404,12 @@ namespace Js PathTypeHandlerBase* newTypeHandler = (PathTypeHandlerBase*)instance->GetTypeHandler(); - if (slotIndex >= newTypeHandler->typePath->GetMaxInitializedLength()) + if (slotIndex >= newTypeHandler->GetTypePath()->GetMaxInitializedLength()) { // We are adding a property where no instance property has been set before. We rely on properties being // added in order of indexes to be sure that we don't leave any uninitialized properties interspersed with // initialized ones, which could lead to incorrect behavior. See comment in TypePath::Branch. - AssertMsg(slotIndex == newTypeHandler->typePath->GetMaxInitializedLength(), "Adding properties out of order?"); + AssertMsg(slotIndex == newTypeHandler->GetTypePath()->GetMaxInitializedLength(), "Adding properties out of order?"); // Consider: It would be nice to assert the slot is actually null. However, we sometimes pre-initialize to // undefined or even some other special illegal value (for let or const, currently == null) @@ -1907,11 +2423,11 @@ namespace Js // Mark the newly added field as fixed and prevent population of inline caches. - newTypeHandler->typePath->AddSingletonInstanceFieldAt(instance, slotIndex, markAsFixed, newTypeHandler->GetPathLength()); + newTypeHandler->GetTypePath()->AddSingletonInstanceFieldAt(instance, slotIndex, markAsFixed, newTypeHandler->GetPathLength()); } else { - newTypeHandler->typePath->AddSingletonInstanceFieldAt(slotIndex, newTypeHandler->GetPathLength()); + newTypeHandler->GetTypePath()->AddSingletonInstanceFieldAt(slotIndex, newTypeHandler->GetPathLength()); } populateInlineCache = false; @@ -1923,7 +2439,7 @@ namespace Js // We have now reached the most advanced instance along this path. If this instance is not the singleton instance, // then the former singleton instance (if any) is no longer a singleton. This instance could be the singleton // instance, if we just happen to set (overwrite) its last property. - if (slotIndex + 1 == newTypeHandler->typePath->GetMaxInitializedLength()) + if (slotIndex + 1 == newTypeHandler->GetTypePath()->GetMaxInitializedLength()) { // If we cleared the singleton instance while some fields remained fixed, the instance would // be collectible, and yet some code would expect to see values and call methods on it. We rely on the @@ -1931,24 +2447,24 @@ namespace Js // on the type path. By the time we reach the singleton instance, all fixed fields will have been invalidated. // Otherwise, some fields could remain fixed (or even uninitialized) and we would have to spin off a loop here // to invalidate any remaining fixed fields - auto singletonWeakRef = newTypeHandler->typePath->GetSingletonInstance(); + auto singletonWeakRef = newTypeHandler->GetTypePath()->GetSingletonInstance(); if (singletonWeakRef != nullptr && instance != singletonWeakRef->Get()) { Assert(newTypeHandler->HasSingletonInstanceOnlyIfNeeded()); - newTypeHandler->typePath->ClearSingletonInstance(); + newTypeHandler->GetTypePath()->ClearSingletonInstance(); } } } // If we branched and this is the singleton instance, we need to remove it from this type handler. The only time // this can happen is when another not fully initialized instance is ahead of this one on the current path. - auto singletonWeakRef = this->typePath->GetSingletonInstance(); - if (newTypeHandler->typePath != this->typePath && singletonWeakRef != nullptr && singletonWeakRef->Get() == instance) + auto singletonWeakRef = this->GetTypePath()->GetSingletonInstance(); + if (newTypeHandler->GetTypePath() != this->GetTypePath() && singletonWeakRef != nullptr && singletonWeakRef->Get() == instance) { // If this is the singleton instance, there shouldn't be any other initialized instance ahead of it on the old path. - Assert(GetPathLength() >= this->typePath->GetMaxInitializedLength()); + Assert(GetPathLength() >= this->GetTypePath()->GetMaxInitializedLength()); Assert(HasSingletonInstanceOnlyIfNeeded()); - this->typePath->ClearSingletonInstance(); + this->GetTypePath()->ClearSingletonInstance(); } return populateInlineCache; @@ -1977,43 +2493,18 @@ namespace Js } #if DBG - bool PathTypeHandlerBase::CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) - { - Assert(!allowLetConst); - // We pass Constants::NoProperty for ActivationObjects for functions with same named formals, but we don't - // use PathTypeHandlers for those. - Assert(propertyId != Constants::NoProperty); - Js::PropertyIndex index = GetPropertyIndex(propertyId); - if (index != Constants::NoSlot) - { - if (FixPropsOnPathTypes()) - { - return index < this->typePath->GetMaxInitializedLength() && !this->typePath->GetIsFixedFieldAt(index, this->GetPathLength()); - } - else - { - return true; - } - } - else - { - AssertMsg(false, "Asking about a property this type handler doesn't know about?"); - return false; - } - } - bool PathTypeHandlerBase::HasOnlyInitializedNonFixedProperties() { #ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES - if (this->typePath->GetMaxInitializedLength() < GetPathLength()) + if (this->GetTypePath()->GetMaxInitializedLength() < GetPathLength()) { return false; } for (PropertyIndex index = 0; index < this->GetPathLength(); index++) { - if (this->typePath->GetIsFixedFieldAt(index, this->GetPathLength())) + if (this->GetTypePath()->GetIsFixedFieldAt(index, this->GetPathLength())) { return false; } @@ -2033,7 +2524,7 @@ namespace Js int pathLength = GetPathLength(); for (PropertyIndex i = 0; i < pathLength; i++) { - if (this->typePath->GetIsFixedFieldAt(i, pathLength)) + if (this->GetTypePath()->GetIsFixedFieldAt(i, pathLength)) { return true; } @@ -2050,20 +2541,20 @@ namespace Js return false; } - PropertyIndex index = this->typePath->Lookup(propertyRecord->GetPropertyId(), GetPathLength()); + PropertyIndex index = this->GetTypePath()->Lookup(propertyRecord->GetPropertyId(), GetPathLength()); if (index == Constants::NoSlot) { AssertMsg(allowNonExistent, "Trying to get a fixed function instance for a non-existent property?"); return false; } - Var value = this->typePath->GetSingletonFixedFieldAt(index, GetPathLength(), requestContext); + Var value = this->GetTypePath()->GetSingletonFixedFieldAt(index, GetPathLength(), requestContext); if (value && ((IsFixedMethodProperty(propertyType) && JavascriptFunction::Is(value)) || IsFixedDataProperty(propertyType))) { *pProperty = value; if (markAsUsed) { - this->typePath->SetIsUsedFixedFieldAt(index, GetPathLength()); + this->GetTypePath()->SetIsUsedFixedFieldAt(index, GetPathLength()); } return true; } @@ -2073,34 +2564,23 @@ namespace Js } } - PathTypeHandlerBase* PathTypeHandlerBase::GetRootPathTypeHandler() - { - PathTypeHandlerBase* rootTypeHandler = this; - while (rootTypeHandler->predecessorType != nullptr) - { - rootTypeHandler = PathTypeHandlerBase::FromTypeHandler(rootTypeHandler->predecessorType->GetTypeHandler()); - } - Assert(rootTypeHandler->predecessorType == nullptr); - return rootTypeHandler; - } - #ifdef ENABLE_DEBUG_CONFIG_OPTIONS void PathTypeHandlerBase::DumpFixedFields() const { if (FixPropsOnPathTypes()) { for (PropertyIndex i = 0; i < GetPathLength(); i++) { - Output::Print(_u(" %s %d%d%d,"), typePath->GetPropertyId(i)->GetBuffer(), - i < this->typePath->GetMaxInitializedLength() ? 1 : 0, - this->typePath->GetIsFixedFieldAt(i, GetPathLength()) ? 1 : 0, - this->typePath->GetIsUsedFixedFieldAt(i, GetPathLength()) ? 1 : 0); + Output::Print(_u(" %s %d%d%d,"), GetTypePath()->GetPropertyId(i)->GetBuffer(), + i < this->GetTypePath()->GetMaxInitializedLength() ? 1 : 0, + this->GetTypePath()->GetIsFixedFieldAt(i, GetPathLength()) ? 1 : 0, + this->GetTypePath()->GetIsUsedFixedFieldAt(i, GetPathLength()) ? 1 : 0); } } else { for (PropertyIndex i = 0; i < GetPathLength(); i++) { - Output::Print(_u(" %s %d%d%d,"), typePath->GetPropertyId(i)->GetBuffer(), 1, 0, 0); + Output::Print(_u(" %s %d%d%d,"), GetTypePath()->GetPropertyId(i)->GetBuffer(), 1, 0, 0); } } } @@ -2212,6 +2692,7 @@ namespace Js } } #endif +#endif // ENABLE_FIXED_FIELDS #if ENABLE_TTD void PathTypeHandlerBase::MarkObjectSlots_TTD(TTD::SnapshotExtractor* extractor, DynamicObject* obj) const @@ -2220,7 +2701,7 @@ namespace Js for(uint32 index = 0; index < plength; ++index) { - Js::PropertyId pid = typePath->GetPropertyIdUnchecked(index)->GetPropertyId(); + Js::PropertyId pid = GetTypePath()->GetPropertyIdUnchecked(index)->GetPropertyId(); if(DynamicTypeHandler::ShouldMarkPropertyId_TTD(pid)) { @@ -2233,10 +2714,12 @@ namespace Js uint32 PathTypeHandlerBase::ExtractSlotInfo_TTD(TTD::NSSnapType::SnapHandlerPropertyEntry* entryInfo, ThreadContext* threadContext, TTD::SlabAllocator& alloc) const { uint32 plength = this->GetPathLength(); - + ObjectSlotAttributes * attributes = this->GetAttributeArray(); + for(uint32 index = 0; index < plength; ++index) { - TTD::NSSnapType::ExtractSnapPropertyEntryInfo(entryInfo + index, typePath->GetPropertyIdUnchecked(index)->GetPropertyId(), PropertyDynamicTypeDefaults, TTD::NSSnapType::SnapEntryDataKindTag::Data); + PropertyAttributes attr = ObjectSlotAttributesToPropertyAttributes(attributes ? attributes[index] : ObjectSlotAttr_Default); + TTD::NSSnapType::ExtractSnapPropertyEntryInfo(entryInfo + index, GetTypePath()->GetPropertyIdUnchecked(index)->GetPropertyId(), attr, TTD::NSSnapType::SnapEntryDataKindTag::Data); } return plength; @@ -2245,7 +2728,7 @@ namespace Js Js::BigPropertyIndex PathTypeHandlerBase::GetPropertyIndex_EnumerateTTD(const Js::PropertyRecord* pRecord) { //The regular LookupInline is fine for path types - return (Js::BigPropertyIndex)this->typePath->LookupInline(pRecord->GetPropertyId(), GetPathLength()); + return (Js::BigPropertyIndex)this->GetTypePath()->LookupInline(pRecord->GetPropertyId(), GetPathLength()); } bool PathTypeHandlerBase::IsResetableForTTD(uint32 snapMaxIndex) const @@ -2254,29 +2737,9 @@ namespace Js } #endif - SimplePathTypeHandler * SimplePathTypeHandler::New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) - { - return New(scriptContext, typePath, pathLength, max(pathLength, inlineSlotCapacity), inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); - } - - SimplePathTypeHandler * SimplePathTypeHandler::New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) - { - Assert(typePath != nullptr); -#ifdef PROFILE_TYPES - scriptContext->simplePathTypeHandlerCount++; -#endif - return RecyclerNew(scriptContext->GetRecycler(), SimplePathTypeHandler, typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); - } - - SimplePathTypeHandler * SimplePathTypeHandler::New(ScriptContext * scriptContext, SimplePathTypeHandler * typeHandler, bool isLocked, bool isShared) - { - Assert(typeHandler != nullptr); - return RecyclerNew(scriptContext->GetRecycler(), SimplePathTypeHandler, typeHandler->GetTypePath(), typeHandler->GetPathLength(), typeHandler->GetInlineSlotCapacity(), typeHandler->GetOffsetOfInlineSlots(), isLocked, isShared); - } - - SimplePathTypeHandler::SimplePathTypeHandler(TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) : + SimplePathTypeHandler::SimplePathTypeHandler(TypePath *typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) : PathTypeHandlerBase(typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType), - successorPropertyRecord(nullptr), + successorKey(Constants::NoProperty, ObjectSlotAttr_None), successorTypeWeakRef(nullptr) { } @@ -2287,7 +2750,7 @@ namespace Js this->SetInlineSlotCapacity(newInlineSlotCapacity); this->SetSlotCapacity(newInlineSlotCapacity); this->SetIsInlineSlotCapacityLocked(); - if (this->successorPropertyRecord) + if (this->successorTypeWeakRef) { DynamicType * type = successorTypeWeakRef->Get(); if (type) @@ -2302,7 +2765,7 @@ namespace Js Assert(!GetIsInlineSlotCapacityLocked()); SetIsInlineSlotCapacityLocked(); - if (!successorPropertyRecord) + if (!successorTypeWeakRef) { return; } @@ -2328,7 +2791,7 @@ namespace Js { SetIsInlineSlotCapacityLocked(); - if (successorPropertyRecord) + if (successorTypeWeakRef) { DynamicType * type = successorTypeWeakRef->Get(); if (type) @@ -2354,7 +2817,7 @@ namespace Js Assert(GetIsInlineSlotCapacityLocked()); - if (!successorPropertyRecord) + if (!successorTypeWeakRef) { return; } @@ -2376,7 +2839,7 @@ namespace Js *maxPathLength = GetPathLength(); } - if (!successorPropertyRecord) + if (!successorTypeWeakRef) { return true; } @@ -2396,9 +2859,9 @@ namespace Js return true; } - bool SimplePathTypeHandler::GetSuccessor(const PropertyRecord* propertyRecord, RecyclerWeakReference ** typeWeakRef) + bool SimplePathTypeHandler::GetSuccessor(const PathTypeSuccessorKey successorKey, RecyclerWeakReference ** typeWeakRef) { - if (successorPropertyRecord != propertyRecord) + if (successorKey != this->successorKey) { *typeWeakRef = nullptr; return false; @@ -2407,11 +2870,11 @@ namespace Js return true; } - void SimplePathTypeHandler::SetSuccessor(DynamicType * type, const PropertyRecord* propertyRecord, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) + void SimplePathTypeHandler::SetSuccessorHelper(DynamicType * type, const PathTypeSuccessorKey key, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) { - if (!successorPropertyRecord || successorPropertyRecord == propertyRecord || !successorTypeWeakRef->Get()) + if (!successorTypeWeakRef || !successorTypeWeakRef->Get()) { - successorPropertyRecord = propertyRecord; + successorKey = key; successorTypeWeakRef = typeWeakRef; return; } @@ -2420,10 +2883,18 @@ namespace Js // (which can happen if we don't isolate prototypes but force type change on becoming proto), they will continue to do so. So // we will have two different type handlers at the exact same point in type path evolution sharing the same type path, and // consequently all fixed field info as well. This is fine, because fixed field management is done at the type path level. - PathTypeHandler * newTypeHandler = PathTypeHandler::New(scriptContext, GetTypePath(), GetPathLength(), static_cast(GetSlotCapacity()), GetInlineSlotCapacity(), GetOffsetOfInlineSlots(), true, true, GetPredecessorType()); - newTypeHandler->SetSuccessor(type, this->successorPropertyRecord, this->successorTypeWeakRef, scriptContext); - newTypeHandler->SetSuccessor(type, propertyRecord, typeWeakRef, scriptContext); - newTypeHandler->SetFlags(IsPrototypeFlag, GetFlags()); + PathTypeHandler * newTypeHandler; + if (attributes == nullptr) + { + newTypeHandler = PathTypeHandlerNoAttr::New(scriptContext, GetTypePath(), GetPathLength(), static_cast(GetSlotCapacity()), GetInlineSlotCapacity(), GetOffsetOfInlineSlots(), GetIsLocked(), GetIsShared(), GetPredecessorType()); + } + else + { + newTypeHandler = PathTypeHandlerWithAttr::New(scriptContext, GetTypePath(), attributes, accessors, GetPathLength(), static_cast(GetSlotCapacity()), GetInlineSlotCapacity(), GetOffsetOfInlineSlots(), GetIsLocked(), GetIsShared(), GetPredecessorType()); + } + newTypeHandler->SetSuccessor(type, this->successorKey, this->successorTypeWeakRef, scriptContext); + newTypeHandler->SetSuccessor(type, key, typeWeakRef, scriptContext); + newTypeHandler->SetFlags(IsPrototypeFlag | MayBecomeSharedFlag, GetFlags()); newTypeHandler->CopyPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection | PropertyTypesInlineSlotCapacityLocked, this->GetPropertyTypes()); // We don't transfer any fixed field data because we assume the type path remains the same. Assert(newTypeHandler->GetTypePath() == this->GetTypePath()); @@ -2436,24 +2907,260 @@ namespace Js #endif } - PathTypeHandler * PathTypeHandler::New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) + SimplePathTypeHandlerNoAttr * SimplePathTypeHandlerNoAttr::New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) { return New(scriptContext, typePath, pathLength, max(pathLength, inlineSlotCapacity), inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); } - PathTypeHandler * PathTypeHandler::New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) + SimplePathTypeHandlerNoAttr * SimplePathTypeHandlerNoAttr::New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) { Assert(typePath != nullptr); #ifdef PROFILE_TYPES - scriptContext->pathTypeHandlerCount++; + scriptContext->simplePathTypeHandlerCount++; #endif - return RecyclerNew(scriptContext->GetRecycler(), PathTypeHandler, typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); + return RecyclerNew(scriptContext->GetRecycler(), SimplePathTypeHandlerNoAttr, typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); } - PathTypeHandler * PathTypeHandler::New(ScriptContext * scriptContext, PathTypeHandler * typeHandler, bool isLocked, bool isShared) + SimplePathTypeHandlerNoAttr::SimplePathTypeHandlerNoAttr(TypePath *typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) : + SimplePathTypeHandler(typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType) { - Assert(typeHandler != nullptr); - return RecyclerNew(scriptContext->GetRecycler(), PathTypeHandler, typeHandler->GetTypePath(), typeHandler->GetPathLength(), static_cast(typeHandler->GetSlotCapacity()), typeHandler->GetInlineSlotCapacity(), typeHandler->GetOffsetOfInlineSlots(), isLocked, isShared); + } + +#if DBG_DUMP + void SimplePathTypeHandler::Dump(unsigned indent) const + { + Output::Print(_u("%*sSimplePathTypeHandler (0x%p): Dump unimplemented\n"), indent, _u(""), this); + } +#endif + + SimplePathTypeHandlerWithAttr * SimplePathTypeHandlerWithAttr::New(ScriptContext * scriptContext, TypePath* typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) + { + return New(scriptContext, typePath, attributes, accessors, pathLength, max(pathLength, inlineSlotCapacity), inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); + } + + SimplePathTypeHandlerWithAttr * SimplePathTypeHandlerWithAttr::New(ScriptContext * scriptContext, TypePath* typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) + { + Assert(typePath != nullptr); +#ifdef PROFILE_TYPES + scriptContext->simplePathTypeHandlerCount++; +#endif + return RecyclerNew(scriptContext->GetRecycler(), SimplePathTypeHandlerWithAttr, typePath, attributes, accessors, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); + } + + SimplePathTypeHandlerWithAttr::SimplePathTypeHandlerWithAttr(TypePath *typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) : + SimplePathTypeHandlerNoAttr(typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType), + attributes(attributes), + accessors(accessors) + { + } + + BOOL SimplePathTypeHandlerWithAttr::IsEnumerable(DynamicObject* instance, PropertyId propertyId) + { + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex != Constants::NoSlot) + { + Assert(attributes); + return (attributes[propertyIndex] & ObjectSlotAttr_Enumerable); + } + return true; + } + + BOOL SimplePathTypeHandlerWithAttr::IsWritable(DynamicObject* instance, PropertyId propertyId) + { + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex != Constants::NoSlot) + { + Assert(attributes); + return (attributes[propertyIndex] & ObjectSlotAttr_Writable); + } + return true; + } + + BOOL SimplePathTypeHandlerWithAttr::IsConfigurable(DynamicObject* instance, PropertyId propertyId) + { + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex != Constants::NoSlot) + { + Assert(attributes); + return (attributes[propertyIndex] & ObjectSlotAttr_Configurable); + } + return true; + } + + BOOL SimplePathTypeHandlerWithAttr::SetConfigurable(DynamicObject* instance, PropertyId propertyId, BOOL value) + { + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + if (!value) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetConfigurable(instance, propertyId, value); + } + } + } + return true; + } + + ObjectSlotAttributes attr = + (ObjectSlotAttributes)(value ? (attributes[propertyIndex] | ObjectSlotAttr_Configurable) : (attributes[propertyIndex] & ~ObjectSlotAttr_Configurable)); + return SetAttributesHelper(instance, propertyId, propertyIndex, attributes, attr); + } + + BOOL SimplePathTypeHandlerWithAttr::SetEnumerable(DynamicObject* instance, PropertyId propertyId, BOOL value) + { + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + if (!value) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetEnumerable(instance, propertyId, value); + } + } + } + return true; + } + + ObjectSlotAttributes attr = + (ObjectSlotAttributes)(value ? (attributes[propertyIndex] | ObjectSlotAttr_Enumerable) : (attributes[propertyIndex] & ~ObjectSlotAttr_Enumerable)); + return SetAttributesHelper(instance, propertyId, propertyIndex, attributes, attr); + } + + BOOL SimplePathTypeHandlerWithAttr::SetWritable(DynamicObject* instance, PropertyId propertyId, BOOL value) + { + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + if (!value) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetWritable(instance, propertyId, value); + } + } + } + return true; + } + + ObjectSlotAttributes attr = + (ObjectSlotAttributes)(value ? (attributes[propertyIndex] | ObjectSlotAttr_Writable) : (attributes[propertyIndex] & ~ObjectSlotAttr_Writable)); + return SetAttributesHelper(instance, propertyId, propertyIndex, attributes, attr); + } + +#if ENABLE_NATIVE_CODEGEN + bool SimplePathTypeHandlerWithAttr::IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) + { + return IsObjTypeSpecEquivalentHelper(type, attributes, record, failedPropertyIndex); + } + + bool SimplePathTypeHandlerWithAttr::IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry *entry) + { + return IsObjTypeSpecEquivalentHelper(type, attributes, entry); + } +#endif + + DescriptorFlags SimplePathTypeHandlerWithAttr::GetSetter(DynamicObject* instance, PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) + { + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + return __super::GetSetter(instance, propertyId, setterValue, info, requestContext); + } + ObjectSlotAttributes attr = attributes[propertyIndex]; + if (attr & ObjectSlotAttr_Deleted) + { + return None; + } + + Assert(!(attr & ObjectSlotAttr_Accessor)); + + if (attr & ObjectSlotAttr_Writable) + { + return WritableData; + } + return Data; + } + + DescriptorFlags SimplePathTypeHandlerWithAttr::GetSetter(DynamicObject* instance, JavascriptString* propertyNameString, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) + { + PropertyRecord const* propertyRecord; + instance->GetScriptContext()->GetOrAddPropertyRecord(propertyNameString, &propertyRecord); + return this->GetSetter(instance, propertyRecord->GetPropertyId(), setterValue, info, requestContext); + } + + BOOL SimplePathTypeHandlerWithAttr::GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) + { + PropertyIndex index = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (index == Constants::NoSlot) + { + return __super::GetProperty(instance, originalInstance, propertyId, value, info, requestContext); + } + + *value = instance->GetSlot(index); + PropertyValueInfo::Set(info, instance, index, ObjectSlotAttributesToPropertyAttributes(attributes[index])); +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + if (FixPropsOnPathTypes() && (index >= this->GetTypePath()->GetMaxInitializedLength() || this->GetTypePath()->GetIsFixedFieldAt(index, GetPathLength()))) + { + PropertyValueInfo::DisableStoreFieldCache(info); + } +#endif + return true; + } + + BOOL SimplePathTypeHandlerWithAttr::GetProperty(DynamicObject* instance, Var originalInstance, JavascriptString* propertyNameString, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) + { + // Consider: Implement actual string hash lookup + Assert(requestContext); + PropertyRecord const* propertyRecord; + char16 const * propertyName = propertyNameString->GetString(); + charcount_t const propertyNameLength = propertyNameString->GetLength(); + + if (instance->HasObjectArray()) + { + requestContext->GetOrAddPropertyRecord(propertyName, propertyNameLength, &propertyRecord); + } + else + { + requestContext->FindPropertyRecord(propertyName, propertyNameLength, &propertyRecord); + if (propertyRecord == nullptr) + { + *value = requestContext->GetMissingPropertyResult(); + return false; + } + } + return SimplePathTypeHandlerWithAttr::GetProperty(instance, originalInstance, propertyRecord->GetPropertyId(), value, info, requestContext); + } + + BOOL SimplePathTypeHandlerWithAttr::GetAttributesWithPropertyIndex(DynamicObject * instance, PropertyId propertyId, BigPropertyIndex index, PropertyAttributes * attributes) + { + if (index < this->GetPathLength()) + { + Assert(this->GetPropertyId(instance->GetScriptContext(), index) == propertyId); + *attributes = ObjectSlotAttributesToPropertyAttributes(this->attributes[index]); + return true; + } + return false; } PathTypeHandler::PathTypeHandler(TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) : @@ -2471,7 +3178,7 @@ namespace Js this->SetIsInlineSlotCapacityLocked(); if (this->propertySuccessors) { - this->propertySuccessors->Map([newInlineSlotCapacity](PropertyId, RecyclerWeakReference * typeWeakReference) + this->propertySuccessors->Map([newInlineSlotCapacity](PathTypeSuccessorKey, RecyclerWeakReference * typeWeakReference) { DynamicType * type = typeWeakReference->Get(); if (type) @@ -2492,7 +3199,7 @@ namespace Js return; } - this->propertySuccessors->Map([](const PropertyId, RecyclerWeakReference* typeWeakReference) + this->propertySuccessors->Map([](const PathTypeSuccessorKey, RecyclerWeakReference* typeWeakReference) { DynamicType * type = typeWeakReference->Get(); if (!type) @@ -2520,7 +3227,7 @@ namespace Js if (propertySuccessors && propertySuccessors->Count() > 0) { - this->propertySuccessors->Map([](const PropertyId, RecyclerWeakReference * typeWeakReference) + this->propertySuccessors->Map([](const PathTypeSuccessorKey, RecyclerWeakReference * typeWeakReference) { DynamicType * type = typeWeakReference->Get(); if (!type) @@ -2555,7 +3262,7 @@ namespace Js return; } - this->propertySuccessors->Map([](const PropertyId, RecyclerWeakReference * typeWeakReference) + this->propertySuccessors->Map([](const PathTypeSuccessorKey, RecyclerWeakReference * typeWeakReference) { DynamicType * type = typeWeakReference->Get(); if (!type) @@ -2583,7 +3290,7 @@ namespace Js } bool result = true; - this->propertySuccessors->MapUntil([&result, maxPathLength](PropertyId, RecyclerWeakReference * typeWeakReference) -> bool + this->propertySuccessors->MapUntil([&result, maxPathLength](PathTypeSuccessorKey, RecyclerWeakReference * typeWeakReference) -> bool { DynamicType * type = typeWeakReference->Get(); if (!type) @@ -2607,9 +3314,9 @@ namespace Js return result; } - bool PathTypeHandler::GetSuccessor(const PropertyRecord* propertyRecord, RecyclerWeakReference ** typeWeakRef) + bool PathTypeHandler::GetSuccessor(const PathTypeSuccessorKey key, RecyclerWeakReference ** typeWeakRef) { - if (!propertySuccessors || !propertySuccessors->TryGetValue(propertyRecord->GetPropertyId(), typeWeakRef)) + if (!propertySuccessors || !propertySuccessors->TryGetValue(key, typeWeakRef)) { *typeWeakRef = nullptr; return false; @@ -2617,13 +3324,275 @@ namespace Js return true; } - void PathTypeHandler::SetSuccessor(DynamicType * type, const PropertyRecord* propertyRecord, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) + void PathTypeHandler::SetSuccessor(DynamicType * type, const PathTypeSuccessorKey key, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) { if (!propertySuccessors) { Recycler * recycler = scriptContext->GetRecycler(); propertySuccessors = RecyclerNew(recycler, PropertySuccessorsMap, recycler, 3); } - propertySuccessors->Item(propertyRecord->GetPropertyId(), typeWeakRef); + propertySuccessors->Item(key, typeWeakRef); + } + + PathTypeHandlerNoAttr * PathTypeHandlerNoAttr::New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) + { + return New(scriptContext, typePath, pathLength, max(pathLength, inlineSlotCapacity), inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); + } + + PathTypeHandlerNoAttr * PathTypeHandlerNoAttr::New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) + { + Assert(typePath != nullptr); +#ifdef PROFILE_TYPES + scriptContext->pathTypeHandlerCount++; +#endif + return RecyclerNew(scriptContext->GetRecycler(), PathTypeHandlerNoAttr, typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); + } + + PathTypeHandlerNoAttr * PathTypeHandlerNoAttr::New(ScriptContext * scriptContext, PathTypeHandlerNoAttr * typeHandler, bool isLocked, bool isShared) + { + Assert(typeHandler != nullptr); + return RecyclerNew(scriptContext->GetRecycler(), PathTypeHandlerNoAttr, typeHandler->GetTypePath(), typeHandler->GetPathLength(), static_cast(typeHandler->GetSlotCapacity()), typeHandler->GetInlineSlotCapacity(), typeHandler->GetOffsetOfInlineSlots(), isLocked, isShared); + } + + PathTypeHandlerNoAttr::PathTypeHandlerNoAttr(TypePath *typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) : + PathTypeHandler(typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType) + { + } + + PathTypeHandlerWithAttr * PathTypeHandlerWithAttr::New(ScriptContext * scriptContext, TypePath* typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) + { + return New(scriptContext, typePath, attributes, accessors, pathLength, max(pathLength, inlineSlotCapacity), inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); + } + + PathTypeHandlerWithAttr * PathTypeHandlerWithAttr::New(ScriptContext * scriptContext, TypePath* typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) + { + Assert(typePath != nullptr); +#ifdef PROFILE_TYPES + scriptContext->simplePathTypeHandlerCount++; +#endif + return RecyclerNew(scriptContext->GetRecycler(), PathTypeHandlerWithAttr, typePath, attributes, accessors, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType); + } + + PathTypeHandlerWithAttr::PathTypeHandlerWithAttr(TypePath *typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked, bool isShared, DynamicType* predecessorType) : + PathTypeHandlerNoAttr(typePath, pathLength, slotCapacity, inlineSlotCapacity, offsetOfInlineSlots, isLocked, isShared, predecessorType), + attributes(attributes), + accessors(accessors) + { + } + + BOOL PathTypeHandlerWithAttr::IsEnumerable(DynamicObject* instance, PropertyId propertyId) + { + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex != Constants::NoSlot) + { + Assert(attributes); + return (attributes[propertyIndex] & ObjectSlotAttr_Enumerable); + } + return true; + } + + BOOL PathTypeHandlerWithAttr::IsWritable(DynamicObject* instance, PropertyId propertyId) + { + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex != Constants::NoSlot) + { + Assert(attributes); + return (attributes[propertyIndex] & ObjectSlotAttr_Writable); + } + return true; + } + + BOOL PathTypeHandlerWithAttr::IsConfigurable(DynamicObject* instance, PropertyId propertyId) + { + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex != Constants::NoSlot) + { + Assert(attributes); + return (attributes[propertyIndex] & ObjectSlotAttr_Configurable); + } + return true; + } + + BOOL PathTypeHandlerWithAttr::SetConfigurable(DynamicObject* instance, PropertyId propertyId, BOOL value) + { + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + if (!value) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetConfigurable(instance, propertyId, value); + } + } + } + return true; + } + + ObjectSlotAttributes attr = + (ObjectSlotAttributes)(value ? (attributes[propertyIndex] | ObjectSlotAttr_Configurable) : (attributes[propertyIndex] & ~ObjectSlotAttr_Configurable)); + return SetAttributesHelper(instance, propertyId, propertyIndex, attributes, attr); + } + + BOOL PathTypeHandlerWithAttr::SetEnumerable(DynamicObject* instance, PropertyId propertyId, BOOL value) + { + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + if (!value) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetEnumerable(instance, propertyId, value); + } + } + } + return true; + } + + ObjectSlotAttributes attr = + (ObjectSlotAttributes)(value ? (attributes[propertyIndex] | ObjectSlotAttr_Enumerable) : (attributes[propertyIndex] & ~ObjectSlotAttr_Enumerable)); + return SetAttributesHelper(instance, propertyId, propertyIndex, attributes, attr); + } + + BOOL PathTypeHandlerWithAttr::SetWritable(DynamicObject* instance, PropertyId propertyId, BOOL value) + { + // Find the property + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + if (!value) + { + // Upgrade type handler if set objectArray item attribute. + // Only check numeric propertyId if objectArray available. + if (instance->HasObjectArray()) + { + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyRecord->IsNumeric()) + { + return ConvertToTypeWithItemAttributes(instance)->SetWritable(instance, propertyId, value); + } + } + } + return true; + } + + ObjectSlotAttributes attr = + (ObjectSlotAttributes)(value ? (attributes[propertyIndex] | ObjectSlotAttr_Writable) : (attributes[propertyIndex] & ~ObjectSlotAttr_Writable)); + return SetAttributesHelper(instance, propertyId, propertyIndex, attributes, attr); } + +#if ENABLE_NATIVE_CODEGEN + bool PathTypeHandlerWithAttr::IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) + { + return IsObjTypeSpecEquivalentHelper(type, attributes, record, failedPropertyIndex); + } + + bool PathTypeHandlerWithAttr::IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry *entry) + { + return IsObjTypeSpecEquivalentHelper(type, attributes, entry); + } +#endif + + DescriptorFlags PathTypeHandlerWithAttr::GetSetter(DynamicObject* instance, PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) + { + PropertyIndex propertyIndex = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (propertyIndex == Constants::NoSlot) + { + return __super::GetSetter(instance, propertyId, setterValue, info, requestContext); + } + ObjectSlotAttributes attr = attributes[propertyIndex]; + if (attr & ObjectSlotAttr_Deleted) + { + return None; + } + + Assert(!(attr & ObjectSlotAttr_Accessor)); + + if (attr & ObjectSlotAttr_Writable) + { + return WritableData; + } + return Data; + } + + DescriptorFlags PathTypeHandlerWithAttr::GetSetter(DynamicObject* instance, JavascriptString* propertyNameString, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) + { + PropertyRecord const* propertyRecord; + instance->GetScriptContext()->GetOrAddPropertyRecord(propertyNameString, &propertyRecord); + return this->GetSetter(instance, propertyRecord->GetPropertyId(), setterValue, info, requestContext); + } + + BOOL PathTypeHandlerWithAttr::GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) + { + PropertyIndex index = GetTypePath()->LookupInline(propertyId, GetPathLength()); + if (index == Constants::NoSlot) + { + return __super::GetProperty(instance, originalInstance, propertyId, value, info, requestContext); + } + + *value = instance->GetSlot(index); + PropertyValueInfo::Set(info, instance, index, ObjectSlotAttributesToPropertyAttributes(attributes[index])); +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + if (FixPropsOnPathTypes() && (index >= this->GetTypePath()->GetMaxInitializedLength() || this->GetTypePath()->GetIsFixedFieldAt(index, GetPathLength()))) + { + PropertyValueInfo::DisableStoreFieldCache(info); + } +#endif + return true; + } + + BOOL PathTypeHandlerWithAttr::GetProperty(DynamicObject* instance, Var originalInstance, JavascriptString* propertyNameString, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) + { + // Consider: Implement actual string hash lookup + Assert(requestContext); + PropertyRecord const* propertyRecord; + char16 const * propertyName = propertyNameString->GetString(); + charcount_t const propertyNameLength = propertyNameString->GetLength(); + + if (instance->HasObjectArray()) + { + requestContext->GetOrAddPropertyRecord(propertyName, propertyNameLength, &propertyRecord); + } + else + { + requestContext->FindPropertyRecord(propertyName, propertyNameLength, &propertyRecord); + if (propertyRecord == nullptr) + { + *value = requestContext->GetMissingPropertyResult(); + return false; + } + } + return PathTypeHandlerWithAttr::GetProperty(instance, originalInstance, propertyRecord->GetPropertyId(), value, info, requestContext); + } + + BOOL PathTypeHandlerWithAttr::GetAttributesWithPropertyIndex(DynamicObject * instance, PropertyId propertyId, BigPropertyIndex index, PropertyAttributes * attributes) + { + if (index < this->GetPathLength()) + { + Assert(this->GetPropertyId(instance->GetScriptContext(), index) == propertyId); + *attributes = ObjectSlotAttributesToPropertyAttributes(this->attributes[index]); + return true; + } + return false; + } + +#if DBG_DUMP + void PathTypeHandler::Dump(unsigned indent) const + { + Output::Print(_u("%*sPathTypeHandler (0x%p): Dump unimplemented\n"), indent, _u(""), this); + } +#endif } diff --git a/deps/chakrashim/core/lib/Runtime/Types/PathTypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/PathTypeHandler.h index 04f37aa4d0d..c42848ee2ef 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/PathTypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/PathTypeHandler.h @@ -6,16 +6,62 @@ namespace Js { + typedef uint8 PathTypeHandlerSetterSlotIndex; + static const PathTypeHandlerSetterSlotIndex NoSetterSlot = (PathTypeHandlerSetterSlotIndex)-1; + + static const uint ObjectSlotAttr_BitSize = 8; + typedef uint8 ObjectSlotAttr_TSize; + + enum ObjectSlotAttributes : ObjectSlotAttr_TSize + { + ObjectSlotAttr_None = 0x00, + ObjectSlotAttr_Enumerable = 0x01, + ObjectSlotAttr_Configurable = 0x02, + ObjectSlotAttr_Writable = 0x04, + ObjectSlotAttr_Deleted = 0x08, + ObjectSlotAttr_Accessor = 0x10, + ObjectSlotAttr_Int = 0x20, + ObjectSlotAttr_Double = 0x40, + ObjectSlotAttr_Default = (ObjectSlotAttr_Writable|ObjectSlotAttr_Enumerable|ObjectSlotAttr_Configurable), + ObjectSlotAttr_PropertyAttributesMask = (ObjectSlotAttr_Default|ObjectSlotAttr_Deleted), + }; + + class PathTypeSuccessorKey + { + private: + Field(PropertyId) propertyId; + Field(ObjectSlotAttributes) attributes; + + public: + PathTypeSuccessorKey(); + PathTypeSuccessorKey(const PropertyId propertyId, const ObjectSlotAttributes attributes); + + public: + bool HasInfo() const; + void Clear(); + PropertyId GetPropertyId() const; + ObjectSlotAttributes GetAttributes() const; + + public: + bool operator ==(const PathTypeSuccessorKey &other) const; + bool operator !=(const PathTypeSuccessorKey &other) const; + hash_t GetHashCode() const; + operator hash_t() const { return GetHashCode(); } + }; + class SimplePathTypeHandler; class PathTypeHandlerBase : public DynamicTypeHandler { + friend class SimplePathTypeHandlerNoAttr; + friend class SimplePathTypeHandlerWithAttr; + friend class PathTypeHandlerNoAttr; + friend class PathTypeHandlerWithAttr; friend class DynamicObject; - friend class SimplePathTypeHandler; - friend class PathTypeHandler; - private: - Field(TypePath*) typePath; + + protected: Field(DynamicType*) predecessorType; // Strong reference to predecessor type so that predecessor types remain in the cache even though they might not be used + Field(TypePath*) typePath; public: DEFINE_GETCPPNAME(); @@ -29,8 +75,10 @@ namespace Js public: virtual BOOL IsLockable() const override { return true; } virtual BOOL IsSharable() const override { return true; } - virtual void DoShareTypeHandler(ScriptContext* scriptContext) override; + static PropertyAttributes ObjectSlotAttributesToPropertyAttributes(const ObjectSlotAttributes attr) { return attr & ObjectSlotAttr_PropertyAttributesMask; } + static ObjectSlotAttributes PropertyAttributesToObjectSlotAttributes(const PropertyAttributes attr) { return (ObjectSlotAttributes)(attr & ObjectSlotAttr_PropertyAttributesMask); } + static bool ObjectSlotAttributesContains(const PropertyAttributes attr) { return attr == (attr & ObjectSlotAttr_PropertyAttributesMask); } static bool UsePathTypeHandlerForObjectLiteral(const PropertyIdArray *const propIds, bool *const check__proto__Ref = nullptr); static DynamicType* CreateTypeForNewScObject(ScriptContext* scriptContext, DynamicType* type, const Js::PropertyIdArray *propIds, bool shareType); static DynamicType* CreateNewScopeObject(ScriptContext* scriptContext, DynamicType* type, const Js::PropertyIdArray *propIds, PropertyAttributes extraAttributes = PropertyNone, uint extraAttributesSlotCount = UINT_MAX); @@ -41,11 +89,11 @@ namespace Js virtual PropertyId GetPropertyId(ScriptContext* scriptContext, PropertyIndex index) override; virtual PropertyId GetPropertyId(ScriptContext* scriptContext, BigPropertyIndex index) override; virtual PropertyIndex GetPropertyIndex(const PropertyRecord* propertyRecord) override; +#if ENABLE_NATIVE_CODEGEN virtual bool GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; - virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, - PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override; +#endif virtual BOOL HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl = nullptr) override; virtual BOOL HasProperty(DynamicObject* instance, JavascriptString* propertyNameString) override; virtual BOOL GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; @@ -53,7 +101,7 @@ namespace Js virtual BOOL SetProperty(DynamicObject* instance, PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override; virtual BOOL SetProperty(DynamicObject* instance, JavascriptString* propertyNameString, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override; virtual BOOL DeleteProperty(DynamicObject* instance, PropertyId propertyId, PropertyOperationFlags flags) override; - virtual BOOL IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) override; + virtual BOOL IsEnumerable(DynamicObject* instance, PropertyId propertyId) override; virtual BOOL IsWritable(DynamicObject* instance, PropertyId propertyId) override; virtual BOOL IsConfigurable(DynamicObject* instance, PropertyId propertyId) override; @@ -71,7 +119,7 @@ namespace Js virtual void SetAllPropertiesToUndefined(DynamicObject* instance, bool invalidateFixedFields) override; virtual void MarshalAllPropertiesToScriptContext(DynamicObject* instance, ScriptContext* targetScriptContext, bool invalidateFixedFields) override; virtual DynamicTypeHandler* ConvertToTypeWithItemAttributes(DynamicObject* instance) override; - virtual BOOL AllPropertiesAreEnumerable() sealed { return true; } + virtual BOOL AllPropertiesAreEnumerable() override { return true; } virtual BOOL IsPathTypeHandler() const { return TRUE; } virtual void ShrinkSlotAndInlineSlotCapacity() override; @@ -85,16 +133,27 @@ namespace Js virtual void SetIsPrototype(DynamicObject* instance) override; + BOOL FindNextPropertyHelper(ScriptContext* scriptContext, ObjectSlotAttributes * objectAttributes, PropertyIndex& index, JavascriptString** propertyString, + PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info); + BOOL SetAttributesHelper(DynamicObject* instance, PropertyId propertyId, PropertyIndex propertyIndex, ObjectSlotAttributes * instanceAttributes, ObjectSlotAttributes propertyAttributes); +#if ENABLE_NATIVE_CODEGEN + bool IsObjTypeSpecEquivalentHelper(const Type* type, const ObjectSlotAttributes * attributes, const TypeEquivalenceRecord& record, uint& failedPropertyIndex); + bool IsObjTypeSpecEquivalentHelper(const Type* type, const ObjectSlotAttributes * attributes, const EquivalentPropertyEntry* entry); +#endif + #if DBG virtual bool SupportsPrototypeInstances() const { return !IsolatePrototypes(); } + virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) override; #endif +#if ENABLE_FIXED_FIELDS + virtual void DoShareTypeHandler(ScriptContext* scriptContext) override; + virtual BOOL IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) override; virtual bool HasSingletonInstance() const override sealed; virtual bool TryUseFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext) override; virtual bool TryUseFixedAccessor(PropertyRecord const * propertyRecord, Var * pAccessor, FixedPropertyKind propertyType, bool getter, ScriptContext * requestContext) override; #if DBG - virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) override; bool HasOnlyInitializedNonFixedProperties(); virtual bool CheckFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, ScriptContext * requestContext) override; virtual bool HasAnyFixedProperties() const override; @@ -114,7 +173,6 @@ namespace Js DynamicObject* instance, DynamicTypeHandler* oldTypeHandler, DynamicTypeHandler* newTypeHandler, DynamicType* oldType, DynamicType* newType, RecyclerWeakReference* oldSingletonInstanceBefore); #endif - private: static bool FixPropsOnPathTypes() { @@ -143,7 +201,7 @@ namespace Js bool HasSingletonInstanceOnlyIfNeeded() const { #ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES - return AreSingletonInstancesNeeded() || !this->typePath->HasSingletonInstance(); + return AreSingletonInstancesNeeded() || !this->GetTypePath()->HasSingletonInstance(); #else return true; #endif @@ -153,16 +211,16 @@ namespace Js private: template void DoShareTypeHandlerInternal(ScriptContext* scriptContext); - void CopySingletonInstance(DynamicObject* instance, DynamicTypeHandler* typeHandler); void InvalidateFixedFieldAt(Js::PropertyId propertyId, Js::PropertyIndex index, ScriptContext* scriptContext); void AddBlankFieldAt(Js::PropertyId propertyId, Js::PropertyIndex index, ScriptContext* scriptContext); bool ProcessFixedFieldChange(DynamicObject* instance, PropertyId propertyId, PropertyIndex slotIndex, Var value, bool isNonFixed, const PropertyRecord * propertyRecord = nullptr); +#endif // ENABLE_FIXED_FIELDS private: template T* ConvertToTypeHandler(DynamicObject* instance); - DynamicType* PromoteType(DynamicObject* instance, const PropertyRecord* propertyId, PropertyIndex* propertyIndex); + DynamicType* PromoteType(DynamicObject* instance, const PathTypeSuccessorKey key, PropertyIndex* propertyIndex); DictionaryTypeHandler* ConvertToDictionaryType(DynamicObject* instance); ES5ArrayTypeHandler* ConvertToES5ArrayType(DynamicObject* instance); @@ -175,9 +233,9 @@ namespace Js return ConvertToSimpleDictionaryType(instance, propertyCapacity, mayBecomeShared); } - BOOL AddPropertyInternal(DynamicObject * instance, PropertyId propertyId, Js::Var value, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects); + BOOL AddPropertyInternal(DynamicObject * instance, PropertyId propertyId, Js::Var value, ObjectSlotAttributes attr, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects); BOOL AddProperty(DynamicObject* instance, PropertyId propertyId, Var value, PropertyAttributes attributes, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects); - BOOL SetPropertyInternal(DynamicObject* instance, PropertyId propertyId, Var value, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects); + template BOOL SetPropertyInternal(DynamicObject* instance, PropertyId propertyId, Var value, ObjectSlotAttributes attr, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects); virtual BOOL FreezeImpl(DynamicObject* instance, bool isConvertedType) override; // Checks whether conversion to shared type is needed and performs it, then calls actual operation on the shared type. @@ -187,19 +245,38 @@ namespace Js BOOL ConvertToSharedNonExtensibleTypeIfNeededAndCallOperation(DynamicObject* instance, const PropertyRecord* operationInternalPropertyId, FType operation); template - DynamicType* PromoteType(DynamicType* type, const PropertyRecord* propertyId, bool shareType, ScriptContext* scriptContext, DynamicObject* object = nullptr, PropertyIndex* propertyIndex = nullptr); + DynamicType* PromoteType(DynamicType* type, const PathTypeSuccessorKey key, bool shareType, ScriptContext* scriptContext, DynamicObject* object = nullptr, PropertyIndex* propertyIndex = nullptr); + ObjectSlotAttributes * UpdateAttributes(Recycler * recycler, ObjectSlotAttributes * oldAttributes, uint8 oldPathSize, uint8 newTypePathSize); + PathTypeHandlerSetterSlotIndex * UpdateSetterSlots(Recycler * recycler, PathTypeHandlerSetterSlotIndex * oldSetters, uint8 oldPathSize, uint8 newTypePathSize); PropertyIndex GetPropertyIndex(PropertyId propertyId); + void SetSlotAndCache(DynamicObject* instance, PropertyId propertyId, PropertyRecord const * record, PropertyIndex index, Var value, PropertyValueInfo* info, PropertyOperationFlags flags, SideEffects possibleSideEffects); protected: - virtual bool GetSuccessor(const PropertyRecord* propertyRecord, RecyclerWeakReference ** typeWeakRef) = 0; - virtual void SetSuccessor(DynamicType * type, const PropertyRecord* propertyRecord, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) = 0; + virtual bool GetSuccessor(const PathTypeSuccessorKey successorKey, RecyclerWeakReference ** typeWeakRef) = 0; + virtual void SetSuccessor(DynamicType * type, const PathTypeSuccessorKey successorKey, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) = 0; uint16 GetPathLength() const { return GetUnusedBytesValue(); } TypePath * GetTypePath() const { return typePath; } + virtual void SetTypePath(TypePath *typePath) { this->typePath = typePath; } DynamicType * GetPredecessorType() const { return predecessorType; } PathTypeHandlerBase* GetRootPathTypeHandler(); + virtual ObjectSlotAttributes * GetAttributeArray() const { return nullptr; } + virtual ObjectSlotAttributes GetAttributes(const PropertyIndex index) const { return ObjectSlotAttr_Default; } + virtual void SetAttributeArray(ObjectSlotAttributes * attributes) { Assert(false); } + virtual PathTypeHandlerSetterSlotIndex * GetSetterSlots() const { return nullptr; } + virtual PathTypeHandlerSetterSlotIndex GetSetterSlotIndex(const PropertyIndex index) const { return NoSetterSlot; } + virtual void SetSetterSlots(PathTypeHandlerSetterSlotIndex * setters) { Assert(false); } + +#if ENABLE_FIXED_FIELDS +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + template void InitializePath(DynamicObject *const object, const PropertyIndex slotIndex, const PropertyIndex objectSlotCount, ScriptContext *const scriptContext, const FMarkAsFixed MarkAsFixed); + template void InitializeNewPath(DynamicObject *const object, const PropertyIndex slotIndex, const PropertyIndex objectSlotCount, const FMarkAsFixed MarkAsFixed); + void InitializeExistingPath(const PropertyIndex slotIndex, const PropertyIndex objectSlotCount, ScriptContext *const scriptContext); +#endif +#endif + public: virtual void ShrinkSlotAndInlineSlotCapacity(uint16 newInlineSlotCapacity) = 0; virtual bool GetMaxPathLength(uint16 * maxPathLength) = 0; @@ -218,25 +295,89 @@ namespace Js #endif }; +#if ENABLE_FIXED_FIELDS +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES + + template + void PathTypeHandlerBase::InitializePath( + DynamicObject *const object, + const PropertyIndex slotIndex, + const PropertyIndex objectSlotCount, + ScriptContext *const scriptContext, + const FMarkAsFixed MarkAsFixed) + { + Assert(slotIndex < objectSlotCount); + Assert(objectSlotCount == slotIndex + 1); + + if(!PathTypeHandler::FixPropsOnPathTypes()) + { + return; + } + + if(objectSlotCount <= GetTypePath()->GetMaxInitializedLength()) + { + InitializeExistingPath(slotIndex, objectSlotCount, scriptContext); + return; + } + InitializeNewPath(object, slotIndex, objectSlotCount, MarkAsFixed); + } + + template + void PathTypeHandlerBase::InitializeNewPath( + DynamicObject *const object, + const PropertyIndex slotIndex, + const PropertyIndex objectSlotCount, + const FMarkAsFixed MarkAsFixed) + { + TypePath *const typePath = GetTypePath(); + Assert(slotIndex == typePath->GetMaxInitializedLength()); + Assert(objectSlotCount > typePath->GetMaxInitializedLength()); + + // We are a adding a property where no instance property has been set before. We rely on properties being + // added in order of indexes to be sure that we don't leave any uninitialized properties interspersed with + // initialized ones, which could lead to incorrect behavior. See comment in TypePath::Branch. + + if(!object) + { + typePath->AddBlankFieldAt(slotIndex, objectSlotCount); + return; + } + + // Consider: It would be nice to assert the slot is actually null. However, we sometimes pre-initialize to + // undefined or even some other special illegal value (for let or const, currently == null) + // Assert(object->GetSlot(index) == null); + + if(PathTypeHandler::ShouldFixAnyProperties() && PathTypeHandler::CanBeSingletonInstance(object)) + { + typePath->AddSingletonInstanceFieldAt(object, slotIndex, MarkAsFixed(), objectSlotCount); + return; + } + + typePath->AddSingletonInstanceFieldAt(slotIndex, objectSlotCount); + } + +#endif +#endif + typedef SimpleDictionaryTypeHandlerBase SimpleDictionaryTypeHandlerWithNontExtensibleSupport; - class SimplePathTypeHandler sealed : public PathTypeHandlerBase + class SimplePathTypeHandler : public PathTypeHandlerBase { private: - Field(const PropertyRecord *) successorPropertyRecord; + Field(PathTypeSuccessorKey) successorKey; Field(RecyclerWeakReference *) successorTypeWeakRef; public: DEFINE_GETCPPNAME(); - private: - SimplePathTypeHandler(TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + protected: + SimplePathTypeHandler(TypePath *typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); - DEFINE_VTABLE_CTOR_INIT_NO_REGISTER(SimplePathTypeHandler, PathTypeHandlerBase, successorPropertyRecord(nullptr), successorTypeWeakRef(nullptr)); + DEFINE_VTABLE_CTOR_INIT_NO_REGISTER(SimplePathTypeHandler, PathTypeHandlerBase, successorKey(Constants::NoProperty, ObjectSlotAttr_None), successorTypeWeakRef(nullptr)); protected: - virtual bool GetSuccessor(const PropertyRecord* propertyRecord, RecyclerWeakReference ** typeWeakRef) override; - virtual void SetSuccessor(DynamicType * type, const PropertyRecord* propertyRecord, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) override; + virtual bool GetSuccessor(const PathTypeSuccessorKey successorKey, RecyclerWeakReference ** typeWeakRef) override; + void SetSuccessorHelper(DynamicType * type, const PathTypeSuccessorKey successorKey, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext); public: virtual void ShrinkSlotAndInlineSlotCapacity(uint16 newInlineSlotCapacity) override; @@ -245,30 +386,117 @@ namespace Js virtual void EnsureInlineSlotCapacityIsLocked(bool startFromRoot) override; virtual void VerifyInlineSlotCapacityIsLocked(bool startFromRoot) override; - static SimplePathTypeHandler * New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); - static SimplePathTypeHandler * New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); - static SimplePathTypeHandler * New(ScriptContext * scriptContext, SimplePathTypeHandler * typeHandler, bool isLocked, bool isShared); +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override; +#endif + }; + + class SimplePathTypeHandlerNoAttr : public SimplePathTypeHandler + { + public: + DEFINE_GETCPPNAME(); + + protected: + SimplePathTypeHandlerNoAttr(TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + + DEFINE_VTABLE_CTOR_NO_REGISTER(SimplePathTypeHandlerNoAttr, SimplePathTypeHandler); + + protected: + virtual void SetSuccessor(DynamicType * type, const PathTypeSuccessorKey successorKey, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) override + { + SetSuccessorHelper(type, successorKey, nullptr, nullptr, typeWeakRef, scriptContext); + } + + public: + static SimplePathTypeHandlerNoAttr * New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + static SimplePathTypeHandlerNoAttr * New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + static SimplePathTypeHandlerNoAttr * New(ScriptContext * scriptContext, SimplePathTypeHandlerNoAttr * typeHandler, bool isLocked, bool isShared); + + virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, + PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override + { + return FindNextPropertyHelper(scriptContext, nullptr, index, propertyString, propertyId, attributes, type, typeToEnumerate, flags, instance, info); + } }; - class PathTypeHandler sealed : public PathTypeHandlerBase + class SimplePathTypeHandlerWithAttr : public SimplePathTypeHandlerNoAttr + { + private: + Field(ObjectSlotAttributes *) attributes; + Field(PathTypeHandlerSetterSlotIndex *) accessors; + + public: + DEFINE_GETCPPNAME(); + + protected: + SimplePathTypeHandlerWithAttr(TypePath* typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + + DEFINE_VTABLE_CTOR_INIT_NO_REGISTER(SimplePathTypeHandlerWithAttr, SimplePathTypeHandlerNoAttr, attributes(nullptr), accessors(nullptr)); + + protected: + virtual ObjectSlotAttributes * GetAttributeArray() const override { return attributes; } + virtual ObjectSlotAttributes GetAttributes(const PropertyIndex index) const override { Assert(index < GetPathLength()); return attributes[index]; } + virtual void SetAttributeArray(ObjectSlotAttributes * attributes) override { this->attributes = attributes; } + virtual PathTypeHandlerSetterSlotIndex * GetSetterSlots() const override { return accessors; } + virtual PathTypeHandlerSetterSlotIndex GetSetterSlotIndex(const PropertyIndex index) const override { Assert(index < GetPathLength()); return accessors[index]; } + virtual void SetSetterSlots(PathTypeHandlerSetterSlotIndex * accessors) override { this->accessors = accessors; } + + virtual void SetSuccessor(DynamicType * type, const PathTypeSuccessorKey successorKey, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) + { + SetSuccessorHelper(type, successorKey, attributes, accessors, typeWeakRef, scriptContext); + } + + public: + static SimplePathTypeHandlerWithAttr * New(ScriptContext * scriptContext, TypePath * typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + static SimplePathTypeHandlerWithAttr * New(ScriptContext * scriptContext, TypePath * typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + static SimplePathTypeHandlerWithAttr * New(ScriptContext * scriptContext, SimplePathTypeHandlerWithAttr * typeHandler, bool isLocked, bool isShared); + + virtual BOOL IsEnumerable(DynamicObject* instance, PropertyId propertyId) override; + virtual BOOL IsWritable(DynamicObject* instance, PropertyId propertyId) override; + virtual BOOL IsConfigurable(DynamicObject* instance, PropertyId propertyId) override; + virtual BOOL SetEnumerable(DynamicObject* instance, PropertyId propertyId, BOOL value) override; + virtual BOOL SetWritable(DynamicObject* instance, PropertyId propertyId, BOOL value) override; + virtual BOOL SetConfigurable(DynamicObject* instance, PropertyId propertyId, BOOL value) override; + + virtual BOOL GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; + virtual BOOL GetProperty(DynamicObject* instance, Var originalInstance, JavascriptString* propertyNameString, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; + virtual BOOL GetAttributesWithPropertyIndex(DynamicObject * instance, PropertyId propertyId, BigPropertyIndex index, PropertyAttributes * attributes) override; + + virtual DescriptorFlags GetSetter(DynamicObject* instance, PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override; + virtual DescriptorFlags GetSetter(DynamicObject* instance, JavascriptString* propertyNameString, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override; + + virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, + PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override + { + return FindNextPropertyHelper(scriptContext, this->attributes, index, propertyString, propertyId, attributes, type, typeToEnumerate, flags, instance, info); + } + virtual BOOL AllPropertiesAreEnumerable() sealed override { return false; } +#if ENABLE_NATIVE_CODEGEN + virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; + virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; +#endif + }; + + class PathTypeHandler : public PathTypeHandlerBase { friend class SimplePathTypeHandler; private: - typedef JsUtil::WeakReferenceDictionary> PropertySuccessorsMap; + typedef JsUtil::WeakReferenceDictionary> PropertySuccessorsMap; Field(PropertySuccessorsMap *) propertySuccessors; public: DEFINE_GETCPPNAME(); - private: - PathTypeHandler(TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + protected: + PathTypeHandler(TypePath *typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); DEFINE_VTABLE_CTOR_INIT_NO_REGISTER(PathTypeHandler, PathTypeHandlerBase, propertySuccessors(nullptr)); protected: - virtual bool GetSuccessor(const PropertyRecord* propertyRecord, RecyclerWeakReference ** typeWeakRef) override; - virtual void SetSuccessor(DynamicType * type, const PropertyRecord* propertyRecord, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) override; + virtual bool GetSuccessor(const PathTypeSuccessorKey successorKey, RecyclerWeakReference ** typeWeakRef) override; + virtual void SetSuccessor(DynamicType * type, const PathTypeSuccessorKey successorKey, RecyclerWeakReference * typeWeakRef, ScriptContext * scriptContext) override; public: virtual void ShrinkSlotAndInlineSlotCapacity(uint16 newInlineSlotCapacity) override; @@ -277,8 +505,85 @@ namespace Js virtual void EnsureInlineSlotCapacityIsLocked(bool startFromRoot) override; virtual void VerifyInlineSlotCapacityIsLocked(bool startFromRoot) override; - static PathTypeHandler * New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); - static PathTypeHandler * New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); - static PathTypeHandler * New(ScriptContext * scriptContext, PathTypeHandler * typeHandler, bool isLocked, bool isShared); +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override; +#endif + }; + + class PathTypeHandlerNoAttr : public PathTypeHandler + { + public: + DEFINE_GETCPPNAME(); + + protected: + PathTypeHandlerNoAttr(TypePath *typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + + DEFINE_VTABLE_CTOR_NO_REGISTER(PathTypeHandlerNoAttr, PathTypeHandler); + + public: + static PathTypeHandlerNoAttr * New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + static PathTypeHandlerNoAttr * New(ScriptContext * scriptContext, TypePath* typePath, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + static PathTypeHandlerNoAttr * New(ScriptContext * scriptContext, PathTypeHandlerNoAttr * typeHandler, bool isLocked, bool isShared); + + virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, + PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override + { + return FindNextPropertyHelper(scriptContext, nullptr, index, propertyString, propertyId, attributes, type, typeToEnumerate, flags, instance, info); + } + }; + + class PathTypeHandlerWithAttr : public PathTypeHandlerNoAttr + { + private: + Field(ObjectSlotAttributes *) attributes; + Field(PathTypeHandlerSetterSlotIndex *) accessors; + + public: + DEFINE_GETCPPNAME(); + + protected: + PathTypeHandlerWithAttr(TypePath* typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + + DEFINE_VTABLE_CTOR_INIT_NO_REGISTER(PathTypeHandlerWithAttr, PathTypeHandlerNoAttr, attributes(nullptr), accessors(nullptr)); + + protected: + virtual ObjectSlotAttributes * GetAttributeArray() const override { return attributes; } + virtual ObjectSlotAttributes GetAttributes(const PropertyIndex index) const override { Assert(index < GetPathLength()); return attributes[index]; } + virtual void SetAttributeArray(ObjectSlotAttributes * attributes) override { this->attributes = attributes; } + virtual PathTypeHandlerSetterSlotIndex * GetSetterSlots() const override { return accessors; } + virtual PathTypeHandlerSetterSlotIndex GetSetterSlotIndex(const PropertyIndex index) const override { Assert(index < GetPathLength()); return accessors[index]; } + virtual void SetSetterSlots(PathTypeHandlerSetterSlotIndex * accessors) override { this->accessors = accessors; } + + public: + static PathTypeHandlerWithAttr * New(ScriptContext * scriptContext, TypePath * typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + static PathTypeHandlerWithAttr * New(ScriptContext * scriptContext, TypePath * typePath, ObjectSlotAttributes * attributes, PathTypeHandlerSetterSlotIndex * accessors, uint16 pathLength, const PropertyIndex slotCapacity, uint16 inlineSlotCapacity, uint16 offsetOfInlineSlots, bool isLocked = false, bool isShared = false, DynamicType* predecessorType = nullptr); + static PathTypeHandlerWithAttr * New(ScriptContext * scriptContext, PathTypeHandlerWithAttr * typeHandler, bool isLocked, bool isShared); + + virtual BOOL IsEnumerable(DynamicObject* instance, PropertyId propertyId) override; + virtual BOOL IsWritable(DynamicObject* instance, PropertyId propertyId) override; + virtual BOOL IsConfigurable(DynamicObject* instance, PropertyId propertyId) override; + virtual BOOL SetEnumerable(DynamicObject* instance, PropertyId propertyId, BOOL value) override; + virtual BOOL SetWritable(DynamicObject* instance, PropertyId propertyId, BOOL value) override; + virtual BOOL SetConfigurable(DynamicObject* instance, PropertyId propertyId, BOOL value) override; + + virtual BOOL GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; + virtual BOOL GetProperty(DynamicObject* instance, Var originalInstance, JavascriptString* propertyNameString, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; + virtual BOOL GetAttributesWithPropertyIndex(DynamicObject * instance, PropertyId propertyId, BigPropertyIndex index, PropertyAttributes * attributes) override; + + virtual DescriptorFlags GetSetter(DynamicObject* instance, PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override; + virtual DescriptorFlags GetSetter(DynamicObject* instance, JavascriptString* propertyNameString, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override; + + virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, + PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override + { + return FindNextPropertyHelper(scriptContext, this->attributes, index, propertyString, propertyId, attributes, type, typeToEnumerate, flags, instance, info); + } + virtual BOOL AllPropertiesAreEnumerable() sealed override { return false; } +#if ENABLE_NATIVE_CODEGEN + virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; + virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; +#endif }; + } diff --git a/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.cpp b/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.cpp index 095c1f95933..18f3ab9f08b 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.cpp @@ -23,9 +23,9 @@ namespace Js } void PropertyValueInfo::SetCacheInfo( - PropertyValueInfo* info, - PropertyString *const propertyString, - PolymorphicInlineCache *const polymorphicInlineCache, + _Out_ PropertyValueInfo* info, + _In_opt_ PropertyString *const propertyString, + _In_ PolymorphicInlineCache *const polymorphicInlineCache, bool allowResizing) { Assert(info); @@ -165,7 +165,7 @@ namespace Js { if (DynamicType::Is(this->GetTypeId())) { - DynamicObject* dynamicThis = DynamicObject::FromVar(this); + DynamicObject* dynamicThis = DynamicObject::UnsafeFromVar(this); dynamicThis->SetIsPrototype(); // Call the DynamicObject::SetIsPrototype } } @@ -174,7 +174,7 @@ namespace Js { if (DynamicType::Is(this->GetTypeId())) { - DynamicObject* obj = DynamicObject::FromVar(this); + DynamicObject* obj = DynamicObject::UnsafeFromVar(this); return obj->GetTypeHandler()->GetHasOnlyWritableDataProperties() && (!obj->HasObjectArray() || obj->GetObjectArrayOrFlagsAsArray()->HasOnlyWritableDataProperties()); } @@ -186,7 +186,7 @@ namespace Js { if (DynamicType::Is(this->GetTypeId())) { - DynamicObject* obj = DynamicObject::FromVar(this); + DynamicObject* obj = DynamicObject::UnsafeFromVar(this); obj->GetTypeHandler()->ClearWritableDataOnlyDetectionBit(); if (obj->HasObjectArray()) { @@ -199,7 +199,7 @@ namespace Js { if (DynamicType::Is(this->GetTypeId())) { - DynamicObject* obj = DynamicObject::FromVar(this); + DynamicObject* obj = DynamicObject::UnsafeFromVar(this); return obj->GetTypeHandler()->IsWritableDataOnlyDetectionBitSet() || (obj->HasObjectArray() && obj->GetObjectArrayOrFlagsAsArray()->IsWritableDataOnlyDetectionBitSet()); } @@ -380,6 +380,11 @@ namespace Js return false; } + BOOL RecyclableObject::InitPropertyInEval(PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) + { + return false; + } + BOOL RecyclableObject::InitPropertyScoped(PropertyId propertyId, Var value) { return false; @@ -410,10 +415,12 @@ namespace Js return true; } +#if ENABLE_FIXED_FIELDS BOOL RecyclableObject::IsFixedProperty(PropertyId propertyId) { return false; } +#endif PropertyQueryFlags RecyclableObject::HasItemQuery(uint32 index) { @@ -766,13 +773,6 @@ namespace Js return requestContext->GetLibrary()->GetUnknownDisplayString(); } - Var RecyclableObject::InvokePut(Arguments args) - { - // Handle x(y) = z. - // Native jscript object behavior: throw an error in all such cases. - JavascriptError::ThrowReferenceError(GetScriptContext(), JSERR_CantAsgCall); - } - BOOL RecyclableObject::GetRemoteTypeId(TypeId * typeId) { return FALSE; diff --git a/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.h b/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.h index 82343cb53aa..14e53d7a381 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.h +++ b/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.h @@ -72,7 +72,11 @@ namespace Js { static void SetCacheInfo(PropertyValueInfo* info, InlineCache *const inlineCache); static void SetCacheInfo(PropertyValueInfo* info, FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, const bool allowResizingPolymorphicInlineCache); static void SetCacheInfo(PropertyValueInfo* info, FunctionBody *const functionBody, PolymorphicInlineCache *const polymorphicInlineCache, const InlineCacheIndex inlineCacheIndex, const bool allowResizingPolymorphicInlineCache); - static void SetCacheInfo(PropertyValueInfo* info, PropertyString *const propertyString, PolymorphicInlineCache *const polymorphicInlineCache, bool allowResizing); + static void SetCacheInfo( + _Out_ PropertyValueInfo* info, + _In_opt_ PropertyString *const propertyString, + _In_ PolymorphicInlineCache *const polymorphicInlineCache, + bool allowResizing); static void ClearCacheInfo(PropertyValueInfo* info); InlineCache * GetInlineCache() const @@ -227,6 +231,7 @@ namespace Js { public: static bool Is(Var aValue); static RecyclableObject* FromVar(Var varValue); + static RecyclableObject* UnsafeFromVar(Var varValue); RecyclableObject(Type * type); #if DBG_EXTRAFIELD // This dtor should only be call when OOM occurs and RecyclableObject ctor has completed @@ -283,6 +288,7 @@ namespace Js { virtual BOOL SetProperty(JavascriptString* propertyNameString, Var value, PropertyOperationFlags flags, PropertyValueInfo* info); virtual BOOL SetInternalProperty(PropertyId internalPropertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info); virtual BOOL InitProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags = PropertyOperation_None, PropertyValueInfo* info = NULL); + virtual BOOL InitPropertyInEval(PropertyId propertyId, Var value, PropertyOperationFlags flags = PropertyOperation_None, PropertyValueInfo* info = NULL); virtual BOOL EnsureProperty(PropertyId propertyId); virtual BOOL EnsureNoRedeclProperty(PropertyId propertyId); virtual BOOL SetPropertyWithAttributes(PropertyId propertyId, Var value, PropertyAttributes attributes, PropertyValueInfo* info, PropertyOperationFlags flags = PropertyOperation_None, SideEffects possibleSideEffects = SideEffects_Any); @@ -290,7 +296,9 @@ namespace Js { virtual BOOL InitFuncScoped(PropertyId propertyId, Var value); virtual BOOL DeleteProperty(PropertyId propertyId, PropertyOperationFlags flags); virtual BOOL DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags); +#if ENABLE_FIXED_FIELDS virtual BOOL IsFixedProperty(PropertyId propertyId); +#endif virtual PropertyQueryFlags HasItemQuery(uint32 index); virtual BOOL HasOwnItem(uint32 index); virtual PropertyQueryFlags GetItemQuery(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext); @@ -310,7 +318,6 @@ namespace Js { virtual BOOL IsProtoImmutable() const { return false; } virtual BOOL PreventExtensions() { return false; }; // Sets [[Extensible]] flag of instance to false virtual void ThrowIfCannotDefineProperty(PropertyId propId, const PropertyDescriptor& descriptor); - virtual void ThrowIfCannotGetOwnPropertyDescriptor(PropertyId propId) {} virtual BOOL GetDefaultPropertyDescriptor(PropertyDescriptor& descriptor); virtual BOOL Seal() { return false; } // Seals the instance, no additional property can be added or deleted virtual BOOL Freeze() { return false; } // Freezes the instance, no additional property can be added or deleted or written @@ -357,8 +364,6 @@ namespace Js { virtual RecyclableObject* ToObject(ScriptContext * requestContext); virtual Var GetTypeOfString(ScriptContext* requestContext); - // don't need cross-site: only supported in HostDispatch. - virtual Var InvokePut(Arguments args); virtual BOOL GetRemoteTypeId(TypeId* typeId); // Only implemented by the HostDispatch object for cross-thread support diff --git a/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.inl b/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.inl index ca582ae2c30..68395ca0e44 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.inl +++ b/deps/chakrashim/core/lib/Runtime/Types/RecyclableObject.inl @@ -24,6 +24,15 @@ namespace Js #endif inline RecyclableObject* RecyclableObject::FromVar(const Js::Var aValue) + { + AssertMsg(AtomTag_Object == 0, "Ensure GC objects do not need to be marked"); + AssertMsg(Is(aValue), "Ensure instance is a RecyclableObject"); + AssertOrFailFastMsg(!TaggedNumber::Is(aValue), "Tagged value being used as RecyclableObject"); + + return reinterpret_cast(aValue); + } + + inline RecyclableObject* RecyclableObject::UnsafeFromVar(const Js::Var aValue) { AssertMsg(AtomTag_Object == 0, "Ensure GC objects do not need to be marked"); AssertMsg(Is(aValue), "Ensure instance is a RecyclableObject"); diff --git a/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryPropertyDescriptor.h b/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryPropertyDescriptor.h index 48df032b199..c9ecb270227 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryPropertyDescriptor.h +++ b/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryPropertyDescriptor.h @@ -11,23 +11,33 @@ namespace Js { public: SimpleDictionaryPropertyDescriptor() : - propertyIndex(NoSlots), Attributes(PropertyDynamicTypeDefaults), - preventFalseReference(true), isInitialized(false), isFixed(false), usedAsFixed(false) { } +#if ENABLE_FIXED_FIELDS + preventFalseReference(true), isInitialized(false), isFixed(false), usedAsFixed(false), +#endif + propertyIndex(NoSlots), Attributes(PropertyDynamicTypeDefaults) {} SimpleDictionaryPropertyDescriptor(TPropertyIndex inPropertyIndex) : - propertyIndex(inPropertyIndex), Attributes(PropertyDynamicTypeDefaults), - preventFalseReference(true), isInitialized(false), isFixed(false), usedAsFixed(false) { } +#if ENABLE_FIXED_FIELDS + preventFalseReference(true), isInitialized(false), isFixed(false), usedAsFixed(false), +#endif + propertyIndex(inPropertyIndex), Attributes(PropertyDynamicTypeDefaults) {} + SimpleDictionaryPropertyDescriptor(TPropertyIndex inPropertyIndex, PropertyAttributes attributes) : - propertyIndex(inPropertyIndex), Attributes(attributes), - preventFalseReference(true), isInitialized(false), isFixed(false), usedAsFixed(false) { } +#if ENABLE_FIXED_FIELDS + preventFalseReference(true), isInitialized(false), isFixed(false), usedAsFixed(false), +#endif + propertyIndex(inPropertyIndex), Attributes(attributes) {} + +#if ENABLE_FIXED_FIELDS // SimpleDictionaryPropertyDescriptor is allocated by a dictionary along with the PropertyRecord // so it can not allocate as leaf, tag the lower bit to prevent false reference bool preventFalseReference:1; bool isInitialized: 1; bool isFixed:1; bool usedAsFixed:1; +#endif PropertyAttributes Attributes; TPropertyIndex propertyIndex; @@ -37,6 +47,14 @@ namespace Js return (this->Attributes & PropertyLetConstGlobal) == 0; } + bool IsOrMayBecomeFixed() const + { +#if ENABLE_FIXED_FIELDS + return !isInitialized || isFixed; +#else + return false; +#endif + } private: static const TPropertyIndex NoSlots = PropertyIndexRanges::NoSlots; }; diff --git a/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryTypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryTypeHandler.cpp index 90bd8542cdd..5228c3e9589 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryTypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryTypeHandler.cpp @@ -57,14 +57,7 @@ namespace Js const PropertyRecord* TMapKey_ConvertKey(ScriptContext* scriptContext, JavascriptString* key) { PropertyRecord const * propertyRecord; - if (VirtualTableInfo::HasVirtualTable(key)) - { - propertyRecord = ((PropertyString*)key)->GetPropertyRecord(); - } - else - { - scriptContext->GetOrAddPropertyRecord(key, &propertyRecord); - } + scriptContext->GetOrAddPropertyRecord(key, &propertyRecord); return propertyRecord; } @@ -95,9 +88,10 @@ namespace Js const PropertyRecord* TMapKey_ConvertKey_TTD(ThreadContext* threadContext, JavascriptString* key) { PropertyRecord const * propertyRecord; - if(VirtualTableInfo::HasVirtualTable(key)) + PropertyString * propertyString = PropertyString::TryFromVar(key); + if (propertyString != nullptr) { - propertyRecord = ((PropertyString*)key)->GetPropertyRecord(); + propertyRecord = propertyString->GetPropertyRecord(); } else { @@ -110,7 +104,7 @@ namespace Js bool TPropertyKey_IsInternalPropertyId(JavascriptString* key) { // WARNING: This will return false for PropertyStrings that are actually InternalPropertyIds - Assert(!VirtualTableInfo::HasVirtualTable(key) || !IsInternalPropertyId(((PropertyString*)key)->GetPropertyRecord()->GetPropertyId())); + Assert(!PropertyString::Is(key) || !IsInternalPropertyId(((PropertyString*)key)->GetPropertyRecord()->GetPropertyId())); return false; } @@ -197,12 +191,11 @@ namespace Js { return propertyId; } - JsUtil::CharacterBuffer propertyStr(propertyKey->GetString(), propertyKey->GetLength()); - if (BuiltInPropertyRecords::valueOf.Equals(propertyStr)) + if (BuiltInPropertyRecords::valueOf.Equals(propertyKey)) { return PropertyIds::valueOf; } - if (BuiltInPropertyRecords::toString.Equals(propertyStr)) + if (BuiltInPropertyRecords::toString.Equals(propertyKey)) { return PropertyIds::toString; } @@ -325,27 +318,6 @@ namespace Js propertyMap = RecyclerNew(recycler, SimplePropertyDescriptorMap, recycler, propertyCapacity); } - template - void SimpleDictionaryTypeHandlerBase::DoShareTypeHandler(ScriptContext* scriptContext) - { - Assert((GetFlags() & (IsLockedFlag | MayBecomeSharedFlag | IsSharedFlag)) == (IsLockedFlag | MayBecomeSharedFlag)); - Assert(HasSingletonInstanceOnlyIfNeeded()); - - // If this handler is becoming shared we need to remove the singleton instance (so that it can be collected - // if no longer referenced by anything else) and invalidate any fixed fields. - - // The propertyMap dictionary is guaranteed to have contiguous entries because we never remove entries from it. - for (int index = 0; index < propertyMap->Count(); index++) - { - TMapKey propertyKey = propertyMap->GetKeyAt(index); - SimpleDictionaryPropertyDescriptor* const descriptor = propertyMap->GetReferenceAt(index); - descriptor->isInitialized = true; - InvalidateFixedField(propertyKey, descriptor, scriptContext); - } - - this->singletonInstance = nullptr; - } - template template DynamicType* SimpleDictionaryTypeHandlerBase::InternalCreateTypeForNewScObject(ScriptContext* scriptContext, DynamicType* type, const Js::PropertyIdArray *propIds, bool shareType) @@ -432,6 +404,7 @@ namespace Js // We expect the new type handler to start off marked as having only writable data properties. Assert(newTypeHandler->GetHasOnlyWritableDataProperties()); +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS DynamicType* oldType = instance->GetDynamicType(); RecyclerWeakReference* oldSingletonInstance = GetSingletonInstance(); @@ -470,6 +443,7 @@ namespace Js // invalidate any used fixed fields, and we must continue tracking them on the new type handler. If the type isn't locked, we may not change the // type of the instance, and we must also track the used fixed fields on the new handler. bool transferUsedAsFixed = isGlobalObject || !isTypeLocked || ((this->GetFlags() & IsPrototypeFlag) != 0 || (isOrMayBecomeShared && !IsolatePrototypes())) || PHASE_FORCE1(Js::FixDataPropsPhase); +#endif SimpleDictionaryPropertyDescriptor descriptor; TMapKey propertyKey; @@ -485,14 +459,20 @@ namespace Js } Assert(newTypeHandler->nextPropertyIndex == descriptor.propertyIndex); +#if ENABLE_FIXED_FIELDS Assert(!GetIsShared() || !descriptor.isFixed); newTypeHandler->Add(TMapKey_ConvertKey(scriptContext, propertyKey), descriptor.Attributes, descriptor.isInitialized, descriptor.isFixed, transferUsedAsFixed && descriptor.usedAsFixed, scriptContext); +#else + newTypeHandler->Add(TMapKey_ConvertKey(scriptContext, propertyKey), descriptor.Attributes, true, false, false, scriptContext); +#endif } newTypeHandler->nextPropertyIndex = static_cast(nextPropertyIndex); newTypeHandler->SetNumDeletedProperties(numDeletedProperties); +#if ENABLE_FIXED_FIELDS ClearSingletonInstance(); +#endif AssertMsg((newTypeHandler->GetFlags() & IsPrototypeFlag) == 0, "Why did we create a brand new type handler with a prototype flag set?"); newTypeHandler->SetFlags(IsPrototypeFlag, this->GetFlags()); @@ -502,6 +482,7 @@ namespace Js Assert(newTypeHandler->GetIsInlineSlotCapacityLocked()); newTypeHandler->SetPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection, this->GetPropertyTypes()); newTypeHandler->SetInstanceTypeHandler(instance); +#if ENABLE_FIXED_FIELDS // We assumed that we don't need to transfer used as fixed bits unless we are a prototype, which is only valid if we also changed the type. Assert(transferUsedAsFixed || (instance->GetType() != oldType && oldType->GetTypeId() != TypeIds_GlobalObject)); Assert(!newTypeHandler->HasSingletonInstance() || !instance->HasSharedType()); @@ -509,7 +490,7 @@ namespace Js #ifdef ENABLE_DEBUG_CONFIG_OPTIONS TraceFixedFieldsAfterTypeHandlerChange(instance, this, newTypeHandler, oldType, oldSingletonInstance); #endif - +#endif return newTypeHandler; } @@ -643,7 +624,7 @@ namespace Js PropertyValueInfo::SetCacheInfo(info, propertyString, propertyString->GetLdElemInlineCache(), false); SetPropertyValueInfo(info, instance, descriptor.propertyIndex, descriptor.Attributes); - if (!descriptor.isInitialized || descriptor.isFixed) + if (descriptor.IsOrMayBecomeFixed()) { PropertyValueInfo::DisableStoreFieldCache(info); } @@ -888,6 +869,7 @@ namespace Js return this->GetPropertyIndex_Internal(propertyRecord); } +#if ENABLE_NATIVE_CODEGEN template bool SimpleDictionaryTypeHandlerBase::GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) { @@ -960,7 +942,7 @@ namespace Js return false; } - if (entry->mustBeWritable && (!(descriptor->Attributes & PropertyWritable) || !descriptor->isInitialized || descriptor->isFixed)) + if (entry->mustBeWritable && (!(descriptor->Attributes & PropertyWritable) || descriptor->IsOrMayBecomeFixed())) { return false; } @@ -975,6 +957,7 @@ namespace Js return true; } +#endif // The following template specialization is required in order to provide an implementation of // Add for the linker to find that TypePathHandler uses. The following definition should have sufficed. @@ -1045,9 +1028,11 @@ namespace Js Assert(!TMapKey_IsJavascriptString()); hasNamelessPropertyId = true; } +#if ENABLE_FIXED_FIELDS descriptor.isInitialized = isInitialized; descriptor.isFixed = isFixed; descriptor.usedAsFixed = usedAsFixed; +#endif propertyMap->Add(TMapKey_ConvertKey(scriptContext, propertyKey), descriptor); } @@ -1204,7 +1189,7 @@ namespace Js { *value = instance->GetSlot(descriptor->propertyIndex); SetPropertyValueInfo(info, instance, descriptor->propertyIndex, descriptor->Attributes); - if (!descriptor->isInitialized || descriptor->isFixed) + if (descriptor->IsOrMayBecomeFixed()) { PropertyValueInfo::DisableStoreFieldCache(info); } @@ -1406,6 +1391,7 @@ namespace Js } } +#if ENABLE_FIXED_FIELDS DynamicObject* localSingletonInstance = this->singletonInstance != nullptr ? this->singletonInstance->Get() : nullptr; Assert(this->singletonInstance == nullptr || localSingletonInstance == instance); if (!descriptor->isInitialized) @@ -1431,10 +1417,11 @@ namespace Js { InvalidateFixedField(TMapKey_OptionalConvertPropertyIdToPropertyRecord(scriptContext, propertyKey), descriptor, instance->GetScriptContext()); } +#endif SetSlotUnchecked(instance, descriptor->propertyIndex, value); - if (descriptor->isInitialized && !descriptor->isFixed) + if (!descriptor->IsOrMayBecomeFixed()) { SetPropertyValueInfo(info, instance, descriptor->propertyIndex, descriptor->Attributes); } @@ -1635,9 +1622,10 @@ namespace Js } } +#if ENABLE_FIXED_FIELDS Assert(this->singletonInstance == nullptr || instance == this->singletonInstance->Get()); InvalidateFixedField(propertyNameString, descriptor, instance->GetScriptContext()); - +#endif if (this->GetFlags() & IsPrototypeFlag) { scriptContext->InvalidateProtoCaches(scriptContext->GetOrAddPropertyIdTracked(propertyNameString->GetSz(), propertyNameString->GetLength())); @@ -1766,8 +1754,10 @@ namespace Js } } +#if ENABLE_FIXED_FIELDS Assert(this->singletonInstance == nullptr || instance == this->singletonInstance->Get()); InvalidateFixedField(propertyRecord, descriptor, instance->GetScriptContext()); +#endif if (this->GetFlags() & IsPrototypeFlag) { @@ -1807,24 +1797,6 @@ namespace Js return true; } - template - BOOL SimpleDictionaryTypeHandlerBase::IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) - { - ScriptContext* scriptContext = instance->GetScriptContext(); - SimpleDictionaryPropertyDescriptor* descriptor; - Assert(propertyId != Constants::NoProperty); - PropertyRecord const* propertyRecord = scriptContext->GetPropertyName(propertyId); - if (propertyMap->TryGetReference(propertyRecord, &descriptor)) - { - return descriptor->isFixed; - } - else - { - AssertMsg(false, "Asking about a property this type handler doesn't know about?"); - return false; - } - } - template BOOL SimpleDictionaryTypeHandlerBase::IsEnumerable(DynamicObject* instance, PropertyId propertyId) { @@ -2465,6 +2437,7 @@ namespace Js if (descriptor->propertyIndex != NoSlots) { +#if ENABLE_FIXED_FIELDS DynamicObject* localSingletonInstance = this->singletonInstance != nullptr ? this->singletonInstance->Get() : nullptr; Assert(this->singletonInstance == nullptr || localSingletonInstance == instance); if (!descriptor->isInitialized) @@ -2488,10 +2461,10 @@ namespace Js { InvalidateFixedField(propertyRecord, descriptor, instance->GetScriptContext()); } - +#endif SetSlotUnchecked(instance, descriptor->propertyIndex, value); - if (descriptor->isInitialized && !descriptor->isFixed) + if (!descriptor->IsOrMayBecomeFixed()) { SetPropertyValueInfo(info, instance, descriptor->propertyIndex, descriptor->Attributes); } @@ -2749,11 +2722,15 @@ namespace Js Assert((flags & PropertyOperation_SpecialValue) != 0 || value != nullptr); Assert(!typeHandler->GetIsShared()); Assert(typeHandler->singletonInstance == nullptr || typeHandler->singletonInstance->Get() == instance); +#if ENABLE_FIXED_FIELDS bool markAsInitialized = ((flags & PropertyOperation_PreInit) == 0); bool markAsFixed = markAsInitialized && !TPropertyKey_IsInternalPropertyId(propertyKey) && (flags & (PropertyOperation_NonFixedValue | PropertyOperation_SpecialValue)) == 0 && typeHandler->singletonInstance != nullptr && typeHandler->singletonInstance->Get() == instance && (JavascriptFunction::Is(value) ? ShouldFixMethodProperties() : (ShouldFixDataProperties() && CheckHeuristicsForFixedDataProps(instance, propertyKey, value))); - +#else + bool markAsInitialized = true; + bool markAsFixed = false; +#endif TPropertyIndex index; if (typeHandler->isUnordered && typeHandler->AsUnordered()->TryReuseDeletedPropertyIndex(instance, &index)) @@ -2813,7 +2790,7 @@ namespace Js // Before using for other purposes, make sure the assumptions made here make sense in the new context. In particular, // the invalidateFixedFields == false is only correct if a) the object is known not to have any, or b) the type of the // object has changed and/or property guards have already been invalidated through some other means. - int propertyCount = this->propertyMap->Count(); + if (IsNotExtensibleSupported) { // The Var for window is reused across navigation. we shouldn't preserve the IsExtensibleFlag when we don't keep @@ -2822,6 +2799,8 @@ namespace Js ChangeFlags(IsExtensibleFlag | IsSealedOnceFlag | IsFrozenOnceFlag, IsExtensibleFlag); } +#if ENABLE_FIXED_FIELDS + int propertyCount = this->propertyMap->Count(); if (invalidateFixedFields) { Js::ScriptContext* scriptContext = instance->GetScriptContext(); @@ -2832,6 +2811,7 @@ namespace Js InvalidateFixedField(propertyRecord, descriptor, scriptContext); } } +#endif Js::RecyclableObject* undefined = instance->GetLibrary()->GetUndefined(); int slotCount = this->nextPropertyIndex; @@ -2848,6 +2828,7 @@ namespace Js // Before using for other purposes, make sure the assumptions made here make sense in the new context. In particular, // the invalidateFixedFields == false is only correct if a) the object is known not to have any, or b) the type of the // object has changed and/or property guards have already been invalidated through some other means. +#if ENABLE_FIXED_FIELDS int propertyCount = this->propertyMap->Count(); if (invalidateFixedFields) @@ -2860,6 +2841,7 @@ namespace Js InvalidateFixedField(propertyRecord, descriptor, scriptContext); } } +#endif int slotCount = this->nextPropertyIndex; for (int slotIndex = 0; slotIndex < slotCount; slotIndex++) @@ -2896,6 +2878,7 @@ namespace Js template void SimpleDictionaryTypeHandlerBase::SetIsPrototype(DynamicObject* instance, bool hasNewType) { +#if ENABLE_FIXED_FIELDS const auto setFixedFlags = [instance](TMapKey propertyKey, SimpleDictionaryPropertyDescriptor* const descriptor, bool hasNewType) { if (TPropertyKey_IsInternalPropertyId(propertyKey)) @@ -2942,6 +2925,7 @@ namespace Js }; bool isShared = GetIsShared(); +#endif if (GetIsOrMayBecomeShared() && IsolatePrototypes()) { Type* oldType = instance->GetType(); @@ -2950,10 +2934,12 @@ namespace Js else { +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS DynamicType* oldType = instance->GetDynamicType(); RecyclerWeakReference* oldSingletonInstance = GetSingletonInstance(); TraceFixedFieldsBeforeSetIsProto(instance, this, oldType, oldSingletonInstance); +#endif #endif if (!hasNewType && ChangeTypeOnProto()) @@ -2967,6 +2953,7 @@ namespace Js hasNewType = true; } +#if ENABLE_FIXED_FIELDS if (!isShared) { Assert(this->singletonInstance == nullptr || this->singletonInstance->Get() == instance); @@ -2989,71 +2976,119 @@ namespace Js } } } +#endif SetFlags(IsPrototypeFlag); +#if ENABLE_FIXED_FIELDS #ifdef ENABLE_DEBUG_CONFIG_OPTIONS TraceFixedFieldsAfterSetIsProto(instance, this, this, oldType, oldSingletonInstance); #endif - +#endif } } +#if DBG template - bool SimpleDictionaryTypeHandlerBase::HasSingletonInstance() const + bool SimpleDictionaryTypeHandlerBase::CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) { - return this->singletonInstance != nullptr; + ScriptContext* scriptContext = instance->GetScriptContext(); + SimpleDictionaryPropertyDescriptor* descriptor; + + // We pass Constants::NoProperty for ActivationObjects for functions with same named formals. + if (propertyId == Constants::NoProperty) + { + return true; + } + + PropertyRecord const* propertyRecord = scriptContext->GetPropertyName(propertyId); + if (propertyMap->TryGetReference(propertyRecord, &descriptor)) + { + if (allowLetConst && (descriptor->Attributes & PropertyLetConstGlobal)) + { + return true; + } + else + { + AssertMsg(!(descriptor->Attributes & PropertyLetConstGlobal), "Asking about a global property this type handler doesn't have?"); + return !descriptor->IsOrMayBecomeFixed(); + } + } + else + { + AssertMsg(false, "Asking about a property this type handler doesn't know about?"); + return false; + } } template - bool SimpleDictionaryTypeHandlerBase::TryUseFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext) + bool SimpleDictionaryTypeHandlerBase::IsLetConstGlobal(DynamicObject* instance, PropertyId propertyId) { - bool result = TryGetFixedProperty(propertyRecord, pProperty, propertyType, requestContext); - TraceUseFixedProperty(propertyRecord, pProperty, result, _u("SimpleDictionaryTypeHandler"), requestContext); - return result; + SimpleDictionaryPropertyDescriptor* descriptor; + PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); + if (propertyMap->TryGetReference(propertyRecord, &descriptor) && (descriptor->Attributes & PropertyLetConstGlobal)) + { + return true; + } + return false; } +#endif template - bool SimpleDictionaryTypeHandlerBase::TryUseFixedAccessor(PropertyRecord const * propertyRecord, Var * pAccessor, FixedPropertyKind propertyType, bool getter, ScriptContext * requestContext) + bool SimpleDictionaryTypeHandlerBase::NextLetConstGlobal(int& index, RootObjectBase* instance, const PropertyRecord** propertyRecord, Var* value, bool* isConst) { - if (PHASE_VERBOSE_TRACE1(Js::FixedMethodsPhase) || PHASE_VERBOSE_TESTTRACE1(Js::FixedMethodsPhase) || - PHASE_VERBOSE_TRACE1(Js::UseFixedDataPropsPhase) || PHASE_VERBOSE_TESTTRACE1(Js::UseFixedDataPropsPhase)) + ScriptContext* scriptContext = instance->GetScriptContext(); + for (; index < propertyMap->Count(); index++) { - Output::Print(_u("FixedFields: attempt to use fixed accessor %s from SimpleDictionaryTypeHandler returned false.\n"), propertyRecord->GetBuffer()); - if (this->HasSingletonInstance() && this->GetSingletonInstance()->Get()->GetScriptContext() != requestContext) + SimpleDictionaryPropertyDescriptor descriptor = propertyMap->GetValueAt(index); + + if (descriptor.Attributes & PropertyLetConstGlobal) { - Output::Print(_u("FixedFields: Cross Site Script Context is used for property %s. \n"), propertyRecord->GetBuffer()); + *propertyRecord = TMapKey_ConvertKey(scriptContext, propertyMap->GetKeyAt(index)); + *value = instance->GetSlot(descriptor.propertyIndex); + *isConst = (descriptor.Attributes & PropertyConst) != 0; + + index += 1; + + return true; } - Output::Flush(); } + return false; } -#if DBG +#if ENABLE_FIXED_FIELDS template - bool SimpleDictionaryTypeHandlerBase::CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) + void SimpleDictionaryTypeHandlerBase::DoShareTypeHandler(ScriptContext* scriptContext) { - ScriptContext* scriptContext = instance->GetScriptContext(); - SimpleDictionaryPropertyDescriptor* descriptor; + Assert((GetFlags() & (IsLockedFlag | MayBecomeSharedFlag | IsSharedFlag)) == (IsLockedFlag | MayBecomeSharedFlag)); + Assert(HasSingletonInstanceOnlyIfNeeded()); - // We pass Constants::NoProperty for ActivationObjects for functions with same named formals. - if (propertyId == Constants::NoProperty) + // If this handler is becoming shared we need to remove the singleton instance (so that it can be collected + // if no longer referenced by anything else) and invalidate any fixed fields. + + // The propertyMap dictionary is guaranteed to have contiguous entries because we never remove entries from it. + for (int index = 0; index < propertyMap->Count(); index++) { - return true; + TMapKey propertyKey = propertyMap->GetKeyAt(index); + SimpleDictionaryPropertyDescriptor* const descriptor = propertyMap->GetReferenceAt(index); + descriptor->isInitialized = true; + InvalidateFixedField(propertyKey, descriptor, scriptContext); } + this->singletonInstance = nullptr; + } + + template + BOOL SimpleDictionaryTypeHandlerBase::IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) + { + ScriptContext* scriptContext = instance->GetScriptContext(); + SimpleDictionaryPropertyDescriptor* descriptor; + Assert(propertyId != Constants::NoProperty); PropertyRecord const* propertyRecord = scriptContext->GetPropertyName(propertyId); if (propertyMap->TryGetReference(propertyRecord, &descriptor)) { - if (allowLetConst && (descriptor->Attributes & PropertyLetConstGlobal)) - { - return true; - } - else - { - AssertMsg(!(descriptor->Attributes & PropertyLetConstGlobal), "Asking about a global property this type handler doesn't have?"); - return descriptor->isInitialized && !descriptor->isFixed; - } + return descriptor->isFixed; } else { @@ -3062,6 +3097,37 @@ namespace Js } } + template + bool SimpleDictionaryTypeHandlerBase::HasSingletonInstance() const + { + return this->singletonInstance != nullptr; + } + + template + bool SimpleDictionaryTypeHandlerBase::TryUseFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext) + { + bool result = TryGetFixedProperty(propertyRecord, pProperty, propertyType, requestContext); + TraceUseFixedProperty(propertyRecord, pProperty, result, _u("SimpleDictionaryTypeHandler"), requestContext); + return result; + } + + template + bool SimpleDictionaryTypeHandlerBase::TryUseFixedAccessor(PropertyRecord const * propertyRecord, Var * pAccessor, FixedPropertyKind propertyType, bool getter, ScriptContext * requestContext) + { + if (PHASE_VERBOSE_TRACE1(Js::FixedMethodsPhase) || PHASE_VERBOSE_TESTTRACE1(Js::FixedMethodsPhase) || + PHASE_VERBOSE_TRACE1(Js::UseFixedDataPropsPhase) || PHASE_VERBOSE_TESTTRACE1(Js::UseFixedDataPropsPhase)) + { + Output::Print(_u("FixedFields: attempt to use fixed accessor %s from SimpleDictionaryTypeHandler returned false.\n"), propertyRecord->GetBuffer()); + if (this->HasSingletonInstance() && this->GetSingletonInstance()->Get()->GetScriptContext() != requestContext) + { + Output::Print(_u("FixedFields: Cross Site Script Context is used for property %s. \n"), propertyRecord->GetBuffer()); + } + Output::Flush(); + } + return false; + } + +#if DBG template bool SimpleDictionaryTypeHandlerBase::CheckFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, ScriptContext * requestContext) { @@ -3141,43 +3207,6 @@ namespace Js } } -#if DBG - template - bool SimpleDictionaryTypeHandlerBase::IsLetConstGlobal(DynamicObject* instance, PropertyId propertyId) - { - SimpleDictionaryPropertyDescriptor* descriptor; - PropertyRecord const* propertyRecord = instance->GetScriptContext()->GetPropertyName(propertyId); - if (propertyMap->TryGetReference(propertyRecord, &descriptor) && (descriptor->Attributes & PropertyLetConstGlobal)) - { - return true; - } - return false; - } -#endif - - template - bool SimpleDictionaryTypeHandlerBase::NextLetConstGlobal(int& index, RootObjectBase* instance, const PropertyRecord** propertyRecord, Var* value, bool* isConst) - { - ScriptContext* scriptContext = instance->GetScriptContext(); - for (; index < propertyMap->Count(); index++) - { - SimpleDictionaryPropertyDescriptor descriptor = propertyMap->GetValueAt(index); - - if (descriptor.Attributes & PropertyLetConstGlobal) - { - *propertyRecord = TMapKey_ConvertKey(scriptContext, propertyMap->GetKeyAt(index)); - *value = instance->GetSlot(descriptor.propertyIndex); - *isConst = (descriptor.Attributes & PropertyConst) != 0; - - index += 1; - - return true; - } - } - - return false; - } - #ifdef ENABLE_DEBUG_CONFIG_OPTIONS template void SimpleDictionaryTypeHandlerBase::DumpFixedFields() const { @@ -3302,6 +3331,7 @@ namespace Js } } #endif +#endif // ENABLE_FIXED_FIELDS template typename SimpleDictionaryTypeHandlerBase::BigSimpleDictionaryTypeHandler* SimpleDictionaryTypeHandlerBase::ConvertToBigSimpleDictionaryTypeHandler(DynamicObject* instance) @@ -3332,7 +3362,11 @@ namespace Js // maybe we need to template this with allowLetGlobalConst as well // +#if ENABLE_FIXED_FIELDS if(DynamicTypeHandler::ShouldMarkPropertyId_TTD(pid) & descriptor.isInitialized & !(descriptor.Attributes & PropertyDeleted)) +#else + if (DynamicTypeHandler::ShouldMarkPropertyId_TTD(pid) & !(descriptor.Attributes & PropertyDeleted)) +#endif { Js::Var value = obj->GetSlot(descriptor.propertyIndex); @@ -3357,7 +3391,11 @@ namespace Js TMapKey key = iter.CurrentKey(); const PropertyRecord* pRecord = TMapKey_ConvertKey_TTD(threadContext, key); PropertyId pid = pRecord->GetPropertyId(); +#if ENABLE_FIXED_FIELDS TTD::NSSnapType::SnapEntryDataKindTag tag = descriptor.isInitialized ? TTD::NSSnapType::SnapEntryDataKindTag::Data : TTD::NSSnapType::SnapEntryDataKindTag::Uninitialized; +#else + TTD::NSSnapType::SnapEntryDataKindTag tag = TTD::NSSnapType::SnapEntryDataKindTag::Data; +#endif TTD::NSSnapType::ExtractSnapPropertyEntryInfo(entryInfo + index, pid, descriptor.Attributes, tag); } @@ -3388,6 +3426,14 @@ namespace Js } #endif +#if DBG_DUMP + template + void SimpleDictionaryTypeHandlerBase::Dump(unsigned indent) const + { + Output::Print(_u("%*sSimpleDictionaryTypeHandlerBase (0x%p): Dump unimplemented\n"), indent, _u(""), this); + } +#endif + template <> BigSimpleDictionaryTypeHandler* SimpleDictionaryTypeHandlerBase::ConvertToBigSimpleDictionaryTypeHandler(DynamicObject* instance) { diff --git a/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryTypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryTypeHandler.h index fad26156aab..b080ea965b7 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryTypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/SimpleDictionaryTypeHandler.h @@ -108,16 +108,17 @@ namespace Js virtual BOOL IsLockable() const override { return true; } virtual BOOL IsSharable() const override { return true; } - virtual void DoShareTypeHandler(ScriptContext* scriptContext) override; virtual int GetPropertyCount() override; virtual PropertyId GetPropertyId(ScriptContext* scriptContext, PropertyIndex index) override; virtual PropertyId GetPropertyId(ScriptContext* scriptContext, BigPropertyIndex index) override; virtual PropertyIndex GetPropertyIndex(const PropertyRecord* propertyRecord) override; +#if ENABLE_NATIVE_CODEGEN virtual bool GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; +#endif virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override; @@ -150,7 +151,6 @@ namespace Js #endif virtual bool NextLetConstGlobal(int& index, RootObjectBase* instance, const PropertyRecord** propertyRecord, Var* value, bool* isConst) override; - virtual BOOL IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) override; virtual BOOL IsEnumerable(DynamicObject* instance, PropertyId propertyId) override; virtual BOOL IsWritable(DynamicObject* instance, PropertyId propertyId) override; virtual BOOL IsConfigurable(DynamicObject* instance, PropertyId propertyId) override; @@ -175,14 +175,17 @@ namespace Js #if DBG virtual bool SupportsPrototypeInstances() const { return true; } + virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) override; #endif +#if ENABLE_FIXED_FIELDS + virtual void DoShareTypeHandler(ScriptContext* scriptContext) override; + virtual BOOL IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) override; virtual bool HasSingletonInstance() const override sealed; virtual bool TryUseFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext) override; virtual bool TryUseFixedAccessor(PropertyRecord const * propertyRecord, Var * pAccessor, FixedPropertyKind propertyType, bool getter, ScriptContext * requestContext) override; #if DBG - virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) override; virtual bool CheckFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, ScriptContext * requestContext) override; virtual bool HasAnyFixedProperties() const override; #endif @@ -202,14 +205,13 @@ namespace Js DynamicType* oldType, RecyclerWeakReference* oldSingletonInstanceBefore); #endif - private: - typedef SimpleDictionaryTypeHandlerBase BigSimpleDictionaryTypeHandler; + private: - template - bool IsObjTypeSpecEquivalentImpl(const Type* type, const EquivalentPropertyEntry *entry); template bool TryGetFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext); + template + void InvalidateFixedField(const TPropertyKey propertyKey, SimpleDictionaryPropertyDescriptor* descriptor, ScriptContext* scriptContext); public: virtual RecyclerWeakReference* GetSingletonInstance() const sealed { Assert(HasSingletonInstanceOnlyIfNeeded()); return this->singletonInstance; } @@ -232,12 +234,15 @@ namespace Js return AreSingletonInstancesNeeded() || this->singletonInstance == nullptr; } #endif - +#endif private: - void SetIsPrototype(DynamicObject* instance, bool hasNewType); - template - void InvalidateFixedField(const TPropertyKey propertyKey, SimpleDictionaryPropertyDescriptor* descriptor, ScriptContext* scriptContext); + typedef SimpleDictionaryTypeHandlerBase BigSimpleDictionaryTypeHandler; +#if ENABLE_NATIVE_CODEGEN + template + bool IsObjTypeSpecEquivalentImpl(const Type* type, const EquivalentPropertyEntry *entry); +#endif + void SetIsPrototype(DynamicObject* instance, bool hasNewType); bool SupportsSwitchingToUnordered(const ScriptContext *const scriptContext) const; SimpleDictionaryUnorderedTypeHandler *AsUnordered(); void SetNumDeletedProperties(const byte n); @@ -309,6 +314,11 @@ namespace Js virtual Js::BigPropertyIndex GetPropertyIndex_EnumerateTTD(const Js::PropertyRecord* pRecord) override; #endif + +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override; +#endif }; } diff --git a/deps/chakrashim/core/lib/Runtime/Types/SimpleTypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/SimpleTypeHandler.cpp index a3ac35208cd..b577006a974 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/SimpleTypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/SimpleTypeHandler.cpp @@ -91,11 +91,12 @@ namespace Js ScriptContext* scriptContext = instance->GetScriptContext(); Recycler* recycler = scriptContext->GetRecycler(); -#if DBG +#if ENABLE_FIXED_FIELDS && DBG DynamicType* oldType = instance->GetDynamicType(); #endif T* newTypeHandler = RecyclerNew(recycler, T, recycler, SimpleTypeHandler::GetSlotCapacity(), GetInlineSlotCapacity(), GetOffsetOfInlineSlots()); +#if ENABLE_FIXED_FIELDS Assert(HasSingletonInstanceOnlyIfNeeded()); bool const hasSingletonInstance = newTypeHandler->SetSingletonInstanceIfNeeded(instance); @@ -103,13 +104,18 @@ namespace Js // guarantees that any existing fast path field stores (which could quietly overwrite a fixed field // on this instance) will be invalidated. It is safe to mark all fields as fixed. bool const allowFixedFields = hasSingletonInstance && instance->HasLockedType(); +#endif for (int i = 0; i < propertyCount; i++) { Var value = instance->GetSlot(i); Assert(value != nullptr || IsInternalPropertyId(descriptors[i].Id->GetPropertyId())); +#if ENABLE_FIXED_FIELDS bool markAsFixed = allowFixedFields && !IsInternalPropertyId(descriptors[i].Id->GetPropertyId()) && (JavascriptFunction::Is(value) ? ShouldFixMethodProperties() : false); +#else + bool markAsFixed = false; +#endif newTypeHandler->Add(PointerValue(descriptors[i].Id), descriptors[i].Attributes, true, markAsFixed, false, scriptContext); } @@ -121,7 +127,7 @@ namespace Js newTypeHandler->SetPropertyTypes(PropertyTypesWritableDataOnly | PropertyTypesWritableDataOnlyDetection, this->GetPropertyTypes()); newTypeHandler->SetInstanceTypeHandler(instance); -#if DBG +#if ENABLE_FIXED_FIELDS && DBG // If we marked fields as fixed we had better forced a type transition. Assert(!allowFixedFields || instance->GetDynamicType() != oldType); #endif @@ -252,6 +258,7 @@ namespace Js return Constants::NoSlot; } +#if ENABLE_NATIVE_CODEGEN template bool SimpleTypeHandler::GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) { @@ -326,7 +333,7 @@ namespace Js return true; } - +#endif template BOOL SimpleTypeHandler::HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl) @@ -1131,6 +1138,14 @@ namespace Js #endif +#if DBG_DUMP + template + void SimpleTypeHandler::Dump(unsigned indent) const + { + Output::Print(_u("%*sSimpleTypeHandler<%u> (0x%p): Dump unimplemented\n"), indent, _u(""), size, this); + } +#endif + template class SimpleTypeHandler<1>; template class SimpleTypeHandler<2>; template class SimpleTypeHandler<6>; diff --git a/deps/chakrashim/core/lib/Runtime/Types/SimpleTypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/SimpleTypeHandler.h index f08dfe8fcb4..7631bcfc004 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/SimpleTypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/SimpleTypeHandler.h @@ -36,9 +36,11 @@ namespace Js virtual BOOL FindNextProperty(ScriptContext* scriptContext, PropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info) override; virtual PropertyIndex GetPropertyIndex(PropertyRecord const* propertyRecord) override; +#if ENABLE_NATIVE_CODEGEN virtual bool GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const TypeEquivalenceRecord& record, uint& failedPropertyIndex) override; virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) override; +#endif virtual BOOL HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl = nullptr) override; virtual BOOL HasProperty(DynamicObject* instance, JavascriptString* propertyNameString) override; virtual BOOL GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override; @@ -70,14 +72,13 @@ namespace Js #if DBG virtual bool SupportsPrototypeInstances() const { return !ChangeTypeOnProto() && !(GetIsOrMayBecomeShared() && IsolatePrototypes()); } virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) override; -#endif - -#if DBG +#if ENABLE_FIXED_FIELDS bool HasSingletonInstanceOnlyIfNeeded() const { // If we add support for fixed fields to this type handler we will have to update this implementation. return true; } +#endif #endif private: @@ -103,6 +104,11 @@ namespace Js virtual Js::BigPropertyIndex GetPropertyIndex_EnumerateTTD(const Js::PropertyRecord* pRecord) override; #endif + +#if DBG_DUMP + public: + void Dump(unsigned indent = 0) const override; +#endif }; typedef SimpleTypeHandler<1> SimpleTypeHandlerSize1; diff --git a/deps/chakrashim/core/lib/Runtime/Types/SpreadArgument.cpp b/deps/chakrashim/core/lib/Runtime/Types/SpreadArgument.cpp index 539cfe2dccb..39e10212efc 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/SpreadArgument.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/SpreadArgument.cpp @@ -10,7 +10,14 @@ namespace Js { return JavascriptOperators::GetTypeId(aValue) == TypeIds_SpreadArgument; } + SpreadArgument* SpreadArgument::FromVar(Var aValue) + { + AssertOrFailFast(SpreadArgument::Is(aValue)); + return static_cast(aValue); + } + + SpreadArgument* SpreadArgument::UnsafeFromVar(Var aValue) { Assert(SpreadArgument::Is(aValue)); return static_cast(aValue); @@ -51,7 +58,7 @@ namespace Js } else if (TypedArrayBase::Is(iterator)) { - TypedArrayBase *typedArray = TypedArrayBase::FromVar(iterator); + TypedArrayBase *typedArray = TypedArrayBase::UnsafeFromVar(iterator); if (typedArray->IsDetachedBuffer()) { diff --git a/deps/chakrashim/core/lib/Runtime/Types/SpreadArgument.h b/deps/chakrashim/core/lib/Runtime/Types/SpreadArgument.h index b48cc290f68..9e7f976509f 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/SpreadArgument.h +++ b/deps/chakrashim/core/lib/Runtime/Types/SpreadArgument.h @@ -20,6 +20,7 @@ namespace Js public: static bool Is(Var aValue); static SpreadArgument* FromVar(Var value); + static SpreadArgument* UnsafeFromVar(Var value); SpreadArgument(Var iterator, bool useDirectCall, DynamicType * type); const Var* GetArgumentSpread() const { return iteratorIndices ? iteratorIndices->GetBuffer() : nullptr; } uint GetArgumentSpreadCount() const { return iteratorIndices ? iteratorIndices->Count() : 0; } @@ -42,7 +43,9 @@ namespace Js virtual BOOL SetInternalProperty(PropertyId internalPropertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override { AssertAndFailFast(); return FALSE; }; virtual BOOL InitProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags = PropertyOperation_None, PropertyValueInfo* info = NULL) override { AssertAndFailFast(); return FALSE; }; virtual BOOL SetPropertyWithAttributes(PropertyId propertyId, Var value, PropertyAttributes attributes, PropertyValueInfo* info, PropertyOperationFlags flags = PropertyOperation_None, SideEffects possibleSideEffects = SideEffects_Any) override { AssertAndFailFast(); return FALSE; }; +#if ENABLE_FIXED_FIELDS virtual BOOL IsFixedProperty(PropertyId propertyId) override { AssertAndFailFast(); return FALSE; }; +#endif virtual PropertyQueryFlags HasItemQuery(uint32 index) override { AssertAndFailFast(); return PropertyQueryFlags::Property_NotFound; }; virtual BOOL HasOwnItem(uint32 index) override { AssertAndFailFast(); return FALSE; }; virtual PropertyQueryFlags GetItemQuery(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override { AssertAndFailFast(); return PropertyQueryFlags::Property_NotFound; }; diff --git a/deps/chakrashim/core/lib/Runtime/Types/Type.cpp b/deps/chakrashim/core/lib/Runtime/Types/Type.cpp index 69ea852ef0e..28b2fcc356a 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/Type.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/Type.cpp @@ -189,7 +189,7 @@ namespace Js sType->TypeHandlerInfo = optHandler; sType->HasNoEnumerableProperties = false; - if(Js::DynamicType::Is(this->typeId)) + if(Js::DynamicType::Is(this)) { sType->HasNoEnumerableProperties = static_cast(this)->GetHasNoEnumerableProperties(); } diff --git a/deps/chakrashim/core/lib/Runtime/Types/TypeHandler.cpp b/deps/chakrashim/core/lib/Runtime/Types/TypeHandler.cpp index ae4783e219b..f2d5cce08a8 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/TypeHandler.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/TypeHandler.cpp @@ -312,6 +312,7 @@ namespace Js instance->GetDynamicType()->SetPrototype(newPrototype); } +#if ENABLE_FIXED_FIELDS bool DynamicTypeHandler::TryUseFixedProperty(PropertyRecord const* propertyRecord, Var * pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext) { if (PHASE_VERBOSE_TRACE1(Js::FixedMethodsPhase) || PHASE_VERBOSE_TESTTRACE1(Js::FixedMethodsPhase) || @@ -452,6 +453,7 @@ namespace Js Output::Flush(); } } +#endif // ENABLE_FIXED_FIELDS BOOL DynamicTypeHandler::GetInternalProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value) { @@ -570,15 +572,15 @@ namespace Js if (possibleSideEffects) { ScriptContext* scriptContext = instance->GetScriptContext(); - if (BuiltInPropertyRecords::valueOf.Equals(propertyName)) + if (BuiltInPropertyRecords::valueOf.Equals(propertyName.GetBuffer(), propertyName.GetLength())) { scriptContext->optimizationOverrides.SetSideEffects((SideEffects)(SideEffects_ValueOf & possibleSideEffects)); } - else if (BuiltInPropertyRecords::toString.Equals(propertyName)) + else if (BuiltInPropertyRecords::toString.Equals(propertyName.GetBuffer(), propertyName.GetLength())) { scriptContext->optimizationOverrides.SetSideEffects((SideEffects)(SideEffects_ToString & possibleSideEffects)); } - else if (BuiltInPropertyRecords::Math.Equals(propertyName)) + else if (BuiltInPropertyRecords::Math.Equals(propertyName.GetBuffer(), propertyName.GetLength())) { if (instance == scriptContext->GetLibrary()->GetGlobalObject()) { @@ -821,4 +823,36 @@ namespace Js return false; } #endif + +#if DBG_DUMP + void DynamicTypeHandler::Dump(unsigned indent) const { + const auto padding(_u("")); + const unsigned fieldIndent(indent + 2); + + Output::Print(_u("%*sDynamicTypeHandler: 0x%p\n"), indent, padding, this); + Output::Print(_u("%*spropertyTypes: 0x%02x "), fieldIndent, padding, this->propertyTypes); + if (this->propertyTypes & PropertyTypesReserved) Output::Print(_u("PropertyTypesReserved ")); + if (this->propertyTypes & PropertyTypesWritableDataOnly) Output::Print(_u("PropertyTypesWritableDataOnly ")); + if (this->propertyTypes & PropertyTypesWritableDataOnlyDetection) Output::Print(_u("PropertyTypesWritableDataOnlyDetection ")); + if (this->propertyTypes & PropertyTypesInlineSlotCapacityLocked) Output::Print(_u("PropertyTypesInlineSlotCapacityLocked ")); + Output::Print(_u("\n")); + + Output::Print(_u("%*sflags: 0x%02x "), fieldIndent, padding, this->flags); + if (this->flags & IsExtensibleFlag) Output::Print(_u("IsExtensibleFlag ")); + if (this->flags & HasKnownSlot0Flag) Output::Print(_u("HasKnownSlot0Flag ")); + if (this->flags & IsLockedFlag) Output::Print(_u("IsLockedFlag ")); + if (this->flags & MayBecomeSharedFlag) Output::Print(_u("MayBecomeSharedFlag ")); + if (this->flags & IsSharedFlag) Output::Print(_u("IsSharedFlag ")); + if (this->flags & IsPrototypeFlag) Output::Print(_u("IsPrototypeFlag ")); + if (this->flags & IsSealedOnceFlag) Output::Print(_u("IsSealedOnceFlag ")); + if (this->flags & IsFrozenOnceFlag) Output::Print(_u("IsFrozenOnceFlag ")); + Output::Print(_u("\n")); + + Output::Print(_u("%*soffsetOfInlineSlots: %u\n"), fieldIndent, padding, this->offsetOfInlineSlots); + Output::Print(_u("%*sslotCapacity: %d\n"), fieldIndent, padding, this->slotCapacity); + Output::Print(_u("%*sunusedBytes: %u\n"), fieldIndent, padding, this->unusedBytes); + Output::Print(_u("%*sinlineSlotCapacty: %u\n"), fieldIndent, padding, this->inlineSlotCapacity); + Output::Print(_u("%*sisNotPathTypeHandlerOrHasUserDefinedCtor: %d\n"), fieldIndent, padding, static_cast(this->isNotPathTypeHandlerOrHasUserDefinedCtor)); + } +#endif } diff --git a/deps/chakrashim/core/lib/Runtime/Types/TypeHandler.h b/deps/chakrashim/core/lib/Runtime/Types/TypeHandler.h index f086a19a5a3..a6ef489ff61 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/TypeHandler.h +++ b/deps/chakrashim/core/lib/Runtime/Types/TypeHandler.h @@ -14,38 +14,14 @@ namespace Js DeferredInitializeMode_SetAccessors }; +#if ENABLE_FIXED_FIELDS enum FixedPropertyKind : CHAR { FixedDataProperty = 1 << 0, FixedMethodProperty = 1 << 1, FixedAccessorProperty = 1 << 2, }; - - struct PropertyEquivalenceInfo - { - PropertyIndex slotIndex; - bool isAuxSlot; - bool isWritable; - - PropertyEquivalenceInfo(): - slotIndex(Constants::NoSlot), isAuxSlot(false), isWritable(false) {} - PropertyEquivalenceInfo(PropertyIndex slotIndex, bool isAuxSlot, bool isWritable): - slotIndex(slotIndex), isAuxSlot(isAuxSlot), isWritable(isWritable) {} - }; - - struct EquivalentPropertyEntry - { - Js::PropertyId propertyId; - Js::PropertyIndex slotIndex; - bool isAuxSlot; - bool mustBeWritable; - }; - - struct TypeEquivalenceRecord - { - uint propertyCount; - EquivalentPropertyEntry* properties; - }; +#endif typedef bool (__cdecl *DeferredTypeInitializer)(DynamicObject* instance, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); @@ -160,6 +136,7 @@ namespace Js Var GetInlineSlot(DynamicObject * instance, int index); Var GetAuxSlot(DynamicObject * instance, int index); +#if ENABLE_FIXED_FIELDS void TraceUseFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, bool result, LPCWSTR typeHandlerName, ScriptContext * requestContext); bool IsFixedMethodProperty(FixedPropertyKind fixedPropKind); @@ -170,6 +147,7 @@ namespace Js static bool CheckHeuristicsForFixedDataProps(DynamicObject* instance, const PropertyRecord * propertyRecord, Var value); static bool CheckHeuristicsForFixedDataProps(DynamicObject* instance, PropertyId propertyId, Var value); static bool CheckHeuristicsForFixedDataProps(DynamicObject* instance, JavascriptString * propertyKey, Var value); +#endif #if DBG void SetSlot(DynamicObject * instance, PropertyId propertyId, bool allowLetConst, int index, Var value); @@ -182,7 +160,7 @@ namespace Js #endif protected: - void SetSlotUnchecked(DynamicObject * instance, int index, Var value); + static void SetSlotUnchecked(DynamicObject * instance, int index, Var value); public: inline PropertyIndex AdjustSlotIndexForInlineSlots(PropertyIndex slotIndex) @@ -240,8 +218,10 @@ namespace Js // If we isolate prototypes, don't set a shared or may become shared flag on a prototype type handler. Assert((this->flags & IsSharedFlag) != 0 || !IsolatePrototypes() || (this->flags & IsPrototypeFlag) == 0 || (values & (MayBecomeSharedFlag | IsSharedFlag)) == 0); +#if ENABLE_FIXED_FIELDS // Don't set a shared flag if this type handler has a singleton instance. Assert(!this->HasSingletonInstance() || (values & IsSharedFlag) == 0); +#endif this->flags |= values; } @@ -280,8 +260,10 @@ namespace Js // If we isolate prototypes, don't set a shared flag on a prototype type handler. Assert((this->flags & IsSharedFlag) != 0 || !IsolatePrototypes() || (this->flags & IsPrototypeFlag) == 0 || ((selector & values) & (MayBecomeSharedFlag | IsSharedFlag)) == 0); +#if ENABLE_FIXED_FIELDS // Don't set a shared flag if this type handler has a singleton instance. Assert(!this->HasSingletonInstance() || ((selector & values) & IsSharedFlag) == 0); +#endif this->flags = (selector & values) | (~selector & this->flags); } @@ -377,10 +359,12 @@ namespace Js Assert(IsSharable()); Assert(GetMayBecomeShared()); LockTypeHandler(); +#if ENABLE_FIXED_FIELDS if ((GetFlags() & IsSharedFlag) == 0) { DoShareTypeHandler(scriptContext); } +#endif SetFlags(IsSharedFlag); } @@ -434,7 +418,6 @@ namespace Js virtual BOOL AllPropertiesAreEnumerable() { return false; } virtual BOOL IsLockable() const = 0; virtual BOOL IsSharable() const = 0; - virtual void DoShareTypeHandler(ScriptContext* scriptContext) {}; virtual int GetPropertyCount() = 0; virtual PropertyId GetPropertyId(ScriptContext* scriptContext, PropertyIndex index) = 0; @@ -444,9 +427,11 @@ namespace Js virtual BOOL FindNextProperty(ScriptContext* scriptContext, BigPropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, Type* type, DynamicType *typeToEnumerate, EnumeratorFlags flags, DynamicObject* instance, PropertyValueInfo* info); virtual PropertyIndex GetPropertyIndex(PropertyRecord const* propertyRecord) = 0; +#if ENABLE_NATIVE_CODEGEN virtual bool GetPropertyEquivalenceInfo(PropertyRecord const* propertyRecord, PropertyEquivalenceInfo& info) = 0; virtual bool IsObjTypeSpecEquivalent(const Type* type, const Js::TypeEquivalenceRecord& record, uint& failedPropertyIndex) = 0; virtual bool IsObjTypeSpecEquivalent(const Type* type, const EquivalentPropertyEntry* entry) = 0; +#endif virtual bool EnsureObjectReady(DynamicObject* instance) { return true; } virtual BOOL HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *pNoRedecl = nullptr) = 0; @@ -488,7 +473,6 @@ namespace Js virtual bool NextLetConstGlobal(int& index, RootObjectBase* instance, const PropertyRecord** propertyRecord, Var* value, bool* isConst) { Throw::FatalInternalError(); } // =================================================================================================================== - virtual BOOL IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) { return false; }; virtual BOOL IsEnumerable(DynamicObject* instance, PropertyId propertyId) = 0; virtual BOOL IsWritable(DynamicObject* instance, PropertyId propertyId) = 0; virtual BOOL IsConfigurable(DynamicObject* instance, PropertyId propertyId) = 0; @@ -569,14 +553,17 @@ namespace Js virtual bool SupportsPrototypeInstances() const { return false; } virtual bool RespectsIsolatePrototypes() const { return true; } virtual bool RespectsChangeTypeOnProto() const { return true; } + virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) { return false; } #endif +#if ENABLE_FIXED_FIELDS + virtual void DoShareTypeHandler(ScriptContext* scriptContext) {}; + virtual BOOL IsFixedProperty(const DynamicObject* instance, PropertyId propertyId) { return false; }; virtual bool HasSingletonInstance() const { return false; } virtual bool TryUseFixedProperty(PropertyRecord const* propertyRecord, Var* pProperty, FixedPropertyKind propertyType, ScriptContext * requestContext); virtual bool TryUseFixedAccessor(PropertyRecord const* propertyRecord, Var* pAccessor, FixedPropertyKind propertyType, bool getter, ScriptContext * requestContext); #if DBG - virtual bool CanStorePropertyValueDirectly(const DynamicObject* instance, PropertyId propertyId, bool allowLetConst) { return false; } virtual bool CheckFixedProperty(PropertyRecord const * propertyRecord, Var * pProperty, ScriptContext * requestContext) { return false; }; virtual bool HasAnyFixedProperties() const { return false; } #endif @@ -614,7 +601,7 @@ namespace Js virtual void SetSingletonInstanceUnchecked(RecyclerWeakReference* instance) { Assert(false); } virtual void ClearSingletonInstance() { Assert(false); } - +#endif public: static void AdjustSlots_Jit(DynamicObject *const object, const PropertyIndex newInlineSlotCapacity, const int newAuxSlotCapacity); static void AdjustSlots(DynamicObject *const object, const PropertyIndex newInlineSlotCapacity, const int newAuxSlotCapacity); @@ -665,5 +652,10 @@ namespace Js //Return true if this type handler is reseattable/false if we don't want to try virtual bool IsResetableForTTD(uint32 snapMaxIndex) const; #endif + +#if DBG_DUMP + public: + virtual void Dump(unsigned indent = 0) const; +#endif }; } diff --git a/deps/chakrashim/core/lib/Runtime/Types/TypePath.cpp b/deps/chakrashim/core/lib/Runtime/Types/TypePath.cpp index 1d89bcfe6ee..74c5e20d733 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/TypePath.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/TypePath.cpp @@ -155,6 +155,7 @@ namespace Js { return clonedPath; } +#if ENABLE_FIXED_FIELDS #if DBG bool TypePath::HasSingletonInstanceOnlyIfNeeded() { @@ -186,6 +187,7 @@ namespace Js { #endif } +#endif int TypePath::Data::Add(const PropertyRecord* propId, Field(const PropertyRecord *)* assignments) { @@ -235,12 +237,12 @@ namespace Js { return propertyIndex; } +#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES void TypePath::AddBlankFieldAt(PropertyIndex index, int typePathLength) { Assert(index >= this->GetMaxInitializedLength()); this->SetMaxInitializedLength(index + 1); -#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES if (PHASE_VERBOSE_TRACE1(FixMethodPropsPhase)) { Output::Print(_u("FixedFields: TypePath::AddBlankFieldAt: singleton = 0x%p(0x%p)\n"), @@ -257,7 +259,6 @@ namespace Js { Output::Print(_u("\n")); } -#endif } void TypePath::AddSingletonInstanceFieldAt(DynamicObject* instance, PropertyIndex index, bool isFixed, int typePathLength) @@ -282,7 +283,6 @@ namespace Js { this->GetData()->fixedFields.Set(index); } -#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES if (PHASE_VERBOSE_TRACE1(FixMethodPropsPhase)) { Output::Print(_u("FixedFields: TypePath::AddSingletonInstanceFieldAt: singleton = 0x%p(0x%p)\n"), @@ -299,7 +299,6 @@ namespace Js { Output::Print(_u("\n")); } -#endif } void TypePath::AddSingletonInstanceFieldAt(PropertyIndex index, int typePathLength) @@ -311,7 +310,6 @@ namespace Js { this->SetMaxInitializedLength(index + 1); -#ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES if (PHASE_VERBOSE_TRACE1(FixMethodPropsPhase)) { Output::Print(_u("FixedFields: TypePath::AddSingletonInstanceFieldAt: singleton = 0x%p(0x%p)\n"), @@ -328,7 +326,7 @@ namespace Js { Output::Print(_u("\n")); } -#endif } +#endif } diff --git a/deps/chakrashim/core/lib/Runtime/Types/TypePath.h b/deps/chakrashim/core/lib/Runtime/Types/TypePath.h index 0e770c670b0..1e4db445108 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/TypePath.h +++ b/deps/chakrashim/core/lib/Runtime/Types/TypePath.h @@ -57,16 +57,19 @@ namespace Js class TypePath { friend class PathTypeHandlerBase; + friend class SimplePathTypeHandlerWithAttr; + friend class PathTypeHandlerWithAttr; + public: // This is the space between the end of the TypePath and the allocation granularity that can be used for assignments too. #ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) #define TYPE_PATH_ALLOC_GRANULARITY_GAP 0 #else #define TYPE_PATH_ALLOC_GRANULARITY_GAP 2 #endif #else -#if defined(_M_X64_OR_ARM64) +#if defined(TARGET_64) #define TYPE_PATH_ALLOC_GRANULARITY_GAP 1 #else #define TYPE_PATH_ALLOC_GRANULARITY_GAP 3 @@ -161,6 +164,7 @@ namespace Js private: int AddInternal(const PropertyRecord* propId); +#if ENABLE_FIXED_FIELDS #ifdef SUPPORT_FIXED_FIELDS_ON_PATH_TYPES uint8 GetMaxInitializedLength() { return this->GetData()->maxInitializedLength; } void SetMaxInitializedLength(int newMaxInitializedLength) @@ -264,7 +268,7 @@ namespace Js #endif #else - int GetMaxInitializedLength() { Assert(false); return this->pathLength; } + int GetMaxInitializedLength() { Assert(false); return this->GetPathLength(); } Var GetSingletonFixedFieldAt(PropertyIndex index, int typePathLength, ScriptContext * requestContext); @@ -272,8 +276,8 @@ namespace Js RecyclerWeakReference* GetSingletonInstance() const { Assert(false); return nullptr; } void SetSingletonInstance(RecyclerWeakReference* instance, int typePathLength) { Assert(false); } void ClearSingletonInstance() { Assert(false); } - void ClearSingletonInstanceIfSame(RecyclerWeakReference* instance) { Assert(false); } - void ClearSingletonInstanceIfDifferent(RecyclerWeakReference* instance) { Assert(false); } + void ClearSingletonInstanceIfSame(DynamicObject* instance) { Assert(false); } + void ClearSingletonInstanceIfDifferent(DynamicObject* instance) { Assert(false); } bool GetIsFixedFieldAt(PropertyIndex index, int typePathLength) { Assert(false); return false; } bool GetIsUsedFixedFieldAt(PropertyIndex index, int typePathLength) { Assert(false); return false; } @@ -286,8 +290,9 @@ namespace Js #if DBG bool HasSingletonInstanceOnlyIfNeeded(); #endif +#endif #endif }; } -CompileAssert((sizeof(Js::TypePath) % HeapConstants::ObjectGranularity) / sizeof(void *) == TYPE_PATH_ALLOC_GRANULARITY_GAP); \ No newline at end of file +CompileAssert((sizeof(Js::TypePath) % HeapConstants::ObjectGranularity) == (HeapConstants::ObjectGranularity - TYPE_PATH_ALLOC_GRANULARITY_GAP * sizeof(void *)) % HeapConstants::ObjectGranularity); \ No newline at end of file diff --git a/deps/chakrashim/core/lib/Runtime/Types/TypePropertyCache.cpp b/deps/chakrashim/core/lib/Runtime/Types/TypePropertyCache.cpp index 8e14f36307e..49c51d9d2d2 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/TypePropertyCache.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/TypePropertyCache.cpp @@ -217,9 +217,11 @@ namespace Js ? DynamicObject::FromVar(propertyObject)->GetInlineSlot(propertyIndex) : DynamicObject::FromVar(propertyObject)->GetAuxSlot(propertyIndex); - if (propertyObject->GetScriptContext() == requestContext) + if(propertyObject->GetScriptContext() == requestContext) { - Assert(*propertyValue == JavascriptOperators::GetProperty(propertyObject, propertyId, requestContext)); + DebugOnly(Var getPropertyValue = JavascriptOperators::GetProperty(propertyObject, propertyId, requestContext)); + Assert(*propertyValue == getPropertyValue || + (getPropertyValue == requestContext->GetLibrary()->GetNull() && requestContext->GetThreadContext()->IsDisableImplicitCall() && propertyObject->GetType()->IsExternal())); CacheOperators::Cache( false, @@ -238,7 +240,7 @@ namespace Js } else { - *propertyValue = CrossSite::MarshalVar(requestContext, *propertyValue); + *propertyValue = CrossSite::MarshalVar(requestContext, *propertyValue); } // Cannot use GetProperty and compare results since they may not compare equal when they're marshaled @@ -301,7 +303,7 @@ namespace Js } else { - *propertyValue = CrossSite::MarshalVar(requestContext, *propertyValue); + *propertyValue = CrossSite::MarshalVar(requestContext, *propertyValue); } // Cannot use GetProperty and compare results since they may not compare equal when they're marshaled @@ -354,7 +356,9 @@ namespace Js } #endif +#if ENABLE_FIXED_FIELDS Assert(!object->IsFixedProperty(propertyId)); +#endif Assert( ( DynamicObject diff --git a/deps/chakrashim/core/lib/Runtime/Types/WithScopeObject.cpp b/deps/chakrashim/core/lib/Runtime/Types/WithScopeObject.cpp index cb7ba527ed0..f33fc3ffe33 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/WithScopeObject.cpp +++ b/deps/chakrashim/core/lib/Runtime/Types/WithScopeObject.cpp @@ -10,7 +10,14 @@ namespace Js { return JavascriptOperators::GetTypeId(aValue) == TypeIds_WithScopeObject; } + WithScopeObject* WithScopeObject::FromVar(Var aValue) + { + AssertOrFailFast(WithScopeObject::Is(aValue)); + return static_cast(aValue); + } + + WithScopeObject* WithScopeObject::UnsafeFromVar(Var aValue) { Assert(WithScopeObject::Is(aValue)); return static_cast(aValue); diff --git a/deps/chakrashim/core/lib/Runtime/Types/WithScopeObject.h b/deps/chakrashim/core/lib/Runtime/Types/WithScopeObject.h index 8c3be01e504..e4690b643bf 100644 --- a/deps/chakrashim/core/lib/Runtime/Types/WithScopeObject.h +++ b/deps/chakrashim/core/lib/Runtime/Types/WithScopeObject.h @@ -18,6 +18,7 @@ namespace Js WithScopeObject(RecyclableObject *wrappedObject, StaticType * type) : RecyclableObject(type), wrappedObject(wrappedObject) {} static bool Is(Var aValue); static WithScopeObject* FromVar(Var value); + static WithScopeObject* UnsafeFromVar(Var value); RecyclableObject *GetWrappedObject() { return wrappedObject; } virtual PropertyQueryFlags HasPropertyQuery(PropertyId propertyId) override; virtual BOOL HasOwnProperty(PropertyId propertyId) override; @@ -37,7 +38,9 @@ namespace Js virtual BOOL SetInternalProperty(PropertyId internalPropertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override { AssertAndFailFast(); return FALSE; }; virtual BOOL InitProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags = PropertyOperation_None, PropertyValueInfo* info = NULL) override { AssertAndFailFast(); return FALSE; }; virtual BOOL SetPropertyWithAttributes(PropertyId propertyId, Var value, PropertyAttributes attributes, PropertyValueInfo* info, PropertyOperationFlags flags = PropertyOperation_None, SideEffects possibleSideEffects = SideEffects_Any) override { AssertAndFailFast(); return FALSE; }; +#if ENABLE_FIXED_FIELDS virtual BOOL IsFixedProperty(PropertyId propertyId) override { AssertAndFailFast(); return FALSE; }; +#endif virtual PropertyQueryFlags HasItemQuery(uint32 index) override { AssertAndFailFast(); return PropertyQueryFlags::Property_NotFound; }; virtual BOOL HasOwnItem(uint32 index) override { AssertAndFailFast(); return FALSE; }; virtual PropertyQueryFlags GetItemQuery(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override { AssertAndFailFast(); return PropertyQueryFlags::Property_NotFound; }; diff --git a/deps/chakrashim/core/lib/WasmReader/Chakra.WasmReader.vcxproj b/deps/chakrashim/core/lib/WasmReader/Chakra.WasmReader.vcxproj index be1660eaa6d..ab71a2ff186 100644 --- a/deps/chakrashim/core/lib/WasmReader/Chakra.WasmReader.vcxproj +++ b/deps/chakrashim/core/lib/WasmReader/Chakra.WasmReader.vcxproj @@ -1,4 +1,4 @@ - + @@ -60,13 +60,15 @@ + - + + @@ -75,4 +77,4 @@ - + \ No newline at end of file diff --git a/deps/chakrashim/core/lib/WasmReader/Chakra.WasmReader.vcxproj.filters b/deps/chakrashim/core/lib/WasmReader/Chakra.WasmReader.vcxproj.filters index 038a57ced00..afefb6eb1f4 100644 --- a/deps/chakrashim/core/lib/WasmReader/Chakra.WasmReader.vcxproj.filters +++ b/deps/chakrashim/core/lib/WasmReader/Chakra.WasmReader.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -7,7 +7,8 @@ - + + @@ -18,6 +19,7 @@ + diff --git a/deps/chakrashim/core/lib/WasmReader/EmptyWasmByteCodeWriter.h b/deps/chakrashim/core/lib/WasmReader/EmptyWasmByteCodeWriter.h index d3badce20d1..1414de459c7 100644 --- a/deps/chakrashim/core/lib/WasmReader/EmptyWasmByteCodeWriter.h +++ b/deps/chakrashim/core/lib/WasmReader/EmptyWasmByteCodeWriter.h @@ -27,15 +27,27 @@ namespace Js virtual void AsmReg1(OpCodeAsmJs op, RegSlot R0) override {} virtual void AsmReg2(OpCodeAsmJs op, RegSlot R0, RegSlot R1) override {} virtual void AsmReg3(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2) override {} - virtual void AsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId) override {} + virtual void AsmReg4(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3) override {} + virtual void AsmReg5(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4) override {} + virtual void AsmReg9(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8) override {} + virtual void AsmReg17(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, + RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16) override {} + virtual void AsmShuffle(OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, uint8 indices[]) override {} + virtual void AsmSimdTypedArr(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType, uint32 offset = 0) override {}; + virtual void WasmSimdConst(OpCodeAsmJs op, RegSlot R0, int C0, int C1, int C2, int C3) override {}; + + virtual void AsmSlot(OpCodeAsmJs op, RegSlot value, RegSlot instance, uint32 slotId) override {} + virtual void AsmBr(ByteCodeLabel labelID, OpCodeAsmJs op = OpCodeAsmJs::AsmBr) override {} virtual void AsmBrReg1(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1) override {} virtual void AsmBrReg1Const1(OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, int C1) override {} virtual void WasmMemAccess(OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint32 offset, ArrayBufferView::ViewType viewType) override {} - virtual uint32 EnterLoop(ByteCodeLabel loopEntrance) override {return 0;} + virtual uint32 WasmLoopStart(ByteCodeLabel loopEntrance, __in_ecount(WAsmJs::LIMIT) RegSlot* curRegs) { return 0; } virtual void ExitLoop(uint32 loopId) override {} virtual void AsmStartCall(OpCodeAsmJs op, ArgSlot ArgCount, bool isPatching = false) override {} - virtual void AsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType) override {} + virtual void AsmCall(OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType, Js::ProfileId profileId) override {} + + virtual void SetCallSiteCount(Js::ProfileId callSiteCount) override {} }; } #endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/WasmReader/WasmBinaryOpCodes.h b/deps/chakrashim/core/lib/WasmReader/WasmBinaryOpCodes.h index a70e3361e71..a87b57715b8 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmBinaryOpCodes.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmBinaryOpCodes.h @@ -5,7 +5,7 @@ // define this to include all opcodes #ifndef WASM_OPCODE -#define WASM_OPCODE(opname, opcode, sig, nyi) +#define WASM_OPCODE(opname, opcode, sig, imp, wat) #endif #ifndef WASM_SIGNATURE @@ -13,35 +13,58 @@ #endif #ifndef WASM_CTRL_OPCODE -#define WASM_CTRL_OPCODE(opname, opcode, sig, nyi) WASM_OPCODE(opname, opcode, sig, nyi) +#define WASM_CTRL_OPCODE(opname, opcode, sig, imp, wat) WASM_OPCODE(opname, opcode, sig, imp, wat) #endif #ifndef WASM_MISC_OPCODE -#define WASM_MISC_OPCODE(opname, opcode, sig, nyi) WASM_OPCODE(opname, opcode, sig, nyi) +#define WASM_MISC_OPCODE(opname, opcode, sig, imp, wat) WASM_OPCODE(opname, opcode, sig, imp, wat) #endif #ifndef WASM_MEM_OPCODE -#define WASM_MEM_OPCODE(opname, opcode, sig, nyi) WASM_OPCODE(opname, opcode, sig, nyi) +#define WASM_MEM_OPCODE(opname, opcode, sig, imp, wat) WASM_OPCODE(opname, opcode, sig, imp, wat) +#endif + +#ifndef WASM_ATOMIC_OPCODE +#define WASM_ATOMIC_OPCODE(opname, opcode, sig, imp, viewtype, wat) WASM_MEM_OPCODE(opname, opcode, sig, imp, wat) #endif #ifndef WASM_MEMREAD_OPCODE -#define WASM_MEMREAD_OPCODE(opname, opcode, sig, nyi, viewtype) WASM_MEM_OPCODE(opname, opcode, sig, nyi) +#define WASM_MEMREAD_OPCODE(opname, opcode, sig, imp, viewtype, wat) WASM_MEM_OPCODE(opname, opcode, sig, imp, wat) #endif #ifndef WASM_MEMSTORE_OPCODE -#define WASM_MEMSTORE_OPCODE(opname, opcode, sig, nyi, viewtype) WASM_MEM_OPCODE(opname, opcode, sig, nyi) +#define WASM_MEMSTORE_OPCODE(opname, opcode, sig, imp, viewtype, wat) WASM_MEM_OPCODE(opname, opcode, sig, imp, wat) +#endif + +#ifndef WASM_ATOMICREAD_OPCODE +#define WASM_ATOMICREAD_OPCODE(opname, opcode, sig, imp, viewtype, wat) WASM_ATOMIC_OPCODE(opname, opcode, sig, imp, viewtype, wat) +#endif + +#ifndef WASM_ATOMICSTORE_OPCODE +#define WASM_ATOMICSTORE_OPCODE(opname, opcode, sig, imp, viewtype, wat) WASM_ATOMIC_OPCODE(opname, opcode, sig, imp, viewtype, wat) #endif #ifndef WASM_UNARY__OPCODE -#define WASM_UNARY__OPCODE(opname, opcode, sig, asmjop, nyi) WASM_OPCODE(opname, opcode, sig, nyi) +#define WASM_UNARY__OPCODE(opname, opcode, sig, asmjop, imp, wat) WASM_OPCODE(opname, opcode, sig, imp, wat) #endif #ifndef WASM_BINARY_OPCODE -#define WASM_BINARY_OPCODE(opname, opcode, sig, asmjop, nyi) WASM_OPCODE(opname, opcode, sig, nyi) +#define WASM_BINARY_OPCODE(opname, opcode, sig, asmjop, imp, wat) WASM_OPCODE(opname, opcode, sig, imp, wat) #endif #ifndef WASM_EMPTY__OPCODE -#define WASM_EMPTY__OPCODE(opname, opcode, asmjop, nyi) WASM_OPCODE(opname, opcode, Limit, nyi) +#define WASM_EMPTY__OPCODE(opname, opcode, asmjop, imp, wat) WASM_OPCODE(opname, opcode, Limit, imp, wat) +#endif + +#ifndef WASM_PREFIX +#define WASM_PREFIX(prefixname, op, imp, errorMsg) +#endif + +#define WASM_PREFIX_TRACING 0xf0 +#if ENABLE_DEBUG_CONFIG_OPTIONS +// We won't even look at that prefix in release builds +// Mark the prefix as not implemented so we don't allow it in the binary buffer +WASM_PREFIX(Tracing, WASM_PREFIX_TRACING, false, "Tracing opcodes not allowed") #endif // built-in opcode signatures @@ -86,228 +109,244 @@ WASM_SIGNATURE(V, 1, WasmTypes::Void) WASM_SIGNATURE(Limit, 1, WasmTypes::Void) // Control flow operators -WASM_CTRL_OPCODE(Unreachable, 0x00, Limit, false) -WASM_CTRL_OPCODE(Nop, 0x01, Limit, false) -WASM_CTRL_OPCODE(Block, 0x02, Limit, false) -WASM_CTRL_OPCODE(Loop, 0x03, Limit, false) -WASM_CTRL_OPCODE(If, 0x04, Limit, false) -WASM_CTRL_OPCODE(Else, 0x05, Limit, false) -WASM_CTRL_OPCODE(End, 0x0b, Limit, false) -WASM_CTRL_OPCODE(Br, 0x0c, Limit, false) -WASM_CTRL_OPCODE(BrIf, 0x0d, Limit, false) -WASM_CTRL_OPCODE(BrTable, 0x0e, Limit, false) -WASM_CTRL_OPCODE(Return, 0x0f, Limit, false) +WASM_CTRL_OPCODE(Unreachable, 0x00, Limit, true, "unreachable") +WASM_CTRL_OPCODE(Nop, 0x01, Limit, true, "nop") +WASM_CTRL_OPCODE(Block, 0x02, Limit, true, "block") +WASM_CTRL_OPCODE(Loop, 0x03, Limit, true, "loop") +WASM_CTRL_OPCODE(If, 0x04, Limit, true, "if") +WASM_CTRL_OPCODE(Else, 0x05, Limit, true, "else") +WASM_CTRL_OPCODE(End, 0x0b, Limit, true, "end") +WASM_CTRL_OPCODE(Br, 0x0c, Limit, true, "br") +WASM_CTRL_OPCODE(BrIf, 0x0d, Limit, true, "br_if") +WASM_CTRL_OPCODE(BrTable, 0x0e, Limit, true, "br_table") +WASM_CTRL_OPCODE(Return, 0x0f, Limit, true, "return") // Call operators -WASM_MISC_OPCODE(Call, 0x10, Limit, false) -WASM_MISC_OPCODE(CallIndirect,0x11, Limit, false) +WASM_MISC_OPCODE(Call, 0x10, Limit, true, "call") +WASM_MISC_OPCODE(CallIndirect,0x11, Limit, true, "call_indirect") // Parametric operators -WASM_CTRL_OPCODE(Drop, 0x1a, Limit, false) -WASM_CTRL_OPCODE(Select, 0x1b, Limit, false) +WASM_CTRL_OPCODE(Drop, 0x1a, Limit, true, "drop") +WASM_CTRL_OPCODE(Select, 0x1b, Limit, true, "select") // Variable access -WASM_MISC_OPCODE(GetLocal, 0x20, Limit, false) -WASM_MISC_OPCODE(SetLocal, 0x21, Limit, false) -WASM_MISC_OPCODE(TeeLocal, 0x22, Limit, false) -WASM_MISC_OPCODE(GetGlobal, 0x23, Limit, false) -WASM_MISC_OPCODE(SetGlobal, 0x24, Limit, false) +WASM_MISC_OPCODE(GetLocal, 0x20, Limit, true, "get_local") +WASM_MISC_OPCODE(SetLocal, 0x21, Limit, true, "set_local") +WASM_MISC_OPCODE(TeeLocal, 0x22, Limit, true, "tee_local") +WASM_MISC_OPCODE(GetGlobal, 0x23, Limit, true, "get_global") +WASM_MISC_OPCODE(SetGlobal, 0x24, Limit, true, "set_global") // Memory-related operators // Load memory expressions. -WASM_MEMREAD_OPCODE(I32LoadMem, 0x28, I_I, false, Js::ArrayBufferView::TYPE_INT32) -WASM_MEMREAD_OPCODE(I64LoadMem, 0x29, L_I, false, Js::ArrayBufferView::TYPE_INT64) -WASM_MEMREAD_OPCODE(F32LoadMem, 0x2a, F_I, false, Js::ArrayBufferView::TYPE_FLOAT32) -WASM_MEMREAD_OPCODE(F64LoadMem, 0x2b, D_I, false, Js::ArrayBufferView::TYPE_FLOAT64) -WASM_MEMREAD_OPCODE(I32LoadMem8S, 0x2c, I_I, false, Js::ArrayBufferView::TYPE_INT8) -WASM_MEMREAD_OPCODE(I32LoadMem8U, 0x2d, I_I, false, Js::ArrayBufferView::TYPE_UINT8) -WASM_MEMREAD_OPCODE(I32LoadMem16S, 0x2e, I_I, false, Js::ArrayBufferView::TYPE_INT16) -WASM_MEMREAD_OPCODE(I32LoadMem16U, 0x2f, I_I, false, Js::ArrayBufferView::TYPE_UINT16) -WASM_MEMREAD_OPCODE(I64LoadMem8S, 0x30, L_I, false, Js::ArrayBufferView::TYPE_INT8_TO_INT64) -WASM_MEMREAD_OPCODE(I64LoadMem8U, 0x31, L_I, false, Js::ArrayBufferView::TYPE_UINT8_TO_INT64) -WASM_MEMREAD_OPCODE(I64LoadMem16S, 0x32, L_I, false, Js::ArrayBufferView::TYPE_INT16_TO_INT64) -WASM_MEMREAD_OPCODE(I64LoadMem16U, 0x33, L_I, false, Js::ArrayBufferView::TYPE_UINT16_TO_INT64) -WASM_MEMREAD_OPCODE(I64LoadMem32S, 0x34, L_I, false, Js::ArrayBufferView::TYPE_INT32_TO_INT64) -WASM_MEMREAD_OPCODE(I64LoadMem32U, 0x35, L_I, false, Js::ArrayBufferView::TYPE_UINT32_TO_INT64) +WASM_MEMREAD_OPCODE(I32LoadMem, 0x28, I_I, true, Js::ArrayBufferView::TYPE_INT32, "i32.load") +WASM_MEMREAD_OPCODE(I64LoadMem, 0x29, L_I, true, Js::ArrayBufferView::TYPE_INT64, "i64.load") +WASM_MEMREAD_OPCODE(F32LoadMem, 0x2a, F_I, true, Js::ArrayBufferView::TYPE_FLOAT32, "f32.load") +WASM_MEMREAD_OPCODE(F64LoadMem, 0x2b, D_I, true, Js::ArrayBufferView::TYPE_FLOAT64, "f64.load") +WASM_MEMREAD_OPCODE(I32LoadMem8S, 0x2c, I_I, true, Js::ArrayBufferView::TYPE_INT8, "i32.load8_s") +WASM_MEMREAD_OPCODE(I32LoadMem8U, 0x2d, I_I, true, Js::ArrayBufferView::TYPE_UINT8, "i32.load8_u") +WASM_MEMREAD_OPCODE(I32LoadMem16S, 0x2e, I_I, true, Js::ArrayBufferView::TYPE_INT16, "i32.load16_s") +WASM_MEMREAD_OPCODE(I32LoadMem16U, 0x2f, I_I, true, Js::ArrayBufferView::TYPE_UINT16, "i32.load16_u") +WASM_MEMREAD_OPCODE(I64LoadMem8S, 0x30, L_I, true, Js::ArrayBufferView::TYPE_INT8_TO_INT64, "i64.load8_s") +WASM_MEMREAD_OPCODE(I64LoadMem8U, 0x31, L_I, true, Js::ArrayBufferView::TYPE_UINT8_TO_INT64, "i64.load8_u") +WASM_MEMREAD_OPCODE(I64LoadMem16S, 0x32, L_I, true, Js::ArrayBufferView::TYPE_INT16_TO_INT64, "i64.load16_s") +WASM_MEMREAD_OPCODE(I64LoadMem16U, 0x33, L_I, true, Js::ArrayBufferView::TYPE_UINT16_TO_INT64, "i64.load16_u") +WASM_MEMREAD_OPCODE(I64LoadMem32S, 0x34, L_I, true, Js::ArrayBufferView::TYPE_INT32_TO_INT64, "i64.load32_s") +WASM_MEMREAD_OPCODE(I64LoadMem32U, 0x35, L_I, true, Js::ArrayBufferView::TYPE_UINT32_TO_INT64, "i64.load32_u") // Store memory expressions. -WASM_MEMSTORE_OPCODE(I32StoreMem, 0x36, I_II, false, Js::ArrayBufferView::TYPE_INT32) -WASM_MEMSTORE_OPCODE(I64StoreMem, 0x37, L_IL, false, Js::ArrayBufferView::TYPE_INT64) -WASM_MEMSTORE_OPCODE(F32StoreMem, 0x38, F_IF, false, Js::ArrayBufferView::TYPE_FLOAT32) -WASM_MEMSTORE_OPCODE(F64StoreMem, 0x39, D_ID, false, Js::ArrayBufferView::TYPE_FLOAT64) -WASM_MEMSTORE_OPCODE(I32StoreMem8, 0x3a, I_II, false, Js::ArrayBufferView::TYPE_INT8) -WASM_MEMSTORE_OPCODE(I32StoreMem16, 0x3b, I_II, false, Js::ArrayBufferView::TYPE_INT16) -WASM_MEMSTORE_OPCODE(I64StoreMem8, 0x3c, L_IL, false, Js::ArrayBufferView::TYPE_INT8_TO_INT64) -WASM_MEMSTORE_OPCODE(I64StoreMem16, 0x3d, L_IL, false, Js::ArrayBufferView::TYPE_INT16_TO_INT64) -WASM_MEMSTORE_OPCODE(I64StoreMem32, 0x3e, L_IL, false, Js::ArrayBufferView::TYPE_INT32_TO_INT64) - -WASM_MISC_OPCODE(CurrentMemory, 0x3f, I_I, false) -WASM_MISC_OPCODE(GrowMemory, 0x40, I_I, false) +WASM_MEMSTORE_OPCODE(I32StoreMem, 0x36, I_II, true, Js::ArrayBufferView::TYPE_INT32, "i32.store") +WASM_MEMSTORE_OPCODE(I64StoreMem, 0x37, L_IL, true, Js::ArrayBufferView::TYPE_INT64, "i64.store") +WASM_MEMSTORE_OPCODE(F32StoreMem, 0x38, F_IF, true, Js::ArrayBufferView::TYPE_FLOAT32, "f32.store") +WASM_MEMSTORE_OPCODE(F64StoreMem, 0x39, D_ID, true, Js::ArrayBufferView::TYPE_FLOAT64, "f64.store") +WASM_MEMSTORE_OPCODE(I32StoreMem8, 0x3a, I_II, true, Js::ArrayBufferView::TYPE_INT8, "i32.store8") +WASM_MEMSTORE_OPCODE(I32StoreMem16, 0x3b, I_II, true, Js::ArrayBufferView::TYPE_INT16, "i32.store16") +WASM_MEMSTORE_OPCODE(I64StoreMem8, 0x3c, L_IL, true, Js::ArrayBufferView::TYPE_INT8_TO_INT64, "i64.store8") +WASM_MEMSTORE_OPCODE(I64StoreMem16, 0x3d, L_IL, true, Js::ArrayBufferView::TYPE_INT16_TO_INT64, "i64.store16") +WASM_MEMSTORE_OPCODE(I64StoreMem32, 0x3e, L_IL, true, Js::ArrayBufferView::TYPE_INT32_TO_INT64, "i64.store32") + +WASM_MISC_OPCODE(CurrentMemory, 0x3f, I_I, true, "current_memory") +WASM_MISC_OPCODE(GrowMemory, 0x40, I_I, true, "grow_memory") // Constants -WASM_MISC_OPCODE(I32Const, 0x41, Limit, false) -WASM_MISC_OPCODE(I64Const, 0x42, Limit, false) -WASM_MISC_OPCODE(F32Const, 0x43, Limit, false) -WASM_MISC_OPCODE(F64Const, 0x44, Limit, false) +WASM_MISC_OPCODE(I32Const, 0x41, Limit, true, "i32.const") +WASM_MISC_OPCODE(I64Const, 0x42, Limit, true, "i64.const") +WASM_MISC_OPCODE(F32Const, 0x43, Limit, true, "f32.const") +WASM_MISC_OPCODE(F64Const, 0x44, Limit, true, "f64.const") //////////////////////////////////////////////////////////// // Comparison operators -WASM_UNARY__OPCODE(I32Eqz, 0x45, I_I , Eqz_Int , false) -WASM_BINARY_OPCODE(I32Eq, 0x46, I_II, CmEq_Int , false) -WASM_BINARY_OPCODE(I32Ne, 0x47, I_II, CmNe_Int , false) -WASM_BINARY_OPCODE(I32LtS, 0x48, I_II, CmLt_Int , false) -WASM_BINARY_OPCODE(I32LtU, 0x49, I_II, CmLt_UInt , false) -WASM_BINARY_OPCODE(I32GtS, 0x4a, I_II, CmGt_Int , false) -WASM_BINARY_OPCODE(I32GtU, 0x4b, I_II, CmGt_UInt , false) -WASM_BINARY_OPCODE(I32LeS, 0x4c, I_II, CmLe_Int , false) -WASM_BINARY_OPCODE(I32LeU, 0x4d, I_II, CmLe_UInt , false) -WASM_BINARY_OPCODE(I32GeS, 0x4e, I_II, CmGe_Int , false) -WASM_BINARY_OPCODE(I32GeU, 0x4f, I_II, CmGe_UInt , false) - -WASM_UNARY__OPCODE(I64Eqz, 0x50, I_L , Eqz_Long , false) -WASM_BINARY_OPCODE(I64Eq, 0x51, I_LL, CmEq_Long , false) -WASM_BINARY_OPCODE(I64Ne, 0x52, I_LL, CmNe_Long , false) -WASM_BINARY_OPCODE(I64LtS, 0x53, I_LL, CmLt_Long , false) -WASM_BINARY_OPCODE(I64LtU, 0x54, I_LL, CmLt_ULong , false) -WASM_BINARY_OPCODE(I64GtS, 0x55, I_LL, CmGt_Long , false) -WASM_BINARY_OPCODE(I64GtU, 0x56, I_LL, CmGt_ULong , false) -WASM_BINARY_OPCODE(I64LeS, 0x57, I_LL, CmLe_Long , false) -WASM_BINARY_OPCODE(I64LeU, 0x58, I_LL, CmLe_ULong , false) -WASM_BINARY_OPCODE(I64GeS, 0x59, I_LL, CmGe_Long , false) -WASM_BINARY_OPCODE(I64GeU, 0x5a, I_LL, CmGe_ULong , false) - -WASM_BINARY_OPCODE(F32Eq, 0x5b, I_FF, CmEq_Flt , false) -WASM_BINARY_OPCODE(F32Ne, 0x5c, I_FF, CmNe_Flt , false) -WASM_BINARY_OPCODE(F32Lt, 0x5d, I_FF, CmLt_Flt , false) -WASM_BINARY_OPCODE(F32Le, 0x5f, I_FF, CmLe_Flt , false) -WASM_BINARY_OPCODE(F32Gt, 0x5e, I_FF, CmGt_Flt , false) -WASM_BINARY_OPCODE(F32Ge, 0x60, I_FF, CmGe_Flt , false) - -WASM_BINARY_OPCODE(F64Eq, 0x61, I_DD, CmEq_Db , false) -WASM_BINARY_OPCODE(F64Ne, 0x62, I_DD, CmNe_Db , false) -WASM_BINARY_OPCODE(F64Lt, 0x63, I_DD, CmLt_Db , false) -WASM_BINARY_OPCODE(F64Le, 0x65, I_DD, CmLe_Db , false) -WASM_BINARY_OPCODE(F64Gt, 0x64, I_DD, CmGt_Db , false) -WASM_BINARY_OPCODE(F64Ge, 0x66, I_DD, CmGe_Db , false) +WASM_UNARY__OPCODE(I32Eqz, 0x45, I_I , Eqz_Int , true, "i32.eqz") +WASM_BINARY_OPCODE(I32Eq, 0x46, I_II, CmEq_Int , true, "i32.eq") +WASM_BINARY_OPCODE(I32Ne, 0x47, I_II, CmNe_Int , true, "i32.ne") +WASM_BINARY_OPCODE(I32LtS, 0x48, I_II, CmLt_Int , true, "i32.lt_s") +WASM_BINARY_OPCODE(I32LtU, 0x49, I_II, CmLt_UInt , true, "i32.lt_u") +WASM_BINARY_OPCODE(I32GtS, 0x4a, I_II, CmGt_Int , true, "i32.gt_s") +WASM_BINARY_OPCODE(I32GtU, 0x4b, I_II, CmGt_UInt , true, "i32.gt_u") +WASM_BINARY_OPCODE(I32LeS, 0x4c, I_II, CmLe_Int , true, "i32.le_s") +WASM_BINARY_OPCODE(I32LeU, 0x4d, I_II, CmLe_UInt , true, "i32.le_u") +WASM_BINARY_OPCODE(I32GeS, 0x4e, I_II, CmGe_Int , true, "i32.ge_s") +WASM_BINARY_OPCODE(I32GeU, 0x4f, I_II, CmGe_UInt , true, "i32.ge_u") + +WASM_UNARY__OPCODE(I64Eqz, 0x50, I_L , Eqz_Long , true, "i64.eqz") +WASM_BINARY_OPCODE(I64Eq, 0x51, I_LL, CmEq_Long , true, "i64.eq") +WASM_BINARY_OPCODE(I64Ne, 0x52, I_LL, CmNe_Long , true, "i64.ne") +WASM_BINARY_OPCODE(I64LtS, 0x53, I_LL, CmLt_Long , true, "i64.lt_s") +WASM_BINARY_OPCODE(I64LtU, 0x54, I_LL, CmLt_ULong , true, "i64.lt_u") +WASM_BINARY_OPCODE(I64GtS, 0x55, I_LL, CmGt_Long , true, "i64.gt_s") +WASM_BINARY_OPCODE(I64GtU, 0x56, I_LL, CmGt_ULong , true, "i64.gt_u") +WASM_BINARY_OPCODE(I64LeS, 0x57, I_LL, CmLe_Long , true, "i64.le_s") +WASM_BINARY_OPCODE(I64LeU, 0x58, I_LL, CmLe_ULong , true, "i64.le_u") +WASM_BINARY_OPCODE(I64GeS, 0x59, I_LL, CmGe_Long , true, "i64.ge_s") +WASM_BINARY_OPCODE(I64GeU, 0x5a, I_LL, CmGe_ULong , true, "i64.ge_u") + +WASM_BINARY_OPCODE(F32Eq, 0x5b, I_FF, CmEq_Flt , true, "f32.eq") +WASM_BINARY_OPCODE(F32Ne, 0x5c, I_FF, CmNe_Flt , true, "f32.ne") +WASM_BINARY_OPCODE(F32Lt, 0x5d, I_FF, CmLt_Flt , true, "f32.lt") +WASM_BINARY_OPCODE(F32Gt, 0x5e, I_FF, CmGt_Flt , true, "f32.gt") +WASM_BINARY_OPCODE(F32Le, 0x5f, I_FF, CmLe_Flt , true, "f32.le") +WASM_BINARY_OPCODE(F32Ge, 0x60, I_FF, CmGe_Flt , true, "f32.ge") + +WASM_BINARY_OPCODE(F64Eq, 0x61, I_DD, CmEq_Db , true, "f64.eq") +WASM_BINARY_OPCODE(F64Ne, 0x62, I_DD, CmNe_Db , true, "f64.ne") +WASM_BINARY_OPCODE(F64Lt, 0x63, I_DD, CmLt_Db , true, "f64.lt") +WASM_BINARY_OPCODE(F64Gt, 0x64, I_DD, CmGt_Db , true, "f64.gt") +WASM_BINARY_OPCODE(F64Le, 0x65, I_DD, CmLe_Db , true, "f64.le") +WASM_BINARY_OPCODE(F64Ge, 0x66, I_DD, CmGe_Db , true, "f64.ge") //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// // Numeric operators -WASM_UNARY__OPCODE(I32Clz, 0x67, I_I , Clz32_Int , false) -WASM_UNARY__OPCODE(I32Ctz, 0x68, I_I , Ctz_Int , false) -WASM_UNARY__OPCODE(I32Popcnt, 0x69, I_I , PopCnt_Int , false) -WASM_BINARY_OPCODE(I32Add, 0x6a, I_II, Add_Int , false) -WASM_BINARY_OPCODE(I32Sub, 0x6b, I_II, Sub_Int , false) -WASM_BINARY_OPCODE(I32Mul, 0x6c, I_II, Mul_Int , false) -WASM_BINARY_OPCODE(I32DivS, 0x6d, I_II, Div_Trap_Int , false) -WASM_BINARY_OPCODE(I32DivU, 0x6e, I_II, Div_Trap_UInt , false) -WASM_BINARY_OPCODE(I32RemS, 0x6f, I_II, Rem_Trap_Int , false) -WASM_BINARY_OPCODE(I32RemU, 0x70, I_II, Rem_Trap_UInt , false) -WASM_BINARY_OPCODE(I32And, 0x71, I_II, And_Int , false) -WASM_BINARY_OPCODE(I32Or, 0x72, I_II, Or_Int , false) -WASM_BINARY_OPCODE(I32Xor, 0x73, I_II, Xor_Int , false) -WASM_BINARY_OPCODE(I32Shl, 0x74, I_II, Shl_Int , false) -WASM_BINARY_OPCODE(I32ShrS, 0x75, I_II, Shr_Int , false) -WASM_BINARY_OPCODE(I32ShrU, 0x76, I_II, Shr_UInt , false) -WASM_BINARY_OPCODE(I32Rol, 0x77, I_II, Rol_Int , false) -WASM_BINARY_OPCODE(I32Ror, 0x78, I_II, Ror_Int , false) - -WASM_UNARY__OPCODE(I64Clz, 0x79, L_L , Clz_Long , false) -WASM_UNARY__OPCODE(I64Ctz, 0x7a, L_L , Ctz_Long , false) -WASM_UNARY__OPCODE(I64Popcnt, 0x7b, L_L , PopCnt_Long , false) -WASM_BINARY_OPCODE(I64Add, 0x7c, L_LL, Add_Long , false) -WASM_BINARY_OPCODE(I64Sub, 0x7d, L_LL, Sub_Long , false) -WASM_BINARY_OPCODE(I64Mul, 0x7e, L_LL, Mul_Long , false) -WASM_BINARY_OPCODE(I64DivS, 0x7f, L_LL, Div_Trap_Long , false) -WASM_BINARY_OPCODE(I64DivU, 0x80, L_LL, Div_Trap_ULong , false) -WASM_BINARY_OPCODE(I64RemS, 0x81, L_LL, Rem_Trap_Long , false) -WASM_BINARY_OPCODE(I64RemU, 0x82, L_LL, Rem_Trap_ULong , false) -WASM_BINARY_OPCODE(I64And, 0x83, L_LL, And_Long , false) -WASM_BINARY_OPCODE(I64Or, 0x84, L_LL, Or_Long , false) -WASM_BINARY_OPCODE(I64Xor, 0x85, L_LL, Xor_Long , false) -WASM_BINARY_OPCODE(I64Shl, 0x86, L_LL, Shl_Long , false) -WASM_BINARY_OPCODE(I64ShrS, 0x87, L_LL, Shr_Long , false) -WASM_BINARY_OPCODE(I64ShrU, 0x88, L_LL, Shr_ULong , false) -WASM_BINARY_OPCODE(I64Rol, 0x89, L_LL, Rol_Long , false) -WASM_BINARY_OPCODE(I64Ror, 0x8a, L_LL, Ror_Long , false) - -WASM_UNARY__OPCODE(F32Abs, 0x8b, F_F , Abs_Flt , false) -WASM_UNARY__OPCODE(F32Neg, 0x8c, F_F , Neg_Flt , false) -WASM_UNARY__OPCODE(F32Ceil, 0x8d, F_F , Ceil_Flt , false) -WASM_UNARY__OPCODE(F32Floor, 0x8e, F_F , Floor_Flt , false) -WASM_UNARY__OPCODE(F32Trunc, 0x8f, F_F , Trunc_Flt , false) -WASM_UNARY__OPCODE(F32NearestInt, 0x90, F_F , Nearest_Flt , false) -WASM_UNARY__OPCODE(F32Sqrt, 0x91, F_F , Sqrt_Flt , false) -WASM_BINARY_OPCODE(F32Add, 0x92, F_FF, Add_Flt , false) -WASM_BINARY_OPCODE(F32Sub, 0x93, F_FF, Sub_Flt , false) -WASM_BINARY_OPCODE(F32Mul, 0x94, F_FF, Mul_Flt , false) -WASM_BINARY_OPCODE(F32Div, 0x95, F_FF, Div_Flt , false) -WASM_BINARY_OPCODE(F32Min, 0x96, F_FF, Min_Flt , false) -WASM_BINARY_OPCODE(F32Max, 0x97, F_FF, Max_Flt , false) -WASM_BINARY_OPCODE(F32CopySign, 0x98, F_FF, Copysign_Flt , false) - -WASM_UNARY__OPCODE(F64Abs, 0x99, D_D , Abs_Db , false) -WASM_UNARY__OPCODE(F64Neg, 0x9a, D_D , Neg_Db , false) -WASM_UNARY__OPCODE(F64Ceil, 0x9b, D_D , Ceil_Db , false) -WASM_UNARY__OPCODE(F64Floor, 0x9c, D_D , Floor_Db , false) -WASM_UNARY__OPCODE(F64Trunc, 0x9d, D_D , Trunc_Db , false) -WASM_UNARY__OPCODE(F64NearestInt, 0x9e, D_D , Nearest_Db , false) -WASM_UNARY__OPCODE(F64Sqrt, 0x9f, D_D , Sqrt_Db , false) -WASM_BINARY_OPCODE(F64Add, 0xa0, D_DD, Add_Db , false) -WASM_BINARY_OPCODE(F64Sub, 0xa1, D_DD, Sub_Db , false) -WASM_BINARY_OPCODE(F64Mul, 0xa2, D_DD, Mul_Db , false) -WASM_BINARY_OPCODE(F64Div, 0xa3, D_DD, Div_Db , false) -WASM_BINARY_OPCODE(F64Min, 0xa4, D_DD, Min_Db , false) -WASM_BINARY_OPCODE(F64Max, 0xa5, D_DD, Max_Db , false) -WASM_BINARY_OPCODE(F64CopySign, 0xa6, D_DD, Copysign_Db , false) +WASM_UNARY__OPCODE(I32Clz, 0x67, I_I , Clz32_Int , true, "i32.clz") +WASM_UNARY__OPCODE(I32Ctz, 0x68, I_I , Ctz_Int , true, "i32.ctz") +WASM_UNARY__OPCODE(I32Popcnt, 0x69, I_I , PopCnt_Int , true, "i32.popcnt") +WASM_BINARY_OPCODE(I32Add, 0x6a, I_II, Add_Int , true, "i32.add") +WASM_BINARY_OPCODE(I32Sub, 0x6b, I_II, Sub_Int , true, "i32.sub") +WASM_BINARY_OPCODE(I32Mul, 0x6c, I_II, Mul_Int , true, "i32.mul") +WASM_BINARY_OPCODE(I32DivS, 0x6d, I_II, Div_Trap_Int , true, "i32.div_s") +WASM_BINARY_OPCODE(I32DivU, 0x6e, I_II, Div_Trap_UInt , true, "i32.div_u") +WASM_BINARY_OPCODE(I32RemS, 0x6f, I_II, Rem_Trap_Int , true, "i32.rem_s") +WASM_BINARY_OPCODE(I32RemU, 0x70, I_II, Rem_Trap_UInt , true, "i32.rem_u") +WASM_BINARY_OPCODE(I32And, 0x71, I_II, And_Int , true, "i32.and") +WASM_BINARY_OPCODE(I32Or, 0x72, I_II, Or_Int , true, "i32.or") +WASM_BINARY_OPCODE(I32Xor, 0x73, I_II, Xor_Int , true, "i32.xor") +WASM_BINARY_OPCODE(I32Shl, 0x74, I_II, Shl_Int , true, "i32.shl") +WASM_BINARY_OPCODE(I32ShrS, 0x75, I_II, Shr_Int , true, "i32.shr_s") +WASM_BINARY_OPCODE(I32ShrU, 0x76, I_II, Shr_UInt , true, "i32.shr_u") +WASM_BINARY_OPCODE(I32Rol, 0x77, I_II, Rol_Int , true, "i32.rotl") +WASM_BINARY_OPCODE(I32Ror, 0x78, I_II, Ror_Int , true, "i32.rotr") + +WASM_UNARY__OPCODE(I64Clz, 0x79, L_L , Clz_Long , true, "i64.clz") +WASM_UNARY__OPCODE(I64Ctz, 0x7a, L_L , Ctz_Long , true, "i64.ctz") +WASM_UNARY__OPCODE(I64Popcnt, 0x7b, L_L , PopCnt_Long , true, "i64.popcnt") +WASM_BINARY_OPCODE(I64Add, 0x7c, L_LL, Add_Long , true, "i64.add") +WASM_BINARY_OPCODE(I64Sub, 0x7d, L_LL, Sub_Long , true, "i64.sub") +WASM_BINARY_OPCODE(I64Mul, 0x7e, L_LL, Mul_Long , true, "i64.mul") +WASM_BINARY_OPCODE(I64DivS, 0x7f, L_LL, Div_Trap_Long , true, "i64.div_s") +WASM_BINARY_OPCODE(I64DivU, 0x80, L_LL, Div_Trap_ULong , true, "i64.div_u") +WASM_BINARY_OPCODE(I64RemS, 0x81, L_LL, Rem_Trap_Long , true, "i64.rem_s") +WASM_BINARY_OPCODE(I64RemU, 0x82, L_LL, Rem_Trap_ULong , true, "i64.rem_u") +WASM_BINARY_OPCODE(I64And, 0x83, L_LL, And_Long , true, "i64.and") +WASM_BINARY_OPCODE(I64Or, 0x84, L_LL, Or_Long , true, "i64.or") +WASM_BINARY_OPCODE(I64Xor, 0x85, L_LL, Xor_Long , true, "i64.xor") +WASM_BINARY_OPCODE(I64Shl, 0x86, L_LL, Shl_Long , true, "i64.shl") +WASM_BINARY_OPCODE(I64ShrS, 0x87, L_LL, Shr_Long , true, "i64.shr_s") +WASM_BINARY_OPCODE(I64ShrU, 0x88, L_LL, Shr_ULong , true, "i64.shr_u") +WASM_BINARY_OPCODE(I64Rol, 0x89, L_LL, Rol_Long , true, "i64.rotl") +WASM_BINARY_OPCODE(I64Ror, 0x8a, L_LL, Ror_Long , true, "i64.rotr") + +WASM_UNARY__OPCODE(F32Abs, 0x8b, F_F , Abs_Flt , true, "f32.abs") +WASM_UNARY__OPCODE(F32Neg, 0x8c, F_F , Neg_Flt , true, "f32.neg") +WASM_UNARY__OPCODE(F32Ceil, 0x8d, F_F , Ceil_Flt , true, "f32.ceil") +WASM_UNARY__OPCODE(F32Floor, 0x8e, F_F , Floor_Flt , true, "f32.floor") +WASM_UNARY__OPCODE(F32Trunc, 0x8f, F_F , Trunc_Flt , true, "f32.trunc") +WASM_UNARY__OPCODE(F32NearestInt, 0x90, F_F , Nearest_Flt , true, "f32.nearest") +WASM_UNARY__OPCODE(F32Sqrt, 0x91, F_F , Sqrt_Flt , true, "f32.sqrt") +WASM_BINARY_OPCODE(F32Add, 0x92, F_FF, Add_Flt , true, "f32.add") +WASM_BINARY_OPCODE(F32Sub, 0x93, F_FF, Sub_Flt , true, "f32.sub") +WASM_BINARY_OPCODE(F32Mul, 0x94, F_FF, Mul_Flt , true, "f32.mul") +WASM_BINARY_OPCODE(F32Div, 0x95, F_FF, Div_Flt , true, "f32.div") +WASM_BINARY_OPCODE(F32Min, 0x96, F_FF, Min_Flt , true, "f32.min") +WASM_BINARY_OPCODE(F32Max, 0x97, F_FF, Max_Flt , true, "f32.max") +WASM_BINARY_OPCODE(F32CopySign, 0x98, F_FF, Copysign_Flt , true, "f32.copysign") + +WASM_UNARY__OPCODE(F64Abs, 0x99, D_D , Abs_Db , true, "f64.abs") +WASM_UNARY__OPCODE(F64Neg, 0x9a, D_D , Neg_Db , true, "f64.neg") +WASM_UNARY__OPCODE(F64Ceil, 0x9b, D_D , Ceil_Db , true, "f64.ceil") +WASM_UNARY__OPCODE(F64Floor, 0x9c, D_D , Floor_Db , true, "f64.floor") +WASM_UNARY__OPCODE(F64Trunc, 0x9d, D_D , Trunc_Db , true, "f64.trunc") +WASM_UNARY__OPCODE(F64NearestInt, 0x9e, D_D , Nearest_Db , true, "f64.nearest") +WASM_UNARY__OPCODE(F64Sqrt, 0x9f, D_D , Sqrt_Db , true, "f64.sqrt") +WASM_BINARY_OPCODE(F64Add, 0xa0, D_DD, Add_Db , true, "f64.add") +WASM_BINARY_OPCODE(F64Sub, 0xa1, D_DD, Sub_Db , true, "f64.sub") +WASM_BINARY_OPCODE(F64Mul, 0xa2, D_DD, Mul_Db , true, "f64.mul") +WASM_BINARY_OPCODE(F64Div, 0xa3, D_DD, Div_Db , true, "f64.div") +WASM_BINARY_OPCODE(F64Min, 0xa4, D_DD, Min_Db , true, "f64.min") +WASM_BINARY_OPCODE(F64Max, 0xa5, D_DD, Max_Db , true, "f64.max") +WASM_BINARY_OPCODE(F64CopySign, 0xa6, D_DD, Copysign_Db , true, "f64.copysign") //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// // Conversions -WASM_UNARY__OPCODE(I32Wrap_I64, 0xa7, I_L , Conv_LTI , false) -WASM_UNARY__OPCODE(I32TruncS_F32, 0xa8, I_F , Conv_Check_FTI , false) -WASM_UNARY__OPCODE(I32TruncU_F32, 0xa9, I_F , Conv_Check_FTU , false) -WASM_UNARY__OPCODE(I32TruncS_F64, 0xaa, I_D , Conv_Check_DTI , false) -WASM_UNARY__OPCODE(I32TruncU_F64, 0xab, I_D , Conv_Check_DTU , false) - -WASM_UNARY__OPCODE(I64ExtendS_I32, 0xac, L_I , Conv_ITL , false) -WASM_UNARY__OPCODE(I64ExtendU_I32, 0xad, L_I , Conv_UTL , false) -WASM_UNARY__OPCODE(I64TruncS_F32, 0xae, L_F , Conv_Check_FTL , false) -WASM_UNARY__OPCODE(I64TruncU_F32, 0xaf, L_F , Conv_Check_FTUL, false) -WASM_UNARY__OPCODE(I64TruncS_F64, 0xb0, L_D , Conv_Check_DTL , false) -WASM_UNARY__OPCODE(I64TruncU_F64, 0xb1, L_D , Conv_Check_DTUL, false) - -WASM_UNARY__OPCODE(F32SConvertI32, 0xb2, F_I , Fround_Int , false) -WASM_UNARY__OPCODE(F32UConvertI32, 0xb3, F_I , Conv_UTF , false) -WASM_UNARY__OPCODE(F32SConvertI64, 0xb4, F_L , Conv_LTF , false) -WASM_UNARY__OPCODE(F32UConvertI64, 0xb5, F_L , Conv_ULTF , false) -WASM_UNARY__OPCODE(F32DemoteF64, 0xb6, F_D , Fround_Db , false) - -WASM_UNARY__OPCODE(F64SConvertI32, 0xb7, D_I , Conv_ITD , false) -WASM_UNARY__OPCODE(F64UConvertI32, 0xb8, D_I , Conv_UTD , false) -WASM_UNARY__OPCODE(F64SConvertI64, 0xb9, D_L , Conv_LTD , false) -WASM_UNARY__OPCODE(F64UConvertI64, 0xba, D_L , Conv_ULTD , false) -WASM_UNARY__OPCODE(F64PromoteF32, 0xbb, D_F , Conv_FTD , false) +WASM_UNARY__OPCODE(I32Wrap_I64, 0xa7, I_L , Conv_LTI , true, "i32.wrap/i64") +WASM_UNARY__OPCODE(I32TruncS_F32, 0xa8, I_F , Conv_Check_FTI , true, "i32.trunc_s/f32") +WASM_UNARY__OPCODE(I32TruncU_F32, 0xa9, I_F , Conv_Check_FTU , true, "i32.trunc_u/f32") +WASM_UNARY__OPCODE(I32TruncS_F64, 0xaa, I_D , Conv_Check_DTI , true, "i32.trunc_s/f64") +WASM_UNARY__OPCODE(I32TruncU_F64, 0xab, I_D , Conv_Check_DTU , true, "i32.trunc_u/f64") + +WASM_UNARY__OPCODE(I64ExtendS_I32, 0xac, L_I , Conv_ITL , true, "i64.extend_s/i32") +WASM_UNARY__OPCODE(I64ExtendU_I32, 0xad, L_I , Conv_UTL , true, "i64.extend_u/i32") +WASM_UNARY__OPCODE(I64TruncS_F32, 0xae, L_F , Conv_Check_FTL , true, "i64.trunc_s/f32") +WASM_UNARY__OPCODE(I64TruncU_F32, 0xaf, L_F , Conv_Check_FTUL, true, "i64.trunc_u/f32") +WASM_UNARY__OPCODE(I64TruncS_F64, 0xb0, L_D , Conv_Check_DTL , true, "i64.trunc_s/f64") +WASM_UNARY__OPCODE(I64TruncU_F64, 0xb1, L_D , Conv_Check_DTUL, true, "i64.trunc_u/f64") + +WASM_UNARY__OPCODE(F32SConvertI32, 0xb2, F_I , Fround_Int , true, "f32.convert_s/i32") +WASM_UNARY__OPCODE(F32UConvertI32, 0xb3, F_I , Conv_UTF , true, "f32.convert_u/i32") +WASM_UNARY__OPCODE(F32SConvertI64, 0xb4, F_L , Conv_LTF , true, "f32.convert_s/i64") +WASM_UNARY__OPCODE(F32UConvertI64, 0xb5, F_L , Conv_ULTF , true, "f32.convert_u/i64") +WASM_UNARY__OPCODE(F32DemoteF64, 0xb6, F_D , Fround_Db , true, "f32.demote/f64") + +WASM_UNARY__OPCODE(F64SConvertI32, 0xb7, D_I , Conv_ITD , true, "f64.convert_s/i32") +WASM_UNARY__OPCODE(F64UConvertI32, 0xb8, D_I , Conv_UTD , true, "f64.convert_u/i32") +WASM_UNARY__OPCODE(F64SConvertI64, 0xb9, D_L , Conv_LTD , true, "f64.convert_s/i64") +WASM_UNARY__OPCODE(F64UConvertI64, 0xba, D_L , Conv_ULTD , true, "f64.convert_u/i64") +WASM_UNARY__OPCODE(F64PromoteF32, 0xbb, D_F , Conv_FTD , true, "f64.promote/f32") //////////////////////////////////////////////////////////// // Reinterpretations -WASM_UNARY__OPCODE(I32ReinterpretF32, 0xbc, I_F , Reinterpret_FTI, false) -WASM_UNARY__OPCODE(I64ReinterpretF64, 0xbd, L_D , Reinterpret_DTL, false) -WASM_UNARY__OPCODE(F32ReinterpretI32, 0xbe, F_I , Reinterpret_ITF, false) -WASM_UNARY__OPCODE(F64ReinterpretI64, 0xbf, D_L , Reinterpret_LTD, false) +WASM_UNARY__OPCODE(I32ReinterpretF32, 0xbc, I_F , Reinterpret_FTI, true, "i32.reinterpret/f32") +WASM_UNARY__OPCODE(I64ReinterpretF64, 0xbd, L_D , Reinterpret_DTL, true, "i64.reinterpret/f64") +WASM_UNARY__OPCODE(F32ReinterpretI32, 0xbe, F_I , Reinterpret_ITF, true, "f32.reinterpret/i32") +WASM_UNARY__OPCODE(F64ReinterpretI64, 0xbf, D_L , Reinterpret_LTD, true, "f64.reinterpret/i64") + +// New sign extend operators +WASM_UNARY__OPCODE(I32Extend8_s , 0xc0, I_I, I32Extend8_s , CONFIG_FLAG(WasmSignExtends), "i32.extend8_s") +WASM_UNARY__OPCODE(I32Extend16_s, 0xc1, I_I, I32Extend16_s, CONFIG_FLAG(WasmSignExtends), "i32.extend16_s") +WASM_UNARY__OPCODE(I64Extend8_s , 0xc2, L_L, I64Extend8_s , CONFIG_FLAG(WasmSignExtends), "i64.extend8_s") +WASM_UNARY__OPCODE(I64Extend16_s, 0xc3, L_L, I64Extend16_s, CONFIG_FLAG(WasmSignExtends), "i64.extend16_s") +WASM_UNARY__OPCODE(I64Extend32_s, 0xc4, L_L, I64Extend32_s, CONFIG_FLAG(WasmSignExtends), "i64.extend32_s") #if ENABLE_DEBUG_CONFIG_OPTIONS -WASM_UNARY__OPCODE(PrintFuncName , 0xf0, V_I , PrintFuncName , false) -WASM_EMPTY__OPCODE(PrintArgSeparator, 0xf1, PrintArgSeparator, false) -WASM_EMPTY__OPCODE(PrintBeginCall , 0xf2, PrintBeginCall , false) -WASM_EMPTY__OPCODE(PrintNewLine , 0xf3, PrintNewLine , false) -WASM_UNARY__OPCODE(PrintEndCall , 0xf4, V_I , PrintEndCall , false) -WASM_UNARY__OPCODE(PrintI32 , 0xfc, I_I , PrintI32 , false) -WASM_UNARY__OPCODE(PrintI64 , 0xfd, L_L , PrintI64 , false) -WASM_UNARY__OPCODE(PrintF32 , 0xfe, F_F , PrintF32 , false) -WASM_UNARY__OPCODE(PrintF64 , 0xff, D_D , PrintF64 , false) +#define __prefix (WASM_PREFIX_TRACING << 8) +WASM_UNARY__OPCODE(PrintFuncName , __prefix | 0x00, V_I , PrintFuncName , true, "") +WASM_EMPTY__OPCODE(PrintArgSeparator, __prefix | 0x01, PrintArgSeparator, true, "") +WASM_EMPTY__OPCODE(PrintBeginCall , __prefix | 0x02, PrintBeginCall , true, "") +WASM_EMPTY__OPCODE(PrintNewLine , __prefix | 0x03, PrintNewLine , true, "") +WASM_UNARY__OPCODE(PrintEndCall , __prefix | 0x04, V_I , PrintEndCall , true, "") +WASM_UNARY__OPCODE(PrintI32 , __prefix | 0x0c, I_I , PrintI32 , true, "") +WASM_UNARY__OPCODE(PrintI64 , __prefix | 0x0d, L_L , PrintI64 , true, "") +WASM_UNARY__OPCODE(PrintF32 , __prefix | 0x0e, F_F , PrintF32 , true, "") +WASM_UNARY__OPCODE(PrintF64 , __prefix | 0x0f, D_D , PrintF64 , true, "") +#undef __prefix +#endif + +//Simd +#ifdef ENABLE_WASM_SIMD +#include "WasmBinaryOpcodesSimd.h" #endif +#undef WASM_PREFIX_TRACING +#undef WASM_PREFIX #undef WASM_OPCODE #undef WASM_SIGNATURE #undef WASM_CTRL_OPCODE @@ -315,6 +354,9 @@ WASM_UNARY__OPCODE(PrintF64 , 0xff, D_D , PrintF64 , false) #undef WASM_MEM_OPCODE #undef WASM_MEMREAD_OPCODE #undef WASM_MEMSTORE_OPCODE +#undef WASM_ATOMIC_OPCODE +#undef WASM_ATOMICREAD_OPCODE +#undef WASM_ATOMICSTORE_OPCODE #undef WASM_UNARY__OPCODE #undef WASM_BINARY_OPCODE #undef WASM_EMPTY__OPCODE \ No newline at end of file diff --git a/deps/chakrashim/core/lib/WasmReader/WasmBinaryOpcodesSimd.h b/deps/chakrashim/core/lib/WasmReader/WasmBinaryOpcodesSimd.h new file mode 100644 index 00000000000..66d639a8e72 --- /dev/null +++ b/deps/chakrashim/core/lib/WasmReader/WasmBinaryOpcodesSimd.h @@ -0,0 +1,195 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#ifndef WASM_LANE_OPCODE +#define WASM_LANE_OPCODE(opname, opcode, sig, imp, wat) WASM_OPCODE(opname, opcode, sig, imp, wat) +#endif + +#ifndef WASM_EXTRACTLANE_OPCODE +#define WASM_EXTRACTLANE_OPCODE(opname, opcode, sig, asmjsop, imp, wat) WASM_LANE_OPCODE(opname, opcode, sig, imp, wat) +#endif + +#ifndef WASM_REPLACELANE_OPCODE +#define WASM_REPLACELANE_OPCODE(opname, opcode, sig, asmjsop, imp, wat) WASM_LANE_OPCODE(opname, opcode, sig, imp, wat) +#endif + +#ifndef WASM_SIMD_BUILD_OPCODE +#define WASM_SIMD_BUILD_OPCODE(opname, opcode, sig, asmjop, lanes, imp, wat) WASM_OPCODE(opname, opcode, sig, imp, wat) +#endif + +#ifndef WASM_SIMD_MEMREAD_OPCODE +#define WASM_SIMD_MEMREAD_OPCODE(opname, opcode, sig, asmjsop, viewtype, dataWidth, imp, wat) WASM_MEM_OPCODE(opname, opcode, sig, imp, wat) +#endif + +#ifndef WASM_SIMD_MEMSTORE_OPCODE +#define WASM_SIMD_MEMSTORE_OPCODE(opname, opcode, sig, asmjsop, viewtype, dataWidth, imp, wat) WASM_MEM_OPCODE(opname, opcode, sig, imp, wat) +#endif + +#define WASM_PREFIX_SIMD 0xfd +WASM_PREFIX(Simd, WASM_PREFIX_SIMD, Wasm::Simd::IsEnabled(), "WebAssembly Simd support is not enabled") + +//SIMD Signatures +WASM_SIGNATURE(F_M128, 2, WasmTypes::F32, WasmTypes::M128) +WASM_SIGNATURE(I_M128, 2, WasmTypes::I32, WasmTypes::M128) +WASM_SIGNATURE(M128_I, 2, WasmTypes::M128, WasmTypes::I32) +WASM_SIGNATURE(M128_F, 2, WasmTypes::M128, WasmTypes::F32) +WASM_SIGNATURE(M128_L, 2, WasmTypes::M128, WasmTypes::I64) +WASM_SIGNATURE(M128_D, 2, WasmTypes::M128, WasmTypes::F64) +WASM_SIGNATURE(M128X3, 3, WasmTypes::M128, WasmTypes::M128, WasmTypes::M128) +WASM_SIGNATURE(M128_M128_I, 3, WasmTypes::M128, WasmTypes::M128, WasmTypes::I32) +WASM_SIGNATURE(M128_M128, 2, WasmTypes::M128, WasmTypes::M128) +WASM_SIGNATURE(L_M128, 2, WasmTypes::I64, WasmTypes::M128) +WASM_SIGNATURE(D_M128_I, 3, WasmTypes::F64, WasmTypes::M128, WasmTypes::I32) + +#define __prefix (WASM_PREFIX_SIMD << 8) +WASM_MISC_OPCODE(M128Const, __prefix | 0x00, Limit, true, "v128.const") +WASM_SIMD_MEMREAD_OPCODE(M128Load, __prefix | 0x01, M128_I, Simd128_LdArr_F4, Js::ArrayBufferView::TYPE_FLOAT32, 16, true, "v128.load") +WASM_SIMD_MEMSTORE_OPCODE(M128Store, __prefix | 0x02, M128_I, Simd128_StArr_F4, Js::ArrayBufferView::TYPE_FLOAT32, 16, true, "v128.store") +WASM_UNARY__OPCODE(I16Splat, __prefix | 0x03, M128_I, Simd128_Splat_I16, true, "i8x16.splat") +WASM_UNARY__OPCODE(I8Splat, __prefix | 0x04, M128_I, Simd128_Splat_I8, true, "i16x8.splat") +WASM_UNARY__OPCODE(I4Splat, __prefix | 0x05, M128_I, Simd128_Splat_I4, true, "i32x4.splat") +WASM_UNARY__OPCODE(I2Splat, __prefix | 0x06, M128_L, Simd128_Splat_I2, true, "i64x2.splat") +WASM_UNARY__OPCODE(F4Splat, __prefix | 0x07, M128_F, Simd128_Splat_F4, true, "f32x4.splat") +WASM_UNARY__OPCODE(F2Splat, __prefix | 0x08, M128_D, Simd128_Splat_D2, true, "f64x2.splat") +WASM_EXTRACTLANE_OPCODE(I16ExtractLaneS, __prefix | 0x09, I_M128, Simd128_ExtractLane_I16, true, "i8x16.extract_lane_s") +WASM_EXTRACTLANE_OPCODE(I16ExtractLaneU, __prefix | 0x0a, I_M128, Simd128_ExtractLane_U16, true, "i8x16.extract_lane_u") +WASM_EXTRACTLANE_OPCODE(I8ExtractLaneS, __prefix | 0x0b, I_M128, Simd128_ExtractLane_I8, true, "i16x8.extract_lane_s") +WASM_EXTRACTLANE_OPCODE(I8ExtractLaneU, __prefix | 0x0c, I_M128, Simd128_ExtractLane_U8, true, "i16x8.extract_lane_u") +WASM_EXTRACTLANE_OPCODE(I4ExtractLane, __prefix | 0x0d, I_M128, Simd128_ExtractLane_I4, true, "i32x4.extract_lane") +WASM_EXTRACTLANE_OPCODE(I2ExtractLane, __prefix | 0x0e, L_M128, Simd128_ExtractLane_I2, true, "i64x2.extract_lane") +WASM_EXTRACTLANE_OPCODE(F4ExtractLane, __prefix | 0x0f, I_M128, Simd128_ExtractLane_F4, true, "f32x4.extract_lane") +WASM_BINARY_OPCODE(F2ExtractLane, __prefix | 0x10, D_M128_I, Simd128_ExtractLane_D2, true, "f64x2.extract_lane") +WASM_REPLACELANE_OPCODE(I16ReplaceLane, __prefix | 0x11, M128_I, Simd128_ReplaceLane_I16, true, "i8x16.replace_lane") +WASM_REPLACELANE_OPCODE(I8ReplaceLane, __prefix | 0x12, M128_I, Simd128_ReplaceLane_I8, true, "i16x8.replace_lane") +WASM_REPLACELANE_OPCODE(I4ReplaceLane, __prefix | 0x13, M128_I, Simd128_ReplaceLane_I4, true, "i32x4.replace_lane") +WASM_REPLACELANE_OPCODE(I2ReplaceLane, __prefix | 0x14, M128_L, Simd128_ReplaceLane_I2, true, "i64x2.replace_lane") +WASM_REPLACELANE_OPCODE(F4ReplaceLane, __prefix | 0x15, M128_F, Simd128_ReplaceLane_F4, true, "f32x4.replace_lane") +WASM_REPLACELANE_OPCODE(F2ReplaceLane, __prefix | 0x16, M128_D, Simd128_ReplaceLane_D2, true, "f64x2.replace_lane") +WASM_MISC_OPCODE(V8X16Shuffle, __prefix | 0x17, Limit, true, "v8x16.shuffle") +WASM_BINARY_OPCODE(I16Add, __prefix | 0x18, M128X3, Simd128_Add_I16, true, "i8x16.add") +WASM_BINARY_OPCODE(I8Add, __prefix | 0x19, M128X3, Simd128_Add_I8, true, "i16x8.add") +WASM_BINARY_OPCODE(I4Add, __prefix | 0x1a, M128X3, Simd128_Add_I4, true, "i32x4.add") +WASM_BINARY_OPCODE(I2Add, __prefix | 0x1b, M128X3, Simd128_Add_I2, true, "i64x2.add") +WASM_BINARY_OPCODE(I16Sub, __prefix | 0x1c, M128X3, Simd128_Sub_I16, true, "i8x16.sub") +WASM_BINARY_OPCODE(I8Sub, __prefix | 0x1d, M128X3, Simd128_Sub_I8, true, "i16x8.sub") +WASM_BINARY_OPCODE(I4Sub, __prefix | 0x1e, M128X3, Simd128_Sub_I4, true, "i32x4.sub") +WASM_BINARY_OPCODE(I2Sub, __prefix | 0x1f, M128X3, Simd128_Sub_I2, true, "i64x2.sub") +WASM_BINARY_OPCODE(I16Mul, __prefix | 0x20, M128X3, Simd128_Mul_I16, true, "i8x16.mul") +WASM_BINARY_OPCODE(I8Mul, __prefix | 0x21, M128X3, Simd128_Mul_I8, true, "i16x8.mul") +WASM_BINARY_OPCODE(I4Mul, __prefix | 0x22, M128X3, Simd128_Mul_I4, true, "i32x4.mul") +WASM_UNARY__OPCODE(I16Neg, __prefix | 0x23, M128_M128, Simd128_Neg_I16, true, "i8x16.neg") +WASM_UNARY__OPCODE(I8Neg, __prefix | 0x24, M128_M128, Simd128_Neg_I8, true, "i16x8.neg") +WASM_UNARY__OPCODE(I4Neg, __prefix | 0x25, M128_M128, Simd128_Neg_I4, true, "i32x4.neg") +WASM_UNARY__OPCODE(I2Neg, __prefix | 0x26, M128_M128, Simd128_Neg_I2, true, "i64x2.neg") +WASM_BINARY_OPCODE(I16AddSaturateS, __prefix | 0x27, M128X3, Simd128_AddSaturate_I16, true, "i8x16.add_saturate_s") +WASM_BINARY_OPCODE(I16AddSaturateU, __prefix | 0x28, M128X3, Simd128_AddSaturate_U16, true, "i8x16.add_saturate_u") +WASM_BINARY_OPCODE(I8AddSaturateS, __prefix | 0x29, M128X3, Simd128_AddSaturate_I8, true, "i16x8.add_saturate_s") +WASM_BINARY_OPCODE(I8AddSaturateU, __prefix | 0x2a, M128X3, Simd128_AddSaturate_U8, true, "i16x8.add_saturate_u") +WASM_BINARY_OPCODE(I16SubSaturateS, __prefix | 0x2b, M128X3, Simd128_SubSaturate_I16, true, "i8x16.sub_saturate_s") +WASM_BINARY_OPCODE(I16SubSaturateU, __prefix | 0x2c, M128X3, Simd128_SubSaturate_U16, true, "i8x16.sub_saturate_u") +WASM_BINARY_OPCODE(I8SubSaturateS, __prefix | 0x2d, M128X3, Simd128_SubSaturate_I8, true, "i16x8.sub_saturate_s") +WASM_BINARY_OPCODE(I8SubSaturateU, __prefix | 0x2e, M128X3, Simd128_SubSaturate_U8, true, "i16x8.sub_saturate_u") +WASM_BINARY_OPCODE(I16Shl, __prefix | 0x2f, M128_M128_I, Simd128_ShLtByScalar_I16, true, "i8x16.shl") +WASM_BINARY_OPCODE(I8Shl, __prefix | 0x30, M128_M128_I, Simd128_ShLtByScalar_I8, true, "i16x8.shl") +WASM_BINARY_OPCODE(I4Shl, __prefix | 0x31, M128_M128_I, Simd128_ShLtByScalar_I4, true, "i32x4.shl") +WASM_BINARY_OPCODE(I2Shl, __prefix | 0x32, M128_M128_I, Simd128_ShLtByScalar_I2, true, "i64x2.shl") +WASM_BINARY_OPCODE(I16ShrS, __prefix | 0x33, M128_M128_I, Simd128_ShRtByScalar_I16, true, "i8x16.shr_s") +WASM_BINARY_OPCODE(I16ShrU, __prefix | 0x34, M128_M128_I, Simd128_ShRtByScalar_U16, true, "i8x16.shr_u") +WASM_BINARY_OPCODE(I8ShrS, __prefix | 0x35, M128_M128_I, Simd128_ShRtByScalar_I8, true, "i16x8.shr_s") +WASM_BINARY_OPCODE(I8ShrU, __prefix | 0x36, M128_M128_I, Simd128_ShRtByScalar_U8, true, "i16x8.shr_u") +WASM_BINARY_OPCODE(I4ShrS, __prefix | 0x37, M128_M128_I, Simd128_ShRtByScalar_I4, true, "i32x4.shr_s") +WASM_BINARY_OPCODE(I4ShrU, __prefix | 0x38, M128_M128_I, Simd128_ShRtByScalar_U4, true, "i32x4.shr_u") +WASM_BINARY_OPCODE(I2ShrS, __prefix | 0x39, M128_M128_I, Simd128_ShRtByScalar_I2, true, "i64x2.shr_s") +WASM_BINARY_OPCODE(I2ShrU, __prefix | 0x3a, M128_M128_I, Simd128_ShRtByScalar_U2, true, "i64x2.shr_u") +WASM_BINARY_OPCODE(M128And, __prefix | 0x3b, M128X3, Simd128_And_I4, true, "v128.and") +WASM_BINARY_OPCODE(M128Or, __prefix | 0x3c, M128X3, Simd128_Or_I4, true, "v128.or") +WASM_BINARY_OPCODE(M128Xor, __prefix | 0x3d, M128X3, Simd128_Xor_I4, true, "v128.xor") +WASM_UNARY__OPCODE(M128Not, __prefix | 0x3e, M128_M128, Simd128_Not_I4, true, "v128.not") +WASM_MISC_OPCODE(M128Bitselect, __prefix | 0x3f, Limit, true, "v128.bitselect") +WASM_UNARY__OPCODE(I16AnyTrue, __prefix | 0x40, I_M128, Simd128_AnyTrue_B16, true, "i8x16.any_true") +WASM_UNARY__OPCODE(I8AnyTrue, __prefix | 0x41, I_M128, Simd128_AnyTrue_B8, true, "i16x8.any_true") +WASM_UNARY__OPCODE(I4AnyTrue, __prefix | 0x42, I_M128, Simd128_AnyTrue_B4, true, "i32x4.any_true") +WASM_UNARY__OPCODE(I2AnyTrue, __prefix | 0x43, I_M128, Simd128_AnyTrue_B2, true, "i64x2.any_true") +WASM_UNARY__OPCODE(I16AllTrue, __prefix | 0x44, I_M128, Simd128_AllTrue_B16, true, "i8x16.all_true") +WASM_UNARY__OPCODE(I8AllTrue, __prefix | 0x45, I_M128, Simd128_AllTrue_B8, true, "i16x8.all_true") +WASM_UNARY__OPCODE(I4AllTrue, __prefix | 0x46, I_M128, Simd128_AllTrue_B4, true, "i32x4.all_true") +WASM_UNARY__OPCODE(I2AllTrue, __prefix | 0x47, I_M128, Simd128_AllTrue_B2, true, "i64x2.all_true") +WASM_BINARY_OPCODE(I16Eq, __prefix | 0x48, M128X3, Simd128_Eq_I16, true, "i8x16.eq") +WASM_BINARY_OPCODE(I8Eq, __prefix | 0x49, M128X3, Simd128_Eq_I8, true, "i16x8.eq") +WASM_BINARY_OPCODE(I4Eq, __prefix | 0x4a, M128X3, Simd128_Eq_I4, true, "i32x4.eq") +WASM_BINARY_OPCODE(F4Eq, __prefix | 0x4b, M128X3, Simd128_Eq_F4, true, "f32x4.eq") +WASM_BINARY_OPCODE(F2Eq, __prefix | 0x4c, M128X3, Simd128_Eq_D2, true, "f64x2.eq") +WASM_BINARY_OPCODE(I16Ne, __prefix | 0x4d, M128X3, Simd128_Neq_I16, true, "i8x16.ne") +WASM_BINARY_OPCODE(I8Ne, __prefix | 0x4e, M128X3, Simd128_Neq_I8, true, "i16x8.ne") +WASM_BINARY_OPCODE(I4Ne, __prefix | 0x4f, M128X3, Simd128_Neq_I4, true, "i32x4.ne") +WASM_BINARY_OPCODE(F4Ne, __prefix | 0x50, M128X3, Simd128_Neq_F4, true, "f32x4.ne") +WASM_BINARY_OPCODE(F2Ne, __prefix | 0x51, M128X3, Simd128_Neq_D2, true, "f64x2.ne") +WASM_BINARY_OPCODE(I16LtS, __prefix | 0x52, M128X3, Simd128_Lt_I16, true, "i8x16.lt_s") +WASM_BINARY_OPCODE(I16LtU, __prefix | 0x53, M128X3, Simd128_Lt_U16, true, "i8x16.lt_u") +WASM_BINARY_OPCODE(I8LtS, __prefix | 0x54, M128X3, Simd128_Lt_I8, true, "i16x8.lt_s") +WASM_BINARY_OPCODE(I8LtU, __prefix | 0x55, M128X3, Simd128_Lt_U8, true, "i16x8.lt_u") +WASM_BINARY_OPCODE(I4LtS, __prefix | 0x56, M128X3, Simd128_Lt_I4, true, "i32x4.lt_s") +WASM_BINARY_OPCODE(I4LtU, __prefix | 0x57, M128X3, Simd128_Lt_U4, true, "i32x4.lt_u") +WASM_BINARY_OPCODE(F4Lt, __prefix | 0x58, M128X3, Simd128_Lt_F4, true, "f32x4.lt") +WASM_BINARY_OPCODE(F2Lt, __prefix | 0x59, M128X3, Simd128_Lt_D2, true, "f64x2.lt") +WASM_BINARY_OPCODE(I16LeS, __prefix | 0x5a, M128X3, Simd128_LtEq_I16, true, "i8x16.le_s") +WASM_BINARY_OPCODE(I16LeU, __prefix | 0x5b, M128X3, Simd128_LtEq_U16, true, "i8x16.le_u") +WASM_BINARY_OPCODE(I8LeS, __prefix | 0x5c, M128X3, Simd128_LtEq_I8, true, "i16x8.le_s") +WASM_BINARY_OPCODE(I8LeU, __prefix | 0x5d, M128X3, Simd128_LtEq_U8, true, "i16x8.le_u") +WASM_BINARY_OPCODE(I4LeS, __prefix | 0x5e, M128X3, Simd128_LtEq_I4, true, "i32x4.le_s") +WASM_BINARY_OPCODE(I4LeU, __prefix | 0x5f, M128X3, Simd128_LtEq_U4, true, "i32x4.le_u") +WASM_BINARY_OPCODE(F4Le, __prefix | 0x60, M128X3, Simd128_LtEq_F4, true, "f32x4.le") +WASM_BINARY_OPCODE(F2Le, __prefix | 0x61, M128X3, Simd128_LtEq_D2, true, "f64x2.le") +WASM_BINARY_OPCODE(I16GtS, __prefix | 0x62, M128X3, Simd128_Gt_I16, true, "i8x16.gt_s") +WASM_BINARY_OPCODE(I16GtU, __prefix | 0x63, M128X3, Simd128_Gt_U16, true, "i8x16.gt_u") +WASM_BINARY_OPCODE(I8GtS, __prefix | 0x64, M128X3, Simd128_Gt_I8, true, "i16x8.gt_s") +WASM_BINARY_OPCODE(I8GtU, __prefix | 0x65, M128X3, Simd128_Gt_U8, true, "i16x8.gt_u") +WASM_BINARY_OPCODE(I4GtS, __prefix | 0x66, M128X3, Simd128_Gt_I4, true, "i32x4.gt_s") +WASM_BINARY_OPCODE(I4GtU, __prefix | 0x67, M128X3, Simd128_Gt_U4, true, "i32x4.gt_u") +WASM_BINARY_OPCODE(F4Gt, __prefix | 0x68, M128X3, Simd128_Gt_F4, true, "f32x4.gt") +WASM_BINARY_OPCODE(F2Gt, __prefix | 0x69, M128X3, Simd128_Gt_D2, true, "f64x2.gt") +WASM_BINARY_OPCODE(I16GeS, __prefix | 0x6a, M128X3, Simd128_GtEq_I16, true, "i8x16.ge_s") +WASM_BINARY_OPCODE(I16GeU, __prefix | 0x6b, M128X3, Simd128_GtEq_U16, true, "i8x16.ge_u") +WASM_BINARY_OPCODE(I8GeS, __prefix | 0x6c, M128X3, Simd128_GtEq_I8, true, "i16x8.ge_s") +WASM_BINARY_OPCODE(I8GeU, __prefix | 0x6d, M128X3, Simd128_GtEq_U8, true, "i16x8.ge_u") +WASM_BINARY_OPCODE(I4GeS, __prefix | 0x6e, M128X3, Simd128_GtEq_I4, true, "i32x4.ge_s") +WASM_BINARY_OPCODE(I4GeU, __prefix | 0x6f, M128X3, Simd128_GtEq_U4, true, "i32x4.ge_u") +WASM_BINARY_OPCODE(F4Ge, __prefix | 0x70, M128X3, Simd128_GtEq_F4, true, "f32x4.ge") +WASM_BINARY_OPCODE(F2Ge, __prefix | 0x71, M128X3, Simd128_GtEq_D2, true, "f64x2.ge") +WASM_UNARY__OPCODE(F4Neg, __prefix | 0x72, M128_M128, Simd128_Neg_F4, true, "f32x4.neg") +WASM_UNARY__OPCODE(F2Neg, __prefix | 0x73, M128_M128, Simd128_Neg_D2, true, "f64x2.neg") +WASM_UNARY__OPCODE(F4Abs, __prefix | 0x74, M128_M128, Simd128_Abs_F4, true, "f32x4.abs") +WASM_UNARY__OPCODE(F2Abs, __prefix | 0x75, M128_M128, Simd128_Abs_D2, true, "f64x2.abs") +WASM_BINARY_OPCODE(F4Min, __prefix | 0x76, M128X3, Simd128_Min_F4, true, "f32x4.min") +WASM_BINARY_OPCODE(F2Min, __prefix | 0x77, M128X3, Simd128_Min_D2, true, "f64x2.min") +WASM_BINARY_OPCODE(F4Max, __prefix | 0x78, M128X3, Simd128_Max_F4, true, "f32x4.max") +WASM_BINARY_OPCODE(F2Max, __prefix | 0x79, M128X3, Simd128_Max_D2, true, "f64x2.max") +WASM_BINARY_OPCODE(F4Add, __prefix | 0x7a, M128X3, Simd128_Add_F4, true, "f32x4.add") +WASM_BINARY_OPCODE(F2Add, __prefix | 0x7b, M128X3, Simd128_Add_D2, true, "f64x2.add") +WASM_BINARY_OPCODE(F4Sub, __prefix | 0x7c, M128X3, Simd128_Sub_F4, true, "f32x4.sub") +WASM_BINARY_OPCODE(F2Sub, __prefix | 0x7d, M128X3, Simd128_Sub_D2, true, "f64x2.sub") +WASM_BINARY_OPCODE(F4Div, __prefix | 0x7e, M128X3, Simd128_Div_F4, true, "f32x4.div") +WASM_BINARY_OPCODE(F2Div, __prefix | 0x7f, M128X3, Simd128_Div_D2, true, "f64x2.div") +WASM_BINARY_OPCODE(F4Mul, __prefix | 0x80, M128X3, Simd128_Mul_F4, true, "f32x4.mul") +WASM_BINARY_OPCODE(F2Mul, __prefix | 0x81, M128X3, Simd128_Mul_D2, true, "f64x2.mul") +WASM_UNARY__OPCODE(F4Sqrt, __prefix | 0x82, M128_M128, Simd128_Sqrt_F4, true, "f32x4.sqrt") +WASM_UNARY__OPCODE(F2Sqrt, __prefix | 0x83, M128_M128, Simd128_Sqrt_D2, true, "f64x2.sqrt") +WASM_UNARY__OPCODE(F4ConvertS, __prefix | 0x84, M128_M128, Simd128_FromInt32x4_F4, true, "f32x4.convert_s/i32x4") +WASM_UNARY__OPCODE(F4ConvertU, __prefix | 0x85, M128_M128, Simd128_FromUint32x4_F4, true, "f32x4.convert_u/i32x4") +WASM_UNARY__OPCODE(F2ConvertS, __prefix | 0x86, M128_M128, Simd128_FromInt64x2_D2, true, "f64x2.convert_s/i64x2") +WASM_UNARY__OPCODE(F2ConvertU, __prefix | 0x87, M128_M128, Simd128_FromUint64x2_D2, true, "f64x2.convert_u/i64x2") +WASM_UNARY__OPCODE(I4TruncS, __prefix | 0x88, M128_M128, Simd128_FromFloat32x4_I4, true, "i32x4.trunc_s/f32x4:sat") +WASM_UNARY__OPCODE(I4TruncU, __prefix | 0x89, M128_M128, Simd128_FromFloat32x4_U4, true, "i32x4.trunc_u/f32x4:sat") +WASM_UNARY__OPCODE(I2TruncS, __prefix | 0x8a, M128_M128, Simd128_FromFloat64x2_I2, true, "i64x2.trunc_s/f64x2:sat") +WASM_UNARY__OPCODE(I2TruncU, __prefix | 0x8b, M128_M128, Simd128_FromFloat64x2_U2, true, "i64x2.trunc_u/f64x2:sat") + +#undef __prefix +#undef WASM_PREFIX_SIMD +#undef WASM_SIMD_BUILD_OPCODE +#undef WASM_LANE_OPCODE +#undef WASM_EXTRACTLANE_OPCODE +#undef WASM_SIMD_MEMREAD_OPCODE +#undef WASM_SIMD_MEMSTORE_OPCODE +#undef WASM_REPLACELANE_OPCODE diff --git a/deps/chakrashim/core/lib/WasmReader/WasmBinaryReader.cpp b/deps/chakrashim/core/lib/WasmReader/WasmBinaryReader.cpp index a7e1bfa42a3..5dffe8a5abc 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmBinaryReader.cpp +++ b/deps/chakrashim/core/lib/WasmReader/WasmBinaryReader.cpp @@ -14,11 +14,37 @@ namespace Wasm { +namespace Simd +{ +void EnsureSimdIsEnabled() +{ + if (!Wasm::Simd::IsEnabled()) + { + throw WasmCompilationException(_u("Wasm.Simd support is not enabled")); + } +} +bool IsEnabled() +{ +#ifdef ENABLE_WASM_SIMD + return CONFIG_FLAG(WasmSimd); +#else + return false; +#endif +} +} + namespace WasmTypes { + bool IsLocalType(WasmTypes::WasmType type) { // Check if type in range ]Void,Limit[ +#ifdef ENABLE_WASM_SIMD + if (type == WasmTypes::M128 && !Simd::IsEnabled()) + { + return false; + } +#endif return (uint32)(type - 1) < (WasmTypes::Limit - 1); } @@ -31,6 +57,13 @@ uint32 GetTypeByteSize(WasmType type) case I64: return sizeof(int64); case F32: return sizeof(float); case F64: return sizeof(double); +#ifdef ENABLE_WASM_SIMD + case M128: + Simd::EnsureSimdIsEnabled(); + CompileAssert(sizeof(Simd::simdvec) == 16); + return sizeof(Simd::simdvec); +#endif + case Ptr: return sizeof(void*); default: Js::Throw::InternalError(); } @@ -44,6 +77,11 @@ const char16 * GetTypeName(WasmType type) case WasmTypes::WasmType::I64: return _u("i64"); case WasmTypes::WasmType::F32: return _u("f32"); case WasmTypes::WasmType::F64: return _u("f64"); +#ifdef ENABLE_WASM_SIMD + case WasmTypes::WasmType::M128: + Simd::EnsureSimdIsEnabled(); + return _u("m128"); +#endif case WasmTypes::WasmType::Any: return _u("any"); default: Assert(UNREACHED); break; } @@ -60,6 +98,11 @@ WasmTypes::WasmType LanguageTypes::ToWasmType(int8 binType) case LanguageTypes::i64: return WasmTypes::I64; case LanguageTypes::f32: return WasmTypes::F32; case LanguageTypes::f64: return WasmTypes::F64; +#ifdef ENABLE_WASM_SIMD + case LanguageTypes::m128: + Simd::EnsureSimdIsEnabled(); + return WasmTypes::M128; +#endif default: throw WasmCompilationException(_u("Invalid binary type %d"), binType); } @@ -71,13 +114,18 @@ bool FunctionIndexTypes::CanBeExported(FunctionIndexTypes::Type funcType) } WasmBinaryReader::WasmBinaryReader(ArenaAllocator* alloc, Js::WebAssemblyModule* module, const byte* source, size_t length) : - m_module(module), - m_curFuncEnd(nullptr), m_alloc(alloc), - m_readerState(READER_STATE_UNKNOWN) + m_start(source), + m_end(source + length), + m_pc(source), + m_curFuncEnd(nullptr), + m_currentSection(), + m_readerState(READER_STATE_UNKNOWN), + m_module(module) +#if DBG_DUMP + , m_ops(nullptr) +#endif { - m_start = m_pc = source; - m_end = source + length; m_currentSection.code = bSectLimit; #if DBG_DUMP m_ops = Anew(m_alloc, OpSet, m_alloc); @@ -90,7 +138,7 @@ void WasmBinaryReader::InitializeReader() m_readerState = READER_STATE_UNKNOWN; } -void WasmBinaryReader::ThrowDecodingError(const char16* msg, ...) +void WasmBinaryReader::ThrowDecodingError(const char16* msg, ...) const { va_list argptr; va_start(argptr, msg); @@ -213,6 +261,17 @@ SectionHeader WasmBinaryReader::ReadSectionHeader() return header; } +#if ENABLE_DEBUG_CONFIG_OPTIONS +Js::FunctionBody* WasmBinaryReader::GetFunctionBody() const +{ + if (m_readerState == READER_STATE_FUNCTION) + { + return m_funcState.body; + } + return nullptr; +} +#endif + #if DBG_DUMP void WasmBinaryReader::PrintOps() { @@ -227,6 +286,7 @@ void WasmBinaryReader::PrintOps() int i = 0; while (iter.IsValid()) { + __analysis_assume(i < count); ops[i] = iter.CurrentKey(); iter.MoveNext(); ++i; @@ -243,13 +303,16 @@ void WasmBinaryReader::PrintOps() --j; } } + + uint32 moduleId = m_module->GetWasmFunctionInfo(0)->GetBody()->GetSourceContextId(); + Output::Print(_u("Module #%u's current opcode distribution\n"), moduleId); for (i = 0; i < count; ++i) { switch (ops[i]) { -#define WASM_OPCODE(opname, opcode, sig, nyi) \ +#define WASM_OPCODE(opname, opcode, sig, imp, wat) \ case opcode: \ - Output::Print(_u("%s\r\n"), _u(#opname)); \ + Output::Print(_u("%s: %s\r\n"), _u(#opname), _u(wat)); \ break; #include "WasmBinaryOpCodes.h" } @@ -280,8 +343,7 @@ void WasmBinaryReader::ReadFunctionHeaders() { ThrowDecodingError(_u("Function body too big")); } - funcInfo->m_readerInfo.size = funcSize; - funcInfo->m_readerInfo.startOffset = (m_pc - m_start); + funcInfo->SetReaderInfo(FunctionBodyReaderInfo(funcSize, (m_pc - m_start))); CheckBytesLeft(funcSize); TRACE_WASM_DECODER(_u("Function body header: index = %u, size = %u"), funcIndex, funcSize); const byte* end = m_pc + funcSize; @@ -291,8 +353,8 @@ void WasmBinaryReader::ReadFunctionHeaders() void WasmBinaryReader::SeekToFunctionBody(class WasmFunctionInfo* funcInfo) { - FunctionBodyReaderInfo readerInfo = funcInfo->m_readerInfo; - if (readerInfo.startOffset >= (m_end - m_start)) + FunctionBodyReaderInfo readerInfo = funcInfo->GetReaderInfo(); + if (m_end < m_start || readerInfo.startOffset >= (size_t)(m_end - m_start)) { ThrowDecodingError(_u("Function byte offset out of bounds")); } @@ -304,10 +366,27 @@ void WasmBinaryReader::SeekToFunctionBody(class WasmFunctionInfo* funcInfo) // Seek to the function start and skip function header (count) m_pc = m_start + readerInfo.startOffset; + m_funcState.size = readerInfo.size; m_funcState.count = 0; CheckBytesLeft(readerInfo.size); m_curFuncEnd = m_pc + m_funcState.size; +#if ENABLE_DEBUG_CONFIG_OPTIONS + m_funcState.body = funcInfo->GetBody(); + if (DO_WASM_TRACE_DECODER) + { + Output::Print(_u("Decoding ")); + m_funcState.body->DumpFullFunctionName(); + if (sizeof(intptr_t) == 8) + { + Output::Print(_u(": start = 0x%llx, end = 0x%llx, size = 0x%x\n"), (intptr_t)m_pc, (intptr_t)m_curFuncEnd, m_funcState.size); + } + else + { + Output::Print(_u(": start = 0x%x, end = 0x%x, size = 0x%x\n"), (intptr_t)m_pc, (intptr_t)m_curFuncEnd, m_funcState.size); + } + } +#endif uint32 length = 0; uint32 numLocalsEntries = LEB128(length); @@ -338,6 +417,9 @@ void WasmBinaryReader::SeekToFunctionBody(class WasmFunctionInfo* funcInfo) void WasmBinaryReader::FunctionEnd() { m_readerState = READER_STATE_UNKNOWN; +#if ENABLE_DEBUG_CONFIG_OPTIONS + m_funcState.body = nullptr; +#endif } bool WasmBinaryReader::IsCurrentFunctionCompleted() const @@ -345,11 +427,50 @@ bool WasmBinaryReader::IsCurrentFunctionCompleted() const return m_pc == m_curFuncEnd; } -WasmOp WasmBinaryReader::ReadExpr() + +const uint32 WasmBinaryReader::EstimateCurrentFunctionBytecodeSize() const +{ + if (m_readerState != READER_STATE_FUNCTION) + { + ThrowDecodingError(_u("Wasm reader in an invalid state to get function information")); + } + // Use binary size to estimate bytecode size + return m_funcState.size; +} + +WasmOp WasmBinaryReader::ReadPrefixedOpCode(WasmOp prefix, bool isSupported, const char16* notSupportedMsg) { - WasmOp op = m_currentNode.op = (WasmOp)*m_pc++; + CompileAssert(sizeof(WasmOp) >= 2); + if (!isSupported) + { + ThrowDecodingError(notSupportedMsg); + } + CheckBytesLeft(1); + ++m_funcState.count; + return (WasmOp)((prefix << 8) | (*m_pc++)); +} + +WasmOp WasmBinaryReader::ReadOpCode() +{ + CheckBytesLeft(1); + WasmOp op = (WasmOp)*m_pc++; ++m_funcState.count; + switch (op) + { +#define WASM_PREFIX(name, value, imp, errorMsg) \ + case prefix##name: \ + return ReadPrefixedOpCode(op, imp, _u(errorMsg)); +#include "WasmBinaryOpCodes.h" + } + + return op; +} + +WasmOp WasmBinaryReader::ReadExpr() +{ + WasmOp op = m_currentNode.op = ReadOpCode(); + if (EndOfFunc()) { // end of AST @@ -397,6 +518,11 @@ WasmOp WasmBinaryReader::ReadExpr() case wbF64Const: ConstNode(); break; +#ifdef ENABLE_WASM_SIMD + case wbM128Const: + ConstNode(); + break; +#endif case wbSetLocal: case wbGetLocal: case wbTeeLocal: @@ -424,10 +550,19 @@ WasmOp WasmBinaryReader::ReadExpr() } break; } -#define WASM_MEM_OPCODE(opname, opcode, sig, nyi) \ +#ifdef ENABLE_WASM_SIMD + case wbV8X16Shuffle: + ShuffleNode(); + break; +#define WASM_LANE_OPCODE(opname, ...) \ + case wb##opname: \ + LaneNode(); \ + break; +#endif +#define WASM_MEM_OPCODE(opname, ...) \ case wb##opname: \ MemNode(); \ - break; + break; #include "WasmBinaryOpCodes.h" default: break; @@ -539,6 +674,22 @@ void WasmBinaryReader::BrTableNode() m_funcState.count += len; } +void WasmBinaryReader::ShuffleNode() +{ + CheckBytesLeft(Simd::MAX_LANES); + for (uint32 i = 0; i < Simd::MAX_LANES; i++) + { + m_currentNode.shuffle.indices[i] = ReadConst(); + } + m_funcState.count += Simd::MAX_LANES; +} + +void WasmBinaryReader::LaneNode() +{ + m_currentNode.lane.index = ReadConst(); + m_funcState.count++; +} + void WasmBinaryReader::MemNode() { uint32 len = 0; @@ -587,6 +738,16 @@ void WasmBinaryReader::ConstNode() CompileAssert(sizeof(int64) == sizeof(double)); m_funcState.count += sizeof(double); break; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + Simd::EnsureSimdIsEnabled(); + for (uint i = 0; i < Simd::VEC_WIDTH; i++) + { + m_currentNode.cnst.v128[i] = ReadConst(); + } + m_funcState.count += Simd::VEC_WIDTH; + break; +#endif } } @@ -1155,19 +1316,6 @@ MaxAllowedType WasmBinaryReader::LEB128(uint32 &length, bool sgn) result |= -((int64)1 << shamt); } } - - if (!sgn) - { - if (sizeof(MaxAllowedType) == 4) - { - TRACE_WASM_LEB128(_u("Binary decoder: LEB128 length = %u, value = %u (0x%x)"), length, result, result); - } - else if (sizeof(MaxAllowedType) == 8) - { - TRACE_WASM_LEB128(_u("Binary decoder: LEB128 length = %u, value = %llu (0x%llx)"), length, result, result); - } - } - return result; } @@ -1175,19 +1323,13 @@ MaxAllowedType WasmBinaryReader::LEB128(uint32 &length, bool sgn) template<> int32 WasmBinaryReader::SLEB128(uint32 &length) { - int32 result = LEB128(length, true); - - TRACE_WASM_LEB128(_u("Binary decoder: SLEB128 length = %u, value = %d (0x%x)"), length, result, result); - return result; + return LEB128(length, true); } template<> int64 WasmBinaryReader::SLEB128(uint32 &length) { - int64 result = LEB128(length, true); - - TRACE_WASM_LEB128(_u("Binary decoder: SLEB128 length = %u, value = %lld (0x%llx)"), length, result, result); - return result; + return LEB128(length, true); } WasmNode WasmBinaryReader::ReadInitExpr(bool isOffset) @@ -1198,7 +1340,10 @@ WasmNode WasmBinaryReader::ReadInitExpr(bool isOffset) } m_funcState.count = 0; - m_funcState.size = m_currentSection.end - m_pc; + m_funcState.size = (uint32)(m_currentSection.end - m_pc); +#if TARGET_64 + Assert(m_pc + m_funcState.size == m_currentSection.end); +#endif ReadExpr(); WasmNode node = m_currentNode; switch (node.op) diff --git a/deps/chakrashim/core/lib/WasmReader/WasmBinaryReader.h b/deps/chakrashim/core/lib/WasmReader/WasmBinaryReader.h index 9e0c0d3b95e..7d71668979b 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmBinaryReader.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmBinaryReader.h @@ -14,6 +14,7 @@ namespace Wasm const int8 i64 = 0x80 - 0x2; const int8 f32 = 0x80 - 0x3; const int8 f64 = 0x80 - 0x4; + const int8 m128 = 0x80 - 0x5; const int8 anyfunc = 0x80 - 0x10; const int8 func = 0x80 - 0x20; const int8 emptyBlock = 0x80 - 0x40; @@ -54,8 +55,12 @@ namespace Wasm bool ProcessCurrentSection(); virtual void SeekToFunctionBody(class WasmFunctionInfo* funcInfo) override; virtual bool IsCurrentFunctionCompleted() const override; + + WasmOp ReadPrefixedOpCode(WasmOp prefix, bool isSupported, const char16* notSupportedMsg); + WasmOp ReadOpCode(); virtual WasmOp ReadExpr() override; virtual void FunctionEnd() override; + virtual const uint32 EstimateCurrentFunctionBytecodeSize() const override; #if DBG_DUMP void PrintOps(); #endif @@ -63,8 +68,11 @@ namespace Wasm private: struct ReaderState { +#if ENABLE_DEBUG_CONFIG_OPTIONS + Js::FunctionBody* body = nullptr; +#endif uint32 count; // current entry - size_t size; // number of entries + uint32 size; // binary size of the function }; void BlockNode(); @@ -73,6 +81,8 @@ namespace Wasm void BrNode(); void BrTableNode(); void MemNode(); + void LaneNode(); + void ShuffleNode(); void VarNode(); // Module readers @@ -108,11 +118,10 @@ namespace Wasm void CheckBytesLeft(uint32 bytesNeeded); bool EndOfFunc(); bool EndOfModule(); - DECLSPEC_NORETURN void ThrowDecodingError(const char16* msg, ...); + DECLSPEC_NORETURN void ThrowDecodingError(const char16* msg, ...) const; Wasm::WasmTypes::WasmType ReadWasmType(uint32& length); ArenaAllocator* m_alloc; - uint32 m_funcNumber; const byte* m_start, *m_end, *m_pc, *m_curFuncEnd; SectionHeader m_currentSection; ReaderState m_funcState; // func AST level @@ -125,6 +134,9 @@ namespace Wasm READER_STATE_MODULE } m_readerState; Js::WebAssemblyModule* m_module; +#if ENABLE_DEBUG_CONFIG_OPTIONS + Js::FunctionBody* GetFunctionBody() const; +#endif #if DBG_DUMP typedef JsUtil::BaseHashSet OpSet; OpSet* m_ops; diff --git a/deps/chakrashim/core/lib/WasmReader/WasmByteCodeGenerator.cpp b/deps/chakrashim/core/lib/WasmReader/WasmByteCodeGenerator.cpp index bbe5bce6fe9..f22200c4043 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmByteCodeGenerator.cpp +++ b/deps/chakrashim/core/lib/WasmReader/WasmByteCodeGenerator.cpp @@ -9,6 +9,8 @@ #include "Language/WebAssemblySource.h" #include "ByteCode/WasmByteCodeWriter.h" #include "EmptyWasmByteCodeWriter.h" +#include "ByteCode/ByteCodeDumper.h" +#include "AsmJsByteCodeDumper.h" #if DBG_DUMP #define DebugPrintOp(op) if (DO_WASM_TRACE_BYTECODE) { PrintOpBegin(op); } @@ -57,7 +59,7 @@ uint32 WasmBytecodeGenerator::WriteTypeStackToString(_Out_writes_(maxlen) char16 }); if (numwritten >= maxlen - 5) { - // null out the last 5 characters so we can properly end it + // null out the last 5 characters so we can properly end it for (int i = 1; i <= 5; i++) { *(out + maxlen - i) = 0; @@ -85,7 +87,7 @@ void WasmBytecodeGenerator::PrintOpBegin(WasmOp op) } switch (op) { -#define WASM_OPCODE(opname, opcode, sig, nyi) \ +#define WASM_OPCODE(opname, ...) \ case wb##opname: \ Output::Print(_u(#opname)); \ break; @@ -99,10 +101,24 @@ case wb##opname: \ case wbBr: case wbBrIf: Output::Print(_u(" depth: %u"), GetReader()->m_currentNode.br.depth); break; case wbBrTable: Output::Print(_u(" %u cases, default: %u"), GetReader()->m_currentNode.brTable.numTargets, GetReader()->m_currentNode.brTable.defaultTarget); break; - case wbCall: case wbCallIndirect: { - uint id = GetReader()->m_currentNode.call.num; + uint32 sigId = GetReader()->m_currentNode.call.num; + if (sigId < m_module->GetSignatureCount()) + { + Output::Print(_u(" ")); + WasmSignature* sig = m_module->GetSignature(sigId); + sig->Dump(20); + } + else + { + Output::Print(_u(" invalid signature id %u"), sigId); + } + break; + } + case wbCall: + { + uint32 id = GetReader()->m_currentNode.call.num; if (id < m_module->GetWasmFunctionCount()) { FunctionIndexTypes::Type funcType = GetReader()->m_currentNode.call.funcType; @@ -119,7 +135,7 @@ case wb##opname: \ } else { - Output::Print(_u(" invalid id")); + Output::Print(_u(" invalid id %u"), id); } break; } @@ -132,7 +148,7 @@ case wb##opname: \ case wbI64Const: Output::Print(_u(" (%lld, 0x%llx)"), GetReader()->m_currentNode.cnst.i64, GetReader()->m_currentNode.cnst.i64); break; case wbF32Const: Output::Print(_u(" (%.4f)"), GetReader()->m_currentNode.cnst.f32); break; case wbF64Const: Output::Print(_u(" (%.4f)"), GetReader()->m_currentNode.cnst.f64); break; -#define WASM_MEM_OPCODE(opname, opcode, sig, nyi) case wb##opname: // FallThrough +#define WASM_MEM_OPCODE(opname, ...) case wb##opname: // FallThrough #include "WasmBinaryOpCodes.h" { const uint8 alignment = GetReader()->m_currentNode.mem.alignment; @@ -177,6 +193,11 @@ Js::AsmJsRetType WasmToAsmJs::GetAsmJsReturnType(WasmTypes::WasmType wasmType) case WasmTypes::F32: return Js::AsmJsRetType::Float; case WasmTypes::F64: return Js::AsmJsRetType::Double; case WasmTypes::Void: return Js::AsmJsRetType::Void; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + Simd::EnsureSimdIsEnabled(); + return Js::AsmJsRetType::Float32x4; +#endif default: throw WasmCompilationException(_u("Unknown return type %u"), wasmType); } @@ -192,6 +213,11 @@ Js::AsmJsVarType WasmToAsmJs::GetAsmJsVarType(WasmTypes::WasmType wasmType) case WasmTypes::I64: return Js::AsmJsVarType::Int64; case WasmTypes::F32: return Js::AsmJsVarType::Float; case WasmTypes::F64: return Js::AsmJsVarType::Double; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + Simd::EnsureSimdIsEnabled(); + return Js::AsmJsVarType::Float32x4; +#endif default: throw WasmCompilationException(_u("Unknown var type %u"), wasmType); } @@ -213,6 +239,9 @@ WasmModuleGenerator::WasmModuleGenerator(Js::ScriptContext* scriptContext, Js::W Js::WebAssemblyModule* WasmModuleGenerator::GenerateModule() { + Js::AutoProfilingPhase wasmPhase(m_scriptContext, Js::WasmReaderPhase); + Unused(wasmPhase); + m_module->GetReader()->InitializeReader(); BVStatic visitedSections; @@ -224,7 +253,7 @@ Js::WebAssemblyModule* WasmModuleGenerator::GenerateModule() SectionCode sectionCode = sectionHeader.code; if (sectionCode == bSectLimit) { - TRACE_WASM_SECTION(_u("Done reading module's sections")); + TRACE_WASM(PHASE_TRACE1(Js::WasmSectionPhase), _u("Done reading module's sections")); break; } @@ -255,6 +284,11 @@ Js::WebAssemblyModule* WasmModuleGenerator::GenerateModule() } uint32 funcCount = m_module->GetWasmFunctionCount(); + SourceContextInfo * sourceContextInfo = m_sourceInfo->GetSrcInfo()->sourceContextInfo; + m_sourceInfo->EnsureInitialized(funcCount); + sourceContextInfo->nextLocalFunctionId += funcCount; + sourceContextInfo->EnsureInitialized(); + for (uint32 i = 0; i < funcCount; ++i) { GenerateFunctionHeader(i); @@ -300,12 +334,6 @@ Js::WebAssemblyModule* WasmModuleGenerator::GenerateModule() } #endif -#if DBG_DUMP - if (PHASE_TRACE1(Js::WasmReaderPhase)) - { - GetReader()->PrintOps(); - } -#endif // If we see a FunctionSignatures section we need to see a FunctionBodies section if (visitedSections.Test(bSectFunction) && !visitedSections.Test(bSectFunctionBodies)) { @@ -449,8 +477,9 @@ WasmBytecodeGenerator::WasmBytecodeGenerator(Js::ScriptContext* scriptContext, W m_scriptContext(scriptContext), m_alloc(_u("WasmBytecodeGen"), scriptContext->GetThreadContext()->GetPageAllocator(), Js::Throw::OutOfMemory), m_evalStack(&m_alloc), - mTypedRegisterAllocator(&m_alloc, AllocateRegisterSpace, 1 << WAsmJs::SIMD), + mTypedRegisterAllocator(&m_alloc, AllocateRegisterSpace, Simd::IsEnabled() ? 0 : 1 << WAsmJs::SIMD), m_blockInfos(&m_alloc), + currentProfileId(0), isUnreachable(false) { m_emptyWriter = Anew(&m_alloc, Js::EmptyWasmByteCodeWriter); @@ -461,9 +490,8 @@ WasmBytecodeGenerator::WasmBytecodeGenerator(Js::ScriptContext* scriptContext, W // Init reader to current func offset GetReader()->SeekToFunctionBody(m_funcInfo); - // Use binary size to estimate bytecode size - const uint32 astSize = readerInfo->m_funcInfo->m_readerInfo.size; - m_writer->InitData(&m_alloc, astSize); + const uint32 estimated = GetReader()->EstimateCurrentFunctionBytecodeSize(); + m_writer->InitData(&m_alloc, estimated); } void WasmBytecodeGenerator::GenerateFunction() @@ -486,43 +514,58 @@ void WasmBytecodeGenerator::GenerateFunction() m_maxArgOutDepth = 0; m_writer->Begin(GetFunctionBody(), &m_alloc); - try + struct AutoCleanupGeneratorState { - Js::ByteCodeLabel exitLabel = m_writer->DefineLabel(); - m_funcInfo->SetExitLabel(exitLabel); - EnregisterLocals(); - - EnterEvalStackScope(); - // The function's yield type is the return type - GetReader()->m_currentNode.block.sig = m_funcInfo->GetResultType(); - EmitInfo lastInfo = EmitBlock(); - if (lastInfo.type != WasmTypes::Void || m_funcInfo->GetResultType() == WasmTypes::Void) + WasmBytecodeGenerator* gen; + AutoCleanupGeneratorState(WasmBytecodeGenerator* gen) : gen(gen) {} + ~AutoCleanupGeneratorState() { - EmitReturnExpr(&lastInfo); + if (gen) + { + TRACE_WASM(PHASE_TRACE(Js::WasmBytecodePhase, gen->GetFunctionBody()), _u("\nHad Compilation error!")); + gen->GetReader()->FunctionEnd(); + gen->m_originalWriter->Reset(); + } } - DebugPrintOpEnd(); - ExitEvalStackScope(); - SetUnreachableState(false); - m_writer->MarkAsmJsLabel(exitLabel); - m_writer->EmptyAsm(Js::OpCodeAsmJs::Ret); - m_writer->End(); - GetReader()->FunctionEnd(); - } - catch (...) + void Complete() { gen = nullptr; } + }; + AutoCleanupGeneratorState autoCleanupGeneratorState(this); + Js::ByteCodeLabel exitLabel = m_writer->DefineLabel(); + m_funcInfo->SetExitLabel(exitLabel); + EnregisterLocals(); + + EnterEvalStackScope(); + // The function's yield type is the return type + GetReader()->m_currentNode.block.sig = m_funcInfo->GetResultType(); + EmitInfo lastInfo = EmitBlock(); + if (lastInfo.type != WasmTypes::Void || m_funcInfo->GetResultType() == WasmTypes::Void) { - TRACE_WASM_BYTECODE(_u("\nHad Compilation error!")); - GetReader()->FunctionEnd(); - m_originalWriter->Reset(); - throw; + EmitReturnExpr(&lastInfo); } + DebugPrintOpEnd(); + ExitEvalStackScope(); + SetUnreachableState(false); + m_writer->MarkAsmJsLabel(exitLabel); + m_writer->EmptyAsm(Js::OpCodeAsmJs::Ret); + m_writer->SetCallSiteCount(this->currentProfileId); + m_writer->End(); + GetReader()->FunctionEnd(); + autoCleanupGeneratorState.Complete(); // Make sure we don't have any unforeseen exceptions as we finalize the body AutoDisableInterrupt autoDisableInterrupt(m_scriptContext->GetThreadContext(), true); #if DBG_DUMP - if (PHASE_DUMP(Js::ByteCodePhase, GetFunctionBody()) && !IsValidating()) + if (( + PHASE_DUMP(Js::WasmBytecodePhase, GetFunctionBody()) || + PHASE_DUMP(Js::ByteCodePhase, GetFunctionBody()) + ) && !IsValidating()) { Js::AsmJsByteCodeDumper::Dump(GetFunctionBody(), &mTypedRegisterAllocator, nullptr); } + if (PHASE_DUMP(Js::WasmOpCodeDistributionPhase, GetFunctionBody())) + { + m_module->GetReader()->PrintOps(); + } #endif Js::AsmJsFunctionInfo* info = GetFunctionBody()->GetAsmJsFunctionInfo(); @@ -530,7 +573,6 @@ void WasmBytecodeGenerator::GenerateFunction() mTypedRegisterAllocator.CommitToFunctionInfo(info, GetFunctionBody()); GetFunctionBody()->CheckAndSetOutParamMaxDepth(m_maxArgOutDepth); - autoDisableInterrupt.Completed(); } @@ -566,6 +608,14 @@ void WasmBytecodeGenerator::EnregisterLocals() case WasmTypes::I64: m_writer->AsmLong1Const1(Js::OpCodeAsmJs::Ld_LongConst, m_locals[i].location, 0); break; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + { + Simd::EnsureSimdIsEnabled(); + m_writer->WasmSimdConst(Js::OpCodeAsmJs::Simd128_LdC, m_locals[i].location, 0, 0, 0, 0); + break; + } +#endif default: Assume(UNREACHED); } @@ -573,14 +623,51 @@ void WasmBytecodeGenerator::EnregisterLocals() } } +template +EmitInfo WasmBytecodeGenerator::EmitSimdBuildExpr(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature) +{ + const WasmTypes::WasmType resultType = signature[0]; + const WasmTypes::WasmType type = signature[1]; + + Js::RegSlot resultReg = GetRegisterSpace(resultType)->AcquireTmpRegister(); + + EmitInfo args[lanes]; + for (uint i = 0; i < lanes; i++) + { + args[i] = PopEvalStack(type); + } + + switch (lanes) + { + case 4: + m_writer->AsmReg5(op, resultReg, args[3].location, args[2].location, args[1].location, args[0].location); + break; + case 8: + m_writer->AsmReg9(op, resultReg, args[7].location, args[6].location, args[5].location, args[4].location, args[3].location, args[2].location, args[1].location, args[0].location); + break; + case 16: + m_writer->AsmReg17(op, resultReg, args[15].location, args[14].location, args[13].location, args[12].location, args[11].location, args[10].location, args[9].location, args[8].location, args[7].location, args[6].location, args[5].location, args[4].location, args[3].location, args[2].location, args[1].location, args[0].location); + break; + default: + Assert(UNREACHED); + } + + for (uint i = 0; i < lanes; i++) + { + ReleaseLocation(&args[i]); + } + + return EmitInfo(resultReg, resultType); +} + void WasmBytecodeGenerator::EmitExpr(WasmOp op) { DebugPrintOp(op); switch (op) { -#define WASM_OPCODE(opname, opcode, sig, nyi) \ +#define WASM_OPCODE(opname, opcode, sig, imp, wat) \ case opcode: \ - if (nyi) throw WasmCompilationException(_u("Operator %s NYI"), _u(#opname)); break; + if (!imp) throw WasmCompilationException(_u("Operator %s is Not Yet Implemented"), _u(wat)); break; #include "WasmBinaryOpCodes.h" default: break; @@ -620,6 +707,12 @@ void WasmBytecodeGenerator::EmitExpr(WasmOp op) case wbI64Const: info = EmitConst(WasmTypes::I64, GetReader()->m_currentNode.cnst); break; +#ifdef ENABLE_WASM_SIMD + case wbM128Const: + Simd::EnsureSimdIsEnabled(); + info = EmitConst(WasmTypes::M128, GetReader()->m_currentNode.cnst); + break; +#endif case wbBlock: info = EmitBlock(); break; @@ -676,27 +769,62 @@ void WasmBytecodeGenerator::EmitExpr(WasmOp op) SetUnreachableState(true); info.type = WasmTypes::Any; break; -#define WASM_MEMREAD_OPCODE(opname, opcode, sig, nyi, viewtype) \ +#ifdef ENABLE_WASM_SIMD + case wbM128Bitselect: + Simd::EnsureSimdIsEnabled(); + info = EmitM128BitSelect(); + break; + case wbV8X16Shuffle: + Simd::EnsureSimdIsEnabled(); + info = EmitV8X16Shuffle(); + break; +#define WASM_EXTRACTLANE_OPCODE(opname, opcode, sig, asmjsop, ...) \ + case wb##opname: \ + Simd::EnsureSimdIsEnabled();\ + info = EmitExtractLaneExpr(Js::OpCodeAsmJs::##asmjsop, WasmOpCodeSignatures::sig); \ + break; +#define WASM_REPLACELANE_OPCODE(opname, opcode, sig, asmjsop, ...) \ + case wb##opname: \ + Simd::EnsureSimdIsEnabled();\ + info = EmitReplaceLaneExpr(Js::OpCodeAsmJs::##asmjsop, WasmOpCodeSignatures::sig); \ + break; +#endif +#define WASM_MEMREAD_OPCODE(opname, opcode, sig, imp, viewtype, wat) \ case wb##opname: \ Assert(WasmOpCodeSignatures::n##sig > 0);\ info = EmitMemAccess(wb##opname, WasmOpCodeSignatures::sig, viewtype, false); \ break; -#define WASM_MEMSTORE_OPCODE(opname, opcode, sig, nyi, viewtype) \ +#define WASM_MEMSTORE_OPCODE(opname, opcode, sig, imp, viewtype, wat) \ case wb##opname: \ Assert(WasmOpCodeSignatures::n##sig > 0);\ info = EmitMemAccess(wb##opname, WasmOpCodeSignatures::sig, viewtype, true); \ break; -#define WASM_BINARY_OPCODE(opname, opcode, sig, asmjsop, nyi) \ +#define WASM_SIMD_MEMREAD_OPCODE(opname, opcode, sig, asmjsop, viewtype, dataWidth, ...) \ + case wb##opname: \ + Assert(WasmOpCodeSignatures::n##sig > 0);\ + info = EmitSimdMemAccess(Js::OpCodeAsmJs::##asmjsop, WasmOpCodeSignatures::sig, viewtype, dataWidth, false); \ + break; +#define WASM_SIMD_MEMSTORE_OPCODE(opname, opcode, sig, asmjsop, viewtype, dataWidth, ...) \ + case wb##opname: \ + Assert(WasmOpCodeSignatures::n##sig > 0);\ + info = EmitSimdMemAccess(Js::OpCodeAsmJs::##asmjsop, WasmOpCodeSignatures::sig, viewtype, dataWidth, true); \ + break; +#define WASM_BINARY_OPCODE(opname, opcode, sig, asmjsop, imp, wat) \ case wb##opname: \ Assert(WasmOpCodeSignatures::n##sig == 3);\ info = EmitBinExpr(Js::OpCodeAsmJs::##asmjsop, WasmOpCodeSignatures::sig); \ break; -#define WASM_UNARY__OPCODE(opname, opcode, sig, asmjsop, nyi) \ +#define WASM_UNARY__OPCODE(opname, opcode, sig, asmjsop, imp, wat) \ case wb##opname: \ Assert(WasmOpCodeSignatures::n##sig == 2);\ info = EmitUnaryExpr(Js::OpCodeAsmJs::##asmjsop, WasmOpCodeSignatures::sig); \ break; -#define WASM_EMPTY__OPCODE(opname, opcode, asmjsop, nyi) \ +#define WASM_SIMD_BUILD_OPCODE(opname, opcode, sig, asmjop, lanes, ...) \ + case wb##opname: \ + Assert(WasmOpCodeSignatures::n##sig == 2);\ + info = EmitSimdBuildExpr(Js::OpCodeAsmJs::##asmjop, WasmOpCodeSignatures::sig); \ + break; +#define WASM_EMPTY__OPCODE(opname, opcode, asmjsop, imp, wat) \ case wb##opname: \ m_writer->EmptyAsm(Js::OpCodeAsmJs::##asmjsop);\ break; @@ -841,6 +969,14 @@ void WasmBytecodeGenerator::EmitLoadConst(EmitInfo dst, WasmConstLitNode cnst) case WasmTypes::I64: m_writer->AsmLong1Const1(Js::OpCodeAsmJs::Ld_LongConst, dst.location, cnst.i64); break; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + { + Simd::EnsureSimdIsEnabled(); + m_writer->WasmSimdConst(Js::OpCodeAsmJs::Simd128_LdC, dst.location, cnst.v128[0], cnst.v128[1], cnst.v128[2], cnst.v128[3]); + break; + } +#endif default: throw WasmCompilationException(_u("Unknown type %u"), dst.type); } @@ -883,7 +1019,7 @@ void WasmBytecodeGenerator::EmitBlockCommon(BlockInfo* blockInfo, bool* endOnEls DebugPrintOp(op); if (blockInfo && blockInfo->HasYield()) { - EmitInfo info = PopEvalStack(); + EmitInfo info = PopStackPolymorphic(); YieldToBlock(*blockInfo, info); ReleaseLocation(&info); } @@ -913,10 +1049,24 @@ EmitInfo WasmBytecodeGenerator::EmitLoop() Js::ByteCodeLabel loopHeadLabel = m_writer->DefineLabel(); Js::ByteCodeLabel loopLandingPadLabel = m_writer->DefineLabel(); - uint32 loopId = m_writer->EnterLoop(loopHeadLabel); + // Push possibly yielding loop label before capturing all the yielding registers + BlockInfo implicitBlockInfo = PushLabel(loopTailLabel); + + // Save the first tmp (per type) of this loop to discern a yield outside the loop in jitloopbody scenario + Js::RegSlot curRegs[WAsmJs::LIMIT]; + for (WAsmJs::Types type = WAsmJs::Types(0); type != WAsmJs::LIMIT; type = WAsmJs::Types(type + 1)) + { + uint32 minYield = 0; + if (!mTypedRegisterAllocator.IsTypeExcluded(type)) + { + CompileAssert(sizeof(minYield) == sizeof(Js::RegSlot)); + minYield = static_cast(mTypedRegisterAllocator.GetRegisterSpace(type)->PeekNextTmpRegister()); + } + curRegs[type] = minYield; + } + uint32 loopId = m_writer->WasmLoopStart(loopHeadLabel, curRegs); // Internally we create a block for loop to exit, but semantically, they don't exist so pop it - BlockInfo implicitBlockInfo = PushLabel(loopTailLabel); m_blockInfos.Pop(); // We don't want nested block to jump directly to the loop header @@ -946,20 +1096,29 @@ EmitInfo WasmBytecodeGenerator::EmitCall() uint32 funcNum = Js::Constants::UninitializedValue; uint32 signatureId = Js::Constants::UninitializedValue; WasmSignature* calleeSignature = nullptr; + Js::ProfileId profileId = Js::Constants::NoProfileId; EmitInfo indirectIndexInfo; const bool isImportCall = GetReader()->m_currentNode.call.funcType == FunctionIndexTypes::Import; Assert(isImportCall || GetReader()->m_currentNode.call.funcType == FunctionIndexTypes::Function || GetReader()->m_currentNode.call.funcType == FunctionIndexTypes::ImportThunk); switch (wasmOp) { case wbCall: + { funcNum = GetReader()->m_currentNode.call.num; - calleeSignature = m_module->GetWasmFunctionInfo(funcNum)->GetSignature(); + WasmFunctionInfo* calleeInfo = m_module->GetWasmFunctionInfo(funcNum); + calleeSignature = calleeInfo->GetSignature(); + // currently only handle inlining internal function calls + // in future we can expand to all calls by adding checks in inliner and falling back to call in case ScriptFunction doesn't match + if (GetReader()->m_currentNode.call.funcType == FunctionIndexTypes::Function && !PHASE_TRACE1(Js::WasmInOutPhase)) + { + profileId = GetNextProfileId(); + } break; + } case wbCallIndirect: indirectIndexInfo = PopEvalStack(WasmTypes::I32, _u("Indirect call index must be int type")); signatureId = GetReader()->m_currentNode.call.num; calleeSignature = m_module->GetSignature(signatureId); - ReleaseLocation(&indirectIndexInfo); break; default: Assume(UNREACHED); @@ -1001,7 +1160,6 @@ EmitInfo WasmBytecodeGenerator::EmitCall() { EmitInfo info = PopEvalStack(calleeSignature->GetParam((Js::ArgSlot)i), _u("Call argument does not match formal type")); // We can release the location of the arguments now, because we won't create new temps between start/call - ReleaseLocation(&info); argsList[i] = info; } @@ -1026,6 +1184,12 @@ EmitInfo WasmBytecodeGenerator::EmitCall() case WasmTypes::I64: argOp = isImportCall ? Js::OpCodeAsmJs::ArgOut_Long : Js::OpCodeAsmJs::I_ArgOut_Long; break; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + Simd::EnsureSimdIsEnabled(); + argOp = isImportCall ? Js::OpCodeAsmJs::Simd128_ArgOut_F4 : Js::OpCodeAsmJs::Simd128_I_ArgOut_F4; + break; +#endif case WasmTypes::Any: // In unreachable mode allow any type as argument since we won't actually emit the call Assert(IsUnreachable()); @@ -1054,7 +1218,7 @@ EmitInfo WasmBytecodeGenerator::EmitCall() } } - AdeleteArray(&m_alloc, nArgs, argsList); + Js::RegSlot funcReg = GetRegisterSpace(WasmTypes::Ptr)->AcquireTmpRegister(); // emit call switch (wasmOp) @@ -1063,62 +1227,88 @@ EmitInfo WasmBytecodeGenerator::EmitCall() { uint32 offset = isImportCall ? m_module->GetImportFuncOffset() : m_module->GetFuncOffset(); uint32 index = UInt32Math::Add(offset, funcNum); - m_writer->AsmSlot(Js::OpCodeAsmJs::LdSlot, 0, 1, index); + m_writer->AsmSlot(Js::OpCodeAsmJs::LdSlot, funcReg, Js::AsmJsFunctionMemory::ModuleEnvRegister, index); break; } case wbCallIndirect: - m_writer->AsmSlot(Js::OpCodeAsmJs::LdSlotArr, 0, 1, m_module->GetTableEnvironmentOffset()); - m_writer->AsmSlot(Js::OpCodeAsmJs::LdArr_WasmFunc, 0, 0, indirectIndexInfo.location); - m_writer->AsmReg1IntConst1(Js::OpCodeAsmJs::CheckSignature, 0, calleeSignature->GetSignatureId()); + { + Js::RegSlot slotReg = GetRegisterSpace(WasmTypes::Ptr)->AcquireTmpRegister(); + m_writer->AsmSlot(Js::OpCodeAsmJs::LdSlotArr, slotReg, Js::AsmJsFunctionMemory::ModuleEnvRegister, m_module->GetTableEnvironmentOffset()); + m_writer->AsmSlot(Js::OpCodeAsmJs::LdArr_WasmFunc, funcReg, slotReg, indirectIndexInfo.location); + GetRegisterSpace(WasmTypes::Ptr)->ReleaseTmpRegister(slotReg); + m_writer->AsmReg1IntConst1(Js::OpCodeAsmJs::CheckSignature, funcReg, calleeSignature->GetSignatureId()); break; + } default: Assume(UNREACHED); } + EmitInfo retInfo; + retInfo.type = calleeSignature->GetResultType(); // calculate number of RegSlots(Js::Var) the call consumes Js::ArgSlot args; - Js::OpCodeAsmJs callOp = Js::OpCodeAsmJs::Nop; if (isImportCall) { args = calleeSignature->GetParamCount(); ArgSlotMath::Inc(args, argOverflow); - callOp = Js::OpCodeAsmJs::Call; + + Js::RegSlot varRetReg = GetRegisterSpace(WasmTypes::Ptr)->AcquireTmpRegister(); + m_writer->AsmCall(Js::OpCodeAsmJs::Call, varRetReg, funcReg, args, WasmToAsmJs::GetAsmJsReturnType(calleeSignature->GetResultType()), profileId); + + GetRegisterSpace(WasmTypes::Ptr)->ReleaseTmpRegister(varRetReg); + GetRegisterSpace(WasmTypes::Ptr)->ReleaseTmpRegister(funcReg); + + ReleaseLocation(&indirectIndexInfo); + //registers need to be released from higher ordinals to lower + for (uint32 i = nArgs; i > 0; --i) + { + ReleaseLocation(&(argsList[i - 1])); + } + // emit result coercion + if (retInfo.type != WasmTypes::Void) + { + Js::OpCodeAsmJs convertOp = Js::OpCodeAsmJs::Nop; + switch (retInfo.type) + { + case WasmTypes::F32: + convertOp = Js::OpCodeAsmJs::Conv_VTF; + break; + case WasmTypes::F64: + convertOp = Js::OpCodeAsmJs::Conv_VTD; + break; + case WasmTypes::I32: + convertOp = Js::OpCodeAsmJs::Conv_VTI; + break; + case WasmTypes::I64: + convertOp = Js::OpCodeAsmJs::Conv_VTL; + break; + default: + throw WasmCompilationException(_u("Unknown call return type %u"), retInfo.type); + } + retInfo.location = GetRegisterSpace(retInfo.type)->AcquireTmpRegister(); + m_writer->AsmReg2(convertOp, retInfo.location, varRetReg); + } } else { - Assert(Math::IsAligned(argSize, sizeof(Js::Var))); - args = argSize / sizeof(Js::Var); - callOp = Js::OpCodeAsmJs::I_Call; - } - m_writer->AsmCall(callOp, 0, 0, args, WasmToAsmJs::GetAsmJsReturnType(calleeSignature->GetResultType())); + GetRegisterSpace(WasmTypes::Ptr)->ReleaseTmpRegister(funcReg); - // emit result coercion - EmitInfo retInfo; - retInfo.type = calleeSignature->GetResultType(); - if (retInfo.type != WasmTypes::Void) - { - Js::OpCodeAsmJs convertOp = Js::OpCodeAsmJs::Nop; - retInfo.location = GetRegisterSpace(retInfo.type)->AcquireTmpRegister(); - switch (retInfo.type) + ReleaseLocation(&indirectIndexInfo); + //registers need to be released from higher ordinals to lower + for (uint32 i = nArgs; i > 0; --i) { - case WasmTypes::F32: - convertOp = isImportCall ? Js::OpCodeAsmJs::Conv_VTF : Js::OpCodeAsmJs::Ld_Flt; - break; - case WasmTypes::F64: - convertOp = isImportCall ? Js::OpCodeAsmJs::Conv_VTD : Js::OpCodeAsmJs::Ld_Db; - break; - case WasmTypes::I32: - convertOp = isImportCall ? Js::OpCodeAsmJs::Conv_VTI : Js::OpCodeAsmJs::Ld_Int; - break; - case WasmTypes::I64: - convertOp = isImportCall ? Js::OpCodeAsmJs::Conv_VTL : Js::OpCodeAsmJs::Ld_Long; - break; - default: - throw WasmCompilationException(_u("Unknown call return type %u"), retInfo.type); + ReleaseLocation(&(argsList[i - 1])); + } + if (retInfo.type != WasmTypes::Void) + { + retInfo.location = GetRegisterSpace(retInfo.type)->AcquireTmpRegister(); } - m_writer->AsmReg2(convertOp, retInfo.location, 0); + + args = (Js::ArgSlot)(::ceil((double)(argSize / sizeof(Js::Var)))); + m_writer->AsmCall(Js::OpCodeAsmJs::I_Call, retInfo.location, funcReg, args, WasmToAsmJs::GetAsmJsReturnType(calleeSignature->GetResultType()), profileId); } + AdeleteArray(&m_alloc, nArgs, argsList); if (isImportCall && (m_module->HasMemory() || m_module->HasMemoryImport())) { @@ -1184,22 +1374,14 @@ void WasmBytecodeGenerator::EmitBrTable() const uint32 defaultEntry = GetReader()->m_currentNode.brTable.defaultTarget; // Compile scrutinee - EmitInfo scrutineeInfo = PopEvalStack(WasmTypes::I32, _u("br_table expression must be of type i32")); + EmitInfo scrutineeInfo = PopStackPolymorphic(WasmTypes::I32, _u("br_table expression must be of type i32")); m_writer->AsmReg2(Js::OpCodeAsmJs::BeginSwitch_Int, scrutineeInfo.location, scrutineeInfo.location); EmitInfo yieldValue; BlockInfo defaultBlockInfo = GetBlockInfo(defaultEntry); if (defaultBlockInfo.HasYield()) { - // If the scrutinee is any then check the stack before popping - if (scrutineeInfo.type == WasmTypes::Any && m_evalStack.Peek().type == WasmTypes::Limit) - { - yieldValue = scrutineeInfo; - } - else - { - yieldValue = PopEvalStack(); - } + yieldValue = PopStackPolymorphic(); } // Compile cases @@ -1237,7 +1419,7 @@ EmitInfo WasmBytecodeGenerator::EmitGrowMemory() EmitInfo WasmBytecodeGenerator::EmitDrop() { - EmitInfo info = PopEvalStack(); + EmitInfo info = PopValuePolymorphic(); ReleaseLocation(&info); return EmitInfo(); } @@ -1248,8 +1430,8 @@ EmitInfo WasmBytecodeGenerator::EmitBinExpr(Js::OpCodeAsmJs op, const WasmTypes: WasmTypes::WasmType lhsType = signature[1]; WasmTypes::WasmType rhsType = signature[2]; - EmitInfo rhs = PopEvalStack(lhsType); - EmitInfo lhs = PopEvalStack(rhsType); + EmitInfo rhs = PopEvalStack(rhsType); + EmitInfo lhs = PopEvalStack(lhsType); ReleaseLocation(&rhs); ReleaseLocation(&lhs); @@ -1282,6 +1464,167 @@ EmitInfo WasmBytecodeGenerator::EmitUnaryExpr(Js::OpCodeAsmJs op, const WasmType return EmitInfo(resultReg, resultType); } +#ifdef ENABLE_WASM_SIMD +void WasmBytecodeGenerator::CheckLaneIndex(Js::OpCodeAsmJs op, const uint index) +{ + uint numLanes; + switch (op) + { + case Js::OpCodeAsmJs::Simd128_ExtractLane_I2: + case Js::OpCodeAsmJs::Simd128_ReplaceLane_I2: + case Js::OpCodeAsmJs::Simd128_ExtractLane_D2: + case Js::OpCodeAsmJs::Simd128_ReplaceLane_D2: + numLanes = 2; + break; + case Js::OpCodeAsmJs::Simd128_ExtractLane_I4: + case Js::OpCodeAsmJs::Simd128_ReplaceLane_I4: + case Js::OpCodeAsmJs::Simd128_ExtractLane_F4: + case Js::OpCodeAsmJs::Simd128_ReplaceLane_F4: + numLanes = 4; + break; + case Js::OpCodeAsmJs::Simd128_ExtractLane_I8: + case Js::OpCodeAsmJs::Simd128_ExtractLane_U8: + case Js::OpCodeAsmJs::Simd128_ReplaceLane_I8: + case Js::OpCodeAsmJs::Simd128_ReplaceLane_U8: + numLanes = 8; + break; + case Js::OpCodeAsmJs::Simd128_ExtractLane_I16: + case Js::OpCodeAsmJs::Simd128_ExtractLane_U16: + case Js::OpCodeAsmJs::Simd128_ReplaceLane_I16: + case Js::OpCodeAsmJs::Simd128_ReplaceLane_U16: + numLanes = 16; + break; + default: + Assert(UNREACHED); + numLanes = 0; + } + + if (index >= numLanes) + { + throw WasmCompilationException(_u("index is out of range")); + } +} + +EmitInfo WasmBytecodeGenerator::EmitLaneIndex(Js::OpCodeAsmJs op) +{ + const uint index = GetReader()->m_currentNode.lane.index; + CheckLaneIndex(op, index); + WasmConstLitNode dummy; + dummy.i32 = index; + return EmitConst(WasmTypes::I32, dummy); +} + +EmitInfo WasmBytecodeGenerator::EmitReplaceLaneExpr(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature) { + + const WasmTypes::WasmType resultType = signature[0]; + const WasmTypes::WasmType valueType = signature[1]; + EmitInfo valueArg = PopEvalStack(valueType, _u("lane argument type mismatch")); + + EmitInfo simdArg = PopEvalStack(WasmTypes::M128, _u("simd argument type mismatch")); + Assert(resultType == WasmTypes::M128); + + EmitInfo indexInfo = EmitLaneIndex(op); + Js::RegSlot resultReg = GetRegisterSpace(resultType)->AcquireTmpRegister(); + EmitInfo result(resultReg, resultType); + + m_writer->AsmReg4(op, resultReg, simdArg.location, indexInfo.location, valueArg.location); + ReleaseLocation(&indexInfo); + return result; +} + +EmitInfo WasmBytecodeGenerator::EmitM128BitSelect() +{ + EmitInfo mask = PopEvalStack(WasmTypes::M128); + EmitInfo arg2Info = PopEvalStack(WasmTypes::M128); + EmitInfo arg1Info = PopEvalStack(WasmTypes::M128); + Js::RegSlot resultReg = GetRegisterSpace(WasmTypes::M128)->AcquireTmpRegister(); + EmitInfo resultInfo(resultReg, WasmTypes::M128); + m_writer->AsmReg4(Js::OpCodeAsmJs::Simd128_BitSelect_I4, resultReg, arg1Info.location, arg2Info.location, mask.location); + return resultInfo; +} + +EmitInfo WasmBytecodeGenerator::EmitV8X16Shuffle() +{ + EmitInfo arg2Info = PopEvalStack(WasmTypes::M128); + EmitInfo arg1Info = PopEvalStack(WasmTypes::M128); + + Js::RegSlot resultReg = GetRegisterSpace(WasmTypes::M128)->AcquireTmpRegister(); + EmitInfo resultInfo(resultReg, WasmTypes::M128); + + uint8* indices = GetReader()->m_currentNode.shuffle.indices; + for (uint i = 0; i < Simd::MAX_LANES; i++) + { + if (indices[i] >= Simd::MAX_LANES * 2) + { + throw WasmCompilationException(_u("%u-th shuffle lane index is larger than %u"), i, (Simd::MAX_LANES * 2 -1)); + } + } + + m_writer->AsmShuffle(Js::OpCodeAsmJs::Simd128_Shuffle_V8X16, resultReg, arg1Info.location, arg2Info.location, indices); + return resultInfo; +} + +EmitInfo WasmBytecodeGenerator::EmitExtractLaneExpr(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature) +{ + WasmTypes::WasmType resultType = signature[0]; + WasmTypes::WasmType simdArgType = signature[1]; + + EmitInfo simdArgInfo = PopEvalStack(simdArgType, _u("Argument should be of type M128")); + + Js::RegSlot resultReg = GetRegisterSpace(resultType)->AcquireTmpRegister(); + EmitInfo resultInfo(resultReg, resultType); + + //put index into a register to reuse the existing infra in Interpreter and Compiler + EmitInfo indexInfo = EmitLaneIndex(op); + + m_writer->AsmReg3(op, resultReg, simdArgInfo.location, indexInfo.location); + ReleaseLocation(&indexInfo); + ReleaseLocation(&simdArgInfo); + return resultInfo; +} + +EmitInfo WasmBytecodeGenerator::EmitSimdMemAccess(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature, Js::ArrayBufferView::ViewType viewType, uint8 dataWidth, bool isStore) +{ + + WasmTypes::WasmType type = signature[0]; + SetUsesMemory(0); + + const uint32 mask = Js::ArrayBufferView::ViewMask[viewType]; + const uint alignment = GetReader()->m_currentNode.mem.alignment; + const uint offset = GetReader()->m_currentNode.mem.offset; + + if ((mask << 1) & (1 << alignment)) + { + throw WasmCompilationException(_u("alignment must not be larger than natural")); + } + + EmitInfo rhsInfo; + if (isStore) + { + rhsInfo = PopEvalStack(type, _u("Invalid type for store op")); + } + EmitInfo exprInfo = PopEvalStack(WasmTypes::I32, _u("Index expression must be of type i32")); + + if (isStore) + { + m_writer->AsmSimdTypedArr(op, rhsInfo.location, exprInfo.location, dataWidth, viewType, offset); + + ReleaseLocation(&rhsInfo); + ReleaseLocation(&exprInfo); + + return EmitInfo(); + } + + Js::RegSlot resultReg = GetRegisterSpace(type)->AcquireTmpRegister(); + m_writer->AsmSimdTypedArr(op, resultReg, exprInfo.location, dataWidth, viewType, offset); + + EmitInfo yieldInfo = EmitInfo(resultReg, type); + ReleaseLocation(&exprInfo); + + return yieldInfo; +} +#endif + EmitInfo WasmBytecodeGenerator::EmitMemAccess(WasmOp wasmOp, const WasmTypes::WasmType* signature, Js::ArrayBufferView::ViewType viewType, bool isStore) { WasmTypes::WasmType type = signature[0]; @@ -1313,7 +1656,7 @@ EmitInfo WasmBytecodeGenerator::EmitMemAccess(WasmOp wasmOp, const WasmTypes::Wa } ReleaseLocation(&exprInfo); - Js::RegSlot resultReg = GetRegisterSpace(type)->AcquireTmpRegister(); + Js::RegSlot resultReg = GetRegisterSpace(type)->AcquireTmpRegister(); m_writer->WasmMemAccess(Js::OpCodeAsmJs::LdArrWasm, resultReg, exprInfo.location, offset, viewType); EmitInfo yieldInfo; @@ -1327,14 +1670,9 @@ EmitInfo WasmBytecodeGenerator::EmitMemAccess(WasmOp wasmOp, const WasmTypes::Wa void WasmBytecodeGenerator::EmitReturnExpr(EmitInfo* explicitRetInfo) { - if (m_funcInfo->GetResultType() == WasmTypes::Void) + if (m_funcInfo->GetResultType() != WasmTypes::Void) { - // TODO (michhol): consider moving off explicit 0 for return reg - m_writer->AsmReg1(Js::OpCodeAsmJs::LdUndef, 0); - } - else - { - EmitInfo retExprInfo = explicitRetInfo ? *explicitRetInfo : PopEvalStack(); + EmitInfo retExprInfo = explicitRetInfo ? *explicitRetInfo : PopStackPolymorphic(); if (retExprInfo.type != WasmTypes::Any && m_funcInfo->GetResultType() != retExprInfo.type) { throw WasmCompilationException(_u("Result type must match return type")); @@ -1352,7 +1690,7 @@ void WasmBytecodeGenerator::EmitReturnExpr(EmitInfo* explicitRetInfo) EmitInfo WasmBytecodeGenerator::EmitSelect() { EmitInfo conditionInfo = PopEvalStack(WasmTypes::I32, _u("select condition must have i32 type")); - EmitInfo falseInfo = PopEvalStack(); + EmitInfo falseInfo = PopValuePolymorphic(); EmitInfo trueInfo = PopEvalStack(falseInfo.type, _u("select operands must both have same type")); ReleaseLocation(&conditionInfo); ReleaseLocation(&falseInfo); @@ -1400,7 +1738,7 @@ void WasmBytecodeGenerator::EmitBr() BlockInfo blockInfo = GetBlockInfo(depth); if (blockInfo.HasYield()) { - EmitInfo info = PopEvalStack(); + EmitInfo info = PopStackPolymorphic(); YieldToBlock(blockInfo, info); ReleaseLocation(&info); } @@ -1419,7 +1757,7 @@ EmitInfo WasmBytecodeGenerator::EmitBrIf() BlockInfo blockInfo = GetBlockInfo(depth); if (blockInfo.HasYield()) { - info = PopEvalStack(); + info = PopStackPolymorphic(); YieldToBlock(blockInfo, info); if (info.type == WasmTypes::Any) { @@ -1445,6 +1783,11 @@ Js::OpCodeAsmJs WasmBytecodeGenerator::GetLoadOp(WasmTypes::WasmType wasmType) return Js::OpCodeAsmJs::Ld_Int; case WasmTypes::I64: return Js::OpCodeAsmJs::Ld_Long; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + Simd::EnsureSimdIsEnabled(); + return Js::OpCodeAsmJs::Simd128_Ld_F4; +#endif case WasmTypes::Any: // In unreachable mode load the any type like an int since we won't actually emit the load Assert(IsUnreachable()); @@ -1474,6 +1817,12 @@ Js::OpCodeAsmJs WasmBytecodeGenerator::GetReturnOp(WasmTypes::WasmType type) case WasmTypes::I64: retOp = Js::OpCodeAsmJs::Return_Long; break; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + Simd::EnsureSimdIsEnabled(); + retOp = Js::OpCodeAsmJs::Simd128_Return_F4; + break; +#endif case WasmTypes::Any: // In unreachable mode load the any type like an int since we won't actually emit the load Assert(IsUnreachable()); @@ -1553,7 +1902,7 @@ void WasmBytecodeGenerator::YieldToBlock(BlockInfo blockInfo, EmitInfo expr) if (!IsUnreachable()) { blockInfo.yieldInfo->didYield = true; - m_writer->AsmReg2(GetLoadOp(expr.type), yieldInfo.location, expr.location); + m_writer->AsmReg2(GetReturnOp(expr.type), yieldInfo.location, expr.location); } } } @@ -1567,19 +1916,49 @@ Wasm::BlockInfo WasmBytecodeGenerator::GetBlockInfo(uint32 relativeDepth) const return m_blockInfos.Peek(relativeDepth); } +Js::ProfileId +WasmBytecodeGenerator::GetNextProfileId() +{ + Js::ProfileId nextProfileId = this->currentProfileId; + UInt16Math::Inc(this->currentProfileId); + return nextProfileId; +} + WasmRegisterSpace* WasmBytecodeGenerator::GetRegisterSpace(WasmTypes::WasmType type) { switch (type) { +#if TARGET_32 + case WasmTypes::Ptr: +#endif case WasmTypes::I32: return mTypedRegisterAllocator.GetRegisterSpace(WAsmJs::INT32); - case WasmTypes::I64: return mTypedRegisterAllocator.GetRegisterSpace(WAsmJs::INT64); - case WasmTypes::F32: return mTypedRegisterAllocator.GetRegisterSpace(WAsmJs::FLOAT32); - case WasmTypes::F64: return mTypedRegisterAllocator.GetRegisterSpace(WAsmJs::FLOAT64); +#if TARGET_64 + case WasmTypes::Ptr: +#endif + case WasmTypes::I64: return mTypedRegisterAllocator.GetRegisterSpace(WAsmJs::INT64); + case WasmTypes::F32: return mTypedRegisterAllocator.GetRegisterSpace(WAsmJs::FLOAT32); + case WasmTypes::F64: return mTypedRegisterAllocator.GetRegisterSpace(WAsmJs::FLOAT64); +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + Simd::EnsureSimdIsEnabled(); + return mTypedRegisterAllocator.GetRegisterSpace(WAsmJs::SIMD); +#endif default: return nullptr; } } + +Wasm::EmitInfo WasmBytecodeGenerator::PopStackPolymorphic(WasmTypes::WasmType expectedType, const char16* mismatchMessage) +{ + // Check the stack before popping, it is valid to yield nothing if we are Unreachable + if (IsUnreachable() && m_evalStack.Peek().type == WasmTypes::Limit) + { + return EmitInfo(WasmTypes::Any); + } + return PopEvalStack(expectedType, mismatchMessage); +} + EmitInfo WasmBytecodeGenerator::PopEvalStack(WasmTypes::WasmType expectedType, const char16* mismatchMessage) { // The scope marker should at least be there @@ -1619,7 +1998,7 @@ void WasmBytecodeGenerator::ExitEvalStackScope() Assert(!m_evalStack.Empty()); EmitInfo info = m_evalStack.Pop(); // It is possible to have unconsumed Any type left on the stack, simply remove them - while (info.type == WasmTypes::Any) + while (info.type == WasmTypes::Any) { Assert(!m_evalStack.Empty()); info = m_evalStack.Pop(); diff --git a/deps/chakrashim/core/lib/WasmReader/WasmByteCodeGenerator.h b/deps/chakrashim/core/lib/WasmReader/WasmByteCodeGenerator.h index ee11a97474a..02bc29cc383 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmByteCodeGenerator.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmByteCodeGenerator.h @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #pragma once @@ -145,13 +145,6 @@ namespace Wasm typedef JsUtil::BaseDictionary WasmExportDictionary; - struct WasmReaderInfo - { - Field(WasmFunctionInfo*) m_funcInfo; - Field(Js::WebAssemblyModule*) m_module; - Field(Js::Var) m_bufferSrc; - }; - class WasmModuleGenerator { public: @@ -173,8 +166,6 @@ namespace Wasm static const Js::RegSlot ModuleSlotRegister = 0; static const Js::RegSlot ReturnRegister = 0; - static const Js::RegSlot FunctionRegister = 0; - static const Js::RegSlot CallReturnRegister = 0; static const Js::RegSlot ModuleEnvRegister = 1; static const Js::RegSlot ArrayBufferRegister = 2; static const Js::RegSlot ArraySizeRegister = 3; @@ -188,6 +179,8 @@ namespace Wasm private: void GenerateFunction(); + template + EmitInfo EmitSimdBuildExpr(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature); void EmitExpr(WasmOp op); EmitInfo EmitBlock(); void EmitBlockCommon(BlockInfo* blockInfo, bool* endOnElse = nullptr); @@ -219,14 +212,21 @@ namespace Wasm EmitInfo EmitBrIf(); EmitInfo EmitMemAccess(WasmOp wasmOp, const WasmTypes::WasmType* signature, Js::ArrayBufferView::ViewType viewType, bool isStore); + EmitInfo EmitSimdMemAccess(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature, Js::ArrayBufferView::ViewType viewType, uint8 dataWidth, bool isStore); EmitInfo EmitBinExpr(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature); EmitInfo EmitUnaryExpr(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature); + EmitInfo EmitM128BitSelect(); + EmitInfo EmitV8X16Shuffle(); + EmitInfo EmitExtractLaneExpr(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature); + EmitInfo EmitReplaceLaneExpr(Js::OpCodeAsmJs op, const WasmTypes::WasmType* signature); + void CheckLaneIndex(Js::OpCodeAsmJs op, const uint index); + EmitInfo EmitLaneIndex(Js::OpCodeAsmJs op); EmitInfo EmitConst(WasmTypes::WasmType type, WasmConstLitNode cnst); void EmitLoadConst(EmitInfo dst, WasmConstLitNode cnst); WasmConstLitNode GetZeroCnst(); - void EnsureStackAvailable(); + void EnregisterLocals(); void ReleaseLocation(EmitInfo* info); @@ -239,6 +239,8 @@ namespace Wasm Js::OpCodeAsmJs GetReturnOp(WasmTypes::WasmType type); WasmRegisterSpace* GetRegisterSpace(WasmTypes::WasmType type); + EmitInfo PopValuePolymorphic() { return PopEvalStack(); } + EmitInfo PopStackPolymorphic(WasmTypes::WasmType expectedType = WasmTypes::Any, const char16* mismatchMessage = nullptr); EmitInfo PopEvalStack(WasmTypes::WasmType expectedType = WasmTypes::Any, const char16* mismatchMessage = nullptr); void PushEvalStack(EmitInfo); EmitInfo EnsureYield(BlockInfo); @@ -252,6 +254,7 @@ namespace Wasm Js::FunctionBody* GetFunctionBody() const { return m_funcInfo->GetBody(); } WasmReaderBase* GetReader() const; + Js::ProfileId GetNextProfileId(); bool IsValidating() const { return m_originalWriter == m_emptyWriter; } ArenaAllocator m_alloc; @@ -271,6 +274,7 @@ namespace Wasm WAsmJs::TypedRegisterAllocator mTypedRegisterAllocator; + Js::ProfileId currentProfileId; JsUtil::Stack m_blockInfos; JsUtil::Stack m_evalStack; }; diff --git a/deps/chakrashim/core/lib/WasmReader/WasmCustomReader.cpp b/deps/chakrashim/core/lib/WasmReader/WasmCustomReader.cpp index a1d130a567d..307bfa10cef 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmCustomReader.cpp +++ b/deps/chakrashim/core/lib/WasmReader/WasmCustomReader.cpp @@ -44,5 +44,12 @@ void WasmCustomReader::AddNode(WasmNode node) m_nodes.Add(node); } +const uint32 WasmCustomReader::EstimateCurrentFunctionBytecodeSize() const +{ + uint32 count = min((uint32)m_nodes.Count(), (uint32)AutoSystemInfo::PageSize); + // On average each node takes between 3 - 7 bytes to encode + return count * 5; +} + }; #endif \ No newline at end of file diff --git a/deps/chakrashim/core/lib/WasmReader/WasmCustomReader.h b/deps/chakrashim/core/lib/WasmReader/WasmCustomReader.h index 20162a2da9c..eb0785bc5c4 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmCustomReader.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmCustomReader.h @@ -15,6 +15,7 @@ namespace Wasm virtual bool IsCurrentFunctionCompleted() const override; virtual WasmOp ReadExpr() override; virtual void FunctionEnd() override; + virtual const uint32 EstimateCurrentFunctionBytecodeSize() const override; void AddNode(WasmNode node); private: diff --git a/deps/chakrashim/core/lib/WasmReader/WasmFunctionInfo.h b/deps/chakrashim/core/lib/WasmReader/WasmFunctionInfo.h index e6f32a8c7cb..03ba0898951 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmFunctionInfo.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmFunctionInfo.h @@ -7,6 +7,19 @@ namespace Wasm { + class WasmReaderBase; + + // All the Wasm function's share the same reader (except when using CustomReaders) + // This struct is used to remember where is this particular function in the buffer + struct FunctionBodyReaderInfo + { + friend class WasmBinaryReader; + FunctionBodyReaderInfo(uint32 size = 0, size_t startOffset = 0): size(size), startOffset(startOffset) {} + private: + Field(uint32) size = 0; + Field(size_t) startOffset = 0; + }; + class WasmFunctionInfo { public: @@ -37,7 +50,16 @@ namespace Wasm FieldNoBarrier(WasmImport*) importedFunctionReference; #endif - Field(FunctionBodyReaderInfo) m_readerInfo; + FunctionBodyReaderInfo GetReaderInfo() const + { + AssertMsg(!m_customReader, "ReaderInfo is not needed and invalid when a custom reader is present"); + return m_readerInfo; + } + void SetReaderInfo(FunctionBodyReaderInfo info) + { + AssertMsg(!m_customReader, "ReaderInfo is not needed and invalid when a custom reader is present"); + m_readerInfo = info; + } private: FieldNoBarrier(ArenaAllocator*) m_alloc; @@ -50,5 +72,6 @@ namespace Wasm Field(const char16*) m_name; Field(uint32) m_nameLength; Field(uint32) m_number; + Field(FunctionBodyReaderInfo) m_readerInfo; }; } // namespace Wasm diff --git a/deps/chakrashim/core/lib/WasmReader/WasmLimits.h b/deps/chakrashim/core/lib/WasmReader/WasmLimits.h index 2aba3b50bea..406c88dbb82 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmLimits.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmLimits.h @@ -26,25 +26,25 @@ namespace Wasm { static const uint32 MaxMemoryInitialPages = 16384; static const uint32 MaxMemoryMaximumPages = 65536; static const uint32 MaxModuleSize = 1024 * 1024 * 1024; - static const uint32 MaxFunctionSize = 128 * 1024; + static const uint32 MaxFunctionSize = 7654321; public: // Use accessors to easily switch to config flags if needed - static uint32 GetMaxTypes() { return MaxTypes; } - static uint32 GetMaxFunctions() { return MaxFunctions; } - static uint32 GetMaxImports() { return MaxImports; } - static uint32 GetMaxExports() { return MaxExports; } - static uint32 GetMaxGlobals() { return MaxGlobals; } - static uint32 GetMaxDataSegments() { return MaxDataSegments; } - static uint32 GetMaxElementSegments() { return MaxElementSegments; } - static uint32 GetMaxTableSize() { return CONFIG_FLAG(WasmMaxTableSize); } - static uint32 GetMaxStringSize() { return MaxStringSize; } - static uint32 GetMaxFunctionLocals() { return MaxFunctionLocals; } - static uint32 GetMaxFunctionParams() { return MaxFunctionParams; } - static uint64 GetMaxBrTableElems() { return MaxBrTableElems; } - static uint32 GetMaxMemoryInitialPages() { return MaxMemoryInitialPages; } - static uint32 GetMaxMemoryMaximumPages() { return MaxMemoryMaximumPages; } - static uint32 GetMaxModuleSize() { return MaxModuleSize; } - static uint32 GetMaxFunctionSize() { return MaxFunctionSize; } + static uint32 GetMaxTypes() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxTypes; } + static uint32 GetMaxFunctions() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxFunctions; } + static uint32 GetMaxImports() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxImports; } + static uint32 GetMaxExports() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxExports; } + static uint32 GetMaxGlobals() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxGlobals; } + static uint32 GetMaxDataSegments() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxDataSegments; } + static uint32 GetMaxElementSegments() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxElementSegments; } + static uint32 GetMaxTableSize() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : CONFIG_FLAG(WasmMaxTableSize); } + static uint32 GetMaxStringSize() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxStringSize; } + static uint32 GetMaxFunctionLocals() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxFunctionLocals; } + static uint32 GetMaxFunctionParams() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxFunctionParams; } + static uint64 GetMaxBrTableElems() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxBrTableElems; } + static uint32 GetMaxMemoryInitialPages() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxMemoryInitialPages; } + static uint32 GetMaxMemoryMaximumPages() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxMemoryMaximumPages; } + static uint32 GetMaxModuleSize() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxModuleSize; } + static uint32 GetMaxFunctionSize() { return CONFIG_FLAG(WasmIgnoreLimits) ? UINT32_MAX : MaxFunctionSize; } }; } #endif diff --git a/deps/chakrashim/core/lib/WasmReader/WasmParseTree.h b/deps/chakrashim/core/lib/WasmReader/WasmParseTree.h index ab353973580..2643ae1afc6 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmParseTree.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmParseTree.h @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- @@ -7,6 +7,15 @@ namespace Wasm { + const uint16 EXTENDED_OFFSET = 256; + namespace Simd { + const size_t VEC_WIDTH = 4; + typedef uint32 simdvec [VEC_WIDTH]; //TODO: maybe we should pull in SIMDValue? + const size_t MAX_LANES = 16; + void EnsureSimdIsEnabled(); + bool IsEnabled(); + } + namespace WasmTypes { enum WasmType @@ -17,13 +26,21 @@ namespace Wasm I64 = 2, F32 = 3, F64 = 4, +#ifdef ENABLE_WASM_SIMD + M128 = 5, +#endif Limit, + Ptr, Any }; + + extern const char16* const strIds[Limit]; + bool IsLocalType(WasmTypes::WasmType type); uint32 GetTypeByteSize(WasmType type); const char16* GetTypeName(WasmType type); } + typedef WasmTypes::WasmType Local; namespace ExternalKinds { @@ -63,9 +80,11 @@ namespace Wasm #include "WasmBinaryOpCodes.h" }; - enum WasmOp : byte + enum WasmOp : uint16 { -#define WASM_OPCODE(opname, opcode, sig, nyi) wb##opname = opcode, +#define WASM_OPCODE(opname, opcode, ...) wb##opname = opcode, +// Add prefix to the enum to get a compiler error if there is a collision between operators and prefixes +#define WASM_PREFIX(name, value, ...) prefix##name = value, #include "WasmBinaryOpCodes.h" }; @@ -77,9 +96,20 @@ namespace Wasm double f64; int32 i32; int64 i64; + Simd::simdvec v128; }; }; + struct WasmShuffleNode + { + uint8 indices[Simd::MAX_LANES]; + }; + + struct WasmLaneNode + { + uint index; + }; + struct WasmVarNode { uint32 num; @@ -126,6 +156,8 @@ namespace Wasm WasmConstLitNode cnst; WasmMemOpNode mem; WasmVarNode var; + WasmLaneNode lane; + WasmShuffleNode shuffle; }; }; diff --git a/deps/chakrashim/core/lib/WasmReader/WasmReader.h b/deps/chakrashim/core/lib/WasmReader/WasmReader.h index 801abcc925c..bf19d68aa1f 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmReader.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmReader.h @@ -5,71 +5,13 @@ #pragma once -#include "Common.h" -#include "Runtime.h" -#include "Language/WAsmjsUtils.h" #ifdef ENABLE_WASM -#if ENABLE_DEBUG_CONFIG_OPTIONS -#define TRACE_WASM(condition, ...) \ - if (condition)\ - {\ - Output::Print(__VA_ARGS__); \ - Output::Print(_u("\n")); \ - Output::Flush(); \ - } - -// Level of tracing -#define DO_WASM_TRACE_ALL PHASE_TRACE1(Js::WasmPhase) -#define DO_WASM_TRACE_BYTECODE DO_WASM_TRACE_ALL || PHASE_TRACE(Js::WasmBytecodePhase, GetFunctionBody()) -#define DO_WASM_TRACE_DECODER DO_WASM_TRACE_ALL || PHASE_TRACE1(Js::WasmReaderPhase) - #define DO_WASM_TRACE_SECTION DO_WASM_TRACE_DECODER || PHASE_TRACE1(Js::WasmSectionPhase) -#define DO_WASM_TRACE_LEB128 PHASE_TRACE1(Js::WasmLEB128Phase) -#else -#define TRACE_WASM(...) -#define DO_WASM_TRACE_ALL (false) -#define DO_WASM_TRACE_BYTECODE (false) -#define DO_WASM_TRACE_DECODER (false) -#define DO_WASM_TRACE_SECTION (false) -#define DO_WASM_TRACE_LEB128 (false) -#endif -#define TRACE_WASM_BYTECODE(...) TRACE_WASM(DO_WASM_TRACE_BYTECODE, __VA_ARGS__) -#define TRACE_WASM_DECODER(...) TRACE_WASM(DO_WASM_TRACE_DECODER, __VA_ARGS__) -#define TRACE_WASM_SECTION(...) TRACE_WASM(DO_WASM_TRACE_SECTION, __VA_ARGS__) -#define TRACE_WASM_LEB128(...) TRACE_WASM(DO_WASM_TRACE_LEB128, __VA_ARGS__) - -namespace Wasm -{ - // forward declarations - struct WasmNode; - struct SExprParseContext; - class WasmFunctionInfo; -} +// These are the WasmReader related structures that are needed outside of Chakra.WasmReader lib #include "WasmParseTree.h" - -namespace Wasm -{ - typedef WasmTypes::WasmType Local; -} - -#include "WasmReaderBase.h" #include "WasmSignature.h" -#include "WasmDataSegment.h" -#include "WasmElementSegment.h" #include "WasmFunctionInfo.h" - -#include "WasmSection.h" - -#include "WasmBinaryReader.h" -#include "WasmCustomReader.h" -#include "WasmByteCodeGenerator.h" - -#include "WasmGlobal.h" - -// TODO (michhol): cleanup includes -#include "ByteCode/ByteCodeDumper.h" -#include "ByteCode/AsmJsByteCodeDumper.h" -#include "Language/AsmJsTypes.h" +#include "WasmReaderInfo.h" #endif // ENABLE_WASM diff --git a/deps/chakrashim/core/lib/WasmReader/WasmReaderBase.h b/deps/chakrashim/core/lib/WasmReader/WasmReaderBase.h index 1f29cb048cb..8f71d883817 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmReaderBase.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmReaderBase.h @@ -7,12 +7,6 @@ #ifdef ENABLE_WASM namespace Wasm { - struct FunctionBodyReaderInfo - { - Field(uint32) size; - Field(intptr_t) startOffset; - }; - class WasmReaderBase { public: @@ -20,6 +14,7 @@ namespace Wasm virtual bool IsCurrentFunctionCompleted() const = 0; virtual WasmOp ReadExpr() = 0; virtual void FunctionEnd() = 0; + virtual const uint32 EstimateCurrentFunctionBytecodeSize() const = 0; WasmNode m_currentNode; }; } // namespace Wasm diff --git a/deps/chakrashim/core/lib/WasmReader/WasmReaderInfo.h b/deps/chakrashim/core/lib/WasmReader/WasmReaderInfo.h new file mode 100644 index 00000000000..3d8dea3e2e7 --- /dev/null +++ b/deps/chakrashim/core/lib/WasmReader/WasmReaderInfo.h @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +#pragma once + +namespace Js +{ +class WebAssemblyModule; +} + +namespace Wasm +{ +class WasmFunctionInfo; +struct WasmReaderInfo +{ + Field(WasmFunctionInfo*) m_funcInfo; + Field(Js::WebAssemblyModule*) m_module; + Field(Js::Var) m_bufferSrc; +}; +} diff --git a/deps/chakrashim/core/lib/WasmReader/WasmReaderPch.h b/deps/chakrashim/core/lib/WasmReader/WasmReaderPch.h index b5e761a8ff7..9d79875f6dc 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmReaderPch.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmReaderPch.h @@ -6,12 +6,42 @@ #pragma once // Parser Includes +#include "Common.h" +#include "Runtime.h" #include "WasmReader.h" #ifdef ENABLE_WASM -// AsmJsFunctionMemory::RequiredVarConstants -#include "../Language/AsmJsModule.h" +#if ENABLE_DEBUG_CONFIG_OPTIONS +#define TRACE_WASM(condition, ...) \ + if (condition)\ + {\ + Output::Print(__VA_ARGS__); \ + Output::Print(_u("\n")); \ + Output::Flush(); \ + } + +// Level of tracing +#define WASM_TRACE_BODY_CHECK(phase) (GetFunctionBody() ? PHASE_TRACE(phase, GetFunctionBody()) : PHASE_TRACE1(phase)) +#define DO_WASM_TRACE_BYTECODE WASM_TRACE_BODY_CHECK(Js::WasmBytecodePhase) +#define DO_WASM_TRACE_DECODER WASM_TRACE_BODY_CHECK(Js::WasmReaderPhase) +#define DO_WASM_TRACE_SECTION WASM_TRACE_BODY_CHECK(Js::WasmSectionPhase) +#else +#define TRACE_WASM(...) +#define DO_WASM_TRACE_BYTECODE (false) +#define DO_WASM_TRACE_DECODER (false) +#define DO_WASM_TRACE_SECTION (false) #endif +#define TRACE_WASM_BYTECODE(...) TRACE_WASM(DO_WASM_TRACE_BYTECODE, __VA_ARGS__) +#define TRACE_WASM_DECODER(...) TRACE_WASM(DO_WASM_TRACE_DECODER, __VA_ARGS__) +#define TRACE_WASM_SECTION(...) TRACE_WASM(DO_WASM_TRACE_SECTION, __VA_ARGS__) + +#include "WasmSection.h" +#include "WasmReaderBase.h" +#include "WasmBinaryReader.h" +#include "WasmCustomReader.h" +#include "WasmGlobal.h" +#include "WasmDataSegment.h" +#include "WasmElementSegment.h" +#include "WasmByteCodeGenerator.h" -// Runtime includes -#include "../Runtime/Runtime.h" +#endif diff --git a/deps/chakrashim/core/lib/WasmReader/WasmSignature.cpp b/deps/chakrashim/core/lib/WasmReader/WasmSignature.cpp index b1eecc0050f..5070720b044 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmSignature.cpp +++ b/deps/chakrashim/core/lib/WasmReader/WasmSignature.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. +// Copyright (C) Microsoft Corporation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- @@ -79,11 +79,14 @@ size_t WasmSignature::GetShortSig() const return m_shortSig; } +template bool WasmSignature::IsEquivalent(const WasmSignature* sig) const { - if (m_shortSig != Js::Constants::InvalidSignature) + if (useShortSig && m_shortSig != Js::Constants::InvalidSignature) { - return sig->GetShortSig() == m_shortSig; + bool isEquivalent = sig->GetShortSig() == m_shortSig; + Assert(this->IsEquivalent(sig) == isEquivalent); + return isEquivalent; } if (GetResultType() == sig->GetResultType() && GetParamCount() == sig->GetParamCount() && @@ -93,6 +96,8 @@ bool WasmSignature::IsEquivalent(const WasmSignature* sig) const } return false; } +template bool WasmSignature::IsEquivalent(const WasmSignature*) const; +template bool WasmSignature::IsEquivalent(const WasmSignature*) const; Js::ArgSlot WasmSignature::GetParamSize(Js::ArgSlot index) const { @@ -115,6 +120,13 @@ Js::ArgSlot WasmSignature::GetParamSize(Js::ArgSlot index) const CompileAssert(sizeof(double) == sizeof(int64)); return sizeof(int64); break; +#ifdef ENABLE_WASM_SIMD + case WasmTypes::M128: + Wasm::Simd::EnsureSimdIsEnabled(); + CompileAssert(sizeof(Simd::simdvec) == 16); + return sizeof(Simd::simdvec); + break; +#endif default: throw WasmCompilationException(_u("Invalid param type")); } @@ -134,19 +146,38 @@ void WasmSignature::FinalizeSignature() } } - CompileAssert(Local::Limit - 1 <= 4); + // 3 bits for result type, 3 for each arg + const uint32 nBitsForResult = 3; +#ifdef ENABLE_WASM_SIMD + const uint32 nBitsForArgs = 3; +#else + // We can drop 1 bit by excluding void + const uint32 nBitsForArgs = 2; +#endif CompileAssert(Local::Void == 0); + // Make sure we can encode all types (including void) with the number of bits reserved + CompileAssert(Local::Limit <= (1 << nBitsForResult)); + // Make sure we can encode all types (excluding void) with the number of bits reserved + CompileAssert(Local::Limit - 1 <= (1 << nBitsForArgs)); + + ::Math::RecordOverflowPolicy sigOverflow; + const uint32 bitsRequiredForSig = UInt32Math::MulAdd((uint32)paramCount, sigOverflow); + if (sigOverflow.HasOverflowed()) + { + return; + } - // 3 bits for result type, 2 for each arg // we don't need to reserve a sentinel bit because there is no result type with value of 7 - uint32 sigSize = ((uint32)paramCount) * 2 + 3; - if (sigSize <= sizeof(m_shortSig) << 3) + CompileAssert(Local::Limit <= 0b111); + const uint32 nAvailableBits = sizeof(m_shortSig) * 8; + if (bitsRequiredForSig <= nAvailableBits) { - m_shortSig = (m_shortSig << 3) | m_resultType; + // Append the result type to the signature + m_shortSig = (m_shortSig << nBitsForResult) | m_resultType; for (Js::ArgSlot i = 0; i < paramCount; ++i) { - // we can use 2 bits per arg by dropping void - m_shortSig = (m_shortSig << 2) | (m_params[i] - 1); + // Append the param type to the signature, -1 to exclude Void + m_shortSig = (m_shortSig << nBitsForArgs) | (m_params[i] - 1); } } } @@ -196,11 +227,11 @@ uint32 WasmSignature::WriteSignatureToString(_Out_writes_(maxlen) char16* out, u return numwritten; } -void WasmSignature::Dump() +void WasmSignature::Dump(uint32 maxlen) { #ifdef ENABLE_DEBUG_CONFIG_OPTIONS char16 buf[512] = { 0 }; - this->WriteSignatureToString(buf, 512); + this->WriteSignatureToString(buf, min(maxlen, 512u)); Output::Print(buf); #endif } diff --git a/deps/chakrashim/core/lib/WasmReader/WasmSignature.h b/deps/chakrashim/core/lib/WasmReader/WasmSignature.h index 144ad8181e2..551d7dda1ab 100644 --- a/deps/chakrashim/core/lib/WasmReader/WasmSignature.h +++ b/deps/chakrashim/core/lib/WasmReader/WasmSignature.h @@ -26,13 +26,14 @@ class WasmSignature uint32 GetSignatureId() const; size_t GetShortSig() const; + template bool IsEquivalent(const WasmSignature* sig) const; static WasmSignature* FromIDL(WasmSignatureIDL* sig); static uint32 GetOffsetOfShortSig() { return offsetof(WasmSignature, m_shortSig); } uint32 WriteSignatureToString(_Out_writes_(maxlen) char16 *out, uint32 maxlen); - void Dump(); + void Dump(uint32 maxlen = 512); private: Field(WasmTypes::WasmType) m_resultType; Field(uint32) m_id; diff --git a/deps/chakrashim/core/lib/wabt/CMakeLists.txt b/deps/chakrashim/core/lib/wabt/CMakeLists.txt index afb7f0463cd..2305b999d0a 100644 --- a/deps/chakrashim/core/lib/wabt/CMakeLists.txt +++ b/deps/chakrashim/core/lib/wabt/CMakeLists.txt @@ -37,16 +37,13 @@ endif () include(CheckTypeSize) check_type_size(ssize_t SSIZE_T) check_type_size(size_t SIZEOF_SIZE_T) -check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY) -check_type_size(long SIZEOF_LONG BUILTIN_TYPES_ONLY) -check_type_size("long long" SIZEOF_LONG_LONG BUILTIN_TYPES_ONLY) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/built/config.h ) -include_directories(chakra src ${CMAKE_CURRENT_SOURCE_DIR}/built) +include_directories(chakra ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/built) # disable -Wunused-parameter: this is really common when implementing # interfaces, etc. @@ -87,9 +84,11 @@ set(WAST_LEXER_GEN_CC src/prebuilt/wast-lexer-gen.cc) add_custom_target(everything) add_library(libwabt OBJECT + src/token.cc src/opcode.cc src/error-handler.cc src/hash-util.cc + src/filenames.cc src/string-view.cc src/ir.cc src/expr-visitor.cc @@ -108,8 +107,8 @@ add_library(libwabt OBJECT src/binary-reader-ir.cc src/binding-hash.cc src/wat-writer.cc - src/interpreter.cc - src/binary-reader-interpreter.cc + src/interp.cc + src/binary-reader-interp.cc src/apply-names.cc src/generate-names.cc src/resolve-names.cc @@ -119,12 +118,12 @@ add_library(libwabt OBJECT src/common.cc src/config.cc src/feature.cc + src/leb128.cc src/literal.cc src/option-parser.cc src/stream.cc src/tracing.cc src/utf8.cc - src/writer.cc chakra/wabtapi.cc diff --git a/deps/chakrashim/core/lib/wabt/README.md b/deps/chakrashim/core/lib/wabt/README.md index 2d6cd2b106b..b63d47b8cdd 100644 --- a/deps/chakrashim/core/lib/wabt/README.md +++ b/deps/chakrashim/core/lib/wabt/README.md @@ -4,11 +4,11 @@ WABT (we pronounce it "wabbit") is a suite of tools for WebAssembly, including: - - **wast2wasm**: translate from [WebAssembly text format](http://webassembly.github.io/spec/text/index.html) to the [WebAssembly binary format](http://webassembly.github.io/spec/binary/index.html) - - **wasm2wast**: the inverse of wast2wasm, translate from the binary format back to the text format (also known as a .wast) + - **wat2wasm**: translate from [WebAssembly text format](http://webassembly.github.io/spec/text/index.html) to the [WebAssembly binary format](http://webassembly.github.io/spec/binary/index.html) + - **wasm2wat**: the inverse of wat2wasm, translate from the binary format back to the text format (also known as a .wat) - **wasm-objdump**: print information about a wasm binary. Similiar to objdump. - **wasm-interp**: decode and run a WebAssembly binary file using a stack-based interpreter - - **wast-desugar**: parse .wast text form as supported by the spec interpreter (s-expressions, flat syntax, or mixed) and print "canonical" flat format + - **wat-desugar**: parse .wat text form as supported by the spec interpreter (s-expressions, flat syntax, or mixed) and print "canonical" flat format - **wasm-link**: simple linker for merging multiple wasm files. These tools are intended for use in (or for development of) toolchains or other @@ -24,9 +24,9 @@ target; instead they aim for full fidelity and compliance with the spec (e.g. Wabt has been compiled to JavaScript via emscripten. Some of the functionality is available in the following demos: -- [index](https://cdn.rawgit.com/WebAssembly/wabt/013802ca01035365e2459c70f0508481393ac075/demo/index.html) -- [wast2wasm](https://cdn.rawgit.com/WebAssembly/wabt/013802ca01035365e2459c70f0508481393ac075/demo/wast2wasm/) -- [wasm2wast](https://cdn.rawgit.com/WebAssembly/wabt/013802ca01035365e2459c70f0508481393ac075/demo/wasm2wast/) +- [index](https://cdn.rawgit.com/WebAssembly/wabt/aae5a4b7/demo/index.html) +- [wat2wasm](https://cdn.rawgit.com/WebAssembly/wabt/aae5a4b7/demo/wat2wasm/) +- [wasm2wat](https://cdn.rawgit.com/WebAssembly/wabt/aae5a4b7/demo/wasm2wat/) ## Cloning @@ -129,53 +129,53 @@ update-re2c` to update the prebuilt C sources in `src/prebuilt/`. CMake will detect if you don't have re2c installed and use the prebuilt source files instead. -## Running wast2wasm +## Running wat2wasm and wast2json Some examples: ```sh -# parse and typecheck test.wast -$ out/wast2wasm test.wast +# parse and typecheck test.wat +$ out/wat2wasm test.wat -# parse test.wast and write to binary file test.wasm -$ out/wast2wasm test.wast -o test.wasm +# parse test.wat and write to binary file test.wasm +$ out/wat2wasm test.wat -o test.wasm # parse spec-test.wast, and write verbose output to stdout (including the # meaning of every byte) -$ out/wast2wasm spec-test.wast -v +$ out/wat2wasm spec-test.wast -v # parse spec-test.wast, and write files to spec-test.json. Modules are written # to spec-test.0.wasm, spec-test.1.wasm, etc. -$ out/wast2wasm spec-test.wast --spec -o spec-test.json +$ out/wast2json spec-test.wast -o spec-test.json ``` You can use `-h` to get additional help: ```console -$ out/wast2wasm -h +$ out/wat2wasm -h ``` -Or try the [online demo](https://cdn.rawgit.com/WebAssembly/wabt/013802ca01035365e2459c70f0508481393ac075/demo/wast2wasm/). +Or try the [online demo](https://cdn.rawgit.com/WebAssembly/wabt/aae5a4b7/demo/wat2wasm/). -## Running wasm2wast +## Running wasm2wat Some examples: ```sh -# parse binary file test.wasm and write s-expression file test.wast -$ out/wasm2wast test.wasm -o test.wast +# parse binary file test.wasm and write text file test.wat +$ out/wasm2wat test.wasm -o test.wat -# parse test.wasm and write test.wast -$ out/wasm2wast test.wasm -o test.wast +# parse test.wasm and write test.wat +$ out/wasm2wat test.wasm -o test.wat ``` You can use `-h` to get additional help: ```console -$ out/wasm2wast -h +$ out/wasm2wat -h ``` -Or try the [online demo](https://cdn.rawgit.com/WebAssembly/wabt/013802ca01035365e2459c70f0508481393ac075/demo/wasm2wast/). +Or try the [online demo](https://cdn.rawgit.com/WebAssembly/wabt/aae5a4b7/demo/wasm2wat/). ## Running wasm-interp @@ -199,11 +199,11 @@ $ out/wasm-interp test.json --spec $ out/wasm-interp test.wasm -V 100 --run-all-exports ``` -As a convenience, you can use `test/run-interp.py` to convert a .wast file to +As a convenience, you can use `test/run-interp.py` to convert a .wat file to binary first, then run it in the interpreter: ```console -$ test/run-interp.py --spec spec-test.wast +$ test/run-interp.py --spec spec-test.wat 20/20 tests.passed. ``` diff --git a/deps/chakrashim/core/lib/wabt/chakra/wabtapi.cc b/deps/chakrashim/core/lib/wabt/chakra/wabtapi.cc index 4a4a25f9a7e..b48cf27e37b 100644 --- a/deps/chakrashim/core/lib/wabt/chakra/wabtapi.cc +++ b/deps/chakrashim/core/lib/wabt/chakra/wabtapi.cc @@ -6,14 +6,14 @@ #include "wabtapi.h" #pragma warning(push, 0) -#include "writer.h" -#include "wast-parser.h" -#include "wast-lexer.h" -#include "resolve-names.h" -#include "binary-writer.h" -#include "error-handler.h" -#include "ir.h" -#include "cast.h" +#include "src/wast-parser.h" +#include "src/wast-lexer.h" +#include "src/resolve-names.h" +#include "src/binary-writer.h" +#include "src/error-handler.h" +#include "src/ir.h" +#include "src/cast.h" +#include "src/validator.h" #pragma warning(pop) using namespace wabt; @@ -51,20 +51,25 @@ class MyErrorHandler : public ErrorHandler }; -struct MemoryWriterContext +namespace ChakraWabt { - MemoryWriter* writer; - Context* ctx; -}; + struct Context + { + ChakraContext* chakra; + WastLexer* lexer; + MyErrorHandler* errorHandler; + }; +} -struct AutoCleanScript +Features GetWabtFeatures(const ChakraContext& ctx) { - Script* script; - ~AutoCleanScript() + Features features; + if (ctx.features.sign_extends || ctx.features.threads) { - delete script; + features.enable_threads(); } -}; + return features; +} uint TruncSizeT(size_t value) { @@ -77,7 +82,7 @@ uint TruncSizeT(size_t value) void set_property(Context* ctx, Js::Var obj, PropertyId id, Js::Var value, const char* messageIfFailed) { - bool success = ctx->spec->setProperty(obj, id, value, ctx->user_data); + bool success = ctx->chakra->spec->setProperty(obj, id, value, ctx->chakra->user_data); if (!success) { throw Error(messageIfFailed); @@ -86,23 +91,23 @@ void set_property(Context* ctx, Js::Var obj, PropertyId id, Js::Var value, const void write_int32(Context* ctx, Js::Var obj, PropertyId id, int32 value) { - Js::Var line = ctx->spec->int32ToVar(value, ctx->user_data); + Js::Var line = ctx->chakra->spec->int32ToVar(value, ctx->chakra->user_data); set_property(ctx, obj, id, line, "Unable to write number"); } void write_int64(Context* ctx, Js::Var obj, PropertyId id, int64 value) { - Js::Var line = ctx->spec->int64ToVar(value, ctx->user_data); + Js::Var line = ctx->chakra->spec->int64ToVar(value, ctx->chakra->user_data); set_property(ctx, obj, id, line, "Unable to write number"); } void write_string(Context* ctx, Js::Var obj, PropertyId id, const char* src, size_t length = 0xFFFFFFFF) { - Js::Var str = ctx->spec->stringToVar(src, TruncSizeT(length == 0xFFFFFFFF ? strlen(src) : length), ctx->user_data); + Js::Var str = ctx->chakra->spec->stringToVar(src, TruncSizeT(length == 0xFFFFFFFF ? strlen(src) : length), ctx->chakra->user_data); set_property(ctx, obj, id, str, "Unable to write string"); } -void write_string(Context* ctx, Js::Var obj, PropertyId id, std::string src) +void write_string(Context* ctx, Js::Var obj, PropertyId id, const std::string& src) { write_string(ctx, obj, id, src.c_str(), src.size()); } @@ -150,18 +155,18 @@ void write_command_type(Context* ctx, CommandType type, Js::Var cmdObj) write_string(ctx, cmdObj, PropertyIds::type, s_command_names[i]); } -Js::Var create_const_vector(Context* ctx, const ConstVector* consts) +Js::Var create_const_vector(Context* ctx, const ConstVector& consts) { - Js::Var constsArr = ctx->spec->createArray(ctx->user_data); + Js::Var constsArr = ctx->chakra->spec->createArray(ctx->chakra->user_data); size_t i; - for (i = 0; i < consts->size(); ++i) + for (i = 0; i < consts.size(); ++i) { - Js::Var constDescriptor = ctx->spec->createObject(ctx->user_data); - ctx->spec->push(constsArr, constDescriptor, ctx->user_data); + Js::Var constDescriptor = ctx->chakra->spec->createObject(ctx->chakra->user_data); + ctx->chakra->spec->push(constsArr, constDescriptor, ctx->chakra->user_data); char buf[32]; - const Const& const_ = consts->at(i); + const Const& const_ = consts.at(i); switch (const_.type) { case Type::I32: @@ -189,7 +194,7 @@ Js::Var create_const_vector(Context* ctx, const ConstVector* consts) return constsArr; } -void write_const_vector(Context* ctx, Js::Var obj, PropertyId id, const ConstVector* consts) +void write_const_vector(Context* ctx, Js::Var obj, PropertyId id, const ConstVector& consts) { Js::Var constsArr = create_const_vector(ctx, consts); set_property(ctx, obj, id, constsArr, "Unable to write const vector"); @@ -197,19 +202,19 @@ void write_const_vector(Context* ctx, Js::Var obj, PropertyId id, const ConstVec Js::Var create_type_object(Context* ctx, Type type) { - Js::Var typeObj = ctx->spec->createObject(ctx->user_data); + Js::Var typeObj = ctx->chakra->spec->createObject(ctx->chakra->user_data); write_string(ctx, typeObj, PropertyIds::type, GetTypeName(type)); return typeObj; } -void write_action_result_type(Context* ctx, Js::Var obj, PropertyId id, Script* script, const Action* action) +void write_action_result_type(Context* ctx, Js::Var obj, PropertyId id, Script* script, const ActionPtr& action) { const Module* module = script->GetModule(action->module_var); const Export* export_; - Js::Var resultArr = ctx->spec->createArray(ctx->user_data); + Js::Var resultArr = ctx->chakra->spec->createArray(ctx->chakra->user_data); set_property(ctx, obj, id, resultArr, "Unable to set action result type"); - switch (action->type) + switch (action->type()) { case ActionType::Invoke: { @@ -221,7 +226,7 @@ void write_action_result_type(Context* ctx, Js::Var obj, PropertyId id, Script* for (i = 0; i < num_results; ++i) { Js::Var typeObj = create_type_object(ctx, func->GetResultType(i)); - ctx->spec->push(resultArr, typeObj, ctx->user_data); + ctx->chakra->spec->push(resultArr, typeObj, ctx->chakra->user_data); } break; } @@ -232,120 +237,124 @@ void write_action_result_type(Context* ctx, Js::Var obj, PropertyId id, Script* assert(export_->kind == ExternalKind::Global); const Global* global = module->GetGlobal(export_->var); Js::Var typeObj = create_type_object(ctx, global->type); - ctx->spec->push(resultArr, typeObj, ctx->user_data); + ctx->chakra->spec->push(resultArr, typeObj, ctx->chakra->user_data); break; } } } -void write_action(Context* ctx, Js::Var obj, const Action* action) +void write_action(Context* ctx, Js::Var obj, const ActionPtr& action) { - Js::Var actionObj = ctx->spec->createObject(ctx->user_data); + Js::Var actionObj = ctx->chakra->spec->createObject(ctx->chakra->user_data); set_property(ctx, obj, PropertyIds::action, actionObj, "Unable to set action"); if (action->module_var.is_name()) { write_var(ctx, actionObj, PropertyIds::module, &action->module_var); } - if (action->type == ActionType::Invoke) + if (action->type() == ActionType::Invoke) { + const InvokeAction* iaction = cast(action.get()); write_string(ctx, actionObj, PropertyIds::type, "invoke"); - write_string(ctx, actionObj, PropertyIds::field, action->name); - write_const_vector(ctx, actionObj, PropertyIds::args, &action->invoke->args); + write_string(ctx, actionObj, PropertyIds::field, iaction->name); + write_const_vector(ctx, actionObj, PropertyIds::args, iaction->args); } else { - assert(action->type == ActionType::Get); + assert(action->type() == ActionType::Get); write_string(ctx, actionObj, PropertyIds::type, "get"); write_string(ctx, actionObj, PropertyIds::field, action->name); } } -Js::Var create_module(Context* ctx, Module* module) +Js::Var create_module(Context* ctx, const Module* module, bool validate = true) { if (!module) { throw Error("No module found"); } - MemoryWriter writer; - MemoryWriterContext context{ &writer, ctx }; + if (validate) + { + ValidateOptions options(GetWabtFeatures(*ctx->chakra)); + ValidateModule(ctx->lexer, module, ctx->errorHandler, &options); + } + MemoryStream stream; WriteBinaryOptions s_write_binary_options; - Result result = WriteBinaryModule(&writer, module, &s_write_binary_options); + Result result = WriteBinaryModule(&stream, module, &s_write_binary_options); if (!Succeeded(result)) { throw Error("Error while writing module"); } - const uint8_t* data = writer.output_buffer().data.data(); - const size_t size = writer.output_buffer().size(); - return ctx->createBuffer(data, TruncSizeT(size), ctx->user_data); + const uint8_t* data = stream.output_buffer().data.data(); + const size_t size = stream.output_buffer().size(); + return ctx->chakra->createBuffer(data, TruncSizeT(size), ctx->chakra->user_data); } -void write_module(Context* ctx, Js::Var obj, Module* module) +void write_module(Context* ctx, Js::Var obj, const Module* module, bool validate = true) { - Js::Var buffer = create_module(ctx, module); + Js::Var buffer = create_module(ctx, module, validate); set_property(ctx, obj, PropertyIds::buffer, buffer, "Unable to set module"); } -static void write_invalid_module(Context* ctx, Js::Var obj, const ScriptModule* module, std::string text) +static void write_invalid_module(Context* ctx, Js::Var obj, const ScriptModule* module, const std::string& text) { - write_location(ctx, obj, &module->GetLocation()); + write_location(ctx, obj, &module->location()); write_string(ctx, obj, PropertyIds::text, text); - switch (module->type) + const std::vector* data = nullptr; + switch (module->type()) { - case ScriptModule::Type::Text: - write_module(ctx, obj, module->text); + case ScriptModuleType::Text: + write_module(ctx, obj, &cast(module)->module, false); break; - case ScriptModule::Type::Binary: - { - Js::Var buffer = ctx->createBuffer(module->binary.data.data(), TruncSizeT(module->binary.data.size()), ctx->user_data); - set_property(ctx, obj, PropertyIds::buffer, buffer, "Unable to set invalid module"); - break; - } - case ScriptModule::Type::Quoted: - { - Js::Var buffer = ctx->createBuffer(module->quoted.data.data(), TruncSizeT(module->quoted.data.size()), ctx->user_data); - set_property(ctx, obj, PropertyIds::buffer, buffer, "Unable to set invalid module"); - break; - } + case ScriptModuleType::Binary: + data = &cast(module)->data; + goto create_binary_module; + case ScriptModuleType::Quoted: + data = &cast(module)->data; + create_binary_module: + { + Js::Var buffer = ctx->chakra->createBuffer(data->data(), TruncSizeT(data->size()), ctx->chakra->user_data); + set_property(ctx, obj, PropertyIds::buffer, buffer, "Unable to set invalid module"); + break; + } default: assert(false); break; } } - Js::Var write_commands(Context* ctx, Script* script) { - Js::Var resultObj = ctx->spec->createObject(ctx->user_data); - Js::Var commandsArr = ctx->spec->createArray(ctx->user_data); + Js::Var resultObj = ctx->chakra->spec->createObject(ctx->chakra->user_data); + Js::Var commandsArr = ctx->chakra->spec->createArray(ctx->chakra->user_data); set_property(ctx, resultObj, PropertyIds::commands, commandsArr, "Unable to set commands"); wabt::Index last_module_index = (wabt::Index) - 1; for (wabt::Index i = 0; i < script->commands.size(); ++i) { const Command* command = script->commands[i].get(); - Js::Var cmdObj = ctx->spec->createObject(ctx->user_data); - ctx->spec->push(commandsArr, cmdObj, ctx->user_data); + Js::Var cmdObj = ctx->chakra->spec->createObject(ctx->chakra->user_data); + ctx->chakra->spec->push(commandsArr, cmdObj, ctx->chakra->user_data); write_command_type(ctx, command->type, cmdObj); switch (command->type) { case CommandType::Module: { - Module* module = cast(command)->module; - write_location(ctx, cmdObj, &module->loc); - if (!module->name.empty()) + const Module& module = cast(command)->module; + write_location(ctx, cmdObj, &module.loc); + if (!module.name.empty()) { - write_string(ctx, cmdObj, PropertyIds::name, module->name); + write_string(ctx, cmdObj, PropertyIds::name, module.name); } - write_module(ctx, cmdObj, module); + write_module(ctx, cmdObj, &module); last_module_index = i; break; } case CommandType::Action: { - const Action* action = cast(command)->action; + const ActionPtr& action = cast(command)->action; write_location(ctx, cmdObj, &action->loc); write_action(ctx, cmdObj, action); break; @@ -371,28 +380,28 @@ Js::Var write_commands(Context* ctx, Script* script) case CommandType::AssertMalformed: { auto* assert_malformed_command = cast(command); - write_invalid_module(ctx, cmdObj, assert_malformed_command->module, + write_invalid_module(ctx, cmdObj, assert_malformed_command->module.get(), assert_malformed_command->text); break; } case CommandType::AssertInvalid: { auto* assert_invalid_command = cast(command); - write_invalid_module(ctx, cmdObj, assert_invalid_command->module, + write_invalid_module(ctx, cmdObj, assert_invalid_command->module.get(), assert_invalid_command->text); break; } case CommandType::AssertUnlinkable: { auto* assert_unlinkable_command = cast(command); - write_invalid_module(ctx, cmdObj, assert_unlinkable_command->module, + write_invalid_module(ctx, cmdObj, assert_unlinkable_command->module.get(), assert_unlinkable_command->text); break; } case CommandType::AssertUninstantiable: { auto* assert_uninstantiable_command = cast(command); - write_invalid_module(ctx, cmdObj, assert_uninstantiable_command->module, + write_invalid_module(ctx, cmdObj, assert_uninstantiable_command->module.get(), assert_uninstantiable_command->text); break; } @@ -442,54 +451,63 @@ Js::Var write_commands(Context* ctx, Script* script) return resultObj; } -void Context::Validate(bool isSpec) const +void Validate(const ChakraContext& ctx, bool isSpec) { - if (!allocator) throw Error("Missing allocator"); - if (!createBuffer) throw Error("Missing createBuffer"); + if (!ctx.createBuffer) throw Error("Missing createBuffer"); if (isSpec) { - if (!spec) throw Error("Missing Spec context"); - if (!spec->setProperty) throw Error("Missing spec->setProperty"); - if (!spec->int32ToVar) throw Error("Missing spec->int32ToVar"); - if (!spec->int64ToVar) throw Error("Missing spec->int64ToVar"); - if (!spec->stringToVar) throw Error("Missing spec->stringToVar"); - if (!spec->createObject) throw Error("Missing spec->createObject"); - if (!spec->createArray) throw Error("Missing spec->createArray"); - if (!spec->push) throw Error("Missing spec->push"); + if (!ctx.spec) throw Error("Missing Spec context"); + if (!ctx.spec->setProperty) throw Error("Missing spec->setProperty"); + if (!ctx.spec->int32ToVar) throw Error("Missing spec->int32ToVar"); + if (!ctx.spec->int64ToVar) throw Error("Missing spec->int64ToVar"); + if (!ctx.spec->stringToVar) throw Error("Missing spec->stringToVar"); + if (!ctx.spec->createObject) throw Error("Missing spec->createObject"); + if (!ctx.spec->createArray) throw Error("Missing spec->createArray"); + if (!ctx.spec->push) throw Error("Missing spec->push"); } } -Js::Var ChakraWabt::ConvertWast2Wasm(Context& ctx, char* buffer, uint bufferSize, bool isSpecText) +void CheckResult(Result result, const char* errorMessage) { - ctx.Validate(isSpecText); + if (!Succeeded(result)) + { + throw Error(errorMessage); + } +} + +Js::Var ChakraWabt::ConvertWast2Wasm(ChakraContext& chakraCtx, char* buffer, uint bufferSize, bool isSpecText) +{ + Validate(chakraCtx, isSpecText); std::unique_ptr lexer = WastLexer::CreateBufferLexer("", buffer, (size_t)bufferSize); MyErrorHandler s_error_handler; + WastParseOptions options(GetWabtFeatures(chakraCtx)); + Context ctx; + ctx.chakra = &chakraCtx; + ctx.errorHandler = &s_error_handler; + ctx.lexer = lexer.get(); - Script* script; - Result result = ParseWast(lexer.get(), &script, &s_error_handler); - AutoCleanScript autoCleanScript = { script }; - if (!Succeeded(result)) + if (isSpecText) { - throw Error("Invalid wast script"); - } + std::unique_ptr